2014年8月20日水曜日

googleで期間を指定して検索するブックマークレットを書いてみた

説明抜きでブックマークレットはこれ


以下の内容でブックマーク(ブックマークレット)を登録する。

javascript:(function%20()%20{var%20cd_max,cd_min,tbs,n;if%20(!isGoogle())%20{alert('google%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93');return%20;}n=window.prompt('%E4%BD%95%E6%97%A5%E4%BB%A5%E5%86%85%E3%81%AE%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%82%92%E8%A1%A8%E7%A4%BA%EF%BC%9F',%2090);if%20(!isNum(n))%20{n=90;alert("%E6%97%A5%E6%95%B0%E3%81%AF%E5%8D%8A%E8%A7%92%E6%95%B0%E5%AD%97%E3%81%A7%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6%E4%B8%8B%E3%81%95%E3%81%84%E3%80%82\n"+n+"%E6%97%A5%E4%BB%A5%E5%86%85%E3%81%AE%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99");}cd_max=day_ago(0);cd_min=day_ago(n);tbs='cdr%3A1%2Ccd_min%3A'+cd_min+'%2Ccd_max%3A'+cd_max;location.href=cut_tbs()+'&tbs='+tbs;function%20day_ago(day)%20{var%20date=new%20Date();var%20target_date=new%20Date(date.getTime()%20-%20day*24*60*60*1000);return%20target_date.getFullYear()+'%2F'+(target_date.getMonth()+1)+'%2F'+target_date.getDate();}function%20cut_tbs()%20{var%20tmp=location.href.replace(/(&|\?)tbs=[^&]*/g,%20'$1');tmp=tmp.replace(/&+/g,%20'&');tmp=tmp.replace(/\?&/,%20'\?');tmp=tmp.replace(/&$/,%20'');return%20tmp;}function%20isNum(x)%20{return%20(!isNaN(x)%20&&%20x%20!='');}function%20isGoogle()%20{return%20(['www.google.co.jp','www.google.com'].indexOf(document.domain)%20!=%20-1);}})%20();
googleで検索を実行し、検索結果を表示してる状態でブックマーク(ブックマークレット)を実行する。
Firefox 31で動作確認済。
IEでもgoogle chromeでも動くはず。

説明っぽいこと


google検索の「検索ツール」から検索期間を指定できる。
「1時間以内」「24時間以内」「1週間以内」「1ヶ月以内」「1年以内」から選択するか、「期間を指定」で開始日・終了日を指定する。
もう少し簡単に任意の期間を日数で検索できるようにしたくてブックマークレットを書いてみました。

期間指定した時の正しい処理が分からないので、かなり適当に作成。
googleの検索結果のページでブックマークレットを実行すると、期間指定された検索結果を表示する。
デフォルトは90日以内を表示(n=90)。
検索開始日は「今日」から n 日前 の形で指定する。
検索終了日は「今日」固定。
QueryStringの「tbs=~」を削除して、「tbs=cdr:1,cd_min:<検索開始日>,cd_max:<検索終了日>」を追加している。

改行・インデントをつけて書くとこんな感じ。

(function () {
  var cd_max,cd_min,tbs,n;
  if (!isGoogle()) {
    alert('googleではありません');
    return ;
  }
  n = window.prompt('何日以内の検索結果を表示?', 90);
  if (!isNum(n)) {
    n = 90;
    alert("日数は半角数字で入力して下さい。\n" + n + "日以内の検索結果を表示します");
  }
  cd_max = day_ago(0);
  cd_min = day_ago(n);
  tbs = 'cdr%3A1%2Ccd_min%3A' + cd_min + '%2Ccd_max%3A' + cd_max;
  location.href = cut_tbs() + '&tbs=' + tbs;
  function day_ago(day) {
    var date = new Date();
    var target_date = new Date(date.getTime() - day*24*60*60*1000);
    return target_date.getFullYear() + '%2F' + (target_date.getMonth() + 1) + '%2F' + target_date.getDate();
  }
  function cut_tbs() {
    //SAMPLE URL: https://www.google.com/search?tbs=lr%3Alang_ja%2Ccdr%3A1&tbm=#lr=lang_ja&q=abcd&tbs=cd_min%3A2013%2F7%2F26%2Ccd_max%3A2014%2F8%2F20&source=lnt&tbs=cdr:1
    var tmp = location.href.replace(/(&|\?)tbs=[^&]*/g, '$1');
    tmp = tmp.replace(/&+/g, '&');
    tmp = tmp.replace(/\?&/, '\?');
    tmp = tmp.replace(/&$/, '');
    return tmp;
  }
  function isNum(x) {
    return (!isNaN(x) && x != '');
  }
  function isGoogle() {
    return (['www.google.co.jp','www.google.com'].indexOf(document.domain) != - 1);
  }
}) ();

2014年8月15日金曜日

Greoasemonkey のスクリプトが Firefox Sync で 同期できないので調べてみた

Firefox 31.0 + Greoasemonkey 2.1 を使用。

成功ログを記録できるようにする

まず、Firefox Sync のログを見えるようにする。
ロケーションバーに「about:sync-log」と入力すると、Firefox Sync のログファイルの一覧が表示される。
実体は「<Firefoxプロファイルフォルダ>\weave\logs\」である。

しかし、デフォルトではエラーログ (error-NNNNNNNNNNNNN.txt) しか記録されないので、成功ログ (success-NNNNNNNNNNNNN.txt) も記録できるように変更する。
そのために、「about:config」から「services.sync.log.appender.file.logOnSuccess」を「true」に変更する。

Greasemonkey スクリプトを同期してみる

同期元PCで


同期元PCのFirefoxで、Greasemonkeyのスクリプトを追加して、同期を実行する。
以下の成功ログが記録された(一部分を抽出、一部伏せ字)。

1408071534272 Sync.Engine.Greasemonkey DEBUG First sync, uploading all items
1408071534273 Sync.Engine.Greasemonkey INFO 1 outgoing items pre-reconciliation
1408071534471 Sync.Collection DEBUG mesg: GET success 200 https://sync-57-us-west-2.sync.services.mozilla.com/1.5/ZZZZZZZZ/storage/greasemonkey?full=1
1408071534471 Sync.Collection DEBUG GET success 200 https://sync-57-us-west-2.sync.services.mozilla.com/1.5/ZZZZZZZZ/storage/greasemonkey?full=1
1408071534472 Sync.Engine.Greasemonkey INFO Records: 3 applied, 3 successfully, 0 failed to apply, 0 newly failed to apply, 3 reconciled.

同期先PCで


次に、同期先PCのFirefoxで同期を実行する。
こちらの Firefox でも成功ログを記録するようにしてある。
なお、同期する前に「services.sync.greasemonkey.lastSync」と「services.sync.greasemonkey.lastSyncLocal」の値をリセットしてから同期を行った。

以下の成功ログが記録された(一部分を抽出、一部伏せ字)。

1408071582269 Sync.Engine.Greasemonkey DEBUG First sync, uploading all items
1408071582269 Sync.Engine.Greasemonkey INFO 0 outgoing items pre-reconciliation
1408071582526 Sync.Collection DEBUG mesg: GET success 200 https://sync-57-us-west-2.sync.services.mozilla.com/1.5/ZZZZZZZZ/storage/greasemonkey?full=1
1408071582526 Sync.Collection DEBUG GET success 200 https://sync-57-us-west-2.sync.services.mozilla.com/1.5/ZZZZZZZZ/storage/greasemonkey?full=1
1408071582526 Sync.Engine.Greasemonkey INFO Records: 6 applied, 6 successfully, 0 failed to apply, 0 newly failed to apply, 0 reconciled.
スクリプトの同期が成功してるようなログが出ているが、「<Firefoxプロファイルフォルダ>\gm_scripts\」を確認しても実際は同期されていなかった。

Syncサーバーには保存できてるが、同期先PCに同期する時に失敗してる感じだろうか?


同期先PCでProcess Monitorを使ってモニターしてみた




まず「%TEMP%\gm-temp-1\*.user.js」に同期してから、そのファイルを「<Firefoxプロファイルフォルダ>\gm_scripts\*\*.user.js」にコピーしようとしてるように見える。

しかし、よく見るとコピー先のディレクトリに、同期PCのプロファイルフォルダ名が使用されていた。

つまり、同期PCの<Firefoxプロファイルフォルダ>部分が「XXXXXXXX.default」、
同期PCの<Firefoxプロファイルフォルダ>部分が「YYYYYYYY.default」だった場合、
同期PCの「XXXXXXXX.default」以下に同期しようとしてるっぽい。

それで、そんなパスがないので「PATH NOT FOUND」が出てるのではないかと。

そこで同期先PCに「XXXXXXXX.default\gm_scripts\FirefoxSyncTest\」を作成して、もう一度、同期してみた。



今度は、「NAME NOT FOUND」になり、やっぱり同期できなかった。
問題は「<Firefoxプロファイルフォルダ>が同期元のそれになっているから」だけではないみたい。


それとも、スクリプトの同期できないのは私だけで、他の人はちゃんと同期ができているんだろうか?





ついでに、、、
同期のインターバルは、services.sync.syncInterval でミリ秒で指定できるっぽい。
デフォルトは90000ぽい。

2014年8月13日水曜日

Sysinternals の Sysmon


System Monitor (Sysmon)Windows Sysinternals の新しいツール。
サービスとして動作して、プロセスの生成、ネットワーク接続、ファイル作成時間の変更などの詳細情報を、イベントログに記録してくれる。

Vista 以前では、「イベントビューアー」の「システムイベントログ」に記録される。
Vista 以降では、「イベントビューアー」の「アプリケーションとサービスログ」>「Microsoft」>「Windows」>「Sysmon」>「Operational」に記録される。

ログは量が多いので、後で解析する方法が重要になりそう。
サービスだけ起動しておいて、攻撃されて問題発覚したら分析する感じかな。あるいは定期的に分析?ツールでほぼリアルタイムに?

「Operational」のイベントログは、デフォルトで最大ログサイズが 65536 (KB)、「必要に応じてイベントを上書きする(最も古いイベントから)」だから、そのままではすぐにログは上書きされそう。


インストール


「管理者として実行」でコマンドプロンプトを起動する。

C:\windows\system32> cd \hoge\Sysmon
C:\hoge\Sysmon>

ヘルプを表示

C:\hoge\Sysmon> Sysmon.exe

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Usage:
Install:    Sysmon.exe -i [-h [sha1|md5|sha256]] [-n]
Configure:  Sysmon.exe -c [[-h [sha1|md5|sha256]] [-n]|--]
Uninstall:  Sysmon.exe -u
  -c   Update configuration of an installed Sysmon driver or dump the
       current configuration if no other argument is provided.
  -h   Specify the hash algorithm used for image identification (default
       is SHA1).
  -i   Install service and driver.
  -m   Install the event manifest (done on service install as well).
  -n   Log network connections.
  -u   Uninstall service and driver.

The service logs events immediately and the driver installs as a boot-start
driver to capture activity from early in the boot that the service will
write to the event log when it starts.

On Vista and higher, events are stored in
 "Applications and Services Logs/Microsoft/Windows/Sysmon/Operational"
On older systems events write to the System event log.

Specify -accepteula to automatically accept the EULA on installation, otherwise
you will be interactively prompted to accept it.
Neither install nor uninstall require a reboot.

デフォルトの設定でインストール(サービスに登録)してみる。
デフォルトの設定は、プロセスイメージをSHA1でハッシュ、ネットワークをモニタリングをしない。

C:\hoge\Sysmon>Sysmon.exe -i

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Sysmon installed.
SysmonDrv installed.
Starting SysmonDrv.
SysmonDrv started.
Starting Sysmon.
Sysmon started.

サービスに Symon (System Monitor service) が登録され、サービスが開始される。
次回からはPC起動時に自動的に開始する。
カーネルモードのマルウェアのアクティビティをキャプチャするため、ブートプロセスの初期からイベントログは生成されるらしい。

ネットワーク接続もモニタリングするようにインストールするには、以下の様にする。

C:\hoge\Sysmon>Sysmon.exe -i -n

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Sysmon installed.
SysmonDrv installed.
Starting SysmonDrv.
SysmonDrv started.
Starting Sysmon.
Sysmon started.

インストール後に、ネットワーク接続もモニタリングするように設定を変更する。

C:\hoge\Sysmon>Sysmon.exe -c -n

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Configuration updated.

現在の設定を確認する

C:\hoge\Sysmon>Sysmon.exe -c

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Current configuration:
 - Service name:                  Sysmon
 - Driver name:                   SysmonDrv
 - HashingAlgorithm:              SHA1
 - Network connection:            enabled

デフォルトの設定に戻すには、以下の様にする

C:\hoge\Sysmon>Sysmon.exe -c --

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Updating configuration to use all defaults.
Configuration updated.

もう一度、設定を確認すると、デフォルトの設定に戻っている

C:\hoge\Sysmon>Sysmon.exe -c

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Current configuration:
 - Service name:                  Sysmon
 - Driver name:                   SysmonDrv
 - HashingAlgorithm:              SHA1
 - Network connection:            disabled

最後に、アンインストール(サービスから削除)する方法

C:\hoge\Sysmon>Sysmon.exe -u

Sysinternals Sysmon v1.0 - System activity monitor
Copyright (C) 2014 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Stopping Sysmon:
Sysmon stopped.
Sysmon removed.
Stopping SysmonDrv:
SysmonDrv stopped.
SysmonDrv removed.


イベントログの内容

イベントID「1」 (Process Create)


プロセスが生成されたとき。



イベントID「2」 (File creation time changed)


ファイル作成時間が変更されたとき



イベントID「3」 (Network connection detected)


ネットワーク接続されたとき





2014年8月9日土曜日

Vimで方向キーを押すとABCDが出てうまく動かない問題

Cygwin 1.7 + CygTerm + Tera Term な環境で。

vim の挿入モード(インサートモード)で矢印キーを押すと、A(↑),B(↓),C(→),D(←) が入力されてしまう。
よくキーマップを変更する方法が紹介されているけど、色々問題もあるみたいなので、今回はその方法はなし。
今回は「Vimリファレンスマニュアル (ヘルプ) による方法」と「vi 互換モードをやめる方法」を紹介。

Vimリファレンスマニュアル (ヘルプ) による方法


Vimの中で「:help vt100-cursor-keys」や「:help xterm-cursor-keys」を実行すると、解決策が紹介されている。
同じ内容が こちら (日本語) でも見られる。


vt100 や xterm などの端末ではカーソルキーを押すと <Esc>OA や <Esc>OB などが送られます。不運なことに、これらは「挿入を終了し、上に新規行を作成して 'A' や 'B' を挿入する」という挿入モードでのコマンドでもあります。
このコマンドを実行するのでなく、カーソルキーのシーケンスが入力されたのだと誤認識してしまうかもしれません。これを防ぎ、意図通りの動作をさせるには次の設定を使います
:
        :set notimeout          " マッピングについてタイムアウトしない
        :set ttimeout           " 端末のキーコードについてタイムアウトする
        :set timeoutlen=100     " 100 ミリ秒後にタイムアウトする
この設定をすると、キーコードが 100 ミリ秒以内に送られた場合のみカーソルキーと認識されます。ユーザーが普通に入力するときはそんなに速くないので、たとえまったく同じキーコードのシーケンスを送信しても、個々のコマンドと認識されます。
Vim documentation: term


上記を Vim 中で実行するか、~/.vimrc に以下の様に記述すればいい。

if !has('gui_running')
    set notimeout
    set ttimeout
    set timeoutlen=100
endif

vi 互換モードをやめる方法


Vimの中で「:help 'nocompatible'」を実行すると、vi 互換モードについての説明が表示できる
同じ内容がこちら (日本語) でも見られる

VimをなるべくVi互換にするか、便利な機能を使えるようにするかを決定する。これは、特別な種類のオプションである。このオプションの値が変更されると、それに伴って他のオプションも変更されるからだ。

(略)

このオプションをファイル vimrc 内で設定するなら、一番先頭に置くこと。

(略)

オフに設定すると、「Viの既定値」と「Vimの既定値」が異なっているオプションについて、Vimの既定値が用いられるようになる。下の表で '+' がついているものを参照。その他のオプションは影響を受けない。
オンにすると、他のオプションがいくつか変更され、Vimはできる限りVi互換を保とうとする。下の表を参照。これはVi互換の編集方法に戻りたいと思うときに使うことができる。

(表は省略)
Vim documentation: options

.vimrc の先頭に以下を追加すればいい

" Vim 互換モードを使用しない
" このオプションは .vimrc の先頭に記述すること
set nocompatible

ちなみに・・・


Cygwinで、vi は vim をリンクしてるのかと思ったら、別物?
$ ls -l /usr/bin/vi*
-rwxr-xr-x 1 ike None 828K 6月  23 04:31 /usr/bin/vi.exe*
lrwxrwxrwx 1 ike None    7 8月   2 19:42 /usr/bin/view -> vim.exe*
-rwxr-xr-x 1 ike None 2.1M 6月  23 04:31 /usr/bin/vim.exe*
lrwxrwxrwx 1 ike None    7 8月   2 19:42 /usr/bin/vimdiff -> vim.exe*
-rwxr-xr-x 1 ike None 2.1K 6月  23 04:31 /usr/bin/vimtutor*
でも、vi を実行しても、vim を実行しても、Vimのトップ画面が表示される。vi で実行すると Vim が Vi 互換モードで起動するんだろうか?? 一応、.bashrc で alias を設定しておいた
alias vi='vim'

2014年8月8日金曜日

Tera Term を起動した時と、Cygterm + Tera Term を起動した時で、背景や文字色を変更する

それぞれの場合で、読み込む TERATERM.INI を切り替えればいい。

Tera Term を起動する時


デフォルトで TERATERM.INI が読み込まれる。

Cyglaunch から Cygterm + Tera Term を起動する時


Tera Term を起動し、Cygterm + Tera Term の時に使用したい設定に変更する。
「setup」メニューから「Save Setup...」して「TERATERM4Cygterm.INI」として保存する。
次に、[Tera Term] セクションの TCPPort と [TTSSH] セクションの Enabled を以下の様に変更する

[Tera Term]
;    TCP/IP parameters
;      TCP port#
TCPPort=20000

[TTSSH]
; SSH enabled flag (1=enabled 0=disabled)
Enabled=0

Cygterm + Tera Term を起動した時は TERATERM4Cygterm.INI を読み込むように cyglaunch のショートカットのリンク先を以下のように変更する

"C:\Program Files (x86)\teraterm\cyglaunch.exe" -o "/F=TERATERM4Cygterm.INI"


2014年8月7日木曜日

Cygwin で SSHd をインストールする

Windows 7 + Cygwin 1.7.31 + openssh 6.6.1p1-3 の環境で、SSHd サービスを設定する。

ホスト名 SSH_SERVER (192.168.100.10) に SSHd をインストールし、ホスト名 SSH_CLIENT から接続する。
鍵ペアは SSH2 の ECDSA と ED25519 の2種類でログイン出来るようにする。

SSHサーバー側の設定


必要なパッケージをインストールする。

$ apt-cyg install cygrunsrv openssh

管理者権限で起動した Cygwin ターミナルから ssh-host-config を実行する。
ちなみに、この「ssh-host-config」スクリプト内で実行される「csih_*」は、「/usr/share/csih/cygwin-service-installation-helper.sh」内に記述されている。エラーが出たら、この辺を含めて読んでいくと良さそう。
また、-d オプションを付けて実行するとデバッグモードで動作する。

Cygwinターミナルを「管理者として実行」して起動する。
sshd サービスは、特権アカウント cyg_server で実行するように設定される。

$ ssh-host-config

ssh-keygen: generating new host keys: RSA1 RSA DSA ECDSA ED25519
*** Info: Creating default /etc/ssh_config file
*** Info: Creating default /etc/sshd_config file
*** Info: Privilege separation is set to yes by default since OpenSSH 3.3.
*** Info: However, this requires a non-privileged account called 'sshd'.
*** Info: For more info on privilege separation read /usr/share/doc/openssh/README.privsep.
*** Query: Should privilege separation be used? (yes/no)  yes              #← 「privilege separation」を使用する
*** Info: Note that creating a new user requires that the current account have
*** Info: Administrator privileges.  Should this script attempt to create a
*** Query: new local account 'sshd'? (yes/no) yes                          #← non-privileged のsshdという新しいローカルアカウントを作成する
*** Info: Updating /etc/sshd_config file

*** Query: Do you want to install sshd as a service?
*** Query: (Say "no" if it is already installed as a service) (yes/no) yes #← サービスとしてsshdをインストールする
*** Query: Enter the value of CYGWIN for the daemon: []                    #← 詳細不明。昔使っていた binmode ntsec tty は今は Obsolete されている
*** Info: On Windows Server 2003, Windows Vista, and above, the
*** Info: SYSTEM account cannot setuid to other users -- a capability
*** Info: sshd requires.  You need to have or to create a privileged
*** Info: account.  This script will help you do so.

*** Info: You appear to be running Windows XP 64bit, Windows 2003 Server,
*** Info: or later.  On these systems, it's not possible to use the LocalSystem
*** Info: account for services that can change the user id without an
*** Info: explicit password (such as passwordless logins [e.g. public key
*** Info: authentication] via sshd).

*** Info: If you want to enable that functionality, it's required to create
*** Info: a new account with special privileges (unless a similar account
*** Info: already exists). This account is then used to run these special
*** Info: servers.

*** Info: Note that creating a new user requires that the current account
*** Info: have Administrator privileges itself.

*** Info: No privileged account could be found.

*** Info: This script plans to use 'cyg_server'.
*** Info: 'cyg_server' will only be used by registered services.
*** Query: Do you want to use a different name? (yes/no) no                #← SYSTEM アカウントは他のユーザへ setuid できないので(また、その他の理由で)、特権アカウントを作る必要がある。
*** Query: Create new privileged user account 'cyg_server'? (yes/no) yes   #← 新しい特権ユーザ'cyg_server'を作成する
*** Info: Please enter a password for new user cyg_server.  Please be sure
*** Info: that this password matches the password rules given on your system.
*** Info: Entering no password will exit the configuration.
*** Query: Please enter the password: ********                             #← cyg_server のパスワードを設定
*** Query: Reenter: ********                                               #← cyg_server のパスワードを再入力

*** Info: User 'cyg_server' has been created with password '********'.
*** Info: If you change the password, please remember also to change the
*** Info: password for the installed services which use (or will soon use)
*** Info: the 'cyg_server' account.

*** Info: Also keep in mind that the user 'cyg_server' needs read permissions
*** Info: on all users' relevant files for the services running as 'cyg_server'.
*** Info: In particular, for the sshd server all users' .ssh/authorized_keys
*** Info: files must have appropriate permissions to allow public key
*** Info: authentication. (Re-)running ssh-user-config for each user will set
*** Info: these permissions correctly. [Similar restrictions apply, for
*** Info: instance, for .rhosts files if the rshd server is running, etc].

*** Info: The sshd service has been installed under the 'cyg_server'
*** Info: account.  To start the service now, call `net start sshd' or
*** Info: `cygrunsrv -S sshd'.  Otherwise, it will start automatically
*** Info: after the next reboot.

*** Info: Host configuration finished. Have fun!

ちなみに、Cygwinターミナルを「管理者として実行」しないと以下の警告を受ける

$ ssh-host-config

*** Warning: Running this script typically requires administrator privileges!
*** Warning: However, it seems your account does not have these privileges.
*** Warning: Here's the list of groups in your user token:

    None
    Users

*** Warning: This usually means you're running this script from a non-admin
*** Warning: desktop session, or in a non-elevated shell under UAC control.

*** Warning: Make sure you have the appropriate privileges right now,
*** Warning: otherwise parts of this script will probably fail!

*** Query: Are you sure you want to continue?  (Say "no" if you're not sure
*** Query: you have the required privileges) (yes/no) no    #← 実行しない

*** Info: Ok.  Exiting.  Make sure to switch to an administrative account
*** Info: or to start this script from an elevated shell.
スクリプトで作成されたユーザを確認する。
「sshd」「cyg_server」が作られている。

C:\>net user

\\SSH_SERVER のユーザー アカウント

-------------------------------------------------------------------------
Administrator            cyg_server               Guest
hogeuser                      sshd
コマンドは正常に終了しました。
sshd サービスの登録状態を確認する。

$ cygrunsrv --verbose -Q sshd
Service             : sshd
Display name        : CYGWIN sshd
Current State       : Stopped
Command             : /usr/sbin/sshd -D
stdin path          : /dev/null
stdout path         : /var/log/sshd.log
stderr path         : /var/log/sshd.log
Process Type        : Own Process
Startup             : Automatic
Dependencies        : tcpip
Account             : .\cyg_server

sshdの設定ファイル (/etc/sshd_config) を編集

$ ls -l /etc/sshd_config
-rw-r--r-- 1 cyg_server root 3.6K 8月   7 09:21 /etc/sshd_config

$ grep -v "^#" /etc/sshd_config | grep -v "^$"
Port 22
Protocol 2                                      # SSH1 は使用せず、SSH2に固定
HostKey /etc/ssh_host_ecdsa_key                 # ECDSA と
HostKey /etc/ssh_host_ed25519_key               # ED25519 のみ受け付ける
PermitRootLogin no                              # rootのログインを許可しない
StrictModes no
AuthorizedKeysFile      .ssh/authorized_keys2   # SSH2 用
PasswordAuthentication no                       # パスワード認証を使わない
ChallengeResponseAuthentication no
UsePrivilegeSeparation sandbox                  # Default for new installations.
Subsystem       sftp    /usr/sbin/sftp-server
AllowUsers  hogeuser                            # 許可するユーザー
DenyUsers   Administrator cyg_server Guest sshd # 許可しないユーザー

sshd サービスを起動する

C:\> net start sshd
    または
$ cygrunsrv -S sshd
    または
「サービス」から「起動」
    または
Windows起動時に自動起動

管理者権限で起動したコマンドプロンプトからサービスを起動/停止してみる

C:\> net start "CYGWIN sshd"
CYGWIN sshd サービスを開始します.
CYGWIN sshd サービスは正常に開始されました。

C:\> net stop "CYGWIN sshd"
CYGWIN sshd サービスを停止中です.
CYGWIN sshd サービスは正常に停止されました。


SSHクライアント側の設定


必要なパッケージをインストールする。

$ apt-cyg install openssh

クライアントの鍵ペアを作成する (一般ユーザのCygwin ターミナルで)

ssh-user-config スクリプトで作成してみる

$ ssh-user-config
*** Query: Shall I create a SSH2 RSA identity file for you? (yes/no) no  #← SSH2 RSA鍵を作らない
*** Query: Shall I create a SSH2 DSA identity file for you? (yes/no) yes #← SSH2 DSA鍵を作る
*** Info: Generating /home/hogeuser/.ssh/id_dsa
Enter passphrase (empty for no passphrase): ********                     #← SSH2 DSA鍵のパスフレーズを設定
Enter same passphrase again: ********                                    #← SSH2 DSA鍵のパスフレーズを再入力
*** Query: Do you want to use this identity to login to this machine? (yes/no) no    #← 手動で登録するので authorized_keys に登録しなかった
*** Query: Shall I create a SSH2 ECDSA identity file for you? (yes/no) yes           #← SSH2 ECDSA鍵を作る
*** Info: Generating /home/hogeuser/.ssh/id_ecdsa
Enter passphrase (empty for no passphrase): ********                     #← SSH2 ECDSA鍵パスフレーズを設定
Enter same passphrase again: ********                                    #← SSH2 ECDSA鍵パスフレーズを再入力
*** Query: Do you want to use this identity to login to this machine? (yes/no) no    #← 手動で登録するので authorized_keys に登録しなかった
*** Query: Shall I create a (deprecated) SSH1 RSA identity file for you? (yes/no) no #← SSH1 RSA鍵を作らない

*** Info: Configuration finished. Have fun!

ssh-keygen コマンドで作成してみる (ssh-user-config スクリプトを使わずに)

# SSH2 ED25519鍵を作る
#     -t : 作成する鍵のタイプ (RSA1 RSA DSA ECDSA ED25519 など)
#     -C : コメント
$ ssh-keygen -t ED25519 -C hogeuser@ssh_server-20140807
Generating public/private ED25519 key pair.
Enter file in which to save the key (/home/hogeuser/.ssh/id_ed25519)   #← エンター
Enter passphrase (empty for no passphrase): ********              #← パスフレーズ設定
Enter same passphrase again: ********                             #← パスフレーズ再入力
Your identification has been saved in /home/hogeuser/.ssh/id_ed25519.
Your public key has been saved in /home/hogeuser/.ssh/id_ed25519.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX hogeuser@ssh_server-20140807
The key's randomart image is:
+--[ED25519  256--+
|   .   .E     o  |
|+   .  .+   .  . |
|    + o  . oo =  |
|     + o+ . .  o |
|    ..S   . o .  |
|   .     ==      |
|.       +        |
|                 |
|                 |
+-----------------+

$ cat ~/.ssh/id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABDtGYMLK/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
jri73Gp8d3ZH88rA==
-----END OPENSSH PRIVATE KEY-----

$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX9cV67GyM hogeuser@ssh_server-20140807

作成されたファイルを確認する。

$ ls -l ~/.ssh
-rw------- 1 hogeuser None 751 8月   7 09:50 id_dsa -rw-r--r-- 1 hogeuser None 599 8月   7 09:50 id_dsa.pub -rw------- 1 hogeuser None 314 8月   7 09:51 id_ecdsa -rw-r--r-- 1 hogeuser None 171 8月   7 09:51 id_ecdsa.pub -rw------- 1 hogeuser None 464 8月   7 10:02 id_ed25519 -rw-r--r-- 1 hogeuser None 105 8月   7 10:02 id_ed25519.pub

鍵ペアのパーミッション設定(確認)

$ chmod 744 ~/.ssh
$ chmod 600 ~/.ssh/id_*
$ chmod 644 ~/.ssh/id_*.pub

クライアント側の公開鍵を、サーバー側に登録する


クライアント側の id_ecdsa.pub と id_ed25519.pub を安全な方法でサーバー側へコピーする。(せっかく作ったけど、今回は SSH2 DSA 鍵は使わないことにした)
公開鍵を ~/.ssh/authorized_keys2 に追加する

$ cd ~/tmp                   # ←ここに公開鍵をコピーしたとする
$ cat id_ecdsa.pub id_ed25519.pub >> ~/.ssh/authorized_keys2
$ rm id_ecdsa.pub id_ed25519.pub

鍵ペアのパーミッション設定(確認)

$ chmod 744 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys2

クライアント側から接続してみる


#    -2 : SSH2 で
#    -4 : IPv4 で
#    -i ~/.ssh/id_ed25519 : 秘密鍵を指定
#    hogeuser@192.168.100.100 : ユーザ名とホスト名
hogeuser@SSH_CLIENT ~
$ ssh -2 -4 -i ~/.ssh/id_ed25519 hogeuser@192.168.100.100
The authenticity of host '192.168.100.100 (192.168.100.100)' can't be established.
ECDSA key fingerprint is a5:cc:00:0f:32:7e:3d:3a:4f:b4:8c:c5:55:73:75:c5.
Are you sure you want to continue connecting (yes/no)? yes      #← fingerprint が正しければ yes
Warning: Permanently added '192.168.100.100' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/hogeuser/.ssh/id_ed25519': ********  #← パスフレーズを入力
Last login: Thu Aug  7 10:35:18 2014 from ssh_client

hogeuser@SSH_SERVER ~
$                      #←ログインできた

勝手に使える鍵を選択してくれるから、(ユーザ名と)ホスト名だけ指定してもok

hogeuser@SSH_CLIENT ~
$ ssh hogeuser@192.168.100.100
Enter passphrase for key '/home/hogeuser/.ssh/id_ecdsa':
Last login: Thu Aug  7 10:37:26 2014 from ssh_client

hogeuser@SSH_SERVER ~
$                      #←ログインできた

接続できない場合は、「-v」「-vv」「-vvv」オプション (3段階) を付けて ssh を起動してみる
以下は「~/.ssh/authorized_keys2」が存在しなかった場合の実行例。

$ ssh -v -2 -4 -i ~/.ssh/id_ed25519 hogeuser@192.168.100.100
OpenSSH_6.6.1, OpenSSL 1.0.1h 5 Jun 2014
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to 192.168.100.100 [192.168.100.100] port 22.
debug1: Connection established.
debug1: identity file /home/hogeuser/.ssh/id_rsa type -1
debug1: identity file /home/hogeuser/.ssh/id_rsa-cert type -1
debug1: identity file /home/hogeuser/.ssh/id_dsa type -1
debug1: identity file /home/hogeuser/.ssh/id_dsa-cert type -1
debug1: identity file /home/hogeuser/.ssh/id_ecdsa type 3
debug1: identity file /home/hogeuser/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/hogeuser/.ssh/id_ed25519 type 4
debug1: identity file /home/hogeuser/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1
debug1: match: OpenSSH_6.6.1 pat OpenSSH_6.6.1* compat 0x04000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA a5:cc:00:0f:32:7e:3d:3a:4f:b4:8c:c5:55:73:75:c5
debug1: Host '192.168.100.100' is known and matches the ECDSA host key.
debug1: Found key in /home/hogeuser/.ssh/known_hosts:1
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/hogeuser/.ssh/id_rsa
debug1: Trying private key: /home/hogeuser/.ssh/id_dsa
debug1: Offering ECDSA public key: /home/hogeuser/.ssh/id_ecdsa
debug1: Authentications that can continue: publickey
debug1: Offering ED25519 public key: /home/hogeuser/.ssh/id_ed25519
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.
Permission denied (publickey).

sshd をデバッグモードで起動する


管理者権限で起動したcygwinターミナルから sshd をデバッグモードで起動してみようとしたら、以下のようなエラーが出て起動できなかった。
これは、cyg_server アカウント以外のユーザで起動したためだと思う。

$ /usr/sbin/sshd -d
debug1: sshd version OpenSSH_6.6.1, OpenSSL 1.0.1e 11 Feb 2013
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type ECDSA
debug1: private host key: #2 type 3 ECDSA
debug1: private host key: #3 type 4 ED25519
/var/empty must be owned by root and not group or world-writable.

# パーミッションは特に問題ない(と思う)
$ ls -ld /var/empty
drwxr-xr-x+ 1 cyg_server root 0 8月   4 11:34 /var/empty/

sshd をデバッグモードで起動するには、サービスに登録してしまった方がいいと思う

# デバッグモードのSSHDをサービスに登録する
# サーバ側で cygwin ターミナルを管理者権限で起動
# 1度 SSH で接続→切断すると、毎回サービスが停止する
#   --args の d はデバッグレベル。1~3個まで指定できる
#   デバッグログは /var/log/sshd_debug に出力される
#   sshd サービスは自動起動しない(手動)
$ cygrunsrv --install sshd_debug_mode \
            --disp "CYGWIN sshd DEBUG MODE" \
            --path /usr/sbin/sshd \
            --args "-Dddd -E /var/log/sshd_debug" \
            --type manual \
            --user cyg_server
            -y tcpip
Enter password of user `SSH_SERVER\cyg_server': ******** #← cyg_server ユーザのパスワードを入力
Reenter, please: ********                           #← cyg_server ユーザのパスワードを再入力

# デバッグモードの sshd を起動する
$ cygrunsrv -S sshd_debug_mode

以下のエラーでSSHDサービスの起動に失敗した場合は、cygserverのパスワードを再設定すると良いらしい。
(参考: Cygwin - マルチメディア実験室 - Redmine for School of Education)

$ cygrunsrv -S sshd_debug_mode
cygrunsrv: Error starting a service: StartService:  Win32 error 1069:
OI?クsオスス゚AT[rX・
               Jn?ォワケ・オスB
(SJIS: ログオンに失敗したため、サービスを開始できませんでした。)

------------------------

C:\>net start sshd_debug_mode
システム エラー 1069 が発生しました。

ログオンに失敗したため、サービスを開始できませんでした。

cyg_server ユーザのパスワードを再設定する。

#   パスワードは 5 から 8 文字のようだ(もっと長いパスワードを指定してた)
$ passwd cyg_server
Enter the new password (minimum of 5, maximum of 8 characters).
Please use a combination of upper and lower case letters and numbers.
New password: ********
Re-enter new password: ********
Password changed.

# デバッグモードの sshd サービスを起動
$ cygrunsrv -S sshd_debug_mode

必要がなくなったら、デバッグモードの sshd サービスを削除しておく
$ cygrunsrv -R sshd_debug_mode


tera term + cygterm + Cygwin 1.7.31 で、man がうまく表示できなかった

man を実行すると、矢印キーでスクロールが出来なかったり、j,kキーでスクロールするとやたら画面がちらついたりしてた。
また、man を実行すると、こんな WARNING が出てた。

$ man man
WARNING: terminal is not fully functional
-  (press RETURN)

$TERM を確認すると dumb になっていた。

$ echo $TERM
dumb

一応 TERATERM.INI (tera term) の TermType は

;     Telnet terminal type
;TermType=vt100
TermType=xterm

cygterm.cfg の TERM_TYPE は

#TERM_TYPE = vt100
TERM_TYPE = xterm

になっている。

cygterm.cfg を書き換えて、 xterm になる様にした。

最終的な cygterm.cfg

TERM = ttermpro.exe %s %d /E /KR=UTF8 /KT=UTF8 /VTICON=CygTerm /nossh
TERM_TYPE = xterm
PORT_START = 20000
PORT_RANGE = 40
SHELL = auto
ENV_1 = MAKE_MODE=unix
ENV_2 = HOME=/home/(ユーザ名)
ENV_3 = LANG=
ENV_4 = TERM=xterm
LOGIN_SHELL = Yes
SSH_AGENT_PROXY = No

なんとなく、man のページャーを lv に変更してみる。
変更するために /etc/man.conf を探したがファイルがない。
/etc/man_db.conf を書き換えてみたら、設定が反映された。
もしかして、Cygwin 1.7.31、man 2.6.7-1、man-db 2.6.7-1 な環境では、/etc/man.conf ではなく、/etc/man_db.conf で設定するの?

$ diff defaults/etc/man_db.conf man_db.conf -c
*** defaults/etc/man_db.conf    2014-06-04 18:54:06.000000000 +0100
--- man_db.conf 2014-08-06 17:24:24.660662300 +0100
***************
*** 76,81 ****
--- 76,82 ----
  # definition and modify it.
  #
  #DEFINE       pager   less -s
+ DEFINE        pager   /usr/bin/lv -c -la -Ou8
  #DEFINE       cat     cat
  #DEFINE       tr      tr '\255\267\264\327' '\055\157\047\170'
  #DEFINE               grep    grep

最終的な /etc/man_db.conf の内容

MANDATORY_MANPATH                       /usr/man
MANDATORY_MANPATH                       /usr/share/man
MANDATORY_MANPATH                       /usr/local/share/man

MANPATH_MAP     /bin                    /usr/share/man
MANPATH_MAP     /usr/bin                /usr/share/man
MANPATH_MAP     /sbin                   /usr/share/man
MANPATH_MAP     /usr/sbin               /usr/share/man
MANPATH_MAP     /usr/local/bin          /usr/local/man
MANPATH_MAP     /usr/local/bin          /usr/local/share/man
MANPATH_MAP     /usr/local/sbin         /usr/local/man
MANPATH_MAP     /usr/local/sbin         /usr/local/share/man
MANPATH_MAP     /usr/X11R6/bin          /usr/X11R6/man
MANPATH_MAP     /usr/bin/X11            /usr/X11R6/man
MANPATH_MAP     /usr/games              /usr/share/man
MANPATH_MAP     /opt/bin                /opt/man
MANPATH_MAP     /opt/sbin               /opt/man

MANDB_MAP       /usr/man                /var/cache/man/fsstnd
MANDB_MAP       /usr/share/man          /var/cache/man
MANDB_MAP       /usr/local/man          /var/cache/man/oldlocal
MANDB_MAP       /usr/local/share/man    /var/cache/man/local
MANDB_MAP       /usr/X11R6/man          /var/cache/man/X11R6
MANDB_MAP       /opt/man                /var/cache/man/opt

DEFINE  pager   /usr/bin/lv -c -la -Ou8
SECTION         1 n l 8 3 2 5 4 9 6 7

2014年8月6日水曜日

開設

自分がPCでやったことをメモする領域が欲しかったのでブログサービスを検索。
ソースコードやコマンドやHTMLなども書きたいので簡単に色分け出来るところがいい。
検索して最初に見つかったのが「ソースコードをハイライトするSyntaxHighlighter3.0を使いこなす」と「BloggerにソースコードをハイライトするSyntaxHighlighterを導入する」。
良さそうな感じなので、bloggerに決定。
SyntaxHighlighter は blogger 以外でも使えるけど、新たにアカウントを作るのも面倒だし。


ブログの内容はPC以外もあるかもしれないし、まだ未定。更新頻度も未定。




使わなさそうなものも含めて、「Bash/shell」「C++」「CSS」「Diff」「JavaScipt」「Java」「Perl」「Plain Text」「SQL」「XML,XHTML,XSLT,HTML」を有効にしてみた。

■ 書式

SyntaxHighlighter - Configuration ら辺を参考にしつつ。

<pre class="brush: <エイリアス名>;
            highlight: [<強調する行番号をカンマ区切り>];
            first-line: <開始行番号>;
            gutter: <行番号の表示/非表示をtrue/falseで>;
            html-script: <brushで指定した以外にHTML要素もハイライトの有無をtrue/falseで(HTML中にスクリプトがある時に便利)>;
            toolbar: <ツールバーの表示/非表示をtrue/falseで>;
            ">
  // ココにソースを記述
</pre>

■ サンプル

<pre class="brush: javascript;
            highlight: [4,5,10];  // 4-5 の様な表記は不可
            first-line: 2;
            gutter: true;
            html-script: true;
            toolbar: false;
            ">
&lt;!DOCTYPE html>
&lt;html lang="ja">
  &lt;head>
    &lt;meta charset="UTF-8">&lt;!-- 文字コード -->
    &lt;title>サンプル&lt;/title>
    &lt;script>
      function foo() {
        var result = window.confirm("hogehogeしてもいいですか?");
        if(result) {
          alert("hogehoge");
        }
      }
    &lt;/script>
  &lt;/head>
  &lt;body">
    &lt;h1>サンプル&lt;/h1>
    ほげほげ
    &lt;footer>
      &lt;p>Copyright 20XX&lt;/p>
    &lt;/footer>
  &lt;/body>
&lt;/html>
</pre>

■ サンプルの表示結果

<!DOCTYPE html>
<html lang="ja">
 <head>
    <meta charset="UTF-8"><!-- 文字コード -->
    <title>サンプル<title>
    <script>
      function foo() {
        var result = window.confirm("hogehogeしてもいいですか?")
        if(result) {
          alert("hogehoge");
        }
      }
    </script>
  </head>
  <body">
    <h1>サンプル</h1>
    ほげほげ
    <footer>
      <p>Copyright 20XX</p>
    </footer>
  </body>
</html>


■ 注意点
  • ソースコード中の「<」は「&lt;」に置換すること


■ メモ

テンプレートを変更すると、せっかく設定した SyntaxHighlighter の設定内容も消えてしまうのでメモを残しておく。
設定画面>テンプレート>「HTMLの編集」ボタン>タグの直前に以下の内容をコピーペ

<!-- IKE:ADD: SyntaxHighlighter の設定 [START] -->
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeEclipse.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script language="javascript" type="text/javascript">
 SyntaxHighlighter.config.bloggerMode = true;
 SyntaxHighlighter.all();
</script>
<!-- IKE:ADD: SyntaxHighlighter の設定 [END] -->