最近ネタがあっても更新してません(。。;)
– 翻訳プラグイン
リリース当初から知ってたものの、見なかった事にしていたプラグイン^^;
命名の時の手間が減るかなと思い今更に導入。
Update Site: http://www.eisbahn.jp/update-site/
– EclipseUML
Free Edition を導入。GEF, EMF がバンドルされ, インストーラ(実行可能なjar形式)での配布で昔に比べてインストールが容易になってました。
普段 Jude Community Edition を使っているのですが、
いまいちコードとの同期が取りづらいのと、UML2.0 に対応していないのが不満だったので..
– HeapStatus
Eclipse3.2 で標準搭載になった(Eclipse自体の)メモリ使用状況表示, メモリ解放プラグイン。
Update Site: http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-ui-home/updates
追記(2006-07-21): Eclipse3.2 ではデフォルトでヒープステータス表示がオフになっている。「設定→ 一般」の「ヒープステータスを表示」のチェックを入れることで利用可能になります。
– Commons4E (@IT の記事)
Update Site: http://commons4e.berlios.de/updatesite/
– ソロプログラミングプラグイン
これにはまったらきっと病んでる。
カテゴリー: lifehack
ライフハックといいつつ、技術に関係無いもの全般
eAccelerator トラブルシューティング – Can not create shared memory area in Unknown on line 0
Q. Linux + Apache + PHP + eAccelerator の環境で apache が次のエラーを出して動かなくなりました。
$tail -f error_log
PHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0
PHP Fatal error: Unable to start eAccelerator module in Unknown on line 0
[Thu Feb 23 09:26:31 2006] [warn] pid file /usr/local/apache_1.3.34/logs/httpd.pid overwritten — Unclean shutdown of previous Apache run?
PHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0
PHP Fatal error: Unable to start eAccelerator module in Unknown on line 0
A. このエラーが出た場合、原因はここの次の FAQ に書いてあるケースの可能性があります。
Q: I’m using linux 2.6 kernel and eAccelerator doesn’t get loaded when the shm_size is set to value bigger than 32mb. Php gives this warning:
PHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0A: The default shared memory size for the 2.6 kernel is 32mb. You can change this size by setting /proc/sys/kernel/shmmax to the disired maximum value. You can do this by echo VAL > /proc/sys/kernel/shmmax or add the line kernel.shmmax=VAL to /etc/sysctl.conf so you don’t have to set it manualy every time you reboot.
カーネルの共有メモリ制限(デフォルト32MB)を超えて、eaccelerator.shm_size を設定したのが原因でした。php.ini で
eaccelerator.shm_size=32
のように範囲内に押えるか、あるいは FAQ にあるように
# cat /proc/sys/kernel/shmmax
33554432
を、
# expr 64 “*” 1024 “*” 1024 > /proc/sys/kernel/shmmax
のように、バイト単位で適切に上限を設定してカーネルごとリブートすれば解決します。
OpenLaszlo メモ
■OpenLaszlo デモ:
http://www.laszlosystems.com/partners/support/demos/
■OpenLaszlo 利用についての @IT の記事:
http://www.atmarkit.co.jp/fwcr/rensai/laszlo01/01.html
■採用している例:
– http://www.behr.com/behrx/colorsmart/main.jsp
– http://www.svcfinancial.com/sol_demo_library2.html
から辿れるリンク先(view demo とあるもの)。
■その他採用サイト一覧:
http://www.laszlosystems.com/customers/case/
■OpenLaszlo でビジネス展開している日本の会社:
http://www.net8.co.jp/
CSS バグ辞典
http://members.at.infoseek.co.jp/cssbug/index.html
特に IE について、けっこうな量の不具合があるのだなぁと改めてびっくりです。
例えば vertical-align 周りの動作の怪しさはずっと気になっていたので、検証コードで確認できてすっきりしました。
参考:
– CSS テクニックコミュニティ(mixi)
bind8/bind9 設定の基本
named.conf 全体設定、zone の項目でゾーン(ドメイン、逆引き時の IP アドレス)を定義し、実際の DNS レコードについては、ゾーンごとにゾーンファイルに記述していく。
named.conf:
options {
directory “/etc/named”;
// 任意のディレクトリ名。ここで設定したものが、
// ゾーンファイルなど設定ファイルのルートディレクトリになる。
};
// 正引き(ドメイン -> IP アドレス)用。
zone “example.org” { // example.org ドメインについての定義
type master; // 他の DNS サーバを参照するのではなく、自分で
// DNS レコードを定義する場合は master。
// 他のサーバを参照する場合は slave
file “master/example.org”; // 利用するゾーンファイル。ファイル名は任意のものでよい。master 用。
// masters { 192.168.1.1; 10.0.0.10; }; // DNS レコード参照先マスタサーバ。slave 用。
};
// 逆引き(IP アドレス -> ドメイン)用。
zone “1.168.192.in-addr.arpa” { // 192.168.1.* 用。ドット区切りで逆転して、in-addr.arpa を付加する。
type master;
file “master/1.168.192.in-addr.arpa”;
}
次にゾーン設定ファイルです。ドメイン指定の部分では、最後にドットをつける形式(FQDN)にすることに注意します。これは FQDN 形式でないと後にドメイン名が続く(example.org のゾーン設定の場合、ns.example.org は ns.example.org.example.org.)と解釈するためです。
master/example.org:
$TTL 3600 ; Default TTL. 全てのレコードについて有効期間を何秒にするか。
@ IN SOA ns.example.org. postmaster.examle.org. (
; 第一パラメータはどのホストについてのレコードか、で @ は *.example.org の意味です。
; 第二パラメータは IN は Internet の意味です。常に IN にするものだと思っていていいんじゃないでしょうか。
; 第三パラメータはレコードの内容です。SOA は Start of Authority の意味で、ゾーン設定で最初に設定します。
; SOA レコードには後ろに二つパラメータと ( 〜 ) が続きます。
; ns.example.org が DNS サーバ, postmaster.example.org が
; 管理者宛メールアドレス(@ を . に置き換えたもの)です。
2006021714; Serial. 任意の数値でよいが、更新の必要の有無は
; この数値以下かで判別されるため、
; 更新の際はこの数値以上にする。
3600 ; Refresh (sec). 更新確認の頻度を何秒ごとにするか。
1000 ; Retry (times). 失敗時の試行回数。
86400 ; Expire (sec). 失敗したときに何秒後に破棄するか。
86400 ; Minimum TTL(sec).
)
IN NS ns.example.org. ; example.org, *.example.org の DNS サーバのドメインを ns.example.org にします。
IN A 192.168.1.11 ; example.org, *.example.org の名前解決結果を 192.168.1.11 にします。
ns IN A 192.168.1.2 ; ns.exmaple.org の名前解決結果を 192.168.1.2 にします。
www IN A 192.168.1.11 ; www.example.org の名前解決結果を 192.168.1.11 にします。
master/1.168.192.in-addr.arpa:
$ORIGIN 1.168.192.in-addr.arpa. ; 192.168.1.* についての設定であることを宣言
$TTL 3600
@ IN SOA ns.example.org. postmaster.example.org. (
2006021714 ; Serial
3600 ; Refresh
1000 ; Retry
86400 ; Expire
86400 ; Minimum TTL
)
IN NS ns.example.org. ; Primary DNS
IN NS ns2.exmaple.org. ; Secondary DNS (Optional)
; 以下 IP アドレスごとに固有で逆引き設定をする場合のみ記述する。
1 IN PTR root.example.org. ; 192.168.1.1 の逆引き結果
11 IN PTR www.example.org. ; 192.168.1.11 の逆引き結果
参考:
– ネームサーバーの設定
– bind9 設定
– ゾーンファイルの書き方について教えてください(@IT)
– ISC BIND(English)
ファイルへのアクセス状況を調べる
fstat, lsof, fuser などのコマンドを使うと、現在開かれている全てのファイルと開いているユーザ、プログラム、プロセス、読み書きのモードが調べられます。
fstat は FreeBSD の場合で、fuser は Linux の場合、lsof は Linux, BSD を含む UNIX 互換 OS で利用可能です。BSD でlsof を使う場合は、 ports/sysutils/lsof を入れます。lsof は機能が豊富なので、lsof の利用をお勧めします。
fstat:
fstat [-fmnv] [-p pid] [-u user] [-N system] [-M core] [file …]
fuser:
fuser [-a|-s|-c] [-4|-6] [-n space] [-k [-i] [-signal] ] [-muvf] name
…
fuser -l
fuser -V
lsof:
lsof [ -?abChlnNOPRstUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [
+|-D D ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k ] [
+|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t] ] [ -S
[t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ — ]
[names]
たとえば、ログファイルを開いているプロセス, ファイルを調べるには
lsof +D /var/log
等とします。
デバッグや問題究明に便利です。
参考:
– LSOF設置及び使用ガイド
J2EE でどのフレームワークを使うか。またデザインとの分離について
– F’s Garage:日記
なかなか難しいなと常々思っているので、こういうの読むと安心。個人的には,突っ込みしてる方と同じで JSP + EL + Beans が多めです。loop についてはカスタムタグか、そのまま埋め込みかどちらか。これを読んで、カスタムタグも Java コードも使わない Plain Old HTML Pages で書けるのが一番デザインの分離ができそうな気がしてます。
参考:
– Nirvana Wiki
C# で Java と同等のアクセス制限をかける
Java プログラマが C# を学ぶ際のメモその2。
– Java
public: どこからでもアクセス可
protected: 自クラス内と子孫クラス、または同一パッケージ内であればアクセス可(default 権限も兼用)。
default: 同一パッケージ内からのみアクセス可。アクセス修飾子を省略した場合のデフォルト。
private: 自クラス内からのみアクセス可。
– C#
public: どこからでもアクセス可(入れ子 enum,interface のデフォルト)。
protected internal: 同一アセンブリ(DLL ファイル, EXE ファイル等)内と子孫からアクセス可。
internal: 同一アセンブリ内からのみアクセス可(名前空間直下で宣言したコンテナのデフォルト)。
protected: 自コンテナ(クラス等)内と子孫からのみアクセス可。(Java と違い同一名前空間は不可)
private: 自コンテナのみからアクセス可(入れ子 class, struct のデフォルト)。
注意すべきは、protected の動作の違いと、default(Java) と internal(C#) の制限範囲の違いです。
Java では、パッケージレベルでの制限が可能ですが、言語で制限をかけただけだと外部ファイルからのパッケージへの侵入が可能です。
これを防ぐには JAR を作る時にシーリング機構を利用すれば、そのパッケージの利用者の侵入を制限することができます。
マニフェストの不正な書き換えを防ぐにはJARへの署名機能等を使えばよさそうです。
C# では、アセンブリ(プログラム, ライブラリ)単位でのアクセス制限が可能で、名前空間単位では制限できません。アクセス制限がソースファイル単位ではないことに注意してください。
参考:
– C# プログラマーズリファレンス – アクセシビリティレベル
– JARマニフェストのメイン属性
– JavaHouse Brewers 19189 – Package Joining Attack(JDK1.2 での話)
パケットキャプチャツール
昔(2年ほど前)使っていて、機能的にも優秀で使いやすかったものなのですが、
名前を度忘れしていて今日やっと思い出しました orz.
Wireshark
(Etherealから改称)
ネットワークに実際に流れている中身をキャプチャして、GUI で見ることができるオープンソースなパケットキャプチャツールです。
Ethereal, Wireshark の Windows での動作には WinPcap が必要です。
Windows の他に、Linux 等さまざまな環境で動作します。
追記:
(2006-07-27) Ethereal は Wireshark として更新されるようになりました
参考:
– Ethereal(イーサリアル)の日本語解説サイト
– Wireshark
sh での変数とワイルドカードの落とし穴
sh, bash, csh, zshのようなシェルでは
echo *.sh
などというように、ワイルドカードでファイル一覧を取得することができます。
シェルで使えるワイルドカードはアスタリスク(*)、クエスチョンマーク(?)の2種類で、それぞれ、0文字以上の任意の文字列、1文字の任意の文字(英数記号など)を表します。
ワイルドカード文字を、ワイルドカードとしてではなくただの * や ? という1つの文字として扱いたい場合は、次のようにクオート記号で囲むか、エスケープします。
echo "*.sh" echo "What's up?" # 結果 # *.sh # What's up? # が表示される
ここに変数が関係してくると、少し厄介なことになります。
# 間違った例 foo="SELECT * FROM table" echo $foo
この結果は、
SELECT * FROM table
と表示されるかと思いきや、アスタリスクがワイルドカードとして展開されてしまうため、
SELECT FROM table
とアスタリスクが消える、または、現在の作業フォルダのファイル一覧が展開されて、
SELECT bin boot home root var FROM table
のように意図しない結果になってしまいます。
これはかなり怖いことで、この動きにより、最悪致命的なセキュリティホールや、データ消失につながる場合があります。
これを回避するためには, ワイルドカード文字を含む変数の参照時は常にダブルクオート/シングルクオートの中で参照するというテクニックを使います。
# 正しい例 foo="SELECT * FROM table" echo "$foo"
この結果は、期待通り
SELECT * FROM table
となります。
多段になってもこの動きは変わりません。
foo="SELECT * FROM table" boo="$foo" echo "$boo" # foo, boo 両方の参照をダブルクォートでくくっていることに注意
この結果も、期待通り
SELECT * FROM table
となります。ここで
echo $boo
としていると、やはり変数展開されてしまうため、注意しましょう。
お約束として、変数を参照するときで、変数に記号が入る可能性がある場合は必ずダブルクオートで囲む癖をつけると、こういう間違いがなくなるので幸せになれます。
おまけ
一歩踏み込んだ例として、変数の遅延展開の例を紹介します。
export table=book # 1
# ↑これは全く利用されない
text='SELECT * FROM ${table}' # 2
# ↑シングルクオートなので、textに入る時点ではtableが展開されない。
export table=member # 3
# ↑これが利用される。子プロセスで参照できるよう export している
query=$(sh -c "echo \"$text\"") #4
# ↑ここでtableの中身が展開されます。* の展開を防ぐため $text をダブルクォートで囲んでいることに注意
echo "$query" # 5
この結果は、
SELECT * FROM member
と出力されます。
処理の流れは以下のとおりです。
1: table 変数に book をセット
2: text 変数に SELECT * FROM ${table} をセット(table変数の中身はここでは見ない)
3: table 変数の内容を member に書き換え
4:
sh -c "echo \"$text\""
を実行、shが立ち上がり、
echo "SELECT * FROM ${table}"
を実行する。(ここでtableが初めて展開される)
query 変数に、echo が出力した SELECT * FROM member をセットする。(ここでは変数代入だけで画面には出力されない)
5: query 変数の内容、SELECT * FROM member を表示する
あまりやらないですが、こういう複雑な処理でも期待通り動作するのは、適切にクオートしているおかげですね。