Hatena::ブログ(Diary)

むつらつれづれ

シンプルなのがいい

この日記のはてなブックマーク数
 

2009-10-09

UNIXシェルからファイルの改行コードを調べる

11:10 |

毎回思い出すのに苦労するので、備忘のため記録しておく。odコマンドの-cオプションを使ってざっと眺めてみる方法。

$ od -c hoge.cgi | more
0000000   #   !   /   u   s   r   /   l   o   c   a   l   /   b   i   n
0000020   /   p   e   r   l  \n   #       h   o   g   e   .   c   g   i
(省略)

\nしか見当たらなければLFのみ、\rと\nが続いて存在すればCRLF。一発で判定して教えてくれるコマンドとかありそうなものだけど。

Windowsならとりあえず秀丸で開けば判別してくれる。メニューの「動作環境」→「ウィンドウ」→「高度なウィンドウ」にある「エンコードの種類」を「常に表示+改行コード」に設定しておくこと。

2009-01-21

OpenPNEの名前の由来

15:18 |

OpenPNEの原型は、私が所属する会社である株式会社手嶋屋(http://www.tejimaya.com)で実験していた携帯電話向けのサブアドレスサービス「みせかけメアドPNE」です。当時はまだSNSではなく、携帯電話向けの転送メールサービスでした。

(中略)

PNEの名前の由来はこの転送メールから来ています。サービスの仕組み上、どうしてもサイト名の最後が「ne.jp」になるようにしたかったことと、携帯で打ちやすいキーを組み合わせていったら、ane dne gne jne mne....となっていき、「pne.jp」が一番響きが良かったのでこれに決まりました。

月刊SNSはじめます!:So-net SNS TIPS!:So-net blog

ふと何の略称なのか気になって調べてみたら、意外にも意味のある言葉ではなかった模様。

2009-01-07

16進数の計算をググる

| 12:26 |

最近、あるプログラマと話していて気づいたのだけど、彼は16進数の2桁と1桁との掛け算(FDh×5とか)が出来ない。やり方自体を知らないのだ。彼はWindowsの電卓を立ち上げて計算していた。

FF(16進数の掛け算)を覚えよう - やねうらお−ノーゲーム・ノーライフ

プログラマの端くれではあるが、暗算する必要性に迫られた経験は一度もなかったり。引用したエントリの趣旨からは逸れるが、16進数の計算はWindowsの電卓を立ち上げるよりも、Google先生に尋ねるのが手っ取り早くかつ使い易いのでお勧め。Perl等と同様に16進数表記は0xが接頭辞になる。

0x3c*0xa7

回答を10進数に変換したい場合は、in decimalを後に付ければいい。

0x3c*0xa7 in decimal

10進数→16進数に変換したい場合はin hexでいける。(in hexadecimalでも同じ)

255 in hex

2進数なら0bが接頭辞、変換したい場合はin binary。8進数なら0oとin octalでいける。

2008-03-19

jQueryによるフォーム部品操作のレシピ

| 18:00 |

テキストボックスやラジオボタンなどのフォーム部品は、論理モデルとしては単純なnameとvalueの組み合わせであるものの、jQueryを以ってしても画面上では統一的に扱えずに意外と苦労する。忘れがちなので纏めてみた。

フォーム部品共通

フォーム部品(のjQueryオブジェクト)を取得する

var obj = $('#target');  // id指定
var obj = $('.targets'); // class指定
var obj = $('input[@name=xxx]');  // name指定

テキストエリア、リストメニューなど同一ドキュメントで唯一なものにはユニークなidを振っておき、チェックボックスラジオボタンなど同一のname要素で複数存在するものにはそれらで共通のclassを振っておくか、name要素で指定するのが無難か。

テキストボックス(input[@type=text])

記入されているテキストを取得する

var str = $('#target').attr('value');
var str = $('#target').val(); // 上に同じ

テキストを設定する

$('#target').attr({ value: 'abcde' });
$('#target').val('abcde'); // 上に同じ

チェックボックス(input[@type=radio])

指定のvalue値を持つチェックボックスがチェックされているか

// true or undefined
var flag = $('input[@name=target][@value=xxx]').attr('checked');

指定のvalue値を持つチェックボックスをチェック済みにする

$('input[@name=target][@value=xxx]').attr({ checked: "checked" });
$('input[@name=target]').val(['xxx']); // 上に同じ、必ずリストで渡す

valメソッドは同一name要素のチェックボックスについて一括で設定することができる。指定にないvalue値を持つチェックボックスについてはチェックが外れる。

$('input[@name=target]').val([1, 2, 3]);

ラジオボタン(input[@type=radio])

選択されているラジオボタンのvalue値を取得する

var x = $('radio[@name=target]:checked').val();
// $('radio[@name=target]').val() だと先頭要素のvalue値を返すので誤り

指定のvalue値を持つラジオボタンを選択する

$('radio[@name=target][@value=xxx]').attr({ checked: "checked" });
$('radio[@name=target]').val(['xxx']); // 上に同じ、必ずリストで渡す

リストメニュー(select)

選択されているオプションのvalue値を取得する

var x = $('#target').children(':selected').val();
var x = $('#target').val(); // これだけで上に同じ

指定のvalue値を持つオプションを選択する

$('#target').children('[@value=xxx]').attr({ selected: 'selected' });
$('#target').val('xxx'); // これだけで上に同じ

オプション要素を追加する。IEでは不具合が生じる可能性があるのに注意。

$('#target').append($('<option>').val('xxx').text('xxxxxxx'));

特定のオプション要素を削除する

$("#target").children('[@value=xxx]').remove();

オプション要素を一括で削除する

$("#target").children().remove();
$("#target").empty(); // 上に同じ

複数選択リストメニュー(select[@multiple=multiple])

選択されているオプションのvalue値を取得する

var arr = $('#target').val(); // value値は配列で返される

指定のvalue値を持つオプションを複数まとめて選択する。チェックボックスの場合と同様で指定にないvalue値を持つオプションは非選択状態となる。

$('#target').val([1, 2, 3]);

特定のオプションについて選択を解除する

$("#target").children('[@value=xxx]').removeAttr('selected');

選択を一括で解除する

$('#target').children().each(
    function(i){ $(this).removeAttr('selected') }
);

(2009-01-07追記)バージョンの記載が抜けていましたが、以上はv1.2.3で動作確認したものです。コメントでも指摘頂いてましたが、最近のバージョンでは一部がそのままでは動作しなくなったようなのでご注意を。

na0001na0001 2008/05/20 16:25 $(’radio[@name=target]:checked’).val();ではなく最新バージョンでは
$(’:radio[@name=target]:checked’).val();でないと動きません。

GG 2009/01/29 18:46 参考になりました。

2008-03-18

jQueryでoption要素を追加した際の諸問題

| 14:18 |

jQueryで任意のoption要素を追加するには、append()やprepend()を利用するのが手軽。

$('#target').append($('<option>').attr({ value: 'xxx' }).text('xxxxxxx'));

だが、この操作はIEの場合に問題が生じる。v1.1.3.1以前ではoption要素を追加しても幅が調整されない不具合があり*1、v1.2.3ではoption要素を増やした直後にそのvalue値をval()で設定しようとすると、

「selected プロパティを設定できませんでした。 未定義のエラーです」

というスクリプトエラーが発生する*2。これらの問題はselect要素ごと作り直してしまうことで回避できる。

$('#target').after($('#target').clone());
$('#target').remove();

一時的に同一のidを持つ要素が二つできてしまうが、jQueryはこれも問題なく扱える。after()で追加したselect要素のコピーは正しい幅を持ち、val()による値のセットも問題なく行える。after()の戻り値は$('#target')なので、一行で書くこともできる。

$('#target').after($('#target').clone()).remove();

上記はreplaceWith()と等価なはずなのだが、何故かこちらではval()のエラーが回避されない。

$('$target').replaceWith($('#target').clone());

このメソッドはv1.2.3の460行目付近に定義されている。

	replaceWith: function( value ) {
		return this.after( value ).remove();
	},

回避策はもう一つある。option要素を増やした直後に

$('#target').width();

上記のようにwidth()を呼び出すと、v1.1.3.1では幅が調整され、v1.2.3では以後val()による値のセットでエラーが生じなくなる。ソースを追ってみたが、理由はよく判らない。

更に言うと、v1.2.3ではoption要素を増やした後に任意の引数でalert()を呼び出してからval()をセットすると、何故かエラーが発生しない。

$('#target').append($('<option>').attr({ value: 'xxx' }).text('xxxxxxx'));
alert('press any key'); // この一行がないとエラーになる
$('#target').val('xxx');

意味不明。誰かこのメカニズムを解明できたら、是非教えてください。

*1:どうやら、select要素を含むbodyやdiv要素をappend()等で直前に操作している場合に発生するらしい

*2:元々存在していたoption要素に設定されているvalue値ならエラーは発生しない

ズベズベ 2008/08/05 09:16 jQueryではないのですが、Ajaxとセレクトボックスの組み合わせで同様のエラーが発生しました。
意味不明ですが、alert()の変わりにセレクト.focus()を用いることでも回避できました。
参考になりました。

x6x6x6x6 2009/01/07 12:48 最近判ったんですが、これらはDOMの構築や描画のタイミングによる問題のようで、setTimeoutを使って後述の処理を遅らせたりすると上手くいく場合が多いようです。
おそらく、alertやfocusでも処理のタイミングがずれて回避できたんでしょうね。

hogehoge 2010/04/14 14:58 私もIE系にてひっかかりました。どうやら描写のタイミングみたいですね。

hogehoge 2010/04/14 14:58 私もIE系にてひっかかりました。どうやら描写のタイミングみたいですね。

dodoriasandodoriasan 2010/09/09 11:37 この記事のおかげで非常に助かりました。
ありがとうございました。