九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

从C++到JAVA,C++程序员学习JAVA的指南(2)

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

Technorati 标签: ,,

JAVA is not just another programming language. -- 匿名

学习更新的语言,有助于了解别人对旧语言有哪些不满。 -- 匿名

 

前言

先说明本文的行文习惯,文章写作流程以本人阅读《Java Programming Language》为顺序,一般以一个本人认为值得讲的JAVA与C++不同的特性为一个小节,每小节尽量以JAVA的新特性为标题,首先对比C++,JAVA,Python三者在此上的区别,然后展开讨论。因为没有人能够在每个领域都成为专家,本人也是Python知识浅薄,并且新学JAVA,C++也不过学了2,3年,以此学习方式纯粹为了对比学习,没有厚此薄彼之意。虽然本人常常几书在手,时常查阅,但是文中技术的硬伤因为本人的水平也就这样,估计难以避免,也请大家指正。

 

1.原生整数类型的大小确定

C++ -- 类型大小一般规定最小值,整数类型丰富

JAVA -- 完全由标准定死原生整数类型的大小,整数类型丰富

Python -- 整数仅分标准整形和长整形,标准整形长度不确定,长整形

JAVA的这个特点不算是太大的改动,但是比起C++来说实在是更为方便。C++继承了C的传统,标准中原生类型都仅仅是建议最小的大小,具体多大的权利留给了编译器,因为这种特性,流行着一句"一百家编译器厂商就有一百种C++”的话。所以在C++中,我们通过typedef来获取自己一般想要的大小,(到时候想要改也方便)减少int的使用转而使用长度更加确定的short,long,去减少整数类型大小不确定带给我们可移植性的问题。

事实上,这种特性可能是考虑到不同硬件对不同大小的值执行速度上的差异,比如16位机器一次处理16位整数的效率最高,32位的机器是32位,而64位则是64位,C++作为一门没有完全脱离硬件并且不放弃底层开发市场的语言,无法不考虑这一点,所以才有int的出现,用此类型来自适应当前机器最适合的类型,其他类型也没有强行的规定死,导致了sizeof的使用常常难以避免,特别是在数组等长度的计算时,sizeof的使用简直就是标准用法,JAVA抛弃了这种用法,确定了所有原生类型的大小,在一定程度上简化了程序代码。

Python的原生整数类型基本上完全使用标准整形,并且与支持无限长度的长整形可以默认转换,比JAVA的做法更加激进,事实上使用更加方便,最最重要的是解决了C++,JAVA都存在的数值溢出问题。但是提供给程序员的选择少了,方便是方便了,对于内存的精打细算的歪脑筋也没有办法打了。。。。

数值溢出问题就更是一个大问题了,多少不正常的歪门邪道就由此而来啊,在定义数值的时候因为没有预计到原来可能的规模,最后不得已需要扩大,在大规模程序中也实在是噩梦一场。(我在工作中就碰到过不止一次)而程序员数量较多时,对同一个意义的值使用了不同整数类型,相互之间传递时的溢出Bug,也是相当难以调试,也会使得明明经过自己单元测试的模块最后出现问题,这些,也许就只能放在Python的激进中,通过割舍了节省内存的手段才能解决了。在C++和JAVA中,可能需要更多对程序员的规定才能稍微缓解此情况。

 

2.去掉了无符号整数的使用

C++ -- 整数类型可选择有无符号

JAVA -- 完全由标准定死原生整数类型全部为有符号

Python -- 全部有符号

C++中可以由unsigned选择某个整数类型是否是无符号,默认为有符号。虽然遵循着整形提升的原则,但是有无符号可以在计算中自动转换,常常导致问题,这一点在《C专家编程》1.10中Peter Van Der Linden有过描述,并且推荐大家不要在代码中使用无符号类型,以免增加不必要的复杂性,但是事实上,在我的工作经历中,公司对无符号的使用还是较多,特别是对于那些不存在负数的值,甚至还偏向于使用无符号整数。但是,也不能将无符号整数说的一无是处,在位运算时,特别是位的偏移运算,无符号整数可以让我们减少对多情况的考虑,简化代码,在《C专家编程中》也是推荐只有在使用位段和二进制掩码时,才可以使用无符号数。

对于符号的问题,本人使用C++中最为印象深刻的是另外的问题。(也不能全部定性为有无符号带来的问题)工作中,很多遗留的代码喜欢用-1来表示一个无符号数的最大值,事实上,这样做仅仅当类型是int时才是安全的,其他情况下的确能够获取到最大的无符号数,但是比较的时候却会带来问题,不知道的话也常常会在调试时陷入郁闷当中,当时开发的程序常常通过网络通信(服务器端的程序嘛),更加加大了问题的严重性,我甚至还帮同事调试过几个这样的问题。

比如下面这个例子:

#include 
using namespace std;

int main()
{
    unsigned int d = -1;
    cout <<d <<endl;

    if(d == -1)
    {
        cout <<" d == -1" <<endl;
    }
    else
    {
        cout <<" d != -1" <<endl;
    }

    unsigned short s = -1;
    cout <<s <<endl;

    if(s == -1)
    {
        cout <<" s == -1" <<endl;
    }
    else
    {
        cout <<" s != -1" <<endl;

        if(s == (unsigned short)-1)
        {
            cout <<" s == (unsigned short)-1" <<endl;
        }
        else
        {
            cout <<" s != (unsigned short)-1" <<endl;
        }
    }

    return 0;
}

会输出:

4294967295

d == -1

65535

s != -1

s == (unsigned short)-1

注意了,在C++中,unsigned short用-1赋值后,在与-1的比较中是不为真,这种情况的避免一般可以通过两种方式,一种是在所有的-1使用中全部加上确定的类型,如上面示例中所示,另一种就是全部弃用-1,而是使用0xFFFF…..的形式代替。

统一了符号后,这些问题自然不会存在了。

 

3.类成员变量默认初始化+使用栈上未初始化的变量无法通过编译

C++ -- 使用未初始化的变量时,此变量值不确定,实际使用内存中的残留数据,类及栈上的使用一样

JAVA -- 类成员变量默认初始化+使用栈上未初始化的变量无法通过编译

Python -- 动态类型语言,变量不需声明,使用未定义的变量一律抛出运行时异常,NameError

C++的行为简直人神共愤。。。。。。。呵呵,当然,事实上,公司和C++使用者们就多出了很多规定了避免此事,比如使用变量时一律先初始化,哪怕马上就要用到了,比如分配了内存一律先memset,使用了数组一律先={0},使用指针,一律先=NULL,并且,推迟变量的定义,直到使用时然后才定义变量,以防忘记初始化。

事实上,个人认为还是效率上的考虑让C++如此,(也许因为继承了C)假如都能像JAVA这样不把效率作为己任,C++要更好的多,C++的设计哲学里,可以不初始化的变量,为啥一定要先初始化?呵呵,在C语言所有变量必须在块的前面定义时,给每个变量一个无意义的初始值,也的确是有消耗的。

不用多说了,又是一例方便了程序员(但是耽误了效率)的改进。

 

4.数组本身包含长度信息

C++ -- 原生数组本身无长度信息,但是Vector等容器有

JAVA -- 数组本身包含长度信息

Python -- 数组本身包含长度信息

C++中的原生数组不包含除本身元素外的任何信息,这种方式与C兼容,但是说实话,并不是太好用,使得使用数组的时候有诸多不便,比如传递参数时就需要额外指定一个方式来表示结束方式,要么传长度,要么传结束指针,要么如字符串以零结尾,都不算太好,虽然在STL中提供了Vector作为替换方案,但是使用中,常常因为各种因素(与C兼容,节省内存等),还是常常使用原生数组,但是,说实话,习惯了这种思维,其实也不是什么问题了,当然,对于初学者来说,JAVA,Python这种万物皆对象,数组本身就是一个类对象的方式会更容易接受一些,事实上,最简单的来说,传递参数的时候参数数量会少一些,使用也简单,难以出错一些。

 

5.数组访问范围检测

C++ -- 数组访问范围不检测,部分实现可提供可选检测

JAVA -- 数组访问范围检测,越界时,抛出ArrayIndexOutOfBoundsException异常

Python -- 数组访问范围检测,越界时抛出IndexError: tuple index out of range

数组访问范围检测不会让C++中常见的越界访问问题得到彻底解决,仅仅是运行时碰到时会抛出异常,方便了调试和发现问题。因为此类问题虽然可以通过良好的习惯尽量避免,但是一旦出现非常难以调试,难到出现莫名其妙的Bug时,公司的资深程序员第一反应就是数组访问越界导致的问题(其实相对来说比率还是比较小的),所以我很还是比较支持这种运行时检测的,但是面试时现在公司的程序员老大说当我用了JAVA后就知道JAVA的数组访问有多么慢了,并且认为很大的原因就是因为运行时的范围检测,因为刚接触JAVA,是对是错,我暂时也不敢肯定,但是此话应该有参考价值。

 

后记:

此文是当时刚刚通过新公司的面试还没有进入公司的时候写的,因为还没有完善,一直没有发布,当时以为自己在新公司会使用JAVA,所以趁还没有进入公司现巩固一下(对JAVA的了解很少,仅大概看过《Thinking in JAVA》一书),但是事实进入公司以后,还是做C++的工作。。。。。。。所以,此系列,未完善的文章也先发布了,无意外的话,此系列还就此终结了。。。。。。。。。。。。(假如以后有闲工夫或者工作真的换的时候再开始也未必可知)

 

 

 

参考资料

1.《Thinking In JAVA》,英文版,第4版,Bruce Eckel著,机械工业出版社

2.《JAVA Programming Language》,英文版,第4版,Ken Arnold,James Gosling,David Holmes著,人民邮电出版社

3.《JDK 6 Documentation》,JAVA在线文档集合

4.《The Java Language Specification, Third Edition

5.《Java™ Platform, Standard Edition 6 API Specification

6.《C专家编程》,Peter Van Der LinDen著,徐波译,人民邮电出版社

7. 《Python核心编程》,Wesley J. Chun著,宋吉广译,人民邮电出版社

 

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

Google 在 IE , FireFox,Chrome 中的有趣不同点

write by 九天雁翎(JTianLing) -- www.jtianling.com


讨论新闻组及文件

 

因为平时很少用IE了(一般只在迅雷看看中使用),所以虽然天天用Google n次的n个功能,但是平时还真没有注意到,不知道是最近改的,还是一直这样,不知道你注意到这些有趣的细节没有?

IE8中的Google:

image21

FireFox3中的Google:

image9

Chrome4中的Google:

image6

 

看出区别了吗?截图看不出来就实际的去试试,IE的Google主页明显是3个中最丑的(因为我不习惯吗?)。。。。

其一,从页面设计上来说,以简洁的风格搭配浅色调为主,Firefox和Chrome中的按钮都是白色的,比较搭配,IE中那两个蓝色的按钮太丑了!!!与整体的页面风格根本不配嘛。。。。。

其二,Google的LOGO在Firefox和Chrome中都是有阴影的,所以颜色显得柔和一些,立体感也更强一些,类似于3D加光照,而IE中的LOGO完全就是用颜色涂的2D文字。。。。。

其三,在IE中右上角常常会显示提示你下载Google Chrome,而且很明确的告诉你,这是一个更快的浏览网页的方式。。。。呵呵,不仅Chrome中没有,firefox中也不会有。。。。

其四,在IE中,搜索栏下面的文字多出一个选项“Make Google your homepage

”,其他两个浏览器都没有。

这是主页的区别,还有个细节,Chrome中,选中编辑框进行文字输入的时候,编辑框的边沿会高亮,Firefox和IE中都不会有这样的特效。自家的东西配自家就是不一样啊。。。。。

下面看搜索:

IE8中的Google搜索:

image24

Firefox和Chrome除了Chrome的编辑框选中时高亮外以下都一样,以下都仅以Firefox4为例:

image33

这里的界面比主页差异更大,有很大的不一样,在IE中有固定的边栏,Firefox/Chrome中需要点击上面的Show options才会有,并且IE中的边栏显示带有图片,Firefox/Chrome中的就仅仅只有文字。这个差异很大,以前看新闻说这将是Google的新UI,但是现在看来这是Google在IE中的新UI吧。。。。因为经调查发现IE的用户更喜欢bing的固定边栏?(因为都是MS的风格和产品?)所以Google也在IE中使用固定边栏了?

另外,在IE中拖动边框,编辑框也会跟着改变,而在Firefox和Chrome中不会,这个细节都已经不重要了。

很明显,应该是Google特意为IE制作了一套网页。。。。这么大的变化不太可能是因为浏览器显示差异导致的问题。

呵呵,相对来说,个人感觉,Google明显在Firefox和Chrome中的体验会更好一些。。。。。。。。。这就有个问题了,是MS故意让Google在IE中难看(比如主页),以减少Google的用户,将用户吸引到好看的Bing中呢?还是Google故意将IE中的使用做的难看+麻烦,然后将用户吸引到更好的Firefox和Chrome中呢?呵呵,因为他们竞争的连环性。。。。这个就不好说了。。。。。。

但是,搜索的UI差异应该是Google对使用不同浏览器的用户不同的使用习惯调查后进行的用户划分+产品划分吧。。。。。。。。。

作为比较,bing的firefox版本和IE版本就没有什么区别:(并且,我也没有发现传说中的固定边栏,难道是最近升级升没了?Google哭了)

image37

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

我都不知道我为什么要在JAVA过了巅峰的时候学习JAVA-_-!

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

曾经看某文介绍JAVA历史的时候说,JAVA虚拟机的机制曾经被视为设计的败笔,因为当时的硬件条件不佳,JAVA程序慢到让人无法忍受,而现在,随着硬件水平的进步,JAVA现在已经是名副其实的NO.1流行语言,并且以前一般仅作为其他语言补充的脚本语言(如Python,Ruby等)也开始大为流行,而C/C++这种老牌的以效率取胜的语言却在新一代的程序员的责骂中蹒跚前行,不得不让人感叹此一时,彼一时。

作为03级的小本,当年学习了C,在选择下一个语言时选择了名字较为接近,名气在当时也的确很响亮的C++,学习有年,使用颇为顺手,在学习Python,LUA作为脚本语言的补充后却也慢慢感觉到其语言为了效率在语法和语言特性上的牺牲着实过大,然后学习了一下Boost和C++1X标准(现在应该肯定是1X标准了)了解了一下C++更面向高层抽象概念的发展方向,的确,这已经不是一个万事都需要汇编优化,万事都需要了解机器代码的时代了。。。。。时代,在进步啊。。。。。

BS都承认,新出来的语言相比旧语言自然会有其一定的优势,不然新语言的创造者应该打屁股^^,慢慢的C#在Anders的发展下都已经有了自己的一片天空,并且已经是JAVA最直接的强有力竞争者了,现在虽然不能说JAVA已经日薄西山,但是我感觉以SUN被卖为标志,很明显JAVA已经过了其巅峰时代了。。。。。。我在JAVA巅峰时不为其所动,偏偏选择现在开始学习JAVA,也真叫是命运弄人啊。(TIOBE也能看到C#逐月流行,JAVA逐月退步,最新的排行JAVA第一的位置都快不保。)虽然我会感叹工作需要,身不由己。

但是,决定开始学习JAVA的时候,我还是如同以往准备学习一门新语言一样兴奋,这,又是一个新的世界^^可叹的就是,总是自叹学习太杂的我,却一直在越学越杂的路上前行,没有回头路可走。说是工作需求,其实当自己选择这样一份工作的时候,其实就已经为自己选择了这样的道路。当一份沿着以前老路(Linux上的服务器端程序开发),和一条崭新的道路(移动平台上的JAVA程序开发)摆在我的面前时,我最终选择了后者。。。。。。。。

虽然早已接受语言不是最重要的,最重要的是设计,即便是coder,重要的也是编程时的思考和逻辑,但是却还是很容易被一些语言的新的特性所吸引,又会搬出“语言决定了你的思维的广度”这样语言来说服自己去学习,矛盾中,常常屈服于对未知世界(新的语言)的好奇,此时我甚至还会搬出Jobs的"Stay hungry”名言来鼓励自己,回头来看自己走过的路,发现自己从一个出发点,向各个方向都走了一些距离,但是没有一个方向真正走的很远-_-!

我哪,自己都不知道自己要折腾到什么时候才能安分,常以为趁年轻的时候多折腾折腾几门语言,但求知识面能宽一些,对各种语言都能有所了解,以求做到在合适的时候知道该用,并且会用怎样合适的语言,但是又常感慨一入江湖岁月催,征战沙场几人回,不胜人生一场醉#%¥@……¥@#……%¥#这样的选择是对是错,现在是难以分辨。。。。明日即将开始新的工作,留此文以志之。

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

迅雷非善类,搜狐需谨慎,浅析迅雷发家史

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

近日按习惯在迅雷看看上看看电影,很多电影,包括首页推荐的电影,已经是如下图所示,被迅雷处理掉了

xunleikankan 这点严重的影响了我正常的看片!

一时间觉得很郁闷,突然想起来最近的搜狐告迅雷侵犯版权的事情了,也明白了为啥这么多页面会不存在了,唉。。。。。真不知道是该支持搜狐还是咒骂搜狐。。。。。。

看看迅雷的历史。

最开始下载类软件是netant的天下(不知道今天还有多少人记得当年那一个一个辛勤的小蚂蚁啊),当时netant靠的是多线程的分割下载方式,在网络非常差的时代,为我们提供了非常优秀的下载速度,市场趋于稳定后,也没有见有太大的改变了。但是flashget横空出世,因为提供了一样优秀的下载速度,并且引入了下载分类管理等创新功能(就我的记忆,在中国当时的下载软件里面的确是新的),慢慢将netant挤出了市场,不过慢慢flashget也趋于平静了,没有什么大的改动。下载类软件虽然装机使用率非常高,但是当时的厂商都没有找到太强大的盈利模式,使得靠一两个创新占领市场后,慢慢也没有什么大动作了。

迅雷,就是在这样一片原本稳定的没有清晰盈利模式的市场杀出了一条血路。这一点是我非常佩服迅雷公司的地方,此事情,也算是中国互联网的大事,从此下载软件变新颜。

一开始迅雷就非善类,利用了中国的法律漏洞,网民的维权意识不足和计算机知识的不足,最初靠的是雷区这个下载资源区和其P2SP这样类似BT的下载方式,要知道,在当时,你甚至没有办法去控制自己的上传,基本上,你一旦开着迅雷,你就开始为其他网民的下载提供了上传服务。

当然,贡献上传,互相帮助,人人为我,我为人人,这些本身就是P2P软件下载方式所提倡的,也是BT,Emule存在的根本,但是,那些都是可知的,可控的,我是知道自己在上传的,迅雷就压根不告诉你这些!就这一点,划为流氓软件也毫不过份!那是我还在读大学,与室友共享一个网络,只要一个室友开着迅雷,毫不下载,网络照样卡的要死!

过了很久很久以后,迅雷市场稳定了才承认了其下载的技术(的确此技术是让下载速度快了很多),对迅雷公司这样的发家方式非常不齿!虽然,我承认,迅雷在技术上是比原来的不思进取的flashget,netant之辈更加好的,但是,很明显在中国的大环境下,基本上漠视了大家的基本权益。至于雷区那种靠着号称网友上传,然后置软件版权于不顾的方式,中国大环境使然,也不责怪迅雷了。

不过,迅雷的创新意识和市场把握能力非常之好,这点我非常佩服,也值得学习,随后开始兼容BT和Emule的下载方式,但是此时的流氓作风又尽显,当时我习惯使用的BitComet,怎么也没有办法调回默认方式了,只要迅雷在,基本上,其永远默认,唉。。。。。。。。再以后,BitComet也提供了普通下载方式。。。。但是已经难免颓势。

随后,迅雷又侵入了PPLive,PPStream等软件已经开拓完善并且已经牢牢把握住的在线视频市场,提供了迅雷看看的服务,此服务说来雏形是BitComet提供的边下边看,但是因为技术上不是太完善,下载速度不是太理想,后来并没有太完善和宣传(风行当年似乎以此为宣传)。因为迅雷的下载速度保证,迅雷看看提供的服务的确相当优秀!!视频的清晰度,流畅程度远非当时的PPLive,PPStream可比,比起土豆,优酷那样模糊不堪的视频效果那就更是一个天上,一个地下了,事实上,我发现我的软件使用习惯,在迅雷看看出来后就变了,卸载了PPLive,PPStream,BitComet,Emule等软件,仅仅保留了迅雷及迅雷看看,后来,xunlei的网页也已经改为了迅雷看看了,足见迅雷看看的成功。

但是,此时迅雷为了保证其迅雷看看的下载速度,流氓行径未改,事实上,只要你上迅雷看看的网页上看过一部电影,后台运行的迅雷看看就一直开始默默的运行,并上传,哪怕你退出了网页后,其叶不自动关闭,无数次,我发现上网速度奇慢,原来是刚才看过电影,忘了关闭迅雷看看了。这种做法,人神共愤!

再然后,最近迅雷推出了迅雷看看播放器,开始抢夺暴风影音的市场(当然,我只用kmplayer),不仅可以播放本地的视频,在线的视频播放也得到了很好的支持,同时兼有迅雷看看在其后作为在线的影库,本人甚为欣赏这样的创新,但是,流氓行径仍然不改,关联里面竟然默认选择总是保持文件关联的选项。

xunleikankan2导致安装后,人们会不明就里的让迅雷看看永远霸占自己的所有视频播放权。。。。。当然,看片后,你点击关闭后,迅雷看看只会最小化,不小心,你就让其在后台默默的运行,然后上网速度奇慢了。。。。。

上述,就是迅雷的发家流程。。。。。

我表达一下自己的看法:

迅雷在下载领域的创新我觉得是非常值得鼓励,netant,flashget等软件,在稳握当时市场的情况下还会被后来的迅雷所击倒,的确也因为他们的不思进取。不仅是思想上的创新,技术上的创新,比如P2SP的引入,我觉得也是很了不起,因为实实在在的在中国这种破网络环境下给我们提供了很快速的下载速度,向迅雷致敬!

其后提供的雷区服务,再然后提供的狗狗搜索服务,为我们搜索资源提供了很大的帮助,生僻的资源不需要再去Google或者baidu上去摸瞎了,想起当年,最开始缺少啥的时候肯定是Emule上搜索,但是那个下载速度实在太慢了点,Bt没源又是常事,迅雷这时候帮了我很大的忙。

迅雷看看别具一格,让在线视频不再模糊。。。。。。。改变了我原本的观影习惯,原来看电影,习惯上都是下载到硬盘后然后再看,根本无法接受Youku,Todou和PPLive,PPStream(只用来看电视)之流的模糊视频,这点的贡献怎么说都不为过!

基本上,迅雷围绕着自己的核心技术(下载)提供的周边服务,将其核心技术的价值发挥到了极致,非常值得现在的互联网公司学习,(其模式与汉王很像,汉王的核心技术也就是汉字识别技术,然后其后推出的手写电脑,扫描笔,PDA,电子书等,无不围绕此技术发展),随着迅雷的发展壮大,迅雷慢慢成长为平台提供的公司,比如现在不断的运营网络游戏。

迅雷的发家流程,可看做互联网公司发家致富的经典教材。。。。。。。。。

但是,其中很多做法实在是流氓软件行径,不断的打法律的擦边球,漠视网民的权益,为了尽量让网民提供上传不择手段,我为其不齿!唉。。。其实,也不能全怪迅雷一家公司,大环境使然,想起某人的一句很经典的话,假如犯罪的收益能远远大于被逮住的风险和被逮住后的惩罚,那么人人都会犯罪!迅雷不过也就是衡量了收益和风险后,这样做的另一家公司罢了。。。事实上,上述流氓行为的确也在迅雷发家致富的路上起了很大的作用……假如制度还是不完善,假如相关的法律无法真正实施,网民还是无法形成维权意识,迅雷也是下一家准备利用流氓手段发家的互联网公司的经典蓝本。可叹。。。。。

最近搜狐告迅雷侵权。。。。。。。。。算是中国特色了。。。因为迅雷侵犯的主要是电影公司的权益吧。。。。。但是电影公司没有去告,而是搜狐出来。。。。

迅雷公司回击。。。我们来比一下谁的版权产品多。。。。。。又是典型的中国式回答。。。那么,某一天,杀人犯也会出来说,我们比一下谁没有杀的人多吧!

唉。。。。。。。。最后,还是支持搜狐吧,要知道迅雷一贯并非善类,中国的版权法我都不知道是用来干啥的了。。。。。。只希望,迅雷公司这样的互联网公司,多多保持创新,多多研究用户的使用习惯和行为模式,而不是一门的挖空心思去欺骗用户和弄一些混淆用户的东西。。。。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

中国的软件流氓行为何时了?搜狐输入法竟然自动下载并要求我安装浏览器!!

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

在没有经过本人允许的情况下,自动的下载搜狗的浏览器,并开始提示我安装了!!!!郁闷啊。。。。。。。。中国的软件流氓行为实在是无止尽啊。。。如下图。。。。

image 在搜狐输入法被qq黑了的时候,我还以为搜狐是善类,结果为了推广自己的浏览器也是不择手段啊。。。。。。唉。。。。大环境啊。。。。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

新浪惊现通用云计算平台 Sina App Engine横空出世 支持PHP

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

当做电子商务的亚马逊在全球率先推出通用云计算平台时,让大家震惊了很久,随后Google也推出了App Engine,原来仅仅支持Python,现在已经支持了JAVA。2009年9月,阿里巴巴集团在十周年庆典上宣布成立子公司“阿里云”,叫嚣要提供比亚马逊更多服务的时候,我才开始看到国内游企业开始进军云计算平台的领域,但是,事实上,此事上新浪已经先行一步了,今天很惊讶的发现Sina App Engine已经开始内测了。。。。。

http://sae.sina.com.cn/,虽然sina还没有大肆的宣传,但是,从其命名上sae(Sina App Engine),加上其简单的定位“Sina App Engine - 简单高效的分布式Web应用开发与运行平台”,很明显能看出这是与Google App Engine类似的通用云计算平台,有意思的是,Sina不知道是有意的避免与Google进行直接的竞争,还是考虑到国内的网络开发国情,提供的是PHP+MySQL的服务:)

其服务列表上说明的是:

支持的服务:

  • PHP 5.3.0
  • Mysql 5.0.86
  • Memcache
  • Fetch URL

相当的类似本地开发,呵呵,广大的PHP开发者有福了。。。。。。想当年我为了尝试Google的App Engine还特意去学习了Python。。。狂汗-_-!当然,我还是没有福,因为我不实用PHP。

假如没有意外的话,Sina将是国内第一家推出通用云计算平台的企业,Sina作为国内三大门户,很不幸的没有像163,Sohu一样在新兴的网络游戏市场上分到大馅饼,(现在163,Sohu从营收来看更像是一家网络游戏公司,特别是163,Sohu的网络游戏分拆上市还好点)但是Sina估计痛定思痛,反而能沉下心来研究一些传统互联网公司应该研究的东西,这一次,Sina的赌注绝对没有下错地方,当然,首先还得SAE的确好用才行,我看了演示,应该还好,并且就我了解,国内的网页开发PHP也的确是主流,预祝SAE成功:)

另外,由于目前还在内测阶段,好像需要邀请码,并且现在已经不让注册了,导致我没有办法实际的去尝试一下了。。。虽然其实我不懂PHP。但是这里有个演示视频,大家可以先体验一下。再不过瘾,看看文档先?

以下是Sina在文档中对SAE的简介:

SAE简介

Sina App Engine(SAE),是由新浪公司开发和运营的开放云计算平台的核心组成部分。

SAE的目标是实现互联网应用在开发运维上的无缝整合,为App开发者提供稳定、快捷、透明、可控的服务化的平台,并且减少开发者的开发和维护成本。

同时通过对消耗资源的量化,反向作用于开发过程,促进新浪公司互联网应用服务的质量提升。

SAE具有以下特点:

  • 自动负载均衡 - - - - 根据应用压力自动调整服务规模,自动负载均衡

  • 自动分布式代码部署 - - - - 原子的将开发者代码部署到所有web前端

  • 自动健康检查 - - - - 所有设备自动健康检查

  • 故障系统自恢复 - - - - 发现故障服务自动内部无缝切换,故障报警和有限度自行恢复

  • 多平台简单SDK操作 - - - - 主流OS平台SDK支持,任何一台PC即可享受SDK

  • 快速分布式web应用开发 - - - - 提供多种分布式服务,接口友好封装,减少开发者学习使用成本

  • 团队开发协作 - - - - 开发者可以进行项目团队管理,代码管理、在线沟通方便有效

  • 资源自动分配 - - - - 符合云计算理念,所有资源在配额内,自动分配

  • 所付即所用 - - - - 符合云计算理念,最大粒度量化开发者成本,所付即所用,所付仅所用

  • 服务高可靠SLA保证 - - - - 全架构高冗余实现高可靠性

SAE为开发者提供以下服务:

  • PHP5 Runtime运行环境 - - - - 基于PHP 5.3.0内核

  • 支持读写分离的分布式数据库服务 - - - - 基于Mysql数据库

  • 分布式文件存储服务 - - - - 基于分布式文件系统

  • 基于Memcache协议的分布式缓存服务 - - - - 基于集群memcache系统

  • URLFetch远程数据抓取服务 - - - - 基于分布式proxy服务

  • Cronjob定时任务 - - - - 基于分布式定时器服务

  • SPP图片处理服务 - - - - 基于分布式高CPU计算服务

 

值得期待啊。。。。。。。。。。。

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

可怜的Sun公司,因为收购了MySQL,想卖自己都卖不了了

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

今天看到CSDN上的一则新闻《欧盟正式否决甲骨文收购Sun 甲骨文据理力争》后真是感叹啊。。。。

Sun也算是盛极一时的大公司了,因为JAVA语言而闻名于世,后来股票代码都改成JAVA了,虽然JAVA实际上没有为其带来太多的利润,但是Sun也算是能够自己提供硬件+软件全套的企业级解决方案的少数公司之一了,当年收购MySQL的时候还是风风火火啊,完善了自己产品链中最后的弱环,成就了开源世界最大的一笔收购案,Sun也从此有了从SPARC处理器 ,存储设备等硬件,到JAVA语言,Solaris操作系统,MySQL数据库等软件的完备产品链,一时间似乎成为了除IBM以外,服务器,工作站,企业级解决方案中最牛的公司,可惜啊可惜。。。。。

当年经济情况好的时候,大企业很Happy的烧钱,滋润了Sun这样的公司,但是,经济危机一到,大家收缩了银根,Sun就不好过了,开源的JAVA和MySQL都不可能拯救Sun。

最最可怜的是,今天Sun想把自己卖给Oracle,但是却因为MySQL的原因,导致在欧盟这里通不过,真是让人感叹啊。。。。。。

基本上,这也可以看做是IT历史上另一起因为盈利模式太单一导致的脆弱吧,哪怕是Sun这样的公司,犯了此错,也逃不了可悲的命运。

当年,谁又能想到,那是Sun对MySQL的收购案会导致现在这样的后果呢?只谈历史的戏剧性啊。

 

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

从C++到JAVA(1) 在CSDN博客中部署及运行JAVA Applet

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

 

前言

曾经,我有一个梦想,那就是我的程序能让人不需要下载就能通过浏览器运行,可惜学习的C,C++等都不具备此能力,学习完Python后,发现其也仅仅是以服务器端的开发为主,JS这种语言是慕名已久,买了著名的犀牛书,但是却一直未得时间细看,但是,JAVA会给我这个机会的。事实上,JAVA在最开始的时候就是因为JAVA Applet而流行起来。(参考二前言所言)因为以上原因,我学习JAVA也决定从JAVA Applet开始。

因为以后的工作会使用到JAVA,我不得不开始真正耐心的学习JAVA了,以前因为对Android的兴趣,浏览了《Thinking In JAVA》一书,但是一直没有真正的掌握和使用,工作压过来了,我算是彻底对JAVA缴枪投降了(事实上,作为C++程序员,很长时间我对JAVA有抵触情绪-_-!),这里,我以一个C++程序员的身份,提供一份从我C++到JAVA的学习记录,尽量将其做成从C++到JAVA的指南。首先说明一点的是,本人从来没有打算放弃C++,也不推荐任何人如此,从C++到JAVA仅仅指的是学习的流程而已,《JAVA Programming Language》与《Thinking In JAVA》两本书都非常不错,但是由于其目的的大而全,所以事实上对于C++程序员来说(比如我),篇幅过于巨大,熟悉了C++和OO的话也会碰到太多重复的内容,本人尽量将不同抽出来,忽略重复,提高学习效率。。。。要看完那两部大部头,实在得花太过不必要的时间。切记,本人假设读者非常熟悉C++及OO相关概念,重复内容一律不提,编程的基本知识更加是一律不提。

 

JAVA编程环境

毫无疑问,推荐先到http://www.java.com上去下载一个最新的JRE安装,而后,我出于方便,使用Eclipse作为IDE编辑和编译JAVA程序,运行嘛,由于我准备将左右的程序都做成JAVA Applet,所以,事实上,所有的程序都可以再浏览器中运行。JDK的话,可以使用Eclipse带的,也可以到JAVA的网页上去下载,这个随便,我是下载了一个。

 

JAVA Applet程序入门

为了使概念的演示更为直观,也减少大家对源代码运行的负担,首先学习的是JAVA Applet的编写,这样,以后的例子全部通过浏览器就能运行,大家可以在博客中直接查看运行效果,呵呵,这样也算利用JAVA的一点优势。。。。。将来我要是准备学习HTML,JS的时候都可以使用此方式,但是学习C++的时候。。。。。呵呵,就没有办法了。呵呵,在此离开老是依赖截图的日子吧。。。。。。。

首先看一个最简单的JAVA Applet程序:

import java.applet.Applet;
import java.awt.*;

public class AppletHelloWorld extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Wolrd",10,50);
}
}
 
JAVA程序有个让C++程序员别扭的特点,完全以对象为基础,没有任何全局函数,在普通的JAVA程序中即使是使用Main函数都是弄成一个类的静态成员变量,扭曲的无以复加。。。。(个人观点)当然,习惯的人也许觉得没有什么,个人感觉有点太强制了。。。。也许用惯了C/C++的人都太习惯自由吧。。。。呵呵,也不仅仅是这样说,Python不也是一切皆对象吗?还是可以方便的定义全局函数和变量,不仅仅是C/C++程序员才拿自由说事儿。
 
当然,这种强制性的思想是想将大家都往面向对象的正路上拽(James Gosling认为这是正路吧),与C++这种兼容C存在的半吊子面向对象编程语言决裂,以防落入C++开发者常常使用的C思维,可惜的是,事实上需要全局函数和变量的时候大家还是变着法子的用,单件,资源类则如是。。。。
 
说多了题外话,看这个例子吧,因为目前主要是将JAVA Applet程序的编写和部署,为以后的演示提供方便,暂时不准备详细讲解JAVA,所以关于语法的东西一切从简了,但是基本上希望大家能理解此例子。
 
import类似于C++中的include,但是不仅仅是那样,因为import不是文件,而是包,应该来说,更像是Python中的import,当然,编程时这样做会更加的便捷一些,特别是当这些语言不再拘泥于C++形式的声明实现分离时。java.applet.Applet的引入是此JAVA applet例子必须的,因为后面的主要类就是继承自Applet。java.awt是java的界面库,以*的形式表示引入此分类下所有类。
 
唯一的类AppletHelloWorld继承自Applet,继承时以extends关键字表示继承。所有的applet程序都必须含有一个直接或者间接继承自Applet类的类。public class中的class不用我多解释了吧,呵呵,public用于修饰类,表示此为公用类,可被此文件外的类所引用,不然,仅仅能被此文件中的类使用,JAVA的这种以文件分割类的方式(还以目录分割包)本人比较欣赏,虽然又多了份限制,但是能强制性的更好的管理大型项目的目录结构。后一个public用于修饰paint函数,此处与C++中的作用类似。paint函数是Applet类从java.awt.Container继承过来的,用于绘制图形(类似于MFC中的OnDraw和Qt中的paintEvent)。
 
paint函数的参数是个Graphics类的对象,java.awt.Graphics属于Java中显示的基本类,地位基本相当于Qt中的QPainater。此处用Graphic的drawString方法显示了"Hello World”字符串。
 
以上基本上就是这个简单的JAVA Applet程序的解释了。

 

JAVA Applet程序部署及运行

关于JAVA Applet的部署其实JAVA的官方主页上有一大节讲这个的,关于用Applet Tag部署的内容见《Deploying With the Applet Tag》。

首先,假如使用命令行操作的话,将上述代码保存成一个名为AppletHelloWorld.java的文件,并用javac编译,生成AppletHelloWorld.class文件。假如使用Eclipse的话就简单了,生成一个工程,文件名不要错了,然后build projects就好了(或者是自动编译的),然后(默认情况下)可以在工程的bin目录下找到AppletHelloWorld.class。

生成的class文件就是我们需要运行的文件,部署JAVA Applet时,需要建立一个如下简单内容的HTML文件:

<html>
<head><title>我的第一个JavaApplet程序</title></head>
</body>
<p>
<applet code=AppletHelloWorld.class
width=300
height=200>
</applet>
</body>
</html>

 
保存为html文件,并放在与class文件同一目录下,用浏览器打开此html文件即可看到运行效果,显示hello World字样,此文字并不是写死在HTML中的,而是由JAVA Applet动态运行生成并显示的。。。。。虽然在此例中还看不出区别-_-!但是,现在仅仅是个Hello World程序嘛,不用急。在官网上讲的所有applet tag部署内容都是假设jar或者class是在当前目录下的,这在自己做网站的时候或者本地实验没有什么,可以自己确定各个文件的位置,可是在CSDN博客上这一套就行不通了,还好我找到了HTML的applet tag的specification,其中有个官网没有讲到的确定文件位置的codebase tag。

此时,我将上述class文件上传到我在google code上托管的地方,(事实上,大家愿意上传到哪里都可以,只要提供了直接的链接地址就行)然后直接用codebase指定位置,然后直接将相关的html嵌入此博文,那么,大家就能直接看到运行效果了:)

代码如下:
<p>
<applet codebase="http://jtianling.googlecode.com/files/"
code="AppletHelloWorld.class"
width=300
height=200>

下面是一个java applet程序的运行效果:

并且发现,文档中明确说明:

“APPLET is deprecated (with all its attributes) in favor of OBJECT.”

让我大为郁闷。。。。。。。deprecated的东西了。。。。但是本人目前不准备深入的去研究HTML,仅仅是学习JAVA,甚至JAVA Applet的学习都是为了JAVA的学习时演示方便,所以,怎么将上述applet tag的例子转化为用OBJECT tag,我就不研究了,应该不难。

说明:本人学习JAVA时间较短,虽然尽量保证所写下的是有依据的东西,但是并没有讲C++程序时那么有把握,所以碰到不对的地方还请各位JAVA高手指正。

 

参考资料

1.《Thinking In JAVA》,英文版,第4版,Bruce Eckel著,机械工业出版社

2.《JAVA Programming Language》,英文版,第4版,Ken Arnold,James Gosling,David Holmes著,人民邮电出版社

3.《JDK 6 Documentation》,JAVA在线文档集合

4.《The Java Language Specification, Third Edition

5.《Java™ Platform, Standard Edition 6 API Specification

6.《HTML 4.01 Specification

 

 

完整源代码获取说明

由于篇幅限制,本文一般仅贴出代码的主要关心的部分,代码带工程(或者makefile)完整版(如果有的话)都能用Mercurial在Google Code中下载。文章以博文发表的日期分目录存放,请直接使用Mercurial克隆下库:

https://blog-sample-code.jtianling.googlecode.com/hg/

Mercurial使用方法见《分布式的,新一代版本控制系统Mercurial的介绍及简要入门

要是仅仅想浏览全部代码也可以直接到google code上去看,在下面的地址:

http://code.google.com/p/jtianling/source/browse?repo=blog-sample-code

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

Windows下多鼠标/双鼠标技术专题

首先要说的是,此文的主要内容都来自本人 在 湖南大学  郑善贤 老师指导下写的 毕业论文

可以在此http://groups.google.com/group/Single-Display-Groupware找到我参考的英文资料,也可以在此讨论相关问题。

建议先阅读此前言:

Windows中多指针输入技术的实现与应用(说在前面的话(1))

后面是正文:

Windows中多指针输入技术的实现与应用(2摘要及参考论文)

Windows中多指针输入技术的实现与应用(3 绪论)

Windows中多指针输入技术的实现与应用(4多鼠标输入的底层实现)

Windows中多指针输入技术的实现与应用(5 利用多鼠标输入框架软件实现)

Windows中多指针输入技术的实现与应用(6 Single Display Groupware Toolkit的应用)

Windows中多指针输入技术的实现与应用(7 分时多鼠标控制系统鼠标的问题)

Windows中多指针输入技术的实现与应用(8 总结及继续MFC的讨论

Windows中多指针输入技术的实现与应用(9 我设想用来实现MFC多鼠标的透明窗口源代码。。。)

Windows中多指针输入技术的实现与应用(10 双鼠标五子棋源代码 全系列完)

 

一篇很有价值的译文:

在微软Windows中支持多指针设备(Supporting Multiple Pointing Devices in Microsoft Windows)

 

后记:全系列构成了本人的本科毕业论文,个人感觉基本上对得起中国的本科教育了,不说多么优秀,技术多么高,我本人还是下了功夫去学习和写的,虽然现在看起来原来那学生时代的水平,包括代码编写的风格都还是比较稚嫩的,而且现在回过头来看,其实真正核心的内容也就RawInput一点。-_-!呵呵,但是考虑到那是在几乎没有国内资料的情况下完成的,还是有一定的成就感,并且在微软举办博客征文比赛的时候曾经想以此文去蹭一个键鼠套件,结果仅仅获得优秀奖拿了件破衣服,汗颜-_-!有选择的话,我还不如混本《程序员》杂志强呢。。。。立此存照,以为纪念,相关资料还是有很多人问起的,本人懂得此文及其链接基本包括了。总结一下,以后发链接回答问题也快点。。。。。。别怪我偷懒。

devWOW博客获奖

最后,今天在查看此文链接时,竟然发现有人的论文在参考文献中引用了我的论文-_-!也算没有白写。。。。。。想起中国大学的某项制度,核心刊物发表论文+被引用计数。。。。我也算被引用计数一次了………

FireShot capture #006 - '多鼠标交互型PPT对中国课堂教学的启示' - www_zxqikan_cn_wz_200908_108851_2_html

阅读全文....

Win32 OpenGL系列专题

因为转来后格式混乱,所以在本博客不保留原文了,直接去CSDN看吧.

 

这个系列是当时边学OpenGL边写的,那个时候对OpenGL的理解非常肤浅,就是对着红宝书及一些网上的例子学习,现在回头来看,很多地方还是有不对的地方,绝对不推荐初学者不辨别对错的阅读,以免被我误导,可以作为学习之余添加的例子观看,因为我总是想着弄些好玩的东西,例子可以试试,也许可以增加你的兴趣。

阅读全文....