HTML で空白文字列がデザインを崩す

– ソース整形で空白文字(空白、改行、タブ)をいれてたらデザインが微妙に崩れ、原因究明に手間取ってしまった。

   <td>
       <a href=’foo.html’
            alt=”foo”>
          foo
       </a>
   </td>

– TD タグや A タグなど、子要素でなくデータをとる系のタグでは、空白文字は無視されず、表示されてしまう。
– SGML では、全ての空白文字は無視されず、解釈の対象になるのが基本。ただ、全てが解釈されてしまうとコード整形ができなくなるので不便ということで、タグ、要素、属性間で部分的、意図的に無視するようになっている。開始タグの途中の改行も、親がデータ系なら表示されてしまう事になる。データを持つタグの中で無理に整形したいならコメントタグを使って、コメントとして改行するとか工夫しないとだめ。スマートに済ませるなら、データを持たないタグだけで改行する。

  <!– コメントを使って無理矢理(見目悪っ) –>
  <tr>
      <td><!–
          –><a href=’foo.html’ alt=”foo”><!–
             –>foo<!–
          –></a><!–
      –></td>
  </tr>
  <!– または –>
  <tr>
      <td><a href=’foo.html’ alt=”foo”>foo</a></td>
  </tr>
  <!– これは不要な空白が表示されるパターン –>
  <tr>
      <td>
          <a href=’foo.html’>foo</a>
      </td>
  </tr>
  <!– これも –>
  <tr>
      <td><a
           href=”foo.html”>foo</a>
      </td>
  </tr>
  <!– これは多分大丈夫?? –>
  <tr>
      <td
             align=”center”
             border=”1″
      ><a href=”foo.html”>foo</a></td>
  </tr>

長い開始タグとかをコメントしたくて…

Postfix + Cyrus SASL で Outlook でも SMTP Auth

– broken なメールクライアントであるところの Outlook で SMTP Auth を使うには、 postfix の main.cf で次の記述が必要。

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain

ただし LOGIN しか使えないので POP before SMTP のほうがまだマシ。
http://uniunix.net/contents/postfix.html
– Linux Lovers -Fedora Coreで始めるサーバ構築-: Postfix の設定

最後に挿入したレコードの一意な 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.