xfy

2008-09-14

タイマー付きダイアログボックス

Timerdialog

- http://homepage2.nifty.com/youichi_kato/src.html
  > タイマー付きダイアログボックス (2008-09-14)
として、xfy/xvcd 上で、
       操作をしないでいると自動的にクローズするダイアログボックス
を作ってみた。
<instructio:post delay="m-sec" ...> を利用している。
秒数部分は秒単位でカウントダウンして表示更新もしている。


現状では、それなりの記述を個々のダイアログに追加しないといけない。
既存ダイアログに、ちょっとした記述追加だけで、こういった機能を追加できるような仕組みが欲しいなぁ。
# ruby での module include みたいな...

| | コメント (0) | トラックバック (0)

2008-08-21

ruby on xfy, jruby on xfy

こんな記事が出た。
- http://xfy.justblog.jp/labs/2008/08/ruby-2065.html
> xfy 実験室: Rubyの世界にはワクワクがいっぱい! あれ?
> ... GEM で追加できる exifr と rmagick4j というモジュールを使ったサンプルをご紹介します...

gem を知ってしまうと、
xfy のプラグインインストール/アンインストールも ruby の gem みたいな
管理にして欲しいと思う人がでてくるはず。
ぜひ gem のような管理の仕組みをつくり、さらに GUI操作環境 を xfy 上に構築して欲しいなぁ。
# netbeasns の ruby gems 管理はなかなか便利だと思う。
# ruby gems や mac ports に対する xfy での GUI クライアントも欲しいけど。

hpricot という gem をつかうと、 html (少しぐらい不整合があってもよい)を処理できる。
その結果を  ruby の標準のxml 操作ライブラリーをつかうことで目的にそった xml に変換ができる。
# rss が提供されていない サイトに対して、自前で rss を生成するなんてことができる。

xml に変換さえできればしめたもの。
xfy/xvcd の template 機能で (レンダリング + 編集可能) なアプリケション画面が自然に作成できる!

net で拾った もこもこ雲の画像。

Kumo5

| | コメント (0) | トラックバック (1)

2008-08-17

xfy リスト表示コンポーネントで Drag & Drop (その2)

- https://www.xfytec.com/community/modules/newbb/viewtopic.php?topic_id=245&forum=8
> xfy コミュニティ - Generated Link from XML file for Blog
この記事の中でこんなコードが示されていた。

            <xvcd:action event="event:drop-target">
                <inst:param name="event:event" />
                <inst:if test="$event:event/event:drop-target/@type = 'drop'">
                    <inst:variable name="url" select="$event:event//lsp:url"/>
                    <inst:variable name="fragment" select="function:synchronous-document($url)"/>
                    <xvcd:insert ref="//d2l:dropped-xml" position="last-child" select="$fragment/*"/>
                </inst:if>
            </xvcd:action>

$event:event//lsp:url として、 Desktop や ファイルエクスプローラから File などを xfy の画面に drop したときの URL を取得できるようだ。

- https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=184&lang=ja
> xfy コミュニティ - ImageEasy for Blog Editor
のデモ画像でも、xfy の外から image ファイルを deop して取り込んでいる様子が示されている。
down load したzip ファイルを展開して、blog-imageeasy.xvcd を眺めると、やはり
$event:event//lsp:url を利用していることがわかった。

そこで先の List での drag & drop に 外部からの drap 対応を追加してみた。

Xfyuserdata02
          <list:list type="{xvcd:user-data('type')}">

の直後に以下のコードを追加した。

              <xvcd:action event="event:drop-target">
                <instruction:param name="event:event" />
                <instruction:if test="$event:event/event:drop-target/@type = 'drop'">

                  <instruction:variable name = "url" select="function:url-decode($event:event//lsp:url)"/>
                  <instruction:choose>
                    <instruction:when test="function:ends-with($url, '/')">
                      <xvcd:insert ref="." position="last-child" caret-move="none">
                        <simple:folder name="{$url}" />
                      </xvcd:insert>
                    </instruction:when>
                    <instruction:otherwise>
                      <xvcd:insert ref="." position="last-child" caret-move="none">
                        <simple:file name="{$url}" />
                      </xvcd:insert>
                    </instruction:otherwise>
                  </instruction:choose>
                </instruction:if>
              </xvcd:action>

xfy 外部から File を drop したとき、その URL さえ取得できれば、その後はアプリケーションに即した様々な処理が可能だろう。

P.S.
windows や Mac でのターミナル画面でも、File/Folder をドロップするとファイルパスがコマンドライン行に追加される。
cd と打ってから、Folder を drop して、長い文字列をタイプすることなく directory 移動することができる。

| | コメント (0) | トラックバック (1)

2008-08-16

xfy リスト表示コンポーネントで Drag & Drop

- http://homepage2.nifty.com/youichi_kato/src.html
    xfy リストコンポーネントで Drag & Drop (2008-08-16)
として ドラッグ&ドラッグでのリスト項目順番移動の実験をしてみた。
Drag 中の表示をいろいろ工夫したかったが、List:item には style 指定で細かな表示の変化を与えられないようだ。
実験コードでは Bold 表示指定だけをしている。
# 移動先を 下線で示したり、移動結果を薄色で表示( ゴースト表示)したかったが、ちょっと面倒そう...
http://www.dhtmlgoodies.com/scripts/drag-drop-folder-tree/drag-drop-folder-tree.html
http://unageanu.sakura.ne.jp/blog-samples/071002/
http://www.tkrb.jp/guide/2008/01/rails_ajax.html
# > つくるぶガイドブログ: ドラッグアンドドロップで並べ替え(Rails + Ajax)

Listdnd

| | コメント (0) | トラックバック (0)

2008-08-14

user-data に xml 内容を保存する

いまさらながらではあるが、
- https://www.xfytec.com/community/modules/news/article.php?storyid=278#top
> xfy コミュニティ - XVCD プログラミング Tips集 目次
なんてページがあることを知った。

読んでいて思いついたことをメモしておく。
つぎのような記載があったけど、
- https://www.xfytec.com/community/modules/news/article.php?storyid=314#variables
> Q. variableとuser-dataの違いは?

> ... user-dataは何度でも書き換えが可能な変数です。user-dataはテキストデータのみ設定可能です。...

function:dom-to-xml-string / function:xml-string-to-dom をつかって、 string 化したものを user-data に保存するようにすれば、xml データの保存もできるのでは?
実際にためしてみよう。
Xfyuserdata
  上2行に variable に保持した xml 断片から生成したもの
  下2行に user-data に保持した html 断片(string <-> dom 変換を利用) から生成したものが表示できている。
message-box には user-data に保持している文字列を表示している。

以下に ソースコード(2ファイル) を示す。
2番目のソース中の太字部分が、variable, use-data への値設定の箇所である。

$ cat HelloWorld.xml
<?xml version="1.0"?>

<hw:document xmlns:hw="http://xmlns.example.com/developer/tutorial/helloworld">
    <hw:message>
        Hello World!
    </hw:message>
</hw:document>

$ cat HelloWorld.xvcd
<?xml version="1.0"?>

<xvcd:xvcd
   xmlns:xvcd="http://xmlns.xfy.com/xvcd"
   xmlns="http://www.w3.org/1999/xhtml"
   xmlns:function="http://xmlns.xfy.com/function"
   xmlns:instruction="http://xmlns.xfy.com/instruction"
   xmlns:ctrl="http://xmlns.xfy.com/controls"

   xmlns:hw="http://xmlns.example.com/developer/tutorial/helloworld"
   version="1.0">

  <xvcd:vocabulary name="HelloWorld" match="hw:document" call-template="root"/>

  <xvcd:template name="root">
    <html>
      <body>
    <xvcd:apply-templates/>
      </body>
    </html>
  </xvcd:template>

  <xvcd:template match="hw:message">

   <xvcd:variable name="val">
      <hw:data>
    <hw:item>Internet Explorer</hw:item>
    <hw:item>Netscape Navigator</hw:item>
      </hw:data>
    </xvcd:variable>

    <xvcd:user-data name="data-text" value="{function:dom-to-xml-string($val)}"/>

    value:<br />
    <xvcd:for-each select="$val/hw:data/hw:item">
      <xvcd:value-of select="."/><br />
    </xvcd:for-each>

    user-data:<br />
    <xvcd:for-each select="function:xml-string-to-dom(xvcd:user-data('data-text'))/hw:data/hw:item">
      <xvcd:value-of select="."/><br />
    </xvcd:for-each>

    <span align="right">
      <ctrl:trigger>
        <ctrl:label>DEBUG:variable</ctrl:label>
        <xvcd:action event="ctrl:triggered" >
          <instruction:call name="debug">
            <instruction:with-param name="str" select="function:dom-to-xml-string($val)" />
          </instruction:call>
        </xvcd:action>
      </ctrl:trigger>

      <ctrl:trigger>
        <ctrl:label>DEBUG:user-data</ctrl:label>
        <xvcd:action event="ctrl:triggered" >
          <instruction:call name="debug">
            <instruction:with-param name="str" select="xvcd:user-data('data-text')"/>
          </instruction:call>
        </xvcd:action>
      </ctrl:trigger>
    </span>

  </xvcd:template>

  <xvcd:command name="debug">
    <instruction:param name="str"/>
    <instruction:message-box>
      <xvcd:value-of select="$str"/>
    </instruction:message-box>
  </xvcd:command>

</xvcd:xvcd>

| | コメント (0) | トラックバック (1)

2008-08-07

java の ScriptEngineManage の実験

- http://d.hatena.ne.jp/koichiarchi/20070821/1187669141
> JavaからRubyを使う - koichi’s swap memory

この記事にある java のサンプルを MacOSX 10.5 で動作させてみた。

その前に まずは、
classpath 指定をして java を実行する shell script をつくった。

$ cat run.sh
#! /bin/sh

JRUBY_LIBS=\
$JRUBY_HOME/lib/bsf.jar:\
$JRUBY_HOME/lib/jruby.jar:\
$JRUBY_HOME/lib/profile.jar:\
/Users/youichikato/work/www/jsr223-engine/jruby/build/jruby-engine.jar

java -cp $JRUBY_LIBS:. $*

まずは、有効な engine の調査だ。
$ cat ScriptEngineSearch.java
// See
//  http://d.hatena.ne.jp/koichiarchi/20070810/1186736204

import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;

/**
* 使用可能なスクリプトエンジンを調べる
*/
class ScriptEngineSearch {
    public static void main(String args[]) {
        ScriptEngineManager manager = new ScriptEngineManager();

        // 使用可能なエンジンの一覧を取得
        for (ScriptEngineFactory engine : manager.getEngineFactories()) {
            System.out.println("enfine full name = " + engine.getEngineName());

            // エンジン生成時に使用出来るショートネーム
            for (String shortName : engine.getNames()) {
                System.out.println("- engine short name = " + shortName);
            }
        }
    }
}

走らせると
$ ./run.sh ScriptEngineSearch
nfine full name = JRuby Engine
- engine short name = jruby
- engine short name = ruby
enfine full name = AppleScriptEngine
- engine short name = AppleScriptEngine
- engine short name = AppleScript
- engine short name = OSA

おー、jruby が認識されている。

次は、外部の jruby scriファイルを実行する例だ。
$ cat tax.rb
def tax(m)
  puts m * 1.05
end

$ cat JRubyFileExecute.java
// See
//  http://d.hatena.ne.jp/koichiarchi/20070821/1187669141

import java.io.FileReader;
import java.io.IOException;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JRubyFileExecute {

    private static ScriptEngine ruby = new ScriptEngineManager().getEngineByName("ruby");

    public static void main(String[] args) throws ScriptException, IOException {
        FileReader reader = new FileReader(args[0]);
        ruby.eval(reader);
        ruby.put("m", 980);
        ruby.eval("tax($m)");
    }
}

走らせると、
$ ./run.sh JRubyFileExecute tax.rb
1029.0
素晴らしい!

- https://scripting.dev.java.net/
> scripting: Project Home Page
には、サポートされる script の一覧がある。

java のソースコードを生成 or 入力し、それを compile して実行
なんてことをすれば、java を script 言語のように扱えるだろう。

| | コメント (0) | トラックバック (0)

2008-07-31

xfy 実験室: Java Powered 拡張コマンド の記事を読んだ

- http://xfy.justblog.jp/labs/2008/07/java-powered-ec.html
> xfy 実験室: Java Powered 拡張コマンドを使いやすく「メイクアップ」

この記事では、
    <extcommander:call-command
       plugin-id="com.xfy.community.samples.exthelloworld"
       selected-text="{xvcd:user-data('CITED')}"
        entry-xml-string="{function:dom-to-xml-string(/)}"
        return-to="result"/>
    >
というような形で  xvcd から java でつくったプラグインを呼びだせるという雛形が示された。

java 側で、ProcessBuilder を使う事で、任意の外部コマンドを呼び出し、そのコマンドでの処理結果を
xfy 側に返すことができるし、外部コマンド側で ダイアログなどの GUI を利用することもできそうだ。

xfy/xvcd での XML でのプログラミングは敷居が高い。
自分が知っている言語で処理を行い、XML に整形して結果を返すだけなら、敷居はぐっと低くなる。
JSON の利用や、 RDB の利用、web-service の利用、画像ファイル生成なども自分の知っている言語で、
その言語での既存ライブラリーを自由に使えるのはとても便利と思う。
( http://ja.doukaku.org/lang/ にあるような
  haskell, smalltalk, C#, phthon, perl, ruby, schema, Scala, javascript, PHP, ... をどれでも使える!)

xfy は "複合文書" を処理するシステムだが、その処理自体も "複合言語" で記述ができることになる。
これに "複合マシン" (分散処理、グリッドコンピューチング、P2P ...) といった要素も加わると、3C (3つの Commpaund) が実現できそうだ。


net で拾った テクノロジーの進化のパターン の画像 ( http://thik.jpn.org/archives/2005/10/_3_3.html )

| | コメント (0) | トラックバック (0)

2008-07-26

Java製拡張コマンド(ExtHelloWorld.java) を改造 (その2)

xfy blog editor から ruby  スクリプトを呼び出す例として、
  - erb を使って九九の表を生成
  - ruby/tk で ファイル選択ダイアログ、色選択ダイアログを開く
をつくってみた。どちらも問題なく xfy blog editor から動作するようだ。
- http://homepage2.nifty.com/youichi_kato/src.html
>  ExtHelloWorld.java の改造を登録 -002(2008-07-26)

xfy/xvcd でダイアログをつくるより、ruby/tk でダイアログをつくるほうが簡単な場合もありそうだ。

Chooser01

上のスクリーンショットは、chooser.rb を xfy blog editor から実行したものだ。
左上の小さな winodow が、ruby/tk でのメインウインドウだ。
[open] ボタンをクリックして、 ファイル選択ダイアログを出している最中の画面だ。
MacOSX(10.5) で動作させており、MacOS の通常のファイル選択ダイアログが出ている。

次は ruby の代わりに jruby を使うことで、 xfy blog editor 中の java クラスを利用することができるかを試す予定。

| | コメント (0) | トラックバック (0)

2008-07-22

ExtHelloWorld.java の改造を登録 (2008-07-22)

- http://homepage2.nifty.com/youichi_kato/src.html
  ProcessBuilder 生成を
  Process p = new ProcessBuilder(command).start();
 ー>
        Process p = new ProcessBuilder("ruby", command).start();
   と書き換えることで、 フルパス指定した ruby スクリプトを実行し、その stdout 出力を blog 記事取り込めた。
    Screen01

次はファイル選択ダイアログを出すようにしよう。
// ダイアログは java で書く? ruby で書く?

さらに ruby から ImageMagic を呼び出すことで、画像処理 (サムネイル作成など)のプラグインを ruby スクリプトで作れそうな気もする...

| | コメント (0) | トラックバック (0)

2008-07-18

Java製拡張コマンド(ExtHelloWorld.java) を改造

Screnn00

- http://xfy.justblog.jp/labs/2008/07/hello-worldjava.html
> xfy 実験室: お約束の『Hello World』で、Java製拡張コマンドを理解する
として、 java で xfy blog editor の拡張コマンドを作成する方法の解説があった。

ExtHelloWolrd.java を改造して、外部コマンドを実行して、その結果を はりつけられるように変更してみた。
- http://homepage2.nifty.com/youichi_kato/src.html
    ExtHelloWorld.java の改造を登録 (2008-07-18)
mac 上の javase6 で作業した。build.xml がそのままでは動作しなかった。
javac のオプションに 1.6 を指定するとエラーになるようだ。

改行の扱い、漢字コードの扱い、エラー処理などができていないが、
"date" や "ls" なんてコマンドの出力結果を取り込むことはできる。

bat ファイル、shell スクリプト、ruby スクリプトを実行するようにすれば、
これらのスクリプトで 拡張コマンドをつくれるようになるかもしれない。

xfy/xvcd/java という組み合わせあら、xfy/xvcd/ruby という組み合わせでのプログラミングへの道が開かれつつあるかもしれない。
(ruby の代わりに jruby, scala, factor など 様々な言語の可能性も...)

| | コメント (0) | トラックバック (0)

2008-06-21

colorFlow サンプルについて

xfy/xvcd のサンプルに Colorflow というものがあるのを知った。

Colorflow
でも残念なことに私の環境では 操作をしているとフリーズしてしまうし、CPU も 40 % を消費続けたりする。

Colorflowcpu
ColorFlow.xml の中を読んでみたがすぐには理解できない。
面倒なので、
- https://www.xfytec.com/community/modules/newbb/viewtopic.php?topic_id=379&forum=17&lang=ja
> / 日本語フォーラム / プログラミング相談室 / サンプル ColorFlow がフリーズする
として質問を投稿した。

firefox の piclin のような画像閲覧ができるものを xfy/xvcd で作り上げた方が既にいればぜひ 教えてください。

# 今日は なんとか iBookG4 が起動したので、blog 書き込みが出来た。
# 次の書き込みが 何時出来るかは全く判らない...

| | コメント (0) | トラックバック (0)

2008-06-08

xfy/xvcd からの他言語を利用する

次のページから katoy の homepage へ link が張られていることを発見。
- http://rikima.dip.jp:8081/rikima/xfy/copy_of_efunction-range-set95a26570/
> > xfy/plugin XPath拡張関数 efunction:replace-all関数 — RIKIMA.com

> ... * ほんとは、katoyさんのように、jythonで、正規表現関連の文字列操作関数をテキスト表示で与えて、結果を得るようにするべきだけど、それは、またの機会に ...

そのページに comment を書こうとおもったが、ユーザー登録が必要で、すぐには書き込めないので、ここにコメントを書いておく。

--- ここから ---
xfy の plugin を 作るのが面倒なので試していませんが、
jruby, scale などの script 文字列や、script ファイル名 を xvcd で記載して、その評価結果を得るような機能が標準提供されれば便利になるだろうなと思っています。
(ruby スクリプトの呼び出し例を 試作したことはある)
最近は、 Processing に凝ってます。この画面出力を xfy 画面にコンパウンドドキュメント風に埋め込めたらなよいのにとも思ってますが、どうすれば実現できるかがわかりません。
xfy に canvas のような概念があればよいのかもしれません。
--- ここまで ---

| | コメント (0) | トラックバック (0)

2008-01-05

xfy 1.5 の マニュアルページ中の項目一覧を graphviz で png にしてみた

以前に xfy のマニュアル目次を freemind にしてみたことがある。
  - http://youichi-kato.cocolog-nifty.com/blog/2006/08/xfy_freemind__efe9.html
    > > katoy: cocolog: xfy のオンラインマニュアルの 目次を freemind で作ってみた

  - http://youichi-kato.cocolog-nifty.com/blog/2007/08/xfy15_8c56.html
    > > katoy: cocolog: xfy1.5 マニュアルのマインドマップ (デスティネーション)
  - http://youichi-kato.cocolog-nifty.com/blog/2007/08/xfy15_d9cd.html
    > > katoy: cocolog: xfy1.5 マニュアルのマインドマップ (チュートリアル)

そのときは、すべて手動で作業した。
マニュアル更新毎に 手動での作業するのは大変なので プログラムで生成できないかと思案中。
手始めに、grpahviz に食わせる dot 形式ファイルをつくるプログラムを作成してみた。
(項目一覧とその親子関係の取得ができるようになったら、次は これを freemidn 形式出力すればよいはず)

以下に
- graphviz で png 画像に変換した例
- dot ファイル生成プログラム (ruby で作成)
を示す。


Xfyapidot0

Xfyapidot1

Xfyapidot2

画像データサイズが 14M と大きくなり過ぎ。また 文字も重なってしまっている。

$ cat link2.rb

# xfy マニュアルの項目関連の dot ファイルを生成する
#  utf8
# 2008-01-04 katpy  試作
#
# dot ファイルの生成:
#   $ ruby link2.rb > 1.dot
#
# dot ファイルから png を生成する方法:
#   $ dot -KENG -Tpng 1.dot -o 1.png
#      (ENGは次の中から:  circo dot fdp neato nop nop1 nop2 twopi)
#   $ twopi -Tpng 1.dot -o 1.png
#-------------------------------------------------
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'cgi'
require 'set'
require 'pathname'
require 'pp'

$KCODE="utf8"

class GenDot
  def initialize
    # 処理した URLをコレクションして、同じ node を複数 生成しないようにする
    @visitedURL = Set.new;
    @dquot ='"'   # node 名の囲み文字
  end

  def start
    puts 'digraph "g" {'
    puts '  ranksep=6;'       # 要 調整
    # puts '  ratio=auto;'
  end

  def end
    puts '}'
  end

  def visit(fileName, rootNode="")
    doc = Hpricot(File.read(fileName))
    docTitle = (doc/'title').inner_text
    @visitedURL.add(fileName)
    puts "#{@dquot}#{rootNode}#{@dquot} ->#{@dquot}#{docTitle}#{@dquot}"  if !(rootNode== "")

    # <a href ...> を処理する
    (doc/'a[@href]').each { |a|
      href = a.attributes['href'].strip
      toText = CGI.unescapeHTML(a.inner_text).strip

      begin
        # file自身中への リンク
        if (href.index("#") == 0)
          toLinkFile = fileName
          toURL = fileName + href
          # xfy マニュアル中のナビゲートリンクは無視する
          if !(toText=="目次へ") && !(toText =="このページの先頭へ")
            if !@visitedURL.include?(toURL)
              puts "  #{@dquot}#{docTitle}#{@dquot} ->#{@dquot}#{toText}#{@dquot}"
              @visitedURL.add(toURL)
            end
          end
        elsif (href.index("http") == 0)
          # ネット上へのリンク (http:, https)
          puts "  #{@dquot}#{docTitle}#{@dquot} ->#{@dquot}#{toText}#{@dquot}"
          @visitedURL.add(href)
        else
          # 相対指定のリンクなら、再帰処理する (# 指定は無視
          # 相対パスを絶対パスに変換して @visitedURL への登録内容を正規化する
          toLinkFile = File.dirname(fileName) + "/" + URI.split(href)[5]
          p = Pathname(toLinkFile)
          toURL = p.realpath.to_s
          if !@visitedURL.include?(toURL)
            toTitle = visit(toURL)
            puts "  #{@dquot}#{docTitle}#{@dquot} ->#{@dquot}#{toTitle}#{@dquot}"
          end
        end
      rescue => exception
        $stderr.puts exception
      end
    }
    docTitle   # このファイルの title を返す
  end
end

# 処理するファイルを列挙する
files = [
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/app/client/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/app/debugger/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/app/sdesigner/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/app/vdesigner/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/app/xvcd2jar/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/avcchart/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/avcdatagrid/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/avcxychart/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/calclet/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/cml/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/manifest/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/mathml/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/resource/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/svg/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/ui/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/wsr/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/xfr/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/xfyblogeditor/index.html",
"/Users/kato/Desktop/xfy-be1_5-070322 Folder/doc/jp/manual/compo/xhtml/index.html",
]

# ---- Main -----
gendot = GenDot.new
gendot.start
files.each {|f| gendot.visit(f, "root") }
gendot.end

#--- End of File ---

| | コメント (0) | トラックバック (0)

2008-01-02

Rails 2.0.2 は 5 行でアプリ雛形作成/起動ができる!

Rails 2.0.2 は、5 行でアプリ雛形作成/起動ができる!

- http://uenon.jp/blog/archives/2007/12/rails-20flex-3-beta3restful-1-1.html
> > Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 1 - FleFla

>rails -d sqlite3 rails2restful
>cd rails2restful
>rake db:create
>ruby script\generate scaffold bookmark name:string url:string
>rake db:migrate

- http://d.hatena.ne.jp/takahashim/20071223
> > 30秒でRails 2.0.2が試せるTodo Listサンプル

$ rails todo
$ cd todo
$ ruby script\generate scaffold Todo title:string body:text done:boolean due:datetime
$ rake db:migrate
$ ruby script\server

# ただし、現状では、上記方法で作成アプリは、頻繁に "Couldn't find Todo with ID=0" のエラーが出る。
# 2.0.2 のバグ? ID=0 でデータを検索しにいってエラーになっている。
# 訂正方法は不明...

rails 2.0.2 については,次の記事も素晴らしい!
- http://www.akitaonrails.com/2007/12/10/the-first-rails-2-0-screencast-english
> > %w(Akita On Rails) * 2.0 - The First Rails 2.0 Screencast (english)

- http://www.akitaonrails.com/2007/12/12/rolling-with-rails-2-0-the-first-full-tutorial
> > %w(Akita On Rails) * 2.0 - Rolling with Rails 2.0 - The First Full Tutorial - Part 1

ともかく、Rails 2.0.2 では、DBを利用するアプリ雛形が簡単に作れるということだ。
xfy/xvcd でも、こんな風に プラグインの雛形がつくれると良い。
(数行の設定ファイル + 数コマンドの実行で、xvcd, java, build を生成し、sqllite か derby を
利用するプラグインの comile/deploy まで行えばよいだろう。
アプリの画面レイアウトは、GUI をつかって変更ができたり、migrate で変更履歴を管理できると良さそう)

xfy blog editor 用のプラグインも、 DB と連動するものが簡単に作れると面白いだろう。
(投稿記事/投稿材料素材を DB 管理する以外にも DB 利用の方法はあるだろう)
DB との連携だけでなく、WebService との連携 plugin の雛形も同様の手軽さで可能にしたい。
さらには、on-demand で xfy plugin の自動生成/インストールができたりすると、
インターラクティブなマッシュアップ画面構築が可能になる。

rails でつくった server アプリと通信をできる xfy/xvcd クライアントを簡単生成するという
方向も考えられる。
rails アプリを restful で作成すれば、xfy/xvcd からは扱いが簡単。
rails では作れない GUI を xfy/xvcd で提供するという形で rails + xfy の協調ができそうだ。

| | コメント (0) | トラックバック (0)

2007-12-30

solr を試すが、rails2.0.2 でクライアントが動作せず。

solr を試すが、rails2.0.2 でクライアントが動作せず。

solr を使って、 xfy の document の全文検索 サーバー、 xfy/xvcd で クライアント
をつくろうと思いたった。

solr 配布物中の rails サンプルクライアントが rails2.0.2 で動作せず...

しかたなく、rails を1.2.6 に戻してみた。

すると、サンプルデモ (trunk/client/ruby/flare での ruby script/server) は動作した。(config/envrionment.rb 中の rail version 指定は編集が必要)

でも、まだ trunk/client/ruby/solr-ruby/examples/delicious_library のデータ登録スクリプトはなぜかエラーが発生するので、検索動作の検証はできていない orz...

- http://lucene.apache.org/solr/tutorial.html
> > Solr tutorial (version 1.2.2007.10.02.22.27.12)

- http://ja.wikipedia.org/wiki/Solr
> > Solr - Wikipedia

- http://www.rondhuit.com/download.html
> > 10分で簡単!RailsとSolrの全文検索デモ構築

| | コメント (0) | トラックバック (0)

2007-10-02

xfy で rake の利用案はあるか?

xfy プラグインをつくる ant の build.xml は結構 複雑だ。
rake で書けば少しは簡単になるかな?

rake + druby で、分散 make もつくれるかな?

- http://www.infoq.com/jp/news/2007/09/fast-ruby-builds-with-buildr
> > InfoQ: Buildr:RubyがJavaより速く構築するとき

このページでは Maven と Buildr について述べられている。

以前に racc を使って 別書式のデータから xvcd を生成することを考えていたが、
rake をつかって xvcd を生成することも面白いかもしれない。
rake で宣言的に書くところは xvcd のテンプレート記述とマッチするかも知れない。

| | コメント (0) | トラックバック (0)

2007-09-24

書籍中のSVG サンプルをxfy に移植中。

書籍 "Svg Essentials" 中のサンプルコード http://examples.oreilly.com/svgess/

  svg_ess_examples/ch11/example_1119a.html
がある。
これを safari で開いたスクリーンショットを示す。
Safarisvg
本当は S/M/L ボタンでシャツのサイズが変わったり、カラーバー操作でのシャツの
色がかわったりするはず。でもなぜか動作しない。

firefox で開くと、

XML パースエラー: 接頭辞の名前空間が定義されていません。
URL: file:///Users/kato/work/src/svg/svg_ess_examples/ch11/shirt_interact.svg
行番号: 154, 列番号: 1:<use xlink:href="#shirt" x="150" y="150"/>
^

のエラーになってしまう。

そこで、xfy/xvcdで真似をして作ってみている。現状はここまで。
Store

S/M/L ボタンクリックでのシャツのサイズ変更、R/G/B 数値編集でのシャツの色変更は
できている。あとは、カラーバーを作る事が残っている。

サンプルでは、javascript で各種動作を記述しているが、xfy/xvcd では javascript の代わりに xvcd で記述をする必要がある。
(完全でなくてよいから変換ツールがあるとよいなぁ。すでに誰かが作っている?)

現状の xfy/xvcd コードはこれ。
「store.xml」をダウンロード
「store.xvcd」をダウンロード

| | コメント (0) | トラックバック (0)

2007-09-22

xfy で json も扱いたい

xml を返すような rest な web-service は沢山ある。
それを xfy/xvcd で扱うには、つぎのようにする。

   <xvcd:variable name="ws" select="サービスのURL"/>
   <xvcd:apply-templates select="function:document($ws)"/

返信される XML の構造に即した変換template を用意しておけば,それに従った変換が行える。

最近は、XML でなく JSON で結果を返すサービスが増えている。

そんな場合は、JSON->XML 変換があれば、xfy/xvcd でも そのサービスを利用できるようになる。
そんな用途のためのライブラリーがあるようだ。
https://sourceforge.net/project/showfiles.php?group_id=171425
> > Json-lib

> ...
> Json-lib is a java library for transforming beans, maps, collections, java arrays and XML to JSON and back again to beans and DynaBeans. It is based on the work by Douglas Crockford in http://www.json.org/java.
>...

でも ここでは、ruby で json を返す web-service の利用例を示そう。
ruby では json ライブラリーで json データを扱える。(gem で install できる)

$ cat zip.rb
# See http://groovetechnology.co.jp/webservice/zipsearch/index.html

$KCODE="u"
require 'rubygems'
require 'json'
require 'net/http'
require 'pp'

def zip_code(code)
   url = "http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch?zipcode=#{code}"
   resp = Net::HTTP.get_response(URI.parse(url))
   data = resp.body

   # we convert the returned JSON data to native Ruby
   # data structure - a hash
   result = JSON.parse(data)
   return result
end

pp zip_code(ARGV[0])

実行してみる。
$ ruby zip.rb 1000001 | nkf -s
{"zipcode"=>
  {"a1"=>
    {"city"=>"千代田区",
     "town_yomi"=>"チヨダ",
     "prefecture"=>"東京都",
     "zipcode"=>"1000001",
     "city_yomi"=>"チヨダク",
     "prefecture_yomi"=>"トウキョウト",
     "town"=>"千代田"}},
"office"=>{}}

他にも json を返すサービスにはこんなものもある。

http://www.mashupedia.jp/webapis/view/221
星座占い

http://www.itarchitect.jp/print/?menu3=13821
Yahoo 検索サービス

| | コメント (0) | トラックバック (0)

2007-09-17

文字の筆順の SVG (アニメーション) データはないのかなぁ

文字の筆順の SVG (アニメーション) データはないのかなぁ

SVG の利用法でおもしろいものがないかと思案中。

筆順情報なんか面白いと思う。
web 上にはいろいろと情報はあるみたい。

- http://www.a-chi.jp/htj_hirakana.html
> > 筆順教室は「ひらかな・カタカナ・数字・アルファベット」が分かる筆順サイトです。

- http://ksbookshelf.com/DW/Hitsujun/index.html
> > K'sBookshelf 辞典・用語 漢字筆順字典

- http://kakijun.main.jp/main/start.html
> > 漢字の正しい書き順の「スタートページ」

- http://ascii.jp/elem/000/000/047/47392/
> > カシオ、“筆順大辞典”を収録した電子辞書を発売

xfy + xvcd + svg で 筆順練習/テストの為のアプリがつくれるかなぁ。

| | コメント (0) | トラックバック (0)

2007-09-11

FizzBuzz 問題を xfy/xvcd で

Buzz
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
 どうしてプログラマに・・・プログラムが書けないのか?
にある FizzBuzz 問題を xfy/xvcd で書いてみた。

FizzBuzz 問題とは

1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

xfy で buzz.xml を開けばよい。画面一番上の数値は編集可能だ。リアルタイムに結果が更新される。

$ cat buzz.xml
<?xml version="1.0" encoding="UTF-8" ?>
<?com.xfy vocabulary-connection href="buzz.xvcd" ?>
<sample:item xmlns:sample="http://xmlns.xfy.com/sample/buzz">100</sample:item>

$ cat buzz.xvcd
<?xml version="1.0" encoding="UTF-8"?>
<xvcd:xvcd
  version="1.0"
  xmlns:xvcd="http://xmlns.xfy.com/xvcd"
  xmlns:sample="http://xmlns.xfy.com/sample/buzz"
  xmlns="http://www.w3.org/1999/xhtml">

<!--
  See - http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
        どうしてプログラマに・・・プログラムが書けないのか?

      - http://d.hatena.ne.jp/mhrs/20070515/p1
        MORIYAMA Hiroshi's Diary - XSLTでFizz-Buzz
-->
<!--
      2007-09-11 katoy
      此処のコードだと 140 で stackoverflow になる...
      stackoverflow にならない方法は?
-->

<xvcd:vocabulary name="pyr" match="sample:item" call-template="root"/>

<xvcd:template name="root">
  <html>
    <head><title>BUZZ</title></head>
    <body>
      Input Number?:<xvcd:text-of select="./text()" filler="0"/>
      <pre>
      <xvcd:call-template name="buzz">
        <xvcd:with-param name="n" select="./text()"/>
      </xvcd:call-template>
      </pre>
    </body>
  </html>
</xvcd:template>

<!-- 再帰処理のルーチン  -->
<xvcd:template name="buzz">
  <xvcd:param name="n" />

  <xvcd:choose>
    <xvcd:when test="$n &gt; 1">
      <xvcd:call-template name="buzz">
        <xvcd:with-param name="n" select="$n - 1"/>
      </xvcd:call-template>
    </xvcd:when>
  </xvcd:choose>

  <xvcd:choose>
    <xvcd:when test="$n mod 15 = 0">
      <xvcd:value-of select="'FizzBuzz'"/>
    </xvcd:when>
    <xvcd:when test="$n mod 3 = 0">
      <xvcd:value-of select="'Fizz'"/>
    </xvcd:when>
    <xvcd:when test="$n mod 5 = 0">
      <xvcd:value-of select="'Buzz'"/>
    </xvcd:when>
    <xvcd:otherwise>
      <xvcd:value-of select="$n"/>
    </xvcd:otherwise>
  </xvcd:choose>
  <br/>
</xvcd:template>

</xvcd:xvcd>

| | コメント (0) | トラックバック (0)

2007-09-09

xfy/xvcd の svg でタイマーイベントを扱う

Svgtimer

xfy のダウンロードサイト
https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=131
にある "xfy での MP3 プレーヤ" では、SVG での文字表示を タイマーを使って表示更新しているようだ。

これを参考にして、単純なストップタイマーを作ってみた。
(本当に単純で、単に現在の時間を 0.1 秒単位で表示更新するのを Stop/Start できるだけのもの)

これで マウスイベントも、タイマーも扱う実験ができたことになる。
簡単なゲームをつくれるようになるかな?

$ cat 4.xml
<?xml version="1.0" encoding="UTF-8" ?>
<?com.xfy vocabulary-connection href="4.xvcd" ?>
<sample:item xmlns:sample="http://xmlns.xfy.com/sample/pry">10</sample:item>

$ cat 4.xvcd
<?xml version="1.0" encoding="UTF-8"?>
<xvcd:xvcd
  version="1.0"
  xmlns:xvcd="http://xmlns.xfy.com/xvcd"
  xmlns:function="http://xmlns.xfy.com/function"
  xmlns:ctrl="http://xmlns.xfy.com/controls"
  xmlns:instruction="http://xmlns.xfy.com/instruction"
  xmlns:sample="http://xmlns.xfy.com/sample/pry"
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns="http://www.w3.org/1999/xhtml">

<xvcd:vocabulary name="timer" match="sample:item" call-template="root"/>

<xvcd:variable name="time-format" select="'yyyy-MM-dd HH:mm:ss:'"/>
<xvcd:variable name="time-interval" select="'100'"/>
<xvcd:variable name="style" select="'fill:blue;font-size:24.0'"/>

<xvcd:user-data name="timer" value="start"/>
<xvcd:user-data name="time" value="{function:now($time-format)}000"/>

<xvcd:template name="root">
  <html>
    <head>
      <title>time-event</title>
    </head>
    <body>

      <ctrl:trigger>
        <ctrl:label><xvcd:value-of select="xvcd:user-data('timer')"/></ctrl:label>
        <xvcd:action event="ctrl:triggered">
          <instruction:choose>
            <instruction:when test="xvcd:user-data('timer') = 'stop'">
              <xvcd:set-user-data name="timer" value="start"/>
            </instruction:when>
            <instruction:otherwise>
              <xvcd:set-user-data name="timer" value="stop"/>
              <xvcd:set-user-data name="time"
                value="{concat(function:now($time-format), function:now('SSS', $time-interval))}" />
            </instruction:otherwise>
          </instruction:choose>
        </xvcd:action>
      </ctrl:trigger>

      <div>
        <xvcd:call-template name="svg-timer"/>
      </div>
    </body>
  </html>
</xvcd:template>

<xvcd:template name="svg-timer">
  <xvcd:variable name="text-val">
    <xvcd:choose>
      <xvcd:when test="xvcd:user-data('timer') = 'stop'">
        <xvcd:value-of select="concat(function:now($time-format), function:now('SSS', $time-interval))"/>
      </xvcd:when>
      <xvcd:otherwise>
        <xvcd:value-of select="xvcd:user-data('time')"/>
      </xvcd:otherwise>
    </xvcd:choose>
  </xvcd:variable>

  <svg:svg width="400" height="60">
    <svg:g>
      <svg:text x="5" y="25" style="{$style}">
        <xvcd:value-of select="$text-val"/>
      </svg:text>
    </svg:g>
  </svg:svg>
</xvcd:template>

</xvcd:xvcd>

| | コメント (0) | トラックバック (0)

ピラミッドを作る (xvcd)

Pry

昨日の ピラミッドを作る (xslt) を xfy/xvcd 用に、変更してみた。
もっと記述は簡潔にできるとは思う。
でも xslt, xvcd いずれにしても ruby を始めとした他のスクリプト言語での回答のように短くかくことは無理だなぁ...
xvcd でループを書く場合は、ruby で書いて 結果だけ xvcd から呼び出すのが実用的とおもう。

$ cat 3.xml
<?xml version="1.0" encoding="UTF-8" ?>
<?com.xfy vocabulary-connection href="3.xvcd" ?>
<sample:item xmlns:sample="http://xmlns.xfy.com/sample/pry">10</sample:item>

$ cat 3.xvcd
<?xml version="1.0" encoding="UTF-8"?>
<xvcd:xvcd
  version="1.0"
  xmlns:xvcd="http://xmlns.xfy.com/xvcd"
  xmlns:sample="http://xmlns.xfy.com/sample/pry"
  xmlns="http://www.w3.org/1999/xhtml">

<xvcd:vocabulary name="pyr" match="sample:item" call-template="root"/>

<xvcd:template name="root">
  <html>
    <head><title>ピラミッド</title></head>
    <body>
      ピラミッドの高さは?:<xvcd:text-of select="./text()" filler="0"/>
      <pre>
    <xvcd:variable name="stars">
      <xvcd:call-template name="stars-str">
        <xvcd:with-param name="n" select="./text()"/>
      </xvcd:call-template>
    </xvcd:variable>
        <xvcd:call-template name="pyr">
          <xvcd:with-param name="n" select="./text()" />
          <xvcd:with-param name="padding" select="''" />
          <xvcd:with-param name="stars" select="$stars" />
        </xvcd:call-template>
      </pre>
    </body>
  </html>
</xvcd:template>

<!-- 再帰処理のルーチン  -->
<xvcd:template name="stars-str">
  <xvcd:param name="n" />
  <xvcd:if test="$n = 1">
    <xvcd:text>*</xvcd:text>
  </xvcd:if>
  <xvcd:if test="$n &gt; 1">
    <xvcd:call-template name="stars-str">
      <xvcd:with-param name="n" select="$n - 1"/>
    </xvcd:call-template>
    <xvcd:text>**</xvcd:text>
  </xvcd:if>
</xvcd:template>

<!-- 再帰処理のルーチン  -->
<xvcd:template name="pyr">
  <xvcd:param name="n" />
  <xvcd:param name="padding" />
  <xvcd:param name="stars" />

  <xvcd:if test="$n &gt;= 1">
    <xvcd:call-template name="pyr">
      <xvcd:with-param name="n" select="$n - 1"/>
      <xvcd:with-param name="padding" select="concat($padding,' ')" />
      <xvcd:with-param name="stars" select="substring($stars, 1, string-length($stars) -2)" />
    </xvcd:call-template>
<!-- '&#xa' -->
    <xvcd:value-of select="concat($padding, $stars, $padding)"/>
    <br/>
  </xvcd:if>
</xvcd:template>

</xvcd:xvcd>

| | コメント (0) | トラックバック (0)

2007-09-08

ピラミッドを作る (xslt)

- http://ja.doukaku.org/8/
> > ピラミッドを作る どう書く?org
を xfy/xvcd でかいてみようと思った。

その前に xslt で書いてみた。
動作させるには 2.xml を firefox や safari で open すればよい。

$ cat 2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="2.xsl" ?>
<ex1:input xmlns:ex1="http://www.example.com/ex1">10</ex1:input>

$ cat 2.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ex1="http://www.example.com/ex1"
  xmlns="http://www.w3.org/1999/xhtml">

<xsl:template match="/">
  <html>
    <head><title>ピラミッド</title></head>
      <xsl:variable name="stars">
        <xsl:call-template name="stars-str">
      <xsl:with-param name="n" select="ex1:input"/>
    </xsl:call-template>
      </xsl:variable>

    <body>
      <pre>
        <xsl:call-template name="pyr">
        <xsl:with-param name="n" select="ex1:input" />
          <xsl:with-param name="padding" select="''" />
          <xsl:with-param name="stars" select="$stars" />
        </xsl:call-template>
      </pre>
    </body>
  </html>
</xsl:template>

<!-- 再帰処理のルーチン  -->
<xsl:template name="stars-str">
  <xsl:param name="n" />
  <xsl:if test="$n = 1">
    <xsl:text>*</xsl:text>
  </xsl:if>
  <xsl:if test="$n &gt; 1">
    <xsl:call-template name="stars-str">
      <xsl:with-param name="n" select="$n - 1"/>
    </xsl:call-template>
    <xsl:text>**</xsl:text>
  </xsl:if>
</xsl:template>

<!-- 再帰処理のルーチン  -->
<xsl:template name="pyr">
  <xsl:param name="n" />
  <xsl:param name="padding" />
  <xsl:param name="stars" />

  <xsl:if test="$n &gt;= 1">
    <xsl:call-template name="pyr">
      <xsl:with-param name="n" select="$n - 1"/>
      <xsl:with-param name="padding" select="concat($padding,' ')" />
      <xsl:with-param name="stars" select="substring($stars, 3, string-length($stars))" />
    </xsl:call-template>

    <xsl:value-of select="$padding"/>
    <xsl:value-of select="$stars"/>
    <xsl:value-of select="$padding"/>
      <xsl:text>&#xa;</xsl:text>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>

ここまで作って疲れてしまった。
xfy/xvcd に変換するのは明日にしよう。

| | コメント (0) | トラックバック (0)

2007-09-02

xfy/xvcd の svg でマウスイベントを扱う

Svgmouse

- https://www.xfytec.com/community/modules/mydownloads/singlefile.php?cid=58&lid=166
> > xfy Community - xfeyes
として、xfy/xvcd で svg を使った描画による xeye アプリの例が公開された。
これをみて svg でマウスイベントを扱う方法が判った。
(徐々に実験を続けて、オセロゲームの盤面を扱えるようになろうと思う)

そこで、
 - http://www.nagao.nuie.nagoya-u.ac.jp/~yamamoto/svg2/index.html
 > > SVGの勉強会
にある
  svgsample7.svg
  >> マウスを追いかけるサンプルです。
を xfy/xvcd で真似してみた。
svg 全体では、マウス移動イベントを扱い、
描画する円では、マウスクリックとドラッグイベントを扱うようにした例を作成してみた。

$ cat xfeye.xml
<?xml version="1.0" encoding="UTF-8"?>
<?com.xfy vocabulary-connection href="xfeyes.xvcd" ?>
<eyes:root xmlns:eyes="http://xmlns.xfytec.com/samples/xfeyes">
    <eyes:eyes>
    </eyes:eyes>
</eyes:root>

$ cat xfeye.xvcd
<?xml version="1.0" encoding="UTF-8"?>
<!--
   2007-09-02 katoy

   xfy/xvcd をつかって
     http://www.nagao.nuie.nagoya-u.ac.jp/~yamamoto/svg2/index.html
   にある
     http://www.nagao.nuie.nagoya-u.ac.jp/~yamamoto/svg2/svgsample7.svg
   と同様のものを実装した。
   マウスの移動とクリックに反応して、SVG 描画が変化する。
-->

<xvcd:xvcd version="1.0"
    exclude-result-prefixes="#all"
    xmlns:eyes="http://xmlns.xfytec.com/samples/xfeyes"
    xmlns:function="http://xmlns.xfy.com/function"
    xmlns:event="http://xmlns.xfy.com/event"
    xmlns:inst="http://xmlns.xfy.com/instruction"
    xmlns:xvcd="http://xmlns.xfy.com/xvcd"
    xmlns:svg="http://www.w3.org/2000/svg">

    <!-- 定数 -->
    <xvcd:variable name="WIDTH" select="'400'" />
    <xvcd:variable name="HEIGHT" select="'300'" />
    <xvcd:variable name="radiusS" select="'30'" />
    <xvcd:variable name="COLOR0" select="'red'" />
    <xvcd:variable name="COLOR1" select="'blue'" />

    <!-- 円の中心位置, 色 -->
    <xvcd:user-data name="X" value="{$WIDTH * 0.5}" />
    <xvcd:user-data name="Y" value="{$HEIGHT * 0.5}" />
    <xvcd:user-data name="COLOR" value="{$COLOR0}" />

    <xvcd:vocabulary name="xfeyes" match="eyes:root" call-template="root" />

    <!-- ===== コマンド  ========================== -->
    <xvcd:command name="Move">
        <inst:param name="event"/>
        <xvcd:set-user-data name="X" value="{$event/event:*/@component-x}" />
        <xvcd:set-user-data name="Y" value="{$event/event:*/@component-y}" />
    </xvcd:command>

    <xvcd:command name="ChangeColor">
        <inst:param name="event"/>
        <inst:choose>
            <inst:when test="xvcd:user-data('COLOR')=$COLOR0">
                <xvcd:set-user-data name="COLOR" value="{$COLOR1}" />
            </inst:when>
            <inst:otherwise>
                <xvcd:set-user-data name="COLOR" value="{$COLOR0}" />
            </inst:otherwise>
        </inst:choose>
    </xvcd:command>

    <!-- ==== テンプレート =========================== -->
    <xvcd:template name="root">
        <svg:svg width="{$WIDTH}" height="{$HEIGHT}">
            <!-- マウス移動 -->
            <xvcd:action event="event:mouse-moved">
                <inst:param name="event:event" />
                <inst:call name="Move">
                    <inst:with-param name="event" select="$event:event"/>
                </inst:call>
            </xvcd:action>
            <xvcd:call-template name="draw" />
        </svg:svg>
    </xvcd:template>

    <xvcd:template name="draw">
        <!-- 円の表示 -->
        <svg:g>
            <svg:circle cx="{xvcd:user-data('X')}" cy="{xvcd:user-data('Y')}" r="{$radiusS}"
                style="fill:{xvcd:user-data('COLOR')};
                stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:2;stroke-linecap:butt;
                stroke-linejoin:miter;fill-opacity:1;
                fill-rule:nonzero;">
                <!-- マウスクリック -->
                <xvcd:action event="event:mouse-pressed[@button=1]">
                    <inst:param name="event:event" />
                    <inst:call name="ChangeColor">
                        <inst:with-param name="event" select="$event:event"/>
                    </inst:call>
                <!-- マウスドラッグ -->
                </xvcd:action>
                    <xvcd:action event="event:mouse-dragged">
                        <inst:param name="event:event"/>
                    <inst:call name="Move">
                        <inst:with-param name="event" select="$event:event"/>
                    </inst:call>
                </xvcd:action>
            </svg:circle>
        </svg:g>
    </xvcd:template>

</xvcd:xvcd>

| | コメント (0) | トラックバック (0)

郵便番号検索ページをプログラムから利用してみる(その2)

前回は、結果を cosole に出していた。
xfy/xvcd で利用するには、xml 形式で出力したほうが便利である。
そこで、rss 形式出力するように変更した。

$ ruby zipcode-rss.rb "100-0002" | nkf -s
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>zipcode</title>
    <link>http://www.excite.co.jp/postcode/</link>
    <description>search zipcode</description>
    <item>
      <title>100-0002</title>
      <link>http://www.excite.co.jp/postcode/list/1000002.html</link>
      <description>1, 東京都 千代田区  皇居外苑</description>
      <pubDate>Sun, 02 Sep 2007 12:41:33 +0900</pubDate>
    </item>
  </channel>
</rss>

下に ruby コードを示す。
require 'kconv' を使った 最後の行の .to_s.toutf8 をなくせれば、jruby でも動作するのだが...。
toutf8 をやめると、私の環境では、shift_jis で出力されてしまう...

# excite の郵便番号検索ページを ruby から利用する。
# 検索結果の最初のページ(50件まで) 内容を rss にする。
#   useage: ruby zupcode-rss.rb keyword
#
#   キーワードには、 住所の一部、郵便番号の一部 を指定できる。
#   space で区切って、複数を指定することも可能。
#
# keyword ='赤坂ミッドタウン・タワー(1階)'
# keyword ='100-0002'

$KCODE = "utf-8"

require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'rss'
require 'kconv'

# 郵便番号検索ページの URL
url = 'http://www.excite.co.jp/postcode/'
rdf = 'zipcode.rdf'

keyword = ARGV[0]

doc = Hpricot(open('http://www.excite.co.jp/postcode/search/?keyword=' + keyword))

# rss を生成する
rss = RSS::Maker.make("2.0") { |maker|
  maker.channel.about = rdf
  maker.channel.title = "zipcode"
  maker.channel.description = "search zipcode"
  maker.channel.link = url

  doc.search('//table[4]/tr') { |tr|
    address1 = tr.search('td[1]/font/text()').to_html
    address2 = tr.search('td[1]/text()').to_html
    zipcode = tr.search('td[2]/b/text()').to_html
    if (address2 != "") then
      item = maker.items.new_item

      item.date = Time.new()
      item.title = zipcode
      item.description = address1 + address2
      tr.search('td[4]/font/a').each {|e|
        item.link = 'http://www.excite.co.jp' + e.attributes['href']
      }
    end
  }
}

puts rss.to_s.toutf8
# open(rdf, 'w') {|file|
#  file.write(rss.to_s.toutf8)
#}
#--- End of File ---

| | コメント (0) | トラックバック (0)

2007-08-18

xfy でリバーシゲームをつくってみないか(その3)

http://homepage2.nifty.com/youichi_kato/src.html
リバーシゲーム
  thello232.tgz  (書籍のjavaコード)
  thello-2007-08-18.tgz  修正/変更したもの(2007-08-18)
    スクリーンショット(2007-08-11)
として、書籍 "リバーシのアルゴリズム" の java コードを置いた。

これは GUIでなく、コンソールで動作する。

Console

java コードの整理と http://sealsoft.jp/thell/book_errata.html(書籍の訂正記事ページ) の内容を反映してある。
# 書籍中では、コードは GPL とすることが記載されている。

CGI として使えるようにエンジンを構成し、xfy や ブラウザから利用できるようにする予定である。
(打ち手のリストを与えると、盤面内容を返す or 思考リーチンによる次の打ち手を返す
といった web-service か ローカルなアプリケーションをつくる)

| | コメント (0) | トラックバック (0)

2007-08-16

xfy でリバーシゲームをつくってみないか(その2)

Reversi

svg で オセロ(リバーシ)の画面材料を作ってみた。
マウスでクリックしたら、アクションを起動させたいが、どうすべきなのかが不明。

- http://www.xfy.com/jp/manual/compo/svg/
> > SVGコンポーネント ヘルプ
のオンラインヘルプなどにも説明が見当たらない orz...

$ cat reversi.xvc

<?xml version="1.0"?>
<?com.xfy vocabulary-connection href="reversi.xvcd" ?>
<test:root version="0.1" xmlns:test="http://xmlns.xfy.com/community/samples/test">
</test:root>

$ cat reversi.xml

<?xml version="1.0" encoding="UTF-8"?>

<xvcd:xvcd version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xvcd="http://xmlns.xfy.com/xvcd"
xmlns:instruction="http://xmlns.xfy.com/instruction"
xmlns:function="http://xmlns.xfy.com/function"
xmlns:ctrl="http://xmlns.xfy.com/controls"
xmlns:command="http://xmlns.xfy.com/command"
xmlns:svg="http://www.w3.org/2000/svg"

xmlns:test="http://xmlns.xfy.com/community/samples/test"

>

<!-- =====================================================================
    Vocabulary
====================================================================== -->
    <xvcd:vocabulary name="Reversi" match="test:root" call-template="Root" />

<!-- =====================================================================
    Template
====================================================================== -->
    <xvcd:template name="Root">
        <html>
        <head>
        <title>Reversi</title>
        </head>
        <body style="background-color:gray;">

        <div style="padding:5px;">
        </div>

        <div style="padding:5px;">
            <xvcd:call-template name="svg-part"/>
        </div>

        </body>
        </html>
    </xvcd:template>

    <xvcd:template name="svg-part">
      <svg height="240" width="240"
        xmlns="http://www.w3.org/2000/svg">
        <g transform="translate(40 40)">

          <rect x="0" y="0" width="160" height="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;fill-opacity:1;fill:rgb(13.333%,54.51%,13.333%);fill-rule:nonzero" />

          <line x1="20" y1="0" x2="20" y2="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="40" y1="0" x2="40" y2="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="60" y1="0" x2="60" y2="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="80" y1="0" x2="80" y2="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="100" y1="0" x2="100" y2="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="120" y1="0" x2="120" y2="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="140" y1="0" x2="140" y2="160"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />

          <line x1="0" y1="20" x2="160" y2="20"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="0" y1="40" x2="160" y2="40"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="0" y1="60" x2="160" y2="60"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="0" y1="80" x2="160" y2="80"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="0" y1="100" x2="160" y2="100"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="0" y1="120" x2="160" y2="120"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />
          <line x1="0" y1="140" x2="160" y2="140"
            style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter" />

          <g transform="translate(5 -3)">
            <text x="0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">a</text>
            <text x="20.0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">b</text>
            <text x="40.0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">c</text>
            <text x="60.0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">d</text>
            <text x="80.0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">e</text>
            <text x="100.0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">f</text>
            <text x="120.0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">g</text>
            <text x="140.0" y="0.0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">h</text>
          </g>

          <g transform="translate(-15 18)">
            <text x="0" y="0"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">1</text>
            <text x="0" y="20"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">2</text>
            <text x="0" y="40"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">3</text>
            <text x="0" y="60"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">4</text>
            <text x="0" y="80"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">5</text>
            <text x="0" y="100"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">6</text>
            <text x="0" y="120"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">7</text>
            <text x="0" y="140"
              style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:20px;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;"
              xml:space="preserve">8</text>
          </g>

          <g transform="translate(0 160)">
            <circle cx="0" cy="20" r="8"
              style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;fill-opacity:1;fill:rgb(100%,100%,100%);fill-rule:nonzero" />
          <text x="15" y="25"
            style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:16;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;font-size:18px;"
            xml:space="preserve">xx</text>
            <circle cx="50" cy="20" r="8"
              style="stroke-opacity:1;stroke:rgb(100%,100%,100%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;fill-opacity:1;fill:rgb(0%,0%,0%);fill-rule:nonzero" />
          <text x="65" y="25"
            style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:16;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;font-size:18px;"
            xml:space="preserve">yy</text>
            <circle cx="100" cy="20" r="8"
              style="stroke-opacity:1;stroke:rgb(0%,0%,0%);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;fill-opacity:1;fill:rgb(50.196%,50.196%,50.196%);fill-rule:nonzero" />
          <text x="115" y="25"
            style="fill-opacity:1;fill:rgb(0%,0%,0%);font-size:16;writing-mode:lr-tb;font-style:normal;font-weight:normal;text-decoration:none;font-size:18px;"
            xml:space="preserve">zz</text>
          </g>
        </g>
      </svg>
    </xvcd:template>

</xvcd:xvcd>

思考ルーチンは、書籍

で入手済み。
このソースは コンソールで操作するアプリ + 思考ルーチンである。
# java ソースを jruby に書き換えてみたりすると、ruby の勉強になるかもしれない。

思考ルーチンを マウスアクションに応じて xvcd から呼び出すようにするだけで xfy での
リバーシベームがつくれるはずだ。

SVG 上でのマウスクリック補足ができなければ、xhtml の textエリアかリスト選択で
打ち手を指定するようにするかな。

web 上では 次の reversi 情報ページを見つけた。

- http://sealsoft.jp/thell/index.html
> > Thell

- http://www.geocities.jp/krp87930/link/reversi.html
> > リバーシのリンク集

- http://www.cs.ualberta.ca/~mburo/ggsa/ggsa.html
> > GGSA homepage

| | コメント (0) | トラックバック (0)

2007-08-14

xvcd 用のドキュメンテーションツールを作ろう

ruby には RD, rdoc というドキュメンテーションツールがある。
java には javadoc というツールがある。
doxygen という他言語対応のツールもある。

xfy/xvcd のための標準ドキュメンテーションツールはないのか?

なければつくれば良い。
fortran で RD, rdoc を利用した例があるようだ。

- http://www.gfd-dennou.org/arch/prepri/2005/ruby/RDinF90/RDinF90.htm
> > 自動ドキュメント生成システム rdoc と Fotran90 プログラムへの適用例

- http://www.gfd-dennou.org/library/dcmodel/rdoc-dennou/
> > Enhanced version of RDoc Fortran 90/95 parser

xvcd に限定せずに、 xml 中のコメントからドキュメントを生成するツール として
つくりあげればよい気がする。
すでに類似ツールがどこかにないかなぁ。

rdoc は ruby にふくまれているが、RD はそうではない。でも RD も便利そう。
RD のインストール方法は以下が参考になる。

- http://ujihisa.nowa.jp/entry/d23b111db9
> > rubyneko - そろそろrd2texを使ってもいいころ

RD の解説は
- http://jp.rubyist.net/magazine/?0006-RDIntro
> > Rubyist Magazine - RD でも書いてみようか 【第 1 回】 ブロックレベル

RD についての書籍は Rubyを256倍使うための本 魔道編 がある。

さて、どのように作業していけばよいか?

* xvcd に特化しないで、 <!-- --> コメントから document を生成するようにする
* その後、ソース参照もできるように xvcdに特化していく ...

プログラミング言語をつくる場合、動作実装だけでなく、
document システム, unit-test システム, debugger といったものも合わせてリリースされるとよい。そういった仕組みを備えた プログラム言語作成キットみたいなものはないのかなぁ。(
( parser ジェネレータは動作実装をつくるには便利だけど)

 

| | コメント (0) | トラックバック (0)

2007-08-12

ruport で svg グラフを生成

ruport という 表生成のライブラリーを試してみた。( http://rubyreports.org/ )

# xfy/xvcd からの ruby 呼び出しで、ruport をつかって readonly の表
# を生成させようと企んでいるところ。
# html, text, svg, pdf の書式で表を生成できるところが魅了的だ...

rubygems で install したのは次のバージョン:
  ruport (1.0.1)
    A generalized Ruby report generation and templating engine.
  ruport-util (0.7.2)
    A set of tools and helper libs for Ruby Reports

http://rubyreports.org/examples.html にあるサンプルを試す。
SVG Graphs with ruport-util として、 svg 出力の例がある。

日本語を試すが、文字化けする。(firefox での表示)

試しに firefox でなく、xfy (1.5) や safari で表示させてみた。
おお! 日本語が表示された。
でも xfy はグラフの縦軸ラベルの表示位置がずれてるなぁ。orz...

firefox
Firefox

xfy 1.5
Xfy15

safari
Safari_2

以下に ruby コードと、生成されたsvg を示す。

# See http://rubyreports.org/examples.html

require "rubygems"
require "ruport"
require "ruport/util"

$KCODE = 'utf-8'

class GraphReport < Ruport::Report

  renders_as_graph

  def GraphReport::setData(column, lines)
    @@column = column
    @@lines = lines
  end

  def generate
    graph = Ruport::Graph(:column_names => @@column)
    @@lines.each {|key, val|
      graph.add_line val, :name => key
    }
    return graph
  end
end

outname = "foo.svg"
column = %w[a b c d e];
lines = {"あいう"=>[1,2,3,4,5], "bar"=>[11,22,70,2,19]}

GraphReport.setData(column, lines)
GraphReport.generate {|r| r.save_as(outname)}

「foo.svg」をダウンロード

| | コメント (0) | トラックバック (0)

2007-08-11

xfy1.5 マニュアルのマインドマップ (チュートリアル)

今回は、
デスティネーション編
に続けて xfy (xfy1.5) のオンラインマニュアルの xvcd チュートリアル部を freemind にしてみました。

http://homepage2.nifty.com/youichi_kato/src.html
  xfy1.5 マニュアル(デスティネーション, チュートリアル) のマインドマップ
     xfy1.5-tutorial.mm(2007-08-11)
     スクリーンショット(2007-08-11)
     html出力したもの(2007-08-11)

今回も、手作業で作成しました。

xvcd 編集の為のツール (emacs の xvcd-mode とか、xfy での xvcd 編集用テンプレート、ハイライト表示 etc...) が欲しいなぁ。

| | コメント (0) | トラックバック (0)

2007-08-08

xfy1.5 マニュアルのマインドマップ (デスティネーション)

Xfy15destination
xfy (xfy1.5) のオンラインマニュアルの目次の一部を freemind にしてみました。

http://homepage2.nifty.com/youichi_kato/src.html
xfy1.5 マニュアル(デスティネーション) のマインドマップ
  xfy1.5-destination.mm(2007-08-08)
    スクリーンショット(2007-08-08)
  html出力したもの(2007-08-08)

xvcd の template 適用結果として生成する xml (Destination) のマニュアル目次です。

今回は、手作業で作成しました。
xfy の online マニャルの html データを解析して、自動的にfreemind 形式のデータをつくることも可能とおもう。

# xfy1.5 と記載しただけだと、google での xfy での検索に引っかからないので、無理やり xfy の単語を後から追加記入しました。

| | コメント (0) | トラックバック (0)

2007-08-04

xfy で メーラーを作りたい

ruby で gmail アクセスする例がいろいろ web 上にみつかる。
xfy/xvcd で gmail のフロントエンドを書こうかなぁ。(jruby をつかって)

メーラーが一つかければ、mixi アクセス/投稿の plugin も書けるようになるだろう。
gsapce のフロントエンドもかけるようになるだろう。

暗号化とも組み合わせると良い気がする。
でも現時点では xfy plugin における "セキュア"  について情報が不足している気がする。

- http://rubyist.g.hatena.ne.jp/muscovyduck/20070212/p1
> > Rubyist - バリケンのRuby日記 - Gmailでメールを送る

- http://d.hatena.ne.jp/tonocchi/20070502/1178082100
> > じゃばてな - GmailのfeedにアクセスするRuby

- http://genmei.itline.jp/~svx/diary/?date=20050415
> > SVX日記 - Rubyで添付メール送るライブラリ発掘

- http://mono.kmc.gr.jp/~yhara/d/?date=20070405#p02
> > [Sup] Supを適当に日本語対応してみる - Greenbear Diary (2007-04-05)

- http://www.ruby-lang.org/ja/man/?cmd=view;name=OpenSSL%3A%3ACipher%3A%3ACipher
> > Rubyリファレンスマニュアル - OpenSSL::Cipher::Cipher

- http://www.machu.jp/diary/20060727.html#t
> > まちゅダイアリー - irb で覚える共通鍵暗号 (AES)

| | コメント (0) | トラックバック (0)

2007-07-26

ruby で html から rss を生成 (その3)

xfy.com の日本語フォーラムページ https://www.xfytec.com/community/modules/newbb/index.php?cat=3
のページの RSS を生成する CGI を作ってみた。

web server で この cgi を走らせれば、RSS リーダーでフォーラム記事の新着記事をチェックできる。
    xfy-forum.cgi
    xfy-forum_rss.sh
    xfy-forum.rb

の3ファイルから成る。

$ cat xfy-forum.cgi

#!/opt/local/bin/ruby
#----------------------------------------------------
# 2005-05-23 katoy
#
# 動作内容:
#   RSS データ生成には多少時間がかかります。そこで、生成したデータは rss.xml として
#   保存しています。(rss.xml の encoding は UTF-8 です。)
#
#   RSS データ取得要求がきた場合、この rss.xml が作成されたのが 30 分以内なら、
#   rss.xml をそのまま返して、処理を終了します。
#   そうでない場合は、投稿データをスキャンして、RSS を生成し、rss.xml として保存します。
#   その後 生成した rss.xml を返して、処理を終了します。
# 参考:
#     "rss  で RSS 1.0 生成"   http://dontstopmusic.no-ip.org/diary/20040221.html
#   記事に記載されているコードをベースにしています。
#----------------------------------------------------

require 'rss/1.0'
require 'kconv'
require 'date'
require 'cgi'

$NOW_TIME = Time.now  # 現在の時刻
#-------------------------
def needUpdateCache(file)
  if FileTest.exist?(file)
    mtime = File::stat(file).mtime # 最終更新時刻
    return ($NOW_TIME - mtime).divmod(60)[0] > 30  # 作成が 30 分より前なら、再作成する
    return true
  end
  return true
end
#---------------
RSS_CACHE = "/Users/kato/Sites/xfy-forum.rss"   #-- EDIT POINT

print "Content-type: text/xml; charset=UTF-8¥n¥n"

if needUpdateCache(RSS_CACHE)
  system('./xfy-forum_rss.sh')                  #-- EDIT POINT
end

File.open(RSS_CACHE, "r"){|f| f.each {|line| print line}}
#--- End of File ---

$ cat xfy-forum_rss.sh

#!/bin/sh
/opt/local/bin/ruby xfy-forum.rb > xfy-forum.rss

$ cat xfy-forum.rb

# xfy.com のフォーラムのトップページにアクセスする。
#   See http://d.hatena.ne.jp/omochist/20060919
#       http://d.hatena.ne.jp/unageanu/20070504
#       http://jp.rubyist.net/magazine/?0013-BundledLibraries

require 'rubygems'
require 'net/https'
require 'hpricot'
require 'open-uri'
require "rss"
require 'kconv'
require 'pp'

site = 'www.xfytec.com'
page = '/community/modules/newbb/index.php?cat=3'
url = "https://" + site + page

https = Net::HTTP.new(site, 443)

https.use_ssl = true

https.verify_mode = OpenSSL::SSL::VERIFY_NONE # 証明書チェックなしで接続する

https.start { |w|

  response = w.get(page)
  doc = Hpricot(response.body.to_s)

  rss = RSS::Maker.make("2.0") { |maker|

    maker.channel.about = "xfy-forum.rdf"
    maker.channel.title = "xfy-forum"
    maker.channel.description = "xfy forum (japanese)"
    maker.channel.link = url

    doc.search("/html/body/table[2]/tr/td[2]/div/table[3]/tr") { |t|
#      puts "------------¥n"
#      puts t.search("td[2]/a/b").inner_text.to_s.tosjis
#      time = Time.parse(t.search("td[5]").inner_text)
#      puts time
#      t.search('td[5]/a').each {|a|
#        puts a.attributes['href']
#      }

      item = maker.items.new_item
      item.title = t.search("td[2]/a/b").inner_text
      item.description = item.title
      item.date = Time.parse(t.search("td[5]").inner_text)
      t.search('td[5]/a').each {|a|
        item.link = a.attributes['href']
      }
    }
  }
  puts rss.to_s.toutf8   
  # puts rss.to_s.tosjis
}

| | コメント (0) | トラックバック (0)

2007-07-24

ruby で html から rss を生成 (その2)

以前の投稿
- ruby で html から rss を生成
  >> http://youichi-kato.cocolog-nifty.com/blog/2007/06/ruby_html_rss_6b7f.html
の中で

本当は、
  xfy Community Forum
http://www.xfytec.com/community/modules/newbb/viewforum.php?forum=22&sortsince=1000
の rss を生成したかったのだが。

と書いた。

ruby で https にアクセスする方法が判った。
後は、ページの構造を調べて、rss wp生成するだけだ。今週中にはできるかな?

以下のプログラムでは、xfy.com 日本語フォーラムのトップページの内容が得られる。

# xfy.com のフォーラムのトップページにアクセスする。
#   See http://d.hatena.ne.jp/omochist/20060919
#       http://d.hatena.ne.jp/unageanu/20070504
#       http://jp.rubyist.net/magazine/?0013-BundledLibraries

require 'net/https'
require 'kconv'
require 'pp'

site = 'www.xfytec.com'
page = '/community/modules/newbb/index.php?cat=3'

https = Net::HTTP.new(site, 443)
# proxy が必要なら
# https = Net::HTTP.Proxy(host, port [, user, pass]).new(site, 443)

https.use_ssl = true
# https.ca_file = './base64.cer' # サーバーの公開鍵証明書を指定
https.verify_mode = OpenSSL::SSL::VERIFY_NONE # 証明書チェックなしで接続する
# https.verify_depth = 5

https.start { |w|
  response = w.get(page)
  puts response.body.tosjis
}

gmail にアクセスする例を web で見つけた。少しだけ変更してみた。

# See http://d.hatena.ne.jp/omochist/20060919

require 'net/https'
require 'rexml/document'
require 'kconv'
require 'pp'

puts "gmail-atom.rb account password" if ARGV.length != 2

account = ARGV.shift
pass = ARGV.shift

# 一応,SSL接続
https = Net::HTTP.new('mail.google.com', 443)
https.use_ssl = true
# VERIFY MODEをVERIFY_NONEにしないとだめ.
# この辺はGMailでSMTP接続するときと同じですね.
https.verify_mode = OpenSSL::SSL::VERIFY_NONE

# 接続
https.start

req = Net::HTTP::Get.new('/mail/feed/atom')
# ベーシック認証.こーやってするのかーと勉強になった.
req.basic_auth account, pass

# レスポンスの取得
res = https.request(req)

# レスポンスのbodyをパースしてREXMLオブジェクトを作成
doc = REXML::Document.new(res.body)

if doc.root[1][1] != nil
  puts doc.root[1][1]
elsif

  # 新着メールだけを取り出す
  # 新着メールが無いと,勿論何も起こらない
  entries = []
  doc.root.each_child { |child|
    entries << child if child.name == "entry"
  }

  entries.each do |entry|
    puts entry.elements["title"].text.tosjis
    puts entry.elements["summary"].text.tosjis
    puts entry.elements["author/email"].text.tosjis
  end
end

# 終了
https.finish

| | コメント (0) | トラックバック (1)

2007-07-22

HSQLDB で郵便番号を読んだけど動作が遅かった

HSQLDB (1_8_0_7)の ManagerTool で csv データを読み込んでみたが、検索などに時間が掛かりすぎる。
HSQLDB をつかうこともあきらめよう。
結局 MySQL にするか...

HSQLDB の設定法を記録だけしておこう。

サーバーの起動:
=============

$ cat runserver.sh
#!/bin/sh
java -cp ~/work/www/hsqldb/lib/hsqldb.jar org.hsqldb/Server -database zips

ManagerTool の起動:
==================

$ cat runmanager.sh
#!/bin/sh
java -classpath  java -classpath ~/work/www/hsqldb/lib/hsqldb.jar org.hsqldb.util.DatabaseManager -url jdbc:hsqldb:hsql://localhost

テーブルの作成:
==============
ManagerTool で次の sql を実行する。

$ cat create-zips.sql
DROP TABLE IF EXISTS zips;
CREATE TEXT TABLE zips (
  id int NOT NULL ,
  code char(5) DEFAULT '' NOT NULL,
  old_zip char(5) DEFAULT '' NOT NULL,
  new_zip char(7) DEFAULT '' NOT NULL,
  pref_ruby char(12) DEFAULT '' NOT NULL,
  city_ruby char(38) DEFAULT '' NOT NULL,
  town_ruby char(52) DEFAULT '' NOT NULL,
  pref char(8) DEFAULT '' NOT NULL,
  city char(20) DEFAULT '' NOT NULL,
  town char(34) DEFAULT '' NOT NULL,
  divided_flg char(1),
  lower_case_flg char(1),
  blocks_flg char(1),
  merge_flg char(1),
  update_code char(1),
  reason_code char(1),
  PRIMARY KEY (id)
);
SET TABLE zips SOURCE "new.csv;fs=,;encoding=UTF-8";

Hsql003

Hsql002

Hsql001

アマゾンのバーゲン

| | コメント (0) | トラックバック (0)

ActiveRecord-JDBC は まだsqlite は未サポートだった

ActiveRecord-JDBC は まだsqlite は未サポートだった
http://jruby-extras.rubyforge.org/ActiveRecord-JDBC/
> > File: README.txt
には サポート済みの DB が列挙されている。(sqliteは含まれていなかった.残念)
    * MySQL
    * PostgreSQL
    * Oracle
    * Microsoft SQL Server
    * DB2
    * FireBird
    * Derby
    * HSQLDB

Derby か HSQLDB をつかうことにしよう。
(自分で sqlite をサポートでいるように変更するベキかもしれないけど、すぐにはできそうもないし...)

| | コメント (0) | トラックバック (0)

2007-07-21

ruby/java から sqlite3 をつかう

郵便番号を sqlite3 に格納した。
それを ruby から activerecored で アクセスすることができた。
jruby からのアクセスはまだできていない。
(activerecord-jdbc をつかってできるはず。
その為の準備として、sqkite3 の jdbc ドライバー動作は確認できているが...)

参照:
  - http://d.hatena.ne.jp/rudeboyjet/20060723
  > > よしだメモ: ダミーの住所データを作るスクリプト

  - http://www.tuyudaku.net/sqlite/import.html
  > > SQLite - CSVファイルのインポート

  - http://blog.uhawwwokkwwwww.com/2007/04/sqlitejava.html
  > > SQLiteをJavaで使う

数日中には、xfy/xvcd から jruby でsqlite3 アクセスできるようにしたい。
(java からのアクセスができているから、この方法でxfy/xvcd から
sqlite3 アクセスする xpath関数、instruction をつくるのは簡単なはず。
でも、java で書く データベースアクセスは面倒だから、jruby で書きたいのだ!)

ruby でアクセス例:
=================

$ cat zips-sample.rb
require 'rubygems'
require 'active_record'
require 'sqlite3'

require 'kconv'
require 'pp'

$KCODE = 'u'

ActiveRecord::Base.establish_connection(
   :adapter => 'sqlite3',
   :database => 'zips.db'
)

class Zips < ActiveRecord::Base
end

# z = Zips.find(:all)
# z.each { |v|
#   p v
# }

f = Zips.find_by_id(1)
pp f
pp "id = " + f.id.to_s
pp "city = " + f.city
pp "code = " + f.code

#--- End of File ---

gem で 次のものを install した環境で動作している。
   sqlite3-ruby (1.2.1)
   activerecord (1.15.3)

java でのアクセス例:
=================

$ cat SQLiteTest.java
// See http://blog.uhawwwokkwwwww.com/2007/04/sqlitejava.html
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class SQLiteTest {

    // 指定パスにDBファイルが無い場合は勝手に作ってくれるっぽい
    private static final String DB_URL = "jdbc:sqlite:TestDB";
    private static final int INSERT_MAX = 5;

    public static void main(String[] args) throws Exception {

        Connection c = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            Class.forName("org.sqlite.JDBC");
            c = DriverManager.getConnection(DB_URL);

            // AutoCommitはFalseだろ・・・常識的に考えて
            c.setAutoCommit(false);

            // あれこれSQLを実行

            // まずテスト用テーブル作成
            String sql
                = "create table uhawwwokkwwwww("
                    + " key int not null primary key"
                    + ",name varchar);";
            st = c.prepareStatement(sql);
            int ret = st.executeUpdate();
            System.out.println("テーブル作成:" + ret);
            st.close();
            st = null;

            // 次にデータ作成
            sql = "insert into uhawwwokkwwwww"
                    + " values(?,?)";
            st = c.prepareStatement(sql);
            for (int i = 0; i < INSERT_MAX; i++) {
                int cnt = 1;
                st.setInt(cnt++, i + 1);
                st.setString(cnt++, "うはwwwおkk" + repeatString(i, "w"));

                ret = st.executeUpdate();
                System.out.println("データ作成" + i + ":" + ret);
            }
            st.close();
            st = null;

            // データ取得
            sql = "select x1.key, x1.name from uhawwwokkwwwww x1;";
            st = c.prepareStatement(sql);
            rs = st.executeQuery();
            System.out.println("データ取得開始=====================");
            while (rs.next()) {
                int key = rs.getInt("key");
                String name = rs.getString("name");
                System.out.println("Key:" + key + "  Name:" + name);
            }
            System.out.println("データ取得完了=====================");
            rs.close();
            rs = null;
            st.close();
            st = null;
            // テーブル削除
            sql = "drop table uhawwwokkwwwww;";
            st = c.prepareStatement(sql);
            ret = st.executeUpdate();
            System.out.println("テーブル削除:" + ret);
            st.close();
            st = null;

        } finally {
            // この辺は、お約束/おまじないの類
            if (rs != null) {
                rs.close();
                rs = null;
            }
            if (st != null) {
                st.close();
                st = null;
            }
            if (c != null) {
                c.close();
                c = null;
            }
        }
    }

    /**
     * 指定回数指定文字を繰り返すくだらないメソッド
     * @param cnt 繰り返す数
     * @param s 繰り返す文字
     * @return 処理結果の文字列
     */
    private static String repeatString(int cnt, String s) {
        StringBuffer sb = new StringBuffer(s.length() * cnt);
        for (int i = 0; i < cnt; i++) {
            sb.append(s);
        }
        return sb.toString();
    }
}

$ javac cp=. SQLiteTest.java
$ java -cp sqlitejdbc-v036-native.jar:. -Djava.library.path=. SQLiteTest

jdbc ライブラリーは http://www.zentus.com/sqlitejdbc/ から v036 を download した。


| | コメント (1) | トラックバック (0)

2007-07-18

xfy/xvcd の言語リソース編集ツールが欲しい (その4)

先に公開した版では -en や -ja 指定しか処理できない。
- http://youichi-kato.cocolog-nifty.com/blog/2007/07/xfyxvcd_38_8d02.html
> > katoy: cocolog: xfy/xvcd の言語リソース編集ツールが欲しい (その3.8)

lang2res.rb より抜粋

...
while arg = ARGV.shift
  case arg
  when "-ja"
    lang = arg
  when "-en"
    lang = arg
  else
    ja << arg if lang == "-ja"
    en << arg if lang == "-en"
  end
end
...

汎用的に すべての language-code に対応するにはどうしたら良いだろう。

まずは、  language-code の一覧を入手したり、それを扱っているruby コード例を入手しないと...

でも xfy で英語/日本語以外の言語って扱えるのか?
メニューの "ツール" - "オプション" - "言語" には標準/英語/日本語 の選択肢しかないよ...
1_2

私は firefix の addon として、
  - http://japanize.31tools.com/
  > > ネットを日本語化する:Japanize
を入れている。

xfy にも同じような機能を plugin として作成することは可能かなぁ。

| | コメント (0) | トラックバック (1)

2007-07-15

graphviz の利用を考えよう。

台風が来るというので外出を控えていたが、そんな必要は関東ではなかったようだ...

web でいろいろ探索していて graphviz の可能性を改めて考えてもようと思った。

http://zvtm.sourceforge.net/zgrviewer/video/videos.html
movie を見よ!素晴らしい!
xfy にもこんなインターフェースを追加して欲しい。

graphviz が扱う dot 形式を xml のマップ(変換)することで
xfy で dot ファイルを wysiwig で編集できそうな気がする。

| | コメント (0) | トラックバック (0)

2007-07-13

xfy/xvcd の言語リソース編集ツールが欲しい (その3.8)

orderedhash (順番を保持する Hash)をつかって
xfy/xvcd のリソースファイルファイルを 独自の管理用ファイル形式にマージ
する変換処理 (ruby スクリプト) を書き直した。

1. orderdhash.rb
2. langs2res.rb

管理用ファイルは xml 形式だが、さらに csv との相互変換をつくれば。
Excel などで編集/閲覧をすることも可能になるなぁ。
OpenOffice で編集できるようにするのも良いかも。
xfy と OpenOffice を上手に組み合わせて使うことを考えていくべきかもしれない。
あるいは、リソースを DB に格納するというアプローチもありかもしれない。

1. orderdhash.rb

# See - http://rubyist.g.hatena.ne.jp/onishi/comment?date=20060519
#     - http://blog.kks-online.net/archives/2006/06/ruby_1.html

class OrderedHash < Hash
  def initialize
    @keyodrer = []
    super
  end

  def keys
    @keyodrer
  end

  def values
    # @keyodrer.collect{|k| self[k]}
    self.values_at(*@keyodrer)
  end

  def []=(_key, _value)
    @keyodrer << _key unless @keyodrer.include?(_key)
    super(_key, _value)
  end

  def delete(_key)
    @keyodrer.delete(_key)
    super(_key)
  end

  def each
    @keyodrer.each{|k|
      yield(k, self[k])
    }
  end
end
#--- End of File ---

2. langs2res.rb

# usage: $ ruby langs2res.rb init a.xml -ja ja/*.resource -en en/*.resource
#        output marged data to a.xml

require 'rubygems'
require 'builder'
require 'xmlsimple'
require 'orderedhash'
require 'pp'

def usage(str)
  puts str
  puts "usage: ruby lang2res.rb [init|import] res.xml [-ja|-en] foo.xml ... "
  puts "   ex: ruby lang2res.rb init res.xml -ja ja/*.resource -en/*.resousrce"
  abort
end

def readLangResource(cats, lang, f)
  doc = XmlSimple.xml_in File.open(f)
  cat = File.basename(f, ".resource")

  cats[cat] = OrderedHash.new if cats[cat] == nil
  doc["string-resource"].each {|m|
    name = m["name"]
    val = m["content"]

    cats[cat][name] = Array.new  if cats[cat][name] == nil
    cats[cat][name].push({:lang=>lang, :message=>val})
  }
end

def doImport(res, cats, ja, en)
  ja.each {|j|
    readLangResource(cats, 'ja', j)
  }

  en.each {|e|
    readLangResource(cats, 'en', e)
  }

  writeRes(res, cats)
end

def writeRes(res, cats)
  str = ""
  xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
  xm.instruct!
  xm.instruct!("com.xfy vocabulary-connection", :href=>"resedit.xvcd")
  xm.tag!('r:categories', 'xmlns:r'=>'http://xmlns.example.com/developer/tutorial/resedit') {
    cats.each {|cat, label|
      xm.tag!('r:category', :name=>cat) {
        label.each {|id, array|
          xm.tag!('r:item', {:id=>id}) {
            array.each {|m|
              xm.tag!('r:message', {:lang=>m[:lang]}, m[:message])
            }
          }
        }
      }
    }
  }
  str.gsub!(/(¥&#)([[:xdigit:]]+);/){[$2.to_i].pack("U")}
  File::open(res, "w") {|f|
    f.write str   
  }
end

#==========================================
command = ARGV.shift

outRes = ARGV.shift
ja = Array.new
en = Array.new
lang = ""

while arg = ARGV.shift
  case arg
  when "-ja"
    lang = arg
  when "-en"
    lang = arg
  else
    ja << arg if lang == "-ja"
    en << arg if lang == "-en"
  end
end

case command
  when "init"
    cats = OrderedHash.new
    doImport(outRes, cats, ja, en)
  when "import"
    cats = readResource(outRes)  #  not yet implemented
    doImport(outRes, cats, ja, en)
  else
    usage("illegal argument #{command}")
end
#--- End of File ---

| | コメント (0) | トラックバック (0)

2007-07-11

xfy/xvcd の言語リソース編集ツールが欲しい (その3.5)

昨日の xfy/xvcd の言語リソース編集ツールが欲しい (その3) では、
Hash が追加順序を保持していないので、ちょっと不自然なコードで回避していた。
web でしらべたら OrederdHash という Hash で順番を保持させる例が見つかった。
明日はこれを使って xfy/xvcd のリソースファイル変換の ruby スクリプトを書き直そう。
今日はとりあえず, OrderdHash のコードだけを示す。

$ cat orderdhash.rb
# See - http://rubyist.g.hatena.ne.jp/onishi/comment?date=20060519
#     - http://blog.kks-online.net/archives/2006/06/ruby_1.html

require 'pp'

require 'test/unit'

class OrderedHashTest < Test::Unit::TestCase
  def test_ordered_hash
    oh = OrderedHash.new
    doTest(oh)
  end

  def test_ordered_hashX
    oh = OrderedHashX.new
    doTest(oh)
  end

  def doTest(oh)
    oh["one"] = 1
    oh["two"] = 2
    oh["three"] = 3
    oh["two"] = 4

    assert_equal oh.keys, ["one", "two", "three"]
    assert_equal oh.values, [1, 4, 3]

    ks = []
    vs = []
    oh.each {|k, v|
      ks << k
      vs << v
    }
    assert_equal ks, oh.keys
    assert_equal vs, oh.values

  end
end

class OrderedHash < Hash
  def initialize
    @keyodrer = []
    super
  end

  def keys
    @keyodrer
  end

  def values
    # @keyodrer.collect{|k| self[k]}
    self.values_at(*@keyodrer)
  end

  def []=(_key, _value)
    @keyodrer << _key unless @keyodrer.include?(_key)
    super(_key, _value)
  end

  def delete(_key)
    @keyodrer.delete(_key)
    super(_key)
  end

  def each
    @keyodrer.each{|k|
      yield(k, self[k])
    }
  end
end

class OrderedHashX
  def initialize()
    @keys = []
    @content = {}
  end

  def [](key)
    @content[key]
  end

  def []=(key, value)
    @keys << key unless @keys.include?(key)
    @content[key] = value
  end

  def delete(key)
    @keys.delete(key)
    @content.delete(key)
  end

  def keys()
   @keys
  end

  def values
    @content.values_at(*@keys)
  end

  def each()
    @keys.each{|key|
      yield(key, @content[key])
    }
  end

end

今回は each メソッドの定義の仕方を学ぶことができた。
( pp での動作を定義するにはどうしたらいいんだろう...)

| | コメント (0) | トラックバック (0)

2007-07-10

xfy/xvcd の言語リソース編集ツールが欲しい (その3)

さらにすこし変更した。

 * 管理ファイル-> xfy の resource ファイル変換 の ruby スクリプト
       (日本語が &%xxxx; になってしまっていたので修正した)
   * 管理ファイル <-xfy の resource ファイル変換 の ruby スクリプト
       (逆変換を追加)

管理ファイル-> xfy の resource ファイル変換 ===================================

$ cat res2langs.rb
# usage: $ ruby res2langs res.file
#        output to en/*.resource, ja/*.resource
require 'rubygems'
require 'builder'
require 'xmlsimple'
require 'pp'

def generate(doc)
  res = Hash.new
  doc['category'].each {|c|
    res[c['name']] = generateByCategory(c)
  }
  return res
end

def getLangs(cat)
  langs = Array.new
  cat['item'].each {|item|
    item['message'].each {|m|
      langs << m['lang']
    }
  }
  langs.uniq!
  return langs
end

def generateByCategory(cat)
  xmls = Hash.new
  langs = getLangs(cat)
  langs.each {|lang|
    xmls[lang] = generateByLang(cat, lang)
  }
  return xmls
end

def generateByLang(cat, lang)
  str = ""
  xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
  xm.instruct!
  xm.tag!('resource:resources', 'xmlns:resource'=>'http://xmlns.xfy.com/resource') {
    cat['item'].each {|item|
      item['message'].each {|m|
        if m['lang'] == lang
          xm.tag!('resource:string-resource', {:name=>item['id']}, m['content'])
        end
      }
    }
  }

  str.gsub!(/(¥&#)([[:xdigit:]]+);/){[$2.to_i].pack("U")}
  return str
end

#==========================================
doc = XmlSimple.xml_in File.open(ARGV[0])
xmls = generate(doc)

xmls.each {|cat,v|
  v.each {|lang, x|
    Dir::mkdir(lang) if !FileTest.exist?(lang)
    File::open("#{lang}/#{cat}.resource", "w") {|f|
      f.write x
    }
  }
}

管理ファイル <-xfy の resource ファイル変換
===================================

$ cat langs2res.rb

# usage: $ ruby langs2res.rb init a.xml -ja ja/*.resource -en en/*.resource
#        output marged data to a.xml

require 'rubygems'
require 'builder'
require 'xmlsimple'
require 'kconv'
require 'pp'

def usage(str)
  puts str
  puts "usage: ruby lang2res.rb [init|import] res.xml [-ja|-en] foo.xml ... "
  puts "   ex: ruby lang2res.rb init res.xml -ja ja/*.resource -en/*.resousrce"
  abort
end

def readLangResource(cats, lang, f)
  doc = XmlSimple.xml_in File.open(f)
  cat = File.basename(f, ".resource")

  catIndex = searchByCat(cats, cat)
  cats.push({cat=>Array.new}) if catIndex < 0
  catIndex = searchByCat(cats, cat)

  doc["string-resource"].each {|m|
    name = m["name"]
    val = m["content"]

    nameIndex = searchByName(cats[catIndex], name)
    cats[catIndex][cat].push({name=>Array.new})  if nameIndex < 0
    nameIndex = searchByName(cats[catIndex], name)
    cats[catIndex][cat][nameIndex][name].push({:lang=>lang, :message=>val})
  }
end

def searchByCat(cats, cat)
    cats.each_with_index {|v, index|
      return index  if v.key?(cat)
    }
    return -1
end

def searchByName(cat, name)
    cat.each_with_index {|v, index|      
      return index  if v==name
    }
    return -1
end

def doImport(res, cats, ja, en)
  ja.each {|j|
    readLangResource(cats, 'ja', j)
  }

  en.each {|e|
    readLangResource(cats, 'en', e)
  }

  writeRes(res, cats)
end

def writeRes(res, cats)
  str = ""
  xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
  xm.instruct!
  xm.instruct!("com.xfy vocabulary-connection", :href=>"resedit.xvcd")
  xm.tag!('r:categories', 'xmlns:r'=>'http://xmlns.example.com/developer/tutorial/resedit') {
    cats.each {|cat|
      cat.each {|label,items|
        xm.tag!('r:category', :name=>label) {
          items.each {|item|
            item.each {|id, array|
              xm.tag!('r:item', {:id=>id}) {
                array.each {|m|
                  xm.tag!('r:message', {:lang=>m[:lang]}, m[:message])
                }
              }
            }
          }
        }
      }
    }
  }
  str.gsub!(/(¥&#)([[:xdigit:]]+);/){[$2.to_i].pack("U")}
  File::open(res, "w") {|f|
    f.write str   
  }
end

#==========================================
command = ARGV.shift

outRes = ARGV.shift
ja = Array.new
en = Array.new
lang = ""

while arg = ARGV.shift
  case arg
  when "-ja"
    lang = arg
  when "-en"
    lang = arg
  else
    ja << arg if lang == "-ja"
    en << arg if lang == "-en"
  end
end

case command
  when "init"
    cats = Array.new
    doImport(outRes, cats, ja, en)
  when "import"
    cats = readResource(outRes)  #  not yet implemented
    doImport(outRes, cats, ja, en)
  else
    usage("illegal argument #{command}")
end

つぎは、編集用の xvcd ファイルをきちんと作って公開しよう。
できたら、plugin 作成の ant build.xml に 管理ファイル -> リソースファイル
の変換を組み込み、開発時は、管理ファイルの編集をするだけで、言語リソース編集が済むようにしたい。

| | コメント (0) | トラックバック (0)

2007-07-08

xfy/xvcd の言語リソース編集ツールが欲しい (その2)

すこし、つくってみた。
 * 管理ファイルの例
 * 管理ファイル-> xfy の resource ファイル変換
 * 編集 xvcd の試作
を以下に示そう。
編集画面はいまのところこんな感じ。
1_1

管理ファイルの例 (res.xml)
--------------------------------

<?xml version="1.0"?>

<?com.xfy vocabulary-connection href="resedit.xvcd" ?>
<r:categories xmlns:r="http://xmlns.example.com/developer/tutorial/resedit">
    <r:category name="label">
        <r:item id="add">
            <r:message lang="ja">追加</r:message>
            <r:message lang="en">Add</r:message>
        </r:item>
        <r:item id="del">
            <r:message lang="ja">削除</r:message>
            <r:message lang="en">Del</r:message>
        </r:item>
    </r:category>
    <r:category name="message">
        <r:item id="err-001">
            <r:message lang="ja">エラー</r:message>
            <r:message lang="en">Error</r:message>
        </r:item>
    </r:category>
</r:categories>

管理ファイル->resource ファイル変換 (res2langs.rb)
-----------------------------------------------------------------

# usage: $ ruby res2langs.rb res.xml
#        output em/*.resource, ja/*.resource

require 'rubygems'
require 'builder'
require 'xmlsimple'
require 'pp'

def generate(doc)
  res = Hash.new
  doc['category'].each {|c|
   res[c['name']] = generateByCategory(c)
  }
  return res
end

def getLangs(cat)
  langs = Array.new
  cat['item'].each { |item|
    item['message'].each { |m|
      langs << m['lang']
    }
  }
  langs.uniq!
  return langs
end

def generateByCategory(cat)
  xmls = Hash.new
  langs = getLangs(cat)
  langs.each {|lang|
    xmls[lang] = generateByLang(cat, lang)
  }
  return xmls
end

def generateByLang(cat, lang)
  str = ""
  xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
  xm.instruct!
  xm.tag!('resource:resources', 'xmlns:resource'=>'http://xmlns.xfy.com/resource') {
    cat['item'].each { |item|
      item['message'].each { |m|
        if m['lang'] == lang
          xm.tag!('resource:string-resource', {'name'=>item['id']}, m['content'])
        end
      }
    }
  }
  return str
end

#==========================================
doc = XmlSimple.xml_in File.open(ARGV[0])
xmls = generate(doc)

xmls.each {|cat,v|
  v.each {|lang, x|
    Dir::mkdir(lang) if !FileTest.exist?(lang)
    File::open("#{lang}/#{cat}.resource", "w") { |f|
      f.write x
    }
  }
}

# <?xml version="1.0" encoding="UTF-8"?>
# <categories>
#   <category name="label">
#     <item id ="add">
#       <message lang="ja">add-japanese</message>
#       <message lang="en">add-english &amp;</message>
#     </item>
#     <item id ="del">
#       <message lang="ja">del-japanese</message>
#       <message lang="en">del-english</message>
#     </item>
#   </category>
# </categories>
#
# ==>
# ----------- ja/label.resource --------
# <?xml version="1.0" encoding="UTF-8"?>
# <resource:resources xmlns:resource="http://xmlns.xfy.com/resource">
#   <resource:string-resource name="add">add-japanese</resource:string-resource>
#   <resource:string-resource name="del">del-japanese</resource:string-resource>
# </resource:resources>
# ----------- en/label.resource --------
# <?xml version="1.0" encoding="UTF-8"?>
# <resource:resources xmlns:resource="http://xmlns.xfy.com/resource">
#   <resource:string-resource name="add">add-english &amp;</resource:string-resource>
#   <resource:string-resource name="del">del-english</resource:string-resource>
# </resource:resources>

編集 xvcd の試作 (resedit.xvcd)
-----------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!--
  2007-07-08 katoy
  xfy/xvcd の リソースファイルの編集
-->
<!--
TODO: Category 追加,削除
       ID 追加,削除, 順序変更
       Message 追加,削除, 順序変更, 言語別表示 on/off
       *.resource の import, export
       翻訳サービスとの連動
       複数行データの扱い
-->

<xvcd:xvcd xmlns="http://www.w3.org/1999/xhtml"
  xmlns:r="http://xmlns.example.com/developer/tutorial/resedit"
  xmlns:command="http://xmlns.xfy.com/command"
  xmlns:ctrl="http://xmlns.xfy.com/controls"
  xmlns:dtf="http://xmlns.xfy.com/data-transfer"
  xmlns:event="http://xmlns.xfy.com/event"
  xmlns:function="http://xmlns.xfy.com/function"
  xmlns:instruction="http://xmlns.xfy.com/instruction"
  xmlns:ui="http://xmlns.xfy.com/ui"
  xmlns:tab="http://xmlns.xfy.com/tab"
  xmlns:xvcd="http://xmlns.xfy.com/xvcd" version="1.0">

  <xvcd:vocabulary name="ResourcesEdit" match="r:categories"
    call-template="root" />

  <!-- ================= TEMPATE =============== -->
  <xvcd:template name="root">
    <tab:tabs>
      <xvcd:for-each select="r:category">
        <tab:tab title="{@name}">
          <xvcd:apply-templates select="."/>
        </tab:tab>
      </xvcd:for-each>
    </tab:tabs>
  </xvcd:template>

  <xvcd:template match="r:category">
    <html>
      <head>
        <!-- See http://icant.co.uk/csstablegallery/index.php?css=0#r0 -->
        <link rel="stylesheet" href="./plainold.css" type="text/css" />
      </head>
      <body>
        HEAD 
        <a href="#tail">TAIL</a>
        <table>
          <thead>
            <tr class="odd">
              <th>No.</th>
              <th>ID</th>
              <th width="100%">Message</th>
            </tr>
          </thead>
          <tbody>
            <xvcd:apply-templates select="r:item" />
          </tbody>
        </table>
        <a name="tail" />
        <a href="#head">HEAD</a>
         TAIL
      </body>
    </html>
  </xvcd:template>

  <xvcd:template match="r:category/r:item">
    <!-- 行の背景色を交互に変更させる -->
    <tr class="{function:if((position() mod 2 = 1), 'odd', '')}">
      <td align="right">
        <xvcd:value-of select="position()" />
      </td>
      <td nowrap="">
        <xvcd:text-of select="@id" />
      </td>
      <td>
        <xvcd:apply-templates select="r:message" />
      </td>
    </tr>
  </xvcd:template>

  <xvcd:template match="r:message">
    <table border="0">
      <tr border="0">
        <td width="20">
          <xvcd:text-of select="@lang" filler="" />
        </td>
        <td width="100%">
          [<xvcd:text-of select="text()" />]
        </td>
      </tr>
    </table>
  </xvcd:template>
</xvcd:xvcd>

| | コメント (0) | トラックバック (0)

2007-07-07

xfy/xvcd の言語リソース編集ツールが欲しい

xfy/xvcd の言語リソース編集ツールが欲しいなぁ。

xfy/xvcd では、言語別リソースを定義して国際化対応できる。
つまり 次のようなファイルを言語別の用意する必要がある。

en/label.xml

<?xml version="1.0"?>
<resource:resources xmlns:resource="http://xmlns.xfy.com/resource">
    <resource:string-resource name="label-add">Add Entry</resource:string-resource>
    <resource:string-resource name="label-del">Delete Entry</resource:string-resource>
</resource:resources>

ja/label.xml

<?xml version="1.0"?>
<resource:resources xmlns:resource="http://xmlns.xfy.com/resource">
    <resource:string-resource name="label-add">追加</resource:string-resource>
    <resource:string-resource name="label-del">削除</resource:string-resource>
</resource:resources>

このように複数のファイルを用意することになるが、
次のような1ファイルにまとめて、編集/管理をし、必要に応じて上記の xvcd 用形式に変換してはどうだろうか?

resources.xml
<root>
  <category name="label">
    <resources>
      <item name="label-add">
        <ja>追加</ja>
        <en>Add Entry</en>
        <comment>xxxxx</comment>
      </item>
      <item name="label-del">
        <ja>削除</ja>
        <en>Del Entry</en>
        <comment>xxxxx</comment>
      </item>
    </resources>
  </category>
<root>

上記のファイルを編集するための UI としては次のようなものが考えられる。

テーブル形式
------------------------------------------------------
| label                                              |
|-----------------------------------------------------
|  id       | ja            | en         | comment   |
------------+---------------+------------+------------
| label-add | 追加          | Add Entry  |           |
|-----------------------------------------------------
| label-del | 削除          | Del Entry  |           |
------------------------------------------------------

クラスブラウザ形式
-----------------------------------------------------
| Category   | id                                   |
|----------------------------------------------------
|   label    | label-add                            |
|            | label-del                            |
|===================================================|
| 追加                                              |
|----------------------------------------------------
| Add Entry                                         |
|----------------------------------------------------
| comment                                           |
-----------------------------------------------------

だれか 管理用 xml の スキーマ定義や、上記のような閲覧/編集画面、
管理用 xml <-> xvcd 用 xml の相互変換
といった一覧の仕組みをつくってほしいなぁ。

編集/閲覧画面では、web 上の辞書参照や、翻訳サービス利用、スペルチェック利用などができるようになっていると嬉しい。

編集閲覧ツールは
VideDesigner でベースを作成して、後は手で細かな調整をしていけるかなぁ。
それともはじめから、手ですべて書いていったほうが早いか?

形式変換ツールは、ruby で簡単にかけるだろう。
(すくなくとも java でかくよりは簡単)
本当は、xvcd で 複数ファイルへの分割/統合をする command を書きたいが、
それは簡単では無い気がする。

| | コメント (0) | トラックバック (0)

2007-07-01

xfy をリモート操作できるか?

xfy をリモート操作できるか?
以前、xfy に echo サーバー機能を追加する例を公開したことがある。
- http://youichi-kato.cocolog-nifty.com/blog/2007/02/xfy_instruction_6fa3.html
> > xfy の instruction で echo server を実装する

echo 機能では、稼働している xfy 自体には副作用を与えることができない。
java.awt.Robot を利用して、マウスイベントをサーバーで受付けるようにすれば、
xfy をremote で操作するようなことができるかもしれない。

- http://java.sun.com./javase/ja/6/docs/ja/api/java/awt/Robot.html
> > Robot (Java Platform SE 6)
> ...
> このクラスを用いると、テストの自動化、自動実行のデモ、およびマウスやキーボード制御が必要なアプリケーションのために、ネイティブなシステム入力イベントを生成することができます。Robot の主な目的は、Java プラットフォーム実装テストを自動化することです。 
> ...

- http://www.itarchitect.jp/technology_and_programming/-/34462-4.html
> > JUnitスーパーTips 第3回 - ITアーキテクト
> GUI操作を伴うテストを自動化する——クラスRobotの利用法——

ほんとうは、server 内部から、srcDOM を直接編集したりできたらとおもっているのだが、
java 実装の xvcd の function/instruction の実装例は context とかいう変数のアクセス
している。これをどのように取得してすればいいのかが判らないので、実験コードが書けないでいる orz...

VNC でブラウザ経由で操作するのが一番照っとり早い?
この場合手元マシンに xfy をインストールする必要もなくて、別の意味で便利かもしれない。

| | コメント (0) | トラックバック (0)

xfy の xpath 関数のコーディングの工夫案

xfy/xvcd で java ファンクションを1つ追加するための作業が面倒だ。
そこでこんな方法を思いついた。
 my:eval(functionname, arg0, arg1, ...)形式で eval() という関数を1つだけ定義することにする というものだ。
第一引数を関数名とすることにして、eval 関数の call() メソッド中で分岐させるのだ。
これなら、新しい関数を追加するときは、 call() 中での分岐を増やしていくだけで済む。
その分岐も 実際には if ... elseif ... の羅列でなく、hash で管理すれば分岐数増加にも対応しやすくなる。

実際のコード例はこんな感じになる。ここでは
eval('setLocale', lang), eval('getLocale') として、Locale を set/get する関数を作ってみている。

/** example:eval(funcname, p0, p1...) */
public class EvalFunction implements Function {

    private static final Map<String, Function> funcSet = init();

    private static final Map<String, Function> init() {
        final Map<String, Function> map = new HashMap<String, Function>();

        map.put("list", new ListFunction());

        map.put("setLocale", new SetLocaleLanguageFunction());
        map.put("getLocale", new GetLocaleLanguageFunction());

        return map;
    }

    private Function getInstance(final Arguments args) {
        final Value v = args.getArgument(0);
        final String funcName = v.getAsString();
        Function func = funcSet.get(funcName);
        assert func != null;
        return func;
    }

    public Value call(final Arguments args, final Context context)
            throws ValueException {
        final Value val = this.getInstance(args).call(args, context);
        return val;
    }

    /* ============================================ */
    /**
     * 処理できる関数一覧を返す。
     */
    static class ListFunction implements Function {
        public Value call(final Arguments args, final Context context)
                throws ValueException {
            final StringBuilder sb = new StringBuilder();
            for (final Map.Entry<String, Function> e : funcSet.entrySet()) {
                sb.append(e + " ");
            }
            return new StringValue(sb.toString());
        }
    }

    /**
     */
    static class GetLocaleLanguageFunction implements Function {
        public Value call(final Arguments args, final Context context)
                throws ValueException {

            FunctionUtility.checkCount(context, args, 1);

            final Locale locale = Locale.getDefault();
            return new StringValue(locale.getLanguage());
        }
    }

    /**
     */
    static class SetLocaleLanguageFunction implements Function {
        public Value call(final Arguments args, final Context context)
                throws ValueException {
  .. 省略 ...
        }
    }
}

呼び出し側の xvcd はこんな感じ。
        <td>
          Current Locate:
          <xvcd:value-of select="xvcd:user-data('locale')" />
        </td>
        <td>
          <ctrl:trigger>
            <ctrl:label>set Locale:en</ctrl:label>
            <xvcd:action event="ctrl:triggered">
              <instruction:message-box>
                Change locale from
                <xvcd:value-of select="example:eval('setLocale', 'en')" />
              </instruction:message-box>
              <xvcd:set-user-data name="locale"
                value="{example:eval('getLocale')}" />
            </xvcd:action>
          </ctrl:trigger>
        </td>
    ... 省略 ...

Arguments のなかの最初の要素を取り除く方法があれば、既存の方法で書いたFunction の call メソッドをそのまま呼び出すようにもできるのだが。

この関数名自体を argument にしてしまう方法は、xfy/xvcd の instructionを書く場合にも流用できると思う。

| | コメント (0) | トラックバック (0)

2007-06-30

xfy の言語リソース切り替え

- http://www.xfy.com/jp/manual/dev/developer/1.4/howto/resource_tutorial.html#multilingual
> > リソースファイルの利用方法 - xfy technology
> > ... 言語選択によるリソース切り替えの概要 ...

ruby の gettext や eclipse の "Externalize Strings"(ストリングの外部化)メニューのような方法で 文字列定数を xfy/xvcd から分離するツールも欲しいなぁ。

resource で言語切り替えは自動切り替えできるのは判ったが、xvcd や java での動作自体を言語別に切り替えたい場合はどうすればいんだろう。
# 言語別にコード分岐すべきではないが、リソース文字列だけですべて吸収しきれないこともある気がする。
# xvcd コード自体を resource して、動的に xvcd 内容を変更できれば良いのかも?でもそんなことは可能?

1. xvcd 部では、あるリソースに言語別の値を設定しておき, 実行時に取得した文字列から判定して分岐する。
2. java 部では、 Locale.getDefault() で言語設定を得て、分岐する。

言語別切り替えだけではなく、もっと細かい範囲での切り替えも必要な気がする。
xfy blog editor で利用先 blog サーバー別にリソースをきりかえるとか、会社と自宅など、xfy 稼働条件からリソースを切り替えるとか...

あるいは、
- http://japanize.31tools.com/
> > ネットを日本語化する:Japanize
みたいな手法も xfy に適用可能になると良いかもしれない。
(ATOK 辞書を活用できたりするかも)

http://www.atmarkit.co.jp/fjava/rensai3/eclipsepgnpro01/eclipsepgnpro01_1.html
> > Eclipseプラグイン実践テクニック(1)Eclipseプラグインを国際化しよう

- http://www.gnome.gr.jp/docs/g2-platform-overview/ch03s04.html
> > 国際化
> > ... gnome-doc-utils パッケージでは便利な xml2po ツールを提供しています。このツールを使えば、いろいろな XML 形式 (含む XHTML や DocBook) のドキュメントを翻訳する場合も PO ファイルを使って行えます。

| | コメント (0) | トラックバック (0)

2007-06-24

racc で xvcd を生成することを試し始めた (その8)

ruby/racc で xfy/xvcd を生成する実験を続けています。

今回は、 #include 機能を追加しました。
   #include ファイルパス
と記すことで、C/C++ とおなじ ファイル内容取り込みを行えるようにしました。

必要な変更は parser 部のみ。

  def parse( f, fname )
    @q = []
    read(f, fname)
    @q.push [ false, '$' ]

    do_parse
  end

  def read( f, fname )
    @fname = fname
    lineno = 1

    f.each do |line|
      line.strip!
      until line.empty? do
        case line
        when /¥A#include¥s+([¥w¥.¥/]*).*/
          File.open( $1 ) do |incf|
            read(incf, $1)
          end
          @fname = fname

     ... 省略 ...

        else
          raise RuntimeError, 'must not happen'
        end
        line = $'
      end
      lineno += 1
    end
  end

#include のネストも可能です。
でも現状では include が無限ループしてしまう場合のチェックはしていません。

#include 機能をつかうことで、入力ソースはつぎのように記載することができます。
xfy/xvcd で共通な記述部を include でくくり出すことで、作成/保守がすこしは楽になるでしょう。

$ cat src
<<
// "Genereated using racc. 2007-06-24"
<<
#include inc/header.inc    # xvcd(...)
{
<<
#include inc/vocabulary.inc
<<
#include inc/command.inc
<<
#include inc/template.inc
};
#--- End of File ---

$ cat inc/header.inc
xvcd(
    xmlns             => "http://www.w3.org/1999/xhtml",
    xmlns:xvcd        => "http://xmlns.xfy.com/xvcd",
    xmlns:instruction => "http://xmlns.xfy.com/instruction",
    xmlns:ctrl        => "http://xmlns.xfy.com/controls",
    xmlns:event       => "http://xmlns.xfy.com/event",
    xmlns:ui          => "http://xmlns.xfy.com/ui",
    xmlns:command     => "http://xmlns.xfy.com/command",
    xmlns:ab          => "http://xmlns.example.com/developer/tutorial/addressbook",
    version           => "1.0"
)

$ cat inc/vocabulary.inc
  //============== VOCABULARY ==========
  vocabulary(name          => "AddressBook",
             match         => "ab:addressbook",
             call-template => "Root") {
    //============== MENU ==========
    ui:ui(version=>"1.0") {
      ui:main-menu() {
        ui:menu(label=>"Entry") {
          ui:menu-item(label=>"add", command=>"my:AddEntry",  open-dialog=>"true");
          ui:menu-item(label=>"edit", command=>"my:EditEntry", open-dialog=>"true");
        };
      };
    };
  };

$ cat inc/template.inc
  //============== TEMPLATE ==========
  template(name=>"EditDialogRoot") {
    html() {
      body()
    };
  };

include 機能は単に、ファイルを分割するだけであり、オブジェクト指向という観点からは有用な機能ではありません。
次は、
xvcd の一部分を override する, 機能を追加する(java での class の extends に相当) することを実装しましょう。
xfy/xvcd にオブジェクト指向的な要素を追加した記述を可能にすることで、プラグインを作成しやすくなると考えています。

| | コメント (0) | トラックバック (0)

2007-06-23

ruby で html から rss を生成

以前、java を使って html ページから rss を生成する例を公開した。
- http://youichi-kato.cocolog-nifty.com/blog/2006/09/nekohtml_rome_r_8150.html
  nekohtml + rome で RSS を生成

同等のものを ruby で書いてみた。
java でつくるより ものすごく簡単にできる!
(おそらく 今後、java で同等のものを書くことはないだろう, ruby で書く事しか考えられない)

html を読んで、rss をつくるのは、たったこれだけで OK.
(ここでは "えんげきのぺーじ" というサイトの レビューページの rss を作成しています)

$ cat empe.rb
require 'rubygems'
require 'hpricot'
require 'open-uri'
require "rss"
require 'kconv'

# http://dx.sakura.ne.jp/~nnn/play/itigyo/itigyo.cgi?cn=1000
#       /htm/body/p/dl  dt, dt

# url = "itigyo.cgi.html"  # for debug, test
url = "http://dx.sakura.ne.jp/~nnn/play/itigyo/itigyo.cgi?cn=1000"

doc = Hpricot(open(url))

rss = RSS::Maker.make("2.0") { |maker|
  maker.channel.about = "empe.rdf"
  maker.channel.title = "itigyo"
  maker.channel.description = "Empe Site"
  maker.channel.link = url

  doc.search('/html/body/p/dl').each { |row|
    row.search('dt').each_with_index { |dt, index|
      item = maker.items.new_item

      item.link = url
      item.title = dt.inner_text
      item.description = dt.next_sibling.inner_text
      item.date = Time.now - 600 * index
    }
  }
}
puts rss.to_s.toutf8

本当は、
  xfy Community Forum
http://www.xfytec.com/community/modules/newbb/viewforum.php?forum=22&sortsince=1000
の rss を生成したかったのだが。
ruby からの https アクセスが
  certificate verify failed (OpenSSL::SSL::SSLError)
のエラーになるので、とりあえず保留。
(証明書を download して、ruby からそれを指定すればよさそうなのだが、方法がよくわからない...)

| | コメント (0) | トラックバック (3)

2007-06-16

racc で xvcd を生成することを試し始めた (その7)

ruby/racc で xfy/xvcd を生成する実験を続けています。

今回は2つの変更を行いました。
  1. 属性指定方法の書式を導入
  2. 任意の xml タグを生成できるようにした

今回のソースコードは以下で公開しています。
http://homepage2.nifty.com/youichi_kato/src.html
- racc で xvcd
    zzz-2007-06-16.tgz(2007-06-16)

1. 属性指定方法の書式を導入
-------------------------
前回は、
変換結果 xml の属性指定を "name", "val" で指定させていたが、
name=>"val" で指定するようにしました。

つまり

xvcd:foo(name=>"val")

と書いたら

<xvcd:foo name="val">
</xvcd:foo>

が出力されます。

2. 任意の xml タグを生成できるようにした
-------------------------------------
いままでは 変換プログラム側で認識できないタグは無視していました。
しかし、今回からは 定義済みチェックをせずに すべて、xml タグ展開をすることに変更しました。
そうすることで これまでは "<<" での ヒアドキュメントで書くしかなかった部分も、
すべて 関数呼び出し風に書くことが可能となります。

つまり

<< <html>
<<   <body>
<<   </body>
<< </html>

html() {
  body();
};

は、同じ変換結果になります。
(すべてを 無理に関数呼び出し風に書く必要は無いです。
ケースに応じてヒアドキュメント記述と使いわければよいと思う)

いままでつかってきた 入力ソースは次のように書き換えることになります。
出力結果は前回までと同じです。

$ cat src
<<
xvcd(
    xmlns             => "http://www.w3.org/1999/xhtml",
    xmlns:xvcd        => "http://xmlns.xfy.com/xvcd",
    xmlns:instruction => "http://xmlns.xfy.com/instruction",
    xmlns:ctrl        => "http://xmlns.xfy.com/controls",
    xmlns:event       => "http://xmlns.xfy.com/event",
    xmlns:ui          => "http://xmlns.xfy.com/ui",
    xmlns:command     => "http://xmlns.xfy.com/command",
    xmlns:ab          => "http://xmlns.example.com/developer/tutorial/addressbook",
    version           => "1.0"
) {

<<
  //============== VOCABULARY ==========
  vocabulary(name          => "AddressBook",
             match         => "ab:addressbook",
             call-template => "Root") {
    //============== MENU ==========
    ui:ui(version=>"1.0") {
      ui:main-menu() {
        ui:menu(label=>"Entry") {
          ui:menu-item(label=>"add", command=>"my:AddEntry",  open-dialog=>"true");
          ui:menu-item(label=>"edit", command=>"my:EditEntry", open-dialog=>"true");
        };
      };
    };
  };

<<
  //============== COMMAND ==========
  def my:AddEntry(a, b)
    dialog(return-to=>"result") {
<<       <ab:edit-dialog>
<<            <ab:entry>
<<                <ab:person />
<<                <ab:address />
<<            </ab:entry>
<<        </ab:edit-dialog>
    };

    if "'ok'=$result/ab:edit-dialog/@closed-by" then
      insert(select=>"/ab:addressbook", position=>"last-child") {
        copy_of(select=>"$result//ab:entry");
      };
    end
  end

<<
  //============== TEMPLATE ==========
  template(name=>"EditDialogRoot") {
    html() {
      body()
    };
  };
};
#--- End of File ---

今回も、前回予告とは反する変更を行ってしまいました。
次回こそは、include 機能を実装しようと思う...


| | コメント (0) | トラックバック (0)

2007-06-14

racc で xvcd を生成することを試し始めた (その6)

ruby のracc を使って、xfy/xvcd を書きやすくすることの実験を続けています。

いままでは、EOL(改行)を 文の区切りとしていたが、
; を文の区切りとするようにシンタックスを変更しました。
この変更をした理由は、
  foo(a,
      b);
のように、パラメータ部を複数行の分けて書けるようにする為。

また、<xvcd:xvcd>, <xvcd:template> も関数として記述できるようにしました。

以下に 変更した文法と、それに沿った入力コードを示します。
(生成される xvcd は前回のものと変りはありません)

文法 (アクション部は省略)
===

rule

  program   : stmt_list

  stmt_list :
            | stmt_list stmt
            | stmt_list SCOL

stmt_block :
            | LPA stmt_list RPA

  stmt      : primary
            | assign
            | if_stmt
            | while_stmt
            | defun
            | comment
            | heredoc

  if_stmt   : IF string_cond THEN stmt_list elseif_cause else_cause END

  elseif_cause :
             | ELSEIF string_cond THEN stmt_list elseif_cause

  else_cause :
             | ELSE stmt_list

  string_cond :  STRING

  defun     : DEF IDENT param stmt_list END

  param     : '(' name_list ')'
            | '(' ')'

  name_list : IDENT
            | name_list ',' IDENT

  assign    : IDENT '=' primary

  primary  : IDENT
            | NUMBER
            | STRING
            | TRUE
            | FALSE
            | funcall

  funcall   : IDENT '(' args ')'  stmt_block
            | IDENT '(' ')'  stmt_block

  args      : primary
            | args ',' primary

  comment    : COMMENT

  heredoc    : HEREDOC

end

入力コード例
===========

<<
// "Genereated using racc. 2007-06-09"
<<
xvcd(
    "xmlns",             "http://www.w3.org/1999/xhtml",
    "xmlns:xvcd",        "http://xmlns.xfy.com/xvcd",
    "xmlns:instruction", "http://xmlns.xfy.com/instruction",
    "xmlns:ctrl",        "http://xmlns.xfy.com/controls",
    "xmlns:event",       "http://xmlns.xfy.com/event",
    "xmlns:ui",          "http://xmlns.xfy.com/ui",
    "xmlns:command",     "http://xmlns.xfy.com/command",
    "xmlns:ab",          "http://xmlns.example.com/developer/tutorial/addressbook",
    "version",           "1.0"
) {

<<
  //============== VOCABULARY ==========
  vocabulary("name",         "AddressBook",
             "match",        "ab:addressbook",
             "call-template","Root") {
    //============== MENU ==========
<<    <ui:ui version="1.0">
<<      <ui:main-menu>
<<        <ui:menu label="Entry">
<<          <ui:menu-item label="add" command="AddEntry" open-dialog="true" />
<<          <ui:menu-item label="edit" command="EditEntry" open-dialog="true" />
<<        </ui:menu>
<<      </ui:main-menu>
<<    </ui:ui>
  };

<<
  //============== COMMAND ==========
  def AddEntry(a, b)
    dialog("return-to", "result") {
<<       <ab:edit-dialog>
<<            <ab:entry>
<<                <ab:person />
<<                <ab:address />
<<            </ab:entry>
<<        </ab:edit-dialog>
    };

    if "'ok'=$result/ab:edit-dialog/@closed-by" then
      insert("select","/ab:addressbook", "position","last-child") {
        copy_of("select", "$result//ab:entry");
      };
    end
  end

<<
  //============== TEMPLATE ==========
  template("name", "EditDialogRoot") {
<<    <html>
<<      <body>
<<      </body>
<<    </html>
  };
};
#--- End of File ---

今回の変更は、xfy/xvcd を短く書く為のものでは無いですね。
次回は、include の仕組みを導入したいです。
単なる include ではなく、共通利用できるコード断片を パラメータ置換しながら
取り込む様にする予定です。

| | コメント (0) | トラックバック (0)

2007-06-10

racc で xvcd を生成することを試し始めた (その5)

プログラムでサポートできていない機能は、記述をそのまま出力できるようにすることで
完全に動作する xfy/xvcd ファイルを生成できるようにした。

<< で始まる行は、そのまま出力させるという機能だ。(ヒアドキュメントのようなもの)
最低でも全部を << で記載すればよい。

今後は、いかに 少ない記述で xfy/xvcd  ファイルを生成できるようにするか  という観点で発展させていこう。

現状の変換プログラムのソースは以下に置いた。
http://homepage2.nifty.com/youichi_kato/src.html
- racc で xvcd
    zzz-2007-06-10.tgz(2007-06-10)

入力と出力結果の例を示す。

入力
======

$ cat src
//
// "Genereated using racc. 2007-06-09"
<<<xvcd:xvcd
<<    xmlns="http://www.w3.org/1999/xhtml"
<<    xmlns:xvcd="http://xmlns.xfy.com/xvcd"
<<    xmlns:instruction="http://xmlns.xfy.com/instruction"
<<    xmlns:ctrl="http://xmlns.xfy.com/controls"
<<    xmlns:event="http://xmlns.xfy.com/event"
<<    xmlns:ui="http://xmlns.xfy.com/ui"
<<    xmlns:command="http://xmlns.xfy.com/command"
<<    xmlns:ab="http://xmlns.example.com/developer/tutorial/addressbook"
<<    version="1.0">

<<
//============== VOCABULARY ==========
vocabulary("name","AddressBook", "match","ab:addressbook", "call-template","Root") {
<<    <ui:ui version="1.0">
<<      <ui:main-menu>
<<        <ui:menu label="Entry">
<<          <ui:menu-item label="add" command="AddEntry" open-dialog="true" />
<<          <ui:menu-item label="edit" command="EditEntry" open-dialog="true" />
<<        </ui:menu>
<<      </ui:main-menu>
<<    </ui:ui>
}

<<
//============== COMMAND ==========
  def AddEntry(a,b)
    dialog("return-to", "result") {
<<       <ab:edit-dialog>
<<            <ab:entry>
<<                <ab:person />
<<                <ab:address />
<<            </ab:entry>
<<        </ab:edit-dialog>
    }

    if "'ok'=$result/ab:edit-dialog/@closed-by"
      insert("select","/ab:addressbook", "position", "last-child") {
        copy_of("select", "$result//ab:entry")
      }
    end
  end

<<
//============== TEMPLATE ==========
<<  <xvcd:template name="EditDialogRoot">
<<    <html>
<<      <body>
<<      </body>
<<    </html>
<<  </xvcd:template>
<<</xvcd:xvcd>

出力
=====

$ make
ruby c.intp src && echo ok
<?xml version="1.0" encoding="UTF-8"?>
<!--  -->
<!--  "Genereated using racc. 2007-06-09" -->
<xvcd:xvcd
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xvcd="http://xmlns.xfy.com/xvcd"
    xmlns:instruction="http://xmlns.xfy.com/instruction"
    xmlns:ctrl="http://xmlns.xfy.com/controls"
    xmlns:event="http://xmlns.xfy.com/event"
    xmlns:ui="http://xmlns.xfy.com/ui"
    xmlns:command="http://xmlns.xfy.com/command"
    xmlns:ab="http://xmlns.example.com/developer/tutorial/addressbook"
    version="1.0">

<!-- ============== VOCABULARY ========== -->
<xvcd:vocabulary name="AddressBook" call-template="Root" match="ab:addressbook">
    <ui:ui version="1.0">
      <ui:main-menu>
        <ui:menu label="Entry">
          <ui:menu-item label="add" command="AddEntry" open-dialog="true" />
          <ui:menu-item label="edit" command="EditEntry" open-dialog="true" />
        </ui:menu>
      </ui:main-menu>
    </ui:ui>
</xvcd:vocabulary>

<!-- ============== COMMAND ========== -->
<instruction:command name="AddEntry">
  <instruction:with-param  name="a"/>
  <instruction:with-param  name="b"/>
  <xvcd:dialog return-to="result">
       <ab:edit-dialog>
            <ab:entry>
                <ab:person />
                <ab:address />
            </ab:entry>
        </ab:edit-dialog>
  </xvcd:dialog>
  <instruction:if test="'ok'=$result/ab:edit-dialog/@closed-by">
    <xvcd:insert position="last-child" select="/ab:addressbook">
      <xvcd:copy-of select="$result//ab:entry">
      </xvcd:copy-of>
    </xvcd:insert>
  </instruction:if>
</instruction:command>

<!-- ============== TEMPLATE ========== -->
  <xvcd:template name="EditDialogRoot">
    <html>
      <body>
      </body>
    </html>
  </xvcd:template>
</xvcd:xvcd>

| | コメント (0) | トラックバック (0)

2007-06-07

racc で xvcd を生成することを試し始めた (その4)

if ... elseif ... else end
の構文もサポートしたものを以下においた。

http://homepage2.nifty.com/youichi_kato/src.html
- racc で xvcd
    zzz-2007-06-07.tgz(2007-06-07)
   javascript 風言語から xfy/xvcd のコードを生成する

走らせ方は racc が動作する状態で、 $ make とすればよい。

このソースは http://ruby256.hp.infoseek.co.jp/ から 魔道編のサンプルプログラム
として download したものをベースにして作成している。
コード全部をここに引用したかったが、ちょっと量がおおくなったので、tar+gzip したものの公開とする。

kato$ wc *
     12      24     138 Makefile
     28      55     444 c.intp
    339     652    6030 node.rb
    509    1515   11887 parser.rb
    230     518    5219 parser.y
     60     121     719 src

以下には入力ソースと出力結果を引用する。

kato$cat src
//==== assign ====
message = 'funcall ok'
message = true
message = false
message = message
message = foo(a,b,"x")
message = foo(boo())
message = foo(boo(a))
message = foo(boo(a), zoo(b))

//==== function-call ====
puts( "abc" )
puts( func0() )
puts( a )

//==== if then end =====
if "$a=''"
  x = "ONE"
  y = "TWO"
end

//==== def func =====
def func0()
a="local"
  puts('in func0()')
end
func0()

def func1(a, b, c)
  puts('in func1()')
end
func1("A", "B", "foo(a)")

//==== if then else end =====
if "$a=''"
  a="1"
else
  a="2"
end

//==== if then elseif end =====
if "a"
  a="1"
elseif "b"
a="2"
elseif "c"
  a="3"
else
  a="4"
end

if "a"
  a="1"
elseif "b"
  a="2"
else
  a="3"
end

# //==== End of File ====

出力結果

kato$make
ruby c.intp src && echo ok
<!-- ==== assign ==== -->
<instruction:variable name="message" select="'funcall ok'"/>
<instruction:variable name="message" select="'true'"/>
<instruction:variable name="message" select="'false'"/>
<instruction:variable name="message" select="$message"/>
<instruction:variable name="message" select="foo($a,$b,'x')"/>
<instruction:variable name="message" select="foo(boo())"/>
<instruction:variable name="message" select="foo(boo($a))"/>
<instruction:variable name="message" select="foo(boo($a),zoo($b))"/>
<!-- ==== function-call ==== -->
<instruction:message-box>
  <xvcd:value-of select="'abc'"/>
</instruction:message-box>
<instruction:message-box>
  <xvcd:value-of select="func0()"/>
</instruction:message-box>
<instruction:message-box>
  <xvcd:value-of select="$a"/>
</instruction:message-box>
<!-- ==== if then end ===== -->
<instruction:if test="$a=''">
  <instruction:variable name="x" select="'ONE'"/>
  <instruction:variable name="y" select="'TWO'"/>
</instruction:if>
<!-- ==== def func ===== -->
<instruction:command name="func0">
  <instruction:variable name="a" select="'local'"/>
  <instruction:message-box>
    <xvcd:value-of select="'in func0()'"/>
  </instruction:message-box>
</instruction:command>
<instruction:call name="func0">
</instruction:call>
<instruction:command name="func1">
  <instruction:with-param  name="a"/>
  <instruction:with-param  name="b"/>
  <instruction:with-param  name="c"/>
  <instruction:message-box>
    <xvcd:value-of select="'in func1()'"/>
  </instruction:message-box>
</instruction:command>
<instruction:call name="func1">
  <instruction:with-param name="a" select="'A'"/>
  <instruction:with-param name="b" select="'B'"/>
  <instruction:with-param name="c" select="'foo(a)'"/>
</instruction:call>
<!-- ==== if then else end ===== -->
<instruction:choose>
  <instruction:when test="$a=''">
    <instruction:variable name="a" select="'1'"/>
  </instruction:when>
  <instruction:otherwise>
    <instruction:variable name="a" select="'2'"/>
  </instruction:otherwise>
</instruction:choose>
<!-- ==== if then elseif end ===== -->
<instruction:choose>
  <instruction:when test="a">
    <instruction:variable name="a" select="'1'"/>
  </instruction:when>
  <instruction:when test="44b">
    <instruction:variable name="a" select="'2'"/>
  </instruction:when>
  <instruction:when test="46c">
    <instruction:variable name="a" select="'3'"/>
  </instruction:when>
  <instruction:otherwise>
    <instruction:variable name="a" select="'4'"/>
  </instruction:otherwise>
</instruction:choose>
<instruction:choose>
  <instruction:when test="a">
    <instruction:variable name="a" select="'1'"/>
  </instruction:when>
  <instruction:when test="54b">
    <instruction:variable name="a" select="'2'"/>
  </instruction:when>
  <instruction:otherwise>
    <instruction:variable name="a" select="'3'"/>
  </instruction:otherwise>
</instruction:choose>

ソースは、まだ ruby らしくない部分も多いし無駄もある。
それを解消すべく  プログラミングRuby 第2版 言語編 という本も買った。

 

| | コメント (0) | トラックバック (0)

2007-06-04

racc で xvcd を生成することを試し始めた (その3)

条件判定、関数定義を実装した。
racc ソースは現状あまりに乱雑なので、ソース掲載は次回の投稿で。

今は こんなふうな変換ができている。

入力
======

# //==== assign ====
message = 'funcall ok'
message = true
message = false
message = message
message = foo(a,b,"x")
message = foo(boo())
message = foo(boo(a))
message = foo(boo(a), zoo(b))

# //==== function-call ====
puts( "abc" )
puts( func0() )
puts( a )

# //==== if then end =====
if "$a=''" then
  x = "ONE"
  y = "TWO"
end

# //==== def func =====
def func0()
a="local"
  puts('in func0()')
end
func0()
#
def func1(a, b, c)
  puts('in func1()')
end
func1("A", "B", "foo(a)")

出力
======

<instruction:variable name="message" select="'funcall ok'"/>
<instruction:variable name="message" select="'true'"/>
<instruction:variable name="message" select="'false'"/>
<instruction:variable name="message" select="$message"/>
<instruction:variable name="message" select="foo($a,$b,'x')"/>
<instruction:variable name="message" select="foo(boo())"/>
<instruction:variable name="message" select="foo(boo($a))"/>
<instruction:variable name="message" select="foo(boo($a),zoo($b))"/>
<instruction:message-box>
  <xvcd:value-of select="'abc'"/>
</instruction:message-box>
<instruction:message-box>
  <xvcd:value-of select="func0()"/>
</instruction:message-box>
<instruction:message-box>
  <xvcd:value-of select="$a"/>
</instruction:message-box>
<instruction:if test="$a=''">
  <instruction:variable name="x" select="'ONE'"/>
  <instruction:variable name="y" select="'TWO'"/>
</instruction:if>
<instruction:command name="func0">
  <instruction:variable name="a" select="'local'"/>
  <instruction:message-box>
    <xvcd:value-of select="'in func0()'"/>
  </instruction:message-box>
</instruction:command>
<instruction:call name="func0">
</instruction:call>
<instruction:command name="func1">
  <instruction:with-param  name="a"/>
  <instruction:with-param  name="b"/>
  <instruction:with-param  name="c"/>
  <instruction:message-box>
    <xvcd:value-of select="'in func1()'"/>
  </instruction:message-box>
</instruction:command>
<instruction:call name="func1">
  <instruction:with-param name="a" select="'A'"/>
  <instruction:with-param name="b" select="'B'"/>
  <instruction:with-param name="c" select="'foo(a)'"/>
</instruction:call>

次のような規則で動いている。

- // で始まる行は xml のコメント要素になる。
- 代入文が、xfy/xvcd の variable 要素になる。
- true, false は定数として扱う。
- def foo(...) が xfy/xvcd の command 要素になる。
- puts が、xfy/xvcd の message-box 要素になる。
- puts 以外の 関数呼び出し foo(...) が xfy/xvcd の call 要素になる
- if ... then  ... end が xfy/xvcd の if 要素になる。
  条件文は、文字列で指定する。(xvcd の <condition:if test="xxx"> の "xxx" そのものを指定する)

次は if ... else ... end, if ... elseif ... end を実装しよう。

この入力言語のレベルで継承機能をサポートすれば、 類似 xvcd の記述が
簡素化できるとも思っている。

そのまえに、unit-test 環境もつくらないと。目視での出力結果チェックはもう無理のなってきている。

| | コメント (0) | トラックバック (0)

2007-06-02

racc で xvcd を生成することを試し始めた (その2)

前回の投稿では、xfy の xvcd には書式が似ていても正しくない出力だった。

前回の出力内容例
---------------

<instruction:variable name="message" select="'test ok'"/>
<instruction:message>
  <xvcd:value-of>abc</xvcd:value-of>
  <xvcd:value-of>xyz</xvcd:value-of>
</instruction:message>

今回は、xvcd の一部分としてはそれなりに正しい出力が得られようにした。
今回の出力内容例
---------------

<instruction:variable name="message" select="'test ok'"/>
<instruction:message-box>
  <xvcd:value-of select="'abc'"/>
  <xvcd:value-of select="'xyz'"/>
</instruction:message-box>
<instruction:message-box>
  <xvcd:value-of select="$message"/>
</instruction:message-box>

これを生成する入力ソースはこれ。

message = "test ok"
puts( "abc", "xyz" )

puts( message )

今回は、
        - ソース中の空行を無視するようにする
        - select="..." の中を'文字列' とか $変数名 と出力する
ようにした。

racc ソースはこれ。(変更部は #-- katoy で印をつけた)

class IntpParser
rule

  program :
          | program stmt EOL
          | program EOL          #-- katoy

  stmt    : funcall
          | assign

  funcall : IDENT '(' args ')'
              {
                result = do_funcall( val[0], val[2] )
              }
          | IDENT '(' ')'
              {
                result = do_funcall( val[0], [] )
              }

  args    : primary
              {
                result = val
              }
          | args ',' primary
              {
                result.push val[2]
              }

  assign  : IDENT '=' primary
              {
                result = do_assign( val[0], val[2] )
              }

  primary : IDENT
              {
                result = do_varref( result )
              }
          | NUMBER
             {
               result = "'" + val[0] + "'"
             }
          | STRING
             {
               result = "'" + val[0] + "'"
             }

end

---- inner
  require 'rubygems'
  require 'builder'
  require 'pp'

  def initialize
    @builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
    @vtable = {}
  end

  def parse( f )
    @q = []

    f.each do |line|
      line.strip!
      until line.empty? do
        case line
        when /¥A¥s+/, /¥A¥#.*/
          ;
        when /¥A[a-zA-Z_]¥w*/
          @q.push [ :IDENT, $&.intern ]
        when /¥A¥d+/
          @q.push [ :NUMBER, $&.to_i ]
        when /¥A"(?:[^"¥¥]+|¥¥.)*"/
          @q.push [ :STRING, eval($&) ]
        when /¥A./
          @q.push [ $&, $& ]
        else
          raise RuntimeError, 'must not happen'
        end
        line = $'
      end
      @q.push [ :EOL, nil ]
    end

    do_parse
  end

  def next_token
    @q.shift
  end

  def do_funcall( func, args )
    #-- katoy
    if func == :puts
       @builder.tag!("instruction:message-box") {
         args.each do |k|
           @builder.tag!("xvcd:value-of", "select"=> k)
         end
       }
    end
  end

  def do_assign( vname, val )
    #-- katoy
    @vtable[ vname ] = '$' + vname.to_s
    @builder.tag!("instruction:variable", "name"=>"#{vname}", "select"=>"#{val}")
  end

  def do_varref( vname )
    @vtable[ vname ] or raise NameError, "un-initialized variable #{vname}"
  end

---- footer

parser = IntpParser.new
if ARGV[0] then
  File.open( ARGV[0] ) do |f|
    parser.parse f
  end
else
  parser.parse $stdin
end

次は、if else の条件文、関数定義 を追加しよう。

xfy/xvcd での <xvcd:choose> <xvcd:when>...</xvcd:otherwise> は書くのも読むのもちょっとシンドイ。これを少しでも簡易できればと思う。

for ループや while ループは、まずどのような xvcd を生成すべきかを検討する必要があるので、すぐには出来そうにないけど、if  else は比較的簡単にできるだろうと予想している。

| | コメント (0) | トラックバック (0)

2007-05-27

racc で xvcd を生成することを試し始めた

racc の参考書として上の本を買ってきた。(racc とは ruby 版 yacc)

第1章の例に対して、ちょっと手をいれて、xml を吐くようにしてみた。
(まだまだ、全然ゴールには遠いが、xfy/xvcd 風の xml を出す第一歩としては十分でしょう。変数の扱い、コマンド定義、条件文 などをサポートしていこう...)

現状はこんな感じ。
-----------

$ cat src
message = "test ok"
puts( "abc", "xyz" )

-----------

$ ruby main.rb src          
<instruction:variable name="message" select="'test ok'"/>
<instruction:message>
  <xvcd:value-of>abc</xvcd:value-of>
  <xvcd:value-of>xyz</xvcd:value-of>
</instruction:message>

ソースは以下。

---------
$ cat intp.y

class IntpParser
rule

  program :
          | program stmt EOL

  stmt    : funcall
          | assign

  funcall : IDENT '(' args ')'
              {
                result = do_funcall( val[0], val[2] )
              }
          | IDENT '(' ')'
              {
                result = do_funcall( val[0], [] )
              }

  args    : primary
              {
                result = val
              }
          | args ',' primary
              {
                result.push val[2]
              }

  assign  : IDENT '=' primary
              {
                result = do_assign( val[0], val[2] )
              }

  primary : IDENT
              {
                result = do_varref( result )
              }
          | NUMBER
          | STRING

end

---- inner
  require 'rubygems'
  require 'builder'

  def initialize
    @builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
    @vtable = {}
  end

  def parse( f )
    @q = []

    f.each do |line|
      line.strip!
      until line.empty? do
        case line
        when /¥A¥s+/, /¥A¥#.*/
          ;
        when /¥A[a-zA-Z_]¥w*/
          @q.push [ :IDENT, $&.intern ]
        when /¥A¥d+/
          @q.push [ :NUMBER, $&.to_i ]
        when /¥A"(?:[^"¥¥]+|¥¥.)*"/
          @q.push [ :STRING, eval($&) ]
        when /¥A./
          @q.push [ $&, $& ]
        else
          raise RuntimeError, 'must not happen'
        end
        line = $'
      end
      @q.push [ :EOL, nil ]
    end

    do_parse
  end

  def next_token
    @q.shift
  end

  def do_funcall( func, args )
    if func == :puts
       @builder.tag!("instruction:message") {
         args.each do |k|
           @builder.tag!("xvcd:value-of", k)
         end
       }
    end
  end

  def do_assign( vname, val )
    @builder.tag!("instruction:variable", "name"=>"#{vname}", "select"=>"'#{val}'")
  end

  def do_varref( vname )
    @vtable[ vname ] or raise NameError, "un-initialized variable #{vname}"
  end

---- footer

parser = IntpParser.new
if ARGV[0] then
  File.open( ARGV[0] ) do |f|
    parser.parse f
  end
else
  parser.parse $stdin
end

| | コメント (0) | トラックバック (0)

2007-05-26

java classloder の利用記事

- http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic_p.html?page=1
> > Add dynamic Java code to your application - Java World

この記事では、特定の folder に置いた java ソースを編集すると、自動的に compile してクラスを再ロードする例が示されている。

- http://codezine.jp/a/article/aid/487.aspx
> > CodeZine:Javaのクラスローディングを制御する(java, クラスローディング, フレームワーク)

- http://codezine.jp/a/article/aid/1271.aspx
> > CodeZine:プラグインで拡張できるJavaプログラムを作る(プラグイン, java)

- http://www.nminoru.jp/~nminoru/java/class_unloading.html
> > Java のクラスアンロード (Class Unloading)

xfy はプラグイン機構を持っている。
上の一番目の記事の方式もサポートするとよいかもしれない。
xfy を再起動しなくても、xvcd ファイルを編集するとすぐに再表示しなおすとか、java で書いたプラグインソースの編集が有効になるとか...
さらには、xvcd, java とは別のシンタックスの言語で 文書の雛形/プラグインを記述すると、
javaソース/xvcd ファイル/初期 xml ファイルを生成し、
プラグインのコンパイル/再ロード が行なわれ、初期文書が表示がされる
と good。
つまり xfy on rails だな。

このあとはピックアップを。

- http://i.loveruby.net/ja/lldn/
> > LLDN / キミならどう書く規定部門 Ruby 編

- http://blog.antenna.co.jp/PDFTool/archives/2007/05/26/#000699
> > PDF 千夜一夜: 2007年05月26日 アーカイブ: xfyの未来は?

- http://hint.at.webry.info/200705/article_21.html
> > 問題点の多い現場と問題点の少ない現場 経営のヒント/ウェブリブログ

- http://d.hatena.ne.jp/hmiyaza1/20070525/1180078958
> > Forgot the Milk. - これは楽しい!10秒でWeb2.0風のボタンをサクサク作れちゃうボタン・ジェネレータ・サービス | My cool button

| | コメント (0) | トラックバック (0)

2007-05-25

xfy でのアプリ作成のデザインパターンや Hack のページはないのか?

xfy でのアプリ作成は、既存の発想とちょっと頭を切り替える必要がある。
xfy,xvcd, java を組み合わせる上でのデザインパターンや、tips/hack の情報が必要だ。
まだそういったページ/サイトが無いなら、自分でつくるか?

例えば、
  xvcd:text-of は他の要素を依存を持たない編集には向く。
  でも 別要素と関係があり編集結果のチェック/更新反映が煩雑になる場合は、ダイアログを使うのがよい。

  ダイアログを使うときは、ダイアログ用の xml を用意するのがよい。
  そして、その xml を直接 xvcd で処理することは避ける。
  xml に相当する java クラス(DOMではなく、必要な操作に特化したメソッドをもった) を用意し、そのインスタンス上で操作をするようにする。
  当然 ダイアログを [OK] ボタンで閉じる時は、ダイアログ用の java インスタンスから srcDOM に値を反映させるようにする, ...

なんて、いろいろネタはある。
サンプルコードや図と共に示していかないと...

| | コメント (0) | トラックバック (0)

2007-05-23

racc で xvcd を吐き出す言語を設計しようかな

java の世界には javacc という コンパイラコンパイラがある。
ruby では、racc というものがあることを知った。

- http://www.mnet.ne.jp/%7Etnomura/racc.html
> > Racc で遊ぼう

別の言語を設計して、実行結果として xvcd を吐き出すような処理系をつくったらどうだろう。
ミニ言語設計といえば、コンパイラコンパイラを使ってみたいものだ。

その言語上で差分プログラミングをサポートすることで、xvcd の再利用や継承利用を可能のしようというもくろみだ。

あるいは、xfy の java での xpath 関数実装や、インストラクション実装を吐き出すという案もある。

| | コメント (0) | トラックバック (0)

2007-05-22

Youtube を扱える ruby API, Rubyで作るProlog処理系, etc...

Youtube を扱える ruby API があることを知った。

- http://d.hatena.ne.jp/t-imaizumi/20070207/1170814526
> > t-imaizumiのMacとかのはなし - YouTubeのAPIを使ってみる。

このページによれば、他にもおもしろそうな API がたくさんあるようだ。

xfy 実験室 (http://xfy.justblog.jp/labs/ )で、 こういった ruby/perl のライブリーを利用した例も取り上げてみて欲しいなぁ。

ああ、こんな例も見つけた。
- http://codezine.jp/a/article/aid/461.aspx
> > CodeZine:Rubyで作るProlog処理系(Ruby, Prolog, 自動推論, 記号処理)

先日、"yaml <-> xml の相互変換 (名前空間に対応)"
http://youichi-kato.cocolog-nifty.com/blog/2007/05/xaml_xml_1777.html
を投稿した。
これを作っていて、思いついたことが1つある。
xfy の xvcd を ruby をつかって生成するのだ。

ちょっとした条件判定は if ()...else()  のような書式で書いておいて、
ruby で変換させるようにするとか...
また、共通で使う xvcd 記述を #incllude "lib/foo.xvcd" みたい記述しておいて、
ruby で include を展開させた結果を生成するとか...

ともかく xvcd の差分プログラミングを可能にする手法を構築したいものだ。
そのための手段 として、java でなく ruby のようなスクリプトを使うのが楽な気がする。

| | コメント (0) | トラックバック (0)

2007-05-19

yaml <-> xml の相互変換 (名前空間に対応)

yaml <-> xml の相互変換。
完全な変換はできないが、そこそこの動作をするものが出来た。

(jruby でも動作する。
  gem で builder, xml-simple を install することが必要。
  $ jruby $JRUBY_HOME/bin/gem install buildre
  $ jruby $JRUBY_BOME/bin/gem install xml-simple
)

以下に xml->yaml のソース、yaml->xml のソースを示し、変換結果例を示そう。

xml->yaml は次のようにする。
  xml -> Hash -> yaml

---- yaml2xml.rb ----
# See http://www.namikilab.tuat.ac.jp/%7Esasada/prog/yaml.html#i-2

# gem install xml-simple

require 'yaml'
require 'rexml/document'
require 'rubygems'
require 'xmlsimple'
require 'pp'

good_xml = %{
<groceries>
<bread>Wheat</bread>
<bread>Quadrotriticale</bread>
</groceries>}

# puts "----------------"
# doc = XmlSimple.xml_in good_xml
# pp doc
# puts doc.to_yaml

doc = XmlSimple.xml_in File.open(ARGV[0])
puts "----------------"
puts doc.to_yaml
puts "----------------"
pp doc

yaml->xml は、http://www.unfitforprint.com/articles/2005/09/23/yaml2xml-in-33-lines-or-your-money-back
にあったコードを元に、xml 宣言を出力する/namespace, prefix 指定を可能にするようにしてみた。

---- yaml2xml.rb ----
# See  http://www.xml.com/lpt/a/1637
#      http://www.unfitforprint.com/articles/2005/09/23/yaml2xml-in-33-lines-or-your-money-back
#
# Modifyed by katoy 2007-05-18

require 'yaml'
require 'rubygems'
require 'builder'
require 'pp'

class Yaml2Xml

  def initialize roottagname, prefix="", uri=""
    @roottagname = roottagname
    @prefix, @url = prefix
    @url = uri

    # @builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
    @buffer=""
    @builder = Builder::XmlMarkup.new(:target=>@buffer, :indent=>2)
  end

  def buffer
    return @buffer
  end

  def to_xml src
    @builder.instruct!
    if @prefix == ""
      @builder.method_missing(gentag(@roottagname)) {
        process_source src
      }
    else
      @builder.method_missing(gentag(@roottagname), "xmlns:" + @prefix => @url) {
        process_source src
      }
    end
  end

  def yaml2xmlChild src, tagname
    if src.is_a?(Hash)
      @builder.method_missing(gentag(tagname)) {
        process_source src, tagname
      }
    elsif src.is_a?(Array)
      process_source src, tagname
    else
      @builder.method_missing(gentag(tagname), src)
    end
  end

  def process_source src, tagname=""
    if src.is_a?(Hash)
      src.each do |name, value|
        unless value.kind_of?(Hash) or value.kind_of?(Array)
          @builder.method_missing(gentag(tagname), value)
        else
          yaml2xmlChild value, name
        end
      end
    elsif src.is_a?(Array)
      src.each do |value|
        unless value.kind_of?(Hash) or value.kind_of?(Array)
          yaml2xmlChild value, tagname
        else
          if value.empty?
            yaml2xmlChild "", tagname
          else
            yaml2xmlChild value, tagname
          end
        end
      end
    else
      @builder.method_missing(gentag(tagname), value)
    end
  end

  def gentag tagname   
    return tagname if @prefix == ''
    return @prefix + ":" + tagname
  end

end

yaml = YAML::load(File.open(ARGV[0]))
# puts "---- YAML ----"
# pp yaml
# puts yaml.to_yaml

puts "---- XML ----"
x = Yaml2Xml.new 'root', 'ab', 'http://xxx.com'
x.to_xml yaml
puts x.buffer

これを利用して、xml -> yaml -> xml 変換した結果を示そう。
最初のxml:
========

  xfy のチュートリアル中の住所録 xml の形式をまねたものだ。

<?xml version="1.0" encoding="UTF-8"?>
<ab:root xmlns:ab="http://xxx.com">
  <ab:entry>
    <ab:address>Rochester, NY USA</ab:address>
    <ab:person>George Adams</ab:person>
  </ab:entry>
  <ab:entry>
    <ab:address>Denver, Colorado USA</ab:address>
    <ab:person>Betty Jackson</ab:person>
  </ab:entry>
  <ab:entry>
    <ab:address></ab:address>
    <ab:person></ab:person>
  </ab:entry>
  <ab:entry></ab:entry>
</ab:root>

xml->yaml 結果
=============
実際のコンソール出力から yaml 部分を抜粋したもののみを示す。

$ ruby xml2yaml rb 1.xml
entry:
- address:
  - Rochester, NY USA
  person:
  - George Adams
- address:
  - Denver, Colorado USA
  person:
  - Betty Jackson
- address:
  - {}

  person:
  - {}

- {}

xmlns:ab: http://xxx.com

yaml->xml 結果
=============

上の結果の最後の行の xmlns:ab: http://xxx.com を削除したものについて実行する。(実際のコンソール出力から xml 部分を抜粋したもののみを示す)

$ ruby yaml2xml.rb 2.yaml
<?xml version="1.0" encoding="UTF-8"?>
<ab:root xmlns:ab="http://xxx.com">
  <ab:entry>
    <ab:address>Rochester, NY USA</ab:address>
    <ab:person>George Adams</ab:person>
  </ab:entry>
  <ab:entry>
    <ab:address>Denver, Colorado USA</ab:address>
    <ab:person>Betty Jackson</ab:person>
  </ab:entry>
  <ab:entry>
    <ab:address></ab:address>
    <ab:person></ab:person>
  </ab:entry>
  <ab:entry></ab:entry>
</ab:root>

これで、ruby で生成したデータを xml 化して、xfy/xvcd に送り込むことが出来そうだ。
ruby で RDB などにアクセスして得たデータや、druby や rinda 上で取得したデータなども xml に加工して xfy/xvcd に送り込める。

逆に xfy/xvcd から 渡される xml を ruby 側で hash/yaml にして、それ以降の処理を行うこともできる。

| | コメント (0) | トラックバック (0)

2007-05-16

rinda と xfy の組み合わせ

ruby には rinda という分散処理のフレームワークがある。

- http://www2a.biglobe.ne.jp/%7Eseki/ruby/rinda.html
> > Rinda2

> Rindaは分散処理システムLindaのtuple spaceのRubyによる実装です Lindaではタプルとタプル空間の二つの概念があります。タスクはタプルをタプル空間へ書き込んだり、タプル空間からタプルを取り出したりすることで通信を行ないます。書き込み、取り出しはアトミックな操作です。パターンマッチングによって取り出すタプルを指定するところが特徴です。

ruby クックブックにも rinda の利用例がある。

- http://www.oreilly.co.jp/books/9784873113241/toc.html
> > レシピ7.12 共有「ホワイトボード」の作成
> > レシピ7.14 RindaによるDRbサービスの自動検出

xvcd をネット経由で提供する仕組みとして、この rinda をつかってみてはどうだろうか?
ローカルマシン上では解決できない未知の xml ボキャブラリーがあったら、
ネット経由で検索しに行くようにするのだ。

あるいは、xml文書の断片をホワイトボード上に置き、複数の xfy クライアントで同時に
編集/閲覧をするようにするのだ。
ネット対戦のボードゲーム(オセロとかトランプとか)をつくろに利用できそうな気がする。

私の環境上の jruby1.0.0 では rinda は動作しなかったけど、ruby をつかえばいいだけの話。

rinda についてgoogle していて、ついでにこんな例を見つけた。
- http://www.druby.org/ilikeruby/ruby_amazon.html
> > ruby-amazonでAmazonWebService
キーボードから単語を入れると、amazon 上で検索をした結果が返ってくるという例だ。

これを動作させるには アマゾンウェブサービスを利用するための id を~/.amazon_key におく必要がある。

このサンプルプログラムの GUI を xfy を使って作るというのも面白かもしれない。

| | コメント (0) | トラックバック (0)

2007-05-13

jruby で gzip を扱う。

Rubyist Magazine の Zlib の紹介記事を読んだ。
   http://jp.rubyist.net/magazine/?0018-BundledLibraries

簡単に zip/gzip を扱えるな。
以下のコードは ruby/jruby ともに動作する。

# See http://jp.rubyist.net/magazine/?0018-BundledLibraries

require 'zlib'

orig = 'foo.txt'
gziped = orig + '.gz'

# create gziped file
#-------------------
Zlib::GzipWriter.open(gziped, Zlib::BEST_COMPRESSION) do |gz|
  gz.mtime = File.mtime(orig)
  gz.orig_name = orig
  gz.write File.open(orig, 'rb'){|f| f.read }
end

# gzcat
#------------------
Zlib::GzipReader.open(gziped) do |gz|
  puts gz.read
end

#--- End of File ---

xfy で、zip 保存したり、zip された xml を開くようなプラグイン
http://youichi-kato.cocolog-nifty.com/blog/2006/11/xfy_m.html
を java でつくって公開したことがあるけど、jruby で書いたほうが極めて簡単にかけるな。

xfy の Open/Save  コマンドへのフックを PRagger の confi.yaml 形式で書いて、そのなかに zip/unzip plagin を指定すると、save 時のダイアログに zip 圧縮をするか否かのチェックボックスが現れるなんていうようになると便利になるだろう。

同様の発想で、cvs アクセス、svn アクセス、webdav アクセス、XML-DB アクセス、gspace アクセスなプラグイン、PDF 化、暗号化、etc... のプラグインをつくればよいかもしれない。

| | コメント (0) | トラックバック (0)

2007-05-12

xfy blog editor の変形で、 xfy mixi editor はつくれるか?

PRagger で mixi や google 検索を扱うものはあるようだ。

- http://ruby.g.hatena.ne.jp/emergent/20070321/1174494118
> > はてな?Rubyグループ - emergentの日記 - mixi投稿プラグイン:mixi_diary_writer.rb

- http://ruby.g.hatena.ne.jp/garyo/20070223/1172219371
> > はてな?Rubyグループ - Rubyの魔神 - PRaggerプラグイン Mixi新着日記プラグイン

- http://ruby.g.hatena.ne.jp/garyo/20070226/1172480219
> > はてな?Rubyグループ - Rubyの魔神 - PRaggerプラグイン Google検索プラグイン

これを流用/応用して、xfy と組み合わせればなんとかなりそうな気がする。
xvcd も小さな xvcd を yaml で連結して使えるようにするといいかもしれない。
xfy/xvcd でサクッと拡張機能をつくれるようにするのは何が必要なんだろう。
xml を意識しないで済むような開発環境が提供されれば、xfy利用がもっと増えると思う。

| | コメント (0) | トラックバック (0)

2007-05-11

jruby の $: の設定はどうなっているのか?

xfy から jruby の次のスクリプトを実行させたら、
requiere の部分でそんなファイルはないとのエラーになった。

require 'mathn'
1/2 + 1/3

jruby のライブラリーパスが通っていないようなので、つぎのようにスクリプトを書き換えたら、動作した。

$:<< "/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/site_ruby/1.8"
$:<< "/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/site_ruby"
$:<< "/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8"
$:<< "/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/java"
$:<< "lib/ruby/1.8"
$:<< "."

require 'mathn'
1/2 + 1/3

ここでの代入値は、普通にコンソールから jirb を動作させて $: を評価させた時の
値から導いている。

$ jirb
$irb(main):001:0> $:
=> ["/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/site_ruby/1.8", "/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/site_ruby", "/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8", "/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/java", "lib/ruby/1.8", "."]
irb(main):002:0>


$: の内容を明示的に指定しなくても、xfy の xvcd から jruby スクリプトを評価できるようするには、どうしたらいいんだろう。

jruby のソースを読むかな?

あるいは google すれば同じ事で悩み、かつ解決させた人をみつけられるか?

| | コメント (0) | トラックバック (0)

2007-05-09

jruby 実行する xpath 関数を xfy1.5 対応して再公開 その2

http://youichi-kato.cocolog-nifty.com/blog/2007/05/jruby_xpath_xfy_cfe7.html
>> katoy: cocolog: jruby 実行する xpath 関数を xfy1.5 対応して再公開
で書いたけど、
jruby 0.9.9 では、exception が発生していたので、0.9.8 を使っていた。

jruby 1.0.0RC1 を download してみたら、こんどは動作した。
素晴らしい。

http://dist.codehaus.org/jruby/talks/  には、
  JRuby-GoRuCo-2007.pdf (24-Apr-2007 11:36)
なんてプレゼン資料があるのにも気がついた。

jruby を interprited でなく compiled で実行すると、ずいぶん速くなるようなことが書かれている。

| | コメント (0) | トラックバック (0)

2007-05-05

jruby 実行する xpath 関数を xfy1.5 対応して再公開

以前に公開していた xfy での拡張 xpath 関数の例
 * 外部コマンド呼び出し、jruby スクリプト評価、jruby の外部ファイルスクリプト評価の xpath 関数
を、xfy1.5 用にして動作確認したソースを以下に置きました。
(本質的な変更は特にない。build.xml の変更と ソースの多少の整理のみ)
 
  - http://homepage2.nifty.com/youichi_kato/src.html
    >> xfy 1.5 対応
    >>   plugins-2007-05-05.tgz(2007-05-05)

tgz ファイルに含まれている 00Readme.txt の内容を引用します。

--------------------------------------------------------

環境:
  xfy : xfy-be1_5-070322 Folder
  jruby: 0.9.8

build:
  ant

動作例:
  $ run.sh   // xfy を起動する
  hello.xml を読み込む。

  この xml  中では
    OS コマンドの "pwd" の実行結果の表示
    ruby スクリプト "1+2*3" の実行結果の表示
    ruby スクリプト sample.rb の実行結果の表示
  をしている。

備考:
jruby 0.9.9  では、
   edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock
の例外が発生する。
web 上でも類似のことが報告されている。
- http://archive.jruby.codehaus.org/user/MPG.2098353cf4ec0ae8989ab6@news.gmane.org
>> Problem moving from 0.9.8 to 0.9.9, probably setup issue

--------------------------------------------------------
この環境を基にして
   yaml 形式のデータ -> xfy で表示
   xfy での編集結果 -> yaml 形式で保存
といった例や、
   住所データを記入する際に RDB から郵便番号を検索し選択できる
といった例を jruby と組み合わせて作成していく予定です。

| | コメント (0) | トラックバック (2)

2007-05-03

xfy + cvs + jruby で何ができるか?

ruby で csv を扱う例を見つけた。
ruby で xml を扱う例を見つけた。

これを "xfy から ruby/jruby を呼出す" 事と組み合わせれば、
xfy で cvs を表示する例が簡単に作れそうだ。
(xfy からrubyを呼び出すことで xml を得て、xvcd の template を適用する。
   <xvcd:apply-templates select="function:xml-string-to-dom($output)"/>

呼び出す ruby コードでは、 cvs を読み込み、必要に応じて何らかの処理をする。
  さらに xml に変換して xfy には、文字列として返すのだ。)

以下の例は、java, jruby で動作する。

CSV を扱う例:
===========
- http://tmtm.org/ja/tdiary/?date=20070412
> > tmtm日記(2007-04-12): SimpleCSV
- http://tmtm.org/ja/ruby/lightcsv/
> > LightCsv: CSV をパースして配列を返す。
(この LightCsv は FasterCVS よりも速いらしい)

require "lightcsv"
s =<<EOS
0,1,2
"a","b","c"
X,,Z
EOS

LightCsv.parse(s){|row| p row}
#["0", "1", "2"]
#["a", "b", "c"]
#["X", "", "Z"]

LightCsv.new(s).each{|row| p row}
#["0", "1", "2"]
#["a", "b", "c"]
#["X", "", "Z"]

p LightCsv.parse(s)
#[["0", "1", "2"], ["a", "b", "c"], ["X", "", "Z"]]

p LightCsv.new(s).map
#[["0", "1", "2"], ["a", "b", "c"], ["X", "", "Z"]]

XML を扱う例:
===========
- http://www.nslabs.jp/ruby-rexml.rhtml
> > Netsphere Laboratories: RubyでXML (REXML)

require "rexml/document"

source = <<EOF
<?xml version="1.0"?>
<foo><bar />
    <baz>ho&lt;ge</baz>
</foo>
EOF

doc = REXML::Document.new source
puts doc
#<?xml version='1.0'?> 
# <foo><bar/>
#    <baz>ho&lt;ge</baz>
#</foo>

| | コメント (0) | トラックバック (0)

2007-04-29

derby に郵便番号をインポートしてみた

- http://blog.masuidrive.jp/articles/2006/02/08/rake-import_zip
> > 郵便局のサイトから自動で郵便番号データをインポートする

この記事をもとに derby に全国の郵便番号を インポートしてみた。
jruby での rails 環境をつかった。
Rakefile 中の NKF.nkf("-w -S",line) の部分が動作しない。
(google すると jruby では NKF は使えないとの記載が見つかる。)
そこで、文字コード変換は手作業で行い、Rakefile をすこし書き換えた。

テーブルを作るための SQL は次のようにした。

create table zips (
  zip varchar(7),
  prefecture_id int,
  city varchar(64),
  town varchar(256)
);

インポートに1時間以上かかった。
scaffold で生成させた データ閲覧アプリも問題なく動作したが、ページ移動にも10数秒かかる!
これでは使えない。

derby で大量データを扱うのは無理なようだ。
(全国郵便番号は、12万件、csv ファイルのサイズは17MB ある。)

xfy + derby で郵便番号を扱う例を作ろうと思ったが、この反応速度では無理。
普通に mysql を使うような例をつくるか、もっと小さいデータ規模での例に方向変換しよう。

| | コメント (0) | トラックバック (0)

2007-04-22

xfy でリバーシゲームをつくってみないか?

SVG をつかって盤面を表示する例がどこかにないかなぁ。

ネット上にはたくさん リバーシ(オセロ)ゲームがある。

MacOX の widget
  > > http://www.dashboardwidgets.com/showcase/details.php?wid=478
なんかはよく出来た盤面表示になっている。

思考ルーチンもネット上で沢山 入手できる。
 - http://dais.main.jp/reversi/
 > > コンピュータリバーシ研究会

思考ルーチンの実装言語は、java, ruby, C++ なんでもよいだろう。
盤面情報を渡したら次の手をかえすような形の API さえ用意できれば、
xfy から利用できるようにするのは簡単なことだ。
(思考ルーチンをWebService 化することも一つの案としてあり得る)

ネット対戦も。ちょっとしたネット通信を xfy に組み込めばOKだろう。
(すでに echoサーバーを組み込むことの実験はすんでいるし)

| | コメント (0) | トラックバック (0)

2007-04-20

corner.js (画像表現のちょっとしたカスタマイズ)

http://www.netzgesta.de/corner/

これは便利!
web ページ中の画像のコーナー表現を簡単にカスタマイズできる javascript だ。
コーナーをぼかす、影をつけて浮き上がっているようにみせるなんてことができる。

同様のことを xfy で行うにはどうする?
(ほんとうは この corner.js をそのまま xfy で利用できるのが一番いいんだけど.
  xfy は javascript を扱えないからなぁ)

javascript -> xvcd のコマンド なんてツールをつくることは可能か?

| | コメント (0) | トラックバック (0)

2007-04-15

xml と xvcd の関係を記述する方法が必要?

ある xml 文書を xfy で表示させようとすると、
タグにどの xvcd を適用させるかは、 xfy が自動的に割り当ててくれる。
適用可能な xvcd が複数ある場合、ユーザーがメニュー操作をすることで別の xvcd を
適用させるようにはできる。

この xvcd 適用ルール集をユーザーが定義/管理できる方法が欲しい。
(woindows でいえば、拡張子ごとに、ダブルクリック時の起動するアプリの設定をできることに相当する)

ここで、問題が複雑になるのは、xml が復号文章の場合だ。
同じ <foo> タグでも、それが <A> タグの文書中の含まれていたか、<B> タグの文書中に
ふくまれていたかで、<foo> に適用する xvcd を別々の定義したという要求がでてくるだろう。

こういった関係を簡潔に記述する xml 構造はどんなものがあるだろうか?

複数の適用可能性があったら、それらをすべてタブシート分けてすべて表示してしまい、
ユーザーがタブシートを取捨選択するという風にするのも良いかもしれない。

xfy では文書を開く場合、文書としての xml を選択する。
でも、xvcd としての xml を最初に選ぶと、その xvcd を適用可能な 文書xml が選択絞り込みされ、
そこから文書を選択するという インターフェースも考えられかもしれない。

web サービスにおいては WSDL というものがあるが、それと類似/拡張したようなものが必要なのかも。
xvcd をサービスと考える。または xml 文書こそを サービスと考えるのか?
はたまた、どちらもサービスとして捉えていくのか?

| | コメント (0) | トラックバック (0)

2007-04-08

"xfy でのTable 操作の例" を更新 その3

Xfytable_3

"xfy でのTable 操作の例" を更新 その2 をさらに更新しました。

- http://homepage2.nifty.com/youichi_kato/src.html
  xfy で template でテーブルを xhtml でつくる際に、テーブル操作を付加する例
    2007-04-07: チェックボタンや削除ボタンの自動 on/off, グレーアウト機能を追加
    スクリーンショット  http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/Xfy-Table.png
    AddressBook.xml    http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/AddressBook.xml
    AddressBook.xvcd    http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/AddressBook.xvcd
    plainold.css    http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/plainold.css

初期画面で、列毎の削除チェックボックスが赤くなっているのを解消した。
一つも削除チェックボックスが on になっていない場合は、削除ボタンを無効にしたり、
全部のチェックボックスを on にしたら、自動的に一括チェックon のチェックボックスをon にするなどのイベント処理を追加した。

ただし、undo で削除した行を復活させた場合などに、削除ボックスの無効性や一括チェック on の状態は更新されない orz.
どうすれば、こういった場合もうまく動作するようになるかなぁ...

テーブル形式のデータについて、毎回 これだけの量の xvcd を書くのは大変。
データ参照の xpath だけを与えれば xvcd が生成されるようにすることも考え中...

| | コメント (0) | トラックバック (0)

2007-03-30

plot2D/3D のファーストインプレッション

xfy のプラグイン plot3D ( http://www.hpc.cs.ehime-u.ac.jp/xfy/plot3D/ )
を download して動かしてみた。

まだ、MacOSX についている Grapher にはおよばないなぁ。
Grapher みたいに自動で図が回転して欲しい。
メモリー不足になるのか、しばらく操作しているとフリーズする事が多い。
(古い iBookG4, メモリー 760MB では無理なのか?)
下の画像は Grapher のスクリーンショット。これと同じ図形を出すには
Plot3D ではどのように式を入力すればよいかがわからない...
Grapher

数式を直接あつかうのもおもしろいけど、
データをあたえて、その共分散構造分析の図を表示するようなプラグインを開発している方はいないのかなぁ。

| | コメント (0) | トラックバック (0)

2007-03-26

xfy の xpath関数で ruby文を評価させようと試行中:002

Xfytutorialplugin20070326

Rubyswing20070326

xfy からの jruby 実行用の xpath 関数として2つのものを作りました。
また、 jruby で swing を呼び出す例もつくりました。
以下にソースを置いています。
- http://homepage2.nifty.com/youichi_kato/src.html からの
    xfy で jruby を実行して九九の表をつくる (2007-03-26)
    jruby 実行のスクリーンショット(九九の表)
    jruby 実行のスクリーンショット(swingの呼び出し)

xpath 関数
==========
1. example:ruby(String script)
2. examp;e:ruby-file(String filePath)

1 の使用例
  <xvcd:variable name="ret" select="('a=2')"/>
  複数行の jruby スクリプトを記述できます。
  最後の行の評価結果が文字列として返ります。
  スクリプト中で <,> を使う場合は &lt;, &gt; と記載する必要があります。

2 の使用例
    <xvcd:variable name="ret" select="/tmp/code.rb"/>
 指定ファイルに書かれている jruby コードを実行します。
   最後の行の評価結果が文字列として返ります。
  ファイル中での <.> のエスケープ処理などは不要です。

上の2つの使用例として九九の表を生成する例が
   data/hello-99.xml, data/hello.xvc, data/9x9.rb
にあります。(9x9.rb は /tmp/9x9.rb に copy してから実行してください)

また、jruby から swing を利用して、window を作る例もつくりました。
ただし、現状ではスクリーンショットにあるように、エラーダイアログが出てしまっています。
でも jframe での window は表示できています。
xfyClient.jar のダブルクリックや、 xfyClient.sh での実行では 別のエラーが出て
jframe の表示には至りません。(builtin/java/ 云々が load できないとのエラー)
公開ファイル中の run.sh として置いていますが、com.xfy.startup.XfyStartup を指定して実行するように指定すると うまく動作しました。(eclipse から xfy を起動する場合と同じ方法)

exec "$EXEC_JAVA" -Xms256M -Xmx512M ¥
-cp $JRUBY_HOME/lib/jruby.jar:xfyClient.jar ¥
-Dcom.xfy.startup.XfyStartup.without-jvm-restart=true ¥
-Xms256M -Xmx512M ¥ -Dcom.xfy.startup.XfyStartup.without-jvm-restart=true ¥ com.xfy.startup.XfyStartup "$@

| | コメント (0) | トラックバック (1)

2007-03-25

xvcd で九九の表をつくる: jruby を利用したケース

Xfytutorialplugin20070324

なんとか、xfy + jruby で 九九の表を生成/表示させることができた。
以下にソース一式を置いた。
- http://homepage2.nifty.com/youichi_kato/src.html
 xfy で jruby を実行して九九の表をつくる (2007-03-24)
 jruby 実行のスクリーンショット

jruby で生成した html のデータをそのままつかうのはあきらめ、template を apply させて table を生成した。

その前に jruby インタープリターインスタンスを毎回作らずに、 xpah 関数インスタンスのなかで一度だけ作るようにした。

--------

    private final Ruby runtime = Ruby.getDefaultInstance();

    public Value call(final Arguments args, final Context context)
            throws ValueException {
        // Checking the Number of Function Arguments
        // example:hello(string) takes single argument
        FunctionUtility.checkCount(context, args, 1);

        // Evaluates the first argument as a string.
        final Value v = args.getArgument(0);
        final String rubyCode = v.getAsString();
        String ans;

        try {
            RubyObject rubyStr = (RubyObject) runtime.evalScript(rubyCode);
            ans = rubyStr.toString();
        } catch (final Exception e) {
            System.err.println(e);
            ans = e.getMessage();
        }

        // Returns the result
        if (ans == null) {
            ans = "[null]";
        }
        return new StringValue(ans);
    }

jruby のコードはこれ。

a = ""
a << "<table>¥n"

a << "  <tr>¥n"
a << "    <th></th>"
for x in 1..9
  a << sprintf("<th>%d</th>", x)
end
a << "  </tr>¥n"

for y in 1..9
  a << "  <tr>¥n"
  a << sprintf("    <td>%d</td>", y)
  for x in 1..9
    a << sprintf("<td>%d</td>", x * y)
  end
  a << "¥n"
  a << "  </tr>¥n"
end

a << "</table>¥n"

a

実際の xml ファイル中では <, > を&lt;, &gt; に置換して書き込んでいる。
mx、my はテーブルの横、縦の数を設定することができるようにしてある。

xml の内容の抜粋はこれ。

  <h:ruby1>

a = ""
a &lt;&lt; "&lt;table&gt;¥n"

  省略

a &lt;&lt; "&lt;/table&gt;¥n"

a

  </h:ruby1>

xvcd の内容の抜粋はこれ。

  <!-- ============== -->
  <!-- eval ./text(), insert result in ../h:div -->
  <xvcd:template match="h:ruby1">
    <ctrl:trigger>
      <ctrl:label>Show matrix</ctrl:label>
      <xvcd:action event="ctrl:triggered">
        <instruction:variable name="val"
          select="example:ruby(./text())" />

        <xvcd:delete select="../h:div/*" />
        <xvcd:insert ref="../h:div" position="last-child">
          <xvcd:copy-of select="function:xml-string-to-dom($val)" />
        </xvcd:insert>
      </xvcd:action>
    </ctrl:trigger>

    <ctrl:trigger>
      <ctrl:label>Clear</ctrl:label>
      <xvcd:action event="ctrl:triggered">
        <xvcd:delete select="../h:div/*" />
      </xvcd:action>
    </ctrl:trigger>
  </xvcd:template>

ループ処理は、xvcd よりは jruby だと格段に手軽に書けるなぁ。
ただ スクリプトに <, >  をそのまま書けないので、読みにくい。
(CDATA で記述すればいいのか?)

jruby スクリプトを別ファイルに置いて、それを xvcd で読み込んで、<, > の置換をしてから実行するということも試みているが、まだうまく動作していない。
(公開ファイル中にはその試行ファイルも含まれています)

次は jruby 側の変数の read/write を xvcd 側から行うこと試していきたい。

複合文書を扱える xfy なら、アプリ(プラグイン)記述も複合言語(XSLT 系、他のスクリプト言語系) を扱えるようにするのが良いかもしれない。

| | コメント (0) | トラックバック (0)

2007-03-24

xvcd で九九の表をつくる: jruby を利用して try中

jruby の次のようなコードで, html の table で九九の表を生成できる。
(jruby で実行させる場合、最後に p a などとして a の内容を表示させる必要がある)

------------------------------
attr = 'align="right" width="20"'

a = "<html><body>"
a << "<table border='1'>¥n"

a << "  <tr>¥n"
a << "<th></th>"
for x in 1..9
  a << sprintf("<th %s>%d</th>", attr, x)
end
a << "  </tr>¥n"

for y in 1..9
  a << "  <tr>¥n"
  a << sprintf("<td>%d</td>", y)
  for x in 1..9
    a << sprintf("<td %s>%d</td>", attr, x * y)
  end
  a << "¥n"
  a << "  </tr>¥n"
end

a << "</table>¥n"
a << "</body></html>"

このコードの <, > を &lt; &gt; に変更する。
さらに 生成するのは <tqable>...</table> 部のみにして、
xfy で実行させてみることもできた。

しかし、jruby の実行結果の html をxfy 画面に表示させることが出来ない。
こんな xvcd にしているのだが...

  <!-- ================= -->
  <xvcd:command name="add-result">
    <instruction:with-param name="val" />
    <instruction:with-param name="pos" />
    <xvcd:insert ref="$pos" position="last-child">
      <xvcd:copy-of select="$val"/>
    </xvcd:insert>
  </xvcd:command>

  <!-- ================= -->
  <xvcd:template match="h:ruby2">
    <xvcd:variable name="val" select="example:ruby(./text())" />

    <ctrl:trigger>
      <ctrl:label>Show result</ctrl:label>
      <xvcd:action event="ctrl:triggered">
        <instruction:call name="add-result">
          <instruction:param name="val" select="function:xml-string-to-dom($val)"/>
          <instruction:param name="pos" select="../h:div"/>
        </instruction:call>
      </xvcd:action>
    </ctrl:trigger>
  </xvcd:template>

  <xvcd:template match="h:div">
    <div>
      <xvcd:copy-of select="./*"/>
    </div>
  </xvcd:template>

ソース DOM 上の <h:div> 以下には jruby で生成した table データがうまく追加される。
しかしその内容が表として画面に表示されない。
(xvcd はむずかしいなぁ... ajax だと javascript で <div> 以下に要素を追加するだけで表示に反映されるけど...)

| | コメント (0) | トラックバック (0)

2007-03-23

xfy の xpath関数で ruby文を評価させようと試行中:001

昨日の xfy からの jruby 呼び出し で window を出す例を試してみたがうまくいかない。

これが、xml に書いた jruby コード。

  <!-- See http://journal.mycom.co.jp/special/2007/jruby/005.html -->
  <h:ruby>
  require 'java'

  include_package 'javax.swing'

  frame = JFrame.new("Hello World!")
  label = JLabel.new("Hello World!")

  frame.getContentPane().add(label)
  frame.setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE)
  frame.setSize(200,100)
  frame.setVisible(true)
  </h:ruby>

この jrubyコード自体は、 jruby で実行できることは確認している。
ところが xfy から評価させると、
  no such file to load -- builtin/java/exceptions
のエラーになってしまう。
jruby が利用する各種 ファイルが xfy からの起動では読み込めていないのだろうと想像される。
どこをどうすればうまくいくようになるかなぁ。
# builtin/java/exceptions って そもそも どこにある?

これが動作するようになれば、xfy での各種ダイアログを xvcd でなく、jruby で書けるようになる見通しがたつんだが...

| | コメント (0) | トラックバック (0)

2007-03-21

xfy の xpath関数で ruby文を評価させようと試行中(再挑戦)

xfy の xpath関数で ruby文を評価させようと試行中
という記事を投稿したことがある。今回 それに再度 try したら、うまくできた。

Xfytutorialplugin20070321

xfy の xpath 関数として、jruby スクリプトの評価結果を返すものが作れた。
再挑戦では jruby 0.9.8 をつかった。こんどはすんなりと動作した。

http://homepage2.nifty.com/youichi_kato/src.html から
  xfy で jruby を実行する (2007-03-21)
  jruby 実行のスクリーンショット
として、{eclipse プロジェクト、build.xml 、ソース一式}, スクリーンショットを置いた。

上のスクリーンショットは次のように書いた xml を読み込んだ結果だ。

  <h:ruby>
    a=0
    20.times{|i| a+=i}
    a
  </h:ruby>

  <h:ruby>"Hello" + " jruby."</h:ruby>

xfy の bin/common 下に
    org.jruby/jruby.jar
    org.objectweb/asm-2.2.3,.jar, asm-commons-2.2.3.jar
を置いて、xfy から jruby 関係 jar を呼び出せるようにした。

java 側のコードは簡単。(RubyFunction.java からの抜粋)

    public Value call(final Arguments args, final Context context)
            throws ValueException {
        // Checking the Number of Function Arguments
        // example:hello(string) takes single argument
        FunctionUtility.checkCount(context, args, 1);

        // Evaluates the first argument as a string.
        final Value v = args.getArgument(0);
        final String rubyCode = v.getAsString();
        String ans;

        final Ruby runtime = Ruby.getDefaultInstance();
        try {
            RubyObject rubyStr = (RubyObject) runtime.evalScript(rubyCode);
            ans = rubyStr.toString();
        } catch (final Exception e) {
            System.err.println(e);
            ans = e.getMessage();
        }
        // Returns the result
        return new StringValue(ans);
    }

rubyCode には xvcd から jruby スクリプトの文字列が渡ってくる。
rubyStr = (RubyObject) runtime.evalScript(rubyCode) で評価結果を得るだけ。

この例では、単に jruby コードを評価してその結果を得ているだけなので 面白みは少ない。
xvcd でのビジネスロジックや、srcDOM 処理を jruby スクリプトで記述できるようにしていきたい。

| | コメント (0) | トラックバック (1)

2007-02-26

xvcd を生成するツールが欲しい

javacc やその類似ツールをつかって、 別のシンタックス、セマンティイクスの言語から xvcd  +  css + java なプラグインが生成できると便利な気がする。

どんな言語にすればいい?
XUL をそのままつかうか?
JSP を変換する? (XSLT ベースでなく、 Template ベースにする?)

ともかく既存のアプリのGUI 記述からの変換が用意されると、プラグインを作りやすくなる気がする。

| | コメント (0) | トラックバック (0)

2007-02-22

xfy で html を処理することについて書いた事があったなぁ

今日 とある場所での 雑談で、
    "xfy で、html を処理する"
ことが話題になった。
そういえば、こんな投稿をこの blog にしたことがあるのを思い出した。

1. - http://youichi-kato.cocolog-nifty.com/blog/2006/11/xfy__86aa.html
> > nekohtml + rome で RSS を生成

2. - http://youichi-kato.cocolog-nifty.com/blog/2006/11/xfy_html__ceed.html
> > katoy: cocolog: xfy で HTML 文書を表示させたい その2

3. - http://youichi-kato.cocolog-nifty.com/blog/2006/10/xfy_html__3c32.html
> > katoy: cocolog: xfy で HTML 文書を表示させたいが...

1 は、 nekohtml という java ライブラリーをつかって
html -> xhtml -> rss 生成 をさせてみたという話。
ここでは、 xfy は使っていない。

2. 3 は、xfy からの外部コマンド呼び出しを利用して、Tagsoup という外部コマンドで html -> xhtml 変換をさせ、それを xfy で表示させるという試み。
それとなく、xfy で表示させることはできたが、firefoxでの表示結果と差があり、
その差を小さくする方法がわからず頓挫し、それ以降 忘れていた...

| | コメント (0) | トラックバック (0)

2007-02-20

xfy でチャットプログラムを作れるか?

こんな java でのチャットプログラム例を見つけた。

- http://www.techscore.com/tech/J2SE/Network/answer/5-1.html
> > -TECHSCORE-: マルチキャストを利用して、次の機能を満たすチャットアプリケーションを作成して下さい

これを xfy plugin として実装してみたいと思っている。

メッセージ表示を SVG をつかえば、
  文字がとおくから浮き上がっくるとか、
  回転しながら飛んでくるとか
いろいろな視覚効果をくみこめて楽しいチャットシステムができそうな気がします。

実際に作業できるのは土日だけですが。
どなたか既に似たものを作っている方はいないかなぁ。

| | コメント (0) | トラックバック (0)

2007-02-17

xfy の instruction で echo server を実装する

xfy のプラグインで、 MP3 を play するものが公開されています。
- https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=131
> > MP3 Player component

このプラグインでは、java で thread を作成して MP3 play をしています。
そこで このスレッドの作り方/使い方を真似して、簡単な server を xfy プラグインとして作ってみました。
Xfytutorial02echoserver

参考にした server/client のコードはこれです。
- http://www.techscore.com/tech/J2SE/NIO/5.html

この記事では、echo server (クライアントからのデータをそのまま返すだけのやまびこサーバー)を NIO を使って作成する例が示されています。

これらをもとに私が作成した plugin のソースコードを以下に公開しました。
- http://homepage2.nifty.com/youichi_kato/src.html
xfy の instruction で  echo server を実装する (2007-02-17)
    xfy-tutorial-plugin-2007-02-17.tgz
   
build 方法:
  - build.xml を編集する。
     xfy.home を、xfy をインストールしたパスに書き換える。
  - % ant
  - % ant install

実行方法:
  - xfy を起動する。
  - data/run.xml を開く。
  - 画面に表示されている [start server] ボタンをクリックする。
  - src/com/example/developer/nio/ChannelEchoClient.java を compile して出来たプログラムを起動する。
次のような画面出力となります。

    送信:/127.0.0.1:49329:[接続されました]
    asdf                   //  キー入力した文字列
    受信:asdf         // エコー結果

ここでは、単純な echo server を実装しただけです。
しかし、xfy の内部機能を呼び出しその結果を返すようなサーバーをつくれば面白いことができそうです。

xfy からは server を呼び出す機能は標準実装されてます。
xfy にサーバー機能を持たせれば、 xfy  のクライアント同士でネットを通じて情報交換することも可能になるでしょう。

| | コメント (0) | トラックバック (0)

2007-02-12

xfy から applescript を起動する

xfy で音楽再生をさせることを考えていて、applescript をつかうことを思いついた。

まずは、applescript について調べてみた。

xfy から applescript を実行するのはどうするか?
すでに 実験済みの "xfy から 外部コマンドを呼ぶ方法" で
"osxscript  foo.scpt" としてコマンド実行するだけで基本的には OK だ.
(コンソールから実行しても同じだ)

AppleScript の例:

$ cat /tmp/filechoose.scpt
tell application "Finder"
        activate
        choose file with prompt "Select File"
end tell

$ osascript /tmp/filechoose.scpt
alias Macintosh HD:Users:kato:.bashrc

$ osascript /tmp/filechoose.scpt
/tmp/filechoose.scpt:37:74: execution error: Finder got an error: User canceled. (-128)

これは、Finder を active にして、FileChooser を開き、
その選択結果を文字列で得るという例だ。
キャンセルボタンを押した場合は、エラーとして処理されるようだ。

選択したフィアルは alias ... という形で得られるようだ。
これを 通常の filePath にする方法が判らないと、xfy ではつかいにくいなぁ。
また、xfy から applescript を呼んだときにFinder が activate になるのはいいが、
ファイル選択ダイアログを使用し終わったあと、
xfy を activate する方法が判らない。
(xfy の画面が他のアプリの後ろに隠れたままになってしまう。
マウス操作して xfy を active にすれば済む話だが、それは面倒だし、不自然だ)

このあたりのことが解決できれば、xfy からの ファイル選択ダイアログには、
OS のFile選択ダイアログをそのまま使えるようになる。

itune や safari も applescript で制御できるので、
音楽/動画再生や、web 閲覧を xfy から制御することも可能だ。

ちなみに itune で音楽演奏する例はこれだ。

$ osascript -e 'tell app "iTunes" to play'

  (スクリプトをファイルから読み込ませないで、直接 実行するには -e '....' としてスクリプトを書く)

参考にしたqページは以下。
- http://www.asahi-net.or.jp/~VA5N-OKMT/factory/applescript/sample_code/index.html
> > Applescriptサンプル

- http://www.apple.com/jp/macosx/features/applescript/
> > アップル - Mac OS X - AppleScript

- http://www.ohnaka.jp/wiki/wiki.cgi?page=AppleScript%A4%C7iTunes%A4%F2%C1%E0%BA%EE%A4%B9%A4%EB
> > AppleScriptでiTunesを操作する - Niku3

Mac 限定になってしまうが、Xfy も appleScript で操作が可能になるとよいと思う。
xvcd とは異なるレベルで 各種のアプリケーションと連携しての動作や操作の自動化
が可能になり利用法の幅が大きく広がる気がする。

ちなみに下のスクリンショットは、スクリプトエディタのヘルプの一部。
Scripthelp
Finder で使えるものがこんな形で閲覧できる。
xvcd でつかえるコマンドやパラメータもこんな形で閲覧/検索できると便利だな。
(xfy の現状の HTML のヘルプは閲覧/検索が不便。
私は gonzui で xfy の document を全文検索できるようにしてしまっているけど)

| | コメント (0) | トラックバック (0)

2007-02-05

xfy 1.3 の java API の実験: 003 (Node)

今回は、public claass Node.
http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/javadoc/com/xfy/common/dom/Node.html

http://homepage2.nifty.com/youichi_kato/src.html
  xfy -1.3 の java API の調査   Node (2007-02-04)
にソースとスクリーンショットを置いた。
Node

Srcxml

上のスクリーンショットは、xfy の Node API をつかって、XMLの内容を自分で表示させたもの。
下のスクリーンショットは、XML を コンソールで表示させたもの。

w3c の DOM 操作とほとんど同じ操作が可能なようだ。(完全互換ではないみたいだが)
今回は、 XML -> テキスト表示 を簡易的におこなってみた。
次回は XMLを自分で読んで xfyXML へ挿入するという編集を試してみる予定。

| | コメント (0) | トラックバック (1)

2007-01-28

xfy 1.3 の java API の実験: 002 (InstructionContext)

xfy 1.3 の java API の実験: 002 (InstructionContext)

Apiinstructioncontext
今回は、public class InstructionContext extends WrapperContext.

http://homepage2.nifty.com/youichi_kato/src.html
  xfy -1.3 の java API の調査   InstructionContext (2007-01-28)
にソースとスクリーンショットを置いた。

これは、インストラクションを作るときの基本情報源のデータのようだ。
ソース XML にアクセスしようとしたら、ここからたどっていくことになる。

http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/javadoc/com/xfy/common/framework/instruction/InstructionContext.html

このクラス特有のメソッドは以下のものがある。
void     clear()
           このコンテキストに設定されている変数およびXMLソース情報をクリアします。
Value     getVariable(Name name)
           指定された変数の値を取得します。
boolean     hasVariable(Name name)
           指定された名前の変数が存在するかしないかを返します。
void     setSource(XmlSource source)
           このコンテキストのXMLソース情報を設定します。
void     setVariable(Name name, Value value)
           このコンテキストに対して変数を設定します。
これらはちょっと まだ今はよく判らない。

継承されたメソッドは以下のものがある。
Context     getBaseContext()
          コンテキストを新しく作成するときに、作成元となったコンテキスト(ベースコンテキスト)を返します。
Node     getNode()
          このコンテキストでのコンテキストノードを返します。
Value     getPosition()
          このコンテキストのコンテキストポジションを、1からはじまる値で返します。
Value     getSize()
          このコンテキストのコンテキストサイズの値を返します。
Value     getVariable(Name name)
          指定された変数の値を取得します。
Name[]     getVariableNames()
          このコンテキストのスコープに存在するすべての変数名を返します。
boolean     hasVariable(Name name)
          指定された名前の変数が存在するかしないかを返します。
boolean     isValid()
          このコンテキストが有効か無効かを返します。

まずは、
getNode(), getPosition(),getSize(), getVariable(Name name), getVariableNames(), hasVariable(Name name)
を試してみよう。

   public void execute() throws CommandException {
   final StringBuilder sb = new StringBuilder();
       try {
           sb.append("InstructionContext.¥n");
           sb.append("  getNode()=[" + this.context.getNode() + "]¥n");
           sb.append("  getPosition()=[" + this.context.getPosition() + "]¥n");
           sb.append("  getSize()=[" + this.context.getSize() + "]¥n");

            Name[] names = this.context.getVariableNames();
            sb.append(" getVariableNames() size=" + names.length + "¥n");
            for (int i = 0; i < names.length; i++) {
              sb.append("  [" + i + "]" +  names[i].toString() + "]¥n");
            }
        }

この sb.toText() を表示 させるようなインストラクションをつくり、実行させた画面結果がページ先頭の画像だ。

getNode() は、インストラクション実行がされた ソースXML の Node を返すようだ。
次回は、Node クラスの API の実験を加えて、Node クラスの詳細を調べよう。
Node の使い方がわかれば、ソースDOM は自在に参照/編集ができるようになるかもしれない。

getPosition()、getSize() はそれなりの値が返ってきているが、意味や使い方は不明。
getValiableNames() は xvcd:variable で宣言した変数が取得できるもののようだ。
xvcd ファイル中に同時に記載した xvcd:user-data や instruction:variable は、このメソッドの返り値には含まれていないから。

| | コメント (0) | トラックバック (0)

2007-01-27

xfy 1.3 の java API の実験: 001 (XfyPlace)

xfy 1.3 の java API の実験: 001 (XfyPlace)

これから すこしずつ 以下の javadoc にある class や method の動作実験をしていこうとおもう。
- http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/javadoc/overview-summary.html
> > xfyプラットフォーム 1.3 Java API仕様

Apixfyplace
まずは、com.xfy.place.XfyPlace からはじめる。(一番単純そうだったから)

http://homepage2.nifty.com/youichi_kato/src.html
  XfyPlace (2007-01-27)
にソースとスクリーンショットを置いた。

XfyPlace には 次の static なメソッドがある。

static Logger     getLogger()
          xfyプラットフォームでログを出力するときに使用するLoggerオブジェクトを返します。
static File     getLogWork()
          ログディレクトリを返します。
static File     getPropertiesWork()
          プロパティディレクトリを返します。
static File     getTempWork()
          一時ディレクトリを返します。
static File     getWorkHome()
          xfyプラットフォームが使用する作業ディレクトリを返します。
static File     getXfyHome()
          xfyプラットフォームのホームディレクトリを返します。
static File     getXfyPlaceHome()
          XfyPlaceクラスを含むJARファイルが存在するディレクトリを返します。

スクリーンショットをみれば、それぞれがどんな値を返すかが判る。
http://homepage2.nifty.com/youichi_kato/src/xfy13-api/api-xfyplace.png

この画面は、 XfyPlace のメソッドの返り値を ソース Xml に追加するような java のインストラクションを書きそれを実行させたものだ。
(詳しくはソースコードを参照して欲しい。以前にこの blog に投稿した "外部コマンド実行の結果を xfy 画面の表示する" ソースコードをもとにしている。)

| | コメント (0) | トラックバック (0)

2007-01-26

再度、xvcd での table 表示を調査、実験中

xfy の xvcd でのテーブル表示の工夫をいろいろ思案中。

こんな記事をみつけたのが、そのきっかけ。

- http://blog.asura.co.jp/takehara/5219ac5dcee34422a506ab9f3df120df/entry.aspx
> > 「オレがルールだ!」:HTML TABLEタグでヘッダを固定にしてデータ部だけスクロール その2

あと、
 - 縦に長いテーブルを google の検索結果みたいにページナビゲートできるようにすることとか、
   - 列の順番を動的にいれかえられるようにする。
   - table の行/列を入れ替える
   - drag & drop で行を移動させる
   など...

| | コメント (0) | トラックバック (0)

2007-01-21

外部コマンドを実行する xfy インストラクションの作成例

Xfytutorialplugin02screen

http://homepage2.nifty.com/youichi_kato/src.html
  xfy の instruction で外部コマンドを実行してその出力を表示する (2007-01-21)
として、つぎのものを公開しました。

* java で作成した xfy のインストラクション:
     外部コマンドを実行してその出力結果を ソース XML に埋め込む。
     (ソースコード, build.xml, eclpse 環境を含む)

以前、xfy の xpath 関数で、同様の機能を実現する例をつくりました。
xpath 関数では、ソースXML を参照はできても、内容を変更することはできませんでした。

instruction ではソースXML の内容を変更することができます。
ソースXML を変更するための API は
- https://www.xfytec.com/jp/manual/1.3/documents/dev/developer/1.3/javadoc/com/xfy/common/dom/package-summary.html
> > com.xfy.common.dom (xfyプラットフォーム 1.3 Java API仕様)
で調べることができそうです。

なお、公開した実験例は
- https://www.xfytec.com/jp/manual/1.3/documents/dev/developer/1.3/howto/java_instruction_component.html
> > コマンドインストラクションを実装したxfyコンポーネントの開発 - xfy technology
を参照し、xfy のサンプル下にある beep インストラクションのソース例をベースにして作成しました。

この例では、ソース XML をインストラクション中で変更していますが、インストラクションから xml の node を返して、呼び出し側 xvcd  で  ソース XML を変更することも可能と思います。
今回のソースコードの実装方法では、外部コマンドの実行終了まで xfy に制御が戻ってこないし、実行を途中でキャンセルすることもできません。
次回は、実行をキャンセルできる例を公開する予定です。

Technorati Profile

| | コメント (0) | トラックバック (0)

2007-01-13

求む、 maven を利用して xfy コンポーネント開発する例

xfy のサイトにはこんなページがある。
- http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/howto/java_development_environment.html
  >> Javaでxfyコンポーネントを開発するときの環境設定 - xfy technology

ここでは、xfyコンポーネントを
  eclipce + ant
で開発する例が述べられている。

eclipse + maven で開発している例がないかなぁ。

xfy 用の mvven プラグインや、eclise プラグインの用意もあると良い。
% mav test や % mvn site で、 java コードだけでなく、xvcd コードの
テスト、カバレージ、API ドキュメント生成がしたいものだ。

手始めとしては、ant で示されている java コードの compile, jar 生成、deploy を maven で行えるようにすることかなぁ。

| | コメント (0) | トラックバック (1)

2007-01-06

xfyBlogEditor のエントリー取得ダイアログがちょっと変!

xfy BlogEditor で エントリーの取得を行ってみて気がついたことがある。
取得表示状況を示すダイアログ内に配置されているキャンセルボタンが動き回ってしまうのだ。
ボタンが動き回るというのは、ゲームでは使い道があるかもしれないが、一般的には、クリックしにくくて使いにくい。
ボタン位置が動いてしまっている原因は、
ブログのタイトルとボタンを センター割り付け でレイアウトしていて、かつダイアログウインドウサイズより長いタイトルを折り返しせずに表示しているからだろう。
_1 _2_1






ところで、このダイアログは、プログレスバー形式にできないのだろうか?

java での progressbar 表示と、実行キャンセルの例を以下に見つけた。
- http://d.hatena.ne.jp/gsf_zero1/20061124
  >> いろいろ備忘録日記 - 11月24日の日記: Swingスレッド処理-005(処理をキャンセル可能にする)

どうしたら、 xfy で プログレスバー表示ができるだろうか?

| | コメント (0) | トラックバック (0)

2006-12-29

XSLT と XVCD の差

こんな記事を見つけた。
- http://homepage.mac.com/shin_itani/memo/xfy/2005/11/20T212506.html
  >> 技術資料「XSLT 1.0 と XVCD 1.0 の比較」 - xfy.memo

- http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/spec/difference_xslt_xvcd.html
  >> XSLT 1.0とXVCD 1.0の比較 - xfy technology

xslt と xvcd は似ている部分と違っている部分が微妙で、混乱することがある。
完全な変換は無理と思うが、ある程度の相互変換できるツールがあるとよいと思う。
既存の xslt をもとにして xvcd をつくろうという時に重宝する気がする。

あるいは、 xml + xslt を xfy でそのまま扱えるようになればいいのかもしれない。
その上で、Aspect 技術を使って xslt を xvcd に加工してしまって、 それを xfy に解釈させるなんてことができたらなぁ。

| | コメント (0) | トラックバック (0)

2006-12-26

だれか xfy での動画再生にトライしていませんか?

xfy Blog Editor のプラグイン "YouTube for Blog Editor"  で blog に動画をブログに簡単な操作で埋め込めるのは便利だ。
でも、再生を xfy 上でできないのは残念。
JMF (java Media frame) をつかうとなどして、なんとかして再生できないかなぁ。
いざとなれば MediaPlayer を別途、起動しても良いと思う。

さらには itunes モドキを xfy で作って xvcd レベルでユーザーカスタマイズができるようになるといいのだが。

http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/howto/java_instruction_component.html
として、コマンドインストラクションを java で実装する方法が公開されているので、どんな java ライブラリーでも xfy で利用できそうなのですが。
(本当は自分でいろいろ試してみたいのだが、年末年始も忙しくて 実験をする時間がとれない...)

| | コメント (0) | トラックバック (0)

2006-12-25

求む、アマゾンアソシエイトの xml レポートの表示ツール

アマゾンアソシエイトの売り上げ/注文レポートは、XML形式での download が可能だ。
どなたか xfy でこれらのレポートの表形式表示やグラフ表示させる xvcd を書いた方はいませんでしょうか?
(自分で書くしかない?)

| | コメント (0) | トラックバック (0)

2006-12-23

youtube の埋め込みテスト

xfy blog editor をつかって youtube の埋め込み投稿をテスト。

Robert Sabudaの超飛び出す絵本 Author: shokai Keywords:  alice book robert sabuda Added: August 7, 2006



- https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=127
  >> xfy Community - YouTube for Blog Editor

動画を選ぶダイアログのデザインは何? web2.0 的なデザインにできないのかなぁ。
全部 xvcd で書いてるようなので、自分で書き換えて使おうと思う。
でも xvcd は 588 行もある。他のスクリプト言語をつかえばもっと短く書けるような気もする。

思いついた事
:
  - ダイアログ画面のデザイン強化
  - ダイアログの日本語化/多国語化
  - 検索表示結果のレイアウト変更
  - 検索画面上での動画再生
    (xfy 自体では動画再生できないので、ブラウザを呼びだす必要があるかもしれない。あるいは、検索結果自体をブラウザで表示させるか?...)
  - youtube サイトでの検索結果画面(browser) から Drag and Drop して記事中に埋め込めるようなインターフェースの実現ができるのか?現状無理だとしたら、どんな機能を追加したらそれが可能になるか?

このページは xfy Blog Editor を利用して作成されました。

| | コメント (0) | トラックバック (3)

2006-12-21

xml + xvcd + view = xfy ?

xml + xvcd + view = xfy?

現在の web ブラウザは
   view (ウインドウ) に html を流してあげると、レンダリングされて表示される
と捉えることができる。

xfy は
   view に xml を流してあげると、適切な xvcd を適用して、レンダリングされて表示される
と捉えることができる。

この関係を変更させてシステムやユーザー操作が実現できないものか?
例えば、こんな感じに。
  - ファイルエクスプローラ上で示されている xhtml に xvcd を重ねると、レンダリングされた結果のxfy ウィンドウが開く。
  - ファイルエクスプローラ上で示されている xvcd に xml を 重ねると、レンダリングされた結果のxfy ウィンドウが開く。
どうすれば、こういったものを作る事ができるだろう。

以下は web からのピックアップを。

- http://blog.livedoor.jp/dankogai/archives/50719263.html
  >> 404 Blog Not Found:書評 - 「負けるが勝ち」の生き残り戦略

- http://d.hatena.ne.jp/essa/20061220/p2
  >> アンカテ(Uncategorizable Blog) - 労働集約型人工知能あるいは「半労半算」

- http://japanese.engadget.com/2006/12/19/olpc-squid-labs-potenco-pull-string-generator/
  >> OLPCの「ヨーヨー型」携帯発電機が商用化へ - Engadget Japanese

- http://www.apple.com/jp/articles/userinterview/blogger/
  >> アップル - Macをはじめた人たちの声: ブロガー編

- http://hxxk.jp/2006/12/19/2100
  >> hxxk.jp - DOCTYPE スイッチについての検証とまとめと一覧表

- http://netafull.net/book/017539.html
  >> [N] 大庭慎一郎「入門LEGO MINDSTORM NXT レゴブロックで作る動くロボット」

- http://www.bloglines.com/myblogs_display?sub=42176237&site=7391343
  >> Bloglines | Myフィードに登録する

- http://www.bloglines.com/myblogs_display?sub=42175494&site=8144427
  >> Bloglines | Myフィードに登録する

- http://www.popxpop.com/archives/2006/12/post_92.html
  >> 英語学習に最適!有名大学が提供するポッドキャスティングまとめ | p o p * p o p

- http://furukawablog.spaces.live.com/Blog/cns!156823E649BD3714!6918.entry
  >> 古川 享 ブログ: コンピュータ用語とその翻訳のお話

| | コメント (0) | トラックバック (0)

2006-12-15

xfy を携帯端末で動作させるにはどうしたらよい?

現状では、xfy は PC  でもそれなりの CPUパワー、リソースが必要なようです。
携帯端末、PDA.、家電等でも動作させるようのするのは何をすることが必要なんでしょうか?

ATOK は携帯端末やゲーム機にも移植されているようです。
クライアントですべてを動作させることは困難なのかもしれません。
サーバーで動作させてレンダリング結果だけをクライアントで受けとるという構成もありえるのではないかと思います。

xfy や java を ハード的にチップ化することで実現するという案もありえるのか?
USB メモリを差すような感覚で、CPU を差したりできたりすれば可能になるのか?

| | コメント (0) | トラックバック (1)

2006-12-10

世界では、どの程度 xfy 関連として URL がブックマークされているのか?

del.icio.us で  xfy で検索した結果で 30 人以上からマークされていたものを列挙してみる。
(全検索結果は 200 件、30 人以上からマークされていたのは 13 件)

- xfytec.com - The Home of xfy Technology   ... saved by 36 people
  http://www.xfytec.com/

- open.itworld.com - Master Foo's Taxation Theory of Microformats ... saved by 47 people
  http://open.itworld.com/4934/nls_ebiz_mastfoo060502/page_1.html

- 2006 JavaOne Conference Homepage ... saved by 44 people
  http://java.sun.com/javaone/sf/

- Matzにっき(2006-08-14) - XMLのメリット、デメリット ... saved by 34 people
  http://www.rubyist.net/~matz/20060814.html#p03

- XTech 2006: Building Web 2.0 ... saved by 51 people
  http://xtech06.usefulinc.com/

- EVDB, Inc. Company Site ... saved by 354 people
  http://evdb.com/

- wikiwyg ... saved by 78 people
  http://demo.wikiwyg.net/wikiwyg/demo/standalone/

- JavaOne Online Technical Sessions ... saved by 253 people
  http://developers.sun.com/learning/javaoneonline/

- WikiHome - wsfinder - JotSpot ... saved by 493 people
  http://wsfinder.jot.com/WikiHome

- APIs // Trynt Heavy Technologies ... saved by 285 people
  http://www.trynt.com/apis/

- Google Calendar の使い方 | グーグル・カレンダーの便利な機能や特徴を紹介します ... saved by 141 people
  http://saito-kazuo.pupu.jp/gcal/index.html

- PlotKit - Javascript Chart Plotting | liquidx ... saved by 840 people
  http://www.liquidx.net/plotkit/

- ProgrammableWeb: Mashups and the Web as Platform ... saved by 3135 people
  http://www.programmableweb.com/

| | コメント (0) | トラックバック (0)

2006-12-07

xfy で数式からグラフ生成ができるらしい

ココログのメンテ中に、mixi に投稿した中で xfy についてのことを、ここにも書く。

- https://www.xfytec.com/community/modules/news/article.php?storyid=141
>> xfy Community - MathML と CML のご紹介

この記事をみて、 y=f(x) の形式の式をいれてグラフを書く機能があるのを知った。もっと宣伝してもよいのでは。(小学校、中学の算数で十分に使えそう)

0 = f(x,y) 形式 の式からグラフを生成する機能も欲しい。
でも、
http://www.hpc.cs.ehime-u.ac.jp/xfy/
をみるとそういうのもできるようにも見える。

フラクタル画の生成や、 連立方程式をいれてそれを解くとか、線形計画法のプラグインも欲しい。

また、共分散分析のパス図のためのツールも欲しい。
http://www.interscope.co.jp/method/c04.html

話は飛躍するが、コンピュータ上で折り紙をすることはできないかなぁ。
(折り紙の幾何学という本がある。http://www.pro.or.jp/~fuji/origamibooks/fushimi.origeom.html )

| | コメント (0) | トラックバック (1)

2006-12-02

xfy の数式表現が改善されている

xfy の11月版を download してみた。
Math 左の画像は、 xfy の sample フォルダーにある数式の例。
10月版と11月版で同じものを表示させた。(上が新しい11月版)

"=" の位置が以前よりは中央にくるようになった。でも11月版では、全体に縦方向に長くなった。

数式表現を TeX 並みにするのはどうしたらいいのか?
TeX や類似ツールをバックブランドにつかって、xfy はそれらのフロントエンドとして利用できるようにするのがよいのかもしれない。
y=f(x) や、z = f(x,y) の形式の数式から、グラフを生成したりする plugin を作ってみたいともおもっている。(本当は MacOS の grapher の機能が xfy 上に欲しい!)

BlogEditor の設定は、前バージョンから自動で移動されないので、ちょっと戸惑った。
過去のブログエントリーを再取得しようとおもった。
でも 100 件を超える分の取得が ID 指定なので、めんどう。
時間があるときに ID を調べてから取得しよう。

| | コメント (0) | トラックバック (1)

2006-11-30

xfy Basic Edition 1.3 更新

- https://www.xfytec.com/community/modules/news/article.php?storyid=139
  >> xfy Community - xfy Basic Edition 1.3 更新 & 新機能紹介

これから download しよう。
私は xfy の doc 以下を gonzui に登録して、xvcd のサンプル中の検索をしたりしてます。

| | コメント (0) | トラックバック (0)

ピックアップ: XSLT as Pretty Printer, CSS-Based Forms

ピックアップ: XSLT as Pretty Printer, CSS-Based Forms
- http://www.xml.com/pub/a/2006/11/29/xslt-xml-pretty-printer.html?CMP=OTC-TY3388567169&ATT=XSLT+as+Pretty+Printer
  >> XML.com: XSLT as Pretty Printer

xvcd 用の 整形スクリプトを作ってみたい。
(xfy の default 設定だと、xml の indent が TAB コードなので、好みに合わない...)

また、eclipe の findBugs や metrics プラグインに相当するものも作れるか?
(xvcd は プログラミング要素があるので、怪しい点を指摘してくれると嬉しい。
プログラムとしての複雑度を計測できることも必要)

- http://smashingmagazine.com/2006/11/11/css-based-forms-modern-solutions/
  >> CSS-Based Forms: Modern Solutions | Smashing Magazine

CSS でレイアウトを調整することでいろいろ出来る!
でも CSS の書式は XML じゃない! XML 書式の CSS ってあるのか?
なければ仕様をつくって、xfy でそれを扱うようにできるかなぁ...
(xfy のすべての表示ボキャブラリーを CSS で統一的に制御できるようにもして欲しい...)

| | コメント (0) | トラックバック (0)

2006-11-26

xfy で 任意の xml を tree 形式で表示

Asciitreeview Ztreeview

- http://skew.org/xml/
  >> the skew.org XML & XSLT resources
このページに、
  "ASCII XML Tree Viewer:A stylesheet for XPath/XSLT data model visualization (plain text)"
として xml を tree 形式で表示する xslt がある。
出力例は http://skew.org/xml/stylesheets/treeview/ascii/sample_output.txt

これをまず、xvcd 化してみた。( html の pre で表示)
さらにこれを xvcd:tree で表示するようにしてみた。
現状では これらはいずれも read-only。(改行の処理がよくわからないから)
そのうちには 編集ができるように変更させていきたいと思っている。

以下から、作成した xvcd を参照できる。
- http://homepage2.nifty.com/youichi_kato/src.html
   >> xfy で 任意の xml を tree 形式で表示する例 (2006-11-26)

この blog では、xfy についていろいろ実験したことを投稿しているが、
今後 投稿していきたい内容として次のようなものがある。

- アイコン操作の例
    (これがある程度わかれば アイコン表示での Desktop モドキが書けるようになるかもしれない。
     さらには lookingGlass の真似もできるようになるか?)

- xfy meets json.  (json を扱う例)
- xfy meets yaml.  (yaml を扱う例)
- petstore by xfy. (petstore の例)
- xfy meets music. (音楽データを扱う例)
- watch TV with xfy. (TV 番組表を扱う例)
- xfy meets javascript. (javascript を扱う...)
- cards game with xfy (トランプゲームの作成)
- xfy meets encryption. (暗号処理を扱う)
- xfy meets aspect. (aspect 指向の取込み)
- xfy meets anotation. (アノテーションの取込み)
  ... etc ...

こんな本が出ているのを知った。(現時点では私は購入する予定は無い。会社で誰かが購入するかもしれないので)
  "テキストマイニングを使う技術/作る技術—基礎技術と適用事例から導く本質と活用法"

| | コメント (1) | トラックバック (0)

2006-11-25

xfy での tree 操作の例

Tree
- http://homepage2.nifty.com/youichi_kato/src.html
  >> xfy の tree 操作の例 (2006-11-25)
として、 xfy の xvcd:tree に対する コンテキストメニューでのデータ操作例を置いた。

copy & paste の操作も実装しています。
(drag & drop も実装したいが 今は未実装...)

Tree ボキャブラリーは CSS で見た目を制御することが出来るのか否かが不明...

| | コメント (1) | トラックバック (0)

2006-11-24

xvcd でループ処理

- 九九の表では、 ループは 10 とか 10x10 程度だ。
  でも 1から100万とかのループを行わせようと思ったら、再帰方式ではスタックオーバーになるだろう。
  10の8乗程度のループが可能な実装をするにはどうしたらよいか?
   xpath2 や xi での実装はどうなっているのだろう。

xfy の xvcd で
   while(condition) {
       some-operation;
  }
の動作を記述できればなぁ...

話題は変わるが、面白いページをみつけた。
- http://www.infoq.com/presentations/effective-api-design
  >> InfoQ: How to Design a Good API & Why it Matters

映像とプレゼン資料が提示される こういったサイトはとても良いですね。
日本国内での各種プレゼンテーションをこういった形式で公開しているサイトを探したい。

- XQuery+XMLデータベース入門 DB2 9無償版で実感するXML DB用標準クエリー言語の基本 (大型本) を買った。windowsXP 用の DB2 9 無償版のCD-ROM が付いている。 (windows マシンは自宅には無いから どうやって動作をためそうかなぁ... 他の XMLDB で試すか)

| | コメント (0) | トラックバック (0)

2006-11-23

xvcd で九九の表をつくる

Loop
xslt では繰り返しをつくるのが結構 面倒。
以下の記事では、xslt での繰り返し処理について触れられている。

- http://www-06.ibm.com/jp/developerworks/xml/030110/j_x-xslrecur.html
  >> dW : XML : XSLで再帰処理を効果的に使用する

- http://www.yuragi.jp/gsxslt/p001/p001.asp
  >> 再帰処理をしよう - 階乗計算 -

ともかく xvcd で九九の表をつくってみた。(再帰処理をつかった)
  http://homepage2.nifty.com/youichi_kato/src.html
  >> xfy で 九九の表をつくる (繰り返し処理の例) (2006-11-23)
あー、やはり面倒!

これをもっと簡単にする方法は無いものか?
1. 外部コマンドを呼び出して表データを XML で生成し、それを xfy で読み込んで表示する。
2. xi における <xi:for-each select="$Util.counter(1,5)" item="i"> のような機能を実現して、
   それを利用する。
  参照:http://www3.vis.ne.jp/~asaki/java/xi/xi_tips.html#for3
          >> 逆引き Xi: 指定した回数繰り返す
3. XPath2.0 での  <xsl:for-each select="(1 to 5)"> のような機能を実現して、
   それを利用する。
    参照:http://www.mothprog.com/prog/xslt2/xslt7.html
          >> XSLT2.0の感覚

xfy が Xpath2.0 準拠になるのを待つか?

| | コメント (2) | トラックバック (0)

2006-11-19

xfy meets zip

今回の "xfy meets" では、アイデアだけでなく簡単な実装サンプルも公開します。
   - http://homepage2.nifty.com/youichi_kato/src.html
   >> xfy で open/save 時に zip 処理をさせる例 (2006-11-19)

xml はサイズが大きくなりがち。
xml を zip 圧縮したいとおもうことは多い。
そこで、xfy で open/save 時に自動で unzip/zip を行うようなメニューを追加してみよう。

任意の xml に適用できる vocaburary を書き、そのなかでメニューを追加する。
そのvocaburaly に切り替えると、そのメニューが使えるようになる。
Open: *.xml.zip という名前のファイルを開く (zip 解凍してメモリーに読み込む)
Save: メモリー内容を zip 圧縮し .zip 拡張子を追加したファイル名で保存する

それぞれのメニューでは、
open時は、
  $ unzip input.xml.zip
  して得られた input.xml を xfy に読み込む。

save 時は、
  output.xml に保存してから
  $ zip output.xml.zip output.xml
  $ rm -f output.xml
を実行させるようにしているだけだ。

本格的に実装するなら、複数ファイルを zip 圧縮した場合、zip 中の任意の xml を指定して
読み込み、編集後は、 zip 中の該当ファイルだけを更新するとかすると良さそう。
xml と xvcd の組を zip にして扱えるようにするのも便利かもしれない。

今は zip 処理を shell script で行っているが、java で記述すれば、プラットフォーム独立になる。
パスワード付きのzip を扱えるようにするのも良いかもしれない。
zip でなくて、暗号化処理を行うようにしたり、XMLDB/RDB や gspace (gmail 上のファイルストレージ) を利用したりするようなことも可能かもしれない。

| | コメント (0) | トラックバック (0)

2006-11-18

"xfy でのTable 操作の例" を更新 その2

Xfytable_2 http://homepage2.nifty.com/youichi_kato/src.html
にある "xfy で template でテーブルを xhtml でつくる際に、テーブル操作を付加する例" をさらにバージョンアップした。

変更点: 列毎にチェックボックスを付けて、一括削除できるようにした。
    (phpMyadmin の真似:see http://freshmeat.net/screenshots/8001/ )
  列名にある チェックボックスで、全行のチェックボックスの on/off ができる。
  [DEL] ボタンで、チェック on の行が一括削除される。

チェックボックスの状態の保持には user-data という要素毎に設定できるユーザー用データ領域を利用した。
でもこのuser-data は使い方は すこし むずかしかった。
(xfy のオンラインマニュアルを読んだだけでは分からない。
sample 下の xvcd を ctrl:input, user-data でgrep して使用例をみて、やっと作成できた)

xvcd はすでに 200 行を超えてしまった。
テーブルをいくつも扱うことを考えた場合、xvcd をTemplate Library 化したいものだ。
つまり
  $ generatexvcd config-file
のようにしたら、これに類似した xvcd を自動生成できると便利と思う。
(xfy on rails のようなものへ発展させられるか?)
あるいは、xvcd をつくる xvcd を書く?

なお、
  $xmllint --format input.xml > output.xml
のようにしてインデントを少し整形してみた。その後、空行やコメント行追加をした。

| | コメント (0) | トラックバック (0)

2006-11-17

"xfy でのTable 操作の例" を更新

Xfytable
xfy でのTable 操作の例
として投稿した
http://homepage2.nifty.com/youichi_kato/src.html
にある "xfy で template でテーブルを xhtml でつくる際に、テーブル操作を付加する例"をバージョンアップした。
変更点は3点。
  1. copy/cut/paste メニューを追加した。
  2. Head/Tail リンクを追加して、テーブルの先頭/末尾へジャンプできるようにした。
  3. メニューバーの [Entry]-[add] が動作していなかったので訂正した。
最近、xvcd:table ボキャブラリーを覚えたので、表データはhtml の table よりはそちらを使った方がよいとも感じている。
数日中には xvcd:table で書き換えた例も作る予定です。

| | コメント (0) | トラックバック (0)

2006-11-14

自分自身を表示させる xvcd は書けるか?

なんとなく次の2つのようなことを考えている。

* 自分自身を表示させる xvcd は書けるか?

プログラムを run させると、そのプログラムのコード自体が出力されるようなものをつくるクイズがあったりした。

  - http://www.iba.k.u-tokyo.ac.jp/~yabuki/tip/lisp/self.html
    >> 自分のコードを出力するプログラム

xfy で同様の事はできるか?
つまり、 xfy で foo.xml をオープンしたら、foo.xml と同じものが画面表示されるようなことはできるでしょうか?

* ソース xml をそのまま表示するような xvcd を書く事はできるか?
  - http://www.asahi-net.or.jp/~ps8a-okzk/xml/xslt10_1/copying.html
    ここにはXSLT での例が記述されている。

| | コメント (0) | トラックバック (0)

2006-11-12

xfy でのエクセルデータ表示をカスタマイズ

xfy で エクセルデータを読み込むと、xhtml に変換してくれる。
でもちょっと表示が気に入らない。
そこで、xfy での変換結果xhtml を xml + xvcd で表示するように書き換えてみた。

- http://www.shiga-med.ac.jp/mmc/lecture/excel_index.html
  >>初級講習会サンプルデータ
にある beginner.xsl のエクセルデータ使って行ってみた。

手続きの方針:
1. xfy での変換結果を ruby で処理して 単純な xml データに変換する。
2. この変換結果用の xvcd を書く。
    tab, table ボキャブラリーを使ってみた。

スクリーンショット:
Xfyxsl  Xfyxvcd

- xfy での変換結果   http://homepage2.nifty.com/youichi_kato/src/xfy/converttable/xfy-xsl.png
- xml + xvcd での表示結果 http://homepage2.nifty.com/youichi_kato/src/xfy/converttable/xfy-xvcd.png

ファイル:
  - エクセルデータ (beginner.xls)
  - xfy での変換結果 xhtml (beginner.xsl.xml)
  - xhtml から xml を生成する ruby プログラム (converttable.rb)
  - $ ruby convert.rb beginner.xsl.html > beginner.xml の結果 (beginner.xml)
  - xvcd ファイル (mytable.xvcd)

上記ファイル一式: converttable.tgz (tar + gzip)

現状は大雑把な処理しかしていない。
sheet 名の処理や、ソート機能などを追加していく必要がある。
ruby (1.8.4) での変換はちょっと処理が遅い。そのチューニングも必要。

mytable.xvcd では、xvcd:value-of でセルの値を表示しているが、xvcd:text-of にすれば、セル値を編集することも可能となる。

| | コメント (3) | トラックバック (0)

2006-11-11

xfy で HTML 文書を表示させたい その2

以前の投稿  xfy で HTML 文書を表示させたいが... での xvcd を発展させて、xfy で多少は html を表示させることはできた。
しかし、元html 中の相対パスをなんとかしないと、画像ファイルなどが表示できない。
そこで、
tagsoup で http://www.google.com の内容を xhtml 化したファイルに
<base="http://www.google.com"/> を <head> 中に埋め込んでみた。
(手で編集した)
http://homepage2.nifty.com/youichi_kato/src/seehtml/data.xhtml

しかしそれでも、画像などは表示できなかった。(firefox では表示できてるのに)
xfy での表示      Xfy_1
firefox での表示Firefox

http://homepage2.nifty.com/youichi_kato/src/seehtml/seehtml2.xvcd
http://homepage2.nifty.com/youichi_kato/src/seehtml/seehtml2.xml

同じ xhtml を firefox で表示させると、うまく表示できている。
xfy では base の解釈がされないようだ。
それ以外でも、レンダリング結果には差がありすぎる。
"html を tagsoup で xhtml 化することでxfy で表示させる"
という方針は無理っぽいので、別の方法を模索しようとおもう...

| | コメント (0) | トラックバック (1)

2006-11-10

xfy meets xml-rpc

xfy は xml の受信ができる。

俺は、一時期 XML-RPC の実験をいろいろしたことがある。
xml-rpc については次のページが参考になる。
- http://www.linux.or.jp/JF/JFdocs/XML-RPC-HOWTO/xmlrpc-howto-java.html
  >> Java での XML-RPC の使い方

xfy にxml−rpc のサーバー機能をつければ、ネットを介して xfy アプリ同士で通信が出来る気がする。

web-service を xfy で利用するだけでなく、web-service の提供が xfy でできるようになるだろう。
グリッドシステムを xfy をベースにして構築することもできるかもしれない。

| | コメント (0) | トラックバック (0)

2006-11-05

xfy のdirectory ブラウジングをカスタマイズしよう

Icon_1

 

xfy での ローカルファイルの directory ブラウジングを Mac の finder の様にしようとおもい、作成中。
まだ作成途中のものではあるが、以下に置いた。

  dir2.xvcd
  file アイコン
  folder アイコン
  folder アイコン
  css

*.xvcd, *.gif, *.css を XFY_HOME/script 下において、xfy で script フォルダーを開けば良い。

 スクリーンショット (各形式はタブシートで切り替えで可能にしてある)
   ペイン形式
   テーブル形式
   ツリー形式
   アイコン形式

ボキャブラリーの名前を _directory とすることで、xfy 標準のボキャブラリー Directory でなく、
自作の xvcd が適用させるようにできた。
アイコン、css アクセスがやはりうまく出来ていない。
マウスクリックでのdirectory 移動や、フィアルオープンも不完全。

機能/デザインとも Mac や Windows のファイルブラウザ程度 or それを超えるものをつくることは可能なのか?

| | コメント (0) | トラックバック (0)

2006-11-04

xfy のログファイル閲覧の xvcd を作ってみた

Xfylog xfy の log/* には、XML 形式でログが出力されている。
そこで、この xml ファイルを xml で閲覧するための xvcd  を書いてみた。
まず、log4j での XML 形式用の xslt をみつけた。

http://www.forward.com.au/javaProgramming/javaGuiTips/javaLogging.html
http://www.forward.com.au/javaProgramming/javaGuiTips/logger.xsl.txt

これをもとに xvcd を書いた。以下に公開した。
   http://homepage2.nifty.com/youichi_kato/src.html の "xfy の log ファイルを閲覧する xvcd の例 (2006-11-04)"
   スクリーンショット
   log ファイルの例
   xvcd ファイル
   css ファイル

テーブルの表現を css で制御しようとおもったが、css 記述が利かない。
どこか記述を間違っているのだろうが、解決できない。
css の namespace 指定法が怪しいのだが...
現状は、 <table border="1"> と直に指定しているのが表示に反映されているだけ。

| | コメント (1) | トラックバック (0)

2006-11-03

外部ファイル/外部コマンド出力をxvcdで扱う

xfy のオンライン資料中のサンプル
http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/howto/xvcd_tutorial.html#adress
の住所録は、読み込むxml ファイルに住所データを保持し、それを xvcd で html のテーブルに変換をしています。
(つまりデータすべてがメモリーに読込まれることになります)

先日 私は、任意の外部コマンドを xfy から実行する方法を試して、公開しました。

今日は、外部コマンドの出力が xml だったとして、それを xvcd で処理する例を公開します。
Xfyaddress
  http://homepage2.nifty.com/youichi_kato/src.html の
  xfy で 外部ファイルの内容や外部コマンドの出力に template を適用する例 (2006-11-03)
  スクリーンショット
  読み込む xml
  xvd
  データ xml

  xvcd から核心部分のみを抜粋します。
              <!-- use external xml file -->
              <xvcd:apply-templates select="function:document(./ab:data-url)"/>
              <hr />

              <!-- use command output -->
              <xvcd:variable name="output" select="example:run-command(./ab:data-command)"/>
              <xvcd:apply-templates select="function:xml-string-to-dom($output)"/>
              <hr />
              <pre>
                  <xvcd:value-of select="$output"/>
              </pre>

ここで、
  ab:data-url には file:///tmp/data.xml
  ab:data-command  cat /tmp/data.xml
のテキストが設定されています。(See 読み込む xml [AddressBook.xml] )
大事なのは
 外部データの取得には function:document ,
   文字列を xml として取り込むには function:xml-string-to-dom をつかうということだけです。

この例では 外部のxmlファイルにデータを保持している場合や、xpath 関数の評価結果としてデータを取得した場合に、それに対して xvcd で処理をする例を作ってみました。

次は、データを RDB (組込みDB の derbyを使う予定) から取得するようにする例を作ろうと思っています。
そして、DB へのデータ追加/削除/更新 も xpath 関数経由で行うようにすることで、大量データを扱えるようにします。
大量のデータ例としては郵便番号が扱えればと考えています。

| | コメント (0) | トラックバック (0)

2006-10-28

xfy で HTML 文書を表示させたいが...

- http://www-06.ibm.com/jp/developerworks/xml/060602/j_x-tiptagsoup.shtml
  >> IBM dW : XML : ヒント: ひどいHTMLをTagSoupで修正する - Japan
という記事を読んだ。

そこで思いついたことがある。
xfy 単体では html を表示できない。(ブラウザでの表示に切り替わってしまう)
そこで、Tagsoup を使って、html->xhtml を行う事で、html な サイトの表示ができるのではと。
そこで次のような shellscript, xvcd, xml ファイルを作ってみた。
(以前の "xfy で 外部コマンドを実行してその出力を表示する" でつくった xpath 関数を利用している)
しかしこれでは、 XHTML そのものが表示されるだけだ。
Seehtml_1

どうしたら、XHML のレンダリング結果を表示させることができるだろうか?

http://homepage2.nifty.com/youichi_kato/src/seehtml/seehtml.sh
http://homepage2.nifty.com/youichi_kato/src/seehtml/seehtml.xvcd
http://homepage2.nifty.com/youichi_kato/src/seehtml/seehtml.xhtml

---------------------------------------- seehtml.sh の内容 -------------------------
#! /bin/sh
/sw/bin/wget -q -O - $1 | java -jar /Users/kato/zzz/1.3/tagsoup-1.0.1.jar

---------------------------------------- seehtml.xvcd の一部の抜粋 --------------
    <xvcd:template match="h:see-url">
      <xvcd:variable name="cmd" select="concat('/tmp/seehtml.sh ', ./text())" />
      <div>
        <xvcd:user-data name="output" value=""/>
        Enter URL: [<xvcd:text-of select="." />]<br />
        (press ENTER for executing)
        <!-- KEY EVENT -->
        <xvcd:action event="event:key-pressed[@stroke='ENTER']">
          <xvcd:set-user-data name="output" value="{example:run-command($cmd)}"/>
        </xvcd:action>
      </div>
      <xvcd:value-of select="xvcd:user-data('output')" />
    </xvcd:template>
-------------------------------------------------------------------------------

| | コメント (0) | トラックバック (0)

2006-10-27

Wikipedia データを XML で取得できるのを知った

Wikipedia データを XML で取得できるのを知った

- http://ja.wikipedia.org/wiki/Wikipedia:%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89
  >> Wikipedia:データベースダウンロード - Wikipedia
- http://www.in-vitro.jp/blog/index.cgi/WebService/20060509_01.htm
  >> 試験管のなかのコード :: Wikipedia API にチャレンジ
- http://rblog-tech.japan.cnet.com/0061/2006/04/wikipedia_30fa.html
  >> goo、ウィキペディアのデータを利用した検索サービス「フリー百科事典」を開始
- http://wikipedia.simpleapi.net/
  >> WikipediaAPI - ウィキペディア情報をサイトで利用できるAPI

Wikipedia のデータ内容を XML で取得できるようだ。
xfy で利用するような例を考えてみたい。

1. 単語を選択して何か操作(コンテキストメニュー表示や、なんらかのキー入力) をすると、
Wikipedia の該当内容をポップ表示する。その内容を編集画面に挿入できる。

2. カレンダー画面で、何か操作をすると、その日付けに関しての Wikipedia での記載をポップアップ表示する。
  (blogEditor に組み込むと良いかもしれない)

3. 注釈タグのようなものをつくる。そのタグに適用させる template 中では
   Wikipedia の内容を include して、さらにそれに template を適用させるようにする。

どれもまだまだありがちな感じ。週末になにか作ってもみよう。
いじっている内になにか思いつくかもしれない。

| | コメント (0) | トラックバック (0)

2006-10-25

xfy での xvcd や 拡張した Xpath 関数のテストはどうすればいいのか?

雑誌 "WEB+DB Press Vol.35" の実演!テスト駆動開発 という記事を読んで思ったことがある。

xfy 用の xvcd や Xpath関数でいろいろなものを作る場合、
単体テストしながら作業をしていくよい環境はないのか?という事だ。
つまり xfyUnit とでもいうべきものが欲しい!

存在しなければ自分でつくるのが1つの対処法だと思うが、どこから手をつけていったらいいのかなぁ。

xfy のドキュメントを読めば、テスト方法についても何か説明されているのかもしれないけど。
xfy についての入門書や開発用の書籍 or ムック本(PDFのダウンロード販売でもいいけど)が出版されるとよいと思う。

| | コメント (0) | トラックバック (1)

2006-10-21

xfy でのTable 操作の例

Xfytable_1xfy で template でテーブルを xhtml でつくる際に、テーブル操作を付加する例を以下におきました。

操作手段を提供する方法として、コンテキストメニュー/操作用ボタンの方法を同時に実装しています。
実際には、コンテキストメニュー、ボタンのどちらか一方だけの方法を実装することになるでしょう。
テーブル表示に際して、次の工夫もしています。
      - 行の背景色を交互に変える。(色指定などは CSS ファイルで制御)
      - 行番号を付加する。

スクリーンショット:           http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/Xfy-Table.png
  xml:    AddressBook.xml      http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/AddressBook.xml
  xvcd:     AddressBook.xvcd     http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/AddressBook.xvcd
  css:    plainold.css         http://homepage2.nifty.com/youichi_kato/src/xfy/xvcd/plainold.css

ここでつかった css は 
  CSS Table Gallery ( http://icant.co.uk/csstablegallery/index.php?css=0#r0 )
にある例の中の1つを使っています。

P.S.
  スクリーンショットをとるにあたり、次のページを参考にしました。
  - http://digitalmedia.oreilly.com/2006/01/01/mac-os-x-screenshot-secrets.html
    >> O'Reilly -- Mac OS X Screenshot Secrets

| | コメント (0) | トラックバック (0)

2006-10-19

xfy でのTable 操作をまとめ中

xfy でテーブル表示画面をつくることが多いとおもう。
そこで、
  - テーブルに行番号をつける
  - 奇数/偶数行で背景色を変える
  - コンテキストメニューで行の追加/移動/削除 をする
  - 列の表示 on/off の制御をする
を含む xvcd 例をまとめ中。
週明けには投稿できる予定。

http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/howto/xvcd_tutorial.html#dom
>> XVCDによるボキャブラリコンポーネントの作成 4.1. 住所録
ここで示されているテーブル表示例を拡張させたものとして作成中です。

ruby on rails とまでは行かなくても、レコードの集合のような xml に対して、簡単な記述だけで、CRUD (Create, Read, Update, Delete) の操作ができる画面をつくれる仕組みを作りたいと思っています。

| | コメント (0) | トラックバック (0)

2006-10-15

xfy で 外部コマンドを実行してその出力を表示する

xfy のxpath 関数を java で拡張定義する例を以下においた。
  http://homepage2.nifty.com/youichi_kato/src.html
  の "xfy で 外部コマンドを実行してその出力を表示する (2006-10-15)"

これは、テキストエリアにコマンドラインを入力してから、ENTER を押すと、
コマンドからの stdout, stderr を画面に出力するというものです。

Runcommand

| | コメント (0) | トラックバック (0)

2006-10-07

xfy の xpath関数で ruby文を評価させようと試行中

xfy の Xpath 関数を java 言語で拡張定義する方法を試した。
- Javaでxfyコンポーネントを開発するときの環境設定
- XPath拡張関数を実装したxfyコンポーネントの開発

上の説明文と、doc/sample 下のファイルを利用して作業したが、
build.xml に install ターゲットが無くて、 ant 実行時にエラーになった。
試行錯誤で dist/Sample.jar を xfy の bin/plubin/com.example に copy するようにした。

以下に eclipse プロジェクトを tar+gzip したものを置いた。
xfy で jruby を実行する(作成途中) (2006-10-07)

data/hello.xml を xfy で読み込むことで、動作確認ができる。

次に jruby を利用して、ruby の文を実行させた結果を 表示させることを試みた。
data/hello-ruby.xml を読み込むことで動作を確認しようとしている。
hello-ruby.xml では
  <h:ruby>3.times{|i|p i}</h:ruby>
と <h:ruby>で ruby の文を囲む。
そして、xpath 関数でこの ruby 文を実行評価させようと企てている。

しかし、うまくいかない。
現象: eclipse から実行すると動作するが、
           xfyclient.jar のダブルクリックで実行すると,次のエラーがでる。

  [command failed]com.xfy.common.swing.framework.AwtXfyArea$UpdateCommand
  No such file to load -- builtin/etc.rb

これを解決させたら、 jruby の Stdout への出力結果を 文字列として xpath 関数
からの文字列とすることが、つぎの作業課題となる。

今は、eclipse の Conpsole エリアに 次のように実行結果が表示されだけだ。

2006/10/07 19:46:50 com.xfy.place.logging.LoggingSupport$TimeredOutPutStream$Task run
情報: Console Output occurred
0
1
2

P.S.
- xpath の処理部で ProcessBuilder を使って、外部プログラムとしてruby を呼び出して、標準出力の内容を string として取得するという手もある。
- ruby での xml 処理は REXML がある。
       http://www.cozmixng.org/~kou/ruby/rexml/

| | コメント (0) | トラックバック (0)

xfy からの投稿

xfy から ココログ (プラス) へ投稿してみた。   
(使用システム: MacOSX 10.4.8, java version "1.5.0_06")
                       xfy Blog Editor (Trial) R2

あいうえお

愛上尾

Abcdefg

https://www.xfytec.com/community/modules/news/article.php?storyid=104
>>xfy Blog Editor :ブログ動作例一覧
どのシステムで xfy からブログ投稿できるかの報告一覧があります。
このページは xfy Blog Editor を利用して作成されました。

| | コメント (0) | トラックバック (0)

2006-09-24

Post from performancing.

This is an example of a formatted note note
愛上尾

powered by performancing firefox

| | コメント (2) | トラックバック (0)

Post from writely

   ©相上尾

                                                                
         あいうえお
      
         aiueo
      
         
                                                                                                                                                               
                 あいうえお
                
               
                
               
                
               
                
               
         
         
      
               

| | コメント (1) | トラックバック (0)

jruby

xfy で、logic を xvcd や xpath関数で無く、jruby で記述できるようにならないかなぁ。

http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.html
>>  Ruby for the Java world
>> Script your Java applications and efficiently reuse your Java libraries with this dynamic language

jruby の紹介記事です。

http://homepage1.nifty.com/~tetsu/ruby/
>> Ruby (Japanese)

ruby で 基本コマンド(cal, wc, tree, du etc...) を実装した例が沢山公開されています。
c/java でこういったプログラムが書ける方は、ここでの ruby での記述をみることで、ruby の書き方を知ることができると思います。

http://homepage2.nifty.com/youichi_kato/src.html のページ末尾に
xdu コマンドの真似を java で実装したものがあります。
これを xfy 上で動作させるとか、ruby/jruby で実装することもしたいとおもってます。
(この java ソースは 2001 年頃に書いた古いものです。
でも j2se5 でも compile/run できます。このソース自体も大幅に書き直したい...)

| | コメント (0) | トラックバック (0)

2006-09-21

xfyでココログへの投稿方法

ココログへ xfy をつかって投稿ができるようだ。

xfy Blogエディタによる記事の投稿
xfyでココログへの投稿方法 — RIKIMA.com

今日は遅いから試さないが、時間をとってなるべく早くに試してみたい。
こういった情報が得られのはネットの便利なところ。
情報提供、ありがとうございます。

| | コメント (1) | トラックバック (0)

2006-09-09

xfy の freemind 目次が他のサイトで紹介されていた

http://www2.atwiki.jp/taox/pages/63.html  (道仔@Wiki - 續 xfy 迷)
で xfy1.3 オンラインマニュアルの freemind での目次 について言及されているのを知った。

nifty 上エリア で freemind データをそのまま web で閲覧できるようにする方法があれば、どなたか教えてください。
(本当は、xfy で freemind データを閲覧/編集できればと思っています。freemind の ノードの枝表示や自動レイアウトを xfy で再現する方法が不明。freemind 自体はソースが公開されているから、xfy に表示部分を組み込むことも不可能ではないと思うが、どうやってそんな機能を組み込めばよいのか...)

| | コメント (2) | トラックバック (0)

2006-09-08

Mac だと firefox 拡張機能 launchy で xfy 起動ができない

SmallStyle - Launchyで任意のアプリケーションを起動する
SmallStyle - Launchyで任意のアプリケーションが動かない
を参照して、 firefox から xfy を起動する設定を施してみた。

launchy.xml generator にアクセスして、
xml ファイルを生成して、それを ~/Library/Application Support/Firefox/Profiles/xxxxx.default/chrome/launchy.xml として保存すればよい。

windowsXP ではうまくできたが、MacOsX ではうまく行かない。 マウス右クリックでのメニュー中の launchy で [open in xfy] と サブメニューが出るが、xfy が起動しない。なぜだろう...

| | コメント (0) | トラックバック (0)

2006-08-21

xfy のオンラインマニュアルの 目次を freemind で作ってみた

http://homepage2.nifty.com/youichi_kato/src.html
から xfy のオンラインマニュアルの 目次を freemind で作ったデータにlink をはりました。

freemind mapデータ
スクリーンショット(これは全ノードを展開はしていない状態です。)

各項目をクリックするとマニュアルの該当ページに飛ぶようにリンク設定をしてあります。

| | コメント (0) | トラックバック (0)