2012年

为了重新安装Lubuntu 12.10,需要备份原来的12.04。因为很多资料还在上面,装好系统就可以直接复制过来了。如果直接复制到Windows分区,权限信息会丢失。于是找了以下方案:

方案一:GHOST备份。

GHOST默认不支持EXT4文件系统,需要先设置options->Image/Tape,选择Image All。

优点:
备份速度快,备份文件小。

缺点:
1)不能查看、提取备份文件。本来用Ghost Explorer可以查看或提取,设置修改备份文件的,但是ETX4的备份文件什么也没显示。
2)需要在DOS、Windows等非Linux系统上进行。

方案二:dd命令。参考资料:http://blog.csdn.net/shendl/article/details/7384755
1)U盘启动Linux LiveCD(现在Linux的发行版一般都支持LiveCD了),进入盘上的系统,打开命令行,执行如下命令,查看第一个硬盘(sda)的分区情况:

sudo fdisk -u -l /dev/sda

2)然后执行备份命令:

dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda1 of=/linux_bak.img

这样,就可以把硬盘上的第一个分区(sda1)数据全部copy到linux_bak.img文件中。
3)还原。进入Linux LiveCD,打开命令行,执行如下命令:

dd if=/linux_bak.img of=/dev/sda1

这样把备份文件还原到硬盘的第一个分区上了。
4)浏览或修改备份文件。执行以下命令:

sudo mkdir /mnt/bak chmod 777 /mnt/bak mount /linux_bak.img /mnt/bak

进入/mnt/bak文件夹,就可以浏览或者修改备份文件了。

优点:
1)一切都是Linux的操作。
2)可以对备份文件进行浏览、提取或修改文件。

缺点:
1)需要在Linux LiveCD上进行备份和还原。
2)只能是备份分区或整个硬盘,如果分区划分的空间比较大,生成的备份文件也一样大。
3)速度慢,特别是备份容量很大的分区。

方案三:tar命令。参开资料:http://www.yesure.net/archives/6984.html

1)备份,在Linux系统中执行以下命令:

sudo tar -cvpzf /media/disk/linux_bak.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/media /

2)还原:

sudo tar -xvpzf /media/disk/linux_bak.tgz -C /

优点:
1)可以在使用中的Linux上直接备份。
2)只备份存在的文件,且备份文件经过压缩,比原始文件小。
3)备份文件就是个Zip文件,可以直接打开浏览、修改。

缺点:
1)备份速度上不如GHOST。
2)备份文件比较大的话,打开速度很慢。

最后,我还是采用了第三个方案。资料上还提示,可以在新立得上装个sbackup(图形界面备份还原工具)。有空再试试吧。

今天很郁闷!做了个PHP页面,Chrome显示正常,IE显示却不正常。本来骂IE、骂微软是正常不过的了,但不是骂完就能解决问题的。

Google的答案是UTF-8的BOM问题。BOM(Byte Order Mark),即UTF-8签名(UTF-8 signature),是UTF编码方案里用于标识编码的标准标记。简单来说,PHP编译代码时,没有理会BOM,造成IE显示错误。也由于使用了CodeIgniter框架,即使改了View页面,也解决不了问题,最后修改了相关的文件,即系Route、Controller、Model等相关页面。简单来说,用UTF-8编码写PHP,就要统一使用无BOM的UTF-8。

感觉每次用新的东西都会这样那样的小问题。其实都是因为基于已有的经验来做,比如因为用Java而使用UTF-8。

Nginx中配置,去掉CodeIgniter URI中的index.php。参考了人家的文章和自己实践,得出配置如下(Nginx-1.2.0中通过):

location /php/ { # "/php" is the location of CodeIgniter
# Hide index.php in URI
rewrite ^(/php)/(?!index\.php|robots\.txt|images|js|style|fckeditor|upload)(.*)$ $1/index.php/$2 last;
}

把以上配置内容添加到Nginx的配置文件nginx.conf即可。

再看看这段配置,其实就是用URI跳转来实现,而且是用正则表达式匹配和替换。感觉很优美~

今天尝试使用CodeIgniter(一个高效的PHP框架)来做点东西,但是根据官方教程(http://codeigniter.org.cn/user_guide/)去做,也总是显示404页面。于是寻求Goolge帮助。原因很简单,就是Nginx不支持PATH_INFO,地址是一截一截的那种。最后找到的有效解决方法是http://linux008.blog.51cto.com/2837805/546489

主要的Nignx配置如下:

location ~ \.php { # no "$" at the end of "php"
# root f:/httpd/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$; #support PATH_INFO
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}

今天偶然查了下二级域名的设置。想想,既然买了个顶级域名,那二级域名应该可以随便设。立马试了下,果然可以!用了一年多的Blog(foxail.org/blog),可以通过 blog.foxail.org 来访问了。噢~突然一下子,世界又变美好了!哈哈哈~

5月20日,一个听起来就特别浪漫的日子。而且能拖着女朋友去参观“广东美术学院本科毕业作品展”,要多美好就有多美好。但是故事的结局总是让人意想不到,现实还是残酷的。回到豆丁家,因为一个玩笑,弄得她生气了。而我,像个傻瓜一样呆在角落里,还傻得呆了一个晚上。如果是以前,一个道歉就没事了。但是,这次却连短信都不想发,眼睁睁地看着520的离去,在期待与挣扎中,痛苦地睡过去。道个歉的根本不是问题,但是,这种事情可不可以不再发生?

我想,是不是我们发展得太快以致我觉得一切都理所当然?或者在相处的过程中我过于追求自己的感受而忽视了她?此时,深深体会到那句话的意思:“人在面临幸福时会突然变得胆怯 ,抓住幸福其实比忍受痛苦更需要勇气 。”

爱,不是一生一世的承诺,而是承担一辈子的责任。爱越深,责任越大。男人嘛,就应该随时承担起这责任。

经过昨天的实践,终于搞定Ubuntu共享WiFi功能,而且不是Ad-hoc模式。从此“二奶”可以作为无线中继使用(这里指的是在Ubuntu系统下)。参考教程:
Ubuntu共享WiFi(AP)给Android/更新方法二 http://weibin.me/538

首先很重要的是,要确定无线网卡驱动是否支持master mode。如果不支持,就别想了。然后就可以按照教程安装并设置hostapd和dnsmasq。根据教程,写了个脚本,方便启动或关闭该功能。第一次写比较长的Shell脚本,所以该脚本还是不太完善,但基本可用。要注意,/etc/dnsmasq.conf还是要手动修改。脚本如下:

#!/bin/sh
# begin file: sharewifi

# Setup wireless AP, share the Internet from interface0 to interface1
# USAGE: sharewifi [ start | stop ] interface0 interface1
# EXAMPLE: sharewifi start wlan1 wlan0

help( )
{
cat << HELP
Setup wireless AP, share the Internet from interface0 to interface1
USAGE: sharewifi [ help | start | stop ] interface0 interface1
EXAMPLE: sharewifi start wlan1 wlan0
HELP
exit 0
}

start( )
{
echo Starting share wifi ......
echo Share Internet $port_in to $port_out

# Configure iptable rules
iptables -F
iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o $port_in -j MASQUERADE
iptables -A FORWARD -s 192.168.7.0/24 -o $port_in -j ACCEPT
iptables -A FORWARD -d 192.168.7.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -i $port_in -j ACCEPT

# Log the message of route
#iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "

# Save iptable rules
sh -c "iptables-save > /etc/iptables.rules"

# Configure hostapd
hostapd_conf=/etc/hostapd/hostapd.conf
[ -f $hostapd_conf ] && rm $hostapd_conf
echo >> $hostapd_conf interface=$port_out
echo >> $hostapd_conf driver=nl80211
echo >> $hostapd_conf ssid=AO522-Tether
echo >> $hostapd_conf channel=1
echo >> $hostapd_conf hw_mode=g
echo >> $hostapd_conf auth_algs=1
echo >> $hostapd_conf wpa=3
echo >> $hostapd_conf wpa_passphrase=1234567890
echo >> $hostapd_conf wpa_key_mgmt=WPA-PSK
echo >> $hostapd_conf wpa_pairwise=TKIP CCMP
echo >> $hostapd_conf rsn_pairwise=CCMP
chmod 755 $hostapd_conf

# Configure /etc/dnsmasq.conf
#interface=wlan0
#bind-interfaces #这个是只监听wlan0,没有之会检测所有卡
#except-interface=lo
#dhcp-range=10.1.1.10,10.1.1.110,6h #设置dhcp地址范

killall named
killall hostapd
ifconfig $port_out 192.168.7.1
hostapd -B $hostapd_conf
/etc/init.d/dnsmasq restart

echo Sucess share wifi

exit 0
}

stop( )
{
echo Stopping share wifi ......
echo Stop share Internet $port_in to $port_out

# Configure iptable rules
iptables -F

# Log the message of route
#iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "

# Save iptable rules
sh -c "iptables-save > /etc/iptables.rules"

# Configure hostapd
hostapd_conf=/etc/hostapd/hostapd.conf
[ -f $hostapd_conf ] && rm $hostapd_conf

# Configure /etc/dnsmasq.conf

killall named
killall hostapd
ifconfig $port_out down
ifconfig $port_out del 192.168.7.1
ifconfig $port_out up

echo Sucess stop share wifi

exit 0
}
#port_in is the network interface which connected to Internet, and default wlan1.
port_in=wlan1

#port_out is the network interface which will be setup AP, and default wlan0.
port_out=wlan0

if [ -n "$2" ]; then
port_in=$2

if [ -n "$3" ]; then
port_out=$3
fi
fi

case "$1" in
"help" )
help ;;
"start" )
start ;;
"stop" )
stop ;;
*)
help ;;
esac

# end file: sharewifi

PS. “二奶”升级到Lubuntu 12.04 LTS,感觉更好用了~

厦门,尤其是鼓浪屿,本来作为环中国旅游的第一站,由于约定跟前度一起去而没去。跟前度分手后,后悔当初没去,还以为没机会了。想不到一个冲动的决定,就拉着豆丁度过了梦幻般的两天(2012-04-22至2012-04-23)。缘份(Fate)、命运(Disteny)、天注定(It is written)?都解析不了这浪漫的事情。

如果说珠海是浪漫之城,那鼓浪屿就是维纳斯天堂。一个直径才一两公里的小岛,遍布各种西式风格的古旧房子,各种特色小店,无论走到哪,都有惊喜;各种特色小吃、海鲜,无论吃到哪,都有新发现;各种风格主题小旅馆,无论住到哪,都那么写意…

不是攻略的攻略

在鼓浪屿唯一的行程就是“迷路”,漫无目的地游走于大街小巷,感受她的气息,发现她的美。岛上的景点,一个都没去,取而代之的是拿着印章本,去偶遇一个个小店。到店里盖个章,看看那些小饰品,或者写个明信片(没写一封明信片,有点遗憾),比计划着去这去那的好玩多了。当然,最好不要去沙滩,以免破坏一切的美好。

交通与住宿

在厦门机场有大巴直达鼓浪屿渡头。上岛的船票是包来回的,要保管好。岛上的旅馆一般都可以网上订房,但是不要相信淘宝。比较好的旅馆都有自己的官网,可以直接联系老板。为了买到便宜机票和找到好房间,最好提前10天预订。

吃在岛上

这个还是随缘吧。网上推荐那些店,感觉只是一般般。反正看到啥喜欢的就吃啥。

收获与感受

其实这次厦门之旅,还逛了南普陀寺和厦门大学,但是都没什么看头。值得留恋的,只有鼓浪屿。对比上一次的环中国之旅,感受最深的是,一个人的旅行与两个人的旅游,差别是很大的!拖着所爱的人,在路上嬉戏,谈情,是一种幸福!

期待已久的厦门之旅结束了,下一次,要拖着豆丁去哪里呢?乌镇?丽江?还是……其实,我希望是“家”。

PS. 在微博的感言:

错过,可能是未到的相遇;失去,或者是期待的拥有;迷路,也许是憧憬的出口…文艺青年、小资青年、恋爱青年,还是大龄青年,都适合在鼓浪屿邂逅一家小店、留恋一条小巷、寻找一个小印章、发现一朵小花、偶遇一只小猫、踏过一个小沙滩、睡上一间小民宿、拖着一只小手、谈着一段小感情…最后不舍这小岛~

再PS. 感想这东西,还是要趁热打铁。断断续续地写,读起来都变味了。

由于现在的公司有多个老旧系统,需要从一个系统访问到另一个系统的数据。一看到这个,就想到了SOA,但是几个小系统部署个SOA来整合,值得么?重点是没搞过SOA!于是怎么简单就怎么解决,例如实现跨数据库访问,即从SQL Server访问MySQL,程序层就从SQL Server读取数据。

Google了一下,找到一篇有用的教程:SqlServer2005 链接服务器用法(http://www.jb51.net/article/18484.htm)。文中提到用sp_addlinkedserver这个存储过程来添加链接服务器(要先配置好MySQL的ODBC数据源),然后通过以下语句获取数据:

SELECT * FROM OPENQUERY (链接服务器名,'MySql查询语句');

按照这个方法配置好,并建立了视图,然后就可以进行查询了。但是有很多问题:例如SQL Server不支持MySQL的某些数据类型,导致查询结果出错,还有个致命的问题,查询速度很慢。

最后还是写了个ASP页面,直接访问MySQL数据库,返回查询结果。打印时,也是写个ASP页面来实现。这,比什么都简单。汗……

PS. 后来还发现如果是SQL Server之间的访问,可以直接用OpenRowSet函数来实现跨数据库访问。格式如下:

OPENROWSET ( 'provider_name', { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }, { [ catalog.] [ schema.] object | 'query' } )

太方便了,特别是两个数据库之间复制数据,或者进行数据对比。