Hello world !

2003 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 09 | 12 |
2005 | 02 | 05 |
2006 | 09 |
2007 | 05 | 08 |
2008 | 05 | 10 |
2009 | 07 |

2004-04-30 pod2html

POD2HTML

古いpod2htmlでは、=begin html 内のHTMLもエスケープしてしまう。

5.8.2 の pod2html を使うと問題なし。

でも、preタグ内で # 前後の改行が無視される。

2004-04-28 KJSEmbed, MONO

KJScmd

kjscmd --exec でGUIのコンソールを起動できた。

kjscmd --console はエラー。kjscmd --exec --console は OK。

kjscmd --exec --nogui は、反応なし。

Mono

インストールした。

$ mcs HelloWorld.cs で、C#ソースをコンパイル。

$ mono HelloWorld.exe で実行。

DLLを作るには、コンパイルオプションに -target:library を設定。

ライブラリパスは、-lib:PATH1,PATH2 で追加設定し、

アセンブリ・リファレンスでdllを指定する。

$ mcs -target:library MyLib.cs

$ mcs Hello.cs -reference:MyLib.dll

$ mono Hello.exe

プログラムでウィンドウを表示させるには、winelibが必要らしい。

コンパイル時には、-r:System.Windows.Formsを指定する。

2004-04-27 KJSEmbed

KJSCMDがコンソールで起動しない?

正確には、GUIを生成する命令がコンソール上で機能しないらしい。

  • スタートメニューからは起動できる。
  • コンソールに出力するスクリプトは実行できた。
  • *.uiファイルを読み込んでGUIを表示する事は出来る。

メーリングリストなどを調べたが、同様の報告は、

dot.kde.orgの

フォーラムに一件のみ。解決には到らなかった。

(追記:20040613)これはGUI全般ではなく、特定のWidgetクラスのバグだった。

KDE関連のメーリングリストに参加

KMailでメーリングリストのフィルタを登録。

KOffice の依存ライブラリインストール(予定)

  • ImageMagick-6.0.6
  • Aspell
  • fontconfig
  • wv2
  • libgsf

configure / compile

libgsf は *-configファイルがなかったので、*/lib/pkgconfig/*.pcファイル

/usr/lib/pkgconfigにコピー。

fontconfigも/usr/local/bin/fontconfig-configシェルスクリプトを削除し、

同様にpkgconfigで対応する事にした。

wv2は、wvlog.hで使われている std::basic_ostream が未定義と言われたので、

g++を更新する事に。aptではg++-3までしかなかったので最新版をコンパイルする。

Mailing list

KDEメーリングリストで、

qtを-qt-git付きでりビルドしてもkonquerorGIFが表示されないとの投稿を読む。

まだqtのりビルドしてないけど、同じ症状かもしれない。

2004-04-26 KDE/DCOP

[] Desktop COmmunication Protocol

コンソール上で使えるコマンド適当にchoice。

dcop の object の部分は、アプリケーション名-プロセスID

KMAIL=`dcopstart kmail`の様にして値を得る。

もしくは、kdcopやdcopコマンドで確認。

(dcopの引数を省略するとリストを表示する。)

 # メール送信
 dcop kmail KMailIface openComposer "宛先" "" "" "題名" "本文" 1
 dcop kmail "kmail-composer#1" activateAction send_default

 # メールチェック
 dcop kmail KMailIface checkMail

 # セッションを保存
 dcop ksmserver ksmserver saveCurrentSession

KOrganizerのJurnal と Hatena diary の同期を取る。

まずは、KOrganizerを起動し、オブジェクト名前を調べる。

kdcopで korganizerのツリーを調べる。

 # Journal のパネルを表示
 dcop korganizer "KOrganizer MainWindow" activateAction view_journal

 # 今日の日付へ
 dcop korganizer "KOrganizer MainWindow" activateAction go_today

 # action一覧(共通)
 dcop korganizer "KOrganizer MainWindow" actions

と、GUIを操作する関数は見つかったが、

テキストコントロール内の情報を得るには到らず。

他に利用できそうなactionは、

file_save ... セーブしてファイルからデータを読む、、、だと DCOP関係ないし。

~/.kde/share/apps/korganizer/std.ics から読み込む方が簡単そう。

edit_copy ... でクリップボード経由でテキストを得られるかな。など考えたけど(選択方法が分からなかったので諦めた。select_allみたいなのがあればなぁ...)

情報を得るにはプロパティの方かなと思い、

property, propertyNames を探ってみるが、こちらはスタイル関連のプロパティばかりだった。

関数の型をみても他に文字列の情報を返しそうな関数はなかったので、DCOP関連のドキュメントを当たる事にした。

http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html

なければ QCString getJournalText(int year, int month, int day) みたいなのを追加しよう。

を読み、該当するコントロールを探す方法を探ってみる。

 # オブジェクト一覧表示
 dcop korganizer qt objects | grep -i journal
 dcop korganizer "qt/KXMLGUIClient-KActionCollection/view_journal" property text

と打つと、"ジャーナル(&J)"と言う文字列が得られた。

これは、ツールバーのボタンのラベルらしい。

この調子で、ジャーナルのテキスト・コントロールのプロパティを参照すれば目的の情報を得られるかなと思ったけど、

まだ日付をどうやって指定すればいいのか問題が残っている。



散文になってしまったけどそのままPOST。(汗

TODO

  • Kommander Editor ...
  • QSA - Qt Script for Application ... コンパイル失敗した

2004-04-19 Parrot humor

[][]

parrotをコンパイルしてて気がついた、

コンパイラのオプションで ...

(前後省略)

 -Dan_Sugalski -Larry -Wall

思わずgrep掛けてしまった *lol*

[] infinity loop

久しぶりに、はまったのでメモ

 size_t i;
 
 for (i = 10; i >= 0; --i) {
   do_something();
 }

i > 0 だと正常に動作するけど、 i >= 0 だと無限ループ

size_t が unsigned な処理系は注意。

[][] and [Jako]

そういえば、

ParrotとJakoのHelloWorldプログラムを載せていなかった。

Parrot

 print "Hello, world\n"
 end

こっちはJako.

 use sys;
 sys::print("Hello, world\n");

....


HelloWorldって処理系が動くがどうか確かめる為のモノで、

言語の概観を紹介するのには向いてないなぁ。今更、気がついた(遅)

2004-04-12 A small utility

Python

BitTorrentで見かけたコードの断片を関数化。

他の言語でも使い回そうと思い、ユーティリティに追加。

 def slicer(pieces, n):
   return [pieces[x:x+n] for x in xrange(0, len(pieces), n)]

Ruby

"map"っぽく使いたかったのだけど、無理だったので手続で。

 def slicer(pieces, n)
   result = Array.new
   (0..pieces.length).step(n) do |i|
     result << pieces[i, i+n]
   end
   return result
 end

Perl

Perlのrangeは、間隔が指定できなかったはずなので、

FPっぽくrange関数を定義。

 sub range($$$) {
   my ($begin, $end, $step) = @_;
   return ($begin < $end) ? ($begin,range($begin+$step, $end, $step)) : $end;
 }

 sub slicer($$) {
   my ($pieces, $n) = @_;
   return map { substr($str, $_, $step) } range(0, length $str, $step);
 }

PHP

PHP5より、rangeで第三引数stepが指定できるらしいので。

 function slicer($str, $step) {
   return array_map(
            create_function('$x', "return substr($str, \$x, $step);"),
            range(0, strlen($str)-1, $step));
 }

追記:2004-04-14

Rubyで、Array#map使えばOne linerで書けた。

2004-04-11 AspectR

[][][]


ロギングや同期処理をアスペクトにまとめる。

 require 'thread'
 require 'aspectr'
 include AspectR

 class MutexArary < Array
   attr_reader :mutex

   def initialize
     @mutex = Mutex.new
   end
 end

 class MutexArrayAspect < Aspect
   def lock(method, object, status, *args)
     object.mutex.lock
   end
   
   def unlock(method, object, status, *args)
     object.mutex.unlock
   end
 end

 mutex_aspect = MutexArrayAspect.new
 mutex_aspect.wrap(MutexArray, :lock, :unlock, /\<\</)
 mutex_aspect.wrap(MutexArray, :lock, :unlock, /\[\]/)
 mutex_aspect.wrap(MutexArray, :lock, :unlock, /push/)
 mutex_aspect.wrap(MutexArray, :lock, :unlock, /delete/)

 # @mutexも外に追い出せるかな。TODO
 # インスタンス生成時にMutexをobjectに追加するアスペクト
 # を書いてみたが、object.method = Mutex.new では、
 # 追加出来なかった。

 require 'gserver'
 class Server < GServer
   def serve(io)
     io.puts( io.gets() )
   end
 end

 class ServerLoggingAspect < Aspect
   def connected(method, object, status, *args)
     puts "Server started"
   end

   def finished(method, object, status, *args)
     puts "Server stopped"
   end
 end
 log_aspect = ServerLoggingAspect.new
 log_aspect.wrap(Server, :connected, :finished, :serve)
 log_aspect.add_advice(Server, :RRE, :start, :started)
 log_aspect.add_advice(Server, :POST, :stop, :stopped)

 # Server クラスを”汚さず”にログを取れる。

 
 class MyQueue < Array
   attr_reader :condition

   def initialize
     @condition = Mutex.new
   end
 end

 class QueueConditionVariable < Aspect
   def initialize
     @waiters = []
     @waiters_mutex = Mutex.new
   end

   def wait(method, object, status, *args)
     while object.length == 0 do
       object.condition.unlock
       @waiters_mutex.synchronize {
         @waiters.push(Thread.current)
       }
       Thread.stop
       object.condition.lock
     end
   end

   def signal(method, object, status, *args)
     @waiters_mutex.synchronize {
       thread = @waiters.shift
       thread.run if thread
     }
   end
 end

 # 20040414 書き忘れた。追加
 cv = QueueConditionVariable.new
 cv.add_advice(MyQueue, :PRE, :pop, :wait)
 cv.add_advice(MyQueue, :POST, :push, :signal)

 # ConditionVariableの例。TODO
 # 待機の条件をパラメータにすると汎用的になる(はず)

2004-04-07 Bencode with ruby

[][]

BitTorrentのメタ情報ファイルや、

トラッカーの応答メッセージで使われている

BEncode(bee-encodeと発音する)をRubyで実装してみた。

Rythonは、オリジナルのスクリプトに含まれているし、

Perl, OCamlによる実装はすでにあるらしい。&&

PHPには、若干仕様が異なるが、似たようなアルゴリズム

serialize, unserializeという組み込み関数がある。

...ということで、ひさしぶりにRuby.


ルールはシンプル。次の通り。

  • 文字列 length `:' data
  • 整数 'i' data 'e'
  • リスト 'l' ... 'e'
  • 辞書 'd' ... 'e'

例を幾つか上げると、

"4:SPAM"からは、':'以降の4bytes分のデータ"SPAM".

"i123e"は、'i'から次に現れる'e'までの数 123 がデータ部,

次にリスト構造。"li10ei20ei30ee"は、最初の'l'と最後の'e'

が対応していて、間には数値の要素が三つ[10,20,30]となる。

辞書リストの応用で、違いは、辞書では連続する2つの要素

はキーと値のペアになって辞書Rubyではハッシュ構造)に格納される。また、リスト辞書はそれぞれ入れ子にする事も出来る。



 require 'stringio'

 class UnknownCommandError < StandardError
 end

 class InvalidNumberFormatError < StandardError
 end

 def bdecode(stream, nesting=0)
   if stream.member? "getc"    # FIXME stream type ¤ÎȽÃÇ
     return _bdecode(stream, nesting)
   else
     return _bdecode(StringIO.new(stream), nesting)
   end
 end

 def _read_bytes(stream, terminator)
   tmp = Array.new
   loop do
     c = stream.getc
     if c && c.chr != terminator && c >= 0
       tmp.push(c.chr)
     else
       break
     end
   end
   return tmp.join('')
 end

 def _read_number(stream, terminator)
   num = _read_bytes(stream, terminator)
   if num.match(/^(0|-?[1-9][0-9]*)$/)
     return num.to_i
   else
     raise InvalidNumberFormatError 
   end
 end


 def _bdecode(stream, nesting=0)
   c = stream.getc
   case c.chr
   when 'd' # Dict
     tmp = Hash.new
     while key = _bdecode(stream, nesting+1) do
       val = _bdecode(stream, nesting+1)
       tmp[key] = val
     end
     return tmp     
   when 'l' # List
     tmp = Array.new
     while val = _bdecode(stream, nesting+1) do
       tmp.push(val)
     end 
     return tmp
   when 'i' # Integer
     return _read_number(stream, 'e')
   when '0' .. '9' # String
     stream.ungetc(c)
     len = _read_number(stream, ':')
     str = stream.read(len)
     return str
   when 'e', -1
     return nil
   else
     raise UnknownCommandError
   end
 end

 p bdecode("d4:name7:teamikl3:agei24ee")


2004-04-04 WebSVN

http://websvn.tigris.org/

日本語パッチ(EUC-JP)をポストしてみた。

2004-04-02 CRC32

良く使うアルゴリズムC言語で書く [CRC32]

目的 -

頻繁に利用する処理をC言語で記述し、

言語C言語ライブラリを使う為のラッパーを記述する事で、パフォーマンス&再利用生の向上を図る。

JAVAVM, Parrot, Rotor(EMCA-335 CLI)等、複数の言語

言語中立のランタイムを提供するものは幾つかあるが、

ここでは別のアプローチで、SWIGの利用を想定する。

例としてCRCを取り上げて、実装してみる。

CRCとは。。。

  • PNGのチェックサムに使われる。
  • GZIPでも使っていた。(option)
  • 詳しくは、RFC 1952. PNGの仕様書にも実装例が載っている。
  • ZLibのソース
 import binascii
 
 if __name__ == '__main__':
   import sys
   print "%lu" % (binascii.crc32(sys.argv[1]))

binascii.crc32は、4 byteのIntegerを返すので、

出力時にフォーマット指定で変換する。

PythonPHPでは標準モジュールには含まれているのだけど、

他の言語の標準module/libraryにはあまり見当たらない。

ZLibにcrc32関数が含まれているので、ライブラリとして提供されているものは多いかも知れないが。

CRC32を例に、

# テーブル作成
crc_table = [0] * 256
for n in xrange(256):
  c = n
  for m in xrange(8):
    if c & 1:
      c = 0xedb88320 ^ (c >> 1)
    else:
      c = c >> 1
  crc_table[n] = c

def print_csource():
  """C言語ソースを出力"""
  global crc_table
  print "static unsigned long crc_table[256] ={\n\t",
  for n in xrange(len(crc_table)):
    print "0x%08lxUL," % crc_table[n],
    if n % 5 == 0:
      print "\n\t",
  print "};"


def crc32(data, crc=0xffffffffL):
  for i in xrange(data):
    crc = crc_table[(crc ^ i) & 0xff] ^ (crc >> 8)
  return crc ^ 0xffffffffL

とりあえず書いてみたが、型情報がどうなっているのか

曖昧なので不安。

アルゴリズムは大体こんな感じ。

テーブル作成部分は一度しか実行しないのであまり気にならないが、crc32関数は何度も呼び出される事があるので、最適化したい。

  • Pythonコードの最適化(引数のパースを避ける為に関数を分ける)。
  • アルゴリズムの最適化。
  • pychoモジュールを使う。
  • C言語で書く。(binasciiモジュール, zlibモジュール)

続く ...

Connection: close