Browsed by
Month: November 2016

Effective Go & GoFAQ 阅读笔记

Effective Go & GoFAQ 阅读笔记

Effective go: https://golang.org/doc/effective_go.html Go FAQ: https://golang.org/doc/faq 下面是对以上两篇文章内相关内容的记录与解释/总结 Interface 某一个 type “implement” 这个 interface 的话,只要实现这个interface的全部方法即可 不过这里有一些容易产生误区的地方,看下面这个例子   type T int interface Equaler { Equal(Equaler) bool } Equaler是一个interface, 下面看这两个例子 func (t T) Equal(u T) bool { return t == u } type T并没有实现Equaler interface 因为参数类型不是 Equaler 而是一个具体的类型 T 这个问题很容易理解, 试想一下其他某一个type implement了Equaler类型(假设为Q) 而 t.Equal(Q) 是不合法的 因为Q不是T类型, 所以 T 并没有实现Equaler这个interface 因为Equaler接口要求只要满足type为Equaler就都可以作为参数传递给Equal 下面这个才是T implement Equaler的例子 func (t T) Equal(u T) bool { return t == u.(T) }   interface 的 value = nil 不代表interface为nil, interface的结构为type, value两部分 下面这个代码永远会返回错误…

Read More Read More

APUE 3e 部分习题整理 Chap5

APUE 3e 部分习题整理 Chap5

Chapter5 5.1 使用setvbuf实现setbuf 根据 man手册 setbuf(FILE *stream, char *buf) 中如果指定 buf == NULL 那么就是关闭 buf,  如果指定 buf != NULL 那么就创建一个 BUFSIZ 大小的 buffer 供流使用 因而实现的代码如下 // 5.1 Answer void mysetbuf(FILE *stream, char *buf) { setvbuf(stream, buf, buf ? _IOFBF :_IONBF, BUFSIZ); } 5.5 对标准I/O流如何使用fsync fsync 需要的参数是 fd 描述符,因而只要能获得文件 FILE 结构体的 fd 值即可 这里一定要注意: 在使用fsync的时候一定要fflush流的缓冲区 fsync是将内核里的缓存数据写入磁盘/文件, 而对于打开的文件 是全缓冲的,也就是说没有写满IO缓冲区之前是不会去写入内核缓冲区的 因而就算调用fsync也没有什么用呢~ 你需要先把数据从 IO buffer中写入内核buffer然后fsync才有用 所以一定要fflush   P.S.:天真的窝以为这题只是考察能不能把FILE结构体给找到,并拿出来相应的fileno,没想到我太天真了=o= #include<stdio.h> #include<unistd.h> int fsync_stream(FILE *stream); int main(void) { FILE *fp = fopen(“demo.txt”, “w+”); fprintf(fp, “I love…

Read More Read More

tmux 终端效率利器

tmux 终端效率利器

重度终端使用者的话如果没有一个好的终端多任务管理的工具是非常痛苦的, tmux是一个非常好用的终端多任务多session多窗口管理工具 功能十分强大 具体的介绍可以看这里 https://raw.githubusercontent.com/tmux/tmux/master/FAQ 效果图     tmux的manpage十分长,不是所有的功能都会常用到,这里有一个cheatsheet记录了常用的功能 https://tmuxcheatsheet.com/ tmux-powerline 非常美观实用的一个tmux工具 github repo  https://github.com/erikw/tmux-powerline 下面是各种个人配置的tip 修改tmux默认Ctrl b为其他键位 set-option -g prefix C-a 修改tmux窗口的名字 并保持名字不会更改 echo “export DISABLE_AUTO_TITLE=true” >> ~/.zshrc 然后source配置文件让设置生效 在tmux中开启新的窗口的时候,默认以最初启动tmux的时候的路径开启,这样很不方便,配置~/.tmux.conf让其以当前目录创建新的窗口和分割,增加如下三行配置 bind c new-window -c “#{pane_current_path}” bind ‘”‘ split-window -c “#{pane_current_path}” bind % split-window -h -c “#{pane_current_path}” 向所有当前window的pane(窗口)内输入同样的指令 :set-option synchronize-panes on/off