易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
如何在微信里关闭窗口

如何在微信里关闭窗口

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

WeixinJSBridge.call('closeWindow');

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

<a href="###" onclick="WeixinJSBridge.call('closeWindow');">CLOSE </a>

或者

<a href="javascript:WeixinJSBridge.call('closeWindow');">CLOSE</a>

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

ssdb的Yii cache扩展

ssdb的Yii cache扩展

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

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

class CSsdbCache extends CCache
{
/**
* @var string hostname to use for connecting to the redis server. Defaults to '127.0.0.1'.
*/
public $hostname = '127.0.0.1';
/**
* @var int the port to use for connecting to the ssdb server. Default port is 8888.
*/
public $port = 8888;
/**
* @var float
*/
public $timeout = 2000;
public $serializer = false;
public $_cache;
protected $_cachekeys = 'ssdb_cachekey';

public function init() {
parent::init();
}
/**
* @return SSDB
*/
public function getSsdbCache() {
if ($this->_cache !== null)
return $this->_cache;
else {
return $this->_cache = new SimpleSSDB($this->hostname, $this->port, $this->timeout);
}
}
public function getkeys() {
return $this->getSsdbCache()->hkeys($this->_cachekeys, "", "", $this->getSsdbCache()->hsize($this->_cachekeys));
}
/**
* Retrieves a value from cache with a specified key.
* This is the implementation of the method declared in the parent class.
* @param string $key a unique key identifying the cached value
* @return string|boolean the value stored in cache, false if the value is not in the cache or expired.
*/
protected function getValue($key) {
return unserialize($this->getSsdbCache()->get($key));
}

/**
* Stores a value identified by a key in cache.
* This is the implementation of the method declared in the parent class.
* @param string $key the key identifying the value to be cached
* @param string $value the value to be cached
* @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire.
* @return boolean true if the value is successfully stored into cache, false otherwise
*/
protected function setValue($key, $value, $expire) {
$this->getSsdbCache()->hset($this->_cachekeys, $key, 1);
if ($expire > 0) {
//$expire += time();
return $this->getSsdbCache()->setx($key, serialize($value), (int) $expire);
}
else {
return $this->getSsdbCache()->set($key, serialize($value));
}
}
/**
* Stores a value identified by a key into cache if the cache does not contain this key.
* This is the implementation of the method declared in the parent class.
* @param string $key the key identifying the value to be cached
* @param string $value the value to be cached
* @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire.
* @return boolean true if the value is successfully stored into cache, false otherwise
*/
protected function addValue($key, $value, $expire) {
return $this->setValue($key, $value, $expire);
}
/**
* Deletes a value with the specified key from cache
* This is the implementation of the method declared in the parent class.
* @param string $key the key of the value to be deleted
* @return boolean if no error happens during deletion
*/
protected function deleteValue($key) {
$this->getSsdbCache()->hdel($this->_cachekeys, $key);
return $this->getSsdbCache()->del($key);
}
/**
* @return boolean whether the flush operation was successful.
*/
protected function flushValues() {
$this->getSsdbCache()->multi_del($this->getkeys());
return $this->getSsdbCache()->hclear($this->_cachekeys);
}
}

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

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

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

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

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

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

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

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

文中这样介绍:

一、shell下的实现方法

先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子:

echo -e "\033[32mHello, world!"

当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说。echo命令-e选项的作用是激活终端对反斜线转义符(即\)的解释。引号内\033用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后边的[32m就是将前景色设置为绿色,字母m表示设置的属性类别,数字代表属性值。设置可以单独使用,例如:

echo -e "\033[0m"

这行命令的作用是恢复属性为默认值,也就是说0m设置项用于恢复默认值。现在你的终端是不是又一切正常了?

理解了这些,剩下的就简单了。用这种命令,除了设置文本前景色,还可以设置很多属性。下边列出其他的设置项:

--------------------------------------------------------------------------

\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m 至 \33[37m 设置前景色
\033[40m 至 \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

--------------------------------------------------------------------------

各数字所代表的颜色如下:

字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色

字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

另外,同类的多种设置项可以组合在一起,中间用分号(;)隔开。如下:

echo -e "\033[20;1H\033[1;4;32mHello,world\033[0m"

这行命令首先\033[20;1H将光标移动到终端第20行第1列,之后的\033[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后\033[0m将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。

通过以上各种命令的组合就可以实现对终端输出地复杂控制。

二、如何在C编程中实现?

理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例:

int color = 32;

printf("\033[20;1H\033[1;4;%dmHello, world.\033[0m", color);

这个例子类似上边shell中最后那个例子,只是这里颜色值通过变量color来指定(当然,也可以直接指定)。

三、联想

看到这里你可能会想,是不是在其他编程语言里也可以用类似的方法实现对终端输出的控制呢?答案是肯定的!比如在python中,可以如下输出:

color=32

print “\033[20;1H\033[1;4;%dHello, world.\033[0m"%color

这个例子的效果跟上边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

class Colors {
private $foreground_colors = array();
private $background_colors = array();

public function __construct() {
// Set up shell colors
$this->foreground_colors['black'] = '0;30';
$this->foreground_colors['dark_gray'] = '1;30';
$this->foreground_colors['blue'] = '0;34';
$this->foreground_colors['light_blue'] = '1;34';
$this->foreground_colors['green'] = '0;32';
$this->foreground_colors['light_green'] = '1;32';
$this->foreground_colors['cyan'] = '0;36';
$this->foreground_colors['light_cyan'] = '1;36';
$this->foreground_colors['red'] = '0;31';
$this->foreground_colors['light_red'] = '1;31';
$this->foreground_colors['purple'] = '0;35';
$this->foreground_colors['light_purple'] = '1;35';
$this->foreground_colors['brown'] = '0;33';
$this->foreground_colors['yellow'] = '1;33';
$this->foreground_colors['light_gray'] = '0;37';
$this->foreground_colors['white'] = '1;37';

$this->background_colors['black'] = '40';
$this->background_colors['red'] = '41';
$this->background_colors['green'] = '42';
$this->background_colors['yellow'] = '43';
$this->background_colors['blue'] = '44';
$this->background_colors['magenta'] = '45';
$this->background_colors['cyan'] = '46';
$this->background_colors['light_gray'] = '47';
}

// Returns colored string
public function getColoredString($string, $foreground_color = null, $background_color = null) {
$colored_string = "";

// Check if given foreground color found
if (isset($this->foreground_colors[$foreground_color])) {
$colored_string .= "\033[" . $this->foreground_colors[$foreground_color] . "m";
}
// Check if given background color found
if (isset($this->background_colors[$background_color])) {
$colored_string .= "\033[" . $this->background_colors[$background_color] . "m";
}

// Add string and end coloring
$colored_string .= $string . "\033[0m";

return $colored_string;
}

// Returns all foreground color names
public function getForegroundColors() {
return array_keys($this->foreground_colors);
}

// Returns all background color names
public function getBackgroundColors() {
return array_keys($this->background_colors);
}
}

用法也比较简单:

<?php

// Create new Colors class
$colors = new Colors();

// Test some basic printing with Colors class
echo $colors->getColoredString("Testing Colors class, this is purple string on yellow background.", "purple", "yellow") . "\n";
echo $colors->getColoredString("Testing Colors class, this is blue string on light gray background.", "blue", "light_gray") . "\n";
echo $colors->getColoredString("Testing Colors class, this is red string on black background.", "red", "black") . "\n";
echo $colors->getColoredString("Testing Colors class, this is cyan string on green background.", "cyan", "green") . "\n";
echo $colors->getColoredString("Testing Colors class, this is cyan string on default background.", "cyan") . "\n";
echo $colors->getColoredString("Testing Colors class, this is default string on cyan background.", null, "cyan") . "\n";

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

function colorize($text, $status) {
$out = "";
switch($status) {
case "SUCCESS":
$out = "[42m"; //Green background
break;
case "FAILURE":
$out = "[41m"; //Red background
break;
case "WARNING":
$out = "[43m"; //Yellow background
break;
case "NOTE":
$out = "[44m"; //Blue background
break;
default:
throw new Exception("Invalid status: " . $status);
}
return chr(27) . "$out" . "$text" . chr(27) . "[0m";
}

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有点意思。。
收到了又拍云的马克杯

收到了又拍云的马克杯

只上图不说话。。。

话说,最近又拍云在搞开发者活动,有兴趣的朋友可以尝试一下了:https://www.upyun.com/op/dev/,有没有感觉mbp在向你招手?

转一个别人写的所谓加解密函数

转一个别人写的所谓加解密函数

这段代码不是挺复杂,其实如果你细看是可以看得到discuz中的authcode的影子的。如果你有兴趣,你可以看看:

/*加密函数内部调用函数*/
function keyED($txt,$encrypt_key) {
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++) {
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}

/*发送邮件中连接地址的加密函数*/
function inner_DYEncrypt( $encryptstr ){
return urlencode(inner_DYEncrypt_subfun($encryptstr));
}

function inner_DYEncrypt_subfun($encryptstr){
srand((double)microtime()*1000000);
$encrypt_key = md5(rand(0,32000));
$ctr=0; $tmpstr = "";
for ($i=0;$i<strlen($encryptstr);$i++){
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmpstr.= substr($encrypt_key,$ctr,1) .
(substr($encryptstr,$i,1) ^ substr($encrypt_key,$ctr,1));
$ctr++;
}
$returninfo = base64_encode(keyED($tmpstr,ENCRYPTKEY));
if (strrpos($returninfo,"/") or strrpos($returninfo,'') or strrpos($returninfo,'+'))
return inner_DYEncrypt_subfun( $encryptstr );
return $returninfo;

}

/*发送邮件中连接地址的解密函数*/
function inner_DYDecrypt( $decryptstr ){
$decryptstr = urldecode($decryptstr);
$decryptstr = keyED(base64_decode($decryptstr),ENCRYPTKEY);
$tmpstr = "";
for ($i=0;$i<strlen($decryptstr);$i++){
$md5 = substr($decryptstr,$i,1);
$i++;
$tmpstr.= (substr($decryptstr,$i,1) ^ $md5);
}
return $tmpstr;
}

/*演示*/
$key = "rdid=5135"; //待加密的字符串
echo "待加密的字符串:".$key."";
$key = inner_DYEncrypt($key);
echo "加密后的字符串:".$key."";
echo "解密后的字符串:".inner_DYDecrypt($key);

?>

发完这个贴子的时候突然发现。我好久没有写博客了。倒不是不坚持,而是发现我实在没有什么东西好写了。一直吃老本,还能写什么?

http post : Content-Type

http post : Content-Type

今天在使用http post(curl)获取一个数据的时候发现了问题,死活拿不到数据。获取永远为空。

场景是这样的:我向微信发起一个请求,QQ请求我的服务器,由我请求接口服务器。返回结果
但问题是,如果由微信直接请求接口服务器。一切正常。反而因为我做了一次中间层后。取不到数据了。
一点一点排查:
1、接口服务器的TransferMode是chunked。OK。我CURL换成1.0请求,结果还是空
2、换file_get_contents。。。一样是空。
3、排查微信请求的头。在我的服务器上把$_SERVER变量打印出来。结果。。意外的发现:Content-Type: text/xml,居然是这个?那我换成这个请求接口服务器试一下呢?居然真的成功了
遇到问题,果然是要一个个的排查啊。对方是java的服务器。可能会httprawbody做了一个强验证。所以。。。不象我们PHP可以拿到数据。先simplexml_load_string,不行?再json_decode,还不行?再用其他处理。。。
onenote for mac 终于有下载了

onenote for mac 终于有下载了

一句话小新闻,如题。。目前在apple store 已经有的下载了。

当年为了for windows版本的。还特地买了正版office。现在却一切都免费了。
下载了试用发现:
1、登录需要hotmail(或者其他live)的帐号
2、响应还是有点点慢,没有win下的快速
3、one drive实在是慢。。。
可选项也没有windows下面那么多,如果真要用,我觉得还是用快盘或者云盘之类的。把笔记本进行同步反而更好。
不过。不管怎么样,总归是有下载了。这是一件好事,不是吗?
evernote之类的要紧张了
转:微软本月或发免费Mac版OneNote

转:微软本月或发免费Mac版OneNote

这个新闻是不是晚来了几年啊。等了这么多年了。用了那么多年的win,始终觉得onenote无法超过。早些年的cyberarticle(wiz的前身)和evernote(升到5后用不习惯了),再怎么用也没有onenote的感觉。。。

看到搜狐的新闻:http://it.sohu.com/20140313/n396534159.shtml,终于感慨一下,快了。

原文不长,都是牢骚:

 3月13日,据The Verge网站报道,微软计划在本月晚些时候发布免费Mac版 OneNote,此举被视为是微软对目前风头正盛的云笔记应用Evernote的一次正面回应。

  事实上,早在10年前,微软就已经推出了OneNote,这项服务跟微软Office组件绑定,主要在Window系统中使用。现在,微软想要将这项服务免费开发给所有用户,其中包括Mac用户。

  2011年初,微软就已推出官方iOS版OneNote应用,此外安卓版也已经推出。但是,到目前为止,这项服务都未曾出现在苹果OS X平台上。

  The Verge网站报道称,Mac用户将可以免费下载OneNote应用,并且Windows版本也将不会向用户收取额外费用。对于微软来说,这是对管理OneNote服务方式作出的一次比较大的转变。免费开放OneNote,推出跨平台服务也是将矛头对准Evernote。除此之外,微软还将在该服务中增加新的功能,比如“网页保存”(web clipper )功能,它允许用户直接将部分网页内容保存至OneNote中。

  另外,据该网站报道,微软还将创建“浏览器扩展”,允许用户直接从Chrome、IE 以及 Firefox 等网页浏览器上保存内容,这项功能跟Evernote的“网页保存”功能极为相似。此外,微软还允允许OneNote用户发送One Note笔记邮件。

  微软预期将在今年晚些时候发布Mac版Office应用,而Mac版OneNote的发布被看成是“前奏”。据悉,微软也计划在未来数周之内发布iPad版本 Office。(kirk)

[转]老王:如何安全的include文件

[转]老王:如何安全的include文件

大多数人会将一个单独的php文件当成配置文件,早些年的配置文件大多类似这样:

<?php
$config['a']=1;
$config['b']=2;

这样include后。可以使用$config变量了,但慢慢的,却越来越发现这样不太好,于是就有了这种

<?php
return array(
'a'=>1,'b'=>2
);

这时候只要写$config = include('config.php'),就相当于和上面一样了。然后老王讲的就是指第二种情况。

原文在:http://huoding.com/2014/02/25/329

他举的例子是:

<?php

$debug = false;
// ...
$config = include 'config.php';
// ...
if ($debug) {
phpinfo();
}

如果config.php里万一写了$debug=true;那么就会造成phpinfo()被输出了,与实际预料就有了偏差了。那么怎么安全的include呢?

老王说:

$config = call_user_func(function() {
return include 'config.php';
});

这样就利用局部变量把里面的一些可能污染外部的变量控制在匿名函数的作用域里。

然后我自己也测试了一下,确实。即使用$GLOBALS,也没有影响,而单独的php文件,如果你不是function ,也不能直接global $debug;这样是语法错误的。

所以。。。。如果为了安全,你还是和老王学一下吧。。。