• crontab 里 % 引发的问题

    写个 crontab ,命令是类似这样的

    /path/to/script `date +%Y-%m-%d`

    直接运行很正常,但是在 crotnab 里就出错。

    /bin/sh: -c: line 1: unexpected EOF while looking for matching ``'
    /bin/sh: -c: line 2: syntax error: unexpected end of file

    google 了好一阵才找到答案。原来 crontab 里的 % 是有特殊意义的,在这里需要转义。man 5 crontab 可以看到,

    Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

    % 如果没有用 \ 转义,就会被替换成换行。所以之前的 crontab 就出错了。

    解决办法:可以在 % 前面都加个 \ ,对于这个例子,写成 date +\%Y-\%m-\%d。

     

    Tags: crontab Linux
  • swfupload 服务器端输出错误信息

    swfupload 上传到服务器后,对任何非 200 的响应都认为是错误,会调用 upload_error_handler 回调。但是在回调里取不到服务器端输出的错误信息,只能得到响应码。

    要在 swfupload 处理服务器的错误信息,只能通过 upload_success_handler 。也就是说,不管上传成功失败,都必须是 200 响应。然后输出不同的正文。比如,成功不输出内容,失败时输出错误信息。然后在 upload_success_handler 中通过 serverData 参数来判断。

    function uploadSuccess(file, serverData) {
    try {

    var progress = new FileProgress(file, this.customSettings.progressTarget);
    progress.setComplete();
    if (/^\s*$/.test(serverData)) {
    progress.setStatus("ok");
    } else {
    progress.setStatus(serverData);
    }
    progress.toggleCancel(false);
    } catch (ex) {
    this.debug(ex);
    }
    }

     

    Tags:
  • 一个 php 对象数组转型的神奇结果

    群里说起 php 的数组 key 的类型转换问题,

    比如 $a = array('123'=>'abc'); var_dump($a); 会发现 key 会变成整数。用 $a['123'] 这种方式访问数组的时候,也会先把 key 转换成整数。突然想到能不能构造一个实际 key 为字符串形式的数字的数组,或者整数型属性名的对象(对象内部也是个 hash,也同时支持整数和字符串 key)。试了一些方法没成功。然后看到了这篇东西

    http://www.laruence.com/2010/05/26/1541.html

    就想到了个构造那样的数组和对象的方法。

    $o = new stdClass();
    $o->{'123'} = 1;
    $a = (array) $o;
    var_dump($a);
    var_dump(isset($a['123']));
    var_dump(isset($a[123]));

    $a = array(1,2,3);
    $o = (object) $a;
    var_dump($o);
    var_dump(isset($o->{1}));
    var_dump(isset($o->{'1'}));

    这样就构造出了正常方式没法访问的数组下标和对象属性*(访问对象属性时会把属性名转成字符串)。

    还可以干一件更 BT 的事情,访问对象的私有或保护属性。

    class Test {
        private $a = 1;
        protected $b = 2;
        public $c = 3;
    }
    $o = new Test();
    $a = (array) $o;
    var_dump($a);
    var_dump($a["\0Test\0a"]);
    var_dump($a["\0*\0b"]);

     

     

    Tags: php
  • Firefox 的诡异的 iframe 缓存问题

    firefox 会缓存 iframe 的内容。但是诡异的是对用动态页面输出的 js 生成的包含静态内容的 iframe 却可能会缓存不该缓存的东西。

    test.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
      <title> test </title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     </head>
     <body>
    <script src="test.php"></script>
     </body>
    </html>

    test.php

    <?php
      session_start();
      if (!isset($_SESSION['test'])) {
          $_SESSION['test']=true;
      }
     
      if ($_SESSION['test']) {
          echo 'document.write(\'<iframe src="test2.htm" name="test"></iframe>\');';
      } else {
          echo 'document.write(\'<iframe name="test"></iframe>\');';
      }
      $_SESSION['test'] = !$_SESSION['test'];

    test2.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
      <title></title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     </head>
     <body>
      <script type="text/javascript">
        alert('a~~~~');
        parent.location.href=parent.location.href;
      </script>
     </body>
    </html>

    比如上面那个例子,访问过一次 test.html 后,再刷新一下,比较一下 firefox 和其他浏览器的差异。

    解决办法是,在 js 输出 iframe 后,加一个 iframe.src = iframe.src; ,或者其他的可以刷新内容的东西。

     

    Tags:
  • 风景

    风景不只是山水楼阁,人也是风景的一部分。在你看风景的时候,也许别人也在看你。在某些人山人海的景点,就更是只有人可以看了。

     

    Tags: 摄影
  • 峨眉山流水账

    这回去四川,上峨眉山游玩+自虐了一回。

    从汽车站坐车到了五显岗,买门票(门票还是个邮资明信片),然后就开始了爬山过程。因为已经是中午了,到了清音阁就先吃了个传说中的斋饭。因为时间已经晚了,就只剩几个凉拌菜和菜汤。不过那些蔬菜还挺好吃,也有可能是饿了的缘故。接着就开始往万年寺方向爬山。

    万年寺那边看到了一群猴子,还有一群逗猴子的人。因为有人怕猴子,就没久留,继续爬山。那段路叫观心坡。峨眉山上比较陡的爬起来累人的都叫某某坡。这个试心坡确实够观心的,终于爬上去了,就到了息心所。这里有几匹往来山上山下驼东西的马,还有两只猫。稍稍休息一下接着往上爬。经过初殿,爬到了华严顶。这里已经是云雾缭绕了。

    往下走的时候,路遇一只黑猫。山上的店家不少都养了猫。应该是用来防止老鼠把好容易驼上来的东西吃了吧。不过那只黑猫很有意思。就一直在我们前面走,还会在前面等我们赶上来,就好像是在头前带路。然后走着走着,不知什么时候就又消失了……

    本来中间还应该有个岔路,结果走啊走啊,就直接走到钻天坡了。难道岔路被黑猫变没了么?传说中的钻天坡,其实因为是曲曲折折的,爬起来还没之前的试心坡累。不过,曲折的白色栏杆,从下面看上去倒是挺好看。

    爬过钻天坡就到了洗象池。一路上还看到了很多稀奇古怪的植物。洗象池也是在一片云雾中。寺里有个水池,据说是普贤菩萨洗他的大象的。在这里吃了晚饭,接着上路。

    从洗象池到雷洞坪又要过罗汉坡和连望坡这两个坡。因为体力已经耗得差不多了,腿也开始发软。这两个坡过的那叫一个艰难。爬过了罗汉坡天就开始黑了。天上还有一弯月亮,月光下路倒也还看得见,所以带的手电也没用。在月光下爬山,也真是别有味道。终于坚持到了雷洞坪已经快九点,赶紧找个店住了一晚。从窗口还能看到满天繁星。不过因为累得不行,第二天还要早起看日出,还是睡下了。

    第二天天没亮就起床,从雷洞坪爬到接引殿坐缆车上金顶。清晨比晚上还要暗,月亮已经下山,又全是雾气,所以手电还是用上了。缆车穿过云雾到了金顶的时候,天边已经亮了起来,太阳马上就出来了。赶紧找位置拍照。太阳云海中跃出的时候,还是很激动人心的。

    在山顶上逛逛,好多栏杆上都挂了牌子劝阻不要往下跳。在金顶上,还看到了一群鸟和松鼠。在这么高的地方那些动物也挺不容易的。金顶海拔三千多米,原本还担心会不会有啥高原反应,结果也没啥感觉。晒会太阳,拍拍照,就从金顶下来,又走进了云雾中。云雾中的森林显得挺诡异,有点西方奇幻片的感觉。

    传说峨眉山有很多猴子。结果,除了上山的时候在万年寺看到了一些,然后一直到金顶都再没见过,哪怕在传说中的猴山那段。最后,从金顶下来的路上终于又碰到了一些。峨眉山的猴子好短的尾巴呀。

    一路上我们都和旅行团反着走。上山的时候,碰到他们下山,下山的时候碰到他们上山。从金顶下来的时候,看到他们才爬了那点点路,就已经累死累活了,就忽然觉得自己还是很厉害的了。

    回到雷洞坪,吃了早饭+午饭,就直接坐车下山回去了,因为实在爬不动了。也还好就这么坐车下去了。下山的路车就开了一个多小时才到山脚下,要是再多逛会,回城就该晚了。

  • 在 bash 中分割字符串

    比如,要分割 test="aaa,bbb,cc cc,dd dd",可以这样

    arr=$(echo $test|tr "," "\n")

    还可以这样

    OLD_IFS=$IFS
    IFS=';'
    arr=$test
    IFS=$OLD_IFS

    然后用
    for x in $arr; do
      echo $x
    done
    看看效果

     

    Tags: bash
  • 在windows上创建软链接解决Dropbox不能同步多个目录的问题

    今天想要用 Dropbox 同步一个软件的数据目录,但 Dropbox 只能同步一个目录。虽然也能改那个软件的选项把数据目录放到 Dropbox 的目录里,但毕竟不爽。

    想到或许可以用软链接解决问题。windows 的 ntfs 也能支持软链接,不过只能对目录做软链接,不能对普通文件做。而且不像 *nix 那样,可以用 ln -s 创建,压根就没自带创建软链接的工具。不过既然本身支持,就总会有这样的工具存在。

    选择1:用 windows resources kit tools (里面有不少实用工具)里的 linkd.exe 。
    linkd 目标目录 源目录 比如要创建一个 D:\abc 到 D:\foo ,就是 linkd D:\abc D:\foo


    选择2:用第三方的小工具 junction。拷贝到 system32 里,就能直接在命令行用了。
    junction 源目录 [目标目录] 比如要创建一个 D:\abc 到 D:\foo ,就是 junction D:\foo D:\abc

    把数据目录软链接到 Dropbox 的目录里,果然就能同步了。

    需要注意的是,要删除软链接,不能直接在资源管理器里删除那个目录,而要用这些工具来删除。不然由于会先递归删除里面的文件,最后源目录就只剩下一个空目录了。应当这样删除软链接:
    linkd D:\abc /D 或 junction -d D:\abc

     

    Tags:
  • android 上用 ConnectBot 连 ssh

    android 上有个 ConnectBot 程序,可以用来连 ssh 。在 market 里可以找到。用用户名密码认证没问题。但是用 key 认证好久之后我才搞明白。想把电脑上的私钥导入,首先得用 openssh 的key。如果原来是 putty 的 key 要先转换一下。然后放到 sd 卡的根目录,扩展名得改成 .bak ,才能在导入密钥里找到。

    长按连接,可以设置连接选项,在其中可以设置 key agent 转发。

    Tags:
  • nginx 的 mogilefs 模块

    nginx 有一个第三方的 mogilefs 模块,实现了一个 mogilefs 的客户端,可以用 webdav 的方式访问。

    文档和下载链接见:http://www.grid.net.ru/nginx/mogilefs.en.html (需翻墙)

    用上这个模块,再结合 rewrite,只要 key 在 url 里有,就能直接代理到后端的 mogilefs。

    server {
            server_name  download.sample.com;
            charset utf-8;
            access_log  logs/download.access.log  main;
            root   /srv/www;

            mogilefs_tracker 192.168.1.100:6001;
            mogilefs_domain domain_name;
            mogilefs_class class_name;
            mogilefs_methods GET;

            location ~ ^/files/(.+)  {
                    mogilefs_pass $1 {
                            proxy_pass $mogilefs_path;
                            proxy_hide_header Content-Type;
                    }
            }
            include    extra/mime.types;
    }

    借用 if 先把 key 放到一变量里,然后就可以传递给后端了。

    在 mogilefs_pass 里也可以配置缓存。

    写操作配好后,也可以直接用 webdav 方式操作,不用手动向 tracker 请求存储节点,存进去,再通知同步了。


    经实验,这个模块表现并不稳定,建议目前不要在生产环境使用。

日历

关于神仙

神仙

世人都晓神仙好~~