Evilek's-Blog


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于
  • 百度搜索 XXX
  • 谷歌搜索 XXX
  • 本地搜索
close

用debian chroot 在群晖上搭建debian环境 跑debian程序

发表于 2016-07-02   |   分类于 Blog , Technology   |  

转载:http://tieba.baidu.com/p/3257838822
作者:蜜色橙汁

软件源还是

http://packages.synocommunity.com/
勾beta是必须的

然后安装synocommunity提供的py
2016-07-02_10:54:52.jpg

py显示已安装。。。

2016-07-02_10:55:27.jpg

接下来安装debian chroot
2016-07-02_10:56:06.jpg

安装。。。。

2016-07-02_10:56:23.jpg

要启动下。。。

2016-07-02_10:56:29.jpg

装完了 ui反正也没啥用的

2016-07-02_10:56:35.jpg
额 这个不用说了吧

2016-07-02_10:56:40.jpg

登录之后去chroot咯

/var/packages/debian-chroot/scripts/start-stop-status chroot

2016-07-02_10:56:51.jpg
报错 local问题 不管它先

2016-07-02_10:56:58.jpg
这样就进入debian了

爽吧 进debian先干嘛
apt-get update是必须的

要解决local问题 安装个软件。。

apt-get install locales

然后config下。。

dpkg-reconfigure locales

选中zh_CN.UTF-8以及en_US.UTF-8
2016-07-02_10:57:13.jpg

2016-07-02_10:57:22.jpg

记得default 用en us
2016-07-02_10:57:28.jpg

一会就好了
2016-07-02_10:57:35.jpg

exit

退出chroot
reboot
过一会再chroot登进去

没有错误鸟!!!!成功把修改版的群晖linux 弄成了debian环境 爱干啥干啥 爱编译编译 想装gcc就装gcc tr rt de 想跑啥跑啥

不过 非x86机器 debian软件也是基本木有的哦

2016-07-02_10:57:40.jpg

JSPatch 部署安全策略

发表于 2016-06-24   |   分类于 Blog , Technology   |  

转载:http://blog.cnbang.net/tech/2879/
作者:bang590

使用 JSPatch 有两个安全问题:

  1. 传输安全:JS 脚本可以调用任意 OC 方法,权限非常大,若被中间人攻击替换代码,会造成较大的危害。
  2. 执行安全:下发的 JS 脚本灵活度大,相当于一次小型更新,若未进行充分测试,可能会出现 crash 等情况对 APP 稳定性造成影响。

接下来说下这两个问题的解决方案。

传输安全

方案一:对称加密

若要让 JS 代码传输过程中不轻易被中间人截获替换,很容易想到的方式就是对代码进行加密,可以用 zip 的加密压缩,也可以用 AES 等加密算法。这个方案的优点是非常简单,缺点是安全性低,容易被破解。因为密钥是要保存在客户端的,只要客户端被人拿去反编译,把密码字段找出来,就完成破解了。

对此也有一些改进方案,例如:

1.可以把密码保存到 keychain 上,但这种方式也是不可靠的,只要随便找一台机器越狱装了这个 APP,用 hook 的方式在 APP 上添加一些代码,获得 keychain 里的密钥值,就可以用于其他所有机器的传输解密了。

2.给每个用户下发不同的密钥。但这样就非常繁琐,需要对下发密钥的请求做好保护,后台需要每次都对脚本进行不同密钥的加密操作,复杂性高了。

综上,对称加密安全性低,若要稍微提高点安全性,就会提升程序复杂度。

方案二:HTTPS

第二个方案是直接使用 HTTPS 传输,优点是安全性高,只要使用正确,证书在服务端未泄露,就不会被破解。缺点是部署麻烦,需要使用者服务器支持 HTTPS,门槛较高。另外客户端需要做好 HTTPS 的证书验证(有些使用者可能会漏掉这个验证,导致安全性大降),具体的认证方式可见网上一些文章,例如这篇。如果服务器本来就支持 HTTPS,使用这种方案也是一种不错的选择。

方案三:RSA 校验

有没有安全性高,部署简单,门槛低的方案?RSA 校验就是。

这种方式属于数字签名,用了跟 HTTPS 一样的非对称加密,只是简化了,把非对称加密只用于校验文件,而不解决传输过程中数据内容泄露的问题,而我们的目的只是防止传输过程中数据被篡改,对于数据内容泄露并不是太在意。整个校验过程如下:

JSPatchSecurity

  1. 服务端计算出脚本文件的 MD5 值,作为这个文件的数字签名。
  2. 服务端通过私钥加密第 1 步算出的 MD5 值,得到一个加密后的 MD5 值。
  3. 把脚本文件和加密后的 MD5 值一起下发给客户端。
  4. 客户端拿到加密后的 MD5 值,通过保存在客户端的公钥解密。
  5. 客户端计算脚本文件的 MD5 值。
  6. 对比第 4/5 步的两个 MD5 值(分别是客户端和服务端计算出来的 MD5 值),若相等则通过校验。

只要通过校验,就能确保脚本在传输的过程中没有被篡改,因为第三方若要篡改脚本文件,必须计算出新的脚本文件 MD5 并用私钥加密,客户端公钥才能解密出这个 MD5 值,而在服务端未泄露的情况下第三方是拿不到私钥的。

这种方案安全性跟 HTTPS 一致,但不像 HTTPS 一样部署麻烦,一套代码即可通用。对于它的缺点:数据内容泄露,其实在传输过程中不泄露,保存在本地同样会泄露,若对此在意,可以对脚本文件再加一层简单的对称加密。这个方案优点多缺点少,推荐使用,目前 JSPatch 平台就是使用这个方案。

最后有个小问题,保存在客户端的代码也可能被人篡改,需不需要采取措施?这个要看各人需求了,因为这个安全问题不大,能篡改本地文件,差不多已经有手机所有权限了,这时也无所谓脚本会不会被篡改了。若有需要,可以加个简单的对称加密,或者按上述流程每次都验证一遍MD5值。

执行安全

对于中大型 APP,下发 JS 脚本需要谨慎,有可能因为疏忽下发了有问题的代码,导致大量 APP crash,或一些其他异常情况,需要有一些机制避免这种情况。若要做得完整,可以分为:事发前(灰度),事发中(监控),事发后(回退)。

灰度

首先需要在事发前把出现问题的影响面降到最低,对于中大型 APP,不能一次把脚本下发给所有用户,需要有灰度机制,也就是一开始只下发给其中一部分用户,看看会不会出现异常情况,再逐步覆盖到所有用户。有条件的话灰度的用户最好按机型/系统/地域等属性随机分配,尽量让最少的人覆盖到大部分情况。

监控

接着是事发了我们需要知道脚本有问题,需要对 APP 有一些监控机制,像 crash 监控,这个一般所有 APP 都有接入,再按需求自行加入其他监控指标。

回退

最后是事发后回退代码。一般为了避免不可预料的情况出现,JSPatch 脚本建议在启动时执行,APP 运行过程中不去除,所以这个回退建议的实现方式是后台下发命令,让 APP 在下次启动时不执行 JSPatch 脚本即可。

但这里能回退的前提是 APP 可以接收到后台下发的回退命令,若因为下发的脚本导致 APP 启动即时 crash,这个回退命令也会接收不到。所以建议再加一层防启动 crash 的机制,APP 在连续启动即 crash 后,下次启动不再执行脚本文件。

灰度和监控中小型 APP 可以考虑不用,回退机制是每个使用 JSPatch 都建议加上的。目前 JSPatch 平台实现了上述回退方案。

Apple Developer公司账户注册步骤

发表于 2016-05-30   |   分类于 Blog , Technology   |  

1.注册

1.1 注册apple id

访问 苹果AppleId注册地址 按照提示步骤注册。详细注册规则
所需资料:

* 注册邮箱
* 密码
* 姓氏、名字
* 安全提示问题![2016-05-30_10:37:00.jpg](http://ww1.sinaimg.cn/large/72f96cbagw1f4d7lmpfk4j20rg09u766)

1.2 开通Organization开发者账号

1.访问 Apple Developer Program Enrollment页面
2.登录 1.1 中注册的Apple Id ,在页面中 Entity Type 选项选择 I develop apps as Company/Organization 点击 Continue
2016-05-30_10:41:37.jpg
3.根据提示选择公司类型
2016-05-30_10:43:51.jpg
4.输入公司资料

  • 法律实体名称::Legal Entity Name(Include the entity type, such as Inc., LLC, GmbH, etc.)包括实体类型,例如公司,LLC GmbH的等要注册 Apple Developer Program,您的所在组织必须为法人实体,这样才能和 Apple 签订合同。我们不接受 DBA、虚构公司、商号或子公司。法人实体名称将显示为您在 App Store 和 Mac App Store 上分发的 app 的“销售方”。示例:销售方:ABC Company, Inc.
  • 邓白氏编码: D-U-N-S® Number 申请方式
    您所在的组织必须拥有 D-U-N-S Number,以便我们验证您所在组织的身份和法人实体状态。这些唯一的九位编码由 Dun & Bradstreet 进行分配,广泛用作标准的企业识别码。
    • 法人实体名称
    • 总部地址
    • 邮寄地址
    • 您的工作联系信息
  • 网站 Website

##2.开通Apple Developer Program

###2.1 定价

Apple Developer Program。如果您是个人或代表独资/个人企业并有意创建 app 在适用于 iPhone、iPad、Mac 和 Apple Watch 的 App Store 上分发,请注册 Apple Developer Program。会员资格包括以下内容的使用权限:测试版 OS、高级 app 功能,以及用于开发、测试和分发 app 和 Safari Extensions 的工具。作为个人注册的开发者将使用个人姓名在 App Store 上销售 app。

会员资格每年 99 美元


Apple Developer Enterprise Program。如果您的组织想要创建专门设计的 app 并只将其分发给您组织的员工,请注册 Apple Developer Enterprise Program。会员资格包括您的整个开发团队对以下内容的使用权限:测试版 OS、高级 app 功能以及开发、测试和分发 app 所需的工具。在注册过程中,公司和教育机构必须提供注册其法定实体时的 D-U-N-S 编号(可免费获取)。

会员资格每年 299 美元

###2.2 付款

结账时,您可以使用您所在国家/地区的 Apple Store 在线商店提供的任何付款方式。如果您要通过信用卡付款,并以个人身份注册,则必须使用您自己的信用卡来完成购买。如果未使用自己的信用卡,您的注册会被延迟,且您将被要求提供由政府颁发且带有相片的身份证件副本。完成购买后,您将收到来自 Apple Store 在线商店的购买确认,以及来自 Apple Developer Program Support 的会员资格确认。

如果您所在国家/地区的 Apple Store 在线商店上没有可用的 Apple Developer 产品,您便会看到一张信用卡表单。请使用能以美元支付的信用卡进行购买。当您完成购买提交后,您会收到处理确认的电子邮件。当您的购买处理完成后,您会收到购买确认,以及含有会员资格激活说明的电子邮件。

成为会员后,您便可以通过登录 Member Center 来访问自己的开发者帐户。您还可以登录 iTunes Connect 以设置帐户,用于在适用于 iPhone、iPad、Mac 和 Apple Watch 的 App Store 上分发 app。请阅读 iTunes Connect 支持页面来详细了解 iTunes Connect。

###2.3 发票

您可以通过在 Apple Store 在线商店中查看您的帐户来访问所购买产品的发票。如果您在中国的 Apple Store 在线商店中购买了产品,并希望请求增值税发票,请致电 400-666-8800 与 Apple Store 在线商店支持专家进行交谈。

###2.4 续订

续订组织的会员资格

如果您在 Apple Developer Program 中注册为开发组织,需要由团队代理(iTunes Connect 中分配了“法律”角色的人员)代表您所在的组织完成成员资格的续订。他们还可以管理会员资格的自动续订*。团队代理的联系信息可以在 Member Center 的“您的帐户”(Your Account) 部分中找到。有关角色的更多信息,请参阅“计划角色和 iTunes Connect 角色”。

Injection for Xcode:成吨的提高开发效率

发表于 2016-05-26   |   分类于 Blog , Technology   |  

转载:http://www.jianshu.com/p/27be46d5e5d4
作者:没故事的卓同学
今天强烈推荐一个Xcode高端必备插件: Injection Plugin for Xcode
直接放demo演示动图:

225849-2774ad82cd157ca0

Injection Plugin for Xcode

我很久以前就希望有这么一种功能,直接修改某行代码,F5一下就能刷新这个实例,而不用重写build整个项目。靠夭,我不是在说前端!
没想居然有一天,梦想照入现实!!!是的,就是它,不用重新启动应用就可以让修改的代码生效。

使用

超级简单:修改源码,按下刷新的快捷键ctrl+=。会有一个快速的进度条闪过,修改的代码就生效了。

安装

  • 可以使用Alcatraz安装
  • 或者clone这个项目,运行InjectionPluginLite/InjectionPlugin.xcodeproj。

检验安装成功

在某个类里添加下面的方法:

1
2
3
4
(void)injected{
NSLog(@"I've been injected: %@", self);

}

或者swift下:

1
2
3
func injected() {
print("I've been injected: (self)")
}

打一个断点在这行代码上,按下快捷键ctrl+=后,代码执行到这个类时,如果断点进入这个方法说明你已经安装成功了。

支持Swift

Swift中的大部分类都可以正常使用。不过以下一些情况使用会有问题:

  • 结构中的修改
  • 标记为final的func和class
  • 不在类里的全局函数和变量

工作原理

Injection是一个Xcode的扩展插件,可以让你修改一个类的代码实现而不用重启整个应用。

它通过解析应用的build日志来判断源代码文件上次是怎么被编译的。然后会把这些重新编译一遍包在一个已经通过动态加载器(dynamic loader)注入到应用的bundle里。这个时候其实有两个版本的类在app里,一个原始的和一个修改过的版本。修改过的版本通过和原始类”swizzled”来产生效果。

swizzling利用了OC的runtime。这个也可以在Swift中没有标记为final或者private的方法(可以被override的方法)。对结构体无效。

这个插件还可以做点什么

  • 按照这个文档操作,还可以支持Storyboard Storyboard-based iOS projects.
  • 也可以可视化的调整颜色 collection of tunable parameters
  • 当你开始注入时,会在同一个目录下生成一个项目文件:iOSInjectionProject 或者 OSXInjectionProject。这个项目用于注入你的修改到原项目。建议加入.gitignore。
  • ctrl+=的快捷键可以在 “Tunable App Parameters”面板里自定义
  • 如果想在一台设备上使用,参考这个文档patch to your project..

我安装时遇到的一个错误

第一次使用,提示我项目里使用的一个第三方framework找不到。这个时候打开它自动生成的iOSInjectionProject,编译一下可以看到错误的具体原因。我看到issue里也好多人遇到。解决方式就是将自己项目framework search paths中的这个第三方框架的路径拷贝到iOSInjectionProject里。

Reveal调试工具加载方法

发表于 2016-05-25   |   分类于 Blog , Technology   |  

Integrating Reveal without modifying your Xcode project

reveal: 檢視 iOS app 的 view 結構。
给出了如何不用修改Xcode工程就可以加载使用Reveal的方法。
在当前用户目录新建一个文件.lldbinit,位于~/.lldbinit,LLDB每次启动的时候都会加载这个文件。
在.lldbinit中输入如下内容:

1
2
3
4
5
6
7
command alias reveal_load_sim expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0) 

command alias reveal_load_dev expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void*)dlopen((char*)[(NSString*)[(NSBundle*)[NSBundle mainBundle] pathForResource:@"libReveal" ofType:@"dylib"] cStringUsingEncoding:0x4], 0x2) : ((void*)0)

command alias reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];

command alias reveal_stop expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStop" object:nil];

上述文件创建了4个命令:

1
reveal_load_sim,reveal_load_dev, reveal_start 和 reveal_stop

####手动加载调试库
在设备起来之后,你就可以断下应用,在LLDB提示框中输入上述的命令了。

请注意:只有在iOS应用发出了UIApplicationDidFinishLaunchingNotification通知之后,比如应用的delegate已经处理过application::didFinishLaunchingWithOptions:之后才能调用上面的revealload*命令,然后再调用reveal_start

reveal_load_sim 这个只在iOS模拟器上有效。它从Reveal的应用程序bundle中找到并加载libReveal.dylib(请确保你把Reveal安装到了系统的 Application 文件夹,如果你换地方了,你修改上述的文件)。

reveal_load_dev 这个命令在iOS设备和模拟器上都有效。不过,它需要你在Build Phase中的的Copy Bundle Resources中加上libReveal.dylib,请确保没有放到Link Binary With Libraries这个地方。

reveal_start 这个命令发出一个通知启动Reveal Server。

reveal_stop 这个命令发出一个通知停止Reveal Server。
请注意:只有在iOS应用发出了UIApplicationDidFinishLaunchingNotification通知之后,比如应用的delegate已经处理过application::didFinishLaunchingWithOptions:之后才能调用上面的reveal_load_*命令,然后再调用reveal_start
在设备起来之后,你就可以断下应用,在LLDB提示框中输入上述的命令了。

上述的过程还需要手动输入,下面介绍如何设置条件断点,使得Reveal在启动之后自动加载。
在你的应用的application:didFinishLaunchingWithOptions中的代码出加一个断点,然后右键,选择编辑断点。
输入如下图一样的命令:

重新运行下应用,如果控制台输出了如下信息:

Reveal server started.

说明Reveal已经自动成功加载。
真机补充:
真机调试下需要额外增加如下配置

要用Reveal连接真机调试,我们需要先把Reveal的动态链接库上传到真机上。由于iOS设备有沙盒存在,所以我们只能将Reveal的动态链接库添加到工程中。

点击Reveal菜单栏的”Help”->”Show Reveal Library in Finder”选项(如下图所示),可以在Finder中显示出Reveal的动态链接库:libReveal.dylib

在 Copy Bundle Resources 配置区域中 ,加入libReveal.dylib。

在Link Binary With Libraries配置项中:
如果已有libReveal.dylib,请将其移除——不应在编译时连接dylib文件。
如果下列系统框架与库文件还不存在,请将他们加入:

1
2
3
CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework

  • Xcode一般默认会在工程中包含此框架文件。

2.进入target的Build Phases标签页,选择Editor → Add Build Phase → Add Run Script菜单。在Run Script阶段中加入以下内容:

1
set -e if [ -n "${CODE_SIGN_IDENTITY}" ]; then codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib" fi

之后用Reveal连接真机的方式和连接模拟器的方式类似,我们只需要把上一节提到的断点Action的内容从reveal_load_sim改成reveal_load_dev即可。

iOS 高效添加圆角效果

发表于 2016-05-25   |   分类于 Blog , Technology   |  

转载:http://www.jianshu.com/p/f970872fdc22
作者:bestswifter

圆角(RounderCorner)是一种很常见的视图效果,相比于直角,它更加柔和优美,易于接受。但很多人并不清楚如何设置圆角的正确方式和原理。设置圆角会带来一定的性能损耗,如何提高性能是另一个需要重点讨论的话题。我查阅了一些现有的资料,收获良多的同时也发现了一些误导人错误。本文总结整理了一些知识点,概括如下:

  • 设置圆角的正确姿势及其原理
  • 设置圆角的性能损耗
  • 其他设置圆角的方法,以及最优选择

我为本文制作了一个 demo,读者可以在我的 github 上 clone 下来:CornerRadius,如果觉得有帮助还望给个star以示支持。项目由 Swift 实现,但请务必相信我即使你只会 Objective-C,也可以看懂它。因为其中的关键知识与 Swift 无关。

正确姿势

首先,我想要声明的一点是:

设置圆角很简单,它不会带来任何性能损耗

因为这件事本来就很简单,它只需要一行代码:

1
view.layer.cornerRadius = 5

先别急着关掉网页,也别急着回复,我们让事实说话。打开 Instuments,选择 Core Animation 调试,你会发现既没有 Off-Screen Render,也没有降低帧数。关于使用 Instuments 分析应用,你可以参考我的这篇文章:UIKit性能调优实战讲解。从截图中可以看到第三个棕色视图确确实实设置了圆角:

圆角效果

不过查看一下代码可以发现,有一个 UILabel 也设置了圆角,但是没有表现出任何变化。关于这一点,你可以查看 cornerRadius 属性的注释:

By default, the corner radius does not apply to the image in the layer’s contents property; it applies only to the background color and border of the layer. However, setting the masksToBounds property to true causes the content to be clipped to the rounded corners.

也就是说在默认情况下,这个属性只会影响视图的背景颜色和 border。对于 UILabel 这样内部还有子视图的控件就无能为力了。所以很多情况下我们会看到这样的代码:

1
2
label.layer.cornerRadius = 5
label.layer.masksToBounds = true

我们把第二行代码添加到 CustomTableViewCell 的构造方法中,再次运行 Instument,就可以看到圆角效果了。

性能损耗

如果你勾选上 Color Offscreen-Rendered Yellow,就会发现 label 的四周出现了黄色的标记,说明这里出现了离屏渲染。关于离屏渲染的介绍,同样可以参考:UIKit性能调优实战讲解,就不在本文赘述了。

需要强调的一点是,离屏渲染并非由设置圆角导致的!通过控制变量的方法很容易得出这个结论,因为 UIView 只是设置了 cornerRadius,但它没有出现离屏渲染。某些比较权威的文章,比如 Stackoverflow 和 CodeReview 都提到设置 cornerRadius 会导致离屏渲染从而影响性能,我想这实在是冤枉了可爱的 cornerRadius 变量,也误导了别人。

虽然设置 masksToBounds 会导致离屏渲染,从而影响性能,但是这个影响到底会有多大?在我的 iPhone6 上,即使出现了 17 个带有圆角的视图,滑动时的帧数依然在 58 - 59 fps 左右波动。

然而,这并非说明 iOS 9 做了什么特殊优化,或者是离屏渲染的影响不大,其主要原因在于圆角不够多。当我将一个 UIImageView 也设置成圆角,也就是屏幕上的圆角视图达到 34 个时,fps 大幅度下降,大约只有 33 左右。基本上已经达到了影响用户体验的范围。因此,一切不讲依据的优化都是耍流氓,如果你的圆角视图不多,cell 不复杂,就不要费力气折腾了。

高效地设置圆角

假设现在圆角视图非常多(比如在 UICollectionView 中),那么如何为视图高效的添加圆角呢?网上的教程大多没有说全,因为这个事要分两种情况考虑。为普通的 UIView 设置圆角,和为 UIImageView 设置圆角的原理截然不同。

有一种做法是这样的,这种写法试图实现 cornerRadius = 3 的效果:

1
2
3
4
5
6
7
8
9
override func drawRect(rect: CGRect) {
let maskPath = UIBezierPath(roundedRect: rect,
byRoundingCorners: .AllCorners,
cornerRadii: CGSize(width: 3, height: 3))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
maskLayer.path = maskPath.CGPath
self.layer.mask = maskLayer
}

不过这是一种错的离谱的写法!

首先,我们应该尽量避免重写 drawRect 方法。不恰当的使用这个方法会导致内存暴增。举个例子,iPhone6 上与屏幕等大的 UIView,即使重写一个空的 drawRect 方法,它也至少占用 750 * 1134 * 4 字节 ≈ 3.4 Mb 的内存。在 内存恶鬼drawRect 及其后续中,作者详细介绍了其中原理,据他测试,在 iPhone6 上空的、与屏幕等大的视图重写 drawRect 方法会消耗 5.2 Mb 内存。总之,能避免重写 drawRect 方法就尽可能避免。

其次,这种方法本质上是用遮罩层 mask 来实现,因此同样无可避免的会导致离屏渲染。我试着将此前 34 个视图的圆角改用这种方法实现,结果 fps 掉到 11 左右。已经属于卡出翔的节奏了。

忘掉这种写法吧,下面介绍正确的高效设置圆角的姿势。

为 UIView 添加圆角

这种做法的原理是手动画出圆角。虽然我们之前说过,为普通的视图直接设置 cornerRadius 属性即可。但万一不可避免的需要使用 masksToBounds,就可以使用下面这种方法,它的核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func kt_drawRectWithRoundedCorner(radius radius: CGFloat,
borderWidth: CGFloat,
backgroundColor: UIColor,
borderColor: UIColor)
-> UIImage {

UIGraphicsBeginImageContextWithOptions(sizeToFit, false, UIScreen.mainScreen().scale)
let context = UIGraphicsGetCurrentContext()

CGContextMoveToPoint(context, 开始位置); // 开始坐标右边开始
CGContextAddArcToPoint(context, x1, y1, x2, y2, radius); // 这种类型的代码重复四次

CGContextDrawPath(UIGraphicsGetCurrentContext(), .FillStroke)
let output = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return output
}

这个方法返回的是 UIImage,也就是说我们利用 Core Graphics 自己画出了一个圆角矩形。除了一些必要的代码外,最核心的就是 CGContextAddArcToPoint 函数。它中间的四个参数表示曲线的起点和终点坐标,最后一个参数表示半径。调用了四次函数后,就可以画出圆角矩形。最后再从当前的绘图上下文中获取图片并返回。

有了这个图片后,我们创建一个 UIImageView 并插入到视图层级的底部:

1
2
3
4
5
6
7
8
9
10
11
12
extension UIView {
func kt_addCorner(radius radius: CGFloat,
borderWidth: CGFloat,
backgroundColor: UIColor,
borderColor: UIColor)
{

let imageView = UIImageView(image: kt_drawRectWithRoundedCorner(radius: radius,
borderWidth: borderWidth,
backgroundColor: backgroundColor,
borderColor: borderColor))
self.insertSubview(imageView, atIndex: 0)
}
}

完整的代码可以在项目中找到,使用时,你只需要这样写:

1
2
let view = UIView(frame: CGRectMake(1,2,3,4))
view.kt_addCorner(radius: 6)

为 UIImageView 添加圆角

相比于上面一种实现方法,为 UIImageView 添加圆角更为常用。它的实现思路是直接截取图片:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extension UIImage {
func kt_drawRectWithRoundedCorner(radius radius: CGFloat, _ sizetoFit: CGSize) -> UIImage {
let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: sizetoFit)

UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.mainScreen().scale)
CGContextAddPath(UIGraphicsGetCurrentContext(),
UIBezierPath(roundedRect: rect, byRoundingCorners: UIRectCorner.AllCorners,
cornerRadii: CGSize(width: radius, height: radius)).CGPath)
CGContextClip(UIGraphicsGetCurrentContext())

self.drawInRect(rect)
CGContextDrawPath(UIGraphicsGetCurrentContext(), .FillStroke)
let output = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return output
}
}

圆角路径直接用贝塞尔曲线绘制,一个意外的 bonus 是还可以选择哪几个角有圆角效果。这个函数的效果是将原来的 UIImage 剪裁出圆角。配合着这函数,我们可以为 UIImageView 拓展一个设置圆角的方法:

1
2
3
4
5
6
7
8
9
10
extension UIImageView {
/**
/ !!!只有当 imageView 不为nil 时,调用此方法才有效果

:param: radius 圆角半径
*/

override func kt_addCorner(radius radius: CGFloat) {
self.image = self.image?.kt_drawRectWithRoundedCorner(radius: radius, self.bounds.size)
}
}

完整的代码可以在项目中找到,使用时,你只需要这样写:

1
2
let imageView = let imgView1 = UIImageView(image: UIImage(name: ""))
imageView.kt_addCorner(radius: 6)

提醒

无论使用上面哪种方法,你都需要小心使用背景颜色。因为此时我们没有设置 masksToBounds,因此超出圆角的部分依然会被显示。因此,你不应该再使用背景颜色,可以在绘制圆角矩形时设置填充颜色来达到类似效果。

在为 UIImageView 添加圆角时,请确保 image 属性不是 nil,否则这个设置将会无效。

实战测试

回到 demo 中,测试一下刚刚定义的这两个设置圆角的方法。首先在 setupContent 方法中把这两行代码的注释取消掉:

1
2
imgView1.kt_addCorner(radius: 5)
imgView2.kt_addCorner(radius: 5)

然后使用自定义的方法为 label 和 view 设置圆角:

1
2
view.kt_addCorner(radius: 6)
label.kt_addCorner(radius: 6)

现在,我们不仅成功的添加了圆角效果,同时还保证了性能不受影响:

性能测试

总结

  1. 如果能够只用 cornerRadius 解决问题,就不用优化。
  2. 如果必须设置 masksToBounds,可以参考圆角视图的数量,如果数量较少(一页只有几个)也可以考虑不用优化。
  3. UIImageView 的圆角通过直接截取图片实现,其它视图的圆角可以通过 Core Graphics 画出圆角矩形实现。

参考资料

  1. 小心别让圆角成了你列表的帧数杀手
  2. 关于性能的一些问题

iTerm 2 && Oh My Zsh

发表于 2016-05-24   |   分类于 Blog   |  

转自http://www.jianshu.com/p/7de00c73a2bb 作者:SuperDanny

一年前,在搞终端的时候偶然一次机会,让我看到了各种强大的DIY界面,这让我很想去自己搞一个。于是在网上不断的寻找资源,也请教了大多数朋友。最终以失败告终。最近,本人又突然想起当时这件事,于是,决定边做笔记,边尝试当初失败的过程。经过一个晚上的时间,终于DIY出我梦寐以求的效果。

先放上最终DIY效果图:
645592-08177ac961155bb7.png

下面,我将分步骤讲解我是怎么一步一步完成DIY过程

1. 首先下载 iTerm 2

2. 打开iTerm 2

3. 输入下面指令安装oh-my-zsh

curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh

4. 接下来安装Powerline

在官网有教程,我们只需要执行官网第一条安装指令就行

如果你的终端能够正常执行pip指令,那么直接执行下面的指令可以完成安装

pip install powerline-status

如果没有,则先执行安装pip指令

sudo easy_install pip

5. 下载、安装库字体库

1)将工程下载下来后cd到install.sh文件所在目录

2)执行指令安装字体库

执行./install.sh指令安装所有Powerline字体

安装完成后提示所有字体均已下载到/Users/superdanny/Library/Fonts路径下

All Powerline fonts installed to /Users/superdanny/Library/Fonts

6. 设置iTerm 2的Regular Font 和 Non-ASCII Font

安装完字体库之后,把iTerm 2的设置里的Profile中的Text 选项卡中里的Regular Font和Non-ASCII Font的字体都设置成 Powerline的字体,我这里设置的字体是12pt Meslo LG S DZ Regular for Powerline

645592-eafa2148

7. 配色方案

1)安装配色方案

进入刚刚下载的工程的solarized/iterm2-colors-solarized 下双击 Solarized Dark.itermcolors 和 Solarized Light.itermcolors 两个文件就可以把配置文件导入到 iTerm2 里

2)配置配色方案

通过load presets选择刚刚安装的配色主题即可

645592-00c72100725f2407

8. 使用agnoster主题

1)下载agnoster主题
到下载的工程里面运行install文件,主题将安装到~/.oh-my-zsh/themes目录下

2)设置该主题
进入~/.zshrc打开.zshrc文件,然后将ZSH_THEME后面的字段改为agnoster。ZSH_THEME="agnoster"(agnoster即为要设置的主题)

9. 增加指令高亮效果——zsh-syntax-highlighting

指令高亮效果作用是当用户输入正确命令时指令会绿色高亮,错误时命令红色高亮

1)cd到.zshrc所在目录

2)执行指令将工程克隆到当前目录

git clone git://github.com/zsh-users/zsh-syntax-highlighting.git

3)打开.zshrc文件,在最后添加下面内容

source XXX/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

保存文件。

注意:xxx代表.zshrc所在目录

4)cd ~/.oh-my-zsh/custom/plugins

5)再次打开.zshrc文件,在最后面添加下面内容

plugins=(zsh-syntax-highlighting)

保存文件。


问题解答区

  1. 启动iTerm 2 默认使用dash改用zsh解决方法:
    chsh -s /bin/zsh

  2. 执行指令pip install powerline-status出错解决方法:
    需要下载苹果官方的Command line。必須官方工具下载最新版 Command Line

  3. ⌘+Q关闭iTerm 2 时每次弹窗提示问题:
    iTerm 2 中,进入Preference-General-Closing栏目,将Confirm "Quit iTerm2(⌘Q)" command选项勾选去掉就行
  4. 找不到.zshrc文件问题:
    我这里将我的.zshrc文件分享出来。供大家下载网盘

Mac OS X 用终端破解附近 Wifi 密码

发表于 2016-03-06   |   分类于 Blog   |  

首先需要确保电脑装有 Xcode 和 MacPorts。Xcode 可以直接从 App Store 免费下载,MacPorts 的下载地址如下:

https://distfiles.macports.org/MacPorts/

MacPorts 前称 DarwinPorts,是一个软件包管理系统,用来简化 Mac OS X 系统上软件的安装。它是一个用来简化自由软件/开放源代码软件的安装的自由/开放源代码项目,与Fink和BSD类ports套件的目标和功能类似。它可以让用户在终端中简单的输入 port install 软件包名称来安装软件包,软件的下载、编译、安装以及它依赖的所有其他软件包的安装都会自动完成。

我下载的是「MacPorts-2.2.1-10.9-Mavericks.pkg」这个版本。

安装好 Macport 后,则开始安装Aircrack,打开终端输入命令:

1
sudo port install aircrack-ng

等待一段时间安装,然后使用mac系统下自带的 airport 进行附近 wifi 信号的监测。

首先我们将 airport 命令引入到用户命令里,在终端输入:

1
sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/sbin/airport

el capitan 后只能用

1
export PATH=$PATH:/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/

201404131

SSID 是 wifi名称,RSSI 是信号强度,CHANNEL 是信道。

接着挑选一个信号强的信道进行监听抓包(比如信道1),在终端输入:

1
sudo airport en1 sniff  1

这时,会提示输入管理员密码,输入时密码是不会显示出来,输入完敲回车就开始监听抓包了。命令中的 en1 是自己电脑的网卡地址,有的电脑可能是 en0,根据自己的实际情况进行输入,查看电脑网卡地址的地方如下:

QQ20140413-1

大概等待2-5分钟就可以按 command + c 组合键退出查看含有抓包的cap文件了,文件所在地址是/tmp,可以使用Finder的前往文件夹功能进入:

QQ20140413-2

可以将cap文件移到我们想保存的地方,也可以不移走(重启后就没有了)。

接下来就进入关键的破解wifi密码的过程了,先在桌面建一个文件夹,取名「wifi」,将字典和cap文件都放到这个文件夹内(假设字典是01.txt,cap文件名是01.cap,在终端输入:

1
2
cd ~/Desktop/wifi
aircrack-ng -w 01.txt 01.cap

201404132

就可以看到cap文件内的抓包情况,Encryption中(0 handshake)是抓包失败,(1 handshake)则是抓包成功。图中看到第11行抓包成功,则在「Index number of target network ?」这里输入11后敲回车:

201404133

如果cap文件内全是(0 handshake),就按 command + c 组合键退出。重新回到「sudo airport en1 sniff 1」这步进行监听抓包。抓包成功率受到 wifi 信号强弱、电脑与路由器距离远近、路由器是否正处在收发数据状态的影响。总之多试几次、监听时间适当延长些,可以大大提高成功率。

进入到破解过程界面,如图:

201404134

接下来等待破解结果就行了,中断破解过程可以直接按 command + c 组合键退出。破解过程所需时间长短受电脑硬件配置、字典体积大小的影响。如果01.txt字典破解失败,则可以换其它字典进行破解,直到破解成功。

使用一个好的字典是很重要的,一个9位的纯数字字典大概1G多,结果经过几个小时的破解,如果密码是987654321就很令人郁闷了,所以最好准备几个常用的wifi密码字典,可以大大提高成功率和节省时间。常用字典可以直接百度Google搜索下载。

我在测试这个暴力破解方法时并没成功过,估计是附近的wifi密码都太冷门,导致我准备的几个字典都没对应上。如果破解成功则会如下图所示:

QQ20140413-12

Hexo备份与搭建

发表于 2016-03-06   |   分类于 Blog   |  

#Hexo搭建

1
2
3
4
mkdir hexo  #创建一个文件夹
cd hexo
npm install -g hexo-cli
npm install hexo --save

部署Hexo:在Git shell 中输入

1
hexo init

安装Hexo 插件:自动生成sitemap,Rss,部署到git等,建议安装

1
2
3
4
5
6
7
8
9
10
11
12
13
npm install hexo-generator-index --save
npm install hexo-generator-archive --save
npm install hexo-generator-category --save
npm install hexo-generator-tag --save
npm install hexo-server --save
npm install hexo-deployer-git --save
npm install hexo-deployer-heroku --save
npm install hexo-deployer-rsync --save
npm install hexo-deployer-openshift --save
npm install hexo-renderer-marked@0.2 --save
npm install hexo-renderer-stylus@0.2 --save
npm install hexo-generator-feed@1 --save
npm install hexo-generator-sitemap@1 --save


Git获取SSHKey

  1. 打开 Git Bash.
  2. Paste the text below, substituting in your GitHub email address.
    1
    2
    3
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    or
    ssh-keygen -t rsa -C "your_email@youremail.com"

3.回车3次

4.在Git Bash 输入

1
2
ssh -T git@github.com
ssh -T git@git.coding.net

测试是否生效

5.如下提示说明成功

1
2
Hi username! 
You've successfully authenticated, but GitHub does not provide shell access.


Git-backup

Install

if version is 3.x.x, you should install as follow:

1
$ npm install hexo-git-backup --save

Update

if you install with –save, you must remove firstly when you update it.

1
2
$ npm remove hexo-git-backup
$ npm install hexo-git-backup --save

Configure

You should configure this plugin in _config.yml.

1
2
3
4
5
backup:
type: git
repository:
github: git@github.com:xxx/xxx.git,branchName
gitcafe: git@github.com:xxx/xxx.git,branchName

Using

1
hexo backup

or

1
hexo b

Options

if you want to back up with your theme,just add theme: your theme name,your theme name in _config.yml.

1
2
3
4
5
6
backup:
type: git
theme: coney,landscape,xxx
repository:
github: git@github.com:xxx/xxx.git,branchName
gitcafe: git@github.com:xxx/xxx.git,branchName

Attention: if you do as above, the dir themes/coney/.gitwill be removed

if you want DIY commit message, just add ‘message: update xxx’.

1
2
3
4
5
6
backup:
type: git
message: update xxx
repository:
github: git@github.com:xxx/xxx.git,branchName
gitcafe: git@github.com:xxx/xxx.git,branchName

Now you can backup all the blog!

Problems

You may get some troubles by your computer’ permission。

###Error: EISDIR, open
it is caused by permission.
just do ‘sudo hexo b’

1
sudo hexo b

Hexo Windows安装

发表于 2016-03-06   |   分类于 Blog   |  

本地安装hexo步骤

注意:本节教程只针对Windows用户,Linux和Mac用户请移步hexo安装。

  • 安装Git

    下载 msysgit 并执行即可完成安装。

  • 安装Node.js

    在 Windows 环境下安装 Node.js 非常简单,仅须下载安装文件并执行即可完成安装。

  • 安装hexo

    利用 npm 命令即可安装。(在任意位置点击鼠标右键,选择Git bash)
    npm install -g hexo
    安装完成后,在你喜爱的文件夹下(如H:\hexo),执行以下指令(在H:\hexo内点击鼠标右键,选择Git bash),Hexo 即会自动在目标文件夹建立网站所需要的所有文件。创建hexo文件夹
    hexo init
    安装依赖包
    本地查看

现在我们已经搭建起本地的hexo博客了,执行以下命令(在H:\hexo),然后到浏览器输入localhost:4000看看。
hexo generate
hexo server
好了,至此,本地博客已经搭建起来了,只是本地哦,别人看不到的。下面,我们要部署到Github。

提交hexo到github步骤

  • 注册Github账号

    已有账号可以跳过,没有的,请在此进行注册,很简单,这里就不介绍了。

  • 创建repository

    在自己Github主页右下角,创建一个新的repository。比如我的Github账号是imsofter,那么我应该创建的repository名字应该是imsofter.github.io。

  • 部署

    编辑_config.yml(在H:\hexo下)。你在部署时,要把下面的zippera都换成你的账号名。
    deploy:
    type: github
    repository: https://github.com/imsofter/imsofter.github.io.git
    branch: master
    执行下列指令即可完成部署。据说最新版本的hexo 中,这里的 type 要写成 git,而不是 github。
    hexo generate
    hexo deploy
    记住:每次修改本地文件后,需要hexo generate才能保存。每次使用命令时,都要在H:\hexo目录下。注意:有些新用户需要设置 ssh,否则上述命令会失败。ssh 的介绍和设置方法请看官方教程,不用担心,很简单。
    Okay,我们的博客已经完全搭建起来了,在浏览器访问zippera.github.io就能看到你的成就了!

以下为安装出问题的总结

安装hexo后,bash: hexo: command not found

找到C:\Users\Administrator\AppData\Roaming\npm\node_modules\hexo\bin\,将此目录添加到环境变量中

执行 hexo deploy 后,出现 error deployer not found:github 的错误

hexo 更新到3.0之后,deploy的type 的github需要改成git
repository路径: http://github.com/imsofter/imsofter.github.io.git (需要将https修改成http)还不行的话尝试
git@github.com:imsofter/imsofter.github.io.git路径
改了之后执行npm install hexo-deployer-git –save 安装hexo对于git的部署工具。

然后再部署试试

验证报错报错verification failed:

Error: Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.

解决方法:条件SSHkey
$ ssh-keygen -t rsa -C “imsofter@163.com”
三次回车,即可设置密码为空

将生成的C:\Users\Administrator.ssh目录下的id_rsa.pub添加到github上

再测试是否可以连接到github上,
$ ssh git@github.com
Hi imsofter! You’ve successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

再可以将代码推上github上了。

绑定域名

在source目录下创建CNAME文件
DNS设置
用DNSpod,快,免费,稳定。
注册DNSpod,添加域名,如下图设置。

其中A的两条记录指向的ip地址是github Pages的提供的ip
192.30.252.153
192.30.252.154

Evilek

10 日志
2 分类
7 标签
RSS
GitHub

Links

MacTalk
© 2014 - 2016
由 Hexo 强力驱动
主题 - NexT.Mist