OmniAICreator/Qiita-1.07M huggingface dataset:
hubot irc を使うHow To

hubot-ircを使うまでのかんたんHowTo.

### hubotとhubot-ircのインストール

環境の想定はdebian. nvm インストール済みでv0.6.9のnodeをinstallした状態を想定。

    % npm install hubot
    % npm install optparse

optparseはなぜか自動で入らなかったので入れた。
hubotを入れたらとりあえず、コマンドにパスを通す。

    % export PATH="~/node_modules/.bin:$PATH"
    % npm install hubot-irc

### 起動する

次に、起動時のパス解決のための処理をしておく。
hubotは起動時のscript用ディレクトリのパス解決が割と残念で、hubotコマンドを書き換えるか起動ディレクトリを適切な場所に移動しておくかする必要がある。
書き換えるのはscriptとadapterと色路やらなくちゃ行けなくて割と面倒なので、移動する。

    % cd %HOME/node_modules/hubot

ここで起動。hubotの設定項目は、環境変数として与える。

    % HUBOT_IRC_NICK=hubooot HUBOT_IRC_SERVER=irc.example.com HUBOT_IRC_ROOMS=#room HUBOT_IRC_PASSWORD=pass hubot -a irc

これで起動できる。

### option: hubot-scriptsを使う

hubot-scriptsは普通にnpm installしても利用できない。
自分で$HOME/node_modules/hubot/node_modulesの中に https://github.com/github/hubot-scripts の中身をcloneし、起動ディレクトリでhubot-scripts.jsonを作って

    [
        "bing.coffee"
    ]

みたいに、起動したいscriptを指定すれば、利用できるようになる。
アプリエンジニア向け：「サーバがなんか重い」時にすること

アプリケーションエンジニアの人には「なんか重い」という状況に遭遇したらインフラの人にタスクを投げる、という人もいるかも知れません。けど、その重さのどこに原因があるのか。CPUか、ネットワークか、IOかくらいの診断はできた方がアプリ開発においても有益です。

「せっかくつくったシステムがなんか重い」

そんな時にアプリケーションエンジニアとしてできることを書きます。

本職のインフラの人にはぬるい内容だと思います。何を隠そう僕自身がアプリ寄りの人間なので、突っ込んだ話はできないのです。あしからずご了承ください。

# なんかサーバが重いなー

## まずはロードアベレージを調べる

サーバが重いと思ったら、まず真っ先にすべきことは対象ホストにSSH接続してロードアベレージを調べることでしょう。ロードアベレージとは **実行されずに待たされているプロセスの数** のことで、多すぎるとやばいと認識しておきましょう。ロードアベレージだけでは何が原因で重くなっているのか判断することはできないけれど、検査のとっかかりとして行います。

ロードアベレージがどれくらいの数値がヤバいのかは、CPUのコアの数とかに依存する（らしい）もので、一概に「Xを超えていたらまずい」と言い切ることができません。なので、日頃からロードアベレージをちょくちょく確認し「あれ、いつもよりロードアベレージ高いな」と言えるようになることが重要なのだろうと思います。

- 使うコマンド: top、uptime

topはロードアベレージの他にも今走ってるプロセスを占有してるメモリ量とかでソートしたり色々できる便利コマンドです。uptimeはほぼロードアベレージだけを表示してくれるコマンドです。

topの方やれることが多いので普段はこちらを使えばいいですが、本当に切迫しているサーバ上だと、topの実行すらままならないという状況もあり得るので、uptimeの存在も頭の片隅においておくべきでしょう。

top使うと右上にload averageに続いて小数が3つ表示されます。これがロードアベレージで、左から過去１分５分１５分の間の数値を表しています。強いていうなら **1分と5分のやつだけ高かったら、最近始めたプロセスが原因だと推測できる** というくらい。

### ロードアベレージが低かった場合

ロードアベレージが低いのに重い、ということは原因は外部にあうことが疑われます。ネットワークの問題や、リモートホスト（例えばWebサーバとDBサーバが別ホストにあって、Webサーバのロードアベレージが低いなら、DBサーバを疑ってみるみたいな）に原因がある可能性があります。なのでサーバのネットワークIOの様子を見てみるといいでしょう。

- 使うコマンド: dstat、netstat

dstatとnetstatは両方statで終わってますが、実は他にもvmstat、iostat、ifstatなんかもあります。このdstatというのは、これら乱立したXXXstatコマンドをひとまとめにし、かつ、使いやすくしよう、という目的で作られた後発ツールです。なので、使うならdstatがいいと思います。

例えば `dstat --tcp` とやるとTCPコネクションの様子を見たり `dstat --net` とやるとネットワークの様子を見ることができますが、、、はっきり言ってアプリの人間には意味不明だと思いますので、調べても分からない場合は素直にインフラに強い人に尋ねましょう。

### ロードアベレージが高かった場合

この場合はホストの中に問題があると想像できます。続いてCPUとIOのどちらに原因があるか探ります。

## CPU使用率とIO待ち状態を調べる

- 使うコマンド: sar、dstat、vmstat

`sar -u` や `dstat -a` などを実行します。sarの場合で話をすると、見るべきは `%user` `%system` `%iowait` の項目です。

### %userが高い場合

ユーザプログラムがボトルネックになっていると考えられます。どのプログラムに原因があるか調べましょう。

- 使うコマンド: top、dstat、pidstat

`top` はプロセスの一覧をCPU使用率やメモリ占有率などでソートする機能があります。例えば`top`を実行してからおもむろに `m` と打つとメモリ順でソートしてくれます。`dstat --top-cpu` とすることで最もCPUを使っているプロセスを表示することもできます。

`pidstat` は特定のプロセスの統計情報を調べるのに使います。問題のプロセスがある程度しぼれたら `pidstat -u -p PID,PID,PID` をします。PIDには怪しいプロセスのPIDを入れます。-u はCPU使用率を表示するオプションです。

ここで、CPUに負荷がかかっているのは、ディスクI/Oやメモリなどが適切に働いているか、プログラムが暴走しているかのどちらかです。後者の場合は完全にアプリケーションエンジニアのデバッグの仕事です。前者かつスループットが上がらない、という場合は、アプリケーションエンジニアとしてはアルゴリズムの改善などで対処できますが、インフラの人とサーバの増設などを検討することも必要かも知れません。前者でかつスループットが高い状態というのは、リソースを余すことなく使えているということなので、むしろ理想的な状態であるといえますが、将来的にリソースが足りなくなる可能性が高いので、早めにリソース増強の算段を建てたほうがいいかも知れません。

### %systemが高い場合

これはカーネル空間の処理に時間を取られていることを意味します。この場合に考えられるのは、I/O待ちでCPU時間を消費しているか、大きいプロセスをforkしまくっている等（らしい）です。なので %system が高い場合 %iowait が高い場合も多いようです。

この場合はI/O待ち状態のプロセスを探します

- 使うコマンド: top、dstat

`dstat --top-bio` で最もブロックI/Oをしているプロセスが、`dstat --top-io`で最もI/Oをしているプロセスが表示されます。

### %user も %system も低いのに %iowait が高い場合

何かのプロセスでスワップが発生している可能性があります。

- 使うコマンド: top、free、sar、dstat、vmstat

`sar -W` や `dstat --swap` はスワップインとスワップアウトの状況、`free` はシステム全体のメモリ使用状況が調べらることができます。`top` でメモリ使用量でソートすればメモリを沢山使っているプロセスを発見することができます。

スワップが確認された場合、アプリケーションエンジニアとしてはメモリリークがないか調べ、問題箇所を修正することで対処できます。そうでない場合は、純粋に搭載メモリが足りていないのでメモリの増設などを検討しましょう。

## まとめ

- 問題があったらまずはロードアベレージを調べましょう
- ロードアベレージが低い場合は、外部に問題がある可能性があります。
- ロードアベレージが高い場合は、内部に問題がある可能性があります。CPU、IOのどこに問題があるのか調べましょう。
- `dstat` 便利です
zshでワイルドカードをその場で展開する

`rm -f tmp/*` などでカーソルが末尾にある状態で^Dを押すとワイルドカードが下に展開されて確認できるようになります。

```sh
function _delete-char-or-list-expand() {
    if [[ -z "${RBUFFER}" ]]; then
        zle list-expand
    else   
        zle delete-char
    fi
}
zle -N _delete-char-or-list-expand
bindkey '^D' _delete-char-or-list-expand
```
末尾でないときは普通に1文字削除されます。
あるコレクションの要素がすべてあるクラスを継承 or モジュールをmix-inしているかを検証するmatcher

```ruby
RSpec::Matcher.define :be_composed_of do |expected|
  match do |actual|
    actual.all? {|e| expected === e }
  end
end
```

failure_messages とかいじってないけどとりあえず。

should(be_all {|i| String === i }) とか書いてたけどいい加減ダサいしつらくなってきたのでmatcherを追加。
ffmpegで動画から静止画を抜き出す

1)動画を再生して抜き出す始点と終点の時間を確認．

2)ffmpeg で静止画に抜き出し

> $ ffmpeg -i 元動画.avi -ss 144 -t 148 -r 24 -f image2 %06d.jpg

-i 元動画.avi : 元動画
-ss 144 : 抜き出し始点(秒)
-t 148 : 抜き出し終点(秒)
-r 24 : 1秒あたり何枚抜き出すか
-f image2 %06d.jpg : jpeg で[000001.jpg]から連番で書き出し

以前とオプションが変わっているようなのでメモ

> ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers
Imagemagick のconvert で複数のイメージをpdf に

画像を一つづつ指定したり

>$ convert 001.png 002.png 003.png all.pdf

ワイルドカード指定したり

>$ convert *.png all.pdf

もちろん他の画像形式でもok

スクリーンショットを送るのに便利な気がしてる
Haskellの関数の適用や合成をどうイメージしていますか？

プログラミングHaskellなどを読んで、小さなコードは頭では分かるようになったのですが、大きなコードを読んだり自分で設計する際に、どのように関数の適用や合成などをイメージしたり図として表したらいいか分からず悩んでおります。

具体的には、f(x,y,z) = z*(x+y) という関数が表現したい場合、

```sample.hs
(*) :: Num a => a->a->a
(+) :: Num a => a->a->a
f1 x y z = z * (x + y)
f2 x y = (*) $ (+) x y
f3 x = (*) . (+) x
```

のf1〜f3ような関数の書き方があると思います。また、次のような書き方は意図しない結果になっているのですが、

```sample.h
g1 = (*) (+)
 -- :: (Num a, Num (a -> a -> a)) => (a -> a -> a) -> a -> a -> a
g2 x = (*) $ (+) x
 -- :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a
g3 = (*) . (+)
 -- No instance for (Num (a0 -> a0))
 --   arising from a use of `*'
```

これらの違いを考えるために、関数を何かイメージしたいと思っています。もちろん、型の情報や式を追えば明らかなのですが、もしイメージで理解できればわかりやすくなるのかなと勝手ながら期待しています。

そこで、普段みなさんはどのようにイメージしているのか、もし良いイメージの仕方や表記方法があれば教えてください。それは慣れの問題で、本物のHaskellerにはイメージなんか必要ないというのであればそれでも構いません。（慣れるようがんばります）

参考文献は論文でも英語でも構いません。できれば、無料でアクセスできる方が助かります。
AndroidでAudioTrackを使ってPCMファイルを鳴らす。 


assetsフォルダに置いた16Bit StereoのリニアPCMファイルを鳴らすコード的なもの。

    class PlayThread extends Thread {
        byte[] pcmData;
        AudioTrack audioTrack;
        float maxVolume ;
        float minVolume;
        PlayThread(String filename) {
            setPcmData(filename);
            makeAudioTrack();
            maxVolume = AudioTrack.getMaxVolume();
            minVolume = AudioTrack.getMinVolume();
        }
        public void run() {
            if (audioTrack != null) {
                int result= audioTrack.setLoopPoints(0, pcmData.length/4, -1);
                if (result != AudioTrack.SUCCESS) {
                    System.out.println("result="+result+"pcmData.length="+ pcmData.length);
                }
                audioTrack.write(pcmData, 0, pcmData.length);
                audioTrack.play();
            }

        }
        void makeAudioTrack() {

            audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                    44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT, pcmData.length,
                    AudioTrack.MODE_STATIC);
        }

        void playStop() {
            if (audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
                audioTrack.stop();
                audioTrack.release();
            }
        }
        void setStereoVolume(int left,int right) {
            float leftF = minVolume+(maxVolume-minVolume)*left/100;
            float rightF = minVolume+(maxVolume-minVolume)*right/100;
            audioTrack.setStereoVolume(leftF, rightF);
        }
        void setPcmData(String s) {
            AssetManager as = getResources().getAssets();
            AssetFileDescriptor afd = null;

            try {
                afd = as.openFd (s);
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (afd != null) {
                pcmData = new byte[(int)afd.getLength()];
                InputStream is = null;
                try {
                    is = afd.createInputStream();
                    is.read(pcmData);
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    IOUtils.closeQuietly(is);
                }
            }else {

                finish();
            }
        }
    }
}
Node プログラムを Windows 実行形式 (.exe) でパッキング

あとでブログ記事に起こすためのメモ変わり。

こういうのパッキングっていうのかな。Node に解釈させる向けに書いた .js なプログラムを、.exe にするような感じ。

実行環境に Node がなくても大丈夫？（要検証）

### これを exe 化する

```js
console.log('foo');
```

### github からソースコード取得

msysgit とか Cygwin のとか jgit とかつかう。

```sh
> git clone https://github.com/joyent/node.git c:\node
```

### 配置や設定

コマンドプロンプトとか。

```sh
> cd c:\node
> copy <js までのパス>\foo.js lib\_third_party_main.js
> start node.gyp
  # LF 改行コードを解決してくれるエディタで開く
> type node.gyp
    'library_files': [
      'src/node.js',
      'lib/_debugger.js',
      'lib/_linklist.js',
      'lib/_third_party_main.js',  # ← この行追加!!
      'lib/assert.js',
 ...
> 
```

### ビルド

以下は Visual Studio コマンド プロンプトで実行する

```sh
> vcbuild.bat release nosign
 # 警告たくさん出るけどムシムシ
> Release\node.exe
foo
> 
```

おわり。しかしファイルデカい。
Facebook の API に何かあったときに IRC で通知すると便利じゃないかと思いまして

Qiita が頑張っているので僕も頑張ろうとおもいました。


まずは `log.sqlite` とかに DB つくりますよ。

```sql:install.sql
CREATE TABLE IF NOT EXISTS log (
  current TEXT,
  push TEXT,
  created_at DATETIME
);
```


で、こんなスクリプトを cron とかで動かしますよ。
勢いで書いたから美しくないけど、許してください。

```php:fbhealth.php
<?php
require_once 'Net/Socket/Tiarra.php';

$api_uri       = 'http://www.facebook.com/feeds/api_status.php';
$db            = __DIR__ . '/log.sqlite';
$pdo           = new PDO("sqlite:$db");
$tiarra_socket = 'riaf';
$irc_channel   = '#nequal@freenode';

$last_row = $pdo->query('SELECT * FROM log ORDER BY created_at DESC')->fetch(PDO::FETCH_ASSOC);

if ($last_row) {
    $last = array(
        'current'    => json_decode($last_row['current'], true),
        'push'       => json_decode($last_row['push'], true),
        'created_at' => new DateTime($last_row['created_at']),
    );
} else {
    $last = null;
}

$now = new DateTime;
$response = json_decode(file_get_contents($api_uri), true);

try {
    if (!isset($response['current'])) {
        throw new Exception('`current` is not found');
    }

    if (!isset($response['push'])) {
        throw new Exception('`push` is not found');
    }

    if ($last) {
        if ($last['current']['health'] != $response['current']['health']) {
            $tiarra = new Net_Socket_Tiarra($tiarra_socket);
            $tiarra->message($irc_channel, sprintf('10Facebook Status: %s (%s)', $response['current']['subject'], $response['current']['health']));
        }
    }

    if (is_null($last) || $last['current']['health'] != $response['current']['health'] || $last['push']['id'] != $response['push']['id']) {
        $insert = $pdo->prepare('INSERT INTO `log` (current, push, created_at) VALUES (:current, :push, :created_at);');
        $insert->execute(array(
            'current'    => json_encode($response['current']),
            'push'       => json_encode($response['push']),
            'created_at' => $now->format('Y-m-d H:i:s'),
        ));
    }
} catch (Exception $e) {
    echo $e->getMessage(), PHP_EOL;
}
```

`Net_Socket_Tiarra` が必要なので、入ってない人は

```sh
pear channel-discover openpear.org
pear install Net_Socket_Tiarra 
```

とかで入ると思うよ！
Conduit の join

ResourceT m (Source m a) -> Source m a
なる関数が書けてしまったのですが、これは正しいのでしょうか？
一応ちょっと使った感じ動作しているようには見えるのですが…。

~~~ {haskell}
import qualified Data.Conduit as C
import qualified Data.Conduit.List as CL

join :: C.ResourceIO m => C.ResourceT m (C.Source m a) -> C.Source m a
join m = C.Source (C.Open <$> n <*> pure []) (return ()) C.$= CL.concatMap id
  where
    n = fmap (\a -> [a]) <$> m
~~~
固定ページの記事部分を出力する

```.php
<?php
     $posts = get_posts('numberposts=1&category=3');
     global $post;
?>
<?php if($posts): foreach($posts as $post): setup_postdata($post); ?>
<div>
<?php
$page_id = 208;
$mes = get_page($page_id);
echo $mes->post_content;
?>
</div>
<?php endforeach; endif; ?>
```
カテゴリでプロパティを追加する

    #include <objc/runtime.h>
    
    @interface NSObject (AddProperty)
    @property (copy) NSString *string;
    @end
    
    @implementation NSObject(AddProperty)
    - (NSString *)string
    {
        id result = objc_getAssociatedObject(self, @"string");
        return [[result copy] autorelease];
    }
    - (void)setString:(NSString *)string
    {
        objc_setAssociatedObject(self, @"string", string, OBJC_ASSOCIATION_COPY);
    }
    @end
MacPortsでインストールしたnginxのimage_filterを有効にする

Webサービスで画像をカコイイ感じにリサイズ＆クロップしたいなぁと色々調べていたら
こちらの記事でnginx+image_filterが良い感じに紹介されていました。

[cloudrop / 簡単！リアルタイム画像変換をNginxだけで行う方法](http://cloudrop.jp/labs/nginx_image_filter)


nginx標準ではimage_filterが無効になっていて、有効にするには再ビルドが必要とのことでしたので
MacPortsでインストールするnginxのimage_filterを有効化する方法を調べてみました。

1. GD2 (libgd) のインストールする

```bash:terminal
> sudo port install gd2
```

2. MacPorts/nginxのビルド設定にimage_filterを有効化するためのオプションを追記

```bash:terminal
> sudo port edit nginx
```

```bash:
variant image description {Enable image_filter} {
    configure.args-append   --with-http_image_filter_module
}
```

3. MacPortsでnginxをインストール

```bash:terminal
> sudo port install nginx +image +ssl
```

これで上手くいきました！
公式でアンドキュメントな挙動

byでイテレーションをスキップ
coffee> console.log number for number in [0..100] by 10 
0
10
20
30
40
50
60
70
80
90
100

whenで条件を絞る
coffee> console.log number for number in [1..10] when number > 5
6
7
8
9
10

Arrayの列挙の二番目の引数はインデックス
coffee> console.log a,b for a,b in ([1..10])
1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
10 9
Windows環境のTclで、簡単にアプリを起動する方法

eval, exec のエスケープで悩むより、バッチファイルを作成して実行した方が楽な事が多い。
Excelでbook1.xlsを開く例

```tcl:run_excel.tcl
set fp [open "run.bat" w]
puts $fp "book1.xls"
close $fp

exec run.bat &
```
cybernekoを使ってなるべく原型を留めてHTMLをDOMにパースするときのメモ 

大文字小文字なども原型を留めたい場合は色々設定が必要。

```java:html2dom.java
// DOMパーサーはxercesを使う
DOMParser parser = new DOMParser(new HTMLConfiguration());
parser.setFeature("http://cyberneko.org/html/features/balance-tags", false);
parser.setFeature("http://cyberneko.org/html/features/balance-tags/document-fragment", true);				parser.setFeature("http://cyberneko.org/html/features/balance-tags/ignore-outside-content", true);parser.setFeature("http://cyberneko.org/html/features/scanner/notify-builtin-refs", true);
parser.setProperty("http://cyberneko.org/html/properties/names/elems", "match");
parser.setProperty("http://cyberneko.org/html/properties/names/attrs", "no-change");
parser.setProperty("http://cyberneko.org/html/properties/default-encoding",	"UTF-8");
parser.parse(new InputSource(new StringReader(layout)));
Document doc = parser.getDocument();
```
iTerm2で特定文字列をハイライトやGrowl通知する

ログを見ているときなどに目で全部追うのはつらい．そこで特定の文字列が出たときにハイライトしたり何かアクションを行わせるという設定がiTerm2にある．(バージョン：Build 1.0.0.20120123)

# 設定方法
![](https://img.skitch.com/20120201-d145txurg57fmtim2hg9pemmkg.png)


iTerm2の設定画面で，Profiles->Advanced->TriggersのEditボタンを押すとTrigger登録画面が出る．
「正規表現」と「それにマッチする文字列がターミナルに印字されたときのアクション」を登録できるので，`Send Growl Alert`や`Run Command`など好きなものを登録する．
登録した後はechoコマンドでチェックすればよい．例えば"Error"という文字列を登録したなら`echo "Error"`とすればtriggerされるはず．
Growlだけではなくて特定文字列のHighlightなんかも便利．
Amazon Product Advertising API で複数の Search Index から検索を行う

``` [オペレーション名].[番号].[パラメータ]= [値] ```
で複数のリクエストを送れる
``` [オペレーション名].Shared.[パラメータ]= [値] ```
で共通の値を設定出来る

和書と洋書から検索を行う例

``` url:request
Operation=ItemSearch
&ItemSearch.1.SearchIndex=Books
&ItemSearch.2.SearchIndex=ForeignBooks
&ItemSearch.Shared.Keywords=[KEYWORD]
&ItemSearch.Shared.ResponseGroup=Medium
```

[Batch Request](http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/BatchRequests.html)って言うらしい
FacebookOAuth で Publish Action 出来るように拡張する

RailsでGemsを拡張する勉強がてらにとりあえずで
- Rails 3.0.3 
- FacebookOAuth 0.2.2

使い方 ```client.me.action namespace, type, { :[ACTION] => url }``` 

```ruby:config/initializers/facebook_oauth.rb
FacebookOAuth::FacebookObject.class_eval do
  def method_missing(method, *args)
    if method.to_s == 'action'
      namespace = args.shift
      type = args.shift
      params = args.first || {}
      raise ArgumentError if namespace.nil?
      raise ArgumentError if type.nil? 
      @client.send(:_post, "/#{@oid}/#{namespace}:#{type}", params)
      return
    end

    first = args.shift
    params = args.first || {}
    if first and first == :create
      @client.send(:_post, "/#{@oid}/#{method.to_s}", params)
    else
      @client.send(:_get, "/#{@oid}/#{method.to_s}")
    end
  end
end
```
RSpecでスタブを使う場所はbefore(:each)

RSpecでスタブを使う場所はbefore(:each)

```ruby:spec/controllers/articles_controller_spec.rb
before :each do
  time_now = Time.local(2012,1,30,18,0,0) 
  Time.stub!(:now).and_return(time_now)
end
```

この書き方だと問題なく通るが、

```ruby:spec/controllers/articles_controller_spec.rb
before :all do
  time_now = Time.local(2012,1,30,18,0,0) 
  Time.stub!(:now).and_return(time_now)
end
```

とした場合は次のように怒られる。

```ruby
undefined method `stub!' for Time:Class 
```
ActiveRecordでテーブルのあるカラムが存在しないかのように扱いたい

```ruby
render :json => @hoge
```

みたいに出力したときに、DBのあるカラムがテーブルに存在しないかのように出力するにはどうすればいいんだろうか？
to_jsonを上書きするような大げさなものではなくて、attr_accessor みたいな感じで書きたいのだが。
mongooseでMapReduceを使う

色々調べてみると下記の方法で良いみたいです。

参考にさせて頂いたサイト様

- [joker1007の日記](http://d.hatena.ne.jp/joker1007/20110824/1314197437)

```javascript
var map = function() {
    if (!this.tags || this.contributor != '__USERID__') { return; }
    for (index in this.tags) {
        emit(this.tags[index], 1);
    }
};
var reduce = function(previous, current) {
    var count = 0;
    for (index in current) {
        count += current[index];
    }
    return count;
};

map = map.toString().replace('__USERID__', userId); // mapに変数を渡す方法がわからないので、文字列に強引に埋め込んでいます。イケテナイ。
reduce = reduce.toString();

db.model('Item').collection.mapReduce(map, reduce, {out: {inline: 1}}, function(err, val) {
    console.log(err);
    console.log(val);
});
```
class構文でprivateなメソッドを定義する

```coffeescript
class Hoge
  private_ = ->
    console.log 'private'

  public_: ->
    private_.call(@)
```

`private_`はそのまま呼び出すのではなく`call`や`apply`を使わないとprivateメソッドぽくならない。
コンパイルすると

```javascript
var Hoge, hoge;

Hoge = (function() {
  var private_;

  function Hoge() {}

  private_ = function() {
    return console.log('private');
  };

  Hoge.prototype.public_ = function() {
    return private_.call(this);
  };

  return Hoge;
})();
```
PHPのクロージャーで、呼び出し元の変数を使う

PHPのarray関連の関数でクロージャーを使う場合の話。

例えば、ある関数に引数を渡して、その引数の値以上の結果を返す場合。

```php
//NG
function filterResultsNG($threshold) {
    $all = array(2,0,-1,3,4,-5);
    return array_filter($all, function($v) {
                return $v >= $threshold;
            });
}

//useを使うとOK
function filterResults($threshold) {
    $all = array(2,0,-1,3,4,-5);
    return array_filter($all, function($v) use ($threshold) {
                return $v >= $threshold;
            });
}
```
PadrinoでActiveRecord::Migrationで外部キー制約を追加するforeignerを使う

ActiveRecordで外部キー制約を追加するためのプラグインは種々あるみたいですが、[foreigner](https://github.com/matthuhiggins/foreigner)が3.0系にも対応してて、(たぶん) 一番新しい + 開発されている様子がある。

Padrinoで使うにはちょっとしたセットアップが必要だったのでメモ。

```ruby:config/boot.rb
##
# Add your after load hooks here
#
Padrino.after_load do
  ActiveSupport.on_load :active_record do
    ActiveRecord::ConnectionAdapters.module_eval do
      include Foreigner::ConnectionAdapters::SchemaStatements
      include Foreigner::ConnectionAdapters::SchemaDefinitions
    end

    ActiveRecord::SchemaDumper.module_eval do
      include Foreigner::SchemaDumper
    end

    ActiveRecord::Migration::CommandRecorder.module_eval do
      include Foreigner::Migration::CommandRecorder
    end if defined?(ActiveRecord::Migration::CommandRecorder)

    Foreigner::Adapter.load!
  end
end
```
ホワイトスペースと半角記号にマッチする正規表現

```php
<?php

$symbols = '[\s\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]';

for ( $i = 0; $i < 128; $i ++ )
{
	$chr = chr($i);
	echo sprintf('%03d', $i), ' ', $chr, ' ', preg_match("/$symbols/", $chr) ,PHP_EOL;
}
```

### 実行結果

```txt
000  0
001  0
002  0
003  0
004  0
005  0
006  0
007  0
008 0
009 	 1
010 
 1
011 
     0
012 
     1
 13 
014  0
015  0
016  0
017  0
018  0
019  0
020  0
021  0
022  0
023  0
024  0
025  0
026  0
027 0
028  0
029  0
030  0
031  0
032   1
033 ! 1
034 " 1
035 # 1
036 $ 1
037 % 1
038 & 1
039 ' 1
040 ( 1
041 ) 1
042 * 1
043 + 1
044 , 1
045 - 1
046 . 1
047 / 1
048 0 0
049 1 0
050 2 0
051 3 0
052 4 0
053 5 0
054 6 0
055 7 0
056 8 0
057 9 0
058 : 1
059 ; 1
060 < 1
061 = 1
062 > 1
063 ? 1
064 @ 1
065 A 0
066 B 0
067 C 0
068 D 0
069 E 0
070 F 0
071 G 0
072 H 0
073 I 0
074 J 0
075 K 0
076 L 0
077 M 0
078 N 0
079 O 0
080 P 0
081 Q 0
082 R 0
083 S 0
084 T 0
085 U 0
086 V 0
087 W 0
088 X 0
089 Y 0
090 Z 0
091 [ 1
092 \ 1
093 ] 1
094 ^ 1
095 _ 1
096 ` 1
097 a 0
098 b 0
099 c 0
100 d 0
101 e 0
102 f 0
103 g 0
104 h 0
105 i 0
106 j 0
107 k 0
108 l 0
109 m 0
110 n 0
111 o 0
112 p 0
113 q 0
114 r 0
115 s 0
116 t 0
117 u 0
118 v 0
119 w 0
120 x 0
121 y 0
122 z 0
123 { 1
124 | 1
125 } 1
126 ~ 1
127  0
```
Redisのリストに登録された10件の値のうち後ろから5件以外削除する

```
redis 127.0.0.1:6379> rpush foo 1
(integer) 1
redis 127.0.0.1:6379> rpush foo 2
(integer) 2
redis 127.0.0.1:6379> rpush foo 3
(integer) 3
redis 127.0.0.1:6379> rpush foo 4
(integer) 4
redis 127.0.0.1:6379> rpush foo 5
(integer) 5
redis 127.0.0.1:6379> rpush foo 6
(integer) 6
redis 127.0.0.1:6379> rpush foo 7
(integer) 7
redis 127.0.0.1:6379> rpush foo 8
(integer) 8
redis 127.0.0.1:6379> rpush foo 9
(integer) 9
redis 127.0.0.1:6379> rpush foo 10
(integer) 10
redis 127.0.0.1:6379> lrange foo 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
redis 127.0.0.1:6379> ltrim foo -5 -1
OK
redis 127.0.0.1:6379> lrange foo 0 -1
1) "6"
2) "7"
3) "8"
4) "9"
5) "10"
redis 127.0.0.1:6379> 
```

一般化すると ```ltrim {キー名} -{残したい件数} -1```
Rubyのモジュール内でextend self

[defunkt/gist](https://github.com/defunkt/gist)を読んでいたら，gist.rbに以下の記述を見つけた．

```ruby:gist.rb
module Gist
  extend self
# ...
  def write(files, private_gist = false, description = nil)
# ...
end
```

`extend self`でのレシーバーは`Gist`なので，`Gist`モジュールの特異クラス(`Gist`クラス)に，`self`で定義されているメソッド(つまり`extend self`以降で定義している`Gist`モジュールのメソッド．上記の`write`など)を定義するということみたい．
結果`Gist.write`のように呼び出すことが出来るようになる．
mavenがec2(amazon linux)で解凍できない

解決策をご存知の方ご教授ください。
wgetしてtarで解凍しようとして失敗しました。
ちなみに、scalaのtarファイルは通常通り解凍できました。
参考にしたページは下記の2つです。
http://www.linuxforums.org/forum/ubuntu-linux/173584-maven2-installation-problem.html
http://goo.gl/JJa8R
下記エラー内容です。

```
$wget http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.tar.gz

$tar xvaf apache-maven-2.2.1-bin.tar.gz 

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

$ gunzip -c apache-maven-2.2.1-bin.tar.gz | tar -xvf -

gzip: apache-maven-2.2.1-bin.tar.gz: not in gzip format
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors
Git hooks まとめ

他のバージョン管理システムと同様 git にも hook が色々存在しますが、役割を適用順に一覧にしたサイトが見当たらなかったので自分用にここに書いておこうと思います。

細かいことはは[公式ドキュメント](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)を見てください。
また各々の hook script の書き方自体は、手元の環境の `.git/hooks/*.sample` を参考にしてください。



# commit関係

見ての通り、コマンドを実行してからの流れ順に書きます。

1. `git commit`
2. **pre-commit**  
   　commit前に起動しコードをチェックするなどで使う。  
   　0以外を返すとcommit中止。`--no-verify`で無視。
3. **prepare-commit-msg**  
   　commit時のデフォルトメッセージ編集用。
4. `エディタが起動し commit msg の入力`
5. **commit-msg**  
   　commit msg が既定のフォーマットに沿っているかなど確認する為に使う。  
   　0以外を返すとcommit中止。`--no-verify`で無視。
6. `実際にcommitが実行される`
7. **post-commit**
   　commit後の通知や自動処理に使う

# Eメールワークフロー関係

「Eメールワークフロー」＝「gitを使ってpatchのやりとり」です。
私自身はこの機能を使ったことがないため、コマンドの使い方などは間違っている可能性があります。

1. `git am foobar.patch`
2. **applypatch-msg**  
   　patch中の commit msg のチェック用。0以外を返すと中止。
3. `一時的にpatchを適用（commitはまだ）`
4. **pre-applypatch**  
   　patchが適用された物が正常動作するかどうかなどの受け入れテスト用。  
   　0以外を返すと適用中止。
5. `patchを正式に受け入れcommit`
6. **post-applypatch**  
   　apply 後の通知や自動処理に使う


# [rebase](http://d.hatena.ne.jp/Seasons/20090329/1238351273) / merge関係

こちらはシンプルなので説明だけ

- **pre-rebase**  
  　rebase する前にチェックして rebase を中断させるなどで使う。  
  　0以外を返すとrebase中止。
- **post-rebase**  
  　事後の告知とか自動実行とか。
- **post-merge**  
  　同じく merge 版の事後の告知とか自動実行とか。こちらはpreはない。


# サーバサイドフック

外部から push されたときに動くスクリプトです

1. `git push your_server master`
2. **pre-receive**  
   　push を受けた際の最初に実行される。主に受け入れテスト用。  
   　0以外を返すと受け入れ中止。
3. **update**  
   　push を受けた際ブランチ毎に実行される。主に受け入れテスト用。  
   　0以外を返すと受け入れ中止。
4. `Received!`
5. **post-update**  
   　push を受けた際ブランチ毎に実行される。多分メッセージ表示とか用。
6. **post-receive**  
   　push を受けた際の最後に実行される。MLに告知を流したり色々処理したり。
iFrameをターゲットにしたときに「戻るボタン」で戻るには？

Ajaxでページを更新したときに、iFrameのsrcを書き換えることで、ブラウザの「戻るボタン」を機能させることができるようです。

[Ajaxなページで「戻るボタン」を機能させる方法:phpspot開発日誌](http://phpspot.org/blog/archives/2007/02/ajax_18.html)

では逆に、iFrameをFORMのターゲットに指定してsubmitしたとき(つまりiFrameの中が更新されたとき)に、「戻るボタン」を押して元のページに戻るようにするにはどうしたらいいのでしょう？

```
<form action='foo.cgi' target='frame'>
<input type='submit' value='execute'>
</form>
<iframe id='frame'></iframe>
```

ここでexecuteキーを押してsubmitした後で、「戻るボタン」を押してこのページの直前に表示していたページに戻りたいわけですが、iframeが表示されているので、iframeの前のページ、つまりsubmitしたページに戻ってしまいます……。
インターフェース書いてみた。

javaplayer:自分で名付けたパッケージ

インターフェース書いてみた。
うーん、規定集すか。
ポリモーフィズムの実現にどう絡むのか見ていきたい。
勉強時間、他のsampleも加えて
1h45m -> 10分くらいに抑えたいね。
※Javaのオブジェクト指向がゼッタイにわかる本から学習
少しprintする文字とか変更している。
simpleでいい感じがする。

インターフェース

```AVPlayer.java

//AVPlayer

package javaplayer;

public interface AVPlayer {
    
    public void play();
    
}

```

インターフェースを実装したクラス

```AudioPlayer.java

//AudioPlayer

package javaplayer;

public class AudioPlayer implements AVPlayer{
    
    public void play(){
        
        System.out.println("Music Start");        
        
    }
    
}

```

インターフェースを実装したクラス

```VideoPlayer.java

//VideoPlayer

package javaplayer;

public class VideoPlayer implements AVPlayer{
    
    public void play(){
        
        System.out.println("Video Start");
        
    }
    
    
}

```

mainファイル

```Owner.java

//Owner

package javaplayer;

public class Owner{
    
    public static void main(String[] args){
        
        AudioPlayer myAudioPlayer = new AudioPlayer();
        VideoPlayer myVideoPlayer = new VideoPlayer();
        
        AVPlayer myAVPlayer = myAudioPlayer;
        myAVPlayer.play();
        
    }    
    
}

```
NSPredicateによる配列のフィルタリング: likeとcontains

NSPredicateの条件文字列で`like`は文字列完全一致，`contains`は部分一致をチェックする．
containsのときはsingle quoteで括り，likeのときは括ってはいけない．ちょっとはまった．

```objc
NSPredicate *predLike = [NSPredicate predicateWithFormat:@"name like[c] %@", name];
NSPredicate *predContains = [NSPredicate predicateWithFormat:@"name contains[c] '%@'", name];
```

`[c]`はcase-insensitiveなマッチングを行ないたいときに付けるもの．
Perlでリトライ付きHTTP GET

毎回こういうコードを書いている気がするのでスニペットとして登録した。

```perl:retry_http_get.pl
use LWP::UserAgent;
use Sub::Retry qw(retry);

my $TryTimes = 3;
my $Interval = 1;
my $UserAgent = LWP::UserAgent->new;

sub _ua { $UserAgent->clone }

sub get {
    my ($url, $args) = @_;
    $args ||= {};
    my $status_line;
    my $res = retry(
        $args->{try_times} || $TryTimes,
        $args->{interval}  || $Interval,
        sub { _ua->get($url) },
        sub { 
            $status_line = $_[0]->status_line;
            return !$_[0]->is_success
        },
    );
    die "$status_line: $url" unless $res;
    $res;
}

__END__

my $res1 = get('http://example.com/');
my $res2 = get('http://example.com/', {try_times => 5, interval => 2});
```
javascript のデバッグ

Developer ToolsのScriptsタブで行をクリックしてブレイクポイントを設定&リロード( location.reload(true) )。

[Tutorial: Debugging - Google Chrome Extensions - Google Code](http://code.google.com/chrome/extensions/tut_debugging.html)
[Google ChromeのJavaScriptデバッガの進化がすごい - 0xFF](http://d.hatena.ne.jp/os0x/20110422/1303468821)

Chrome Developer Toolsにデバッガが付いてるのは何となく知ってたけど、
今までローカル変数見るのにprintfデバッグ(console.log)してた。。
PerlでURIをDumpする関数

パラメータをたくさん取るURIを生成する処理のデバッグに使える。

```perl:dump_uri.pl
use URI;
use Data::Dumper;
sub dump_uri {
    my $uri = ref($_[0]) eq 'URI::http' ? $_[0] : URI->new($_[0]);
    my ($base, $param_string) = split /\?/, $uri;
    my $result = $base;
    if ($param_string) {
        $result .= "\n";
        local $Data::Dumper::Indent = 1;
        local $Data::Dumper::Terse  = 1;
        my $dumped = Dumper({$uri->query_form});
        $dumped =~ s/^{\n|}\n$//g;
        $result .= $dumped;
    }
    $result;
}
__END__

warn dump_uri('https://www.google.com/search?hl=en&q=%E3%82%89%E3%82%8A%E3%83%BC%E3%83%BB%E3%81%86%E3%81%89%E3%83%BC%E3%82%8B&oq=%E3%82%89%E3%82%8A%E3%83%BC%E3%83%BB%E3%81%86%E3%81%89%E3%83%BC%E3%82%8B&aq=f&aqi=&aql=&gs_sm=3&gs_upl=0l0l0l477l0l0l0l0l0l0l0l0ll0l0');

# =>
# https://www.google.com/search
#  'hl' => 'en',
#  'gs_sm' => '3',
#  'aqi' => '',
#  'aql' => '',
#  'aq' => 'f',
#  'oq' => 'らりー・うぉーる',
#  'q' => 'らりー・うぉーる',
#  'gs_upl' => '0l0l0l477l0l0l0l0l0l0l0l0ll0l0'
```
dd のseek オプションで一瞬で大きなファイルを作る

dd のseek オプションで一瞬でイメージが作れる
内容はなんになるかわからないけれど，ディスクイメージなどに使うのにはいい

> $ time dd if=/dev/zero of=1G.img seek=1073741824 bs=1 count=1
> 1+0 記録始め
> 1+0 記録終わり
> 1 バイト (1 B) コピー終了, 5.9575e-05 s, 16.8 kB/s
> 
> real 0m0.011s
> user 0m0.000s
> sys 0m0.000s
> $ ls -l 1G.img 
> -rw-r--r-- 1 mk mk 1073741825 2011-12-24 02:42 1G.img

これを知るまでは普通にこんな感じでやってた

> $ nice -19 time dd if=/dev/zero of=1G.img bs=100M count=10
> 10+0 レコード入力
> 10+0 レコード出力
> 1048576000 バイト (1.0 GB) コピーされました、 9.19764 秒、 114 MB/秒
> 0.00user 2.27system 0:09.60elapsed 23%CPU (0avgtext+0avgdata 413664maxresident)k
> 0inputs+2048000outputs (0major+25912minor)pagefaults 0swaps
FuelPHP の ViewModel を View っぽく扱ってみる

View みたく、set メソッドで配列の指定出来る様に変更。
次いで、set_filename メソッドの追加。
使い方はいつも通り。

ViewModel の扱い方として正しいのか分からない…けど…

```PHP:app/classes/viewmodel.php
<?php

class ViewModel extends \Fuel\Core\ViewModel
{
	public function set($key, $value = null, $filter = null)
	{
		return parent::set($key, $value, $filter);
	}

	public function set_filename($file)
	{
		if ($this->_view instanceof \Fuel\Core\View)
		{
			$this->_view->set_filename($file);
		}

		return $this;
	}
}
```

```PHP:app/bootstrap.php
<?php

Autoloader::add_classes(array(
	'ViewModel' => __DIR__.'/classes/viewmodel.php',
));
```
【独習】無名関数によるクラス作りのための JSDoc テンプレート

出力結果：http://www.wakuworks.com/test/jsdoc/

Google さんのコード見ると、型は小文字っぽいな〜。
よくわからんちん。

```js:js_doc_test.js
/**
 * 名前空間の説明
 * @namespace
 */
var Namespace = Namespace || {};

/**
 * クラスの説明など
 * @constructor
 * @param {String} str 引数の説明
 */
var Namespace.Class = Namespace.Class || (function()
{
    /** @exports Class as Namespace.Class */

    var PRIVATE_CONSTANT = "private";
    var _str = "private";

    /** constructor */
    function Class(str)
    {
        this.str = str;
    }

    /**
     * 定数の説明
     * @constant
     * @type {String}
     */
    Class.PUBLIC_CONSTANT = "public";

    /**
     * クラスメソッドの説明
     * @param {Number} n 引数の説明
     * @returns {Number} 戻り値の説明
     */
    Class.method = function(n)
    {
        return n;
    };

    Class.prototype = {
        /**
         * インスタンス変数の説明
         * @type {String}
         */
        str: "",

        /**
         * インスタンス変数の説明
         * @type {String}
         * @private
         */
        _str: "",

        /**
         * インスタンスメソッドの説明
         * @param {Number} n 引数の説明
         * @returns {Number} 戻り値の説明
         */
        method: function(n)
        {
            return n;
        },

        /**
         * インスタンスメソッドの説明
         * @param {Number} n 引数の説明
         * @returns {Number} 戻り値の説明
         * @private
         */
        _method: function(n)
        {
            return n;
        }
    };

    return Class;
}
)();
```
Webサービスで公開するエンティティが循環参照する場合の解決法

# 背景
クライアント／サーバー構成のアプリケーションで、サーバー側にWebサービスで公開するエンティティクラスがあるとします。
複数のエンティティクラス間に、親子関係（Listで保持される関係）があった場合、双方向の参照を持たせると、WebサービスがエンティティクラスをXMLにシリアライズする際に、循環参照エラーが発生します。

```
    public partial class Country
    {
        public List<Person> People { get; set; }
    }
    public partial class Person
    {
        public Country BelongingCountry { get; set; }
    }
```

``` WebService.cs
    [WebService(Namespace = "http://tempuri.org/")]
    public class CountryService : System.Web.Services.WebService
    {
        [WebMethod]
        public Country GetCountry(int id)
        {
            return Country.Get(id);
        }
    }
```

　　
# 解決法
上記の状態でWebメソッドをクライアントからコールした場合、ContryとPersonの間に循環参照が発生し、例外が発生します。
これを回避するためには、PersonクラスのBelongingCountryプロパティのsetをprivate化します。

## private化

get/setのいずれかがnon publicの場合、Webサービス経由でプロパティが公開されなくなります。

```
    public partial class Person
    {
        public Country BelongingCountry { get; private set; }
    }
```

## XmlIgnore
public setが必要な場合は、PersonクラスのBelongingCountryプロパティに[XmlIgnore]属性を付けます。

```
    public partial class Person
    {
        [XmlIgnore]
        public Country BelongingCountry { get; set; }
    }
```

これによって循環参照が回避され、Webサービス経由でエンティティが取得できるようになります。
Polyvoreのように画像をブラウザ上で編集できるライブラリ

ファッションコーディネートサイトの[Polyvore](http://www.polyvore.com/ "Polyvore")のように、何枚もの画像を切り貼りしてコラージュできるようなJavascriptのライブラリが確か公開されていたのですが、どこで公開されていたのか忘れてしまいました…。

たしか[2007年のtechcrunchの記事](http://jp.techcrunch.com/archives/polyvore-to-tempt-fasionistas-to-create-then-spend/)を見たときに探したのですが、どなたかそのようなライブラリ覚えていませんか？Jqueryのライブラリだった気がするのですが記憶が曖昧です。

[iqon](http://www.iqon.jp/)でコラージュする時もPolyvoreとまったく同じような作りですね。
クラス継承

```javascript:

///////////////////////////////////////////////////////////////////////
//
//　clazz
//
///////////////////////////////////////////////////////////////////////


var clazz = function (Parent, props) {

    var Child;
    var F;
    var i;

    //------------------------------------------
    //coustruct
    //------------------------------------------


    Child = function () {
        if (Child.uber && Child.uber.hasOwnProperty("__construct")) {
            Child.uber.__construct.apply(this, arguments);
        }
        if (Child.prototype.hasOwnProperty("__construct")) {
            Child.prototype.__construct.apply(this, arguments);
        }
    };


    //------------------------------------------
    //extends
    //------------------------------------------

    Parent = Parent || Object;
    F = function () {
    };
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.uber = Parent.prototype;
    Child.prototype.constructor = Child;


    //------------------------------------------
    //add methods
    //------------------------------------------

    for(i in props){

        if(props.hasOwnProperty(i)) {
            Child.prototype[i] = props[i];
        }
    }


    //------------------------------------------
    // return
    //------------------------------------------

    return Child;

};


//===========================================================
// clazz SAMPLE
//===========================================================


/**
 * Man
 */
var Man = clazz(null,
    {
        __construct:function (what) {
            alert("Man.__construct");
            this.name = what ;
        }

        ,getName:function () {
            return this.name;
        }
    }
);

/**
 * SuperMan
 */
var SuperMan = clazz(Man,
    {
        __construct:function(what){
            alert("SuperMan  __construct")
        }

        ,getName:function(){
            var name = SuperMan.uber.getName.call(this);
            return "I am " + name;
        }
    }
);


//
// 実行テスト
//
var superMan = new SuperMan("itoz");
alert(superMan.getName());//itoz
IE6で透過PNGを使うためのネイティブコード

IE6ではruntimeStyle.filterを利用してAlphaImageLoaderを使うことで、透過PNGが正しく表示されます。
よく使う割にいつもググってるので、貼りつけておきます。

```javascript
var image = new Image();
image.onload = function(){
	var url = image.src;
	var img = new Image();
	img.width = image.width;
	img.height = image.height;
	img.src = 'spacer.gif';
	img.runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + url + '", sizingmethod="image");';

	// ex
	document.getElementById("piyo").appendChild(img);
};
image.src = "moja.png";
```
メモリ資源を確保しておいて、メモリ不足になったら確保していたメモリを資源として開放する

なんかよくわからないタイトルになった^^;; 要するに、開発中にメモリ枯渇したときに、シャットダウン関数をなんとか実行させるための裏技です。本番環境で使うことはまずないな。

```php
<?php

/**
 * 予めメモリを確保するクラス
 */
class MemoryAllocator
{
	protected static $buffer = null;

	/**
	 * メモリを確保する
	 * @static
	 * @param int $size 確保するメモリサイズ（バイト）
	 */
	public static function allocate($size = 1048576) // 1048576 = 1MB
	{
		if ( self::$buffer === null )
		{
			self::$buffer = str_repeat('1', $size);
		}
	}

	/**
	 * 確保しておいたメモリを開放する
	 */
	public static function deallocate()
	{
		 self::$buffer = null;
	}
}

// メモリ確保 1MB
MemoryAllocator::allocate();

// シャットダウン関数を追加
function onShutdown()
{
	echo 'シャットダウン処理開始'.PHP_EOL;
	echo 'memory_limit: '.ini_get('memory_limit').PHP_EOL;
	echo '現在のメモリ使用量: '. ( memory_get_usage() / 1024 / 1024 ) .'MB'.PHP_EOL;

	// ここで下のように更なるメモリを要求すると、シャットダウン処理自体も落ちる
	// $array = range(0, 100);

	// 確保していたメモリを開放する
	MemoryAllocator::deallocate();
	echo '確保メモリ解放後使用量: '. ( memory_get_usage() / 1024 / 1024 ) .'MB'.PHP_EOL;

	// 利用可能なメモリができたので、変数を新たにつくることができる。
	$array = range(0, 99);

	var_dump(count($array));
}

register_shutdown_function('onShutdown');

// メモリリークする
$array = range(0, 99999999);

// onShutdown()はここで呼ばれる
```

```text:実行結果
$ php MemoryLeak.php 

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes) in /Users/suin/Sites/PHP/MemoryLeak.php on line 59
シャットダウン処理開始
memory_limit: 256M
現在のメモリ使用量: 255.960449219MB
確保メモリ解放後使用量: 254.960426331MB
int(100)
```
コンテナに格納したコントロールを取り出す順序

# 現象
GroupBoxなどのコンテナクラスにコントロールを追加するには以下のようにします。

```
this.groupBox1.Controls.Add(this.button1); 
this.groupBox1.Controls.Add(this.checkBox1);
this.groupBox1.Controls.Add(this.label1);
```

コンテナからforeachなどでコントロールを取り出すには以下のようにします。

```
foreach (Control ctrl in this.groupBox1.Controls) {
 ...
}
```

**感覚的には取り出す順序はAddした順になると考えますが、実際はそうならないことがあります。**

# 対処方法
SetChildIndex()メソッドでコンテナ内のコントロールの順序を設定しておけば、設定した順序でコントロールを取り出すことが出来ます。

```
this.groupBox1.Controls.SetChildIndex(this.button1, 0); 
this.groupBox1.Controls.SetChildIndex(this.checkBox1, 1); 
this.groupBox1.Controls.SetChildIndex(this.label1, 2);
```
dllやexeをマージするツールILMerge

# 概要
EXEファイルと、その実行に必要な複数のDLLファイルを1つのEXEファイルにまとめることが可能です。ソフトの配布が楽になるでしょう。

# ダウンロード
[Microsoft Download Center内のILMergeダウンロード・ページ（英語）](http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17630)

# 使い方
例：MainApp.exe、ConponentA.dll、ComponentB.dllを、MergedApp.exeにまとめる。
`C:\> ILMerge /out:MergedApp.exe MainApp.exe ComponentA.dll ComponentB.dll`
LINQの集合演算

ListやDictonaryなどのIEnumerableインタフェイスを実装しているクラスに対して、LINQの集合演算が使えて便利です。

# 一意な要素の集合
以下の例は、listの重複する要素を取り除きます。
以下の例のdistinctListの要素は、「Ada」と「ALGOL」と「C#」と「COBOL」と「Java」となります(Adaは一つだけ)。

```c#:Distinct.cs
var list = new string[] { "Ada", "ALGOL", "C#", "COBOL", "Ada", "Java"};
var distinctList = list.Distinct<string>();
```

# 和集合
以下の例は、listの末尾にlist2を結合させます。そして、「O」を含む要素のみを取り出します。
以下の例のunionList の要素は、「ALGOL」と「COBOL」と「Objective-C」となります。

```c#:Union.cs
var list = new string[] { "Ada", "ALGOL", "C#", "COBOL", "Java" };
var list2 = new string[] { "BASIC", "Objective-C", "Ruby", "Python" };

var unionList = list.Union<string>(list2).Where(param => param.Contains("O"));
```

# 積集合
以下の例は、listとlist2の積をとります。 以下の例のintersectListの要素は、「C#」と「Java」になります。

```c#:Intersect.cs
var list = new string[] { "Ada", "ALGOL", "C#", "COBOL", "Java" };
var list2 = new string[] { "C#", "Java", "Ruby", "Python" };
 
var intersectList = list.Intersect<string>(list2);
```

# 差集合
以下の例は、listからlist2を引きます。 以下の例のexceptListの要素は、「Ada」と「ALGOL」と「COBOL」になります。

```c#:Distinct.cs
var list = new string[] { "Ada", "ALGOL", "C#", "COBOL", "Java" };
var list2 = new string[] { "C#", "Java", "Ruby", "Python" };
 
var exceptList = list.Except<string>(list2);
```

# 排他的論理和
以下の例は、listとlist2の排他的論理和を取得します。。 以下の例のxorの要素は、「Ada」と「ALGOL」と「COBOL」と「Ruby」と「Python」になります。

```c#:Xor.cs
var list = new string[] { "Ada", "ALGOL", "C#", "COBOL", "Java" };
var list2 = new string[] { "C#", "Java", "Ruby", "Python" };

var intersect = list.Intersect(list2); //積集合
var union = list.Union(list2); //和集合
var xor = union.Except(intersect); //和集合と積集合の差集合＝排他的論理和
```
XOOPS, TOKYOPen開発時の.gitignoreとか.git/info/excludeの設定

バージョン管理したくないファイルやディレクトリを指定します。

```text:.git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

# 開発環境

## mac用
.DS_Store 

## PhpStorm用
/.idea

## AdelieDebug
/html/preload/AdelieDebug*


# XOOPS共通
/html/mainfile.php
/html/cache/*
/html/templates_c/*
/html/uploads/*
/xoops_trust_path/cache/*
/xoops_trust_path/templates_c/*
/xoops_trust_path/uploads/*
/xoops_trust_path/tmp/*
/xoops_trust_path/log/*
/xoops_trust_path/session/*
/xoops_trust_path/modules/protector/configs/*


# TOKYOPen共通
/xoops_trust_path/file/*
/html/settings/definition.custom.php



# プロジェクト
/xoops_trust_path/modules/hoge/tmp/*
```
XOOPSのmainfile.phpをシンプルにするテンプレート

余計なコメントを省いて、設定の見通しをよく保つ。

```php
<?php

if ( defined('XOOPS_MAINFILE_INCLUDED') === false ) {
	define('XOOPS_MAINFILE_INCLUDED', 1);

	// Paths
	define('XOOPS_ROOT_PATH', '');
	define('XOOPS_TRUST_PATH', '');

	// URLs
	define('XOOPS_URL', 'http://');

	// DB
	define('XOOPS_DB_TYPE', 'mysql');
	define('XOOPS_DB_PREFIX', '');
	define('XOOPS_DB_HOST', 'localhost');
	define('XOOPS_DB_USER', '');
	define('XOOPS_DB_PASS', '');
	define('XOOPS_DB_NAME', '');
	define('XOOPS_DB_PCONNECT', 0);

	// Misc
	define('XOOPS_SALT', '');

	// Groups
	define('XOOPS_GROUP_ADMIN', '1');
	define('XOOPS_GROUP_USERS', '2');
	define('XOOPS_GROUP_ANONYMOUS', '3');

	if ( defined('_LEGACY_PREVENT_LOAD_CORE_') === false and XOOPS_ROOT_PATH != '' ) {
		require_once XOOPS_ROOT_PATH . '/include/cubecore_init.php';
		if ( isset($xoopsOption['nocommon']) === false and defined('_LEGACY_PREVENT_EXEC_COMMON_') === false ) {
			require XOOPS_ROOT_PATH . '/include/common.php';
		}
	}
}
```

上をベースによく使う設定。

```php
<?php

if ( defined('XOOPS_MAINFILE_INCLUDED') === false ) {
	define('XOOPS_MAINFILE_INCLUDED', 1);

	// Paths
	define('XOOPS_ROOT_PATH', dirname(__FILE__));
	define('XOOPS_TRUST_PATH', dirname(XOOPS_ROOT_PATH).'/xoops_trust_path');

	// URLs
	define('XOOPS_URL', 'http://'.$_SERVER['SERVER_NAME']);

	// DB
	define('XOOPS_DB_TYPE', 'mysql');
	define('XOOPS_DB_PREFIX', 'xoops'); // 変える
	define('XOOPS_DB_HOST', 'localhost');
	define('XOOPS_DB_USER', 'root');
	define('XOOPS_DB_PASS', 'root');
	define('XOOPS_DB_NAME', 'xoops'); // 変える
	define('XOOPS_DB_PCONNECT', 0);

	// Misc
	define('XOOPS_SALT', 'hoge');

	// Groups
	define('XOOPS_GROUP_ADMIN', '1');
	define('XOOPS_GROUP_USERS', '2');
	define('XOOPS_GROUP_ANONYMOUS', '3');

	if ( defined('_LEGACY_PREVENT_LOAD_CORE_') === false and XOOPS_ROOT_PATH != '' ) {
		require_once XOOPS_ROOT_PATH . '/include/cubecore_init.php';
		if ( isset($xoopsOption['nocommon']) === false and defined('_LEGACY_PREVENT_EXEC_COMMON_') === false ) {
			require XOOPS_ROOT_PATH . '/include/common.php';
		}
	}
}
```
経過時間(秒)から○時間△分×秒的な文字列を生成する

```c:elapsed_time.c
void elapsed_time(time_t time, char *buf, size_t bufsize)
{
    int hour, min, sec;
    hour = time / 3600;
    min  = (time - hour * 3600) / 60;
    sec  = time % 60;
    snprintf(buf, bufsize, "%02d:%02d:%02d", hour, min, sec);
}
```
わずか数行でボックスを表示/非表示するトグルボタンを作成

これほど簡単にできてしまうなんて・・・

    box = $('div');
    $('button').on('click', function() {
        box.animate({
            'height': 'toggle',
            'opacity': 'toggle'
        });
    });

    <button>Click</button>
    <div>
        <h1> Perform a custom animation of a set of CSS properties.</h1>
        <p>The .animate() method allows us to create animation effects on any numeric CSS property. The only required parameter is a map of CSS properties. This map is similar to the one that can be sent to the .css() method, except that the range of properties is more restrictive.</p>
        <p>All animated properties should be animated to a single numeric value, except as noted below; most properties that are non-numeric cannot be animated using basic jQuery functionality (For example, width, height, or left can be animated but background-color cannot be, unless the jQuery.Color() plugin is used). Property values are treated as a number of pixels unless otherwise specified. The units em and % can be specified where applicable.</p>
    </div>
jQuery独自メソッドスニペット

任意の値(param)とコールバック関数(fn)を引数とする、MyNewMethod という独自メソッドを追加。

    $.fn.MyNewMethod = function(param, fn) {
        return $(this).animate({
            'height' : 0,
            'opacity': 0
        }, param, function() {
            $.isFunction(fn) && fn.call(this);
        });
    };
    
    var box = $('div');
    $('button').on('click', function() {
        box.MyNewMethod(400, function() {
            console.log('callback');
        });
    });
qiitaで貢献度の高いユーザーを知りたい

qiitaで貢献度の高いユーザー (フォロワー数や++された回数、ストックされた回数が多いユーザー)
の一覧が見られると嬉しいですね。

ってか先日からやってるんですが、こういう機能要望をここに書いてて良いんでしょうか。賛同者がいればインクリメントしてくれると思ってここに書いてるんですが。しかるべきページがあれば誘導してもらえるとありがたいです。
Rubyでselfを返すメソッドってあったっけ？

配列内の重複している要素を取り出す(uniqの逆と良く言われるもの)には色々な方法が
ありますが group_by を使うとこんな感じになります。

```ruby:duplicate.rb
class Array
  def duplicate
    self.group_by{ |e| e }.reject{ |k, v| v.one? }.keys
  end
end

ary = [*0.step(8, 2)] + [*0..9]   # => [0, 2, 4, 6, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ary.duplicate                     # => [0, 2, 4, 6, 8]
```
ちょっとイヤだと思うのが group_by のブロック部 { |e| e } のところ。
個人的には```self.group_by(&:self).reject{ |k, v| v.one? }.keys```な感じで書きたい。
でも、このselfメソッドのようにselfを返すメソッドが見つからないんです。  
で、用意するとこう。

```ruby:dupli.rb
class Object 
  def self ; self end 
end

class Array
  def dupli
    self.group_by(&:self).reject{ |k, v| v.one? }.keys
  end
end

ary = [*0.step(8, 2)] + [*0..9]   # => [0, 2, 4, 6, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ary.dupli                         # => [0, 2, 4, 6, 8]
```
selfを返すメソッドといえば、思い付くのが「tap」なんですけど「tap」はブロックがないと
```localJumpError: no block given```なんで普通に使う時は```1.tap{} # => 1```でも構わない
のですが、上記のselfメソッドのように使う時にはブロックを書くと syntax error になります。  
なんでブロック必須なんだろ？？**ブロックがない時はselfを返してくれればいいのに！**
こんな感じで。

```ruby:dupli.rb
class Object
  def tap
    block_given? ? super : self
  end
end

class Array
  def dupli 
    self.group_by(&:tap).reject{ |k, v| v.one? }.keys
  end
end

ary = [*0.step(8, 2)] + [*0..9]   # => [0, 2, 4, 6, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ary.dupli                         # => [0, 2, 4, 6, 8]
```
今のところ group_by くらいでしか使い道は思い付かないんですけど group_by は結構好きなので
selfを返すメソッドはやっぱり欲しいなぁ。

ただ知らなかっただけは恥ずかしいので
**「selfを返すメソッドがある」とか、「良い方法がある」とか、何かあったら教えてください！**
よろしくお願いします。
httpリクエストしてコンテンツを取得する

コピッペ
引用元
http://d.hatena.ne.jp/rev84/20120124/1327403098

```php:request.php
$url = 'http://revinx.net/';
$postdata = array(
	'mode' => 'test'
);
$options = array('http' => array(
    'method' => 'POST',
    'content' => http_build_query($postdata),
));
$contents = file_get_contents($url, false, stream_context_create($options));
ホームポジションを死守

タイピングをしていて極力ホームポジションから外れないように以下のショートカットを活用

backspace -> ctrl + H
return -> ctrl + M (Jの方が良さそうだけど、vim使ってる時の都合でMを使用)

Macだと大体のアプリで対応出来ますが、一部効かない時もあるのでkeyremap4macbookで対応
Linuxサーバーへ不正ログインを試みたユーザー一覧を出すワンライナー

lastbコマンドを使えば、SSHのログイン失敗のログが参照できるので後は、awkでログイン失敗回数をカウントし、uniqコマンドでユーザー名を取り出して、sortコマンドでソートして、headコマンドでトップ10を出すというような感じ。

```# lastb | awk '{print $1}' | sort | uniq -c | sort -nr | head -10```
.Net + SQL Serverでテストデータを準備する方法

# 基本（もっともシンプルな実装）

1.テストメソッド内で、TransactionScopeを生成する。
2.テストデータを挿入
3.テストメソッド内で、目的の処理を記述
4.テスト終了前にDispose()し、トランザクションを破棄する
5.データベースは元どおり

```TestDataPreparation001.cs
       [TestMethod()]
        public void Test_001()
        {
            using (var trans = new TransactionScope(TransactionScopeOption.Required))
            {
                // inserting test data
                this.InsertData();
                
                // start testing
                var target = new Testee();
                var expected = 0;
                var actual = target.Something;
                Assert.AreEqual(expected, actual);
                
                // revert test data to original
                trans.Dispose();
            }
        }
```