2013 年终总结

记得18岁的时候有认真写过一个总结,当时计划每年给自己一个总结的。但是后来没能每年坚持下来,想想还是有些遗憾,而现在我已经20岁了。

技术

年初的时候还在英语调频台,那时候刚开始学习PHP大概一个多月,基本语法都没掌握全。花了一段时间学PHP,那时微信能简单地查询天气、笑话、小黄鸡一些东西。等过完了年跟着武大助手做查分、续借一些东西,当时太菜了,现在三天可以完成的东西当时断断续续写了一个多月。
记得那时lucy老是催我去吃饭,也记得有天周五感觉胸闷快猝死的感觉。那一个月是我最努力的时候吧,进步也很快,PHP总算是入门了。

后来就闲着了,有断断续续地用平板看书,一直到暑假看了正则表达式、python基础教程、搜索引擎原理、设计模式、面对对象一些东西。其他的代码没写多少,写了一个知乎日报(现日PV 3K)、快递提醒(已弃坑)。
精通正则表达式看了一半,边看边忘。现在会用基本的正则语句,不过也够用了。你们完全猜不到我不会正则的时候是怎样写几十行截取字符串的。。。
搜索引擎原理看了个大概,然后用简单地倒排索引实现了知乎日报的搜索,尽管代码很糙但是效果还挺好。后来因在SAE云豆开销过大,把搜索撤销了。
python看了一点,慢慢摸索写了一个爬虫,把我们图书馆的19W图书资料爬下来了。这些资料后来用在微信里面实现搜书,比以前curl快多了 : )
暑假的时候我做的微信关注数达到了5k,要知道我们学校总共也才2w人啊。当时后台日消息数达到1w多,自信心爆棚。
面对对象和设计模式理解一些以后就在构想新的微信后台,之前代码拼凑太厉害写不下去了只好重写,现在回来看当时的设计隐隐有些MVC架构的雏形了。

到九十月份就在慢慢地写新的微信后台,一直到宣传部找到我给学校做微信,才在压力下把一些细节完成了,因为一些原因最终上线的还是阉割版。后来突然知道换了教务系统,手忙脚乱又花了几天把带验证码的新的教务系统搞定。
这个微信平台也是我目前为止写得最大的一个项目了,共28个文件,2K多行代码。其实还是有很多地方处理地不够好,等我下次重构吧。

十月份家里终于给买了电脑,我写代码才方便了不少。然后日常用了两个多月的ubuntu,学了些linux的基本使用知识。自己尝试配置了台VPS,后来才有胆量拉萝莉qwe合租。linux鸟哥教程也还没看完,这也是一个坑。。

现在初学框架,刷完了CI的用户手册,大致理解了MVC架构。这个airblog是我第一个练手的作品,以后我再多试试写写更复杂的东西。

现在我又加入了图书馆的一个技术小组,大家协作写几个网站,包括荐购和好书推荐。貌似没什么太大难点,荐购和推荐主要是写好豆瓣的图书爬虫,然后跟本地的数据整合,然后前端显示就可以了。
初步拟定的是用python+django架构,主要是我还基本不会python,寒假来恶补。。

下一步是熟悉框架、python、前端、计算机原理和算法。

朋友

上学期的时候还在英语调频台,平时活动挺多的。特别是到最后的台庆前一段时间,因为准备节目认识了全台大部分人。那还是在学跳舞,一个爵士(41:27)、一个搞怪(不要问哪个是我。。)的。毕竟业余,有些不忍直视。。。

说到社团,其实有点觉得挺对不起前任网络部部长的。他从我进调频台开始就特别照顾我,单独请我吃饭谈话都很有几次。最后我还是义无反顾丢下自己的一堆烂摊子走了,最后连合适的接手的人都没找到。
英语调频台最大问题在于它本身已经逆潮流了,而本来我还有个很大的计划,可以借力校园新媒体振兴它的。可是台里各方面有能力的人实在是没有,我看不到多大希望。自己挑的担子太大,各方面铺不开只会累着自己。而我也无意在里面寻个闲职混日子,我还有好多事要做。所以最后绝决然地走了,这里向后面接我烂摊子的坤坤表示谢意。

暑假才开始在精英盒子里面冒泡,慢慢认识里面了好多大神。精子个大神到变态的不算,还有ricter、wxy、oran、cry。。cry是大二貌似,ricter大一,其他都是高中 = = 每个都是完虐我这种渣渣啊,每次出没压力都很大的说。。

除了每天跟盒子里面的大神扯淡外,貌似没有其他多少活动了。再就是跟室友上一起课、吃饭什么的,比较消停,这学期也才慢慢跟寝室内部搞好了关系。

一直到这个学期末,才又加入了两个组织。一个是学校的宣传部,一个是图书馆的技术小组。两边的同事大部分都不是同龄人啊,宣传部这边主要是大四的实习生、图书馆这边大部分是老师。感觉有点怪怪的,希望下学期合作愉快。

妹纸

此内容过于得瑟,暂不开放

配置多用户的虚拟主机

一直想要个香港服务器,米国服务器太远,各种云间歇性抽风(sae抽得丧心病狂啊!!)。如果放微信接口,再加上还要curl国内的教务处,速度完全跟不上。 前两天看到v2ex上的locvps做活动,香港1G 41元,就咬咬牙从RP主机搬过去了。后来又拖了qwe7002一起合租,均摊下来20块一个月就还挺划算的。

服务器的简单配置自不必细说,用一个lnmp脚本半个小时搭完,有些不常用的服务可以再安装完成后先停止。麻烦点的就是多用户的权限控制了,我自己的数据和权限要跟qwe7002的完全分离,而当一个站点被黑时也不能影响全局。

文件

先新增两个用户分别给予对应的文件权限。nginx会以同组用户www身份访问目录,所以建议将文件目录权限设为750或更低。要禁止某些文件或目录从web访问时,可以将其权限设为660(仅当前用户访问)。

adduser faceair
passwd faceair   //设定用户密码
chmod 750 /home/faceair -R

数据库

公用的mysql数据库提供了严格的多用户权限控制,使用phpmyadmin面板新建一个用户”给以 用户名 开头的数据库 (username%) 授予所有权限”,不给予全局权限就够了。

CREATE USER 'faceair'@'%' IDENTIFIED BY '***';GRANT USAGE ON *.* TO 'faceair'@'%' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;GRANT ALL PRIVILEGES ON `faceair\_%`.* TO 'faceair'@'%';

nginx

默认nginx以www用户运行,为了能让nginx访问到用户文件,还要将www添加到对应用户的用户组,处理静态文件请求。

gpasswd -a www faceair

通过lnmp安装包里面的vhost.sh可以添加nginx配置,配置添加后对文件权限还要重新修改。默认会添加配置到/usr/local/nginx/conf/vhost目录对应域名。

php-fpm

nginx本身不能处理PHP,它只是个web服务器。当接收到php请求后,需要转发到php-fpm对应的UNIX socket文件。修改对应域名的nginx配置。

location ~ .*\.(php|php5)?$  {
    fastcgi_pass unix:/tmp/faceair-fpm.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
}

给每个用户都建立单独的进程池,每个进程池表现为一个UNIX socket文件。修改/usr/local/php/etc/php-fpm.conf,添加一行。

include = /usr/local/php/etc/pool.d/*.conf

再添加目录/usr/local/php/etc/pool.d/,在目录中添加对应用户faceair.conf。

[faceair]
user = faceair
group = faceair
listen = /tmp/faceair-fpm.sock
listen.owner = faceair
listen.group = faceair
listen.mode = 0660

pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 1
pm.max_spare_servers = 3

基本配置就是这样了,最后重启nginx和php-pfm。

/usr/local/nginx/sbin/nginx -s reload
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

我再考虑怎么写个脚本来管理这些配置文件。

参考:

PHP还原强智教务管理信息系统加密过程

求助帖,还是自己解决了。

概述

教务系统地址http://jwxt.whsw.cn/,你会发现登陆只能用ie浏览器,他喵的chrome和firefox都不支持。用其他浏览器登录时会提示密码错误,原因是他会先在前端加密密码再跟服务器通讯。而加密用的js和vbs,其他浏览器都只能js加密,vbs加密过程就不支持了,所以加密不完全导致提示密码错误。唉,这套系统也太老了,最后更新还是2005年,无力吐槽。

js加密还原

原过程

var pwd = theform.PassWord.value;
var rndNum = 394058;
rndNum = rndNum.toString();
var curPos = 0;
var tmpStr,EnCryptStr = "";
for(Cnt=0;Cnt<pwd.length;Cnt++){
  if(Cnt % rndNum.length == 0 ) curPos = 0;
 tmpStr = pwd.substring(Cnt,Cnt+1);
  EnCryptStr += String.fromCharCode(tmpStr.charCodeAt(0) - Cnt - rndNum.substring(curPos,curPos+1));
  curPos +=1;
}
theform.PassWord.value = EnCryptStr;//Assigned the EncryptPassword value to the PassWord TextFiled
theform.EnRndNum.value = rndNum;

用php还原

$pwd = "";
$rndNum = "394058";
$curPos = 0;
$tmpStr = "";
$EnCryptStr = "";
for($Cnt=0;$Cnt&amp;lt;strlen($pwd);$Cnt++)
  {
   if($Cnt % strlen($rndNum) == 0 ) $curPos = 0;
   $tmpStr = substr($pwd,$Cnt,1);
    $EnCryptStr = $EnCryptStr. fromCharCode(charCodeAt($tmpStr) - $Cnt - substr($rndNum,$curPos,1));
                      $curPos +=1;
  }
echo $EnCryptStr;
echo ''&amp;lt;br&amp;gt;'';
echo $rndNum;
echo ''&amp;lt;br&amp;gt;'';
echo EncryptString($EnCryptStr);

function fromCharCode($codes) {
  if (is_scalar($codes)) $codes= func_get_args();
  $str= '''';
  foreach ($codes as $code) $str.= chr($code);
  return $str;
}

function charCodeAt($word) {
  if (is_array($word))
    $arr = $word;
  else
    $arr = str_split($word);
  $bin_str = '''';
  foreach ($arr as $value)
    $bin_str .= decbin(ord($value));
  $bin_str = preg_replace(''/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/'',''$1$2$3'', $bin_str);
  return bindec($bin_str);
}

vbs加密还原

原函数

Function EncryptString(InputText , ThePassword )''用户口令加密
  Dim il_bit, il_x, il_y, il_z, il_len, i
  Dim is_out
  Password = InputText
  il_len = Len(Password)
  il_x = 0
  il_y = 0
  is_out = ""

  For i = 1 To il_len
    il_bit = AscW(Mid(Password, i, 1)) ''W系列支持unicode
    il_y = (il_bit * 13 Mod 256) + il_x
    is_out = is_out &amp; ChrW(Fix(il_y)) ''取整 int和fix区别: fix修正负数
    il_x = il_bit * 13 / 256
  Next

  is_out = is_out &amp; ChrW(Fix(il_x))
  Password = is_out
  il_len = Len(Password)
  il_x = 0
  il_y = 0
  is_out = ""

  For i = 1 To il_len
    il_bit = AscW(Mid(Password, i, 1)) ''取前4位值
   il_y = il_bit / 16 + 64
    is_out = is_out &amp; ChrW(Fix(il_y)) ''取后4位值
    il_y = (il_bit Mod 16) + 64
    is_out = is_out &amp; ChrW(Fix(il_y))
  Next

  EncryptString = is_out
  End Function
}

用php还原

function EncryptString($Password){    //密码前端加密部分
  $il_len = strlen($Password);
  $il_x = 0;
  $il_y = 0;
  $is_out = "";

 for($i=0;$i< $il_len;$i++){
   $il_bit = ord(substr($Password, $i, 1));
    $il_y = ($il_bit * 13 % 256) + $il_x;
   $is_out = $is_out. Chr(fix($il_y));
   $il_x = $il_bit * 13 / 256;
 }

 $is_out = $is_out. Chr(fix($il_x));
 $Password = $is_out;
  $il_len = strlen($Password);
  $il_x = 0;
  $il_y = 0;
  $is_out = "";

 for($i=0;$i<$il_len;$i++){
    $il_bit = ord(substr($Password, $i, 1));
    $il_y = $il_bit / 16 + 64;
          $is_out = $is_out. Chr(fix($il_y));
    $il_y = ($il_bit % 16) + 64;
          $is_out = $is_out. Chr(fix($il_y));

  }

 return $is_out;
}

function fix($il_y) {
 if(floor($il_y) < 0){
    return floor($il_y)+1;
  }else{
    return floor($il_y);
  }
}

自此php就完美还原了两个加密过程,再模拟登陆就简单了。
他喵的调试一下午啊啊啊啊啊、、、

  • 2013.7.06 更新 第二段加密函数里面floor不能完全还原fix函数,所以自定义fix函数。