分类: 计算机

  • Firefox 10

    Firefox 的版本号终于到了两位数,我把最近几年主要浏览器的版本号变迁做成图:

    web-browser-version

    Chrome 一开始很快,后来保持了平稳;

    Firefox 一直很平稳,后来一度有所减慢,在 Chrome 压力下突然加速;

    IE 嘛…

  • 改用 Android 之后 II

    在换到 Moto Defy 进入 Android 阵营之后,曾经写过一篇博客,对比 iOS 系统和 Android 系统。这篇博客被一些网站转载(1, 2)后,被各种“大神”们猛喷

    现在 Defy 已经用了快半年,期间也接触过一些别的 Android 手机,最近实验室的项目更是进入了 Android 开发领域,是时候再写一篇,进一步写一写使用的感受。这次就不做对比了,因为手头没有运行 iOS 5 的苹果设备,而且也没有怎么用过新的 iOS。

    先看一看之前那篇中写到的观点。

    • 同步

    我始终还是认为,iOS 的同步是一个很好的方法,在音乐和视频传输、应用程序安装和数据备份方面都有明显的优势。

    (更多…)

  • Google 今天又碉堡了

    Firefox 或者 Chrome 之类的现代浏览器,在 Google 搜索 let it snow,就能看到下雪还有窗户上的雾,还能在上面写字。不过 IE 又被华丽的无视了(IE 9 也没有,我机器上的没有,也有人说 IE 9 有)

    encryptedgooglecom-2011-12-18-15-43-25

    encryptedgooglecom-2011-12-18-15-44-54

  • Google stackoverflow in Firefox

    自从发现了 stackoverflow.com 就无法自拔,csdn.net 之流完全无法何其匹敌。不过 stackoverflow 自己的搜索还是不太靠谱,于是每次都是用 Google 的 site 参数搜索 stackoverflow.com,用起来比较麻烦。于是做了个 Google Stackoverflow,可以在 Firefox 的搜索栏里面直接用 Google 搜索 stackoverflow。正在审核中,不过已经可以尝试安装了。

  • x=x++;

    之前囧哥曾经写过一个日志,讨论一个问题,就是在c/c++里面这个代码的结果

    x = 1;
    x = x++;
    

    执行后,x是2。这个结论还是比较显而易见的,不过编译器到底是怎么处理这段代码的呢?
    我用 Fedora 15 自带的 gcc -S -O0 将 .c 编译成 .s 文件,来看看究竟编译器干了什么。

    int x = 13; // 为了看汇编更方便,赋值13
    x = x++;
    

    被翻译成如下的汇编代码:

    movl	$13, -4(%rbp)  ;x=13
    addl	$1, -4(%rbp) ;x++
    movl	$0, %eax
    popq	%rbp
    

    从汇编码来看,gcc 是这样理解x = x++的:

    x = x; // 被优化掉了
    x++;
    

    也就是对于 int 这种 trivial 类型,= 的优先级高于后置++。 先赋值,再做后置++。
    我们再来试几个代码:
    第一组

    int x=13;
    int y;
    y = x++;
    

    翻译结果:

    movl	$13, -4(%rbp) ;x=13
    movl	-4(%rbp), %eax ;eax=x
    movl	%eax, -8(%rbp) ;y=eax
    addl	$1, -4(%rbp) ;x++
    movl	$0, %eax
    popq	%rbp
    

    ————————————————–
    第二组

    int x=13;
    int y;
    x = y = x++;
    

    翻译结果:

    movl	$13, -4(%rbp) ;x=13
    movl	-4(%rbp), %eax ;eax=x
    movl	%eax, -8(%rbp) ;y=eax
    movl	-8(%rbp), %eax ;eax=y
    movl	%eax, -4(%rbp) ;x=y
    addl	$1, -4(%rbp) ;x++
    movl	$0, %eax
    popq	%rbp
    

    ————————————————–
    第三组

    int x=13;
    int y;
    y = ++x;
    

    翻译结果:

    movl	$13, -4(%rbp) ;x=13
    addl	$1, -4(%rbp) ;++x
    movl	-4(%rbp), %eax ;eax=x
    movl	%eax, -8(%rbp) ;y=eax
    movl	$0, %eax
    popq	%rbp
    

    ————————————————–
    从各个例子中可以看出,gcc 对于 int 这种 trivial 类型,认为 = 优先级高于后置++,低于前置++。

    赋值先于后置++,后于前置++。

    即使复杂点的例子x=((x++)+(y++)),相当于:

    x=x+y;

    x++;

    y++;

  • 改用 Android 之后

    最近,终于把用了5年的Nokia 6030换成了Moto Defy,从功能机转换到了智能机,按某人的话说就是“终于符合一个Geek的身份了”。之前一直是6030配合一台iPod touch 2在用,出门的时候要放两台机器在口袋里,估计过一段时间就可以用一个Android完全取代了。

    同时使用iOS设备和Android设备,必然会在这两者之间有一些对比,一起来看一看吧。 (更多…)

  • 使用 Shell_NotifyIcon 的两点注意

    1. 建立结构体的时候:

    
    NOTIFYICONDATA m_notifyData;
    m_notifyData.cbSize = sizeof(NOTIFYICONDATA );

    很多例子都是这么写 cbSize 的,但是一旦使用了 VS 2008 或者更高版本,你会发现这样的系统托盘图标在 XP 系统上无法弹出气泡提示,其实 cbSize 像下面这样赋值

    m_notifyData.cbSize = NOTIFYICONDATA_V2_SIZE;

    NOTIFYICONDATA_V2_SIZE 是 XP 可以接受的,当然这样做可能会丢失一些高级功能。

    2. 处理点击托盘图标弹出菜单的时候:

    (更多…)

  • Behind Tetris5 – Game UI

    介绍完了游戏部分,再来看看整个游戏界面部分的实现。整个游戏界面全部实现于一个页面之中,通过画面切换显示不同的功能。界面示意图如下:

    ui

    界面切换时,通过调整div#cubeReel的left值,显示出不同的功能页。滚动动画效果通过jQuery的animate函数实现。
    界面上的所有按钮样式均是通过CSS3实现,部分样式如下:

    button {
    /* ... */
    border-radius: 2px;
    box-shadow: 1px 1px 2px #ccc;
    -moz-transition-property: border-color,color;
    -moz-transition-duration: 0.3s;
    }
    button:hover, button.hover {
    /* ... */
    -moz-transition-property: border-color,color;
    -moz-transition-duration: 0.3s;
    }
    button:active {
    box-shadow: 1px 1px 1px #ccc inset;
    }

    border-radius属性实现了按钮的圆角。box-shadow属性实现了阴影,按钮在一般状态下使用的外阴影,在按下状态时使用了内阴影(inset)。transition的应用使按钮在鼠标移入(hover)和移出时有渐变效果,示例代码只展示了Gecko所使用的-moz前缀的transition属性,不同的浏览器对transition的实现程度不同,-webkit、-o和-ms前缀的transition属性分别是WebKit、Opera和Internet Explorer的实现。

    背景音乐则使用了HTML5中新的JavaScript对象Audio,它可以播放浏览器支持的音乐文件。使用方法类似于原来的Image对象:

    (更多…)

  • Behind Tetris5 – Game Core

    Tetris5的游戏逻辑核心移植自本科的一个J2ME课程设计,基于性能方面的考虑,使用该核心设计的手机版俄罗斯方块可以在手机上流畅运行,那么移植到JavaScript上的性能将会有保证,并且毕竟JavaScript和Java还是有一些联系,从Java移植的难度也相对较小。JavaScript和Java都是面向对象的编程语言,但是它们在对象的实现方法上还是有一些不同。Tetris5主要使用了两种对象定义方法:函数对象和单次对象。函数对象的定义和使用方法例如下面的例子(Block.js):

    var Pos = function () {
    this.x = 0;
    this.y = 0;
    };
    
    var Block = function (type, initPos) {
    this.blockType = type;
    this.pos = new Pos(); // 使用之前定义的Pos对象
    this.pos.x = initPos.x;
    this.pos.y = initPos.y;
    this.style = 0;
    // ...
    this.Down = function() {
    this.pos.y--;
    return this.pos;
    };
    // ...
    };
    

    这种定义可以创建多个函数实例,在不同的场合使用。所以像位置和块对象采用了这种方法,它们在游戏进行的过程中会被多次创建和销毁。

    (更多…)