2008年12月11日木曜日

WordPressのクォーテーション自動変換を無効化する

WordPressに投降した記事は、表示の段階で少し修正が入る。
シングルクォーテーション・ダブルクォーテーションなどの記号がそれだ。
 
この機能、普通のブログでは特に気になるようなことではないが、こと技術系のブログでは結構邪魔になることがある。
 


  1. コマンドラインを記事にアップ

  2. コピペして使おうとする

  3. 貼り付けたクォーテーションが全角

  4.  
  5. (ノ`皿´)ノ彡┻━┻


 
 

落ち着いてこれを無効化する情報を探る、ひとつのファイルを修正で済む模様。
"/wp-includes/formatting.php" に記事表示の際の変換処理が入っているらしいので該当箇所を変更する。
 

2.6.5で言うと、34行目のこれをコメントアウトだ。
[sourcecode language='php']
// $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

[/sourcecode]
 

バージョンアップのときには注意しないといけないので記事に起こす。
 
追記:2.7.1だと 60行目だ
追記:2.8.4だと 69行目だ
追記:2.9.1だと 82行目だ

 


// 参考にした情報元
WordPressのクォーテーションマークの変換を無効にする - Regen Press

2008年12月4日木曜日

MS-DOSバッチファイルでFizzBuzz

昨日の記事:VBScript で FizzBuzz の続編。
FizzBuzz、今度はDOSバッチファイルで作ってみた。
単純にやってみたかっただけなので、コードを短くする工夫とかはまあ置いておこう。
 
 

FizzBuzzをDOSバッチでやる際に、とりあえず剰余(mod)が取れるのかよく分からなかったので3の倍数、5の倍数を判断するカウンタをつくることにして書いてみた。
記事書く前に、本で算術演算子を調べたら、mod 取れるみたい…
100を3で割った余りなら、
> set /a hoge=100%3
でOKだった。まぁコレはコレでありかな。。

 

ちょっと引っかかったのが遅延展開、forの中で普通に変数 %hoge% って使うと、forの中でいくら中身をいじろうと、for に入る前の変数の中身が展開されちゃう。
setlocalで 遅延展開有効 にして、!hoge! って使えばfor内でもその時点の変数内容が展開される。
あとは特に工夫も無く。
[sourcecode language='sh']
@echo off

REM // 遅延展開有効
setlocal enabledelayedexpansion

REM // ウインドウタイトル変更
TITLE FizzBuzz

REM // カウントダウン用の変数
set SAN=3
set GO=5

REM // 繰り返し
for /l %%I in (1,1,100) do (

rem // 表示用の変数、空っぽ比較用も
set STRING=
set STRING_FLG=

rem // 3と5のカウンターが0ならリセット
if !SAN!==0 (set SAN=3)
if !GO!==0 (set GO=5)

rem // 3と5のカウンターを一つ減らす
set /a SAN=!SAN!-1
set /a GO=!GO!-1

rem // 3のカウンターが0なら表示用にFizz追加
if !SAN!==0 (set STRING=Fizz)

rem // 5のカウンターが0なら表示用にBuzz追加
if !GO!==0 (set STRING=!string!Buzz)

rem // ここでFizzもBuzzも入ってなければループ数字追加
if !STRING!==!STRING_FLG! (set STRING=!STRING!%%I)

rem // 現在の数と、FizzBuzzの結果を出力
echo %%I !STRING!
)
pause
endlocal
[/sourcecode]


実行結果。
[caption id="attachment_1099" align="alignnone" width="428" caption="画像:FizzBuzz"]画像:FizzBuzz[/caption]
 

デキター。
 

剰余の計算処理もちゃんと調べてればもう少しスマートだったが、まあ結果オーライという事にしよう。
set のヘルプに一応ヒントらしきものはあったが見逃した。
→setの詳しい解説があった。

VBScript で FizzBuzz

FizzBuzz って言うのがあるというのを知った、 今夜わかるセキュアプログラミング - うさぎ文学日記 を見て。

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

 

VBScriptで書いてみた、前述資料にPerlでの答えが書いてあったからインチキだけど。
[sourcecode language='vb']
for i=1 to 100
'// 文字列初期化
strTemp = ""

'// 3の倍数ならFizzを文字列に追加
if (i mod 3) = 0 Then
strTemp = "Fizz"
End if

'// 5の倍数ならBuzzを文字列に追加
if (i mod 5) = 0Then
strTemp = strTemp & "Buzz"
End if

'// ここで文字列が空っぽなら数字を代入
if strTemp = "" Then
strTemp = i
End if

'// 表示用の一列作成
strResult = strResult & i & VbTab & strTemp & VbCrLf
Next

'// 表示
Msgbox strResult,,"FizzBuzz"

Wscript.Quit
[/sourcecode]
 

実行するとこうなる、スペースの都合で1-30までの表示としてます。
[caption id="attachment_1097" align="alignnone" width="130" caption="画像:FizzBuzz"]画像:FizzBuzz[/caption]
 

うん、アプローチは色々ありそうだけど、まあできてるんでないの。

vmstat の出力に日付と時刻を付与@sh

サーバの稼動状況モニタ、 vmstat の出力には時刻情報がない。
 

標準だとこんな感じ、日付情報を出力したい時もあるよね。
# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 33420 41628 45528 92228 0 0 7 47 14 4 1 1 98 0 0
0 0 33420 41628 45528 92228 0 0 0 0 38 35 0 0 100 0 0
0 0 33420 41508 45528 92228 0 0 0 0 67 77 2 0 98 0 0

 

よい方法を探してみたら同じよう流れの記事を見つけた、やはり多くが思うことなんだろう。

vmstatに日時を付ける - いろいろつまみぐい


 

perl だ、 さらにたどれば rubyでの実装 もやってる、なるほど。
 
 

うーん、perlが入ってないlinuxサーバなんか見たこと無いが、ここはシェルでもやってみたい。
 

という事でスクリプトを作ったぞ。
[sourcecode language='sh']
#!/bin/sh

while read -e hoge ; do
echo `date +%Y%m%d' '%H':'%M':'%S` ${hoge}
done
[/sourcecode]
シェルの組み込みコマンド、read で入力を一行ずつ処理するのだ、これを"vmread.sh"とでもして保存。(追記:hoge を省略すると変数名はREPLYになる)
 
 


# vmstat 1 3 | ./vmread.sh

早速実行!
20081202 20:30:01 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------

よい感じで日付情報が付いている…
 

20081202 20:30:01 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
20081202 20:30:01 r b swpd free buff cache si so bi bo in cs us sy id wa st
20081202 20:30:01 1 0 33420 35248 46172 92228 0 0 7 47 14 4 1 1 98 0 0
20081202 20:30:02 1 0 33420 34768 46172 92228 0 0 0 0 173 555 6 8 86 0 0
20081202 20:30:03 0 0 33420 34324 46172 92240 0 0 0 0 132 399 2 10 88 0 0

Σ(-д-) ゲッー!左にずれたー
 

どうやら read が 行の内容を hoge に突っ込む時に連続したスペースを一つの区切り文字と認識、詰めちゃってるようだ。
2009/2/17追記:
${hoge} をダブルクォーテーションで囲めば区切られないのでOK

 
 

対策を考えないと、、bashのマニュアル みても有効そうな手立ては無し。
とりあえず最後の出力に対して、trコマンドで スペースをTABに変換 してみる。
# vmstat 1 3 | ./vmread.sh | tr " " "\t"

どうかな?
20081202 20:37:34 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
20081202 20:37:34 r b swpd free buff cache si so bi bo in cs us sy id wa st
20081202 20:37:34 1 0 33420 40280 46728 92260 0 0 7 47 14 4 1 1 98 0 0
20081202 20:37:35 0 0 33420 39980 46728 92260 0 0 0 0 53 76 1 1 98 0 0
20081202 20:37:36 0 0 33420 39980 46728 92260 0 0 0 0 49 67 0 1 99 0 0

(予想通り)右に伸びたー...
 
 

困った。
少し考えて、出力をいじるのが無理なので入力をいじってみることに。
 

vmstat の出力からスペースをカンマに変換してreadに渡すと?
# vmstat 1 3 | tr " " "," | ./vmread.sh
20081202 20:42:22 procs,-----------memory----------,---swap--,-----io----,--system--,-----cpu------
20081202 20:42:22 ,r,,b,,,swpd,,,free,,,buff,,cache,,,si,,,so,,,,bi,,,,bo,,,in,,,cs,us,sy,id,wa,st
20081202 20:42:22 ,1,,0,,33420,,39928,,47076,,92268,,,,0,,,,0,,,,,7,,,,47,,,14,,,,4,,1,,1,98,,0,,0
20081202 20:42:22 ,0,,0,,33420,,39928,,47076,,92272,,,,0,,,,0,,,,,0,,,,,0,,,35,,,36,,0,,0,100,,0,,0
20081202 20:42:22 ,0,,0,,33420,,39688,,47076,,92272,,,,0,,,,0,,,,,0,,,,,0,,,95,,146,,0,,1,99,,0,,0

おお。コレはいけるぞ。
 

それでは最後にもう一度 trコマンド を入れて、カンマからスペースに変換。
# vmstat 1 3 | tr " " "," | ./vmread.sh | tr "," " "
20081202 20:46:06 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
20081202 20:46:06 r b swpd free buff cache si so bi bo in cs us sy id wa st
20081202 20:46:06 1 0 33420 39488 47412 92280 0 0 7 47 14 4 1 1 98 0 0
20081202 20:46:06 0 0 33420 39248 47412 92280 0 0 0 0 109 155 0 0 100 0 0
20081202 20:46:06 0 0 33420 39248 47412 92280 0 0 0 0 67 96 1 0 99 0 0

よぅし、完璧だ! …と思う。
 
 
(追記)
vmread.sh の前に trコマンドをはさんでしまうと、出力を全部貰ってからになるので全部同じ時間がくっつくことが判明!
パイプの仕様からしてよく考えたらそうかも…もう一工夫がいるのか。
 
ちょっと保留だなぁ。左に詰められても一応使い物になるし。
※コメントにより解決済み

2008年12月3日水曜日

IIS7でクライアントポート(リクエスト元ポート)をログにとりたいが…(追 記:apacheも)

セキュリティホール memo のキャリアグレード NATに関する記事 を見た。


Internet Week 2008 のキャリアグレード NAT の話で、 「キャリアグレード NAT が導入されると、クライアントのポート番号のログを取っておかないと、アクセス元をたどれなくなるよ (NAT されますから)」という話があったのを思い出した。



なるほどクライアントのポート番号のログを取っておくという事も推奨されるようになりそうです。
個人的にはいまいち必要性の実感に乏しいけど、残さないよりは残したほうがよいでしょう。
 

記事中ではApache2.2でのやり方が紹介されていたので、ほなIISはどうだろうと思って WindowsServer2008 で IIS7 を立ち上げ、ログフォーマットの設定画面を開く。
 

[caption id="attachment_1093" align="alignnone" width="386" caption="画像:IIS7ログフォーマット"]画像:IIS7ログフォーマット[/caption]
あぁ、クライアントポートの項目無いねぇ。IIS6 も内容は一緒。
 

仕方が無いのでメタベースとかに直接書けばいけるかな、と思って情報をあさってみたが、
IInetLogInformation - MSDN
この辺見るに、標準では明らかに無理っぽい(※ログモジュールごと完全自作なら取得可?)
マイクロソフト 何とかしてくれー どこに要望出したら良いんだろう。IIS.NETか?
 
 

では折角なので セキュリティホール memo の Apache 用設定を試してみようとやってみた。

「もしや……」と思って、 英語版のドキュメントを見たら、ありました。



%{format}p
The canonical port of the server serving the request or the server's actual port or the client's actual port. Valid formats are canonical, local, or remote.

引用:セキュリティホール memo のキャリアグレード NATに関する記事

 

それではapacheのコンフィグファイルを編集、デフォルト combined の Logformat にクライアントポートを出力しそうなフォーマット文字列を加えて試してみる。
%p %{remote}p %{local}p %{canonical}p↓で、出力されたログ↓
*.*.*.* - - [02/Dec/2008:**:**:** +0900] "GET / HTTP/1.1" 304
- "-" "Mozilla/5.0(略)Firefox/3.0.4" 80 80 80 80


…全部 80 がログに記録される、、いやいやリクエスト元3000番台だったぞ、{remote}じゃないのか?何か間違ってるんかな。
 

apacheのバージョンはコレ。
# apachectl -v
Server version: Apache/2.2.3
Server built: Jan 15 2008 20:33:30

 

うーむ、本当に取れるんだろうか…

2008年12月1日月曜日

clip.exe でコマンドプロンプトの出力をクリップボードに送る@WindowsServer

サーバで作業中によく使うコマンド、「clip.exe」について。WindowsServer2003以降(vista含む)は標準で利用できる。
 
 

コマンドプロンプトで作業中に、長い出力結果をゆっくり見たいことがある。ファイルにリダイレクトして開いても良いが、パイプを利用して clip.exe に渡すと手間が省ける。
 

例えば for コマンドのヘルプ、コレはやたらと長くて 実に142行にわたる。
これをコマンドプロンプトのウィンドウを遡って読むのは非常に疲れるので、クリップボードに送ってメモ帳などに貼り付ける。
> for /? | clip

 

で、メモ帳にぺたっと。
[caption id="attachment_1088" align="alignnone" width="500" caption="画像:クリップボードからメモ帳へ"]画像:クリップボードからメモ帳へ[/caption]
 

これでゆっくり読める。