2009年01月04日(日) [長年日記]
■ [xrea] ウェブサイトのデザインを変えた
軽い気持ちでデザインの変更に手を付けたら大変な時間を要し、正月が終わってしまった。
苦労したのは
- XREA故に上部に注入される広告への対処
- tDiaryにおけるメイン画面とカテゴリ一覧画面の両立
- 書影のあるページをIEで見るとおかしい
- これを期にFSWikiをバージョンアップしたら色々問題発生
- 年明けに伴う微調整も必要だ
など。書いてみたらあまりないなあ。
■ [xrea] FSWikiを3.6.3にバージョンアップ
上にも書いたけど、久ーしぶりにFSWikiをバージョンアップした。
まずは手元で動作確認をしようとしたら、「Premature end of script headers」というありがちなエラーになり動かない。調べると、wiki.cgi の改行コードが CR+LF になっていた。改行コードを LF に直して試すと別な箇所でエラーに。どうやらあらゆるファイルの改行コードが CR+LF になっており、これを修正しないと動作しない模様。
次のような感じでnkfを使ってチマチマと改行コードを変更していったら動くようになった。
find . -name '*.pm' | xargs nkf -E -e -Lu -d --overwrite
「-E -e」を付けないと勝手に文字コードが変更されてしまうので注意。nkfは癖があるなあ。
FSWikiの掲示板で質問してみたところ、改行コードが CR+LF になっていたのは配布ファイル作成のミスだったみたい。今では改行コードが LF に修正されたものをダウンロードできる。
んで、古いCSSのままFSWikiを入れ替えたらデザインが崩れてしまった。HTMLの構造が少し変わっているようだ。丁度CSSを作り直していた所なので構わないけれど。どうしてもサイドバーをうまくデザインできなかったので、Wikiからはサイドバーを削除した。
tDiaryもバージョンアップしたいけどそれはまた今度。
■ [tdiary][javascript] tDiaryの各日に編集用リンクを追加するGreasemonkeyスクリプト (3)
サイトのデザインを変更したら以前作ったGreasemonkeyスクリプト
が動かなくなってしまった。
原因は、body直下にmainというclassのdivが存在する前提のスクリプトになっていたため。今回mainを囲む新しいdivを追加したので動かなくなってしまった。なので、HTMLの構造に前提条件を付けずに動くように修正したつもり。
これのためだけにGreasemonkeyをインストールしているが、無駄なのでブックマークレットで作り直したいと思っている。
今気づいたけど、mainを更にdivで囲うのは標準的なサイドバーの作り方と違う。直すべきかもなあ。
■ [xrea] ウェブサイトのデザインを変えた (2)
というわけで、再度デザイン変更。
- tDiaryにてmainを囲っていたdivを削除した。これにより、サイドバーの幅を固定にできなくなった。サイドバーの幅がブラウザの幅に比例するのは嫌いだったが、やってみたらそれ程変ではないかも。
- Wikiのサイドバーを復活させた。
など。
■ やること
- 換金
2009年01月07日(水) [長年日記]
■ [service][link] IBM情報処理用語英和対訳集のサービスが終了
ガーン、3年前にメモしてたまに便利に使っていた翻訳用のサービスが終了していた。
このページで提供しておりました「IBM 情報処理用語英和対訳集」のサービスは、2008年12月26日をもって終了いたしました。
■ やること
換金
2009年01月11日(日) [長年日記]
■ [game] Media Manager for PSP がタイムアウトエラーになり使えなかった
一昨年に登録したPlayStation@Storeが去年リニューアルされ、Media Manager for PSP なるソフトをインストールしないと使えなくなってしまった。面倒なのでリニューアル後は使用していなかったが、改善される兆しはなく、まだウォレットにチャージが残っているので遂に Media Manager for PSP をインストールすることにした。
インストールするには .NET Framework や Flash Player や Quick Time など色々必要になる。Quick Timeに依存するのはやめて欲しいなあ。
で、インストール後に Media Manager for PSP で PlayStation@Store を開こうとすると、「サーバーへの接続がタイムアウトになりました。」「エラーが発生しました。Code : 0x80023105」というエラーになり使用することができない。どうすればいいのか。ソニーのサイトを探しても対処方法の記述は見当たらない。
ウェブを検索してもあまり情報がない。IEのセキュリティ設定が怪しいと睨みインターネットゾーンのセキュリティレベルを下げたりしてみたが改善しなかった。もう一度ウェブを検索し、2ch ゲースレまとめ@携帯型ゲームに
>>919
cokieをブロックしてないか?
とあるのを見てなるほどと思い、IEのプライバシー設定を「高」から「中-高」に変更したら接続できるようになった。
IEの設定に依存するのはひどい。もっと真面目に作って欲しい。
2009年01月16日(金) [長年日記]
- 病気は完治した。
- 初めてマスクを買ったが、なんだかもったいなくて使えない。
■ [dev][howto] autotoolsを使った
autotoolsを使っている既存のツールをカスタマイズする機会があり、autotoolsを少し理解できるようになった。ちょっとだけメモ。
Makefileを修正したいとき
- Makefile.am を修正する。
- automakeコマンドを実行する。これにより、修正の反映された Makefile.in が生成される。
これで、次にconfigureを実行したときに修正の反映されたMakefileが生成されるようになる。
config.hを修正したいとき
config.hはconfigureの実行により生成されるファイルで、ビルド環境の状態を反映した定数定義などがされている。これを修正したい時は、
- configure.ac を修正する。
- autoheaderコマンドを実行する。これにより、修正の反映された config.h.in が生成される。
- autoconfコマンドを実行する。これにより、修正の反映された configure が生成される。
これで、次にconfigureを実行したときに修正の反映されたconfig.hが生成されるようになる。
[追記] 以下に書いた方法は不完全でした。後日の日記も合わせて参照してください。 [追記ここまで]
configure.ac の書き方はまだ理解しきれていないが、AC_DEFINE または AC_DEFINE_UNQUOTED マクロを使うと新しい定数をconfig.hに追加することができた。例えば、
AC_DEFINE_UNQUOTED([PREFIX_DIR], ["$prefix"], [install directory])
という行を追加してからautoheaderを実行すると、config.h.inに
/* install directory */ #undef PREFIX_DIR
という行が追加され、その後でautoconfコマンドを実行して生成されたconfigureを「./configure --prefix=/home/oreore/test」などと実行すると、config.hに
/* install directory */ #define PREFIX_DIR "/home/oreore/test"
という行が追加される。
■ [c][howto] Cで実行ファイル自身の絶対パスを得る
同じようなことをバッチファイルで実現する方法はこの間メモしたが、Cではどうやるんだっけ。既にメモしていた気もしていたが見当たらない。
まず思いつくのは argv[0] を使う方法だが、色々なケースを考えるとここから絶対パスを得るのは面倒くさい。
別のアプローチは、上に書いたように autotools などを使ってインストールディレクトリのパスをソースコードへ埋め込む方法。これだと実行ファイル自身のパスを得ていることにはならない(コピーされたら駄目)けれど、用途によっては機能する。Unix Programming Frequently Asked Questions 日本語訳にそのような話が書かれていた。
BINARY HACKSの項目64には /proc から読み取る方法が書かれていた。Linuxなら「/proc/self/exe」、FreeBSDなら「/proc/curproc/file」をreadlinkで読み込めばいいとのこと。使えるならこれが便利かな。
2009年01月19日(月) [長年日記]
■ [dev][howto] svn:ignore の設定方法
svn:ignore の設定方法をすぐに忘れるのでメモ。
svn propedit svn:ignore ディレクトリ名
を実行するとエディタが起動するので、そこに無視リストを改行区切りで入力し、保存終了してcommitすれば設定完了。
svn propget svn:ignore ディレクトリ名
で、そのディレクトリに設定してあるsvn:ignoreの値を参照できる。
svn propdel svn:ignore ディレクトリ名
で、そのディレクトリに設定してあるsvn:ignoreを削除できるのだと思う。使ったことない。
svn:ignore はSubversionに管理対象外のファイルを教えるための属性で、指定するとsvn statusの出力がすっきりする。ディレクトリ毎に設定する。サブディレクトリには伝播してくれないので、必要ならば各ディレクトリにいちいち個別に設定する必要があるみたい。
なお、リポジトリに保存するのではなくクライアント環境ローカルで無視リストを管理したい場合は、global-ignores が使える。これは以前にメモしている。
参考
- svn:ignore (Subversion によるバージョン管理)
- svn propedit (Subversion によるバージョン管理)
2009年01月20日(火) [長年日記]
■ [unix][net][howto] ipコマンドでの経路の設定方法
CentOSにおける静的ルーティングの設定方法を以前にメモしたが、ファイルに書くのではなく直接ipコマンドを使って一時的に経路を設定する方法をメモ。ipコマンド難しー。
# /sbin/ip route add 172.32.0.0/12 via 192.168.254.10 dev eth0
を実行すると
$ netstat -nr Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 172.32.0.0 192.168.254.10 255.240.0.0 UG 0 0 0 eth0 0.0.0.0 192.168.254.2 0.0.0.0 UG 0 0 0 eth0
てな感じで経路が追加された。
ipコマンドのマニュアルは見難いと思っていたら、コマンドラインのヘルプでも詳しい情報が表示されることを知った。
$ /sbin/ip help Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] [-batch filename where OBJECT := { link | addr | route | rule | neigh | ntable | tunnel | maddr | mroute | monitor | xfrm } OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] | -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] | -t[imestamp] } $ /sbin/ip route help Usage: ip route { list | flush } SELECTOR ip route get ADDRESS [ from ADDRESS iif STRING ] [ oif STRING ] [ tos TOS ] ip route { add | del | change | append | replace | monitor } ROUTE SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ] [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ] ROUTE := NODE_SPEC [ INFO_SPEC ] NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ] [ scope SCOPE ] [ metric METRIC ] [ mpath MP_ALGO ] INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]... NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ rtt NUMBER ] [ rttvar NUMBER ] [ window NUMBER] [ cwnd NUMBER ] [ initcwnd NUMBER ] [ ssthresh NUMBER ] [ realms REALM ] TYPE := [ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ] TABLE_ID := [ local | main | default | all | NUMBER ] SCOPE := [ host | link | global | NUMBER ] FLAGS := [ equalize ] MP_ALGO := { rr | drr | random | wrandom } NHFLAGS := [ onlink | pervasive ] RTPROTO := [ kernel | boot | static | NUMBER ]
見難いのは変わりないか。
■ [dev][howto] autotoolsでprefixの値をプログラムに静的に組み込む
先週メモした、config.hにインストール先ディレクトリパスを埋め込む方法には問題があることが分かった。configure実行時に--prefixオプションを指定すれば動くが、指定しないと定数の値が "NONE" に設定されてしまう。
configureスクリプトを読むと、#defineの行を出力した後で変数prefixにデフォルト値(/usr/local)を代入しており、このアプローチではうまくいきそうにない。どうすればいいのか。
というFAQが書かれていた。読んでもよく分からなかったのだけれど、単純にAC_DEFINE_UNQUOTEDを使うのではダメだということが書かれているのだと思う。
なので、次のようにした。
- 前に書いたAC_DEFINE_UNQUOTEDの指定は削除。
- Makefile.am 内に AM_CPPFLAGS という行があったので、ここに「-DPREFIX_DIR='"@prefix@"'」というような記述を追加。
これでautomake, autoconfをやり直すと、configure実行時に--prefixを指定してもしなくても、PREFIX_DIRにprefixの値が設定されるようになった。
2009年01月21日(水) [長年日記]
■ [security] 情報漏洩リスクへの対処方法についてのメモ
ちょっと気になることがあったのでメモ。
- 使用禁止ソフトを一生懸命周知しているが、その労力は正しいセキュリティ情報の周知に注ぐべき。
- 周知側が「独自証明書によるhttpsサイトのため、ログイン時にエラー表示のような画面が表示されますが、心配ございません。」と言っているようではどうしようもない。
- ソフトウェアが無償かどうかと情報漏洩リスクは無関係だ。
■ [unix][net][howto] /etc/network/interfaces に書くこと
IPアドレスの設定などを行いたい場合、Redhat系のLinuxでは /etc/sysconfig/network-scripts/ifcfg-ethXXX を編集すればよく、これは以前にメモした。
Debian系だとこのファイルはなく、代わりに /etc/network/interfaces を編集すればいいようなのでその書式をメモ。試したのはUbuntu 8.04。
eth0でDHCPを使いたい場合は、
iface eth0 inet dhcp
でできた。IPアドレスを指定したい場合は
iface eth0 inet static address 192.168.254.10 netmask 255.255.255.0 gateway 192.168.254.1
のように書けばいいみたい。
このファイルをうまく使えば魔法のような ネットワーク設定もできるようだがよくわかっていない。
参考
- 10.6 Debian での高レベルなネットワーク設定 (Debian リファレンス)
■ [unix][net][howto] LinuxでIP転送を有効にする
/proc を直接編集すればいいのかと思っていたらエラーになってしまった。なんでかな。
$ uname -a Linux kenichi-ubuntu 2.6.24-23-generic #1 SMP Thu Nov 27 18:44:42 UTC 2008 i686 GNU/Linux $ sudo echo 1 > /proc/sys/net/ipv4/ip_forward zsh: permission denied: /proc/sys/net/ipv4/ip_forward
同じことは sysctl コマンドを使えばできる。
$ sudo sysctl -w 'net.ipv4.ip_forward=1' net.ipv4.ip_forward = 1 $ cat /proc/sys/net/ipv4/ip_forward 1
2009年01月22日(木) [長年日記]
■ [howto][unix] sedで特定行の文字列を置換
sedもすぐに忘れるのでメモ。
「name=」で始まる行の後半部分を「oreore」に置換したい場合、次のようなsedスクリプトで実現できた。
/^name=/s/=.*$/=oreore/
sedのsコマンドはその前に「アドレス」を指定することで置換の対象行を絞り込めるので、それを正規表現で指定している。 実行例は次の通り。
$ echo "address=nippon\nname=tanaka\nnumber=12345" | sed '/^name=/s/=.*$/=oreore/' address=nippon name=oreore number=12345
■ [howto][shell][net] ポートが開いているかをチェックするスクリプト
特定のポートが開いているかを調べる方法を考えたのでメモ。対象はLinux。
netstatが使えるかと思ったが、ポート番号を指定して調べるようなオプションは見当たらない。fuserコマンドが使えそうだったので、
if [ -n "`/sbin/fuser -n tcp 10000 2>&1`" ] ; then echo port is opened. else echo port is closed. fi
としてみた。これはTCPポート10000が開いているかを調べる例。
ただし、root以外のユーザで実行した場合は、自分以外のユーザが開いているポートは調べられないので注意。rootで実行すれば調べられる。
参考
- Manpage of FUSER (JM)
2009年01月30日(金) [長年日記]
- 中尾明慶が大江さんに似ていると思った。
- 以前は新沼くんが中村憲剛に似ていると思っていたが今は似ていない。今は山下智久に似ていると思う。
■ [java] クラスパスからプロパティファイルを読み込む
クラスパス上にあるプロパティファイルを読み込む処理をたまに実装するが、すぐにやり方を忘れてしまうのでメモ。
基本的には、
- Class#getResourceAsStream()を使ってファイルに対するストリームを取得し、
- Properties#load()を使って読み込む
とすればいい。このとき、getResourceAsStream() の引数に指定するリソース名の先頭には「/」を付与する。 クラスローダの構成が複雑な場合は気を付けることがあった気がするが、今は思い当たることがない。
Javaのドキュメントの次のページに説明がある。
- 位置に依存しない方法でのリソースへのアクセス (リンク切れ → http://docs.oracle.com/javase/jp/7/technotes/guides/lang/resources.html)
以下にサンプルプログラムと実行例を示す。
(追記)
「getClass().getResourceAsStream("/test.properties")」と書いていたら、FindBugsに
this.getClass().getResource(...) の呼び出しは、別のパッケージに継承クラスがある場合には、予期しない結果をもたらす可能性があります。
と注意されてしまった。気にしなくていいケースもあるだろうが、重要なファイルを読み込む場合は注意が必要だ。対処方法のアドバイスは表示されなかったが、
- クラスをfinalにし継承できないようにする
- getClass()は使わず明示的にクラス名を指定する
などとする必要がありそう。以下のサンプルは後者の方法で修正した。
package sample; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.Properties; public class PropertiesLoader { public static void main(String[] args) throws IOException { PropertiesLoader loader = new PropertiesLoader(); Properties props = loader.load(); for (Map.Entry<Object, Object> entry : props.entrySet()) { System.out.printf("%s = %s%n", entry.getKey(), entry.getValue()); } } public Properties load() throws IOException { //InputStream in = getClass().getResourceAsStream("/test.properties"); InputStream in = PropertiesLoader.class.getResourceAsStream( "/test.properties"); if (in == null) { throw new FileNotFoundException(); } try { Properties props = new Properties(); props.load(in); return props; } finally { in.close(); } } }
$ tree --noreport . |-- class | `-- sample | `-- PropertiesLoader.class `-- etc `-- test.properties $ cat etc/test.properties name = oreore lang = java os = CentOS $ java -cp class:etc sample.PropertiesLoader name = oreore os = CentOS lang = java
● ef [小さなことですが 172.32.0.0/12 は private net ではありません。]
● 小川 [そのようですね。ご指摘ありがとうございます。 当時なぜこのネットワークアドレスを採用したのか思い出せませんが、次か..]