Friday, May 13, 2011

Hash, Hash and Hash

(更新中)
Universal Hashing
A probability distribution H over hash functions from U to $\{1, \ldots, M\}$ is uni-
versal if for all x = y in U , we have
$$
Pr\{h(x) == h(y)\} \leq 1/M
$$

换言之当h是从H中随机选取,任何两个元素collide的概率不超过1/M.

(c,k)-Universal Hashing
$\{h_i\} h_i : U \to R$, for any distinct elements $x_1,\ldots,x_k \in U$, and $y_1,\ldots,y_k \in R$, we have
$$
Pr\{h_i(x_1) = y_1,\ldots, h_i(x_k) =y_k\} \leq c/|R|^k
$$

Monday, May 09, 2011

[Linux]Ubuntu 11.04(Natty)上安装gcc-4.6

gcc-4.6没有进Natty默认的repo.
可以从ppa源里安装
https://launchpad.net/~ubuntu-toolchain-r/+archive/test

Sunday, May 08, 2011

[Linux]关于用户,组

增加用户foo
sudo adduser foo

把用户foo添加到group admin当中(这样foo就可以sudo)
sudo adduser foo admin

增加组bar
sudo addgroup bar

查看某个用户foo所属的组
groups foo

Saturday, May 07, 2011

[Linux]IRQ

中断请求IRQ
http://www.mjmwired.net/kernel/Documentation/IRQ.txt
IRQ是来自某个设备(比如NIC,Harddisk,SSD等)的请求,请求CPU给于处理
为了识别来自不同设备的IRQ, 每个中断来源都被分配了一个数字(也就是IRQ number).
在/proc/interrupts中记录了当前各种IRQ的number和它们的来源:
$cat /proc/interrupts
           CPU0       CPU1       
  0:        570          0   IO-APIC-edge      timer
  1:          2          0   IO-APIC-edge      i8042
  7:          0          0   IO-APIC-edge      parport0
  8:          1          0   IO-APIC-edge      rtc0
  9:          0          0   IO-APIC-fasteoi   acpi
 12:          4          0   IO-APIC-edge      i8042
 16:          0          0   IO-APIC-fasteoi   uhci_hcd:usb3
 17:          0          0   IO-APIC-fasteoi   uhci_hcd:usb4, uhci_hcd:usb6
 18:          0          0   IO-APIC-fasteoi   uhci_hcd:usb7
 20:    1104815          0   IO-APIC-fasteoi   ata_piix, ata_piix
 22:     187848          0   IO-APIC-fasteoi   ehci_hcd:usb1
 23:       1110          0   IO-APIC-fasteoi   ehci_hcd:usb2, uhci_hcd:usb5
 43:    4747272          0   PCI-MSI-edge      radeon
 44:      97360          0   PCI-MSI-edge      hda_intel
 45:    4284421          0   PCI-MSI-edge      eth0
NMI:          0          0   Non-maskable interrupts
LOC:   36071250   31250448   Local timer interrupts
SPU:          0          0   Spurious interrupts
PMI:          0          0   Performance monitoring interrupts
IWI:          0          0   IRQ work interrupts
RES:    1218335     677796   Rescheduling interrupts
CAL:       3889       6659   Function call interrupts
TLB:     137697     175959   TLB shootdowns
TRM:          0          0   Thermal event interrupts
THR:          0          0   Threshold APIC interrupts
MCE:          0          0   Machine check exceptions
MCP:        533        533   Machine check polls
ERR:          1
MIS:          0
比如这里可以看出,我的机器有两个CPU(其实是dual core)

IRQ SMP Affinity
http://www.cs.uwaterloo.ca/~brecht/servers/apic/SMP-affinity.txt


irqbalance
http://www.irqbalance.org/documentation.html

Thursday, May 05, 2011

[Linux]中文字体美化笔记

升级到Ubuntu 11.04之后, 突然中文设置全都混乱了.于是只好重新设置.笔记一下以免下次再出现.我主要是设置firefox和fontconfig的字体替换.

背景知识
有衬线(Serif) 无衬线 (Sans Serif)和等宽(Monospace)字型
  • 1 有衬线(Serif)字型是比较正式的字体,比划粗细不一,在笔划的边缘有装饰部分(我的理解是有笔锋)。英文当中比较有名的包括 Times New Roman, Georgia, 而中文当中则是包括大名鼎鼎的宋体,明体(繁体宋体在港台的叫法)。Serif font 的好处是看起来比较容易辨认,我自己觉得读起来速度会快。
  • 2 无衬线(Sans Serif)是比较活泼一些的字体,比划粗细一致。。英文当中包括Arial, Helvetica, Tahoma, Verdana等,而中文则是包括黑体,幼圆,仿宋好像也算是sans serif。要注意的是,这里的"黑体"有时会造成歧义,如要表达Bold的字体,可能粗体是更恰当。Sans Serif 的好处,据说字体小的时候看起来比较舒服。
  • 3 等宽(Monospace)字型顾名思义就是每个字母的宽度相同。通常显示代码的时候用等宽的字体会比较整齐. 另外命令行(Console)里面也用等宽字体比较好看。比较有名的是Courier。 我是Dejavu Sans Mono的忠实粉丝。

DPI
DPI=Dots per inch. 在显示器里可以理解为一英寸长要多少像素。Windows 以及Firefox (all platform)里的默认值为96。以前的话这个值是和大多数显示器差的不会太远。但是很多现在的显示器可以支持到更高(比如我的Macbook Pro的LCD就是110)。那么如果还设定DPI=96,相应的字体就会显小。所以可以首先确定自己系统里设定的DPI是否正确。

字体的单位
Font的大小分为pointsize(单位是pt磅)和pixelsize(单位是px像素).两者换算的关系可参考 http://www.emdpi.com/fontsize.html . 简单说来关于磅和像素这两个单位的换算关系是:1磅=1/72英寸,而1英寸= DPI 像素。 所以一个 X pt 的字,折合 X*DPI/72 px.
Linux系统里面容易混淆的地方是不同地方的设置用的不同的单位. 比如GNOME桌面设置字体的时候,单位是磅(pt)而而Firefox当中字体的设置用的是像素(px).

GNOME设置字体
首先在桌面右键->"Change Desktop Background"->"Font",会出现如下的面板

注意这里的单位是磅(pt)

Firefox设置字体
firefox设置起来很简单. 以Firefox 4为例, 在Edit->Preference->Content->Advanced 面板里, 选择是否允许使用网页指定的字体:
  • 如果你允许网页自己选择字体,则直接跳至fontconfig的设置. 我自己是这么选的---不然网页字体都那么千篇一律,多无聊阿).
  • 如果不允许网页自己指定的字体,则在对于中文(Simplified Chinese)字符集和西文(Western)字符集分别设置Serif, Sans Serif, Monospace三种字型的默认字体.这里字体大小的单位是px(像素),而不是pt(磅).

    但是有时候浏览器自己侦测的网页语言字符集是不对的, 或者有时候就是中文西文混合的(比如上facebook),这样就造成一个两难的局面: 网页语言detect错误时,以英文字体设置显示中文会很丑或者很虚. 如果干脆把浏览器的英文字体也都默认成中文--可是这样上英文网页就会崩溃因为几乎所有的中文字体的英文部分都太丑了.所以需要进行下一步,在fontconfig里做字体替换

fontconfig设置字体
设置fontconfig的作用在于你可以手动设置系统什么时候用什么中文字体.比如系统知道自己要显示一段Sans Serif的文字,英文部分好说,咣咣弄好了, 但是中文部分它不知道得用什么字体.于是你可以在fontconfig里设置,使得它可以用微软雅黑(Microsoft YaHei)来显示那部分中文,这就是字体替换.对自己账户的fontconfig设置在~/.fonts.conf中.
关于fontconfig设置的用法,参考http://linux.die.net/man/5/fonts-conf

这里附上我的~/.fonts.conf文件.
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match target="pattern">
    <test qual="any" name="family">
      <string>serif</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
      <string>Times New Roman</string>
      <string>Times</string>
      <string>Georgia</string>
      <string>Bitstream Vera Serif</string>
      <string>DejaVu Serif</string>
      <string>SimSun</string>
      <string>NSimSun</string>
      <string>Microsoft YaHei</string>
    </edit>
  </match> 
  <match target="pattern">
    <test qual="any" name="family">
      <string>sans-serif</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
      <string>DejaVu Sans</string>
      <string>Ubuntu</string>
      <string>Arial</string>
      <string>Helvetica</string>
      <string>Microsoft YaHei</string>
    </edit>
  </match> 
  <match target="pattern">
    <test qual="any" name="family">
      <string>monospace</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
      <string>DejaVu Sans Mono</string>
      <string>Courier</string>
      <string>Courier New</string>
      <string>Microsoft YaHei</string>
    </edit>
  </match> 
</fontconfig>
有几点说明:
1 因为宋体(比如SimSun, NSimSun)被认为是Serif, 所以我把他们放在了Serif里
2 黑体(比如Microsoft YaHei)是Sans Serif,所以放在了Sans Serif那类
3 因为所有中文字体大小都一样,所以Monospace那里随便用神马字体都可以, 我个人喜欢Microsoft YaHei

Tuesday, May 03, 2011

node.js 学习笔记

占坑先
node.js提供一种framework使得我么可以在server端运行的javascript 如果你是一个新手,务必请先读一下这篇Understand Node.js, 写的非常非常好. 参考
一个对于新手来说很不错的tutorial http://www.nodebeginner.org
Understand node.js event loop

使用minicom给firmware升级

接上串口以后, 在你的主机上运行
minicom
重启board, minicom的屏幕上会出现菜单
1......Program Flash via XModem Download
2......Version
3......Boot System
选择1 ,然后确认. 这时候出现
Erasing blocks ............

Start XModem dowmload...
这个时候先按几下回车,再接着按Ctrl-a s表示send文件, 然后出现如下的菜单来选择不同的protocol
+-[Upload]--+
| zmodem    |
| ymodem    |
| xmodem    |
| kermit    |
| ascii     |
+-----------+
选择xmodem,这时候会出现文件对话框,让你选择哪一个bin文件来升级BIOS. 选择之后, 我发现总是出现incomplete 或者根本就没有progress. 需要多send几次. 就可以了

Wednesday, April 27, 2011

[Linux] filesystem的几个命令

查看filesystem type

$ df -T
Filesystem    Type   1K-blocks      Used Available Use% Mounted on
10.103.0.1:/nfsroot
               nfs   230583296 137044992  81824768  63% /
none      devtmpfs      497684       220    497464   1% /dev
none         tmpfs      502108         0    502108   0% /dev/shm
tmpfs        tmpfs      502108         0    502108   0% /tmp
none         tmpfs      502108        48    502060   1% /var/run
none         tmpfs      502108         0    502108   0% /var/lock
none         tmpfs      502108         0    502108   0% /lib/init/rw
/dev/sda1     ext4   115377640    192116 109324612   1% /localfs

查看硬盘

sudo fdisk -l /dev/sda
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000c821

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758   976771071   488134657    5  Extended
/dev/sda5          501760   976771071   488134656   8e  Linux LVM

格式化硬盘

首先使用fdisk在硬盘上建立partition
$ sudo fdisk /dev/sda
然后格式化
$ sudo mkfs.ext4 /dev/sda1
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4890624 inodes, 19537040 blocks
976852 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
597 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424

Warning: could not read block 0: Attempt to read block from filesystem resulted in short read
Writing inode tables: 151/597
mount硬盘

$ sudo mount -t ext4 /dev/sda1 /my/mountpoint
$ sudo chown binfan:root /my/mountpoint
Ref
http://www.tldp.org/HOWTO/Partition/fdisk_partitioning.html

Sunday, April 17, 2011

关于diff, colordiff

diff常用于比较两个文件的不同:
diff path_to_file1 path_to_file2
可以用-y(或者--side-by-side)来分两列显示diff区别
diff --side-by-side path_to_file1 path_to_file2


diff还可以比较两个文件夹的不同,列出所有不同的文件的不同之处
diff -r path_to_dir1 path_to_dir2
还可以用-q(或者--brief)只显示哪些文件不同
diff --brief -r path_to_dir1 path_to_dir2


colordiff是diff的一个wrap,可以把diff的输出加上不同的色彩.所以通常能用diff的场合都可以放心的改成colordiff.也可以简单的在你的shell启动配置(比如.bashrc)里加上
alias diff=colordiff
关于colordiff的全局设置--比如什么输出配什么颜色--在/etc/colordiffrc当中.你可以把该文件拷贝至~/.colordiffrc然后自行修改.

如果希望svn diff使用colordiff(svn默认使用它自己内建的diff),修改~/.subversion/config文件,加上
diff-cmd = colordiff

Friday, April 15, 2011

[算法]关于字符串的算法

判断字符串的匹配(一个字符串是否在另一个字符串中出现):
KMP, 时间复杂度 线性, O(n)


找出k个字符串的最长公共子字符串(每个字符串长度不超过n):
使用suffix tree. 对于每个字符串建立一棵suffix tree的时间是线性O(n),合并这k棵suffix tree, 然后寻找合并过的大树中拥有属于所有string的最深的节点.


两个文件,各自拥有很多单词.寻找在两个文件中重复出现的单词:
可以用feed-forward bloom filter

Thursday, April 14, 2011

tmux: 更好的screen

tmux是什么?

tmux和screen和类似(关于screen的用法, 参见我写的screen小结).对我来说它比screen优越的地方是,它允许你在一个terminal上窗口上分割成多个tty,这样可以充分利用屏幕而不用来回切换. 比如下图:
你可以使用热键方便的在切割而成的不同的pane间切换.

怎么安装tmux?

Ubuntu下很简单
$sudo apt-get install tmux
在MacOS下可以用port
$sudo port install tmux

哪里有关于tmux的文档?

tmux官方主页
这个写得很赞: Tmux: a crash course
一个写的很好的tutorial:part1, part2
switching from gnu screen to tmux
http://wiki.frugalware.org/index.php/Tmux

tmux怎么使用?

和screen的比较:
功能 screen命令 tmux命令
查看当前session
$screen -ls
$tmux ls
$tmux list-sessions
重入的session
$screen -r
$screen -r session-name
$tmux attach
$tmux attach -t session-id
新建一个session,
执行一个shell命令(比如top)并立刻detach
$screen -m -d top
$screen -S session-name -m -d top
$tmux new-session -d top
发送指令(比如退出)到一个session中
$screen -X quit
$screen -S session-name -X quit
$tmux kill-session
$tmux kill-session -t session-id

Wednesday, April 06, 2011

[Linux]Ubuntu下网络设置

配置网卡IP地址

1 修改/etc/network/interfaces 设置各个网卡地址(DHCP或者静态)
比如下面将第一块以太网卡(eth0)设为DHCP
# The primary network interface
auto eth0
iface eth0 inet dhcp
或者静态绑定IP地址
auto eth0  
iface eth0 inet static  
address 192.168.0.103  
gateway 192.168.0.1  
netmask 255.255.255.0
2 重启网络使新设置生效
/etc/init.d/networking restart


设置DNS

修改/etc/resolv.conf设置DNS服务器的地址. 比如我的DNS服务器为10.212.3.3
nameserver 10.212.3.3
domain apc999.net
search apc999.net


配置SSH Server

1 安装openssh-server
$apt-get install openssh-server
2 修改/etc/ssh/ssh_config可以设置诸如端口(默认是22)等设置.
3 重启ssh server
$sudo /etc/init.d/ssh restart


配置DHCP Server

http://www.ubuntugeek.com/how-to-install-and-configure-dhcp-server-in-ubuntu-server.html
1 安装dhcp3-server
$apt-get install dhcp3-server
2 设置dhcp server
$sudo vi /etc/default/dhcp3-server
把INTERFACES=""改成INTERFACES="eth0" (假设你是要在eth0上做dhcp server)
$sudo vi /etc/dhcp3/dhcpd.conf
根据具体要求做修改
3 重启dhcp3-server
$sudo /etc/init.d/dhcp3-server restart


配置DNS Server

http://ubuntuforums.org/showthread.php?t=236093
可以选择bind9
1 安装dns server
$sudo apt-get install bind9
也可以选择dnsmasq. dnsmasq是一个轻量级的dns/dhcp/tftp server


配置NFS Server

1 安装NFS server
$apt-get install nfs-kernel-server
2 修改/etc/exports
比如要把/share目录共享给192.168.1.0这个网络,增加如下行
/share       192.168.1.0/24(rw,fsid=0,insecure,no_subtree_check,async)
3 重启NFS server
$sudo /etc/init.d/nfs-kernel-server restart


配置tftp Server

http://www.davidsudjiman.info/2006/03/27/installing-and-setting-tftpd-in-ubuntu/
tftp是trivial file transfer protocol的缩写. tftp比ftp功能弱.但是因为简单,常用于net boot 等应用上.tftp-hpa是一个加强版的tftpd
1 安装tftp-hpa
$apt-get install tftp-hpa
2 tftp可以使用xinetd, 所以我们修改/etc/xinetd.d/tftp,让它看起来差不多如下:
service tftp
{
        disable                 = no
        socket_type             = dgram
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -v -s /var/lib/tftpboot
        only_from   = 192.168.0.0/24
        interface   = 192.168.0.1
}
这里我们的tftpd面向192.168.0这个网络,tftp的共享目录在/var/lib/tftpboot. 注意user要在设定的目录中有权限, 不然会有问题.
3 重启tftpd-hpa(通过重启xinetd)
sudo /etc/init.d/xinetd start


PXE Boot Server

PXE Boot使得一台机器的BIOS通过请求一个TFTP服务器来得到一个可以boot的linux image --- 就像你在这台机器上插入了一个CD来boot一样.
1 设置TFTP Server,
2 设置DHCP Server
3 创建或修改/var/lib/tftpboot/pxelinux.cfg/default, 这个文件用来设定PXE启动使用默认使用的Linux 镜像. 比如我的设定是:
LABEL linux
KERNEL vmlinuz-2.6.32-21-server
APPEND root=/dev/nfs initrd=initrd.img-2.6.32-21-server nfsroot=10.103.0.1:/nfsroot boot=nfs ip=dhcp rw --
注意你需要把initrd.img-2.6.32-21-server和vmlinuz-2.6.32-21-server这两个文件放在/var/lib/tftpboot底下.这样使用PXE启动的机器就可以通过tftp来下载Linux内核镜像来启动.


配置iptables实现NAT

(如果是Ubuntu用户可以使用ufw(Uncomplicated Firewall)来配置iptables)
https://help.ubuntu.com/10.04/serverguide/C/firewall.html
http://www.howtoforge.com/nat_iptables

设置IP FORWARDing and Masquerading
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT
如果希望每次启动的时候都加载这些iptables设定, 先把这些rules存到一个文件中(比如IP_FORWARDING):
iptables-save > /etc/IP_FORWARDING
然后修改/etc/network/interfaces
auto eth0
iface eth0 inet dhcp
 pre-up iptables-restore < /etc/IP_FORWARDING
让kernel选择packet forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
也可以修改/etc/sysctl.conf使得默认的ip_forward为1.
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
重要命令
ifup ifdown ifconfig hostname设置主机名称, 比如
$hostname   #显示当前主机名称
$sudo hostname foo  #设定当前主机名称为foo
参考:
Setting up Network Interfaces Debian Network Setup ubuntu 10.10 Network config

Tuesday, April 05, 2011

tweak your thunderbird for gmail

http://lifehacker.com/#!314574/turn-thunderbird-into-the-ultimate-gmail-imap-client

Sunday, March 27, 2011

libc interface v.s. system call

啥是System Call

$man 2 intro
INTRO(2)                                                Linux Programmer's Manual                                               INTRO(2)

NAME
       intro - Introduction to system calls

DESCRIPTION
       Section  2 of the manual describes the Linux system calls.  A system call is an entry point into the Linux kernel.  Usually, sys‐
       tem calls are not invoked directly: instead, most system calls have corresponding C library wrapper functions which  perform  the
       steps  required (e.g., trapping to kernel mode) in order to invoke the system call.  Thus, making a system call looks the same as
       invoking a normal library function.


每个system call都有一个number在<syscall.h>中. system call列表在Linux Kernel Source的arch/i386/kernel/entry.S中.

strace: 跟踪一个程序, 输出程序执行过程中所调用的system call

$strace ls 
execve("/bin/ls", ["ls"], [/* 25 vars */]) = 0
brk(0)                                  = 0x25b3000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c0f616000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=144586, ...}) = 0
...

System Call Reference

lisp笔记

编程环境

Emacs的用户显然有福. 在Emacs中,可以用M-x ielm进入Emacs自带的lisp解释器

第一段代码:Hello World

ELISP> (print "Hello world")
"hello world"

读入编辑好的lisp文件

ELISP> (load "~/test.lisp")

四则运算

ELISP> (* 7 10)    ;计算7*10
70
ELISP>(* 2 ( cos 0) (+ 4 6))     ;计算2*cos(0)*(4+6)
20.0

循环

ELISP> (loop for i in '(1 2 3) do (print i))
1
2
3
其他loop方式

定义函数

ELISP>(defun multiply-by-seven (number)
         (* 7 number))
multiply-by-seven
ELISP>(multiply-by-seven 10)
70

参考

[1]GNU Emacs Lisp

Thursday, March 24, 2011

aspell

安装aspell
MacOS
$sudo port install aspell
$sudo port install aspell-dict-en

修改~/.emacs
(setq ispell-program-name "aspell")

rsync

参考
Rsync on Ubuntu

同步两个目录的文件src和dst,两个文件可以在同一台机器上:
$rsync -a /home/path/src/ /home/path/dst/
两个文件也可以在不同的机器上, 比如从远端同步到本地:
$rsync -a -e ssh apc999@host:/home/path/src/ /home/path/dst/
或者从本地同步到远端:
$rsync -a -e ssh /home/path/src/ apc999@host:/home/path/dst/

一个稍微复杂些的例子:
将本目录文件(除 .svn文件外)同步到host上,保持所有文件属性
rsync --delete -azvv --exclude '.svn*' -e ssh . apc999@host:~/foo/
选项:
  • -a: 保持文件的时间权限等属性
  • -z: 在传输中压缩
  • -b: 如果覆盖一些文件,备份被覆盖的文件
  • -e: 指定remote shell
  • -r: 递归同步子目录
  • -v: verbose,显示详细的输出
  • --delete: 删除dst中src没有的文件
  • --exclude: 对于某些文件不进行同步

Friday, March 18, 2011

英语,paper, 总结一下

每句在20个单词左右, 避免过长或过短.亲!!!!!!!!!!!!!!!!!!!!!!!!

句式保持变化, 每句都用we开头是非常口语的, 有木有!!!!!!!!!!!!!!!!

单数可数名词记得加冠词.冠词伤不起啊!!!!!!!!!!!!!!!!!!!!!!!!!

不要用following contributions, 直接说three controbutions,有木有!!!!!!!!!!!!

Friday, March 11, 2011

SSD notes

Cell: SLC(Single Level Cell)每一个cell可以存储一个bit,而MLC(Multiple Level Cell)每一个cell可以存储多个bit. MLC有更高的存储密度, 但是读和写一个cell也要花上更多时间.

Page: SSD一般把多个Cell组织成一个page,page的大小通常是4KB. page是SSD上读和写的最小单位.

Block: 而128个page又被组织成一个512KB大小的block. block是擦除数据的最小单位.

TRIM: 当要写的page为空的时候, 可以直接在这个page上写. 然而当这个page不为空的时候, 就需要把这个page所属于的block读入内存,然后在内存中改写相应的page内容,把SSD上的block完全擦除,再写入更改过后的block. 所以哪怕只是做一个bit的改动, 也需要完成上述步骤. 所以在SSD上做in-place或者random的写代价是非常的昂贵. 另外频繁的擦写也会对SSD的寿命造成损害因为一块MLC的SSD通常只能被反复擦写10000次.

这种独特的读写特性也给传统的文件系统带来的"困扰".比如文件系统通常自己维护可用page的信息并进行分配,而不会告知底层存储设备某个page的数据是依然有效还是已经被删除. 一旦有新的数据需要写入一个已有数据的page,就有可能需要等待先要擦除整个block,造成写的性能降低. 为了解决这个问题,很多SSD都支持TRIM这个功能来和操作系统交互. 当操作系统删除一个文件的时候, 除了更新文件系统外还会给SSD设备发送TRIM命令来告知这些文件占据的page已经不需要保存. 这样SSD可以提前用昂贵的block擦除更新把这些page清空. 在下次写的时候就不需要等待整个block的更新了.

Tuesday, March 01, 2011

[Linux]查看/控制登陆

查看最近登陆情况
last

或者查看/var/log/auth.log也可以找到被记录的登陆信息

修改/etc/hosts.allow
sshd:    1.2.3.4,  5.6.
这样可以让ip为1.2.3.4以及处于网段5.6.的client通过ssh登陆本机
修改/etc/hosts.deny
sshd:    all
这样除了hosts.allow中定义的ip外所有链接全部拒绝