2013年1月28日月曜日

bashの環境設定

bashの環境設定は難しい…

.profileや.bashrcなど環境設定として使えるものがいろいろありどれに書くべきか迷う。

.profileの環境変数で ~を含んだパスを書いたがホームディレクトリに展開されないのは仕様?

2013年1月23日水曜日

BATファイル 直近のファイルを残して古いファイルを消す

Windowsコマンドプロンプトのバッチファイルで直近のファイルを残して古いファイルを消すにはforを使うとよい。 以下はC:\Tempにあるzipファイルのうち直近5個を残して古いものから削除する例である。
for /f "skip=5" %%i in ('dir /b /o-d C:\Temp\*.zip') do (
    del C:\Temp\%%i
)
dir /b /o-d ~ でファイルを新しい順にリストしそれを順次for文で処理する。 for文に skip=5 を付けているので、リスト先頭から5行、つまり最新のzipファイル5つは無視し、後は del で消すという意味になる。%%iにはファイル名のみが入りパスは入らないので、delするときに改めて指定する必要があることに注意。

2013年1月10日木曜日

Java VisualVM

何時のJDKのバージョンから付属するようになったのかわからないがJava開発にJava VisualVMというツールがすごく便利である。 Javaプロセスのプロファイルを取得するツールで以下情報がGUIでモニタできる。

  • 設定されているJVMオプション
  • 設定されているシステムプロパティ 
  • CPU使用率
  • Heapメモリの最大サイズと使用済みサイズ
  • PermGen領域の最大サイズと使用済みサイズ
  • 動作中のスレッド一覧、タイムライン、スレッドダンプ
スレッドタイムラインやPermGen領域をリアルタイムモニタできる機能が便利でサーバー系システムでだんだんとゴミがたまっていく問題を分析するのにとても役立った。

ツールはJDK のjavaにパスを通した状態でコマンドラインよりjvisualvmで起動できる。GUIのツールなので特に説明を見なくてもJavaのことをある程度知っている人ならば使いこなせると思う。

英語ですがドキュメントへのリンクはっておきます。



2013年1月7日月曜日

Kindle Fire HD 機能制限をかける

最近Kindle Fire HD 32GBを手に入れた。

Amazonのストアとの連携性は高く電子書籍などのコンテンツを読むには非常に便利な端末であるが怖い面もある。まずクレジットカードを登録し1-Clickを購入を有効にしておかないとストアからアプリやコンテンツを入手できず、しかもKindle上でストアの商品ページの[¥xxxで購入]のボタンをさわっただけで購入されてしまう。ストアの商品ページはトップページから最短1クリックで出てしまうので誤操作や子供がちょっと触ったなどだけでも購入される可能性がある。間違って購入したものはキャンセルもできるが気がつかないとちょっと怖い。

そんな誤爆を防ぐためには、機能制限をかけておくとよいと思う。 「機能制限の設定方法」のページで機能制限を設定した後に設定画面で「ショッピングをパスワード保護」をオンにすればよい。これで購入のボタンを押したときにパスワード入力を求められるようになる。

まあ、単に画面ロックをかけておけばよい話ではあるが、他にもメールやウェブなど細かく機能制限をかけられるので使いこなすと便利かもしれないと思った。

SQL Anywhere 連番を生成する

一行のSQLで処理を書きたいときなど連番テーブルがあると簡単に書けることがあるが、 SQL Anywhereの場合rowgeneratorテーブルを使って1~255までの連番を生成することができる。 rowgeneratorテーブルにはrow_num列が一つだけありその列に連番が入っている。
SELECT row_num
FROM rowgenerator
WHERE row_num <=10
ORDER BY row_num
実行すると以下のような連番が返ってくる。
row_num
-------
1
2
3
4
5
6
7
8
9
10

(10 ロー)
試していないのだが、255よりたくさん連番がほしい場合は入れ子のSELECTにするなど複数回組み合わせればできると思う。

2013年1月5日土曜日

サーブレットでリクエストパラメータを書き換える

サーブレットにリクエストパラメータを書き換えて渡したいときの方法。たぶんFilterを使っても同じことができると思うが、今回はRequestDispatcherでforwardする方法を使ってみた。

以下のサンプルでは /myWrapperServlet.do で受けたリクエストのパラメータ名p2をp1に書き換えて /myServlet.doに渡す。パラメータの書き換えは直接できないので、少々わかりにくいが HttpServletRequestWrapperのサブクラスを作り元のリクエストをラップしてgetParameter()などで書き換えロジックを書いてやる必要がある。パラメータ名p2をp1に書き換えるにはgetParameter()でパラメータp1を要求されたときに元リクエストのパラメータp2の値を返すようにする。
package test;
// import文は省略

public class MyWrapperServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    // パラメータの書き換えを行うHttpServletRequestを設定して
    // myServlet.doにforward
    RequestDispatcher dispatcher = req.getRequestDispatcher("/myServlet.do");
    MyServletRequestWrapper _req = new MyServletRequestWrapper(req);
    dispatcher.forward(_req, res);
  }

  public static class MyServletRequestWrapper extends HttpServletRequestWrapper {

    public MyServletRequestWrapper(HttpServletRequest request) {
      super(request);
    }

    @Override
    public String getParameter(String name) {
      if ("p1".equals(name)) { name = "p2"; }
      return getRequest().getParameter(name);
    }

    @Override
    public String[] getParameterValues(String name) {
      if ("p1".equals(name)) { name = "p2"; }
      return getRequest().getParameterValues(name);
    }
  }

}

以下はweb.xmlに記述するエントリの例。
<servlet>
  <servlet-name>myServlet</servlet-name>
  <servlet-class>test.MyServlet</servlet-class>
</servlet>
<servlet>
  <servlet-name>myWrapperServlet</servlet-name>
  <servlet-class>test.MyWrapperServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>myServlet</servlet-name>
  <url-pattern>/myServlet.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>myWrapperServlet</servlet-name>
  <url-pattern>/myWrapperServlet.do</url-pattern>
</servlet-mapping>

結果として上URLのリクエストが下URLのリクエストと同じになりサーブレットtest.MyServletクラスが呼び出される。
http://{server}:{port}/myapp/myWrapperServlet.do?p2=abcdefg
http://{server}:{port}/myapp/myServlet.do?p1=abcdefg

パラメータ名を書き換えるのでMyServletRequestWrapperクラスの他メソッドも(特にパラメータ名に関連するもの)もちゃんと実装したほうが良いと思うのだが、とりあえず動くので今回はここまで…

2013年1月4日金曜日

MySQL 先頭の指定件数だけselectする

SQLで先頭のN件のみselectしたい場合、SQL AnywhereとSQL ServerはTOP句を使って指定する。
たとえば3件だけとってきたい場合は以下のように記述する。
SELECT TOP 3 * FROM mytable ORDER BY mycol1;


MySQLで同じことをする場合はLIMIT句を使うようである。
SELECT * FROM mytable ORDER BY mycol1 LIMIT 0,3;

ORDER BY句の後につけるんですね。初めて知りました。