UNIXシェルからファイルの改行コードを調べる
毎回思い出すのに苦労するので、備忘のため記録しておく。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が続いて存在すればCR+LF。一発で判定して教えてくれるコマンドとかありそうなものだけど。
Windowsならとりあえず秀丸で開けば判別してくれる。メニューの「動作環境」→「ウィンドウ」→「高度なウィンドウ」にある「エンコードの種類」を「常に表示+改行コード」に設定しておくこと。
OpenPNEの名前の由来
OpenPNEの原型は、私が所属する会社である株式会社手嶋屋(http://www.tejimaya.com)で実験していた携帯電話向けのサブアドレスサービス「みせかけメアドPNE」です。当時はまだSNSではなく、携帯電話向けの転送メールサービスでした。
月刊SNSはじめます!:So-net SNS TIPS!:So-net blog
(中略)
PNEの名前の由来はこの転送メールから来ています。サービスの仕組み上、どうしてもサイト名の最後が「ne.jp」になるようにしたかったことと、携帯で打ちやすいキーを組み合わせていったら、ane dne gne jne mne....となっていき、「pne.jp」が一番響きが良かったのでこれに決まりました。
ふと何の略称なのか気になって調べてみたら、意外にも意味のある言葉ではなかった模様。
16進数の計算をググる
最近、あるプログラマと話していて気づいたのだけど、彼は16進数の2桁と1桁との掛け算(FDh×5とか)が出来ない。やり方自体を知らないのだ。彼はWindowsの電卓を立ち上げて計算していた。
2009-01-06
プログラマの端くれではあるが、暗算する必要性に迫られた経験は一度もなかったり。引用したエントリの趣旨からは逸れるが、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でいける。
jQueryによるフォーム部品操作のレシピ
テキストボックスやラジオボタンなどのフォーム部品は、論理モデルとしては単純な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])
var x = $('radio[@name=target]:checked').val(); // $('radio[@name=target]').val() だと先頭要素の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で動作確認したものです。コメントでも指摘頂いてましたが、最近のバージョンでは一部がそのままでは動作しなくなったようなのでご注意を。
jQueryでoption要素を追加した際の諸問題
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');
意味不明。誰かこのメカニズムを解明できたら、是非教えてください。
はてダの欠点
エントリーをその場で編集できる機能は便利なんだけど、プレビューや一時保存できる機能がないのは割と困る。WYSIWYGなわけではないから、うろ覚えな記法を使う時は一旦登録しては直ぐに修正する、という作業を頻繁に繰り返すことになりがちなのだが、推敲中のエントリーを見られるのは実害は無いかもしれないけどなんとなく厭。
他のblogサービスがどうなのかは知らないが、以前使っていたMovableTypeは「草稿」という非公開のステータスで保存しておくことができ、長文を温めてから公開するという使い方ができた。blogではないがGmailはメールを書いてる最中にも、定期的にサーバ側へバックアップを取ってくれる。この不安定なブラウザ上でいつ書きかけのデータが失われるのかと考えてしまうと、はてダの画面上だけで長文を書く気にはなかなかなれない。
はてダで驚くほどの長文を書いてる人は結構存在するようだが、果たしてどのくらいの人がこの画面上だけで文を書き上げているのだろうか。