最後に挿入したレコードの一意な ID を取得する

– LAST_INSERT_ID() を使うとよい。

INSERT INTO user_list (id,name) values (555, “foo”);
SELECT LAST_INSERT_ID();
 +——————+
 | LAST_INSERT_ID() |
 +——————+
 | 555 |
 +——————+

という感じ。コネクション単位で保持しているので、同時アクセスがあっても干渉しない。ただし、取得する ID は AUTO_INCREMENT でなければならない。
http://dev.mysql.com/doc/mysql/ja/getting-unique-id.html
– MySQL リファレンスマニュアル :: 11.1.12.3 最後に挿入したレコードの一意な ID はどのように取得するのか

JavaScriptでランダムなパスワードを生成する

JavaScriptを使ったランダムなパスワード文字列を生成するサンプルコードです。

/// length 桁のパスワードを生成する
function createRandomPassword(length){
  var lc = "abcdefghijklmnopqrstuvwxyz"; 
  var sList = lc + lc.toUpperCase()+"0123456789_-"; // 小文字 + 大文字 + 数字 + 対応する記号
  var password = ""; 
  for (i = 0; i < length; i++)
      password += sList.charAt(Math.floor(Math.random() * sList.length));
  return password;
}

// 利用例
var passwordLength = 12; 
var myPassword = createRandomPassword(passwordLength);
console.log(myPassword);
prompt(passwordLength + "桁のパスワードを生成しました。", myPassword);

デモ:

桁数:

ボタンを押すたびランダムなパスワード文字列を作成します。
ポチポチ押してみてくださいね。

連番入力の自動化

– 自分ではよくやるけど、あまり見ないため、書き方をメモ。
– 言語共通の配列処理や、 Java の JDBC で使う PreparedStatement.setXxx() 等、パラメータで連番(1,2,3,4 …)にして複数同じ処理をする必要がたびたびある。
これをそのまま手入力すると、数が増えると手間で、入れ換えが面倒で、この煩雑さがミスも誘発する、ということもある。これを楽するには、変数を使ってインクリメントしていくとよい。たとえば次の通り:

foo(0, “abc”);
foo(1, “def”);
foo(2, “ghi”);
// :

というのを、

int i = 0;
foo(i++, “abc”);
foo(i++, “def”);
foo(i++, “ghi”);

とする。入れ換えも1文を差し替えるだけで済むし、制御文をはさんでも順序が崩れたりしないので便利。加算用の数値変数が残るのが気になるので自分ではスコープ区切って使ってます。

{
  int i = 0;
  foo(i++, “abc”);
  foo(i++, “def”);
  foo(i++, “ghi”);
}

途中で変数を宣言できない C でも、スコープを切ったバージョンは使える。

Tomcat 5.x で Servlet をマップできない

– web.xml で定義とマッピングをちゃんとしても、その URL でアクセスすると 500 エラーになって表示されず、*.war でやるとそのファイルだけデプロイされないという状態になっていた。

javax.servlet.ServletException: ラッパがサーブレットクラス com.example.my.FooServlet 又はそれが依存するクラスを見つけることができません

となって、

java.lang.ClassNotFoundException: com.example.my.FooServlet

が続く。
– 原因は一言では $TOMCAT_HOME/server/lib に servlet-api.jar が無かったこと($TOMCAT_HOME/common/lib にはあったがだめだった…何かが原因で親である common の設定がクリアされた?)。サンプルのサーブレットが動いてたかは確認してないが、とりあえずこんな感じで対処:

cp -p common/lib/server-api.jar server/lib/

– 参考:
http://jakarta.apache.org/tomcat/tomcat-5.0-doc/class-loader-howto.html
– The Apache Jakarta Tomcat 5 Servlet/JSP Container – Class Loader HOW-TO
http://www.atmarkit.co.jp/fjava/javatips/049jspservlet025.html
– @IT: Java TIPS — クラスローダの仕組みを知る

XML のデータ整合性をチェックする

– Visual Studio.NET の Microsoft Development Environment
– Eclipse
– Emacs – PSGML
OpenJade,OpenSP: それぞれ Jade, SP を DSSSL コミュニティが受け継いでメンテナンスと拡張をしているバージョン。元となった Jade/SP は既に配布されていない。
http://www.sscd.de/openjade/
– OpenJade Windows Binaries and Sources.

Firefox の Web 系開発者用プラグイン

http://chrispederick.com/work/firefox/webdeveloper/
– Web Developer Extension (Mozilla/Firefox plugin)
Documentation -> Features に機能一覧がある。Web 周りの言語の構文チェックが豊富。
– ちなみに国際化もされていて、そっちをいれれば日本語で使えるので安心。
 
– 難点:
— ローカルファイル検証(HTML/CSS のみ対応)のときも validator.w3c.org にデータを送信するため、公開するとまずい系には使うべきではないこと。

JSP 基本文法

– <% 〜 %> で囲んだ部分は全体で1つのメソッドのように Java コードが書ける.

<body>
  <%
    out.println(“Hello, world!”);
  %>
</body>

– <%= 〜 %> で囲んだ部分は一つの式として評価され、戻り値をその部分に表示する( つまり void は不可)。複文になってはならないため、セミコロンは用いない。

Your name is <%= name %>

– <%! 〜 %> で囲んだ部分はクラス内の定義とみなす

  <%!
    private static final int FOO = 1;
    private void final doSomething(String value){ /* do something */ }
  %>

– <%@ 〜 %> で囲んだ部分は JSP の制御タグとする

  <%@ page contextType="text/html; charset=EUC-JP" %>
  <%@ page import="java.sql.*" %>
  <%@ page import="java.util.*" %>

– JSP のインクルード構文:
— <jsp:include page=”foo.jsp” /> – 対象のページを 別に実行して, 結果を動的に(コンパイル後に)インクルードする。ローカル変数, request パラメータはファイルごとに独立になる。

view.jsp:
  <body>
    Hi, <jsp:include page=”inc.jsp”/>.
  </body>
 
inc.jsp:
  <%= "John" %>

— <%@ include file = "foo.jsp" %> – 対象のページをそのまま読み込み、静的に(コンパイル時に)インクルードする。ローカル変数は共存になり、インクルード対象(exp. inc.jsp)のファイルが更新されてもインクルード元(ex. foo.jsp)は再コンパイルされないため、全てのインクルード元について明示的に更新してやらなければならない。

view.jsp:
 <body>
   <%@ include file = "inc.jsp" %>
   Hi, <%= name %>.
 </body>
  
inc.jsp:
  <% String name = "John"; %>

– 参考:
http://www.javaroad.jp/servletjsp/index.html
– Java の道: Servlet, JSP