Posted by & filed under Operating System.

由于godaddy不稳定和龟速,终于把博客搬到自己的VPS上,并且换了一套皮 :) ,最近日子过得比较快,可能因为事情比较多的缘故,最近两个月写的代码,超过我过去半年的写的代码的总和 :(
废话少说,直接上wordpress Nginx的rewrite规则,我的博客版本是2.8.5,一切正常,其他的不敢保证

if (-d $request_filename){
rewrite ^/(.*)([^/])$ $1$2/ permanent;
}
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}

第一条在很多Nginx主机上是默认就可以进行301 move的,意思是:如果请求的是目录,那么将请求rewrite到这个目录里面,不加这一条可能会导致二级或者三级目录无法访问,比如请求地址是http://www.abc.com/abc, abc是一个目录,abc中有一个index.html页面,还有一个名为style的目录,index.html 引用style中的css,js等文件,并且引用方式为相对地址,类似这样的结构:<script type=“text/javascript” src=”style/lib/jquery.js></script>,那么除index.html能被请求到之外,index.html中引用的所有文件的请求,都将是404

后面三条网上到处都是,如果你不是跟我一样,在Web根目录下放一些jquery,mysql之类的手册,后面三条就足够使用。包括你使用伪静态化

Posted by & filed under Operating System.

error: C++ compiler cannot create executables….

安装相关开发包:

  • yum install gcc gcc-c++ gcc-g77 autoconf automake flex bison bzip2-devel zlib-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel

Debian:

  • apt-get install gcc g++ build-essential

VPS为了保证效率和最小化安装,很多东西都没有所以出现上面的错误,有个偷懒的方法就是:

  • yum groupinstall ‘Development Tools’

这样和我们本地安装时勾选development tools的效果是一样的,什么编辑器啊,make,automake之类的都有了。

configure: error: *** libmcrypt was not found

安装libmcypt时,用默认的./configure && make && make install后,在下一步安装mcrypt会出现上面的错误,并不是libmcypt 没有安装好,而是没有加到默认的path中,做个软连接即可:

  • ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config

编译PHP带上–with-xmlpr参数时出现:configure: error: XML configuration could not be found 错误

  • yum -y install libxml2 libxml2-devel

Notice: Following unknown configure options were used:

  • –enable-fastcgi
  • –enable-force-cgi-redirect
  • –enable-discard-path

php 5.3.0 发现在默认状态下,已经开始支持 fastcgi了,不用再费劲再写配置参数了,如果写了,会提示如上错误信息

undefined reference to libiconv_open错误

打开Makefile大约在85行的EXTRA_LIBS = ….. -lcrypt 在最后加上 -liconv,例如:EXTRA_LIBS = ….. -lcrypt -liconv然后重新再次 make 即可

Posted by & filed under Study & Reading.

企业应用

  • 定义:  企业应用一般都涉及到持久化数据。
  • 企业应用一般都涉及大量数据
  • 企业应用还涉及很多人同时访问
  • 企业应用还涉及大量操作数据的用户界面屏幕。
  • 企业应用很少独立存在,通常需要与散布在企业周围的其他企业应用集成。(技术多样化,协议多样化)

可伸缩性:

  • 响应时间
  • 响应性
  • 等待时间
  • 吞吐率
  • 负载
  • 负载敏度
  • 效率

领域逻辑组织方式:

  • 1.事务脚本
  • 2.领域模型
  • 3.表模块

服务层:

  • 表现逻辑和领域逻辑之间的交互完全通过服务层,就像应用程序API一样。
  • 如果确实需要,使用最小化的服务层

映射到关系数据库:

  • 1. 为查询语句返回的每一行产生一个它的实例,种种行数据入口就行是面向对象方式来看待数据。
  • 2.许多环境提供记录集,这种表和数据行的一种通用数据结构,用来模拟数据库的表格属性。
  • 如果使用记录集,对于数据库的每个表只需要一个对象来管理。

并发:

  • 解决方案有两个,一个是隔离,一个是不变性
  • 隔离是学习操作系统分配内存的方式,让一个单元只允许一个进程访问
  • 只有共享数据可以被修改的情况下并发问题才会出现。

事务属性:

  • 1.原子性  在事务里面所有的动作要么全部完成,要么全部回滚
  • 2.一致性  在事务开始和结束的时候,所有的资源要保持一致
  • 3.隔离性  在事务完成之后,他的结果对于其他事务才是可见的
  • 4.持久性  已提交的事务必须是可持久性的,即任何崩溃都是可以保存下来的

事务资源:

  • 定义:用事务来控制并发的过程
  • 长事务:跨越多个事务请求的事务
  • 请求事务:在请求开始时启动,在请求结束时完成的事务
  • 延迟事务:在外界事务读取或加载完成时,启动的事务,即在更新时才启动的事务

事务建议:

  • 1.使用事务的时间应尽可能的短,尽量避免长事务,因为事务进行时间越长,锁定的东西越多,
  • 在没有任何并发控制的情况下,事务时间越长越有机会导致数据的不一致,造成事务的无效回滚,使用延迟事务能够提供事务的性能。
  • 2.使用事务时应该清楚的知道锁定的到底是什么,对于数据库来说,锁定的是被访问的行级数据。
  • 3.如果一个事务要求锁定的行数超过数据库最大可支持事务锁定,那么会上升为表级锁,即锁升级。锁升级显然对并发造成很大的影响。
  • 这也是为什么不能在领域层超类型级别上使用“对象”表的原因。
  • 4.尽可能的减少事务隔离

事务隔离级别(由低到高):

  • 1.读未提交
  • 2.读已提交
  • 3.可重复读
  • 4.可串行化

业务事务和系统事务

  • 系统事务:关系数据库系统和事务监视所支持的事务
  • 业务事务:业务事务是保证用户操作行为完整的事务

离线并发控制模式:

  • 1.应该尽可能让事务系统自己来处理并发问题。
  • 这样做会损失部分系统伸缩性
  • 2.乐观离线锁
  • 优点:易于编程实现,提供最好的灵活性
  • 缺点:只能在提交数据时才发现事务将要失败
  • 3.悲观离线锁:
  • 优点:尽可能早的发现错误
  • 缺点:不利于编程实现,丧失部分灵活性

应用服务器并发:

  • 1.显式多线程
  • 缺点:构建复杂,难以调试
  • 2.每个会话一个进程,配合进程池来提高效率
  • 3.每个会话一个线程,线程崩溃可能会导致整个进程垮掉
  • 4.中间层屏蔽,比如J2EE中的EJB

Posted by & filed under Life Diary.

海上生明月,天涯共此时。

05年离家之后,每年都是过年回一次家,今年是个例外,在遥远的老家,祝所有认识我的人,和我认识的人,中秋快乐,发财多多(虽然俗了点)。手机遇到点问题,没逐个给各位问好,多多包含。
PS:但愿我回去的时候各位不要跟我说国庆阅兵式多么的壮观,我不喜欢浪费纳税人的钱彰显自己的阔绰和宏伟,我爱我的祖国,但我不喜欢过度的政治宣传。

Posted by & filed under Tools.

前几天突然发现Firefox启动时候CPU占用有50%,更要命的是居然启动不起来,总是崩溃,崩溃,由于开发任务忙,换成别的浏览器继续搞,这两天又去旅游了一趟,早上一到公司,就开始整,DBA Notes的Fenng大侠,在他的博客中说是quick time这个播放器引起的,我跑到安装目录下面,没找到quick time这个插件,最后google到这篇文章,说是由google desktop不兼容引起的,google的桌面软件一向兼容性不是很好,卸载之,果然firefox正常了,唉,惊叹一下google的工程师是不是都用Mac的,郁闷

Posted by & filed under Programming.

函数可以用对象去记住先前操作的结果,从而能避免无谓的运算。这种优化被称之为记忆,英文叫做memoization。关于memoization可以参见维基百科的解释。JavaScript的对象和数组要实现这样的优化是非常方便的,比如说,我们要递归计算著名的fibonacci数列,一个fibonacci数字是之前两个fibonacci数字之和,最前面两个数字是0和1.

var fibonacci = function (n) {
    return n <2 ? :fibonacci(n-1) + fibonacci(n - 2);
};
for(var i = 0; i <= 10; i++) {
    document.writeln('//' + i + ":" + fibonacci(i));
}

这样的算法是可以工作的,但本身做了很多无谓的运算。fibonacci函数被调用了453次。我们调用了11次,而自身调用了442次去计算可能已经计算过的值。如果我们让该函数具备记忆功能就可以显著减少运算量。
我们在一个名为memo的数组中保存我们的存储结果,存储结果可以隐藏在闭包中。当我们的函数被调用时,这个函数首先看是否已经知道存储结果,如果已经知道,就立即返回这个存储结果。

var fibonacci = function () {
    var memo = [0,1];
    var fib = function (n) {
        var result = memo[n];
        if(typeof result !== 'number') {
            result = fib(n - 1) + fib(n - 2);
            memo[n] = result;
        };
        return result;
    };
     return fib;
}();

这个函数返回同样的结果,但只被调用了29次,我们调用了它11次。他自身调用了18次去取得之前的存储结果。运算效率大约提升了93%,可见记忆这种优化的能力是非常强大的。PHP语言中也可以使用闭包创造类似的记忆优化算法。

Posted by & filed under Programming.

file_get_contents一步就做完了打开,读取,关闭的三个动作,过程相当自动化,并且可以读取远程内容,非常方便,在网络状况差的情况下,可能会导致程序执行陷入停滞或者过慢,因为不停的重试和等待PHP进程本身的超时才会退出。晚上再次阅读了PHP手册,发现可以用一个比较变态的东西来解决,就是创建一个可以控制的资源句柄,通过控制资源句柄超时来控制file_get_contents这个方法的超时时间,使用起来很方便,也很简单。

$opts = array(
           'http'=array(
	         'method'="GET",
	         'timeout'=1, //设置超时,单位是秒,可以试0.1之类的float类型数字
		)
	);
$context = stream_context_create($opts);
$contents = file_get_contents($url,false,$context);

得到内容之后该怎么处理就怎么处理了,关于tream_context_create这个方法的更多HTTP协议参数,请参见:HTTP context options,其他协议,请参见Context options and parameters

Update 09-09-17: 我测试的时候使用的g.cn的首页,非常快,把timeout设置为1,没有超时的感觉,我以为是分钟为单位,感谢的Lightning$指正,单位是秒。

Posted by & filed under Tools.

迅雷应该算是当前中国装机量最大的下载软件,很多人没听过快车,很少人没听过迅雷,不过迅雷在一开始就过度的关注商业利润,使得现在广告满天飞,严重影响用户体验,致使很多人使用修改版(去广告版)迅雷,修改版迅雷之所以受欢迎,不仅仅因为广告,还因为CPU消耗更多,更关注用户的隐私,更方便。这个很类似当年的珊瑚虫QQ,我觉得迅雷有必要去学学QQ了,QQ自从2009版本发布以后,允许用户自定义界面模块,并且边界可隐藏,广告体验大大的优化了,我看过大部分人都不隐藏界面上的东西,有些是因为他们不知道,有些是因为习惯了这样的界面,但无论如何,更好的UI体验,更自由的定制,都堵住了像我这样挑剔的用户的嘴巴,或者用说就是不给钱却要求很多的高端用户,迅雷做的还远远不够,弹出的广告太恶心。

其实修改版迅雷除了精简了一些模块和调整了一些默认设置之外,还做了一件最重要的事情就是修改hosts文件,关于这个文件的作用可以参考百度百科中的解释,这文件的位置位于:C:\WINDOWS\system32\drivers\etc,当然假如你的系统不是在C盘,那就看着办吧,在上面的路径中找到hosts文件,然后右键打开方式里面选择记事本,在文件的最后添上如下字段:

0.0.0.0   pubstat.sandai.net
0.0.0.0   mcfg.sandai.net
0.0.0.0   biz5.sandai.net
0.0.0.0   float.sandai.net
0.0.0.0   cl.kankan.xunlei.com
0.0.0.0   mtips.xunlei.com
0.0.0.0   211.94.190.80
0.0.0.0   adsresult.joywell.com.cn
0.0.0.0   advstat.xunlei.com
0.0.0.0   wy.xunlei.com
0.0.0.0   kkpgv.xunlei.com
0.0.0.0   statis.kankan.xunlei.com
0.0.0.0   server1.adpolestar.net
0.0.0.0   mpv.sandai.net

目前可以达到去除所有广告的目的,不知道以后会不会改地址,暂且用之。另外,修改版迅雷可能会被插入一些用户行为统计的代码或程序,比如尼尔森,艾瑞所思之流就经常和流氓软件的作者合作干这种勾当,这也是我不使用修改版的一个重要原因之一。

Posted by & filed under Operating System.

Linux进程创建很特别。许多其他的操作系统都提供了产生(spawn)进程的机制,首先在新的地址空间里创建进程,读入可执行文件,最后开始执行。Linux通常采用了与众不同的实现方式,他把上述步骤分解到两个单独的函数(步骤)中去执行:fork()和exec()。
首先fork()通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅是多了一个PPID(父进程的进程号,子进程将其设定为被拷贝进程的PID),当然PID也是不同的,不过每个进程的PID都是不同的,要不然操作系统就没法识别和调度了。
exec()函数负责读取可执行文件并将其再如地址空间开始运行。把这两个函数组合起来使用效果和其他系统使用的单一函数效果相似。
fork()是通过简单的资源拷贝来实现创建子进程,尽管子进程有那么点和父进程的区别,这种通过简单拷贝实现的进程创建是非常低效率和耗资源的,因此人们想着去怎么提高这个效率,最后采用了一种类似与程序设计中的延迟绑定的措施,也就是“写时拷贝”。所谓写时拷贝就是内核在创建进程时不复制整个进程的地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候数据才会被复制到新的地址空间中,从而是个进程拥有各自的拷贝,也就是说在此之前都是以只读方式实现共享,何种技术使地址空间上的页拷贝被推迟到实际发生写入的时候。在页根本不会被写入的情况下,就无需再复制了。
废话了这么多,实际上也就是说Linux进程的创建是通过拷贝来实现的,然后对这个拷贝方式和时间进行了优化,出现了写时拷贝这么个东西。

Posted by & filed under Programming.

事实证明,网上的很多东西都是扯淡,不过原理还是有的,我碰到一个需求,给定一段文字中(GBK编码),去除所有符号,不相干符号,包括标点,日文片假名之类的,于是我在网上搜啊,搜啊,得到的结果要么就是错的,要么就根本好不相干,被抄袭得最厉害的是http://community.mybbchina.net/thread-212-post-507.html,可怜的作者,我也不知道这些人为什么抄这个,我就没测试成功过,连GBK的字符集区间都没弄清楚。

其实指定字符编码匹配中文很简单,GBK编码表中很明确的规定了所有的符号位置,而且刚好是一个区间,在维基百科上有详细的介绍,比如我要把类似

addd中华ds,#¥%…&((212))}}A■g民国ds中-啊国fjsd,【】啊Y

这样的字符串中所有非中文、英文、数字字符全部去除掉,姑且叫去除的字符为火星文,去除火星文的PHP写法为:

preg_replace("/([\xA1-\xA9].{1}?)*?/", "", $str);

这样所有在全角状态下输入的非中文,英文和数字将被替换掉,如果还需要进一步处理英文状态下的,那就判断一下ASCII码值吧,或者你怕麻烦也可以把所有的都列出来,然后替换,可以参考下面,在网上找来的,非我写的,忘了出处了

	/**
	 * 清除所有常见标点符号
	 * @param $pointer
	 * @return unknown_type
	 */
	function clear_point($pointer)
	{
	     return str_replace
	       (
	       array(' ',"~","!","@","#","$","%","^","&","*",",",".","?",";",":","'",'"'," [",
	       "]","{","}","!"," ¥","……","…","、",",","。","?",";",":","‘","“","”",
	       "’"," 【","】","~","!","@","#","$","%","^","&","*",",","."," <",
	       ">",";",":","'",""","[","]","{","}","/","\","《","》","-","_"),
 
	       array('','','','','','','','','','','','','','','','','','','','','','','','',
	       '','','','','','','','','','','','','','','','','','','','','','','','','','',
	       '','','','','','','','','','','','','',''),
	          $pointer
	       );
	}

这个东西有更好的写法,而且全角状态的符号在之前已经过滤了,在此可删除,我懒,抛砖引玉吧