<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>软件设计</title><link>http://blog.vckbase.com/jzhang/category/953.html</link><description>面向对象软件设计，设计模式，软件框架设计和学习。</description><managingEditor>jzhang</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>jzhang</dc:creator><title>习惯的力量真可怕</title><link>http://blog.vckbase.com/jzhang/archive/2010/03/15/41164.html</link><pubDate>Mon, 15 Mar 2010 09:30:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2010/03/15/41164.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/41164.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2010/03/15/41164.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/41164.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/41164.html</trackback:ping><description>做了太久的php,python，习惯了加print调试。今天写一小段C#代码，发现不工作后就添加MessageBox调试。&lt;BR&gt;直到突然顿悟C#有一个强大的调试器，我为什么要用MessageBox?&lt;BR&gt;&lt;BR&gt;习惯的力量真可怕，可怕到好东西摆在面前都看不见。我们如果在日常工作中习惯低效，重复，混乱，也会把这个&lt;BR&gt;当做理所当然的，并且拒绝探索更好更有效的方法吗？&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/41164.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>Google Go</title><link>http://blog.vckbase.com/jzhang/archive/2009/11/16/39850.html</link><pubDate>Mon, 16 Nov 2009 01:18:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2009/11/16/39850.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/39850.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2009/11/16/39850.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/39850.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/39850.html</trackback:ping><description>golang.org被屏蔽了，修改host文件如下&lt;BR&gt;&lt;BR&gt;74.125.67.141 golang.org&lt;BR&gt;74.125.67.141 www.golang.org&lt;BR&gt;&lt;BR&gt;这个语言有些新鲜特点，比如&lt;BR&gt;内置的并发routine&lt;BR&gt;没有继承只有接口&lt;BR&gt;强类型&lt;BR&gt;反射&lt;BR&gt;编译速度快&lt;BR&gt;运行性能比C只少20%。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;有趣的是golang.org主页的hello world例子里是中文的&lt;BR&gt;fmt.Printf("Hello, 世界\n")&lt;BR&gt;&lt;BR&gt;我猜测是判断了ip来源或者浏览器语言设置，google总是很逗。&lt;BR&gt;&lt;BR&gt;比较糟糕的是Go居然不支持windows，有些人为此叫爽，但是我认为这样做很傻。&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/39850.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>代码评审会议最重要的原则</title><link>http://blog.vckbase.com/jzhang/archive/2009/10/27/39610.html</link><pubDate>Tue, 27 Oct 2009 09:41:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2009/10/27/39610.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/39610.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2009/10/27/39610.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/39610.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/39610.html</trackback:ping><description>会议的被考核者不是代码作者，而是其他评审人员。被要求参加会议而不能提供有价值建议的，视为不合格。&lt;BR&gt;&lt;BR&gt;只有这样才能避免评审会变成众人对一个人的围攻，也可以避免怕得罪人而不敢开口。而最重要的是防止了&lt;BR&gt;代码作者感觉到被贬低。同时，也能保证会议的质量，参加评审的人不是敷衍了事，真正的通过代码评审提高&lt;BR&gt;软件代码质量，提高个人编程水平。&lt;BR&gt;&lt;BR&gt;这样的会议开过几次，秉承这样的原则，效果很不错。&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/39610.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>一篇给公司内部做的Python培训</title><link>http://blog.vckbase.com/jzhang/archive/2009/10/16/39537.html</link><pubDate>Fri, 16 Oct 2009 08:56:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2009/10/16/39537.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/39537.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2009/10/16/39537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/39537.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/39537.html</trackback:ping><description>效果还可以，对python不了解的人会由此对python的强大留下深刻的印象:)&lt;BR&gt;访问google doc:&lt;BR&gt;&lt;A href="http://docs.google.com/present/edit?id=0AUYW-ffwtjk6ZHFkdnRuM18xbmRzc2p3Y3A&amp;amp;hl=en"&gt;http://docs.google.com/present/edit?id=0AUYW-ffwtjk6ZHFkdnRuM18xbmRzc2p3Y3A&amp;amp;hl=en&lt;/A&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/39537.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>对软件开发流程改进的一些思考</title><link>http://blog.vckbase.com/jzhang/archive/2009/07/12/37874.html</link><pubDate>Sat, 11 Jul 2009 23:40:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2009/07/12/37874.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/37874.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2009/07/12/37874.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/37874.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/37874.html</trackback:ping><description>1.文档的目的是为了交流，是从一个部门/角色到另一个部门/角色的信息传递。而交流最有效的方式是面对面的交流。&lt;BR&gt;   所以花大量精力编写文档，然后将成稿交付下一个环节，等待反馈，再修改，再反馈，效率是低下的。目前我们公&lt;BR&gt;   司有一些可以说就存在这样的问题。&lt;BR&gt;   而另一种情况是没有经过思考就开始和下一个环节交流，这个过程也是杂乱低效的。&lt;BR&gt;   所以，我以为，最合适的信息传递方法是，上游先形成一份简要的文档，描述核心的想法，然后和下游部分通过面对&lt;BR&gt;   面，或者IM的方式讨论，共同完成细节。然后由上游部门将讨论结果整理成为文档，由下游部分确认。&lt;BR&gt;   例子：市场部门的需求定义，应该在较早期就和开发部门进行高效率的讨论。&lt;BR&gt;   开发部门的设计文档，也应该在早期邀请测试部门加入。&lt;BR&gt;   &lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/37874.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>单元测试</title><link>http://blog.vckbase.com/jzhang/archive/2009/04/13/36885.html</link><pubDate>Mon, 13 Apr 2009 07:41:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2009/04/13/36885.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/36885.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2009/04/13/36885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/36885.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/36885.html</trackback:ping><description>1. 严禁巨大，功能不单一的头文件。比如整个项目公用的project.h，什么都往里面放。&lt;BR&gt;2. 禁止跨dll的export全局变量。 限制全局变量。&lt;BR&gt;3. 输出不定的函数，比如void getcurrentdatestring(char* sdate)&lt;BR&gt;返回值与当前时间有关，如何 assert ？所以，单元测试并不能面面俱到。&lt;BR&gt;4. tdd方式，unit test需要创建很多桩.先写代码的方式则不需要&lt;BR&gt;5. 涉及到网络，文件，数据库的单元测试不好做，用系统测试代替。但是要尽量把这部分分割开来。&lt;BR&gt;    同理应用到gui上&lt;BR&gt;6. 只有实际做了，才会有体会。&lt;BR&gt;7. 类的私有方法无法测试，说私有方法不需要测试的是装傻。一个办法是把私有方法变成其他类的共有方法。&lt;BR&gt;When really doing TDD (i.e. writing the test code before writing the functional code, and then refactoring the code) private methods are guaranteed to be test covered. &lt;BR&gt;通过共有接口调用的私有方法并不一定能覆盖全部路径，这也正是单元测试的意义，否则黑盒测试就可以代替单元测试了。&lt;BR&gt;8. 类的封装性和单元测试矛盾。在类的私有方法中，绝大部分都是和类的属性相关的，这些私有方法无法&lt;BR&gt;    被独立成另一个类。 值得思考。&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/36885.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>记录一些设计模式</title><link>http://blog.vckbase.com/jzhang/archive/2008/12/03/35813.html</link><pubDate>Wed, 03 Dec 2008 06:11:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2008/12/03/35813.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/35813.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2008/12/03/35813.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/35813.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/35813.html</trackback:ping><description>还没有整理，都不是面向对象的。&lt;BR&gt;1. 将一个需要长时间执行的函数分开时间片执行&lt;BR&gt;    a) callback function&lt;BR&gt;    b) yield&lt;BR&gt;2. 在单线程程序里模拟线程&lt;BR&gt;    a) Active Object&lt;BR&gt;3. 进程/线程间通讯&lt;BR&gt;    a) queue&lt;BR&gt;    b) socket&lt;BR&gt;4. 表驱动&lt;BR&gt;&lt;BR&gt;欢迎大家补充&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/35813.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>刨乐1.0发布</title><link>http://blog.vckbase.com/jzhang/archive/2007/07/02/27161.html</link><pubDate>Mon, 02 Jul 2007 01:10:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2007/07/02/27161.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/27161.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2007/07/02/27161.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/27161.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/27161.html</trackback:ping><description>刨乐是我过去半年开发的基于S60第二版的手机软件，用于在通话过程中播放背景音乐。&lt;BR&gt;支持mp3，支持自定义情景模式和热键，有S60第二版和第一版手机的朋友可以安装&lt;BR&gt;看看:)&lt;BR&gt;下载地址：&lt;BR&gt;&lt;BR&gt;&lt;A href="http://www.poporz.com/downloads/poporz.sis"&gt;http://www.poporz.com/downloads/poporz.sis&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;网站：&lt;BR&gt;&lt;A href="http://www.poporz.com"&gt;http://www.poporz.com&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;欢迎给我提意见，第一版还不完善，需要持续改进。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/27161.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>AMR格式和在s60上的解码</title><link>http://blog.vckbase.com/jzhang/archive/2007/06/18/26949.html</link><pubDate>Mon, 18 Jun 2007 03:35:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2007/06/18/26949.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/26949.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2007/06/18/26949.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/26949.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/26949.html</trackback:ping><description>AMR 文件格式&lt;BR&gt;&lt;BR&gt;AMR 有8种采样率，分别是&lt;BR&gt;&lt;BR&gt;Mode 0 - AMR 4.75 - Encodes at 4.75kbit/s&lt;BR&gt;Mode 1 - AMR 5.15 - Encodes at 5.15kbit/s&lt;BR&gt;Mode 2 - AMR 5.9 - Encodes at 5.9kbit/s&lt;BR&gt;Mode 3 - AMR 6.7 - Encodes at 6.7kbit/s&lt;BR&gt;Mode 4 - AMR 7.4 - Encodes at 7.4kbit/s&lt;BR&gt;Mode 5 - AMR 7.95 - Encodes at 7.95kbit/s&lt;BR&gt;Mode 6 - AMR 10.2 - Encodes at 10.2kbit/s&lt;BR&gt;Mode 7 - AMR 12.2 - Encodes at 12.2kbit/s&lt;BR&gt;&lt;BR&gt;每种格式对应的帧的大小如下。&lt;BR&gt;CMR Mode Frame size (bytes)&lt;BR&gt;0 AMR 4.75 13&lt;BR&gt;1 AMR 5.15 14&lt;BR&gt;2 AMR 5.9 16&lt;BR&gt;3 AMR 6.7 18&lt;BR&gt;4 AMR 7.4 20&lt;BR&gt;5 AMR 7.95 21&lt;BR&gt;6 AMR 10.2 27&lt;BR&gt;7 AMR 12.2 32&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;三、文件格式&lt;BR&gt;Amr的文件格式极为简单，如图1所示：&lt;BR&gt;&lt;BR&gt;文件最开始时6个字节的header，&lt;BR&gt;[#!AMR\n] 括号间的部分&lt;BR&gt;(或者十六进制表示为 0x2321414d520a ).&lt;BR&gt;&lt;BR&gt;接下来就是连续的语音帧，&lt;BR&gt;&lt;BR&gt;+----------------------+&lt;BR&gt;| Header               |&lt;BR&gt;+----------------------+&lt;BR&gt;| Speech Frame 1       |&lt;BR&gt;+----------------------+&lt;BR&gt;: ...                  :&lt;BR&gt;+----------------------+&lt;BR&gt;| Speech Frame n       |&lt;BR&gt;+----------------------+&lt;BR&gt;&lt;BR&gt;每个帧包含一个帧头+语音数据，帧头是一个字节&lt;BR&gt;0 1 2 3 4 5 6 7&lt;BR&gt;+-+-+-+-+-+-+-+-+&lt;BR&gt;|P| FT   |Q|P|P|&lt;BR&gt;+-+-+-+-+-+-+-+-+&lt;BR&gt;&lt;BR&gt;P设置为0&lt;BR&gt;FT为编码模式，上面已经列举了可用的值。(0~7)&lt;BR&gt;&lt;BR&gt;Q为帧质量指示器，如果为0表明帧被损坏，接受者需要将RX_TYPE设置成SPEECH_BAD或者SID_BAD。&lt;BR&gt;&lt;BR&gt;具体在S60中可以如创建codec&lt;BR&gt;#define KAdvancedUidCodecAMRToPCM16 0x101FAF67&lt;BR&gt;iCodec = CMMFCodec::NewL( TUid::Uid( KAdvancedUidCodecAMRToPCM16 ) );&lt;BR&gt;KAdvancedUidCodecAMRToPCM16 是一个Nokia魔鬼数字.&lt;BR&gt;在跳过头6个字节后,再多读一个字节,获取其2,3,4,5bit.就可以知道实际的采样率和桢长度.&lt;BR&gt;然后就一个桢一个桢的读,调用&lt;BR&gt;iCodec的ProcessL方法转换为PCM16. 对了, PCM16每桢的长度为320&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/26949.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>S60开发的一些笔记</title><link>http://blog.vckbase.com/jzhang/archive/2007/06/11/26859.html</link><pubDate>Mon, 11 Jun 2007 09:19:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2007/06/11/26859.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/26859.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2007/06/11/26859.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/26859.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/26859.html</trackback:ping><description>1. 创建全屏幕程序，只要在创建View的时候传入ApplicationRect()而不是ClientRect()就可以了&lt;BR&gt;2. 发送短消息。第三版可以使用RSendAs,第二版就复杂了，需要用MTM的api.不过Nokia Forum有一个例子，&lt;BR&gt;    里面的ExampleEngine改造一下就可以拿来用了&lt;BR&gt;3. 获取来电号码，在第二版中，无法从RCall中获取到来电号码，只能通过读取日志来获取。 而读日志有一个&lt;BR&gt;    延迟，会比接收到Incoming call 的回调慢&lt;BR&gt;4. AMR有6个字节的头，每帧13个字节。PCM有44个字节的头，每帧320个字节。&lt;BR&gt;5. App程序可以不经过安装直接通过StartApp启动，但是不能使用StartDocument。启动后的程序可以用&lt;BR&gt;   TApaTask.Exists检测到，并且可以用SendMessage发送消息。&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/26859.html" width = "1" height = "1" /&gt;</description></item></channel></rss>