Wednesday, June 02, 2010


Sent From My Moto® Milestone™ with Google™

Saturday, December 19, 2009

lenovo O1 开箱&初步测评


早上满心欢喜打开鸟SF的页面去详细查询单号,结果提示“因无法联系到收件人而推迟派送”我�……我压根没看到有未接电话啊……

好在当我午睡起来准备打电话催SF的时候,SF给我打过来了,说马上送到!(带电池的东西隔天就从广东送到北京,SF让我内牛满面啊!)

 

开箱开箱!!!

 IMG_0446

全新全包的正式版O1,当当当当!开箱!

 IMG_0447

下图,包装类似于iPod Touch啊……

IMG_0456

不过这个盒子倒是很有份量、很精致,而且颜色很好看。

IMG_0459 

MobileBroadbandG3的logo

 IMG_0461

据说MIRO是联想的手机品牌

IMG_0463

嗯,机器安静地躺在盒子里面

IMG_0466

没装电池,拿在手里比较轻,握持感比G1好。

IMG_0467

照相快捷键

IMG_0468

背面用的是防滑喷胶(类似G1后盖材质)

IMG_0469

500W像素的摄头+LED补光灯+喇叭口

IMG_0470

居然支持SRS音效……然后有8GB内部存储空间。

IMG_0471

配件全家福

还有个VIP卡,呵呵。看来联想这次认为O1是旗舰咯?

IMG_0472

大伙儿猜猜这个是什么?

IMG_0474

其实是充电插头……做得很精致啊。侧面还有指槽。

IMG_0475

看做工是否精细的又一个点:USB数据线的处理。联想这次虽然没有在数据线上面打logo,不过看数据线的处理还是不错的。借鉴了apple和htc的做法。

IMG_0478

电池,很宽很扁很平……正面有lenovo的logo。容量1500mAh。

IMG_0482 

IMG_0494

慷慨的赠送了SanDisk的8GB Class2的TF卡。

IMG_0487

电池盖上好像有字

IMG_0488 

�……怎么拆盖这种图示,就不能印在贴纸上,贴到电池盖外面么……

IMG_0490

啧啧,其实做工还是蛮精良的。电池盖扣合严密。

IMG_0493 

我已经受不了了,装电池装SIM,破处!

IMG_0495

嗯……为啥要把屏幕下面的四个触控按键改成两个?怕误触拨号键?

IMG_0496

呃,无视后面那本书……

前摄头&前摄头下面的两个东西。左边是光线传感器(G1残念……)右边是LED(好丑……)

IMG_0497

和G1对比一下啊……发现O1颜色好深啊……屏幕的确宽啊宽……(注意客串的我)

 IMG_0504

呃,注意左下角,各种指纹……看来真的得贴磨砂膜啊……

亮点是LED灯和状态栏上写的——中国移动3G和HSDPA标志……哥也有HSDPA!

特别鸣谢键盘泛油的破本本友情充当背景!

 IMG_0508

再来个oPhone标志性的锁屏界面(屏幕背景自动变换的……不错,原装android应该学学)

IMG_0510

====================神奇的分割线======================

图秀结束,开始测评。

对于androider和iPhoner是真正的0上手时间……

第一屏全都是移动定制程序&服务(可以参考那个贴纸上的图标)……以至于我习惯性去找Googlemaps和Gmail都没找到……

屏幕间切换速度爆快,即使开启3D也是一样快;和今年10月移动通信展上的O1完全不同的体验,那个旧版O1还是电阻屏而且爆卡无比。

选项&设定要比android更容易找。不过我很疑惑,就是TMD为什么还要加一个“校准屏幕”???

WLAN&WAPI全支持,支持Bluetooth和GPS。而且貌似有原生的凯立德(android上面用的就是出自于此)。

开机速度嗷嗷快(速度>>刷了Dwang的G1)。

3.5''屏幕的屏幕键盘就是给劲!更加肯定了我以后必须买3.5''的android的决心!

至于大家关心的网路问题,目前初步结果是这样的。我还没来得及测试TD-HSDPA的速度如何以及视频通话是否跟几个月以前我用国宝手机(PANDA TD988)时的糟糕体验一样,不过HSDPA信号的覆盖我很满意。满屋游荡甚至满楼游荡都依然是H信号。

灰信服务还没试,多数程序都还没试……

哦对,耳机插孔不是3.5mm,失望,不过自带耳机外表做工比较精致。大家曾经对中间那个竖条按键有期待,我开始也觉得会不会是个触控板……结果发现丫TMD是个HOME按键……屏幕下方两个触控按键,左边那个是MENU,右边是back……于是乎我就有疑问,工程模式如何进?

第三方软件方面,目前根据其他人的消息,aqq和root explorer都可以用。说明O1应该本来就是root过的。

更多后续评测我会陆续放上来……欢迎关注……

嗯,当然关注我twitter是最直接的:@ss1271

Thursday, October 29, 2009

鉴别htc G1/G2/G3翻新与错版&机器产地版本的方法


进入这个网站, http://service.htceurope.com/htcdistributor/Default.aspx 


输入你的手机序列号 (拨号时按  *#06# 可得)
然后输入序列号(条码下面那个S/N,不是上面的那个SN),点Query


我的信息:

SN :HT844KV0*****(*号为隐私屏蔽)
IMEI :358280010*******(*号为隐私屏蔽)
Part Number :99HE*****(*号为隐私屏蔽)

Part Description :SKU,TMEU,English-UK,GBR,QWERTY,G1,PureWhite,HSUPAenable,w/ SIM Lock,DREAM-O3

(英版,纯白,QWERTY)

Customer Name :T Mobile (UK) Ltd.
Customer Model :
HTC Model :DREAM-O3
Error Message :

于是得出结论,我的机器是翻新的。


各位用户可以鉴别一下自己的机器。





Wednesday, October 28, 2009

Android小白指南——如何刷Donut 1.6

既然想刷到Donut 1.6,那么各位的机器想必应该是已经Root过了的。至于还不知道啥是root的同学,请自行google 相关资料,本文不再赘述如何root和root的好处。

我有件事情要放到最开始说,那就是

  • 刷机有风险,请慎重,本文系本人操作步骤,已经证实完全可行,本人不对任何砖头机负责
  • 刷机请保证电力充足
  • 建议先通读本文确定自己的机器需要什么文件,先下载好,再开始

一、刷android recovery utility

建议刷这个版本的,虽然功能没有RA的恢复工具那么强大,但是非常简单易用。

下载地址:

http://n0rp.chemlab.org/android/cm-recovery-1.4.img
MD5Sum: f5135a878c705215f4012786e4261cfe (一定要校验文件的正确性)

下载完成后拷入SD卡根目录。

刷Recovery的方法如下:

  • 进入超级终端输入su(注意,超级终端的所有命令都区分大小写,注意命令的空格,不要写错或者丢空格,每行命令都需要回车,下面所有涉及终端的命令均不再提示大小写等问题),回车,会提示你是否赋予权限,选择总是允许。
  • 输入:flash_image recovery /sdcard/cm-recovery-1.4.img
  • 正常情况下,应该什么都不会提示,如果你遇到“no space on device ”的错误,请输入下面的命令
  • fastboot erase recovery
    fastboot flash recovery cm-recovery-1.4.img

二、首先检查Baseband版本是否为2.22.19.26I:

Menu->Settings->About

 2

如果BaseBand版本里面后面的数字不是2.22.19.26I,那么需要刷新Radio;

步骤如下:
RADIO的刷新方法很简单,你得到的是一个压缩包,刷新方法和G1的刷机方法一样,

zip包不要解压,直接放进SD卡根目录,

HOME+POWER开机(如果已经是开机状态,那么可以挂机+接听+Menu重启,然后立刻按住房子),

选择菜单中的apply any zip,选择你下载的那个radio的zip文件

开始升级,记得一定要刷新最新版本的RADIO文件,这与后边会提到的刷新SPL文件有关。

2.22.19.26I 的Radio文件点此下载

三、检查SPL是否已经刷过

进入超级终端(Terminal),输入df

会出现如下的画面:

3

注意看/data 一行,如果是/data后面的数字是91904K total的话,那么说明你不用刷新SPL;

如果是和我的图中一样,是76544K total的话,需要刷新SPL。

需要确认如下事项:

  • 进bootloader(三色屏)模式:【相机+电源键】。看到的DREA100 后面的字符是PVT。
  • 刷新SPL之前要确定你的RADIO是最新的,刚才已经在有关RADIO的部分说过这个问题了。
  • 注意!如果刷机前是Radio 为RC33或者刷了SPL后刷再Radio RC33,机子必砖掉
           

刷机方法和G1刷机没有区别。

  • 复制文件到你的SD根目录。
  • 先关机,然后长按 Home(小房子)+ 关机键,当看见三角形的警告且屏幕不再刷新时,同时按下 ALT + W 组合键清空内存如果已经是开机状态,那么可以挂机+接听+Menu重启,然后立刻按住房子,这样不用关机
  • 当进度条走完后选择Recovery菜单的apply any zip 项目,选择该zip包,开始升级。
  • 当进度条走完后——按下 Home+Back键 重新启动你的 G1 手机
  • 机器振动的刹那迅速按住房子键,准备刷新的ROM,如果不这么做,十有八九会卡在开机第一屏不动。

三、开始刷Donut 1.6

首先去下面的网址下载(恕我不能直接贴出链接,因为他是要弹窗接受协议的)

下载页面:http://developer.htc.com/adp.html#s3

下载这个文件:signed-dream_devphone_userdebug-ota-14721.zip

MD5校验码为:b3e12b004c155761a10b1a848288e0c3

注意一定不能下错。

==

然后下载CM系列的1.6ROM,目前最新版是4.2.2 stable:

(v4.2.2 - stable version, updated 10/27):
Download: http://n0rp.chemlab.org/android/upda...2.2-signed.zip
Mirror1: http://android.phaseburn.net/mirrors...2.2-signed.zip
MD5Sum: 6147a3515758b6d3066526804aa10c42 (一定要校验文件!)

===

刷ROM步骤如下:

  • 把下好的signed-dream_devphone_userdebug-ota-14721.zip或者HTC_ADP_1.6_DRC83_rooted_base.zip文件拷入SD卡,拨号+挂机+Menu重启,然后在开机画面出来前迅速按住房子键,进入Recovery,选择apply any zip,然后选择你放到sd卡的zip包(signed-dream_devphone_userdebug-ota-14721.zip或者HTC_ADP_1.6_DRC83_rooted_base.zip)进行升级;
  • 完成后,重启,迅速按房子,再次进入Recovery,此时apply any zip,选择4.2.2的那个ROM进行刷新。此步骤完成后,刷机即完成。

 

 

本文部分需要下载的文件已放入SkyDrive:

http://cid-35763718f6bc39a5.skydrive.live.com/browse.aspx/Android

 

 

 

Technorati 标签: ,,,,,,,,

Thursday, October 22, 2009

回归BlackBerry

回归BlackBerry的原因并不是G1不好用,而是我打算出掉G1等Moto的Sholes。奈何G1仍然是我最爱……可惜现在不出G1,日后价格方面就不好办了。

别的不说,前天去ZGC,入了9500。当天晚上就习惯了无数BBer不习惯的SurePress屏幕,说明我的适应能力还是很强的(当初光速习惯Android……),开始用9500,唯一不爽的就是没有wifi……其他倒还好。Yatca也能用,就是每次看到BB闪灯总会习惯性的往下去拽那个不存在的notification bar。

另:BB的LED灯居然不能根据不同的notifications而变色……太残了……LED灯只有在没电的时候才会变么……不爽。RIM要改进了啊,区区LED灯而已,可以明显减少用户点亮屏幕的次数。

Wednesday, October 14, 2009

Java上的时间计算

学习在java中计算基本的时间段
概述
如果你知道怎样在java中使用日期,那么使用时间和它才不多一样简单。这篇文章告诉你怎样把他们的差别联系起来。Robert Nielsen还告诉你怎样使用java来计算抵达航班和制造过程的时间。
作者:Robert Nielsen
翻译:Cocia Lin



这篇文章是在我发表过的<计算Java时间>(译者:已经翻译完成)的基础上的。在这里,我列出那篇文章几个你应该熟悉得关键点。如果这几点你不太清楚,我建议你读一下<计算Java时间>,了解一下。
1. Java计算时间依靠1970年1月1日开始的毫秒数.
2. Date类的构造函数Date()返回代表当前创建的时刻的对象。Date的方法getTime()返回一个long值在数值上等于1970年1月1日之前或之后的时刻。
3. DateFormat类用来转换Date到String,反之亦然。静态方法getDateInstance()返回DateFormat的缺省格式;getDateInstance(DateFormat.FIELD)返回指定的DateFormat对象格式。Format(Date d)方法返回String表示日期,例如"January 1,2002."反过来,parse(String s)方法返回以参数字符串表示的Date对象。
4. format()方法返回的字符串格式根据不同地区的时间设置而有所不同。
5. GregorianCalendear类有两个重要的构造函数:GregorianCalerdar(),返回代表当前创建时间的对象;GregorianCalendar(int year,int month,int date)返回代表任意日期的对象。GregorianCalendar类的getTime()方法返回日期对象。Add(int field,int amount)方法通过加或减时间单位,象天数,月数或年数来计算日期。
GregorianCalendar和 时间
两个GregorianCalendar的构造函数可以用来处理时间。前者创建一个表示日期,小时和分钟的对象:

GregorianCalendar(int year, int month, int date, int hour, int minute)

第二个创建一个表示一个日期,小时,分钟和秒:

GregorianCalendar(int year, int month, int date, int hour, int minute, int second)

首先,我应该提醒一下,每一个构造函数需要时间信息中的日期信息(年,月,日)。如果你想说2:30 p.m.,你必须指出日期。
同样,每一个GregorianCalendar构造函数创建一个在时间上使用毫秒计算的对象。所以,如果你的构造函数只提供年,月,日参数,那小时,分钟,秒和毫秒的值将被置0.
DateFormat和时间
你可以使用静态方法getDateTimeInstance(int dateStyle,int timeStyle)来建立DateFormat对象来显示时间和日期。这个方法表明你想要的日期和时间格式。如果你喜欢使用缺省格式,可以使用getDateTimeInstance()来代替它。
你可以使用静态方法getTimeInstance(int timeStyle)创建DateFormat对象来显示正确的时间。
下面的程序示范了getDateTimeInstance()和getTimeInstance()怎样工作:

import java.util.*;
import java.text.*;

public class Apollo {
public static void main(String[] args) {
GregorianCalendar liftOffApollo11 = new GregorianCalendar(1969, Calendar.JULY, 16, 9, 32);
Date d = liftOffApollo11.getTime();
DateFormat df1 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
DateFormat df2 = DateFormat.getTimeInstance(DateFormat.SHORT);
String s1 = df1.format(d);
String s2 = df2.format(d);
System.out.println(s1);
System.out.println(s2);
}
}

在我的电脑上,上面的程序显示如下:

Jul 16, 1969 9:32:00 AM
9:32 AM
(输出根据你所在得地区有所不同)

计算时间间隔
你可能有时需要计算过去的时间;例如,给你开始和结束时间,你想知道制造流程的持续时间。一个出租公司按小时或天数出租东西,计算时间对他们也很有用。同样的,在金融界,经常需要计算重要的支付时间。
将问题复杂化,人类至少是用两种方法计算时间。你可以说一天已经结束当24小时过去了,或者日历从今天翻到明天。我们将讨论我们想到的这两种情况。
时间段,情况 1:严格时间单位
在这种情况中,只有24小时过去,这天才过去,60分钟过去,这个小时才过去,60秒过去,这个分钟才过去,以此类推。在这个方法中,23小时的时间将被认为是0天。
使用这种方法计算时间段,你从计算过去的毫秒开始。为了做到这一点,首先转换每个日期为从1970年1月1日起得毫秒数。你可以从第二个毫秒值中减去第一个毫秒值。这里有一个简单的计算:

import java.util.*;

public class ElapsedMillis {
public static void main(String[] args) {
GregorianCalendar gc1 = new GregorianCalendar(1995, 11, 1, 3, 2, 1);
GregorianCalendar gc2 = new GregorianCalendar(1995, 11, 1, 3, 2, 2);
// the above two dates are one second apart
Date d1 = gc1.getTime();
Date d2 = gc2.getTime();
long l1 = d1.getTime();
long l2 = d2.getTime();
long difference = l2 - l1;
System.out.println("Elapsed milliseconds: " + difference);
}
}

上面的程序打印如下:

Elapsed milliseconds: 1000

这个程序也带来一点混淆。GregorianCalendar类的getTime()返回一个Date对象,Date类的getTime()方法返回从1970年1月1日到这个时间的long类型的毫秒数值。虽然他们的方法名字相同,返回值却不一样!
下面的程序片断用简单的整数除法转换毫秒到秒:

long milliseconds = 1999;
long seconds = 1999 / 1000;

这种方法舍去小数部分转换毫秒到秒,所以1,999毫秒等于1秒,2,000毫秒等于2秒。
计算更大的单位-例如天数,小时和分钟-给定一个时间数值,可以使用下面的过程:
1. 计算最大的单位,减去这个数值的秒数
2. 计算第二大单位,减去这个数值的秒数
3. 重复操作直到只剩下秒
例如,如果你的时间的10,000秒,你想知道这个数值相应的是多少小时,多少分钟,多少秒,你从最大的单位开始:小时。10,000除以3600(一个小时的秒数)得到小时数。使用整数除法,答案是2小时(整数除法中小数舍去)计算剩下的秒数,10,000-(3,600 x 2) = 2,800秒。所以你有2小时和2,800秒。
将2,800秒转换成分钟,2,800除以60。使用整数除法,答案是46。2,800 - (60 x 46) = 40秒。最后答案是2小时,46分,40秒。
下面的Java程序使用上面的计算方法:

import java.util.*;

public class Elapsed1 {
public void calcHMS(int timeInSeconds) {
int hours, minutes, seconds;
hours = timeInSeconds / 3600;
timeInSeconds = timeInSeconds - (hours * 3600);
minutes = timeInSeconds / 60;
timeInSeconds = timeInSeconds - (minutes * 60);
seconds = timeInSeconds;
System.out.println(hours + " hour(s) " + minutes + " minute(s) " + seconds + " second(s)");
}

public static void main(String[] args) {
Elapsed1 elap = new Elapsed1();
elap.calcHMS(10000);
}
}

输出结果如下:

2 hour(s) 46 minute(s) 40 second(s)

上面的程序甚至在时间少于一个小时也可以正确的计算小时数。例如,你用上面的程序计算1,000秒,输出入下:
0 hour(s) 16 minute(s) 40 second(s)
举一个现实世界的例子,下面的程序计算阿波罗11飞到月球使用得时间:

import java.util.*;

public class LunarLanding {

public long getElapsedSeconds(GregorianCalendar gc1, GregorianCalendar gc2) {
Date d1 = gc1.getTime();
Date d2 = gc2.getTime();
long l1 = d1.getTime();
long l2 = d2.getTime();
long difference = Math.abs(l2 - l1);
return difference / 1000;
}

public void calcHM(long timeInSeconds) {
long hours, minutes, seconds;
hours = timeInSeconds / 3600;
timeInSeconds = timeInSeconds - (hours * 3600);
minutes = timeInSeconds / 60;
System.out.println(hours + " hour(s) " + minutes + " minute(s)" );
}

public static void main(String[] args) {
GregorianCalendar lunarLanding = new GregorianCalendar(1969, Calendar.JULY, 20, 16, 17);
GregorianCalendar lunarDeparture = new GregorianCalendar(1969, Calendar.JULY, 21, 13, 54);
GregorianCalendar startEVA = new GregorianCalendar(1969, Calendar.JULY, 20, 22, 56);
GregorianCalendar endEVA = new GregorianCalendar(1969, Calendar.JULY, 21, 1, 9);

LunarLanding apollo = new LunarLanding();

long eva = apollo.getElapsedSeconds(startEVA, endEVA);
System.out.print("EVA duration = ");
apollo.calcHM(eva);

long lunarStay = apollo.getElapsedSeconds(lunarLanding, lunarDeparture);
System.out.print("Lunar stay = ");
apollo.calcHM(lunarStay);
}
}

上面程序输出如下:

EVA duration = 2 hour(s) 13 minute(s)
Lunar stay = 21 hour(s) 37 minute(s)

目前为止,我们计算的基础公式是这样的:1分钟=60秒,1小时=60分,1天=24小时。
"1个月=?天,1年=?天"怎么办?
月份的天数有28,29,30,31;一年可以是365或366天。因此,当你试图计算严格单位的月份和年时,问题就产生了。例如,如果你使用月份的平均天数(近似30.4375),并且计算下面的时间间隔:

* July 1, 2:00 a.m. to July 31, 10:00 p.m.
* February 1, 2:00 a.m. to February 29, 10:00 p.m.

第一个计算结果是1个月;第二个结果是0个月!
所以,在计算严格单位时间的月份和年份是要想好。
时间段,情况 2:时间单位变化
时间单位的变化相当的简单:如果你要统计天数,你可以简单的统计日期变化次数。例如,如果某事15日开始,17日结束,经过2天。(日期先是便到16,再到17)同样的,一个步骤下午3:25开始,4:10 p.m结束,历时1个小时,因为小时数值变了一次(从3到4)。
图书馆经常使用这种习惯计算时间。例如,如果你从图书馆接一本书,我不能占有这本书最少24小时,会认为图书馆这样才给你算一天。而是,我的账号上记录我借书的日期。日期以变成下一天,我就已经结这本书一天了,即使总计不足24小时。
当使用单位的变化来计算时间段,通常感觉计算的时间没有多于一个时间单位。例如,如果9:00 p.m.我借了一本图书馆的书,第二天中午还回去,我能算出我借了这本书一天了。可是,有一种感觉在问:"1天和几个小时呢?"这本说总计借出15个小时,答案是一天还差9个小时呢?因此,这篇文章里,我将以一个时间单位变化计算时间。
单位变化的时间算法
这是你怎样计算两个日期的时间变化:
1. 制作两个日期的拷贝。Close()方法能制作拷贝。
2. 使用日期拷贝,将所有的小于时间单位变化的部分设置成它的最小单位。例如,如果计算天数,那么将小时,分钟,秒和毫秒设置成0。这种情况中,使用clear()方法将时间值设置称他们各自的最小值。
3. 取出较早的日期,将你要计算的单位加1,重复直到两个日期相等。你加1的次数就是答案。可以使用before()和after()方法,他们返回boolean值,来判断是否一个日期在另一个日期之前或之后。
下面的类的方法用来计算天数和月数。

import java.util.*;

public class ElapsedTime {

public int getDays(GregorianCalendar g1, GregorianCalendar g2) {
int elapsed = 0;
GregorianCalendar gc1, gc2;

if (g2.after(g1)) {
gc2 = (GregorianCalendar) g2.clone();
gc1 = (GregorianCalendar) g1.clone();
}
else {
gc2 = (GregorianCalendar) g1.clone();
gc1 = (GregorianCalendar) g2.clone();
}

gc1.clear(Calendar.MILLISECOND);
gc1.clear(Calendar.SECOND);
gc1.clear(Calendar.MINUTE);
gc1.clear(Calendar.HOUR_OF_DAY);

gc2.clear(Calendar.MILLISECOND);
gc2.clear(Calendar.SECOND);
gc2.clear(Calendar.MINUTE);
gc2.clear(Calendar.HOUR_OF_DAY);

while ( gc1.before(gc2) ) {
gc1.add(Calendar.DATE, 1);
elapsed++;
}
return elapsed;
}

public int getMonths(GregorianCalendar g1, GregorianCalendar g2) {
int elapsed = 0;
GregorianCalendar gc1, gc2;

if (g2.after(g1)) {
gc2 = (GregorianCalendar) g2.clone();
gc1 = (GregorianCalendar) g1.clone();
}
else {
gc2 = (GregorianCalendar) g1.clone();
gc1 = (GregorianCalendar) g2.clone();
}

gc1.clear(Calendar.MILLISECOND);
gc1.clear(Calendar.SECOND);
gc1.clear(Calendar.MINUTE);
gc1.clear(Calendar.HOUR_OF_DAY);
gc1.clear(Calendar.DATE);

gc2.clear(Calendar.MILLISECOND);
gc2.clear(Calendar.SECOND);
gc2.clear(Calendar.MINUTE);
gc2.clear(Calendar.HOUR_OF_DAY);
gc2.clear(Calendar.DATE);

while ( gc1.before(gc2) ) {
gc1.add(Calendar.MONTH, 1);
elapsed++;
}
return elapsed;
}
}

你可以在上面的类中补充另外的方法来处理小时和分钟。同样,计算时间段的算法能更高效一些,尤其是时间相隔很长。可是,作为介绍目的,这个算法有短小和简单的优势。
下面的例子使用ElapsedTime类来计算两个日期之间的天使,而后是月数:

import java.util.*;

public class Example {
public static void main(String[] args) {
GregorianCalendar gc1 = new GregorianCalendar(2001, Calendar.DECEMBER, 30);
GregorianCalendar gc2 = new GregorianCalendar(2002, Calendar.FEBRUARY, 1);

ElapsedTime et = new ElapsedTime();
int days = et.getDays(gc1, gc2);
int months = et.getMonths(gc1, gc2);

System.out.println("Days = " + days);
System.out.println("Months = " + months);
}
}

当计算时,上面的程序可能有用,例如,最近的航班。它显示下面的输出:

Days = 33
Months = 2

(OK,关于航班的计算有些夸张;这个天数算法很适合像图书馆借书这样的应用,你看到了她怎样工作)
告诫
在进行时间工作时要谨慎:你看到的时间段的例子,你精确仔细的考虑非常重要。本文介绍了两种通常计算时间段的想法,但是人们能想到的时间段的计算方法仅仅受到人类想象力的限制。
所以,当写一个Java程序的时候,确信你的精确度能让使用和以来这些程序的人满意。同样,彻底的测试程序对处理时间的程序非重重要。
总结
本文是在我的前一篇文章 Java时间计算介绍怎样使用GregorianCalendar 和 DateFormat类处理时间问题的基础上的。你已经看到了两种方法来思考时间段问题和两种相应的途径使用Java来处理时间问题。这里提供的信息,很基础,提供给你一个在Java中处理时间问题的有力工具。

关于作者
Robert Nielsen是SCJP。他拥有硕士学位,专攻计算机教育,并且在计算机领域执教多年。他也在各样的杂志上发表过很多计算机相关的文章。
关于译者
Cocia Lin(cocia@163.com)是程序员。它拥有学士学位,现在专攻Java相关技术,刚刚开始在计算机领域折腾。





Thursday, September 24, 2009

Linux(Ubuntu)下配置SVN的HTTP代理

编辑 ~/.subversion/servers

找到如下几行,去掉注释,编辑相关内容(包括端口、代理地址、代理认证信息等)

[global]
# http-proxy-exceptions = *.exception.com
http-proxy-host = 172.16.204.50
http-proxy-port = 8080
# http-compression = no 有的需要将压缩屏蔽

ubuntu下adb调试android找不到设备的解决方法

最近需要测试几个android上的程序,虽然模拟器也能跑,但是总归没有在手头真机上跑的痛快。
Win下很小白很简单,但是最近CERNET抽风,我没法在win下check out代码,故而转战ubuntu。不过遇到了点小麻烦,就是我没法让adb识别出我已经连接到了真机。。。

首先确认,我已经在G1的settings-applications-development-debug mode里面打勾。而且手机也有提示connected,但是adb死活不认。

最后找到了引用的这篇文章(http://blog.7pas.com/node/ubuntu-android-usb-adb-driver-udev/)的解决方法,一次成形。

以下为引用全文


SDK 上关于如何在 Ubuntu上安装 adb驱动的说明并不详细,经过搜索找到了确实的解决方法,首先按照 SDK 上的说明建立 udev 的 rules 文件,然后:



在 ubuntu 9.04 下通过usb连接 Android设备,使用 adb 时,会返回无法找到设备,解决办法如下:



1) 在终端运行 lsusb

会发现结果有会有如下类似记录:

Bus 001 Device 008: ID 0bb4:0c02 High Tech Computer Corp. 


这时键入



sudo vim /etc/udev/rules.d/50-android.rules


在打开的文件中增加以下文本:



SUBSYSTEM=="usb", SYSFS{"High Tech Computer Corp."}=="0bb4", MODE="0666"


2) 运行以下命令:



sudo chmod a+rx /etc/udev/rules.d/50-android.rules
sudo /etc/init.d/udev restart


3) 在 android sdk 的 tools 目录下运行 (这一步很重要,必须要sudo,否则没效果)


sudo ./adb kill-server
sudo ./adb devices


然后,就可以直接用 adb 来进行操作了。


需要提示的一点,是作者说

在打开的文件中增加以下文本:



SUBSYSTEM=="usb", SYSFS{"High Tech Computer Corp."}=="0bb4", MODE="0666"



其实不必非得写High Tech Computer Corp.因为现在做andorid设备的不止high tech computer corp(htc)一家了。
因此,把High Tech Computer Corp.改成idVendor更为合适


Tuesday, August 25, 2009

iPhone 3GS初体验

俺得说的说的

上午看着Boss粗暴扯开封条,然后捞出3GS,自己手头却忙着和Coder解释这个项目一堆事情如何做……

然后Boss拽了一堆人开会去鸟,然后我就拍了这几张。

白色的3GS,俯视不咋好看,因为会有一圈白边(不是指那个屏幕周围的钢圈)。

屏幕确实要比3G耐油,但是没有达到那么理想的程度,所以还得贴磨砂膜(当然公司用机最后肯定会粗暴处理不会贴膜的)

外观除了屏幕用了阻油技术外,没啥改变。

开机,系统为3.0.1,偶们所有的电脑的XCode均不支持,导致此机器暂时没法用来写程序……(Port口的第一下可是偶捅的哦~)

没觉得快……

兴致盎然地用了相机,发现也就那个多点对焦有点意思,但是放到320w px的摄头上也看不出来有多大改善,可能这种改善只有一路用过来的水果同学才能体会得到吧。

以上。

IMG_9515

以公司iMac脏兮兮的键盘做背景……

IMG_9518

试试多点对焦

IMG_9520 

试试电罗盘

IMG_9521

 

IMG_9522

Monday, August 24, 2009

今天在26路公交上拾到NOKIA 5800XM一部……

[这件事结果非常不错,我当天中午就把这部手机顺利地归还给他的主人了~]

 

 

IMAG0082 IMAG0083

 

嗯……主人是个MM,然后有兄弟就怪罪我为何不要她电话……俺很囧……

 

这样吧……如果那个MM有幸能够看到我这篇Spaces,那么我厚着脸皮烦请您留个联系方式给我吧……………………

Wednesday, August 12, 2009

关于Bluex提示”You have pirated our software”的解决方案

最初先把手机连上电脑 保证电脑和手机是连接状态(即手机出现USB连接的那个图标)
1。下载blue.rar (安装了APP TO SD的下bule1.rar  没有安装过APP TO SD的下载Blue2.rar)
2。解压
3。运行blue1.bat (安装blueX v1.1.1)  手机会重启一次
4。运行blue2.bat (升级blueX v1.1.2)  手机会重启一次
5。完毕
这样的话就不会提示盗版和需要权限之类的
----此教程转自www.gphone-cn.com 的xintrc

Thursday, July 02, 2009

分享:G1彩信发送接收成功

今日中午睡觉闲来无事自己瞎捣鼓,彩信收发成功了。(看来Google没有撒谎,果然实现了2009Q1的升级中提供针对切换APN的补丁)

以下操作均在Cupcake (Firmware V1.5)下完成。

主要的步骤是设定接入点。

删除全部接入点,新建

cmnet

参数为(没有提到的项目均留空)

APN:cmnet

MCC:460

MNC:00

APN Type: default

------------------------------------

cmwap(用于接发彩信)

APN:cmwap

MMSC:http://mmsc.monternet.com

MMS Proxy:010.000.000.172

MMS Port:80

MCC:460

MNC:00

APN Type:mms

 

本人G1为Firmware 1.5, Cyan1.5r2的ROM,已经取得Root权限

Monday, June 29, 2009

G1浏览器崩溃了……又救活了

今天发现用Backup for Root Users恢复设定的时候居然把我很喜欢的hTC Camera程序覆盖了……遂不爽,遂重新刷。

刷完后又去XDA找了Hero的主题。用了几个小时相安无事。发现Twitter上的一个链接,点击,结果调出浏览器无限提示下面的信息,重启无济于事……心想坏了,估计又得刷机……

application_browser_error.jpg

上图为弹出的错误提示,这是从网上找的图(我拍照技术没这么渣)……实际情况就是这样。

 

解决方案也很简单

Menu-Settings-Application-Browser,然后Clear Data

然后再开……然后我的Browser就恢复了……

Sunday, June 28, 2009

用Chrome"代替"Twitter客户端

首先请打开Chrome

将此链接拖到书签栏

然后在Chrome中打开twitter.com,登录。即可看到改变。

 

当然,这个脚本会把twitter.com中的各种reply自动归档,变成气泡型(类似iPhone短信),支持自动刷新(貌似1分钟一次?),不过可能即时效率比不了Twhirl……

Friday, June 19, 2009

如何才能让Chrome和google Bookmark同步呢?

方法很简单

把下面这段当作网址,添加到Chrome的书签内,然后放到快速标签栏上即可

javascript:(function(){var a=window,b=document,c=encodeURIComponent,d=a.open("http://www.google.com/bookmarks/mark?op=edit&output=popup&bkmk="+c(b.location)+"&title="+c(b.title),"bkmk_popup","left="+((a.screenX||a.screenLeft)+10)+",top="+((a.screenY||a.screenTop)+10)+",height=420px,width=550px,resizable=1,alwaysRaised=1");a.setTimeout(function(){d.focus()},300)})();

 

效果如图:

image

 

以后想添加书签,就和Firefox上的Google Toolbar一样,在该页面下,直接点击“添加到Google Bookmark”,就会弹出一个小窗口,写好该写的书签项目,然后添加书签完成后,窗口自动关闭哦。

Thursday, June 18, 2009

The Ultimate Phone for me----T-Mobile G1上手评测

我叛变了,或者说叛逃了。原本我是blackberry阵营的忠实打手和传教士,但是现在时代变了…

原因很简单,我加入了google android阵营。

前日在众多莓园兄弟的支持(其实是让我当小白鼠对吧)下我毅然用手里的崭新8900换了一台依然很新的g1。交易的结果就是我手里多了¥400大米。

废话少说,进入正题。我记得我以前发过一次g1的初体验,那时还在用8820,当时感觉是g1键盘会很不好用,因为当时试用了一下,觉得g1键盘设计很精妙,但是可能为了节约空间导致其键程不足输入感不好。

一、初印象:外壳和质感

但是刚刚拿到手之后我还是觉得g1的手感很不错,这里指的是外壳的质感。我买的美版黑色,磨砂外壳握持感很赞当然不得不说的就是如果不幸挑到了美版咖啡色。。。那么推开键盘后蓝色键盘灯和白色键盘交相辉映会让你很囧的。

其实外壳的质感是要比照片更好的。这点只有真机试用方可知道。

个人觉得外壳比较失败的一点就是背面的喇叭孔。。。怎么看怎么山寨。。。实在不知道htc这个被山寨了很多遍的原创手机厂怎么想起来用的这么个设计。。。

轨迹球毫无疑问的nb和轻盈,没有bb那么大的阻力而且感觉大小适中,应该和8900差不多大。正面版上的挂机、接听、返回和主页键反馈清晰干脆。听筒旁边有消息指示led灯,n种颜色的那种。

屏幕在本机上正合适的大小,分辨率不低,电容多点触摸屏。无边框屏幕设计,利于触摸。

二、屏幕与屏幕键盘

很多兄弟(多数是没有过wm/ppc经历的)可能会奇怪g1的模式。比如:频繁的刷机,没有桌面程序支持下便可独立完成很多功能,其实htc style的很多东西都是这样。包括g1也有ppc上有的“三色屏“也有各种开机组合键(照相+电源键)进入工程模式(就是三色屏),甚至包括“卡刷“和spl都是和ppc极为相似的玩意。扯到这里,我要说的就是屏幕键盘实际上是g1混合了新核心rom后制作出来的第三方rom,有人担心不稳定,真是很多余,android本身比wm稳定,自制rom也非常赞,而且又能开启更多更好的功能,何乐而不刷?

屏幕键盘和iphone相似,而且也支持震动反馈(拆解表明g1有两个震子,一个在上半滑盖屏幕附近负责震动反馈等,一个在照相按键旁负责大振幅振动如电话短信等,双震设计很不常见…)和竖屏横屏键盘自动转换。内置的google输入法联想能力和学习能力很强,很好用。目前还没发现这个google拼音能与pc端同步词库…能的话就无敌了。

三、电池

这个我最开始能发现的缺点肯定是这个无疑了。如果打开3g模式,不管是否处于3g下,其耗电量是3小时30%,我在国贸地铁站附近开始用30%剩余的g1,等到了大钟寺城铁站,电力已经depleted了。

后来经过满电力正常试用(关3g模式,挂twidroid,push gmail),大约1天用掉50%。电力一般。

四、软件

软件不得不说,因为当初的确没意识到google android market会如此迅猛发展起来,而android的软件也如雨后春笋般爆发。

由于移动OMS平台的跟进,很多国内特色的软件有了“官方版本”。比如凯利德导航,比如qq,比如飞信。当然,现在

android上本身软件易于移植,像anfetion这样的飞信软件非常优秀。凯利德则是大家都认为android导航暂时无望的一个惊喜(完美导航啊)。

关于导航,今天特地做了测试,g1搜星非常快,基本上可以说秒搜了。打开凯利德不出几秒就会锁定卫星开始定位。凯利德完完全全从wm上移植过来,功能没有缺失,很不错。

android软件的缺憾可能是im上暂时由于腾讯着手开发qq而导致国内android开发者停止开发android qq。等吧,qq会有的,软件都会有的。

关于软件安装:几乎全部的android软件都可以通过market(内置的ota)安装,而且软件搜索方便,全无兼容性之担忧。

当然,也可以从sd卡上安装,格式为apk。

目前可以通过把sd卡划分出一个ext2分区的方式来使用app2sd(目前多数的rom都内置该模块),也就是装程序到卡上。当然运行的时候还是会读入到内置存储器做缓存。

五、网络应用

mms功能很苹果的缺失了。而且是因为wap和net链接不能共存(软件问题,据说09年底个google补丁解决之)导致的。因此现在收彩信的唯一方法是放弃gmail push和各种同步(联系人和日历与google同步),采用wap接入点…这个俺接受不能,故而放弃彩信接受。不过彩信发送不成问题。

浏览器我要赞。仅次于mobile safari的网络体验!对网页的飞速渲染绝对不是wm上的任何一款浏览器能比的(bb的browser就算了……)。而且对于google内置服务(reader,note,document)更是变本加厉无与伦比的完美支持。

六、操作方式

我对Adnroid大爱的另一个原因就是Android的多任务处理性能太优越了。举个例子:今天下午开着凯立德,挂着Twidroid和飞信,居然这三个程序来回切是毫无迟滞感的。大家不妨设想一下同为192RAM的WM机开凯立德导航+两个网络应用程序会是何等景象?肯定卡……不过目前而言,Android多任务的一个死穴便是只能同时后台6个,而且所有你开过的东西都驻留后台(比如依次打开Messages Gmail Twidroid AnFetion 凯立德和Settings,那么这六个程序都会驻留后台),只能有6个Slot容纳后台程序,第七个程序会把第六个程序挤掉(也就是关闭)。好在目前有TaskManager可以解决这个问题。

至于为什么Settings也会驻留后台当作程序,那就需要依靠Linux图形界面的思维了。按照linux的模式,桌面以及一切GUI都是一个命令行下的程序而已。所以settings就是一个设定手机的程序。

由此看来,如果没用过linux或者macos,那么g1对你来说,想玩转它困难了点。因为很多很高级的功能如果想实现或者想理解那是做什么时候用的话,需要有一定的unix知识。比如很多人到现在也不明白为何要取得root权限…

当然我很喜欢这个能够进入命令行用两条命令代替繁琐点击拖拽来完成工作。更何况linux上存在大量的优秀的终端软件,这些软件恐怕要比带有gui的更容易移植。

暂时先写到这,呵呵,改日上软件推介。

ps:本文在g1上由Documents To Go中的word to go完成。

目前我g1的主要软件列表(rom预装的不算)

twidroid twitter客户端

anfetion 飞信客户端

指南针 无需网络即可依靠内置电磁罗盘确定方向的小软件

凯利德 gps导航软件

anmms 彩信查看器

…………

Friday, June 12, 2009

专利打手SISVEL染指CDMA:每台设备缴纳1美元


Sent to you via Google Reader

专利打手SISVEL染指CDMA:每台设备缴纳1美元

感谢知道TD的好处了吗?的投递


专利管理机构SISVEL CDMA2000今天推出一项新的联合专利授权计划,该计划将就基本的CDMA2000专利,在公平合理、非歧视的条件下向所有用户提供授权。

中国的消费电子企业对于SISVEL并不陌生,近年该公司来多次在欧洲的电子展会上知会德国海关,对中国的MP3等产品进行查抄。华旗、纽曼、台积电等MP3企业,海信、海尔等平板电视企业和手机企业都曾尝受SISVEL挥舞的专利大棒。


Sent from my iPod

Monday, June 08, 2009

President Barack Obama's BlackBerry Has Been Hacked!


下午11:32(3 分钟前)


 


 CrackBerry.com blogs 作者:cate






Obama's BlackBerry

According to FoxNews.com, Kasper Hauser has done the impossible - hacked into President Barack Obama's BlackBerry.  All messages will be copied into a new book that will be released today by publisher Little Brown and Company Obama's Blackberry features sensitive BlackBerry messages from the Commander in Chief, Vice President Joe Biden, Secretary of State Hillary Clinton, California Governator Arnold Schwarzenegger, and even Nuclear Command Control itself.  Really, how could the President be so careless and foolish?  How could this situation seem so... surreal?  Well, maybe because it is.  Fear not, Kasper Hauser is a San Francisco-based comedy group that wrote this book containing intermittent text messages between political figures so don't worry; the future of Western Civilization is not as endangered as we may have thought.  The book's press release clearly states that it "is not endorsed, sponsored, affiliated with, or otherwise authorized by Research in Motion Limited, the owner of the trademark BlackBerry."

Friday, May 22, 2009

iPod Touch2 16GB越狱(Jail Break)手记

iPod Touch(以下简称iTouch)究竟要不要JailBreak,我仅仅犹豫了几秒钟,就决定我需要JailBreak一下。

原因:

1、JailBreak后可以达成多任务处理;

2、JailBreak后可以实现类Unix操作(命令行终端,软件包管理,etc);

3、JailBreak后有N多以前垂涎的软件和游戏可以不花$玩到用到。

JailBreak我用的是redsn0w 0.3,win下操作。

一开始比较曲折,我在学校,没有全局代理,所以每次用redsn0w总是卡在Connecting to server上,然后3次不行之后意识到可能Win下没有全局代理,只得熬到周五回家才破的。

然后还有就是DFU模式。这个没什么难进的,搞不明白为什么那么多小白卡在这里。最简单的方法,就是先开iTunes,把iTouch连上电脑,然后电源键和Home键同时长按,10秒钟后松开电源键而不要松Home,直到iTunes出现“检测到处于恢复模式的iPod”那个对话框后,再松开Home键。这时候机器处于DFU模式,然后直接双击打开redsno0w,出现如下画面

Capture

然后是这样的画面

Capture2

说一下就是,Vista下和Win7下用redsn0w有很高几率卡在上图所示的Waiting for reboot上。

反正我的win7 build 7100就卡在那里了。什么“拔下换个USB口再插上”之类的方法都不管用。最后用家里的装XP SP3的台机一次成功。

所以我想要提醒的就是,最好用XP进行JailBreak,成功率很高。

附几张Jail Break进行中的照片:

IMG00010-20090522-1458

完成Jail Break的台机实际上已经快完蛋了。显示器上的竖条貌似是显示器的毛病(不排除9800SE古董显卡的问题)

IMG00011-20090522-1459

Friday, May 08, 2009

Leaked: OS 5.0.0.93 for the BlackBerry Bold and Curve 8900!

by Kevin Michaluk CrackBerry.com blogs


AT&T's booth at WES had a BlackBerry Bold running OS 5.0.0.93 on it, so it's only fitting that you can too! If you're using a Bold or 8900 and want to get a taste of 5.0, you can follow the links below. Be sure to read through the forums... not all apps are going to work on 5.0 at this time, so you may not want this on your daily driver. Enjoy!! 


*OS Disclaimer - Please Read: Keep in mind this is NOT an official release and as such is not supported by RIM or your Carrier. If you choose to install, do so at your own risk and only if you're comfortable in the process of upgrading and downgrading your device software. It is quite normal during operating system development for certain features to be crippled or disabled while others are tested, and these beta builds often reflect that. They are not always better. Depending on your BlackBerry comfort level, it may be best for you to wait for community feedback on a build before deciding to download and install for yourself or simply wait for the next official release. If you require support, you will find it in our CrackBerry forums via our extremely knowledgeable community base - do not contact your carrier or RIM for Beta OS technical support (their first course of action will be to advise you to downgrade to a supported OS).