Haskell笔记 (14)—— List comprehension

在数学中,comprehension可以表示为从一个集合生成另一个集合:

{x²  |  x ∈ {1...5}}

Haskell中,list comprehension可以表示从一个list生成另外一个list

> [x^2 | x <- [1 .. 10], even x]
[4,16,36,64,100]

list comprehension可以包含两部分:x <- [1 .. 10]generator,表明x的值从哪里获得;even xguard,相当于限制哪些x的值可以用于生成新的listGeneratorguard都可以有多个,用,分开:

> [x * y | x <- [1 .. 10], y <- [1 .. 10], even x, odd y]
[2,6,10,14,18,4,12,20,28,36,6,18,30,42,54,8,24,40,56,72,10,30,50,70,90]

需要注意的是,改变generator的顺序会改变最后生成list的顺序。多个generator像嵌套循环,位置靠后的是里层循环,位置靠前的是外层循环。举例如下:

> [(x, y) | x <- [1, 2, 3], y <- [4, 5]]
[(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)]
> [(x, y) | y <- [4, 5], x <- [1, 2, 3]]
[(1,4),(2,4),(3,4),(1,5),(2,5),(3,5)]

参考资料:
List Comprehensions

 

SmartOS上使用pkgin安装软件

我使用的SmartOS是安装在Vmware上的虚拟机,网络模式是NAT。装好的SmartOS缺少很多常用软件,需要自行安装:

(1)由于我的网络使用了proxy,所以需要配置一下:

export http_proxy="http://web-proxy.xxxxxx.com:8080/"
export https_proxy="https://web-proxy.xxxxxx.com:8080/"

(2)安装pkgin,我使用的是root用户:

# cd /
# curl -k http://pkgsrc.joyent.com/packages/SmartOS/bootstrap/bootstrap-2015Q4-x86_64.tar.gz | gzcat | tar -xf -
# pkg_admin rebuild
# pkgin -y up

(3)接下来就可以安装软件了,以gcc为例。首先查找gcc package

# pkgin se gcc
......
gcc49-4.9.3          The GNU Compiler Collection (GCC) - 4.9 Release Series
......

安装gcc

# pkgin in gcc49-4.9.3

安装好后就可以使用了:

# gcc
gcc: fatal error: no input files
compilation terminated.

参考资料:
Installing pkgin
Working with packages

TPC-C简介

本文摘自BENCHMARKING TRANSACTION DATABASES

TPC-C benchmarkTransaction Processing Council制定测试数据库benchmark标准,它是基于批发供应商(也称之为company)的模型:

每个warehouse拥有100000个商品;
每个warehouse供应10个地区;
每个地区服务3000个客户。

TPC-C benchmark会增加warehouse,而保持其它常量不变。TPC-C benchmark的度量标准是tpm-C,即每分钟处理的transactionHammerDB就是一个提供TPC-C benchmark测试的开源工具。

 

Sysdig笔记(2)——sysdig的输出日志

在命令行执行sysdig命令,得到下列输出日志:

# sysdig | more
8 11:04:39.920906090 2 <NA> (0) > switch next=4606(qemu-kvm) pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
9 11:04:39.920923972 2 qemu-kvm (4606) < ioctl res=0
10 11:04:39.920927878 2 qemu-kvm (4606) > ioctl fd=17(<X>) request=AE80 argument=0
11 11:04:39.920933865 2 qemu-kvm (4606) < ioctl res=0
12 11:04:39.920934920 2 qemu-kvm (4606) > ioctl fd=17(<X>) request=AE80 argument=0
21 11:04:39.920950032 2 qemu-kvm (4606) < ioctl res=0
22 11:04:39.920951238 2 qemu-kvm (4606) > ioctl fd=17(<X>) request=AE80 argument=0
24 11:04:39.920958802 2 qemu-kvm (4606) > switch next=0 pgft_maj=0 pgft_min=930 vm_size=1534620 vm_rss=1083932 vm_swap=0
500 11:04:39.923348311 1 <NA> (0) > switch next=17 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
501 11:04:39.923351955 1 <NA> (17) > switch next=0 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
504 11:04:39.923380189 7 <NA> (0) > switch next=22 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
507 11:04:39.923394983 7 <NA> (22) > switch next=0 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0

第一列是事件序号,它是增长的,不连续的原因是因为没有包含sysdig自身产生的事件(可以使用sysdig -D得到sysdig自身产生的事件);
第二列是发生事件的时间戳;
第三列是CPU ID
第四列是命令;
第五列是线程ID
第六列是事件方向,比如进入ioctl函数为>,离开为<
第七列是事件名称(比如ioctl);
第八列是事件参数。

参考资料:
Interpreting Sysdig Output
How to understand evt.num?