Archive for February, 2008

Got Visa

2008-2-28 22:05 | by 2ndboy

  昨天从上海拿 Visa 回来,这次非常顺利,我们一行 10 个人都拿到了。走之前到中信银行交了签证费 $130,执行的汇率是 7.25:1 合 ¥943。

  到上海分公司后 HR 给我们进行了一番模拟演练,结果演练结束后被推举为本次面签的队长,有点意外,责任重大呀。我们的面签预约时间是第二天的下午 12:45,晚饭时分到美国领事馆所在的梅龙镇广场踩点,并在地下一层 KFC 吃晚饭。

  晚上回宾馆谈论了一番将要来到的面签,宝典翻了又翻,心里还是没什么底。晚上睡的还可以。由于要提前排队,省了午餐,所以次日起来早餐吃到想吐为止:D 退房存包,10:40 左右来到梅龙镇广场二号门,已经有十几位在排队了,大部分是去探亲的上了年纪的老头儿老太太。

  大约 12:20 左右检查护照、156、157,发卡片到大厦北侧准备进门。片刻后进入大厦乘电梯上了 8 楼,收走卡片,来到一小窗口递交护照检查预约,我前面一 plmm 没有在预约表上找到名字惨遭驱逐。之后就是机场规格的安检,填写 签证邮寄 EMS 单,递交护照、156 和 157 表格,拿到一个新的纸质号码,在上面填写姓名、生日及申请时间。被叫号后取指纹,先左四指,之后右四指,最后双大拇指。拿回护照、156 和 157 正式加入等候面签的队伍。

  排队等候面签时会不时看到比较搞笑的场面,于是彻底不紧张。眼见多人被拒之后轮到我们这对人马。第一个走上去,Good afternoon, we have nine people in one group, I’m the first one, could we … 被打断,VO 发话 You can do this three by three。一听到可以群殴,心中狂喜,马上叫了后面两个兄弟上来,被问了几个超级简单的问题:到美国干什么?到哪里?毕业于什么学校,什么学历,在这家公司工作多久啦,在美国呆多久。然后就拿到了传说中的“绿纸条”,拿到后发现其实不是纸质的,是个绿色的薄塑料片。由于担任领队,手里拿着公用资料,所以等所有人都拿到 Visa 后一起离开,到马路对面的中信银行交 EMS 费。

  好了,流水全过程记录完毕,好像没什么悬念,比想象中要简单很多:)

用 PHP 查找 workspace 里 project 的依赖关系

2008-2-18 22:15 | by 2ndboy

  有了之前写的那个 Ruby 程序,早前用 PHP 实现的版本就算作古啦,放在这里分享一下:

  1.  $dsw = 'C:/test/test.dsw'// Modify the content before running
  2.  $data = file_get_contents( $dsw );
  3.  
  4.  preg_match( '{(.*(?:/|\\\\)).*}', $dsw, $match );
  5.  $basePath = $match[1];
  6.  
  7.  preg_match_all( '{Project: "([^"]*)"="?([^"]*)"? - }', $data, $matches );
  8.  
  9.  $projects = array();
  10.  for( $i = 0; $i < count( $matches[1] ); $i++ )
  11.  {
  12.      $projectname = $matches[1][$i];
  13.      $projects[$projectname] = array();
  14.      $projects[$projectname]['dsp'] = $matches[2][$i];
  15.  
  16.      $data = file_get_contents( $basePath . $projects[$projectname]['dsp'] );
  17.  
  18.      // Get project type
  19.      preg_match( '{# TARGTYPE ".*" 0x(\d+)}', $data, $match );
  20.      switch( $match[1] )
  21.      {
  22.          case '0101': $projects[$projectname]['extName'] = '.exe'; break// Win32 (x86) Application
  23.          case '0102': $projects[$projectname]['extName'] = '.dll'; break// Win32 (x86) Dynamic-Link Library
  24.          case '0103': $projects[$projectname]['extName'] = '.exe'; break// Win32 (x86) Console Application
  25.          case '0104': $projects[$projectname]['extName'] = '.lib'; break// Win32 (x86) Static Library
  26.          default: print_r( $match );
  27.      }
  28.  
  29.      // Get output filename
  30.      $result = preg_match_all( '{/out:"[^"]*(?:/|\\\\)([^"]*\.[^"]*)"}', $data, $matches2 );
  31.      if( $result >= 2 )
  32.      {
  33.          $projects[$projectname]['outDebug']   = strtolower( $matches2[1][0] );
  34.          $projects[$projectname]['outRelease'] = strtolower( $matches2[1][1] );
  35.      }
  36.      else if( 1 == $result )
  37.      {
  38.          $projects[$projectname]['outDebug']   = strtolower( $matches2[1][0] );
  39.          $projects[$projectname]['outRelease'] = strtolower( $matches2[1][0] );
  40.      }
  41.      else  // 0
  42.      {
  43.          $projects[$projectname]['outDebug']   = strtolower( $projectname . $projects[$projectname]['extName'] );
  44.          $projects[$projectname]['outRelease'] = strtolower( $projectname . $projects[$projectname]['extName'] );
  45.      }
  46.  
  47.      // Get all libs
  48.      $result = preg_match_all( '{# ADD LINK32 ([^/]*)}', $data, $matches2 );
  49.      if( $result >= 2 )
  50.      {
  51.          $projects[$projectname]['linkDebug']   = strtolower( $matches2[1][0] );
  52.          $projects[$projectname]['linkRelease'] = strtolower( $matches2[1][1] );
  53.      }
  54.      else if( 1 == $result )
  55.      {
  56.          $projects[$projectname]['linkDebug']   = strtolower( $matches2[1][0] );
  57.          $projects[$projectname]['linkRelease'] = strtolower( $matches2[1][0] );
  58.      }
  59.      else  // 0
  60.      {
  61.          $projects[$projectname]['linkDebug']   = '';
  62.          $projects[$projectname]['linkRelease'] = '';
  63.      }
  64.  }
  65.  
  66.  foreach( $projects as $key => $value )
  67.  {
  68.      if( '.lib' == $value['extName'] )
  69.          continue;
  70.  
  71.      echo '<br/>Project: ' . $key . '<br/>';
  72.      foreach( $projects as $key2 => $value2 )
  73.      {
  74.          if( strstr( $value['linkDebug'], $value2['outDebug'] ) )
  75.              echo $key2 . '<br/>';
  76.      }
  77.  }
  78.  ?>

  今天早上尝试了一把 RubyScript2Exe,很好很强大!就一个 .rb 文件,用它把需要转成 EXE 的 Ruby 脚本跑一遍就可以生成一个可以完全脱离 Ruby 环境单独运行的可执行程序。把之前写的那个 Ruby 程序转换了一下,现在完全可以实用啦!

行程变了

2008-2-16 16:57 | by 2ndboy

  昨天节后第一天上班,居然收到邮件通知说原定 3 个月的 US 行程被改成 6 个月啦,太久了点:)

  花了些时间填好了 DS156,这个表格需要先在线填写打印后手填一些中文内容,除了家庭住址的英文版本外,一切顺利。

  一个月后出发,夏末回来……

用 Ruby 查找 workspace 里 project 的依赖关系

2008-2-14 21:57 | by 2ndboy

  用 VC 6 做开发,项目一大起来,workspace 里 project 间的依赖关系就比较复杂,尤其是历史比较长,上手的人比较多的项目,之前用 PHP 实现了一个查找 VC 6 项目依赖关系的程序,但是总感觉别人用起来准备环境不太方便,于是假期里用 Ruby 重新实现了一遍。

  1. if ARGV.length <= 0
  2.      print 'Please enter filename of DSW: '
  3.      dsw = Kernel.gets.rstrip
  4.  elsif ARGV.length >= 1
  5.      if '-h' == ARGV[0] || 'help' == ARGV[0] || '--help' == ARGV[0]
  6.          puts 'Usage: ruby ' + $0 + ' dsw_filename'
  7.          exit
  8.      else
  9.          dsw = ARGV[0]
  10.      end
  11.  end
  12.  
  13.  rePath     = Regexp.new( '(.*(?:/|\\\\)).*' )
  14.  reProject  = Regexp.new( 'Project: "([^"]*)"="?([^"]*)"? - ' )
  15.  reTargType = Regexp.new( '# TARGTYPE ".*" 0x(\d+)' )
  16.  reConfig   = Regexp.new( '"\$\(CFG\)" == "[^"]* - Win32 ([^"]*)"' )
  17.  reOut      = Regexp.new( '/out:"[^"]*(?:/|\\\\)([^"]*\.[^"]*)"' )
  18.  reLink     = Regexp.new( '# ADD LINK32 ([^/]*)' )
  19.  
  20.  mdPath = rePath.match( dsw )
  21.  if nil != mdPath
  22.      basePath = mdPath[1]
  23.  end
  24.  
  25.  projects = Hash.new
  26.  
  27.  if !File.readable_real?( dsw )
  28.      puts "Can't open file - " + dsw
  29.      exit
  30.  end
  31.  
  32.  fileDsw = open( dsw, 'r' )
  33.  fileDsw.each_line{ |line|
  34.      mdProject = reProject.match( line )
  35.      if nil != mdProject
  36.          projectName = mdProject[1]
  37.          projects[projectName] = Hash.new
  38.          projects[projectName]['dsp']         = mdProject[2]
  39.          projects[projectName]['linkRelease'] = ''
  40.          projects[projectName]['linkDebug']   = ''
  41.  
  42.          config = ''
  43.          fileDsp = open( basePath + mdProject[2], "r" )
  44.          fileDsp.each_line{ |line|
  45.              mdTargType = reTargType.match( line )
  46.              if nil != mdTargType
  47.                  case mdTargType[1]
  48.                  when '0101'
  49.                      projects[projectName]['extName'] = '.exe'  # Win32 (x86) Application
  50.                  when '0102'
  51.                      projects[projectName]['extName'] = '.dll'  # Win32 (x86) Dynamic-Link Library
  52.                  when '0103'
  53.                      projects[projectName]['extName'] = '.exe'  # Win32 (x86) Console Application
  54.                  when '0104'
  55.                      projects[projectName]['extName'] = '.lib'  # Win32 (x86) Static Library
  56.                  else
  57.                      puts mdTargType
  58.                  end
  59.                  projects[projectName]['outRelease'] = projectName.downcase + projects[projectName]['extName']
  60.                  projects[projectName]['outDebug']   = projects[projectName]['outRelease']
  61.                  next
  62.              end
  63.  
  64.              mdConfig = reConfig.match( line )
  65.              if nil != mdConfig
  66.                  config = mdConfig[1]
  67.                  next
  68.              end
  69.  
  70.              mdOut = reOut.match( line )
  71.              if nil != mdOut
  72.                  if 'Release' == config
  73.                      projects[projectName]['outRelease'] = mdOut[1].downcase
  74.                  else
  75.                      projects[projectName]['outDebug']   = mdOut[1].downcase
  76.                  end
  77.                  # next  # Can't call next here
  78.              end
  79.  
  80.              mdLink = reLink.match( line )
  81.              if nil != mdLink
  82.                  if 'Release' == config
  83.                      projects[projectName]['linkRelease'] = mdLink[1].downcase
  84.                  else
  85.                      projects[projectName]['linkDebug']   = mdLink[1].downcase
  86.                  end
  87.                  next
  88.              end
  89.          }
  90.          fileDsp.close()
  91.      end
  92.  }
  93.  fileDsw.close()
  94.  
  95.  projects.each{ |key, value|
  96.      if '.lib' == value['extName']
  97.          next
  98.      end
  99.  
  100.      out = ''
  101.      projects.each{ |key2, value2|
  102.          if value['linkDebug'].include?( value2['outDebug'] )
  103.              out += ( '    ' + key2 + ' - ' + value2['outDebug'] + "\n" )
  104.          end
  105.      }
  106.  
  107.      if !out.empty?
  108.          puts 'Project: ' + key + ' - ' + value['outDebug']
  109.          puts out
  110.      end
  111.  }

  核心的部分用正则表达式实现,现在总觉得越是在实用中尝试使用正则表达式就越能感受到它的强大!

杭州 – 暴雪

2008-2-2 22:37 | by 2ndboy

积雪居然有 30 厘米

连 B1 都开不动啦

  今年虽然不回家啦,但是这两天杭州非常有家的感觉:D,今天的天气预报是“暴雪转中雪”,积雪深度居然有 30 厘米,这恐怕是某些生活在南方的人一辈子都没有见到过的情景吧?!

  开发区里市区比较远,早上快速公交都被堵在路上了,所以今天翘班一天。