OmniAICreator/Qiita-1.07M huggingface dataset:
grunt で LiveReload

##動機

各方面で大絶賛中の [LiveReload](http://livereload.com/) を買ってはみたものの、設定が大雑把すぎてしっくりこなかったので、[grunt](http://gruntjs.com/) のタスクに組み込む形で同じようなものをつくる

##grunt-reload を試す

[https://github.com/webxl/grunt-reload](https://github.com/webxl/grunt-reload)

ブラウザをオートリロードしてくれる grunt プラグイン
自分が使っている grunt のバージョンに合わせて0.2.0をインストール

```console
npm install grunt-reload
```

が、host と port の設定が悪いのか動かない。死
そんなに大げさなことやりたいわけじゃないし
Chrome をリロードしてくれさえすればいいの

##AppleScript を試す

Chrome のアクティブなタブをリロードする AppleScript は

```applescript
tell application "Google Chrome"
    tell the active tab of its first window
        reload
    end tell
end tell
```

1行にすると

```applescript
tell application "Google Chrome" to the active tab of its first window to reload
```

これを osascript の -e オプションで実行すると

```console
osascript -e 'tell application \"Google Chrome\" to the active tab of its first window to reload'
```

さて、grunt.coffee の中から呼び出してみる
grunt.js の CoffeeScript 化については[こちら](http://qiita.com/items/bac7400cd71d3aded4ad)を参照

require("child_process").exec を使って、さっきの osascript を子プロセスとして実行する関数を定義し、grunt に r という名前のタスクとして登録する

```coffeescript
grunt.registerTask 'r', 'reload Google Chrome (OS X)', () ->
    require('child_process').exec 'osascript -e \'tell application \"Google Chrome\" to tell the active tab of its first window to reload\''
```

これでうまくいく

- - -

簡単な例を示す
以下の grunt.coffee は grunt 、grunt r 、grunt w という3つのコマンドを提供する

```coffeescript
module.exports = (grunt) ->
    grunt.initConfig

        concat:
            lib:
                src: ['src/*.coffee']
                dest: 'tmp/myscript-concat.coffee'

        coffee:
            lib:
                files:
                    'lib/myscript.js': 'tmp/myscript-concat.coffee'
            test:
                options:
                    bare: true
                files:
                    'example/test.js': 'example/test.coffee'

        min:
            lib:
                src:
                    'lib/myscript.js'
                dest:
                    'lib/myscript.min.js'

        watch:
            files:
                ['src/*.coffee', 'example/*.coffee']
            tasks:
                ['default', 'r']


    grunt.loadNpmTasks 'grunt-contrib'

    grunt.registerTask 'default', 'concat coffee min'
    grunt.registerTask 'r', 'reload Google Chrome (OS X)', () -> require('child_process').exec 'osascript -e \'tell application \"Google Chrome\" to tell the active tab of its first window to reload\''
    grunt.registerTask 'w', 'watch'
```

- - -

```console
grunt
```

1. src ディレクトリ内の全 coffee ファイルを concat で結合してからコンパイルして、lib ディレクトリに書き出す。わざわざ concat を使っているのは、grunt-coffee の結合オプションは coffee -j と異なる動きをするのが嫌だから
2. 一方で、bare オプションを付けてテスト用の coffee ファイルもコンパイルしておく
3. コンパイルが終わったらさっき書き出した lib ディレクトリ内の js を minify（ぺしゃんこに）する。テスト用コードは minify しない

- - -

```console
grunt r
```

ブラウザをリロードするだけ、単体では役に立たない

- - -

```console
grunt w
```

coffee ファイルを常に監視しておき、いずれかのファイルが更新されたときに上記の流れを自動で実行したうえでブラウザをリロードする

- - -

この例ではその都度すべてをコンパイルしているが、例えばテスト用のスクリプトが更新されたときにはそれだけをコンパイルしてブラウザ更新、なんてこともできる

grunt すごい便利
ParamArrayを用いたサンプルプログラム


ParamArrayの使い方を知らなかったのでサンプル．

``` vbnet:
Option Explicit
' 平均を求めるAverageメソッド
Public Function Average(ParamArray Data()) As Double
  Dim i As Variant

  For Each i In Data
    Average = Average + i
  Next i
  
  Average = Average / (UBound(Data) + 1)
End Function

Private Sub Test()
  Debug.Print Average(1, 2, 3, 4, 5)
End Sub

```

Test() を実行後のイミディエイトウィンドウ

```vbnet:
3
```
[dup] Androidの超速エミュレータを導入する

重複した記事があるとの指摘がありました。
下記のほうが図とかステップが充実しています！
http://qiita.com/items/8bc1a11f1382409f1d2a

【もはやエミュレータとは言わせない】

## そもそも超速エミュレータが必要な理由

AndroidアプリやWebアプリを作る際、OSバージョンが多すぎて実機とか全部揃えていられないので、エミュレータを使ってデバッグすることになると思います。しかしこのエミュレータが非常に重たくて、MacBook Airなんかで使えたものではありません。これはスマホのARMアーキテクチャのCPUを、PCのx86アーキテクチャのCPU上でエミュレートしているためです。

この問題の解決策として、Intelがx86 CPUで直接動作可能なAndroidを配布しています。Androidの各種アプリは基本的にJava製なので、「Java（Dalvik）仮想マシン」の層でCPUの違いは吸収され、x86版でも全く差異なく動作します。

## 超速エミュレータの導入手順

超速エミュレータを使用するには、通常のAndroid SDKに加えて2つのコンポーネントが必要になります。

* CPUの仮想化支援機能を利用するカーネルモジュール
* x86版AndroidのOSイメージ

### カーネルモジュールの導入方法

[Intel® Hardware Accelerated Execution Manager](http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager)からOSにあったものをダウンロードし、インストールします。途中で仮想マシンに割り当てる（最大？）メモリ容量について聞かれますが、デフォルトで良さそうです。なおMacの場合、再度インストーラを実行することで容量を変更できるようです。
（注）2013/02/04現在：少なくともMountain Lionについては、release_1.0.4-hotfixの方をインストールしてください。通常版をインストールすると、Mac OSがクラッシュします。

Macの場合は、インストール後に下記のコマンドを実行する必要が有るようです。（再起動ごとに実行が必要なのかはまだ試していません・・。）

	sudo kextload -b com.intel.kext.intelhaxm

### OSイメージの入手方法

こちらは簡単で、SDKのディレクトリ/tools/androidで起動できるAndroid SDK Managerから、数クリックでインストール出来ます。Androidの各バージョンに「Intel x86 Atom System Image」という項目がありますので、これにチェックを入れてインストールします。
![Intel x86 Atom System Imageを選択](https://qiita-image-store.s3.amazonaws.com/0/4153/17a16a40-cb6d-9897-6c1e-d72ef395c7cd.png)


## エミュレータの設定、起動方法

Android Virtual Device Manager上で、仮想デバイスを追加or編集する際に、TargetとCPUを、インストールしたx86版のものに設定するだけで完了です。CPU部分にx86と書かれていればOKです。後は、通常通りeclipseまたはManagerから起動すると、超速で立ち上がってきます。

![CPUをx86に設定](https://qiita-image-store.s3.amazonaws.com/0/4153/47a1fca2-e6dc-8a27-d82e-56e9af06b7cd.png)

※「HAX is working and emulator runs in fast virt mode」のように表示されない場合は、CPUの仮想化機能が有効（搭載されていて、BIOSでEnabledにされている）かどうか、またカーネルモジュールがインストールされてロード済みかどうかもう一度確認してください。

### 追記：Android 2.3.3のx86エミュレータを使う場合

イメージのディレクトリ構成にバグがあるので、VM作成時に「userdata.imgがない」みたいなエラーが出てしまいます。
予め、解凍したディレクトリ/sdk/system-images/android-10/x86/images/x86の中身を、解凍したディレクトリ/sdk/system-images/android-10/x86にコピーしておけば解決します。

Macはこちらでどうぞ↓

    cd sdk/system-images/android-10/x86/images/x86/
    ln -s images/x86/* ./  

Happy 超速 Android Hacking!
matplotlibで積み上げ式バープロット

アミノ酸配列の組成(20xN次元)をプロットしてみたときのメモ。
積み上げ式のプロットを作ること自体は結構簡単。`bar`で`bottom=hoge`のように指定すればよい。
しかし、出てくるものの数が多いときに、凡例の場所を調整するので結構大変だった。プロットの幅を`get_position`と`set_position`で調整→`legend`を使う際に、`bbox_to_anchor`で位置を調整、という流れ。

参考：
http://geetduggal.wordpress.com/2011/08/22/grabbing-individual-colors-from-color-maps-in-matplotlib/
http://stackoverflow.com/questions/4700614/how-to-put-the-legend-out-of-the-plot
http://matplotlib.org/users/legend_guide.html#plotting-guide-legend

```python:plot_test.py
amino_count = ... # something; ここでは20x23次元のnp.array
accent = get_cmap('accent')  # colormapを得る
figsize(10, 8)     # 図のサイズと
rcParams['font.size'] = 14     #文字を少し大きめに
total = zeros(23)  # 積み上げるための和を保存
ax = subplot(111)
for i in xrange(20):    #20種類のアミノ酸それぞれに対して
    c = accent(i / 20.0)    # colormapは0〜1の値を入れると、対応するRGBA値を返す
    if i == 0:
        ax.bar(arange(23), amino_count[i], color=c, label=aa[i])
    else:
        ax.bar(arange(23), amino_count[i], color=c, bottom=total, label=aa[i])
        # bottomを指定することで、バーの下限を設定できる。
    total += tmd_count[i]

box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.80, box.height])
# プロットの幅を80％に設定する。
h,l = ax.get_legend_handles_labels()
ax.legend(h[::-1], l[::-1], bbox_to_anchor=(1.25, 1.05))
# get_legend_handles_labels()で、凡例のハンドルとラベルを得る。
# これを用いて、凡例を逆順で示している。
# また、bbox_to_anchorを用いることで凡例の位置を調整している。
xlabel('Position from the N-terminal side of TMD', fontsize=16)
ylabel('Count', fontsize=16)
```
[Windows]gnupackのemacsclientw.exeを快適に使えるようにする。

だいぶ昔、Emacsを導入した頃の奮闘記です。かなり初心者視点ですが、大事なことだったでメモ。

-
初めてWindowsにEmacsを導入したとき、ファイルを開くたびに新しいEmacsが起動してるのを見て、バッファで開きたいんだけど？？？？ となり。
それからすぐに`emacsclientw.exe`の存在を知ったので、早速使おうとしたら、

>・Emacs Serverが起動していないとエラーになる。
>・ファイルの引数がないとエラーになる。

というちょっとりかいできない挙動を示し、
このままではメモ帳のような自然な動きのショートカットを作れない！となり、何とかしようと奮闘してみました。

しばらくぐぐって見つけたのがこの記事、
[[emacs.exe と emacsclient.exe を自動的に使い分ける AutoHotkey のスクリプトを作成した (gnupack 向け)]](http://blechmusik.hatenablog.jp/entry/20120721/1342805665)
というまさにどんぴしゃな解決法を見つけたのでした。

が、残念なことにどうにもうまく動かなかった……ので、
同じくAHKを使って自分で作ってみました。
こういう事例にはAHKを使えばいいんだね！すごい！おぼえた！

というわけでコードはこちら。

[[gist] https://gist.github.com/4705394](https://gist.github.com/4705394)

ほとんど1から書いてますが、やりたいことは上の記事のものと同じです。

```
・起動してなかったら起動する
・起動してて引数があったらクライアントをつかう
・起動してて引数がなかったらEmacsをアクティブ化
```
を行なってます。

参考元と違うのは、


- 引数を1つしか受け入れない挙動を変えた(複数ファイルをドロップすると全部読みこんでくれる)
- __Emacsが起動しない問題を解決__(Emacsが未起動の状態では存在しないはずのserverファイルに対してFileExistやってた)
- __ファイルパスにスペースが入ってると正常に動かない問題を解決__(※自分の環境では致命的)

みっちりコメントが書いてあるのは、AHKスクリプトが初めてで記法がまるでわかめだったのでコードを覚えるのを諦めた結果です。もうかきたくない。えりすぷ最高。
AHK的な書き方っていうのをガン無視してる感あるけど気にしない方向で。

これをコンパイルしてショートカットや関連付けに使うことで、ふつうのWindowsアプリケーションのように地味インタラクティブな挙動でEmacsを起動することができます。やったね！
……そもそもEmacsを終了させないっていう意見もあるらしい。

動作させるには、
[[AutoHotKey_L] http://l.autohotkey.net/](http://l.autohotkey.net/) から、
[Compiler - Ahk2Exe] が必要です。
64bitなコンパイルもできるよ。うれしい。

使う前にiniファイルを用意して各ファイルのパスを書きます。

```StartEmacs.ini
[path]
emacs=
emacsclientw=
server=
```
gnupackを使ってるときは、`emacs`にはgnupackインストールディレクトリにあるemacs.exeを指定すること。
不要だと思ったのでiniのパスチェック処理は除外してエラーハンドラに任せてます。
パス間違いには注意。

-
以上です。
Windowsに慣れてたらこの挙動に結構戸惑ったけれど、Linux寄りの人だとそうでもないのかな？
WindowsでEmacsデビューの敷居が少しでも低くなってくれればいいなとおもいました。
1つの Applicative フィールド値を複数の場所で使いまわす

例：1つのテキストフィールドの値を1,2,3文字目からなるタプルに変換

```haskell
sampleForm :: Form (Char, Char, Char)
sampleForm = renderDivs $ ((,,)
    <$> (!! 0) . unpack
    <*> (!! 1) . unpack
    <*> (!! 2) . unpack
    ) <$> areq textField "text" Nothing
```
Play Framework の view を Windows の Eclipse で開くと文字化けする

Play Framework の view を UTF-8 で書いていると、Windows の Eclipse で開いたときに文字化けします。Eclipse の全体設定でエンコーディングを UTF-8 に設定してあっても構わず文字化けします。自動判別が余計なことをしてくれてるみたいです。

.scala.html の先頭にこんなのを書いておけば Eclipse を騙すことができて勝利します。

```text
@* <meta charset="utf-8"> FOR ECLIPSE CHARSET DETECTION *@
```
Hash#map は Hash を返さない

ごく当たり前の話だとは思うのですけど、メモ。

```ruby
h = { :hoge => 'hoge', :fuga => 'fuga' }
h.map { |k, v| v.upcase } # ["HOGE", "FUGA"] 
```

HashにしたければHashに突っ込んでやればよい。

```ruby
Hash[h.map { |k,v| [k,v.upcase] }] # {:hoge=>"HOGE", :fuga=>"FUGA"} 
```

速度の計測したわけじゃないし普通はどんなやり方するのかわかんないけど、
とりあえずこれで解決した。

**追記**
会社の人に話を聞いてみると、Nabetaniさんが提示してくださった

```ruby
def f(x); "SomeCalc[%s]"%x ; end
result = h.inject( {} ){ |a,(k,v)| a[k]=f(v);a } 
# {:hoge=>"SomeCalc[HOGE]", :fuga=>"SomeCalc[FUGA]"}
```

が一般的らしいです。

**追記**
Ruby2.1以降、[`Array#to_h`](http://docs.ruby-lang.org/ja/2.1.0/method/Array/i/to_h.html)が追加されました。

```rb
result = h.map { |k,v| [k,v.upcase] }.to_h
# {:hoge=>"HOGE", :fuga=>"FUGA"}
```

空のHashにinjectしていくよりも読みやすいと思います。
foreach で break された場合に処理を実行する

表題の話題が挙がったので実験的に。
標準でこういうのない…よね？
アクションの位置をもう少しなんとかしたくはある。

#テスト

```csharp:EnumerableExTest.cs
[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void BreakTest()
    {
        var count = 0;
        foreach (var item in new[] { 1, 2, 3 }.BreakWith(() => count++))
        {
            Console.WriteLine(item);
            if (item == 2) break;
        }

        count.Is(1);
    }
    [TestMethod]
    public void LastBreakTest()
    {
        var count = 0;
        foreach (var item in new[] { 1, 2, 3 }.BreakWith(() => count++))
        {
            Console.WriteLine(item);
            if (item == 3) break;
        }

        count.Is(1);
    }
    [TestMethod]
    public void NotBreakTest()
    {
        var count = 0;
        foreach (var item in new[] { 1, 2, 3 }.BreakWith(() => count++))
        {
            Console.WriteLine(item);
        }

        count.Is(0);
    }
    [TestMethod, ExpectedException(typeof(ArgumentNullException))]
    public void SourceNullTest()
    {
        ((IEnumerable<object>)null).BreakWith(() => { });
    }
    [TestMethod, ExpectedException(typeof(ArgumentNullException))]
    public void ActionNullTest()
    {
        new[] { new object() }.BreakWith(null);
    }
}
```

#実装

```csharp:EnumerableEx.cs
public static class EnumerableEx
{
    public static IEnumerable<T> BreakWith<T>(this IEnumerable<T> source, Action action)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (action == null) throw new ArgumentNullException("action");

        var enumerated = false;
        try
        {
            foreach (var item in source)
            {
                yield return item;
            }
            enumerated = true;
        }
        finally
        {
            if (!enumerated) action();
        }
    }
}
```
grunt のバージョン上げずにタスクを CoffeeScript でかく

##grunt

[http://gruntjs.com/](http://gruntjs.com/)

HTML / JS / CSS 関係のファイルをコンパイルしたり結合したりぺちゃんこにしたり
テストしたり git にコミットしてくれたりプラグイン次第で色々してくれる便利ツール。
node.js 上で動く。

##不満

安定版のバージョン0.3はタスクを JS で書く。
複雑なタスクを書くと {} のネストがひどい。

開発版のバージョン0.4はタスクを CoffeeScript で書けるけど、
対応していないプラグインがある。

grunt の0.3を使いつつ coffee でタスクを書きたい。

##解決法

~/.bashrc に以下を追記

```bash
alias grunt='coffee -bc grunt.coffee;\grunt'
```

読み込みましょう

```console
source ~/.bashrc
```

するとこれが

```javascript
module.exports = function(grunt) {
    grunt.initConfig({

        lint: {
            all: [
                'grunt.js',
                'lib/**/*.js',
                'test/**/*.js'
            ]
        },

        jshint: {
            options: {
                browser: true
            }
        }
    });

    grunt.loadNpmTasks('grunt-sample');
    grunt.registerTask('default', 'lint sample');
};
```

これに

```coffeescript
module.exports = (grunt) ->
    grunt.initConfig

        lint:
            all: [
                'grunt.js'
                'lib/**/*.js'
                'test/**/*.js'
            ]

        jshint:
            options:
                browser: true

    grunt.loadNpmTasks 'grunt-sample'
    grunt.registerTask 'default', 'lint sample'
```

タスクは grunt.coffee として、いままで grunt.js を置いていたところに置きましょう。
対象のオブジェクトに、全てのプロパティにKVO監視一括登録する

addObserver:forKeyPath:options:context:は一つ一つプロパティを指定しなければならず、
面倒です。そこで

```
@interface NSObject(ObserverALL)
- (void)addObserverAllProperties:(NSObject *)observer options:(NSKeyValueObservingOptions)options context:(void *)context;
- (void)removeObserverAllProperties:(NSObject *)observer context:(void *)context;
@end
@implementation NSObject(ObserverALL)
- (void)addObserverAllProperties:(NSObject *)observer options:(NSKeyValueObservingOptions)options context:(void *)context
{
    unsigned propertyCount;
    objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
    for(int i = 0 ; i < propertyCount ; ++i)
    {
        objc_property_t property = properties[i];
        const char *propName = property_getName(property);
        NSString *propertyName = [NSString stringWithUTF8String:propName];
        [self addObserver:observer forKeyPath:propertyName options:options context:context];
//        NSLog(@"add observer -> %@", propertyName);
    }
    free(properties);
}
- (void)removeObserverAllProperties:(NSObject *)observer context:(void *)context
{
    unsigned propertyCount;
    objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
    for(int i = 0 ; i < propertyCount ; ++i)
    {
        objc_property_t property = properties[i];
        const char *propName = property_getName(property);
        NSString *propertyName = [NSString stringWithUTF8String:propName];
        [self removeObserver:observer forKeyPath:propertyName context:context];
    }
    free(properties);
}
@end
```

とカテゴリを用意してあげます。
class_copyPropertyListを使って全プロパティを列挙して、それをaddObserverするだけの簡単なカテゴリです。
これを使えば楽に全監視できますね。
必要に応じて少々カスタマイズすれば色々な用途に使えそうです。

ヘッダーを書き忘れてました。

```
#import <objc/runtime.h>
```

が必要です
UIBarButtonItemにhighlight用の画像を設定したい場合


ナビゲーションバーに設定する画像について
ボタンを押した時に画像を割り当てたいと思って探したら、なかなか見つからなかったので
自分の実現方法を纏めます。


```objectivec

    UIButton* rightBarCustomButton =[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 70, 30)];
    [rightBarCustomButton setBackgroundImage:[UIImage imageNamed:@"button_blue.png"] forState:UIControlStateNormal];
    [rightBarCustomButton setBackgroundImage:[UIImage imageNamed:@"button_blue_highlight.png"] forState:UIControlStateHighlighted];
    
    //buttonのラベル設定
    [rightBarCustomButton setTitle:@"share" forState:UIControlStateNormal];
    rightBarCustomButton.titleLabel.font =[UIFont boldSystemFontOfSize:14];
    rightBarCustomButton.titleLabel.shadowOffset    = CGSizeMake (0.0, 1.0);
    rightBarCustomButton.titleLabel.shadowColor =[UIColor blackColor];
    
    [rightBarCustomButton addTarget:self action:@selector(share:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightBarCustomButton];
    [self.navigationItem setRightBarButtonItem:rightBarButtonItem];

```
videoタグの簡単な使い方


[videoタグで出来そうなことをやってみた](https://dl.dropbox.com/u/388538/video-sample/index.html)ので簡単な使い方を書く。

## 準備(`Д´)

```HTML:HTML
<video id="video" src="movie.mp4"></video>
```

```javascript:JavaScript
var video = document.getElementById('video');
// もしくはjQueryを使いたい場合は
var video = $('#video').get(0);
// この変数に対して操作を行います。

video.play()
```

ビデオがリモートにある場合は読み込みに時間がかかるかもしれません。再生されたらおｋです。

## こんな操作ができるよ

http://www.w3.org/wiki/HTML/Elements/video#IDL_Attributes_and_Methods

```javascript:JavaScript
video.play() // ビデオを再生する
video.pause() // 一時停止する
console.log(video.currentTime) // 現在の再生時間を表示する
video.currentTime = 10 // 10秒目に移動する
```

また、ビデオの再生が終了したら次のビデオを再生するといったこともできます。

```javascript:JavaScript
video.addEventListener('ended', function() {
	video.src = '次のビデオ.mp4';
	video.play();
}, false);

//jQueryを使う場合は
video.on('ended',function() {
	video.src = '次のビデオ.mp4';
	video.play();
});
```

再生終了のイベント以外にもシークされたことや再生中であること等のイベントがあります。 [詳細はこちら](http://www.w3.org/wiki/HTML/Elements/video#Media_Events)

## ビデオフォーマットの話
.oggとか.mp4とか.webmとかあります。対応してないブラウザでは表示されません。
http://en.wikipedia.org/wiki/HTML5_video#Browser_support

複数指定しておけばどれかは再生してくれるはず。

```HTML:複数指定する
<video>
	<source src="video.webm" type='video/webm; video/webm; codecs="vp8, vorbis"'></source>
	<source src="video.mp4" type="video/mp4"></source>
	<source src="video.ogv" type="video/ogg"></source>
</video>
```

フォーマットの変換は[Miro Video Converter](http://www.mirovideoconverter.com/)がwindowsでもmacでも使えます。
PHP開発環境構築メモ


Mountain LionにPHPの環境を構築したのでメモしておきます。

## Homebrew

##### インストール

```
ruby <(curl -fsSk https://raw.github.com/mxcl/homebrew/go)
```

##### 確認
```
brew doctor
```

##### /usr/local/sbinの作成

```
mkdir /usr/local/sbin
```

###### pathの設定

```
export PATH=/usr/local/sbin:$PATH
export PATH=/usr/local/bin:$PATH
```

## Apacheのインストール

###### Formulaの登録

```
brew tap Homebrew/dupes
```

###### インストール

```
brew install httpd
```

###### 起動
```
sudo /usr/local/sbin/apachectl start
sudo /usr/local/sbin/apachectl stop
```

## MySQLのインストール

###### インストール

```
brew install mysql
```

###### MySQLの初期化

```
mysql_install_db --verbose -user=$(whoami) --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
```

###### MySQLの起動
```
cd /usr/local/opt/mysql
/usr/local/opt/mysql/bin/mysqld_safe &
```

###### 初期設定

```
/usr/local/opt/mysql/bin/mysql_secure_installation
```

###### 確認

```
mysql -u root -p
```

###### 起動
```
/usr/local/bin/mysql.server start 
/usr/local/bin/mysql.server stop 
```

## memcachedのインストール

```
brew install memcached
```

## PHPのインストール

###### Formulaの登録

```
brew tap josegonzalez/php
```

###### インストール

```
brew install php53 --with-mysql --with-pgsql --with-apache --with-intl --with-readline
```

##### パスの設定
```
PATH="$(brew --prefix josegonzalez/php/php53)/bin:$PATH"
```

###### xdebugのインストール

```
brew install php53-xdebug
```

###### その他モジュールのインストール

```
brew install php53-memcache
brew install php53-imagick
```

###### phpunitのインストール

```
pear config-set auto_discover 1
sudo pear install pear.phpunit.de/PHPUnit
```

## 参考URL
- http://qiita.com/items/26162a4ebcbbb351b879
- http://tanakahisateru.hatenablog.jp/entry/20121001/1349093118
- http://massat.jp/blog/2012/11/24/setup-php-on-mountain-lion/
Railsのアセットパイプラインを無効にするには

まず以下のようにします。

```ruby:config/application.rb
    # Enable the asset pipeline
    #config.assets.enabled = true
    config.assets.enabled = false
```

次に以下のようにします。

```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title>P130128CanvasExperiment2</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application"%>
  <!--added-from-->
  <%= javascript_include_tag "jquery"%>
  <%= javascript_include_tag "knockout-2.1.0"%>
  <%= javascript_include_tag "ore-ore-script"%>
  <%= javascript_include_tag params[:controller] %>
  <!--added-to-->
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>
```

最後に`public/javascripts`フォルダを作って目的のjsファイル（`<controller-name>.js`も可能）を置けば完了です。


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
Cocoa-AppleScript Appletで通知センターを利用する


~~~~~applescript:NotificationCenterExample
on userNotificationCenter_shouldPresentNotification_(notificationcenter, notification)
    return 1
end userNotificationCenter_shouldPresentNotification_

on notification(aTitle, aSubtitle, aMessage)
    set userNotification to current application's NSUserNotification's alloc()'s init()
    set userNotification's title to aTitle
    set userNotification's subtitle to aSubtitle
    set userNotification's informativeText to aMessage
    current application's NSUserNotificationCenter's defaultUserNotificationCenter's deliverNotification_(userNotification)
    current application's NSUserNotificationCenter's defaultUserNotificationCenter's setDelegate_(me)
    userNotification's release()
end notification

notification("THIS IS TEST", "notification test", "This is notification test from cocoa applescript applet.")
~~~~

Cocoaブリッジしているので通常のAppleScriptではなくCocoa-Applescript AppletかCocoa-Applescript Applicationで動くコードです。
言語環境を取得する

Coronaでは素直に言語環境を取得するメソッドが無いので（多分。あったら教えてください）、それを無理やり取得する方法です。
英語版とか日本語版とかでテキストやアセットが異なり、かつ別々にバイナリ準備するのが面倒な場合はこんな感じで実装すると便利かと。
拙作のVRITRAでも同じような手法で振り分けを行っています。



```lua:main.lua
local lang = "checking...";
local lang_text = display.newText( lang , display.contentWidth/2 , display.contentHeight/2 );


local function getLangListener( event )
	local shouldLoad = true;
	local url = event.url;
	if 1 == string.find( url, "lang:" ) then
		lang = url:sub(6, 7);
		lang_text.text = "この環境の言語は「"..lang.."」ですかね？";
		shouldLoad = false;
	end
	return shouldLoad;
end

local options = { hasBackground=false, baseUrl=system.ResourceDirectory, urlRequest=getLangListener };
native.showWebPopup( 0,0,0,0, "get_language.html" , options );
```


```html:get_language.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>get_language</title>
</head>
	
<body onLoad="document.getElementById('getlangform').submit();">

<script language="JavaScript">

	function getLanguage() {
		try{
			return ( navigator.browserLanguage || navigator.language || navigator.userLanguage ).substr(0,2);
		}catch(e){
			return "en";	//デフォルトの言語入れておく
		}
	}
	document.write('<form action="lang:'+getLanguage()+'" id="getlangform" ></form>');

</script>

</body>
</html>
```

処理の流れとしては
**言語判定用のhtmlをwebPopupで起動->jsで言語判定->main側にレスポンス->webPopupを自動クローズ**
という感じになります。

ちょっとだけトリッキーですが、main.luaの変数`lang`に`"ja"`やら`"en"`やらが格納されるはずです。

実際には、様々な言語が入ってくるのが想定されるので**"ja"以外が格納されたら全て"en"**扱いにする。だとか
webPopupの起動に時間が掛かったりするのでちゃんとevent張るとか、裏でこっそり行うとか
する必要があるかもしれません。

そういえば、webPopup内の関数をCorona側から実行する方法ってあるんでしょうかね？
もしあれば、jsに一部処理を委ねることも出来そうなのですけど…。
（単にsocket.io.jsが使いたいだけではある）
Emacs の Calc で Unix タイムを変換

Unix タイムを日時形式(YYYY-mm-dd HH:MM:SS)に変換したいときってありますよね。
やり方はいろいろありますが、常に Emacs を起動している人には Calc がおすすめ。
簡単操作で Unix タイムと日時形式を相互変換できます。

1. まずは Emacs 上で M-# c を打鍵して Calc を起動します。
2. つぎに変換元となる時間を入力します。
   * Unix タイムを入力するときはそのまま数値を入力:
     (例) `1234567890 Enter`
   * 日時形式で入力するときは ' \<YYYY-mm-dd HH:MM:SS\> を入力:
     (例) `' <2013-01-23 12:34:56> Enter`
3. そして t U を打鍵すれば Unix タイムと日時形式が切り替わります。

変換後に y で結果を yank できます。
q で Calc を終了します。
Python3.3 + mod_wsgi3.4 をさくらVPS(CentOS)にインストールした時に少しハマったので振り返りメモ


# 前置き 
最初のpython3.3インストール時にはこんな感じ↓(どこかのサイトを参照。)

``` 
$ ./configure --prefix=/usr/local
$ make
$ make altinstall
```

この環境にvirtualenv入れてpyramidのプロジェクト作ってみていたので、デプロイ用にapache+mod_wsgiを改めて構築しようとしたのが今回の取っ掛かり。

* [この記事を参照しながらやってました](http://istks.net/1127)
 * 記事内で「mod_wsgiはもしかするとPython3には正式に対応してないかもしれません。」とは言われているものの、とりあえず承知のうえで作業中 



# python3.3を再ビルドしないとダメっぽいので……
とりあえずpython3.3に追加パラメータをつけてコンパイルし直す

```
$ cd /path/to/Python-3.3.0
$ ./configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local
$ make
$ make install
$ echo $?
```
ここまでは問題なかったように見えた…が、

```
$ python3.3
python3.3: error while loading shared libraries: libpython3.3m.so.1.0: cannot open shared object file: No such file or directory
$ 
```
あれ、soファイルが見つからないと言われる。
/usr/local/lib内に確かにあったので、今回は`/etc/ld.so.conf`にパスと追加してldconfigで逃げ切り。

# で、続けてmod_wsgiを何も考えずにインストールしようとする……も

```
$ wget http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
$ tar zxvf mod_wsgi-3.4.tar.gz
$ cd mod_wsgi-3.4
$ ./configure CFLAGS=-fPIC --with-python=/usr/local/bin/python3.3
$ make
(中略)
/usr/lib64/apr-1/build/libtool --silent --mode=link gcc -o mod_wsgi.la  -rpath /usr/lib64/httpd/modules -module -avoid-version    mod_wsgi.lo -L/usr/local/lib -L/usr/local/lib/python3.3/config -lpython3.3 -lpthread -ldl -lutil -lm
/usr/bin/ld: cannot find -lpython3.3
collect2: ld returned 1 exit status
apxs:Error: Command failed with rc=65536
.
make: *** [mod_wsgi.la] Error 1
$
```

想定していないエラーが出て止まってしまった。
pythonの再インストール後のファイル状況がどうなっているかを確認してみた。

```
$ ls -lt /usr/local/lib/python3.3/
(略)
drwxr-xr-x  4 root root   4096 Feb  3 23:57 concurrent
drwxr-xr-x  2 root root   4096 Feb  3 23:57 config-3.3m
-rw-r--r--  1 root root  49499 Feb  3 23:57 configparser.py
(略)
```
ビルドが特殊だったのかはひとまず置いといて、どうやら`/usr/local/lib/python3.3/config`ではなく、`/usr/local/lib/python3.3/config-3.3m`という形でディレクトリが作られるらしい。
で、次

```
$ ls -lt /usr/local/bin/
(略)
lrwxrwxrwx 1 root root      16 Feb  3 23:57 python3-config -> python3.3-config
lrwxrwxrwx 1 root root      17 Feb  3 23:57 python3.3-config -> python3.3m-config
lrwxrwxrwx 1 root root       9 Feb  3 23:57 python3 -> python3.3
-rwxr-xr-x 1 root root    1970 Feb  3 23:57 python3.3m-config
(略)
-rwxr-xr-x 2 root root   13347 Feb  3 23:57 python3.3
-rwxr-xr-x 2 root root   13347 Feb  3 23:57 python3.3m
(略)
```
python3.3とpython3.3mが存在したり-configが最終的にpython3.3m-configを見てたりしていたので、`-lpython3.3`の指定がまずいんじゃないかと類推。
で、最終的にこんな感じにconfigure時に生成されるMakefileを書き換えてみることに

```
< LDFLAGS =  -L/usr/local/lib -L/usr/local/lib/python3.3/config 
< LDLIBS =  -lpython3.3 -lpthread -ldl  -lutil -lm
---
> LDFLAGS =  -L/usr/local/lib -L/usr/local/lib/python3.3/config-3.3m
> LDLIBS =  -lpython3.3m -lpthread -ldl  -lutil -lm
```
```
$ make
(略)
/usr/lib64/apr-1/build/libtool --silent --mode=link gcc -o mod_wsgi.la  -rpath /usr/lib64/httpd/modules -module -avoid-version    mod_wsgi.lo -L/usr/local/lib -L/usr/local/lib/python3.3/config-3.3m -lpython3.3m -lpthread -ldl -lutil -lm
$ 
$ make install
```
あ、makeが正常終了した。ので上ではそのままinstall。apacheの再起動も問題なくできた。


## 補足
まだ、mod_wsgiがうまく動くかの確認はしてないです
herokuにPHPが動くウェブサイトを移植する


## やったこと

1.ローカルにプロジェクトファイルを`git clone`
2.`./.git`をまるごと削除した後、`git init`
3.`git add .`して`git commit -m 'first commit'`
4.herokuプロジェクト作成（PHPが動くような環境設定で）
	
	$ heroku create -s cedar -b git://github.com/heroku/heroku-buildpack-php.git hogehoge

**追記訂正**
ビルドパックを`git://github.com/iphoting/heroku-buildpack-php-tyler.git`から`git://github.com/heroku/heroku-buildpack-php.git`に変更。こっちのほうがデプロイなぜかが速い。

5.`git push heroku master` で　heroku にデプロイ
6.`heroku open` でブラウザで起動

こんだけ。簡単っ！

ここが参考になったです。
[Heroku上に最新のPHP5.4 + nginx環境を30秒で構築する - へびにっき](http://tkyk.name/blog/2012/11/28/php-on-heroku/)


## 注意点

デプロイの途中でエラーが出た。

	-----> Heroku receiving push
	 !     Heroku push rejected, no Cedar-supported app detected

どうやらPHPのプロジェクトなのに`index.php`がねぇよと怒られてる模様。
[herokuにただのWebページを乗せてみる - Software色々](http://d.hatena.ne.jp/softsama/20120715/1342373494)

appacheで拡張子`.html`を`.php`として動くように`.htaccess`で設定していたのだけど、nginxなのでそれがダメっぽい、たぶん。で、同様のやりかたを探してみたけどみつからないので、おとなしく拡張子を`.php`に変えてコミットしてデプロイしたら今度は成功した。

## 独自ドメインを使う

ここを参考に。 https://devcenter.heroku.com/articles/custom-domains

まず、管理画面でドメインを追加する。その上でCNAMEでDNSの設定をすればおｋ．


	cname hoge myapp.herokuapp.com


意外とあっさりいけたので、これを機にいろいろとherokuに移行しちゃおうかな。

## おまけ
こんなのもあった
[herokuに静的ページをアップする - komagata](http://docs.komagata.org/5024)
[デザイナーもHerokuを使ってみよう！Herokuを使って静的ページを無料で作る - KUROIGAMEN(黒い画面)](http://kuroigamen.com/22)
skypeの全チャットログを読みやすい形で保存する(mac)


たくさんの思い出が詰まったskypeのメッセージたち。
skypeのアプリ上で昔のメッセージを読み込もうとすると遅いし、
一年前以上のメッセージは読み込んでくれない。
何かあった時のために、読みやすい形でログが残ってあれば…

というわけで抽出方法です。

macの場合、
`~/Library/Application Support/Skype/[skypeID]/`
の中の
`main.db`
というデータベースのファイルからデータを抽出する。

```bash:skypeLogging.sh
cd ~/Library/Application Support/Skype/[skypeID]/
echo 'select datetime(timestamp,"unixepoch","localtime"), author, body_xml from Messages;' | sqlite3 ./main.db > skype.log
```

(ファイル名skype.logの部分は適宜変更する。csvにしたら表計算ソフトで読み込めるかも)

dataname(timestamp, "unixepoch","localtime")はタイムスタンプ(整数)のパース。
変換後は  `(発言時間)|(発言者のskypeid)|(発言者の表示名)|(発言内容)` というふうに出力される。

特定のグループチャットのみを抽出したいときは、まず

```SQL:skypeLogging.sql
select datetime(timestamp,"unixepoch","localtime"), chatname, author, body_xml from Messages ;
```
の`chatname`カラムをチェックすると`#[グループチャット作成者のskypeID]/$[最初にグループチャットに加えられたメンバーのskypeID];[グループチャットのID(英数字16文字)]`というように出力されるので、

```bash:skypeLogging.sh
echo 'select datetime(timestamp,"unixepoch","localtime"), author, body_xml from Messages where chatname="#[グループチャット作成者のskypeID]/$[最初にグループチャットに加えられたメンバーのskypeID];[グループチャットのID(英数字16文字)]";' | sqlite3 ./main.db > skype.log
```

とすればいい。

***
おまけ
`sqlite3 -html` とするとhtml形式で出力してる

おまけ2
`echo 'select count() from messages;'|sqlite3 main.db`
とすれば今までの総発言数(自分の発言+受信メッセージ)が分かる
virtualbox centos6にnginxを3分でインストールする方法


```shell:centos6.3
sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

>yum list nginx 
Available Packages
nginx.x86_64                 1.2.1-1.el6.ngx                  nginx

>sudo yum install nginx
```

以上
ソースコードをシンタックスハイライトされたHTMLに変換する


シンタックスハイライトを行うためのライブラリ CodeRay を使って、コマンドラインで指定されたソースコードをシンタックスハイライトされたHTMLに変換する手順。

## 前提条件

1. Rubyがインストールされていること
2. CodeRayがインストールされていること (`gem install coderay`)

## 手順

input.rb を読み込んでシンタックスハイライトされたHTML output.html を出力する例。ソースコードの言語は拡張子によって自動判別される。

```
coderay input.rb output.html
```

ソースコードの言語を明示的に指定することもできる。

```
coderay -ruby input.rb output.html
```

別のHTMLファイルに挿入するためのHTMLコードを生成したい場合の実行例。div要素で囲まれたHTMLコードが div.html に出力される。

```
coderay input.rb -div div.html
```

## 対応形式の表示

### シンタックスハイライト可能な言語の一覧の表示

```
coderay list scanners
```

### 対応する出力形式の一覧の表示

```
coderay list encoders
```

## 関連情報

- [CodeRay] (http://coderay.rubychan.de/)
dotCloudを最速で始める方法（いまさら）


PaaSジプシーな昨今なんですが、無料で開発サーバー建てるって目的ならめちゃくちゃ使えるぽいので試してみた。

## 下準備

### 1.サインアップ

https://www.dotcloud.com/accounts/register/

### 2.クライアントをインストール

	$ sudo easy_install pip && sudo pip install dotcloud

### 3.初期設定

	$ dotcloud setup
	dotCloud username or email: yourname
	Password: 
	==> dotCloud authentication is complete! You are recommended to run `dotcloud check` now.


## アプリケーションの作成

### 1.アプリケーションを作成
[Dashboard](https://dashboard.dotcloud.com/)で`+ create a new application`から

### 2.アプリケーション名を決める
![](http://gyazo.com/6f6fa012c54bad4862985555783b0e3b.png)


### 3.テンプレの設置
`PHP+MySQL`、`Node.js+mongoDB`、`Python+PostgreSQL`、`Ruby+MySQL`、`Perl+MySQL`が選べる。ここではとりあえずPHPのテンプレを選択。
	
	//PHP + MySQL
	git clone git://github.com/dotcloud/stack-php-mysql.git


![](http://gyazo.com/f0efe6370520db519a4a4c2b506b7fde.png)

### 4.アプリケーションに接続

	$ cd stack-php-mysql
	$ dotcloud connect hoge
	==> Connecting with the application "hello"
	==> Connected with default push options: --rsync

### 5.デプロイ

	$ dotcloud push

するとずらーーっとデプロイが始まる。

	10:49:25.991095: [www.0] Installation successful for service (www) instance #0
	10:49:25.993432: --> Application (hoge) fully installed
	==> Application is live at http://hoge-yourname.dotcloud.com


### 6.アプリケーションを起動

	$ dotcloud open

	==> Opening service "www" in a browser: http://hoge-yourname.dotcloud.com


うん、すごい簡単。

ここまでを完全にコマンドラインから完結できるやりかたもある
[DotCloudを試してみたら、10分でHello Worldが公開できた。  ](http://choilog.com/katty0324/blog/43)


で、

ここまでやって、`Rackhub`っちゅうもっと便利なものがあったんだ、、、ｴ━━(;ﾟДﾟ)━━!!
[さくらVPS、DotCloudの次にくるRackhub](https://speakerdeck.com/cside_/vpsdotcloudrackhub)

...to be continued （たぶん笑
第7回オフラインリアルタイムどう書く。rubyによる実装。


問題は 問題は http://nabetani.sakura.ne.jp/hena/ord7selectchair/
解答リンク集は http://qiita.com/items/4364285801d1c9f370a1

最初に書いたのはやっぱり ruby だったんだけど、Qiita への投稿はなんとなく一日遅らせてみた。

```ruby
#!ruby
#coding:utf-8

def solve( src )
    count = src.to_i
    seq = src.split( ":" )[1]
    seq.chars.inject( %w(-)*count.to_i ){ |c,m|
        if m<=?Z
            pos=(0...count).select{ |ix|
                c[ix]=='-' 
            }.min_by{ |ix|
                left = 0<ix && c[ix-1] != '-'
                right = ix+1<c.size && c[ix+1] != '-'
                [ (left ? 1 : 0 ) + ( right ? 1 : 0 ), ix ]
            }
            raise unless c[pos]=='-'
            c[ pos ] = m
        else
            c[ c.index( m.upcase ) ]="-"
        end
        c
    }.join
end

DATA.each{ |line|
    num, input, expected = line.split(/\s+/)
    actual = solve( input )
    r=actual==expected ? "OK" : "****NG****"
    puts "%s : %s ➡ %s / %s" % [ r, input, actual, expected ]
}
__END__
1   6:NABEbBZn  -ZAB-E
2   1:A A
3   1:Aa    -
```

いつもどおり、テストデータの大半は省略。

メソッドが長い。反省。

席番号の配列(というか、Range)に対して評価関数(というか、評価ブロック)を作り、最小値のものを採用するという戦略。

評価関数ぐらい名前をつけて出すべきだったんじゃないの、とは思う。
副作用のある処理が殆どない(配列の書き換えも副作用を利用していない)ようにしてみたが、index でのアクセスまでは無くしていない。
２次元マップを作ってみた RDMatrixView

縦横スクロールできるマップを作ってみました。

使い方は

xibファイルでUIScrollViewとしてオブジェクトをはりつけ、RDMatrixViewにクラス名を指定、matrixDelegateをつなげます。

コード上で大きさ取得用のマップ用のビューを一枚と横と縦の枚数を設定し、
プロトコルを実装します。プロトコルでは縦横で指定された位置のビューを返せばOKです。

タップにも最低限対応しています。

すこしづつ改善していきたいです。

https://github.com/KatagiriSo/RDMatrixView
Vim + Rails + ctags


## 目的

* Macで動く
* Railsプロジェクト内のソースはもちろん
* 依存するgemsも参照したい
* 出来れば自動で

## 道のり

Macはctags入っているけど古いのでbrewでいれる。
古いMacだと入ってないかもしれないので、その場合もbrewでいれる。

```sh
brew install ctags
```

古い方向いているので、alias向けておこう。

任意のディレクトリで、

```sh
ctags -R
```

とかやると、tagsが生成される。

gemsだけなら、

```sh
ctags -R `bundle show --paths`
```

でワンライナーでいけるっぽい。

要するに上のふたつをvimでAutoCommandすりゃいい。

## 結果

で、結果として、素晴らしいpluginがあった。
書かなくてよかった。

vim-tags
https://github.com/szw/vim-tags

Vundlerなどでインストールして軽く設定する。

```viml:ctags.vim
let g:vim_tags_project_tags_command = "/usr/local/Cellar/ctags/5.8/bin/ctags -f .tags -R {OPTIONS} {DIRECTORY} 2>/dev/null &"                                                                                                    
let g:vim_tags_gems_tags_command = "/usr/local/Cellar/ctags/5.8/bin/ctags -R -f .Gemfile.lock.tags `bundle show --paths` 2>/dev/null &"

set tags+=.tags
set tags+=.Gemfile.lock.tags
```

デフォだと古いctagsが動いちゃって困るので、fullpathで書いておく。
もしくは/usr/bin/ctagsを消してsymlink貼るなど。オススメしないけど。

あと、デフォルトで生成されるtags, Gemfile.lock.tagsという名前が気に入らなかったので、先頭に.(dot)をつけた。
.gitignoreに書いておこう。

forkして書き換えた方が良かったかなとも思いつつうまく動いているのでよし。
[Rails]assetsのログが大量すぎたのでなくしてきれいにした

ログに大量にassetsのログが出て見たい箇所を追いづらいのできれいにしてみました。

参考
http://rainbowdevil.jp/?p=1074
https://github.com/rails/rails/issues/2639#issuecomment-2252326

## configにassetsのログを出さない設定ファイルを作る

下記の各railsのバージョンによって下記ファイルを作ってあげれば良いみたいです。

rails3.1の場合

```ruby:config\initializers\quiet_assets.rb
Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def before_dispatch_with_quiet_assets(env)
    before_dispatch_without_quiet_assets(env) unless env['PATH_INFO'].index("/assets/") == 0
  end
  alias_method_chain :before_dispatch, :quiet_assets
end
```

rails3.2の場合

```ruby:config\initializers\quiet_assets.rb
Rails.application.assets.logger = Logger.new('/dev/null') 
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end
```

## それでもWARNINGが残ったので対応する

下記WARNINGが大量に残ってました。

```
WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
```

下記サイトによるとWARNING自体に問題はなく、ウザいのであればパッチをあてればいいとの事。
http://d.hatena.ne.jp/ria10/20120209/1328757610

ただ、下記サイトによるとwebrickでの問題のようでthinで起動すればWARNINGは出ないとの事だったのでthinで動かしてログがきれいになりました。
http://d.hatena.ne.jp/kitokitoki/20120407/p1
第7回オフラインリアルタイムどう書く

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

Array.method('find', function(n){
    for (var i = 0; i < this.length; ++i) {
        if (this[i] === n) {
            return i;
        }
    }
});

function updateChairs(a, n, s){
    if (s.match(/[A-Z]/)) {
        a[n] = s;
    }
    else {
        a[a.find(s.toUpperCase())] = undefined;
    }
}

function getNextChair(a){
    if (a.length <= 2) {
        return a[0] === undefined ? 0 : 1;
    }
    for (var i = 0; i < a.length; ++i) {
        if (a[i - 1] === undefined && a[i] === undefined && a[i + 1] === undefined) {
            return i;
        }
    }
    for (var i = 0; i < a.length; ++i) {
        if (a[i] === undefined && a[i + 1] === undefined) {
            return a[0] === undefined ? 0 : i;
        }
    }
    return a.find(undefined);
}

function ans(a){
    var ret = '';
    for (var i = 0; i < a.length; ++i) {
        ret += a[i] === undefined ? '-' : a[i];
    }
    return ret;
}

function solve(s){
    var numOfChairs = parseInt(s.split(':')[0], 10);
    var a = new Array(numOfChairs);
    var nextChair = 0;
    s = s.split(':')[1];
    for (var i = 0; i < s.length; ++i) {
        updateChairs(a, nextChair, s.substr(i, 1));
        nextChair = getNextChair(a);
    }
    return ans(a);
}

test('ord7_1', function(){
    var input = '6:NABEbBZn';
    deepEqual(solve(input), '-ZAB-E');
});
```
Three.jsでカーソルとの衝突判定する方法


Three.jsにはRaycasterという便利なものがついており、これを使って視線衝突を判定することができる。

まず画面上でのマウスの位置をベクトルに変換する

```
var projector = new THREE.Projector();
var mouseX = e.clientX -getElementPosition(renderer.domElement).left;
var mouseY = e.clientY - getElementPosition(renderer.domElement).top;
var x = (mouseX / renderer.domElement.width) * 2 - 1;
var y = -(mouseY/renderer.domElement.height) * 2 + 1;
var vector = new THREE.Vector3(x, y, 1);
projector.unprojectVector(vector, camera);
```

次にRaycasterを作成する。

```
var vector = 
var ray = new THREE.Raycaster(
			camera.position,
			vector.sub(camera.position).normalize());
// 視点位置から対象オブジェクトへのベクトル
```

```
var intersects = ray.intersectObjects(BB.eventMeshList);
```

このintersects[i].objectに衝突したオブジェクトのmeshが入っているのでこれを好きなように使えばよい。

参考：http://www.yomotsu.net/wp/?p=600
GitHubのコミットメッセージで英語の勉強


Qiita Hackathon、今回のテーマは「GitHub APIを用いた開発」
ということで、「GitHubのコミットメッセージを英語の勉強に活用しよう」
という趣旨でアプリを作ってみました。

今回はAngularJSを用いてフルJavaScriptで実装しました。

### 使い方
+ http://yuch.github.com/angular/app/ を開く
+ 参考にするレポジトリを探すためにキーワードで検索する
+ 一覧からレポジトリをクリック
+ コミットメッセージで使われている英単語と例文（実際のコミットメッセージ）がずらずら表示されます
+ 知ってる単語/不要な単語は「i know」ボタンを押す
+ 覚えたい単語は「Study」ボタンを押す

※ データはブラウザのクッキーに保存されます。
※ 対応ブラウザ: Chrome/Firefox

### 感想

ネタに迷走しすぎて結局1日目の帰宅後に、作るはめになってしまいました。
今回はAngularJSの勉強を主な目的としていたので、AngularJSを勉強しながら開発していました。
AngularJSのネタについては近々投稿していきたいと思います！
ファイルの暗号化したい&&簡単アクセスを両立させる

Google の 2 段階認証のバックアップコードのように絶対に他人に見られてはいけないが，アクセスしたい時にアクセスできないと困るので Dropbox(https://www.dropbox.com/) や Catch(https://catch.com/) に入れておきたいデータを管理する Tips をお届けします

# 暗号化

`gpg` を使います

    gpg -c ファイル名

とやるとパスフレーズを聞かれるのでできるだけ長いパスフレーズを打ちます  
今回は管理を簡略にするため公開鍵ではなく共通鍵を利用するのでできるだけ長いパスフレーズを心がけてください  
パスフレーズを打つと `ファイル名.gpg` というファイルができます

復号化するときは

    gpg ファイル名

とやるとパスフレーズが聞かれるので答えます

このファイルは Dropbox に突っ込めます

# Base64 エンコード

ファイルだと Catch には突っ込めないので Base64 エンコードします

    base64 ファイル名 > Base64エンコード済みファイル

とやると Base64 エンコードされます
標準出力に吐かれるのでリダイレクトしましょう

この状態なら Catch に貼れます

デコードは

    base64 -d ファイル名 > Base64デコード済みファイル

とやります  
こちらも標準出力に吐かれるのでリダイレクトします

# スクリプトで自動化

`gpg` のパスフレーズ入力をスクリプトで行うには

    echo パスフレーズ | gpg --passphrase-fd 0 --batch -c ファイル名

というようにパイプでパスフレーズを渡してやるとうまく行きます

これで『暗号化』・『お手軽アクセス』を両立できると思います

# まとめ

`gpg` も `base64` も UNIX 環境であれば最初から入っていることが多いと思うのでどこでもお手軽に使えます  
お試しあれ
LVMで新たにディスクを追加して既存のLVを拡張する


容量が足りなくなったときに、新しいディスクを追加して既存のVG・LV・ファイルシステムを拡張する手順。


## 新しいディスク上にPVを作成

新しいディスク上にPVを作成する。fdiskパーティションを作成しておく必要はない。
以下は /dev/sdg 上にPVを作成する場合の実行例。

```
# pvcreate /dev/sdg
  Physical volume "/dev/sdg" successfully created
```

## 拡張したいLVが含まれるVGに新しいPVを追加

以下は既存のVG VolGroup00 にPV /dev/sdg を追加する場合の実行例。

```
# vgextend VolGroup00 /dev/sdg
  Volume group "VolGroup00" successfully extended
```

vgdisplay を実行し実行結果の" --- Physical volumes ---" の部分を見ることで、新しいPVが追加されたことを確認できる。

```
# vgdisplay -v VolGroup00
    Using volume group(s) on command line
    Finding volume group "VolGroup00"
　　　・
　　　・
　　（中略）
　　　・
　　　・   
  --- Physical volumes ---
  PV Name               /dev/sdf     
  PV UUID               MJ1JPJ-2kCu-Q3i9-ep6T-T2sn-oDEy-WA6Jw0
  PV Status             allocatable
  Total PE / Free PE    25599 / 0
   
  PV Name               /dev/sdg     
  PV UUID               fTHPYv-A4GM-JP9X-Ru0P-qJwn-W6wq-XoZRt6
  PV Status             allocatable
  Total PE / Free PE    25599 / 25599
```

## LVの拡張

lvextendを実行することで、拡張されたVGの未使用領域をLVに追加できる。以下はVG上の未使用領域のすべてをLVに追加する場合の実行例。

```
# lvextend -l +100%FREE /dev/VolGroup00/LogVol00
  Extending logical volume LogVol00 to 199.99 GiB
  Logical volume user successfully resized
```


## ファイルシステムの拡張

LVを拡張してもファイルシステムは以前の大きさのままなので、最後にファイルシステムの拡張も行う必要がある。

ext3/ext4の場合、resize2fsを実行する。この処理は数分かかる。

```
# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /var/.....; on-line resizing required
old desc_blocks = 7, new_desc_blocks = 13
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 52426752 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 52426752 blocks long.
```

処理完了後、dfコマンドでファイルシステムが拡張されたことを確認する。

```
# df -h /var/.....
Filesystem            Size  Used Avail Use% マウント位置
/dev/VolGroup00/LogVol00
                      197G   88G  100G  47% /var/.....
```
今年の素数日を計算してみる

2012年の素数日は[以前計算した](http://qiita.com/items/33f2ada36d2871421c8a)のだが、今年2013年の素数日も計算してみる。
前のコード、コマンドライン第１引数を年と解釈して計算するように仕様を変えた。

```haskell:primedays.hs
import Data.Time.Calendar
import System (getArgs)
isPrime n=not $ or $ map (\a->n `mod` a==0)
            $ takeWhile (\i->i*i<=n) [2..]
primeDays y=map (\a->filter (/= '-') $ show a) $ takeWhile (< fromGregorian (y+1) 1 1) 
      $ iterate (\d->addDays 1 d) $ fromGregorian y 1 1
main=do
  args<-getArgs
  case args of
    y:_ ->mapM_ (\a->putStrLn a) $ filter (isPrime.read) $ primeDays $ read y
    _ ->putStrLn "Usage: primedays <year>"
```

実行してみる

```sh:
> ghc primedays
> primedays 2013
20130203
20130223
20130403
20130413
20130503
20130521
20130527
20130529
20130707
20130829
20131019
20131031
20131103
20131109
20131117
20131129
20131207
20131211
20131217
20131229
```

ということで、今日2/3の次は2/23のようです。
素数萌えの皆さん、参考まで。
恐ろしく時間がかかる正規表現の例

```js
/(A*)*B/.test("AAAAAAAAAAAAAAAAAAAAAAAAAAA")
```
最初の(A*)*が組み合わせ爆発を起こしていて、
なおかつ最後のBにはいつまでたってもマッチしないので、
全ての組み合わせをテストし続けるんだそうです。
ローディング中のぐるぐる機能つきの UIImageView


ネットワークから画像を読み込むときとか、読み込み中は `UIActivityIndicatorView` を出しておきたかったので作ってみました。

クラス名がいいものが思いつかなかったです ><
なんかキラキラした名前下さい！！

```
class LoadableImageView < UIImageView
  attr_accessor :loading, :loading_view

  def initWithFrame(rect)
    super
    @loading = false
    @loading_view = UIActivityIndicatorView.alloc.initWithActivityIndicatorStyle(UIActivityIndicatorViewStyleWhite).tap do |lv|
      lv.color = UIColor.blackColor
    end
    self
  end

  def loading=(loading)
    if loading
      self.image = nil
      addSubview(@loading_view)
      @loading_view.startAnimating
    else
      @loading_view.stopAnimating
    end
  end

  def layoutSubviews
    super
    w = 30
    h = 30
    x = (self.frame.size.width/2.0 - w/2)
    y = (self.frame.size.height/2.0 - h/2)
    @loading_view.frame = [[x, y], [w, h]]
  end
end
```

## 使い方

```
image_view = LoadableImageView.new
# ぐるぐる出す
image_view.loading = true
# ぐるぐるやめる
image_view.loading = false
```

ここまで書いて思ったのですが、`image`プロパティが `nil` のときに自動的にぐるぐるした方が使いやすいかもですね。
カメラアプリを作るとき

バージョン情報表示などの画面遷移を伴う処理はアプリケーションバーに置くよりメニューにおいた方が良い？
なぜならカメラが初期化を終える前に画面遷移してしまう(カメラの内部エラーで落ちることがある)可能性をなるべく減らすため。
これでもカメラ初期化前に画面遷移する可能性は0にはならないが、この状態でカメラ初期化時にエラーを起こすにはよほど意識して操作する必要がある。

そのうちカメラの基本的な操作方法とあわせてブログにまとめるかも。
逆Fizzbuzzを少し見やすく。 #nascala

[第9回なごやかscala](http://partake.in/events/3896c379-6e8a-4e43-afe4-bbde0330b228)で話題になった、逆FizzbuzzのScalaコードを自分なりに見やすくした。根本的なアルゴリズムは変えていない。

```scala:InverseFizzbuzz.scala
  def fizzbuzzes(range : Seq[Int]) =
    range.map(x => (x%3, x%5)).collect {
      case (0, 0) => "fizzbuzz"
      case (0, _) => "fizz"
      case (_, 0) => "buzz"
    }

  val all = for {
    a <- (1 to 100)
    b <- (a to 100)
  } yield (a to b)

  val io = all.map (input => (input, fizzbuzzes(input)))

  def answer(expected : Seq[String]) = io.
    filter { case (i, o) => o == expected }.
    minBy { case (i, _) => i.length }.
    _1
```

参考:
* [逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記](http://d.hatena.ne.jp/matarillo/20120515/p1)
* [逆FizzBuzz問題をScalaで解こう（その４）- スノトラさんのつれづれ日記](http://d.hatena.ne.jp/sunotora/20130130)
TheanoをMac OS Xにhomebrewでinstallする方法


[こちら](http://qiita.com/items/3fbf6af714c1f66f99e9)でも紹介されているDeepLearningが書きやすいTheanoですが、homebrewで入れることができたので、やり方を書きます。

もし、[Scipy Superpack](http://fonnesbeck.github.com/ScipySuperpack/)を使っていたら先に削除しておく方がよいでしょう。

[こちら](https://github.com/samueljohn/homebrew-python)のレポジトリからScipyを入れれば、theanoも入ります。
Pythonはhomebrewで入れておきました。

```
brew tap samueljohn/python
brew install scipy
pip install Theano
```

0.6rc2では、testをした際にいろいろエラーが出てしまいます。

```
python -c 'import theano; theano.test()'
```

```snip
E00001	#include <Python.h>
00002	#include <iostream>
00003	#include <numpy/arrayobject.h>
00004	#include <math.h>
00005	#include <numpy/arrayscalars.h>
00006	//////////////////////
00007	////  Support Code
00008	//////////////////////
00009	
00010	
00011	    struct __struct_compiled_op_d294414d3fa581b0e3ab72b870c38ab1 {
00012	        PyObject* __ERROR;
00013	
00014	        PyObject* storage_V3;

(中略)

Problem occurred during compilation with the command line below:
g++ -dynamiclib -g -O3 -Wno-write-strings -Wno-unused-label -Wno-unused-variable -fno-math-errno -D NPY_ARRAY_ENSURECOPY=NPY_ENSURECOPY -D NPY_ARRAY_ALIGNED=NPY_ALIGNED -D NPY_ARRAY_WRITEABLE=NPY_WRITEABLE -D NPY_ARRAY_UPDATE_ALL=NPY_UPDATE_ALL -D NPY_ARRAY_C_CONTIGUOUS=NPY_C_CONTIGUOUS -D NPY_ARRAY_F_CONTIGUOUS=NPY_F_CONTIGUOUS -fPIC -undefined dynamic_lookup -framework Python -m64 -I/usr/local/lib/python2.7/site-packages/numpy/core/include -I/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/include/python2.7 -o /Users/user/.theano/compiledir_Darwin-12.2.1-x86_64-i386-64bit-i386-2.7.3/tmpvvh7I_/d294414d3fa581b0e3ab72b870c38ab1.so /Users/user/.theano/compiledir_Darwin-12.2.1-x86_64-i386-64bit-i386-2.7.3/tmpvvh7I_/mod.cpp -L/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib
```

おそらく、動的に生成したCのコードをコンパイルできなかったのでしょう。

気を取り直してgitの開発版にupgradeします。

```
pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
```

Warningはいくつかでるものの、無事testが通りました。

[DeepLearningチュートリアル](http://deeplearning.net/tutorial/intro.html)のコードをcloneします。
（使うデータの概要は、[Getting Started](http://deeplearning.net/tutorial/gettingstarted.html)に書いてあります)

```
git clone git://github.com/lisa-lab/DeepLearningTutorials.git
```

[ロジスティック回帰のサンプル](http://deeplearning.net/tutorial/logreg.html#logreg)を動かしてみます。

```
cd DeepLearningTutorials/code
python logistic_sgd.py
```

このような出力が出ました。
大体エラーの数値も同じくらいになりました。

```
…
epoch 74, minibatch 83/83, validation error 7.479167 %
     epoch 74, minibatch 83/83, test error of best model 7.489583 %
Optimization complete with best validation score of 7.479167 %,with test performance 7.489583 %
The code run for 75 epochs, with 3.206806 epochs/sec
```

<Strike>ちなみに、この方法だとmatplotlibが入りませんでした。。。困った。</Strike>
→XCodeのアップデート後に、Command Line Toolsをインストールしなおしていないだけでした。。。初歩的すぎた。
そして、Qiitaは取消線サポートしてないのね。辛い。。。

困ったら、``brew doctor``は大事ですね。