Table of Contents

日常的一些草稿,代码片段。

Boost

Boost 的 sample 都写了一个 CMakeList.txt, clone 后应该可以直接编译。

  • Windows 平台需要注意,为了减少依赖, CMake 中指定的都是 static runtime link。(其他 OS 应该没有这些问题) 所以编译 boost 时要用 b2 link=static runtime-link=static。 (目前测试过的 Windows 开发环境: MS VS 2013 + Boost 1.56)

Serialization

Boost.Serialization 可把 Memory 中的 Class 存放根据需要存入文件中,再根据需要读回 Memory.

  • 一个简单的 Serialization 使用
    • gist: https://gist.github.com/xiongjia/c6689d8ef1db4b8e19b5
    • 主要功能: 把 srcData 存入文件 mydata.dat 中,再把这个文件读入 destData 中。
    • Boost 在编译时可能没有 build Serialization。 (可以看一下 stage 目录下有没有 libboost_serialization* 来确认有没有编译 Serialization。) 如果没有则可以用 b2 link=static runtime-link=static --with-serialization --build-type=complete 来 build Serialization。
    • Boost Serialization 可以通过 BOOST_CLASS_VERSION 定义 version。在做数据兼容性时可以用此 Version 来做判断。
    • Boost Serialization 支持几种输出格式。 Gist sample 中用的是 Text 文件,也可以用 Binary, XML 等。
    • Boost 1.55 以及下版本的 Serialization 在 MS VS 2013 编译时会出现编译错误。建议升级到 1.56+。

Memory Pool

Boost Memory Pool。用來做內存管理,可以把內存的分配與釋放變得更加方便和高效。也有利於減少 Memory leak。

  • 一個簡單的 Pool 使用。
    • gist: https://gist.github.com/xiongjia/5c222ad60e7a4bb2d0f3
    • TestAllocator 是一個自定義的 Allocator。這一個 Allocator 是可選的,主要是為了 Log 一下 Malloc/Free 的次數才特意加的。普通情況可以用 Boost 自己的 Default Allocator。

Log

Boost.Log 是 1.54 以後被加入的 Boost Logging library。

  • 一個簡單的 Log 使用。
    • gist: https://gist.github.com/xiongjia/e23b9572d3fc3d677e3d
    • 主要功能: customize formatter, filter + FS & Console sink + Name scope
    • 可以先從 Boost Document 看一下 Boost.Log 的介紹,了解一下基本的 Sink, formatter 等。
    • Build 時需要檢查 Boost 是否高於 1.54

property_tree

property_tree 有很多作用,可以解析各種類型的格式的輸入,比如: xml, json, ini 等。

  • 一個簡單的 .ini 讀取, 解析。
    • gist: https://gist.github.com/xiongjia/6045153
    • 代碼上需要注意的就是 utf8 的處理: 用到了 std::wifstream; std::wstring 等。
    • 默認讀取當前目錄的 test.ini ,可以通過 -f 指定對應的 .ini 文件
    • CMake 中需要注意的是,增加了基本的 Boost 外還增加了 program_options 。只是因為用到了 boost::program_options::detail::utf8_codecvt_facet()
    • UTF8 string 在 terminate 的輸出,各個平台處理有點不一樣,
      • 在 OSX 上直接使用了 wstring_convert 。我測試中這個方式好像只有 OSX 上的 gcc/clang 才工作。 (可能是和 locale/lang 設置有一定關聯)
      • 其他平台需要設置對正確的 locale 才能輸出,比如要輸出中文,則要把 locale 更新到 zh-CN。這個 example 會讀取 -l 參數來自動更新語言集。比如: read-ini -l zh-CN 表示以中文輸出。

program_options

program_options 是一個專爲程序读取配置、参数准备的。

  • 一個簡單得從 argv 读取參數的 sample:

unit test framework

unit_test_framework 是 boost 自帶的一套 c/c++ unit test framework.

  • 一個簡單的 cmake 和 boost unit test framework 配合的例子。
    • gist: https://gist.github.com/xiongjia/72f3734f0e60a4d2a681
    • 把單元測試實現在 "0_my_lib_test.cxx" ( 加一個 “0_" prefix 是為了讓他在 gist 中居於 top
    • 對應 CMakeList.txt 會把要測試的 my_lib.cxx build 成為一個 static library 供單元測試使用
    • 對應的單元測試會被 build 成一個可執行文件。
    • 最後只需要執行對應的文件,就可以得到單元測試結果。
    • 詳細的 Boost test framework 參見 boost 文檔: http://www.boost.org/doc/libs/ ("Test" 章節)
  • 一個日常算法之類 (比如 leetcode 等) 的練習

ASIO

asio 是一個 I/O Framework 經常被用於異步的 I/O 操作

  • 一個簡單的,只實現了部分功能的,基於 boost asio 的 socks proxy
    • 代碼: https://github.com/xiongjia/scratch/tree/master/zeratul
    • 主要目的是測試 ASIO 庫,只實現了 socks5 proxy (rfc1928) 的部分功能。 ( Socks5 , IPv4, No Author 的 Connection command )
    • 默認 port 用了 9090;目前把 protocol 實現都堆在了 zeratul.cxx 裏。
    • 可以用 curl 來測試這個 proxy。比如: curl --socks5 localhost:9090 http://www.boost.org/
    • 對於得 CMakeLists.txt 配置了對於得 Boost ASIO 和 Log,並且在 Windows 上用了 boost static library。

Database

SQL Joins

一個簡單的測試,比較 SQL 各種 Joins (INNER; LEFT; RIGHT; OUTER; LEFT EXCLUDING; RIGHT EXCLUDING; OUTER EXCLUDING) 的結果。

leetcode DB problems

leetcode 上的 Database 題目,和我目前的解法。

Shell

leetcode SH problems

leetcode 上的 SHELL 題目,和我目前的解法。

JavaScript/Node.js

Dump node v8 heap

通過 node-heapdump 來 dump 當前得 v8 狀態,隨後可以通過 Chrome developer tool 來檢測這個 dump 文件。

node stream

通過從 require('stream').Transform 繼承得方式實現,stream 式樣得協議解析。

Mock Server

一個 HTTP Server 可以按照指定的要求來返回測試數據。主要用來模擬測試環境,比如 HTTP 的 client 代碼的單元測試中使用。還可以用在學習一些壓力測試工具時當作 Target Server,比如: Apache Ab, JMeter 等。

Knex sample

Knex 是一個 database query builder 通過 Knex 的封裝,可以使同一份代碼工作與不同種類的數據庫。

Bookshelfjs sample

Bookshelfjs 是一個 JS 實現的 ORM。風格類似與 Backbone,基於 Knex 的 query builder。

NContext

利用 node.js 的 'vm' module 為 script 創建一個獨特的 context

JS Promise patterns

实现了一部分日常要用到的 Promise 用例。比如:Series, Parallel, Race, Retry

PowerShell

MS UIAutomation

一個簡單得 powershell script, 通過 .Net 接口調用 MS UI Automation 來操作啟動得 calc.exe

VIM

VIM plugin with python

一個簡單的 vim plugin, 通過 python 忘當前 vim buffer 增加一些字符串。主要是為了嘗試 vim 和 python 的交互性。

  • gist: https://gist.github.com/xiongjia/64e1353afb9415e85479
  • 手動加載的方法: copy my_vim_plugin.py 和 my_vim_plugin.vim 到同一個目錄; 用 vim 打開 my_vim_plugin.vim; 執行 so %
  • 這裡要求 vim 提供 python runtime,這個和 vim 的編譯參數有關。大多的 vim 應都有 python runtime 支持。(我用過的各個系統中的 vim 好像都有) 可以通過 vim --version 檢查有麼有 python 支持。如果有 python 支持 vesrion 中會列出: +python or +python/dyn or +python3 or +python3/dyn。具體區別請參考 :help vesrion
  • vim 為了和 python 交互,輸出了"vim" module。在 VIM process 中,這是一個 C 實現的 Python module。有關"vim" module 使用的細節可參閱 vim document :help if_pyth.txt 。它實現的細節在 vim source code: if_py_both.h, if_python.c, if_python3.c 等文件中看到。

General

Singly linked list

一些基本的單向鏈表測試

  • gist: https://gist.github.com/xiongjia/11311784
  • list_get_middle_node : 得到 linked list 得中間點參看, function list_get_middle_node 。應該是一個比較基本雙指針方法,用一個 fast_prt 和一個 slow_ptr , fast_prt 每次推進 2 格, slow_ptr 一次推進一格。等 fast_ptr 到頂時, slow_ptr 就是中間。( 同樣得方法也可以用於取 1/3 點, 1/4 點等等, 也可以用於得到倒數第 N 個節點,比如 fast_ptr 前進 N 格, slow_ptr 前进一格)

Liquibase sample

一個基本的 liquibase 使用。

Python

Fanfou API Test

Java

這些 Java Scratch 代碼,都是用 Gradle 做管理。

WebSocket Echo server

一個簡單 Echo Server。主要目的是測試/實驗 Java WebSocket

JMeter Example Sampler

JMeter 是 Apache 的一個 Web 壓力測試工具。用戶可以通過自己的 .jar 包為 JMeter 寫擴展。