易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
一周回顾

一周回顾

本周没有什么大事发生,只是对于自己来说有几件事情要记住。
1、编码,关于编码这件事,我在文章出现乱码怎么办?已经记录了
2、mongo,虽然很多人说,如果只有一台服务器就不要用mongo了,但是想来想去,我大字段内容过多,而且访问频繁,短时间内居然不能做缓存,这才是我纠结的,毕竟只要做了缓存,那就什么都好说了
3、redis的订阅。我用的是yiiredis的订阅。然后事情就开始纠结了。在yii的event中,我写了一个小函数,将内容再存到redis中,但死活存不进去。可能还是闭包的问题。没有仔细查,实在没时间啊。
不过本周会测试一下,不用yiiredis组件中自带的订阅,再看一下究竟如何

4、其它就真没大事了

SQL to Mongo Mapping Chart

SQL to Mongo Mapping Chart

mysql 与 mongo之间是怎么替换的?
官方有一个表格:

SQL Statement Mongo Query Language Statement
CREATE TABLE USERS (a Number, b Number) Implicit or use MongoDB::createCollection().
INSERT INTO USERS VALUES(1,1) $db->users->insert(array("a" => 1, "b" => 1));
SELECT a,b FROM users $db->users->find(array(), array("a" => 1, "b" => 1));
SELECT * FROM users WHERE age=33 $db->users->find(array("age" => 33));
SELECT a,b FROM users WHERE age=33 $db->users->find(array("age" => 33), array("a" => 1, "b" => 1));
SELECT a,b FROM users WHERE age=33 ORDER BY name $db->users->find(array("age" => 33), array("a" => 1, "b" => 1))->sort(array("name" => 1));
SELECT * FROM users WHERE age>33 $db->users->find(array("age" => array('$gt' => 33)));
SELECT * FROM users WHERE age<33 $db->users->find(array("age" => array('$lt' => 33)));
SELECT * FROM users WHERE name LIKE "%Joe%" $db->users->find(array("name" => new MongoRegex("/Joe/")));
SELECT * FROM users WHERE name LIKE "Joe%" $db->users->find(array("name" => new MongoRegex("/^Joe/")));
SELECT * FROM users WHERE age>33 AND age<=40 $db->users->find(array("age" => array('$gt' => 33, '$lte' => 40)));
SELECT * FROM users ORDER BY name DESC $db->users->find()->sort(array("name" => -1));
CREATE INDEX myindexname ON users(name) $db->users->ensureIndex(array("name" => 1));
CREATE INDEX myindexname ON users(name,ts DESC) $db->users->ensureIndex(array("name" => 1, "ts" => -1));
SELECT * FROM users WHERE a=1 and b='q' $db->users->find(array("a" => 1, "b" => "q"));
SELECT * FROM users LIMIT 10 SKIP 20 $db->users->find()->limit(10)->skip(20);
SELECT * FROM users WHERE a=1 or b=2 $db->users->find(array('$or' => array(array("a" => 1), array("b" => 2))));
SELECT * FROM users LIMIT 1 $db->users->find()->limit(1);
EXPLAIN SELECT * FROM users WHERE z=3 $db->users->find(array("z" => 3))->explain()
SELECT DISTINCT last_name FROM users $db->command(array("distinct" => "users", "key" => "last_name"));
SELECT COUNT(*y) FROM users $db->users->count();
SELECT COUNT(*y) FROM users where AGE > 30 $db->users->find(array("age" => array('$gt' => 30)))->count();
SELECT COUNT(AGE) from users $db->users->find(array("age" => array('$exists' => true)))->count();
UPDATE users SET a=1 WHERE b='q' $db->users->update(array("b" => "q"), array('$set' => array("a" => 1)));
UPDATE users SET a=a+2 WHERE b='q' $db->users->update(array("b" => "q"), array('$inc' => array("a" => 2)));
DELETE FROM users WHERE z="abc" $db->users->remove(array("z" => "abc"));


不过,硬要说的话,这个还不全,http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart,这里有更全的。
在上面的页面还能够讲这个mapping chart导出成pdf。
比如,这个:d298d1a5bbe9a7784c0027f6def7971e

文章出现乱码怎么办?

文章出现乱码怎么办?

文本本来是UTF-8的。但是会出现乱码,类似:
像吉本芭娜娜一æ·ï¼Œåœ¨è¿™ä¸ªä¸–界上,
我最喜欢的地方就是厨房。
—— 李妙生
这种在显示的时候出现很让人郁闷,但不能不解决它,怎么办?写了一个无耻的函数:

function getUtf8Content($content,$default=null){
$dContent = utf8_decode($content);
if(mb_detect_encoding($dContent) == mb_detect_encoding($content)){//这句话有点妖。多试试就知道了
if($default !== null){
$content = $default ;
}else{
if(strpos($dContent,"??????")===false){
$content = $dContent;
}
}
}
return $content;
}

不管了,能解决问题就好。。黑黑,不要怕丑

折腾

折腾

折腾了很久,VPS又换成了apache,而不再使用lnmp。嗯,nginx确实不错,但我想,apache更容易配置,nginx相对来说配置起来还是有一点的麻烦。不如apache支持的多

比如,Svn就直接支持apache。当然这只是一个很不能说服人的理由,不过,我想配置服务器这玩意,还是怎么熟怎么来吧。
apache优化好了,也不见得就比nginx差到哪里去,当然插件是少了很多。忍忍了

HTTP 411 错误 – 需要内容长度头

HTTP 411 错误 – 需要内容长度头

介绍

您的 Web 服务器认为,客户端(如您的浏览器或我们的 CheckUpDown 机器人)发送的 HTTP 数据流应包括一个 “ 内容长度 ” 规范。 这通常是只用于那些将数据放置在 Web 服务器上的 HTTP 方法,而不是数据检索方法。

HTTP 循环中的 411 错误

任何客户端 ( 例如您的浏览器或我们的 CheckUpDown 机器人 ) ,都需要通过以下循环:

  • 从您站点的 IP 名称 ( 即您站点的网址-URL, 不带起始的 ‘http://') 获得一个 IP 地址。这个对应关系 ( 即由 IP 名称向 IP 地址转换的对应关系 ) 由域名服务器 (DNSs) 提供。
  • 打开一个 IP 套接字 (socket) 连接到该 IP 地址。
  • 通过该套接字写 HTTP 数据流。
  • 从您的Web服务器接受响应的 HTTP 数据流。该数据流包括状态编码, 其值取决于 HTTP 协议 。 解析该数据流得到 状态编码和其他有用信息。

该错误在以上所述的最后一步生成,即当客户端收到 HTTP 状态编码 并识别其为 ‘411’ 。

------------------------------------

android在发送流的时候好象不发送Content-length的。所以有时候会返回411

包大人很忙?

自从杜甫很忙之后,包大人也忙了;

何炅:段子谁没听过啊: 展昭给马汉讲自己的英勇故事:”那天我探案,不小心中了埋伏,身受重伤。我拼尽了全身力气,终于支撑到了开封府,突然眼前一黑……”马汉关切地问:”你昏倒了?”展昭:”不,是包大人出来了。”@谢娜

@苏木影子星:包拯急急忙忙来找公孙策:“公孙先生快帮忙看看,本府新买的手机怎么就黑屏了呢?”公孙策接过,揣摩片刻……“大人,您又用自己的大头照当桌面了吧?” @冷笑话手机版
@笑话伤不起:“妈妈,这个世界上有鬼吗?”“傻孩子,当然没有。”“可街上有团火在飘来飘去诶。”“那是鬼火,是人死后体内的磷与水或者碱作用时产生磷化氢自燃造成的。”“可后面还有一套衣服跟火一起飘来飘去诶。”“我看看,哦,傻孩子,那是包大人打着灯笼在巡夜。”【有一群伤不起的人正在关注@笑话伤不起】
@上海热门资讯:公孙先生,你快来看,本府拍到日环食了,好清楚呀。” “呀!还真是清楚哎!看起来就像个月…哎呀我去,大人啊…您用的好像是前置摄像头吧?”

金妆国际官方:#包大人很忙# 展昭追上刺客几招将其擒服,赶回开封府。公孙策见展昭便说:“展护卫,你中了调虎离山之计啊!方才你去追捕刺客,埋伏在屋顶的另一刺客马上杀入包大人的房 间!”展昭心一惊:“包大人没事吧?”公孙策看了看天上乌云遮月:“幸好包大人急中生智把衣服全脱了,刺客以为他不在就离开了。”

温泉养生之都:展昭激动的对喊冤百姓说:“你们放心,包大人那是打着灯笼都找不到的好官!”包拯听到后,怒曰:“展护卫,本官有那么黑吗?”

@搞笑大作战:这日,展昭到公孙先生房间,开口道:“久闻先生睿智,展某有一事向先生讨教。”公孙策开口道:“展护卫请讲。”展昭道:“请问包大人为何不吃巧克力?”公孙策笑了笑,答道:“因为大人怕咬到自己的手指。”.
@冷笑话海选:早上白玉堂眼泪汪汪,哭道:“包大人,求您饶我大哥钻天鼠卢方一命。”包大人奇怪的问:“我没说要杀卢方啊。”白玉堂:“大人您别瞒我了,昨天晚上我听见您在院子里高唱:我想要卢方的生命,就象矗立在彩虹之颠。”

以上仅供捂乐。其实大家都懂的,没有话题要制造话题,第一个制造话题的人,才是真正有生命力的人。就象传说当年,移动为了赚短信的钱,就有人想出了:xxx节,祝xxx快乐,转发十人,会得到祝福,如果你不转发,你死全家之类的。

-----
好吧,乐一下而已

又找到一个图全的:

9d4d0b06c3a097e29e43952b59d373eb

乱弹杂谈

乱弹杂谈

最近的新闻很多,什么红衣教主做手机,马化腾要搞创新,马云想重创业等等,这些都比不上fackbook IPO以及扎客伯格取个华YI(一下子五笔打不出了,没印象了)的老婆。
凤姐要嫁给方舟子了,嗯估计短时间内只能做小三,老罗也想做手机了,招聘都贴了很久了。
不是我不明白,实在是这个世界变化太快。
移动互联网,人人都想入,当然凤姐那个是例外。
做手机的,不做移动互联网,那是扯蛋,嘴上会说不做,但实际上总会折腾一下,到时候还会说,这是为了与系统更好的整合。
不是每家公司都能象苹果那样,硬软通吃的,也只有苹果能敢说,我们是做硬件的。现在折腾手机的,都是基于android等的开发,二次开发,套个皮继续开发。一些新鲜感都没有。
当然,你硬要说,这是趋势,不要重复造轮子,我当然也没话说。所以也只有联发科才能卖整体架构,而现在的手机商只能做集成商。
--------------
扯了一回,发现步子迈大了,蛋会容易被扯着,只能再迈小一点。
于是微创新就来了,你看新浪微博中的,微聚会,微新闻,微电影,微招聘,微活动,微投票,尼玛啊,只要以前有的玩意加上一个微,TMD就又是一个新产品。
哎,折腾不过这些人。好吧,我们就来个微CMS吧

转一下:OpenResty

转一下:OpenResty

前段时间,老王推荐了一个伪同步的代码,async,可以到github上找到代码:https://github.com/hugozhu/async_php/,其中,有一个lua的目录,是用来为nginx提供插件以担当这个同步功能的一些玩意。
于是冲到nginx上看了一下,NND,没这玩意嘛 .
再一瞅github上,原来还写着:
ngx_lua module - http://openresty.org latest stable release
我晕,那openresty是什么玩意呢?去官方看了看,一大堆英文,但是左侧的支付宝捐赠让我怀疑这应该是个国人的作品。于是找啊找,找了一个中文介绍:

官网: http://openresty.org/
虽然是中国人做的,但没几个汉字.....

我用Nginx,是这样一个过程:
1. 系统rpm中的nginx,能让其跑起来
2. 玩配置文件
3. 玩编译选项
4. 写插件,集成第三方插件

OpenResty , 是淘宝一位大牛(agentzh)集成的包含N多好插件的Nginx捆绑源码包,这位仁兄自称Nginx最活跃的第三方模块开发人员哦

下面,当然要列一下到底集成了什么模块:

LuaJIT -- 极速版Lua实现
ArrayVarNginxModule -- 数组类型的Nginx变量
AuthRequestNginxModule -- 鉴权,想象一下以C代码的速度判断一个请求是否合法,是不是很有快感呢?!
DrizzleNginxModule -- -MySQL桥,非阻塞的哦,我又爱又恨的一个模块,值得注意的是,其响应是RDS流
EchoNginxModule -- 以非常直观的方式在Nginx配置文件中编写简单的处理逻辑,源码包含大量注释,绝对是入门好例子!!
EncryptedSessionNginxModule -- 加密会话
FormInputNginxModule -- 解析post请求中的参数,这下子,简单请求根本不需要PHP/Java来处理啦
HeadersMoreNginxModule -- Nginx默认的header模块只能添加或忽略,这个给你CRUD全套的!!
IconvNginxModule -- 编码转换,不多说,也不懂
StandardLuaInterpreter -- 与Lua官方实现所匹配,一般用不上,因为我们用LuaJIT!!
MemcNginxModule -- 与Memcached的绝配,谁用谁知道!! 与upstram_keepalive一起用,你能更High!!
Nginx
NginxDevelKit -- N多第三方插件都依赖的东西,不知道为啥
LuaCjsonLibrary -- Lua版的Json处理库实在太慢,这个才叫速度!!
LuaNginxModule -- 我的最爱,一般逻辑,完全没必要用Java/PHP啦
LuaRdsParserLibrary -- 在Lua中直接处理RDS流,速度杠杠的!
LuaRedisParserLibrary -- 在Lua中处理Redia模块的响应,暂时我还没用上
PostgresNginxModule -- Nginx-Postgres桥,输出的也是RDS流
RdsCsvNginxModule -- RDS流转CVS格式,不知道能干啥,报表?
RdsJsonNginxModule -- RDS流转JSON字符串,之前经常用这个
Redis2NginxModule -- Nginx-Redis2桥
SetMiscNginxModule -- 提供很多很实用的方法,例如base64编解码,URL编解码,SQL防注入等等
SrcacheNginxModule -- 缓存模块,据说跟Memc模块一起用比较爽
UpstreamKeepaliveNginxModule -- 与Memc模块的标配,号称性能提升几倍呢
XssNginxModule -- 防跨站攻击的

OpenResty的最大的好处是帮你弄清楚各个模块的编译顺序,别小看,学问大大的呢

当初没有这东西,单单弄清楚模块间的编译顺序就耗费不少时间

来吧,试试这个国产的精品!!
-------EOF--------
以上这段内容来自:http://wendal.net/338.html
值得看看哦。可以尝试用lua写插件

转:开发流程那些事:6天时间修改1行代码

转:开发流程那些事:6天时间修改1行代码

这篇文章很有意思,所以我转贴了一下:

企业中,产品研发是一项综合性的工作,需要多个部门参与。但往往会出现各种各样的问题,如部门协作困难、全局监控难等,这困扰着大多数的企业。

本文是一个真实的案例:

菲利普(主 席):我们工厂中有10%的员工没有充分利用,要么我们开始处理更多的积压工作,要么进行裁员。我宁愿每个人都很忙。我们该如何做?

李(业务部经理):公司政策规定,我们要处理3个月内的积压工作,如果改成4个月,我们将有大量的工作。

菲利普:好。现在,我们该如何实现?

李:我不是很确定。我认为,我们需要更改传统的软件设置。

大卫(IT总监):没问题。可能只需要更改核心程序中的一行代码。(填写一个清单,提交给IT部门)。

朱迪(IT管理员):我正分派这个单号为#129281的需求。但是这需要目前的商务项目做完,并由主任签字。

大卫:这是菲利普交代的,我们不立刻做的话,就必须裁员。

朱迪:OK,我会马上填写,并标记为紧急任务。

2 天后

大卫:#129281目前状态是什么?

朱迪:它是开发人员任务队列中的紧急任务,前面还有14个紧急的Bug报告需要处理。

大卫:忘记任务队列。将它标记为紧急,立即发给艾德(程序员)。

1 小时后

艾德(程序员):在模块ORP572的第1252行中,我将写死的变量MonthsOfBacklog(积压月份)值从“3”改成了“4”。然后,运行了2批测试用例,成功进行单元测试。业务工作量增加了10%,这是预期数据。我正准备提交代码审查,并交给Homer进行用户验收测试。

雪莉(代码审查):这违反了公司的政策,你必须在参数文件中做个记录。此外,还有2个旧的调试命令,1个无指定的变量警告消息和1个写死的Employee ID,必须在这个模块移交到产品之前进行修复。

艾德:!~@#$%^&*(脏话)。

雪莉:这些bug很可能是真的。一旦你被指派ORP572模块,你就需要对已经存在的、违反新公司政策的错误进行修复。我不能提交。

2 小时后

艾德:OK,完成。我正要重新提交代码审查。

朱莉(IT测试):Homer不能进行用户验收测试,因为Fred正在运行一个本月底财务要用的约束测试。使用Marge代替。

艾德:我没有访问Marge的权限。

朱莉:联系IT安全部门的乔,他会给你开权限的。

2 小时后

乔(IT安全):没有大卫的签名,我不能给你开Marge权限。他出差了,得等到周一。

艾德:我不这么认为。菲利普希望马上实施,让他来授予权限。

雪莉:你的新的参数记录“MonthsOfDemand”需要起一个更好的名字。离岸程序员(位于其他国家的开发部门)不明白这意味着什么。此外,它应该有一个变化核查轨迹。

艾德:命名有什么规定?

雪莉:忘了写在什么地方了。离岸团队是3月中下旬更新的wiki,能肯定的是,所有新的参数记录必须满足新的命名要求,并保持核查轨迹。

1 天后

艾德:我将参数记录中的“MonthsOfDemand”重命名为“SelectedMonthsOfBacklogDemand”,并添加模块PAR634以保持纪录和核查轨迹。我已经提交到代码审查。

托尼(IT测试):我看到Marge中有#129281任务,但我没有收到测试计划。

艾德:按照老方式运行就行,注意WorkOrdersHours报告中总量的增加。

托尼:这就是你的测试计划?这会影响到企业的其他方面,我必须有用户选择的测试用例、预期结果、测试运行记录以及用户签收。

2 天后

菲利普:大卫,告诉托尼将艾德的程序立即提交到产品部门。

大卫:是的,先生。

本次任务总结:

总时间:6天
关键任务代码更改行数:1行
关键任务代码更改字节数:1字节

当然,你要了解更多的东西,你还可以看它的评论:http://www.iteye.com/news/25109

linux下的多线程运行PHP

linux下的多线程运行PHP

关注一下这玩意是因为在命令行下写程序的时候,发现不能够自我守护。都只能用shell来再开一个进程监控。本来想做三角监控的,但想想,只是为了一个小程序,我得写三个程序来自我守护,真没劲啊。
所以,找到pcntl_fock函数的时候很激动,其实在很久以前看过,但是没关注过,毕竟很多时间跑命令行程序的时候,一下子就跑完了,真正跑了不退出的程序,真的很少用。

<?php
$pid = pcntl_fork();
if($pid == -1){
//创建失败咱就退出呗,没啥好说的
die('could not fork');
}
else{
if($pid){
//从这里开始写的代码是父进程的,因为写的是系统程序,记得退出的时候给个返回值
exit(0);
}
else{
//从这里开始写的代码都是在新的进程里执行的,同样正常退出的话,最好也给一个返回值
exit(0);
}
}
?>

所以,以下内容就来自于上述代码中有涉及到的博客:

这样一改好理解多了,如果你父进程希望知道子进程正常退出的话,可以加上前面的pcntl_wait.
函数的用法是整明白了,在实际的工作中有什么用处呢?
1.后台程序
命令行程序好写,服务程序也好写,笔者觉得这服务程序最难写.想想原来想在windows下写个服务啥的,又是要注册服务又是要这样那样的老费劲了.现在专职管理linux想让个命令行程序在后台运行,直接在命令后面加个&就搞定了.但是这样总觉得土.有了pcntl_fork突然发现世界是那么的美好.当主进程成功创建子进程并获得子进程的id以后,自己在临死前还不忘说一句:"我已成功运行,我的id是:xxxx(子进程的id)",完了还给系统返回个0(正常退出),哈哈,死都死的那么有尊严.
前面说的是程序常驻内存的情况,当然了这时候要注意内存的释放以及向日志文件打印信息,而不是往屏幕上(一打印信息程序就退出的哟).还有一种情况是:程序被其它脚本调用,其它脚本只关心程序是不是正常运行,如果程序要运行很长时间才能运行完的话,最好不让脚本等待.这样的话pcntl_fork又派上用场了:)
2.延时处理.
有的时候,我们程序退出的时候要清理自身产生的东西,比如说要删除自己(当然了linux下面是可以删除正在运行的文件的,只是举个例子),这个时候就可以另起动一个进程,然后自己结束了,把事情交给另一个进程来做.当我们写服务程序的时候,我们肯定是写日志文件记录程序的运行情况(要不谁知道程序是不是在那睡大觉的:0).程序正常退出的时候我们可以写一条日志说程序退出了,但是当程序收到linux下伟大的kill -9的时候,怎么记录自己的退出行为呢?额.....这个和php的进程信号有关好像和这个没多大关系.
另一种情况:一个完善的程序一般都支持start,stop,restart这样的参数.start好说,stop也好说,既然start和stop都好说了,这个restart就先stop然后再start就可以了啊.额...好像又和pcntl_fork没多大关系,当你收到重启的信号总不能还是kill然后再start吧,是不是太黄太暴力了?还是温柔一点,让当前进程退出,让另外的进程再把它拉起来吧.在windows下想实现这一点似乎很困难呢,比如程序更新的时候,一般都是单写更新程序,或者程序退出的时候另起动一个批处理启动自己:)
3.不死进程
其实就是传说中的双进程了.早些年的时候万象网管为了达到不被恶意结束的目的用的就是这招了.虽然咱不用担心程序被人恶意停止,但是也保不齐主程序因为任务太重抗不住自己先挂了(这种情况也不是不会发生).所以......
说了这么多,只是对写程序的一些思考,对一个函数用法的延伸.我想到了这么多,你呢?

不知道是否能够做到这个地步,但是先关注一下,只是现在加班频繁,都不知道有没有时间来折腾它。套用锅巴说的一句:忙的象狗的人往 往都是穷鬼