stone2083

          2013年8月19日 #

          Camunda學(xué)習(xí)點(diǎn)滴

               摘要: 1. 主要包括:
          架構(gòu)總覽、核心概念關(guān)系、場(chǎng)景例子、源碼分析
          2. 建議閱讀順序
          2.1 從架構(gòu)總覽,了解整體camunda概念,包括DB表結(jié)構(gòu),內(nèi)心有概念和底層存儲(chǔ)的關(guān)系映射
          2.2 再解核心概念關(guān)系,建立業(yè)務(wù)概念、代碼模型、表結(jié)構(gòu)的映射關(guān)系
          2.3 通過(guò)場(chǎng)景例子,了解不同概念的使用場(chǎng)景,配置
          2.4 通過(guò)源碼分析,了解底層實(shí)現(xiàn),方便必要時(shí)對(duì)其做擴(kuò)展  閱讀全文

          posted @ 2022-05-16 10:10 stone2083 閱讀(533) | 評(píng)論 (0)編輯 收藏

          IEEE 754 浮點(diǎn)存儲(chǔ)小記

          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

          十進(jìn)制:    1085276160

          十六進(jìn)制:  40B00000

          =============================



          十進(jìn)制 = 二進(jìn)制 = 二進(jìn)制指數(shù)形式

          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               +


          轉(zhuǎn)換成INT:

          二進(jìn)制:    01000000101100000000000000000000

          十進(jìn)制:    1085276160

          十六進(jìn)制:  40B00000



          EXAMPLE(5.1):

          ===========================================

          int main() {

              float a = 5.1;

              int *p = &a;

              printf("Float:\t%f\n", a);

              printf("十進(jìn)制:\t%d\n", *p);

              printf("十六進(jìn)制:\t%X\n", *p);

          }


          gcc -o main main.c; ./main

          Float:    5.100000

          十進(jìn)制:    1084437299

          十六進(jìn)制:  40A33333

          ===========================================


          存儲(chǔ)形式:0b01000000101000110011001100110011

          有效尾數(shù):01000110011001100110011

          表達(dá)方式: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


          實(shí)際表達(dá):      5.09999990463256836

          保留6位小數(shù):   5.100000

          posted @ 2017-10-12 11:23 stone2083 閱讀(662) | 評(píng)論 (0)編輯 收藏

          socks協(xié)議+netty實(shí)現(xiàn)(協(xié)議部分)

          posted @ 2016-09-08 12:51 stone2083 閱讀(1750) | 評(píng)論 (0)編輯 收藏

          docker overlay network

               摘要: docker overlay network  閱讀全文

          posted @ 2015-10-21 15:14 stone2083 閱讀(5772) | 評(píng)論 (0)編輯 收藏

          四張圖了解iptables原理和使用

               摘要: 四張圖了解iptables原理和使用  閱讀全文

          posted @ 2015-05-08 13:01 stone2083 閱讀(8630) | 評(píng)論 (0)編輯 收藏

          mykeepass for command line

          命令行下的類似keepass一個(gè)東東.

          如何使用
          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òng)保存到剪切板上
          -d
          將密文界面, 解密后的明文自動(dòng)保存到剪切板上
          -s
          將密文持久化保存到文件中

          代碼實(shí)現(xiàn)
          #!/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系統(tǒng)(唯一的改動(dòng), 把pbcopy改成linux下剪切板復(fù)制的命令即可)


          posted @ 2014-11-06 14:45 stone2083 閱讀(5611) | 評(píng)論 (2)編輯 收藏

          SCP限速邏輯實(shí)現(xiàn)--帶中文注釋的bandwidth_limit函數(shù)

          SCP限速邏輯實(shí)現(xiàn)--帶中文注釋的bandwidth_limit函數(shù)

          SCP支持限速, 通過(guò)-l參數(shù), 指定拷貝的速度
           -l limit
                       Limits the used bandwidth, specified in Kbit/s.

          具體實(shí)現(xiàn), 是在misc.c中的bandwidth_limit函數(shù)
          下面附上帶中文注釋的bandwidth_limit函數(shù)代碼
           1 struct bwlimit {
           2     size_t buflen;                 // 每次read的buf長(zhǎng)度
           3     u_int64_t rate, thresh, lamt;  // rate:  限速速率, 單位kpbs
           4                                    // thresh:統(tǒng)計(jì)周期,read長(zhǎng)度到了指定閾值, 觸發(fā)限速統(tǒng)計(jì)
           5                                    // lamt:  一次統(tǒng)計(jì)周期內(nèi), read了多少長(zhǎng)度
           6     struct timeval bwstart, bwend; // bwstart: 統(tǒng)計(jì)周期之開始時(shí)間
           7                                    // bwend:   統(tǒng)計(jì)周期之結(jié)束時(shí)間
           8 };
           9 
          10 void bandwidth_limit_init(struct bwlimit *bw, u_int64_t kbps, size_t buflen)
          11 {
          12     bw->buflen = buflen;          // 初始化read buf長(zhǎng)度
          13     bw->rate = kbps;              // 初始化限速速率
          14     bw->thresh = bw->rate;        // 初始化統(tǒng)計(jì)周期
          15     bw->lamt = 0;                 // 初始化當(dāng)前read長(zhǎng)度
          16     timerclear(&bw->bwstart);     // 初始化統(tǒng)計(jì)開始時(shí)間
          17     timerclear(&bw->bwend);       // 初始化統(tǒng)計(jì)結(jié)束時(shí)間
          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     // 設(shè)置統(tǒng)計(jì)開始時(shí)間, 為當(dāng)前時(shí)間
          26     if (!timerisset(&bw->bwstart)) {
          27         gettimeofday(&bw->bwstart, NULL);
          28         return;
          29     }
          30 
          31     // 設(shè)置當(dāng)前read長(zhǎng)度
          32     bw->lamt += read_len;
          33     // 判斷當(dāng)前read長(zhǎng)度是否到達(dá)統(tǒng)計(jì)周期的閾值
          34     if (bw->lamt < bw->thresh)
          35         return;
          36 
          37     // 設(shè)置統(tǒng)計(jì)結(jié)束時(shí)間,為當(dāng)前時(shí)間
          38     gettimeofday(&bw->bwend, NULL);
          39     // bwend變量復(fù)用, 這個(gè)時(shí)候, bwend含義為, 本次統(tǒng)計(jì)周期實(shí)際開銷的時(shí)間: 既read thresh長(zhǎng)度字節(jié),花了多少時(shí)間.
          40     timersub(&bw->bwend, &bw->bwstart, &bw->bwend);
          41     if (!timerisset(&bw->bwend))
          42         return;
          43 
          44     // 將單位從Byte變成bit
          45     bw->lamt *= 8;
          46     // 根據(jù)限速速率, 計(jì)算理論應(yīng)該花費(fèi)多少時(shí)間
          47     waitlen = (double)1000000L * bw->lamt / bw->rate;
          48     // bwstart變量復(fù)用, 這個(gè)時(shí)候, bwstart含義為, 本次統(tǒng)計(jì)周期理論開銷的時(shí)間
          49     bw->bwstart.tv_sec = waitlen / 1000000L;
          50     bw->bwstart.tv_usec = waitlen % 1000000L;
          51 
          52     // 如果理論開銷時(shí)間 >  實(shí)際開銷時(shí)間, 則需要做限速
          53     if (timercmp(&bw->bwstart, &bw->bwend, >)) {
          54         // bwend變量復(fù)用, 這個(gè)時(shí)間, bwend含義為, 理論開銷時(shí)間 和 實(shí)際開銷時(shí)間的差值, 既需要sleep的時(shí)間, 確保達(dá)到限速到指定的rate值
          55         timersub(&bw->bwstart, &bw->bwend, &bw->bwend);
          56 
          57         // 如果差值達(dá)到了秒級(jí), 則需要降低統(tǒng)計(jì)周期閾值, 確保統(tǒng)計(jì)相對(duì)精確
          58         // thresh變?yōu)樵鹊?/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毫秒, 則需要加大統(tǒng)計(jì)周期閾值, 確保統(tǒng)計(jì)相對(duì)精確
          65         // thresh變?yōu)樵鹊?倍, 但不能高于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         // 乖乖的睡一會(huì)吧, 以達(dá)到限速目的
          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     // 新的統(tǒng)計(jì)周期開始, 初始化lamt, bwstart變量
          82     bw->lamt = 0;
          83     gettimeofday(&bw->bwstart, NULL);
          84 }

          posted @ 2014-09-22 17:45 stone2083 閱讀(2497) | 評(píng)論 (4)編輯 收藏

          將圖片轉(zhuǎn)成HTML格式--原理&代碼

          之前的文章,因?yàn)橘N了效果圖,導(dǎo)致無(wú)法編輯。
          @see http://www.aygfsteel.com/stone2083/archive/2013/12/20/407807.html

          原理

          使用table,tr/td作為一個(gè)像素點(diǎn),畫點(diǎn)。



          代碼

           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

          posted @ 2013-12-20 14:28 stone2083 閱讀(3159) | 評(píng)論 (0)編輯 收藏

          將圖片轉(zhuǎn)成HTML格式--用HTML畫圖

               摘要: 介紹 img2html,將圖片轉(zhuǎn)成HTML格式。 用HTML來(lái)畫圖。 效果 原始圖片 轉(zhuǎn)成HTML后的效果(壓縮1倍后的效果--主意:請(qǐng)查看html源碼,這邊沒(méi)有src圖片屬性,全是通過(guò)html代碼渲染) ...  閱讀全文

          posted @ 2013-12-20 14:18 stone2083 閱讀(2799) | 評(píng)論 (0)編輯 收藏

          pystack--python stack trace--讓python打印線程棧信息

          pystack: python stack trace. 類似java中的jstack功能.
          使用方式:
          1. https://pypi.python.org/pypi/pdbx/0.3.0 下載, 或者直接通過(guò)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)

          有需要的朋友,趕緊拿走吧.

          posted @ 2013-08-19 13:15 stone2083 閱讀(8086) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 政和县| 浪卡子县| 东乡族自治县| 新兴县| 嘉禾县| 定州市| 古蔺县| 胶州市| 锦屏县| 余江县| 皋兰县| 伊春市| 监利县| 凉山| 荆州市| 临夏市| 临清市| 灵山县| 区。| 沙河市| 承德市| 班玛县| 古交市| 库伦旗| 奉化市| 太和县| 祁门县| 靖安县| 四会市| 玉田县| 高碑店市| 泗阳县| 齐齐哈尔市| 龙陵县| 高要市| 兴城市| 宜宾县| 思茅市| 海阳市| 西乡县| 新密市|