メニュー

関連ページリンク

トップ > 結城浩 > 結城浩 - 人気ブログ(Blog)検索結果詳細 (2008年12月2日 12時)

[etc] OpenSolaris(5.11)をVMware Fusionに入れてみた

OpenSolaris縺ョ蜈・謇?からインストールCDのイメージファイル(os200805.iso, 683.7MB)をダウンロード。

VMware仮想マシンを新規作成

種類
OpenSolaris 10 (64bit):
メモリ
560MB:
ディスク
8GB:

Solarisインストール

  1. grubが起動しEnterキーでインストーラが起動する。
  2. 言語を選ぶ 18.Japanese
  3. キーボードレイアウトを選ぶ 7.Japanese
  4. しばらく放っておくとインストール用のデスクトップ画面が起動する
  5. [OpenSolarisをインストールする]アイコンをダブルクリック
  6. [ようこそ] 次へ
  7. [ディスク] ディスク全体を使用するをチェックして次へ

[タイムゾーン] 以下設定して次へ

    1. 地域:アジア
    2. 場所:日本
    3. タイムゾーン:日本
    4. 日付、時刻はそのまま
  1. [ロケール] 日本語を選択して次へ
  2. rootと一般ユーザアカウントを作成する
  3. 最後に確認画面がでるので[インストール]
  4. しばらく放っておく
  5. インストールが完了したら[リブート]

VMware Toolsのインストール

  1. VMwareの[メニュー]-[仮想マシン]-[VMware Toolsのインストール]
  2. マウントしているISOイメージを強制的に解除するか聞かれるのでYES
  3. ファイルブラウザが起動しvmware-solaris-tools.tar.gzが表示される
  4. ファイルを右クリック-[展開]しデスクトップに展開する
  5. デスクトップにvmware-tools-distribというフォルダが作られる
$ cd ~/Desktop/vmware-tools-distrib
$ su - root -c "./vmware-install.pl"
$ su - root -c "/etc/init.d/vmware-tools start"

でこのままだとキーボード配列になってしまうので/etc/X11/xorg.confのキーボード設定を修正する。

- Option "XkbModel" "pc104"
- Option "XkbLayout" "us"
+ Option "XkbModel" "jp106"
+ Option "XkbLayout" "jp"

一度ログアウトしてログインし直せば有効になる。Ctrl+CommandをしなくてもOSXとSolarisの間でマウスが行き来できるようになれば成功。

作者:czk-htn

更新日:2008年11月20日 10時6分

このブログのホーム

[java] デザインパターン/読み終えて・・・

Java言語で学ぶデザインパターン入門

Java言語で学ぶデザインパターン入門

写経について

  • Eclipseなどのコード補完は最低限にとどめるのが良し
    • メソッド名や引数など補完されるとせっかくの覚えるチャンスを逸する
    • vi, emacsでもいいけど環境設定にこだわり始めてしまいそうな罠
  • 細かな点にも注意する
    • public, protectedなどアクセス修飾子
    • 変数名の命名センス
    • 1ブロックのコード量

開発に活かす

  • クラス図とシーケンス図は重要
    • アクセス権を示すマークも
  • Main関数(テストケース)が揃えば8割方仕様は決まる
    • 引数などは
  • この3点をセットで与えればプログラマは仕事を始められる

作者:czk-htn

更新日:2008年11月19日 21時47分

このブログのホーム

[java] J2EEパターン/第3章 3.1 プレゼンテーション層における設計上の考慮すべき事項

isbn:48974714345

セッション管理

リクエスト毎のパフォーマンスや柔軟性、データサイズの制限、セキュリティなどを考慮。

  • hidden
  • cookie
  • サーバ上
    • インメモリ
    • EJB
    • RDB

クライアントアクセスの制御

特定ユーザからのみリクエストを受け付けるようアクセスを制御する。

  • アクセスを制御する方法
    • カスタムタグを用いる
    • 設定によって保護する
    • 内部呼び出しによってしかアクセスできないようにする
  • 保護する対象
    • ビュー全体を保護
    • ビューの一部を保護
  • 設定によって保護する
    • web.xmlの<security-constraint>
    • /WEB-INFの下
  • フォーム送信の重複
    • 「戻る」/ 「更新」
    • トークンによるリクエストの有効性チェック
    • ページ遷移を保証(ブックマークによる直接アクセスを防ぐ)

バリデーション

作者:czk-htn

更新日:2008年11月19日 21時47分

このブログのホーム

[java] デザインパターン/23. Interpreter

Java言語で学ぶデザインパターン入門

Java言語で学ぶデザインパターン入門

オレ言語実装。DSLってやつ?

BNF

今回は構文解析ってことでBNF(Bukus Normal Form)についてP.363〜P.365までの2ページに渡って説明。ここはソフトウェア開発技術者試験で学んでいるところなので軽く読みすすめる。

クラス図

パッと見た目はCompositeパターン。

Contextクラスで構文の単語をたどり、それらをNodeクラス以下による構文木の葉としてあらわす。

ソース

  • Contextクラスの動きが若干違ってた
    • Context#currentNumberは現在のtoken番号を返すものかと勘違いしていた
    • nextTokenはParseExceptionをthrowしない
    • 例外をthrowするのはskipToken, currentNumberのみ
  • 素直にBNFをJavaに翻訳していく
    • skipTokenを活用する
    • PrimitiveNodeでnextTokenする
  • クラスのコメントにBNFを併記するとわかりやすくなる
  • nextTokenするのをCommandListNodeに持たせていた
    • 各Nodeでどこまで読み取るかを考えながら(P.378の解説)

ポイント

  • BNFをままJavaに翻訳(表現)し小さな言語を実装する

考えたこと

  • これはパターンか?
  • Javaによる「小さな言語」の実例では?

練習問題

  • go, right, leftメソッドをインターフェースで定義し、これを実装する具体的なクラスを作ろう
    • メソッドを実装したjava.awt.Canvasのサブクラスを作成
    • 誰がインターフェースのメソッドをコールすべきか? やっぱりNode?
  • PrimitiveNodeがname(go,right,left)に応じたメソッドを呼ぶようにしてCanvasに描画すればいい(executeメソッド)
    • ならそのexecuteメソッドは誰が呼ぶ? CommandNode?
    • 各Nodeにexecuteは必要になる。ならNodeにexecuteを実装させるInterfaceを作ろう
  • どうやってexecuteにcanvasを教えてあげようか
    • 引数で渡す? コンストラクタに渡す? canvasの存在を知る別のものを渡す?
  • canvas再描画はどうする?
    • 実行履歴を残しておいて再実行する(parse結果に基づいてを再度executeすれば良い)

模範解答のポイント

  • TurtleCanvas
    • Executorの対象であり、かつExecutorのFactoryも担う
    • Interpreter〜Context経由でNodeとやりとりを行う
  • Context
    • NodeにFactoryを伝える環境を持つ
  • InterpreterFacade
    • ContextとProgramNodeの生成
    • 自身もExecutorとしてTurleCanvasの再描画時のCanvas→Nodeの橋渡しを行う
  • どうやってPrimitiveNodeでExecutorを生成するか
    • ContextにcreateExecutorを作成する責任を追加する
    • 実際はContextにFactoryを内包させ委譲している

練習問題の模範解答にもいろいろと試行錯誤の跡が・・・

  • InterpreterFacade#executeはExecuteExceptionをthrowするべきか?
  • InterpreterFacade#parseがboolanを返すようになってるけど?
  • TurtleCanvas#setExecutorって呼ばれないようだ
    • 画面を最小化から復元するとキャンバスが真っ白になる
    • Mainのコンストラクタに以下のコードが必要(InterpreterFacadeはExecutorをimplementsする)
canvas.setExecutor(facade);

作者:czk-htn

更新日:2008年11月19日 21時47分

このブログのホーム

[java] デザインパターン/22. Command

Java言語で学ぶデザインパターン入門

Java言語で学ぶデザインパターン入門

命令をクラスとして表現する。StrutsのActionクラスにあたるもの。

クラス図

今回もなにやら複雑な関係だが落ち着いて読み解いていく。

  • Command, DrawCommand, MacroCommandはCompositeパターン
    • DrawCommandが単一Component (File)
    • MacroCommandはComponentをまとめたもの (Directory)
  • DrawCommandはDrawableを内包している
    • DrawableをCommandの操作対象とするため
  • DrawCanvasがMacroCommandを内包しているのはなぜ???

シーケンス図

  • DrawCommandはMainからもMacroCommandからも実行される?
  • paintが呼ばれるとMacroCommand#executeが実行される?

ソース

  • MouseMotionAdapterやWindowAdapterを使わったほうがコードがすっきりする
    •  P.231の解説と練習問題22-3で取り上げられていた
  • MacroCommandを省いて考えた方がCommandパターンの関係はわかりやすい
    • MacroCommandはDrawCanvasの再描画時(最小化から復元とか)に呼び出される

ポイント

  • 新たに機能を追加する場合はCommandを拡張するのでなくCommandを増やす
    • 練習問題の22-1では色を設定している
  • Commandにどこまで情報を渡すかよくよく検討する

考えたこと

  • DrawCommandにCommandインターフェースを実装させてCompositeにする理由がわからない
  • Servletでリクエストを処理するCommandの場合はRequest,Response,ServletContext,入力フォームの内容・・・いろいろ渡してあげる必要がある

練習問題

  1. ColorCommandクラスを追加してJColorChooserから色を選べるようにした
  2. undoボタンを実装
  3. すでにAdapterを使った書き方をしてた

ついでにundoボタンは描画した点レベルでしかアンドゥができずに不便なので、ドラッグした一連の線を1回のアンドゥで消去するようにMacroCommandをネストさせてみた。mousePressedとmouseReleasedのあたりがポイント。

Main.java
package gof.Command;

import gof.Command.command.ColorCommand;
import gof.Command.command.Command;
import gof.Command.command.DrawCommand;
import gof.Command.command.MacroCommand;
import gof.Command.drawer.DrawCanvas;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Main extends JFrame implements ActionListener {
    private MacroCommand history = new MacroCommand();
    private MacroCommand dragged;
    private DrawCanvas canvas = new DrawCanvas(400, 400, history);
    private JButton colorButton = new JButton("color");
    private JButton undoButton = new JButton("undo");
    private JButton clearButton = new JButton("clear");
    
    public Main(String title) {
        super(title);
        
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        canvas.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                dragged = new MacroCommand();
            }
            @Override
            public void mouseReleased(MouseEvent e) {
                history.append(dragged);
            }
        });
        canvas.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                Command cmd = new DrawCommand(canvas, e.getPoint());
                dragged.append(cmd);
                cmd.execute();
            }
        });
        
        colorButton.addActionListener(this);
        clearButton.addActionListener(this);
        undoButton.addActionListener(this);
        
        Box buttonBox = new Box(BoxLayout.X_AXIS);
        buttonBox.add(colorButton);
        buttonBox.add(undoButton);
        buttonBox.add(clearButton);
        Box mainBox = new Box(BoxLayout.Y_AXIS);
        mainBox.add(buttonBox);
        mainBox.add(canvas);
        add(mainBox);
        
        pack();
    }
    
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == clearButton) {
            history.clear();
            canvas.repaint();
        } else if (e.getSource() == undoButton) {
            history.undo();
            canvas.repaint();
        } else if (e.getSource() == colorButton) {
            Color color = JColorChooser.showDialog(this, "ブラシの色を選択してください", canvas.getColor());
            if (color != null) {
                Command cmd = new ColorCommand(canvas, color);
                history.append(cmd);
                cmd.execute();
            }
        }
    }

    public static void main(String[] args) {
        JFrame main = new Main("Command Pattern Sample");
        main.setVisible(true);
    }
}

作者:czk-htn

更新日:2008年11月3日 22時4分

このブログのホーム

[etc] OpenSolaris(5.11)をVMware Fusionに入れてみた

OpenSolaris縺ョ蜈・謇?からインストールCDのイメージファイル(os200805.iso, 683.7MB)をダウンロード。

VMware仮想マシンを新規作成

種類
OpenSolaris 10 (64bit):
メモリ
560MB:
ディスク
8GB:

Solarisインストール

  1. grubが起動しEnterキーでインストーラが起動する。
  2. 言語を選ぶ 18.Japanese
  3. キーボードレイアウトを選ぶ 7.Japanese
  4. しばらく放っておくとインストール用のデスクトップ画面が起動する
  5. [OpenSolarisをインストールする]アイコンをダブルクリック
  6. [ようこそ] 次へ
  7. [ディスク] ディスク全体を使用するをチェックして次へ

[タイムゾーン] 以下設定して次へ

    1. 地域:アジア
    2. 場所:日本
    3. タイムゾーン:日本
    4. 日付、時刻はそのまま
  1. [ロケール] 日本語を選択して次へ
  2. rootと一般ユーザアカウントを作成する
  3. 最後に確認画面がでるので[インストール]
  4. しばらく放っておく
  5. インストールが完了したら[リブート]

VMware Toolsのインストール

  1. VMwareの[メニュー]-[仮想マシン]-[VMware Toolsのインストール]
  2. マウントしているISOイメージを強制的に解除するか聞かれるのでYES
  3. ファイルブラウザが起動しvmware-solaris-tools.tar.gzが表示される
  4. ファイルを右クリック-[展開]しデスクトップに展開する
  5. デスクトップにvmware-tools-distribというフォルダが作られる
$ cd ~/Desktop/vmware-tools-distrib
$ su - root -c "./vmware-install.pl"
$ su - root -c "/etc/init.d/vmware-tools start"

でこのままだとキーボード配列になってしまうので/etc/X11/xorg.confのキーボード設定を修正する。

- Option "XkbModel" "pc104"
- Option "XkbLayout" "us"
+ Option "XkbModel" "jp106"
+ Option "XkbLayout" "jp"

一度ログアウトしてログインし直せば有効になる。Ctrl+CommandをしなくてもOSXとSolarisの間でマウスが行き来できるようになれば成功。

作者:czk-htn

更新日:2008年11月20日 19時6分

このブログのホーム

[java] デザインパターン/読み終えて・・・

Java言語で学ぶデザインパターン入門

Java言語で学ぶデザインパターン入門

写経について

  • Eclipseなどのコード補完は最低限にとどめるのが良し
    • メソッド名や引数など補完されるとせっかくの覚えるチャンスを逸する
    • vi, emacsでもいいけど環境設定にこだわり始めてしまいそうな罠
  • 細かな点にも注意する
    • public, protectedなどアクセス修飾子
    • 変数名の命名センス
    • 1ブロックのコード量

開発に活かす

  • クラス図とシーケンス図は重要
    • アクセス権を示すマークも
  • Main関数(テストケース)が揃えば8割方仕様は決まる
    • 引数などは
  • この3点をセットで与えればプログラマは仕事を始められる

作者:czk-htn

更新日:2008年11月20日 6時47分

このブログのホーム

[java] J2EEパターン/第3章 3.1 プレゼンテーション層における設計上の考慮すべき事項

isbn:48974714345

セッション管理

リクエスト毎のパフォーマンスや柔軟性、データサイズの制限、セキュリティなどを考慮。

  • hidden
  • cookie
  • サーバ上
    • インメモリ
    • EJB
    • RDB

クライアントアクセスの制御

特定ユーザからのみリクエストを受け付けるようアクセスを制御する。

  • アクセスを制御する方法
    • カスタムタグを用いる
    • 設定によって保護する
    • 内部呼び出しによってしかアクセスできないようにする
  • 保護する対象
    • ビュー全体を保護
    • ビューの一部を保護
  • 設定によって保護する
    • web.xmlの<security-constraint>
    • /WEB-INFの下
  • フォーム送信の重複
    • 「戻る」/ 「更新」
    • トークンによるリクエストの有効性チェック
    • ページ遷移を保証(ブックマークによる直接アクセスを防ぐ)

バリデーション

作者:czk-htn

更新日:2008年11月20日 6時47分

このブログのホーム

[java] デザインパターン/23. Interpreter

Java言語で学ぶデザインパターン入門

Java言語で学ぶデザインパターン入門

オレ言語実装。DSLってやつ?

BNF

今回は構文解析ってことでBNF(Bukus Normal Form)についてP.363〜P.365までの2ページに渡って説明。ここはソフトウェア開発技術者試験で学んでいるところなので軽く読みすすめる。

クラス図

パッと見た目はCompositeパターン。

Contextクラスで構文の単語をたどり、それらをNodeクラス以下による構文木の葉としてあらわす。

ソース

  • Contextクラスの動きが若干違ってた
    • Context#currentNumberは現在のtoken番号を返すものかと勘違いしていた
    • nextTokenはParseExceptionをthrowしない
    • 例外をthrowするのはskipToken, currentNumberのみ
  • 素直にBNFをJavaに翻訳していく
    • skipTokenを活用する
    • PrimitiveNodeでnextTokenする
  • クラスのコメントにBNFを併記するとわかりやすくなる
  • nextTokenするのをCommandListNodeに持たせていた
    • 各Nodeでどこまで読み取るかを考えながら(P.378の解説)

ポイント

  • BNFをままJavaに翻訳(表現)し小さな言語を実装する

考えたこと

  • これはパターンか?
  • Javaによる「小さな言語」の実例では?

練習問題

  • go, right, leftメソッドをインターフェースで定義し、これを実装する具体的なクラスを作ろう
    • メソッドを実装したjava.awt.Canvasのサブクラスを作成
    • 誰がインターフェースのメソッドをコールすべきか? やっぱりNode?
  • PrimitiveNodeがname(go,right,left)に応じたメソッドを呼ぶようにしてCanvasに描画すればいい(executeメソッド)
    • ならそのexecuteメソッドは誰が呼ぶ? CommandNode?
    • 各Nodeにexecuteは必要になる。ならNodeにexecuteを実装させるInterfaceを作ろう
  • どうやってexecuteにcanvasを教えてあげようか
    • 引数で渡す? コンストラクタに渡す? canvasの存在を知る別のものを渡す?
  • canvas再描画はどうする?
    • 実行履歴を残しておいて再実行する(parse結果に基づいてを再度executeすれば良い)

模範解答のポイント

  • TurtleCanvas
    • Executorの対象であり、かつExecutorのFactoryも担う
    • Interpreter〜Context経由でNodeとやりとりを行う
  • Context
    • NodeにFactoryを伝える環境を持つ
  • InterpreterFacade
    • ContextとProgramNodeの生成
    • 自身もExecutorとしてTurleCanvasの再描画時のCanvas→Nodeの橋渡しを行う
  • どうやってPrimitiveNodeでExecutorを生成するか
    • ContextにcreateExecutorを作成する責任を追加する
    • 実際はContextにFactoryを内包させ委譲している

練習問題の模範解答にもいろいろと試行錯誤の跡が・・・

  • InterpreterFacade#executeはExecuteExceptionをthrowするべきか?
  • InterpreterFacade#parseがboolanを返すようになってるけど?
  • TurtleCanvas#setExecutorって呼ばれないようだ
    • 画面を最小化から復元するとキャンバスが真っ白になる
    • Mainのコンストラクタに以下のコードが必要(InterpreterFacadeはExecutorをimplementsする)
canvas.setExecutor(facade);

作者:czk-htn

更新日:2008年11月20日 6時47分

このブログのホーム

[java] デザインパターン/22. Command

Java言語で学ぶデザインパターン入門

Java言語で学ぶデザインパターン入門

命令をクラスとして表現する。StrutsのActionクラスにあたるもの。

クラス図

今回もなにやら複雑な関係だが落ち着いて読み解いていく。

  • Command, DrawCommand, MacroCommandはCompositeパターン
    • DrawCommandが単一Component (File)
    • MacroCommandはComponentをまとめたもの (Directory)
  • DrawCommandはDrawableを内包している
    • DrawableをCommandの操作対象とするため
  • DrawCanvasがMacroCommandを内包しているのはなぜ???

シーケンス図

  • DrawCommandはMainからもMacroCommandからも実行される?
  • paintが呼ばれるとMacroCommand#executeが実行される?

ソース

  • MouseMotionAdapterやWindowAdapterを使わったほうがコードがすっきりする
    •  P.231の解説と練習問題22-3で取り上げられていた
  • MacroCommandを省いて考えた方がCommandパターンの関係はわかりやすい
    • MacroCommandはDrawCanvasの再描画時(最小化から復元とか)に呼び出される

ポイント

  • 新たに機能を追加する場合はCommandを拡張するのでなくCommandを増やす
    • 練習問題の22-1では色を設定している
  • Commandにどこまで情報を渡すかよくよく検討する

考えたこと

  • DrawCommandにCommandインターフェースを実装させてCompositeにする理由がわからない
  • Servletでリクエストを処理するCommandの場合はRequest,Response,ServletContext,入力フォームの内容・・・いろいろ渡してあげる必要がある

練習問題

  1. ColorCommandクラスを追加してJColorChooserから色を選べるようにした
  2. undoボタンを実装
  3. すでにAdapterを使った書き方をしてた

ついでにundoボタンは描画した点レベルでしかアンドゥができずに不便なので、ドラッグした一連の線を1回のアンドゥで消去するようにMacroCommandをネストさせてみた。mousePressedとmouseReleasedのあたりがポイント。

Main.java
package gof.Command;

import gof.Command.command.ColorCommand;
import gof.Command.command.Command;
import gof.Command.command.DrawCommand;
import gof.Command.command.MacroCommand;
import gof.Command.drawer.DrawCanvas;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Main extends JFrame implements ActionListener {
    private MacroCommand history = new MacroCommand();
    private MacroCommand dragged;
    private DrawCanvas canvas = new DrawCanvas(400, 400, history);
    private JButton colorButton = new JButton("color");
    private JButton undoButton = new JButton("undo");
    private JButton clearButton = new JButton("clear");
    
    public Main(String title) {
        super(title);
        
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        canvas.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                dragged = new MacroCommand();
            }
            @Override
            public void mouseReleased(MouseEvent e) {
                history.append(dragged);
            }
        });
        canvas.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                Command cmd = new DrawCommand(canvas, e.getPoint());
                dragged.append(cmd);
                cmd.execute();
            }
        });
        
        colorButton.addActionListener(this);
        clearButton.addActionListener(this);
        undoButton.addActionListener(this);
        
        Box buttonBox = new Box(BoxLayout.X_AXIS);
        buttonBox.add(colorButton);
        buttonBox.add(undoButton);
        buttonBox.add(clearButton);
        Box mainBox = new Box(BoxLayout.Y_AXIS);
        mainBox.add(buttonBox);
        mainBox.add(canvas);
        add(mainBox);
        
        pack();
    }
    
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == clearButton) {
            history.clear();
            canvas.repaint();
        } else if (e.getSource() == undoButton) {
            history.undo();
            canvas.repaint();
        } else if (e.getSource() == colorButton) {
            Color color = JColorChooser.showDialog(this, "ブラシの色を選択してください", canvas.getColor());
            if (color != null) {
                Command cmd = new ColorCommand(canvas, color);
                history.append(cmd);
                cmd.execute();
            }
        }
    }

    public static void main(String[] args) {
        JFrame main = new Main("Command Pattern Sample");
        main.setVisible(true);
    }
}

作者:czk-htn

更新日:2008年11月4日 7時4分

このブログのホーム