├── .gitignore ├── .hgignore ├── 2011年度总结.rst ├── CortexCommand介绍.rst ├── C语言如何实现RAII.rst ├── DwarfFortress介绍.rst ├── Metaprogramming_Ruby学习笔记.rst ├── PyQt4的异步消息机制.rst ├── PyQt4的皮肤效果.rst ├── _GUI是如何实现的.rst ├── __pyqt_graphics_view.rst ├── __todo.rst ├── __人人都应该懂一点经济学.rst ├── __人人都要会的知识.rst ├── __先看后买.rst ├── __关于ER.rst ├── __如何做到特立独行.rst ├── __如何变富.rst ├── __宅男们开房的故事------snake-challenge活动总结.rst ├── __成就.rst ├── __活法.rst ├── __灰兔.rst ├── __生活教练.rst ├── _life_faq.rst ├── _live_is_short.rst ├── _pyramid初探.rst ├── _pyramid试用.rst ├── _qt是如何处理控件大小的.rst ├── _中文编程.rst ├── _为什么要把事情弄得那么复杂.rst ├── _为什么要用chrome作为浏览器.rst ├── _为什么要用google作为搜索引擎.rst ├── _为什么要翻墙.rst ├── _为什么要选择苹果电脑.rst ├── _人生苦短.rst ├── _介绍一些高端网站.rst ├── _你愿意成为什么样的人.rst ├── _如何专业地使用电脑.rst ├── _如何用mercurial做开发.rst ├── _如何防御zombie.rst ├── _开放哲学.rst ├── _我们需要的是学习.rst ├── _扯扯未来学.rst ├── _编程黑店.rst ├── _网上学习社区.rst ├── _资本家是否真的剥削员工.rst ├── about.rst ├── be_a_better_man.rst ├── build-res ├── base.html ├── disqus.html ├── rss.html ├── rss_item.html └── style.css ├── build.py ├── cython介绍.rst ├── docstring.rst ├── git学习总结.rst ├── gmail不能用了.rst ├── guard.rst ├── http_介绍.rst ├── ipython.rst ├── javascript_web_applications_读书笔记.rst ├── makefile ├── minecraft介绍.rst ├── mongodb访问权限设置.rst ├── move.rb ├── mysql简单的备份策略.rst ├── name_map.txt ├── pjax是什么以及为什么推荐大家用.rst ├── pyqt_animation_framework.rst ├── pyqt介绍.rst ├── pyqt多国语言.rst ├── pyqt编写的程序如何发布.rst ├── pysideqwt开源经验.rst ├── pyside介绍.rst ├── python-pype介绍.rst ├── python下使用epoll.rst ├── qml介绍.rst ├── qt编译加速以及使用预编译头.rst ├── qwt介绍与使用.rst ├── rails_deploy方法之采用passenger.rst ├── rails_ubuntu_安装.rst ├── rails介绍.rst ├── reStructuredText介绍.rst ├── readme.markdown ├── resque介绍和分析.rst ├── rspec.rst ├── rst2s5.rst ├── ruby_on_rails.rst ├── ruby_on_rails初探.rst ├── ruby初探.rst ├── sconstruct ├── scons介绍.rst ├── shpaml介绍.rst ├── shpaml源码分析.rst ├── spacechem介绍.rst ├── sphinx介绍.rst ├── sqlalchemy学习.rst ├── thinking.rst ├── unicorn配置.rst ├── utf8介绍.rst ├── windows下面设置VPN连接.rst ├── wordpress_nginx安装.rst ├── zeromq介绍.rst ├── 一天时间用python写门语言.rst ├── 三一学会.rst ├── 为什么qt是最适合你的.rst ├── 为什么成人学习会变得困难.rst ├── 为什么用ReST写博客.rst ├── 为什么要写博客.rst ├── 为什么要用纯文本.rst ├── 人人都应该掌握一门乐器.rst ├── 人民广场英语角参加小记.rst ├── 仪式.rst ├── 你不需要一天工作8小时.rst ├── 使用纯文本方式写文档.rst ├── 像对待金钱一样对待时间.rst ├── 兔子流.rst ├── 公主与骑士.rst ├── 关于GFW的资料整理.rst ├── 关于理性的设计.rst ├── 关于理解.rst ├── 创业者需要的特质.rst ├── 南京游记.rst ├── 可以这样做吗.rst ├── 回的四种写法.rst ├── 夏日重乐季现场.rst ├── 如何使用预编译头以及预编译头的原理.rst ├── 如何学习python.rst ├── 如何学习计算机科学.rst ├── 如何度过每天的24小时.rst ├── 如何把rss当作邮件来阅读.rst ├── 如何改变一个人.rst ├── 如果我还有一个星期可以活.rst ├── 宅男们开房的故事_snake_challenge活动总结.rst ├── 安利模式做教育.rst ├── 实现计算器.rst ├── 尝试搭讪.rst ├── 开发经验.rst ├── 思考.rst ├── 我们来捐款吧.rst ├── 我到人民广场相亲角相亲.rst ├── 我玩的游戏.rst ├── 我的emacs配置.rst ├── 我的技术储备.rst ├── 所谓的你情我愿.rst ├── 手机分配短讯id的面试题目.rst ├── 改变性格.rst ├── 放下的智慧.rst ├── 方舟子打韩寒事件我见.rst ├── 无题.rst ├── 旧_TDD_测试驱动开发.rst ├── 旧_unix的哲學.rst ├── 旧_为什么不要使用linux.rst ├── 旧_为什么不要帮助穷人.rst ├── 旧_为什么共产社会有等级划分.rst ├── 旧_为什么我不能放弃Windows.rst ├── 旧_为什么我们要用命令行工具.rst ├── 旧_为什么我要用linux.rst ├── 旧_为什么政府没有效率.rst ├── 旧_为什么要问为什么.rst ├── 旧_博客又开张了.rst ├── 旧_如何在windows下面发布程序.rst ├── 旧_如何学习API.rst ├── 旧_如何学好英语.rst ├── 旧_如何设计.rst ├── 旧_從信息的角度來看待軟件開發.rst ├── 旧_毒品交易.rst ├── 旧_生命.rst ├── 旧_生存的幻觉.rst ├── 旧_生活需要时不时的burst一下.rst ├── 旧_用sphinx写文档.rst ├── 旧_福利社会为什么要不得.rst ├── 旧_程序化语言.rst ├── 旧_自我反省.rst ├── 旧_计划没有按照预定来_怎么办.rst ├── 旧_计划生育不好.rst ├── 旧_軟件工程師的信仰.rst ├── 旧_音乐为什么能够感染人.rst ├── 爱抄才会赢.rst ├── 用python画地形图.rst ├── 用shiboken做python绑定.rst ├── 电脑是如何实现图形显示的.rst ├── 真人蒸汽朋克.rst ├── 程序员在工地.rst ├── 程序如何作在线更新.rst ├── 简单python_宣告式编程.rst ├── 箴言.rst ├── 计算机领域学习路线图.rst ├── 训练专题1_如何开始训练.rst ├── 采用libusb库让PC与USB通讯.rst ├── 黑客与画家.rst └── 黑客马拉松活动小记.rst /.gitignore: -------------------------------------------------------------------------------- 1 | *~ -------------------------------------------------------------------------------- /.hgignore: -------------------------------------------------------------------------------- 1 | syntax: glob 2 | 3 | *.orig 4 | *.pyc 5 | *_ui.py 6 | *~ 7 | .sconsign.dblite 8 | 9 | syntax: regexp 10 | ^temp/ 11 | -------------------------------------------------------------------------------- /2011年度总结.rst: -------------------------------------------------------------------------------- 1 | 有好几个朋友都写了年度总结, 我想如果没有反思的话就没有成长, 也写写年度总结吧. 2 | 3 | 分几个方面, 工作上, 生活上, 情感上什么的. 4 | 5 | 工作上 6 | ----------------------------- 7 | 8 | 我这一年大部分的时间都在 `新漫传感 `_ 这家公司工作. 今年11月底正式离职. 总共2年的时间. 9 | 我当时去到新漫的时候, 也是家里人朋友的介绍, 我也就去了. 总体上面来, 这份工作的自由度非常大, 任务其实也很明确. 闲暇时间非常多. 10 | 但是对于我来说是一个败笔. 在这家公司, 我做的事情没有什么可以说的(只是一份工, 不能让人对我做的事情眼前一亮, 更不能改变世界), 11 | 而公司也不能给我职业发展上面的支持, 而平时很多空闲时间, 我也没有充分利用起来. 在这里的2年是失败的. 12 | 不过我现在离职了, 算是止损了吧. 13 | 14 | 然后从今年的4月份左右, 我算是一直从事 gurudigger.com 的兼职工作, 从网站的重构到rails开始, 一直做到现在, 11月底正式加入进来. 15 | 虽然我一直从事编程工作, 但是现在才算是正式进入互联网圈了. 16 | 17 | 生活 18 | ----------------------------- 19 | 20 | 2011年我的生活品质比以往高了一些. 至少生活中除了电脑, 网络, 游戏, 还多了很多东西. 21 | 22 | `今年决定开始练习钢琴 `_, 23 | 花了钱上了10节课, 本来期望能够每天半个小时的练习时间, 现在慢慢地落下来了. 这个与我期望不符. 我还是决定1/1开始, 每天半小时的练习时间. 然后能练多久就多久. 24 | 25 | 锻炼身体的项目一直在草拟当中, 夏天的时候还是游过一段时间的泳, 不过现在没有坚持, 一个是锻炼身体比较枯燥, 一个就是感觉比较浪费时间. 26 | 枯燥好解决(比如从跑步换做有氧健身操), 感觉浪费时间是我观念上面的问题, 解决起来就比较麻烦了. 但是这件事情一定要开始做起来. 时间也应该是一辈子. 27 | 28 | 线下组织python定期聚会活动. 我原先是希望大家做技术的人士能够出来多聚聚. 忘记什么时候我开始号召大家出来聚会了, 29 | 我属于想清楚要做什么事情, 而这个事情需要的条件只是决定去做, 那么我就能够开始做的人. 不过后续事宜就是我的短板. 30 | python聚会算是坚持了一段时间, 不过到了后期, 因为没有考虑好如何做好运营, 31 | 不能给参与者带来价值, 一次比一次人少, 一次比一次差劲, 到最后还是只有部分骨干留下来了. 32 | 明年我觉得还是先停一段时间, 办得不好, 还不如不办. 33 | 34 | 外出旅游的话, 就 `南京 `_ 有点可以说的地方. 我没有从旅游中获得太多的乐趣. 35 | 虽然因为我没有去过很多地方感到有点遗憾, 但是因为对我自己的改变不是很大, 以后旅游也不会成为我的一个高优先级项目. 当然, 还是可以作为丰富生活品质的项目. 36 | 37 | 技术领域 38 | ----------------------------- 39 | 40 | 这一年, 算起来能够是成长的, 就是我能够用起来了rails, 以及开始做起来了前端开发. 41 | 其他方面, linux底层, 算法, tcp/ip基础, 这些都是计划要弄懂的, 结果由于我欠缺计划和执行能力而没有涨经验值, 是非常值得检讨的. 42 | 从历史上来看, 这方面我一直都欠缺, 因此浪费了大量的时间(9年), 我要在2012年好好改变这样的状况, 不然我的人生会变得非常悲惨. 43 | 44 | 我一直在考虑以后未来自己往什么方向发展, 嵌入式, 手机, 服务器后端应用, 前端. 45 | 我发现自己的兴趣点还是在作出能够给终端用户使用的产品上面, 应用性能調优, 算法架构这2个我还是比较无爱的, 46 | 未来我计划在保住后端技术基础的前提下, 发展前端, 掌握设计能力. 47 | 48 | 私生活 49 | ----------------------------- 50 | 51 | 2011年初, 在老家的时候, 父母给我介绍了一个相亲对象. 因为我这个时候对于选择对象没有多少思路, 就抱着先交往一段时间, 深入发掘优秀点的方式谈了一段时间. 52 | 然后回到上海, 继续谈了一个月, 发现实在没有感觉, 就主动说明情况结束这样的关系. 之后好像也相亲过几次, 但是都没有进一步的发展. 53 | 然后我有尝试过其他方式的搭讪, 效果都不是很好. 然后就是朋友圈之类的方式来进行. 因为我在社交方面没有什么经验和心得, 结果也不如意. 54 | 55 | 我个人对于这方面的理论理解模型是这样的: 资源总体上是有限的(谈得起的年龄段访问是固定的), 随着时间过去, 资源总数会减少(成交了), 然后剩下来的是非合适资源(要求高过可提供的价值). 56 | 当然还有一种, 就是我个人价值增值的速度比较高, 在未来能够有更多的option, 这个我现在不太期待, 并且这方面领域经验的缺陷可能对我人生发展有阻碍.... 说得有点多了. 57 | 58 | 总体上IT男社交经验积累很慢, 对于我来说, 程序员气场很明显, 我希望能够改善这种现象, 不要让"程序员老婆都是别人挑剩下的"这样的事情发生在我身上. 59 | 60 | 现在得到一本教学书, 好好学习和练习. 合适的伴侣可遇不可求, 我不能改变概率, 但是可以增加量. 2012年要经常锻炼对应的能力, 以及投入时间, 创造更多的机会. 61 | 62 | 结论 63 | ---------------------------- 64 | 总体上面, 我的2011年浪费了不少时间(好吧, 总是会有时间浪费的), 方向也不是很明确, 不过还是渐渐清晰起来了: 65 | 66 | 我的目标是能够设计出好的产品. 改变世界. 感兴趣的领域是能够改变最终用户的生活方式, 更感兴趣的是改变人们的学习方式(很想把理想中的大学做到网络上面, 不过没有经验没有思路). 67 | 68 | 完成这样目标需要非常多的修行, 一步步改变吧. 69 | 70 | -------------------------------------------------------------------------------- /CortexCommand介绍.rst: -------------------------------------------------------------------------------- 1 | 介绍 2 | ============== 3 | 4 | Cortex Command是一个2D的平面射击,基地建设等概念的独立游戏, 5 | `官方网站 `_ 上面有介绍和下载. 6 | 7 | 我现在已经花了至少一周的时间,在玩这个游戏上面,而这个游戏甚至还没有完成! 8 | 9 | 一些游戏中的画面: 10 | 11 | .. image:: http://www.datarealms.com/public/a/rocketboom.gif 12 | .. image:: http://www.datarealms.com/public/a/sneakup.gif 13 | 14 | 为什么这个游戏很好玩? 15 | =============================== 16 | 17 | 最主要的有几点: 18 | 19 | * 激烈的热武器战斗。 20 | * 基地建设。 21 | * 非常丰富的MOD(非官方出的扩展模块) 22 | * 自由定制。游戏除了可执行文件文件以外,所有的资源和游戏脚本,都可以自己编辑。 23 | 24 | 恩,其实网络上面有非常多的 `视频 `_ 可以看到这个游戏的效果, 非常劲爆. 25 | 26 | 如何获取游戏? 27 | ============== 28 | 29 | 在官方网站上面有免费版下载,地址在 `这里 `_. 30 | 31 | 如果你不在乎版权问题的话,你可以在幻想游戏网站上面下载 `破解版 `_. 32 | 33 | 如果你觉得官方版本太简陋的话, 你可以下载许多的模组, 包括辐射,战锤,毁灭公爵,以及各种各样奇奇怪怪的东西. 当然还有非常多的地图可以下载. 这些都可以在 `官方论坛 `_ 里面找到. 34 | -------------------------------------------------------------------------------- /C语言如何实现RAII.rst: -------------------------------------------------------------------------------- 1 | 资源的获取与释放,C语言里面是要让程序员考虑的,比如 :: 2 | 3 | void work(){ 4 | Buffer b; 5 | init(b); 6 | do_sth(b); 7 | del(&b); 8 | }; 9 | 10 | 在C++里面,有raii这样很方便的特性,当离开作用域的时候,自动释放资源,如 :: 11 | 12 | void work(){ 13 | Buffer b; 14 | do_sth(b); 15 | }; 16 | 17 | 我在想,如何让C支持这样的特性?于是就有了下面这个宏 :: 18 | 19 | #define using(b) \ 20 | for(int i=0; i<2; i++){\ 21 | if (i==0) \ 22 | { init(b); } \ 23 | else \ 24 | { if (i==1) \ 25 | { del(b); \ 26 | break; \ 27 | }; \ 28 | }; 29 | void work() { 30 | Buffer b; 31 | using(&b) 32 | printf("working..\n"); 33 | }; 34 | }; 35 | 36 | edit: 被批了,C就按照C的方式干活,RAII交给C++. 37 | -------------------------------------------------------------------------------- /DwarfFortress介绍.rst: -------------------------------------------------------------------------------- 1 | 什么是dwarf fortress? 2 | =============================== 3 | 4 | 一个建设矮人部落的游戏. 随机生成世界地图, 历史, 超级复杂的建设… 5 | 6 | http://www.bay12games.com/dwarves/screens.html 7 | 8 | 有人甚至用部落和矮人实现出了一个 `计算机 `_ (有种3体里面那个人计算机的感觉) 9 | 10 | 免费的. 有linux版本可以下. 11 | 12 | 一个漂亮的 `显示工具 `_: 13 | 14 | .. image:: http://i.imgur.com/WT0jH.png 15 | .. image:: http://i481.photobucket.com/albums/rr172/nil2008/screenshot1.jpg 16 | 17 | 这个工具可以在linux下面用cmake编译,但是我没有编译成功, 摸索中. 18 | 19 | 有一些其他的类似的游戏, 整理在这里: 20 | 21 | http://www.townsgame.com/ 22 | 23 | http://www.goblincamp.com/ 24 | 25 | http://www.paradoxplaza.com/games/a-game-of-dwarves 26 | 27 | http://gnomoria.com/?page_id=15 28 | -------------------------------------------------------------------------------- /Metaprogramming_Ruby学习笔记.rst: -------------------------------------------------------------------------------- 1 | 虽然我现在一直在用ruby做rails开发, 但是ruby基本上是属于拿起来用的那种, 很多东西都不是很熟悉. 2 | 3 | 现在发现有一本Metaprogramming Ruby的书, 就看起来了. 这里整理一下学习笔记, 省得学了白学. 下面其实只是一些tips, 只是给我自己看看的. 所以大家就不要抱有什么期待了. 4 | 5 | 星期一 6 | -------------------------------- 7 | 8 | Ruby是全运行态, 没有编译态(对于程序员而言). 9 | 10 | Class本身也能运行时创建. 11 | 12 | Ruby里面的Class继承自Module, 多了一些实例化, 继承的东西. 13 | 14 | 所有Class的class是Class, Class继承Module继承Object继承BasicObject. 15 | 16 | method的查找方式, 先看object, 然后查Class树, 中间会穿插class include的Module. 17 | 18 | 所有位置都隐含一个self, 调用方法就是把调用者当作self, irb默认self是main. 19 | 20 | private的method只能被隐含self的方式调用, self.private_method是不能调用的. 21 | 22 | 星期二 23 | ------------------------------------ 24 | 25 | obj.send(:my_method, 3) 用来做动态方法调用. 26 | 27 | define_method用来动态定义方法. 28 | 29 | method_missing用来处理找不到方法的时候的状况. 30 | 31 | 还有undef_method, 这些方法可以用来做很多有意思的事情了. 32 | 33 | 星期三 34 | ------------------------------------- 35 | 36 | 回顾了block和using. 37 | 38 | scope在class, model, def这3个阶层. 可以用Class.new, Module.new, Module@define_method动态生成. 39 | 40 | 有了instance_eval可以切换到object的scope里面去. 41 | 42 | Proc, lambda可以保存block, &用来转换Proc和block. 43 | 44 | Proc里面return是从定义Proc的scope里面return, 这个太恶心了吧? 还有不严格判断参数. 还是用lambda比较好. 45 | 46 | 星期四 47 | ------------------------------------- 48 | 49 | class 也是 module, 在它们的作用域里面执行代码, 用module_eval. 50 | 51 | 我有点明白为什么不用缩进来限制作用域了, 缩进没有明确限制作用域来得灵活. 52 | 53 | def并不会开启一个新的scope, 还是在class的scope里面. 54 | 55 | 在class里面用"@"定义instance variable, 用"@@"定义Class instance variable(真绕). 因为@@定义在类树里面, 容易产生bug, 不建议使用. 56 | 57 | class method其实是singleton methods, 有趣. 58 | 59 | 每个object还有eigenclass. 用class << obj; self end; 这样的方式访问. 60 | 61 | 加上eigenclass, ruby的类树就比较复杂了, 不过看图就好理解一些. 62 | 63 | alias和alias_method创建别名. 64 | 65 | 66 | 星期五 67 | ------------------------------------- 68 | 69 | binding用来缓存作用域, 给eval用. TOPLEVEL_BINDING是最上层的binding. 70 | 71 | class里面有无数事件的hook, 比如inherited, included, method_added. 72 | 73 | 最后一部分activerecord用到的魔法, 我就稍微带过了, 因为具体的方法我兴趣不是很大. 74 | 75 | 结论 76 | ------------------------------------- 77 | 78 | 上面只是给我自己总结的一些tip, 一些我已经知道的东西, 但是对其他人非常重要的地方没有写出来. 所以需要理解的话大家还是看书吧. 79 | -------------------------------------------------------------------------------- /PyQt4的皮肤效果.rst: -------------------------------------------------------------------------------- 1 | PyQt4提供了非常好的皮肤机制,可以作出非常炫的效果。其中一个功能就是qss,利用类似css的方式来配置界面。 2 | 文档在这里。 3 | 使用方法(顺便分享一下我的qss配置): 4 | 5 | .. code-block:: css 6 | 7 | /*背景贴图*/ 8 | QWidget{ background-image: url(res/tex.png) } 9 | QAbstractScrollArea,QPushButton { background-image: None} 10 | 11 | /*背景色*/ 12 | QWidget{ background-color: bgdColor } 13 | QPushButton,QSplashScreen{background-color: None} 14 | 15 | /*menu*/ 16 | QMenuBar { 17 | background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, 18 | stop:0 lightgray, stop:1 darkgray); 19 | } 20 | QMenu { 21 | margin: 2px; /* some spacing around the menu */ 22 | } 23 | QMenu::item:selected { 24 | border-color: borderColor; 25 | background: rgba(100, 100, 100, 150); 26 | } 27 | 28 | /*按钮*/ 29 | QPushButton{ 30 | border: 3px outset borderColor; 31 | background-color: bgdColor; 32 | padding: 5px; 33 | border-radius: 5px; 34 | } 35 | QPushButton:checked {border-color: red} 36 | /*醒目按下的按钮*/ 37 | QPushButton:pressed {border-color: green} 38 | 39 | /*QSlider*/ 40 | QSlider::groove { background: gray; } 41 | QSlider::groove:horizontal { height: 6px;} 42 | QSlider::groove:vertical { width: 6px;} 43 | QSlider::handle { 44 | border: 1px solid borderColor; 45 | border-radius: 3px; 46 | background: bgdColor; 47 | } 48 | QSlider::handle:horizontal { width: 18px; margin: -3px 0 ; } 49 | QSlider::handle:vertical { height: 18px; margin: 0 -3px ; } 50 | QSlider::add-page { background: gray; } 51 | QSlider::sub-page { background: green;} 52 | 53 | /*QTableView*/ 54 | QTableView { 55 | alternate-background-color: darkContentColor; 56 | background-color: contentColor; 57 | } 58 | 59 | 上面作为字符串放在DEFAULT_STYLE里面, 然后具体的颜色在下面的python代码中设置: 60 | 61 | .. code-block:: python 62 | 63 | #设置style里面的颜色 64 | COLOR_MAP = { 65 | 'borderColor':'gray', 66 | 'bgdColor':'#FCF6E4', 67 | 'contentColor':'#E1EDFB', 68 | 'darkContentColor':'#CDE2F8', 69 | } 70 | for k,v in COLOR_MAP.iteritems(): 71 | DEFAULT_STYLE = DEFAULT_STYLE.replace(k, v) 72 | 73 | app = QApplication([]) 74 | app.setStyleSheet(DEFAULT_STYLE) 75 | 76 | 77 | 显示的效果如下: 78 | 79 | .. image:: http://lh5.ggpht.com/_os_zrveP8Ns/TMq9KU_BbTI/AAAAAAAADKw/IUfIQ7_oFjc/s800/screenshot-mainwindow.png 80 | :align: center 81 | -------------------------------------------------------------------------------- /_GUI是如何实现的.rst: -------------------------------------------------------------------------------- 1 | 一直以来, 我对GUI是如何实现的很感兴趣, 我们平时电脑上面显示的那些漂亮的窗口界面, 2 | 是如何通过程序, 一步步转化成硬件上的操作? 在这里, 我从最上层的Qt图形库开始, 3 | 再到linux下面的X, 到内核, 最后到显卡来一个整体的介绍. 4 | 鉴于本人水平很差, 也没有多少的实践经验, 文章既不会详细, 也会出现很多错误, 如果你发现了问题, 请联系我. 5 | 6 | 整体架构 7 | ----------------------- 8 | 对于用户来说, GUI就是一堆窗口, 但是在下层, 做了非常多复杂的操作, 这些操作是分成很多层来实现的. 9 | 不同操作系统的实现方式不同, 我们现在只看采用KDE(Qt图形库)做为图形界面的linux系统. 10 | 这里面整理了一下 :: 11 | 12 | Qt图形库 13 | --- X协议 --- 14 | X server 15 | --- 系统调用 --- 16 | linux内核 17 | --- IO操作 --- 18 | 显卡 19 | 20 | 整体分为上面几个层次: 21 | 22 | - 最上层是Qt图形库, 应用程序采用Qt图形库开发, 描述窗口, 控件, 以及响应事件的方式. 23 | - Qt图形库通过X协议, 与进程X server通讯, 然后X server进行生成窗口, 绘制控件的工作. 24 | - X server通过系统调用, 绘制屏幕, 获取用户键盘鼠标和响应, 包装成事件, 通知X client(就是应用程序). 25 | - linux内核响应系统调用, 把数据发送给显卡. 26 | 27 | 那么每层具体是如何实现的呢? 我们来看一个实际的例子. 一个简单的hello world程序. 28 | 29 | Qt 30 | ----------------------- 31 | Qt是一个图形库, 它让开发者很容易地开发出图形界面的应用. 我们现在写一个很简单的程序: recorder. 32 | 33 | 代码可以在这里下载到. 分成下面几个部分 :: 34 | 35 | main.cpp 36 | recorder.hpp 37 | recorder.cpp 38 | 39 | 我们先看懂代码是怎么样的. 40 | 那么Qt图形库在后面做了什么操作呢? 41 | 我们首先得知道Qt下层调用了什么, 必须先介绍一下X协议. 42 | 43 | X协议介绍 44 | 通讯方式 45 | 命令 46 | Qt如何把操作映射到X协议上面? 47 | 消息机制 48 | QApplication后面干了什么? 49 | Qt是如何把上面的类层次转化到X协议上面的绘制操作的. 50 | 51 | Xlib 52 | ---------------- 53 | Xlib到底在下面实现了什么? 做了什么工作能够提供X协议的服务? 54 | 绘制窗口 55 | 控制窗口的移动 56 | 把输入设备映射成事件等等. 57 | 58 | linux内核 59 | ---------------- 60 | 如何实现系统调用, 鼠标键盘如何转化成xxx, 写显示操作 61 | 62 | 显卡 63 | ---------------- 64 | 显卡的通讯方式, 如何生成输出给显示器的信号 65 | 66 | 引用材料 67 | .. _`Qt paint system`: http://www.linuxgraphics.cn/qt/paint_system.html 68 | -------------------------------------------------------------------------------- /__pyqt_graphics_view.rst: -------------------------------------------------------------------------------- 1 | graphics view framework 2 | ---------------------------- 3 | -------------------------------------------------------------------------------- /__todo.rst: -------------------------------------------------------------------------------- 1 | 如何发财 2 | 如何成为靠谱的人 3 | 成长之路 4 | 如何面对死亡 5 | 如何面对人生 6 | 如何过一个有意义的人生 7 | 程序员趋炎附势之道 8 | 程序员如何发财 9 | 程序员如何找女朋友 10 | 程序员如何提高沟通能力 11 | 12 | 我玩的游戏列表 13 | 14 | 我关注的事项列表 15 | 16 | GAE介绍 17 | 18 | -------------------------------------------------------------------------------- /__人人都应该懂一点经济学.rst: -------------------------------------------------------------------------------- 1 | 什么是经济学 2 | ----------------------------- 3 | 研究现象的学科 4 | 5 | 为什么人人都需要学经济学 6 | ----------------------------- 7 | 这样才能认清楚很多社会现象, 8 | 9 | 不学经济学会犯什么错误 10 | ----------------------------- 11 | 认同最低工资, 工会, 社会保障, 福利社会, 12 | 认为资本家剥削 13 | 14 | 如何去学习经济学 15 | ----------------------------- 16 | 曼昆的<经济学原理>, 张五常<经济解释> 17 | 18 | -------------------------------------------------------------------------------- /__人人都要会的知识.rst: -------------------------------------------------------------------------------- 1 | 这里整理出一些自己发现对于每个人都有用的知识和能力, 以及一些不是必须, 但是能够给人生加分的: 2 | 3 | * 经济学 4 | 能够让人了解世界是如何运作的. 5 | * 编程 6 | 开拓出了一个新的世界 7 | 8 | -------------------------------------------------------------------------------- /__先看后买.rst: -------------------------------------------------------------------------------- 1 | 现在有看书习惯的人越来越少了, 即使看书, 大多数的阅读内容都是"无足轻重"的小说, 杂志, 快餐读物, "干货"可以说少到忽略不计. 2 | 3 | 但是我们这个时代也是资讯及其容易获取的时代, 你可以在网上找到几乎所有的书籍, 特别是在中国, 几乎可以免费获得所有的书籍. 4 | 5 | 因此, 对于有心阅读的人士, 需要好好做挑选, 以及做好阅读计划. 6 | 7 | 读书策略 8 | -------------------------- 9 | 每个人读书的偏好都有不同, 多少是为了娱乐? 多少是为了学习? 多少是为了提升品味? 英文里面叫"preferences". 10 | 11 | 选书策略 12 | -------------------------- 13 | 看书是一次大的投资, 主要的成本在于时间, 价格只是非常小的影响因素. 我的策略是: 14 | 15 | * 对于学习用书, 只看英文经典书. 稍微次一点的就放过. 16 | 17 | 18 | 看书策略 19 | -------------------------- 20 | 21 | 选择市场 22 | 在产品上投资 23 | 执行 24 | 推销 25 | 保持领先 26 | 27 | -------------------------------------------------------------------------------- /__关于ER.rst: -------------------------------------------------------------------------------- 1 | 最近抽了点时间看了那个著名的ER论文, 总结一些要点 : 2 | 3 | ER关注如何建立机器无关的数据表示方式. 4 | ER里面的R一般来说, 指代的是我们平时使用sql的表格, 而不是表格之间的关系 5 | 6 | 为了能够让表示方式机器无关, 需要normalize树状的数据表达方式. 7 | 8 | 数据应该和: 顺序, 索引, 访问路径无关 9 | 10 | 我犯了一个错误: 保存数据的时候不应该把系统生成的ID当做primary key, 这样会造成依赖实现的现象, 导数据的时候会出错. 11 | 12 | 访问路径: 树状/网状图的查询作业会造成访问路径相关. 13 | -------------------------------------------------------------------------------- /__如何做到特立独行.rst: -------------------------------------------------------------------------------- 1 | 原因 2 | ------------------ 3 | 4 | 整个世界信息化了,一个人面对的竞争对手,是历史上最多的. 5 | 6 | 在这一的世界里,要么出头,要么成为群众中的一个,不被看重. 7 | 8 | 本文讨论一些如何做到特立独行的方法. 9 | 10 | 方法论 11 | ------------------ 12 | 13 | 整个理论的基础,建立在2条,一个是 14 | 15 | 有几个战略可以采用: 16 | 17 | * 与他人区别开来,比如用特殊的标识把自己显示出来. 18 | * 19 | 20 | 实践 21 | ------------------ 22 | 23 | 结论 24 | ------------------ 25 | -------------------------------------------------------------------------------- /__如何变富.rst: -------------------------------------------------------------------------------- 1 | 你不太可能变成富人, 但是你也不需要成为富人, 你只需要让生活变得更幸福. 2 | 为了达到这点, 暴富不是必须的, 甚至也不是充分的, 重要的是实现财务自由, 不让金钱带给你压力. 3 | 一个重要的原则: 量入为出. 有些东西是必须的花费, 但是大多数不是, 可以根据收入适量裁剪, 但是也不能太省, 以至于过度影响生活品质. 4 | 5 | 这里有一个列表, 哪些是必须的, 哪些是根据收入动态调整的: 6 | 7 | 必须: 健康的伙食, 安静的住所, 干净的服装, 适当的社会交际, 健康, 希望 8 | 9 | 可调整: 美食, 房子的位置和大小, 名牌服装, 美女俊男, 满足其他非必须的欲望. 10 | -------------------------------------------------------------------------------- /__宅男们开房的故事------snake-challenge活动总结.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://snakechallenge.org/images/logo.png 2 | :align: center 3 | 4 | 最近比较忙, 直到现在才写好文章.. 不过借用开源界的一句话: latter better than never.. 5 | 6 | 程序员配对? 7 | -------------------------- 8 | 9 | 很早以前, 我就有过一个想法: `程序员配对 `_. 10 | 11 | 现在程序员们还是身据不同公司中, 做着个人的项目, 很少有机会能够出来, 和一些其他的程序员实际交流. 12 | 13 | 虽然有各种活动, 但是真正真刀真枪干起来的很少. 但是感谢 http://www.gurudigger.com 蔡金同学的组织, 一次这样的活动举办了. 来自全国各地12名程序员, 集会上海, 针对snake-challenge项目来进行一次开发. 14 | 15 | 经过 16 | ------------------------ 17 | thomas同学已经有一个详细的过程记录了, 可以看这里: http://ghostunix.org/blog/?p=441 18 | 19 | 一些感受 20 | ------------------------ 21 | 这个活动总体上感觉还是很好的, 以前很少见的同类, 一下子出现了那么多, git/emacs/vi/github都变成普遍状况了. 宛然一个小硅谷.. 22 | 23 | 2天时间的coding其实是很短的, 12位以前没有合作过, 甚至没有见过面的程序员, 能够产生出来一个东西已经很不错了. 在此期间, 因为沟通问题, 也出现了很多的问题, git的合并也消耗掉了很多脑细胞.. 不过还好, 大家还是分割成小组来做事情的, 每个人几乎都做单独的一个部分, 遇到了问题, 但是不严重. 24 | 25 | 项目本身, 用到了无数的东西, zeromq+python+pygame+rails!!+redis+node.js+CoffeeScript+websocket... 如果你知道上面这些东西的话, 估计你会很吃惊, 竟然一个项目里面能够用到这么多的玩意. 一个真正的网站项目也不一定用到这么多东西了. 在项目的开始阶段, 有几位同学迟迟没有安装好环境, 卡在了zeromq或rails上面.. 尤其是其中的一位同学, 因为痛苦的安装经历, 对rails产生了坏的观感, 我感到十分的可惜. 26 | 27 | 28 | 结论 29 | ------------------------ 30 | 2天的开发+展示, 时间上还是比较紧, 大家大都是很靠谱的人, 一上来就进入了状态, 头脑风暴和coding. 然后时间到了一下就结束了. 很多东西还需要完善和收尾. 我还是希望参与者能够继续把自己开发的部分完善起来----主要是我一个人在接下来的时间里要把这些东西整合起来还是挺累了哇... 31 | 32 | 33 | -------------------------------------------------------------------------------- /__成就.rst: -------------------------------------------------------------------------------- 1 | 这里面列出我觉得有必要做的事情, 以及它们的进度. 2 | 3 | ======== ========================================== 4 | 进度% 项目 5 | ======== ========================================== 6 | 1 LFS 7 | ? 写一个有人用的开源软件 8 | 100 写自己的博客 9 | 100 架设一个网站 10 | ? 做一个有人用的网站 11 | 12 | 100 coding till forget eating 13 | 14 | 100 写程序写得忘记吃饭? 15 | 0 写程序写得忘记睡觉? 16 | 17 | ? 蹦级 18 | ? intercourse 19 | ? intercourse with a male? 20 | ======== ========================================== 21 | -------------------------------------------------------------------------------- /__活法.rst: -------------------------------------------------------------------------------- 1 | 我不知道每个人是如何看待人生的. 是为了做出成就, 还是什么? 2 | 我们很少有人能够思考人生的目标, 更少有人去尝试多样化的活法, 3 | 因循守旧, 可以看出一个人未来的走向. 4 | 但是我们是否考虑过其他的活着的方式, 而不是走一个在我们看来, 有建设性的人生? 5 | 6 | 原本我们期望, 能够找份工作赚钱, 养家糊口, 买自己喜欢的东西, 做自己喜欢的事情. 比如旅游什么的. 7 | 8 | 但是其他还有一类人, 不走这样的路子, 问出一些问题: 9 | 10 | - 为什么要努力工作? 工作只是为了保障生存, 拿到钱就可以了, 丢掉工作, 去做自己想做的事情. 11 | - 为什么要给世界带来价值? 我只要自己开心就好了, 这个世界没有给我好处, 只是带来痛苦. 12 | 13 | -------------------------------------------------------------------------------- /__灰兔.rst: -------------------------------------------------------------------------------- 1 | 世界转变 2 | ============== 3 | 4 | 剧情 5 | ============== 6 | 主角是一个软件工程师,参与了幻想引擎的项目,幻想引擎成功了,给世界带来了魔法. 7 | 主角许愿得到一个万能编程器,可是却被迷之幕后黑手变成了兔子,夺走了万能编程器. 8 | 后来主角被包子铺老板救活了,适应了兔子的身份,开始去找回自己的万能编程器. 9 | 10 | 女主: 11 | 12 | 13 | 主线:找编程器,报仇. 14 | 副线:女主 15 | 16 | 包子铺 17 | ============== 18 | 19 | "卖包子勒,新鲜的包子勒!" 20 | 21 | 城市的一个肮脏的角落——不应该说是角落,因为在那件事情发生后,整个城市都缺少了维护,变得脏兮兮起来。 22 | 周围的楼房都是居民区,底层原先是一个包子铺的店面,现在——还是包子铺,不过被铁皮层层包裹起来. 23 | 一大早包子铺就开张了,很多人不知道从居民区哪里冒出来,排队买起包子来. 24 | 25 | "什么,你没有钱?"包子铺的老板说,"那就抽签吧." 26 | 27 | 一个中年男子犹豫了片刻,点了点头. 28 | 29 | 他从一个筷子筒里面拿出了一只筷子:上面绑了红线. 30 | 31 | "啊!"中年男子赶紧往铺子外面跑去,结果一头撞在一个包子铺伙计的身上,跌倒在地. 32 | 33 | "既然抽签,那就有当包子馅的觉悟."伙计吧中年男子拉到铺子里面,排队的人都无动于衷. 34 | 35 | "包子馅越来越多了呢."老板说."这样下去保鲜成问题呢." 36 | 37 | "要不要卖给东面的那个加油站?"伙计说. 38 | 39 | "这些包子馅都是筋肉和骨头,估计榨不了多少油,还得送过去,路上不太安稳啊." 40 | 41 | "老板,我认识一个运货人,要价不是很高,可以试试看吗?"伙计说. 42 | 43 | "你还认识运货人?是谁?" 44 | 45 | "我自己." 46 | 47 | "哈哈!"老板笑倒在地,"你这小样还运货?包子馅都剁不好." 48 | 49 | "老板,让我试试吧." 50 | 51 | 老板严肃起来."你自己送命不要紧,包子馅丢了可是我的损失." 52 | 53 | "那我出保证金.这是我三个月的工资."伙计从口袋里面拿出了一包啤酒瓶瓶盖. 54 | 55 | "你是不是不想在这里干了?"老板说. 56 | 57 | "我以前就说了,当运货人适合我.这段时间麻烦老板了". 58 | 59 | "好吧,既然你想去送死,那我也不拦着.这钱我收下了,只是怕你死掉,便宜了匪徒."老板说. 60 | 61 | "那我现在就动身." 62 | 63 | "别想偷懒,先把今天的包子馅做好!" 64 | 65 | 66 | 匪徒 67 | ============== 68 | 69 | "把钱和货交出来,可以免你不死." 70 | 71 | 伙计被几个人包围了起来. 72 | 73 | "你们现在离开,可以留几条命." 74 | 75 | 匪徒们笑了起来."就你这只兔子?" 76 | 77 | 伙计把货物放下,跳了起来,在空中弹了一下,一脚把一个匪徒踢开,匪徒一下子被嵌在墙里面,眼珠子飞了出来. 78 | 79 | "大家上!"匪徒们没有想到伙计那么强,挥舞起长矛. 80 | 81 | 伙计又跳了几次,把匪徒们一个个镶嵌在墙里面. 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /__生活教练.rst: -------------------------------------------------------------------------------- 1 | 生活教练应用 2 | ================= 3 | 4 | 目标: 帮助人们组织自己的生活, 不再为计划而劳心劳力, 专心去做事情. 5 | 6 | 思路 7 | ----------------- 8 | 9 | 通过以下步骤来保证做应该做的事情. 10 | 11 | * 计划. 帮助制定人生计划, 并根据你的人生计划来安排时间和项目. 12 | * 实施. 帮助你实施上面提出的计划, 尽可能地保证计划得到贯彻. 13 | * 跟踪. 根据实施的结果, 给出报告, 提出改进方案. 14 | 15 | 核心方式: 在用户的使用过程中, 根据采集到的数据, 给用户指导. 实例: 16 | 17 | * 用户没有明确计划, 不能实施, 计划时间有问题, 不能实施. 18 | * 用户没有在做计划的事情, 不断给出提示. 19 | * "上轨"工作, 首先让用户保证诚实, 然后在此基础上, 一步步改变用户习惯. 20 | * 跟踪. 当项目失败的时候, 给出意见, 强制用户改变计划的方式, 真正达到完成计划. 21 | 22 | user story 23 | ----------------- 24 | 25 | 小王听说了生活教练, 于是登陆到网站上面, 下载了对应的工具. 26 | 27 | 生活教练提供一些小工具, 比如记录待办事项, 记录时间等. 28 | 每到一定时间, 工具都会弹出一个对话框, 让小王记录当前正在做的事情. 29 | 如果小王不记录, 电脑就会被锁住, 为了能够管控自己, 小王只好忍受这样的不便. 30 | 31 | 到了周末, 小王发现, 自己很多时间都没有按照自己预想的事情完成, 32 | 生活教练提示: 是不是在做事情之前, 没有想好到底做什么? 于是小王开始做计划. 33 | 34 | 生活教练提供每日计划. 每天晚上, 小王按照提示做计划, 并且检查是否完成了这些计划. 35 | 当每天能够完成计划的时候, 生活教练提示: 开始每周计划. 36 | 37 | 生活教练还给出一个选项: 选择自己的人生目标, 以及生活导向. 38 | 是工作重心, 还是生活重心? 在每周总结的时候, 会给出报告, 告诉你这周到底是怎么过的, 是否保持了平衡? 39 | 40 | 待做事项 41 | ------------------ 42 | 43 | * timelog 44 | 首先, 最重要的是记录时间. 安装的程序保证每时每刻提醒你记录当前正在做的事情, 以及是否完成. 45 | 并且如果你忘记了记录, 会以某种方式告诉你, 应该去做这样的事情.(邮件提醒) 46 | 收集了数据后, 会给出报告, 提示你往更高级别迈进. 47 | 48 | * 生活教练 49 | 保持生活规律: 当设定了休息时间后, 系统会自动扣去休息时间, 并会保证, 在休息时间帮你关掉电脑等东西, 让你去休息. 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /_life_faq.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halida/blog/5221995520c2da95f476ff37ee6eab9e9386f545/_life_faq.rst -------------------------------------------------------------------------------- /_live_is_short.rst: -------------------------------------------------------------------------------- 1 | * our human are short in time 2 | * and we didn't make a count 3 | * so let's count it. 4 | -------------------------------------------------------------------------------- /_pyramid初探.rst: -------------------------------------------------------------------------------- 1 | pyramid是一个继承自pylons的python web框架, 2 | 3 | 问题: 4 | 5 | - 为什么要安装? 6 | -------------------------------------------------------------------------------- /_pyramid试用.rst: -------------------------------------------------------------------------------- 1 | 今天本来计划使用pylons的, 但是听说已经有下一代产品: pyramid, 于是我直接去学习它了. 2 | 3 | pyramid其实就是原先的repoze.bfg, 也是pylons的下一代产品. 特点是文档超级多. 4 | 5 | 问题: 6 | - 新的很多概念出来了, 一时半会接受不了. 7 | - 大量的英文, 阅读能力不够用了. 8 | 9 | 感想: 10 | - pyramid基于pylons, 采用的是非常灵活的配置方式, 你可以自由指定一切. 11 | 12 | 初学者还是看helloworld教程, 然后再看 `wiki教程 `_ 13 | 14 | -------------------------------------------------------------------------------- /_qt是如何处理控件大小的.rst: -------------------------------------------------------------------------------- 1 | 我写pyqt已经有1年多了, 但是一直以来都没有整理清楚qt如何分配控件大小的. 最近又重新看了下文档, 稍微理清了点头绪, 这里整理一下. 2 | 3 | 我们知道, qt提供了很方便的layout机制, 方便我们不需要自己制定控件的大小, 以及非常好用的qt designer, 在大多数的时候, 我们只需要用qt designer拖拖拉拉界面, 或者写代码, 直接用QLayout.addWidget一个个加子控件就好了. 4 | 5 | 但是有的时候, 我们还是需要处理一些特殊情况, 比如自定义控件, 比如做一些微调. 这个时候我们需要整理清楚逻辑. 6 | 7 | 我们应该以这样的方式来一步步制定逻辑: 8 | 9 | 问题分割成: 10 | 11 | - 微观(控件)层面: 一个控件定义清楚自己大小的逻辑, 比如QLineEdit在垂直方向上的大小是固定的. 12 | - 宏观层面: layout自动整理清楚控件, 然后做一些微调, 比如如何把空间分别分配给各个控件. 13 | 14 | 控件层面 15 | -------------- 16 | 我们 17 | 设置sizeHint, 以及sizePolicy 18 | 19 | 在layout层面, 设置stretch 20 | -------------------------------------------------------------------------------- /_中文编程.rst: -------------------------------------------------------------------------------- 1 | 恩, 现在流行的主要还是英文来编程, 如果用中文来写代码, 感觉会是如何呢? 玩玩: 2 | 3 | 4 | 翻译python代码: 5 | 6 | .. code-block:: python 7 | 8 | def fib(n): 9 | if n<2: return 1 10 | return fib(n-1) + fib(n-2) 11 | 12 | 为 :: 13 | 14 | 有绯薄来甲 15 | 若甲小于贰回壹 16 | 回加绯薄减壹绯薄减贰 17 | 18 | -------------------------------------------------------------------------------- /_为什么要把事情弄得那么复杂.rst: -------------------------------------------------------------------------------- 1 | 现在很多东西都搞得很复杂, 我就觉得奇怪了, 2 | 本来一个很简单的事情, 为了各种欲望, 改得乱七八糟的, 3 | 遇到一个问题, 先想想what, why, how, 有那么难吗? 4 | 5 | 6 | -------------------------------------------------------------------------------- /_为什么要用chrome作为浏览器.rst: -------------------------------------------------------------------------------- 1 | 你可能不知道什么是浏览器, 你可能不知道什么是chrome, 但是我真心建议你使用。 2 | 优点是快速, 安全, 很多可用插件。 这个是我比较其他的一些浏览器后, 选择我觉得最好用的一个。 3 | 4 | **观念**: 要相信专业人士做出的选择, 他们的选择是在尝试过多种可能性后做出的最佳决策。 5 | 虽然每个人的情况不同, 可能会出现每个人适合的选择不一样, 但是大多数的情况下, 并不需要那么多的客制化客制选择。 6 | 7 | **观念**: 免费软件其实不免费, 厂商需要投入成本在研发上面, 最后还是会从你身上赚到应得的钱的。 8 | 如果是付费软件, 他们会想办法提升软件品质来吸引你付费, 9 | 如果是免费软件, 他们会想办法让你看广告, 或者收集你的隐私卖掉, 或者用其他的方式来从你身上赚钱。 10 | 要去搜索制作这个软件的厂商, 了解他们是什么样的公司, 如何赚钱。 11 | -------------------------------------------------------------------------------- /_为什么要用google作为搜索引擎.rst: -------------------------------------------------------------------------------- 1 | 现在普通人采用baidu来作为搜索引擎, 但是专业人士是用google的。 这个也不是说很高端, 而是我们认为google才是更好的解决问题的方法。 2 | 3 | **观念**: 不要因为一个东西看起来高端就望而却步, 而是要产生尝试它的意愿。 4 | 这样东西一定有很大的价值在里面, 当你尝试了它, 会对你带来好处。 5 | 因为各种感情的原因回避提升是很不可理喻的。 6 | 7 | 为什么不要用baidu? 因为: 8 | - baidu的搜索结果是安插了广告的。 9 | - baidu的搜索结果不好, 主要还是在中文领域, 也不一定能够搜索到你需要的东西。 10 | 11 | baidu是通过竞价排名, 在搜索结果里面安插广告来赚钱的, 搜索结果的真实性和准确性对于我们做决策来说非常重要, 12 | 我实在不敢使用这样不能提供真实准确信息的搜索引擎。 google是世界顶级的公司, 理念是促进信息流通, 13 | 公司的盈利模式依赖收集用户搜索内容推荐针对性的广告, 算是体面的盈利方式。 这样的公司我信得过。 14 | 15 | 我给出来的关于搜索的几个建议: 16 | - 遇到不懂的东西, 你应该产生的第一个反映就是去搜索一下, 而不是问人。 你会发现你需要了解的东西, 网络上面都有。 比如"如何挑选蔬菜" 17 | - 你需要解决的问题大多数已经被解决过了, 然后绝大多数网络上面都有痕迹, 所以大胆去搜索吧。 18 | - 搜索的诀窍之一在于问对问题。 你需要好好思考一下如何描述清楚问题。 然后一般能够获得需要的结果。 19 | 你不要输入"最近的医院在哪里", 而是输入"南京西路 医院"这样的有明确信息含量的内容。 20 | - 最好把你的搜索内容翻译成英文, 然后搜索。 尤其是专业性质的内容。 英文圈里面的信息更充分, 更权威, 更不会出现虚假信息。 21 | 自从采用了这个技巧之后, 我发现基本没有搜索不到的内容了。 22 | -------------------------------------------------------------------------------- /_为什么要翻墙.rst: -------------------------------------------------------------------------------- 1 | 用了google之后, 你会发现经常会出现连接重置的状况, 这个主要是因为我们政府的 防火墙项目 的原因。 2 | 我们政府为了防止人民了解国外的知识, 做了这样的系统。 3 | 4 | 很多人放弃使用google的原因是因为翻墙太麻烦了。 这里我真心建议大家翻墙。 5 | 因为这样才能获得完整的互联网使用体验。 全世界最著名的几个网站都是只能翻墙访问的。 6 | 如果这些网站都没有看过, 怎么能够说是上过网? 7 | 8 | 翻墙本身其实不麻烦, 购买一个VPN, 设置网络连接就好。 具体的方式可以联系我。 9 | 10 | **观念**: 说真话, 中国只是世界里面的一小部分, 中国本身也算是被边缘化的国家, 11 | 几乎所有领域都比不上国外的。 英文现在是世界语言, 大家最好好好掌握, 这样才能接触和学习到世界上面的先进内容。 12 | 虽然只接触中文领域文化也可以很好地过下去, 但是有更先进的领域, 为什么不去接触它们呢? 13 | 14 | -------------------------------------------------------------------------------- /_为什么要选择苹果电脑.rst: -------------------------------------------------------------------------------- 1 | 是的, 普通的电脑价格便宜, 并且大家习惯了windows的操作方式。 2 | 但是使用windows操作系统的坏处在于你需要花费很多时间处理一些只有windows系统下面才有的问题。 3 | 4 | 建议购买macbook air, 现在价格不是特别贵, 性能也非常好。 5 | 6 | 用了苹果之后, 你就不需要装什么系统优化工具, 杀毒软件了, 一个靠谱的操作系统, 是不需要用户去做这些事情的。 7 | 其他的好处有不用关机, 合上电脑就可以, 舒服的用户体验等等。 如果你在有苹果店的城市, 可以去体验一下。 8 | 我有一个**观念**提供给大家: 就是一个东西的价格, 要考虑上它能够节省你多少时间的价格。 以这样的角度来考虑, 苹果电脑是很划算的。 9 | 10 | 我个人是使用linux的, 如果你是做程序员或者未来希望做程序员的, 我觉得你必须使用过linux, 11 | 因为在这个可以hacking的系统下面, 你才能了解和实验一些底层的东西。开发起来也非常方便。 12 | 普通人我觉得还是算了吧。 了解这个系统太花费时间, 不是特别有必要。 13 | 14 | -------------------------------------------------------------------------------- /_人生苦短.rst: -------------------------------------------------------------------------------- 1 | 我们成年人每天都会消耗大约8小时在上班上面, 再加上其他的损耗, 基本上, 晚上6:00 - 10:00 4个小时才是真正自由支配的时间(如果运气的话), 再加上周末的2天. 2 | 3 | 但是问题是工作 4 | 这4个小时, 我们往往浪费掉了, 5 | 6 | 我们人类的生命很有限, 在这么有限的时间里面, 我们却很少算经济帐, 是否值得? 我想我们每个人都应该算算. 7 | 8 | 时间是单位, 用时间换钱, 用钱换时间 9 | 10 | 11 | ps: 为了练习英语写作, 以后我都会采用双语操作. 12 | -------------------------------------------------------------------------------- /_介绍一些高端网站.rst: -------------------------------------------------------------------------------- 1 | IT人士一般不上国内网站。 看起来好像很高端, 其实是因为大多数的国内网站实在是太差劲了。 2 | 普通人可能习惯了, 但是如果看过一些国外网站, 眼界提升了就有感觉了。 3 | -------------------------------------------------------------------------------- /_你愿意成为什么样的人.rst: -------------------------------------------------------------------------------- 1 | 人的一生只有一次, 生命本身很短, 只有900个月. 2 | 3 | 想清楚自己愿意成为什么样的人很重要. 4 | 5 | 如何想清楚? 一个方法就是具现化. 在脑袋里面幻想理想中的自己每天做什么事情. 6 | 7 | 如果没有足够的具现化思路, 可以在平时多看看各种各样人的生活方式. 多观察. 8 | 9 | 有了理想中的自己, 需要思考过上这样的生活需要什么资源, 然后画个图, 看看距离现在的自己有多远. 10 | 11 | 然后看看要走到那一步, 需要付出什么代价. 12 | 13 | 最重要的是否是值得, 然后权衡付出与收益, 最后停留在某个点. 然后, 往这个点上面努力去吧. 14 | -------------------------------------------------------------------------------- /_如何专业地使用电脑.rst: -------------------------------------------------------------------------------- 1 | 我们IT人士, 会选择尽量优化自己电脑的使用。 在普通人看来, 好像很高端的样子。 其实我觉得, 只是普通人走了一条错误的路径。 2 | 3 | **观念**: 很多时候, 正确的道路只有少数人走, 在其他大多数人来说, 好像这些人是特立独行的。 属于另类。 4 | 但是实际上, 有很多时候, 大多数人走的路线才是另类的, 偏离正确路线。 5 | 所以, 我做决策的时候, 不因为人群因素考虑方向, 甚至可能会反过来(因为人多的地方竞争大), 6 | 人集中领域的好处在于可以获得他们的经验, 少走弯路。 所以如果我要买一个不熟悉的东西的话, 会去参考大多数其他人的决策。 7 | 8 | 首先, 我们来看看一个典型的普通的能够使用电脑的人士的习惯: 9 | 10 | - 安装windows系统。 11 | - 安装360。 12 | - 安装360浏览器。 13 | - 用百度搜索引擎。 14 | - 上hao123(好像真的有很多人上这个网站)。 15 | - 安装杀毒软件。 16 | - 安装国产软件, 比如QQ, QQ影音什么的。 17 | - 基本只在少数的几个国内网站上面混。 微博, 人人, 优酷/土豆什么的。 18 | 19 | 如果你基本中招, 恭喜你, 说明你是一个普通人(而不是像我们IT男一样的怪异人士), 还有很大的提升空间。 20 | 21 | 如果你没有中招, 也可以继续看下去, 发现需要补充的内容, 然后通知我。 22 | 23 | 我这里整理了一系列的建议, 以及提供这些建议的理由。 希望能够让部分人能够走到更好的路径上面来。 24 | 你可能现在没有什么感触, 我建议你稍微实施一下, 这样才知道这些建议好在哪里。 25 | 26 | 具体的内容可能有点多, 我这里分割成为几篇文章: 27 | 28 | - todo `为什么要选择苹果电脑`_ 29 | - todo `为什么要用chrome作为浏览器`_ 30 | - todo `为什么要用google作为搜索引擎`_ 31 | - todo `为什么要翻墙`_ 32 | - todo `为什么要学习使用命令行`_ 33 | - todo `为什么要学习编程`_ 34 | - todo `介绍一些高端网站`_ 35 | 36 | 结论 37 | --------------------------------- 38 | 我们大多数人每天绝大多数时间是坐在电脑面前的, 掌握一些好的技巧是非常有帮助的。 39 | 这篇文章我会持续更新, 以方便大家推荐给普通人使用。 40 | -------------------------------------------------------------------------------- /_如何用mercurial做开发.rst: -------------------------------------------------------------------------------- 1 | 现在关于如何使用DVS工具的文章已经很多了, 但是在更高程度上看, 如何理顺整个开发过程的文章还是比较缺. 2 | 根据 `这篇文章`_ 里面, 很多人使用版本管控工具, 只是把它当作一个代码备份工具来使用. 3 | 4 | 虽然我也不是什么资深人员, 但是我也整理一下自己使用版本管控工具的经验, 方便后来人, 也是对自己经验的一个整理. 5 | 6 | 作为版本管控工具, 我们需要它们能够做到以下功能: 7 | 8 | - 能够保存代码, 防止代码遗失 9 | - 能够记录变更, 出现问题的时候可以根据历史记录快速获取问题点. 10 | - 根据使用场景维护多个版本的代码, 以及多个版本之间能够同步指定代码 11 | - 多人协作的时候能够做到每个人能够专心开发自己的功能, 并且代码能够顺利整合 12 | 13 | 现在比较普遍的最佳实践有: 14 | 15 | - 采用开发版本和发布版本2个分支. 16 | 平时在开发版本上面干活, 确认稳定后, 才整理到发布版本上面去, 发布版本用来做bugfix. 17 | - 主代码库 + 每个程序员本地代码库, 程序员本地commit, 当一个功能完成的时候, 才push到主代码库中去. 18 | 19 | .. _`这篇文章`: http://www.jeffkit.info/2010/12/885/ 20 | -------------------------------------------------------------------------------- /_如何防御zombie.rst: -------------------------------------------------------------------------------- 1 | 作为广大人民喜闻乐见的幻想生物, zombie给我们带来了很多乐趣(比如植物大战僵尸), 2 | 这篇文章分析一下zombie的合理性基础(如果哪天真的有zombie出来的话), 以及对应的处理方式. 3 | 4 | zombie的来历 5 | ----------------------- 6 | 首先我们先看看为什么要有zombie, 我认为, zombie基本上是提供了一类似人非人的角色, 7 | 以用来制造冲突, 提供暴力, 性等刺激物等功能. 并且为了增加更多的元素, 不同设定下zombie的性质有不同, 下面具体分析. 8 | 9 | zombie的类型 10 | ----------------------- 11 | 我们看zombie的共性, 基本上都是由人类变来, 带有不同程度的腐败, 简单点说就是还能动的死人. 12 | 根据不同设定, 智能带有不同程度的丧失, 等等. 对了, 一个非常重要的核心设定是会咬人, 然后咬人能够把被咬的人变成zombie. 13 | 14 | 最常见的zombie类型, 就是行动迟缓, 没有智力, 很容易破坏的那种. 基本上是B片的标准配置了. 15 | 16 | <26天之后>里面的zombie特性是, 动物智力水平, 能跑!(这个是核心特性了, 会跑的zombie躲避的技术难度高了很多), 传播病毒的速度是秒级别的. 比较偏合理性质了. 17 | 18 | <生化危机>里面的僵尸除了普通的迟缓类以外, 还有种种变异版本, 19 | 20 | <光晕>里面的洪魔基本上不是僵尸了, 属于外星生物, 暂时不管它. 21 | 22 | 关于传播方式 23 | ----------------------- 24 | 25 | 抵御方式 26 | ----------------------- 27 | 抵御方式在有准备和无准备的情况下完全不同, 28 | -------------------------------------------------------------------------------- /_开放哲学.rst: -------------------------------------------------------------------------------- 1 | 有很多事情太重要了以至于不能让政府/企业/..来控制 2 | 3 | we the people 4 | 5 | open for public 6 | 7 | opensource开发模式 8 | -------------------------------------------------------------------------------- /_我们需要的是学习.rst: -------------------------------------------------------------------------------- 1 | 很多人经过了多年的学校教育, 出来后就再也不学习了, 对看书也反感了. 2 | 这真的很悲哀. 学校教育烂是这个社会的问题, 我们改变不了, 3 | 但是如果因此而影响到了自己的观感, 让自己以后再也不碰书本了, 那更是损失. 4 | -------------------------------------------------------------------------------- /_扯扯未来学.rst: -------------------------------------------------------------------------------- 1 | 我一直对新技术的出现感到有兴趣。 跟踪了一些新的技术。 2 | 看得多了, 渐渐有了一些脉络, 有的时候我就会说:“现在发展到XX的阶段了”, 3 | 我这样说, 隐含了一个前提, 那么就是发展的路线是有脉络可循的。我一直觉得是这样。 4 | 主要的思索过程是这样: 5 | 我们现在的技术其实是依赖我们对物质世界的了解, 以及在此程度上对组织方式的理解。 很大程度上面, 都可以抽象成数学。 6 | 比如信息交流的方式, 在什么样的状况下是最优的。 可能性其实就那么一些。 7 | 比如最近的Google IO里面出来的眼镜。 我觉得就是一个趋势。 8 | 未来人类形态的变化, 也是趋势。 我觉得这些是必定会发生的。 就像熵增一样。 在可见的宇宙发展里面, 我觉得这个定律感觉来说, 应该是不可破的。 9 | -------------------------------------------------------------------------------- /_编程黑店.rst: -------------------------------------------------------------------------------- 1 | 程序员平时都呆在自己的小环境里面, 还是有必要出来一起写写代码的. 可以交流编程的技艺, 以及知道其他人的工作方式, 以及解决问题的思路和方法. 2 | 所以我计划能够举办一个: 编程黑店 的主题活动. 目标是让程序员们聚集起来, 解决一些编程问题, 在解决这些编程问题的时候, 达到互相交流编程技艺的目的. 3 | 地点是在上海, 等年后视时间状况而定. 4 | 5 | 计划是这样的: 6 | 7 | 一个周末的白天时间, 在一个封闭的场地里面, 参与者自由组团, 先是头脑风暴, 提出一个能够在一下午能够解决掉的问题, 然后下午把这个问题解决掉. 晚上定点结束, 审视今天的成绩. 8 | 9 | 问题是: 我没有组织这样活动的经验, 需要整理一下需要做的事情, 以及需要注意的方面. 10 | 11 | 先期准备: 12 | - 场地, 已经有合适的公司可以联系 13 | - 预演, 因为没有经验, 最好能够小范围预演一下. 14 | - 主题, 需要收集能够在一个下午的时间内完成的内容, 比如俄罗斯方块? 15 | 16 | 注意事项: 17 | - 开始前, 最好能组队, 互相了解技术实力, 做好预先沟通的工作, 以便下一步真正开始工作. 参与者需要介绍清楚自己的技术方向, 工作方式, 开发平台等信息. 18 | - 风险控制. 主题能够做到当某些人不在场的时候不影响开发. 19 | - 防止预先准备. 主题必须在头脑风暴的时候产生, 做假就没有意思了. 20 | - 场地设备齐全. 包括无线网络, 有线网络, 电源, 茶水, 安静独立的环境, 投影, 21 | - 中午午餐考虑? 是否留有午休时间? 22 | - 过程中记录和跟踪. 开启共享桌面, 录像, 头脑风暴录音. 23 | - 到点结束后, 每个小组汇报成果, 腐败. 24 | -------------------------------------------------------------------------------- /_网上学习社区.rst: -------------------------------------------------------------------------------- 1 | 网上学习社区 2 | ============================ 3 | 4 | 需求 5 | ---------------------------- 6 | 7 | 现在网络上面学习的资料已经汗牛充栋, 更有国内外各大高校放出的开放课程以及视频, 那么下一步发展的方向就是网上学校. 8 | 我个人的想法是: 能否能够产生一个基于网络的学习社区? 9 | 10 | 虽然现在学习资料很多, 但是距离真正能够达到效果的学习有下面几个问题: 11 | 12 | - 学习进度掌控. 13 | 内容有了, 但是需要能够帮助掌控学习进度, 自学是很容易无疾而终的. 14 | - 答疑与交流 15 | 自学的时候最大的一个问题是, 遇到难题无法解决, 这个时候往往没有合适的助教帮助回答问题. 16 | 以及一个人学习的时候很苦闷, 效果也不如多人一起学习的好, 更没有来自同学进步带来的压力. 17 | - 结果奖励 18 | 虽然可以自己给自己奖励, 但是最好能够有第三方的一个认证(可以不需要太多权威)来向他人展示自己的成果. 19 | 20 | 想法 21 | ----------------------------- 22 | 23 | 现场学习(各大高校以及教育组织)能够解决, 至少是部分解决上面的问题, 24 | 但是对于网上学习, 需要思考如何能够解决上面的问题.. 25 | 26 | 我的一些想法: 27 | 28 | - 进度掌控 29 | 提供功能, 能够自己设定学习进度, 核心在于: 当没有到达既定学习进度的时候, 30 | 提醒用户, 以达到对用户的正面反馈. 具体思路和方法可以借鉴现有的项目管理经验. 31 | - 答疑和交流 32 | 网络平台, 可以方便不同地点的自学者聚集到一起, 集中学习. 33 | 可以采用激励机制, 让志愿者/已经学习完毕的成员参与答疑. 34 | - 结果奖励 35 | 对于完成课程的成员, 有记录奖励功能. 36 | 37 | 上面的核心在于能够提供一个非常好用的学习进度安排工具, 然后由此建立互助学习社区. 38 | 39 | 本人没有多少web开发经验, 现在想法也处于酝酿阶段, 这个创意离起步阶段还早, 大家有什么想法可以提出, 谢谢. 40 | -------------------------------------------------------------------------------- /_资本家是否真的剥削员工.rst: -------------------------------------------------------------------------------- 1 | 我们很多人有这样的一些观念: 2 | - 我们从中学课本里面学到: 资本家是剥削员工的剩余价值的, 并且很多人认同这点. 3 | 4 | - 我们看到社会上人们收入差距很大, 觉得这样不公平. 5 | 6 | 是的, 社会上每个人的收入差距很大, 我们为什么会觉得这样会有一个问题? 7 | 那是因为我们隐含了一个前提: 就是认为所有人的收入是一个大饼, 每个人都从中取得一部分. 8 | 9 | 收入不是被分配的, 而是创造出来的 10 | --------------------------------------- 11 | 但是事实不是这样. 每个人的收入不是从这张大饼里面分得一部分, 而是自己创造了价值, 然后自己创造的价值是这张大饼的一部分. 每个人创造的价值差距非常大, 如果你不认同这点的话, 考虑比尔盖茨, 如果不是他, 电脑不会那么容易地普及到千家万户, 你觉得这样的价值是否值上千亿? 12 | 13 | 没有所谓的剩余价值 14 | --------------------------------------- 15 | 资本家雇佣工人, 然后资本家能够从中获取一部份的剩余价值, 这才是为什么他们为什么那么富有. 16 | 资本家雇佣工人是在一个自愿的前提下进行的, 如果工人利益受损, 工人大可以离开. 17 | 那么资本家的利润从哪里来? 18 | 19 | 资本家为什么能够获得那么高的收入 20 | --------------------------------------- 21 | 创造产品. 资本家选择市场, 组织生产, 购买原材料, 生产产品, 把产品卖到市场中去. 22 | 如果没有资本家, 就不会有产品. 产品减去成本就是资本家创造的价值. 23 | 24 | 如果你觉得这样不公平, 可以考虑资本家在这个过程中需要满足的条件: 25 | - 对市场的洞察力. 产品需要有销路才能卖出去. 26 | - 组织生产的能力. 产品要在预期的时间内生产出来, 并满足需求. 27 | - 计算和优化现金流的能力. 卖产品的收入要能够超过生产产品的成本. 28 | 29 | 如果上面的任何一条没有满足, 资本家会血本无归. 而工人只需要每天上班做事就好了. 工厂破产, 只需要去另外一个地方工作就可以了. 30 | 31 | -------------------------------------------------------------------------------- /about.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://lh6.googleusercontent.com/-phObbT9xpTg/TxZ1j2F0EBI/AAAAAAAAEcc/emsStX8ShTI/s800/s.jpg 2 | :align: center 3 | 4 | 我是一个程序员, 我希望能够持续提升自己的技能和智慧, 能够以我的方式改变这个世界. 5 | 6 | 兴趣点 7 | ------------------------- 8 | * 音乐: 旋律类的都可, 钢琴(正在练, 每天1小时, 持续..一辈子) 9 | * 经济学fans 10 | * 科幻奇幻小说迷 11 | * 编程: c/c++/lisp/lua/delphi/python/ruby/js/coffeescript 12 | * 系统: linux, emacs 13 | * 独立游戏: roguelike, Cortex Command, minecraft 14 | 15 | 混迹于 16 | ------------------------- 17 | * douban: http://www.douban.com/people/linjunhalida/ 18 | * twitter: http://twitter.com/#!/linjunhalida 19 | * maillist: python-cn, shlug, toplanguage 20 | 21 | 联系方式 22 | ------------------------- 23 | * 博客 http://blog.linjunhalida.com 24 | * 邮箱 linjunhalida at gmail dot com 25 | * 豆瓣 http://www.douban.com/people/1266965/ 26 | * 推特 `@linjunhalida `_ 27 | -------------------------------------------------------------------------------- /be_a_better_man.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.jggz.net/teacher/tiyu/22.jpg 2 | :align: center 3 | :width: 600 4 | 5 | If one person knows how he spend his life, he will be in shock: 6 | 7 | he spent 8 hours a day at work, only 1-2 hours (even less!) were for the jobs really metters. 8 | and he lost almost all the time after work: playing game, watch TV, surfing the internet. and so this is a day. 9 | a day without perception, a day without plan, and it all coursed by a man without knowning what he is doing. 10 | 11 | most of us is this man. is is sad. and on the opposite, some great people have causion, 12 | they know what they what to, and knows it so well that for every minute (or at least when he is planning to do something), 13 | he can focus on the important things. by doing this, they have better lifes. 14 | 15 | so how could we be one of those "great people"? are there anything magical? no. there are some simple rules: 16 | 17 | **rule 1: plan before you start.** 18 | 19 | we always eager to start doing things right away, it is human nature, our brain works this way: doing things make ourselves feel better. 20 | and planning is hard, make ourselves feel bad. but the issue is: plannig is hard because you don't really know what you starts! 21 | and without knowing the full picture may lead to failure. so make a plan, it is your road map. without it, you will easily get lost. 22 | 23 | **rule 2: start and finish what you plans.** 24 | 25 | people controlled by their feelings. things have good part and bad part. we always lost the battle. we always retreat, if we don't have faith. 26 | if planning is like a general, analysis, judges, and make decisions, doing things is like a soldier. not care about how target is hard to accomplish, 27 | only concentrate on finish it. 28 | 29 | **rule 3: examine what you finished.** 30 | 31 | after finish the job, people just passing through, the job has the feeling of pain, why not folder it, and leave it? 32 | the reason is, facing the pain, make we do better in the future, and the job is our a reflection of ourselves, 33 | examine it make ourselves better. so it is important. 34 | 35 | those are the simple rules. easy to understand, hard to follow. it need disciprine, it need will power to follow. 36 | there is no easy way, maybe there are some tips that can make it easier, but it still need you to face the problem. 37 | 38 | anyway, hope you can follow it, and be a better man. 39 | 40 | 41 | -------------------------------------------------------------------------------- /build-res/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %(title)s 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 18 | 19 | 22 | 23 |
24 | %(body)s 25 |
26 | 27 | 61 | 62 | 65 | 66 |
67 | -------------------------------------------------------------------------------- /build-res/disqus.html: -------------------------------------------------------------------------------- 1 |
2 | 12 | 13 | blog comments powered by Disqus 14 | 15 | 23 | 24 | -------------------------------------------------------------------------------- /build-res/rss.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 网络寻租 6 | http://vps.linjunhalida.com/blog/ 7 | 8 | zh-cn 9 | &copy; 2010, linjunhalida. 10 | Fri, 29 Oct 2010 03:21:22 GMT 11 | 12 | %s 13 | 14 | 15 | -------------------------------------------------------------------------------- /build-res/rss_item.html: -------------------------------------------------------------------------------- 1 | 2 | %(title)s 3 | http://vps.linjunhalida.com/blog/%(title)s.html 4 | 5 | %(content)s 6 | 7 | 机械唯物主义 8 | %(updated)s 9 | 10 | -------------------------------------------------------------------------------- /build-res/style.css: -------------------------------------------------------------------------------- 1 | /* CSS Document */ 2 | 3 | /* convas */ 4 | body,html { 5 | margin:0; 6 | padding:0; 7 | background: white; 8 | } 9 | #wrap { 10 | width: 820px; 11 | margin:0 auto; 12 | background-color: white; 13 | } 14 | 15 | /* float sidebar */ 16 | #main { 17 | float:left; 18 | width:600px; 19 | } 20 | #sidebar { 21 | float:right; 22 | width:200px; 23 | } 24 | #footer { 25 | clear:both; 26 | } 27 | 28 | /* color */ 29 | #main { 30 | background-color: #f0f0f0; 31 | } 32 | #title { 33 | text-align:center; 34 | } 35 | #comments { 36 | background-color: white; 37 | } 38 | hr { 39 | color: #303030; 40 | } 41 | 42 | /* navigation bar horizontal */ 43 | #nav ul { 44 | margin:0; 45 | padding:0; 46 | list-style:none; 47 | } 48 | #nav li { 49 | display:inline; 50 | margin:0; 51 | padding:0; 52 | } 53 | -------------------------------------------------------------------------------- /build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #-*- coding:utf-8 -*- 3 | """ 4 | module: build 5 | """ 6 | import os, os.path, glob, commands 7 | from docutils.core import publish_parts 8 | from xml.sax.saxutils import escape 9 | 10 | target_path = u"../blog/" 11 | res_path = u"build-res/" 12 | 13 | DISQUS_INFO = open(os.path.join(res_path, 'disqus.html')).read().encode('utf-8') 14 | HTML_HEADER = open(os.path.join(res_path, 'base.html')).read().decode('utf-8') 15 | RSS_ITEM = open(os.path.join(res_path, 'rss_item.html')).read().decode('utf-8') 16 | RSS_HTML = open(os.path.join(res_path, 'rss.html')).read().decode('utf-8') 17 | INDEX_HTML = HTML_HEADER % {'title': u"网络寻租", 18 | 'header': '', 19 | 'body': u'%s'} 20 | ARTICLE_HTML = HTML_HEADER % {'title': "%(title)s", 21 | 'header': '

%(title)s

', 22 | 'body': ur'''%(content)s
%(disqus)s
'''} 23 | 24 | def main(): 25 | #获取文件列表 26 | content = glob.glob('*.rst') 27 | content = [i.decode('utf-8') 28 | for i in content 29 | if os.path.basename(i)[0] != '_'] 30 | content = [(commands.getoutput(( 31 | u"hg log -r0:tip -l 1 --template '{date|isodate}' " + i 32 | ).encode('utf-8')), i) 33 | for i in content] 34 | content.sort(reverse=True) 35 | #对于每个文件 36 | indexs, items = [], [] 37 | for updated, filename in content: 38 | title = filename.split('.')[0] 39 | htmlname = title + u'.html' 40 | #生成html 41 | content = publish_parts( 42 | source=open(filename).read(), 43 | writer_name='html')['html_body'] 44 | content_html = (ARTICLE_HTML % { 45 | 'title': title, 46 | 'content': unicode(content), 47 | 'disqus': DISQUS_INFO, 48 | }).encode('utf-8') 49 | open(os.path.join( 50 | target_path, htmlname).encode('utf-8'), 51 | 'w+').write(content_html) 52 | indexs.append(u'%s %s' % (updated, htmlname, title)) 53 | items.append(RSS_ITEM % {'title': title, 54 | 'updated': updated, 55 | 'content': escape(content.encode('utf-8')).decode('utf-8')}) 56 | 57 | #生成index 58 | open(os.path.join(target_path, 'index.html'),'w+').write( 59 | (INDEX_HTML % u"\n

".join(indexs)).encode('utf-8')) 60 | #生成rss 61 | open(os.path.join(target_path, 'rss'),'w+').write( 62 | (RSS_HTML % u"\n\n".join(items)).encode('utf-8')) 63 | 64 | if __name__=="__main__": 65 | main() 66 | -------------------------------------------------------------------------------- /cython介绍.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://docs.cython.org/_static/cython-logo-light.png 2 | :align: center 3 | 4 | python是门很强大很易用的动态语言, 像其他动态语言一样, 非静态绑定而是在执行时确定值会造成很多性能损耗, 我们可以用cython来解决这样的性能问题. 5 | 6 | cython的策略是这样的: 在python语法的基础上, 加上一些静态语言的特性, 比如确定值类型等, 然后把这种类似python语法的代码, 编译成c代码, 7 | 然后利用c编译器, 把代码做成python模块. 这样通过静态编译的方式, 来提高执行代码的性能. 8 | 9 | 具体如何使用和学习我就不多说了, `官方文档 `_ 上面写得很清楚. 10 | 11 | 我写了一个简单的实例代码: https://bitbucket.org/linjunhalida/code-example/src/tip/python/cython_test/ 12 | 但是转变成cython性能提高只有一倍左右, 不知道到底出了什么问题... 13 | -------------------------------------------------------------------------------- /docstring.rst: -------------------------------------------------------------------------------- 1 | 注意事项 2 | ----------------------- 3 | 4 | * 为了统一,docstring的注释用"""""" 5 | * 不要硬性说返回什么,因为无法确定.要表示会返回什么. 6 | * class的docstring要与上下分离开来,表示单独的一个部分. 7 | * override重载和extend扩展要注明 8 | * fill-paragraph断行 9 | 10 | 实例 11 | ----------------- 12 | 13 | def kos_root(): 14 | """Return the pathname of the KOS root directory.""" 15 | global _kos_root 16 | if _kos_root: return _kos_root 17 | ... 18 | 19 | def complex(real=0.0, imag=0.0): 20 | """Form a complex number. 21 | 22 | Keyword arguments: 23 | real -- the real part (default 0.0) 24 | imag -- the imaginary part (default 0.0) 25 | 26 | """ 27 | if imag == 0.0 and real == 0.0: return complex_zero 28 | ... 29 | -------------------------------------------------------------------------------- /git学习总结.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://lh5.ggpht.com/_UL5xJ4XsSh8/TO5reHrOWVI/AAAAAAAAAy8/6IufPsBgZQE/GIT-cheatsheet.jpg?imgmax=800 2 | 3 | 虽然我的主力版本控制系统是hg, 但是既然在开源社区里面混, git是绕不掉的. 平时接触到git的项目, 为了能够正常使用不出篓子, 还是要系统地学习一下git. 这里推荐 `git官方教程`_. 基础如何使用就不多说了, 网上漫天都是, 这里面整理一下使用CVS的一些经验, 绝大多数是从 `其他人`_ 那里抄过来的. 抄是学习的一大利器, 只要会抄, 什么事情都好办, 全世界那么多顶级的开源项目, 抄会一个, 吃穿不愁了---有点离题了. 4 | 5 | 首先, CVS不是备份工具, 如果你一股脑地把所有修改过的文件commit上去, 那么还不如去用 `dropbox`_. 6 | 我们要让版本库里面呈现的东西, 恰如其分地反应出开发流程, 方便流程控制, 阅读和处理. 7 | 那么CVS的使用, 应该符合专业的软件开发流程: 8 | 9 | - 每次提交代码, 应该是完成一项特定的工作, 提交的内容, 提交者应该能够回溯跟踪. 10 | - 代码分为开发版本, 以及发布版本. 11 | - 对于重要的阶段, 需要记录下来, 比如不同的发布版本号对应阶段的代码. 12 | 13 | 那么我们在使用的时候应该如何做呢? 根据 `gitworkflows`_: 14 | 15 | 拆分变更 16 | 17 | 每次我们修改代码, 可能同时根据无数的需求改了非常多的地方, 我们在提交的时候, 需要尽量按照逻辑拆分出来, 分别commit它们. 这样出来的历史才有足够的可读性. 没有可读性我们还记录它们干什么? 18 | 19 | 分支管理 20 | 21 | 我们需要有至少2个分支: 开发分支和发布分支, 平时在开发分支干活, 需要发布的时候, 提交到发布分支上面去, 并且根据版本加tag. 注意, 提交到发布分支上面的代码是通过流程保证稳定性的. 22 | 23 | 关于上面的流程管控, 有个神器可以使用: `git flow`_, 这里面的教程看一遍就能够体会到威力了. 24 | 25 | .. _`git官方教程`: http://git-scm.com/ 26 | .. _`dropbox`: http://www.dropbox.com/ 27 | .. _`其他人`: http://www.jeffkit.info/2010/12/885/ 28 | .. _`gitworkflows`: http://www.kernel.org/pub/software/scm/git/docs/gitworkflows.html 29 | .. _`git flow`: http://www.jeffkit.info/2010/12/842/ 30 | -------------------------------------------------------------------------------- /gmail不能用了.rst: -------------------------------------------------------------------------------- 1 | 这几天开始, gmail能够登录进去, 但是刷新的时候会停止掉, 但是翻墙之后, 完全正常. 那么到底发生了什么事情应该很明显了. 2 | 3 | 我这几天想到一个idea, 人们针对自己喜欢和厌恶的事情捐款, 如果喜欢一个人或者事物, 就给他捐款, 如果讨厌一个人或者事物, 就给能够除掉他们的对象捐款. 如果你讨厌windows, 可以给开源基金会捐款, 如果你喜欢苹果, 可以给苹果捐款(直接买他们的产品也可以). 4 | 5 | 我非常讨厌阻止我看gmail的东西, 如果有人能够除掉它, 那么我非常乐意捐出我的钱. 如果大家都愿意这样做, 那么我们的世界会更美好一点. 6 | 7 | 对了, 我是说真的, 我现在在申请信用卡途中, 如果有人知道如何捐钱给能够完成上面事情的人或者组织, 请告诉我. 8 | -------------------------------------------------------------------------------- /guard.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://livereload.com/images/LiveReload_350.png 2 | :align: center 3 | 4 | 介绍 5 | ------------------------ 6 | `guard `_ 是一个自动监控文件夹变更, 执行特定操作的工具. 如果你有这样的需求, 就可以用它. 7 | 8 | guard可以和rails整合, `这里 `_ 是介绍. 9 | 10 | 使用方法 11 | ------------------------ 12 | 比如, 简单地监控当前文件夹里面的变更, 如果变了就重新编译一下, 13 | 我们先装好一个插件: guard-rake 14 | 新建一个文件夹,里面2个文件: 15 | 16 | Guardfile : 17 | 18 | :: 19 | 20 | guard 'rake', :task => 'default' do 21 | watch(/(.*)/) 22 | end 23 | 24 | Rakefile: 25 | 26 | :: 27 | 28 | task :default do 29 | sh 'cpp xxx.c -o hello' 30 | sh './hello' 31 | end 32 | 33 | 然后在这个文件夹里面执行: 34 | 35 | :: 36 | 37 | guard 38 | 39 | 每次这个文件夹里面出现了文件变更, 就会重新执行一下default, 编译执行一下代码, 省去了每次自己点击的操作了. 40 | 41 | 原理 42 | -------------------------- 43 | 我们使用一个工具的时候一般来说最好还是需要知道一下这个工具的基本工作原理, 不然遇到问题的话也比较好解决. 44 | 45 | 底层根据操作系统采用对应的文件系统监控API(Listener). 在linux下面是调用 `inotify `_. 46 | 47 | guard的插件, 需要继承Guard, 实现run_on_change/initialize/start/stop 这些API就可以了. 48 | 49 | guard本身定义了一套DSL. 在Guardfile里面写的东西, 就会连接到对应的插件上面去. 比如上面的例子, guard 'rake', 下面就会调用guard-rake写的一个插件定义类. 50 | 51 | 52 | livereload 53 | --------------------------- 54 | guard有各种各样的插件, 这里介绍一个神奇的livereload. 它的作用是: 55 | 56 | 在做rails开发的时候, 每次更新了一个源文件, 我们需要手动去刷新一下网站页面. 它能够让你的网页自动刷新. 57 | 58 | 原理: 59 | 60 | guard维护一个本地的服务器. 网页内嵌有一个js, 连接上这个服务器. 61 | 62 | 当修改文件的时候, guard能够获知修改, 通知所有连上来的客户端, 本地有更新. js接收到更新, 会去自动刷新网页. 63 | 64 | 具体安装需要几个: `guard-livereload `_ 作为guard插件. `rack-livereload `_ 作为rails rack的一个中间件, 用来嵌入livereload的js. 65 | -------------------------------------------------------------------------------- /http_介绍.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://perl.apache.org/docs/2.0/user/handlers/http_cycle.gif 2 | :align: center 3 | 4 | HTTP是什么就不说了, 大家都知道. 这篇文章对HTTP实现方式的相关内容做一个整理, 满足大家的窥私欲望. 5 | 6 | 用户如何利用HTTP 7 | ------------------------------ 8 | 先不管HTTP下面是如何实现的, 我们看看上层: 对于用户而言, HTTP的使用很简单: 打开一个浏览器, 输入网址, 比如: http://www.example.com, 9 | 然后按回车, 浏览器就打开了一个界面. 整体工作逻辑就是 :: 10 | 11 | 发出网址(URL) --> 服务器传回网站内容 --> 浏览器显示界面 12 | 13 | 我们理清接口(不用去管浏览器渲染的部分): 14 | 15 | 输入 16 | 用户给本地的一个程序URL信息 17 | 输出 18 | 服务器返回状态, 以及HTML内容 19 | 20 | HTTP通讯过程 21 | ------------------------------ 22 | HTTP是如何实现上面的目标的呢? HTTP直接利用TCP连接, 并且通讯模式很简单, 客户端发出一个请求, 服务器给出一个响应. 并且这个通讯过程是纯文本的. 23 | 24 | 我们看一个实际的例子, 通过telnet来直接看看HTTP是如何通讯的: 25 | 26 | 首先连接目标服务器, 80端口是HTTP协议的默认端口. 27 | 28 | :: 29 | 30 | halida@halida-desktop:~$ telnet tonycode.com 80 31 | Trying 67.205.49.228... 32 | Connected to tonycode.com. 33 | Escape character is '^]'. 34 | 35 | telnet连接上之后, 我们发出请求. 36 | 37 | :: 38 | 39 | GET / HTTP/1.1 40 | Host: tonycode.com 41 | 42 | "GET"是HTTP请求的方法, "/"是获取资源的目录, "HTTP/1.1"标示采用的是什么HTTP协议版本. 43 | "Host"行代表的是HTTP header, 请求附带的一些其他信息. cookie, 页面缓存等. 具体可见: `HTTP headers` 44 | 45 | 最后输入2行回车, 表示请求内容发送完毕. 46 | 47 | 下面是接收到的内容 :: 48 | 49 | HTTP/1.1 200 OK 50 | 51 | 200是状态码, 表示...就是上面的OK, 请求处理完成. 52 | 53 | :: 54 | 55 | Date: Wed, 09 Feb 2011 01:06:45 GMT 56 | Server: Apache 57 | Last-Modified: Wed, 21 Apr 2010 15:49:54 GMT 58 | ETag: "71de2eb-bce-484c1252b6c80" 59 | Accept-Ranges: bytes 60 | Content-Length: 3022 61 | Vary: Accept-Encoding 62 | Content-Type: text/html 63 | 64 | 然后就是返回的一串 `HTTP header`, 里面含有返回内容的信息等. 65 | 66 | 最后是正文了, 就是我们喜闻乐见的HTML文档了(太长就不显示出来了) :: 67 | 68 | ... 69 | 70 | 整体过程就是那么简单. 更多的细节在 `HTTP` wiki文档. 71 | 72 | 状态码 73 | ----------------- 74 | 不是每次请求都是200 OK的, 这里面列出一些常见的状态码: 75 | 76 | 200 OK 77 | 没什么好说的. 78 | 79 | 400 Bad Request 80 | 请求有问题. 81 | 82 | 404 Not Found 83 | 最常见的错误, 无法在服务器上找到对应的资源. 84 | 85 | 403 Forbidden 86 | 服务器禁止访问此资源. 87 | 88 | 其他的见: `status code wiki页面 `_ 89 | 90 | 连接状态 91 | ----------------- 92 | HTTP/0.9, HTTP/1.0都是请求/响应后立刻断开, HTTP/1.1里面可以同一个TCP连接使用多次, 以减小多次重复连接带来的资源消耗和延迟. 93 | 94 | cookies 95 | ----------------- 96 | HTTP协议本身是无状态的, 一个请求一个响应, 就是那么简单. 但是很多时候我们需要记录状态, 比如用户登录等功能. 一般比较常用的是采用 `cookie`_ 的方式实现. 97 | 98 | 简单点说, 当客户端发出一个请求后, 服务器返回的HTTP header里面会带有一个 :: 99 | 100 | Set-Cookie: name=value; name2=value2 101 | 102 | 的段, 然后客户端会把这个字符段缓存下来, 下次请求的时候, 就会在自己的header里面带上 :: 103 | 104 | Cookie: name=value; name2=value2 105 | 106 | 就是这么简单. 其他一些技术细节, 比如cookie的作用时间和范围, 见 `cookie`_ wiki介绍. 107 | 108 | HTTPS 109 | ----------------- 110 | HTTP本身是明文的, 非常不安全. 为了解决这方面的问题, 就有了HTTPS. 111 | 112 | 简单地说, HTTPS和HTTP的区别在于, 不是使用TCP作为连接方式, 而是采用SSL的方式来做连接, 上层应用层是没有多少变化的, 传输的时候数据做了加密, 以及连接到服务器的时候, 会有一套验证机制保证服务器是真正的服务器. 113 | 114 | 具体还是见 `HTTPS` 的wiki界面. 115 | 116 | 结论 117 | ----------------- 118 | HTTP协议很简单优雅, 或许是这样的简单优雅才承载起来一个庞大的web世界. 119 | 对它的掌握是web程序员必备的基础, 之后才能更好地理解在此之上的很多精妙应用. 120 | 121 | .. _`cookie`: http://en.wikipedia.org/wiki/HTTP_cookie 122 | .. _`HTTPS`: http://en.wikipedia.org/wiki/HTTP_Secure 123 | .. _`HTTP headers`: http://en.wikipedia.org/wiki/List_of_HTTP_headers 124 | .. _`HTTP`: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol 125 | -------------------------------------------------------------------------------- /ipython.rst: -------------------------------------------------------------------------------- 1 | 什么是ipython 2 | ----------------------- 3 | 4 | .. image :: http://ipython.scipy.org/screenshots/snapshot1.png 5 | :width: 600 6 | 7 | python里面的一个杀手级应用就是它的解释器, 我们可以利用这个解释器来完成一些日常的工作, 比如计算器, 字符串处理, 其他计算显示什么的. 但是python本身自带的解释器功能不够强大, 所以有了 `ipython `_ 这个大杀器. 上面的图片显示的就是ipython的具体效果. 8 | 9 | ipython的目标是成为一个全方位的交互性和探索计算的平台, 它好像是隶属于scipy下面的, 莫非有替代matlab的期望? 对于我们普通人来说, 它的特性已经足够好到替换掉python自带的那个解释器了. 下面为大家介绍. 10 | 11 | 如何安装 12 | ----------------------- 13 | 先把ipython装起来吧. ubuntu下面: 14 | .. code-block:: sh 15 | 16 | sudo apt-get install ipython 17 | 18 | 其他系统可以看 `安装文档 `_ 19 | 20 | ipython好在哪里? 21 | ----------------------- 22 | 23 | 列出一些我觉得好用的东西: 24 | 25 | - 自动补全: 26 | 27 | 按下tab键会自动补全当前输入的对象名称.比如: 28 | 29 | :: 30 | 31 | In [1]: os. # 会自动列出os下面的所有东西 32 | In [2]: abcd = 12 33 | In [3]: abc # 自动补全成abcd 34 | 35 | - 缓存输入输出: 36 | 37 | 提示符是In [n]: 的格式, 也就是说, 你可以访问In和Out这2个list, 获取输入和输出. 38 | 39 | - 整合命令行工具: 40 | 41 | 可以用!ls的方式来执行命令行工具, 甚至可以把结果当作参数来使用: 42 | 43 | :: 44 | 45 | In [4]: out = !ls 46 | In [5]: for file in out: print file 47 | 48 | bin 49 | temp 50 | 51 | - 省略括号 52 | 53 | :: 54 | 55 | In [6]: s = "hello" 56 | In [7]: s.replace 'he', 'yi' 57 | 58 | 'yillo' 59 | 60 | - 交互式GUI操作 61 | 62 | ipython内嵌GUI处理机制, 使用tk/wxpython/pyqt可以交互式地创建和修改类. 创建出的对象是可以响应用户输入的, 并且能够实时修改. 63 | 64 | :: 65 | 66 | In [8]: from PyQt4.QtGui import * 67 | In [9]: dlg = QDialog(); dlg.show() 68 | In [10]: le = QLineEdit(); lw = QListWidget(); 69 | In [11]: l = QVBoxLayout(dlg); l.addWidget(le); l.addWidget(lw) 70 | 71 | 72 | 73 | - 帮助系统 74 | 75 | 对于任何对象s, 都可以用s??, s?的方式来看它的帮助文档. 76 | 77 | - run 78 | 79 | 可以用 80 | 81 | :: 82 | 83 | In[12]: run xxx.py 84 | 85 | 来执行代码. 86 | 87 | - sh模式 88 | 89 | ipython可以当作shell来使用. 只要执行: 90 | 91 | .. code-block:: sh 92 | 93 | ipython -p sh 94 | 95 | 具体说明见: http://ipython.scipy.org/doc/stable/html/interactive/shell.html 96 | 97 | 还有其他的很多很多很多特性, 我不一一列出来了.. 具体可以看 `overview `_, 以及进入ipython后, 运行: 98 | 99 | :: 100 | 101 | %quickref 102 | 103 | 来获取介绍信息. 104 | 105 | emacs + ipython 106 | ----------------------- 107 | 108 | 作为emacs控, 所有东西都要整合到emacs里面去. 109 | 根据 `emacs python文档 `_ , 我只设置了这几行代码: 110 | 111 | .. code-block:: lisp 112 | 113 | (require 'ipython) 114 | (global-set-key (kbd "C-; 4") 'py-shell) 115 | 116 | 不过, 我还装了几个其他东西(ubuntu下面): 117 | 118 | - ipython 119 | - python-mode 120 | - emacs23 121 | 122 | 安装ipython后, 会自动给你一个配置文件: 123 | 124 | :: 125 | 126 | /usr/share/emacs/site-lisp/ipython.el 127 | 128 | 所以只要require它就可以了. 129 | 130 | 相关资源 131 | ----------------------- 132 | 133 | - `ipython`_ 官方网站 134 | - `文档 `_ 135 | 136 | -------------------------------------------------------------------------------- /javascript_web_applications_读书笔记.rst: -------------------------------------------------------------------------------- 1 | 这几天抽空把 `javascript web applications `_ 这本书看完了, 整理一下学到的东西. 2 | 3 | 在我看来, 整本书主要内容就是讲如何抽象js前端开发, 让代码变得更清晰. 具体采用的手法是在js里面实现class, MVC, module等抽象. 4 | 5 | 整理整理一下我觉得对我来说重要的知识点: 6 | 7 | - context switch. 8 | js里面, new会转换context, 各种回调函数里面context会有变化, 具体影响到的是this以及环境变量. 9 | 要利用到jQuery里面的proxy(底层调用apply等)来做context switch. 10 | - js是prototype的语言, js里面实现继承, 需要通过递归调用prototype. 11 | - 很多封装的技巧, 有种lisp的感觉. 看起来成为一个靠谱的js程序员需要掌握这些技巧了. 12 | - MVC模型, 这个也不需要多说了, 都用烂了, 只要提一下大家就会注意了. Controller里面负责联系model和view, UI事件处理之类的事情. 13 | 14 | 对我来说比较有用资源的索引: 15 | 16 | - 利用前端实现MVC 17 | - 实现module以及对应的依赖关系 18 | - file, drag&drop等的API实现 19 | - 前端开发需要考虑的: performance, cache 20 | - 浏览器调试方面的一些工具: profile, logging 21 | - 一些前端MVC库的介绍: spine, backbone, javascriptMVC 22 | 23 | 我自己比较不足的地方, 可以在接下来的开发工作中提高的有: 24 | 25 | - 针对MVC的理解, 重构现有的程序. 26 | - 考虑使用一些前端的UI库. 27 | - performance, profile, logging, 用它们来提高现有前端代码的性能. 28 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | build: 2 | rm ../blog/* -f 3 | python build.py 4 | up: 5 | hg add 6 | hg ci -m "update" 7 | hg push 8 | 9 | down: 10 | hg pull 11 | hg up 12 | 13 | vps-publish: down build 14 | 15 | publish: up 16 | ssh linjunhalida.com "cd blog; git pull; cd ../haliblog-middleman/; ruby blog_update.rb; bundle exec middleman build; cp build/* /var/www/nginx-default -rf" 17 | 18 | show: build 19 | chromium-browser ../blog/index.html 20 | 21 | done: 22 | hg add 23 | hg ci -m "edit" 24 | hg push 25 | -------------------------------------------------------------------------------- /minecraft介绍.rst: -------------------------------------------------------------------------------- 1 | 什么是minecraft? 2 | ---------------------------- 3 | 4 | 随机生成的世界, 完全自由建设, 合成系统, 晚上的怪物, 铁路 5 | 6 | 下雪了 7 | 8 | .. image:: http://minecraftgallery.com/wp-content/uploads/2010/10/inceptionSnowFort-610x260.jpg 9 | 10 | 未来世界 11 | 12 | .. image:: http://minecraftgallery.com/wp-content/uploads/2010/10/FuturisticCityBiome-610x260.png 13 | 14 | 6英里 15 | 16 | .. raw:: html 17 | 18 | 19 | 20 | 视频 21 | - `youtube视频 `_ 22 | - `优酷视频 `_ 23 | 24 | 图片 25 | - `专门的图片站 `_ 26 | - `多人模式图片 `_ 27 | - `很多用户在发自己造的房子 `_ 28 | 29 | 多说无益, 直接点开来玩吧 30 | ---------------------------- 31 | 32 | 33 | `单人自由模式 `_ 34 | 35 | 可以随意建造, 资源无限 36 | 37 | `多人自由模式 `_ 38 | 39 | 直接去到别人做的世界玩玩 40 | 41 | `生存模式 `_ 42 | 43 | 有血条, 生命值, 物品栏, 怪物, 合成系统, 主要的乐趣在这个模式下. 44 | 45 | 97块人民币, 在线帐号, 至少3个月不腻, 值了! 46 | 47 | 爽点在哪里? 48 | ---------------------------- 49 | 50 | - 一个随机生成的世界 51 | - 你可以很简单地建造 52 | - 资源需要自己去开采, 为了宝石, 需要挖到地底 53 | - 合成建造一些奇奇怪怪的东西 54 | 55 | 比如铁路, 玻璃, 逻辑电路, 过山车就不算什么了, 有人做了CPU出来.. 56 | 57 | - 多人模式 58 | 59 | 可以合作建造, 可以玩RPG, 可以战争.. 60 | 61 | - 可以在浏览器内打开(java写的) 62 | 63 | 如何开始? 64 | ---------------------------- 65 | 66 | 可以看 `wiki`_ , 里面有详细的帮助. 67 | 68 | 我的minecraft设置 69 | ---------------------------- 70 | 71 | 为了增强游戏性, 增加了不少的东西, 不定时更新 72 | 73 | - `同步minecraft文件`_ 74 | 75 | - minecraft定制 76 | 77 | 官方论坛有 `专门的区域 `_ 讨论这个. 78 | 79 | 为了好看, 我加了几个显示模组: 80 | 81 | - `AaGeOn's BumpMaft HD texture Pack `_ 82 | - `Aza's Arid texture pack [128x128] `_ 83 | 84 | - 小地图 `mrmmods `_ 85 | 86 | minecraft修改 87 | ```````````````````````````` 88 | `修改器目录`_ 89 | 90 | 但我在ubuntu下面, 只有MCPlayerEdit最好用, 因为是python的. 91 | 92 | 搭建minecraft服务器 93 | ---------------------------- 94 | 95 | `如何搭建官方服务器 `_ 96 | 97 | 第三方工具 98 | 99 | - `McMyAdmin `_ 100 | 101 | ubuntu下面注意! 102 | ---------------------------- 103 | 104 | 因为minecraft是用java写的, 会和ibus输入法冲突(找了半天才知道), 造成无法输入键盘命令, 105 | 玩之前需要 106 | 107 | :: 108 | 109 | pkill ibus 110 | 111 | 资源 112 | ---------------------------- 113 | 114 | - `官方网站`_ 115 | - `官方论坛`_ 116 | - `wiki`_ 117 | 118 | .. _`wiki`: http://minecraftwiki.net/ 119 | .. _`官方论坛`: http://www.minecraftforum.net/index.php 120 | .. _`官方网站`: http://minecraft.net 121 | .. _`同步minecraft文件`: http://www.minecraftwiki.net/wiki/Tutorials/Saved_Data_Dropbox_Guide_Saves_Only 122 | .. _`修改器目录`: http://www.minecraftwiki.net/wiki/Programs_and_Editors 123 | -------------------------------------------------------------------------------- /mongodb访问权限设置.rst: -------------------------------------------------------------------------------- 1 | 这里整理一下设置mongodb访问权限的资料. 2 | 3 | 我们有通用的方法, 用iptable严格限制访问ip, 以及mongodb自带的密码验证(key验证等有需求的时候再研究) 4 | 5 | iptable限制访问资源 6 | ---------------------------------------- 7 | 8 | 服务器完全开放mongodb, 通过iptables来限制访问. 9 | 10 | 修改/etc/mongo.conf, host为0.0.0.0, 允许外部访问. 11 | 12 | 设置规则: 13 | 14 | .. code-block:: sh 15 | 16 | sudo iptables -I INPUT 1 -p tcp --dport 27017 -s 允许的外部IP -j ACCEPT 17 | iptables -A INPUT -p tcp --dport 27017 -j DROP 18 | 19 | 设置完毕后, 安装iptables-persistent 保证重启后iptables还是有效. 20 | 21 | mongodb权限管理 22 | ----------------------------------------- 23 | 有的时候还是需要限制权限, 方法整理如下: 24 | 25 | 在服务器本地执行 mongo 26 | 27 | .. code-block:: sh 28 | 29 | use crawler_db 30 | db.addUser('admin','admin') 31 | 32 | 然后修改/etc/mongo.conf, 设置 auth = true 33 | 需要重启mongo 34 | 35 | 连接上的时候, 需要db auth一下: 36 | 37 | .. code-block:: sh 38 | 39 | $db.authenticate('admin', 'admin') 40 | -------------------------------------------------------------------------------- /move.rb: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | BLOG_DIR = "." 3 | TARGET_DIR = "/data/workspace/octopress/" 4 | 5 | FORMAT = """ 6 | --- 7 | layout: post 8 | title: ""%{title}"" 9 | date: %{created} 10 | comments: true 11 | categories: 12 | --- 13 | """ 14 | 15 | maped_title = File.open("#{BLOG_DIR}/name_map.txt").read().split("\n").map{|line| line.split} 16 | maped_title = Hash[maped_title] 17 | MAPED_TITLE = maped_title 18 | 19 | # 把文档rst变成markdown, 交给octopress用 20 | def move 21 | # 更新 22 | `git pull` 23 | 24 | Dir.chdir BLOG_DIR 25 | 26 | # 获取列表 27 | lists = Dir.glob('*.rst') 28 | # # 不获取临时文件(_开头) 29 | # lists.reject!{|file| File.basename(file)[0] == '_'} 30 | 31 | # 生成时间, 文件名列表 32 | infos = lists.map do |file| 33 | [ 34 | # created 35 | %x{git log --format=%ai "#{file}"| tail -1}, 36 | # updated 37 | %x{git log --format=%ai "#{file}"| head -1}, 38 | File.basename(file, '.rst') 39 | ] 40 | end 41 | 42 | # 按时间排序 43 | infos.sort! 44 | 45 | #生成新的文件 46 | infos.each do |created, updated, title| 47 | cmd = %{cat "#{title}.rst"| pandoc -f rst -t markdown} 48 | text = `#{cmd}` 49 | # code 50 | text = text.strip 51 | .gsub(/~~~~ {\.sourceCode .([^\}]+)}/, '```\1') 52 | .gsub(/~~~~/, "```") 53 | .gsub("```lisp", "```") 54 | # first line image need a space 55 | text.sub!(/\n/, "\n\n") if text.start_with? "![image]" 56 | 57 | header = FORMAT % {title: title, created: created} 58 | target = title.start_with?("_") ? "#{TARGET_DIR}/t" : "#{TARGET_DIR}/source/_posts" 59 | File.open("#{target}/#{created.split[0]}-#{MAPED_TITLE[title]}.markdown", "w+").write("#{header}\n#{text}") 60 | end 61 | end 62 | 63 | move() 64 | -------------------------------------------------------------------------------- /mysql简单的备份策略.rst: -------------------------------------------------------------------------------- 1 | 策略很简单, 就是每天登录到服务器上面, mysqldump下来数据, 压缩, round-robin存放到本地即可(简单的根据星期几来保存). 2 | 3 | 备份方法 4 | ---------------------------------------- 5 | 执行备份脚本: backup.sh (本项目根目录文件) 6 | 然后会按照星期做round-robin备份. 文件名是备份的星期几. 7 | 8 | 修改了/etc/crontab, 添加每天早晨3:00执行备份: 9 | 10 | 0 3 * * * user cd ~/backup && bash backup.sh 11 | 12 | backup.sh 13 | ----------------------------------------- 14 | 15 | .. code-block:: sh 16 | 17 | #!/bin/sh 18 | ssh user@site.com "mysqldump -u root -p xxx | gzip > backup.gz" 19 | echo "get backup.gz" | sftp user@site.com 20 | mv backup.gz `date +%a`.gz 21 | 22 | 23 | 恢复方法 24 | ----------------------------------------- 25 | 不管如何, 需要保存旧的数据库资料. mysqldump. 26 | 27 | 然后再用mysqlimport恢复即可. 28 | -------------------------------------------------------------------------------- /pyqt多国语言.rst: -------------------------------------------------------------------------------- 1 | qt的多国语言支持方案 2 | ------------------------------- 3 | 4 | qt在设计的时候就考虑到了多国语言应该如何处理, 原理以及使用方法很简单. 如下: 5 | 6 | 第一步: 写代码的时候, 对于需要翻译的词语, 用tr()包起来, 比如:: 7 | 8 | QPushButton hello(QPushButton::tr("Hello world!")); 9 | 10 | 这样qt就知道这些词语是需要翻译的了. 然后qt需要把这些词语取出来, 放到一个文件里面去, 好进行下一步的翻译工作. 11 | 12 | 在你的pro文件里面说明这个文件的名称:: 13 | 14 | TRANSLATIONS = clabel_zh_CN.ts 15 | 16 | 这样就可以利用lupdate这个工具来把需要翻译的词语取出来:: 17 | 18 | lupdate-qt4 clabel.pro 19 | 20 | 然后, 我们就可以开始翻译工作了. qt提供了一个配套的翻译工具: linguist:: 21 | 22 | linguist-qt4 clabel_zh_CN.ts 23 | 24 | 其实ts文件是xml的格式, 你想直接编辑文本也是可以的. 25 | 26 | 当做完翻译工作之后, 我们需要把ts文件编译一下, 方便程序使用:: 27 | 28 | lrelease-qt4 clabel_zh_CN.ts 29 | 30 | 这样就会生成clabel_zh_CN.qm. 最后, 在代码里面加上选择语言的代码:: 31 | 32 | QTranslator trans; 33 | trans.load("clabel_zh_CN"); 34 | app.installTranslator(&trans); 35 | 36 | QPushButton hello(QPushButton::tr("Hello world!")); 37 | hello.show(); 38 | 39 | app.exec(); 40 | 41 | qt多国语言更详细的介绍在: http://doc.qt.nokia.com/4.6/i18n-source-translation.html 42 | 43 | pyqt下面如何实现多国语言 44 | ------------------------------- 45 | 46 | pyqt里面实现的过程和qt里面的类似, 只是因为第一步需要扫描的不是c++代码, 所以需要利用一个pyqt的工具: pylupdate4, 用法和lupdate一样. 47 | 48 | 首先写程序 49 | 50 | .. code-block:: python 51 | 52 | trans = QTranslator() 53 | trans.load('plabel_zh_CN') 54 | app.installTranslator(trans) 55 | 56 | button = QPushButton(tr("hello world!")) 57 | button.show() 58 | 59 | 等等, 里面的tr是什么? :: 60 | 61 | def tr(msg): 62 | return QCoreApplication.translate("@default", msg) 63 | 64 | qt翻译是根据类的名称来走的, 调用了什么类的tr, 就取这个类里面设置的翻译. 65 | 66 | qt里面是可以利用QObject::tr来翻译, 但是pyqt里面不能, 67 | pylupdate4只是做字符串查找, 看有什么字符串是在tr后面的, 然后根据tr调用者来把这个词语归类, 如果没有调用者, 就把它归类到 "@default" 里面. 于是我就只好利用上面的方法来做一个规避..有点恶心, 看看以后是否会有更好的方法来处理. 68 | 69 | 对于类里面的翻译, 不需要那么麻烦:: 70 | 71 | class Input(QWidget): 72 | def __init__(self): 73 | super(Input, self).__init__() 74 | label = QLabel(self.tr("input:")) 75 | 76 | 这里面的tr, 就可以被正确翻译出来. 77 | 78 | 然后运行pylupdate, 因为我们是python程序, 没有pro, 就只能手动指定文件了 :: 79 | 80 | pylupdate4 main.py -ts plabel_zh_CN.ts 81 | 82 | 好了, 下面的步骤和c++的方法一样 :: 83 | 84 | linguist-qt4 clabel_zh_CN.ts 85 | lrelease-qt4 plabel_zh_CN.ts 86 | 87 | 然后执行代码, 程序按照我们期望的方式翻译过来了, 是不是很简单? 88 | 89 | 上面的示例代码放在这里: http://bitbucket.org/linjunhalida/pyqt-i10n-example 90 | -------------------------------------------------------------------------------- /pysideqwt开源经验.rst: -------------------------------------------------------------------------------- 1 | 我现在的项目采用pyqt开发, 利用到了pyqwt, 但是pyqt闭源的话是要授权费用的. 2 | nokia他们因此弄出了lgpl的pyside. 我现在一直在跟进. 不过缺少qwt对pyside的绑定, 我的项目跑不起来. 3 | 4 | 与其等待有人来做这件事, 不如我自己弄吧. 于是我自己就建了一个: http://gitorious.org/pysideqwt#more 5 | 本来预期很难的, 不过实际做起来还是比较顺利的, 现在还在开发中. 期间, 遇到了不少问题, 也得到了pyside开发小组的帮助. 甚至还提交了我一生中第一个patch. 6 | 7 | 项目本身不说明什么, 我只想说一下这个过程是怎么思考的, 感觉这个才是开源的本质: 8 | 9 | 我们在项目开发中, 往往会发现某些问题非常通用, 值得很多企业外部的人一起来解决, 或者自己的解决方案可以被很多外部人士用到. 10 | 这样的话, 选择开源, 对自己的商业模式没有影响, 反而可以造福他人, 也可以给自己带来无形的收益. 11 | 我想, 这才是开源生存的重要支柱. 12 | -------------------------------------------------------------------------------- /pyside介绍.rst: -------------------------------------------------------------------------------- 1 | 什么是pyside? 2 | -------------------------------------- 3 | 4 | `pyside`_ 是一个Qt4在python下面的绑定, 是PyQt4的取代. 它和PyQt4不同的地方是, 支持商业闭源应用, 以及是Qt4官方支持的. 5 | 6 | pyside现在状况怎么样? 7 | -------------------------------------- 8 | 第一个beta版本已于2010/12/26释放. 处于火热开发中. pyside是完全跟进qt的. beta里面带有qml的支持. 9 | 10 | 如何获取pyside? 11 | -------------------------------------- 12 | 13 | 如果你用ubuntu, 加一下ppa的源就好了. 14 | 网址: https://launchpad.net/~pyside/+archive/ppa 15 | 16 | 执行命令: 17 | 18 | .. code-block: sh 19 | 20 | sudo add-apt-repository ppa:pyside/ppa 21 | sudo apt-get update 22 | sudo apt-get install python-pyside pyside-tools 23 | 24 | 也可以去clone `pyside源码库`_. 25 | 26 | 尝试pyside 27 | -------------------------------------- 28 | 我们通过几个示例来看pyside的状况: 29 | 30 | 简单示例 31 | `````````````````````````````````````` 32 | 一个简单的示例, pyside提供和pyqt API级别的互通, 方便pyqt用户迁移. 与pyqt代码的区别, 只在import的时候把PyQt4改成PySide就好了: 33 | 34 | .. code-block: python 35 | 36 | from PySide.QtCore import * 37 | from PySide.QtGui import * 38 | 39 | app = QApplication([]) 40 | lb = QLabel('

hello world!

') 41 | lb.show() 42 | app.exec_() 43 | 44 | UI 45 | `````````````````````````````````````` 46 | 看起来写代码还OK, 我们看一些其他的功能, 比如如何支持ui. 我们用qtdesigner写好了ui文件, 如何在pyside下面使用? 47 | 48 | pyqt有几种方式: 49 | 50 | - 采用pyuic4把ui文件转换为python代码. pyside也有一个这样的工具, 名称是pyside-uic.(还有pyside-rcc, pyside-lupdate与pyqt对应) 51 | 52 | - 代码中动态导入, pyqt的代码是这样写的: 53 | 54 | .. code-block:: python 55 | 56 | form, base = uic.loadUiType("score.ui") 57 | class ScoreDlg(QDialog, form): 58 | def __init__(self): 59 | super(ScoreDlg, self).__init__() 60 | self.setupUi(self) 61 | 62 | 在pyside里面, 直接生成一个对象的方法: 63 | 64 | .. code-block:: python 65 | 66 | from PySide.QtUiTools import QUiLoader 67 | loader = QUiLoader() 68 | widget = loader.load('mywidget.ui') 69 | widget.show() 70 | 71 | 我上pyside的maillist, 找到了动态生成的方式, 把代码放在这里吧: 72 | 73 | .. code-block:: python 74 | 75 | class MyQUiLoader(QUiLoader): 76 | def __init__(self, baseinstance): 77 | super(MyQUiLoader, self).__init__() 78 | self.baseinstance = baseinstance 79 | 80 | def createWidget(self, className, parent=None, name=""): 81 | widget = QUiLoader.createWidget(self, className, parent, name) 82 | if parent is None: 83 | return self.baseinstance 84 | else: 85 | setattr(self.baseinstance, name, widget) 86 | return widget 87 | 88 | def loadUi(uifile, baseinstance=None): 89 | loader = MyQUiLoader(baseinstance) 90 | ui = loader.load(uifile) 91 | QMetaObject.connectSlotsByName(ui) 92 | return ui 93 | 94 | 然后, 我们就可以用loadUi来扩展一个类了: 95 | 96 | .. code-block:: python 97 | 98 | class Inputer(QDialog): 99 | def __init__(self): 100 | super(Inputer, self).__init__() 101 | loadUi('draw.ui', self) 102 | self.leInput.returnPressed.connect(self.input) 103 | ... 104 | 105 | QML, QML! 106 | `````````````````````````````````````` 107 | pyside可以和qml一起使用, 不过我对qml不熟悉, 等以后熟悉了再来修改具体的示例吧. 你可以直接看 `pyside示例代码`_ 里面关于declarative的部分. 108 | 109 | 结论 110 | -------------------------------------- 111 | 经过测试, pyside现在大致可用, 不过在一些地方会有bug, 现在是beta版本, 根据这个态势, 很快就能稳定了. 如果因为pyqt价格问题观望的同学, 现在可以下手pyside了, 也可以当当小白鼠, 为开源社区做点贡献(从我做起吧). 112 | 113 | 资源 114 | -------------------------------------- 115 | 116 | - `pyside `_ 官方网站 117 | - `pyside文档 `_ 118 | - `pyside示例代码 `_ 119 | - `pyside源码库 `_ 120 | -------------------------------------------------------------------------------- /python-pype介绍.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.deltat.com/uploaded/inline_pipe_heater_from_Convectronics.JPG 2 | :width: 600 3 | :align: center 4 | 5 | 6 | 什么是pipe? 7 | ---------------------------- 8 | 在python里面实现命令行的pipe功能, 比如 9 | 10 | .. code-block:: python 11 | 12 | [1,3,2,0] | sort 13 | 14 | 介绍在这里: http://blog.csdn.net/lanphaday/archive/2011/03/29/6287114.aspx 15 | 16 | 安装只需要 :: 17 | 18 | easy_install pipe 19 | 20 | 我写了一个小用法: 21 | 22 | 在ruby下面有这样的魔法: 1.hours.ago, 它估计是采用修改整型这个类的方式来做的, 这样太不pythonic.. (不知道我说错没有?) 23 | 24 | 利用pipe的话, 可以这样写 :: 25 | 26 | 1 | hour | ago 27 | 28 | 代码如下: 29 | https://bitbucket.org/linjunhalida/code-example/src/tip/python/1hourago.py 30 | 31 | 个人觉得这个东西完全可以扩展到python核心模块中去了. 32 | 33 | pipe是如何实现的? 34 | ----------------------------- 35 | 36 | 官方网站: https://github.com/JulienPalard/Pipe 37 | 38 | 我本来以为它是修改了python核心模块, 结果发现它只是这样的: 39 | 提供pipe功能的东西都继承至Pipe类: 40 | 41 | .. code-block:: python 42 | 43 | class Pipe: 44 | def __init__(self, function): 45 | self.function = function 46 | 47 | def __ror__(self, other): 48 | return self.function(other) 49 | 50 | 核心在于 __ror__, 这个函数对应的就是 | 符号, 不过是右值的. 51 | 52 | 比如: 当python在解析 [1, 2, 3] | sort 的时候, 如果发现无法在左边的list里面找到or比较的函数的时候, 53 | 就会去调用右边的函数__ror__, 54 | 就会出现我们想要的结果: 把左边的值传给 sort.function 去执行. 55 | 56 | 核心代码少得可怜, 大家都可以去观摩下: https://github.com/JulienPalard/Pipe/blob/master/pipe.py 57 | -------------------------------------------------------------------------------- /qt编译加速以及使用预编译头.rst: -------------------------------------------------------------------------------- 1 | 方法 2 | ---------------------- 3 | 4 | 上次讲了如何使用预编译头来加速编译,现在给出一个Qt程序实际的例子,来演示 5 | 预编译头的好处. 6 | 7 | 我们采用qmake来编译Qt程序,qmake本身支持预编译头, 8 | 文档在这:http://doc.trolltech.com/3.3/qmake-manual-7.html 9 | 10 | 使用方法很简单,在pro文件里面加上这几行即可:: 11 | 12 | PRECOMPILED_HEADER = lib.hpp #头文件名 13 | CONFIG += precompile_header #设置使用预编译头功能 14 | 15 | 示例 16 | ---------------------- 17 | 18 | 以下是我测试项目的例子. 文件目录:: 19 | 20 | halida@halida-desktop:~/temp/build-qt$ ls 21 | build-qt.pro lib.hpp main.cpp shower.cpp shower.hpp 22 | 23 | 没有使用预编译头时消耗的时间:: 24 | 25 | halida@halida-desktop:~/temp/build-qt$ touch *.cpp 26 | halida@halida-desktop:~/temp/build-qt$ time make>>/dev/null 27 | real 0m7.292s 28 | user 0m4.696s 29 | sys 0m2.340s 30 | 31 | 使用预编译头后消耗的时间:: 32 | 33 | halida@halida-desktop:~/temp/build-qt$ touch *.cpp 34 | halida@halida-desktop:~/temp/build-qt$ time make>>/dev/null 35 | real 0m2.416s 36 | user 0m1.324s 37 | sys 0m1.004s 38 | 39 | 很明显,提升了相当多的速度. 40 | 41 | 例子可以在这里下载: http://linjunhalida.72pines.com/files/2010/09/build-qt.zip 42 | -------------------------------------------------------------------------------- /qwt介绍与使用.rst: -------------------------------------------------------------------------------- 1 | 什么是Qwt? 2 | ---------------------- 3 | 4 | .. image:: http://qwt.sourceforge.net/plot.png 5 | 6 | `Qwt `_ 是一个Qt的第三方库, 它的作用是为了方便一些科学技术相关领域GUI程序的开发. 它提供了一些好的控件: 2D谱图的绘制, 示波器等仪器上面有的控件:比如旋钮什么的. 7 | 8 | 我使用它, 是因为我要画曲线图, 频谱图等一系列科学领域需要展示的东西. 其实, 任何数据图, 都可以采用Qwt来绘制. 个人觉得它Qt里面最好用的画谱图工具. 对了, 它的性能很好, 可以做实时显示数据. 9 | 10 | Qwt官方网站上面没有一步步的教程, 但是API的文档很全, 并且代码库中带有有很多例子可以参考. 因为我现在是采用pyqt做开发, 所以我使用 `pyqwt `_ 这个python下面的绑定. 上面也有很多示例. 虽然是python的代码, 我想, C++程序员照样能够看懂(应该说所有的程序员都应该可以看懂..) 11 | 12 | Qwt架构 13 | ---------------------- 14 | 15 | Qwt的架构很简单, 官方文档上面虽然没有说, 但是我整理了一下: 16 | 17 | :: 18 | 19 | QwtPlot 20 | | 21 | |------- QwtPlotCurve 22 | | 23 | |------- QwtPlotCurve 24 | 25 | QwtPlot就是谱图显示的控件, 任何需要显示的曲线(包括网格什么的), 都是QwtPlotCurve, 一个QwtPlot上面可以放很多的QwtPlotCurve. 26 | 27 | 具体职责: 28 | 29 | - `QwtPlot `_ 负责坐标的部分, 比如显示的范围, X轴Y轴什么的. 要注意的是, 它可以有多个X和多个Y, 方便不同Y值的谱图叠在一起. 30 | - QwtPlotCurve负责如何去绘制谱图, 比如画直方图, 网格什么的. 它还有一个子类: `QwtPlotMarker `_, 可以对谱图的特定位置做标记. 31 | 32 | 上代码 33 | -------------------- 34 | 35 | 下面是我的一个实例代码, 内容就是负责画一个直方图, 效果如下: 36 | 37 | .. image:: http://bitbucket.org/linjunhalida/code-example/raw/tip/qwt/barplot.png 38 | :width: 600 39 | 40 | 代码在 `这里 `_ . 41 | 42 | -------------------------------------------------------------------------------- /rails_deploy方法之采用passenger.rst: -------------------------------------------------------------------------------- 1 | 这里整理一下rails deploy的几种方法. 2 | 3 | Passenger 4 | ----------------------------- 5 | 6 | 首先是最简单的采用 `Phusion Passenger `_, 现在大家都用nginx了吧, 那么下面主要还是看 `passenger和nginx的配置 `_. 7 | 8 | 首先安装passenger: 9 | 10 | .. code-block:: sh 11 | 12 | gem install passenger 13 | 14 | 然后安装nginx插件, 需要系统权限, 所以采用rvmsudo: 15 | 16 | .. code-block:: sh 17 | 18 | rvmsudo passenger-install-nginx-module 19 | 20 | 然后设置nginx: (sudo vi /opt/nginx/conf/nginx.conf) 21 | 22 | .. code-block:: sh 23 | 24 | http { 25 | passenger_root /somewhere/passenger-x.x.x; 26 | passenger_ruby /usr/bin/ruby; 27 | passenger_max_pool_size 10; 28 | 29 | gzip on; 30 | 31 | server { 32 | server_name www.foo.com; 33 | listen 80; 34 | root /webapps/foo/public; 35 | passenger_enabled on; 36 | passenger_use_global_queue on; 37 | } 38 | } 39 | 40 | 修改完设置之后重新启动nginx: 41 | 42 | .. code-block:: sh 43 | 44 | sudo /opt/nginx/sbin/nginx -s reload 45 | 46 | 重启服务的话只要: 47 | 48 | .. code-block:: sh 49 | 50 | touch /webapps/mycook/tmp/restart.txt 51 | 52 | 基本上这样就可以了. passenger工作的方式还是基于多进程, 它会根据一套算法, 来计算开启多少个线程, 以及如何生成进程, 来响应用户请求. 53 | 54 | 最好要看一下 passenger_spawn_method 和 Spawning methods explained 的部分, 了解一下工作原理. Analysis and system maintenance这部分也最好看看. 55 | 56 | 不过听说passenger只是给初学者用的, 大家会用其他的可配置的工具. 比如 `unicorn `_ 等等. 57 | 58 | 这里再补充一下unicorn的使用方法, 基本上gem install unicorn, 然后执行unicorn_rails -p 8080就可以了. 在nginx上面设置一下端口转发80到8080就能用了. 这里有一个 `unicorn nginx的示例 `_ 可以抄. 59 | -------------------------------------------------------------------------------- /rails_ubuntu_安装.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://tech.chitgoks.com/wp-content/uploads/2009/07/ruby_rails.png 2 | :align: center 3 | 4 | 安装rvm 5 | --------------------- 6 | 7 | 首先, 安装源里面的ruby, git, curl等依赖 8 | 9 | .. code-block:: bash 10 | 11 | sudo apt-get install ruby git-core curl zlib1g-dev libssl-dev libsqlite3-dev libreadline-dev g++ libxml2-dev libxslt1-dev libmysqlclient-dev autoconf 12 | 13 | 然后安装rvm (按照 https://rvm.beginrescueend.com/rvm/install/ ) 14 | 15 | .. code-block:: bash 16 | 17 | bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) 18 | 19 | 把环境加到shell path里面 20 | 21 | .. code-block:: bash 22 | 23 | echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile 24 | 25 | 不过我发现bash好像不调用.bash_profile, 所以还是用.bashrc吧 26 | 27 | .. code-block:: bash 28 | 29 | echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bashrc 30 | 31 | 32 | 重新加载 33 | 34 | .. code-block:: bash 35 | 36 | source .bash_profile 37 | 38 | 测试rvm是否装好了 39 | 40 | .. code-block:: bash 41 | 42 | type rvm | head -1 43 | 44 | 安装ruby1.9.3 45 | 46 | .. code-block:: bash 47 | 48 | rvm install 1.9.3 49 | 50 | 设置默认环境 51 | 52 | .. code-block:: bash 53 | 54 | rvm use 1.9.3 --default 55 | 56 | 安装rails 57 | ------------------------- 58 | 59 | gem安装即可 60 | 61 | .. code-block:: bash 62 | 63 | gem install rails 64 | 65 | mysql设置 66 | ------------------------- 67 | 68 | rails默认db是sqlite, 为了调试, 也可能整成mysql的, 这里也加上mysql方面的设置方式. 69 | 70 | 安装mysql 71 | 72 | .. code-block:: bash 73 | 74 | sudo apt-get install mysql-server 75 | 76 | mysql默认编码是latin, 我们要改成utf8, 修改/etc/mysql/my.cnf, 77 | 78 | * 在[mysql] 的下面加上 default-character-set=utf8 这一段代码. 79 | * 在[client] 的下面加上 default-character-set=utf8 这一段代码. 80 | * 在 [mysqld] 下面加上 default-character-set=utf8 这一段代码. 81 | 82 | 设置完后需要重启mysql: 83 | 84 | ..code-block:: bash 85 | 86 | sudo service mysql restart 87 | 88 | 然后我们重置mysql root密码 89 | 90 | .. code-block:: bash 91 | 92 | sudo dpkg-reconfigure mysql-server 93 | 94 | 进入命令行: mysql -u root -p 95 | 96 | 然后在密码提示上面设置一个root密码. 97 | 98 | 进入命令行后, 我们需要 99 | 100 | .. code-block:: bash 101 | 102 | # 创建一个数据库 103 | create database test; 104 | # 建立对应的mysql的用户 105 | create user tester identified by '密码'; 106 | # 设置权限 107 | grant all privileges on test.* to tester; 108 | 109 | postgresql设置 110 | ------------------------- 111 | 我们也可以设置采用postgresql。 112 | 113 | 安装postgresql 114 | 115 | .. code-block:: bash 116 | 117 | sudo apt-get install postgresql postgresql-client 118 | 119 | 120 | 进入命令行后, 我们需要加上用户和数据库: 121 | 122 | .. code-block:: bash 123 | 124 | sudo -u postgres psql postgres << EOF 125 | CREATE DATABASE test; 126 | CREATE USER test WITH PASSWORD 'test'; 127 | GRANT ALL PRIVILEGES ON DATABASE test to test; 128 | EOF 129 | 130 | 好了, 现在东西都已经可以用了, 开始干活吧. 131 | 132 | 133 | issues 134 | --------------------------------------------- 135 | 如果sqlite安装出现问题, 需要 136 | 137 | .. code-block:: bash 138 | 139 | sudo apt-get install libsqlite3-dev 140 | gem install sqlite3-ruby 141 | -------------------------------------------------------------------------------- /rails介绍.rst: -------------------------------------------------------------------------------- 1 | 我现在算是一个rails程序员了, 作为一门技术的使用者, 必要的时候要向其他人推广和介绍这门技术, 下面是我准备的slide, 不定期更新。 2 | 3 | .. raw: 4 | 5 | 6 | -------------------------------------------------------------------------------- /reStructuredText介绍.rst: -------------------------------------------------------------------------------- 1 | .. include:: 2 | 3 | ================================ 4 | reStructuredText介绍 5 | ================================ 6 | 7 | :Authors: 机械唯物主义 8 | :Date: 2010-11-10 9 | 10 | 什么是reStructuredText? 11 | ================================ 12 | 一种写文档的方式. 简称: ReST_ 13 | 14 | .. class:: handout 15 | 16 | 已经有那么多的写文档的方式了, 为什么要用它? 17 | 18 | .. class:: incremental 19 | 20 | * 简单, 现场学,现场会 21 | * 易读 22 | * 方便生成html/pdf等其他格式 23 | 24 | .. class:: handout 25 | 26 | Q: 有wiki了, 为什么还用它? 27 | 28 | A: 恩恩, 目标不一样, rest是用来嵌入到代码注释中的.. 29 | 30 | 怎么玩? 31 | ================================ 32 | 33 | 不多说, 直接用: http://goo.gl/1jNF4 34 | 35 | .. class:: handout 36 | 37 | 大家可以上 http://www.tele3.cz/jbar/rest/rest.html 或者: http://goo.gl/1jNF4 直接试用 38 | 39 | 语法 40 | ================================ 41 | 42 | .. class:: handout 43 | 44 | 那么具体的语法怎么学呢? 45 | 何必再写一份? 大家自己看就好了哈 46 | 我也看不懂多少英文, 但是会抄就好了.. 47 | 48 | There should be one-- and preferably only one --obvious way to do it. 49 | 50 | google: rest 51 | 52 | http://docutils.sourceforge.net/docs/user/rst/quickstart.html 53 | http://docutils.sourceforge.net/docs/user/rst/quickref.html 54 | 55 | 如何生成其他格式 56 | ================================ 57 | 58 | 需要安装docutils 59 | 60 | * html: 有个东西叫rst2html:: 61 | 62 | rst2html xxx.rst xxx.html 63 | 64 | * pdf: 有个东西叫rst2pdf:: 65 | 66 | rst2pdf xxx.rst 67 | 68 | * latex: 有个东西叫rst2latex:: 69 | 70 | rst2latex --input-encoding=utf-8 --output-encoding=utf-8 xxx.rst >> s.tex 71 | 72 | .. class:: handout 73 | 74 | 没有弄明白rst2pdf如何弄中文.. 发了 `issue `_ 75 | 76 | python code 77 | ================================ 78 | 79 | .. code-block:: python 80 | 81 | from docutils.core import publish_string 82 | content = publish_string( 83 | source="doc here" 84 | writer_name='html' 85 | ) 86 | 87 | 我用它来干什么? 88 | ================================ 89 | 90 | * 写博客 91 | * 写文档 92 | * 问题: 好像没有支持ReST的网站.. 93 | 94 | 连接 95 | ================================ 96 | 97 | * 官方网站: ReST_ 98 | 99 | .. _ReST: http://docutils.sourceforge.net/rst.html#try-it-online 100 | -------------------------------------------------------------------------------- /readme.markdown: -------------------------------------------------------------------------------- 1 | Please check my blog: http://blog.linjunhalida.com 2 | 3 | This project is expired, source code change to: https://github.com/halida/halida.github.com 4 | -------------------------------------------------------------------------------- /resque介绍和分析.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://a248.e.akamai.net/assets.github.com/img/7744a8503993132e8a14c79be38e3724c6564fa2/687474703a2f2f696d672e736b697463682e636f6d2f32303130303131312d6b6d326635676d747062713233656e70756a6272756a366d676b2e706e67 2 | :align: center 3 | :width: 600 4 | 5 | resque 6 | -------------------------------- 7 | resque是ruby on rails下面的一个异步工作分配框架, 它利用redis的队列功能, 来达到异步处理工作的目的. 好处在于使用简便以及很容易和rails整合. 8 | 9 | 项目地址在 https://github.com/defunkt/resque, 如何使用里面写的很清楚, 这里就不多说了. 具体逻辑也没有什么好说的, 无非是需要调用任务了, 塞任务到队列里面, 然后worker取队列, 然后把任务做掉. 10 | 11 | 一些细节: 12 | 13 | **resque是如何enque的?** 14 | 15 | .. code-block:: ruby 16 | 17 | redis.rpush "queue:#{queue}", encode(item) 18 | 19 | **presistance如何做?** 20 | 21 | .. code-block:: ruby 22 | 23 | encode: MultiJson.decode(object) 24 | 25 | **resque是如何取work的?** 26 | 27 | .. code-block:: ruby 28 | 29 | decode redis.lpop("queue:#{queue}") 30 | 31 | resque-scheduler 32 | -------------------------------- 33 | 34 | resque-scheduler是基于resque的一个计划任务插件, 简单地说, 就是能够利用它来做一些定时和定时循环的任务. 项目主页: https://github.com/bvandenbos/resque-scheduler, 使用方法我也不多说了. 项目主页上都有. 35 | 36 | **resque-scheduler计划的队列如何处理?** 37 | 38 | .. code-block:: ruby 39 | 40 | # First add this item to the list for this timestamp 41 | redis.rpush("delayed:#{timestamp.to_i}", encode(item)) 42 | 43 | # Now, add this timestamp to the zsets. The score and the value are 44 | # the same since we'll be querying by timestamp, and we don't have 45 | # anything else to store. 46 | redis.zadd :delayed_queue_schedule, timestamp.to_i, timestamp.to_i 47 | 48 | 竟然根据每个timestamp做了一个队列.. 计划任务都保存到一个sorted set里面. 49 | 50 | **scheduler如何检查是否有新的任务?** 51 | 52 | 核心在于这段代码: 53 | 54 | .. code-block:: ruby 55 | 56 | if timestamp = Resque.next_delayed_timestamp(at_time) 57 | enqueue_delayed_items_for_timestamp(timestamp) 58 | 59 | resque_scheduler.rb: 60 | 61 | def next_delayed_timestamp(at_time=nil) 62 | items = redis.zrangebyscore :delayed_queue_schedule, '-inf', (at_time || Time.now).to_i, :limit => [0, 1] 63 | timestamp = items.nil? ? nil : Array(items).first 64 | timestamp.to_i unless timestamp.nil? 65 | end 66 | 67 | enqueue_delayed_items_for_timestamp比较复杂, 就不贴了. 68 | 69 | 结论 70 | ------------------------------- 71 | 基本上resque的逻辑很直观, 和想象中的一样. resque-scheduler就不一样了. 复杂很多. 72 | 73 | 我学习他们的示例代码放在: https://bitbucket.org/linjunhalida/code-example/src/tip/ruby/resque/ 74 | -------------------------------------------------------------------------------- /rspec.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://www.rapleaf.com/images/developers/open_source/rspec.gif 2 | :align: center 3 | 4 | 我现在在做的 `GuruDigger `_ 项目一直没有用测试框架, 最近我做了几次大的重构, 结果出现了许多bug, 为了能够保证以后项目不会在重构中挂掉, 我还是需要把测试给整起来. 5 | 6 | rails的测试框架用得比较多的是rspec. 7 | 8 | rspec的原理 9 | ---------------------- 10 | 我们有一段代码: 11 | 12 | .. code-block:: ruby 13 | 14 | def exp number n 15 | result = 1 16 | n.times.each{result *= number} 17 | result 18 | end 19 | 20 | 我们需要给出一个单元测试. rspec的写法是这样的: 21 | 22 | .. code-block:: ruby 23 | 24 | describe exp do 25 | it "should work" do 26 | exp(2, 3).should == 8 27 | exp(5, 3).should == 125 28 | exp(1, 3).should == 1 29 | end 30 | end 31 | 32 | 我们来解释一下. 里面的describe和it是什么意思呢? rspec里面的测试是采用描述性的方式进行的. describe说明具体描述的是什么东西, it指代这个东西它的行为应该是怎么样. 上面的代码一方面做好了测试, 另外一方面也直观地描述了这个方法需要做的事情, 符合人类直觉. 33 | 34 | 然后, 我们看具体验证的部分. 和其他单元测试框架的 assert_equal 函数不同, rspec-expectations 修改了Kernel, 给了一个should方法. 这样让原先的外层函数调用, 变成了内层的方法调用, 造成的结果就是写起来超级直观. 这个算是ruby比较常用的套路了. 35 | 36 | should的写法可以去看 `rspec-expectations的文档 `_. 37 | 38 | https://github.com/rspec/rspec-mocks 这一块不太容易懂, 需要看看. 39 | 40 | factory_girl 41 | ---------------------- 42 | factory_girl是取代rails默认生成测试数据的yml格式的一种写法, 原生ruby, 写起来比较舒服和能够嵌入ruby代码. 43 | 44 | .. code-block:: ruby 45 | 46 | # 定义一个对象 47 | FactoryGirl.define do 48 | factory :user do 49 | first_name 'John' 50 | last_name 'Doe' 51 | admin false 52 | end 53 | end 54 | 55 | # 用到的时候build一下就好. 56 | user = FactoryGirl.build(:user) 57 | 58 | 网上也有很详细的教程: 59 | 60 | https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md 61 | 62 | rspec和rails整合 63 | ---------------------- 64 | 上面是rspec做测试的部分, 下面我们看如何和rails整合. 其实文档都全了, 我觉得大家还是直接去看官方的文档就好: 65 | 66 | https://github.com/rspec/rspec-rails 67 | 68 | 重点是测试的几个类型. 69 | 70 | rspec加上spork 71 | --------------------------------- 72 | rspec跑一遍下来超级慢, 于是就有了 `spork `_ 这样的东西. 原理就是先跑一个服务器, 加载好对应的环境. 然后需要执行测试的时候, 就通知这个服务器开始测试. 服务器会fork一下, 执行对应的测试. 73 | 74 | 如何使用上面的文档都有. 重点是几步: 75 | 76 | - 用spork --bootstrap初始化spec_helper.rb, 把每次fork需要做的事情填到对应的方法里面去. 77 | - 跑服务器, 执行spork 78 | - 跑测试. 执行rspec --drb 79 | 80 | 配置 81 | ---------------------- 82 | 这里有别人贴出来的配置, 还是挺复杂的, 需要搞搞清楚. 但是搞清楚了, 开发起来你会发现非常舒服(前提是你的机器够好...) 83 | https://gist.github.com/1191428 84 | 85 | 一些资料 86 | ---------------------- 87 | 88 | rspec书籍: 89 | http://pragprog.com/book/achbd/the-rspec-book 90 | 91 | rspec cheetsheet: 92 | http://cheat.errtheblog.com/s/rspec/ 93 | 94 | capybara cheetsheet: 95 | https://gist.github.com/428105 96 | http://cheat.errtheblog.com/s/rspec_shoulda/ 97 | 98 | rspec最佳实践: 99 | http://eggsonbread.com/2010/03/28/my-rspec-best-practices-and-tips/ 100 | 101 | 102 | -------------------------------------------------------------------------------- /ruby_on_rails.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.webaxes.com/wp-content/uploads/2010/06/ruby-on-rails.jpg 2 | :align: center 3 | :width: 600 4 | 5 | 最近有项目要用到ruby on rails, 于是下载了书, 看了一段时间. 6 | 7 | 具体学习方法 8 | ---------------------------- 9 | 10 | 根据专家意见, 直接看ruby on rails guide. 11 | 12 | 学习时间, 连同ruby, 在一周时间. 根据我个人的体会, 也差不多. (前提是web程序员) 13 | 14 | 个人感觉 15 | ---------------------------- 16 | 17 | * ror哲学是convention over configuration, 就是约定大于配置. 18 | 比如默认约定xxx/是指向xxx/index, 你直接修改index.html.erb模板文件即可., post xxx/ 会自动指向create方法, 等等.. 19 | * 大量的生成器. 命令行自动生成view/model等等. 20 | * 内嵌功能, 你想要的东西都有, 对于常见的模块, 比如分页, 用户验证, 管理什么的都有直接的模块可以调用. 21 | * ruby这种魔法语言, 可以让代码量减少到非常低的程度. 22 | 23 | 这样的结果就是, 你写的东西(包括输入的命令)非常地少, 信息密度和产能非常地高.. 开发愉快, 不伤手指. 24 | 25 | 再加上这个东西比较容易学(一周), 那么我有一个疑问: 为什么大家不去学ror呢? 26 | -------------------------------------------------------------------------------- /ruby_on_rails初探.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.webaxes.com/wp-content/uploads/2010/06/ruby-on-rails.jpg 2 | :width: 600 3 | :align: center 4 | 5 | 好吧, 昨天看了一下ruby, 今天就要来看看ruby on rails了. 6 | 7 | 哲学 8 | ---------------- 9 | 10 | - DRY: 不写重复的东西 11 | - 约定取代设置: rails假定了你要做的事情, 而不是你自己设置一切. 12 | - REST方式. 13 | 14 | 教程 15 | ---------------- 16 | 17 | 这里是一篇 `rails教程 `_, 按照上面的指示做一遍, 就对rails的思路和哲学有了一定了解了, 这里就不再重复. 18 | 19 | 整体架构 20 | ---------------- 21 | .. image:: http://dedicatedwebserverhosting.co.uk/Images/Tools%20for%20Ruby%20on%20Rails-2.png 22 | 23 | 如上图, rails采用MVC架构. 进来的http请求, 交由Dispatcher分发给(设置文件是app/routes.rb)对应的controller(app/controller下面), 然后controller把数据交给view(app/views)渲染返回. 24 | 25 | 特性 26 | ---------------- 27 | 28 | 自动代码生成 29 | ```````````````` 30 | 31 | rails3里面可以用命令直接生成大量代码 :: 32 | 33 | rails generate controller home index 34 | rails generate scaffold Post name:string title:string content:text 35 | 36 | 运行之后生成了一堆文件. 节省了工作, 但是对于有洁癖的人来说, 会很不舒服. 37 | 38 | 快捷方式 39 | ```````````````` 40 | 41 | rails提供了很多快捷方式以减少代码量, 比如对数据做验证: 42 | 43 | .. code-block:: ruby 44 | 45 | class Post < ActiveRecord::Base 46 | validates :name, :presence => true 47 | validates :title, :presence => true, 48 | :length => { :minimum => 5 } 49 | end 50 | 51 | 比如访问权限控制: 52 | 53 | .. code-block:: ruby 54 | 55 | class PostsController < ApplicationController 56 | 57 | before_filter :authenticate, :except => [:index, :show] 58 | 59 | # GET /posts 60 | def index 61 | @posts = Post.all 62 | ... 63 | 64 | 这些看起来是ruby的哲学, 减少了代码量的同时, 把复杂度隐藏到framework里面了, 不好说是好事还是坏事. 65 | 66 | 结论 67 | ---------------- 68 | 按照上面的教程走了一遍, 个人感觉: 69 | 70 | - 它注重快速开发, 用最少的代码来生成最多的功能. 71 | - ruby on rails采用命令来生成大量代码, 我个人非常不喜欢, 因为不够简洁. 但是对于快速开发, 这个方式节省了大量的编码工作. 72 | - 它假设了一条最好的方式来做开发, 并鼓励开发者走这条道路. 73 | - 个人觉得, 适合一次又一次地开发同类型的网站. 74 | 75 | 上面只是对rails的初探, 很不完全, 也不深入. 如果有机会开发过一个项目, 76 | 可能有更深刻的体会. 但是还有其他的很多事情在等着我... 这个就先放下吧. 77 | -------------------------------------------------------------------------------- /sconstruct: -------------------------------------------------------------------------------- 1 | Command('up', [], 2 | ['hg add', 3 | 'hg ci -m "update"', 4 | 'hg push']) 5 | 6 | Command('down', [], 7 | ['hg pull', 8 | 'hg up']) 9 | 10 | Command('publish', 'up', 11 | ['ssh server.linjunhalida.com "cd /data/workspace/blog-src/;hg pull;hg up; cd /data/workspace/mysite/;make blog_update"', 12 | 'o http://blog.linjunhalida.com']) 13 | 14 | # for test 15 | if 'test' in COMMAND_LINE_TARGETS: 16 | import os, webbrowser 17 | file = ARGUMENTS.get('f', '') 18 | os.system('rst2html %s > temp/s.html' % file) 19 | webbrowser.open('temp/s.html') 20 | 21 | Command('test', [],'echo "ok"') 22 | -------------------------------------------------------------------------------- /scons介绍.rst: -------------------------------------------------------------------------------- 1 | 什么是scons? 2 | -------------------------- 3 | .. image:: http://www.gastronomiaycia.com/wp-content/uploads/2008/07/scones.jpg 4 | 5 | scons不是上面的小甜饼, 而是一个基于python的自动化构建工具. 和make一个性质. 不过, 更高级一些. 6 | 7 | 为什么要用它呢? 8 | -------------------------- 9 | 10 | - 高阶的make工具 11 | 12 | make是不错, 但是太过简单了, 很多东西都要重复写, 很多事情都做不了.. 我们需要一个更高级的工具. 13 | 14 | - python 15 | 16 | 既然我们要用更高级的工具, 去找找看: automake, cmake, qmake, ant.. 已经有一堆东西了, 我们选择哪一个呢? 17 | 18 | 按照我的看法, 对于任何复杂的工具, 本质上来说, 都需要一个足够强大的编程语言来支持, 以便实现自动化和高可配置性. 19 | 既然python已经成为我的"main stream"语言, 当然要看支持python的工具了. google python + make, 第一个结果就是scons了. 20 | 当然, 还有很多其他的 `pyghon构建工具 `_ 可以选择. 21 | 22 | 安装 23 | -------------------------- 24 | 25 | - debian源: 26 | 27 | :: 28 | 29 | sudo apt-get install scons 30 | 31 | - 或者直接在安装了python的环境里面easy_install: 32 | 33 | :: 34 | 35 | eays_install scons 36 | 37 | 对了, 如果在windows下面, easy_install安装后有可能出现: import error: 找不到Scons.Script. 38 | 我研究了一下, 发现在scons放的位置不对, 只要搜索下把scons的目录放到dist-packages文件夹里面就好了. 39 | 40 | 一个简单的示例 41 | -------------------------- 42 | 43 | 我们直接去看一个示例吧, 目标是编译一个hello world c程序: 44 | 45 | 46 | .. code-block:: sh 47 | 48 | # 新建一个目录 49 | rm t1 -rf; mkdir t1; cd t1 50 | 51 | # 这里是我们的程序 52 | cat > hello.c < 54 | int main(){ 55 | printf("hello, world!\n"); 56 | return 0; 57 | } 58 | EOF 59 | 60 | # scons的脚本文件名称是SConstruct/Sconstruct/sconstruct, 如果直接执行scons, 会按照上面的顺序找文件. 和make类似. 61 | cat > sconstruct <> summary']) 151 | 152 | 结论 153 | -------------------------- 154 | 看起来scons还是有点意思的, 我先用一段时间, 等有了一定的感觉之后再来看看. 155 | 156 | 资源 157 | -------------------------- 158 | 159 | - `scons官方文档 `_ 160 | -------------------------------------------------------------------------------- /shpaml介绍.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.rubyinside.com/wp-content/uploads/2007/03/haml.jpg 2 | :align: center 3 | 4 | 不知道大家是否都写过html或者xml, 里面尖括号真是既然写又难看, 这里推荐给大家一个非常好用的工具: `shpaml`_. 5 | 6 | `shpaml`_ 是借鉴 `haml`_ (就是上面那个图片啦) 的一个工具, 可以极大地简化html/xml的编写工作. 并且不像haml那么重量级. 7 | 8 | shpaml的生成工具只是一个简单的python文件, 你只需要在 `这里 `_ 下载即可. 整个文件只有365行! 9 | 10 | 简单尝试一下 11 | ----------------------- 12 | 13 | 我们来看一个实际的例子. 比如我们需要写下面的html代码: 14 | 15 | .. code-block:: html 16 | 17 | 18 | 19 |
20 |
21 |
22 |
23 |
24 |
25 | 27 |
28 |
29 | 31 | 34 |
35 | 36 | 37 | 38 | 即使能够利用工具来自动生成很多文本, 上面的代码也非常难以阅读. 但是用shpaml的方式就不一样了 :: 39 | 40 | html 41 | body 42 | #top-nav 43 | #top-nav-items 44 | > hr 45 | 46 | #wrapper 47 | #header 48 | #content 49 | #sidebar 50 | #footer 51 | @2010 linjunhalida, all right reserved 52 | 53 | 是不是感觉一下清爽很多? 写起来也不那么废手指了? 54 | 55 | 具体语法, 直接查阅 `shpaml官方教程 `_ , 很简单的, 半小时搞定. 56 | 57 | 生成html代码 58 | -------------------- 59 | 60 | 那么接下来我们如何把上面的文本生成html代码呢? 先保存成一个文件: xxx.shp, 然后运行 :: 61 | 62 | python shpaml.py xxx.shp > xxx.html 63 | 64 | shpaml.py在 `这里`_ 下载. 65 | 66 | 打开xxx.html, 是不是和上面的html一模一样? 其他生成方法, 可以见 `shpaml源码页面 `_. 67 | 68 | 结论 69 | ------------------- 70 | - shpaml采用缩进的方式来表示层级的递进, 这个方法和python的方法一致, 对于python程序员来说应该会很亲切. 71 | - shpaml用python写成, 整个代码只在一个文件里面, 感兴趣的同学可以学习学习. 它也非常容易嵌入到其他web框架中去. 72 | - 同样的, 如果你发现一个数据源存在很多的冗余信息(就像上面的html/xml), 可以仿照shpaml的方法, 来实现一个上层的模板语言. 73 | 74 | 希望你和我一样, 喜欢上shpaml. 75 | 76 | .. _`shpaml`: http://shpaml.webfactional.com/ 77 | .. _`haml`: http://haml-lang.com/ 78 | -------------------------------------------------------------------------------- /spacechem介绍.rst: -------------------------------------------------------------------------------- 1 | 什么是spacechem? 2 | -------------------------------- 3 | .. image:: http://www.spacechemthegame.com/images/header1.jpg 4 | :width: 600 5 | :align: center 6 | 7 | 独立游戏. linux下可玩. 编程类型游戏. 考智商. 音乐很好听. 官方论坛竟然放在reddit.. 8 | 9 | 简单地说, 就是你需要设置化工厂, 然后把采到的资源, 比如H2O什么的, 分子打散, 组合成需要的物质, 比如酒精.. 具体游戏画面如下: 10 | 11 | 画面1: 12 | 13 | .. image:: http://www.spacechemthegame.com/screenshots/ss1.png 14 | :width: 600 15 | :align: center 16 | 17 | 画面2: 18 | 19 | .. image:: http://www.spacechemthegame.com/screenshots/ss2.png 20 | :width: 600 21 | :align: center 22 | 23 | 画面3: 24 | 25 | .. image:: http://www.spacechemthegame.com/screenshots/ss3.png 26 | :width: 600 27 | :align: center 28 | 29 | 画面4: 30 | 31 | .. image:: http://www.spacechemthegame.com/screenshots/ss4.png 32 | :width: 600 33 | :align: center 34 | 35 | 看起来没有什么感觉? 这里有一个介绍视频: 36 | 37 | .. raw:: html 38 | 39 |
40 | 41 | 以及一个游戏视频: 42 | 43 | .. raw:: html 44 | 45 | 46 | 47 | 估计你快晕了吧... 48 | 49 | 哪里有下? 50 | ----------------------------- 51 | 52 | 官方网址: http://www.spacechemthegame.com/ 53 | 54 | 有试玩下载: http://store.zachtronicsindustries.com/product/spacechem 55 | 56 | 如果你喜欢的话, 可以购买, 价格15美元. 57 | 58 | 我买了, 现在在痛苦通关中... 估计要玩好几个月了... 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /sphinx介绍.rst: -------------------------------------------------------------------------------- 1 | .. include:: 2 | 3 | ================================ 4 | reStructuredText介绍 5 | ================================ 6 | 7 | :Authors: 机械唯物主义 8 | :Date: 2010-11-10 9 | 10 | 什么是sphinx? 11 | ================================ 12 | .. image:: http://www.openerofways.com/images/essays/sphinx.jpg 13 | :width: 600 14 | 15 | .. class:: handout 16 | 17 | sphinx不是那个全文检索引擎! 是一个写文档的工具: sphinx_ 18 | 19 | 它有什么特性? 20 | ================================ 21 | .. class:: incremental 22 | 23 | * python文档所使用的系统 24 | * 输出HTML, LaTeX, manual pages, 纯文本.. 25 | * 层级结构, 内链 26 | * 自动索引 27 | * 语法高亮 28 | * 扩展: graphivz, docstrings, 等等.. 29 | 30 | 让我们开始尝试一下 31 | ================================ 32 | 33 | 安装 34 | easy_install -U Sphinx 35 | 36 | 教程 37 | http://sphinx.pocoo.org/tutorial.html 38 | 39 | 创建一个项目 40 | ================================ 41 | 42 | .. class:: handout 43 | 44 | 新建一个目录, 然后执行下面的命令: 45 | 46 | :: 47 | 48 | sphinx-quickstart 49 | 50 | .. class:: handout 51 | 52 | 只要回答一些问题就好了. 全部默认, 除了一个: 文档和生成的文件不要放在一个目录下, 方便整理 53 | 54 | 会在你指定的目录下面生成一些文件. 我们来看看这些文件吧. 55 | 56 | 目录 57 | ================================ 58 | 59 | :: 60 | 61 | $ find 62 | . 63 | ./Makefile # 工具帮我们生成的makefile 64 | ./build # 生成文档后放置的目录 65 | ./source # 文档源码的位置 66 | ./source/index.rst # 文档的入口 67 | ./source/conf.py # 项目的一些设置, 上面quickstart设置的部分内容可以在里面修改 68 | ./source/_static # 静态文档存放目录 69 | ./source/_templates # 模板存放目录 70 | 71 | 开写哈 72 | ================================ 73 | 74 | .. class:: handout 75 | 76 | 我们开启index.rst, 主要结构是这里, 我们可以在上面加东西扩展文档: 77 | 78 | :: 79 | 80 | Contents: 81 | 82 | .. toctree:: 83 | :maxdepth: 2 84 | 85 | # 我们在这里加内容 86 | intro 87 | tutorial 88 | 89 | .. class:: handout 90 | 91 | 然后我们就可以继续写intro.rst, tutorial.rst等文档了. 92 | 这些文档的格式都采用restructuredtext方式. 93 | 94 | 文档对象 95 | ================================ 96 | 97 | .. class:: handout 98 | 99 | 如果你要写一个python函数的定义, 这样写: 100 | 101 | :: 102 | 103 | .. py:function:: enumerate(sequence[, start=0]) 104 | 105 | Return an iterator that yields tuples of an index and an item of the 106 | *sequence*. (And so on.) 107 | 108 | 这里是连接 :py:func:`enumerate` 109 | 110 | .. class:: handout 111 | 112 | 对应的文档介绍在这里: http://sphinx.pocoo.org/tutorial.html#documenting-objects 113 | 114 | 自动导入代码中的文档 115 | ================================ 116 | 117 | .. class:: handout 118 | 119 | sphinx一个非常好的功能, 就是可以自动嵌入代码中的文档, 如果你有一个模块io.open 120 | 121 | :: 122 | 123 | .. autofunction:: io.open 124 | 125 | .. automodule:: io 126 | :members: 127 | 128 | .. class:: handout 129 | 130 | sphinx必须先知道你的模块位置, 要在 conf.py 里面把目录加到 sys.path 里面去. 131 | 132 | conf.py里面必须加sphinx.ext.autodoc的模块. 133 | 134 | 生成我们需要的格式 135 | ================================ 136 | 137 | .. class:: handout 138 | 139 | 最后我们需要把文档生成我们想要的格式, 方法如下: 140 | 141 | sphinx-build 142 | 143 | $ sphinx-build -b html sourcedir builddir 144 | 145 | make 146 | 147 | $ make html 148 | 149 | 资源 150 | ================================ 151 | 152 | 官方文档 153 | 154 | http://sphinx.pocoo.org/ 155 | 156 | .. _sphinx: http://sphinx.pocoo.org/ 157 | 158 | -------------------------------------------------------------------------------- /sqlalchemy学习.rst: -------------------------------------------------------------------------------- 1 | 什么是sqlalchemy 2 | ========================= 3 | 4 | sqlalchemy是python下面一个专门用来处理sql问题的工具包. 5 | 6 | 纵览 7 | ========================= 8 | 9 | * python里面处理数据库的工具 10 | * 模块区分 11 | 12 | .. image:: http://www.sqlalchemy.org/docs/_images/sqla_arch_small.png 13 | 14 | 15 | -------------------------------------------------------------------------------- /thinking.rst: -------------------------------------------------------------------------------- 1 | the most difficult thing in the world is "thinking", we can do anything if we can escape from it. 2 | 3 | * when we are at school, we memorize the answers and default solutions instead of learning. and after the exam, nothing is left. 4 | * when we are at work, we do only the boss told us to, instead of solve the problems, eventhough it can save us time. 5 | * when after work, we go online for funny, instead of thinking how to use it. 6 | * we follow our parents, we follow the society, instead of go our own path. 7 | * we take others judgement, not our own. 8 | * we use instinct directly, without make a thought. 9 | * we look forward of master keys, silver bullet, leader, god, parents, even money, not ourselves. 10 | 11 | how sad. 12 | 13 | -------------------------------------------------------------------------------- /unicorn配置.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://i.imgur.com/hYztb.png 2 | :align: center 3 | 4 | 什么是unicorn? 5 | ------------------------------------- 6 | `unicorn `_ 是ruby下面的一个基于Rack的HTTP server. 类似的工具有 passenger, thin 等。 7 | 8 | unicorn简单的使用方式 9 | ------------------------------------- 10 | 在你的rails项目下面, 直接执行下面的代码就可以了 :: 11 | 12 | unicorn_rails 13 | 14 | unicorn的原理 15 | ------------------------------------- 16 | 它的工作模式是master/worker多进程模式。 简单地说, 首先建立一个master进程, 然后fork出来worker进程。 17 | 18 | worker进程处理进来的请求, master负责管控, 当worker消耗内存过多, 或者相应时间太长, 杀掉worker进程。 19 | 20 | 这里是一篇github使用他们的文档: 21 | 22 | https://github.com/blog/517-unicorn 23 | 24 | 25 | unicorn详细配置 26 | ------------------------------------- 27 | 28 | 一般来说, 按照这个架构方式: 29 | 30 | .. image:: http://i.imgur.com/s6dth.png 31 | :align: center 32 | 33 | nginx负责端口映射, 从80端口映射到本地unix socket, 然后unicorn按照daemon方式执行。 34 | 35 | 36 | 设置nginx 37 | ````````````````````````````````````` 38 | nginx只需要设置一下端口转发就可以了。 (对于rails, 另外提供静态资源服务) 39 | 40 | :: 41 | 42 | server 43 | { 44 | listen 80; 45 | server_name doubanmash.com; 46 | location / { 47 | proxy_pass http://127.0.0.1:8080; 48 | proxy_set_header Host $host; 49 | proxy_set_header X-Real-IP $remote_addr; 50 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 51 | } 52 | } 53 | 54 | 设置unicorn 55 | ````````````````````````````````````` 56 | 基本摘抄 `上面github的配置 `_ , 57 | 文件保存为./config/unicorn.rb, 稍微解释一下。 58 | 59 | .. code-block:: ruby 60 | 61 | # -*- coding: utf-8 -*- 62 | rails_env = ENV['RAILS_ENV'] || 'production' 63 | # 需要设置一下rail的路径 64 | RAILS_ROOT = "/rails/path" 65 | 66 | # 设置生产和开发环境下面跑的worker数量 67 | worker_processes (rails_env == 'production' ? 16 : 4) 68 | 69 | # rails环境是需要预先加载的, 节省时间和内存 70 | preload_app true 71 | 72 | # 每个请求最长的响应时间, 超过了就杀掉worker 73 | timeout 30 74 | 75 | # 监听端口设置, 可以设置成unix socket或者tcp, 这里是用tcp, 因为开发环境可以直接看网站 76 | # listen '/data/github/current/tmp/sockets/unicorn.sock', :backlog => 2048 77 | listen 8080, backlog: 2048 78 | 79 | before_fork do |server, worker| 80 | ## 81 | # 这里是实现重启的时候无缝衔接的代码。 82 | # 首先unicorn提供了这样一个机制: 83 | # 当我们发送 USR2 信号给master的时候, unicorn就会把旧的pidfile加上.oldbin后缀, 84 | # 然后启动一个新的master, 新的master也会fork worker出来。 85 | # 86 | # 下面的代码就是当新的master起来的时候, 检查oldbin这个文件, 告诉旧的master退出(发送QUIT信号)。 87 | # 这样我们保证了无缝重启。 88 | 89 | old_pid = RAILS_ROOT + '/tmp/pids/unicorn.pid.oldbin' 90 | if File.exists?(old_pid) && server.pid != old_pid 91 | begin 92 | Process.kill("QUIT", File.read(old_pid).to_i) 93 | rescue Errno::ENOENT, Errno::ESRCH 94 | # someone else did our job for us 95 | end 96 | end 97 | end 98 | 99 | 100 | after_fork do |server, worker| 101 | ## 102 | # fork了之后, 原先开启的socket就不能用了, 重新开启 103 | ActiveRecord::Base.establish_connection 104 | # Redis 和 Memcached 的连接是按需的, 不需要重新开启 105 | end 106 | 107 | 信号是外界给unicorn发命令的方式, 我们利用发信号来控制unicorn。 108 | 上面的配置中无缝重启的部分利用到了这个机制。 最好看看 `unicorn 信号文档 `_ 。 109 | 110 | 更多的配置, 可以见 `unicorn 配置文档 `_ 111 | 112 | 具体使用 113 | ````````````````````````````````````` 114 | 设置完成后, 在命令行下面执行 :: 115 | 116 | bundle exec unicorn_rails -c ./config/unicorn.rb -D 117 | 118 | 如果是生产环境 :: 119 | 120 | bundle exec unicorn_rails -c ./config/unicorn.rb -D -E production 121 | 122 | 当新版本上线, 需要重启的时候, 执行 :: 123 | 124 | kill -USR2 `cat ${RAILS_ROOT}/tmp/pids/unicorn.pid` 125 | 126 | 如何监控 127 | ````````````````````````````````````` 128 | 好像有的时候, unicorn master会出现内存泄漏的状况, 还需要一个进程来监控它。 129 | 有人推荐我用 `god `_ , 不过我还没有评测过。 130 | 131 | 性能和易用性 132 | ------------------------------------- 133 | 没有评测过, 等我有时间的时候考虑一下。 134 | 135 | 结论 136 | ------------------------------------- 137 | 听说rails的初学者去用passenger, 熟悉了一些之后会用unicorn, 我对为什么要用它并没有什么太多的感受。 138 | 听说应该是它的可配置性, 以及比较好的性能吧。 139 | -------------------------------------------------------------------------------- /utf8介绍.rst: -------------------------------------------------------------------------------- 1 | 今天学习了一下utf8的相关概念, 发现自己的理解还是不很透彻, 这里整理一下: 2 | 3 | 什么是UCS? 4 | ------------------ 5 | 我们首先需要知道如何标识一个具体的字符, 国际上对于字符标识有一个东西, 叫UCS, 全称: Universal Character Set, 6 | 7 | 它是关于所有字符编码的标准. 简单地说, 为了能够规范我们所有字符的表示形式, 把所有字符都映射成一张表, 每个字符都指代单独的一个数字做标识. 8 | 9 | 什么是UTF-8? 10 | ------------------ 11 | 上面的UCS只是表示字符的标识, 并没有说明具体的表示方式是什么. 所以就有了UTF-8, 用来把UCS转换成计算机能够处理的字符串. 它为了节省空间, 方便解析和除错做了优化. 具体表示方式如下: 12 | 13 | - 小于\u80的字符, 直接打印为一个字符, 这个是为了和ASCII标准兼容. 14 | - 大于等于\u80小于\u800的字符, 分割成2个字符, 第一个字符开始为110, 第二个字符开始为10, 拆分的方法是先填满后面的字符(等会看后面的例子). 15 | - 以此类推... 16 | 17 | 说的不是太清楚, 这里有一个UCS映射到UTF-8的表, 一看就明白了: 18 | 19 | :: 20 | 21 | U-00000000 – U-0000007F: 0xxxxxxx 22 | U-00000080 – U-000007FF: 110xxxxx 10xxxxxx 23 | U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 24 | U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 25 | U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 26 | U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 27 | 28 | 同时, 长的表示方式不能涵盖短的表示方式, 所以下面的范围是错误的(可以快速排除错误): 29 | 30 | :: 31 | 32 | 1100000x (10xxxxxx) 33 | 11100000 100xxxxx (10xxxxxx) 34 | 11110000 1000xxxx (10xxxxxx 10xxxxxx) 35 | 11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx) 36 | 11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) 37 | 38 | 39 | 我们来看具体的例子(python代码): 40 | 41 | .. code-block:: python 42 | 43 | # 比如©这个符号, UCS的标识为: \u00a9: 44 | >>> print u"\u00A9" 45 | © 46 | 47 | # 我们把a9转换成真正的表示方式: 48 | >>> u"\u00A9".encode('utf8') 49 | '\xc2\xa9' 50 | 51 | # 我们也可以把真正的表示方式转换成标准里面的标识. 52 | >>> '\xc2\xa9'.decode('utf8') 53 | u'\xa9' 54 | 55 | # 我们来看一个分割的例子: 56 | >>> print u'\u2260' 57 | ≠ 58 | 59 | # 转换成utf8就被拆散了: 60 | # u+2260 = 0010 0010 0110 0000 61 | # 11100010 10001001 10100000 = 0xE2 0x89 0xA0 62 | >>> u'\u2260'.encode('utf8') 63 | '\xe2\x89\xa0' 64 | 65 | 结论 66 | ------------- 67 | 现在还没有什么心得, 总之, 了解了上面的概念, 才能处理好平时遇到的字符编码问题. 68 | 69 | 参考资料: 70 | - http://www.cl.cam.ac.uk/~mgk25/unicode.html 71 | -------------------------------------------------------------------------------- /windows下面设置VPN连接.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.clickonf5.org/wp-content/uploads/2009/12/InternetAccessVPN_thumb.png 2 | :align: center 3 | 4 | 什么是VPN 5 | ------------------------ 6 | 简单地说, VPN就是, 网络上面一台主机, 建立了一个虚拟的网络. 7 | 然后我们的电脑登录上去, 加入到这个虚拟的网络里面来. 8 | 然后我们就可以利用这个主机做跳板, 访问网站, 或者同属于这个虚拟网络的电脑. 9 | 10 | 这样可以让物理上分布在不同地点的电脑, 看起来好像在一个局域网络下面. 11 | 12 | 一般来说, VPN用来做几件事: 13 | 14 | - 在外网的电脑, 访问一个局域网络, 方便在家办公. 15 | - 利用提供服务的主机做跳板, 访问这个主机所在位置的资源. 就是我们说的翻墙. 16 | 17 | windows下面设置方法 18 | --------------------------------- 19 | 这里有一个教程: http://netfee.ustc.edu.cn/ylxia/help/faq/faq_howtosetupvpn_winxp.htm 20 | 21 | 我也自己整理了一下: 22 | 23 | - 点击控制面板->网络连接, 24 | - 左边建立新连接. 下一步, 连接到我的工作网络 25 | - 下一步, 虚拟专用网络. 26 | - 公司名称随便输入 27 | - 设置IP. 28 | - 点击完成. 29 | - 然后输入用户名和密码. 30 | - 然后连接就可以使用了. 31 | 32 | 33 | -------------------------------------------------------------------------------- /wordpress_nginx安装.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://smallbiztechnology.com/wp-content/uploads/2011/05/wordpress-logo-stacked-rgb.png 2 | :align: center 3 | 4 | 技术整理贴, 不感兴趣就跳过吧. 5 | 6 | 一般来说, wordpress都是和apache一起搭配起来的, 但是我现在的服务器是nginx, 于是我需要把他们搭配起来. 基本采用的方法是根据以下2篇文章的内容: 7 | 8 | http://library.linode.com/web-servers/nginx/php-fastcgi/ubuntu-11.04-natty 9 | 10 | http://joneslee85.wordpress.com/2010/03/13/howto-nginx-wordpress-ubuntu-shortest-setup/ 11 | 12 | 原理 13 | ------------------------ 14 | 15 | nginx把网站导向到wordpress安装目录, 16 | 对于php文件, 采用fastcgi的方式, 导向到一个php-fastcgi服务器上面处理. 17 | 18 | 具体安装过程 19 | ------------------------ 20 | 新建一个wordpress nginx配置文件: /etc/nginx/site-avariable/wordpress 21 | 22 | 里面几个参数需要改: server_name就是你网站的地址, root指向wordpress, fastcgi_param就是下面fastcgi脚本文件. 23 | 24 | :: 25 | 26 | server{ 27 | listen 80; #or change this to your public IP address eg 1.1.1.1:80 28 | server_name wordpress; #change this to the domain name, for example www.myblog.com 29 | access_log /var/log/wordpress.access_log; 30 | error_log /var/log/wordpress.error_log; 31 | 32 | location / { 33 | root /home/your-user-name/Sites/wordpress; 34 | index index.php index.html index.htm; 35 | 36 | # this serves static files that exist without running other rewrite tests 37 | if (-f $request_filename) { 38 | expires 30d; 39 | break; 40 | } 41 | 42 | # this sends all non-existing file or directory requests to index.php 43 | if (!-e $request_filename) { 44 | rewrite ^(.+)$ /index.php?q=$1 last; 45 | } 46 | } 47 | 48 | location ~ \.php$ { 49 | fastcgi_pass 127.0.0.1:9000; 50 | fastcgi_index index.php; 51 | fastcgi_param SCRIPT_FILENAME /home/your-user-name/Sites/wordpress$fastcgi_script_name; 52 | include fastcgi_params; 53 | } 54 | } 55 | 56 | 然后重启nginx: 57 | 58 | :: 59 | 60 | sudo service nginx restart 61 | 62 | 63 | php fastcgi脚本: php-fastcgi 64 | 65 | 里面user你随便定, 但是要能够访问和修改wordpress目录, 我是直接用普通用户了(wordpress也是普通用户下载的) 66 | 67 | :: 68 | 69 | #!/bin/bash 70 | 71 | FASTCGI_USER=www-data 72 | FASTCGI_GROUP=www-data 73 | ADDRESS=127.0.0.1 74 | PORT=9000 75 | PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid 76 | CHILDREN=6 77 | PHP5=/usr/bin/php5-cgi 78 | 79 | /usr/bin/spawn-fcgi -a $ADDRESS -p $PORT -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5 80 | 81 | 写好后, 执行这个文件就可以了: 82 | 83 | :: 84 | 85 | chmod u+x php-fastcgi 86 | ./php-fastcgi 87 | 88 | 这样就新建了一个一个php-fastcgi服务器. nginx发现php文件的时候, 就会交由这个服务器处理. 89 | 90 | 91 | 然后你就可以跟着wordpress教程一步步做了: http://codex.wordpress.org/zh-cn:%E5%AE%89%E8%A3%85_WordPress 92 | 93 | 对了, 里面还有设置mysql服务器的步骤, 基本上按照上面的教程来就行了. 94 | -------------------------------------------------------------------------------- /zeromq介绍.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://github.com/imatix/zguide/raw/master/images/fig14.png 2 | :align: center 3 | 4 | 什么是zeromq? 5 | ---------------------- 6 | 最近断断续续知道了有message queue这种东西, 可以很好地作为不同程序间的粘合剂. 补上了我工具链上面缺失的一环. 在考虑了几个mq的工具之后, 我决定学习 `zeromq`_ . 为什么选它呢, 因为它的API和它的网站一样简洁优美, 暗合禅道. 7 | 8 | zeromq的基础 9 | ---------------------- 10 | zeromq采用api形式来实现队列功能, 它的核心就是: socket. 11 | 12 | 这个socket和tcp/ip的socket在概念上有点类似, 只不过, 它的socket不需要给出具体通讯的实现以及其他的一些特性, 我们可以把它理解为更高级的socket. socket处理消息是按照份数来进行的, 每次发送一份或者多份消息. 并且, 这个socket不一定是基于网络的, 它可以设置为其他形式的东西, 比如ipc, 进程内部通讯, 通讯方式和代码是解耦合的. 13 | 14 | 这样的话, 程序员只需要关心数据流的流动方式, 以及对应的网络拓扑应该如何搭建. 我们还是来看看具体的代码吧. 15 | 16 | 一个简单的例子 17 | ---------------------- 18 | 如果我们要实现下面这个简单的通讯方式: 19 | 20 | client发出'hello'请求, server回应'world'. 21 | 22 | .. image:: http://github.com/imatix/zguide/raw/master/images/fig1.png 23 | :align: center 24 | 25 | 只需要写这样的代码: 26 | 27 | server.py: 28 | 29 | .. code-block:: python 30 | 31 | # 导入zmq 32 | import zmq, time 33 | # 初始化上下文 34 | context = zmq.Context() 35 | # 生成一个新的服务socket 36 | socket = context.socket(zmq.REP) 37 | # 绑定在一个地址上面 38 | socket.bind("tcp://*:5555") 39 | 40 | while True: 41 | # 等待客户端发起请求 42 | message = socket.recv() 43 | # 做一些'具体的'工作 44 | time.sleep (1) 45 | # 返回结果 46 | socket.send("World") 47 | 48 | client.py: 49 | 50 | .. code-block:: python 51 | 52 | import zmq 53 | context = zmq.Context() 54 | 55 | # 生成一个请求socket 56 | socket = context.socket(zmq.REQ) 57 | # 连接上服务器 58 | socket.connect ("tcp://localhost:5555") 59 | 60 | for request in range (1,3): 61 | # 发出请求 62 | socket.send ("Hello") 63 | # 得到回应 64 | print socket.recv() 65 | 66 | 分别在2个终端里面执行上面的代码, 你会发现自己实现了一个非常简单的服务器, 而上面的代码正好是他们应该执行的逻辑, 没有任何底层的肮脏处理代码! 67 | 68 | 神奇的地方: 69 | 70 | - 你可以开启任意多个client, 服务器都可以响应得过来. 71 | - 你不需要处理通讯异常的问题, zeromq都帮你实现好了. 72 | - client和server他们启动的顺序是不互相依赖的, 谁都可以先启动. 73 | - 不需要其他程序执行, 消息机制是在程序执行的时候, zeromq自动开线程处理的. 74 | 75 | zeromq是搭建复杂拓扑的基石. 除了上面那个简单的同步回应请求模式以外, zeromq还可以实现许许多多更为复杂的模式, 这些是依靠它基础的几类socket完成的: 76 | 77 | - REQ 请求socket 78 | - REP 回应socket. 上面利用这2类来实现了一个简单的服务器. 79 | - PUB 发布socket. 该socket可以发布消息, 但是不关心订阅者是否收到消息. 80 | - SUB 订阅socket. 它可以连上PUB, 获取PUB随机发送的消息. 81 | - PUSH 只送出消息. 82 | - PULL 只收取消息. 83 | - PAIR 一对一的管道. 84 | - XREQ 异步请求. 85 | - XREP 异步回应. 86 | 87 | 利用上面的几类基础socket, 可以实现以下的复杂拓扑: 2个云计算集群, 能够根据负载互相转移任务. 88 | 89 | .. image:: http://github.com/imatix/zguide/raw/master/images/fig52.png 90 | :align: center 91 | 92 | 具体的实现方法这里就不多说了, 你可以看 `zeromq教程`_, 里面解释得非常详细. 93 | 94 | 安装方法 95 | ---------------------- 96 | 因为ubuntu源里面的zeromq好像不是最新的, 我是直接上: http://www.zeromq.org/intro:get-the-software 上面下载2.0.10版本的(python绑定最高是2.1.1, 但是没有下载, 于是我选择这个版本). 97 | 98 | 然后就是解压编译安装. 需要g++以及uuid-dev. 安装完毕后, 需要手动做一下链接库的链接, 不然无法用pyzmq: 99 | 100 | :: 101 | 102 | ln -s /usr/local/lib/libzmq.so.0 /usr/lib/libzmq.so.0 103 | 104 | 然后安装pyzmq :: 105 | 106 | sudo easy_install pyzmq==2.0.10 107 | 108 | 然后就可以执行上面的python代码了. 109 | 110 | 结论 111 | ---------------------- 112 | zeromq的抽象方式非常优美, 在此层面上, 我们可以专注处理数据流的问题, 而不需要考虑下面的杂活. 我早就希望能够有这样的工具存在了, 现在得偿所愿, 可以构建一些很有意思的系统了. 113 | 114 | .. _`zeromq`: http://www.zeromq.org/ 115 | 116 | .. _`zeromq教程`: http://zguide.zeromq.org/page:all 117 | -------------------------------------------------------------------------------- /三一学会.rst: -------------------------------------------------------------------------------- 1 | 三一学会 2 | -------------- 3 | 4 | 需求 5 | -------------- 6 | 我发现在学校之外, 以及学校里面, 都有许多的人, 希望上进, 但苦于: 7 | 8 | * 一个人很难分析出自己真正想要什么, 也无法监督自己执行. 9 | * 自己学习无法保证按照计划执行. 10 | * 由於自我的局限性, 无法看得更高, 更远. 11 | 12 | 因此, 我希望建立一种机制, 能够帮助这些人解决关于学习, 理想, 以及持续进步的问题. 13 | 14 | 思路 15 | -------------- 16 | 17 | 我发现, 有几个方法可以用来解决上面的问题: 18 | 19 | * 建立学习的环境. 20 | * 教练指导. 21 | * 教学相长. 22 | 23 | 实现 24 | -------------- 25 | 26 | 现在我还只是在尝试过程中, 采用以下解决方案: 27 | 28 | * 住在附近, 有志提高自己的人, 休息时间聚集在一起, 共同学习. 29 | * 大家互相监督, 保证持续的时间投入. 30 | * 学会一个概念后, 向其他人教授该概念, 达到共同学习, 以及加强理解的目的. 31 | * 成员互相的关系应该是教练<->学生的关系. 有教练经验的成员指导他人明确目标, 制定计划, 执行计划. 32 | * 成员必须把发展下线, 即自己做教练, 作为成长后的目标之一, 吸引其他有上进心的人加入学会. 33 | * 为了效率, 一起学习的人数必须有限, 太多了, 就要分拆成两个小组. 34 | 35 | 现在我会在生活中实验这种模式, 以及做推广与研究, 这种学习小组就叫三一学会吧. 随便起的. 36 | 37 | 当解决方案成熟之后, 我希望能够把这种方案, 以类似病毒发展方式推广到全中国. 38 | 39 | 40 | -------------------------------------------------------------------------------- /为什么qt是最适合你的.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://cdn.softsailor.com/wp-content/uploads/2010/09/Qt-.png 2 | :width: 600 3 | 4 | 很多python开发人员, 在选择界面库的时候都会犹豫一段时间, 到底是选择tk, wxpython, pygtk, pyqt, 还是什么其他奇怪的解决方案. 这里, 我建议, 不要多想了, 节省你的时间和精力, 选择pyqt. 5 | 6 | 很多开发人员, 在选择界面库时候(至少是你能够选择的时候)都会犹豫很长时间, 到底是MFC, winform, WPF, flash, swing, VCL(还有人知道delphi吗), 还是什么其他奇怪的解决方案, 这里, 我建议, 不要多想了, 节省你的时间和精力, 选择pyqt. 7 | 8 | 好了, 广告时间结束, 这里说明理由: 9 | 10 | - 为什么python? 11 | 12 | - python是最好用最好学的编程语言(没有之一, VB不够好用) 13 | - 根据GUI的本质思维, 只有动态语言才能做到那么强的灵活性. 所以C/C++/java什么的不方便开发. 不然你动态生成页面试试? 14 | - 快速开发. 同样的功能, python的代码是其他语言的若干分之一. 代码量少了, 开发速度和质量都提高了. 15 | 16 | - 为什么Qt? 17 | 18 | - 工业级别的界面库. tk, wxpython都太简陋了, 不堪大用. wxpython还有性能问题. (by Jimmy Kuu) 19 | - 跨平台. VCL, winform, WPF, GTK可能好用一些, 但是跨平台试试? 以后一辈子和某个平台挂钩了. (好吧, GTK, mono可能多平台.. 但是没有pyqt好用) 20 | - 简单直观的事件处理方式. 只需要把一个signal插入到一个slot里面就好了, 并且是热拔插. callback机制已经过时了. 21 | - 性能很好, 足够工程使用. 一个实际的例子: linux下面的桌面系统KDE是基於Qt的. 22 | 23 | - 虽然pyqt很好, 但是还有其他需要注意的方面 24 | 25 | - 如果你是开源项目, 随便用. 但是如果是商业闭源, 那需要给 `riverbank `_ 他们交费, 一个开发者350英镑, 还是蛮划算的(比起开发时间来说). 或者你可以考虑 `pyside `_? 26 | - 发布. 打包后的pyqt程序, 10M左右, 如果你对空间要求很严格的话, 就不适合了. 但是现在这个网络时代, 这应该不成问题. QQ都非常大了.. 27 | - 性能. 如果你要画实时图片, 3d什么的, python恐怕太慢了, 老实用回C++吧. 28 | - 移动应用. `meego `_ 还早, 好像可以在android上面写python, 但是pyqt.. 哈哈哈. 29 | - web2.0. 好吧, jquery是你的武器. 写javascript去吧. 还有flash.. 30 | 31 | 还有我一些其他的看法: 32 | 33 | - Qt的designer是杀手级的. 在linux下面. glader什么的都去死吧. 34 | - tk8.5好像解决了中文问题. 但是控件是不是太少了? 不够用阿. 35 | - wxpython太丑了. 哪里比得上Qt支持的qss方式动态设置风格. 36 | - pyGTK? 没用过. 有时间看看. 37 | - MFC sucks. 38 | - delphi. 编译飞快. 但是动态生成界面? 当年研究了很久.. 39 | - WPF: WTF.. 40 | - winform. 他们说不好, 我觉得还好吧? 41 | - android/iOS. 好吧, 我落伍了. 42 | 43 | -------------------------------------------------------------------------------- /为什么成人学习会变得困难.rst: -------------------------------------------------------------------------------- 1 | 最近和 `steven yang `_ 讨论到关于成人教育的问题. 他说他有做过一个演讲, 关于人们从学校毕业以后, 学习新的东西变得很困难. `这里是他的演讲资料 `_. 2 | 3 | 我这里整理一下我的阅读笔记: 4 | 5 | **其中提到了三点, 关于成人教育的困难之处**: 6 | 7 | 首先是观念. 当我们在某些领域掌握了一定程度的技能之后, 我们会限制住自己, 给自己打标签, 比如一个人学会了编程, 从事编程工作的时候, 8 | 就会给自己打上"程序员"的标签, 而不去考虑其他的可能性. 甚至以此作为借口, 拒绝做其他的事情. 9 | 10 | 然后就是反馈. 在学校里, 学习过程中有着无数的反馈: 阶段性的作业, 学习进度可视化, 来自他人的学习经验以及指导, 团体学习. 但是当我们进入社会的时候, 这些便利的条件都失去了. 11 | 我们的学习经历, 变得孤立起来, 我们无从得知自己的进度, 无法针对学习的困难找到帮助. 12 | 13 | 还有就是学习内容. 在学校里面, 我们所需要学习的内容会经过筛选和整理, 整体的学习曲线会变得很平缓, 每次学习的内容是有限的. 而在社会中, 在收集需要学习的内容的时候, 14 | 很容易就信息爆炸, 需要很多年才能全部掌握的知识都摆在你的面前, 并且数量繁杂, 无从下手, 这样的话, 普通人往往望而却步. 15 | 16 | **针对这几点, 有提出一些解决方案**: 17 | 18 | 不要怀疑你的学习能力. 虽然学习经历可能非常困难让人望而却步, 拥有一定能够学会的信心, 是投入学习, 克服学习中遇到的困难的基础. 19 | 20 | 不要投入金钱, 而是投入注意力. 只有注意力才是学习进度提升的燃料. 21 | 22 | 采用进度作为反馈, 而不是成就. 成就(比如能够开发一个网站)在时间线上是随机的, 不好用来作为反馈的内容, 应该选用进度(比如学习了多少时间, 看了多少页的书)来作为反馈的基准. 23 | 24 | 持续学习. 学习需要长期而持续的投入, 在掌握一定阶段的知识之前, 学习成果是不稳固的. 而持续学习本身会变成习惯, 能够让坚持学习变得容易一些. 25 | 26 | 不要相信感觉. 感觉长时间没有进步, 或者感觉无法克服一个学习上的困难, 你不可能对一个你不熟悉的领域感觉正确. 27 | 28 | 以上. 29 | -------------------------------------------------------------------------------- /为什么用ReST写博客.rst: -------------------------------------------------------------------------------- 1 | 什么是ReST 2 | --------------------- 3 | 4 | ReST全称是reStructuredText,是一种容易写,容易看的文本格式, 5 | 6 | 具体介绍在这里: http://docutils.sourceforge.net/rst.html 7 | 8 | 如果你看不懂英文,可以看------好吧,我没有找到中文的介绍. 9 | 10 | ReST的好处 11 | --------------------- 12 | 13 | 好处就是:以后再也不用为了调整格式而费心啦,专心写文章. 14 | 15 | 当然了,遇到复杂的状况(比如写书,写公式,图表之类),还需要其他的工具. 16 | 17 | 对于写博客和简单的文档来说,是非常适合的. 18 | 19 | 如何发布到博客上 20 | --------------------- 21 | 22 | 写好ReST后,把文本拷贝到: http://www.tele3.cz/jbar/rest/rest.html 23 | 24 | 这是一个在线生成工具,生成html之后,复制到博客里面发布就可以了. 25 | 26 | 记得保存备份,说不定以后什么时候还要用到的说. 27 | 28 | 结论 29 | --------------------- 30 | 31 | * 中文资料比英文资料少多了,所以好好学英文吧. 32 | * 简单就是美. 33 | -------------------------------------------------------------------------------- /为什么要写博客.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.rylanclayne.com/wp-content/uploads/2010/05/Blogpic1.jpg 2 | :align: center 3 | 4 | 关于博客 5 | -------------------------- 6 | 7 | 很久很久以前, 写博客是风潮, 几乎所有上网的人都过博客, 不管是自己搭建的, 或者是依赖第三方平台的. 然后----没有然后了, 大量开博的结果就是大量荒废, 很多博客要么就是"你好世界", "天气不错", 要么就彻底不用了. 8 | 9 | 错误的写博客的目的 10 | -------------------------- 11 | 互联网上的很多东西就是这样, 潮流性质的, 一阵风地来, 一阵风地去, 没有真正解决问题带来快感, 用户玩玩也就离开了. 12 | 13 | 我们回到写博客. 大家写博客, 一般来说是希望满足自己的发布欲望, 但是一般的结果是坚持了一段时间发现应者寥寥, 顶多小猫两三只发发"顶", "好文", 完全无法产生互动, 渐渐地作者就没有动力了, 无以为继, 博客就荒废了. 14 | 15 | 这样用博客的方法完全不对. 不错, 博客可以作为发布平台, 但是有一个隐含前提, 要有人对自己感兴趣. 16 | 一般来说, 只有2种可能性能够满足上面的前提: 你是名人或者是熟人然后大家愿意来了解你, 或者你写的东西实在有意思. 17 | 前面一种状况的话普通人就别想了, 后面的状况的话, 你要知道, 这个是个国际市场, 准入门槛低得只要几块钱付点上网费, 一般人怎么会有出头机会? 18 | 19 | 正确的写博客的目的 20 | -------------------------- 21 | 22 | 那么, 博客写出来, 观者寥寥的话, 那还写博客干什么呢? 23 | 24 | 无论什么博客, 一般来说, 都还是有一个读者的, 那就是自己(什么? 你看不下去自己写的东西? 恩, 等会再说). 25 | 很多人用博客当作整理资料的平台, 这样也能继续下去, 过段时间如果遗忘了或者想回顾下, 再回来看看, 26 | 但是这样的用法, 只是一个私人日记, 为什么要放出来呢? 这也不是好的使用方式. (当然, 这种用法的话可以使用一些私密空间的服务.) 27 | 28 | 我们比较认同的使用方式是这样: 博客写, 还是按照给其他人看的方式写, 但是重要的部分不是发布出来给其他人看, 而是写的这个过程. 29 | 我们通过写博客, 来提高自己的写作水平, 以及整理自己的思路/知识. 30 | 31 | 我们学习新的东西, 一个很重要的步骤就是把新的知识复述出来, 只有通过复述, 才能说是真正吸收了知识. 而博客提供了一个很好的这样做的平台. 32 | 如果只是自己整理, 一方面, 没有开放给外界的压力, 最后往往流于敷衍, 开放之后, 如果写得不对, 也可能会有人指正(当然机会比较少). 33 | 另一方面, 以写给其他人看的方式写作, 会强迫自己把事情理清楚, 写明白, 在这个过程中, 能真正搞懂一件事情. 34 | 35 | 博客本身也是写作, 通过这样的过程, 当然还能提高自己的写作能力. 36 | 在我看来, 写作能力是种权柄, 是种杠杆. 掌握了写作, 就掌握了大量传播自己理念的能力. 我是认为每个人都应该不断努力练习写作的. 37 | 如果你觉得自己写的文章连自己都不忍卒读以至于不好意思写博客, 那么我要恭喜你, 你发现了一个大的问题, 把这个问题解决掉, 你会得到非常大的提升的. 38 | 至于不好意思放出来这点, 等文笔练好了之后, 重新修改好了就可以了. 谁会在意呢? 39 | 40 | 博客还有一个好处, 就是如果很长时间不更新, 你可以把它看作一个警告: 你已经很久没有去学习新的东西了, 或者你的生活方式上已经趋于平庸, 没有劲头了. 41 | 这个时候你应该做相应的调整, 然后继续更新博客. 话说你的博客已经停止了多久了? 一个月, 还是一年? 42 | 43 | 我们讨论了好处, 再来看看成本. 写博客的成本主要还是时间, 但是因为写博客本身是一个整理的过程, 而这样的整理往往是必要的, 这部分时间不算是浪费. 44 | 当然如果只是单纯地为了完成任务而写, 那个是非常痛苦的, 时间上也不值得, 还是建议平时整理值得写的内容, 如果没有? 请再看一遍上一段的内容. 45 | 46 | 我个人还有一个建议: 博客要写大家感兴趣, 或者至少能够参与的事情, 再不然满足大家的窥私欲望. 如果你真的想写非常个人的东西, 不要放到博客上面来, 47 | 放到私人空间里面去. 维护博客, 也是学习个人推销的一个过程. 48 | 49 | 结论 50 | --------------------------- 51 | 经过上面几个部分的考虑, 我真诚地建议所有人都写博客. (尤其是女孩子, 有了博客能够让男孩子更了解你) 52 | -------------------------------------------------------------------------------- /为什么要用纯文本.rst: -------------------------------------------------------------------------------- 1 | 什么是纯文本 2 | ------------------------------------ 3 | .. image:: http://anthrologico.com/wp-content/uploads/2010/11/plaintext.png 4 | :width: 600 5 | 6 | 我们所说的纯文本, 有几层含义: 7 | 8 | 任何信息, 都采用文本的方式来展示 9 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10 | 我们拒绝任何形式的二进制格式, 拒绝任何形式的私有格式, 我们只支持纯文本. 11 | 12 | 比如: Word, PPT, Excel, 他们都是只能用微软的工具打开的, 并且都是二进制的, 不能被文本编辑工具修改. 13 | 14 | 文本的编码必须是统一的标准编码 15 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 16 | 要么ASCII, 要么UTF-8, 拒绝任何其他的编码格式. 比如gbk等. 17 | 18 | 19 | 文本本身的数据, 反映出文本需要展示的信息量 20 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 21 | 比如: 22 | 23 | :: 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 虽然格式是纯文本的(xml), 但是不能很好地被人理解, 所以我们认为是坏的, 不符合纯文本的要义. 33 | 34 | 我们应该这样: 35 | 36 | :: 37 | 38 | Book: 39 | name: pyqt book 40 | chapter: 41 | - python introduce 42 | - qt introduce 43 | 44 | 一个示例 45 | ------------------------------------ 46 | 本文就是采用纯文本方式编辑的, 原始文件可以在 `这里 `_ 看到. 47 | 48 | 为什么要用纯文本 49 | ------------------------------------ 50 | 我们为什么要使用纯文本? 51 | 52 | - 纯文本是方便人阅读和修改的 53 | 纯文本反映了本文所承载的信息, 我们阅读和修改都能够针对具体的信息, 而不像某些专有软件, 需要熟悉软件的特殊功能, 才能获取我们想要的信息. 54 | 55 | - 纯文本是自由的, 不依赖任何第三方工具 56 | 如果你把纯文本发给其他人, 其他人可以直接获取到纯文本中的信息, 而不像二进制的文件, 必须要安装指定的软件. 如果该软件无法获取, 专有格式文件中的信息就遗失了. 57 | 58 | 注意点 59 | ------------------------------------ 60 | 61 | - 我们不反对程序自动生成的文件(不需要人阅读的部分)是其他格式的. 我们只关心人有可能看的部分. 如果你用纯文本生成pdf等格式展示给其他人看, 我们不要求pdf本身是纯文本的.. 因为这只是个中间产物, 如果有需要, 我们直接去看源码, 而源码 **必须** 是纯文本的. 62 | 63 | 纯文本工具链 64 | ------------------------------------ 65 | 为了能够实践我们纯文本主义, 我们需要有强大的工具作为支持: 66 | 67 | reStructuredText_ 68 | 69 | 这是我们的主要文档编写工具. 适合人编写和阅读, 也可以很容易地转变为其他需要的格式. 70 | 71 | S5_ 72 | 73 | 文本方式写幻灯片. S5本身是html的, 为了能够深刻实践纯文本主义, 我们建议你采用 rst2s5_. 74 | 75 | graphviz_ 76 | 77 | 文本方式画图. 文本方式编写图的结构和显示, 没有再适合的了. 78 | 79 | csv_ 80 | 81 | 表格. 单一的符号以及回车符分割开具体的数据, csv非常适合阅读和修改. 82 | 83 | .. _S5: http://s5project.org/ 84 | .. _graphviz: http://www.graphviz.org/ 85 | .. _reStructuredText: http://docutils.sourceforge.net/rst.html 86 | .. _rst2s5: http://docutils.sourceforge.net/docs/user/slide-shows.html 87 | .. _csv: http://en.wikipedia.org/wiki/Comma-separated_values 88 | -------------------------------------------------------------------------------- /人人都应该掌握一门乐器.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.rocketpiano.com/images/grandpiano.jpg 2 | :align: center 3 | 4 | 作为一名程序员, 我最近开始下定决心掌握一门乐器, 我跟风一个朋友franky开始学习钢琴. 我去附近的一个琴行报了班, 开始了练习. 5 | 6 | 现在基本能弹一些非常简单的练习曲, 比起franky能弹<放牛班的春天>, 我还差远了. 但是我已经计划好了学习钢琴的时间: 一辈子. 7 | 8 | 为什么要掌握乐器 9 | ---------------------- 10 | 那么为什么我要开始学习乐器了呢? 我觉得音乐是人类社会非常重要的伟大成就, 绝大多数人都喜欢听音乐. 11 | 12 | 而演奏音乐是欣赏音乐的一个重要组成部分, 音乐在自己手中变化, 更能体验到音乐的魅力. 13 | 14 | 如果说一生中没有尝试过这个过程, 那么我觉得人生体验是很不完整的. 15 | 而学习音乐几乎不需要基础, 只需要时间和若干请老师的钱. 16 | 17 | 如何掌握一门乐器 18 | ---------------------- 19 | 20 | 如果你决定开始学习乐器了, 你基本上完成了大部分的工作. 下面你只需要去本地的琴行, 选择一个你中意的乐器, 掏钱出来就可以了. 21 | 22 | 比起掌握乐器带来的乐趣和收益, 这点钱不算什么(除非你真的非常非常缺钱, 你还是专心赚钱去吧..) 23 | 24 | 结论 25 | ---------------------- 26 | 我从2011/03/26开始, 已经断断续续学了4个多月了, 27 | 工作和精力原因, 我平均每天练半个小时. 我希望和预期能够在单位年底活动的时候, 献艺一曲. 这样绝对能够树立我新的形象. 28 | 希望大家也都加入到学习乐器的队伍中来. 29 | 30 | -------------------------------------------------------------------------------- /人民广场英语角参加小记.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://img.club.pchome.net/upload/club/other/2008/2/16/pics_andna_1203166311.jpg 2 | :width: 600 3 | 4 | 起因 5 | -------------- 6 | 7 | 上上周我锻炼的时候, 路过了人民广场, 发现在一个角落里面, 不太像相亲角, 因为有男有女, 大多都是年轻人. 问了一个人, 发现竟然是英语角. 8 | 我在这里留了一段时间, 稍微练习了一下, 主要是我介绍了一点最近学习到的东西(哈佛幸福课). 9 | 10 | 回去之后, 我觉得既然我住在南京西路, 可以利用好这个场所, 达到练习英语口语, 练习演讲, 找妹子的目的. 11 | 12 | 经过 13 | --------------- 14 | 15 | 今天下午, 我有时间再次去英语角. 今天去的时候, 收获比较多, 主要是遇到几个有意思的人. 16 | 17 | 首先是一个日本人. 我不经意的时候聊上的. 没有看出来是日本人. 他19岁, 爸爸是上海人, 妈妈是日本人. 在这边短期待一周左右. 在日本 `慶應大学 `_ 读书. 英语还算是能够用. 我刚刚到的时候自己还没有放开, 没有什么太多可以说的. 基本上就是听的份. 这个时候边上过来了几个人, 然后他们也会日语, 于是就开始说日语了, 我就在一旁安静地听了, 日语夹着英语, 算是勉强能够弄懂一点意思. 18 | 19 | 然后是第二个很有趣的人过来了. 他是一个老人家, 气色很好, 眼睛很有精神. 讨论的时候有提到, 他自己刚刚从瑞士回来, 会七八门语言. 是企业主, 有好几家公司, 日本一家旅游方面的公司. 他自己除了南美以外, 世界其他地方他都去过了. 并且计划在未来去南美. 用他自己的话说, "push his employee work hard, and I can enjoy my life."(凭记忆大致是这个意思). 他也会写程序, 原先写java, 现在写C#, 用vs2010. 20 | 21 | 在讨论的时候, 他有说道, 慶應大学是个好学校, 创办者是 `福泽谕吉 `_. 他说自己过来是为了能够看看各种有趣的人. 22 | 23 | 然后我们又讨论到日本的成长. 他说, 日本能够从一个农业国家, 成为这么强大的国家, 基本上靠的就是全盘西化, 掌握了西方的先进思想和技术. 福泽谕吉起到了最主要的过程. 他说日本人最尊敬的人, 就是他了. 他对东方文明和西方文明都有足够的了解, 后来写了著名的<脫亞論>, 推行全盘西化. (我觉得我有必要花时间去看这本书.). 24 | 25 | 这个老人家说, 文明是有层级的, 西方文明的层级比较高一些, 他们更好地对待人. 不像亚洲. 他说, 中国一直以来都是中学为体, 西学为用, (我补充到现在也是这样), 这样让中国变成现在这样. 26 | 27 | 他说, 学习各种语言是为了看各种语言背景下面的书, 了解更多, 第一手的资料. 能够看问题更全面. 他建议年轻人多看看书, 各种语言的书. 28 | 29 | 他说, 不要和其他观点的人争论, "让他们保留自己的意见", 不过没有说为什么. 我现在比较年轻气盛, 发现一个道理, 就想要和别人灌输. 这样从以往经历上面, 被证明是没有效果的(尤其是对中国人), 反而恶化人际关系. 以后我要好好约束自己. 让他们保留自己意见吧, 东西自己知道就可以了. 30 | 31 | 后来这个老人家又说道, 有另外一个英语角, 外国人比较多, 在陕西南路和长乐路的星巴克, 每周六下午, 因为外国人比较多, 会靠谱一些. 下次我会去那边看看. 32 | 33 | 老人家说, 可以通过一个人的词汇量来看他的教育背景, 受过教育的外国人, 词汇量会很大, 然后英语角过来的外国人, 很多词汇量很低, 也就千把. 指了一个人给我. 他说, 可能年轻的时候就是一个jobless. 34 | 35 | 然后老人家时间差不多, 就走了. 我又发现第三个有趣的人. 一个小孩. 36 | 37 | 我去和小孩说话. 这个小孩8岁, 来这个英语角已经5年了. 说话很有条理. 估计也又是一个genius. 有谈到理想, 说是希望以后长大去哈佛, 希望自己成为一个艺术家(具体做什么职业, 等到大学阶段尝试), 思路非常清晰, 让我感到非常的佩服. 我觉得以后如果有小孩, 也可以考虑把小孩带到这样的英语角, 练习英语. 38 | 39 | 结论 40 | --------------------- 41 | 42 | 总体来说, 来英语角, 能够遇到这些有趣的人, 算是不虚此行. 不过有趣的人不是那么容易遇到的, 下次注意要多接触一下再加入到聊天中去. 大家也可以尝试来参加这样的场合. 43 | -------------------------------------------------------------------------------- /仪式.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://3.bp.blogspot.com/_TvbzIAsIkCg/S_U_A50AuaI/AAAAAAAAB7M/aEorhmCiJSk/s1600/pray.jpg 2 | :align: center 3 | 4 | 为了能够贯彻自己的理念和思维, 我们需要找到一种方式能够让知识转化为行为方式, 以及时刻调整自己的生存状态. 5 | 因此, 我打算遵循一套仪式, 来保证我能够贯彻决定以及提供精神动力. 6 | 7 | 这套仪式需要达成的具体目标和过程如下: 8 | 9 | 早晨重置 10 | -------------------------------- 11 | 每天早晨要经过一套仪式来重置自己的精神状态, 查漏补缺, 和回复遗忘的行为模式. 同时从上至下制定一天的事宜. 12 | 13 | 具体过程 14 | 15 | * 念祷词 16 | 17 | "人的生命只有一次, 死亡之后是虚无, 享乐是奖励, 重要的是把脑中理念带入现实. 什么理念:" 18 | 19 | "世界应该是这样的: 自由, 责任对等义务, 丰富多彩, 人们解决问题, 创造新事物, 享受生活." 20 | 21 | "我的目标是实现这样的世界, 为此我需要坚定目标, 正视恐惧, 远离诱惑, 敏于行, 勤修炼, 实现我的价值." 22 | 23 | * 整理一天要做的事情 24 | * 回顾需要坚持的习惯 25 | 26 | - 远离sns. 27 | - 做事先计划 28 | - 阶段性停止和分析当前做的事情. 29 | - 以及其他需要养成的习惯. 30 | 31 | 32 | 晚上重置 33 | -------------------------------- 34 | 每天晚上睡觉前, 需要整理一天实现的事宜, 以及采用分析模型来看缺陷, 找优点, 用来回馈调整行为模型. 35 | 36 | * 念悼词 37 | 38 | 重念早祷词. 39 | 40 | * 回顾 41 | 42 | 我今天浪费了哪些时间? 为什么而浪费? 我今天利用好了哪些时间? 为什么利用好了? 如何消除浪费? 如何重复好的利用方式? 43 | 44 | * 休息准备 45 | 46 | 每日都是一个单独的生命过程. 早晨新生, 夜晚死去. 该到死去的时间了. 47 | 48 | 日常重置 49 | -------------------------------- 50 | 当日常发现风险的时候, 需要默念祷词, 并利用通过默念祷词获得的精神力量处理风险. 51 | 52 | 主要风险以及应对祷词: 53 | 54 | * 失去控制 55 | 56 | 无法控制自己正在做的事情. "光明三原则: 停止, 建立, 重复" 57 | 58 | * 遗忘目标 59 | 60 | 忘记自己需要做什么了. "我要改变世界." 61 | 62 | * 遇到难题 63 | 64 | 面对一个难题无法解决. "把问题放到脑子里, 让潜意识帮助解决." 65 | -------------------------------------------------------------------------------- /你不需要一天工作8小时.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://cimg2.163.com/tech/2007/11/5/2007110521233984d3a.jpg 2 | :align: center 3 | 4 | 我们每天定时起床, 吃饭, 上公车, 赶在9点之前到达公司, 然后在哈欠中开始一天的工作. 5 | 6 | 刚刚打开电脑, 看了一个小时的邮件, 打算真正开始工作的时候, 就被邮件通知需要参加一个有很多头头出席的会议, 会议里面讨论的东西和你八杆子打不着, 等到最后的时候才问你一个很简单的问题, 或者布置给你一个这周必须解决的任务. 7 | 8 | 终于从封闭的小会议室里面出来, 呼吸到了一点新鲜空气, 觉得自己要休息一会, 上上网聊聊天(如果老板不在的话). 忙碌一会后, 到了吃中午饭的时间. 9 | 10 | 中午只有半个小时的休息时间, 刚好吃个午饭, 回到座位上又开始工作, 但是晕乎乎地一下午过去了, 然后发现到了下班时间, 头脑瞬间清醒过来, 发出几封必须得在今天发出来的邮件, 然后把电脑关掉下班. 回到家里面发现自己太疲惫了以至于只好看看电视剧打发时间. 11 | 12 | 这是我们一天的工作, 这是我们一天的生活. 但是问问自己, 一天完成了什么? 每天工作8小时, 下班后疲惫不堪, 有谁能够敢说这一天真正做了什么有价值的事情? 13 | 14 | 如果.... 15 | ---------------------------- 16 | 17 | 每天早上来到公司, 你是不是很困? 那是因为你睡眠不足, 人不应该在这个时间工作, 而是去小跑一会, 和其他人聊聊天, 说说话. 18 | 19 | 你不一定要参与开会, 你只需要和其中的一个人或者几个人发发邮件, 实在不行了, 找2,3个人开开小会就可以了. 20 | 21 | 你不一定要在下午工作时间到了的时候开始干活, 半个小时的午睡就能让你精神焕发. 22 | 23 | 甚至你不需要每天都在办公室里面坐8小时, 办公室环境嘈杂, 甚至乌烟瘴气, 你到一个公园里面散一会步就能把困扰你一个星期的问题解决掉. 24 | 25 | 甚至你不需要去完成现在的工作, 你可以和老板说, 这部分的任务可以找一个外包公司, 甚至一个商业软件, 花费的钱比自己的人力费用少一半, 并且非常的稳定. 26 | 27 | 话说回来, 这份工作只是工作, 你应该拥有控制自己工作时间内干什么的权力. 老板给你钱是为了让你解决问题, 而不是让你当他的傀儡. 完成布置给你的事情就好了, 剩下的时间是你赢得的, 你可以做任何你想做的事情. 28 | 29 | **只要不要把工作搞砸**. 30 | -------------------------------------------------------------------------------- /使用纯文本方式写文档.rst: -------------------------------------------------------------------------------- 1 | .. include:: 2 | 3 | ================================ 4 | 使用纯文本方式写文档 5 | ================================ 6 | 7 | :Authors: 机械唯物主义 8 | :Date: 2010-12-26 9 | 10 | .. class:: handout 11 | 12 | 为2010-12-26号python聚会准备的slide 13 | 14 | 大家用什么方式写文档? 15 | ================================ 16 | 17 | 为什么要用纯文本 18 | ================================ 19 | 20 | WYSIWYG 21 | ================================ 22 | 23 | 自由 24 | ================================ 25 | 26 | 专注 27 | ================================ 28 | 29 | word 30 | ================================ 31 | .. image:: http://www.viemu.com/ViEmu-Word-2007.gif 32 | 33 | xml 34 | ================================ 35 | .. image:: http://www.kirupa.com/net/images/xml_doc2.gif 36 | 37 | 应该是这样的 38 | ================================ 39 | 40 | :: 41 | 42 | Book: 43 | name: pyqt book 44 | chapter: 45 | - python introduce 46 | - qt introduce 47 | 48 | 49 | reStructuredText 50 | ================================ 51 | 52 | rst2s5 53 | ================================ 54 | 55 | sphinx 56 | ================================ 57 | -------------------------------------------------------------------------------- /像对待金钱一样对待时间.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.yileba.com/wp-content/uploads/2008/11/savetime.jpg 2 | :align: center 3 | 4 | 我们每个人都有24个小时, 不多也不少. 这些时间及其宝贵. 到底有多少时间被好好利用了? 5 | 我想, 除了少数人, 大家都会觉得应该很少吧. 比起这个来, 更为严重的状况是: 大家很大程度上已经习惯这样了. 6 | 很多时间消耗掉, 而自己却全无所觉. 7 | 8 | 回头想想, 某种程度而言, 时间像是金钱, 我们可以决定把时间/金钱投入在某个特定的事情上面, 我们可以用时间/金钱来交换我们想要的东西. 9 | 而时间甚至比金钱还要好: 我们每个人每天都能获得24小时的时间, 而钱却不能每天从头上掉下来! 10 | 11 | 对于金钱, 大多数人都会在花出去之前慎重考虑, 是否购买的东西是我真正想要的? 这个东西是否值我投入的钱? 是否有更经济的替代品? 12 | 我是不是在其他地方更需要钱? 但是, 我们却不会想对待金钱一样慎重对待时间. 如果有一天工作空闲下来了, 我们会怎么做? 13 | 大多数人恐怕就会想: 啊, 好不容易有空闲时间了, 休息会吧. 然后就上网, 聊天, 打豆豆, 时间就这样过去了. 14 | 15 | 那么既然时间和金钱一样有价值, 那么我们为什么就不能想处理金钱一样处理时间呢? 我们来尝试一下: 16 | 17 | 首先, 对于钱, 我们习惯进行计划. 有什么是我们需要获得的? 18 | 这些东西里面哪些重要? 哪些需要先买? 哪些可以等有钱的时候买? 是否有更好的替代品? 19 | 20 | 我们可以以同样的方式来对待时间. 我们需要把时间投入在什么事情上面? 这些事情哪些是重要的? 21 | 哪些是相对不重要的可以在有时间的时候去做? 如果真的好好计划, 时间就会剩下很多, 而不是随意消耗掉了. 22 | 23 | 那么我们如何对待这些多出来的时间呢? 对于多出来的金钱, 我们可以放到银行里面. 如果有个时间银行就好了, 有时间的时候就把时间存进去, 需要的时候就取出来. 24 | 25 | 但是我们每天只有24小时的时间, 想要更多获取不到, 不想要了也给不了. 怎么能够存到银行里面去? 26 | 不过呢, 我们可以把上面的步骤反过来, 达到同样的目的: 27 | 对于钱, 我们先有钱, 然后存起来, 然后考虑投入的项目就取出来花掉. 28 | 而对于时间, 先有需要投入的项目, 然后在找投入的时间. 多出来的时间, 可以投入到这些项目里面去. 29 | 和分期付款一样, 不过我们分期付的是时间而已. 30 | 31 | 时间是比金钱优质得多的资源, 如果我们把时间当作金钱一样慎重规划的话, 我们可以突然之间得到很多. 好好对待时间吧! 32 | -------------------------------------------------------------------------------- /兔子流.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://z.about.com/w/experts/Rabbits-703/2008/12/Weepy-Eyes.jpg 2 | :align: center 3 | :width: 600 4 | 5 | hello everyone, today I will introduce you an new kind of science fiction, 6 | we call it "兔子流" in Chinese, translate as "rabbit like". 7 | 8 | what is "兔子流"? 9 | ---------------------------------------------------- 10 | In the ancient old days, a writer, name as "小学生", translate as "schoolchildren", he write a fiction, name as "兔子尾巴", and with this characteristic: 11 | 12 | * main character(young adult male) have super power. 13 | * have no sense of moral. 14 | * enjoy play around the world. 15 | 16 | what is the detail? 17 | ---------------------------------------------------- 18 | 19 | for AD&D fans, it is a book about a chaos evil character, how he do the dirty things. here are some example: 20 | 21 | * he kills people for fun. 22 | * he has one or severial girls as toy. 23 | * enjoy the life of doing whatever he wants, if he like something, just take it. 24 | * have sick sense of humor and "moral", he thinks he is doing something good which actually really bad, such as kill raped girl only because he think the girl will have a bad life in the future. 25 | * he make social experiment. for maintaining good traffic condition, he make laws that driver can hit anything on the road... even the kid. 26 | * no friend, no family, no strong feeling except fearing of death. 27 | 28 | examples 29 | ---------------------------------------------------- 30 | here are some fiction belows to "兔子流", and you can google them, 31 | because it is so evil that no static links I can provide: 32 | 33 | * 兔子尾巴 34 | * 人民公敌 35 | * 我无恶不作 36 | * 兔子流屠龙纪要 37 | 38 | 39 | conclusion 40 | ----------------------------------------------------- 41 | "兔子流" is one of the extrime fiction types I enjoy very much, easy to read, and have more fun. currently no new fiction is out, I hope in the future there can be more. 42 | -------------------------------------------------------------------------------- /公主与骑士.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://rlv.zcache.com/the_knight_and_the_princess_poster-p228765749652786836q4dx_400.jpg 2 | :align: center 3 | 4 | QQ聊天的时候随便接着写了点东西, 挺无聊的. 烂尾了. 5 | 6 | 我 20:59:41 7 | 8 | 公主应该是在城堡里面的. 9 | 10 | 我 20:59:48 11 | 12 | 城堡里面有高塔, 高塔上面有窗户, 可以看到远处. 13 | 14 | 我 21:00:11 15 | 16 | 这样远处也能看到高塔, 以及高塔窗户里面的公主. 17 | 18 | 我2011-03-21 21:00:58 19 | 20 | 但是远处看不到恶魔. 21 | 22 | 我2011-03-21 21:02:03 23 | 24 | 远处的王子, 看到高塔上面的公主, 骑着白马就赶了过来. 25 | 26 | 女孩子2011-03-21 21:02:04 27 | 28 | 29 | 30 | 我2011-03-21 21:03:01 31 | 32 | 很多王子都赶往城堡, 但是没有一个回来的... 33 | 34 | 我2011-03-21 21:03:36 35 | 36 | 有人说, 城堡里面有非常凶狠的恶魔, 杀掉了所有的王子... 37 | 38 | 女孩子2011-03-21 21:04:03 39 | 40 | 写童话啊! 41 | 42 | 我2011-03-21 21:04:22 43 | 44 | 有人说, 公主就是恶魔, 诱惑王子过来, 然后一口吃掉... 45 | 46 | 我2011-03-21 21:05:00 47 | 48 | 然后以呃传呃,就再也没有王子去救公主了, 49 | 50 | 女孩子2011-03-21 21:05:11 51 | 52 | 53 | 54 | 我2011-03-21 21:05:17 55 | 56 | 毕竟王子还有一个国家需要继承的... 57 | 58 | 女孩子2011-03-21 21:05:18 59 | 60 | 对啊!对啊! 61 | 62 | 我2011-03-21 21:05:46 63 | 64 | 然后... 虽然没有王子去了, 但是还有其他人. 65 | 66 | 我2011-03-21 21:06:07 67 | 68 | 为了荣耀的骑士. 69 | 70 | 我2011-03-21 21:06:59 71 | 72 | 王子去城堡, 是为了解救公主. 骑士去城堡, 是因为公主需要被解救. 73 | 74 | 我2011-03-21 21:08:00 75 | 76 | 骑士没有准备白马, 因为太显眼, 骑士找了一匹黑马. 在夜里几乎可以融入到影子里面. 77 | 78 | 我2011-03-21 21:08:44 79 | 80 | 骑士没有走那条通往城堡的大路, 因为骑士知道, 在高塔上面可以很容易地看到大路上面的人. 81 | 82 | 女孩子2011-03-21 21:08:45 83 | 84 | 你哪找的 85 | 86 | 女孩子2011-03-21 21:09:11 87 | 88 | 89 | 90 | 我2011-03-21 21:09:23 91 | 92 | 虽然公主看到有人来救她能够得到安慰, 但是公主能看到, 恶魔也能看到. 93 | 94 | 我2011-03-21 21:09:49 95 | 96 | 不是找的. 故事自己发展的. 97 | 98 | 我2011-03-21 21:10:44 99 | 100 | 骑士身穿黑色铠甲(我们就叫他黑骑士吧), 夜里行进, 穿过弯曲的森林小径, 101 | 102 | 我2011-03-21 21:11:15 103 | 104 | 牵着马翻过被白雪覆盖的山峰, 105 | 106 | 我2011-03-21 21:11:33 107 | 108 | 来到了被沼泽覆盖的城堡. 109 | 110 | 我2011-03-21 21:11:45 111 | 112 | 来到了被沼泽围绕的城堡. 113 | 114 | 我2011-03-21 21:12:31 115 | 116 | 通往城堡的路只有一条. 黑骑士知道, 一定有陷阱. 117 | 118 | 我2011-03-21 21:14:48 119 | 120 | 黑骑士整理好了盔甲, 擦亮了长剑, 喂好了黑马, 走上这条去城堡的路. 因为通往城堡的路只有一条. 他只希望恶魔足够惊讶, 以至于来不急准备好所有的陷阱. 121 | 122 | 我2011-03-21 21:15:37 123 | 124 | 城堡大门开着, 城门上面插着好几根长矛, 长矛上面有: 125 | 126 | 我2011-03-21 21:16:54 127 | 128 | * A. 王子们面目扭曲的头颅 129 | * B. 带有欢迎标语的彩旗 130 | * C. 告示 131 | * D. 绑着的一个小精灵 132 | 133 | 我2011-03-21 21:16:59 134 | 135 | 选一个. 136 | 137 | 我2011-03-21 21:18:07 138 | 139 | 可怜的王子们... 140 | 141 | 我2011-03-21 21:20:48 142 | 143 | 长矛上面王子们面目扭曲的头颅, 这些头颅都风干了, 俊美的容颜已不在, 金色的长发已经变成枯草堆, 几只乌鸦拿它当作窝, 黑骑士骑着黑马慢慢过来的时候, 乌鸦飞起来, 发出哇哇的叫声. 144 | 145 | 我2011-03-21 21:21:17 146 | 147 | 黑骑士赶紧加快了步伐, 走进了城门. 148 | 149 | 我2011-03-21 21:22:09 150 | 151 | 他把马栓在一根柱子上面, 打量了四周. 152 | 153 | 我2011-03-21 21:23:32 154 | 155 | 有3条道路, 城门正面, 黑漆漆的走道. 城门里面的一个側门. 以及, 上方垂下来的绳索. 156 | 157 | 我2011-03-21 21:24:06 158 | 159 | 黑骑士犹豫了片刻,选择了: A城门正面, 黑漆漆的走道. B城门里面的一个側门. 以及, C上方垂下来的绳索. 160 | 161 | A 162 | 側门是一条回旋式的走道, 非常狭窄, 只能允许一个人通过. 163 | 黑骑士的头盔太高了, 弯这腰才能进去, 于是黑骑士脱下来了头盔. 164 | 165 | 头盔下面的黑骑士是怎么样的呢? 166 | 167 | * A. 帅哥. 168 | * B. 美女. 169 | * C. 中年大叔. 170 | * D. 老人. 171 | 172 | 爬了不知道有多久, 旋转向上的走道终于到了一个尽头: 一扇有金色蛇条纹的木门. 木门中隐约传来阵阵歌声, 173 | 木门下透过来的亮光, 把最后一段走道映成黄金色.. 174 | 175 | 黑骑士小心地推开门, 发现眼前是一场舞会... 176 | -------------------------------------------------------------------------------- /关于GFW的资料整理.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://velanlee.files.wordpress.com/2010/06/gfw.jpeg 2 | :align: center 3 | 4 | 为了能够让普通人知道一些只有我们IT人以及少部分眼界比较开的人知道的事实, 特整理一些资料. 5 | 6 | 什么是GFW? 7 | ----------------------- 8 | 这里有一个比较好的介绍, 国内看不了...(国内看不了国外能看就是说这个东西被墙掉啦!), 需要翻墙: 9 | 10 | https://docs.google.com/present/view?id=dcwjp3p5_0d44t5hsx 11 | 12 | 我做了一个墙内可看版本: 13 | 14 | http://www.slideshare.net/LinjunHalida/tell-you-what-is-gfw 15 | 16 | 为什么要翻墙? 17 | ----------------------- 18 | 你可能现在对这个没有什么感觉, 因为你一直都在墙里面, 你可以看看其他人对墙的评价: 19 | 20 | * http://www.isweetriver.com/2009/why-do-i-have-to-climb-over-the-wall 21 | * http://www.chinagfw.org/2010/08/blog-post_3846.html 22 | 23 | 我为什么要翻墙? 24 | ----------------------- 25 | 26 | * 我是一个程序员, 作为程序员必须的一系列服务, google, gmail, twitter... 都需要翻墙. 如果没有google去搜索我需要的知识, 我的生产力会降到原先的1/10. 27 | * 我对这个世界有兴趣. 我希望看到真实的东西. 而在墙内, 信息质量非常低, 无数信息完全不知道真假, 真实的信息无法获知, 所以我必须要翻墙. 28 | * 我对即时信息有兴趣. 我希望能够看到世界上正在发生的事情. twitter是全世界都在用的即时消息服务, 国内有各种微博, 但是只有中国才有这种现象, 因为twitter在国内无法访问. 国内的微博也是受到人工审核的, 你无法发布关于国家领导人等一系列的消息. 29 | * 我对娱乐, 学习有兴趣. 如果连世界上最大的用户共享视频的网站youtube都不能上, 我如何获得一手的娱乐/学习信息? 30 | 31 | 如何翻墙? 32 | ----------------------- 33 | 34 | 如果你现在开始对外面的世界有了一点兴趣, 你可以继续往下看. 如果你对外面的世界完全没有兴趣, 35 | 觉得现在的话没有任何问题, 那么你就到此为止吧, 只是哪天你有兴趣了或者发现什么你想要知道的信息在网络上怎么也找不到, 你可以回来继续看这篇文章. 36 | 37 | 要绕过GFW, 你需要一个GFW外面的服务器来做中转, 我现在提供这样的免费帮助(数量有限) 38 | 39 | 我专门搭建了一个ssh服务器, 你可以发邮件向我要帐号. 帐号专人专用, 为了本服务器安全考虑, 不允许再发布, 否则禁用帐号. 40 | 41 | 具体方法(如果遇到问题可以找我求助): 42 | 43 | http://www.cfresh.net/pc-tech/662 44 | 45 | 好像也被墙了, 如果上面那个不能访问, 进: 46 | https://www.evernote.com/shard/s7/sh/1464eee6-78d0-44de-aa3d-45039228c1d1/cdf44af4963de551d116655fca675268 47 | 48 | 翻墙后能做什么? 49 | ----------------------- 50 | 好了, 你现在翻过来了, 应该做什么呢? 51 | 个人给你几个建议: 52 | 53 | * 如果你想随便看看视频, 去 http://www.youtube.com, 里面有学习的好资料, 搜索: open courseware, TED. 54 | * 如果你想看看全世界的微博, 你可以去 http://www.twitter.com , 关注我吧, 搜索: linjunhalida 55 | * 如果你想看看百科全书以及40年前中国到底发生了什么, 你可以去zh.wikipedia.org, 搜索对应的年份和事件. 56 | * 如果你只是想看妹子, 去 http://boards.4chan.org/s/ 57 | * 如果你想看美剧而你的英语又比较好的话, 上 http://www.hulu.com 58 | 59 | 结论 60 | ----------------------- 61 | 希望你能通过上面的阅读和实践, 能够体会到使用一个真正自由, 完整的互联网的快乐. 62 | -------------------------------------------------------------------------------- /关于理性的设计.rst: -------------------------------------------------------------------------------- 1 | 2 | .. image:: http://www.jackpike.co.uk/waveride.jpg 3 | :width: 600 4 | 5 | 上周六, 我参加了 `pmcamp `_ 的活动, 主要是为了看看传说中的 `西乔 `_. 见面后, 发现真人完全比不上twitter上面的照片... 6 | 7 | 不过她带给我们一个演讲<理性的设计>, 的确是非常的精彩, 整个过程我们都全神贯注地听, 获益也非常的多. 以至于在讲完之后的提问环节, 我们都以"西乔老师"作为尊称来提问. 8 | 9 | 具体内容可以见分享出来的 `幻灯片 `_ , 可能以后会有放出来的视频, 具体得看pmcamp的组织者了. 10 | 11 | 这里说下我个人的理解, 对于资深读者来说可以到此为止了. :) 12 | 13 | 和名字所说的一样, 整篇内容都是讲关于如何做设计的, 以及设计的整个思路, 其实是非常的理性的. 目标是理性的, 思路是理性的, 准则也是非常理性的... 设计并不像我们想象中的那么感性, 虽然会触发观者的感性思维, 但是设计的过程是可控的. 14 | 15 | 首先要说的是, 在解决问题之前, 最重要的是要问对问题. 做设计, 需要把握住几点: 受众.. 等一等, 这些都是幻灯片里面已经有的内容, 我不需要再说一遍了. 要补充的是: 无论是做什么事情, 都要先问对问题, 以及可以从受众, 目的, 语境这三个方面来考虑. 面对威权我们可以用言语来撼动, 面对拖拉机我们只有跑路---看起来扯远了. 16 | 17 | 这里面提到一个重要的思想: 视觉习惯. 即利用用户的视觉习惯来带动他们, 按照我们希望的方法来"看", 来"想", 来"活动", 这个对于任何的设计, 都是有用的. 不能让用户来学习我们的思维, 而是让用户不知不觉按照我们预设的道路走. 比如现在很多流氓网站上面的flash广告就很深得精髓. 18 | 19 | 然后下面就是具体的策略: 排列,强调,清晰,简洁,风格,语气, 按照我这个程序员的思想来说, 就是用用户的思维语言(主要还是人类视觉的识别方式)来表示信息, 去掉多余的信息, 强化需要表达的信息. 这里面我还获得了一个观念: 现代主义. 极简, 强烈对比, 内容间大段的空白, 符合网格. 用这样的方式来展示信息, 给人以强烈的信息刺激..... 恩, 看起来我的博客就是现代主义的. 有没有人注意到底下的版权声明? 20 | 21 | 我觉得, 里面讲的内容都是非常实战性的, 需要在实际工作中不断地运用, 成为我们的本能.. 对于任何人来说, 其实都会从事设计(至少设计自己的房间), 这里再次推荐 `幻灯片`_ 给大家. 22 | 23 | 恩, 还有, 她每天会推几个设计到 http://designlol.net/ 上面, 大家可以学习学习. 24 | -------------------------------------------------------------------------------- /关于理解.rst: -------------------------------------------------------------------------------- 1 | 以前我看维特根斯坦的书<语言游戏>, 我印象很深的一个概念就是(非原文): 词语的含义不是字面上的意思, 而是要看它的用法. 词语本身的产生是有历史条件的, 字面上的含义可能蕴涵有非常复杂的历史成因, 但是普通人不是历史学家, 我们使用一个词语不是因为我们理解了这个词语的意思才去用它, 很多时候, 只是因为听到别人在某些场合针对某种状况下面使用这个词语, 我们才学会它. 简单地说, 我们是通过模仿学习语言, 而不是通过理解词语的含义. (单独背单词的人可以退散了) 2 | 3 | 让我们把这个概念扩展开来一下, 应用到其他领域. 来看看法律. 很多人理解法律只是按照法典字面上的意思来, 而不去注重实际的使用, 而在很多国家, 比如我们国家, 从字面上是很难理解得到实际法律执行和运作的方式的, 如何解释法律, 不同地区的执行状况, 执法过程, 非成文规则, 这些内容都比法典本身复杂, 灵活, 有生命, 甚至可以在善于表达的专业人士口中变得妙趣横生. 4 | 5 | 我们也可以把这个概念应用在生活中. 一个人的知识背景和思考方式形成了语言的具体内容, 但是要考察其他方面, 就不太能相信言语, 因为言语不是这样产生的... 我们不能因为一个人说要怎么样就认为他会怎么样, 我们只能知道言语产生的条件: 他在什么样的刺激下, 因为哪些知识背景和阅历产生出来了这样的言语. 举个实际的例子, 如果一个人突然说"我要死啦", 并不是说他自己真的要死了, 而是因为他搞砸了什么事情, 然后他自己平时也咋咋呼呼的. 这个时候, 我们不能根据字面上的意思而做反应"要死早死", 因为言语的字面意思不能反映实际他需要表达的内容. 我们一般会问一下"怎么了? 被炒鱿鱼啦?" 6 | 7 | 我们可以应用到学习上面. 进入一个新领域之前, 我们可能会被这个领域的无数新词汇, 新概念弄晕, 它们字面上面的意思和实际的使用方式往往不对应, 实际的做事方式和文档资料里面的也有很大出入. 这个时候, 我们可以通过模仿: 找一个该领域专家, 学习他的思考方式做事方式, 让自己同化成他的样子, 我觉得这样才是最快速有效的学习方法. 8 | 9 | 当你观察事物的角度从显式的含义转换到真实运作方式的时候, 你会发现你开始理解了很多以前不理解的事物. 你会感觉世间万物都在流动, 它们不是死的东西, 它们都在时刻调整, 变化, 你不好通过表象来定义它们, 你需要感觉, 深入, 理解, 运用. 这样无数丰富的世界会在你面前敞开大门. 10 | 11 | -------------------------------------------------------------------------------- /创业者需要的特质.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.primesplus.com/wp-content/uploads/2011/09/shanghai.jpg 2 | :align: center 3 | :width: 600 4 | 5 | 十一七天, 我作为裁判全程参与 `GuruDigger Guru Fuel活动 `_, 具体内容我就不多说了, 我就说一下在城市定向越野过程中的一些感受. 6 | 7 | 我10/4全天跟随yinwm同学以及wgx同学. yinwm同学比较资深. 在整个活动过程中, 本组都以快节奏, 而有效率的方式行进. 人员按照前锋探路和后勤查路的方式分工进行. (另外一组也一样), 在整个过程中yinwm他高效深刻的行事方式给我留下了深刻的印象. 8 | 9 | 第一个是执行力. 在本次活动中, 他身体和精神都集中到实现目标上面. 没有见过他上厕所, 吃饭也只是为了照顾队员而短暂停留(如果是他自己的话绝不会停下). 一天几乎没有原地停住, 就算看手机的时候也通过走盲道的方案来防止速度减慢. 这样的行为虽然只是习惯(普通人是不会这么认真的吧?), 但是也绝对不是能够简单养成的. 10 | 11 | 第二个是问路技能. 他洞察到一个智慧: 就是问路是相当重要的技能. 外地人是不熟悉本地状况的. 本地人是最大的资源. 12 | 今天大概进行了三四十次问路, 基本上每个可疑的路口都会问, 并且问路过程没有丝毫的脱泥带水. 每次问路的对话都是几乎一样的: "您好, 请问..., 谢谢您.", 并且同一个地点会问多个人, 以确保目标正确. 当然, 这个问路不只是在城市越野中有用. 13 | 14 | 第三个是把握重点. 深入地理解问题. 本次活动有bonus项目, 就是找个89年的女孩照相. 15 | 另外一队是走量, 对所有的女生都请求照相, 然后才问年龄(不得不说这一队真的是魅力无限, 半个小时邀请到十几个人). 16 | 这边意识到了核心是找89年的女孩, 于是直接找疑似的目标, 然后直接问是不是89年的, 而节省掉搭讪错误目标消耗的时间. 17 | 可能跟yinwm有相关数据分析经验的原因吧. 18 | 19 | 具有以上这些特质, 问题解决不在话下. 但是本次活动yinwm同学这队还是输了. 因为这边的游戏规则: 时间和金钱都是一分, 而路程不是很远. 20 | 如果一队仔细分析了这个游戏, 会发现, 如果一只队伍, 下决心不消耗任何金钱, 那么至少不会输掉任何一轮. (只要对方也不是那么拼). 21 | 另外一只队伍机缘巧合地选择了这样的策略, 然后在大比分落后的情况下反败为胜. 所以再补上一条: 认真分析清楚游戏规则. 22 | 23 | 本次活动全程摄像, 个人觉得还是挺有料的, 一周之后会有视频放出来, 敬请期待. 24 | 25 | edit: 活动结束了, 视频地址: http://www.primesplus.com/2011/10/17/burning-guru-fuel-2011-shanghai-program/ 26 | -------------------------------------------------------------------------------- /南京游记.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://lh6.googleusercontent.com/_os_zrveP8Ns/TZnF7jXahsI/AAAAAAAADoM/kCDVL2zBsg0/s400/IMG_0372.JPG 2 | :align: center 3 | 4 | 决定 5 | ------------------------ 6 | 7 | 最近清明节放假三天, 除了一天去玩 http://snakechallenge.org 以外, 剩下两天我决定去南京玩, 避免宅在家里. 8 | 9 | 我在南京没有认识的人, 于是我在豆瓣上面吼: `谁在南京 `_? 于是有 `半仙@深山 `_ 回应我. 于是我放心地----裸游了. 我除了中山陵, 完全没有计划好到底去哪里玩, 就出发了. 10 | 11 | 4/4 12 | ------------------------- 13 | 14 | 我8:10从嘉定坐长途出发, 11:30左右到南京中央门. 我这趟旅行虽然不能说惊天动地, 但也非常有意义. 首先, 在长途车上面, 我就遇到了一位美女(非女性的指代, 而是真正的美女), 她坐在我的边上, 我们进行了亲切友好的交流, 互相介绍了自己的状况, 以及看了<武林外传>的电影. 在车上, 经过我的再三邀请, 她终于同意和我一起去南京中山陵玩. 15 | 16 | 我们打算做游一公交车去中山陵. 在路上, 我果断向其他一同等车的人们询问, 有谁一起去中山陵. 不出我所料, 果然有很多人去. 其中一对学生情侣中的女生, 已经去过好几次了, 于是我请求组团. 他们同意了. 17 | 18 | 我们的运气不错, 虽然好不容易地挤上游一公交车, 但是总比在下面几站路上没有办法挤上来(师傅根本不停车)的同学们要好很多了. 师傅好心地欺骗他们: 很快就有下班车.. 但是我们都知道, 下班车只会更挤. 19 | 20 | 我们到了中山陵, 然后----那对学生情侣就飞奔起来(当然只是走路), 我和美女都拼命地赶啊赶啊, 爬楼梯, 上中山陵, 排队看国父和青天白日满地红, 然后下山了... 21 | 22 | 然后我们就走下山的路, 走啊走啊走啊走啊走啊走啊走啊, 路上车多人多, 走了好久终于走到地铁站. 然后我们就互相告辞分开各奔东西. 如果那位美女看到这个日记, 我要说声对不起让你在最挤的时候来中山陵以及一直在赶路... 23 | 24 | 之后就是: 去买火车票, 去万庭酒店checkin, 以及和半仙同学回合. 晚上腐败去他家以及在周围(万达广场)逛了下. 然后就休息了. 25 | 26 | 4/5 27 | --------------------------- 28 | 第二天, 我们约定8点碰头, 他带我去吃了下鸭血粉丝汤. 还行. 然后我们去莫愁湖, 结果发现竟然要27块的门票, 周围还被围墙围起来了, 于是我们决定不进去了, 转移往南京图书馆和总统府. 29 | 30 | 南京图书馆里面还是挺大的, 并且有足够的座位让人看书. 但是没有我期望的: 24小时开放以及能够住人. 在我看来, 不能让人一口气看一星期的书而不需要出门的图书馆是不够格的(好像中国没有这样的图书馆吧). 31 | 32 | 然后我们从正门离开, 去看了看总统府外围. 人太多就不进去了. 这种名存实亡的"尸体"也看看外面就好了. 33 | 34 | 然后我们路过美术馆, 这天的展会是书法, 作者里面有姜昆我心里就凉了. 冲着免费就进去看了看, 没有什么感觉就出来了. 35 | 36 | 之后我们杀往玄武湖. 我们到的是南部白马寺附近, 放风筝的人很多. 我们从西边走, 感叹环境很不错, 城墙很高什么的... 中途有上去的路, 于是我们上了城墙, feel good. 37 | 38 | 然后我们下城墙, 找吃的, 走了很远很远很远很远很远很远很远很远的路, 到了湖南路, 小吃一条街, 因为我不想吃太油腻的东西, 我们去吃了一个中式快餐的粥店.. 39 | 40 | 然后我们去了凤凰书城, 然后我决定回去之前剩下的2个小时时间就去玄武湖坐坐. 我们走过去, 避开玄武门前的人流高峰, 往南走, 在一个凳子上面坐着, 聊天打屁, 看经过的美女, 然后搭讪.. 41 | 42 | 然后我们被一个看相的大妈搭讪了, 半仙调戏了她一段时间后就把她气走了. 43 | 44 | 我们继续看美女. 半仙同学觉得一个蓝衣美女不错, 于是开玩笑地说等她回来(玄武湖过去有很长的路, 不是所有人都能走到头的, 到头也没有地铁站), 结果... 果然等到她回来了. 鉴于半仙同学没有勇气搭讪, 于是俺进入尾行状态, 他只好也一起尾行. 然后我上去问问题, 接上了话茬. 但是美女同学还是不怎么搭理我们. 这个时候我使上了杀手锏: 向美女同学介绍, 半仙同学对你很有兴趣, 希望认识下.. 然后我们顺利同行, 美女还是半理不理的... 45 | 46 | 在我多次鼓励多次未遂屡败屡战出谋划策下, 半仙同学终于要到了QQ号. 并产生了一个momentum: 她排的卖票机无法购买了, 于是我排的另外一条队帮忙买了票. (其实她应该能买到票结果因为替我买票于是没有买成--挺复杂的). 47 | 48 | 之后我们互别, 我去火车站他们.. 他们干什么事情我就不知道了.. 49 | 50 | 我回上海坐的是高铁无座, 上车后发现又是一个美女, 然后我和她搭话, 被她的电话打断, 期间知道了她是干保险理赔的, 去南京和以前的同学聚会, 学历研究生云云.. 从她的说话方式上面看, 是一位聪明的美女. 奈何电话完毕后就打游戏了, 让我不好和她进一步交流... 真是失败呀. 不过可能她不想认识新人有男朋友平时有很多人追独身主义拉拉.. 搭讪成功的概率其实不高的, 我成功率已经可以了. 51 | 52 | 然后我去骚扰了另外一位刚研究生毕业去宁波工作学通信进国企的帅哥, 以及另外一位做杂志平面设计在火车上用苹果电脑photoshop修图的美女, 并成功要到了美女的QQ号.. 53 | 54 | 这里补充说明下: 我搭讪是非常有诚意的, 先交朋友, 目标做男女朋友, 未来婚姻什么的. 能走到哪一步看机缘. 55 | 56 | 结论 57 | ------------------------------ 58 | 59 | 所有照片在: https://picasaweb.google.com/linjunhalida/201144 60 | 61 | 去旅游真的非常有意义. 62 | 63 | 花费整理 64 | -------------------------------- 65 | 66 | 1.5元矿泉水 67 | 91长途车 68 | 169酒店 69 | 36上城墙 70 | 146高铁 71 | 72 | 总计 443.5 73 | 74 | 以及半仙同学请吃的3顿饭和汽水费 75 | -------------------------------------------------------------------------------- /可以这样做吗.rst: -------------------------------------------------------------------------------- 1 | 2 | .. image:: http://lh6.ggpht.com/_os_zrveP8Ns/TMqygkKlBLI/AAAAAAAADKg/1XLcDk3_uk8/s800/out-of-the-box.jpg 3 | :align: center 4 | 5 | 在超市里, 肚子饿了, 直接拿袋食物开封就吃, 但是不要忘了出去的时候付账. 6 | 7 | 一本书感觉不错/糟糕, 直接通知作者本人, 告诉他哪里不错/糟糕. 8 | 9 | 走在路上, 发现一个人吸引了自己的注意力, 走上前去告诉他/她, 你吸引了我,以及为什么吸引我. 10 | 11 | 不在意亲戚的想法, 做自己想要做的事情, 等做成了, 再通知他们. 12 | 13 | 路上遇到一个陌生人, 假装认识他, 和他寒暄. 14 | 15 | 如果已经离开了校园, 找一所大学正在上课的教室进去听课, 提问, 和其他同学交流. 16 | 17 | 到一个公司/单位/政府部门, 观察其中的一个人, 去和他交朋友. 18 | 19 | 每个月把家里重新装饰一遍 20 | 21 | 没钱买房, 去租一个别墅住一段时间. 22 | 23 | 工作无聊了就辞职. 24 | 25 | 让自己领域里面的人知道自己的存在, 如果不是通过实力, 至少通过特立独行. 26 | 27 | 把自己的一段时间卖给陌生人. 28 | 29 | 如果想做什么事情, 立刻就去做, 即使是离开自己当前住的地方, 即使是离开自己当前的工作, 即使自己当前的工作收入不菲 30 | 31 | 尝试同性爱, 异性爱, 以及嫖妓. 32 | 33 | 34 | -------------------------------------------------------------------------------- /夏日重乐季现场.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://img3.douban.com/mpic/e473912.jpg 2 | :align: center 3 | 4 | 我最早开始听死亡金属可能是大学的时候, 到现在也有一段时间了, 但是听的机会不是特别多. 喜欢是喜欢, 但是也没有喜欢到fans的程度. 最近看到豆瓣友邻分享出来的旋律死亡金属的现场演出: http://www.douban.com/event/14129983/discussion/ 我觉得作为一个sensates, 不能错过这样的机会. 5 | 6 | 于是我天昨天(2011.07.16)就去了. 时间是9:00 - 12:00. 我8:30赶到举办场地育音堂, 门口很多人都到了. 这些人给我的感觉, 怎么说呢, 就是金属fans. 大部分人都穿黑衣T-shirt, 上面印着金属厂牌的名称, 有看到arch enemy, 霜冻前夜等. 我还看到有一位同学T-shirt上面写着大字: 我不是党员. 这种衣服我是不敢穿着上街的. 很多留长头发的, 很多纹身的, 偶尔见到穿孔的同学. 竟然有很多的女生, 真不可思议. 可能因为是旋律死亡吧, 群众接受程度比较高. 7 | 8 | 然后我们预售票的同学就先进场了, 场地不大, 就是一个普通的酒吧的大小. 刚好放下5人组合的舞台, 以及正对面的一块空地. 我找了一个好位置, 舞台侧方向, 地板是垫高的, 有高座位. 人陆续进场, 然后, 就爆满了. 空地上面挤满了人, 边上, 楼梯上也都是人. 应该有300人吧. 9 | 10 | 过了一段时间, 我和周围人零散地说了几句话之后, 就开场了. 我其实听得少, 对乐队不熟悉. 他们说这3个乐队都比较有名. 当然最有名的是霜冻前夜. 第一场应该是惊叫基督, 主唱应该是死腔. 死亡金属一开始就是暴躁起来的, 我一会就适应了. 11 | 12 | 靠近舞台的观众应该都是真正的fans吧, 都比较high. 随着音乐跳动, 甩头. 我开场后就站在凳子上面看, 从我的角度上看上去, 就是真正的人肉构成的海洋和波浪. 后面的人搭着前面人的肩膀, 低下头, 随着音乐甩. 然后人们撞来撞去, 时不时有人爬上舞台, 背往后倒下, 然后人们就把他举在头顶上推来推去. 13 | 14 | 后面的人都不怎么活跃, 头也不甩. 让我一点感觉都没有, 于是我就在第二场Fearless的时候就跑到前面去了. 很快气氛就上来了. 人挤在一起, 互相碰撞, 甩头, 搭在别人肩膀上低头甩. 非常high. 前面的人身高都超过了1米7, 矮个的人在这里是有危险的. 乐手看起来感觉挺高兴的, 估计是第一次见到这么多人吧? 15 | 16 | 汗流浃背加上体力不支加上鞋子被踩烂了之后, 第三场我退了回来. 来现场的外国人也很多, 妹子也很多. 站我前面的妹子一直非常high, 几乎一直都在跳着. 到了第三场, 后面的人也渐渐气氛起来了. 17 | 18 | 最后到12点结束了, 我带着一身臭汗回去了. 参加现场没有像我认为的那么兴奋, 但是体验过后感觉也还不错. 和人拼车回去的时候聊天, 他说上海的金属气氛很差, 今天来了很多人, 大多数还是凑热闹的. 我也觉得金属还是北京才是核心. 19 | 20 | ps: 等其他人的照片和视频放出来的时候我再补充上吧. 21 | -------------------------------------------------------------------------------- /如何使用预编译头以及预编译头的原理.rst: -------------------------------------------------------------------------------- 1 | 问题 2 | --------------------- 3 | 4 | 在c/c++里面,如果一个xxx.c要暴露出接口给其他文件的话,一般是提供一个xxx.h的文件作为接口,然后其他文件会把xxx.h文件包含进自己里面去,这样就可以知道xxx.c提供了什么. 5 | 6 | 但是会出现这样的问题,如果一个xxx.h文件被包含了N次,那么项目在编译的时候,会把这部分的代码重复编译N次,当这个xxx.h文件非常大的时候,编译速度就很慢了.比如xxx.h代表了一个库.(Qt, windows等) 7 | 8 | 解法 9 | --------------------- 10 | 11 | 为了解决这个问题,我们可以先把头文件编译好,然后再包含到其他文件里面去.这样,每个引用了该头文件的源文件就不需要再次编译这部分了. 12 | 13 | 示例 14 | --------------------- 15 | 16 | 来自: http://stackoverflow.com/questions/58841/precompiled-headers-with-gcc 17 | 18 | 建立以下文件: 19 | 20 | stdafx.h:: 21 | 22 | #include 23 | #include 24 | 25 | a.cpp:: 26 | 27 | #include "stdafx.h" 28 | int main(int argc, char**argv) 29 | { 30 | std::string s = "Hi"; 31 | return 0; 32 | } 33 | 34 | 编译和执行命令:: 35 | 36 | g++ -c stdafx.h -o stdafx.h.gch 37 | g++ a.cpp 38 | ./a.out 39 | 40 | 删除了stdafx.h文件之后,执行g++ a.cpp照样编译成功. 41 | 42 | 实现的原理很简单: 43 | 44 | * 首先把一个stdafx.h头文件,编译成stdafx.h.gch. 45 | * 当执行g++ a.cpp的时候,g++编译器会先去找stdafx.h.gch,把它包含进来.这样就节省了编译时间. 46 | 47 | 如果stdafx.h被很多源文件引用,节省的编译时间是很可观的. 48 | 49 | 结论 50 | --------------------- 51 | 52 | 利用预编译头文件,可以很明显地感觉到编译速度的提升.建议大家尝试一下. 53 | 54 | 还有一个有点相关的问题,如果修改了一个用到很多的头文件,就需要把所有用到这个头文件的源文件编译一遍,基本上等于重新编译了.所以,尽量少修改这种头文件. 55 | -------------------------------------------------------------------------------- /如何学习python.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://images.amazon.com/images/P/0596002815.01.LZZZZZZZ.jpg 2 | :align: center 3 | 4 | 我们假设你是一个初级程序员, 只懂得一点点的基础知识, 希望能够用python来做开发. 5 | 这篇文档就是为了满足以上目标而写的. 6 | 7 | 大纲 8 | ---------------------------- 9 | 按照这篇文档所指示的任务过一遍, 你就能够做到: 10 | 11 | - 熟悉python语言, 以及学会python的编码方式. 12 | - 熟悉python库, 遇到开发任务的时候知道如何去找对应的模块. 13 | - 知道如何查找和获取第三方的python库, 以应付开发任务. 14 | 15 | 学习步骤 16 | ---------------------------- 17 | 18 | 安装开发环境 19 | ```````````````````````````` 20 | 如果你在window下, 去下载pythonxy安装起来, 然后运行python, 进入python解释环境. 21 | 22 | 如果你在ubuntu下, 执行: sudo apt-get install python, 然后在命令行下运行python, 进入python解释环境. 23 | 24 | 学习方法 25 | ```````````````````````````` 26 | 作为一名成熟的开发人员, 我学习新东西(假设是pyqt)的习惯方式是: 27 | 28 | - 直接用google搜索pyqt的官方网站. 29 | - 按照官方网站的说明, 下载pyqt. (如果是用ubuntu, 看看软件库里面是否有足够新的版本) 30 | - 下载过程中, 开始阅读官方网站上面的教程. 31 | - 一边看教程, 一遍按照教程使用pyqt. 32 | - 如果发现教程不够全面, 用google搜索是否有对应的教学书籍可以看. 33 | - 示例学习完毕, 开发一个玩具程序, 用来检验自己是否需要用到的功能. 34 | 35 | 开始学习python 36 | ```````````````````````````` 37 | 我建议你学习的过程也按照上面来, 首先过一遍python官方文档: 38 | 39 | http://docs.python.org/tutorial/index.html 40 | 41 | 如果你觉得英文太有难度的话, 去看 `python简明教程 `_ 42 | 43 | 或者这里有一个google的python课程: http://code.google.com/edu/languages/google-python-class/ 44 | 45 | 然后做 http://www.pythonchallenge.com/ 这个网站上面的题目练练手. 如果卡在某一关太久, 可以看答案(google python challenge answer), 做完后看看别人的编码方式和自己有什么区别. 46 | 47 | 小项目 48 | ```````````````````````````` 49 | 做完一遍后, 你会发现已经熟悉了基本的python开发. 然后做点小项目吧. 这里是一些题目, 挑感兴趣的去做. 50 | 51 | - 写一个简单的计算器/记账软件/扫雷游戏(用pyqt库做界面) 52 | - 写一个聊天室网站(用webpy框架, jquery刷新新的回复) 53 | - 写一个爬虫, 获取douban上面所有用户的地点, 画地点分布的直方图(用lxml解析, 保存数据到sqlite里面去, 用matplotlib画图) 54 | 55 | FAQ 56 | ```````````````````````````` 57 | Q: 遇到了问题, 到哪里求助? 58 | 59 | A: 上 http://groups.google.com/group/python-cn (需要翻墙) 或者 http://stackoverflow.com 提问就可以了. 60 | 61 | Q: 如何查找python的某个功能? 62 | 63 | A: 看官方文档. http://docs.python.org/library/index.html 64 | 65 | Q: 如何用python完成一个任务(比如写网站)? 66 | 67 | A: google: python 写网站, 或者 google: python web development. 68 | 69 | -------------------------------------------------------------------------------- /如何学习计算机科学.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-171-software-engineering-for-web-applications-fall-2003/6-171f03.jpg 2 | :align: center 3 | 4 | 在 `计算机领域学习路线图 `_ 里面, 我们知道了需要做的事情, 那么我们如何开始呢? 这里面是一个总的路线规划. 5 | 6 | 入门 7 | ----------------------------- 8 | 首先, 我们需要学会编程, 以及对应的思考和解决问题的方式. 所以, 我们需要完成: 9 | `6.00 `_ 入门课. 10 | 11 | 这里需要重点提示一下: 公开课只是看看是不行的. 需要做的事情是: 按照公开课里面的calendar, 听课, 看书, 做习题. 安排好时间, 保证能够坚持下去. 如果个人的意志力不够, 可以找人帮忙督导. 12 | 这样才能确保学好里面的内容. 13 | 14 | 6.00学完后, 基本上能够用python写代码了. 这个时候, 2条线并行: 15 | 16 | * 学习基础. 按顺序学习: 6.002 计算机组成原理, 6.046J 算法基础, 6.828 操作系统, 6.035 编译原理, 这些是我们的基础知识. 可能你觉得枯燥, 但是这些课程学到的东西, 是基础. 它们决定你能走多远. 17 | * 开始项目. 我建议: 看6.171, 开始学习如何做一个网站. 在这个课程中学习使用linux系统, 学习web, 做网站. 当然, 其他类型的项目也可以, 不过需要学过了部分基础内容才能够写代码. 那个比较久了. 所以我建议从入门比较简单的web方面开始. 18 | 19 | 然后随着基础课程的推进, 不断根据基础课程做对应的项目. 20 | 21 | * 学到计算机组成原理, 就做后面的实验, 设计自己的CPU. 22 | * 学到算法, 就去优化常见的库程序. 23 | * 学到操作系统, 就去自己写一个操作系统的模块. 24 | * 学到编译原理, 就自己设计一个语言. 25 | 26 | 然后, 经过了这些过程, 你现在需要自己计划一个项目, 真正能够有用的项目, 然后投入精力完成它, 作为自己的毕业设计. 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /如何度过每天的24小时.rst: -------------------------------------------------------------------------------- 1 | 昨天, 某个朋友给我推荐了一本书: 书名是 `悠游度过一天的24小时`_. 2 | 3 | 这本书不错. 如果你觉得自己每天虚度光阴, 可以看这本书, 这本书提供了一些改变的方法, 简单易行. 4 | 5 | 上周在 `primesplus `_ 里面和他们聊天, 提到一个问题: 中国的程序员大多没有生活. 每天上班下班两点一线, 晚上在住的地方宅起, 要么就是一直都钻在技术里面, 长此以往, 人会憋坏的. 如果你觉得自己就是这样的人, 可以读读这本书. 6 | 7 | 下面是我整理出来的一些要点, 如果你不想被剧透, 那么就不要往下看了, 直接去买本来看吧. 8 | 9 | - 我们每个人都拥有同样的时间: 每天24小时 10 | - 但是我们一般来说, 都很难利用好这些时间. 11 | - 开始前提醒: 这个过程很艰难, 不要期望过高, 要有心理准备, 不要被失败压垮了. 12 | - 一个示例: 人们往往没有利用好每天的时间, 在时间处理上态度不对, 工作的时候有抵触情绪, 下班后宝贵的自由时间以休息的理由, 随意消耗掉了. 13 | - 除去上班8小时, 休息8小时, 损耗2小时, 人还有大约6小时的自由时间, 好好利用. 14 | - 上下班的时间不要消磨掉, 利用好这段时间. 15 | - 上班途中的时间用来锻炼心智, 约束自己的大脑想特定的事情. 16 | - 下班途中的时间用来反省. 17 | - 下班后承认自己并不累, 好好计划下班后的时间, 过真正充实的生活. 18 | - 幸福并非源于肉体或精神上的享乐, 而在于充实自己的理性思考, 并采取符合自己原则的行为方式. 19 | - 诗歌可能是最高形式的文艺形式, 给人以最大的愉悦并予人以最深邃的智慧. 20 | 21 | .. _`悠游度过一天的24小时`: http://book.douban.com/subject/4243207/ 22 | -------------------------------------------------------------------------------- /如何把rss当作邮件来阅读.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://freshbump.com/graphics/image_files_480x400/480x400_elisa-strozyk-sebastian-neeb-accordion-cabinet.jpg 2 | :align: center 3 | 4 | 根据 `大妈gurudigger里面的idea `_, 我研究了一下如何把rss订阅都发送到邮箱中, 统一采用邮箱来处理每日的rss阅读. 5 | 6 | 尝试了一下以下工具/网站: 7 | 8 | - http://www.feedmyinbox.com/ 9 | 可以订阅站点, 但是只有5个免费站点名额, 并且是每个站点一封邮件. 10 | - http://www.emailrss.cn/ 11 | 国内的站点, 但是不知道效果如何. 12 | 13 | 最后, 我在shlugchat里面发问, 某人推荐我使用 `rss2email`_, 然后一试, 果然挺好用的. 14 | 15 | rss2email会把所有的文章都以分开的邮件发送, 在gmail里面很好做阅读. 16 | 17 | 安装方法(已经在ubuntu源里面了) :: 18 | 19 | sudo apt-get install rss2email 20 | 21 | 其他系统请见 `rss2email`_ 官方网站. 22 | 23 | 使用方法 24 | ------------------ 25 | 26 | rss2email的工作目录在 ~/.rss2email里面, 需要先拷贝配置文件 :: 27 | 28 | mkdir ~/.rss2email 29 | cp /usr/share/doc/rss2email/examples/config.py ~/.rss2email/ 30 | 31 | 然后, 需要修改config.py, 用来设置发送邮件的一些参数, 重点需要修改的是 :: 32 | 33 | # 默认是0, 需要改成1, 如果你像我一样采用gmail来发送的. 34 | SMTP_SEND = 1 35 | # gmail的smtp服务器 36 | SMTP_SERVER = "smtp.gmail.com" 37 | # gmail需要认证, 所以改成1 38 | AUTHREQUIRED = 1 39 | # 发送的邮箱用户名, 我为了区分专门注册了一个邮箱. 40 | SMTP_USER = 'linjunhalida.rss.mail' 41 | # 密码 42 | SMTP_PASS = 'xxx' 43 | 44 | 好了, 我们输入需要接收rss邮件的邮箱 :: 45 | 46 | r2e new you@yourdomain.com 47 | 48 | 然后一个一个增加rss源(必须是rss的位置, 而不是网站的名称, 不然抓取不到) :: 49 | 50 | r2e add http://feeds.feedburner.com/allthingsrss/hJBr 51 | 52 | 最后, 我们需要让r2e不发邮件跑一遍, 放弃当前时间点之前的数据 :: 53 | 54 | r2e run --no-send 55 | 56 | 现在配置完成了, 每次只要你想看新的内容, 就可以执行以下命令 :: 57 | 58 | r2e run 59 | 60 | 我设置了160个源, 运行比较慢. 我把它用crontab来作为后台程序跑了. 修改/etc/crontab, 添加上 :: 61 | 62 | 1 * * * * halida /usr/bin/r2e run 63 | 64 | 我设置的是每个小时的第一分钟去抓取, 以我自己的用户名(halida)来跑. 65 | 66 | 结论 67 | -------------- 68 | 69 | 更多的内容和介绍, 在: http://www.allthingsrss.com/rss2email/getting-started-with-rss2email/ 70 | 71 | 鉴于现在做这个服务的网站不多, 什么时候我搭建一个服务器来玩玩.. 72 | 73 | .. _`rss2email`: http://www.allthingsrss.com/rss2email/ 74 | -------------------------------------------------------------------------------- /如何改变一个人.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://3forward.com/wp-content/uploads/2011/05/TrainingCenter.jpg 2 | :align: center 3 | :width: 600 4 | 5 | 上一周和某位同学交流, 谈到如何帮助其他茫然的大学生. 我们讨论到很多, 结果发现真的发现没有什么太多好的办法. 6 | 基本上大家都是糊里糊涂地上了大学(或者说被大学上), 专业也是胡乱选的, 也不知道自己喜欢什么, 也没有什么直面社会的压力(暂时), 7 | 然后的话人就这样糊里糊涂地过完了大学, 然后出来也糊里糊涂地找个工作(如果能找到的话). 8 | 9 | 然后我们想到如何让同学们出来的时候能够走上工作岗位而不至于什么都干不了, 现在网络上面有公开课这种东西, 可以说学习资料到处都有. 10 | 但是资料也只是资料, 不去学也只是废料. 但是有谁会去学呢? 如果做宣讲, 励志之类的讲座, 大家也就听听罢了, 当时兴奋一下, 回来之后还是改干什么干什么. 11 | 12 | 我后来提到一个招数, 应该算是会有效果的吧. 就是训练. 强迫每天投入若干个小时在某个领域上面. 不要求能做到多好, 但是强迫进行这样的工作. 13 | 毕竟大家都是从小到大这样强迫上来的, 应该接收得了. 然后在强迫的过程中, 逐渐"洗脑", 把一些先进不先进, 靠谱不靠谱的知识和方法论在强迫中内化到脑子里面, 然后改变行为方式. 14 | 15 | 我是一直认为, 只有训练才能改变一个人的. 看书, 可以增长知识, 但是知识只是信息, 要能够用起来才能带来价值. 而知识转化为行为的过程只有靠训练. 16 | 举个例子, 我今年开始学钢琴, 一首曲子刚开始怎么也弹不顺, 后来练习了好几十遍, 也就顺起来了. 这个是通过训练减少难度. 17 | 还有通过训练改变习惯的. 别的不说, 刷牙洗脸基本上是我们每个人都有的习惯吧. 18 | 大家可能想不起来以前是怎么开始的, 无非也就是家里人天天的强迫, 也就一天天这样下来最后养成了终身的习惯. 19 | 20 | 还有我们说的性格. 内向什么的都可以改. 比如坚持每次上地铁搭讪一个陌生人, 21 | 一开始可能话都说不顺, 后面越来越顺口了甚至不搭讪就不习惯了(是在说我自己吗).. 当然, 习惯的建立, 需要一个条件反射的过程, 22 | 训练之后有甜头才能建立, 不然过了很久都只能带来痛苦那么就算是条通过电击刺激产生反射的狗也会慢慢褪化掉这个习惯的. 23 | 24 | 很多时候, 自己是很难开展一个训练的, 因为我们还需要养成训练的习惯, 这又是一个鸡生蛋蛋生鸡的过程. 如果能有人帮助的话成功率会大大提高, 尤其是一个比较专业的训练者. 25 | 那些运动员哪个是没有一个教练帮忙指导的. 26 | 27 | 当然训练还不够, 我看书上写完成一件事需要 前提, 过程, 结果 这三个要素. 上面只是过程的保证, 前提和结果都没有保证到. 那么我们需要前提: 28 | 这个被训练的猴子要愿意被训练, 对于学生其实很简单, 洗脑就好了. 找点励志书什么的就可以了. 当然我们不是真的洗脑, 所以唐骏的书就不要给了. 29 | 给点改变世界的人的书, TED什么的, 或者自己也会被刺激到的书看看. 毕竟世界上又不缺打工皇帝. 30 | 31 | 还有结果. 基本上我们走正路的结果还是比较好的, 训练出来的人应该算靠谱, 出来打工干活应该是没有问题的. 这样算是带好了一个人吧(可能吧..) 32 | 33 | 上面也只是说说而已, 没有训练得到的结果, 也只是空谈. 我现在计划挤点时间带带有志在计算机领域发展的学生, 34 | 让他们至少能够出来找到工作. 如果想被训练和洗脑的话就gmail联系我吧... 我也在训练自己训练人.. 35 | 36 | -------------------------------------------------------------------------------- /如果我还有一个星期可以活.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://moviemasterworks.com/blog/wp-content/PostImages/seventhsealblog.jpg 2 | :align: center 3 | 4 | 如果我还有一个星期的时间可以活, 我会先震惊一个小时.. 5 | 6 | 然后我就会开始安排后事, 任务交接好, 工作辞掉, 清理网络上面的信息, 标注gmail等网络帐号, 自己在某某时刻会死掉, 然后通知家里人, 整理资产什么的. 7 | 8 | 但是我不会回去老家, 还是在上海. 9 | 10 | 然后我会去做些一直没有时间去做, 或者没有动力去做, 但是我非常想做的事情, 比如可能花点钱找个好的小姐打上一炮, 比如去学钢琴, 比如就在人民广场找个顺眼的女孩快速谈场恋爱, 比如.. 没有什么比如了, 我想做的事情不多... 11 | 12 | 期间可能会有一些人来问我状况, 然后我会和他们讨论讨论人生理想什么的.. 家里人会过来陪我, 不过我还是宁愿一个人呆着更清净些. 那么我可能最后两天再告诉他们(如果他们不知道这件事情的话). 13 | 14 | 就是这些, 然后一个星期很快就到了. 如果死得痛苦的话, 我会找点不痛苦的死法来先了结自己的生命. 我一直想尝试跳楼, 梦里面跳过几次. 或者我会把自己的生命用在一些有意义的场合, 比如去和XXX同归于尽? 15 | 16 | 死亡以后什么都没有了, 这个世界和我无关了, 死亡的过程就是逐渐认识到这个事实的过程, 我会选择一个人死去, 享受最后的清净. 17 | 18 | 如果你还有一个星期可以活, 你会怎么做? 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /宅男们开房的故事_snake_challenge活动总结.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://snakechallenge.org/images/logo.png 2 | :align: center 3 | 4 | 最近比较忙, 直到现在才写好文章.. 不过借用开源界的一句话: latter better than never.. 5 | 6 | 程序员配对? 7 | -------------------------- 8 | 9 | 很早以前, 我就有过一个想法: `程序员配对 `_. 10 | 11 | 现在程序员们还是身据不同公司中, 做着个人的项目, 很少有机会能够出来, 和一些其他的程序员实际交流. 12 | 13 | 虽然有各种活动, 但是真正真刀真枪干起来的很少. 但是感谢 http://www.gurudigger.com 蔡金同学的组织, 一次这样的活动举办了. 来自全国各地12名程序员, 集会上海, 针对snake-challenge项目来进行一次开发. 14 | 15 | 经过 16 | ------------------------ 17 | thomas同学已经有一个详细的过程记录了, 可以看这里: http://ghostunix.org/blog/?p=441 18 | 19 | 一些感受 20 | ------------------------ 21 | 这个活动总体上感觉还是很好的, 以前很少见的同类, 一下子出现了那么多, git/emacs/vi/github都变成普遍状况了. 宛然一个小硅谷.. 22 | 23 | 2天时间的coding其实是很短的, 12位以前没有合作过, 甚至没有见过面的程序员, 能够产生出来一个东西已经很不错了. 在此期间, 因为沟通问题, 也出现了很多的问题, git的合并也消耗掉了很多脑细胞.. 不过还好, 大家还是分割成小组来做事情的, 每个人几乎都做单独的一个部分, 遇到了问题, 但是不严重. 24 | 25 | 项目本身, 用到了无数的东西, zeromq+python+pygame+rails!!+redis+node.js+CoffeeScript+websocket... 如果你知道上面这些东西的话, 估计你会很吃惊, 竟然一个项目里面能够用到这么多的玩意. 一个真正的网站项目也不一定用到这么多东西了. 在项目的开始阶段, 有几位同学迟迟没有安装好环境, 卡在了zeromq或rails上面.. 尤其是其中的一位同学, 因为痛苦的安装经历, 对rails产生了坏的观感, 我感到十分的可惜. 26 | 27 | 28 | 结论 29 | ------------------------ 30 | 2天的开发+展示, 时间上还是比较紧, 大家大都是很靠谱的人, 一上来就进入了状态, 头脑风暴和coding. 然后时间到了一下就结束了. 很多东西还需要完善和收尾. 我还是希望参与者能够继续把自己开发的部分完善起来----主要是我一个人在接下来的时间里要把这些东西整合起来还是挺累了哇... 31 | -------------------------------------------------------------------------------- /安利模式做教育.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://lh4.ggpht.com/_os_zrveP8Ns/TMq1FRg4bQI/AAAAAAAADKo/hJVgxqHbdcA/s400/%E4%BC%A0%E9%94%80%E5%9B%BE.jpg 2 | :align: center 3 | 4 | 安利模式的问题 5 | =================== 6 | 7 | 考虑安利的商业模式,每次交易发生在上线与下线之间,交易的成本是上线在下线身上投入的时间. 8 | 9 | 如果只是卖商品,直接营销的成本往往很大,而这部分成本是会转嫁给下线的,整个过程不会创造价值,或者整个体系的价值产出为负. 10 | 11 | 具体分析在这里: http://www.impencil.org/?p=7486 12 | 13 | 替代方案 14 | =================== 15 | 16 | 我考虑了一下,如果采用教练指导作为商品,这样的模式可以带来价值. 因为: 17 | * 教练指导是对下线有价值的 18 | * 而这个价值不容易通过其他渠道来体现 19 | 20 | 什么是教练指导: 21 | 22 | * 在目标和方法都能够确定的前提下,教练指导学员一步步完成整个学习或训练过程. 23 | * 教练模式需要教练根据每个学员的状况作指导,必须是一对一的关系. 24 | * 普通人很难获得一个称职靠谱的教练. 25 | 26 | 作为商业模式来讲,下线可以通过上线的教育获得直接的收入提高,这个模式是可以带来价值的. 27 | 28 | 计划 29 | =================== 30 | 31 | 这个模式的重点在于上线和下线的关系.为了保证这个模式成功,需要有以下几点: 32 | 33 | * 上线和下线能够保持一个稳定的关系 34 | * 下线还能继续发展下线 35 | * 防止体系”腐化”,像安利一样成为一个无法提供价值的体系 36 | 37 | 因此,考虑以下几个注意的方面: 38 | 39 | * 下线必须是”空白”人士,方便灌输 40 | * 上线拥有足够的指导能力,能够指导下线提升收入 41 | * 下线提升收入后,还是可以通过上线的指导继续提升 42 | * 上线鼓励下线发展下下线,提升双方的共同受益 43 | * 不会有滚雪球效应,防止其中一方独立门户 44 | 45 | 具体实施方法(初稿): 46 | 47 | 上线主动联系下线,说服下线,以工资收入的百分比方式获得教练费用.为了提升说服力,可以设定期望,没有满足期望的时候,上线返回若干钱.以合约的方式确立起来. 48 | 49 | 上线采用一系列方式教育下线,这个过程可以不是全职:上线最好有工作,才能保证上线自己足够的成长程度. 50 | 51 | 当上线无法提供价值给下线的时候,合约终止,因此上线必须时刻提升自己的价值产出.合约本身是制式文件,限制上线对下线采用洗脑的方式榨取收入,同时由于是双方签订合约,出现问题也与上线的上线无关. 52 | 53 | 上线可以通过培训下线的能力,让下线继续发展下下线,提升双方受益. 54 | 55 | 传输这样的观念:每个人必须要有教练,时刻监控自己的成长. 56 | 57 | 提供平台,让所有的成员都在这个平台上面交流,发展,防止社区分裂. 58 | 59 | 问题 60 | =================== 61 | 以上只是初步的分析,但是也暴露出来几个问题点: 62 | * 如何吸引新人加入,收入分成的方法是不为绝大多数人接受的 63 | 64 | 解法:需要这个体系能真正提升价值,然后新人才会希望加入 65 | 66 | * 如何保证关系持久,下线可能因为不值的原因取消合约,上线也可能因为不值的原因取消合约. 67 | 68 | 解法:无法保证.但是可以让双方养成发展下线的习惯,新的合约建立速度大于旧的合约解除的速度即可. 69 | 70 | * 社区分裂:无法保证该模式不被其他人学去,并建立其他”邪恶”的组织. 71 | 72 | 解法:需要能够提供一个稳定的,不会被夺取的上游价值提供源,比如通过该网络发送讯息,提升网络中人士的职业发展机会.这个平台直接通过上线下线获取收入和讯息,维持平台的运转. 73 | 74 | 结论 75 | =================== 76 | 以上都是泛泛而论,需要通过进一步的实践来验证理论的有效和可行性. 77 | -------------------------------------------------------------------------------- /实现计算器.rst: -------------------------------------------------------------------------------- 1 | 原因 2 | ------------------------ 3 | 4 | 因为想要练习自己的编程能力, 所以打算写一个计算器出来. 5 | 6 | 具体的需求: 7 | * 实现一个支持四则运算的计算器 8 | * 实现括号, 乘方运算 9 | 10 | 分析 11 | ------------------------ 12 | 13 | 我打算的实现步骤如下: 14 | * 实现词法解析器, 把输入的字符串解析成词语. 15 | * 实现简单的四则运算语法分析与计算 16 | 17 | 词法解析器 18 | ----------------------- 19 | 20 | 采用状态机来实现 21 | 22 | 词法:: 23 | 24 | number := [0..9] | number [0..9] 25 | add := + 26 | sub := - 27 | mul := * 28 | div := / 29 | lp := ( 30 | rp := ) 31 | mmu := ** 32 | 33 | 根据词法获得的状态表格: 34 | 35 | ================= ======= ======== ======== ==== 36 | status\condition [0..9] [+-/()] [*] [\ ] 37 | 0.start 1 num 0 fac 2 0 38 | 1.numcheck 1 num 0 fac 0 0 39 | 2.mulcheck 1 num 0 fac 0 mmu 0 40 | ================= ======= ======== ======== ==== 41 | 42 | 当跳出number状态时, 记录number. 43 | 当跳出mulcheck状态时, 记录mul. 44 | 45 | 四则运算语法分析和处理 46 | ----------------------- 47 | 48 | 先来一个简单的吧, 只实现四则运算, 2次循环, 一次计算*/, 一次计算+-, 然后打印出结果. 49 | 50 | 实现完成, 函数是caculate. 51 | 52 | 然后是能够实现括号, 乘方等复杂操作, 这个需要语法分析, 甚至可能用到AST(抽象语法树) 53 | 54 | 语法 :: 55 | 56 | prime := ( p3 ) | number 57 | p1 := prime ** prime | prime 58 | p2 := p2 * p1 | p2 / p1 | p1 59 | p3 := p3 - p2 | p3 + p2 | p2 60 | 61 | 自己研究了半天, 最后还是看the c programming language里面的解法完成了. 62 | 63 | 总共花费了1天, 看起来过了一个有意义的中秋(好悲哀). 64 | -------------------------------------------------------------------------------- /尝试搭讪.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://sh.sinaimg.cn/cr/2009/0617/2966953087.jpg 2 | :align: center 3 | 4 | 最近 `想通了 `_, 要找一个女朋友. 但是嘉定这边没有资源, 怎么找呢? 5 | 6 | 于是我尝试搭讪. 在一些能够和陌生人长时间同处的环境下面搭讪, 比如地铁, 长途汽车, 一些活动场所什么的. 7 | 8 | 一开始我还是在地铁上面. 因为从嘉定到市区的地铁运行时间比较长, 9 | 10 | 我可以从容选择目标, 然后接近, 以种种套路, 比如问时间, 问站点什么的, 接上话头, 继续聊下去. 11 | 12 | 然后根据状况, 在快下车的时候要到联系方式, 至此搭讪的过程完毕. 13 | 14 | 经过了一段时间的实践, 总结的一些东西: 15 | 16 | 个人感觉搭讪能接上话头的可能性在一半一半. 我会挑人, 几种人我一般不搭讪: 17 | 18 | * 如果身体姿态什么的都表现出拒绝(比如打手机游戏, 听音乐, 躲角落等等) 19 | * 几个朋友, 会在一起说话, 这个我不知道如何插入进去... 20 | * 戴戒指的. 这个不用说. 除非刚好坐在我边上, 可以随便聊聊天. 21 | 22 | 几种人我会上去搭讪: 23 | 24 | * 显得很无聊, 眼睛看来看去的, 这个是有交谈欲望的, 可以很好入手. 25 | * 看书的, 可以借看书的内容搭话. 26 | * 气质不一般的. 说实话, 只有其中一部分人我才敢搭讪.. 27 | 28 | 我不是一个很好的搭讪者, 搭上话了, 我顶多根据搭话场景聊几句, 或者问问基本问题, 什么哪里人去哪里之类的, 但是感觉不太合适, 我的功课没有做好.. 29 | 30 | 被搭讪的人也是有分好多类的, 有人沉默有人健谈, 有人反过来搭讪我. 31 | 32 | 总体来说, 要到的联系方式还是很多的, QQ号有, 手机也有. 对我来说, 问题就是, 很少有后续的动作. 我对下一步的操作不是很有思路. 33 | 34 | 现在还在实践中, 等进行到下一阶段再说吧.. 35 | -------------------------------------------------------------------------------- /开发经验.rst: -------------------------------------------------------------------------------- 1 | 这里面整理了一些零散的开发经验, 方便提醒自己, 以及给其他人灵感. 2 | 3 | - 写代码本质上来讲是把信息量体现在代码上面, 最好写下来的代码正好反应出项目的信息. 4 | 比如代码本质上是实现一个状态机, 那么就需要写清楚, 然人一看就知道是状态机(有向图) 5 | - 要让代码复杂度反映在代码行数上面. no一行流 6 | - C语言是lisp的底层抽象? 7 | - C语言每个语句的性能是平衡的, 能够从C代码中看出程序性能消耗? 8 | - python函数边界不做类型检查, 运行时刻再去判断类型, 造成性能下降, 但是也带来足够强大的抽象能力? 9 | -------------------------------------------------------------------------------- /思考.rst: -------------------------------------------------------------------------------- 1 | 这个世界上最难的事情就是思考了. 我们为了逃避思考, 是什么事情都能够做得出来的. 2 | 3 | * 上学的时候, 为了逃避思考和理解课本的知识, 我们死记硬背, 记解题方案, 考试一过, 就什么都不记得了. 4 | * 上班的时候, 为了逃避思考如何工作, 我们只按照老板要求做的事情去做, 不管这个事情是不是真的能够帮老板解决问题. 5 | * 下班了之后, 我们为了逃避思考如何利用闲暇时间, 打开电脑, 让生理上的愉悦填充空虚感. 6 | * 为了逃避思考自己想要的是什么, 我们遵从父母, 遵从社会期望, 而不惜浪费掉自己的一生. 7 | * 我们直接接受第三方做出的评估, 而不愿意以自己的角度来揣摩. 8 | * 我们用直觉来代替思考, 用情感来对事物做判断, 却不会用思考来调整情感. 9 | * 我们期望万能钥匙, 瑞士军刀, 银弹, 领袖, 神, 父母, 领导, 彩票, 却不愿意自己思考. 10 | 11 | 真悲哀. 12 | -------------------------------------------------------------------------------- /我们来捐款吧.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.returntothedeen.org/wp-content/uploads/2010/10/donate_small1.jpg 2 | :align: center 3 | 4 | 从2011/3月起, 我计划开始把我收入的十分之一捐出去, 用来让世界更美好一点. 5 | 6 | 捐款也不是随便捐的, 有三不捐: 7 | 8 | * 不捐给国内政府背景的基金和组织. 这个你知道的. 9 | * 不捐给我认为对改变世界没有帮助的. 10 | 比如某些环保组织, 针对老年人的基金. 我认为这些基金对改变世界用处不大. 11 | 比如路上的乞丐, 这个无助于改变他们的生活, 甚至鼓励他们乞讨. 12 | * 不捐给太大众的基金, 他们已经有很多人捐了, 不缺我这一份. 13 | 14 | 然后也有几个指导思想: 15 | 16 | * 捐给自己比较了解的领域. 比如wiki, 开源社区. 利用自己的领域知识, 让捐助变得更有效. 17 | * 捐给本地事业和自己生活周边的事情, 改变世界, 从自己周围做起. 18 | * 捐给未来. 比如给学生买VPN等等. 19 | 20 | 以上. 欢迎大家都参与这样的事情. 捐款的数量和你的收入成正比, 如果你的收入少, 比例就少一些. "没钱"从来不是借口. 21 | 22 | 捐款统计 23 | ------------------------ 24 | 十分之一收入捐: 500人民币, 70美元 25 | 26 | * 2011/03 27 | 28 | * 50$ wikipedia 29 | * (时间到了没成, 已退款) 50$ mike的上海技术咖啡馆 http://gurudigger.com/idea/detail?iid=14417 30 | * ¥3,000(日元) 日本红十字 Japanese Red Cross Society 31 | 32 | * 2011/04 33 | 34 | * 700 mike的上海技术咖啡馆 http://gurudigger.com/idea/detail?iid=14417 35 | 36 | * 2011/05 37 | 38 | * 30$ http://www.thedanplan.com/donations.php 39 | * 40$ wikipedia 40 | 41 | * 2011/06 42 | 43 | * 30 翻墙用VPS 44 | 45 | * 2011/07 46 | 47 | * 30 翻墙用VPS 48 | * 100$ FSF 49 | 50 | * 2011/08 51 | 52 | * 20$ JADE http://www.adom.de 53 | * 10$ http://gurudigger.com/ideas/36317 54 | * 1$ http://gurudigger.com/ideas/36283 55 | * 10$ http://gurudigger.com/ideas/36311 56 | * 20$ http://gurudigger.com/ideas/36230 57 | 58 | 59 | * 2011/11 60 | 61 | * 155$ 成为艾未未债主 62 | 63 | * 2011/12 64 | 65 | * 300 积木 http://jimudonation.com/project/1 66 | 67 | * 2012/1 和 2012/2 68 | 69 | * 120$ FSF 70 | 71 | .. image:: http://static.fsf.org/nosvn/associate/fsf-10545.png 72 | :target: http://www.fsf.org/register_form?referrer=10545 73 | 74 | * 2012/3 75 | 76 | * 300 支持方舟子打假, 愿赛先生, 德先生, 理先生能够来到中国. http://www.dajiajijin.org/definemenu.asp?id=72 77 | 78 | * 2012/7 79 | 80 | * ADOM http://www.indiegogo.com/resurrect-adom-development?contribution_success=true&a=843272 81 | 82 | -------------------------------------------------------------------------------- /我到人民广场相亲角相亲.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://sh.eastday.com/qtmt/20090207/images/00125284.jpg 2 | :align: center 3 | 4 | 起因 5 | ------------------------- 6 | 2011/11/05, 我被人介绍去参加 `techyizu `_ 的活动, 这个活动基本上是针对设计者的一个关于设计的讨论活动. 7 | 8 | 参加者大多数是外国人. 上午基本上是一些主题演讲, 这个没有什么可以说的.. 9 | 10 | 重点是在下午. 参与者会分成小组, 然后从主办者挑的几个题目里面选择一个来调研, 分析, 以及提出自己的解决方案. 11 | 因为其中一个主题是上海的人民广场相亲角.. 基本上大家都选择了这个主题. 12 | 13 | 我所在的小组几个人于是就此赶往人民广场做实际的调研. 为了更好地体会现场的状况, 我们需要找一个人, 14 | 作为模板, 加入到相亲活动中去. 因为我秉承 `sensates `_ 的理念, 在我的半主动下, 团队选择我参与到相亲活动中去. 15 | 16 | 经过 17 | ------------------------- 18 | 19 | 我们4个人做出租车感到人民广场. 在出租车上面, 我们考虑和准备了一下等会需要做的事情, 我则开始写我自己的基本状况. 20 | 21 | 基本状况是这样的: 男, 86年, 籍贯, 家庭背景, 教育水平, 现在工作, 期望什么的. 22 | 23 | 到了现场后, 我们发现, 尽管现在下着小雨, 场面上还是满是人. 我们首先去边上挂着的简历上面搜索合适的对象, 24 | 结果发现年龄段明显不适合我, 基本上是从84年起到38年. 稍微搜索了一下周围的状况之后, 我们开始实际调查现场的人员. 以给我找对象作为理由. 25 | 26 | 我先去询问挂牌的工作人员, 上面看到价格: 50/月, 100/月的话就包介绍. 至于挂牌位置有好有坏的问题, 工作人员说会定期轮转, 保证挂牌者都有放上来的机会. 27 | 28 | 边上有人说, 挂牌又贵, 又容易遇到骗子. 这样的话很多人还是选择直接询问. 29 | 30 | 询问过程基本上是类似于市场, 快速简洁充满交易性. 基本上过程是这样: 31 | 32 | 遇到过路的阿姨, 我问: 你是女儿还是儿子? 33 | 34 | 阿姨: 女儿, 你是给别人找还是自己找? 35 | 36 | 我: 给自己找. 37 | 38 | 阿姨: 你多少岁? 39 | 40 | 我: 86年的 41 | 42 | 阿姨: 86年太年轻了. (走人) (N次循环都到这一步跳出, 于是我改变条件, 编造年龄) 43 | 44 | 我: 82年的. 45 | 46 | 阿姨: 你是哪里人? 47 | 48 | 我: 江西. (阿姨: 我们要找上海人. (走人)) 49 | 50 | 阿姨: 你有没有房子? 51 | 52 | 我: 没有 53 | 54 | 阿姨: 工资多少? 55 | 56 | 我: xxxx. (阿姨: 工资太少了. (走人)) 57 | 58 | . . . 59 | 60 | 询问基本上按照信息过滤的顺序来, 过滤量大的问题先放在前面问. 这样保证询问时的效率. 问问题的时候, 会把核心的问题都问到, 然后才会进入实质的看照片, 联系方式交换等过程. 61 | 62 | 虽然上面的循环有很多跳出条件, 但是因为我是自己过来找的, 非常受欢迎, 基本上是一个人问完了, 又一个人上来问. 63 | 64 | 最后还是能够走到最后一步, 除了一些谎报年龄拿到的电话号码没有去处理以外, 还是有收集到一个年龄合适地点合适的电话号码的. 65 | 66 | 结果 67 | ------------------------- 68 | 现场调查完毕回去做总结. 我还是非常激动的. 总结过程没有给力. 基本上是后来加入的两位女生发力, 给出了很多的分析. 69 | 70 | 最后报告的时候, 我上场以用夸张的方式讲了一下今天的见闻, 然后是队长去做了一个改进方法的报告. 71 | 72 | 活动结束了, 我总结一下学到的东西: 73 | 74 | - 开始的阶段, 没有很好地做好计划, 造成现场调查分工不明确, 回来总结的时候, 虽然队长一直在控制过程, 当我觉得还是处于失控状态(尤其是在现场调研过程中), 组员没有明确分工, 以及主动推动过程进行. 75 | - 最后的总结介绍非常重要, 我们事先应该投入更多的时间做准备和排练. 大家做的东西内容质量带来的区别实际上不会很大, 重点是做报告的阶段. 76 | - 亲自到相亲角的效果非常好(至少能够获取联系方式). 可以作为找对象的一个途径. 77 | -------------------------------------------------------------------------------- /我玩的游戏.rst: -------------------------------------------------------------------------------- 1 | 虽然有点无聊, 但是还是整理一下那些能让我通宵, 2 | 或者至少沉迷一段时间的游戏, 按照时间排列, 太早以前的就不去管它了. 3 | 4 | adom 5 | ------------------------- 6 | 7 | 很早的时候迷roguelike, 但是无论是nethack/crawl都玩不进去, 8 | 可能是一层层的地牢让我心生恐惧吧. 最后我还是在有城镇的ADOM里面坚持了下去. 9 | 不过当步入火焰层烧掉了我大半载重之后, 就放弃了. 10 | 11 | cortex command 12 | ------------------------- 13 | 14 | `Cortex Command介绍 `_ 15 | 16 | 这款游戏让我通宵了. 17 | 完成度不高, 但是能够建设基地, 爽快的射击与杀戮, 以及物理系统带来的纷飞碎块, 18 | 真的让我沉迷了好一阵子. 现在还待在我的硬盘里面. 游戏性能和CPU成正比. 19 | 20 | drawf fortress 21 | ------------------------- 22 | 23 | `Drawf fortress介绍 `_ 24 | 25 | 又是一款字符界面游戏, 又是建设基地, 多层, 自由活动的矮人, 随机生成的世界, 操作非常复杂, 26 | 以前接触过, 但是在操作面前退步了. 终于有机会玩会了, 但是因为要想很多东西, 27 | 我智能不够, 玩到一定程度就停止了. 28 | 29 | minecraft 30 | ------------------------- 31 | 32 | 随机生成的世界, 完全自由建设, 合成系统, 晚上的怪物, 铁路, 作者赚了几百万欧元. 33 | 34 | 这款游戏让我通宵了. 35 | 36 | -------------------------------------------------------------------------------- /我的emacs配置.rst: -------------------------------------------------------------------------------- 1 | 每个emacs使用者的配置都是不一样的, 都会根据自己的习惯和喜好来调整. 这里我整理一些对emacs用户调整有帮助的内容, 以及我自己觉得不错的配置. 2 | 3 | emacs配置如何管理? 4 | ----------------------- 5 | 配置多了, 放在.emacs里面不是一回事, 我的解法是, .emacs导入真正放配置的目录, 然后require: 6 | 7 | .. code-block:: lisp 8 | 9 | (add-to-list 'load-path (expand-file-name "~/Dropbox/sync/emacs/srcs")) 10 | (load "main") 11 | 12 | main.el是配置的汇总, 配置按照模块和功能分割成不同的文件: 13 | 14 | .. code-block:: lisp 15 | 16 | (provide 'main) 17 | 18 | ;; requires 19 | (require 'mylib) 20 | (require 'template) 21 | (require 'mypython) 22 | (require 'mydired) 23 | (require 'myc) 24 | (require 'mykeymap) 25 | (require 'mygtd) 26 | (require 'top-mode) 27 | (require 'tabbar) 28 | (require 'fullscreen) 29 | 30 | dropbox是我同步emacs配置的工具, 你也可以用其他网盘工具. 31 | 32 | 如何绑定自己的键位? 33 | ----------------------- 34 | 每个emacs用户都会自己设定键位, 不会傻傻地M-x然后输入字符. 35 | 我个人的经验, 绑定键位的指导思想是: 对于显示buffer, 切换buffer之类使用非常频繁的功能, 找一些方便的直接键位来绑定, 比如: 36 | 37 | .. code-block:: lisp 38 | 39 | (global-set-key [C-tab] 'other-window) 40 | 41 | 对于一些其他不是那么频繁, 但是经常要使用的功能, 都可以绑定到间接键位上面. 我发现C-;没有使用, 按起来还很方便, 然后把所有自己定义的功能都加到上面去了: 42 | 43 | .. code-block:: lisp 44 | 45 | (global-set-key (kbd "C-; 1") 'gtd) 46 | (global-set-key (kbd "C-; 2") 'note) 47 | (global-set-key (kbd "C-; 3") 'scratch) 48 | (global-set-key (kbd "C-; 4") 'py-shell) 49 | (global-set-key (kbd "C-; 5") 'woman) 50 | (global-set-key (kbd "C-; 7") 'twit-follow-recent-tweets) 51 | (global-set-key (kbd "C-; C-7") 'twit-post) 52 | 53 | 对于针对某些mode的键位绑定, 只需要改变那个mode的键位就可以了: 54 | 55 | .. code-block:: lisp 56 | 57 | (define-key dired-mode-map (kbd "b") 'dired-up-directory) 58 | 59 | 一定要设置的功能 60 | ----------------------- 61 | 有些功能是如此的强大, 以至于缺少了他们emacs就不完整了.. 62 | 63 | - `ido `_, 如果你发现开启文件和切换buffer输入有点累的话, 用ido来节省输入. 64 | 65 | - `auto-complete `_ 自动补全. 这里面的补全方案默认是取当前buffer的词语的, 对于我写python代码来说足够用了. 至于c/c++/java..等我写的时候再配置吧. 66 | 67 | .. code-block:: lisp 68 | 69 | (require 'auto-complete) 70 | (global-auto-complete-mode t) 71 | ;; 匹配项目不用动手腕啦 72 | (define-key ac-complete-mode-map "\C-n" 'ac-next) 73 | (define-key ac-complete-mode-map "\C-p" 'ac-previous) 74 | 75 | 76 | - 漂亮的配色. color-theme有一堆配色可以选的. 77 | 78 | .. code-block:: lisp 79 | 80 | (require 'color-theme) 81 | (color-theme-arjen) 82 | 83 | 还有一些零散的配置, 都放在 `main.el `_ 里面. 84 | 85 | - template 模板系统. 写东西怎么不能用模板呢. 一遍遍地输入同样的东西多烦. 我用的是 `template.el `_, 不过感觉用的不是很熟, 还要改改. 86 | 87 | - `org-mode `_. 用来写notes/todo/gtd的. 看看吧, 功能强大. 88 | 89 | 90 | 其他有价值的东西 91 | ----------------------- 92 | 93 | - shell-command功能. 可以在buffer当前目录执行命令. 如果不想它卡死的话, 可以在命令后面加&(linux). 94 | - `artist-mode `_, 可以在emacs里面画图. `artist-mode视频介绍 `_ 95 | - 半透明. linux下面要开启特效才能半透明. 96 | 97 | .. code-block:: lisp 98 | 99 | (set-frame-parameter (selected-frame) 'alpha '(80 50)) 100 | (add-to-list 'default-frame-alist '(alpha 80 50)) 101 | 102 | - `全屏 `_, 不全屏怎么对得起emacs呢? 103 | 104 | 资源 105 | ----------------------- 106 | 107 | emacs自带的info文档已经很多了, 不过有一些其他地方的资源不错, 值得提一下: 108 | 109 | - `emacs wiki `_, 我想emacs用户都应该知道这里吧. 110 | - `我的配置 `_, 好吧, 分享下. 111 | -------------------------------------------------------------------------------- /我的技术储备.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.cqaz.com.cn/Files/UpLoadfiles/200907/%E6%9F%90%E6%88%90%E5%93%81%E6%B2%B9%E5%82%A8%E5%A4%87%E5%BA%93%EF%BC%8832%E4%B8%87m3%E5%82%A8%E6%B2%B9%E7%BD%90%E7%BE%A4%EF%BC%89.jpg 2 | :align: center 3 | :width: 600 4 | 5 | 从2006年7月开始, 我已经工作4年半了, 现在的年龄也不小了, 需要整理一下我这一辈子的技术方向. 6 | 7 | 任何技术都是为了实现特定目标来做的. 我的目标不是很明确, 但是大致方向上面应该还行: 8 | 9 | 那就是做软件开发(好吧, 不是很具体). 可能是客户端, 或者web, 或者手机, 但是现在还是以客户端为主, web也有一部分, 这个还是走一步看一步吧. 我个人是倾向于往web方向发展, 但是限于水平问题, 还是暂留客户端开发. 10 | 11 | 考虑到技术过时, 以及自己喜好的问题, 我还是专注在开源社区, 尤其是GNU/linux领域. 12 | 13 | 因此, 这里整理一下我需要深入的方向: 14 | 15 | - linux平台上面做开发. 16 | - 客户端/web/手机方向上面的应用软件开发. (具体侧重根据项目需求) 17 | 18 | 以后随着时间的推进, 我要能够专注积累平台的经验. 19 | 20 | 下面我要列一下, 我未来(一辈子)的技术储备, 这个文章随时更新. 21 | 22 | 编程语言 23 | ------------------- 24 | 25 | 我打算专注在下面几种语言上面, 它们都有对应的适用场景: 26 | 27 | 抽象能力从低到高: 28 | 29 | C - ? - python - lisp 30 | 31 | - C 底层平台语言 32 | 用来写性能相关/底层的代码, 以及阅读其他开源项目的代码. C语言是逃不过的, 并且至少在未来30年内不会被取代. 33 | - python 动态语言. 34 | python的简洁, 清晰, 高效开发, 大量的库支持, 几乎所有领域都能够参与, 我采用它作为主力开发语言. 近来python使用者越来越多, 我也需要深入挖掘, 以应对开发者增多带来的技术贬值现象. 35 | - ? 能够处理复杂度的静态语言 36 | 在C和python中间, 我觉得还是会有一个间隙语言, 需要足够的性能, 以及能够处理复杂度. 37 | 本来C++是挺适合的(它应用在在Qt和游戏业上面), 但是由于学习成本比较高, 以及对于我来说使用场景不多, 暂时不打算深入. 或许go/lua是好的选择? 38 | - lisp 抽象语言 39 | 我需要有一个充分的抽象语言, 来让我能够用任何自己想用的方式来写代码. 40 | lisp简洁的语法, 以及强大的macro功能, 能够支持我的需求. 并且也带来一些优越感. 41 | 42 | 领域知识 43 | --------------------- 44 | 上面只是语言工具的部分, 下面是具体的技术领域(所谓的内功): 45 | 46 | 算法 47 | ````````````````````` 48 | 虽然我断断续续看了CLRS, 但是基础还是非常薄弱, 需要定期花时间学习.. 49 | 50 | linux 51 | ````````````````````` 52 | 作为产品的基石平台, linux从内到外的了解都是需要的, 先跑LFS吧... 53 | 54 | web 55 | ````````````````````` 56 | 现在是web的时代, 我到现在都没有通读完过tcp/ip那套书, 以及对一些核心协议不是特别了解, 虽然能够使用, 但是该做的事情是逃不过的. 然后就是抽空看RFC. 57 | 58 | 编程能力 59 | ````````````````````` 60 | 写代码的能力, 能够快速提出解决编程问题的方案, 并实现代码. 这样的能力什么时候都不会过时, 都值得训练. 需要经常做做题目... 61 | 62 | 设计能力 63 | ````````````````````` 64 | 在不同场景下, 提出和验证方案, 并监督实现, 这个还是需要多多开发, 并经常针对项目做出总结.. 一直以来, 我都没有整理这方面的内容, 是该做这样的事情了. 65 | 66 | 具体技术 67 | --------------------- 68 | 69 | 为了能够支持开发, 需要有强大的工具来做作成我的产品. 下面列出一些我需要深入研究的, 并且随着时间, 需要不断更新: 70 | 71 | - 开发工具: emacs 72 | * 能够根据需要设置成自己想要的方式.. 虽然我已经采用它开发超过2年, 但是还是很粗浅的应用, 不能按照自己的心意调整成想要的状态, 需要整理思路. 73 | 74 | - GUI库:PyQt 75 | * 这是我主力的用来写界面的库, 但是我对它底层不是特别了解, 这方面需要提高. 76 | * 最近出来了qml, 作为下一代的GUI语言, 我需要跟进时代. 77 | 78 | - web框架: django/web.py/Pyramid 79 | * 现在我只是使用过框架, 没有对框架有深入了解, 这样是不够的, 平时开发的时候看不出来, 遇到问题的时候无法解决, 需要弄懂一些基础概念: 整体处理流程/模板机制/数据库 80 | 81 | - 语言库: python库 82 | * 虽然python库非常好用, 但是还是需要知道下面是如何实现的, 以减少对特定产品的依赖. 最好能够阅读python源码和python库源码. 83 | 84 | 85 | 结论 86 | -------------------- 87 | 从上面列出来的东西来看, 我贪多嚼不烂了... 现在先慢慢实际使用lisp吧, 把我的一些python代码用lisp来实现.. 88 | -------------------------------------------------------------------------------- /所谓的你情我愿.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://lh3.ggpht.com/_os_zrveP8Ns/TMrZRW4Tz1I/AAAAAAAADLM/XC66Y6vsz4I/s800/W020080904536416398854.jpg 2 | :align: center 3 | 4 | 今天看到帖子: http://www.douban.com/note/97807441/ , 带来不少争议, 一句两句说不清楚, 特此专门发文阐述. 5 | 6 | 全文转载: 7 | 8 | 今天跟某留学海外的经济学高材博士生简短对话,是从去沃尔玛买东西是不是不道德开始的(其实我也是去沃尔玛的,所以完全没有任何道德优越感)。 9 | 10 | 我说起有个纪录片是控诉沃尔玛的。她骤然很激动,说最受不了的就是这种了,这是你情我愿的事情,你既然接受了这工作,就没什么好抱怨的。 11 | 12 | 我对经济学一窍不通,很傻很天真的问:那不能老板拿少点,给员工多一点吗? 13 | 14 | 她说:你凭什么要让老板少拿呢? 15 | 16 | 我说:那你凭什么不让工人多拿呢?为什么老板不需要限制自己的欲望,而工人要限制自己的欲望呢? 17 | 18 | 她说:这是你情我愿的事,你可以到别的地方去工作啊。 19 | 20 | 转载完了. 你支持哪一方? 21 | 22 | 23 | 作为一名普通人, 很少有机会能够以企业家的视角来思考问题, 往往是把自己带入到员工这个角色中, 感受员工的情绪: 24 | 25 | * 每天辛苦工作 26 | * 拿到的工资却很少 27 | * 会有被炒掉的危险 28 | 29 | 但是, 作为一个明事理的人, 可以利用情绪来感受环境, 但是不能被情绪所左右, 不能成为情绪的奴隶, 在思考问题的时候, 要静下心来, 想清楚, 弄明白. 30 | 31 | **先看清楚问题**: 员工工作辛苦, 企业家是不是应该给员工更多的好处? 是不是应该给员工更多的保障? 32 | 33 | 我们眼中的很多企业家, 往往一毛不拔, 压榨员工, 给我们一个很不好的印象, 并且, 我们从小就得到教育: 企业家是靠榨取剩余价值来获得利润的. 但是我们有没有想过, 事实是不是这样? 34 | 35 | 回到真实世界. 如果你有观察过做小生意的人, 一开始都是自己辛苦工作, 然后摊子做大, 人手不够, 再去雇人. 因为成本因素, 会去让员工努力工作. 如果你做过生意, 应当知道: **雇人不好雇**: 工资少了人不来, 不去监管人偷懒. 36 | 37 | 我们都认为企业家剥削员工, 那么有没有见过:**员工剥削企业家**? 作为员工的自己, 是不是找到机会就会偷懒? 是不是能多拿点工资就多拿? 从不会期望减少工资? 想想. 38 | 39 | 现在回到沃尔玛. 假如世界上没有沃尔玛, 那么原先那些沃尔玛的员工, 是不是更不好找工作? 是不是有人强迫他们去沃尔玛工作, 有了沃尔玛, 他们是不是多了更多的工作机会, **多了更多的选择**? 40 | 41 | 再进一步. 在沃尔玛雇用员工之前, 对员工有没有义务? 雇用之后是不是有义务了? 这个义务是否是交换员工的服务? 在雇用员工的合约签订的时候, 员工是否有自主权? 如果待遇少了, 员工是不是能不签合约? 签了合约, 员工是不是应该服务以换取企业给的薪资, 是不是说, 既然签订了合约, 就是员工和企业家达成了:**公平交易**? 42 | 43 | 那么回到最开始的问题: 员工工作辛苦, 企业家是不是应该给员工更多的好处? 是不是应该给员工更多的保障? 44 | 45 | 如果说当初员工签约的时候已经是公平交易了, 那么为什么企业家应该付出更多? 这样是不是不公平? 为什么我们会希望这样的事情? 是不是因为情绪的影响? 还是什么其他更重要的原因? 46 | 47 | 这是我们每个人都应该想, 并且应该想清楚的问题, 这关乎我们的人生观和世界观, 虽然不会有直接的影响, 但是会潜移默化到我们自己将来会走的路, 甚至影响到其他人走的路. 48 | 49 | 如果你想要弄清楚这些问题, 应该看看张五常的 `经济解释 `_ , 以及曼昆的: `经济学原理 `_ 50 | -------------------------------------------------------------------------------- /手机分配短讯id的面试题目.rst: -------------------------------------------------------------------------------- 1 | 题目 2 | ------------------------------ 3 | TopLanguage论坛里有讨论一个面试题目,内容如下: 4 | 5 | 有个老的手机短信程序,由于当时的手机CPU,内存都很烂。所以这个短信程序只能记住256条短信,多了就删了。 6 | 7 | 每个短信有个唯一的ID,在0到255之间。当然用户可能自己删短信,现在我们收到了一个新短信,请分配给它一个唯一的ID。说白了,就是请你写一个函数: :: 8 | 9 | byte function(byte* ids); 10 | 11 | 该函数接受一个ids数组,返回一个可用的ID,由于手机很破,我要求你的程序尽量快,并少用内存。注意:ids是无序的。 12 | 13 | Miro的分析在这里: http://www.cnblogs.com/miloyip/archive/2010/08/31/idalloc_clarify.html 14 | 15 | 我的分析 16 | ------------------------------ 17 | 18 | 我觉得,因为短消息发送的频率很低,那么我们不需要考虑取ID和释放ID的响应速度问题,主要问题放在如何节约空间.那么,最节约空间的是按照比特来存储ID是否使用. 19 | 20 | 还有就是,重新整理了需求,需要提供一个释放和获取ID的接口. 21 | 22 | 解法 23 | ------------------------------ 24 | 25 | 代码如下,没有测过,保证有错:: 26 | 27 | #define SIZE_COUNT 256/8 28 | 29 | struct manager { 30 | byte map[SIZE_COUNT]; 31 | 32 | byte alloc(); 33 | void dealloc(byte id); 34 | }; 35 | 36 | //获取ID 37 | byte alloc(){ 38 | for(int i=0; i> j) & 1) == 0) { 44 | //got it! 45 | data |= 1<>,一时感慨:现在不改变,以后更加不会改变了.人生能有多少青春年华,等到定型后在镜子前后悔,业已来不急了. 11 | 12 | 因此,我重新把blog翻回来,争取每日一贴(貌似写博客和前面那段话没有什么关系?) 13 | 14 | 一是锻炼语言表达能力,二是通过博客的形式,表达自己的一些看法,省得自己落得个"死因不详"的下场之后,连个追念都没有. 15 | 16 | 以上. 17 | 18 | -------------------------------------------------------------------------------- /旧_如何在windows下面发布程序.rst: -------------------------------------------------------------------------------- 1 | 因为一个朋友的博客更新, 我重新登录了博客大巴, 偶然发现自己的旧博客, 就补救了几篇博客回来 2 | 年岁已久, 重新整理在这里。也算是一份历史资料吧。 3 | 4 | -- 5 | 发布时间: 2008-02-15 6 | 7 | 程序写好了,如何给其他人使用呢? 8 | 9 | 如果是在linux下面,直接把源程序打包一下,然后写一个readme.txt,里面写上编译需要的模块,以及安装的方法就好了,会用linux的人一定会安装的。 10 | 11 | 不过在windows下面,就没有那么简单了。还是需要做出一个安装程序来的。 12 | 13 | 我看过了一些专门做安装程序的软件,太专业了,没有必要把简单的小程序发布搞复杂。我用的方法是,做一个自解压程序。 14 | 15 | 自解压程序可以使用winrar,里面支持这样的功能,做起来也很简单。但是好像winrar是商业版的程序,还是不用它算了。 16 | 17 | 我用的程序是7-zip,一个专门用来压缩与解压的程序。 18 | 19 | 20 | 21 | 制作自解压程序的方法是: 22 | 23 | :: 24 | 25 | 7z a -sfx7z.sfx [自解压程序名] [需要压缩的文件] 26 | 27 | 7-zip还可以用来把一堆文件制作成一个单独的exe文件,方法是用7-zip的制作安装包的功能,选定一个解压后自动运行的程序: 28 | 29 | 先把文件压缩起来。 30 | 31 | 再运行 copy /b 7zS.sfx + config.txt + [用7-zip压缩后的文件名] [可执行文件名] 32 | 33 | 7zS.sfx可以从 http://prdownloads.sourceforge.net/sevenzip/(7-zip的下载地址) 34 | 里面的extra包(比如7z457_extra.7z)里面得到,这是一个7-zip用来做安装程序的模块, 35 | 上面语句的原理是直接把config.txt 和压缩文件附到这个7zS.sfx后面,就成为一个exe文件了。 36 | 37 | config.txt是设置文件,我是这样写的: 38 | 39 | :: 40 | 41 | ;!@Install@!UTF-8! 42 | Title="rest" 43 | RunProgram="\dist\rest.exe" 44 | ;!@InstallEnd@! 45 | 46 | runprogram是解压缩后执行的文件。 47 | 48 | 这样就生成了一个可执行文件。运行后,经过一个解压的过程后(文件解压在某个不为人知的地方),就自动运行压缩包里面的文件了。运行完毕后会自动删除解压的临时文件。 49 | 50 | 具体的设置,查看7-zip文档的-sfx部分。 51 | -------------------------------------------------------------------------------- /旧_如何学习API.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-06-01 2 | 3 | 在网络上面看了很多文档,都是要用到的时候,随便看一遍,然后拷贝一下代码的。 4 | 5 | 在实际的使用过程中,发现这样的方式很没有效率,经常写着写着,就发现不知道API怎么调用了——这样的过程在开发过程中,非常经常地出现。 6 | 7 | 我以前认为,在开发前通读一遍,甚至实际把所有的API写一遍,是很困难的,因为很无聊,也很难记忆,也很耗时间。 8 | 9 | 但是“认为”这样考虑事情,完全不是科学的分析方法。如果我要分析什么方法学习API最快,首先需要找几个难度,长度差不多的API,然后统计学习时间,以及统计实际开发过程中损耗的时间,最后要review代码,看看代码的质量如何。 10 | 11 | 做一个初略的统计: 12 | 13 | 只是看API:对于python 处理 ini 格式文件的API,我阅读通读时花了16分钟,现在已经记忆不深了。 14 | 15 | 如果要写代码的话,大致能够记得怎么写,要用到哪些API(需要把文档开着),以及需要的注意事项。 16 | 17 | 而随便看看文档就继续写代码的耗时——不需要去测量,因为这样的代码含有质量缺陷,不可接受。 18 | 19 | -------------------------------------------------------------------------------- /旧_如何学好英语.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-05-31 2 | 3 | 英语其实很容易学。 4 | 5 | 需要做的是: 6 | 7 | 弄懂语法。 8 | 背诵,以及理解标准文章(根据水平的程度,应用英语的领域,选择不同的文章来背。)。 9 | 没有以上。 10 | 和以前学习文言文的方法一样。 11 | 12 | 以前我初中时,在英语老师那里补课,练习了很久的语法,初中以后都没有认真学习过英语, 13 | 14 | 现在水平大致在能够看懂文章(速度很慢,不能看文学作品),能够写email(语法一堆问题)。 15 | 16 | 看来我需要再继续学了。 17 | 18 | -------------------------------------------------------------------------------- /旧_如何设计.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-03-04 2 | 3 | 我是一个很初级的程序员,由于工作性质(企业软件一个模块的维护和开发), 4 | 与客户(企业内部使用该系统的员工)谈需求,设计,开发,导入,维护都是我一个人完成。 5 | 需要说的是,需求都是很简单的,做的事情也没有太多的技术含量,无非是设计一个流程。 6 | 7 | 现在我想要自己真的做一个桌面应用,问题就来了。我不会设计。 8 | 9 | 举个实例,我想要自己做一个GTD软件自己来用,名称为simpleGTD, 10 | 想好了流程(就是GTD的流程了),然后画了几个小图就开工了。 11 | 12 | 然后自然,开发遇到了一系列问题。 13 | 14 | 15 | 先说一下我的设计吧。 16 | 17 | 使用语言为python,界面使用PyQt,数据持久化采用sqlite。 18 | 19 | 思想也很简单,脑袋里面想到的东西都是事件,需要输入到程序里面。 20 | 21 | 然后程序按照优先级排一个序,我自己就按照优先级来做事。 22 | 23 | 可以把一个事件删除,计划到某个时刻(到时会自动调到最优先的程度),还有就是拆分成小事件(父子关系). 24 | 25 | 26 | 27 | 我开发方式就是增量式开发,就是写一点看一点,开始就遇到了问题。 28 | 29 | 原先设计时,打算用到QTreeWidget,用来显示复杂的组织关系,结果,按照文档写了一个类,用来显示sqlite资料, 30 | 31 | 结果怎么调试都无法正确显示。于是只好修改设计,取消显示组织关系---知道了开发前要验证技术风险 32 | 33 | 34 | 35 | 然后开始写数据结构,然后就是一大堆的SQL。。。。当然,一大堆的工作,一大堆的bug, 36 | 37 | 完工变得遥遥无期。继续修改设计,不再使用sqlite,只用python自带的那个pickle。 38 | 39 | 40 | 41 | 之后的工作就好过了许多,不过,还是有大量的时间花在了一边运行一边debug上面。 42 | 43 | 我虽然没有统计,但是至少知道,大量的时间浪费在了调试上面。 44 | 45 | 最后终于完工了,结果不很满意,但是至少能用。专案放在google code上面。如下: 46 | 47 | http://code.google.com/p/smallgtd/ 48 | 49 | .. image:: http://lh5.ggpht.com/_os_zrveP8Ns/SU9BeZiEWUI/AAAAAAAAC4g/AunMpJk4_FY/temp.png 50 | 51 | 无论从什么角度上看,都不能说是一个成品,更别说和商业作品相比了,文档什么的更别说。 52 | 53 | 为什么我不完善?我不知道别人怎么样,我自己的感觉就是,程序编出来后,我再也不想看代码了,有种恶心的感觉。 54 | 55 | 编完后,我感觉到自己疲惫了,再也不想写程序了,或者说感到自己很无力和无能,无法写出东西出来。 56 | 57 | 我看了不少书,程序语言和电脑知识上面,感觉自己虽然不是很精通,但是至少该懂的都懂。但是在程序设计和计划管理上面,感到自己万分无力,日常工作中,就算能够应用一些技巧,但是在整体开发上面,我感觉没有办法提高。我应该怎么样才能成为一个能够设计好程序的程序员?我不知道。 58 | 59 | 60 | -------------------------------------------------------------------------------- /旧_從信息的角度來看待軟件開發.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-06-04 2 | 3 | 個人感覺,程序開發,是一個處理信息的過程。 4 | 一開始,我們什么都不知道,需求也是模糊的。 5 | 在需求分析過程中,我們漸漸能夠看清到底需要完成什么功能。 6 | 但是如何實現這樣的功能,我們還是不了解。 7 | 在設計階段,我們根據需求的內容,嘗試一個個原型,直至找到合適的,或者根據需求 8 | 9 | 創造出一個。 10 | 事實上,需求的信息量如此之大,可能有很多的原型,才有可能覆蓋住需求的要求。 11 | 之后是裁剪,組合,分割,把需求的信息量,整理成原型的模樣, 12 | 需求的信息處理得清清楚楚,整整齊齊。 13 | 最后還要看看有沒有信息遺漏的。 14 | 之后是寫代碼和寫文檔,確保這個過程中,信息沒有變化。 15 | 16 | 實際中,信息流不是那么清晰的,會有一些正反饋和負反饋, 17 | 信息在傳遞的過程中還會有失真和遺漏,于是傳遞系統就有了冗余和校驗。 18 | 19 | 一個新視角,可以帶來新的理論和方法,比如用信息處理的方法來指導軟件的設計和開發。 20 | 我想,應該有人在這方面做過研究的。 21 | 22 | -------------------------------------------------------------------------------- /旧_毒品交易.rst: -------------------------------------------------------------------------------- 1 | 因为一个朋友的博客更新, 我重新登录了博客大巴, 偶然发现自己的旧博客, 就补救了几篇博客回来 2 | 年岁已久, 重新整理在这里。也算是一份历史资料吧。 3 | 4 | -- 5 | 发布时间: 2008-02-15 6 | 7 | 只要有供给和需求,以及可以交易的平台,就会有市场。 8 | 9 | 无论里面交易的东西是什么。 10 | 11 | 毒品对于文明世界里的各国而言,几乎都是被列为需要取缔的东西。但是和自杀一样,很少有人认为,选择毒品,是一个人的自由。 12 | 13 | 从社会的总收入上考虑,毒品总是会带来减值,吸毒者的精力大多被毒品所吸引,如果不算上凑集购买毒品的经费,几乎不会从事生产活动──其他的社会活动,娱乐开销都被毒品所占据,无法给社会带来发展的动力。但毒品对于单个劳动力的损害,完全无法与毒品交易业带来的更大伤害相比:诱骗吸毒,吸毒者的暴力 事件。。。。。如果说吸毒者是一个正在死亡的细胞,那么毒品网络就像是癌细胞一样,威胁整个机体的生命。 14 | 15 | 作为一个很少有接触毒品的社会而言,道德,社会上的警告很好地能够防止危机的蔓延,而毒品泛滥起来后,尤其是毒品网络的建立──只要有无法通过正当 收入购买毒品的吸毒者,很容易就会产生──除非采取绝对严厉的措施,很难加以根治。毒品的需求是硬性的,只要有需求,供给也不成问题(大多数的毒品不比种 庄稼难),市场?有人的地方就会有交易。 16 | 17 | 作为经济学来考量,政府对于毒品行业的打击,只是增加毒品的成本──吸毒者可以用一切来换取毒品,而政府雇员只是满足于国民的税收。而这些高出来的 成本,全部都会转移最终的用户手上。缺少资金的吸毒者,很难想像会采取什么措施来筹款。为了追求更大的利润收入,毒品行业的从业者必然会扩大市场,诱骗更 多的人染上毒瘾。这些都是现代社会,毒品无法被取缔的原因。 18 | 19 | 有些国家采取了一些聪明的方法,那就是提供上瘾的国民以成本价毒品──供给的无限扩大,使得毒品行业无力可图,开拓市场只会带来损失。在这些国家里,几乎没有能够生存下来的毒品网络,但是,由于国家间政策的区别,它们都从原先的毒品进口国,转变为了毒品出口国。 20 | 21 | 我们认知的毒品,其实可以分为好几类,神经麻醉型,感官刺激型,上瘾型等,其中上瘾程度也差别巨大,有些不会上瘾,有些使用了就不可能被戒掉。听说大麻对人体的伤害不比吸烟大,也不怎么会上瘾。有机会可以试试。 22 | 23 | -------------------------------------------------------------------------------- /旧_生命.rst: -------------------------------------------------------------------------------- 1 | -- 2 | 发布时间: 2009-02-01 3 | 4 | 钢铁是怎样练成的里面写到: 5 | 人最宝贵的东西是生命,生命属于我们只有一次。 6 | 7 | 实际上: 8 | 9 | 人拥有的只有生命.以及生命的表现形式:时间. 10 | 11 | -------------------------------------------------------------------------------- /旧_生存的幻觉.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-03-17 2 | 3 | 我们可以感觉到痛苦,快乐, 4 | 5 | 我们可以控制肉体采取反应。 6 | 7 | 开始时,我们不知道肉体,但是却有感觉。 8 | 9 | 之后,我们通过感觉学习到了肉体的存在, 10 | 11 | 却又困在了肉体中。甚至认为肉体就是我们本身。 12 | 13 | 我们控制,感受,了解以及不了解。 14 | 15 | 最后,肉体被抛弃,剩下的只是我们自己。 16 | 17 | ---若干年后,我们才学会如何离开肉体生存。 18 | 19 | -------------------------------------------------------------------------------- /旧_生活需要时不时的burst一下.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-06-02 2 | 3 | 很多游戏里面,都有这样的一种设置:当某个随时间积累的值到达一定程度的时候,就可以使用一次很强大的攻击技能。格斗游戏里面叫怒气,设计游戏里面是能量槽。游戏里面的角色,平时攻击可能不怎么样,可是一到这样的时候,攻击力瞬间提高,往往是达到清场或者是致命一击的效果。 4 | 5 | 其实,游戏里面的很多东西都是来源于生活。我们每个人在平常的生活里面,是否有积累这样的能量,时不时地爆发一下呢? 6 | 7 | -------------------------------------------------------------------------------- /旧_用sphinx写文档.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-02-10 2 | 3 | 现在的自动文档生成系统很多了,今天我介绍一个:sphinx。sphinx是python官方文档所使用的一套很简单的文档自动生成系统。 4 | 5 | 官方网站:http://sphinx.pocoo.org/index.html 6 | 7 | 8 | 9 | 安装方式: 10 | 11 | ubuntu下面: 12 | 13 | :: 14 | 15 | sudo apt-get install python-sphinx 16 | 17 | windows下面:因为我没有装过,不知道sphinx依赖什么,估计很多,很难装。 18 | 19 | 20 | 21 | 使用方法: 22 | 23 | 打开命令行,找到你想要建立文档的位置,运行: 24 | 25 | :: 26 | 27 | sphinx-quickstart 28 | 29 | 这是sphinx一个自带的快速配置工具,一路点回车,除了要你输入project名称的时候。(我就是这样的。。) 30 | 31 | 然后就会在当前目录下面建立一些文档: 32 | 33 | build:自动生成的html,pdf之类都会放到这里。 34 | 35 | makefile:上面设置的时候,对于unix系统,会默认生成makefile,以后要做什么事情,只要make一下就好了。(不要告诉我你不知道什么是make。) 36 | 37 | source:当然是文档源文件目录了呀。 38 | 39 | source文件夹初始时里面会放这个东西: 40 | 41 | conf.py:sphinx-quickstart里面的设置都会放到这里。随便修改吧。 42 | 43 | index.rst:文档的最顶端。 44 | 45 | 46 | 47 | 写文档: 48 | 49 | 修改index.rst, 50 | 51 | 改为: 52 | 53 | :: 54 | .. toctree:: 55 | :maxdepth: 2 56 | 57 | test 58 | 59 | 上面增加了一个test的东西。sphinx是把文档当作一个树来看待的,你要加新的东西,需要在原先旧的地方添加你要加的东西的名称,在这个例子是test。现在可以在source目录下新建一个文件:test.rst 60 | 61 | 内容为: 62 | 63 | :: 64 | 65 | test 66 | ==== 67 | 68 | 这个是一个测试。 69 | 70 | * This is a bulleted list. 71 | * It has two items, the second 72 | item uses two lines. 73 | 74 | 回到目录最上层,运行make html,然后就会自动生成html的文档。 75 | 76 | 再开启 build/html/index.html ,这就是显示的结果,是不是很简单? 77 | 78 | .. image:: http://dl.dropbox.com/u/1167873/images/sphinx.png 79 | :align: center 80 | 81 | 更多的文档在 http://sphinx.pocoo.org/contents.html , 以后我会介绍sphinx文档具体怎么写。 82 | 83 | -------------------------------------------------------------------------------- /旧_福利社会为什么要不得.rst: -------------------------------------------------------------------------------- 1 | 因为一个朋友的博客更新, 我重新登录了博客大巴, 偶然发现自己的旧博客, 就补救了几篇博客回来 2 | 年岁已久, 重新整理在这里。也算是一份历史资料吧。 3 | 4 | -- 5 | 发布时间: 2008-02-15 6 | 7 | 一个人交税小于福利所得,得到利益。 8 | 9 | 一个人交税大于福利所得,得到损害。 10 | 11 | 人趋利避害。 12 | 13 | 长此以往,懒人越来越多,税收越来越少,社会破产。 14 | 15 | -------------------------------------------------------------------------------- /旧_程序化语言.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-03-05 2 | 3 | 据我所知,平常人语言的准确性不高,每个人的理解程度也不同, 4 | 这造成了无数完全没有意义的讨论。 5 | 我有一个想法:能否形成一种语言的子集, 6 | 严格规范语法,用词和句子之间联系,显式地提供每个结论的推理过程,出处。 7 | 不过,这样不就成为论文了? 8 | 9 | 举个实例: 10 | 11 | 我觉得设计模式不应该被滥用。 12 | 首先,我要定义自己的命题。 13 | 什么是设计模式?什么情况下可以称为是滥用?具体的实例是什么? 14 | 然后,我在提供实际的例子,显示在滥用的情况下,会造成什么样的后果。 15 | 其中,我必须要给出推理的过程。 16 | 17 | 之后,其他人的回复,如果是赞同的,给出其他的推理过程,来证明该命题的正确性。 18 | 19 | 而反对的人,必须要从推理过程,推理所用到的命题错误,事实不存在等来反驳命题,并需要引向原文,以方便读者阅读。 20 | 21 | 任何不符合该语法定义的回复,都可认为是废物。 22 | 23 | 各位觉得这样的模式如何?是否很有意义? 24 | 25 | -------------------------------------------------------------------------------- /旧_自我反省.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-02-10 2 | 3 | 现状: 有一定程度的软件开发经验(2年简单的程序开发经验),基础马马虎虎,看过SICP,CS:APP, 有失败的项目开发经验. 4 | 5 | 目标:能够自主开发出创新型的应用.也就是在世上留个脚印. 6 | 7 | 问题: 1没有足够的动力坚持下去 2年纪也不小了,24 3创新能力不足 8 | 9 | 解决方案: 10 | 11 | 1多写垃圾应用. 12 | 13 | 2加入一个社区. 14 | 15 | 3多读书,多思考. 16 | 17 | -------------------------------------------------------------------------------- /旧_计划没有按照预定来_怎么办.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-05-31 2 | 3 | 昨天没有写博,今天来反省,补充一篇。计划没有按照预定来,怎么办? 4 | 5 | 昨天一天都在打游戏,或者看小说,在这种情况下,无法记住每天博客的任务。 6 | 7 | 那么今天又记住了,怎么办呢? 8 | 9 | 这个问题,本质来说,是一个实施过程,发现新问题需要处理的状况。 10 | 11 | 12 | 13 | 首先,分析一下,计划没有完成,是否是实际发生的状况,在计划时没有考虑? 14 | 15 | 是的,计划时没有考虑如果忘记了如何处理。不过现在可以修改计划:忘记了写,需要补充,缺多少补多少。 16 | 17 | 思考这样的处理方法是否有问题?如果忘记了很久,怎么办? 18 | 19 | 那就平均任务,每天2篇,直到补充完成。 20 | 21 | 22 | 23 | 任何计划和实施都会出现问题,我们叫它风险(risk),遇到风险时,必须立刻处理它。 24 | 25 | 如果风险影响到计划排程,就需要做计划里程碑变更,(写博客是一个长期任务,没有里程碑。) 26 | 27 | 如果风险发生的原因在于计划的不完善,需要修改计划以符合实际情况的发生。(在这个例子里,是约定缺多少补多少) 28 | 29 | 如果风险无法解决,计划只有放弃,实施一个无法完成的计划是不明智的。(如果哪天我被抓,写博当然就只能停止了。) 30 | 31 | 以上。 32 | 33 | -------------------------------------------------------------------------------- /旧_计划生育不好.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-06-01 2 | 3 | 从经济学的角度,如果把人从资源的角度来看: 4 | 1反对对市场的干预(除非为了维护市场本身) 5 | 2从时间上来看,人的价值是不断提高的,限制对人的投资,会损失很多。 6 | 7 | 从历史的角度,当年人都是靠国家来养,国家养不了,就限制数量。 8 | 9 | 从消耗资源来看,人的成本,只有粮食是刚性的,其他都可以靠减少平均耗用量来解决。 10 | 现在的科技水平,粮食生产完全不成问题。(穷国饿死人基本上是因为政治) 11 | 12 | 但是论到解决这个问题,有了既得利益群体,牵扯到政治,那就很难很难了。 13 | 估计最后会因为实际成交价格(生育数量)低于限制的价格(每户1人),造成计划生育名存实亡。 14 | 最后无生育可计划,政府会裁减该机关。(新补充: 或者转型成为促进生育机关, 继续骗钱) 15 | 16 | -------------------------------------------------------------------------------- /旧_軟件工程師的信仰.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-06-01 2 | 3 | 善惡概念產生的條件,是有欲望。 4 | 什么是善?高效的滿足欲望的方法。 5 | 什么是惡,低效的滿足欲望的方法。 6 | 什么是道德?道德是種方法論,指導人采用更好的方式解決問題——自己的欲望。 7 | 社會的道德:以社會為立場產生的道德,指導人為了國家,民族犧牲。 8 | 個人的道德:以個人理性思維為立場產生的道德:指導人為了特定的目標而犧牲。 9 | 生物的道德:以生物體為立場產生的道德:指導生物活下去。實例是本能。 10 | 11 | 軟件工程師的工作,就是利用自己的專業知識,來滿足用戶的需求,解決實際的問題。 12 | 軟件工程師的欲望,是產生出更廉價,更穩定,更高效的軟件系統。 13 | 14 | 你我是否有做惡? 15 | 是否由于工期的壓力,寫出劣質和難以理解的系統? 16 | 是否由于個人職業的壓力,故意寫出只有自己能夠看懂的代碼? 17 | 是否由于個人對新技術的欲望,降低了系統的穩定性? 18 | 是否由于個人好惡,選擇了不合適的編程語言,開發環境和軟件庫? 19 | 20 | 什么是天堂?天堂就是善的集合。 21 | 天堂里的代碼,整潔,簡單,像詩一樣優美, 22 | 程序員們三兩成群,討論一個個有趣的問題,當有所收獲時,奮筆疾書,一個改變世界 23 | 的應用就此產生。 24 | 25 | 什么是地獄?地獄就是惡的集合。 26 | 地獄里的代碼,臟亂,復雜,像街巷中的垃圾, 27 | 程序員們被限制在成排的辦公桌前,看著沒有人會要的需求,寫著沒有人會讀的代碼, 28 | 編譯著沒有人會用的程序。 29 | -------------------------------------------------------------------------------- /旧_音乐为什么能够感染人.rst: -------------------------------------------------------------------------------- 1 | -- 发布时间: 2009-06-05 2 | 3 | 音乐为什么会激发人的情绪? 4 | 5 | 音乐有什么?特殊的调子,稳定的节奏。 6 | 7 | 节奏调控肉体,方便整体协调一致。 8 | 9 | 特殊的调子,则传递出信息,控制人们的情绪。 10 | 11 | 无论是战争,还是劳动,音乐都是人的好帮手。 12 | 13 | 可是现在为什么不允许上班的时候听音乐呢? 14 | 15 | 一边听音乐一边coding效率很高的。 16 | 17 | -------------------------------------------------------------------------------- /爱抄才会赢.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://news.xinhuanet.com/society/2008-12/25/xin_4121205250855984258786.jpg 2 | :align: center 3 | 4 | 现在中国因为山寨而闻名, 不管国外有什么东西, 国内就有山寨的产物出来. 5 | 就从电子产品领域来说吧, 自从有了ipad, 无数平板拔地而起, 无数的山寨iphone, 以及其他种种设备. 6 | 至于其他领域也不用说了, 大家都比我清楚. 7 | 8 | 现在很多人认为这个不是什么好事, 都是抄别人的产品, 名声不好. 也不是什么创新产业, 利润也不高. 9 | 我个人有一个看法, 山寨是中国的希望. 为什么呢? 10 | 11 | 12 | 首先, 以前的中国是封闭于世界的, 什么都不会, 什么东西都做不出来. 后来搞特区, 搞工厂, 廉价劳动力引进过来国外的技术, 搞外包. 13 | 这一步走得非常对. 因为什么都不会, 只有出卖现在有的东西, 比如劳动力什么的, 才能过日子. 并且在这个外包的过程中, 14 | 可以掌握国外的技术. 中国人是非常聪明的, 那点东西还怕学不会. 15 | 16 | 然后必然会产生下面一个结果: 学会了技术, 不愿意单纯出卖劳动力了. 于是自己出来做东西. 但是这个阶段我们只会做东西, 17 | 设计什么的都是在国外, 抄不到. 于是现在的状况就是到处都是山寨的东西出来. 这是一个非常好的现象, 说明大家学到手艺了. 18 | 19 | 然后, 随着有手艺的人越来越多, 能做设计的人也会从中产生, 因为一方面有这个需求了, 20 | 山寨企业有了多年的积累, 以及为了赚取更多的利润, 就会想办法往上游走. 正如我们前面说的, 中国人非常聪明, 学什么都非常快, 所以... 21 | 现在很多服装行业都有自有品牌, 其实是靠着多年的积累的. 我很是反对腾笼换鸟的说法, 没了这个基础, 怎么发展上层建筑? 22 | 23 | 24 | 山寨是一个非常好的东西, 因为山寨其实是一个学习的过程, 如果从头摸索, 那么消耗的人力物力是无法衡量的. 25 | 而直接抄, 至少大致是不离谱的. 避免了无数自己摸索可能出现的问题, 也能少走无数的弯路. 别人都搭好桥了, 我们就不要摸着石头过河了. 26 | 27 | 我觉得现在主要的问题不是我们抄不抄的问题, 而是抄不像的问题. 只是抄了一个产品的外表, 精神上的东西没有抄到. 28 | 我们现在那么多抄iphone的手机, 哪个的用户体验上面能和iphone比? 29 | 我们现在抄的那么多网站, 哪个是按照那个被抄的网站原有的思路走的? 30 | 所以我觉得现在的问题不是抄得太多了, 而是抄得还不够多, 还不够好. 31 | 32 | 现在这么多山寨公司的人, 你们不要太妄自菲薄, 以为自己做的是多么不好的一件事. 33 | 因为抄是学习的过程, 你们应该抄得更像, 把对方所有的东西都抄过来, 而不是只抄形不抄神, 34 | 这样你们才能作出世界级的产品出来. 而世界也会因为你们的产品而得到改变. 35 | 36 | (ps: 本文回避了知识产权的问题, 那又是另外一个问题了, 等以后有时间讨论.) 37 | -------------------------------------------------------------------------------- /用python画地形图.rst: -------------------------------------------------------------------------------- 1 | 看到一篇 `好文 `_,关于如何生成一个随机地形图的, 2 | 方法是用分形。于是手痒,花了一个下午和半个上午的时间把用python把这个事给干了。 3 | 下面是生成的2维和3维效果,代码在 `这里 `_ 4 | 5 | .. image:: http://lh4.ggpht.com/_os_zrveP8Ns/TMrCRfPwMlI/AAAAAAAADLA/kuDfiF_zYb0/s800/screenshot-figure-1.png 6 | :align: center 7 | :width: 600 8 | .. image:: http://lh6.ggpht.com/_os_zrveP8Ns/TMrCRlQ9yJI/AAAAAAAADLE/t7EUtx1vodY/s800/screenshot-figure-1-1.png 9 | :align: center 10 | :width: 600 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /用shiboken做python绑定.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.pyside.org/docs/shiboken-0.5.0/_images/generatorworkings.png 2 | 3 | pyside的项目已经beta了一段时间了, 它采用的方法是开发一个名为shiboken的绑定生成工具来做处理. 我们也可以利用这个工具来简化做python绑定的工作. 4 | 5 | 具体工作流程 6 | ----------------- 7 | 上面的图代表了整个体系工作的方法. 用户提供2个信息: 需要绑定的库的头文件, 以及建立一个需要绑定的库的描述信息文件(xml), 以及在这个描述文件里面手动对生成内容做一些修改. 如果一切顺利的话, 只需要在描述文件里面说明需要绑定到python里面的类/枚举等信息即可. 8 | 9 | 如何用? 10 | ----------------- 11 | 12 | 具体可以见 `shiboken官方教程`_, 走到这一步的同学应该对英文没有压力的吧, 我就不再整理成中文了, 毕竟作者他们也都不是英语母语的. 13 | 14 | 一般情况下, 我们只需要直接下载里面附带的示例, 然后修改一番, 就可以用来给我们自己的库来做绑定了. 我现在就是这样做的. 15 | 16 | 如何实现的? 17 | ----------------- 18 | 上面都是具体的做法, 在实际的使用过程中还会遇到各种各样的问题, 我们可能还需要对shiboken机制有一定的了解. 19 | 20 | 编译过程 21 | ````````````````` 22 | 23 | 我们写了xml描述文件之后, 实际执行的命令是generatorrunner, 它会按照xml文件, 24 | 以及引入的库头文件, 生成wrapper的cpp/h文件. 之后, 我们把这些文件编译成动态链接库, 这个链接库能够直接被python调用. 25 | 如下图: 26 | 27 | :: 28 | 29 | global.h generatorrunner gcc 30 | typesystem_foo.xml -------------------> wrapper.h/cpp ---------> libfoo.so 31 | 32 | generatorrunner运作机制 33 | ``````````````````````````````````` 34 | 这里是 `generator运作机制`_ 的介绍. 35 | 36 | .. image:: http://www.pyside.org/docs/generatorrunner/_images/bindinggen-development.png 37 | 38 | 如上图, 分成几个模块, api extractor获取头文件的信息, typesystem和injected code就是那个xml描述文件. 39 | shiboken就是generatorrunner后台调用的cpp文件生成工具了. 40 | 41 | 结论 42 | ----------------- 43 | 具体shiboken是如何处理的, 以及为了调试方便, 如何获取中间生成的类信息, 这个我还需要时间去了解. 44 | 他们的作者也是很开放的, 如果发现问题, 可以往: pyside@lists.openbossa.org 邮件列表上面发邮件提问, 作者基本上是会给回应的(毕竟他们是nokia雇来做这个事情的). 45 | 46 | .. _`generator运作机制`: http://www.pyside.org/docs/generatorrunner/overview.html 47 | .. _`shiboken官方教程`: http://developer.qt.nokia.com/wiki/PySide_Binding_Generation_Tutorial 48 | -------------------------------------------------------------------------------- /电脑是如何实现图形显示的.rst: -------------------------------------------------------------------------------- 1 | 今天去 `hacking thursday `_ 的活动, 听一位朋友介绍了一下关于电脑是如何处理图形显示的东西, 2 | 整体脉络清楚了一些, 趁着记忆没有消散, 这里稍微整理一下. 3 | 4 | 我们先从显示器说起. 显示器负责真正把图像呈现给我们, 一般现在我们的电脑显示器可以接收数字信号也可以接收模拟信号, 5 | 数字的一般用 `DVI `_, 模拟的一般 `VGA `_ 的接口. 6 | 传给显示器的数据不神奇, 就是图像数据流, 每个点拆分成RGB红绿蓝3原色的数值表示. VGA还要带的是 horizontal sync, vertical sync, 这个是水平和垂直扫描率, 7 | 就是每秒钟横竖扫描多少条, 就是我们说的屏幕分辨率再乘上没秒钟屏幕的刷新率. 8 | 这个数据丢给显示器, 显示器里面也有CPU, 负责控制屏幕把这样的数据显示出来, 也可能对这个数据做一点微调什么的, 比如我们显示器一般都有的对颜色位置亮度饱和度的调整. 9 | 10 | 要传给显示器的数据量是非常巨大的(根据屏幕尺寸), 也需要不断地传数据给显示器. 具体负责这些操作的是显卡. 11 | 现代的显卡要做相当多的事情. 不止是不间断地发送视频, 还会有渲染(3d游戏场景的渲染主要工作是交给显卡来做的), 视频数据解码等工作. 12 | 与上层的接口一般是通过显卡来读取特定的内存区块(DMA等方式)来实现. 简单地说, 告诉显卡, 主内存里面一个区块存放了需要显示的数据, 然后显卡自己过来取数据, 13 | 上层应用定时往这个内存区块放数据. 14 | 15 | 显卡会有自己的一些做事情的方式, 对于上层应用来说, 这些都是实现细节, 不需要知道. 显卡厂商会把功能抽象成opengl的API, 然后上层应用就调用这样的API即可. 16 | 在linux里面, Xwindow做的事情就是提供一个server/client的接口, 具体接口还是opengl. 17 | 18 | 然后我们到了更上层的gnome/kde, 它们是提供关于窗口绘制的api, 再往上面就是应用程序了, 调用gui的库来设置控件, 交互什么的. 19 | 20 | 如果上层应用需要直接发送显示的东西怎么办? 比如视频. 这个时候调用opengl的api, 申请一块内存区, 把渲染好的特定数据结构的图像放到这个内存区, 21 | 然后用opengl通知下层显示即可. 上层应用的进程需要控制刷新率, 一秒30桢的话就要刷30次, 如果应用是一个播放器的话, 可能需要多个线程, 22 | 一个线程用来做用户交互, 一个线程用来刷屏幕, 一个线程用来处理数据编码. 显卡也可以做解码的工作, 播放器可以控制显卡来解码, 23 | 这样显卡直接解码后写到显卡的缓存区块里面去. 24 | 25 | 具体技术细节非常复杂, 但是对于我来说, 对整体的过程有一个概念即可. 知道了原理就行了. 26 | -------------------------------------------------------------------------------- /真人蒸汽朋克.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.riesetheseries.com/html/images/img_sypnopsis.jpg 2 | 3 | 想看就点 `这里 `_ 4 | -------------------------------------------------------------------------------- /程序员在工地.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://i2.sinaimg.cn/dy/c/p/2008-03-24/U2414P1T1D15213484F21DT20080324144305.jpg 2 | :align: center 3 | 4 | 7/23号, 因为公司有仪器要出货, 最后阶段需要安装程序等等, 我需要随着公司的安装队伍一起出行, 目的地是东莞的沙田镇. 这一行, 对我来说是非常失败, 非常浪费时间, 非常没有效率. 5 | 6 | 我们7/23号出发, 7/24号到达沙田, 安顿在了一个小旅店里面, 然后去勘测现场. 发现仪器安装需要的种种条件都没有满足: 地基没有搭建好, 电没有上, 于是我们带队的领导和当地的甲方紧急沟通, 等待了2天, 终于可以施工了. 施工过程基本上是我们的安装小组在做, 我作为一个闲人, 前几天完全没有任务, 却也在领导的指示下, 留守工地. 只有最后一天才上场, 花费2/3个小时就搞定了. 7 | 8 | 总体而言, 这么多天的工地留守对我而言是完全没有效率的. 如果有机会, 下次绝对需要避免这样的状况发生. 留守期间, 我通过看书抢救了部分时间, 但是因为场地关系, 飞沙走石, 暴雨烈日, 书只是看了一部分. 作为一个优秀的代码生产机器, 这样的空转让我十分痛心. 9 | 10 | 以上是本次出差的总结, 我像以前一样确定, 我不愿意做那些无法体现我特殊价值的的工作, 以及, 我在恶劣条件下完全没有产能. 11 | 人生苦短, 我需要通过以我的方式来改变世界来体现我的价值, 以后我也会继续往这个方向努力! 12 | -------------------------------------------------------------------------------- /箴言.rst: -------------------------------------------------------------------------------- 1 | 这里收集了一些我的语录, 以及我转述其他人的语录(会注明, 大多数不记得转述谁的了), 如果一股读者味道不要怪我. 如果我没有按照我说的话做也不要怪我. 我也只是一个心灵脆弱的人. 2 | 3 | 新的东西添加在前面: 4 | 5 | - 如果一个人活得和别人一样, 那么他给这个世界带来了什么信息量呢? 6 | - 编程的快乐, 本质上是创造的快乐: 你以自己的方式完成了工作, 工作本身刻有你自己的烙印. 7 | - 婚姻是一个合约, 任何超过十年的合约, 在这个时代都是带有巨大风险的. 但是什么时候我们能够有渐进的婚姻呢? 8 | - 人活着需要的东西其实很少, 即使你在大城市里面, 即使你工资不多. 9 | - 精神上的乐趣比物质上的乐趣更有持久性. 10 | - 人工作的目标是需要工作的时间越来越少, 而不是越来越多. (转述) 11 | - 人活着本身没有意义, 如果你产生了这样的问题, 那么期望的结果是不会再问这个问题了. (转述维特根斯坦) 12 | -------------------------------------------------------------------------------- /计算机领域学习路线图.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://ocw.mit.edu/images/logo-ocw-home_new.gif 2 | :align: center 3 | 4 | 目标 5 | ------------------------ 6 | 帮助计算机领域的初学者, 从零开始, 一步步成为一个靠谱的计算机领域的专家. 这里面只包含偏软件的部分. 7 | 8 | 我们需要达成以下目标: 9 | 10 | * 了解计算机领域的基础知识. 对背景的了解是基础. 11 | * 拥有计算机科学家的思维和解决问题的能力 12 | * 能编程! 编程是我们解决问题的主要方式. 13 | * 使用开源系统, 加入到开源社区中去 14 | 15 | 计算机基础课程学习 16 | ------------------------ 17 | 想要学习计算机领域的基础知识, 我选择使用mit公开课里面的内容. 下面我挑了一些必读课程: 18 | 19 | 入门课程. 20 | 21 | * `6.00 `_ 入门课. 22 | * `6.001 `_ 老牌入门课. 23 | * `6.087 `_ C语言是必须要掌握的.. 24 | * `6.189 `_ python也是必须要掌握的. 25 | 26 | 基础课程. 27 | 28 | * `6.042J `_ 恩, 一些计算机领域必须的数学基础. 29 | * `6.046J `_ 算法基础. 30 | * `6.002 `_ 计算机组成原理. 31 | * `6.828 `_ 操作系统 32 | * `6.035 `_ 编译原理. 33 | 34 | 网络部分. 35 | 36 | * `6.033 `_ Computer System Engineering 37 | * `6.171 `_ Software Engineering for Web Applications 38 | 39 | 上面是必读, 当然还有其他的课程, 感兴趣可以学学, 都在: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/ 40 | 41 | 可做和必做事项 42 | ----------------------------- 43 | 下面我整理了一些必须做和可做的事情, 我觉得它们对于提高实力非常重要. 44 | 45 | 开源社区 46 | 47 | * 安装和使用linux, 在linux上面做开发 48 | * 学会翻墙, 以及搭建翻墙服务器 49 | * 了解和熟悉开源社区的做事方式 50 | 51 | 编程 52 | 53 | * 超过1万行的编程代码量 54 | * 完成程序: 1个网站, 1个GUI程序, 1个手机程序 55 | * 选作: 设计实现一个简单的CPU, 实现一门语言的编译器或解释器, 实现一个http服务器, 搭建一个web开发框架 56 | 57 | 下一步? 58 | ------------------------------ 59 | 经过上面课程的学习, 你基本上掌握了所有必须掌握的知识了, 然后你可以深入去学习你更感兴趣的部分(人工智能? 算法?), 或者直接去做你想做的程序开发吧! 60 | -------------------------------------------------------------------------------- /训练专题1_如何开始训练.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://www.soso5u.com/uploads/allimg/110628/20592551S-1.jpg 2 | :align: center 3 | :width: 600 4 | 5 | 上次我们讨论了 `如何改变一个人 `_, 主要靠训练和洗脑. 那么从现在开始, 我整理一些训练的技术. 假设我们决定好了通过训练改变自己, 比如, 我们希望养成天天锻炼的习惯. 那么我们如何开始, 以及如何保证训练能够进行下去呢? 6 | 7 | 原先我们说过, 建立习惯需要考虑的3个方面: 前提, 过程, 结果. 我们分析一下: 8 | 9 | 前提 10 | ```````````````````````````` 11 | 我们已经知道锻炼的必要性了, 并且愿意投入. 如果意愿不是特别强烈, 那么需要上网去搜索关于锻炼的文章, 把自己洗脑. 这方面我觉得大多数人能做到, 因为大家已经养成了上网看文章的习惯(不然怎么看到这里的). 12 | 13 | 过程 14 | ```````````````````````````` 15 | 锻炼困难, 多是因为在过程上面得到了反向刺激: 我们记住了锻炼的痛苦, 下次开始之前, 痛苦出来干扰我们的决定. 在过程上面, 我们注意到, 锻炼强度本身不是特别重要, 而强度是带来痛苦的主要方式. 因此我们可以减少强度. 开始阶段过高强度的锻炼是大家放弃锻炼的主要原因. 16 | 17 | 在过程上面还有一个问题: 锻炼过于无聊(针对跑步的部分), 那么我们可以通过各种方式来提升锻炼的正反馈程度: 比如专门留自己喜欢的音乐在锻炼的时候听; 找妹子多的运动场所比如一些健身中心, 而不是中老年人常出没的公园; 边放电影边锻炼(一定要在锻炼结束的时候关闭, 不然正反馈会养成失败). 18 | 19 | 结果 20 | ````````````````````````````` 21 | 锻炼结束后, 需要加上奖励, 以让整个过程得到巩固, 锻炼本身带来的精力提升可以是一部分, 在网络上发送"我今天锻炼了"让大家来鼓励自己也是一个方法(真的会有人过来鼓励一下吗?), 还可以计算自己的经验值模拟升级等等.. 22 | 23 | 结论 24 | ------------------------- 25 | 如果能够实施上面的几个方面, 开始锻炼不成问题, 但是需要坚持下去的话, 这些还不够, 我们需要能够应对变化. 关于应对变化的部分, 我们下次再讨论. 26 | 27 | 28 | -------------------------------------------------------------------------------- /采用libusb库让PC与USB通讯.rst: -------------------------------------------------------------------------------- 1 | 需求 2 | ---------------- 3 | 作为设备开发者, 一般需要让设备与上位机PC通讯, 我们往往考虑采用以下几种接口: rs232, USB, ethernet. 4 | 5 | 现在在PC机上已经很难见到rs232的接口, 而ethernet也需要做特殊的配置, USB大多成为我们的首选. 对于数据偏少的应用, 我们可以利用USB虚拟串口的方式来完成这样的任务, 虚拟串口的驱动和实例, 对于下位机来说也非常常见. 有个问题: 很多应用无法用虚拟串口的方式来得到满足, 只能按照USB的方式来解决问题. 这个时候, 我们只好针对USB进行编程. 对于复杂的驱动编程, 大多数程序员往往望而却步. 不过总有其他简单的方法解决问题. 这里, 我们介绍一个USB通讯库: libusb. 6 | 7 | 介绍 8 | ---------------- 9 | 10 | libusb是一个针对usb通讯的库. 使用它, 你不需要知道操作系统的细节, 你只需要对USB有足够的了解即可. 它也不需要你写驱动, 所有的工作都可以在用户态完成. 使用方法很简单, 这里有一个示例: http://sourceforge.net/apps/trac/libusb-win32/wiki/libusbwin32_documentation#IV.Examples , 是不是很简单? 11 | 12 | 原理 13 | ---------------- 14 | 15 | libusb自己带有一个内核驱动, 名字叫libusb0.sys, 放在WINDOWS\SYSTEM32\DRIVERS里面. 用户程序调用libusb0.dll, dll会把任务交由驱动来完成. 这样保证用户态就能够完成USB通讯的作业. 16 | 17 | 具体做了什么, 可以通过下载项目的源文件来了解, 等我有时间的时候再看看吧. 18 | 19 | 安装方法 20 | ---------------- 21 | 22 | libusb现在有好几个版本. 主页面在这里: http://www.libusb.org/ 23 | 24 | * 因为我们一般是进行工程应用, 选择相对稳定的版本: libusb-0.1. 25 | * 平台在windows下的话, 我们采用libusb-win32: http://www.libusb.org/wiki/libusb-win32 26 | * linux下一般已经添加到源里面去了, 查找libusb即可. 27 | 28 | windows下安装方法: http://www.libusb.org/wiki/libusb-win32#Installation 29 | 30 | 里面有2种安装方式, Filter Driver Installation 和 Device Driver Installation, 前面一个可以说是开发环境, 后面可以说是发布驱动本身. 我们因为是做系统, 选择前面一个方式, 省得麻烦. 31 | 32 | 使用 33 | ---------------- 34 | 35 | 这里有比较详细的文档: http://sourceforge.net/apps/trac/libusb-win32/wiki/libusbwin32_documentation 36 | -------------------------------------------------------------------------------- /黑客与画家.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://img3.douban.com/lpic/s4603101.jpg 2 | 3 | 很久以前就耳闻 `hackers and painters`_ 这本书, 终于在今年过年期间, 抽空看完了. 这本书有点像是杂文集, 里面的内容遥相呼应, 但又独立成章. 4 | 5 | 里面的核心思想: 黑客更像是艺术家, 而不是工程师或者科学家. 编程工具对于黑客而言, 像是画笔对于画家, 掌握了工具, 不代表能够创作出好的作品出来. 这篇文章可以见 `作者博客 `_ (`中文翻译 `_) 既然作者已经介绍得很清楚了, 我也不多说了. 我现在的问题是, `作为程序员, 技术能够花时间学到, 但是创造能力很难, 是否有提升的方法? `_ 6 | 7 | 这本书没有给我带来太多的新知, 可能跟我已经看过很多类似的文章有关吧. 有人已经 `完成翻译工作了 `_, 但是好像现在还没有上市, 如果你真的像我一样时间很多, 或者英语阅读水平很好, 可以google一下, 有破解的英文版. 8 | 9 | .. _`hackers and painters`: http://book.douban.com/subject/1395495/ 10 | -------------------------------------------------------------------------------- /黑客马拉松活动小记.rst: -------------------------------------------------------------------------------- 1 | .. image:: http://topgeek.org/wp-content/uploads/2012/04/hackson.jpg 2 | :align: center 3 | 4 | 活动 5 | ---------------- 6 | 7 | 上周的周末(5/5-5/6), 我们参加了 `黑客马拉松 `_ 活动, 8 | 简单点的介绍, 就是一群程序员/美工/产品经理, 花费1整天的时间, 鼓捣出一个酷的东西。 9 | 黑客的文化在于创造, 分享, 进步, hackathon的活动是黑客文化的一个体现。 10 | 11 | 过程 12 | ---------------- 13 | 14 | 参与活动可以考虑预先组队和现场组队, 我们是预先组好的, 4个人: 我(GuruDigger), 蔡金(GuruDiggger), 吴杰蔚(住隔壁, 交大硕士), 周航(EMC云存储), 15 | 准备做的产品, 是我的一个Idea: `豆瓣match `_ , 通过豆瓣上面的喜好资料, 来寻找志同道合的对象。 16 | 17 | 一天时间非常的紧张, 我们提前一天的晚上, 小聚了一下, 讨论了一下产品, 以及具体的分工。 我负责web前端和数据挖掘算法, 吴杰蔚考虑推荐算法, 18 | 周航负责爬豆瓣数据, 蔡金负责页面设计。 19 | 20 | 黑客马拉松举办的场地是在江湾体育场的创智天地, 我们早上9点开始, 到了现场, 我们抢了一个靠近门的位置, 没有理会现场的举办方, 直接开工了。 21 | 22 | 我把网站的架子弄起来(rails), 我们在如何让ubuntu默认安装的mysql可以让其他机器访问到这点上花费了比较多的时间, 然后上午的时间就结束了。 23 | 24 | 中午在现场吃饭, 也是社交的时间, 到处找人聊天, 以及认识新朋友。 平时很少有机会聊的一些话题。 25 | 26 | 下午的时候, 我遇到了技术问题: 基本上的时间都花费在了如何让豆瓣用户登录这一块上面。 我本来采用的是 `omniauth-douban `_ , 花费了大量时间, 流程还是没有走通顺, 后来换了道哥的 `douban-ruby `_ , 看懂了豆瓣oauth的逻辑, 总算实现了登录和替用户发豆邮的功能。 周航这边导数据也遇到了一些问题, 不过总算都搞定了。 27 | 28 | 开发期间, 抽空去看了一下其他团队。 团队采用的技术区别还是比较大, 29 | ruby, python, java, node.js, objective-C, 还有一组是用.net的, 现场学习新的技术。。 30 | 采用的开发工具也百花齐放, eclipse, Xcode, emacs, vim, sublime, textmate... 31 | 如果是非技术的人过来, 看大家的电脑屏幕, 是搞不清楚大家在做什么的。 32 | 33 | 就做的东西而言, 大多数还是以做产品为导向, 有做团购搜索的, 有做青年旅社查找应用的, 有做平台的, 都是大东西啊。 34 | 让我眼前一亮的只有一个: 基于js+webgl的3D小游戏。 引擎是组里面一个做游戏的牛人现场写的。 我觉得这个产品算是最符合黑客精神的了。 35 | 36 | 晚上我的精力不足, 效率低下, 不过把网站的整体流程跑出来了。 10点钟我们离开场地回去, 我和蔡金整理好UI, 然后我把整体流程跑顺, 处理bug, 我弄到了4点才去睡觉。 不过, 产品的完成度总算是能够应付第二天的展示了。 37 | 38 | 第二天7点半我起床, 和蔡金一起去场地。 这一天都是展示日, 没有我什么事情, 就在下面休息。 39 | 最后的结果是, 我们的产品得到了三等奖, 应该算是理所应当的吧。 第一名是Chop, 一个聊天的产品。 40 | 41 | .. image:: http://image20.it168.com/201205_500x375/1041/349bd5185b1d5905.jpg 42 | :align: center 43 | 44 | 45 | 小结 46 | -------------------- 47 | 就开发而言。 我觉得有些可以总结的: 48 | 49 | - Hackathon活动一天都应该处于一个集中精神做事情的状态, 我前一天没有休息好, 造成这一天精力不充沛, 时间效率不高。 50 | - 为了更好的产能, 可以做的是提前把技术细节都准备好, 现场做的只是拼装, 但是我觉得这样就太作弊了, 不算是好的行为。 毕竟现场搞定问题才是意义所在。 51 | - 开发的时候, 因为分工做好了, 沟通链减少很多, 基本上都在全力开发中。 52 | - 一天的时间非常紧张, 项目计划需要弄好。 我们还是错误预估了工作量, 预期要做的根据喜好推荐用户的功能没有做出来, 只能通过部分的随机来模拟一个效果。如果还有下次的活动, 一定要考虑清楚工作量。 53 | - 成功的很大因素靠产品设计, 在这点上面蔡金考虑产品考虑得很好。 直截了当地解决问题。 54 | 55 | 然后就是本次活动: 56 | 57 | - 黑客精神应该是用技术的方式巧妙解决问题。 参与者做的大都是产品导向, 解决问题的方式也不是很开创性质的。 只能算是做出来一个东西吧。 58 | - 奇怪的评委, VC或者公司大员, 有人还提问“你们的盈利模式是什么”(我把这个当成一个笑话来看), 如果这个活动是以产品开发为主题还差不多。 但是不符合“黑客马拉松”的气氛。 59 | - 和硅谷双线举办的效果不好, 基本上是双方分开做自己的事情。 这样就没有太多的意义了。 60 | - 我觉得应该得到第一名的那个3D游戏连第二轮都没有进入, 在这样的评委组成下, 意料以外情理之中。 61 | 62 | 我觉得让开发者们时不时地聚在一起, 花费一天两天的时间做一个小原型的活动很有意义, 63 | 但是不应该像本次活动一样办成一个大会形式了。 如果下次还有类似的活动, 我还是会去的。 64 | 然后我会考虑做一个更有黑客精神的东西。 65 | --------------------------------------------------------------------------------