Samson's Blog

  • Home

  • About

  • Archives

Felix's Node.js Style Guide (Part 1)

Posted on 2011-10-27 | Edited on 2018-11-29 | In Node.js , Share , Technique
Symbols count in article: 2.8k | Reading time ≈ 5 mins.

本文为译文,翻译自原文 http://nodeguide.com/style.html 标题咱就不翻了吧,说实话guide这个词还真不好翻,不能显得很高深又不能显得很for dummy的样子,索性就不翻了…… 本guide应该较上篇略有意思,作者泰国海滩度假的时候写出来的东西想来也不会多么干巴巴(海滩不是到处都是水吗……),当然本文所涉及的编程风格之类的选择应该完全是作者自己的opinion,不代表我台观点。 ============================== 我是分割线 ============================== 本文不是node.js应用程序所应该遵循风格的官方文档。本guide只是试图带给你一整套instructions,虽说本人有点固执己见,但这套东西确实能让你创建美观且统一的软件。 本guide假设你只针对node.js。如果你的代码需要在浏览器或者其它环境里面运行,请勇敢的忽略其中一些部分。 另外请注意node.js和围绕node的其它很多package都有其自身略显不同的风格,所以如果你对那些项目感兴趣,请遵守他们那边的规则。(别到时被砍……译者注)

Tabs vs Spaces

让我们先从宗教式的信仰问题开始。我们仁慈的独裁者在node的核心代码里选择了用2个空格来缩进,所以跟着他是不会有错的。

分号

有很多非暴力不合作反抗分子试图偷走你的分号。不过不要犯傻,我们的传统美德还是有它存在的道理的,且确实存在的好好的。所以跟随社区,使用分号!

编辑器

你可以使用任何编辑器。不过如果有JS语法高亮并能用node.js执行当然正打开的文件的功能的话则会比较顺手。诚然vim可能不会给女生们留下深刻印象,但我们的BDFL却会很愉快,且你的爷爷(不是你爷爷的……译者注)也不会有什么意见。 这份文档是在我的iPad上的Notes程序里面打出来的,那是因为我那时正在泰国的某个海滩边上。所以你的工作环境很有可能也会影响到你的编辑器选择。(我知道你不就是想告诉我们你到泰国海滨度假了嘛,怎么跟我国很多mm一副德行…… 译者注)

结尾的空白字符

就像每顿饭之后要刷牙一样,你也会在每次提交你的JavaScript文件之前清理掉你的行末空白字符。否则这种粗心大意的疏漏使代码所散发出的某种异味会最终把你潜在的contributors和同事吓跑。

每行长度

每行限制在80个字符。是的我知道,和过去几年比,如今我们的屏幕已经大了好多,但是你的大脑可没有。屏幕其余空白的地方可以用来进行分列显示,你的编辑器应该支持分割screen的,对吧?(TextMate好像不支持,ft…… 译者怨念中……)

引号

除非你在写JOSN,不然请使用单引号。 正确: [cc lang=”javascript”] var foo = ‘bar’; [/cc] 错误: [cc lang=”javascript”] var foo = “bar”; [/cc]

大括号

你的前大括号应该放在和前面最近的那句语句的同一行上。 正确: [cc lang=”javascript”] if (true) { console.log(‘winning’); } [/cc] 错误: [cc lang=”javascript”] if (true) { console.log(‘losing’); } [/cc] 同时请留意一下,上面条件语句的前后都留有空格。

变量声明

每句var语句定义一个变量,这样会便于之后各行的重新排序。不一定非要把var定义在函数的最上面,Crockford那里曾强调过这点,但我们这里可以忽略,你觉得变量定义在哪里更说的通就定义在哪里。 正确: [cc lang=”javascript”] var keys = [‘foo’, ‘bar’]; var values = [23, 42]; var object = {}; while (items.length) { var key = keys.pop(); object[key] = values.pop(); } [/cc] 错误: [cc lang=”javascript”] var keys = [‘foo’, ‘bar’], values = [23, 42], object = {}, key; while (items.length) { key = keys.pop(); object[key] = values.pop(); } [/cc]

变量名和属性名

变量和属性名应该使用小驼峰式命名法(就是新单词的首个字母要大写,其余均小写,详见wiki,译者注)。它们还得有描述性。通常需要避免使用单个字符的变量或者不常用的缩写来作为变量或者属性名。 正确: [cc lang=”javascript”] var adminUser = db.query(‘SELECT FROM users …’); [/cc] 错误: [cc lang=”javascript”] var admin_user = d.query(‘SELECT FROM users …’); [/cc]

类名

类名应该使用大驼峰式命名法。 正确: [cc lang=”javascript”] function BankAccount() { } [/cc] 错误: [cc lang=”javascript”] function bank_Account() { } [/cc]

常量

常量应该被定义为普通变量或者静态的类属性,且应该全部采用大写字母。 Node.js / V8 实际上支持mozilla的const扩展,但是不幸的是这并不能应用到类的成员变量上(译者水平太搓,本句翻译着实有待考证,所以同时附上英文原文,待译者有空去查阅下mozilla的const extension究竟是啥么东东再做分解……),况且这也不是ECMA标准的一部分。 Node.js / V8 actually supports mozilla’s const extension, but unfortunately that cannot be applied to class members, nor is it part of any ECMA standard. 正确: [cc lang=”javascript”] var SECOND = 1 1000; function File() { } File.FULL_PERMISSIONS = 0777; [/cc] 错误: [cc lang=”javascript”] const SECOND = 1 1000; function File() { } File.fullPermissions = 0777; [/cc] 未完待续……

Felix的Node.js初学者入门指南

Posted on 2011-10-26 | Edited on 2018-11-29 | In Node.js , Share , Technique
Symbols count in article: 7k | Reading time ≈ 12 mins.

本文为译文,翻译自原文 http://nodeguide.com/beginner.html 网上有很多关于node.js的资料,但鉴于其快速的开发进度,初学者可能会很难找到比较好且最新的入门资料。本文就是在力求提供这份资料,并且力求时刻和最新的node.js稳定版本保持同步。 本guide已经针对node 0.4.x的最新改动做过更新,node 0.4.x也是当前node的稳定分支。

学习JavaScript

本guide假设你已经对JavaScript有所熟悉。如果你不是很熟悉,你可以去读读:Marijn Haverbeke写的Eloquent JavaScript,它可以在网上免费阅读。

Hello World Tutorial ((这个我就不翻了吧。。。))

本tutorial会指导你如何安装node.js,其中包括构建一个简单的所谓“hello world”的http服务器。

安装

首先:当前为了使用node.js,你还得有一台运行着*nix操作系统的电脑。虽然推荐使用Linux和OSX,但想在FreeBSD或cygwin(windows上)上跑node.js应该也不是什么不可能的事情。目前,一个完整的windows版本的nodejs移植正在如火如荼的进行之中,只是还尚未到可以公开给public使用的程度。 常见的安装node.js的方法是从源代码直接编译。不同的包管理系统,催生出目前所存在的很多种不同的安装包,由于它们各自的更新频率又各有不同,我还是推荐从源代码安装。 你可以在nodejs.org获得最新的源代码。使用下面的命令可以下载并安装v0.4.4版本的node.js。 [cc lang=”bash”] $ wget http://nodejs.org/dist/node-v0.4.4.tar.gz $ tar -xzf node-v0.4.4.tar.gz $ cd node-v0.4.4.tar.gz $ ./configure $ sudo make install [/cc] Node.js本身除了依赖一些常用的构建工具(依赖python是因为构建系统本身需要)并没有别的更多的外部依赖。在OSX上,需要先安装Xcode才能确保安装成功,在Ubuntu上你则可能需要运行: [cc lang=”bash”] $ apt-get -y install build-essential [/cc]

交互式的node.js shell

如果一切正常,你应该可以像下面这样开始调用交互式的node.js shell了: [cc lang=”bash”] $ node > console.log(‘Hello World’); Hello World [/cc] 这个交互式的shell(也被称为REPL)不仅是个可以测试简单如一行的代码的好地方,也可以被直接嵌入到你的node.js应用程序里面。如果想退出,只要按下Ctrl + C即可。 这个REPL还自带了很多非常好的功能,比如最重要的tab补全功能。

你的第一个程序

简单的说,编写一个node.js程序就是创建一个以’.js’扩展名结尾的文件。比如你可以用下面的内容创建一个简单的’hello_world.js’文件: [cc lang=”javascript”] console.log(‘Hello World’); [/cc] 保存文件后,你可以像下面这样在终端里面执行它: [cc lang=”bash”] $ node hello.js Hello World [/cc]

“hello world” http服务器

只在终端里面打印hello world并没有那么振奋人心,让我们更进一步来编写一个通过http协议来返回’hello world’的程序。我们把这个程序命名为’hello_http.js’,这个文件包含以下的内容: [cc lang=”javascript”] var http = require(‘http’); var server = http.createServer(function(req, res) { res.writeHead(200); res.end(‘Hello Http’); }); server.listen(8080); [/cc] 现在让我们来运行它,在终端里面敲入: [cc lang=”bash”] $ node hello_http.js [/cc] 首先注意到的是,不同于我们的第一个程序,这个程序不会马上退出。这是因为node程序会一直运行,直到它确认不再会有更多的事件发生后才会退出。就我们这个case来讲,那个一直开放着的http服务器就可以源源不断的产生事件,以保持程序继续运行。 测试这个服务器非常简单,只要打开一个新的浏览器tab,访问:http://localhost:8080/ 即可。事遂人愿,你应该可以在浏览器页面上看到那个包含字符串’Hello Http’的服务器应答。 或者,你也可以尝试在终端里面使用curl来测试你的服务器: [cc lang=”bash”] $ curl localhost:8080 Hello Http [/cc] 下面让我们来深入看看我们的这个小程序里面所包含的各个步骤。在第一行,我们include了http核心模块,并把它赋值给了一个叫做http的变量。在后面的section,我们还会提到更多有关模块系统的信息。 然后我们定义了一个变量server,并把http.createServer的返回值赋给它。传给http.createServer的参数是个闭包,每当有新的http请求过来的时候,这个闭包都会被调用。 最后我们调用server.listen(8080),以告诉node.js我们想让我们的服务器监听在哪个端口。如果想监听80端口,你的程序需要以root权限来运行。 现在你在浏览器里面访问’localhost:8080’,那个connection闭包就会被调用,调用的同时系统还会传入一个req和一个res对象。这个req对象是个可读的流,每当有部分数据从客服端过来的时候,它便会产生一个’data’事件(就像表单提交或者文件上传)。res对象则是个可写的流,被用来向客户端发回数据。在上面那个例子里,我们只是简单的返回了200 OK的header以及’Hello Http’的body内容。

模块系统

node.js提供了一个简单的模块系统,以便于我们组织程序,把各部分功能分开放到不同的文件里面。 让我们创建一个叫’main.js’的文件以示说明,文件内容如下: [cc lang=”javascript”] var hello = require(‘./hello’); hello.world(); [/cc] 你可能已经猜到,那句require(‘./hello’)便是用来加载其它JavaScript文件的内容的。开头的’./‘表示这个将要被加载的文件就在’main.js’所在的目录下面。另外值得注意的是,我们并不需要提供文件扩展名,因为’.js’就是默认的后缀。 接下来让我们来创建这个将被加载的’hello.js’文件,内容如下: [cc lang=”javascript”] exports.world = function() { console.log(‘Hello World’); } [/cc] 这儿值得注意的是,我们给一个叫做’exports’的对象赋上了一个叫’world’的属性。这样的一个’exports’对象在各个模块里面都存在,每当调用require函数来include一个模块时,这个’exports’对象就会被当作返回值返回。如果我们现在运行’main.js’,应该会看到意料中的输出: [cc lang=”bash”] $ node main.js Hello World [/cc] 有一点值得提一下,现在很多的node用户都喜欢像下面这样直接修改覆盖exports对象: [cc lang=”javascript”] module.exports = function() { // … } [/cc] 如你所料,这样的改写会使require调用直接返回上面所赋值的function。这在你使用面向对象编程时变的非常有用,因为每个文件的exports便是那个类的构造函数。 接下了你需要知道的是,如果require调用里面不包含所include文件是相对地址的暗示时,模块系统又是怎么处理的。比如: [cc lang=”javascript”] var http = require(‘http’); [/cc] 在这种情况下,node.js会首先查看一下是不是有一个叫作http的核心模块存在,如果存在(http核心模块确实存在)便直接返回。但是如果不存在这样的核心模块呢,比如说’mysql’? [cc lang=”javascript”] var mysql = require(‘mysql’); [/cc] 这种情况下,node.js会遍历这个目录树,从里到外依次遍历各个父目录,检查是否有个叫’node_modules’的目录存在。如果找到这样命名的目录,node.js便会在这个目录下查找一个叫’mysql.js’的文件。如果很不幸没有找到,并且已经遍历到达根目录’/‘,node.js只能放弃并抛出异常。 当前,除了各级父目录,node.js查找模块文件的时候还会遍历另外一个目录列表里存放的所有目录,这个目录列表可以通过require.paths访问和修改。然而,关于要不要移除这个功能,目前正有着激烈的讨论,所以你可能最好还是忽略它比较好。 最后但也同样重要的是,node.js也支持你创建一个叫’index.js’的文件,以作为一个目录的主include文件。也就是说,如果你调用require(‘./foo’),’foo.js’文件和foo目录下的index.js文件’foo/index.js’都会被检索到,在不是相对路径的include调用里也是如此。

使用EventEmitters

Node.js以一个叫EventEmitter的类实现了观察者模式。每当有对象会发出或产生出着各种不同事件的时候,node.js经常让这些对象背后的类继承EventEmitter。 使用EventEmitter还是相当直观的。你可以通过调用对象的’on()’函数来监听某个特定事件,’on()’函数需要你提供这个事件的名字,以及一个回调的闭包以作为参数。比如: [cc lang=”javascript”] var data = ‘’; req .on(‘data’, function(chunk) { data += chunk; }) .on(‘end’, function() { console.log(‘POST data: %s’, data); }) [/cc] 如你所见,on()函数会同时返回自己所属的对象的引用,这可以方便你把很多这样的事件监听调用串联起来而不是写多行调用。(和jquery一样,译者注……) 如果你只是想在第一次事件发生时有所动作,你还可以使用once()函数。 最后,通过调用removeListener函数,你还可以移除某个事件监听者。请注意这个函数的参数是你正想要移除的回调函数的引用,而不是这个事件的名字: [cc lang=”javascript”] var onData = function(chunk) { console.log(chunk); req.removeListener(onData); } req.on(‘data’, onData); [/cc] 上面的例子本质上和once()函数是相同的。

下一步

现在你已经知道了node.js的基础,你可能最好开始自己写一些小的程序。node的api文档是个开始的好地方,它可以被用来作为你灵感的源泉。

调试node.js程序

有很多种方法可以用来调试node.js应用程序。我个人崇尚越少的调试越好,所以我严格的遵循测试驱动开发的建议。 不过话说回来,如果在现有已经存在的应用程序里面定位调试某个很tricky的bug的时候,还是有一些方法可以帮到你的。

使用console.log()

理解一个问题最简单粗暴的办法就是使用console.log()来查看这个对象。你可以直接将这个对象作为参数传入: [cc lang=”javascript”] var foo = {bar: ‘foobar’}; console.log(foo); [/cc] 也可以使用类似sprintf()的的格式化方法来格式化debug输出: [cc lang=”javascript”] var foo = {bar: ‘foobar’}; console.log(‘Hello %s, this is my object: %j’, ‘World’, foo); [/cc]

使用node的debugger

如果你不是很喜欢console.log()(觉得它太简单粗暴,译者注……译者怎么这么烦……),或者你觉得你的问题使用断点调试会更有助于你分析时,node自带的debugger是个很好的选择。调用这个debugger只需要: [cc lang=”bash”] $ node.js debug my_file.js [/cc] 还在编辑中,请稍后再来……(广告很短,请不要离开……)

使用WebKit Inspector

还在编辑中,请稍后再来……(这就是译文啊,大哥,我容易么我……)

框架

如果你只是刚刚接触node.js,到了需要解析POST请求,处理url路由或者页面渲染的时候你可能并不想再重造轮子。如果是这样的话,你可能会考虑使用一些比较流行的web框架。这个section会对这些流行的选择做一个简单的概述,并且附上我的看法。

Express

当前,express可能是很多node.js开发人员的不二选择。它相对成熟,而且包括了connect(联想一下rack)中间件。这个框架自带了url路由,配置选项,模板引擎,POST请求解析和其它很多功能。 虽说express是个可靠的框架,但相对于Rails,CakePHP或者Django来说,它目前的规模还是相对较小。从这点来看它更接近于Sinatra,不走运的是,它似乎并没有花很大的力气来以区别于它的Ruby前辈们所做的事情,所以在JavaScript里面使用的时候还是让人感觉不是十分自然。当然不管怎么,目前除了重造轮子编写你自己的框架以外,它绝对是个很好的选择。

fab.js

你觉得你懂JavaScript?再想想。最初受到jQuery的串式调用的启发,fabs.js走了一条非常不同寻常的路(美特斯邦威啊。。译者注),它对JavaScript所做的各做扭曲改动甚至超出了很多人可以理解的范围。每个函数会返回另外一个函数,完全免去了方法或者函数名称的必要性,这种做法的产物便是各种感官上都很像lisp的代码。 目前我并不认为fab.js完全适用于生产环境,当然如果你还在探索node.js的世界中,你绝对应该尝试哪怕一次。不说别的,fab.js至少展示了在web框架领域,JavaScript不一定非要复制Ruby,Python和PHP,它完全可以有它自己独特的路线。(那就是美特斯邦威……译者那啥……)

主机托管和部署

快速简单部署

如果你只是刚开始编写node.js应用,并且你想尽快让它娘的跑起来,可以这样做: 1. 将你的程序copy到要准备部署的服务器。如果你使用git,这可能仅仅就是从另外一台服务器或者像GitHub这样的服务那里clone一个repository。 2. 假设你的项目中包含一个叫’server.js’的文件,进入包含这个文件的目录,并输入: [cc lang=”bash”] $ screen $ node server.js [/cc] 这会在一个所谓的screen会话中启动你的’server.js’程序。Screen可以让你的shell拥有保持当前状态的功能,即便你退出了那个你用来登陆服务器的终端,这种状态仍旧会被保持。 所以你可以安全的关闭你的终端程序,而你的’server.js’则会继续运行。如果想继续监控其运行状态,你可以重新登陆服务器,输入: [cc lang=”bash”] $ screen -r [/cc] 这会重新让你回到那个一直在背后运行你的程序的shell终端上。 当然,这个方法只被推荐用来进行试验性质的部署。如果你的node应用在某个时刻突然崩溃,screen是不会试图去重启它的,所以不要试图用这个方法在生产环境上部署应用。

Joyent no.de

还在编辑中,请稍后再来……(幸亏人家还在编辑中,不然偶要挂掉了……)

SQL调优和SQL优化

Posted on 2011-10-24 | Edited on 2018-11-29 | In Share , SQL , Technique , Tips
Symbols count in article: 4.1k | Reading time ≈ 7 mins.

本文为译文 ((翻译的主要目的在于强化记忆和加深理解)),翻译自原文 http://beginner-sql-tutorial.com/sql-query-tuning.htm sql语句可以用来从数据库取回数据。不同的sql查询语句有时可以得到相同的返回结果。如果考虑执行效率的话,选择使用最佳的查询语句至关重要,所以我们需要根据需求来优化sql查询。下面是一些我们平时经常使用的查询语句,以及如何优化它们以达到更好的执行效率。 SQL调优/SQL优化技巧: 1) 如果在SELECT语句里面用具体的column名而不是’*’,sql查询会更快。 例如,查询语句写成: [cc lang=”sql”]SELECT id, first_name, last_name, age, subject FROM student_details;[/cc] 比写成下面这样快: [cc lang=”sql”]SELECT FROM student_details; [/cc] 2) HAVING字句是用来进一步过滤SELECT查询结果的,它就像一个过滤器。别把HAVING用作其它任何用途。 例如,写成: [cc lang=”sql”] SELECT subject, count(subject) FROM student_details WHERE subject != ‘Science’ AND subject != ‘Maths’ GROUP BY subject; [/cc] 而不是: [cc lang=”sql”] SELECT subject, count(subject) FROM student_details GROUP BY subject HAVING subject!= ‘Vancouver’ AND subject!= ‘Toronto’; [/cc] 3) 有时候在主查询语句里面可能包含不止一个子查询语句。尽量减少子查询语句的数量有助于提高效率。 例如,写成: [cc lang=”sql”] SELECT name FROM employee WHERE (salary, age ) = (SELECT MAX (salary), MAX (age) FROM employee_details) AND dept = ‘Electronics’; [/cc] 而不是: [cc lang=”sql”] SELECT name FROM employee WHERE salary = (SELECT MAX(salary) FROM employee_details) AND age = (SELECT MAX(age) FROM employee_details) AND emp_dept = ‘Electronics’; [/cc] 4) 恰当的使用EXISTS,IN和table joins。 a) IN通常效率最低 b) 当大多数过滤条件存在在子查询语句里面的时候,IN效率更高 c) 当大多数过滤条件存在在主查询语句的时候,EXISTS效率更高 例如,写成: [cc lang=”sql”] Select from product p where EXISTS (select from order_items o where o.product_id = p.product_id) [/cc] 而不是: [cc lang=”sql”] Select from product p where product_id IN (select product_id from order_items [/cc] 5) 当join的两个表包含一对多关系时,优先使用EXISTS而不是DISTINCT。 例如,写成: [cc lang=”sql”] SELECT d.dept_id, d.dept FROM dept d WHERE EXISTS ( SELECT ‘X’ FROM employee e WHERE e.dept = d.dept); [/cc] 而不是: [cc lang=”sql”] SELECT DISTINCT d.dept_id, d.dept FROM dept d,employee e WHERE e.dept = e.dept; [/cc] 6) 尝试使用UNION ALL来替换UNION。 例如,写成: [cc lang=”sql”] SELECT id, first_name FROM student_details_class10 UNION ALL SELECT id, first_name FROM sports_team; [/cc] 而不是: [cc lang=”sql”] SELECT id, first_name, subject FROM student_details_class10 UNION SELECT id, first_name FROM sports_team; [/cc] 7) 当在WHERE子句里面使用条件判断时,要小心。 例如,写成: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE age > 10; [/cc] 而不是: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE age != 10; [/cc] 写成: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE first_name LIKE ‘Chan%’; [/cc] 而不是: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE SUBSTR(first_name,1,3) = ‘Cha’; [/cc] 写成: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE first_name LIKE NVL ( :name, ‘%’); [/cc] 而不是: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE first_name = NVL ( :name, first_name); [/cc] 写成: [cc lang=”sql”] SELECT product_id, product_name FROM product WHERE unit_price BETWEEN MAX(unit_price) and MIN(unit_price) [/cc] 而不是: [cc lang=”sql”] SELECT product_id, product_name FROM product WHERE unit_price >= MAX(unit_price) and unit_price <= MIN(unit_price) [/cc] 写成: [cc lang=”sql”] SELECT id, name, salary FROM employee WHERE dept = ‘Electronics’ AND location = ‘Bangalore’; [/cc] 而不是: [cc lang=”sql”] SELECT id, name, salary FROM employee WHERE dept || location= ‘ElectronicsBangalore’; [/cc] 把非column表达式放在查询语句的一边,因为它们会被优先处理。 写成: [cc lang=”sql”] SELECT id, name, salary FROM employee WHERE salary < 25000; [/cc] 而不是: [cc lang=”sql”] SELECT id, name, salary FROM employee WHERE salary + 10000 < 35000; [/cc] 写成: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE age > 10; [/cc] 而不是: [cc lang=”sql”] SELECT id, first_name, age FROM student_details WHERE age NOT = 10; [/cc] 8) 使用DECODE来避免重复扫描同一条数据或重复join同一张表。DECODE也可以用来替换GROUP BY或ORDER BY子句。 例如,写成: [cc lang=”sql”] SELECT id FROM employee WHERE name LIKE ‘Ramesh%’ and location = ‘Bangalore’; [/cc] 而不是: [cc lang=”sql”] SELECT DECODE(location,’Bangalore’,id,NULL) id FROM employee WHERE name LIKE ‘Ramesh%’; [/cc] 9) 存储大二进制数据,首先将其存储在文件系统上,然后将其文件路径存储到数据库。 10) 遵守SQL标准规则。 a) 对所有的SQL动词使用同一种大小写 b) 所有的SQL动词放在新一行的开头 c) 所有的单词用一个空格分隔 d) 所有的SQL动词左对齐或右对齐首个SQL动词

XXX != 3X

Posted on 2011-10-19 | Edited on 2018-11-29 | In Minds , Share
Symbols count in article: 255 | Reading time ≈ 1 mins.

我记得去年还是前年什么时候广电总局开始禁止媒体使用XXX等外语缩略词,但似乎这几年还是频繁听到CPI,GDP等不得不逃避的敏感词,要不是美职篮停摆,估计NBA还是到处可见。 当然本文不是来讨论这个的…… 本文只是为了列举加收集本人没事断章取义望文生义出来的缩略词另解 ((皆原创)),并且会持续更新。 VPN = Very Poor Network SSD = Super Stupid Disk NBA = National BadAss SSO = Super Stupid Opinion TBD ……

Update 61: 搞艺术是为了搞姑娘

Posted on 2011-10-19 | Edited on 2018-11-29 | In Life , Share
Symbols count in article: 533 | Reading time ≈ 1 mins.

1. 我记得老罗说过,在他热爱妇女的一生中,每一次人生取得阶段性进步,动力基本上都是来自妇女。由此看来,搞艺术就是为了搞姑娘也无可厚非,搞什么又不是为了搞姑娘呢,不要把你想的那么崇高;当然了,搞姑娘本身也没有那么不崇高,人家本来是个中性词,却早被一小撮不明真相别有用心的人给强加赋予了太多太多的贬意以占据道德制高点; 2. 说起占据道德制高点,国内C2C,B2C大哥大淘宝网不可谓不深谙此道;值得注意的是,不同于温州动车事故新浪微博成为事件宣传主要平台,这次扮演平台角色的工具变成了YY语音,也许是语音联系更迅速更能激奋人心吧,于是截至今日新浪微博依旧嫉妒的一直没有把此事件作为一个热门话题呈现; 3. 最近终于想通准备加入智能机的行列,却一直为了是转入android还是iphone而举棋不定;当然有人总结的很好,什么问题最后归根结底都是钞票问题,此话不假,囊中羞涩便是这里一切问题的root cause; 4. 现在的我已经极度缺乏自信,有些人对我的很多决定抱有异议,这些都很正常,那其实都是我慢慢丧失信心的外在表现;也许我必须搞点什么比如说搞姑娘才有可能重拾信心,xd; 5. 上帝说,要有光,于是便有了光;上帝说,要有update,于是我就update了。

天与弗取 反受其咎

Posted on 2011-09-26 | Edited on 2018-11-29 | In Life , Share
Symbols count in article: 292 | Reading time ≈ 1 mins.

天与弗取,反受其咎;时至不行,反受其殃 —— 《史记》

时不我待,终流于庸俗,鄙人也终干上了之前一直所为之不屑的放广告的勾当,这当然算不上什么出卖灵魂的事情,况且违心的事情我几乎每天都在干 ((汗一把……)),就是一大俗人,没有必要也装不了清高;生活就像被强奸,反抗不得还不如闭眼好好享受吧; 广告永远是需要包装的,聪明的你也许已经发现,上篇文章 内容空泛,言不着意,却为了隐藏那一个 hyperlink 煞费苦心;标题曾特地包含的AD两字最终亦被要求remove,估计人家还想嘲笑我难道你连AD从来不说自己是AD这样简单的道理都不懂? …… anyway,我已经开始享受了……

Why Linux?

Posted on 2011-09-24 | Edited on 2018-11-29 | In Share
Symbols count in article: 1.6k | Reading time ≈ 3 mins.

Why Linux? A lot of people know nothing at all about Linux, and there is a significant portion of the computer-using community who don’t even know of its existence. Sadly, this may be due to the fact that companies who aren’t open-source can’t afford the same marketing budgets as Apple and Microsoft. It’s a shame, because there’s a fair chance most people would switch, given the option. Yes, you heard me correctly - it is an open-source operating system, and there are more versions of it than there are versions of Windows and Mac OS and OSX put together. Linux and Unbuntu are two of the most well known, and it is customiseable to the point where if you wanted an OS custom-built for you, it’s fully possible. Open-source is also what it says on the tin - free code, which means that you’ll never pay a penny for the OS, or any of the software that works with it (unless you’re going out of the open-source bubble, which seems pointless when there are so many free alternatives that offer roughly the same features). Installing it takes not long at all, as it’s quite a small OS in terms of memory, and it’s also nowhere near as CPU intensive as Windows or Mac OSX, so whether you’re running fifty programs at once or just a Twitter client and OnlinePoker.com, everything will feel smoother and more responsive. All I can say is that if you’re running a netbook or a low spec PC, or even a powerhouse, you owe it to yourself to install it, even on a partition, and test it out. Who knows? You just might become one of the thousands, if not millions of people contributing to the most generous movement on the web - the open-source community.

Update 60: 因为所以 没有道理

Posted on 2011-09-15 | Edited on 2018-11-29 | In Life , Share
Symbols count in article: 282 | Reading time ≈ 1 mins.

1. 好久不update,9月目前都还没有一篇post,一说是为了测试 grid archives 在缺失当月post下的鲁棒性,我觉得很有道理; 2. 还有一说是要准备放广告,好歹update一下以示alive,嗯,各种在理; 3. 再有一说,那便是标题,不折腾自然亦无需解释; 4. 上面原本一个bullet可以搞定的topic已经被我人为分拆成了3个bullet,理屈词穷可见一斑,这,又是一说; 5. 这个夏天很短,大概是因为没有想象中那么燥热的缘故。目前的种种迹象都预示或验证着一个多事之秋的来临,也许真的是秋天来的太顺利了; 6. 不说了,废话太多。

StarCraft II配不在高可玩就行

Posted on 2011-08-16 | Edited on 2018-11-29 | In Life , Share
Symbols count in article: 166 | Reading time ≈ 1 mins.

山不在高,有仙则名 水不在深,有龙则灵 —— 唐·刘禹锡《陋室铭》

鄙人以及鄙人的爱机(在他们看来则是陋机)已经被到处各种无数次的鄙视过了,但是…… but…… 阿Q就是这么诞生的: 参照这里优化,除了模型和影片,其它都比较无限趋向于杯具(一个极限函数); 但是…… but…… 南阳诸葛庐,西蜀子云亭; 孔子云,何陋之有?

Python NameError: name 'readline' is not defined

Posted on 2011-08-16 | Edited on 2018-11-29 | In Python , Share , Technique , Tips
Symbols count in article: 1.8k | Reading time ≈ 3 mins.

Python 2.6.×已经装了有一定时日了,已经完全不知道python的世界都更新到什么境界了;标题这个issue在我更新到Lion之前就已经存在了,所以这不能算是Lion里才introduce的issue,这个还是得有一句说一句; 之前我在Snow Leopard一直没有找到fix的办法,当然主要的原因还在于我也没有那么急切的想fix它,至少对于一个几个月都基本不碰python的家伙而言,它的急迫性显然没有解决starcraft2破解版一联机就自动更新不能玩这个issue来的高,xd:) BTW, 我只玩战役模式,Blizzard及其各路partner已经完全将starcraft2的对战模式变成网游,虽然我很想支持暴雪买正版,但是网游的各种消耗对我来说是无法容忍的. 貌似又有跑题的趋势…… anyway…… 这个issue就是下面这样的,注意倒数第二行: [cc lang=”bash”] ~ ➔ python Python 2.6.6 (r266:84292, Sep 13 2010, 20:53:06) [GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin Type “help”, “copyright”, “credits” or “license” for more information. Module readline not available. Traceback (most recent call last): File “/Users/samson/.pythonrc”, line 22, in readline.read_history_file(historyPath) NameError: name ‘readline’ is not defined >>> [/cc] 主要的原因在于我起来的python cli会去读我home目录下.pythonrc ((这个在环境变量$PYTHONSTARTUP里面设置)),.pythonrc的前面几行则会试图去load readline或rlcompleter: [cc lang=”python”] try: import readline except ImportError: print(“Module readline not available.”) else: import rlcompleter readline.parse_and_bind(“tab: complete”) [/cc] 而诡异的是我明明装了readline,还装了两个(当然active的只有一个),这个python却始终很傻的说找不到: [cc lang=”bash”] ~ ➔ port installed | grep readline readline @6.1.000_1+darwin readline @6.1.002_0 (active) [/cc] 我曾试图upgrade python,但是问题仍旧存在,当然真相永远只有一个…… 不废话也不卖关子,最后的解决办法非常吐血,不是upgrade python也不是去装py-readline,而是再install一遍readline (当然最后turns out readline也升级了): [cc lang=”bash”] ~ ➔ sudo port install readline [/cc] [cc lang=”bash”] ~ ➔ port installed | grep readline readline @6.1.000_1+darwin readline @6.1.002_0 readline @6.2.000_0 (active) [/cc] problem solved: [cc lang=”bash”] ~ ➔ python Python 2.6.6 (r266:84292, Sep 13 2010, 20:53:06) [GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin Type “help”, “copyright”, “credits” or “license” for more information. >>> [/cc]

1…101112…35
Samson Wu

Samson Wu

天与弗取,反受其咎;时至不行,反受其殃

347 posts
148 categories
140 tags
GitHub
Creative Commons
Links
  • Portfolio
  • Resume
© 2007 – 2018 Samson Wu | 309k | 8:35
0%