大欢乐网

终于把compiz装上了,有了一个让人头晕的桌面

Linux — 作者 gladness @ 13:23
昨天晚上,在我的ubuntu上折腾到1点,只把XGL装上了。compiz和compiz-plugins都因为依赖关系问题始终没装上。今天突然试了 一下其他的几个包,结果把compiz-vanilla相关的几个包装上了。发现桌面也可以有特效了,虽然好像好多特性都没法配,但是效果已经让我很高兴 了。有3D桌面,窗口拉动、最大化时都像是有弹性的,有抖动。窗口的标题栏是半透明的,窗口边上还有阴影等等。总算没白忙活。
下次做培训一定得借着接投影仪的机会show一把,嘿嘿。不过缺点就是不能老转换桌面,会头晕。

贴几张图片:










简单总结,xgl的安装按照ubuntu网站上的说明基本可以了。但是有两点要注意:
1。需要修改Xgl的权限,否则会报类似can't open Xorg.94.log的错误。执行:
sudo chmod ug+s /usr/bin/Xgl
2。需要在startxgl脚本上加上启动输入法的命令,我的startxgl脚本如下:
#!/bin/bash
Xgl :1 -fullscreen -ac -accel xv:pbuffer -accel glx:pbuffer &
export DISPLAY=:1
scim &
exec gnome-session

如果不加scim &,那么将来装上compiz以后,在openoffice里会打不开中文输入法。
xgl安装完成以后,似乎需要重启机器。

compiz的安装,与ubuntu网站上的文档有些不同,主要是安装的包不同。文档中说的compiz compiz-plugins包,安装不上。compis-plugins依赖的csm包,到处也找不到。最后发现装如下几个包也可以出效果:
compiz-vanilla
compiz-vanilla-aiglx
compiz-vanilla-gnome
gset-compiz
其中最后一个包是用来设置和启动各种特效的。



linux bash for循环的例子

Linux — 作者 gladness @ 16:09
复制MySQL的表,做大数据量的测试
#!/bin/bash
days=1
count=30
for (( days=1 ; $days - $count ; days++ ))
do
datestring=`date --date "${days} day" +%Y%m%d`
cp MSGDB_20060414.frm MSGDB_$datestring.frm
cp MSGDB_20060414.MYD MSGDB_$datestring.MYD
cp MSGDB_20060414.MYI MSGDB_$datestring.MYI
done


为crontab增加日志

Linux — 作者 gladness @ 16:05
crontab的日志比较简单,当crond执行任务失败时会给用户发一封邮件。恰巧在我们的一台服务器上发现一个任务没有正常执行,而且crond发邮件也失败了。通过看mail的日志,看到是磁盘空间不足造成的。
此外,同事帮我为crontab中的任务增加自己的日志,这样出错后,比较容易看到原因。
0 6 * * * $HOME/for_crontab/createTomorrowTables 2>&1 >> $HOME/for_crontab/mylog.log
把错误输出和标准输出都输出到mylog.log中。
注意:zsj朋友提醒上面的写法有问题,应该是
0 6 * * * $HOME/for_crontab/createTomorrowTables >> $HOME/for_crontab/mylog.log 2>&1
否则就输出到标准输出了
感谢zsj朋友!


Re:Multiple line match

Linux — 作者 gladness @ 11:39
On Thu, 2006-03-30 at 17:46:21 +0530, SHANKAR R-R66203 sent:
>How do I do a multiple line match.
>
>I tried n and r, it is not working
>
>I want to match any of the following -
><word>s*<word>s*(
>
><word>s*<word>s*^M
>^s*(
>
For the examples you give, I would use the following pattern to
match them all:

<i+>s+<i+>_s{-}(

Where:
i is an identifier
+ is one or more matches
_s is whitespace or new line
{-} is as few matches as possible

The rest you clearly know.

See...
:he i
:he +
:he _s
:he {-}

Hope this helps;

--paj
--
Pete Johns <http://johnsy.com/>
Tel/Fax numbers and IM information: <http://johnsy.com/contact/>
Apologies to RSS Readers <http://johnsy.com/20060330093726>


把awk分拣出的各列值作为参数传给bash的函数

Linux — 作者 gladness @ 11:36
一共有两个脚本,一个是bash的,另一个是awk的。本脚本的目的是从一个文本文件中把邮箱名称、姓名、单位读出来(它们是冒号分隔的),并生成两个文件。一个是用户名和密码文件(密码由下面的脚本产生),另一个是SQL文件,把这些数据插入到表中。
本脚本的有趣之处是把awk输出的结果通过管道传给函数setusers。awk输出三个值,把它们用空格分开,通过管道传给setusers,就自然成为了该函数的三个参数。可用$1$2$3来取得它们的值。不过要注意的并且也不太完美之处,是awk输出这三个值以前,要把所有空格先替换成其他的字符串,之后再替换回来。否则,如果这三个值中有空格,会以这些空格为分隔符,setusers得到的参数就不对了。
awk的好用之处,在于可以很容易地把文件中的某列进行处理,但是似乎不容易传给bash,以便再做处理。以下则是一个awk与bash配合的办法。
[gulei@test100 mailuser_to_EA]$ cat getNamePassFile
#!/bin/bash
setusers()
{
local email=${1//THISISASPACE/ }
local username=${2//THISISASPACE/ }
local dept=${3//THISISASPACE/ }
local userid=${email%%@*}
local dname=${email##*@}
local pass=`dd bs=4 count=2 if=/dev/random 2>/dev/null | hexdump -d | head -1 | sed -e "s/^0000000//" -e "s/ //g"`
pass=$pass$pass$pass
pass=${pass:0:8}
local encryptedpwd=`./getpass $userid $pass`
echo $email $pass >> $userpassfile
echo "INSERT INTO IMP_USERS(EMAIL,USERID,DOMAINNAME,PASSWORD,ENCRYPTEDPWD,USERNAME,CORP) VALUES ('"$email"','"$userid"','"$dname"','"$pass"','"$encryptedpwd"','"$username"','"$dept"');">>$sqlfile
}
if [ $# -lt 2 ]; then
echo $0 '<ldapfile> <username and password file>'
exit
fi
ldapfile=$1
userpassfile=$2
if [ -f $userpassfile ]; then
rm $userpassfile
fi
sqlfile=$userpassfile.insert.sql
if [ -f $sqlfile ]; then
rm $sqlfile
fi
g++ getpass.cpp -lssl -o getpass
echo "DROP TABLE IF EXISTS IMP_USERS;" > $sqlfile
echo "CREATE TABLE IMP_USERS( EMAIL VARCHAR(100), CORPID VARCHAR(32), USERID VARCHAR(100), DOMAINNAME VARCHAR(100), PASSWORD VARCHAR(20) , ENCRYPTEDPWD VARCHAR(50), USERNAME VARCHAR(200) CHARACTER SET UTF8, CORP VARCHAR(50) CHARACTER SET UTF8 );" >> $sqlfile
echo "SET NAMES GBK;" >> $sqlfile
awk -f getNamePassFile.awk $ldapfile | while read line
do
setusers $line
done
[gulei@test100 mailuser_to_EA]$ cat getNamePassFile.awk
BEGIN {
FS = ":"
}
{
gsub(/ /,"THISISASPACE",$1)
gsub(/ /,"THISISASPACE",$3)
gsub(/ /,"THISISASPACE",$8)
printf "%s %s %sn",$1,$3,$8
}


linux shell中有趣的date

Linux — 作者 gladness @ 21:02
date不只是一个用来以各种格式显示当前日期的命令,还以做一些有趣的推算,算出其他的日期。
[sms_db@localhost for_crontab]$ date
五 3月 24 14:13:07 CST 2006
[sms_db@localhost for_crontab]$ date --date '1 day ago'
四 3月 23 14:13:16 CST 2006
[sms_db@localhost for_crontab]$ date --date '2 day ago'
三 3月 22 14:13:19 CST 2006
[sms_db@localhost for_crontab]$ date --date '2 day'
日 3月 26 14:13:24 CST 2006
[sms_db@localhost for_crontab]$ date --date '1 month'
一 4月 24 14:13:31 CST 2006


bash小例子,创建mysql表和视图

Linux — 作者 gladness @ 21:30
用来创建每天需要的表和视图,以年、月、日为后缀,bash脚本: 查看全文

bash函数

Linux — 作者 gladness @ 22:23
bash中的函数与其他语言的声明方法很像,比如:
getdata()
{
....
}
调用时则可以直接这样
getdata
如果想传参数,则与传递命令行参数是一样的,比如
getdata hello
而在getdata函数中,用$1、$2....来取得参数,与取命令行参数是一样的。
调用函数,还可以使用管道,比如:
cat $tabname.COLUMNS | getdata
这里是把一个文件的内容通过管道传递给getdata。在getdata中比如有如下代码:
local sql=''
while read colname
do
if [ -n "$sql" ]; then
sql="$sql, "
fi
sql=${sql}${colname}
done
注意,while read colname把cat $tabname.COLUMNS 的输出当做了输入,是很有意思的一种用法。


bash循环读入文件的每一行并处理

Linux — 作者 gladness @ 22:21
比如
cat afile | while read oneline
do
echo $oneline
done
这只是个简单例子,把文件afile的每一行读入,然后显示出来。


Bash 取得命令行参数

Linux — 作者 gladness @ 22:12
介绍一下bash取得命令参数的方法,我一般的习惯如下:
#!/bin/bash
#判断命令行参数的个数,如果不够,则提示共有几个参数,每个参数大概是做什么的
if [ $# -lt 5 ]; then
echo $0 '<database name> <username> <password> <host name(or IP)> <table name>'
echo Host name can be 'localhost' when connects to local maxdb.
exit
fi
#把第一个命令行参数赋给变量
dbname=$1

#把其中一个参数变大写。这里``与$()是相同的用法,可以互相替换。
#是执行``或者()中间的命令,前面用=可以把标准输出的结果赋给变量
#tr命令完成了小写变大写
#|是管道,在这里把echo的标准输出,传递给了tr,作为它的输入
username=`echo $2 | tr a-z A-Z`
password=$3
....
....


在BASH脚本中,调用函数的时候,可以使用管道,以及输入输出重定向

Linux — 作者 gladness @ 22:09

在BASH脚本中调用函数时,就像使用一般的操作系统命令一样,可以使用管道和输入输出的重定向。

昨天发现一个我以前写的BASH脚本(genSQL)有严重的问题,此脚本是用来把SQL脚本中的某些数据类型分别转化成为MAXDB、MYSQL、POSTGRESQL各自的数据类型。比如把BLOB分别转化为LONG BYTE、LONGBLOB、BYTEA。
genSQL中主要用的是sed来替换SQL脚本中的类型字符串。除了发现其中的替换逻辑有比较大的漏洞以外,它的结构也已经让我忍无可忍了,于是在其中增加了一个函数replace_datatype,用于替换数据类型,它大概会有四个参数。分别是“SQL脚本文件名”“转换后的文件名”“需要转换的类型”(比如BLOB)“转换后的类型”(比如LONG BYTE)。
但这样使用起来太繁琐,会有太多的中间文件。可能会这样:
replace_datatype sqlfile tmpfile1 'blob' 'LONG BYTE'
replace_datatype tmpfile1 tmpfile2 'clob' 'LONG'
........
完成之后还要把各个临时文件删除,于是想能不能在调用函数的时候使用管道呢?这样诸多的临时文件就不需要了,试了一下果然可以。最终的相关脚本内容如下:
replace_datatype()
{
local sourcetype=$1;
local desttype=$2;
sed -e "s/[[:blank:]]${sourcetype}[[:blank:]]*,/ ${desttype},/" -e "s/[[:blank:]]${sourcetype}[[:blank:]]*$/ ${desttype}/" -e "s/[[:blank:]]${sourcetype}[[:blank:]]*--/ ${desttype}--/"
}
这里sed后面的命令写得有些复杂了,但没有关系,我所说的重点不在这里。此处sed没有指明需要处理的文件,通常是要把一个文件名作为它的参数的。此外sed的输出缺省是标准输出,输出到屏幕上。
再看一下如何使用replace_datatype:
replace_datatype blob LONGBLOB <$myfile.tmp | replace_datatype varchar2 varchar | replace_datatype blob LONGBLOB | replace_datatype 'long byte' LONGBLOB | replace_datatype clob LONGTEXT | replace_datatype long LONGTEXT
........
> $myfile
<$myfile.tmp($myfile.tmp存的是需要处理的文件的文件名)把$myfile.tmp指明的文件作为输入;
replace_datatype blob LONGBLOB <$myfile.tmp 之后又把它的输出,利用|(管道)作为replace_datatype varchar2 varchar的输入,以此类推,最终用> $myfile保存到文件里。
以前也是有个印象,是说BASH的函数是用fork启了一个新的进程,这大概也就是为什么可以用管道的原因了。



Powered by pLog