Dreamhost 上编译 php5

Dreamhost提供的php有不少限制,昨天折腾了一个晚上终于成功地在自己的虚拟主机上编译了php5。 Why用下来,发现使用自己编译的php5有这么几个好处: 可以自定义内存分配上限,默认只有32M,通过wordpress安装插件的时候经常出现内存不够的问题。 上传文件大小限制也能改,默认只有2M,基本没法通过wordpress传音乐之类的比较大的文件。 使用自己的php后解释执行的进程uid也是自己了,这样就避免了很多nobody用户访问/修改/增加文件所带来的问题。 How to compile 编译和安装的大部分步骤可以参考http://wiki.dreamhost.com/index.php/Installing_PHP5,这里补充一点我碰到的问题和解决方法。 因为我这台dreamhost虚拟主机用的是x86_64,而通过下载的php5的configure文件默认查找的是/usr/lib/下面的共享库,通过–with-libdir=lib64设置查找路径后却无法找到openssl库了,于是我用了个很山寨的方法,把configure脚本里查找libmysqlclient时的路径临时改成了/usr/lib64,然后再改回/usr/lib。 安装脚本开头定义的几个包的名字可能也要修改下,如果下载出现错误的话去上级目录看下最新的包的名字是什么就行了。另外脚本中解压.Z和.tar.gz文件用的是uncompress命令,似乎在我的这个主机上没有安装,改成tar zxf就行了。 How to use最后说下编译成功后怎么使用,具体方法那个网页上也讲过了,只要把编译后的php.cgi放到/cgi-bin/下然后改下.htaccess即可。 对于子域名,比如我这个techblog.iamzellux.com,参照网页上的说明把整个cgi-bin用符号链接的方式link到子域名的根目录下是最方便的方案,当然别忘了修改.htaccess。 阅读全文 →

基于函数调用栈的 rootkit

这篇题目为Return-Oriented Rootkits: Bypassing Kernel Code Integrity Protection Mechanisms的论文发在了今年的Usenix Security上,现在在Usenix网站上还不能下到这篇paper的pdf,可以去作者的主页上下。 现在有不少用来防止栈溢出攻击的技术,比如操作系统保证任何一个页不能同时为可写且可读(WinXP SP2、Win 2003、Exec Shield for Linux等都采用了这个策略),这个方法实现起来比较简单,但只能防范部分形式的攻击,如果攻击者事先准备一张含有恶意代码的用户态的只读页,然后跳转到这个页,就能绕开这种保护措施了;另外也有人提出在操作系统的下面再加一层虚拟层,让它来保证上层系统没有因为各种buffer overflow而执行恶意代码(NICKLE)。 而这里提到的return-oriented的攻击方法不同于传统的攻击机制,它所采用的攻击代码都是内核自身的代码,因此能绕过前面提到的各种保护手段。 所谓return-oriented programming,简单的说就是把原来已经存在的代码块拼接起来,拼接的方式是通过一个预先准备好的特殊的返回栈,里面包含了各条指令结束后下一条指令的地址。 例如现在函数A里面有这么一段指令 instruction A ret 函数B里面有另外一段: instruction B ret 它们在正常的运行情况下没有任何关系,但是我发现如果把A和B拼起来就能达到我想要的结果,于是我构造了一个包含有A和B的地址的栈,先通过ret指令返回到instruction A处,之后再执行ret指令时,由于栈是精心构造的,因此接下来会执行到instruction B,这样就得到我想要的结果了。只要这个ret前的指令库足够大,就能实现几乎所有的程序。 这种攻击方式并非这篇paper的首创,最早是由Shacham提出的(http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.140.9210,http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.78.7135) 这篇paper的一大贡献在于实现了一个自动从libc和驱动、内核等代码中找到可用的指令,并拼接成所需程序的系统,这里面包括一个扫描可利用代码、并把它们结合起来的Constructor,一套专用的语言,以及把这套语言编译成对应代码片段之和的编译器,最后还有一个计算实际代码地址的Loader。 这套攻击机制在WinXP SP2/Sp3, Vista SP1等系统上都获得了成功,尽管查找代码并生成这个过程的overhead很大,但对于一次成功的rootkit攻击来说影响并不大。 阅读全文 →

Xen 警告 Time went backwards 的暴力解决方法

前几天给测试Xen用的虚拟机挂了,只能用VMware的snapshot返回到之前的镜像,然后似乎因为时间问题启动Xen的时候总是会定时打印出类似 571 Timer ISR/0: Time went backwards: delta=-11072481 delta_cpu=298927519 shadow=196807680595 off=288495093 processed=197107247546 cpu_processed=196797247546 572 0: 196797247546 573 1: 197107247546 的信息,google了下发现是时间同步的问题,用ntp协议同步时间即可解决这个问题。另外这里再给出一个最暴力的解决方法:在linux-xen源码的arch/i386/kernel/time-xen.c文件中找到Time went backwards,把这行打印语句以及后面的循环打印删除,然后重新编译内核。x86_64体系结构也是修改这个文件。方法很暴力,也没真正解决问题,但是至少不影响我看/var/log/messages的输出了。 阅读全文 →

防止 Firefox 在关闭最后一个 Tab 后退出

记得以前用Firefox 3.0.x时把Tools -> Options -> Tabs -> Always show the tab bar勾上就行了,升级到3.5以后就没用了,搜了下Knowledge Base,最后在 https://support.mozilla.com/tiki-view_forum_thread.php?locale=zh-CN&comments_parentId=184680&forumId=1看到只要将about:config页中的browser.tabs.closeWindowWithLastTab项设为false即可 阅读全文 →

SVN 更新短信通知脚本

主要功能:开发人员执行svn commit后自动将开发人id、修订版本号和日志内容通过短信的方式通知所有人。 首先修改svn服务器对应项目目录hook/post-commit文件 #!/bin/bash export LANG=en_US.utf8 REPOS="$1" REV="$2" cd /home/svn/repositories/sebank/hooks ./sms.py commit $REPOS $REV 注意别忘了这里的export LANG,我一开始测试的时候发现中文一直有乱码,后来才意识到shell的环境变量里缺这个。 hook/sms.py #!/usr/bin/python # -*- coding: utf-8 -*- import sys, urllib, os from subprocess import * user = 'your mobile number' pword = 'fetion password' phone = [ '13764444444', '13813333333', ] repo = sys.argv[2] rev = sys.argv[3] cmdlog = 'svnlook log -r %s%s'%(rev, repo) cmdauthor = 'svnlook author -r %s%s'%(rev, repo) log = Popen(cmdlog, stdout=PIPE, shell=True). 阅读全文 →

云计算

某门课程的Open Topic,我的话题是关于云计算的,读了一篇技术报告 Above the Clouds: A Berkeley View of Cloud Computing。 这是 UCB 的 RAD(Reliable Adaptive Distributed) 实验室花了六个月时间 brainstorm 总结出来的 paper,介绍了云计算的概念、现状及未来展望。以下内容主要来自于我上交的文档,做了一些修改,欢迎大家指正。 虽然现在对云计算这个概念的炒作大于实际研究,以至于很多人听到云计算这个名词就想到忽悠,但这里面还是很多东西需要好好考虑和设计的。云计算和以前的 cluster computing 等概念虽有相同之处,区别也有不少,它涉及了经济学、虚拟化技术、安全等诸多领域的内容。 何谓云计算? 云计算包含两方面内容,一是在网络上提供的为计算服务的应用,例如以前被称为 SaaS(Software as a Service) 的那一类应用;二是提供这些服务的在数据中心的硬件和系统软件,这部分也就是我们通常所称呼为「云」的东西。 云计算平台的优势 云计算带来了三个新颖的观点: 提供了看起来没有上限的可用计算资源,用户不需要提前考虑设备的需求量; 免去了云计算用户的前期投入,使得公司可以从一个规模较小的硬件资源起家,并根据自己的需要增加资源; 细粒度的计费手段,例如按每小时使用处理器数或者每天使用的存储空间计算,并在暂时不需要机器和存储空间时即时减免费用。 云计算资源拥有很好的弹性,以 Amazon EC2 为例,用户可以在几分钟内完成硬件资源的添加或者减少操作,这在传统的应用程序部署中是很难做到的。文中提到了 Facebook 上的一个应用 Animoto,这个应用的资源需求在三天内从 50 台服务器上升到了 3500 台服务器。在传统的部署情景中,这样的需求是很难通过预先准备好硬件来满足的。另外还有一个问题,当资源需求下降时,传统方式部署的服务器资源就被闲置了,而通过云计算部署的资源则灵活很多,例如一个网站到了深夜访问量下降,此时就可以通过减少占用的计算资源从而降低支出。 平台分类 现在的云计算平台提供了不同粒度的 API。Amazon EC2 是一个底层的极端,它提供了类似物理硬件的接口,用户可以几乎控制从内核开始的整个软件栈。通过虚拟技术提供的 CPU、块设备、IP 级别的连通技术使得开发人员几乎可以做任何事情。高度的灵活性带来的是可控性的损失,在自动伸缩性 (automatic scalability) 和容错转移 (failover) 方面,服务商就力不从心了。而 Google AppEngine 则提供了比较高层的 API,主要面向传统的 web 应用,在牺牲灵活性之后能很好的实现自动伸缩和转移,并对用户完全透明。而微软的 Azure 则介于这两者之间,提供了接近 CLR 字节码的接口,用户可以通过 . 阅读全文 →

Company-mode: Emacs 自动补全

Company的全写是complete everything,它只是一个补全的前端,会自动调用semantic等后端插件。 新版的Company可以从它的官方主页(http://nschum.de/src/emacs/company-mode/)下载到,也可以从ELPA下载安装这个插件。 使用这个插件时只要在.emacs中加入 (add-to-list 'load-path "/path/to/company") (autoload 'company-mode "company" nil t) 然后Emacs中使用M-x company-mode启动company模式即可。 具体的按键可以在company.el中看到 (defvar company-active-map (let ((keymap (make-sparse-keymap))) (define-key keymap "\e\e\e" 'company-abort) (define-key keymap "\C-g" 'company-abort) (define-key keymap (kbd "M-n") 'company-select-next) (define-key keymap (kbd "M-p") 'company-select-previous) (define-key keymap (kbd "") 'company-select-next) (define-key keymap (kbd "") 'company-select-previous) (define-key keymap [down-mouse-1] 'ignore) (define-key keymap [down-mouse-3] 'ignore) (define-key keymap [mouse-1] 'company-complete-mouse) (define-key keymap [mouse-3] 'company-select-mouse) (define-key keymap [up-mouse-1] 'ignore) (define-key keymap [up-mouse-3] 'ignore) (define-key keymap "\C-m" 'company-complete-selection) (define-key keymap "\t" 'company-complete-common) (define-key keymap (kbd "") 'company-show-doc-buffer) (define-key keymap "\C-w" 'company-show-location) (define-key keymap "\C-s" 'company-search-candidates) (define-key keymap "\C-\M-s" 'company-filter-candidates) (dotimes (i 10) (define-key keymap (vector (+ (aref (kbd "M-0") 0) i)) `(lambda () (interactive) (company-complete-number ,i)))) keymap) "Keymap that is enabled during an active completion. 阅读全文 →

两个和函数构造相关的趣味面试题

http://stackoverflow.com/questions/731832/interview-question-ffn-n http://stackoverflow.com/questions/732485/interview-question-ffx-1-x

问题描述很简单,第一个问题是实现一个函数f,参数为一个带符号的32位整型,使得f(f(x)) = -x,即调用两次后返回的结果为原来的相反数;另一个问题也是实现一个函数g,参数为一个32位浮点,最后使得g(g(x)) = 1/x。如果不能满足所有的情况,就满足尽可能多的情形。

第二个问题比第一个问题简单一点,目前支持数最高的两个答案如下:

阅读全文 →

利用 VMware 的虚拟串口调试 Xen

VMware支持虚拟串口设备,对于调试内核或者虚拟机的帮助很大,具体设置如下(VMware Server 2, Xen 3.3): VMware中为虚拟机增加串口设备 Add Hardware->Serial Port,然后在设置中将Connection模式设为File,指定相应的文件路径(如[standard] debian-xen/serial-port.log) 修改虚拟机的grub启动参数,以我的/boot/menu/lst为例 title Xen 3.3.0 / Debian GNU/Linux, kernel 2.6.18.8-xen root (hd0,0) kernel /boot/xen-3.3.0.gz com1=115200,8n1 loglvl=all guest_loglvl=all console_to_ring console=com1,vga sync_console module /boot/vmlinuz-2.6.18.8-xen root=/dev/sda1 ro console=tty0 savedefault 重启虚拟机,即可在之前指定的文件中(Host机上的/opt/vmware/Virtual Machines/debian-xen/serial-port.log)中看到虚拟机的输出信息了。 阅读全文 →

ArchLinux 下安装 git, gitosis, gitweb 服务

参考文章: [1] http://hokietux.net/blog/?p=58[2] http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way[3] http://www.nkuttler.de/2009/04/06/git-clone-ssh-could-not-resolve-hostname/ git 很简单,直接用pacman安装即可 sudo pacman -S git gitosis gitosis是一个方便管理git仓库的工具,安装方法: 从yaourt或者aur下载安装gitosis-git包 http://aur.archlinux.org/packages.php?ID=23419 新建git用户 sudo useradd –system –shell /bin/sh –comment ‘git version control’–user-group –home-dir /home/git/ git 将开发用户的rsa公钥导入gitosis,(没有公钥的话请先运行ssh-keygen -t rsa生成) sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub 如果以上步骤没有问题,那么运行git clone ssh://git@hostname/gitosis-admin.git后应该就能看到gitosis-admin.git这个目录了 新建项目、添加用户等操作参见[2],这里不再赘述 gitweb 事实上ArchLinux中安装的git包自带了gitweb,可以用which gitweb搜到,一般默认在/usr/share/gitweb。下面假设我的http根目录为/home/httpd 将/usr/share/gitweb下的文件复制到/home/httpd/cgi-bin(其实似乎只要gitweb.cgi就够了) sudo cp -R /usr/share/gitweb /home/httpd/cgi-bin/ /usr/share/gitweb下的.css和.png复制到/home/httpd/html/git/ 修改或创建/etc/gitweb. 阅读全文 →