现在的位置: 首页 > 综合 > 正文

2011-06-08~2011-07-28 阶段总结

2013年10月25日 ⁄ 综合 ⁄ 共 6498字 ⁄ 字号 评论关闭

这段时间学到了很多东西,值得总结一下。

主要是做一些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

以上的主要作用就是把日志分割成我需要的样式,然后dump到数据库中。呵呵~

==================================================================================================================================

学了几个很不错的指令

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的公开课看着一起学学,着实不错。

抱歉!评论已关闭.