yaron's space
记录学习过程中的点点滴滴
记录学习过程中的点点滴滴
十 8th
如果单纯地使用sort按行进行排序比较简单,
但是使用sort按多个列值排列,同时使用tab作为分隔符,而且对于某些列需要进行逆序排列,这样sort命令写起来就比较麻烦了
比如下面的文件内容,使用[TAB]进行分割:
Group-ID Category-ID Text Frequency ---------------------------------------------- 200 1000 oranges 10 200 900 bananas 5 200 1000 pears 8 200 1000 lemons 10 200 900 figs 4 190 700 grapes 17
下面使用这些列进行排序(列4在列3之前进行排序,而且列4是逆序排列)
* Group ID (integer) * Category ID (integer) * Frequency “sorted in reverse order” (integer) * Text (alpha-numeric)
排序后的结果应该为:
Group-ID Category-ID Text Frequency ---------------------------------------------- 190 700 grapes 17 200 900 bananas 5 200 900 figs 4 200 1000 lemons 10 200 1000 oranges 10 200 1000 pears 8
可以直接使用sort命令来解决这个问题:
sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 <my-file>
解释如下:
-t $'\t':指定TAB为分隔符 -k 1, 1: 按照第一列的值进行排序,如果只有一个1的话,相当于告诉sort从第一列开始直接到行尾排列 n:代表是数字顺序,默认情况下市字典序,如10<2 r: reverse 逆序排列,默认情况下市正序排列
所以最后的命令:sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 my-file
十 6th
原文地址:register、volatile、restrict 三关键字的用法 – RaymondAmos的技术专栏 – CSDN博客.
register
使用修饰符register声明的变量属于寄存器存储类型。该类型与自动存储类型相似,具有自动存储时期、代码块作用域和内连接。声明为register 仅仅是一个请求,因此该变量仍然可能是普通的自动变量。无论哪种情况,用register修饰的变量都无法获取地址。如果没有被初始化,它的值是未定的。
volatile
volatile告诉编译器该被变量除了可被程序修改外,还可能被其他代理、线程修改。因此,当使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不使用寄存器中的缓存的值。比如,
val1=x; val2=x;
如 果没有声明volatile,系统在给val2赋值的时候可能直接从寄存器读取x,而不是从内存的初始位置读取。那么在两次赋值之间,x完全有可能被被某 些编译器未知的因素更改(比如:操作系统、硬件或者其它线程等)。如果声明为volatile,编译器将不使用缓存,而是每次都从内存重新读取x。
restrict
restrict是c99引入的,它只可以用于限定指针,并表明指针是访问一个数据对象的唯一且初始的方式,考虑下面的例子:
int ar[10]; int * restrict restar=(int *)malloc(10*sizeof(int)); int *par=ar;
这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。那么:
for(n=0;n<10;n++) { par[n]+=5; restar[n]+=5; ar[n]*=2; par[n]+=3; restar[n]+=3; }
因 为restar是访问分配的内存的唯一且初始的方式,那么编译器可以将上述对restar的操作进行优化:restar[n]+=8;。而par并不是访 问数组ar的唯一方式,因此并不能进行下面的优化:par[n]+=8;。因为在par[n]+=3前,ar[n]*=2进行了改变。使用了关键字 restric,编译器就可以放心地进行优化了。这个关键字据说来源于古老的FORTRAN。
总结
两个关键字:volatile和restrict,两者都是为了方便编译器的优化。
九 25th
两道的题目:
1. dup(int fd)和dup2(int fd1, int fd2)函数的区别:详细请见http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx
2. 有关一致性哈希的算法设计
其他的是 多项选择题目,涉及的范围比较广,linux和语言层次的题目偏多一些吧
包括堆栈缓冲区溢出以及linux内核中container_of宏的实现,以及spinlock和虚拟内存的相关知识
关于container_of这个请参考我的前一篇blog: http://yaronspace.cn/blog/index.php/archives/1026
八 26th
最近客户端连debian下sshd很慢,每次都需要等待半分钟左右,今天终于无法忍受了,上网找了下资料,把这个问题解决了
原因:
主要是debian在默认情况下开启了dns的反向解析,这个比较耗时
解决方法:
1. 编辑/etc/nsswitch.conf 找到hosts行,替换为
hosts: files dns [NOTFOUND=return]
2. 查看/etc/resolv.conf文件,查看dns地址是否设置正确,如果没有用,直接注掉即可
3. 重启sshd : 先kill掉,然后/usr/sbin/sshd 启功即可
八 10th
原文地址:http://blogread.cn/it/article.php?id=3908&f=sa
[root@localhost ~]# iostat -d -x 2 extended device statistics device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b hda 0 0 0.0 0.9 0.1 5.4 6.3 0.0 4.7 0.9 0 extended device statistics device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b hda 0 3 0.0 2.0 0.0 20.0 10.0 0.0 0.8 0.5 0 ......
命令释意: 查看磁盘 I/0 情况,且每两秒刷新一次
[root@localhost ~]# vmstat 5 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 284 68700 165876 416748 0 0 0 5 1 1 0 0 100 0 0 ......
命令释意: 查看CPU使用情况的命令, 每 5 秒刷新一次,最右侧列为 CPU 的占用率的数据
[root@localhost ~]# top
然后在 top 的命令内部命令栏输入shift+p or P
top - 13:38:52 up 102 days, 4:17, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1035292k total, 966592k used, 68700k free, 165876k buffers Swap: 2096472k total, 284k used, 2096188k free, 416760k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4875 root 15 0 2192 1000 800 R 0.3 0.1 0:00.15 top 1 root 15 0 2060 620 532 S 0.0 0.1 0:01.65 init 2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0 .......
命令释意: 查看进程处理器占用率情况,并对其进行排序
[root@localhost ~]# free total used free shared buffers cached Mem: 1035292 966592 68700 0 165876 416768 -/+ buffers/cache: 383948 651344 Swap: 2096472 284 2096188
命令释意: 查看内存使用情况
[root@localhost ~]# top
然后在 top 的命令内部命令栏输入shift+m or M
top - 13:48:52 up 102 days, 4:27, 1 user, load average: 0.00, 0.01, 0.00 Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1035292k total, 966592k used, 68700k free, 165876k buffers Swap: 2096472k total, 284k used, 2096188k free, 416784k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4128 root 34 19 280m 266m 2112 S 0.0 26.4 1:48.40 yum-updatesd 8314 www 18 0 171m 34m 34m S 0.0 3.4 0:06.03 memcacheq 8280 www 15 0 88084 34m 588 S 0.0 3.4 0:01.23 memcached 10907 mysql 15 0 122m 16m 3892 S 0.0 1.7 0:25.29 mysqld ......
命令释意: 查看进程内存占用率情况,并对其进行排序
更多 >
八 3rd
已知random3()这个随机数产生器生成[1, 3]范围的随机数,请用random3()构造random5()函数,生成[1, 5]的随机数?
如何从[1-3]范围的数构造更大范围的数呢?同时满足这个更大范围的数出现概率是相同的,可以想到的运算包括两种:加法和乘法
考虑下面的表达式:
3 * (random3() – 1) + random3();
可以计算得到上述表达式的范围是[1, 9] 而且数的出现概率是相同的,即1/9
下面考虑如何从[1, 9]范围的数生成[1, 5]的数呢?
可以想到的方法就是 rejection sampling 方法,即生成[1, 9]的随机数,如果数的范围不在[1, 5]内,则重新取样
int random5() { int val = 0; do { val = 3 * (random3() - 1) + random3(); } while (val > 5); return val; }
将这个问题进一步抽象,已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数,m < n && n <= m *m
一般解法:
int random_n() { int val = 0 ; int t; // t为n最大倍数,且满足 t <= m * m do { val = m * (random_m() - 1) + random_m(); } while (val > t); return val; }
http://stackoverflow.com/questions/137783/expand-a-random-range-from-1-5-to-1-7
七 18th
今天在逛水木的时候,发现这篇文章:http://www.newsmth.net/bbsrecon.php?id=8017
是对vimperator进行了介绍,原来国外哥们写的firefox插件,能够像使用Vim的方式来高效地使用firefox,下来来尝试了,效果不错!
下载地址:https://addons.mozilla.org/en-US/firefox/addon/vimperator/
常用命令(不断更新):
open: 在当前tab打开新的网址 open www.baidu.com
tabopen: 在新的tab打开网址
back: 后退键
forward:前进键
gt/gT:在tab间进行移动
d: 关闭当前tab
hjkl:上下移动网页或者光标
i(insert):进入insert模式,可以移动光标
/ :搜索网页的内容
总的来说很强大哈!!!
七 18th
这篇文章从mysql索引的内部结构B+树来分析如何来提高索引的性能,以及索引如何进行存储等方面,
写的比较通俗易懂,推荐!
地址:http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html
七 16th
原文地址:http://coolshell.cn/articles/3345.html
来源:http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html(墙)
这篇Blog例举了Google用来面试下面这几个职位的面试题。很多不是很容易回答,不过都比较经典与变态,是 Google,Microsoft,Amazon之类的公司的风格。对于本文,我没有翻译,因为我相信,英文问题是最好的。不过对于有些问题,我做了一些 注释,不一定对,但希望对你有帮助启发。对于一些问题,如果你百思不得其解,可以Google一下,StackOverflow或是Wikipedia上 可能会给你非常全面的答案。
近期评论