OmniAICreator/Qiita-1.07M huggingface dataset:
qemuでneonをつかってみる

##開発環境を整備
とりあえず，neon命令を吐き出すコードをコンパイルしなきゃ話にならんので，開発環境を整備する．
基本的にintrinsic関数を使って開発するので，ubuntuならば以下のように適当にarm用のgccを導入しておけば多分大丈夫．(なんか色々と関係ないパッケージも一緒に入れた気がするので実は不十分かも)

```sh
% sudo apt-get install gcc-4.6-arm-linux-gnueabi
```
##qemuを導入
qemuにはシステム全体をエミュレーションするシステムモードと，実行バイナリを異なるCPUアーキテクチャ上のLinuxで動作させるユーザーモードが存在する．
今回はただ単純にneon命令を含んだバイナリを実行したいだけなので後者を導入する．
ubuntuならは以下のパッケージを導入するだけでなんとかなるはず．

```sh
% sudo apt-get install qemu-user
```
##neon命令を含むバイナリを動かす
とりあえず，以下のベクトルの和を計算するサンプルプログラムで動作検証することにする．

```c:neon_test.c
#include <arm_neon.h>
#include <stdio.h>

int main(int argc, char const* argv[])
{
    char buf1[] = { 0,1,2,3,4,5,6,7 };
    char buf2[] = { 8,9,10,11,12,13,14,15 };
    char buf3[8];
    uint8x8_t a;
    uint8x8_t b;
    uint8x8_t c;

    a = vld1_u8( buf1 );
    b = vld1_u8( buf2 );
    c = vadd_u8( a, b );
    vst1_u8( buf3, c );

    for( int i = 0; i < 8; i++ )
    {
        printf("%d\n",buf3[i]);
    }

    return 0;
}
```
んで，以下のようにコンパイル．

```sh
% arm-linux-gnueabi-gcc-4.6 -mfpu=neon -std=c99 sample.c -o sample
```
そして，実行．

```sh
% qemu-arm  -L /usr/arm-linux-gnueabi/ sample
8
10
12
14
16
18
20
22
```
なんか，ちゃんと動いてるっぽいね！！
Elixir のインストール&アップデート on Mac

# Elixir
Elixir は Erlang VM 上で動くので、Erlang をインストールしてから、Elixir をインストールする。

*以下の手順では Erlang から入れてますが、brew install elixir だけでも勝手に Erlang もインストールしてくれました。*

# Erlang のインストール
version R16B02 をインストールした

```bash
$ brew install erlang

$ erl 
Erlang R16B02 (erts-5.10.3) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.3  (abort with ^G)
```

Hello World までやろうと思ったけど、少し[敷居](http://www.erlang.org/faq/getting_started.html)が高かった。

# Elixir のインストール
version v0.11.2 をインストールした

```bash
$ brew install elixir
$ iex
Erlang R16B02 (erts-5.10.3) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (0.11.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> IO.puts "Hello World"
Hello World
:ok
```

# Elixir のアップデート
```bash
$ brew update
$ brew unlink elixir
$ brew install elixir
```

## v0.11.2 から v0.13.2 へアップデートするときにエラーが起きた

上記の手順でアップデートしたが以下のエラーが出た

```bash
$ brew install elixir
elixir: Erlang 17 is required to install.

You can install this with:
  brew install erlang --devel

Or you can use an official installer from:
  http://www.erlang.org/
Error: An unsatisfied requirement failed this build.
```

メッセージにしたがって erlang を --devel 指定で入れて elixir も入れたらアップデートできた。

```bash
$ brew install erlang --devel
$ brew install elixir
```

# First Impression

string interpolation が使える。いいね!

```iex
iex> x = "World"
"Hello #{x}"
```

型のことなるもの同士を比較できる。次の順番通りらしいけど、どういうときにメリットがあるのだろう？`number < atom < reference < functions < port < pid < tuple < list < bitstring`

```iex
iex> 1 < :atom
true
```

あと、これ書いてて気づいたけど、Qiita の Markdown パーサが Elixir サポートしているのもすごい。しかも iex もサポートしているとか。

# SEE ALSO
[Getting Started](http://elixir-lang.org/getting_started/1.html)
ScipyでCORDIC

加算，減算，シフト演算だけで三角関数を計算出来るというアレです．
詳細はここのページが非常に解りやすかった．
実際に書いてみたコードは浮動小数点数で演算してるんで，シフト演算の代わりに乗算を使用．
それにしても，よくこんなアルゴリズムを思いつくなぁ．

以下，コードと実行結果．

```python:cordic.py
#!/usr/bin/env python
from __future__ import division
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
import math

term_num = 17
thetas =  map( lambda x : math.atan( 1.0 / math.pow( 2.0,x ) ) , range( term_num  + 1) )
hypot_length =  1.0 / reduce( lambda x,y:  x * ( 1.0 / math.cos(y) ) ,thetas,1.0 )

def cos_cordic( angle ):
        x,y = (1.0,1.0)
        acc_theta = thetas[0]
        scale_ratio = 1.0
        for i,theta in enumerate( thetas[1:] ):
                x1,y1 = x,y
                scale_ratio *= 0.5
                if acc_theta < angle :
                        acc_theta += theta
                        x -= scale_ratio * y1
                        y += scale_ratio * x1
                else:
                        acc_theta -= theta
                        x += scale_ratio * y1
                        y -= scale_ratio * x1
        return ( x * hypot_length )


if __name__ == '__main__':
        t = [ x * ( math.pi / 200.0 ) for x in range( 100 ) ]
        result = map( cos_cordic,t )

        plt.plot( result )
        plt.show()
```

![cordic.png](https://qiita-image-store.s3.amazonaws.com/0/16415/95914414-a623-7ce8-9589-48de0481b4a3.png)
ScipyでLPC

LPCによってAR係数を取得後ホワイトノイズで駆動させてみた.
いい感じに声がロボット（？）っぽくなった気がする．
あと，駆動するノイズを変更すればまた違った声質になるはず.

```python:lpc.py
#!/usr/bin/env python

import sys
import wave
import urllib2
import getopt
import scipy as sp
import matplotlib.pyplot as plt
from scipy import linalg, signal
from scikits.talkbox.linpred.levinson_lpc import lpc

if __name__ == "__main__":
    optlist, argv = getopt.getopt( sys.argv[1:], 's:l:o:w:')

    frameLength = 512
    stepWidth = 256
    lpcOrder = 32
    chunk = 44100 * 5
    for opt, val in optlist:
        if( opt == '-s' ):
            chunk = int( val )
        elif( opt == '-w' ):
            stepWidth = int( val )
        elif( opt == '-l'):
            frameLength = int( val )
        elif( opt == '-o' ):
            lpcOrder = int( val )

    argc = len( argv )
    if( 0 < argc ):
        if( argc == 2 ):
            inFileName, outFileName = argv
        elif( argc == 1 ):
            inFileName = argv[0]
            outFileName = 'out.wav'
        wo = wave.open( inFileName, 'rb' )
    else:
        outFileName = 'out.wav'
        url = 'http://www.it.ice.uec.ac.jp/SRV-DB/archive/HENSHU00_PF00/HENSHU00_PF00_0951.wav'
        wo = wave.openfp( urllib2.urlopen( url ).fp,  'rb' )

    data = sp.fromstring( wo.readframes( chunk ), sp.int16 )
    blockData = sp.linalg.toeplitz( data[ frameLength:], data[:frameLength] )[::stepWidth, :]

    lpcCoef, lpcError, k = lpc( blockData,  lpcOrder )
    excitationSignal = sp.random.randn( frameLength )

    rows, cols = lpcCoef.shape
    responseSignal = sp.zeros( ( rows,  frameLength ) )
    synthesisSignal = sp.array( [0] * ( rows  * stepWidth + frameLength ) )
    weight = sp.sin( 2 * sp.pi * sp.r_[0:frameLength] / frameLength )
    for i in range( rows ):
        G = sp.sqrt( lpcError[ i ] )
        responseSignal[i, :] = sp.signal.lfilter( [G], lpcCoef[ i, :], excitationSignal )
        synthesisSignal[ i * stepWidth:i * stepWidth + frameLength ] +=  weight * responseSignal[ i, :]

    outputSignal = sp.int16( synthesisSignal ).tostring()
    wo = wave.open( outFileName, 'wb')
    params = ( 1, 2, 44100, len( synthesisSignal),'NONE','none')
    wo.setparams( params )
    wo.writeframes( outputSignal )
    wo.close()
```
Ruby project template (on Progress)



## Clone and change it to your git project

Clone a project as normal.

```terminal
git clone git://github.com/shinokada/ruby_project_template.git your_project_name
```

Then change directory into your_project_name and remove the origin remote:

```terminal
git remote rm origin
```

Add your own remote if you have one.

```terminal
git remote add origin <git link to your project>
```

This template has followings.

- Gemfile
- .gitignore
- lib dir
- rspec dir
- .rspec

## Gemfile

```Gemfile

source 'https://rubygems.org'
ruby '2.0.0'



```

## .gitignore

Sample file

```.ignore

# See http://help.github.com/ignore-files/ for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
#   git config --global core.excludesfile '~/.gitignore_global'

# Ignore bundler config.
/.bundle

# for rails
# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal

# Ignore all logfiles and tempfiles.
/log/*.log
/tmp

# Ignore other unneeded files.
doc/
*.swp
*~
.project
.DS_Store
.idea
bundler_stubs/
spec/reports
test/tmp
test/version_tmp

```
★質問★[Rails3]Deviseを利用してユーザー管理。さらに居住地の情報を追加。

①Deviseを利用。


②addressテーブルを作成。そのときのマイグレーション。

```rails:2013XXXXXXXXXX_create_addresses.rb
class CreateAddresses < ActiveRecord::Migration
  def change
    create_table :addresses do |t|
      t.string :name, :null => false

      t.timestamps
    end
  end
end
```

③address_idをuserテーブルにぶっこむ。そのときのマイグレーション。

```rails:2013XXXXXXXXXX_add_address_id_to_users.rb
class AddAddressIdToUsers < ActiveRecord::Migration

  def self.up
    add_column :users, :address_id, :integer
    add_index :users, :address_id
  end

  def self.down
    remove_index :users, :column => :address_id
    remove_column :users, :address_id
  end  
end
```

④デフォルト値の設定。新規ユーザー登録がされたとき常にaddress_idを1にデフォルトとして設定したい。ここの方法が分からない。どなたかアンサー下さい。
feedparserで自動的にねこ画像を拾ってくる

諸事情でねこ画像を大量に集める必要が出てきた時のためのプログラム。 
まずはpipでfeedparserをインストール。

```
$ sudo pip install feedparser
```

そしてこれが本体。picasaから取ってきてる。

```py:get_cat.py
# -*- coding: utf-8 -*-
import feedparser
import urllib
import os


def download_picture(q, count=10):
    u"""qの画像をcount件 取ってくる。"""
    count = str(count)
    feed = feedparser.parse("https://picasaweb.google.com/data/feed/base/all?q=" + q + "&max-results=" + count)
    pic_urls = []
    for entry in feed['entries']:
        url = entry.content[0].src
        if not os.path.exists(os.path.join(os.path.dirname(__file__), q)):
            os.mkdir(os.path.join(os.path.dirname(__file__), q))
        urllib.urlretrieve(url, os.path.join(os.path.dirname(__file__), q, os.path.basename(url)))
        print('download:' + url)

if __name__ == "__main__":
    download_picture("cat", 10)
```
Git notes


## Clone and change it to your git project

Clone a project as normal.

```terminal
git clone git://github.com/RiverGlide/ruby_project_template.git your_project_name
```

Then change directory into your_project_name and remove the origin remote:

```terminal
git remote rm origin
```

Add your own remote if you have one.

```terminal
git remote add origin <git link to your project>
```
bootstrap3でテーブルを使う。

```html
<table class="table">
    <thead>
        <tr class="色">
            <th>見出し1</th>
            <th>見出し2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>テーブルセル</td>
            <td>テーブルセル</td>
        </tr>
    </tbody>
</table>
```

基本はこちらの形になります。
bootstrapでは他にもclassを追加することで、テーブルの外観を変更できます。

###行の色を交互に変更

```html
<table class="table table-striped">
```
tableのclassにtable-stripedを追加します。

###テーブルに縦線を追加

```html
<table class="table table-bordered">
```
tableのclassにtable-borderedを追加します。


###見出しの行の色を変更
theadのtrのclassに"色"と入っていますが、そこに希望の色のclassを指定します。

```html
<tr class="danger">
```

色は以下の5種類あります。
・指定無し:白
・danger:赤
・active:灰色
・success:緑色
・warning:黄色
ドキュメントの作り方


開発を進めていくうちにドキュメントは作っておきたいけど、面倒そうだなってことがあると思います。そこでDoxygenとGraphvizを使ってドキュメントを生成する方法を共有します。

個人的にドキュメントを生成するサーバにDebianを使っているので、DoxygenとGraphvizはapt-getコマンドでインストールできます。

```
$ sudo apt-get install doxygen

$ sudo apt-get install graphviz
```

Macの方はこちらの記事がとても分かりやすいです。
http://d.hatena.ne.jp/eitya/20110623/1308826061

インストールが終わるとdotコマンドとdoxygenコマンドが使えるようになっています。
コマンドが使えない方はパスを通してください。

プロジェクトのルートディレクトリに移動して、以下のコマンドでドキュメントを生成するための設定ファイルを作ります。

```
$ doxygen -g
```

Doxyfileという名前で設定ファイルが生成されます。
そのファイルを開いて言語の設定や対象とするファイルの設定を行います。

個人的にプロジェクトのlibsディレクトリはドキュメント化から省くように設定しました。プロジェクトによって変わる所があると思いますが、だいたい以下の項目を設定しました。

```
PROJECT_NAME = "Cocos2d-x Test Project"
OUTPUT_LANGUAGE = Japanese
FILE_PATTERNS = *.cpp *.h *.mm *.java
SOURCE_BROWSER = YES
ALPHABETICAL_INDEX = YES
EXTRACT_ALL = YES
GENERATE_LATEX = NO
HAVE_DOT = YES
CALL_GRAPH = YES
CALLER_GRAPH = YES
EXCLUDE_PATTERNS = */cocos2dx_test/libs/*
```

そして、設定ファイルがあるディレクトリで以下のコマンドを実行するとhtmlディレクトリが生成されます。

```
$ doxygen
```

htmlディレクトリの中のindex.htmlをブラウザで開いてみてください。

![ss_12-08-2013_21-18-44.png](https://qiita-image-store.s3.amazonaws.com/0/9950/cc07dc59-336b-9238-96a6-b5c9dddbd8fd.png)

クラス同士の関係が図で表示され、メソッドの詳細なども表示されたと思います。

さらにクラスやメソッドの説明をしっかり書いたり、ドキュメントの生成を定期的に行うようにすることで、もっと見やすいドキュメントになっていきます。

説明の書き方は以下が参考になります。
http://www.02.246.ne.jp/~torutk/cxx/doxygen/doxygenstyles.html
RubyMotion アプリのメモリ関連の不具合を簡単に探す方法(2)


以前に書いた[RubyMotion アプリのメモリ関連の不具合を簡単に探す方法](http://qiita.com/watson1978/items/ebae20f2e4bb3490dba7)という方法は忘れてください。

 Instrumentsだけで調査することができたようです。

## 1. Instrumentsを起動する

`rake profile`コマンドで`Instruments.app`を動かします。

```
% rake profile template="Zombies"
```

Instrumentsが起動したあと、アプリの不具合が発生する手順を再現します。

![131206-0001.png](https://qiita-image-store.s3.amazonaws.com/0/2075/881b9f1b-38b4-e793-3e74-6abb81788bae.png "131206-0001.png")

あとは、以下の図の操作を行っていただければ、簡単に`autorelease`が呼び出され、意図せずにオブジェクトが解放されている箇所がわかります。

![131208-0005-14.png](https://qiita-image-store.s3.amazonaws.com/0/2075/c80e2c6f-a3ae-45dd-50be-e93ad1122431.png "131208-0005-14.png")

![131208-0006-15.png](https://qiita-image-store.s3.amazonaws.com/0/2075/912dcb01-938f-061d-1a90-f724e71d240a.png "131208-0006-15.png")

![131208-0007-4.png](https://qiita-image-store.s3.amazonaws.com/0/2075/b0872656-e53e-4ae0-88eb-a557fbf302e1.png "131208-0007-4.png")
開発プロジェクトに入ったら知りたいこと、伝えることリスト


## 初めに

* 個人的な環境によりWeb系開発の話になっております。
* 気付き次第追加します。
* 追加希望は、コメントかプルリクエストでお願いします。

## 目的

* 新しいプロジェクトを始める時のドキュメントやルール作りの簡略化
 * コミュニケーション・学習コストを下げる
 * ドキュメント作成コストを下げる
* リスト化で項目の抜け漏れをなくす

### プロジェクトに入るエンジニア側のメリット

* 開発プロジェクトに入ったら、すぐに仕事に入れるようにスムーズに情報が得られる
* 毎回誰かに聞くと時間もかかるし、作業が進まない事態を防ぐ (誰かの作業も止めたくない)

### 受け入れるチーム側のメリット

* 途中から入った人に、できるだけ早く、スムーズに開発に入ってもらう
* ルールから外れたコードをできるだけ生み出さないようにする

## 開発環境

### ハードウェア

* PC (ID, password)
 * ディスプレイ
 * キーボード
 * マウス
* 検証、テスト用ハードウェア(検証端末)
* ネットワーク環境 (使えるイーサネット、ハブ, wifi ssid)
* 使って良い電源(コンセント)とその数
* サーバ環境

### ソフトウェア

* プログラミング環境、ツール
* ID,パスワード
 * PC
 * サーバ
 * メール

### 権限

* 集中管理(LDAP等)? 個別にID発行?

### ツール

* チャット (IRC, Skype, ChatWork, HipChat, etc)
* ドキュメント (wiki, Google Docs, etc)
* プロジェクト管理ツール (Redmine, JIRA, etc)
* 社内情報共有(ポータルサイト?wiki?SNS?)

## プログラミング

## ルール・規約

* コーディング・ルール
* ネーミング・ルール
  * コード内変数、クラス名
  * ディレクトリ構造、ディレクトリ名
  * ファイル名(prefix, postfix): アンダースコアか?ハイフンか? 日付?
  * DBのテーブル名、フィールド名等

## コード内のルール

* 日付の扱い方 (timestamp, ISO?)

## コード管理

* ソースコード管理ツール(subversion, git, etc)
* ブランチ・ルール 
* コミット・ルール
* コードレビューのルール
 * 誰がコードレビューするのか?
* マージのルール
 * 誰がマージするのか?
* デプロイのルール
 * 誰がいつどうやってデプロイするのか?
 * デプロイ履歴は、どう追うのか?

## テスト

* ユニットテストの方法
* テストのフロー (unit test,自動テスト, QA?)

## プロジェクト進行

* ミーティングの開催方法
* 進捗報告、確認方法
* タスクの登録方法
* バグの報告方法
* 自分のタスクの優先順位は、誰がどのように決めるのか?

## プロジェクト概要

* 会社全体の目的や方向性
* 会社における該当プロジェクトの位置づけや目的、ゴール
* プロジェクトのゴール
* ステークホルダーと各ステークホルダーの目的、意向
* ユーザと顧客は誰と定義しているのか?

プロジェクト・マネージメントの基本ですが、意外にやらないところは多いような印象。(リスク管理、モチベーション管理の点で非常に重要かと思います。)

## メンバー

* 各メンバーの役職や役割
 * 誰がどの責任、権限を持っているのか?
 * どのような情報を誰に共有するのが良いのか?
 * どの質問、相談は誰にすればいいのか? (技術分野、担当分野)

## 社内のこと

* 遅刻の連絡方法
* 外出、休暇申請の方法
* 昼ごはん


## 感想

リストアップして気づきましたが、プロジェクトに入った際に必要な情報の数はかなり多いようです。
この情報を得るためのコストはかなり高いかも知れません。
大人数の場合、ツールや仕組み化による効率化にメリットがあるかも知れません。
Ceylonのコード内ドキュメント

Javaではjavadocがありますが
Ceylonもクラスやメソッドにドキュメントコメントを入れることで
IDEなどで表示されるようにすることが出来ます。

```ceylon

doc("カウンタ<B>太字</B>")
by("newta")
see(`class HogeClass`)
throws(`class Exception`)
class Counter(variable Integer i=0) {
  // 省略 ...
}

````

byで作者を書きます。javadocではauthorですね。
seeで他に参照するクラスやメソッドがあれば書くことが出来ます。
バッククオートで囲み、
クラスを参照するときは「 class クラス名 」とすると参照できます。
クラスが無いとエラーになります。
メソッドや関数のときは「function メソッド名」などで参照出来ます。
こちらも名称がちゃんと合っていないとエラーになるので良いですね。

docは説明を書きます。
こちらはHTMLの一部タグを使ったりすることが出来ます。
詳しくはこちらのページで解説されています（英文）
http://daringfireball.net/projects/markdown/syntax

今回はBタグを使った箇所がちゃんと太字になっているのを見ることが出来ます。

![スクリーンショット 2013-12-08 20.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/17213/a0f07157-14a9-5d91-b57e-8815f0630b64.png)


docは省略して
ダブルクオートで囲むだけでもドキュメントとして認識されます。

```ceylon

"カウンタ<B>太字</B>"
class Counter(variable Integer i=0) {
  // 省略 ...
}

````

クラスでもメソッドでも可能です。


戻り値それぞれにもコメントも付けることが出来ます。

```ceylon

"数値を足します"
Integer sum("１つ目の引数" Integer x,"２つ目の引数"  Integer y) {
	
	return x + y;
}

````

![スクリーンショット 2013-12-08 20.34.46.png](https://qiita-image-store.s3.amazonaws.com/0/17213/d9665853-cf48-bd73-2edd-2783fc91f33c.png)



残念なのはreturn の値に対してコメントが出来ない気がするんですよね。。
自分の調査不足なのかもしれないので
returnへのコメントを付け方を知っている人がいたら教えてください！


あとは、まだIDEのプラグインサポートが弱くて
javaの設定のようにドキュメント書いてないと警告やエラーでお知らせ出来ないんですよね。
この辺は今後に期待でしょうか。。


そんな感じでドキュメントでした。

コードを書くならコメントもしっかり書かないとね！
Cross Platform MIDI tools Advent Calendar #6: Xwtバージョンへの回帰

昨日はGtk#バージョンで上手いこと描画に起因する遅延を解決できた話を書いた。Gtk#で出来たのだから、Xwtで出来てもいいはずだ。しかしそうは簡単にはいかなかった。

まずXwtにはダブルバッファリングのための機能、昨日書いたところで言えばGdkWindowにおけるBeginPaintRect()/EndPaintRect()に相当するAPIが存在しない。仕方ないので、バックエンド側にそのような機能を追加しなければなるまいと思って、Xwt.BackendのAPIを眺め始め、ほどなく、backendのAPIを理解してダブルバッファリング処理に相当するAPIをXwtに追加してGtk/WPF/Cocoaで実装するというのは遠大な作業になりそうだ…と思い始めたところで、Gtk#のOnExposeEvent()を呼び出している部分の全ての前後にBeginPaintRect()/EndPaintRect()を追加した方が早いんじゃないか、と気付いた。検索してみるとそもそも1箇所しか無い。

そんなわけで呼び出しの追加を施してみたら、案の定パフォーマンスは多少改善された。しかしまだ重すぎて落ちまくる。ただソースを眺めていても理由がわからなかったので、うまくいっていたGtk#版とソースの差分をチェックしてみたら、どうやらXwt.TextLayoutを生成する際にFontオブジェクトをWithSize()で毎回生成している部分が怪しく見えたので、これを再利用するようにしたら、一気に改善された。

ただ、それでもかなりアグレッシブにMIDIイベントを短時間で送りまくるMIDIファイルを演奏してみると、まだ一定時間でもたつくことがあった。その挙動を見るに、おそらくGC（グラフィックスコンテキストではなくガベージコレクションのほう）の停止時間などが怪しいのではないかと思っているが、ここはまだ確認していない。

いずれにせよ、BeginPaintRect()/EndPaintRect()については、Xwtのパッチを作ってpull requestを送ったのだけど、開発者が実際に動かそうともせずに「ドキュメントにはダブルバッファリングしているって書いてある」などと主張するせいで未だに取り込まれていない。そんな死に絶えるべき状況でもsubmoduleでforkを取り込めるgitは素晴らしい。
https://github.com/mono/xwt/pull/268

とりあえずGUIまわりはこんな感じでXwtで進めているが、開発側の対応次第ではいくらでもGtk#に戻る気満々になった。
メキシコ：農業補助金データのトラッキング   ~ドキュメンタリー「10 tactics」より

こんにちは。ブロガーや市民メディアが主役のシビックメディア[グローバルボイス](http://jp.globalvoicesonline.org/)でエディターをしている[Keiko Tanaka](https://globalvoicesonline.org/author/keiko-tanaka/)と申します。

>この記事Civic Tech (シビックテック)をテーマにした、「Civic Tech Advent Calendar」企画第8弾の記事で、クリスマスまで、様々な人が様々な記事を日替わりでお届けします。
>他の記事は[こちら](http://qiita.com/advent-calendar/2013/civictech)の一覧から見れるようになっており、日ごとに記事が増えていく予定です。

#記事のテーマについて
今回は、蔵出しになってしまいますが、2009年に公開された[タクティカルテクノロジーコレクティブ](https://www.tacticaltech.org/)（本部はベルリン）が制作した「情報アクティビズム」に関するドキュメンタリー「10 tactics」に登場する、メキシコで農業補助金データのトラッキングの事例について紹介します。

メキシコは2002年に「情報公開及び政府公共情報へのアクセスに関する法律（LFTAIPG）」が施行しており、政府関係機関に情報公開申請に対応する義務があります。今年のオープンデータインデックスのスコアは日本より低かったものの、情報自由化法が先進的とも[言われています](http://okfn.jp/2012/10/31/mexicofoia/ )。

今回紹介するケーススタディは2008年に開始されたプロジェクトに関するもの。
当時の日本で私はオープンデータやシビックエンジニアリングについて一緒に語れる仲間がおらずさびしい思いをしていた頃に訳したものです。しばらく前のものになりますが、技術者、ジャーナリスト、市民、パン屋さん、歌手・・・多様な人が政策の意思決定により関心を持ち、参加できるよう、これから日の出を迎える日本には役立つ情報を共有できれば何よりです。（と言いつつ、難易度の高い事例の紹介ですが）

#FARM SUBSIDY TRACKING
##農業補助金データのトラッキング

* 利用したツール: PHPとWordpress、Linuxサーバ、MySQLを利用したポータルサイトの開発
* リーチ: メキシコに焦点をあてているが、国際的にも認知される
* コストレベル: 高（ポータルサイトの構築やプロジェクトマネージャー、プログラマ、データアナリストなどなどスタッフに費用がかかる）
* リソース: コンピューター、サーバー、ブロードバンド接続
* 難易度: 5/5 
* URL: http://subsidiosalcampo.org.mx/ 

メキシコでは、農村部の補助金は数十億ドルに達し、農村の生活に貢献し、農家の経済を助けています。ところが、これらの補助金の多くは、流用され、本来の意図しない人の手に渡ることが少なくありません。こうした補助金情報の入手は困難で使い道を把握することはさらに難しい状況にあります。

そこで農業補助金の追跡プロジェクト（Subsidios al Campo）が始動しました。公的予算の分析調査と市民参画を推進するメキシコの団体(Fundar)と、農村生産者のグループ(ANEC)、カリフォルニア大学 サンタクルス校、環境ワーキンググループが協力して、2008年に開始したもので、経済的インセンティブがメキシコ農村部でどのように分布しているかについてナレッジのデータベースを構築しました。

このプロジェクトでは、6つの国の補助金プログラムの情報を自動的に利用可能な状態にするウェブサイトを使って、農業補助金の使われ方がいかに農業従事者に影響するか光を当て、補助金の利用についてアカウンタビリティや透明性を訴求しました。

この補助金追跡プロジェクトは、既に利用可能なデータを活用するために様々な分野の研究者や、技術者、ジャーナリスト、市民グループが協業したものです。
![mexicodata.jpg](https://qiita-image-store.s3.amazonaws.com/0/33315/1d3ccec6-9d67-bcbe-41e9-978fd37572bf.jpeg)プロジェクトのスクリーンショット

#プロジェクトの目的
このプロジェクトは以下のような目的がありました。

*  農業助成金の透明性を強化し、どのような資金が農業助成金のプログラムに組み込まれているのか分析する
*  パブリックな情報について、「情報公開及び政府公共情報へのアクセスに関する法律」 (LFTAIPG)をベースとし、知る権利、アクセス権を推進する
*  収集した情報や証拠に基づき、中規模・小規模農家にとって豊かな生活が送れるような意思決定プロセスや政策変更を求める

プロジェクトのウェブサイトでは、1994年からのデータが国レベル、州レベル、自治体レベルで閲覧できるようになっており、補助金配布予測も見える化されています。
補助金リストは検索することも可能で、個人や企業ごとにランキング化されているので、補助金を 「もっとも受け取った順 」 に見ることもできます。

#プロジェクトが導いたもの
同プロジェクトでは350,000もの情報を調査し、政府の情報を分析できるプラットフォームとして注目を集めました。こうした情報を、アナリストや市民団体が活用して、農村部の経済政策の変革を求める手助けとなりました。

このように情報を集め、分析できる状態にしたことで、農業助成金についてメディアからも注目を集めるようになりました。その後、 助成金の余剰需給分について返還を求める報道が出るなど、総じて不適切な管理により配布された助成金は5億ドルに及ぶという予測数値もでています。同プロジェクトの取り組みは、政府の情報公開と管理の透明性を促すことにつながったといえるでしょう。

参照：

*  Fundarについて：International Budget Partnership
http://internationalbudget.org/wp-content/uploads/Profile-of-Fundar-Mexico-2011.pdf
* メキシコの行政と情報公開について　諸外国の行政制度等に関する調査研究No.18　平成 22年 3月 総務省大臣官房企画課
http://www.soumu.go.jp/main_content/000085175.pdf

_この記事はJuan Casanuevaが執筆した、Tactical Technology Collectiveのサイトの[記事](https://archive.informationactivism.org/en/subsidios)をもとに翻訳、要約したものです。_
アプリカティヴとしての函数型構築子


# 相変わらず函数型コンストラクタ (->)

次に函数型コンストラクタがアプリカティヴ（なファンクター）であることを確認していく。Applicative型クラスのインスタンスになるためには2つの函数：

```hs:
pure :: b -> f b
(<*>) :: f (b ->c) -> (f b -> f c)
```
が必要なわけだ。Functorの時と同様に`f = ((->) a)`を考えれば、

```hs:
pure :: b -> (a->b)
(<*>) :: a -> (b->c) -> ((a->b) -> (a->c))
```

である。`pure`の方は、b型の値をa->b型にする恣意的でないやり方なんかあるのか、という感じだが、要はどんなa型の値が来ようとそれを無視して当のb型の値を返すようにすればいい。というわけで、

```hs:
pure x = (\_ -> x)
(<*>) f g = \x -> f x (g x) 
```
という定義であるらしい。`fmap`（アプリカティヴでは代わりに普通`<$>`を使うけれど）は`pure f<*>g`は`f<$>g`でなければならないので、まずそれを確認しよう：

```hs:
pure f <*> g = fmap f g
```
函数ファンクターの`fmap`は函数合成`(.)`だったから右辺は単に`f . g`である。問題は左辺。`(<*>) (pure f) g` = `\x -> (pure f x) (g x)`だが、`(pure f)`はどんな引数がこようが`f`を返す函数なのだから`(pure f x) = f`である（`x`は見事に無視される）。というわけで`\x -> f (g x)`になり、これは`x`を取ってそれに`g`を作用させて更に`f`を作用させる函数なわけだから、函数合成`f . g`そのものだ。というわけで`fmap`に関する規則は成立している。

次は identity 則で：

```hs:
pure id <*> g = g
```
というものだ。`fmap`に書き換えてやれば`fmap id g = g`を示せばいいわけ。もちろんファンクター則の第1則から`fmap id g = id g`なんだから`id g = g`である以上、これは文句なく成立する。

次は composition 則で：

```hs:
pure (.) <*> f <*> g <*> h =  f <*> (g <*> h)
```
というもの。左辺を考えてやるとまず`(.)`と`f`を合成`(.).f`したものを`g`に作用させて`\x -> ((.).f) x (g x)` => `\x -> (f x).(g x)`でこれを`h`に作用させると `\y -> (\x -> (f x).(g x)) y (h y)` => `\y -> (f y).(g y).(h y)`である。 右辺は、まず括弧の中から`\x -> g x (h x)`で、これに`f<*>`を作用させて、`\y -> f y ((\x -> g x (h x)) y)` => `\y -> f y (g y (h y)))`というわけである。これはまさに`\y ->(f y).(g y).(h y)`なので、きちんと左辺と一致する。

次が homomorphism則 で

```hs:
pure f <*> pure g =  pure (f g)
```
左辺は `f<$>(pure g) = f . (\x -> g)`だから、どんな引数が来てもそれを無視して結局`f g`を返す函数だ。右辺は`(\x -> f g)`だからまさに左辺と一致する。

最後が interchange 則で

```hs:
f <*> pure g = pure (\x -> x g)<*>f
```

である。左辺は`\x -> f x (pure g x) => \x-> f x g`である。右辺は要するに`fmap`なので`($g) . f`で、引数に`f`を作用させたあとに、それを`g`に作用させる。これはまさに`\x -> f x g`がやっていることだ。というわけで、この法則も成立している。

かくして(->)がアプリカティヴ則をきちんと満足するきちんとしたアプリカティヴであることは証明された。が、そもそもなんでこれらの規則が要求される必要があるのかがまだわかってない。モナドとファンクターの間の強さをこれらの規則が表現してるんだとは思うんだけど、なんでこれらなのかっていう点に関するなんか直観的な説明ってないんだろうか。というか、こんなごくごく単純な例でも面倒くさいのに、他のアプリカティヴやらモナドやらってこんな法則きちんと証明してるのかな、と思ったら、どうもcoqとかの定理証明支援系を使って確認してからHaskellに落としこんだりしてるのか。道理で、Git-Hubとか見てるとcoqのデータのフォルダがあるわけだ。



それはともかく、`(->)`アプリカティヴに`<$>`とか`<*>`とかのアプリカティヴ・スタイルを使えると何が面白いのかを試してみるのはまたこんど。
CentOS 6.3に、Rails 4.0をインストールする

```
$ curl -L https://get.rvm.io | bash -s
```
```
$ rvm get stable
```
```
$ rvm install 2.0.0 --with-openssl-dir=$HOME/.rvm/user
```
```
$ rvm use 2.0.0@rails_4_0 --create --default
```
```
$ gem update
```
 .gemrcにriとrdoc生成を抑制するコマンドを追加する。

```
install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri
```
```
$ gem install rails
```

※参考サイト：[Ruby on Rails チュートリアル](http://railstutorial.jp/chapters/beginning?version=4.0#sec-rubygems "railstutorial")
JSXのプロジェクトをすばやく作る 〜 jsx-init

Visual C++の豊富な新規プロジェクトウィザード、Ruby on Railsのscaffold、Djangoのdjango-admin.py、node.jsのexpressコマンドなど、プロジェクトのひな形を生成して、すぐに実行してトライ＆エラーできる環境を作るというのはソフトウェア開発で良く利用されるプラクティスです。

JSXをnpmでインストールすると、他の言語でいうところのコンパイラ、リンカがくっついたような `jsx` コマンドが導入されます。これだけ使って開発しても、今までのJavaScriptよりもずっと快適なんですが、JSX開発の今のところベストだな、と思っているプラクティスを実践しやすくするために、プロジェクトのひな形を生成するツールを作りました。`jsx-init`というやつです。

# jsx-initのワークフロー 〜インストールからひな形生成まで〜

インストールはnpmコマンドを使って行います。

```shell-session
$ npm install jsx-init # あるいは、sudo npm install -g jsx-init
```

今から、前人未到なすばらしいプロジェクトをJSXで作ろうとしているとします。きっと転職のお誘いがガンガンやってくるようになるでしょう。

まずはプロジェクトのフォルダを作ってその中に移動します。

```shell-session
$ mkdir i-am-awesome
$ cd i-am-awesome
```

`jsx-init` コマンドをすかさず実行します。

```shell-session
$ jsx-init
jsx-init: version 0.3.3
    By Yoshiki Shibukawa (https://github.com/shibukawa/jsx-init)

Project name [i-am-awesome] >>> 
```

あとは質問に答えていけば必要なファイルがもろもろ生成されます。 プロンプト(`>>>`)の前に `[値]` が書かれていれば、Enterを押せばカッコの中の値が入力されたものとして扱います。こんな内容が聞かれます。プロジェクト種類とライセンス種類以外はEnter連打でも一応動きます。

* プロジェクト名
* npmのパッケージ名
* プロジェクトの説明
* バージョン(0.1.0)
* プロジェクト種類(選択)
* ライセンス種類(選択)
* 著者名、メールアドレス
* リポジトリ、ウェブサイト、issue trackerのURL(デフォルトはgithub)
* travis.ciのファイル作る？(Y/N)

ウィザートが完了したらnpm installを実行します。これでビルドに必要な[grunt](http://gruntjs.com/)、[grunt-jsx](http://yosuke-furukawa.hatenablog.com/entry/2013/06/30/123223)、JSX処理系そのもの(grunt-jsxに付随して入る)がインストールされます。Canvasのひな形の場合は、ローカルのWebサーバ(ないとローカルリソースアクセスに厳しいChromeでうまくテストできなかったり)のconnectもインストールされます。JSX開発を始める際に、jsx-initだけ入れれば後のツールはjsx-initがすべて面倒みてくれるというすんぽーです。

実際にプロジェクト内で設定済みなコマンドはこんな感じです。(gruntを-gでインストールしていない場合は、node_modules/.bin/gruntに置き換えること)

```shell-session
$ grunt build # ビルド
$ grunt test # テスト実行
$ grunt runserver # Webサーバ起動 (一部プロジェクト種類のみ)
```

# プロジェクトのひな形の種類

jsx-initで提供しているのは今のところこんな感じです。

* JavaScript用ライブラリ。コードを一度書いてgrunt buildと叩くだけで、スのJSXコンパイル形式(`JSX.require` でアクセス)、グローバル名前空間にモジュール名を登録しちゃうお手軽形式(大規模非推奨)、`require`で扱えるcommon.js形式、AMD形式、Closure Compiler形式(未テスト)の5種類のJSファイルが生成されます。
* JSX用のライブラリ。他のアプリから利用されるもの。サンプルプロジェクトのビルドとユニットテストぐらいが含まれるだけのシンプルなプロジェクト。
* node.jsを使ったコマンドラインのユーティリティプログラム。getopt.jsxを使ってコマンドライン引数をパースする部分も最初から入っています。
* Canvasを使ったHTML5アプリ。Webサーバも含む。
* WebWorker。ブラウザでバックグラウンドで動きます。WebWorkerはChromeを使ってもデバッグが面倒なので、コンパイル時にエラーがたくさん拾える＆既存のコードと切り離されているので、WebWorkerでJSXガンガン使うと幸せになれるよ！
* Sencha Touch。実験的な実装です。Sencha社に行った時に将来の方針に関するうれしい話が聞けたので(Ext.js 5.0とSencha Touch 3.0?)、今後中身は大きく変わる予定。

Chrome Package Applicationとか、JSFLとか、Ext.js(実験的)もAPIラッパーは作ってあるのでそのうち足すかも。ngCoreもあるよ。

# ひな形を使った開発

test以下にテストコードがあります。テスト駆動開発したい方はどうぞ。必要なモジュールがあれば、`npm [モジュール名] --save` や `npm [モジュール名] --save-dev` とか使ってインストールと同時にpackage.jsonに追加していってください。peerDependenciesに追加するコマンドもあるのかな・・・

必要なコードが書けて、テストも通って、READMEを修正したら、 `npm publish`と打てば、`i-am-awesome` パッケージがnpmで世界中に公開され、あなたの素晴らしさに涙(;_;)することになるでしょう。社内プロジェクトとかで公開したくない場合はpackage.jsonに `"private": true` という行を追加するのをお忘れなく。

もし、ウィザードでtravis-ci用の設定ファイルを生成していたのであれば、githubにリポジトリを作ったあと、travis-ciの設定画面でonにするだけで自動CIテストが実行できるようになります。

# ひな形作りたい！

よくある(あって欲しい)質問への回答です。内部ではMustache(というかhoganのJSX実装)を使ったテンプレートになっています。良いものができたらPRください。

ライセンスも、LGPL v2、LGPL v3、AGPLの条文が長くてMarkdownへの書き換えを怠っている状態です。もし手元にMarkdown形式のこれらのファイルをお持ちの方はください。

長くなってしまったので、jsx-inkerについてはまた後日。
ゲーム制作2日目！

本日は、追従機能を作成しました。
[今日の進捗](https://dl.dropboxusercontent.com/u/35809589/SnakeGame/index.html)←うまくいっていれば、dropboxの中身に飛ぶはずです。
左右キーで、曲がります。いまはそれだけ。

#追従機能
先頭のキャラクターに次のキャラクターがついていくようになりました。
これは、先頭のキャラクターの移動方向をキューで記憶し、
次のキャラクターがそのキューからデータを取り出すことで、実現しています。
このキューには1フレームごと、現在の移動方向をエンキューします。
今回の場合、移動速度は毎フレーム4、２つの要素の距離は32になっているので、
32/4=8回分の待ちがあったあと、次のキャラクターに移動方向が適応されるようになっています。

現在は2つのキャラクターしかいない状態なので、
明日はこれをクラスなどを用いて一般化しようとおもいます。
今の作戦だと、リスト構造のような形になると思います。
実は本日は半分くらいそれをやっていたのですが、
エラーが出て進まなくなってしまっている状況です。
明日は、クラスの作り方をもう一度しっかりと読みなおした上で、
企業の方に教えていただいたデバッグ機能を駆使し、
開発を進めていこうと思います。
参考:[Google ChromeのJavaScriptデバッガの進化がすごい - os0x.blog](http://os0x.hatenablog.com/entry/20110422/1303468821)
How to install autojump to Mac+iTerm+oh-my-zsh


[Demo video](http://goo.gl/MSKqLl)

I tried to install it through <kbd>brew install autojump</kbd> but it didn't work for me. So I uninstalled it <kbd>brew uninstall autojump</kbd>.

I used manual installation and it worked well.

```terminal
# Grab a copy of autojump:
$ cd tmp
$ git clone git://github.com/joelthelion/autojump.git

#Run the installation script:
cd autojump
./install.sh [ --local ]

Please add the line to ~/.zshrc :

[[ -s /etc/profile.d/autojump.zsh ]] && . /etc/profile.d/autojump.zsh

You need to run 'source ~/.zshrc' before you can start using autojump. To remove autojump, run './uninstall.sh'
```
```.zshrc
$ vim .zshrc
# In vim

########
# autojump
########
[[ -s /etc/profile.d/autojump.zsh ]] && . /etc/profile.d/autojump.zsh

```

``` terminal
$ source .zshrc
```

I also created ~/.local/share/autojump/autojump.txt.
 
```terminal
$ touch ~/.local/share/autojump/autojump.txt.
```

Some commands

```terminal
# help
$ j -h 
# version
$ j -v
# stat
$ j -s
# more in j -h
```

I hope it works for you too.
Rubyの条件式

通常のif文以外にも、一致しない場合のunlessや
一行で書く方法もある。

```test_if.rb
# aとbが一致した場合、"Hello"が表示
if a == b then
   # 一致する場合
    puts "Hello"
else
   # 一致しない場合
   puts "World"
end

# aとbが一致した場合、"Hello"が表示
unless a == b then
   # 一致しない場合
   puts "World"
else
   # 一致する場合
   puts "Hello"
end


# aとbが一致した場合、"Hello"が表示
puts "Hello" if a == b
```
Mac OS Xのアプリで既存のショートカットキーを変更する方法


意外と知らない方が多いようなので書きます。
既存のショートカットキーのマウント以外にも、存在しないショートカットキーを追加することもできる。

## 指定できるショートカットキーについて

- 各アプリケーションのメニューバーに表示されている項目に限る
- メニューバーからスライド表示される項目も指定できる
- アプリケーションやOSの仕様により、この方法で追加できない場合がある

上手くいかない場合は該当のアプリケーションを終了してから設定すると上手くいくことが多い印象。

## 設定方法

システム環境設定からキーボードを選択
`キーボードショートカット` -> `アプリケーション` -> `+`を押下

![キーボード 2013-12-08 17-02-05.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/f887370e-c485-42c6-9737-752d4f0f8dcd.jpeg "キーボード 2013-12-08 17-02-05.jpg")

アプリケーションを選択し、メニュータイトルを入力します。
![Screenshot 2013-12-08 17-07-03.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/438b74c9-4073-d669-6098-9080f623dda3.jpeg "Screenshot 2013-12-08 17-07-03.jpg")


メニュータイトルとは、そのアプリケーションのメニューバーに表示されている項目名です。
**正確に入力して下さい。**

キーボードショートカットを設定します。

これで、該当のアプリケーションにキーボードショートカットが追加（上書き）できました。

ご存じなかった方は是非。
2013年も終わりだけどWindowsでPerl開発環境を作りたい

# はじめに

MacBook Air 11インチですら持ち歩くのがおっくうで、2013年の世の中ですが時代の流れに逆行してVAIO Type Pを買った [まいんだー](http://twitter.com/myfinder) です。
Linuxを入れてもよかったんですが、いい機会なのでWindowsで頑張ってみるかと思い立ったので今回はWindowsでPerl書きたい人のためのエントリを書きます。
＊ゆるふわな用途向きです。

さてWindowsでPerlというと2010年/2011年のPerl Advent CalendarでWindowsトラックが行われていたことは記憶にあたらしいと思われます。
今回書くにあたってざっと読んだのですが、Windows Perl初心者な自分には高度すぎてついていけない内容ばかりだったのでそっと閉じました。

常時オンラインであるならどこかのレンタルサーバにsshすれば済むのですが、そうも行かないシーンも多々あるでしょう。
そんな時は手元でカジュアルに開発できる環境があるとはかどります。
なので今回はWindows Perlゆとりな自分でもできた、PerlのIDE "[Padre](http://padre.perlide.org/)" を紹介します。

# インストール

インストールはなんも難しいことはなく、.exeをダウンロードして実行してnext->next->next->finishするだけです。
これだけで下記のような感じにインストールされます。

![pac1.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/e81d1f2f-def1-f61c-1105-0a9969801051.jpeg)

見ての通りStrawberry Perlが同梱されているので、Padreを入れるだけでPerlの開発環境をが整います。
Perlのバージョンも5.14.2と割と最近のものがはいるので、多くの場合特に問題はないかなと思います。

# 使い方

蝶のマークの項目を選ぶとPadreが起動して下記のようなウィンドウが出てきます。
ふつうのエディタっぽい感じです。

![pac2.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/8a16cff8-1451-944c-4cf9-1ae115b6cc78.jpeg)

ありがたいことに日本語対応もしているのでWindowsでPerlを始めたい人にはインストールの簡便さやこの後紹介するCPANモジュール導入を含めてかなりいい感じではないかと思います。

コードを書くのも実行するのも簡単で、

![pac3.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/773b2e59-14fd-8483-960f-f82b01ab3d69.jpeg)

こんな感じでコードを書いて保存して再生ボタンを押すだけ。

そこそこ支援機能も充実していて

![pac4.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/31e2e469-02b6-3a74-b291-abf28ead0e91.jpeg)

とか

![pac5.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/0c1ce065-0daa-1d86-4d13-efbd40758e67.jpeg)

とかは標準ですぐ使えるのでゆるふわな向きには持ってこいです。

# Mojoliciousアプリとか書きたい

ここまでで、手元で使う便利スクリプトくらいならすぐ書けそうな雰囲気ですが、ちょっとしたアプリを書いたりしたい時があるかもしれません。
PadreにはCPANエクスプローラ機能があり、そこから必要なモジュールを検索して "Install" ボタンを押すだけで導入できます。

![pac11.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/257f75b0-b34e-a08a-e3ee-123cc4c9bd47.jpeg)

なので

![pac8.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/c2f87f5c-bbc8-a3d5-d132-992de47a0a06.jpeg)

というアプリも

![pac10.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/b1db64f6-02ed-05f5-2025-1130828cb23b.jpeg)

Ctrl+F5 でコマンド実行を呼び出して

![pac9.jpg](https://qiita-image-store.s3.amazonaws.com/0/6835/2bb5f65d-db0b-24b2-39e8-80a652d8cb68.jpeg)

というようにplackupで実行できてお手軽です。

# おわりに

ゆるふわにWindowsでPerl開発環境を作る方法についてまとめました。
これでちょっとした時間にも手元でPerlが書けて捗るかもしれません。

明日12/9は [@tagomoris](http://twitter.com/tagomoris) さんです。
RecSys Handbook Chapter1 1.1~1.2

しばらくはIntroductionが続きます。
以降、推薦システムまたはRecommender SystemをRSと表記します。


#**Chapter1**
##**Introduction to Recommender Systems Handbook**
###1.1 Introduction

RSでは推薦対象として"Item"という言葉が一般的に使われる。
ex) CDs, news, ...

RSが用いられる状況として、
・　ユーザーの経験や能力が不足している場合
・　選択肢が膨大で人の力では把握しきれない場合

RSにはパーソナライズされたものとパーソナライズしていないものがある。例えば、Amazonが進めてくる商品は人によって違う。これはパーソナライズされた例である。一方、単に売上ランキングや発売日で商品を推薦するものはパーソナライズされていないRSである。基本的にRSの研究ではパーソナライズされたものを対象としている。

もっとも単純な形であれば、パーソナライズされた推薦はランクづけされたアイテムのリストとして提供される。
Webページ上でのユーザーの行動などからユーザーの好みを分析し、分析結果を元に推薦されたアイテムへ誘導していくのである。

最初に生まれたRSは「 **協調フィルタリング** 」と呼ばれるものである。「他人に推薦されたものに決定を頼る傾向がある」という観察結果をもとづいた手法である。
ex) 採用担当は推薦書を見て採用決定を行う、映画のレビューを見てからどの映画を見るか選択する　など

Webの登場によって **情報が爆発的に増加** するようになり、ユーザーが選択を誤ってしまうことも多くなった。選択肢は多ければよいというわけではないのである。そこで、RSが選択のサポートをするという大きな役割を担うことになる。

* * *
さて、これまで見てきたRSの背景を元に考えると、 **RSの研究は比較的新しく** 、独立した研究領域として認識され始めたのは1990年代半ばであるとされている。また、RSに対する関心は劇的に高まっていることが以下のサービスが生まれていることからも確認できる

・ Amazon.com
・ YouTube
・ Netflix
・ Yahoo
・ Tripadvisor
・ Last.fm
・ IMDb

###1.2 Recommender Systems Function
なぜサービス提供者がRSを導入したがるのか考えてみよう。
**販売数の増加**：推薦したアイテムがユーザーのニーズに合っていれば余分に買ってくれる
**多様なアイテムの販売**：人気ではないけれども、あるユーザーには適したアイテムを販売することが出来る
**ユーザー満足度の増加**：よいアイテムを知ることが出来れば満足度は増える
**ユーザーをつかむ**：たくさん利用すればRSの精度が上がり、お得意様になってもらいやすい
**ユーザーのニーズを知る**：RSで得た情報を販売だけでなくマネジメントやプロモーションに生かすことが出来る
ユーザーにとってもメリットがあり、サービス提供者とユーザーの両方が満足できる。

次にRSが実現できることをリストアップしてみる。
**よいアイテムを見つける**：
**よいアイテムを全部見つける**：
**Annotation in context**：行間を読むっていうことですかね…
**シークエンスの推薦**：一つのアイテムではなく複数のアイテムを推薦し、全体としてユーザーの好みを満たす
**グループとしての推薦**：複数のアイテムを含むグループを推薦し、そのなかからベストなものを見つけてもらう
**見るだけ**：Webブラウジングしているだけでも、より関心をもってもらいやすい
**優れたリコメンダーの発見**：推薦結果を与えるだけじゃなく、ユーザーに推薦させてみると…
**プロフィールを改善させる**：極端な話、プロフィールが全員同じであればパーソナライズした推薦はできない
**自己表現**：RSに興味はないが、商品の評価やコメントをしたがるユーザーにはメリットがある。
**他人を助ける**：ほぼ上に同じ。あるユーザーが持っている情報が他のユーザーにとって有益であること
**他人に影響を与える**：自分のコメントや評価で他のユーザーの意思決定に影響を与えたがるユーザーがいる。悪用される場合もある（プロモーションに使ったり、他のアイテムにペナルティを与えるなど）

このように、RSが持つ役割は非常に多岐にわたる。そのため、多くの分野の知識が必要となるのである。
次の2節ではRSが取り扱うデータの種類と代表的な推薦手法などについて取り扱う。
* * *

お疲れさまでした。どうやらChapter1は文字ばかりのようです…。早くアルゴリズムの話に入りたいのですが、先は長そうです。
ファンクターとしての函数型構築子


# 函数型コンストラクタ (->)

型aから型bへの函数の型はa->bである。だから、実は(->)は型aと型bを取って、a->bという型を作り出す二項型構築子だよね、と言われて面食らう。言われてみりゃそりゃそうだ。型構築子(->)が実はFunctorでありApplicatveであり（そしてMonadでもある）という話を、写経がてら自分のために整理しておく（なお文系情弱なので正確さは保証できない）。

Functorという型クラスに属する型fは：

```hs:
fmap :: (b->c) -> (f b -> f c)
```

を備えていなければならない。だから、fは型bを引数に取る項数1の型構築子でなければならない。型構築子(->)は項数2なので、このままではFunctor型クラスを例化できない。そこで部分適用を使って、函数型a->bを((->) a)という単項型構築子が型bを取ったものと考える。そうすると、fを((->) a)と見て、

```hs:
fmap :: (b->c) -> ((-> a) b -> (-> a) c)
```

つまり

```hs:
fmap :: (b->c) -> ((a->b) -> (a->c))
```

というfmapがあればいい。これはつまりfmapが(b->c)型の函数に対して、(a->b)型の函数をとって(a-c)型の函数を返すような、ある函数を返してくれる、ということだ。抽象的すぎてわかりにくいが、函数合成演算子(.)の型を思い出すと：

```hs:
(.) :: (b->c) -> (a->b) -> (a->c)
```
で、b->c型の函数とa->b型の函数を取ってa->c型の函数を返してくれるのだったが、これは言い換えれば、b-c型の函数を取って、a->b型の函数をa->c型の函数に変換するような、ある函数を返してくるということである。つまり型の関係としてはfmapと(.)は同じである。で、実はこれが((->) a)型の持つfmapの正体である。Functor Lawの第1則を確認しておくと：

```hs:
fmap id = id
```

だということになる（ただし、最初のid函数の型は(b->b)であり、後者のid函数の型は((a->b)->(a->b))である）。id函数をfmapによってたとえばeven函数(不正確だがとりあえずその型をInt->Boolとしておく)に作用させてみよう：

```hs:
fmap id even = id even -- ということは(.)がfmapであるためには
id.even = id even -- が成り立たなければいけない

id (::Bool->Bool) . even (::Int->Bool) = 
id (::(Int->Bool)->(Int->Bool))  even (::Int->Bool) 
```

が成立しなければいけないが、id.evenがevenと等価なのは当然だし(evenが返す値がidに渡されて同じ値がそのまま返ってくるだけだから)、他方でid evenはもちろんevenと等価なので（idは自身の引数である函数evenそれ自体をそのまま返すから）、id.evenと id evenは等価である。これはevenのみならず同様にして一般の函数について確かに成り立つ。第2則は任意のファンクター値h（ここではaを引数とする函数）に対して：

```hs:
fmap (f.g) h = (fmap f . fmap g) h = fmap f (fmap g h)
```
で、fmapを(.)で置き換えてやれば

```hs:
(f.g).h = f.(g.h)
```
で、これは函数合成の結合法則そのものなので当然成立している。ということで、函数型はファンクターであり、そのfmapは函数合成演算子(.)そのものなのであった。Applicative則についてはまた今度。
いくつかの質問に答えると、次の回答を予想するプログラム

ユーザーに３つの質問をして、その後ユーザーが答えるであろう回答を予想するプログラムを作ってみた。

####ソース

```py:quiz.py
# -*- coding: utf-8 -*-
import random
questions = ["犬より猫が好き",
        "理系",
        "男",
        "パンよりご飯が好き",
        ]
ourAnswers = [[0,1,1,1],
             [1,1,1,0],
             [0,0,1,0],
             [0,1,0,1],
             [1,0,0,1],
             ]


def quiz():
    u"""いくつか質問をします。その後、あなたが答えるであろう回答を予想します。
    """
    target = random.randint(0,len(questions)-1)
    yourAnswer = len(questions)*[0]
    rates = len(questions)*[0]

    for i, question in enumerate(questions):
        if i == target:
            continue
        yourAnswer[i] = int(raw_input(question+"ですか？ 1.はい,0.いいえ  :"))

    for i in xrange(len(questions)):
        i_is1count = 0
        target_is1count = 0
        for ourAns in ourAnswers:
            if ourAns[i] == yourAnswer[i] or i == target:
                i_is1count += 1
                if ourAns[target] == 1:
                    target_is1count += 1
        if i_is1count == 0:
            rates[i] = 0.5
        else:
            rates[i] = float(target_is1count) / i_is1count
    rate = sum(rates)/len(rates)
    if rate >= 0.5:
        yourAnswer[target] = int(raw_input("★あなたは{0}ですね？(確率{1:.2f}%) 1.はい,0.いいえ  :".format(questions[target],rate*100)))
    else:
        yourAnswer[target] = 1 - int(raw_input("★あなたは{0}ではないですね？(確率{1:.2f}%) 1.はい,0.いいえ  :".format(questions[target],100-rate*100)))
    ourAnswers.append(yourAnswer[:])


if __name__ == "__main__":
    while(True):
        quiz()
```

#### 実行結果

```
犬より猫が好きですか？ 1.はい,0.いいえ  :1
理系ですか？ 1.はい,0.いいえ  :1
パンよりご飯が好きですか？ 1.はい,0.いいえ  :1
★あなたは男ですね？(確率52.50%) 1.はい,0.いいえ  :
```

お、おう... 

冒頭のquestions(質問リスト)とourAnswers(回答リストのリスト)を書き換えて遊んでください。 
少しずつ賢くなっていきます。
判断基準はこんな感じ。

>質問XがYESである確率=回答Yが[YES/NO]である時に回答XがYESだった割合

どの問いが核心に迫る問いなのかという重み付けはしてません。
RECOMMENDER SYSTEMS HANDBOOK

こんにちは、初めての投稿です

ラッキーなことに、今通っている大学では最新の論文を自由に読むことが出来ます。
RecSysという推薦システムに関する学会があるのですが、そのRecSysが作った848ページにわたる長編PDFを友人に教えてもらいました。
その名も、

<h1>RECOMMENDER SYSTEMS HANDBOOK</h1>


2011年に発行されたということで、かなり新しいテキストですね。
発狂するくらい長いので気長に読んでいきますが、あまりにも長すぎて読み終わるころには前半部分をきれいさっぱり忘れていると思います。そこで定期的に読んだことをQiitaに投稿することにしました。
（文章作成能力が著しく低いことに最近気づいたので国語の勉強という目的もあります。）

よろしくお願いします。

記念すべき初回はイントロ部分のみ簡単にまとめました。
なお、イントロということで、ただの翻訳＆要約ではなく僕の解釈や補足が多めに入ることを念頭に入れてお読みください。

<hr>

<b>Preface</b>
現在の推薦システムの背景やこれまでの歴史が簡単に書かれています。

推薦システムはユーザーにアイテムの提案をするソフトウェアツールや技術のことを指し、たとえば、おすすめの音楽やニュース、商品などの推薦が行われています。商品の推薦で言えばAmazonが有名ですね。

この10年間で多くの推薦技術が生まれ、サービスへの応用にも成功しているとのことです。
商品やニュース以外にも、SNSでも「友達ではありませんか？」というような表示がありますよね。推薦システムが特別なことではなく、ネットユーザーのほとんどが毎日目にする一般的なものになっていると感じます。

推薦システムの開発には非常に多くの努力が必要で、複数の分野のエキスパートが必要となります。
ex) 情報科学、データマイニング、統計、インターフェース、決定支援システム、マーケティング、消費者行動など

これらすべての分野をカバーするのは難しいです。そこで！！
→<b>本書は推薦システムにおける初の包括的でありながら非常に詳しく、そして便利にまとまったテキストである。
</b>
<hr>

ということで、推薦システムのテキストとしては内容も厚さも辞書レベルですね。
これから週1以上のペースで更新していきますのでよろしくお願いします。


<b>ご意見や誤りなどがありましたらぜひぜひご指摘よろしくお願いいたします。</b>
debian-goodiesのcheckrestartで再起動が必要なプロセスを調べる

[debian-goodies パッケージ](http://packages.qa.debian.org/d/debian-goodies.html) には `/usr/bin/` に複数のコマンドと `/usr/sbin/checkrestart` が入っています。

`/usr/bin/` のコマンドについては [uwabami さんの記事](http://qiita.com/uwabami/items/77f920448ad73ce12aa2) を参照してください。

[debian-goodiesのcheckrestartで再起動が必要なプロセスを調べる](http://blog.n-z.jp/blog/2013-12-06-checkrestart.html) では `checkrestart` を紹介します。
iOSでZIPファイルの圧縮／解凍を簡単に実装する方法


## 概要
iOSで手っ取り早くZIPファイルの圧縮／解凍する方法を調べてみました。

zlibを使ってC言語で処理を書くなんてこともできるようですが、
Objective-c 一辺倒の私にはこの方法は却下です。

[ZipArchive](https://code.google.com/p/ziparchive/ "ZipArchive")というライブラリもありますが、こちらはソースコードが古くARCにも対応していません。
で最終的に行き着いたのが[SSZipArchive](https://github.com/soffes/ssziparchive "SSZipArchive")というライブラリです。
これはZipArchiveをベースに作られたものでARCにも対応しています。

使い方もとてもシンプルだったのでSSZipArchiveが現時点(2013/12/8)では一番よいかと思います。

## 使い方

まずgithubからソースを取得しましょう。

https://github.com/soffes/ssziparchive

ソースコード内の`SSZipArchive`ディレクトリとその配下にある`minizip`ディレクトリをプロジェクトに追加します。

`libz.dylib`をターゲットに追加します。

`SSZipArchive.h`ヘッダーをインポートすることも忘れないように。

#### 解凍するとき

```objc
// 解凍
NSString *zipFilePath = @"解凍するZIPファイルのパス";
NSString *destinationPath = @"解凍したファイルを展開するディレクトリのス";
BOOL isSuccess = [SSZipArchive unzipFileAtPath:zipFilePath Destination:destinationPath delegate:self];
if (isSuccess) {
    // 処理が成功した場合
} else {
    // 処理が失敗した場合
}
```
パスワードを指定する場合

```objc
// 解凍
NSString *zipFilePath = @"解凍するZIPファイルのパス";
NSString *destinationPath = @"解凍したファイルを展開するディレクトリのス";
NSString *password = @"パスワード";
NSError *error = nil;
[SSZipArchive unzipFileAtPath:zipFilePath toDestination:destinationPath
                    overwrite:YES password:password error:&error delegate:self];
if (error) {
    // エラーが発生した場合
    NSLog(@"error: %@", error);
}
```

解凍が完了した場合に処理を実行した場合はデリゲートを設定した上で、下記メソッドを実装する

```objc
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath {
    NSLog(@"解凍完了");
}
```

#### 圧縮する時

```objc
// 圧縮
NSString *zippedFilePath = @"圧縮したZIPファイルの保存先パス";
NSArray *inputFilePaths = @[[[NSBundle mainBundle]
                             pathForResource:@"sampleImage" ofType:@"jpg"],
                            [[NSBundle mainBundle]
                             pathForResource:@"sampleText" ofType:@"txt"]];
BOOL isSuccess = [SSZipArchive createZipFileAtPath:zippedFilePath hFilesAtPaths:inputFilePaths];
if (isSuccess) {
    // 処理が成功した場合
} else {
    // 処理が失敗した場合
}
```
という事でとても簡単に実装できます。
デリゲートでは無くブロック構文に対応させてもよさそうです。

お試しあれ！
gitとgithubでのリモートブランチ操作

## git 
### ローカルに作成したブランチをリモートにプッシュ

```bash
# ブランチを作成して移動
$ git checkout -b NEW

# リモートにプッシュ
$ git push origin NEW
```
### リモートブランチをローカルへチェックアウト
リモートのNEWブランチをローカルへチェックアウトする

```bash
$ git checkout origin/NEW

# リモートと違う名前にするならこっち
$ git checkout HOGE origin/NEW
```
### リモートブランチを削除
リモートからNEWブランチを削除する

```bash
# git push [remotename] [localbranch]:[remotebranch]
$ git push origin :NEW
# 上記は以下と等価(らしい)
$ git push --delete origin NEW
```

### リモートで削除済みのブランチに対する追跡ブランチを削除する
```bash
$ git branch -r -d origin/NEW

# リモートで削除済みの追跡ブランチを全部消す
$ git remote prune origin
```
## github
思い出したらメモる

## 参考
- http://git-scm.com/book/ja
- https://github.com/github/hub
Goでランタイム時にJavaScriptを評価する

[Go Advent Calendar 2013](http://qiita.com/advent-calendar/2013/go) 8日目の記事です。

みんな大好きJavaScript、ということでGoでもランタイム時にJavaScriptを評価できるライブラリが台頭してきています。

静的型付け言語内に別の言語(スクリプト言語)を組み込んで評価するメリットというのは、作成しているソフトウェアが巨大になるにつれて、感じられるものだと思っています。
たとえば、周辺の機能を拡張したい場合、本体のコードに手をいれるのも良いけれども、そうするといろんなところでそのイレギュラーな処理を考慮しなければならなくなります。
そこで、本体側はAPIを用意しておき、拡張したい場合はそのAPIを外から触って挙動を変更する、ということはよく取られる手法だと思います。

前置きが長くなりました。ではGoでJavaScriptを評価していきましょう。

# ライブラリ

もちろんGoはオフィシャルにJavaScriptをサポートしているわけではないので、サードパーティ製のライブラリを使うことになります。
以下のように複数作成されているのですが、

* [otto](https://github.com/robertkrimen/otto)
* [go-v8](https://github.com/idada/go-v8)
* [javascirptcore-go](https://bitbucket.org/rj/javascriptcore-go)

いろいろ触っているとOttoの完成度が高いと感じたのでその使い方を見ていきます。
ちなみに、少し前にHacker Newsで話題になったので合わせて読むと面白いです。
https://news.ycombinator.com/item?id=6812675

# Ottoのインストール

```
$ go get github.com/robertkrimen/otto
```

また、ライブラリとして使う以外に、コマンドラインでJavaScriptを実行する実行ファイルも用意されています。

```
$ go get github.com/robertkrimen/otto/otto
```

これで`$GOPATH/bin`に実行ファイル`otto`がビルドされます。
たとえば、

```
$ cat test.js
function f(x, y) {
  return x + y;
}
console.log(f(1, 2));
$ otto test.js
3
```

のように実行できます。

# hello, world

インストールができたらJavaScriptをGoで評価する準備はできました。
サンプルコードを書いてみましょう。

```go
package main

import (
        "github.com/robertkrimen/otto"
)

func main() {
        Otto := otto.New()
        Otto.Run(`
var x = 2 + 2;
console.log("The value of x = " + x);
        `)
}
```

`otto#Run()` で渡したJavaScript文字列が評価されます。
console.logで計算された結果が表示されることがわかります。

# 何ができる?

これだと、単にJavaScriptを実行しただけになります。何も面白みはありません。
最初に述べた、うんちくを簡単に実装してみることにします。
整数で四則演算ができる計算機にしてみましょう。
そして、その計算機の挙動はユーザがカスタマイズして加えたり変更できたりするものです。
少し長いので、gistに挙げています。
https://gist.github.com/yoppi/7853138
このコードを

```
$ go build calc.go
$ ./calc
+-*/> 1 + 1
2
```

とビルドして実行するとプロンプトが表示されます。
ここで 1 + 1とか適当な文字列を入力すると計算してくれます。
そして、唯一のコマンドである`load`コマンドをjsのファイルを指定して実行することで、そのファイルで定義したものを取り込み、計算機の機能を増やすことができます。
Ottoを評価している部分を抜き出すと

```go
func (c *Calculator) LoadScript(file string) {
        Otto := otto.New()
        buffer, _ := ioutil.ReadFile(file)
        Otto.Run(string(buffer))
        _operator, _ := Otto.Get("operator")
        operator, _ := _operator.ToString()
        script, _:= Otto.Get("script")
        c.AddOperator(operator, func(x, y int) int {
                _ret, _ := script.Call(script, x, y)
                ret, _ := _ret.ToInteger()
                return int(ret)
        })
}
```

ファイルを読み込んで、一度`otto.Run()`で実行させて、operatorとscript宣言をGo側から取得できるようにしています。
取得したoperatorをキーにして、scriptをランタイムで実行させた結果を返す関数を登録しています。
たとえば、mod.jsというファイルを次のような内容でloadさせると、

```
$ cat mod.js
var operator = '%';
var script = function(x, y) {
  return x % y;
}
$ ./calc
+-*/> load mod.js
+-*/%> 3 % 2
1
```

演算子として、`%`が使えるようになり、剰余を求められるようになります。
Ottoの優れているところとして、そのままオブジェクトを評価できるので、JavaScript自体に手を加えずにすみます。
そして、APIに沿って書いたJavaScriptに対してユニットテストを書くことももちろんできます。

どうでしょうか。プログラムの挙動をカスタマイズしていくのは面白いものがあります。
もちろん、プロダクトとして使えるものにするためには、なんでも実行できないようにsandboxを定義してそこだけでしか動作しないような仕組みが必要ですが、実行中にカスタマイズしていけるので、使いどころによっては便利です。


# まとめ

Dockerを始めとして、Goで巨大なソフトウェアが作成されつつある流れを感じています。
巨大なソフトウェアだと細かいところまでカスタマイズを面倒見切れない、
そういうときに、静的型付け言語内でスクリプト言語をランタイム時に評価してソフトウェア自身を拡張するという一手法があり、ポピュラーな言語であるJavaScriptを選んでみました。
Disk容量不足解消の為に巨大なディレクトリを探す

OS XやLinuxだと`du -sh *`とかで やっちゃうんだけど、Winの非開発環境だとそういうの入ってないので[KDirStat](http://kdirstat.sourceforge.net/)のクローンのWinDirStat を使ってる。

http://windirstat.info/
ὑμήνπτερόν

![hy](http://hy.readthedocs.org/en/latest/_images/cuddles.png)

[hy](https://github.com/hylang/hy)というプログラミング言語についてご紹介。
lisp/schemeシンタックスライクな記述形式でかける言語。
見つけただけで、あんま詳しく調べてないけど、pythonで実装されてるので興味を持った。

すんごく上辺だけど、簡単な記事を書く。

# εγκατάσταση

まずはインストール。
python, pipの環境を整えている前提。

```
pip install hy
```

で終わり。

# τρέξιμο

そして試しに使ってみる。

## 対話環境を立ち上げる

```
hy
```

幾つかコードを書いてみる。

```scm
=> (print "Hello world")
Hello world
=> (defun welcome_to_underground [name] (print (+ name ", Welcome To Underground")))
=> (welcome_to_underground "hoge")
hoge, Welcome To Underground
```

動いた！

# Μελέτη Περίπτωσης

以下の簡易なPythonのコードをhyに書き換える場合、以下の形になる。

```py:Python
def rating(age):
  if age <= 10:
    print("G")
  elif age <= 14:
    print("PG12")
  elif age <= 17:
    print("R15+")
  else:
    print("R18+")
```

```scm:hy
(defn rating [age]
   (cond
     [(<= age 10)
       (print "G")]
     [(<= age 14)
       (print "PG12")]
     [(<= age 17)
       (print "R15+")]
     [true
       (print "R18+")]))
```

## pythonのモジュールをimportし、利用する

randomモジュールをimportし、ランダムな文字列が返るようなものを書いてみる。

```scm:random
(import random string)
(defn choice [n]
  (let [[m ""]]
      (foreach [element (range n)]
        (+= m (random.choice (+ string.ascii_letters string.digits))))
      (print m)))
```

実行する。

```scm:choice
=> (choice 20)
U54TuMzdTpTyWYZkc3wm
=> (choice 20)
4Al8BJXEKM9FFvAW221L
```

# μελλοντικός

末尾再帰書こうとしたけど即時評価されてしまったし、
ちょっとアレかなと思ったものの既存のPythonライブラリを利用できるlispっぽい言語としては
面白いと思う。
Macroを使ってみよう

## Macro機能とは？

PhpStormにはデフォルトでマクロ機能があります。
毎回同じような処理をやったりする箇所は細かくマクロ化しておくと便利です。

マクロの作り方はこんな感じ。

1. [Edit]-[Macros]-[Start Macro Recording]を選択
1. マクロ化したいアクションを任意で実行
1. [Edit]-[Macros]-[Stop Macro Recording]を選択
1. 任意の名前を付けて保存。
ここで指定したマクロ名はFind Action(Ctrl+Shift+A)からの実行や、Keymap登録も出来ます。

ちなみにMacroレコーディング中は右下にこんな感じで表示されます。

![KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme__と_CategoriesController.php_-_kihon_-____www_kihon_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/c102fbfe-66f2-c3c2-dd49-a762f3b5af50.png "KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme__と_CategoriesController.php_-_kihon_-____www_kihon_.png")


個人的に使っているマクロをいくつか紹介します。

##  カーソル下の単語でファイル検索

カーソルの位置にある単語を選択して、その単語でFind Fileしています。
必要に応じてGotoClassなどに置き換えても良いと思います。
![Edit_Macros_と_KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/9eaa032a-8c79-7b17-25a4-8222ba7ff2d8.png "Edit_Macros_と_KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")

## シングルクォートで囲われた文字列でファイル検索
上のと似ていますが、こちらはシングルクォートで括られた文字列を選択して、その文字列でFind Fileしています。
こちらはIdea Vimプラグインが必須です。
![Edit_Macros_と_KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/48f4d6b0-5bb8-a282-388e-780a41a75782.png "Edit_Macros_と_KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")