2016年4月28日
讓程序中的簡單if-else在編譯期間決定
ex. 1 /*
2 * =====================================================================================
3 *
4 * Filename: 3.cpp
5 *
6 * Description:
7 *
8 * Version: 1.0
9 * Created: 03/01/2016 11:38:53 AM
10 * Revision: none
11 * Compiler: gcc
12 *
13 * Author: shih (Hallelujah), sh19871122@gmail.com
14 * Organization:
15 *
16 * =====================================================================================
17 */
18
19 #include <stdio.h>
20 #include <stdint.h>
21 #include <iostream>
22 #include <type_traits>
23
24 template<typename T>
25 struct is_swapable
26 {
27 static const bool value = std::is_integral<T>::value && sizeof(T) >= 2;
28 };
29
30 template<typename T>
31 T byte_swap(T value, std::true_type)
32 {
33 uint8_t *bytes = reinterpret_cast<uint8_t *>(&value);
34 for (std::size_t i = 0; i < sizeof(T)/2; ++i)
35 {
36 uint8_t v = bytes[i];
37 bytes[i] = bytes[sizeof(T) - 1 - i];
38 bytes[sizeof(T) -1 -i] = v;
39 }
40 return value;
41 }
42
43 template<typename T>
44 T byte_swap(T value, std::false_type)
45 {
46 return value;
47 }
48
49 template<typename T>
50 T byte_swap(T value)
51 {
52 return byte_swap(value, std::integral_constant<bool, is_swapable<T>::value>());
53 }
54
55 int main(int argc, const char *argv[])
56 {
57 int a = 0x11223344;
58 long b = 0x4455221112345678;
59 std::cout << std::hex << a << " " << b << std::endl;
60 std::cout << std::hex << byte_swap(a) << " " << byte_swap(b) << std::endl;
61 uint8_t c = 0x11;
62 char *d = "hello world";
63 std::cout << std::hex << byte_swap(c) << " " << byte_swap(d) << std::endl;
64 return 0;
65 }
66
2014年10月22日
安裝額外的EPEL倉庫
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
yum install epel-release-7-2.noarch.rpm
安裝后就可以安裝R等了
2014年9月12日
最近使用Hive來統計數據,用了pyhs2來實現查詢,但是有些復雜的處理比如,自定義對域名的處理等,不能通過hql來實現,發現能夠使用udf。
Java來實現Hive的寫法
package jsl.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public final class DomainRoot extends UDF {
public Text evaluate(Text s) {
if (s == null) {return null;}
String tmp = s.toString();
tmp = this.getDomainRoot(tmp);
return new Text(tmp);
}
private String getDomainRoot(String domain) {
throw NoneImplementException("xxxx");
}
}
如果Java的UDF需要當成常用的,不用每次add可以注冊到Hive中,
ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java中加入
registerUDF("domain_root", UDFParseUrl.class, false);并重新編譯hive即可
下面來說說重點,通過Streaming用Python來寫處理。
關于Streaming的基礎內容:


使用Transform來指定列,以及使用AS來指定生成的列以及可以指定轉換生成列的類型
hive> select transform(col1, clo2)
> using '/bin/cat' as (new_clo1 int, new_clo2 double) from table;
約束:首先必須add file到hive中(當python中引用了其他如自己寫的模塊時,也需要一并add進去)
其次非常不幸,在單獨的一個查詢中,不能夠使用UDAF的函數如sum()
再次不得為中間結果數據使用cluster by或distribute by
注意:對于優化查詢,使用cluster by或distribute by 和sort by一起非常重要
2014年7月29日
在C++中不直接支持約束,用過C#模板的有個where來處理,但是C++中也有些小的技巧來處理。
在不完美C++中的must_have_base如下:
template<typename D, typename B>
struct must_have_base
{
~must_have_base()
{
void (*p)(D*, B*) = constraints;
}
private:
static void constraints(D *pd, B *pb)
{
pb = pd;
}
};
原理是通過不執行的成員函數把函數指針在析構函數中賦值,強迫編譯器在編譯期間檢查成員函數內的約束。
自己寫了個小的實例,雖然這兒有點點牽強,但是,很多情況也需要檢查是否是某種類型的子類型的時候還是可以的,
完整代碼如下:
1
2 template<typename D, typename B>
3 struct must_have_base
4 {
5 ~must_have_base()
6 {
7 void (*p)(D*, B*) = constraints;
8 }
9
10 private:
11 static void constraints(D *pd, B *pb)
12 {
13 pb = pd;
14 }
15 };
16
17 class base
18 {
19 public:
20 virtual ~base() {}
21
22 virtual void run() = 0;
23 };
24
25 class inherit_base: public base
26 {
27 public:
28 virtual void run()
29 {
30
31 }
32 };
33
34 class inherit_not_base
35 {
36 public:
37 virtual void run()
38 {
39
40 }
41 };
42
43 class test
44 {
45 public:
46 template<typename T>
47 void testfunc(T &t)
48 {
49 must_have_base<T, base>();
50
51 t.run();
52 }
53 };
54
55 int main()
56 {
57 test t_ok, t_nok;
58 inherit_base hb;
59 inherit_not_base hnb;
60 t_ok.testfunc(hb);
61 t_nok.testfunc(hnb);
62
63 return 0;
64 }
拋磚引玉,希望這些東西都能用在實際的工程代碼中。
2014年6月5日
解決辦法:
$ vagrant plugin install vagrant-vbguest
$ vagrang reload
reload會重新編譯vbox的additions,然后mount就能成功了
我的環境是CentOS 6.5,在yum中開啟了kernel更新的,默認是exclude=kernel*
這是別人給的解決方案:
vagrant up; vagrant ssh -c 'sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions'; vagrant reload
2014年5月18日
環境:Windows 7 64bits,IDE:IntelliJ IDEA 13.1.2
安裝kivy:1. 下載安裝包http://kivy.org/#download,我使用的是Python 2.7.6,選擇的2.7版本(注意此版本是32位Python)
2. 解壓到一個目錄,我在我的系統環境變量中將根目錄命名為了KIVY_ROOT
3. 雖然kivy中自帶了Python的,可以直接使用,也可以自己安裝,我是自己下載的Python 2.7.6(記得一定是32位,不然后面寫程序會出問題)
4. 如果機器以前沒安裝git的,可以直接使用KIVY中帶的mingw,我自己機器安裝了git,所以環境變量就沒設置mingw的
5. 設置環境變量,GST_REGISTRY=%KIVY_ROOT%gstreamer\registry.bin
GST_PLUGIN_PATH=%KIVY_ROOT%gstreamer\lib\gstreamer-1.0
PATH變量中加入了%KIVY_ROOT%;%KIVY_ROOT%tools;%KIVY_ROOT%gstreamer\bin;(還有Python的mingw的)
最后,需要在PYTHONPATH中加入%KIVY_ROOT%kivy
最后寫入第一個程序來測試:
代碼如下
1
2 # -*- coding:utf-8 -*-
3 #/user/bin/env python
4
5 __author__ = 'shih'
6
7 from kivy.app import App
8
9 class Hello(App):
10 pass
11
12 if __name__ == "__main__":
13 Hello().run()
執行結果如下:
2014年4月14日
不知道里面怎么弄表格,就上傳圖片了

如果用戶自定義的類,想有add功能,如果類沒提供__add__或__radd__方法的話,會拋出異常
再如,if xxxobj:默認是如果xxxobj不是None則為True,否則為False,如果不是這個邏輯則可以通過實現__bool__方法(自己的測試中2.7需要再加上__nonzero__()方法,3.2中直接就行)
2014年3月16日
Asynchronous Input/Output(AIO):AIO可以在input/output的請求到來之前繼續執行。AIO在實時應用程序中是必須的。使用AIO可以映射多個任務到一個線程上去。
首先zeromq的設計是弱中間人的(brokerless,相對于ActiveMQ、RabbitMQ等,使用0zq的程序就可以直接和其他的節點通信而不通過broker的代理。),zeromq不會存儲信息到磁盤上,然而可能使用本地的交換文件來存儲消息(當設置了zmq.SWAP時)。
示例:HelloWorld(server)

server
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <zmq.h>
int main(int argc, char *argv[])
{
void *context = zmq_ctx_new();
void *respond = zmq_socket(context, ZMQ_REQ);
zmq_bind(respond, "tcp://*:4040");
printf("starting
\n");
for (;;)
{
zmq_msg_t request;
zmq_msg_init(&request);
zmq_msg_recv(&request, respond, 0);
printf("received: %s\n", zmq_msg_data(&request));
zmq_msg_close(&request);
sleep(1);
zmq_msg_t reply;
zmq_msg_init_size(&reply, strlen("world"));
memcpy(zmq_msg_data(&reply), "world", 5);
zmq_msg_send(&reply, respond, 0);
zmq_msg_close(&reply);
}
zmq_close(respond);
zmq_ctx_destroy(context);
return 0;
示例:Helloworld(client)

client
1
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <zmq.h>
6
7 int main(int argc, char *argv[])
8 {
9 void *context = zmq_ctx_new();
10 printf("client starting
\n");
11
12 void *request = zmq_socket(context, ZMQ_REQ);
13 zmq_connect(request, "tcp://localhost:4040");
14
15 int count = 0;
16
17 for (;;)
18 {
19 zmq_msg_t req;
20 zmq_msg_init_size(&req, strlen("hello"));
21 memcpy(zmq_msg_data(&req), "hello", 5);
22 printf("send msg hello, count = %d\n", count);
23 zmq_msg_send(&req, request, 0);
24 zmq_msg_close(&req);
25
26 zmq_msg_t reply;
27 zmq_msg_init(&reply);
28 zmq_msg_recv(&reply, request, 0);
29 printf("recv msg %s, count = %d\n", zmq_msg_data(&reply), count);
30 zmq_msg_close(&reply);
31 count++;
32 }
33
34 zmq_close(request);
35 zmq_ctx_destroy(context);
36
37 return 0;
38 }
39
40 這里使用了最基本的請求應答架構。詳細解析代碼:
第一步:創建了context和socket,zmq_ctx_new方法創建了一個新的
context,這是線程安全的,即一個context可用于多個線程操作。 zmq_socket方法創建了一個在context中定義的socket,
ZeroMQ的socket不是線程安全。傳統的socket是同步的,然而ZMQ的socket在客戶端和服務端都維護了一個隊列來管理request-reply的異步模式。ZMQ自動的處理連接、重連、斷開連接和內容交付。
服務端創建了Reply(ZMQ_REP)用來處理接收消息并應答消息。如果客戶端和服務端遺失(lost),應答的消息將在沒有任何通知的情況下丟掉。
客戶端創建了一個Request(ZMQ_REQ)來發送消息并接收來自服務的應答。ZMQ_REQ下不會丟棄任何信息,不管是沒有沒有可用與發送消息的服務或是服務處于忙狀態,所有的發送操作zmq_send函數會阻塞,直到一個服務變為可用于發送消息。ZMQ_REQ和ZMQ_REP、ZMQ_ROUTER類型兼容。
消息的發送zmq_send函數的第三個參數是flags,是ZMQ_DONTWAIT或ZMQ_SNDMORE。ZMQ_DONTWAIT表明消息是異步的發送。ZMQ_SNDMORE表明消息有多部分,其余的部分已經“在路上了”。消息接收函數zmq_msg_recv函數,如服務端,在先前接收的消息是無效的。第三個參數flugs可能是ZMQ_DONTWAIT。
先睡覺了
2013年12月31日
1 def args_unpacking_test(x, y):
2 print 'x = ', x, ' y = ', y
3
4 A = namedtuple('A', 'y x')
5
6 list_foo = [3, 4]
7 tuple_foo = (3, 4)
8 ntuple_foo = A(4, 3)
9 dict_foo = {'y':4, 'x':3}
10
11
12 args_unpacking_test(*list_foo)
13 args_unpacking_test(*tuple_foo)
14 args_unpacking_test(*ntuple_foo)
15 args_unpacking_test(**dict_foo)
16
17 他們的結果輸出都是一樣的
這個方式處理非常有用,如果參數個數不一致的話會報錯
2013年12月17日
首先下載Instant Client,我下載的11.2
下載的文件包括如下列表:
1. instantclient-basic-nt-11.2.0.3.0.zip
2. instantclient-odbc-nt-11.2.0.3.0.zip
3. instantclient-sdk-nt-11.2.0.3.0.zip
4. instantclient-sqlplus-nt-11.2.0.3.0.zip
5. instantclient-tools-nt-11.2.0.3.0.zip
最后兩個隨便了,解壓文件到instantclient_11_2目錄中
命令行下到解壓的目錄instantclient_11_2中執行>odbc_install
在環境變量中的系統變量PATH中加入instantclient_11_2目錄的全路徑
創建一個用戶變量ORACLE_HOME,指向ic的安裝目錄,這點很關鍵,特別是用cmake編譯soci,并需要支持Oracle的話。
在ic目錄中創建network/admin目錄,并加入OCI的.ora文件,在環境變量中加入TNS_ADMIN來指定剛才創建的目錄
創建一個用戶變量NLS_LANG來設置語言,我的設置是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,這個要和數據庫那邊一致?
創建一個用戶變量SQLPATH來指定sqlpath工具的文件路徑,下載的第四個文件
OK,所有安裝就此。
再安裝Oracle的訪問工具,我使用的是Navicat for Oracle工具
1. 普通安裝
2. 破解、注解
3. 非常重要:在軟件的option中OCI選項中將OCI library(oci.dll)的路徑指向安裝的instant clent的oci.dll上
4. SQL*PLUS以相同方式處理,不過不用這個的話初步處理無所謂了。
好了,可以嘗試你的第一次Oracle連接之旅了(是我的……)