2012年5月31日木曜日

ppBlog: 写真のアップロードから動かなくなる

写真のアップロードがとても重たい。
そもそもルータに対してやらせる処理ではないということは明らかですけど(笑)
最初は時間がかかりすぎて処理が止まって編集画面がうんともすんとも言わなくなり勘でタイムアウトかな?ということで/etc/php.ini のmax_execution_timeoutの設定値を30→300に変更しました。
アップロードは行われるようになったのですが、やはり時間が…。
luciの表示が行われなくなるのでターミナルからtopを叩いて直接見てみると。
Mem: 28296K used, 1132K free, 0K shrd, 128K buff, 2944K cached
CPU:  99% usr   0% sys   0% nic   0% idle   0% io   0% irq   0% sirq
Load average: 1.10 0.69 0.45 2/49 8774
  PID  PPID USER     STAT   VSZ %MEM %CPU COMMAND
 8774  1435 root     R    40808 139%  97% /usr/bin/php-cgi /www/blog/upload.php
 1443  1442 root     S     5096  17%   3% motion
 4017  2378 root     R     1380   5%   0% top
 1438     1 root     R     5096  17%   0% motion
 1444  1442 root     S     5096  17%   0% motion
 1442  1438 root     S     5096  17%   0% motion
 1476     1 root     S N   2632   9%   0% smbd -D
 1478     1 root     S     2132   7%   0% nmbd -D
 1487     1 nobody   S     1960   7%   0% proftpd: (accepting connections)
 1006     1 root     S     1516   5%   0% wpa_supplicant -B -P /var/run/wifi-wl
  387     1 root     S     1500   5%   0% syslogd -C128
 2378  2377 root     S     1392   5%   0% -ash
 1279     1 root     S     1388   5%   0% udhcpc -t 0 -i wlan0 -b -p /var/run/d
    1     0 root     S     1384   5%   0% init
  367     1 root     S     1384   5%   0% init
  529     1 root     S     1380   5%   0% udhcpc -t 0 -i eth1 -b -p /var/run/dh
 1498     1 root     S     1380   5%   0% watchdog -t 5 /dev/watchdog
  369   366 root     S     1376   5%   0% logger -s -p 6 -t sysinit
  366     1 root     S     1376   5%   0% /bin/sh /etc/init.d/rcS S boot
  389     1 root     S     1372   5%   0% klogd
こんな感じでメモリーも完全にスワップアウトしてシステムがロックしてる感じになってしまいます。
アップロードのオプションでリサイズ指定があるのがあるのに指定しても使用量は小さくなりません。
ソースを見ていませんが、一度jpegをメモリー展開してから処理に入っている感じがします。
とりあえず画像の扱い方を内部展開しないでファイルとしてそのまま処理できるように改良するのがよいのかも。

参考
PHPのタイムアウト対策 http://kikky.net/pc/php_timeout.html

2012年5月28日月曜日

D850GB ビープ音が鳴ってOSが起動しなくなった

ちょっとコンセントを抜いてしばらく経ってから差し込んでみると、本体からビープ音が鳴り続けて画面はBIOSの初期画面(この頃のものは起動時の画面が段々派手になっていった)が表示されたままHDDからの読み込みが行われなくなった。

最初はキーボードがおかしいだけかと思って抜いてみても効果なし。
あとはMBのバックアップバッテリが怪しい気がします。

インテルのページでは次のように書かれていました。
インテル® デスクトップ・ボード D850GB: ビープ音が鳴り続け、システムが起動しない (映像出力も行なわれない)
ビープ音が鳴り続け、システムが起動しない (映像出力も行なわれない) 場合、ビープ音が鳴る回数を確認することで、POST (Power On Self Test) 時に発生した問題が判ります。
ビープ音で表現されるエラー・コードは、下記のリストを参照してください。
なお、いくつかのエラー・コードは RAM に関連しています。
RAM に関するエラーが発生している場合、まずシステム・メモリと必要な全ての CRIMM* (Continuity RIMM*) モジュールが正しく装着されているか、また RIMM モジュールが インテル® デスクトップ・ボード D850GB のテスト済みメモリ・リストに挙げられているかを確認してください。

ビープ音によるエラー・コード

  1. リフレッシュに失敗しました
  2. パリティがリセットできません
  3. 64KB のメモリ領域を確保できません
  4. システム・タイマ・エラー
  5. 未使用
  6. 8042
  7. 割り込みエラー
  8. メモリのリード / ライト エラー
  9. 未使用
  10. レジスタ・テスト・エラー
  11. BIOS データが不正 (例: POST 用のモジュールが見つからない)
http://www.intel.com/jp/support/motherboards/desktop/d850gb/beep.htm
と、言うことらしいですがちょっとよくわかりません。

全般的なインテルのマザーボードではこのようになっているらしいです。
デスクトップ・ボード
BIOS のビープ音コード

このページは、システム起動時に ビープ音が鳴り、正常に起動完了しない場合のトラブルシューティングに使用してください。
現行デスクトップ・ボードのビープ音
ビープ音 / 点滅の状態 シーケンス / パターン 意味 システムが起動 / 終了できない場合のトラブルシューティング手順
ビープ音 1 回 長く継続するビープ音 外付けグラフィックス・カードに補助電源が接続されていない場合がある 取り付けられている外付けグラフィックス・カードの説明書で、補助電源の接続に関する情報を参照してください。
ビープ音 2 回 ビープ音、ビープ音 [中断]、ビープ音、ビープ音

その後に BIOS の起動が継続します。
ビデオが検出されません
  • アドイン・グラフィックス・カードを使用している場合、そのカードを差し直してください。
  • 互換性のあるプロセッサーが取り付けられていることを確認してください。
関連トピック:
起動中ビープ音が 2 回鳴り画面が表示されない
インテル® プロセッサーおよびボードの互換性ツール
ビープ音 3 回 ビープ音、ビープ音、ビープ音 [中断]

このパターンのビープ音は、システムをオフにするまで続きます。
メモリーエラー
  • メモリーを挿し直してください。
  • メモリーとソケットのコンタクト部分に汚れやごみがないか確認してください。
  • 複数のメモリーを取り付けている場合、一度取り外して確認してください。(システムによってはバンク 0 にメモリー・モジュールを取り付けなければならない可能性があります。)
  • RAM を使用している場合には、同じメーカーの同じ部品番号、転送速度の製品である事を確認してください。
  • 他の正常に動作しているシステムに、メモリーを使用して正常に動作するか確認してください。
高 / 低のビープ音 ビープ音のパターン:
高、低、高、低、高、低、高、低

高低それぞれのビープ音に対応してフロントパネル LED が合計 16 回点滅します。
CPU 温度エラー
  • プロセッサーのヒートシンク / ファンが正常に取り付けられていることを確認してください。
  • サーマル・インターフェイス・マテリアルが十分均一に塗布されていることを確認してください。
過去のデスクトップ・ボードのビープ音
ビープ音 / 点滅の状態 意味
長いビープ音 1 回、短いビープ音 2 回 ビデオ構成エラー (ビデオカードの故障またはビデオが付けられていない) または外付け ROM モジュールのチェックサムが正常に 0 にならない
1 更新エラー
2 パリティーがリセットできない
3 先頭 64K のメモリーエラー
4 タイマーが動作していない
5 プロセッサー・エラー (予約、未使用)
6 8042 GateA20 をトグルできない (メモリーエラーまたはメモリーがない)
7 例外割り込みエラー
8 ディスプレイ・メモリー R/W エラー
9 (予約、未使用)
10 CMOS シャットダウン登録テストエラー
11 BIOS 無効 (POST モジュールが見つからないなど)
http://www.intel.com/jp/support/motherboards/desktop/sb/cs-010249.htm?wapkw=%28%E3%83%93%E3%83%BC%E3%83%97%E9%9F%B3%29


2012年5月24日木曜日

そうかmountという手があったのか

今までも何度も困ったことが多かったのでproftpdならできるだろうと思ったらできませんでした。

ほんとに色々調べたのですが解決策が一向にうまく行かなく途方にくれていましたがようやく解決できそうです。
一体何が?という話ですが、具体的に
/
+--home/
|  +--siriuth/
|     +--dev/
|        +--openwrt/
|           +--backfire_10.03.1
+--srv/
   +--ftp/
      +--(ここにbackfire_10.03.1の内容を見せたい)
と、たったこれだけなのですが、シンボリックリンクを作成してもアクセスできないとか。
proftpdに接続後、chrootされてftpがrootとなっているのでそれより上位のディレクトリにはアクセスできない設定になっているので、当然といえば当然なのですができれば公開してほかのPCからいつでも参照できるようにしておきたいという欲求があります。

現状では単純にファイルコピーなどで適当に回避したりしていますがやはりスマートな対応じゃありません。

chrootで内容を見せたい階層群に設定すればいいのですが、複数に分散されたり開発環境と公開環境でディレクトリ構成が異なる場合などの対応がとれないわけで、ほんとに何とかならないかと感じていました。

いままでもwebサーバーでこのようなジレンマが多かったのですが小手先で切り抜けてたり割り切ってしまったりで逃げていましたが今回こそはと粘りに粘り調べた結果
「mount」すればいいんだよ と。

 なるほど!という感じでその言葉でストンと解決できました。
予め内容を見せたい部分にフォルダを作成(今回は/srv/ftp/backfire/10.03.1を作成)して
sudo mount -B /home/siriuth/dev/openwrt/backfire_10.03.1 /srv/ftp/backfire/10.03.1
再起動後にもmountさせるためには多分fstabとかに設定しなければならないとは思いますが、大筋でこれで完了です。

VMが悪いのかUbuntuが悪いのかそれともPC?

日本語入力へ切り替えるときにどうも調子が悪い。
顕著に現れるのがやはりブラウザで、書き込むときに切り替えが頻繁だからですが。

実際には他のタイミングでも多発していて最初は半角/全角キーだけでは切り替わらないのかと思ってALT+半角/全角にしても状況は変らず。

Ubuntuのデフォルトの画面だと右上のほうにキーボートのアイコンみないな表示をクリックすると入力切替や設定ができるので見てみると切り替えにCTRL+SPACEキーというのもあるらしい。
で、CTRL+SPACEで切り替えてみても状況は変わらず。

さらには切り替えた直後に入力して確定させてもそのまま消えてしまうとか…。

入力で消えてしまうのは切り替えた直後は少し間を空けると正しく入力ができるようですが、入力の切り替えはどうにもこうにも回避策が無くて困っています。

気づくと入力切替がちらついて何度も切り替えてる状態に陥っている場合もある様です。

現状ではVMが悪さをしているとしか思えないのですが何か改善策は無いのだろうか?

2012年5月23日水曜日

proftpd

vsftpdをアンインストールできたと思うので適当に
sudo apt-get install proftpd
とかやってみました。
パッケージの設定                                                               
                                                                               
                                                                               
 ┌─────────────────────────┤ ProFTPD configuration ├─────────────────────────┐ 
 │ ProFTPD は、inetd 経由のサービスとして実行することもできますし、 スタン   │ 
 │ ドアローンのサーバとしても実行できます。どちらにもそれぞれ利点があります  │ 
 │ 。1日に数回の ftp アクセスしかない場合は、資源を節約するために ProFTPD    │ 
 │ を inetd から起動するのが良いかも知れません。                             │ 
 │                                                                           │ 
 │ 一方、頻繁なアクセスがある場合は、接続ごとに新規プロセスが生成されるのを  │ 
 │ 避けるため、ProFTPD をスタンドアロンサーバとして動作させるべきです。      │ 
 │                                                                           │ 
 │ proftpd の起動方法:                                                       │ 
 │                                                                           │ 
 │                              inetd 経由                                   │ 
 │                              スタンドアロン                               │ 
 │                                                                           │ 
 │                                                                           │ 
 │                                  <了解>                                   │ 
 │                                                                           │ 
 └───────────────────────────────────────────────────────────────────────────┘ 
                                                                               
                                                                               
                                                                               
こんな画面が表示されopenwrtで敬遠されているようなスーパーサーバーの利用を選択できるようです。

root@ubntu-VirtualBox:/# sudo apt-get install proftpd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています               
状態情報を読み取っています... 完了
注意、'proftpd' の代わりに 'proftpd-basic' を選択しています
提案パッケージ:
  proftpd-doc proftpd-mod-mysql proftpd-mod-pgsql proftpd-mod-ldap
  proftpd-mod-odbc proftpd-mod-sqlite openbsd-inetd inet-superserver
以下のパッケージが新たにインストールされます:
  proftpd-basic
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 439 個。
2,108 kB のアーカイブを取得する必要があります。
この操作後に追加で 4,391 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu/ oneiric/universe proftpd-basic i386 1.3.4~rc2-4 [2,108 kB]
2,108 kB を 4秒 で取得しました (437 kB/s) 
パッケージを事前設定しています ...
未選択パッケージ proftpd-basic を選択しています。
(データベースを読み込んでいます ... 現在 132678 個のファイルとディレクトリがインストールされています。)
(.../proftpd-basic_1.3.4~rc2-4_i386.deb から) proftpd-basic を展開しています...
ureadahead のトリガを処理しています ...
man-db のトリガを処理しています ...
proftpd-basic (1.3.4~rc2-4) を設定しています ...
警告: 指定されたホームディレクトリ /var/run/proftpd にアクセスできません。:そのようなファイルやディレクトリはありません
システムユーザ `proftpd' (UID 114) を追加しています...
新しいユーザ `proftpd' (UID 114) をグループ `nogroup' に追加しています...
ホームディレクトリ `/var/run/proftpd' は作成しませんでした.
システムユーザ `ftp' (UID 115) を追加しています...
新しいユーザ `ftp' (UID 115) をグループ `nogroup' に追加しています...
ホームディレクトリ `/srv/ftp' を作成しています...
`/usr/share/proftpd/templates/welcome.msg' -> `/srv/ftp/welcome.msg.proftpd-new'
ProFTPD warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration.
root@ubntu-VirtualBox:/# 
 /etc/proftpd/proftpd.confの Anonymousのコメント部を解除。
スーパーサーバーのはずなので…
外部から接続してもつながりません(笑)

なんのせっていがひつようだったっけかなと。

 /etcを見たところinetdやxinetdの姿が見えないのでxinetdを入れてみました。
 root@ubntu-VirtualBox:/# sudo apt-get install xinetd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています              
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  xinetd
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 439 個。
121 kB のアーカイブを取得する必要があります。
この操作後に追加で 397 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu/ oneiric/main xinetd i386 1:2.3.14-7ubuntu4 [121 kB]
121 kB を 0秒 で取得しました (219 kB/s)
未選択パッケージ xinetd を選択しています。
(データベースを読み込んでいます ... 現在 132772 個のファイルとディレクトリがインストールされています。)
(.../xinetd_1%3a2.3.14-7ubuntu4_i386.deb から) xinetd を展開しています...
ureadahead のトリガを処理しています ...
man-db のトリガを処理しています ...
xinetd (1:2.3.14-7ubuntu4) を設定しています ...
xinetd start/running, process 1747
 たしかサービスごとに設定するはず。検索してみました(笑)
 http://www.turbolinux.com/support/document/knowledge/466.html
多分、/etc/xinetd.d/ftpファイルを作成して再起動すればいけるはず?
とりあえずとりあえず接続することが出きるようになりました。

パッケージの削除

先日VMでコンパイルしたものを外部から参照させて実機にインストールしようとしていたのですが、vsftpdでは簡単に内部の特定のディレクトリを簡単に公開できないようなのでアンインストールしようかと思ったのですが、どうすればよいのやら(笑)

「Ubuntu パッケージ アンインストール」 で検索してみました。

検索した結果このページで何となく書いてあったので早速実行。
root@ubntu-VirtualBox:/srv/ftp/openwrt# sudo apt-get remove vsftpd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています               
状態情報を読み取っています... 完了
以下のパッケージは「削除」されます:
  vsftpd
アップグレード: 0 個、新規インストール: 0 個、削除: 1 個、保留: 439 個。
この操作後に 467 kB のディスク容量が解放されます。
続行しますか [Y/n]? y
(データベースを読み込んでいます ... 現在 132724 個のファイルとディレクトリがインストールされています。)
vsftpd を削除しています ...
vsftpd stop/waiting
ureadahead のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
man-db のトリガを処理しています ...
これでうまくアンインストールできたのでしょうか?

2012年5月22日火曜日

uhttpd option index_pageの複数のファイル名への対応

最初は/etc/config/uhttpdの設定ファイルを変更してrestartさせたり、/etc/init.d/uhttpdの起動スクリプトを変更してみたり右往左往していましたが、根本的な原因がわかってからコンパイルができるようになるまでにかなりの時間を要しましたが、実際に修正して対応するまでには約1日程度。
動作確認できるようになるまでに数時間という感じで手間はかかりましたがようやく満足できる内容になりました。

そもそもwebサーバーのインデックスページの指定が内部だと4つ持っているのに指定は1つとかかなり作りはマニアックな雰囲気なサーバーですね(笑)

修正方針としては
・暫定的なテストプログラムでc言語の動作確認。
・実際に作ったコードを組み込む作業。
・コンパイル/テスト
の3段階。

意外とネックなのが最後の段階で、現状VMからどうやってファイルを転送すればよいかということ。

最初は単純にVM側でftpサーバーなりwebサーバーを動かせばいいかなとおもったのですが、VirtualBoxでこれを行おうとするとそれなりに面倒なことになってそうでした。
ifconfigで見てみるとIPアドレスが10. で始まっているという。
びっくりしたのですが、どうやらViurtualBoxがルータとなってVMにはその内部LANで動作するという形になっているようです。いくつか設定方法があるのですがよくわからず。
ブリッジとかならうまく表に出てくるのかな?(→普通のPCと同じようにIPアドレスを取得して振舞うようになりました(笑))

コンパイル/テストは実際に動作させてるのですが。最初は出来上がった実行ファイルだけ入れればいいかなと思ってたんですが、実行ファイルがどこに作成されるのかがわからないという(笑)

結果 make で全部をコンパイルして
siriuth@ubntu-VirtualBox:~/dev/openwrt/backfire_10.03.1$ make
 make[1] world
 make[2] target/compile
 make[3] -C target/linux compile
 make[2] package/cleanup
 make[2] package/compile
 make[3] -C package/iproute2 compile
 make[3] -C package/6in4 compile
 make[3] -C package/6to4 compile
 make[3] -C package/wireless-tools compile
 make[3] -C package/acx compile
 make[3] -C package/arptables compile
 make[3] -C package/opkg host-compile
 make[3] -C package/base-files compile
 make[3] -C package/hotplug2 compile
 make[3] -C package/block-mount compile
 make[3] -C package/block-extroot compile
 make[3] -C package/linux-atm compile
 make[3] -C package/br2684ctl compile
 make[3] -C package/bridge-utils compile
 make[3] -C package/busybox compile
 make[3] -C package/button-hotplug compile
 make[3] -C package/libpcap compile
 make[3] -C package/ppp compile
 make[3] -C package/comgt compile
 make[3] -C package/compcache compile
 make[3] -C package/libnl-tiny compile
 make[3] -C package/iw compile
 make[3] -C package/mac80211 compile
 make[3] -C package/crda compile
 make[3] -C package/libtool compile
 make[3] -C package/cyassl compile
 make[3] -C package/dnsmasq compile
 make[3] -C package/dropbear compile
 make[3] -C package/e2fsprogs compile
 make[3] -C package/ead compile
 make[3] -C package/ebtables compile
 make[3] -C package/fconfig compile
 make[3] -C package/iptables compile
 make[3] -C package/firewall compile
 make[3] -C package/fuse compile
 make[3] -C package/ncurses compile
 make[3] -C package/libreadline compile
 make[3] -C package/gdb compile
 make[3] -C package/gpioctl compile
 make[3] -C package/hostap-driver compile
 make[3] -C package/hostap-utils compile
 make[3] -C package/libipfix compile
 make[3] -C package/wprobe compile
 make[3] -C package/madwifi compile
 make[3] -C package/hostapd compile
 make[3] -C package/hostapd compile
 make[3] -C package/hostapd compile
 make[3] -C package/hostapd compile
 make[3] -C package/hostapd compile
 make[3] -C package/hostapd compile
 make[3] -C package/i2c-gpio-custom compile
 make[3] -C package/ifenslave compile
 make[3] -C package/ipset compile
 make[3] -C package/lua compile
 make[3] -C package/iwinfo compile
 make[3] -C package/kernel compile
 make[3] -C package/zlib compile
 make[3] -C package/kexec-tools compile
 make[3] -C package/libjson-c compile
 make[3] -C package/libnl compile
 make[3] -C package/libubox compile
 make[3] -C package/mmc_over_gpio compile
 make[3] -C package/uci compile
 make[3] -C package/mountd compile
 make[3] -C package/mtd compile
 make[3] -C package/nvram compile
 make[3] -C package/ocf-crypto-headers compile
 make[3] -C package/openssl compile
 make[3] -C package/opkg compile
 make[3] -C package/resolveip compile
 make[3] -C package/pptp compile
 make[3] -C package/px5g compile
 make[3] -C package/qos-scripts compile
 make[3] -C package/relayd compile
 make[3] -C package/robocfg compile
 make[3] -C package/siit compile
 make[3] -C package/spi-ks8995 compile
 make[3] -C package/spidev_test compile
 make[3] -C package/swconfig compile
 make[3] -C package/uboot-envtools compile
 make[3] -C package/udev compile
 make[3] -C package/udevtrigger compile
 make[3] -C package/uhttpd compile
 make[3] -C package/util-linux-ng compile
 make[3] -C package/w1-gpio-custom compile
 make[2] package/install
 make[3] -C package/base-files install
 make[3] -C package/busybox install
 make[3] -C package/button-hotplug install
 make[3] -C package/crda install
 make[3] -C package/dnsmasq install
 make[3] -C package/dropbear install
 make[3] -C package/firewall install
 make[3] -C package/hostapd install
 make[3] -C package/hostapd install
 make[3] -C package/hostapd install
 make[3] -C package/hostapd install
 make[3] -C package/hostapd install
 make[3] -C package/hostapd install
 make[3] -C package/hotplug2 install
 make[3] -C package/iptables install
 make[3] -C package/iw install
 make[3] -C package/kernel install
 make[3] -C package/libnl-tiny install
 make[3] -C package/mac80211 install
 make[3] -C package/mtd install
 make[3] -C package/opkg install
 make[3] -C package/ppp install
 make[3] -C package/swconfig install
 make[3] -C package/uci install
 make[3] -C package/udevtrigger install
 make[3] -C package/wireless-tools install
 make[2] package/rootfs-prepare
 make[3] package/preconfig
 make[2] target/install
 make[3] -C target/linux install
 make[3] -C target/sdk install
 make[3] -C target/imagebuilder install
 make[3] -C target/toolchain install
 make[2] package/index
出来上がった 最低限のファイルをftpサーバーに入れて(これも即席でfilezillaでftpサーバーを動かして(笑))/etc/opkg.confの設定を変えてopkg update。そこからopkg install uhttpd --force-reinstallで強制的にアップデートをかけてから/etc/init.d/uhttpd restartで再起動とかやってみました。(opkgのコマンドラインヘルプを見ると-o とか --offile-root で指定すればパッケージファイルから直接インストールもできそうですが、よくわからない…)


2012年5月21日月曜日

strncatを試してみました。

一般的な話は知らないのですが早速試してみました。
siriuth@ubntu-VirtualBox:~/dev/test$ cat strncat_test.c
#include    <stdio.h>
#include    <string.h>
void main(void){
    char    s1[256], s2[256];

    strcpy(s1, "1234567890");
    strcpy(s2, "abcdefghijklmnopqrstuvwxyz");

    printf("s1: %s \n", s1);
    printf("s2: %s \n", s2);
    strncat(s1, s2, 10);

    printf("after strncat s1: %s \n", s1);
}
 コンパイルも細かい点は完全に忘れてるので
gcc strncat_test.c
とだけ行ったところ a.out という実行ファイルが作られたので
./a.out
で実行(笑)
siriuth@ubntu-VirtualBox:~/dev/test$ ./a.out
s1: 1234567890
s2: abcdefghijklmnopqrstuvwxyz
after strncat s1: 1234567890abcdefghij
siriuth@ubntu-VirtualBox:~/dev/test$ 
となりました。
やはり第三引数の長さは第二引数の文字数の指定ですね。

uhttp…だいじょうぶなのだろうか(笑)

strncat

http://www9.plala.or.jp/sgwr-t/lib/strncat.html

ライブラリ関数の細かいところで何があるのか忘れてるのでリファレンス的な何かが無いかと検索したところなにやらstrncatの使い方が気になりました。

strncat(buffer, index_file, sizeof(buffer));

となっている部分。
これってbufferのサイズを超えてセットされませんかねぇ…
検索して引っかかったページの仕様とgccのライブラリの仕様が違うのかな?

どんな解釈が一般的だったかとかもあやしいのですけど。

delphiの解説で引っかかったページでは
#include <stdio.h>
#include <string.h>

void main(void)
{
 char *buf1="Borland";
 char buf2[]=" Delphi";
 
 strncat(buf1,buf2,strlen(buf2));
 printf("連結後:%s\n",buf1);
 getchar();

}
とかサンプルコードが載ってますけど、これこんなことしちゃいかんような(笑)
思いっきりリテラル領域を壊してる気がしますけどねw

いや…やりたいことは違うことなんですが。

vi

テキスト編集をしようとしたら [i] キーで入力してカーソルキーを押したら動作が変態的なことに…
AとかDとか表示されて改行されたり(笑)

さっそく「ubuntu vi コマンド」とかで検索してみると…
Ubuntu日本語フォーラム

$ sudo apt-get install vim
で幸せになれるとかで早速入れてみました。

vimとviって別物なんですね。
siriuth@ubntu-VirtualBox:~/dev/openwrt/backfire_10.03.1/package/uhttpd/src$ sudo apt-get install vim
[sudo] password for siriuth:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています               
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  vim-common vim-runtime vim-tiny
提案パッケージ:
  ctags vim-doc vim-scripts indent
以下のパッケージが新たにインストールされます:
  vim vim-runtime
以下のパッケージはアップグレードされます:
  vim-common vim-tiny
アップグレード: 2 個、新規インストール: 2 個、削除: 0 個、保留: 439 個。
7,371 kB のアーカイブを取得する必要があります。
この操作後に追加で 28.6 MB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://jp.archive.ubuntu.com/ubuntu/ oneiric-updates/main vim-tiny i386 2:7.3.154+hg~74503f6ee649-2ubuntu3.1 [373 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu/ oneiric-updates/main vim-common i386 2:7.3.154+hg~74503f6ee649-2ubuntu3.1 [86.5 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu/ oneiric-updates/main vim-runtime all 2:7.3.154+hg~74503f6ee649-2ubuntu3.1 [5,944 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu/ oneiric-updates/main vim i386 2:7.3.154+hg~74503f6ee649-2ubuntu3.1 [967 kB]
7,371 kB を 14秒 で取得しました (510 kB/s)                                                                     
(データベースを読み込んでいます ... 現在 130514 個のファイルとディレクトリがインストールされています。)
vim-tiny 2:7.3.154+hg~74503f6ee649-2ubuntu3 を (.../vim-tiny_2%3a7.3.154+hg~74503f6ee649-2ubuntu3.1_i386.deb で) 置換するための準備をしています ...
vim-tiny を展開し、置換しています...
vim-common 2:7.3.154+hg~74503f6ee649-2ubuntu3 を (.../vim-common_2%3a7.3.154+hg~74503f6ee649-2ubuntu3.1_i386.deb で) 置換するための準備をしています ...
vim-common を展開し、置換しています...
未選択パッケージ vim-runtime を選択しています。
(.../vim-runtime_2%3a7.3.154+hg~74503f6ee649-2ubuntu3.1_all.deb から) vim-runtime を展開しています...
'vim-runtime による /usr/share/vim/vim73/doc/help.txt から /usr/share/vim/vim73/doc/help.txt.vim-tiny への退避 (divert)' を追加しています
'vim-runtime による /usr/share/vim/vim73/doc/tags から /usr/share/vim/vim73/doc/tags.vim-tiny への退避 (divert)' を追加しています
未選択パッケージ vim を選択しています。
(.../vim_2%3a7.3.154+hg~74503f6ee649-2ubuntu3.1_i386.deb から) vim を展開しています...
man-db のトリガを処理しています ...
vim-common (2:7.3.154+hg~74503f6ee649-2ubuntu3.1) を設定しています ...
vim-tiny (2:7.3.154+hg~74503f6ee649-2ubuntu3.1) を設定しています ...
vim-runtime (2:7.3.154+hg~74503f6ee649-2ubuntu3.1) を設定しています ...
Processing /usr/share/vim/addons/doc
vim (2:7.3.154+hg~74503f6ee649-2ubuntu3.1) を設定しています ...
update-alternatives: /usr/bin/vim (vim) を提供するために 自動モード で /usr/bin/vim.basic を使います。
update-alternatives: /usr/bin/vimdiff (vimdiff) を提供するために 自動モード で /usr/bin/vim.basic を使います。
update-alternatives: /usr/bin/rvim (rvim) を提供するために 自動モード で /usr/bin/vim.basic を使います。
update-alternatives: /usr/bin/rview (rview) を提供するために 自動モード で /usr/bin/vim.basic を使います。
update-alternatives: /usr/bin/vi (vi) を提供するために 自動モード で /usr/bin/vim.basic を使います。
update-alternatives: /usr/bin/view (view) を提供するために 自動モード で /usr/bin/vim.basic を使います。
update-alternatives: /usr/bin/ex (ex) を提供するために 自動モード で /usr/bin/vim.basic を使います。
siriuth@ubntu-VirtualBox:~/dev/openwrt/backfire_10.03.1/package/uhttpd/src$
 ということで無事に入れることができました。

コンパイル環境

やはりバイナリイメージを動かしていたのでは限界が見えてきたのでコンパイル環境をなんとかならないかと右往左往していましたが最終的にVirtualBoxとUbuntu11.10で落ち着いた感じです。

ただVirtualBoxが悪いのかUbuntuが悪いのかわかりませんがどうもmake中で各サイトから必要なリソースを引っ張ってくるところで何度もVM自体がフリーズしていました。

makeするときにV=99をつけると細かいメッセージまで表示されるのである程度は判断がつくようになり判断がつく限り直接ダウンロードしたものをdlフォルダに入れて対応したところまともにコンパイルが通るようになりました。

色々躓きはしましたが…。

直接的な部分ではuhttpdを手直しして使いたいだけなのでパッケージだけでもコンパイルできればとおもって始めたのですが最終的には全コンパイルをかけていました。

VMなのでコンパイルにはかなり時間がかかりました。
ざっとデフォルトで2,3時間。そこから全パッケージがまた2,3時間。
CPUを半分以上ほかのものが使用していたとは思いますが(笑)

Ubuntuはかなり今風のつくりになっていてターミナルを開くのにも一苦労です。
[ALT]+[F2]でファイル名を指定して実行できるのでそれが救いでした。(最初はどうしようかと(笑))

失敗談としてはCygwinでできるかな?と頑張っては見たのですがOpenWrtのHowToにもかいてありますが無理でした。svnでソースは持ってこれるのですが、makeをしようとするとroot権限を持っているといろいろダメみたいでした。FORCE=1をつけてやったりもしましたが…

ただ最初はfeedとかもいれてなかったし色々足りなかったのは確か。

2012年5月18日金曜日

uhttpd: index_pageの指定は一つしかできない

昨日uhttpdでindex_pageの指定で複数のファイル名を設定できたと勘違いして記事を書いてみたのですが後から見直すとどうもやはり一つしか対応できないようで、本格的にソースを見てみました。

まずソースは/package/uhttpd/srcの中にあり適当に見てみます。
$ grep "index.html" *
uhttpd-utils.c: "index.html",
コンスタントで定義されているのはuhttpd-utils.cの中ということがわかります。
static char *uh_index_files[] = {
    "index.html",
    "index.htm",
    "default.html",
    "default.htm"
};
と定義されています。確かに4つデフォルト値が配列として定義されているようです。
次にuh_index_filesはどこで使われているかというと、
 $ grep "uh_index_files" *
uhttpd-utils.c:static char *uh_index_files[] = {
uhttpd-utils.c:                         for( i = 0; i < array_size(uh_index_files); i++ )
uhttpd-utils.c:                                 strncat(buffer, uh_index_files[i], sizeof(buffer));
同ファイルの中で使用されているというのはわかります。
その部分を実際に見てみると
            else if( cl->server->conf->index_file )
            {
                strncat(buffer, cl->server->conf->index_file, sizeof(buffer));

                if( !stat(buffer, &s) && (s.st_mode & S_IFREG) )
                {
                    memcpy(path_phys, buffer, sizeof(path_phys));
                    memcpy(&p.stat, &s, sizeof(p.stat));
                }
            }
            else
            {
                for( i = 0; i < array_size(uh_index_files); i++ )
                {
                    strncat(buffer, uh_index_files[i], sizeof(buffer));

                    if( !stat(buffer, &s) && (s.st_mode & S_IFREG) )
                    {
                        memcpy(path_phys, buffer, sizeof(path_phys));
                        memcpy(&p.stat, &s, sizeof(p.stat));
                        break;
                    }

                    *pathptr = 0;
                }
            }
ここで残念なことが発覚します。
定義されているものは配列でcl->server->conf->index_fileが定義されている場合はどうやら一つしか対応できないようです。

必死に複数の指定をしていたのですが残念な結果となりました。
蛇足ですがこの index_fileは2箇所で設定されていてコマンドラインの引数と/etc/httpd.confなどの設定ファイルから取得するようになっているようでした。(細かくは見ていませんが)

やはりソースを見るのが一番早いですね。

2012年5月16日水曜日

proftp: 起動時にエラー

rebootしたときにftpがつながらなかったので気になっていたのですが、システムログに
May 16 20:56:22 mzkw04nu user.info sysinit:  - Fatal: error processing configuration file '/etc/proftpd.conf'
とエラーと表示されていました。

/etc/init.d/proftp start

として起動するので細かい点は気にしていませんでしたが、rebootで起動しないのは問題があるので少し調べてみましょう。

まず原因がわからないのでとりあえず openwrt proftp で検索してみると
OpenWrt / proftpd not work
で、「DefaultAddress  127.0.0.1」を追加すれば良いということなので/etc/proftpd.confに追加して再起動してみました。
May 16 21:06:20 mzkw04nu user.info sysinit: udhcpc: ifconfig wlan0 *.*.*.* netmask *.*.*.* broadcast +
May 16 21:06:21 mzkw04nu user.info sysinit:  - setting default address to 127.0.0.1
May 16 21:06:21 mzkw04nu user.info sysinit: udhcpc: setting default routers: *.*.*.*
May 16 21:06:21 mzkw04nu daemon.notice proftpd[1295]: localhost. - ProFTPD 1.3.3e (maint) (built Mon Nov 14 2011 19:08:02 CET) standalone mode STARTUP
May 16 21:06:21 mzkw04nu user.info sysinit: udhcpc: setting dns servers: *.*.*.*
確かに起動するようにはなりました。
が、気になるのはデフォルトアドレスをローカルとする理由はおそらく実行時にゲートウェイがあるネットワークのIPアドレスが確定していないということなので、単純に起動順序の調整で話は終わりそうです。

追加したDefaultAddressをコメントにして、/etc/init.d/proftpdのSTARTを50からntpdと同じ65に下げてみます。
その後 /etc/rc.dのリンクを再作成するためにluciのスタートアップから(/etc/init.dの変更を行うと無効になっていますがS50proftpdのリンクは存在したままです。)有効に変更します。
それから再起動。
May 16 22:00:24 mzkw04nu daemon.notice proftpd[1479]: mzkw04nu.lan - ProFTPD 1.3.3e (maint) (built Mon Nov 14 2011 19:08:02 CET) standalone mode STARTUP
問題なく起動しました。
解決方法としてデフォルトアドレスをconfに追加するか、udhcpcが起動したあと起動すればよいということでしょうね。

2012年5月14日月曜日

ブログスクリプト

プライベートな出来事を記録するためのブログとしてこのbloggerを利用していますが、それでもやはりよりプライベートな記録を行いたいのでブログスクリプトを探しています。

openwrtで動かすので軽いもので、phpベースのものを探してみました。
最初はPHP Blogというものを見てみましたが、これはデータベースを使用する上に、LightSQLという使ったことが無いデータベースが必要なようなので動かす環境はありませんでした。

もう少し探しているとppBlogというものがありました。
これはphp単体で動作し、機能的にも一般的なblogサービスと遜色がないように感じました。

とりあえず入れて設定方法も何もわかりませんがファイルを転送してinstall.phpというものを動かしてみましたが、

Fatal error: Unknown: apc_fcntl_lock failed: in Unknown on line 0

というエラーが表示されてうまくどう探しませんでした。
別の環境で試すと最初は同じように動きませんでしたが、再起動してみると気がつくと動いていました。

無理やり動かした後に気づいたのですがマニュアルがあるようで、設定方法も書いてありました。
ppBlog Manual

2012年5月8日火曜日

proftpd

sambaの接続でお茶を濁していたファイル転送ですがいろいろな意味でftpでファイル転送ができないのは好ましくないので色々試してみました。

実際にopenwrtで導入例が検索してもこれと言ったものが引っかからないので途方にくれていました。
接続まではできるもののログインしようと試すとログインできなかったわけですが。

大まかなインストールから設定までは
http://www.ksknet.net/proftpd/proftpd.html
で紹介されている通り。

opkgでバイナリインストールした場合は何もしなくてもluciのSystem/StertUpで有効にして開始すれば自動的に起動まではするのですが、問題はそこから。
有効なユーザーでログインしてログインできず。
システムログを見てみると
daemon.info proftpd[18438]: mzkw04nu.lan (192.168.250.151[192.168.250.151]) - FTP session opened.
authpriv.notice proftpd[18438]: mzkw04nu.lan (192.168.250.151[192.168.250.151]) - USER siriuth (Login failed): No such user found.
authpriv.notice proftpd[18438]: mzkw04nu.lan (192.168.250.151[192.168.250.151]) - USER siriuth (Login failed): No such user found.
authpriv.notice proftpd[18438]: mzkw04nu.lan (192.168.250.151[192.168.250.151]) - USER siriuth (Login failed): No such user found.
authpriv.notice proftpd[18438]: mzkw04nu.lan (192.168.250.151[192.168.250.151]) - Maximum login attempts (3) exceeded, connection refused
daemon.info proftpd[18438]: mzkw04nu.lan (192.168.250.151[192.168.250.151]) - FTP session closed.
という形でユーザー自体の認識ができていない状態。
rootでログインしようとすると
authpriv.crit proftpd[18423]: mzkw04nu.lan (192.168.250.151[192.168.250.151]) - SECURITY VIOLATION: root login attempted.
となっていてスーパーユーザーと一般ユーザーで反応が違っていた。

エラーメッセージとopenwrt、proftpなどで検索してみると
https://forum.openwrt.org/viewtopic.php?id=31429
のページが引っかかった。
中を見てみるとどうも同じ状況のようで最後に

AuthUserFile /etc/passwd

を追加すれば改善できたとのこと。
早速/etc/proftpd.confに追記してみると、この状態でrootはログインできなかったが一般ユーザーはログインできるように。

(shadow passwordを入れれば動くのかもしれない?)

http://www.proftpd.org/docs/directives/linked/config_ref_AuthUserFile.html

とてつもなく危険ですが内部的には設定時に
RootLogin on
でrootのログインを許可できます。

2012年5月1日火曜日

motion

motionで簡単にjpeg画像は保存できたが、やはりバラバラのファイルよりは動画として一つのファイルの方が扱いやすいのでなんとかならないかと調べてみました。

motionではffmpegを利用することによって内部的にファイルを作成できるようだが…残念なことにうまく動いていないようです。
ターミナルなどから単独で起動を行ってみると
root@mzkw04nu:/etc# motion
[0] Processing thread 0 - config file /etc/motion.conf
[0] Unknown config option "ffmpeg_cap_new"
[0] Unknown config option "ffmpeg_cap_motion"
[0] Unknown config option "ffmpeg_timelapse"
[0] Unknown config option "ffmpeg_timelapse_mode"
[0] Unknown config option "ffmpeg_bps"
[0] Unknown config option "ffmpeg_variable_bitrate"
[0] Unknown config option "ffmpeg_video_codec"
[0] Unknown config option "mpeg_filename"
[0] Unknown config option "ffmpeg_video_codec"
[0] Unknown config option "movie_filename"
[0] Motion 3.2.11.1 Started
[0] Thread 1 is from /etc/motion.conf
[1] Thread 1 started
[1] cap.driver: "uvcvideo"
[1] cap.card: "UVC Camera (046d:0994)"
[1] cap.bus_info: "usb-ar71xx-ehci-1.2"
[1] cap.capabilities=0x04000001
[1] - VIDEO_CAPTURE
[1] - STREAMING
[1] Supported palettes:
[0] motion-httpd/3.2.11.1 running, accepting connections
[0] motion-httpd: waiting for data on port TCP 8082
[1] 0: MJPG (MJPEG)
[1] 1: YUYV (YUV 4:2:2 (YUYV))
[1] index_format 6 Test palette YUYV (352x288)
[1] Using palette YUYV (352x288) bytesperlines 704 sizeimage 202752 colorspace 00000008
[1] found control 0x00980900, "Brightness", range 0,255
[1]     "Brightness", default 128, current 128
[1] found control 0x00980901, "Contrast", range 0,255
[1]     "Contrast", default 32, current 32
[1] found control 0x00980902, "Saturation", range 0,255
[1]     "Saturation", default 32, current 32
[1] found control 0x00980913, "Gain", range 0,255
[1]     "Gain", default 0, current 0
[1] mmap information:
[1] frames=4
[1] 0 length=202752
[1] 1 length=202752
[1] 2 length=202752
[1] 3 length=202752
[1] Using V4L2
[1] Resizing pre_capture buffer to 1 items
[1] Started stream webcam server in port 8081
 と表示され、ffmpeg系のオプションが(旧体系)のものも含めて認識できないと怒られています。
motionのドキュメントを見る限り、ffmpegが利用できる環境で無い場合はコメントアウトしないとエラー表示になるようになっているようなので、motion自体がffmpegを認識できていないようです。

openwrt motion ffmpegなどのキーワードで検索を行ったところ、同様のはまり方をされている人も多々いらっしゃるようで…debianでは普通に動いているようなので、やはりソースからコンパイルする必要があるかも。

試しにスナップショットのチャンクのffmpegをインストールしたところ結果は一緒。(きちんと組み込めたかは不明ですが(笑))

10.03.1のffmpegは少しバージョンが古い(FFmpeg version 0.5.4)のでmotionのドキュメントにもあるように全てが動作するという チャンクのほうの0.8がインストールできれば動くかもと少し淡い期待があったのですが残念です。

現状だとイベントで動画ファイルに変換する方法でしのいでみるしかなさそうです。

バスの事故

夜行(?)バスの事故で、一つ疑問がある。
ガードレールがもう少しちゃんと整備されていたら死傷者は出なかったのではないかということ。
たしかに居眠り運転はダメだが、道路側の危険部分の排除は行われることが当然だと思うのだが、どのマスコミもそのことについて全く言及されていない。

電気料金の値上げ

一般の電気料金値上げの調整に入っているらしいが色々と疑問です。
そもそも企業努力は行われたのか?
賃金カットなんて当たり前の話ですよね?

ニュースで10%といっていて落とし所で5%とか7%とかでお互いの努力の結果とか値上げはただのかませで値上げしなくなりました→現行与党万歳のシナリオなのかよくわかりませんが。

また電気買取って作り方で変わるんですね。
そもそも一律でいいと思うのだが。

これも金持ち優遇の結果の意味不明のルールなんでしょうか。

そもそも設置時の優遇措置だけでいいとおもうのだが。