OmniAICreator/Qiita-1.07M huggingface dataset:
気のせいかしら？RailsでJSにHTMLを埋め込むと幸せ

WEBサイトではほとんどのページで共通する部品ってのがありますよね。
ヘッダとかフッタとか。
普通、Railsではそういうパーツはレイアウトに書いてしまうんだけど、それだと当然**全てのページのレスポンスに共通パーツが含まれてしまう**わけです。
これってレスポンスのサイズを無駄にデカくしてますよね。
そもそも、毎回同じ文字列がレスポンスに含まれるのは**DRYじゃなくてダサい**気がします。
そう考えだすと居ても立ってもいられず、**共通パーツをJSに埋め込んで、動的にレンダリング**してやろうなんて思ったわけです。

まず、やったのは**レイアウト**に書いてたヘッダパーツを切り出す作業です。

元々の**app/views/layouts/application.html.erb**が

```html
<body>
  <header>
  (中略)
  </header>

  <%= yield %>
</body>
```
みたいな感じで、ヘッダを含んでいたのを

```html
<body>
  <div id="page-header"></div>
  <%= yield %>
</body>
```
こんな風にヘッダのプレースホルダとなるDIVタグだけにします。
そして、ヘッダのコンテンツは

**app/assets/templates/header.html.erb**

```html
<header>
(中略)
</header>
```
に切り出します。

次に、切り出したヘッダ用コンテンツを**js**内に文字列として埋め込みます。
そして、ページロード完了時にヘッダコンテンツをjQueryでHTML内に描画してやるようにします。

**app/assets/javascripts/application.js.erb**

```js
var header_html = '<%= escape_to_js_str render_asset('header.html') %>';
$(function(){
  $('#page-header').append($(header_html));
});
```
このファイルはrubyスクリプトを含めるために**erb**で書いてます。
**render_asset**メソッドは**app/assets**ディレクトリ内のファイルを文字列として読み込む為のもので、**escape_to_js_str**メソッドはその文字列をJS内で文字列リテラルとして問題ない様にエスケープするためのものです。

これらのメソッドは次の**app/helpers/asset_helper.rb**内に定義しました。

```rb
module AssetHelper

  # アセットファイルをパースして返す
  def render_asset(path)
    depend_on_asset(path)
    body = assets.find_asset(path).body
  end

  # 受け取った文字列をJS文字列リテラルとして問題ないようにエスケープ
  def escape_to_js_str(str)
    escape_map = { '\\' => '\\\\', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', "'" => "\\'" }
    escape_map.each do |search, replace|
      str.gsub!(search, replace)
    end
    str
  end
end
```
**depend_on_asset(path)**がミソで、これをやっておかないと**header.html.erb**を変更した時に、**application.js.erb**の再コンパイルが走ってくれず、ヘッダの変更が反映されないという問題が起きます。いやぁ、この方法を見つけるまで、結構ソースを読み込みましたよ。

次に、このままでは**application.js.erb**内で**AssetHelper**が使えないので、以下のコードを**config/initializers/assets.rb**内に追加します。

```rb
Sprockets::Context.send :include, AssetHelper
```

これで、一応は目的通り動作してくれるようになりました。
ですが、まだ問題が有ります。

```bash
rake assets:precompile
```
を実行すると**header.html.erb**までコンパイルされて**public/assets/**ディレクトリ内に**header-1234567890abcdef.html**みたいなファイルが生成されてしまうんです。これは不要なファイルなので生成されないようにします。

**config/initializers/assets.rb**に以下のコードを追加しました。

```rb
# .js .css .htmlファイルはコンパイルしないようにする
precompile_target = lambda do |filename, path|
  puts filename
  path =~ /app\/assets/ && !%w(.js .css .html).include?(File.extname(filename))
end
Rails.application.config.assets.precompile = [
  precompile_target,
  /(?:\/|\\|\A)application\.(css|js)$/
]
```

これは何をしているかというと、**js**、**css**、**html**の拡張子を持つファイルはプリコンパイルしないようにして、ただし**application.css**と**application.js**だけはプリコンパイルするようにしています。
この辺りの具体的な説明は[Railsのアセットのプリコンパイル対象の追加と除外方法](http://qiita.com/ryounagaoka/items/8cbe76f2fb7a3157f07c)に書いてます。

これで完成です！
ヘッダ以外の共通パーツも同様にJSに切り出してやれば、各ページのレスポンスにはそのページに最低限必要なHTMLだけを含めることが出来、トラフィックの削減が期待できて、すごく幸せになれそうですね！

と思って頑張ってみたんですが、実際にやってみると落とし穴がありました。
切り出したコンテンツ内では動的なデータを含めることが難しいので、使える範囲は非常に限定的でした。例えば、ヘッダー部分に表示するコンテンツがDBから取得したデータに依存している場合なんかは完璧にアウトです。
なので、頑張った割にはあんまり効果がないという、私的には残念な結果になってしまいました。
でも、全ページに共通な静的なコンテンツがたくさんあるサイトとかだと使う意味があるかもしれません。
/etc/cron.daily/tmpwatchが無い

ふと気がついた/etc/cron.daily/tmpwatchが無い

```bash
$ rpm -q --changelog tmpwatch
* 月  2月 11 2013 Miloslav Trma? <mitr@redhat.com> - 2.11-3
- Drop the cron.daily script, systemd default configuration handles the same
  places.
```

systemdで管理するようになったのでcronからは削除されたらしい

/usr/lib/systemd/system/systemd-tmpfiles-clean.timer
/usr/lib/systemd/system/systemd-tmpfiles-clean.service

```bash:
$ cat /usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
```
時間が経過したディレクトリは削除されるが
ファイルは削除されないようだ。
ファイルも消したい場合は別途指定が必要な様子。（ただし他の競合もあるので安易に全消しはよくない）

```bash:
$ ls -l /usr/lib/tmpfiles.d/
合計 64
-rw-r--r-- 1 root root   91  6月 19  2014 abrt.conf
-rw-r--r-- 1 root root   77  7月 23  2014 httpd.conf
-rw-r--r-- 1 root root   39  8月 26  2014 initscripts.conf
-rw-r--r-- 1 root root 1149  7月 31  2014 legacy.conf
-rw-r--r-- 1 root root   34  6月 10  2014 libselinux.conf
-r--r--r-- 1 root root   61  6月 10  2014 lvm2.conf
-rw-r--r-- 1 root root   34  6月 10  2014 mdadm.conf
-rw-r--r-- 1 root root  110  6月 18  2014 pam.conf
-rw-r--r-- 1 root root   22  6月 10  2014 rpm.conf
-rw-r--r-- 1 root root   34  1月 25  2014 saslauthd.conf
-rw-r--r-- 1 root root   62  9月 26  2014 selinux-policy.conf
-rw-r--r-- 1 root root   33  3月  6  2014 svnserve.conf
-rw-r--r-- 1 root root  486  7月 31  2014 systemd-nologin.conf
-rw-r--r-- 1 root root  930  7月 31  2014 systemd.conf
-rw-r--r-- 1 root root  626  7月 31  2014 tmp.conf
-rw-r--r-- 1 root root  623  7月 31  2014 x11.conf
```
Atomのhaskell-ghc-modをstack使用時にも動くようにする

[stackでghc-modを使う試行錯誤のメモ](http://qiita.com/hiratara/items/15aba2534b16c2af8a02)を参考にまずはstackを使っていてもghc-modが動くように準備します(hirataraさんありがとうございます！)。
`cabal configure`は下の様に各種パスをstack pathから引っ張ってきた方が楽かもしれません。

````
PATH=$(stack path --bin-path):$PATH cabal configure \
    --package-db=clear \
    --package-db=global \
    --package-db=$(stack path --snapshot-pkg-db) \
    --package-db=$(stack path --local-pkg-db)
````

stackとghc-modが一緒に動くように出来たら、次にAtomのhaskell-ghc-modパッケージのghc-modを呼んでいる箇所をstack経由で呼ぶように書き換えます。
haskell-ghc-modの設定画面から『View Code』ボタンでソースを開き、下記の様に書き換えます。

ghc-modi-process.coffeeの33・34行目

````
command: 'stack'
args: ['exec', '--', 'ghc-mod', '--map-file', 'test', 'version']
````

ghc-modi-process-base.coffeeの30行目

````
proc = CP.spawn('stack', ['exec', '--', 'ghc-modi'], options)
````

ghc-modi-process-base.coffeeの55・56行目

````
command: 'stack'
args: ['exec', '--', 'ghc-mod'].concat(cmd)
````
年金現価係数の求め方

# 1. 年金現価係数とは
**年金現価係数**は、元本を一定利率で複利運用しながら、毎年一定金額を一定期間取り崩していくとき、現在いくらの元本で複利運用を開始すればよいかを計算するときに利用します。

現在の金額（元本）を$X$、毎年の取り崩し額（年金額）を$Y$、年金現価係数を$\alpha$、年利率を$r$、年数を$n$とすると

$X = \alpha Y$

また、年金現価係数$\alpha$は

$\displaystyle \alpha = \frac{1-(1+r)^{-n}}{r}$

です。

上の数式の日本語版は以下のようになります。

『現在の金額（元本） ＝ 年金現価係数 × 毎年の取り崩し額（年金額）』
『年金現価係数 ＝ （１ － （（１ ＋ 年利率）＾（年数 × －１））） ÷ 年利率』

# 2. 年金現価係数の求め方

## 2.1 漸化式の立式(n年目の残金について)

まず、元本$X$としたとき、0年目の残金を$x_0$で表しますと

$x_0 = X$

次に年金額$Y$、年利率$r$のとき、1年目の残金を$x_1$で表しますと

$x_1 = x_0(1+r) - Y$

次に2年目の残金を$x_2$で表しますと

$x_2 = x_1(1+r) - Y$

n年目の残金を$x_n$で表しますと

$x_n = x_{n-1}(1+r) - Y$

となります。
$x_n$の式について、右辺を$X,Y,r,n$で表すことが出来れば、
元本$X$、年金額$Y$、年利率$r$、年数$n$と設定したときに
n年目に残る金額$x_n$が計算できます。

この計算は、初項$x_0 = X$、一般項 $x_n=x_{n-1}(1+r) -Y$の漸化式を解く問題に帰着されます。

## 2.2 立式した漸化式を解く

今から解いていきます・・・

$x_n=x_{n-1}(1+r) -Y$について$x_{n-1}=x_{n-2}(1+r) -Y$を適用しますと

$x_n=(x_{n-2}(1+r) -Y)(1+r) -Y = x_{n-2}(1+r)^2 - Y(1+r) - Y$

更に$x_n= x_{n-2}(1+r)^2 - Y(1+r) - Y$について$x_{n-2}=x_{n-3}(1+r) -Y$を適用しますと

$x_n= (x_{n-3}(1+r) -Y)(1+r)^2 - Y(1+r) - Y = x_{n-3}(1+r)^3 - Y(1+r)^2 - Y(1+r) - Y $

順々に適用しますと、初項$x_0 = X$に注意すれば

$\displaystyle x_n=x_0(1+r)^n - Y\sum_{k=0}^{n-1} (1+r)^k = X(1+r)^n - Y\sum_{k=0}^{n-1} (1+r)^k $

となります。

## 2.3 n年目に残金が0となるような元本を求める

今回、年金額$Y$で毎年切り崩していき、$n$年目に残金が0となるような値を求めるので、
$x_n=0$となればよいです。

よって、今回求める元本$X$、年金額$Y$、年利率$r$、年数$n$の関係式は以下のようになります。

$\displaystyle x_n = X(1+r)^n - Y\sum_{k=0}^{n-1} (1+r)^k = 0$

## 2.4 年金現価係数を求める

$x_n = 0$の式から年金現価係数$\alpha$を求めます。年金現価係数$\alpha$は

$X = \alpha Y$

となるときの$\alpha$でした。

よって、$\displaystyle X(1+r)^n - Y\sum_{k=0}^{n-1} (1+r)^k = 0$の式を$X$について解けばよいです。

これを解きますと

$\displaystyle X(1+r)^n = Y\sum_{k=0}^{n-1} (1+r)^k$

$\displaystyle X = (1+r)^{-n} Y\sum_{k=0}^{n-1} (1+r)^k$

$\displaystyle X = Y\sum_{k=0}^{n-1} (1+r)^{k-n}$

$\displaystyle X = Y\sum_{k=0}^{n-1} \left (\frac{1}{1+r} \right )^{n-k}$

$\displaystyle X = Y\sum_{k=1}^{n} \left (\frac{1}{1+r} \right )^{k} \cdots (※)$

## 2.4.1 等比数列の総和の公式について

ここで、等比数列の総和の求め方を思い出すと・・・

$\displaystyle S = \sum_{k=1}^{n} R^k = R + R^2 + R^3 + \dots + R^n \cdots (1)$

両辺$R$を掛ければ

$\displaystyle RS = R\sum_{k=1}^{n} R^k = R^2 + R^3 + R^4 + \dots + R^{n+1} \cdots (2)$

ここで$(2)-(1)$を計算すると

$\displaystyle RS - S = R^{n+1} - R$

これをSについて解けば

$\displaystyle S = \frac{R^{n+1} - R}{R-1} = R\frac{R^{n} - 1}{R-1}$

となって等比数列の総和$S$が求められました。

## 2.5 年金現価係数を求める話に戻ると・・・

今回は$\displaystyle R=\frac{1}{1+r}$なので、等比数列の総和の式を$(※)$に適用すると

$\displaystyle X = Y\sum_{k=1}^{n} \left (\frac{1}{1+r} \right )^{k} = Y \left ( \frac{1}{1+r}\right )\frac{\left (\frac{1}{1+r}\right )^{n} - 1}{\left (\frac{1}{1+r}\right )-1} = Y \frac{\left ({1+r}\right )^{-n} - 1}{1-(1+r)} = Y \frac{1 - (1+r)^{-n}}{r}$

$\displaystyle \alpha = \frac{1 - (1+r)^{-n}}{r}$とすれば

$X = \alpha Y$

となります。よって年金現価係数$\alpha$は

$\displaystyle \alpha = \frac{1 - (1+r)^{-n}}{r}$

と求めることができました。

# 3. 具体的な値で年金現価係数を求めると・・・
年利率3.0[%]$(r=0.03)$と20年$(n=20)$の年金現価係数$\alpha$は

$\displaystyle \alpha = \frac{1 - (1+0.03)^{-20}}{0.03} = 14.8775$

となります。(ここで[計算結果](http://www.wolframalpha.com/input/?i=%7B1+-+%281%2B0.03%29%5E%7B-20%7D%7D%2F%7B0.03%7D)が分かります)
iperfでネットワークスループットを確認する

これネットワークI/Oが悪いんじゃね？と自分のプログラム以外のせいにしたくなることがあると思います。
本当にそうなのか確認しましょう。

## iperfでスループット計測
iperfを使います。yumでインストールできます。
サーバー2台間で通信することでスループットを計測しますので、iperfがインストールされている対向サーバーが必要になります。
※ 無料のテストサーバーとかがあったら教えて欲しいです

## インストール方法
二台両方にインストールします。

```bash
sudo yum install iperf --enablerepo=epel
```

## データを受け取る側(サーバー)
```bash
[ec2-user@serv1 ~]$ sudo iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
```

## データを送る側(クライアント)
```bash
[ec2-user@serv2 ~]$ sudo iperf -c serv1
------------------------------------------------------------
Client connecting to xx.xx.xx.xx, TCP port 5001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[  3] local xx.xx.xx.xx port 52367 connected with xx.xx.xx.xx port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.1 sec  1.26 GBytes  1.07 Gbits/sec
```

・・・ec2同士すごく早いです(^q^)

さくらVPSに送ると91.4 Mbits/secでました。VPS側が恐らく100MなNICだと思いますので、十分性能が出ています。

ネットワークスループットには問題無いですね(^q^)
Webアプリ用プロジェクトを速攻で用意する


空のWebアプリ用プロジェクトを用意するときは以下のようなスクリプトを用意して、叩いています。

```generate_project.sh
#!/bin/sh

if [ $# -ne 3 ]; then
  echo "usage: >`basename $0` groupId artifactId package"
  exit 0
fi

GROUP_ID=$1
ARTIFACT_ID=$2
PACKAGE=$3

mvn archetype:generate -B \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DarchetypeVersion=1.0 \
-DgroupId=$GROUP_ID \
-DartifactId=$ARTIFACT_ID \
-Dversion=1.0-SNAPSHOT \
-Dpackage=$PACKAGE

cd $ARTIFACT_ID
mkdir -p src/main/java
mkdir -p src/test/java
mkdir -p src/test/resources

mvn eclipse:eclipse
```

Eclipseからこのプロジェクトをインポートして、コーディング開始です。

※ mvnのgenerateでweb.xmlもソースディレクトリも同時に作る方法知っている方いたら教えてください(-_-ゞ
Qiita始めてみた

最近は日本でもオープンソースの公開はの場は、すっかりSourceForgeからGitHubに移行しつつありますね。
また個人の技術系の情報発信についても、だんだんはてなからQiitaのほうが目につくようになってきました。

GitHubと言えば私が所属する某グループのframeworkである、TERASOLUNA Server Framework for Javaについても5.x系からGithubでの公開となっています。
https://github.com/terasolunaorg

始めるにはよい機会なので、GitHub+TERASOLUNA Server Framework for Java (5.x)のお勉強の様子をQiitaで投稿していこうと思います。
ImageMagickでPDFを画像に変換する

##ImageMagickでPDFを扱うための設定

ImageMagickでPDFを扱う場合、GSをインストールしないといけないとのこと。

http://superuser.com/questions/819277/cant-convert-pdf-into-image-because-of-no-images-defined-error

OSXでbrew使ってる時は、`brew install gs`で大丈夫。


##サンプリング解像度の設定が必須

`density`オプションでdpiを設定をしないと、すごく画像が粗くなる。
元PDF設定や、出力したい画像のサイズに合わせて設定する。

参考にしたサイト
http://icepotato.cocolog-nifty.com/blog/2013/06/imagemagickpdfw.html


##PythonのPillowではPDFの読み込みができない

PythonのPillowだとPDFは、書き込みのみで読み込みは対応してないみたい。


##フォルダ丸ごとPDFをPNGに変換するコード

サンプリング解像度が300dpi、余白のトリミング付きで、同じフォルダにPNG画像を書き出してます。

ImageMagickをインストールしてれば動くはず。

```py
# coding: utf-8

import os
import os.path
import fnmatch
import subprocess


def execute(root_path):
    for dirpath, _, filenames in os.walk(root_path):
        for filename in filenames:
            if fnmatch.fnmatch(filename, u"*.pdf"):
                org_path = os.path.join(dirpath, filename)
                png_path = org_path.replace(".pdf", ".png")

                print "convert {0} to {1}".format(org_path, png_path)

                if subprocess.call(["convert", "-density", "300", "-trim", org_path, png_path]) != 0:
                    print "failed: {0}".format(org_path)
        
if __name__ == '__main__':
    root_path = raw_input("target folder path> ")
    execute(root_path)
```
Cocos2d-xの新規プロジェクト作成がちょっと楽なる(かもしれない)ツール


Cocos2d-xで新規プロジェクトを作成するのってちょっとめんどくさくないですか？
コマンドでの操作は嫌いではないんですが...

ってことで新規プロジェクト作成がちょっと楽になる(かもしれない)ツールを作ってみました。(mac用です。)
画面は↓な感じです。

![スクリーンショット 2015-07-03 23.46.12.png](https://qiita-image-store.s3.amazonaws.com/0/19516/cb760b17-e063-fcac-f8db-ae3e1f76b703.png)


単純にそれぞれの項目に入力された値を使ってコマンドを実行してるだけです。

gitにあげようと思ったんですがイマイチ使い方がよく分からなかったので
dropboxに置きました。よろしければお使いください。
(初めて作ったOSXアプリなので至らない点があるかもしれません。ご指摘いただけると嬉しいです。)

[ここからダウンロードできます。](https://www.dropbox.com/s/cpc8j7ojjoj1zgp/cocos.zip?dl=0)
MySQLでインポート時にエラーを無視

MySQLで、大量のデータをインポートする際に、途中でエラーがあると全部止まってしまいます。そこで、エラーがあっても無視してインポートを続けるには、「-f」オプションを付加します。

```bash
mysql -uuser -p dbtable -f < import.sql
```
48時間でSchemeを書こう/評価: 第一部

# 参考URL
[48時間でSchemeを書こう/評価: 第一部](https://ja.wikibooks.org/wiki/48時間でSchemeを書こう/評価:_第一部)

#ソース
https://github.com/0zawa/scheme_in_48_hours/blob/master/evaluation_1.hs

# ListValの表示

ListValをprint関数などで表示(文字列化)可能にします。

List,DottedList以外は単純に値を表示しています。

```hs
showVal :: LispVal -> String
showVal (String contents) = "¥"" ++ contents ++ "¥""
showVal (Atom name) = name
showVal (Number contents) = show contents
showVal (Bool True) = "#t"
showVal (Bool False) = "#f"
```

List,DottedListはLispValのリストをunwordsList関数に
渡してから連結しています。

```hs
showVal (List contents) = "(" ++ unwordsList contents ++ ")"
showVal (DottedList head tail) = "(" ++ unwordsList head ++ " . " ++ showVal tail ++ ")"
```

unwordsList関数はLispValのリストをStringに変換する関数です。

```hs
unwordsList :: [LispVal] -> String
unwordsList = unwords . map showVal
```

リストの個々の要素にshowValを適用し、
それをunwords関数に適用しています。
unwords関数はStringのリストを連結してStringにする関数です。

```hs
> unwords ["a","b","c"]
"a b c"

> unwords $ map show [1,2,3]
"1 2 3"
```

続いてLispValをShowクラスのインスタンスにします。

```hs
instance Show LispVal where show = showVal
```

これでshow関数の引数にLispValが渡された場合、
文字列が出力されるようになります。

文字列が表示できるようになったので、readExpr関数を修正します。

```hs
readExpr input = case parse parseExpr "lisp" input of
    Left err -> "No match: " ++ show err
    Right val -> "Found " ++ show val
```

"Found "のあとに文字列化されたLispValが
表示されるようになりました。

# 評価

続いて、LispValを評価するための関数を作ります。

まずは簡単なものから定義します。

```hs
eval :: LispVal -> LispVal
eval val@(String _) = val
eval val@(Number _) = val
eval val@(Bool _) = val
eval (List [Atom "quote", val]) = val
```
「@」を使っている箇所ははasパターンと呼ばれ、
@の前の変数には()の中全体が入ります。

evalを適用できるようにするために、
readExprの戻り値の型をStringからLispValに変更します。

```hs
readExpr :: String -> LispVal
readExpr input = case parse parseExpr "lisp" input of
    Left err -> String $ "No match: " ++ show err
    Right val -> val
```

この関数で変換されたLispValをevalに渡します。

この操作はmain関数で行います。

```hs
main :: IO ()
main = getArgs >>= print . eval . readExpr . head
```
「>>=」はバインドと呼ばれるものですが、少々表記がわかりにくいので
別の形式で書き直すと

```hs
main :: IO ()
main = do
  x <- getArgs
  (print . eval . readExpr . head) x
```

となります。

getArgsから取得したxはStringではなく[String]なので、
リストの先頭を取得するためheadを適用します。

次にその文字列にreadExprを適用してLispValを得ます。

更にそのLispValにevalを適用して評価結果のLispValを得ます。

これにprint関数を適用すると先ほど作成したshowVal関数が呼ばれて
文字列が出力されます。
PHP で syntax error, unexpected &#039;=&gt;&#039; (T_DOUBLE_ARROW) と言われました。

PHPの謎のエラーでわからんマン(☝ ՞ਊ ՞)

```php:syntaxエラー
syntax error, unexpected &#039;=&gt;&#039; (T_DOUBLE_ARROW) 
```
この**T_DOUBLE_ARROW**とはなんだろうとおもったのですが、`=>`この記号のことらしく、エラーを調べるならこの矢印周辺の構文が怪しいということみたいです。

ちなみにコマンドラインで**T_DOUBLE_ARROW**のエラーを出すこともできるらしいです。

```bash:コマンドラインでT_DOUBLE_ARROWエラー
php -r "=>"

PHP Parse error:  syntax error, unexpected '=>' (T_DOUBLE_ARROW) in Command line code on line 1
```
T_DOUBLE_ARROWのエラーを出すことができました。

# 参考
http://www.msng.info/archives/2011/12/php-operator-names.php
heroku domains:add すると please enter a credit card と言われます。

herokuにpugiemonn.comというドメインを登録しようとしたら、failedになってクレジットカードを登録するように言われました。

```
heroku domains:add pugiemonn.com --app pugiemonn-production
Adding pugiemonn.com to pugiemonn-production... failed
 !    Please verify your account in order to add domains (please enter a credit card)
 !    For more information, see https://devcenter.heroku.com/categories/billing
 !    Verify now at https://heroku.com/verify
```
あれ？どういうこと:(；ﾞﾟ'ωﾟ'):クレジットカードを入れろとあります。

https://dashboard.heroku.com/account/billing にアクセスしてクレジットカードを登録します。
住所等は入れなくてもカード情報と国情報をいれたら大丈夫でした。

再度、`heroku domains:add`を実行します。

```
heroku domains:add pugiemonn.com --app pugiemonn-production
Adding pugiemonn.com to pugiemonn-production... done
```
今度は成功したみたいです。

# 参考
https://devcenter.heroku.com/categories/billing
CircleCIでJUnitの結果を見る

CircleCIでJUnitのテストを実施する場合、以下の２通りの方法で結果を参照することができるようです。

##方法1. artifactに結果のhtmlファイルを保存する
JUnitのテスト結果は通常 `app/build/reports/tests` 配下に出力されます。こいつをartifact配下に保存してやることで、CircleCIのConsole上で確認ができます。
artifactsとして保存するには以下をcircle.ymlに記載してあげます。

```yaml:circle.yml
general:
  artifacts:
    - "app/build/reports/tests"
```

###実行結果
CircleCIのartifact配下にファイルが保存されていることが確認できます。
![スクリーンショット 2015-07-03 23.06.25.png](https://qiita-image-store.s3.amazonaws.com/0/39433/ba2bf883-3b0d-ef58-48a7-77f6a5d16a7f.png)

index.htmlを開くと、結果が参照できます。

![スクリーンショット 2015-07-03 23.07.44.png](https://qiita-image-store.s3.amazonaws.com/0/39433/aa51172d-76c1-e1b3-413e-f9dd9cfcfbc6.png)

##方法2. CircleCIのTest Failureレポートに表示する

CircleCIではJUnitの結果で生成されるxmlファイルを読み取って、レポートとして表示することができます。やり方としては、xmlファイルを$CIRCLE_TEST_REPORTS配下に移動すればOKです。
AndroidのGradleの場合は `build/test-results` 配下に存在するxmlファイルを$CIRCLE_TEST_REPORTS配下にコピーします。circle.ymlは以下のようになります。

```yaml:circle.yml
test:
  post:
      - mkdir -p $CIRCLE_TEST_REPORTS/junit/
      - find . -type f -regex ".*/test-results/*/.*xml" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \;

```

###実行結果
以下のようにTest Failureにて結果が確認できることがわかります。

![スクリーンショット 2015-07-03 23.08.07.png](https://qiita-image-store.s3.amazonaws.com/0/39433/d96c308d-c9ba-92d0-62ad-3405d9579896.png)


個人的には、方法2の方がすぐに結果を確認できるので、よいのかなと思います。
なお、Mavenのsurefireプラグインを利用している場合はDocsに記載の[こちらの手順](https://circleci.com/docs/test-metadata#java-junit-results-with-maven-surefire-plugin)でできるそうです。
Realmのスキームバージョンをビルド番号に合わせる


Realmでマイグレーション処理をしないと例外が発生します。
例えば、RLMObjectのサブクラスとして作ったモデルクラスのプロパティを増やしたりすると発生します。
マイグレーションでは、Realmのスキームバージョンを更新することで行うのですがこれがついつい忘れがちです。
リリース時はマイグレーションを厳密に行いますが開発中ではプロパティの変更が頻繁に起きたりします。
一人で開発している場合はrealmのファイルごと消してしまっても良いのですが、TestFlightなどで配布している場合等なるべく現状維持したい場合もあるかと思います。
自動的にマイグレーションさせるのが正しいかというと、不具合の温厚にしかならなかったりするのですが上記の更新忘れ等が防げたり一長一短なのでこんな方法もあるよ程度のエントリです。（すいません）


まずはビルドスクリプトでビルド番号を更新します。

```coffeescript
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
```

AppDelegate.mで起動時にビルド番号をスキームバージョンとして利用します。

```objc
- (void)drasticMigration{
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    NSLog(@"Migration done. (%d)",build.intValue);
    [RLMRealm setSchemaVersion:build.integerValue
                forRealmAtPath:[RLMRealm defaultRealmPath]
            withMigrationBlock:nil];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self drasticMigration];
    return YES;
}
```

以上です。
realm内の情報をmigrationで色々する際は不便になってしまうので注意です
僕のPyCharmではない　これは僕達のPyCharm(Community Edition)をインストールした。

稀にIDEに憧れる時期があって今日がその日だった。

#macでpycharm(Community Edition)+kivy環境の準備

##インストールとか
pycharm(Community Edition)をインストール。
起動したら「JVMが無いのでイカから入れてくれ」と言われるままにリンクをクリックして、Java for OS X 2014-001というのをダウンロードする。それをインストールしたらpycharmが使える。


##kivy
kivyはインストール済みとする。
pycharmのRUNでkivyが呼ばれるようにするのは、
https://github.com/kivy/kivy/wiki/Setting-Up-Kivy-with-various-popular-IDE's#setting-up-kivy-190-with-pycharm-45-eap-on-os-x-10103
を見て設定。

* In the Select Python Interpreter window, delete the path of the currently selected python interpreter (in my case, this was /usr/bin/python) and navigate to (or copy that path into the address bar):

```/Applications/Kivy.app/Contents/Resources/python
```


のところがちょっと悩んだけど、ギアのアイコンじゃなくてセレクトボタンになってる部分からアドレスバーのあるウィンドウに行けた。


##確認
新規プロジェクト作って、interpreterをkivyのにする。
サンプルファイルを作成して実行。


```
from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()
```
ウィンドウ出たので良しとする。

## 今の問題点

* pycharm起動するとファン全開になってうるさい。
* 自分レベルだとsublime+ターミナルでいいかも。
Octave でソフトマージン SVM を計算してみる

# 目的
Octave でちゃちゃっと SVM を試してみます．


## データの準備
関数と分類するためのデータをちゃちゃっと用意します．A と B はそれぞれ適当な位置を中心にして適当な幅を持った分布からサンプリングします．`rot()` は分布を回転させるための行列です．特徴量は `X` で分類のためのラベルは `Y` です．

```octave
# 回転行列
rot = @(t) [cos(t) -sin(t); sin(t) cos(t)];

# 適当にデータを用意します
A = bsxfun(@plus, ...
     randn(300,2)*eye(5*rand(1,2))*rot(pi*rand()), 10*rand(2,1));
B = bsxfun(@plus, ...
     randn(300,2)*eye(5*rand(1,2))*rot(pi*rand()), 10*rand(2,1));

# SVM 計算用にデータを整理します
X = [[A;B], ones(600,1)];
Y = [ones(300,1); -ones(300,1)];
```

##最適化
SVM によって xy 平面にデータを 2 分するための直線を引きます．

```math
w_1x + w_2y + w_3 = 0
```

ベクトル __w__ を求めます．ソフトマージン SVM では以下の式を __w__ について最小化することで分類するためのパラメタ __w__ を求めることができます．

```math
\mathcal{L}({\bf w}) = \sum_n \max
\bigl(
1 - Y_n \left({\bf X}_n \cdot {\bf w} \right) 
\bigr)
+ C ||{\bf w}||_{2}
```

Octave の表式に合わせて目的関数 _L_ を定義します． C は正則化項の係数です．

```octave
L = @(w,C) sum(max(1.0-Y.*(X*w(:)),0)) + C*sumsq(w);
```

_L_ の最小値を求めるために `sqp` を利用します． 関数を線形近似して iterative に二次計画法を解くことによって，非線形関数の最小値を求めているようです．初期値は適当に入れます．

```octave
# 正則化項の係数を C = 0.01 にした無名関数を引数に渡します
w = sqp([-1;1;1], @(w) L(w,1e-2))

# とあるデータに対する結果
# w =
# 
#   -0.82591
#    0.97024
#    0.82691
#
```

せっかくなので可視化してみます．

```octave
# 可視化のために dirty な関数を用意
Lplot = @(x,y) log10((reshape(cellfun(@(w) L(w,1e-5), ...
          mat2cell([x(:),y(:),zeros(size(x(:)))], ...
          ones(numel(x),1),3)),size(x,1),size(x,2))));

# プロットしてみる
subplot(1,2,2);
  # w(3) = 0 平面での目的関数の値をカラーマップで表示
  ezsurf(Lp,[-8,2,-4,6],64); view(2);
  title("Objective Function (at w(3)=0)");
  xlabel("w(1)"); ylabel("w(2)");
subplot(1,2,1);
  # A, B と分離平面(直線)を表示
  plot(A(:,1),A(:,2),'1o', B(:,1), B(:,2),'3p');
  hold('on');
  ezplot(@(x,y) w(1)*x+w(2)*y+w(3),[-8,14,-8,15]);
  hold('off');
```

![Screenshot from 2015-07-02 13:48:40.png](https://qiita-image-store.s3.amazonaws.com/0/46396/b6f152c9-ea0d-f594-2f25-4720b2d021b5.png)

それっぽいところに直線が引けました．最適化の初期値やグラフの軸は適当に調整してください．
Gulp + Babel + Webpack を試してみた

[NodeSchool International Day in Tokyo](http://nodejs.connpass.com/event/14741/)に参加してBabelのチュートリアルを触ってきたので引き続きいろいろ触ったものをメモとして残しておきます。下のような画面で何かのサンプルコードを写経したやつを題材に、アプリのJSはBabelで書きつつWebpackで依存関係を解決してGulpでタスクを回すという感じで書き直してます。

![キャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/25841/ebb99e98-b9d5-66b3-ca6d-9eac94631915.png)

リポジトリはこちら https://github.com/rei-m/js_neta/tree/master/observer_pattern

### 使ったパッケージたち

```
    "babel-core": "^5.5.8",
    "babel-loader": "^5.1.4",
    "gulp": "^3.9.0",
    "gulp-babel": "^5.1.0",
    "gulp-concat": "^2.5.2",
    "gulp-if": "^1.2.5",
    "gulp-notify": "^2.2.0",
    "gulp-plumber": "^1.0.1",
    "gulp-uglify": "^1.2.0",
    "gulp-webpack": "^1.5.0",
    "node-libs-browser": "^0.5.2",
    "require-dir": "^0.3.0",
    "webpack": "^1.9.10"
```

### gulpfile.js
- gulp/tasks配下のファイルをすべて読み込んでGulpのタスクとして登録する

```
var requireDir = require('require-dir');

requireDir('./gulp/tasks', { recurse: true });
```

### gulp/configs/index.js
- gulp タスクの設定を書く。

```

var taskName = "index";
var fileName = taskName + ".js"

var dest = "./js/build"; // 出力先ディレクトリ
var src = "./js/src/index";  // ソースディレクトリ

var webpack = require("webpack");

module.exports = {

  // タスク名
  taskName : taskName,

  // リソース
  src : src + "/**/*.js",

  // jsのビルド設定
  js: {
    dest: dest,
    uglify: false
  },

  // webpackの設定
  webpack: {
    entry: src + "/" + fileName,
    output: {
      filename: fileName
    },
    resolve: {
      extensions: ["", ".js"],
      modulesDirectories: ["node_modules", "bower_components"],
      alias: {
      }
    },
    plugins: [
      new webpack.ResolverPlugin(
          new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"])
      ),
      new webpack.optimize.DedupePlugin(),  // ライブラリ間で依存しているモジュールが重複している場合、二重に読み込まないようにする
      new webpack.optimize.AggressiveMergingPlugin(),　//ファイルを細かく分析し、まとめられるところはできるだけまとめてコードを圧縮する
      new webpack.ProvidePlugin({
          jQuery: "jquery",
          $: "jquery",
          jquery: "jquery"
      })
    ],
    module: {
      // babel Loaderを指定してWebpackがBabelのコンパイルをできるように
      loaders: [
        {
          test: /\.js$/,
          exclude: /node_modules/,
          loader: "babel-loader"
        }
      ]
    }
  }
}

```

### gulp/tasks/index.js
- 対応するconfigに従いGulpタスクを登録.


```
var gulp = require("gulp"),
    gulpif = require("gulp-if"),
    uglify = require("gulp-uglify"),
    webpack = require("gulp-webpack"),
    config = require("../configs/index");

gulp.task("index", function () {
    gulp.src(config.src)
        .pipe(webpack(config.webpack))
        .pipe(gulpif(config.js.uglify, uglify()))
        .pipe(gulp.dest(config.js.dest)); 
});

```

はやく普通にES6で書ける時代が来てほしいですね～
サーバにsshするときにパスワードをコマンドのオプションで渡したい



# 概要
## これはなに？
- sshpass
- sshでインタラクティブに入力する項目を引数でわたせる
- 

## 目標
- bison-3.0.4 の実行ファイルが使用可能になる

## 実行環境
- CentOS-7.0
- [ソースコードビルドするための環境](http://qiita.com/boscoworks/items/0d442d446436f7d72183)

## 依存パッケージ
- なし

# 導入手順
## epelリポジトリ追加
```
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

## yum でインストールする
```
sudo yum install sshpass
```

## 使ってみる
```
sshpass -p '(パスワード)' ssh -l boscoworks 192.168.56.101
```

## 感想

- 日常的にこれを使うのは良くないなぁ。bash_historyにパスワードが平文で残ってしまう
- 鍵とかパスワードとかが設定できないサーバに対してスクリプトで処理を行うときに最終手段として使う感じ
Vimの起動時に行番号を表示する設定を.vimrcに書きました。

設定します。

```bash:.vimrcにnuを追加
vim ~/.vimrc

set nu
```
`set nu`を書いておけば行番号を標示してくれます。

すぐ反映したいのでsourceコマンドで読み込みます。

```bash:.vimrcの即反映
source ~/.vimrc
```
あとはvimでファイルを開くと行が表示されます。
bibcleanでbibファイルを整形【Vim】

- [bibclean](http://ftp.math.utah.edu/pub//bibclean/)

これ地味ですが、とっても便利です。動作条件はunixとあるので、おそらくMacでも動くでしょう。 [BibTeX関連ツール - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?BibTeX%E9%96%A2%E9%80%A3%E3%83%84%E3%83%BC%E3%83%AB)にはその他にも役に立ちそうなアプリケーションやスクリプトが紹介されているので、ぜひ参考にしてみてください。ちなみに自分は、ここで紹介されている[bibtex2html](https://www.lri.fr/~filliatr/bibtex2html/)とvim-quickrunを使って、bibファイルを保存するたびにhtmlファイルを作成するように指定しています。pdfのリンクを貼ればブラウザ上で全部見れるようになるので、よい。 スクリプトは上記のリンクからダウンロードしてきて解凍すれば使えると思います。aptパッケージが用意されているので、

```
sudo apt-get install bibclean
```

でインストールができます。

コマンドラインから実行すると、標準入力(またはファイル入力)に対して標準出力で返すといういかにもunixらしいプログラムなので、`aaa20150001.bib`と`aaa20150002.bib`というbibファイルをどこからかダウンロードしてきた時に、全部をまとめておくファイル`reference.bib`にこれらを追記したい時は、

```
bibclean aaa20150001.bib aaa20150002.bib >> reference.bib
```

とすれば良いです。また、bibが受け取れなさそうなオプションはエラーとして吐いてくれるので、チェックにも役立ちます。

これを、Vimの成形コマンド`gq`(詳しくは ":h gq", ":h formatprg", ":h formatexpr")を押した時に呼ばれるようにするには、以下のようにします。

```vim:~/.vimrc
augroup filetype
  autocmd!
  " bib file
  autocmd BufRead,BufNewFile *.bib set filetype=bib
  autocmd Filetype bib let &formatprg="bibclean"
augroup END
```

これで、編集中のbibファイルで範囲を指定して`gq`を押せば、ちょうどその部分だけコマンドラインを通した時のようにうまく整形してくれます。見やすくなるというただそれだけでなく、いろいろなところからとってきたbibの形式を揃えることができるので便利だと思います。
NodeでInfratasterっぽいことができるTasteSpoonというNPMモジュールを作った

[TasteSpoon](https://github.com/MisumiRize/tastespoon)

# 動機

Infratasterは素晴らしいGemで、インフラの振る舞いをコードで表現できることはこの上なくありがたい。ただ、使っていると不便に感じるところもいくつかある。

* RSpecにロックインされる
* RSpecの大量に存在するマッチャAPIで消耗する
* RSpec2からRSpec3で構文が変わって非本質的な部分で消耗する
* RSpec上で併用することの多いServerspecとコンテクストが混ざる
* RSpecでは待ち合わせの概念が入ると途端にコードがダサくなる

最後の「待ち合わせ」だけ補足すると、これはWebSocketなどの通信が確立することを確かめたい場合が例としてあげられる。[infrataster-plugin-socket.io](https://github.com/MisumiRize/infrataster-plugin-socket.io)を作った際、通信が確立できることを確かめるのに、[こういうダサいコード](https://github.com/MisumiRize/infrataster-plugin-socket.io/blob/master/spec/socket.io_spec.rb)を書くことになった。

タイムアウトの概念が存在して、マッチャAPIがシンプルで、それでいて`describe`, `context`, `it`の表現力を備えている代替品が欲しいと思ったら、身近にあるではないか。mocha, power-assertと組み合わせて同じようなことができればよいのではと考えた。

ので作った。

# TasteSpoonの使い方

## インストール

[TasteSpoon](https://github.com/MisumiRize/tastespoon)はすでにNPMにて公開されているので、`npm install`コマンドから直接インストールできる。テスト実行のために必要なmocha, power-assert, さらにES2015で書くのでespower-babelを一緒にインストールする。

```bash
$ npm install tastespoon mocha power-assert espower-babel --save-dev
```

mocha, power-assertを使うのが嫌でも、Jasmineやchaiなど他のNodeベースのテストツールと組み合わせられるはずなので、ベストと思う組み合わせで使ってほしい。

## 使い方

ここからは、[Infratasterでリバースプロキシのテストをする - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2014/11/19/151557)あたりに目を通していて、Infratasterで何ができるかを把握していること前提で書く。

まずはテスト対象となるサーバを用意しよう。今回はTasteSpoonに最初から備わっているHTTPのテストを考える。とりあえず`TasteSpoon.http`の動作を見るということで、ローカルにサーバを立ち上げてそこに接続するテストを書いてみよう。

```bash
$ python -m SimpleHTTPServer 8080
```

```js
import TasteSpoon from "tastespoon"
import assert from "power-assert"

TasteSpoon.define("http", "127.0.0.1")

let server = TasteSpoon.server("http")
describe(server, () => {
  let http = TasteSpoon.http("http://example.com:8080")
  describe(http, () => {
    it("returns 200", () => {
      return http(server).result().then((response) => {
        assert(response.statusCode == 200)
      })
    })
  })
})
```

```bash
$ ./node_modules/.bin/mocha --compilers js:espower-babel/guess http_test.js
```

example.comへのリクエストはTasteSpoonの内部で`http`サーバとして定義された`127.0.0.1`へと差し向けられるので、心配は無用である。また、HTTPリクエストの結果はPromiseとして返されるので、`.catch()`されることが想定されるというテストも書くことができる。

慣れたらDockerを立ち上げて、コンテナ内でNginxを動かしてテストするのも試してみてほしい。

## mocha統合モード

どうだろう、元になったInfratasterに構文が近いと感じるだろうか。それとも全く似ていないと感じるだろうか。構文をもう少しだけInfratasterに似せられるような、mocha統合モードも用意した。

```js
import TasteSpoon from "tastespoon"
import assert from "power-assert"

TasteSpoon.define("http", "127.0.0.1")

describe(server("http"), () => {
  describe(http("http://example.com:8080"), () => {
    it("returns 200", () => {
      return this.result().then((response) => {
        assert(response.statusCode == 200)
      })
    })
  })
})
```

```bash
$ ./node_modules/.bin/mocha --compilers js:espower-babel/guess --ui tastespoon/mocha http_test.js
```

これでいくらか見た目は近くなったが、突如`this`が出現するので、JavaScriptの特殊な`this`をOO式の`this`に変えてしまうAltJSとは相性が悪いので要注意。

# 次回予告

第一歩の解説は終了したので以下の内容を予定している。

* 待ち合わせのテストでコードがダサくなるという問題が、TasteSpoonとmochaでどう解決されるか
* TasteSpoonプラグインの作り方
.vimrc をメモっとく

普段は Windows なので vim は滅多に使わないけど，たまに端末から他所様の Linux に入ると素のままの vim だったりするので結構泣けてくる。

そんで `.vimrc` どう書けばいいんだっけと毎回悩むので，今回はここに貼り付けておく。ちなみに私は vim はほとんど弄らない。 vim を使うときは大抵客先の環境だったりするので派手に弄れないのだ。

```vim:.vimrc
set nocompatible
set tags=~/.tags

" display
" ----------------------
set number
"set ruler
"set cmdheight=2
"set laststatus=2
"set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P
set title
set linespace=0
set wildmenu
set showcmd
"set textwidth=78
"set columns=100
"set lines=150

" syntax color
" ---------------------
syntax on
"colorscheme ron
highlight LineNr ctermfg=darkgrey

" edit
" ---------------------
set autoindent
set cindent
set showmatch
set backspace=indent,eol,start
set clipboard=unnamed
set pastetoggle=<F12>
set guioptions+=a

" tab
" --------------------
set tabstop=4
set expandtab
set smarttab
set shiftwidth=4
set shiftround
set nowrap
```
色々残骸が残ってて何が何やらだが，まぁいいか。
git stashよりgit branch

Gitツリー内での作業中に、別な作業が必要になってstash、ということは経験があるかもしれません。このstashがどういう動作をしているかを知ると、別の操作にしたほうがいいと思えるかもしれません。

# git stashの内容
詳しい使い方は[他記事](http://qiita.com/fukajun/items/41288806e4733cb9c342)に譲りますが、3行でまとめると、

* `git stash (save)`で、作業領域の変更が保存される
* `git stash list`で、今までに行ったstashを一覧できる
* `git stash pop`で復元できる

# stashの欠点
あくまで簡便なものということもあって、`git stash list`から見られるリストではどういう変更があったのかわかりづらくなっています。

# 一時保存用のブランチ
Gitの場合、実はブランチを切るといっても、内部的には**先頭のコミットを指す1ファイル（40バイト）を作成する**だけなので、ほとんど負荷はかかりません。本当に「とりあえず、片付ける」程度でないものについては、ブランチを切ったほうがあとあと探すときも便利ですし、管理もしやすいです。

## 一時保存
一時保存の場合、

1. 保存用のブランチを切って、そちらに切り替える
2. 変更したファイルをコミットする
3. 素のブランチに戻す

というような手順で行えます。多少工数は多いですが、ブランチとして編集分が明確に残るようになります。

## 復元
一時ブランチに保存したものを復元する場合も、

1. 保存ブランチに切り替える
2. 復元したい場所へ`git rebase`する
3. 元のブランチに戻す
4. 元のブランチから保存ブランチをマージする
5. （保存ブランチを削除）

というようにできます。実は、stashの中身も名前のないブランチに対してこのような操作をやっているのと同様のものとなっています。

#まとめ
stashは「隠す」という意味です。隠さないといけないほど混沌としたものならともかく、そうでないものならブランチで管理したほうが便利です。
Swiftでのオブジェクト指向サンプル


`Swift`でのクラス構成の個人的な覚え書きです。
参考までに。

```Child.swift
//子供
class Child{
    let name:String
    var score:Int = 0
    
    init(name:String){
        self.name = name
    }
    
    func takeTest(score:Int)
    {
        self.score = score
    }
    
    func whatScore()
    {
        println("俺はテストで\(score)点を取ったどー。")
    }
}
```

```Mother.swift
//母親
class Mother{
    let name:String
    
    init(name:String){
        self.name = name
    }
    func askScore(son:Child)
    {
        if(100 == son.score)
        {
            println("素晴らしい。")
        }
        else if((100 > son.score) && (son.score >= 80))
        {
            println("いまひとつだなぁ。がんばって。\(son.name)")
        }
        else if((80 > son.score) && (son.score >= 20))
        {
            println("おバカなんだから!!!")
        }
        else
        {
            println("3日間は飯抜きよ〜。")
        }
    }
}
```

```Main.swift
//インスタンス化
var mom:Mother = Mother(name: "みさえ")
var child:Child = Child(name: "しんのすけ")
var math:Int = 90

//テストを受ける
child.takeTest(math)
child.whatScore()    // => "俺はテストで90点を取ったどー。"

//結果を聞く
mom.askScore(child) // => "いまひとつだなぁ。がんばって。しんのすけ"
```
コンピュータ言語を遅く使ってしまう方法

どの言語でも遅く使ってしまう方法はあるものです。
その遅く使ってしまう方法を使ってしまっているのに、
「○○という言語、ライブラリは遅いね。」などと言ってしまうことがありがちです。
そこで初心者がしがちなことを述べます。

・リストの項目を追加するために、＋演算子でリストに連結した結果をリストを代入してしまう。

```ex.py
a = []
for i in range(1000):
    a = a + [i]
```

・リストにリストを追記する効果的なメソッドが用意されているのにもかかわらず
　個々の要素をappendすることを繰り返してしまう。
　（pythonの場合にはextendメソッドがあります。）


・目的に応じたデータ構造の適切な使い分けをできていない場合
　辞書や集合で十分な処理にリストを用いてしまう。
　
 　リストの中に値が含まれているかを確かめるのはO(N)
 　if x in listData:
　辞書のキーに含まれいているかどうかはO(1)
　if dictData.has_key(x):
　集合setに含まれているかどうかはO(1)
　if x in setData:

・標準のライブラリに入っている機能を使えば効果的に実行できることを気づかずに
　自作のライブラリで遅い実装を作ってしまう。

　集合というデータ形式が用意されているライブラリでは、集合の合併や共通部分、差分を求める
　メソッドが用意されています。
  Pythonのset型の場合
  s.union(t)
  s.intersection(t)
  s.difference(t)


　それらを用いると、大概の場合、自作ライブラリよりも高速に動作する簡潔なプログラムになりま
す。


・不必要なオブジェクトのコピーを作ってしまう。
例：部分配列が簡潔に記述できてコピーを生成することなしに引数に渡せる言語・ライブラリである
のにもかかわらず、コピーを作って渡してしまう。
　C++でOpenCVのcv::Mat型は、部分画像を関数の引数に渡すことができます。
  PythonのNumpyのarray型も、部分配列を関数の引数に渡すことができます。
　

例：C++では参照渡しができるのに値渡しをしてしまい、
　不必要なオブジェクトのコピーを作ってしまう。
  （不十分なテキスト・カリキュラムではC++で、値渡しとポインタ渡しだけ教えて十分としてしまっている。）

・行列計算を効果的に行うようにライブラリが作られているのにもかかわらず
そのようなライブラリで行列演算をfor文のループで処理してしまう。
（MATLABやpythonのnumpyなど）



```ex2.py
# -*- coding: utf-8 -*-
def func1():
    b=['d', 'e', 'f', 'g', 'h', 'i', 'j',  'k', 'l',  'm', 'n', 'o', 'p', 'q', 'r', 's']
    for i in range(10000):
        a=['a', 'b', 'c']
        
        for x in b:
            a= a+[x]
        
#        print a
def func2():
    b=['d', 'e', 'f', 'g', 'h', 'i', 'j',  'k', 'l',  'm', 'n', 'o', 'p', 'q', 'r', 's']
    for i in range(10000):
        a=['a', 'b', 'c']
        
        for x in b:
            a.append(x)
        
#        print a
def func3():
    b=['d', 'e', 'f', 'g', 'h', 'i', 'j',  'k', 'l',  'm', 'n', 'o', 'p', 'q', 'r', 's']
    for i in range(10000):
        a=['a', 'b', 'c']
        a = a+b
        
#        print a
def func4():
    b=['d', 'e', 'f', 'g', 'h', 'i', 'j',  'k', 'l',  'm', 'n', 'o', 'p', 'q', 'r', 's']
    for i in range(10000):
        a=['a', 'b', 'c']
        
        a.extend(b)
        
 #       print a
        
if __name__=='__main__':
    func1()
    func2()
    func3()
    func4()

```

Pythonの場合、Spyder統合環境で[Run][Profile]を利用することで、スクリプトを書き換えることなしに、プロファイルをとることができます。

まとめ：
　リストにデータを追加するときにはappend、extendメソッドを使う。＋演算子を用いて代入を繰り返すことは得策ではない。
　リスト、辞書、集合などのデータ構造を使い分ける。
　標準的なライブラリにあるデータ構造のメソッドを使い、同等な機能を自作することのないようにする。
　データの不要なコピーを作らない。
　配列演算でforループなしで実行できることをforループを用いない。


追記：
これらの内容について、さらに知りたい方は、
[「ハイパフォーマンスPython」](https://www.oreilly.co.jp/books/9784873117409/)
を読むといいでしょう。
この記事を書いた時点では、この日本語訳書は出版されていませんでした。



参考情報
Python リスト追加についての速度比較（append,内包表記など）
http://nonbiri-tereka.hatenablog.com/entry/2014/10/20/110304
パーミッションの意味(rwxってなんだっけ)

# ファイル
- r: 読める
- w: 編集して上書き保存できる
- x: コマンドとして実行できる ex) /bin/ls

# ディレクトリ
- r: ファイル一覧が表示できる(lsが打てる)
- w: ファイル一覧を修正できる(rm, touch, mvとか)
- x: ディレクトリ内にcdできる。ディレクトリ内のfind, touch, rmはできない
GitHubから特定のディレクトリだけを直接ダウンロード

git及びGitHubのAPIに，一部のディレクトリだけをダウンロードするための機能はありません．
ので，GitHubのsvn用のサポートを使います．
``svn export``で指定したディレクトリがダウンロード出来ます．

```bash
$ svn export https://github.com/ユーザー名/リポジトリ名/trunk/ディレクトリ名1/ディレクトリ名2/...
```

e.x.
https://github.com/ros/rosdistro で``/doc``だけをダウンロードしたい場合：

```bash
svn export https://github.com/ros/rosdistro/trunk/doc  
```

### ブランチ名を指定する場合

```bash:
$ svn export https://github.com/ユーザー名/リポジトリ名/branches/ブランチ名/ディレクトリ名1/ディレクトリ名2
```

### svnで利用できるディレクトリを表示
``svn ls``を使う

```bash
$ svn ls https://github.com/ユーザー名/リポジトリ名/branches/
```

### ※雑記
ブランチ名を指定せずに``リポジトリ名/trunk/~``でダウンロードした時，ダウンロードされるブランチがどこで決まるのかよく分からないんですよねー・・・
自分で試した時は``/trunk``の方でダウンロードされるブランチは,
``/branches/ブランチ名``からはアクセスできないようでした．

### 参考
http://stackoverflow.com/questions/7106012/download-a-single-folder-or-directory-from-a-github-repo
https://coderwall.com/p/o2fasg/how-to-download-a-project-subdirectory-from-github
国産Webフォント「Ligature Symbols」をRailsで使う方法


いつもはみんな大好き[Font Awesome](http://fortawesome.github.io/Font-Awesome/)でアイコン周りを済ませてるんですが、いまやってる案件でLINEのアイコンが必要になったので[Ligature Symbols](http://kudakurage.com/ligature_symbols/)をRailsに組み込みました。
Ligature Symbolsに限らず、他のWebFontを組み込む場合でも同じ内容でいけるはずです。

## Ligature Symbolsを設置する
- [Ligature Symbols](http://kudakurage.com/ligature_symbols/)より、ファイル一式をダウンロード
- `vendor/assets`下に`fonts`ディレクトリを設置して、解凍したファイルからフォントファイルを格納

```vendor/assets
|-vendor/
|---assets/
|-----fonts/
|-------LigatureSymbols-2.11.eot
|-------LigatureSymbols-2.11.otf
|-------LigatureSymbols-2.11.svg
|-------LigatureSymbols-2.11.ttf
|-------LigatureSymbols-2.11.woff
```

- このあと、`config.assets.paths`の設定っていらないんですね。下記の記事が参考になりました。
	- [Rails 4 で assets に font を追加する方法](http://qiita.com/ma2ge/items/90a7d4511954b5fec2c7)

## Ligature Symbolsを読み込む
- [Ligature Symbols](http://kudakurage.com/ligature_symbols/)にCSSの書き方書いてある
- `url`だけ、`asset-url`に置き換える

```css:app/assets/user.css.scss
@font-face {
    font-family: 'LigatureSymbols';
    src: asset-url('LigatureSymbols-2.11.eot');
    src: asset-url('LigatureSymbols-2.11.eot?#iefix') format('embedded-opentype'),
         asset-url('LigatureSymbols-2.11.woff') format('woff'),
         asset-url('LigatureSymbols-2.11.ttf') format('truetype'),
         asset-url('LigatureSymbols-2.11.svg#LigatureSymbols') format('svg');
    font-weight: normal;
    font-style: normal;
}

（省略）
```

## Viewで表示
- 後は公式ドキュメント通りです。

```app/views/users/index.html.erb
<span class="lsf-icon" title="line">Line</span>
```
mode-lineの一部に色などを付ける方法

mode-lineのバッファ名などに`mode-line`フェイスの指定とは別の色を付けたいと思い、[マニュアル](https://www.gnu.org/software/emacs/manual/html_mono/elisp.html#Properties-in-Mode)を見てもなんだかよくわからなくて試行錯誤したら出来たのでメモ。例としてバッファ名について。

```.el
(setq-default mode-line-buffer-identification
      `(,(propertize "%b" 'face '(:foreground "orange"))))
```

世の中の潮流は[powerline.el](http://blog.shibayu36.org/entry/2014/04/01/094543)を使うようですが、そんな大げさにしなくてもと思ったのでこれで。
scalaz - Actor

scalaz(7.1.3)のActorを試してみた。

[ソースコードはこちら](https://github.com/scalaz/scalaz/blob/series/7.1.x/concurrent/src/main/scala/scalaz/concurrent/Actor.scala)。100行ない。

[テストコードはこちら](https://github.com/scalaz/scalaz/blob/series/7.1.x/tests/src/test/scala/scalaz/concurrent/ActorTest.scala)。

### 使い方

```scala
scala> val a1 = Actor[Int] { x => println(x + 1) }
scala> a1 ! 1
2
```

### 一つずつ処理

アクターなので並列で実行しても大丈夫。

まず普通なら並列に書き込むとダメだが、

```scala
scala> var n = 1
scala> (1 to 1000).par.foreach { _ => n += 1 }
scala> n
// res17: Int = 974
```

一つずつ実行されるのでちゃんと書き込まれる。

```scala
scala> var n = 0
scala> var a2 = Actor[Unit] { _ => n += 1 }
scala> (1 to 1000).par.foreach { _ => a2 ! Unit }
scala> n
// res26: Int = 1000
```

### 処理をつなげる

```scala
scala> val a3 = Actor[String](println) contramap[Int] { "x is " + _ } contramap[Int] { _ + 1 }
scala> a3 ! 1
// x is 2
```

### エラーハンドリング

コンストラクタの第二引数でonErrorが指定出来る。

```scala
scala> val a = Actor[Int]({ x => ??? }, { e => println(s"ERR is ($e)") })
scala> a ! 1
// ERR is (scala.NotImplementedError: an implementation is missing)
```

本当に最低限の機能しかないので、本格的にActor使うならAkka。

再帰的なNodeを使って1つずつスレッドセーフに実行できるようになっていて、コード読むと勉強になる。
BNFでNAOの自由な聞き取りができるようにする。

#前書き
先日、アトリエにてQiitaのWriterが集まる懇親会がありました。
その際に、PepperはBNFを読み込ませて聞き取りをさせると、読み込みに10秒ほどかかるものが、すぐ読み込み終わるとの話を聞きました。
QiitaにはBNFの記事は今日現在で1件しかなかったので、BNFの勉強も兼ねて記事にしようと思います。

#BNFとは？
>バッカス・ナウア記法（英: Backus-Naur form）とは、文脈自由文法を定義するのに用いられるメタ言語のことで、一般にBNFやBN記法と略される。現在はこのBNFを拡張したEBNF (Extended BNF) が一般的に使われている。EBNFでは正規表現を用いてより簡単に記述でき、プロトコル規定言語であるASN.1や、XMLの構文定義にも利用されている。
>Wikipediaより
>https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AB%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%82%A2%E8%A8%98%E6%B3%95

詳しくはわからないけど、なんかコンパクトに書けるみたい！！

#PepperとBNF
>Pepperに大量の言葉を認識させる方法
>http://oyoyo-project.com/blog/?p=282

SpeechReco方式（コンマ区切り方式）で記述した場合はすごく長くなるけど、BNFファイルで記述するとグルーピングして書ける。

#構文
基本的にウィキペディアからの引用です。
##基本

BNF の表記は次のような導出規則の集合である。

\<hoge> は \<hogehoge> である。

```BNF
<hoge> ::= <hogehoge>
```


\<hoge> は \<abc> または \<def> である。

```BNF
<hoge> ::= <abc> | <def>
```

\<hoge> は \<abc>\<def> である。
```BNF
<hoge> ::= <abc><def>
```



##例文を読んでみる

>Pepperに大量の言葉を認識させる方法
>http://oyoyo-project.com/blog/?p=282

上記にも貼りましたがOYOYO-PROJECTさんの投稿記事の例題を参考にさせてもらいたいと思います。

```BNF
#BNF+EMV1.1;
!grammar "BNFJapanese";
!start <start>;
!activatable<custom_bnf trig>;
<start>:<custom_bnf trig>;
<custom_bnf trig>:<sts4>|<sts2>|<sts3>;
<sts1>:((にほんむかしばなし)|(やまだくんとしちにんのまじょ)|(ろぐほらいずん)|(にせこい)|(ぎんたま)|);
<sts2>:<sts1>((はきょうそうほう)|(ってきょうそうほう)|(ってほうそうちゅう)|(はほうそうちゅう)|(やってるの));
<sts3>:((じかいの)|(らいしゅうの)|(つぎの))<sts1>;
<sts4>:((いまはなになってる)|(いまやってるあにめは)|(きょうのあにめは));
```

>!grammar "BNFJapanese";

文法、記述言語の定義をしているのでしょう。"BNFJapanese"という言語で書くということ。

>!start \<start>;

スタートは<start>タグで始まるようです。

>!activatable \<custom_bnf trig>;

custom_bnfをトリガーとして起動するようです。
custom_bnfはpythonボックスで利用します。

```python
#LCFファイルの呼び出し
self.asr.addContext("LCFファイル入力パス", "custom_bnf")
```

>\<start>:\<custom_bnf trig>;

\<start>を\<custom_bnf trig>に置き換えます。

>\<custom_bnf trig>:\<sts4>|\<sts2>|\<sts3>;

\<custom_bnf trig>を\<sts4>または\<sts2>または\<sts3>で置き換えます。

>\<sts1>:((にほんむかしばなし)|(やまだくんとしちにんのまじょ)|(ろぐほらいずん)|(にせこい)|(ぎんたま));

\<sts1>を(にほんむかしばなし)または(やまだくんとしちにんのまじょ)または(ろぐほらいずん)または(にせこい)または(ぎんたま)で置き換えます。

>\<sts2>:\<sts1>((はきょうそうほう)|(ってきょうそうほう)|(ってほうそうちゅう)|(はほうそうちゅう)|(やってるの));

\<sts2>を\<sts1>(はきょうそうほう)または(ってきょうそうほう)または(ってほうそうちゅう)または(はほうそうちゅう)または(やってるの)に置き換えます。
ex)\<sts2>を\<sts1>(はきょうそうほう)に置き換えます。

>\<sts3>:((じかいの)|(らいしゅうの)|(つぎの))\<sts1>;

\<sts3>を(じかいの)または(らいしゅうの)または(つぎの)\<sts1>に置き換えます。



>\<sts4>:((いまはなになってる)|(いまやってるあにめは)|(きょうのあにめは));

\<sts4>を(いまはなになってる)または(いまやってるあにめは)または(きょうのあにめは)に置き換えます。

###HELP！！！
文頭にある

>\#BNF+EMV1.1;

とは、どのような意味なのでしょうか？
BNFはBNF記法を示しているとして、EMV1.1はどのような意味なのでしょうか？

また、この記述方法だと#以降はコメントアウトになるのか、またはヘッダのようにコンパイラに読み込まれるところになるのでしょうか？

わかる方いたらご教授お願いします。
ぐぐってもさっぱり見つかりませんでした。(英語が読めなかっただけかもしれませんが。)

#使い方
pythonボックスで以下の記述をします。

```python
#BNFファイルをLCFファイルにコンパイル
self.asr = ALProxy("ALSpeechRecognition")
self.asr.compile("BNFファイルの入力パス", "LCFファイルの出力パス", "Japanese")
#LCFファイルの呼び出し
self.asr.addContext("LCFファイル入力パス", "custom_bnf")
```

詳しくは以下の参考URLを確認して下さい。

>ALSpeechRecognition: new methods and event
>http://doc.aldebaran.com/2-1/news/2.0/naoqi_api_rn2.0.html?highlight=bnf#alspeechrecognition-new-methods-and-event


#感想
実機テストを行っていないのでNAOでも正しく動くかはわかりませんが、近いうちに検証したいです。
masterを破棄してdevelopと同じ状態にする


git-flowで開発中にmasterに直でコミットしてしまい、
リリースブランチがマージが出来ない事態が起こりました。
その際に、masterを破棄してdevelopと同じ状態にしました。

## 対処方法

1.ローカルのmasterを削除
2.developからmasterブランチを再生成
3.masterを強制push

~~~sh
$ git branch -D master
$ git checkout develop
$ git checkout -b master
$ git push -f origin HEAD:master
~~~
ArangoDBの基本用語

こんにちは。
[ArangoDB](https://www.arangodb.com/key-features/)の基本用語を他のdocument DBなどと比較してみました[^1]。

| RDB  | RethinkDB | MongoDB | ArangoDB |
|:--------|:---------|:---------|:---------|
| database  | database  |  database  | database  |
| table  | table  | collection  |  collection  |
| row (tuple, record)  |  document  |  document  |  document  |
| column (field, attribute)  | field |  field |  attribute  |
| primary key  |  ```id``` field |  ```_id``` field  | &bull; ```_key``` attribute[^2]<br/> &bull; ```_id = collectionName + "/" + _key``` |

[^1]: "[SQL / AQL – Comparison](https://www.arangodb.com/sql-aql-comparison/)" (ArangoDB)、"[SQL to ReQL cheat sheet](http://rethinkdb.com/docs/sql-to-reql/javascript/)" (RethinkDB) も参考になりそうです。
[^2]: ArangoDB の ```_key``` attribute は string type です。記号類は、「``` _  -  :  .  @ ```」が使用可です。でも「```.```」を使って本当に後で困らないだろうか．．．
AWS tutorial +皆さんの勉強法募集します

#Tutorial をやってみた！！！

今日はAWS のTutorial　の Store files, Deploy website　の２つをやってみました。

 Store files　では
1. S3を作ってfileやvideoをbucketに入れてみる。
2. Glacierの中にvaultを作り、実際にfileをそこからdownloadしてみる。

使ってみた感想
➡やっぱり、S3が好き（笑）というのも、S３は他の機能ともリンクしていて
これを使いこなせるようになることができたら、相当幅が広がるかなって感じました。

Deploy websiteでは
1.S3をつかってstatic websiteをデプロイする。また、ここでは、route53 を使って
ドメイン名をウェブサイトに割り当て、cloudfrontを使って、distributionを作り
スピーディーなもの？？にしました。（これによってedge locations からデータを取り出せる）

やってみて思うのは　AWS tutorial がものすごくわかりやすいということ。
しっかりと解説があるし、わからないことはdocumentationで知ることができます。

このように少しずつですが、**実際に触れてみる、動かしてみる** ことがとても
大事だと感じました。
これを毎日続けていくことで幅が広がるかなと思います。（来年の４月から始まる仕事へのクッションになればよいのですが。。。）

最後にゆる募

*皆様はどのように勉強をされていますか？*
ちなみに僕のプランは　Aws tutorial, slideshare(AWS), AWS blog, AWS documentation
そしてqiita stackoverflow　でわからないことを潰す。

みなさん、ご応募まってまーーーす。。
インターネッツご時世にRailsのオフラインインストールをやってみた


## 環境
```
$ ruby -v                                                                                             
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
$ gem -v
2.4.5
$ gem list --local                                                                                    
*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)
```

railsに必要なファイルを1つずつダウンロードしようとしたが多すぎた。
依存関係全てダウンロード出来るやろと思ったら、bundlerの機能についていた。
ネット環境あるとこで、以下を実行

```
$ bundle install --path=vender/bundle
```

vendor/bundle/ruby/2.2.0/cache をネット環境がないところに持って行き..
※nokogiriやsqlite3などのように、native installするものはwindowsとunixで変わるので注意。なるべく同じ環境でやろう。

```
$ gem install rails --local --no-ri --no-rdoc
...
29 gems installed
$ rails -v                                                                                            
Rails 4.2.3
```
Rails が入った！
次は、RailsのGemfileが待っている

また、ネットワークにつながるところでgemを取得

```
$ bundle exec rails new -B startup
$ cd startup
$ bundle install --path vendor/bundle 
```

vendor/bundle/ruby/2.2.0/cache をネット環境がないところに持って行き..
インターネットがない環境のproject/vendor/cache へ全て突っ込み、 --localを付ければ
cacheからインストールを開始してくれる


```
$ bundle install --path vendor/bundle --local
```

#### 備考
ちなみに、Gemfileでtherubyracerのコメントアウトを解いてあげ、
therubyracerのgemも手動でダウンロードしましょう。
インストール時に出ないで、実行時にエラーが出る質の悪いやつ。
libv8とrefのgemも必要だった。

## 参考
http://d.hatena.ne.jp/ozuma/20120825/1345906732


世界にインターネットが消えても(？) Railsが使える！

良きRails Offline Lifeを
Railsで引数を可変長で受ける



Railsで `extract_options!` を利用すると、簡単に可変長で引数を受け取ることができます。こんな感じ。

```ruby
def hoge(*args)
  options = args.extract_options!
  count = options[:count] || 1 # 存在しなかった時のデフォルト値
  hash = options[:hash] || {}
  
  p args
  p count
  p hash
end

hoge(1, 2, :count => 4, :hash => {"a" => 1, "b" => 2})
# => [1, 2]
# => 4
# => {"a"=>1, "b"=>2}
```

挙動的には引数のうちハッシュ形式で送ったものが、`extract_options!` を通すことで `args` から抽出されるのですが、上記の書き方だとハッシュ形式ではない引数が受け取りにくくなります（一つ目の引数を受け取るなら `args[0]` とアクセスしないといけない）。

なので、こう書いてみるのはどうでしょう。

```ruby
def hoge(val1, val2, *args)
  args = args.extract_options!
  count = args[:count] || 1
  hash = args[:hash] || {}
  
  p val1
  p val2
  p count
  p hash
end

hoge(1, 2, :count => 4, :hash => {"a" => 1, "b" => 2})
# => 1
# => 2
# => 4
# => {"a"=>1, "b"=>2}
```

こんな風にハッシュ値で送るもの以外は変数を明示的に書くと、取り出しやすくなります。
必須項目はそのまま書いて、オプションとして受け取りたいものはハッシュで書くと気持ち可読性が上がるかもしれません。