OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu12でHubot(IRCアダプター)の環境を作る

Ubuntu12でHubot(IRCアダプター)の環境を作ってみた時のメモ

# 環境

+ Ubuntu12_x64
+ nvm v0.31.1
+ Node.js 4.4.4


# nvmを使ったNode.jsのインストール

HubotはNode.jsで動作するのでnvmでnodeをインストールします。
LTSの4.4.4をインストールします。

C++ compierが必要でbuild-essentialとlibssl-devが必要なのでこちらもインストールします。

手順は以下の公式リポジトリを参照しました

[creationix/nvm](https://github.com/creationix/nvm)


```bash
# 関連パッケージのインストール
$sudo apt-get update
$sudo apt-get install build-essential libssl-dev
$sudo apt-get install git curl

# インストール
$curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash

# パスを通す
$source ~/.bashrc

# 確認
$nvm --version
0.31.1

# インストールできるものを確認
$nvm ls-remote

# 4.4.4をインストール
$nvm install 4.4.4

# 確認
$node --version
v4.4.4
```

# Hubotのインストール

次にHubotをインストールします。
以下公式ドキュメントを参考にします。

[HUBOT DOCUMENTATION](https://hubot.github.com/docs/)

```bash
# npm自体のアップデート
$npm install -g npm

# hubotのインスール
$npm install -g yo generator-hubot
$ mkdir myhubot
$ cd myhubot

# 色々聞かれるのがデフォルトでOK
$ yo hubot
```

# IRCアダプターをインストールする

`yo hubot`コマンド実行時にIRCアダプターをインストールしたい所なのですが、[hubot-irc](https://github.com/nandub/hubot-irc)の依存ライブラリの互換性でv0.2.8では動かなかったので以下のようにpakckage.jsonを編集して追記します。(具体的にはv0.2.8のpackage.jsonのircモジュールが0.3.9固定となっており古い。GitHubのマスターのpackage.jsonは新しいものを指定しているのでGithubのリポジトリを指定するように修正)

```package.json
{
  "name": "myhubot",
  "version": "0.0.0",
  "private": true,
  "author": "User <user@example.com>",
  "description": "A simple helpful robot for your Company",
  "dependencies": {
    "hubot": "^2.19.0",
    "hubot-diagnostics": "0.0.1",
    "hubot-google-images": "^0.2.6",
    "hubot-google-translate": "^0.2.0",
    "hubot-help": "^0.2.0",
    "hubot-heroku-keepalive": "^1.0.2",
    "hubot-maps": "0.0.2",
    "hubot-pugme": "^0.1.0",
    "hubot-redis-brain": "0.0.3",
    "hubot-rules": "^0.1.1",
    "hubot-scripts": "^2.17.2",
    "hubot-shipit": "^0.2.0",
    "hubot-irc": "git://github.com/nandub/hubot-irc.git"
  },
  "engines": {
    "node": "0.10.x"
  }
}
```

`"hubot-irc": "git://github.com/nandub/hubot-irc.git"`と前行のカンマを追加しています。

また、インストール前に依存するパッケージ郡をインストールします。

```bash
# 依存モジュールのnode-icu-charset-detectorで必要
$sudo apt-get install libicu-dev
```

次にC++アドオンのビルド用にGCCバージョンを4.8にします。(ubuntu12ではインストールされるのは4.6だったため)

[C++11のためにGCCの最新版をインストールする](http://venuschjp.blogspot.jp/2013/11/c11gcc.html)


```bash
# add-apt-repositoryコマンドを使えるようにする
$sudo apt-get install software-properties-common python-software-properties

# パッケージを追加
$sudo add-apt-repository ppa:ubuntu-toolchain-r/test

# インストール
$sudo apt-get update; sudo apt-get install gcc-4.8 g++-4.8

# 4.8の優先順位を上げる
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20 

# 元々のコマンドの優先度を下げる
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 10
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 10

# 4.8が使えるか確認
$ gcc --version
$ g++ --version
```

やっとで準備ができたのでIRCアダプターのインストールをします。

```bash
$npm install
```

エラーなくインストールできました！
Intel EdisonのFirmwareアップデート (Release 3.0 Yocto complete image)

#はじめに
Intel EdisonのFirmwareアップデートの手順です。
Release 2.1/3.0ではデータ容量が大きく、USB接続時にPCから認識できるドライブにFirmwareを書き込むことが出来ません。
別の書き込み手段であるFlash Tool Liteを使用した手順を紹介します。

【参考】https://software.intel.com/en-us/articles/flash-tool-lite-user-manual

#使用するもの
- Intel Edison本体
- Intel Edison Arduinoボード(Breakoutボードでも可)
- Micro USB ケーブル
- Flash Tool Lite (執筆時点でv5.5.2)
- Release 3.0 Yocto complete imgae

#注意点
- PCとEdisonとの接続は指定のタイミングまで行わないこと
- 書き込み終了後、2分間程度は電源を外さずに放置する必要あり

#Flash Tool Liteのインストール
[こちら](https://01.org/android-ia/downloads/intel-platform-flash-tool-lite)からダウンロードし、デフォルト設定のままインストールします。

#Edisonボードの設定
![edison1.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/bc35c026-eeb3-9f10-1d43-4e4fe70d52db.jpeg)
SW1スイッチをMicroUSB側に設定します。
MicroUSBケーブルはまだつなぎません。

#Firmware書き込み
1.Release 3.0 Yocto complete imgaeを[こちら](https://software.intel.com/en-us/iot/hardware/edison/downloads)からダウンロードし適当な場所に展開します。

2.Flash Tool Liteを起動しBrowse...をクリック。展開した場所にある.jsonファイルを指定します。
![ftl1.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/836a8985-79b8-5939-c51f-38ff73e18396.jpeg)

3.読み込みが完了すると、Flash file:の部分に.jsonのファイル名が表示されます。
Configuration:はMac/Linuxの場合はCDC、Windowsの場合はRNDISを選択します。
![FTL2.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/3d0082b6-69da-fb7a-9337-e93ab5bf3424.jpeg)

4.Start to Flashを押します。**この時点ではまだMicroUSBケーブルはつなぎません。**
![FTL4.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/b983ebd5-68a1-a7ad-46a1-443268b3e4b6.jpeg)

5.Multigadget MicroUSB ポート(SW1スイッチに近いほう)を接続します。
自動的に認識され、書き込みが開始されます。
※電源が足りない場合はPowerに電源を接続してください。
※もう一つのMicroUSBポートには何も接続しないでください。
![FTL5.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/a8bae161-37e7-06a1-2ff2-1455d8fa206e.jpeg)

6.進行ステータスが100%になったら書き込み完了です。書き込み完了後、2分間程度放置してください。
![ftl11.png](https://qiita-image-store.s3.amazonaws.com/0/107184/ec806313-65df-3af9-2418-d18e4c29f60c.png)
helm-git-grepで表示候補数を300以上にする

# あらまし

Linux KernelとかWebKitとかBlinkとか巨大なGitリポジトリを使っていると、
git grep してくれる helm-git-grep の結果が300程度じゃ役に立たないことも。

なのでカスタマイズしてより多く表示できるうようにする。

# 本題

helm-git-grep.el の先頭にこんなことが書いてあるので、

```el
(defcustom helm-git-grep-candidate-number-limit 300
  "Limit candidate number of `helm-git-grep'.
```

こうすればいい。例は1500

```el
(setq helm-git-grep-candidate-number-limit 1500)
```

# 余計な話

Helm グローバルにCandidate number limitがあるのかと探しまわってしまった。
defcustom探す方法ってどこかにあったような。
インターネットバンキング　ブラウザ　対応一覧

Windows10への無料アップグレードの期限が近づいてきました。
会社でインターネットバンキングを利用している場合ブラウザが対応しているかどうか気になるところです。

ということで各金融機関のインターネットバンキングサービス（法人向け）の対応状況を調べてみました。
OSとの組み合わせもありますが、一覧にはブラウザのみ表記しています。
最終的な確認は各金融機関の利用環境案内URLで確認するようにしてください。

追記：2016/5/25
主な金融機関ではほぼWindows10での利用が可能ですが、まだEdgeは利用できない場合がほとんどです。
Windows10にはIE11も入っていますが、デスクトップにはアイコンがないのでアイコンをタスクバーにピン止めする方法をSMBCのサイトで紹介されています。参考にしてみてください。
[Windows10におけるInternet Explorer11の起動方法](http://smbc.okweb3.jp/EokpControl?&site=valuedoor&tid=24007&event=FE0006)
追記終わり　

　
2016年5月24日現在

##都市銀行
| 金融機関名 | サービス名 | IE9 or IE10 | IE11 | Edge | Firefox | Chrome | 利用環境案内URL |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---|
| 三井住友銀行 | ValueDoor |〇|〇|×|×|×|http://www.smbc.co.jp/hojin/valuedoor/help/kankyo.html|
| 東京三菱UFJ銀行 | BizSTATION |〇|〇|×|〇|×|https://bizstation.bk.mufg.jp/service/kankyou.html|
| みずほ銀行 | みずほビジネスWEB |〇|〇|×|×|×|http://www.mizuhobank.co.jp/corporate/ebservice/account/b_web/index.html#condition|
| りそな銀行 | りそなビジネスダイレクト |〇|〇|〇|〇|×|http://www.resona-gr.co.jp/resonagr/b_direct/system_requirements.html|
| ゆうちょ銀行 | ゆうちょダイレクト |〇|〇|×|〇|〇|http://www.jp-bank.japanpost.jp/direct/pc/service/dr_pc_sv_index.html#use|


##地方銀行　兵庫県
| 金融機関名 | サービス名 | IE9 or IE10 | IE11 | Edge | Firefox | Chrome | 利用環境案内URL |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---|
| 但馬銀行 | インターネットFBサービス |〇|〇|〇|〇|×|https://www.tajimabank.co.jp/houjin/service/fb-riyou.html|
| みなと銀行 | みなとビジネスWeb |〇|〇|〇|〇|×|http://www.minatobk.co.jp/corporate/mbweb/requirement/|
Zybo > Chronicles blog 22 > tutorial > use an AXI interface to create a peripheral

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-Two-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/422249

> we’ll now use an AXI interface to create a peripheral in the Zynq SoC’s programmable-logic fabric.

以下、流れの抜粋

1. select the “create and package IP” option
2. Select the “Create new AXI4 peripheral” option
3. You can create a new IP location using the Manage IP section on the Vivado home page.
4. Peripheral Detailsの入力 (Vendor, Library, Nameなど)
5. Add Interfaces (Interface Typeなど)
6. Create Peripheral: Generations Options > Generate Drivers指定
7. 作成したperipheralをBlock Designに追加してconnectする (AXI GP busなどに接続)
8. peripheral addressの設定 > 4K以上を指定
Zybo > Chronicles blog 21 > PS / PL interconnected > theoretical bandwidths (DMA使用時) > AXI GPIO / AXI HP / AXI ACP

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-One-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/418935

| Interface | Width | IF Clock | Read BW | Write BW | Combined | No Ports | Total BW |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| AXI GPIO  | 32  | 150 MHz  | 600 MBps  | 600 MBps  | 1200 MBps  | 2  | 2400 MBps  |
| AXI HP  | 64  | 150 MHz  | 1200 MBps  | 1200 MBps  | 2400 MBps  | 4  | 9600 MBps  |
| AXI ACP  | 64  | 150 MHz  | 1200 MBps  | 1200 MBps  | 2400 MBps  | 1  | 2400 MBps  |

> You must use the Zynq SoC’s DMA controller to achieve the maximum speeds listed in the table above. 

...

> Without using the DMA controller, the maximum transfer rate from the PS to the PL side is 25Mbytes/sec.
Zybo > Chronicles blog 21 > PS / PL interconnected > AXI transfer types > AXI4 Burst transfers / AXI4-Lite for simple control interfaces / AXI4-Streaming for unidirectional data transfers

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-One-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/418935

> The Zynq SoC supports three different AXI transfer types that you can use to interface the PS to the PL side of the device:
 
> 
- AXI4 Burst transfers
- AXI4-Lite for simple control interfaces
- AXI4-Streaming for unidirectional data transfers
技術英語 > That was in the late 1700s, yet "Benedict Arnold" -- his name -- [lives on]. / further down the road

http://www.manythings.org/voa/wm/wm121.html

> That was in the late 1700s, yet "Benedict Arnold" -- his name -- <font color=red>lives on</font>.

http://eow.alc.co.jp/search?q=live+on
> 生き続ける

<hr>
関連して思い出したのは

> further down the road

ソースは失念。
道に迷った人が目的の場所について尋ねたところ、「さらに道を下ればいい」というアドバイスを受ける時に You can go further down the road. のように使われていた。
cocos2d-x 3.1.0 メモ

***
**スプラッシュ画面**
アプリ起動時に現れるスプラッシュ画像は　Resource　にあるファイル名　Defalt.png　が使われている。任意の画像に変更するとスプラッシュ画像が変わる。

***
**アイコン画像**
５７ｘ５７pxで作成して　Resources　に入れる。
info.plist　ファイルの Icon file で作成したアイコン画像を指定すれば採用される。
***
**アプリ名**
info.plist ファイルの Bundle display name で指定しておきましょう。アイコンの下に表示されます。
アイコン画像は自動的に iPhone が角丸の透明感のあるアイコンに加工される。
Tiny Tiny RSS(tt-rss)で今は亡きGoogleReader風の次へ、前へのボタンを追加するtampermonkey Script

[Tampermonkey](http://tampermonkey.net/) というuserScript用

これだよ、この右上の次へ 前へボタン。これが欲しい！

![imgTemp-2016-05-24-06-01-51.png](https://qiita-image-store.s3.amazonaws.com/0/5825/6c824939-7b2d-6e49-c617-56d3f8ecd5c8.png)
[File:Google Reader interface.png - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/File:Google_Reader_interface.png) より。一部加工

次へをポチポチ押しながらRSS消化していくのが日課だったのに、どこのrssリーダーにも無いんだから困る


```js:tt-rss
// ==UserScript==
// @name         TT-Rssにボタン追加
// @match        http://*
// ==/UserScript==
var root = document.createElement("div");
var nextButton =  document.createElement("button");
var prevButton =  document.createElement("button");

nextButton.innerText="次";
prevButton.innerText="前";

nextButton.addEventListener("click",function(){moveToPost('next', true);});
prevButton.addEventListener("click",function(){moveToPost('prev', true);});

root.appendChild(prevButton);
root.appendChild(nextButton);

document.querySelector("#toolbar>.dijitToolbar").appendChild(root);


```


![imgTemp-2016-05-24-06-06-17.png](https://qiita-image-store.s3.amazonaws.com/0/5825/44a83a83-fa21-6aee-e60c-8bd2555626e7.png)
じゃーん。これでOK

でも次へボタンをポチポチ押したけど、快適さが違う気がする・・・ GoogleReaderの挙動とかもう詳しく覚えてないしなあ。
有料でいいから再公開してくれ
Software and Tools accelerated developing

ブラウジングや開発のために導入しているソフトやツールリスト

1.Chrome extension
1.1 Instant Translate
1.2 Momentum
1.3 Panel Tabs

2.atom
3.CocosCreator
4.Unreal Engine
5.GameSalad
6.FireAlpaca
7.GitHubDesktop
8.Sculptris
9.Soundflowerbed

8.cocos2d-x
8.1 Python
8.2 AndroidStudio, Eclipce, JDK, SDK, NDK, Apache-ant
apt, yum,wget,curlの違いについて整理

# パッケージ管理ソフトとファイルダウンローダー

aptとyumはパッケージのインストールなどを行うパッケージ管理ソフト。
wgetとcurlはwebからファイルを取得するファイルダウンローダーとして使われることが多い。

# apt

apt は Debian系のOSで使用する。
dpkg(Debianのパッケージ管理システム)を呼び出す。

ちなみに。debianにはaptitudeというパッケージ管理ソフトもある。
http://inokara.hateblo.jp/entry/2013/03/23/101414

# yum

yum は RedHat系のOSで使用する。
rpm(RedHatのrパッケージ管理システム)を呼び出す。


# wget
HTTPやFTP経由のファイル取得を行えるコマンド。
再帰的なダウンロードが得意で、ディレクトリなどでも参照先を全てたどることができる。。

# curl
TP, FTPS, HTTP, HTTPS, GOPHER, TELNEなどの様々なプロトコルに対応した通信ライブラリ。
この名前は "Client for URLs" に掛けている。

# 参考
http://d.hatena.ne.jp/ctrlshift/20080129/1201612626
http://postd.cc/curl-vs-wget/
設定ファイルっぽいRubyコードでデータを定義する

Rubyコードでデータを定義するために[Dslh](https://github.com/winebarrel/dslh)というライブラリを作った。

たとえば以下のような一見、設定ファイルのようなRubyコードをDslhでパースすると…

```rb
dsl = <<-EOS
menu {
  id "file"
  value ["File", "(F)"]
  popup {
    menuitem {
      value "New"
      onclick "CreateNewDoc()"
    }
  }
  misc {
    desc "File menu"
    version 3
  }
}
EOS
```

Hashに変換される。

```rb
h = Dslh.eval(<<-EOS)
```
```rb
# h
{"menu"=>
  {"id"=>"file",
   "value"=>["File", "(F)"],
   "popup"=>{"menuitem"=>{"value"=>"New", "onclick"=>"CreateNewDoc()"}},
   "misc"=>{"desc"=>"File menu", "version"=>3}}}
```

逆にデータをRubyコードに変換することもできる。

```rb
h = {"menu"=>
      {"id"=>"file",
       "value"=>["File", "(F)"],
       "popup"=>{"menuitem"=>{"value"=>"New", "onclick"=>"CreateNewDoc()"}},
       "misc"=>{"desc"=>"File menu", "version"=>3}}}

dslh_opts = {use_braces_instead_of_do_end: true, force_dump_braces: true}
puts Dslh.deval(h, dslh_opts)
```
```rb
menu {
  id "file"
  value ["File", "(F)"]
  popup {
    menuitem {
      value "New"
      onclick "CreateNewDoc()"
    }
  }
  misc {
    desc "File menu"
    version 3
  }
}
```

# Hashの配列

設定ファイルをデータに変換する場合に、Hashの配列というのは割とよく出てくる。

若干コードっぽさが出てしまうが、これも記述できる。

```rb
h =  Dslh.eval(<<-EOS)
menu {
  id "file"
  value ["File", "(F)"]
  popup {
    menuitem {|*|
      value "New"
      onclick "CreateNewDoc()"
    }
    menuitem {|*|
      value "Open"
      onclick "OpenDoc()"
    }
    menuitem {|*|
      value "Close"
      onclick "CloseDoc()"
    }
  }
  misc {
    desc "File menu"
    version 3
  }
}
EOS
```
```rb
# h
{"menu"=>
  {"id"=>"file",
   "value"=>["File", "(F)"],
   "popup"=>
    {"menuitem"=>
      [{"value"=>"New", "onclick"=>"CreateNewDoc()"},
       {"value"=>"Open", "onclick"=>"OpenDoc()"},
       {"value"=>"Close", "onclick"=>"CloseDoc()"}]},
   "misc"=>{"desc"=>"File menu", "version"=>3}}}
```

こちらもデータをRubyコードに変換することができる。

```rb
h = {"menu"=>
      {"id"=>"file",
       "value"=>["File", "(F)"],
       "popup"=>
        {"menuitem"=>
          [{"value"=>"New", "onclick"=>"CreateNewDoc()"},
           {"value"=>"Open", "onclick"=>"OpenDoc()"},
           {"value"=>"Close", "onclick"=>"CloseDoc()"}]},
       "misc"=>{"desc"=>"File menu", "version"=>3}}}

dslh_opts = {use_braces_instead_of_do_end: true, force_dump_braces: true}
puts Dslh.deval(h, dslh_opts)
```
```rb
menu {
  id "file"
  value ["File", "(F)"]
  popup {
    menuitem {|*|
      value "New"
      onclick "CreateNewDoc()"
    }
    menuitem {|*|
      value "Open"
      onclick "OpenDoc()"
    }
    menuitem {|*|
      value "Close"
      onclick "CloseDoc()"
    }
  }
  misc {
    desc "File menu"
    version 3
  }
}
```
PL/SQLブロックでデータ投入


大量のデータ投入が必要で、
突貫でPL/SQLブロックでツールを作成したので覚え書き。

#PL/SQLブロックとは

sqlplusで実行できるプログラム。
ストアドプロシージャと違って、プロシージャの作成は不要。
と理解している。

#PL/SQLブロックの構成

```
DECLARE
　宣言部
 
BEGIN
　実行部

EXCEPTION　 
　例外処理
　
END;
/
```

#パーティション単位で投入

リストパーティションのパーティション単位でトランザクションを切ってデータの投入および更新を行った。
パーティション名がhoge_01,hoge_02のように連番だったので次のように対処。

##上手くいった例

パーティション名を文字列連結すると動的なSQLにすることができる。
登録・更新の場合は、sql_stmtをinsert/updateに読み替えよう。

```文字列連結
--part_nameには、for loopでhoge_01やhoge_02のようなパーティション名の文字列を作成し代入

sql_stmt := 'select hoge from table_name partition (' || :part_name || ') t where・・・';

EXECUTE IMMEDIATE sql_stmt into vHoge using part_name;

end loop;

```

##失敗した例
partition句がハマったポイント。
partition句にはバインド変数が使えない。
パーティション名をバインド変数で渡そうとするとエラーになる。

```ダメな例1
--part_nameには、for loopでhoge_01やhoge_02のようなパーティション名の文字列を作成し代入

select hoge into vHoge from table_name partition (:part_name) t where・・・
```


```ダメな例2
--part_nameには、for loopでhoge_01やhoge_02のようなパーティション名の文字列を作成し代入

sql_stmt := 'select hoge from table_name partition (:part_name) t where・・・';

EXECUTE IMMEDIATE sql_stmt into vHoge using part_name;
```

#PK単位で投入

##カーソルforループ

アカウントのようなPKの単位でトランザクション切ってデータの投入および更新を行った。
カーソルを使ってアカウント毎に処理。
宣言部でカーソルにPKを読み込む。この例ではaccount。

```宣言部
DECLARE
 cursor cur is
 select account from table_name where ・・・;
```

カーソルforループで処理。
where句にPK(この例ではaccount)を指定。
forループ内でselectするなり、updateするなり、insertするなり、deleteするなり、好きにすればいい。

```実行部
BEGIN
 for c in cur loop
 
  --カーソル変数.項目名で参照
  select hoge from table_name where account = c.account;
   
  commit;
  
 end loop;

END;
/
```

ツールを作って楽しましょ。
ApexとnpmでLambda開発環境のテンプレートを作ってみた


[Apex](http://apex.run/)は、AWS Lambdaのデプロイや実行が簡単にできるようになる、Lambda開発には必須と言っても過言ではないツールです。
ただ、サーバレスでイベントドリブンなLambdaの開発は、パッケージ管理やテストが若干面倒で、Apexだけでは物足りなかったので、npmをどうにか使えないか調べた所、[AWS Lambdaの関数をnpmでパッケージ管理](http://qiita.com/imaifactory/items/ac81b4a3ff4a5f5dec85)という記事が大変参考になりました。
そこで、上記記事を参考にApexとnpmでテスタブルなLambda開発環境のテンプレートを作ってみました。

[Apex-npm-template](https://github.com/tayasu/apex-npm-template)

## Apex-npm-templateの使い方

### 必要な環境

* Node.js 4.3.2
* Apex 0.9.0

### セットアップ→デプロイ→実行

```
$ git clone https://github.com/tayasu/apex-npm-template.git
$ cd apex-npm-template
$ apex deploy
$ apex invoke hello
```

### ローカルでテスト→デプロイ

```
$ cd functions/hello
$ npm install
$ npm test
$ npm run apex deploy #functionディレクトリからapex実行するrun-script
```

## Apex-npm-templateで出来ること

### Lambdaの最新の実行環境であるNode.js 4.3.2に対応

ES6サポートなんで、アロー関数やPromiseが使えます。
特に便利だった機能が、AWS.RequestオブジェクトのPromise対応です。下記のように簡単に同期処理が書くことができます。

```javascript
s3.getObject(param).promise().then((data) => {
  // S3のデータを取得して結果を処理
  return data.Body.toString().toUpperCase();
}).then((value) => {
  // S3の処理完了後に同期的に次の処理
  console.log(value);
}).catch((error) => {
  // エラー処理
  console.log(error);
});
```

詳しくは ["Making Requests in Node.js" の "Support for Promises"](http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-making-requests.html) の項を参照ください。
 
### ローカルでテスト時にApexの環境変数を読み込み

Apexの便利な機能のひとつである環境変数機能をローカルでテスト実行にも利用できるようにしました。
Apexでbuildした際に`project.json`と`function.json`の環境変数をマージして`env.json`を作っていたので、同様の処理を`npm test`時にも行っています。
Apexの環境変数は下記のようにプロジェクトの環境変数と、functionごとの環境変数を管理でき、複数のfunctionを管理する場合には非常に便利です。

プロジェクトの環境変数

```json:project.json
{
  "environment": {
    "FOO": "Be overwritten by function.json",
    "BAR": "bar"
  }
}
```

ファンクション毎の環境変数

```json:function.json
{
  "environment": {
    "FOO": "foo"
  }
}
```

プロジェクトとファンクションをマージした結果

```js:index.js
  console.log('ENV:%s,$s', process.env.FOO, process.env.BAR); //ENV:foo,bar
```

## 本番環境と開発環境の切り替え

Apexとnpmでローカルで簡単にテストができるようになると、次はLambdaの本番環境と開発環境を分けたくなります。
Apex-npm-templateには含めませんでしたが、私は下記の記事を参考に環境ごとに`project.json`を切り替えて運用しています。

[Lambda with Apex: 環境変数で環境別にLambda環境を整える](http://qiita.com/gaishimo/items/af2a05bcaf4cb96e534b)
Rツリーインデックス

# はじめに
最近インデックスのお勉強をしています
インデックスは集合論に近いと聞いて、数学出身の身からすると多少の興味は湧きます
Rツリーインデックスという地図検索で使われているインデックスの勉強をしたので、備忘録としてまとめます

# Rツリーインデックスとは
* 別名空間インデックス
* 検索した図形が他の図形に含まれているか、重なるかの判定とかに使える
* RツリーのRは `Rectangle` のこと
* 最小外接矩形という概念を用いてインデックスを構成する
    * 最小外接矩形とはある図形をちょうど囲う長方形のこと

# 最小外接矩形の囲い方
◯が適当な地図とします
最小外接矩形は長方形ですので、◯を四角で囲います その四角を子ノードとして扱います
![スクリーンショット 2016-05-24 0.07.25.png](https://qiita-image-store.s3.amazonaws.com/0/80717/3752ac13-bb03-5c6c-e307-ebfcc177bd2a.png)

これを複数の画像に施して、適当な子ノードを親ノードにまとめます
まとめた親ノードを更にまとめて・・・を繰り返して、1個のルートノードにまでまとめます

# 例
3世代だとこんな感じ
最小外接矩形の最小性から、本当は親ノードと子ノードはくっついてなきゃいけないんだけど、くっついているテイで見てください
ルートノードと親ノードも同様です
ルートノード(R8)⇒親ノード(R6,R7)⇒子ノード(R1,R2,R3,R4,R5)
![スクリーンショット 2016-05-24 0.10.05.png](https://qiita-image-store.s3.amazonaws.com/0/80717/0b30a4ad-d525-fd9f-3ec9-36c5021d5c3f.png)

ツリー構造を書くとこんな感じです

![スクリーンショット 2016-05-24 0.22.03.png](https://qiita-image-store.s3.amazonaws.com/0/80717/64c9a1bc-1e5f-88ef-09c3-f4cb745d022c.png)


# 検索
基本的にはBツリーと同じように検索します
検索する図形を黄色と赤色とする
![スクリーンショット 2016-05-24 0.29.13.png](https://qiita-image-store.s3.amazonaws.com/0/80717/42a3826e-bada-31a6-2cb4-d36babcac853.png)

①まず黄色の場合
これはBツリーと同じように、R8⇒R6⇒R3と検索する
と言うわけではないです。
赤色探す話しを先にします

②赤色の場合
まずルートノードR8に含まれるのは明らか　これはよし
次に、R6に含まれる事を確認
Bツリーならこの後子ノードを見に行きますが
RツリーはR6に含まれる事を確認しても、R7に含まれるかを確認します。
黄色を探す時も本当はR7に含まれるか確認しています(黄色はここがBツリーと違う)

各色の検索をする際に、なめたノードをツリー構造に線を引いて表現
赤色は結局全ての子ノードに含まれていないか見ています
黄色はR7に含まれていないのでR4,R5は見ていません
![スクリーンショット 2016-05-24 0.34.50.png](https://qiita-image-store.s3.amazonaws.com/0/80717/459757ce-cf79-8565-8f14-a284d6b5497d.png)

# おわり
Bツリーの話しは一切しませんでした。ごめんなさい。
ザックリと自分が理解している概念を書いているので、誤りがあったらごめんなさい。
なんでここで懺悔してるんだ・・・
図形のインデックスとかもろ集合っぽくて楽しい
インデックスが楽しいと言うか集合が楽しい
学生やってた頃が懐かしい。。
早く集合の考え方を社会に活かしたいものですね。
Karabinerのプロファイルをショートカットキーで切り替える

#### 対象読者

Mac使いで、Karabinerを使っていて、プロファイル結構頻繁に変える人

#### はじめに
[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)便利ですよね。
普段Mac使いだけど、好みのキーボードがWindows用しか無いんじゃあ！って感じでWindows用キーボード使ってる人には欠かせないソフトでしょう。

私はKarabinerでMac本体にくっついてるキーボードを打つときと、キーボードを接続してる時でプロファイルを変更する様にしているんだけど、職場で自席ではキーボードを接続、席を外すときはキーボードを外す、ってシーンがまぁまぁあって、その時プロファイルを変更するの忘れて、コピペしようとした時に「ç」とか「√」みたいな謎の文字が出現する、ってパターンがそれなりに多い。（Command keyとOption keyを入れ替えてるため）

せっかく文字打とうとしてるのにいちいちメニューバーからプロファイルを変えるのも鬱陶しいから、ショートカットキーで切り替えたいんじゃあ、って思って設定探したけど、どうやらデフォルトだとそんなショートカットは用意されてない模様。

ググったら[こんな記事](http://apple.stackexchange.com/questions/143060/how-to-switch-karabiner-profile-via-shortcut
)が見つかった。

私は↓の2つのプロファイルしか使わないので、これらをtoggleで切り替えられる用にする。
![Karabiner.png](https://qiita-image-store.s3.amazonaws.com/0/13044/b0166b7c-b760-0226-0e5b-879a81356257.png)

#### 環境
- Mac OS X 10.11.4 El Capitan
- Karabiner 10.18.0

#### 設定方法
メニュー->Karabiner->Preference->Misc & Uninstall->Open private.xml
![Karabiner_Preference.png](https://qiita-image-store.s3.amazonaws.com/0/13044/756e8d8a-a2cb-70fc-4d39-c5681d0bba2f.png)

```xml:private.xml
<?xml version="1.0"?>
<root>
    <vkopenurldef>
        <name>KeyCode::VK_OPEN_URL_SHELL_switchprofile_default</name>
        <url type="shell">
            <![CDATA[    /Applications/Karabiner.app/Contents/Library/bin/karabiner select_by_name Default; osascript -e 'display notification "Switch to Default" with title "Karabiner"'    ]]>
        </url>
    </vkopenurldef>
    <item>
        <name>Switch Profile to Default with F4</name>
        <identifier>private.switch1</identifier>
        <autogen>
            __KeyToKey__
            KeyCode::F4,
            KeyCode::VK_OPEN_URL_SHELL_switchprofile_default
        </autogen>
    </item>
    <vkopenurldef>
        <name>KeyCode::VK_OPEN_URL_SHELL_switchprofile_majestouch</name>
        <url type="shell">
            <![CDATA[    /Applications/Karabiner.app/Contents/Library/bin/karabiner select_by_name Majestouch; osascript -e 'display notification "Switch to Majestouch" with title "Karabiner"'   ]]>
        </url>
    </vkopenurldef>
    <item>
        <name>Switch Profile to Majestouch with F4</name>
        <identifier>private.switch2</identifier>
        <autogen>
            __KeyToKey__
            KeyCode::F4,
            KeyCode::VK_OPEN_URL_SHELL_switchprofile_majestouch
        </autogen>
    </item>
</root>
```

F4キーでそれぞれDefaultプロファイルとMajestouchプロファイルに変更する2つの設定を用意する。ショートカットキーをどこにあてるかはお好みで。
てかKarabinerでshell書けるの初めて知った。なんでも出来るなこいつ。

Preference->Change Keys->Reload XML

でXMLをリロードして、Defaultプロファイルには"Switch Profile to Majestouch with F4"を、Majestouchプロファイルには"Switch Profile to Default with F4"をそれぞれ割り当てる。

Defaultプロファイルの設定がこんな感じ↓　Majestouchプロファイルは上だけチェック。
![Karabiner_Preference2.png](https://qiita-image-store.s3.amazonaws.com/0/13044/c0958d7b-1d89-414d-a855-8d36b4688229.png)

これでOK。

切り替わったかがわかりにくかったので、通知を出すようにした。
![notification.png](https://qiita-image-store.s3.amazonaws.com/0/13044/2747301a-f7ac-cb38-bcef-afddea6ab362.png)

鬱陶しい場合は、private.xmlの
`osascript -e 'display notification "Switch to Majestouch" with title "Karabiner"'`
のあたりを消せば良い。

これでキーボードだけでキーボード切り替えが出来るぞ！やったね！
Pythonで写真や動画ファイルを整理する

# そもそも

Pythonが書けるようになりたい。手元にたくさんある未整理の画像/動画ファイルを自動で整理するコードを書いてみる事にしました。

# 仕様

```
python seiri.py [OPTION] [TARGET_PATH] [DEST_PATH]
```

TARGET_PATH に指定された画像あるいは動画ファイルをその撮影日時に合わせてリリネーム、[DEST_PATH]で指定されたディレクト以下に撮影日時及びデバイス毎に分類されたディレクトリ以下にコピーあるいは移動する。

TARGET_PATH に指定されたパスがディレクトリならば、そのディレクトリ内に存在する画像あるいは動画ファイルに対してまとめて実行する。

```text:OPTION仕様
-c, --copy
    ファイルをコピーして分類する。(Default)
-m, --move
    ファイルを移動して分類する。
-t, --test
    コピーも移動も行なわない。ファイルの探索と情報取得を行うだけ。
-r, --recursive
    TARGET_PATHにディレクトリが指定された場合に、そのサブディレクトリを再帰的に処理する。
--add-orgname
    リネーム時に元のファイル名を残す。
--skip-duplicated
    ファイル処理時に同名のファイルが既に存在した場合に同一ファイルであば処理をスキップする。
```
***

リネーム規則と分類ディレクトリの構造は以下のようにしたい。`--add-orgname`が指定されていなければ、`[元ファイル名]`は付かない。

```text:リネーム規則
[年]_[月][日]_[時][分][秒][デバイス名]_[元ファイル名].拡張子

例 : 2016_0503_193045_iPhone5_IMG123.jpg
```

```text:分類ディレクトリ構造
.
`-[YEAR]
   `-[デバイス名]

例 : 
.
+[2015]
|  +[iPhone5]
|  +[iPhone6]
|  +[HDR-CX430V]
|  `[PENTAXK100D]
`[2016]
   +[iPhone6]
   +[HDR-CX430V]
   `[PENTAXK100D]
```

撮影デバイス毎に分類される方がいいですよね。


# ソースコード

[exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/)の導入が必要になります。

https://github.com/masushin/MediaSeiri


# まとめ

exiftoolを`subprocess.check_out`で実行結果の標準出力を取得して、そこから必要な情報を抜き出しています。

大量にファイルがあると`subprocess.check_out`から長い時間戻ってこなくなるので、動作しているのかわからない状態になります。出力を随時処理できるような仕組みにしないといけない。

手元にあった写真・動画群はこれで整理することが出来ました。JPG/MOVしか想定していないので、それ以外のファイルにちゃんと対応するには別のexiftoolタグを取らなければならないかもしれません。
travis-sphinxでGithub PagesにSphinxドキュメントを公開してみる

## 概要

[travis-sphinx](https://github.com/Syntaf/travis-sphinx)を利用してみたので、その際の手順を記事として残しておきます。
travis-sphinxはGithubのSphinxのドキュメントをTravis CIでビルドし、gh-pagesブランチにPushするまでを自動化するツールです。

利用方法については[README.md](https://github.com/Syntaf/travis-sphinx/blob/master/README.md)を参考にしています。

## 前提

今回は以下のバージョンで動作確認しています。

|ツール  |バージョン |
|-------|-----------|
|Python  |3.5.1      |
|Sphinx |1.4.1      |

## gh-pagesブランチの作成

まず、Github Pages用のブランチを作成します。

```bash
    git checkout -b gh-pages
    git rm -rf .
    git push --set-upstream origin gh-pages
```

さらに、gh-pagesブランチにあらかじめ`.nojekyll`ファイルを作成し、pushしておきます。

## Githubのアクセストークンを取得

travis-sphinxが、gh-pagesブランチへドキュメントをPushするためにアクセストークンが必要になります。
以下のGithubのアカウントのPersonal Settingsメニューから設定を行います。

![github-settings.png](https://qiita-image-store.s3.amazonaws.com/0/124612/7599e3f9-2cd9-da0d-e5a3-3a49687a6900.png)

Personal Settings > Personal access tokensメニューを開き、「Generate new token」よりアクセストークンを取得します。
アクセストークンのscopesはpublic_repoを選択しておけば問題ありませんでした。

![personalaccesstoken.png](https://qiita-image-store.s3.amazonaws.com/0/124612/17e235c2-0c9b-3123-57b5-32bba7f7a62d.png)

Travis CI側のプロジェクトのSettingsより、環境変数にGH_TOKENを作成し、Githubで取得したアクセストークンを設定します。

![travisci-settings.PNG](https://qiita-image-store.s3.amazonaws.com/0/124612/57459585-6cf2-5fac-56b4-254169ef539d.png)


## .travis.ymlの作成

今回は以下のようなpython3.5の環境でビルドするような`.trais.yml`を作成して試してみました。
スクリプトでは、`travis-sphinx build`と`travis-sphinx deploy`を呼び出しておけば、ドキュメントのビルドとPushを行ってくれるようです。

```yaml
language: python
python:
    - "3.5"

before_install:
    - wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh
    - chmod +x miniconda.sh
    - "./miniconda.sh -b"
    - export PATH=/home/travis/miniconda2/bin:$PATH
    - conda update --yes conda
    - sudo rm -rf /dev/shm
    - sudo ln -s /run/shm /dev/shm

install:
    - conda install --yes python="3.5" sphinx
    - pip install --user travis-sphinx

script:
    - travis-sphinx build --source=example build

after_success:
    - travis-sphinx deploy
```

## おわりに

[travis-sphinx](https://github.com/Syntaf/travis-sphinx)のREADME.mdを読めば、特につまることなく利用し始められると思いますが、非常に簡単にGithub Pagesへの公開まで自動化できて感動したので使い方をまとめました。

ちなみに、最近、Sphinxにはまっていてテーマを作った際にtravis-sphinxを利用してGithub Pagesにデモドキュメントを公開してみました。
ということで、こちらのテーマもよろしくお願いします。
http://myyasuda.github.io/sphinxbootstrap4theme/
swagger.jsonからd.tsを作るsw2dtsを作った


最近自分の専門がよくわからなくなってきてる[りんご](https://twitter.com/mstssk)です。

[Swagger](http://swagger.io/)でAPI情報を記述するJSON（便宜的にswagger.jsonと呼んでます）から、TypeScriptで使用する型定義ファイル（*.d.ts）を生成するツールを作りました。

https://www.npmjs.com/package/sw2dts

中の実装はswagger.jsonを[dtsgenerator](https://www.npmjs.com/package/dtsgenerator)が食える形に整形しているだけです。

### 使用例

```
$ sw2dts swagger.json > model.d.ts
```

```swagger.json
{
  "swagger": "2.0",
    〜略〜
  "definitions": {
    "Foo": {
      "type": "object",
      "properties": {
        "id": {
          "format": "int64",
          "type": "string"
        },
        "bar": {
          "$ref": "#/definitions/Bar"
        },
        "name": {
          "type": "string"
        },
        "count": {
          "format": "int32",
          "type": "integer"
        },
        "ids": {
          "type": "array",
          "items": {
            "format": "int64",
            "type": "string"
          }
        }
      }
    },
    "Bar": {
      "type": "object",
      "properties": {
        "id": {
          "format": "int64",
          "type": "string"
        }
      }
    }
  }
    〜略〜
}
```

```model.d.ts
export interface Bar {
    id?: string; // int64
}
export interface Foo {
    id?: string; // int64
    bar?: Bar;
    name?: string;
    count?: number; // int32
    ids?: string /* int64 */ [];
}
```
Monologでtsv出力

俺は行データが好きだ。
特にtab区切り。

ということでMonologで以下の様なtab区切りデータが出るようにする。(日と時間の間はtabで無くスペース)

```application.log
2016-05-23 17:03:27	1	3300
```

```composer.json
{
    "require": {
        "monolog/monolog": "@stable"
    }
}
```


```index.php
require ('path/to/vendor/autoload.php');

# ロガーのセットアップ
# コンストラクタの引数は識別ラベルのようなもの。ちょっと使うぶんにはあまり気にしなくていい。
$log = new Monolog\Logger('application_log');
$handler = new Monolog\Handler\StreamHandler('path/to/logs/application.log', Monolog\Logger::INFO);

# formatの指定。%datetime%で日付時刻を出力。
# その他の引数で渡す文字列は%message%に入ってくる。
$format = "%datetime%\t%message%\n";

$handler->setFormatter(new Monolog\Formatter\LineFormatter($format));
$log->pushHandler($handler, Monolog\Logger::INFO);

# 実際のロギング処理
$id = 1;
$amount = 3300;
$message = implode("\t", [$id, $amount]);
$log->addInfo($message);
```

詳しいことはMonologのコードを読めばわかるはず
DOM7011沼にハマった話

# DOM7011
- ググってもこれって感じのがでてこない。書くまでもない基本中の基本なのかも。まぁせっかくなのでメモっておきましょうね。

# 事象
- JavaScriptで書いたUWPアプリをモバイル実機に入れて弄ってみると、アプリをフォアグラウンドに戻す度にこんなメッセージが出てきて勝手にHTMLをリロードしてくれる。いきなり全面真っ白になってレンダリングを始めるDOM7011の挙動自体もセンスがなくて哀しくなってくる。

```
DOM7011: The code on this page disabled back and forward caching. 
For more information, see: http://go.microsoft.com/fwlink/?LinkID=291337
```

# 原因
- VSのスタブでも、appxmanifestのStartPageを`index.html`から`ms-appx-web:///index.html` に書き換えたらあっさり再現した。
- つまり`ms-appx-web:///` と書くとDOM7011になる。

# 対策
- ms-appx-webでないとアプリが画面固定でスクロール不可の謎仕様になるので、ms-appx-webを使わないという回避策はとれない。
- ためしに `ms-appx-web://(アプリID)/` と書いてみた。DOM7011にならなかった！そういうこと？

# 結論
- JavaScriptなUWPで `ms-appx-web:///` って書いちゃらめぇ〜
CentOS6で Serverspecを簡単にインストールする。


## 概要
CentOS6のyumの標準レポジトリでは、ruby1.8系で、
そのままだと、Serverspecをインストールすることができません。


```
[root@localhost ~]# gem install serverspec
 ERROR:  Error installing serverspec:
	net-ssh requires Ruby version >= 2.0.
```
なお、CentOS7でしたら問題ありません。


そこで、ruby2.1系がビルドインされているChefDKを`rpm`で先にインストールし、
ChefDKに付属している、gem でServerspecをインストールします。
通常、rbenv などを利用しコンパイルしてrubyを導入する必要がありますが、
これですと、Chefを入れるついでに、Serverspecも簡単に導入することができます。


## 手順

1. [ChefDK](https://downloads.chef.io/chef-dk/)のページから、rpmをダウンロード、インストール

    ```
    wget https://packages.chef.io/stable/el/6/chefdk-0.14.25-1.el6.x86_64.rpm
    rpm -Uvh chefdk-0.14.25-1.el6.x86_64.rpm
    chef --version
    ```

    rpmのURLは、2016-05-23時点の最新

1. Serverspec をインストール

    ```
cd /opt/chefdk/embedded/bin
./gem install serverspec 
ls -la /opt/chefdk/embedded/bin/serverspec-init
-rwxr-xr-x. 1 root root 511 May 17 02:12 /opt/chefdk/embedded/bin/serverspec-init
    ```

1. rakeコマンドをシンボリックリンクでPATHが通っている場所に設置する

Serverspec は rakeコマンドで実行されます。このままですと、rakeコマンドはのPATHは通っていません。
また、初期設定用のserverspec-init コマンドもPATHが通っていませんので通しておきましょう。

```
ln -s /opt/chefdk/embedded/bin/serverspec-init /usr/bin/serverspec-init
ln -s /opt/chefdk/embedded/bin/rake /usr/bin/rake
```

以上で、インストールは完了です。
以降は、Serverspecの使い方が載っている記事を 
参考にしていただければOKかと思います。

快適な Chef＆Serverspec 生活を＼(^o^)／
Edisonで音声を扱うためにsoxをインストールする

EdisonにUSBオーディオを接続するとALSA経由でアクセスすることが出来る。最初から`arecord`や`aplay`コマンドは使えるが、soxをインストールすれば

- 『一定音量が来たら録音』
- 『決めた時間再生』
- トリミング・混合
- X倍速再生

などの細かいコントロールができる。

soxについては以下を参照の事：
[『今更聞けない目的別soxの使い方』](http://qiita.com/mountcedar/items/a04ebc4f8c27c226bbff)

# インストール

```sh
cd /usr/src
wget http://sourceforge.net/projects/sox/files/sox/14.4.1/sox-14.4.1.tar.gz
tar zxvf sox-14.4.1.tar.gz
cd sox-14.4.1
./configure
make all
make install
```

結構時間が掛かる。

# ALSAデフォルトカードの設定
`/etc/asound.conf`に以下を記載する。

```
pcm.!default {
	type hw
	card 2
}

ctl.!default {
	type hw           
	card 2
}
```

リブートして以下の様なコマンドで音声が再生されるか確認する

```sh
sox test.wav -d
```

# 作例
また、Pythonを使ってスイッチを押すとメモが録音できる装置を作ってみた。


```py:soundcut_text
import mraa
import time
import commands

sw = mraa.Gpio(32)
sw.dir(mraa.DIR_IN)
sw.mode(mraa.MODE_PULLUP)

state = 0

while True:
    if sw.read() == 0:

	commands.getoutput("sox gochuumonwodouzo_01.wav -d")

	commands.getoutput("sox -c 1 -d voice.wav silence 1 00:00:00.05 -25d 1 00:00:01 -25d")

        time.sleep(1)
	       
	commands.getoutput("sox voice.wav -d")
	time.sleep(2)
	
	commands.getoutput("sox gochuumonwaijou_01.wav -d")

    time.sleep(0.2)

```

押しボタンが繋がっているGPIO(32)を監視して、もし押されたら音声再生。その後Voice.wavには録音したものが収められるのだが、-25dB以上の音が0.05秒来たら録音開始、逆に-25dB以下の入力が1秒以上続いたら録音終了というコードです。

# 最後に
かなりたくさんの機能があるsoxと、コンパクトで使いやすいEdisonを組み合わせると大変ユカイであることがわかった。特に録音。例えばJuliusを乗っけて音声認識とか、コスプレ用ガジェット（音も出る！！）とかやって行きたい。
Subversion で 413 Request Entity Too Large が出ちゃってサーバーの設定も変えられない時の対応

サーバーの設定が変更できないんだったらコマンドライン版SVNで解決だ！

```
svn update [PATH...]
svn cleanup [PATH...]
```
これを好きなだけコピペしてshellでもbatでも書くだけ！

この話すると結構鼻で笑われるけど個人的には至って真面目な解決法だと思ってます。

ちなみに先にエクスポートしておいてそこにupdate(?)かけるのでもいい(らしい)。
これをやっていたときに上司が教えてくれたけど、自分はその方法は使わなかったので分からないです。
サクラエディタ 正規表現

# 初めに
- サクラエディタを業務で使うけど、よく正規表現がどんな感じだったか忘れるから、その備忘録。
- よく使う（忘れる）やつを徐々に追記していく。

# 指定した文字/文字列が含まれる行を指定


```:検索文字を含む行を指定
^.*検索文字.*\n
```

- "\n"は改行コードなので、環境に合わせて変更すること
    - Linuxなら"\n"、Windowsなら"\r\n"が改行コードになる（はず。。。）

# 指定した文字/文字列が含まれない行を指定

```:検索文字を含まない行を指定
^((?!検索文字).)*\n
```

- いまいちよくわらかないけど、これでいけたw

# 任意の1文字
"."で改行を除く任意の1文字になる

例:

```:任意の1文字
20091212
20091213
20101212
20101213
20111212
20111213
20121212
20121213
```

上記があった場合に"2...1212"と指定した場合は以下が
ヒットする

```:任意の1文字
20091212
20101212
20111212
20121212
```

## 参考サイト
http://sakura-editor.sourceforge.net/htmlhelp/HLP000089.html
MadMapperとUnityを連動する

# MadMapperとは
MadMapperはプロジェクションマッピングをするためのソフトです。
[こちら](http://www.madmapper.com/)から無料のデモ版がダウンロードできます。
デモ版がロゴが表示されます。

# Unityとの連携方法
Syphon Pluginを経由してUnityの画像をMadMapperに送ることができます。
https://github.com/Syphon/Unity3D/releases

DLしたZip内の以下のパッケージをUnityプロジェクトにインポートします。
SyphonUnityPlugin1.0_Public_Beta2a17.unitypackage

その後、Syphon Server Textureをカメラにアタッチします。

# 注意点
Syphonで送る際、
Edit -> Project Settings -> Player
から
Auto Graphics API for Macのチェックを外し、
Graphics APIs for Mac
でOpenGL2を一番上にする必要があります。

![07824429-bb85-b2e1-4f7f-cbb7ff4ab4cb.png (604×1890) 2016-05-23 23-16-41.png](https://qiita-image-store.s3.amazonaws.com/0/34936/62b23f69-8b04-0455-d462-eb208d166d8f.png)

# 参考
http://qiita.com/asus4/items/6c4f8b2a0c681eb54a4a
【続】機械学習 画像認識のGoogle 対 Microsoftに続き、IBM Watsonやってみた

#はじめに
前回、機械学習で作られた画像認識サービスのGoolge Cloud VisionとMicrosoft Computer Visionの認識結果を比較してみました。
http://qiita.com/tomohiku/items/2969db0c13582c5bc4b3

続いて、AIやデータ分析関連では最近どこの企業にいっても検討していると聞くようになったIBM Watsonファミリーの画像認識を試してみました。
どうやらIBM Watsonというブランドで提供されている画像認識は、AlchemyAPI社から買収した機能のようです。そのため、AlchemyAPI社で提供されているデモサイトで前回と同じ画像を試しました。

#使ったサービス
・IBM傘下のAlchemyAPI社 Alchemy Vision
ログインなど無しで簡単に試せるデモサイトがあったため、そちらを利用
http://vision.alchemy.ai/

#試した結果
●1つ目●
![demo-image.jpg](https://qiita-image-store.s3.amazonaws.com/0/74428/e64b1e20-3d92-5609-c313-71e6d3df5f55.jpeg)

![image](https://qiita-image-store.s3.amazonaws.com/0/74428/c0935bbe-f812-9c61-a1f5-446ba510c959.png)

いい感じ！GoogleやMicrosoftでは無かった Retriver（犬の種類）まで出てきている。

●2つ目●
![IMG_20160403_103149v2.jpg](https://qiita-image-store.s3.amazonaws.com/0/74428/12bcd92f-38cd-0577-8e9b-4b73fb43d8ba.jpeg)

![image](https://qiita-image-store.s3.amazonaws.com/0/74428/771f2cce-bc7b-f0ca-4676-995127283f41.png)

あれっ？Animal？

●3つ目●

![IMG_20160228_120415v2.jpg](https://qiita-image-store.s3.amazonaws.com/0/74428/379cc5bb-7475-7753-a80c-d4e7383d8897.jpeg)

![image](https://qiita-image-store.s3.amazonaws.com/0/74428/f520c6ee-9202-f841-8063-3de76d299927.png)

ん？

●4つ目●
![IMG_20151105_193248v2.jpg](https://qiita-image-store.s3.amazonaws.com/0/74428/88602bf7-37c6-47bb-c3f8-7a850a2290aa.jpeg)

![image](https://qiita-image-store.s3.amazonaws.com/0/74428/02caf60c-e912-f445-d7cd-51084cea83fb.png)

・・・？

#考察
おそらく学習データが動物(犬以外は？)に特化しているのではないかと予想されます。
そのため、学習を正しく行えば犬種などもほぼ正確に出せるということを示しており、　
企業内で利用する場合は、その内容に合致した学習データを使ってモデルを作る必要があるということですね。
とはいえ、企業内で画像認識用に学習データを作ることは荷が大きすぎますし、
サービス提供側からそれは提供しないとサービスとして成り立たないように感じます。
という観点だと汎用的な写真に幅広く対応している Google や Microsoft のサービスの方が
利用できるシナリオが多いように感じました。

#おわりに
Microsoftが今年の2月ごろに出した犬種判別アプリは、Watsonに対抗して出したんじゃないかと今回の結果を見て思いました。Watsonが商談で使っていたのに対応するためかな。あくまで勝手な予想ですが。

・Fetch! A Microsoft Garage Project
https://itunes.apple.com/jp/app/fetch!-microsoft-garage-project/id1050367912

前回も同じことを書きましたが、この技術すごいことはすごいのですが、
現状は利用用途が限られそうに感じます。
例えば、MicrosoftやFacebookが行っていた視覚障害者へ
「今、前に何がみえているか」を音声で伝えるサービスなどが最適なソリューションですね。

今後、利用が爆発的に増えるのは、
犬種のような、やや専門的な知識を幅広く教えてくれるようになった時だと思われます。
以前にMicrosoftがFuture Visionという名前で出していたビデオで、
知らない植物をモバイル端末で写したら、その植物の名前を教えてくれるというシーンがありました。

・MicrosoftがFuture Vision 2013年版
https://www.youtube.com/watch?v=ozLaklIFWUI

これを見た時、すごく興奮しました。
いままでテキストにできる物しか検索できなかったのに、
映像で検索できるって、かなり効率よく調べられるんじゃないか
知識を得る機会が爆発的に増えるんじゃないかって思いました。
外で知らない花の名前を教えてくれたり、
知らない道具や機械を見た時にそれが何に使うものか、どうやって使うのか教えてくれたら、
すごく世界が広がるだろうなと思います。

これからの画像認識は、バージョンアップごとに
「犬種に対応しました」とか「文房具に対応しました」
といった具合になっていくんじゃないかなぁ。
楽しみです。
ST3 日本語環境向けプラグイン SublimeCodic の紹介

# SublimeCodic とは？
プログラミングで使用する日本語を技術者向けに英語へ翻訳してくれるサイトの翻訳APIをSublime Text 3で使用できるようにしたプラグインです。
[github:SublimeCodic](https://github.com/naoyukik/SublimeCodic)

この素晴らしいAPIを提供していただいているCodicのサービスは、公式サイトからも使用できます。
[codic 公式サイト](https://codic.jp/)

このプラグインを作成はしたものの、すでにほぼ同一のCodicへのプラグインがPackage Controlへ公開されており、また公式でも公開しているので私が作成したプラグインの存在意義はかなり薄いです…。
私はもちろん使っていますが…。

それでも使ってみたいという奇特な方は、githubに登録方法などが記載してあります。
ぜひご活用ください。

# 今後の予定
現状は特に無さそう。
要望には対応できそうなら対応します。
MacでLeapMotionをUnityで使う方法


# LeapMotionとは
手のジェスチャーによってコンピュータを操作ができるデバイス。
PCLeapMotionとをUSBで接続し使用する。
[→ LeapMotionサイト](https://www.leapmotion.com/?lang=jp)

# Macでの使い方
https://www.leapmotion.com/setup にアクセス。

![Leap Motion | Setup Your Leap Motion Controller 2016-05-23 22-59-42.png](https://qiita-image-store.s3.amazonaws.com/0/34936/de8ee91e-b099-da38-f095-37ea8f3f61ba.png)

Mac用ダウンロードを選択するとインストーラーがダウンロードされます。
ナビゲーションにしたがってインストールすればOKです。

しばらくすると、USBケーブルを接続する案内が表示されるので、接続して「Continue」をクリックします。

# Unityとの連携

https://github.com/leapmotion/LeapMotionCoreAssets/releases にアクセスします。

最新のものをいれると
DllNotFoundException: LeapC.dll
が出て進みませんでした。

https://github.com/leapmotion/LeapMotionCoreAssets/releases/tag/v2.3.0
より
LeapMotionCoreAssets_2_3_0.unitypackage
をダウンロードします。

Unityを起動し、パッケージをインポートしするとサンプルを試すことができます。
引数の取り方備忘録

ブログからの転載

* [引数の受け取り方](http://1bed.allright.life/?p=2109)

引数を受け取るための宣言方法と使いそうなパラメーターの備忘録

## パラメーターの属性

### 基本的な書き方

引数は Param 属性を使用して宣言します。

```ps1
Param(
  [Parameter()]
  $ParameterName
)
```


複数のパラメーター属性を設定するときはカンマで区切ります。

```ps1
Param(
  [Parameter(Argument1=value1,
             Argument2=value2)]
  $ParameterName
)
```

### 引数を必須にする

パラメーター属性に、Mandatory を宣言します

```ps1
Param(
  [Parameter(Mandatory=$true)]
  $ParameterName
)
```


### パイプラインから引数を受け取る

```ps1
Param(
  [Parameter(ValueFromPipeline=$true)]
  $ParameterName
)
```


## 引数の型を宣言する

### String 型で宣言

```ps1
Param(
  [Parameter()]
  [String]
  $ParameterName
)
```

### Int 型で宣言

```ps1
Param(
  [Parameter()]
  [Int]
  $ParameterName
)
```


### String 型の配列で宣言

```ps1
Param(
  [Parameter()]
  [String[]]
  $ParameterName
)
```

### Datetime 型で宣言

```ps1
Param(
  [Parameter()]
  [Datetime]
  $ParameterName
)
```

### Switch 型で宣言

```ps1
Param(
  [Parameter()]
  [Switch]
  $ParameterName
)
```

## 引数に初期値を設定する

### リテラルで設定する

```ps1
Param(
  [Parameter()]
  [String]
  $ParameterName = 'DefaultParameter'
)
```


### コマンドレットで初期値を設定する例

セパレーターなし今日の年月日をデフォルトの引数にする例。

```ps1
Param(
  [Parameter()]
  [String]
  $ParameterName = (Get-Date -Format 'yyyyMMdd')
)
```

## 検証属性

### 受け取るパラメーターの数を制限する

1～5 個のパラメーターを受け取る例。

```ps1
Param(
  [Parameter()]
  [ValidateCount(1,5)]
  [String[]]
  $ParameterName
)
```


### 受け取るパラメーターの文字数を制限する

1～5 文字の制限をかける例。

```ps1
Param(
  [Parameter()]
  [ValidateLength(1,5)]
  [String]
  $ParameterName
)
```


### 受け取るパラメーターの数値範囲を制限する

1～5 で制限をかける例。

```ps1
Param(
  [Parameter()]
  [ValidateRange(1,5)]
  [Int]
  $ParameterName
)
```


### 決められたパラメーター以外は弾く

Low, Middle, High 以外は弾く例。

```ps1
Param(
  [Parameter()]
  [ValidateSet("Low", "Middle", "High")]
  [Int]
  $ParameterName
)
```

### Null を通さない

```ps1
Param(
  [Parameter()]
  [ValidateNotNull()]
  $ParameterName
)
```

### Null や値が空のは通さない

```ps1
Param(
  [Parameter()]
  [ValidateNotNullOrEmpty()]
  $ParameterName
)
```

### 受け取るパラメーターを正規表現で制限する

3 文字の数値 + 半角ハイフン + 4 文字の数値のみ通す例。

```ps1
Param(
  [Parameter()]
  [ValidatePattern("^\d{3}\-\d{4}$")]
  [String]
  $ParameterName
)
```


### バリデーションスクリプトをかける

ファイルの存在チェックをかける例。

```ps1
Param(
  [Parameter()]
  [ValidateScript({Test-Path -LiteralPath $_ -PathType Leaf})]
  $ParameterName
)
```


## 参考

* [TechNet: about_Functions_Advanced_Parameters](https://technet.microsoft.com/en-us/library/hh847743.aspx)
Azure Mobile AppsでAPIを作成するときのバージョン番号チェックについて

Azure Mobile Appsを利用してAPIを作成しようと色々と調べていると、気になる事象に出くわしたのでメモしておく。

Visual StudioからAzure Mobile Appのテンプレートでアプリケーションを作成すると、デフォルトでTodoItemやValuesのControllerが作成され、Azureへ公開後にブラウザなどからアクセスを試みることができる。

とりあえず作成したAPIにアクセスすると・・・。
Error:400が発生する、なぜだ :cold_sweat: 。

詳しく調べるためにGoogle ChromeのAdvanced REST clientを利用してアクセスしてみた。
「No API version was specified in the request, this request needs to specify a ZUMO-API-VERSION of '2.0.0'. For more information and supported clients see: http://go.microsoft.com/fwlink/?LinkId=690568#2.0.0 」というエラーメッセージが返ってくる。

ふむふむ、何かバージョン番号を指定する必要があるようだ。

もう少しGoogle先生で調べてみると・・・。

ありました :sweat_smile: 。
「https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-client-and-server-versioning/」

リクエストヘッダーに、ZUMO-API-VERSIONを指定しろと書いてありますね。
言われたとおりにリクエストヘッダーにバージョン番号を指定してアクセスすると、正常に答えが返って来ました :smiley: 。

Azure Mobile Apps側の設定でバージョンチェックを除外するという方法もあるみたい。
とりあえず、一つの問題が解決した。

2016/05/24 追記
Windows 10 MobileにUWPアプリを作成し、タイル更新のためのAPIを呼び出したところうまく更新できず :scream: 。
上記のサイトを見るとMobile Apps側でバージョンチェックを止めるオプションについて書かれているので設定してみたところ、うまくタイル情報を更新することができました。

他にもタイル更新のやり方があるのかもしれませんが、私のコーディングではバージョンチェックを止めないとうまく動作しなかった。

とりあえす、また一つ問題が解決した :smiley: 。
Ruby C拡張と volatile

Rubyの拡張をC言語で書いていたところ、`volatile`というキーワードが気になり出しました。

# `volatile`って？

`volatile`は、ふつうにCやC++でプログラミングしていてもそうそうお世話になることはありません。これらは、基本的に**プログラムの外部**とのインタラクションにかかわるものです。効果を端的に言えば、「`volatile`を付けた先への読み書きは、プログラムに書いたとおりに行われるようになる」ということです。つまり、「何度も連続して書き込んでいるから最後の1回だけにする」とか、「何もコードで変更せずに読み込んでいるから読み込みを削る」というような最適化を阻止するようになります。これは、

* メモリマップトIO（CPUからはメモリに見えるけど、実際は入出力につながっている）を駆動したい場合（これらの場合、読み書きの順序や回数が重要になってきます）
* シグナルハンドラのように、外部の働きで変更されうるもの

を扱う上で便利な仕組みです（[もっと詳しい記事](http://qiita.com/YukiMiyatake/items/1191ab03b6c0b5a22876)もあります）。

とはいえ、Rubyがハードウェアへ直接アクセスするものではありません。となれば「外部の働き」ということになりますが、それは何でしょうか。

# Rubyのガベージコレクタについて
Rubyではガベージコレクタがありますが、それはベースであるC言語レベルで実装されています。そして、このガベージコレクタは、Rubyオブジェクトについて、そのハンドルである[^1]`VALUE`を、特殊な領域にかぎらず、単にレジスタやスタックにおいておくだけでもガベージコレクトされないようになります。

とはいえ、変数として領域が取られなければ、それも役には立ちません。ということで、変数としての領域を確保することを強制させるために`volatile VALUE`がちょくちょく登場します。

# まだ足りない場面
とはいえ、これでもカバーしきれない部分は存在します。ふつうは`VALUE`を引き回すので問題はないのですが、文字列などで中身のポインタを取り出してそちらばかりを使ってしまうと、最後に`VALUE`を参照した後には、（C言語的には）`VALUE`変数が不要となってしまって、別なもので上書きされてガベージコレクタの餌食になってしまうことが起きたりもします（[例](http://masamitsu-murase.blogspot.jp/2012/04/ruby-garbage-collection-exerb-ruby.html)）。このような場合は、`VALUE`を必要とする部分の後に`RB_GC_GUARD(VALUE変数)`を書いて、そこまで`VALUE`を生存させるようにします[^2]。

# まとめ
C拡張の世界でも、Rubyの思想としての「書きやすさ」は健在ですが、C言語の闇とのせめぎあいもやはり否定はできない側面だと思いました。


[^1]: `Fixnum`や`nil`、`false`、`true`など、ハンドルではなく直接値として扱うようなものも一部には存在します。
[^2]: `RB_GC_GUARD`の中身は、「コンパイラ特有の記法で最適化を抑止した関数に`VALUE`を渡す」「`volatile`な外部変数に`VALUE`を書き出す」などをしていました。
Markdown記法についてまとめてみた

Githubなど様々なウェブサービスで目にするMarkdown記法についてまとめてみました。

#1.見出し
まずは見出しについて。h1~h6まであり文字のサイズが変わるのと同時に右側の目次にも見出しのMarkdownによる階層構造が反映される。

###**【入力】**
```lang:Markdown
#h1
##h2
###h3
####h4
#####h5
######h6
```
###**【結果】**
#h1
##h2
###h3
####h4
#####h5
######h6

#2.太字
文字を太くするMarkdown。
###**【入力】**
```lang:Markdown
**太文字**
```
###**【結果】**
**太文字**


#3.イタリック
###**【入力】**
```lang:Markdown
*イタリック*
```
###**【結果】**
*イタリック*


#4.太字＋イタリック
###**【入力】**
```lang:Markdown
***hoge***
```
###**【結果】**
***hoge***


#5.リスト
ハイフンの後に一文字スペースがいる。

###**【入力】**
```lang:Markdown
- リスト
```
###**【結果】**
- item





#番号付きリスト
###**【入力】**
```lang:Markdown
1. item
```
###**【結果】**
1. item


#チェックボックス
###**【入力】**
```lang:Markdown
- [ ] item
- [x] checked item
```
###**【結果】**
- [ ] item
- [x] checked item

#引用
###**【入力】**
```lang:Markdown
> text
```
###**【結果】**

> text

#リンク
###**【入力】**
```lang:Markdown
[グーグル](http://google.com)
```
###**【結果】**
[グーグル](http://google.com)

#画像埋め込み
###**【入力】**
```lang:Markdown
![alt](http://www.mocchiblog.com/wp-content/images/2014/03/github-logo.jpg)
```
###**【結果】**

![alt](http://www.mocchiblog.com/wp-content/images/2014/03/github-logo.jpg)


#コードのインライン表示
###**【入力】**
```lang:Markdown
`code`
```
###**【結果】**
`code`




#水平線
###**【入力】**
```lang:Markdown
***
```
###**【結果】**
***
16.05.24 アセンブリ言語の概要


# アセンブリ言語で足し算ができるようになるまで
GASで行うことを前提として記述していく。

- アセンブリ言語で必要な用語
- アセンブリ言語で行われることの流れ
- 実際にコードを書いて計算をしてみる


## アセンブリ言語で必要な用語

### CPU
パソコンの処理を行うためのもの。

### メモリ(主記憶装置)
CPUで処理を行うための命令を一時保管しておくところ。

### bit
2進数(0か1の数字)で定義されていることが前提で、2bitだったら箱が2つ並んでいる・8bitだったら箱が8つ並んでいる...といったイメージ。

### アセンブリ言語
機械語を人間に読みやすくしたプログラミング言語。(機械語と１対１で対応している。)

### 機械語
パソコンが処理を実行するときに読み込むことができる言葉。数字の列で表現されている。

### アセンブリ言語の命令
`ニーモック 転送元(ソース・オペランド), 転送先(デスティネーション・オペランド)`
といった文型で記述される。

### ニーモック
アセンブリ言語では、どのような命令をするかをこのニーモックで決める。
**例：movlというニーモック**
`movl(ニーモック) → mov(オペコード) + l(サフィックス)`
#### オペコード
ニーモックで行う命令を決めるためのもの。引数がついていてこれをオペランドという。
#### サフィックス
オペランドとして扱うデータサイズを指定する指示語。

| サフィックス |                         詳細                         |
|--------------|------------------------------------------------------|
| b            | バイト(8bit)                                         |
| s            | ショート(16bit整数)またはシングル(32bit浮動小数点数) |
| w            | ワード(16bit)                                        |
| l            | ロング(32bit整数または64bit浮動小数点数)             |
| q            | クワッド(64bit)                                      |

### レジスタ
CPU内にもメモリがあって、そこに記憶されている変数のようなもの。計算するときには、このレジスタに数字を代入して計算を行う。また、レジスタには「%」をつけて使用する。

### スタック
![スタック][stackimg]
見てわかるように後から入れたものの方が先に出すことができる。この方法をデータを格納するために利用したのがスタック。スタックは基本的に何かのデータを一時的に保管するためにある。一時的にデータをスタックに積んでおいて、レジスタを別の目的に使用した後に、スタックからデータを復元する、といったように使用される。
そのため何かの処理を行うためには、一回スタックにデータを保存しておく必要がある。

### セグメント
今回の内容では特には使わない。
レジスタは16bitでのデータの送信を行う。16進数で考えたとしても4桁分までしか一回で記憶できない。そこで複数回に分けて送信することで4桁分までしか記憶できなかったものがより大きな桁数まで記憶できるようになる。その際に送信した後は値の足し算をして元の値と同じ状態に戻してあげる。
> **もし6桁のデータを送信したかったら(例えば：19f0d8というデータ)**
1. 6桁のデータを4桁、2桁にデータを分ける。(19f0 と d8)
2. 分けたデータの少ない方のデータに0を追加して桁数を4桁に揃える。(d8 → 00d8)
3. データを送信後、2つのデータを足し算して元の値と同じ状態にしてあげる。
4. 足し算して同じ値にするために桁数の調整を行う。(イメージとしては、19f0 → 19f000 または 00d8 → 0000d8)
5. データの足し算をしてあげて、元の値と同じにする。(19f000 + 00d8 または 19f0 + 0000d8　後者は先頭の桁数を基準として計算する。)

このときの1の処理で分けたデータの１つ目のものをセグメント、２つ目のものをオフセットという。


## アセンブリ言語で行われていることの流れ
まず、足し算を行うのはどういった仕組みになっているのかの概要
これは非常に単純な作業で、理解するのは簡単。
1. レジスタAに2を格納する。`int A = 2`
2. レジスタAに3を足し合わせる。`A + 3`
3. その値をレジスタAに格納する。`A = A + 3`(`A + 3`は2で行った作業のこと)
今回の関数の中身はこの足し算をするための処理。

そして、関数を呼び出された時に今の処理を行っている位置を保持して、またその場所に返ってこなければならない。そのために、アドレスを格納して覚えておく必要がある。

このことを踏まえて一連の流れを復習すると
1. レジスタに格納されている返りのアドレスをスタックに保存しておく。
2. そのスタックの位置を記憶しておく。
3. 戻り値のあるレジスタに 2 を格納する。
4. 2 を格納したレジスタに +3 をする。
5. 返りのアドレスが格納されているレジスタを取ってくる。
6. 返るための処理をする。

## 実際にコードを書いて計算してみる
今回は 2+3 をしてその解を返す関数を作る。

```calculation.s
function:
 push %ebp   # 呼び出された時点で返るアドレスが格納されているのでそれを忘れないためにスタックに保存しておく
 movl %esp, %ebp   # espレジスタでスタックの一番上の場所を覚えておく

 movl $2, %eax   # eax = 2
 addl $3, %eax   # eax += 3 (eax = 5 になっている)

 # movl %ebp, %esp
 # popl %ebp
 leave   # 関数の復帰処理をまとめたもの(上の二つの処理)
 ret   # 元いたアドレスの場所に戻るための処理
```
ebp, esp, eaxは全てレジスタ。
ebp：返るアドレスが指定されている
esp：ebpがスタックされたときの位置を記憶しておくもの
eax：戻り値を持つレジスタ




# 参照ページ
http://capm-network.com/?tag=GAS
http://ings.sakura.ne.jp/prog/asm1.html

<!--url--->
[stackimg]: https://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Lifo_stack.png/350px-Lifo_stack.png