コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

Nexus 5Xとケースを買いました

Nexus 5Xを買いました。

合わせて、Amazonでケースも買いました。

一番安かったので青を買いました。Nexus 5X自体は白色のものを買ったので、何色でも問題ない感じです。

ケース自体ピッタリとはまり、しっかりとした作りです。指紋認証のところは当たり前ですが、穴が開いていますのでケースをつけたまま使用することができます。

最近Nexus 5Xがいろいろなところで安くなっていますので、このケースはおすすめです。

ICaReader 1.2.4リリース

AndroidアプリのICaReader 1.2.4リリースしました。

ライセンス表記と細かい不具合の修正のみです。
機能的には変わりありません。

https://play.google.com/store/apps/details?id=net.kuwalab.android.icareader

主な変更は、以下のとおりです。

変更点は、GitHubのコミットログ(適当)を見てください。

https://github.com/kuwalab/ICaReader/compare/v1.2.3...v1.2.4

サポートは以下からお願いします。

http://bit.ly/ICaReader

Kotlinでtry-with-resourcesしたい

Kotlinでtry-with-resourcesしようとしても、コンパイルエラーになりできません。

KotlinではCloseableインタフェースの拡張関数としてuse関数が定義されています。リンクのソースの部分を見てもらえれば一目瞭然ですが、例外が起きた時も起きなかった時もcloseされているのがわかります。

この関数を使用することでtry-with-resourcesと同様のことが実現できます。例えば、適当なテキストファイルを作成する例は次のようになります。

Kotlinを使っていると、どうやってやるんだろうということが割りと頻繁にありますが、大体解決法は用意されているように感じます。

Kotlinまとめ http://kuwalab.hatenablog.jp/entry/Kotlin

KotlinでExcelを操作するのは簡単っPOI

最近はやりのKotlinで、Excel操作してみました。

Kotlinでは、演算子のオーバーロード拡張関数が使えるため、POIをかなり便利な形にできます。

# 以下、POIを使ったことがある前提で書いています。

早速、実際のコードを見ていきます。

演算子オーバーロードと拡張関数を使い、

fun Sheet.get(n: Int): Row {
    return this.getRow(n) ?: this.createRow(n)
}

とすることで、Sheetのインスタンス(Sheetはインターフェースなので、その実装のインスタンス)に対して、

sheet[5]

のようにアクセスできます。Sheetはインターフェースですが、Kotlinの拡張関数を使うとその実装すべてで拡張した関数を使用できます。POIはExcelは2003までのxls形式と、それ以降のxlsxでSheetの実装クラスが違いますが、すべての実装に拡張した関数が反映されます。

同様に、Rowに対してもCellを取得する拡張をします。

fun Row.get(n: Int): Cell {
    return this.getCell(n) ?: this.createCell(n, Cell.CELL_TYPE_BLANK)
}

SheetとRowにget関数を作ることで、C2セルにアクセスする場合には

sheet[1][2]

のように書くことができます。

ただ、これだとsheet[y][x]のようになっているため直感的に操作できません。そのため、以下の関数を追加して、sheet[x, y]でアクセスできるようにしました。

fun Sheet.get(x: Int, y: Int): Cell {
    var row = this[y]
    return row[x]
}

この関数があると、C2セルにアクセスするにはsheet[2, 1]と書くことができます。

また、sheet[x, y] = valueのようにしてセルに値をセットするため、set関数も追加しました。(とりあえず、文字列と数値のみ対応しました)

fun Sheet.set(x: Int, y: Int, value: Any) {
    var cell = this[x, y]
    when (value) {
        is String -> cell.setCellValue(value)
        is Int -> cell.setCellValue(value.toDouble())
        is Double -> cell.setCellValue(value)
        else -> throw IllegalArgumentException("文字列か数値だけにして")
    }
}

このように、Kotlinを使うとPOIをかなり簡単に、便利に使うことができます。ちなみにGroovyだともっと直感的に使うことができるようです。

最後に、動作確認用に作ったサンプルのコードです。

用意したブック1.xlsxファイルはこんなかんじです。
f:id:kuwalab:20150311184311p:plain

実行すると

あ
い
え

と出力されて、ブック2.xlsxは以下のようになります。

f:id:kuwalab:20150311192200p:plain

Kotlinを使うとPOIもかわいく扱うことができます。演算子オーバーロードとか、拡張関数とかJavaにはない概念ですが、こんなにも便利なものなんだなあと実感することができました。

Kotlinまとめ http://kuwalab.hatenablog.jp/entry/Kotlin

Spring MVC 4.1 No. 043 form:labelタグ

form:labelタグは、HTMLの<label>タグを生成します。

その要素の内、単純にHTMLの属性に置き換えられるものは、以下の属性です。cssClassやcssStyleはそれぞれclass、style属性に置き換えられます。

属性 説明
cssClass HTML標準のclass属性
cssStyle HTML標準のsytle属性
dir HTML標準のdir属性
for HTML標準のfor属性
id HTML標準のid属性
lang HTML標準のlang属性
tabindex HTML標準のtabindex
title HTML標準のtitle属性

その他、JavaScriptのDOMレベル0イベントとして以下の属性が用意されています。それぞれ同名の属性になります。

属性
onclick
ondblclick
onkeydown
onkeypress
onkeyup
onmousedown
onmousemove
onmouseout
onmouseover
onmouseup

残りがSpring用の属性になります。

属性 説明
cssErrorClass Validationのエラー時のclass属性
htmlEscape HTMLのエスケープをするかどうか。デフォルトはtrue
path 関連付けるModelの名前

コントローラで使用するモデルです。

package com.example.spring.controller.c043;

public class C043Model {
    private String isbn;
    private String name;

    // setter、getterは省略
}

サンプルのコントローラです。

package com.example.spring.controller.c043;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/c043")
public class C043Controller {
    @RequestMapping("/label")
    public String label(Model model) {
        C043Model c043Model = new C043Model("123", "よく分かるSpring");
        model.addAttribute("c043Model", c043Model);
        return "c043/label";
    }
}

コントローラではformで利用する値をModelに格納しています。

カスタムタグを使用しているJSPです。

<%@page contentType="text/html; charset=utf-8" %><%--
--%><!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>サンプル</title>
 </head>
 <body>
  <form:label path="c043Model.name">書名:</form:label>
  <form:input path="c043Model.name" />
 </body>
</html>

実際に動作させ、出力されるHTMLは以下のようになります(見やすくするために改行を入れています)。

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>サンプル</title>
 </head>
 <body>
  <label for="name">書名:</label>
  <input id="name" name="name" type="text" value="よく分かるSpring"/>
 </body>
</html>

ソースは https://github.com/kuwalab/spring-mvc41 にあります。タグ043が今回のサンプルです。

まとめ http://kuwalab.hatenablog.jp/entry/spring
最初 http://kuwalab.hatenablog.jp/entry/spring_mvc41/001
前回 http://kuwalab.hatenablog.jp/entry/spring_mvc41/042
次回 http://kuwalab.hatenablog.jp/entry/spring_mvc41/044

Spring MVC 4.1 No. 042 form:optionsタグ

form:optionsタグは、HTMLの<option>タグを生成します。このタグは、form:selectタグの中に書く必要があります。

その要素の内、単純にHTMLの属性に置き換えられるものは、以下の属性です。cssClassやcssStyleはそれぞれclass、style属性に置き換えられます。

属性 説明
cssClass HTML標準のclass属性
cssStyle HTML標準のsytle属性
dir HTML標準のdir属性
disabled HTML標準のdisabled属性
id HTML標準のid属性
lang HTML標準のlang属性
tabindex HTML標準のtabindex
title HTML標準のtitle属性

その他、JavaScriptのDOMレベル0イベントとして以下の属性が用意されています。それぞれ同名の属性になります。

属性
onblur
onchange
onclick
ondblclick
onfocus
onkeydown
onkeypress
onkeyup
onmousedown
onmousemove
onmouseout
onmouseover
onmouseup

残りがSpring用の属性になります。

属性 説明
cssErrorClass Validationのエラー時のclass属性
htmlEscape HTMLのエスケープをするかどうか。デフォルトはtrue
itemLabel labelを出力するitemsで指定したクラスのプロパティ名
items radioボタンを作るための配列やMap
itemValue valueを出力するitemsで指定したクラスのプロパティ名

実際の例を見ていきます。まずは選択されたの要素の初期値を設定するモデルです。

package com.example.spring.controller.c042;

public class C042Form {
    private String selectedIsbn;

    // setter、getterは省略
}

書籍データを格納するモデルです。このクラスの一つのインスタンスが1つのoption要素に相当します。

package com.example.spring.controller.c042;

public class C042Model {
    private String isbn;
    private String name;

    // setter、getterは省略
}

サンプルのコントローラです。

package com.example.spring.controller.c042;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/c042")
public class C042Controller {
    @RequestMapping("/options")
    public String options(Model model) {
        List<C042Model> c042ModelList = new ArrayList<>();

        c042ModelList.add(new C042Model("123", "よく分かるSpring"));
        c042ModelList.add(new C042Model("456", "よく分かるJava"));
        c042ModelList.add(new C042Model("789", "よく分かるSpring MVC"));

        model.addAttribute("c042ModelList", c042ModelList);

        C042Form c042Form = new C042Form();
        c042Form.setSelectedIsbn("");
        model.addAttribute("c042Form", c042Form);
        return "c042/options";
    }
}

コントローラではformで利用する値をModelに格納しています。

カスタムタグを使用しているJSPです。

<%@page contentType="text/html; charset=utf-8" %><%--
--%><!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>サンプル</title>
 </head>
 <body>
  <form:select path="c042Form.selectedIsbn">
   <form:options items="${c042ModelList}" itemLabel="name" itemValue="isbn" />
  </form:select>
 </body>
</html>

実際に動作させ、出力されるHTMLは以下のようになります(見やすくするために改行を入れています)。

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>サンプル</title>
 </head>
 <body>
  <select id="selectedIsbn" name="selectedIsbn">
   <option value="123">よく分かるSpring</option>
   <option value="456">よく分かるJava</option>
   <option value="789">よく分かるSpring MVC</option>
  </select>
 </body>
</html>

ソースは https://github.com/kuwalab/spring-mvc41 にあります。タグ042が今回のサンプルです。

まとめ http://kuwalab.hatenablog.jp/entry/spring
最初 http://kuwalab.hatenablog.jp/entry/spring_mvc41/001
前回 http://kuwalab.hatenablog.jp/entry/spring_mvc41/041
次回 http://kuwalab.hatenablog.jp/entry/spring_mvc41/043