2012年12月

  我使用urxvt作为linux的常用终端,urxvt本身是可以半透明和完全背景透明的。 但是打开vim的时候,编辑器的背景却变成全黑了。
   这个应该与vim的colorscheme相关。所以修改下色彩的配置文件,就能实现使用终端默认的背景和透明度了:


      hi Normal ctermbg=NONE


也可以把这行放到~/.vim下的对应配置文件中,使vim默认生效。
其他终端比如gnome-shell我想配置方法应该是同样可以的。

 xcompmgr 已经停止维护,继任者是 xcompmgr-danacompton-git。这些软件包包含了 bug 修复,可以设置菜单的透明度(参考:https://wiki.archlinux.org/index.php/Xcompmgr_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29 ).

compton是从xcompmgr fork后的修改版本,并且一直到现在都还在更新。

// compton下载地址
https://github.com/chjj/compton

Debian sid源里并没有提供现成的包,所以我只能从github上clone一份源码,然后编译安装。compton的文档还是很详细的,README中直接写明了所有编译和运行的依赖,因此只需要逐个安装,然后make即可。

我是自己多次尝试make,然后安装了依赖关系:

$ sudo apt-get install libpcre3-dev
$ sudo apt-get build-dep xcompmgr
$ sudo apt-get install libconfig-dev libdrm-dev mesa-common-dev \
libxcomposite-dev libxdamage-dev libxext-dev libxfixes-dev libxrender-dev \
x11proto-composite-dev x11proto-damage-dev x11proto-fixes-dev \
x11proto-render-dev x11proto-xext-dev xutils-dev \
libxrandr-dev

其中找不到-lGL, 其实已经安装了libGL.so, 在/usr/lib/i386-linux-gnu/mesa/libGL.so.1, 因此,做一个link即可。
cd /usr/lib/i386-linux-gnu/
sudo ln mesa/libGL.so.1 libGL.so -s

然后make成功。

保存了一份配置文件到~/.compton.conf
# Shadow
shadow = true;
no-dnd-shadow = true;
no-dock-shadow = true;
clear-shadow = true;
shadow-radius = 6;
shadow-offset-x = -9;
shadow-offset-y = -9;
shadow-opacity = 0.4;
# shadow-red = 0.0;
# shadow-green = 0.0;
# shadow-blue = 0.0;
shadow-exclude = [ "n:e:Notification" ];
# shadow-exclude = "n:e:Notification";
shadow-ignore-shaped = false;

# Opacity
menu-opacity = 0.9;
inactive-opacity = 0.8;
frame-opacity = 0.9;
inactive-opacity-override = false;
alpha-step = 0.06;

# Fading
fading = true;
# fade-delta = 30;
fade-in-step = 0.03;
fade-out-step = 0.03;
# no-fading-openclose = true;

# Other
mark-wmwin-focused = true;
mark-ovredir-focused = true;
use-ewmh-active-win = false;
detect-rounded-corners = true;
detect-client-opacity = true;
refresh-rate = 0;
vsync = "none";
dbe = false;
paint-on-overlay = false;
sw-opti = false;

# Window type settings
wintypes:
{
  tooltip = { fade = true; shadow = false; opacity = 0.75; };
};

和xcompmgr比较一下:

xcompmgr -CcfF -I-.015 -O-.03 -D6 -t-1 -l-3 -r4.2 -o.5 &

好像compton的配置更细致文档化一些。

x220的笔记本,以前在linux下一直比win7温度高不少,经常风扇呼呼的响。但是今天把内核升级到3.7(以前用过3.2,3.4,3.6..)以后,发现温度比以前低了一些,不管是cpu还是gpu的优化,结果倒是出乎意料。 有点满意。

系统信息如下:
System:    Host: Gao-X220 Kernel: 3.7.1-030701-generic i686 (32 bit, gcc: 4.6.3)
           Desktop: Awesome 3.4.11 dm: lightdm Distro: Ubuntu precise (12.04.1 LTS)
Machine:   System: LENOVO product: 42874DV version: ThinkPad X220 Chassis: type: 10
           Mobo: LENOVO model: 42874DV Bios: LENOVO version: 8DET58WW (1.28 ) date: 02/14/2012

Bing.com每天的壁纸其实质量都很好,所以考虑定时去抓取下来。
bing有个xml的 ajax接口用于获取图片列表,因此写一个php脚本去crontab下载即可。

$cat bing_images.php

#!/usr/bin/php

<?php
class BingImage {
       private $xml;
       var $img;
       const XML_URL    = 'http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=8';
       const DOWN_DIR = '/home/jgao/bing.com/';
       public function  __construct() {
               $this->img  = array();
       }

       public function init() {
               $this->xml    = simplexml_load_file(rawurlencode(self::XML_URL));
               $img = array();
               foreach($this->xml->image as $v) {
                       $tmp    = 'http://www.bing.com'.$v->url;
                       $img[]    = $tmp;
               }
               $this->img = $img;
       }
       public function download(){
               if(count($this->img)==0){
                       $this->init();
               }
               foreach ($this->img as $img){
                       $tmp_name = end(split('/\?/', $img));
                       $tmp_name = end(split("%2f", $tmp_name));
                       $tmp_name = preg_replace("/[\/\?\&]/", "",$tmp_name);
                       if(strpos($tmp_name, 'jpg')===false){
                               continue;
                       }
                       $target = self::DOWN_DIR."/".$tmp_name;
                       echo "download{$img} =>{$tmp_name}... ";
                       if(file_exists($target) && filesize($target)>1000){
                               echo "already downloaded.\n";
                               continue;
                       }
                       $tmp_file = file_get_contents($img);
                       file_put_contents($target ,  $tmp_file);
                  echo "finished.\n";
               }
       }
}

$bing = new BingImage();
$bing->download();

如果nginx有--with-http_perl_module模块的话,则可以嵌入一些perl脚本进行一些复杂的处理。 需要特别注意的是不能有blocking的IO或者网络请求(比如DNS查询),这样会严重拖累nginx的性能。一定有这种需要的话,可以参考http://zzzcpan.github.com/nginx-perl/,一个增强版的第三方perl模块。

一个简单的使用例子就是用perl产生一个新的nginx变量:
perl_set $new_value '
sub{
   my $r = shift;
   my $host_ip = "";
   my @queries = split("&",$r->args);
   my $new_value = "";
   for(@queries){
       my ($k,$v)= split("=",$_);
       if($k eq "field_XXX"){
           $fileid=$v;
           last;
       }
   }
   $new_value;
}
';
这样就从url的query列表中提取出一个field_XXX的内容,赋值给nginx的变量$new_value.

上面代码中的$r是nginx模块的一个对象,可以用它获取和处理几乎所有request/response的要求。常见成员变量为:
$r->args – 请求的参数 .
$r->discard_request_body – 这个参数是让 Nginx 放弃 request 的 body 的内容.
$r->filename – 返回合适的请求文件的名字
$r->has_request_body(function) – 如果没有请求主体,返回0,但是如果请求主体存在,那么建立传递的函数并返回1,在程序的最后,nginx将调用指定的处理器.
$r->header_in(header) – 查找请求头的信息
$r->header_only – 如果我们只要返回一个响应的头
$r->header_out(header, value) – 设置响应的头
$r->internal_redirect(uri) – 使内部重定向到指定的URI,重定向仅在完成perl脚本后发生.可以使用 header_out(Location….的方法来让浏览器自己重定向
$r->print(args, …) – 发送数据给客户端
$r->request_body – 得到客户端提交过来的内容 (body 的参数,可能需要修改 nginx 的 client_body_buffer_size. )
$r->request_body_file —给客户的 body 存成文件,并返回文件名
$r->request_method — 得到请求 HTTP method.
$r->remote_addr – 得到客户端的 IP 地址.
$r->rflush – 立即传送数据给客户端
$r->sendfile(file [, displacement [, length ] ) – 传送给客户端指定文件的内容,可选的参数表明只传送数据的偏移量与长度,精确的传递仅在perl脚本执行完毕后生效.这可是所谓的高级功能啊
$r->send_http_header(type) – 添加一个回应的 http 头的信息
$r->sleep(milliseconds, handler) – 设置为请求在指定的时间使用指定的处理方法和停止处理,在此期间nginx将继续处理其他的请求,超过指定的时间后,nginx将运行安装的处理方法,注意你需要为处理方法通过一个reference,在处理器间转发数据你可以使用$r->variable().
$r->status(code) – 设置 http 的响应码
$r->unescape(text) – 使用 http 方法加密内容如 %XX
$r->uri – 得到请求的 URL.
$r->variable(name[, value]) – 设置变量的值

下面写一个实际中复杂的情况: 从GET的query_string取出一个fileid的参数,然后到memcache中去读取相关联的key对应的value(这个value是一个host ip,用于接下来的nginx转发).代码如下:
perl_set $to_host_ip '
sub{
   my $r = shift;
   my $host_ip = "";
   my @queries = split("&",$r->args);
   my $fileid = "";
   for(@queries){
       my ($k,$v)= split("=",$_);
       if($k eq "fileid"){
           $fileid=$v; #得到所需的param值
           last;
       }
   }
   if($fileid ne ""){
       use Cache::Memcached;
       #初始化memcache对象.
       my $memd = new Cache::Memcached { "servers" => ["192.168.1.201:11215"],"debug" => 0,"compress_threshold" => 10_000};
       $host = $memd->get("uw_tmp_filename:".$fileid); #取出memcached中的value
       if( $host=~/192\.168\.1\.\d+/){
           $host_ip = $host;
       }
   }
   $host_ip;#返回
}
';