Friday, December 4, 2009

移动不小心解压出来的大量文件

某次,
下载到一个 .tar.bz2 文件,
直接 tar -jxf abc.tar.bz2

忽然发现目录下一下子多了很多很多文件,几百个。
不禁犯愁。最后解决如下:

$ mkdir _abc
$ mv $(tar -jtf abc.tar.bz2) _abc/

说明:
tar -jtf abc.tar.bz2 列出压缩包里面的所有文件,也就是刚才解压出来的文件列表,把这个列表传给 mv ,那这些文件就转移了。
:)

Tuesday, November 17, 2009

linux 下获取本机ip

获取本机 ip:

ifconfig |egrep -o 'inet addr:[0-9.]+'|egrep -o '[0-9.]+'


发现用 linux 越多,越来越多的知识点都糅合起来,
越来越得心应手~。

传统很强大,很好。

勤奋。。。。。。。

Tuesday, November 10, 2009

这个需求好变态

ps -eo pid,args,rss|grep apache|grep -v grep|awk '{print $3}'|perl -e
'$s = 0;while (<>){chomp;$s += $_;}print $s;'


作用:
计算 apache 总共用了多少内存,
单位是 kb。

Saturday, October 31, 2009

信用卡销卡风波

几个月前的某天:

有张某银行的信用卡,因为很久不用,偶然有个短信告诉我扣了100块的年费。
愤愤然,就打算给销了。

咨询以后得知只能电话操作,我就一个电话过去。

需要输入身份证和密码(电话操作的密码,不是取款密码),然后等待数分钟,有人接听。

R 您好,请问有什么能为你服务的?
L 我想销一张信用卡。
R 请问您为什么想销卡呢?
L 不想要了。
R ... 对信用卡的功能,作用,积分一顿猛说 ...
L 我不想要了,想销卡。
R 好的,为了验证您的身份,需要您回答一些办卡时的信息。
L 好。
R 请问您当时填写的家庭住址是哪里?
L 是 XX 吧?
R 不是。请问您当时填写的公司名称是什么?
L 是 XX 吧?(因为我也不记得了,这烂记性)
R 那您当时留的办公电话是?
L 抱歉啊,这个我不记得了。
R 好的,X先生,您的答案不能匹配我们的记录,很抱歉我不能为您办理销卡业务。
L 如果我挂失,需要这些信息么?我确实不记得那些信息了。
R 挂失是可以的。
L 挂失了还有年费么?
R 有的。
L 好吧。

挂断电话...
纠结........


今天:

前几天用那张信用卡取了2000块钱,
今天周末,打算还钱去。顺带一想,是不是可以把卡给销了。
遂找了附近的银行营业厅,里面有个不用拨号的电话,拿起来就打。

R 您好,请问有什么能为你服务的?
L 我想销一张信用卡。
R 请问您为什么想销卡呢?
L 不想要了。
R ... 对信用卡的功能,作用,积分一顿猛说 ...
L 我不想要了,想销卡。
R 好的,请问您想销的卡号后4位是什么?
L 2张都想销。
R 请您报一下卡号后4位好么?
L xxxx。另外一张没收到。(其实,另外一张是银行发短信说再办信卡有什么什么活动,我一想是不是可以借此机会证明我是卡片持有人,就答应办了,不过因为我没有修改账单地址,他给寄到以前的地址去了,我确实没收到)
R 好的,X先生,您好,我查询了一下您的账户,发现里面有未还款项,您必须结清里面的款项以后才可以办理销卡业务。
L 我不还是因为我之前打电话销卡,因为记不清我当时留的用户信息,所以不让我销,我不还款可以证明这张卡是我的,是否有营业厅可以还款,同时让我销掉这张卡?
R 您可以去信用卡办理中心,不过那里只提供身份证明,然后需要提交到我们信用卡客户管理中心,然后再处理您的销卡业务,整个流程下来需要10几个工作日。
L 需要这么久?
R 是的。
L 如果我一直不还卡里的钱会怎样?
R 到时候我们会有人上门收钱。
L 那我可不可以跟着收钱的人一起回去,还钱并且销卡?
R 不可以的,收钱的人是我们委托的。
L 我现在拿着这张卡,可以刷卡,取现,还钱,结果你说不能确认我的身份,不让我销卡,销卡必须确认我的开卡信息,我就是不记得了怎么办?
R 这个我也没有办法。
L (翻卡片发现10年3月就到期了) 那这张卡片到期以后我是不是就不用交年费了?
R 卡片到期后会自动续新卡,除非用户明确拒绝。
L 我要是没有那些信息呢?
R 那就没办法了。
L 要销卡是不是必须还清卡里的钱?
R 是的。
L 好吧,我知道了。再见。

挂了电话,我去了隔壁的自动存款机上把钱都还了。
我认栽。纠结的不行........

再会电话旁,打算用穷举法,去回答当时开卡时候的信息。
拨通以后又是输入身份证号和密码,然后有人听了,这次是个男的,前2次都是女的。

R 您好,请问有什么能为你服务的?
L 我想销一张信用卡。
R 好的,销卡以后您卡里的积分都没了。
L 我知道,我要销卡。
R 您要销哪张卡呢?
L 2张都要销。
R 好的。您卡里还有16元的余额...
L 我知道,不要了,我要销卡。
R 好的,请问您是否要保留您的用户信息呢?
L 有什么用?
R 您下次申请信用卡时验证会快一些。
L 谢谢,不用了,下次申请我再填。
R 好的。
... 同时,手机上来了2条短信,说我的2张信用卡已经停用。
L 我收到短信说信用卡停用,停用就是销卡么?
R 是的。
L 是以后就没有年费了?
R 是的。
L 好的,多谢。


挂电话。
有点莫名其妙。
这也太高效了,到底是为啥呢!!


路上我在想,
信用卡中心其实是不想让人销卡的,
所以就利用了我遗忘开卡信息这个理由,
千方百计的阻止我销卡。

不过,这个理由很不靠谱。
按照他们的说法是为了验证我的身份,
但是,
卡片使用时只需要卡片和密码即可验证身份,
在卡片欠费他们索费的时候应该只是凭借卡片关联的手机号码来确认身份:谁接电话跟谁要钱(管你谁呢,给钱就行),

如果他说销卡要那些开卡信息,那么平时的卡片使用过程中为什么不要求这么做?甚至连随机都没有。
那么他们所说的保护卡片安全 又在哪里呢?

就想我上面所说,
你允许别人使用卡片和密码随便使用,却不允许别人使用卡号和密码销卡,
这明显是一种极不公平的做法。
目的也很明显,
为了阻止用户销卡。

这样做只会降低用户的好感,
挫伤用户的心情。
于长久来看,
不是什么好事。

当然了,
电话员只是按照公司的规定办事,
我是不该改迁怒于他们的(好像我也没太过分,只是据理力争了一下子)。
问题在于这些规定的指定者。
销卡必须要开卡信息,
只能通过电话来操作。
这样的方式是否太专横了?

虽然说有信用卡中心可以做身份验证,但也只是提起申请,
而且效率极低,明显就是不想用户走这条路。

这跟国内的在线支付有些类似,
使用浏览器插件、控件名义上说为了用户安全,
其实是增加了用户的使用难度和复杂度。
paypal 并没有使用任何的浏览器插件、控件,
用户数量也并不比国内的支付产品少,
国外人也并不必国内人笨(黑客和诈骗应该也不少),
为啥人家就可以做好呢?


提供用户顺畅体验,
人们下次才会再来。
你老给人们设置障碍,
除非用户别无选择,
否则为啥要再来受阻受气一把?!

__end__

Thursday, October 29, 2009

心得

失败,失败,失败,首先大喊四声失败吧。


下面说心得:

01. 想去一个地方工作的话,弄清楚人家是做什么的,有什么主要业务,核心产品是什么很有必要的。
人家不会怕你烦的。


02. 做技术的人年轻的时候要深入的了解与掌握自己手头上的工具。所谓了解是指明白其工作原理,
虽然你会说,我又不做这个!但是了解其深层次的原理以后,会让你更好更有效的使用工具。
就好像写html的应该看看浏览器解析页面的机制。时间有限的时候就看看别人的分析,时间充裕
的时候就自己看浏览器实现代码(ff 和 webkit 都开源)。

掌握是什么呢?就是要熟悉工具的常用知识,比如关键字、常用函数、方法、类型等。虽然大多数
时候会有文档在手,不过熟练掌握的知识越多越好,所以,我们永远都不会闲的无聊。这就像练武
之人要时常练习一样,日久生疏。你每天都用的东西,总不能每天都需要翻帮助吧。每次翻出来,
删掉自己重写一遍,如此几次,慢慢会记住的,不可以过于依赖文档。

掌握是我薄弱的地方,以后会多加练习。


03. 多沟通,很多想法憋在肚子里烂掉了自己都不知道,说出来。
有时候有些话一出口,会自然带出很多你意想不到的东西来(当然,也有可能是不好的东西,稍微慎重一些)。


04. 身边常备纸笔熊。
纸笔拿来记录及草稿,
熊拿来表达不满、困惑和纠结——效果应该跟人差不多,好处是保护了秘密、朋友和自己。


--end--

Tuesday, October 20, 2009

看页面上有哪些域名

var s=get('http://www.sohu.com/').data,
d = {};
s.replace(/[\w\d_\.\-]+\.sohu\.com/g, function(a){d[a]=1;return ''});
for(var k in d){
print(k)
}


curl 'http://www.sohu.com/'|sed -n
's~^.*//\([a-zA-Z0-9_\.\-]\{1,20\}\.sohu\.com\).*$~\1~p'|uniq

果然对 bash 用的还不好啊。
还是熟悉js。

Saturday, October 10, 2009

nginx + app.py

python 的 web server 一般都写成 wsgi 兼容的 function 。
以前我都把他们用 spawn-fcgi 挂起来,这样需要 flup 库。

这么做的理由是什么呢?
没想法。


今天翻旧文章,
看到说 eventlet,
就去找了 greenlet 和 eventlet 来尝试,
结果发现 webpy 自带的 wsgi 服务器 rps 最大可以达到 800 左右,
而用 eventlet 的 wsgi 服务器可以达到 1000 以上,
这些只是在本机测试,
不知道如果是2台机器测试,这个值会不会更高。

如果 wsgi 都能跑这么好的成绩了,
那么我还要 fcgi 做什么!!
直接跑 wsgi 然后 nginx 里 proxy,还可以 upstream 。
这是多美好的事情 :-)

感谢 gashero<http://gashero.javaeye.com/blog/442177>,greenlet<http://svn.red-bean.com/bob/greenlet/trunk/>,eventlet<http://svn.secondlife.com/svn/eventlet/trunk/>。

Friday, October 9, 2009

run redmine on debian by nginx

sudo apt-get install ruby
sudo apt-get install libopenssl-ruby1.8 spawn-fcgi
sudo apt-get install gem
sudo gem install mysql rails

cd ~/
mkdir apps
cd apps
wget http://rubyforge.org/frs/download.php/63583/redmine-0.8.5.tar.gz
tar zxf redmine-0.8.5.tar.gz
cd redmine-0.8.5
cd config
cp database.yml.example database.yml
vim database.yml
rake db:migrate RAILS_ENV="production"
....


cd ../public
cp dispatch.fcgi.example dispatch.fcgi
vim Makefile
start: dispatch.fcgi
spawn-fcgi -d `pwd` -f `pwd`/dispatch.fcgi -s
`pwd`/redmine.socket -P re dmine.pid && chmod a+w redmine.socket

stop: redmine.pid
kill `cat $<`; rm -rf $<
vim /etc/nginx/xxx
fastcgi_pass "unix:/path/to/redmine-0.8.5/public/redmine.socket";

make start
sudo nginx -s reload


OOK
;)


仅记录为自己所用,
如果疑问,
欢迎讨论。
:)

Saturday, September 19, 2009

推荐好书(C about)

C In A Nutshell

中文名字未知。
前几天去书店翻到,
觉得是本好书。
感觉适合我这样上不上下不下的人。


找到一本 ebook,
周末翻。

Wednesday, September 2, 2009

Thursday, July 2, 2009

给 osx 的 dictionary 添加中文词典

去 http://code.google.com/p/mac-dictionary-kit/ 下载词典转换软件,
去 http://abloz.com/huzheng/stardict-dic/ 下载词典文件,使用上面下载的软件转换一下,
(原来在 http://sourceforge.net/projects/stardict/files/ ,不过看起来已经不能访问了。)
一切默认就好,转换完成就可以使用了。
非常简单。
自己动手吧。
:)

Sunday, June 28, 2009

基于 标签(tag) 和 版本(version) 的个人文件系统(filesystem)

最近在找是否有文件系统是基于 标签 和 版本 来管理文件的,
就是说我可以随便的丢一个文件进系统中,可以任意、无限的标签它。
也可以随便的修改,每一次修改都会被记录,我不用另存,不用复制,只需要删除我不需要的中间版本即可。
至于文件的获取,可以通过搜索+浏览来实现,其实 搜索 在 Mac 中已经很流行,
只是他的文件系统好像还不是很能够随意的让我去丢文件进去,因为大多数时候还是需要我自己去目录下面翻文件,
不知道 spotlight 是搜索文件的哪些 metadata 的。所以嘛,不了解细节对我这样的人来说,用起来很痛苦。

系统构想:

  • 添加文件比较简单,可以随意的丢文件进去,然后标签(也可以完全不打标签)
  • 可以丢文件包进去,就是说我的一组文件是作为一个文件来处理的,对以检索来说
  • 查询时候,根据 标签(自动补齐),类别,日期(c/a/m),使用频率 之类来检索(受 find 影响)
  • UI 界面下的检索结果列表,可以将新文件拖到这个结果界面中,那么这个新文件将自动被赋予这些标签(CLI 下如何操作?)

这种东西可能跟 linux 下的 find、grep 重复,不过,在现有的文件系统下存储,
仍然需要建立复杂的目录和 ln -s 连接才可以模拟这样的效果,
如果有软件可以更加方便的使用 ln 来模拟就更好了。 就是说我可以用 ls x 来开始搜索,然后 tab 补齐(可以考虑列出来,直接、直观的选择),比如 abc,
加斜杠的意义就是在所有标有 abc 标签之下再检索,再自动补齐,然后觉得满意了直接回车,然后出来所有满足条件的文件。
添加 文件类型、文件、版本、使用频率 之类的检索条件,比较完美了。
对于文件保存,几乎不覆盖,而是类似增量保存,然后可以选择抛弃某个版本。

适用:

  • 收藏资料、图片、软件之类大而碎的文件 的用户
  • 应该也可以作为服务器的存储底层来使用

有啥想法呢??
或者有啥推荐呢?
有任何兴趣或者建议,请 mail(kindy61 在 G邮箱) 我。

说话

关于 可探知(确定)与不可探知(不确定)。

世界上的事情分为可探知和不可探知。
我做的事情几乎都属于可探知范畴,就是说,只要愿意,都可以学习到,可以探寻源头,才根本上知晓一切。

很大的一个原因是:这些东西是人类创造的,总是有据可循的。
人就不是,人不是人创造的(虽然是人制造的),所以很多东西是未知的,也是比较不可查的,虽然有心,但是也未必能全部搞清楚,这样的事情让我这样的人抓狂——我对此无能为力。

有时候陷入一些死胡同,有心却无力。
心走的太快,行为、动作跟不上,干脆就放弃,
如此往复,心越走越远,行动和行为越来越跟不上了(其实行动和行为也受心的控制,只是有时候就是控制不了)。
近来发觉在挺多方面都是这样的状态,
知道的太多,实践的太少,所以就形成了越想越多,甚至有些飘渺与脱离实际,
而行动上却一点也没有,形成了巨明显的好高骛远。
更加的无法开始行动。
这是一个可怕的事情。

PS: blogger 的可视化编辑器很难用。只能用 html 编辑模式比较好。

Wednesday, June 24, 2009

广域网使用网上邻居

标题很假,其实是想在家中(歌华宽带)中连接机房中的win2008 服务器,要是 linux 也好办。
描述:
服务器是 win2008,开文件共享,在家里(leopard 10.5.6)尝试连接,结果连不上(好像是必然的)。
遂想到这几天研究的 ssh 端口转发,然后操作如下:
  1. 远程登陆到 win2008,开共享 abc,使用 putty 连接 公网上有 ssh 帐号的一服务器 A,设置端口转发 R 8888->localhost:445。
  2. 在我的机器 leopard 上连接 ssh -2 -f -N -L 445:localhost:8888 A;
  3. 尝试添加 smb://localhost/abc,结果提示这个 localhost 是本机,直接访问即可 冏;
  4. 断开 2 中的连接(ps -ef | grep 找到 pid 然后 kill);
  5. 找到附件另外一台机器 B,在它上面 ssh -2 -f -N -L 445:localhost:8888 A;
  6. 回到本机 leopard 连接 smb://B/abc,提示输入用户名和密码,这时候输入 win2008 上的用户名和密码,连接成功。
都挺好,就是使用了多余的 2 台机器,如果我自己有外网 ip ,也许好一点,不过 mac 系统不让连接自己 smb 服务的这个,有点多余,起码高级用户给点自由吧。
希望对有这样变态需求的人有帮助。

Sunday, June 21, 2009

神奇的 ssh 端口转发

ssh 端口转发。

作用:
1 不同的内网之间互联;
    假设有 2 台在不同网段之间的机器需要连接,那么在 A 网段用一台机器 ssh 到公网 abc.com 上,绑定一个 abc.com 的端口 x 到 A 网的任意 ip:port,
    然后在任意地方访问 abc.com:x 就等于访问之前绑定的 A 网段的 ip:port,这样,几乎任何服务都可以传递过来,包括远程连接,打印机等

2 发布本地服务到外网;
   跟上面类似,只要将远程主机的端口绑定到本地机器即可。

3 欺骗程序(比如 RDC 的 mac 版本不能指定端口,如果服务器设置了非默认端口,则可以通过 ssh 在本机转发一下);
   这个纯粹的是做端口转发,本机就可以搞定。

4 用作代理服务器。
   用到 -D 参数,配合 pac 文件很好用。



参考:
理解这个得到 agentzh 的大力帮助。
这篇文章也比较好。

Thursday, May 21, 2009

淘宝 - 支付宝

淘宝很好用,功能很强大,浏览器兼容性很好,产品展示平台很宽广,
不过,他的支付平台支付宝—让我很无奈。

暂付款到支付宝,货到确认付款这个功能确实很好。但是支付本身的复杂度很让我无奈。

支付宝是国内产品,跟大多数国内金融相关产品类似,需要 usb 形式的 key 或者 数字证书,
但是这些东西看起来更多的是欺骗傻子,但是一般做这方面欺骗的人,有几个是傻子。
最终受害的,反倒是大多数普通用户,需要花费大量的时间来学习这种东西的使用,
折腾这些证书的安装、申请、导出、导入、使用。还有什么取消申请,等等等等。

还有手机功能,啥啥啥的,
不过手机和证书是相互依赖的,
所以,这种类似死循环的东西只是看起来好看,
产品设计人员的一种自我满足,
也许就像白鸦这样,
实际碰到一些死路的时候才知道多痛苦。

虽然有客服,
不过,有时间延迟,好几天,
等过去了,黄花菜都凉了。

我有 paypal 帐户,我觉得对于国内购物相对于支付宝有2个不方便:
用户群比较小;
不能货到付款。

其他的都挺好,
无论是使用方便性还是易用性上。

淘宝确实前端做的很好,
产品设计也挺好,
只是,有太多虚浮的东西,
安全确实重要,
不过,
有时候让人欲哭无泪,
却又无话可说—人家本意是为你好。

就奇怪国内银行、支付系统都喜欢搞这些外带插件,
如果搞成这样,
那么基于浏览器的应用还有什么意义。

基于浏览器的应用意义不就在于随时随地可用么,
如果搞那么的插件以及额外依赖,
倒不如开发本地应用,
无论是性能还是用户体验上可提升的范围都很大,
何必累计那么一帮"前端工程师"在搞跨浏览器兼容呢。
你的产品无法让人平滑使用,
最终不可避免的需要 win 平台或者 ie 浏览器,
那么这样的兼容有何意义。

也许,
也许,
有演示的意义呢,
呵呵。
演示的时候大多不需要最终付款,
产品验收人员也就感受不到真实的流程到底有多折腾。

唉,
亲爱的淘宝,
你能否更加进化呢。
直到有一天,我能够使用任何一个能够正常浏览你首页的浏览器完成我完整的购物过程,
无论我是用 win, linux, 移动平台, 还是 mac,
也无论我是用 ff, ie, safari, 还是 opera。
可以某些平台不好用,但是起码你让我能用。


十分期待这一天,
原你们加油。



- - - - - - - - - - - - - - - - - - - -
今天去参加驾校的交规考试,
全对。
得益于去上的2天课吧。
还有考试前有听到老师念 FanJian 这样的名字,
为无聊的等候时间添加了一些乐趣。
虽然把自己的快乐建立在别人的痛苦中不太好,
不过我是偷偷的乐的,
应该痛苦不是太大吧。

Friday, May 15, 2009

用 Mac 拍照,连续的照片(zh-CN)

此为译稿,原始来源: http://www.carbonsilk.com/development/timelapse-video-mac/
更多类似应用: http://lancewig.com/2008/08/06/tutorial-poor-mans-macbook-webcam/

Me on a time lapse from James Broad on Vimeo.

你可以在 Mac 上跟随以下步骤来创建上面类似的视频。

步骤 1

下载并安装一个命令行下拍照的工具:isightcapture http://www.macupdate.com/info.php/id/18598 (原始地址好像下不到,提供另一个地址 http://blog.chlean.net/misc/isightcapture1_1.dmg)

打开这个 dmg 并复制 isightcapture 到/usr/bin/

sudo cp /Volumes/isightcapture1_1/isightcapture /usr/bin/

步骤 2

创建一个目录来保存我们的视频和图片,假设为 ~/captures/ 。

cd ~
mkdir captures
mkdir captures/scripts
mkdir captures/series

步骤 3

创建一个脚本,用于捕捉并保存图片:

cd ~/captures/scripts
vim captureme.sh

输入以下内容:

CAPTURE="isightcapture -t jpg"
cd $HOME/captures
D1=`date +%y%m%d/%H`
D2=`date +%y%m%d.%H%M%S`

# If the date directory does not exist, create it
if [ ! -d $D1 ] ; then
mkdir -p $D1
fi

# Construct the filename and path and capture a pic
FN="$D1/$D2.jpg"
$CAPTURE $FN

# Make a symlinked image of the last photo taken
if [ -h 'last.jpg' ] ; then
rm last.jpg
fi
ln -s $FN last.jpg

保存并退出(:wq)

给这个脚本添加执行权限

chmod a+x captureme.sh

步骤 4

把这个脚本变成自动运行的:

crontab -e

然后这么写:

* * * * * ~/captures/scripts/captureme.sh

保存,退出(:wq)

步骤 5

做到以上步骤,你的电脑已经每分钟拍一张照片,并且保存到 ~/captures/年月日 目录下了。 下面是把那些图片连起来做成视频,你可以用自己的方式来乐(因为装这个 ffmpeg 很麻烦)。 我想后面的属于高级主题,就不翻译了,大家自己搞定吧 :)。

Install a utility to convert a series of images to a movie. We will be using ffmpeg cd /tmp/ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg cd ffmpeg

We need to install ffmpeg to our machine, this process is going to basically compile the code. Hopefully nothing will go wrong for you here, if it does though, take a look on http://stephenjungels.com/jungels.net/articles/ffmpeg-howto.html

./configure --enable-shared --disable-mmx sudo make sudo make install

Step 5

Make script to grab photos and run them through ffmpeg mkdir ~/captures/videos/ cd ~/captures/scripts vi make_complete_sequence.sh

Write the contents to the file:

COUNTER=0; rm ~/captures/series/*.jpg for i in `find ~/captures -name '*.jpg'` ; do #Write the filename to be friendly with ffmpeg's odd filename input FILENAME=`printf '%03d.jpg' $COUNTER` cp $i ~/captures/series/$FILENAME let COUNTER=COUNTER+1; done nice ffmpeg -r 20 -b 1800  -i ~/captures/series/%3d.jpg ~/captures/videos/timelapse_complete.mp4 

Again setting the permissions to be able to run the script and then run it to generate a movie based on the images taken so far.

chmod a+x make_complete_sequence.sh ./make_complete_sequence.sh

Step 6

View the finished result Browse in finder to your home directory > captures/videos and watch the result.

Thursday, May 7, 2009

诚意推荐的文章,有兴趣的话,看看。


 很多职场新人都谈到了工作经验的问题,似乎招聘公司不给你机会,你就没办法获得必要的工作经验,其实并不一定。 

  很多资料在网上都是可以找到的,只是看你具备不具备足够的信息收集与处理能力,而这个收集与处理信息的过程,也能极大的提升你的职业能力。 

  我一直有个感觉,在"模仿中成长,在创新中成功",其实在真正的职业工作中,大多数的工作都是模仿重复,强调的是工作效率,而不是创新。对于企业而言,过度的创新必然导致过多的失败,以及效率的低下。 

  以下方式是我的成长中曾经做过的,也是我用来训练新员工的方案。你们也可以试试。 

  看到很多谈应聘技巧的帖子,其实并不实用,有菜谱并不代表能做出好菜,能不能做出好菜仍要看你天天炒,日日炒,炒出来的本事。 

  所以,我这里要强调的一点是,你收集到的任何资料都不能只是看看,而必须自己手把手,动手去整理、去归类,去建立新的结构,这个信息收集与处理的过程甚至比你最后总结成文的文字更重要。 

  何谓"学习"?学习学习,学而习,习而成习惯。光学不习,那知识还只是书上的,老师教的,不是你自己的,只有你重复练习了,经过量变,才会有质变,当你形成条件反射时,你就真正掌握这个东西了。 

  这个过程需要维持两至三个月的时间,一定要坚持下去,你会看到自己的变化的。否则,你会用你最青春的两三年来慢慢沉淀出这些你两三个月就能掌握的东西。 

  一切一切,其实,你们比的不是其它的东西,只是比的速度。 

  这也是为什么我那么强调基本功的原因。 
     
     
    1. 职业分析: 
    A. 分析性格——分析长处和短处——分析大家都有的长处——确定自己最终发展的专业 
    B. 确定兴趣——分析竞争的激烈程度和发展的空间大小——寻找相对优势—确定自己最终进入的行业 
    C. 确定行业内自己的专业方向,继续保持自身的专业优势。 
     
    2. 编写行业报告——着重对行业全面性的把握。 
    A. 通过上网查询和购买行业报刊,收集不少于三十万字的行业、重点企业的有效资料,在电脑中进行资料分析、分类、汇总。 
    B. 参考同类行业书籍,确定写作提纲,确定文章结构和逻辑方向,培养文字表达能力和逻辑能力,以及熟练的电脑使用技能。 
    C. 将三十万字资料浓缩成十至十五万字,写成一本符合出版行文格式要求的行业报告。如果选题好,还真的有出版的可能性。如果有一定的独特见解,也可以写成文章争取在专业刊物上发表,树立个人专业形象。 
     
    3. 编写讲座报告——着重对专业系统性的把握。 
    A. 根据你希望从事的专业岗位,从报告中选择两到三个重点,将书稿压缩成两万字的讲座稿(按每分钟150字的演讲速度,即两个小时)。 
    B. 将演讲稿再浓缩成两千字的提纲和重要内容,使用PPT软件编成演讲用演示文件,并根据相关内容配以精彩图片。 
    C. 培养职业化的公众表达能力和表达方式,练习普通话,使用讲座稿进行互动讲座和演讲练习,只到脱口而出。 
     

  告诉大家两个名人是这么成长的. 
   
  一个是教英语的李阳,他读大学时成绩不好,英语不及格,然后他做什么去了?他跑到没人的地方大声喊英语去了. 
   
  一个是做广告的叶茂中,他卖广告卖不出去了,他跑回家写书.别人看到的和他自己说的是拿着书出版出了名,发达了.其实做过这个事的人才会知道,当他把这本书写出来时,能不能出版已经不重要的,因为他知道他变化了. 
   
  我当时也是没办法了,把所有的钱买了台电脑,在家里做了三个月这个事,三个月后的变化是惊人的,我的父母、我兼职的公司的老总,最重要的是我自己,都感觉到了自己的变化。 
   
  完全不同了。 


  其实我写的已经不是理论了,其实什么都没有技巧的,只是多看书,然后多做,硬磕,坚持下去,刚开始觉得没变化,没感觉,很累,坚持不下去,然后做着做着,就越来越快了,然后慢慢的有变化. 

  而且有意思的是,我在家呆了三个月,做的事其实根本与我所从事的工作没有一点关系.只是这三个月的训练,对于我的逻辑、结构、全局性、文字表达能力、口头表达能力有了极大的提升。 

  至于收入翻5翻,当年一个月也就八百块钱,然后做完这个训练后整个人的状态都变了,有自信了,然后写了一个方案去应聘,结果进了一家大公司,当然,开始我还不想去,因为对方只给我800/月,还要自己租房子,吃饭,觉得不好,但是对方连续四个月三次打电话找我,于是我去了,结果去了就后悔了,真正好的公司根本不在乎工资的,重要的是你自己的能力。第一个月,我就挣了八千块,我以前想都不敢想的。然后两个月就转了正,而有一个有关系的同事,呆了一年还没能转正。然后每个月的收入超过工资几倍,还有年终奖两万,出国旅游,其实也不累,我到这个家公司的同时,还到另一家广告公司兼职,呵呵,很回忆的过去。 


  现在看到太多的人谈工资,我确实不喜欢,我这几年都不和老板谈工资的,因为说出来好笑,帐面工资高了,还要多扣税. 

  我只在意公司的分配方式,怎么样算提成和奖金,年薪. 
   
  上个月有一个和我同龄的名牌大学MBA来我现在所在的小公司应聘,不愿意和人事小姐谈,老板不在,我就来谈了,我说好呀,以你的资历我不能和你谈给谁做副手的问题了,我跟你谈谈公司的分配方式吧,其实我们公司普通员工的收入都不高的,长沙平均水平,只是不忙,周末休两天,工作满一年还有一个星期的年休假. 
   
  但是公司几个部门负责人还是有钱的,象我三十岁,一年18万左右的年薪,其它的我就不清楚了,有几个我一个星期才见一次的,比我还小,只怕拿得比我还多.你应该也是这样的吧. 
   
  他要求6千一个月的月薪,我说这倒不重要,重要的是公司不会给你安排业务的,你自己找业务回来,公司给你平台,给你配团队,能挣多少钱是你的本事. 
   
  我说完了,问,你有什么想法吗?他说没想法,起身走人. 
   
  太有意思了,你在长沙想拿六千一个月,你等别人找事给你做,你为什么不能自己找到项目呀?六千是底薪呀,差不多7万2千的底薪,如果是这样的,那我自己算我应该拿到二十五万以上的年薪了. 
   
  从来拿底薪和拿年薪的人就是不一样的. 
   
  如果你不敢拿年薪,你就不要想着谈什么老板给你少了. 
   
  企业是要盈利的,资本家是要剥削的.问题是,如果你是一个真正能创造价值的人,你自己所创造的价值你是可以拿到手的. 
   
  大学毕业生,如果什么经验也没有,只有知识,没有技能,能找到一个给你几百块钱,让你在这里呆着学东西的企业就应该感谢了,如果你觉得这种企业不是你所向往的,你在上大学时就老老实实努力学,少玩,多练. 
   
  我工作有一个总结,钱永远不会是目标,但是它会是结果. 


  谈到职业规划,有人说过职业可以规划的,我也相信未来可以计划的,问题是,你是不是这个能不能计划出你未来的人,以及,你身边有没有熟悉你的高人指点,如果没有,那你自己都不会明白你自己的未来是什么的,就象象你去做所谓的性向测试,说不定是你自己在自欺欺人了,这种事多了,没人会把自己算成一个坏人的。 

  所以重要的还是那一句话,复杂的生活简单过,简单的事情重复做。 
   
  你是中文系的,如果你的年纪还不是很大,建议你凭你自己的能力,哪怕是工资少点,你都要进最好的广告公司,去呆上一年半载,按我说的方法偷师,基本能力提升了,慢慢的你会遇到一些贵人的,还有你会涉及一些行业,慢慢的,你会发觉你内心深处喜欢的行业。 
   
  呵呵,特别是哦,女孩子,只有努力才能进大公司,只有进了大公司才能遇到优秀的男生。好男生都关在写字楼里上班下班加班的,呵呵。生活圈子都小的,你选择的工作圈在你努力的阶段就是你的生活圈。 


  在你的成长过程中,有五个人非常重要。 
     
  第一个,导师,教练。 
  他教给你实用的技巧、一定的工作经验,而不是知识。他可以给你指明方向。 
  这个人可能是你的上司、前辈、学长。 
     
  第二个,陪练,同路人。 
  任何人的成长都不是学出来的,而是学而习,习而成习惯,练出来的。在这个练的过程中,是一件很苦的过程,是一系列简单动作的重复重复再重复,由量变到质变的过程,在这个过程中,一个人很难坚持下来,这时你需要一个同路人。 
  他可以是和你共同兴趣,共同目标的朋友,最好是你生命中所爱的人。 
     
  第三个,榜样,他是你人生的标杆。 
  在你一生中,在不同阶段,会有不同的标杆,你向他学习,受他鼓舞,一步一步向他靠扰。 
  最重要的是那个你看得到摸得着的人,你知道,不需要通过机遇,只需要通过努力就可以达到的榜样。 
     
  第四个,敌人,看不起你的人,拒绝过你的人。 
  人不到绝境是不会有斗志的,你要证明他是错的,他会给你真正的动力。 
     
  第五个,最重要的是第五个,你们觉得第五个人是你自己。 
  世界上没有救世主,任何希望当别人救世主的人不是疯子就是傻子,只有自己才可以救自己。 
  这个世界上,失败的人除了天分太差之外,只有以下几点,懒,方向不对,方法不对,没有坚持。 
  如果你自己做不到,你不要怪别人。 


  基本功是你自己的,细节所积累下来的,能让你迅速融入新环境. 
   
   
  不知道怎么跟大家谈基本功这个问题. 

  很多东西大家都没把它当基本功了. 

  比如说,我想要的人,他打字很快,他很少很少写错别字,有丰富的词汇量,逻辑很清晰,用词很准确,这些看上去难不难? 
   
  但是在我这两年见过的应聘的策划文案来看,只有两个人做到了.一个是做了三年文案的女孩子,慢慢磨的.一个是中文硕士生,还没毕业.
   
  其实大学到底教给大家什么了? 
  知识? 
   
  大学阶段必须打好你的基本功,这些决定了你就业后的学习能力,阶层简单工作的工作效率. 
   
  如果谁还说打字、排版是文员做的事,那只能说他是真正不明白真正的职场需要。 
   
  你们在大学所学到的知识,都是同质化的了,如果将知识变为通用的、标准化的技能才是重要的。 
   
  既然学的东西没用,那在大学还要不要认真学习呢? 
   
  当然要,因为这些东西是系统性的,这个学习过程能培养你的学习能力。 
   
  知识不能改变你的命运了,但是它可以改变你的气质。 
   
  如果你读个四年大学出来,你的气质还不能好一点,那你的大学就真的白读了。 
   
  经常有人在问面试穿什么衣服呀? 
   
  穿什么衣服重要吗? 
   
  重要的是什么人在穿这些衣服。 
   
  重要的是你的精气神,你的气质。 
   
  有一天有一个应聘文案的来了,我叫设计总监先和他聊聊。 
   
  聊完了,我说这个人不行吧,设计总监说为什么? 
   
  我说我们调性不符,我们多少都有点书卷气,而他是一脸的江湖气。 
   
  果然,呵呵。 
   
  招聘方当然是要看应聘者的外形条件的,但并不是丑的就不招,重要的是能力和你的气质,是不是符合公司要求的。 


  重要的是兴趣。 
   
  然后是狂练基本功,简单重复积累。 
   
  学打拳,你先站三个月桩再说。 
   
  面对新人,我说很多东西,你会发现,每个字你都认识,每句话你都看得懂,但是你理解吗? 
   
  领悟,是教不了的。 
   
  自己努力吧,自己重复做,再会明白自己最想要的是什么。 
   
  你考公员员如果死活考不上,那你应该去想想,这种机械性的考试你都过不了,那是不是学习方法,或者兴趣不对呀? 
   
  做销售,同样的,从基阶做起吧。 
   
  你的财政学对你有没有帮助? 
   
  当然有,你对销售的认识会不同的。 
   
  象十年前我卖保险,人人都跟银行比,算利息,都算得没有银行高,只能说死了人有赔了。 
   
  而我是怎么算呢?我用递增,还是增减年金公式算,呵呵,比银行高呢。 
   
  另外,别人说死了人有赔,最多是说得婉转点。 
   
  我可没把它当死人卖呀,我把它当礼物卖,当成父母送给孩子的礼物卖,卖得可好了,呵呵。 
   
  现在哪个做人寿险的人敢说他一年做两百多单? 
   
  呵呵,我好象一年做了二百四十单左右,全是年缴哦。 



  这个世界上最穷的和最富的人都在做销售. 
   
  做销售的人底薪很低的,大多数人拼的只是体力罢了,如果你想做好,你多花心思就可以了.多想多跑,还是在一个行业里多坚持,找到高手做师父带你. 


  我说说当年我混日子的时候怎么过来的. 
   
  那年头电脑还紧俏,我只要一有机会就到别人电脑上练东西,终于练成了今天的电脑基本功,一方面要多学,一方面要多用心. 
   
  然后,我每天做记录,记下工作的流程,记下别人说过的工作中重要的话,其实什么叫行业经验,很多老手随便说的话,都是行话了,有它的意思的,听了就要想,就要去查,很多东西就知道了. 
   
  为什么要记录,因为什么叫职业化?职业化就是标准化、流程化,模式化,你多看多记多想就能明白了,这些东西在很多地方都是通用的。 
   
  有一点,如果这里收入还可以的话,你好好学吧,任何工作都要呆一两年,你才会有认识的,跳来跳去的对你不好,真的,你还在磨性情的时候,只要你保持学习的能力,别下班玩去了就可以了,有压力才有动力,好好留心心仪的公司招聘的要求,按那个要求去做一个一年的训练与学习计划,一年后,那个公司在等你。 


Friday, April 17, 2009

如何开始写 python 代码

本教程是让你可以开始写 python 代码,面对的是新手中的新手。

  • 系统环境:linux/unix
  • 操作环境:bash

学习python势必要创建程序文件,那么最好把它们放到一起。比如 ~/projs/pytut
意义是在我的 HOME 目录下的 projs(项目) 的 pytut(python tutorial) 目录。

下面正式进入。
后面的操作不特别指明,都是在 bash 环境中

[~] $ mkdir -p ~/projs/pytut 建立目录
[~] $ cd ~/projs/pytut 进入刚才建立的目录
[~/projs/pytut] $ python -V 看看 python 的版本,如果没有安装会提示
[~/projs/pytut] $ vim hello.py 使用 vim 编辑文件 hello.py,如果文件不存在,vim 会自己创建

然后就进入 vim 的编辑环境了,基础用法:
vim 比较奇怪,进去以后是不能直接输入字符的,不想我们常用的编辑器那样。
他默认是处于命令模式,即你输入的任何东西都当作命令来处理了,那么要输入字符,需要 i 命令。
移动光标的话可以用方向键,也可以用 hjkl 四个键,自己试试吧,也许一开始不好使,因为还没有内容。
按了 i 进入文字编辑模式以后,可以像我们常用的编辑器那样输入、编辑。当输入完了,按 Esc键(键盘左上角的按键,不是输入3个字符) 回到命令模式。
再举例常用的命令:

移动光标到第5行5gg
移动光标到第20行20gg
移动光标到第1行gg
移动光标到最后1行G
移动光标到下个单词w
删除光标所在字符d
删除光标所在单词dw
删除光标所在行dd
删除从光标所在行起的5行5dd

其他用法参考 vim 用法

介绍完工具,下面说 python。在刚才创建的 hello.py 中输入以下代码:

#!/usr/bin/python

print 'Hello python'

输入完后返回 vim 的命令模式,输入 :wq(保存(w - write)并退出(q - quit) vim),
然后在 bash 下输入 python hello.py,看看屏幕上是否显示了 Hello python。
OK,到此为止,后面请移看 此篇(这篇文字的目的是把这个文章的入门描述清楚)。

Friday, April 10, 2009

关于偏激(极)

曾经看一部科幻片(太空堡垒卡拉狄加),讲人造机器人的。
机器人进化到一定时刻,开始反抗人类,而凭借机器人自身的优势,
迅速占领了人类生活的星球。人类中小部分人幸免于难,乘坐若干艘飞船逃难,
过程中,发现机器人可以以人的姿态出现,并且混杂在幸存的人中。
因此,指挥官(commander)答应某人(A)的申请,成立独立的调查团,
查找可能混在人中的机器人。

在几经查找后,最终查到了指挥官,开始指挥官是配合的,但是,当后来越发的
“莫须有”时,指挥官开始意识到组成这样的调查团已经失去了意义,所以打算解散这个调查团。
但是,调查团内其他人(类似民主人士,而且人们的意识比较美国化)说:我们是独立的,你无权解散我们。
这时候,边上的士兵们遇到一个抉择:忠于指挥官——他们一直的最高领导人,
或者忠于调查团——当时独立的组织。可以看到,士兵们当时是有疑惑的。不过,在指挥官的
几句话下(忘记了什么话),他们逮捕并软禁了 A。
看到这段冲突的时候,我心里很凉。
指挥官说:调查的目的是保护人民而不是怀疑、审判人民。
之前还说了:之所以军队和警察分开,是因为面对的是不同的敌人。

胡乱说了一气,也不知道在说啥,
不过这些感受是当时就有的,看到令狐虫写的浪潮,就也把我当时的感受写一下,了做记录吧。

人的顿悟是比较容易的,困难的是遇到合适的机遇。
很多时候受知面比较小,所以顿悟的机会也比较小。
通过认识的、关注的、提前顿悟的人们的帮助,也会比较容易顿悟。
算是,取之于社会,用之于社会吧。
现在的生活太多获取,太少付出。
就像大多数人总习惯于google 或者 baidu,你搜索出来的结果
总是某人写出来的,你自己,又贡献了多少内容让别人搜索呢。
在自己得到的同时,把自己的心得、体会写出来,也算是对别人的帮助的一种回报吧。

Friday, April 3, 2009

about factorial function

我承认,我被绕进去了。

// The Y combinator, applied to the factorial function
// https://javascriptlint.svn.sourceforge.net/svnroot/javascriptlint/trunk/spidermonkey/src/Y.js

function factorial(proc) {
    return function (n) {
        return (n <= 1) ? 1 : n * proc(n-1);
    }
}

function Y(outer) {
    function inner(proc) {
        function apply(arg) {
            return proc(proc)(arg);
        }
        return outer(apply);
    }
    return inner(inner);
}

print("5! is " + Y(factorial)(5));


// expand

Y(factorial)(5)
inner(inner)(5)
factorial(apply)(5)

(function (n) {
    return (n <= 1) ? 1 : n * proc(n-1);
})(5) // proc = apply

5 * apply(4)
5 * factorial(apply)(4)
5 * (function (n) {
        return (n <= 1) ? 1 : n * proc(n-1);
    })(4)
5 * (4 * apply(3))

Thursday, April 2, 2009

拔牙

今个儿去拔牙了。
现在脸好多了,摸起来像是在摸脸,
刚拔完那会儿摸起来不知是啥感觉,
就像在摸一块猪肉皮一样。
嗯,是这样的感觉。
就算不是猪肉皮,
也是肉皮。

只有触觉,
没有其他感觉。

拔牙后不要做吮吸这样的动作,
会造成口腔内压减小,
造成拔牙创口流血。

Tuesday, March 31, 2009

ie ol has the max index 有序列表 索引数字上限 1000

在 ie 下,当 ol 里的 li 超过 1000 个时候,1000 以后的 li 的索引值会从 0 重新开始。
相当奇怪。

Monday, March 30, 2009

i love you so much 我喜欢你

我喜欢你,

非常喜欢你。

 

好吧,

我承认,

我见识过的这几对几乎都差不多的。

实在是都很类似。

 

也许,

这些事情都差不多。

就那么点事。

 

哈哈,

咋就都差不多呢。

呵呵。

 

太,

可爱了。

 

知道我谁啥,

知道我说什么,

等他们成了,

再摆出来。

 

哎,

好像有点卑劣了。

python 动态生成 zip 文件

python 中处理 zip 文件

from zipfile import ZipFile

z = ZipFile('abc.zip', 'w')
z.write('abc.txt', 't/abc.txt')
z.writestr('t/abc2.txt', 'this text is from my')
z.close()


# 即时压缩

import os
from zipfile import ZipFile
from StringIO import StringIO

f = StringIO()
z = ZipFile(f, 'w')

def safewrite(f, *arg, **kw):
    if os.path.isfile(f):
        z.write(f, *arg, **kw)
    elif os.path.isdir(f):
        for root, dirs, files in os.walk(f):
            for f_ in files:
                z.write(os.path.join(root, f_))

safewrite('flash')
safewrite('abc.txt', 't/abc.txt')
z.writestr('t/abc2.txt', 'this text is from my')
z.close()


print 'Content-Type: application/zip'
print 'Content-Disposition: attachment; filename=abc.zip'
print

print f.getvalue()

Tuesday, March 24, 2009

the js lib in my heart 我心仪的js库

yui loader
jquery dom,dom-ev,ajax
goog class,oop
jsolait fn,package,socket

 

其实 jsolait 的loader 也挺好的,不过他只能同步,不能异步的load。
jaolait 的class和oop也挺好,不过稍显复杂,偏向 goog 的方式。
jquery 提供了良好和足够的操作 dom 和大多数 ajax 的功能,
如果要纯粹的脱离 dom 的事件机制,还是自己实现一下或者用 yui 的,或者 goog 的比较好。
jsoliat 提供的包管理和 socket 机制(通过 as 实现) 也挺不错。

 

希望这个项目里能够实现这个东西。
虽然是东拼西凑,不过确实期盼了很久的东西。
不知道会不会违反他们各自的版权呢。
呵呵。

 

顺应一下国情,先搞出来,
如果有了问题,
我再学习 gnu,自己实现一遍。
只是,
比较仰慕这些已经完善的实现而已。
有对这有兴趣人不,可以一起来搞嘛。

Monday, March 23, 2009

add app on existing apache site 给apache站点添加功能

服务器上跑着 apache,服务着我们日常工作。现在要扩展一下功能。
因为之前的静态为主,而又不想用 php(其实是不熟)。所以打算用 python(webpy) 来在原有基础上扩展。
为啥注重 原有基础 呢?
因为不想另开端口。
对比了一下,决定用 scgi
apache 配置:
LoadModule scgi_module Modules/mod_scgi.so
SCGIMount /editor 127.0.0.1:8080
重启 apache,然后启动 py 程序:
python code.py 127.0.0.1:8080 scgi
这样启动起来的 py 比较麻烦,
可以考虑使用 nohup 来搞定。
nohup sudo python ./code.py 127.0.0.1:8080 scgi &
这样 py 就会在后台执行,即使你退出了 ssh 也不会把程序搞停。
如果想看看有哪些程序在后台执行,可以 jobs。
如果想激活其中的某个,就 fg n,其中 n 为 jobs 时候看到的第一列的 id。
对应 fg 的还有 bg,不过我还不知道如何使用。
激活后,用 Ctrl + D 即可退出。或者是 Ctrl + C?忘记了。呵呵。自己试试吧。
参考
  1. webpy 安装
  2. mod_wsgi
  3. 关于 nohup (这个链接可能已经不可用,可用 gr 订阅 http://www.ijiyi.com/feed 看好使不)
发现,现在越来越离不开 search 了。
看文章也习惯的先找 rss ,然后订阅到 gr ,然后才找出来看。
好处就是以后可以在 gr 里搜索看过的文章,
坏处就是 gr 里有好几k(甚至好几w,没知道) 的未读。
看的让我再也没有兴趣把未读数搞定下来。

Wednesday, March 18, 2009

what is a empty array in javascript 空数组([]) 是什么东西?

先看测试

[]==false ? 'false' : 'true'//false
[]==true ? 'true' : 'false'//false
Boolean([]) ? 'true' : 'false'//true
(![]) ? 'false' : 'true'//true
([]) ? 'true' : 'false'//true

为啥有时候是 true,有时候是 false 呢?

参看:
逻辑AND(&&)运算符

Monday, March 16, 2009

mysql index 学习

在看了 某人一次MYSQL优化 后,总在琢磨着把一个系统优化一下,今天找了找资料(MySQL索引分析和优化),
摘取部分备查。


MySQL提供多种索引类型供选择:

  • 普通索引
    这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
    • 创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
    • 修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
    • 创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

  • 唯一性索引
    这种索引和前面的"普通索引"基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建:
    • 创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
    • 修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
    • 创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );

  • 主键
    主键是一种唯一性索引,但它必须指定为"PRIMARY KEY"。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如"CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); "。但是,我们也可以通过修改表的方式加入主键,例如"ALTER TABLE tablename ADD PRIMARY KEY (列的列表); "。每个表只能有一个主键。

  • 全文索引
    MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。 全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引,要了解更多信息,请参见MySQL documentation

选择索引列

在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。
MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。


更多参考:
How FriendFeed uses MySQL to store schema-less data


现在在疑惑深入学习 mysql 还是 postgresql。
谁能给点意见。 :)

Saturday, March 14, 2009

在 mac os x 上装 mysql

首先安装 macport

然后
$ port selfupdate
$ port install mysql5 +server

然后去 /opt/local/share/mysql5/mysql/ 选择一个你看着满意的 my-*.cnf,
复制到 /opt/local/etc/mysql5/my.cnf.
然后,如果你愿意的话,编辑一下它。

初始化数据库
$ mysql_install_db5

默认 root 用户的密码为空,可以这么改:
$ mysqladmin5 -u root -p newpassword 新密码
当提示密码的时候,回车即可。上面的 "新密码" 换成你想要的。

把 mysql 加入随机启动,同时也会开启 mysql 服务器
$ launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist

还不知道怎么开启 tcp/ip 连接,
就直接用的 socket 方式在 php 里。
使用方法是在 socket 路径前加冒号(:),
比如我机器上就是 ":/opt/local/var/run/mysql5/mysqld.sock"。

__END__

太刻意求来的,未必真的是如愿

凡事不必刻意追求完美,
有时候,天意真的比较重要。

地有多大,坐火车是测不出来的;
天有多高,坐飞机是测不出来的。

用心,
用身体。

退一步,
进一步,
都可以解决问题,
只是,
如果都是进的话,
也要进得更多才好,
否则就没有意义了。



《赤壁(下)》挺好看的,推荐。

Thursday, March 12, 2009

[share] 明明是谣言却普遍被大众相信的传言,今天你被骗了吗(ZT)

摘一段,大家有兴趣看看 [收藏]明明是谣言却普遍被大众相信的传言,今天你被骗了吗(ZT)
相当长见识。

28,以德抱怨
原句:"或曰:'以德报怨,何如?'子曰:"何以报德?以直报怨,以德报德"
——《论语 宪问》
以德抱怨,是我们常听到的一句话了,人们通常理解的"以德抱怨"什么意思呢?就是说:孔老夫子教我们,别人欺负你了,你要忍,被打碎牙齿也要往肚子里吞,别人来欺负你,你反而应该对他更好,要用你的爱心去感化他,用你的胸怀去感动他。
但事实上,我们根本曲解了孔子的原意,我当初,也万万没想到原来在孔子这句"以德抱怨"的后边还跟着另外一段话,什么话呢?子曰:"以德抱怨,何以报德?以直报怨,以德报德!"看完以后,幡然醒悟,原来我们都被某个断章取义的孔子FANS给玩了一把!当时的真实情况是怎么样的呢?孔子的一个弟子问他说:师傅,别人打我了,我不打他,我反而要对他好,用我的道德和教养羞死他,让他悔悟,好不好?孔子就说了,你以德抱怨,那"何以报德?"别人以德来待你的时候,你才需要以德来回报别人。可是现在别人打了你,你就应该"以直抱怨",拿起板砖飞他!看!就因为被人故意省略了一句话,刚烈如火的孔老夫子一下就被扭曲成了现在这个温婉的受气包形象。  




Monday, March 9, 2009

gnu coreutils 之 tar

windows 下我们用 winRAR 来压缩、打包文件,相当爽。
不过,不知大家发现没有,其实用 winRAR 压缩时选择 zip 格式通常会快很多(代价是会比 rar 格式大一些,不过差不多少)。
在 unix 类系统下面,打包压缩通常就是 tar 了。曾经经过相当长时间的折磨,现在来总结一些 tar 的用法。那是相当的简单。
tar cf abc.tar f1.txt f2.txt
命令 [tar] + 压缩命令 [c] + 指定文件命令 [f] + 指定的文件名 [abc.tar] + 要压缩的文件列表 [f1.txt f2.txt]
以上就把 f1 和 f2 两个 txt 文件打包到 abc.tar 里了。这里比较怪异的是 abc.tar 跟 f1.txt 加上 f2.txt 一样大,没有压缩。是不是很逊?还好,继续。
tar zcf abc.tar.gz f1.txt f2.txt
在刚才的命令中加一个 [z],把文件名改一下,那么这个打出来的包就是压缩过的了。 为啥来,因为 [z] 的意思是打包的同时给压缩一下,压缩成 gzip 格式。
tar 内置支持的格式还有一个,比较厉害 bzip2。
tar jcf abc.tar.bz2 f1.txt f2.txt
把上面命令里的 [z] 换成 [j] 即可。
通常,这样压缩出来比 gzip 要小一点(当然,更加耗时),喜好哪种格式看各位吧。
要压缩的文件列表也可以加文件夹进去,那么这个文件夹就可以打包了。
然后看如何解压缩。
tar xf abc.tar
命令 [tar] + 解压命令 [x] + 指定文件命令 [f] + 指定的文件名 [abc.tar]
这个命令就会把包里文件释放出来了。
如果我之前压缩成 gzip 了怎么解压呢?
tar zxf abc.tar.gz
告诉 tar 这个文件是 gzip 格式就行,就是加一个 [z] 参数。
同理
tar jxf abc.tar.bz2
OK,
基本上都搞定了。
还是比较简单的。吧?
再说一些吧,
打包的时候尽量打包目录,这样别人解压缩的时候就不会解压出一堆文件,看的眼花缭乱。
上面各个示例命令的参数里面可以再加一个 v,
可以显示 tar 工作的详细内容,否则他就悄悄的干活,干完了就跑了,你也不知道他都干了些啥。
tar vjxf abc.tar.bz2
应该挺简单的吧。
我学习的时候最先看到的就是最长的 4 个参数一起,根本搞不清都啥跟啥,只能每次用的时候现查。
希望这些文字可以帮助你快一点掌握 tar 的用法。
:)

Monday, March 2, 2009

程序员之制造重复的轮子

最近有感于重复制造轮子这一说法,
其实,每制造一个轮子,就有一批人程序员跟着强大起来。
所以,当我们发现有人在制造轮子的时候, 不要轻信前人总结的一些“不要重复制造轮子”的说法, 找机会抓紧加入制造大军,那么,你就很有可能是这一轮突起中的一员。
万物理相通, 装死干活吧。

what is written for us?

yes, i want to get the answer very much.
so, do you know anything about that?

i think the biggest problem is that i have nothing to share with you.
so, maybe that be an answer to me.

just follow the mind.



其实,以上文字来自观看下面2部电影的感受,热烈推荐:
贫民窟的百万富翁
《好好先生》Yes.Man

Wednesday, February 25, 2009

自然码双拼表

自然码双拼表
Q iu
W ua,ia
E er
R uan,van
T ve
Y uai,ing
U sh,u
I ch,i
O o,uo
P un,vn
A a
S iong,ong
D uang,iang
F en
G eng,ng
H ang
J an
K ao
L ai
Z ei
X ie
C iao
V zh,ui,v
B ou
N in
M ian

a     A
ai    L
an    J
ang   H
ao    K
ch    I
ei    Z
en    F
eng   G
er    E
i     I
ia    W
ian   M
iang  D
iao   C
ie    X
in    N
ing   Y
iong  S
iu    Q
ng    G
o     O
ong   S
ou    B
sh    U
u     U
ua    W
uai   Y
uan   R
uang  D
ui    V
un    P
uo    O
v     V
van   R
ve    T
vn    P
zh    V

Tuesday, February 24, 2009

git 之目录

在本地 local 目录 git init
然后在本地 remote 目录 git init

cd local #developer’s local repository
git pull ../remote master #get the latest code from ‘remote’ repository
git push ../remote master #push the recent commits from here to the ‘remote’ folder 
使用Git remote命令
GitHub 所用的方式比较方便,就像这样:
git remote add origin ../remote/ #one time for all
git pull origin master # pull from the ‘remote’ directory
git push origin master #push recent commits from here to the ‘remote’ folder 
Git加ssh
如果有一个 ssh 帐号的话,那么可以在远程机器上做 git 仓库,那么就可以随时随地的同步了。
git remote add origin ssh://jesper@myserver.com/~/project.git/

在 ssh 机器上设置一下:

$ ssh jesper@myserver.com
Welcome to myserver.com!
$ mkdir project.git && cd project.git/
$ git –bare init
Initialized empty Git repository in /home/jesper/project.git
$ exit
Bye!

git 配合有了 pub/priv KEY 的 ssh,会让人觉得生活很美好。
你觉得呢?


参考:
Using Local File-based Git — Server Laziness

Sunday, February 22, 2009

The Restart Button

生活也许就像电脑一样,
当你遇到无法解决的问题时,
也许重启是最快速有效的办法,
虽然,
这可能会导致你丢失很多你正在进行的事情,
但,
跟老不响应相比,要好很多吧。

GUI + CLI

Finder 中有插件可以实现 open terminal here.

其实,应该可以给 Finder 加一条 terminal 输入框,
然后随时提供当前界面中选择的文件列表变量,比如 $SEL。
那么就可以很方便的做一些操作了,比如 copy,rename,tar 等等。

GUI 的优势在于不规则的选择,CLI 的优势在于 规则的操作,
CLI 的操作比较直接,GUI 的操作大多比较间接,
GUI 的操作大多有多余的操作,比如新建文件夹,在 GUI 中就是 新建 -> 重命名。
而在 CLI 中则是你写好了名字,敲一下回车就创建完毕,是一步操作。

Wednesday, February 18, 2009

Just

等一列地铁要5分钟,
看一场电影要3小时,
月缺月圆要1月,
春去春来要1年,
想念一个人要1生,
说一句关心的话只需要1秒:
天凉了,窝里多垫点草。

看到这条短信的时候心里非常暖,
很是感动。
愿人们都平安。

凡事,从自己出发,换位思考。

Life with CPAN

如果使用 CPAN 遇到问题,就先看看这儿吧,基本上都能搞定。

[译] 使用 ssh 执行远程命令

原文:Run Remote Commands with SSH

ssh 是一个神奇的工具。

你可以使用它连接2台电脑,或者在不登录到终端的情况下在远程机器上执行一段命令。

下面演示如何查看系统磁盘使用情况:

root@admin:~ # ssh root@www 'df -h'
Filesystem Size Used Avail Use% Mounted on
/dev/ubda 3.5G 2.1G 1.4G 61% /
tmpfs 96M 4.0K 96M 1% /dev/shm

是不是很神奇,但好像不是非常有用。 如果你在多台服务器上配置好 public/private key pairs,然后就可以肆意在那些机器上。具体情况,下回分解。

现在呢,你可以通过已有的知识来做很多事情,比如查询服务器上 web服务 的进程数,而不用登录到服务器上然后敲入那些命令。 你要做的只是将要执行的命令用引号引起来然后放到 ssh 命令后面,就行了。 下面给出一个例子:用 root 帐号登录到服务器并查询服务器上的所有进程,将结果通过 pipes 传给本地,通过 grep apache 获得所有 apache 进程,然后通过 grep -v grep 过滤掉 grep apache 命令本身,这样就只剩下 apache 进程了,然后通过 wc -l 就能得到所有的 apache 进程数了。

root@admin:~ # ssh root@www 'ps -ef | grep apache | grep -v grep | wc -l'
11

或者看看如何显示系统的资源使用情况和最占用 CPU 的进程:

root@www:~ # ssh root@www 'top -b -n 1 | head -n 8'
top - 11:01:04 up 20 days, 6:47, 1 user, load average: 0.44, 0.21, 0.09
Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.7% user, 1.5% system, 0.0% nice, 96.8% idle
Mem: 195620k total, 186276k used, 9344k free, 16380k buffers
Swap: 525304k total, 516k used, 524788k free, 26912k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 7399 root 19 0 936 936 740 R 9.2 0.5 0:00.20 top

或者只是看看都谁登录呢:

root@www:~ # ssh root@www 'who'
brock pts/0 Oct 21 10:31 (75.72.194.149)
jim pts/1 Oct 25 06:25 (128.101.163.128)

如果你想知道怎么样才能在执行上面命令的时候不用输入密码,你可以看看这一篇 设置 SSH keys ,下次登录就不用输入密码了

[译] 设置 SSH keys ,下次登录就不用输入密码了

原文:Setting up SSH keys for access without a password

Monday, February 16, 2009

笑话一则

唐僧师徒一行经历九九八十一难终于见到了如来佛求取真经
如来问:"你们带U盘了么?"
唐僧师徒。。。。
如来又问:"移动硬盘呢?"
。。。。。
如来继续问:"IPOD也可以哇"
悟空挖起耳朵来
如来叹了口气:"那你们就原路回去吧,我用QQ传给你们
唐僧:靠,早知道加你QQ就完了,老子还走这么远干嘛

如来突然想起什么,
又问:你们带MP4没有? 
唐僧师徒:…… 
如来:那你们路上是怎么娱乐的? 
唐僧师徒:打怪升级

Tuesday, February 10, 2009

sqlite3 "database disk image is malformed" 错误

今天遇到 sqlite3 数据库错误 "database disk image is malformed",G 了一下,搞定,遂记录,帮人帮己。

假设原数据库名 abc.sqlite3

#bash
>>sqlite3 abc.sqlite3
然后
.output "_XB_D.tmp"
.dump
.quit

再建个新数据库 abc2.sqlite3

#bash
>>sqlite3 abc2.sqlite3
然后
.read "_XB_D.tmp"
.quit

然后修复原来的数据库名和文件权限,应该就没事了。

以上代码来自 文件 RepairUR.zip


参考 Forum of kinook

Saturday, February 7, 2009

[emeditor宏] 插入HTML标签

不知道如何解释,用过 DW 的人应该知道 Ctrl + T ,这个就是模拟那个的,不过没有自动提示就是了。
建议将这个宏也设置快捷键 Ctrl + T 。(具体设置请参见 Emeditor Macros Help)

输入(将~换成空格)输出
table <table>{原来选中的文字}</table>
table~ <table width="100%" border="0" cellpadding="0" cellspacing="0">{原来选中的文字}</table>
table~,tbody,tr,td <table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td>{原来选中的文字}</td></tr></tbody></table>
div#abc,p <div id="abc"><p>{原来选中的文字}</p>>div>
div#abc,p,a~,img~ <div id="abc"><p><a href="#"><img src="" width="" height=""/>{原来选中的文字}</a></p>>div>
规则:
  • 将输入作为标签名,补齐开始和结束标所需
  • 如果只是签名和空格,则将空格用一些默认属性填充,具体见 autoprop
  • 遇到逗号(,),则将逗号分割的各词单独补齐成为标签,并将后面的标签添加为前面标签的子标签
  • 之前选中的文字则作为最内层标签的内容,如果最内层是自闭合标签,则之前选中的内容跟随最内层标签后面
待完善功能:
  • 是否使用其他符号替代空格来补齐默认属性
  • 可以更好的交互编辑,类似 TextMate 的 tab 模式
  • 增加同层节点,现在只能创建多层子节点
var tag, autoprop={ a: 'href="#"', div: 'class=""', style: 'type="text/css"', link: 'type="text/css" rel="stylesheet" href=""', script: 'type="text/javascript" src=""', input: 'type="" name="" value=""', img: 'src="" width="" height=""', table: 'width="100%" border="0" cellpadding="0" cellspacing="0"', iframe: 'frameborder="0" scrolling="no" width="" height="" src=""' }, sigletag={'br':1, 'link':1, 'hr':1, 'col':1, 'input':1, 'meta':1, 'img':1}; if(tag = prompt("请输入标签:", "div")){ if(tag.indexOf(',')==-1){ var t = buildTag(tag); document.selection.Text = t[1] + document.selection.Text + t[2]; }else{ var tags = tag.split(/, */), rstr = '', rstr2 = ''; for(var i=0,iM=tags.length;i<iM;i++){ tag = buildTag(tags[i]); rstr += tag[1]; rstr2 = tag[2] + rstr2; } document.selection.Text = rstr + document.selection.Text + rstr2; } } /* 返回 [标签,起始标签,结束标签] */ function buildTag(t){ var tagname=t.split(/ +/)[0]; var autoa = (t == tagname + ' ') && (tagname in autoprop); if(tagname.match(/[#\.]/)){ var id = tagname.match(/#([^\.]+)/), cls = tagname.match(/\.[^\.]+/g); t = tagname = tagname.match(/^([^#\.]+)/)[1]; if(id)t += ' id="' + id[1] + '"'; if(cls){ t += ' class="' + cls.join(' ').replace(/\./g, '').replace(/ +/g, ' ') + '"'; } if(autoa)t += ' '; } if(autoa){ t += autoprop[tagname]; } return [tagname, "<" + t + (tagname in sigletag ? ' />' : '>'), tagname in sigletag ? '' : ("</" + tagname + ">")]; }

date js

关于日期时间操作的 js 函数库 date-js 。简单实用。

/** date set() clone() fmt() Y() ~ FullYear m() ~ Month d() ~ Date H() ~ Hours M() ~ Minutes S() ~ Seconds s() ~ Milliseconds t() ~ Time [static] from() 使用示例 var d = date(), D = new Date(); D.getMonth() == d.m() D.getFullYear() == d.Y() D.setFullYear(1999) == d.Y(1999) D.setHours(8) == d.H(8) d.set('m+1') == D.setMonth(D.getMonth() + 1) d.set('Y2008m0') == (D.setFullYear(2008) && D.setMonth(0)) d.fmt('%Y-%m-%d %H:%M:%S.%s %%s') == '2009-02-04 22:23:45 %s' set() 如果带 +/- 操作,那么表示将相应的项添加或者减少(W 表示增减周.7天.)。 如果不带 +/- 操作,那么: Y 的设置将自动取当前年的前 n 位补齐 Y 不够 4 位的部分,例如 Y34 会被认为是设置 2034 年,Y123 会被认为是设置 2123 年(假设当前时间为 2009年)。 M 的操作会按照月份的数字设定,比如 M1 将设置月份为 1月,M12 设置月份为 12月,M0 则设置为上一年的最后一月(年份会自动减小)。 W 的操作会设置周几,比如,假设当前为周三,那么 W1 会将日期前移 2 天(到周一),W0 会将日期前移 3 天,到上周日,W7 会将日期后移到本周日,如果设置大于 7 也可以,不过应该比较难理解了。 其他按照字面意思进行。 示例: Q: 这个月有多少天? A: d.set('M+1D0').D() Q: 上个月有多少天? A: d.set('D0').D() Q: 5 月有多少天? A: d.set('M6D0').D() Q: 这周的第一天是哪天,最后一天呢(假设第一天是周一)? A: d.set('W1'), d.set('W7') Q: 如果要显示这个月的日历,那么第一天和最后一天是什么(假设第一天是周一)? A: d.set('D1W1'), d.set('M+1D0W7') Q: 上一个问题中,如果所有日历都显示 6 周,那么最后一天如何计算? A: d.set('D1W1'), d.set('D1W7W+5') */ var date = (function(){ function now(){return new date()} function iter(obj, fn, o){ o = o || obj; if(!(obj && typeof obj == 'object')){ return; } var i, l = obj.length; if(typeof l == 'number'){ if(l){ for(i=0;i<l;i++){ if(fn.call(o, obj[i], i, obj) === false){ break; } } } }else{ for(i in obj){ if(obj.hasOwnProperty(i)){ if(fn.call(o, obj[i], i, obj) === false){ break; } } } } return iter; } function mixin(target, source){ for (var x in source) { target[x] = source[x]; } return mixin; } function date(Y, m, d, H, M, S, s){ var r = this; if(this instanceof date){ this._d = new Date; }else{ r = new date; } if(arguments.length){ r.t(new Date(Y, m, d, H, M, S, s).getTime()); } return r; } mixin(date, { conv:{ 'Wm':10080, 'dm':1440, 'WS':604800, 'dS':86400, 'Ws':604800000, 'ds':86400000, 'Hs':3600000, 'Ms':60000, 'Ss':1000, 'ss':1 }, from:function(s){ return new date().set(s); } } ); iter( { Y: 'FullYear', m: 'Month', d: 'Date', H: 'Hours', M: 'Minutes', S: 'Seconds', s: 'Milliseconds', t: 'Time' }, function(v, k){ date.prototype[k] = (function(s,g){ return function(v) { v!==undefined && v!==null && this._d[s](v); return this._d[g](); } })('set' + v, 'get' + v); } ); mixin(date.prototype, { set: function(str){ var d= this; str.replace( /[YmdWHMSs][+-]?\d+/g, function(w){ w= w.match(/(\w)([+-]?)(\d+)/); var f=w[1], //key v= w[3], //value s= w[2]; //type(+/-) if(s==''){ if(f=='Y' && v.length < 4){ v= '' + String(now().Y()).slice(0,4-v.length) + v } if(f=='m'){ v= parseInt(v)-1; d.m(v); }else if(f=='W'){ v= parseInt(v)-d.getDay(); if(v){ d.set('d' + (v>0?'+':'') + v); } }else{ d[f](parseInt(v)) } }else{ v= parseInt(s+v, 10); if(v){ switch(f){ case 'Y': case 'm': d[f](d[f]()+v); break; default:// dWHMSs d.t(d.t() + v * date.conv[f+'s']); break; } } } return '' } ); return this }, fmt: function(str){ if(!str){ str = 'YY-mm-dd HH:MM:SS'; } var d= this; return str.replace( /%([YmdHMS%])/g, function(w, s){ return s == '%' ? s : (('' + d[s]()).replace(/^(\d)$/, '0$1')); } ); }, clone:function(s){ return new date(this.t()).set(s); }, toString: function(){ return this._d.toString.apply(this._d, arguments); }, valueOf: function(){ return this._d.valueOf.apply(this._d, arguments); } } ); //date.prototype.str = date.prototype.format = date.prototype.strfmt = date.prototype.fmt; return { iter: iter, mixin: mixin, date: date, now: now }; })().date;

电脑使用心得 之 Gmail

Gmail
特点
空间比较大(>7G),附件限制还行(<20M)。
支持快捷键,安全链接,快速回复,快捷操作,与 IM 系统整合,附件预览(word, pdf, ppt, 图片, mp3, excel 等),多附件打包下载。
操作前设置(打开快捷键,并将输入法设为英文)
我的邮件管理原则
保持 收件箱(Inbox) 里的邮件最少;
星号和收件箱只临时存放一些待处理或需要特别提醒自己的邮件,星号表示待处理很紧急或重要。真正内容重要的邮件通过标签管理;
多用快捷键可以显著提高时间利用率,平时可以多 ?(问号) 来查看各操作的快捷键;
习惯使用 搜索(Search)功能;
订阅的新闻组通过创建 过滤(filter) 规则自动标签并 存档(Archive),在想看的时候自己去看。如果新闻组提供 RSS,则通过 GReader 订阅;
常用快捷键
C 创建新邮件(shift + c 会在新窗口中创建新邮件)
g, i 查看 收件箱(Inbox) 逗号表示先按 g,然后紧接着按 逗号 后面的按键(不是同时按,加号连接的才同时按,并且按键不分大小写,只是按键而已)
g, a 查看 所有邮件
g, s 查看打星的邮件
还有很多,自己看吧 :)
邮件操作(收件箱,打星邮件,所有邮件等等)
在 收件箱里通过 J/K 键来上下选择邮件,这时候邮件前的方框应该是没有选中的,可以通过 X 键来选中(除了打开邮件外,其他操作都需要选中邮件);
  选中邮件后,虽然一般是先看看邮件内容再做操作的,但是你也可以直接:
    E 存档,把他移出收件箱,之后可以到 所有邮件里找到(说明我不用看内容就知道这个邮件的用处了,最好还是慎用,加入邮件里有你不知道的内容呢!);
    #  删除,只能在 垃圾箱里找了(如果你 30 天都没找,他就没了);
    S 打星,表示这个很重要;
    Shift + i   设置为已读;
    Shift + u  设置为未读(这 2 个有啥用?自己想想吧,我也不知道)
    .  或者 鼠标点击, 打标签或者更多操作(探索一下吧)

  如果需要看看邮件再做操作,那么 O 或者回车 打开邮件,然后:
    如果打开邮件后想返回,按 U 即可;
    如果觉得很垃圾,就 # 把它删除(会被放到 Trash 里去,给你后悔的机会,如果你在 30 天内都对他不理不睬,将自动被完全删除);
    如果觉得觉得需要稍后处理则 J 继续看下一封邮件;
    如果觉得看完即可,则直接 E 存档(把它移出收件箱<我不习惯看到 收件箱里很多邮件>);
      如果想存档并立即看下一封,可以用 y, o (我还没用过..)
    如果觉得很重要则 S 标记个星号(Star),记得及时将不再重要的邮件的星号去掉,太多星号邮件跟没有一样,慢慢的你就又懒得去管理星号了;
    如果邮件应该分类,则在 更多操作里选择相应的标签(Label),此处可以点击那个下拉列表也可以通过 .(英文句点) 调出(标签的具体分类稍后说);
    如果使用了 Gmail 实验室(labs) 里的 任务(Task) 功能,可以 Shift + T 使用当前邮件建立新的 任务;
    如果需要回复(Replay),则直接在邮件下面的输入框里输入就可以,转发也一样方便;
    如果对方也使用 Gmail 并且需要回复的内容较少或者需要回复的内容关联性不强,可以使用聊天的方式回复(ie6 不支持);
标签系统的使用
标签跟文件夹有什么区别?
没什么区别,标签可以当成文件夹使用,标签比文件夹更加灵活易用;
一封邮件可以打上多个标签,就相当于你把一封邮件放到多个文件夹里去;
Gmail 的标签不支持级别,但是你可以自己搞定,比如命名时加 / 来使得标签看起来像是有层级(有插件可以将这样命名的标签显示成树形结构,不过标签少的时候无所谓);
如果打开了 实验室 里的 Goto Label,则在界面中按 g + l 就会弹出一个框让你输入标签,且有自动提示功能,相当方便(前提是你要熟悉自己都建了哪些标签,并且起中文名字会很吃亏);
标签可以设置颜色,你可以设置一些醒目的颜色以标明某些邮件很重要、很垃圾或者很XX;
你可以创建一个过滤规则,对 邮件标题、邮件发送地址 做一些判断,然后把这些邮件打上你喜欢的标签,这样 收件箱里就会五彩斑斓,你也可以决定先看哪个后看那个了;
标签的命名
  • 各种账户(account)信息______________a/XXX
  • 各种论坛/邮件列表(maillist)/新闻组____ml/XXX
  • 工作(work)相关____________________w/XXX
  • 朋友(friend)相关____________________f/XXX
  • 家庭(home/family)相关______________h/XXX
  • 广告信息_________________________ad/XXX
  • 其他_________________________这个就自由发挥吧。
邮件过滤器(Filter)
在界面顶部搜索按钮右侧有个链接 创建过滤器(Create a filter),点击就可以开始创建过滤了,总共 2 步,
设置规则,设置动作。
都很简单,自己试试就行了。
标签、过滤器使用演示
将 "小丽" 发来的邮件都打上标签 h/Xiaoli ,并且在标签面板里将 Xiaoli 标签的颜色设置为大红色,这样以后凡是 小丽 发过来的邮件都会被红色标签打头标出来。
139 邮箱 有个功能是将新邮件以短信的形式发送到手机上,那么你在设置过滤规则的时候可以考虑将上面的邮件转发到你的 139 邮箱,这样就会获得短信通知(之所以这么做是因为 Gmail 还不支持短信通知);

OK,就这么多,
下次说说 聊天(Gtalk)功能,还有一些推荐 设置(Setting)。
希望有用。

另:
这里所说的只是我的一些使用习惯和方式,并没有什么其他意思。
如果你还没有或者不满意自己的习惯可以参考一下我的,
如果你有自己的习惯并愿意公开,欢迎分享。
:)

Friday, February 6, 2009

[Rel] JavaScript正则表达式生成器

看到写的东西,找不到留言的地方,遂自己写一个。

//原始实现 function convertToJsEsc(chars) { var result = ''; for(var i=0; i<chars.length; i++) { var code = chars.charCodeAt(i); switch (code) { case 0x20: result += "\\s"; break; case 0x22: result += "\\\""; break; case 0x27: result += "\\\'"; break; case 0x28: result += "\\("; break; case 0x29: result += "\\)"; break; case 0x2A: result += "\\*"; break; case 0x2B: result += "\\+"; break; case 0x2E: result += "\\."; break; case 0x2F: result += "\\/"; break; case 0x3F: result += "\\?"; break; case 0x5B: result += "\\["; break; case 0x5C: result += "\\\\"; break; case 0x5D: result += "\\]"; break; case 0x7B: result += "\\{"; break; case 0x7D: result += "\\}"; break; default: if(code > 0x1F && code < 0x7F) { result += chars[i]; } else { result += "\\u" + code.toString(16).toUpperCase(); } break; } } return result === "" ? "Nothing to convert" : result; } //我的修改 function convertToJsEsc(chars) { return chars && chars.replace( /([ "'\(\)\*\+\.\/\?\[\\\]\{\}])|([\x1F-\x7F])|(.)/g, function(all, a, b, c){ return a ? ('\\' + (all==' '?'s':all)) : b ? all : ('\\u' + all.charCodeAt().toString(16).toUpperCase()); } ) || 'Nothing to convert'; }

有啥区别?
优点:方便修改
缺点:难于理解。