这段时间学到了很多东西,值得总结一下。
主要是做一些Linux系统管理方面的事情。兼职做了点开发的工作。
主要使用的工具: ssh,shell, ruby, rails
主要写写开发时候的工作吧,因为其他的事情暂时还没有完成,但是开发的这个可以算作告一段落了,上线之后就是一些小修补或者大改动之类的。
话说rails on ruby真是非常敏捷,敏捷开发,非常快,但是我不是很喜欢这个,它存在着很多Magic的方法,能够节省你的工作,提高工作效率,很有效的帮助你完成一些工作。但是作为一个底层出身的人(呵呵 信息安全),不喜欢这种不在自己掌握中的感觉。
rails的程序做起来很简单
话说我的IDE,就是vim+chrome而已,没有什么其他东西。很方便,很简洁,我觉得比编写JSP的时候使用eclipse好多了。
1 rails inspector,就可以生成你的程序,大概的框架就会自动给你,这是非常方便的。
2 生成一个单个的类,或者是直接生成一个脚手架scaffold,这是非常方便的,当然,非常方便的背后通常都会蕴含着很多你搞不定的东西,比如使用脚手架生成的web,他们的route是自动遵循REST风格的,REST,呃。。。如果不熟悉你会非常讨厌他,但是这确实是一种非常优秀的思想,或者说方法,解决问题的方法。这里不详细讲REST了,毕竟我也不是特别明白(讨厌这种不在自己手中掌握的感觉)。
3 OK,你的web应用现在就可以跑起来了,试试看~~ ruby script/server 就会启动webrick服务器,一种很小不强大的web服务器,跟Apache当然没得比。这里出现过一个错误,就是在新版本的rails中输入 ruby script/server 是会出错的,不知道是我安装的原因还是其他什么的。出现的错误我看了一下 boot.rb源码,大概是因为 require 'rubygems'这就加载出错,导致程序产生异常,被后面的rescure 捕获,抛出了一句话。知道是什么原因了,但是不知道怎么改,因为我的gem装的好好的。后来偶然间一试,直接用 script/server 居然好了,当然新系统自动启动的是Mongrel 服务器,这个稍微强大一些。
4 可以修改你的程序了,因为你的框架已经有了。
5 前后台传递数据的问题,rails使用了一个render方法对html或者xml进行渲染,产生用户需要的结果,并返回到浏览器中。这个感觉跟JSP其实是很想的,一般来说就是控制器中有一个类变量,这个变量就可以在html的erb模板中使用。xml那个异曲同工,都是渲染一些数据在里面,然后返回给客户。
6 后台页面之间数据传递,这里我只会两个页面之间传递数据的方法,跨页面我还不会。在一个html页面中提交数据后,可以在下一个页面的控制器中使用params[:xxx]来捕获那个值,现在让我头疼的是这个值是无法在多个页面之间传递的,书上只写了使用flash或者session的方法,但是我觉得都不太好,存在着安全的问题,不是很想用这个方法。我现在使用的方法是这样的:我想在一个控制器中生成的数据在另一个控制器中也能使用,而且我不喜欢使用全局变量的方法,于是我就把这次生成的结果写到数据库中,外加一个标记,让另一个控制器去取,然后删除掉对应标记的数据。这种类似 生产者——消费者的问题,但是这样又会产生数据的同步问题,实在是。。。希望能有更好的方法。
7 rails的MVC架构,注意一点,rails的MVC是非常强烈的,所有的程序都是以MVC的理念去写的。这点非常好,JSP就稍微若一点,没有主动强调这个东西,不过JSP也有自己的框架,我没学过,暂时就不说了。
8 最喜欢rails的一点就是他的数据库操作,真的是异常的简洁啊,ASP,JSP,Java等的数据库连接,取数据什么的我都写过,甚至C语言和C++的我都用过,但是rails是最简单的,最省事的。他的框架生成后,MVC中的Model是与数据库中的表直接关联的。那个Model中的类,你什么都不用往里写,就可以直接那他调用数据库中所有的东西,这就是Active Record的威力吗?也是他的敏捷之处所在。
9 rails的敏捷之处还在于他有众多的辅助方法(helper),使用helper来写一些东西真的是很方便。例如Javascript,AJAX什么的,都很容易,但是Ajax还是一如既往的不好调试,只能一点一点的往上加。
10 rails的调试,还算是比较好用,直接在想断点的地方加上debugger函数,然后 script/server -u 就行了。可以单步什么的,但是我还不是很熟,尤其是跨页面的数据调试,显得心有余而力不足,呵呵。
11 夸奖一下rails的数据库迁移任务,这个绝对是经典的,这个非常好,节省了各种数据库操作。
12 夸奖一下这些解释性语言,这些平台无关性语言,最有优势的一点就是迁移到不同的地方,不用再次编译生成,拷过去直接就用,这就是Java等优于c系列的地方。
13 Route,web中的路由绝对是一个神奇的东西,什么样的请求转到什么样的页面,生成怎样的URL,如果不会,那么编起来真的是非常费劲。我就不会,尤其是路由再加上REST风格,那简直就是。。。 这是一个值得研究的领域。
还有很多不理解的东西:
1 params[:xxx]能不能用来多页面之间传值?
2 符号,@变量,@@变量,普通变量之间的关系到底是什么?为什么erb模板中可以使用@开头的变量,但是普通变量不能使用呢?
3 Hash到底是一个什么样的存在?
4 特定的问题,就是发邮件的时候,为什么 body :order => order 之后,就可以在erb中使用@order了?真是奇怪。
以上都是我无法把握的地方,不喜欢这种感觉,尽快弄懂。
===================================================================================================================================
除了以上这些以外,我还写了一些shell脚本,这也是第一次写,呵呵,用到了很多awk,可以把它贴出来,也算是一个备份,自己以后自己学习学习。真是强大的东西。
#!/bin/sh echo '-----------------------------------------------------' echo '' echo '----------------LOG MIGRATION BEGIN------------------' echo '' echo '----------------used in xxxxxxxxxxx-------------------' echo '' echo '----------------designed by xxxxxxx--------------------' echo '' echo '-----------------------------------------------------' LOGPATH=$2 SQLDIR='sqlRes' SQLPATH='../'${SQLDIR} if [ -d ${SQLPATH} ] then echo 'The directory already exists.' else echo 'Making a new directory...' mkdir ${SQLPATH} fi DATETIME=`date +"%F"` SQLFILE=${SQLPATH}/${DATETIME}.sql TMPFILE1=${SQLFILE}.tmp1 TMPFILE2=${SQLFILE}.tmp2 TMPFILE3=${SQLFILE}.tmp3 TMPFILE4=${SQLFILE}.tmp4 TMPFILE5=${SQLFILE}.tmp5 TMPFILE6=${SQLFILE}.tmp6 TMPFILE7=${SQLFILE}.tmp7 touch ${SQLFILE} ${TMPFILE1} ${TMPFILE2} ${TMPFILE3} ${TMPFILE4} ${TMPFILE5} ${TMPFILE6} ${TMPFILE7} echo 'Now I have a very new file to store SQL lines.' echo '' echo 'constructing ...' awk '{ printf "%s\"%s\"%s\"%s\n",$1,$2,$3,$4 }' ${LOGPATH} | tee ${TMPFILE1} awk '{ print $5" "$6 }' ${LOGPATH} | awk '{ gsub(/ /, ":"); print $0}' | awk -F: '{ gsub(/:/, "/"); print $0 }' | awk -F/ '{ if ($2 ~ /Jul/) gsub($2,"07"); print $3"-"$2"-"$1"\""$4"\""$5"\""$6"\""$7 }' | sed 's/\[//g' | sed 's/\]//g' | tee ${TMPFILE7} awk -F\" '{ printf "%s\n",$2 }' ${LOGPATH} | awk 'gsub(/ /,"\"") {print $0}' | awk -F\" '{ if ($2 ~ /^.*\?/) { gsub(/\?/,"\""); print $0; } else printf "%s\"%s\"\"%s\n",$1,$2,$3; }' | tee ${TMPFILE2} awk '{ printf "%s\"%s\n",$10,$11 }' ${LOGPATH} | tee ${TMPFILE3} awk -F\" '{ printf "%s\"%s\n",$4,$6 }' ${LOGPATH} | tee ${TMPFILE4} paste -d\" ${TMPFILE1} ${TMPFILE7} ${TMPFILE2} ${TMPFILE3} ${TMPFILE4} | tee ${TMPFILE5} awk -F\" '{ printf "INSERT INTO accesslogs (respon_time, host_ip, other, logname, tdate, thour, tminute, tsecond, tzone, action, url, param, http_version, code, bytes, refererquot, uaquot, ttime, business) VALUES(%d, \"%s\", \"%s\", \"%s\", \"%s\", %d, %d, %d, %d, \"%s\", \"%s\", \"%s\", \"%s\", %d, %d, \"%s\", \"%s\", \"%s\", \"%s\" );\n ",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$5$6$7$8, BUSINESS }' BUSINESS="${1}" ${TMPFILE5} | tee ${TMPFILE6} sed '1i\use inspector;' ${TMPFILE6} > ${SQLFILE} echo '--------------------clean tmp files------------------------' echo '' rm -rf ${TMPFILE1} rm -rf ${TMPFILE2} rm -rf ${TMPFILE3} rm -rf ${TMPFILE4} rm -rf ${TMPFILE5} rm -rf ${TMPFILE6} rm -rf ${TMPFILE7} echo '-------------------export global variable------------------' echo '' export SQLFILE echo '-----------------------------------------------------------' echo '' echo '-----------------SQL lines for LOG generated!--------------' echo '' echo '-----------------waiting for migration---------------------'
#!/bin/sh echo '-----------------------------------------------------------' echo '' echo '--------------------migrating------------------------------' echo '' echo '-----------------------------------------------------------' mysql -uxxxxxxxx -pxxxxxxxxxxxx -h xxxx -P 3306 < ${SQLFILE} echo '--------------------clean global variable------------------' echo '' export SQLFILE='' echo '-----------------------Done.-------------------------------' echo '' echo '---------------LOG MIGRATION END---------------------------'
#!/bin/sh PWD="/xxxxx/logMigration/migrate" LOGS_PATH=${PWD}/../logs YESTERDAY=`date -d yesterday +"%F"` echo "Yesterday is ${YESTERDAY}" for sys in `ls ${LOGS_PATH}` do echo "Handling system ${sys}, start..." sleep 1 for tlog in `ls -t ${LOGS_PATH}/${sys}` do nametmp=`echo ${tlog} | cut -d\. -f3` if [ ${YESTERDAY} == ${nametmp} ] then echo "Filename matchs date very well, it's time to migrate now." sleep 1 # PAssing 2 params, the first is system name, the second is file name. source migrate1.sh ${sys} ${LOGS_PATH}/${sys}/${tlog} source migrate2.sh else echo "What's the matter? The latest file doesn't match the date, system panic!" sleep 1 fi break #no matter when, the inner loop only executes once time. done done
==================================================================================================================================
学了几个很不错的指令
du -sh XXX
scp XX XX@XX:XXXX
以及用在secureCRT上的 sz 和 rz
想不想知道你的数据库中米格数据库多大个? 进入 /var/mysql中,然后对着那个目录使用 du这个命令就行了。
date命令实在是很强大,生成 2011-07-28这种格式,直接 date +"%F" 就行,想知道昨天的日期,那就 date -d yesterday
n天前: date -d ‘3 days ago’
差不多就这些,又买了本python的书,相比ruby,还是python用的比较多,正好和MIT的公开课看着一起学学,着实不错。