<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ref="http://purl.org/rss/1.0/modules/reference/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
	<channel rdf:about="http://xmms.jp/blog/rss.rdf">
		<title>PC Junkie Rev3.0</title>
		<link>http://xmms.jp/blog/index.php</link>
		<description><![CDATA[<a href=static.php?page=about_copyright>about copyright</a>]]></description>
		<items>
			<rdf:Seq>
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry240328-001302" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry230306-160036" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry190803-020323" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry170422-171024" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry140411-010826" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry121111-035505" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry121106-005733" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry121103-210353" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry120929-053759" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry120912-044146" />
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry240328-001302">
		<title>【その他】リモートデスクトップでrdpファイルにselectedmonitorsの記述をしてもうまく動かないときの確認点</title>
		<link>http://xmms.jp/blog/index.php?entry=entry240328-001302</link>
		<description><![CDATA[<a href=images/IMG_20240327_235901_R.jpg class=lb><img src=images/IMG_20240327_235901_R.jpg width=500px></a><br> <br /><br />  Windowsのリモートデスクトップですが、実はマルチモニター環境で特定の画面だけにまたがって全画面表示する、という機能があります。この機能を使ってとあるVMで作業するときに「1枚の全画面だと微妙に使いにくいけどマルチモニタすべての画面をリモデに使いたくない」という要件を満たすべく2枚の画面だけを使うようにしていました。<br /><br /><a href="https://www.hanselman.com/blog/how-to-remote-desktop-fullscreen-rdp-with-just-some-of-your-multiple-monitors" >https://www.hanselman.com/blog/how-to-remote-desktop-fullscreen-rdp-with-just-some-of-your-multiple-monitors</a><br /><a href="https://qiita.com/yusuke-sasaki/items/5f70dc266caf13021838" >https://qiita.com/yusuke-sasaki/items/5f70dc266caf13021838</a><br /><br />　先に結論を書くと、 RDPで複数画面が使えない!というときは、使いたいディスプレイ同士が0pxで隣接しているかを確認する必要があります。以下、検証のメモです。<br /><br /><br />　実際のモニターのセットアップはこうなっています。グラボの出力順を考慮していないのでぐちゃぐちゃになっていますが、この中から5,6を使ってRDPを全画面表示する、ということをしていました。<br /><br /><a href=images/multimonitor1.jpg class=lb><img src=images/multimonitor1.jpg width=500px></a><br><br /><br /> 今までこれは動いていたのですが、モニターのつながっているグラボの出力端子を入れ替えたタイミングで画面をまたがっての表示が動かなくなってしまいました。<code> mstsc /l</code>で調べてみると、端子が入れ替わったことによってモニターのIDが変わっていたので、IDを確認してrdpファイルに書かれている順番を入れ替えれば動くだろう、と思いました。しかし、若干の移動はあったもののIDは大きく変わっておらず、何をやってもモニタをまたがって全画面表示ができずプライマリモニタだけ全画面で表示される挙動を示しました。<br /><br />　よくわからないので一度マシンを再起動し、もう一度mstsc /lをすると今度は何故かモニターIDが大きく変わっていた(1,3,10,11,12,13から0,1,2,3,4,5になっていた)のですが、それを直しても動かず、色々検証すると下記設定の赤字0,2の2画面表示と2,4及び5,3の2画面表示は問題なく動き、なぜか2,4,5,や4,5と横一列にしようとしたときに5を含むと動かなくなるということがわかりました。<br /><br /><a href=images/multimonitor2.png class=lb><img src=images/multimonitor2.png width=500px></a><br><br /><br />　検証に使った最低限の要素だけ含めたrdpファイルは以下になります。<br /><br /><blockquote>## NG ##<br />full address:s:VM1<br />use multimon:i:1<br />selectedmonitors:s:4,5<br />dynamic resolution:i:0<br /></blockquote><br /><br /><blockquote>## OK ##<br />full address:s:VM1<br />use multimon:i:1<br />selectedmonitors:s:0,2<br />dynamic resolution:i:0<br /></blockquote><br /><br />　プライマリモニタがRX7900XTXにつながっていることもあり、最初はRadeon仕草かと思いましたが、<code> mstsc /l</code>の値をよく見るとmstsc側ID(画像赤文字)の5の起点座標がおかしい事に気が付きました。この場合、0,0から3839,2159が4の値なので5が3840から始まらないといけないのですが、なぜか3853となっており、赤字4と5の間に13ピクセルの隙間があるいうことがわかりました。<br /><br />　カッコ内部の値はそれぞれプライマリモニタ(この場合は赤字の4)の左上を0,0として右下に向けて座標がプラスになり、プライマリモニタより左にモニタがあればxはマイナスに、プライマリモニタより上にモニタあればyがマイナスになります。<br /><br />　Windowsの仕様として隣り合うモニタ同士はどこかでくっついていないといけないのですが、赤字5は赤字3とくっついているという扱いになり、4と5は13ピクセル離れている、という認識になっているようです。出力端子を入れ替えたのがちょうど赤字の5にあたるものだったのですが、Windowsで画面の位置を移動したときにそれがズレたようです。わかるかそんなモノ…。<br /><br />　離れてるのであればマウスの移動もできないのではと思いましたが、ある程度の加速度があると多少の隙間を乗り越えて隣のモニタに行けるようです。逆に、隙間があるととてもゆっくりマウスを動かしてモニタの境界線をまたごうとするとブロックされます。密着しているとマウスカーソルの加速度が1px/sでも境界をまたげるようです。たまに感じた違和感はこれだったのか…。<br /><br /><a href=images/multimonitor3.png class=lb><img src=images/multimonitor3.png width=500px></a><br><br /><br />　ディスプレイのスナッピングとの格闘の末、最終的に一回り小さい赤字の1以外は0pxで整列できたのですが、どうしても最後の1つが完全密着になりませんでした。1の値は1279,ｰ1440,3840,ｰ1になるべきなのですが、Windowsのディスプレイ設定は2辺と隣り合うことを想定していないのか、赤字の3の左辺、もしくは4の上辺のどちらかにしかスナップせず、逆にどちらかにスナップすると絶対にもう一方は合わないという動きをしていました。<br /><br />　ただ、赤字の0,2,4,5の横一列は整列されたので、当初赤字4,5の2画面でリモデが使えないという問題は解決しました。現状、赤字の1,3を使って画面をまたいでリモデをする、ということができませんが、このパターンはないと思うので諦めました…。座標を使ってディスプレイの場所を指定できる方法があればいいんですが…。<br /><br /><br /><br />　変な環境でディスプレイを出力していてRDPで複数画面が使えない!というときは、使いたいディスプレイ同士が0pxで隣接しているかを確認する必要がある、という、ほんとに使い所のないナレッジを得たのでここに供養します。<br /><br />追記:<br />　その後またディスプレイポートの差し替えがありスナッピングと格闘していましたが、それを便利にするDPEditというツールがあるのを知りました。<br />　<a href="https://github.com/programmer2514/DPEdit" >DPEdit -A simple Windows command line utility to accurately set the relative position of displays in a dual- or multi-monitor setup - </a><br /><br />　dpedit /L でつながっているディスプレイ一覧を取得できます。<br /><br /><blockquote> dpedit /L<br /><br />Display #5<br />Device name: \\.\DISPLAY5<br />Device string: AMD Radeon RX 7900 XTX<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {3840, 0}<br /><br />Display #6<br />Device name: \\.\DISPLAY6<br />Device string: AMD Radeon RX 7900 XTX<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 4<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {0, 0}<br /><br />Display #10<br />Device name: \\.\DISPLAY10<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {-7680, 0}<br /><br />Display #11<br />Device name: \\.\DISPLAY11<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {2560, 1440}<br />Position: {1280, -1440}<br /><br />Display #12<br />Device name: \\.\DISPLAY12<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {-3840, 0}<br /><br />Display #13<br />Device name: \\.\DISPLAY13<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {3840, -2160}</blockquote><br /><br />　<code>dpedit ［ディスプレイ番号] [x座標] [y座標] </code> でディスプレイを一つづつ、もしくは複数指定して配置を指定できます。上記の内容を5,6,10,11,12,13の順で一発で指定しようとすると以下のようになります<br /><br /><blockquote> dpedit 5 3840 0 6 0 0 10 -7680 0 11 1280 -1440 12 -3840 0 13 3840 -2160</blockquote><br /><br />　複雑な配置を行っている場合にピクセルパーフェクトで配置できずにツラミを感じている人は他にもいるようなので、そのうちPowerToysに入るかもしれません<br />　<a href="https://github.com/microsoft/PowerToys/issues/2652" > Fine-tune multi-monitor positioning tool #2652 - microsoft / PowerToys - </a><br /><br />　いずれにしても、これで不毛なイラつきがなくなったのでまた一つPCの利用が快適になりました。<br /><br /><br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry230306-160036">
		<title>【Monitoring】 ZabbixからESXiホストに刺さってるMegaRAIDの状態をLLDで動的に取得して監視する</title>
		<link>http://xmms.jp/blog/index.php?entry=entry230306-160036</link>
		<description><![CDATA[　個人でESXiを動かしていると、何かとLSIのRAID情報を取得したいと思うことがありますが、LSAではなくて既存のZabbixからデータを取得したいと思うことがあります。ありますよね(同調圧力)。<br />　何かいい方法がないかと見ていたらstorcliがjsonでデータを出力できることに気がついたので、ZabbixのLLDと組み合わせていい感じにデータを監視する方法を作りました。先にテンプレートのJSONを置いておきます。<br /><br /><a href=data/Template_LSI-storcli.json>Template_LSI-storcli.json</a><br><br /><br /> storcliが動けばLinuxであっても情報を取得できるので、agentのsystem.run形式で作ったものも同梱しておきます。storcliの実行にroot権限が必要になるので、storcliにスティッキービットをつけたりsudoを許可したりagent自体をrootでうごかしたりしていい感じに対応してください。<br />　system.runは悪だ!!!!!という方は、最終的にjsonが取れればいいので、userparameterにしたりrootのcronでstorcliを実行して結果をテキストデータとして出力してログ監視するなど、linuxであればやりようはいくつもあるのでいい感じに工夫してください。<br />　まあ、linuxでエージェントが入っているようであれば/var/log/kernelなどをmegaraid_sasといったようなキーワードで監視していれば大体のイベントが取得できますが…。<br /><br />　ESXi用のテンプレートはSSHで接続してstorcliの実行結果を取得するので、Zabbix-agentが入っていないLinuxを監視したい場合にも使えます。<br /><h2>前提条件</h2><br />　利用するにあたり、以下の前提条件が必要になります。<br /><br /><blockquote>Zabbixのバージョンが6系であること<br />監視対象上でstorcliが動かせること<br />作成したLDに対して名前がついていること<br />ssh接続が有効になっていること<br />ESXiホストの/etc/ssh/sshd_configのPasswordAuthentication が yesになっていること</blockquote> <br /><br />　注意点としては、LLDとJSONのクエリの関係で、作成した論理ディスクに対して名前が必要になります。デフォルトではついていないので、storcliで監視対象全てで被らない一意な名前をつけてあげてください<br /><br /><blockquote>/opt/lsi/storcli/storcli  /call/vall show all #一覧を確認<br />/opt/lsi/storcli/storcli  /c0/v0 set name=myhost01-boot #/c0/v0に対して名前を付ける</blockquote><br /><br /> ESXi側のSSHに関しては共通鍵認証でもいいですが、テンプレートの変更が必要なのでそのへんの設定は今回は省きます。デフォルトのkeyboard-interactiveになっていても動きそうな気がしますがテストしてません。<br />　また、テンプレートの形式がZabbix6形式になっているので4系では入らない気がします。LLDのためにJSONpathとカスタムスクリプトでJSを使っているので、これを元に一から作る場合であっても、Zabbix側のカスタムスクリプトでJSの拡張がされていないと動かない気がします。<br /><br />　いずれにしても、4系の環境がもうないのでテストしてないですが、JSONpathは4系でも使えたはずなのでなにかのヒントにはなるかと思います。<br /><br /><h2>利用方法</h2><br />　まず、Zabbixに監視するためのホストを作ります。ESXiの場合はSSHで接続するので、インターフェースは参照しないので127.0.0.1のままでOKです。ホスト名だけ入れてください。<br /><br /><a href=images/Zabbix_storcli-1.jpg class=lb><img src=images/Zabbix_storcli-1.jpg width=500px></a><br><br />　次に、マクロに色々仕組みます。利用しているマクロは以下になります<br /><br /><blockquote>{$IP}　接続先IP<br />{$PASS} SSHの接続パスワード<br />{$STORCLI} Storcliの配置先　ESXiデフォルトは/opt/lsi/storcli/storcliのはず<br />{$USER} SSHの接続ユーザ</blockquote><br /><br /><a href=images/Zabbix_storcli-2.jpg class=lb><img src=images/Zabbix_storcli-2.jpg width=500px></a><br><br /> 今思うと{$IP}はホスト作るときにIPで作って{#HOST.IP}でも良かったのでは??という気がしますが、作ってしまったのでそのままにします。また、PASSについてはデバッグが終わったあとであればSecret textに変更可能ですが、最初はクリアテキストでデータが取れるかを見たほうがいいです。<br /><br />　作成したホストに今回のテンプレートをリンクさせ、<code>LD Data from Storcli</code>を<code>Execute now</code>で実行します。正しく設定されていれば、LLDが発動してアイテムが増えるはずです。LDが増えない場合、上記の制限事項にある手順の<code>storcli  /cx/vx set name=uniquename</code> で名前をつけたか確認してください。Latest dataでデータが取得できているのにLDが増えない場合おそらくこれが原因です。<br />　同じく<code>PD Data from Storcli</code>を実行すると、刺さっている物理ディスクの一覧が取得できると思います。<br /><br />　Latest dataが取れない場合、ZabbixからESXiにSSHが届くか、storcliのパスが合っているかなどを確認してください。<br /><h2>制限事項</h2><br />　物理ディスクの監視ですが、ディスク、HBAのファームウェアのバージョンによっては取得できない項目があります。<code>BBM Error count</code>や<code>Shield State Count</code>などはある程度のクラスのディスクでないと値を持っていないので、ディスクによっては取得できないかもしれません。その場合は取得不可のマークが付きますが、影響がないのでそのままにするかLLDで作成されたアイテムから監視の無効化をしてください。<br /><br /><a href=images/Zabbix_storcli-3.jpg class=lb><img src=images/Zabbix_storcli-3.jpg width=500px></a><br><br /><br />　また、物理ディスクの監視のために実行している<code>storcli /call/eall/sall show all j</code>で応答するJSONがかなり大きいため、搭載ディスク本数が24本などの巨大なマシンの場合はうまく取れないかもしれません。<br /><br />　Zabbix6系ではTEXT型アイテムの場合、history_textテーブルに格納され、使っているDBがMariaDBであればmediumtext型で格納されるため1回のデータ取得で16MBまでは入りますが、使っているDBの種類によっては入り切らない可能性があります。参考までに、ディスクを8本搭載したマシンで<code>storcli /call/eall/sall show all j</code>を実行すると22KBのJSONが出来上がります。<br /><br />　調べた限り、Zabbixは1つのセッションで1GBくらいのデータを流せるようなので、おそらくSSHからのデータ取得で問題になることは少ないかと思いますが、場合によってはタイムアウトの時間を伸ばす必要があるかもしれません。　<br /><br /><strike>　<code>storcli /call/eall/sall show all j</code>の結果については依存アイテムを分解するために実行しているだけなので、Zabbixが6系であればヒストリを「Do not keep history」にしてもLLD分解後のデータ取得は可能です。<br />　もともとデバッグのために1時間しか保持していませんが、コマンド実行に問題がなさそうであればstorcliの履歴については取得しない設定でも問題ないです。</strike><br />→テンプレートの微調整の際にデフォルトではstorcliの実行結果を保存しないようにしました。storcliのコマンド実行結果を眺めたい場合は <code>PD Data from Storcli</code> のアイテムヒストリをnoneから適宜変更してください<br /><br /><br /><h2>技術的内容(うらみつらみ)</h2><br />　今回、JSONとLLDを使うにあたってかなり多くの問題にあたりました。まず1つめはstorcliの返すJSONの作りが悪すぎること、そして2つめはZabbix側のJSONの処理がイケてないことです。両方じゃねーか!!!<br /><h3>ZabbixのJSONの扱いが微妙</h3><br />　ZabbixでJSONを扱うときに2つの問題がおきます。まず1つ目は、LLDでJSONを扱う場合、見つかったキーが<code>[&quot;LLDNAME&quot;]</code>とダブルクオートとブラケットに囲まれた状態で取得します。中身だけ見つけてくれ…と、せめてどうにか値に対してtrimやiregsubなどが使えないか試したのですが、どうやらここをどうにかする方法はないようです。<br /><br />　そのため、アイテム名を整形するために<code>Temperture of {{#MR_PD_NAME}.iregsub(&quot;\[\&quot;(.*)\&quot;\]&quot;, \1)}</code>というような正規表現をところどころで書く必要がありイケてないです。<br />　LLDで見つかったアイテムのキーについても<code>mrstat.pd.temp.[&quot;[\&quot;/c0/e252/s0:WDC WD1005FBYZ-01YCBB1:WD-WMC6M0F4M8WN\&quot;]&quot;]</code>というような状態で入ってしまうのですが、どうせこれは他では使わないしもういいや…と諦めました。<br /><br />　2つ目は、LLDを実行するときにJSONから複数の値が見つかった場合、それぞれ<code>[{&quot;key&quot;: &quot;value&quot;},{&quot;key&quot;: &quot;value&quot;}]</code>で返答する必要があり、<code>[&quot;value&quot;,&quot;value&quot;]</code>だとイテレータが動いてくれないという点です。<br /><a href="https://www.zabbix.com/forum/zabbix-help/419391-utilizing-jsonpath-to-setup-an-lld-macros" >https://www.zabbix.com/forum/zabbix-help/419391-utilizing-jsonpath-to-setup-an-lld-macros</a><br />　これもハマりましたが、上記のスレッドのカスタムスクリプトに助けられました。なおしておいてくれ～～～～～<br /><br /><h3>storcliのJSON構造がカス</h3><br />　storcliのJSONの構造で苦労したのは物理ディスクの応答内容がカスなことです。一例としては以下のようになります<br /><br /><blockquote> {<br />  &quot;Controllers&quot;: [<br />    {<br />      &quot;Response Data&quot;: {<br />        &quot;Drive /c0/e252/s0&quot;: [<br />          {<br />            &quot;DG&quot;: 0,<br />            &quot;DID&quot;: 14,<br />            &quot;EID:Slt&quot;: &quot;252:0&quot;,<br />            &quot;Intf&quot;: &quot;SATA&quot;,<br />            &quot;Med&quot;: &quot;HDD&quot;,<br />            &quot;Model&quot;: &quot;WDC WD1005FBYZ-01YCBB2&quot;,<br />            &quot;PI&quot;: &quot;N&quot;,<br />            &quot;SED&quot;: &quot;N&quot;,<br />            &quot;SeSz&quot;: &quot;512B&quot;,<br />            &quot;Size&quot;: &quot;931.000 GB&quot;,<br />            &quot;Sp&quot;: &quot;U&quot;,<br />            &quot;State&quot;: &quot;Onln&quot;,<br />            &quot;Type&quot;: &quot;-&quot;<br />          }<br />        ],<br />        &quot;Drive /c0/e252/s0 - Detailed Information&quot;: {<br />          &quot;Drive /c0/e252/s0 Device attributes&quot;: {<br />            &quot;Coerced size&quot;: &quot;931.000 GB [0x74600000 Sectors]&quot;,<br />            &quot;Connector Name&quot;: &quot;Port 0 - 7 x1&quot;,<br />            &quot;Device Speed&quot;: &quot;6.0Gb/s&quot;,<br />            &quot;Firmware Revision&quot;: &quot;RR07    &quot;,<br />            &quot;Link Speed&quot;: &quot;6.0Gb/s&quot;,<br />            &quot;Logical Sector Size&quot;: &quot;512B&quot;,<br />            &quot;Manufacturer Id&quot;: &quot;ATA     &quot;,<br />            &quot;Model Number&quot;: &quot;WDC WD1005FBYZ-01YCBB2&quot;,<br />            &quot;NAND Vendor&quot;: &quot;NA&quot;,<br />            &quot;NCQ setting&quot;: &quot;Enabled&quot;,<br />            &quot;Non Coerced size&quot;: &quot;931.012 GB [0x74606db0 Sectors]&quot;,<br />            &quot;Physical Sector Size&quot;: &quot;512B&quot;,<br />            &quot;Raw size&quot;: &quot;931.512 GB [0x74706db0 Sectors]&quot;,<br />            &quot;SN&quot;: &quot;WD-WMC6M0J95THT&quot;,<br />            &quot;WWN&quot;: &quot;50014EE0AF2FC003&quot;,<br />            &quot;Write Cache&quot;: &quot;N/A&quot;<br />          },<br />          &quot;Drive /c0/e252/s0 Policies/Settings&quot;: {<br />            &quot;Certified&quot;: &quot;No&quot;,<br />            &quot;Commissioned Spare&quot;: &quot;No&quot;,<br />            &quot;Connected Port Number&quot;: &quot;7(path0) &quot;,<br />            &quot;Cryptographic Erase Capable&quot;: &quot;No&quot;,<br />            &quot;Drive position&quot;: &quot;DriveGroup:0, Span:0, Row:0&quot;,<br />            &quot;Emergency Spare&quot;: &quot;No&quot;,<br />            &quot;Enclosure position&quot;: &quot;1&quot;,<br />            &quot;FDE Type&quot;: &quot;None&quot;,<br />            &quot;Last Predictive Failure Event Sequence Number&quot;: 0,<br />            &quot;Locked&quot;: &quot;No&quot;,<br />            &quot;Multipath&quot;: &quot;No&quot;,<br />            &quot;Needs EKM Attention&quot;: &quot;No&quot;,<br />            &quot;PI Eligible&quot;: &quot;No&quot;,<br />            &quot;Port Information&quot;: [<br />              {<br />                &quot;Linkspeed&quot;: &quot;6.0Gb/s&quot;,<br />                &quot;Port&quot;: 0,<br />                &quot;SAS address&quot;: &quot;0x4433221107000000&quot;,<br />                &quot;Status&quot;: &quot;Active&quot;<br />              }<br />            ],<br />            &quot;SED Capable&quot;: &quot;No&quot;,<br />            &quot;SED Enabled&quot;: &quot;No&quot;,<br />            &quot;Sanitize Support&quot;: &quot;Not supported&quot;,<br />            &quot;Secured&quot;: &quot;No&quot;,<br />            &quot;Sequence Number&quot;: 2,<br />            &quot;Successful diagnostics completion on&quot;: &quot;N/A&quot;,<br />            &quot;Wide Port Capable&quot;: &quot;No&quot;<br />          },<br />          &quot;Drive /c0/e252/s0 State&quot;: {<br />            &quot;BBM Error Count&quot;: 0,<br />            &quot;Drive Temperature&quot;: &quot; 32C (89.60 F)&quot;,<br />            &quot;Media Error Count&quot;: 0,<br />            &quot;Other Error Count&quot;: 0,<br />            &quot;Predictive Failure Count&quot;: 0,<br />            &quot;S.M.A.R.T alert flagged by drive&quot;: &quot;No&quot;,<br />            &quot;Shield Counter&quot;: 0<br />          },<br />          &quot;Inquiry Data&quot;: &quot;7a 42 ff 3f 37 c8 10 00 00 00 00 00 3f 00 00 00 00 00 00 00 20 20 20 20 57 20 2d 44 4d 57 36 43 30 4d 39 4a 54 35 54 48 00 00 00 00 00 00 52 52 37 30 20 20 20 20 44 57 20 43 44 57 30 31 35 30 42 46 5a 59 30 2d 59 31 42 43 32 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 10 80 00 40 00 2f 01 40 00 00 00 00 07 00 ff 3f 10 00 3f 00 10 fc fb 00 00 5d ff ff ff 0f 00 00 07 00 &quot;<br />        }<br />      }<br />    }<br />  ]<br />}</blockquote><br /><br />　各情報について、なぜ変動する値がキーになっているのか、微妙に違うキーに値を入れるのやめろ、と言いたくなります。例えば、ディスクの温度とシリアルを取りたい場合のデータの位置は以下になります。<br /><br /><blockquote> json.Controllers[0][&quot;Response Data&quot;][&quot;Drive /c0/e252/s0 - Detailed Information&quot;][&quot;Drive /c0/e252/s0 State&quot;][&quot;Drive Temperature&quot;] = &quot; 32C (89.60 F)&quot;;<br />json.Controllers[0][&quot;Response Data&quot;][&quot;Drive /c0/e252/s0 - Detailed Information&quot;][&quot;Drive /c0/e252/s0 Device attributes&quot;].SN = &quot;WD-WMC6M0J95THT&quot;;</blockquote><br /><br />　なぜ以下のようにしなかったのか…<br /><br /><blockquote>json.Controllers[0][&quot;Response Data&quot;][&quot;PhysDrive&quot;][0][&quot;Path&quot;]= &quot;/c0/e252/s0&quot;;<br />json.Controllers[0][&quot;Response Data&quot;][&quot;PhysDrive&quot;][0][&quot;SN&quot;] = &quot;WD-WMC6M0J95THT&quot;;<br />json.Controllers[0][&quot;Response Data&quot;][&quot;PhysDrive&quot;][0][&quot;Detailed Information&quot;][&quot;State&quot;][&quot;Drive Temperature Celsius&quot;] = 32</blockquote><br /><br />　もともとディスクのシリアルと型番を元にクエリを投げて温度を取ろうと思い、上記のような構造であればJSONだけでクエリが完結したのですが、このような構造のためLLDのキーに色々仕込む必要がありました。<br />　内容としてはカスタムスクリプトに正規表現でパスを取り出すものを仕組み、LLDの名前として取得して、LLDのアイテムプロトタイプで正規表現で取り出す、という内容です。<br /><br />　LLDのカスタムスクリプト<br /><br /><blockquote>var array = JSON.parse(value)<br />var drives = []<br />for (var a in array) {<br />    for (var ar in array[a]){<br />        if ( ar.indexOf(&quot;Detailed Information&quot;) != -1){<br />            prefix=ar.replace(/(Drive\s\/[\w\/]+)\s.*/,&quot;$1&quot;);<br />            path=ar.replace(/Drive\s(\/[\w\/]+)\s.*/,&quot;$1&quot;);<br />            detail=prefix+&quot; Device attributes&quot;;<br />            drive=path+&quot;:&quot;+array[a][ar][detail][&quot;Model Number&quot;].trim()+&quot;:&quot;+array[a][ar][detail].SN<br />            drives.push(drive)<br />        }<br />    }<br />}<br /><br />var len = drives.length;<br />var x = 0<br />output = &quot;{ \&quot;data\&quot; :[&quot;<br />for (; x &lt; len - 1; x++){<br />output += &quot;{\&quot;Name\&quot;: \&quot;&quot; + drives[x] + &quot;\&quot;},&quot;<br />}<br />output += &quot;{\&quot;Name\&quot;: \&quot;&quot; + drives[x] + &quot;\&quot;}&quot;<br />output += &quot;]}&quot;<br />return output </blockquote><br /><br />　上記のカスタムスクリプトでこのような名前が取れるので、これをLLDで見つかったディスクとして認識させます。<br /><br /><a href=images/Zabbix_storcli-4.jpg class=lb><img src=images/Zabbix_storcli-4.jpg width=500px></a><br><br /><br /> そして、LLDのアイテムプロトタイプにて、JSONpathでデータを取得する際に<code>.iregsub(&quot;\[\&quot;([0-9a-z\/]+):.*\&quot;\]&quot;, \1)}</code>で一番最初のスロットナンバーの情報を切り出してJSONのキーに埋め込んでいます。<br /><br /><blockquote> $.Controllers..[&quot;Response Data&quot;]..[&quot;Drive {{#MR_PD_NAME}.iregsub(&quot;\[\&quot;([0-9a-z\/]+):.*\&quot;\]&quot;, \1)} State&quot;][&quot;Drive Temperature&quot;]</blockquote><br /><br />　イケてねえ…。まあイケてないものをイケてない方法でどうにかしようとしているので汚くなるのは必然ですが…。<br /><h2>まとめ</h2><br />　Zabbixは仕事でもプライベートでも使うことが多く、いろいろな意味で一番柔軟性が高い監視方法だと感じています。特定のログを検知しても水曜日の6-7時だけは検知を除外する、というような要求でも、Zabbixであればそれなりに複雑なトリガーの条件式で対応できますが、他の監視方法だとかなりキツイ、もしくはそんな方法はない、という事なりがちで、良くも悪くも使い込めば使い込むほど他のものが使えなくなります。<br /><br />　Zabbixは以前の仕事でそれなりに使っていたつもりだったのですが、今回やった内容は全く知らず、「え、そんなことできたの…」という発見もかなりありました。Zabbixはパズルですが、どうにかする方法はあるのでみんなで沼に沈みましょう。<br /><br />　おそらく、今回の方法ももう少しスマートな方法がある気がしますが、とりあえず動いたので参考にはなるかと思います。<br /><br />追記:<br />　その後実際に役に立ってしまったので動作については問題ないと思います。また、storcliのデータについてはデフォルトではヒストリを取らない設定に変更し、ディスクのステータスの追加のデータを取るように変更しました。何が起きてるかを知りたいときには手動でヒストリの取得を有効にしてください。<br />　また、コントローラーが複数存在する場合に、2台目以降のコントローラーのデータが上手くパースできていない問題も修正しました。<br /><br /><a href=images/Zabbix_storcli-5.jpg class=lb><img src=images/Zabbix_storcli-5.jpg width=500px></a><br>]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry190803-020323">
		<title>【その他】BlogをホストしてるVMを新しくした</title>
		<link>http://xmms.jp/blog/index.php?entry=entry190803-020323</link>
		<description><![CDATA[　なんだかんだ長くこのブログも動いているのですが、中のOSが古くなってきたので新しくしました。もともとは物理マシンでDebian 6(の超初期版)が動いていたのですが、VM環境ができあがりつつあったのでイメージをddでVMに持ってきて、その後式年遷宮(新規VM作成後にコンテンツコピー)でDebian7に移行しました。その後dist-upgradeでDebian8までは持ってきたのですが、OSデフォルトのPHPのバージョンアップ等の絡みでそのまま塩漬けになっていました。<br /><br />　しかし、7から移行した関係でApacheのバージョンが2.2のままだったので(果たして8になったと言えるのか…)いい加減新しくしたいと思っていたのですが、家で動いているZabbixも7から9に移行しようとして失敗したのでdist-upgradeはやめ、環境が古すぎてなんで入っているのかわからないパッケージやもはや使ってないDBなどもあり、この辺をきれいにする意味も兼ね、今年7月に出たDebian10の評価を兼ねてまた式年遷宮しました。<br /><br />　ちなみにZabbixマシンもMySQLのダンプを吐いてまっさらなDebian9のVMにインポートし、Zabbix-server周りの設定だけよしなに変えて式年遷宮しました。MySQLからMariaDBに変わったり、昔から残ってるinitスクリプトとsystemdの関係がうまく行かなかったりしてdist-upgradeで色々つらい感じになりました。<br /><br />　ただ、Debian10のマシンにそのままコピーだと(シンプルな作りのこのブログシステムであっても)いくつかPHP7で廃止された関数を使われていた関係で500が帰ってきてしまい、それを直したりデザインを少し変えたりしたらなんだかんだで丸2日くらいかかってしまいました。<br /><br /><br />　とりあえず表面上は動いているのですが、何が問題が出そうで怖いです…]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry170422-171024">
		<title>【その他】スマホが死んだ/USBハブ付きGibEケーブル買った</title>
		<link>http://xmms.jp/blog/index.php?entry=entry170422-171024</link>
		<description><![CDATA[　自分は1-2世代前の安くなった中古のスマホを買って適当なSIMを挿して使っているのですが、去年の2月くらいに買ったSOL25 (Xperia Z2)が車に轢かれて死にました。手元に来て享年1年でした。<br /><br /><a href=images/P2360909_R.JPG class=lb><img src=images/P2360909_R.JPG width=500px></a><br><br /><br />　顛末としては､<br /><br />雨が降っていたので、出ようとしたバスに駆け乗る→帰宅→1時間後、直前まであったスマホがないことに気がつく→Ggoogleのデバイスマネージャからもオフライン→駅前の交番までいき、遺失物届け出がないか確認→遺失物には来てないのでとりあえず紛失届を出す→帰り際、ちらっと見たら道端に転がっている見覚えのあるフォルム→死体発見→5分前に出した紛失届を取り下げ<br /><br />　といった感じでした。 割と気に入っていたのにあまりにも悲しい別れでした。まあ、盗まれてデータ抜かれるよりはマシなので見つかってまだ良かったというべきでしょうか…<br /><br />　発見当初は電源も入らない状態だったので、とりあえずUQMobileのSIMとマイクロSDを摘出したところ、マイクロSDは生きていたのですが、SIMはマイクロSIMが刺さる機種が手元になかったので生死が不明でした。<br />　手元のゴミ箱を漁ったところ、4000円だったのでとりあえず買ったSHL24が見つかったので､SIMを切って差し込み､動くかどうかだけみてみました｡<br />　結果は､APN設定は必要でしたが､SIM自体はそのまま動いたので､しばらく代替としてSHL24を使う事にしたのですが､さすがに今となってはちょっと動作が厳しいです｡<br /><br />　その後､Zeonfone GoとButterfly 3(HTV31)を入手したのですが､ZenfoneはSIMサイズがマイクロなので 再度変換が必要になり､HTV31はVoLTE対応のSIMが必要(手持ちの物は非対応)になったので､どちらを使うにしてもそのままでは使えないのでしばらくはSHL24にルーターになってもらう必要がありそうです｡｡<br /><br />　Xperia Z2の方は､バッテリへのダメージに依る爆発におびえながら、しばらく電源に繋いでいたところ電源は入るようになったので、いくつか欲しいデータがあったので何とか取得できないかあれこれしました。幸い?カスタムファームを入れていたので電源+VolDownでTWRPのリカバリシェルに入り､ADBドライバが通じたので何とかデータをサルベージで来ました｡<br /><br /><a href=images/IMAG0019_R.jpg class=lb><img src=images/IMAG0019_R.jpg width=500px></a><br><br /><br /><br />　まあ､画面が見えないので多分リカバリシェルが立ち上がってるだろう､なのですが｡｡ちなみにリカバリ画面だとMHLケーブルを繋いでも何も出力されません。こういった事態に備えて何かしらの方法でリモート接続を出来るようにしておいても良いかもしれませんね…。<br /><br /><br /><br />　閑話休題､最近のUltrabookのような薄型PCだとUSBポートが枯渇したり有線イーサネットポートが無かったりして不便なので、秋葉原PCネット地下の何とも怪しげなUSB3.0+GibE搭載ハブ?ハブ付きNIC?を買ってみました。<br /><br /><a href=images/R_IMAG0024.jpg class=lb><img src=images/R_IMAG0024.jpg width=500px></a><br><br /><br />　前情報は何もありませんでしたが、開けてみると<a href="http://www.banggood.com/KY-688-USB-3_0-to-3-Port-USB-3_0-Hub-Adapter-10GBits-Gigabit-Ethernet-for-Laptop-PC-MAC-p-1103201.html" >KY-688</a>というモデルで、中身はVIAのスイッチチップ+Realtek RTL8153という当たり障りのない構成でした。<br /><br />　ネットワークパフォーマンス的には、iperfで940Mbps/上り下りが出て、USB3.0のスピードも200MB/s程度まで出ることは確認しましたが、手元にそれ以上速いデバイスがないのでどこで飽和するかは謎です。<br />　Surface3ProとL2的に繋がっているVM(AX3650S-48T4XW経由で10Gスイッチ接続)との計測結果です。<br /><blockquote><br />$ iperf -c Surface3Pro -i 10 -t 60<br />------------------------------------------------------------<br />Client connecting to Surface3Pro, TCP port 5001<br />TCP window size: 85.0 KByte (default)<br />------------------------------------------------------------<br />[  3] local 172.20.1.66 port 60313 connected with 172.20.1.211 port 5001<br />[ ID] Interval       Transfer     Bandwidth<br />[  3]  0.0-10.0 sec  1.10 GBytes   941 Mbits/sec<br />[  3] 10.0-20.0 sec  1.10 GBytes   941 Mbits/sec<br />[  3] 20.0-30.0 sec  1.10 GBytes   941 Mbits/sec<br />[  3] 30.0-40.0 sec  1.10 GBytes   941 Mbits/sec<br />[  3] 40.0-50.0 sec  1.10 GBytes   941 Mbits/sec<br />[  3] 50.0-60.0 sec  1.09 GBytes   935 Mbits/sec<br />[  3]  0.0-60.0 sec  6.57 GBytes   940 Mbits/sec</blockquote><br /><br />　クライアントとサーバを逆転しても変わらないので逆は省略<br /><br />　RTL8153チップは最近のLinuxカーネルやWindows10ならそのまま認識できるので、軽作業用途には癖が無くておすすめです。ヘビーユースに耐えられるかは謎ですが。<br /><br />以上です。<br /><br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry140411-010826">
		<title>【その他】ごみスクリプト置き場</title>
		<link>http://xmms.jp/blog/index.php?entry=entry140411-010826</link>
		<description><![CDATA[　某所にいたときに不毛な作業を少しでも楽にしようと足掻いた時に作ったゴミを置いておきます。たまにこれをベースに何かを作ったりするので主に自分のためのメモですが。<br />　内容としては、Expectで複数サーバに対して同一コマンドをsuして実行するだけのゴミと複数のサーバから一か所にファイルをSCPで集めるか送るだけのゴミです。<br /><br /><br /><br /><h3>スクリプト背景</h3><br />　背景として、何かの作業をする時にまず踏み台サーバにログインし、そのあとでさらにSSHを張って二重SSHで作業する必要がある環境でした。その踏み台についても、環境ごとに踏み台先がいくつかあり簡単な作業をしようとしてもログインやらなんやらが結構めんどくさかったのです。全台同一設定作業であれば何とかして楽したいというのがこの背景です。<br /><br />　先進的なところであればこの手の仕組みはすでにあるはずなのですが、某所にはない＆何かエージェントを入れるといったことはできないため、どうにか手元だけでなんとかする必要がありました。<br />　最初はTeratermマクロで頑張ろうとしましたが、どうもマクロの書き方が好きになれなかったのと自分の知識不足により一部うまく処理できない内容があり、その結果Cygwin+Expect(Tcl)がよさげという判断になりました。そもそも論でその判断すら残念ですが。<br /><br /><h3>実行環境</h3><br />　Cygwin+Expectを入れてください。たぶん動きます。LinuxのExpectでも動いたので手元にLinux環境があるならyum install expectなどで入れてください。<br /><br /><br /><h2>SSHするゴミ</h2><br /><br /><blockquote>#!/usr/bin/expect<br />#使い方: ./gomi1.sh $IPが書かれたファイル $コマンドが書かれたファイル<br /><br />#IPのリストファイル読み込み<br />set file [open [lindex $argv 0 ]]<br />set list [split [read $file] &quot;\n&quot;]<br />close $file<br /><br />#コマンドリストファイル読み込み  <br />set file2 [open [lindex $argv 1 ]]<br />set cmd [split [read $file2] &quot;\n&quot;]<br />close $file2<br /><br />#ネットワーク環境が悪い場合を考え10文字送ったら0.1秒待つ<br />set send_slow {10 0.1}<br /><br />#ループカウンタその他<br />set prv &quot;&quot;<br />set cnt 1<br /><br />#カンマ区切りのサーバリストファイルを読み込む<br />foreach l $list {<br />  #カンマをばらす<br />  set line [ split $l &quot;,&quot; ]<br />  #第一カラムから踏み台先のIPを得る<br />  set humidai [lindex $line 0 ]<br />  #踏み台にログインするためのユーザー<br />  set h_usr     [lindex $line 1 ]<br />  #踏み台にログインするためのパスワード<br />  set h_pw  [lindex $line 2 ]<br />  #踏み台のプロンプト(PS1,[aaa@~ ]$ など)<br />  set h_ps     [lindex $line 3 ]<br />  #踏み台からSSH接続するIP<br />  set r_ip  [lindex $line 4 ]<br />  #踏み台からSSHを張る時に使うユーザー<br />  set r_usr    [lindex $line 5 ]<br />  #踏み台からSSHを張る時に使うパスワード<br />  set r_pw     [lindex $line 6 ]<br />  #リモートの通常ユーザのプロンプト<br />  set r_ps     [lindex $line 7 ]<br />  #リモートでsu -するときに使うパスワード<br />  set r_supw   [lindex $line 8 ]<br />  #リモートのrootのプロンプト<br />  set r_root_ps    [lindex $line 9 ]<br />  #最終行に来たら終了する<br />  if {$humidai == &quot;&quot;} {<br />    exit<br />  }<br />  #踏み台が直前と違ったらSSHを張りなおすために今のセッションを切る<br />  if { $prv != $humidai } {<br />    if { $cnt != 1 } {<br /> 　　   puts &quot; Humidai changed &quot;<br />   　　 close<br />    }<br />   #踏み台にSSHを張る<br />    spawn ssh $h_usr@$humidai<br />    expect &quot;password: &quot; {<br />      send -s &quot;$h_pw\r&quot;<br />   #初回SSH接続時のアレをｙする  <br />    } &quot;/no)? &quot; {<br />       send -s &quot;yes\r&quot;<br />       expect &quot;password: &quot;<br />       send -s &quot;$h_pw\r&quot;<br />    }<br />  }<br /> <br />  #--踏み台にSSHを張った後の処理--<br />  #プロンプトを待つ<br />  expect &quot;$h_ps&quot;<br />  #踏み台のヒストリがsshだらけになってしまうので無視させる<br />  send -s &quot;export HISTIGNORE=* \r&quot;<br />  expect &quot;$h_ps&quot;<br />  #踏み台から対象サーバにSSHを張る<br />  send -s &quot;ssh $r_usr@$r_ip \r&quot;<br />  expect &quot;password: &quot; {<br />   send -s &quot;$r_pw\r&quot;<br />  } &quot;/no)? &quot; {<br />   send -s &quot;yes\r&quot;<br />   expect &quot;password: &quot;<br />   send -s &quot;$r_pw\r&quot;<br />  }<br /> <br />  #--リモートにSSHを張った後の処理--<br />  expect &quot;$r_ps&quot;<br />  #suする<br />  send -s &quot;su - \r&quot;<br />  #password:を待つ<br />  expect &quot;:&quot;<br />  send -s &quot;$r_supw\r&quot;<br />  expect &quot;$r_root_ps&quot;<br />  #ワンライナーで長いコマンドを書いてしまうとヒストリがカオスなことになってしまうので無視させる<br />  send -s &quot;export HISTIGNORE=* \r&quot;<br /><br />  #--コマンドが書かれたファイルを読み込みrootでコマンドを実行していく--<br />  foreach c $cmd {<br />    expect &quot;$r_root_ps&quot;<br />    send -s &quot;$c \r&quot;<br />  }<br /> <br />  #--コマンド実行終了--<br />  #後処理、何度も実行するとヒストリがHISTIGNOREだらけになってしまうのでそれを消す<br />  send -s &quot;for a in `history|grep HISTIGNORE|awk &#039;{ print \$1 }&#039; |srot -nr `; do histroy -d \$a;done \r&quot;<br />  expect &quot;$r_root_ps&quot;<br />  send &quot;exit\r&quot;<br />  expect &quot;$r_ps&quot;<br />  send -s &quot;exit \r&quot;<br />  #踏み台のヒストリからHISTIGNOREを消す<br />  expect &quot;$h_ps&quot;<br />  send -s  &quot;for a in `history|grep HISTIGNORE|awk &#039;{ print \$1 }&#039; |srot -nr `; do histroy -d \$a;done \r&quot;<br /><br />  set prv &quot;$humidai&quot;<br />  set cnt [expr $cnt + 1 ]<br />}<br /></blockquote><br /><br />なお、ゴミなので入力エラーなどなにもチェックしていません。<br />また、ファイルへコピーするときはUTF-8（BOMなし）とLFの改行コードで作成しないと怒られます。<br /><br />使い方は、<br />./このファイル名.sh IPりすとファイル　コマンドが書かれたファイル<br />として使います。<br /><br />IPリストファイルの書き方は、以下のように書きます。Excelなどでcsvを作り、dos2unixなどで改行コードをlfにすると楽です。#などは別にコメントアウト扱いにならないため注意してください。<br /><br /><blockquote>#踏み台IP,踏み台ログインユーザ,踏み台ユーザパスワード,踏み台ユーザプロンプト,接続先IP,リモートユーザ,リモートユーザパスワード,リモートユーザプロンプト,リモートrootパスワード,リモートrootプロンプト<br /><br />192.168.1.100,usr1,usrpass,]$ ,192.168.2.99,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.100,usr1,usrpass,]$ ,192.168.2.98,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.100,usr1,usrpass,]$ ,192.168.2.97,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.101,usr1,usrpass,]$ ,192.168.3.99,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.101,usr1,usrpass,]$ ,192.168.3.98,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />....<br /></blockquote><br />HOSTNAMEに関してはスクリプト内では使っていませんが、とりあえず一つのファイルに全ての情報を書いておくと作業依頼が来たときに対象を絞り出す時に便利なので書いていました。リストファイルはローカルのみでの保存なのでセキュリティーは確保されている前提です（きり<br /><br />作業対象のホスト名だけを書いたlstというファイルを置いて<br /><blockquote>for a in `cat lst`; do grep $a ip.lst ;done<br /></blockquote><br />みたいなことをするとリストから必要な情報だけをとれます。<br /><br />コマンドファイルは単純に実行するコマンドを縦に書いていきます。<br /><blockquote>echo &quot;`uname -n` at `date`&quot;<br />ls /<br />whoami<br /></blockquote><br />など…<br /><br />ちなみに&#039;&quot;&#039;や&#039;$&#039;などは特にエスケープしなくてもExpectかTclがよしなにしてくれるようですが、すべてを確認したわけではないので事前に爆発しないか確認してください。<br /><br /><h2>SCPするゴミ</h2><br />上のSSHするゴミで実行した結果を/tmpなどに書き出し、それをまとめて踏み台に持ってくるためのゴミです。<br />ただし、あくまでも”踏み台サーバから(まで)&quot;のファイル移動なので、手元に持ってくる（配布物を踏み台に持っていく）には手動でSCPをする必要があります。まあ少し書けばそれ単体のスクリプトも作れますが…。<br /><br /><blockquote>#!/usr/bin/expect<br />#使い方: ./gomi2.sh -p|-g $iplistfile $filelist<br />set m [lindex $argv 0 ]<br /><br />#SCPのオプション<br />set scp &quot;scp -pr&quot;<br />#持っていく、またはとってくるときにファイルを置くディレクトリ<br />set dir &quot;/tmp/&quot;<br /><br />#IPのリストを開く<br />set file [open [lindex $argv 1 ]]<br />set list [split [read $file] &quot;\n&quot;]<br />close $file<br /><br />#ファイルリストを開く<br />set file2 [open [lindex $argv 2 ]]<br />set   flst [split [read $file2] &quot;\n&quot;]<br />close $file2<br /><br />#カウンタとか<br />set prv &quot;&quot;<br />set cnt 1<br />set send_slow {10 0.1}<br /><br /> <br />#モードの切り替え<br />if {$m == &quot;-p&quot; } {<br />   set mode &quot;put&quot;<br /> } elseif {$m ==&quot;-g&quot;} {<br />   set mode &quot;get&quot;<br /> } else {<br />   puts stderr &quot; first option must be -p or -g &quot;<br />   puts stderr &quot; -p is &#039;put&#039;, -g is &#039;get&#039;&quot;<br />   exit<br /> }<br />#debug<br />puts &quot; mode is $mode &quot;<br /><br />#IPリストを開いてアレする<br />foreach l $list {<br />  #カンマをばらす<br />  set line [ split $l &quot;,&quot; ]<br />  #第一カラムから踏み台先のIPを得る<br />  set humidai [lindex $line 0 ]<br />  #踏み台にログインするためのユーザー<br />  set h_usr     [lindex $line 1 ]<br />  #踏み台にログインするためのパスワード<br />  set h_pw  [lindex $line 2 ]<br />  #踏み台のプロンプト(PS1,[aaa@~ ]$ など)<br />  set h_ps     [lindex $line 3 ]<br />  #踏み台からSSH接続するIP<br />  set r_ip  [lindex $line 4 ]<br />  #踏み台からSSHを張る時に使うユーザー<br />  set r_usr    [lindex $line 5 ]<br />  #踏み台からSSHを張る時に使うパスワード<br />  set r_pw     [lindex $line 6 ]<br />  #リモートの通常ユーザのプロンプト<br />  set r_ps     [lindex $line 7 ]<br />  #リモートでsu -するときに使うパスワード<br />  set r_supw   [lindex $line 8 ]<br />  #リモートのrootのプロンプト<br />  set r_root_ps    [lindex $line 9 ]<br /><br />  if {$humidai == &quot;&quot;} {<br />    exit<br />  }<br /> <br />  if { $prv != $humidai } {<br />    if { $cnt != 1 } {<br />      close<br />    }<br />    puts &quot; start scp &quot;<br />    spawn ssh $h_usr@$humidai<br />    expect &quot;password: &quot; {<br />      send -s &quot;$h_pw\r&quot;<br />    } &quot;/no)? &quot; {<br />      send -s &quot;yes\r&quot;<br />      expect &quot;password: &quot;<br />      send -s &quot;$h_pw\r&quot;<br />    }<br />  }<br />  #踏み台のヒストリがSCPだらけになってしまうのを防ぐためにすべてをHISTIGNOREする<br />  expect &quot;$h_ps&quot;<br />  send -s &quot;export HISTIGNORE=* \r&quot;<br />  expect &quot;$h_ps&quot;<br />  send -s  &quot;for a in `history|grep HISTIGNORE|awk &#039;{ print \$1 }&#039; |sort -nr `; do history -d \${a};done \r&quot;<br /><br /><br />  #ファイルリストを読み込む<br />  foreach f $flst {<br />    expect &quot;$h_ps&quot;<br />    if { $f == &quot;&quot; } {<br />      #最後のファイルをSCPするために空エンターする必要がある<br />      send -s &quot; \r&quot;<br />      break<br />    }<br />    #送信か受信か<br />    if {$mode == &quot;get&quot;} {<br />      #--ファイル受信開始--<br />      send -s &quot;$scp $r_usr\@$r_ip\:$f $dir \r&quot;<br />    } elseif {$mode == &quot;put&quot;} {<br />      #--ファイル送信開始--<br />      send -s &quot;$scp $f $r_usr\@$r_ip\:$dir \r&quot;<br />    }<br />   <br />    #SCPしていく<br />    expect &quot;password: &quot; {<br />      send -s &quot;$r_pw\r&quot;<br />    } &quot;/no)? &quot; {<br />      send -s &quot;yes\r&quot;<br />      expect &quot;password: &quot;<br />      send -s &quot;$r_pw\r&quot;<br />    }<br />  }<br />  set prv &quot;$humidai&quot;<br />  set cnt [expr $cnt + 1 ]<br />}<br /></blockquote><br /><br />使い方<br />ファイルリストに書かれた&quot;踏み台サーバにある&quot;ファイルを対象サーバの/tmpに配置する<br />./gomi2.sh -p  IPリストファイル ファイルリスト<br /><br />某所の環境はrootで直接ログインできず、一般ユーザでログインする必要があり、また権限の問題でファイルの受け渡しに/tmpを使う必要があったため、送信：受信ディレクトリを/tmpとしています。<br />IPリストファイルのフォーマットはSSHするゴミと同じです。<br /><br />ファイルリストは対象ファイルをフルパスで書く必要があります。<br /><br />例<br />SSHするゴミでifconfig -aの情報を&gt;/tmpに書き出し、SCPするゴミで踏み台に持ってくる<br /><blockquote>#コマンドファイル<br />[root@localhost html]# cat cmd.lst<br />ifconfig -a &gt;/tmp/ifconfig-`hostname`.txt<br />chmod 777 /tmp/ifconfig-`hostname`.txt<br />#IPリスト<br />[root@localhost html]# cat ip.lst<br />192.168.1.100,usr1,usrpass,]$ ,192.168.2.99,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.100,usr1,usrpass,]$ ,192.168.2.98,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.100,usr1,usrpass,]$ ,192.168.2.97,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.101,usr1,usrpass,]$ ,192.168.3.99,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br />192.168.1.101,usr1,usrpass,]$ ,192.168.3.98,usr1,usrpass,]$ ,rootpass,]# ,HOSTNAME<br /><br />#実行<br />[root@localhost html]# ./gomi.sh ip.lst cmd.lst<br />（省略）<br /></blockquote><br />これでとるべき情報をまず/tmp/ifconfig-`hostname`.txtとして保存したので、その後SSHするゴミで踏み台の/tmpに集めます。<br /><blockquote>#リストファイル<br />[root@localhost html]# cat file.lst<br />/tmp/ifconfig-*.txt<br />#実行<br />[root@localhost html]# gomi2.sh -g ip.lst file.lst<br /></blockquote><br />これで踏み台の/tmpにそれぞれの内容が集まったので、あとは手でSCPして持ってきます。<br /><blockquote>[root@localhost html]# for a in `cut -f1 -d&quot;,&quot; ip.lst|uniq`;do scp -pr ${a}:/tmp/ifconfig-*txt ./;done<br /></blockquote><br />まとめ<br />本来であればこんなことしなくても一括配布的な何かが導入されていそうなものなのですが…<br />しかし、よくみんな今まで手で一つ一つ作業していたなあと逆に感心しました。<br /><br />自分のためのメモですが、何かのベースにしたりするのはご自由にどうぞ。Expectの需要が今更あるのか謎ですが。]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry121111-035505">
		<title>【その他】Nexus7の充電ケーブルを作る</title>
		<link>http://xmms.jp/blog/index.php?entry=entry121111-035505</link>
		<description><![CDATA[前に書いたメモが出てきたのでせっかくなので掲載します。<br /><br />　会社の開発用としてnexus 7が来たのですが、ふと充電をしようとしたところ、何故か純正のACアダプタ以外のAC-USBやモバイルブースターでは充電が開始されないのです。<br /><br /><a href=images/IMG_0047_R2.JPG class=lb><img src=images/IMG_0047_R2.JPG width=500px></a><br><br /><br />　電圧/電流のどちらかが足りていないのかと最初は思いましたが、amazonで売っている5V/2.1A出せるという<a href="http://www.amazon.co.jp/cheero-10000mAh-%E5%A4%A7%E5%AE%B9%E9%87%8F%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC-%E2%98%85iPhone5-Wi-Fi%E3%83%AB%E3%83%BC%E3%82%BF%E5%AF%BE%E5%BF%9C%E2%98%85/dp/B0081LRCJW/ref=sr_1_2?ie=UTF8&amp;qid=1352574790&amp;sr=8-2" >格安バッテリ</a>でも充電が開始されませんでした。このバッテリは過去にipadも充電できた実績があるので、どうやらそれ以外に要因がありそうでした。<br /><br />　そんなことを言っているとツイッターで「結線が特殊なのでは？｣と言われ、そういえば、古くはW-03es、IS02/01やSH09Cなどでも「PC以外から充電するには充電専用ケーブルでないと認識しない｣ということがあったので、充電用のケーブルを試してみました。秋葉原の三月兎やあきばおーあたりで100円程度で売っています。<br /><br /><a href=images/IMG_0037_R2.JPG class=lb><img src=images/IMG_0037_R2.JPG width=500px></a><br><br /><br />　これに差し替え充電すると、しっかり認識されました。<br /><br /><a href=images/IMG_0045_R2.JPG class=lb><img src=images/IMG_0045_R2.JPG width=500px></a><br><br /><br />　これの違いは何か、と以前に調べたところ、どうやらUSBの2番と3番がショートしているようです。<br />　今まで作ったことはありませんでしたが、自分でも作れるのでは？というか本当にそれだけなの？と思い、作ってみました。<br /><br />　上がmicro（スマホ）側で、下がA（充電器）側です。このスマホ側を撚ります。間違えた結線をしたら危険なので、真似する場合はA側はオープンで絶縁してください。（あるのか<br />　当たり前ですがPCとのデータのやりとりには使えなくなります。<br /><br /><a href=images/IMG_0040_R2.JPG class=lb><img src=images/IMG_0040_R2.JPG width=500px></a><br><br /><br />　AC側が結線されていなければスマホ側を間違えても大丈夫ですが、間違えて電源のラインを剥いて、それがシールドのアルミ泊やヒゲに接触してショートするなんてことも…。<br />　まあこのブログ読んでる人はそんなことはわかっていると思いますが。<br /><br />　幸い、このケーブルは一般的なケーブル色でしたが、一応テスターなどで調べてから結線してください。以前に被覆を剥いたら中のケーブルが全部黒色一色で片っ端から剥いて結線を調べたなんてこともありましたが…。<br /><br />そしてつないでみると、無事に充電が開始されました。実験なのでセロテープ絶縁です。汚いですが気にしない。<br /><br /><a href=images/IMG_0044_R2.JPG class=lb><img src=images/IMG_0044_R2.JPG width=500px></a><br><br /><br />　A側のショートを解除してみると、やはり充電されません。「放電中」ではなくて「充電していません」とでるのがケーブルが断線しているときとの違いです。<br /><br /><a href=images/IMG_0043_R2.JPG class=lb><img src=images/IMG_0043_R2.JPG width=500px></a><br><br /><br />　こんなことせずに、おとなしく100円の充電ケーブルを買えばいいだけの話ですが、出先でnexus7を充電しようと思ったら社外製AC-USBとデータ通信用のMicroBケーブルしかない！というときなどには自作する必要があるかもしれません。（ねえよ<br /><br />　ちなみに、充電専用ケーブルを使うと、AndroidをPCから充電したときにUSBデバイスとして認識させずに充電できるので、通常より早く充電できます。なので、どのみち充電専用ケーブルは1本くらい持っておいた方がいいかもしれません。<br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry121106-005733">
		<title>【その他】PQI AirCardでステルスAPに繋ぐ</title>
		<link>http://xmms.jp/blog/index.php?entry=entry121106-005733</link>
		<description><![CDATA[　一部でHotなWifi付きSDカードですが、Flucard、Eye-fi、FlashAir、AirCardと並べたときに、一番あれこれしやすそうだったのがAirCardだったので、買ってみました。秋葉原の<a href="http://www.janpara.co.jp/shopinfo/minimap/?shopcd=119" >じゃんぱらD-style店</a> で3980円でした。<br /><a href=images/IMG_0034_R2.JPG class=lb><img src=images/IMG_0034_R2.JPG width=500px></a><br><br />　詳しいことはすでに<a href="http://lynxeyed.hatenablog.com/entry/2012/10/16/204304" >こちら</a>のブログや<a href="http://hitoriblog.com/?p=12627" >こちら</a>で書かれているので省略しますが、要するにWifiAPにもWifiClientにもなるSDカードで、中でFTPとHTTPD（と、何故かTelnetd)が動いているのであれこれしやすいというわけです。ちなみに、いつどこで買ったかもよく覚えてないGreenHouseの<a href="http://www.green-house.co.jp/products/pc/cardreader/multi/gh-crsdhc/" >GH-CRSDHC</a>というカードリーダだと、中のファイルを覗いている間でもWifiのアンテナは立っていました。<br /><br /><a href=images/IMG_0035_R2.JPG class=lb><img src=images/IMG_0035_R2.JPG width=500px></a><br><br /><br />さて、ここからが本題なのですが、Aircardには以下のようなWebUIがあり、ここにクライアントとして繋ぐ場合にどのSSIDに繋ぐのか指定できるのですが、ステルスではないAPの場合は問題なく繋がったのですが、APがStealth（SSIDをブロードキャストしない設定にしている）な場合、いつまでも見つけてくれないのです。<br /><a href=images/pqiaircard_webUI.png class=lb><img src=images/pqiaircard_webUI.png width=500px></a><br><br /><br />　自分は今、auのDATA08をステルスAPで運用しているのですが、これの為にステルスを解除するのもなあと思い、どうにかならないかあれこれ試してみました。<br /><br /><br /><h2>全部入りBusyboxを入れる(任意)</h2><br />　まず下準備から。<a href="http://ameblo.jp/tonsuke-usagi/entry-11212317428.html" >こちら</a>のブログにも書かれているように、なぜかSDカードでperl/Ruby/PHPが動いてしまいますが、そこまでしないにしろ全部入りのBusyboxはあると何かと便利です。viとかxargsとか。なのでこれを手順に沿って入れます。まあ、ステルスAPに繋ぐだけであればこれが無くてもいいのですが。<br />　これを、SDのどこかに保存してください。自分はbinaryと言うフォルダを作りそこに入れました。/mnt/sd/binary/busyboxとなります。<br /><br /><h2>どうにかしてAirCardにTelnetで繋ぐ</h2><br />　上記ブログに書いてあるので詳しいことは省きますが、デフォルトではPQI Air CardというAPがたつので、そこに繋いでtelnet 192.168.1.1をするなり、上記WebGUIで先に設定してデジカメからWSD00002.JPGを削除してAPに繋げるなりしてください。<br /><br />　ところで、自分のAirCardだと何故かWSD00002.JPGを消しても、そもそもAPに繋ぎに行かなかったのですが何か設定間違えてしまいましたかね？というかWSD00002.JPGを一度消してしまうと、WSD00002.JPGはデジカメやPCから認識できない画像と言われてしまい、SDをPCからフォーマットするか/DCIMフォルダを消して初期化しないといけなかったのですが…。そのデジカメから初期化するトリガになるWSD00003.JPGも発動しないという…。なんで？<br /><br /><h2>wpa_supplicantに食わせる設定ファイルを書く</h2><br />　中身がLinuxなので、wifiの接続にはwpa_supplicantを使います。起動すると/etc/wpa.confを元にwpa_supplicantがデーモンで起動するので、それを元にファイルを作ります。<br /><br />wpa_supplicant に食わせるファイルの書式は以下のようになります。<br /><blockquote><br />ap_scan=3//←ステルスAPの動いているチャンネルに合わせないと繋がらない<br />network={<br />        scan_ssid=1//←ステルスの場合は追記<br />       ssid=&quot;Stealth&quot;//←接続するAP名<br />       key_mgmt=WPA-PSK//←WEPの場合はWEPですが省略<br />       proto=WPA WPA2<br />       pairwise=TKIP CCMP<br />       group=TKIP CCMP<br />       psk=&quot;Passkey&quot;//←PreSharedKey(事前共有鍵)に設定したパスフレーズを入れる<br />       priority=1<br />}<br /></blockquote><br />　ただし、/etc/以下はRAMなので、ここに書いても再起動後に消えてしまいます。なので、SDカード(/mnt/sd/)か/mnt/mtd/以下にファイルを書く必要があります。SDカード内に書く場合はそのままだとWPAキーがばれてしまうので、chmod 700 /mnt/sd/wpa.conf&amp;&amp;chown root /mnt/sd/wpa.confしてroot以外は読めないようにするべきです。<br /><br /><h2>試しに繋いでみる</h2><br />　telnetで繋いだ状態で、上記wpa.confをwpa_supplicantに食わせ、接続してみます。ただし、接続後はIPが被ってしまう可能性があるので、ifconfigでIPを指定します。今回はSDカード上にあるwpa.confを食わせ、接続後は192.168.1.2を指定しています。<br /><blockquote><br />wpa_supplicant -c /mnt/sd/wpa.conf -i mlan0 -d wext -B&amp;&amp;sleep 1&amp;&amp;ifconfig mlan0 192.168.1.2 netmask 255.255.255.0<br /><br />Configuration file &#039;/mnt/sd/wpa.conf&#039; -&gt; &#039;/mnt/sd/wpa.conf&#039;<br />Reading configuration file &#039;/mnt/sd/wpa.conf&#039;<br />ap_scan=3<br />Priority group 1<br />  id=0 ssid=&#039;Stealth&#039;<br />Initializing interface (2) &#039;mlan0&#039;<br />SIOCGIWRANGE: WE(compiled)=22 WE(source)=13 enc_capa=0xf<br /> capabilities: key_mgmt 0xf enc 0xf flags 0x0<br />WEXT: Operstate: linkmode=1, operstate=5<br />Own MAC address: b0:38:29:00:XX:XX<br />wpa_driver_wext_set_wpa<br />wpa_driver_wext_set_key: alg=0 key_idx=0 set_tx=0 seq_len=0 key_len=0<br />wpa_driver_wext_set_key: alg=0 key_idx=1 set_tx=0 seq_len=0 key_len=0<br />wpa_driver_wext_set_key: alg=0 key_idx=2 set_tx=0 seq_len=0 key_len=0<br />wpa_driver_wext_set_key: alg=0 key_idx=3 set_tx=0 seq_len=0 key_len=0<br />wpa_driver_wext_set_countermeasures<br />wpa_driver_wext_set_drop_unencrypted<br />RSN: flushing PMKID list in the driver<br />Setting scan request: 0 sec 100000 usec<br />EAPOL: SUPP_PAE entering state DISCONNECTED<br />EAPOL: KEY_RX entering state NO_KEY_RECEIVE<br />EAPOL: SUPP_BE entering state INITIALIZE<br />EAP: EAP entering state DISABLED<br />Added interface mlan0<br />Daemonize..<br /></blockquote><br />ここでTelnetが切れますが、これでパスフレーズなどを間違えていなければ、StealthというAPに接続したあとにおそらく192.168.1.2に対してtelnetが使えると思います。いつまでたっても繋がらない場合は、APのチャンネルを間違えているかSSIDを間違えているかpskを間違えていると思われます。<br /><br /><h2>autorun.shを使う</h2><br />　これで繋がったら、あとは電源を入れたら自動でステルスAPに繋ぐようにします。<br /><br />　wifiの接続の設定は、WebUI（/www/cgi-bin/post_config.cgi）から設定したときに/mnt/mtd/config以下にあるファイルを/usr/bin/kcard_cmdが --post_configと言う引数を追加してパースし、どうにかして/etc/wpa.confとして起動時にはき出しているようなのですが、これらを追って正しく書くよりもSDのルートフォルダ上にautorun.shを書くと起動時に実行されるという方法を使う方が楽だったので、autorun.shを使います。<br /><br />　上記のBusyboxを入れると最初からautorun.shが入っているので、それをまねて作ります。また、/usr/bin/w2というスクリプトがAPモードからクライアントモードに変更するスクリプトなのですが、これを実行します。最終的には以下のようになりました。<br /><br /><blockquote><br />#!/bin/sh<br />ln -s /mnt/sd/binary/bin/* /bin/<br />ln -s /mnt/sd/binary/usr/bin/* /usr/bin/<br />ln -s /mnt/sd/binary/usr/local /usr/local<br />ln -s /mnt/sd/binary/usr/lib /usr/lib<br />ln -s /mnt/sd/binary/usr/include /usr/include<br />ln -s /mnt/sd/binary/usr/libexec /usr/libexec<br />ln -s /mnt/sd/binary/sbin/* /sbin/<br />ln -s /mnt/sd/binary/lib/* /lib/<br />ln -s /mnt/sd/binary/etc/* /etc/<br />ln -s /mnt/sd/binary/www/* /www/<br />ln -s /mnt/sd/binary/www/cgi-bin/* /www/cgi-bin/<br /><br />ln -s /mnt/sd/binary/busybox /bin/awk<br />rm /bin/dd<br />rm /bin/vi<br />ln -s /mnt/sd/binary/busybox /bin/vi<br />ln -s /mnt/sd/binary/busybox /bin/dd<br />ln -s /mnt/sd/binary/busybox /bin/find<br />ln -s /mnt/sd/binary/busybox /bin/grep<br />ln -s /mnt/sd/binary/busybox /bin/hexdump<br />ln -s /mnt/sd/binary/busybox /bin/killall<br />ln -s /mnt/sd/binary/busybox /bin/less<br />ln -s /mnt/sd/binary/busybox /bin/passwd<br />ln -s /mnt/sd/binary/busybox /bin/sed<br />ln -s /mnt/sd/binary/busybox /bin/tar<br />ln -s /mnt/sd/binary/busybox /bin/telnetd<br />ln -s /mnt/sd/binary/busybox /bin/watch<br />ln -s /mnt/sd/binary//busybox /bin/whoami<br />/usr/bin/w2&amp;&amp;/bin/wpa_supplicant -c /mnt/sd/wpa.conf -i mlan0 -d wext -B&amp;&amp;/bin/sleep 10&amp;&amp;/sbin/ifconfig mlan0 192.168.1.2 netmask 255.255.255.0<br /></blockquote><br /><br />　これで、SDに電源を入れると毎回同じステルスAPに繋ぐようになると思います。<br /><br /><h2>問題</h2><br />　これの問題としては、APを決めうちで指定しているので、たとえば家のWLANと持ち歩きのポケットWifiの切り替えが出来ないという点です。どうにかしてデジカメからのファイル操作で/usr/bin/w2を実行できれば切り替えられそうですが、実行する方法は分かりませんでした。というか、WSD00002.JPGが普通に動く環境であれば、おそらくこれを消せばWebGUIで設定した設定の通り動く気がします。動かないので検証できないのですが。<br />　しかし、家で同期するときは直接SDを繋いだ方が断然早いので、結局SDから直接同期してしまうという。外出先でスマホから繋がればいいかなーと思うので特に困らないのですが…。<br /><br />　そして、そもそもの問題として、Wifiカードが結構熱を持つと言うか、電力を消費するので、デジカメの電池の減りが早くなります。。当たり前ですが。<br /><br /><h2>おまけ1</h2><br />/usr/bin/w2はviやcatで開けるのですが、開くと以下のように書いてあります。<br /><blockquote><br /># cat /usr/bin/w2<br />#!/bin/sh<br />echo &quot;w2...&quot;<br />buzzer -f 1<br />#ifconfig mlan0 down<br />#load wifi driver<br />a0<br />a1<br />sleep 5<br /><br />iwconfig<br />ifconfig mlan0 192.168.1.1 netmask 255.255.255.0 up<br /><br />sleep 1<br />echo &quot;auto connect available router&quot;<br />wifi_connect_router<br />buzzer -f 5<br />sleep 2<br /><br /><br />udhcpc -i mlan0 -s /etc/dhcp.script<br />buzzer -f 5<br /><br />#cp /mnt/sd/iperf /bin<br />#iperf -c 192.168.6.21 -N -w 512K -i 1 -t 300<br /></blockquote><br /><br />なぜiperfが…<br /><br /><h2>おまけ2</h2><br />AirCardにSDを挿入すると、SDHCからSD規格へのブリッジとして動いてくれます。8GBのSDとしてみえます…。<br />これのおかげで、Thinkpad X61のSDカードリーダーでマイクロSDHCカードが読めました。ただし、ThinkpadのSDスロットでは電力が足りないのか、中身を見ることは出来ても安定してWifiとして動きませんでした。余り期待は出来ないですね。<br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry121103-210353">
		<title>【その他】CPUグリスを買ってきた</title>
		<link>http://xmms.jp/blog/index.php?entry=entry121103-210353</link>
		<description><![CDATA[大した内容ではないのですが、CPUグリスが切れてしまったので新しく買ってきました。<br /><a href=images/IMG_0032_R2.JPG class=lb><img src=images/IMG_0032_R2.JPG width=500px></a><br><br />一番右のメモリはDDR2メモリです。これを使い切るのに2年くらいかかりました。<br /><br />詳細スペック<br /><br /><a href=images/IMG_0033_R2.JPG class=lb><img src=images/IMG_0033_R2.JPG width=500px></a><br><br /><br />自分はツクモで880円分のポイントで交換してしまいましたが、アマゾンでも売っているようです。780円で送料無料なのでツクモより安いですね。<br /><a href="http://www.amazon.co.jp/%E3%83%90%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%A6%E3%82%A7%E3%83%BC%E3%83%96-%E3%82%B7%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B0%E3%83%AA%E3%82%B910-0g-SG-77010/dp/B001NDMFII" >http://www.amazon.co.jp/%E3%83%90%E3%83 ... B001NDMFII</a><br /><br />いい点<br />・シルバーグリスなので熱伝導率が高い<br />・使っても使っても無くならない<br /><br />悪い点<br />・シルバーグリスなので電気が通ってしまう<br />・手につくと中々落ちない<br />・服につくとかなり落とすのがしんどい<br /><br />とりあえずこれ一本持っておけば中々なくならないのでおすすめです。]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry120929-053759">
		<title>【その他】ブログをいじってみた</title>
		<link>http://xmms.jp/blog/index.php?entry=entry120929-053759</link>
		<description><![CDATA[　今年初めにOSを更新し、それに伴いApacheとPHPのバージョンが上がったのですが、PHPのバージョンが上がってからこのブログシステムがものすごい勢いでapache/error.logを埋めていくので、いい加減システムそのものをこの際更新しようと色々更新しました。一度インストールしてから引き継ぎ引き継ぎで3年4年くらい使い続けていたのでさすがに色々古くなってきました。<br /><br />　このブログは<a href="http://sourceforge.net/projects/sphpblog/" >SimplePHPblog</a>というシステムを使っているのですが、更新そのものはDBなどは使っていないのでphpさえ動けばcontents/とconifg/ディレクトリを昔のものから上書きすれば簡単に更新できます。問題は、4年前のデザインをそのまま今のものに引き継ぐとものすごく色々ずれるという問題や、昔はページの段組にtableタグを使っていたのですが、現行のナウいデザインではdivタグで段組をくむので、スマホ（特に自動でページ幅を最適化するOperaMiniブラウザ）でみるとものすごくブログがずれたりなど、色々大変でした。まあ、これはないと思いつつも作法に従わず使ってしまったものもいくつかありますが。<br /><br />　ちなみに、地味にリビジョンが上がっていますが、一応色々内部的に変わっています。過去のリビジョンはこんなのです。<br /><br />　　rev0.9 -&gt;確かもらった鱈Pen3 1GHzのPCでサーバーを作り、手書きのHTMLでメモとして作っていた。このときはWindows2kにAnHTTPDだった。<br />　　rev1.0 -&gt;確か上のPCにphpとAnHTTPDをいれ、SimplePHPblogを動かして動的なブログになった<br />　　rev1.2 -&gt;ML115 G1とAthlon 64 x2 5000+ BlackEditionを買い、常時稼働PCのついでに、WinXPとAnHTTPDで動かしていた<br />　　rev2.0 -&gt;常時稼働PCがまた別にきたので、上記ML115 G1にUbuntu 8.04とApache2を入れて本格的なサーバーになった。PHPのZend Optimizerとかも入れてた。<br />　　rev2.1 -&gt;ML115が不調になったのでPentium DC 5200を積んだIntelPCになった<br />　　rev2.2 -&gt;OSがUbuntu 9.04になった<br />　　rev2.3 -&gt;Ubuntuの9.04のaptレポジトリが終わったのでdist-upgradeしようとして失敗したので、OSをDebian 6.01にした。ついでにサブPCが新しくなったのでハードウェアも更新し、CPUがCore 2 duo E8400になった。Linux Native ZFSがWeb用ファイルシステムになった。<br />　　rev2.4 rev1.2からそのままコピーで引き継いだ味わい深い伝統のソースを更新した<br /><br />　確かこんなだった気がします。色々移植したものの、まだ変なところがあるかもしれないので、何か不具合が見つかったらtwitterあたりで@飛ばしていただけると助かります。<br /><br />　自分もその昔に教えてもらったので受け売りになりますが、sPHPblogはtargzするだけでバックアップが終わり移行が楽なので、複雑なことをしようと思わなければお勧めです。]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry120912-044146">
		<title>【カンファレンス】オープンソースカンファレンス2012 Tokyo/Fall へ行ってきました</title>
		<link>http://xmms.jp/blog/index.php?entry=entry120912-044146</link>
		<description><![CDATA[　一ヶ月と二週間ぶりの更新です。密かに一週間に一度更新しようと目標を立てていたのですが、一度破綻してしまうとなし崩し的に更新をサボってしまうのでよくないですね。やー、だって八月中部屋が暑くて何もする気が起きなかったんだもん…（室温平均36-8度）。まあ、この間の失われた期間はいつか補完します。はい。<br /><br />　さて、久々の更新のネタはOSC Tokyo 2012/秋に行ってきたよ！というネタです。写真の量が多いので割ります。<br /><br /><a href=images/IMG_0837_R.JPG class=lb><img src=images/IMG_0837_R.JPG width=500px></a><br><br /><br />　本当は朝から居る予定でいて、早起きまではしたのですが、二度寝という甘い幻惑に負けその予定はぶち殺されました。そして結局到着したのは撤収30分前でした。さっさと来いよ！と言われましたが、まさにその通りです…。次回何かイベントがあればお手伝いします、はい。<br /><br />　それ故にあまり他のブースをみることは出来なかったのですが、25Uラックのせいで自宅ラック友の会のブースは雰囲気がおかしかったです。<br /><br />　以下ギャラリーです。<br /><br />　日本Asteriskユーザ会http://asterisk.gr.jp/　では黒電話をVoIPで動かしていました。流行ってるんですかね？w　PogoplugでAsteriskを動かしてSIPサーバにしていました。<br /><a href=images/IMG_0830_R.JPG class=lb><img src=images/IMG_0830_R.JPG width=500px></a><br><br /><br />Endian Firewall Community Japanのブースです。欲しい。<br /><a href=images/IMG_0840_R.JPG class=lb><img src=images/IMG_0840_R.JPG width=500px></a><br><br /><br /><br />　自宅ラック友の会のブースに佇むあのルーターとZabbixによる監視画面<br /><a href=images/IMG_0834_R.JPG class=lb><img src=images/IMG_0834_R.JPG width=500px></a><br><br />　拡大。あのスイッチw<br /><a href=images/IMG_0835_R.JPG class=lb><img src=images/IMG_0835_R.JPG width=500px></a><br><br /><br />　自宅ラック友の会のブース訪問ノベルティー（という名の在庫処分）です。RJ45とDB9ピンのコンソールケーブル（Ciscoケーブル）と、ラッキングに使うビス（Not including M5ナット）でした。あと何故かSFPもあったらしいですが初日になくなったそうです。<br /><a href=images/IMG_0832_R.JPG class=lb><img src=images/IMG_0832_R.JPG width=500px></a><br><br /><br />　そしてそびえ立つ圧倒的存在感、25Uラックです。よく搬入したなあと感心しました。<br /><a href=images/IMG_0831_R.JPG class=lb><img src=images/IMG_0831_R.JPG width=500></a><br><br /><br />　某所で格安で売られていて極一部で祭りになったあのスイッチの勇士です。パッチパネル装備済みです。<br /><a href=images/IMG_0847_R.JPG class=lb><img src=images/IMG_0847_R.JPG width=500px></a><br><br /><a href=images/IMG_0845_R.JPG class=lb><img src=images/IMG_0845_R.JPG width=500px></a><br><br /><br />　そして今回の主役、OpenFlow化されたあのルーターです。<br /><a href=images/IMG_0848_R.JPG class=lb><img src=images/IMG_0848_R.JPG width=500px></a><br><br /><br />　その裏面です。宇宙を感じます。<br /><a href=images/IMG_0849_R.JPG class=lb><img src=images/IMG_0849_R.JPG width=500px></a><br><br />　壮観なACアダプタ<br /><a href=images/IMG_0850_R.JPG class=lb><img src=images/IMG_0850_R.JPG width=500px></a><br><br /><br />　ここまで写真を撮ったところでタイムアップでした。機材をアンラッキングし、ラックを梱包し、タイルカーペットを通った先から進行方向へ並べるという、ピラミッドを造ったときに使ったとされるコロの原理で進路を確保し、嵐のように撤収していきました。<br /><a href=images/652174434.jpg class=lb><img src=images/652174434.jpg width=500px></a><br><br /><br />　やはり自宅にラックを置くような人は変態（ほめ言葉）しかいないと実感しました。おわり。]]></description>
	</item>
</rdf:RDF>
