Archive for 05月, 2007

java的变量名可以是中文hoho~

星期二, 05月 29th, 2007

今天上课时知道的,测试了一下挺好玩 。

import java.lang.*;
import java.io.*;

public class test{

    public static void main(String argv[]){
        int 年=2007;
        System.out.println(年);
    }
}

输出

2007

知道名字和不知道名字

星期四, 05月 24th, 2007

今天上软件工程,才知道我们一直进行的是黑盒测试(功能测试)。突然想起了《Bleah》中的一句话。ho~ho~

“知道名字和不知道名字有天壤之别。”

挺有道理,知道一个概念后会有意识的去主动运用,而不是处于原来的无意识状态。

将重复代码改成循环

星期一, 05月 21st, 2007

如果有大量重复代码,可以考虑将其改写为循环or函数

比如下面的

//deal with stat -> if ( B ) M1 stat1 N else M2 stat2
void if_stat(){
 
  SemRecord stat2 = sem_stk.top();
  sem_stk.pop();
  if(SEM_DEBUG){
    cout<<"pop stat2";
    out_SemRecord(stat2);
  }

  SemRecord M2 = sem_stk.top();
  sem_stk.pop();
  if(SEM_DEBUG){
    cout<<"pop M2";
    out_SemRecord(M2);
  }

  SemRecord Else = sem_stk.top();
  sem_stk.pop();
  if(SEM_DEBUG){
    cout<<"pop else";
    out_SemRecord(Else);
  }
  ...
}

中间有大量的重复代码,写成函数不合适,改成循环就好多了

//deal with stat -> if ( B ) M1 stat1 N else M2 stat2
void if_stat(){

  //size = 11
  const char* s[]={"if","(","B",")","M1","stat1","N","else","M2","stat2","stat"};
 
  SemRecord sem[11];
 
  for(int i=9 ; i>=0 ; i--){
    sem[i] = sem_stk.top();
    sem_stk.pop();
 
    if(SEM_DEBUG){
      cout<<"pop "<<s[i];
      out_SemRecord(sem[i]);
    }
  }
...
}

vim的替换

星期日, 05月 20th, 2007

在写编译程序时遇到了以下问题:已有下列文本

#define AUTO 1
#define BREAK 2
#define CASE 3
...

要写这样的代码:

token_map["auto"]=AUTO;
token_map["break"]=BREAK;
token_map["case"]=CASE;
...

用vim如何实现呢?

首先将其变为

AUTO
BREAK
CASE
...

:%s/#define //g
:%s/ [0-9]*$//g

之后用

:%s/[A-Z]*/token_map["L"]=U\0/g;

Now it’s okay! Enjoy:)

以下是vim参考手册中change列出来的

magic	nomagic	  动作    ~
  &	  &	  替代为完整的匹配				     s/&
 &	   &	  替代为 &
        替代为完整的匹配			 	         s/
     1	  替代为匹配的第一个 () 里面的内容		     s/1
     2   替代为匹配的第二个 () 里面的内容		     s/2
      ..	  ..						     s/3
      9	  替代为匹配的第九个 () 里面的内容		     s/9
  ~	  ~	  替代为前一个 substitute 的替代字符串		     s~
 ~	   ~	  替代为 ~					     s/~
      u	  下一个字符成为大写				     s/u
      U	  其后字符成为大写,直到 E 出现		     s/U
      l	  下一个字符成为小写				     s/l
      L	  其后字符成为小写,直到 E 出现		     s/L
      e	  结束 u、U、l 和 L (注意: 不是 !)	     s/e
      E	  结束 u、U、l 和 L				     s/E
      	  把该行在此位置一分为二
		  ( 以 CTRL-V  方式输入)		     s
      r	  同上						     s/r
      	  插入一个回车 (CTRL-M)
		  ( 以 CTRL-V  方式输入)		     s/
      n	  插入一个  (文件里的 )
		  (此处并不是换行)				     s/n
      b	  插入一个 					     s/b
      t	  插入一个 				     s/t
      	  插入单个反斜杠				     s/
      x	  其中 x 是上面没提到的任何一个字符:
		  保留作将来的扩展

示例:
  :s/a|b/xxxxxx/g             修改 "a b"      为 "xxxaxxx xxxbxxx"
  :s/([abc])([efg])/21/g   修改 "af fa bg" 为 "fa fa gb"
  :s/abcde/abc^Mde/              修改 "abcde"    为 "abc"、"de" (两行)
  :s/$/^M/                      修改 "abcde"    为 "abcde^M"
  :s/w+/u/g                 修改 "bla bla"  为 "Bla Bla"

Starcraft 2 is coming!

星期六, 05月 19th, 2007

The Greatest News Today!

挂载磁盘

星期六, 05月 19th, 2007

查看分区UUID命令是: ls -l /dev/disk/by-uuid

用pmount自动mount U盘: pmount /dev/sda

Graphviz – Graph Visualization Software

星期二, 05月 15th, 2007

编译原理试验报告要画CFSM的状态图。在网上找了半天才知道这个东西叫做Graph Visualization.找到了一个开源的叫做Graphviz.

下面是一个例子
fsm

以下是代码:

digraph finite_state_machine {
	rankdir=LR;
	size="8,5"
	node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
	node [shape = circle];
	LR_0 -> LR_2 [ label = "SS(B)" ];
	LR_0 -> LR_1 [ label = "SS(S)" ];
	LR_1 -> LR_3 [ label = "S($end)" ];
	LR_2 -> LR_6 [ label = "SS(b)" ];
	LR_2 -> LR_5 [ label = "SS(a)" ];
	LR_2 -> LR_4 [ label = "S(A)" ];
	LR_5 -> LR_7 [ label = "S(b)" ];
	LR_5 -> LR_5 [ label = "S(a)" ];
	LR_6 -> LR_6 [ label = "S(b)" ];
	LR_6 -> LR_5 [ label = "S(a)" ];
	LR_7 -> LR_8 [ label = "S(b)" ];
	LR_7 -> LR_5 [ label = "S(a)" ];
	LR_8 -> LR_6 [ label = "S(b)" ];
	LR_8 -> LR_5 [ label = "S(a)" ];
}

一个数组越界问题(Windows vs Linux)

星期二, 05月 15th, 2007

今天将Linux下的一个程序转到windows下运行发现了一个问题

#define TERMINAL_LIM 64
#define NONTERMINAL_LIM 32
...
//in a function
bool added[NONTERMINAL_LIM]
...
for(int j=0 ; j<NONTERMINAL_LIM ; j++)
  added[j] = false;
...
// 0=<i<NONTERMINAL_LIM + TERMINAL_LIM, 
// but it's possible i>NONTERMINAL   
if(!added[i]){
  ...
}

这段代码实际上是错误的,但在Linux g++下执行正确。
正确的代码应该是

...
//in a function
bool added[NONTERMINAL_LIM + TERMINAL_LIM]
...
for(int j=0 ; j<NONTERMINAL_LIM + TERMINAL_LIM  ; j++)
  added[j] = false;
...

在原来的代码中,访问了越界的added数组,应该是在Linux中越界部分正好都是false,居然就这样OK了。但在Windows下越界部分却是随机了,于是就产生了问题。

调了一个小时才发现在这里出现了问题:(

丁香花开的日子,我们却要失去紫丁香了

星期六, 05月 12th, 2007

默哀。

Word快捷键[zz]

星期日, 05月 6th, 2007

数学建模让我认识到了快捷键的主要性:(

zz from http://tech.163.com/05/1212/10/24P09GJN00091NGR.html

常用快捷键
快捷键          作用
Ctrl+Shift+Spacebar   创建不间断空格
Ctrl+ -(连字符)     创建不间断连字符
Ctrl+B          使字符变为粗体
Ctrl+I          使字符变为斜体
Ctrl+U          为字符添加下划线
Ctrl+Shift+       缩小字号
Ctrl+Shift+>       增大字号
Ctrl+Q          删除段落格式
Ctrl+Spacebar      删除字符格式
Ctrl+C          复制所选文本或对象
Ctrl+X          剪切所选文本或对象
Ctrl+V          粘贴文本或对象
Ctrl+Z          撤消上一操作
Ctrl+Y          重复上一操作

快捷键大全
1.用于设置字符格式和段落格式的快捷键
快捷键          作用
Ctrl+Shift+F      改变字体
Ctrl+Shift+P      改变字号
Ctrl+Shift+>      增大字号
Ctrl+Shift+<      减小字号
Ctrl+]         逐磅增大字号
Ctrl+[         逐磅减小字号
Ctrl+D         改变字符格式("格式"菜单中的"字体"命令)
Shift+F3        切换字母大小写
Ctrl+Shift+A      将所选字母设为大写
Ctrl+B         应用加粗格式
Ctrl+U         应用下划线格式
Ctrl+Shift+W      只给字、词加下划线,不给空格加下划线
Ctrl+Shift+H      应用隐藏文字格式
Ctrl+I         应用倾斜格式
Ctrl+Shift+K      将字母变为小型大写字母
Ctrl+=(等号)     应用下标格式(自动间距)
Ctrl+Shift++(加号)  应用上标格式(自动间距)
Ctrl+Shift+Z      取消人工设置的字符格式
Ctrl+Shift+Q      将所选部分设为Symbol字体
Ctrl+Shift+*(星号)  显示非打印字符
Shift+F1(单击)    需查看文字格式了解其格式的文字
Ctrl+Shift+C      复制格式
Ctrl+Shift+V      粘贴格式
Ctrl+1         单倍行距
Ctrl+2         双倍行距
Ctrl+5         1.5 倍行距
Ctrl+0         在段前添加一行间距
Ctrl+E         段落居中
Ctrl+J         两端对齐
Ctrl+L         左对齐
Ctrl+R         右对齐
Ctrl+Shift+D      分散对齐
Ctrl+M         左侧段落缩进
Ctrl+Shift+M      取消左侧段落缩进
Ctrl+T         创建悬挂缩进
Ctrl+Shift+T      减小悬挂缩进量
Ctrl+Q         取消段落格式
Ctrl+Shift+S      应用样式
Alt+Ctrl+K       启动"自动套用格式"
Ctrl+Shift+N      应用"正文"样式
Alt+Ctrl+1       应用"标题1"样式
Alt+Ctrl+2       应用"标题2"样式
Alt+Ctrl+3       应用"标题3"样式
Ctrl+Shift+L      应用"列表"样式