2010年1月29日黄道吉日五四陈科学院新版上线了!

值昨天半夜此黄道吉日,科学院新版悄然上线。

更方便的阅读,更科学的分类,更重点的推荐,科学院人民从此站起来了。。。还在feed里溺水的看官们,出来瞅一瞅。。。

五四陈科学院新版logo

54chen Twitter Memo 2010-01-24

  • 收到谷歌的关键字广告1000元那个邮件,看来谷歌不走了,销售代理公司的员工开始冲年终的kpi了 。 #
  • 推特统计一下,现在办公区温度超过28摄氏度(包括)的请举手。 #
  • zhifubao.com这个域名不错,国内的域名,只要不含有jpqyjg好像都成功了,不完全小道统计经验。 #
  • 状态帝: 三国霸主预示了今天的现状。孙权、刘备、曹操,即权,备,操。或者备,权,操。 #
  • http://tech.qq.com/a/20100119/000278.htm 谷歌宣布谷歌中国业务恢复正常运转 #
  • 状态帝 : 同学家吃的晚饭,回家发了短信和他说“你妈的红烧肉棒极了”。结果今天手机不能发短信了。 #
  • 状态帝 : 《孔子》以一亿五的资本造就的话语霸权毁掉了孔子最基本的理念——己所不欲,勿施于人。 #
  • 韩寒:从今天起,做一个低俗的人,劈腿翻墙,周游世界;从今天起,污染粮食和蔬菜,我有一个房子,面向大海,却被强拆。 #
  • 状态帝 : 我举报一个又色情,又低俗,又反华的艺人名字——黄日华。请组织部敏感词他! #
  • http://ugc.renren.com/2010/01/21/ugc-nuclear-guide-use/
    人人网UGC海量存储系统Nuclear介绍 – 功能应用篇 #

人人网海量存储系统Nuclear介绍

经过这几个月大家共同的努力,Nuclear终于来到新的阶段。

人人网 Nuclear

山寨版本的Logo

Nuclear存储系统:高性能、高可靠、可扩展的海量数据存储

请移步人人网UGC团队博客:http://ugc.renren.com/2010/01/21/ugc-nuclear-guide-use/

人人网UGC团队博客正式在科学院亮像,欢迎网友订阅,专注UGC社区大负载研究与应用!

http://ugc.renren.com

http://ugc.fm

下面是一些补习班知识:

TC

Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符串。这里没有数据类型和数据表的概念。当做为Hash表数据库使用时,每个key必须是不同的,因此无法存储两个key相同的值。提供了以下访问方法:提供key,value参数来存储,按 key删除记录,按key来读取记录,另外,遍历key也被支持,虽然顺序是任意的不能被保证。这些方法跟Unix标准的DBM,例如GDBM,NDBM 等等是相同的,但是比它们的性能要好得多,因此可以替代它们。

Dynamo

Dynamo 的可扩展性和可用性采用的都比较成熟的技术,数据分区并用改进的一致性哈希(consistent hashing)方式进行复制,利用数据对象的版本化实现一致性。复制时因为更新产生的一致性问题的维护采取类似 quorum 的机制以及去中心化的复制同步协议。 Dynamo 是完全去中心化的系统,人工管理工作很小。

Linkedln   Linked是一个“高效”、“安全”并且“有商务价值”的“白领SNS提供商”:LinkedIn足够高效,而且没有什么打扰用户的信息。即便是广告的投放,LinkedIn也处理的十分艺术:有侧边栏下方几乎不会分散我的注意力; LinkedIn上没有太多会打扰到你的人。而且,用户与用户之间的关系严密地保护起来。这和其他SNS拿着用户资料去做SEO实在是天壤之别; LinkedIn专注于商务功能,并且提供付费服务。这极大地体现了它的确具备提供高质量商务社交服务的能力 LinkedIn是非常适合白领使用的一款SNS工具,尤其是有国际业务的企业员工或者自由职业者。不过,Linked不太适合学生使用。因为Linked很注重工作经验和教育背景,如果你现在还在还没毕业,除非你有相当丰富的社会实践经验,否则完全可以忽视这个玩意,因为它现在还无法为你创造价值。他有一个相似的系统叫伏地魔,之前科学院里的文章曾经提起过,起驾观看

54chen Twitter Memo 2010-01-17

  • 万恶的CNNIC从1月20日起,cn域名只能归属到公司或者企业名下。屯cn域名的哥些,悲惨了,注册个公司吧 #
  • http://www.54chen.com/1/%E5%92%8C.%E8%B0%90 百度虽然挂了,山寨依然坚挺 #
  • 中华人民共和国六十一年一月十二日,就是南京市东南大学电气工程学院学子为前一日惨淡的电力系统考试成绩痛心疾首同时对下一天的电机学考试愁眉不展的一天,我独在图书馆里自习,遇见同学,前来问我道,“先生可曾为挂掉的百度写了一点什么没有?”我说“没有”。 #
  • 3d imax 周四晚上 陪GF观传说中的阿凡达 #
  • 年终续签自我评估,我写一万能句,被打回:在过去的一年,个人在公司期间工作积极努力,在未来的日子里,愿意为公司的长远发展添砖加瓦。 #
  • @162cm 兄弟尽管用,放之四海皆准,哈哈 #
  • 从小的理想:长大后要做科学家。终于快要实现了,老是有人发邮件过来,抬头是“陈科学院”。。。其实我博客是这样断句的 “我是陈”-“科学院”http://www.54chen.com #
  • @Qieqie 现在成科学院了,还差一个字 #
  • 谷歌的离开,表示我党公信度进一步的丢失。 #
  • 状态帝 : 整个学期全荒废,临近考试全心碎,一周时间全没睡,考试之前全在背,走进考场全崩溃,拿到卷子全流泪,背的东西全不考,考的东西全不会T_T #
  • 刘健: Google声称推出中国,百度大涨:413.52 +27.03 (6.99%) #
  • 审核部门的同志们又往这边跑了,我看出来了,今天上头又有新通知。加紧力度审核。。。 #
  • 从网友反馈的谷歌搜索关键词来看,已经有部分服务去掉了 “根据当地法律法规。。。” #
  • 昨天百度被搞的时候买入百度股票,此刻乐翻天。 #
  • 网易科技威武:http://tech.163.com/10/0113/07/5ST3OP5P000915BF.html #
  • 张启睿Aw: #Google# 人人网,纯爷们。各大网站都开始删除关于 google 的消息了。 #
  • http://www.douban.com/note/56732966/ 今天中午12时许,一群自发组织的群众在位于清华科技园的谷歌大楼前聚集,举行疑似祭奠活动,献花并合影留念。这群人大部分为20岁左右的年轻人,其中也不乏国际友人 #
  • 状态帝 : 90后:今天我翻墙,看到一个国外网站叫Google的,妈的全是抄袭百度的。00后:翻墙是什么? 10后:网站是什么? 20后:国外是什么? #
  • 谷歌同学播报:来了很多记者,所有PR出动把正门堵住,全员都在看电视电话会议,业务全部休眠,正式决议要到晚上出。很可能明天就不用上班了 #
  • RT @Fenng: 二代身份证可能是近10年来设计最脑残的产品了。 #
  • @tinyfool 出个技术移民手册吧 #
  • @Fenng 哈哈 昨天我还有一文百度写点什么的 不全 #
  • 同事发来一个未经证实的消息:谷歌员工没法干活是因为谷歌总部关闭了给中国的VPN服务,关闭的原因是GFW研发团队正在试图攻击这个VPN #
  • 屈服:丢人丢大发了,以后工作不好展开,谷歌开了头。 不屈服:言论不自由恶名更响,民望更差,影响甚远。 人人网亮哥分析时政语录。 #
  • 李伟博☭: 转自马斌: google捅破一个秘密,除了sogou。其他搜索引擎都在秘密用google的搜索结果。 #
  • 方亮: 防民之口,伤民之心。得片刻之利益,失长久之大计。长此以往国将不国,国将不国,民何以处之。 #
  • 人人网海量存储系统nuclear内部预发布会正式开始 26层 大杂院 会议室 #
  • RT@edwardzhangNuclear 系统特点:数据自动复制到多个节点;数据自动分区到不同的节点;数据存储空间无限。 #
  • Nuclear的分区原理,之前我们走了很多曲折的路,参考使用dynamo的分区后,我们面临了迁移数据的很大难题,要很短时间迁移数据,那是很困难的。于是采取了cassandra的方案。 #
  • 插播 京城日食了 天黑黑 #
  • Nuclear未来可支持半结构化查询 #

PHP上传文件类型彻底判断方案及PHP+nginx上传大小彻底控制方案

上回科学院发过一篇讲述上传判断的文章,位置是

PHP JAVA C上传文件如何准确判断文件类型-mime知识普及

本文目的在于,进一步更正前文所述的mime判断方式,以及增加一个nginx环境里的文件上传大小所影响的代码。

上传类型控制:

在我(54chen)工作中发现,其实修改文件的后缀,浏览器就会很傻瓜地传送错误的mime类型,所以前文的判断是一个半错误的方法(除了C代码是正确的)。

网上流传一段PHP读取文件头判断文件类型的方法,有一些bug,经我(54chen)修改实测,应该是这个样子:

/**
* 读取文件前几个字节 判断文件类型
* * @return String
*/
function checkTitle($filename) {
$file     = fopen($filename, "rb");
$bin      = fread($file, 2); //只读2字节
fclose($file);
$strInfo  = @unpack("c2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch ($typeCode)
{ case 7790:
$fileType = 'exe';
break;
case 7784:
$fileType = 'midi';
break;
case 8297:
$fileType = 'rar';
break;
case 255216:
$fileType = 'jpg';
break;
case 7173:
$fileType = 'gif';
break;
case 6677:
$fileType = 'bmp';
break;
case 13780:
$fileType = 'png';
break;
default:
$fileType = 'unknown'.$typeCode;
} //Fix
if ($strInfo['chars1']=='-1' && $strInfo['chars2']=='-40' ) {
return 'jpg';
} if ($strInfo['chars1']=='-119' && $strInfo['chars2']=='80' ) {
return 'png';
} return $fileType;
}
这代码可以非常正确地分出修改后的文件,从而达到阻止修改后缀名上传的情况。

上传大小控制:

在PHP代码中直接读取$_FILE的size,而如果是特别大的文件,又使用了PHP+nginx的话,很有可能,超过2M的文件直接就被nginx就抛出来413错误了。

解决的办法:

修改/etc/nginx/nginx.conf

找到对应域名的server段:修改client_max_body_size的值,默认是2M。

这样子还不够,如果不修改php.ini里的值,你会发现上传的文件用上面的代码判断类型的时候会出问题。

修改/etc/php.ini

找到upload_max_filesize,修改这个值,默认是2M。

一番折腾,类型和大小的控制基本上就完善了。

重要PS

对于上传文件类型的判断,一直没有太好的办法,即使使用上面的代码,也有办法构造假的图片的(如何构造不再传播),有人使用getimagesize来判断,不失为一种好办法:

if(in_array($attach['ext'], array('jpg', 'jpeg', 'gif', 'png', 'swf', 'bmp')) && function_exists('getimagesize') && !@getimagesize($target)) {
    @unlink($target);
    upload_error('post_attachment_ext_notallowed', $attacharray);
   }

摘自dz代码。

函数参考 http://cn2.php.net/getimagesize

54chen Twitter Memo 2010-01-10

  • 51.com被封了:新网接到刚刚北京市通管局通知,称51.COM含有淫秽色情信息,要求新网先进行锁定。“现在我们正在与相关各方进行联系,具体域... #
  • 终于明白了,中国国际航空公司的一个经理说的,牵一发而动全身,为什么要慢?因为你已经是大公司了,快不得,快只会让你出错! #
  • 人人网故障报告,论低级错误产生的源头。 #
  • 人人网海量存储系统Nuclear 开源申请中 。。。啦啦啦 #
  • 杨钞浇: 好好理解:这个世界不是有钱人的世界,也不是有权人的世界,而是有心人的世界。 #
  • 杨程博❤要努力: 转自程冠: 达芬奇密码的上面,是达芬奇帐号你知道达芬奇密码的下面是什么吗是达芬奇验证码 #

Jdbc socketRead0 Locked 记一个Mysql的不明bug

在开发人人网海量存储系统Nuclear的过程中,使用到mysql引擎,用了spring+dbcp+jdbc,在压力测试的过程中出现了问题。

在追踪java stack的过程中发现如下的问题:

java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
- locked <0x00002aaab9b2b0d8> (a com.mysql.jdbc.util.ReadAheadInputStream)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2494)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3005)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2938)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3481)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1416)
at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2883)
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:476)
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2576)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1757)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2167)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
- locked <0x00002aaab9d98790> (a java.lang.Object)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2228)
- locked <0x00002aaab9d98790> (a java.lang.Object)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:648)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:591)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:641)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:670)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:702)
at com.renren.nuclear.storage.MySqlDumpEngine.getListByLeftRight(MySqlDumpEngine.java:198)
其中锁住了tcp的socket,在研究无果的情况下,试着搜了一下,发现已经有人在mysql bugs里提到:

http://bugs.mysql.com/bug.php?id=9515

分析产生bug的原因:

mysql建表的时候使用innoDB,表中有过千万的数据,每次取过多的数据,就会重现。

可能的原因:jdbc在做网络层的时候tcp的buffer不够所致io锁。

最简单的解决办法:

把原来的limit 1000改小,变成了limit 100。

54chen Twitter Memo 2010-01-03

  • 有些运营,说话能把人格银死,说起话来不离“麻烦”“您能”“谢谢”,一点商量的余地都没有,爷爷的,都给人打工,你就不能和气点吗? #
  • 戴文哲: 两个女人陪伴了曹操近两千年的光阴,人生最大的幸福,也就是如此吧 #
  • 徐瑜骏: bei.liu@opi-corp.com, quan.sun@opi-corp.com, cao.cao@opi-corp.com //牛B #
  • QA不专业害死人 #
  • RT Haopeiqiang (tinyfool): RT @zhengyun: 『曹操墓里惊现两个头盖骨,经考古学家鉴定,其中一个是曹操的,另一个是曹操小时候的。』转自人民网。 #
  • 谢强: 北京的天桥就像尿频尿急,你跨一步吧像大姑娘上轿,跨两布吧又像登山,真佩服设计者们的智慧。 #
  • 上述网站违背社会公德的行为引起公众的愤慨,应受到强烈谴责。--你愤慨了没? #
  • MySQL servers : memcached servers = 2:1 #
  • 网络营销AE郭嵩童鞋,在招行提款机上拾到提款卡一张,通过在万能的人人网上发布状态,第一时间找到了粗心的失主,特对郭嵩童鞋拾金不昧的精神提出表扬。

行政部

2009/12/30 #

  • @xmpp 这是facebook的数据 #
  • 一下午的技术讨论,累死,人人网-英特尔技术专题讨论会实录 http://www.54chen.com/_linux_/everyone-network-intel-technology-symposium-record.html 原生态实录 #
  • 张义民@¥: 女朋友最佳姓名。1,股票界:张婷。2,电影圈:朱颜。3,房产商:曹芳。4,公务员:沈倩。5,石油公司:章佳。6,诗人作家:霍绛。7,媒体记者:游虹宝。8,互联网:范蔷。 #
  • 【搜狐IT消息】12月30日消息,近日多名从事社交游戏开发的开发商向搜狐IT表示,已经接到版署通知,要求对旗下社交游戏进行备案。 #
  • 蒋智磊: 车到山前必有路,只要不到30度! #
  • 项伟: 從北京工人體育場球迷們嘴裏喊出的頻率最高的詞匯是什麽?A.加油;B.傻逼;C:下課. #
  • 袁涛: 中国电信关怀用户,主动帮所有ADSL用户屏蔽了80端口 #
  • 刘、关、张三人投奔曹操,曹操很高兴,赐三人新兵器。刘备说:给我搞把剑。关羽说:我搞把刀。张飞说:搞毛。曹操不悦,把张飞赶出去。张飞急了,大喊曹操:操!搞矛,搞矛啊…… #
  • [零九零献]献出服务器批量操作shell脚本

    现在是北京时间零九年最后一天的下午五点

    值此年末岁初的佳节时期

    54chen祝订阅没订阅科学院日志的朋友们 元旦快乐!

    特地送出shell脚本一个,适合用于经常性的和十台以上服务器打交道的同志们,解放双手。看码:

    第一个文件 run.sh 功能 总控 运行的文件 是操作时的入口

    #!/bin/sh
    SERVER_FILE=server

    SERVER_LIST="`cat ${SERVER_FILE}|grep -v "#"`"

    for SERVER in `echo "${SERVER_LIST}"`
    do
    echo ${SERVER}
    sh runOne.sh ${SERVER};
    done;

    第二个文件 runOne.sh 功能 自定义每个服务器要进行的操作的步骤

    #!/bin/sh
    host=$1
    ssh root@$host "yum -y install mysql-server" #上传
    scp my.cnf root@$host:/etc/my.cnf #操作

    第三个文件 server 功能 记录有哪些服务器要操作 #号可以注释不想操作的机器

    #10.22.206.21
    10.22.206.22
    10.22.206.23
    10.22.206.24
    10.22.206.25

    使用的时候,先设置server文件,直接./run.sh 就开始执行,灵活鸡动,方便快捷。