<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Read Sean

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

    2011年1月2日

    不知道從什么時(shí)候開始的,tsocks在Mac下面安裝要費(fèi)些周折,brew官方和曾經(jīng)一度存在的第三方tap都不再支持直接brew install,需要手工創(chuàng)建formula。過(guò)程倒也還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 閱讀(4082) | 評(píng)論 (2)編輯 收藏

    有了RPi當(dāng)然免不了要玩玩XBMC,這里推薦XBian,安裝配置過(guò)程如下:

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

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

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


    整理一下 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 閱讀(12887) | 評(píng)論 (0)編輯 收藏

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

    首先是操作系統(tǒng)。作為Arch重度用戶,當(dāng)然選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卡上的分區(qū)拖滿,充分利用空間。這樣SD卡就準(zhǔn)備好了,插到RPi上,接上Micro-USB的電源和網(wǎng)線,啟動(dòng)RPi,從路由器上找到RPi的IP地址(機(jī)器名默認(rèn)是alarmpi),ssh上去(用戶名root密碼root),修改密碼,創(chuàng)建非root賬號(hào),執(zhí)行系統(tǒng)更新 sudo pacman -Syu ,這之后開始安裝藍(lán)牙相關(guān)工具:
    sudo pacman -S bluez bluez-utils

    確保藍(lán)牙dongle插到RPi的USB接口,通過(guò) hciconfig 確認(rèn)藍(lán)牙設(shè)備被識(shí)別,輸出應(yīng)該類似下面這個(gè)樣子:
    [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

    啟動(dòng)bluetooth:
    sudo systemctl start bluetooth

    完成以后,即可通過(guò) bluetoothctl 命令打開藍(lán)牙控制臺(tái),執(zhí)行各項(xiàng)藍(lán)牙相關(guān)操作,比如show、list、scan on、agent、info等等,這里不展開了。

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

    Enjoy!

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

    第11頁(yè)(練習(xí)):
    在Scala REPL中鍵入3,然后按Tab鍵 應(yīng)為 在Scala REPL中鍵入3.,然后按Tab鍵

    第19頁(yè)(正文):
    util方法返回一個(gè)并不包含上限的區(qū)間 應(yīng)為 until方法返回一個(gè)并不包含上限的區(qū)間

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

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

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

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

    第53頁(yè)(正文):
    Scala對(duì)每個(gè)字端都提供getter和setter方法 應(yīng)為 Scala對(duì)每個(gè)字段都提供getter和setter方法

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

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

    // 本文僅作為信息發(fā)布窗口,如需討論交流,請(qǐng)通過(guò)郵件 gaoyuxiang.scala@gmail.com 或 QQ群 132569382 。

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

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

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

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

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

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

    今天遠(yuǎn)程支持同事在Windows環(huán)境調(diào)優(yōu)Apache服務(wù)器性能,記錄在此,供需要的朋友參考。

    Java EE應(yīng)用,同時(shí)部署在兩個(gè)Tomcat(5.5.27)實(shí)例上,前面放了個(gè)Apache(httpd-2.2.19-win32-x86-no_ssl),通過(guò)mod_jk(1.2.32)做負(fù)載均衡,同一臺(tái)物理服務(wù)器,操作系統(tǒng)為64位的Windows Server 2003 SP2?,F(xiàn)象是60+客戶端,平均每個(gè)客戶端每秒請(qǐng)求數(shù)2次,單個(gè)請(qǐng)求正常響應(yīng)時(shí)間在500ms以內(nèi),即每秒沖進(jìn)來(lái)120個(gè)請(qǐng)求,并發(fā)量最多在60上下,Apache就已不堪"重"負(fù),靜態(tài)資源響應(yīng)時(shí)間都超過(guò)10s,同時(shí)Tomcat和數(shù)據(jù)庫(kù)服務(wù)器均正常。憑我的經(jīng)驗(yàn),同樣的壓力直接壓到Tomcat也不至于這么難看??磥?lái)問(wèn)題出在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>

    這樣我們就能通過(guò)/status頁(yè)面查看服務(wù)器當(dāng)前的狀態(tài)信息,結(jié)果觀察到worker(即線程)數(shù)僅為64!坑爹??!難怪撐不住。我記得以前Windows下面的Apache默認(rèn)線程數(shù)沒(méi)這么小的。找準(zhǔn)問(wèn)題,接下來(lái)就好辦了:

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

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

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

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


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

    很久沒(méi)碰Python了,不過(guò)我相信用Python一定有辦法解決這個(gè)需求,于是經(jīng)過(guò)簡(jiǎn)單的googling,便發(fā)現(xiàn)了這個(gè)pyPdf庫(kù) ( http://pybrary.net/pyPdf/ ) ,操作起來(lái)相當(dāng)直接易懂,把代碼貼在這兒,做個(gè)記錄。

     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 閱讀(12650) | 評(píng)論 (2)編輯 收藏


    今天幫同事解決一個(gè)郵件亂碼的問(wèn)題,簡(jiǎn)記于此。

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

    通過(guò)簡(jiǎn)單的Groovy腳本對(duì)這兩個(gè)漢字分別按gbk和utf-8編碼,并將得到的byte[]轉(zhuǎn)換成二進(jìn)制表示輸出如下:

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

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

    關(guān)鍵代碼:

    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 閱讀(2700) | 評(píng)論 (0)編輯 收藏


    問(wèn)題起因: 幫同事排查一個(gè)SVN資源庫(kù)導(dǎo)入后無(wú)法使用的問(wèn)題,checkout時(shí)報(bào)錯(cuò)
      Expected FS format '2'; found format '3'
      期待文件系統(tǒng)(FS)格式 “2”;找到格式“3”

    熟悉SVN的朋友應(yīng)該知道,Subversion大版本更新時(shí)有可能會(huì)對(duì)其文件格式進(jìn)行調(diào)整,因此內(nèi)部有文件格式版本的說(shuō)法,以上報(bào)錯(cuò)信息在網(wǎng)上搜一下就知道,版本2和版本3分別對(duì)應(yīng)Subversion的1.4.x和1.5.x,于是問(wèn)題歸結(jié)為如何給資源庫(kù)降級(jí),從而得到與1.4兼容的dump文件。方法很簡(jiǎn)單,記錄如下,供需要的朋友參考:

    首先在1.5.x的Subversion環(huán)境下新建一個(gè)與1.4.x兼容的資源庫(kù)
      svnadmin --pre-1.5-compatible create project01

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

    最后再做一次導(dǎo)出即可
      svnadmin dump project01 > dumpfule.new

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

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


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

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

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

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

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

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


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

    首先是下載對(duì)應(yīng)版本的RCP框架在不同操作系統(tǒng)的插件,將它們放在同一個(gè)plugins目錄,比如你可以用win32為基礎(chǔ),然后添加針對(duì)其他平臺(tái)的如下插件:

    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

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

    最后分享一下我們軟件部署的機(jī)制: 按照前面介紹的方式打包的應(yīng)用程序,交到用戶手里并不是很友好,因?yàn)樾枰?她自己再做一次判斷,當(dāng)前的操作系統(tǒng)是什么,然后打開不同的目錄去點(diǎn)擊不同的可執(zhí)行文件。我們的做法是單獨(dú)提供一個(gè)Swing程序,在客戶端自動(dòng)判斷OS,然后自動(dòng)調(diào)用不同版本的可執(zhí)行文件,同時(shí),這個(gè)Swing程序被做成Java Web Start,把整個(gè)RCP客戶端的下載和同步也處理掉,這樣,對(duì)用戶而言,整個(gè)過(guò)程就透明了,只需要一個(gè)JNLP,剩下的工作完全自動(dòng)化。

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


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

    jps

    顧名思義,它對(duì)應(yīng)到UNIX的ps命令。用法如下:

    jps [ options ] [ hostid ]

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

    jstat

    用于輸出給定java進(jìn)程的統(tǒng)計(jì)信息。用法如下:

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

    假定你要監(jiān)控的Java進(jìn)程號(hào)是12345,那么
    jstat -gcutil -t 12345 200 300 即可每200毫秒連續(xù)打印300次帶有時(shí)間戳的GC統(tǒng)計(jì)信息。

    簡(jiǎn)單解釋一下: -gcutil是傳入的option;必選,-t是打印時(shí)間戳,是以目標(biāo)JVM啟動(dòng)時(shí)間為起點(diǎn)計(jì)算的,可選;12345是vmid/pid,和我們從jps拿到的是一樣的,必選;200是監(jiān)控時(shí)間間隔,可選,不提供就意味著單次輸出;300是最大輸出次數(shù),可選,不提供且監(jiān)控時(shí)間間隔有值的話,就是無(wú)限期打印下去。

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

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


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

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

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

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

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

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

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

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


    為克服拖延癥,在此列出2011年要做的事,給未來(lái)的自己監(jiān)督:

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

    就這樣。

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

    主站蜘蛛池模板: 亚洲天堂2016| 久久亚洲中文字幕精品有坂深雪| 亚洲精品二三区伊人久久| 国产成人精品免费视频动漫| 亚洲色大成网站www永久| 亚洲免费在线视频观看| 亚洲人6666成人观看| 99热在线精品免费全部my| 色噜噜亚洲男人的天堂| 成人免费无码大片a毛片| 亚洲精品乱码久久久久久V| 日本大片在线看黄a∨免费| 青草青草视频2免费观看| 久久精品国产精品亚洲艾草网美妙| 一区免费在线观看| 亚洲av中文无码乱人伦在线r▽ | 免费人成在线观看视频高潮| 亚洲精品成人无码中文毛片不卡| 国产一精品一av一免费爽爽| 亚洲欧洲日本天天堂在线观看| 在线a毛片免费视频观看| 老司机精品视频免费| 国产亚洲一区二区在线观看| 一级毛片免费毛片一级毛片免费 | 91精品国产亚洲爽啪在线影院| 中国xxxxx高清免费看视频| 国产91在线|亚洲| 又粗又大又长又爽免费视频| 免费在线观影网站| 亚洲jizzjizz在线播放久| 亚洲av片一区二区三区| 三年片在线观看免费西瓜视频| 亚洲成a人片在线观看播放| 四虎影在线永久免费四虎地址8848aa | 国产永久免费高清在线| 亚洲精品亚洲人成在线播放| 亚洲成aⅴ人片久青草影院| 久久久久久国产精品免费无码| 亚洲AV综合永久无码精品天堂| 亚洲一区二区三区在线播放| 亚洲综合免费视频|