<?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</title>
	<atom:link href="http://wdicc.com/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>老文一篇，关于小毛</title>
		<link>http://wdicc.com/about-mao/</link>
		<comments>http://wdicc.com/about-mao/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 11:35:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Heart]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=818</guid>
		<description><![CDATA[一个老文，从 buaa bbs 翻出来，贴这里吧 无题(1) 序曲 好久以前就想养只猫了，可是条件不允许。没法子，只能看看别人pp的小猫过过瘾了。 去年冬天的时候，养猫的欲望越来越严重，以至于那个时候就找robomm定了一个，其间小叶子还和我说要是想养的话可以给我找人抱一只。呵呵，不过后来robomm的大猫好像没有怀孕，结果空欢喜一场。再后来就要过年了，因为照顾起来也不方便，所以就放弃了。过年来了我就在打算抱只小猫了。开始本来打算找宠物市场买一只，可是robomm的那片文章，让我放弃了这个念头，trademark一只在怂恿我去买一只，不过还好我能顶得住，呵呵。平时也不去什么猫的论坛，那就只好让robomm给我留意一下啦，呵呵。 联系 robomm给我介绍的我联系过两个，其中有一个只是发email问了问相片，不过他好久才给我回的，他给我回信时，我都已经和另外一个谈好了，呵呵，那个就是万晓飞。我介绍了我的情况之后，她说可以给我，不过有个条件，就是要送她的大猫一些猫粮，说为了让我付出点代价，这样我至少不会随便处理掉猫猫，我想都没想说没问题，然后就这么说定了。第一眼看到这些小猫的相片的时候，他们还不点大，其实也比现在大不了多少，非常可爱。而我尤其喜欢那个头上有点黑毛的小猫，之后的联系中她也同意给我那只了。高兴中，我就在bbs上面发了帖子，给大家看，那个就是我要的猫。:p 郁闷之初 因为没有满月，所以要等1，2个星期才行。上周一我给他发了个mail问小猫的事情，周二他给我打电话，说我可以过去拿了，不过告诉我那只说好了留给我的给她姐姐了，当时我很郁闷。后来一想，还不都一样啊，呵呵，我说那就拿起他的吧，没关系。然后就说起送大猫什么猫粮的事情来，然后他就说周一有个小mm花了80多块钱的猫粮，其实也就值40多，被骗了。所以让我买罐头好了，7块钱一听。也差不了那么多。期间我也没有问我需要买多少，因为我想，既然都这么联系好了，那多少还不是一个形式而已？而她也一再表示她不是要卖钱。从后来接触中听她的口气，她确实应该不缺钱，北京的有钱人。 没有订到我想要的那个，多少也有点郁闷吧，不过这还好。 郁闷之中 周二她说我工作日晚上都可以过去吧，我说我还没有准备好猫用的东西，所以周三我需要去买点东西，周四吧，她说可以。周二晚上我来bbs问好了robomm，然后周三下午请假去买了猫粮，和一些猫用的东西。周四，我和她联系，问我晚上什么时候过去，让我郁闷的是，她说今天晚上不行。。。。。。 郁闷之极 既然不行，我说那就周五吧，而且我想周五也刚好，抱回来是周末，也好照顾一下她。周五也就是今天了。今天我们部门搬到楼上，从早上9点开始，一直忙到下午6点，还有一些东西没有搞定，不过只能周一了。中午吃完饭我给他发短信问我什么时候过去，后来我就去忙了，结果他给我发的消息我没有看到，后来他给我打电话，然后我们说好了过去的时间，不过中间她问我给大猫买了多少东西，我说6听。然后他就表现出很失望的样子，我立刻郁闷了。。。 我说如果你觉得我买的少了，不够诚心的话，那就算了，我也就不过去了。后来反正两个人jjww了半天，还是说好过去了。 喜悦之初 没想到搬家忙到了6点，这一天我就中午吃饭的时候喝了口水，而且一直搬桌子柜子，脚都疼死了，连坐一下都没有时间，不过总算是忙完了。 站在地铁里面，我的脚一直在疼，想相还要走那么远，稍有点不爽。 到了她家，门口有只黄色的大猫，跑来跑去的，据说他们有三只大猫。还有两只就是现在丁丁（我听他们喊他丁丁，我觉得也挺好听的，而且他确实很小不点，wy还说像只老鼠，呵呵，就这么叫吧 :p）的父母了。 万晓飞给我在沙发下面摸了半天，把丁丁给我摸了出来，呵呵，小不点，然后头顶有点淡黄色的毛，非常可爱。我看到这只小猫，之前的郁闷全都没有啦，哈哈。据说这只猫的眼睛是鸳鸯眼，反正我也不懂了。。。(to be continued…) 无题(2) 说在前面的话 偶得小丁丁的名字在我叫了两天之后，终于没有能顶得住大家的压力，改名叫毛毛啦，小名就叫小毛好了，赫赫。事情是这样的，小猫抱回来之后，大家就开始给她起名字了，如下：小白、小黑、毛球、小红，我一看这可不行啊，而且关键是丁丁大家都不大同意阿，没法子，就叫毛毛吧，其实我一开始就打算叫这个的。这个名字好歹赢得了几个人的同意，赫赫。 继续上次的话题 把小毛塞到包里，我就急急忙忙的出来了。小毛一到包里，就开始喵喵叫个不停，声音很细，可是一直叫，我抱着包，然后赶紧跑出来打了个车就杀回来了。跑上楼，打开包，小毛不叫了，开始环视周围环境，哈哈，肯定吓了一跳。 家有小毛 赶紧给他准备猫粮、猫砂、水、小窝什么的，准备妥当之后，才想起来，我还没有吃饭呢，搬家搬了一天，脚后跟都疼死了。烧水煮了点面，吃完面发现小家伙不见了，喊了半天也没有反映，想想可能钻床地了。床下好多东西，掏了半天才看到，摸出来后，小家伙一溜烟，又跑到下面去了，呵呵，把我郁闷的，再次摸出来后，我就把东西都靠里面的墙边放，这样他就算再跑进去也容易够了。后来还是xh给猫的小窝上面盖了一件衣服，放进去之后小毛才算老实了，在里面呆着，哈哈，原来他是害羞阿。刚抱回来的时候给她拍了几张相片，不过没敢用闪光灯，怕吓着他，所以比较模糊，呵呵，感兴趣的可以到我的ftp上面下。 一个星期左右 现在小毛抱回来大概一个星期左右了吧，刚开始那两天天气比较冷，我这里暖气不是很足，我担心他冻着，所以就把他抱到被子里面呆了两个晚上。后来那几天转暖和了，而且我发现她的眼屎特别严重，怀疑是晚上太热所致，所以后来几天就没有让他钻了。晚上她老是要从被子的边角往里面跑，往往是我每次醒来都会发现他已经在被子里了，然后就把他抱出去，下一次醒来就又来了，呵呵，一点办法都没有。不过这几天发现小家伙懂事多了，困了会爬到你的腿上睡一会，玩一会，要不然就会爬到自己的窝里面睡，晚上也比较少钻被子了。呵呵。 尾声 就说这些了吧，我觉得养一只小猫也没有说的那么恐怖了，你只要让他找到了吃饭喝水方便的地方，基本上就不用你管了，他要是什么找不到，就会和你喵喵的叫得，你要是听到了就把他抱到吃饭喝水的地方，他自己就会去解决了。至于洗澡、打针、剪指甲之类的事情也不是天天都有，所以还是比较省心的，呵呵。 说在后面的话 就是既然上一次的标题用丁丁历险记了，这次还是继续吧，哈哈。]]></description>
			<content:encoded><![CDATA[<p>一个老文，从 buaa bbs 翻出来，贴这里吧</p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">无题(1)</h2>
<div id="outline-container-1-1" class="outline-3">
<h3 id="sec-1-1">序曲</h3>
<div id="text-1-1" class="outline-text-3">
<p>好久以前就想养只猫了，可是条件不允许。没法子，只能看看别人pp的小猫过过瘾了。</p>
<p>去年冬天的时候，养猫的欲望越来越严重，以至于那个时候就找robomm定了一个，其间小叶子还和我说要是想养的话可以给我找人抱一只。呵呵，不过后来robomm的大猫好像没有怀孕，结果空欢喜一场。再后来就要过年了，因为照顾起来也不方便，所以就放弃了。过年来了我就在打算抱只小猫了。开始本来打算找宠物市场买一只，可是robomm的那片文章，让我放弃了这个念头，trademark一只在怂恿我去买一只，不过还好我能顶得住，呵呵。平时也不去什么猫的论坛，那就只好让robomm给我留意一下啦，呵呵。</p>
</div>
</div>
<div id="outline-container-1-2" class="outline-3">
<h3 id="sec-1-2">联系</h3>
<div id="text-1-2" class="outline-text-3">
<p>robomm给我介绍的我联系过两个，其中有一个只是发email问了问相片，不过他好久才给我回的，他给我回信时，我都已经和另外一个谈好了，呵呵，那个就是万晓飞。我介绍了我的情况之后，她说可以给我，不过有个条件，就是要送她的大猫一些猫粮，说为了让我付出点代价，这样我至少不会随便处理掉猫猫，我想都没想说没问题，然后就这么说定了。第一眼看到这些小猫的相片的时候，他们还不点大，其实也比现在大不了多少，非常可爱。而我尤其喜欢那个头上有点黑毛的小猫，之后的联系中她也同意给我那只了。高兴中，我就在bbs上面发了帖子，给大家看，那个就是我要的猫。:p</p>
</div>
</div>
<div id="outline-container-1-3" class="outline-3">
<h3 id="sec-1-3">郁闷之初</h3>
<div id="text-1-3" class="outline-text-3">
<p>因为没有满月，所以要等1，2个星期才行。上周一我给他发了个mail问小猫的事情，周二他给我打电话，说我可以过去拿了，不过告诉我那只说好了留给我的给她姐姐了，当时我很郁闷。后来一想，还不都一样啊，呵呵，我说那就拿起他的吧，没关系。然后就说起送大猫什么猫粮的事情来，然后他就说周一有个小mm花了80多块钱的猫粮，其实也就值40多，被骗了。所以让我买罐头好了，7块钱一听。也差不了那么多。期间我也没有问我需要买多少，因为我想，既然都这么联系好了，那多少还不是一个形式而已？而她也一再表示她不是要卖钱。从后来接触中听她的口气，她确实应该不缺钱，北京的有钱人。</p>
<p>没有订到我想要的那个，多少也有点郁闷吧，不过这还好。</p>
</div>
</div>
<div id="outline-container-1-4" class="outline-3">
<h3 id="sec-1-4">郁闷之中</h3>
<div id="text-1-4" class="outline-text-3">
<p>周二她说我工作日晚上都可以过去吧，我说我还没有准备好猫用的东西，所以周三我需要去买点东西，周四吧，她说可以。周二晚上我来bbs问好了robomm，然后周三下午请假去买了猫粮，和一些猫用的东西。周四，我和她联系，问我晚上什么时候过去，让我郁闷的是，她说今天晚上不行。。。。。。</p>
</div>
</div>
<div id="outline-container-1-5" class="outline-3">
<h3 id="sec-1-5">郁闷之极</h3>
<div id="text-1-5" class="outline-text-3">
<p>既然不行，我说那就周五吧，而且我想周五也刚好，抱回来是周末，也好照顾一下她。周五也就是今天了。今天我们部门搬到楼上，从早上9点开始，一直忙到下午6点，还有一些东西没有搞定，不过只能周一了。中午吃完饭我给他发短信问我什么时候过去，后来我就去忙了，结果他给我发的消息我没有看到，后来他给我打电话，然后我们说好了过去的时间，不过中间她问我给大猫买了多少东西，我说6听。然后他就表现出很失望的样子，我立刻郁闷了。。。</p>
<p>我说如果你觉得我买的少了，不够诚心的话，那就算了，我也就不过去了。后来反正两个人jjww了半天，还是说好过去了。</p>
</div>
</div>
<div id="outline-container-1-6" class="outline-3">
<h3 id="sec-1-6">喜悦之初</h3>
<div id="text-1-6" class="outline-text-3">
<p>没想到搬家忙到了6点，这一天我就中午吃饭的时候喝了口水，而且一直搬桌子柜子，脚都疼死了，连坐一下都没有时间，不过总算是忙完了。</p>
<p>站在地铁里面，我的脚一直在疼，想相还要走那么远，稍有点不爽。</p>
<p>到了她家，门口有只黄色的大猫，跑来跑去的，据说他们有三只大猫。还有两只就是现在丁丁（我听他们喊他丁丁，我觉得也挺好听的，而且他确实很小不点，wy还说像只老鼠，呵呵，就这么叫吧 :p）的父母了。</p>
<p>万晓飞给我在沙发下面摸了半天，把丁丁给我摸了出来，呵呵，小不点，然后头顶有点淡黄色的毛，非常可爱。我看到这只小猫，之前的郁闷全都没有啦，哈哈。据说这只猫的眼睛是鸳鸯眼，反正我也不懂了。。。(to be continued…)</p>
</div>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">无题(2)</h2>
<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>偶得小丁丁的名字在我叫了两天之后，终于没有能顶得住大家的压力，改名叫毛毛啦，小名就叫小毛好了，赫赫。事情是这样的，小猫抱回来之后，大家就开始给她起名字了，如下：小白、小黑、毛球、小红，我一看这可不行啊，而且关键是丁丁大家都不大同意阿，没法子，就叫毛毛吧，其实我一开始就打算叫这个的。这个名字好歹赢得了几个人的同意，赫赫。</p>
</div>
</div>
<div id="outline-container-2-2" class="outline-3">
<h3 id="sec-2-2">继续上次的话题</h3>
<div id="text-2-2" class="outline-text-3">
<p>把小毛塞到包里，我就急急忙忙的出来了。小毛一到包里，就开始喵喵叫个不停，声音很细，可是一直叫，我抱着包，然后赶紧跑出来打了个车就杀回来了。跑上楼，打开包，小毛不叫了，开始环视周围环境，哈哈，肯定吓了一跳。</p>
</div>
</div>
<div id="outline-container-2-3" class="outline-3">
<h3 id="sec-2-3">家有小毛</h3>
<div id="text-2-3" class="outline-text-3">
<p>赶紧给他准备猫粮、猫砂、水、小窝什么的，准备妥当之后，才想起来，我还没有吃饭呢，搬家搬了一天，脚后跟都疼死了。烧水煮了点面，吃完面发现小家伙不见了，喊了半天也没有反映，想想可能钻床地了。床下好多东西，掏了半天才看到，摸出来后，小家伙一溜烟，又跑到下面去了，呵呵，把我郁闷的，再次摸出来后，我就把东西都靠里面的墙边放，这样他就算再跑进去也容易够了。后来还是xh给猫的小窝上面盖了一件衣服，放进去之后小毛才算老实了，在里面呆着，哈哈，原来他是害羞阿。刚抱回来的时候给她拍了几张相片，不过没敢用闪光灯，怕吓着他，所以比较模糊，呵呵，感兴趣的可以到我的ftp上面下。</p>
</div>
</div>
<div id="outline-container-2-4" class="outline-3">
<h3 id="sec-2-4">一个星期左右</h3>
<div id="text-2-4" class="outline-text-3">
<p>现在小毛抱回来大概一个星期左右了吧，刚开始那两天天气比较冷，我这里暖气不是很足，我担心他冻着，所以就把他抱到被子里面呆了两个晚上。后来那几天转暖和了，而且我发现她的眼屎特别严重，怀疑是晚上太热所致，所以后来几天就没有让他钻了。晚上她老是要从被子的边角往里面跑，往往是我每次醒来都会发现他已经在被子里了，然后就把他抱出去，下一次醒来就又来了，呵呵，一点办法都没有。不过这几天发现小家伙懂事多了，困了会爬到你的腿上睡一会，玩一会，要不然就会爬到自己的窝里面睡，晚上也比较少钻被子了。呵呵。</p>
</div>
</div>
<div id="outline-container-2-5" class="outline-3">
<h3 id="sec-2-5">尾声</h3>
<div id="text-2-5" class="outline-text-3">
<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>就是既然上一次的标题用丁丁历险记了，这次还是继续吧，哈哈。</p>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/about-mao/feed/</wfw:commentRss>
		<slash:comments>1</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>hive 里面的 UDTF</title>
		<link>http://wdicc.com/udf-in-hive/</link>
		<comments>http://wdicc.com/udf-in-hive/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 13:04:00 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[hive]]></category>

		<guid isPermaLink="false">http://wdicc.com/?p=806</guid>
		<description><![CDATA[hive 支持 UDF， UDAF， UDTF，这几个让你使用 hive 更加便捷。 UDF udf 就是一个自定义的 function，输入一个或多个参数，返回一个返回值，类似 substr/trim 之类。写起来比较简单，重构 UDF 类的 evaluate 方法就可以了。可以参考 http://richiehu.blog.51cto.com/2093113/386112 。 这是一个 urldecode 函数。 package com.wd.hive.udf; &#160; import org.apache.hadoop.hive.ql.exec.UDF; import java.net.URLDecoder; &#160; public final class urldecode extends UDF &#123; &#160; public String evaluate&#40;final String s&#41; &#123; if &#40;s == null&#41; &#123; return null; &#125; return getString&#40;s&#41;; &#125; [...]]]></description>
			<content:encoded><![CDATA[<p>hive 支持 UDF， UDAF， UDTF，这几个让你使用 hive 更加便捷。</p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">UDF</h2>
<div id="text-1" class="outline-text-2">
<p>udf 就是一个自定义的 function，输入一个或多个参数，返回一个返回值，类似 substr/trim 之类。写起来比较简单，重构 UDF 类的 evaluate 方法就可以了。可以参考 <a href="http://richiehu.blog.51cto.com/2093113/386112">http://richiehu.blog.51cto.com/2093113/386112</a> 。</p>
<p>这是一个 urldecode 函数。</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">package</span> <span class="co2">com.wd.hive.udf</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.ql.exec.UDF</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.net.URLDecoder</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw1">final</span> <span class="kw1">class</span> urldecode <span class="kw1">extends</span> UDF <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> evaluate<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> s<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span>s <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span> <span class="br0">&#125;</span>
        <span class="kw1">return</span> getString<span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw1">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getString<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> s<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> a<span class="sy0">;</span>
        <span class="kw1">try</span> <span class="br0">&#123;</span>
            a <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aurldecoder+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">URLDecoder</span></a>.<span class="me1">decode</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            a <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
        <span class="kw1">return</span> a<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> args<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> t <span class="sy0">=</span> <span class="st0">&quot;%E5%A4%AA%E5%8E%9F-%E4%B8%89%E4%BA%9A&quot;</span><span class="sy0">;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span> getString<span class="br0">&#40;</span>t<span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">UDAF</h2>
<div id="text-2" class="outline-text-2">
<p>udaf 就是自定义的聚合函数，类似 sum/avg 这类，输入多行的一个或多个参数，返回一个返回值。这个还没写过，可以参考 <a href="http://richiehu.blog.51cto.com/2093113/386113">http://richiehu.blog.51cto.com/2093113/386113</a> 。</p>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">UDTF</h2>
<div id="text-3" class="outline-text-2">
<p>udtf 是针对输入一行，输出多行的需求来的，类似 explode 函数。可以参考 <a href="http://www.linezing.com/blog/?p=323">http://www.linezing.com/blog/?p=323</a> 。</p>
<p>这个是输入数组字段，输出两列，一列是数组元素的位置，一列是数组元素。比 explode 多了一列位置，不过数组元素只能是 String 类型的。</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">package</span> <span class="co2">com.wd.hive.udf</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">import</span> <span class="co2">java.util.ArrayList</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.List</span><span class="sy0">;</span>
&nbsp;
<span class="co1">//import org.apache.hadoop.io.Text;</span>
&nbsp;
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.ql.udf.generic.GenericUDTF</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.ql.exec.UDFArgumentException</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.ql.exec.description</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.ql.metadata.HiveException</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">import</span> <span class="co2">org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory</span><span class="sy0">;</span>
&nbsp;
@description<span class="br0">&#40;</span>
        name <span class="sy0">=</span> <span class="st0">&quot;explodeWithPos&quot;</span>,
        value <span class="sy0">=</span> <span class="st0">&quot;_FUNC_(a) - separates the elements of array a into multiple rows with pos as first col &quot;</span>
        <span class="br0">&#41;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw1">class</span> explodeWithPos <span class="kw1">extends</span> GenericUDTF <span class="br0">&#123;</span>
&nbsp;
    ListObjectInspector listOI <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span>
&nbsp;
    @Override
        <span class="kw1">public</span> <span class="kw4">void</span> close<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> HiveException<span class="br0">&#123;</span>
        <span class="br0">&#125;</span>
&nbsp;
    @Override
        <span class="kw1">public</span> StructObjectInspector initialize<span class="br0">&#40;</span>ObjectInspector <span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="kw1">throws</span> UDFArgumentException <span class="br0">&#123;</span>
&nbsp;
            <span class="kw1">if</span> <span class="br0">&#40;</span>args.<span class="me1">length</span> <span class="sy0">!=</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">throw</span> <span class="kw1">new</span> UDFArgumentException<span class="br0">&#40;</span><span class="st0">&quot;explodeWithPos() takes only one argument&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
            <span class="kw1">if</span> <span class="br0">&#40;</span>args<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">getCategory</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> ObjectInspector.<span class="me1">Category</span>.<span class="me1">LIST</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">throw</span> <span class="kw1">new</span> UDFArgumentException<span class="br0">&#40;</span><span class="st0">&quot;explodeWithPos() takes an array as a parameter&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
            listOI <span class="sy0">=</span> <span class="br0">&#40;</span>ListObjectInspector<span class="br0">&#41;</span>args<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarraylist+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ArrayList</span></a> fieldNames <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarraylist+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ArrayList</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarraylist+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ArrayList</span></a> fieldOIs <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarraylist+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ArrayList</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            fieldNames.<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;col1&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="co1">//fieldOIs.add(listOI.getListElementObjectInspector());</span>
            fieldOIs.<span class="me1">add</span><span class="br0">&#40;</span>PrimitiveObjectInspectorFactory.<span class="me1">javaStringObjectInspector</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            fieldNames.<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;col2&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="co1">//fieldOIs.add(listOI.getListElementObjectInspector());</span>
            fieldOIs.<span class="me1">add</span><span class="br0">&#40;</span>PrimitiveObjectInspectorFactory.<span class="me1">javaStringObjectInspector</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">return</span> ObjectInspectorFactory.<span class="me1">getStandardStructObjectInspector</span><span class="br0">&#40;</span>fieldNames, fieldOIs<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="co1">//Object forwardObj[] = new Object[2];</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> forwardObj<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
    @Override
        <span class="kw1">public</span> <span class="kw4">void</span> process<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> <span class="br0">&#91;</span><span class="br0">&#93;</span> o<span class="br0">&#41;</span> <span class="kw1">throws</span> HiveException <span class="br0">&#123;</span>
&nbsp;
            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alist+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">List</span></a> list <span class="sy0">=</span> listOI.<span class="me1">getList</span><span class="br0">&#40;</span>o<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">if</span> <span class="br0">&#40;</span> list <span class="sy0">==</span> <span class="kw2">null</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">return</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
            <span class="kw4">int</span> i <span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
            <span class="kw1">for</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> r <span class="sy0">:</span> list<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                forwardObj<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span>
                forwardObj<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0">=</span> r.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="kw1">this</span>.<span class="me1">forward</span><span class="br0">&#40;</span>forwardObj<span class="br0">&#41;</span><span class="sy0">;</span>
                i<span class="sy0">++;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
    @Override
        <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> toString<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">return</span> <span class="st0">&quot;explodeWithPos&quot;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://wdicc.com/udf-in-hive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

