﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Hallelujah</title><link>http://www.cppblog.com/sh19871122/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 22:49:39 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 22:49:39 GMT</pubDate><ttl>60</ttl><item><title>有效利用标准库提供的type_traits，让程序在编译时作出分支选择</title><link>http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Thu, 28 Apr 2016 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/213383.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/213383.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/213383.html</trackback:ping><description><![CDATA[<div>让程序中的简单if-else在编译期间决定<br /><br />ex.<span style="font-size: 13px; color: #008080;">&nbsp;1</span><span style="font-size: 13px; background-color: #eeeeee;">&nbsp;</span><span style="font-size: 13px; color: #008000;">/*</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;=====================================================================================<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Filename:&nbsp;&nbsp;3.cpp<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Description:&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version:&nbsp;&nbsp;1.0<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Created:&nbsp;&nbsp;03/01/2016&nbsp;11:38:53&nbsp;AM<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Revision:&nbsp;&nbsp;none<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Compiler:&nbsp;&nbsp;gcc<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Author:&nbsp;&nbsp;shih&nbsp;(Hallelujah),&nbsp;sh19871122@gmail.com<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;Organization:&nbsp;&nbsp;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;=====================================================================================<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #008080; ">20</span>&nbsp;#include&nbsp;&lt;stdint.h&gt;<br /><span style="color: #008080; ">21</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">22</span>&nbsp;#include&nbsp;&lt;type_traits&gt;<br /><span style="color: #008080; ">23</span>&nbsp;<br /><span style="color: #008080; ">24</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;is_swapable<br /><span style="color: #008080; ">26</span>&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;value&nbsp;=&nbsp;std::is_integral&lt;T&gt;::value&nbsp;&amp;&amp;&nbsp;<span style="color: #0000FF; ">sizeof</span>(T)&nbsp;&gt;=&nbsp;2;<br /><span style="color: #008080; ">28</span>&nbsp;};<br /><span style="color: #008080; ">29</span>&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">31</span>&nbsp;T&nbsp;byte_swap(T&nbsp;value,&nbsp;std::true_type)<br /><span style="color: #008080; ">32</span>&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;*bytes&nbsp;=&nbsp;reinterpret_cast&lt;uint8_t&nbsp;*&gt;(&amp;value);<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(std::size_t&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;<span style="color: #0000FF; ">sizeof</span>(T)/2;&nbsp;++i)<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;v&nbsp;=&nbsp;bytes[i];<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes[i]&nbsp;=&nbsp;bytes[<span style="color: #0000FF; ">sizeof</span>(T)&nbsp;-&nbsp;1&nbsp;-&nbsp;i];&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes[<span style="color: #0000FF; ">sizeof</span>(T)&nbsp;-1&nbsp;-i]&nbsp;=&nbsp;v;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;value;<br /><span style="color: #008080; ">41</span>&nbsp;}<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">44</span>&nbsp;T&nbsp;byte_swap(T&nbsp;value,&nbsp;std::false_type)<br /><span style="color: #008080; ">45</span>&nbsp;{<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;value;<br /><span style="color: #008080; ">47</span>&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">50</span>&nbsp;T&nbsp;byte_swap(T&nbsp;value)<br /><span style="color: #008080; ">51</span>&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;byte_swap(value,&nbsp;std::integral_constant&lt;<span style="color: #0000FF; ">bool</span>,&nbsp;is_swapable&lt;T&gt;::value&gt;());<br /><span style="color: #008080; ">53</span>&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br /><span style="color: #008080; ">56</span>&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;0x11223344;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;b&nbsp;=&nbsp;0x4455221112345678;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::hex&nbsp;&lt;&lt;&nbsp;a&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;b&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::hex&nbsp;&lt;&lt;&nbsp;byte_swap(a)&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;byte_swap(b)&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;c&nbsp;=&nbsp;0x11;<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*d&nbsp;=&nbsp;"hello&nbsp;world";<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::hex&nbsp;&lt;&lt;&nbsp;byte_swap(c)&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;byte_swap(d)&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">65</span>&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;</div><img src ="http://www.cppblog.com/sh19871122/aggbug/213383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2016-04-28 17:50 <a href="http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CentOS 7安装EPEL Repo</title><link>http://www.cppblog.com/sh19871122/archive/2014/10/22/208647.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Tue, 21 Oct 2014 23:56:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/10/22/208647.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/208647.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/10/22/208647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/208647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/208647.html</trackback:ping><description><![CDATA[安装额外的EPEL仓库<br /><pre style="padding: 0.667em 0.917em; margin-top: 0px; margin-bottom: 1.833em; border: 1px solid #dddddd; overflow: auto; clear: both; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.857em; line-height: 1.5em; color: #111111; background: #eeeeee;"><span style="padding: 0px; margin: 0px; color: #c20cb9; font-weight: bold;">wget</span> https://dl.fedoraproject.org/pub/epel/<span style="padding: 0px; margin: 0px; color: #000000;">7</span>/x86_64/e/epel-release<span style="padding: 0px; margin: 0px; color: #000000;">-7</span><span style="padding: 0px; margin: 0px; color: #000000;">-2</span>.noarch.rpm</pre><pre style="padding: 0.667em 0.917em; margin-top: 0px; margin-bottom: 1.833em; border: 1px solid #dddddd; overflow: auto; clear: both; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.857em; line-height: 1.5em; color: #111111; background: #eeeeee;">yum <span style="padding: 0px; margin: 0px; color: #c20cb9; font-weight: bold;">install</span> epel-release<span style="padding: 0px; margin: 0px; color: #000000;">-7</span><span style="padding: 0px; margin: 0px; color: #000000;">-2</span>.noarch.rpm</pre>安装后就可以安装R等了<br /><br /><br /><img src ="http://www.cppblog.com/sh19871122/aggbug/208647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-10-22 07:56 <a href="http://www.cppblog.com/sh19871122/archive/2014/10/22/208647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Python通过Hive的Streaming来写UDF的一些记录</title><link>http://www.cppblog.com/sh19871122/archive/2014/09/12/208279.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Fri, 12 Sep 2014 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/09/12/208279.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/208279.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/09/12/208279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/208279.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/208279.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近使用Hive来统计数据，用了pyhs2来实现查询，但是有些复杂的处理比如，自定义对域名的处理等，不能通过hql来实现，发现能够使用udf。<br />
<br />
&nbsp; &nbsp; &nbsp; Java来实现Hive的写法<span style="font-size: 13px; color: #008080;">&nbsp;</span><span style="font-size: 13px; background-color: #eeeeee;"><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #0000FF; ">package</span>&nbsp;jsl.hive.udf;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.hadoop.hive.ql.exec.UDF;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.hadoop.io.Text;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DomainRoot&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;UDF&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Text&nbsp;evaluate(Text&nbsp;s)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(s&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tmp&nbsp;=&nbsp;s.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.getDomainRoot(tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Text(tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;getDomainRoot(String&nbsp;domain)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;NoneImplementException("xxxx");<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />}</div><br />如果Java的UDF需要当成常用的，不用每次add可以注册到Hive中，<br /><div>ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java中加入<br /><div>registerUDF("domain_root", UDFParseUrl.class, false);并重新编译hive即可<br /><br /><br />&nbsp; &nbsp;下面来说说重点，通过Streaming用Python来写处理。<br />&nbsp; &nbsp;关于Streaming的基础内容：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><img id="Code_Closed_Image_103933" onclick="this.style.display='none'; Code_Closed_Text_103933.style.display='none'; Code_Open_Image_103933.style.display='inline'; Code_Open_Text_103933.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="display: none;"><img id="Code_Open_Image_103933" style="display: none" onclick="this.style.display='none'; Code_Open_Text_103933.style.display='none'; Code_Closed_Image_103933.style.display='inline'; Code_Closed_Text_103933.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_103933" style="border: 1px solid #808080; display: none; background-color: #ffffff;"></span><span id="Code_Open_Text_103933" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->使用Transform来指定列，以及使用AS来指定生成的列以及可以指定转换生成列的类型<br />hive&gt;&nbsp;select&nbsp;transform(col1,&nbsp;clo2)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&gt;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;'/bin/cat'&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;(new_clo1&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;new_clo2&nbsp;<span style="color: #0000FF; ">double</span>)&nbsp;from&nbsp;table;<br /></span></div><br />&nbsp; &nbsp;约束：首先必须add file到hive中（当python中引用了其他如自己写的模块时，也需要一并add进去）<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 其次非常不幸,在单独的一个查询中，不能够使用UDAF的函数如sum()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 再次不得为中间结果数据使用cluster by或distribute by<br /><br />注意：对于优化查询，使用cluster by或distribute by 和sort by一起非常重要<br /><br /></div></div><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"></div><img src ="http://www.cppblog.com/sh19871122/aggbug/208279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-09-12 11:41 <a href="http://www.cppblog.com/sh19871122/archive/2014/09/12/208279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编译期契约之must_have_base</title><link>http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Tue, 29 Jul 2014 04:25:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/207853.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/207853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/207853.html</trackback:ping><description><![CDATA[在C++中不直接支持约束，用过C#模板的有个where来处理，但是C++中也有些小的技巧来处理。<br />在不完美C++中的must_have_base如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />template&lt;typename&nbsp;D,&nbsp;typename&nbsp;B&gt;<br /><span style="color: #0000FF; ">struct</span>&nbsp;must_have_base<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;~must_have_base()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*p)(D*,&nbsp;B*)&nbsp;=&nbsp;constraints;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;constraints(D&nbsp;*pd,&nbsp;B&nbsp;*pb)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pb&nbsp;=&nbsp;pd;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />原理是通过不执行的成员函数把函数指针在析构函数中赋值，强迫编译器在编译期间检查成员函数内的约束。 &nbsp;</div><br />自己写了个小的实例，虽然这儿有点点牵强，但是，很多情况也需要检查是否是某种类型的子类型的时候还是可以的，<br />完整代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;template&lt;typename&nbsp;D,&nbsp;typename&nbsp;B&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;must_have_base<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~must_have_base()<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*p)(D*,&nbsp;B*)&nbsp;=&nbsp;constraints;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">private</span>:<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;constraints(D&nbsp;*pd,&nbsp;B&nbsp;*pb)<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pb&nbsp;=&nbsp;pd;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;};<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;<span style="color: #0000FF; ">base</span><br /><span style="color: #008080; ">18</span>&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~<span style="color: #0000FF; ">base</span>()&nbsp;{}<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">23</span>&nbsp;};<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;inherit_base:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">base</span><br /><span style="color: #008080; ">26</span>&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">32</span>&nbsp;};<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;inherit_not_base&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;};<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;test<br /><span style="color: #008080; ">44</span>&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;testfunc(T&nbsp;&amp;t)<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;must_have_base&lt;T,&nbsp;<span style="color: #0000FF; ">base</span>&gt;();<br /><span style="color: #008080; ">50</span>&nbsp;<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.run();<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;};<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()<br /><span style="color: #008080; ">56</span>&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;t_ok,&nbsp;t_nok;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inherit_base&nbsp;hb;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inherit_not_base&nbsp;hnb;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_ok.testfunc(hb);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_nok.testfunc(hnb);<br /><span style="color: #008080; ">62</span>&nbsp;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">64</span>&nbsp;}</div>抛砖引玉，希望这些东西都能用在实际的工程代码中。<img src ="http://www.cppblog.com/sh19871122/aggbug/207853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-07-29 12:25 <a href="http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vagrant启动自己CentOS的时候出现文件夹不能正常挂载</title><link>http://www.cppblog.com/sh19871122/archive/2014/06/05/207194.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Thu, 05 Jun 2014 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/06/05/207194.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/207194.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/06/05/207194.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/207194.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/207194.html</trackback:ping><description><![CDATA[解决办法：<br />$ vagrant plugin install vagrant-vbguest<br />$ vagrang reload<br /><br /><br />reload会重新编译vbox的additions，然后mount就能成功了<br />我的环境是CentOS 6.5，在yum中开启了kernel更新的，默认是exclude=kernel*<br /><br />这是别人给的解决方案：<br /><pre style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Monaco, Courier, monospace; font-size: 13px; margin-top: 15px; border: 1px solid #dddddd; line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; color: #333333; margin-bottom: 0px !important; background-color: #f8f8f8;"><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Monaco, Courier, monospace; font-size: 12px; margin: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 0px; word-wrap: normal; display: inline; line-height: inherit; background: transparent;">vagrant up; vagrant ssh -c 'sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions'; vagrant reload</code></pre><img src ="http://www.cppblog.com/sh19871122/aggbug/207194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-06-05 11:16 <a href="http://www.cppblog.com/sh19871122/archive/2014/06/05/207194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>kivy的第一步------安装，与IDEA共同开发</title><link>http://www.cppblog.com/sh19871122/archive/2014/05/18/207008.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Sun, 18 May 2014 12:35:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/05/18/207008.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/207008.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/05/18/207008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/207008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/207008.html</trackback:ping><description><![CDATA[环境：Windows 7 64bits，IDE:IntelliJ IDEA 13.1.2<br />安装kivy：1. 下载安装包http://kivy.org/#download，我使用的是Python 2.7.6，选择的2.7版本（注意此版本是32位Python）<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2. 解压到一个目录，我在我的系统环境变量中将根目录命名为了KIVY_ROOT<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3. 虽然kivy中自带了Python的，可以直接使用，也可以自己安装，我是自己下载的Python 2.7.6（记得一定是32位，不然后面写程序会出问题）<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4. 如果机器以前没安装git的，可以直接使用KIVY中带的mingw，我自己机器安装了git，所以环境变量就没设置mingw的<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5. 设置环境变量，GST_REGISTRY=%KIVY_ROOT%gstreamer\registry.bin<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GST_PLUGIN_PATH=%KIVY_ROOT%gstreamer\lib\gstreamer-1.0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PATH变量中加入了%KIVY_ROOT%;%KIVY_ROOT%tools;%KIVY_ROOT%gstreamer\bin;（还有Python的mingw的）<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最后，需要在PYTHONPATH中加入%KIVY_ROOT%kivy<br />最后写入第一个程序来测试：<br />代码如下<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;-*-&nbsp;coding:utf-8&nbsp;-*-</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">/user/bin/env&nbsp;python</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #800080; ">__author__</span>&nbsp;=&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">shih</span><span style="color: #800000; ">'</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;kivy.app&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;App<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Hello(App):<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">pass</span><br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #800080; ">__name__</span>&nbsp;==&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">"</span>:<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello().run()</div>执行结果如下：<br /><img src="http://www.cppblog.com/images/cppblog_com/sh19871122/kivy_hello.png" width="1306" height="672" alt="" /><br /><br /><img src ="http://www.cppblog.com/sh19871122/aggbug/207008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-05-18 20:35 <a href="http://www.cppblog.com/sh19871122/archive/2014/05/18/207008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python特殊方法的操作符重载表</title><link>http://www.cppblog.com/sh19871122/archive/2014/04/14/206575.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Mon, 14 Apr 2014 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/04/14/206575.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/206575.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/04/14/206575.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/206575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/206575.html</trackback:ping><description><![CDATA[<div>不知道里面怎么弄表格，就上传图片了<br /><img src="http://www.cppblog.com/images/cppblog_com/sh19871122/Python语言杂项.png" width="936" height="993" alt="" /><br />如果用户自定义的类，想有add功能，如果类没提供__add__或__radd__方法的话，会抛出异常<br />再如，if xxxobj:默认是如果xxxobj不是None则为True，否则为False，如果不是这个逻辑则可以通过实现__bool__方法(自己的测试中2.7需要再加上__nonzero__()方法，3.2中直接就行)<br /><br /></div><img src ="http://www.cppblog.com/sh19871122/aggbug/206575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-04-14 11:38 <a href="http://www.cppblog.com/sh19871122/archive/2014/04/14/206575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zeromq学习，第一章</title><link>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Sun, 16 Mar 2014 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/206194.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/206194.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/206194.html</trackback:ping><description><![CDATA[Asynchronous Input/Output（AIO）：AIO可以在input/output的请求到来之前继续执行。AIO在实时应用程序中是必须的。使用AIO可以映射多个任务到一个线程上去。<br />首先zeromq的设计是弱中间人的（brokerless，相对于ActiveMQ、RabbitMQ等,使用0zq的程序就可以直接和其他的节点通信而不通过broker的代理。），zeromq不会存储信息到磁盘上，然而可能使用本地的交换文件来存储消息（当设置了zmq.SWAP时）。<br /><br />示例：HelloWorld（server）<br /> <br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_230816" onclick="this.style.display='none'; Code_Closed_Text_230816.style.display='none'; Code_Open_Image_230816.style.display='inline'; Code_Open_Text_230816.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_230816" style="display: none" onclick="this.style.display='none'; Code_Open_Text_230816.style.display='none'; Code_Closed_Image_230816.style.display='inline'; Code_Closed_Text_230816.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_230816" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">server</span><span id="Code_Open_Text_230816" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;zmq.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*context&nbsp;=&nbsp;zmq_ctx_new();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*respond&nbsp;=&nbsp;zmq_socket(context,&nbsp;ZMQ_REQ);<br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_bind(respond,&nbsp;"tcp://*:4040");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("starting<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;request;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init(&amp;request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_recv(&amp;request,&nbsp;respond,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("received:&nbsp;%s\n",&nbsp;zmq_msg_data(&amp;request));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;reply;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init_size(&amp;reply,&nbsp;strlen("world"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(zmq_msg_data(&amp;reply),&nbsp;"world",&nbsp;5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_send(&amp;reply,&nbsp;respond,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;reply);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_close(respond);<br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_ctx_destroy(context);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /></span></div><br />示例：Helloworld（client）<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_230951" onclick="this.style.display='none'; Code_Closed_Text_230951.style.display='none'; Code_Open_Image_230951.style.display='inline'; Code_Open_Text_230951.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_230951" style="display: none" onclick="this.style.display='none'; Code_Open_Text_230951.style.display='none'; Code_Closed_Image_230951.style.display='inline'; Code_Closed_Text_230951.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_230951" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">client</span><span id="Code_Open_Text_230951" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;&lt;unistd.h&gt;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;&lt;zmq.h&gt;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*context&nbsp;=&nbsp;zmq_ctx_new();<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("client&nbsp;starting<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*request&nbsp;=&nbsp;zmq_socket(context,&nbsp;ZMQ_REQ);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_connect(request,&nbsp;"tcp://localhost:4040");<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;;)<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;req;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init_size(&amp;req,&nbsp;strlen("hello"));<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(zmq_msg_data(&amp;req),&nbsp;"hello",&nbsp;5);<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("send&nbsp;msg&nbsp;hello,&nbsp;count&nbsp;=&nbsp;%d\n",&nbsp;count);<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_send(&amp;req,&nbsp;request,&nbsp;0);<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;req);<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;reply;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init(&amp;reply);<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_recv(&amp;reply,&nbsp;request,&nbsp;0);<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("recv&nbsp;msg&nbsp;%s,&nbsp;count&nbsp;=&nbsp;%d\n",&nbsp;zmq_msg_data(&amp;reply),&nbsp;count);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;reply);<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_close(request);<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_ctx_destroy(context);<br /><span style="color: #008080; ">36</span>&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">38</span>&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;</span></div><br />这里使用了最基本的请求应答架构。详细解析代码：<br />第一步：创建了context和socket，zmq_ctx_new方法创建了一个新的<span style="color: red;">context，这是线程安全</span>的，即一个context可用于多个线程操作。 zmq_socket方法创建了一个在context中定义的socket，<span style="color: red;">ZeroMQ的socket不是线程安全</span>。传统的socket是同步的，然而ZMQ的socket在客户端和服务端都维护了一个队列来管理request-reply的异步模式。ZMQ自动的处理连接、重连、断开连接和内容交付。<br />服务端创建了Reply（ZMQ_REP）用来处理接收消息并应答消息。如果客户端和服务端遗失（lost），应答的消息将在没有任何通知的情况下丢掉。<br />客户端创建了一个Request(ZMQ_REQ)来发送消息并接收来自服务的应答。ZMQ_REQ下不会丢弃任何信息，不管是没有没有可用与发送消息的服务或是服务处于忙状态，所有的发送操作zmq_send函数会阻塞，直到一个服务变为可用于发送消息。ZMQ_REQ和ZMQ_REP、ZMQ_ROUTER类型兼容。<br />消息的发送zmq_send函数的第三个参数是flags，是ZMQ_DONTWAIT或ZMQ_SNDMORE。ZMQ_DONTWAIT表明消息是异步的发送。ZMQ_SNDMORE表明消息有多部分，其余的部分已经&#8220;在路上了&#8221;。消息接收函数zmq_msg_recv函数，如服务端，在先前接收的消息是无效的。第三个参数flugs可能是ZMQ_DONTWAIT。<br /><br />先睡觉了<img src ="http://www.cppblog.com/sh19871122/aggbug/206194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-03-16 23:41 <a href="http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python的参数解包小技巧（使用容器作为参数时）</title><link>http://www.cppblog.com/sh19871122/archive/2013/12/31/205078.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Tue, 31 Dec 2013 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2013/12/31/205078.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/205078.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2013/12/31/205078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/205078.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/205078.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;args_unpacking_test(x,&nbsp;y):<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">x&nbsp;=&nbsp;</span><span style="color: #800000; ">'</span>,&nbsp;x,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">&nbsp;y&nbsp;=&nbsp;</span><span style="color: #800000; ">'</span>,&nbsp;y<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;A&nbsp;=&nbsp;namedtuple(<span style="color: #800000; ">'</span><span style="color: #800000; ">A</span><span style="color: #800000; ">'</span>,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">y&nbsp;x</span><span style="color: #800000; ">'</span>)<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;list_foo&nbsp;=&nbsp;[3,&nbsp;4]<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;tuple_foo&nbsp;=&nbsp;(3,&nbsp;4)<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;ntuple_foo&nbsp;=&nbsp;A(4,&nbsp;3)<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;dict_foo&nbsp;=&nbsp;{<span style="color: #800000; ">'</span><span style="color: #800000; ">y</span><span style="color: #800000; ">'</span>:4,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">x</span><span style="color: #800000; ">'</span>:3}<br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;args_unpacking_test(*list_foo)<br /><span style="color: #008080; ">13</span>&nbsp;args_unpacking_test(*tuple_foo)<br /><span style="color: #008080; ">14</span>&nbsp;args_unpacking_test(*ntuple_foo)<br /><span style="color: #008080; ">15</span>&nbsp;args_unpacking_test(**dict_foo)<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;他们的结果输出都是一样的<br /><br />这个方式处理非常有用，如果参数个数不一致的话会报错</div><img src ="http://www.cppblog.com/sh19871122/aggbug/205078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2013-12-31 11:07 <a href="http://www.cppblog.com/sh19871122/archive/2013/12/31/205078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle的编程准备工作：搭建本地的基本环境</title><link>http://www.cppblog.com/sh19871122/archive/2013/12/17/204860.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Tue, 17 Dec 2013 12:16:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2013/12/17/204860.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/204860.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2013/12/17/204860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/204860.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/204860.html</trackback:ping><description><![CDATA[首先下载Instant Client，我下载的11.2<br /><br /><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;">下载的文件包括如下列表：<br />1. instantclient-basic-nt-11.2.0.3.0.zip<br />2. instantclient-odbc-nt-11.2.0.3.0.zip<br />3. instantclient-sdk-nt-11.2.0.3.0.zip<br />4. instantclient-sqlplus-nt-11.2.0.3.0.zip<br />5. instantclient-tools-nt-11.2.0.3.0.zip</blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;">最后两个随便了，解压文件到instantclient_11_2目录中<br /><br /></blockquote>命令行下到解压的目录instantclient_11_2中执行&gt;odbc_install<br /><br />在环境变量中的系统变量PATH中加入instantclient_11_2目录的全路径<br /><br />创建一个用户变量ORACLE_HOME，指向ic的安装目录，这点很关键，特别是用cmake编译soci，并需要支持Oracle的话。<br /><br />在ic目录中创建network/admin目录，并加入OCI的.ora文件，在环境变量中加入TNS_ADMIN来指定刚才创建的目录<br /><br />创建一个用户变量NLS_LANG来设置语言，我的设置是SIMPLIFIED CHINESE_CHINA.ZHS16GBK，这个要和数据库那边一致？<br /><br />创建一个用户变量SQLPATH来指定sqlpath工具的文件路径，下载的第四个文件<br /><br />OK，所有安装就此。<br /><br />再安装Oracle的访问工具，我使用的是Navicat for Oracle工具<br />1. 普通安装<br />2. 破解、注解<br />3. 非常重要：在软件的option中OCI选项中将OCI library（oci.dll）的路径指向安装的instant clent的oci.dll上<br />4. SQL*PLUS以相同方式处理，不过不用这个的话初步处理无所谓了。<br /><br />好了，可以尝试你的第一次Oracle连接之旅了（是我的&#8230;&#8230;）<img src ="http://www.cppblog.com/sh19871122/aggbug/204860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2013-12-17 20:16 <a href="http://www.cppblog.com/sh19871122/archive/2013/12/17/204860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>