Category Archives: IT与互联网

「一阕清歌,唱彻琼楼晓」:清歌输入法v1.0发布

清歌输入法

原文地址:http://qingg.im/about.html

为什么要开发清歌输入法

从94年那个暑假去学习五笔开始算,作为五笔用户,已经快20年了。

虽然各种拼音输入法越做越好,我却始终还是一个五笔用户,尤其是Windows上多年的极点五笔的用户。可当我开始接触Mac后,却始终找不到一款称手的五笔输入法。无论是系统自带的五笔、FIT、QQ五笔、以及后来的百度五笔都极其难用,因为它们的重点从来都不是五笔而是拼音。

还好在放弃前,还是找到了两个做得比较出色的产品:万寿果和鼠须管。

只是这两个产品问题也还是不少,一些细节还是不够完善,用起来很别扭。给万寿果写信提建议,信倒是回了,可改进却始终不见。给鼠须管的佛振留言,改进建议却被否了,囧。

就这样,一边忍受着不顺手的输入法,一边被tinyfool影响(或者说蛊惑:D)逐渐完全转到Mac平台后,感觉继续这种打字不畅的体验,实在是影响越来越大。那时心头蒙生一念,与其等待,还不如动手开工,自己做一款输入法得了。

怎么做

因为鼠须管是开源的,本来想直接基于它来修改,真看了代码才发现引擎部分是用C++写的,不太熟。而且关键是鼠须管实际上是个通用输入法平台,把简单问题通用化了,当然也极其地复杂化了,要理解引擎代码,再加以修改,实在是还不如重新实现来得了断。

于是一咬牙,完全从零开始,认真搜集资料、查阅文档,全Objective-C实现,然后就有了清歌输入法。

在功能上,基本上实现了我认为五笔输入法最重要的部分,比如候选词快捷调序、快捷增删词、自定义标点全半角、临时英文、临时拼音、输简出繁、z键功能等等,有些我认为不重要甚至多余的功能也正好加以剔除。

前前后后差不多2个月的开发,1.0版基本已经成型,这篇文章以及本站所有文案都是用清歌写就。

捐赠送股计划

其实在一开始构思这个项目的时候,就同时在想这个有趣的 捐赠送股计划 :软件免费,大家自愿捐赠,但按金额回赠相应的股份,如果将来软件被收购,就按比例来分享。

纯粹的捐赠太不够好玩了,如果在开发衍进阶段,大家愿意支持这个项目,万一这项目将来真能修点正果之类的,拿出来与大家共享才更有趣。当然某种程度上,你可以把这看成一种投资,虽然获得回报的可能性没那么大,但做股东还是比纯做捐赠者好玩的吧。至于能不能修成正果,各位未来股东们,其实你们也可以想想办法 ^_^ 。

我不知道这个模式是不是我原创,但我觉得做单机软件、通用软件的朋友们,都不妨探索一下。

结语

老实讲,从最早冒出开发的想法到最终行动,中间还是隔了很久,尤其是一看到那些够用的产品,就不想动手了。记得好像是一年多前,在Twitter上和TualatriX还提到过想开发五笔输入法的想法,但最终还是在这个夏天才真正忍够了开始动手。

所以,同好们,如果对哪个产品不满意,倒不如动手开发一款你自己的产品来替代它们吧。

前往清歌输入法主页:http://qingg.im

五笔与联想

昨晚研究五笔输入法的专利和版权问题,无意间却发现了王码和联想的陈年纠葛。原来柳传志当年和王永民有一过场相当激烈的对抗,并最终几乎打垮了对手。

以现在的观点来看,联想和一堆生产汉卡的公司的侵权行为几乎是无需争辩的事实,但考虑到当时的版权观念、法律制度、市场环境,联想等公司二审翻盘似乎又不那么奇怪。所谓的外资和民资在联想等代表的“国资”面前,在当年多多少少都会有些被“妖魔化”。而联想当年似乎又总能将身上披着的“民族大旗”,换得政府的政策支持和民间的心理支持。所以即便换作是更厉害的微软,似乎也并未在中国针对如联想这种体量的IT公司发起激烈的诉讼进攻。

所以我感觉王码公司当年的诉讼策略有些过于意气用事了。即使是20年后现如今的中国的法律制度下,涉及与知识产权保护相关的法律,在执行的力度和效果方面都还相当之糟糕。而王码公司在当年就敢下重注,打大仗,不妥协,斗争到底,实在有些对风险估计不足。如果当时能充分考量联想等“倒王联盟”的“运作能力”和“公关手段”,而选择适当的妥协与合作,也许后面的结果就会有些不一样。当然,不是当时的亲历者,很难完整地获知当时的情境,包括那些描述法律外的纠葛与斗争的话语,看起来也很难考证,毕竟已经是20年前的事了,恐怕连当事人也说不清,或也不再纠结了吧。

时过境迁,柳传志成了一代企业教父,联想也早不再生产什么汉卡,而王永民在2007年也获得了国家科学技术奖,五笔输入法在新时代的拼音输入法冲击下似乎也还能坚守阵地。

那些远去的时代、故事、人物,偶尔读来总是回味深长,不知道《联想风云》那本书的内容的准确性有多高,有点想完整翻翻了。

参考阅读:

  1. “中国第一软件”王码五笔专利败诉内幕
  2. 震动中国的“知识产权第一案”
  3. 《联想风云》

在局域网内用Git同步代码分支

Git是分布式的SCM工具,但为了代码分享、多人协同,大家也会像SVN一样,用一个服务器库来集中存储。这样不管在哪个地方开发的代码,最后都可以push到服务器,再让大家fetch/pull回去。

不过有时我们一个人就会有多台机器,比如一台用于主力开发的Mac mini和一台用于流浪开发的Macbook air。在不同的机器上分别写了一些代码后,又并不想立即push到服务器。那么,是否可以在局域网内先合并代码,等在某台机器上终于完成开发后,再push到服务器端呢?答案是肯定的,只要加以简单的配置,就可以将代码同步了。

以上面的两台Mac为例,大致的场景是这样的:每一次回到mini上时,都先从air上fetch回所有新的提交,加以合并以后再继续开发。而离开mini前,则用air将mini上的新提交fetch过来,然后再离开。这样一来,不管是在mini或air上,完成开发后,都可以将完整的修改push到远端服务器上去。

为了叙述方便,我假设你已经对git的基本配置和使用有所掌握,并且在两台主机上

  • 都已将公钥id_rsa.pub和私钥id_rsa放在了~/.ssh目录
  • 工作目录都在~/project
  • 用户名都是igotit
  • mini的局域网固定IP是192.168.10.100,air的局域网固定IP是192.168.10.199

注意如果局域网IP不是固定的,建议先到路由器中设置静态IP分配。

首先配置air主机。先将公钥添加到authorized_keys中

cd ~/.ssh
cat id_rsa.pub >> authorized_keys

然后到System Preferences – Sharing – Remote Login中,打开远程登录。这里可以看到提示,ssh igotit@192.168.10.199。

然后回到mini主机上,先将air的IP地址加到hosts中

sudo vim /etc/hosts

添加一行

192.168.10.199 air

保存退出,然后将air上的项目地址添加为远程库

cd ~/project
git remote add air air:~/project

然后配置一下ssh的config

vim ~/.ssh/config

添加上

Host air
Hostname air
User igotit
IdentityFile ~/.ssh/id_rsa

保存退出,然后就可以用

git fetch air

来从air主机上抓取分支,抓完后用

git branch -a

来查看一下,除了通常的remotes/origin,现在多了个remotes/air,将来合并代码时,注意要将远程分支写正确。

接下来,想要从air主机上git fetch mini,则只需要将上面的配置反向再来一遍就可以了。

至此实际上已经完成了配置。为了安全性,这里用ssh的公私钥来完成远程登录的验证,但其实如果要想简单,是可以直接用用户名和密码来访问的,不过我并不建议那样做。相反地,为了安全考虑,最好修改一下配置,强制用公私钥来完成ssh的验证,而禁用掉密码验证。同时,最好还要将ssh的端口作一下修改,不使用默认的22。

sudo vim /etc/sshd_config

将这几行设置一下:

ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

保存退出,验证就已经改为强制密钥验证了。

接下来修改默认端口

sudo vim /etc/services

找到ssh这两行

ssh              22/udp     # SSH Remote Login Protocol
ssh              22/tcp     # SSH Remote Login Protocol

在下面添加

ssh2              12345/udp
ssh2              12345/tcp

端口可以自己选一个合适的,但注意不要和系统其它服务的端口冲突。

继续修改

sudo vim /System/Library/LaunchDaemons/ssh.plist

找到

<key>SockServiceName</key>
<string>ssh</string>

修改为

<key>SockServiceName</key>
<string>ssh2</string>

改完端口,还要把另一台机器的~/.ssh/config更新一下,在Hostname行下面添加上:

Port 12345

都设置好以后,回到System Preferences中先关闭再打开Remote Login,一切搞定。

上面所述均为Mac的配置,如果是Linux环境,有的地方配置可能会有区别,这里就不一一详述了。

Google Drive终于来了


昨天Google Drive如期而至,第一时间到它的主页提交了申请。很快,今天凌晨就收到了开通邮件。

其实关注Google的人,应该5年前甚至更早前,就不断地在听说关于Google Drive的各种传闻。我当年还用过一个叫GMail Drive Shell Extension的工具,它可以把GMail改造成一个网络硬盘,映射在“我的电脑”中,非常精彩。当时想象中的Google Drive,大概也就是这个样子。但这么多年过去了,真正的Google Drive会是怎样,始终还是没人知道。

没有Google Drive的这些年,网络存储市场风起云涌,网盘的概念也已经并不新鲜,甚至已经做烂。直到Dropbox横空出世,才真正又重新定义了云存储的基本概念。乔布斯一度想收购Dropbox未果,于是苹果的iCloud也加入了战场。而就在前天,微软也更新了自己的SkyDrive,以一种更加Dropbox-style的多平台桌面同步工具的方式参与竞争。

Google Drive是不是也就是这样一个简单的Dropbox knockoff呢?

安装完桌面端的应用后,第一感觉的确这就是一个速度飞快、空间只有5GB、功能还不如Dropbox的同步工具。但真正了解了Google Drive的功能,并上手用了一天后,我觉得Google的目标远不止于此。

Google Drive其实是Google Docs的升级版,如今再打开后者的主页会跳转到前者。但与以前只能打开doc,xls,ppt,pdf等文件不同,现在的Google Drive在此基础上开放了api,给第三方应用打开了门路。访问Chrome Web Store里的这个页面,可以看到已经有一系列的第三方应用提供了各种文件的浏览及编辑支持,比如照片、视频、思维导图、Balsamiq Mockups等等。

也就是说,Google Drive其实是在给基于Web的应用提供文件存储的基础架构。在一个充分网络化的环境下,当操作各种文件的应用都不再是装在本地的桌面软件,而是在线的应用时,你其实根本不需要再将文件同步到桌面,然后用桌面软件去打开、编辑、保存,将来这些操作全部可以在浏览器里进行。不论你在哪一家公司的在线应用里编辑哪种格式的文件,最终都可以存储到Google Drive中来。

更重要的是分享将变得更为简单,协同编辑也将更加普遍。以后你不再需要和老板在往复的Email中附上不同版本的文档作为附件,而只需要附上一份在线文档的链接,所有的修改、点评、对比都能集中进行,并且可以实时同步编辑同步更新。

所以Google Drive远不是一个Dropbox knockoff,而更是一个潜在的网络基础设施。跳出传统的桌面环境思维,它与其它“网盘”的区别顿时清晰可见。

同步后的Google Drive文件夹里原来的在线文档被命名为.gdoc,表格则是.gsheet。如果你双击它们,就会打开Chrome浏览器访问熟悉的Google Docs编辑页面。不过通过Chrome Web Store安装好Balsamiq Mockups应用后,在本地似乎还没有与.bmml文件关联,目前还只能通过网页里的文件列表来打开。但我想不久后的将来,各种文件格式就会通过Chrome来关联到在线应用了吧。

使用Uncrustify在Xcode中格式化Objective-C代码

Xcode是开发iOS应用和Mac OS应用的必备工具,但这个工具的辅助功能相对于Eclipse之类的IDE来说,还是比较少,在Eclipse里只要按Ctrl+Shift+F,就可以将Java代码格式化得非常好看。而在Xcode里,只有Re-Indent(Ctrl+I)这一个调整缩进的功能,显然不够用。

如果想要完成完备的代码格式化,得要借助Uncrustify这样的工具。更进一步,我们用Automate配置一个针对Text的Service,再加上快捷键,就可以在Xcode里间接实现和Eclipse同样效果的代码格式化功能了。

首先安装Uncrustify工具。安装的方法很多,推荐用Homebrew来安装。如果机器上没有Homebrew,先用这条命令安装:

/usr/bin/ruby -e "$(curl -fksSL http://u.aodaren.com/homebrew)"

安装好Homebrew后,用这条命令安装Uncrustify:

brew install uncrustify

详细的Automate配置步骤可以参考这篇文章,如果不想自己配置,也可以直接下载已经配置好的workflow包,复制到~/Library/Services/,并解压就可以了:

mv Uncrustify-Objective-C.workflow.tar.gz ~/Library/Services/
cd ~/Library/Services/
tar zxvf Uncrustify-Objective-C.workflow.tar.gz

下载针对Objective-C语言的Uncrustify配置文件,移动到 ~/ 目录,并更名为 .uncrustify_obj_c.cfg,注意目标文件名前面有个 .:

mv uncrustify_obj_c.txt ~/.uncrustify_obj_c.cfg

如果上面已经顺利完成,那么现在到Xcode里选中一段代码,点右键,在Services里面应该已经有一个Uncrustify Objective-C服务了。选择后,即可将代码格式化。当然,如果每次都点鼠标显然太麻烦,下面来配置快捷键。

点屏幕左上角的苹果图标,选 System Preferences – Keyboard – Keyboard Shortcuts – Services,在Text分区里,找到刚添加的服务Uncrustify Objective-C,给这个服务加上快捷键。注意不要和Xcode里其它快捷键冲突,推荐设置为:Opt+Cmd+字母O。

这样以后在Xcode里,先用Cmd+A全选代码,再用Opt+Cmd+O来格式化代码。整个效果和Eclipse基本上差不多。

最后,如果对格式有不同的需求,还可以修改cfg文件里的设置,每个选项都有详细的说明,这里就不再赘述了。