bar_1

contents_map

2010年8月23日月曜日

ExcelVBA漢数字を数値に変換するマクロ


Sep. 2nd, 2011追記:久々に見なおしてみたら、千、百、十などの小さなくらいの処理にバグを見つけた。修正したものを github に格納している。下記のコードも更新した。



またこの修正に伴い、新たに、壱萬などの漢字表記による漢数字もサポートする仕様追加を行った。



官公庁の発表している文書を読んでいるときに、グラフにしてみたいデータが有っ
た。そのデータ部分をコピペで、Excelに張り付けていた。


ところが、そのデータは漢数字で表記されていたのだ。当然このデータは、セル
上で文字列(String)として認識される。グラフを作成するのためには、数値デー
タが必要だ──漢数字を、いちいち手打ちで数値に修正するのはバカバカしい…
下向いちゃうし。

 

このような思いから、Excelで、漢数字を数値に変換する方法についてぐぐってみたところ、似たようなニーズがあったようで、いくつか参考となるVBAマクロを見つけることができた。


しかし、この例の場合は

  • 4桁までの数字+位を表す漢数字という形式

  • 位が固定

  • データの指定方法がセルのみ

などの点で、一般性にかけるように思われた。



そこで、当方で

  • 二千十、二〇一〇、2千十、いずれの表記も可

  • 〇~京の単位まで、柔軟に使用可

  • 引数は、セル、もしくは文字列いずれも使用可


であるような、マクロ関数(Function): STRINGNUMBER を作ってみた。




Attribute VB_Name = "KanNum"
'''' KanNum.bas
'
'
'Author: mephistobooks (http://voidptr.seesaa.net)
'Date: 2010 Aug. 13
'Updated: Sep. 1st, 2011 bugfix (千, 百, 十)
'
''' as use stricts in Perl;
Option Explicit
'Private Const DEBUG_KANNUM = True
Private Const DEBUG_KANNUM = False
'NAME
'  STRINGNUMBER
'
'SYNOPSIS
'  =STRINGNUMBER(v)
'  v は、漢数字で書かれた、セルまたは文字列
'
'
'DESCRIPTION
'  漢数字を数値に変換する。数値を漢数字に変換する関数:NUMBERSTRING の逆を行う。
'  漢数字は、京の単位まで指定できる。
'  漢数字の指定方法は、セルまたは文字列で指定できる。
'  漢数字の表記は、下記の例のいずれにも対応:
'
'  例.
'       STRINGNUMBER("一九七六") => 1,976
'   STRINGNUMBER("千九百七十六") => 1,976
'        STRINGNUMBER("56万3千") => 563,000
'  STRINGNUMBER("参阡伍百萬壱拾") => 35,000,010
'
'REFERENCES
'  Q.“Excelで漢数字を数値に変換する方法を教えてください。”
'  http://q.hatena.ne.jp/1268555767
'
Public Function STRINGNUMBER(ByVal varcl As Variant) As Variant
'''
Dim str As String       'kanji-number string (working variable)
Dim str_org As String   'kanji-number string (original)
'
Dim tmp As String
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''' (0) Initialize the variables
'
tmp = TypeName(varcl)
If DEBUG_KANNUM Then
Call MsgBox("TypeName(varcl)[" & tmp & "]" & vbCrLf & _
"str[" & str & "]")
End If
' Process the argument due to its type.
If TypeName(tmp) = "String" Then
str_org = varcl
Else
str_org = varcl.Value
End If
'Kanji-number string.
str = str_org
If DEBUG_KANNUM Then
Call MsgBox("TypeName(varcl)[" & tmp & "]" & vbCrLf & _
"str[" & str & "]")
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Algorithm:
'
'*Assumption
'  assume that kanji-number string (漢数字文字列) consists of three type of
'  number string: compound units, semi-compound units, and literal
'  numbers.
'
'  compound units (京,兆,億,万) consists of semi-compound units
'  and literal number string.
'
'  semi-compound units (千,百,十) consists of themselves (ex. 千十),
'  and also they sometimes includes literal number string (ex. 3千4百).
'
'  literal number string (〇~九) is able to convert to number (value)
'  directly.
'
'*Way of getting the value of kanji-number string
'  generate the expression from kanji-number string like the following:
'    ((n_1)億)+(n_2)万+(n_3))
'  where n_? is a*1000+b*100+c*10+d, and a-d here indicates 0-9.
'
'  after the step (4), we can obtain the above expression which
'  consists from only numbers, parentheses, product(*), and addition(+).
'
'  and finally, the value is obtained by evaluation of the generated
'  expression at the step (5)
'
'''' (1) Normalize the value.
'  `normalize' means that hankaku, and all characters of
' [0-9],[〇-九] to [0-9].
'
str = StrConv(str, vbNarrow) '半角
'for semi-compound units
str = Replace(str, "拾", "十")
str = Replace(str, "阡", "千")
str = Replace(str, "萬", "万")
'for the literal number strings.
str = Replace(str, "九", "9")
str = Replace(str, "八", "8")
str = Replace(str, "七", "7")
str = Replace(str, "六", "6")
str = Replace(str, "五", "5")
str = Replace(str, "伍", "5")
str = Replace(str, "四", "4")
str = Replace(str, "三", "3")
str = Replace(str, "参", "3")
str = Replace(str, "二", "2")
str = Replace(str, "弐", "2")
str = Replace(str, "一", "1")
str = Replace(str, "壱", "1")
str = Replace(str, "〇", "0")
'''' (2) Structurize for the compound units: 京,兆,億,万.
'
'  (.*)兆+(.*)億+(.*)万+(.*)
'
str = "(" + str
'
str = Replace(str, "京", ")京+(")
str = Replace(str, "兆", ")兆+(")
str = Replace(str, "億", ")億+(")
str = Replace(str, "万", ")万+(")
str = str + ")"
''' (3) Numerize the value
'semi-compound units
str = Replace(str, "千", "*1000+")
str = Replace(str, "百", "* 100+")
str = Replace(str, "十", "*  10+")
'compound units
str = Replace(str, "京", "*10000000000000000+")
str = Replace(str, "兆", "*    1000000000000+")
str = Replace(str, "億", "*        100000000+")
str = Replace(str, "万", "*            10000+")
''' (4) correct the expression of the value.
str = Replace(str, "()", "0")
str = Replace(str, "++", "+")
str = Replace(str, "+)", "+0)")
str = Replace(str, "(*", "(1*")
str = Replace(str, "+*", "+1*")
If DEBUG_KANNUM Then
Call MsgBox("org:" & str_org & vbCrLf & "str:" & str)
End If
''' (5) Eval the generated expression!
STRINGNUMBER = Application.Evaluate(str)
End Function


各構成単位ごとに、丸括弧でくくることが、みそだ。
最終的に、漢数字部分は数字に置き換えられ、数式の形になる。そして、それがApplication.Evaluate()により、数値に変換される。


Have fun!!


2010年8月13日金曜日

VBAのドキュメントの目次一覧

Microsoftのヘルプ機能は、OSのそれにしろOfficeアプリケーションのそれにし
ろ、まったくひどいしろものだ。なにしろ、知りたい機能で検索しても当該ページがで
てこない。
また、このヘルプ・ドキュメントそのものについても、同じ類のことがいえる:
一覧性が非常にひくいのだ──5万数万もの高い金を取りながら、電子マニュア
ルしか存在しないためだ。

最近、立て続けにそんな経験をしたので、ここにExcel2003 のVisual Basic Editor
のヘルプの目次をテキスト形式で一覧にし、示すこととする。これにより、マニュアル全体
を俯瞰することができ、Googleによってインデックス化されれば、検索性も増すであろう。

対象は、Excel2003のVisual Basic Editorのヘルプメニューを開いたときに出て
来るドキュメントだ。これらは開いたときの順番の通りに、項目を挙げている。
本来的には、順番で読むのに適さないが、資料としてこのままとする。

凡例
このテキストでは、■-□-◆の順に、ドキュメントの階層を表す。■がトップレ
ベルだ。
◆A-Zは、必ずしも、AからZまでの項目があるわけではない;実際には歯抜けと
なる項目が存在する。
��?)は、?アイコンを示す。
項目右端の★は、読むべき注目を表す。基礎的な概念について述べている項目に
付した。というのも、資料は必ずしも理解に適した順番で配列されているわけで
はないのだ。階層構造についても、同じことが言える。機会があれば、VBA版
『プログラミング言語C』を書いてみたい。


Visual Basic Editor のヘルプの目次一覧

■Microsoft Excel Visual Basic リファレンス
 □(?)Microsoft Office Excel オブジェクト モデル
 □新機能

  ◆(?)新しいオブジェクト
  ◆(?)新しいプロパティ(アルファベット順)
  ◆(?)新しいプロパティ(オブジェクト順)
  ◆(?)新しいメソッド(アルファベット順)
  ◆(?)新しいメソッド(オブジェクト順)
  ◆(?)新しいイベント
 □プログラミングの概念・・・★
  ◆ブックとワークシート
  ◆セルとセル範囲
  ◆コントロール、ダイアログ、ボックス、フォーム
  ◆イベント、ワークシート関数、図形
  ◆他のアプリケーションを使って作業する
 □コレクション
  ◆A-Z
 □オブジェクト
  ◆A-Z
 □メソッド
  ◆A-Z
 □プロパティ
  ◆A-Z
 □イベント
  ◆A-Z
 □列挙
  ◆(?)Microsoft Office Excel の定数


■Microsoft Visual Basic Documentation
 □Visual Basic ユーザー インターフェース
  ◆コマンド
  ◆キー
  ◆メニュー
  ◆その他
  ◆ショートカット
  ◆タブおよびダイアログ ボックス
  ◆ツールバー
  ◆ウィンドウ
 □Visual Basic プログラミングのヒント
  ◆(?)名前の二重定義の回避
  ◆(?)同じ名前のプロシージャの呼び出し
  ◆(?)Property プロシージャの呼び出し・・・★
  ◆(?)Sub プロシージャと Function プロシージャの呼び出し・・・★
  ◆(?)オブジェクト変数の作成・・・★
  ◆(?)再帰プロシージャの作成・・・★
  ◆(?)配列の宣言・・・★
  ◆(?)定数の宣言・・・★
  ◆(?)変数の宣言・・・★
  ◆(?)プロパティ設定時のコードの実行
  ◆(?)コードのループ
  ◆(?)For...Next ループの高速化
  ◆(?)引数の効率的な引き渡し
  ◆(?)関数からの文字列の取得
  ◆(?)オートメーションの概要
  ◆(?)条件付きコンパイルの概要
  ◆(?)名前付き引数と省略可能な引数の概要
  ◆(?)オブジェクト、プロパティ、メソッド、およびイベントの概要・・・★
  ◆(?)パラメータ配列の概要・・・★
  ◆(?)適用範囲と参照可能範囲の概要・・・★
  ◆(?)変数の有効期間の概要・・・★
  ◆(?)バリアント型 (Variant)の概要・・・★
  ◆(?)Visual Basic の構文の概要・・・★
  ◆(?)配列の使い方・・・★
  ◆(?)定数の使い方・・・★
  ◆(?)データ型の効率的な使い方
  ◆(?)Do...Loop ステートメントの使い方・・・★
  ◆(?)For Each...Next ステートメントの使い方・・・★
  ◆(?)For...Next ステートメントの使い方・・・★
  ◆(?)If...Then...Else ステートメントの使い方・・・★
  ◆(?)コードでのかっこの使い方
  ◆(?)Select Case ステートメントの使い方・・・★
  ◆(?)With ステートメントの使い方・・・★
  ◆(?)Visual Basic の名前付け規則・・・★
  ◆(?)アプリケーション間の連携
  ◆(?)Function プロシージャの記述方法・・・★
  ◆(?)Property プロシージャの記述方法・・・★
  ◆(?)Sub プロシージャの記述方法・・・★
  ◆(?)代入ステートメントの記述方法・・・★
  ◆(?)ファイルへのデータの書き込み・・・★
  ◆(?)宣言ステートメントの記述方法・・・★
  ◆(?)実行可能なステートメントの記述方法
  ◆(?)Visual Basic ステートメントの作成
 □Visual Basic 開発環境
  ◆(?)オブジェクト ライブラリの確認および参照設定の追加
  ◆(?)実行の継続
  ◆(?)ヘルプから使用例をコピーするには
  ◆(?)プロシージャの作成
  ◆(?)コードへの宣言の入力
  ◆(?)特定のステートメントの実行
  ◆(?)プロシージャの検索・・・★
  ◆(?)変数の定義の検索・・・★
  ◆(?)コード内の文字列の置換・・・★
  ◆(?)実行の再開・・・★
  ◆(?)コード内の文字列の検索・・・★
  ◆(?)タイプ ライブラリへの参照設定
  ◆(?)ブレークポイントの設定と解除
  ◆(?)プロジェクト プロパティの設定
  ◆(?)テキスト ファイルのコードへのインポート・・・★
  ◆(?)Visual Basic 環境オプションの設定
  ◆(?)コード ウィンドウの分割
  ◆(?)コード実行の開始・・・★
  ◆(?)コード実行の停止・・・★
  ◆(?)コード実行のトレース・・・★
  ◆(?)構文チェックの設定と解除の切り替え・・・★
  ◆(?)イミディエイト ウィンドウの使用
  ◆(?)オブジェクト ブラウザの使用・・・★
  ◆(?)プロジェクト エクスプローラの使用・・・★
  ◆(?)プロパティ ウィンドウの使用
 □Visual Basic ランゲージ リファレンス
  ◆定数
  ◆データ型
  ◆ディレクティブ
  ◆イベント
  ◆関数
  ◆グループ
  ◆インデックス/一覧
  ◆キーワード
  ◆メソッド
  ◆その他
  ◆オブジェクト
  ◆演算子
  ◆プロパティ
  ◆ステートメント
 □Visual Basic アドイン モデル
  ◆コレクション
  ◆イベント
  ◆メソッド
  ◆オブジェクト
  ◆プロパティ
 □Microsoft Forms リファレンス
  ◆(?)Microsoft Forms オブジェクト モデルの全体像
  ◆Microsoft Forms デザイン リファレンス
  ◆Microsoft Forms 開発者へのヒント
  ◆Microsoft Forms オブジェクト リファレンス


■Microsoft Office Visual Basic リファレンス
 □(?)Microsoft Office オブジェクト モデル
 □新機能
  ◆(?)新しいオブジェクト
  ◆(?)新しいプロパティ (アルファベット順)
  ◆(?)新しいプロパティ (オブジェクト順)
  ◆(?)新しいオブジェクト (アルファベット順)
  ◆(?)新しいオブジェクト (オブジェクト順)
 □プログラミングの概念
  ◆(?)Microsoft Office ソリューション開発者向けのセキュリティ情報
  ◆Office コマンド バーを使用する
  ◆Office アシスタントを使用する
  ◆(?)コレクションからオブジェクトを取得する
  ◆(?)OLE プログラム ID
  ◆(?)MSDN で MODI VBA のリファレンスを検索する
 □コレクション
  ◆A-Z
 □オブジェクト
  ◆A-Z
 □メソッド
  ◆A-Z
 □プロパティ
  ◆A-Z
 □イベント
  ◆A-Z
 □列挙
  ◆(?)Microsoft Office の定数



References
Microsoft Excel 2003; "Visual Basic のヘルプ"; Microsoft, メニュー>ヘルプ(H)

2010年7月28日水曜日

WinXP環境でGAE/JRuby/Rails/Sinatraにより彼女と自宅でデートする

0. Abstract



熱海はハードル高いので、まずは自宅だよね。ということで、ちょっと以前から:

などを参照して、ローカルPC(XP)でGAEの実験してたわけだが、これまで当方の環境では、ThreadErrorを吐くなど不具合があり、寸分も動作しなかった。



この度、やっと動作を確認できたので、ここに試行錯誤をまとめて示そうと思う。
結論だけ先に挙げますと、gemパッケージ内の主にJRubyに何らかの原因がありいくつか不具合現象が生じていたが、gemの更新により、それらが解消された、というつまらないことなのですが…。


それに加えて、今回ちょっと特殊なのは:

  • XPのアカウント名が日本語だったこと

  • 動作確認にCygwinも用いたこと

になります。


上記に起因する不具合現象について、相当調査し(ぐぐっ)たが、エラーそのものも含めて、全然情報がなかった。ActiveScriptRubyやCygwinという当方とまっ
たく同じ環境でも、何の問題も無く、みんなすんなり動いてるようでした。



本稿ではまず、1.に実験した環境・構成を示します。次に2.にて、当初存在した
不具合現象を示します。そして、3.に今回成功した修正方法を、4.に修正後の動作結果を示します。最後に、修正方法を5.結論に述べ、今後の課題を6.とします。
またリファレンスと付録を、それぞれ7.、8.とします。

 

 



1.動作確認に使用した環境と構成




以下、(1)~(2)に、環境・構成等を示す。


Windows XPは、以下XPと略す。
Cygwin/XPは、XP上にインストールしたCygwinを示す。
ActiveScriptRubyでの実験は、同環境をインストールするとできるruby console
から行った。
Cygwin/XPでの実験は、Cygwinのコンソールから行った。


(1) 実験した環境



実験していたのは、下記のような環境である:
OS  Windows XP(winver.exe; Version 5.1 (Build 2600.xpsp_sp3_gdr
   .100216-1514 :Service Pack 3)),
   Cygwin/XP(setup.exe version 2.697)

Ruby ActiveScriptRuby 1.8.7 (XP; ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]),
   Ruby 1.8.7 (Cygwin/XP; ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin])

Java java version "1.6.0_20"
   Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
   Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode)




AcriveScriptRuby、Cygwin/XP上のruby両者で、動作することを確認できた。


(2)gemの構成



  • 構成1(動作しない)

  • $ gem list
    
    *** LOCAL GEMS ***
    
    appengine-apis (0.0.16)
    appengine-rack (0.0.9)
    appengine-sdk (1.3.4)
    appengine-tools (0.0.13)
    bundler08 (0.8.5)
    google-appengine (0.0.13)
    jruby-jars (1.4.1)
    jruby-rack (1.0.1)
    rack (1.1.0)
    rubygems-update (1.3.7)
    rubyzip (0.9.4)


  • 構成2(動作確認できた)

  • $ gem list
    
    *** LOCAL GEMS ***
    
    appengine-apis (0.0.18, 0.0.16)
    appengine-rack (0.0.11, 0.0.9)
    appengine-sdk (1.3.5, 1.3.4)
    appengine-tools (0.0.15, 0.0.13)
    bundler08 (0.8.5)
    google-appengine (0.0.15, 0.0.13)
    jruby-jars (1.5.1, 1.4.1)
    jruby-rack (1.0.1)
    rack (1.1.0)
    rubygems-update (1.3.7)
    rubyzip (0.9.4)



2.不具合現象




不具合現象は、実行時に下記ログに示されるような現象である(一部、当方で入れた
デバッグ用のメッセージも含む)。


◇ログ1(ActiveScriptRuby; No such file or directory (Errno::ENOENT))



D:\Program Files\ruby-1.8\usr\local\sinatra_test>appcfg.rb bundle .
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.13/lib/appe
ngine-tools/boot.rb:78: warning: `*' interpreted as argument prefix
file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/jruby-stdlib
-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb:926:in `set_pa
ths': No such file or directory - No such file or directory - C:/Documents and S
ettings/テ」ツ・セテ」ツ・・(Errno::ENOENT)
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:17:in `set_paths'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:60:in `installed_spec_directories'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/sour
ce_index.rb:58:in `from_installed_gems'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:84:in `init_gemspecs'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:19:in `initialize'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from D:/PROGRA~1/ruby-1.8/bin/appcfg.rb:9
Error executing jruby




◇エラーログ2 (Cygwin/XP, dev_appserver.rb; Error opening zip file or JAR manifest missing)


$dev_appserver.rb .
/usr/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine-tools/boot.rb
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
exec "java" "-classpath" "/usr/lib/ruby/gems/1.8/gems/appengine-sdk-1.3.5/appeng
ine-java-sdk-1.3.5/lib/appengine-tools-api.jar" "-Djava.util.logging.config.file
=/usr/lib/ruby/gems/1.8/gems/appengine-sdk-1.3.5/appengine-java-sdk-1.3.5/config
/sdk/logging.properties" "-Dcom.google.appengine.plugin.path=/usr/lib/ruby/gems/1
.8/gems/appengine-tools-0.0.15/lib/appengine-tools/app_yaml.jar" "-javaagent:/u
sr/lib/ruby/gems/1.8/gems/appengine-sdk-1.3.5/appengine-java-sdk-1.3.5/lib/agent
/appengine-agent.jar" "com.google.appengine.tools.development.DevAppServerMain"
"--disable_update_check" "/home/masa/local/sinatra_test"
Error opening zip file or JAR manifest missing : /usr/lib/ruby/gems/1.8/gems/app
engine-sdk-1.3.5/appengine-java-sdk-1.3.5/lib/agent/appengine-agent.jar
Error occurred during initialization of VM
agent library failed to init: instrument





◇エラーログ3(ActiveScriptRuby; Mutex relocking by same thread (ThreadError))


D:\Program Files\ruby-1.8\usr\local\sinatra_test>appcfg.rb generate_app .
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.13/lib/appe
ngine-tools/boot.rb:78: warning: `*' interpreted as argument prefix
=> Generating gemfile
=> Bundling gems
D:/Program Files/ruby-1.8/lib/ruby/1.8/pathname.rb:263: warning: `*' interpreted
 as argument prefix
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/bundler08-0.8.5/lib/bundler08/d
ependency.rb:59: warning: discarding old version
Calculating dependencies...
Updating source: http://gems.rubyforge.org
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/bundler08-0.8.5/lib/bundler08/r
esolver.rb:115:Warning: Gem::Dependency#version_requirements is deprecated and w
ill be removed on or after August 2010.  Use #requirement
Caching: appengine-rack-0.0.9.gem
Caching: jruby-jars-1.4.1.gem
Caching: jruby-rack-1.0.1.gem
Caching: rack-1.1.0.gem
Installing jruby-jars (1.4.1)
Installing rack (1.1.0)
Installing jruby-rack (1.0.1)
Installing appengine-rack (0.0.9)
Done.
=> Packaging gems
=> Installing appengine-rack.jar
=> Installing jruby-core-1.4.1.jar
=> Installing jruby-stdlib-1.4.1.jar
=> Installing jruby-rack-1.0.1.jar
=> Installing appengine-sdk
=> Generating rackup
file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/jruby-stdlib
-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb:888:in `search
er': Mutex relocking by same thread (ThreadError)
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/cust
om_require.rb:33:in `require'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/shared/builtin/ja
vasupport.rb:37
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/shared/builtin/ja
vasupport.rb:31:in `require'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/cust
om_require.rb:31:in `require'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:70:in `spec_directories_from_classpath'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:60:in `installed_spec_directories'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/sour
ce_index.rb:58:in `from_installed_gems'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:84:in `init_gemspecs'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:19:in `initialize'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb:9
        from D:/PROGRA~1/ruby-1.8/bin/appcfg.rb:9
Error executing jruby





3.回避・修正方法



不具合現象の(1)、(3)に関しては、google-appengineパッケージの更新(下記(1))で、修正されることがわかった。不具合現象(2)については、パッケージ内のスクリプトの一部のパスの指定方法に、問題があることがわかった(下記(2))。

下記(1)、(2)に回避・修正方法を示す。



(1) GAE gemファイルの更新


エラーログから、jruby-jar等に問題があることが推測された。
google-appengineのgemを最新のものに更新することで、当該現象は発生が抑えられた。
   gem update google-appengine




(2) GAE/JRubyのスクリプトdev_appserver.rbの修正(Cygwinの場合)



パスの指定部分を、全てcygpathでラッピングする[1]

/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine-tools/
appserver.rb


<             server_args[-1] = File.expand_path(path)
---
>             tmp_expath = File.expand_path(path)
>             server_args[-1] = `cygpath -wp #{tmp_expath}`.chomp


<           java_args << AppEngine::SDK::TOOLS_JAR
---
>           java_args << `cygpath -wp #{AppEngine::SDK::TOOLS_JAR}`.chomp



<               AppEngine::SDK::SDK_ROOT + '/config/sdk/logging.properties'
<           java_args << "-Dcom.google.appengine.plugin.path=#{plugin_jar}"
---
>               `cygpath -wp #{AppEngine::SDK::SDK_ROOT}/config/sdk/logging.prop
erties`.chomp
>           java_args << "-Dcom.google.appengine.plugin.path="+`cygpath -wp #{pl
ugin_jar}`.chomp
>


<             java_args << '-javaagent:' + AppEngine::SDK::AGENT_JAR
---
>             java_args << '-javaagent:' + `cygpath -wp #{AppEngine::SDK::AGENT_
JAR}`.chomp




これもっと綺麗な方法ないかな、とも思いますが・・・。





4.動作結果




ブラウザからhttp://localhost:8080/にアクセスすれば、所望の結果が得られる。

D:\Program Files\ruby-1.8\usr\local\sinatra_test>dev_appserver.rb.bat .
D:/PROGRA~1/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine
-tools/boot.rb:50: warning: `*' interpreted as argument prefix
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
2010/07/26 1:23:22 com.google.apphosting.utils.jetty.JettyLogger info
情報: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLo
gger
2010/07/26 1:23:22 com.google.apphosting.utils.config.AppEngineWebXmlReader read
AppEngineWebXml
情報: Successfully processed D:\Program Files\ruby-1.8\usr\local\sinatra_test\WE
B-INF/appengine-web.xml
2010/07/26 1:23:22 com.google.apphosting.utils.config.AbstractConfigXmlReader re
adConfigXml
情報: Successfully processed D:\Program Files\ruby-1.8\usr\local\sinatra_test\WE
B-INF/web.xml
2010/07/26 1:23:22 com.google.apphosting.utils.jetty.JettyLogger info
情報: jetty-6.1.x
2010/07/26 1:23:25 com.google.apphosting.utils.jetty.JettyLogger info
情報: Started SelectChannelConnector@127.0.0.1:8080
2010/07/26 1:23:25 com.google.appengine.tools.development.DevAppServerImpl start

情報: The server is running at http://localhost:8080/







5.結論





  • JRuby(jruby-jars)は、バージョンによってはActiveScriptRuby、もしくはCygwin/XPにおいて、ThreadErrorにより動作しない

  • gemパッケージ:google-appengineを、最新のバージョンに更新する。

  • Cygwinでは、一部のスクリプトのjavaコマンド発行時のパス名が問題となる

  • Cygwinのコマンド:cygpath -wp で、ラッピングしてjavaコマンドに渡されるように、dev_appserver.rbを修正する。

  • 上記により、ActiveScriptRuby, Cygwin/XP両者の環境で、ローカルPC上で、GAE/JRubyの動作を確認できた。




6. Future Works





  • gem, appcfg.rb, dev_appserver.rb の使い方詳細の調査

  • リモート・サーバ上での動作

  • 彼女を作る

  • 不具合現象の原因となるgemパッケージの依存関係、ThreadErrorの生じる箇所
      については、今回あきらめた。JRubyの内部動作に強い興味を持つ向きは、探ってみてもよいかもしれない。





7.補論



  • Gemリポジトリ格納場所の再設定

  • 不具合現象(1)の発生は、3.回避・修正方法の(1)により、抑えられる。しかし、類似の現象を未然に防止するため、Gemリポジトリの設定をしておいたほうがよいかもしれない。


    本稿の場合、3.appcfg.rbから実行されるgemにおいて、リポジトリ処理に日本語パス名起因である不具合現象(1)が、当初存在していた。

    gemは、動作時にリポジトリ・ファイルを作成する[2]

    AcitiveScriptRubyの場合、特に指定がなければ、リポジトリはディレクトリ:%HOME%となる。このパス名に、日本語が含まれている場合、google-appengineのバージョンによっては、不具合現象(1) の原因になる。

    これを防ぐには、google-appengineパッケージの更新、もしくは環境変数GEM_HOMEを、適切に設定する。

    設定方法は、
    コンパネ>システム>詳細設定、またはコマンド・プロンプト
    で、環境変数:GEM_HOMEを、日本語を含まないパスに設定する

    である。

  • Cygwin

  • Cygwinに関しては、ホーム・ディレクトリを、日本語パス名を含まないものに変更している。





8.References



[1] Toru Takahashi; "CygwinでJavaを快適に使う";http://www.02.246.ne.jp/~torutk/javaoncygwin/javaoncygwin.html


[2] docs.rubygems.org; "RubyGems User Guide | RubyGems Manuals";
3.2 Installing RubyGems in a User Directory,
     
http://docs.rubygems.org/read/chapter/3#page83




2010年5月10日月曜日

InfoViz APIドキュメンテーション(目次)

API ドキュメンテーション
o Input JSON データの入力
o HyperTree
o RGraph
o SpaceTree

クイック・チュートリアル
o RGraph
o HyperTree
o SpaceTree
o TreeMap


API ドキュメンテーション全文
JSON をロードする
Loader.js

Canvas クラス
Canvas.js

可視化(Visualizations)
Spacetree.js
Treemap.js
Hypertree.js
RGraph.js

Graph クラス
Graph.js
Graph.Op.js
Graph.Plot.js

Point (2D) クラス
Complex.js
Polar.js

アニメーション(Animations)
Animation.js

その他(Other)
AngularWidth.js

索引(Index)
すべて(Everything)
クラス群(Classes)
関数群(Functions)
ファイル群(Files)

2010年4月14日水曜日

JavaScriptによるデータ可視化ライブラリ:InfoVis の概要訳

InfoVisは、JavaScriptで記述されたデータ可視化ライブラリである。この種のライブラリは、Javaであれば、例えば、JUNG(http://jung.sourceforge.net/)などが存在する。

InfoVisにおいて、可視化対象のデータは、JSON形式のものを扱う。このため、このライブラリにはJSONを扱うためのAPIを含む(TreeUtil)。可視化関連のものは、Core.jsにて提供される。


InfoVisの概要が示されたページについて、日本語訳をおこなったのでここに示す。

url:
http://thejit.org/

download:
http://thejit.org/downloads/Jit-1.1.3.zip

license:
BSD(http://thejit.org/docs/files/Core-js.html)

概要:
http://thejit.org/docs/files/Core-js.html


●Core
Core.js

説明(Description)
JSONツリー構造を操作する共通ユーティリティ関数と、ライブラリとして、内部で使
用されているクラス・オブジェクトを提供する。
また、JSONツリー構造を操作する TreeUtil オブジェクトを、提供する。

作者(Author)
ニコラス・ガルシア・ベルモンテ(Nicolas Garcia Belmonte)

コピーライト(Copyright)
Copyright 2008-2009 by Nicolas Garcia Belmonte

ホームページ(Homepage)
http://thejit.org

バージョン(Version)
1.1.3

ライセンス(License)
BSD License
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the organization nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY Nicolas Garcia Belmonte ``AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL Nicolas Garcia Belmonte BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


サマリ(Summary)

Core.js 共通ユーティリティ関数とライブラリ内部で使用されるクラス・
オブジェクトを提供

TreeUtil 共通JSONツリー操作メソッドをいくつか
Functions
prune ツリー上でmaxLevelより大きな深さを持つノードを、クリアする
getParent idの識別子を持つノードの、親ノードを、返す
getSubtree 指定したidにマッチするサブツリーを、返す
getLeaves ツリーの葉を、返す
eachLevel ツリー上の相対的に指定した深さ以下の深さのノードを、イテレートする
each ツリーのイテレータ
loadSubtrees requestメソッドによって新たにリクエストされたサブツリーを、葉に追加する


TreeUtil
共通JSONツリー操作メソッド。

サマリ(Summary)
Functions
prune ツリー上でmaxLevelより大きな深さを持つノードを、クリアする
getParent idの識別子を持つノードの、親ノードを、返す
getSubtree 指定したidにマッチするサブツリーを、返す
getLeaves ツリーの葉を、返す
eachLevel ツリー上の相対的に指定した深さ以下の深さのノードを、イテレートする
each ツリーのイテレータ
loadSubtrees requestメソッドによって新たにリクエストされたサブツリーを、葉に追加する


2010年1月31日日曜日

日本語の辞書(国語辞典)についての考察

ひんしつ【品質】 〔quality〕 ・・・品物の質。

��大辞林第3版より引用)


私は、こういう記述は嫌いだ。
このような記述は、意味がない。なぜなら、何の説明もしていない、同語反復のトートロジーであるからだ。人が辞書を引くとき、普通は意味を知りたい時ではないだろうか?しかし、そこに意味は記されていない―無意味な作業というわけだ。
そんなことを好んでする利用者は、誰もいないであろう。

したがって、
語とその意味のカタログという辞書本来の性質と、利用者の利用目的の観点から、
辞書における語の記述は、説明的な叙述・定義であるべきである。

意味を表現することができる。


ところが、
日本のいわゆる「国語辞典」には、ここで例に挙げた大辞林のように、こういう類の「無意味な」記述が多すぎる。その結果、シソーラス(類語辞典)ともディクショナリ(国語辞典)ともつかぬものとなってしまっている。
それこそ「品質」が低すぎる。


一方で、OALDではどうか。

qual" ity noun, adj.
> noun (pl. -ies)
1 [U, C] the standard of sth when it is compared to other things like it; how good or bad sth is: to be of good / poor / top quality * goods of a high quality * high-quality goods * a decline in water quality * When costs are cut product quality suffers. * Their quality of life improved dramatically when they moved to France.
2 [U] a high standard syn excellence: contemporary writers of quality * We aim to provide quality at reasonable prices. * Get it right, even if it takes time; it’s quality not quantity that matters.
3 [C] a thing that is part of a person’s character, especially sth good: personal qualities such as honesty and generosity * to have leadership qualities * She has all the qualities of a good teacher. * It’s hard to find people with the right qualities for the job.
4 [C, U] a feature of sth, especially one that makes it different from sth else: the special quality of light and shade in her paintings * His voice has a rich, melodic quality.
5 [C] (BrE) = quality newspaper

(http://www.oup.com/oald-bin/web_getald7index1a.pl
より引用。ここでは名詞だけを引用した。発音記号は、表示上の問題から削除)


その記述の量もさることながら、記述の仕方が、全然違うことに、気付くことができる。たとえば、1は

その何か(sth)と同じようなものと比較するときの
sthの水準;いかに良いか悪いかの

と言っている。

無論、「水準」とは何かという疑問があるだろう。しかしこの語(quality)が、複数の比較対象の存在によって規定される;良い・悪いを判断する尺度であることは、理解できる。


「品物の質」などという馬鹿げた記述より、はるかに明瞭な定義であり、説明だ。
(大辞林の記述にさらに付言すれば、品質は、べつに品物(有体物)にだけ成り立つものでもあるまい。サービス品質などともいうだろう)

今後いくつかの国語辞典について、主に語の記述の観点から、比較を行ってみたい。


まとめ
・日本語の辞書(国語辞典)は、品質が悪い
・辞書における語の記述は、説明的な叙述・定義であるべきである

2009年8月11日火曜日

Tumblr:Postへのタグ表示方法メモ

手順
  1. Tumblrにログイン
  2. ダッシュボード(Dashboard)>カスタマイズ(Customize)
  3. Theme>customHTML
  4. block:Posts のお好みの場所に、下記のような block:HasTags を追加
{block:HasTags}
<div class="tags">
{block:Tags}
<a href="{TagURL}">[{Tag}]</a>
{/block:Tags}
</div>
{/block:HasTags}



関連ドキュメント


2009年8月6日木曜日

FirefoxでGoogleの表示設定が保持されない

再度この方法を検証したところ、改善は確認できなかった。
ひきつづき、解決に向けた方策を調査したい。(2009/8/10)
改善を確認できたので、再掲する(2009/8/12)。

問題
なぜか最近、Googleのクッキーが有効でない挙動をしていた。
具体的には、Googleの表示設定の(1)セルフサーチ フィルタリング、(2)検索結果の表示件数表示数、が、ブラウザ(Firefox)を立ち上げてネットにアクセスする際、毎回デフォルトの設定に戻ってしまうというものだ。


対策
以下の手順で、(1)既存のクッキーの削除と、(2)クッキーのサイト許可登録を行うことで、改善を得た。

(1) 既存のクッキーの削除の手順
  1. メニューバーから、ツール>オプション...を、選択
  2. 表示されたオプションウィンドウの上段の「プライバシ」ボタンを、押下
  3. Cookieペインの「Cookieを表示」ボタンを押下
  4. 表示されるCookieウィンドウ中のサイトリストから、Google.com, Google.co.jpに対して、5.を、実施
  5. 「Cookieを削除」ボタンでクッキーを、削除

(2) クッキーの許可登録
  1. メニューバーから、ツール>オプション...を、選択
  2. 表示されたオプションウィンドウの上段の「プライバシ」ボタンを、押下
  3. Cookieペインの「例外サイト(E)...」ボタンを、押下
  4. サイトのアドレス入力で、Google.com, Google.co.jpを、「許可」で、追加


結果
(1)と(2)を併せて行うことで、Googleの表示設定の内容が、PCの再起動後も、ちゃんと設定どおりに表示されるようになった。

2009年8月5日水曜日

tumblrで自分でつけたタグのクラウド表示の仕方


  1. ログインしてDashboardへ
  2. Customize
    以下のコードを、Customize>Info>Description で追加する:
<!-- Start Tumblr Tag Cloud -->
<script type="text/javascript" src="http://tumblrtags.rivers.pro/jquery.js"></script><script type="text/javascript" src="http://tumblrtags.rivers.pro/widget.js?css=default&minsize=120&maxsize=280"></script>
<!-- End Tumblr Tag Cloud -->

References:
http://tumblrtags.rivers.pro/

2009年8月2日日曜日

tumblrでPostにタグ付けする方法メモ

自分のポストにタグで属性付け

  1. 自分のtumblrホームに移動
  2. Edit
  3. “Advanced Option”>Tag this post
  4. カンマで区切って、タグを入力


References
  • tumblr http://www.tumblr.com/

Related Entries