2011年11月29日火曜日

データベース定義の差分



開発環境、本番環境の差分をとる
サンプルコードによるPerl入門
MySQL-Diff





mysqlコマンドメモ



参考


MySQLとシェルスクリプト


テーブル定義をダンプ --no-dataオプション


省略系は-d



mysqldump -u hoge -p --no-data db_name > dumpfile




Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]



データだけダンプ



  • t オプション



ダンプファイルを読み込む



mysql -u hoge db_name < dumpfile



テーブルが破損してないかチェック



check table table_name





2011年11月28日月曜日

dieをシグナルでフックしたいが、evalは例外にしたい。



evalで囲っているけど、$@が出力されてない、コード全部直すの面倒!ってときに

evalの中で起こったエラーを検出する



$SIG{__DIE__} = sub {
# ログ出力
}



eval内の例外をキャッチするコードはちゃんと書いているので、eval内のdieはフックせず無視したい場合

evalと$SIG{__DIE__}とcaller



  • eval内でdieされたときは $^S == 1(perlvar参照)



$SIG{__DIE__} = sub {
return if $^S;
# ログ出力
}





2011年11月20日日曜日

xcodeショートカット



バージョンは3.2.6


編集


現在行の定義場所へジャンプ


  • cmd-ダブルクリック

    • 飛べないときは、cmd-opt-D で。




文頭、文末にジャンプ


  • cmd-矢印


保存前に戻す


  • cmd-u


コード折り畳み


  • 全折り畳み

    • Ctrl + Cmd + ↑



  • 全展開

    • Ctrl + Cmd + ↓



  • 単体折り畳み

    • Ctrl + Cmd + ←



  • 単体展開

    • Ctrl + Cmd + →




ウインドウ


エディタ最大化


  • opt-cmd-E


対になっている.mと.hファイルを切り替え


  • opt-cmd-↑

  • マウスパッドで3本指で上にスライド


前後の編集場所に戻る?


  • マウスパッドで3本指で左右にスライド

    • 定義場所にジャンプしてから、元のファイルに戻りたいときに使っている




デバック画面に切り替え


  • opt-Y

  • もとに戻すのはどうやるんだ、、、



ビルド


ビルドと解析


  • cmd-A


ビルドと実行


  • cmd-RET

  • cmd-y


クリーニング


  • cmd-K

    • make cleanを行う。インターフェースビルダー変更後に必要。






環境設定を開く


  • cmd-,





2011年11月16日水曜日

Objective-C入門 メソッドとクラス




  • 基本的にC言語と同じ。

    • 大きく異なるのはメソッド呼び出しくらい。





メソッド呼び出し


メッセージ式

メッセージ式(角括弧[])でメソッド呼び出し。
コロンの前後で1セットという感じだが、最初だけ異なっている。
[object method:引数1 ラベル:引数2 ラベル2:引数3]


Perlでいうと、



$self->method(arg1, { ラベル => 引数2, ラベル2 => 引数3, })


って感じか。



  • 引数なしのメソッド呼び出し

    • [string length]



  • 引数1つ

    • [string characterAtIndex: 0]



  • 引数2つ

    • [string rangeOfString:@"hogehoge" options:NSCaseInsensitiveSearch]





メソッド名はラベルと末尾のコロンも含める

上記の引数2つのメソッド名は、rangeOfString:options: になる。


メソッドの宣言


C言語と同じく、最初に返り値の型を書き、あとは、各引数の型を書くだけ。型は()で囲む。



(NSRange)rangOfString:(NSString*)string options:(NSStringCompareOptions)mask



IDE上の+と-

-がインスタンスメソッド
+がクラスメソッド


クラス宣言(インタフェース)


ヘッダーファイルでクラス宣言する。クラス名は先頭大文字。



@interface クラス名:親クラス名
{
//インスタンス変数
//インスタンス変数はメソッド内の変数と区別するために先頭をアンダーバーにする規則もある
int hoge;
NSString* foo;
}

-(BOOL)isHoge //メソッド宣言
@end


クラスにスコープがない

このため、NS、UI、CAなどの接頭辞がある。



  • NS

    • Mac OS Xの前身、NEXTSTEPの略







型はCと同じものと、Objective-Cのものがある。Objective-Cの型は*を付ける。当然ポインタ参照なわけですね。
クラスはすべてヒープメモリに確保されるので、そのインスタンスをあらわす変数は実体ではなくポインタ。


クラス実装


hoge.mファイルに実装を書いていく。



#import "インタフェースのあるヘッダファイルパス"

@implementation クラス名
-(BOOL)isHoge
{
.......
return .....;
}
@end





wordbreak.jsでforefox8でデザインが崩れた。



JQueryで連続した半角英数字を任意の場所で改行するプラグイン
これを使わせていただいてたのですが、Firefox8でデザインが崩れてしまいました。


原因



  • インデントの部分がtextContentで取得されてしまう




以下では、pとspanの間がtextNodeとして取得されてしまいました。



<p class="wordbreak">
<span>hoge<span>
</p>



修正



$(h).each(function(){
if ( /^\s*$/.test(this.textContent) ) {
elm.append(this);
}
else if ( this.nodeType == 3) {
elm.append($.trim(this.textContent.split('').join($.wb.sep)));
}
else {
elm.append($.wb.remake($(this)));
}
});



空白だけか、空の時は何もしない。
this.nodeTypeのところは、this.textContentの中身を調べるって条件ではダメなのかな。
(JavascriptおよびDOMがわかってない)





2011年11月5日土曜日

Excel列名変換問題



Excel列名変換問題で第2回社内プログラミングコンテストを開催してみた(前編)


とりあえず書いてみたら、print reverse $str とかやってしまった。(リストの順番を逆順にするので、この場合なんら変化なし)
問2が難しいのは、問1の成功体験が足かせになるところか。問1が基数変換で解けるものだから、そのまま問2にいくとはまる。例えばZ(=26)の次のAA(27)で、2桁目のAが1で、一桁目のAが0になる。


問1の場合、僕は2位の人と同じように、ordを使用してましたが、
1位の人みたいにループごとに現在の累積値に26をかけて桁をひとつ上げていくのがスマートでした。


ただ2点、Perlらしくないなーと思うのが、



  • ハッシュを手書きで登録している

    • ハッシュはハッシュスライスで、 @table{'A'..'Z'} = (1..26); とすべき。



  • C言語風のループ


好みかもしれませんが、無駄に長いので、、、。
あとC言語風ループなら $i < ($#input+1) じゃなくて $i < scalar @input か$i <= $#inputかなー。



for (my $i=0; $i < @input; $i++)

for my $i (0..$#input)




ソースは書いてみたけど、mooseの練習に書き直してみようと思う。仕事でよく使うようになってきたので。





2011年10月31日月曜日

日本語OCR



O2-toolと、nhocr、freetypeをインストール。
なんかO2-toolのインストールに失敗すると思ったら、O2-dtoolだったというオチ
まずfreetypeとO2-toolを普通にインストール。ただし、prefixを指定すること。(O2-toolのデフォルトが変)



./configure prefix=/usr/local
make
sudo make install



次に、nhocrインストール



$./configure prefix=/usr/local --with-O2tools=/usr/local



test/run-testでサンプル実行。
うーん、精度悪い。でもまぁ言葉としておかしいところを修正すればそれっぽくなるか。

ここまでやっといて自分の目的とは違うなぁってことに気づく。
画像中から文字っぽいところを探しだしてパターンマッチングでいいきがする、、、、。





2011年10月30日日曜日

traceroute



pingと違って、途中の経路でもpingと同じような情報が得られる。





CSVに対してSQLが使えるDBD::CSV



参考
でかいCSVの中から一部だけ抽出して処理するときに使えそうですね。




2011年10月29日土曜日

HTMLから特定要素のテキストを抜き出す。



簡単。get_tagのところは複数指定可



my $p = HTML::TokeParser->new(\$html_data);
if ($p->get_tag("title")) {
warn $p->get_trimmed_text;
}





Path::Classを使って、ディレクトリ以下のHTMLファイル読み込み。



はじめてのPath::Class
slurpがあるとはー。



my $dir = dir($dir_path);
my @file_paths;
$dir->recurse(
callback => sub {
my $entry = shift;
return if $entry->is_dir;
return if $entry !~ /\.html\z/;
push @file_paths, $entry->absolute;
}
);

for my $path (@$paths) {
my $html_data = Encode::decode('utf-8', $path->slurp);
}





二進化十進数 (BCD、Binary-coded decimal )

BCD

仕組み
  • 十進数の各桁(0~9)を2進数で表す。127(10) は0001 0010 0111(2) という3つのBCD
利点
  • 10進数から2進数に変換すると循環小数が生まれるが、BCDなら大丈夫。
  • BCDを16進数に変換すると、10進数に変換したときと同じ表現になる。(A-Fは使用せず0-9までしか使用してないから)
BCDベースの形式
  • ゾーン形式
  • パック形式

ゾーン10進数(アンパック進数)

仕組み
  • 4桁のゾーンビットと4桁の数値ビットのペア
  • ゾーンビット
    • 数値であることを表す部分
    • 文字で数値を表したときのコードと互換性あり
      • つまり文字コードの違いが問題になる
      • 8ビット文字コードはEBCDICとASCII (JIS8)の二種類に大別されるためあまり問題にならない。

  • 符号ビット
    • 1桁目のゾーンビット部分は符号ビット
    • EBCDICでは1100(2),JIS8コードでは1101(2)
    • ベンダーによって方式が異なることが多く問題になりやすい

パック10進数

仕組み
  • BCD形式で末尾4bitに符号ビットを付加したもの。
  • 符号ビット
    • ゾーンと同じくEBCDICでは1100(2),JIS8コードでは1101(2)
利点
アンパック(ゾーン)だと1桁に8bit必要で無駄が多い。
1バイトで1つなので、以下のような場合は、先端に0000を付加する必要がある。
+1234  0000 0001 0010 0011 0100 1100
-1234  0000 0001 0010 0011 0100 1101

EBCDIC(エビシディック)

  • BCDを拡張したIBMの文字コード
  • 非常に扱いにくい1バイトコード

UTF-EBCDIC

  • EBCDICと互換性があり、Unicodeを表現できる文字コード
  • 設計時に対象だったメインフレームではあまり使われずUTF-16が使われている

2011年10月24日月曜日

Moose アトリビュート



和訳マニュアル アトリビュート


アトリビュート(属性)



has 'weight' => (
is => 'ro',
writer => '_set_weight',
default =>
sub { ( 'small', 'medium', 'large' )[ int( rand 3 ) ] },
required => 1,
clearer => 'clear_weigth',
predicate => 'has_weight',
);



  • is

    • ro,rwの指定



  • isa

    • クラス指定

    • Int,Str,単純にObjectってあるのは何だろ



  • writer

    • 属性名とは異なる名前で書き込みメソッドを呼び出す

    • 外部からは読み取り専用だが、内部では書き込みしたい場合に使用。



  • predicate

    • 値がセットされていれば真を返す

    • undefが明示的に代入されている場合も真。



  • clearer

    • 値をセットされていない状態にする

    • undefとは異なり、predicateで偽になる。



  • required

    • 属性を必ずコンストラクタに渡す。

    • 値が必須なわけではないので、undefかも。



  • default

    • 単純なスカラ

    • サブルーチンリファレンス => 代わりにbuilderメソッドが推奨

      • サブルーチン以外のリファレンスを渡すとエラー。





  • builder

    • _build_属性名 がメソッド名になる。

    • 継承もオーバーライドも可能

    • roleの属性でbuilderのメソッド名を指定しておいて、roleを使用するクラスで、その名前のメソッドを定義することもできる。





package HasSize;
use Moose::Role;
requires '_build_size'; # Roleを使用するクラスに必要なメソッド

has 'size' => (
is => 'ro',
lazy => 1,
builder => '_build_size',
);

package Lilliputian;
use Moose;

with 'HasSize';

sub _build_size { return 'small' }



  • lazy

    • defaultが単純なスカラーでない場合と、builderの場合は必ず使用。

      • default値が他のobjectと依存関係の場合があるから

      • cpu処理を減らす





  • lazy_build

    • 複数オプションをまとめて設定





has 'size' => (
is => 'ro',
lazy_build => 1,
);

has 'size' => (
is => 'ro',
lazy => 1,
builder => '_build_size',
clearer => 'clear_size',
predicate => 'has_size',
);




  • init_arg

    • クラスのコンストラクタで使用する名前を属性名とは別のものにする。以下は属性名はbignessだが、コンストラクタではsizeで属性値を設定する。

    • init_arg => undefにした場合はコンストラクタで初期値を設定することはできない。プライベートな属性に便利。






has 'bigness' => (
is => 'ro',
init_arg => 'size',
);




  • weak_ref

    • 属性に値がセットされたときは常にScalar::Util::weakenを呼ぶ

    • 循環参照になるかもしれないオブジェクトを作るとき便利



  • trigger

    • 属性が更新された「後に」呼び出すメソッド

    • trigger発動の条件

      • 属性が更新された場合(類似のafterメソッドモディファイアは読み込みでも呼ばれる)

      • 属性の値がコンストラクタに渡されたとき



    • triggerが呼ばれない条件

      • defaultやbuilderで値がセットされた場合



    • 更新前の値と更新後の値が引数にとれる。

    • 初めて設定される場合は引数の数がひとつ少ないので識別できる。



  • handles(委譲)

    • handles => { hair_color_hex => 'as_hex_string' }

    • hair_color_hexを呼ぶと、as_hex_stringが呼ばれるだけ?



  • トレート?

    • Roleのこと

    • 複数指定できるのが利点

    • ネイティブトレート

      • Hash(Moose::Meta::Attribute::Native::Trait::Hash)

      • Number (Moose::Meta::Attribute::Native::Trait::Number)

      • Counter (Moose::Meta::Attribute::Native::Trait::Counter)

      • String (Moose::Meta::Attribute::Native::Trait::String)

      • Bool (Moose::Meta::Attribute::Native::Trait::Bool)

      • Array (Moose::Meta::Attribute::Native::Trait::Array)





  • オーバーライド

    • 子クラスで属性名の前に+を付けるだけ



  • 複数属性の定義

    • has [ 'x', 'y' ] => ( is => 'ro', isa => 'Int' );







2011年10月22日土曜日

クエリログが存在しないときのクエリ補完



クエリログのない状況下でのクエリ補完


クエリのログをとってない場合どうやって補完するのか。



  • ジャンルが絞り込めるなら、そのコーパスを使用する

  • コーパスから入力中クエリを使用して検索



問題点



  • 入力中クエリでコーパスから検索しても精度が低い



提案手法



  • 入力中のクエリで、完全なフレーズと不完全なフレーズに分ける。

  • 不完全なフレーズでコーパスから検索

  • 一般的すぎるフレーズを避ける

    • TF-IDF

    • 短いフレーズが優先されすぎないようにパラメータチューニング(短いフレーズを含む長いフレーズと比べると短いフレーズの出現回数が常に多いため。ex.「言語処理」だと短い「言語」のほうが出現回数が多い)



  • 完全なフレーズも修正補完

    • 完全と不完全フレーズが両方存在する文書を探して、正規化。完全一致はスパースネスを起こすのでしない。






感想


こういう正統派は実践で使いやすそう好き





2011年10月17日月曜日

YAPC2011感想



ほんとは、自分はYAPCを糧にコードを書くつもりであって、感想は書かないつもりだったのだけど、


YAPC参加した、関わった人は是非ブログを書いてね!ほんと頼むよ!それ見たくて運営やってるようなもんだから! #yapcasia


と言われては書かないわけにはいかないかなーと。


自分はITやるなら人がいっぱいいる東京しかない、と思って今年東京にきて、YAPCは初参加でした。
今回、東京に出てくるまでは向こう側の人たちでしかなかった人たちと沢山話しが出来て楽しかったです。
ただやっぱり雑談をしただけでは物足りず、この人たちとPerlerとして会話ができるようにがんばりたいと思いました。


見てろよ来年ーー




2011年10月12日水曜日

木構造とか



2分木



  • O(¥log m)

    • m:木の深さ

    • 2分木なので、深さの対数log2 (均等に振り分けないと無駄に深くなるけど)




Trie木



  • O(n)

    • n:文字列長

    • すでに辞書式ソート済みなので、文字列長で検索できる。



  • メモリ

    • 多数の短い文字列群は、共通するキーをもつ確率が高いのでメモリを節約できる。

    • 逆に長い文字列はパトリシア木が良い。




パトリシア木



  • トライ木であるノードからあるノードまでの間、1本道で分岐がない場合、ひとつのノードにまとめてしまう。

  • 常に成功する場合に適している

    • ひとつのノードにキー値がまとまってるからかな




suffix木



  • wikipedia

  • suffixで生成された部分文字列をキーとして木に登録

  • 接尾辞リンク

    • ひとつ前の接尾辞を指す BANANA <- ANANA <- NANA <- ANA <- NA <- A





AC法



  • マッチングに失敗した際に、次に調べるべきノードを予め登録しておくもの

    • ある入力文字列(ex.東京都)に特定のキーワード(Trieに登録済み)が存在するかを調べる際に、ある経路でマッチングに失敗したときに、入力文字列を一文字削って、それ(ex.京都)をTrie木の頭から調べるのではなく、次にどこから始めるべきか、予め登録して高速化している。



  • 入力文字列を一文字ずつ削る場合の話なので、事前に形態素解析してある場合は失敗したらそこまでなので、AC法は必要ない。





2011年9月18日日曜日

emacsclient



emacs23.1以降の--daemonを使用


設定


.emacs



(require 'server)
(unless (server-running-p)
(server-start))
(defun iconify-emacs-when-server-is-done ()
(unless server-clients (iconify-frame)))
(add-hook 'server-done-hook 'iconify-emacs-when-server-is-done)
(global-set-key (kbd "C-x C-c") 'server-edit)
(defalias 'exit 'save-buffers-kill-emacs)
(add-hook 'server-visit-hook
(lambda ()
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
))




.bashrc or .zshrc



export EDITOR=emacsclient
export VISUAL=emacsclient



使用


emacs --daemon
emacsclient FILENAME





2011年9月17日土曜日

emacsでファイル横断検索後、バッファ置換



インストール


M-x install-elisp-from-emacswiki igrep.el
C-c C-c
M-x install-elisp-from-emacswiki grep-edit.el
C-c C-c
M-x eval-current-buffer


検索結果のバッファを置換。


M-x igrep-find
置換 'M-%
正規表現で置換 M-C-%
後方参照は\[\]で囲ったものを、\&で参照するみたい。

これ合ってる?
M-x query-replace-regexp では\(\)で囲ったものを、\数字で後方参照する。


置換後の操作


C-c C-e 全変更保存
C-c C-f リージョンの変更破棄
C-c C-u 全変更破棄


文字コードに依存しないlgrep


apt-get install lv
igrepの代わりに使用するだけ。
ただし、サブディレクトリを再帰的に処理するオプションがない。
自分でfindを使用したaliasを作成する必要がある。





2011年9月11日日曜日

サイ本5版 1部「コアJavaScript」  5章「式と演算子」



算術演算子



  • 除算

    • 0で割ると、Infinityか-Infinity

    • 0/0はNaN(NaNの型はnumber)





IN演算子(プロパティの所属を調べる)


オブジェクトのプロパティであればtrueを返す。
左側オペランドは文字列か文字列に変換されるものでなければならない。


instanceof演算子(インスタンスの所属を調べる)


クラス(コンストラクタ関数)のインスタンであればtrueを返す。
右側のオペランドがクラスでない場合は、実行時エラーを返す。


文字列演算子



  • +演算子は文字列を優先する

    • どちらか一方が文字列なら数値は文字列に変換される



  • 比較演算子は数値を優先する

    • どちらか一方が文字列なら、文字列は数値に変換される。





ビット演算子


  • オペランドに整数が必要

  • ビット演算子は、内部で浮動小数点形式から32bitの整数形式に変換する

  • 右シフトは符号付き>>と符号無し>>> 演算子の2種類がある



代入演算子


  • 結合性は右から左

    • i = j = k = 0;



  • 左側オペランドは代入された値を参照する



typeof演算子



  • objectと判定されるもの

    • オブジェクト(配列、Number,String,Boolenラッパーオブジェクト、Date,RegExpなど)

    • null

    • クライアントサイドオブジェクト



  • 他の型

    • function

    • number

    • string

    • boolen

    • undefined





オブジェクトの型を知る

typeofではobjectとしか判定されないので、instanceof演算子やconstructorプロパティを使用して、
詳しく調べる。


delete演算子


削除に成功すると、true,失敗するとfalesを返す



  • 削除できないのも

    • コアのプロパティやクライアントサイドのプロパティには削除できないものがある

    • var文で宣言された変数





存在しないプロパティに対してもtrue

ECMAScript標準ではオペランドがプロパティや配列要素、変数でない場合もtrueを返す仕様になっている。


プロパティの参照先を削除するわけではない

プロパティの参照先を削除するのは、GCのお仕事


void演算子


void 0 でundefinedと同じ効果。
undefinedが規定されたのは、ECMAScript v3, 実装されたのはJS1.5
古いバージョンとの互換性を気にするならvoid 0


.演算子と、[]演算子



  • .は識別子、[]はプロパティにアクセスする

  • 変数などを使用して動的にプロパティにアクセスする場合は[]を使用する



関数実行演算子()


即時関数とかでよく使いますね。





2011年9月10日土曜日

サイ本5版 1部「コアJavaScript」  7章「オブジェクトと配列」



プロパティの存在確認


inとundefined
大抵はundefinedを使用する。


in

if ( "hoge" in obj ) obj.hoge = 1;


undefined

if ( obj.hoge !== undefind) obj.hoge = 1;


両者の違いはプロパティが存在するかどうか


obj.hoge = undefined;


のように、プロパティ自体が存在する場合は、
inはtrueになる。


プロパティごと削除


delete演算子を使用する。


Objectオブジェクトのプロパティとメソッド


constructorプロパティ

オブジェクトを生成したコンストラクタ関数を参照している。
instanceof演算子はconstructorプロパティを調べている。


toString()メソッド

toStringメソッドは引数をとらない。
オブジェクトが文字列に変換されるときに暗黙的に使用される。
例えば



  • +演算子で文字列とオブジェクトを結合

  • alert(),document.write()に渡すとき


そのままではあまり役に立たないので、多くのオブジェクトで独自のtoStringが定義されている。



  • 配列

    • 文字列に変換された要素リスト



  • 関数

    • 関数の定義





toLocalString()メソッド

JP,USなど、ロケールによって返す文字列を変化させる。
ECMAScript v3 ではArray,Data,NumberのtoLocalString()メソッドは
ローカライズされた文字列を返すように規定されている。


valueOf()メソッド

オブジェクトを文字列以外の基本型に変換するときに呼び出される。
デフォルトでは何もしない。
Date.valueOf()など、一部のオブジェクトは独自のvalueOf()を持つ。


hasOwnProperty()メソッド

hasOwnPropertyを呼び出したオブジェクト(obj)が引数hogeをプロパティにもつか。
継承したものはfales



obj.hasOwnProperty("hoge")



propertyIsEnumerable()メソッド

hasOwnProperty()とほぼ同じ。
propertyIsEnumerable()はhasOwnProperty()と同じ動作かつ、for/inで調べられる場合にtureを返す。
しかし、for/inで調べられないプロパティは、ほとんどの場合継承したもの。
だからhasOwnProperty()とほぼ同じ。


isPrototypeOf()メソッド

呼び出したオブジェクトが引数で指定したオブジェクトのプロトタイプであるときture



var o = {};
Object.prototype.isPrototypeOf(o); // o.constructor == Object
Function.prototype.isPrototypeOf(Object); //Object.constructor == Function



配列


配列はオブジェクトに少々機能を追加したもの。
typeof演算子でも「Object」と表示される。
簡単に説明するために、配列とオブジェクトは別のものとして扱う。


使用可能なインデックス

0~2^31-2の正の整数
これ以外では文字列として扱われプロパティ名になる。


オブジェクトに配列要素を追加

オブジェクトに「0」という名前のプロパティを追加。(0は文字列ではない)
これは配列の要素を追加しただけで、オブジェクトが配列になるわけではない。


要素はdeleteで削除できない

deleteはプロパティそのものを削除するが、
配列の要素で使用した場合はundefinedを設定するだけ。
配列の要素自体を削除する場合は、shift(),pop(),splice()など配列メソッドを使用する必要がある。


lengthプロパティ

配列の最大index+1の値を保持。
配列に変化があると自動的にlengthも変化する。
配列のインデックス最大値は2^32-2なので、lengthの最大値は2^32-1


lengthプロパティに値を書き込む

lengthに現在の値より小さい値を代入すると、配列の長さが切り詰められ、要素は中の値とともに廃棄される。
現在値より大きな値を代入すると、拡張された分の要素にはundefinedが入る。


配列のメソッド


  • concat()


配列に要素を追加して新しい配列を作成
引数に与えた配列は要素に展開される。
しかし再帰的には展開されない



var a = [1,2,3];
a.concat(4,5) //[1,2,3,4,5]
a.concat([4,5]) //[1,2,3,4,5]
a.concat([4,5,],[6,7]) // [1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]) // [1,2,3,4,5,[6,7]]




  • slice()

    • 非破壊的。

    • 2番目の引数で指定された要素の直前までが格納される。





  • splice()

    • 破壊的。削除と挿入を同時に行える。削除した分は返される。

    • 1,2引数は削除用、それ以降の引数は挿入用。





var a = [1,2,3,4,5];
//index2から長さ0で削除。つまり削除しない。
//index2の位置から挿入
a.splice(2,0,'a','b'); //aは[1,2,'a','b',3,4,5]
a.splice(2.2,[1,2],3); //['a','b']が返される、aは[1,2,[1,2],3,3,4,5]






  • JavaScript1.6から実装された配列メソッド

    • indexOf(), lastIndexOf(), forEach(), map(), filter()





  • indexOf(),lastIndexOf()

    • 指定した値を配列から高速に検索



  • forEach()

    • 配列の各要素を引数に、指定した関数を実行する。



  • map()

    • forEach()かつ関数から返された値を配列にまとめて返す。perlのmapと同じ。



  • filter()

    • forEach()かつ関数から返された値がtrueの要素だけ抜き出す。perlのgrep。





配列のようなオブジェクト


配列はオブジェクトの一種だが、特別。特にlengthプロパティ。
配列のようなオブジェクトはJSで多用する。
Argumentオブジェクトや、document.getElementByTagName()メソッドなどが返すオブジェクト





サイ本5版 1部「コアJavaScript」  6章「文」



式とは


評価して値が生成されるもの
=演算子のように副作用を起こすこともあるが、通常式自体は何もしない。

文とは


JSに何かをさせるのもの(副作用のあるもの)

式文


副作用を伴う式が最も簡単な文


  • 代入文 s = "aaa"+ "bbb", i *= 3

  • counter++

  • delete o.x

  • 関数実行()

    • 何もしない関数は実際にはありえないので式文。

    • function文自体は静的な定義をするだけなので、厳密には文ではない。動的なものが文。



式にはセミコロンが必要


文ブロック


{}は複数行を1行として扱う。
ifやfor、returnで使用される。

for/in文


オブジェクトのプロパティを取り出して処理。

オブジェクトのプロパティの名前をすべて配列にコピー
for(a[i++] in o){}



  • for/inループの中で、プロパティを削除すると、そのプロパティはfor/inで処理されない。

  • ループの中で新しいプロパティを定義した場合、for/inループで処理されるかはJSの実装による。

  • for/inはすべてのプロパティを調べられるわけではない



function文


関数定義時に実行されるのではなく、実行演算子()で実行される。
定義は事前にコンパイルされ新しく関数オブジェクトが生成される。
この関数オブジェクトは関数名をプロパティ名とした(グローバルオブジェクトまたはCallオブジェクトの)プロパティに関連付けられる。
事前に解析されているので、function文の定義より前の行で実行できる。

補足

CallオブジェクトはActivateオブジェクトのこと。AvtivateはECMA仕様で使用されてる名前。




2011年9月7日水曜日

サイ本5版 1部「コアJavaScript」  3章「データ型と値」 3.13~3.15.4



オブジェクトから基本データ型への変換


nullでないオブジェクトは必ずtrueなので、falseに変換されるような値を持つオブジェクトでもtrueになる。



new Boolean(false)
new Number(0)
new String("")
new Array()



valueOf()メソッドとtoString()メソッドによる型変換

オブジェクトが数値に変換される場合



  • まずオブジェクトのvalueOfメソッドを呼び出す。

  • たいていは継承を遡り、ObjectのvalueOf()を実行。これは何もせずにオブジェクトを返す。

  • 次に、toString()メソッドが呼ばれ、文字列に変換

  • 文字列が数値に変換される。


要素が2つ以上の配列は"3,4,5"のような文字列から数値に変換することになるので、NaNになる


コンテキストによる型変換

+,比較演算子はコンテキストが曖昧なことがあり、この場合は↑のとおり、valueOf(),toString()が呼び出される。



  • Dateオブジェクトは例外

    • Dateオブジェクトは自分でvalueOf()とtoString()を持っているため、valueOf()で数値に変換される。

    • たいていのオブジェクトはvalueOf()を持っていない



  • valueOfは数値に変換するメソッドではない。「意味のある値」に変換するためのものであり、文字列を返してくることもある。



値と参照のルール



  • 基本型は値渡し、それ以外は参照

    • オブジェクトは参照。関数、配列もオブジェクトなので参照。



  • a = b;としたとき、aとbは同じ値をもつ別の変数なのか、それとも同じものをさす参照なのかは、変数に代入するものによる。

    • b=[1,2];など参照型ならa===b,

    • b = 1;なら、a==b




文字列は参照型か?


  • 実装による?

  • 文字列は不変(immutable)なので、どちらでもあまり関係ない。

  • ただし、同じ内容の文字列なら==でtrueになるので、このときは値により比較している。





2011年9月6日火曜日

サイ本5版 1部「コアJavaScript」  4章「変数」



var宣言



  • varで宣言された変数は永続し、deleteで削除しようとするとエラーになる

グローバルオブジェクト


JavaScriptインタプリタが起動されると、コード実行前にグローバルオブジェクトが生成される。
グローバル変数を宣言するとは、このオブジェクトのプロパティを定義すること。
グローバルオブジェクトを生成したのち、初期化で、予め定義した値や関数を参照するプロパティをグローバルオブジェクトに設定する。Mathオブジェクトを指すMathプロパティや数値の無限大値を指すInfinityなど。

ローカル変数


Callオブジェクトのプロパティ

実行コンテキスト



  • 関数を実行するたびに、関数ごとに実行コンテキストを作成する。

  • これにより、変数をグローバルにするか、どの関数のCallオブジェクトにするか決める。

  • グローバルは複数あることも。

  • クライアントJSではウインドウやフレームごとに、それぞれ異なるグローバル実行コンテキストが定義される。これらの複数のグローバル実行コンテキストは相互参照することが可能。(相互参照はセキュリティ問題になる。13章で詳しく説明)




2011年9月5日月曜日

サイ本5版 1部「コアJavaScript」  3章「データ型と値」 3.1~3.12



数値


すべての数値は浮動小数点。IEEE754標準の64bit浮動小数点形式。
数値リテラルはマイナス記号で反転できるが、マイナス記号は単項演算子とみなされ、数値リテラルの一部ではない。


整数リテラル


8進数はECMAScriptでは規定されていないので、使用しないほうがいい。


浮動小数点リテラル


[数値][.数値][e|E[(+|-)]数値]
6.02e23 -> 6.02x10^23


特殊な数値


浮動小数点値の表現可能最大値を超えると「Infinity」となる。マイナス側は「-Infinity」
未定義な演算結果はNaN(Not a Number)になる。これは自分自身を含めていかなる数値とも合致しない。
isNaN()という関数を使用する。
上記のInfinity、-Infinity、NaNでないことをテストするにはIsFinite()
Finite([形]有限な)


エスケープシーケンス



  • \xXX

    • Latin-1



  • \xXXXX

    • Unicode



  • \XXX

    • 8進数Latin-1 ECMAScript v3ではサポートされてないので使用しない





文字列の操作


文字列中の特定の文字は配列表記を用いて読み込み可能。
しかし、ECMAScript v3 でサポートされてないので、charAt()を使用する



last_char = s.charAt(s.length - 1);


数値から文字列への変換



var n = 100;
var str = n + "";
var str = String(n);
var str = n.toString(10); //10進数で。省略可



有効桁数や指数表示を指定して数値->文字列変換


JS1.5以前は欠点があり、小数点以下の桁数の指定や、指数表示の指定方法が用意されていなかった。
JS1.5ではNumberクラスに数値から文字列に変換するメソッドが3つある。



// すべて四捨五入される
var n = 123456.789;
//小数点桁数指定
n.toFixed(0); //123457
n.toFixed(2); //123456.79
//指数表示指定
n.toExponential(1); //1.2e+5
n.toExponential(3); //1.235e+5
//有効桁数指定。有効桁数より大きい場合は、指数表示
n.toPrecision(4); // 1.235e+5
n.toPrecision(7); // 1.23456.8



文字列から数値への変換


"5"*"2"
"5"-0
Number(" 5 ") //前後に空白があってもいい
parseInt("15px") //15 後の文字列は無視される。第2引数で進数指定できる。
parseFloat("15.5px") //15.5


+は文字列結合と解釈されるので不可。
parseInt,parseFloatで数値に変換できないとNaNになる。


論理値への型変換


論理値コンテキストで変換されるが、明示的に変換する場合は
Boolen(x);を使用するか、!!xとする。



  • trueに変換されるもの

    • 0とNaN以外,

    • 空文字列以外,

    • nullでないオブジェクト、関数、配列





オブジェクト


配列

連想配列と異なり、インデックスが正の整数。
コンストラクタ new Array()は new Array(1,2)は[1,2]を表すが、new Array(2) は配列の大きさを表し[undefined,undefined]になる。
これが紛らわしいので、配列はリテラルで記述するのがいい。


基本型ではないオブジェクト


Dateオブジェクト

基本型ではないが、Dateコンストラクタで日時の設定取得ができる。


RegEXPオブジェクト

リテラルのほうが簡潔だが、リテラルはコンパイル時に一度しか生成されないので、
動的に生成する場合はコンストラクタを使う。


Errorオブジェクト


  • Error

  • EvalError

  • RangeError

  • ReferenceError

  • SyntaxError

  • TypeError

  • URIError


が定義されている。


null値(=値がない)


CやC++ではnullは0と同じだがJSは違う。nullはnullであり、コンテキストにより変化する。



  • コンテキスト

    • 論理値コンテキストではfalse

    • 数値コンテキストでは、0

    • 文字列コンテキストでは"null"





undefined (=未定義値)



  • 宣言されているが値が設定されていない(初期化されていない)変数

  • 存在しないオブジェクトプロパティ


を使おうとすると未定義値が返ってくる。



  • (null == undefined)はtrue

  • (null === undefined) はfalse

  • コンテキスト

    • 論理値コンテキストではfalse

    • 数値コンテキストではNaN

    • 文字列コンテキストでは"undefined"





型変換まとめ表


本のP39





2011年8月31日水曜日

tramp



参考


http://www.gnu.org/software/tramp/
http://blog.livedoor.jp/k1LoW/archives/64957553.html
http://d.hatena.ne.jp/hideden/20090108/1231395529


取得



ftp://ftp.gnu.org/gnu/tramp/tramp-2.2.2.tar.gz
ftp://ftp.gnu.org/gnu/tramp/tramp-2.2.2.tar.gz.sig



正当性チェック



gpg --verify tramp-2.2.2.tar.gz.sig tramp-2.2.2.tar.gz



公開鍵がないよ、と言われるので取得後、再実行。



gpg --keyserver pgp.nic.ad.jp --recv-keys ↑で表示されたkyeID
gpg --verify tramp-2.2.2.tar.gz.sig tramp-2.2.2.tar.gz


不正といわれなければOK


インストール



cd ~/.emacs/elisp
tar zxvf tramp-2.2.2.tar.gz
ln -s tramp tramp-2.2.2
./configure --with-contrib
make
sudo paco -D make install



設定



;; tramp
(require 'tramp)
(setq tramp-default-method "ssh")



あれ、、


これは便利、と思ったら変更するたびになんか走ってる、、、、
auto-saveはしてないし、、、重ひ、、、





日付をパース



MovableTypeの日付でソートしたい


こんな形式 => 02/03/2008 01:31:21 PM



use Time::Piece;
use Memoize;
memoize('time_piece');

my @sorted_DATE = sort { $self->time_piece($a) <=> $self->time_piece($b) } @DATE;

sub time_piece {
return Time::Piece->strptime( $_[1], '%m/%d/%Y %H:%M:%S %p' );
}



しまった、%Hでなくて、%Iだった。
そしてTime::Piece1.15では00時はパースエラーになるので、置換してやる必要がある。
もしくはTime::Piece1.20にアップデート。





2011年8月9日火曜日

MySQL Casual Talks vol.2のメモ



興味のある範囲だけでも、自分なりにまとめるのは絶対意味があると思うので、ちゃんと書いておく。
(下の参加してきたよ、のメモを読んだらちょっとやる気なくしかけたので。)


参考


「MySQL Casual Talks vol.2」に参加してきたよ、のメモ
oak-online-alter-table
MySQL4.0の運用


※発表者の横に書いてるのは発表タイトルじゃなくて、あくまで自分のまとめ用タイトルです。


MySQLをKVSとして使う (@さん)



  • KVSがオンメモリだとバグがあった場合、再起動が必要。前に7時間かかった。 -> MySQLに一本化



チューニング


  • スロークエリチェック

  • クライアント側でもスロークエリ出力

  • JAVAのスタックトレース出力

  • MySQLのコンテキストスイッチが激しいので、in句などで、クエリ数を減らす。



MySQLをKVSにしたメリット・デメリット


  • メリット


joinできない。インデックスの聞かないクエリは投げれない。
他のものに移行しやすい。



  • デメリット


キー以外での絞り込み。
アプリでソートロジック必須。
カラムの型変換GDB


超カジュアルに使うMySQL (@さん)


ぐにゃら君による本当のカジュアルとはこういうものだ講座。
発表資料


カジュアル

idはBIGINT
JSON/XMLをそのまま保存


カジュアルといえど限度はある

natural_key、created、updatedはカラムを分ける。


frendfeed方式でインデックスを別テーブルに分ける。

インデックス用に別テーブルを用意する。こういう呼び名だったのか。
blobがあるテーブルだと分けてます。


あとで変更する必要に迫られる

カラムを追加すればいいじゃない(by マリーアントワネット)
ALTER TABLEは遅い。
ツールがあるので使ってみるのも手(ほとんど非検証)



  • openarkkit

    • MySQL便利グッズ詰め合わせ。下のoak-online-alter-tableもその1つ。

    • oak-online-alter-tableMySQLを停止させないALTER TABLE





1.メンテナンス対象の元テーブルをコピーして、作業用の仮テーブルを作ります
2.仮テーブルに対して、カラム追加などの変更を加えます
3.その間、元テーブルに対して行われる更新処理について差分を記録しておきます
4.仮テーブルの変更が終わったら、記録しておいた差分データを仮テーブルに反映します
5.差分データの反映が終わったら、元テーブルと仮テーブルを入れ替えます
[リンク先より]




  • OnlineSchemaChange.php(facebook製)

    • facebook製のopenarkkitといったところ。





データ圧縮


  • MessagePack+Snappy


データを6割ほど圧縮できるので、I/Oも減る。
まぁカジュアルに使うならJSON突っ込むだけでいんじゃね、って言ってかも。


MySQL5.5からのperformance schema(@さん)


いろいろ統計とか情報が取れる。現状、以下の方法があるが、まだ足りなかった。



  • プロセス監視

    • pgrep -x mysqld



  • status

  • show

  • Information shema(MySQL5.5~) showより使いやすい

  • show profile

  • ログ

  • GDB いろいろ見れるが時間が止まっている。天敵はOptimized away。

  • dtrace -p `pgrep -x mysqld` -s script_name

  • GBUGトレース MySQLデバック版で使用可能。


デメリット

CPUパワーを使う。毎秒あたりのトランザクション数が数割落ちるので、web系で使うのはしんどいか。


MySQL5.07 -> MySQL5.5 へのアップデート (@さん)


発表資料
CentOS5標準のMySQL5.07から、一度MySQL5.1にアップデートしてからMySQL5.5に。
このときMySQL5.1、MySQL5.5は別マシンを用意して組み込みのMySQLを使ったほうが安全かも。


よくあるエラー

なくなっている設定がエラーが原因で起こる。
代表的なのは、default-charcter-set=utf8


MySQL MHA (@さん)


MySQLが止まったときに、マスターやスレーブの差分を見つけて同期。PurePerl
発表資料


マスターN対スレーブ1の構成(@さん)


マスターを分けるとjoinできないので、横断的にクエリ投げれない。
うっかりカジュアルに参加してしまった僕には基本的な内部の話がとても勉強になった。
発表資料


MySQLでNoSQL(@さん)


オラクルの中の人?作った理由は流行ってるから。実装が2つあって、理由は社内の人が2人、同時期にこんなの作りましたって持ってきたから。
ひとつは、MySQL5.6のmemchachedインタフェース用プラグイン。もうひとつは、MySQL Cluster 7.2。ClusterはもともとKVSで、なんかよくわかりません。下記に説明がありました。 *後で読む
スライド





2011年8月8日月曜日

JavaScriptパターン 1章 JavaScriptの概念



5つのプリミティブを除いてすべてオブジェクト



  • 数値

  • 文字列

  • ブール値

  • null

  • undefined



プリミティブ?

具体的な値(データ)の型


上3つのプリミティブはメソッドが使える

"hoge".lengthといった具合に文字列から直接使用できるが、これはオブジェクトが自動的にラップされているだけで、プリミティブ型がメソッドを持っているわけではない。


変数はオブジェクト


アクティベーションオブジェクトと言う内部オブジェクトのプロパティ。
(※アクティベーションオブジェクトは概念?ES5では表現が変わるとか)
varを付けないとグローバルオブジェクトのプロパティ。
(var宣言された「真の」変数はdeleteでは消せない。)


ECMAScript5(のstrictモード)


strictモードの説明
抜粋メモ



  • "use strict"と書くと理解できないブラウザではただの文字列なのでエラーにはならない。

  • with文が使えない

  • caller、calleeもダメ。

  • 関数内thisはグローバルをささず、undefinedを返す。



デバック


JSLint

コードチェッカー。デフォルトはstrictモード


console.dir

オブジェクトの中身列挙。console.logしか使ってなかった、、、、。


余談

本とは関係ないけど。ブラウザコンソールでJSを書くと、実行結果(変数や関数の定義)が残るので、そのまま知らずに続きを書くと結果がめちゃくちゃに見えて混乱する。
あとブラウザ特有のメソッドもある。





2011年7月29日金曜日

Image::Magickのdensityが効かない



コマンドラインでconvert -density 300 sample.pdf out.png
はできたのに、以下は変化しない。



my $img = Image::Magick->new();
$img->BlobToImage($pdf_data); #読み込み
$img->Set(density => '300', magick => 'png');
@png_data = $img->ImageToBlog(); #書き出し



悩んだあげく読み込み前に記述で出来た。



my $img = Image::Magick->new();
$img->Set(density => '300');
$img->BlobToImage($pdf_data); #読み込み
$img->Set(magick => 'png');
@png_data = $img->ImageToBlog(); #書き出し



うへぇ、なんでだろ。ドキュメントに書いてあったかなぁ、、、


蛇足:gsでpdf->画像変換の場合


gs -dSAFRE -dBATCH -dNOPAUSE -sDEVICE=png16m -r400 -sOutputFile=out_%d.jpg sample.pdf
って%dを書かないと、1ページ目しか出力されないです。


image to pdf


convert *.jpg output.pdf





2011年7月25日月曜日

Text::Xslateのcascade



参考ページ


http://perl-users.jp/articles/advent-calendar/2010/casual/8
http://search.cpan.org/~gfuji/Text-Xslate/lib/Text/Xslate/Syntax/Kolon.pm
http://pixiv.cc/himachoco/tag/Xslate


環境


mojoliciousとText::Xslate(Kolon)


基本


welcome.html.tx を呼び出した際に、wrapper.txでラップする。



# welcome.html.tx
<p>xslate render this</p>




# wrapper.tx
<!DOCTYPE html>
<html>
<head></head>
<body>
</body>
</html>



継承


wrapper.txを別テンプレートを利用して組み立てる。



<!DOCTYPE html>
<html>
<body>
</body>
</html>




# head.tx
<head>
<meta hoge />
</head>



でも、この場合は継承する必要もなかったから
: include inc::head で読み込むだけでいいか。


todo


今のままだと全部のファイルに
: cascade inc::wrapper # template/inc/wrapper.tx
: around main -> {
: }
を書かないといけないんだけど、どうやるんだろう。。。





2011年7月16日土曜日

一時ファイル作成



File::Temp使わんでも、my $fh = IO::File->new_tempfileで良かったんや。





Archive::Zipにzipデータを渡す場合、IO::Stringで。



IO::Scalarだと_isSeekableでシークできないと言われるので、



my $zip = Archive::Zip->new();
my $fh = IO::String->new($zip_data);
$zip->readFromFileHandle($fh) == AZ_OK or warn 'open error';


な感じで。

docにもちゃんと書いてあって、IO::Scalarは対応する予定はないそうです。





2011年7月5日火曜日

Ubuntuにeasy_install



sudo apt-get install python-setuptools





starmanとMojoliciousこと始め





$cpanm Mojolicious::Lite
$cpanm Server::Starter
$cpanm Net::Server::SS::PreFork
$start_server --port ***.***.***.****:3000 -- starman --workers 32 myapp.pl


myapp.pl



#!/usr/bin/env perl

use Mojolicious::Lite;

get '/' => 'index';
app->start;

__DATA__

@@ index.html.ep
<html><body>foo</body></html>



ok,動いた。portを有効にしておくの忘れないように。未来の僕。
次はnginxでリバースプロシキとText::Xslate継承か。
デーモン化もいるね。





2011年6月28日火曜日

オートページャ



クリックしたら、次へボタンのURLパラメータ更新



// autopager
$('a[rel=next]').click(function() {
var url_param;

$.autopager({
autoLoad: false,
content : '.content'
});
$.autopager('load');

// page数++
url_param = $(this).attr('href').replace(/([&\?])page=(\d+)/, function (match_whole,separator,page_num) {
return separator + 'page=' + ( Number(page_num) + 1 );
});
$(this).attr('href', url_param);

return false;
});





2011年6月27日月曜日

nginx設定 locationブロックの構文



ブロック




    • プロトコルレベル(httpブロック)

    • サーバレベル(serverブロック)

    • URIレベル(locationブロック)




http {
....
server {
.....
location {
.....
}
}
}



locationは入れ子可能だが、 = でマッチさせた場合は無理。^~も?


locationブロックの優先順位 基本


構文

location [=|~|~*|~~|@] pattern { ... }


優先順位

設定ファイルに書く順番関係なく、修飾子よって優先順位が違う。



  1. =(等価。^~と同じで、以降のlocationとマッチしない。)

  2. 修飾子なしでpatternがURIに完全マッチ

  3. ^~(5番の修飾子なし先頭部分マッチと同じだが、最初にマッチしたパスで検索終了)

  4. ~ or ~* (正規表現を使用。大文字小文字の区別ありとなし)

  5. 修飾子なしで、patternがURIに先頭部分マッチ



locationブロックの優先順位 応用


修飾子なしで、同じパターン

エラーになる。



location /hoge/ {}
location /hoge/ {}




同じ正規表現

先に書いたほうが優先



location ~ /hoge/ {} #優先
location ~ /hoge/ {}




修飾子なしで、前方一致

より長く一致したほうが優先



location /ho {}
location /hog {} #優先




異なる修飾子で前方一致

修飾子関係なく、長く一致したほうが優先



location ^~ /ho {} #修飾子としてはこちらが強いが、
location /hog {} #こちらが優先される






pacoインストール



ソースからインストールすると、アンインストールするのが面倒なので、pacoで管理。
(make uninstall できるのは一部だけ)



wget http://sourceforge.net/projects/paco/files/paco/2.0.9/paco-2.0.9.tar.bz2
tar jxf paco-2.0.9.tar.bz2
./configure --disable-gpaco # CUI
make
sudo make install
sudo make logme # paco自身を管理対象に。




あとは、通常 make install するところを



sudo paco -D make install
paco -a # 登録一覧確認
paco -r 名前 #アンインストール。



ちなみに、ファイルの生成などを伴うものをすべて管理できるので、cpanのようなものでインストールする際にも
利用できるようだ。





ubuntu10.04のemacsでWrong number of arguments: called-interactively-p, 1



http://d.hatena.ne.jp/kojimu/20110421/1303334897



sudo add-apt-repository ppa:ubuntu-elisp/ppa
sudo apt-get update
sudo apt-get upgrade





ファイルタイプを判定



スクレイピングしたものの、画像のリンク先が切れていて、ファイル名は画像として取得したのに、
中身は404のHTMLだったとき。(200番が返ってきていた)

File::MMagicで、imageになるかどうかで判定。




2011年6月26日日曜日

nginxインストール



インストール



./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-perl=/usr/bin/perl --prefix=/usr/local/nginx-*.*.*
make
sudo paco -D make install
sudo ln -s /usr/local/nginx-1.0.4 /usr/local/nginx


--userと--groupは設定がないときのみ使用されるデフォルト。
このときのconfigureのオプションは./nginx -V で確認できる。


設定



sudo /usr/local/nginx/conf/nginx.conf
user nobody; # user ユーザネーム グループ に変更。


sudo /usr/local/nginx/sbin/nginx -t
で設定ファイルのチェック。
(本番稼働中に設定ファイルを変更する場合は、-cオプションで別ファイルに設定を作ってからそれをテストする。)


ps aux | grep nginx
でワーカプロセスのユーザネームを確認。問題なければ、アクセスするとWelcome to nginx!が表示されている。


initスクリプト


/etc/init.d/nginxを編集。



DAEMON=/usr/local/nginx/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME



元の雛形にstart-stop-daemonがあったが、使用せずに以下を記述



d_start() {
$DAEMON || echo -n " already running"
}

d_stop() {
$DAEMON -s quit || echo -n " not running"
}
d_reload() {
$DAEMON -s reload || echo -n " not reload"
}


を追加して、case "$1" in の start) stop) restart) などで呼び出す。


$update-rc.d -f nginx defaults
でランレベル遷移の際にスクリプト実行されるようにするが、すでに登録されている。





2011年6月12日日曜日

Crypt::SSLeayをインストール



cpanmでコケタ。
以下の2つと、なければOpenSSLをインストール。
sudo apt-get install libssl-dev
sudo apt-get install libcrypt-ssleay-perl


無事Net::Twitterが入った。





2011年6月11日土曜日

2段ssh tオプション



2段ssh
ssh hostname [command]で、対話シェルに入らずにコマンド結果が返ってくる。

これを応用して、2段ssh。
ssh -t hostname1 hostname2

対話シェルが禁止されてるので、tオプションで擬似tty。





さくらVPSにUbuntu



インストール


さくらVPSのカスタムOSインストールの手順に従って特に問題なくインストール。
ただ、インストール中に放置してたらネットワーク接続切れて失敗したので、席を離れないようにした。


適当にインストール


インストール後、ユーザアカウントでログイン。
(ubuntuはデフォルトではrootのパスが設定されていないので、rootログインはできない。sudoでパスを設定すれば可能。)
update upgreade
screenとemacsとcurl、zsh、build-essential入れる。


sshのport変更


sshのポートを変更した後、以下も変更。
/etc/serviceに登録されているsshのポート番号を変更



$ sudo vi /etc/services
ssh 12345/tcp
ssh 12345/udp


以下のコマンドで何も表示されないのを確認してrestart



$ sudo sshd -t
$ sudo service ssh restart



公開鍵送信


scpで公開鍵を送信。portは-Pで指定。


ファイアーウォール設定


Ubuntuにデフォルトで入っているファイヤーウォールの「ufw」
さくらVPSにカスタムOSのUbuntu 10.04をインストール+セキュリティ設定などをした時のメモ



sudo ufw default deny  #最初に全部禁止
sudo ufw allow port番号
sudo ufw enable
sudo ufw status


ufwは外部からの通信遮断のみ。トロイに感染して、内部からの発信はとめてくれない。




2011年6月8日水曜日

セットアップスクリプトメモ



最近のセットアップスクリプトの書き方

Data::Section::Simpleで__DATA__以下に、ファイルパスと内容(テンプレート)を書いておいて、



mkpath $dir or die "$dir: $!" unless -d $dir;
write_file($path, $content) or die "$path: $!";


とすると。
__DATA__以下で、@@[スペース]を使用してるのは、Data::Section::Simpleの仕様でした。

テンプレートエンジンのヘルパーとか、こうやって書けば楽そう。
bashとかで小難しいことはしたくないので、大体perlで書いてしまいたいですねー。

p.s.
Data::Section::Simpleみてると、scalar callerってやってパッケージ名取得してた。ほむほむ。
あと、fileno。。。。勉強しよう。





2011年6月7日火曜日

s///gとtr///のベンチマーク





use Benchmark qw(:all);

$num = 100000000;
$word = $word2 = '1'x$num;

$results = timethese(1, {
'tr' => sub { $word =~ tr/1/2/ ;},
's' => sub { $word2 =~ s/1/2/g;},
},
'none'
);

cmpthese( $results );


trの圧勝でした。



s/iter s tr
s 19.0 -- -99%
tr 0.120 15767% --



と思ったら、tr///dじゃないからダメだ。
あとで計測しなおす。





特殊変数$^W



警告スイッチに対応して真偽値が入ってるので、
my $hoge = delete $cnf{hoge};
のように引数をdeleteで削り取っているのに、他に余計な引数がある場合かつ、
警告がONのときに、以下が真になります。



if (%cnf && $^W) {
Carp::carp("Unrecognized LWP::UserAgent options: @{[sort keys %cnf]}");
}





引数の明示という観点から残念なコードのリファクタ



残念なコード②を我流で書き直してみた。



sub new {
my $class = shift;
my %par = @_;

my $self;
$self->{ua} = LWP::UserAgent->new(
agent => $par{agent} || 'Mozilla/4.0'
) or return;
$self->{ua}->env_proxy if $par{env_proxy};
$self->{ua}->proxy('http', $par{proxy}) if $par{proxy};
$self->{ua}->timeout($par{timeout}) if $par{timeout};
$self->{host} = $par{host} || 'toolbarqueries.google.com';
bless($self, $class);
}



こんな感じになった。



sub new {
my ($class, $args) = @_;
my $env_proxy = $args->{env_proxy} ? delete $args->{env_proxy} : croak "env_procy is necessary";
my $proxy = $args->{proxy } ? delete $args->{proxy } : croak "procy is necessary";
my $timeout = $args->{timeout } ? delete $args->{timeout } : croak "timeout is necessary";
my $host = $args->{host } ? delete $args->{host } : 'toolbarqueries.google.com';

my $self;
return unless ( $self->{ua} = LWP::UserAgent->new( agent => $par{agent} || 'Mozilla/4.0' ) )
$self->{ua}->env_proxy;
$self->{ua}->proxy('http', $proxy);
$self->{ua}->timeout($timeout);
$self->{host} = $host;

bless $self => $class;
}



使えるならSmart::Args使いたいね。
あ、UserAgentはnewのときに、いっしょに入れてやったほうがいいのかな。



$self->{ua} = LWP::UserAgent->new( agent => $par{agent} || 'Mozilla/4.0',
env_proxy => 1,
timeout => $timeout,
);





use constantの定数を展開



リストコンテキストなので、
print @{ [定数名] }





2011年6月6日月曜日

jQuery風にCSSセレクタで解析



http://d.hatena.ne.jp/tokuhirom/20110221/1298244438

これは便利。
特にHTML::Selector::XPath はXML::XLibを使う際に使用したい。
あ、xmlには使えないか。。。。





EPUB3.0について



スクレイピングメモ。

始まりは META-INF/container.xml から


この中に、opfファイルへのフルパスが記述されている。

content.opf


メインの構成は、
metadata:本のタイトル、著者名、言語、表紙画像など
manifest:本を構成するすべてのファイルを列挙.<item id="", href="", media-type="" >
spine:表示するファイルの順番を記載? idrefでmanifestのid に対応。
guide:目次などに使われる。EPUB3.0で廃止。ただし後方互換のため、作成してもいい。

toc.ncx


目次などを作成する用。
navPoint は章や節を表していて、入れ子構造になっている。
入れ子の深さを表すものが、dtb:depth のはずだが、なぜか1以外見たことがない。
playOrderは、章や節に関係なく、連番になっている。基本的にこれがあれば、ファイル順番は決めれると思うのだが、content.opfのspineタグは何で要るんでしょう。

toc.ncxは、EPUB3.0で廃止。

ただのxmlファイルとして提供するそうです。




XML::Simple



XML::Simple


他のモジュールと比べると速度が劣るが、簡単。


注意点

同じHTMLタグが複数ある場合は、配列になるため、HTMLタグの数が単数か複数かで配列になったりならなかったりする。


対処

new時に、forcearray => 1 とすることで、強制的にすべて配列にできる。
特定のタグだけの場合は配列リファレンスで、指定する。
また、空の配列にアクセスした場合、エラーで落ちるのを防ぐために、何で埋めるかをSupperessEmptyで指定してやる。



my $parser = XML::Simple->new( SuppressEmpty => undef, forcearray => ["spine"]);
my $parsed_xml = $parser->XMLin($xml_file);
print $parsed_xml->{hoge}{bar}[0];





2011年5月23日月曜日

JavaScript The Good Parts 1、2章



1章


とくにないけど、以下の定義はたびたび利用されるので、覚えておく。



Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};


いちいちprototypeって書かなくていいのと、thisを変えすことでメソッドを続けて呼べる(カスケード)がメリット


2章 文法



  • 名前

    • undefined,NaN,Infinityは予約語ではない。



  • 数値

    • jsは数値型が1つ。1と1.0は同じ。

    • NaNは数値を生成できない計算をした場合に得られる。NaNはどんな値ともイコールにならない。NaNとも。isNaN関数を使用すること。

    • 数値はメソッドをもつ



  • 文字列

    • 16bit長

    • プロパティとメソッドをもつ



  • 命令文

    • スコープはグローバルor関数スコープ

    • varを付けると関数内のプライベート変数

    • if文などはブロックを形成しないので、変数の宣言は、関数内の先頭で行う。(関数スコープは存在する)

    • 偽と評価されるもの。以下以外は真。

      • false

      • null

      • undefined

      • 空文字列''

      • 0

      • NaN



    • switchのcaseは式でもいい。case x+y:

    • for in はプロパティ名かキー名を列挙するが、プロトタイプチェーン上のものと区別するために以下のようにする。





for (myvar in obj) {
if (obj.hasOwnProperty(myvar)) {

}
}




    • try{}catch(e){}finally{}

      • try内で例外が投げられると、catchが引数に例外オブジェクトを受け取り、処理。finallyは例外に関わらず必ず実行される。



    • throw:例外を発生させる

      • 例外がtry外で起こった場合、実行を中断して、呼び出し元でtryがあれば処理を移動する。

      • 通常throwにはname,messageプロパティを含ませる。



    • returnと式の間に改行はダメ、breakとラベルの間に改行はダメ。





    • typeofはnumber,string,boolen,undefined,function,objectを返す。

      • null,配列はobjectを返す点に注意。





  • リテラル

    • オブジェクトのプロパティ名はリテラルとして扱われるので、コンパイル時に正体がわからない変数は使用できない。







2011年5月15日日曜日

Perlの文字コード周り



perl - Encode 入門
perl - Encode 中級
perl - use utf8; #って何だ?
Perl で utf8 化けしたときにどうしたらいいか


use utf8って何よ



  • (ASCII領域外の)各文字列にutf-8を示すフラグを付ける。

  • ソースコードがutf-8であること前提

    • エディタでutf-8で書く必要がある。





基本の流れ



  • 入力データの文字コード->utf-8に変換

  • utf-8から元の文字コードに戻して出力




# ecu-jpからutf8に、決め打ちで変換
use Encode.pm
my $utf8 = decode("eucjp", $_); //ecujpをutf-8に変換 フラグも付ける。
print encode("eucjp", $utf8);



変換しないと。。。

・正規表現など、検索がマッチしない。
・utf-8とそうでない文字列を結合すると、文字列全体がutf-8扱いになるので、文字化けする。


decodeとencodeの覚え方


perl側から見て、バイト列に符号化(encode)するか、perlの内部表現に復元(decode)するか


入力コードを判定して変換


Encode::Guess
suspects(容疑者)に、変換候補を書いておく(完璧に判定するのは不可能なため?)



use Encode::Guess;
Encode::Guess->set_suspects(qw/euc-jp shiftjis 7bit-jis/);




変換元コード決め打ち&頻繁に変換 => find_encoding


以下の'eucjp'など、名前判定しなくていいので高速。
(encode,decodeは内部でfind_encodingを使用している)



# 変換元コード決め打ち&頻繁に変換
use Encode.pm
my $eucjp = find_encoding('eucjp');
my $utf8 = $eucjp->decode($_);
print $eucjp->encode($utf8);



ファイルを開く際に文字コード指定(変換元コード決め打ち)



#use Encode.pm <- :encodingはPerlIO機能なのでいらない
open my $fh, "<:encoding(eucjp)", $argv or die "$argv : $!";




utf-8 フラグの確認



use Devel::Peek;
Dump($x);


SV~LENまでが一塊。
FLAGSにUTF8があるかどうかで判断。


エラー処理


エンコードに失敗した場合、encode,decodeの第3引数でエラー処理を実施できる。

以下の定数は変換できなかった場合、実体参照にする。



Encode::FB_HTMLCREF #10進数
Encode::FB_XMLCREF #16進数
Encode::FB_PERLQQ  #perl表記 \x{ }


サブルーチン(クロージャ)を渡すことも可能



EUC-JPやShift_JISで扱えない文字も、HTMLやXMLではCharacter Reference (文字参照;CREF)という方法で表記することが可能です。例えば、☺は&#9786;または&#x263A ;と表記すればいいのです。前者はその文字のUnicodeを10進数表記、後者は16進表記したものです。




エラーメッセージ


  • Wide character in print at ...

  • UTF8フラグが付いているのをprintしているので、encode('utf8', $text);



OOP


Encode::Encoder


ルール追加



  • 動的: Encode::Encoding

  • 静的: enc2xs



ちなみに


\x{3000} は全角空白