作者: meathill

  • PHP通过Sql生成带特定索引的数组

    不明白原理,从别人代码中看到的,蛮好用,不过似乎性能不好:

    SELECT id, sum(rmb) AS rmb, sum(device) AS device
    FROM log_table
    WHERE date>'2012-10-20'
    GROUP BY id

    这样一段Sql,用PHP自带的pdo这样请求:

    $result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE|PDO::FETCH_GROUP);

    可以得到一个数组,使用sql中第一个字段也就是id为索引,每个元素为一个含两个属性(rmb, device)的对象。换成json写法大概是这样:

    // 以前
    [{id: 1, rmb: 1, device: 1}, {id: 2, rmb: 2, device:2}]
    
    // 现在
    {'1': {rmb: 1, device: 1}, '2': {rmb: 2, device: 2}}

    这样再操作会方便很多。

  • Nexus S很诡异的单击变双击现象

    被报告了一个很诡异的Bug,在且只在三星Nexus S上出现,系统版本4.0.4和4.1.1都有:

    一次点击,会触发两次点击事件。两次事件的 target 和 currentTarget 都相同。

    因为只在三星Nexus S上出现,调试相当困难,反复无果。后来想起来我用zepto类库作为底层库,而且编译时把touch部分也编译进去了,所以尝试着将 click 替换为 tap ,居然解决了……

    具体问题症结,以后再研究吧。

  • 兰卡威之旅:总结篇

    我和我老婆把旅行的第一站选在富国岛,如今看来是幸事也是不幸。幸运的地方在于,蜜月之行如此完美;不幸的地方在于,之后的旅游还都没能赶超那次。而且我越发觉得,一个地方,应该去不止一次——第一次通常都要交些学费,等弄明白各种选择的优劣,渐入佳境的时候可能就要走了,所以后面几天虽然更好,但已为时不多——好吧,我真正想说的是,7、8天假期完全不够玩……

    这次出去玩,还肩负着一个历史使命——带我父母一同出游,并且给我爸过60大寿。工作之后,回家陪伴他们的机会就不多了,出去旅游更是绝无仅有。这次趁着他过生日,又恰逢国庆中秋连休,决定带他们俩一起出去玩,一来尽孝道,二来工作这么久了,也得回馈回馈家里了。

    老爸老妈百年好合
    老爸老妈百年好合

    整体来说,兰卡威之旅还是相当圆满的;不过,这几天也踩了不少坑,值得记一下提醒后来人。后面开始总结。

    (更多…)

  • 新版node.js安装教程

    知道node.js这个东西后,一直想尝鲜。今天终于下手,先要安装环境,看了好多教程,没看太明白,似乎很难的样子。

    最后按照官方文档自己尝试了才知道,原来现在安装node.js已经完全自动化了。我用的是Ubuntu 10.4,先更新一下源:

    sudo apt-get update
    sudo apt-get upgrade

    然后安装GNU make和git,接着clone代码,最后make就ok了。

    sudo apt-get install gcc
    sudo apt-get install git-core
    git clone git://github.com/joyent/node.git
    cd node
    ./configure
    make
    make install

    make的过程比较久,让它慢慢跑就是了,完成后,就可以在命令行里测试了。现在node.js已经是0.9.3-pre版了,看到版本号很高,心里很高兴呀~

    node -v // v0.9.3-pre
    node
    > console.log('hello, world') // hello, world

    今天先到这里,将来哪天开新项目的时候用node.js做后端吧。

  • 浅谈Git在Web部署上的运用

    Git是个好东西自不用说,对比SVN来,它有以下好处:

    1. 分支操作速度快,便于制定开发流程
    2. 每个节点都是完整的代码库,可以不受中心版本库的制约
    3. 使用开源类库框架一样可以随心所欲修改并且进行版本管理

    做Web开发的时候,我一直想用Git进行部署。因为之前要么FTP,要么直接在服务器上修改,都会产生各种问题。最近尝试了下,发现还挺简单,记录下来。

    (更多…)

  • 偶遇小猫一只

    今天姆依姆依比较奇怪,非要叼着心爱的玩具骨头下楼玩,我们不明所以,也懒得管它,就任它去了。结果到了房后,他就把骨头丢到草地里,然后义无反顾的走了。我们很奇怪,不知道他脑子里想些什么。不过绕园一周后,我们带着他回到房后,准备把他的骨头拾回来,省得搞丢了将来他不高兴。

    路上突然听到猫叫声,非常小的喵喵喵个不停,好像是只小猫。不过我们没在意,继续去寻找玩具骨头。找到骨头返回的途中,猫叫声继续,我们停了一下,想看看是谁,没想到一小坨黑影突然移动过来,竟然是只小猫,只有我手掌大小。她好像很需要人帮忙的样子,走到我跟前,冲着我喵喵叫。姆依姆依对她似乎很感兴趣,不过我们当然不能让他们俩接触。因为家里以前一直有猫,所以我和老婆简单商量了下,先带回来喂点吃的,让她休息一下,再做定夺。

    两百万
    两百万吃了奶,肚子涨鼓鼓的,在桌子上玩

    带回家仔细一看,原来是一只玳瑁小母猫,很小很轻,放到地上就直奔姆依姆依的食盆,试图去吃每颗都和她嘴巴一般大的狗粮。我们看她饿得厉害,赶紧去冲了半盆奶给她吃。她真是饿了,把脸埋在盆里就一通舔,直吃的肚子完全鼓起来,我怕她撑着,赶紧把奶收了。然后我和老婆商量,该给她取个名字,即便不养,将来我们提起的时候也好交流。想了一下,决定叫她“两百万”,了解我的人应该明白这名字的来历,哈哈。

    睡着的两百万
    两百万可能觉得这儿还算安全,一会儿就睡着了

    接下来我们就开始发愁该怎么办。

    家里已经有了姆依姆依,不准备再接纳猫了。外来的野猫通常都会携带病菌和寄生虫——两百万倒是很健康的样子,吃饭玩耍都很有劲,还拉了一铺很标准的大便——有些对狗会造成严重伤害。但是把两百万送回去的话,她的未来很难预期,家里的专业人士推测她可能只有二周大,也可能挨不过楼下的秋冬。想来想去,还是找个好人家把她送走吧,尤其是,两百万看起来还挺漂亮的。

    希望大家能帮忙找个好人家。

  • 解决 iOS webkit 使用CSS动画时闪烁的问题

    解决 iOS webkit 使用CSS动画时闪烁的问题

    这个,咱们必须承认版本管理不是万能的,尤其对于像我这样习惯不好的人来说,更是如此。比如,上次不知道改了什么东西,导致肉大师制作的杂志在 iOS 里突然就变卡了,而且不仅卡,还伴随黑块、切换图片的最后会闪一下。

    开始我一直以为是性能问题,调啊调啊调啊,就是不见好。于是 Google “ios phonegap 闪烁”,然后发现一篇文章,内容是解决 iOS 下 Safari 渲染 Transition 时页面闪动的问题。说只要加一句 -webkit-backface-visibility: hidden; 就行,这样可以避免元素转换时显示元素背面。虽然听起来莫名其妙,不过我觉得有戏,但是文章里没有提应该加在哪儿,所以我想了想,在样式表里加了一句:

    #container {
      -webkit-backface-visibility: hidden;
    }
    

    因为我用到 iScroll,而负责动画的CSS是加在 #container 上,所以我就理所当然的把这段代码加在这里。测试,没有效果。

    于是我一发狠,把这段样式加在所有元素上,居然问题就解决了。

    #viewport * {
      -webkit-backface-visibility: hidden;
    }
    
  • 书评:《基于MVC的JavaScript Web富应用开发》

    封面
    基于MVC的JavaScript Web富应用开发一书的封面

    知道这本书源于那篇博客:《旅行,写作,编程》。读完文章后,我忍不住顿足捶胸,尼玛这才是生活啊,这才是程序员应有的生活啊!!最尼玛让人崩溃的是,作者才21啊!!就把我30岁之后的梦想实现了。感叹之后,屌丝的生活还得继续。谁让咱们一出生就是Hard模式呢,老实说我对目前的生活还算基本满意,当然如果我也能环游世界写本书啥的,我可能也觉得洒家这辈子值了。

    (更多…)

  • 使用jQuery托管事件对阻止冒泡的影响

    使用jQuery托管事件对阻止冒泡的影响

    列表范例
    移动App中常见的列表

    jQuery托管事件是个好东西,减少侦听器的数量,还能降低内存泄露的风险,尤其在列表类的应用比较常见。

    想象一个如右图所示的下载列表,点击各列表项会展开详情,用户可以在里面查看详细信息;不展开的话也可以直接点击右边的下载按钮,就会直接下载应用。使用jQuery来写代码大概是这样的:

    $('#app-list li').on('click', function (event) {
      // 显示/隐藏详情
      $(this).toggleClass('active');
    });
    $('#app-list .download-button').on('click', function (event) {
      // 下载通过超链进行
      // 这时为了不让详情展开,需要阻止事件冒泡
      event.stopPropagation();
    });
    

    假如列表里有20个选项,那么这样就会添加40个侦听器。在PC浏览器里这样做问题不大,但是移动设备内存比较少的话可能会引发问题。另外,如果我们还引入了“上拉读取更多”和“下拉刷新”的功能,那么就要为内容的更新添加更多的代码,以避免内存泄露。所以这时,就应当将事件托管到ul去处理。( 关于jQuery事件托管可以参考其文档(http://api.jquery.com/delegate/)。)

    $('#app-list').on('click', 'li', function (event) {
      $(this).toggleClass('active');
    });
    $('#app-list').on('click', '.download-button', function (event) {
      event.stopPropagation();
    });
    

    可以看到,我没有修改事件处理函数。这样做,我们只添加了2个侦听器,并且不管#app-list里的内容如何变化,都不需要重新注册侦听器。这给代码减了不少负。

    不过接下来我发现,点击按钮后,详情仍然会被展开收起,似乎阻止冒泡的代码没有生效。仔细一想,对了,我已经把事件注册到#app-list上了,所有的事件其实都是冒泡上来的,所以点击按钮,冒泡必然经过上层节点。于是继续修改代码,改变事件处理函数的逻辑:

    $('#app-list').on('click', 'li', function (event) {
      // 如果事件始于下载按钮,则退出
      if ($(event.target).is('.download-button')) {
        return;
      }
      $(this).toggleClass('active');
    });
    

    这样便万事大吉了。

  • JavaScript奇葩的参数机制

    JavaScript奇葩的参数机制

    今天实习生遇到一个问题:有一个数组,想在一个函数里将它清空,结果办不到。代码大概是这样的:

    function empty(arr) {
      arr = [];
    }
    var array = [1, 2];
    empty(array);
    console.log(array); // 预期 [],实际 [1, 2]
    

    对于我这种半路出家根基不实的人来说面对这种问题总是很挠头。于是只有翻书,在《JavaScript高级程序设计(第三版)》上看到,原来JavaScript的函数参数设计这么奇葩。

    首先,JS里的变量分为值类型和引用类型,这点我是知道的。基础类型只有NaN、null、undefined、String、Number这5个,其他都是引用类型,也就是赋值时传引用不复制值的类型。区分如下:

    // 值类型
    var a = 'test',
        b = a;
    b = 'temp';
    console.log(a); // 'test'
    
    // 引用类型
    var a = {id: 1},
        b = a;
    b.id = 2;
    console.log(a.id); // 2
    

    但是在用在函数参数的时候,又会有所不同。参数并不是传递的引用,而是传递的引用的引用。所以即使用“===”判断,也会返回true,因为最终指向的对象是一样的。但是如果在参数中对参数重新赋值的话,就相当于改变了引用地址,重新创建了一个对象,也就无法操作外面的对象了。这可能也是“运行时环境对象”造成的结果吧。