Wednesday, September 2, 2009

RHEL 5 配置ORACLE ODBC

ODBC效率超低,但沒辦法,有個ARCPLAN的項目要用到ODBC連ORACLE。

1.ODBC MANAGER:在LINUX中用unixODBC作為ODBC管理器。
2.ORACLE ODBC DRIVER:ORACLE官方的Instant Client Package中包含了ODBC驅動。

unixODBC要選擇2.2.12以上版本,否則跟ORACLE Instant Client Package 10.2.0.4版本不兼容。
ORACLE Instant Client Package 10.2.0.4安裝Basic和ODBC這兩個,最好再裝上SQL*Plus這個,以便檢查分析之后的配置是否有錯。

配置ODBC DRIVER(/etc/odbcinst.ini)
[oracle_driver]
Description=odbc for oracle
Driver=/usr/lib/oracle/10.2.0.4/client64/lib/libsqora.so.10.1

[ODBC]
Trace=1
Debug=1
Pooling=No

配置SYSTEM DSN(/etc/odbc.ini)
[FINE_ZHH]
Driver=oracle_driver
Description=
DSN=FINE_ZHH
ServerName=FINE_CK
Database=ora92
UserID=theusrname
Password=thepasswd
METADATA_ID=0
ENABLE_USER_CATALOG=1
ENABLE_SYNONYMS=1

在/etc/profile文件最后加上所需的環境變量,如下(具體參數需要根據自己實際修改):
#ORACLE INSTANT CLIENT
#ADD BY JOJO
ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client64
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
SQLPATH=$ORACLE_HOME/lib:$SQLPATH
TNS_ADMIN=$ORACLE_HOME
PATH=$PATH:$ORACLE_HOME/bin:.
TWO_TASK=orcl

export ORACLE_HOME
export SQLPATH
export TNS_ADMIN
export LD_LIBRARY_PATH
export TWO_TASK
export PATH

保存profile文件后執行#source /etc/profile命令使設置的環境變量在不重新登錄的情況下生效。
后來發現設置LD_LIBRARY_PATH這個變量重新登錄后無法生效。GOOGLE了一下發現不建議設置這個系統全局環境變量,于是干脆就把/usr/lib/oracle/10.2.0.4/client64/lib目錄下的文件都cp到/usr/local/lib目錄下。

在$TNS_ADMIN目錄下建立sqlnet.ora文件,內容如下:
SQLNET.AUTHENTICATION_SERVICES=(NTS)
NAMES.DIRECTORY_PATH=(TNSNAMES,ONAMES,HOSTNAME)

在同一目錄下建立tnsnames.ora,內容如下(具體參數需要根據自己實際修改):
FINE_CK=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.3)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=ora92)
)
)

到此為止配置都已經完成,通過sqlplus theusrname/passwd@FINE_CK命令如果能成功連接到ORACLE數據庫,那說明tnsnames.ora文件配置沒有問題。然后可以用unixODBC提供的isql FINE_CK -v命令測試ODBC配置是否正確了,成功連接的話就表明配置都沒有問題,可以使用ODBC連ORACLE了。

补充:
今天发现用2.2.14 x86_64版本的unixODBC虽然能连数据库,但在实际应用程序中无法SELECT,用ISQL工具登录执行select 1 from dual;发现报“IM003”错误。GOOGLE了一下,原来是个BUG,可以手动修改源代码,见http://forums.oracle.com/forums/thread.jspa?threadID=340030&start=15&tstart=60
一个省心的办法是直接下载测试版本的2.2.15pre,然后编译并安装。此时运行odbcinst -j;发现系统DSN和ODBC DRIVER配置文件的目录从/etc/目录改为/usr/local/etc/这个目录。要把原来的文件复制到新目录,其他不变。

Tuesday, December 30, 2008

wl-500gp v2 boots kamikaze(kenel2.6) without wifi

发觉如果仅仅是用来做路由或者加上U盘做个FTP的话,WL-500gp v2刷openwrt的2.4内核+brcm wl的wifi驱动应该是完美了。

但对于wl-500gp+linux 2.6来说,能发挥想象的空间真的是太多了,虽然现在open source的b43驱动对于wl-500gp v2的那个妖腻的无线模块来说还不能用,不过还是有先放弃WIFI,刷2.6做自己想做的东西的冲动~~!

冲动之下,参照http://wiki.openwrt.org/OpenWrtDocs/Hardware/Asus/WL500GPV2先尝试了一下没有USB的配置,成功BOOT。一开始是SVN了最新的kamikaze代码(r13774),且没有修改prom.c和setup.c(CFE的问题导致无法BOOT),不修改是为了偷懒(哈哈),想看看是不是最新的代码里解决了这个CFE的问题,结果发觉不行,启动不了,倒~~!

期待B43快点搞定LP PHY~~~!

对于USB2.0,似乎存在问题,所以只启用了USB1。在make menuconfig里面没有选USB2,只是选了OHCI的USB1,然后也没有patch usb2.0,直接在make kernel_menuconfig的Device Drivers-->
USB support-->OHCI support for Broadcom SSB OHCI core。

Monday, December 22, 2008

OpenWRT kamikaze with linux2.4 on wl-500gp v2

京东上买了一个wl-500gp,看中的是有2个USB2.0口,用处多多啊~~!拿到手一看是v2版本的。昏倒了,V1的缩水版,不过没关系,跟自己比是缩水了,但和其他的比还是不错的。由于bcm5354芯片在LINUX2.6下WIFI部分暂时不能用,所以本来是想用kamikaze linux2.6内核的,只能暂时等等,希望OpenWRT的开发队伍努力把WIP这个状态快点改变成SUPPORT。

对于BCM5354,TOMATO支持的是不错的,DD-WRT也支持,貌似都是2.4内核。可惜DD不太稳定,慢;TOMATO是不支持USB,只能放弃这2个。对于ASUS的那个OLEG,准备在刷OpenWRT和DD以及TOMATO都不成功的情况下尝试。

在OpenWRT的主页上发现跟WL-500GP V2几乎一样硬件的WL-520GU,最后给出了一个WL-520GU上刷kamikaze with linux2.4内核的一个页面http://mightyohm.com/blog/2008/11/building-a-wifi-radio-part-4-installing-openwrt。这个完全兼容WL-500GP V2,那个页面也有作者自己编译好的TRX文件下载。我自己也编译了,但是因为没有CONSOLE,不高兴尝试。直接拿来主义。

刷的过程挺简单,比上次刷WHR-HP-G54要简单:
1.先是把电源拔掉,然后按住RESET不放,接上电源。
2.看到灯闪了之后过一秒,然后放掉RESET,此时应该进入了RESTORE模式。
3.应该这个时候能PING到路由器192.168.1.1。
4.然后TFTP把trx文件传上去(我是在XP的CMD里的):tftp -i 192.168.1.1 PUT openwrt-brcm-2.4-squashfs.trx
5.我发现4秒钟就搞定了。按照网上说的,因为ASUS的路由没有刷好之后自己重新启动的功能,所以要等个3到5分钟(主要是没有串口连接,否则人家都能从串口输出上看是不是完成)。
6.3分钟后我拔掉了电源,然后等了几秒再接上电源。
7.发现很快就能PING到路由,但是POWER的灯要过一段时间才亮,因为在创建JFFS文件系统(就是那个可写的文件系统)。
8.一切OK之后就可以TELNET进去了,如果进去之后改了密码,就开启了SSH同时关闭了TELNET。
9.一开始无线是关闭的,要进行配置,具体见http://mightyohm.com/blog/2008/11/building-a-wifi-radio-part-4-installing-openwrt

Monday, September 29, 2008

淘了一台PowerMac G4 400 (AGP 2X, Graphite)

本来是想淘PowerMac G3 450的,谁知道淘宝卖家快递过来的居然是G3 300,我倒!powermac g3系列只有450肯定是第二版改进过的主板,而300的肯定是第一版不支持slave硬盘的,那本来想放家里搞个文件ftp server都不行,只好退货。

继续淘,大多都是非本地卖家,只有一家本地卖家,但价格开得有些高。最终看到有个实体店在龙漕路上的,就直接过去看了。果然,g3 450在国内应该属于是希世珍品了,那个实体店也只有2台残缺不全的g3 350,而且ide控制芯片也是第一版的,淘g3绝望中。。。。。

不过无意间发现他们有好多powerMac g4 400的机器,因为广告公司退下来的,仔细看了一下,成色还是不错的,9成新一定有。500rmb一台。再看看旁边一排镜面的PowerMac G4,这个贵了,2000+rmb,放弃。powerpc g4 400Mhz的芯片好歹也要比intel的piii 1Ghz强吧!本来准备把给爸爸上网的机器的cpu换成piii 1G的,再给他加个dvd光驱和sdram的内存,现在想想,一个PowerMac G4主机才500,里面包括了sdram和dvd光驱,以及艺术品般的机箱!而且来都来了,挑个回去mac os x 10.3一下应该没问题。

或许大多数国人都是这样,不是自己的东西是不会去爱惜的!我一共看了5台机箱,每个机箱里的塑料扣子都有坏的,有些甚至几个全掉了,明显都是关机箱的时候蛮力的结果!最终选了一个扣子都在,但有一个坏掉的,哎~~!试了下机器,里面预装的是mac os 9.2,用起来不太习惯,明显跟10系列有些不一样。看了下内存,有128在上面,一看就是自己加的,就是那种kingmax tiny bga封装的,我自己也有2根这样的,pc-150,128m的,哎,太小了,是512就好了。显卡是AGP 2X的镭pro,不是最早一批的pci显卡,也不是后来的AGP 4x,中规中举。

决定就这台了,叫卖家送根256的内存,硬是不肯,只肯送128的。回家一看,他给错了,给了根256M pc-150的kingmax,窃喜。哈哈!加上一根自己的128之后512的内存,把原装的20g的5400转的硬盘换成了80g的7200转的硬盘,更新到2001年的那个4.2.8的firmware,然后装了Mac OS X 10.3.5,先试试速度如何。发现平常的应用完全没问题,响应速度大大出乎我意料,跟我的iBook G4 1Ghz的差不多速度,谁叫笔记本硬盘弱呢?

也许pc业里只有苹果的电脑有收藏价值,几乎每一部苹果电脑的主机都是一个精心设计的艺术品(不排除有几款的确也很傻)。
可惜啊,苹果抛弃了优秀的power这个架构投向了intel,对于苹果来说绝对是件好事,聪明之举,既降低了成本,又迎合了广大x86架构使用者。但我的一个梦想就因此永远无法实现——用自己的钱买一台全新的PowerMac G6。

Saturday, September 13, 2008

miniBSD from FreeBSD 7.0r

网上有使用FreeBSD 4.x , FreeBSD 5.x , FreeBSD 6.x 制作miniBSD的具体方法(miniBSD from FreeBSD 4.x),但我手头只有FreeBSD 7.0r,所以参照FreeBSD 6.x的方法作了一个尝试,原文是刷到CF卡里的,但我没有CF卡,但有U盘,所以刷到了U盘里,可是用U盘启动总是显示出所有寄存器的值之后报BTX halted错误。最后只好使用vmware虚拟出一块ide硬盘测试从FreeBSD 7.0制作的miniBSD。

1.安装FreeBSD 7.0
这个不用多说,你有盘装起来应该不成问题,选择minimal安装即可。

2.安装jail
2.1安装jail软件包
sysinstall进入到配置里,先进入Options,把Install Root改成/usr/jail
然后进入Custom里的Distributions,选中minimal,之后commit安装。
2.2复制文件到jail里
#cp /etc/resolv.conf /usr/jail/etc/resolv.conf
#cp /boot/kernel/kernel /usr/jail/boot/kernel/kernel
#cp /boot/defaults/loader.conf /usr/jail/boot/defaults/loader.conf
#cp /etc/localtime /usr/jail/etc/localtime
#cp /etc/wall_cmos_clock /usr/jail/etc/wall_cmos_clock

3.进入jail
3.1.设置prompt变量,否则你进入到jail之后自己也不知道有没有退出。
编辑/usr/jail/root/.cshrc文件,在最后加上
set prompt = " miniBSD %~ %# "
3.2.挂载dev并进入jail
#mount -t devfs devfs /usr/jail/dev
#chroot /usr/jail /bin/csh
此时命令提示符就变成之前设置的miniBSD#了,这样就知道自己在jail里。

4.创建文件夹
这一步可以自己创建,也可以使用脚本文件(脚本文件的原作者在脚本中有注明)。create-minibsd-dirs.sh


5.复制boot里的文件和binary
5.1.复制loader
#cd /boot
#cp -r loader /usr/minibsd/boot/
#cp beastie.4th /usr/minibsd/boot/
#cp frames.4th /usr/minibsd/boot/
#cp screen.4th /usr/minibsd/boot/
#cp defaults/loader.conf /usr/minibsd/boot/defaults/
5.2.复制工具binary
使用一个脚本,mkmini.sh 参数为minibsd6.files
mkmini.sh
minibsd6.files

6.定制kernel
我直接用了general的,省时省力,等boot miniBSD成功之后再定制也不迟,呵呵。
最好把kernel压缩一下,这样可以节省空间。
#cp /boot/kernel/kernel /usr/minibsd/boot/kernel/
#cd /usr/minibsd/boot/kernel
#gzip -9 kernel

7.复制lib
mklibs.sh
用脚本根据复制的binary来复制lib之后,还差几个lib需要复制。
#cp -p /usr/lib/pam* /usr/minibsd/usr/lib/

8.复制/etc里的配置文件
8.1.设置密码
因为密码文件是由passwd命令产生的,所以先在jail里把密码用passwd设置好,然后再把密码文件复制到miniBSD里。
8.2.复制/etc
这个是原本是freebsd6的,7里面我已经修改过了。
copy-etc-6.sh

9.设置配置文件
9.1.把/usr/minibsd/etc/fstab作一下修改,因为当用硬盘启动miniBSD的时候,硬盘是被认作ad0的,设置成只读,这样对于CF卡之类有好处,不至于卡很快报废,呵呵。内容如下:
/dev/ad0s1a / ufs ro 1 1
9.2.对于/usr/minibsd/etc/rc.conf需要进行设置,根据自己实际情况设置,
因为没有swap,所以dumpdev="NO",另外要使用到内存盘,因为我们的/文件系统是read only的。这里可以使用rc.diskless2,有空我研究一下。我的内容如下:
hostname="jojo.minibsd"
sshd_enabled="NO"
usbd_enabled="NO"
sendmail_enabled="NO"
inetd_enabled="NO"
portmap_enabled="NO"
update_motd="NO"
varsize=8192
varmfs="YES"
tmpmfs="YES"
tmpsize=8192
dumpdev="NO"
9.3.为了跳过启动时的十秒等待,可以编辑/usr/minibsd/boot/boot.rc这个文件,加入如下这行:
autoboot 0

10.打包miniBSD
#cd /usr/minibsd
#tar cfvz /usr/minibsd-7.tar.gz *

11.把miniBSD复制到硬盘(CF卡或者U盘)上(如果你想用dd命令把磁盘文件直接刷到硬盘上,直接跳到12)
因为我的主板USB启动有些问题,可能是FreeBSD的loader跟我的主板不兼容,所以我使用IDE硬盘,如果你是U盘的话,下面的ad1和ad0都改成da0即可。
10.1.格式化硬盘,因为ad0是第一块IDE,所以新接上去的这里是ad1。
#fdisk -BI /dev/ad1
11.2.创建一个slice,使用整个硬盘空间。
#bsdlabel -B -w ad1s1
11.3.创建filesystem。
#newfs -U /dev/ad1s1a
11.4.挂载到/mnt。
#mount /dev/ad1s1a /mnt
11.5.把刚才打包的miniBSD全解包到/mnt目录。
#cd /mnt
#tar xfvzP /usr/minibsd-7.tar.gz
11.6.设置成可引导,即把boot0程序写进硬盘的mbr
#boot0cfg -v -B ad1
11.7.跳到13

12.把miniBSD刷到硬盘(CF卡或者U盘)上
12.1首先获得要刷的磁盘大小
#bsdlabel -w -An-B ad1 auto | grep sectors/unit
得到一个sector的数量。
12.2创建磁盘文件(内容用零填充),[number of sector]就是刚才得到的数字
#dd if=/dev/zero of=/usr/minibsd-disk.bin bs=512 count=[number of sector]
12.3创建一个minibsd-disk.bin文件的vnode
#mdconfig -f /usr/minibsd-disk.bin -u 0
12.4现在我们对/dev/md0这个vnode的操作就等于是对磁盘文件minbsd-disk.bin的操作了。
#fdisk -BI /dev/md0
#bsdlabel -B -w md0s1
#newfs -U md0s1a
#mount /dev/md0s1a /mnt
这几步格式化了vnode,创建了一个slice和一个ufs文件系统,并挂载到/mnt目录下。
12.5把我们的minibsd解包到/mnt
#cd /mnt
#tar xfvzP /usr/minibsd-7.tar.gz
12.6对vnode的操作结束,清理一下
#cd /
#umount /mnt
#mdconfig -d -u 0
12.7现在可以用dd命令把装有miniBSD的minibsd-disk.bin文件刷到硬盘上了
#dd if=/usr/minibsd-disk.bin of=/dev/ad1 bs=8k

13.用装好的minibsd引导
把这块装有miniBSD的硬盘接到电脑上启动吧。

我这样做出来的miniBSD打包后9M,这样的一个精简的Freebsd能干什么呢?加入自己想要的,像m0n0wall和pfSense一样做个路由不错。不过这可是DIY的哦。

Monday, September 8, 2008

从dd-wrt v24-sp1刷到tomato v1.21

能刷dd-wrt不代表你能高效得运行。果然今天就遇到了路由CPU 100%的时候,网页都开不了。而且dd的控制页面虽然蛮漂亮,但内存少了之后就反应很慢了。看来16M内存还是相当不够的,况且我还有很多DD的服务都是没有开的。这么看升级到32M甚至64M的内存不是没道理。

既然效率不高,就打算换tomato,从二进制的bin文件上看,tomato东西的确应该比dd要少,dd标准版2.4sp1是3.6M,而tomato v1.21是2.7M,小了差不多1M,跟dd的micro版本差不错。同时LINUX2.4内核,东西小,功能就少,希望效率也高,呵呵。

从原厂刷比从dd刷步骤繁琐(这个繁琐的步骤在刷DD的时候已经体验过了),幸好现在我是从dd刷起。网上说dd在nvram中的密码是加密的,而tomato是不加密的,所以要把dd的密码设置成密文大家都知道的admin(尤其是没有reset按键的路由,一开始没理解为什么),其密文是bJz7PcC1rCRJQ,也就是tomato的密码。否则不是admin作为密码的话你就要自己登录到路由的控制台去看nvram里的密文了,具体操作GOOGLE一下就知。

从DD的更新页面选tomato.trx,点UPDATE的时候说不是BIN文件,看来够笨的,只从后缀看,那就把后缀改成BIN,然后再选择,再点UPDATE。然后就是等待,发现等待的时候会出现秒数倒计时,不过明显不准的,呵呵。

好了之后路由自己就重新启动了,最紧张的时候到了,因为我在更新的时候选的是don't reset,不回复到默认设置,所以现在路由的地址还是原来的192.168.2.1。果然,打这个地址要求登录,不过怪了,死活登录不了,用了root+bJz7PcC1rCRJQ和admin+bJz7PcC1rCRJQ都不行,不知道哪里出问题了。这回才体会到reset按键的重要性,不管三七二十一,反正进不去了,直接按了RESET,重启之后用PSP连了一下,发觉路由地址变成192.168.1.1了,看来RESET起作用了,由192.168.1.1登录,然后用默认用户名和密码root+admin顺利进去了。

第一感觉,web的ui管理界面速度很快,比DD的快不少!看了下菜单,功能的确没有DD多。功能没有DD多不是说拥有的功能没有DD强!用了一下,看了下空闲内存,果然印证了网上流传的一句话,用来玩刷DD,用来当路由刷TOMATO。现在要把NVRAM清空一下,这样就可以去除之前遗留在NVRAM中但TOMATO用不到的数据。TOMATO的WEB管理UI中直接有清除NVRAM的功能,在administration->Configuration->Restore Default Configuration中,选择Erase all data in nvram memory(throrought),点OK之后所以的设置就像按了RESET一样(不知道我之前按的RESET是不是已经做了这步了?)。希望TOMATO能稳定快速的运行。

对于DD,其实我还是蛮喜欢的,但就是硬件机能不够,玩DD不爽。现在DD有支持X86的了,貌似可以考虑把家里的c400+i810+256M的老台机整成DD的路由玩。呵呵~~!

Friday, September 5, 2008

给WHR-HP-G54-AP洗脑

本来是想用一阵子Buffalo AirStation的原厂固件的,但发现老是有人蹭我的网,而且你蹭就算了,关键是搞得我下载东西只有10k/s的速度了。可以做MAC过滤,但这个比较不好玩,直接到www.dd-wrt.com去下了v24-sp1版本的固件准备刷到小黑脑袋里。然后玩玩QoS,呵呵!

做任何事情貌似还都要求手快,原来把下载的固件传到路由上还不是那么简单的,不过说不简单,其实对于手快的朋友简直就是小事。

按照网上教程所说的:
1.按住RESET(居然说至少30秒,我用牙签按得手酸快了),然后拔掉路由电源。
2.到固件存放的本地目录准备好用tftp上传固件到路由。先把命令打好,回车先不按,要等下考验眼明手快的,哈哈。
我的固件放在I盘,上传命令:tftp -i 192.168.11.1 PUT dd-wrt.v24_std_generic.bin
3.这部是关键,先接上路由电源,按住RESET,当面板上红灯开始闪的时候立马放开RESET去按回车。我失误了2次,主要是对于红灯闪的时机没有判断好,导致了2次上传失败的TIMEOUT。成功的话会告诉你TRANSFER SUCCESSFUL。之后就是等路由重启。现在可以通过192.168.1.1进入DD-WRT的设置界面了。哈哈。

听说TOMATO比DD稳定,等我发现DD不稳定的时候再洗脑一次,洗个烂番茄进去,咔咔~~!

ibook G4 + Netgear wg111 v3 实现无线上网

ibook g4的airport extreme ii卡实在是贵得离谱,无奈之下google了一下mac os x 10.4支持的usb无限网卡。发现价格比较合理的有一款美国网件netgear的wg111 v2的usb无线网卡官方驱动支持mac os x,顿时看到了希望,立刻去淘宝和京东看有无现货。

令人失望的是,v2版本的都没有卖了,现在市面上卖的都是v3的版本。上netgear官网看了下,v2是有mac os x的驱动的,v3还没有。我倒~~!没驱动不就等于零嘛,总不见得去买个二手的wg111 v2?

继续google,发现原来netgear的这款wg111 v2是使用realtek的8187L芯片的,而wg111 v3是使用realtek的8187B芯片的,难怪有些同学用v2的驱动来驱动v3没有效果,原来内部芯片都改变了。既然什么都是芯片导致的,那就直接去realtek官网看看8187B芯片有没有mac os x 10.4的驱动吧。

哈哈!运气不错,realtek虽然现在还没有提供8187B芯片的linux驱动,但windows和mac os的驱动都有了。马上下载安装,重新启动之后等了蛮长时间进了系统,然后拿出从京东上买的WG111 V3,插入usb接口,哈哈,跳出了realtek的设置界面,从WHR-HP-G54-AP上dhcp了ip地址,隔了两堵墙,信号强度在60%左右,比较稳定。立即打开FF3,写下了这篇日志。

希望对于有ibook但觉得airport extreme ii卡贵的朋友可以作为一个参考!

Wednesday, August 13, 2008

20080809-20080812 HongKong

這次去香港主要是為了看奧運的馬術比賽,在雙魚河。

第一天
一大早就赶到虹橋,發覺奧運期間的2次安檢也不是想象中那麼慢。和上次一樣,花了2小時多一點到了寶安,順利坐上了K568前往羅湖。中途由于司机開得太猛,爆胎了,只能被迫上了之後那輛K568,順利到達口岸,在羅湖的橋上我拿出了手機想看一下申請的漫遊是不是有用,呵呵,滿格信號,半信半疑,叫妮妮拿出她沒有漫遊的手機對比一下。問題來了,死活找不到她的手機,這下妖了,難到掉了?我立刻打她手機,無人接听,還好,應該沒有落入他人之手,問題是在哪呢?我一刻不停的打,妮妮仔細聽聲音,完了,不在身上,也不在包裏,難到在路上掉了?或者是在K568上?那一定完了,K568到站之後就立馬上客,客滿即走,看樣子要去香港再買部手機了,哎!出師不利阿!!!不過妮妮這時拿了通行證就跑向了關卡,我知道她要去K568到這里的一路上找一下,必竟現在還是無人接听狀態。我不停打了大概15分鍾,突然有人接起來了,哇塞!陪伴了妮妮一年的N95失而复得!後來妮妮說還好手機是掉在了爆胎的那輛上,之後那輛早就開走去寶安了。她發現爆胎的那輛司機正坐在車上吃午飯,而後她上去找了一圈沒找到,正准備离開的時候突然聽到自己手機響,才在加坐的夾縫裏找到的。如果當時我沒有打她手機的話估計真的要買新手機去了。哈哈!

到了銅羅灣後立馬去換領了奧運馬術門票。哈哈!晚上吃了頓日本料理,發覺价格和上海差不多,還便宜呢!

第二天 大嶼山
起的不是很早,換東涌線來到大嶼山。原來這里有個OUTLETS,看樣子從山上下來到里面買點東西是個不錯的選則哦。哈哈。本來是想坐纜車上山的,可看了一下這坐纜車的人數,當即決定坐纜車下面的直達大巴——大嶼通!這山路叫驚險阿~~~!路上風景很不錯,還看到了牛,哈哈,山上還有個湖泊,很美~~!在接近蓮花禪寺的時候發覺那里雲霧繚繞,后來進了寺才發現這些雲霧都是三根光盤直經的香燒出來的,倒~~~!

在寺中門票加中飯的素齊是$60,素齊多是多得2個人根本吃不完,難到這是為了體現佛主的大慈大悲?

回家坐的是E11,發覺比軌道交通快不少,才花了30分鐘就到銅羅灣了,難怪票价要比地鐵貴哦,呵呵。

第三天
在雙魚河高爾夫球場舉行的馬術室外越野賽是早上8:00開始的,我們要從銅羅灣赶到金鍾坐頭班奧運班次5:15的地鐵,最終要在比賽前1小時到東鐵的粉嶺站坐奧運馬術穿梭巴士到雙魚河。一大早4:15就起來准備,然后頭一次坐上了紅色的士。發覺副駕駛座位由于把波箱的位置都包括了,所以真的很寬,可以坐2個人。一個起步費$16就到了金鍾地鐵站,發覺等候5:15分那班的多半都是老外!

老天真不作美,居然下雨,不過還好賽事主辦方提供每人雨披,否則就慘了。

第四天
睡到早上10點,呵呵,這幾天起得最晚的一天。四處逛逛買點東西,下午5點坐上東鐵去羅湖。

Sunday, June 22, 2008

这几天突然想玩WII,发觉WII也能运行HOMEBREW了,阿哈哈

论坛逛了一圈想看看有什么好玩的游戏,结果发现就在近日WII的ZELDA漏洞被利用,而且可以跟PSP一样运行自制程序了,哦哟哟,爽了,WII终于升值了(升使用价值,不是升价格,呵呵)。http://hbc.hackmii.com/下载了homebrew_channel的beta8安装iso,刻盘安装,一切顺利。唯一惋惜的就是错过了升级3.2j,依旧停留在3.1j。现在的3.3j据说有猫腻,不能升,反正不急升,有自制才最重要。

有了这个channel之后所有的自制程序都可以通过这个频道免zelda光盘引导了,利马下载了OPERA的WAD文件,然后用WAD MANAGER这个自制程序安装,成功!发现破解的wiiware现在都可以很顺利的通过wad manager安装了,省钱,哈哈。不过下了几个wiiware的游戏,就一个不能玩,就是那个玛丽医生,估计是要3.2j才能玩,可恶的升级~~!

最让我兴奋的是自制程序的fc、SFC、MD等模拟器都能通过homebrew channel正常运行。这下可以免去买GC手柄的开销,直接用WIIMOTE就OK了。

像PSP一样wii能直接运行SD卡上的LINUX(GC-LINUX可以通过homebrew channel运行)。具体没试过。

能运行linux才是无敌的~~!因为LINUX上能跑你想要的程序哦。

Saturday, June 21, 2008

试了一把psp上的linux

uClinux v2.6.22-uc1,在http://dl.qj.net上能下载到,uClinux应该是专门用在嵌入式系统上的一个LINUX版本,老外很钻研阿,搞到PSP上了。我的PSP自制系统是3.52m33,把uClinux v2.6.22-uc1下载后放在运行1.5程序的文件夹下就OK了。

果然能够正常运行,但毕竟uClinux单薄了点,没办法,PSP内存的问题导致啊~~!输入法很奇特,使用L和R或者L+R。唯一遇到的一个问题是发觉用halt命令不能退到自制系统,而是直接关机了,说明uClinux的运行时跟自制系统无任何关系哦。

Tuesday, April 15, 2008

linux里把显存当swap或者ramdisk

原先认为显存大如果不玩游戏是浪费,现在看来在LINUX里并非如此,划出大部分显存当作swap也是个好主意,至少可以让swap脱离疯狂旋转的硬盘,呵呵~~!看了一下 "http://gentoo-wiki.com/TIP_Use_memory_on_video_card_as_swap" 的guide,自己动手把256M的显存的后128M划了出来当swap,nice~~!

2.6的内核已经加入了MTD(Memory Technology Device),首先当然是要在内核中启用罗。
Device Drivers --->
Memory Technology Devices (MTD) --->
Memory Technology Device (MTD) support
[* or M]Direct char device access to MTD devices
[* or M]Caching block device access to MTD devices
Self-contained MTD device drivers --->
[* or M]Uncached system RAM
[* or M]Physical system RAM
我是全make成module,然后在/etc/modprobe.autoload.d/kernel-2.6中加入,启动时自动加载的。
GUIDE上说"Uncached system RAM" is the slram driver,"Physical system RAM" is the phram。不知道这2个到底有什么区别,我是用了slram,phram应该是一样的。

内核搞定之后就是要找出显存的起始地址了,使用lspci -vvv | grep 256,因为我知道自己的显存的大小,所以直接加上过滤得到
Region 0: Memory at fe029000 (32-bit, non-prefetchable) [size=256]
Region 0: Memory at d0000000 (64-bit, prefetchable) [size=256M]
Region 4: I/O ports at de00 [size=256]
Region 0: I/O ports at ee00 [size=256]
Region 0: I/O ports at ce00 [size=256]
Region 1: Memory at fdcff000 (32-bit, non-prefetchable) [size=256]
只要prefetchable的那条,即Region 0: Memory at d0000000 (64-bit, prefetchable) [size=256M],这里的d0000000也就是0xd0000000(HEX形式)就是我们所要的显存起始地址。

然后就是做加减法运算,先要把预留给显卡用的显存算好(单位是byte),给他128M,那就是128*1024*1024=0x08000000,这个值和起始地址一加,得到的就是我们准备使用的那剩下的128M显存的起始地址,即0xd8000000。有了这个值之后把我们要用的显存的大小也用HEX表示,即要用剩下128M=0x8000000。
然后#modprobe slram map=VRAM,0xd8000000,+0x8000000
## cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00004000 "VRAM"
这就说明这个slram模块加载成功了。

最后就是要创建一个设备文件,这样就可以通过那个MTD设备文件来使用我们从显存里划出来的那部分了。
因为我使用了udev,所以直接
#modprobe mtdchar
#modprobe mtdblock
就可以了,这样那个mtd设备文件就出来了,即/dev/mtdblock0

最后就是把mtdblock0这个设备文件看成普通的硬盘分区当成swap用了。
mkswap /dev/mtdblock0
swapon /dev/mtdblock0 -p 10

为了不要每次重新启动之后都这样设置,就在/etc/fstab中把原来的swap那行注释掉,换成
/dev/mtdblock0 none swap sw,pri=10 0 0
接下来的任务就是要在LINUX启动时自动重新mkswap一下,因为LINUX不像FreeBSD那样不需要swap标志来使用swap分区。因此要在init过程的swapon -a这个命令执行之前mkswap,在以前的版本是到/sbin/rc这个脚本里去加,现在是在/etc/init.d/localmount这个脚本里,在'swapon -a'这个命令前添加'awk -- '/swap/ && ($1 !~ /#/) { system("mkswap "$1"") }' /etc/fstab',这样就可以自动找到fstab中未被注释掉的swap分区,在其上面执行mkswap。
最后要确保/etc/modules.autoload.d/kernel-2.6文件中有如下3行来自动加载模块:
slram map=VRAM,0xd8000000,+0x8000000
mtdchar
mtdblock

OK,全部搞定,重启之后top一下:
top - 06:46:57 up 44 min, 1 user, load average: 0.22, 0.06, 0.02
Tasks: 70 total, 2 running, 68 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.2%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4048616k total, 377812k used, 3670804k free, 16052k buffers
Swap: 131064k total, 0k used, 131064k free, 132188k cached

最后的最后就是要注意的地方,如果使用的是官方显卡驱动,那么他会把所有显存都用掉,那就和我们使用的那部分冲突了,所以我使用的是vesa的驱动,可以自己设置VideoRam这个值,这样就不会使用到我们划出来的部分。其实你可以算出以你的分辨率和色彩需要使用多少显存,然后把剩下的都划出来,估计不超过16M,那真的是大大部分都可以划出来了。

Sunday, April 13, 2008

linux不是一般的牛,显存用作swap

发觉linux能将显存用作swap,很牛,有空试一下。不知道能不能把显卡的芯片当作计算用的处理器哦。

Saturday, April 12, 2008

linux的tmpfs与windows的ramdisk

在windows上用的是ramdisk,可以把内存作为硬盘用,发觉在上面作压缩等操作很爽啊,把windows的temp文件夹和ie临时文件夹都放上面,开网页速度也有提高,把bt下载暂时存放在ramdisk上再也不用担心有损硬盘了,不过鱼和熊掌不能兼得,现在担心的是BT下到最后一点断电了怎么办?在linux上2.4之前的kernel也使用ramdisk,之后开始在内核中增加了tmpfs的支持,于是直接尝试tmpfs,把gentoo编译时的临时文件夹/var/tmp/portage挂载成tmpfs。

tmpfs和ramdisk有些不同,在windows里我创建了512M的一个ramdisk之后内存就直接被用去了512M,不管你有没有往这个分区放东西,而tmpfs挂载的64M的/tmp并没有一上来就全部用掉64M内存,而是要多少从内存中取多少直到64M。这么看来tmpfs还是比较能够节约内存的,就算分配了2G的tmpfs分区,不往里放东西也不用担心2G内存会白白耗在那里。而且就算装满2G,把这2G东西都删了,那这2G又都还给内存了。

其实这就是ramdisk和tmpfs本质的区别,一个是块设备,而tmpfs是一个文件系统。但tmpfs也有一个问题,因为是文件系统,所以在内存吃紧的时候可能会使用到swap,又回到硬盘了,昏倒。看样子主要关键还是要内存,内存大才是硬道理!但至少巧妙使用ramdisk或者tmpfs可以使得系统速度有很大的提升。

Friday, April 11, 2008

gentoo开机启动第二块网卡

首先要把网卡驱动编译进内核或模块加载,
此时使用ifconfig eth1命令应该能看到网卡的信息。

然后在/etc/conf.d/net中把第二块网卡配置好。

之后使得开机启动第二块网卡。
#ln -s /etc/init.d/net.eth0 /etc/init.d/net.eth1
#rc-update add eth1 default

Tuesday, March 4, 2008

linux统计目录下文件个数的命令组合

使用ls -l列出文件和目录,如果还需要子目录中的话就ls -lR
然后用grep "^-"过滤以-开头的行(即普通文件)
最后用wc -l统计过滤出来的行数。

即$ls -l | grep "^-" | wc -l

Sunday, February 3, 2008

java locale的设置

今天碰到一个问题,指定了一个SimpleDateFormat的格式为yyyy-MMM-dd,然后传一个字符串"2008-Feb-03"让他解析,结果在家里的机器上没有问题,但在公司的机器上说不认识"Feb",我倒~~!

比较了2个java环境,家里的locale是US,公司的是CN,所以公司机器要使用"2月"这个形式而不是"Feb"。所以只能在公司机器的java程序里设置locale。

设置代码:
Locale locale=new Locale("en","US");
Locale.setDefault(locale);
SimpleDateFormat format=new SimpleDateFormat("yyyy-MMM-dd",locale);
Date date=format.parse("2008-Feb-03");
System.out.println(format.format(date));

Friday, February 1, 2008

在RHEL5.1上安装oracle 11g(linux x86_64)

以前在Debian上面成功安装过oracle 9i,那时费了好大的力才把需要的包一个一个apt-get过来。现在用Gentoo,但使用的是纯64位软件,所以估计没法装oracle 11g(x86_64版本貌似仍然需要一些32位的包)。都怪linux发行版五花八门,不象windows那么千篇一律。

这次在HP ProLiant G5上装了一个RHEL5.1,所以准备在这上面装一个oracle 11g x86_64的版本用作开发测试。值得庆幸的是RHEL是oracle认证的linux发行版,而且oracle自己的那个linux也是基于redhat的,所以应该问题不大。

最最值得庆幸的也是要感激的就是Jeff Hunter已经在CentOS5.1上成功安装了oracle 11g,英文原文Installing Oracle Database 11g Release 1 on Linux - (RHEL 5),因为CentOS是对RHEL的100%兼容版本,所以理论上RHEL上按照他给出的步骤可以100%成功安装。太easy了,傻瓜式的按部就班。在扮演傻瓜的同时也学到了不少redhat linux与Debian,Gentoo,FreeBSD所不同的地方。

1.安装RHEL5.1
这个没什么好说的,每个人有每个人的装法,就罗列一下安装的package groups。
*Desktop Environments

GNOME Desktop Environment

*Applications

Editors

Graphical Internet

Text-based Internet

*Development

Development Libraries

Development Tools

Legacy Software Development

*Servers

Server Configuration Tools

*Base System

Administration Tools

Base

Java

Legacy Software Support

System Tools

X Window System

2.装好之后把firewall和SELinux都暂时关掉。然后把oracle11g需要的包都检查一下是否全部都有,没有就从dvd装。
binutils-2.17.50.0.6

compat-libstdc++-33-3.2.3

compat-libstdc++-33-3.2.3 (32 bit)

elfutils-libelf-0.125

elfutils-libelf-devel-0.125

gcc-4.1.1

gcc-c++-4.1.1

glibc-2.5-12

glibc-2.5-12 (32 bit)

glibc-common-2.5

glibc-devel-2.5

glibc-devel-2.5-12 (32 bit)

libaio-0.3.106

libaio-0.3.106 (32 bit)

libaio-devel-0.3.106

libgcc-4.1.1

libgcc-4.1.1 (32 bit)

libstdc++-4.1.1

libstdc++-4.1.1 (32 bit)

libstdc++-devel 4.1.1

make-3.81

sysstat-7.0.0

3.确保/tmp有大于400M的空间并设置内核参数。
在/etc/sysctl.conf文件中有内核参数。
# +---------------------------------------------------------+

# | SHARED MEMORY |

# +---------------------------------------------------------+

kernel.shmmax = 536870912

kernel.shmmni = 4096

kernel.shmall = 2097152



# +---------------------------------------------------------+

# | SEMAPHORES |

# | ---------- |

# | |

# | SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value |

# | |

# +---------------------------------------------------------+

kernel.sem = 250 32000 100 128



# +---------------------------------------------------------+

# | FILE HANDLES |

# ----------------------------------------------------------+

fs.file-max = 102696



# +---------------------------------------------------------+

# | LOCAL IP RANGE |

# ----------------------------------------------------------+

net.ipv4.ip_local_port_range = 1024 65000



# +---------------------------------------------------------+

# | NETWORKING |

# ----------------------------------------------------------+

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 262144

使用#/sbin/sysctl -p命令让以上设置生效而不需reboot。

4.在/etc/hosts文件中把不要的hostname从回路地址中去掉,把ipv6也去掉。
127.0.0.1 test2 localhost.localdomain localhost
应该改为 127.0.0.1 localhost.localdomain localhost

5.创建oinstall,dba,oper,asm,asmdba这5个组,然后创建一个属于这5个组的oracle用户。在英文原文中对这5个组对应的数据库组有详细的说明。
可以使用命令行来创建:
# groupadd -g 501 oinstall

# groupadd -g 502 dba

# groupadd -g 503 oper

# groupadd -g 504 asm

# groupadd -g 506 asmdba

# useradd -m -u 501 -g oinstall -G dba,oper,asm -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle

# id oracle

uid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba),503(oper),504(asm)
之后设置密码给oracle用户。

6.查看nobody用户是否已经存在。
# id nobody

uid=99(nobody) gid=99(nobody) groups=99(nobody)
如果不存在就创建:
# /usr/sbin/useradd nobody

7.接下来就是创建oracle base directory了,对于非advanced安装,不需要指定数据文件的文件夹。
# mkdir -p /xxx/app/oracle

# chown -R oracle:oinstall /u01/app

# chmod -R 775 /u01/app
如果使用advanced安装,请看英文原文。

8.为oracle用户创建登陆脚本,在/home/oracle/.bash_profile文件中加入:
# User specific environment and startup programs

export ORACLE_BASE=/xxx/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1

export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin

export ORACLE_SID=MYDBSID



export PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin

export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin

export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin

export ORACLE_TERM=xterm

export TNS_ADMIN=$ORACLE_HOME/network/admin

export ORA_NLS10=$ORACLE_HOME/nls/data

export LD_LIBRARY_PATH=$ORACLE_HOME/lib

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib

export CLASSPATH=$ORACLE_HOME/JRE

export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib

export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib

export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib

export THREADS_FLAG=native

export TEMP=/tmp

export TMPDIR=/tmp

9.用oracle用户进入X根据提示进行安装。我选的是基本安装,并且创建初始化数据库应该是没什么问题的,只是等待而已,呵呵~~!好了之后应该可以用https://localhost:1158/em登录了。

10.装好之后我发现重新启动后oracle没自动起来,看来自动启动/关闭脚本还没加,编辑/etc/oratab文件:
MYDBSID:/u01/app/oracle/product/11.1.0/db_1:Y

然后创建/etc/init.d/oracle文件,使得oracle作为系统的service。
文件内容:
#!/bin/sh

# chkconfig: 345 99 10

# description: Oracle auto start-stop script.

#

# Set ORA_HOME to be equivalent to the $ORACLE_HOME

# from which you wish to execute dbstart and dbshut;

#

# Set ORA_OWNER to the user id of the owner of the

# Oracle database in ORA_HOME.



ORA_HOME=/xxx/app/oracle/product/11.1.0/db_1

ORA_OWNER=oracle



if [ ! -f $ORA_HOME/bin/dbstart ]

then

echo "Oracle startup: cannot start"

exit

fi



case "$1" in

'start')

# Start the Oracle databases:

# The following command assumes that the oracle login

# will not prompt the user for any values

su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"

;;

'stop')

# Stop the Oracle databases:

# The following command assumes that the oracle login

# will not prompt the user for any values

su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"

;;

esac

之后# chmod 750 /etc/init.d/oracle
最后就是把这个启动脚本放到服务里面去。
英文原文中使用的是# chkconfig --level 345 oracle on这个命令把这个启动脚本防到3、4、5这3个run level中,但我用这个命令说command not found,只能从图形界面进去手动把这个服务加到服务列表里。效果一样。哈哈。

11.最后的最后就是这个,为了要使用web页面的em,所以必须要把emctl start dbconsole和emctl stop dbconsole放如/etc/init.d/oracle文件的适当位子。否则每次都要手动启动多麻烦啊~~!

英文原文写得很好很详细,我只是把我使用到的步骤从中抽取出来中文化了一下,而且很简略,有能力的朋友强烈建议看英文原文。

RHEL5.1 vnc的使用

RHEL5.1 自带了Xvnc,省得象gentoo里面自己装x11vnc了。先查看一下是否有vncservers的包:
[root@test2 jojo]# rpm -q vnc-server
vnc-server-4.1.2-9.el5

然后编辑配置文件:
[root@test2 jojo]# nano /etc/sysconfig/vncservers
把VNCSERVERS="1:ccair"这行的注释去掉。就是使用ccair登录到display:1,这里display和用户看你的系统了。

现在要设置一个vnc的密码,否则vnc不能被连接使用:
[ccair@test2 jojo]$ vncpasswd
Password:

Verify:
设置好之后在ccair用户的~/.vnc目录下会有相应的passwd文件。

一切设置ok之后就是启动vncserver服务:
[root@test2 jojo]# /sbin/service vncserver start

接下来在ccair用户的~/.vnc目录下会生成一个xstartup文件,打开之后把如下两行注释去掉:
unset SESSION_MANAGER

exec /etc/X11/xinit/xinitrc

最后restart vncserver即可:
[root@test2 jojo]# /sbin/service vncserver restart

现在用vnc客户端可以顺利连接到display1上去了,相应的端口是5901,所以防火墙的5901要打开。

Tuesday, January 29, 2008

java读取utf-8编码文件

发觉直接读中文会出现乱码,所以要这样:
BufferedReader br=new BufferedReader(new InputStreamReader (new FileInputStream(new File("utf-8.txt")),"UTF-8"));