May 7th, 2012 | Tags: ,

ubuntu 12.04 配置及使用感受
canonical在4月26日发布了ubuntu 12.04 LTS,这是个长期支持版本,一直会提供支持到2017年,听起来貌似是个靠谱的版本,所以趁五一的时候把原有的10.10系统升级至12.04

ubuntu 12.04 desktop

ubuntu 12.04 桌面截图

不要选择升级安装
安装用的u盘,使用usb-creator-gtk工具将iso写入到u盘然后引导启动,安装的时候ubuntu还很贴心的把系统已有的所有系统列举了出来,然后给出选项,其中一个是“是否要从原来的版本直接升级,会尽可能的保留原有的软件”,我原来的版本是10.10,据我所知用系统自带的升级程序是不能直接升级到12.04的,必须先升到11.x,然后再升级到12.04,这个选项乍一看不错,还能保留原有的软件呢,但经过我实际安装发现,选这个选项是一个错误的选择。。。原因有

  • 保留原有的软件对我来说意义其实并没有我想象的大,因为很多软件我都是装着玩的,根本没必要升级
  • 升级安装占用大量空间,root分区空间占用达到了7.9G,我后来又重新安装之后,root分区才3G多一点
  • 升级需要下载好几个G的数据,网络不给力的情况下,升级安装非常耗时间

安装前备份已安装软件包列表
以后如果要装新的版本,我再也不会选择蛋疼的升级安装了,一般来说home目录独立分个区,用户数据在就行,软件包的话安装之前可以先备份

sudo dpkg --get-selections  > app-backup-list.txt

然后再从里面整理出一份自己常用的软件包列表,安装完新系统之后批量执行一下就好,也不麻烦

sudo apt-get install vim
sudo apt-get install tasksel
sudo tasksel install lamp-server
sudo apt-get install convmv bzip2 filezilla mysql-workbench bootchart dialog rcconf preload
sudo apt-get isntall openvpn sshpass boot-repair enca nautilus-open-terminal shutter subversion libsvn-java git
sudo apt-get install multiget deluge audacious
sudo apt-get install chromium-browser
sudo apt-get install filezilla
sudo apt-get isntall p7zip p7zip-full p7zip-rar
sudo apt-get install build-essential automake intltool
sudo apt-get install dnsmasq
sudo apt-get install curl

sudo add-apt-repository ppa:indicator-multiload/stable-daily
sudo apt-get update
sudo apt-get install indicator-multiload

sudo add-apt-repository ppa:tiheum/equinox
sudo apt-get update && sudo apt-get install faenza-icon-theme

使用雅黑字体
装完之后搞字体,在我看来,开源字体不管怎么好,都比不上微软雅黑好看,所以直接从win7 copy字体,反正win7也不是正版,就别计较了……

1. win7的字体在Windows/Fonts目录,msyh.ttf和msyhbd.ttf
2. copy到/usr/share/fonts/truetype/yahei目录
3. sudo chmod 644 msyh.ttf msyhbd.ttf
4. sudo fc-cache -f

然后就可以使用雅黑字体了

使用感受
新系统用了好几天,总结出觉得ubuntu 12.04不满意的地方

1. unity相对gnome改动太大,直接把下panel去掉了,这个让人很不习惯,上panel也不能堆各种启动项了
2. 左边的panel在打开的程序比较多的情况下会折叠在一起,变得很乱
3. 相同的打开程序在alt+tab切换的时候会折叠,我认为这个会降低切换速度
4. unity的效果不太稳定,有时候会卡住
5. 窗口的菜单合并到顶部panel,最小/大化,关闭按钮都在左上角,但是在窗口没有最大化的时候,最小/大化,关闭在右上角,感觉不统一
6. Launcher panel不能自由的决定放什么东西,比如我mount了一个win的分区,然后在Launcher panel强制出现了该分区的盘符,除非umount,否则无法去掉

觉得满意的地方

1. Dash Home很不错,查找程序/文档很方便,满意的就只有这个

参考文档
Ubuntu 12.04 配置指南

April 27th, 2012 | Tags:

背景
有一批数据,目测是通过mysql的SELECT INTO OUTFILE命令导出的,现在要导入到mysql里面进行进一步分析

方案
1. 建对应字段的表
2. 使用mysql的LOAD DATA LOCAL INFILE ‘/path/to/file.txt’ INTO TABLE t ….

中间过程出现一些问题
0. 数据乱码,因为是从windows系统移过来的文件,所以可能需要转换一下文件编码

解决:iconv -f gbk -t utf8 data.txt -o data.utf8.txt

1. 表建好之后发现用户没有LOAD DATA的权限

解决:GRANT file ON *.* TO user@localhost IDENTIFIED BY 'xxxx'

2. 权限加好之后,总是提示File not found! 但实际上文件是存在的

解决:LOAD DATA *LOCAL* INFILE 别忘了加上LOCAL

3. 日期格式无法识别,数据文件里面有个日期字段,格式为’日-月-两位年份’,例如’01-JUN-11′,导入的时候发现格式无法识别,该日期字段值都是’0000-00-00′
解决:
1. 导入到临时表,日期字段设置为字符串,然后用STR_TO_DATE函数将数据转换到另一张表,比较麻烦,不推荐
2. 导入数据的时候指定转换数据,例如

LOAD DATA LOCAL INFILE '/tmp/data.utf8.txt' INTO TABLE t(
	 ……省略其他字段……
	@paytime,
	……省略其他字段……
	) SET paytime = STR_TO_DATE(@paytime,'%d-%b-%y');

综上,我觉得能用mysqldump就尽量用mysqldump,导入的时候直接source一下就可以了

参考资料
1. mysql时间日期格式
2. 淘宝数据库技术团队 – 数据导入导出
3. change format of date fields during LOAD DATA INFILE?

April 8th, 2012 | Tags:

前后历经约半年,花光了我所有的年假,终于考完了驾照~流水记之。

时间

2011年11月 报名学车
2011年12月 科目一理论考试
2012年03月 科目二场考考试
2012年04月 科目三路考考试

费用

报名费:4100
燃油费:300
场地练习租车费用: 200
路考练习租车费用: 100
吃饭+潜规则:500+
交通费(自行往返驾校,考场,全程打车): 300+
————————————————-
共计:5500+


得瑟一个

教练

我们选的教练脾气很不好,记得第一天去驾校练习打方向盘的时候,教练就做了“事先声明”:我这个人脾气不好,到时候会骂人的阿。当时我还不以为意,觉得凶点就凶点呗,如果真是自己反复做错了的,那凶点没关系,也是为自己好……

可是后来发现,事情不是想象的那样,比如移库练习,本来手续步骤就很多,这个点那个点,左一圈右两圈的,一时半会儿谁TM记得住啊,可教练从来都是只说一遍,然后就让你开,一做错就开骂,而且是只管骂,也不告诉你错在哪,结果就让你更紧张,一点帮助都没有。甚至有一哥们完全没有听过教练讲解教练就让他过圆饼,然后被骂得体无完肤,就差动手了~~因此,每次学新项目的时候,我都躲着不要第一个上,等前面的人被骂的差不多了,自己也就把“挨骂点”记得差不多了,这样,轮到自己的时候,就可以被骂的少一些。。。讽刺的是,我们练的最好的时候,就是教练不在的时候……一车人各种商量讨论,自学成才,教练往副驾驶一座,反倒乱了。。各种差错。

虽然换位思考也能体会到教练为什么生气,因为他每天都得对着新手,教了一遍又一遍,前面一批人犯的错误我们还是会犯,长此以往心理肯定会不淡定,不淡定难免开骂。而被骂的学员一般不敢顶嘴,因为安排考试的权力掌握在教练手里(果然是权力滋生腐败,这么一点小权力就产生了各种给教练送礼的潜规则),他一个不爽他把你晾个一年半载的,有得受,这也助长了教练的气焰。可是从职业道德的角度出发,你丫既然选择了这个职业,就应该接受这个工作的设定,再怎么无聊你也得扛着,我们交钱是来学车的,又不是来听你教训的,我们什么都会了还要你教练干嘛呢?

学移库那几天我都觉得心理压力挺大的(可能是平静的日子过的太久了),晚上还失眠,还好场考过后好了很多,一方面对教练的骂声习惯了不少,另一方面整个学车过程就是场地考试比较难,后面路考相对就简单很多。

学车如果不想碰上这种坏脾气教练,最好还是提前做做功课,打听一下各教练情况,我们只考虑了教练手下人数,让驾校给我们安排一个人少的,结果呢,这教练手下人也不少(因为总体学车的人太多了),而且脾气还那么糟糕。每次跟朋友在场边等待,看到别的教练在温和地指导学员,而我们的教练却在破口大骂的时候,我们就会感叹:哎,看看人家的教练……

附教练语录

“车角对牢杆子!!”
“你个脑袋在想什么东西!!我叫你点子看牢,你在看什么东西!!”
“方向打死!打得快,慢吞吞的像什么样子!”
“回方向,快回!回阿!我叫你回你在等什么东西!!!”
“加油,跑起来,加油,再加油,到40码没有?到了没有?到了还不加5档!!“
“……停!停阿!都叫你停了你还在踩油门!!”
“我看你这人啊,麻烦了!”
“……你们自己练,随机验证教练身份了打电话给我”(然后就自己打老虎机去了……)

9选3考试

9选3考试最煎熬的地方,是桩考的考前等待,真的是漫长得让人受罪。8点不到就到考场,9点点名进入候考,然后一个一个进去,大家都在大厅里等待自己的名字出现在屏幕上,理论上说,桩考一次限时7分钟,但是有时候碰上补考的,居然半个小时都出不来……出来的人有的欢天喜地,有的垂头丧气,整体合格率80%多,而且前一天实地练习超时一次,碰杆一次,所以等待的过程心里还是一阵一阵紧张。一直等到了11点半,终于轮到自己,倒库移库,听到电脑里面女音提示“考试合格”的那一刻,觉得天都亮了~~顺利过了桩考,后面抽了个起伏路(就是什么都不用做,开过一小段起伏路面就行。。),于是,整个9选3考试就这么顺利过了~

路考

相比场考,路考就简单很多,练两天就可以参加考试了,而且也比较有意思,毕竟这才是真正意义的开车。不过问题跟场考一样,煎熬的地方在于考前等待,跟我想象的状况完全不一样,我当时想的是这么早去,应该到八点多可以搞定了吧,到时候回家还可以睡个回笼觉什么的……结果呢,6点40到考场等着,一直等到12点多才等到……等得蛋都碎了。。。还好路考练的感觉不错,满分过了。

在漫长的等待过程中,看到因为各种原因挂掉的,比如有安全带从腰间别过去的(囧),有闯红灯的,有夜间灯光打错的,有斑马线没减速的……

ps. 学完车之后,会觉得,紧张什么啊,这不是挺简单的一件事么(嗯,楼主事后开始得瑟了起来。。。。)

February 20th, 2012 | Tags: ,

买了个ssh代理,试了下性价比还行,就是偶尔会出现登录会失败、Broken Pipe等状况导致ssh退出,于是自己动手写了个脚本

系统: ubuntu 10.10
安装软件

sudo apt-get install sshpass
sudo apt-get install libnotify-bin

其中sshpass是用来自动发送ssh代理密码的,当然也可以用expect,但是个人认为expect太重量级,文档又长又难懂,还是sshpass方便;libnotify-bin这个工具是用来发送屏幕右上角浮动通知的,这样就可以及时掌握当前ssh代理的状况了

原本只是一行sshpass自动登录代码,改进后增加了以下功能

  • 自动从4台服务器中选择一台(因为商家给了4个地址供选择)
  • verbose log到文件(输出控。。。)
  • notify-send桌面通知
  • 断线后自动重连
#!/bin/bash
# file cdkey.in.ssh-d
# created by make-template :)
# vivi@2012-02-20_21:30:05

ROOT=~/scripts
WAIT=10
LOG=$ROOT/cdkey.in.log
SERVERS=({1,2,3,4}.usssh.com)
COUNT=${#SERVERS[@]}

function logger(){
  local MSG=$1
  local TIMESTAMP=$(date '+%F %H:%M:%S')
  echo "$TIMESTAMP: $MSG"  >> $LOG
}

function random_server(){
  local INDEX=$(( $RANDOM % $COUNT ))
  echo -n ${SERVERS[$INDEX]}
}

# 开机连无线需要一段时间,so。。咱等着
sleep 25

notify-send -t 5000 "starting cdkey.in.ssh-d proxy :)"
while [ 1 ] ; do
  SERVER=$(random_server);
  logger ".............connecting to server: $SERVER.............."
  sshpass -f "$ROOT/cdkey.in.pass" ssh -2 -CNvD 7070 user@$SERVER -p 22 \
        -o PasswordAuthentication=yes \
        -o ChallengeResponseAuthentication=no \
        -o GSSAPIAuthentication=no \
        -o HostbasedAuthentication=no \
        -o PubkeyAuthentication=no \
        -o RhostsRSAAuthentication=no \
        -o RSAAuthentication=no >> $LOG 2>&1
  notify-send -t 1000 "ssh maybe broken, try restarting in $WAIT seconds"
  sleep $WAIT
done

然后写了个launch脚本,放到.profile文件里面就可以实现开机自动连ssh代理了~

#!/bin/bash
# file ssh-launcher
# created by make-template :)
# vivi@2012-02-14_22:27:57

ROOT=~/scripts
$ROOT/cdkey.in.ssh-d > /dev/null 2>&1 &
echo $! > $ROOT/cdkey.in.pid

ps. 如果是第一次连ssh代理服务器需要手动ssh username@sshserver.com连一下,然后选yes把服务器加到~/.ssh/known_hosts里面去

February 16th, 2012 | Tags: ,

收集在用的linux命令/工具,备忘,不定期更新

# commands/tools
enca -L zh_CN filename                           # 检查文件的编码,比file要精确一些
iconv -f gbk -t utf8 ingbk_file -o oututf8_file  # 转换文件内容的编码
convmv -f gbk -t utf8  filename                  # 转换文件名的编码,确认之后加 --notest
wget -mk http://www.example.com/                 # 镜像一个站点
sudo blkid                                       # 查看分区的uuid
csplit -f part_ -n 2 /--/ file.txt {*}           # 按照内容分割文件
rename 's/\.bak$//' *.bak                        # 去掉所有.bak文件名后缀,跟sed差不多用法

# useful package installation
sudo apt-get install ubuntu-restricted-extras  # 安装ubuntu受限资源
sudo apt-get install nautilus-open-terminal    # nautilus文件管理器,右键open terminal...
Page 1 of 512345
TOP