OmniAICreator/Qiita-1.07M huggingface dataset:
Asteriskで050plusを使う(registerまで)


[1. Asterisk11をソースからインストール - Qiita](http://qiita.com/tukiyo3/items/66943dc9fedeab5defe3)の続き。

# 鍵生成

* asteriskのsourceから`contrib/scripts/ast_tls_cert`を持ってくる。

```bash:key生成準備
sudo mkdir /srv/asterisk11/etc/asterisk/keys/
sudo cp contrib/scripts/ast_tls_cert /srv/asterisk11/etc/asterisk/keys/
cd /srv/asterisk11/etc/asterisk/keys/
```

```bash:key生成
# ca.???とasterisk.???を生成する
sudo ./ast_tls_cert \
 -C pbx.mycompany.co.jp \
 -O "My Private PBX" \
 -d .
# 050plus.???を生成する
sudo ./ast_tls_cert \
 -m client \
 -c ca.crt \
 -k ca.key \
 -C phone1.mycompany.co.jp \
 -O "My Private PBX" \
 -d . \
 -o 050plus
```



# 050plusの接続情報を取得

[generate_sip_conf.sh](https://github.com/tukiyo/asterisk)を使う。

```bash:
git clone https://github.com/tukiyo/asterisk
cd asterisk/11
./generate_sip_conf.sh
```

1. 050plusの電話番号を入力
1. 050plusのパスワードを入力(非表示)
1. asteriskで待ち受けるポート番号を入力
1. 電話番号.xml が生成される。
1. sip.conf が生成される。

```diff:sip.confの以下PATHを書き換え(ソースからインストールした場合)
-/etc/asterisk/sip.conf
+/srv/asterisk11/etc/asterisk/sip.conf
```

```bash:sip.confを上書き
sudo sh -c "cat sip.conf > /srv/asterisk11/etc/asterisk/sip.conf"
```

```bash:
sudo /etc/init.d/asterisk restart
```

# 接続確認

```bash:astriskコンソールで確認
sip show registry
Host                                    dnsmgr Username       Refresh State                Reg.Time
kar-f2fcp.050plus.com:5075              N      fmc99999999       3585 Registered           Sun, 15 Jun 2014 17:40:56
1 SIP registrations.
```
投稿からカテゴリー名を取得する方法


wordpressの投稿データからカテゴリー名を取得する方法です

```php
	<?php $cat = get_the_category(); echo $cat[0]->name; ?>

```

get_the_category関数は投稿に紐づくカテゴリを配列で取得するため、名前を取得する場合は添字を指定してやる必要があります。
配列にはカテゴリーの情報がオブジェクトとして格納されていて、カテゴリ名は「name」で取得する事ができます。
その他メンバ変数については下記に詳しく詳解されています。

http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_the_category
iOS8のウィジェット作成で出たエラーの解決法リンク集

* ウィジェット作成時に出た問題の解決法をまとめました。
* Developer Forumsの内容を表示するにはAppleのDeveloperアカウントが必要です。
* XCode6 beta4での変更点を追記しました (2014/07/29)

# ウィジェット関連のエラー
## ウィジェットが表示されない

### 解決法

* Developer Forums: Today Widget - Cannot get Hello World
https://devforums.apple.com/message/973985#973985

## ウィジェットのサイズ変更ができない、デリゲートが受け取れない

### 解決法

* Developer Forums: Swift Today Extensions (Widgets) Not Working
https://devforums.apple.com/message/973066#973066

## ~~ブレイクポイントで止まらない?~~ 【→解決!】
### ~~状況の詳細~~

* ~~Developer Forums: How to debug Widgets?
https://devforums.apple.com/message/973797#973797~~

* **XCode6 beta4からウィジェットでもブレイクポイントが止まるようになりました**

## ~~GPSは取得できない？~~【→解決!】

### ~~状況の詳細~~

* ~~Developer Forums: App Extension using CoreLocation
https://devforums.apple.com/message/980967#980967~~

* **ウィジェットでもGPS取得できました。以下Gitにあった簡単なサンプルです。**
* HeEAaD/LocationWidget
https://github.com/HeEAaD/LocationWidget
(動かすにはSwiftの記述がbeta3で変更された部分を若干修正する必要あり)


# ウィジェットに関係ないエラー
## 「swift」って名前のプロジェクト作成したらやたらエラーが出る

### 解決法

* Xcode - SourceKitService Terminated Editor functionality temporarily limited. - Qiita
http://qiita.com/Sam/items/f2410f3c247d17e79b5f


リンク先サイトの皆様、どうもありがとうございました！
文章を書いてて全角「"!"」全角「"?"」や全角「" "」を入力しろとキレられた時に使うプログラム

```pl
#!/usr/bin/perl 
use strict;
my $BASE = 'このディレクトリに元のテキストファイルを入れとく';
my $BASE_CONV = 'ここに変換後のテキストファイルが入る';
my $ZEN_SP   = '　'; 
my $ZEN_EX   = '！'; 
my $ZEN_QUES = '？'; 

opendir my $dir, $BASE;
while (my $fn = readdir($dir)) {
  $fn =~ /^\.+$/ and next;
  print "$fn\n";
  open my $src, "$BASE/$fn";
  open my $dest, "> $BASE_CONV/$fn";
  while (my $ln = <$src>) {
    $ln =~ s/^  /$ZEN_SP/g;
    $ln =~ s/\!/$ZEN_EX/g;
    $ln =~ s/\?/$ZEN_QUES/g;
    print $dest $ln;
  }
  close $src;
  close $dest;
}
```
Facebook Graph API v2.0のApp Scoped User Idについて調査したことメモ

## 前提
Facebook Graph API v2.0から、Facebookアプリで取得できるIDが本物のIDではなくなり、App Scoped User Idと呼ばれるものになった。これはアプリごとに固有のIDとして発行される。

## v1.0のAPIを使っていてv2.0に移行した場合はどうなるのか

以前から存在しているアプリでv1.0を使っていて、そこで取得したFacebook ID(本当のID)を保持していたり、それをユーザの識別に使っていた場合、v2.0になった瞬間に紐付けできなくて死亡...するようなことはなく、v1.0でアプリのアクセス許可を出したユーザーは本物のIDがそのままApp Scoped User Idとして使われる模様。だからv2.0に移行しても紐付けできなくて死ぬことはない。というよりもv2.0以前から存在するアプリはv2.0でも常に本物のIDがとれてしまうのか？(要調査)

現在新しくアプリを作成するとそもそもv1.0でアクセス出来ないようだ。バージョンをつけないURLの場合は新しいアプリはv2.0が内部的に使われる。Graph Explorerでも新しいアプリはv1.0が選択できない。

## /me で取得できる link 情報

`https://www.facebook.com/app_scoped_user_id/10152229474113668/` のようなURLになっている。

## プロフィール画像をどうやって取得するか

v1.0では`username`という項目が取得できたが、v2.0では取得できない。通常プロフィール画像のURLは`https://graph.facebook.com/{username|user_id}/picture`みたいにしてるケースがサンプルで散見されるしそのようにやっていたが、usernameもIDも取得できないので、どうやるんだろうと思ったが、v1.0で画像を取得していたのと同じようにApp Scoped User Idを入れればいいだけのようだ。このことから、App Scoped User Idは異なるアプリで重複することはないものであることがわかる。

`https://graph.facebook.com/10152229474113668/picture`
Node.jsベースの OSS BaaS LoopBack を動かしてみた



LoopBack とは
-----------

Node.js ベースの [BaaS(Backend as a Services)](http://www.atmarkit.co.jp/ait/articles/1209/28/news146.html) を作ることが出来るオープンソースです。

* http://loopback.io/
* http://strongloop.com/mobile-application-development/loopback/
* http://www.infoq.com/jp/news/2013/09/loopback

BaaSで一般的な認証、ユーザ管理、プッシュ通知、ファイル管理なども最初から用意されていますが、もっとも特徴的なのは、Data Model から JSONベースの REST APIを自動生成してくれるところでしょう。Android, iOS, HTML5 (Angular.js) の[Client SDK](http://docs.strongloop.com/display/DOC/Client+SDKs)も用意されているので、アプリを作る際もラクが出来そうです。

同じ Node.jsベースのオープンソースBaaSである [deployd](http://deployd.com/) と違って、データの保存先を mongo, mysql, oracle, PostgreSQL, REST API 等、いろいろ設定出来ます。Build-in の [Memory-connector](http://docs.strongloop.com/display/DOC/Memory+connector) もあり、下記で紹介するサンプルアプリでは、Memory-connector を使ってくれるので、DBのインストールも必要ありません。


インストール
--------

npm などが使える状況にしたうえで、下記を実施します。
node.js v10.28 で試しています。

```bash:
$ npm install -g strong-cli
```

LoopBack Sample App
-----

[Getting started](http://docs.strongloop.com/display/DOC/Getting+started) にある "Create and run the LoopBack sample app…" を参考に example を動かしてみました。

* sls-sample-app
 https://github.com/strongloop/sls-sample-app

上記サンプルアプリのインストールは、strong-cli にコマンドとして含まれているようで、下記だけでインストールが出来るようになっています。

```bash:
$ slc example
```

すると、sls-sample-app というディレクトリが出来るので、そこに移動した上で、

```bash:
$ slc run
```

以上で http://0.0.0.0:3000/ にアクセスすると、下記みたいな格好いい画面が見えるようになりました。

Sample Requests のところは、GETボタンを押すと、その場で GETのリクエストが飛び、レスポンスが画面に表示されるようになっています。なかなかよく出来たサンプルアプリですね！

![スクリーンショット 2014-06-15 14.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/32059/00bef3d8-0bca-e0e4-0eec-debcdbe835c8.png "スクリーンショット 2014-06-15 14.58.53.png")

![スクリーンショット 2014-06-15 15.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/32059/f6165f4e-3660-fb3b-903a-eb5b69b75e4e.png "スクリーンショット 2014-06-15 15.04.26.png")


また、LoopBack には、[loopback-explorer](https://github.com/strongloop/loopback-explorer) というものがあり、LoopBack で生成したモデルから、カンタンに[swagger](https://helloreverb.com/developers/swagger) ベースの API ドキュメントを生成する事ができるようです。すばらしい！  サンプルアプリでも http://0.0.0.0:3000/explorer/ にアクセスすると、下記のような画面を見る事が出来ます。

![スクリーンショット 2014-06-15 15.09.24.png](https://qiita-image-store.s3.amazonaws.com/0/32059/84ea438c-cb8b-ab1e-7968-07ba613f1374.png "スクリーンショット 2014-06-15 15.09.24.png")

この APIドキュメントを実現するためのコードは、下記だけ!!

```javascript:app.js
// API explorer (if present)
var explorerPath = '/explorer';
try {
  var explorer = require('loopback-explorer');
  app.use(explorerPath, explorer(app, { basePath: apiPath }));
} catch(e){
  // ignore errors, explorer stays disabled
}
```


いろいろある Module
-----------------

https://github.com/strongloop/loopback#loopback-modules にあるように、様々なモジュールを利用して拡張が出来るようになっています。

上記URLに載っているモジュール以外にも、下記のようなモジュールがあるようです。

* 各種認証連携 
  * https://github.com/strongloop/loopback-passport
* AMQP連携
  * https://github.com/strongloop/strong-mq
  * http://apidocs.strongloop.com./strong-mq/


まとめ
-----

今回は、いろいろ調べつつ、とりあえずサンプルを動かしてみた　というレベルですが、もう少し触ってみたいと思わせる出来の良さでした。日本でもこれから注目されるかもしれませんね :-)
BeautifulSoupメモ

ドキュメント
http://www.crummy.com/software/BeautifulSoup/bs4/doc/

```python:BeautifulSoup
from bs4 import BeautifulSoup

soup = BeautifulSoup(raw) #rawはwebページ読み込みデータ

#findAll:該当するタグのオブジェクトをリストで取得
#下記だとクラスがimage-itemsのulを全取得
ul_items = soup.findAll('ul',class_='image-items')

#find:該当するタグのオブジェクトを1件取得
a = item.find('a')
#id指定だとこんな感じ
sample = soup.find(id='template-embed-sample')

#属性値の取得
#aタグのリンク先の取得
link = a.attrs['href']
```


findメソッドで得たBeautifulSoupオブジェクト？は内包している子の情報をもつので
下記のような取得もできる

```html
<div><span>hogehoge</span><div>
```
hogehogeを取得するのに

```python
div = soup.find('div')
span = div.find('span')#div内のspanを探す
print(span.text)
```
Sublime Text2上でSwiftをコンパイル＆実行


##Build System作成
- Tools>Build System>New Build System...を選択
- .sublime-buildファイルが開くので以下のコードを記述
- Swift.sublime-buildの名前で保存。保存先はPackages>User配下になってます。



```
{
// "cmd": ["swiftc $file_name && swift $file_name"],
    "cmd": ["swift $file_name"],
	"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
	"path": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/",
	"selector": "source.swift",
	"shell": true
}
```

- Tools>Buildか、⌘ + Bでビルド、そして実行が行われます。
![スクリーンショット 2014-06-15 16.27.04.png](https://qiita-image-store.s3.amazonaws.com/0/17535/6a16528a-9f73-4f05-9b10-10c0048cf35f.png "スクリーンショット 2014-06-15 16.27.04.png")

fizzbuzzのコード例は@dankogaiさんのブログより拝借
http://blog.livedoor.jp/dankogai/archives/51922323.html

###ちょっと説明
- 最初は``"cmd": ["swift", "-i", "$file_name"],``と記述してしまってました。
- 初回実行時、Developer Tools Accessのダイアログが立ち上がるのでパスワード記入。
- けど１番初めはなんか怒られました（キャプチャ撮るの忘れたw）REPL, failed, status -1, lost connetionとかの単語が並んでたような気が。
- しかし、そのまま２度目の実行で

```
Welcome to Swift!  Type :help for assistance.

[Finished in 2.5s]
```
とでました。でもそれじゃどうにもならんので、上記のように書き直し、再度実行しました。

参考にしたのはこちら  
Sublime Text 2 で TypeScript をビルドする
http://y-anz-m.blogspot.jp/2012/11/sublime-text-2-typescript.html

file_regexはエラー出力をキャプチャするための正規表現とのことですが、よくわからんのでとりあえず自分が以前作ったJava用のbuildファイルからとってきました。

【Windows】 SublimeText2でJavaをコンパイル＆実行させる
http://hyperneetprogrammer.hatenablog.com/entry/2013/12/12/204452

~~あと、パスは見ての通りXcode6-Betaのパスを設定しているので、今後正式版発表の際には変えないといけないかもです。~~  
(9/19)修正済みです。


よくわからんまま、チャチャっと書いてしまっているので、問題があるかもしれんです。

（追記）実行ファイルはスクリプトファイルと同じ場所に作成されるようですが、
``"cmd": ["swift $file_name"],``とすれば、インタプリタモードと同じようにスクリプト実行だけ、という感じになるようです。
壊れたロボット

　深さ優先探索を実践で実装出来ないなぁ・・・練習数が足りないのが原因だと言う事は分かっているので、ひたすら頑張るしか無いですね・・・
SRM425 Div2 Level2
我ながらおばかなコード書いてるなぁ・・・（笑）

```java:

public class Main {
	double[] dir;
	double[] allProbability;
	
	boolean ok(int before, int next) {
		if(before == 0 && next == 1 || before == 1 && next == 0)      return(false);
		else if(before == 2 && next == 3 || before == 3 && next == 2) return(false);
		return(true);
	}
	
	double dfs(int depth, double sum, int before) {
		double ret = 0;
		if(depth < 0) return(1);
		
		for(int r = 0; r < dir.length; r++) {
			if(!ok(before, r)) continue;
			sum *= dfs(depth - 1, sum * dir[r], r); 
			ret += sum;
		}
		
		return(ret);
	}
	
	double getProbability(int n, int east, int west, int south, int north) {
		dir = new double[]{(double)east / 100.0, (double)west / 100.0, (double)south / 100.0, (double)north / 100.0};
		if(n == 1) return(1);
		double ans = dfs(n, 1, 0);
		return(ans);
	}
	
	void doIt() {
		int n = 2;
		int east = 25;
		int west = 25;
		int south = 25;
		int north = 25;
		System.out.println(getProbability(n, east, west, south, north));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}
}
```

答え

```java:
　　　　　//座標        
　　　　　boolean[][] grid = new boolean[100][100];
　　　　　//現在座標に、東は+(1, 0)、西は+(-1, 0)、南は+(0, -1)、北は+(0, -1)の処理をすれば、座標移動を実現出来る。
	int vx[] = {1, -1, 0, 0};
	int vy[] = {0, 0, 1, -1};
        //４方向のそれぞれに対して進む確率
	double[] prob = new double[4];
        
	public double getProbability(int n, int east, int west, int south, int north) {
                //確率を格納
		prob[0] = east / 100.0;
		prob[1] = west / 100.0;
		prob[2] = south / 100.0;
		prob[3] = north / 100.0;
		
		return(dfs(50, 50, n));
	}
	
	double dfs(int x, int y, int n) {
　　　　　　　　　 //既に訪れているならば０を返す
		if(grid[x][y]) return(0);
                //探索の深さが０になったら１を返す
		if(n == 0) return(1);
		
　　　　　　　　　 //現在座標をtrueにしておく
		grid[x][y] = true;
		double ret = 0;
		for(int r = 0; r < 4; r++) {
			//east, west, south, northの順にロボットを動かす
			ret += dfs(x + vx[r], y + vy[r], n - 1) * prob[r];
		}
                //現在座標に対して処理を終えたのでfalseを格納
		grid[x][y] = false;
		return(ret);
	}
```
MacOSX Mavericksでgitのタブ補完使う方法


Xcodeで用意されているのに、何故かデフォルトで使えないという非エンジニアの私には解せない状態になっているMavericksのgitのTAB補完。
人に教えてもらいつつ色々調べつつ、自分の中で「これが一番手っ取り早い」と思う方法をメモ。

# まずは設定ファイルの場所確認
まず`git-prompt.sh`と`git-completion.bash`を探す。
Mavericksだと大体以下の場所にあるっぽい。

````Bash
/Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
/Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh
````
#設定ファイルを読み込ませる
Bashの設定ファイルに読み込ませるようにおまじない。

````.bash_profile
$ source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
$ source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh
````

# 設定が反映されているかテスト
新規タブを開いて、コマンドとかブランチ名がTAB補完出来るようになっているか確認してみる。　　
できればOK。出来なかったら、.bash_profileじゃなくて.bashrcとかに書いてみるとかして試してみる。

いろんな記事を見てて、たいてい`.bashrc`に`$ source PATH`的なことを書かれていたけど、うまくいかなかったので、同じbashの初期設定ファイルだったら`.bash_profile`でもいいじゃないかと思ってやってみたら通った。
`.bashrc`も`.bash_profile`も同じ初期設定ファイルらしく、でも微妙に違うとか聞いたけど、正直どう違うのかよくわからないし、そもそも初期設定ファイルがなんで2つあるの？？という状態で、でもまぁ動いたからいいやという感じで解決。
……何が違うというんだ(　д　)
chefの初期設置

* 仮想サーバーをつくる
```mkdir sakura
cd sakura
vagrant init centos64
vim Vagrantfile
vagrant up
```

* knifeコマンドを使いやすくするようにsshの設定をする
```vagrant ssh-config --host harmony
vagrant ssh-config --host harmony >> ~/.ssh/config
```

* chefをinitする（新規作成）
```knife solo init sakura-repo
cd sakura-repo
knife solo prepare harmony 
```
* chefをinitする（chefファイルをgitから取得）
```git clone https://github.com/YusukeHigaki/sakura_chef.git
cd sakura-chef
knife solo prepare harmony 
```
sendmailで任意のメールヘッダーをsyslogに出力する

sendmailで手軽にヘッダーをログに出力するための設定。
X-Mailer や User-Agent を指定すれば、
ユーザがどんなメーラーを使用しているかわかります。

## 1. sendmail.mc に下記コードを追加し、sendmail.cfを作成
```sendmail.mc
LOCAL_CONFIG
 # syslog 出力の定義、スペースを # に置換して出力する
Klog syslog -S\#
 # MAILER-DAEMONを判定する定義、MAILER-DAEMON の場合は OK を返す
Kcheck_md regex -T@TEMP -a@OK ^[M]AILER-DAEMON$
 # Headers クラスを定義
F{Headers}/etc/mail/headerlists
 # 全てのヘッダーに output_header ルールを適用
H*: $>output_header
 #
LOCAL_RULESETS
Soutput_header
 # Envelope From が MAILER-DAEMON か確認
R$*			$: <$(check_md $&f $)> <$1>
 # MAILER-DAEMON であれば、ここで終了
R<@OK><$*>		$@ $1
 # MAILER-DAEMON でなければ、ヘッダー名を挿入
R<$*><$*>		$: <$&{hdr_name}> <$2>
 # Headers クラスと ヘッダー名が一致した場合、syslog に出力
R<$={Headers}><$*>	$: $(log "header=" $1 ", value=" $2 $) $2
 # おまじない
R<$*><$*>		$: $2
 # LHS , RHS は tab 区切りで記述すること
```
##2. 出力するヘッダーを設定(完全マッチ)
``# vi /etc/mail/headerlists
Subject
From
To
``

##3. sendmail の再起動
`` # service sendmail restart
``

##4. テスト
**入力データ**
``Subject: ma3ki.net  1402812640
From: <test@ma3ki.net>
To: <nobody>
``

**syslog**
``Jun 15 15:10:40 localhost sendmail[32460]: s5F6Adb8032460: header=Subject, value=ma3ki.com#1402812640
Jun 15 15:10:40 localhost sendmail[32460]: s5F6Adb8032460: header=From, value=<test@ma3ki.com>
Jun 15 15:10:40 localhost sendmail[32460]: s5F6Adb8032460: header=To, value=<nobody>
``
Go + Emacs + Mac OS X インストールメモ

Go をインストールしたときの作業記録です．当時の環境は，

* Mac OS X 10.8.5
* Go 1.2.2
* Emacs 24.3
  - el-get
* Homebrew

です．この作業では，

* go-mode
* go-autocomplete
* go-eldoc
* flycheck
* godef

をインストール・設定することを目標とします．


## Go のインストール

公式パッケージをインストールします．

```shell-session
~/work $ curl -O https://storage.googleapis.com/golang/go1.2.2.darwin-amd64-osx10.8.pkg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 52.9M  100 52.9M    0     0   261k      0  0:03:27  0:03:27 --:--:--  310k
~/work $ openssl sha1 go1.2.2.darwin-amd64-osx10.8.pkg 
SHA1(go1.2.2.darwin-amd64-osx10.8.pkg)= 5d78f2a3fe82b01fe5dfcb267e703e754274b253
~/work $ say ok
~/work $ open go1.2.2.darwin-amd64-osx10.8.pkg
```

このあと，環境変数 PATH に `/usr/local/go/bin` を設定します（私は `/etc/launchd.conf` で設定しました）．
    

## go-autocomplete のインストール

この作業の前に，どこでもいいので `GOPATH` を設定しておきます（とりあえず，`$HOME/go` としました）．`GOPATH` を設定したら，環境変数 PATH に `$GOPATH/bin` を追加しておきます．

```el
(defvar tnoda/gopath (expand-file-name "go" (getenv "HOME")))
(defvar tnoda/gopath-bin (expand-file-name "bin" tnoda/gopath))
 
(setenv "GOPATH" tnoda/gopath)
(setenv "PATH" (concat (getenv "PATH") ":" tnoda/gopath-bin))
(add-to-list 'exec-path tnoda/gopath-bin)
```

まず，el-get の go-autocomplete レシピは [gocode][gocode] を自動的にインストールしてくれないので，手動でインストールします:

```shell-session
~ $ go get github.com/nsf/gocode
```

次に el-get で

```el
(el-get 'sync 'go-autocomplete)
```

これで同時に go-mode も使えるようになります．


## go-eldoc のインストール

go-eldoc には gocode が必要ですが，go-autocomplete のところでインストール済．あとは，el-get で，

```el
(el-get 'sync 'go-eldoc)
```

## flycheck の設定

flycheck 本体のインストール・設定は，el-get で，

```el
(el-get 'sync 'flycheck)
(add-hook 'go-mode-hook 'flycheck-mode)
```

するだけです．あとは，flycheck が使うコマンドをインストールしておきましょう．

```shell-session
~ $ go get github.com/golang/lint/golint
~ $ go get github.com/kisielk/errcheck
```

## godef のインストール

godef の elisp は go-mode に含まれているので，あとは godef 本体をインストールするだけです．

```shell-session
~ $ go get code.google.com/p/rog-go/exp/cmd/godef
```

私は Clojure の [CIDER][cider] と同じキーバインドに設定しています．



## おわりに

Mac OS X に Go と Emacs 関連ツールをインストールして，とりあえず Go を書ける状態まで持っていきました．基本的には `go get` と `el-get` だけでインストールできるので簡単です．そのほか，ここには書いていないものも含めて Emacs 設定の全ては，[GitHub のリポジトリ][github] に書いてあります．


[gocode]: https://github.com/nsf/gocode
[cider]: https://github.com/clojure-emacs/cider
[github]: https://github.com/tnoda/.emacs.d/blob/master/tnoda.org#golang
JUnit(@datapoint,Theory)+Seleniumでdirpyでyoutubeの音源を自動ダウンロード

・[前回](http://qiita.com/toru2220/items/0630793c3db74e378fff)の続き。Seleniumでのアクセス先をパラメータで指定して連続実行する。

```java
package site;

import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.ProxyServer;

import org.junit.Test;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

@RunWith(Theories.class)
public class dirpy {

    private static WebDriver driver;

    @DataPoints
    public static Fixture[] PARAMS = {

    	new Fixture("http://www.youtube.com/watch?v=xxxxxx"),
        new Fixture("http://www.youtube.com/watch?v=yyyyy"),
        new Fixture("http://www.youtube.com/watch?v=zzzzz"),

    };

    @Theory
    public void searchForSeleniumWebsite(Fixture param) throws Exception {

    	ProxyServer server = new ProxyServer(9978);
        server.start();
        server.setCaptureHeaders(true);
        server.setCaptureContent(true);
        server.newHar("test");

        FirefoxProfile profile = new FirefoxProfile();

        profile.setPreference("browser.download.folderList", 0); // ダウンロードするファイルの保存先フォルダを指定　0:デスクトップ 1：ダウンロードフォルダ 2:ダウンロードに指定された最後のフォルダ
        profile.setPreference("browser.download.useDownloadDir", true); // ダウンロードするファイルの保存先フォルダが指定してあればそれを使う
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "audio/mpeg"); // 指定したmimeタイプは有無を言わさずダウンロードする

        profile.setPreference("network.proxy.type", 1);
        profile.setPreference("network.proxy.http", "localhost");
        profile.setPreference("network.proxy.http_port", 9978);

        // Set up driver
        WebDriver driver = new FirefoxDriver(profile);

        driver.get("http://www.dirpy.com/");

        driver.findElement(By.id("url")).sendKeys(param.url);

        driver.findElement(By.xpath("//input[@type='submit' and @value='dirpy!']")).click();

        driver.findElement(By.xpath("//input[@type='button' and @value='Record Audio']")).click();

        Har har1 = server.getHar();

        //FileOutputStream fos = new FileOutputStream("c:\\test\\log.log");
        //har1.writeTo(fos);

        driver.quit();
        server.stop();

    }

    static class Fixture
    {
    	String url;

    	public Fixture(String url) {
			this.url = url;
		}
    }


}
```

・dirpyのクリック先を「Record Audio」から「Download Video」にすれば動画になる・・・はず
Atom の snippets.cson の書き方の注意点


`.atom/snippets.cson` に複数の snippet を登録しようとしてはまりました。。
以下のように snippet を登録するのは誤りです。

```snippets.cson
# 間違い!! log1 は有効になりません。
'.source.js':
  'log1':
    'prefix': 'l'
    'body': 'console.log($1);'

'.source.js':
  'log2':
    'prefix':'cl'
    'body': 'console.log($1);'
```

上のように書くと、最後の snippet しか有効になりません。
正しくは、下のように `'.sources.js'` にまとめて書きます。

```snippets.cson
'.source.js':
  'log1':
    'prefix': 'l'
    'body': 'console.log($1);'
  'log2':
    'prefix':'cl'
    'body': 'console.log($1);'
```

もう一つ注意点として、上の `log1` と `log2` を同じ文字列にしてしまうと、最後の定義しか有効になりません。
Fedora20設定

#Fedora20設定について

Fedora初心者の私が設定した事項を自分用メモ。
内容については、随時更新していく予定です。
>設定については、mmitouさんのhttps://gist.github.com/mmitou/5989699
>の記事を参考にさせていただきました。

##Caps Lockのキーバインド設定
下記コマンドを利用して設定しました。
> $ sudo yum install gnome-tweak-tool

> $ gnome-tweak-tool

コマンドを入力後、次のような画面が出てくるため、私は好みでctrlキーにマップするように変更

![Screenshot from 2014-06-15 14:17:46.png](https://qiita-image-store.s3.amazonaws.com/0/9376/3aca3f95-29fb-b241-890b-041869566d4c.png)
私の環境だと、上記設定の後、即時に反映されませんでした。
そのため、PCを再起動したのちにキーバインドの設定が反映されていることを確認しました。
1. Asterisk11をソースからインストール


* sip.confについては今回は触れてません。
* Ubuntu14.04 64bit にて実施。

# ビルド

```bash:ビルドに必要なライブラリをインストール
sudo apt-get build-dep -y asterisk
```

```bash:ソースをダウンロード
wget -q http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz
```

```bash:ビルド
tar xzf asterisk-11-current.tar.gz
cd asterisk-11.*
./configure -q --prefix=/srv/asterisk11
make menuselect
make -s
sudo make install
sudo make samples
sudo make config
```

```bash:現状を保存
cd /srv/asterisk11/etc/asterisk/
sudo git init
sudo git add -A
sudo git commit -m "init"
```

```bash:asterisk実行ユーザを作成
sudo adduser --system --disabled-login asterisk
sudo groupadd asterisk
sudo usermod -g asterisk asterisk
sudo chown -R asterisk:asterisk /srv/asterisk11/var/log
```

# 設定

```diff:/etc/default/asterisk
-#AST_USER="asterisk"
-#AST_GROUP="asterisk"
+AST_USER="asterisk"
+AST_GROUP="asterisk"
```

```diff:asterisk.conf
-;[files]
-;astctlpermissions = 0660
-;astctlowner = root
-;astctlgroup = apache
-;astctl = asterisk.ctl
+[files]
+astctlpermissions = 0660
+astctlowner = asterisk
+astctlgroup = asterisk
+astctl = asterisk.ctl
```

## PATH追加

```diff:~/.bashrc
+export PATH=$PATH:/srv/asterisk11/sbin
```

```bash:PATH追加
source ~/.bashrc
```

# 起動

```bash:起動
sudo /etc/init.d/asterisk start
```

#コンソールの使い方

```bash:asteriskコンソール接続
sudo usermod -a -G asterisk `whoami`
# asteriskグループ権限を得るため一回ログアウト/ログインしてから
asterisk -r
```

* 接続できない場合、/srv/asterisk/var/run/asterisk/asterisk.ctlが存在することを確認。


```bash:helpの使い方
help core
help core show
help core show settings
```

* コマンドリストが絞れていることがわかる。

```bash:実行例
core show settings
```

```bash:alias一覧。下位互換性のためか。
vim -R etc/asterisk/cli_aliases.conf
```

# その他設定ファイル

* sip.conf : 外線発信用にregisterを記述する。
* extensions.(ael|conf|lua) : PBX設定
* modules.conf : pbx_lua.so などloadする用。
* res_config_mysql.conf : mysql接続
* lib/asterisk/modules/*so : モジュール一覧
  * `*mysql.so`がないので`*odbc.so`を使えということか。

# 用語

* cdr : Call Detail Record
* ulaw : 電話で使われるコーデック
  * G.711 μ-law, PCMU/PCMA とも言われる。
  * 8kHz、8ビット、モノラル。64kbps
  * G.711の方式でA-lawは欧米、μ-lawは日本,米国で使われている。
  * ひかり電話もこれを使っている。
* G.729 : 050plusアプリで使われている。8kbpsと圧縮率が高い。
* SILK : skypeで使われている。可変長
【Rails 4】delayed_jobを使う

Rails 4（ActiveRecord）でdelayed_jobを使います。

**Gemfile作成**

```rb:Gemfile
gem "delayed_job"
gem "delayed_job_active_record"

# デプロイ先でデーモンとして動かすのに必要
gem "daemons"
```

**インストールとマイグレーション**

```bash
bundle install
bundle exec rails generate delayed_job:active_record
bundle exec rake db:migrate
```


実行ファイルはbin/delayed_jobに作成されます。
Rails3以前はscript/delayed_jobに作られていたので要注意なのです。

ワーカーはrakeタスクで手軽に起動できます。
開発環境ではこれでテストしましょう。

```bash
bundle exec rake jobs:work
```

**非同期処理を実装**
キューに入れたいメソッドは次のようにdelayを挟んで呼び出します。

```rb
SomeClass.delay.some_method(args)
```

例えば、Twitterのような外部サイトへツイートするような以下の処理がある場合、

```rb
@user.tweet('Hi!')
```
を

```rb
@user.delay.tweet('Hi!')
```
とするだけなのです。


デプロイ環境では`delayed_job`コマンドでプロセスを開始したり停止したりします。

以下の様なスクリプトファイルを作っておくと便利です。

```bash:tools/delayed_job.sh
#!/bin/bash
bundle exec ../bin/delayed_job $1
```

アプリケーションディレクトリ配下に`tools/`というディレクトリを作っておき、その中に`delayed_jobs.sh`を入れておきます。

```bash
# 開始
tools/delayed_jobs.sh start

# 停止
tools/delayed_jobs.sh stop

# 再起動
tools/delayed_jobs.sh restart
```
などと出来ます。

※ **Rails 3**では`delayed_job`の位置が`script/`配下になるので適宜、修正して下さい。

**設定ファイル**

```rb:config/initializers/delayed_job_config.rb
Delayed::Worker.destroy_failed_jobs = false # 失敗したジョブをDBから削除しない=false
Delayed::Worker.sleep_delay = 60 # 実行ジョブがない場合に次回実行までのSleep時間（秒）
Delayed::Worker.max_attempts = 3 # リトライ回数
Delayed::Worker.max_run_time = 5.minutes # 最大実行時間
```

**ログファイル**
delayed_jobsワーカーのログは`log/delayed_job.log`に出力されます。




***

**あと、関係ないけどなのですちゃん可愛い**


![xx.png](https://qiita-image-store.s3.amazonaws.com/0/40418/c0128d88-f3d1-eabe-402e-b24ff03f53b9.png)
cocos2d-JSの不思議な_super()

cocos2d-jsではcc.Class.extend()を使ってクラスを継承する。このとき、オーバーライドしたメソッド内から`this._super()`を呼び出すことで、基底クラスのメソッドを呼び出すことができる。

```js
var MySprite = cc.Sprite.extend({
    ctor: function () {
        this._super();
    },
    setPosition: function (pos) {
        this._super(pos);
    }
});
```

普通に考えれば、ctorから呼んでる`_super()`もsetPositionから呼んでいる`_super()`も同じもののように見えるのに、実はそれぞれ違うメソッドが呼ばれているのでちょっと不思議だ。

実はextendに秘密があって、これは単に2つのオブジェクトをマージするだけではなく、必要に応じてラッパーメソッドを生成するようになっている。

ラッパーメソッドは、`this._super`の内容を差し換えてから、extendに渡されたメソッドを呼び出すようになっている。

https://github.com/cocos2d/cocos2d-html5/blob/develop/cocos2d/core/platform/CCClass.js

```js:CCClass.js
                } else if (isFunc && override && hasSuperCall) {
                    desc.value = (function (name, fn) {
                        return function () {
                            var tmp = this._super;

                            // Add a new ._super() method that is the same method
                            // but on the super-Class
                            this._super = _super[name];

                            // The method only need to be bound temporarily, so we
                            // remove it when we're done executing
                            var ret = fn.apply(this, arguments);
                            this._super = tmp;

                            return ret;
                        };
                    })(name, prop[name]);
                    Object.defineProperty(prototype, name, desc);
                } else if (isFunc) {
```
バイナリログの削除

DB:MariaDB 10.0.11

#自動
設定ファイルに何日で削除するか記述する
defaultは0で自動削除はしない。設定値は0-99
https://mariadb.com/kb/en/server-system-variables/#expire_logs_days

```my.cnf
expire_logs_days=2
```

#手動
PURGE MASTER LOGS構文を使う
この構文で削除するとbin-logのインデックスも適切に修正してくれる

```
$ cat mysql-bin.index 
./mysql-bin.000024
./mysql-bin.000025
./mysql-bin.000026
./mysql-bin.000027
./mysql-bin.000028
./mysql-bin.000029
./mysql-bin.000030
./mysql-bin.000031
./mysql-bin.000032
./mysql-bin.000033
./mysql-bin.000034

MariaDB [(none)]> PURGE MASTER LOGS BEFORE '2014-06-15 05:00:00';
Query OK, 0 rows affected (0.04 sec)

$ cat mysql-bin.index 
./mysql-bin.000034
```

rmとかでlogだけ消した場合はbin-logのindexが修正されないので次回起動時にエラーになるので注意
Alfredで特定URLを開くときにhttp://ありなしに対応する

Shell Scriptを使用しているのでPower Packが必要かもしれないです。

### やりたかったこと

Alfredで
`go http://nicovideo.jp`
`go nicovideo.jp`
のどちらの場合でもChromeで http://nicovideo.jp を開く

### トリガー

トリガーはいつも通りです。
![スクリーンショット 2014-06-15 12.39.22.png](https://qiita-image-store.s3.amazonaws.com/0/36244/cc70d071-0f41-9db3-27ea-c616b0ab2ed0.png)


### シェルスクリプト

```bash
QUERY={query}
REMOVED=`echo $QUERY | sed -e s,^http://,,`
FIXED="http://${REMOVED}"
/usr/bin/open -a "/Applications/Google Chrome.app" "${FIXED}"
```

もっと良い書き方がありそう。


### おわりに

毎回Alfredの環境構築をするのは大変なので設定ファイルやworkflowはgithub等においておいた方が良いですね。

https://github.com/letsspeak/alfred_workflows
secret_key_baseあたりのメモ


ちょっと前までは
- config/initializers/secret_token.rb

```config/initializers/secret_token.rb
## デフォルト
アプリ名::Application.config.secret_key_base = 'すごい長い文字列'

## 一方、Tutorialでは動的にしようってやつだった
## Tutorial 4.0 の "リスト 3.2 秘密トークンを動的に生成する。"
def secure_token
…
end

アプリ名::Application.config.secret_key_base = secure_token
```

- Tutorialでは`.secret`がなかったら、新しく用意されて、あったら読み込まれる
- Tutorialでは`.secret`は.gitignoreにある

Rails 4.1からは
- config/secrets.yml

```config/secrets.yml
development:
  secret_key_base: hogehoge… <- 長い文字列

test:
  secret_key_base: fugafuga… <- 長い文字列

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
```

- 環境変数"SECRET_KEY_BASE"に書こうよってなってる
- Railsで使用したいAPIkeyとかもここに書けば良いっぽい
- keyを直接書くなら`config/secrets.yml`を.gitignoreに入れないとあかん

#### 使い方
```config/secrets.yml
…
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  hoge_hoge: hogehoge_production
```

- `Rails.application.secrets.hoge_hoge`で呼ぶ
- Viewでは使えなかった
- Helper, Controllerでは使えた

## これからRails 4で新しく作るとき(.gitignoreに入れたくない...)
- 全部環境変数でやる

```secret_key_baseの生成
$ irb
irb(main):001:0> require 'securerandom'
=> true
irb(main):002:0> SecureRandom.hex(64)
=> "長い文字列"
```

## 追記(他にも方法を教えてもらいました!!ありがとうございます)
```別の方法
$ rake secret
=> "長い文字列"
```

これを環境変数SECRET_KEY_BASEにコピペする


## 移行したい時
[Rails 4.0.4 => Rails 4.1.0アップデート in qiita](http://qiita.com/shu_0115/items/42ddcf6a08f6dca32542)
を参考に

- `development`, `test`のとこには適当な文字列を突っ込む
- `production`のとこは`<%= ENV["SECRET_KEY_BASE"] %>`でやる
- .bashrcや.zshrc等に環境変数として`export SECRET_KEY_BASE="xxxx"`的なことをする
- sourceコマンドで再読み込み
- `rm config/initializers/secret_token.rb`でおしまい？

## 移行したい時(Tutorialみたく.secretでやってる人)
- .secretに"xxxx"が書いてあるので上と同じようにする

## .secretとか使ってやりたい時
メソッドは引き継いで、下記のようにしたらいいなじゃないかと(試していない)

```
#変更前
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
#変更後
production:
  secret_key_base: secure_token
```

## 参考
- [Rails 4.0.4 => Rails 4.1.0アップデート](http://qiita.com/shu_0115/items/42ddcf6a08f6dca32542)
- [Rails4.1のsecrets.ymlはfigaroと違うの？](http://xoyip.hatenablog.com/entry/2014/04/09/214405)
- [Ruby on Rails チュートリアル実例を使ってRailsを学ぼう Michael Hartl (マイケル・ハートル)](http://railstutorial.jp)
右も左もわからないがJavaScriptを始めてみる

[codeprep](http://codeprep.jp/)と[ドットインストール](http://dotinstall.com/)を師と仰ぎJavaScriptを勉強開始する。勉強とは言ったもののプログラムの楽しさと可能性にひかれたのが動機。[Qiita](http://qiita.com/)は同じような境遇の方が多いと聞いたので備忘録も兼ねて記録していくことにする。HTML,CSSの書き方の基本はある程度理解しているがプログラムらしいプログラムは未経験なのでとても楽しみだ。
vimで開いているファイルのディレクトリに移動する

## 自動的に移動する

[autochdir](http://vim-jp.org/vimdoc-ja/options.html#%27autochdir%27)より、コンパイル時に有効にされた場合のみ使用できます。
`:echo exists("+autochdir")`の結果が`0`なら残念ながら使う事ができません。

```vim
:set autochdir
```

## コマンドで指定して移動する

[Exコマンド用の特別な文字](http://vim-jp.org/vimdoc-ja/cmdline.html#cmdline-special)より、`%`はカレントファイル名、`:h`はファイル名のヘッド (末尾の部分と全ての区切りが除かれたもの)なので、`%:h`は開いているファイルのディレクトリに展開されます。

```vim
" グローバルなカレントディレクトリを変更する
:cd %:h
```

`:cd`はグローバルなカレントディレクトリを変更するので他のウインドウやバッファも変更されます。

```vim
" ローカルなカレントディレクトリを変更する
:lcd %:h
```

カレントウインドウのカレントディレクトリだけを変更したい場合は`:lcd`を使います。

## 現在のディレクトリを確認する

```vim
:pwd
```
AWSのインスタンス高過ぎワロタ。探せば安くて美味いところはあります。

# AWS

Micro ($14.40/mo)
-

Name / UNIX Bench / I/O / Bandwidth
![スクリーンショット 2014-06-15 11.00.07.png](https://qiita-image-store.s3.amazonaws.com/0/19168/e2bed2d0-e378-0746-0ff5-1449d3359a09.png)

Small ($46.80/mo)
-

Name / UNIX Bench / I/O / Bandwidth
![スクリーンショット 2014-06-15 11.02.32.png](https://qiita-image-store.s3.amazonaws.com/0/19168/24f33fa5-3d34-5e4c-1f9c-b1c3ad936233.png)

# DigitalOcean 512MB ($5.00/mo)

Name / UNIX Bench / I/O / Bandwidth
![スクリーンショット 2014-06-15 11.01.08.png](https://qiita-image-store.s3.amazonaws.com/0/19168/9d0cde87-9d64-2798-db87-a918673fabc4.png)

# VULTR 768MB ($5.00/mo)

Name / UNIX Bench / I/O / Bandwidth
![スクリーンショット 2014-06-15 11.01.42.png](https://qiita-image-store.s3.amazonaws.com/0/19168/8562cf43-c6ba-f10c-154b-9e812e785b9f.png)

# 結論

micro, smallが現役ではないとはいえ（一年以上前のbenchだし）、x10のオーダで値段が違いますね。
microはユーザを馬鹿にしているかのような性能ですね。
しかも、AWSはアホみたいに転送料が高いですが、DigitalOcean、VULTRともに1TB以上の転送料が無料で付属しています。（AWSでは$100-200相当）
Overしても\$0.02/GB

後者2つは最近伸びてきている時間課金型のVPSです。（ほとんどクラウド）
512MBのVPSが\$0.007/h（$5/mo）で立ち上げることが出来ます。
でくの坊のmicroが\$14.40/moであることを考えると、とんでもない価格破壊ですね。
月契約ではなく、時間契約でこれです。

どちらかというとDigitalOceanのほうが勢いが有りますが、VULTRは東京リージョンもあるし安くて性能がいい。
まあどちらも十分に安いのでどっちでもいいです。性能生かしきるほど酷使しません。

あとはOVHっていう月課金型のVPSが **1GB** Mem + SSD DeskのVPSを **$2.99/mo**で提供してたりします。(HNで話題になってた)
身分証明書を撮って送らなければならず、面倒なので試してません。

AWSがいいのはAuto ScaleだったりELBだったりと、サービスレベルでの統合具合なので、別にAWSクソとか言いたいわけではありません。
特に、ELBが最高ですね。代替物ほとんどありません。

ただ、サーバをたくさん動かすサービスとかだと、インスタンス料金とか転送料とかが馬鹿にならないので、DigitalOceanとかVULTRとかが検討出来ると思います。
あるいは、動画配信とか転送料ビジネスをしている場合。

冗長性を捨てろと言っているわけではなく、AWSをつまみ食いして適切な構成を組めば良いかなーと思っております。
S3とかCloudFrontとかSQSとかDynamoDBとか最高なので。

追記: ちなみに2014/06/16現在VULTRは\$100までのデポジットチャージを倍にするキャンペーンを行っており、安さが加速しております。

# 参考文献

\> 200 requests/s with Ruby on Rails 4 on a 5$ / month server
http://blog.wiemann.name/rails-server

benchmarks
http://serverbear.com/9686/amazon-web-services
http://serverbear.com/10159/vultr
http://serverbear.com/9806/digitalocean

#追記: t2.micro

AWSが安くて実用的（っぽい）インスタンス出しました

![スクリーンショット 2014-07-01 22.09.00.png](https://qiita-image-store.s3.amazonaws.com/0/19168/5496a038-cd5a-a9e6-dd83-cfbfab78d669.png)

なんか制限があるっぽいですがスペック表を見た限りは DigitalOcean にひけを取らない価格だと思います。
セキュリティグループなど考えるとAWSで済ませたいところなので良い動きです。
（転送料はAWSの正規料金なので注意）

追記：
t2.microの 10% は、2.5GHzのXeonのシングルコアの 10% にアクセス出来るという意味らしいです。
つまり、CPUとしてはわりと残念。CPU Credits / Hour は1時間に何分オーバー出来るかとかそんな感じっぽいです。
APサーバとかCPUあんまり食わないのにメモリもりもりとかよく有るので、最も使う用途であるAPサーバとかにすごくいいですね！
microの10%が実際どれくらいなのかは要調査って感じです

https://aws.amazon.com/jp/blogs/aws/low-cost-burstable-ec2-instances/

#追記：So you Start

OVHの姉妹サービス

http://www.soyoustart.com/us/essential-servers.xml

**占有インスタンス**
CPU: Intel Xeon E3 1225v2 (4 cores) 3.2 GHz+
Memory: 32 GB
HDD: 2 x 2 TB SATA
 => **\$49.00/mo**

m3.mediumがCPU仮想1コア+メモリ3.75GBで\$50/mo？ん？聞こえないなぁ…

HDDなのが気になる方は、SDDの同等スペックが\$56/moで有ります。

また、セットアップフィー($69)がありますが、月割りに出来たり、12ヶ月契約なら無料だったりします。
重い処理を沢山したい人とか、ストリーミングとかやりたい人はいいですね。
（データセンターはUS, EUのみです）
メモリ32GBも何に使うんでしょうね。

#追記: GCP

Google Cloud Platform の Burstable Instance よく見るとめっちゃ安いような気がしたので、後で追記するかもしれません。
t2.microとかお笑いレベルかも。
また、GCPは全体的に使う予定があるので、別途書くかも。
rails3.2.14で本番デプロイ時に確認したこと


## 準備

`be rake db:create RAILS_ENV=production`
`be rake db:migrate RAILS_ENV=production`
`be rake assets:precompile RAILS_ENV=production && be rails s -e production`

と準備する訳ですが

何度もサーバーを再起動することが予想されたので

[assets:precompile の速度を改善する](http://qiita.com/kakipo/items/8aa5cdf80b7af46cf3ab)
より

```:Gemfile

group :assets do
  ...
  gem 'turbo-sprockets-rails3'
end

```

を導入しました。


## assetsの名前解決

サーバーログに`ActionController::RoutingError`エラーが出たので

[Rails 3.2のproduction環境でisn't precompiledと出る場合の対処](http://qiita.com/torshinor/items/fcf57edfaa18acabcb87)より

```:config/environments/production.rb

config.serve_static_assets = true

```

してサーバー再起動



動きました。
ひとまず終わりです。
Gruntタスクを変更ファイルのみを対象に実行する

# こんな状況

`coffee`フォルダの`*.coffee`ファイルを監視して,
`js`フォルダに`*.js`として出力する。

```Gruntfile.js
module.exports = function(grunt) {
    grunt.initConfig({
        watch: {
            files: 'coffee/*.coffee',
            tasks: 'coffee'
        },
        coffee: {
            compile: {
                expand: true,
                cwd: 'coffee',
                src: ['*.coffee'],
                dest: 'js',
                ext: '.js'
            }
        }
    }
};
```

# これが問題

`coffee/test01.coffee`を編集すると自動的に`js/test01.js`に変換される。
ただし変更ファイル以外も含め監視下のすべてのcoffeeファイルがコンパイルされる。


```zsh
# ll coffee/ | awk '{print $8 " " $9}'

10:32 test01.coffee
10:30 test02.coffee

# ll js/ | awk '{print $8 " " $9}'

10:32 test01.js
10:32 test02.js
```

# これをgrunt-newerで解決

tschaub/grunt-newer
https://github.com/tschaub/grunt-newer

タスク名の前に`newer`をつけるだけで、
変更されたファイルのみを対象としてタスクが実行される。

```Gruntfile.js
        watch: {
            files: 'coffee/*.coffee',
            tasks: 'newer:coffee'
        },
```

この状態であれば`coffee/test01.coffee`を変更しても、
`js/test01.js`のみ新たに生成され`js/test02.js`は変化しない。

```zsh
# ll coffee/ | awk '{print $8 " " $9}'

10:36 test01.coffee
10:30 test02.coffee

# ll js/ | awk '{print $8 " " $9}'

10:36 test01.js
10:32 test02.js
```


## ちょっと補足

[time-grunt](https://github.com/sindresorhus/time-grunt)を使用して、出力結果を比較すると以下のようになる。

むしろ`newer`タスクの分遅くなってるが、これはプロジェクトの規模が極端に小さいため。
ファイル数やファイルサイズが大きくなれば、その効果は大きい（はず！）。

### 通常時

```zsh
Execution Time (2014-06-15 01:32:04 UTC)
loading tasks    4ms  ▇▇▇▇ 8%
coffee:compile  46ms  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 92%
Total 50ms
```

### `grunt-newer`使用時

```zsh
Execution Time (2014-06-15 01:36:46 UTC)
loading tasks                  4ms  ▇▇ 6%
newer:coffee                   2ms  ▇ 3%
newer:coffee:compile           6ms  ▇▇▇ 10%
coffee:compile                48ms  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 77%
newer-postrun...newer/.cache   2ms  ▇ 3%
Total 62ms
```
Docker で bundle install を爆速にする

Docker、残念なのは`bundle install`がクソ遅いですね。
ADDでディレクトリを突っ込んでから`bundle install`されている方が多いと思います。
そうすると、何かしら更新するだけで、Gemfileを変更しているかどうかに関わらず毎回`bundle install`が走ってしまいます。

もちろんgemフルインストールになるので、1-2分は余裕でかかってしまいますね。
Chef並みに遅くなり、悲しくなるので、対策を書きます。

```Dockerfile:Dockerfile
##Cache bundle install#################
WORKDIR /tmp
ADD ./Gemfile Gemfile
ADD ./Gemfile.lock Gemfile.lock
RUN bundle install
#######################################
```

をアプリのADDよりも上の方に入れると結果をキャッシュすることが出来ます。

これでGemfile入りでも4秒くらいでビルドできるようになります。

ところで`Dockerfile`をどこで管理しようか迷っている方がいるかと思いますが、アプリのRootがデフォです。つまりアプリのソースと一緒に管理します。
レジストリを分けて管理するのはDocker wayではありません。
Docker はわざわざ ubuntu12.04 から始めないようにすると楽

`Dockerfile`、書くの面倒ですね。
なんだか、毎回同じようなことを書いているような気がします。
`apt-get -qy install git build-essential...`みたいな

毎回毎回コピペするのも面倒なので、テンプレを使いましょう。

`Dockerfile`の先頭を他のレポジトリの名前にすることで、そのレポジトリを元にbuildをすることが出来ます。
色々なライブラリ/言語をいい感じに入れたレポジトリ群をDockerがメンテしてるので、それを使いましょう。

例えば、rubyであれば
`FROM: dockerfile/ruby`
とすることで色々良い感じになったruby入りのubuntuから始めることが出来ます。

ちなみに元々のruby入りDockerfileは（色々弄った残骸も含め）こんな感じでした

```Dockerfile:Dockerfile
FROM ubuntu:12.04
RUN apt-get update
RUN apt-get -qy install git vim tmux
RUN apt-get -qy install build-essential libpq-dev libv8-dev
RUN apt-get -qy install curl
RUN apt-get -qy install openssl libreadline-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison libcurl4-openssl-dev
RUN apt-get -qy install wget

RUN wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
RUN tar xzfv ruby-2.1.1.tar.gz
RUN cd ruby-2.1.1 ; ./configure
RUN cd ruby-2.1.1 ; make && make install
```

これが

```Dockerfile:Dockerfile
FROM: dockerfile/ruby
```

になります。

最高。
Unityのvelocity（速度)変更処理の詳細


よく下記ようなコードで速度を与えるというものが出てくるが、内部では何が行われているのか。


例として、右(right)に向かう場合。


```c#
rigidbody2D.velocity = transform.right.normalized * 2.0f;
```

## transform.right (Transform#right)
これは、Vector.3.rightメソッドに、自身の回転を加えたものを返す。
Vector3.rightは回転角無しの右向きのVector3インスタンスなので、それを自身の向きに変換する必要がある。

```c#:right
public Vector3 right
{
	get
	{
	    return this.rotation * Vector3.right;
	}
　　…
}

```

ちなみに、Vector3.rightはxに1fを設定したVector3のインスタンス。

```c#:right
public static Vector3 right
{
	get
	{
		return new Vector3 (1f, 0f, 0f);
	}
}

```


## transform.right.normalized (Vector3#normalized)


```c#

public Vector3 normalized
{
	get
	{
		return Vector3.Normalize (this);
	}
}
```
自身のベクトルから単位ベクトル(長さが1のベクトル)を作成している。
Vector3のNormalizeメソッドに自身を引数としている。

```c#:Normalize

public static Vector3 Normalize (Vector3 value)
{
	float num = Vector3.Magnitude (value);
	if (num > 1E-05f)
	{
		return value / num;
	}
	return Vector3.zero;
}
```

ちなみに、Magnitudeの実装。自身を引数とした平方根を算出。

```c#:Normalize
public static float Magnitude (Vector3 a)
{
	return Mathf.Sqrt (a.x * a.x + a.y * a.y + a.z * a.z);
}

```

## transform.right.normalized * 「スピード」 (Vector3 #operator *)

最後にtransform.right.normalized * -0.8f;
の「* 2.0f」の部分。

```c#

operator *

public static Vector3 operator * (Vector3 a, float d)
{
	return new Vector3 (a.x * d, a.y * d, a.z * d);
}


```
ここまでで作成された長さ1のベクトルに指定数を掛け合わせたVector3のインスタンスが作成される。


# まとめ

と、こんな感じの一通りの処理。
まとめると、

- 指定の向きベクトルを作成
- 自身の回転を加算
- 長さ1の単位ベクトルに変換
- スピードを掛け合わせる

です。
jQueryの配下と直下の違い

jQueryやJavascriptの書籍で度々出てくるDOMの表現、<Font color="#04B4AE">**配下**</font>と<Font color="#04B4AE">**直下**</font>  
これらの意味が合っているか不安だったので、まとめました。

## 配下 - 祖先要素と子孫要素の関係

**結論**  
ある要素に含まれる要素すべてのこと

**具体例**  

```html
<body id="me">
  <p id="child">
    配下に含まれる
  </p>
  <div>
    <p class="grandchild">
      配下に含まれる ※
    </p>
  </div>
</body>
```

上記のコードでは、 **me** セレクタから見てすぐ下の要素である **child** と **div**要素、さらにdiv要素の子要素である **grandchild** 要素も配下に含まれます。


## 直下 - 親要素と子要素の関係

**結論**  
ある要素のすぐ内側にある要素のこと

**具体例**  

```html
<body id="me">
  <p id="child">
    直下に含まれる
  </p>
  <div>
    <p class="grandchild">
      直下に含まれない ※
    </p>
  </div>
</body>
```

上記のコードでは、 **me** セレクタから見てすぐ下の要素である **child** と**div**要素が直下に含まれますが、  配下の場合と異なるのは、さらに下の**grandchild**は含まれないことです。
Julia v0.3.0でSVM.jlを使う


exampleを実行したいだけなのに、またハマったのでメモがてら書きます。

最終的に修正したexampleはこちら。(現在[PR投げてます](https://github.com/JuliaStats/SVM.jl/pull/10)がいつmergeされるやら...)

```
# To show how SVMs work, we'll use Fisher's iris data set
# Temporally, following order is required 
using RDatasets
using SVM


# We'll learn to separate setosa from other species
iris = dataset("datasets", "iris")

# SVM format expects observations in columns and features in rows
X = array(iris[:, 1:4])'
p, n = size(X)

# SVM format expects positive and negative examples to +1/-1
Y = [species == :setosa ? 1.0 : -1.0 for species in iris[:, "Species"]]

# Select a subset of the data for training, test on the rest.
train = randbool(n)

# We'll fit a model with all of the default parameters
model = svm(X[:,train], Y[train])

# And now evaluate that model on the testset
accuracy = countnz(predict(model, X[:,~train]) .== Y[~train])/countnz(~train)
```

ちなみに、比較対象のcommitは `20bd50ea72fc4f94ec9e4adebf48ec7f16c717ca`

ポイントは2点。

## 1. RDatasetsの使い方が変わった

```diff
-iris = data("datasets", "iris")
+iris = dataset("datasets", "iris")
```


[こちら](http://www.slideshare.net/TokorosawaYoshio/tokyor40-35862024)の所沢さんの資料を読んでいたら、P.11に書いてあって気づいた。

## 2. `predict`がRDatasetsのものとconflictする

```julia
accuracy = countnz(predict(model, X[:,~train]) .== Y[~train])/countnz(~train)
```

ここの部分だけど、うまくいったり行かなかったりしたので凄い悩んだ。

元々のexampleだと、型が合わないとエラーが出てしまう

```julia
julia> accuracy = countnz(predict(model, X[:,~train]) .== Y[~train])/countnz(~train)
ERROR: no method predict(SVMFit, Array{Float64,2})
```



```
julia> using SVM
julia> using RDatasets
julia> methods(predict)
# 2 methods for generic function "predict":
predict(::DataFrameRegressionModel{M,T},...) at /Users/chezou/.julia/v0.3/DataFrames/src/statsmodels/statsmodel.jl:27
predict(obj::RegressionModel) at /Users/chezou/.julia/v0.3/StatsBase/src/statmodels.jl:20
```

どうやら、DataFramesの`predict`を読んでしまっていたらしい。

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/chezou">@chezou</a> 型が合わない時は methods(predict) として、使いたい関数がどのファイルで、どの型なら受け付けるのか一覧できます。今のはそれで見つけました。</p>&mdash; 佐藤ヾ(⌒(｢ &#39;ω&#39;)｢ｶﾞｵｰ建太 (@bicycle1885) <a href="https://twitter.com/bicycle1885/statuses/477780857592107008">2014, 6月 14</a></blockquote>

(bicycle1885さんありがとうございます！)

これは、usingの順番を変えることで対応出来ました。

```julia
julia> using RDatasets
julia> using SVM
julia> methods(predict)
# 2 methods for generic function "predict":
predict(fit::SVMFit,X::Array{T,2}) at /Users/mic/.julia/v0.3/SVM/src/SVM.jl:22
predict(fit::SVMFit) at /Users/mic/.julia/v0.3/SVM/src/SVM.jl:33
```

`methods`とかで調べるみたいな話、軽く使う分には知らないのでハマった時の対処法を身につけていきたい。


はー、さくっとやろうと思ったら、2,3時間はまってしまった。
MySQLインストール

MySQLインストール
================

バイナリを[dev.mysql.com](http://dev.mysql.com/downloads/mysql/)からdownloadして`/usr/local/src`に配置しておく。


#### ユーザ作成

```shell-session
groupadd -g 2008 mysql
useradd -u 2008 -g mysql -d /home/mysql -m -s /bin/bash mysql
```

#### 必要なパッケージのインストール

```shell-session
apt-get -y install libncurses5-dev libaio-dev zlib1g-dev libreadline-dev
```

#### 配置

```
cd /usr/local/src
tar zxvf mysql-5.6.19-linux-glibc2.5-x86_64.tar.gz
mv -i mysql-5.6.19-linux-glibc2.5-x86_64 /usr/local/.
ln -s /usr/local/mysql-5.6.19-linux-glibc2.5-x86_64 /usr/local/mysql
chown -R mysql. /usr/local/mysql/data
```

#### 初期化

```shell-session
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data
```

#### 設定

```
mkdir -p /var/run/mysql
mkdir etc
cp -pi support-files/my-default.cnf etc/my.cnf
```

設定値はその時々で。

```mysql:/usr/local/etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8

[mysqld]
# Global
datadir = /usr/local/mysql/data
tmpdir = /var/tmp
port = 3306
socket = /tmp/mysql.sock
user=mysql

max_connections = 16
max_allowed_packet = 1M

character-set-server = utf8
skip-character-set-client-handshake
collation-server = utf8_general_ci

query_cache_size = 0
query_cache_type = 0

table_open_cache = 128
table_definition_cache = 512
open_files_limit = 5000

innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 16M
innodb_log_buffer_size = 8M
key_buffer_size = 16M

# Session
sort_buffer_size = 512K
read_rnd_buffer_size = 512K
join_buffer_size = 256K
read_buffer_size = 256K

# Log
log-bin = mysql-bin
binlog_format = mixed
max_binlog_size = 128M
expire_logs_days = 7
server-id = 1
#general_log_file = /tmp/query.log
general_log = 0
slow_query_log = 0
#long_query_time = 0.5
#log_queries_not_using_indexes
#log_output = TABLE
innodb_log_file_size = 128M

[mysqldump]
quick
set-charset
single-transaction
max_allowed_packet = 16M
```

#### 起動

```shell-session
cp -pi support-files/mysql.server /etc/init.d/mysql
/etc/init.d/mysql start
bin/mysqladmin -u root password 'secret'
bin/mysql_secure_installation
```
ansibleをMac OSXに入れてみた時のメモ

## 前提
vagrantを使って192.168.10.10でVMが作成・起動済

## インストール
```
$ sudo easy_install pip
$ sudo pip install ansible
```

## 実行確認
```:vagrantユーザでpingを実行
$ echo "192.168.10.10" > ~/ansible_hosts
$ ansible all -m ping -c paramiko -u vagrant --ask-pass
```
```:鍵を利用する
$ echo "192.168.10.10" > ~/ansible_hosts
$ ansible all -m ping -c paramiko  -u vagrant --private-key=~/.vagrant.d/insecure_private_key 
```

### 補足:ssh接続について
ansibleはssh接続にsshpassまたはparamikoを環境に応じて自動的に選択するが、
sshpassはデフォルトでインストールされないため以下のエラーが発生するケースがある
今回は、オプションを指定してansbleインストール時に一緒にインストールされるparamikoを使った

```
$ ansible all -m ping --ask-pass -u vagrant
SSH password: 
192.168.10.3 | FAILED => to use the 'ssh' connection type with passwords, you must install the sshpass program
```
連想配列をソートする

なお、数値は適当（想像）である

```pl
use strict;
use warnings;
use 5.10.1;

my %kawaiso = (
  kazurari  => { age => 16 },
  ritsu     => { age => 17 },
  shirosaki => { age => 25 },
  mayumi    => { age => 27 },
  sayaka    => { age => 24 },
  sumiko    => { age => 34 },
);

foreach my $name (sort { $kawaiso{$a}{age} <=> $kawaiso{$b}{age} } keys %kawaiso ) {
  say sprintf "%9s %d", $name, $kawaiso{$name}{age};
}
__END__
 kazurari 16
    ritsu 17
   sayaka 24
shirosaki 25
   mayumi 27
   sumiko 34
```
Redisインストール

Redisインストール
================

#### ユーザ作成

```shell
groupadd -g 1001 redis
useradd -g 1001 -u 1001 -s /sbin/nologin redis
```

#### 必要なパッケージをインストール

```shell
yum install clang make
```

#### ダウンロード

```shell
cd /usr/local/src/
wget -c http://download.redis.io/releases/redis-5.0.5.tar.gz
```

#### インストール

```shell
tar zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
CC=clang make && make install
```

#### 設定

```shell
mkdir -p /usr/local/redis/dump
cp -pi redis.conf /usr/local/redis/.
vi /usr/local/redis/redis.conf
```

その他設定は適宜修正。

```diff:/usr/local/redis/redis.conf
158c158
< pidfile /var/run/redis_6379.pid
---
> pidfile /var/run/redis.pid
263c263
< dir ./
---
> dir /usr/local/redis/dump
```

カーネルパラメータの調整

```shell-session
sysctl vm.overcommit_memory=1
sysctl net.core.somaxconn=1024
vi /etc/sysctl.conf
```

```diff:/etc/sysctl.conf
60a61,63
>
> vm.overcommit_memory = 1
> net.core.somaxconn = 1024
```

#### 起動

```shell
vi /etc/systemd/system/redis.service
```

```config:/etc/systemd/system/redis.service
[Unit]
Description=redis

[Service]
Type=simple
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
User=redis
Group=redis
SyslogIdentifier=redis

[Install]
WantedBy=multi-user.target
```

```shell
systemctl daemon-reload
systemctl start redis
systemctl enable redis
```