手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜Qcloud , 注册 | 登陆
浏览模式: 标准 | 列表2014年05月的文章

如何在微信里关闭窗口

众所周知,微信里的网页就是一个webview。但是它是在程序里面,所以原生的window.close()是无效的。那么我们该怎么办?其实很简单就一句代码:

XML/HTML代码
  1. WeixinJSBridge.call('closeWindow');  

你可以在你的链接或者button上加一句就OK了:

XML/HTML代码
  1. <a href="###" onclick="WeixinJSBridge.call('closeWindow');">CLOSE </a>  
  2.   
  3. 或者  
  4.   
  5. <a href="javascript:WeixinJSBridge.call('closeWindow');">CLOSE</a>  

试试看。窗口是不是关掉了?

Tags: 微信

ssdb的Yii cache扩展

google的leveldb越来越被很多人接受。国内的ideawu基于leveldb还写了一个ssdb的前置扩展用来实现了很多功能,比如标准的getset和hget,hset还有zset,zget,也实现了队列。当然pub/sub就没有办法实现了。毕竟它和redis还是有点区别。

基于标准的ssdb的类,写了个小扩展,扩展了Yii的Cache类:

PHP代码
  1. class CSsdbCache extends CCache  
  2. {  
  3.     /** 
  4.      * @var string hostname to use for connecting to the redis server. Defaults to '127.0.0.1'. 
  5.      */  
  6.     public $hostname = '127.0.0.1';  
  7.     /** 
  8.      * @var int the port to use for connecting to the ssdb server. Default port is 8888. 
  9.      */  
  10.     public $port = 8888;  
  11.     /** 
  12.      * @var float 
  13.      */  
  14.     public $timeout = 2000;  
  15.     public $serializer = false;  
  16.     public $_cache;  
  17.     protected $_cachekeys = 'ssdb_cachekey';  
  18.       
  19.     public function init() {  
  20.         parent::init();  
  21.     }  
  22.     /** 
  23.      * @return SSDB 
  24.      */  
  25.     public function getSsdbCache() {  
  26.         if ($this->_cache !== null)  
  27.             return $this->_cache;  
  28.         else {  
  29.             return $this->_cache = new SimpleSSDB($this->hostname, $this->port, $this->timeout);  
  30.         }  
  31.     }  
  32.     public function getkeys() {  
  33.         return $this->getSsdbCache()->hkeys($this->_cachekeys, """"$this->getSsdbCache()->hsize($this->_cachekeys));  
  34.     }  
  35.     /** 
  36.      * Retrieves a value from cache with a specified key. 
  37.      * This is the implementation of the method declared in the parent class. 
  38.      * @param string $key a unique key identifying the cached value 
  39.      * @return string|boolean the value stored in cache, false if the value is not in the cache or expired. 
  40.      */  
  41.     protected function getValue($key) {  
  42.         return unserialize($this->getSsdbCache()->get($key));  
  43.     }  
  44.   
  45.     /** 
  46.      * Stores a value identified by a key in cache. 
  47.      * This is the implementation of the method declared in the parent class. 
  48.      * @param string  $key    the key identifying the value to be cached 
  49.      * @param string  $value  the value to be cached 
  50.      * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire. 
  51.      * @return boolean true if the value is successfully stored into cache, false otherwise 
  52.      */  
  53.     protected function setValue($key$value$expire) {  
  54.         $this->getSsdbCache()->hset($this->_cachekeys, $key, 1);  
  55.         if ($expire > 0) {  
  56.             //$expire += time();  
  57.             return $this->getSsdbCache()->setx($key, serialize($value), (int) $expire);  
  58.         }  
  59.         else {  
  60.             return $this->getSsdbCache()->set($key, serialize($value));  
  61.         }  
  62.     }  
  63.     /** 
  64.      * Stores a value identified by a key into cache if the cache does not contain this key. 
  65.      * This is the implementation of the method declared in the parent class. 
  66.      * @param string  $key    the key identifying the value to be cached 
  67.      * @param string  $value  the value to be cached 
  68.      * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire. 
  69.      * @return boolean true if the value is successfully stored into cache, false otherwise 
  70.      */  
  71.     protected function addValue($key$value$expire) {  
  72.         return $this->setValue($key$value$expire);  
  73.     }  
  74.     /** 
  75.      * Deletes a value with the specified key from cache 
  76.      * This is the implementation of the method declared in the parent class. 
  77.      * @param string $key the key of the value to be deleted 
  78.      * @return boolean if no error happens during deletion 
  79.      */  
  80.     protected function deleteValue($key) {  
  81.         $this->getSsdbCache()->hdel($this->_cachekeys, $key);  
  82.         return $this->getSsdbCache()->del($key);  
  83.     }  
  84.     /** 
  85.      * @return boolean whether the flush operation was successful. 
  86.      */  
  87.     protected function flushValues() {  
  88.         $this->getSsdbCache()->multi_del($this->getkeys());  
  89.         return $this->getSsdbCache()->hclear($this->_cachekeys);  
  90.     }  
  91. }  

其实代码很简单,不过由于ssdb默认没有serialize功能,所以在存储之前,得先主动的serialize,然后get的时候unserialize。不然就没有办法存储数组了。

由于ssdb没有flush功能。所以利用hget/hset将所有的key存储下来。flush的时候把hget获取的key读出来删除。然后再清掉这个hget的key

最后还有expire。ssdb里的setx第三个参数。。。居然不是expire,而是ttl。开始的时候,一直都当成expire。结果浪费了很长时间

Tags: yii

如何在终端输出带颜色的字体?

终端显示颜色,在以前的想法当中,都是因为有了.profile的配色方案。而我一般也都是 采用默认的(snakevil是写过一个bash带颜色的方案的。我觉得太花哨了就没有使用)

为什么突然间又想到这个?是因为在使用PHP输出LOG的时候,千篇一率,从屏幕中找关键字很累,所以就想着,是不是用PHP也可以输出这种带颜色的关键字?当然,这是因为我正好看到了一个PHP是这么输出的,它就是laraval,它的工具(laraval.phar)在命令行的输出就是有不同颜色的,它给了我指引,意思就是,这个想法是可以实现的。

OK。找资料,知道在终端中用指定的字符来做为背景色和字体色(http://blog.csdn.net/acmee/article/details/6613060)

文中这样介绍:

XML/HTML代码
  1. 一、shell下的实现方法  
  2.   
  3.        先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子:  
  4.   
  5.        echo  -e  "\033[32mHello, world!"  
  6.   
  7.        当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说。echo命令-e选项的作用是激活终端对反斜线转义符(即\)的解释。引号内\033用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后边的[32m就是将前景色设置为绿色,字母m表示设置的属性类别,数字代表属性值。设置可以单独使用,例如:  
  8.   
  9.        echo -e  "\033[0m"  
  10.   
  11.        这行命令的作用是恢复属性为默认值,也就是说0m设置项用于恢复默认值。现在你的终端是不是又一切正常了?  
  12.   
  13.        理解了这些,剩下的就简单了。用这种命令,除了设置文本前景色,还可以设置很多属性。下边列出其他的设置项:  
  14.   
  15.       --------------------------------------------------------------------------  
  16.   
  17.       \033[0m 关闭所有属性  
  18.       \033[1m 设置高亮度  
  19.       \033[4m 下划线  
  20.       \033[5m 闪烁  
  21.       \033[7m 反显  
  22.       \033[8m 消隐  
  23.       \033[30m 至 \33[37m 设置前景色  
  24.       \033[40m 至 \33[47m 设置背景色  
  25.       \033[nA 光标上移n行   
  26.       \033[nB 光标下移n行  
  27.       \033[nC 光标右移n行  
  28.       \033[nD 光标左移n行  
  29.       \033[y;xH设置光标位置  
  30.       \033[2J 清屏  
  31.       \033[K 清除从光标到行尾的内容  
  32.       \033[s 保存光标位置   
  33.       \033[u 恢复光标位置  
  34.       \033[?25l 隐藏光标  
  35.       \033[?25h 显示光标  
  36.   
  37.       --------------------------------------------------------------------------  
  38.   
  39.       各数字所代表的颜色如下:  
  40.   
  41.       字背景颜色范围:40----49  
  42.       40:黑  
  43.       41:深红  
  44.       42:绿  
  45.       43:黄色  
  46.       44:蓝色  
  47.       45:紫色  
  48.       46:深绿  
  49.       47:白色  
  50.   
  51.       字颜色:30-----------39  
  52.       30:黑  
  53.       31:红  
  54.       32:绿  
  55.       33:黄  
  56.       34:蓝色  
  57.       35:紫色  
  58.       36:深绿   
  59.       37:白色  
  60.   
  61.       另外,同类的多种设置项可以组合在一起,中间用分号(;)隔开。如下:  
  62.   
  63.       echo -e "\033[20;1H\033[1;4;32mHello,world\033[0m"  
  64.   
  65.       这行命令首先\033[20;1H将光标移动到终端第20行第1列,之后的\033[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后\033[0m将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。  
  66.   
  67.       通过以上各种命令的组合就可以实现对终端输出地复杂控制。  
  68.   
  69. 二、如何在C编程中实现?  
  70.   
  71.       理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例:  
  72.   
  73.       int color = 32;  
  74.   
  75.       printf("\033[20;1H\033[1;4;%dmHello, world.\033[0m", color);  
  76.   
  77.       这个例子类似上边shell中最后那个例子,只是这里颜色值通过变量color来指定(当然,也可以直接指定)。  
  78.   
  79. 三、联想  
  80.   
  81.       看到这里你可能会想,是不是在其他编程语言里也可以用类似的方法实现对终端输出的控制呢?答案是肯定的!比如在python中,可以如下输出:  
  82.   
  83.       color=32  
  84.   
  85.       print “\033[20;1H\033[1;4;%dHello, world.\033[0m"%color  
  86.   
  87.       这个例子的效果跟上边C的例子是相同的。  

其实在看到这一段之前,snakevil在自己的github的项目(https://github.com/snakevil/bashrc.x)中也介绍过,其实我相对还是喜欢ubuntu的默认配色,snakevil的这个配色我是真心不是特别喜欢。。

但究竟怎么用PHP输出呢?在用PHP输出之前,找了一下网络,发现已经有有用perl实现过了。那么说实在的。如果没有使用到一些特别的函数,其实php和perl实在是太象了,所以,可以直接参考(http://perldoc.perl.org/Term/ANSIColor.html),这里的代码,除了那个类外,都还是可以复刻的。于是,再随便找了点,果然还是有现成的PHP代码的(http://www.if-not-true-then-false.com/2010/php-class-for-coloring-php-command-line-cli-scripts-output-php-output-colorizing-using-bash-shell-colors/)

好吧。这个URL太长了。还是直接贴代码吧:

PHP代码
  1. <?php  
  2.    
  3.     class Colors {  
  4.         private $foreground_colors = array();  
  5.         private $background_colors = array();  
  6.    
  7.         public function __construct() {  
  8.             // Set up shell colors  
  9.             $this->foreground_colors['black'] = '0;30';  
  10.             $this->foreground_colors['dark_gray'] = '1;30';  
  11.             $this->foreground_colors['blue'] = '0;34';  
  12.             $this->foreground_colors['light_blue'] = '1;34';  
  13.             $this->foreground_colors['green'] = '0;32';  
  14.             $this->foreground_colors['light_green'] = '1;32';  
  15.             $this->foreground_colors['cyan'] = '0;36';  
  16.             $this->foreground_colors['light_cyan'] = '1;36';  
  17.             $this->foreground_colors['red'] = '0;31';  
  18.             $this->foreground_colors['light_red'] = '1;31';  
  19.             $this->foreground_colors['purple'] = '0;35';  
  20.             $this->foreground_colors['light_purple'] = '1;35';  
  21.             $this->foreground_colors['brown'] = '0;33';  
  22.             $this->foreground_colors['yellow'] = '1;33';  
  23.             $this->foreground_colors['light_gray'] = '0;37';  
  24.             $this->foreground_colors['white'] = '1;37';  
  25.    
  26.             $this->background_colors['black'] = '40';  
  27.             $this->background_colors['red'] = '41';  
  28.             $this->background_colors['green'] = '42';  
  29.             $this->background_colors['yellow'] = '43';  
  30.             $this->background_colors['blue'] = '44';  
  31.             $this->background_colors['magenta'] = '45';  
  32.             $this->background_colors['cyan'] = '46';  
  33.             $this->background_colors['light_gray'] = '47';  
  34.         }  
  35.    
  36.         // Returns colored string  
  37.         public function getColoredString($string$foreground_color = null, $background_color = null) {  
  38.             $colored_string = "";  
  39.    
  40.             // Check if given foreground color found  
  41.             if (isset($this->foreground_colors[$foreground_color])) {  
  42.                 $colored_string .= "\033[" . $this->foreground_colors[$foreground_color] . "m";  
  43.             }  
  44.             // Check if given background color found  
  45.             if (isset($this->background_colors[$background_color])) {  
  46.                 $colored_string .= "\033[" . $this->background_colors[$background_color] . "m";  
  47.             }  
  48.    
  49.             // Add string and end coloring  
  50.             $colored_string .=  $string . "\033[0m";  
  51.    
  52.             return $colored_string;  
  53.         }  
  54.    
  55.         // Returns all foreground color names  
  56.         public function getForegroundColors() {  
  57.             return array_keys($this->foreground_colors);  
  58.         }  
  59.    
  60.         // Returns all background color names  
  61.         public function getBackgroundColors() {  
  62.             return array_keys($this->background_colors);  
  63.         }  
  64.     }  
  65.    

用法也比较简单:

PHP代码
  1. <?php  
  2.    
  3.     // Create new Colors class  
  4.     $colors = new Colors();  
  5.    
  6.     // Test some basic printing with Colors class  
  7.     echo $colors->getColoredString("Testing Colors class, this is purple string on yellow background.""purple""yellow") . "\n";  
  8.     echo $colors->getColoredString("Testing Colors class, this is blue string on light gray background.""blue""light_gray") . "\n";  
  9.     echo $colors->getColoredString("Testing Colors class, this is red string on black background.""red""black") . "\n";  
  10.     echo $colors->getColoredString("Testing Colors class, this is cyan string on green background.""cyan""green") . "\n";  
  11.     echo $colors->getColoredString("Testing Colors class, this is cyan string on default background.""cyan") . "\n";  
  12.     echo $colors->getColoredString("Testing Colors class, this is default string on cyan background.", null, "cyan") . "\n";  
  13.    

当然,如果你觉得这个代码太麻烦,还有一个简单的方法:

PHP代码
  1. function colorize($text$status) {  
  2.  $out = "";  
  3.  switch($status) {  
  4.   case "SUCCESS":  
  5.    $out = "[42m"//Green background  
  6.    break;  
  7.   case "FAILURE":  
  8.    $out = "[41m"//Red background  
  9.    break;  
  10.   case "WARNING":  
  11.    $out = "[43m"//Yellow background  
  12.    break;  
  13.   case "NOTE":  
  14.    $out = "[44m"//Blue background  
  15.    break;  
  16.   default:  
  17.    throw new Exception("Invalid status: " . $status);  
  18.  }  
  19.  return chr(27) . "$out" . "$text" . chr(27) . "[0m";  
  20. }  
  21.   
  22. echo colorize("Your command was successfully executed...""SUCCESS");  

四种颜色也够了。不过。。。NOTE的blue background。。。如果你的字符还是黑色的,真心看不到字符串了。

至此,介绍完毕,你可以试试(我已经用在项目中了)

 

 

NSQ

突然发现好象很久没有写过东西了。自从到了现在的公司,好象很多精力都放在了整理需求和写功能需求上面,代码啥的确实写的少了。

之所以提到nsq是因为我在写东西的时候发现点事情。其实好象可能用nsq处理会更好。
去年在想nsq的时候是写类似聊天室的玩意。当时就在想。nsq的一个topic是不是就相当于一个聊天室?在里面pub和sub,不就是一个正常的聊天过程吗?但最终还是没有用nsq。却自己实现了一个烂玩意
 
这两天我想到它,是因为nsq很多人还是当成一个队列来处理,那么基于go的队列?
如果我在抓取数据的时候,由主服务器向某一个topic发送要抓取的信息,其他订阅这个topic的程序就可以收到这个信息。然后开始解析并处理。这样是不是可以解决类似于中心服务器和其他采集服务器的事情呢?
 
然后找了下,phpnsq和pynsq都已经有人实现了。看起来好象是时候可以用它来尝试了?(http://bitly.github.io/nsq/clients/client_libraries.html)
最后提一句:phpnsq用的是reactPHP。
 
好了,半夜不写东西了。我继续 摸一下,好象nsqadmin有点意思。。