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