GAE近期墙的紧,为了绑定上域名无奈搬回了yo2~

找工作临近了,简历撰写中~

2011年4月29日 惊羽九天 没有评论

时间总是在不经意间悄悄的流走,各大公司都开始实习生招聘了,我的简历却还在酝酿之中。

突然发现针对在校生举办的各类软件相关比赛相当的多,面对如此海量的锻炼机会,之前的自己一直都做什么去了呢?果然还是没法独立自主去干,需要同伴么?还真是不够坚强啊。已经报名参加了华为的编程大赛,腾讯的校园之星还没想到合适的idea,花旗银行那个需要业内人士暂时搁浅,迈瑞杯创新设计大赛正在策划中。为了避免夏天的消极懈怠情绪,这必须得自己给自己施加压力啊。

关于未来的工作,还是决定留在成都了。按照自己的能力及兴趣,基本上就是进软件行业。很多朋友都建议我应该出去闯一闯,不过不管是从自己的性格,或是父母的想法,都是不想出川的。在成都虽说机遇会少很多,只要肯干,一定也是能做好的。

近期尝试着依据GTD的方法安排各种行动,恶补了Effective C++,More Effective C++和Effective STL三本书,才发现以前所了解的C++简直连皮毛都算不上,C++和Java/C#不一样的地方真的太多太多,也终于明白为什么前辈们都说做Java的没技术含量了。这三本都是神作,要用到C++的代码民工们必读啊。现在在图书馆借书都要看豆瓣评论了,有人说,读一本烂书等于浪费了两次阅读的时间,如果可能,别把时间浪费在鉴别书的好坏上。预约才是图书馆系统里最珍贵的功能啊。

随便记几笔,然后码简历了~

分类: 杂言碎语 标签:

关于 AddinTimer 系列文章的声明

2011年4月12日 惊羽九天 没有评论

收到 AddinTimer 作者发来的声明邮件,因此破解相关三篇文章现已作加密处理。寻求破解者请绕道而行。

分类: 杂言碎语 标签:

已保护:AddinTimer for Android 一键升级制作

2011年3月28日 惊羽九天 输入密码以查看评论。

这篇日志已被密码保护。请在这里输入密码:


已保护:AddinTimer for Android 网络验证破解

2011年2月27日 惊羽九天 输入密码以查看评论。

这篇日志已被密码保护。请在这里输入密码:


已保护:AddinTimer for Android 注册算法分析

2011年2月21日 惊羽九天 输入密码以查看评论。

这篇日志已被密码保护。请在这里输入密码:


FileObserver 研究及其递归监瑞脑消金兽听初步实现

2011年1月21日 惊羽九天 2 条评论

前面惯例有废话出现,若无兴趣可直接跳到正文处。

前段时间做如数家珍这个 Android 应用的时候,为了保证软件数据库和SD卡上的实际文件系统同步,需要监瑞脑消金兽听SD卡上的文件变化。苦于不熟悉 linux 机制,埋头想了许多办法,Google 数次无果,最后无奈选用了一个笨方法:检测SD卡剩余空间是否有变动,若有变动表明数据库过期,下次进入软件进行全盘扫描。这个方式明显是非常不精确的,但是也有其独特的优点,检测过程消耗小且不占用系统资源;致命伤是若有变动只能依靠全盘扫描来寻找改动。目前我的 SD 卡文件数已达到 4000+,全盘扫描这个过程还是要消耗数秒,对一个主打实时搜索的软件来说无疑是致命的。

这个问题长期以来一直挂在心里放不下,经过旷日持久的搜索关键词大战,终于在 linux 系统发现了线索,inotify这个库可以监瑞脑消金兽听文件系统的改动。于是大喜,想查查怎么通过 JNI 在 Android 里实现这个功能,意外发现 Android 自从 API Level1 就已经有了 FileObserver 这个类了,位于 android.os 包中,基于 linux 的 inotify 实现监瑞脑消金兽听文件系统操作,包括访问、创建、修改、删除、移动、关闭等操作。

FileObserver 这个类很少有资料提到,doc 里也没有过多的提及,要命的是其 doc 内容是还是错误的,当然这是后话。FileObserver 是个抽象类,必须继承并重写 onEvent 事件处理方法。

Each FileObserver instance monitors a single file or directory. If a directory is monitored, events will be triggered for all files and subdirectories (recursively) inside the monitored directory.

每个 FileObserver 对象监瑞脑消金兽听一个单独的文件或者目录,如果监视的是一个目录,那么此目录下所有的文件的改变都会触发监瑞脑消金兽听的事件。为什么要把英文原文贴上来,因为 doc 里明确写出了 recursively,但是经过测试并不支持递归,对于监瑞脑消金兽听目录的子目录中的文件改动,FileObserver 对象是无法收到事件回调的,不仅这样,监瑞脑消金兽听目录的子目录本身的变动也收不到事件回调。大概调查了一下,这是由 linux 的 inotify 机制本身决定的,基于 inotify 实现的 FileObserver 自然也不支持递归监瑞脑消金兽听。

为了监瑞脑消金兽听整个文件系统的变化,必须得实现这个递归监瑞脑消金兽听,怎么办呢?先查查大家是怎么用 inotify 实现递归监瑞脑消金兽听的,搜索结果说明了一切,对每个子目录递归的调用 inotify,也就是说在 Android 中,也得通过遍历目录树,建立一系列 FileObserver 对象来实现这个功能,很笨吧。本来很担心这样做对系统的效率影响极大,但是大家都是这么实现的,我也本着实践出真知的原则,写下了如下的 RecursiveFileObserver 类:

package com.toraleap.testprj;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import android.os.FileObserver;
import android.util.Log;

/**
* Enhanced FileObserver to support recursive directory monitoring basically.
* @author uestc.Mobius
* @version 2011.0121
*/
public class RecursiveFileObserver extends FileObserver
{
    /** Only modification events */
    public static int CHANGES_ONLY = CREATE | DELETE | CLOSE_WRITE | MOVE_SELF
        | MOVED_FROM | MOVED_TO;

    List mObservers;
    String mPath;
    int mMask;

    public RecursiveFileObserver(String path)
    {
        this(path, ALL_EVENTS);
    }

    public RecursiveFileObserver(String path, int mask)
    {
        super(path, mask);
        mPath = path;
        mMask = mask;
    }

    @Override public void startWatching()
    {
        if (mObservers != null)
            return ;

        mObservers = new ArrayList();
        Stack stack = new Stack();
        stack.push(mPath);

        while (!stack.isEmpty())
        {
            String parent = stack.pop();
            mObservers.add(new SingleFileObserver(parent, mMask));
            File path = new File(parent);
            File[]files = path.listFiles();
            if (null == files)
                continue;
            for (File f: files)
            {
                if (f.isDirectory() && !f.getName().equals(".") && !f.getName()
                    .equals(".."))
                {
                    stack.push(f.getPath());
                }
            }
        }

        for (SingleFileObserver sfo: mObservers)
        {
            sfo.startWatching();
        }
    }

    @Override public void stopWatching()
    {
        if (mObservers == null)
            return ;

        for (SingleFileObserver sfo: mObservers)
        {
            sfo.stopWatching();
        }
        mObservers.clear();
        mObservers = null;
    }

    @Override public void onEvent(int event, String path)
    {
        switch (event)
        {
            case FileObserver.ACCESS:
                Log.i("RecursiveFileObserver", "ACCESS: " + path);
                break;
            case FileObserver.ATTRIB:
                Log.i("RecursiveFileObserver", "ATTRIB: " + path);
                break;
            case FileObserver.CLOSE_NOWRITE:
                Log.i("RecursiveFileObserver", "CLOSE_NOWRITE: " + path);
                break;
            case FileObserver.CLOSE_WRITE:
                Log.i("RecursiveFileObserver", "CLOSE_WRITE: " + path);
                break;
            case FileObserver.CREATE:
                Log.i("RecursiveFileObserver", "CREATE: " + path);
                break;
            case FileObserver.DELETE:
                Log.i("RecursiveFileObserver", "DELETE: " + path);
                break;
            case FileObserver.DELETE_SELF:
                Log.i("RecursiveFileObserver", "DELETE_SELF: " + path);
                break;
            case FileObserver.MODIFY:
                Log.i("RecursiveFileObserver", "MODIFY: " + path);
                break;
            case FileObserver.MOVE_SELF:
                Log.i("RecursiveFileObserver", "MOVE_SELF: " + path);
                break;
            case FileObserver.MOVED_FROM:
                Log.i("RecursiveFileObserver", "MOVED_FROM: " + path);
                break;
            case FileObserver.MOVED_TO:
                Log.i("RecursiveFileObserver", "MOVED_TO: " + path);
                break;
            case FileObserver.OPEN:
                Log.i("RecursiveFileObserver", "OPEN: " + path);
                break;
            default:
                Log.i("RecursiveFileObserver", "DEFAULT(" + event + &quot ;) : " +
                    path);
                break;
        }
    }

    /**
     * Monitor single directory and dispatch all events to its parent, with full path.
     * @author uestc.Mobius
     * @version 2011.0121
     */
    class SingleFileObserver extends FileObserver
    {
        String mPath;

        public SingleFileObserver(String path)
        {
            this(path, ALL_EVENTS);
            mPath = path;
        }

        public SingleFileObserver(String path, int mask)
        {
            super(path, mask);
            mPath = path;
        }

        @Override public void onEvent(int event, String path)
        {
            String newPath = mPath + "/" + path;
            RecursiveFileObserver.this.onEvent(event, newPath);
        }
    }
}

虽然 RecursiveFileObserver 类的行为是管理一系列子对象,其整体行为完全和 FileObserver 不同,为了保持用法尽量与 FileObserver 一致而采用了继承这个抽象类,其实如果可能,这里应该是实现接口的。FileObserver 类并没有在构造函数中进行耗费资源的操作,这里用继承还是可以接受的。新增加了一个掩码常数 CHANGES_ONLY,仅监控会导致文件系统发生变化的事件。m_path 和 m_mask 两个成员变量在父类是 private 访问权限,而不得不自己用两个成员变量保存构造函数中传入的这两个信息。

在 HTC Desire 实机上运行测试,递归搜索共监瑞脑消金兽听 898 个目录,也就是起初的遍历目录树很消耗时间,运行监瑞脑消金兽听过程基本感觉不到有附加延迟。这里为了测试方便没有把 onEvent 标记为抽象方法,实际使用方法和 FileObserver 相同,从 RecursiveFileObserver 类派生,重写 onEvent 方法即可。如果 RecursiveFileObserver 对象被垃圾回收了,将不再引发事件,因此必须保持对此对象的一个引用,通常是在成员变量中。onEvent 方法是在对象内的一个特别的线程上调用的,其中的代码得考虑同步的问题,并且不能抛出任何异常。

遗留问题:FileObserver 无法监瑞脑消金兽听目录的建立和删除操作,导致在监瑞脑消金兽听目录中创建的新目录无法被监控到,这还是一个很大的遗留问题,这一点等寻找到解决方案之后再作分解吧。

收到来自Google的移动硬盘和荣誉证书

2010年12月24日 惊羽九天 没有评论

下午去取顺丰快递,拿到了Google发来的移动硬盘和荣誉证书。正巧是圣诞前一天,还是相当惊喜的啊。硬盘是WD My Passport Essential 500G,算是我见识浅薄了,还不知道现在的2.5寸移动硬盘已经做得这么小了。说是Android硬盘,仅仅是上边贴有一张Android机器人图案的标贴,一点也不好看;另外还有一只绣有Google标志的布袋,大小也很贴合硬盘,这点还是很不错的。硬盘支持USB3.0,可惜笔记本电脑过时不给力,也暂时不打算入手USB3.0的转接卡,便是无福享用USB3.0的高速了。刚上网查过,这款硬盘现价大概是¥480的样子,Google出手还是比想象中的要大方啊,虽然没能拿到手机,也是很满足的了。

手机拍照,聚焦不准不清晰,就凑合着看了吧。

分类: 杂言碎语 标签: ,

Android 挑战赛结果公布,不出意料的优秀奖

2010年12月15日 惊羽九天 没有评论

虽然说看了公投作品列表,见识了那么多优秀的作品,已经不觉得有多少机会能够拿到一二三等奖了,但还是免不了要抱有那么一丝的期待。明知结果应该会在中午才发表,从早上醒来还是许多次的通过手机wifi查看大赛首页,等待最终结果的公布。

得优秀奖也基本是不出意料的事,比不上那些名列前茅的优秀作品还是有自知之明,不过要说垫底也不至于,对自己的作品还是有那么一点点小自信的。只是辜负了许多人的期待,这一点还是让人心里有一些不好受。嘛嘛,还是努力保持平常心态好了,毕竟也不能算是失败的,第一次正式的写Android软件嘛。

手机目前手上也有,包包同不是很需要,就是最近硬盘空间紧张了,还要为即将到来的1月新番扫清道路,这个时候要是能有个移动硬盘该多好啊!什么,奖品是个移动硬盘,真是太给力了!(自我安慰需要做到这种地步么=。=)

既然没人反馈意见,顺便按照自己的需求小小更新了一下软件,创建播放列表时可以不用输入名称了,留空将根据区域语言自动使用默认的名称创建播放列表。必须承认的是,现在更新确实没那么大的动力了,时间也不多不想大改,用着过得去就行了。

分类: 杂言碎语 标签: ,

Collimator / 如数家珍 v1.0.5 for Android 正式发布

2010年11月26日 惊羽九天 没有评论

本应用参加了Google举办的Android 应用开发中国大学生挑战赛,并在最后的评选中获得优秀奖,谢谢大家的支持!有什么建议和意见也可以在此提出,我们会持续改进的!

官方网站: http://cm.toraleap.com 或者 http://code.google.com/p/collimator/

最新版本

  • Collimator 1.0.5 (608KB) 点击下载 Build:110208
    • 现在首选项中可以设置仅对已知文件类型进行索引
    • 修正首选项中显示预览图和显示摘要无效的bug
    • 略微优化速度
  • Collimator 1.0.4 (608KB) Build:101215
    • 现在创建播放列表时,若未输入名称,将使用默认名称继续创建
    • 视频格式类型添加一项hlv
  • Collimator 1.0.3 (607KB) 点击下载 Build:101126
    • 增加简单的繁体中文支持(使用Google翻译)
    • 修正当文件修改时间在当前系统时间之后时,发生的显示错误
    • 修正帮助文件里部分范例关键词的链接问题
  • Collimator 1.0.2 (593KB) 点击下载 Build:101118
    • 默认排序方式更改为按修改日期降序
    • 由于PICK动作多数不能正确处理,暂时移除PICK动作的注册
    • 视频格式类型添加一项mkv
  • Collimator 1.0.1 (593KB) Build:101112
    • 修正删除文件时对话框信息显示错误的BUG
  • Collimator 1.0.0 (593KB) Build:101108 (大赛提交版本)

软件简介

极致的搜索速度、快捷的操作方式以及强大的处理功能——如数家珍就是集以上特点于一身的本地搜索软件。通过这款小巧精致的软件,用户可以轻松的从海量数据中找到需要的文件,并根据需要加以处理。

隐私声明

我们尽力保护您的隐私。为了实现软件功能,如数家珍"明确声明"会扫描您存储卡上的文件信息,但是您无需为此顾虑,软件没有发送短信或网络访问的权限,不会泄漏您的隐私,请放心使用。

运行截图

功能特色

机能越来越强,功能越来越多,这是智能手机带给我们的直观感受。只要你愿意,那就是一台mp3、游戏机亦或是掌上电脑。但与之而来的问题是,与强大功能伴生的海量数据,如何从中快速准确的找到自己需要的文件?

如数家珍便是基于以上问题设计出来的一款软件。让用户快速、准确、方便的找到需要的文件,这是我们的要求。让用户感到这款软件不可或缺,是我们的目的。如数家珍具有以下特性:

  • 飞快的搜索速度

基于索引方式的搜索,不需要搜索按钮,每一次键入都能即时获得匹配结果。多线程设计,保证用户使用的流畅度。智能模糊匹配,不用输入全部关键字,看到结果便可打住!

  • 便捷的首字母搜索

觉得汉字输入麻烦?现在只需要键入首字母就可搜索了,省心省力,方便快捷!此功能同时还支持日语平假名片假名。

  • 智能感知索引重建

用户不用担心文件索引数据库过期,软件可以设置为需要时智能在后台重载索引,此过程完全不需要用户干预。

  • 多种匹配条件支持

简单到通配符,复杂到正则表达式,还可以通过文件大小、日期、类型、父文件夹等多种条件进行匹配。

  • 同系统紧密集成

不但可以在系统全局搜索中调用此软件,包括GMail、彩信在内的众多应用,也可以由本软件来执行文件选取操作,轻松找到要发送的文件。

  • 灵活的结果处理

我们认为用户需要的不仅仅是查看搜索结果那么简单,我们为您提供了很多额外的结果处理方案。包括将文件创建为桌面快捷方式、将整个结果保存为播放列表等等,最大程度满足用户心中所想的需求。

  • 人性化的用户界面

主界面简洁明了,操作使用友好直观。默认启用对图片、音乐、视频文件的缩略图或封面预览,在摘要显示方式下更可以显示文本、应用程序、压缩文档的摘要说明,令操作更加得心应手,使用的过程赏心悦目。

应用范例

示例1:我喜欢用手机听音乐,我喜欢形形色色的音乐,总是看到新专辑就把它下到手机里好好欣赏一番。但有时候下了新的专辑,而卡上歌曲太多不好找,搞不好就放在那里被遗忘了。用如数家珍,就可以保证我无一忘记。只需在搜索时限定搜索范围为音乐,关键词指定平时存放音乐的文件夹,按修改时间降序排序,之后选择将搜索结果保存成播放列表。OK,这样就可以保证您可以把你新下的歌曲一个不漏的全听完啦。

示例2:今天去游玩,用手机拍了好些个照片,回来想一一欣赏,但又觉得找起来麻烦,怎么办?使用如数家珍,在搜索的时候,先限定搜索范围为图片,关键词限定日期是1天之内的(请使用这个关键词":1d",注意":"是必须的,表示一个时间表达式,具体可以参考帮助文档)。好了,看是不是今天拍的照片都显示出来了。之后只需将搜索结果建立一个快捷搜索。这样,每次您在桌面点开您建立的快捷搜索,当可以显示当日新拍的照片。

示例3:手机存储空间不够了,这是每个人都会遇到的事,怎么办?删!怎么删?优先从大文件开始删。如数家珍提供了限定文件大小的搜索机制,在搜索时限定关键词“>100m”,这样就会搜索出大于100兆的文件,方便用户删除。什么,你要全部删了?你只需点右上角按钮,对整个文件进行批量删除,是不是很方便啊(为了防止误操作,删除功能需要在首选项里启用才会生效)。

示例4:有一本不错的电子书想发送给朋友,还要一层一层的文件夹点进去找到,然后再发送么?没这个必要!打开GMail,添加附件,选择如数家珍,通过搜索快速找到要发送的附件,然后发送吧!当然也可以直接启动如数家珍进行搜索,然后在长按出现的操作列表中,选择发送到GMail,相当方便吧~如果是通过彩信发送图片也可以如此操作哦!

关于软件

我们衷心的希望用户在使用如数家珍的过程中感到方便和愉快。如果有问题和建议,欢迎使用邮件和我们联系。

  • 开发团队

Pastry Android开发团队,目前仅由两名研究生组成,如数家珍是团队的首个作品。

  • 软件首页

更多信息请参见 http://cm.toraleap.com

Android 挑战赛作品完成提交

2010年11月8日 惊羽九天 没有评论

在一小时前刚把整理好的作品源码,介绍,截图通过电子邮件发送给Google,虽然还是在担心会不会出什么差错,不管怎么说也是放松了一口气。决定参加这个比赛是在9月14日,全程经历了两个月左右的时间。其实,主要的时间消耗并不是在编码上边,光想应用程序的点子,就花了差不多一个月的时间,期间还做过另外两个创意的想法,不过最后要么就是在实践可行性环节遇到困难,要么就是实用性的问题,中途放弃了。不过在这里还是打算把这两个点子记录在这里,至少表示在上边思考过。

第一个计划的点子是做一个通过摄像头拍摄处理的计数器。最初想到这个点子,是因为自己的专业是图像处理方向,通过手机相机获取图片,然后计算图片上某些物件的数量。举几个例子就好说明了,上课的时候,老师点人头,可以通过摄像头拍一张照片,通过程序数出其中的人头数量;吃烧烤串串的时候,照一张相,让程序数竹签的数目;甚至是一沓RMB,把边角捏开,让程序帮你点钞。这个点子是一天晚上睡觉前,在床上想到的,当时灵感一冒,怕第二天忘了,赶紧取出手机记录了个大概,然后考虑了一下制作思路,一晚没睡好。第二天,和salucard同学讨论,觉得可以列入候选项目,于是个人就用手机拍下几张素材图片,在电脑上用Matlab做实验,无奈画质太差,想象中的处理方法完全派不上用场,图像处理算法部分以失败告终。

思索良久,始终还是不想放弃这个点子,于是打算改造成一个一般意义上的计数器,利用手机上众多的传感器来做计数处理,于是,触摸计数,重力计数,声音计数,视频改变计数等等利用传感器的计数方式原型一个一个浮出水面。这个程序写起来倒是快,不过仔细想了想,完全是针对程序员的一个作品,真正有用的地方,就是启动同屏两个触摸计数在比赛里计分,其他功能完全是为了增加华丽度而放上去的,一点也不实在,最后放弃了。此时日期定格在了9月24日,纪念夭折的tallyman君。

tallyman

第二个计划立刻就启动了,这次打算利用起Google的网络服务,通过全局搜索框提供一些便捷有用的生活信息,诸如计算器、汇率转换、翻译、天气服务等等。Google的重点就在于搜索,所以这一次想在这方面做点文章。程序编写难度不大,主要还是研读SearchManager的SDK,还有那个Sample词典程序,没花多少时间就做了个雏形出来。不过做到这一步后,开始感到空虚了:软件没有属于自己的东西,过分依赖别人的服务,功能又和许多专门应用的重复,不如别人的做得好做的精,使用全局搜索框局限性又很大,在当前的网络环境下用户体验也难以改善。仔细考量了一下,觉得不是个太好的主意,于是开始思考其他的门路。这个项目最终烙下的修改日期是9月27日,仅仅存活了几天而已,可怜的handypop君。

handypop01

handypop02

handypop03

经过两次计划的否定,小队陷入了短期的迷茫之中,为了想到合适的应用点子,salucard同学也是抓破了脑袋。最后决定下来的就是现在的项目了,如数家珍。这个名字是不久前才定下来的,不过这是后话。在电脑端我和salucard同学一直就是一个文件搜索软件Everything的忠实用户,极速便捷的搜索让我完全忘记了系统自带的龟速Win+F。通过上一个软件handypop的编写,在搜索设计上我有了一定的基础,于是打算在Android平台模拟一个类似的本地文件搜索软件,正好Google官方的桌面搜索还没有延伸到Android平台上。虽然没自信能做到Everything那样的搜索速度,毕竟手机上文件数目也有限,做到用户可以接受的程度就行了。这个计划启动的时间大概是10月8日左右吧,距今正好一个月的时间。

有了前两次软件编写的经验,这次必须要动真格了,再没有时间给我们犹豫做什么。于是下定决心,先和salucard同学讨论了一下程序的需求、架构,从一个骨架开始,尽自己所能,图书馆查资料,Google搜问题,一点一点的往上添砖加瓦,利用电子白板团队讨论,分工协作,逐渐形成了软件的基本雏形,可以工作了。这是第一次这么努力的为了一件事而奋斗,感觉每一点小成就都是多么充实的存在感。把软件给有Android手机的同学内部测试,听取用户的想法和感受;不在电脑前的每一次运行错误,都想小心翼翼的保留现场,回忆错误重现方法;研究其他应用的源代码,参照别人优秀的设计思路;投入到几乎忘我的地步了。

其实基本功能完成得很快,主要工作是在细节的处理、用户体验的完善上边。一次一次的修改UI的实现方式,为了让操作界面更友好更贴心;一次一次的数据结构优化,为了提升载入速度和搜索速度;一次一次的吹毛求疵,为了让程序尽可能正确处理各种意外情况。虽然做出的很多努力可能是最终用户根本感觉不到的,但至少自己去做了,也不会给自己留下什么遗憾。

如数家珍这个名字是salucard同学于10月28日提出来的,对于这个中文名,大家都一致叫好,形象的描绘了本地文件搜索软件的特点。但是找个对应的英文名并不容易,所以英文名还是沿用了最开始草拟的collimator。随着提交期限的接近,软件也逐渐步入正轨,有了比较完整的中文帮助文件,有了英语界面,有了官方主页,一切都像模像样的。

collimator01

collimator02

小小回顾了一下,到今天完成这个作品,总共看完了图书馆6本Android的编程书籍和6本Java语言的书籍,通过Google搜索到的知识,还有从Google Groups和Stackoverflow上得到的帮助也是数不胜数,在不算长的时间内,能有不小的进步,连懒散惯了的自己也难以相信。要真正的学习知识,必须投入到项目实践中,有压力有动力,有苦恼有愉悦,每一个错误、每一次进步都牵动着自己的心,什么都要自己动手,去接触去了解;而不是本着应付的态度去工作,才能有真知灼见的体会,真正的理解自己学习的东西。时间不等人,不能一味被动的等待机会。

顺便说,这篇日志是我第一次用Live Writer撰写提交的,用户体验还不错。