技术宅和经济盲

Sunday, January 15, 2012

从mac到remote emacs

经常要remote到linux上写code,有些自己的emacs上的设置很方便,偏生NX常常速度慢得不行,VNC啥的看上去跟Terminal也没啥区别,所以就考虑用terminal ssh搞定一个可以远程编辑的,跟图形界面不相上下的环境。


目标:Mac Terminal/ITerm -> ssh linux machine -> tmux -> emacs
解释:
- 用tmux的原因是可以保存干活的场景。这样在公司没做完的事情,回家打开环境什么都是一样的。不用screen的原因是它的代码我看不懂。
- 用emacs很直接,除了java之外所有的代码都是用emacs写来最方便。(hiahia,我期待以后可以写点go的东西,伊还是非常言简意赅的,而且貌似比python还漂亮一些)至于emacs的代码,我也看不懂,不过总算用的时间比较长,大约能就着manual (Ctrl-h f)看函数。
- ssh是必须的。
- Mac的term有很多,Terminal和Iterm是最有名的两个。所以就暂定是它们了。后来用了Iterm2,因为更方便的配置能力。

过程:
- 首先要确认Meta + Function Keys能正确的传。老实说,最后看下来这一步最累。
    以前完全不懂Linux的key stroke怎么最后转换成Application的Input的。X Windows底下是接受一些Events,想来Linux应该也差不多。但是emacs里面是确定的key-binding,比如:
    (global-set-key [(control next)] 'next-multiframe-window)
也就是说把multiple key events变成了一个了,term模式下应该也差不多。
    以上是猜,然后去看document。搞了将近六七个小时,大约有点明白敲键盘的时候会有scan code,然后根据loadkeys里面保存的keymap,可以将scan code按key code的方式转换成key symbols。事实上,我最后也没有具体去把它弄成key symbols,因为强大的emacs直接使用scan code了,这是后话。(这是term模式下的方式,如果是X下的话,loadkeys用xmodmap代替,两者的map按documents上的说法,大同小异)
    于是,第一步要搞清楚按键的scan code。文档里面有提到用console-tools里面的showkey,于是就试了试,没搞出来Ctrl-PgDn。讶异中去翻了一下showkey的代码:
http://codesearch.google.com/#F6AYLsPZoMQ/showkey.c&q=showkey&type=cs
然后就极度怀疑read(...)怎么可能把真实的东西读到?(事实上它做的挺正确的,因为前面又ioctl,已经设置了read(...)的模式了,事后才知道的)基于这样的怀疑,又开始找帖子、看代码,打算自己写一个这样的东西。貌似大家都用curses/ncurses这样的库,于是下了一个,写了个简单的代码如下:

#include <stdlib.h>
#include <ctype.h>
#include <curses.h>

int main(void)
{
  WINDOW *_window = initscr();
  int _rows;
  int _cols;

  cbreak();

  /* Accept all keys */
  keypad(_window, true);

  /* Don't echo things that are typed */
  noecho();

  /* Get the screen dimensions */
  getmaxyx(_window, _rows, _cols);

  /* Don't display cursor */
  curs_set(0);

  for (;;)
  {
    printw("Press a Key ");
    refresh();
    int key = wgetch(_window);
    printw("%d \n", key);
  }

  endwin();

  return 0;
}

按照文档的说法,程序看上去还比较靠谱,只是试来试去,跟showkey的结果就是一样,没反应。但是PgDn这样的又是对的,所以我开始觉着我的程序其实是对的了。

于是把程序放到client机器上跑了跑:在Terminal / Iterm 下跟在远程的结果是一样的。有点怀疑是terminal屏蔽了一些键,于是在windows下用putty连到linux上试了试,也是一样。(后来很后悔这一试,让我几乎认为不是屏蔽的问题了)好了好多时间都没试通,我宝贵的时间啊⋯⋯最后a还是反过头来怀疑屏蔽的问题,在mac下下了个X server(XQuartz),用里面的xterm试了试,过了   !&*#^*@$(*(*$*&@$  万恶的无尽的terms啊!

这个过了之后,很快用这个xterm连到linux上去试了试,也过了。用tmux试了试,废了。给tmux-users@报了问题,也差不多半夜了,就睡去了。

睡觉的时候忽然想,xterm可以过,没道理Iterm这样的不能用啊?第二天找来找去发现Iterm也有xterm模式,只是里面的设置少的可怜。记得Iterm2在跟tmux做integration,所以顺便下了个Iterm2,一下发现里面可以配置的东西非常多,于是就用了它。只是伊没有Ctrl-PgDn之类,需要自己把xterm上对应的scancode映射过来。

于是,终于搞定scan code映射的问题。

- 之后是tmux的问题。上面说了去tmux-users@报过问题了,第二天一早有位老兄就回信说我需要开xterm-keys option了。打开, 还是不对!用screen试了一下,过了,然后我又误会人家了。只是因为这个问题现在不是关键问题,我跳过去去搞emacs了。下午回来,调了下程序就发现原来我的.tmux.conf里面有错,伊没有正确enable xterm-keys,所以这个问题也过了。

这个时候,我的键盘输入已经可以传送到emacs了,只是传送的是scan code,不是像X下面的key symbols而已了。

- 显然我对emacs比对keycode mapping熟悉,于是就想,肯定有人直接用scan code给xterm用了吧?上网一找,就是xterm-extras.el吗。貌似最新的xterm.el也可以,不过我没有试。当我load好xterm-extras.el的时候,我就已经笑了,我的环境已经跟X底下差不多了,而且远程环境下快了很多。

- 最后还有一些小配置,就是前面说的Iterm2,还有我下了个最新版的emacs 24.0.92编了一把。没发现有什么新东西,只是把我的.emacs更新了一下。(ido被去掉了,不过貌似这东西现在也没太大用了)最悲伤的是,cua mode死活没试通。

TODO:
- tmux还需要有些设置,以方便转化成copy mode上下翻页看历史信息。
- Emacs cua-mode。

Labels:

Wednesday, January 04, 2012

KeyRemap4MacBook,我爱你

有几台Linux,key mapping的配置貌似也没啥特殊的。

有几台Client,分别是Linux / Windows / Mac。经常需要远程等到上述的几台Linux干活,还常常需要开那些个emacs/eclipse什么的。于是,很自然的,就用了NX。然后,问题来了:Linux/Windows下貌似还成,Mac下就老是费,原因是keymapping有问题。大家都知道Apple同学喜欢自己玩一套,所以键都跟别人不大一样,偏偏我老还喜欢用一个无线键盘连到mac,把键map回来干活。因为你知道的,Linux下来时10x键盘最好用吗。

所以,我总共合起来大约花了100小时左右时间再跟NX的xmodmap作斗争,今天调成这样,明天调成那样。这台机器这样,那台机器那样。偶尔还常常碰上一个key明明map上了,打还打不出来的怪事⋯⋯直到碰上了这个软件。

步骤如下:
- 安装之
- 打开System Preference -> KeyRemap4MacBook
- Enable: General -> Don't remap Apple's keyboard

然后不管你连什么样的NX机器,只要Linux/Windows能对的,mac也对了。

它还提供无数的扩展功能,不过为了跟Linux/Windows的clients保持一直,我就统统无视了。

KeyRemap4MacBook,我爱你

Labels:

Monday, May 02, 2011

软件开发工具一览

软件工程事实上越来越标准化了。

我不是很懂CMM之类的东西,只能按我平常开发的流程跑个烂砖头,希望勾出大家有意思的东西来。这个帖子,也是我入伙的时候就很想写的了。我们可以先high-level的讨论一下有那些类,哪些工具。然后以后具体化的开thread一个一个工具讨论过去。

我做的比较土,本来还有点核心的,现在越做越应用了。做核心的时候很是天马行空,不过test啥的还是都有,只是很多时候犯懒,总是依赖我们QA帮我些。现在做应用了,这些东西一个都不能少,要不出了问题客户直接就追到头上了,没有人帮我擦屁屁。慢慢养成了习惯,觉得还是蛮有用的。

首先是test!test已经成我的代码核心了,现在test : src -> 2 : 1了。而且feature deliver之后,因为QA的bug,test会越写越多,绝对是重中之重。这个是影响开发进度的,所以现在基本上老板已经不push我的delivering了,因为我经常delay的。(感谢国家,感谢党,感谢老板,感谢team)

test包括unit test / regression test (smoke test)等等,我不是QA,也没法全懂。自己的code,unit test是肯定免不了的。100% coverage总是求之不得,特别是一些multithreading的,大家如果有特别好的办法,记得共享一下。Java底下的,我们自己还有一些可以定这个thread run到这个method挺一下之类的来check status,C++就完全无解。我写code很马大哈,所以C++ multithreading,我一般就直说我恐怕写不好,虽然以前发paper聊啥minimize critical section一套一套的。

接下来是repository。SourceSafe / CleanCase / cvs / svn / perforce / git都用过,不过现在就比较熟git和perforce了,svn工具多,也可以玩一玩。用了几年的cvs,现在一眼看去,是大不解了。别的bazaar啥的,只能把code check out下来编一编。个人很拜git,确实好用。自己的服务器上放到git repository使用gitosis,还比较简单。这个每个人各有喜好,也没啥好讨论的,就是放堆code的地方吗。git最好的就是没有每个目录给我来一个.svn这样的鬼东西,perforce也是,所以我比较喜欢这两个,仅此而已。(有那个东西的话,我找起东西来,还需要把伊滤掉,like: find . | grep -v "\.svn" | xargs grep -nH "xxx" {} \; (这个命令不做准啊,xargs大意如此,因为我平常只要find . -exec grep -nH "xxx" {} \;就行的)

接下来是code review。感谢国家,感谢党,感谢公司,我们可以用一个command很容易的发patch给相应的人,而且有一个online system做side-by-side的comparing,对效率大有帮助。谈code review不得不谈coding style,一个软件公司,应该有自己的coding style,保证code到哪看上去都差不多。有些人写code比较牛,比如一个函数一行就写完了(我是说很复杂的那种,我有个朋友以前一行可以写1000多个字的),到了组织里,只能不好意思,拉回去重写了。一个project,铁打的营盘流水的兵,要是你的code太牛,后面的人接不了手,再牛的project也只能扔到垃圾堆里,所以coding style是必要的。现在有很多lint工具可以保证coding style,我个人更希望工具能把coding style都包括进去了,否则一个team里,有些边缘的不同点,很容易伤了大家和气,影响以后的士气。不过貌似做lint的人都不怎么喜欢parsing code,所以做出来的lint都还不是特别精确。这方面java好些,有lint / checkstyle / findbug / ...一系列很好的工具,而且即使code已经进去,还是可以用Hudson / Jenkins之类的东西发现。

对于code review的几个原则:reviewer如果看不懂code,一定要弄懂,否则就不要盖章了。reviewer不光要弄懂code,还要理解design,这是最后的design review,这个时候roll-back,远比code出去了再这么干更好一点。reviewer态度一定要nice一点,人总是在不断鼓励中提高的,你打击人几次,人以后就伤了。关于CR的tool,review board / gerrit (Android用那个)等等等等,现在已经有好多,没有装的,赶紧装一个。(对了,以前svn有post code review的概念,个人不太喜欢,code review就是要side by side,有record的把意见啥的记下来,其实这是很好的提高水平的方法)

接下来是CI。没啥好说的,没有CI赶紧去搞一个,你不希望你的软件今天好明天坏,每天的时间都用来抓bug吧?谁出的问题,第一时间报出来总是好的。

还漏了不少,下次慢慢补了。其实,喜欢project,一心想把project做好,才是最重要的东西。

最近top-language => top-company中,发个贴应应景,让大家有点topic讨论讨论。也许跟lang没啥关系,但是大家不都是码农吗,也还是本行吧。

Sunday, April 24, 2011

vpn server list

http://www.ontko.com/pub/nathanst/linux_vpns.html

Friday, April 15, 2011

关于classpath的HTML parser

我找了不少的时间,终于找到一个可以parse出DOM Level 2 HTML标准的parser。这个东东嵌在GNU classpath项目里,不过还算好分离。

今天看了一下它的parsing。它是用LL(n)文法的。也就是说,对于每一个tag / comments / ...,需要往前看n个token。自然,每次parsing的时候它都可以确定出自己的下一个文法是什么,所以是递归下降分析。

Parser里有一个validator,用来在每次parse出一个tag (or something else)的时候validate文法,同时加入丢失掉的。这个validator是依赖于一个DTD构造器的,一个很典型的例子可以看HTML_401F.java,这个DTD会对没有header和body的自动加入header和body。然后对于在前面的elements,如果可以加入header就加入,否则就加入到body里。

为了测试方便,我构造了一个没有header的DTD,放在DomHTMLParserTestingUtil里面,同时也有简单的例子。

另外,我还搞了一个Node.toString()来打出需要的node信息。后面有空的话,要把这个改成可以dump出xml文法的东西来,或者是toXML() / toProtoBuf() or something else...

今天很有成就感,这几天都很有成就感,要保持~~~

希望尽快把porting做完,并且有足够的unit tests来保证stability。以后就可以考虑更进一步的东西了。

Sunday, April 10, 2011

关于JavaScript

Firebug用的不多,不过Chrome的Developer Tools还真是不错,这里是一些tips。

- 快捷键列表:http://code.google.com/chrome/devtools/docs/shortcuts.html
- 帮助总汇:http://code.google.com/chrome/devtools/docs/overview.html

Saturday, April 09, 2011

Maven documents

POM reference: http://maven.apache.org/pom.html#Directories
这个是所有共享设置的地方。

Plugin references: 看各自的Pluging,主要有下面两类:
- Maven自带的 http://maven.apache.org/plugins/index.html
- Codehaus的 http://mojo.codehaus.org/plugins.html

Our Maven tips: http://code.google.com/p/ascentdimension/wiki/MavenTips

总的来说,maven很好用,需要好好找个地方写wiki

Labels: