Top10 Posts

    Snippets

    Wed, Jun 10, 2015
    背景 记录常用的比较有技巧的code snippets 如何保留float 制定的小数位数 背景 默认情况下线 float64 会有很长的小数, 在监控系统的展示中不是非常友好. 因此希望把0.3333333 结果截取为 0.33 , 然后提交到 server. 实现 func SetPrecision(from float64, precision int) float64 { base := math.Pow10(precision) return float64(int64(from*base)) / base }

    Supervisord

    Wed, Mar 25, 2015
    supervisord 背景 一个模块在运行的过程中可能遇到各种问题, 会导致它 crash, 如果 crash 之后, op 通常希望它能马上进行重启. supervisord 模块就是这个用途, 它在实时监测子进程模块的运行状态, 如果发现模块故障, 就会重新产生一个新实例. supervisord VS supervise 两个模块做的事情类似. 采用supervisord 的好处 开源广泛运用, 资料较多, 且具有源代码,可控性更好 supervisord 可以管理多个自己进程, 避免 supervise 需要 copy-paste 多份二进制程序. 支持 xml-rpc, 方便远程控制 资料 supervisord 安装 已经将 supervisord pack 到 yum server 中, 安装如下: yum install -y python-supervisord 服务启动 安装完成之后, 系统默认是自动启动的. 目前我们已经将python-supervisord 嵌入到系统 service 内部, 可以使用大家熟悉的service 来操作(正常情况下不需要, 重启可能会导致子服务都重启, 谨慎操作) service supervisord restart 随机启动 我们希望机器重启之后, supervisord 之后能自动启动, 最近python-supervisord 已经能够支持. 随机启动细节(不敢兴趣同学跳过) 主要步骤如下: 1: 创建随机启动脚本supervisord 2: chkconfig –add supervisord 3: chkconfig –level 2345 supervisord on 将 步骤1, 随机启动脚本放到 /etc/init.d/ 下面 将 步骤2,3 放入到安装后置脚本supervisord-after-install.sh 内 随机启动reference 打包具体命令 配置文件规范 supervisord 遵守 Unix 规范.

    Terminology

    Wed, Mar 4, 2015
    Concise description It is the client’s responsibility to perform idempotent operations or de-dupe.

    BigDataDraft

    Mon, Feb 2, 2015
    hbase 查看master hbase master 信息存储在zookeeper 中, 可以在 zookeeper 中查询. zkCli.sh -server myzoo get /hbase/master 如何启动 hmaster/regionserver hbase-daemon.sh start master #hmaster, stop 同理 hbase-daemon.sh start regionserver #regionserver, stop 同理 start master 和 ./bin/start-hbase.sh 有啥区别? hbase-daemon.sh start master 是用来启动单个 master ./bin/start-hbase.sh 会启动整个集群, 其中会读取 hbase-0.96.2-hadoop1/conf/regionservers 用来标记 regionservers 的列表, 扩容的时候不一定需要添加进去, 因为 regionserver 的机器存储在 zookeeper. 如何下线 datanode 背景 所谓无知者无畏, 自己太想当然了, 以为hadoop 的 datanode 有三份冗余, 就可以毫无顾虑就把data node stop 就 ok了. 后来发现自己太天真了. 正确姿势 1: 在namenode 的 hdfs-site.xml 中新增(如果不存在) <property> <name>dfs.hosts.exclude</name> <value>${path to exclude file}</ value> </property> 2: 在${path to exclude file} 文件中新增需要摘除的节点(机器名称) 机器名称(也可能是 IP)可以通过下面方式获得 ./bin/hadoop dfsadmin -report 正常情况下节点的信息 Name: 10.242.149.240:50010 (Name 这里的 name 后面的 名称就是写入 ${path to exclude file} 内) Decommission Status : Normal (正常状态) Configured Capacity: 0 (0 KB) DFS Used: 0 (0 KB) Non DFS Used: 0 (0 KB) DFS Remaining: 0(0 KB) DFS Used%: 100% DFS Remaining%: 0% Last contact: Wed May 13 15:40:10 CST 2015 3: 迁移节点数据 ./bin/hadoop dfsadmin -refreshNodes 常见问题 WARN org.apache.hadoop.util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable 原因: 默认下载的是32bit 上面的系统, 因此需要自己编译.

    PatternDraft

    Sun, Feb 1, 2015
    It’s just pattern and art 工程性项目其实基本上都是固定模式的组合, 比如设计模式其实就是对编程世界的各种招式的拆解成为定式, 之所以又可以成为 art, 在于组合. 组合带来多样性和复杂性. 不同的人组合不同, favor 也不同, 然后相同 favor 的人一起组成一个 group, 然后就有派系之争. CRC32 经常我们期望将一个字符串转换为一个数值, 用来进行分流. 最开始自己实现的时候利用了简单的思想 将字符的 ascii 进行 sum, 上周在听 codis 分享的时候, 发现codis 利用了 CRC32算法.

    FPMDraft

    Wed, Jan 21, 2015
    FPM FPM 入门 fpm -s <source type> -t <target type> [options] source types: "dir" 可以是文件或者是目录 常见问题和解决思路 Process failed: rpmbuild failed (exit code 1). 解决思路: fpm 运行增加 --verbose 选项, 查看日志输出 如何把我的一个程序, 比如 jq 打包为 RPM 格式文件, 期望安装之后安装 到 /bin 目录下 fpm -s dir -t rpm -n jq -v 1.4.0 --prefix=/bin/ jq http://golang-basic.blogspot.jp/2014/10/dynamic-programming-problem-maximum.html fpm 打包版本升级 背景 在打包 python-supervisor 的时候遇见这样的一个问题, 该打包策略比较复杂, 需要打包多次验证效果. fpm -s dir -t rpm -n python-supervisor -v '3.1.3' --iteration 2 -a 'x86_64' --description='A system for controlling process state under UNIX' --after-install='/root/load.sh' -d 'python-meld3' -C supervisord .

    JqueryDraft

    Sun, Jan 11, 2015

    Jsonp

    Unexpected token colon JSON after jQuery.ajax#get

    背景

    FE 同学由于联调环境原因, 通常希望在本地调用服务端的接口, 为了解决跨域问题, 通常会使用jsonp, 然后今天突然反馈说和其他 RD 联调的时候发现console log 报错:

    Unexpected token :
    

    追查

    开始怀疑是返回的 json 格式有问题, 利用 json 工具校验之后, 排除了这种可能性. 后面突然想到问题可能出现在 server 端, 联系相关的 RD, 看了代码之后, 发现没有提供对应的 jsonp 接口. don’t argue, just show me the code

    原因

    To support JSONP request, the server will have to include the P, or Padding, in the response.
    Server return

    {"Name":"Tome", "Description": "Hello it's me!"}
    

    but it should be

    jQuery111108398571682628244_1403193212453({"Name":"Tom","Description":"Hello it's me!"})
    

    The syntax err, "Unexpected token :", is because JSONP is parsed as JavaScript, where {...} also represents blocks.
    blocks syntax should be:

    {
        statement_1;
        statement_2;
        ...
        statement_n;
    }
    

    so we get Unexpected token : error


    AndroidDraft

    Sat, Jan 3, 2015

    创建 Android Virtual Device(AVD)

    android list  targets 查看已经下载好的 sdks
    

    查看

    adb devices 能够查看配置好的 android 物理设备
    ➜  bin git:(master) ✗ adb devices
    List of devices attached
    MX21CA1ALJZM4D2227  device
    

    MetaDraft

    Fri, Jan 2, 2015
    如何高效学习 该内容为翻译内容, 源地址 我相信学校里的优等生和差生的差距是由于学习习惯导致. 坦诚的说大多数学生非常低效地学习. 更糟糕的是, 大多数老师无法传授给学生高效的学习习惯. 学习和努力成比例 坐在教室里边听着教授演讲感觉在学习…翻看一本书的一个新的话题感觉在读书…但是这些行为是复杂的被动式活动, 是低效的. 这些行为可能会导致更糟糕的结果, 它们会给你造成你已经学会了的假象. 你可以在教室里边听关于量子力学的演讲, 在一定程度上你熟悉这个话题的和一些术语. 可悲的是你在欺骗你自己你已经学会, 这比什么都不会还要糟糕. 相反, 你应该给自己寻找挑战. 如果某些内容你觉得简单, 那么

    fq

    Sun, Dec 28, 2014

    FQ

    Across the Great Wall we can reach every corner of the world.

    shadowsocks (ss)

    原理

    app <- 本地 client 解密 <- 墙外 vps(加密) <- 目标 site  
    

    本质上 sshd -D 就是一个 Shadowsocks .

    ssh -D 0.0.0.0:10086 user@vps
    

    注意事项

    1. ssh -D 的本质上是一个 sock5 的代理, 不是 http/https 代理, 所以在 firefox 配置里边不能够把 HTTP Proxy 和 SSL Proxy 配置为127.0.0.1:10086, 只能设置socks 代理
    2. 为了避免 DNS 污染, 建议在 firefox 中设置Remote DNS, 进行远端解析