http://turaki-tani.blogspot.com/ に移行します。
本ページは谷 列樹(たに つらき)の日記(備忘録)妄想です。
実在の団体・人物とは関係ないと思います。
拡張機能で、メニューのヘルプの中にコマンドを設置したくて、メニューカスタマイズ用のXMLを作るのに四苦八苦。
ココに仕様とかサンプルとか書いてあるけど、素直にサンプル通りにやるとヘルプの横にコマンドが出来てしまう。ヘルプの中に追加するには、MergePointのValueを「.uno:HelpMenu\.uno:About」とかにすればいけるってことを調べるのに小一時間かかったのでメモ。
の評価版をインスコして触ってみる。.NET Framework 4が勝手についてきたため、社内の標準環境(3.5)では動作しないexeが出来るハメに。プロジェクトのプロパティのコンパイルのタブの中にある、詳細コンパイルオプションをポチッと押すと.NET Frameworkのバージョンを選べる画面が出てくるので、そこで設定。
のCalcでCtrl+Cのショートカットキーを無効にするBasicコード。
oCfgMng = ThisComponent.getUIConfigurationManager()
oShortMng = oCfgMng.getShortCutManager()
aKeyEvent = CreateUnoStruct("com.sun.star.awt.KeyEvent")
aKeyEvent.KeyCode = com.sun.star.awt.Key.C
aKeyEvent.Modifiers = com.sun.star.awt.KeyModifier.MOD1
oShortMng.setKeyEvent(aKeyEvent, ".uno:Cancel")
ついでに右クリックしたときのメニューにコピーがでないようにするコード。
Sub registerContextMenuInterceptor
oDocView = ThisComponent.CurrentController
oContextMenuInterceptor = CreateUnoListener("ThisDocument_", "com.sun.star.ui.XContextMenuInterceptor")
oDocView.registerContextMenuInterceptor(oContextMenuInterceptor)
End Sub
Function ThisDocument_notifyContextMenuExecute(ContextMenuExecuteEvent As Object) As Variant
oATContainer = ContextMenuExecuteEvent.ActionTriggerContainer
'remove all menu entries:
For I = oATContainer.Count - 1 To 0 Step -1
' oATContainer.removeByIndex(I)
If InStr(oATContainer.getByIndex(I).Dbg_Properties, "CommandURL") > 0 Then
If oATContainer.getByIndex(I).CommandURL = "slot:5711" Then
oATContainer.removeByIndex(I)
End If
End If
Next I
ThisDocument_notifyContextMenuExecute = com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED
End Function
OOo3.2.1とかOOo3.3とかで作成した設定ファイル(設定ディレクトリ)をLibOで読み込んだらどうなるかってのを試してみた。今のところ特に問題なさそう。ついでにWindowsXP ←→ Windows7でも特に問題なかった。網羅的に試したわけではないので、なんか秘孔みたいな設定はあるかもしれません。(特にOS間での移行は、ファイルパスとかフォルダパスを保存してありそうなとこでなんかエラーでるかも)
突然自宅のFirefoxでニコニコ動画が再生出来なくなったので、flashプラグイン入れなおしたり、Windowsアップデートの内容確認したり、マシン再起動したりしてみたけど変わらず。関係ないだろうな、と思いつつ、試しにFirefox3→Firefox4にアップデートしたら何故か動くようになった。見た目、Chromeっぽくなって、なんか動作もシャキシャキしてて、結果的にアップデートして良かった。
山形出張で一泊。ホテルのクオリティが妙に高かったのと、朝食に味噌汁のかわりについてきた、いも煮というものがうまかったのと、タクシーの運ちゃんの方言が本気すぎて何言ってるのかよくわからんかったのと、駅弁に入ってた梅干を食ったら実はサクランボだったのが印象的。
Wordで手で検索をやる場合、検索文字列に何も入れずにオプションで段落の書式とか選んでやると、その書式が設定されている任意の文字列を検索してくれますが、それをマクロでやろうと思ってハマる。マクロ記録でとったコードとかマイクロソフトのサンプルだとかを参考に、色々条件を変えながらテストするも、全く検索にヒットしなかったり、逆に無限ループしたり。結局、ワイルドカードのオプションを有効にして、検索文字列を「<*>」にしたらなんとか動くようになった。Excelのマクロは割と分かってきたけど、Wordのマクロはまだよくわからん。ってかググると英語の情報ばっかでてくるのがOOoのマクロと一緒www
大量のファイルを処理する必要があって、今まではシェルとコマンド類の組み合わせとか、どこかから拾ってきたアプリとかで、なんとか処理してきたけど、今回はちょっと複雑な条件分岐が必要だったので、Perlでスクリプトを組んで処理したら、さくっとできて感動した。こんなことならもっと前からPerlで専用スクリプト組んどきゃよかった。
ちなみにZIPファイル操作用のモジュールで成否判定に利用する定数に「AZ_OK」とかいうのを 発見(*゜Д゜) ムホムホ
Windows ViataかWindows 7で、以下のようなマクロを実行すると、ファイルを複数選択できない模様。LibreOfficeとNovell版OpenOffice.org3.2.1で確認。(多分本家OOo3.2.1でも同じ。)
oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
oFilePicker.setMultiSelectionMode(True)
ret = oFilePicker.execute()
んで以下のように初期化コードをいれると複数選択可能になります。(ツール>オプションの設定でOpenOffice.orgのダイアログを使うにチェックを入れるだけでも良いですが、ダイアログの見た目が違っちゃうので。)
oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
oFilePicker.initialize(Array(com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE))
oFilePicker.setMultiSelectionMode(True)
ret = oFilePicker.execute()
秋葉原にいくやさんを迎撃しにいった際に、購入した(買わないとあしえさんの怪力で捻られそうな雰囲気だったので)、痛ラジコンヘリを箱から出して飛ばしてみた。
箱
箱から出したとこ
意外と操縦むずいっす。あと音と風が結構すごい。ってか軟着陸できんのこれ?修行が足りんだけなのだろうか。
要救助者(↓)が待ってるというのに。
ちなみに、ネ申にオヌヌメ(洗脳)されて買った「リトルバスターズ エクスタシー」というゲェムもちょびちょびやってます。買うときは全く意識してませんでしたが、よく箱を眺めてみると初回限定版とか書いてあって、アマゾンの中古品よりも安く買えたので、ラッキーだったらしい。(ってかこれ転売すると利益でるんじゃなかろうか)
検証用のWindows7マシンに入っていたOffice2007をOffice2010にアップグレード。(なんか元々アップグレードできる権利のついたライセンスだったらしい)
とりあえず最初に試したのは、かなり良くなったとどっかで聞いた、ODF変換機能。ちょっとうっとうしいdocファイル群を用意して、Word 2010で開いてodtに変換したあと、それをOOo Writerで確認してみるというのをやってみた。結果はいきなりOOoで変換するよりもかなり良い時と、ダメダメな時(最初からOOoで変換したほうが良い)にわかれました。具体的にどういうパターンの時に結果が分かれるのかまでは検証できてませんが。。。
ちなみにOffice2010のデフォルトのファイル形式のOpen XMLにマクロを入れようとすると、拡張子の後ろにmをつけろ、と怒られて保存できないことを初めて知りました。
ついでにスパークラインとかいう新機能を使ってみる。面白いけど必須の機能って感じじゃないなー。
盆休みに実家で、テレビの画面の右上に「アナログ」って出てるのをリアルで見せられて、切なくなったので、急遽ヤマダデンキで5万くらいの液晶テレビを購入。安くなったもんだ。(マンションにある数年前10万くらいした液晶テレビのほうが画面がちっさい)
実家からの帰りの際に、駅でおみやげに物色すると、せんとくんグッズがかなりあった。とりあえずパッケージイラストのインパクトが一番でかかった、せんとくんまんじゅうを購入。せんとくんストラップも買えばよかった。
なんかちっさいダイアログが出てくるアプリ(exe)を作ってくれと言われたので、久々にVisual Studioを起動してC#で作ってみた。(Visual hogehogeならなんでも良かったんだろうけど、とりあえずC#しかインスコしてなかったので。)GUIの操作方法がわかんなかったり、そもそもC#の文法がわかってなかったりしたけど、ググりながら適当にやったらサクッと動くものが出来た。Visual Studio便利すぎ。
Windows XPで、Proxy越しじゃないとインターネットに繋がらない環境で、Windows UpdateとかSecurity Essencialsの更新とかがうまくいかない場合、コマンドプロンプトで「proxycfg -u」とかやるとうまくいく場合がある。わすれないようにメモ。
hadoopとかそろそろ実際に試してみんといかんなーと思いつつ、自分で片手間で試すのはちょっと重い。なので、社内のメールサーバーをIMAPに移行して、データ置き場にhadoopクラスタって感じのシステムをどっかの会社にやってもらえないかなーと妄想中。(まず予算つかないといけませんが。)
出張で、久々に栃木。なんか道中の鷲宮駅で明らかに風景に馴染まないTシャツにGパンの連中が長いカメラを持って降りていきましたよ。あれが噂の聖地巡礼というやつか。
Windows機にActiveRuby1.8.7を突っ込んで、以下のようなスクリプトを動かしてみた。
require 'win32ole'
objServiceManager = WIN32OLE.new('com.sun.star.ServiceManager')
Stardesktop = objServiceManager.createInstance('com.sun.star.frame.Desktop')
dispatcher = objServiceManager.createInstance('com.sun.star.frame.DispatchHelper')
oNewdoc = Stardesktop.loadComponentfromUrl('private:factory/scalc', '_blank', 0, [])
oTestdoc = Stardesktop.loadComponentfromUrl('file:///C:/tmp/test.ods', '_blank', 0, [])
oNewController = oNewdoc.getCurrentController()
oTestController = oTestdoc.getCurrentController()
oNewFrame = oNewController.getFrame()
oTestFrame = oTestController.getFrame()
oTestSheets = oTestdoc.getSheets()
oTestSheet = oTestSheets.getByIndex(0)
oTestController.setActiveSheet(oTestSheet)
dispatcher.executeDispatch(oTestFrame, '.uno:SelectAll', '', 0, [])
dispatcher.executeDispatch(oTestFrame, '.uno:Copy', '', 0, [])
oNewSheets = oNewdoc.getSheets()
oNewSheet = oNewSheets.getByIndex(0)
oNewController.setActiveSheet(oNewSheet)
dispatcher.executeDispatch(oNewFrame, '.uno:Paste', '', 0, [])
いつか自分でRubyを書かなきゃならん時がくるだろうなー、とは思っていましたが、まさかWindowsマシンで↑のような変なモノを試すことになるとは思っていませんでした。
解凍圧縮ツールをアレコレ試す。5, 6個試して、速度と使い勝手のバランスが取れてて、今回の要件に一番しっくりする7-zipにとりあえず落ち着きました。
10.04をLet's Noteにインスコ。昔は3Dなんて贅沢品はもってのほかと思っていたのですが、最近はむしろいいんじゃねと思うようになってきたので、とりあえずグリグリ回転させて喜んでみたり。
Wordにある文字の囲み線の機能(選択中の文字が□で囲まれる)がOOoのWriterには無くて、メニューの挿入→枠から「文字として」とか選択するとそれらしいモノはできるものの、手順が複雑なので、マクロ化。
oDoc = ThisComponent
oSelection = oDoc.getCurrentController().getSelection()
oTextRange = oSelection.getByIndex(0)
oText = oTextRange.getText()
oCursor = oText.createTextCursor()
oCursor.gotoRange(oTextRange, False)
oFrame = oDoc.CreateInstance("com.sun.star.text.TextFrame")
oFrame.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
oFrame.WidthType = 0
oFrame.HoriOrient = com.sun.star.text.HoriOrientation.NONE
oFrame.VertOrient = com.sun.star.text.VertOrientation.LINE_TOP
oText.InsertTextContent(oCursor, oFrame, False)
oFrame.setString(oCursor.getString())
oFrame.BorderDistance = 0
oFrame.BottomMargin = 0
oFrame.TopMargin = 0
oFrame.LeftMargin = 0
oFrame.RightMargin = 0
oCursor.setString("")
エラー処理は入れてません。元に戻す処理も入れてません。見た目がWordと微妙に違うのが難点。
lotus domino/notesのトライアル版(英語版)をダウンロードしてインスコ&セットアップ。notesのほうは日本語もあったっぽいけど、dominoは英語しかトライアル版がなかったので、ついでにnotesも英語版をインスコ。dominoのセットアップがかなりめんどいです。(dominoはサーバー製品の詰め合わせっぽいので当たり前ですが。)
ただ、本来試したかったのは、notesdbと呼ばれるモノ。最初はDBというくらいだからdomino内のサーバー製品の一部だと勝手に思い込んでて、手元のノートPCでhttpサーバーとか立ち上げるハメになりましたよorz
なんかおかしいと思ってググってみると、そもそもnotesdbってのは、notes内でユーザーが作成できるアプリケーションのことで(ファイル管理DB的な使い方が多い模様)、notes単体でも評価可能だったらしいことが、やっとこさわかってきました。もうちょっと事前に調べればよかった。。。
追記:notesのAPIを使ってnotesdb内に保存されている添付ファイルやOLEファイルを吸い出すスクリプトとかをしこしこ試す。EMBED_ATTACHMENT(前者)とEMBED_OBJECT(後者)で微妙に扱いを変える必要があるのにハマったけど、概ねなんとかなりそう。(前者はextractfileメソッド、後者はActivateメソッドを使用したあとそのOLEのAPI経由で保存)
Microsoft Office & SharePoint Conference 2010というものに登録。冴子先生に会えるのかな。ハァハァ
DebianマシンのOOo(lenny-backports)のバージョンを3.2に上げてみたらCalcの行数が100万行を超えてました。桁がでかすぎてなんか怖いwww
MS Office 2003から2007へアップグレードするために、既存Officeファイルを棚卸しして統計解析やらするツールだそうです。こちら。メモ。
ついでにStarSuiteについてる既存Officeファイルの棚卸ツール。マニュアルはこちら。こっちはMS Office 2003からStarOffice(OOo)への移行の際の問題点に主眼をおいたものだそうです。
(何故か)Excelのマクロをもりもり書いてて、いざ動かすとシート上のデータが65000行を突破してしまったので、急遽、(何故か)Accessに変更。(Office2007はNG。MySQLとかPostgreSQLとかでも良かったんですが、最終的にExcelと連携するならAccessでしょという安易な理由。)
SQL直書きでクエリを実行したいのに、どのメニューにあるのかわかんなくて微妙にイラっとしたり、そもそもなんでこんなことをやってるんだと、アイデンティティが崩壊しそうになったりもしましたが、やっぱ良くできてるなー。
某所で(ブルーレイ環境で)見たサマーウォーズのDVDが近所のコンビニにうってたのでつい購入。いくやさんにブルーレイ環境くらい整備しろやゴルァと脅されていたのに妥協してすみません。
ついでに某所で久々にキャストパズルやって火がついたので新しいのを何個か購入。(偶然、ほぼ同時に結婚式の引き出物?でも貰った。)難易度6のCAST SQUARE(キャストスクエア)はプラプラさせてると偶然とれました。中の構造をみるとプラプラさせるのが正解っぽい。それ以外はまだとれてない。
というのを試す。シンプルに、OSにODBCドライバを設定して、それ経由でmdbファイルにアクセスするという方法がまず思いつきますが、SQLを実行できるだけなので、Accessのレポートとかクエリーとかフォームとか使いたかったら、これだと無理です。なので、CreateObject("Access.Application")とかしてみると、COMとしてアクセス可能でした。
ただ、SQLを実行したあと、Access VBAだったら普通の記述のResultset.Fields("カラム名")とかやるとそんなメソッドねぇぞコラと怒られてちょっとハマりました。で、Resultset.Fields.Item(0).Valueと昔風にカチッと書き下ろすと通ります。要は、OOo Basicでは連想配列的なモノとか構造体的なモノとか省略記法とかに対応出来ていないのが悪いっぽいです。(VBAのほうが言語仕様が新しくて、色んな機能があります。)今回はたまたま別の書き方がありましたが、メソッドの引数にその手のもの求められたり、メソッドの戻り値がその手のものだったりして、別の記述法が無い場合は、OOo Basicでは厳しいかもしれません。
そんなこんなで、まとめると、OOo BasicでAccess.Application呼び出しても動くことは動きます。ただ個人的には、逆の、Access VBAからOOoをCOMとして呼び出して操作する、ってやり方のほうが、下位互換的で、安定する気がします。(こっちのほうも試して、動きました。)
なぜかここしばらくExcel VBAを書いてます。OSのライブラリとかCOMオブジェクトとかと相性が良いので、所詮Officeのマクロ機能なのにそんなことまでできていーの?って感じ。ただ調子に乗って環境に依存する処理をやりすぎて、何回か泥沼にはまりました。
を外部のプログラムから操作する方法を調べると、こことか、ここが引っかかった。
とりあえず手元でも試してみると、「ツール」->「差し込み印刷ウィザード」から設定済みのテンプレートを作っておいて、データソースも作っておいた状態で、差し込み印刷をマクロから実行することは出来ました。「ファイル」->「新規作成」->「ラベル」よりもテンプレート作成が難しいのが難点かなー。
つーか、そもそものところをよく考えると、差し込み印刷の機能って、プログラム組まなくてもGUIからこんなことも出来ますよすごいでしょ的な機能なので、プログラム組むという前提なら、差し込み印刷の機能使わなくても文書内の文字列の置換とかだけで充分いけます。
Windows7の次は何故か時の流れを遡ってWindows2000の環境をいじる。かなりギャップを感じましたが、冷静に10年もたってることを考えると、いうほど進化してない気もします。
帰りにYシャツを買いに西武百貨店に寄り道。エスカレーター降りたとこに置いてあったシャツがスーツ買えるくらいの値段でちょっとびびるも奥にいくと普通の値段のやつも置いてて安心。
MS OfficeとかPDFとかODFとかのファイルのdiffをとるツールらしいっす。こちら。 さらにこのツール内で各フォーマットからテキストデータを抽出するのにつかわれているらしいのがこちらのxdoc2txtというツールらしい。とりあえずメモ。
新しく来た検証用PCにWindows7をセットアップ(XPにダウングレードされたモノが納品されてきたのでリカバリDVDで工場出荷状態に戻す)。とりあえずWindows updateしたり、security essentials入れたり、色々設定とか。vistaよりも良くなってる感じがする。firefox入れて、OOo入れて、MS Office 2007入れてひとまず完了。なんか家のPCもそろそろ入れ替えたくなってきた。
Linux上のMySQLをWindowsマシンのodbcドライバ & OOo Basicから操作するというのを試してみました。(drivermanagerサービス使うほうのやり方。こっちだとわざわざBaseでデータソース登録しなくてもいける) MySQLの設定方法とか使用方法などを結構忘れてて、ちょっと苦労しつつ、やっと通るようになったなと思ったら日本語データが文字化けorz。何から何まで全部utf8で統一されてるのに、と思っていたら、原因はWindowsマシンのodbcドライバの設定でした。Windows管理ツールのデータソースの設定画面で「Details」→「Misc Options」の「Character Set」の設定をよかれと思って「utf8」にしてたんですが、何故かここを「sjis」に変更すると文字化けが直りました。なんぞこれ。どっかで余計な文字コード変換処理が動いてる悪寒。
追記:↑は多分Linux内とそこから通信で出入りするところは全部utf8、 Windowsにパケットが入ってきてODBCさんが解釈した時点でsjis(≒cp932)に変換されて、そのコードがOOo Basicさんのエンジンによって再度Unicodeに変換されるという流れのようです。 どうもOOo Basicには、外部から取り込んだデータを自動的に(勝手に)cp932だとみなしてUnicodeに変換したり、逆にUnicodeの内部データをcp932に変換して出力したりする、ある意味おせっかいな機能があるみたいです。
更新テスト
Excelではツール->アドイン->分析ツール, 分析ツール - VBAの機能追加でできるっぽい。Gnumericにはデフォでそれっぽい機能がついてた。OOoではWikiにそれっぽい記述がありましたが、今は無理そう。マクロで計算させたらいけそうですが、そもそも私にはフーリエ変換が理解できない(Wikipediaの記事を見て心が折れたwww)ので、計算プログラムも書けない罠。なおコチラのサイトを見ると、Excel VBAでフーリエ変換を行っていて、それをOOo Basicに移植したものもあるそうです。
UbuntuマシンをWindows Active Directory domainに参加させて認証させる話。メモ。ココとかココとかもついでにメモ。
シート上の図形描画オブジェクトを操作するマクロと、シート切り替えイベントを取得するマクロがあって、それぞれ単体なら正しく動作するのに、組み合わせると動かないといわれる。調べてみると、シート切り替えイベントの瞬間に、切り替え先のシート上の図形を操作しようとしてるせいだとわかりました。(シートが切りかわった瞬間には、まだシート上の図形オブジェクトは生成されてないっぽい感じ。)しょうがないので、無理やりXcallbackで割り込んでwait 100とか入れて対応。
OOoの「ツール」->「オプション」->「読み込みと保存」->「全般」の「ODF形式でのサイズの最適化」のチェックを外すと、ODF(XML)が改行+インデントされた状態で出力されます。Javaプログラムでodsを解凍してcontent.xmlを処理してるんだけど、エラーが出る場合と出ない場合があると言われて、調べてみてこんなオプションがあるのに気づきました。(改行がはいっていようがいまいが正しいODFなので、どっちにしても作成されたJavaプログラムがおかしいことにかわりないんですが)
今度はUbuntu 9.10が起動できなくなったとレッツノートが持ち込まれる。試してみるとどうもsda1(内蔵ハードディスク)のマウントのところでこけてるっぽいので、外付けハードディスクのUbuntuで起動。手動でsudo mount -t ext4 /dev/sda1 /mnt/hogehoge とかやると問題なくハードディスクの中身が見えました。よくわかんないながらも、とりあえずhomeだけバックアップとって、sudo fsck /dev/sda1 とかやってみると瞬間的に問題ないよと返ってきた。 嘘くさいなーと思いながらも、試しにもう一回再起動したら今度はちゃんとsda1をマウントして起動するようになりましたwww。なんで壊れたのかなんで直ったのか、さっぱりわかりませんwww。
! おかる [ギョウサン 喰ったか?]