站内搜索

“插件” 找到 68 条结果

ThinkJS 开发之前端热更新

用过 ThinkJS 的人都知道,开发模式下 ThinkJS 是支持实时更新的,也就是说不需要我们重启服务就能让修改生效,不得不说这种开发方式真的非常方便。然而对于前端代码我们还是得老老实实的刷新页面才能看到效果,我们能不能让前端代码也支持热更新呢?答案是肯定的。首先我们看一张动图了解我们最终想要功能是什么样的(点击图片查看大图)。

关于前端页面自动刷新,其实有非常多的方案了,从简单的 F5, Live Reload 到 Browser Sync 都是非常不错的方案,当然按照套路本文的主角肯定不是它们了。用过 webpack 的同学应该都用过或者知道 webpack-dev-server 吧,想必大家都对它的不刷新页面热更新代码的方式眼前一亮,没错,今天我们的主角是它!

The webpack-dev-server is a little Node.js Express server, which uses the webpack-dev-middleware to serve a webpack bundle. It also has a little runtime which is connected to the server via Sock.js.

via: http://webpack.github.io/docs/webpack-dev-server.html

正如官方文档开头写的那样,webpack-dev-server 本质上内部是用了 express ,使用 webpack-dev-middleware 在服务端编译,并使用 websocket 通知页面进行更新。那么问题来了,我们是一个 ThinkJS 的项目,为啥为了使用热更新还非得去再启一个别家的服务,这什么鬼!好在不是我一个人这么想的,所以有人开发了 webpack-hot-middleware 这个项目,将 webpack-dev-server 热更新功能脱离出来,让我们能自由自在的在自己的服务上搭建。所以我们只要 webpack-dev-middleware 和 webpack-hot-middleware 配合就能实现 webpack-dev-server 的热更新功能了。

不过 webpack-dev-middleware 和 webpack-hot-middleware 都是 express 的中间件,在 ThinkJS 上无法直接使用。所以我将它们简单的包装成了 ThinkJS 的插件:think-webpack-dev-middleware 和 think-webpack-hot-middleware,大家直接安装就能使用了。具体的添加过程如下:

  1. 安装中间件:

    npm install think-webpack-hot-middleware think-webpack-dev-middleware --save-dev
    
  2. 修改 src/common/bootstrap/middleware.js 定义中间件:

     import webpackDevMiddleware from 'think-webpack-dev-middleware';
     import webpackHotMiddleware from 'think-webpack-hot-middleware';
     import webpack from 'webpack';
     import config from '../../../webpack.config.js';
    
     const compiler = webpack(config);
    
     think.middleware('webpack-dev', webpackDevMiddleware(
       compiler,
       {
         stats: { colors: true }
       }
     ));
    
     think.middleware('webpack-hot', webpackHotMiddleware(
       compiler,
       {
         log: think.log
       }
     ))
    
  3. 修改 src/common/config/hook.js 将定义好的中间件添加到 resource 的钩子中:

    export default {
      resource: ['webpack-dev', 'webpack-hot']
    }
    
  4. 修改 webpack.config.js 添加监听客户端 webpack-hot-middleware/client 以及热更新插件:

    var webpack = require('webpack');
    
    module.exports = {
      entry: {
        main: [
          'src/index.js',
          'webpack-hot-middleware/client?reload=true'
        ]
      },
      plugin: [
        new webpack.HotModuleReplacementPlugin()
      ]
    };
    

这样就可以实现 ThinkJS 内部前后端热更新了,如果有不是很懂的同学可以参考 think-webpack-hot-middleware/example 这个示例项目,直接 npm start 就可以看到效果。

PMBlog 转火麒麟

别院以前一直用的是我三年前开发的静态博客系统 PMBlog。这款程序(确切的说只能叫脚本)我自己还是比较喜欢的,插件主题什么该有的都有。不过这两年维护的时间越发的少了起来,加上最近参与到另一款基于 Node.js 的博客程序 Firekylin 的开发中,遂起了心想把这个静态博客切过来。

firekylin 有提供 WXR 导入功能,WXR 是 WordPress eXtend Rss 的简称,基本上可以算是博客程序数据转换的通用格式了。所以我只要把 PMBlog 的数据转换成 WXR 文件就好啦,为此特地将其写成了插件 Export2WXR。将插件拷贝到 plugins 目录下后再次编译会提示下载一个 .xml 文件。下载下来之后直接进入到 Firekylin 后台设置-导入数据将文件导入即可。

制作插件的过程主要是将数据转换成 XML 的过程,由于用的别人的 wxr 生成代码以及数据的不对应导致转换过程非常颠婆,具体就不多表了。由于之前就使用了 Disqus 的社交评论,新程序的文章地址和原来的略有不同,需要使用 Disqus 的 URL Mapper 工具对原来的文章网址进行重映射,将文章 URL 列表下下来之后用文本编辑器的正则批量替换基本上就能搞定了,这里给一个示例:

Find: http://blog.imnerd.org/(.+?)$
Replace: http://blog.imnerd.org/$1, http://blog.imnerd.org/post/$1

Disqus 的服务还是比较稳定的,不像之前帮 75team 转多说评论一样,各种导入导出功能失败,批量删除失败,数据太多失败,缓存抽风失败。只能说毕竟在国内,不赚钱的项目是没人管的,以后还是老老实实的用着 Disqus 吧。

博客程序切过来之后希望能像月影大大那样激发热情高产起来!哈哈!

Typecho在线升级插件 - Update 0.0.2

是不是已经厌烦了Typecho每次升级还得开FTP覆盖文件了呢?好消息来了!为了解决这无比蛋疼的问题,Update插件正式上线了!没有复杂的配置没有复杂的选项,只要开启插件就行了!只要开启插件就行了!(等下,一股浓浓的电视购物风是什么情况Σ(っ °Д °;)っ)
当程序检测到新版的时候会在控制台首页增加一个链接,点击更新就可以了!一击解决Typecho多年蛋疼问题!

DEMO

另外比较温馨的是程序会备份Typecho程序目录下的所有文件(备份文件夹位于插件目录下的backup文件夹),所以你也不必担心升级扑街神马的,如果失败了再把备份文件还原一下就好啦!yeah,就是这么简单!

p.s. 我是不会和大家说为了攒这个插件忍着一个月没升级我的Typecho的→_→...


鉴于有一些人因为服务器文件夹权限等问题导致更新失败,本插件更新至 0.0.2 版本,为每一个过程增加了较为详细的错误信息提示。

下载地址:Box | 百度云

Untrusted 通关攻略!

今天早上刷微博的时候看到 @fakefish 分享了一个游戏微博,游戏的名字叫做《Untrusted》,通过修改JS代码来通关的游戏,作者把游戏代码托管在了Github上,游戏地址在 http://alexnisnevich.github.io/untrusted/ 。

Level 1

这关简单,移动玩家对象@先拾取⌘然后移动到出口就好了。

Level 2

这关看着挺吓人的,路都被#号给各种拦着了,但是其实读一下代码发现也就那么回事。13行的new ROT.Map.DividedMaze(map.getWidth(), map.getHeight())负责根据地图大小生成迷宫,30行到33行在出口的四个方向生成了#号阻拦我们。看着其实挺恐怖的,但是其实我们只要开辟一个新思路不移动@对象到出口而是把出口移动到对象边上就好了。

当然没办法移动现有的这个出口了,我就尝试着再新建了一个出口在@的旁边。map.placeObject(7,6,'exit');,一次性成功!

Level 3

这一关#栅栏把@和出口给隔开来了,首先想到的是把生成#栅栏的代码删除掉。但是很不幸的是过关验证函数validateLeve()上清楚的写着一定要有一定数量的栅栏才行。所以我们转变思路,用栅栏把@和出口都包括进去就好了。为了方便我就直接生成在了边缘了。

for (y = 0; y <= map.getHeight(); y++) {
    map.placeObject(0, y, 'block');
    map.placeObject(map.getWidth(), y, 'block');
}

for (x = 0; x <= map.getWidth(); x++) {
    map.placeObject(x, 0, 'block');
    map.placeObject(x, map.getHeight()-1, 'block');
}

Level 4

这一关和上一关的感觉是一样的,应该可以抄袭上一关的代码。不过你仔细读代码的话会发现比上一关少了过关验证函数。所以我这里就取巧用了第二关的方法,用 map.placeObject(map.getWidth() - 5, map.getHeight() - 5, 'exit');在@对象旁边新建了一个出口。

Level 5

初看血红的图像可能还觉得兴奋,觉得直接移动过去就好了。不过仔细一看代码你就会发现不是那么回事。代码随机在地图上生成了75个看不见的mine对象,不能触碰到它,否则就Game Over。

要越过无形的东西只要让它现行知道它的方位避开它就好了,所以我们可以用map.setSquareColor(x, y, '#000')给他们都附上一个颜色。

Level 6

这一关就比较高级了,有一个攻击者来守护出口,并且会跟随你的步伐靠近你并杀掉你。我的第一想法比较简单,就是建议一个横向屏障让其无法靠近我,不过为了能让自己到达出口位置,我设置了一个空的出口。

for(var x = 0; x < map.getWidth()-3; x++) {
    map.placeObject(x, 11, 'block')
}

Level 7

这一关有一个电话符号,吃了它就可以在移动过程中执行回调函数。在过关路上有不同颜色的障碍物,如果@对象颜色和障碍物的颜色不一样就不允许通过。结合以上两个消息,得到的解决办法是通过一次障碍物前用电话回调函数进行一次“变装”就好了,为了方便我直接指定了在障碍物的前一个位置进行“换装“。

if(player.atLocation(24, 12) || player.atLocation(33,12))
    player.setColor('#f00');
if(player.atLocation(27,12) || player.atLocation(36,12))
    player.setColor('#ff0');
if(player.atLocation(30,12))
    player.setColor('#0f0');

Level 8

到这里就成功进入第二章了!这一关出现了一片一片的绿森林,不幸的是路被他们给挡住了。可供我们修改的代码也非常有限,仅仅只能修改101行的几个字符。可以看到functionList是一个函数组成的数组,看代码的意思应该是让我们给电话回调函数指定一个functionList里面设置好的函数。

理解一下后我们就能想到利用电话回调函数执行重新生成森林的代码,这样每次@对象旁边的道路就会“开辟”出来。

Level 9

哈哈这关做的很漂亮,乘船过河的说。这里我们发现可以自定义对象,raft对象的transport参数提醒了我们可以通过设置这个参数让@对象穿过自己。所以我另辟蹊径,自己创建了一个可以通过的通道。

map.defineObject('boat', {
    'type': 'dynamic',
    'symbol': '▓',
    'color': '#420',
    'transport': true, // (prevents player from drowning in water)
    'behavior': function () {}
});
for (var y = 5; y < 15; y++) {
    map.placeObject(1, y, 'boat');
}

Level 10

这一关有各种攻击者挡住你的去路。因为可以自定义各个攻击者的行为函数,所以我这里的想法是让攻击者自动让出一个通道出来。

map.defineObject('attackDrone', {
    'type': 'dynamic',
    'symbol': 'd',
    'color': 'red',
    'onCollision': function (player) {
        player.killedBy('an attack drone');
    },
    'behavior': function (me) {
        if(me.getY() == 12) me.move('left')
        if(me.getY() == 11) me.move('down')
    }
});

map.defineObject('reinforcementDrone', {
    'type': 'dynamic',
    'symbol': 'd',
    'color': 'yellow',
    'onCollision': function (player) {
        player.killedBy('a reinforcement drone');
    },
    'behavior': function (me) {
        me.move('down');
    }
});

map.defineObject('defenseDrone', {
    'type': 'dynamic',
    'symbol': 'd',
    'color': 'green',
    'onCollision': function (player) {
        player.killedBy('a defense drone');
    },
    'behavior': function (me) {
        if(me.getX() == map.getWidth() - 10) return false;
        if(me.getY() == 12) me.move('right')
        if(me.getY() == 11) me.move('down')
    }
});

Level 11

同样是控制对象的运动行为,需要良好的控制R机器人拿到K钥匙并交给@后才能顺利通关。这里比较简单,只要让R在能右的时候往右走不能右走的时候往下走就好了,然后@在门口静候机器人送钥匙过来就好啦。

me.canMove('right')?me.move('right'):me.move('down')

Level 12

哈哈,和上关以一样,不过高级了一点增加了两个阻碍物。解法是一样的,看个人的控制情况了,我的想法比较简单,就是左边的话是能下就下不能下就右,右边就是能上就上,不能上就右。

 if(me.getX() < map.getWidth() / 2 || me.getX() == map.getWidth() - 2)
         	me.canMove('down') ? me.move('down') : me.move('right')
         else 
         	me.canMove('up') ? me.move('up') : me.move('right')

Level 13

这一关在上一关的基础上又更上一层楼,出了个迷宫般。开始我绞尽脑汁想怎么让机器人自动出来的算法,不过想来我是实在没有那个本事了。后来突发奇想,既然之前的关卡中有攻击者对象根据@对象的操作做出反应,那么我也可以通过@对象来控制机器人咯?所以我比较简单的设置了一个上下左右四个位置,只要@在这个位置上就做出对应的操作。不过作者的Github项目里面收录了各种机器人自动和人工控制的算法,比我这个好用多了,大家可以去欣赏一下:官方第13关的解决办法收录。

这关自己的代码太dirty了就不放上来了

Level 14

这一关很简单,就是用同颜色的钥匙开同颜色的锁,然后最终拿到A并过关的意思。可以操作的地方不多,一看就是让我们设置当开绿锁的时候我们应该把哪把钥匙献上。要么是redKey要么是blueKey,greenKey自己肯定是不可能了。通过实验你会发现答案是blueKey。

Level 15

这一关我也想了很久,同样是过河,但是比之前那关少了一条船,最重要的是可以修改代码的地方不多。我想了一下觉得既然在行为中player被killed了那我就可以再新建一个player了,然后我填写了map.placePlayer(map.getWidth()-2,map.getHeight())这个代码后成功了,但是并不是我想的一样。大概是因为新建了Player然后直接跳到了Player的判定而跳过了Kill的操作了。

Level 16

这关是随机新建了25个无形的墙壁(你还不能删除这些墙壁,因为validateLeve()函数有验证),每个墙壁有一个颜色如果@对象的颜色和墙壁颜色不同的话就会被撞,相同就会通过。

由于作者非常好像的给出了一部分代码让我们通过canvas将无形的墙壁变的有形,大大的降低了问题的难度。所以我们只要让无形的颜色变成有形的颜色,在通过墙壁之前“换装”成相应的颜色就好了。换装同样是用电话回调函数,不过因为不知道怎么获取最近的墙壁的颜色,我选择的是在墙壁的颜色(总共3个)随机,最多只要点两下就会粗来正确的颜色了。

function createLaser(centerX, centerY, angleInDegrees, length, color) {
    var angleInRadians = angleInDegrees * Math.PI / 180;

    var x1 = centerX - Math.cos(angleInRadians) * length / 2;
    var y1 = centerY + Math.sin(angleInRadians) * length / 2;
    var x2 = centerX + Math.cos(angleInRadians) * length / 2;
    var y2 = centerY - Math.sin(angleInRadians) * length / 2;

    // map.createLine() creates a line with an effect when
    // the player moves over it, but doesn't display it
    map.createLine([x1, y1], [x2, y2], function (player) {
        if (player.getColor() != color) {
            player.killedBy('a ' + color + ' laser');
        }
    });

    // using canvas to draw the line
    var ctx = map.getCanvasContext();
    ctx.beginPath();
    ctx.strokeStyle = color;
    ctx.lineWidth = 5;
    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);
    ctx.stroke();
}

player.setPhoneCallback(function(){
    var colors = ['red', 'yellow', 'teal'];
    colors.filter(function(color){
        return player.getColor() != color;
    });
    player.setColor(colors[parseInt(Math.random()*(colors.length-1))]);
})

Level 17

这关大概的意思是每个紫色的出口都是传送门,但是你不知道你是传送到下一个传送门还是荆棘中。所以我们的目标是让传送到传送门的传送门给我们现实出来,这里我利用上一关刚学会的canvas做标记操作。

if(t1.getType() == 'teleporter' && t2.getType() == 'teleporter') {
    var t1p = map.getCanvasCoords(t1);
    canvas.strokeStyle = 'green';
    canvas.moveTo(t1p.x, t1p.y);
    canvas.lineTo(t1p.x+5,t1p.y+5);
    canvas.stroke();
}

Level 18

这一关是让我们编写一个jump()回调函数让@跳过"悬崖"抵达出口。不过我们如果真的被jump这个词给迷惑住了的话可能真的会想一会儿。我看了一下电话回调函数中执行jump()函数的条件是当@对象下面不是空,那就是立即可以执行了(初始状态下面是#号不是空)。所以我直接在悬崖上架了一座桥让@“跳”过去。

function jump() {
    	for(x = Math.floor(w/2)-5; x<Math.floor(w/2)+5; x++) {
        	map.placeObject(x, Math.floor(h/2), 'block');
        }
}

Level 19

这关没怎么理解真谛,大概的意思是让红色和绿色的@碰到一块吧,反正我随便左右上下左右上下的按了一通就过去了。不过有大牛看出了前因后果,我摘抄一下:

19 巨坑爹的一关 我居然认真的读了该主页 并且认为一个玩TCS 的副教授人搞人机交互 以及 UI 毫无不妥。毕竟高德纳不也写了LATEX嘛。。 然后看到它把Lorem 放上去还觉得很有艺术性。。 然后觉得这哥们的姓很有特色 居然叫Eval 天生搞计算机的命啊。。。 然后我就去搜了一下 没找到 paper 才意识到被蒙了。 。。。。。。 忒缺德了。 欺负老实人啊。。。。

总之。。 这是个抓虫子 游戏 网页本质上是一个 递归组合 也就是 盒子里面套盒子 按上会走到 外面的盒子 按下 会进入里面的盒子 按左右会 走到 并列的盒子 操纵绿色符号追击红色符号 策略就是 首先走到根盒子 然后看红色在哪个盒子 就进入哪个盒子 尽可能地 在它外面的盒子 然后 慢慢接近它 很容易就抓到了。。

Level 20

这一关是天降毒雨,我们必须顶着毒雨和上面的BOSS作斗争,消灭所有的BOSS之后拿到A之后才能通关。这关我想了很久,然后在我翻API的时候突然发现有map.overrideKey这个函数,可以复写一个方向键的回调函数,解决了我想了半天没办法触发的问题。然后我们只要做向上发射的子弹去消灭BOSS就好了。这里因为我们要往右上下移动,所以我选择复写了左方向键。

 map.defineObject('arrow', {
        'type': 'dynamic',
        'symbol': '↑',
        'color': 'green',
        'interval': 100,
        'projectile': true,
        'behavior': function (me) {
            me.move('up');
        }
    });
    
    function shoot() {
        for (x = 0; x < map.getWidth(); x++) {
            map.placeObject(x,12,'arrow');
        }
    }
    
    map.overrideKey('left', shoot);

}

Level 21

这一关是耗费我最久的一关了,什么阻碍都没有,然后你也不可以操作代码,但是就是没法过关。看代码的原因应该是map.finalLevel这个值变成True了表示最后一关,所以就没办法再下一关了。

最后搜索了一下发现原来Menu界面下可以插件scripts文件夹,就是游戏的源码了,而且可以修改的说。进Object.js文件修改exit对象的行为判断函数,把if(!map.finalLevel){}去掉就好了。

Level 22

这一关是作者的谢幕,至此全部通关。

整理各种代码

不知道是不是前几天因为干活起的比较早,今天居然也没有睡懒觉一下子就起来了。本来昨天信誓旦旦的说好要帮甘哥抢火车票的,据说甘哥从来都没有做过卧铺回广西... 但是一到早上我就什么都不记得了,等我想起来的时候已经是八点〇三了。不过好在甘哥自己抢到了,要不然又有的囧了,呵呵!

今天把一些杂乱的代码整理了一下汇总到Github上了。比如之前随手写的一个轮播插件,之前只是为了想自己用,后来就想写成通用版的形式。之前用着jQuery写的,后来觉得不爽就想改成原生的。修改了之后就传到Github上去了,每次上传项目都会被项目名称给难道的人真是伤不起啊。以后有时间的话应该会继续精简一下代码,感觉目前的代码还是有点复杂。稍微学习了一下Javascript原型等概念,瞬间就觉得好强大的说。

另外还把博客的Archive效果完善了一下,回归到最开始的状态了。本来想用原生的写一下toggle()的,结果还是懒死了,哎!整理Github项目的时候发现之前写的Imagevue-API项目好久都没更新了,而且好像最近一直都有BUG。所以也就索性弄下来重新整理了一下代码,修改了一下BUG。目前的代码怎么说肯定是还要重写的,不过思路还没整理好,暂时先就这样吧。其实看到这个代码我都不敢确定这真的是我写的么?连缩进都不管的代码真的会是我写的么?哈哈,真是好想吐槽一下当年的自己啊。

北地资源更新了《无人区》,果断下载下来看了下。瞬间发现余男演的真好啊。以及大家真是拼了老命在演啊,看着余男被活埋那段真是替他们揪心。好在剧本也很给力,对得起演员的辛苦,整部电影都还表现不错。

2013年小结之电影全记录

不知不觉,2013年又要过去了。时间在我不经意间就走的这么快了,想起之前的一些事情,仿佛就像是在昨天发生过一样,一切还都是那么的记忆犹新。时间带走了我的青春,留下的确实青春的苦涩。岁月蹉跎,谁都不想被岁月束缚,在岁月中挣扎着,却永远无法摆脱时间这双大手。不说这么伤感的事情了,公子在这里祝福各位2014年元旦快乐,希望新的一年大家能有新的惊喜吧。很多朋友今年也步入本命年了,希望大家都顺顺利利的,摆脱本命年的魔咒!\(^o^)/~

今年的总结依旧是电影总结,本次电影总结由 豆瓣电影统计插件 生成,欢迎大家使用。

可以看出2013年的12个月观影基本都比较均匀,大概是在10部上下浮动。出现异常的分别是5月和10月。比较可笑的是这两个月我都是在出野外的。5月在四川,因为各种懵懂在野外很迷茫也很累,回来也因为野外工作不足而被老师挨训,至此之后专业这方面就没什么起色过,从此对专业感觉失去了信心,哎!10月份是跟着师兄出去算是随行,因为跑的不是自己的东西所以特别轻松,而且野外是在山西五台山附近,附近的宾馆基本有无线,就疯狂拿iPad看了很多电影,算是暂时把自己的东西忘却在脑后吧。

总的来说今年的观影数量和去年差不多,不过因为今年的连续剧看的比较多,日漫和英美剧都有,所以可能在观影时间上还是比去年稍有增加的。

2014元旦快乐

很高兴,在2014年的第一秒,是在主站过的。本来是打算11点分别在主站和这个博客上同时更上两篇的,可是我太高估自己的战斗力了。好不容易写好主站的那篇就已经过了半个小时了,然后非常意外的是有很多因为豆瓣电影统计插件的原因很早就在我博客上留言了,让我非常的感动。就在与他们的交谈中欢快的度过了十二点,我的第二篇更新也就迟了下来,哈哈!不过我还是很高兴的就是啦!

昨天小亭这个抠神意外的良心发现说我在2013年的最后一天请我们吃顿饭,这当然是让我们万分欣喜的。晚上大家坐在一块吃吃喝喝,忘却身边一切纷纷烦扰,纵情说笑。就是想说怎么又是喝我经常一喝就吐的牛二啊,一喝还是四瓶,好想吐槽QAQ。不过比较开心的就是虽然这回喝的比较多,不过居然意外的清醒诶!哈哈!杯具的是马哥,今天稍微给力了一点然后果断就悲剧了呢,吐的是一塌糊涂啊,回寝室都是我们扶着他回去的,嘿嘿!

2014年是新的一年,希望在新的一年中我能够不再迷茫,摆脱自己对自己的束缚迎接自己新的人生。以上。

待你长发及腰,请我吃饭可好

之前70发的一个跟我的插件有关的新接口测试了半天发现还是有很多吐槽的地方。跟70说过之后过了几天也还没回我,搞的我这两天都没什么心情码代码了,有种无所事事的感觉。昨天晚上闲着无聊突然想起来好久没看《数码贱男》了,就拉出来看了看。里面有几个人换掉了,不过贱男依旧啊,真难想象拍摄的地方就在离我们不到5公里的网易大厦,哈哈!

晚上看了部《恶之教典》,伊藤英明演的意外的好啊。整剧各种血腥,讲述了一个性格确实的骚年如何从手刃父母残杀他人最后到高中部大屠杀的宏伟场面。结合了一下影评才稍微有点理解,果然是部性格变态的片子。

冬至也在码代码

昨天晚上不知道是不是因为冬至的原因,大家都表现的异常的兴奋,快两点了大家都还没上传睡觉。因为昨天下午睡了挺久了,把这个礼拜的《爸爸去哪》看完了才滚床上睡觉去了。总觉得林志颖被导演故意演成了黑脸,不过是越来越喜欢kimi那随时都能脱线的神经了。不过说到脱线,另外一个王者就是Angela了,哈哈,做游戏的时候那脱线的表情简直就在想象吃大餐的感觉有没有!虽然男神张亮我是比较欣赏的啦,不过相比较之下我反而不是很喜欢天天呢。主要原因是他在海岛小伙伴寻宝给我的感觉太差了。看来男神以后的路还有很长啊,哎!

冬至到,吃水饺。中午也跟风和宋哥两人去三楼吃了个水饺。别说人还真是多,排着队买饺子的人比比皆是,看来北方这方面过的还是比较隆重的。昨天古哥推荐我们来这家,味道感觉还可以,价钱也比较实惠。每次吃饺子的时候总是会回忆起小学的时候,一群小伙伴补习完回家的路上吃一碗两块钱(没错我就是来吐槽当今的物价的)的水饺,那种感觉特别温馨。回忆起当时的味道,虽然是淡淡的,但一种非常香甜可口的感觉一直萦绕在我的脑海中,回味无穷。

今天下定决心,花了一天的时间先研究了一地啊@defe 之前写的CommetToMail插件,然后就一直在捣鼓我之前写的At插件了。之前只是简单的用At.js实现了列表@的功能。随着群众的欲望无限膨胀,邮件通知的功能的需求越来越强烈。之前稍微看了一眼CommentToMail插件,有点懵里懵懂,所以对新功能的增加就有点望而却步。这回一不做二不休努力赶工总算是做出来了。刚把代码放线上测试的时候还有各种小问题,不过也慢慢都解决了。看明天如果没什么大BUG的话我就把代码放出来进行大面积测试吧。

整个人都憋菜了

震惊今天是礼拜六的我,今天做出的最大反应就是一天没去工作室了。昨天晚上王哥打呼噜我过去把他叫醒了之后,意外的今天睡的还不错。不知道是他晚上没打了还是我的火气得到了发泄,总之就是一觉睡到了大天亮,醒来就是九点多了。睡的虽然好了点,可是脖子的问题还是没有得到解决,算上今天已经是第三天了,哎!

本来中午收拾收拾就准备去吃饭的,结果小空来个消息求帮忙。原来是要帮他的高中妹子做考题来着。为了小空的妹子,咱只能悻悻的把刚关的电脑又打开来了。不过小空也真能找人,让我一个PHPer去做C的题,好不让人尴尬。做题过程中被数据类型给虐了千百遍,好不容易做出来一题结果一看人都快做完了,小有尴尬啊!本来就已经挺注意数据类型的问题了,结果还是出现各种各样的问题,真是让人措手不及。每当这个时候我都在想其实弱语言的PHP也没啥不好的,哼哼!做完题去吃饭就发现食堂依然关门了,只能上三楼风味美食吃了。要了个两菜的盖饭,味道真是意外的好啊!只是有点小贵,看来可以偶尔来吃吃改善改善伙食。

花了点时间研究了一下Pagedown编辑器,想找一下官方一点的插入按钮的方法,结果看了半天,发现官方完全就没有这方面的支持啊!真坑爹,浪费了我这么多时间有么有!带着一身怨气又去更新PMBlog去了,把Archive插件给更新了一下,输出Archive内容,布局样式什么的都放到主题交给用户去。顺带学习了一下Twig如何自定义Fliter和Function,顺带赞一下Twig的文档,非常简单易懂有么有!