Categories
CDMA

CDMA MMS PUSH 彩信通知

这里用的模组是 via威盛的cdma。首先,设置短信通知格式:
AT+CNMI=2,1

用一cdma手机给模组发一条彩信,由于URL 链接较长,网络可能会连续发送多条(常见是 2 条)Wap Push 短信,应根据长短信标准拼接后再做进一步处理。

+CMT:”RAM”,4,186,”000002fdea020602069966084006010008a8000310f130018e0460001880
35000c2820c0008008fc02e11a4189185c1c1b1a58d85d1a5bdb8bdd9b990b9dd85c0b9b5b5ccb
5b595cdcd859d9402d21ebe12320a61113daddde108ccd5b19149040236420da1d1d1c0e8bcbcc4
c0b8c8ccd0b8c4ccdcb8c4c4e8e0c0e0c0bddd85ccbd113daddde108ccd5b1914904022016040c0a8
c02243600c4cccce4c8e0dcc4c8d0d40228003060907031436470a01400e06040d32cc1080″

+CMT:”RAM”,5,63,”000002fdea020602069966084006014c082d000310eb9001130088001880
35000850020000806023808a3dc003060907031436470a01400e06040d32cc1080″

分析一下第一条:

teleserviceId为65002,就可以判断这时一条彩信通知,GSM的是通过分析端口号来做判断。进一步分析,提取到 TP_UD为:

00 03 10 06 A0 01 85 04 18 00 10 01 1F 80 5C 23 48 31 23 0B 83 83 63 4B 1B 0B A34B 7B 71 7B B373 21 73 BB 0B 81 73 6B 6B 99 6B 6B 2B 9B 9B 0B 3B 28 05 A4 3D 7C 24 64 14 C2 227B 5B BB C2 1199 AB 63 22 92 08 04 6C 84 1B 43 A3 A3 81 D1 79 79 89 81 71 91 99 A1 71 89 99 B971 89 89 D1 C181 C1 81 7B BB 0B 99 7A 22 7B 5B BB C2 11 99 AB 63 22 92 08 04 40 2C 08 18 15 18 04 48 6C 01 8999 99 C9 91 C1 B9 89 91 A1 A8 04 50

Wap push短信 PDU 中的 User data,按照短信标准解析,前面部分是 Header信息,如 Msgid、Num_field 等,后面部分是 Chari 内容。Chari 内容需要再进一步解析,中国电信的 Wap Push 短信PDU 中的 User data 里的 Chari 也分为两部分,前半部分是 Header 信息,类似于 User data的 Header 信息,后面部分数据才是 WDP 数据,需要按照 WDP 协议(Wireless Datagram Protocol)进行解析。

WDP

Msg Indetifier:
SUBPARAMETER_ID        8       0000000
SUBPARAM_LEN     8       00000011
MESSAGE_TYPE     4       0001 (Deliver) /0010 (Submit)
MESSAGE_ID  16     -Generated –
HEADER_IND  1       0
RESERVED      3       000

User Data
SUBPARAMETER_ID        8       00000001
SUBPARAM_LEN     8       Number of Octets in this Sub Parameter, not including SUBPARAMETER_ID and SUBPARAM_LEN
MESSAGE_ENCODING   5       00000
MESSAGE_TYPE     0       Ignored
NUM_FIELDS  8       This field shall be set to the number of characters included in this subparameter.

CHARi      Variable   Characters. This shall include NUM_FIELDS occurrences of this field
RESERVED      0-7   All zeroes used for padding.

(This field shall contain the number of bits required to make the entire subparameter an integer number of octets in length.

CHARi
MSG_TYPE       8       00000000
TOTAL_SEGMENTS         8       Total  number of segments
SEGMENT_NUMBER       8       The Segment Number
DATAGRAM      (NUM_FIELDS – 3)*8         Segmented WDP Datagram

WDP Datagram Segment
SOURCE_PORT       16     Source Port
DESTINATION_PORT       16     Destination Port(2948)
DATA        N*8  N bytes of Data from the Layer above WDP

按照上面的格式,解析CHARI就是

00 02 00 23 F0 0B 84 69 06 24 61 70 70 6C 69 63 61 74 69 6F 6E 2F 76 6E 64 2E 77 61 70 2E 6D 6D73 2D 6D 65 73 73 61 67 65 00 B4 87 AF 84 8C 82 98 44 4F 6B 77 78 42 33 35 6C 6452 41 00 8D 9083 68 74 74 70 3A 2F 2F 31 30 2E 32 33 34 2E 31 33 37 2E 31 31 3A 38 30 38 30 2F77 61 73 2F 444F 6B 77 78 42 33 35 6C 64 52 41 00 88 05 81 03 02 A3 00 89 0D 80 31 33 33 39 3238 37 31 32 3435 00 8A

00 MSG_TYPE
02 TOTAL_SEGMENTS
00 SEGMENT_NUMBER
23 F0 SOURCE_PORT
0B 84 DESTINATION_PORT
69 06 24 61 70 70 6C 69 63 61 74 69 6F 6E 2F 76 6E 64 2E 77 61 70 2E 6D 6D73 2D 6D 65 73 73 61 67 65 00 B4 87 AF 84 8C 82 98 44 4F 6B 77 78 42 33 35 6C 6452 41 00 8D 9083 68 74 74 70 3A 2F 2F 31 30 2E 32 33 34 2E 31 33 37 2E 31 31 3A 38 30 38 30 2F77 61 73 2F 444F 6B 77 78 42 33 35 6C 64 52 41 00 88 05 81 03 02 A3 00 89 0D 80 31 33 33 39 3238 37 31 32 3435 00 8A DATA

这是第一条的 DATA,同样分析第二条的 TP_UD为:

00 03 10 06 A0 01 0A 00 40 00 10 0C 04 70 11 47 B8

CHARI为

00 02 01 80 8E 02 28 F7

DATA为80 8E 02 28 F7

和第一条合并起来,那么DATA就是

69 06 24 61 70 70 6C 69 63 61 74 69 6F 6E 2F 76 6E 64 2E 77
61 70 2E 6D 6D73 2D 6D 65 73 73 61 67 65 00 B4 87 AF 84 8C 82 98 44 4F 6B 77 78 42 33 35 6C 6452 41 00 8D 9083 68 74 74 70 3A 2F 2F 31 30 2E 32 33 34 2E 31 33 37 2E 31 31 3A 38 30 38 30 2F77 61 73 2F 444F 6B 77 78 42 33 35 6C 64 52 41 00 88 05 81 03 02 A3 00 89 0D 80 31 33 33 39 3238 37 31 32 3435 00 8A80 8E 02 28 F7

61 70 70 6C 69 63 61 74 69 6F 6E 2F 76 6E 64 2E 7761 70 2E 6D 6D73 2D 6D 65 73 73 61 67 65 00 == application/vnd.wap.mms-message

B4 87: Push Flags: 87
AF 84: X-Wap-Application: 04
8C 82: X-Mms-Message-Type: m-notification-ind
98 44 4F 6B 77 78 42 33 35 6C 6452 41 00   Transaction-ID: DOkwxB35ldRA
8D 90 : X-Mms-mms-version : 1.0
83 68 74 74 70 3A 2F 2F 31 30 2E 32 33 34 2E 31 33 37 2E 31 31 3A 38 30 38 30 2F77 61 73 2F 444F 6B 77 78 42 33 35 6C 64 52 41 00  Content-location:http://10.234.137.11:8080/DOkwxB35ldRA

88 05 81 03 02 A3 00 expirty:
89 0D 80 31 33 33 39 3238 37 31 32 3435  From: 1339287124
8A80  message-class:”personal”
8E 02 28 F7  message-size:

注: B4,AF,8C,98 等,是高位加1(0x80)之后的content type.

Categories
CDMA

CDMA SMS pdu解码

去年玩过via cdma模组,刚开始对cdma sms pdu真是一脸茫然,意识到我也可能不会长时间做这个,网上这类帖子少之又少,体会初学者的辛苦,重新翻尸体,记录下来。

收到两条短信,现在用AT把它们读取出来。

at+cmgr=5
+CMGR:5,”REC UNREAD”,”15338896020″,”UNKNOWN NUMBER”,”N/A”,176

“0000021002020702c54ce225a8a80601c0089d00031001e801
8e2230018801780193108b09fb087b317b012b6a080162e38c8e6
3b422e07b65980162b942e872e4b3b4246f7a70500162e54bbf9a7
053f67c7e3801729f544c0b108bb423918a75d00163317a70033b0
ae07ce3e00162b943108bb4236b54158a71680162ff5a7283b423
71c33b2b71c29dd80173108b09fb087b317c1a933cb80162b943659
b6a0bb4227122e5c00306081229192611″

at+cmgr=21
+CMGR:21,”REC UNREAD”,”15338896020″,”UNKNOWN NUMBER”,”N/A”,96

“0000021002020702c54ce225a8a806014c084d00031001f8013
e20f00190017801900162dfca7004b1acb1abb4239614c67001629
63b2b12b9827ae310c001729f544c0b108bb423918a75d00163317
a70029f52e07cf0f80306081229192616”

[deli@deli example]$ ./test_pdu_decode
0000021002020702c54ce225a8a80601c0089d00031001e8018e22
30018801780193108b09fb087b317b012b6a080162e38c8e63b422
e07b65980162b942e872e4b3b4246f7a70500162e54bbf9a7053f67
c7e3801729f544c0b108bb423918a75d00163317a70033b0ae07ce3
e00162b943108bb4236b54158a71680162ff5a7283b42371c33b2b7
1c29dd80173108b09fb087b317c1a933cb80162b943659b6a0bb422
7122e5c00306081229192611
sms context == 1/2我愿意是急流,山里的小河,在崎岖的路上,岩石上经过.只要我的爱人,是一条小鱼,在我的浪花中,快乐的游来游去.我愿意是荒林,在河流的两岸
SM_ENCODING == 4
TPA == 15338896020
SCTS == 19:26:11 12/29/08

[deli@deli example]$ ./test_pdu_decode
0000021002020702c54ce225a8a806014c084d00031001f8013e20f
00190017801900162dfca7004b1acb1abb4239614c6700162963b2
b12b9827ae310c001729f544c0b108bb423918a75d00163317a700
29f52e07cf0f80306081229192616
sms context == 2/2,对一阵阵的狂风,勇敢地作战.只要我的爱人,是一只小鸟
SM_ENCODING == 4
TPA == 15338896020
SCTS == 19:26:16 12/29/08

PDU串解析

CDMA的pdu格式与GSM的相差很多,不能直接用肉眼看出来。第一条内容比较长,就拿第二条pdu串来分析吧。
1.首先将PDU串打成PDU包
将PDU串相邻的两个ascii字符拼凑成一个8bit数据

如下:
00 00 02 10 02 02 07 02 c5 4c e2 25 a8 a8 06 01 4c 08 4d 00 03 10 01 f8 01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8 03 06 08 12 29 19 26 16

消息传送类型: 0x00 point to point message(表示点对点消息)

下面的内容为短消息的各个字段 每个字段分为三个部分: 字段类型(ID)(8bit)、字段长度(Length)(8bit)和字段内容.

第一个字段: 00 02 10 02
0x00, 表示uTeleserviceID字段
0x02, 字段长度,该长度必须为2,否则为错误的pdu信息

字段内容为:0x1002,十进制是4098,

第二个字段: 02 07 02 c5 4c e2 25 a8 a8
0x02, SMS_TL_ORIG_ADDR 表示 (短信发送地址)
0x07, 字段长度为7
字段内容: 02 c5 4c e2 25 a8 a8
只看前面几个 02 c5 4c e2的:
0000 0010 1100 0101 0100 1100 1110 0010 0010
取第一个bit 0 表示 RIL_CDMA_SMS_DIGIT_MODE_4_BIT 是4bit压缩
第二个bit 0 表示 RIL_CDMA_SMS_NUMBER_MODE_NOT_DATA_NETWORK
下来8个bit 是 00 0010 11 = 11,表示号码长度 为11
由于是4bit压缩 ,后面44个bit(4*11)表示号码,解析出来是
15338896020

第三个字段: 06 01 4c
表示SMS_TL_BEARER_RPLY_OPT

第四个字段:08 4d 00 03 10 01 f8 01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8 03 06 08 12 29 19 26 16

0x08, 表示SMS_TL_BEARER_DATA字段(短信内容)
0x4d,字段长度为77

这个字段也分成各个子字段:

第一子字段: 00 03 10 01 f8
0x00
Mesage Id
0x03 内容长度
10 01 f8  === 0001 0000 0000 0001 1111 1000
0001 表示 DELIVER 短信
0000 0000 0001 1111表示 message id.
紧接后面的 1, 表示HEADER_IND

第二个子字段:01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8
0x01, 字段类型
0x3e(62),字段长度
20 f0 01 === 0010 0000 1111 0000 0000 0001
0x20 的前5个bit为00100, 为0x04, 表示短信编码方式为RIL_CDMA_SMS_ENCODING_UNICODE (UNICODE)
0x20 的后3个bit, 0xf0的前5个bit,为 000 1111 0, 即0x1e (30),表示有30个UNICODE 字符。0xf0的后3个bit,0x01的8个bit,再加上0x90的前5个bit,

0000 0000 0011 0010 拼成一个16位数是 0x0032 表示字符 :2,在vim下了解一个字符的16进制码很简单,光标在该字符,按ga,底端显示结果如下:

<2>  50,  Hex 32,  Octal 062                                  2,1           All

依次下去,内容就是上面运行./test_pdu_decode 的结果: 2/2,对一阵阵的狂风,勇敢地作战.只要我的爱人,是一只小鸟

第三个子字段: 03 06 08 12 29 19 26 16

这是一个时间戳字段: 08年12月29号19时26分16秒(短消息发送时间)

字符串分析结束。当然,还有很多可选项在这条短信没有加上,更完整的SMS格式,请参考CDMA SMS standard on 3GPP2 website.

实际编码时,一个while循环遍历,再加上switch简单的状态机即可。

长短信何在?

用的这个模组,不支持长短信,厂家回答“作了预处理,把User Data Header去掉了,因为客户一般不愿意自行处理这个User Data Header,他们只要内容、号码等其它信息。所以,模块送出的PDU中不含有User Data Header。”

为实现长短信的拆分和组合功能,终端应支持 IS637C 协议中关于长短消息处理的参数 HEADER_IND,以及在短消息数据中增加对 User Data Subparameter 参数增加用户数据消息头(User Data Header)和短信拆分、组合的处理。HEADER_IND 为消息头标识位,用于指示 User Data Header 是否包含消息头, 若包含消息头则 HEADER_IND 设置为’1’,否则设置为’0’。具体的拆分与组合,请参考IS637C,或 《中国电信CDMA终端需求规范-SMS分册-V1.0》。需要说明的是,对长短信的处理,有的CDMA模组厂家为了让用户省事,帮你处理了用户数据头,正如前面所看到的,自动加上(1/2), (2/2)等,若想自己手动解析,务必跟模组厂家沟通确认好。

Categories
他山之石

YY电视台:QQ 发布一天腾讯内部交流会内幕流出,马化腾主持

文章来源:http://www.androidin.net/bbs/android-75655-1-1.html

时间:2010年3月30日
与会人员:腾讯软件开发中心,客户服务部
主持人:马化腾

马化腾:开发部的同事加班加点终于赶在愚人节前夕发布了QQ.APK,我很满意。大家辛苦了。
开发部经理:(讪笑)没啥,就是安排个实习生用了一天时间把QQmini重新封装为apk而已,呵呵
实习生:(不好意思地)对啊,昨天经理给了我QQmini,然后我找美工小王设计了几张图片披,就编译成apk罢了
客户部经理:(为难地)马总,我这有个情况,才发布一天不到,用户的投诉已经挤爆了,全部是负面的。
开发部经理:是啊,我上各个手机论坛溜达,用户很不满意,在不同程度地批评、诅咒、嘲讽我们。

马化腾:(皱着眉头)你们两个经理,怎么说也和我一起混了十年了,还准备把你们提为副总的,怎么没点悟性?
开发部经理:啊?怎么了?
客户部经理:不明白啊…
实习生:我觉得这个Android的开发方案是公司有意为之,故意造成这种效果的。

马化腾:(颔首微笑)嗯,好,没想到你新来炸到居然有这一层领会。
马化腾:(顿了顿)我给你们讲个案例。有两个卖包子的,包子的水平都很高。其中一个一开张就拿出绝活把包子的看家本事都招呼出来,但顾客增长缓慢,而且他再推出新品种的东西反响不强烈。另一个人开张时做出很差的包子,买的人很少,可是他一周一个新品种,而且每一个新品种都比前一周有明显进步,顾客越来越多,甚至都在盼下一周他能推出什么好东西。
马化腾:(笑着说)IT与传统行业本质完全相同。我们其实就是卖包子的。

开发部经理:哦,您的意思是在开始做得差,用户才有慢慢满意的进步感?
客户部经理:我明白了,这样用户才会感到自己的需求不断被被满足,而QQ软件也一天比一天好,有盼头。
实习生:我想马总最看重的还是下载量,因为对前一个版本有不满之处,因此下一个版本更新,用户会蜂拥而至,卸载旧的,下载新的安装。这样我们腾讯的下载量在数据上就非常好看了,做商业报告书也能风风光光。要是一开始就是完美的,很多人赖着不更新,我们向谁要下载量?怎么维系我们向媒体公布的1亿用户同时在线的数据?

马化腾:(吃惊地)我实在不敢相信你是一个实习生!深知吾意啊!
实习生:马总您过奖了,我其实从手机中悟出的,如果手机太完美,用户就不会想换机,企业咋赚钱?
开发部经理:唉,我终于明白进化论了,产品得有从差到好的过渡过程,没有这个过程,用户是培养不起来的。
客户部经理:明白是明白了,只是我们客户部就要为这个过程不停为用户陪笑脸罢了。

实习生:我已经在开发时为这个做好了未来一两个版本的预设,大家看到软件的设置界面只有三个大图标按钮:“QQ邮箱”,“设置”,“网址收藏”,但其实我早已做好了一批图标是准备放在这个界面的,大家可解压.apk看里面的图片目录,就能看到很多新功能图片已经做好备用的了。功能模块也已经写好了,就等着公司决定发布下一个版本时,我直接把图标放上去,把功能开关打开,不费吹灰之力,一个新版本就做好了。
开发部经理:(不可思议的)你用一天时间就完成了这个?
实习生:不是啊,从我最早看公司下达的APKQQ的开发计划,我就已经大概知道了会怎么发展,为了减轻自己工作量,在开发时能少加班,我就提前准备喽!呵呵
马化腾:后生可畏!你比当年的我有才多了。
实习生:其实我在玩手机时装另一些系统的手机QQ时我就已经知道了呀,嘻嘻,您还不知道吧?在还没有进公司时,我作为一个手机玩家,在论坛上骂QQ不会比其他人少呢,呵呵。

马化腾:哈哈,好,非常好!
实习生:其实,我在开发第一个版本的QQ.apk时,已经故意设定了一些Bug,比如执行速度比较卡,比较费流量,等等。这样在下一个版本时,除了新添加一些功能模块,我还能把这些BUG给堵住,然后写在软件更新日志里,这样用户就会觉得我们很注重他们的反馈,具有不断锐意进取的企业精神了。

马化腾:(长叹一声)你现在这个职位实在是屈才了。现在我决定,腾讯互联网软件开发中心的执行总经理一职由你担任,年薪80万不含年终奖,配粤迪 A6L 2.0T 一台,网络软件的开发由你全权把控,这个担子我今天就交给你了。
开发部经理:(一脸媚笑)小王。。。啊不,王总,恭喜你呀!不要忘了提携小弟我呀……
实习生:(冷笑一声,附身过去在他耳边说)陈经理,我入职以来帮你做的私单,你吞掉了本应我的那一份18万吧?限你一天内打我帐上,同时以后我有私单你必须无条件支持我,你做的全部私单资料我那里有备份,你要是不识相,哼哼…
开发部经理:(庐山瀑布汗)是是,小的照办。。。

实习生:马总,我已经起草了apk版QQ的发展大纲,Google退出对我们正好是一次不错的炒作机会,我们两找个地方待我详细跟你说说。
马化腾:满意地,好。

客服部经理在临走前叹一口气说:网友个个都说QQ是聊天的工具,其实无知的网友只是被工具了,他们的一切反应均在我们的预料中,所以发财的是我们腾讯,网友只能装着个差强人意的QQ在那里骂骂咧咧。。。。

Categories
PHP

Broncho网站访问速度优化

前些时候,据网友反应,Broncho论坛访问很慢,开始觉得服务器在美国,慢是正常的,加上其他事情多,也没在意。昨晚在宿舍打开了 bbs.broncho.cn,超过了30秒还没显示,不耐烦。听说eoe android 的网站也搬到了美国,对比测试一下,eoe访问速度比broncho快多了,于是今天计划优化一下。网站流量比较小,就一台主机,没计划做cache,更谈不上CDN了,于是只好做一些小局部优化。

优化原则,当然是Yahoo的 Best Practices for Speeding Up Your Web Site
Yahoo的做法甚至是有些“变态”了,我还发现有其他更变态的优化 🙁
首先,用雅虎的YSlow工具测试一下,看看瓶颈在哪,才好下手。YSlow是一个Firefox插件,这个插件依赖于Firebug插件,web开发人员对后一个大家应该很熟悉了。

1. 服务器端apache使用mod_deflate压缩页面

我们服务器是fedora 8,自带的apache也早装有mod_deflate,在http.conf配置文件添加以下内容即可。

<IfModule mod_deflate.c>
	DeflateCompressionLevel 7
	AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
	AddOutputFilter DEFLATE css js
</IfModule>

在http://www.whatsmyip.org/http_compression/页面测试,结果如下:

http://bbs.broncho.cn is gzipped

Original Size: 73.51 KB
Gzipped Size: 16.64 KB
Data Savings: 77.36%

效果非常明显。还有一个网站http://www.port80software.com/products/httpzip/compresscheck 它的作用是检测你的网站是否被压缩,以及压缩比率等。 用firefox与chrome分别打开broncho论坛,firefox显得有点慢,chrome哇啦哇啦的页面就显示了,chrome不愧号称速度是最快的浏览器。

2. 配置 Apache Etag
用Apache的mod_expires 模块来设置。

<IfModule mod_expires.c>
        <filesmatch "\.(jpg|gif|png|css|js)$">
                ExpiresActive on
                ExpiresDefault "access plus 2 month"
        </filesmatch>
</IfModule>

加上这个后,broncho.cn首页的Grade由C升到B,Overall performance score由79变为88!,好吉利的数字,我喜欢!

3. 合并压缩 css,javascript文件
在broncho首页,有两个css
<link href="/css/broncho_v1.css" rel="stylesheet" type="text/css" />

<link href="/css/inlay.css" rel="stylesheet" type="text/css" />
于是把他们合并在一起,以减少 http 请求次数。

有一个css在线压缩工具:
http://www.cssdrive.com/index.php/main/csscompressor

压缩后,可以选择把注释去掉,大概是这样:
html{background:#ccc; font-size:13px; margin:0}
body{margin:0; font-family:Arial; color:#333; background:url(/images/android2-bg.gif) center repeat-y}
div.body-wide{background:#fff; width:100%}

就是每个标签的属性,都写在同一行上,有的公司就要求这样。我还是坚持这样的风格:

/* $Id: broncho_v1.css 215 2010-02-01 09:06:21Z deli $ */

html {
	background:#ccc;
	font-size:13px;
	margin:0;
}
body {
	margin:0;
	font-family:Arial;
	color:#333;
	background:url(/images/android2-bg.gif) center repeat-y;
}
div.body-wide {
	background:#fff;
	width:100%;
}

主要考虑维护修改方便,不好之处就是每修改一次,都得重新压缩一次。JavaScript用YUI Compressor压缩。

4. 减小 html页面
用tab键进行代码缩进,以节约代码大小,这个可能比较变态。
用2个空格缩进的index.html:
[deli@athena html]$ ll index.html
-rw-rw-r–. 1 deli deli 5816 2010-06-22 10:40 index.html

替换为tab之后的index.html:
[deli@athena html]$ ll index.html
-rw-rw-r–. 1 deli deli 5342 2010-06-22 11:08 index.html
index.html文件本身就比较小,大约减少0.5K这样,效果不是很显著。

5. phpbb论坛优化
broncho论坛采用 phpbb,前段时间对w3c鬼迷心窍,为了使得firefox右下角 Html Validator大红叉去掉,把一些插件的@import 全部写到了overall_header.html,这样首页都要把这些css,js全部加载,装七七八八的插件都堆在overall_header.html,自然会变慢。作为折衷考虑,只好把这些js,css放在真正需要的页面。

phpbb本身确实没什么大的优化了,模板解析,sql查询,都放在cache里,如果可以优化的话,phpbb的开发人员早就把这个问题搞定。记得之前做过CDN,服务器内存都是4G以上,以空间换时间,把很多文件映射的内存中,所以也试试用tmpfs来存放phpbb的 cache,php session。

#phpbb cache:
mkdir /dev/shm/cache
chmod 1777 /dev/shm/cache/
mount --bind /dev/shm/cache/ /var/www/html/forum/cache/

#php session:
mkdir /dev/shm/session
chmod 1777 /dev/shm/session/
mount --bin /dev/shm/session/ /var/lib/php/session/ 

6. 其他杂项
* img使用 width 和 height 属性来定义图像尺寸,以便图像被更快地显示。
* 网址后加斜杠

参考:
1.《如何提高网站访问速度 从30秒到3秒的改变》,不知道作者是谁,大家可以搜索一下。
2. oasisfeng phpBB论坛优化拾零
3. Apache Cache Last-Modified、Expires和Etag相关工作原理

Categories
Android

Protocol Buffers in Android

Protocol Buffers in Android

无意中看到android market调试Log信息:”Lcom/google/common/io/protocol/ProtoBuf;”, 觉得好奇,搜索一下,ProtoBuf其源代码位于 external/protobuf/src/com/google/common/io/protocol,这个可不同于com.google.protobuf 包,后者是Google标准官方实现,com.google.common.io.protocol是Android平台上的,提供的接口,可以在这里查阅 http://www.androidjavadoc.com/m5-rc15/com/google/common/io/protocol/ProtoBuf.html

在 cupcake源代码目录下搜索ProtoBuf,没有找到使用ProtoBuf的相干代码。目前我发现只有android market使用这个库,market的数据交换格式不是什么xml或json,当然采用Google自家发明的Protocol Buffers。

update: 2010/08/19: 下载了 Android 2.2的代码,发现external/protobuf/目录不见了,被整进了 GoogleServicesFramework.apk 这个包,美曰其名: Google 服务框架。

Pages: Prev 1 2 3 ... 12 13 14 15 16 17 18 19 20 21 22 Next