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 /?

ブラウザでページを操作

– ブラウザのアドレスバーを使った遊び。日本語テキストたっぷりなページでを開いた後、次のコードをアドレスバーにいれて実行すると文章を書き換える。

javascript:varelm=document.getElementsByTagName(“body”)[0];elm.innerHTML=elm.innerHTML.replace(newRegExp(“。”,”g”),”にゃ。”);

堅苦しい言葉がトロ語に。replace 使うと Firefox だと化けるなぁ.. split(“from”).join(“to”); としたほうがいいかも。

document.getElementsByTagName(“body”)[0].innerHTML;

これがキモ。DOM メソッドを使って Body タグの全文章を取得/操作する。

追記[2005-06-22]:

document.getElementsByTagName(“body”)[0]

は、

document.body

でも参照可能らしい。某所にあったコードのほうが汎用的で簡素みたい。

JavaScript:document.body.innerHTML=document.body.innerHTML.split(‘。’).join(‘にゃ。’);focus();

focus() しないと、実行後が別ページ扱いになって相対パスの外部ファイル(画像, js, css)の読み込みに失敗して見ためが崩れるみたい。

ファイルアップロード "multipart/form-data" 処理のときに正しくパラメータを受け取るには

– form タグで ENCTYPE=”multipart/form-data” にすると ServletRequest.getParameter(Sting) 系ではパラメータを解釈できず全く値が渡って来なくなるため、Jakarta Commons FileUpload の org.apache.commons.fileupload.DiskFileUpload.parseRequest(…) 等を使うとよい。

// 適当に書いたコードなのでエラーあるかも。
DiskFileUpload o = new DiskFileUpload();
o.setSizeMax(-1);
o.setSizeThreshold(1024);
o.setRepositoryPath(“/tmp”);
o.setHeaderEncoding(“Windows-31J”);
List list = o.parseRequest(request); // FileItem のリスト
for(Iterator it = list.iterator(); it.hasNext();){
    FileItem param = (FileItem)it.next();
    if(!param.isFormField())
        continue();
    out.println(param.getFieldName() + “: ” + param.getString());
}

<http://www.jajakarta.org/commons/fileupload-1.0/ja/withoutPrimary/org/apache/commons/fileupload/DiskFileUpload.html#parseRequest(javax.servlet.http.HttpServletRequest,%20int,%20long,%20java.lang.String)>
– jajakarta.org: FileUpload API 1.0 (Ja)
<http://jakarta.apache.org/commons/fileupload/apidocs/org/apache/commons/fileupload/DiskFileUpload.html>
– Jakarta 公式: FileUpload API (current ver.)

Segmentation Fault が起こるプログラム外部要因

– ulimit -s で得られる、スタックの限界サイズを超えた場合、最初の代入を行った時点で Segumentation Fault (core dumped) になる。
例えば、

$ ulimit -s
65536

の時、次のようなコードで発生する。

/* オプティマイズされると処理がなくなるため、
 * gcc -O0 を付けてコンパイルすること。
 */
int main(int argc, char* argv[]){
    char ac[64 * 1024 * 1024];
    ac[0] = ‘\0’; // ここで発生
    return 0;
}

対策は、

ulimit -s [limit]

で十分なスタックサイズを確保することを許可すればよい。

ResultSet を Map に変換するには

ResultSet を Map に変換する方法として、Apache Commons の DbUtils に次のような便利なメソッドがあります。

org.apache.commons.dbutils.BasicRowProcessor#toMap(ResultSet) throws SQLException

ResultSet の行を Map へ変換します。 この実装では、大小文字を区別しないカラム名をキーとしたMapを返します。 例えば、map.get(“COL”) の呼び出しと
map.get(“col”) の呼び出しでは、 同一の値が返されるようになります。

Commons DbUtils: JDBC Utility Component
BasicRowProcessor javadoc

または、自前実装でこのような方法もあります。

public List resultSetToArrayList(ResultSet rs) throws SQLException{
  ResultSetMetaData md = rs.getMetaData();
  int columns = md.getColumnCount();
  ArrayList list = new ArrayList(50);
  while (rs.next()){
     HashMap row = new HashMap(columns);
     for(int i=1; i&lt;=columns; ++i){<br />
      row.put(md.getColumnName(i),rs.getObject(i));
     }
      list.add(row);
  }

return list;
}

参考: http://stackoverflow.com/questions/7507121/efficient-way-to-handle-resultset-in-java

ServletRequest インスタンスからリクエストされたパラメータのコレクションを抽出する

– サーブレットや JSP からクラスを抽出している際に、パラメータを使っているものを分離しようとして、 POJO に ServletRequest を渡すのはどうかなと思っていたところ、ちゃんとメソッドが提供されていた。
<http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/ServletRequest.html#getParameterMap()>
– ServletRequest#getParameterMap()

戻り値:
キーとしてパラメータ名、マップ値としてパラメータ値が格納された不変の java.util.Map。パラメータマップ内のキーは String 型。パラメータマップ内の値は String の配列型

たとえば次のコードが書かれたページ(test)にリクエストを送るとする:

// Arrays.toString(String[]) を利用しているため JDK5.0 以上でしか動かない。
out.println(“<table>”);
for(Iterator it = request.getParameterMap().entrySet().iterator(); it.hasNext();){
        Map.Entry entry = (Map.Entry) it.next();
        out.println(“<tr><td>”+entry.getKey()+”</td><td>”+Arrays.toString((String[])entry.getValue())+”</td></tr>”);
}
out.println(“</table>”);

結果は次の通り:

test?a=foo:
   a [foo]
test?a&b=boo&b=woo
   a []
   b [boo, woo]