<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<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>Sineysoft Studio.</title><link>http://www.sineysoft.com/blog/</link><description>天空外有天堂，流星错过海洋</description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 91204</generator><language>zh-CN</language><copyright>Copyright Sineysoft Studio. Some Rights Reserved.</copyright><pubDate>Thu, 12 Apr 2012 19:52:10 +0800</pubDate><item><title>关于Euclideon的&amp;quot;无限细节&amp;quot;引擎的技术分析</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/euclideon.html</link><pubDate>Sun, 01 Jan 2012 13:10:26 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/euclideon.html</guid><description><![CDATA[<div style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 160%; "><p>&nbsp;昨天看了一个震撼的视频, 地址在这里&nbsp;<a href="http://www.tudou.com/programs/view/2oH1zMMCWqY/">http://www.tudou.com/programs/view/2oH1zMMCWqY/</a>, 视频中宣称的无限细节引擎技术与现在主流的3d引擎技术完全不同, 传统的3d引擎技术基于多边形, 画面细节的丰富程度取决于多边形的个数和贴图的细节, 而&quot;无限细节&quot;技术则采用和自然界一样的原子排列方式来渲染图像, 或者说点云技术, 根据视频宣称可以比现在3d引擎提高10万倍的细节丰富程度, 而且完全不采用显卡的3d计算能力, 完全纯软件技术, 并最终达到20fps, 如果这一切都是真的, 那必将颠覆现有的3d渲染技术, 为此我思考了一个晚上也百思不得其解, 今天在其官网上找到了一些技术细节.</p><p>Unlimited Detail's method is very different to any 3D method that has been invented so far. The three current systems used in 3D graphics are ray tracing polygons and point clouds/voxels, they all have strengths and weaknesses. Polygons run fast but have poor geometry, ray-tracing and voxels have perfect geometry but run very slowly.<br />Unlimited Detail is a fourth system, which is more like a search algorithm than a 3D engine. It is best explained like this: if you had a word document and you went to the search tool and typed in a word like 'money' the search tool quickly searches for every place that word appeared in the document. Google and Bing are also search engines that go looking for things very quickly. Unlimited Detail is basically a point cloud search algorithm. We can build enormous worlds with huge numbers of points, then compress them down to be very small. The Unlimited Detail engine works out which direction the camera is facing and then searches the data to find only the points it needs to put on the screen it doesn&rsquo;t touch any unneeded points, all it wants is 1024*768 (if that is our resolution) points, one for each pixel of the screen. It has a few tricky things to work out, like: what objects are closest to the camera, what objects cover each other, how big should an object be as it gets further back. But all of this is done by a new sort of method that we call &quot;mass connected processing&quot;. Mass connected processing is where we have a way of processing masses of data at the same time and then applying the small changes to each part at the end.<br />The result is a perfect pure bug free 3D engine that gives Unlimited Geometry running super fast, and it's all done in software.</p><p>&nbsp;</p><p>看完之后,我大概了解了其原理,虽然还是感觉不可思议.</p><p>1)与传统3d技术不同, 该技术更像一种搜索技术, 一种点云搜索算法;</p><p>2)通过把世界用海量的点来描述, 然后压缩这些点数据便于使用;</p><p>3)通过相机的位置和面向, 搜索出画面里需要的点, 任何不需要的点都不会出现在搜索结果集里;</p><p>4)如果我们画面分辨率为1024x768, 那么最终的搜索返回的结果点也是1024x768;</p><p>5)在搜索的过程需要考虑: 那些太靠近相机的点, 那些互相覆盖的对象等;</p><p>6)所有这些通过一种新的排序方法, 叫做&quot;mass connected processing&quot;来完成;</p><p>7)最终这些点被用于渲染画面, 所有这些过程全部都是在cpu内软件完成.</p><p>&nbsp;</p><p>该技术确实不同于传统的3d渲染引擎, 该技术的核心算法应该是搜索和排序, 如果最终返回的点集是1024x768, 那么确实在渲染上和gpu关系不大了, 纯软件渲染足够了.&nbsp;</p></div>]]></description><category>游戏开发</category><comments>http://www.sineysoft.com/blog/post/euclideon.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=121</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=121&amp;key=cf0626ea</trackback:ping></item><item><title>让我们来聊聊Flash 11</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/flash11_3d_intro.html</link><pubDate>Thu, 29 Sep 2011 03:45:00 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/flash11_3d_intro.html</guid><description><![CDATA[<p>&quot;Let’s talk iPhone&quot;, 这是即将发布的苹果大会广告语, 新版的iPhone5预计会在大会上发布,差不多的时间Flash11正式版也会发布,so, Let's talk flash11.</p>  <p>&#160;</p>  <p>新版的Flash11最让人瞩目的特性就是硬件3d加速,并提供一套基于actionscript3的3d api,这将是web game一个新的起点,未来3d webgame应该会成为主流, adobe官方把新的3d技术叫做molehill, 它定位与高端图形渲染, 在windows上基于dx9, mac/linux上基于ogl1.3, 移动设备上基于openGL ES2. </p>  <p>molehill是所谓真正意义的3d, 比之前flash10的2.5要高效很多,flash10采用的是基于矢量的三角形变化,没有z-buffer,没有硬件加速,所以一般同屏就能处理千八百个三角形; 而molehill则是完全基于本地3d api, 基于shader的可编程管线, 可以全高清的情况下,以60帧率,渲染上百万个三角形, 这是官方的一个<a href="http://tv.adobe.com/watch/adc-presents/molehill-3d-apis">demo</a>, 已经不低于客户端3d引擎的效果了.</p>  <p>在新的渲染架构下, video frame和3d buffer不再基于display list, 而是基于texture, 这将允许直接渲染到显卡内存里, 没有回读导致的gpu暂停, 从而根本上提高硬件渲染效率, 准确的说3d渲染是在最底层的,2d渲染在其上层,如图(就是游戏的做法,底层是3d渲染场景,上层是2d渲染ui等)</p>  <p><img alt="Stage3D Model" src="http://www.bytearray.org/wp-content/uploads/2011/01/stage3d-300x203.png" /></p>  <p>当然如果有需求把3d渲染放到2d上面, molehill提供了一个方法把3d渲染结果画到BitmapData里,当然这可能需要video memory read back了,在不同机器上效率不同,我之前有多篇blog介绍这个问题,有兴趣的朋友可以自行搜索.</p>  <p>ps:对于硬件不支持的机器, molehill自动采用软件渲染, 并保留全部硬件支持的特性, 对于程序员完全透明, 即便完全软件渲染, 也比之前flash10快10倍, 因为据说这部分技术是使用的SwiftShader,人家专业做纯软件渲染.</p>  <p>ps:molehill完全不支持固定管线渲染, 必须使用可编程管线,与dx10保持看齐.</p>  <p><img alt="Shaders" src="http://www.bytearray.org/wp-content/uploads/2011/01/shaders4.png" /></p>  <p>ps:现在已经有不少基于flash11的3d引擎面试,其中不乏open source的,比如away3d, 据说adobe自己也在开发自有3d 引擎,帮助程序员快速搭建3d应用.</p>  <p>看到这些你是不是已经非常期待flash11的到来? 不管你期待与否 ,我是非常期待.</p>]]></description><category>游戏开发</category><comments>http://www.sineysoft.com/blog/post/flash11_3d_intro.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=120</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=120&amp;key=c6e68fe3</trackback:ping></item><item><title>关于游戏里的ui</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/118.html</link><pubDate>Tue, 12 Apr 2011 10:02:00 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/118.html</guid><description><![CDATA[<p>今天要说的是游戏里的ui, 说到ui, 我的经验是最丰富的, 之前进入网易先开始搞的就是梦幻西游的ui, 是一个图文混排的控件, 可以理解为richview, 允许表情包子和颜色文字混排, 实现聊天记录的实现和编辑. 后来搞天下贰也完整的实现一套3d游戏环境下的ui系统. </p>  <p>按理说ui系统是游戏开发过程中一小部分工作, 但它却贯穿了整个游戏开发的全过程, 直到我离开天下贰项目组, 都还在不断的根据需求修改ui引擎实现新的功能, 可以说整整搞了5年的ui, 所以到我们自己出来创业搞xero引擎, 我一点都不想再搞ui系统了. 所以ui说是小系统, 但却实实在在是一个大问题. 写这篇blog的缘由是上周去参加bigworld开发者大会, 其间与w公司一个技术人员讨论ui实现, bigworld可是说提供了完善丰富的3d引擎基础功能, 但ui系统这块欠奉, 或者不尽如人意, 据我所知, 所有购买bigworld的国内公司, 都需要重新独立研发一套的新的ui系统, 这里需要考虑的问题如下:</p>  <p>1) 功能完整</p>  <p>2) 性能</p>  <p>3) 脚本封装</p>  <p>今天我只说下功能完整性这个问题, 到底什么样的功能才算完整的, 很多初次实现ui系统的同学会类比windows mfc或者vcl等ui框架, 把各种功能的控件, 控件的操作方法都实现到ui系统里, 这样来体现ui系统的强大. 我个人不以为然, 至少在游戏ui系统中, 只要实现几种基础控件, 就能满足游戏里大部分需求. 比如ListView和TreeView这样的控件, 到底有没有必要在ui引擎中提供(注意这里是说的ui引擎级别, 不是应用层面, 从应用层面肯定需要这个控件), 我个人认为没有必要, 但我听很多童鞋抱怨过treeview控件又加入新的需求了--- 要在每个treeitem后面加入一个图标, 因为在标准windows控件里没有这个需求, 一般都是前面有个图标, 后面一个文字, 所以很多ui系统的实现者都会想当然的按照windows的习惯来实现这个treeview控件.</p>  <p>ui实现最重要的原则是抽象, 而不是具象, 以上面的treeview为例, 更抽象的实现是只实现:</p>  <p>Image显示图片(支持动态图片)</p>  <p>Label显示文字</p>  <p>Panel控件容器, 可以作为View, 可以支持裁剪.</p>  <p>剩下的工作就是在脚本应用层面:</p>  <p>使用Panel作为TreeItemView, 根据鼠标操作动态的layout treeview控件, 如果在panel中放入[Label], 那它就是一个基本的文字treeview, 如果放入[图片-Label-图片]就是上面需要的TreeViewItemEx, 将整个TreeViewItem layout进入一个新的panel, 就得到了一个支持裁剪的TreeViewEx控件. 一般这里使用Adapter模式来做TreeView和TreeViewItem的适配, 同时做到数据和view的分离.</p>  <p>关于允许拖动改变窗口的大小</p>  <p>这个问题是我同w公司的同学争论最多的一个问题, 这是一个功能完整性的问题. 他的意思是要支持这个功能, 或者说提供SetSize这样的功能, 于此同时要支持其中的子控件自动relayout, 这里说的不是Windows窗口改变大小后, 如何适应尺寸变化的问题, 我的意思是这是过度设计, 或者是windows想法的照搬. 更重要的是, 他们w公司要因为这个需求重新设计推翻之前的ui系统重新实现,而推动这次ui重构的根本原因, 在于策划早期ui需求的多变不确定性, 需要不断尝试不同大小, 不同布局的ui表现, 所以又是策划一句话,程序跑断腿, 当然这是一个理念和需求问题, 而不是对错的问题. 争论了半天也没有结论, 各执一词.</p>  <p>从理念角度讲, 如果你的ui系统是为了更通用, 能够独立服务更多游戏ui需求, 他的意思是无可厚非的, 但其实大部分游戏的大部分ui表现没有这个需求, 在游戏中大概99%的ui, 都是只有固定大小, 不需要改变尺寸, 不需要重排, 因为几乎所有ui都是一张复杂的底图, 当然也有例外, 比如聊天记录框, 为了让用户看到更多的历史记录, 需要根据用户喜好调整合适View尺寸, 一般这种窗口的实现都是9-patch平铺来实现,有这个需求, 实现一个9-patch的Panel控件就解决问题了, 真的需要到重新实现ui系统花费5个月时间吗?</p>  <p>关于ScaleForm</p>  <p>这是个好东西,特别是4.0后,这个ui实现变的更快了,星际二也用它作为ui系统,我之前的博客还写过这个东西, 还自己实现了一个类似的SFlash的替代方案, 它唯一的问题是会flash, 懂得ui, 懂点程序, 懂点游戏逻辑的人太难找, 简单说就是使用门槛太高, 直接导致人力成本提升.</p>]]></description><category>游戏开发</category><comments>http://www.sineysoft.com/blog/post/118.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=118</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=118&amp;key=af08b591</trackback:ping></item><item><title>Google的C++代码风格指南(1)</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/117.html</link><pubDate>Thu, 10 Mar 2011 17:27:32 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/117.html</guid><description><![CDATA[<p>不经意看到李开复的微博说google的代码规范是全球最好的,没有之一,于是好奇到底好在哪里, google找到地址:<a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml</a>, 阅读了部分, 深有同感, 写些心得.</p>  <p>首先关于定义define保护宏, 我很早之前写代码有这个习惯,那个时候记得应该是vc6的时代, 就是类似这样的代码:</p>  <pre>#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_...#endif  // FOO_BAR_BAZ_H_</pre><p>目的是为了不会重复引用, 但后来vc增加一个关键字, 如果没有记错的话,这个关键字是从borland c发展而来的, 就是:</p><p>#pragma once</p><p>也能起到同样效果, 告诉编译器这个头文件仅引用一次, 不重复包含.</p><p>我刚才特意到g++上测试了下,也是支持#pragma once这个指使字的.</p><p>关于匿名名字空间</p><p>Google是鼓励使用匿名名字空间的, 记得之前看过一篇文章说, 匿名名字空间会带来代码调试的困难, 深感不以为然, 今天再次看到google的规范鼓励匿名名字空间, 深得我心. 使用匿名名字空间的好处在于运行时命名冲突, 一般解决这个问题还有一个方法是static.</p><p>关于局部变量的位置</p><pre>int i;i = f();      // Bad -- initialization separate from declaration.</pre><pre>int j = g();  // Good -- declaration has initialization.</pre><p>Bad的写法是习惯了c语法的童鞋, 因为c语言要求变量要在函数头部申明, 这样在函数头部放了一堆变量申明, 代码改动多了之后, 也不知道哪些变量后来有没有用到, 反正摆了一堆, 喜庆的是c99后来也不强制要求了.</p><p>Good的写法是我一直的书写习惯, 按照google的说法, 就是变量的申明尽量在使用它的地方, 最好能一眼看到在那里申明的, 当然为了某些效率考虑, 可以例外, 比如:</p><p>Bad</p><pre>// Inefficient implementation:for (int i = 0; i &lt; 1000000; ++i) {  Foo f;  // My ctor and dtor get called 1000000 times each.  f.DoSomething(i);}</pre><p>Good</p><pre>Foo f;  // My ctor and dtor get called once each.for (int i = 0; i &lt; 1000000; ++i) {  f.DoSomething(i);}</pre><p>不建议使用全局类变量(包括static), 因为这将导致某些bug很难发现, 因为无法决定类的构造顺序.</p><p>我点我更是感同身受, 之前在写big world代码时候, 就发现了这个问题, BW里充斥了各种static 全局变量作为singleton, 我还特别写了篇blog说明这个问题, 当时是为了检查内存泄露, 经常是不同singleton退出时依赖, 导致各种退出crash, 后来没有办法都只能直接new一个就不管了, 靠os回收.</p>]]></description><category>程序人生</category><comments>http://www.sineysoft.com/blog/post/117.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=117</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=117&amp;key=d03e4ede</trackback:ping></item><item><title>把iphone的联系人,短信导入魅族M9</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/116.html</link><pubDate>Wed, 23 Feb 2011 14:52:15 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/116.html</guid><description><![CDATA[<p><div style="background-color: rgb(255, 255, 255); padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Arial, Verdana, sans-serif; font-size: 12px; line-height: 160%; "><p>最近业余开发android系统, 随便买了个国产神机M9，之前一直在用iphone,于是想把iphone的联系人和短信导入新的手机, 下载了个91手机助手,发现他有android系统一键转机,可惜试用后发现不支持魅族深度定制的android系统, 随手又试了试其他android转换软件也没有合适的,无奈之下自己研究,发现可用方法,为此也写了个python转换脚本.</p><p>先说说通讯录:</p><p>我的方法是用91导出vcf通讯录文件, 然后转换编码为utf8格式, 存入SD/Contacts目录,在使用M9&quot;导入SD卡联系人功能&quot;,就可以了,如果不转换utf8格式会有乱码.</p><p>麻烦的是短信:</p><p>我iphone用了2年多,积攒了5-6k条短信,不想就这样丢了,经过不断试验研究魅族sms.xml格式, 写出转换脚本</p><blockquote><p># Convert iphone sms to M9&nbsp;<br /># Author: Siney (siney#yeah.net)&nbsp;<br />from sqlite3 import *&nbsp;<br />from xml.sax.saxutils import escape&nbsp;<br />import codecs&nbsp;<br />import re&nbsp;<br />f = codecs.open('sms.xml','w','utf-8')&nbsp;<br />f.write ('''&lt;?xml version='1.0' encoding='UTF-8' standalone='yes' ?&gt;&nbsp;<br />&lt;SmsTable&gt;&nbsp;<br />&lt;Product&gt;M9&lt;/Product&gt;&nbsp;<br />&lt;SoftwareVersion&gt;1.0.0&lt;/SoftwareVersion&gt;''')</p><p>c = connect('sms.db')&nbsp;<br />curs = c.cursor()&nbsp;<br />curs.execute('''SELECT address,date,text,flags FROM message WHERE flags&lt;5 ORDER BY date asc''')&nbsp;<br />for row in curs:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a= escape(unicode(row[0]))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d = escape(unicode(row[1]))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = row[3]-1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = str(t)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = re.sub('&quot;',&quot;'&quot;,escape(unicode(row[2])))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if b!=&quot;None&quot;:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write(u'''&nbsp;<br />&lt;Sms&gt;&nbsp;<br />&lt;MobileNumber&gt;%s&lt;/MobileNumber&gt;&nbsp;<br />&lt;Body&gt;%s&lt;/Body&gt;&nbsp;<br />&lt;Read&gt;1&lt;/Read&gt;&nbsp;<br />&lt;Status&gt;-1&lt;/Status&gt;&nbsp;<br />&lt;Type&gt;%s&lt;/Type&gt;&nbsp;<br />&lt;MessageType&gt;0&lt;/MessageType&gt;&nbsp;<br />&lt;ReportDate&gt;0&lt;/ReportDate&gt;&nbsp;<br />&lt;SendDate&gt;%s000&lt;/SendDate&gt;&nbsp;<br />&lt;Protocol&gt;0&lt;/Protocol&gt;&nbsp;<br />&lt;ErrorCode&gt;0&lt;/ErrorCode&gt;&nbsp;<br />&lt;Seen&gt;0&lt;/Seen&gt;&nbsp;<br />&lt;Port&gt;0&lt;/Port&gt;&nbsp;<br />&lt;/Sms&gt;'''%(a,b,t,d))</p><p>f.write('''&lt;/SmsTable&gt;''' )</p></blockquote><p>首先使用91助手,导出iphone短信数据库sms.db, 然后把上面的脚本放入sms.db相同目录,python运行脚本得到sms.xml文件, 这个文件就是m9可是识别的短信备份文件,在m9中恢复用户数据-&gt;短信就可以恢复全部短信(不包括彩信).</p></div></p>]]></description><category>程序人生</category><comments>http://www.sineysoft.com/blog/post/116.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=116</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=116&amp;key=6b63d45c</trackback:ping></item><item><title>过年宅7天, 杂记</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/115.html</link><pubDate>Tue, 15 Feb 2011 19:37:27 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/115.html</guid><description><![CDATA[<p>过年回家,准确说,回哥哥家,成都,宅了7天,其中穿插着看了&quot;非诚勿扰&quot;和伪穿越剧&quot;宫&quot;, 自从那个宝马马诺走后就一直没有关注过&quot;非诚勿扰&quot;, 感觉话题超做完了, 就没有什么看点了, 但新年实在无其他好看, 勉强看下去, 感觉还是不错的, 感觉江苏卫视选择男嘉宾时故意选择一些容易产生话题的, 每期必有几个看着与众不同的男士, 总感觉跟真实生活中接触的人有差距, 还是上了电视, 大家一紧张, 露馅了?</p>  <p>还有那个伪穿越剧,bug太多,实在不忍细看,网上吐槽的一大堆,唯一让我感觉好的就是, 湖南卫视总算能拍出tvb感觉的片子了.</p>  <p>1.ipad 植物大战僵尸又通关一遍,实在无聊拿出来把玩,结果无意间又通关了,pvz2啥时候能出来啊,一定支持正版.</p>  <p>2.看了传说中的三体1,2,3，之前看过球状闪电,&quot;球&quot;写的一般,还在豆瓣上写了篇差评的评论,没来没有对三体抱太大希望,结果出乎意料感觉三体写的确实不错,作者的有些想法我很小的时候也想过,比如所谓的宇宙社会学,我也写过程序模拟这种可能的竞争冲突.当看到三体世界的描述时,自然产生对地球物理科学的怀疑,也许一切都是巧合而已,何谓科学/定理?</p>  <p>3.看了成都的房价, 感叹成都竞争力很大啊, 在北京五环外买一所破房子的价格可以在成都更好位置买一栋豪宅,还尚风尚水.</p>  <p>4.做了个所谓专业的性格,职业测试, 又是答题,又是画画,又是冥想,结果和自己对自己的认识差不多,不知道这种测试的意义在那里?</p>]]></description><category>程序人生</category><comments>http://www.sineysoft.com/blog/post/115.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=115</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=115&amp;key=945de086</trackback:ping></item><item><title>Android sdk中使用源代码调试</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/114.html</link><pubDate>Wed, 19 Jan 2011 14:10:17 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/114.html</guid><description><![CDATA[<p>最近尝试了下android平台开发, 动不动Android api就抛出异常, 而异常了也没有明确的错误说明, 默认情况下Android sdk发行的开发包里是不包含源代码的,所以异常错误了就是一个&quot;Attach source&quot;按钮,甚是不爽,不得已必须调试其源代码,搞明白为啥异常了, 方法如下:</p>  <p>首先需要安装git, 这是一个分布式代码版本控制软件, 可以参考我<a href="http://www.sineysoft.com/blog/post/99.html">之前的博客</a>.</p>  <p>然后进入 git bash 执行如下命令:</p>  <p>git clone git://git.source.android.com/platform/frameworks/base android-api</p>  <p>这一步需要很多时间, 也有可能被墙..., 如果搞不定的童鞋可以留下email,我发给你, 仅限于2.2。</p>  <p>   <br />cd android-api     <br />git checkout android-2.2-r1.3 #这一步是切换到某个版本的代码分支,这里使用2.2     <br />jar cvf ../android-src.jar -C core/java .     <br />jar uvf ../android-src.jar -C graphics/java .     <br />jar uvf ../android-src.jar -C location/java .     <br />jar uvf ../android-src.jar -C media/java .     <br />jar uvf ../android-src.jar -C opengl/java .     <br />jar uvf ../android-src.jar -C sax/java .     <br />jar uvf ../android-src.jar -C services/java .     <br />jar uvf ../android-src.jar -C telephony/java .     <br />jar uvf ../android-src.jar -C wifi/java .     <br /></p>  <p>这样变产生了android-src.jar文件, 把他加入到Android Library里,或者在出现&quot;Attach source&quot;按钮是指定这个文件,变可以基于源代码调试了.</p>]]></description><category>编程心得</category><comments>http://www.sineysoft.com/blog/post/114.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=114</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=114&amp;key=fac23dd4</trackback:ping></item><item><title>从技术上颠覆QQ</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/113.html</link><pubDate>Fri, 05 Nov 2010 07:18:00 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/113.html</guid><description><![CDATA[<p>&nbsp;</p><div style="background-color: rgb(255, 255, 255); padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Arial, Verdana, sans-serif; font-size: 12px; line-height: 160%; "><p>&nbsp;</p><div style="background-color: rgb(255, 255, 255); padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Arial, Verdana, sans-serif; font-size: 12px; line-height: 160%; "><p>QQ终于凭借其强大用户数量和粘着性战胜了360， 360这回败也败的其所, 就像网友说的&quot;可以裸奔, 但不可以不聊天&quot;, 无疑QQ再次用实际行动证明了他是互联网老大的地位, 这不禁让人思考, QQ的地位真的是不可战胜的吗? 就连国内装机量第二的360在和QQ过招的时候, 也没有超过2个回合就败下阵来, 让人唏嘘不已. 这再次告诉我们, 欲战胜QQ必须从其庞大的用户群入手, 很过观点认为这不可能, QQ的价值在于庞大的用户, 和用户之间的关系, 而不在于QQ im本身, 而用户数据在腾讯手里无法获得, 所以腾讯已经事实垄断了im行业, 甚至整个互联网都被其圈起来发展.</p><p>在昨天我的QQ被多次踢下线后, 我就一直在思考这可恶的腾讯谁能颠覆它? 结果我想到了方法, 一个从技术上颠覆QQ的方法, 一下讨论仅从技术层面, 不涉及法律层面侵权的可能, 其中也包含部分YY, 其实方法很简单:</p><p>1&gt;在这个白热化的阶段退出一个im工具, 宣称其可以通过qq号码登录, 事实上他确实可以;</p><p>2&gt;其实这个im工具登录的是自己的服务器, 而不是腾讯的服务器, 自己的服务器上起一个qq客户端代理再去腾讯的服务器登录, 在网络上有很多开源的qq客户端代码, 比如lumaQQ,&nbsp; 用这个代理去腾讯获得用户数据;</p><p>3&gt;将腾讯的回发的数据重新组织为自己im用的数据后发给im;</p><p>4&gt;这步是重点, 将腾讯回发的用户数据重新导入自己的用户数据库中, 这部分包含一个用户完整的好友数据, 为了重建整个QQ帝国的用户数据, 这里需要足够多的人参与才能保证尽量获得完整的数据, 因为QQ的好友是双向的, 即A是B的好友, 那么B一定是A的好友, 反之, 如果A删除了B, B也同样删除了A, 同时, 一般QQ用户都存在很多好友, 我们取一个平均值, 每个用户有50个好友( Siney本人远超过这个数字 ）, 那么6亿的QQ用户仅需要1200万用户参与就可以获得完整QQ用户数据, 而考虑到n多人的用户数远&gt;50， 同时6亿用户不都是活跃用户, 实际上仅100-200万用户参与就可以获得QQ最有价值, 最活跃的核心用户信息;</p><p>5&gt;已经转移的用户, 仅需要在自己服务器获取数据, 尚未转移的用户任然可以通过代理服务继续同QQ用户通信;</p><p>6&gt;如果已经完成了用户的转移, 坚决同腾讯划清界限, 至于是同腾讯协商互联互通, 还是要和腾讯打官司, 那是后话, 至此, 已经可以同腾讯分庭抗礼了, 天下2分.</p><p>技术架构图:</p><p><a href="http://www.sineysoft.com/blog/upload/wps_clip_image-7281_2.png"><img title="wps_clip_image-7281" alt="wps_clip_image-7281" width="523" height="431" style="display: inline; " src="http://www.sineysoft.com/blog/upload/wps_clip_image-7281_thumb.png" /></a></p><p>一些注意事项:</p><p>1&gt;这个历史时刻很关键, 愤怒的用户急于选择一款im替代qq用以挑战qq的霸权, 我们需要顺应民意;</p><p>2&gt;失去理智的腾讯用违法的手段在先, 就怪不得我们用&quot;可能违法&quot;的手段在后;</p><p>3&gt;必须是一款有牺牲精神的产品, 万一搞砸了, 该产品不至于影响x公司核心业务.</p><p>----------------------</p><p>看到云风一篇blog也在讨论这个:</p><p><a href="http://blog.codingnow.com/2010/11/qq_360.html#more">http://blog.codingnow.com/2010/11/qq_360.html#more</a></p><p>还提出一种方法是直接扫描qzone的用户信息.</p><p>----------------------</p><p>关于直接分析qzone获取用户数据方法不错, 其实就是通过一个http服务拿到所有用户信息, qzone自己也用这个方法获得用户数据, 我用了一天时间, 实现了2中方法完成这个工作:</p><p>1) 直接嵌入一个ie访问<a href="http://qzone.qq.com">http://qzone.qq.com</a>, 然后用户手动登陆成功后, 访问这个地址<a href="http://r.qzone.qq.com/cgi-bin/tfriend/friend_show_qqfriends.cgi?uin=QQ">http://r.qzone.qq.com/cgi-bin/tfriend/friend_show_qqfriends.cgi?uin=QQ</a>号码, 就可以拿到用户所有好友数据, 程序要做的无非是做点自动化的工作而已, 没啥难度;</p><p>2) 模拟一个http客户端, 自己处理cookie和post参数, 还要自己实现密码md5加密过程, qq使用的是3次md5+verifycode模式, 这个我是用flex实现, 该死的actionscript没有提供md5库, 手动实现一个, 真纠结, 但这样的好处是可以同时部署为flash web和exe运行, 非常方便;</p><p>上述http接口返回的是json数据, 非常容易解析.</p></div><p>&nbsp;</p></div><p>&nbsp;</p>]]></description><category>程序人生</category><comments>http://www.sineysoft.com/blog/post/113.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=113</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=113&amp;key=8fda1af0</trackback:ping></item><item><title>QQ和360那点事</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/qq_vs_360.html</link><pubDate>Wed, 03 Nov 2010 14:48:00 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/qq_vs_360.html</guid><description><![CDATA[<p><div style="background-color: rgb(255, 255, 255); padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Arial, Verdana, sans-serif; font-size: 12px; line-height: 160%; "><p>一个流氓起家, 一个山寨之王( 广大网友的看法, 我不是很认同, 个人还是推崇qq的模式 )在用户的桌面上大战了近一个月, 终于qq爆发了, 挟用户数量要求卸载360, 真不知道腾讯那里来的勇气测试用户忠诚度, 就凭借其全国第一的客户端装机量吗? 这未免太把自己当回事了, 虽然qq在国内拥有广大fans, 这样下注也确实会迫使很多用户卸载360，毕竟&quot;中毒事小, 无法泡mm事大啊&quot;, 以qq fans对qq依赖程度, 就算qq宣布不为windows系统提供qq服务, 也会有很多用户卸载windows, 转而投向mac os或者linux系统, 但qq这样的态度无疑是杀敌800， 自杀1000的做法, 而从技术角度来讲360完全有能力做到同qq和谐并存, 这就是吓唬下360, 随便恐吓用户而已.</p><p>腾讯本来就是一家广受国内it公司唾弃的公司( 本人持保留意见) , 常被人冠以山寨, 抄袭之名, 如今qq再这么强势,势必造成一种局面, 告诉大家都听话点, qq已经垄断互联网, 那天小马哥不高兴了, 任何软件, 互联网应用都会被腾讯这样卑鄙的方式和谐掉, 进而 加剧大家对腾讯敌视情绪, 不管是与qq有直接竞争的互联网公司, 还是弱势群体的用户, 在天朝广大p民每天都在扮演各种弱势角色, 上个网自己的计算机还要被qq摆一道, 用户肯定不爽, 拿天朝zf没有办法, 拿qq还没有办法吗? 一堆可替代qq的软件, 比如旺旺, 比如泡泡, 无非腾讯依仗自己用户数量多, 不能互联互通, 占尽垄断的优势. 这回腾讯自己放弃用户, 就不能怪用户放弃qq, 接下来肯定很多厂商顺势推出&quot;完全兼容360&quot;im软件, 强势插入, 必将能从腾讯im市场抢占一批流失客户.</p><p>&nbsp;</p><p>最后介绍一种方法, 让qq安全检查失效(windows7 系统):</p><p>修改C:\Users\xxxx\AppData\Roaming\Tencent\QQ\safebase 目录权限为完全拒绝即可.</p><p>这里有一个详细的介绍:<a href="http://bbs.360.cn/3229787/39950551.html">http://bbs.360.cn/3229787/39950551.html</a></p><p>另外还可以直接使用腾讯的另一款im工具TM, 一样没有广告, 适合商务环境使用, 下载地址:</p><p><a href="http://im.qq.com/tm/">http://im.qq.com/tm/</a></p></div></p>]]></description><category>心情故事</category><comments>http://www.sineysoft.com/blog/post/qq_vs_360.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=112</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=112&amp;key=8f9dd6b4</trackback:ping></item><item><title>Json4Lua 的一个Bug</title><author>siney@yeah.net (siney)</author><link>http://www.sineysoft.com/blog/post/luajsonbug.html</link><pubDate>Fri, 15 Oct 2010 22:57:12 +0800</pubDate><guid>http://www.sineysoft.com/blog/post/luajsonbug.html</guid><description><![CDATA[<p>项目里要使用json作为http请求的返回内容, 于是google找到这个json4lua, 貌似也是唯一一个用lua原生实现的json解析库, 下载最新版使用, 但在实际使用中发现了一个bug, 这就是无法解析空的数组内容, 如下:</p>  <p>local str=json.encode({1,2,3,{}})</p>  <p>#str=&quot;[1,2,3,[]]&quot;</p>  <p>json.decode(str) # raise a error</p>  <p>这样会触发一个脚本错误, 具体就是当解析完&quot;[&quot;符号后, 不能紧接着&quot;]&quot;符号, 我不知道具体json标准是否允许空的数组内容, 但代码中str是由json.encode函数自己返回,自己再decode就会失败, 同样的代码, 我在python中尝试json是没有问题, 再去google发现没有人遇到同样的问题, 看来用lua处理json的人很少啊, 看来只能自己动手了, 解决之, 具体如下修改:</p>  <blockquote>   <p>-- a value, pretty similar to tt_object_value     <br />&#160;&#160;&#160; init_token_table (tt_array_seperator) &quot;array ({ or [ or ' or \&quot; or number or boolean or null expected)&quot;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_object_key)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :to &quot;{&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_array_seperator)&#160;&#160;&#160; :to &quot;[&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(true)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :to &quot;]&quot;&#160; # 加入这行      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_singlequote_string) :to &quot;'&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_doublequote_string) :to '&quot;'&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_comment_start)&#160;&#160;&#160;&#160;&#160; :to &quot;/&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_numeric)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :to &quot;0123456789.-&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_boolean)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :to &quot;tf&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_null)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :to &quot;n&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; :link(tt_ignore)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :to &quot; \t\r\n&quot;</p> </blockquote>  <p>&#160;</p>  <p>函数read_array修改为:</p>  <blockquote>   <p>-- read arrays, empty array expected as o arg     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; function read_array (o,i)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; --if not i then status &quot;arr open&quot; end      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i = i or 1      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; -- loop until ...      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while true do      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; local t = next_token(tt_array_seperator)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if t == true then      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return o      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; o[i] = read_value(t,tt_array_seperator)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; t = next_token(tt_array_value)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if t == tt_comment_start then      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; t = read_comment(tt_array_value)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if t == true then&#160; -- ... we found a terminator token      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; --status &quot;arr close&quot;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return o       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i = i + 1      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; end</p> </blockquote>  <p>解决后本来想发mail给原作者, 但怎么也找不到其电子邮件, json4lua的官方站点也很冷清的样子, forum内就一条留言, 就此作罢.</p>]]></description><category>游戏开发</category><comments>http://www.sineysoft.com/blog/post/luajsonbug.html#comment</comments><wfw:comment>http://www.sineysoft.com/blog/</wfw:comment><wfw:commentRss>http://www.sineysoft.com/blog/feed.asp?cmt=111</wfw:commentRss><trackback:ping>http://www.sineysoft.com/blog/cmd.asp?act=tb&amp;id=111&amp;key=c8fe8081</trackback:ping></item></channel></rss>

