魏长东

weichangdong

本站的几个特色功能

平时逛别的一些大牛的技术博客,看到比较好的效果,就“拿来主义”,用到这个小小站里面了。有这么几个特色。

1. 浏览文章时,用鼠标选中文字的时候,可以分享到【腾讯和新浪微博】。

2.上传图片,加了【图片水印】。

3. 实现了文章可以【加精华】。

4. 加了支付宝的【捐赠】功能。

5. 加了文章【置顶】功能。

【特别说明】以上实现的功能都是基于新浪SAE的环境。因为SAE 不再赠送免费的云豆给【中级云开发者】了,所以就吧网站被迫签到redhat的openshift。 本站的原本地址是wcd-wcd1986.rhcloud.com  所以一些功能给切掉了。比如图片之前传到SAE的仓库,现在通过sdk传到了【七牛】。

【再次说明】因为本站通过了备案,所以再一次迁移到了【阿里云的云虚拟主机】上。图片还是存在【七牛】上,用了cdn加速。

欲知效果如何,且看图片展示。

»»阅读全文

Tags: 封狼居胥

我的mac 开发机

突然发现我的mac装了好多技术相关的,ide就不列举了。

老本行php:php7,php的yaf框架,composer

数据库:mysql,mongodb,postgresql,redis,elastic search,以及es的插件es head

lua相关:openresty,lua5.14,luarocks,operesty相关的lor框架,operesty相关的lapis框架,基于lor的orange。vanilla香草框架(被我卸载了,感觉不咋喜欢)

版本控制:svn(mac自带的),git

其他对于我比较边缘的:nodejs,npm,go,grunt,ab(自带),wrk,casperjs,phomtonjs,jq,java。

其中好多不是我本意想安装的,比如grunt,casperjs,postgresql,是我在折腾别的东东的时候,需要他就安装了。其实上面好多我都在windows装过了,也折腾过了。

最近没事想折腾go,但是发现go有些恶心的地方,以至于我不想搞了(实在闲的蛋疼的时候,就看看),但是不依赖环境这一点我却非常喜欢。还有就是觉得他适合做一些Linux命令。

还是把主力放到lua上吧,以后lua前段api,php后台,完美胜任各种工作。

Nginx 的 Echo 模块 —— echo-nginx-module

 location /hello {
    echo "hello, world!";
  }

  location /hello {
    echo -n "hello, "
    echo "world!";
  }

  location /timed_hello {
    echo_reset_timer;
    echo hello world;
    echo "'hello world' takes about $echo_timer_elapsed sec.";
    echo hiya igor;
    echo "'hiya igor' takes about $echo_timer_elapsed sec.";
  }

  location /echo_with_sleep {
    echo hello;
    echo_flush;  # ensure the client can see previous output immediately
    echo_sleep   2.5;  # in sec
    echo world;
  }

  # in the following example, accessing /echo yields
  #   hello
  #   world
  #   blah
  #   hiya
  #   igor
  location /echo {
      echo_before_body hello;
      echo_before_body world;
      proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;
      echo_after_body hiya;
      echo_after_body igor;
  }
  location /echo/more {
      echo blah;
  }

  # the output of /main might be
  #   hello
  #   world
  #   took 0.000 sec for total.
  # and the whole request would take about 2 sec to complete.
  location /main {
      echo_reset_timer;
 
      # subrequests in parallel
      echo_location_async /sub1;
      echo_location_async /sub2;
 
      echo "took $echo_timer_elapsed sec for total.";
  }
  location /sub1 {
      echo_sleep 2;
      echo hello;
  }
  location /sub2 {
      echo_sleep 1;
      echo world;
  }

  # the output of /main might be
  #   hello
  #   world
  #   took 3.003 sec for total.
  # and the whole request would take about 3 sec to complete.
  location /main {
      echo_reset_timer;
 
      # subrequests in series (chained by CPS)
      echo_location /sub1;
      echo_location /sub2;
 
      echo "took $echo_timer_elapsed sec for total.";
  }
  location /sub1 {
      echo_sleep 2;
      echo hello;
  }
  location /sub2 {
      echo_sleep 1;
      echo world;
  }

  # Accessing /dup gives
  #   ------ END ------
  location /dup {
    echo_duplicate 3 "--";
    echo_duplicate 1 " END ";
    echo_duplicate 3 "--";
    echo;
  }

  # /bighello will generate 1000,000,000 hello's.
  location /bighello {
    echo_duplicate 1000_000_000 'hello';
  }

  # echo back the client request
  location /echoback {
    echo_duplicate 1 $echo_client_request_headers;
    echo "\r";
 
    echo_read_request_body;
 
    echo_request_body;
  }

  # GET /multi will yields
  #   querystring: foo=Foo
  #   method: POST
  #   body: hi
  #   content length: 2
  #   ///
  #   querystring: bar=Bar
  #   method: PUT
  #   body: hello
  #   content length: 5
  #   ///
  location /multi {
      echo_subrequest_async POST '/sub' -q 'foo=Foo' -b 'hi';
      echo_subrequest_async PUT '/sub' -q 'bar=Bar' -b 'hello';
  }
  location /sub {
      echo "querystring: $query_string";
      echo "method: $echo_request_method";
      echo "body: $echo_request_body";
      echo "content length: $http_content_length";
      echo '///';
  }

  # GET /merge?/foo.js&/bar/blah.js&/yui/baz.js will merge the .js resources together
  location /merge {
      default_type 'text/javascript';
      echo_foreach_split '&' $query_string;
          echo "/* JS File $echo_it */";
          echo_location_async $echo_it;
          echo;
      echo_end;
  }

  # accessing /if?val=abc yields the "hit" output
  # while /if?val=bcd yields "miss":
  location ^~ /if {
      set $res miss;
      if ($arg_val ~* '^a') {
          set $res hit;
          echo $res;
      }
      echo $res;
  }

好的测试工具wrk

比ab好,我感觉,在并发数量上,wrk更加优胜。可以用lua脚本加强一些功能。

lua和php运行速度

在网上看到一篇文章,同样的功能用集中语言实现,然后执行比较速度。其中有我喜欢的php和正在学习的lua,就把代码搞到自己的机器上运行了,lua比php慢,但是luajit却快了十倍,让我开始喜欢luajit了。我喜欢一个语言,很简单,只需要一个简单的理由。

这是执行时间

php time:17811.112880707ms php5.6

lua time:31530ms lua5.14

luajit time:2790ms

检测你的nginx是否使用了jit

ldd /usr/local/openresty/nginx/sbin/nginx

下面上代码

»»阅读全文

lua的协程学习

有些知识当时看懂了,但是过一阵子发现看半天又看不懂了,真是不知所谓。

可能是学习没有复习的原因吧。

Lua所支持的协程全称被称作协同式多线程,协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。

我的理解。就是暂停程序,等下一次调用,然后从上次停下的地方继续执行。

»»阅读全文

2016年回家图

写了

从北京住的地方到北京西站,坐高铁到西安北站,然后坐地铁去西安南站附近,然后打车去西安南站,做高速到柞水,然后我哥哥接我,在我哥哥加住宿。然后我哥开车从柞水回老家,过完年我哥开车送我们去镇安,在镇安住一晚,然后坐软卧去襄阳,然后他哥哥在襄阳东站接我们,我们又在他哥哥家住宿一晚。在襄阳呆了几天我一个人从yy家出发,去襄阳火车站,然后无座13个小时到北京

的大概过程,结果一不小心全没了,擦擦擦擦擦擦。

懒得在写了,直接上图了吧。

»»阅读全文

qconf 批量添加配置

<?php
//之前是代码写死配置的,要让用qconf,但是一个一个的添加太麻烦,就写这个小工具。把之前代码要用的fb数据抓取信息都添加到qconf里面。

$qzk = new QConfZK("*:2181");
//$value = $qzk->nodeGet("/common/products/wcd/uiver");
//print_r($value) . PHP_EOL;

$app_info_old = [
        9 => ['app_id' => '*******************','token' => '*******************|kdn-***-zuiqCjXkf97I'], //
        8 => ['app_id' => '*******************','token' => '**********************************'], //
		10 => ['app_id' => '*******************','token' => '**********************************'],//
		30001 => ['app_id' => '*******************','token' => '**********************************'],//
        10000 => ['app_id' => '*******************', 'token' => '*******************|***--Ps7EezCrc'],//
        //20000 => ['app_id' => '*******************', 'token' => '**********************************'],//
		20000 => ['app_id' => '*******************', 'token' => '**********************************'],//
		20001 => ['app_id' => '*******************', 'token' => '*******************|alaGob-***-EzLsWG5gxKE'],//
	  20 => ['app_id' => '*******************','token' => '**********************************'],// 
	  21 => ['app_id' => '*******************','token' => '**********************************'],//
      23 => ['app_id' => '*******************','token' => '*******************|***-wuZI'],//
	  10023 => ['app_id' => '*******************','token' => '**********************************'],//
	  24 => ['app_id' => '*******************','token' => '**********************************'],//
	  25 => ['app_id' => '*******************','token' => '**********************************'],//
    ];

$path = '/common/products/';
$all_product = $qzk->list($path);
foreach ($all_product as  $pc) {
	if ($pc != 'wcd_test'){
		//continue;
	}
	$wcd = $qzk->listWithValue($path.$pc);
	$appid = $wcd['appid'];
	if (!isset($app_info_old[$appid])){
		continue;	
	}
	$qzk->nodeSet($path.$pc.'/fb_app_id',$app_info_old[$appid]['app_id']);
	$qzk->nodeSet($path.$pc.'/fb_token',$app_info_old[$appid]['token']);
	$qzk->nodeSet($path.$pc.'/fb_online',1);
	$get_value = $qzk->listWithValue($path.$pc);
	print_r($get_value);
}