Nitro's

Jan 8, 2013 - Comments - tech project

Do+微博 更新日志

v1.4 删除无效功能 全新的UI体验 v1.5 增加离线阅读 重新设计UI点击体验 增加我的微博、评论、@我功能 增加消息推送 增加发微博时的@功能

Dec 30, 2012 - Comments - dev tech

UTF-8 符号 对照表

续 设备控制字符代码表 代码 符号 代码 符号 代码 符号 %u0020 %u0040 @ %u0060 ` %u0021 ! %u0041 A %u0061 a %u0022 “ %u0042 B %u0062 b %u0023 # %u0043 C %u0063 c %u0024 $

Dec 13, 2012 - Comments - life

打工(三)

如果大学期间做过最有趣的兼职应该算是推销馒头了。 这个兼职是当时我们专业的一个同学由于有事不能去,然后我去顶替她做一天的。当时去了之后才发现这工作不是男生做的。清一色的女生,然后老板见到我时,一脸的不情愿,就像是在说,你同学不来就不用来了,怎么还带一男生?当时我也挺尴尬的,幸好有我们专业的另外两个女生来救场。“××××的馒头,石磨、豆面馒头,7毛钱一个,2块钱三个”这就是当时的口号,在菜市场旁、在小区门口、在街巷小道,每个周末我们三个都会定期坐上来接我们的车一块去各个地方推销馒头。依稀记得我们的销售记录是90x14箱,那个景象真得很难让人相信那是在买馒头,两个泡沫箱子的前面围着全是买馒头的人,三个人忙不过来。那天卖完回去,老板笑得合不拢嘴,然后就再也没有对我抱着一种成见的态度来对待我,因为事实证明,我是一个很好的搬运工外加扩音器外加推销员。现在想想当时我们三个人卖馒头的景象还是蛮让人想念的。馒头构建不只是民之基,更是大学生活不可或缺的一种记忆。 毕业后的工作,如果算是打工的话,有点牵强。之前听同学说的他单位的一件事。同事A跟他是同一专业,2011年毕业,整天在抱怨工作没意思,整天copy and copy,工资也不涨,唠叨倒是一堆一堆的,可是说实话,整天都得看到他笑眯眯的聊QQ,名目张胆的在那儿带着耳机看电影,每次饭间谈到Dota时情绪高昂,每次谈到代码时,止于一点再没下文。他每次抱怨,同学只是微笑着听,然后不发表意见。相反他谈起同事B,明显态度就不一样,B是一财经院校毕业,当时找工作,面试了两家之后就来到同学这家公司,来到之后才发现情况不太一样,工资确实不高,晋升无望,工作繁杂无序,但是他没有太多抱怨,当没有工作时,自己打开PDF Reader来看考研试题以及复习要点,很明显B要考研。相比同学的这两位同事,同处一个公司,环境相似,却造就了这样两类人。当我跟同学只是聊起来比较好有趣,不做评价,存在着必有其原因嘛,不管是公司兴衰中总少不了任何一个人的因素,成败不取决于一个人,但每个人却在影响着环境,还好,同学准备离职了,祝他找份喜欢的工作吧。

Dec 13, 2012 - Comments - life

打工(二)

高考成绩出来以后,如果单看分数觉得符合自己当时的状态,虽然英语莫名的高分、高数莫名的低分,但是自己坚定的认为,大学生活将要开始了,然后选择了专科志愿,然后就是三年的济南生活。 大一上学期的生活总是飘然的就过去。认识一座城市,认识一个大学,认识来自不同地市的同学,开启一段全新的生活。寒假已至,在家过完年闲着没事就又动了出去打工的念头,问问了哥们他爸,正好过完元宵节就开工去北京,跟老爸通知一声就直接去了。正月十五吃完团圆饭,十六号就坐上了北上的车。相比于老家的寒冬,北京丝毫不减那个寒,一出门就是大气不敢呼出一口。这次的工地搬到了顺义区一别墅群,由于距离飞机场不远,所以这边的房子都比较低矮,建别墅群正合适。提到顺义,不得不提一下一个特产:红星二锅头。走到街头都是满满的酒糟的味道,让你不喝酒胜过喝酒的感觉。对二锅头不得不说是又爱又恨。由于老爸比较喜欢喝酒,心想既然已经来这里了,当然要带回几瓶去,所以走的时候带了两小瓶,之前老爸由于摔了胳膊把酒戒掉了,但是自从我把二锅头带回家,酒瘾又上来了,然后就收不住馋嘴了。奶奶经常就埋怨我,如果没我带回来的二锅头,估计现在也就作罢不喝酒了,哈哈。插曲一出。来这个工地又换了一个工种,现在是空调安装。三层庭院式别墅,全中央空调,全部是铜管走管,当时有个比我大三岁的哥来做焊接工作,我就做走管和保温,应该还有几张照片留下了当时做保温时囧相。由于外边下着雪,但是还不能停工,就在外边淋着雪,继续做保温层,当时真的感觉太不容易了。做完保温之后,后面就是给风机扩口封装,这个工作是我做过的最精致也是最省事的。每天我们两个都会带着一个红色(印象很深)扩口专用工具箱,爬上扶梯,把螺口套套在铜管上,然后把管口一圈圈的扩开,套在风机口上,上螺口套,完毕。就是这个工作,重复,重复,然后大约扩了有一个多个。当然这里面大意也会有,一天在做一个房间的压力测试时,刚打开氮气瓶就发现压力表猛升一下就再慢慢降,后来才发现由于一个口根本就没扩,然后一直在那儿泄气,哈哈。 这次打工的关键词:灰机灰机、09年300w的别墅、红星二锅头、磨破的手和那永远都很热卖的豆腐脑。 或许对于打工有种体验在催试着我,做更多的尝试,这也就有第三次北京之旅,不再是一个哥们的老爸,另外一个。这次是消防安装。面对着10米长、半径25cm的镀锌管,我才知道相比于锅炉安装和强电安装来说,这才是最重的工作。由于框架楼能够借助的钢梁都不是很合适,只能靠扛和搬来完成,这也成就是我每天吃13个馒头的记录,那时候的自己每次吃饭除了饿还是饿,以至于每次老板娘都会多准备几个馒头,怕我吃不饱。但是在其间的一件事让我改变了念头。当时的工地就是现在微软研发集团的大楼,每天晚上吃完饭我都会跟哥们换身衣服一块去附近的中关村图书大厦看书。我第一次走进那个书店,才知道书店原来可以这样,里面每一排书架下都有小凳子,里面满满的都是人,中老年人关注炒股、养生,青年人看经济、计算机类的书,小朋友或者看漫画书或是跑跑玩玩,我则选择我的专业书,软件开发类,从我拿起那本《struts2权威指南》时,此后所发生的一切都是那么顺其自然了。辞掉这个工作,回家立刻投入学习中去,提前做完课程,准备下学期的课程。虽然这之间发生了很多不愉快的事情,但是我相信这是一个正确的决定。

Dec 13, 2012 - Comments - life

打工(一)

第一次去北京是在4年前的暑假,高考刚刚完分数还没有下来,家里农活也已经忙完,本想去县城酒店端盘子或者刷碗的活儿,无奈于住宿也不方便,也便作罢。正巧我哥们他爸在北京当包工头,然后他也想去帮忙,遂决定跟他一块去北京当次“农民工”。这也是记忆中的第一次去首都,当时心情有点激动,什么也不知道,傻里傻气地坐着从老家直达北京的长途客车就奔去了。刚下车时还没有什么特别,跟县城同样的车站,同样的拥挤,还有各式的小商小贩、拉客的司机师傅,但是你听到的话语开始混杂起来,山东话、四川话、东北话,此刻才让你明白这是一个都市。 对于工地上的体力活来说,算是小kiss,农村孩子出来的,几乎没有说扛钢管还需要三步一休息的情况。当时在那儿的主要工作强电布管和天然气锅炉安装。一开始在朝阳门南小街做强电布管,那是在孚王府内的一座私人宅院施工,我和村里的两个叔叔在一块做强电安装,在那儿不是很忙的做了大约一周,搬搬走线管、做做接地的小活,其间还兼任着伙夫的职位,负责我们每天的食材采购、偶尔也会下下厨房(有锅、有火就是厨房吧),做做小菜、下面条之类的事儿,还算是比较乐呵。跟我一块的哥们由于有别的工地就被安排到别处去了,没跟我在一块。 这个工地由于是私人宅院,管理比较严格,每天晚上都会定点关门,所以也没怎么出去逛逛,当时对北京来说还是比较陌生。过了一个多星期由于要开奥运会,北京开始限制工地施工,当时虽然没有每处工地来核查,但是采取了外地车辆限行、黄标车禁入的办法,导致原材料运不进来,让很多工地老板都着急了,因为工期合同已经签好,延期就很难办,我们这个工地当然也没能幸免,最后只能停工。幸运的是,我们在另外一个工地的活儿可以继续进行,因为锅炉部件早已经到货而且安装不涉及到地上施工,所以很自然就搬到另外一个的工地去了。终于跟我那 哥们聚在一块干活了,兴奋。兴奋之余看到几千斤重的锅炉片未免又是一身冷汗,这庞然大物到底怎么安装?这东东又是从哪儿运到地下10多米的?等到施工那天才发现,原来我的问题都是废话一堆:“捣链”(家乡话是这样说,具体学名没考究)、法兰片、空调出风口、一米长的大扳手、玻璃丝完全解决那些问题。 好奇心,就是好奇心在驱动着我每天在思考。那是每天在地下室工作,吃饭也是地下室,也至于每天中午都得出来见见阳光,否则下午再出来眼睛就有点受不了。每天8点开始干活,我们大约有十来人外加2个技术工程师(还是老乡,哈哈)一块实施。从一片的吊装、封装玻璃丝、涂胶、入轨、蛮力扣死这几个过程,差不多这一片才能安安稳稳坐上锅炉底座,就是这样一步步的才把一座18片的锅炉安装完成。依稀的记得大约每天才装4-5片的样子,由此可以想象那一片的重量。不过遗憾的一点是我回家后听说,锅炉压力测试没有通过,加压测试后片片之间会冒火星,可能还是当时封胶时用力不够,囧,后来也不知道怎么解决的那个问题。在那儿还有一件事情比较深刻,那就是饭量,每天中午在那儿看家的叔叔都会去菜市场买大油饼,然后买上一批葱,开饭的时候就对我们大喊一声:开饭了!每人半张饼,两棵大葱!抓紧了!来晚的没有了!我跟哥们都会呼呼地洗完手就直奔油饼袋。半张饼卷2棵大葱,哈哈。现在走在大街上看到有烙油饼,看看油饼那半径,怎么想也敢想自己一顿饭就吃半张饼,现在的饭量也就是三个馒头的量了。 在这之间还发生一件事让我记忆犹新,某天我跟哥们老爸一块回到住的地方,由于太累没没带换的衣服,穿着一身脏兮兮的衣服就去做地铁了,然后我要去刷卡,在安检的警察就让我等一等,然后我就想:包也过安检了还有什么问题吗?当时也有点小紧张,他笑着让我出示一下身份证,还好身份证随身携带,旁边的姐姐随手记下来,然后就通过了。这事告诉我,在警察面前一定要穿的靠谱点,至于这张脸善不善都是自然灾害不可更改了。 在这个工地的锅炉施工大约进行了一个月,后来由于成绩快下来了,然后我就跟哥们一块相约回家填志愿了。 当时赚多少钱已经记不清楚了,这算是第一次独立的打工体验吧,也是第一次认识一个北京。

Nov 21, 2012 - Comments - dev tech

新浪微博上传图片---Android代码示例

在做新浪微博客户端上传图片时,API的解释一直很不给力,由于上传图片必须模拟HttpClient的行为模式,导致移动客户端的上传图片模块开发比较棘手。无奈只能旁征博引,参考其他资料,以下代码在Android平台下测试已经通过。 参考资料:人人网API、腾讯微博API public class HttpFormImage { private final static String CN = "HttpFormImage"; private final static String BOUNDARY = "sdg8sf8vdsd8"; private final static String MP_BOUNDARY = "--" + BOUNDARY; private final static String END_MP_BOUNDARY = "--" + BOUNDARY + "--"; public boolean sendMsg(String url, String access_token, String text, File image,String imageType) { ByteArrayOutputStream bos = null; byte[] data = null; try { HttpPost post = new HttpPost(url); post.setHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); bos = new ByteArrayOutputStream(); paramToUpload(bos, "access_token", access_token); paramToUpload(bos, "status", text); imageContentToUpload(bos, image,imageType); data = bos.

Nov 21, 2012 - Comments - dev tech

Android View 圆角色设置方法

×.9.png 将图片做成带圆角和填充背景色的*.9.png的图片,将图片设置为View的backgroud shape 在Drawable下设置shape元素的xml文件,在里面的corner元素设置四个角度上的圆角,注意BottomLeft指得是右下角。如果还需要填充View背景色的话,还需要设置solid的色值。

Oct 8, 2012 - Comments - tech internet

开发人员应该如何发问

前几天一直在测试豆瓣登录,其间出现了很多的问题,不免会直接与做OAuth2.0认证的开发人员沟通,也看到不少在豆瓣开发小组里面提的问题。在看到一条问LZ问题的帖子时,勾起了我对这个问题的思考:我们开发人员到底应该怎么发问才能让回答者侃侃而谈又能答而所问? ====================原文没有写完,今天突然看到这篇文章,转来也算是同感吧~ 原文 由于一直从事技术和平台产品方面的工作,我们部门经常会收到公司内外同事和同仁的问题邮件,有些好的问题能让你发现自己技术上的缺陷、产品的bug或提升的空间,去思考、回答和解决这样的问题真是一件让人愉悦,充满挑战和成就感的事情。但是非常遗憾的是,这样的好问题却是凤毛麟角。我经常会被一些莫名其妙的问题搞的啼笑皆非,比如: 程序运行过程中突然内存溢出,该如何解决? 如何配置JVM的虚拟机参数? 程序部署到Linux上后,页面出现中文乱码,是不是中间件的配置出现问题了? 集群节点不能自动复制,如何解决? 最可气是第四个问题,经过了解环境逐一排查,最后发现两个节点根本就ping不通嘛,这种“异常”在现场该是多么容易发现啊! 当然,类似的傻问题我年轻的时候也问过,谁会不犯错呢,真正让我认识到这一点的重要性,还是在工作中与国外程序员的邮件交流。在2005年期间,与国外程序员共同维护公司内部的一个平台级产品,邮件往来必不可少,慢慢的我发现国外的程序员提的问题或报的bug都非常有规律,每个问题或bug都有非常清晰的标题,正文是环境描述,已经采取了什么措施、结果,相关日志,Core dump,图片等等,一般读完邮件就能非常清楚的了解对方想要表达的意图和希望你能提供的帮助,而且你也知道该做什么,如何回复等等。久而久之,自己也不好意思再去写那些傻问题了。 那么作为技术人员,如何去问一个让双方都满意的好问题并最大程度的得到回复呢?这一点对提问者重要,对被问者同样重要,大好人生,谁也不愿意为一个烂问题浪费时间。 简单总结一下,如果你按照以下步骤进行,提出的问题一定会更靠谱一些,提出好的问题是你提升的第一步,其实这个过程在提问之前已经开始了: 遇到问题不要急着问别人,在时间允许的情况下看是否自己能够解决,一方面锻炼自己分析问题和解决问题的能力,另一方面,一旦问题解决了,问题就不是问题,而是你的经验和知识库。况且现在互联网有那么多的技术资料和各类问答网站,想碰到一个别人没碰到的问题,已经非常困难了,除非是内部产品。 如果做了努力依然不能解决,或者客观条件不允许你自己解决了,那么首先要选择提问对象,不管是社区还是公司同事,确保他是你所知道的最佳解决人选。 你需要一个好的标题,用清晰的短句描述你遇到的问题至关重要的正文 (1)用清晰的语言描述你遇到的问题 (2)提供软件环境,包括操作系统、数据库等相关软件及其版本号 (3)问题是否可以重现,采用什么方式重现 (4)采用了什么措施解决问题,最终结果(可提供日志、程序、截图等描述) (5)尽可能提供问题相关的可分析文件,包括日志、截图和Core dump等 (6)不要长篇大论,简明扼要,描述主要问题 最后,不要忘了说请和谢谢,毕竟你需要别人帮助你解决问题,没人欠你什么。

Aug 23, 2012 - Comments - repost

漫谈linux文件IO

在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO。本篇文件打算详细全面,深入浅出。剖析文件IO的细节。从多个角度探索如何提高IO性能。本文尽量用通俗易懂的视角去阐述。不copy内核代码。 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦。让我们看一下下面这张图。 穿越各层写文件方式 程序的最终目的是要把数据写到磁盘上, 但是系统从通用性和性能角度,尽量提供一个折中的方案来保证这些。让我们来看一个最常用的写文件典型example,也是路径最长的IO。 { char *buf = malloc(MAX_BUF_SIZE); strncpy(buf, src, , MAX_BUF_SIZE); fwrite(buf, MAX_BUF_SIZE, 1, fp); fclose(fp); } 这里malloc的buf对于图层中的application buffer,即应用程序的buffer;调用fwrite后,把数据从application buffer 拷贝到了 CLib buffer,即C库标准IObuffer。fwrite返回后,数据还在CLib buffer,如果这时候进程core掉。这些数据会丢失。没有写到磁盘介质上。当调用fclose的时候,fclose调用会把这些数据刷新到磁盘介质上。除了fclose方法外,还有一个主动刷新操作fflush 函数,不过fflush函数只是把数据从CLib buffer 拷贝到page cache 中,并没有刷新到磁盘上,从page cache刷新到磁盘上可以通过调用fsync函数完成。 从上面类子看到,一个常用的fwrite函数过程,基本上历经千辛万苦,数据经过多次copy,才到达目的地。有人心生疑问,这样会提高性能吗,反而会降低性能吧。这个问题先放一放。 有人说,我不想通过fwrite+fflush这样组合,我想直接写到page cache。这就是我们常见的文件IO调用read/write函数。这些函数基本上是一个函数对应着一个系统调用,如sys_read/sys_write. 调用write函数,是直接通过系统调用把数据从应用层拷贝到内核层,从application buffer 拷贝到 page cache 中。 系统调用,write会触发用户态/内核态切换?是的。那有没有办法避免这些消耗。这时候该mmap出场了,mmap把page cache 地址空间映射到用户空间,应用程序像操作应用层内存一样,写文件。省去了系统调用开销。 那如果继续刨根问底,如果想绕过page cache,直接把数据送到磁盘设备上怎么办。通过open文件带上O_DIRECT参数,这是write该文件。就是直接写到设备上。 如果继续较劲,直接写扇区有没有办法。这就是所谓的RAW设备写,绕开了文件系统,直接写扇区,想fdsik,dd,cpio之类的工具就是这一类操作。 IO调用链 列举了上述各种穿透各种cache 层写操作,可以看到系统提供的接口相当丰富,满足你各种写要求。下面通过讲解图一,了解一下文件IO的调用链。 fwrite是系统提供的最上层接口,也是最常用的接口。它在用户进程空间开辟一个buffer,将多次小数据量相邻写操作先缓存起来,合并,最终调用write函数一次性写入(或者将大块数据分解多次write调用)。 Write函数通过调用系统调用接口,将数据从应用层copy到内核层,所以write会触发内核态/用户态切换。当数据到达page cache后,内核并不会立即把数据往下传递。而是返回用户空间。数据什么时候写入硬盘,有内核IO调度决定,所以write是一个异步调用。这一点和read不同,read调用是先检查page cache里面是否有数据,如果有,就取出来返回用户,如果没有,就同步传递下去并等待有数据,再返回用户,所以read是一个同步过程。当然你也可以把write的异步过程改成同步过程,就是在open文件的时候带上O_SYNC标记。 数据到了page cache后,内核有pdflush线程在不停的检测脏页,判断是否要写回到磁盘中。把需要写回的页提交到IO队列——即IO调度队列。又IO调度队列调度策略调度何时写回。 提到IO调度队列,不得不提一下磁盘结构。这里要讲一下,磁头和电梯一样,尽量走到头再回来,避免来回抢占是跑,磁盘也是单向旋转,不会反复逆时针顺时针转的。从网上copy一个图下来,具体这里就不介绍。 IO队列有2个主要任务。一是合并相邻扇区的,而是排序。合并相信很容易理解,排序就是尽量按照磁盘选择方向和磁头前进方向排序。因为磁头寻道时间是和昂贵的。 这里IO队列和我们常用的分析工具IOStat关系密切。IOStat中rrqm/s wrqm/s表示读写合并个数。avgqu-sz表示平均队列长度。 内核中有多种IO调度算法。当硬盘是SSD时候,没有什么磁道磁头,人家是随机读写的,加上这些调度算法反而画蛇添足。OK,刚好有个调度算法叫noop调度算法,就是什么都不错(合并是做了)。刚好可以用来配置SSD硬盘的系统。 从IO队列出来后,就到了驱动层(当然内核中有更多的细分层,这里忽略掉),驱动层通过DMA,将数据写入磁盘cache。 至于磁盘cache时候写入磁盘介质,那是磁盘控制器自己的事情。如果想要睡个安慰觉,确认要写到磁盘介质上。就调用fsync函数吧。可以确定写到磁盘上了。 一致性和安全性 谈完调用细节,再将一下一致性问题和安全问题。既然数据没有到到磁盘介质前,可能处在不同的物理内存cache中,那么如果出现进程死机,内核死,掉电这样事件发生。数据会丢失吗。 当进程死机后:只有数据还处在application cache或CLib cache时候,数据会丢失。数据到了page cache。进程core掉,即使数据还没有到硬盘。数据也不会丢失。 当内核core掉后,只要数据没有到达disk cache,数据都会丢失。 掉电情况呢,哈哈,这时候神也救不了你,哭吧。 那么一致性呢,如果两个进程或线程同时写,会写乱吗?或A进程写,B进程读,会写脏吗? 文章写到这里,写得太长了,就举出各种各样的例子。讲一下大概判断原则吧。fwrite操作的buffer是在进程私有空间,两个线程读写,肯定需要锁保护的。如果进程,各有各的地址空间。是否要加锁,看应用场景。 write操作如果写大小小于PIPE_BUF(一般是4096),是原子操作,能保证两个进程“AAA”,“BBB”写操作,不会出现“ABAABB”这样的数据交错。O_APPEND 标志能保证每次重新计算pos,写到文件尾的原子性。 数据到了内核层后,内核会加锁,会保证一致性的。