グリス塗りなおさなかったら、ThinkPadが起動しなくなったワケだが。2009年10月18日 05時03分53秒

ファンの異音があったので...

自宅のメイン機として使用しているThinkPad T40。ちょっと前からカリカリとCPUファンが異音を立てる。

まぁ、埃かなにかを巻き込んでる程度だろうから放っておいてもよかったんだけど気になるのでバラして掃除してみることに。

ThinkPadは保守マニュアルが公開されているので、どこをどうバラせば目的のアセンブリに手をつけられるかわかりやすいので、CPUファンアセンブリを取り外すのにそれほど苦労はなかった。

んで、軽く掃除したらちょっとした埃の塊がでてきたので、それを取り除いてから元に戻した。

なんか、熱い気がするのだが。

電源を入れてみると、まだ多少やかましいようだけどさっきまでよりはマシになったので、バラしたかいがあったなーとかのんびりしていたのだが、なんだかいつもより本体が熱い気がする。ん、なんかイヤな予感

で、案の定というか、ちょっと負荷をかけたら予告なく「ちゅ〜ん」という音と共に電源が落ちた。慌てて電源を入れなおしてみたのだが、XPのロゴがでたあたりでやはり「ちゅ〜ん」。まずい。

熱対策なめすぎてました。

何度か電源を入れなおしてみるものの、やはりXPのロゴあたりで落ちるので、システムボードが逝っちゃったのかとあせったが、しばらく放置してから試すと、ちゃんと起動したので、多分、熱。

ThinkPadのCPUファンアセンブリは、ヒートシンクの役割もあるので、実は裏面にCPUグリスが塗ったくってあったんだけど、手持ちになかったこともあり「まぁ、大丈夫だろ」てな感じで、そのまま戻してたわけなんですよ。

以前懲りてたはずなんだけど、やっぱりCPUにはグリス塗っとかないと、ね。あー、買いに行かなきゃ。

pgrep.cmd / pkill.cmd2008年09月29日 12時51分41秒

なんちゃってコマンド・番外編

ほんとはもうこの関連やらないつもりだっだんだけど、「FORコマンドで遊んでみる。」のコメント欄で、たけチンさんからリクエストをいただいたのでちょろっとやってみました。やっぱ同一名称のプロセス全殺しの需要があったか。

内容からして、基本は「FORコマンドで遊んでみる。」の「killでメモ帳を全て終了」で例示したコマンドをほぼそのまま使えるのでスクリプト作成なし、バッチファイルのみでやってます。

ただ、リクエストいただいたpgrep、pkillとも普段使ってないコマンドであまり詳しくないので、

最低限はプロセス名称でのgrepができればいいのですが、、、
という最低限の実装しかしてません。ご容赦くださいな。 > たけチンさん

pgrep.cmd

まずはプロセスIDを列挙するpgrepから。基本はforコマンドにps+findstrの出力を渡してechoするだけなんだけども、

バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、%%変数を使用してください。
for /? より抜粋
ってな注意書きがあるので、そのあたりに気をつけてこんな感じ。
@echo off
for /f "tokens=1" %%p in ( '"ps -a| findstr -i %1"' ) do @echo %%p

この内容を「pgrep.cmd」とか「pgrep.bat」とかでパスが通ったところに保存すればOKです。まぁ、前提としてps.js、ps.cmd、kill.cmdがパスの通ったところに設置済みである必要がありますが。

いちおう以前配布したzipに含めたので、ps.jsとかを設置していない場合はこちらをダウンロードして、こちらのエントリを参考にして設置してみてくださいな。

技術的もは、findstr(というかクォートされたコマンド)にそのまま%1でバッチの引数渡せるか心配だったんだけど、やってみたらすんなり通ったのでこれで完成。

あ、findstrは無条件に -i オプション(ignore case)をつけちゃってます。だってwindowsだし。

pkill.cmd

もうね、さっきのバッチの「@echo」を「@kill」に変えるだけなんですよ。えぇ。

@echo off
for /f "tokens=1" %%p in ( '"ps -a| findstr -i %1"' ) do @kill %%p

設置の仕方はpgrep.cmdと同じです。当然zipに含めてあります。

試してみる

まず、メモ帳2つと、NOTEPAD++を起動した状態で、ps+findstrで確認。

C:\Documents and Settings\dara-j>ps -a | findstr -i notepad
 9564   164 dara-j               4940     4940    0:00:00 notepad.exe
 6456   164 dara-j               5048     5048    0:00:00 notepad.exe
 8360   888 dara-j                828    17328    0:00:00 notepad++.exe

C:\Documents and Settings\dara-j>
んでpgrepしてみる。
C:\Documents and Settings\dara-j>pgrep notepad
9564
6456
8360

C:\Documents and Settings\dara-j>
うん、3つ表示されますな。

じゃ、今度はメモ帳だけに限定。

C:\Documents and Settings\dara-j>pgrep "notepad.exe"
9564
6456

C:\Documents and Settings\dara-j>
うん、ちゃんとnotepad++(PID:8360)が除外されてますな。あ、パターンをクォートするときはダブルクォートにしてください。シングルクォートだとキチンとパターン(バッチ中の「%1」)に渡せないので。

最後にpkillの確認。メモ帳だけ全殺し。

C:\Documents and Settings\dara-j>pkill "notepad.exe"

C:\Documents and Settings\dara-j>pgrep "notepad.exe"

C:\Documents and Settings\dara-j>pgrep notepad
8360

C:\Documents and Settings\dara-j>
はい、notepad++だけは生き残ってます。当然画面上でもメモ帳のウィンドウがばっさり切られたと思います。ちなみに「pkill notepad」にするとnotepad++も殺されます。

関連記事

.svnディレクトリだけ列挙2008年09月07日 17時42分06秒

一週間ほど現実逃避をしていたら、もう9月すぎてるし。1ヶ月以上ブログ更新してないし。と思ったのだが、あんまりいいネタがないのでコネタ。

もうね、なんで気が付かないかな。

1ヶ月ほど前のエントリで「コマンドラインで.svnディレクトリを一括削除」なんてコマンドラインネタやったんだけど、このときは

  • dirコマンドのオプションに /b(ファイル名のみ表示)、/s(指定ディレクトリ以降の再帰処理)に加えて隠しディレクトリを対象にするために/aオプションで属性未指定(=すべての属性を対象)として、
  • 結果をfindstrの正規表現で「.svn」だけに絞り込む
という2段階の手続きを踏んでいた。こんな感じ。
dir /b/s/a | findstr /r \.svn$
うん、タイプするのめんどくさいわ。

でね、もう一回dirコマンドのヘルプ見てみると、

  /A          指定された属性のファイルを表示します。
  属性         D  ディレクトリ               R  読み取り専用
               H  隠しファイル                A  アーカイブ
               S  システム ファイル           -  その属性以外
(dir /? より抜粋)
だって。/aオプションでディレクトリのみに絞り込めるじゃん

そんなわけで

さっきのパイプ付き処理を置き換えると、こんな感じ。

dir /b/s/a:dh *.svn
/a:dh で「隠しディレクトリ」のみを対象とする、と。

だもんで、以前のエントリに掲載した.svnの再帰削除コマンド

for /f "tokens=*" %d in ('"dir /b/s/a | findstr /r \.svn$"') do rmdir /q/s "%d"

なんて面倒なコマンドは、(比較的)シンプルに
for /f "tokens=*" %d in ('dir /b/s/a:dh *.svn') do rmdir /q/s "%d"

なんてシンプルに置き換わります。無駄なファイル/ディレクトリの列挙もパイプ処理もないので当然こっちのほうがパフォーマンスいいし。測ってないけど。

あ、ファイル名の指定は通常のDOSワイルドカード指定になるので「.svn」じゃなくて「*.svn」になるとこだけは注意ね。

コマンドラインで.svnディレクトリを一括削除2008年08月04日 01時05分23秒

DIR コマンドにこんな使い方が

なにを探しているときに見つけたかすでに忘れたのだが、しばらく前にこんなTIPSを見つけた。

タイトルにあるとおり、

dir /b/s somedir
ってやると、UNIX/Linuxのfindコマンドよろしく、指定ディレクトリ以下のファイルをフルパスで列挙してくれる。

例えば、dara-jの手持ちの環境ではZend Framework 1.0.0を D:\PHP\libs\Zend 以下に設置しているのだが、こんな感じで列挙できる。

C:\Documents and Settings\dara-j>dir /b/s D:\PHP\libs\Zend\*.php
D:\PHP\libs\Zend\Acl.php
D:\PHP\libs\Zend\Auth.php
D:\PHP\libs\Zend\Cache.php
D:\PHP\libs\Zend\Config.php
D:\PHP\libs\Zend\Date.php
D:\PHP\libs\Zend\Db.php
D:\PHP\libs\Zend\Debug.php
 :
(中略)
 :
D:\PHP\libs\Zend\XmlRpc\Value\DateTime.php
D:\PHP\libs\Zend\XmlRpc\Value\Double.php
D:\PHP\libs\Zend\XmlRpc\Value\Exception.php
D:\PHP\libs\Zend\XmlRpc\Value\Integer.php
D:\PHP\libs\Zend\XmlRpc\Value\Scalar.php
D:\PHP\libs\Zend\XmlRpc\Value\String.php
D:\PHP\libs\Zend\XmlRpc\Value\Struct.php

C:\Documents and Settings\dara-j>
はぁ、こんなことできたんだぁ。

ヘルプで調べてみると

dir /?でそれぞれのオプションがどんな意味があるのか見てみたところ、

/B ファイル名のみを表示します (見出しや要約が付きません)。
dir /? より抜粋
/S 指定されたディレクトリおよびそのサブディレクトリのすべての ファイルを表示します。
dir /? より抜粋

なるほど、/bで属性などをつけずファイル名(というより、絶対パスみたいなのだが)のみ、/sで再帰処理なことはよくわかった。しかし、何度かこの説明文は見たことあるんだけど、さっぱり気がつかなかった。

その列挙を利用して...

これだけでも割と目から鱗チックだったんだけど、リンク先にはさらにこんなコマンドが載っていた。

リダイレクトしない場合はforコマンドが使えます。

C:\Inetpub\wwwroot> for /f %d in ('dir /b/s _vti_cnf') do rmdir /q/s %d

うーん、よくわからんが、どうやらIISがらみの特定のディレクトリかファイルを再帰処理で一括削除しているみたい。

つか、FORコマンド??

for /?で見てみると(長いヘルプなのでテキストファイルに書き込むと吉)、どうやらこれが該当するのかな。

FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメータ]
for /? より抜粋
説明を見てもなんだか冗長でイマイチ把握しづらいんだけど、()内の一重引用符で囲まれた「dir /b/s _vti_cnf」の結果を変数 %d に逐次当てはめながら、do 以降で指定されているコマンド「rmdir /q/s %d」に渡しているんだろうと。

なるほどねぇ、dir /b/s でファイルのフルパスがあがってくるので、これをforコマンドにまわせばループ処理できるんだ。

.svnディレクトリを再帰的に削除してみたり

んで、やっとこ本題。

Subversionの作業コピーって、各ディレクトリにメタデータディレクトリ「.svn」が隠しディレクトリとして追加されてるのよね。

ローカルで作業してるときはいいんだけど、これをどっかに配布したりするのに、このメタデータが邪魔なので削除してみようかと。いや、当然エクスポートすればいいのは知ってるんだけどね。

いきなり結論。

for /f "tokens=*" %d in ('"dir /b/s/a | findstr /r \.svn$"') do rmdir /q/s "%d"

ここにいたるまで若干の紆余曲折はあったんだけど、要点は以下。
  • dirコマンドには /aオプションもつける → .svnディレクトリが隠し属性だから。
  • .svnディレクトリだけ処理したいので、findstrで「\.svn$」という正規表現で限定してる。もっとうまいやり方あるかな。
  • dir → findstrとパイプでうまくつなげるには二重引用符でくくる。上のコマンドをよーく見てみて。
  • パスに空白が入る場合に対応して、/fの後にオプション「tokens=*」で1行すべてを1トークンとして認識させる
  • 同様に空白対策で、rmdirに渡すときに、%d自体を二重引用符でくくる
特にパイプ処理を通すためにコマンド自体を一重引用符の内側でさらに二重引用符でくくるってのはどうやって見つけたか忘れたけど結構ハマってたりして。

うん、こんな覚えづらいコマンドでちくちくするより「svn export --force work_dir target」したほうがよっぽど速いんだけども。

追記(08.9.7)

svn exportはおいておいて、dirコマンドのオプションでもう少し簡単になりました

Firefox3でtumblrのダッシュボードが重い2008年07月27日 03時30分35秒

いや、実はFirefox3に乗り換えてからうすうす感じてはいたんだけどね。たいていのサイトでは問題ない(どころか、やっぱり3にしてよかったと思えるくらい軽い)し、2のころとほぼ同じアドオンいれて同じようにつかってても安定性が増してるのでいいんだけど。

tumblrのダッシュボード(管理ページみたいなもの)でスクロールが異常に重いのよ。ものすごく。

どのくらい重いのかってーと、トラックポイントで一気にスクロールさせると、明らかに前の描画状態が残ってるの。vncとかターミナルクライアントでリモート接続してる画面より重い感じ。

ダッシュボード以外でもgoogleとかIT系ニュースサイトとか(これはFlashが原因だろうけど)、あと検索で引っかかったブログでもデザインによってはやっぱり重いのよ。ちなみにスタイルシート切るとかなり軽くなるんだけど、それでも画像があったりすると重い。

いや、グラフィックチップがしょぼくて(たぶんメインメモリの一部をグラフィックメモリとして共用する安価なタイプのチップだったかと)描画性能が悪いのは認める。けど、OperaやSafariさらにはIE7に比べても明らかに重い

ためしにFirefox2のポータブル版で表示してみたところ、こっちのほうが圧倒的に軽いので、やっぱり3固有の問題(?)のようだ。

思い違いかなーと思ってたんだけど、こんな記事こんな記事もあるので、やっぱり特定状況によっては重いことは疑いがない。

いまどきのスペックのPCならまず問題にならないんだけど、他のブラウザより圧倒的に重いページがあるってのは、かなり残念。JSは速いんだけどなー。

それでもFirefoxは手放せないし、2に戻す気もないんだけどね。いつか解決するのかなぁ。PC買い替えろってことかなぁ。