(更新中)
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
$$
Friday, May 13, 2011
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
可以从ppa源里安装
https://launchpad.net/~ubuntu-toolchain-r/+archive/test
Sunday, May 08, 2011
[Linux]关于用户,组
增加用户foo
把用户foo添加到group admin当中(这样foo就可以sudo)
增加组bar
查看某个用户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).
在
IRQ SMP Affinity
http://www.cs.uwaterloo.ca/~brecht/servers/apic/SMP-affinity.txt
irqbalance
http://www.irqbalance.org/documentation.html
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)字型
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设置字体
设置fontconfig的作用在于你可以手动设置系统什么时候用什么中文字体.比如系统知道自己要显示一段Sans Serif的文字,英文部分好说,咣咣弄好了, 但是中文部分它不知道得用什么字体.于是你可以在fontconfig里设置,使得它可以用微软雅黑(Microsoft YaHei)来显示那部分中文,这就是字体替换.对自己账户的fontconfig设置在~/.fonts.conf中.
关于fontconfig设置的用法,参考http://linux.die.net/man/5/fonts-conf
这里附上我的~/.fonts.conf文件.
1 因为宋体(比如SimSun, NSimSun)被认为是Serif, 所以我把他们放在了Serif里
2 黑体(比如Microsoft YaHei)是Sans Serif,所以放在了Sans Serif那类
3 因为所有中文字体大小都一样,所以Monospace那里随便用神马字体都可以, 我个人喜欢Microsoft YaHei
背景知识
有衬线(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
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
查看硬盘
格式化硬盘
首先使用fdisk在硬盘上建立partition
http://www.tldp.org/HOWTO/Partition/fdisk_partitioning.html
$ 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/mountpointRef
http://www.tldp.org/HOWTO/Partition/fdisk_partitioning.html
Sunday, April 17, 2011
关于diff, colordiff
diff常用于比较两个文件的不同:
diff还可以比较两个文件夹的不同,列出所有不同的文件的不同之处
colordiff是diff的一个wrap,可以把diff的输出加上不同的色彩.所以通常能用diff的场合都可以放心的改成colordiff.也可以简单的在你的shell启动配置(比如.bashrc)里加上
如果希望svn diff使用colordiff(svn默认使用它自己内建的diff),修改~/.subversion/config文件,加上
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
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下很简单
哪里有关于tmux的文档?
tmux官方主页
这个写得很赞: Tmux: a crash course
一个写的很好的tutorial:part1, part2
switching from gnu screen to tmux
http://wiki.frugalware.org/index.php/Tmux
tmux怎么使用?
和screen的比较:
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
设置DNS
修改/etc/resolv.conf设置DNS服务器的地址. 比如我的DNS服务器为10.212.3.3
配置SSH Server
1 安装openssh-server
3 重启ssh server
配置DHCP Server
http://www.ubuntugeek.com/how-to-install-and-configure-dhcp-server-in-ubuntu-server.html
1 安装dhcp3-server
3 重启dhcp3-server
配置DNS Server
http://ubuntuforums.org/showthread.php?t=236093
可以选择bind9
1 安装dns server
配置NFS Server
1 安装NFS server
比如要把/share目录共享给192.168.1.0这个网络,增加如下行
配置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
3 重启tftpd-hpa(通过重启xinetd)
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 镜像. 比如我的设定是:
配置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
ifup ifdown ifconfig hostname设置主机名称, 比如
Setting up Network Interfaces Debian Network Setup ubuntu 10.10 Network config
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.02 重启网络使新设置生效
/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-server2 修改/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-server2 设置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-server2 修改/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-hpa2 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
每个system call都有一个number在<syscall.h>中. system call列表在Linux Kernel Source的arch/i386/kernel/entry.S中.
strace: 跟踪一个程序, 输出程序执行过程中所调用的system call
System Call Reference
啥是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
读入编辑好的lisp文件
四则运算
循环
定义函数
参考
[1]GNU Emacs 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
修改~/.emacs
MacOS
$sudo port install aspell $sudo port install aspell-dict-en
修改~/.emacs
(setq ispell-program-name "aspell")
rsync
参考
Rsync on Ubuntu
同步两个目录的文件src和dst,两个文件可以在同一台机器上:
一个稍微复杂些的例子:
将本目录文件(除 .svn文件外)同步到host上,保持所有文件属性
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,有木有!!!!!!!!!!!!
句式保持变化, 每句都用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的更新了.
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]查看/控制登陆
查看最近登陆情况
或者查看/var/log/auth.log也可以找到被记录的登陆信息
修改/etc/hosts.allow
修改/etc/hosts.deny
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外所有链接全部拒绝
Subscribe to:
Posts (Atom)

