2008年12月25日

rhythmbox 歌词滚动的插件

一直找不到rhythmbox的歌词显示插件,抽空整了一个

基于网上原有的 ttplyrics 0.4 版本,参考 python-osd 和 musicapplet 的代码,凑出来的
我对python不熟,有需要的将就着用吧,期待python熟手进行优化

文件解包到 $HOME/.gnome2/rhythmbox/plugins/ttplyrics
biff@lenovo:~/.gnome2/rhythmbox/plugins/ttplyrics$ ls -l
总用量 36
-rw-r--r-- 1 biff biff 8370 2008-12-24 20:05 dbus_pyosd.py
-rw-r--r-- 1 biff biff 3473 2007-08-20 23:23 ttpClient.py
-rw-r--r-- 1 biff biff 14509 2008-12-24 20:16 ttplyrics.py
-rw-r--r-- 1 biff biff 333 2007-08-20 23:23 ttplyrics.rb-plugin

启动rhythmbox后,ttplyrics会取到歌词,歌词在 $HOME/.lyrics目录下,dbus_pyosd.py 会将歌词显到屏幕上。

可以单独运行 dbus_pyosd.py ,运行后 rhythmbox被自动启动,控制台有调试信息

附件和问题解决在这里下载
https://groups.google.com/group/binsos

--
---------------------------------
google talk
shaozx@gmail.com
---------------------------------

Linux下远程登录的脚本

Linux下面没有象NetTerm或SecureCRT之类好用的登录管理工具,管理一大堆服务器地址和记住这些口令是件令人头痛的事情。
这是我自已用的一个自动登录脚本,支持SSH和TELNET。
分两个文件,to和to.hosts。
to 的用法是 to 跟主机名,如 to myserver,然后脚本就会自动在to.hosts文件里面找有没有定义这个主机,如果有,就取出主机地址、用户名、密码进行登录。
to.hosts文件可以定义多个主机,定义格式如下:
[demo1]
host=192.168.235.1
name=john
pass=john123
type=telnet
code=gb2312

[demo2]
host=192.168.1.77
name=hap
pass=hap
type=ssh

demo1/demo2是代号,如 to demo1 就会自动用telnet登录192.168.235.1主机。
host/name/pass是主机地址、登录用户名、口令
type可以是ssh或telnet,指定登录类型
code用来指定远端编码,如果你本地是终端用的UTF8,而远端是GB码,登过去后就会显示乱码,这时候可以指定自动进行编码转换

需要安装 python-pexpect 支持。
sudo apt-get install python-pexpect
将to文件放到PATH路径去,配置一个主机

biff@lenovo:~/bin$ to dxpt
dxpt@158.222.2.11's password:
短信平台11:/home/dxpt>
##################################################
# auto login success, have a lot of fun ... #
##################################################
ssh://dxpt@158.222.2.11
短信平台11:/home/dxpt>

---------------------------------------------
附件在这里下载
https://groups.google.com/group/binsos/browse_thread/thread/29fcf78c5c3236ee
如果你用上了,或有什么问题,请邮件联系我!
--
---------------------------------
google talk
shaozx@gmail.com
---------------------------------

2008年9月15日

国内IT仍然是一片原始生态

今天看了Android开发竞赛的新闻,对这些中小型规模公司的运作存在一些想法,如果这样的公司在国内会是怎么样的呢?
从技术上讲,现在国内能够进行软件创新的人还不多,市面上能揽到的程序员质量都一般,招聘市场上有句话说:牛人都是靠介绍,不去招聘市场的。可以这么形容:国内这些牛人都如繁星点缀,还没有形成一个真正的人才集市。
从经济水平来讲,普通程序员的工资水平仍然停留在养家糊口的阶段,项目策划能力和对抗项目风险的能力不够。
从社会环境来说,政策和市场环境有一定的改善,但是行业竞争和模仿仍然不利于小公司的生存。

2008年4月1日

Wikipedai 与 Blogspot 在中国解封

Moses 写道 :
"今天,除了中文 Wikipedia 以外的所有 Wikimedia 项目和 Blogspot 已经可以在中国访问。 包括 Wikipedia 在内的 Wikimedia 各个项目,连同 Blogspot 上的大多数 Blog,此前已经在中国被封锁很多年。今日的突然解封,可能只是一個愚人节玩笑?"

转自 http://internet.solidot.org

2007年11月27日

只需 $299 就能拥有一套3D桌面系统

今天在国外的一个网站上看到 LINUX PC 的宣传

只要 299 美元!!你就能拥有一套3D桌面系统

1、从广告策划来讲,对消费者屏蔽了专业术语(其实很多人并不知道 LINUX 的)

2、从计算机来讲,大家都知道 XP 是没有 3D 桌面的,于是心理上给消费者一个"比 xp 更好"的感觉

宣传很到位,很经典!

2007年10月23日

Intel 声卡不能用 ALSA驱动

新买的T61用的Intel声卡,用Mplayer时只能用 OSS驱动,改成 ALSA 就报找不到声卡

今天偶然的切到另外一个新用户环境下面去,发现居然可以用ALSA,估计是老的环境变量设置引起ALSA的设置不对。

受了好几周的罪,今天终于解决了:
biff@lenovo:~$ asoundconf list
Names of available sound cards:
Intel
biff@lenovo:~$ asoundconf set-default-card Intel
biff@lenovo:~$
然后就OK了

(并不象网上所说的不能用ALSA驱动,也有可能是网上的资料有些老了)

2007年9月23日

用LINUX当桌面的4个理由

有时候想想为什么非要坚持着用LINUX当桌面,其实真的不如WINDOWS好用!

可能有这样几个理由:

1、因为LINUX上体现的都是最前沿的技术,作为一个搞技术的人,就是应该在最前沿的试验基地工作,这样才能跟上最新的技术发展,比如Ruby、Python、VM等等

2、很多方面,微软的技术比LINUX更先进,必竞资金更雄厚、人才储备更非富,但是,微软的特点是将技术的复杂性掩盖,所以,到了用户手上的东西都是傻瓜式的,这对学习技术是不利的

3、微软的垄断地位导致竖敌过多,与其一颗树上吊死,还不如脚踏两条船;虽然LINUX可能更短命,但是可能踩死它的人在技术上与其有相似性,比如FreeBSD、OpenSolaris,技术跨度相比WINDOWS要小

4、虽然LINUX成为主流桌面仍然希望渺茫,但是,既然WINDOWS是傻瓜式的操作系统,等到LINUX跨台了再回过头学WINDOWS也不迟,吃着碗里看着锅里,两头都不耽误

当然,这些都是针对技术人员的,所以,非技术人员是没有理由优先选用LINUX的!

2007年9月8日

Google 离死亡还有多远?

本来 Google 用得好好的,好几年了没想过搬家

但是最近,情况真个儿的变了,Google 瞌睡了!!

先是 Google Talk 伤了心
一直不出 Linux 的语音版
群聊功能一拖再拖
其实 GFans 真的是非常强大的
我们都有信心将 Google 的产品支持到底
但是 GT 真的不如 QQ 好
想传个文件还真挺困难
所以门前冷清,也拉不到几个朋友过来凑数

你说说,啥时候咱 LINUX 上也能用上聊天室,用上语音视频?
当然,还有那把截屏的剪刀,眼馋啊



过了些时候,Google又出了输入法
咱等啊,等啊
就没声音了
咱是用五笔的,五笔是没指望了
咱是用 Linux 的,Linux 是没指望了

搜狗拼音咱没指望,可咱指望过你呀,
你不是支持 Linux 好多年了吗,还喊着要回报社区
群组里那么多人提五笔,渴望出个Linux版本,你咋就低调处理了呢



这段时间 QMail 不是闹得凶嘛
咱不用,也不能不去占个坑啊
又去瞧了瞧
嘿,QQ上的哥们那个活得快活
聊天那个多姿多彩
QMail?嗨,咱哥们都不瞧在眼里
人家把 QMail 就当个补充
腾讯有QQ占着桌面,邮件眨吧眨吧就出来了
哪像咱 Gmail 老是"请稍候"
不是开口闭口本地化吗,
咱是笨人,不明白都本地化了些啥


依我说,Gmail 真的得赶紧修理了
速度慢就不说了
那个该死的联系簿早该升升级了
功能简单得让人没法用
虽然邮件线索和集成搜索是有点新意
那也是好多年前的事了,现在别人早学去了



再说咱开的那个 blogspot 吧
咱给自己取个名字叫"二进制生存"
这回可好,名字起的不吉利,完全活不下去了
天天琢磨着代理呀网关呀

这事其实不怪你,咱不也挺赞赏你这点傲骨
后来feedburner的事不是也没人说你什么
可是最近人家要搞和谐,你干嘛也跟着凑热闹呢
该咋干咋干,该是怎么样就是怎么样
怎么为了一点点商业利益就又没骨气了呢


调过头,去 sohu 开了个博客
咳,这都是些啥玩艺,花里胡哨的
小张同志就不是搞技术的料,
你的东西嘛
就留给十七八岁小年青发唠叨用吧
还没得意上两天
赶上 Yahoo 邮箱打广告了
捡回来四五年没怎么用的帐号一看
人家 Yahoo 重振旗鼓,博客邮件相册该有的都有
东西嘛,做得还是有模有样,是个做门户的样子
虽然人家是副鬼子嘴脸,可也没得罪咱
东西能用就咱将用着呗


停在 Yahoo 里转悠转悠
发现人家的访问速度还是要快好多
还有,相册也精致些
咱中国人不就爱个小巧玲珑,整洁美观
哪像Picsas里面一个像册封面有巴掌大
反正 Picsas 是真的不好用
速度慢不说吧,
想把照片归归类什么的
管理起来还真的有点困难


这骂人骂上了就停不下来,可是骂多了就没意思了
还剩点什么?
PageCreater 不好用,从一开始就没有好用过
NoteBook ,貌似用的人不多,Google也没在上面多花心思
iGoogle 本来想拿来当首页,可搜索框没有趋势提示,也是个半调子
Groups 还行,不过本来就是旧瓶装新酒,也好久没升级过了
Docs 前景光明,多抽点时间在国内大力推广吧,酒香也怕巷子深
Calendar ,不整合到桌面就没前途,人家 QQ 已经先行一步了
BrowerSync 完全是扯淡,把我的收藏夹搞得乱七八糟,再不敢用 了
Analytics 很好,很强大!但是我从来没想过用它来分析广告
还有 adsence,咱没用,可一门心思用它搛钱的人没一个老实的

看明白没有
Google是干什么的,它就是一广告公司
Google在干什么,它专注广告推销
Google关心谁,它曾经关注技术

等到哪天Google忘了它是靠技术 No.1 起家的
等到哪天Google技术不再是 No.1 了

等到Google不关照我们这些搞技术的 GFans 了
那时我们也会厌烦天底下所有搞广告推销的

其实我们本来就讨厌广告
此一时,彼一时,谁知道 Google 什么时候倒闭!


为了防止被口水淹死,多补充一句
我也是 GFans
但是今天主要是批斗Google,大家就不要把矛头指向我了
年中多总结,年底才能有个好收成
好话放到年底再说吧
希望不要到了年底表彰变成了悼文!


--------------------------
??? 哪位兄台帮我放到 cnbeta 上去晒晒,看看能收多少口水! ???
--------------------------

2007年9月1日

在 Linux 上使用 Ipmsg 的事项



本文介绍g2ipmsg的安装使用注意事项,包括无法编译安装、显示乱码、安装后无声音、无法传送中文文件名、接收中文文件名乱码等


1、版本选择 --使用2007版的 g2ipmsg。
这是 2007 新开发的 ip messenger ( www.ipmsg.org ),基于 GTK 库,可以单独执行或作为 Applet 放在面板上使用,功能比以前的 JAVA 和 X 版本的完善和稳定--JAVA版不支持文件收发,旧版本好象都不支持接收目录。
如果急用,建议可以先试试用 Wine 跑 win 版本的 ipmsg,但是也不支持接收和发送目录

下面说一下g2ipmsg安装的注意事项

2、解决乱码
下载g2ipmsg解包后找到 g2ipmsg-0.9.1/src/code.c
将文件顶部的宏定义改成
#define IPMSG_INTERNAL_CODE "UTF-8"
#define IPMSG_PROTO_CODE "CP936"
然后重新编译


3、运行 ./configure 不通过
执行 ./configure --prefix=/usr --sysconfdir=/etc --enable-systray
如果不带 --enable-systray ,就不会生成 applet

可以在 make 的时候看一下你的系统差些什么,参照着补全
只要所有组件都齐全,不会有什么问题
需要注意的是:GST是 GStreamer 的 dev 开发包,如果不装也可以编译通过,但是运行的时候新消息没有声音提示
另外网上还有其它的一些报错,比如 gcc 未安装、gettext未安装等,可以依据报出来的错到 google 上搜一下


4、安装后面板的 applet 清单里找不到 g2ipmsg
造成这种情况的可能性很多,可以试一下重启 面板 ( pkill gnome-panel;gnome-panel& )再看看
还可以试一下将 /usr/bin/g2ipmsg 和 /usr/bin/g2ipmsg_applet 拷贝到 /usr/local/bin 下面去(ubuntu )
应该来说Deb安装都不会出现这样的问题,尽量用Deb包安装就没问题,但是网上有些Deb包安装后是日文码的,显示界面里面的中文人名全是乱码,还有些是声音的问题没有解决
可以试着先装Deb包,然后将 make 好的 g2ipmsg 和 g2ipmsg_applet 拷贝过去覆盖


5、无法发送中文文件
因为 g2ipmsg 用 GTK 库写的,如果你的文件名编码是 GB 的,发送时文件名会是乱码,对方就会收到一个空消息,
在发送前将文件名换成 utf-8 的就没有问题了 ( convmv -f gb2312 -t utf8 --notest 测试文档.txt ),可以查阅一下 convmv 的相关用法,如果需要将整个目录里所有文件名换成 utf8 ,用 -r 就行了
还有,如果文件夹名是GB编码的,那么文件夹里面的文件不论是什么编码都无法传送,


6、接收的文件乱码
接收到的文件名总是以 UTF-8 编码的,因为文件管理器 ( Nautilus ) 可以正常显示UTF和 GB 编码的文件名,即始 不同编码的文件名放在一个目录下面,也会显示得很好,但是在终端里看会看到部分文件名正常,另外一些是乱码,这时候也需要用 convmv 将文件名转换一下


7 、新消息没有声音
看一下选项里的声音钩上没有,如果无法选中,参考第3步 configure 中的 GST 部分

2007年8月31日

穿透HTTP代理用 python-xmpp 给 google talk 发消息

python-xmpp 实现了 jabber 的大部分协议,能够用 python 发 jabber 消息
因为 google talk 本身就是基于 jabber 协议扩展的,所以也能给 google talk 发消息


早期的 python-xmpp 不支持 SSL 认证登录,所以只能登到一些非SSL认证的服务器,如 Jabber.org ,再给 google talk 的用户发消息,新版本已经解决这个问题。我现在使用的版本里 auth.py 是 v 1.35 2006/01/18 19:26:43
auth的参数是(节点,密码)
j_CLIENT.auth('shaozx','password')
第一次写的时候传入了 user@gmail.com 导致程序报错,后来跟踪调试,找到了第 143行,
它的本意是通过 user@gmail.com 截断得到 gmail.com,然后 DNS 解晰得到实际服务器 talk.l.google.com,
最后组合得到 user@talk.l.google.com,可是程序里几个变量都叫 server ,把自已也搞糊了!
140 if "DIGEST-MD5" in mecs:
141 node=Node('auth',attrs={'xmlns':NS_SASL,'mechanism':'DIGEST-MD5'})
142 elif "PLAIN" in mecs:
143 sasl_data='%s\x00%s\x00%s'%(self.username+'@'+self._owner.Server,self.username,se lf.password)
144 node=Node('auth',attrs={'xmlns':NS_SASL,'mechanism':'PLAIN'},payload=[base64.enco destring(sasl_data)])
145 else:
146 self.startsasl='failure'
147 self.DEBUG('I can only use DIGEST-MD5 and PLAIN mecanisms.','error')
148 return



我现在使用的python-xmpp里带的 transport .py 版本是 transports.py,v 1.28 2006/01/26 13:09:35
我修改屏蔽了第 182 行,否则使用代理服务器的时候总是报错,无法认证成功,还没想明白为什么
172 def send(self,raw_data):
173 """ Writes raw outgoing data. Blocks until done.
174 If supplied data is unicode string, encodes it to utf-8 before send."""
175 if type(raw_data)==type(u''): raw_data = raw_data.encode('utf-8')
176 elif type(raw_data)<>type(''): raw_data = ustr(raw_data).encode('utf-8')
177 try:
178 self._send(raw_data)
179 # Avoid printing messages that are empty keepalive packets.
180 if raw_data.strip():
181 self.DEBUG(raw_data,'sent')
182 #self._owner.Dispatcher.Event('', DATA_SENT, raw_data)
183 except:
184 self.DEBUG("Socket error while sending data",'error')
185 self._owner.disconnected()


如果是直接连接互联网,connect的写法如下:
j_CLIENT.connect()
中间如果有代理服务器,connect的写法如下:
j_CLIENT.connect(proxy={'host':'192.168.1.254','port':8080,'user':'guest','password':'cisco'})
注意 port 变量是整型,用程序代码生成proxy的时候格外要注意,不然会报错
可以参考 python-xmpp 的API文档


如果从命令行或其它地方传入文本,还需要注意编码转换
msg = unicode(msg,'gb18030').encode('utf8')
然后再发送出去
j_CLIENT.send(xmpp.Message('接收者',msg))


sendInitPresence(50)是置发送者状态为“在线”,置发送者状态后接收方会多弹出一个“XXX上线”的消息,我遇到过Palm上的一个jabber客户端,登录成功后就置了一个 0 ,然后死活发不出去消息,晕倒!


自带的程序原型 xsend.py 简化如下:
#!/usr/bin/python
# -*- coding: utf8 -*-
import xmpp

j_CLIENT=xmpp.Client('gmail.com',debug=[])
j_CLIENT.connect(proxy={'host':'192.168.1.254','port':8080,'user':'guest','password':'cisco'})
#j_CLIENT.connect()
j_CLIENT.auth('shaozx','password')
#j_CLIENT.sendInitPresence(50)
j_CLIENT.send(xmpp.Message('shaozx@gmail.com','test'))


写python的东西感觉架着滑翔机,
对老手来说是一种享受,而新手战战兢兢如履薄冰
最后祝你好运!

修正 libgmail 报HTTP Error 400: Bad Request 的 BUG

前段时间写了一个检查邮件的 python 脚本,调用 libgmail

这几天发现不能用了,总是报 HTTP Error 400: Bad Request

上网搜了一下,是因为 gmail 把 URL 改了,(越来越不厚道了)

来源:http://www.thescripts.com/forum/thread696534.html

修改 libgmail v0.1.5.1

第 317 行
try:
link = re.search(RE_PAGE_REDIRECT, pageData).group(1)
redirectURL = urllib.unquote(link)

增加一行,变成:
try:
link = re.search(RE_PAGE_REDIRECT, pageData).group(1)
redirectURL = urllib.unquote(link)
redirectURL = redirectURL.replace('\\x26','&')
---

2007年8月30日

SSH的常见使用方法

telnet已经是非常古董级的产品,老的telnet都是明文传送数据(包括密码),很容易被网络上的其它节点监听导致泄密,新一点的telnet加了一层SSL传输加密但是支持不是很广泛。

这里介绍一些SSH命令和使用方法,详细的配置和参数说明可以参考相关的手册。
1、登录
2、使用证书登录
3、穿透防火墙
4、文件拷贝
5、目录挂载



1、登录时指定用户名和主机
ssh 与 telnet 有些不同。后者会提示你输入用户名,而前者默认使用当前的登录用户名,但是大部分情况下,远端要使用的用户名都不是本地登录的用户名
可以用如下方法指定用户名

ssh -l user host

ssh user@host

然后系统才会提示你输入 user 用户的密码。
如果是第一次登录该主机,在输入密码前还会看到一段提示你是否接受密钥的对话,输入 yes 按受即可


2、用证书登录
用证书登录可以不用每次手工输入密码,只需要输入 ssh user@host 就直接进入服务器,因此可以将服务器端的密码设得很复杂以提高安全性,但是一定要保护好客户端的证书。
使用证书登书方式需要2份证书文件:
一份放在本地的 $HOME/.ssh目录下面,id_rsa,有点象IC卡钥匙
另一份放在任意多的主机上面,好比IC卡锁,id_rsa.pub

证书文件一般放在 $HOME/.ssh 目录下面,如果你还没有这个目录或者这个目录下没有任何文件,就需要生成新的公钥私钥
在客户端执行:
ssh-keygen -t rsa
(一路回车即可)
会在 $HOME/.ssh 下面产生两个文件
-rw------- 1 biff biff 1671 2007-08-30 10:46 id_rsa
rw-r--r-- 1 biff biff 395 2007-08-30 10:46 id_rsa.pub
id_rsa是私钥,安全级别较高,只允许本人查看
而 id_rsa.pub 是准备送到其它服务器上去的,给别人是没关系的。

有了证书以后就需要把公钥放到服务器上去
ssh-copy-id -i id_rsa.pub user@server
这条命令会提示你输入远端user用户的密码,然后将公钥追加到远端用户$HOME/.ssh目录下面的authorized_keys文件里
遇到新的SSH服务器以后,只需要执行这一步就行了,千万不要重新生成密钥,不然前面的那些主机就又不认得新密钥了

然后试试 ssh user@host ,就可以直接进入,不会再提示你输入密码了。
不过有个例外!如果远端服务器的用户名与密码相同,你使用密钥登录就不会成功


3、穿过代理服务器 ( 摘自 Open SSH Client 官方文档 )
ssh本身不能穿透代理服务器,需要配合其它的程序进行转发
在 fedora 中,检查是否已经安装了 nc ( netcat ),在 $HOME/.ssh/config 文件中增加一行

ProxyCommand nc -X connect -x 192.168.2.67:808 %h %p

如果你是使用SOCKS代理,则需要把上面的"connect"换成"4"或者"5",这个"4"或者"5"对应你的SOCKS代理的版本。

在Debian 3.2和Ubuntu 6.06中你可以使用connect-proxy程序来连接HTTP代理。首先得安装这个connect-proxy软件包,然后在 ~/.ssh/config 文件中增加类似这样的一行:

ProxyCommand connect-proxy -H 192.168.2.67:808 %h %p

如果你是使用SOCKS代理,则需要把上面的"-H"换成"-S"。

Mandriva 2006与Debian 3.2的情形类似,只是它的软件包和程序的名字都叫connect,作相应的修改就可以了。

( 我在 Ubuntu gutsy 下面穿透 http-proxy 成功 )


4、文件拷贝
如果服务器有ssh服务,就等于一条带加密的FTP传送带,可以进行文件拷贝了。
scp ./file1 user@server:path/file1
将当前目录下的 file1 文件复制到server主机的user用户下 path目录下
反之亦然,可以将远程文件复制到本地


5、挂载远程目录
如果服务器上开启了ssh服务,就可以将服务器上的目录挂载成本地目录,然后就可以直接用 cp / rm 之类的本地文件操作命令来操作远程文件,也能直接用 vi 等命令对远程文件进行编辑,跟操作本地文件一样方便。参考 http://www.pkblogs.com/binsos/2007/06/linux.html

2007年8月10日

中国人在复制什么?

一直在用 Gaim,今天试了一下 Gajim ,印象里这个软件是可以语音的,但是不行

然后上 google 搜了一下 "google talk linux 语音"

呵,好家伙,满满的一屏全是一样的标题:“Linux将可以跟Google talk 语音通话了”

这是我很久很久以前在 linuxfans 论坛上发的一则新闻,

有史以来我也就发过这么一次,而且内容还是从英文网站摘来的

抄也就罢了,竟然很少引用了原文出处的!

我算是有点公德心的,每次引用总是小心意意的加上原文出处,即使忘记了也会再去搜一次

又想起前次那个“昨天,财务找我”的段子

最后的感想是:互联网出名其实很容易,但是不一定是你的名字!

----------------------------

唠叨归唠哪,细看了一下 Google 搜索的排名

我在 Ubuntu China 新闻组里发的贴基本上能排上前几位,

而实际情况是:这些有点内涵的贴子都是从我的 blog 上转贴过去的

访问量排第一

----------------------------

记得看过一则新闻, Google 正在修改排名的算法

也就是文章排序的先后顺序是按登出时间的先后进行排列

还有正在研发的原创登记,让作者认领自已的原创进行标记

“中国在复制世界”的神话还能走多远?

2007年8月6日

在脚本里用 date 命令获得昨天或明天的日期

UNIX 下面写脚本经常要用到取日期,比如当前应用系统的日期是 2006/07/25,就需要计算出明天的日期2006/07/26,然后根据计算得到的日期做一些预处理,比如日期切牌这类的操作。

在 UNIX 环境下,我一直都是传一条 SQL 给数据库,比如 informix 下(oracle类似):

nextday=`dbaccess $SCH_DBS <<! 2>dev/null | cut -d' ' -f2
output to pipe 'grep -v ^$'
select first 1 date+1 from time_table;
!`

test $? && exit
echo $nextday


LINUX 就不必这么麻烦了。
今天看到一篇介绍 linux date命令 的文章,这里介绍的方法你绝对没试过:


假设计算机日期是 2007/08/06 ( 格式化的处理自已搞定,就是 %Y%-m-%d之类的,我就不罗嗦了)

昨天:
date --date='yesterday'
2007年 08月 05日 星期日 19:02:25 CST

前天:
date --date='1 days ago'
2007年 08月 04日 星期六 19:06:34 CST

半小时后: -30 minutes ;上一小时: 1 hour ago;上个月: 1 month ago ;去年:1 year ago


明天:
date --date='next day'
2007年 08月 07日 星期二 19:10:12 CST

date --date='-1 days ago'
2007年 08月 07日 星期二 19:08:51 CST

半小时后: 30 minutes ;下一小时: 1 hour;下个月: 1 month ;明年:1 year 一个月零五天: 1 month 5 day


有意思吧!想想还需要什么功能?

下周:
date --date='1 week'

周未:
date --date='this sunday'

变态组合一下:
date --date='-30 minutes -2 weeks +2 months'

?? 怎么解释?? (把飞机票送过来,时间是)在两个月提前2周半小时 ...... 够变态的!!


这还不够,还需要传入自已给定的时间作参数,计算指定日期时间之前或之后的时间:

我儿子十岁生日:(中国人的习惯是十周岁提前做,嘻嘻)

date --date='2008-08-08 08:08:08 UTC+8 +8 year -8 months' +'%F %T'
2015-12-08 08:08:08

呵呵,这句话的解释是 ^_^ ??

你自已折腾去吧。。。。。



二进制生存 http://www.pkblogs.com/binsos

2007年8月5日

理性看待LINUX桌面应用的现状

-----------------------------
引自 SUSE中文组
http://groups.google.com/group/SuSE_Chinese/browse_frm/thread/213b86da2f1425e4
>很多"全日制"Linux使用者都是网络管理员或程序开发员, 特别是对开发UNIX程序的程序员来说,Linux绝对是利器。

最后一句话是对的 其它都是在胡说
楼主 windows够易用了 linux有些地方不得不打命令 windows不得不打命令的地方很少 因为图形界面出来的早 完善的多了 家用的时
候完全不用打 这让刚接触电脑不久的人没恐惧了
你说的这种情况见证了windows的脆弱性 因为windows的文件结构很不清晰 也不划分开来 内核 驱动 管理工具 命令行全挤一起 你装个什
么软件它就变慢了 你用一段它就快挂了
你是转载的还是杜撰的啊?如果都不是 那你真强 我对你的敬仰之情犹如滔滔江水连绵不绝 也不至于玩到这地步吧
------------------------------

我从98年开始接触LINUX,但一直仅限于接触,只是装装看看,了解一下LINUX的发展状况。


参加工作以后,大概是2001年,工作比较闲的时候就开始用Linux架一些http\ftp\dns之类的服务,感觉linux在服务器方面大有作为,但是身边一直没有成功的案例。当然,这也代表着国内LINUX应用的当时的现状--说的多、用的少。

直到2004年才见到第一个案例,是我的一个同事用redhat as4架了一个日报社的web站点(http://www.cb315.com),用的jsp/tomcat。



2005年的时候遇到了suse 10.0,感觉眼前一亮,这才是第一个让我感觉能够真真使用的桌面版LINUX,在5月份的时候,装了win/linux双系统,基本上停在linux下面不进windows了。

当时我是在杭州做一个银行BI项目的开发,工作相对简单--UNIX C编程,只需要telnet就行了,gnome-terminal多标签当然是这方面的利器。

2006年的时候又接触了sshfs和ftpfs,能够将HP-UNIX的远程目录挂载成Linux的本地目录,这样就能够用VIM编辑C程序,不用再受罪忍受标准UNIX-VI了,而且经过一年的使用和学习,自已也写了一些shell脚本用于日常使用,这更增加了对linux的依赖。

这时候已经从“windows是不可或缺的后盾”转变成“进了windows就不适应”。

2006年应该是转折性的一年,从这时候开始,基本上都是在虚拟机里面使用windows,用虚拟机主要还是office和erwin解决不了。


我是绝对的Linux支持者,但还不至于让狂热冲昏头脑,

目前linux服务器应该已经走向实用阶段,虽然标准化和易用性方面已经无人可及,但是在高端应用特性和硬件驱动支持上还是比不上专用的UNIX系统

但是桌面,还仅仅是一个启步。虽然有一些电脑厂商开始预装LINUX,但是这些经过精心处理得"很象windows"的linux仍然是只是能用,并不够用和好用。

WINDOWS仍然占领着主流操作系统市,非IT技术人员对其知之甚少,大部分用计算机的人其实并不知道LINUX的存在。

MS OFFICE套件仍然占领着主流市场,Linux下的相关软件只能兼容,但是无法改变用户的使用习惯和第一体验。就比如很多接触永中office的人都称赞它做得棒,就是因为它做得跟ms office一个样,符合用户的习惯,其实它的功能和应用的广泛性不一定比得上open office

IE,这是一个不能不说的痛,特别是在国内,网银ActiveX的应用,就不多说了。另外,Firfox2.0在速度上超过了ie6,但是感觉还是不及ie7,但这中间可能有IE是集成在系统内核中的原因,但是ff的插件绝对是一流的

IM上面,QQ经常连不上,MSN和GT的语音功能还不完善,路还很长。

2007年7月31日

艰难的往前走: MS Office 与 IPMSG 在 Linux 上的现状

两年前下决心在笔记本上装上 Linux ,当时的想法很简单:只要 telnet 和 vim 就能工作。

因为是为 UNIX 小型机编程,确实只要这两个东西就可以工作了。
但是,实际上还要不时的看看 DOC 文档,经常的要用飞鸽传书(ipmessenger,ipmsg)收发文件。

Word文档格式基本上就是行业标准,这个大家都深有体会,虽然可以用 OpenOffice 打开,但是启动速度让人难以忍受,界面难看至极。
后来试了一下永中office 2007,启动速度、界面都接近 MS Office,最棒的是有些时候 Word 版本出现兼容问题的时候(officexp 的文件在 office2003 上打不开),用 永中office 打开另存一个就好了,特搛面子。不过永中也有缺点:是试用版、由JAVA底层特性带入的因字体库引起乱码。

至于ipmsg,已经是项目组的“行业标准”了,虽然飞鸽传书有 Xwindows 的版本,但是不支持收发文件。
只好用 Wine 模拟,但是收发文件时中文窗口总是乱码,最要命的是不支持传送目录。人家要是想发一个目录过来,还得找人家压一压打包重新再传送。
一年后出了 g2IPMsg,GNOME版本、支持文件传送。无论界面、功能、稳定性各方面都达到了可用的标准。
但是,也不是没有问题。
G程序都用utf-8作内码,传送文件时如果文件名是GB编码就无法传送,还得把文件名转成UTF-8的,发送完毕再转回来。
还好写了一个Natualis的脚本,要传送的时候点一下让脚本去转换,不然累死。

这就好比一对小情侣私奔,
如果日子过得好,大家还会传为美谈;
如果度日艰难,大家就会投来异样或鄙视的目光。
我现在的日子还算过得去。。。。

现在总结一下,转到 Linux 前,需要拟一份 windows 下必需使用的软件、环境,然后装上双系统在 Linux 试用一段时间。如果能找到一个与你工作性质类似的人,而他已经在 Linux 下工作了比较长的一段时间,那就太好了!!

2007年7月20日

[不想妖化 Linux ] 我的 Linux 语录

我一直挂在嘴边的一句话是:“ windows 都用不好的人,就别试 linux 了 ”
走近 Linux 就是一场炼狱。

--自评:“少年不识愁滋味,独上高楼。。。。”



炼狱,一直没有深究这个词是什么意思,好象坏人进了进了地府要炼狱,也好象说是圣人成功前所受的苦也是炼狱
不想妖化Linux,但是它绝不是天堂。

--自评:听过,也新身经历身边 Linux 试用者在地狱里兜了半圈逃出来。。。。



一直想写一篇文章吐一吐胸中的苦水,着实,在笔记本上用了近两年的 Linux ,苦水真是倒也倒不完,但总也抽不出时间来,最近一段时间 Linux 已经离我们更近了,身边有好几个朋友和同事试着要装一个,这才想到,是该给大家提个醒了。但是还是没时间--因为要说退一个准备试用LINUX的人,非常非 常难!

--自评:我很矛盾,一方面我期待身边的Linux社团壮大起来,另一方面,十年过去了,现在仍然不是一个合适的时机。



我不准备谈 Windows + Vmware 跑 linux 的情况,绝大部分没接触过 Linux 的人都会选择这种方式,这好比坐在电视机前看火星 登陆-- 安全、舒适、平静。

--自评:实战才是发现问题的最佳方式,但是对大部分人来说,没有问题可能更能取悦他们



我真真要帮助的是那些准备离开地球,要实实再再的把家搬上火星的朋友们!
搬家前想清楚,搬过去了就别再回来!我在火星等着你们!!

--自评:我可以提供搬家的帮助,但是不要期望我会帮你打扫房子,自已的房子还是要自已装修和打理的

想想挺容易:用脚本改变当前 shell 的环境变量

前言

世上有些事就是这样的,想想挺容易,下手做的时候才发现问题多多
所以,学技术活呀,千万不能眼高手低
明明已经成功N次的操作,可能就会在第N+1次难倒你!!
这不,差点撞到流血。。。。。


引子

---引自我在 Ubuntu China 的发贴

不用 . 或 source 还有没有别的办法修改当前环境变量??

当前环境变量里 a=kkkkkkkk,运行脚本 export a=sssssss ,在脚本运行过程中(fork)变量a是被改了,可是子进程结束 后,当前环境变显的a没有受到影响。

bash里有没有类似C的setenv函数?

---难题说破了就不难了,继续往下看之前想想你有什么高招??


背景

在 Linux 下面改环境变量也不是第一次了,通常是在命令行下面输入: export ORACLE_SID=test ,即刻生效。

如果要长期生效,自然就是加到 .bashrc 或 .profile 里面去,终端启动时会自动加载

如果修改了 .bashrc 或 .profile 文件, 用: . <点号> 把文件读出来执行一遍就行了,如:
. $HOME/.bashrc

其它的还有如,bash的 env、export,ksh的setenv、source,C语言的getenv,setenv等等。


问题

前几天遇到一个这样的问题:
当前环境变量存放了 CVSROOT 的信息:
CVSROOT=:pserver:USER1@host:/cvsdir
当多个客户以 USER1 登录到系统以后,要各自使用自已的用户名操作 CVS

脚本如下:
-------------- mycvs -----------------
#!/bin/bash
printf "%s" " enter your cvs account : "
read user_name

cvs logout
unset CVSROOT

export CVSROOT=":pserver:${user_name}@host:/cvsdir"
cvs login
------------------------------------------

分析

其实是个为了简化操作的脚本,思路很简单,就是重置一下环境变量,然后调用 cvs login 重新登录。

结果呢?问题来了。。。。。这个脚本不能直接运行。

如果在控制台输入 mycvs 运行,当时以新用户名(CVSROOT=":pserver:myname@host:/cvsdir)登录了,但是登录之后的操作,如 cvs commit 等,仍然使用的老环境变量CVSROOT=:pserver:USER1@host:/cvsdir。

!!!!无法更改环境变量!!!!


( 现在回想起来是非常明显的错误,当时还是迷糊了半天 )


我们知道,SHELL 执行一个脚本时是 fork() 一个子进程,所以脚本运行时,都在一个新的环境里面。用 unset 或 export 修改的环境变量其实是一件“复制品”。等到脚本运行完毕,当前 SHELL 的环境变量压跟就不受任何影响。

开始的时候,还在幻想用 C 语言重写这个脚本,因为 C 语言的 setenv() 是直接对内存指针操作的,SHELL 没有能力更改环境变量是因为不能突破 ENV 的限制,但是 C 能够。
现在想想,即始用 C 语言能够实现我所要的效果,也绝不是简单的用 setenv() 就能解决的,因为 setenv() 也是使用的一份“复制品”的环境变量,这些都没逃出 FORK 的圈套。

后来有人提醒我,去掉脚本的Magic标识部分,即不要 #!/bin/bash的部分。这的确令我眼前一亮,痛骂自已怎么忽略了这一点。
我们知道,如果文件是 #!/bin/bash 开头,BASH会将其识别成 BournShell ,但是如果没有Magic头,就会只作为一般的命令行集执行,这两者是有区别的。
但是仍然不行。

(说个题外话,用C语言能通过内存扫描找到并修改环境变量,实现我想要的效果吗?这中间会涉及到安全因素吗?)



结果(两天以后)

找到一个变通的办法, 思路如下:

先写一个脚本,内容是
----------test.sh ------------
read name
export MYNAME=$name

然后在 .bashrc 里定义
alias chgname=". test.sh"


-----this is a very dirty way, 求其它解法 ----

2007年7月12日

sqlplus 里 backspace 键的映射

登到远端 redhat + Oracle 10g,
进入 SQLPLUS 里面按 backspace 键不能删除字符,总是不停的出现 ^H ,

修改 Gnome-Terminal 里的“兼容性设置”,
将“按 backspace 产生” 从 “ctrl+H” 改成 “ASCII DEL”,再按 backspace 可以删除前面的字符了,
可是到了AIX上面又不行了,在 ksh/vt100下面全是 ^?

后来在网上找到一个修正的办法:

Add the following line to your .login file:
    stty erase ^H
This will make backspace work correctly in your sqlplus session.

将 stty erase ^H 加入到启动脚本(如 redhat 的 .bash_profile,或 .profile等 )即可解决

stty 是用来显示和修改虚拟终端特殊键键值定义的,这是一个历史遗留问题。
最早的终端键盘只有标准的ASCII键,所以UNIX对键码的应用非常谨慎,仔细想想 VI 为什么要用 hjkl 作为光标移动键,而不用上下左右?就是这个原因了!

用 stty -a 可以看到当前的扩展键值定义和其它传输属性:
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke



2007年6月28日

用 VIM 管理 Oracle 的 SQL 历史

本文介绍一种方法,尝试用 VIM + SQLPLUS 的方法模拟出 informix 中 dbaccess 的 SQL 读入、运行功能。


可以试试在 vim 的 .vimrc 里面定义这样的热键:

nmap <silent> <F2> :1,.y<CR>:bel new<CR>p:%!sqlplus -s user/passwd<CR>

开一个 vim 写 SQL,写完以后按 F2 就可以从开头执行到当前行

---------解释------------
:1,.y 复制从第一行到当前行
:bel new 在当前窗口下方开个窗口(容纳运行结果)
p 把SQL粘到下面的窗口
:%!sqlplus -s user/passwd 把SQL传给 sqlplus 执行
---结果:上窗口显示编辑的SQL,下窗口显示运行结果---

(你也可以修改一下,改成按 Fx 执行全文,但是我觉得“执行到当前行”更灵活一些)

至于 SQL 历史保存的问题,我写了一个脚本,名字叫 d (很眼熟吧,infomix下用的这个名子,已经成了开 dbaccess 的专用缩写),内容如下:
biff@biffasus:~/bin$ cat d
#!/bin/bash

mkdir -p $HOME/.oracle
cd $HOME/.oracle

vi $HOME/.oracle

cd -

其实什么都没干,很神奇吧(不过你的VIM版本要支持目录编辑)
vim 带参数是目录时它会显示目录下的文件供你编辑,如下:

" ============================================================================
" Netrw Directory Listing (netrw v109)
" /domain/home/biff/.oracle
" Sorted by name
" Sort sequence: [\/]$,\.h$,\.c$,\.cpp$,\.[a-np-z]$,*,\.info$,\.swp$,\.o$\.obj
" Quick Help: :help -:go up dir D:delete R:rename s:sort-by x:exec
" ============================================================================
../
./
@@test.sql
create_t_cif_info.sql
cur_speed_test.sql
zh16encoding.sql

看到没有,目录下的SQL显示给你供选择,可以直接对SQL文件删除、改名
用光标上移、下移选择文件,回车开始编辑SQL,光标移到最后一行按 F2 开始运行