<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>wd and cc &#187; Linux</title>
	<atom:link href="http://wdicc.com/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://wdicc.com</link>
	<description>Happy every day...</description>
	<lastBuildDate>Wed, 01 Feb 2012 03:27:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>thunderbird 和 davmail 配合连接 exchange</title>
		<link>http://wdicc.com/use-davmail-to-access-exchange-server-better-in-thunderbird/</link>
		<comments>http://wdicc.com/use-davmail-to-access-exchange-server-better-in-thunderbird/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 03:27:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[davmail]]></category>
		<category><![CDATA[exchange]]></category>
		<category><![CDATA[outlook]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://wdicc.com/use-davmail-to-access-exchange-server-better-in-thunderbird/</guid>
		<description><![CDATA[exchange 是个恶心玩意，虽然提供了 imap 接口，但是速度巨慢，发送接收都慢。davmail 可以解决这个问题。 davmail 能干啥 davmail 可以理解为就是一个 proxy，他负责和 exchange 通讯，其他邮件客户端连接 davmail 来获取邮件什么的。网站上面有图，看 着更加直观一点。 安装配置 davmail ubuntu 里面好像直接就有，apt-get 安装就可以了。gentoo 里面没有，我在 overlay 里面找到一个 ebuild，自己修了一下，放到我的 overlay 了，在 net-mail/davmail-bin 下面。启用 server 这个 use。 安装后会创建一个 davmail 用户，需要建立一个 /var/log/davmail 的目录，给 davmail 写权限。 然后手动运行 opt/davmail/davmail.sh，有界面，配置好 exchange owa 的地址，保存，会生成 ~.davmail.properties 文件。 这里有个问题，如果 owa 地址是 http 的，那直接继续下面的就可以了，如果是 https 的，那还需要配置对应的 ssl 相关参数。我是 直接在 [...]]]></description>
			<content:encoded><![CDATA[<p>exchange 是个恶心玩意，虽然提供了 imap 接口，但是速度巨慢，发送接收都慢。davmail 可以解决这个问题。
</p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">davmail 能干啥</h2>
<div class="outline-text-2" id="text-1">
<p>
<a href="http://davmail.sourceforge.net/">davmail</a> 可以理解为就是一个 proxy，他负责和 exchange 通讯，其他邮件客户端连接 davmail 来获取邮件什么的。网站上面有图，看<br />
着更加直观一点。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">安装配置 davmail</h2>
<div class="outline-text-2" id="text-2">
<p>
ubuntu 里面好像直接就有，apt-get 安装就可以了。gentoo 里面没有，我在 overlay 里面找到一个 ebuild，自己修了一下，放到我的<br />
<a href="https://github.com/wd/overlay">overlay</a> 了，在 net-mail/davmail-bin 下面。启用 server 这个 use。
</p>
<p>
安装后会创建一个 davmail 用户，需要建立一个 /var/log/davmail 的目录，给 davmail 写权限。
</p>
<p>
然后手动运行 <i>opt/davmail/davmail.sh，有界面，配置好 exchange owa 的地址，保存，会生成 ~</i>.davmail.properties 文件。
</p>
<p>
这里有个问题，如果 owa 地址是 http 的，那直接继续下面的就可以了，如果是 https 的，那还需要配置对应的 ssl 相关参数。我是<br />
直接在 thunderbird 里面配置好之后，收了一下邮件，然后会提示一个什么证书的东西，这之后再继续下面的事情就可以了，这个时候<br />
他会给你配置好里面 ssl 相关的东西。
</p>
<p>
复制到 /etc/davmail.properties，把里面的 davmail.server=fales 改成 true，设置好 log 为 /var/log/davmail/davmail.log，级<br />
别先使用 debug，测试好了之后改成 warn。
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">配置 thunderbird</h2>
<div class="outline-text-2" id="text-3">
<p>
参考 davmail 网站上面关于 thunderbird 的配置就好了。
</p>
<p>
可配置的有接收，发送，地址簿，日历。
</p>
<p>
排错就看看 /var/log/davmail/davmail.log 把，信息很详细。
</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/use-davmail-to-access-exchange-server-better-in-thunderbird/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>介绍下 org2blog</title>
		<link>http://wdicc.com/about-org2blog/</link>
		<comments>http://wdicc.com/about-org2blog/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 03:47:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[org2blog]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=815</guid>
		<description><![CDATA[org2blog 是什么 org2blog 是用来把 org-mode 格式的文章发布到 wordpress 的工具。其实之前使用 webloger.el 也可以发布到 wordpress，不过是 webloger.el 已经基本没人维护了，这个 org2blog 作者支持还很积极，另外 org-mode 还提供了一些额外的方便编辑的方法，所以其实 是个不错的东东。 安装 其实按照上面地址的内容，安装很简单。 git clone http://github.com/punchagan/org2blog.git (setq load-path (cons "~/.emacs.d/org2blog/" load-path)) (require 'org2blog-autoloads) 依赖 xml-rpc ，添加到 load-path 需要最新版本的 org-mode，我使用的是 emacs 24 里面的 7.7，之前使用 7.5(?) 的时候，遇到了发布的时候会在文章结尾附加 &#60;/body&#62;&#60;/html&#62; 导致 blog 的展现挂掉的问题。 使用 配置 ;; ;; org2blog ;; (require 'org2blog-autoloads) (setq [...]]]></description>
			<content:encoded><![CDATA[<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">org2blog 是什么</h2>
<div id="text-1" class="outline-text-2">
<p><a href="https://github.com/punchagan/org2blog">org2blog</a> 是用来把 org-mode 格式的文章发布到 wordpress 的工具。其实之前使用 webloger.el 也可以发布到 wordpress，不过是<br />
webloger.el 已经基本没人维护了，这个 org2blog 作者支持还很积极，另外 org-mode 还提供了一些额外的方便编辑的方法，所以其实<br />
是个不错的东东。</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">安装</h2>
<div id="text-2" class="outline-text-2">
<p>其实按照上面地址的内容，安装很简单。</p>
<pre class="example">git clone http://github.com/punchagan/org2blog.git
(setq load-path (cons "~/.emacs.d/org2blog/" load-path))
(require 'org2blog-autoloads)</pre>
<ol>
<li>依赖 <a href="http://launchpad.net/xml-rpc-el">xml-rpc</a> ，添加到 load-path</li>
<li>需要最新版本的 org-mode，我使用的是 emacs 24 里面的 7.7，之前使用 7.5(?) 的时候，遇到了发布的时候会在文章结尾附加<br />
&lt;/body&gt;&lt;/html&gt; 导致 blog 的展现挂掉的问题。</li>
</ol>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">使用</h2>
<div id="outline-container-3-1" class="outline-3">
<h3 id="sec-3-1">配置</h3>
<div id="text-3-1" class="outline-text-3">
<pre class="example">;;
;; org2blog
;;

(require 'org2blog-autoloads)
(setq org2blog/wp-blog-alist
      `(("abc"
         :url "http://abc.com/xmlrpc.php"
         :username "admin"
         :password PWD
         :keep-new-lines t
         :confirm t
         :wp-code nil
         :tags-as-categories nil)
        ))

(setq org2blog/wp-buffer-template
  "#+DATE: %s
#+OPTIONS: toc:nil num:nil todo:nil pri:nil tags:nil ^:nil TeX:nil
#+CATEGORY: Heart
#+TAGS:
#+PERMALINK:
#+TITLE:
\n")</pre>
<p>我不使用 wordpress 的 code 格式，所以设置了 wp-code 为 nil。可以定义多个 blog。</p>
</div>
</div>
<div id="outline-container-3-2" class="outline-3">
<h3 id="sec-3-2">登陆，发帖</h3>
<div id="text-3-2" class="outline-text-3">
<p>M-x org2blog/wp-login 会提示你要登陆哪个 blog<br />
M-x org2blog/wp-new-entry 会使用设置的 template 打开一个 buffer<br />
M-x org2blog/wp-post-buffer 保存成 draft<br />
M-x org2blog/wp-post-buffer-and-publish 真实发布</p>
<p>另外，还可以发布一个 tree 而不是整个 org 文件，以及一些其他的操作就不多说了。</p>
<p>发布源代码可以使用 BEGIN_SRC END_SRC 块，或者冒号开头的行会被当作源代码。</p>
<p>我使用的是 wp-syntax，所以发布源代码使用 BEGIN_HTML 在里面使用 pre 标签</p>
<pre>#+BEGIN_HTML
&lt;pre lang="lisp"&gt;
(setq a 1)
&lt;/pre&gt;
#+END_HTML</pre>
</div>
</div>
<div id="outline-container-3-3" class="outline-3">
<h3 id="sec-3-3">其他</h3>
<div id="text-3-3" class="outline-text-3">
<p>使用 org2blog 只能从 org 发布到 wordpress，不能从 wordpress 回到 org 文件再进行编辑，不过我看到有人已经提供了一个解决方<br />
法，或许将来也会支持这个功能。</p>
<p>使用 org2blog 发布很讨厌的一点是，他会把你的 org 加上很多的 html 代码，再编辑的时候比较讨厌。</p>
<p>org2blog 在 github 的页面 <a href="https://github.com/punchagan/org2blog">https://github.com/punchagan/org2blog</a> 上面有不少有用的东西，建议看看。</p>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/about-org2blog/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>介绍下 openresty</title>
		<link>http://wdicc.com/intro-openresty/</link>
		<comments>http://wdicc.com/intro-openresty/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 11:06:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[openresty]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=812</guid>
		<description><![CDATA[一直没有时间使用 ngx_lua，上周算是真正使用了下，总结下，也算是帮忙推广下 openresty。 什么是 openresty openresty 的主力作者是 @agentzh 它的网页在 这里，上面有介绍。按我的理解，他是介于客户端浏览器 js 和数据库之间的一层。 在 ajex 还没有盛行的时代，数据库的数据需要展现在浏览器的时候，一般都是使用 php/jsp 之类读取数据，然后拼表格/图表这些。在客户端机器越来越牛逼之后，把部分运算放在浏览器里面开始盛行，ajex 也越来越流行。这个时候通常还需要有个服务器端的程序来配合从数据库获取并提供数据，应该也有不少类似的程序来提供这个数据。 老版本的 openresty 是基于 perl 做的，可以上 cpan 上面 搜到 (不知道为啥这页面我打不开了)。agentzh 还专门为他写了一个 admin site，纯 js + oprensty 来实现的，可以直接在上面配置接口，很方便。目前老版本应该没人用了。 新版本的 openresty 基本上等于是 nginx 和一些 nginx 模块的集合，大部分模块都是 agentzh 和 chaoslawful 完成的，目前 agentzh 离职在家全职开发 openresty 相关，chaoslawful 还在淘宝 量子统计 。 这大概就是我了解的 openresty 的起源和目前的情况。写的比较简单，里面的曲折就不多说了，可以找上面提到的大牛聊天。 [...]]]></description>
			<content:encoded><![CDATA[<p>一直没有时间使用 ngx_lua，上周算是真正使用了下，总结下，也算是帮忙推广下 openresty。</p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">什么是 openresty</h2>
<div id="text-1" class="outline-text-2">
<p>openresty 的主力作者是 <a href="http://weibo.com/agentzh">@agentzh</a> 它的网页在 <a href="http://openresty.org">这里</a>，上面有介绍。按我的理解，他是介于客户端浏览器 js 和数据库之间的一层。</p>
<p>在 ajex 还没有盛行的时代，数据库的数据需要展现在浏览器的时候，一般都是使用 php/jsp 之类读取数据，然后拼表格/图表这些。在客户端机器越来越牛逼之后，把部分运算放在浏览器里面开始盛行，ajex 也越来越流行。这个时候通常还需要有个服务器端的程序来配合从数据库获取并提供数据，应该也有不少类似的程序来提供这个数据。</p>
<p>老版本的 openresty 是基于 perl 做的，可以上 cpan 上面 <a href="http://search.cpan.org/~agent/OpenResty-0.5.12/lib/OpenResty/Spec/REST_cn.pod">搜到</a> (不知道为啥这页面我打不开了)。agentzh 还专门为他写了一个 admin site，纯 js + oprensty 来实现的，可以直接在上面配置接口，很方便。目前老版本应该没人用了。</p>
<p>新版本的 openresty 基本上等于是 nginx 和一些 nginx 模块的集合，大部分模块都是 agentzh 和 <a href="https://github.com/chaoslawful">chaoslawful</a> 完成的，目前 agentzh 离职在家全职开发 openresty 相关，chaoslawful 还在淘宝 <a href="http://linezing.com">量子统计</a> 。</p>
<p>这大概就是我了解的 openresty 的起源和目前的情况。写的比较简单，里面的曲折就不多说了，可以找上面提到的大牛聊天。</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">怎么使用 openresty</h2>
<div id="text-2" class="outline-text-2">
<p>我下面用一个简单的例子来描述下，我是怎么使用 openresty 的，从中应该能看出来 openresty 能干啥，怎么用。</p>
</div>
<div id="outline-container-2-1" class="outline-3">
<h3 id="sec-2-1">需求</h3>
<div id="text-2-1" class="outline-text-3">
<p>在 postgresql 数据库有张网站日访问流量表，包含两个字段 thedate 和 pv。需要把里面的数据展现出来，画出来流量曲线。</p>
<dl>
<dt>注意</dt>
<dd>下面的代码大都从现有程序里面扒出来的，所以不一定直接就能用，只是个示意而已。</dd>
</dl>
</div>
</div>
<div id="outline-container-2-2" class="outline-3">
<h3 id="sec-2-2">安装 openresty</h3>
<div id="text-2-2" class="outline-text-3">
<p>首先需要安装 openresty。从 <a href="http://openresty.org">openresty.org</a> 下载当前的 stable 版本 ngx_openresty-1.0.6.22.tar.gz。</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw2">tar</span> zxvf ngx_openresty-1.0.6.22.tar.gz
$ <span class="kw3">cd</span> ngx_openresty-1.0.6.22
$ .<span class="sy0">/</span>configure --with-http_drizzle_module --with-http_postgres_module --with-pg_config=<span class="sy0">/</span>opt<span class="sy0">/</span>pg90<span class="sy0">/</span>bin<span class="sy0">/</span>pg_config <span class="re5">--prefix</span>=<span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>openresty <span class="re5">--with-libdrizzle</span>=<span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>libdrizzle<span class="sy0">/</span> <span class="re5">--with-luajit</span> --with-http_iconv_module <span class="co0"># 这是我用到的参数，按照需要加减</span>
$ <span class="kw2">make</span>
<span class="co0"># make install</span></pre></div></div>

<p>configure 的时候 postgres_module 是必须的，其他的 drizzle_module 是用来支持从 mysql 获取数据的，iconv_module 是用来做编码转换的，luajit 据说可以提升不少性能。</p>
<p>不出问题的话，在 /usr/local/openresty 目录下面就安装好了。其实更合理的方式应该是提供一个 rpm 或者 deb 包的。</p>
</div>
</div>
<div id="outline-container-2-3" class="outline-3">
<h3 id="sec-2-3">启动 nginx</h3>
<div id="text-2-3" class="outline-text-3">
<p>openresty 给提供了简单可用的 nginx.conf，所以现在可以先尝试启动下 /usr/local/openresty/nginx/sbin/nginx 了，如果启动没问题，那就 ok 了。</p>
<p>配置文件在 /usr/local/openresty/nginx/conf/nginx.conf。</p>
</div>
</div>
<div id="outline-container-2-4" class="outline-3">
<h3 id="sec-2-4">配置 nginx</h3>
<div id="text-2-4" class="outline-text-3">
<p>主要就是配置 /usr/local/openresty/nginx/conf/nginx.conf，以后很多事情都会在这里面来完成，说是 nginx.conf 编程也不为过，呵呵。</p>
<p>增加下面的配置</p>

<div class="wp_syntax"><div class="code"><pre class="conf"># http 级别增加下面的，设置好里面的 ip 用户名密码什么的
&nbsp;
    upstream pgsql {
        postgres_server server_ip:5432 dbname=test password=123 user=test;
        #postgres_keepalive  max=2 mode=single overflow=reject;
        postgres_keepalive off;
    }
&nbsp;
# server 里面增加一个 location
&nbsp;
       location /=/pv {
            postgres_query 'select thedate, pv from pv';
            postgres_pass pgsql;
&nbsp;
            rds_json on;
            rds_json_format compact;
&nbsp;
            xss_get on;
            xss_callback_arg '_c';
        }</pre></div></div>

<ol>
<li>其中关于 upstream postgres 用来定义需要连接的数据库信息，和发送 sql 到数据库，可以参考 <a href="https://github.com/FRiCKLE/ngx_postgres/">这里</a>。</li>
<li>rds_json 用来将数据库的输出变成 json 格式，可以参考 <a href="https://github.com/agentzh/rds-json-nginx-module">这里</a> 。</li>
<li>xss_get 用来支持跨域，jquery 默认使用的 callback 参数是 _c，可以参考 <a href="https://github.com/agentzh/xss-nginx-module">这里</a>。</li>
</ol>
<p>这样配置好之后，重启下。结果应该很清晰了，请求 <a href="http://your_ip/=/pv">http://your\_ip/=/pv</a> 应该就可以得到数据库里面的数据了，可以使用 curl 看看结果，应该类似下面的</p>

<div class="wp_syntax"><div class="code"><pre class="json">[['2011-10-09', 245],['2011-10-10', 456]]</pre></div></div>

</div>
</div>
<div id="outline-container-2-5" class="outline-3">
<h3 id="sec-2-5">js 画图</h3>
<div id="text-2-5" class="outline-text-3">
<p>挑一个画图程序，比如我用过的 <a href="http://highcharts.com">highcharts</a>, <a href="http://www.amcharts.com/">amcharts</a> 这些都不错，amcharts 是使用 flash 画图，兼容各种浏览器，highcharts 号称也支持，不过我弄出来的图在 chrome/firefox 下面没问题，ie 不支持，他用的是 svg 标签。</p>
<p>就写几行代码来示意下吧</p>

<div class="wp_syntax"><div class="code"><pre class="javascript">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">ready</span><span class="br0">&#40;</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    $.<span class="me1">ajax</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
        url <span class="sy0">:</span> <span class="st0">'http://your_ip/=/pv'</span><span class="sy0">,</span>
        success<span class="sy0">:</span> <span class="kw2">function</span> <span class="br0">&#40;</span>data<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            renderPvCharts<span class="br0">&#40;</span>data<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw2">function</span> renderPvCharts<span class="br0">&#40;</span>data<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        $<span class="br0">&#40;</span><span class="st0">'body'</span><span class="br0">&#41;</span>.<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">'</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="javascript"><span class="st0">');
        var result = Utils.getSplineChartSeries( data ); # 将 nginx 返回的 json 格式数据转化为 highcharts 需要的格式
        var options = {
			chart: {
                zoomType: '</span>xy<span class="st0">',
				renderTo: '</span>pv<span class="st0">', # div 的 id
				defaultSeriesType: '</span>spline<span class="st0">'
			},
			title: {
                text: '</span>每日 pv<span class="st0">'
            },
			xAxis: {
                type: '</span>datetime<span class="st0">'
			},
			tooltip: {
				formatter: function() {
			        return '</span><span class="sy0">&lt;</span>strong<span class="sy0">&gt;</span><span class="st0">'+ this.series.name +'</span><span class="sy0">&lt;/</span>strong<span class="sy0">&gt;</span>
<span class="st0">'+
						Highcharts.dateFormat('</span><span class="sy0">%</span>e. <span class="sy0">%</span>b<span class="st0">', this.x) +'</span><span class="sy0">:</span> <span class="st0">'+ this.y;
				}
			},
			legend: {
				layout: '</span>vertical<span class="st0">',
				align: '</span>right<span class="st0">',
				verticalAlign: '</span>top<span class="st0">',
				x: -10,
				y: 100,
				borderWidth: 0
			},
            series : result.y
        };
&nbsp;
        var chart = new Highcharts.Chart( options );
    };
&nbsp;
} );</span></pre></div></div>

<p>简单解释下</p>
<ol>
<li>在页面 readay 的时候，使用 ajex 设置回调函数并请求接口。</li>
<li>回调函数里面使用 Utils.getSplineChartSeries 转换一下数据，方便直接给 options 里面数据赋值，具体需要的数据格式，看 highcharts 的 spline 的 demo 就可以。</li>
<li>回调函数里面显示图表。</li>
</ol>
<p>这样就完事了，数据就展现出来了。</p>
</div>
</div>
<div id="outline-container-2-6" class="outline-3">
<h3 id="sec-2-6">其他</h3>
<div id="text-2-6" class="outline-text-3">
<p>从上面可以看到整个数据流是怎么回事。openresty 可以做的事情远比上面描述的复杂，上面只是个最简单的应用了。</p>
<ol>
<li>比如使用 <a href="https://github.com/agentzh/rds-csv-nginx-module">rds_csv</a> 来直接得到 csv 格式的数据提供给用户，而不是 json。</li>
<li>可以使用 <a href="https://github.com/chaoslawful/lua-nginx-module">ngx_lua</a> 在 nginx.conf 里面使用 lua 来在服务器端对数据做一些处理再丢给浏览器。<br />
大家都知道 js 处理的数据太大的时候，会导致浏览器卡死，所以如果不方便通过 sql 控制输出的时候，可以使用 lua 来处理下。当然 这只是其中一个应用，使用 ngx_lua 你可以干很多事情，比如上面那个使用 js 来生成 spline 数据的函数就可以用 lua 来实现，lua 还可以和 c 结合来做一些事情。对于 location 的参数，在 ngx_lua 里面也是可以访问的，比如 ngx.var.arg_c 这样。具体还是看 wiki 吧，写不完的。</p>
<ol>
<li>openresty 还能直接访问 redis 和 memcached。</li>
</ol>
<p>本篇只能算是一个入门而已，openresty 在淘宝量子统计的应用非常广泛。另外在 <a href="http://qunar.com">去哪网</a> 也有不少应用，比如我知道的安全过滤模块，和一些数据报表，都是基于 openresty 的。</p>
<p>附一个 highcarts 画的图</p>
<p><img class="alignnone" title="流量情况" src="http://wdicc.com/images/2011-10-24-171245_1100x312_scrot.png" alt="" width="1100" height="312" /></li>
</ol>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/intro-openresty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>postgresql 里面的 generate_series</title>
		<link>http://wdicc.com/generate_series-function-in-postgresql/</link>
		<comments>http://wdicc.com/generate_series-function-in-postgresql/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 07:01:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://wdicc.com/generate_series-function-in-postgresql/</guid>
		<description><![CDATA[有个报表需要把几天的记录按照小时 join 起来，最开始的作法是通过 js 来 join 数据。后来遇到了问题，就是某天某个小时可能会没有记录，然后想破头了，在 js 里面循环的时候设置每天循环到的当前的小时。可崩溃的是还会出现有的是这两小时没有，有的是另外的，用 js 搞不定了，就尝试用 sql 搞定。 sql 开始的方法是简单的使用 full join。然后发现没法保证主表在所有的小时都有记录。后来就发现了这个 generate_series 函数，发现很有意思。地址在这里 http://www.postgresql.org/docs/9.0/static/functions-srf.html 。这里还有个 generate_scripts 的函数，可以用来遍历数组产生一个表格的。]]></description>
			<content:encoded><![CDATA[<p>有个报表需要把几天的记录按照小时 join 起来，最开始的作法是通过 js 来 join 数据。后来遇到了问题，就是某天某个小时可能会没有记录，然后想破头了，在 js 里面循环的时候设置每天循环到的当前的小时。可崩溃的是还会出现有的是这两小时没有，有的是另外的，用 js 搞不定了，就尝试用 sql 搞定。
</p>
<p>
sql 开始的方法是简单的使用 full join。然后发现没法保证主表在所有的小时都有记录。后来就发现了这个 generate_series 函数，发现很有意思。地址在这里 <a href="http://www.postgresql.org/docs/9.0/static/functions-srf.html">http://www.postgresql.org/docs/9.0/static/functions-srf.html</a> 。这里还有个 generate_scripts 的函数，可以用来遍历数组产生一个表格的。</p>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/generate_series-function-in-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>了解了下 hbase</title>
		<link>http://wdicc.com/intro-hbase/</link>
		<comments>http://wdicc.com/intro-hbase/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 07:59:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[hbase]]></category>

		<guid isPermaLink="false">http://wdicc.com/intro-hbase/</guid>
		<description><![CDATA[很早就知道 hbase 了，但是一直没有仔细去了解 hbase 是怎么回事。今天了解了下他的表结构。 这篇文章 http://www.searchtb.com/2011/01/understanding-hbase.html 其实写的挺清楚，下面这个是个例子 hbase(main):007:0&#38;gt; scan 'test' ROW COLUMN+CELL row1 column=cf:a, timestamp=1312258784360, value=value3 row1 column=cf:b, timestamp=1312258795425, value=value3 row2 column=cf:b, timestamp=1312257616099, value=value2 row3 column=cf:c, timestamp=1312257621344, value=value3 在 hbase 里面访问数据都是通过 row key + column，其实也就是哪行哪列，不过不是通过数字定位。 在 hbase 里面看不到传统数据库的表格形式的数据列表，可以看到上面这种。传统数据库里面，每行的列数是一样的，如果那列没值，那也得填一个 null 之类。 hbase 就不一定了，可以看到上面的 row1 行，有两列 cf:a, cf:b，而 row2，row3 就只有一列。 所以 hbase 作为 key-value 系统的时候，row key [...]]]></description>
			<content:encoded><![CDATA[<p>很早就知道 hbase 了，但是一直没有仔细去了解 hbase 是怎么回事。今天了解了下他的表结构。
</p>
<p>
这篇文章 <a href="http://www.searchtb.com/2011/01/understanding-hbase.html">http://www.searchtb.com/2011/01/understanding-hbase.html</a> 其实写的挺清楚，下面这个是个例子
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="text">hbase(main):007:0&amp;gt; scan 'test'                         
ROW                                 COLUMN+CELL                                                                                            
 row1                               column=cf:a, timestamp=1312258784360, value=value3                                                     
 row1                               column=cf:b, timestamp=1312258795425, value=value3                                                     
 row2                               column=cf:b, timestamp=1312257616099, value=value2                                                     
 row3                               column=cf:c, timestamp=1312257621344, value=value3</pre></div></div>

</p>
<p>
在 hbase 里面访问数据都是通过 row key + column，其实也就是哪行哪列，不过不是通过数字定位。
</p>
<p>
在 hbase 里面看不到传统数据库的表格形式的数据列表，可以看到上面这种。传统数据库里面，每行的列数是一样的，如果那列没值，那也得填一个 null 之类。
</p>
<p>
hbase 就不一定了，可以看到上面的 row1 行，有两列 cf:a, cf:b，而 row2，row3 就只有一列。
</p>
<p>
所以 hbase 作为 key-value 系统的时候，row key + column 就是所谓的 key。</p>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/intro-hbase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>svn merge</title>
		<link>http://wdicc.com/about-svn-merge/</link>
		<comments>http://wdicc.com/about-svn-merge/#comments</comments>
		<pubDate>Sun, 08 May 2011 00:56:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=809</guid>
		<description><![CDATA[svn merge 的 help 信息 usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH] 2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH] 3. merge [-c M[,N...] &#124; -r N:M ...] SOURCE[@REV] [WCPATH] svn 的 merge 的本质其实就是在两个版本之间生成 diff，然后把这个 diff 再应用到另外一个版本里面。 所以可以看到 merge 和最后的那个 WCPATH 之间，通常都需要指定两个版本。WCPATH 可以是其中的一个，这个没关系。 一般都是把新多出来的部分 merge 到另一个版本，所以通常是 svn merge old_ver new_ver working_ver 其中那个 working_ver 可以是 old_ver。 最好在 merge 之前加一个 &#8211;dry-run [...]]]></description>
			<content:encoded><![CDATA[<p>svn merge 的 help 信息</p>
<pre>
usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
       2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
       3. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [WCPATH]
</pre>
<p>svn 的 merge 的本质其实就是在两个版本之间生成 diff，然后把这个 diff 再应用到另外一个版本里面。
</p>
<p>
所以可以看到 merge 和最后的那个 WCPATH 之间，通常都需要指定两个版本。WCPATH 可以是其中的一个，这个没关系。
</p>
<p>
一般都是把新多出来的部分 merge 到另一个版本，所以通常是 svn merge old_ver new_ver working_ver 其中那个 working_ver 可以是 old_ver。
</p>
<p>
最好在 merge 之前加一个 &ndash;dry-run 看看他会修改哪些文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/about-svn-merge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>alarm 使用不当遇到的问题</title>
		<link>http://wdicc.com/alarm-signal-in-perl/</link>
		<comments>http://wdicc.com/alarm-signal-in-perl/#comments</comments>
		<pubDate>Sun, 08 May 2011 00:12:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=808</guid>
		<description><![CDATA[前段时间发现有个程序总是运行一段时间就挂掉，看各种日志里面都没有错误信息，感觉就是莫名其妙突然进程就没了。 大概流程是有个 perl 程序 a.pl ..... my $pid = fork&#40;&#41;; if &#40; !$pid &#41; &#123; my $cmdRet = `b.pl 2&#62;&#38;1`; print FILE $cmdRet; if &#40; $status &#41; &#123; warn &#34;task failed&#34;; &#125; else &#123; warn &#34;task success&#34;; &#125; exit; &#125; &#160; waitpid ........ b.pl 里面会执行 rsync 去获取一些文件，他会循环到几个机器上面去 rsync for &#40; @hosts &#41; &#123; my $result [...]]]></description>
			<content:encoded><![CDATA[<p>前段时间发现有个程序总是运行一段时间就挂掉，看各种日志里面都没有错误信息，感觉就是莫名其妙突然进程就没了。
</p>
<p>
大概流程是有个 perl 程序 a.pl
</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span class="sy0">.....</span>
<span class="kw1">my</span> <span class="re0">$pid</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/fork.html"><span class="kw3">fork</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="re0">$pid</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
   <span class="kw1">my</span> <span class="re0">$cmdRet</span> <span class="sy0">=</span> <span class="st0">`b.pl 2&gt;&amp;1`</span><span class="sy0">;</span>
   <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> FILE <span class="re0">$cmdRet</span><span class="sy0">;</span>
   <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">$status</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
       <a href="http://perldoc.perl.org/functions/warn.html"><span class="kw3">warn</span></a> <span class="st0">&quot;task failed&quot;</span><span class="sy0">;</span>
   <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
      <a href="http://perldoc.perl.org/functions/warn.html"><span class="kw3">warn</span></a> <span class="st0">&quot;task success&quot;</span><span class="sy0">;</span>
   <span class="br0">&#125;</span>
   <a href="http://perldoc.perl.org/functions/exit.html"><span class="kw3">exit</span></a><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<a href="http://perldoc.perl.org/functions/waitpid.html"><span class="kw3">waitpid</span></a> <span class="sy0">........</span></pre></div></div>

<p>
b.pl 里面会执行 rsync 去获取一些文件，他会循环到几个机器上面去 rsync</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span class="kw1">for</span> <span class="br0">&#40;</span> <span class="re0">@hosts</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">my</span> <span class="re0">$result</span> <span class="sy0">=</span> <span class="st0">`rsync xxxxx 2&gt;&amp;1`</span><span class="sy0">;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="co5">$?</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <a href="http://perldoc.perl.org/functions/log.html"><span class="kw3">log</span></a><span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <a href="http://perldoc.perl.org/functions/log.html"><span class="kw3">log</span></a><span class="br0">&#40;</span><span class="st0">&quot;failed&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
        <a href="http://perldoc.perl.org/functions/log.html"><span class="kw3">log</span></a><span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <a href="http://perldoc.perl.org/functions/log.html"><span class="kw3">log</span></a><span class="br0">&#40;</span><span class="st0">&quot;success&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw2">sub</span> <a href="http://perldoc.perl.org/functions/log.html"><span class="kw3">log</span></a> <span class="br0">&#123;</span>
    <span class="kw1">my</span> <span class="re0">$msg</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span>
    <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$msg</span><span class="sy0">;</span>
    <span class="co1"># 然后通过 IO::Socket::INET 发送给另外一个 server  a</span>
<span class="br0">&#125;</span></pre></div></div>

<p>现象是，时不时的， b.pl 会只 rsync 了某几台(不确定是几台)机器上面的文件，然后就不继续了，从 server a 上面能收到他发日志，最后一条是 success 的信息
</p>
<p>
从 a.pl 记录的日志那里看, FILE 里面记录的内容丢失了 server a 收到的最后一部分的数据，多少数据不一定，不过肯定是没有那个 success 信息。 这个文件里面也没有任何的错误信息。
</p>
<p>
程序代码啥的都不动，rsync 的文件数不是总是一样的，也有文件多的时候没出错的时候,同时也设置了打开文件数为 65536.
</p>
<p>
后来发现问题就在 b.pl 里面的 log 里面。因为要发送到其他机器，怕挂住影响后续程序，所以设置了一个 alarm。
</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><a href="http://perldoc.perl.org/functions/eval.html"><span class="kw3">eval</span></a> <span class="br0">&#123;</span>
    <a href="http://perldoc.perl.org/functions/alarm.html"><span class="kw3">alarm</span></a> <span class="nu0">5</span><span class="sy0">;</span>
    xxxxxxx<span class="sy0">;</span>
    <a href="http://perldoc.perl.org/functions/alarm.html"><span class="kw3">alarm</span></a> <span class="nu0">0</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span> <span class="br0">&#40;</span> <span class="co5">$@</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;error when send&quot;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>
这个 alarm 没有设置 handle 的函数，这样就会导致 alarm 到期的时候，会直接让整个 perl 程序挂掉，并显示 “Alarm clock”，而且这个输出不在标准错误和标准输出里面。
</p>
<p>
修复也简单，alarm 前设置一个 handler 就好了。
</p>
<p>
另外，还有个问题，一个 alarm 会中断前一个 alarm，所以类似 sleep 的使用，可以这样
</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span class="kw1">my</span> <span class="re0">$previousAlarm</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
<a href="http://perldoc.perl.org/functions/eval.html"><span class="kw3">eval</span></a> <span class="br0">&#123;</span>
    <a href="http://perldoc.perl.org/functions/local.html"><span class="kw3">local</span></a> <span class="re0">$SIG</span><span class="br0">&#123;</span>ALRM<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="kw2">sub</span> <span class="br0">&#123;</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st_h">'alarm'</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span>
    <span class="re0">$previousAlarm</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/alarm.html"><span class="kw3">alarm</span></a> <span class="nu0">5</span><span class="sy0">;</span>
     xxxx
     <a href="http://perldoc.perl.org/functions/alarm.html"><span class="kw3">alarm</span></a> <span class="nu0">0</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="sy0">;</span>
<a href="http://perldoc.perl.org/functions/alarm.html"><span class="kw3">alarm</span></a> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span> <span class="br0">&#40;</span> <span class="co5">$@</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
    xxxxx<span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<a href="http://perldoc.perl.org/functions/alarm.html"><span class="kw3">alarm</span></a> <span class="re0">$previousAlarm</span><span class="sy0">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/alarm-signal-in-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hive 里面不能 drop table</title>
		<link>http://wdicc.com/cant-drop-table-in-hive/</link>
		<comments>http://wdicc.com/cant-drop-table-in-hive/#comments</comments>
		<pubDate>Tue, 03 May 2011 08:42:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[hive]]></category>
		<category><![CDATA[postgress]]></category>

		<guid isPermaLink="false">http://wdicc.com/cant-drop-table-in-hive/</guid>
		<description><![CDATA[之前部署 hive 0.6 的时候，发现用 postgress 存 metadb 的时候，不能 drop table，一执行就卡住了。当时试过 mysql，好像是有个什么问题，就没用了，后来只好用 hive 0.5 完事。 前几天有个别的事情工作不正常，以为可能是版本的问题，毕竟现在都 0.7 了。所以尝试了下直接升级到 0.7。在 0.6 版本的 hive 里面，自带了一个 postgress 用的升级 sql，但是 0.7 的没有。执行这个 sql 后，hive 0.7 能查询，但是同样的，也遇到了不能 drop table 的问题。 后来发现 drop table 的时候，hive 在尝试去查一个不存在的表，然后就卡在了这个 sql 上面，也不报错，也不超时，不知道是不是 jdbc 的问题。 然后把 mysql 用的升级 sql 迁移到了 postgress，这样 hive 0.7 在 postgress 里面也没问题了。 升级 [...]]]></description>
			<content:encoded><![CDATA[<p>之前部署 hive 0.6 的时候，发现用 postgress 存 metadb 的时候，不能 drop table，一执行就卡住了。当时试过 mysql，好像是有个什么问题，就没用了，后来只好用 hive 0.5 完事。
</p>
<p>
前几天有个别的事情工作不正常，以为可能是版本的问题，毕竟现在都 0.7 了。所以尝试了下直接升级到 0.7。在 0.6 版本的 hive 里面，自带了一个 postgress 用的升级 sql，但是 0.7 的没有。执行这个 sql 后，hive 0.7 能查询，但是同样的，也遇到了不能 drop table 的问题。
</p>
<p>
后来发现 drop table 的时候，hive 在尝试去查一个不存在的表，然后就卡在了这个 sql 上面，也不报错，也不超时，不知道是不是 jdbc 的问题。
</p>
<p>
然后把 mysql 用的升级 sql 迁移到了 postgress，这样 hive 0.7 在 postgress 里面也没问题了。
</p>
<p>
升级 sql 和邮件列表的主题在 <a href="http://www.mail-archive.com/user@hive.apache.org/msg01293.html">http://www.mail-archive.com/user@hive.apache.org/msg01293.html</a> 。升级的时候要注意，新建的表的 owner 需要是 hive 使用的用户。</p>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/cant-drop-table-in-hive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rsync files-from 参数</title>
		<link>http://wdicc.com/rsync-files-from-option/</link>
		<comments>http://wdicc.com/rsync-files-from-option/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 14:22:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[org2blog]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=805</guid>
		<description><![CDATA[rsync include/exclude rsync 支持使用 include/exclude 来过滤要同步的文件，使用这两个参数的时候，需要注意下面的这个问题 Note that, when using the –recursive (-r) option (which is implied by -a), every subcomponent of every path is vis‐ ited from the top down, so include/exclude patterns get applied recursively to each subcomponent’s full name (e.g. to include "/foo/bar/baz" the subcomponents "/foo" and "/foo/bar" must not be excluded). [...]]]></description>
			<content:encoded><![CDATA[<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">rsync</h2>
<div id="outline-container-1_1" class="outline-3">
<h3 id="sec-1_1">include/exclude</h3>
<div id="text-1_1" class="outline-text-3">
<p>rsync 支持使用 include/exclude 来过滤要同步的文件，使用这两个参数的时候，需要注意下面的这个问题</p>
<pre>
Note that, when using the –recursive (-r) option (which is implied by -a), every subcomponent of every path  is  vis‐
        ited  from the top down, so include/exclude patterns get applied recursively to each subcomponent’s full name (e.g. to
        include "/foo/bar/baz" the subcomponents "/foo" and "/foo/bar" must not be excluded).  The exclude  patterns  actually
        short-circuit  the  directory  traversal stage when rsync finds the files to send.  If a pattern excludes a particular
        parent directory, it can render a deeper include pattern ineffectual  because  rsync  did  not  descend  through  that
        excluded section of the hierarchy.  This is particularly important when using a trailing ’*’ rule.  For instance, this
        won’t work: 

/some/path/this-file-will-not-be-found
/file-is-included
*</pre>
<p>rsync 使用 -r 来遍历子目录的时候，如果还想用 exclude include 来过滤文件，那么要注意 一个目录如果满足了 exclude，而且还没有对应的 include，那这个目录下面的子目录也会被 exclude，就算你对这个子目录写了 include 。</p>
<p>虽然能解决问题，可实在很费劲，直到无意中发现了 files-from 参数。</p>
</div>
</div>
<div id="outline-container-1_2" class="outline-3">
<h3 id="sec-1_2">files-from</h3>
<div id="text-1_2" class="outline-text-3">
<p>files-from 是通过指定一个本地/远程的文件来定义需要同步的文件。这个文件生成方法可就多了，你可以用 find/sed/awk/xxxxx 等搭配来得到你这个文件，一行命令不够还可以多行，是不是爽多了？</p>
<pre>    rsync -av –-files-from=/path/to/files ./ wd@remote:/tmp</pre>
<p>如果是远程文件，那就 –files-from=:/path/to/files。</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">写在后面</h2>
<div id="text-2" class="outline-text-2">
<p>顺便测试一下 org2blog，这帖子是用 org2blog 写的，给作者提了个建议，加上 permlink 的支持，没几天居然给加上了，刚好测试一下，呵呵。</p>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/rsync-files-from-option/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解析纯真 ip 库</title>
		<link>http://wdicc.com/parse-qqwry-dat/</link>
		<comments>http://wdicc.com/parse-qqwry-dat/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 09:52:28 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=801</guid>
		<description><![CDATA[纯真的 ip 库应用比较广泛，就那个 qqwry.dat。以前尝试过解析，死活弄不明白那写地址和 pack/unpack 啥的，晕的不行。这两天需要解析下，就尝试用 perl 写一个。 开始用 sysread/sysseek 很多都读不出来，看了n遍程序，没觉得有啥问题。后来全部改成了 read/seek 就好了，也不知道怎么回事。画了一个图说明下，参考了 http://lumaqq.linuxsir.org/article/qqwry_format_detail.html 。 发件人 2011-3-10 读来的3字节地址需要加 “\0&#8243; 才能 unpack，不知道怎么回事，对这些问题弄不明白。对了，网上还有个 perl 版的，也能用，需要的话可以搜一下。]]></description>
			<content:encoded><![CDATA[<p>纯真的 ip 库应用比较广泛，就那个 qqwry.dat。以前尝试过解析，死活弄不明白那写地址和 pack/unpack 啥的，晕的不行。这两天需要解析下，就尝试用 perl 写一个。</p>
<p>开始用 sysread/sysseek 很多都读不出来，看了n遍程序，没觉得有啥问题。后来全部改成了 read/seek 就好了，也不知道怎么回事。画了一个图说明下，参考了 http://lumaqq.linuxsir.org/article/qqwry_format_detail.html 。</p>
<table style="width:auto;">
<tr>
<td><a href="https://picasaweb.google.com/lh/photo/f83_NZhjf6QchgG9gGRueg?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/_7OB6ilikjVs/TXie-yreH2I/AAAAAAAAAKY/fTPMq-pkuqU/s640/qqwry.png" height="640" width="269" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">发件人 <a href="https://picasaweb.google.com/wdicc0/2011310?feat=embedwebsite">2011-3-10</a></td>
</tr>
</table>
<p>读来的3字节地址需要加 “\0&#8243; 才能 unpack，不知道怎么回事，对这些问题弄不明白。对了，网上还有个 perl 版的，也能用，需要的话可以搜一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/parse-qqwry-dat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

