xargs が標準入力が空のときにも実行されてしまう

find . -type f | xargs wc -c

など xargs を使うときに、標準入力が空だと実行されないのかと思っていたら、標準入力がなくても一度は必ず実行するというのがデフォルトだった。このため、上の結果は wc -c < /dev/null のようにとられて 0 になる。
これを避けるには、 -r オプションを使う。

xargs -r <command>

上の例だと次のようにすればよい。

find . -type f | xargs -r wc -c

バイナリエディタ

– 昔から PowerWitch The Royal というバイナリエディタを使っている。高機能でフリー。ただしもれなくバニーさんがついてくる。スクラッチパッド編集で使いたくなったので久しぶりにダウンロードしてみた。
<http://www.nx.sakura.ne.jp/~elysium/software/pwtr/>
– PowerWitch The Royal

非互換, 機種による制限のある機能

– 利用するメソッドが本当に全機種対応しているかどうか各機種オプションAPI・拡張API実装状況を見たほういい。
対応していない場合は利用を避けるか、

System.getProperty(“microedition.platform”).indexOf(“N504”) >= 0

とかして端末によって処理を分けること。
 
– 以下公式の iアプリ作成上の注意点より端末固有の制限。
– N504i(S) では Graphics.drawString() は半角 33 文字までしか描画されない。
– N504i(S) では ScratchPad クローズ処理は
– P504i(S) では扱う画像の一辺の長さは 256 ピクセルまで。
– P504iS では同様に 512 まで。
– F504i では Connector.open() に渡す URL は 256 バイトまで。
– F504iS では同様にクエリ以外が 255 バイトまで、クエリ部が 512 バイトまで。
– F504i と SO504i ではキーを押したまま(key press イベント発生中)システムのポップアップメッセージ(iモード接続中など)が表示されると Canvas.getKeypadState() の結果が残る。回避するために、ポップアップが立ち上がる処理のトリガはキーリリースにする。
– D504i では(Canvas.processEvent(), Canvas.getKeypadState() 等を使った低レベルキーイベント処理で)一部のボタン同士の同時押しを受け付けられない。(1,2,3), (4,5,6), (7,8,9), (*,0,#) のそれぞれは同時押しができない(ex. 1,2 はだめ)。
– SO504i では MediaImage オブジェクトは use() で有効になることができるのは 255 個まで。
– SO504i では時刻情報処理で 1 時間につき約 3.5 秒の割合で遅れる。正確には経過時刻に対し 0.09756% 遅れる。
– D2101V ではサマータイムが有効になっているため 3月の最終日曜の 10:00 から 10 月最終日曜の 11:00 まで +1:00 となる(10:00 が 11:00 になって始まり、11:00 が 10:00 になって終わる)。

Jarg, 7zip による Jar ファイルサイズ削減

– ここ <http://www.moreread.net/mario/Any/appli/memo.html?id=1> のソースを改変して一つのファイルで実行するようにしたもの。空白を含むパスに微妙に対応してある。DOJA エミュレータと同時に実行するとロックのために書き換えに失敗するのが難点。
– JavaBlender <http://homepage.mac.com/t.sekiguchi/javablender/index-j.html> を先に実行したらいいらしい。(Java Blender はクラス融合/パッケージ構造の平坦化などでプログラム自体のサイズ最適化を行う)

@echo off
REM ———————————————————-
REM = 使い方:
REM = optimize.bat “C:\path\to\jars\app.jar”
REM = 指定した jar のサイズを削減し、同じディレクトリにある同名
REM = の .jam のサイズ指定を書き換える。ドラッグ&ドロップ実行に
REM = 対応
REM ———————————————————-
REM = 下準備:
REM = ●jarg.jar <http://jarg.sourceforge.net/index.ja>を
REM = ダウンロードして、適当なところに配置。
REM = ●7zip <http://www.7-zip.org/> をインストールして
REM = 7za.exe にパスを通しておく。
REM ———————————————————-
REM = 設定
REM ———————————————————-
REM = クラスパス(DOJA 付属の zip 2つ)
set _CP=D:\Progra~1\Java\iDKDoJa4.0\lib\classes.zip;D:\Progra~1\Java\iDKDoJa4.0\lib\doja_classes.zip
REM = preverify.exe のパス(DOJA に付属)
set _PREVERIFY=D:\Program Files\Java\iDKDoJa4.0\bin\preverify.exe
REM = jarg.jar のパス
set _JARG=D:\Program Files\Java\tool\jarg\jarg.jar
REM ———————————————————–
if %1 == “” goto MES
set TARGET_F=%~f1
set TARGET_P=%~p1
set TARGET_SP=%~sp1
set TARGET_N=%~n1
mkdir %TARGET_P%bin
cd %TARGET_P%bin
mkdir temp
java -jar “%_JARG%” -nobco -j2me-prev “%_PREVERIFY%” -j2me-cp “%_CP%” “%TARGET_F%”
7za x %TARGET_SP%%TARGET_N%_s.jar -otemp -w -r -y > nul
REM del .\%TARGET_N%_s.jar

del “%TARGET_SP%%TARGET_N%_s.jar”
REM ! “%TARGET_F%”
cd temp
7za a -tzip “%TARGET_F%” * -mx=9 -mpass=4 -r -y > nul
cd ..
rd temp /s /q

type %TARGET_SP%%TARGET_N%.jam | find /v “AppSize” > %TARGET_SP%%TARGET_N%.tmp
type %TARGET_SP%%TARGET_N%.tmp > %TARGET_SP%%TARGET_N%.jam
echo AppSize = %~z1 >> %TARGET_SP%%TARGET_N%.jam
del %TARGET_SP%%TARGET_N%.tmp
cd %TARGET_P%
rd bin /s /q
exit /b
MES
echo optimize.bat [App.jar]
ERR
pause

JavaScript から画像の存在有無を調べる

– Image オブジェクトを使うとスマートにできる。Firefox1.0.4, IE6 で確認。

function existImage(sImageUrl){
    var img = new Image();
    img.src = sImageUrl;
    return img.height > 0; // 読み込みに失敗すれば 0 になる。
}
  
if(existImage(“http://www.google.co.jp/intl/ja_jp/images/logo.gif”)){
  alert(“存在します”);
}else{
  alert(“存在しません”);
}

 
追記(2009-08-18):
メモリークラフトさんの記事より、この方法はIE7以降では動作しないようです。代替実装はリンク先を参照してください。

ファイル/フォルダの共有でのアクセス制限

– 2重の制限を行っているため、単に共有許可とするだけでは外部からのアクセスは蹴られてしまう。
ファイルプロパティ -> セキュリティタブで Everyone に許可を与えれば認証に関係なく無条件でアクセスできるようになる(ただし拒否優先)。
未確認だが認証をしない匿名ユーザに割り当てられる Guest に対しての設定でもいいはず。
また, Authenticated Users に対しての許可なら適切に認証を経由したユーザ全員になるのでセキュリティ上よい。
一部のユーザだけなら、外部公開用のアカウントをつくってそのユーザで入ってもらうようにするといいかな。

他の PC にメッセージダイアログを表示させる

net send 192.168.1.20 あいうえお

とか、XP で

net send /domain:192.168.1.20 あいうえお

とかする。マシン名でもよい。

net send * あいうえお

で同じグループの全てのマシンに対して送信する。
RPC やら(サービスの)メッセンジャーサービスを切っていたり、ポートを閉じている場合は応答しない。
<http://support.microsoft.com/default.aspx?scid=kb;ja;330904>
– Microsoft サポート – インターネット広告を含む Messenger サービス ウィンドウが表示される

バッチファイルに引数で渡されたファイルのパスを変換/抽出する

– 引数(フルパス)は %1 … %n に格納される。

> echo %1
C:\WINDOWS\system32\mspaint.exe

– 部分だけ取り出すには %~n1 のように %~ で始め、次に取り出す部位の略字, 最後に引数の番号を指定する。
ファイル名: n

> echo %~n1
mspaint.exe

ドライブ名: d

> ecoh %~d1
C:

ドライブ、ファイル名を含まないパス: p

> echo %~p1
\WINDOWS\system32\

フルパス: f

> echo %~f1
C:\WINDOWS\system32\mspaint.exe

bat にフルパスをしたかファイル名だけを指定したかに問わず、同等の結果を返す。
上記の結果を短いファイル名で取得: s を追加

> echo %~sp1
\PROGRA~1\foo\

– 参照:
cmd.exe のコマンドヘルプ
 for /?
 call /?