Java は結構面白いな。ブラウザクラッシュしたらスマン(^^;
このブログの文字コードはEUC-JP、Appletの中身の文字コードはUTF-8で書いたけど、linuxのfirefoxだとちゃんと見えてる。
Appletの文字コードはEUC-JPになってるのかな?一体、どうなってんだろ?
【追加開始】
コードよく見たら、Graphicsクラスだよ(笑)。
表示された文字はイメージだから、文字コード関係ねー
【追加終了】
I know who Iam.
Java は結構面白いな。ブラウザクラッシュしたらスマン(^^;
このブログの文字コードはEUC-JP、Appletの中身の文字コードはUTF-8で書いたけど、linuxのfirefoxだとちゃんと見えてる。
Appletの文字コードはEUC-JPになってるのかな?一体、どうなってんだろ?
【追加開始】
コードよく見たら、Graphicsクラスだよ(笑)。
表示された文字はイメージだから、文字コード関係ねー
【追加終了】
proxyを動かそうと思い、
sudo a2enmod proxy proxy_http proxy_ftp proxy_connect
とかやって、
/etc/apache2/mods-available/proxy.conf で
1 |
ProxyRequests On |
1 2 3 4 5 6 7 |
<Proxy *> AddDefaultCharset off Order deny,allow Deny from all Allow from localhost Allow from 192.168 </Proxy> |
と設定したが、ブラウザのproxy指定でlocalhostと指定すると、Access deniedとか言われる。
1 |
Allow from localhost |
を
1 |
Allow from 127.0.0.1 |
とやって、proxy設定を127.0.0.1とやるとOK。
noizumi@bluewolf:~$ nslookup localhost
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
Name: localhost
Address: 127.0.0.1
だし、別におかしいところは無いとは思うが、
noizumi@bluewolf:~$ telnet localhost 80
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
GET http://www.noizumi.org/
だと、デナられる。
noizumi@bluewolf:~$ telnet 127.0.0.1 80
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
GET http://www.noizumi.org/
127.0.0.1の指定だと何ともない。
WHY?
で、今結果を見ていてハタと気がついた。
答えは /etc/hosts の中にあった。
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ipv6か。
ipv4の localhost とipv6の localhost は別物なのねん。
フルバージョンアップした。リビングキットを使い、スマートループ利用者は、インターネットからファイルを取得して無料でバージョンアップできるから、利用しない手はない。
予約制で、予め予約しておいて、その時間帯にバージョンアップしろという事で、先週予約したら、かなり予約が埋まっていて、今日になった。
アップデートマネージャというツールでバージョンアップするのだが、ネットからバージョンアップファイル11GBをダウンロードして、ナビのブレインユニットに転送するというバージョンアップ手順。
予想所要時間36時間49分とか出てて(゜Д゜)ハァ?という感じ。
ダウンロードが11:00から開始して、22:10頃終了。実際には11時間10分程度だった。
「ダウンロード転送を同時に行う」にチェックを入れていたので、ダウンロード終了毎にブレインユニットへの転送を行っていたが、これをやっていなかったら日付が変わっていただろう。
mplayerとかVLCでDVDは再生できているが、動画プレーヤーのtotemで映像が出るのに音が出ない。
Ubuntuのフォーラムに書いてあった
sudo wget http://www.medibuntu.org/sources.list.d/jaunty.list –output-document=/etc/apt/sources.list.d/medibuntu.list sudo apt-get update && sudo apt-get install medibuntu-keyring && sudo apt-get update sudo apt-get install w32codecs libdvdcss2 non-free-codecs
対策を実施するも、やっぱりtotemで音が出ない。
まあ、動画プレーヤーのDVD再生だけだからいいけど。
~/.mozilla と ~/.mozilla-thunderbird のディレクトリをRAMDISK化。
これも、再起動、または、シャットダウン時に書き戻す。FirefoxのWebページ閲覧時に、USB MemoryのLEDがチカチカしていたのが無くなった。
今の所、書き戻しているのは、
/var/log
/var/cache
~/.mozilla*
で、rsync -a –delete …でやっているのだが、実は、昨日、/var/caheの書き戻しに失敗し、全部消えてログイン出来なくなった(笑)
/var/cache をRAMDISK化するのは、インストールしたパッケージを残す設定にしていたりすると、非常に大量の容量を必要とするから、実メモリが少ないマシンは要注意。
/etc/sysctl.conf へ
vm.dirty_writeback_centisecs = 360000
を追加。遅延書き込み1時間 😀
/etc/init.d/mountall.sh と /etc/init.d/umoutfs を変更。
/etc/fstab で手を入れたのは次の通り
UUID=0c3d26d3-43e3-4291-b618-18c9a3659ccf / ext3 noatime,errors=remount-ro 0 1
/dev/shm /ramdisk tmpfs defaults 0 0
/dev/shm /tmp tmpfs defaults 0 0
root file system の relatime を noatime にして、アクセスタイムのディスク書き込みをしないようにしている。
そして、/tmp をスクリプトで設定するんじゃなくてfstabでやるようにした。
/ramdisk はUSBメモリに書き戻すデータの置き場所にしようかと考えているが、遅延書き込み周期を長く取ったので、要らないかな?
ユーザのホームディレクトリに作られるアプリケーションの設定ファイルの書き込みが困ったもので、現状だと、ログイン時にRAMDISKに移動させてシンボリックリンク貼りまくりという愚策しか思い付かん。
なので、今のところは個別アプリで、ディスクアクセスの多そうなものの設定を弄って、遅くて書く度に寿命が縮まるUSBメモリへの書き込みをできるだけ回避している。
Tunderbird は、IMAPのアカウントで使っているが、そんなに沢山のメールを貯めていないから、サーバ設定の「メッセージの保存先」を /tmp/noizumi に設定。
IMAPの場合、「メッセージの保存先」にサマリーを生成するだけなので、揮発しても次にマシン再起動した際に若干時間が掛かる程度なので、特に問題は無い。
ROM RAM ベースで動かすと、古いマシンでも充分快適に動くな。
RUF2-P8G-BKにUbuntuを入れようと試みるが、USB起動ディスクで作ると、サイズは700MB程度とコンパクトで良いのだが、ISOイメージを入れてくれるのとRead Only Mountなので、アップデートとかできない。
普通にインストールしたが、このままでは、書き込みが多いlogとかtmpとかのディレクトリのせいで、Flash ROMがすぐ死んでしまいそう。
そこで、RAMディスクに頻繁に書き込みのあるディレクトリを割り当て、Flash ROMの急速な劣化をさける対策をした。
rootファイルシステムは、noatimeオプションでマウント。
/etc/init.d/mountall.sh
case “$1″ in
start|””)
do_start
mkdir -p /mnt/tmp
mkdir -p /mnt/log
mount -t tmpfs /dev/shm /mnt/tmp
mount -t tmpfs /dev/shm /mnt/log/usr/bin/rsync -a /var/log /mnt
mount –bind /mnt/tmp /tmp
mount –bind /mnt/log /var/log
chmod -R 1777 /tmp
;;
/etc/init.d/mountall.sh
stop)
umount -l /tmp
umount -l /var/log
/usr/bin/rsync -a –delete /mnt/log/ /var/logdo_stop
;;
/var/log はシャットダウンや再起動時にrsyncで書き戻す。
/tmpはそのまま揮発していただく。
最初、mount –move でやろうとしたが、umount時にRAMディスクが消えて無くなるので、書き戻せず、–bindでマウントした。
結構いい感じだが、やはり/homeの細々とした書き込みのせいで、時折、重たくなる事もある。 今のマシンはメモリ768MBしか無いから、これはさすがにRAMディスクに持っていくのはヤバい。
LinuxのRAMディスクの/dev/shmはデフォルトで、最大実メモリの半分までのサイズを持ち、実メモリの使用が増えると縮んでくれる優れもの。
実メモリの使用が増えて、RAMディスクの実使用サイズを脅かすようになるまで、稼動させた事は無いが、こういうクリティカルなケースになったら、RAMディスクのマウントが外れるのかな?
社内メールサーバに障害が起こっていたが、Cyrus IMAPdのDBのログのownerがrootになっていて書けないという原因だった。
/etc/init.d/cyrus-imapd stop
chown cyrus.imap /var/lib/imap/db/*
/etc/init.d/cyrus-imapd start
とやって、 再びstartさせたら治ったが、ログを見る限りでは、DBのログローテーションタイミングで、ctl_cyrusdbが新たに作成したログへの書き込みに失敗しているという感じ。
Web検索すると、Macの事例がちょこっと読めたりするのだが、英語のメーリングリストまで当たってみても、具体的にどういう対策を採れば解決するのかという情報は皆無で、バージョンは今2.2.12だが、2.3.xに上げたとしても直る保証がない。
何しろ、DBのログローテーションのタイミングで起こるので、よっぽど大量のメールを処理してても滅多に起こるものでもない。しかし、休日に呼び出されるのも嫌なので、ログを監視して自動復旧するツールを作った。
昔、perlでpppのログ監視して、pppが切断されたら再upとか、PCMCIAのAirH”カードを再初期化するツールを作っていたので、その応用で、maillogを監視し、ctl_cyrusdb\[\d+\]:.*DBERROR.*Permission denied ってのに反応するようにした。
Cyrus のdeliverはIMAPdでスプールできないと/var/spool/mailに落としてくれるので、
formail -d -s sendmail hoge</var/spool/mail/hoge
とかやると、落っことしたメールを再配送できる。
監視ツールでは、この再配送までを自動でやるようにしてはいるが、実際に障害が起こらないとうまく動くかは分からないんだなこれが(笑)
Cyrus IMAPdと腐れExchange Serverのメールをバックアップアカウントへ合成コピーした時に、腐れExchange Serverのメールがダブるので、それを消すツールを作った。
こういうちょいとしたツール作りは楽しい:-)
まあ、普通のまともなメールサーバーなら、Message IDが同じだとメールの同一性は保証されていて、Cyrus IMAPdへスプールしてもインテリジェントにduplicate markを付けて、冗長な同じメールは実データとして格納しないはずだ。
しかし、腐れExchange ServerとOutlookは意味の無いReceivedヘッダをわざわざ追加し、winmail.datとかいう何の役にも立たないゴミを付加してくれるので、さすがのCyrus IMAPdも別のメールとしか見てくれないようだ。
「簡単」と素人を騙して売りつけ、実は制御不能の腐れExchange Serverなんぞ相手にしていなければ、作る必要の無いツールな訳だが、まあ、問題解決のプロセスを考えるのが面白いからよかろう。
で、最初、PHPで組んだ時に、UIDがキーの連想配列にMessage IDを格納して、array_unique()という簡単な処理で、ダブってないMessage IDのリストが作れ、array_diffで、削除すべきメールのリストがすぐ作れた。
だが、盲点は、消されるのはダブっているメールの一方であって、必ずしも腐れExchange Serverのゴミメールじゃないという事だ。
そこで、imap_fetch_overview()で取得したサイズも配列に格納し、array_multisort()で、UID、Message ID、Sizeのそれぞれの配列をソートする。
すると、リストで、ダブっているMessage IDのトップは必ずサイズの小さいものとなり、array_unique()で生き残るのは一番最初に見つかったものなので、サイズの大きいメールが駆逐されるというアルゴリズムにした。
これで完璧だ:-D
しかし、マイクロソフトのもたらす後戻り工数って、全世界規模だとどれくらいの損害額なんだろうなあ。
ファイルアップロードスクリプトが正常に動いているか、時折、ログを観察しているのだが、以前、ファイルの二重送信が原因と思っていたログパターンがまた現れた。
以前は、そのログを見て、送信ボタンの二度押しでの二重送信はJavaScriptで封じたのだが、また起こったという事は別の要因がある。
サーバログを見ると、400 BadRequestになっていた。
うーむ…、cookie関係か?二重送信っぽいので、ブラウザ2つ開いて、それぞれで送信したらどうなるんだろ?と、試験してみるとアウト!
そう言えば、セッション名は特段設定してないので、2つのブラウザで送信したら、片方が完了した時点でセッション変数は全滅するな(笑)。
という事で、セッション名を設定する事で、ブラウザ何個開いて送信しようが大丈夫になった。しかし、cookieファイルが増大していく…
cookieファイルを期限切れで破棄にするには、「アップロードが成功しました」と表示するスクリプトのヘッダ部分で、Set-Cookieを設定してブラウザに食わせてやらねばならない。
しかし、元々のあったものが、cookieの明示的な削除をして無くて、複数セッション利用時の事も全く考慮されておらず、セッション破棄の前に、色々とHTMLを表示してしまっている。
その為、いざ、cookieファイルを消そうとすると、パラメータの渡し方からロジックを洗い直さなければならず、構造からやり直しという事になる(–;
しかし、昔のわしなら、お客様の使用法を想定して、ブラウザを複数開いてファイル送信なんて事は事前に思いついたのだが、問題が起こるまで分からんというのは退化してきたのかのう。
まあ、言い訳をさせて貰うと、すでに運用されているスクリプトで、そういう事態が今まで問題に成らなかった訳が無いという思い込みがあったな。