存档

‘Tools’ 分类的存档

比 grep 强悍太多的文本检索工具 ACK

2015年4月24日 1 条评论

对程序员来说, grep, cat, 真心是伟大的前辈们赐予我们这些晚辈最好的礼物, 不会用 grep, cat 之类程序员真心没有出息.

但是不知是否有人经常使用以下的语法, 而且感到要是 grep 要是在智能一点就好了

$ grep terminate_instance $(find . -name '*.py' | grep -v tests)

不错, awk 就是为了满足我们希望 grep 更好用这样的前提下被开发出来的, 首先从他的 官网 beyondgrep.com 就可以看出来 🙂 官网给出比 grep 好的理由是:

  • 速度非常快 因为它只搜索有意义的东西.
  • 更好的搜索方案 默认忽略那些不是你想搜索的源码的东西, .e.g. git, svn 目录
  • 为源代码搜索而设计 用更少的击键完成任务
  • 移植性非常好 该程序用 Perl 完成的, 可以在几乎所有主流平台上使用, windows, mac, linux 等
  • 免费开源

Table of Contents

安装

不求那些炫酷的安装方式, 在 一般的 linux 平台, 用包管理器, 比如在 centos/fedora:

# yum install -y ack

在 OSX, 使用 brew

$ brew install ack

使用

回到文首的那个用法, 现在可以很简单的用 ack 来完成, 而且速度暴快:

$ ack --python --ignore-dir=tests terminate_instance

该程序的一般使用很简单:

$ ack --type PATTERN

其中 type 指定需要搜索的源代码类型, 比如 –python, 其它大部分选项和 grep 一样, 文档是说 99%.

高级使用

请参考 官网

分类: Tools 标签:

使用 gitstatus 生成项目的图标统计信息

2014年5月4日 没有评论

最近老板要统计一下团队中各个开发人员的工作情况, 比如写的代码行数之类的. 由于我们
团队是用 git 来做代码管理工具的, 所以很自然地我需要从 git 本身挖掘这些信息.

当然我可以使用 git log 加上各种文本处理工具(e.g. grep)来达到我的目的, 但是这种
方式太麻烦, 生成图表更不容易. 为了不重复发明轮子, 我放狗搜索了一下, 找到了 gitstat
这个工具完美实现我的要求.

gitstat 特性

  • 以各种维度统计代码信息, 包括代码提交次数, 代码行数, 提交持续时间, 项目的活
    跃度, 项目标签等等.
  • 支持合并多个项目的统计信息
  • 统计可以以图表的形式输出
  • 统计输出 html 格式的文件, 可以部署到网站上
  • 不支持 pdf 等其他格式的输出

怎样使用

gitstat 的使用非常简单:

# gitstats [options] <repository1> <repository2> <repository3> <output dir>

比如, 我以 spice 项目的统计信息为例, spice 项目有 spice-server, spice-gtk,
spice-procotol, vd_agent 等子项目, 把结果保存在 var/www 目录中,
使用以下命令:

# gitstat spice spice-gtk spice-procotol vd_agent /var/www

完成之后, 用浏览器打开 /var/www/index.html 就可以看到具体的统计信息了.

献上截图两章, 列位看官可以在里面看到我吗?

gitstatus1

gitstatus2

分类: Tools 标签:

简单计算 PI 的方法

2014年4月6日 没有评论

这几天搞一个虚拟机自动迁移的测试, 为了满足在特定 CPU 条件下触发迁移的条件,
需要有进程不断的在消耗 CPU 资源, 这类程序当然可以随便乱写, 来个 for (;;;)
之类的就可以完全满足. 但是, 本着专业的精神, 我决定用计算 π 来达到消耗
CPU 资源的目的.

学过一点级数展开的都知道下面这个著名的 π 的莱布尼茨公式:

PI_Leibniz.png

下面是直接用这个代码的 C++ 测试程序, 当然, 由于我用一个浮点型来保存结果的,
精度不可能搞得离谱, 要获得更高的精度, 麻烦还是用一个大数组吧 🙂

#include <math.h>
#include <iostream>
#include <iomanip>
 
using namespace std;
 
/**
 * 使用传说中的计算 PI 的莱布尼茨公式:
 * pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ... + (-1)^n/(2n + 1)
 * 
 */
#define END 7                   /* 精确到小数点后 7 位 */
 
int main(int argc, char *argv[])
{
    double ret = 0;
    long long n = 0;
    int mark = 1;
    double precision = pow(10, -END - 1);
 
    while (1) {
        double f = (double)mark / (2 * n + 1);
        ret += f;
        if ((mark * f) < precision) { /* 计算精度 */
            break;
        }
        n += 1;
        mark = -mark;
    }
 
    cout << "PI ≈ " << setprecision(9) << ret * 4 << endl;
    return 0;
}

另外, 高中时候学过的最简单的:

tan(4/π) = 1
=> 4/π = arctan(1)
=> π = 4 * arctan(1)

所以可以利用 glibc 提供的 API 直接算 PI.

double pi = atan(1) * 4;

这还不是最简单, 最简单的算 π 的方法, 如果熟悉 linux 下 bc 的童鞋应该想到了,
在 bc 中, 用函数 a (x) 可以计算反正切, 设置变量 scale 为想要的精度, 于是用
bc 计算就如此之简单了:

$ echo "scale=10;4*a(1)"|bc -l
3.1415926532

想要消耗 CPU 资源, 你把 scale 设置为 100000 试试.

分类: Programming, Tools 标签: ,

I/O 测试工具 – FIO

2013年3月21日 1 条评论

FIO 是对硬件进行性能测试和压力测试非常好用的工具, 我常常用它来测试虚拟机的 IOPS. 它支持各种引擎(sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio, 等). 而且它能像测试文件文件一样的对磁盘块设备进行测试. 更多的功能请参考它的 说明文档.

由于 FIO 提供了丰富的配置选项(块大小, 引擎, cache 方式, 文件读写方式, 测试文件 的大小分布, 等等等等), 用来做 IO 的测试是最好不过了.

安装

Install on linux

各大发行版一般都有 FIO 的支持, 所以安装很简单, 比如在我的 gentoo 上:

$ sudo emerge sys-block/fio

在没有 FIO 支持的发行版上安装也很简单, 比如在 CentOS-6 上:

$ sudo yum install gcc libaio-devel librdmacm-devel numactl-devel make # 安装依赖包
$ wget brick.kernel.dk/snaps/fio-2.0.14.tar.bz2 # 地址可能会变
$ ./configure && make && sudo make install

Install on windows

直接在 这里 下载 windows 的安装包.

使用

我非常喜欢 FIO 的使用和配置方式(默认能很好的工作, 提供了额外强大的扩展, 典型的 kiss + expand).

关于详细的使用文档, 可以在安装目录下找到, 比如在我的 gentoo 上位于 “/usr/share/doc/fio-2.0.14/HOWTO.bz2”, 在 windows 上位于 “C:\Program Files\fio\”

或者这里有一份 在线的文档.

下面是一个简单的使用例子, 是我用来测试 QEMU 的 IO 性能:

[rw_8k]
# 读写策略, 有 
# read       顺序读
# write      顺序写
# randread   随机读
# randwrite  随机写
# rw         混合顺序读写
# randrw     混合随机读写
rw=read
 
# 混合模式下的读写比例
rwmixread=50
 
# bssplit: 使用 10% 的 1K, 20% 的 4K, 20% 的 8KB, 30% 的 16KB, 20% 的 32KB
# 的小文件进行测试
bssplit=1k/10:4k/20:8k/20:16k/30:32k/20
 
# IO 引擎: 有以下几种:
# sync, psync, vsync, libaio, posixaio, solarisaio, windowsaio 
ioengine=libaio
 
# 每个文件io队列长度
iodepth=64
 
# 不要使用 io 的 buffer (O_DIRECT).
direct=1
 
# 块大小
bs=8k
 
# 文件名(这里是测试设备, 使用设备名)
filename=/dev/vdb
# 文件大小
size=1G
# 用 10 个进程来测试
numjobs=10
 
# 统一报告
group_reporting=1

分类: Tools 标签: