メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2009年1月2日金曜日

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(13) Spreadsheet

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Spreadsheet
を読む。

Spreadsheet
Spreadsheetっつーのは、インタフェースがくっついたcell rangeだよ。
com.sun.star.sheet.Spreadsheetサービスであらわされるよ。

Properties of Spreadsheet
spreadsheetのプロパティは自身のvisibilityとかpage styleとかを扱うよ。

プロパティ名説明
IsVisible真偽値 - GUIで見えるかどうか決めちゃう
PageStylepage styleの名前を含む



Naming
com.sun.star.container.XNamedインタフェースでスプレッドシートの名前をつけたり変えたりするらしいよ。 spreadsheetコレクションからspreadsheetを取り出したりするときなんかに使うよ。


Inserting Cells, Moving and Copying Cell Ranges
Spreadsheetサービスのcom.sun.star.sheet.XCellRangeMovementインタフェースは
cellの挿入やspreadsheetからcellの削除をサポートするよ。
cellの内容のコピーや移動もサポートするよ。
cellがコピー、移動されたとき、全式の関連するリファレンスは自動的に更新されるよ。

com.sun.star.sheet.XCellRangeMovementには以下のようなメソッドがあるよ。

  1. insertCells()

  2. removeRange()

  3. copyRange()

  4. moveRange()


詳しくはWikiへ。

Page Breaks
とりあえず必要なさそうなので、パス。




.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(12) Capabilities of Columns and Rows

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Capabilities_of_Columns_and_Rows
を読む。


Capabilities of Columns and Rows
すべてのCell Rangeは列と行からなる。だもんで、列と行のコンテナはスプレッドシートからとれるよ。
スプレッドシートのsub-rangeからも、com.sun.star.table.XColumnRowRangeを使ってとれるよ。

で、列とか行とかのコンテナっつーのは、com.sun.star.table.TableColumnsとcom.sun.star.table.TableRowsだよ。

列、行のコンテナは両方ともindexやenumによるアクセスをサポートしてるよ。
TableColumnというのだけ、SheetCellRangeの単一の列、行へ名前によってアクセスすることを
サポートしてるかもよ。


テーブルの行、列サービスは、テーブルの構造、cell rangeのグリッドサイズなるものをコントロールするよ。

列とか行とかのコンテナはinsertとかremoveとかのメソッドを持ってるよ。インタフェースはcom.sun.star.table.XTableRowsとcom.sun.star.table.XTableColumnsね。

TableColumnとTableRowサービスは列の幅とか行の高さとかを調節するためのプロパティやvisibleしたり、page breakしたりするためのプロパティなんぞを持ってたりするかもよ。



.

2009年1月1日木曜日

[その他] ヒッピーテスト

そういえば、Geekテストのサイトに、ヒッピーテストなるものもおいてあるんで、
やってみた。

そしたら、あなたはひっぴーではありません、とのこと。
そして、ブッシュ大統領の満面の笑みの画像が・・。

確かに反体制主義でもなければ、自然賛美主義でもないので、
ヒッピーではないのですが、、

なぜか非常に腹立たしい。


.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(11) Capabilities of SheetCellRanges Container

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Capabilities_of_SheetCellRanges_Container
を読む。

Capabilities of SheetCellRanges Container
SheetCellRangeのコンテナは、いくらかのCell Rangeを一括で扱わなければならないような
ところで使われるらしい。

SheetCellRangeサービスはセル、段落、文字プロパティサービスを含み、
queryオプションを提供する。

com.sun.star.sheet.SheetCellRangeのインタフェースは
SheetCellRangeコンテナにアクセスするための要素であるそうで。

SheetCellRangeコンテナは以下の能力がある。
キャラクタ、段落、セルのプロパティサービスを使って整形できる。
com.sun.star.container.XIndexAccess、com.sun.star.container.XNameAccess、com.sun.star.container.XEnumerationAccessへアクセスすることによってCell Rangeの独立をもたらす?
com.sun.star.container.XNameContainerで、名前によってrangeへアクセス、置き換え、追加、削除ができる。
SheetCellRangeに、Index指定によって、新しいrangeを追加でき、またrange中のcellを取得できる。
com.sun.star.container.XEnumerationAccessを使うことでrangeを列挙できる?
式のセルとか空のセルとかみたいな、あるCellの内容のRangeを問い合わせることができる?



.

[その他] いっちゃった年、きちゃった年

あけましておめでとうございます。
本年もよろしくお願いいたします。

さて、2008年総括を書こうと思っていたのですが、気づいたら年越してました。

2008年総括
2008年は個人的にも会社的にも、とても不思議で、そして楽しかった年でした。
会社面、個人面でそれぞれ振り返りたく思います。

会社面
会社面では、


  1. 会社が思いっきり傾いた

  2. 新規顧客獲得できた


の2点。

会社が傾いた
お得意様がくしゃみしまして、私の会社も89.9度ほど傾きました。
実はかなりヤバかったです。
世界的な金融危機に関係があるかどうかはわかりませんが、
日経平均の下落率とほぼ似た感じで売上が減りました。

新規顧客獲得
反面、いろいろな方のおかげで、新しくお客様を獲得できた(営業一切せずに)のは
うれしい誤算です。これにはとにかく感謝でした。

世の中にたくさんの会社がある中で私の会社を選んでくれた方を裏切らないためにも、
日々勉強していこうと、より強く思った年でした。


個人面
個人面では、


  1. mod_chxj

  2. 20年ぶりの病院

  3. 読書

  4. Apache コードリーディングを忘れた


といったところでしょうか。

mod_chxj
個人面ではやはり、なんといっても、mod_chxjでしょう。
実は去年初めにbaysideさんの日記を拝見したのが活動を再開したきっかけです。
OS関連に興味があったので、たまにmonaつながりで拝見していました。

最初に見たときは、かなり焦りました。あわててローカルのgitリポジトリを整理
(gitの練習も兼ねてリポジトリをたくさん作っていましたので)して、sourceforge.jp
の方へコミットしたのが、再開した活動の最初の作業でした。

いろいろ調べたのですが、若干騒ぎになったきっかけは、
perlのtokuhiromさんという方の「それXXXXでできるよ」発言だったのではないかと推測してます。
そんなBIGな方々に一言でも取り上げられてもらえるなんて、今でも信じられない感じです。



20年ぶりの病院
去年の中ごろ体調を崩し、20年ぶりに病院なるところへ行きました。
腎盂炎という病気らしく、ほっとくと水神病(漢字が違うかも)という病気に発展し、
腎不全に陥ることもある病気です。
常日頃、昼夜は逆転するし、食生活はめちゃくちゃなので、
他にもいろいろと問題があるだろうと思っていたのですが、
意外にも検査結果は、腎臓以外は好調だったのは驚きでした。


読書
去年も読書は良くしたと思います。
速読とははできませんが、普通の速度で主に通勤電車で読んでいます。
技術系以外はどのような本を読んだかは恥ずかしいので秘密です。
各分野で「原書」といわれるような本を読みました。
技術系では、読みたい本でまだ読んでいない本が積読中ですので、
今年は読み切りたく思います。


Apacheコードリーディング
去年はじめ、Apacheコードリーディングをやろうと心に決めたのですが、
今の今まで忘れてました。少しづつでいいからまた、再開したいと思います。




2009年度野望
さて、今年の野望も書いてみようかと思います。

会社面
経営計画通り適当にいきます。
そのほか、いろいろと思うことはありますが、まとまっていません。

個人面
個人面ではいろいろとあります。
  1. イベントに参加
  2. 読書
  3. mod_chxj
  4. その他
  5. 本ブログ

といったところでしょうか。

イベントに参加
毎年思っているのですが、オープンソースなイベントに参加したことが無いので、今年こそは参加してみたいです。
何が行われているんでしょう・・。

読書
これは特に挙げなくてもよいのですが、一応。
技術系では本ブログに書いたタイトルぐらいは読み切りたいです。


mod_chxj
iPhoneやらAndroidの登場やらで今後どうなるかわかりませんが、
一人でも使用してくれる方がいらっしゃるのであれば続けようと
決心しました。
とりあえず、

  1. XHTMLに完全に対応すること、

  2. CSS対応

  3. POST/GETの絵文字変換をリリースに含めること

  4. PCでも絵文字表示


ぐらいは付けたい機能です。
CSS対応、XHTML対応は去年はじめにリクエストとしていただいた機能なのですが
未だにリリースできずです。。

mod_chxjに関しては別途いろいろと書きたいことがあるので、
機会があれば書いてみたいと思います。


その他
最近、あほになってきているので、勉強します。
どのぐらいあほかというと、たとえば本ブログ。
全然ロジカルではありません。拡散思考ならぬ霧散思考ですので、
ぜひとも少しづつ修正できたらと思います。


本ブログ
去年と同様に、誰にも役立たないと思いますが、
とにかく何かしらOutputしていこうと思います。



最後に、
去年はたくさんの方々に仕事面でも個人面でも直接、間接かかわらず、
アドバイス、リクエスト、フィードバック等をいただきとてもとても感謝しています。
今年も足掻いていきますので、皆様、ぜひともよろしくお願いします。



.

2008年12月31日水曜日

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(10) Capabilities of SheetCell

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Capabilities_of_SheetCell
を読む。

Capabilities of SheetCell
SheetCellというのはOpenOffice.orgにおけるテーブルの基本パーツ。

SheetCellには以下の能力があるそうな。


  1. セルの内容にアクセスできる。

  2. インタフェースであるcom.sun.star.table.XCellはcellにおける式、値を操作できる。

  3. SheetCellはSheetCellRangeの特別なケース。

  4. 一意なセルへのアドレスを提供可能。(com.sun.star.table.CellAddress)

  5. 一時的にロック可能(com.sun.star.document.XActionLockable)


な感じか。





.

2008年12月30日火曜日

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(9) Capabilities of SheetCellRange

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Capabilities_of_SheetCellRange
を読む。

SheetCellRangeの能力
SheetCellRangeは矩形領域をあらわす。

SheetCellRangeは以下の能力がある。
com.sun.star.sheet.XSheetCellRangeで、cell、sub-rangeなcellを提供する。
com.sun.star.table.XColumnRowRangeで、列、行を提供する。
com.sun.star.sheet.XSheetOperationで、計算を提供する。
com.sun.star.table.XAutoFormattableやらcom.sun.star.util.XIndentやらcom.sun.star.sheet.XCellFormatRangesSupplierやらcom.sun.star.sheet.XUniqueCellFormatRangesSupplierやらでフォーマットを提供する。
com.sun.star.sheet.XCellRangeDataでcellやcell-rangeのデータを扱える。
一連のデータをcellやcell-rangeに埋めるにはcom.sun.star.sheet.XCellSeriesを使う。
データベースからのデータのインポートにはcom.sun.star.util.XImportableを使う。
Cellの値を検索したり置き換えたりするのに、com.sun.star.util.XSearchableを使う。
Cellをクエリーするにはcom.sun.star.sheet.XCellRangesQueryを使う。
1つのCellに複数のCellをマージするにはcom.sun.star.util.XMergeableを使う。
ソートしたりフィルターしたりすにはcom.sun.star.util.XSortable,、com.sun.star.sheet.XSheetFilterable,
com.sun.star.sheet.XSheetFilterableEx、などを使う。
セルの一意なアドレスを取得したりするには、com.sun.star.sheet.XCellRangeAddressable:getRangeAddressを使う。これはcom.sun.star.table.CellRangeAddressというstructを返す。
com.sun.star.chart.XChartDataArrayをサポートしているのでSheetCellRangeに基づくチャートを作成できる。


って感じ?
.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(8) Capabilities of Spreadsheet

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Capabilities_of_Spreadsheet
を読む。

スプレッドシートの能力
スプレッドシートはcom.sun.star.sheet.SheetCellRangeを含んだcom.sun.star.sheet.Spreadsheetサービスである。

で、スプレッドシートは、com.sun.star.container.XNamedを使うことで名前によるアクセスが可能。
com.sun.star.sheet.XCellRangeMovementを使うことでcellは挿入可能で、全てのcellは削除可能、移動、コピーも可能。
印刷関連はcom.sun.star.sheet.XPrintAreasやcom.sun.star.sheet.XSheetPageBreakを使えばよいらしい。
チャートも扱えるよ。
com.sun.star.util.XProtectableというのを使えば永久に変更から守ることもできるよ?

.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(7) Spreadsheet Services - Overview

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Spreadsheet_Services_-_Overview
を読む。

スプレッドシートサービス概観
スレッドシートサービスを構成する主要素

  1. com.sun.star.sheet.Spreadsheet
  2. com.sun.star.sheet.SheetCellRange
  3. com.sun.star.sheet.SheetCell
  4. com.sun.star.sheet.SheetCellRanges
  5. com.sun.star.table.TableColumn
  6. com.sun.star.table.TableRow

だそうで。

.



.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(6) Working with Spreadsheet Documents

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Working_With_Spreadsheet_Documents
を読む。

Spreadsheet Document
スプレッドシートドキュメントはcom.sun.star.sheet.SpreadsheetDocumentで表現される。

SpreadsheetDocumentは少なくとも1つの要素を持つSpreadsheetオブジェクトのコレクションからなる。
com.sun.star.sheet.XSpreadsheetDocumentのgetSheets()メソッドを呼べば、
com.sun.star.sheet.XSpreadsheetsを取得できる。

getSheets()メソッドでXSpreadsheetsを取得すれば、3つの異なる方法でシートにアクセスすることを可能にする。

  1. インデックスによる方法
  2. Enumによる方法
  3. 名前による方法

の3つ。


インデックスによる方法
com.sun.star.container.XIndexAccessというインタフェースが提供されているので、
このインタフェースを使用し、シートにアクセスする。

public com.sun.star.sheet.XSpreadsheet getSpreadsheet(
com.sun.star.sheet.XSpreadsheetDocument xDocument, int nIndex) {

// Collection of sheets
com.sun.star.sheet.XSpreadsheets xSheets = xDocument.getSheets();
com.sun.star.sheet.XSpreadsheet xSheet = null;

try {
com.sun.star.container.XIndexAccess xSheetsIA = (com.sun.star.container.XIndexAccess)
UnoRuntime.queryInterface(com.sun.star.container.XIndexAccess.class, xSheets);
xSheet = (com.sun.star.sheet.XSpreadsheet) xSheetsIA.getByIndex(nIndex);
} catch (Exception ex) {
}

return xSheet;
}
 


Enumによる方法
com.sun.star.sheet.SpreadsheetsEnumerationというサービスが提供されているので、
このサービスを使用してシートにアクセスする。

名前による方法
com.sun.star.container.XNameContainerを派生してcom.sun.star.sheet.XSpreadsheetsが提供されているので、XNameContainerのメソッドを使用して、名前による指定でシートにアクセスする。

public com.sun.star.sheet.XSpreadsheet getSpreadsheet(
com.sun.star.sheet.XSpreadsheetDocument xDocument,
String aName) {

// Collection of sheets
com.sun.star.sheet.XSpreadsheets xSheets = xDocument.getSheets();
com.sun.star.sheet.XSpreadsheet xSheet = null;

try {
com.sun.star.container.XNameAccess xSheetsNA = (com.sun.star.container.XNameAccess)
UnoRuntime.queryInterface(com.sun.star.container.XNameAccess.class, xSheets);
xSheet = (com.sun.star.sheet.XSpreadsheet) xSheetsNA.getByName(aName);
} catch (Exception ex) {
}

return xSheet;
}
 



さらに、XSpreadsheetには以下のようなメソッドも存在する。
  1. insertNewByName() - 新しい空のシートを指定した名前で指定した位置に追加する。
  2. moveByName() - シートを指定した名前で指定した位置に移動する。
  3. copyByName() - コピーする。




.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(5) スプレッドシートの保存

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Saving_Spreadsheet_Documents
を読む。


Saving Spreadsheet Documents
ドキュメントは、com.sun.star.frame.XStorableというインタフェースを通して保存することができる。

XStorable.storeAsURL()は、「名前をつけて保存」と似た感じ。
XStorable.storeToUrl()は、現在読み込んでいるドキュメントはそのままで、指定されたURLにコピーとして保存する。


Exporting
他のフォーマットで保存する場合、プロパティFilterNameを指定する。
FilterNameにはフォーマットの名前を指定する。
指定できるフォーマットの名前は、


<OfficePath>/share/config/registry/instance/org/openoffice/Office/TypeDetection.xml
 

に記述されているらしい。
Debian-Etchだと、

/usr/lib/openoffice/share/registry/res/en-US/org/openoffice/TypeDetection/Filter.xcu
 

あたりかな??
MS Excel 2003 XMLで出力したかったら、

XStorable xStorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, xDoc);
PropertyValue[] storeProps = new PropertyValue[1];
storeProps[0] = new PropertyValue();
storeProps[0].Name = "FilterName";
storeProps[0].Value = "MS Excel 2003 XML";
xStorable.storeAsURL(storeUrl, storeProps);
 

などと指定すればよいっぽい。



.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(4) ファイル操作

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Handling_Spreadsheet_Documents_Files
を読む。

Handling Spreadsheet Document Files


Creating and Loading Spreadsheet Documents
loadComponentFromURL()とかで使用するURLには、

  1. file:
  2. http:
  3. ftp:
  4. private:
が使えるらしい。

private:
"factory"を従えて、"private:factory/scalc"と指定できる。
新しいScalcシートを作成する場合にはこれを指定する。

ファイルをロードする場合には、
Windowsなどの場合は、
"file:///c:/MyCalcDocument.ods"
Linuxなどの場合は、
"file:///tmp/MyCalcDocument.ods"
などと指定する。

ロード時に指定できるプロパティはcom.sun.star.document.MediaDescriptorに定義されている。

たとえば、MediaDescriptor.AsTemplateをtrueに指定してロードしたい場合は、
PropertyValue[] loadProps = new PropertyValue[1];
loadProps[0] = new PropertyValue();
loadProps[0].Name = "AsTemplate";
loadProps[0].Value = new Boolean(true);
などとやって、このloadPropsをloadComponentFromURL()に渡してあげればよい。


.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(3) セルをいじってみる

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Example:_Editing_Spreadsheet_Cells
を読む。


XSpreadsheetはcom.sun.star.table.XCellRangeから派生したもの。
なので、
XCellRangeの

  1. getCellByPosition
  2. getCellRangeByPosition
  3. getCellRangeByName
というメソッドを使うことができる。

getCellByPosition
指定された範囲中の1つのcellを返す。

getCellRangeByPosition
指定された範囲中のcellのサブレンジなるものを返す。

getCellRangeByName
指定された範囲中のcellのサブレンジなるものを返す。


だもんで、XSpreadsheet.getCellByPosition(0,0)とやるとExcelで言うところのA1のCellを返す。

getCellByPosition()で返されたCellに対して値をセットしてやると、そのCellの値を書き換えることができる。らしい。


try {
/* シートコレクションにinsert */
xSheets.insertNewByName("うんこ", (short)0);
/* シートコレクションから追加したシートを取り出してみる */
xsheet = (XSpreadsheet)xSheets.getByName("うんこ");
xsheet.getCellByPosition(0,0).setValue(1234);
} catch (Exception ex) {
ex.printStackTrace();
}



さっきのsheet追加のコードにgetCellByPosition().setValue()を加えてみた。
setValueは数値しか渡せない。

文字列をセットしたければ、xsheet.getCellByPosition()で返されるXCellオブジェクトから
queryして、com.sun.star.text.XTextを取り出す必要がある。

コードで書くと、

com.sun.star.table.XCell xCell = xsheet.getCellByPosition(0,0);
com.sun.star.text.XText xCellText = (com.sun.star.text.XText)
UnoRuntime.queryInterface(com.sun.star.text.XText.class, xCell);
com.sun.star.text.XTextCursor xTextCursor = xCellText.createTextCursor();
xCellText.insertString(xTextCursor, "テキストだよー", false);

 

こんな感じ。

.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(2) 新しいシートを追加してみる

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Example:_Adding_a_New_Spreadsheet
を読む。

Example: Adding a New Spreadsheet
やりたいことはSpreadsheetにシートを追加するだけ。
で、その手順は、

  1. com.sun.star.comp.helper.Bootstrap.bootstrap()を使って、リモートのXComponentContextを取得する。
  2. XComponentContext.createInstanceWithContext()を使ってDesktopを取得する。
  3. queryして、DesktopからXComponentLoaderを取り出す
  4. "private:factory/scalc"というURLを指定してscalcのコンポーネントをロード。
  5. queryして、上記で取得したObjectからXSpreadsheetDocumentを取り出す。
  6. XSpreadsheetDocumentからシートのコレクションを取得する。
  7. シートのコレクションに対してinsertNewByName()をコールする。


とやれば新しいシートを追加できるらしい。

で、やってみたソース。

import com.sun.star.beans.PropertyValue;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.uno.RuntimeException;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;

public class NewSpreadsheet {
public static void main(String[] args) {
try {
/* リモートコンテキストの取得 */
XComponentContext xContext = Bootstrap.bootstrap();

/* リモートサービスマネージャを取得 */
XMultiComponentFactory xServiceManager = xContext.getServiceManager();

/* リモートデスクトップUNOサービスのインスタンスを取得 */
Object desktop = xServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", xContext );

/* queryしてXComponentLoaderを取り出す */
XComponentLoader xComponentLoader =
(XComponentLoader)UnoRuntime.queryInterface(XComponentLoader.class, desktop );

/* スプレッドシートドキュメントのロード */
/* 全てDocumentというもので扱う */
String loadURL = "private:factory/scalc";
PropertyValue[] loadProps = new PropertyValue[0];
XComponent xComp = xComponentLoader.loadComponentFromURL(loadURL, "_blank", 0, loadProps);
XSpreadsheetDocument doc = (XSpreadsheetDocument)UnoRuntime.queryInterface(
com.sun.star.sheet.XSpreadsheetDocument.class, xComp);
/* シートコレクションの取得 */
XSpreadsheets xSheets = doc.getSheets();
XSpreadsheet xsheet = null;
try {
/* シートコレクションにinsert */
xSheets.insertNewByName("うんこ", (short)0);
/* シートコレクションから追加したシートを取り出してみる */
xsheet = (XSpreadsheet)xSheets.getByName("うんこ");
} catch (Exception ex) {
ex.printStackTrace();
}
}
catch (java.lang.Exception e){
e.printStackTrace();
}
finally {
System.exit(0);
}
}
}
 


ほっほー。

・・・保存しないとシートが追加されたかわからん。
.

[work][OpenOffice][SDK][java]Spreadsheet Documents読み中(1)

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Spreadsheet_Documents
を読む。

OpenOffice.orgが扱うtableは3つある。

  1. text table
  2. database table
  3. spreadsheet
だそうで。

text tableはtextコンテンツを扱う。
database tableはデータベースの機能を、
spreadsheetはcellを扱う。

これらの基本的仕様はcom.sun.star.tableで定義される。

で、spreadsheetはcom.sun.star.sheetで定義される。

spreadsheetドキュメントモデルは5つの構造上主要な領域をもつ。
  1. Spreadsheets Container
  2. Service Manager (document internal)
  3. DrawPages
  4. Content Properties
  5. Objects for Styling
の5つらしい。
Spreadsheets ContainerっつーのはSpreadsheetのコア部分をで、
ServiceManagerっつーのは、shape objectsとかtext fieldとかform controlsをSpreadsheetに加えたりする部分。
DrawPageっつーのは、sheetの上に、ページ描画のために設置するもの???
Content Propertiesっつーのは、各名づけられたコンテンツにアクセスできるもの。
Objects for Stylingっつーのはシートのスタイルやフォーマットを扱う??

.



.

[work][OpenOffice][SDK][java] Writing UNO Components読み中(2)

とりあえず、今のところ必要ないので、とばし。

.

[work][OpenOffice][SDK][java] Writing UNO Components読み中(1) Writing UNO Components

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/WritingUNO/Writing_UNO_Components
を読む。


Writing UNO Components
UNOコンポーネントによってOpenOffice.orgを拡張できる。と。
UNOコンポーネントはUNOによって提供される機能によってOpenOffice.orgの機能にアクセスできまっす。


OpenOffice.orgは多くの拡張のためのエントリーポイントを提供する。

  1. JavaやC++で書かれた任意のオブジェクトはユーザインタフェースから呼ぶことができる。
  2. Calcアドインは、新しい式を作るのに使える
  3. Chartアドインは新しいChartタイプを挿入することができる。
  4. 新しいデータベースドライバはデータアクセスを拡張するためにOpenOffice.orgに追加できる。
  5. 全てのモジュールは取替え可能
  6. 新しいドキュメントタイプをOpenOffice.orgに作ることも追加することも可能。
  7. 開発者は新しいフォーマット作成するのにコンポーネントを通して、OpenOffice.orgのXMLファイルにアクセスすることができる。

で、OpenOffice.org1.1.0から包括的に拡張をサポートしているらしい。

ふーん。
.

2008年12月29日月曜日

[work][OpenOffice][SDK][java] Professional UNO読み中(21) Opening a Connection

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Opening_a_Connection
を読む。

Opening a Connection
前の章で使用したUnoUrlResolver()の下の層は完全な柔軟性を提供する。
UNOにおけるプロセス間通信の接続の確立は、com.sun.star.connection.XConnectionの上に
成り立つ。
XConnectionは双方向通信をカプセル化する。

で、ここには異なるプロセス間通信の仕組みがあるらしい。
仕組みのほとんどは、




ひとつのプロセスがListenし、別のプロセスがそこにアクセスするまで待つ、
 

といった似たパターンに従う。

で、このパターンは、



  1. com.sun.star.connection.Accept


  2. com.sun.star.connection.Connector


のサービスに抽象化されている。

それぞれ、 com.sun.star.connection.XAcceptor、com.sun.star.connection.XConnector
というインタフェースとしてexportされている?


で、そのインタフェース定義。


interface XAcceptor: com::sun::star::uno::XInterface
{
XConnection accept( [in] string sConnectionDescription )
raises( AlreadyAcceptingException,
ConnectionSetupException,
com::sun::star::lang::IllegalArgumentException);

void stopAccepting();
};

interface XConnector: com::sun::star::uno::XInterface
{
XConnection connect( [in] string sConnectionDescription )
raises( NoConnectException,ConnectionSetupException );
};
 


acceptメソッドとconnectメソッドはパラメータに接続文字列を受け取る。
ここで指定する接続文字列は、UNO-URL中の接続文字列部分。
先の"uno:socket,host=localhost,port=2002;urp,Negotiate=0,ForceSynchronous=0;StarOffice.ServiceManager"のうちのunoから;urpまでの文字列。つまり
"uno:socket,host=localhost,port=2002;urp,Negotiate=0,ForceSynchronous=0"
まで。

で、コネクションタイプ部分でDefaultで指定できるものは以下のとおり。

  1. socket

  2. pipe



socketコネクションタイプ
ソケット接続。
指定できるパラメータは以下のとおり。
パラメータ名意味
hostListenまたは接続先のホスト名もしくはIP
portTCP/IPにおけるポート番号
tcpNoDelayソケットオプションのno delay。UNOでは1に設定されるべき。



pipeコネクションタイプ
名前付きパイプによる接続。
指定できるパラメータは以下のとおり。
パラメータ名意味
name名前付きパイプの名前



ConnectorとAcceptorを自分で実装すればコネクションタイプを追加することができる。

どうも、

com.sun.star.connection.Connector.AAA
 

などというコネクターを定義し、実装すると、
UNO-URLは、"uno:AAA;urp"なんてな風に書けるらしい。



.

[work][OpenOffice][SDK][java] Professional UNO読み中(20) Characteristics of the Interprocess Bridge

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Characteristics_of_the_Interprocess_Bridge
を読む。



プロセス間ブリッジの特性。

プロセス間ブリッジはスレッドセーフ。

同期呼び出しと非同期呼び出しがあって、
同期呼び出しは何かしらの応答があるまで待つ。

非同期呼び出しはすぐさま呼び出し元に戻る。

非同期か同期かはIDLに指定される。
IDL中に[oneway]フラグが付いているメソッドは非同期メソッド。


リモートブリッジが非同期に対応していても、デフォルトでは非同期は使えない。
その場合にはすべて同期モードで動作する。

非同期機能を有効にするには、サーバ側、クライアント側の双方の
接続文字列(UNO-URL)のプロトコルタイプのところに以下のパラメータ
を加えなければならない。


Negotiate=0,ForceSynchronous=0
 


まず、サーバ側を有効にする。

$ soffice '-accept=socket,host=0,port=2002;urp,Negotiate=0,ForceSynchronous=0;'
 


次に上記で立ち上げたサーバに接続するクライアント側を有効にする。

"uno:socket,host=localhost,port=2002;urp,Negotiate=0,ForceSynchronous=0;StarOffice.ServiceManager"
 

を接続する際のUNO-URLとして渡してあげる。

な感じ。

.

2008年12月28日日曜日

[work][OpenOffice][SDK][java] Professional UNO読み中(19) Importing a UNO Object

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Importing_a_UNO_Object
を読む。

Importing a UNO Object
もっとも共通のプロセス間通信の使用ケースはexporting serverからUNOオブジェクトの参照をimportすること。
マニュアルのサンプルでは、ComponentContextへの参照を取得している。

で、この参照の正しい方法は、、、


com.sun.star.bridge.UnoUrlResolver
 

というサービスを使う方法。
com.sun.star.bridge.UnoUrlResolverのインタフェースはcom.sun.star.bridge.XUnoUrlResolverに定義されている。

interface XUnoUrlResolver: com::sun::star::uno::XInterface
{
/** resolves an object on the UNO URL */
com::sun::star::uno::XInterface resolve( [in] string sUnoUrl )
raises (com::sun::star::connection::NoConnectException,
com::sun::star::connection::ConnectionSetupException,
com::sun::star::lang::IllegalArgumentException);
};
 

こんな感じで。

で、このresolvメソッドに渡される引数の文字列はUNO URLと呼ばれる文字列を指定する。

UNO-URLのフォーマットは以下のとおり。

Scheme:コネクションタイプ,パラメータ;プロトコルタイプ,パラメータ;Exportされているオブジェクト名
 

Schemeのところには"uno"を指定する。

コネクションタイプのところにはコネクションタイプを指定する(socketとか)
パラメータをつける場合には","(カンマ)で区切り、"="で名前と値のペアを記述できる。

socket,host=localhost,port=1234
 

などと指定できる。パラメータはhostとport。

プロトコルタイプのところにはプロトコルタイプを指定する。(urpとか)
パラメータをつける場合には","(カンマ)で区切り、"="で名前と値のペアで記述できる。

urp
 

などなど。

Exportされているオブジェクト名のところには

StarOffice.ServiceManager
 

などと指定できる。

で、続けて書くと、

uno:socket,host=localhost,port=1234;urp;StarOffice.ServiceManager
 

こんな感じ。これをresolve()に渡してやる。


UnoUrlResolverの制限
  1. どんな場合でもbridgeの終了を検知できない
  2. プロセス間通信の切断ができない。
  3. ローカルで初期化したオブジェクトをリモートプロセスに渡せない



おしまい。
.

[work][OpenOffice][SDK][java] Professional UNO読み中(18) OpenOffice.orgをサーバとして起動

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Starting_OpenOffice.org_in_Listening_Mode
を読む。

やっと来た。
OpenOffice.orgをサーバとして起動しておく、というところ。
正確には「Listenモードで開始」だったみたい。


Starting OpenOffice.org in Listening Mode

デフォルトではセキュリティの観点からListenモードではないとのこと。
現状2とおりの方法がある。

  1. OpenOffice.orgをパラメータをつけてListenモードで起動する方法
  2. OpenOffice.orgの設定ファイルをいじり、-acceptパラメータなしにListenモードで起動する方法

だそうです。

OpenOffice.orgをパラメータをつけてListenモードで起動する方法
以下な感じで起動する。

$ soffice '-accept=socket,host=0,port=2002;urp;'
 

セミコロンが付いているので、shellによってはクォートしないとダメ。

OpenOffice.orgの設定ファイルをいじって、-acceptパラメータなしにListenモードで起動する方法

<OfficePath>/share/registry/data/org/openoffice/Setup.xcu
 

のSetup.xcuという名のファイルをいじるらしい。

で、このファイルの中の、

<prop oor:name="ooSetupConnectionURL"/>
 

というタグを、

<prop oor:name="ooSetupConnectionURL">
<value>
socket,host=localhost,port=2002;urp;StarOffice.ServiceManager
</value>
</prop>
 

といった具合に書き換える。
もし、そういったタグが無ければ

<node oor:name="Office"/>
 

というタグのValue値として付け加えなさい、とのこと。
で、この書き換えはOpenOffice.org全体に影響する。

全体に影響するのがいやなら、ユーザ用の設定を書き換える。

<OfficePath>/user/registry/data/org/openoffice/
 

以下にuser用設定、Setup.xcuを置けばよい。


.

[work][OpenOffice][SDK][java] Professional UNO読み中(17) UNO Interprocess Connections

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/UNO_Interprocess_Connections
を読む。

UNO Interprocess Connections
異なる環境のUNOオブジェクトたちはプロセス間bridgeなるものを経由して接続する。
異なるプロセスに割り当てられているUNOオブジェクトを実行できるらしい。

で、これはメソッド名とか引数をバイトストリームなるものに変換し、
socket接続を通してリモートプロセスに送られる。

で、このドキュメントのほとんどのサンプルではOpenOffice.orgとの通信に
プロセス間bridgeを使うって。

この章では、UNO APIを使ってプロセス間connectionの作成、を扱うらしい。

.

[work][OpenOffice][SDK][java] Professional UNO読み中(16) UNO Concepts

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/UNO_Concepts
を読む。

UNO Concepts


UNOを見ていく準備ができた!って。

.

[work][OpenOffice][SDK][java] Professional UNO読み中(15)

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Understanding_the_API_Reference
を読む。

Understanding the API Reference



ふーん。
.

[work][OpenOffice][SDK][java] Professional UNO読み中(14) Singletons

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Singletons
を読む。


Singletons
「a UNO component context」中でシングルトン。

で、書き方。


module com { module sun { module star { module deployment {
singleton thePackageManagerFactory: XPackageManagerFactory;
}; }; }; };
 

と書いておけば、staticなgetThePackageManagerFactory()でインスタンスを取得できるらしい。インスタンスが無ければnewしてくれる。
問題があれば、com.sun.star.uno.DeploymentExceptionがスローされるらしい。

.

[work][OpenOffice][SDK][java] Professional UNO読み中(13) Exceptions

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Exceptions
を読む。



Exceptions
exceptionは関数の呼び出し元へエラーを知らせる型。
継承できる。
メソッドのパラメータや戻り値としては使わない。
UNO IDLでは全てのexceptionはcom.sun.star.uno.Exceptionを継承しなければならない。


// com.sun.star.uno.Exception is the base exception for all exceptions
exception Exception {
string Message;
Xinterface Context;
};

// com.sun.star.uno.RuntimeException is the base exception for serious problems
// occuring at runtime, usually programming errors or problems in the runtime
// environment
exception RuntimeException : com::sun::star::uno::Exception {
};

// com.sun.star.uno.SecurityException is a more specific RuntimeException
exception SecurityException : com::sun::star::uno::RuntimeException {
 };
 


RuntimeExceptionはいつでも生じうる。


.

[work][OpenOffice][SDK][java] Professional UNO読み中(12) Modules

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Modules
を読む。

Modules

ModuleとはC++でいうところのnamespace、Javaで言うところのpackage。
同じ名前のインタフェースとか作ってもModuleが違えば大丈夫よ。

で、com.sun.star.unoなんていうModuleを作るときはネストするんだって。


module com {
module sun {
module star {
module uno {
interface XInterface {
...
};
};
};
};
};
 

面倒くさー。


.

[work][OpenOffice][SDK][java] Professional UNO読み中(11) Sequences

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Sequences
を読む。

Sequences

シーケンスというのは同じ型のひとつの塊。


sequence< com::sun::star::uno::XInterface >
sequence< string > getNamesOfIndex( sequence< long > indexes );
 

こーんなかんじー。

.

[work][OpenOffice][SDK][java] Professional UNO読み中(10) Predefined values

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Predefined_Values
を読む。

Predefined value
#defineとかconstとかfinalみたいな感じ?

UNOでは、2つのpredefined valueをサポートしている。
1つはconstでもうひとつはenumeration。

const
constはUNOで有効な型の名前のついた値を定義する。


const short ID = 23;
const boolean ERROR = true;
const double PI = 3.1415;
 

こんな感じ。
通常constはconstantの一部として使われる。


constant
constantはconst値の名前のついたまとまり。

constants ImageAlign {
const short LEFT = 0;
const short TOP = 1;
const short RIGHT = 2;
const short BOTTOM = 3;
};
 

こんな感じー。


enum
C++のenumみたいなもの。
1つ以上のlong値を表す識別子の順序付きリスト。
普通は0から始まり、1づつ増える。
任意の識別子に値が代入されたら、その識別子は代入された値になる。
代入されていない識別子は常に前の識別子に1足された値。

// com.sun.star.uno.TypeClass
enum TypeClass {
VOID,
CHAR,
BOOLEAN,
BYTE,
SHORT,
...
};

enum Error {
SYSTEM = 10, // value 10
RUNTIME, // value 11
FATAL, // value 12
USER = 30, // value 30
SOFT // value 31
};
 

こんな感じー。

.

[work][OpenOffice][SDK][java] Professional UNO読み中(9) Structs

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Structs
を読む。

Structs
構造体のようなもの?
structの要素はstructの中で一意な名前をもつ、UNOで使える型のObject。
アクセサーを持たない。
さらに1つだけ継承できる。

で、その例。


struct EventObject
{
/** refers to the object that fired the event.
*/
com::sun::star::uno::XInterface Source;

};

// com.sun.star.beans.PropertyChangeEvent
struct PropertyChangeEvent : com::sun::star::lang::EventObject {
string PropertyName;
boolean Further;
long PropertyHandle;
any OldValue;
any NewValue;
};
 



polymorphic struct type
OpenOffice.org2.0で導入されたstruct。
ジェネリックスとかテンプレートみたいなもの?
1つ以上の型をパラメータとして受け取る。

で、その載っていた例。

// A polymorphic struct type template with two type parameters:
struct Poly {
T member1;
T member2;
U member3;
long member4;
};

// Using an instantiation of Poly as a UNO type:
interface XIfc { Poly fn(); };
 



.