2022年5月16日
#
摘要: 1. 主要包括:
架構總覽、核心概念關系、場景例子、源碼分析
2. 建議閱讀順序
2.1 從架構總覽,了解整體camunda概念,包括DB表結構,內心有概念和底層存儲的關系映射
2.2 再解核心概念關系,建立業務概念、代碼模型、表結構的映射關系
2.3 通過場景例子,了解不同概念的使用場景,配置
2.4 通過源碼分析,了解底層實現,方便必要時對其做擴展
閱讀全文
2017年10月12日
#
IEEE 754:
https://zh.wikipedia.org/wiki/IEEE_754
FLOAT:
31 30 22 15 7 0
+---+----------+---------+----------+----------+
| | | |
+---+----------+---------+----------+----------+
+ S + E + M +
EXAMPLE(5.5):
=============================
int main() {
float a = 5.5;
int *p = &a;
printf("%d\n", *p);
printf("%X\n", *p);
}
gcc -o main main.c; ./main
十進制: 1085276160
十六進制: 40B00000
=============================
十進制 = 二進制 = 二進制指數形式
5.5 = 101.1 = 1.011 * 2^2
==> S=0 E=2 M = 11
31 30 22 15 7 0
+---+----------+---------+----------+----------+
| 0 | 10000001 | 0110000 | 00000000 | 00000000 |
+---+----------+---------+----------+----------+
+ S + E + M +
轉換成INT:
二進制: 01000000101100000000000000000000
十進制: 1085276160
十六進制: 40B00000
EXAMPLE(5.1):
===========================================
int main() {
float a = 5.1;
int *p = &a;
printf("Float:\t%f\n", a);
printf("十進制:\t%d\n", *p);
printf("十六進制:\t%X\n", *p);
}
gcc -o main main.c; ./main
Float: 5.100000
十進制: 1084437299
十六進制: 40A33333
===========================================
存儲形式:0b01000000101000110011001100110011
有效尾數:01000110011001100110011
表達方式:1.01000110011001100110011 * 2^2 ==> 101.000110011001100110011
101 ==> 5
0.000110011001100110011 ==> 2^-4 + 2^-5 + 2^-8 + 2^-9 + 2^-12 + 2^-13 + 2^-16 + 2^-17 + 2^-20 + 2^-21
實際表達: 5.09999990463256836
保留6位小數: 5.100000
2016年9月8日
#
2015年10月21日
#
摘要: docker overlay network
閱讀全文
2015年5月8日
#
摘要: 四張圖了解iptables原理和使用
閱讀全文
2014年11月6日
#
命令行下的類似keepass一個東東.
如何使用Command line for Keep Password.
Usage:
keepass.sh -l
keepass.sh -e plain-text
keepass.sh -d encoded-text
keepass.sh -s encoded-text name
-l
展示保存下所有加密后的密碼信息
-e
將明文密碼, 加密, 密文自動保存到剪切板上
-d
將密文界面, 解密后的明文自動保存到剪切板上
-s
將密文持久化保存到文件中
代碼實現
#!/bin/sh
DATA="$HOME/.password/data"
declare -a passwords
function enc()
{
#$1: plain text
echo "$1" | openssl enc -des | base64
}
function dec()
{
#$1: encoded text
echo "$1" | base64 -D | openssl enc -des -d
}
function sync()
{
for ((loop=0;loop<${#passwords[*]};loop++))
do
if [ -z "${passwords[$loop]}" ];then
continue
fi
value="$value\n${passwords[$loop]}"
done
echo $value > $DATA
}
function save()
{
#$1 encoded password
#$2 name
for ((loop=0; loop<${#passwords[*]}; loop++))
do
info=${passwords[$loop]}
password=$(echo $info | awk '{print $1}')
name=$(echo $info | awk '{print $2}')
if [ "$2" == "$name" ];then
passwords[$loop]="$1 $2"
return
fi
done
passwords[$loop]="$1 $2"
sync
}
function delete()
{
#$1: name
for ((loop=0; loop<${#passwords[*]}; loop++))
do
info=${passwords[$loop]}
password=$(echo $info | awk '{print $1}')
name=$(echo $info | awk '{print $2}')
if [ "$1" == "$name" ];then
passwords[$loop]=""
fi
done
sync
}
function list()
{
for ((loop=0;loop<${#passwords[*]};loop++))
do
echo ${passwords[$loop]}
done
}
function help()
{
echo "Command line for Keep Password.
Usage:
keepass.sh -l
keepass.sh -e plain-text
keepass.sh -d encoded-text
keepass.sh -s encoded-text name"
}
function init()
{
loop=0
while read line
do
if [ -z "$line" ];then
continue
fi
passwords[$loop]=$line
loop=$(echo $loop+1 | bc)
done < $DATA
}
init
case "$1" in
-l)
list
;;
-e)
enc "$2" | tr -d '\n' | pbcopy
;;
-d)
dec "$2" | tr -d '\n' | pbcopy
;;
-s)
save "$2" "$3"
;;
-r)
delete "$2"
;;
*)
help
;;
esac
備注:
1. 純shell打造
2. 目前支持Mac shell, 理論上支持linux系統(唯一的改動, 把pbcopy改成linux下剪切板復制的命令即可)
2014年9月22日
#
SCP限速邏輯實現--帶中文注釋的bandwidth_limit函數
SCP支持限速, 通過-l參數, 指定拷貝的速度
-l limit
Limits the used bandwidth, specified in Kbit/s.
具體實現, 是在misc.c中的bandwidth_limit函數
下面附上帶中文注釋的bandwidth_limit函數代碼
1 struct bwlimit {
2 size_t buflen; // 每次read的buf長度
3 u_int64_t rate, thresh, lamt; // rate: 限速速率, 單位kpbs
4 // thresh:統計周期,read長度到了指定閾值, 觸發限速統計
5 // lamt: 一次統計周期內, read了多少長度
6 struct timeval bwstart, bwend; // bwstart: 統計周期之開始時間
7 // bwend: 統計周期之結束時間
8 };
9
10 void bandwidth_limit_init(struct bwlimit *bw, u_int64_t kbps, size_t buflen)
11 {
12 bw->buflen = buflen; // 初始化read buf長度
13 bw->rate = kbps; // 初始化限速速率
14 bw->thresh = bw->rate; // 初始化統計周期
15 bw->lamt = 0; // 初始化當前read長度
16 timerclear(&bw->bwstart); // 初始化統計開始時間
17 timerclear(&bw->bwend); // 初始化統計結束時間
18 }
19
20 void bandwidth_limit(struct bwlimit *bw, size_t read_len)
21 {
22 u_int64_t waitlen;
23 struct timespec ts, rm;
24
25 // 設置統計開始時間, 為當前時間
26 if (!timerisset(&bw->bwstart)) {
27 gettimeofday(&bw->bwstart, NULL);
28 return;
29 }
30
31 // 設置當前read長度
32 bw->lamt += read_len;
33 // 判斷當前read長度是否到達統計周期的閾值
34 if (bw->lamt < bw->thresh)
35 return;
36
37 // 設置統計結束時間,為當前時間
38 gettimeofday(&bw->bwend, NULL);
39 // bwend變量復用, 這個時候, bwend含義為, 本次統計周期實際開銷的時間: 既read thresh長度字節,花了多少時間.
40 timersub(&bw->bwend, &bw->bwstart, &bw->bwend);
41 if (!timerisset(&bw->bwend))
42 return;
43
44 // 將單位從Byte變成bit
45 bw->lamt *= 8;
46 // 根據限速速率, 計算理論應該花費多少時間
47 waitlen = (double)1000000L * bw->lamt / bw->rate;
48 // bwstart變量復用, 這個時候, bwstart含義為, 本次統計周期理論開銷的時間
49 bw->bwstart.tv_sec = waitlen / 1000000L;
50 bw->bwstart.tv_usec = waitlen % 1000000L;
51
52 // 如果理論開銷時間 > 實際開銷時間, 則需要做限速
53 if (timercmp(&bw->bwstart, &bw->bwend, >)) {
54 // bwend變量復用, 這個時間, bwend含義為, 理論開銷時間 和 實際開銷時間的差值, 既需要sleep的時間, 確保達到限速到指定的rate值
55 timersub(&bw->bwstart, &bw->bwend, &bw->bwend);
56
57 // 如果差值達到了秒級, 則需要降低統計周期閾值, 確保統計相對精確
58 // thresh變為原先的1/2, 但不能低于buflen的1/4
59 if (bw->bwend.tv_sec) {
60 bw->thresh /= 2;
61 if (bw->thresh < bw->buflen / 4)
62 bw->thresh = bw->buflen / 4;
63 }
64 // 如果差值小于10毫秒, 則需要加大統計周期閾值, 確保統計相對精確
65 // thresh變為原先的2倍, 但不能高于buflen的8倍
66 else if (bw->bwend.tv_usec < 10000) {
67 bw->thresh *= 2;
68 if (bw->thresh > bw->buflen * 8)
69 bw->thresh = bw->buflen * 8;
70 }
71
72 // 乖乖的睡一會吧, 以達到限速目的
73 TIMEVAL_TO_TIMESPEC(&bw->bwend, &ts);
74 while (nanosleep(&ts, &rm) == -1) {
75 if (errno != EINTR)
76 break;
77 ts = rm;
78 }
79 }
80
81 // 新的統計周期開始, 初始化lamt, bwstart變量
82 bw->lamt = 0;
83 gettimeofday(&bw->bwstart, NULL);
84 }
2013年12月20日
#
之前的文章,因為貼了效果圖,導致無法編輯。
@see http://www.aygfsteel.com/stone2083/archive/2013/12/20/407807.html
原理
使用table,tr/td作為一個像素點,畫點。
代碼
2 import sys, optparse, Image
3
4 TABLE='<table id="image" border="0" cellpadding="0" cellspacing="0">%s</table>'
5 TR='<tr>%s</tr>'
6 TD='<td width="1px;" height="1px;" bgcolor="%s"/>'
7
8 def rgb2hex(rgb):
9 return '#{:02x}{:02x}{:02x}'.format(rgb[0],rgb[1],rgb[2])
10
11 def get_image(name, thumbnail=1):
12 if(thumbnail >= 1 or thumbnail <= 0):
13 return Image.open(name)
14 else:
15 img = Image.open(name)
16 return img.resize((int(img.size[0] * thumbnail),int(img.size[1] * thumbnail)))
17
18 def convert(img):
19 trs = []
20 for height in xrange(img.size[1]):
21 tds = []
22 for width in xrange(img.size[0]):
23 tds.append(TD % rgb2hex(img.getpixel((width, height))))
24 trs.append(TR % (''.join(tds)))
25 return TABLE % (''.join(trs),)
26
27 parser = optparse.OptionParser('Usage: %prog [options] image')
28 parser.add_option('-c', '--compress', dest='thumbnail', default='1', metavar='float', help='specify the compress value (0, 1)')
29 parser.add_option('-o', '--out', dest='out', default='out.html', help='specify the output file')
30 opts, args = parser.parse_args()
31
32 if(len(args) != 1):
33 parser.print_help()
34 sys.exit(-1)
35
36 html = open(opts.out,'w')
37 html.write(convert(get_image(args[0], float(opts.thumbnail))))
38 html.close()
下載地址
https://code.google.com/p/stonelab/downloads/detail?name=img2html.py#makechanges
摘要: 介紹
img2html,將圖片轉成HTML格式。
用HTML來畫圖。
效果
原始圖片
轉成HTML后的效果(壓縮1倍后的效果--主意:請查看html源碼,這邊沒有src圖片屬性,全是通過html代碼渲染)
...
閱讀全文
2013年8月19日
#
pystack: python stack trace. 類似java中的jstack功能.
使用方式:
1. https://pypi.python.org/pypi/pdbx/0.3.0 下載, 或者直接通過easyinstall安裝
2. python scripts中, import pdbx; pdbx.enable_pystack(); 開啟pystack功能
3. kill -30 pid , 就可以打印stack信息了.
如:
"CP Server Thread-10" tid=4564467712
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-9" tid=4560261120
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-1" tid=4526608384
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-7" tid=4551847936
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-4" tid=4539228160
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-2" tid=4530814976
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"MainThread" tid=140735286018432
at app.run()(raspctl.py:173)
at return wsgi.runwsgi(self.wsgifunc(*middleware))(application.py:313)
at return httpserver.runsimple(func, validip(listget(sys.argv, 1, '')))(wsgi.py:54)
at server.start()(httpserver.py:157)
at self.tick()(__init__.py:1765)
at s, addr = self.socket.accept()(__init__.py:1800)
at sock, addr = self._sock.accept()(socket.py:202)
at pystack()(pdbx.py:181)
at for filename, lineno, _, line in traceback.extract_stack(stack):(pdbx.py:169)
"CP Server Thread-5" tid=4543434752
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-8" tid=4556054528
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-3" tid=4535021568
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
"CP Server Thread-6" tid=4547641344
at self.__bootstrap_inner()(threading.py:525)
at self.run()(threading.py:552)
at conn = self.server.requests.get()(__init__.py:1367)
at self.not_empty.wait()(Queue.py:168)
at waiter.acquire()(threading.py:244)
核心代碼:
# pystack
def pystack():
for tid, stack in sys._current_frames().items():
info = []
t = _get_thread(tid)
info.append('"%s" tid=%d' % (t.name, tid))
for filename, lineno, _, line in traceback.extract_stack(stack):
info.append(' at %s(%s:%d)' % (line, filename[filename.rfind('/') + 1:], lineno))
print '\r\n'.join(info)
print ''
def _get_thread(tid):
for t in threading.enumerate():
if t.ident == tid:
return t
return None
def _pystack(sig, frame):
pystack()
def enable_pystack():
signal.signal(signal.SIGUSR1, _pystack)
有需要的朋友,趕緊拿走吧.