checkboxにチェックしていないことを送信

久しぶりにクライミング以外の話題。

まぁ当たり前なのだけど、HTMLのcheckboxでformを送信するとき、checkが入っていないとサーバーに値自体送信されない。
このため、例えばサーバー側で情報をセッション領域などに入れて持ちまわす場合、
一旦チェックを入れた状態を保持してしまうと、それを外すことが画面からの操作ではできなくなってしまう。
その問題の解決には、Springではcheckboxと一緒にhidden項目を作って、それを一緒に送信するのがセオリーみたい。

<input type="checkbox" value="true" name="springCheckboxTest" id="springCheckboxTest">
<input type="hidden" value="on" name="_springCheckboxTest">

こんな感じでcheckboxのnameの先頭にアンスコつけたnameのhidden項目を送信すると、
勝手にspring側でバインドしてくれるみたい。

そして、上記のようなhtmlはspringのformタグを使えば出力可能とのこと。

<form:checkbox path="springCheckboxTest" />

参考:13.9.4. The checkbox tag

なるほどね!

MacOS X lionでrvmでrubyをインストールしようとしてハマった日

ちょっとした野暮用で、Mac OS X(Lion)にRuby on Rails 3.2の開発環境を構築することになったのだけど結構ハマった。のでメモ。

ひとまず、

[c]
sasaki% rvm install 1.9.2-p320
The provided CC(/usr/bin/gcc) is LLVM based, it is not yet fully supported by ruby and gems, please read `rvm requirements`.
[/c]

と怒られる。調べてみると、どうやらlionからデフォのCCが本家GCCではなくLLVM basedなものになっているらしい。本家GCCをダウンロード&インストールして、CCを書き換え。

[c]
sasaki$ echo "export CC=/usr/bin/gcc-4.2" >> ~/.bash_profile
[/c]

いったんゴミを消して、改めてrvm install 1.9.2してみる。

[c]
sasaki$ rvm remove 1.9.2-p320
sasaki% rvm install 1.9.2-p320
[/c]

そしたら、readlineのbuildでコケるので、logを見る。

[c]
sasaki$ vi /Users/sasaki/.rvm/log/ruby-1.9.3-p0/make.log
[/c]

該当部分は下記の通り。

[c]
compiling readline.c
readline.c: In function ‘username_completion_proc_call’:
readline.c:1472: error: ‘username_completion_function’ undeclared (first use in this function)
readline.c:1472: error: (Each undeclared identifier is reported only once
readline.c:1472: error: for each function it appears in.)
make[2]: *** [readline.o] Error 1
make[1]: *** [ext/readline/all] Error 2
make: *** [build-ext] Error 2
[/c]

これも世界に聞いてみると、readlineだけ別buildすれば良いとのことなので、

[c]
sasaki$ rvm pkg install readline
[/c]

で、ビタmakeできた。その後、ようやく

[c]
sasaki$ rvm remove 1.9.2-p320
sasaki% rvm install 1.9.2-p320
(略)
Install of ruby-1.9.2-p320 – #complete
[/c]

で、完了。

2chのスレで育ってるNTEmacsが良い感じ

これ。

http://ai11.net/2009/misc/

自分用メモ。何かわかる人は使えば良いと思う。

[shell]
;; -*- mode: emacs-lisp -*-

(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won’t work right.
‘(column-number-mode t)
‘(show-paren-mode t))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won’t work right.
‘(default ((t (:background "gray93" :foreground "navy"))))
‘(cperl-array-face ((t (:foreground "darkslateblue"))))
‘(cperl-hash-face ((t (:background "lightyellow2" :foreground "firebrick" :slant normal :weight bold))))
‘(cperl-nonoverridable-face ((t (:foreground "royalblue"))))
‘(cursor ((t (:background "navy"))))
‘(font-lock-builtin-face ((t (:foreground "palevioletred"))))
‘(font-lock-comment-face ((t (:foreground "dimgray"))))
‘(font-lock-constant-face ((t (:foreground "seagreen"))))
‘(font-lock-function-name-face ((t (:foreground "mediumblue" :weight bold))))
‘(font-lock-keyword-face ((t (:foreground "slateblue"))))
‘(font-lock-string-face ((t (:foreground "mediumvioletred"))))
‘(font-lock-type-face ((t (:foreground "royalblue"))))
‘(font-lock-variable-name-face ((t (:foreground "chocolate"))))
‘(font-lock-warning-face ((t (:foreground "firebrick"))))
‘(region ((((class color) (min-colors 88) (background light)) (:background "LightSteelBlue1")))))

(set-language-environment "Japanese")

(setq make-backup-files nil)
(setq completion-ignore-case t)
(setq default-indicate-empty-lines t)
(setq mode-require-final-newline nil)
(setq sentence-end-double-space nil)
(setq-default indent-tabs-mode nil)
(setenv "TZ" "JST-9")
(global-auto-revert-mode t)
(blink-cursor-mode nil)
(show-paren-mode t)
(tooltip-mode nil)

(setq ring-bell-function ‘ignore)
(global-set-key [kanji] ‘ignore)

(prefer-coding-system ‘utf-8-dos)
(set-charset-priority ‘ascii ‘japanese-jisx0213.2004-1 ‘japanese-jisx0213-2
‘katakana-jisx0201 ‘cp932)
(set-coding-system-priority ‘utf-8 ‘shift_jis-2004 ‘iso-2022-jp-2004
‘euc-jis-2004)
(set-file-name-coding-system ‘cp932)
(setq quail-keyboard-layout-type "jp106")

(dolist (coding-system ‘(sjis euc-jp iso-2022-jp iso-2022-7bit shift_jis-2004
euc-jis-2004 iso-2022-jp-2004))
(coding-system-put coding-system :decode-translation-table
(get ‘japanese-ucs-jis-to-cp932-map ‘translation-table))
(coding-system-put coding-system :encode-translation-table
(get ‘japanese-ucs-cp932-to-jis-map ‘translation-table)))
(defun jisx0213-post-read-conv (len)
(translate-region (point-min) (point-max)
(get ‘jisx0213-to-unicode ‘translation-table)))
(defun jisx0213-pre-write-conv (from to)
(translate-region (point-min) (point-max)
(get ‘unicode-to-jisx0213 ‘translation-table)))
(dolist (coding-system ‘(shift_jis-2004 iso-2022-jp-2004 euc-jis-2004))
(coding-system-put coding-system :post-read-conversion
‘jisx0213-post-read-conv)
(coding-system-put coding-system :pre-write-conversion
‘jisx0213-pre-write-conv))

(setq-default w32-ime-mode-line-state-indicator "-")
(setq w32-ime-show-mode-line nil)
(w32-ime-initialize)
(setq default-input-method "W32-IME")

(setq default-frame-alist
(append ‘((top . 20)
(left . 20)
(height . 47))
default-frame-alist))

(setq scalable-fonts-allowed t)
(setq w32-enable-synthesized-fonts t)

(set-face-attribute ‘default nil
:family "Consolas"
:height 100)

(setq ttf-japanese "メイリオ")

(set-fontset-font "fontset-default"
‘japanese-jisx0212
‘("MS ゴシック" . "iso10646-1"))
(set-fontset-font "fontset-default"
‘japanese-jisx0213.2004-1
`(,ttf-japanese . "iso10646-1"))
(set-fontset-font "fontset-default"
‘japanese-jisx0213-2
`(,ttf-japanese . "iso10646-1"))
(set-fontset-font "fontset-default"
‘katakana-jisx0201
`(,ttf-japanese . "iso10646-1"))
(set-fontset-font "fontset-default"
‘cp932
`(,ttf-japanese . "iso10646-1"))
(set-fontset-font "fontset-default"
‘(#x3099 . #x309A)
`(,ttf-japanese . "iso10646-1"))

(add-to-list ‘face-font-rescale-alist
‘(".*メイリオ.*" . 1.1))

(defun char-after-nozero ()
(let ((c (char-after)))
(if (numberp c) c 0)))

(defun ucs-after ()
(let ((c (char-after-nozero)))
(encode-char c ‘ucs)))

(defvar utf-sig-nosig-alist
‘((utf-16le-with-signature . utf-16le)
(utf-16be-with-signature . utf-16be)
(utf-8-with-signature . utf-8)

(utf-32-be-unix . utf-32be-unix)
(utf-32-be-dos . utf-32be-dos)
(utf-32-be-mac . utf-32be-mac)
(utf-32-le-unix . utf-32le-unix)
(utf-32-le-dos . utf-32le-dos)
(utf-32-le-mac . utf-32le-mac)))

(defun char-to-hex-coding-patch (coding)
(if (assq (coding-system-base coding) utf-sig-nosig-alist)
(coding-system-change-eol-conversion
(cdr (assq (coding-system-base coding) utf-sig-nosig-alist))
(coding-system-eol-type coding))
coding))

(defun char-to-hex-coding (c coding)
(let ((i 0)
(estr (encode-coding-string
(string c)
(char-to-hex-coding-patch coding)))
(used-c (char-to-hex-coding-patch coding))
(res ""))
(if (string-match "iso-2022" (symbol-name coding))
(setq estr (replace-regexp-in-string "\x1b\\$?(?." "" estr)))
(while (&lt; i (length estr))
(setq res (concat res (format "%02X" (elt estr i))))
(setq i (1+ i)))
;; (setq res (concat res "-" (symbol-name used-c)))
res))

(defvar mode-line-show-buffer-code t
"*非nilならUnicodeのほかにバッファコードをモード行に表示する。")

(defvar mode-line-char-code-added nil)

(defun mode-line-show-char-code ()
(let ((c (char-after-nozero)))
(concat
(format "–%04X" (ucs-after))
(if mode-line-show-buffer-code
(format "–%c:%s"
(coding-system-mnemonic buffer-file-coding-system)
(char-to-hex-coding (char-after-nozero)
buffer-file-coding-system)))
)))

(defun mode-line-add-char-code ()
(let ((len (length default-mode-line-format))
(term (elt default-mode-line-format
(1- (length default-mode-line-format)))))
(delq term default-mode-line-format)
(setq default-mode-line-format
(append default-mode-line-format
`((char-code-mode (:eval (mode-line-show-char-code)))
,term)
))
(setq mode-line-char-code-added t)))

(define-minor-mode char-code-mode
nil
nil nil nil
:global t
(if (and char-code-mode (not column-number-mode))
(column-number-mode t))
(unless mode-line-char-code-added
(mode-line-add-char-code)))

(char-code-mode t)

(defun japan-composition-function (gstring)
(if (= (lgstring-char-len gstring) 1)
(compose-gstring-for-graphic gstring)
(or (font-shape-gstring gstring)
(let ((glyph-len (lgstring-glyph-len gstring))
(last-char (lgstring-char gstring
(1- (lgstring-char-len gstring))))
(i 0)
glyph)
(while (and (&lt; i glyph-len)
(setq glyph (lgstring-glyph gstring i)))
(setq i (1+ i)))
(compose-glyph-string-relative gstring 0 i 0.1)))))

(aset composition-function-table ?゙
‘(["[うかきくけこさしすせそたちつてとはひふへほゝウカキクケコサシスセソタチツテトハヒフヘホワヰヱヲヽ].[゙]?"
1 japan-composition-function]
[nil 0 japan-composition-function]))
(aset composition-function-table ?゚
‘(["[かきくけこはひふへほカキクケコセツトハヒフヘホㇷ].[゚]?"
1 japan-composition-function]
[nil 0 japan-composition-function]))
(aset composition-function-table ?˩
‘(["[˥].[˩]?" 1 japan-composition-function]
[nil 0 japan-composition-function]))
(aset composition-function-table ?˥
‘(["[˩].[˥]?" 1 japan-composition-function]
[nil 0 japan-composition-function]))

;; 透過
(set-frame-parameter nil ‘alpha 90)
(add-to-list ‘default-frame-alist ‘(alpha . (0.85 0.75)))

;; No toolbar
(tool-bar-mode nil)

;; No splash
(setq inhibit-startup-message t)
[/shell]

無類のモンタージュ好き。(またDIY系)

モンタージュっていうのが正しいのか未だに疑問ですが、よく写真展とかでフィルムの人がやってる、こういうふうに写真を連結して見せる手法ってありますよね。最近、よく真似してやってます。なんか2枚の間に時間の広がりを感じで、グッとくるんですよねえ。

あと白黒もmyブーム。

このモンタージュ化を、毎回Photoshopとかでやるのはバカバカしいので、自作系。
他にも、縦撮りで横2枚(まぁコレと同じか)とか、横撮りで2×2とか、まぁいろいろ作れますが、そこらへんは皆さんやってみてください!
あ、ちなみに、これは2枚の画像のサイズが違うと失敗しちゃうので、そこだけご留意ください。
(自分がいつもRaw現像でサイズ指定しててて問題無いので、このコード内でリサイズ処理はしてないです。。)

まず、前にレターボックス化の時も紹介しましたが、ImageMagickをインストールします。Macの人は、portが利用可能です。

$ sudo port install ImageMagick

その後、下記を実行します。

#!/bin/bash
#
# 2枚の画像を上下に並べて連結
#
# ~$ ./1x2montage.sh 画像1 画像2
#
# 出力ファイルの構成(ファイル名:out.jpg)
#
# 画像1
# 画像2

# 画像1の下辺に白線を付ける
tmp_height=`identify -format %h $1`
width=`identify -format %w $1`
height=`expr ${tmp_height} / 200`
convert -quality 100 $1 -size ${width}x${height} xc:white -append temp1.jpg

#画像1と画像2を縦に連結
convert -append temp1.jpg $2 out.jpg

無類のレターボックス好き(久しぶりにDIY系)

写真や映画の映像とかで、上下に黒い帯がついているのって見た事ないですか?あれは本来、「レターボックス」っていう名前で、アスペクト比の異なる表示規格の間で互換性を得るためのものでした。なので、いわば「レターボックス」という手法は、一種の妥協案なんですが、あの黒い帯によって、ちょっと背景が明るくても色味が綺麗に見えたり、どことなくノスタルジックな雰囲気になったりして、個人的には好きだったりします。

ちょっと例を挙げると、

こちらが普通の縦横比の画像。

そして、こちらがレターボックスによって1:1の縦横比にした画像。

こんな感じです。(モデル:アベ君)

ただ、このようなレターボックスの画像を作る時、いちいちPhotoShopやGIMPなんて起動して手作業でやるのは面倒なので、自作スクリプトからImageMagickというツールを利用して、自動化してみました。

ターミナルやシェルスクリプトをちょっと知っている、MacもしくはUnixユーザの人向きです。(Windowsでも同様なことは当然出来ると思いますが、やる気がおこらなかったので、誰かWindows向けにまとめてもらえると嬉しいです。)

まず、画像の編集などが行えるImageMagickをインストールします。Mac を使っている人は portが利用出来ます。

[shell]
$ sudo port install ImageMagick
[/shell]

その後は、下記のシェルスクリプトを、レターボックス化したい画像ファイルを引数として実行します。しばらくすると、入力ファイル名の先頭に”LB_”が付加された名前で、レターボックス化された画像ファイルが出力されます。

[shell]
#!/bin/bash
#
# letterbox.sh
# 一般的なデジタルカメラのアスペクト比(3:2)の画像を、レターボックスで正方形にする。
#
# 使い方
# ~$ ./letterbox.sh 入力画像ファイル
#

# 入力画像と同じ横幅、1/4の縦幅の、黒い帯画像の生成
width=`identify -format %w $1`
tmp_h=` identify -format %h $1`
height=`expr ${tmp_h} / 4`
convert -size ${width}x${height} xc:black black_line.jpg

# 画像の下辺に黒い帯をつける
convert -quality 100 $1 black_line.jpg -append temp.jpg

# 画像の上辺に黒い帯をつけて、入力ファイル名の先頭に"LB_"をつけて出力する
convert -quality 100 black_line.jpg temp.jpg -append "LB_${1}"

# 一時ファイルを削除
rm black_line.jpg
rm temp.jpg
[/shell]

関係無いですが、こういうシェルがサクっと書ける・利用出来るってのも、Macの良いところかもしれないですね。Windowsだとなかなかやる気が、、、(結局やる気の問題)

P.S.

今回の作業中に、ImageMagickについて少し調べましたが、今流行のハイダイナミックレンジ周りもサポートしてるみたいですね!ほんと多機能なツールで、しかもコマンドラインから利用可能なので、ばしばしシェルを書いて効率よく使い倒したいところです。