Stay Hungry. Stay Foolish.

2010年7月3日 没有评论

这句话出自Steve Jobs在05年斯坦福大学毕业典礼讲演: http://youtu.be/UF8uR6Z6KLc

讲演稿:http://news.stanford.edu/news/2005/june15/jobs-061505.html

今天看了http://www.ruanyifeng.com/blog/2010/07/stay_foolish.html,说了一些对这句话的理解:

———————————————-

Steve Jobs有一句名言:

Stay Hungry. Stay Foolish.

直译就是"保持饥饿,保持愚蠢"。也就是说,乔布斯告诫年轻人,永远怀有强烈的求知欲,以及虚心求教的态度。

========================

我原以为,这句话只是一句励志格言。今天看到一篇文章,才意识到它其实是一种纠正人类心理缺陷的对策。

心理学研究发现:

* 96%的癌症病人,认为自己比其他癌症病人健康。

* 93%的司机,认为自己的安全意识高于普通司机。

* 90%的学生,认为自己的智力在平均水平之上。

* 94%的教授,认为自己的教学水平高于学校的平均水平。

* 92%的访问者,都认为自己比一般人更公正。

这种对自己的高估是普遍存在的。心理学有一个专门名词,就叫做"虚幻的优越性"(illusory superiority)。

正是由于这个原因,乔布斯才会说"stay foolish",因为大多数人意识不到这一点。他们觉得自己不是foolish,而是smart(聪明)。一个典型表现就是,许多人都急于让别人知道自己的看法,哪怕对方根本没有询问你。

==========================

现在变一下,如果你假设自己比别人笨、知道的东西比别人少,会怎样?

你将会发现,这不会对你造成任何伤害,反而有很多好处。

为什么?

因为你会更多地倾听,更多地提问。

你承认自己是一个新手,这使你把自己放在学生的位置。它让你更关注当前的情况,以及未来的变化,而不是陶醉于过去的成就。

大多数人太关注自己的形象,觉得显露无知是很丢人的事情,所以他们宁愿假装懂得,也不愿开口询问。他们一心想让别人看到,自己干得多么漂亮,但是又不肯接受丑陋的结果,所以到头来一事无成。

只有你承认自己的落后,才能破除这种自我麻痹。因为不管你做出了什么结果,都代表了你的进步。

让我们听取乔布斯的建议,在内心中,与其相信自己是聪明人,不如相信自己是一个愚蠢的人,勇敢地把无知暴露出来。(Blog?那只是用来记录我的无知的地方。)

分类: 随笔 标签:

写评语

2010年6月23日 没有评论

从小学到中学,每到期末,老师都会给家长一份学生操行评语,总结这个学期学生的表现。中学时,老师曾经多次要求大家自己给自己写评语,然后由老师修改一下,抄到评语中。以我的经验,老师很少修改。

评语的常用句子,我还记得有:思想要求进步、关心同学、团结同学、乐于助人、爱护公物、学习努力、成绩良好/优秀。当然,一般还会指出一个不足。评语一般都在百余字。

现在想来,让学生自己给自己写评语,实在觉得老师有偷懒的嫌疑。如果说要学生自己做一学期的总结,以便更了解自己,应该是写做了哪些具体事情,结果怎么样,得到什么经验教训。而评语里概括的词语根本不是总结的方式。并且,学生自己写的评语,不管老师是不是修改,怎么能以老师的名义写到评语里。这是学生眼中的自己,而不是老师眼中的。老师见过很多学生,也有更丰富的人生阅历,难道就没有自己的评价吗?

本来通过百余字评语能表达的东西就不多,再让学生自己写,就更没有价值了。原因,或许要在老师的责任心上找原因了。

分类: 成长 标签:

密码保护:教育专家给家长的100条建议-评论版

2010年5月20日 要查看留言请输入您的密码。

这是一篇受密码保护的文章,您需要提供访问密码:

分类: 成长 标签:

教育专家给家长的100条建议

2010年5月20日 没有评论

(很多网站有这篇文章,我也不知道出处是哪里)

教育篇:

1、每天花半个小时和孩子交流。
2、和孩子在家也要使用文明用语,“早上好,请,谢谢,晚安”等等。
3、让孩子养成爱卫生的好习惯。
4、多听听孩子的声音!——用耐心、用爱心、用开心,心是长着眼睛的!
5、不要为了提醒孩子,而总是揭孩子的伤疤。
6、严肃指出孩子的错误!
7、不要总对孩子一本正经,要多和孩子一起欢笑:因为笑声能让孩子更加热爱生活;引导孩子积极、轻松愉快的看待事物。
8、给孩子讲故事,要有耐心,故事有一定的教育意义。
9、不要把当年未曾实现的理想强加在孩子身上,想让孩子去实现。
10、关爱孩子但适当时候适当的惩罚也是需要的,不要护孩子的短。
11、教育并不一定只是讲道理,有时适当可以采取一些强硬的措施。
12、结合孩子的表现,每天思考至少一个关于孩子成长的问题。
13、对幼儿进行艺术教育,培养幼儿高雅的审美情趣,注意引导、丰富幼儿的感性认识,在大自然中加深幼儿的情感体验,是非常有益的。
14、对于幼儿时期的孩子,不要让他们长时间地和自己的父母住在一起,隔代更亲,不利于教育。也许没有科学道理,但绝对适用。
15、注意培养孩子的善心。古人云:勿以恶小而为之,勿以善小而不为。

16、教会孩子微笑,微笑面对生活的一切,微笑面对人生。
17、对孩子不要乱许愿,承诺的事情想尽一切办法也要兑现。
18、要常换位思考!对孩子的所做、所想等家长应常换位思考,假如我是孩子的话,我将会怎样?
19、给孩子一定的空间和自由,同时给一定的压力和责任!
20、向孩子说明,他本身已经很可爱了,不用再表现自己。
21、从来不说孩子比别的孩子差。
22、绝不用辱骂来惩罚孩子。
23、在孩子干的事情中,不断寻找值得赞许的东西。
24、不要吓孩子。以免造成孩子过分胆小、怕事。
25、不要当众批评和嘲笑孩子,以免造成心理畸形,失去自信心等。
26、不要对孩子过分严厉。以免孩子惧怕、害羞不敢发表自己的观点,养成面善心恶的性格。
27、不要过分夸奖孩子。以免孩子养成“沽名钓誉”的不良习气。
28、不要暗示孩子做不良的事。比如,打架一定要打回来、自己的东西不给别的吃、乘车不购票等。
29、让孩子正确树立心目中的偶像。

成长篇:

1、给孩子一些私人空间。
2、给孩子选择的机会和权利。
3、让孩子自由选择自己的伙伴、朋友。
4、让孩子做想做的事。
5、让孩子做一些力所能及的家务,如洗洗自己的衣服、烧水煮饭等,让他意识到自己是家庭成员中的一分子。
6、为孩子准备一个陈列架,让他在上面展示自己制作的物品。
7、认真地对待孩子提出的正经问题和看法。
8、把孩子当作成人一样,和他平等相处,把孩子当成自己的朋友。
9、及时发现孩子的点滴进步,懂得赏识孩子。
10、记得对孩子说:我爱你,你是我的宝贝!
11、记得经常的亲吻你的孩子,抱抱他(她),摸摸他(她)的头,让他(她)知道你的爱!
12、随时关注他(她)的进步,并也让他(她)自己知道自己的进步!及时发现孩子的点滴进步,懂得赏识孩子。
13、多与孩子孩子沟通,了解孩子,与孩子同行。
14、不要给孩子贴上“笨”的标签。
15、家长要耐心地倾听孩子的烦恼。
16、要学会真诚地赞美孩子,而不是像对宠物一样说句“你真聪明”。
17、让孩子经常有机会和他的同伴在一起。
18、关心孩子的身体健康,更关注孩子的情感需要。
19、先成人再成才,教育的根本目标是培养人,一个健全的人。
20、在生活中创设一些困境,和孩子一起度过。
21、鼓励孩子尽量不依赖成年人。
22、了解孩子有哪些朋友,这很重要。

生活篇:

1、给孩子一些钱,让孩子学会理财。
2、没有得到孩子的许可,不要看孩子的日记与信件。
3、经常和孩子郊游。
4、睡前给孩子讲讲故事,让孩子笑着入睡!
5、给孩子一个主要供他玩耍的房间或者房间的一部分。
6、如果有条件,每天晚饭过后和孩子到户外散散步。
7、快乐与孩子一起分享!
8、对小家伙开心的笑,并希望他(她)也常笑!
9、帮助孩子与来自不同社会文化阶层的孩子正常交往。
10、鼓励孩子与各种年龄的人自由交往。
11、给孩子留出真正的“玩”的时间和空间。
12、教会孩子骑自行车,游泳,这都是进入社会的一种基本技能。
13、每天早上与孩子相互问候,让他感受到美好的一天的到来。
14、夫妻实在要吵架,请一定要记住:避开孩子
15、每天下班回家看到孩子,首先微笑着问他一遍:孩子,你今天快乐吗?

16、不给他留有太多的物质遗产,给他一个健康的身体,给他一个健康的心理,一个快乐的人生。
17、着重进行孩子的生活能力和行为习惯的培养。
18、只要与创作尘埃有关,不要责备孩子房间里或者桌面上乱
19、父母对自己的双亲要孝敬有加,让孩子觉得家中充满了爱,同时父母也是他们值得学习的榜样
20、父母之际间要互相谦让,相互谅解
21、不要太关心孩子。“自己的事情自己做”,以免孩子养成以我为中心的坏习惯。
22、不要太亲近孩子。让他与年龄相仿的孩子多交往,以免孩子养成性格孤僻的恶习。
23、不要孩子要啥买啥。让他知道“劳动与所得、权得与义务” 的关系。以免孩子羞成好逸恶劳的许多性格。
24、生活中的困难以及一些家庭大事有时可以和孩子商量商量。
25、对孩子的爱要稳定,不要一会儿晴,一会儿阴。

学习篇:

1、和孩子一起读书,家长可以看看报,一个好的学习伙伴很重要。
2、孩子在家学习,家长切莫搞一些娱乐活动,一个舒适的学习环境很重要。
3、不要逼孩子学自己不喜欢的东西。
4、不要因为孩子的成绩而责骂孩子。
5、不要因为孩子试卷上的低分而认为孩子没有出息。
6、教他(她)足以带来成就感的知识:古诗、数字、故事、家务、玩耍、交朋友···
7、教育孩子读好书、好读书
8、不要对孩子的学习成绩表示太大的关注,那样会造成孩子学习紧张,压力增大。
9、不要把孩子的成绩与其他孩子相比,要分析一下造成这种现象的原因,反思一下有没有自己的责任。
10、孩子的房间要有自己的书桌,书桌上要有几本自己爱看的书籍,如《格林童话》、《伊索寓言》等。

娱乐篇:

1、和孩子一起看他喜欢的动画片、一起听他爱

分类: 随笔 标签:

折腾记录:Android上增加img.ly上传

2010年5月6日 没有评论

好久没有更新了,一直在做我的Android程序,但目前看来一时半会儿做不完,还是调整一下节奏,也把做的过程中遇到的问题记录一下。

昨天,打算把我的程序中加入拍照并上传到img.ly的功能,遇到了一串问题。

问题一:Android下调用拍照Activity

通过MediaStore.ACTION_IMAGE_CAPTURE这个Intent可以使用系统提供的拍照功能,但用了之后,发现拍摄的照片相当小,即使设了MediaStore.EXTRA_OUTPUT,也是没有作用。

Google之后,发现这是个已知的问题:http://code.google.com/p/android/issues/detail?id=1480,唉,郁闷。

看了几个其他Android上支持拍照的程序,他们也只能拍小图片。算了,小就小吧,还省流量呢,哈哈

问题二:上传代码

查阅img.ly的API文档,真是简单,只有一页。里面说格式为multipart/form-data,要求三项:media, username, password。

找遍了Android文档,没有发现支持multipart/form-data的Http相关函数。Google之,org.apache.http新版本中包含了对Multipart的支持,但Android中带的org.apache.http没有。一个Android Team的回答

Note that this has been removed because it was removed from the Apache
HttpClient library that we’re bundling. What you want to do is get
Mime4j ( http://james.apache.org/mime4j/index.html ) and HttpMime
( http://hc.apache.org/httpcomponents-client/httpmime/index.html ) and
include these libraries in your Android project. From there, the usage
of multipart requests is pretty intuitive.

按照他的说法,下载了mime4j和httpmime,终于可以支持multipart/form-data了。

问题三:HTTP Error 411 Length required

按照img.ly的API,在post中加入了media, username, password,运行。得到一个Exception,因为img.ly返回HTTP Error 411 Length required。

抓包,看到发出的http请求里,的却没有Content-length。尝试直接通过代码加入Content-length,未果,还触发异常。

Google之,找到了原因:我针对media这个字段,使用的是InputStreamBody,这个Body的getContentLength()返回-1,造成不能计算总的长度,所以http header里没有Content-length。

这个帖子里给出了一个解决方法,自己写了一个ByteBody。这个代码是08年的,可能是针对以前的版本,我照猫画虎,做了一个:

import java.io.IOException;
import java.io.OutputStream;

import org.apache.http.entity.mime.MIME;
import org.apache.http.entity.mime.content.AbstractContentBody;

public class ByteBody extends AbstractContentBody {
	private final byte[] mContent;

	public ByteBody(final byte[] content, final String mimeType) {
		super(mimeType);
		if (content==null) {
			throw new IllegalArgumentException("File may not be null");
		}
		this.mContent = content;
	}

	@Override
	public void writeTo(OutputStream out) throws IOException {
		if (out == null) {
            throw new IllegalArgumentException("Output stream may not be null");
        }
        try {
            out.write(mContent, 0, mContent.length);
            out.flush();
        } finally {
        }
	}

	@Override
	public String getFilename() {
		return("bytearray");
	}

	@Override
	public String getCharset() {
		return null;
	}

	@Override
	public long getContentLength() {
		return mContent.length;
	}

	@Override
	public String getTransferEncoding() {
		return MIME.ENC_BINARY;
	}

}

运行,终于HTTP 411不出现了,但又来了新的问题……

问题四:Invalid twitter username or password

这个提示很奇怪,明明我提供的是正常的。联想到在使用MultipartEntity之前,我曾经用直接写代码的方式实现post请求,没有出现这个问题,是不是MultipartEntity发送的格式img.ly不接受,造成不能识别username/password。

MultipartEntiry的发送格式是:

Content-Disposition: form-data; name=”username”
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

suzginfo

找了一个可以上传到img.ly的程序,抓包看它的发送格式 —— 它竟然用https发送,看不到发送内容!

不过,我又发现,它的logcat里,有发送内容,太好了

Content-Disposition: form-data; name=”username”

suzginfo

和我的差别是没有Content-Type和Content-Transfer-Encoding。

看文档和源文件,MultipartEntity是有两个模式,STRICT和BROWSER_COMPATIBLE,缺省的是STRICT。在STRICT下,会发送Content-Type和Content-Transfer-Encoding。而BROWSER_COMPATIBLE不会发送。

换成了BROWSER_COMPATIBLE模式,Invalid twitter username or password消失了,错误变成了Invalid image type。看来对于media字段来说,是需要Content-Type的。这个在分析另一个程序的logcat中,也看到了它发送Content-Type和Content-Transfer-Encoding。

这个就麻烦了,我需要STRICT和BROWSER_COMPATIBLE的组合模式,对username和password不发送Content-Type,而media发送。

没办法,重写MultipartEntity和HttpMultipart。在HttpMultipart.doWriteTo里,如果Content-Type是text/plain,就跳过,直接发送内容。

修改后,终于可以上传图片了,内牛满面啊~

分类: Android 标签: , ,

投票

2010年5月6日 没有评论

转一段来自郑渊洁的博客:http://blog.sina.com.cn/s/blog_473abae60100jef8.html

2010年4月7日,中国河南洛阳孟津县西霞院中学初一某班,班主任决定让全班学生投票决定女生雷梦佳的去留,全班38个同学,有26人投票赞成让同学雷梦佳离开班级。这是民主。违反《中华人民共和国义务教育法》的民主。看到投票结果,雷梦佳先笑后哭,跑着离开学校。三天后,雷梦佳在学校后面的水渠中溺水身亡。渠边的石板上有她写的字:“雷梦佳生命到此结束。”

不光是坏人手中的刀能杀死孩子,同学手中的票也能杀死孩子。老师炮制这样的民主投票,能杀死学生。这也是校园安全隐患,而且是更恐怖的校园安全隐患。面对这样的校园安全隐患,特警的神枪手,你的狙击枪的准星往哪儿瞄准?

雷梦佳可能不完美,但如果所有人生下来都是雷锋都是诺贝尔奖得主都是作协全委,我们还要学校做什么?

想对雷梦佳的班主任说句话:不是所有的投票都体现民主,有的投票是独裁的帮凶,真理往往掌握在少数人手中。也想对投赞成票的同学说句话:不管你将来取得多大的成就,都不要忘记你曾经投过这样一张赞成票。这是人生的一个负面记录,是永远洗刷不掉的耻辱。最想对投反对票的同学说:哪怕你一生普通,在你4月7日投出反对票时,你已然成为伟人。

这段让我想起了我的初中。初中时候,我的班主任也经常搞全班投票,并且这是我唯一进行记名投票的地方。不光是选优秀什么的要投票,我们还投票选过谁最不爱护公物。我们的班主任还善于引导选票,在投票之前,就说应该选什么样的人,不能选什么样的人,指向性非常强,虽然不点名,但大家都会知道他说的是谁。投票结果出来之后,还会说谁谁的结果是不是符合他的希望。有幸我就在他某次暗指的人里,所以对这个记得非常清楚。

有个关于选票公平性的定理,说很难做到完美。这仅仅是数学上的论证,而现实中更多的是人的因素。在一个三五十人的班级里,班主任作为相当有权威的人,对结果是有主导作用的。有的老师也喜欢这种方式,能把自己的想法通过学生们自己的选择来实现。

又想到,我在学校参加的所有投票中,从来没有出现过有人投弃权票。这正常吗?老师没有说过有放弃的权利,那时的我们也不曾想到,或者怕投票之后的追查。

以小见大,学校就是社会的缩影。

分类: 随笔 标签:

长江后浪推前浪

2010年3月17日 2 条评论

长江后浪推前浪 —— 未必追得上前浪

刚刚看到一条tweet:下午去拜访105岁的周有光老先生。他认为经济发展要经历农业化、工业化、信息化三个阶段,“但是中国的信息化遇到了大问题。你知道google的事情吧?”我正要感慨他信息如此灵通,他接着说:“可是这怎么拦得住?新技术会不断出来。现在不是都用twitter了吗?”……

背景资料:周老先生的介绍:维基百科百度百科

有时候,我们习惯拿年龄说事:岁数大了,不能和以前比了。以此来拒绝学习,拒绝改变。但相对周老,敢问谁和他比年龄?恐怕大多数人这辈子是没戏了吧。

还有些时候,我们总是拿忙来说事:现在事情多,忙不过来,没时间学习。但相对周老,多少人有能有维基百科和百度百科的条目,并且著作、成果数量超过他呢?恐怕不多。

前浪继续飞奔,后浪呢,也真是后生可畏。比如@ToolCN作者,现在才15岁。

我们这些夹在中间的人,表示压力很大…

最近在twitter上,感到一个开放地视野的重要。一堆人在讨论MacBook,使我对MacBook有了个新的认识。我以前就没有想过去了解Mac。刚刚查到的资料是2009年底,Mac占5.16%,5倍于Linux(这个数据应该是可以上网的终端,不包含服务器)。我在Linux上也花了不少时间,而没有关注5倍于其市场的Mac,视野真是狭窄啊。

还有智能手机平台,2010年1月美国智能手机市场统计中,RIM占43.0%,Apple占25.1%,Microsoft占15.7%,Google占7.1%,仅仅关注在Android这一个平台上还是不够的。

Windows 7首发5月市场采用率两倍于Vista

有了网络,只要你想,再拥有一定的方法,就可以拥有开放视野。(也希望某些人不要为了一己私利,做出反人类的事情)

真羡慕现在的孩子,从小就可以接触到如此之多的信息。如果对信息很好地利用,将是很大的财富。通过网络,可以得到名师的讲座、思考者的人生感悟、创业者的人生历程、优秀程序员的代码和心得,甚至可以与他们直接交流。这些在十几年前甚至是奢望。

总之,一个开放的心态,活到老,学到老,没有停下的理由,小心后面的巨浪~~~~~~

分类: 随笔 标签:

Google 服务介绍

2010年3月9日 1 条评论

昨天和朋友谈到Google的一些服务,他很感兴趣,想了解一下。本来打算回个mail的,但想想或许也有别人有这个需要,就放在这里,供有大家参考。

说明

Google的服务并不是在任何地点都可以访问的。某些服务对使用者所在地(大多通过IP判断)有限制,比如Google Voice,仅美国IP可以注册;还有些服务,Google本身没有限制访问者,但由于当地的法律法规以及一些网络技术限制的存在,令使用者不能访问服务。关于如何突破这些限制,不是本文重点,请自行搜索解决办法。

另外,一些服务并不是提供了所有语言版本,服务最多的语言是英语。如果你能接受英语界面,可以选择把英语作为账户语言。在Gmail->Settings->General->Language中有语言设置,这个设置也将影响到其他服务。

概览

Google的服务很多,大多数是免费的,或者提供可以免费使用的版本。要查看自己已经使用了哪些服务,或者看看有什么新的服务可以去试试,可以访问https://www.google.com/accounts/ManageAccount。My Products里是已经使用过的服务,Try something new是没有使用过的服务。下面是我的账户情况,除了AdWords,我都用过了:) ,只不过有些只是进去看看。

ManageAccount

随着我们使用Google的各项服务,Google存储了相当数量的个人信息。如果想知道有哪些存在Google中,可以访问https://www.google.com/dashboard/,这里列出了所有Google存储我们的数据。

下面,我就把Google服务中我比较熟悉的列出来,供大家参考。

Search

http://www.google.com/

搜索是Google的本行,大家都比较熟悉,这里就不多说了,这里说几条如何更好地使用搜索:

  • 如果打开Google就进入google.cn,想要使用英文界面,可以点击页面里的Google.com in English
  • 有时间的话读读Google搜索入门,能让你更快更准确找到想要的东西
  • 在搜索框里,还可以做更多事情。比如输入“100美元等于多少人民币”,将按照当时汇率给出人民币数额。详细情况可以查看http://www.google.cn/intl/zh-CN/help/features.html
  • Google账户登录之后,输入搜索的关键字就将被记录下来,可以到https://www.google.com/history/查看
  • 搜索结果页面,有个“Show options…”。点开后,可以对结果进行进一步筛选。比如,限定结果的时间范围。
  • 还有一些特定搜索,比如http://www.google.com/codesearch,是针对程序代码的搜索。

Gmail

https://mail.google.com/mail/

Gmail目前提供7G+的容量。它也是大家比较熟悉Google的服务之一,这里说几条我自己的体会:

  • 标签功能很好,要善于使用标签。可以通过建立filter给邮件打上标签,并指定相应动作(存档、删除、转发等)。
  • 可以给标签指定颜色:在标签类表点击名称前面的方框就可以设置颜色。不同颜色标签看起来更清楚些。
  • 我的习惯是当邮件不需要再关注的时候就存档,让收件箱里保持都是待处理的邮件。存档之后邮件不会消失,仍然可以按照标签访问到。当然,也可以用搜索找到。
  • Gmail的搜索功能很强大,找邮件很方便
  • 在邮件上方的RSS+广告信息,可以在设置里关掉
  • 可以打开Gmail的离线功能,这样可以在没有网络时处理邮件
  • 经常关注一下labs,或许会有喜欢的小工具
  • Gtalk的聊天记录就存在Gmail里面(如果启用的话)
  • 页面下方,列出了Gmail的活动记录,可以知道当前自己的账户在哪里登录了Gmail
  • 页面下方,有不同视图可以选择(是否启用chat/buzz)
  • 联系人可以与Outlook同步(需要安装程序)
  • m.google.com是支持exchange接口的服务器,可以用来同步Windows Mobile手机
  • Android手机内建支持

Reader

https://www.google.com/reader/

我觉得Google Reader是一个很好的RSS阅读器。里面可以对条目打星号、共享、通过Gmail发送、设Tag、分类。尤其是follow了其他人后,他人的共享也会出现在Reader里。

Reader里也集成了搜索,可以查找订阅的RSS条目内容。

Calendar

https://www.google.com/calendar/

  • 支持离线访问
  • 可以发送短信通知(免费,包括中国手机)
  • 有很多公共日历供选择,比如“中国节假日”
  • 可以与别人共享日历
  • 可以与Outlook同步(需要安装程序)
  • m.google.com是支持exchange接口的服务器,可以用来同步Windows Mobile手机
  • Android手机内建支持

Documents

https://docs.google.com/

  • 目前已经支持上传任何形式的文件,1G免费空间,与Picasa共用。
  • 支持离线访问
  • 可以编辑的格式:对于Office的Word/PowerPoint/Excel
  • 可以查看PDF
  • 可以向别人共享文件/文件夹

Groups

https://groups.google.com/

Google讨论组。支持邮件方式参与,可以订阅详细或摘要邮件。

Bookmarks

http://www.google.com/bookmarks/

在线书签,可以对网址加星号、加标签、加注释

Finance

http://www.google.com/finance

财经信息。提供美国、英国、香港、中国、加拿大股市和财经信息

Talk

http://www.google.com/talk/service/GoogleTalk

即时通讯。集成在Gmail中的GTalk可以实现文字、语音、视频聊天。客户端可以实现文字、语言聊天。文字聊天记录可以选择保存在Gmail里。

Wave

http://wave.google.com/wave

目前应用不是很明确。或许可以作为企业内部协作平台。

App Engine

http://code.google.com/appengine/

在Google的云上运行Java或Python代码,类似虚拟主机。免费用户可以建立10个应用,每个应用存储空间500M,流量1G

AdSense

https://www.google.com/adsense/

通过在网站中加入Google广告获得收入

Alerts

http://www.google.com/alerts

当满足一定搜索条件时,发送邮件给你。可以使用这个来追踪新闻。

Picasa

http://picasaweb.google.com/

在线照片存储服务。1G免费空间。有客户端可以实现管理

Analytics

https://www.google.com/analytics/home/

通过在网站中加入追踪代码,得到网站访问的统计信息。有相当详细的统计报告。

Maps

http://maps.google.com/

在线地图

PinYin IME

http://tools.google.com/pinyin/

我正在使用的Google拼音输入法。

Voice

http://www.google.com/voice

限美国IP注册。

可以免费拨打美国和加拿大电话。拨打中国电话费用为$0.02/分钟

Google Apps

http://www.google.com/a

包含:

  • 基于Gmail的自己域名的邮件服务
  • 基于Sites的建站
  • 基于Canledar的日立
  • 基于Docs的文档

免费用户限制:最多50用户,邮箱空间与免费Gmail相同。比如我的@sunote.info邮件就是在这里架设的。

分类: 网络 标签:

Android中焦点移到ListView的问题

2010年2月25日 3 条评论

发现Android编程中的一个问题:如果在一个ListView上面放置一个可以接收焦点的东西,比如Button,当使用向上方向键滚动ListView到第一条后,焦点会移到上面的Button上,这个没问题。但然后使用向下的方向键时,焦点会跳到ListView中当前窗口的最下面一条,而不是焦点离开时的第一条。在ListView下方有Button的时候,向上移动焦点,也会出现类似的情况。

这个问题在Android的示例里面也有,ApiDemos->Views->Tabs->Content By Intent。这个示例里当使用方向键从list这个Tab向下移动焦点的时候,会跳过一屏的条目。

在网上搜了一下,仅仅有一个人提到了这个问题,但没有看到解答。

我查了一下源代码,实现设置焦点的代码是:

git://android.git.kernel.org/platform/frameworks/base.git›core›java›android›widget›ListView.java

@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
    super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);

    int closetChildIndex = -1;
    if (gainFocus && previouslyFocusedRect != null) {
        previouslyFocusedRect.offset(mScrollX, mScrollY);

        // figure out which item should be selected based on previously
        // focused rect
        Rect otherRect = mTempRect;
        int minDistance = Integer.MAX_VALUE;
        final int childCount = getChildCount();
        final int firstPosition = mFirstPosition;
        final ListAdapter adapter = mAdapter;

        for (int i = 0; i < childCount; i++) {
            // only consider selectable views
            if (!adapter.isEnabled(firstPosition + i)) {
                continue;
            }

            View other = getChildAt(i);
            other.getDrawingRect(otherRect);
            offsetDescendantRectToMyCoords(other, otherRect);
            int distance = getDistance(previouslyFocusedRect, otherRect, direction);

            if (distance < minDistance) {
                minDistance = distance;
                closetChildIndex = i;
            }
        }
    }

    if (closetChildIndex >= 0) {
        setSelection(closetChildIndex + mFirstPosition);
    } else {
        requestLayout();
    }
}

通过debug发现,previouslyFocusedRect在这里是ListView的,而不是之前焦点View的。在按向下键时,getDistance比较ListView的bottom和各个child的top,当然会选中离ListView下沿最近的。具体为什么会previouslyFocusedRect是ListView,我还没有深入分析。

一个解决办法

这不是一个根本解决的方法:写一个新的class,继承ListView,覆盖onFocusChanged。

@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
	super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
	if (gainFocus && previouslyFocusedRect != null) {
		final ListAdapter adapter = getAdapter();
		final int count = adapter.getCount();
		switch (direction) {
			case FOCUS_DOWN:
				for (int i = 0; i < count; i++) {
					if (!adapter.isEnabled(i)) {
						continue;
					}
					setSelection(i);
					break;
				}
				break;
			case FOCUS_UP:
				for (int i = count-1; i>=0; i--) {
					if (!adapter.isEnabled(i)) {
						continue;
					}
					setSelection(i);
					break;
				}
				break;
			default:
				break;
		}
	}
}

在这里,我只处理了FOCUS_DOWN和FOCUS_UP。由于不能访问mFirstPosition,处理也做了简化:焦点从上方移下来时选择第一个能选择的,从下方移上来时选择最后一个能选择的。

分类: Android 标签:

屏幕分辨率

2010年2月24日 没有评论

各种电子设备有着不同分辨率的屏幕,除了用 长x宽 多少像素表示之外,还有各自的名称,如手机上常见的QVGA, HVGA和电视常见的1080p, 1080i。

这个说几个常用的:

VGA:是指640×480。经常在VGA前面加些修饰,表明和VGA的关系。比如QVGA是指Quarter VGA,也就是VGA的1/4,320×240。类似的,HVGA是Half-size VGA,有两种half的方式,分别是480×320和640×240。SVGA是指Super VGA, 800×600。WVGA是指Wide VGA,高度是480,但有几个不同的宽度:800、848、854。其中854×480是16:9的,又叫做FWVGA(Full WVGA)。

电视屏幕,经常看到720p、1080i、1080p,这里的数字是指屏幕的高度,可以按照16:9的比例,算出宽度。而字母p是指逐行扫描,i是指隔行扫描。逐行扫描效果要比各行扫描好。

  • 720p = 1280×720逐行扫描
  • 1080i =  1920×1080隔行扫描
  • 1080p = 1920×1080逐行扫描

在wikipedia上,有详细的列表可以查阅。

下面是一个常用分辨率的比较图:来源

1000px-Vector_Video_Standards2.svg