使用homebrew安装redis
1 | $ brew install redis |
终端输出
1 | ==> Downloading http://download.redis.io/releases/redis-3.2.3.tar.gz |
从以上日志输出可以看出,如果需要给redis服务端指定配置文件,
启动命令应该是这样的:
1 | $ redis-server /usr/local/etc/redis.conf |
1 | $ brew install redis |
终端输出
1 | ==> Downloading http://download.redis.io/releases/redis-3.2.3.tar.gz |
从以上日志输出可以看出,如果需要给redis服务端指定配置文件,
启动命令应该是这样的:
1 | $ redis-server /usr/local/etc/redis.conf |
将图片转化裁剪为圆形的头像
1 | -(UIImage*) imageToHeadView:(UIImage*)image withParam:(CGFloat)inset{ |
调用:
1 | UIImage *img = [UIImage imageNamed:@"edit_background1.jpg"]; |
作为JS的核心,回调函数和异步执行是紧密相关的,也是必须跨过去的一道个门槛。
那么究竟什么是回调函数(Callback),网上有许多的文章,这些文章大概分成两类,第一类术语太多,看不懂。另一类反过来,太过于生活化,讲的是一些脱离编程的例子,还是看的人晕头转向。
其实回调函数并不复杂,明白两个重点即可:
下面以node.js为例,举一个例子:
1 | var fs = require("fs"); |
以上代码不难理解,就是设置一个全局变量c = 0,然后执行writeFile函数(也就是写入一个文件input.txt),写完之后让c=1,然后再调用f()函数,f()函数简单至极,就是把打印一个变量,仅此而已。
按照正常逻辑,首先c=0,然后在调用writeFile函数的时候里面有一句c=1,我们先调用的writeFile,所以c=1肯定是会被执行到的,那么结果应该是打印1,但是万万想不到,结果是0,明明我们在writeFile函数里我们重新对c进行了赋值,为什么结果还是0呢?
因为程序运行到writeFile()这一行的时候,是一个比较耗时的IO操作,系统并不会卡在此处,死等writeFile执行完毕再执行下一条语句,而是直接下一条代码,即f(c),而此时c并没有被重新赋值为1,所以打印出来的结果还是0 !
这时候就需要搬出我们的主角“回调函数”了,改写一下writeFile函数:
1 | var fs = require("fs"); |
我们在writeFile函数的形参里加入了一个关键字callback,表示这是一个回调函数,也就是前面所说的重点1,即所谓的“以函数为参数”,然后当文件写入完毕后,我们执行c=1, 然后再用一次callback关键字,在这里,关键字”callback”就是f()函数的化身,表示我们在此处调用一次f()函数.
如果你看明白上面的代码,那么我们现在开始用一句话攻略做一个总结:
【在大多数编程语言中,函数的形参总是由外往内向函数体传递参数,但在JS里如果形参是关键字”callback”则完全相反,它表示函数体在完成某种操作后由内向外调用某个外部函数】
所谓的“回调”,就是回头调用的意思。本例子中即是:让我先写文件,写操作结束后,我再回头调用f()函数。
有时候,我们会看到一些回调函数并没有使用callback关键字,这种连callback关键字和函数名都省略了,直接在函数的形参中嵌入一个function的写法,在js代码中更为常见,其本质上仍然是回调函数。
ios
simulator, Ensure that Xcode -> Window -> Devices has at least on执行 pod lib lint 时,报错:
ERROR | [iOS] unknown: Encountered an unknown error (Could not find a ios
simulator (valid values: com.apple.coresimulator.simruntime.ios-10-3, com.apple.coresimulator.simruntime.ios-12-1, com.apple.coresimulator.simruntime.ios-8-1, com.apple.coresimulator.simruntime.tvos-12-1, com.apple.coresimulator.simruntime.watchos-5-1). Ensure that Xcode -> Window -> Devices has at least one ios
simulator listed or otherwise add one.
验证通过
安装cocoapods时候
命令 sudo gem install cocopods
提示
tiantaodeMacBook-Pro:~ tiantao$ sudo gem install cocoapods
ERROR: While executing gem … (Gem::FilePermissionError)
You don’t have write permissions for the /usr/bin directory.
解决方案 有人说 前面加sudo 明明已经加了 是无写入到/usr/bin directory 权限
执行此命令即可
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
fishhook是Facebook提供的一个动态修改链接mach-O文件的工具。利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。
在分析fishhook原理前,我们先来想两个问题:
1. Mach-O文件是被谁加载的?
我们知道,在程序启动的时候 Mach-O 文件会被 DYLD (动态加载器)加载进内存。加载完 Mach-O 后,DYLD接着会去加载 Mach-O 所依赖的动态库。
2. 何为ASLR技术?
地址空间布局随机化。它会让 Mach-O 文件加载的时候是随机地址。有了这个技术,Mach-O 文件每次加载进内存的时候地址都是不一样的。主要是为了防止逆向技术。
Mach-O 文件里只有我们自己写的函数,系统的动态库的函数是不在 Mach-O 文件里的。也就是说每次启动从 Mach-O 文件到系统动态库函数的偏移地址都是变化的。
我们程序的底层都是汇编,汇编代码都是写死的内存地址。我们该怎么找呢?而且系统的动态库在内存里面的地址是不固定的,每次启动程序的时候地址都是随机的。
苹果为了能在 Mach-O 文件中访问外部函数,采用了一个技术,叫做PIC(位置代码独立)技术。
当你的应用程序想要调用 Mach-O 文件外部的函数的时候,或者说如果 Mach-O 内部需要调用系统的库函数时,Mach-O 文件会:
先在 Mach-O 文件的 _DATA 段中建立一个指针(8字节的数据,放的全是0),这个指针变量指向外部函数。
DYLD 会动态的进行绑定!将 Mach-O 中的 _DATA 段中的指针,指向外部函数。
所以说,C的底层也有动态的表现。C在内部函数的时候是静态的,在编译后,函数的内存地址就确定了。但是,外部的函数是不能确定的,也就是说C的底层也有动态的。fishhook 之所以能 hook C函数,是利用了 Mach-O 文件的 PIC 技术特点。也就造就了静态语言C也有动态的部分,通过 DYLD 进行动态绑定的时候做了手脚。
我们经常说符号,其实 _DATA 段中建立的指针就是符号。fishhook的原理其实就是,将指向系统方法(外部函数)的符号重新进行绑定指向内部的函数。这样就把系统方法与自己定义的方法进行了交换。这也就是为什么C的内部函数修改不了,自定义的函数修改不了,只能修改 Mach-O 外部的函数。
接下来我们以 NSLog 为例,看 fishhook 是如何通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。(NSLog 是在懒加载表里)
注:对于非懒加载符号表,DYLD会立刻马上去链接动态库
对于懒加载符号表,DYLD会在执行代码的时候去动态的链接动态库
本文来自微信团队工程师方乐明的技术分享,原文地址:infoq.cn/article/2017hongbao-weixin,感谢原作者的分享。 点此进入原文。
每年节假日,微信红包的收发数量都会暴涨,尤以除夕为最。如此大规模、高峰值的业务需要,背后需要怎样的技术支撑?百亿级别的红包规模,如何保证并发性能与资金安全?
本文将为读者介绍微信百亿级别红包背后的高并发设计实践,内容包括微信红包系统的技术难点、解决高并发问题通常使用的方案,以及微信红包系统的所采用高并发解决方案。
方乐明:现任微信支付应用产品系统负责人,主要从事微信红包、微信转账、微信群收款等支付应用产品的系统设计、可用性提升、高性能解决方案设计等,曾连续多年负责春节微信红包系统的性能优化与稳定性提升,取得良好的效果。
微信红包(尤其是发在微信群里的红包,即群红包),业务形态上很类似网上的普通商品“秒杀”活动。