Blog

  • Something to talk on iPhone and Android

    猛禽写了一篇关于iPhone和Android的开放问题的文章。我虽然近来难得看妓术技术文章,不过猛禽这篇我还是看了一遍。随便说说我的想法吧。

    我最早接触电脑是用的Apple II,高中的时候在上面编程玩,编了一个图书馆的管理程序,用的是文本数据库,Basic语言。这个程序当年还获得了省二等奖。顺便说一句,当时用的中文系统是一个盗版的……

    在我看来,一个产品的成功(或者不成功)的原因很多,绝对不能简单的用操作系统、硬件、SDK的开放与否中的任意一个来解释,还必须加上特性、市场、用户群、应用等等方面。

    ===========

    硬件的发展总是超出软件的发展。这有点像数学和物理的关系:数学中的矩阵运算应用到物理(确切地说是量子力学)中是很后期的事情,而且现在还有一个数学理论——数论——在物理中没也有找到应用的范畴。但是,在一般概念中,硬件的开发要比软件难的多,门槛也高的多。所以,一旦硬件平台成为标准,它大可以封闭起来。

    这里顺大便BS一下猛禽,在486年代,TI也还是出过CPU的,只是后来才专心做其它的专业芯片(比如投影机中的DLP芯片)。

    软件的开发平台很难统一。从某种经典的理论来说,既然允许多样性,那么开放/不开放都有道理。用苹果的模式去强套谷歌没用,用谷歌的模式去强套苹果也不行。

    =========

    苹果到底是成功了的。猛禽说的对:

    并不是因为它不开放而成功,而是因为在过去几年直到现在,水果在技术和创意上一直遥遥领先于竞争对手。这一点为它带来了大量的用户,而足够多的用户才能吸引到足够多的开发者,开发出更多的应用则使它的领先优势进一步扩大,如此正反馈循环推动水果从成功 走向更加成功。

    但是,千万不要忘记苹果在市场把握上的敏锐和独到。在我看来,苹果推出App Store才是iPhone最终横扫的重要原因。

    从最终用户来看,在App Store上可以自由下载免费和收费不那么离谱的应用,从而十分个性化的定制自己的手机。在一个统一的外表下,蕴藏着无穷多的变异……在这个意义上说,每台iPhone都是独一无二的。

    从开发者角度看,他们的工作终于可以得到“普遍”的承认了。即使没有真金白银的收入,也可以看到自己的程序下载量,知道这世界上有那么多人在用我的东西。更何况,还可以梦想日进斗金。

    苹果敏锐的捕捉到了这个切入点:手机应用在起步阶段,需要有一个centralized的地方让大家来获得应用。这个地方不应该是ISP,不应该是Dwonload.com,更不应该是零零碎碎散布在全球N个站点上。作为iPhone的硬件和操作系统的制造者,Apple才是最合适、最合理、最自然的做这件事情的人。

    我之前用过WM手机和Symbian手机,但是从来没有认真装过什么第三方应用。倒是在我最早使用Palm的时候,还装过一些软件——主要是因为Palm软件的破解非常容易……更不要说去开发软件了……

    从我个人而言,我比较喜欢Android的开发环境(无论是IDE还是SDK还是编程语言)。我个人是C/C++出身,对Java有天生的亲近。

  • 老彼得三下的第一张奖状

    老彼得今天捧回一张奖状,是校“阅读之星”。根据我这里不完全的统计,他在1-2月份的寒假期间看了不少的书呢。

    每次我在他的读书成长手册上都会写上几乎同样的一句话: 多读书,读好书!

  • Google Nexus One手机使用感受——综合篇

    一个产品,可以如何改变我的生活呢?

    之前的我,一直对这个问题持否定的态度:一个产品对我而言,只是一个产品,我找到它的功能,然后在需要用的时候用其中的某个(些)功能。我从来没有想过这样的一种可能性:

    一个产品以其本身的特性、功能修改了我工作、生活的方式。任何这样的产品,都会被我称为“革命性”(Revolutionary)的。

    我很愿意将Google Android Phone(特别的,是指我现在所使用的Nexus One)称为“革命性”的。

    如今有了N1,我的工作方式有了很大的一些不同。

    每天我都要花费将近两个小时在路上去上班或者回家。这两个小时原本是我脱离网络的时刻。回到家后,我也很少打开我的笔记本。现在不一样了。

    和前令狐就Android的使用进行了一番简短的讨论,得出的结论是,我和他使用Android手机的模式不完全一样,或者说完全不一样。

    在我的应用模式中,一切还是以公司的Outlook为主。我通过Android收取我们公司Exchange的邮件,同步联系人,并通过一个Google官方桌面应用来同步我的Outlook日历和Google Calendar。这样一来,所谓PIM应用中的三大件:邮件、联系人、行程都可以统一了起来。这个对我是至关重要的。

    在我的老板、老板的老板都“以身作则”的随时随地收发邮件的前提下,我也似乎必须做到这点。当你能在晚上10点甚至11点的时候回复邮件的时候,这表明了一种姿态,一种“我随时随地都在工作”的姿态。

    打电话也是日常最重要的事情之一。所以,我需要一个很好的Dialer(或者Contacts)程序。在前令狐的推荐下,我使用了“智能拨号”这个国产软件。虽然还不是尽如人意——甚至我开玩笑说准备自己开发一个——但是我已经满足了。迅速找到我要找的联系人,然后拨出号码,是必须的。而我的工作环境决定了我会同时有纯中文联系人和纯英文联系人这两种情形。

    在别的时候,我更多的是浏览新闻和BT群聊天室。在众多程序的帮助下,我能轻易做到这点。我在这样的情形下不追求完备,只追求及时。

    N1的出现,确实改变了我的工作、娱乐方式。

  • Google Nexus One手机使用感受——软件篇

    应观众要求,先放一张王道:

    N1上我没有装太多的软件。更多的时候还是用内置的软件。以下我仅根据我的使用感受对系统软件和我安装的软件做个简单的介绍。所有的外装程序都是免费的。

    Name: 1 SHOT APPLAUSE
    http://market.android.com/search?q=pname:com.nnsw.app.nApplause

    这个是一个Widget,在桌面有一个小图标,按下它就会发出一段掌声。纯粹是娱乐用的。

    Name: 3banana
    http://market.android.com/search?q=pname:com.threebanana.notes

    这个软件值得推荐。从本质上说,它是个便条软件。它可以记录下你写这个便条的GPS位置,同时也可以让你附加一张照片。你还可以用Google帐号登录它的Snaptic服务,将你的便条和大家分享,还可以推一条信息到Twitter(或者类似的客户端)去,让你的好友第一时间浏览。

    Name: Advanced Task Killer Free
    http://market.android.com/search?q=pname:com.rechild.advancedtaskkiller

    这个强烈推荐。应该是必装的软件。顾名思义,就是用来杀掉Android进程的东西。

    Name: aPlayer
    http://market.android.com/search?q=pname:com.android123.aPlayer

    这个是我现在用的视频播放。界面比较简单,够用。

    Name: App to QR
    http://market.android.com/search?q=pname:com.javielinux.apptoqr

    这个软件用来导出你的机器上装了什么软件。用来装反d或者分享给好友是不错的。

    Name: ASTRO
    http://market.android.com/search?q=pname:com.metago.astro

    这个是Android上的文件管理器,推荐安装。

    Name: BBC News
    http://market.android.com/search?q=pname:net.jimblackler.newswidget

    我用来看BBC新闻。

    Name: Bell Widget
    http://market.android.com/search?q=pname:com.appspot.swisscodemonkeys.bellwidget

    这个也是个桌面Widget,按下后会发出清脆的“叮”的一声。纯属娱乐。

    Name: Bible Verses
    http://market.android.com/search?q=pname:com.rm.android.bible

    每次随机给出一段圣经里的内容。

    Name: Bubble
    http://market.android.com/search?q=pname:bz.ktk.bubble

    这个用来测试墙面、桌面是否水平。蛮有意思的一个小程序。

    Name: Chess
    http://market.android.com/search?q=pname:jwtc.android.chess
    Name: Chess Mate Practice
    http://market.android.com/search?q=pname:jwtc.android.chess.matepractice

    这两个程序是我用来闲着的时候下国际象棋用的。

    Name: Compass
    http://market.android.com/search?q=pname:com.apksoftware.compass

    这是个罗盘程序。用来找方向还是不错的。

    Name: ConnectBot
    http://market.android.com/search?q=pname:org.connectbot

    这个是Android上的SSH软件。不过说实话没有什么用,因为屏幕太小,也不支持屏幕转动同时需要在本程序主界面中设置一下才能支持转屏(谢谢harry的指正)。我用来测试我家里的网络是不是通而已。

    Name: DailyStrip
    http://market.android.com/search?q=pname:com.fusetree.android.dailyStrip

    我用这个看Dilbert的漫画。

    Name: Dialer One
    http://market.android.com/search?q=pname:kz.mek.DialerOne

    几乎可以用来替换内置Dialer和Contacts程序的程序。如果能加强中文的T9搜索会更了不起。

    Name: Documents To Go
    http://market.android.com/search?q=pname:com.dataviz.docstogo

    免费版可以用来看Word和Excel文件(支持Office 2007)。付费版可以看PowerPoint和PDF。

    Name: fring
    http://market.android.com/search?q=pname:com.fring

    我用它连接我的MSN和Skype。

    Name: Quickpedia
    http://market.android.com/search?q=pname:com.nextmobileweb.quickpedia

    这个软件被downlod.com推荐。但是download.com似乎忘记了,Wikipedia大量使用SVG作为图片资源,而Android是不支持SVG的……

    Name: Sokoban
    http://market.android.com/search?q=pname:com.google.android.sokoban

    小游戏。闲的蛋疼的时候玩玩。

    Name: Tulip Reader
    http://market.android.com/search?q=pname:com.nvp2.treader

    相比iReader,它对PDB文件的支持似乎略好一些。

    Name: Twidroid
    http://market.android.com/search?q=pname:com.twidroid

    这个就不用说了,用来上Twitter或者我们的BT群聊天室。它支持所有支持Twitter API的服务器,比如基于Status.net的服务。

    Name: WordPress
    http://market.android.com/search?q=pname:org.wordpress.android

    可以用来在手机上写博客。顺便推荐一个WordPress插件WP2Laconica。在你的WP后台激活该插件后,你每次发布一个博客,就会同时推一条信息到你配置的Laconica服务中去。

    Name: 南周阅读器
    http://market.android.com/search?q=pname:net.coollet.infzmreader

    看看《南方周末》吧……

    Name: 手机电视
    http://market.android.com/search?q=pname:dopool.player

    可以看一些电视频道,而且大部分是我这里的收费以及缴费也看不到的节目!建议用Wi-Fi看,不要用GPRS……

    Name: 搜狗输入法
    http://market.android.com/search?q=pname:com.sohu.inputmethod.sogou

    装机必备。我没有用谷歌输入法,是因为我桌面机也用搜狗,这样我可以同步我的词库。

    Name: 条码扫描器
    http://market.android.com/search?q=pname:com.google.zxing.client.android

    这个可以推荐一下。它搜索书籍信息时是很准确的。

    大概就是这么些了。实在惭愧……

  • Google Nexus One手机使用感受——硬件篇

    2月26日入手的Google Nexus One,到今天也差不多玩了10天了。写点感受,供对N1有兴趣、没兴趣的诸位做个借鉴。

    外形

    应该说,N1的外形设计比较中规中矩。也许是因为之前在网络上照片已经看多了,等我拿到手的时候,不觉得有什么出奇的地方。

    使用了这些时间后,感觉如下。

    Track Ball(轨迹球):

    • 那个Track Ball除了在提示有来电、有短信的时候发出的那幽幽白光还算有点作用之外,其余的绝大部分时候,它就是个摆设。
    • 首先,没有什么软件被定义为“必须使用轨迹球”操作;
    • 其次,这个轨迹球的操控性非常差。我只是轻轻往下一转,想看看列表中往后的内容,结果就莫名其妙的退出了界面,回到之前的界面去了。
    • 这个应该不是轨迹球接触时行程太小的缘故。如果你确实非常小心的玩那个球——呃——那么你会注意到滚动和按下的这两个动作区别还是很大的,而且按下的行程相当长。

    四个导航按钮:

    • “返回”、“菜单”、“主界面”、“查找”这四个导航按钮一直是Android手机的一个特色。我个人认为这样的设置还是很有想法的。
    • N1也承认,由于设计上的原因,那个“返回”按钮可能不怎么容易按到。不过实际应用中,问题还不止如此。几乎所有的导航按钮都很难按到,没有那种“我按下按钮,你执行命令”的感觉。
    • 我使用的是搜狗中文输入。在竖屏、使用T9输入法输入汉字时——包括在输入英文时、切换中英文输入时、切换键盘以准备输入标点、纯数字时——都会很容易误触到“主界面”按钮。这个当然和我的手指比较粗大有一定的关系,不过N1的设计者确实应该仔细考虑考虑一下这个布局了。我不会设计,不过我还是画张草图示意一下。

    从左边这张示意图,大概可以看到在输入中文时:

    1. 左侧的常用标点符号的“自然”接触点和“返回”按钮的“自然”接触点几乎在同一直线上。我画的还不够好。在实际上,那个“?”和下面返回按钮的图形确实在一个垂直线上。我这里说的“自然”接触点是说你看到这个键后最自然而然会接触的那个位置。

    2. “符号”键盘切换键和菜单按钮、“拼音/英文”切换按钮和主菜单按钮以及搜索按钮也有一点垂直线重合问题。

    音量调节按钮N1的音量调节按钮在机身左侧靠上的位置。问题来了: 在充电时,机身下方是USB充电插口,所以基本上是有个小尾巴拖在那里。我没有用过Deck,但是想来情形差不多。也就是说,在这样的情况下,要拿起手机的时候,从下往上拿、或者说拿机器的下半部是不怎么自然的。反正我的习惯是从机器的上半部去把手机拎起来。这样的话,要么我的大拇指、要么我的中指/无名指(这取决于我拎N1的时候手的方向)就会触碰到那个音量按钮中的一个——我个人的体验是那个“音量减”的按钮会被误碰的几率大一些。

    我个人认为这是由于音量加减按钮过于灵敏、键程过短造成的问题。

    听话话筒

    这个听话话筒在机身正面几乎最顶端,只有那么华丽的一小条……在听话时,我发现总是很难把那一小条对准我的耳朵。所以常常听不见别人在说什么,要上上下下左右左右的调节一番,才会找到最合适的接听位置。

    照相机

    N1的照相机有500万像素。但是从实际拍摄来看,效果很一般,笑点很奇怪。我就不放样张上来了。

    其它

    由于N1的CPU主频高达1G,所以速度是有保证的。在播放视频、收看在线电视的时候,确实能体现出其强劲。

    N1对Wi-Fi的支持应该说比较强大。不过据一位朋友反映,N1对AP的信道号有特殊的“爱好”,有可能会出现11信道下的AP无法被N1扫描到的情况。解决方法也很简单,重设AP的无线信道号为9或者其它即可。另外,N1在Wi-Fi连接时默认WEP加密使用的是26位HEX字符,可以调整,不过不怎么直观。

    N1待机时间确实很短。在一般的“网络”应用下——不是那种大强度的多媒体应用——我基本上要每天充它一次。

    N1来电铃声比较轻,别说在大街上,就是在稍微嘈杂一些的室内或者在衣兜里都有可能听不见铃声。强烈建议,如果你不想错过来自老板、来自MM/GG的电话,请设置响铃时同时震动。

    音乐回放音质基本可以满意。用我的JBL Reference 410进行了一些试听,总体感觉失真较小,但是也谈不上有什么特别的。这当然不是耳机的问题。对于这样一个本身就不该被作为MP3的手机来说,有这样的回放效果我已经可以接受了。

    屏幕效果非常好。字体选择优秀,感觉应该是微软雅黑……哈哈!触控、多点触控效果流畅。虽然有iPhone的使用者看过后说“好像亮度不够”,不过我以“我没有调到最高亮度”进行了回击——确实也是没有调到最高亮度。 今天的感受主要集中在硬件部分。下次再放软件部分的使用感受。

  • 老彼得背书

    老彼得今天晚上要背书,要背的内容是第二课的2、3自然段。不知怎的,他好像突然卡壳了——要知道,他平时可是从来不惧怕背书的。

    眼看已经9点过了,我要他休息,明天早上起来背书。他哭了起来,抽噎着说明天早上来不及了。我跟他讲了很多道理:现在是休息时间了,大脑开始休息,这样背书效果不会好;明天早上起来,趁脑子清醒的时候,可以背……他还是不buy我的story。

    我突然有点感动,感动他对学习的执着和认真,所以和他约定再晚不超过9点半。到时背出来就背出来了,背不出来就明天背。于是他才停止了抽泣,回到自己的书房开始认真的看书。

    到了9点20分左右,他回来了。这次他可以比较流利的背出来了。我对他说:“如果要评分的话呢,可以打85分。我们明天再试。”

    看得出他还是不怎么爽,不过实在是太困了。他也只能接受我的建议,刷牙洗脸上床睡觉去了。

    等他上了床,我对他说:“爸爸以前背书没有你好。不过我有一个方法。就是在将睡未睡,迷迷糊糊的时候,把要背的东西再在脑子里过一遍。这样保证第二天起来不会忘记,而且几乎永远不会忘记。”他很惊讶的问我这是真的吗,我说是的。他终于安心睡觉去了……

  • 在MySQL中按照当地时间的时段、星期几统计

    缘起

    BT群创建了一个基于status.net的话痨群。我一时手痒,做了个后台,进行一个基本的统计。比如:一天24个时段中每个时段的话痨数量、一周7天中每天的话痨数量等。

    这些统计都是要用到基于时间的统计。

    我先看了一下后台数据库,我们所使用的这个服务程序将“话痨”贴存放在notice表格中,用字段created来记录。不过它记录的是GMT时间(或者说UTC)时间。这个时间和北京时间存在着8个小时的时差,会造成时段统计的偏移和周内统计的偏移。例如,我在20号上午7点发的话痨,会被储存为19号23时发布的。

    一开始,我是用调整服务程序的时区来解决的。虽然在部分程度上解决了“本站点”的问题,但是造成了其他各位BT使用的客户端无法正确获得时间的问题。这个后果是严重的。

    解决方案

    解决方案只能从MySQL里面去找。通过查阅MySQL参考手册,发现了这么个函数:

    CONVERT_TZ(dt,from_tz,to_tz)

    通过这个函数就可以将一个时区的时间转换到另外一个时间。于是,相应的按照时段统计的SQL语句就是:

    select count(*) nc, hour(convert_tz(created, '$stz','$etz' )) dh from notice group by dh

    其中的$stz和$etz是两个时区的时间偏移。在本程序中,用的是\’+00:00\’和\’+08:00\’。 经过调试,成功!

    题外话

    在CodeIgniter中,如果使用内置的helper函数来生成SQL语句,那么会不成功。提示生成的SQL有错误,或者是找不到\’+00:00\’这个字段。解决方法是,改写model中的查询过程为:

    public function getNoticeCountHour()
    {
        $stz='+00:00';
        $etz='+08:00';
        $selectsql=select count(*) nc, hour(convert_tz(created, '$stz','$etz' )) dh from notice group by dh;
        //下面的代码无法执行
        //$this->db->select(count( *  ) nc, hour(convert_tz(created, '$stz','$etz' ) ) dh);
        //$this->db->group_by('dh');
        //$q=$this->db->get('notice');
        return $this->db->query($selectsql)->result();
    }

    这个应该是CodeIgniter的问题。暂时没有时间去搞了。

    另外,根据MySQL的文档,使用了convert_tz函数后,这个查询将不能被缓存,会影响执行效率。

  • 用Nexus One来写WordPress的博客

    刚入手的N1,于是自然而然开始试用各类软件。这篇文章就是用Wordpress for Android写的。还行!

    只是它和WP2Laconica插件不兼容。如果选择在Wordpress for Android中“Publish”的话,会crash这个软件。但是post已经成功发布,只是由WP2Laconic创建的uri会不完整,而push到我的话痨站点的推也会不完整。

    已经向WP官方报告了这个问题。

    我个人认为,这个问题不算太大——毕竟用手机写博客很累,而如果真有这样的情况,先放一个draft上去也是不错的做法。

  • 天堂可有猫的乐园?

    首先感谢BT群的各位BT,在第一时间知道老猫走了之后,都表示了深刻的哀恸和怀念。谢谢你们。

    我是昨天晚上才知道老猫不行了的。我确实很粗心。老猫在春节前就开始急剧消瘦,我一直没有当回事,一直以为他是因为天气太冷不肯吃东西。前两天一直没有看到他,也没有在意,因为他也有过出走的经历。直到昨天晚上,太子才问我,老猫怎么回事?外婆才告诉我,老猫一直躺在他平日根本不屑一顾的猫笼里,一动不动了两天了。我看到他的时候,直觉已经告诉我,他不行了。我于是将他移到一条毯子上,让他能稍微舒服一些。他大概是用尽了最后的力气对我嚎了几声——我知道他是想“喵”几声的,我也愿意相信他是在谢谢我。

    今天凌晨大概3、4点的时候,老猫托梦给我了。我梦见瘦瘦的他钻进了那条毯子里,等我打开毯子一看,却发现一只同样有着黄白相间花纹但却壮实无比的大猫。我当时还没有意识到这是个梦,心里还是欢欣了一阵。等我意识到那不过是个梦的时候,我知道老猫已经走了。

    早上6点起来我去看他。是的,他已经走了。我在猫笼前放了一碟清水,一点猫粮,算是对他的祭奠。

    ======

    到了公司后,在群里第一时间公布了这个消息。大家也都很伤感。毕竟,他参与了几乎所有的BT群苏州聚会活动,和MK/JJ/小炒有着良好的互动。BT群的成员们也已经习惯将他视作BT群的一员,并亲切的称他为“BH的老猫”。

    如今,BH的老猫走了,不再能被我或者太子拎着颈皮了,不再能被我或者太子摩挲着而发出满足的“咕噜咕噜”声了……

    他陪伴着我有三年,寿命也只有三年。这样的年龄即使是对于猫来说,也是太短了。我曾经无数次设想过,他应该至少能陪我到我50岁的样子。到那时,我也老了,他也老的走不动路了,会“更乖”了。如今,这些都只是美好的空想罢了。

    也许,我应该听肾后的话:将他放归野外,也许他会生活的更好。谁知道呢?但是至少有一点,我不会像如今这么难过,看着他僵硬的身体躺在毯子里,就这样在我眼前。

    =========

    下午早早的赶回家,和太子一起在小区的一棵树下挖了一个坑,将老猫埋葬了,还在坑里撒了一些猫粮。 三年前,我写过一篇《老猫七德》,其中写道:

    猫龄约有十余年,今之老猫尚属婴幼儿时期,则其伴吾将有年矣。待其老去,吾将不再蓄猫,因为“我怎么舍得再见你呢”?

    是的,我将不再蓄猫。因为我真的不忍再见你。

    MK安慰我说:

    你可以看作老猫帮你们家挡掉了一次血光之灾,算作是猫的报恩——日本人就是这样认为的

    我查了一下Google,这个叫做“猫の恩返し”。如果这的是这样,那么是我要感谢老猫。不管是什么灾难,都由他挡掉了。谢谢你。也正因如此,我更不愿意再蓄猫。 让我再次用我已经引用的聂鲁达的诗句作为结尾,作为对老猫的怀念和感谢:

    让我藉着你的沉默与你说话 仿佛你消失了一样 遥远而哀伤 仿佛你已经不在 彼时 一个字 一个微笑 已经足够

  • CI做了一个简单的后台

    昨天用CodeIgniter随手开发了一个BT群的统计后台。从下载到初步跑起来——我原来只用过Symfony,从来没有用过CI——用了差不多1个小时。还算是很快的。

    CI的设置比Symfony简单多了,一个包压缩到你想作为WEB根目录的目录下就可以了。这对轻量级、快速开发而言是非常实用的。

    它的M/V/C架构也很清晰。

    在C的层次,虽然可以使用route来配置pretty uri,但是你不用的话也可以很“自然”的在各个controller里飞快的搭建各种路径;在V的层次,我目前的实践还没有用到嵌套模板、子模板,相信是有的。不过貌似在V中,对CSS连接路径的判断有些不直观,有待继续验证;在M层次,比Symfony简单多了,它基本舍弃了OO方式,而只是提供了一种方法来让用户定义一些M中的方法而返回数据集,然后再经由C传递到V中进行渲染。

    我对CI的应用目前就到此为止。等有了新的体会再共享吧……