2014年6月4日水曜日

Eclipseのプラグインの実装メモ

 Eclipseのプラグインの実装に関して、あれこれ調べたのでメモ。
 どこかからファイルを新規プロジェクト内にコピーして、それをEclipse上で開くコード。

            URL u = new URL("file:c:/tmp/Newfile.xml");
            InputStream stream = u.openStream();
            IWorkspace iw = ResourcesPlugin.getWorkspace();
            IWorkspaceRoot root = iw.getRoot();
            IProject project = root.getProject("新規プロジェクト");
            if (!project.exists()) {
                project.create(null); // プロジェクト作成
            }
            project.open(null);
            IFile file = project.getFile("新規ファイル.xml");
            if (!file.exists()) {
                file.create(stream, true, null); // プロジェクト内にファイルを作成
            }
            stream.close();
           
            // IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            IWorkbenchPage page = window.getActivePage();
            IDE.openEditor( page, file, true);

 IWorkbenchWindowのとこをコメントアウトしてるのは、実装してるプラグインのテンプレートで、たまたまメンバ変数になってたから。

2013年5月20日月曜日

LibOのSDKの中のcppサンプルをコンパイル

Ubuntu12.04でLibOのSDK内のcppサンプルをコンパイルしてみたのでメモ。
(LibOとか、build-essentialとか、JDKとか、zipとかはインスコ済み)


1. SDKのインスコ(2個目のやつはサンプルが入ってるパッケージ。)
sudo aptitude install  libreoffice-dev  libreoffice-dev-doc
2. パッケージは、/usr/lib/libreoffice/sdk/に展開されるので、そこで、なんか環境変数設定用のスクリプトを実行。
cd /usr/lib/libreoffice/sdk/
./setsdkenv_unix
3. サンプルソースがあるディレクトリで、コンパイル実行。boost/unordered_mapなんかねぇぞコラってエラー。
cd /usr/lib/libreoffice/sdk/examples/cpp/complextoolbarcontrols/
make
4. build-essentialだけだと、C++ライブラリが足りなかったぽいので、追加して、再コンパイル。
sudo aptitude install libboost-all-dev
make clean
make

そうすると、/hmoe/tani/libreoffice3.5_sdk/LINUXexample.out/bin/ 以下にoxtファイルが出来上がってるので、LibOにインスコ。以下みたいな感じ。


なお作ったサンプルoxtを、Windows版LibOに入れると、ツールバーは出てくるけど、動いてないっぽい感じ。そらそーか。

2013年5月9日木曜日

Bitmap画像をLibO Calcのセルの背景色で表現するマクロ

BMPの仕様をちゃんと調べたり、座標合わせたりすんのが、結構大変だったのでメモ。
UbuntuのLibreOffice Calcで動作確認してます。
利用する画像は、あらかじめGIMPとかで、サイズを50 * 50ピクセルに拡大・縮小し、24ビットのBMP画像として保存しておきます。

Sub Main
  oSheet = ThisComponent.getSheets().getByName("Sheet1")
 
  ' セルのサイズ調整
  For i = 0 To 49
    oSheet.getColumns().getByIndex(i).Width = 500
    For j = 0 To 49
      oSheet.getRows().getByIndex(j).Height = 500
    Next j
  Next i
 
  ' bmpファイルの読み込み
  sURL = ConvertToURL("/home/tani/デスクトップ/testbmp.bmp")
  Dim buf(FileLen(sURL) - 1) As Byte
  Open sURL For Binary As #1
  Get #1, , buf
  Close #1
 
  ' RGBデータをセルの背景色に設定
  For i = 0 To 49
    counter = counter + 2
    For j = 0 To 49
      oCell = oSheet.getCellByPosition(49 - j, i)
      r = buf(Ubound(buf) - counter)
      counter = counter + 1
      g = buf(Ubound(buf) - counter)
      counter = counter + 1
      b = buf(Ubound(buf) - counter)
      counter = counter + 1
      oCell.CellBackColor = rgb(r, g, b)
    Next j
  Next i
End Sub
実行すると、こんな感じ。


2013年4月17日水曜日

LibO Basicでフォルダ内の全ファイルを再帰的に取得

Excel VBAだとサンプルがすぐ見つかるけど(Excel2003と2010で非互換があるので要注意)、LibreOfficeのサンプルが簡単には見つからなかったので。

こんな感じ。


Function SearchFileMain As Boolean 
  SearchFileMain = false
  sTargetURL = ConvertToURL("C:\tmp")
  Dim aFileURL(0)
  SearchFileRepeat(sTargetURL, aFileURL)
  MsgBox "配列にファイルリストを格納しました。"
  SearchFileMain = true
End Function

' 対象ファイルの再帰検索
Sub SearchFileRepeat(sDirURL As String, ByRef aFileURL)
  oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
  aFC = oSFA.getFolderContents(sDirURL, true)

  For i = Lbound(aFC) To Ubound(aFC)
    item = aFC(i)
    If oSFA.IsFolder(item) Then
      SearchFileRepeat(item, aFileURL)
    Else
      j = Ubound(aFileURL)
      If j = 0 And IsEmpty(aFileURL(0)) Then
        aFileURL(0) = item
      Else
        Redim preserve aFileURL(j + 1)
        aFileURL(j + 1) = item
      End If
    End If
  Next i
End Sub

2012年10月30日火曜日

Pythonでxls(xlsx)ファイルを開いてデータ取得

Pythonでxls(xlsx)ファイルを開くにはxlrdというライブラリを使えばおk。

Ubuntuであれば sudo aptitude install python-xlrd で入ります。
ただUbuntu12.04だとバージョンが古く(0.6らしい)、これだとxlsxが開けません。

xlsxも開きたければ、PyPIから最新版を持ってくる必要があります。
 http://pypi.python.org/pypi/xlrd
ここからダウンロードしたファイルを展開して、できたディレクトリの中で、sudo python setup.py install でおk。

↓みたいな感じでいけます。日本語(UTF-8)も普通に通る。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import xlrd
book = xlrd.open_workbook(u"/home/tani/ああああ.xlsm")
print "The number of worksheets is", book.nsheets
print "First Worksheet name:", unicode(book.sheet_by_index(0).name)
sh = book.sheet_by_index(0)
print "Cell C6 is", unicode(sh.cell_value(rowx=5, colx=2))

2012年10月1日月曜日

LibO Calcで数字の前の'(シングルクオーテーション)を削除

Calcで数字の前に「'」がくっついて文字列になってしまった後、「'」だけを削除する方法。ぐぐったら外人さんが以下の方法書いてました。

検索と置換で、正規表現を有効にして、検索テキストに「^.」、置換テキストに「&」を入れて「すべて置換」でおk

実際に試してみると、たしかに動きます。なんでこれで動くのかさっぱりわかりませんが。。。
イザとなったらマクロでもつくろうかと思ってましたが、マクロで作るにしても置換機能のAPI使ったほうが早そうです。

追記:
↑と同じ動作を行うマクロ

Sub CleanCell
    oSelection = ThisComponent.getCurrentController().getSelection()
    If oSelection.supportsService("com.sun.star.sheet.SheetCellRange") = False Then
        Exit Sub
    End If
   
    oRD = oSelection.createReplaceDescriptor()
    oRD.SearchString = "^."
    oRD.ReplaceString = "&"
    oRD.SearchRegularExpression = True
    oSelection.replaceAll(oRD)
End Sub

2012年9月24日月曜日

LibO Calcでモードレスダイアログ(なんちゃって)

ダイアログ作成画面で作ったダイアログを、モードレスダイアログっぽく使うなんちゃってコード。
(本格的に、ダイアログを動的に生成するコードをゴリゴリ書くと、モードレスダイアログも普通にできるらしいけど、ちょっと面倒なので。)

Dim ContinuFlg As Boolean

Sub Main
  DialogLibraries.LoadLibrary("Standard")
  oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
  oDialog.setVisible(true)
 
  ContinuFlg = true
  While ContinuFlg
    wait(1000)
  Wend
 
  oDialog.dispose()
End Sub

Sub SetValue(ev)
  oSelect = ThisComponent.getCurrentController().getSelection()
  oSelect.setString(ev.ActionCommand)
End Sub

Sub DialogClose(ev)
  ContinuFlg = false
End Sub



んで、↑みたいなダイアログを用意して、ListBoxのイベントの実行時に「SetValue」、閉じるボタンのイベントの実行時に「DialogClose」を設定するとおk。リストのアイテムを選んでダブルクリックしたりすると、モードレスっぽい動作で、選択中のセルに選択した文字列が入力されます。
ダイアログをexecuteせずに、無限ループで待機状態にするのがポイント。閉じるボタンを作って
無限ループを終了させる必要があります。なにこの裏技っぽいの。

2012年5月1日火曜日

LibreOfficeのパッチ作成

LibreOfficeのpatch作成を妄想中。

手順としては、例えばLibO3.5.1と3.5.2のmsiを展開し、中のファイル群に対して、バイナリ差分を作成し、出来たpatch群をLibO3.5.1のmsiにあてると、LibO3.5.2のmsiに変身するって感じ。
(最初は、Program Files以下のインストール済みのファイルとかに対してpatch当てるのを妄想してたけど、レジストリとかOS周りの設定類がめんどくさそうなので、インストーラーに対してpatch当てる方針で。)

ツールはBSD由来のbsdiff(bspatch)というやつを使う予定。(最初はGPLのxdeltaってのを使おうかと思ってたけど、圧縮率がbsdiffのほうが良さそうなので。)

2012年3月23日金曜日

ooo basic (libreoffice basic) でbitmap画像作成



以下みたいな感じで256 * 256ピクセルのbitmap画像が作成できた。
内容は泥臭いバイナリ処理だけど、RGBデータの配列とかあるなら、Drawのマクロとか使うよりスマートかも。

Dim ci As Integer, cl As Long
sImagePath = "C:\Documents and Settings\ttani\My Documents\test2.bmp"

Open sImagePath For Binary As 1
   
Put 1, 1, "BM"
cl = 54 + 256 * 256 * 3 : Put 1, 3, cl
  ci = 0 : Put 1, 7, ci
  ci = 0 : Put 1, 9, ci
  cl = 54 : Put 1, 11, cl
 
  cl = 40 : Put 1, 15, cl
  cl = 256 : Put 1, 19, cl
  cl = 256 : Put 1, 23, cl
  ci = 1 : Put 1, 27, ci
  ci = 24 : Put 1, 29, ci
  cl = 0 : Put 1, 31, cl
  cl = 0 : Put 1, 35, cl
  cl = 0 : Put 1, 39, cl
  cl = 0 : Put 1, 43, cl
  cl = 0 : Put 1, 47, cl
  cl = 0 : Put 1, 51, cl

Dim aData(256 * 256 * 3) As Byte
Dim counter As Long

For i = 0 To 255
For j = 0 To 255
aData(counter) = i
counter = counter + 1
aData(counter) = j
counter = counter + 1
aData(counter) = 255
counter = counter + 1
Next j
Next i
 
For i = 0 To Ubound(aData()) - 1
ci = aData(i) : Put 1, 55 + i, ci
Next i
Close 1

2012年2月16日木曜日

OOo, LibreOffice, SymphonyのPPTファイル読み込み速度

ちょっと大きいpptファイル(8MBでスライド数500くらい)をPowerPoint2003で作成し、OOo3.2.1, OOo3.3.0, LibreOffice3.5.0, Lotus Symphony3.0.1それぞれで、読み込むのにどれくらい時間がかかるか試してみた。
ちなみにOOo3.2.1だけインスコするモジュールを減らしたりした、カスタマイズ版。

pptファイルの作りとか実行環境にもよるかもしれないけど、とりあえず手元で作成したサンプルのpptファイルを標準のLet's noteで開いた場合、処理時間は、Symphony>LibreOffice3.5>OOo3.3>OOo3.2.1(改)になった。(つまりOOo3.2.1(改)が一番優秀。カスタマイズしたのが効いてるのかも)

まぁどれも1分以上かかってるので、PowerPointには負けてるんだけど(PowerPointは正確に測ってないけど30秒くらいで開く)、OOo系の姉妹品みたいな奴らの中でも、有意な差がでたのが面白かったので、メモ。

2012年1月17日火曜日

VB(VisualStudio2010Pro)でファイルのタイムスタンプ更新

Windows XPで、ファイルの作成日時、更新日時、アクセス日時をコマンドラインで変更する方法をアレコレ調べたけど、なんか厳しそうなので、いっそオレオレツールでもつくるか、と思ってVisualStudio立ち上げてみたのでメモ。
以下みたいな感じで3行でいけた。

System.IO.File.SetCreationTime(sFilePath, dDate)
System.IO.File.SetLastAcccessTime(sFilePath, dDate)
System.IO.File.SetLastWriteTime(sFilePath, dDate)

ちなみにPowerShellいれたら(Windows7だったら)、こんなん作らなくても、コマンドでさくっといけるっぽい。

2012年1月10日火曜日

VBAのApplication.FileSearchの高度なオプション

Excel 2003 VBAでApplication.filesearch使ってて、最終更新日が、ある日付以降のファイルだけ抽出したいな、と思ったので試行錯誤。とりあえず適当にググると以下のページ発見。

http://msdn.microsoft.com/en-us/library/aa191056(v=office.10).aspx

欲しかったのは、日付と日付に挟まれたのじゃなくて、ある日付から現在までのものだけど、これと大体おんなじようにやればいけるかな、と、目処がたったので、さらにググると以下発見。

http://msdn.microsoft.com/fr-fr/library/microsoft.office.core.filesearch.lastmodified(v=office.11).aspx
http://msdn.microsoft.com/ja-jp/library/microsoft.office.core.msocondition(v=Office.11).aspx

んで多分、↓みたいな感じでいけるかな、と思ったら、さっぱり動かない。
Call Application.FileSearch.PropertyTests.Add("Last Modified", msoConditionOnOrAfter, "4/1/09")

アレコレ試して、日本語環境だと以下が正解だとわかった。
Call Application.FileSearch.PropertyTests.Add("最終更新日", msoConditionOnOrAfter, "2009/4/1")

日本語環境ではプロパティの設定が変わるってのはありがちな話だけど、まさかメソッドに日本語いれなあかんとは盲点だったので、メモ。

ただ、そもそもExcel 2010だとこの方法使えないので、どーすっかなー。。。

2011年12月26日月曜日

ASUSのZenBook(Ultorabook)買うたった

秋葉原のソフマップでASUSのZenBook (Ultrabookとか呼ばれてるらしい) を購入。
http://zenbook.asus.com/jp/
CPUとかメモリとかが劇的に増えてるわけじゃないけど、SSDのおかげか、マシンの起動とか、LibreOfficeの起動とか、めっちゃ速なっとる。何かこの速さをいかした使い方をしてみたいと思いつつ思いつかないけど。

2011年12月12日月曜日

OOo(libreOffice) BasicでEval

ExelのVBAでは、文字列で渡された計算式を実行するためのApplication.Evaluate()ってメソッドがあるけど、OOo(LibreOffice)では見当たらなかったので。
ググると、以下のような投稿を発見。
http://www.oooforum.org/forum/viewtopic.phtml?t=58809

これの一番最後に答えが書いてあって、ようはJavaScriptのEvalを使って計算を行うマクロを作っておいて、それをOOo Basicから呼び出すというコード。まず、以下のようなJavaScriptの一行マクロをドキュメントのLibrary1のEvalCell.jsとして作成。

dResult = eval(String(ARGUMENTS[0]));

んで、そのあと以下のようなOOo Basicのコードで呼び出す、って感じ。

Function Eval(s as String) as Double
  oDocScriptProvider = ThisComponent.getScriptProvider()
  oScript = oDocScriptProvider.getScript("vnd.sun.star.script:Library1.EvalCell.js?language=JavaScript&location=document")

  On Error Resume Next
  Eval = oScript.Invoke(Array(s), Array(1), Array(dResult))
  On Error Goto 0
End Function

2011年11月24日木曜日

Calc(OOo, LibreOffice)のSylkファイル

に関してどーなってんの?と聞かれたのでちょいソースを見てみた。
http://svn.services.openoffice.org/opengrok/xref/Current%20(trunk)/sc/source/ui/docshell/impex.cxx
http://cgit.freedesktop.org/libreoffice/calc/tree/sc/source/ui/docshell/impex.cxx

この中のScImportExport::Doc2SylkとScImportExport::Sylk2Docってのが実体みたい。
中身は割と朴訥な感じで、セルの内容にXとかYとかくっつけてテキストに吐き出したり、逆にテキストファイルの中身を総なめしてXとかYとか出てきたらそこのセルにテキストを展開したり、ってことをやってるみたい。
Excelが出してくるやつより、かなりシンプルになるんじゃなかろうか、と思って実際出来たSylkファイルを比べてみると、やっぱりかなり違います。

もし昔のアプリケーションとかで、Exelが出すSylkファイルを取り込んで云々するものがあれば、OOo(LibreOffice)で作ったSylkファイルだとトラブルでるかも。

2011年11月1日火曜日

中国語MS OfficeでVBA

中国語MS OfficeでVBAマクロを作成し、それを日本語MS Officeで読み込むと文字化けします。(多分逆もそうなんじゃないか。)
内部的にはどっちもUnicodeを使ってるはずなので、UnicodeをUnicodeのまま素直に表示してくれるだけで良いはずなのに、どうも何か無駄な変換がかかってるようです。やっぱ過去のしがらみとかが関係してるのかな。

ちなみに同じ中国語ファイルをLibreOfficeで読み込むと、当たり前ですが、ちゃんと難しい漢字が(フォントが入ってれば)出ます。

VBAでテキスト出力(中国語)

VBAでテキスト出力する際に、素直に、Open hogehoge For Output As #i とかやるけど、中国語が混じってきたときに問題が発生したので、メモ。


そもそも、Windowsも、MS Officeも、その中のVBAも、全部Unicodeで処理されてるっぽいので、ファイル名だの、ファイルの中だのに中国語が入っていても問題ないけど、VBAからテキスト出力するときだけは、過去との互換性のためか、勝手にShift_JISに変換されちゃいます。
んでそこに中国語が入ってきたときに、あれやこれや問題が発生します。文字化けしたり、書き込みエラーになったり。
(多分OOoとかLibreでも似たような問題発生するんじゃなかろうか。。。)


対応策としてまず考えたのは、バイナリモードでUnicodeをそのまま出力することですが、割と修正箇所が多くて、文字列をバイト配列に変換したり挿入箇所を指定したり改行コード挿し込んだりが、めんどっちかったので、とりあえず文字列をURLエンコードして凌ぐことに。CreateObject("ScriptControl")とかしてJavaScriptの変換関数を呼び出すと簡単にできます。(MS Office 2010とか64bit版とかだと使えないって噂がありますが)


出力されたテキストを読むときはURLデコードする必要がありますが、コード修正の手間とのトレードオフってことで。

2011年10月17日月曜日

LibreOfficeオンライン版?

LibreOfficeオンライン版とか聞くと、普通は、Google Docsとか、LotusLive Symphonyとか、Microsoft Office Web Apps(Office365?)とか、そういう純粋なWebアプリを連想しますが、LibreOfficeオンライン版は違う模様。
どーもGTKとHTML5の合わせ技で画面イメージをブラウザに飛ばしてるだけっぽいです。(GIMPとか他のアプリでも同様に画面を飛ばせるっぽい)
シンクライアントの一方式としては、アリだとは思いますが、LibreOfficeオンライン版ドヤッて出すんじゃなくて、LibreOfficeでもHTML5に出力できましたよ、くらいの抑えた発表はできなかったのだろうか。なんか素人さんを騙してるみたいな感じを受けました。

2011年10月5日水曜日

LotusLive Symphony

というIBM製のGoogle Docs(?)が試せるらしいということで、LotusLiveの試用アカウントを作ってみた。(パスワードの長さ制限とかルールが若干うざくて、試用アカウントの登録にちょっとすったもんだした)
んで、さっそくログインするも、初期画面(マイ・ダッシュボード)からどうやったら試せるのかわからずに、あれこれしてると、LotusLive Labsの中にあるのを発見。
Windows上のFirefoxとUbuntu上のChromeで試したけど、ドキュメントの編集画面に入る前まではちゃんと日本語化されてるし、ドキュメントの編集画面は普通にAjaxでぐりぐり動作しとる。アップロードしたods内のグラフが表示されてなかったり、ダウンロードしたodsが壊れてたりしたけど、実験中のサービスでここまで動いてるなら、まぁいいのかなーという感じ。

2011年9月28日水曜日

COUNTIF関数

10万行くらいのテキストデータ(しかも個々のテキストが結構長い)の重複をカウントしたくて、DBでGROUP BYとか組み合わせたやけに長いSQLを組んでもみてもよかったけど、表計算アプリ上でさくっとできないかな、と思って、OOoとLibreOfficeとExcelでCOUNTIF関数を使ってみた。結果的にどれもうまくいかず、かえって時間がかかるはめに。

結果が返ってくるまで2, 30分とか待たされたり、うまく重複がカウントできていない行があったり。(OOoとLibreOfficeが似たような挙動になるのはわかるけど、何故かExcelまで似たような挙動)

んで、しゃーないから、目的の列でソートしたあと、一個上と比較してカウントしたりする数式を作ってしのいだ。統計的なデータだけならLibreOfficeのピボットテーブルが使いやすいんだけど(しかも10万行とかあってもサクッと処理できてちょっとうれしい)、素の表に重複数のカラムを追加するのが目的だったので。メモ。