小内存 VPS Mysql error code 12

WordPress 跑一段时间后都会出现数据库连接错误,上去重启一下 mysql 就好了 今天终于忍不住了,上去看了一下 error log,最重要的一行 InnoDB: mmap(137363456 bytes) failed; errno 12 找到原因了,开始看怎么解决,VPS 只有 1G 内存,原来想着跑个 WordPress 还是绰绰有余的,没想到这么容易就挂了 加内存不太可能,本来就没什么人访问的地方,只是自己用来做个记录的,那就看 swap 了 开始操作,下面命令需要 root 权限 dd if=/dev/zero of=/swapfile bs=1M count=1024 这个命令就是生成一个 1G 的 swapfile 文件,用来做 swap mkswap /swapfile swapon /swapfile Read More …

搭建 SS

安装shadowsocks依赖 sudo -s // 获取超级管理员权限 apt-get update // 更新apt-get apt-get install python-pip // 安装python包管理工具pip pip install shadowsocks // 安装shadowsocks ssserver -c /etc/shadowsocks.json -d start // 启动shadowsocks 配置shadowsocks vi /etc/shadowsocks.json (ps. 可能有人不会用vi,这里简单说下,vi打开文件后,按i即可进入编辑状态,编辑完后,按esc退出编辑状态,按:进入命令状态,输入wq即可保存并退出,还不懂的话自行百度vi吧) 单一端口配置: { “server”:”0.0.0.0″, “server_port”:端口, “local_address”:”127.0.0.1″, “local_port”:1080, “password”:”连接密码”, “timeout”:300, “method”:”aes-256-cfb”, Read More …

换了个 Blog 服务器

AWS 3 年合约到期了,想着简单一点继续用 AWS,然后开始了换服务器的过程,想着 AWS 应该比较简单可以备份恢复来解决,但折腾了好久发现现在的服务器和我当年的差别太大,无论 EBS 还是 IP 都搞不定,只好回到了手工备份数据下载,上传 折腾了 4,5 个小时,终于 run 起来了,太久没弄过了,好多东西都很生疏,还好数据没丢 下次再换又是 3 年后了,希望到时候能更熟练一点,或者能有个更好的解决方案

Swift 2.0 遭遇的坑

let a = OCObject.Value 但是这个 Value 可能是 nil 在 Swift 1.2 的时候,大部分的时候我们用的是 var ,可能还会判断一下,但 2.0 自动全部转成了 let 开眼(Eyepetizer)在升级 1.9.0 版本的时候升级到了 2.0,做了 iPad 适配,还做了其他很多事情,但我们并没有针对原来存在的很多 nil 情况做测试,导致升级后用户一直在反馈闪退,Crash 花了一点时间查看问题,找到了根源,还是我们做的不够好,写个文章,作为备忘

【转】Git-rebase 小筆記

原文写的太好了,转过来收藏 原文地址:http://blog.yorkxin.org/posts/2011/07/29/git-rebase 最近剛好有個機會整理很亂的 Git commit tree,終於搞懂了 rebase 的用法,筆記一下。 大家都知道 Git 有個特色就是 branch 開很大開不用錢,但很多 branches 各自開發,總要在適當時機 merge 進去 master 。看過很多 git 操作指南都告訴我們,可以妥善利用 rebase 來整理看似很亂或是中途可能不小心手滑 commit 錯的 commits ,甚至可以讓 merge 產生的線看起來比較簡單,不會有跨好幾十個 commits 的線。 rebase 的意義:重新定義參考基準 首先要提一下 rebase 的意思,我擅自的直譯是「重新 (re-)定義某個 branch 的參考基準(base)」。把這個意思先記起來,比較容易理解 rebase 的運作原理。就好比移花接木那樣(稼接),把某個樹枝接到別的樹枝。 Read More …

使用xctool自动打包,测试xcode项目

xctool是facebook开源的一个命令行工具,用来替代苹果的xcodebuild工具。 功能如下: 像xcode一样跑测试用例 结构化输出编译测试结果 彩色且方便阅读的编译内容输出 示例截图: 如何安装xctool 最简单的办法是通过homebrew安装xctool brew update brew install xctool 搞定 如何使用xctool 打包 path/to/xctool.sh -workspace YourWorkspace.xcworkspace -scheme YourScheme archive build path/to/xctool.sh -workspace YourWorkspace.xcworkspace -scheme YourScheme build 测试 path/to/xctool.sh -workspace YourWorkspace.xcworkspace -scheme YourScheme test 作者: Volcano 发表于May 14, 2013 at Read More …

【转】iOS抓包利器Charles

转自:http://wonderffee.github.io/blog/2013/07/13/best-packet-capture-tool-charles-in-ios/ 看唐巧的分析支付宝客户端的插件机制一文发现他使用了抓包工具Charles,想起去年有人给我推荐过这个工具,但是当时我觉得WireShark就够用了就没尝试。这次看到又有人使用Charles我就重视起来了,Charles到底有什么好? 搜了一下,发现大多数使用者都是将Charles作为移动端抓包工具使用的,这样就意味着我们可以用Charles来截取iPhone/iPad上app所发出的网络请求来进行分析,分析支付宝客户端的插件机制一文就是这么用的。WireShark显然做不到这一点,优势一下子就体现出来了。 在Mac上安装Charles后,启动Charles,首先弹出一个框提示是否允许Charles有自动修改网络设置的权限,选择允许后出现Charles主界面。Charles主界面左侧有Structure和Sequence,你会发现会发现Structure这一栏里会逐步出现当前我的mac正在请求的链接,也就是说Charles一启动就自动进行抓包了。不过遗憾的是Structure栏里没有过滤选项,意味着你不能过滤特定网站。切换到Sequence栏,这个就容易懂了,按时间顺序来排列的,与WireShark一致。下方的Filter可以过滤,而是还是实时过滤的,这一点就比WireShark强多了。 如何在Mac上用Charles远程抓iPhone上app的网络请求呢?方法相当简单,下面就提供了HTTP和HTTPS抓包的操作步骤,简单几步就搞定了。 HTTP抓包 打开Charles程序 查看Mac电脑的IP地址,如192.168.1.7 打开iOS设置,进入当前wifi连接,设置HTTP代理Group,将服务器填为上一步中获得的IP,即192.168.1.7,端口填8888 iOS设备打开你要抓包的app进行网络操作 Charles弹出确认框,点击Allow按钮即可 HTTPS抓包 下载Charles证书http://www.charlesproxy.com/ssl.zip,解压后导入到iOS设备中(将crt文件作为邮件附件发给自己,再在iOS设备中点击附件即可安装;也可上传至dropbox之类的网盘,通过safari下载安装) 在Charles的工具栏上点击设置按钮,选择Proxy Settings… 切换到SSL选项卡,选中Enable SSL Proxying,别急,选完先别关掉,还有下一步 这一步跟Fiddler不同,Fiddler安装证书后就可以抓HTTPS网址的包了,Charles则麻烦一些,需要在上一步的SSL选项卡的Locations表单填写要抓包的域名和端口,点击Add按钮,在弹出的表单中Host填写域名,比如填api.instagram.com,Port填443 我简单试用了一下Charles的远程抓包功能,发现Charles比WireShark还有一个优势是能对JSON数据(在JSON Text栏)进行解析,从而让我们可以更直观地查看JSON串信息(在JSON 栏)。此外Charles对中文支持比较好,JSON串中的中文信息一般会显示为一长串的\ug开头的字符,解析之后就能显示出中文了。平常总头痛Wireshark对中文支持不好,用Charles就完全没有这个问题了。 参考资料: 使用Charles远程调试iOS移动应用 mac下的抓包工具Charles

【转】NSURLSession使用说明及后台工作流程分析

转自:http://www.cnblogs.com/biosli/p/iOS_Network_URL_Session.html 非常感谢作者的详细解释,这几天一直在研究这个东西,拿来主义了,下面是正文 NSURLSession简介 NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的。在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉。 NSURLSession提供的功能: 通过URL将数据下载到内存 通过URL将数据下载到文件系统 将数据上传到指定URL 在后台完成上述功能 工作流程 如果我们需要利用NSURLSession进行数据传输我们需要: 创建一个NSURLSessionConfiguration,用于第二步创建NSSession时设置工作模式和网络设置: 工作模式分为: 一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。 及时模式(ephemeral):不使用缓存的Cache,Cookie,鉴权。 后台模式(background):在后台完成上传下载,创建Configuration对象的时候需要给一个NSString的ID用于追踪完成工作的Session是哪一个(后面会讲到)。 网络设置:参考NSURLConnection中的设置项。   1. 创建一个NSURLSession,系统提供了两个创建方法: sessionWithConfiguration: sessionWithConfiguration:delegate:delegateQueue:     第一个粒度较低就是根据刚才创建的Configuration创建一个Session,系统默认创建一个新的OperationQueue处理Session的消息。     第二个粒度比较高,可以设定回调的delegate(注意这个回调delegate会被强引用),并且可以设定delegate在哪个OperationQueue回调,如果我们将其设置为[NSOperationQueue mainQueue]就能在主线程进行回调非常的方便。   2.创建一个NSURLRequest调用刚才的NSURLSession对象提供的Task函数,创建一个NSURLSessionTask。   根据职能不同Task有三种子类: NSURLSessionUploadTask:上传用的Task,传完以后不会再下载返回结果; NSURLSessionDownloadTask:下载用的Task; NSURLSessionDataTask:可以上传内容,上传完成后再进行下载。   得到的Task,调用resume开始工作。   3. 如果是细粒度的Session调用,Session与Delegate会在指定的OperationQueue中进行交互,以咱们下载例子,交互过程的顺序图如下(假如不需要鉴权,即非HTTPS请求):   5. 当不再需要连接调用Session的invalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。   6. 如果是一个BackgroundSession,在Task执行的时候,用户切到后台,Session会和ApplicationDelegate做交互。当程序切到后台后,在BackgroundSession中的Task还会继续下载,这部分文档叙述比较少,现在分三个场景分析下Session和Application的关系: 当加入了多个Task,程序没有切换到后台。   这种情况Task会按照NSURLSessionConfiguration的设置正常下载,不会和ApplicationDelegate有交互。 当加入了多个Task,程序切到后台,所有Task都完成下载。   在切到后台之后,Session的Delegate不会再收到,Task相关的消息,直到所有Task全都完成后,系统会调用ApplicationDelegate的application:handleEventsForBackgroundURLSession:completionHandler:回调,之后“汇报”下载工作,对于每一个后台下载的Task调用Session的Delegate中的URLSession:downloadTask:didFinishDownloadingToURL:(成功的话)和URLSession:task:didCompleteWithError:(成功或者失败都会调用)。 Read More …

xcode编译的一个诡异bug

今天开发的一个bug搞了好久也没看懂,最后觉得应该是编译器的问题 定义了一个变量 const static unsigned long long overSize = 1024 * 1024 * 1024 *4; NSLog(@”%llu”, overSize); 你猜输出是多少,本来打算是定一个一个4G的数字,结果出来是0,我想不通了,64位啊,无符号啊,2的64次方减1啊,怎么4G都表示不了 然后换一种写法 unsigned long long overSize = 1024 * 1024 * 1024; unsigned long long overSize4 = overSize * 4; NSLog(@”%llu”, overSize4); 这样就能正常输出大小了,这个东西应该是编译器的bug吧