2012年4月25日 星期三

[Linux] 透過 Tarball 安裝軟體與桌面環境設定 @ Ubuntu 10.04

eclipse


安裝 Android 開發環境時,從 Android 官網介紹,安裝新版 ADT Plugin for Eclipse 建議採用 Eclipse 3.6.2 以上的版本,但 Ubuntu 10.04 環境中,預設是 3.5.2-2ubuntu4.3,因此打算從 Eclipse 官網下載 Eclipse Classic 3.7.2 版本,只是解壓縮後,要執行他還是必須透過 /path/eclipse/eclipse 方式,好一點是把他擺在系統環境變數可節省一些打字,然而,這些對使用 Ubuntu Desktop 的人來說,仍舊不方便。


幸運地,在網路上找到了解法:How to install Eclipse 3.7 on Ubuntu 11.04,在此就筆記一下對於 tarball 安裝該如何整合 desktop 環境操作。


主要三個步驟:



  • 安置 tarball 軟體

  • 設定環境變數

  • 設定 Desktop 選單環境


流程:


$ cd ~/
$ tar -xvf eclipse-SDK-3.7.2-linux-gtk.tar.gz
$ sudo mv eclipse /opt/
$ sudo chown -R root:root /opt/eclipse
$ sudo chmod -R +r /opt/eclipse


$ sudo touch /usr/bin/eclipse
$ sudo chmod 755 /usr/bin/eclipse
$ sudo vim /usr/bin/eclipse
#!/bin/sh
export ECLIPSE_HOME="/opt/eclipse"
$ECLIPSE_HOME/eclipse $*


$ sudo vim /usr/share/applications/eclipse.desktop
[Desktop Entry]
Encoding=UTF-8
Name=Eclipse
Comment=Eclipse IDE
Exec=eclipse
Icon=/opt/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=GNOME;Application;Development;
StartupNotify=true


如此一來,在 Ubuntu Desktop 的功能分類就能看到 Eclipse 了,並且也能正確顯示 icon 圖示,收工!


2012年4月22日 星期日

[Android] 更改 AOSP 顯示的帳號資訊

setting_about


最近把玩 AOSP 時,在 setting/about 可以看到此 AOSP 的編譯相關資訊,基於隱私想要更改他 XD 接著透過 grep -r "username" 的搜尋方式,發現此資訊擺放處:out/target/product/panda/system/build.prop 裡頭。


來回測試,發現修改方式有三種,第一種就是建立一個假帳號來編譯,讓 AOSP 編譯過程中取得假帳號的資訊;第二種方式則是變更環境變數 User 資訊,接著再重新編譯;第三種則是直接修改 out/target/product/panda/system/build.prop 資訊,並刪掉系統關鍵檔案,使之只重新編譯關鍵東西即可。


第二種方式:


$ cd ~/aosp
~/aosp$ source build/envsetup.sh
~/aosp$ make clean
~/aosp$ User=username
~/aosp$ lunch full_panda-eng
~/aosp$ make -j4


大約執行兩三分鐘後,就可以去翻 ~/aosp/out/target/product/panda/system/build.prop 出來看看,搜尋一下應該看不到自己的帳號名稱。此流程適合剛開始編譯或剛好打算全部重編用的。


第三種方式:


$ cd ~/aosp
~/aosp$ source build/envsetup.sh
~/aosp$ lunch full_panda-eng
~/aosp$ vim out/target/product/panda/system/build.prop
~/aosp$ rm out/target/product/panda/system.img
~/aosp$ make -j4


由於許多東西早已編好了,只是重新 build system.img 而已,算是最快的解法吧。


以上算是無聊想到的東西,但第二種跟第三種解法跟一比較起來,不曉得有沒更細節的東西沒清掉 XD


[漫畫] 食夢者/爆漫王


圖: wiki - 爆漫王


好像是去年十月後,開始透過 iPad 閱讀畫籍,大概今年二月底還三月初追了這部漫畫到第 170 話,今天無聊上網查一下線上漫畫,不一會兒就看到完結的訊息了(176話) XD 這半年來,無聊時會翻翻電子書閱讀軟體,東看看西翻翻,畢竟我太少買書、看書了,隨意回想,我看了灌籃高手、幽遊白書、第三隻眼、七龍珠、城市獵人、地獄老師、神龍之謎等兒時未完成的故事,好不容易鼓起勇氣接觸新的漫畫,第一部就是這「爆漫王」。今年真奇妙,隨手拈來盡是夢想相關的主題意識。


這部漫畫是在講兩位國中生開始畫漫畫的故事,裡頭很多小東西很像創業、經商一樣,例如讓漫畫(家)生存下來,如何吸引讀者票數,各類畫風影響等等的,初次接觸這部漫畫有被吸引到 :D 但如果反過來先用經商、創業的角度來看待這部漫畫,那收穫應該是很少很少的。透過這部漫畫的閱讀,讓此刻的我會多加思考,對自己人生有意義的東西該多放一點生命、時間進去追求的囉 :)


2012年4月18日 星期三

師父: 那些我在課堂外學會的本事

師父 - 那些我在課堂外學會的本事


記得 n 年前聽同事分享這本書很好看,當下我就隨手跟圖書館預約了,直到 n > 1.5 年後?我終於排到這本書了 XD 不愧是熱門書,書皮都快翻爛了,我看了幾十頁就下單買了這本書。這本書其實是把常聽到的粗略小事濃縮成故事敘說出來,如果你周邊都是一群真正拿自己的錢在創業的,那或許早已聽過五四三呢。


這本書比較著重在數字的管理,算是挺善用數學的效應 :D 我覺得對一般有興趣創業的人都可以翻來筆記一下,不是多高深的技術,卻還挺有用的,應該算通用的角度跟經驗分享。如果說 「Rework 工作大解放:這樣做事反而更成功」是用來激勵人心,那「師父:那些我在課堂外學會的本事」則偏向營運管理吧 :D 我覺得這兩本都算是創業型書籍,而且不像教科書那種 xx 管理課程,必須在大公司才能展現,甚至這本書的某章節還帶到一點 Game Theory 的生活應用角度喔,就那句經典名言:尋求彼此「不滿意,但可以接受」的狀態。


這本書比較適合細細品味,偶爾翻個一兩回也挺不錯的。


[Java] 使用 Apache POI 擷取 Word、Excel、PowerPoint 文字


Apache POI - the Java API for Microsoft Documents


這次用 POI 的目的是練習把 Word、Excel 和 PowerPoint 裡頭的文字擷取出來,如果用 "extract"、"text" 和 "doc"、"docx"、"ppt" 和 "pptx" 很容易找到網路上用 Apache POI 所作的範例,此次我就拿這套來練習,那目標呢?我翻了一下 POI 的程式碼,至少要做到 doc、docx、ppt、pptx、xls、xlsx 的文字抽取,而測次結果的確都做得到了。


首先我很懶地看文字,只稍微看到官網的 Text Extraction 介紹,但那段就成為我程式的主要架構了,經過多次的旁敲側擊,讓我發現挖到寶的是 TestExtractorFactory.java!真的是太讚啦,簡單地說我想要了解 POI 跟如何去做的事,完完全全看 TestExtractorFactory.java 就搞定了!包含支援哪些檔案格式、怎樣用,全部清清楚楚,看來從 test case 開始也是另類的偷懶式學習。


最後,程式碼:


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.StringBuffer;


// https://svn.apache.org/repos/asf/poi/trunk/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
import org.apache.poi.POIOLE2TextExtractor;
import org.apache.poi.POITextExtractor;
//import org.apache.poi.POIDataSamples;
//import org.apache.poi.extractor.*;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.hdgf.extractor.VisioTextExtractor;
import org.apache.poi.hpbf.extractor.PublisherTextExtractor;
import org.apache.poi.hslf.extractor.PowerPointExtractor;
import org.apache.poi.hsmf.extractor.OutlookTextExtactor;
import org.apache.poi.hssf.extractor.EventBasedExcelExtractor;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hwpf.extractor.Word6Extractor;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
import org.apache.poi.xssf.extractor.XSSFEventBasedExcelExtractor;
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;


import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.OfficeXmlFileException;


import org.apache.poi.xslf.usermodel.XMLSlideShow; // pptx 2007, http://poi.apache.org/apidocs/org/apache/poi/xslf/
import org.apache.poi.xwpf.usermodel.XWPFDocument; // docx 2007, http://poi.apache.org/apidocs/org/apache/poi/xwpf/
import org.apache.poi.xssf.usermodel.XSSFWorkbook; // xlsx 2007, http://poi.apache.org/apidocs/org/apache/poi/xssf/


class ExtractText
{
    public static String file(String path)
    {
        try { return pptx(new FileInputStream(path)); } catch(Exception e) { }
        try { return docx(new FileInputStream(path)); } catch(Exception e) { }
        try { return xlsx(new FileInputStream(path)); } catch(Exception e) { }
        return "";
    }
    public static String pptx(InputStream in) throws Exception
    {
        XSLFPowerPointExtractor o = new XSLFPowerPointExtractor( new XMLSlideShow(in) );
        o.setSlidesByDefault(true);
        o.setNotesByDefault(true);
        return o.getText();
    }
    public static String docx(InputStream in) throws Exception
    {
        XWPFWordExtractor o = new XWPFWordExtractor(new XWPFDocument(in));
        return o.getText();
    }
    public static String xlsx(InputStream in) throws Exception
    {
        XSSFExcelExtractor o = new XSSFExcelExtractor(new XSSFWorkbook(in));
        return o.getText();
    }
    public static void main(String argv[])
    {
        try
        {
            InputStream in = null;
            if( argv.length < 1 )
                in = System.in;
            else
                in = new FileInputStream(path);
            StringBuffer output = new StringBuffer();
            POITextExtractor textExtractor = ExtractorFactory.createExtractor(in);
            //POIFSFileSystem fileSystem = new POIFSFileSystem(in);
            //POITextExtractor textExtractor = ExtractorFactory.createExtractor(fileSystem);
            //POIOLE2TextExtractor oleTextExtractor = ExtractorFactory.createExtractor(fileSystem);
            //POITextExtractor[] embeddedExtractors = ExtractorFactory.getEmbededDocsTextExtractors(oleTextExtractor);
            //for (POITextExtractor textExtractor : embeddedExtractors)
            {
                if (textExtractor instanceof ExcelExtractor) // xls, excel 97-2003
                {
                    ExcelExtractor extractor = (ExcelExtractor) textExtractor;
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof XSSFExcelExtractor) // xlsx, excel 2007
                {
                    XSSFExcelExtractor extractor = (XSSFExcelExtractor) textExtractor;
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof Word6Extractor) // doc, word 95
                {
                    Word6Extractor extractor = (Word6Extractor) textExtractor;
                    // http://poi.apache.org/apidocs/org/apache/poi/hwpf/extractor/Word6Extractor.html
                    //for (String paragraph : extractor.getParagraphText() )
                    // System.out.println(paragraph);
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof WordExtractor) // doc, word 97-2003
                {
                    WordExtractor extractor = (WordExtractor) textExtractor;
                    // http://poi.apache.org/apidocs/org/apache/poi/hwpf/extractor/WordExtractor.html
                    //System.out.println(extractor.getHeaderText());
                    //System.out.println(extractor.getFooterText());
                    //for (String paragraph : extractor.getParagraphText() )
                    // System.out.println(paragraph);
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof XWPFWordExtractor) // docx, word 2007
                {
                    XWPFWordExtractor extractor = (XWPFWordExtractor) textExtractor;
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof PowerPointExtractor) // ppt, ppt 97-2003
                {
                    PowerPointExtractor extractor = (PowerPointExtractor) textExtractor;
                    //System.out.println(extractor.getText());
                    //System.out.println(extractor.getNotes());
                    output.append(extractor.getText());
                    output.append(extractor.getNotes());
                }
                else if (textExtractor instanceof XSLFPowerPointExtractor ) // pptx, powerpoint 2007
                {
                    XSLFPowerPointExtractor extractor = (XSLFPowerPointExtractor) textExtractor;
                    extractor.setSlidesByDefault(true);
                    extractor.setNotesByDefault(true);
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof VisioTextExtractor) // vsd, visio
                {
                    VisioTextExtractor extractor = (VisioTextExtractor) textExtractor;
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof PublisherTextExtractor) // pub, publisher
                {
                    PublisherTextExtractor extractor = (PublisherTextExtractor) textExtractor;
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
                else if (textExtractor instanceof OutlookTextExtactor) // msg, outlook
                {
                    OutlookTextExtactor extractor = (OutlookTextExtactor) textExtractor;
                    //System.out.println(extractor.getText());
                    output.append(extractor.getText());
                }
            }
            System.out.println(output.toString().replaceAll( "[\n\t\r ]+"," "));
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            // e.printStackTrace();
            // System.out.println(e);
        }
    }
}


編譯,使用 poi-bin-3.8-20120326.zip 版本:


$ javac -Xlint:deprecation -cp .:lib-3.8/commons-logging-1.1.jar:lib-3.8/poi-3.8-20120326.jar:lib-3.8/poi-ooxml-schemas-3.8-20120326.jar:lib-3.8/dom4j-1.6.1.jar:lib-3.8/poi-examples-3.8-20120326.jar:lib-3.8/poi-scratchpad-3.8-20120326.jar:lib-3.8/junit-3.8.1.jar:lib-3.8/poi-excelant-3.8-20120326.jar:lib-3.8/stax-api-1.0.1.jar:lib-3.8/log4j-1.2.13.jar:lib-3.8/poi-ooxml-3.8-20120326.jar:lib-3.8/xmlbeans-2.3.0.jar ExtractText.java


執行,使用 poi-bin-3.8-20120326.zip 版本:


$ java -cp .:lib-3.8/commons-logging-1.1.jar:lib-3.8/poi-3.8-20120326.jar:lib-3.8/poi-ooxml-schemas-3.8-20120326.jar:lib-3.8/dom4j-1.6.1.jar:lib-3.8/poi-examples-3.8-20120326.jar:lib-3.8/poi-scratchpad-3.8-20120326.jar:lib-3.8/junit-3.8.1.jar:lib-3.8/poi-excelant-3.8-20120326.jar:lib-3.8/stax-api-1.0.1.jar:lib-3.8/log4j-1.2.13.jar:lib-3.8/poi-ooxml-3.8-20120326.jar:lib-3.8/xmlbeans-2.3.0.jar ExtractText < MyOfficeFile2003.doc


$ java -cp .:lib-3.8/commons-logging-1.1.jar:lib-3.8/poi-3.8-20120326.jar:lib-3.8/poi-ooxml-schemas-3.8-20120326.jar:lib-3.8/dom4j-1.6.1.jar:lib-3.8/poi-examples-3.8-20120326.jar:lib-3.8/poi-scratchpad-3.8-20120326.jar:lib-3.8/junit-3.8.1.jar:lib-3.8/poi-excelant-3.8-20120326.jar:lib-3.8/stax-api-1.0.1.jar:lib-3.8/log4j-1.2.13.jar:lib-3.8/poi-ooxml-3.8-20120326.jar:lib-3.8/xmlbeans-2.3.0.jar ExtractText < MyOfficeFile2003.xls


$ java -cp .:lib-3.8/commons-logging-1.1.jar:lib-3.8/poi-3.8-20120326.jar:lib-3.8/poi-ooxml-schemas-3.8-20120326.jar:lib-3.8/dom4j-1.6.1.jar:lib-3.8/poi-examples-3.8-20120326.jar:lib-3.8/poi-scratchpad-3.8-20120326.jar:lib-3.8/junit-3.8.1.jar:lib-3.8/poi-excelant-3.8-20120326.jar:lib-3.8/stax-api-1.0.1.jar:lib-3.8/log4j-1.2.13.jar:lib-3.8/poi-ooxml-3.8-20120326.jar:lib-3.8/xmlbeans-2.3.0.jar ExtractText < MyOfficeFile2003.ppt


$ java -cp .:lib-3.8/commons-logging-1.1.jar:lib-3.8/poi-3.8-20120326.jar:lib-3.8/poi-ooxml-schemas-3.8-20120326.jar:lib-3.8/dom4j-1.6.1.jar:lib-3.8/poi-examples-3.8-20120326.jar:lib-3.8/poi-scratchpad-3.8-20120326.jar:lib-3.8/junit-3.8.1.jar:lib-3.8/poi-excelant-3.8-20120326.jar:lib-3.8/stax-api-1.0.1.jar:lib-3.8/log4j-1.2.13.jar:lib-3.8/poi-ooxml-3.8-20120326.jar:lib-3.8/xmlbeans-2.3.0.jar ExtractText < MyOfficeFile2007.docx


$ java -cp .:lib-3.8/commons-logging-1.1.jar:lib-3.8/poi-3.8-20120326.jar:lib-3.8/poi-ooxml-schemas-3.8-20120326.jar:lib-3.8/dom4j-1.6.1.jar:lib-3.8/poi-examples-3.8-20120326.jar:lib-3.8/poi-scratchpad-3.8-20120326.jar:lib-3.8/junit-3.8.1.jar:lib-3.8/poi-excelant-3.8-20120326.jar:lib-3.8/stax-api-1.0.1.jar:lib-3.8/log4j-1.2.13.jar:lib-3.8/poi-ooxml-3.8-20120326.jar:lib-3.8/xmlbeans-2.3.0.jar ExtractText < MyOfficeFile2007.xlsx


$ java -cp .:lib-3.8/commons-logging-1.1.jar:lib-3.8/poi-3.8-20120326.jar:lib-3.8/poi-ooxml-schemas-3.8-20120326.jar:lib-3.8/dom4j-1.6.1.jar:lib-3.8/poi-examples-3.8-20120326.jar:lib-3.8/poi-scratchpad-3.8-20120326.jar:lib-3.8/junit-3.8.1.jar:lib-3.8/poi-excelant-3.8-20120326.jar:lib-3.8/stax-api-1.0.1.jar:lib-3.8/log4j-1.2.13.jar:lib-3.8/poi-ooxml-3.8-20120326.jar:lib-3.8/xmlbeans-2.3.0.jar ExtractText < MyOfficeFile2007.pptx


只能說這軟體架構不錯,僅須稍微修改就能弄成自動判斷格式囉 :D 在此開發的環境是 Ubuntu ,因此在 -cp 參數的數值,多個 jar 檔是用冒號 ":" 分隔的,若是 Windows 的話,要改成對應的(不確定是不是分號 ";")