ZhangHui Li

CPU designer, Lisper, Smalltalker & Emacs maniac.

lizhhui

Table of Contents

top

没有什么比写在这里更好了

lang

计算机语言工具

  • 代码风格
    • 注释

      代码注释就是这样,懂的人觉得没有必要,好像一句话说两遍。不懂的人觉得非 常有必要 //

      /*

      */

      • 最好每行都要有标识,如一个"//" 或"*"
    • 字段分隔
      • 用下划线,如progess_event_count
      • 单词首字母大写,如ProgessEventCount
      • 变量名做到一看就知道是什么意思,一个好的名字,比一段注释有效。
    • 控制结构语句
  • 正则逻辑比较

    正则表达式,逻辑多表达式,字符串比较,数值比较

    • perl
      [] 集合,一个字符
      {} 数量
      "-" 范围
      \ 转义
      . 单个
      () 分组
      坚线
      * 0 or more
      ? 0 or one
      + one or more
      ^ start
      $ end
      \s whitespace (space,tab,newline)
      § non-whitespace
      \d digital(0-9)
      \D non_digital
      \w word(a-z,A-Z,0-9,_)
      \W non-word

      You don’t just have to match on fixed strings. In fact, you can match on just about anything you could dream of by using more complex regular expressions. These are documented at great length in perlre, but for the meantime, here’s a quick cheat sheet:

      . a single character \s a whitespace character (space, tab, newline) § non-whitespace character \d a digit (0-9) \D a non-digit \w a word character (a-z, A-Z, 0-9, _) \W a non-word character [aeiou] matches a single character in the given set [^aeiou] matches a single character outside the given set (foo│bar│baz) matches any of the alternatives specified

      ^ start of string $ end of string

      Quantifiers can be used to specify how many of the previous thing you want to match on, where "thing" means either a literal character, one of the metacharacters listed above, or a group of characters or metacharacters in parentheses.

      • zero or more of the previous thing
      • one or more of the previous thing

      ? zero or one of the previous thing {3} matches exactly 3 of the previous thing {3,6} matches between 3 and 6 of the previous thing {3,} matches 3 or more of the previous thing

      Some brief examples:

      ^\d+ string starts with one or more digits ^$ nothing in the string (start and end are adjacent) (\d\s){3} a three digits, each followed by a whitespace character (eg "3 4 5 ") (a.)+ matches a string in which every odd-numbered letter is a (eg "abacadaf")

      while (<>) { next if ^$; print; }

    • bash
      • 逻辑多表达式

        bash的两个表达式合起是两重括号

        [[ $choice != "y" &&  $choice != "yes" ]]
        [ $choice != "y" -a  $choice != "yes" ]
        [[ $choice != "y" || $choice != "yes" ]]
        [ $choice != "y" -o  $choice != "yes" ]
        
      • 圆括号问题

        在shell中不能使用()括号,如egrep命令中,因此对于(xxx,aaa)这样的集 不好表达。 解决办法是交圆括号换成双引号即可。

    • tcl
      regexp
      regsub
      
      • 正则匹配最好是用{},不要用“”
  • 参数处理

    传参是一个程序/脚本的第一步,是写程序不可以或缺的一部分。

    • bash
      • 有一个参数列表$@
      • $1,$2,$3,..。分别表示第一个参数,第二个参数…
      • $0表示程序本身的名字
      • 参数列表大小,$#
      • 有shift功能
      for arg in $@ ; do
      while [ $# != 0 ]; do 
      
    • csh
      • 有一个参数列表$*
      • $1,$2,$3,..。分别表示第一个参数,第二个参数…
      • $0表示程序本身的名字
      • 参数列表大小,$#argv
      • 有shift功能
      while ($#argv) 
      
    • perl
      • 有一个参数数组@ARGV
      • $ARGV[1],$ARGV[2],$ARGV[3],..。分别表示第一个参数,第二个参数…
      • $ARGV[0]表示程序本身的名字
      • 参数列表大小,@ARGV
      • 有shift功能
    • python
      import sys
      sys.argv[0]
      sys.argv[1]
      
  • 读写文件
    • C

      文件是一个指针 没有字符串变量

      • 示例
        1. FILE *fp;//定义文件指针
        2. fp=fopen("test.dat","rt");//rt-文本,读
        3. char str[10];
        4. fgets(str,18,fp);//读18个字符给str字符数组,下一个fgets接着
        5. eof=feof(fp);// 文件结束符
        6. fclose(fp);
    • C++

      文件是一个类 能自动识别连续的字符串

      • 示例

        :: #include <fstream>; :: using namespace std; :: ifstream infile;//输入文件操作符 :: ofstream outfile;//输出文件操作符 :: infile.open("test.dat");//打开输入文件 :: outfile.open("result.dat");//打开输出文件 :: string sa,sb,sc; :: while(!infile.eof()){//文件结束符 :: infile>>sa>>sb>>sc;//读到字符串 :: outfile<<restr<<endl;}//字符串写到文件

    • verilog

      文件是一个指针

      • 示例

        :: integer fp,ret,wp;//文件指针和fgets返回值 :: reg [799:0] t;//字符串 :: fp=$fopen("test.dat","r");//打开读的文件 :: wp=$fopen("log.dat","w");//打开写的文件 :: while(!$feof(fp)) begin//判断文件结束 :: ret=$fgets(t,fp);//读到字符串 :: ret=$sscanf(t,"%h%h%h",A,B,C);//格式化字符串 :: $fdisplay(wp,"%d\t%h",A,B);//写文件 :: end :: $fclose(fp);//关闭文件 :: $fclose(wp);

    • perl

      open(FILE_Handle,test.dat) or die "no such file"; while(<FILE>)

    • tcl
      set file_handle [open file r]
      while { [gets $file_handle line] != -1} {
         echo $line;
      
      }
      
  • 语句结构
    • if
      • bash
      if [ ] ;then
      elif [] ;then
      fi
      
      • csh
      if () then
      else if () then
      else
      endif
      
      • c/c++
      if () {
      }else if () {
      }
      
      • perl
      if () {
      }elsif () {
      }
      
      • tcl
      if {} {
      } elseif {} {
      }
      
      • verilog
      if () begin
      end
      
      • elisp
      • python
    • for
      • bash
      for var in $list
      do
      done
      
      • csh
      foreach var ($list)
      end
      
      • c/c++
      for (int i = 0; i < 10;i++) {
      }
      
      • perl
      for ($i = 0; $i < 10;$i++) {
      }
      
      • tcl
      foreach_in_collection var $collect {
      }
      foreach var $list {
      }
      
      • verilog
      integer i;
      for (i = 0; i < 10;i++) begin
      end
      
      • elisp
      • python
    • while
      • bash
      while [ ] ; do
      done
      
      • csh
      while () 
      end
      
      • c/c++
      while () {
      }
      
      • perl
      while () {
      }
      
      • tcl
      • verilog
      • elisp
      • python
    • case
      • bash
      case $var in 
      -pattern* ) ; ;;
      esac
      
      • csh
      switch()
      case "pattern1" :
        breaksw
      case "pattern2" :
        breaksw
      default :
        breaksw
      endsw
      
      • c/c++
      switch(var) {
      case pattern1:
       break;
      case pattern2:
       break;
      default:
       break;
      }
      
      • perl

      perl没有case语句,但可以用last等效实现

      next
      last
      
      • tcl
      • verilog
      • elisp
      • python
    • break/exit
      • bash
      exit
      
      • csh
      exit
      
      • c/c++
      • perl
      exit;
      
      • tcl
      exit
      
      • verilog
      $finish();
      
      • elisp
      • python
    • 注释符与结束符
      • bash
      #
      

      有些有

      ;
      
      • csh
      #
      

      没有

      • c/c++
      //
      /*  */
      

      必须有

      ;
      
      • perl
      #
      

      必须有

      ;
      
      • tcl
      #
      

      没有

      • verilog
      //
      /*  */
      

      必须有

      ;
      
      • elisp
      • python
  • 数据结构
    • perl

      ​$ @ % 数组大小$length=@array;<@array foreach $kk (keys %hash){} 排序sort(keys %hash) $array[$i] $hash{$key} defined $kk ; 判断变是否有定义 defined($kk=$ARGV[0])如果$ARGV[0]没有定义,那么$kk有可能也没有定义(如果之前没有定义$kk的话) @array=();数组清空 %hash=();清空哈希 unshift,push(@array, $kk) shift/pop push/pop操作尾巴,shift操作头。 split('\ ', $kk) 将$kk 转为@。 join('_',@array)将@转为$。 $hask{$key}=[@array] 数据结构组合,@array必须加方括号。,然后用@{$hash{$key}}调用。

    • tcl

      ​有list和collection,collection是sdc专用的,与list不同。 list有lappend,lsearch,lreplace但没有remove或pop方法。

      lindex $list 2
      
    • js

      ​var array = [ "xx",null]; array.length; array[1];

    • elisp
  • perl
  • python
  • csh
    • csh脚本嵌套

      csh中直接运行一个脚本(调用一个脚本),如在a.csh中./b.csh这样的话。那么a.csh中 一些setenv的变量可能会被.csh中的内容覆盖掉。而source b.csh则不会出.因为每调用运 行一个脚本的时候都会source 一遍.cshrc。

    • csh中判断env变量是否被定义

      有一些env变量需要程序中变化。如工具不同版本的选择。 同时这些变量需要初如化,否则每打一个终端,就会出现XXX:undefined variable. 在.csh中的处理为

      if( $? DC_VER == 0 ) then
         setenv DC_VER ""
      endif
      if ($DC_VER == "2015") then
      ...
      
  • verilog
  • elisp
    • elisp中的正则表达式
      • 不能用
        不能用[:upper:]+,而要用[[:upper:]]+
        
      • 命令与配置中件写法不一样
        M-x search-forward-regexp \[+\|\\(+\|\=+
        if (search-forward-regexp "\[+\\|\\(\|\=+" nil t)
        
      • 关于*在正则表达式中错误用法之,search-forward-regexp xxxx*

        实际上如果你用下面这条命令:

        search-forward-regexp [[:lower"]]* 
        

        看起来像是找小写字符串,实际上,根本就没找,因为*有0次的意思,就是没 找。

      • case-fold-search 正则匹配的时候,最好把大小写忽略关掉,否则lower,upper等匹配异常
        (setq case-fold-search nil)
        [:upper:] [:lower:] 肯定会不正常
        
  • C/C++
  • bash与csh的区别
      bash csh
      var = "" set var = ""
      export setenv
      export path = "path1: path2: path3 " setenv path path1:path2:path3
         

emacs

org 的编辑

主要是树形结构的编辑,总是记不住。

  • 上下移动 M-up/down
  • C-c C-p/n标题间移动,C-cC-u移到上一级
  • C-c / 稀疏树 M-g n/p稀疏匹配之间移动
  • C-c C-j以路径形式访问稀疏树
  • M-S-rightr/left升降级
  • C-cC-k C-cC-r即使不在标题栏也可折叠

emacs agenda

cscope

vim

vim装好后键盘输入问题

在.vimrc中加入 set nocompatible

vi快速搜索

yw/e 之后 #或*,就可以了,用过一次#/*之后,也可以用n/N。

device

mac

window

aliyun

latex

svn/git

website/ftp server

nLint

1_13_nLint.org

gnome 使用技巧

插入图片的方法

//#+HTML: <img class="bg-img" src="/z_img/basketball.jpeg" alt="" >

arm development tool chain

五笔

freemind输出

我windos电脑上有一个ox-freemind.el ,在emacs 25.2.1以上版本可以load-file进去之后,就可以把org 转化为freemind.

层次问题,默认emacs org export 输出有一个headline 数定义,小于几级的 headline都能输出,默认只有3级,因些需要在org文件中加入

#+OPTIONS: H:9    -------定义为9级

互联网工具

• linux互联类工具 ○ Vsftp ○ Apache ○ Trac ○ Putty ○ Mobaxtem ○ X11 ○ Ssh ○ Xmanager ○ Vnc ○ Svn/git ○ Xquartz ○ securyCRT • linux系统工具 ○ Emacs ○ Vi ○ Graphyviz ○ PD • 特别类工具 ○ 思维工具 数据视图工具-ECharts开源