PHP Good Parts

  1. list函数

     list($table, $field)=explode('.', $field);
     $query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
    
  2. %s

     $lang['required'] = "The %s field is required.";
    

Vim打开nginx Conf时语法高亮

mkdir -p ~/.vim/syntax/

wget -O ~/.vim/syntax/nginx.vim http://www.vim.org/scripts/download_script.php?src_id=14376

# /usr/local/etc/nginx/vhosts/*为nginx配置文件存放目录
echo "au BufRead,BufNewFile /usr/local/etc/nginx/vhosts/* set ft=nginx" >> ~/.vim/filetype.vim

OSX Snap

Snap,终于找到这款command + 数字启动应用的神器,今天还限免

https://itunes.apple.com/cn/app/id418073146?mt=12

Svn在已经commit情况下回滚代码

  1. 保证代码最新

     svn update
    
  2. 查看要回滚代码的提交日志

     svn log [something]
    
  3. 对比该文件老版本和最新版本有什么不同,以下28是最新版本,25是需要回滚到的版本

     svn diff -r 28:25 [something]
    
  4. 回滚到版本25

     svn merge -r 28:25 [something]
    
  5. 为保险起见,再对比一下

     svn diff [something]
    
  6. 提交回滚

     svn commit -m "Revert revision from r28 to r25,because of ..."
    

参考文章:

  • http://blog.sina.com.cn/s/blog_5432f2730100vmz4.html

Html Email 注意事项

  1. Doctype使用XHTML 1.0 Strict,不能用HTML5
  2. 使用table布局

     <body style="margin: 0; padding: 0;">
      <table border="1" cellpadding="0" cellspacing="0" width="100%">
       <tr> 
        <td> Hello! </td>
       </tr>
      </table>
     </body>
    
  3. 图片是唯一可以引用的外部资源。其他的外部资源,比如样式表文件、字体文件、视频文件等,一概不能引用。

  4. 所有的CSS规则,最好都采用行内样式。因为放置在网页头部的样式,很可能会被客户端删除。客户端对CSS规则的支持情况,请看这里。
  5. Content-Type要使用

     Content-Type: Multipart/Alternative;
    

参考文章

  • http://www.ruanyifeng.com/blog/2013/06/html_email.html

Mac OSX 无共享的密钥情况下连接基于L2TP协议的VPN

由于公司VPN使用的是L2TP协议,并且是无共享密钥的,OS X需要作一些配置才能支持,否则会提示“IPSec 共享密钥”丢失。请验证您的设置并尝试重新连接。

  1. sudo vim /etc/ppp/options

     plugin L2TP.ppp
     l2tpnoipsec
    
  2. 最后把高级设置里面”通过VPN连接发送所有流量“钩上

2013-06-16 更新

iOS也可以用同样方法,不过必须越狱,建议安装openssh,然后ssh到iOS设备修改文件

使用MAKEFILE自动化部署

自动提交本地git,然后ssh到服务器更新和部署,终于优雅实现这个一直很久的需求了

vim Makefile

 PROJECT=free-will.me
 SERVER=hugh@106.187.34.61
 PATH=/data/app/octopress/
 SSH=/usr/bin/ssh
 GIT=/usr/bin/git
 AWK=/usr/bin/awk
 XARGS=/usr/bin/xargs
 LOCAL_PATH=/Users/jiangrongyong/Program/jiangrongyong.github.com

 remote_deploy:
        @cd $(LOCAL_PATH)
        @$(GIT) status -s|$(AWK) '{print $$2}'|$(XARGS) $(GIT) add
        @$(GIT) commit -m "posts update"
        @$(GIT) push -u origin source
        @$(SSH) -t $(SERVER) "echo Deploy $(PROJECT) to the $(SERVER) server.; cd $(PATH); git pull; rake gen_deploy;"

参考文章

  • http://tchen.me/posts/2013-06-12-use-makefile-to-automate-deployment.html

OSX下使用dd命令把镜像文件烧进SD卡

  1. df -h
  2. diskutil unmount /dev/disk1s1
  3. diskutil list
  4. dd bs=4m if=raspbmc-final.img of=/dev/rdisk1

以上4步就ok了

参考来源

  • http://zhangshenjia.com/exprience/mac-raspbian/

XMPP与Openfire

准备做一个实时应用的服务端,由于以前都是基于http协议开发的,没有这方面的经验

查了下V2EX和知乎,发现目前国内大部分成熟应用用的协议都是XMPP,如米聊、微信和国外的kik

以下是知乎上对XMPP的评价

使用XMPP协议(Openfire + Spark + Smack) 简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。 优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。 缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。

1. 部署开发环境

1.1 参考文章

1.2 Mac下启动与关闭Openfire(通过dmg包安装)

关闭

sudo launchctl unload /Library/LaunchDaemons/org.jivesoftware.openfire.plist

启动

sudo launchctl load /Library/LaunchDaemons/org.jivesoftware.openfire.plist

原文

1.3 编译源码

1.3.1 ant编译
cd /Users/jiangrongyong/Program/openfire_src/build

ant openfire
1.3.2 启动openfire
#先启动mysql
/usr/local/mysql/bin/mysqld

#openfire启动脚本
/Users/jiangrongyong/Program/openfire_src/target/openfire/bin/openfire.sh start

2. 通用术语

  • Bare JID(纯JID) 一个用户的标识符 <user@host>, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.
  • Full JID(全JID) 一个在线用户的标识符 <user@host/resource> , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.
  • Affiliation(岗位) 一个长期存在的和房间之间的联系或连接; 可能的岗位有 owner(所有者), admin(管理者), member(成员), 以及 outcast(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间.
  • Occupant(房客) 一个房间里的任何Jabber用户 (这是一个 “抽象类” 并且不对应任何特定的角色).

3. 接口

3.1 邀请接口

http://wiki.jabbercn.org/XEP-0045#.E9.97.B4.E6.8E.A5.E9.82.80.E8.AF.B7

客户端请求

<message from='crone1@shakespeare.lit/desktop' to='darkcave@chat.shakespeare.lit'>
    <x xmlns='http://jabber.org/protocol/muc#user'>
        <invite to='hecate@shakespeare.lit'>
            <reason>
                Hey Hecate, this is the place for all good witches!
            </reason>
        </invite>
    </x>
</message>

源码在LocalMUCUser.java296行开始

错误返回

<message id="jBnmc-4" to="admin@localhost/Smack" from="room39@conference.localhost" type="error">
  <x xmlns="http://jabber.org/protocol/muc#user">
      <invite to="hugh@localhost">
          <reason>meizi</reason>
      </invite>
  </x>
  <error code="406" type="modify">
      <not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"></not-acceptable>
  </error>
</message>

4. 读源码

4.1 LocalMUCUser.java process()

  1. 处理decline拒绝邀请 (239行)

5. 错误码

http://blog.csdn.net/love254443233/article/details/7887279

Bash加强history

我们知道在 bash 里,可以通过 “上下” 键来浏览最近执行过的命令历史纪录(history),我们也知道如果历史纪录太多的话可以通过 ctrl+r 来查找命令或者通过 history 命令来浏览历史命令。我们不知道的是(也许只有本人不知道~),还有一种神奇的办法可以更准确、有效的在历史命令纪录中查找自己想要的命令。

在自己的用户主目录(home directory)新建一个 .inputrc 文件:

$ vi ~/.inputrc

"\e[A": history-search-backward
"\e[B": history-search-forward
set show-all-if-ambiguous on
set completion-ignore-case on

退出 bash 后重新登陆,敲打一个字母或者几个字母,然后 “上下” 键,就会看到以这个字母搜索到的完整命令行。如果搜索到几个类似命令,通过上下键来切换,有点像 ctrl+r,但是更好用。

原文