stone2083

2017年10月12日 #

IEEE 754 浮点存储小记

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

posted @ 2017-10-12 11:23 stone2083 阅读(183) | 评论 (0)编辑 收藏

2016年9月8日 #

socks协议+netty实现(协议部分)

posted @ 2016-09-08 12:51 stone2083 阅读(1413) | 评论 (0)编辑 收藏

2015年10月21日 #

docker overlay network

     摘要: docker overlay network  阅读全文

posted @ 2015-10-21 15:14 stone2083 阅读(5499) | 评论 (0)编辑 收藏

2015年5月8日 #

四张图了解iptables原理和使用

     摘要: 四张图了解iptables原理和使用  阅读全文

posted @ 2015-05-08 13:01 stone2083 阅读(8166) | 评论 (0)编辑 收藏

2014年11月6日 #

mykeepass for command line

命令行下的类似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下剪切板复制的命令即可)


posted @ 2014-11-06 14:45 stone2083 阅读(5391) | 评论 (2)编辑 收藏

2014年9月22日 #

SCP限速逻辑实现--带中文注释的bandwidth_limit函数

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 }

posted @ 2014-09-22 17:45 stone2083 阅读(2051) | 评论 (4)编辑 收藏

2013年12月20日 #

将图片转成HTML格式--原理&代码

之前的文章,因为贴了效果图,导致无法编辑。
@see http://www.blogjava.net/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

posted @ 2013-12-20 14:28 stone2083 阅读(2313) | 评论 (0)编辑 收藏

将图片转成HTML格式--用HTML画图

     摘要: 介绍 img2html,将图片转成HTML格式。 用HTML来画图。 效果 原始图片 转成HTML后的效果(压缩1倍后的效果--主意:请查看html源码,这边没有src图片属性,全是通过html代码渲染) ...  阅读全文

posted @ 2013-12-20 14:18 stone2083 阅读(2495) | 评论 (0)编辑 收藏

2013年8月19日 #

pystack--python stack trace--让python打印线程栈信息

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)

有需要的朋友,赶紧拿走吧.

posted @ 2013-08-19 13:15 stone2083 阅读(5166) | 评论 (0)编辑 收藏

2013年6月8日 #

获得Java对象内存占用大小

懒惰,直接上代码,用法见JAVA DOC.
  1 package com.alibaba.stonelab.javalab.jvm.sizeof;
  2 
  3 import java.lang.instrument.Instrumentation;
  4 import java.lang.reflect.Array;
  5 import java.lang.reflect.Field;
  6 import java.lang.reflect.Modifier;
  7 import java.util.IdentityHashMap;
  8 import java.util.Map;
  9 import java.util.Stack;
 10 
 11 /**
 12  * <pre>
 13  * 1. MANIFEST.MF
 14  *      Premain-Class: xxx.yyy.zzz.JavaSizeOf
 15  * 
 16  * 2. MAIN.JAVA
 17  *         System.out.println(JavaSizeOf.sizeof(new ConcurrentHashMap<Object, Object>()));
 18  *         System.out.println(JavaSizeOf.sizeof(new String("1234567")));
 19  *         System.out.println(JavaSizeOf.sizeof(new String("1234")));
 20  *         System.out.println(JavaSizeOf.sizeof(new Object()));
 21  *         System.out.println(JavaSizeOf.sizeof(new int[] { 1, 2, 3 }));
 22  *         System.out.println(JavaSizeOf.sizeof(new CopyOnWriteArrayList<Object>()));
 23  *         System.out.println(JavaSizeOf.sizeof(null));
 24  *         
 25  * 3. USAGE:
 26  *      java -javaagent:sizeof.jar xxx.yyy.zzz.Main
 27  * </pre>
 28  * 
 29  * @author <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> 2013-6-8
 30  */
 31 public class JavaSizeOf {
 32 
 33     private static Instrumentation inst;
 34 
 35     public static void premain(String agentArgs, Instrumentation inst) {
 36         JavaSizeOf.inst = inst;
 37     }
 38 
 39     /**
 40      * get size of java object.
 41      * 
 42      * @param o
 43      * @return
 44      */
 45     public static long sizeof(Object o) {
 46         assert inst != null;
 47         Map<Object, Object> visited = new IdentityHashMap<Object, Object>();
 48         Stack<Object> visiting = new Stack<Object>();
 49         visiting.add(o);
 50         long size = 0;
 51         while (!visiting.isEmpty()) {
 52             size += analysis(visiting, visited);
 53         }
 54         return size;
 55     }
 56 
 57     /**
 58      * analysis java object size recursively.
 59      * 
 60      * @param visiting
 61      * @param visited
 62      * @return
 63      */
 64     protected static long analysis(Stack<Object> visiting, Map<Object, Object> visited) {
 65         Object o = visiting.pop();
 66         if (skip(o, visited)) {
 67             return 0;
 68         }
 69         visited.put(o, null);
 70         // array.
 71         if (o.getClass().isArray() && !o.getClass().getComponentType().isPrimitive()) {
 72             if (o.getClass().getName().length() != 2) {
 73                 for (int i = 0; i < Array.getLength(o); i++) {
 74                     visiting.add(Array.get(o, i));
 75                 }
 76             }
 77         }
 78         // object.
 79         else {
 80             Class<?> clazz = o.getClass();
 81             while (clazz != null) {
 82                 Field[] fields = clazz.getDeclaredFields();
 83                 for (Field field : fields) {
 84                     if (Modifier.isStatic(field.getModifiers())) {
 85                         continue;
 86                     }
 87                     if (field.getType().isPrimitive()) {
 88                         continue;
 89                     }
 90                     field.setAccessible(true);
 91                     try {
 92                         visiting.add(field.get(o));
 93                     } catch (Exception e) {
 94                         assert false;
 95                     }
 96                 }
 97                 clazz = clazz.getSuperclass();
 98             }
 99         }
100         return inst.getObjectSize(o);
101     }
102 
103     /**
104      * <pre>
105      * skip statistics.
106      * </pre>
107      * 
108      * @param o
109      * @param visited
110      * @return
111      */
112     protected static boolean skip(Object o, Map<Object, Object> visited) {
113         if (o instanceof String) {
114             if (o == ((String) o).intern()) {
115                 return true;
116             }
117         }
118         return o == null || visited.containsKey(o);
119     }
120 
121 }
122 

posted @ 2013-06-08 17:32 stone2083 阅读(6761) | 评论 (1)编辑 收藏

仅列出标题  下一页