銀河の歴史がまた1ページ(日記)

Last Update (2023/06/06 07:18:14)
1997.09.06から数えて counter 番目のアクセスです。

ミラーサイト [www.ceres.dti.ne.jp] [yk.rim.or.jp]

[ホームページ] [日記] [日記ファイル一覧] [読んでいる日記] [FreeBSD] [FreeBSD LINK] [検索]

jdiaryの最新(作成)記事ダイジェスト

2023.06.04(日) 20:48:50 劇場版 仮面ライダーオーズ 将軍と21のコアメダル

劇場版 仮面ライダーオーズ 将軍と21のコアメダル

tag: 映画

「上様が仮面ライダーに出てくるはずがない!偽物だ!斬れ!斬ってしまえ!」

ネタとして引用された動画で見るまでこの映画の存在を知らなかったんだけど、 マジでこんな映画が実在するのかwww

我々は調査を行うためアマゾンプライムに向った。

上様の登場シーンはかなり短めでまさにゲスト出演って感じ。 暴れん坊将軍のBGMに乗って白馬で登場したり殺陣する所は盛り上がって草。

映画の方も綺麗にまとめてて案外よくできていたような気がするが 上様に目がくらんでよく見ていない説はある。

オススメまではしないがどっかで動画を検索して上様登場シーンは見る価値あり。

暴れん坊将軍のクライマックスシーンを検索して見ても雰囲気はそのままだからそっちでもいいけど。

2023.06.04(日) 13:12:42 英語教育の高校生用ChatGPT/Bing英作文自動添削・改訂プロンプトをpythonに適用してみた

英語教育の高校生用ChatGPT/Bing英作文自動添削・改訂プロンプトをpythonに適用してみた

tag: chatgpt, bing

役割指定、ゴール指定、ステップバイステップのタスク指定、出力形式指定が入っててすごく良い感じなプロンプトではないかと。

というわけでpythonコードの添削に変えてみた。

元ネタは英作文添削用のプロンプトなので指示は英文だったが適当に人力日本語訳してみた。(そこはChatGPTで日本語訳しろよw)

添削元のpythonコードは ChatGPT API を呼び出すための実験用pythonプログラムの一部。

ChatGPT-3.5 turbo 0301 で実行した際、 プロンプトのトークン数は 889 , 応答結果のトークン数は 1293 , 合計トークン数は 2182 だった。 結構長いプロンプトに見えるけど 4000トークンいかない様子。

Bingのクリエイティブ応答モードでも実行できた。

python修正指摘内容はモデルによってバラツキがあり、gpt-3.5 turbo 0301 の方が良い感じだけど完全ではない。

最後の応援コマンドは Bingのクリエイティブモードの方が頑張ってくれた。

以下プロンプト。


# ROLE

あなたは、プロのpythonエンジニアです。

あなたは python プログラムを学ぶ難しさ知っている教師でもあり、学習者に学習を続けるように励まします。

# GOAL

あなたのゴールは学習者がより良いプログラムを書けるよう助けることです。

# TASKS

以下のタスクをステップバイステップで実行してください。

Step 1: ダッシュ記号3個(---)で区切られた学習者のプログラムを読み込み、文法違反、スペルミスのみの修正点を指摘します。

Step 2: Step 1 における修正点の完全なリストを作成します。

Step 3: Step 1 の結果に続けてプロとして通用するpythonコードに改訂します。

Step 4: Step 3 における改訂点の完全なリストを作成します。

Step 5: より良いエンジニアになるために、学習者の良い点や強みを示しつつ、学習者を励まします。

# OUTPUT

以下の6個の出力をしてください。

1. Original Text: <3個のダッシュ(---)で区切られた学習者が記述したpythonコード>

2. Usage Correction: <Step 1 の結果>

3. Usage Issues: <Step 2 の結果>

4. Revision: <Step 3 の結果>

5. Revision Issues: <Step 4 の結果>

6. Comment: <Step 5 の結果>

---

def completion(prompt: str, messages: list):
    """ 補完型API。Chain of Thought は使用しない。質問毎に思考は途切れる。
    """

    d = {'role': 'user', 'content': prompt}
    messages.append(d)

    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        temperature=0,
        max_tokens=8000,
        top_p=1,
        frequency_penalty=0.0,
        presence_penalty=0.0,
    )

    # 応答のjsonを表示
    strres = json.dumps(response, ensure_ascii=False, indent=2)
    print(strres)

    if 'choices' in response:
        assistant_content = response['choices'][0]['text']
        d = {'role': 'assistant', 'content': assistant_content}
        messages.append(d)
        # 応答メッセージをコンソールに表示
        print('')
        print('prompt:')
        print(prompt)
        print('')
        print('chatgpt:')
        print(assistant_content)
        # 応答メッセージをログファイルに出力
        with open(MARKDOWN_LOG_FILE, 'a+', encoding='UTF-8') as fp:
            log_info = ''
            log_info = log_info + "\n"
            log_info = log_info + "prompt:\n"
            log_info = log_info + "<pre>\n"
            log_info = log_info + prompt + "\n"
            log_info = log_info + "</pre>\n"
            log_info = log_info + "\n"
            log_info = log_info + "assistant:\n"
            log_info = log_info + "<pre>\n"
            log_info = log_info + assistant_content + "\n"
            log_info = log_info + "</pre>\n"
            log_info = log_info + "\n"
            fp.write(log_info)

    return response

---

2023.06.02(金) 15:57:22 台風2号はまだ遠いけど南風のため京葉線停止

台風2号はまだ遠いけど南風のため京葉線停止

tag: 京葉線

台風はまだ九州のあたりだけど京葉線にとっては一番弱い南南西の強風が吹き荒れて15:40ごろ運転見合わせとの公式発表。

このパターンはなかなか予想できないな。

17:30ごろには運転再開との公式発表。

ちなみに、京葉線の運転見合わせの公式発表は各駅ホームに電車が詰まって全線で電車が一つも動けなくなった時刻のこと。 実際には15:05あたりから運転見合わせしてた。 東京に行く電車として役に立たなくなるのは公式発表の40分前からが相場。

運転再開の公式発表も同じで、全線の中で電車が一つでも動けた時刻が運転再開。 各駅ホームに詰め込んだ電車が流れ出し東京に行く電車として役に立つのは運転再開から40分後である。 今回は帰宅ラッシュ時間と運転再開が重なったので長時間大混乱してたけど。

2023.05.27(土) 23:25:36 pytorch for CUDA 11.8 + diffusers 環境を作る。

pytorch for CUDA 11.8 + diffusers 環境を作る。

tag: cuda11.8, cuda, pytorch, diffusers

以下を見ながら設定した。感謝感謝。

以下自分向けの手順。

python -m venv venv
.\venv\Scripts\Activate.ps1
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install git+https://github.com/huggingface/diffusers.git transformers accelerate OmegaConf pytorch-lightning tensorboard ftfy scipy sentencepiece safetensors
$env:PYTORCH_CUDA_ALLOC_CONF = "garbage_collection_threshold:0.6, max_split_size_mb:128"

自作のmain.pyを実行。deviceはcuda指定。

544x768ピクセル画像が30秒程度でできた。

CPUだと1100秒くらいかかるので36倍速。 これは圧倒的だ。

使用しているモデルはCPU演算で使っていたものをそのまま使っているのでfp32のもの。 fp16にすればさらに高速化が期待できる。

演算器が大量に載っていて専用GRAMメモリとのメモリ帯域も太い専用ハードウェアの威力凄い。

p.s.

automatic1111 stable-diffusion-webui は Cドライブにインストールすれば動作した。 512x512 の生成と 2倍 upscale あわせて 30秒程度、 544x768 の生成と 2倍 upscale あわせて 65秒程度。

upscale時に1088x1536を処理させるとGRAMが不足して速度がガクっと落ちる感ある。 upscale 1024x1024処理はそれほど時間はかからないのだけど。

2023.05.27(土) 12:40:58 ASUSTek GeForce RTX 3060 12G PH-RTX3060-12G-V2 装着

ASUSTek GeForce RTX 3060 12G PH-RTX3060-12G-V2 装着

tag: vermeer, geforce

ポチった RTX 3060 が届いたので早速装着。

さて、stable diffusion 向けの環境を作らねば。

設定手順が結構めんどいw

nVidiaのドライバとかnVidiaのライブラリとかMicrosoftのC++コンパイラのバイナリはライセンスの関係で自動インストールできないからこうなるのか。

2023.05.26(金) 07:10:21 vagrant 2.3.5 だと vagrant up でVM起動しない → 2.3.6 で修正された

tag: vagrant

vagrant 2.3.5 だと vagrant up 時に以下のようなエラーが出る。

vagrant/util/file_mutex.rb:27:in `delete': Permission denied

バグレポートは以下。

vagrant 2.3.6 では修正されていて、起動するようになった。

ただ、vagrant up , vagrant halt でパスワードを要求されるようになったんだけど、なんだろこれ。

2023.05.25(木) 13:35:46 RTX 4060 Ti がなんか微妙そうなので RTX 3060 12GB を確保

RTX 4060 Ti がなんか微妙そうなので RTX 3060 12GB を確保

ふーん。。。消費電力が150Wを下回っているのは好みだけど3060 Tiと比べると性能はイマイチか?

グラボ業界にあるリネーム品ほどじゃないけど4060系の性能は微妙で値段だけ上がった様子。

とりあえず生産停止になった nVidia GeForce RTX 3060 12GB をポチって保護しておく。 しばらくこれで耐えよう。

Radeon系列が Stable Diffusion お絵描き用途では壊滅的なのでGeForce 1強。競争が働かないんだよな。困ったものだ。

2023.05.13(土) 04:13:22 角川 ASCII BOOKS の PDF本ダウンロードサービス

角川 ASCII BOOKS の PDF本ダウンロードサービス

角川アスキー総合研究所のKindle本を購入したら巻末にPDF版無料ダウンロードのご案内があった。

対象書籍の各ページにはトランプ記号がランダムに記述されていて 上のダウンロードページでは、xxxページに印刷されている記号は何?を4回答えるとPDF版をダウンロードできるしくみ。

これは良いかも。

最近はPDF版を売っている技術評論社/オライリーの本ばかり買ってたけどこういうやり方もあるんだな。

2023.05.04(木) 18:22:27 【推しの子】

【推しの子】

tag: anime

ゲッター線を浴びたので推しの子見てる。

アイドル物はあまり見ないんだけどこれは転生と復讐劇が混ざっているので男子諸君も見れる、かも。

原作は少女漫画レーベルかな?と思ったがヤングジャンプだったw ヤングジャンプは時々婦女子向けのマンガを連載するので不思議ではないらしい。 なお現在も連載中。

1話がちょっとキツいんだけどゲッター線を浴びた後なので耐えられた。(FX戦士の漫画レベルまでやられると1話で折れる)

今後の話の展開は普通のアイドルものに収束していく...のかと思いきや真犯人絶対殺すマン路線を取りつつスターに駆け上がる途中らしい。

p.s. 5/26

6話が重くて7話で解決しつつ新展開。 まるでジェットコースター。

いろいろな方向にギリギリ攻めて作ってあるセンシティブな話ではある。

2023.05.01(月) 21:41:39 Androidスマホの電池の減りが早い

Androidスマホの電池の減りが早い

tag: android

今の所、Androidスマホのバッテリー消費トップはモバイルネットワークスタンバイ。

検索してみたら、4Gとか基地局の電波のつかみが悪いとこうなるらしい。

twitter通知, NHKニュース防災通知、ガジェットなどを停止しまくった結果iPhone側はそんなに電池が減らなくなってきたのだがAndroidスマホは使っていないのに1日でバッテリー半分まで減る。

Docomo の 4G 電波が弱くなったのかな? 4Gから5Gアンテナに建て替えてるからだろうけど、困ったものだ。

2023.04.15(土) 20:27:33 Logicool G ゲーミングマウス G703h 購入

tag: 散財

Logicool G ゲーミングマウス G703h 購入

キーボードとトラックボールが3セット並んでいた机の上だが、切り替え器投入で1セットまで減った。

マウスを転がすスペースができたのでワイヤレスのゲーミングマウス購入。

もっとも、ごくたまにやっているPSO2NGSはX Box コントローラを使っているのでゲームでマウスを使うことは無いんだが。

ワイヤレスマウスなんだけど充電用のUSB-A to USB-microケーブルは付属していて有線接続マウスとしても使える。 充電用ケーブルのUSB-micro先にUSB-A無線レシーバーをつける変換器もついててちょっと気が利いている。

2023.04.14(金) 12:44:42 キーボード・マウス用パソコン切替器(3:1)購入

tag: 散財

キーボード・マウス用パソコン切替器(3:1)購入

サンワサプライのキーボード・マウス用パソコン切替器(3:1)購入 SW-KM3UU。

机の上にキーボードとトラックボールが3セット載っている状況は狭かったのでw

切り替えはキーボードから Ctrl, Ctrl, [123]{0,1}, Enterで行う。

p.s. 5/25

キーボードからの Ctrl, Ctrl を時々認識しないことがあるので、パソコン切り替え機側に物理スイッチがあった方が良かったな。

2023.04.05(水) 21:48:51 ChatGPTに匹敵する性能の日本語対応チャットAI「Vicuna-13B」のデータが公開

ChatGPTに匹敵する性能の日本語対応チャットAI「Vicuna-13B」のデータが公開

tag: chatgpt

メモリ64GBのマシンがはたして一般家庭にあるPCなのか?という疑問は浮かぶが...。

記事を読むと64GBだとswapが発生する模様。 64GBで足りない日が来るとはな。 ウチのマザボだと64GBメモリが上限なのでちとキツイ。

今は半導体不況でメモリが安いし128GBマシン買うか...。

今のメインマシンは取り回しの良い小型タワーPCを購入したんだけど、さすがに拡張性が無くて詰んだ。 まさかお絵描きAIやら大型言語モデルやらでスペックが足りなくなるなんて思わなかったよ。 スペック不足でノートPCを買わなくなって久しいけどスモールファクタPCも買えなくなりそうだ。

p.s. 4/8

Ryzen 7 7700X で構成考えてみたけど50万円コースだった。コスパ悪いなぁ。

Ryzen 7 5700X だと30万円コース。値段が1.5倍以上違うけど性能は1.5倍も違わんあたりが悩ましい。

2023.04.02(日) 11:56:11 Ubuntu 22.04 LTS に Ubuntu Pro を適用する

Ubuntu 22.04 LTS に Ubuntu Pro を適用する

tag: ubuntu, ubuntu-expanded-security-maintenance

Ubuntu Pro はお一人様5台までは無料とのこと。

Ubuntu Pro を適用すると live patch 機能が有効になり自動的にパッチを適用してくれる模様。

まだ裏は取っていないが、最近AWS Lightsail上の Ubuntu 22.04 LTS (x86_64) にログインしても「適用可能なパッチが0件です」が続いていたので、明示的にUbuntu Proを適用しなくても勝手にパッチが入るようになっていたかもしれん。

# Ubuntu Pro の適用
sudo pro attach [personal_token]

# ツールのインストール(必要ならば実施)(ウチではやってない)
# sudo apt-get install ubuntu-advantage-tools

# proバージョン確認
pro --version
pro status

2023.03.31(金) 23:29:01 ChatGPTはテキストの分類が得意と聞いて

ChatGPTはテキストの分類が得意と聞いて

tag: chatgpt

自分では使い道が全然思い浮かばなかったけど以下のまとめを見て感心することしきり。

Skebの利用規約違反チェックの例は言ってみればテキストの分類だしこれは割とすぐに使えそう。

CGMやSNS周辺だと使える用途が多そうだ。

テキストの分類で言えば自分の書いたブログやTweetの文章をChatGPTに解析させて好感度を根拠付きで判定させるのもいいかもしれない。

イケメンな内容のブログ記事が書けるかも?

2023.03.25(土) 23:47:03 ChatGPT API発行してみた

ChatGPT API発行してみた

tag: chatgpt

今の所、API呼び出しはChat GPT-3.5までしか公開されていない模様。

Chain of Thought (思考の連鎖) を表現するchat APIは、ChatGPT-3.5の頃はmessages配列に過去の会話履歴を全部送信する形で実現していたのか。

APIの返事はまあまあ遅い(ChatGPT-4の場合だと30秒近くかかる)らしく、streamフラグを指定して、結果が出た所から徐々に表示するみたいな使い方ができるように工夫されているようだ。

ChatGPTのWebインターフェースだと返事がゆっくり表示されていたけど、アレはstream表示をしていたんだな。

要求を出すところ。ChatGPT-3.5-turbo。

import json
import openai

def chat():
    """ チャット型API。Chain of Thoughtを使う。会話履歴はmessagesに連結していく。
    """
    res = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            # {
            # "role": "system",
            # "content": "日本語で質問します。日本語で返答してください。"
            # },
            {
                "role": "user",
                "content": "古代ローマ帝国について私が学習する時に私が知っているべき5個のキーポイントは何?"
            },
        ],
    )
    return res


# 呼び出し チャット型
res = chat()

strres = json.dumps(res, ensure_ascii=False, indent=2)
print(strres)

ChatGPTからの返事 openai.ChatCompletion.create

{
  "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "object": "chat.completion",
  "created": 1679794740,
  "model": "gpt-3.5-turbo-0301",
  "usage": {
    "prompt_tokens": 51,
    "completion_tokens": 571,
    "total_tokens": 622
  },
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "1. ローマ共和政:紀元前509年から紀元前27年にかけて、ローマは共和政として統治されていた。 この期間、政治的権力は貴族層によって支配され、執政官や元老院が重要な役割を果たした。\n\n2. ローマ帝国の創設:紀元前27年、オクタウィアヌスが元首となり、ローマ帝国が成立した。彼は後にアウグストゥスとして知られ、帝国の最 初の皇帝として統治し、現代世界で知られるローマ文化の発展に重要な役割を果たした。\n\n3. 帝国の拡大:帝国の成立後、ローマは周辺地域を征服し、最盛期にはヨーロッパ、アフリカ、西アジアの大部分を支配下に置いた。この拡大には 軍事力と道路網の整備が大きく貢献した。\n\n4. 宗教の変化:ローマ帝国は当初、古代ローマ宗教を信仰していたが、後にキリスト教が広がり、313年のミラノ勅令によって公認された。キリスト教はローマ帝国の文化や社会に大きな影響を与え、現代でもその影響が見られる。\n\n5. 帝国の崩壊:ローマ帝国は5世紀に入ると西ローマ帝国と東ローマ帝国に分裂 し、476年に西ローマ帝国はオドアケルによって滅ぼされた。東ローマ帝国はその後も存続し、ビザンツ帝国として繁栄したが、ローマ帝国は古代世界の中で終焉を迎えた。"
      },
      "finish_reason": "stop",
      "index": 0
    }
  ]
}

実験用のメインルーチン。

#
# chatgpt main program
#
import os
import sys
import json
import argparse

import openai

# 定数

# 過去のメッセージを保存するファイル名
MESSAGES_FILE = 'message.json'

# デバッグモード
DEBUG_MODE = False


def completion(prompt: str, messages: list):
    """ プロンプト型API。Chain of Thought は使用しない。質問毎に思考は途切れる。
    """

    d = {'role': 'user', 'content': prompt}
    messages.append(d)

    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        temperature=0,
        max_tokens=800,
        top_p=1,
        frequency_penalty=0.0,
        presence_penalty=0.0,
    )

    # 応答のjsonを表示
    strres = json.dumps(response, ensure_ascii=False, indent=2)
    print(strres)

    if 'choices' in response:
        assistant_content = response['choices'][0]['text']
        d = {'role': 'assistant', 'content': assistant_content}
        messages.append(d)
        print('')
        print('prompt:')
        print(prompt)
        print('')
        print('chatgpt:')
        print(assistant_content)

    return response


def chomp_messages(messages: list):
    """ 過去発言のリストの中から、チャット内容のフラッシュを意味する"----"から始まる文字列が
        最後に出現した位置より下のみのリストを作って返却する。
    """

    # 最後に出現した位置を取得
    i: int = 0
    idx: int = 0
    for d in messages:
        role: str = d['role']
        txt: str = d['content']
        if role == 'system':
            if txt.startswith('----'):
                idx = i
        i = i+1

    # 新しくリストを作って返却
    result = []
    i = 0
    for d in messages:
        if idx < i:
            result.append(d)
        i = i+1

    return result


def chat(prompt: str, messages: list):
    """ チャット型API。Chain of Thoughtを使う。会話履歴はmessagesに連結していく。
    """

    d = {'role': 'user', 'content': prompt}
    messages.append(d)

    # フラッシュ指定がある後のメッセージを抽出
    flushed_messages = chomp_messages(messages)

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=flushed_messages,
    )

    # 応答のjsonを表示
    strres = json.dumps(response, ensure_ascii=False, indent=2)
    print(strres)

    if 'choices' in response:
        assistant_content = response['choices'][0]['message']['content']
        d = {'role': 'assistant', 'content': assistant_content}
        messages.append(d)
        print('')
        print('prompt:')
        print(prompt)
        print('')
        print('chatgpt:')
        print(assistant_content)

    return messages


def main(argv: list):

    # APIキー初期化
    api_key = os.getenv("OPENAI_API_KEY")
    if api_key is None:
        raise ValueError('環境変数 OPENAI_API_KEY が設定されていません。')
    openai.api_key = api_key

    # 引数解析初期化
    parser = argparse.ArgumentParser(description='Description of ChatGPT client program')
    parser.add_argument('--prompt', help='prompt string')
    parser.add_argument('--flush', action='store_true', help='flush chat sequence')
    parser.add_argument('--comp', action='store_true', help='single completion mode')
    parser.add_argument('--chat', action='store_true', help='sequence chat mode')
    parser.add_argument('--debug', action='store_true', help='debug mode')
    args = parser.parse_args(argv)

    # prompt = "What are 5 key points I should know when studying Ancient Rome?"
    # prompt = "古代ローマ帝国について私が学習する時に私が知っているべき5個のキーポイントは何?"
    prompt = None
    if args.prompt:
        prompt = args.prompt
    if prompt is None:
        print('プロンプトが指定されていません。')
        return

    # デバッグモード
    if args.debug:
        global DEBUG_MODE
        DEBUG_MODE = True

    # 動作モード
    mode = 'comp'
    if args.comp:
        mode = 'comp'
    if args.chat:
        mode = 'chat'

    # 発言履歴ロード
    messages = []
    if os.path.isfile(MESSAGES_FILE):
        with open(MESSAGES_FILE, 'r', encoding='UTF-8') as fp:
            messages = json.load(fp)

    # フラッシュ指定があれば目印を挿入
    if args.flush:
        d = {
            "role": "system", "content": "--------"
        }
        messages.append(d)

    if mode == 'comp':
        # 呼び出し 単発のcompletion型
        completion(prompt, messages)

    if mode == 'chat':
        # 呼び出し 過去発言のsequence指定のチャット型completion型
        chat(prompt, messages)

    # 発言履歴セーブ
    with open(MESSAGES_FILE, 'w', encoding='UTF-8') as fp:
        json.dump(messages, fp, ensure_ascii=False, indent=2)


if __name__ == '__main__':
    main(sys.argv[1:])

#
# end of file
#

質問の実行。

ChatGPTからの回答文もAPIに載せて過去の会話履歴として送っているので使用トークン数がバンバン増えていくwww

トークン数課金なのやめてwww

関連する話題を続けるには良い機能なんだけどね。

    python ./src/chatgptmain.py --flush --chat --prompt "JavaScriptでWindows GUIを作成する時に、私が知っているべき5つのライブラリを教えて"
    python ./src/chatgptmain.py         --chat --prompt "Electronについて教えて"
    python ./src/chatgptmain.py         --chat --prompt "Electronのサンプルを表示して"
    python ./src/chatgptmain.py         --chat --prompt "Electronのインストール方法を教えて"

Copyright(c) 1996-2023 George(小濱 純). All rights reserved.
私の作成したページへのリンクはご自由にどうぞ。
このページに間違いや要望などがありましたら george@yk.rim.or.jp まで御連絡ください。
メール本文に 6020-5440-3372 とか私の 本名 を漢字で書いて頂くと、ウチのSPAMフィルタを通過できます。

[ホームページ] [日記] [日記ファイル一覧] [読んでいる日記] [FreeBSD] [FreeBSD LINK] [検索]

home: <george@yk.rim.or.jp> or <george@ceres.dti.ne.jp>
(I am using white list SPAM filter. To avoid it, please write 6020-5440-3372 in mail body. This key word is valid since 2009-06-14 until 2022-12-31.)