呼吸de艺术

Live in your world, get owned in mine

剑冢

| Comments

独孤求败剑冢文:

纵横江湖三十余载,杀尽仇寇,败尽英雄,天下更无抗手,无可柰何,惟隐居深谷,以雕为友。呜呼,生平求一敌手而不可得,诚寂寥难堪也。

第一柄剑长四尺,锋利无比,剑下石片下写着,刚猛凌烈,无坚不摧,弱冠前与河朔群雄争锋。

第二柄紫薇软剑,三十岁前用,误伤义士不详,乃弃之深谷。

第三把重剑无锋,大巧不工,四十岁之前持之横行天下。

第四柄木剑,四十岁之后不屑带物,草木竹石均可为剑。自此精进,渐入无剑胜有剑之境。

基于WebQQ协议的机器人-QQBot

| Comments

诞生

这是元旦期间做的工具,今天有点时间来博客宣传下。

如果你对自动化运维(部署)和团队建设方面有兴趣,先推荐个视频 Github的运维机器人hubot的介绍 , Hubot 在 Github 内部基本完全接管了运维方面的工作,重启部署,查看监控图表,这种在讨论组里的运维方式,对团队而言非常透明和直接,减少很多沟通和学习的成本。另外一方面就是非常简单的插件支持,这对于理解和使用扩展都降低了不少门槛。

后来因为Bitcoin的关系在某QQ群居然看到了群机器人,可以辅助群主自动清理刷屏用户,提供简单的QA比如各个市场行情。平静多年的内心突然骚动了起来,然后就写了这么个东西

QQBot

QQBot 是基于WebQQ协议的QQ机器人。命令行工具,由不可思议的CoffeeScript提供支持。
TA支持独立运行,也可以作为Hubot的Adapter直接享用海量的Hubot插件。

功能

  • 登录(支持验证码)
  • 监听并派发收到的qq消息,支持群,好友消息
  • 插件化,目前支持消息的派发
  • 可作为hubot adapter使用

项目和使用

项目地址 https://github.com/xhan/qqbot , 同时整理了个WebQQ的协议。具体使用和依赖也请见项目的README咯。

日志

这次开发试着将每个时间点的状态做了记录,挺有趣

2013.12.28

  • 19:43 搜索了下果然已有好多轮子,但几乎所有的都是闭源付费以及是基于win系统。所以决定测试下基于webQQ协议的可能性。
  • 20:13 有点急功近利了,直接用coffeescript编码有点搞不定的感觉。看会Coffee和node的语法和api
  • 21:18 基本语法和http测试完成 :smile:

2013.12.29

  • 10:23 昨晚一直卡在登录账户验证处,调试到凌晨终于通过登录验证的第一个环节。PS.使用coffee写代码还真是蛮清爽的
  • 15:07 去了趟医院,怎么就突然感冒咳嗽头晕了。成功搞定node http post以及获取到qq登录最后一步token。睡会会。
  • 19:43 发现了一款开源的webqq协议的win客户端MingQQ,看截图完成度相当高。对了增加了验证码的支持
  • 20:44 增加在线(轮训功能),进度比预期的慢了些。但又发现了些资料和文档,补充在底部。分离qqauth和qqapi

2013.12.30

  • 08:37 有了第三方的资料文档后进展快了不少,增加获取群信息,发消息接口,抽离了httpclient功能,分离测试脚本auth,api
  • 13:11 学习Coffee Class的简单用法,提供了QQBot对象来处理各种接口信息。现已支持简单的poll事件解析
  • 18:05 增加回复响应功能,同时写了个比较挫的插件机制,但是至少似乎运作的还算正常!后续得看下hubot的代码学习下设计

2014.01.01

  • 支持hubot,现已加入豪华午餐!
  • 增加独立运行的入口文件 main.coffee

Get Free Iwork on New Iphone5s/c

| Comments

今天才想起新闻说的新款 iPhone5C/S 可以免费获取苹果的 iWork ,iLife系列,搜索了下,居然每个软件收费9.99$,又奇葩了!

唯一不同的是据说别人直接打开app store就有提示,而我直接还原至旧手机的备份了。

怎么解?别用搜索!直接在第一屏幕 找到 Apps Made By Apple ,然后就能发现这些应用都免费了。

补充个题外的事情:我的5s的指纹识别非常不好用,每次在第一次设置后2天内能正常使用,然后识别效果会越来越糟糕,最后每次识别失败。(另外手上稍微有点汗也会导致识别失败),所以现在已经彻底关闭这个功能,白期待了。不知道是个例还是普遍现象

Run SZ RZ on Mac With iTerm2

| Comments

rz sz 是通过 ZModem 协议在远程服务器和终端机器间上传下载文件的利器,win下终端软件 SecureCRT 就自带了这个协议,所以经常看到在 SecureCRT 下敲个命令就能方便的导文件了。

之前以为此命令为win系统独家设计所以也未曾多想,安心的用scp直到刚刚忍不住搜索了一把!答案如下:

  1. 安装 lrzsz : brew install lrzsz (不知道brew的搜索 homebrew)
  2. iTerm2
  3. https://github.com/mmastrac/iterm2-zmodem

10.9 Mavericks 测试通过。目前发现的小问题是:中文名的文件传递会出错。

Template Engine for Objective-c

| Comments

web开发者对模板引擎会非常熟悉,最简单的例子:
对于模板 –>

hello {{ name }},
you have just won {{ value }} !
please visit {{ site }} immediately.

提供给定的 hash –>

1
2
3
4
5
{
   "name":  "steve",
   "value": "$100000",
   "site":  "www.cheatyouforever.com"
}

然后就能生成最终文本 –>

1
2
3
hello steve,
you have just won $100000 !
please visit www.cheatyouforever.com immediately.

如果文本足够简单,那直接用字符串替换即可。更复杂点的需求就需要方案来解决问题了。下面是找到的两个模板引擎,好像没有更多了?

MGTemplateEngine

MGTemplateEngine is a native Cocoa system for generating text output based on templates and data. It’s a close cousin of systems like Smarty, FreeMarker, Django’s template language, and so on.

MG前缀就知道是objc前辈作品了,除了基本的模板功能,还提供 模板内运算,循环操作。并且插件支持。

Mustache

Logic-less templates. 一句话介绍完。

跨平台,除了objc还覆盖了目前主流和非主流的常见语言。模板不提供if之类的逻辑操作,但是提供了一套替代的语法标识,看起来很清爽,但学习稍微有些成本。

CCTemplate

本人写的只有一个头文件的超级轻量级模板引擎,功能只有一个,将占位符的文字替换!没从底层写起,直接用了NS的NSScanner类来做字符串扫描,所以代码量不多。

1
2
3
4
5
6
7
8
// pod 'CCTemplate'
#import "CCTemplate.h"
CCTemplate* engine    = [[CCTemplate alloc] init];
NSString*   template  = @"hello world ";
id            dict      = @{@"name":@"xhan"};
NSString*result    = [engine scan:template dict:dict];
// or just call nsstring category method
result                = [template templateFromDict:dict];

QQ音乐mac版本外挂歌词 LessLyrics

| Comments

有天张小君小朋友说,Mac下的QQ音乐如果能支持独立显示歌词就好了!

经过一个下午以及两个晚上的战斗,我成功了!天空突然牛逼闪闪起来…

前提:你需要的最新的 QQ音乐 Mac版本 (Mac Appstore 和他们官网的都可以)
测试可用版本: 1.0.18-19

首先:请下载最新的 LessLyrics 歌词秀软件
适用 v1.0 以上版本(也就是今天刚刚发布的新版!)

然后:下载 QQ音乐 启动器

最后:打开 启动器 + LessLyrics 就能支持 QQ音乐 外挂歌词咯

PS. 目前步骤略显繁琐,当然也可以打包做成 QQ音乐-修改版 完成,甚至直接将外挂歌词也打包进入。您有什么建议?

傻叉移动广告联盟

| Comments

实在忍不住了部分移动广告联盟同学的从业素质。开始吐槽。

最近国内广告联盟持续升温,而商务同学们更是捉急到恨不得马上跑到你办公室盯着你看着把他们家的广告sdk给嵌入到自己的软件中方才满意离去。

可是你们这些做平台SDK的同学能不能靠谱点把自己的SDK写的稍微健全点,不是那么容易出问题好么。

  1. 稳定性

>不少联盟甚至连最基本的稳定性都达不到,各种崩溃甚至直接就闪退了,经常引发用户突然骂声一片。调查一番发现基本又是哪家广告平台又开始坑人了。特别是最近一家相当不靠谱的新型广告平台,第一次大规模崩溃后,商务信誓旦旦保证不在会出问题。然后本着互利互惠的心态又测试了一把,又是各种崩。我说不再合作了对方商务居然说我们聊了这么久看在我这么诚意的份上再给次机会。尼玛给了这么多崩溃日志不去分析,反而对我们工作人员持续骚扰打各种温情牌死缠烂打。负分滚粗

  1. 奇葩的接口设计

> 各种完全不考虑真实使用场景的设计简直是要你命3000加强版,完全没法理解这些开发同学为嘛不去参考下更合理的设计,而是怎么想当然设计出各种奇葩的接口和使用方式的。

  1. 低素养/低水平人员
    1. 好几家(难道代码公用的)平台默认打开地理位置跟踪,虽然提供了开关。但是完全没法使用。莫非广告联盟都是完全不在意技术的公司么
    2. 完全没流量意识,随便抓包一看各种请求满天飞,诺不为了生机真不愿意让这些sdk在自己app里存活着了。
    3. 反馈稳定性问题,对方第一反应:诶我这里好好的啊。啊,你用聚合?别用聚合,要么用芒果。。没见到一个同学是抱着解决问题的角度来处理事情的,这种水平的同学倒贴来我们公司打工也不要!!

我实在是无法理解作为平台提供SDK给第三方使用的开发同学,完全不在意接口易用性,SDK稳定性。而这些公司的商务更是完全熟视无睹,软磨硬泡能偏上一个算一个。

下面是最精彩的傻叉移动联盟排行榜(由于使用的平台不多,肯定有遗漏):

  1. adwo 安沃传媒(就是最近被某游戏商投诉欺诈的那家)
    上榜理由: 不稳定! me:你们新版更不稳定了 them:新版增加了很多功能;最奇葩!技术完全不搭理人,难得搭理也是说没问题啊,你们肯定用错了最屌丝的接口设计!说多了都是泪。 而且直接将调试信息打在日志上,他们的开发一定是销售转过来的!

  2. guomob 果盟
    上榜理由:最不稳定,最能软磨硬泡。这是有史以来最不稳定的平台了,但是他们的销售/市场简直是奇葩,能从早上8点一直耗到凌晨1点骚扰你。

  3. adchina 易传媒
    上榜理由:无下限!sdk里的默认强制使用地理位置,而且提供的开关没法关闭。(多盟早期也巨不靠谱,类似问题多的去了。最近情况不详因为早被抛弃了 = =)

迁移至 Octopress - Dreamhost版

| Comments

小学还是初中那会,我躲在楼上用 FrontPage 做网页。折腾了一晚上照着书本的教程建了个表格,插入了些文字和图片还能跳转到另一个页面。非常有充实感的夜晚。

然后就是各种动态语言的世界了,从一行行手写web应用开始到web框架盛行,然后突然的,各个公司开始去Rails化,回归到选择更轻量级的框架。博客界也开始返璞归真起来,静态内容+社交化交流插件(Disqus)反而更能专注内容,这点微信公众平台倒有些相似的地方。

之前用 Jekyll (中文翻译: 变身怪医 ) 搭建了个糗事百科的 Blog (我们在招人哦~) ,这几天又看到几个用 OctoPress 搭建的博客,默认主题真是舒服简约大气,还能直接内嵌高亮代码。当然最重要的字体足够大,这才能沉浸阅读嘛。

尝试找了下类似的wordpress主题无果后,决定放手试试传说中的 OctoPress ,毕竟能用 markdown 写作也是期待许久。

从此,这个博客不再有数据库。 哈哈哈。

迁移和配置

尝试了好几个工具,Exitwp 效果是最满意的,唯一的缺点操作和依赖稍微麻烦点。但和几年博客数据顺利迁移比起来都是小问题了。

注意,wordpress导出的xml文件肯定有些不正常的字符内容,用 xmllint 检查并手动修正即可。

然后是配置全新的 octopress 站点。将 url 格式还原到和老博客一致能少不少麻烦,毕竟我的空间提供商不提供自己修改http转发配置的。评论系统之前使用的就是Disqus,所以迁移起来完全无压力。话说什么时候Disqus 能支持国内的微博平台呢。

坑和问题

你还未掉到坑里,只是你还不够胖而已。摘自xhan语录第一集

  • github.com默认的 Jekyll 依赖的 maruku gem 对中文markdown支持很差,不支持中文list issue
  • markdown 里url里带有中文字符也会直接报错,手动转码后解决(没来得及看哪里的问题)
  • post 和 page 生成的 page.url 结果不一致,导致 Disqus 在Page 里没法正常工作(暂时手动通过修改Disqus映射解决了) 刚提交的 issue
  • 由于是纯静态页面,所以也就没有了404页面。我的空间是apache,所以可以用 .htaccess 创建个 ErrorDocument 404 /404.html 来重定向
  • Case-sensitive! 这个问题迁移前没考虑到!也是折腾最长的问题了。若直接访问 /LessDJ是会报404的,因为默认文件都是小写的。而且我的空间商不提供hcaccess的重定向功能!临时解决方法在下面。
  • 默认博客的/feed/不见了,将 atom 改个名字换过来即可
  • 原始博客的图片附件等内容:通过 ln -s 做个乱链接即可

简单的忽略大小写的方法

如果你的服务商直接支持请求转发,那网上就有太多解决方案了。否则可以试试这个 就是在404页面中加一段js :

如果请求地址存在大写字母则跳到全小写的地址
1
2
3
  <script> var myRoute = document.location + "";
     if (myRoute!=myRoute.toLowerCase())   document.location=myRoute.toLowerCase();
  </script>

你可以修改模板自动将代码插入404.html的头部 通过 404.md 里添加一个定义 header_top: blabla,然后模板里调用 “ 就可以插入自定义内容了。

但是对搜索引擎就不是那么友好了,所以只是个简单的解决方案。

Octopress 初体验

  1. 其实就是在 Jekll 上增加了主题和一些常用插件
  2. 模板的设计过于碎片,个人不喜欢将页面拆解的如此零碎。特别对于设计师来说就是折磨。
  3. 坑还是蛮多的,目前也是临时补上。不少问题流程以后可以合并进rake tasks
  4. 纯静态文件,版本管理起来也同样方便了很多
  5. 发图或添加附件的流程不够轻便,全手动操作的还是比较麻烦

这篇文章由 Mou (国产Markdown IDE) 编写

OSX10.8下WIFI问题(网络共享)解决

| Comments

无力吐槽苹果的系统,越做问题越多。今天尝试了下苹果的电话客服,结果打了10分钟得不到任何有建设性的解决方案后,客服建议稍等会儿,让我别挂机。继续等了10分钟后,对方没任何提示就挂了电话。回头想投诉发现苹果没有客服ID什么的,唉算了大苹果也是惹不起的。

最近碰到了WIFI图标上有个惊叹号,但是不影响使用可以正常上网!(坑爹的bug)

解决方法:网络设置/地点location/添加个新地点,并应用。 然后就正常了,估计哪个配置文件突然坑爹了。 出处:WiFi Bug Fixes (Mac OS X 10.8 Mountain Lion)

10.8网络共享无法分配ip地址(dhcp)问题:
自从没有以太网线口后已经好久没用过网络共享这个功能(估计苹果开发和qa也是),公司购置了台mini准备做网络共享发现死活也没法提供正确的ip地址。一开始以为机器配置问题(安装了server软件),后用自己的rMBP测试同样dhcp服务根本不起作用,客户端分配到的ip地址都是 169.254 开头的(传说中的fakeip)。 各种方案折腾了2个小时(包括打什么也不懂的客服电话)后,终于解决:

删除以下文件,然后重启

/Library/Preferences/SystemConfiguration/com.apple.nat.plist   
/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist   
/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist  

参考链接:
Internet Sharing and Self-Assigned IP
Lion won’t give out DHCP addresses with Internet Sharing

Startssl + Nginx 搭建https服务

| Comments

配置个nginx下的https服务比想想中的容易,startssl支持免费提供一个二级域名(仅,需要多个二级域名请花钱)一年的授权,当然过期后再续就可以了。

教程:申请startssl证书
http://www.chinaz.com/free/2010/1111/142581.shtml

教程:如何配置nginx https server
http://nginx.org/en/docs/http/configuring_https_servers.html

解决startssl申请的https证书在firefox下不可信任 原因是缺少根证书的问题,去官网下载两个文件合并即可

1
2
3
wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
cat ssl.crt.bak ca.pem sub.class1.server.ca.pem > ssl.crt

注意备份原证书,cat后可能会丢失换行,可以自行编辑下。
当然这个方案也是网上找的,出处页面不小心被关了,就不发地址了