分类目录归档:IT技术

一切从5岁时在PC-1500上写Basic开始……

浅谈对CACHE操作的封装及最佳实践

作为WEB开发者,CACHE对我们来说是再熟悉不过了。但是,你真的有研究如何把它用得更“优雅”吗?下面以较常见的Memcache为例,谈谈对CACHE操作的几种常见封装方法,并推荐一种我认为最佳的实践。如果你有更好的解决方案,请不吝赐教:) 为什么要封装? $mc = new Memcached(); $mc->addServers(’127.0.0.1′, 11211); $key = ‘test’; $duration = 3600; $value = $mc->get($key); if ($mc->getResultCode() == Memcached::RES_NOTFOUND) { $value = getValueFromDB(); $mc->set($key, $value, $duration); } 第一次使用CACHE的同学,往往会写出上面的代码。简陋且有效,拿来写个Hello World是再合适不过了,但是真正在项目中使用CACHE的时候,还这么写就太low了。没有异常处理和重试机制、不能做负载均衡,大量的重复代码……当你受不了维护之繁琐时,就会想办法来解决这些问题,那就是封装。

发表在 IT技术, PHP | 标签为 | 3 条评论

禁用QQ自动替换表情的功能

问题的描述 不知从何时起,QQ在聊天窗口中提供了表情快捷键的功能,比如输入 /v 会变成一个动画表情。这一设计的初衷是让聊天时输入表情更加便捷,但却给我们程序员们带来了不少烦恼。因为 / 作为linux下的路径分隔符,对程序员来说是一个极其常用的符号。 两个程序员在工作中相互沟通时,经常会互相发一些文件地址,比如:“看看这个文件/www/db/script/test.sql是不是有问题?”、“你更新一下view/search.php”、“你放到api/v5下面”之类。然而发到qq里就变成这样了: 不管是直接输入、还是粘贴复制,像“/v /se /db”之类这些组合都无法避免被替换成表情符号的命运。而且一旦发生替换,消息的接收者很难再将其复原。

发表在 IT技术 | 标签为 | 2 条评论

Dvorak布局下一种比较理想的双拼方案

我从2011年开始使用Dvorak键盘布局至今,十分享受它给英文输入尤其是敲代码带来的便利。 从2013年9月开始我开始想在Dvorak布局下使用双拼,为此我尝试了网上能找到的各种方案,但大多数方案都是为Qwerty布局设计的,在Dvorak布局下完全无法使用。我还尝试了一些Dvorak玩家自己设计的布局(如这里、这里和这里),但都不甚理想,总有很多输入别扭的拼音组合。 为了找到一种理想的双拼方案,我开始不断调整键位、实验方案、再调整。但往往解决了一个别扭组合,又会造成更多的别扭组合。最终我找到了一个终极方法,那就是刷全拼音表,通过穷举所有拼音组合来检查当前方案是否理想。 经过一个星期的努力,基本方案的框架已经确定。又经过几次微调之后,改良空间越来越小。现在我已连续使用此方案两个多月,感觉十分流畅,于是决定将之公布,与各位Dvorak爱好者分享。

发表在 IT技术, 事件, 效率 | 标签为 | 14 条评论

win7下配置使用dvorak-qwerty键盘布局

昨日部署一台win7开发机,在配置dvorak-qwerty布局时感觉流程自己都有点记不清了,因此想写篇文章记录一下,希望能对想开始使用dvorak布局的朋友有点帮助。 什么是dvorak-qwerty布局? 关于dvorak布局的介绍及与qwerty布局的对比,可以参考我这篇文章。 Windows系统自带dvorak布局,但是如果直接使用的话存在这样一个问题:常用的快捷键如Ctrl + C、Ctrl + V等都需要双手操作,一点也不“快捷”了。colemak布局也是因为不影响常用快捷键得到很多人的拥护。 为此,Mac OS中提供了“dvorak – qwerty”布局,其作用是当按下Command、Ctrl等功能键时,临时切换回qwerty布局。这样既享受了dvorak布局给打字带来的便捷,又不影响快捷键。 而Windows系统下没有这样的布局呢?答案是有的,那就是Jeffrey Min开发的Dverty布局。

发表在 IT技术, 效率 | 标签为 | 5 条评论

解决SimpleTest 1/2 test cases complete的问题

最近一直在用SimpleTest测试代码,发现这个问题其实已经很久了,但一直因为无关痛痒没有去解决,今天终于憋足劲把它搞定了,把过程写出来给大家分享:) 复现问题 首先新建一个test.php,内容如下: 现在执行这个测试,你会发现test cases complete的数字不对劲。显示的TestCase总数多于真实的TestCase数量。如下图: 排查原因 Google无果后,只能自己排查SimpleTest源码了。先在项目里搜索”test cases complete”,定位到reporter.php:

发表在 IT技术, PHP | 标签为 | 留下评论

树莓派Raspbian开机自动发ip邮件的解决方案

Github:https://github.com/shenjia/raspbian-ip-mailer 问题 我的树莓派配置好无线网卡后,经常随身带来带去。但是公司和家里是两个不同网段的WIFI,如果用固定IP的话只能连接其中一个,如果用DHCP自动获取IP的话又不能保证每次分配到的IP不变。每次切换网络后要连接键盘显示器上去配置网络实在是太痛苦了。

发表在 IT技术, Linux, Python, 树莓派 | 标签为 , | 9 条评论

树莓派raspbian系统下安装TL-WN725N 2.0无线网卡驱动

首先在树莓派上下载编译好的8188eu芯片驱动(出自这里,感谢rpijet同学辛勤的劳动)。解压后得到8188eu.ko文件,将此文件复制到树莓派上/home/pi目录下:

发表在 IT技术, Linux, 树莓派 | 2 条评论

mac下给树莓派安装raspbian系统

先到树莓派的官方网站去下载一个系统镜像,推荐下载Raspbian。

发表在 IT技术, Linux, Mac, 树莓派 | 3 条评论

解决IE点击按钮链接后出现[object Object]的问题

下面的链接在除了IE外的浏览器下都工作正常: 提交 但在IE下点击后整个页面都清空了,只显示[object Object]:

发表在 HTML, IT技术 | 2 条评论

Mac下用dd写入SD卡,提示permission denied

最近入手了树莓派,需要用dd向SD卡中写入系统镜像,按照教程一步步进行,结果在这步卡住了: sudo dd bs=4m if=/User/zhangshenjia/2013-02-09-wheezy-raspbian.img of=/dev/rdisk4 dd: /dev/rdisk4: Permission denied 在实用工具里的磁盘工具中查看,SD卡的状态为只读:

发表在 IT技术, Linux, Mac, 树莓派 | 3 条评论

解决ie9下网页标题显示为服务器ip的奇怪问题

在windows2008环境下部署一个网站,之后不久发现有个奇怪的现象:在ie9下网页标题没有正常显示,而是显示出服务器的ip。而在ie7、ie8、chrome、safari下都正常。 怀疑是ie9的问题 因为只有ie9下有这个问题,所以先考虑是不是ie9的bug,于是先google一下,找到了这篇微软的官方文章。按这篇文章的描述,出于安全的考虑,ie9在隐藏地址栏的时候会强制显示服务器ip,使用户远离钓鱼网站的危害。 本来以为问题就这么简单解决了,但是定睛一看,咱的ie9地址栏没隐藏啊!还得继续找原因。

发表在 HTML, IT技术 | 标签为 | 一条评论

欲速则不达

子夏为莒父宰,问政。子曰:“无欲速,无见小利。欲速则不达,见小利,则大事不成。” ————《论语·子路》 事件 几天前,在测试一个远程部署shell脚本的时候,因为错用了单引号导致本地参数没有传递到服务器上,结果就发生了这样的悲剧: rm -rf /$ROOT/$PATH/$FILE #结果执行的是 rm -rf /// 脚本运行后就蹦出大量的/sys/下文件无权删除提示,一看不对赶紧停掉脚本,服务器已经挂了。经过一天的抢修服务才恢复运行,幸好终止的快,只删掉了部分系统文件,生产数据没有受到损失。 反思

发表在 IT技术, 效率 | 标签为 | 2 条评论

Chrome 最新 bug: 在src为空的img元素的onerror事件中移除自己,导致崩溃

今天突然发现Chrome打开自己的网站会崩溃,而safari、ie都正常,经排查发现下面的代码会导致chrome 25崩溃: <img src="" onerror="this.parentNode.removeChild(this);" /> 而给src赋值后,就不会崩溃了: <img src="no" onerror="this.parentNode.removeChild(this);" /> 将移除操作放到onclick事件中再触发之,也不会崩溃: <img src="" onclick="this.parentNode.removeChild(this);" /> 因为之前一直运行正常,估计是新版chrome在渲染引擎方面的改动导致。这段代码是用来自动移除url错误的图片的,将其改为src不为空时才输出img元素,问题解决。

发表在 HTML, IT技术 | 标签为 | 留下评论

命令行下获取和识别时间戳的工具 timestamp.js

Github:https://github.com/shenjia/timestamp.js 作为程序员经常要和时间戳打交道,有时想快速知道当前的时间戳,往往需要运行一段小程序: <?php echo time(); ?> 又或者想从一个时间戳得出具体的时间: <?php echo date( ‘Y-m-d G:i:s’, 1361525534 ); ?> 一次两次还好,次数多了真的很烦,于是写了一段js,通过nodejs运行,再自定义一个shell函数,以后就可以这样了: $ ts 1361525534 $ ts 1361525866 2013-2-22 17:37:46

发表在 IT技术, Javascript, Linux, 效率 | 标签为 , , , | 留下评论

解决Rockmongo不显示中文的问题

Mongodb是时下非常流行的数据库,而Rockmongo可以说是最普及的web版gui了。但是Rockmongo在显示utf-8中文数据时一直有问题,最新版本v1.1.2仍然没有解决。今天专门腾了点时间debug并将其解决,将过程记录一下供大家参考。 问题现象 1、插入一条包含中文的数据 2、保存之后,中文数据不见了 DEBUG 审查元素发现,从服务器端返回时中文已经不见了,排除问题在浏览器端的可能性

发表在 IT技术, PHP | 标签为 | 一条评论

为MongoDB编写Js维护脚本

最近项目上有一个需求,要对存储在MongoDB中的用户行为数据定期进行统计分析。 先使用PHP实现原型,发现因为数据量很大,大量时间都花在MongoDB服务器和Web服务器之间的数据交换上。考虑到这一点,必须在MongoDB服务器上进行本地计算,将结果保存起来,再使用PHP访问并展示给用户。 查阅文档得知,MongoDB可以执行JS脚本,这样思路就清楚了,用JS脚本实现统计的功能,再用crontab定期执行。 现在和大家分享一下在完成这个任务的过程中,遇到的一些问题和解决思路。(必须要说的是,MongoDB的官方文档对服务器端JS编程的文档极度缺乏,很多命令都是通过Google才找到的。) 在命令行输出信息 输出字符串: print( ‘Hello World’ ); 输出对象: var obj = { ‘key’ : ‘value’ }; printjson( obj ); 切换数据库 在Mongo JS Shell中,切换当前数据库的命令是:use xxx,这是一个magic helper。遗憾的是,在JS脚本中没有use可用。 如果运行mongo时没有加上–nodb参数,那么会自动connect到指定的服务器和数据库,并把句柄保存为db。如果运行时没有指定服务器会默认连接本机127.0.0.1,如果没有指定数据库会连接到test数据库。 你可以用conncet命令重新发起连接: var userDB = connect( ’123.123.123.123/user’ ); userDB.user.find();

发表在 IT技术, Javascript, MongoDB | 4 条评论

常用bash快捷键

收集自:http://ss64.com/bash/syntax-keyboard.html 注意:如果要在mac的终端下使用Alt组合键,需要在终端的偏好设置里选中“使用option键作为meta键”

发表在 IT技术, Linux, 效率 | 一条评论

用inginx.conf分级管理nginx配置文件

其实nginx的conf结构本来设计的不错,但是从默认安装的配置文件离实际可用状态还有一些距离。比如设置fastcgi、分离server部分到多个文件等。 一般来说,部署完毕之后conf已经是面目全非了。众多参数缺乏有效的管理组织方式。如果有多个站点,那么各个站点的配置文件中可能还存在大量重复。 inginx.conf(github)项目诞生的目的是:明晰nginx配置文件的结构,让维护多个站点的配置、部署新站点变的更加简单。 部署 注意:请先备份nginx/conf目录 1、自动部署:下载自动部署脚本deploy.sh并运行,脚本会自动检测nginx/conf的位置并部署完成(需要wget和unzip)。 #全自动部署 ./deploy.sh #也可以指定nginx/conf的位置 ./deploy.sh /etc/nginx/conf 2、手动部署:下载zip包后解压缩,然后将conf目录复制到nginx/conf目录。 cp conf /usr/local/nginx/conf 创建新站点 1、进入conf/servers目录,将server.example复制一份,命名为自己的站点(注意后缀应为.conf)

发表在 IT技术, Nginx, 效率 | 标签为 , , | 6 条评论

通过macports安装的php,extension的配置被分离

我现在的开发环境,php、php-mongo、php-mysql、php-redis、xdebug等都是通过macports安装的。一直使用都没有问题,直到今天编辑php.ini的时候发现,这些extension居然都没有在php.ini中定义。奇怪了,那它们是怎么加载的呢? 首先怀疑我编辑的php.ini不是php实际使用的配置文件。通过查看phpinfo(),在Configure Command中可以确认–with-config-file-path为/opt/local/etc/php54,编辑的php.ini没有问题。 既然php.ini中没有定义,而extension又实际上被加载了。那么可以初步判断,通过macports安装的php,extension的相关配置是存在php.ini之外的一个地方,那么究竟在哪呢? 继续分析phpinfo(),发现这么一条–with-config-file-scan-dir=/opt/local/var/db/php54。进入这个目录一看,mongo.ini、mysql.ini、redis.ini、xdebug.ini等都在这里。于是乎真相大白,原来extension相关的配置文件都被分离到这里了。 究其原因,macports这样做是为了方便维护extension。好处如下: 1、extension的配置与php.ini隔离,方便维护(直接修改php.ini会引发各种问题) 2、各个extension的配置文件相互隔离,互不影响(安装卸载只要添加删除文件即可)

发表在 IT技术, Mac, PHP | 留下评论

在不同php版本中实现model层重复代码的去除

问题 MVC架构中的model层主要负责和数据直接交互,如果没有使用ORM框架,那么很多原子操作(CRUD等)需要自己实现。一般来说一个系统会有多个Model,每一个Model都需要重复实现这些原子操作,而这些代码往往除了表名外都是一样的: class User { public static function findById ( $id ) { return DBProxy::getDb( ‘user’ )->findOne( array( ‘_id’ => new MongoId( $id ) ) ); } } class Video { public static function findById ( $id ) { return … 继续阅读

发表在 IT技术, PHP | 2 条评论