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