下载到一个 .tar.bz2 文件,
直接 tar -jxf abc.tar.bz2
忽然发现目录下一下子多了很多很多文件,几百个。
不禁犯愁。最后解决如下:
$ mkdir _abc
$ mv $(tar -jtf abc.tar.bz2) _abc/
说明:
tar -jtf abc.tar.bz2 列出压缩包里面的所有文件,也就是刚才解压出来的文件列表,把这个列表传给 mv ,那这些文件就转移了。
:)
忽然发现目录下一下子多了很多很多文件,几百个。
不禁犯愁。最后解决如下:
$ mkdir _abc
$ mv $(tar -jtf abc.tar.bz2) _abc/
说明:
tar -jtf abc.tar.bz2 列出压缩包里面的所有文件,也就是刚才解压出来的文件列表,把这个列表传给 mv ,那这些文件就转移了。
:)
ifconfig |egrep -o 'inet addr:[0-9.]+'|egrep -o '[0-9.]+'
发现用 linux 越多,越来越多的知识点都糅合起来,
越来越得心应手~。
传统很强大,很好。
勤奋。。。。。。。
作用:
计算 apache 总共用了多少内存,
单位是 kb。
有张某银行的信用卡,因为很久不用,偶然有个短信告诉我扣了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__
下面说心得:
01. 想去一个地方工作的话,弄清楚人家是做什么的,有什么主要业务,核心产品是什么很有必要的。
人家不会怕你烦的。
02. 做技术的人年轻的时候要深入的了解与掌握自己手头上的工具。所谓了解是指明白其工作原理,
虽然你会说,我又不做这个!但是了解其深层次的原理以后,会让你更好更有效的使用工具。
就好像写html的应该看看浏览器解析页面的机制。时间有限的时候就看看别人的分析,时间充裕
的时候就自己看浏览器实现代码(ff 和 webkit 都开源)。
掌握是什么呢?就是要熟悉工具的常用知识,比如关键字、常用函数、方法、类型等。虽然大多数
时候会有文档在手,不过熟练掌握的知识越多越好,所以,我们永远都不会闲的无聊。这就像练武
之人要时常练习一样,日久生疏。你每天都用的东西,总不能每天都需要翻帮助吧。每次翻出来,
删掉自己重写一遍,如此几次,慢慢会记住的,不可以过于依赖文档。
掌握是我薄弱的地方,以后会多加练习。
03. 多沟通,很多想法憋在肚子里烂掉了自己都不知道,说出来。
有时候有些话一出口,会自然带出很多你意想不到的东西来(当然,也有可能是不好的东西,稍微慎重一些)。
04. 身边常备纸笔熊。
纸笔拿来记录及草稿,
熊拿来表达不满、困惑和纠结——效果应该跟人差不多,好处是保护了秘密、朋友和自己。
--end--
curl 'http://www.sohu.com/'|sed -n
's~^.*//\([a-zA-Z0-9_\.\-]\{1,20\}\.sohu\.com\).*$~\1~p'|uniq
果然对 bash 用的还不好啊。
还是熟悉js。
这么做的理由是什么呢?
没想法。
今天翻旧文章,
看到说 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/>。
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
;)
仅记录为自己所用,
如果疑问,
欢迎讨论。
:)
最近在找是否有文件系统是基于 标签 和 版本 来管理文件的,
就是说我可以随便的丢一个文件进系统中,可以任意、无限的标签它。
也可以随便的修改,每一次修改都会被记录,我不用另存,不用复制,只需要删除我不需要的中间版本即可。
至于文件的获取,可以通过搜索+浏览来实现,其实 搜索 在 Mac 中已经很流行,
只是他的文件系统好像还不是很能够随意的让我去丢文件进去,因为大多数时候还是需要我自己去目录下面翻文件,
不知道 spotlight 是搜索文件的哪些 metadata 的。所以嘛,不了解细节对我这样的人来说,用起来很痛苦。
这种东西可能跟 linux 下的 find、grep 重复,不过,在现有的文件系统下存储,
仍然需要建立复杂的目录和 ln -s 连接才可以模拟这样的效果,
如果有软件可以更加方便的使用 ln 来模拟就更好了。
就是说我可以用 ls x
来开始搜索,然后 tab 补齐(可以考虑列出来,直接、直观的选择),比如 abc,
加斜杠的意义就是在所有标有 abc 标签之下再检索,再自动补齐,然后觉得满意了直接回车,然后出来所有满足条件的文件。
添加 文件类型、文件、版本、使用频率 之类的检索条件,比较完美了。
对于文件保存,几乎不覆盖,而是类似增量保存,然后可以选择抛弃某个版本。
有啥想法呢??
或者有啥推荐呢?
有任何兴趣或者建议,请 mail(kindy61 在 G邮箱) 我。
世界上的事情分为可探知和不可探知。
我做的事情几乎都属于可探知范畴,就是说,只要愿意,都可以学习到,可以探寻源头,才根本上知晓一切。
很大的一个原因是:这些东西是人类创造的,总是有据可循的。
人就不是,人不是人创造的(虽然是人制造的),所以很多东西是未知的,也是比较不可查的,虽然有心,但是也未必能全部搞清楚,这样的事情让我这样的人抓狂——我对此无能为力。
有时候陷入一些死胡同,有心却无力。
心走的太快,行为、动作跟不上,干脆就放弃,
如此往复,心越走越远,行动和行为越来越跟不上了(其实行动和行为也受心的控制,只是有时候就是控制不了)。
近来发觉在挺多方面都是这样的状态,
知道的太多,实践的太少,所以就形成了越想越多,甚至有些飘渺与脱离实际,
而行动上却一点也没有,形成了巨明显的好高骛远。
更加的无法开始行动。
这是一个可怕的事情。
PS: blogger 的可视化编辑器很难用。只能用 html 编辑模式比较好。
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 的大力帮助。 这篇文章也比较好。
此为译稿,原始来源: 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 上跟随以下步骤来创建上面类似的视频。
下载并安装一个命令行下拍照的工具:isightcapture
http://www.macupdate.com/info.
打开这个 dmg 并复制 isightcapture 到/usr/bin/
sudo cp /Volumes/isightcapture1_1/isightcapture /usr/bin/
创建一个目录来保存我们的视频和图片,假设为 ~/captures/ 。
cd ~ mkdir captures mkdir captures/scripts mkdir captures/series
创建一个脚本,用于捕捉并保存图片:
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
把这个脚本变成自动运行的:
crontab -e
然后这么写:
* * * * * ~/captures/scripts/captureme.sh
保存,退出(:wq)
做到以上步骤,你的电脑已经每分钟拍一张照片,并且保存到 ~/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/
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/
./configure --enable-shared --disable-mmx
sudo make
sudo make install
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
View the finished result Browse in finder to your home directory > captures/videos and watch the result.
本教程是让你可以开始写 python 代码,面对的是新手中的新手。
学习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,到此为止,后面请移看 此篇(这篇文字的目的是把这个文章的入门描述清楚)。
曾经看一部科幻片(太空堡垒卡拉狄加),讲人造机器人的。
机器人进化到一定时刻,开始反抗人类,而凭借机器人自身的优势,
迅速占领了人类生活的星球。人类中小部分人幸免于难,乘坐若干艘飞船逃难,
过程中,发现机器人可以以人的姿态出现,并且混杂在幸存的人中。
因此,指挥官(commander)答应某人(A)的申请,成立独立的调查团,
查找可能混在人中的机器人。
在几经查找后,最终查到了指挥官,开始指挥官是配合的,但是,当后来越发的
“莫须有”时,指挥官开始意识到组成这样的调查团已经失去了意义,所以打算解散这个调查团。
但是,调查团内其他人(类似民主人士,而且人们的意识比较美国化)说:我们是独立的,你无权解散我们。
这时候,边上的士兵们遇到一个抉择:忠于指挥官——他们一直的最高领导人,
或者忠于调查团——当时独立的组织。可以看到,士兵们当时是有疑惑的。不过,在指挥官的
几句话下(忘记了什么话),他们逮捕并软禁了 A。
看到这段冲突的时候,我心里很凉。
指挥官说:调查的目的是保护人民而不是怀疑、审判人民。
之前还说了:之所以军队和警察分开,是因为面对的是不同的敌人。
胡乱说了一气,也不知道在说啥,
不过这些感受是当时就有的,看到令狐虫写的浪潮,就也把我当时的感受写一下,了做记录吧。
人的顿悟是比较容易的,困难的是遇到合适的机遇。
很多时候受知面比较小,所以顿悟的机会也比较小。
通过认识的、关注的、提前顿悟的人们的帮助,也会比较容易顿悟。
算是,取之于社会,用之于社会吧。
现在的生活太多获取,太少付出。
就像大多数人总习惯于google 或者 baidu,你搜索出来的结果
总是某人写出来的,你自己,又贡献了多少内容让别人搜索呢。
在自己得到的同时,把自己的心得、体会写出来,也算是对别人的帮助的一种回报吧。
我承认,我被绕进去了。
// 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))
今个儿去拔牙了。
现在脸好多了,摸起来像是在摸脸,
刚拔完那会儿摸起来不知是啥感觉,
就像在摸一块猪肉皮一样。
嗯,是这样的感觉。
就算不是猪肉皮,
也是肉皮。
只有触觉,
没有其他感觉。
拔牙后不要做吮吸这样的动作,
会造成口腔内压减小,
造成拔牙创口流血。
我喜欢你,
非常喜欢你。
好吧,
我承认,
我见识过的这几对几乎都差不多的。
实在是都很类似。
也许,
这些事情都差不多。
就那么点事。
哈哈,
咋就都差不多呢。
呵呵。
太,
可爱了。
知道我谁啥,
知道我说什么,
等他们成了,
再摆出来。
哎,
好像有点卑劣了。
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()
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,自己实现一遍。
只是,
比较仰慕这些已经完善的实现而已。
有对这有兴趣人不,可以一起来搞嘛。
先看测试
[]==false ? 'false' : 'true'//false []==true ? 'true' : 'false'//false Boolean([]) ? 'true' : 'false'//true (![]) ? 'false' : 'true'//true ([]) ? 'true' : 'false'//true
为啥有时候是 true,有时候是 false 呢?
参看:
逻辑AND(&&)运算符
MySQL提供多种索引类型供选择:
选择索引列
在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。
MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。
tar cf abc.tar f1.txt f2.txt
tar zcf abc.tar.gz f1.txt f2.txt
tar jcf abc.tar.bz2 f1.txt f2.txt
tar xf abc.tar
tar zxf abc.tar.gz
tar jxf abc.tar.bz2
tar vjxf abc.tar.bz2
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
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
在本地 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 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 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,会让人觉得生活很美好。
你觉得呢?
生活也许就像电脑一样, 当你遇到无法解决的问题时, 也许重启是最快速有效的办法, 虽然, 这可能会导致你丢失很多你正在进行的事情, 但, 跟老不响应相比,要好很多吧。
Finder 中有插件可以实现 open terminal here.
其实,应该可以给 Finder 加一条 terminal 输入框,
然后随时提供当前界面中选择的文件列表变量,比如 $SEL。
那么就可以很方便的做一些操作了,比如 copy,rename,tar 等等。
GUI 的优势在于不规则的选择,CLI 的优势在于 规则的操作,
CLI 的操作比较直接,GUI 的操作大多比较间接,
GUI 的操作大多有多余的操作,比如新建文件夹,在 GUI 中就是 新建 -> 重命名。
而在 CLI 中则是你写好了名字,敲一下回车就创建完毕,是一步操作。
等一列地铁要5分钟, 看一场电影要3小时, 月缺月圆要1月, 春去春来要1年, 想念一个人要1生, 说一句关心的话只需要1秒: 天凉了,窝里多垫点草。
看到这条短信的时候心里非常暖,
很是感动。
愿人们都平安。
凡事,从自己出发,换位思考。
原文: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 ,下次登录就不用输入密码了
今天遇到 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
不知道如何解释,用过 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> |
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 + ">")];
}
关于日期时间操作的 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;
在 收件箱里通过 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 不支持);
OK,就这么多,
下次说说 聊天(Gtalk)功能,还有一些推荐 设置(Setting)。
希望有用。
另:
这里所说的只是我的一些使用习惯和方式,并没有什么其他意思。
如果你还没有或者不满意自己的习惯可以参考一下我的,
如果你有自己的习惯并愿意公开,欢迎分享。
:)
//原始实现
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';
}
有啥区别?
优点:方便修改
缺点:难于理解。