2013年2月19日火曜日

高負荷状態のルータの内情 その1

普段あまり使う機会が無いといえば無いし、一般的な用途には下火な印象もあるBitTorrentみたいなP2Pだけど、ああいう物でネットワーク的に負荷?をかけるとルータのレスポンスが著しく落ちるのは何故なのか前から興味があった。

昔のルータは少し負荷をかけるとそのまま逝っちゃってリセットしないと復旧しなかったりしたけど最近のはFONみたいな安い奴でも落ちずに粘るし、そういう意味でもメカニズムに興味が。

丁度?FONルータのファームを書き換えられる環境が整ったので(基盤からシリアルの足生やしてUSBシリアル変換アダプタ買ってきて繋いだだけだけど)カスタムファームを入れてtelnetでつないで状況をウォッチしてみる事に。

結果としては・・・softirqが99%とかになっておりここが問題っぽい。そしてdnsmasqタスクが結構な高負荷になっている事象は観測出来た。ただしdnsmasqは常に高負荷なわけでは無さそう。ソフトウェア割り込みでフン詰まっているのは間違いないんだろけど割り込み要因が問題。

softirqに関してはカスタムファームのKernelであるLinuxの仕組みという事で良いと思うんだけど、実際キャパやその処理能力を超える割り込みが入った場合の挙動は勉強不足でよく分からない。何かツールとかでその瞬間に入っている割り込み種別とかプライオリティとか確認する方法あるのかな?Linuxでの開発ってした事無いのでこちらも勉強しないとね。

ルータのファームってLinuxとは限らないと思うけど他のOSでも同じ事が起きるのだろうか?基本的にP2Pって同時に張られるセッション数が凄い数になっているんじゃないかと仕様も調べずに勝手に想像しているけど、単にそれが原因なのか、それともデバイスドライバの実装上の問題なのかはまず確認が必要かも。

いずれにせよサーバに負荷が集中して~ってパターンと同様の事象が起きているという認識であっているのかなぁ。だとしたらこの辺を勉強しておく事は仕事にもつながりそうだしちょっと調べてみますか。デバッグ手法に関してはAndroidの下回りとか開発するときにも生かせそうだしね。(無理やり紐づけてみる)

というわけで、その2につづく(はず)

2013年1月24日木曜日

sqlite.netのBOOLEAN型

sqlite.netを使ってプログラムを書いていてハマったのでメモメモ。

まず、sqlite自身にあまり細かい型が無い事は知ってました。そしてsqlite自身、それからsqlite.net側の処理として型が拡張されておりBOOLが使えるとの事なので試しにBOOL型(BOOLEAN型でもいけた)のところにTRUEを入れるSQLを書いてみる・・・入りました。 まぁ、文字列として入っているから当然なんですけど。で、、、C#で読み出してみると「false」が返ってきます。ヤッター!

なんでだろーっとソースコードを見てみると・・・テキストとして

「yes」「y」「1」「on」

trueとして

「no」「n」「0」「off」

falseとして処理されております・・・。

あれ?trueとかfalseは!?普通の感覚だとBOOLEANとか言われたらtrue/falseとかじゃないの!?

まぁ、その文字の判定の前に渡されたオブジェクトがbool型(C#的な)だったらboolとして処理するみたいな形になっているのでそれで満足してそれ以外の型で処理する様になっている様なのですが・・・そもそもsqliteにはbool型無いし、C言語(sqliteはCで書かれている)的にもbool無いしこの処理って意味あるのか!?

その前の処理までは追っていないのでそこで何やらやっている可能性もあるけど・・・まぁちゃんと値返ってきてないし無いわな。

<閑話休題>

ちょっと調べてみるとBoolean型自体はSQL的にはSQL:1999で定義されていてtrue/falseで処理出来る様です。なのでSQL的には間違った物ではないのですがsqlite3のドキュメントを読むと・・・「SQL92に一応準拠」との事。

まー、じゃあしょうがないよな・・・?

しょうがないよな!?

いや、やっぱりyes/noとか処理してるんだしsqlite.netでtrue/falseの判定すべきだろう。

まぁ世間一般的にSQLの世界としては規格化されていてもブッチしている実装はいっぱいあるわけで、BOOLEANもあまりサポートされていない存在らしいので深く考えずに数値型に0/1入れて処理しておくのが幸せになれる方法なんでしょうけどね。

2012年11月1日木曜日

Pythonの開発の為にvirtualenvを入れてみる

pythonの開発環境として2.7と3.2を混在させたいのでvirtualenvを入れようと思ったけどロクに設定をしていない事に気づいた。やっぱりこういうのは色々面倒なのでメモを残しておくことにする。

とりあえず使用環境にはActivePythonではなくpython.orgから落としたWindows版の物をそれぞれ展開して配置しただけ。パスも通していないのでまだpythonは実行出来ません。

まずvirtualenvを入れるにはpipなるものがあると便利らしい。パッケージ管理のプログラムみたいね。で、pythonの設定も出来てないのにどうやってやるんだヨ!って話でまずはeasy_installなるものを入れる事にする。もう既によく分からなくなってきたゾ

 http://pypi.python.org/pypi/setuptools

ここから手持ちマシンは64bit環境(Windows8 Pro)なのでez_setup.pyを落としてきてpythonの実行ファイルと同じパスにコピーする。うちの場合は「C:\app\Python27」「C:\app\Python32」って感じに入れてあるので前者のパスにコピーですな。で下記のコマンドを実行。

PS C:\app\Python27>python ez_setup.py


これで勝手に「C:\app\Python27\Scripts」配下にeasy_installが入りましたぜ旦那。物を確認したらシステムの環境変数のpathに前者のパスを追加してPowerShellを開きなおす事でeasy_installが実行出来る状態に。

さぁ、次はpip入れちゃおうか。

PS C:\Users\Ore> easy_install pip

これだけ。とりあえずこれで前準備は完了ですな。次は本命のvirtualenvを入れてみましょう。

PS C:\Users\Suguru> pip install virtualenv

とりあえずこれでokみたいヨ!早速仮想環境を作ってプログラムを書くぜって事で作業フォルダに移動して

PS G:\develop\projects> virtualenv testapp

これで作業フォルダが完成。その中のScriptsフォルダに移動してactivateすれば仮想環境に!って事で

PS G:\develop\projects> cd testapp\Scripts
PS G:\develop\projects\testapp\Scripts> activate

・・・セキュリティの問題で実行出来ませんダトッ。PowerShell初心者なので初めて知った事実。(ちなみに普通のDOS窓ではこれでイケタ)

まぁ、折角だからPowerShellからもいけるようにトライしてみるゼィ。とりあえず現在の設定の確認。

PS G:\develop\projects\testapp\Scripts> Get-ExecutionPolicy
Restricted

これは全面禁止状態の模様。じゃー全部許可したれって事で

PS G:\develop\projects\testapp\Scripts> Set-ExecutionPolicy Unrestricted

とやったら 

Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' へのアクセスが拒否されました。

ギャース。ダメじゃん。こりゃ管理権限で実行しないとダメだね・・・。で結局管理権限でPowerShellを実行してみたらいけました。が・・・なんか釈然としない物を感じますな、この方法は。せめてsudoみたいな感じで一時的に管理者権限でスクリプト実行出来るとかの方がマトモなんじゃ・・・。

なにはともあれこれで実行出来ましたよっと。

PS G:\develop\projects\testapp\Scripts> activate
(testapp) PS G:\develop\projects\testapp\Scripts>


2012年9月24日月曜日

インポートしてみた

家庭内事業仕分けの一環で不要な出費を減らす方向で、無駄に金を払っていた、はてなダイアリーのデータを全部bloggerに移動して(全部っつっても大した量無いけど)有料オプションを解約する事に。

とりあえずデータはMovableType形式でエクスポートして、一応かつてのデファクトスタンダードなわけだしそのままbloggerにインポートできるのかと思ったら全然無理でしたorz

ググると変換サービスを作ってくれている人が!感謝感謝で使わせてもらいます。そしてわかりにくい階層を辿りインポートを行う。

行う・・・。

全部今日の記事になっちゃったよorz

んんー?とりあえず中身を見ると・・・ああ・・・日付の形式の問題ね・・・。この辺はやっぱり難しいねぇ。

結局ブログの言語を日本語から英語にしてインポートしたら正常に読み込まれましたよっと。これで心置きなくはてなを解約という事でプチっと止めを刺しました。

次は何を仕分けるかな~

2012年9月14日金曜日

dovecot + Mail.appは相性が悪い?

自前サーバの話。新しいdovecotの環境に移行してもらって、今回からIMAPの使用を奨励する形にしたら・・・MacのMail.appを使っているのからメールを削除できなくなったという苦情が。

調べてみると、どうも怪しいことになっている。問題は2点ある。

まず一つ目はフォルダー名。dovecotはMaildirを使用する場合にIMAPからフォルダを作成すると階層を表す記号に"."を使ったフォルダをルートのMaildir直下に作成する模様。そしてMail.appがメールアドレス名(xxx@example.com)を含めたフォルダを作った為、実際のフォルダとしてはそれっぽいものが作られてはいるけど、dovecotが間違えて解釈するためにIMAP的には意図したフォルダが実際には無い様に見えるという状態になってしまうらしい。

そして二つ目がインデックス。どうもdovecotはインデックスファイルを作成しておりそれを優先的に使用してIMAPのレスポンスを返すらしい。なので実際のフォルダ構成とこれが食い違うとエラーになってしまう模様。

とりあえずここまでは状況からの推測ですが、また間違ってはいないと思います。根本的にはMail.appの問題というよりフォルダー名として"."を指定された際にちゃんとエスケープしないdovecotの実装に問題がある気がするけど実際それをどう回避するかという話になる。

結論から行くと今回はdovecotのパッチ作るのも面倒なのでとりあえず後ろ向きな方向でThunderbirdに移行してもらった。 もちろん使い手が意図的に"."の入ったフォルダーを作成したらまた同じことになると思われるので恒久対策ではないけど、管理者がMail.appを常用しておらず挙動が読めないので今後のサポートを考えると事故の少ない方向に振った次第。身内しか使っていないからこその対応ですが。

ただし二つ目の様に、すでに不整合が起きているのでThunderbirdにしても特定操作がエラーになってしまうのは変わらない。最初よくわからないのでsshでつないで手動でフォルダをリネーム or 消してクライアントから読み直せばokダロっと思って試してみたのだけどindexとの不整合が発生し

Mailbox doesn't exist XXXXX

こんなエラーが出てフォルダーへアクセスする際にダメでした。インデックスファイルらしきものを削除して再構築を促してもNGだったりしたのが非常に謎ですが。

とりあえずは後ろ向きな解決方法で不整合が起きたフォルダは大本のフォルダはssh経由でサーバから手動で削除し、メーラから同名のフォルダを作りなおし、クライアントから再度削除していく事によって整合を保つことが出来た。またゴミ箱(Trash)等クライアントとして特殊なフォルダはアプリ側ではねられるので、ssh経由で手動でMaildirを一つずつ作成しなおした。

というところで一応Thunderbirdからは問題なくいけるようになったんだけど、dovecotもMail.appも挙動を理解していない為に今回の様な対応になったので一度これは再テストしてみた方が良さそうという事で今度追試を行います。

2012年8月21日火曜日

U24EにWindows8を入れてみた

ASUS U24EにWindows8 Proを入れてみたメモ。
合わせてSSDへの換装を行っています。

1.バックアップをとる

まぁ、好きな様にとればよろしいかと。今回はディスク差し替えてオリジナルディスクを残すので本当に重要と思われるデータのみバックアップをとっています。

 

2.インストールディスクを作る

このノートPCは光学ドライブがついていないのでUSBメモリ(今回使用したのは4GB)にWindows8のインストールイメージを焼きます。焼くのはMS純正の「Windows 7 USB/DVD ダウンロード ツール」をMSのサイトから落としてきてインストール。ツールを立ち上げてイメージデータとドライブを指定するだけ。

 

3.SSDに換装する

本体の電池を外し、裏側のネジを一本とったらパキパキっと蓋を開けるとHDDとメモリ等が見える状態になるのでネジを3本外してHDDのマウンタを引っこ抜く。そして四隅のネジを外して換装します。この際接着されたスポンジが切れるけどまぁキニシナイ。あとは元に戻して終了。

 

4.USBメモリで起動

USBメモリを差してACアダプタつないだら電源ON。Modern UI(旧Metro)なアイコンが出たら正常にUSBから起動出来ている証拠。あとは画面に従ってインストールしましょう。

 

5.USBメモリを抜く

一回PCが再起動した際にUSBメモリをさっと抜きます。そうしないとインストーラが再度立ち上がると思います。まぁインストーラが立ち上がったとこで抜いてリセットしてもOK。あとは本体側から立ち上がってセットアップ終了。

 

6.不足したドライバを入れる

デバイスマネージャを確認したらBluetoothとメモリカードリーダのドライバが?マークになっていました。というわけで不足分を自分で入れます。

  • Bluetooth
こちらはデバイスマネージャで?になっているものを右クリックして「ドライバーソフトウェアの更新」を選択すると勝手にネットからドライバを入れてくれます。
  • カードリーダ
ASUSのU24Eのドライバのサイトからダウンロード
  • タッチパッドドライバ
タッチパッドそのものは動くのですがジェスチャー系を動かすためにおそらく必要という事でカードリーダと同じところからインストール。

とりあえずこれで全部見た目動いているように見えるのでOK。不足分がありそうだったら追記します。

7.ユーティリティを入れる

これは好みが分かれると思うので参考までに。現状ガジェット系とか動かないものもあったのでWin8に正式対応するまで様子見たほうが良いかも?


  • ASUS Splendid Video Enhancement Technology
モニタの色温度を設定するユーティリティ(まぁ色にこだわらなければいらない)
  • ASUS PowerWiz
バッテリ状態を表示するガジェット
  • ASUS USB Charger Plus
PCの電源を切った状態でUSB給電の設定をするユーティリティ
  • ATKACPI driver and hotkey-related utilities
ホットキー(Fnキー)を有効にするドライバ、ユーティリティ

2012年8月8日水曜日

python-ldapをWindows環境に入れる

メールサーバのアカウント管理をLDAPでやっているけど管理ツール無しでLDAPクライアントからいじるのが苦痛になってきたのでpythonで簡単な管理プログラムを作ってみることに。

ある程度の骨組みは出来たのでLDAPとのコミュニケーション部分に着手しようと開発環境にpython-ldapを入れようとしたらこんなエラーが。

ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
Python 2.7.2 (default, Jun 24 2011, 12:22:14) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ldap
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\app\Python27\lib\site-packages\ldap\__init__.py", line 22, in <module>
    from ldap._ldap import *
ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。
dllの問題らしいという事まではすぐわかったんだけど、その先がさっぱりわからなかったんだけどふと64bit版のpythonを使っていることが問題ではないかという事に気付く。

python-ldapをオフィシャルな配布元にはWindowsの64bit版が無い気がするので下記の場所からamd64版を入手して問題なくインストールが完了。感謝。

http://www.lfd.uci.edu/~gohlke/pythonlibs/

Codecとかでもそうだったけど64bitと32bitの問題はしばらくはまりそうだねぇ。