<nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

    <bdo id="rub96"></bdo>

      1. <track id="rub96"><div id="rub96"></div></track>
        <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

            <nobr id="rub96"><address id="rub96"><big id="rub96"></big></address></nobr>
          1. <menuitem id="rub96"><strong id="rub96"><menu id="rub96"></menu></strong></menuitem>
            <dl id="rub96"><source id="rub96"><tr id="rub96"></tr></source></dl>
            1. <tbody id="rub96"><div id="rub96"></div></tbody>
              1. <bdo id="rub96"><optgroup id="rub96"></optgroup></bdo>
              2. <bdo id="rub96"><dfn id="rub96"><dd id="rub96"></dd></dfn></bdo>
                1. <option id="rub96"><source id="rub96"></source></option>
                2. <bdo id="rub96"></bdo>

                    <p id="rub96"><tr id="rub96"></tr></p>
                  1. <tbody id="rub96"></tbody>

                    <bdo id="rub96"></bdo>

                  2. <option id="rub96"><source id="rub96"></source></option>

                    <bdo id="rub96"><optgroup id="rub96"><dd id="rub96"></dd></optgroup></bdo>
                      <track id="rub96"></track>

                        <bdo id="rub96"></bdo>
                      1. <option id="rub96"><p id="rub96"><tr id="rub96"></tr></p></option>

                          <bdo id="rub96"></bdo>
                          1. <track id="rub96"></track>
                            1. <track id="rub96"></track>
                                  <bdo id="rub96"></bdo>
                                  <option id="rub96"></option>

                                      1. <track id="rub96"><span id="rub96"></span></track>

                                          <option id="rub96"></option>

                                          1. 
                                            
                                              <option id="rub96"><span id="rub96"></span></option>
                                              <bdo id="rub96"><address id="rub96"></address></bdo>
                                              <option id="rub96"><source id="rub96"></source></option>
                                                <nobr id="rub96"><address id="rub96"></address></nobr>
                                              1. <nobr id="rub96"><optgroup id="rub96"><big id="rub96"></big></optgroup></nobr>
                                                <track id="rub96"></track>

                                                <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>
                                                1. Read Sean

                                                  Read me, read Sean.
                                                  posts - 508, comments - 655, trackbacks - 9, articles - 4

                                                  置頂隨筆

                                                  第11頁(練習):
                                                  在Scala REPL中鍵入3,然后按Tab鍵 應為 在Scala REPL中鍵入3.,然后按Tab鍵

                                                  第19頁(正文):
                                                  util方法返回一個并不包含上限的區間 應為 until方法返回一個并不包含上限的區間

                                                  第19頁(代碼):
                                                  0 util s.length 應為 0 until s.length

                                                  第31頁(正文):
                                                  util是RichInt類的方法 應為 until是RichInt類的方法

                                                  第34頁(代碼):
                                                  ArraryBuffer 應為 ArrayBuffer
                                                  b.sorted(_ < _) 應為 b.sorted
                                                  b.sorted(_ > _) 應為 b.sortWith(_ > _) 

                                                  第44頁(代碼):
                                                  scala.collections.immutable.SortedMap 應為 scala.collection.immutable.SortedMap

                                                  第53頁(正文):
                                                  Scala對每個字端都提供getter和setter方法 應為 Scala對每個字段都提供getter和setter方法

                                                  第107頁(代碼):
                                                  val tokens = source.mkString.split("\\S+") 應為 val tokens = source.mkString.split("\\s+")

                                                  第341頁(代碼):
                                                  var count: (Int => Double) => null 應為 var count: (Int => Double) = null

                                                  // 本文僅作為信息發布窗口,如需討論交流,請通過郵件 gaoyuxiang.scala@gmail.com 或 QQ群 132569382 。

                                                  posted @ 2012-11-15 15:56 laogao| 編輯 收藏

                                                  2014年5月7日

                                                  不知道從什么時候開始的,tsocks在Mac下面安裝要費些周折,brew官方和曾經一度存在的第三方tap都不再支持直接brew install,需要手工創建formula。過程倒也還OK:

                                                  vim /usr/local/Library/Formula/tsocks.rb

                                                  require 'formula'

                                                  class Tsocks < Formula
                                                    # The original is http://tsocks.sourceforge.net/
                                                    # This GitHub repo is a maintained fork with OSX support

                                                    homepage 'http://github.com/pc/tsocks'
                                                    head 'https://github.com/pc/tsocks.git'

                                                    depends_on 'autoconf' => :build if MacOS.xcode_version.to_f >= 4.3

                                                    def install
                                                      system "autoconf""-v"
                                                      system "./configure""--prefix=#{prefix}""--disable-debug""--disable-dependency-tracking""--with-conf=#{config_file}"

                                                      inreplace("tsocks") { |bin| bin.change_make_var! "LIBDIR", lib }

                                                      system "make"
                                                      system "make install"

                                                      etc.install "tsocks.conf.simple.example" => "tsocks.conf" unless config_file.exist?
                                                    end

                                                    def test
                                                      puts 'Your current public ip is:'
                                                      ohai `curl -sS ifconfig.me 2>&1`.chomp
                                                      puts "If your correctly configured #{config_file}, this should show the ip you have trough the proxy"
                                                      puts 'Your ip through the proxy is:'
                                                      ohai `tsocks curl -sS ifconfig.me 2>&1`.chomp
                                                    end

                                                    def config_file
                                                      etc / 'tsocks.conf'
                                                    end
                                                  end

                                                  有了上述formula之后,即可 brew install --HEAD tsocks 。

                                                  posted @ 2014-05-07 23:23 laogao 閱讀(3337) | 評論 (2)編輯 收藏

                                                  2014年4月6日

                                                  有了RPi當然免不了要玩玩XBMC,這里推薦XBian,安裝配置過程如下:

                                                  1- 下載.img文件 ( http://www.xbian.org/download/ );
                                                  2- 用dd命令將.img(比如XBian_beta_2.img)寫入SD卡;
                                                  3- 將中文字體(比如wqy-zenhei.ttc)重命名為arial.ttf,復制到SD卡的~/.xbmc/media/Fonts目錄(XBian默認用戶為xbian,密碼raspberry);
                                                  4- 從 https://code.google.com/p/xbmc-addons-chinese/downloads/detail?name=repository.googlecode.xbmc-addons-chinese-eden.zip 下載資源插件并復制到SD卡;
                                                  5- 將SD卡插入RPi并連接HDMI到電視機/顯示器;
                                                  6- RPi開機,進入XBian的配置頁面,可以校準屏幕,配置網絡連接等;
                                                  7- 在系統設置中選擇字體為Arial,語言選為中文,此時應該看到界面可正常顯示中文;
                                                  8- 安裝擴展程序,選擇之前下載到SD卡的repository.googlecode.xbmc-addons-chinese-eden.zip文件,擴展安裝成功后即可在擴展程序列表中看到對應的資源條目,逐一安裝即可。

                                                  額外提示:XBMC也可以通過網絡共享播放視頻,之前跟大家提到過XBMC顯示中文字幕有時出現整行被方塊覆蓋的問題,解決方法是在字幕文件中查找并刪除或替換"…"字符。Enjoy!

                                                  posted @ 2014-04-06 17:45 laogao 閱讀(2070) | 評論 (0)編輯 收藏

                                                  2014年3月9日


                                                  整理一下 IntelliJ IDEA 最常用的快捷鍵,按照便于記憶的方式排列:

                                                  Ctrl-N              Class... (find by name)
                                                  Ctrl-Shift-N        File... (find by name)
                                                  Ctrl-Shift-Alt-N    Symbol... (find by name)
                                                  Ctrl-G              Line... (goto line)
                                                  Ctrl-H              Type hierarchy (hierarchy)
                                                  Ctrl-Shift-H        Method hierarchy (hierarchy)
                                                  Ctrl-Alt-H          Call hierarchy (hierarchy)
                                                  Ctrl-Q              Quick documentation
                                                  Ctrl-Alt-I          Auto-indent lines (indent)
                                                  Ctrl-Alt-L          Reformat code (line up)
                                                  Ctrl-Alt-O          Optimize imports (optimize)
                                                  Ctrl-/              Comment with line comment (//)
                                                  Ctrl-Shift-/        Comment with block comment (/*...*/)
                                                  Ctrl-W              Select word or block (word)
                                                  Ctrl-D              Copy line (duplicate line, yyp)
                                                  Ctrl-X              Cut line (dd)
                                                  Ctrl-U              Uppercase/lowercase (upper)
                                                  Ctrl-J              Insert live template
                                                  Ctrl-Alt-J          Surround with live template
                                                  Ctrl-Alt-T          Surround with (template)
                                                  Ctrl-Shift-J        Join lines (join)
                                                  Ctrl-E              Recent files (editions)
                                                  Ctrl-Shift-E        Recently changed files (editions)
                                                  Alt-Shift-C         Recent changes (changes)
                                                  Ctrl-B              Delcaration
                                                  Ctrl-Shift-B        Type declaration
                                                  Ctrl-Alt-B          Implementation(s)
                                                  Ctrl-P              Parameter info (parameter)
                                                  Ctrl-Space          Basic completion
                                                  Ctrl-Shift-Space    Smart completion
                                                  Ctrl-Alt-Space      Completion lookup
                                                  Alt-Enter           Auto-complete
                                                  Alt-Insert          Generate...
                                                  Ctrl-Shift-Up/Down  Move statement up/down
                                                  Alt-Shift-Up/Down   Move line up/down
                                                  Ctrl-Up/Down        Scroll up/down
                                                  Alt-Up/Down         Previous/next method
                                                  F2                  Next highlighted error
                                                  Shift-F2            Previous highlighted error
                                                  Ctrl-F              Find
                                                  Ctrl-R              Replace
                                                  F3                  Next match
                                                  Shift-F3            Previous match
                                                  F4                  Jump to source
                                                  Ctrl-Alt-Shift-T    Refactor this
                                                  F5                  Refactor copy
                                                  F6                  Refactor move
                                                  Ctrl-F6             Refactor change signature
                                                  Shift-F6            Refactor rename
                                                  Alt-Delete          Refactor safe delete
                                                  Ctrl-Alt-V          Refactor extract variable
                                                  Ctrl-Alt-F          Refactor extract field
                                                  Ctrl-Alt-P          Refactor extract parameter
                                                  Ctrl-Alt-M          Refactor extract method
                                                  Ctrl-Alt-N          Refactor inline
                                                  

                                                  posted @ 2014-03-09 13:38 laogao 閱讀(10902) | 評論 (0)編輯 收藏

                                                  2014年1月1日

                                                  不久前入了個 Raspberry Pi 也就是大家說的樹梅派(以下簡稱RPi),拿來做藍牙測試,用的藍牙dongle是ORICO的BTA-403-BL http://item.jd.com/980800.html 。這里簡單記錄下安裝過程:

                                                  首先是操作系統。作為Arch重度用戶,當然選Archlinux ARM了: http://archlinuxarm.org/platforms/armv6/raspberry-pi 下載img文件,用dd寫到SD卡上:
                                                  dd bs=1M if=/path/to/archlinux-hf-*.img of=/dev/sdX

                                                  然后用GParted把SD卡上的分區拖滿,充分利用空間。這樣SD卡就準備好了,插到RPi上,接上Micro-USB的電源和網線,啟動RPi,從路由器上找到RPi的IP地址(機器名默認是alarmpi),ssh上去(用戶名root密碼root),修改密碼,創建非root賬號,執行系統更新 sudo pacman -Syu ,這之后開始安裝藍牙相關工具:
                                                  sudo pacman -S bluez bluez-utils

                                                  確保藍牙dongle插到RPi的USB接口,通過 hciconfig 確認藍牙設備被識別,輸出應該類似下面這個樣子:
                                                  [sean@alarmpi]$ hciconfig
                                                  hci0:   Type: BR/EDR  Bus: USB
                                                          BD Address: 84:A6:C8:DC:04:97  ACL MTU: 310:10  SCO MTU: 64:8
                                                          DOWN 
                                                          RX bytes:553 acl:0 sco:0 events:28 errors:0
                                                          TX bytes:384 acl:0 sco:0 commands:27 errors:0

                                                  啟動bluetooth:
                                                  sudo systemctl start bluetooth

                                                  完成以后,即可通過 bluetoothctl 命令打開藍牙控制臺,執行各項藍牙相關操作,比如show、list、scan on、agent、info等等,這里不展開了。

                                                  如果想使用圖形界面操作RPi,也很簡單,基本步驟如下:
                                                  sudo pacman -S xorg xorg-xinit lxde
                                                  echo 'exec startlxde' > ~/.xinitrc
                                                  startx

                                                  Enjoy!

                                                  posted @ 2014-01-01 13:11 laogao 閱讀(3146) | 評論 (1)編輯 收藏

                                                  2012年11月15日

                                                  第11頁(練習):
                                                  在Scala REPL中鍵入3,然后按Tab鍵 應為 在Scala REPL中鍵入3.,然后按Tab鍵

                                                  第19頁(正文):
                                                  util方法返回一個并不包含上限的區間 應為 until方法返回一個并不包含上限的區間

                                                  第19頁(代碼):
                                                  0 util s.length 應為 0 until s.length

                                                  第31頁(正文):
                                                  util是RichInt類的方法 應為 until是RichInt類的方法

                                                  第34頁(代碼):
                                                  ArraryBuffer 應為 ArrayBuffer
                                                  b.sorted(_ < _) 應為 b.sorted
                                                  b.sorted(_ > _) 應為 b.sortWith(_ > _) 

                                                  第44頁(代碼):
                                                  scala.collections.immutable.SortedMap 應為 scala.collection.immutable.SortedMap

                                                  第53頁(正文):
                                                  Scala對每個字端都提供getter和setter方法 應為 Scala對每個字段都提供getter和setter方法

                                                  第107頁(代碼):
                                                  val tokens = source.mkString.split("\\S+") 應為 val tokens = source.mkString.split("\\s+")

                                                  第341頁(代碼):
                                                  var count: (Int => Double) => null 應為 var count: (Int => Double) = null

                                                  // 本文僅作為信息發布窗口,如需討論交流,請通過郵件 gaoyuxiang.scala@gmail.com 或 QQ群 132569382 。

                                                  posted @ 2012-11-15 15:56 laogao| 編輯 收藏

                                                  2011年8月3日

                                                  可能很多人不以為然,寫作和編程能有什么關系。

                                                  首先,寫作促進我們思考。程序員每天的工作,不論是學習新知識新技術、理解軟件需求、閱讀代碼/文檔、設計框架、還是實現業務邏輯,都離不開思考。相信很多人都有過這樣的體驗: 對于某個設計或知識點,你以為自己想清楚了,但真要讓你解釋給別人聽,你又會覺得無從下手,幾輪過后回想當初,之前所看到和相信的不過是錯覺,當你完整的向其他人轉述一遍之后,你才算是真正想明白了。其實這個道理和書桌上放一只橡皮鴨/填充玩偶(然后向它講述你的想法)的做法是相通的,只不過寫作本身不光整理了思路,還留下了文檔,同時,寫作的過程也是不斷加深印象、提升信心的過程,可謂一舉多得。

                                                  其次,和寫作一樣,編程的主要目的是與世界交流,不論這個世界是指的機器的世界還是人的世界。要有效地與機器世界交流,你編寫的代碼必須符合一定的語法和范式,必須邏輯上講得通,這樣才有意義。而基本的寫作訓練可以讓我們養成主動留意錯別字、格式、拼寫錯誤、邏輯錯誤的習慣。如C. A. R. Haore所說,我們寧要明顯無錯誤的代碼,不要無明顯錯誤的代碼。這點潔癖是好程序員必須具備的修養。這也是為什么我看到有明顯拼寫錯誤的程序員簡歷時,會直接把他/她們拉黑。同樣地,我一直堅持認為,如果程序員寫不出結構優良的純文本文檔,那么我們也不必指望他/她能夠寫出優雅的代碼。除此之外,我們還可以再稍微發散一下: 開源項目那么多,滿足類似需要的往往不止一個,為什么有的很成功,有的卻無人問津? 主創/靈魂人物的寫作能力,不論是代碼、文檔、郵件還是PPT,是很重要的分野。我相信,改變世界、影響更多的人,是很多程序員夢寐以求的,而要做到這一點,離不開寫作。

                                                  最后,寫作通常是程序員的短板,亦即最容易低成本高產出的地方。我一直很不喜歡人為地給不同專業背景的人貼上文科和理科的標簽,仿佛他們之間沒有交集似的。這樣做的最大問題在我看來是一方天然地覺得另一方的知識對自己沒價值,以至于形成了類似"寫作是文科生的菜"、"編程是理科才要學的東西"等謬誤。就我的觀察,計算機科班出身的同學,往往文字表達能力不夠強,可能多少和這種心理暗示有關。如此明顯的短板,如果能夠引起廣大程序員群體的重視,肯在寫作上持續投入,效果一定是驚人的。

                                                  posted @ 2011-08-03 23:49 laogao 閱讀(1892) | 評論 (1)編輯 收藏

                                                  2011年8月2日

                                                  今天遠程支持同事在Windows環境調優Apache服務器性能,記錄在此,供需要的朋友參考。

                                                  Java EE應用,同時部署在兩個Tomcat(5.5.27)實例上,前面放了個Apache(httpd-2.2.19-win32-x86-no_ssl),通過mod_jk(1.2.32)做負載均衡,同一臺物理服務器,操作系統為64位的Windows Server 2003 SP2。現象是60+客戶端,平均每個客戶端每秒請求數2次,單個請求正常響應時間在500ms以內,即每秒沖進來120個請求,并發量最多在60上下,Apache就已不堪"重"負,靜態資源響應時間都超過10s,同時Tomcat和數據庫服務器均正常。憑我的經驗,同樣的壓力直接壓到Tomcat也不至于這么難看。看來問題出在Apache。

                                                  首先修改httpd.conf配置文件,打開status模塊:

                                                  LoadModule status_module modules/mod_status.so
                                                  <Location /status>
                                                    SetHandler server-status
                                                    Order deny,allow
                                                    Deny from all
                                                    Allow from 127.0.0.1 #需要的話也可放開為all
                                                  </Location>

                                                  這樣我們就能通過/status頁面查看服務器當前的狀態信息,結果觀察到worker(即線程)數僅為64!坑爹啊!難怪撐不住。我記得以前Windows下面的Apache默認線程數沒這么小的。找準問題,接下來就好辦了:

                                                  <IfModule mpm_winnt.c>
                                                    ThreadsPerChild 300
                                                    MaxRequestsPerChild 0
                                                  </IfModule>

                                                  稍微解釋一下:mpm_winnt.c是Apache為Windows NT提供的MPM (Multi-Processing Module),對應到Linux環境下,則有prefork.c(多進程/每進程1個線程)和worker.c(多進程+多線程)兩種MPM可選。Windows下面只會有父與子兩個進程,因此單個子進程能同時起多少線程(ThreadsPerChild)就成了調優的關鍵。另一個參數MaxRequestsPerChild的含義是單個子進程累計最多處理到少個請求,超過該值則退出重啟,這是出于防止內存泄露慢慢拖垮整個服務器而做的防御性措施,0表示不做此限制。

                                                  新配置上線后,客戶端數量順利沖上200+。Case closed.

                                                  posted @ 2011-08-02 21:04 laogao 閱讀(4104) | 評論 (0)編輯 收藏

                                                  2011年7月26日


                                                  今天臨時有個需求,那就是給某PDF文檔切邊,以方便在Kindle 3的6吋屏上閱讀。

                                                  很久沒碰Python了,不過我相信用Python一定有辦法解決這個需求,于是經過簡單的googling,便發現了這個pyPdf庫 ( http://pybrary.net/pyPdf/ ) ,操作起來相當直接易懂,把代碼貼在這兒,做個記錄。

                                                   1 from pyPdf import PdfFileWriter, PdfFileReader
                                                   2 
                                                   3 pdf = PdfFileReader(file('original.pdf''rb'))
                                                   4 out = PdfFileWriter()
                                                   5 
                                                   6 for page in pdf.pages:
                                                   7   page.mediaBox.upperRight = (580,800)
                                                   8   page.mediaBox.lowerLeft = (128,232)
                                                   9   out.addPage(page)
                                                  10 
                                                  11 ous = file('target.pdf''wb')
                                                  12 out.write(ous)
                                                  13 ous.close()

                                                  Enjoy!

                                                  posted @ 2011-07-26 22:25 laogao 閱讀(12046) | 評論 (2)編輯 收藏

                                                  2011年3月29日


                                                  今天幫同事解決一個郵件亂碼的問題,簡記于此。

                                                  郵件正文就不貼了,有一段從上下文判斷明顯應該是"上海",卻顯示成了"涓...",于是自然而然的拿出"上"字和"涓"字來分析。

                                                  通過簡單的Groovy腳本對這兩個漢字分別按gbk和utf-8編碼,并將得到的byte[]轉換成二進制表示輸出如下:

                                                  == 上 ==
                                                  11001001 11001111
                                                  11100100 10111000 10001010
                                                  == 涓 ==
                                                  11100100 10111000
                                                  11100110 10110110 10010011

                                                  注意"上"字的第2排前兩組和"涓"字第1排的兩組byte正好相同,于是問題迎刃而解,亂碼是由于郵件以utf-8編碼后被錯誤的以gbk解碼(隨后又重新編碼成utf-8)造成的。

                                                  關鍵代碼:

                                                  void showBytes(String input) {
                                                    println("== " + input + " ==")
                                                    b = input.getBytes("gbk")
                                                    b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
                                                    println()
                                                    b = input.getBytes("utf8")
                                                    b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
                                                    println()
                                                  }

                                                  posted @ 2011-03-29 23:50 laogao 閱讀(2108) | 評論 (0)編輯 收藏

                                                  2011年2月16日


                                                  問題起因: 幫同事排查一個SVN資源庫導入后無法使用的問題,checkout時報錯
                                                    Expected FS format '2'; found format '3'
                                                    期待文件系統(FS)格式 “2”;找到格式“3”

                                                  熟悉SVN的朋友應該知道,Subversion大版本更新時有可能會對其文件格式進行調整,因此內部有文件格式版本的說法,以上報錯信息在網上搜一下就知道,版本2和版本3分別對應Subversion的1.4.x和1.5.x,于是問題歸結為如何給資源庫降級,從而得到與1.4兼容的dump文件。方法很簡單,記錄如下,供需要的朋友參考:

                                                  首先在1.5.x的Subversion環境下新建一個與1.4.x兼容的資源庫
                                                    svnadmin --pre-1.5-compatible create project01

                                                  然后將之前無法正常導入1.4.x的dump文件(dumpfile.old)導入
                                                    svnadmin load project01 < dumpfile.old

                                                  最后再做一次導出即可
                                                    svnadmin dump project01 > dumpfule.new

                                                  回到1.4.x的Subversion環境,新的dump文件(dumpfile.new)就可以正常導入和使用了。

                                                  posted @ 2011-02-16 19:34 laogao 閱讀(2602) | 評論 (0)編輯 收藏

                                                  2011年2月9日


                                                  設想一下這樣的場景: 你出差在外,或者生病在家,有個緊急的需求要處理,涉及到數個源代碼文件的改動,你親自修改需要10分鐘,電話和在公司的同伴溝通然后由他/她來修改則需要1小時。公司svn服務僅支持svn://協議,且僅限內網訪問,而你只有一個ssh賬號可以遠程登錄到公司某臺Linux/UNIX服務器。

                                                  你暗自慶幸,幸好管理員有先見之明,為你留了個ssh口子,這樣至少你還可以ssh上去通過命令行的方式在服務器上做svn checkout,vim ...和svn commit。不過如果你認為這就是全部,那就太小瞧ssh了。

                                                  ssh有個命令行參數 -D [地址:]端口,含義是在某個本地地址的某個端口上開SOCKS服務進行監聽,把這個端口的數據通信以加密形式轉發到ssh的另一端。你說好,我有了一個SOCKS服務器,但我又不是要上網走代理,svn也并不天然支持SOCKS啊,有什么用呢? 嗯,這正是tsocks的用武之地,它能透明的讓普通應用程序也走SOCKS,安裝方法很簡單: 主流的Linux發行版,如Debian、Archlinux等的默認軟件倉庫已經自帶了tsocks,通常只需要apt-get install或pacman -S即可,Mac OS X下則可以利用MacPorts安裝,然后修改配置文件/etc/tsocks.conf(MacPorts會安裝到/opt/local/etc目錄),可以在樣本文件tsocks.conf.sample的基礎上修改,通常只要配置server = 127.0.0.1即可,其他都可以默認。

                                                  有了這些打底,剩下的就很簡單了: 首先 ssh -D 1080 -f -N 用戶名@公司服務器的公網地址 在本機的1080端口開啟SOCKS服務;然后按照你平時使用svn的習慣,只是在命令前加上tsocks,類似這樣: tsocks svn up 或者 tsocks svn ci -m 'blahblahblah' 等等即可,本地的svn sandbox不需要任何修改。

                                                  這個例子可以說只是冰山一角,不論是ssh還是tsocks都還有更高級的用法,而這個通道一旦打通,它的效果就像是簡化版的VPN,除了ping之類的少數命令外,幾乎就跟你在公司做各種操作沒有兩樣,所以,發揮你的想象力吧 :)

                                                  posted @ 2011-02-09 22:37 laogao 閱讀(5002) | 評論 (5)編輯 收藏

                                                  2011年1月30日


                                                  和Swing應用的直接跨平臺不同,SWT/RCP應用要想同時支持不同平臺,需要做些特殊的配置,不過并不復雜,記錄在此,希望能幫到有需要的朋友。目前win32、32位Linux、64位Linux和Mac OS X基本上就覆蓋了所有主流的桌面操作系統,本文將以同時支持這四種OS為例來進行講解。

                                                  首先是下載對應版本的RCP框架在不同操作系統的插件,將它們放在同一個plugins目錄,比如你可以用win32為基礎,然后添加針對其他平臺的如下插件:

                                                  org.eclipse.core.filesystem
                                                  org.eclipse.core.filesystem.win32.x86
                                                  org.eclipse.core.filesystem.linux.x86
                                                  org.eclipse.core.filesystem.linux.x86_64
                                                  org.eclipse.core.filesystem.macosx

                                                  org.eclipse.core.net
                                                  org.eclipse.core.net.win32.x86
                                                  org.eclipse.core.net.linux.x86

                                                  org.eclipse.core.resources
                                                  org.eclipse.core.resources.win32.x86

                                                  org.eclipse.equinox.launcher
                                                  org.eclipse.equinox.launcher.win32.win32.x86
                                                  org.eclipse.equinox.launcher.gtk.linux.x86
                                                  org.eclipse.equinox.launcher.gtk.linux.x86_64
                                                  org.eclipse.equinox.launcher.carbon.macosx

                                                  org.eclipse.equinox.security
                                                  org.eclipse.equinox.security.win32.x86
                                                  org.eclipse.equinox.security.macosx

                                                  org.eclipse.swt
                                                  org.eclipse.swt.win32.win32.x86
                                                  org.eclipse.swt.gtk.linux.x86
                                                  org.eclipse.swt.gtk.linux.x86_64
                                                  org.eclipse.swt.carbon.macosx

                                                  接下來將不同平臺下的eclipse可執行文件(Windows下面是eclipe.exe,Linux下是eclipse,Mac OS X下面是Eclipse.app)放到不同的子目錄下,當然,如果你的RCP應用有別的名稱,也可以重命名eclipse可執行文件,按照不同平臺的規范更換圖標,然后修改.ini文件讓它的-startup和-startup.libraray參數指向相對路徑中正確版本的插件即可。

                                                  最后分享一下我們軟件部署的機制: 按照前面介紹的方式打包的應用程序,交到用戶手里并不是很友好,因為需要他/她自己再做一次判斷,當前的操作系統是什么,然后打開不同的目錄去點擊不同的可執行文件。我們的做法是單獨提供一個Swing程序,在客戶端自動判斷OS,然后自動調用不同版本的可執行文件,同時,這個Swing程序被做成Java Web Start,把整個RCP客戶端的下載和同步也處理掉,這樣,對用戶而言,整個過程就透明了,只需要一個JNLP,剩下的工作完全自動化。

                                                  posted @ 2011-01-30 12:17 laogao 閱讀(4402) | 評論 (0)編輯 收藏

                                                  2011年1月27日


                                                  在Linux或其他UNIX和類UNIX環境下,ps命令想必大家都不陌生,我相信也有不少同學寫過 ps aux | grep java | grep -v grep | awk '{print $2}' 這樣的管道命令來找出Java進程的pid。常言道,Java并非真的"跨平臺",它自己就是平臺。作為平臺,當然也有些基本的工具,讓我們可以用更簡單、更統一,同時又是非侵入的方式來查詢進程相關信息。今天我們就來認識一下其中的兩個。

                                                  jps

                                                  顧名思義,它對應到UNIX的ps命令。用法如下:

                                                  jps [ options ] [ hostid ]

                                                  其中,options可以用 -q (安靜) -m (輸出傳遞給main方法的參數) -l (顯示完整路徑) -v (顯示傳遞給JVM的命令行參數) -V (顯示通過flag文件傳遞給JVM的參數) -J (和其他Java工具類似用于傳遞參數給命令本身要調用的java進程);hostid是主機id,默認localhost。

                                                  jstat

                                                  用于輸出給定java進程的統計信息。用法如下:

                                                  jstat -options 可以列出當前JVM版本支持的選項,常見的有 -class (類加載器) -compiler (JIT) -gc (GC堆狀態) -gccapacity (各區大小) -gccause (最近一次GC統計和原因) -gcnew (新區統計) -gcnewcapacity (新區大小) -gcold (老區統計) -gcoldcapacity (老區大小) -gcpermcapacity (永久區大小) -gcutil (GC統計匯總) -printcompilation (HotSpot編譯統計)

                                                  假定你要監控的Java進程號是12345,那么
                                                  jstat -gcutil -t 12345 200 300 即可每200毫秒連續打印300次帶有時間戳的GC統計信息。

                                                  簡單解釋一下: -gcutil是傳入的option;必選,-t是打印時間戳,是以目標JVM啟動時間為起點計算的,可選;12345是vmid/pid,和我們從jps拿到的是一樣的,必選;200是監控時間間隔,可選,不提供就意味著單次輸出;300是最大輸出次數,可選,不提供且監控時間間隔有值的話,就是無限期打印下去。

                                                  具體輸出明細的解釋請參考官方文檔 http://download.oracle.com/javase/6/docs/technotes/tools/share/jstat.html

                                                  posted @ 2011-01-27 12:04 laogao 閱讀(9241) | 評論 (0)編輯 收藏

                                                  2011年1月5日


                                                  在Vim中,我們可以通過set fencs=utf-8,gbk告訴它按照先utf-8后gbk的順序自動識別打開文件的字符編碼。Emacs也有一組字符編碼相關指令,整理如下:

                                                  指令全名:set-buffer-file-coding-system
                                                  指令作用:改變當前buffer的編碼
                                                  調用方法:(以目標編碼gbk為例)
                                                  C-x <RET> f gbk <RET>
                                                  該指令還可以用于改變當前buffer的換行習慣(編碼參數用dos或unix,對應\r\n或\n)。

                                                  指令全名:universal-coding-system-argument
                                                  指令作用:指定緊隨其后的命令(如C-x C-f或C-x C-w等)所采用的編碼
                                                  調用方法:(以目標編碼gbk為例)
                                                  C-x <RET> c gbk <RET>

                                                  指令全名:revert-buffer-with-coding-system
                                                  指令作用:用指定編碼重讀當前buffer(如果打開時用錯了編碼)
                                                  調用方法:(以目標編碼gbk為例)
                                                  C-x <RET> r gbk <RET>

                                                  指令全名:recode-region
                                                  指令作用:將以錯誤編碼解碼的選區以指定編碼重新解碼
                                                  調用方法:(以目標編碼gbk為例)
                                                  M-x recode-region <RET> gbk <RET> utf-8 <RET>

                                                  除了這些操作外,還有一種方法,那就是在文件開始的部分給出如下形式的指令,直接告訴編輯器在打開和保存時應采用的編碼:
                                                  -*- coding: gbk -*-
                                                  接觸過Python的同學是不是覺得很眼熟?

                                                  [補充] 查看當前編碼選擇的命令為:
                                                  M-x describe-coding-system <RET> 或 C-h C <RET>
                                                  也可在回車前輸入具體的編碼名稱(如gbk)以查看詳細說明。

                                                  posted @ 2011-01-05 13:31 laogao 閱讀(3409) | 評論 (0)編輯 收藏

                                                  2011年1月2日


                                                  為克服拖延癥,在此列出2011年要做的事,給未來的自己監督:

                                                  1- 繼續去年未完成的產品改造,換一種更穩妥的方式推進;
                                                  2- 積極參與社區交流活動,不論線上還是線下;
                                                  3- 深入學習Scala,輔以Clojure和Haskell;
                                                  4- 系統學習PostgreSQL;
                                                  5- 全面使用Emacs;
                                                  6- 開始讀Linux源碼;
                                                  7- 重讀《紅樓夢》;
                                                  8- 至少讀兩本英文原著;
                                                  9- 帶兒子回一趟老家。

                                                  就這樣。

                                                  posted @ 2011-01-02 20:08 laogao 閱讀(1475) | 評論 (5)編輯 收藏

                                                  精准平特三肖
                                                  <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                  <bdo id="rub96"></bdo>

                                                    1. <track id="rub96"><div id="rub96"></div></track>
                                                      <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                          <nobr id="rub96"><address id="rub96"><big id="rub96"></big></address></nobr>
                                                        1. <menuitem id="rub96"><strong id="rub96"><menu id="rub96"></menu></strong></menuitem>
                                                          <dl id="rub96"><source id="rub96"><tr id="rub96"></tr></source></dl>
                                                          1. <tbody id="rub96"><div id="rub96"></div></tbody>
                                                            1. <bdo id="rub96"><optgroup id="rub96"></optgroup></bdo>
                                                            2. <bdo id="rub96"><dfn id="rub96"><dd id="rub96"></dd></dfn></bdo>
                                                              1. <option id="rub96"><source id="rub96"></source></option>
                                                              2. <bdo id="rub96"></bdo>

                                                                  <p id="rub96"><tr id="rub96"></tr></p>
                                                                1. <tbody id="rub96"></tbody>

                                                                  <bdo id="rub96"></bdo>

                                                                2. <option id="rub96"><source id="rub96"></source></option>

                                                                  <bdo id="rub96"><optgroup id="rub96"><dd id="rub96"></dd></optgroup></bdo>
                                                                    <track id="rub96"></track>

                                                                      <bdo id="rub96"></bdo>
                                                                    1. <option id="rub96"><p id="rub96"><tr id="rub96"></tr></p></option>

                                                                        <bdo id="rub96"></bdo>
                                                                        1. <track id="rub96"></track>
                                                                          1. <track id="rub96"></track>
                                                                                <bdo id="rub96"></bdo>
                                                                                <option id="rub96"></option>

                                                                                    1. <track id="rub96"><span id="rub96"></span></track>

                                                                                        <option id="rub96"></option>

                                                                                        1. 
                                                                                          
                                                                                            <option id="rub96"><span id="rub96"></span></option>
                                                                                            <bdo id="rub96"><address id="rub96"></address></bdo>
                                                                                            <option id="rub96"><source id="rub96"></source></option>
                                                                                              <nobr id="rub96"><address id="rub96"></address></nobr>
                                                                                            1. <nobr id="rub96"><optgroup id="rub96"><big id="rub96"></big></optgroup></nobr>
                                                                                              <track id="rub96"></track>

                                                                                              <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>
                                                                                                <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                                                                <bdo id="rub96"></bdo>

                                                                                                  1. <track id="rub96"><div id="rub96"></div></track>
                                                                                                    <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                                                                        <nobr id="rub96"><address id="rub96"><big id="rub96"></big></address></nobr>
                                                                                                      1. <menuitem id="rub96"><strong id="rub96"><menu id="rub96"></menu></strong></menuitem>
                                                                                                        <dl id="rub96"><source id="rub96"><tr id="rub96"></tr></source></dl>
                                                                                                        1. <tbody id="rub96"><div id="rub96"></div></tbody>
                                                                                                          1. <bdo id="rub96"><optgroup id="rub96"></optgroup></bdo>
                                                                                                          2. <bdo id="rub96"><dfn id="rub96"><dd id="rub96"></dd></dfn></bdo>
                                                                                                            1. <option id="rub96"><source id="rub96"></source></option>
                                                                                                            2. <bdo id="rub96"></bdo>

                                                                                                                <p id="rub96"><tr id="rub96"></tr></p>
                                                                                                              1. <tbody id="rub96"></tbody>

                                                                                                                <bdo id="rub96"></bdo>

                                                                                                              2. <option id="rub96"><source id="rub96"></source></option>

                                                                                                                <bdo id="rub96"><optgroup id="rub96"><dd id="rub96"></dd></optgroup></bdo>
                                                                                                                  <track id="rub96"></track>

                                                                                                                    <bdo id="rub96"></bdo>
                                                                                                                  1. <option id="rub96"><p id="rub96"><tr id="rub96"></tr></p></option>

                                                                                                                      <bdo id="rub96"></bdo>
                                                                                                                      1. <track id="rub96"></track>
                                                                                                                        1. <track id="rub96"></track>
                                                                                                                              <bdo id="rub96"></bdo>
                                                                                                                              <option id="rub96"></option>

                                                                                                                                  1. <track id="rub96"><span id="rub96"></span></track>

                                                                                                                                      <option id="rub96"></option>

                                                                                                                                      1. 
                                                                                                                                        
                                                                                                                                          <option id="rub96"><span id="rub96"></span></option>
                                                                                                                                          <bdo id="rub96"><address id="rub96"></address></bdo>
                                                                                                                                          <option id="rub96"><source id="rub96"></source></option>
                                                                                                                                            <nobr id="rub96"><address id="rub96"></address></nobr>
                                                                                                                                          1. <nobr id="rub96"><optgroup id="rub96"><big id="rub96"></big></optgroup></nobr>
                                                                                                                                            <track id="rub96"></track>

                                                                                                                                            <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>
                                                                                                                                            1. 江西新时时技巧qq群 北京pk赛车官网直播 9号平台9号彩票 看牌抢庄斗牛规律 我有100万怎么稳赚钱 百人棋牌皇家炸金花 网络上骰子猜单双有技巧吗 手机赢钱棋牌游戏名字 奔驰彩票官网 重庆时时彩计划群 江西新时时技巧qq群 6合是什么数字 下载最新棋牌游戏 江苏骰宝快3现场直播 体育比分最新开奖查询 富民3肖6码默认论坛