OmniAICreator/Qiita-1.07M huggingface dataset:
string.h は忘れよう

　C++での開発が当たり前になって久しい。文字コードもunicodeサポートが当然になっている。バッファオーバーフローへの対策が必須の時代になっている。もうstring.hを使うのはやめよう。

```
#include <string>
int main(int argc, char* argv[]){
    std::string message = "Hello World";
    std::cout << message << std::endl;
}
```
としようじゃないか。

string.hは、ASCIIコードの時代、バッファーオーバーフローの問題も今ほど大きくない時代にできた。今となっては、OSや基本のライブラリを作るようなプロフェッショナル（＝いわばレーサー）が使うようなライブラリだと思う。

```#include <string>```

「std::string を使うことで、オーバーヘッドが大きくなる。」と気にしなければならないほど、他の部分をバリバリにチューニングをしてあるプログラムを書いている人はどれほどいるだろう。私の書いているプログラムの中では、それ以外の要因の方が圧倒的に遅くしている要因です。string.hのライブラリを使うとchar*でポインタを使うことになります。
　ファイルシステムの文字コードにUTF8が使われているときに、char* を使うとどうなるのか、私は理解していません。UTF8の文字コードの中で、文字列の検索や置換をしたときに何が起きるのかも理解しておりません。
　でも、実際のプログラムの中では、文字列の検索や置換を行っています。だから、私はstring.hの関数は忘れることにしました。自分のプログラムの中には、他にも危なっかしいところが山ほど山ほどあります。`#include <string>`の関数は、文字コードの問題や、バッファーオーバーフローへの対策などを考えた時代以降に開発されてきたものです。UTF8がうまく実装されていることは、様々なプログラムの中でたくさんの国・地域の処理できていることからわかります。
　std::string を使いましょう。char*のインターフェースが必要なときは、.c_str()メソッドを使えば十分です。
　std::string を使って安全運転でC++のプログラムを楽しく開発しましょう。


付記：
　文字列の長さが固定長であって文字列の連結をするとオーバーフローする心配をしなければならない枠組みよりは、文字列の長さは連結しただけ長くなる枠組みでは、後者の方がメモリが潤沢な環境ではコーディングする側には考えやすいと思っているのです。
　文字コードの問題には深入りしたくないのです。
 strcpy()の代わりに、strcpy_s()を用いても、目的の文字列操作にはならないことを次のwebページの記事は書いています。
[strcpy_sなんて使うな](http://d.hatena.ne.jp/ytqwerty/20101014/p1)

char pathname[1024];
などと、たいがいの場合に足りそうな文字列の長さを確保しても、メモリの効果的な利用にはなっていません。メモリの使用量の上限(あるいは固定値）を設定することで、リソースを明確にするという意味は持っていますが、std::stringを用いた方が、通常のたちのよい場合には、メモリの使用量が少なくできるではないかと思います。


付記：多バイトコードの扱い
wcscpy 関数と _mbscpy関数がVisual C++ にはある。C++プログラムを特定のコンパイラだけでしかコンパイルできないようにはしたくない。
一番単純な使い方で破綻が生じない限り、単純なやりかたをしたいと思っている。それがstd::string を使おうと考えている理由です。

SHIFT_JIS[2バイト目が5C等になりうることによる問題]
(https://ja.wikipedia.org/wiki/Shift_JIS)

付記：
　ファイルの操作にはBoostを使おう。
PRML実装　第3章 線形基底関数モデル

# PRML実装　第3章 線形基底関数モデル
最尤推定解を求めるスクリプトを書いてみました。

```lang:script.py
import numpy as np
from numpy.linalg import inv
import matplotlib.pyplot as plt

M = 10 # モデルの複雑さ
N = 20 # データ数
L = 10 # データセット数

ary_mu = np.linspace(0,1,M)

def phi(ary_mu, x):
    ret = np.array([np.exp(-(x-mu)**2/(2*0.1**2)) for mu in ary_mu])
    ret[0] = 1
    return ret

for x in range(L):
    x_train = np.linspace(0,1,N)
    y_train = np.sin(2*np.pi*x_train) + np.random.normal(0,0.3,N)

    # 計画行列(3.16式)の計算
    PHI = np.array([phi(ary_mu,x) for x in x_train]).reshape(N,M)

    # 最尤推定解(3.15式)の計算
    w_ml = inv(PHI.transpose().dot(PHI)).dot(PHI.transpose()).dot(y_train)
    # 正則化する場合は下を使う
    # l = 0.3
    # w_ml = inv(l*np.identity(M)+PHI.transpose().dot(PHI)).dot(PHI.transpose()).dot(y_train)

    xx = np.linspace(0,1,100)
    y = [phi(ary_mu,x).dot(w_ml) for x in xx]

    plt.plot(xx,y)

plt.show()
```

```math
 sin(2*\pi*x) + N(0,0.3)
```
でデータ生成を行い、データセット毎の結果を表示してみました。

正則化を行わない場合
![normal.png](https://qiita-image-store.s3.amazonaws.com/0/20986/398dddb2-8bc6-65c7-944d-f7f3392db974.png)

正則化を行った場合
![正則化.png](https://qiita-image-store.s3.amazonaws.com/0/20986/5db5e734-72df-f966-f5b2-bedd7b287e32.png)

です。なんとなく正則化の効果が出ています。
JavaからClojureを呼ぶ


ごく簡単なことですが、今日の学びも兼ねて書きます。

[github](https://github.com/0x9n/clojure-from-java)にサンプルコードをあげておきました。

## pom.xmlの設定

```xml:pom.xml
<plugin>
    <groupId>com.theoryinpractise</groupId>
    <artifactId>clojure-maven-plugin</artifactId>
    <version>1.7.1</version>
</plugin>
```
を入れる。これでclojureのソースコードをMavenから実行できる。Goalはたとえば`clojure:run`、`clojure:compile`などがある。詳細は[clojure-maven-pluginのgithub](https://github.com/talios/clojure-maven-plugin)参照。

これに加えて

```xml:pom.xml
<configuration>
    <sourceDirectories>
        <sourceDirectory>src/main/clojure</sourceDirectory>
    </sourceDirectories>
</configuration>
```

を指定すればClojureのソースコードの配置を指定できるし、

```xml:pom.xml
<execution>
    <id>compile</id>
    <phase>compile</phase>
    <goals>
        <goal>compile</goal>
    </goals>
</execution>
```

で、Compileフェーズに勝手に実行してくれるようになる。

## Clojureを書く

```clj:HelloClojure.clj
;src/main/clojure/HelloClojure.clj
(ns HelloClojure)
(defn hello
  "My first main"
  []
  (println "Hello from Clojure!"))
```

## Javaから呼ぶ

```java:App.java
public static void main( String[] args ) {
    // Hello from Java.
    System.out.println( "Hello from Java!" );

    // Hello from clojure.
    Clojure.var("clojure.core/require").invoke(Clojure.read("HelloClojure"));
    IFn func = Clojure.var("HelloClojure", "hello");
    func.invoke();
}
```

これで、Clojureで書いたコードをJavaから呼べます。

## 参考資料

- [How to use Maven to build Clojure code](http://alexott.net/en/clojure/ClojureMaven.html)
- [talios/clojure-maven-plugin | GitHub](https://github.com/talios/clojure-maven-plugin)
CTest で特定のテストを sudo 経由で実行する

スーパーユーザー権限が前提の機能をテストしたいときに。
元ネタはここ。

https://cmake.org/pipermail/cmake/2010-August/039037.html

前準備として次の内容のスクリプトを作って chmod で実行可能にしておく。
場所は ${CMAKE_SOURCE_DIR}/cmake/sudo.sh あたりに。

```sh
#!/bin/sh

/usr/bin/sudo $*
```

で、 CTest の設定時に次のようにする。

```cmake
add_executable(my-test
    main.cpp
)
add_test(
    NAME MyTest
    COMMAND ${CMAKE_SOURCE_DIR}/cmake/sudo.sh $<TARGET_FILE:my-test>
)
```

こうすると <kbd>ctest</kbd> したときに sudo 経由で実行してくれる。
sudoers でパスワードを要求するようにしてるともちろんパスワード聞かれるので都度いれるかたちで。
Spring Bootプロジェクトを新規作成してからHollow Worldを出すまで

#開発環境　
os Mac
IDE Spring Tool Suite
java 1.8.0_60

#手順
パッケージエクスプローラから、　File>New>Spring Starter Project
![スクリーンショット 2015-10-19 21.28.00.png](https://qiita-image-store.s3.amazonaws.com/0/57455/dca117e3-0e2a-a689-d683-da5e889ec5c1.png)

プロジェクト名を設定
![スクリーンショット 2015-10-19 21.29.28.png](https://qiita-image-store.s3.amazonaws.com/0/57455/9e1b6d50-4b99-4d1e-eeaa-078cac6f14e0.png)
とりあえずwebだけをチェックし
プロジェクトを作成
![スクリーンショット 2015-10-19 21.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/57455/9e8511f8-9fa5-b0ca-58f8-ab98492ae0ad.png)

コントローラを作成する。
HelloController.javaを作成し、
Hollow Worldを返す
![スクリーンショット 2015-10-19 21.30.39.png](https://qiita-image-store.s3.amazonaws.com/0/57455/933b7530-0318-fd48-b336-2c023b1abe6b.png)



参考
（http://qiita.com/don_hanabi/items/fe5223c64ecc44a0d944）


```Java:HelloController.java
package com.example;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @RequestMapping("/")![Invalid file type: ]()

    public String index() {
        return "Hollow World!";
    }
}
```



起動する
プロジェクトを選択し、Run As>Spring Boot Appを選択

コンソールにSpringの起動ログが表示される
![スクリーンショット 2015-10-19 21.43.10.png](https://qiita-image-store.s3.amazonaws.com/0/57455/1724d0d4-4746-98d3-54a0-6329b5584cbd.png)

![スクリーンショット 2015-10-19 21.44.23.png](https://qiita-image-store.s3.amazonaws.com/0/57455/23ec0f98-a1a2-84b0-27c7-5d6ecc18b2d8.png)


この状態で以下をブラウザから確認
http://localhost:8080/

ブラウザに表示が行われている。
![スクリーンショット 2015-10-19 21.44.50.png](https://qiita-image-store.s3.amazonaws.com/0/57455/c1f7874c-1043-2839-fb06-7e6436620e1f.png)
gulp.watchで起動時に存在するファイルしかチェックしてくれない。

## gulp.watch

```js:gulpfile.js
var gulp        = require('gulp');

gulp.task('watch', function(){
    gulp.watch('**', function(event) {
      console.log(event.path, event.type);
    });
});

gulp.task('default', ['watch']);

```

google検索をすると、gulp.watchでは、changedしか監視できないという情報が多いが、そんなことなくて、ちゃんと、addedとdeletedも監視できる。


ただ、ある条件を満たした場合に、addedとdeletedが監視できないことがある。

## 環境

``makbookpro``で仮装環境構築に``vagrant ``を使用し、``centOS``的な。
ファイル共有で、仮装マシンとmac側のフォルダを共有できるようにしている。

## 仮装マシンへsshで入り、新しいファイルを追加した場合、監視できている。

```
$ touch test
```
とコマンドで打つと、addedの動作確認ができる。

## mac側のfinderへ直接ファイルを追加すると、監視できない。
terminalで、vagrantへsshしていない状態で、共有フォルダのディレクトリで、

```
$ touch test
```

とコマンドで打つと、監視されず、gulpは何も反応しない。

## mac側で追加したファイルも監視して欲しい。
いろいろ、試してみたけどダメだった。

- gulp-watch
- gaze
- watchpack
- その他 npm にあるやつ色々。

## そもそも、vagrantの共有ファイルの設定の仕方がダメなのかもしれない。

このあたりをもう少し調べてみようと思う。
ターミナルからコマンドでファイルをコンパイルする際のPATHの指定

タイトルが真意からそれてないか不安ですが
ターミナルからコマンドでCUDAの動作確認をするために、PATHを通す必要があったので、初めてやり方を学びました。

# ~/.bashrcてどこにあるの？

最初から存在するフォルダかと勘違いしていたのですが、自分で作らなければ模様。

```
$ vi ~/.bashrc　　　　　 #デフォルトで読み込む用
$ vi ~/.bash_profile 　#login時に読み込む用
```

まあどちらも作っておきます。
とりあえず一方のコマンドを打ったら、下の方に

```
"~/.bashrc" [new file]
```
と出てくると思うので

```
:wq
```
を入力してファイルを保存。
正直vimは入力が面倒くさいのでできればテキストエディタを使いたいところ。

そこで

```
$ defaults write com.apple.finder AppleShowAllFiles TRUE
$ killall Finder #Finderを再起動して変更を適用する
```
で隠れファイルを見えるようにして、Finderの方から.bashrcファイルを開けるようにしました。(まあコマンドで打てばいいんだけど、sublimeで開こうとしたらなんかうまくいかなかったのでGUIで操作する方が簡単だなので)
戻すときは

```
$ defaults write com.apple.finder AppleShowAllFiles FALSE
$ killall Finder
```

~/.bashrcファイルをエディタで開いたら、

```
export PATH=/usr/local/cuda/bin:$PATH
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
export C_INCLUDE_PATH=/Developer/CUDA/common/inc
export CPLUS_INCLUDE_PATH=/Developer/CUDA/common/inc
```
こんな感じでCUDAのPATHを指定する。

PATHが通ってるかの確認は

```
$ printenv PATH
```

ちかれた…。
最適化について書くときに僕の書くこと

プログラムの動作が遅くて所期の目的を達成しづらい、ということはよくあります。ただ、最適化もやるべき所でやるべきことをきちんとわきまえないと、労多くして実りが少ないことにもなってしまいます。

# そもそも、最適化って？
まず、[「最適化」で国語辞典を引いてみる](http://dictionary.goo.ne.jp/leaf/jn2/85469/m0u/)と、「システム工学などで、特定の目的に最適の計画・システムを設計すること。」とあります。つまり、プログラム構造より上の、ネットワークトポロジーや機器構成などを「最適化」するということも考えられます。とはいえ、そこまで考えていると話が大きくなりすぎるので、今回はプログラムレベルでの最適化について主に考えます。

# 何を最適化するか
そして、プログラムの動作を「最適化」すると言っても、いろんな側面が考えられます。

* 動作速度を上げる
* プログラムサイズを小さくする
* プログラムの消費メモリを少なくする
* プログラムの消費電力を減らす

もちろん、「まったく無駄な処理を減らす」というように、いずれも改善するような最適化ももちろんあります。ただ、ものによってはトレードオフとなることがあります。たとえば、HTTPには「データを圧縮して転送する」という機能があります。これを行うことで通信容量は削減できますが、圧縮・解凍を行う処理が必要となるので、計算量は増加します（もっとも、多くの場合に通信量が増えることによる負荷のほうが圧倒的に大きくなるので、これが最適化として成立します）。また、よく「また必要になる値をキャッシュしておいて、後の計算を省略する」ということが行われますが、最近のCPUはメモリよりずっと速くなってしまったので、状況によっては「すでにレジスタにある値から必要な値を再計算する」ほうが効率的になってしまうこともあります。

# 最適化のトレードオフ
上のように、「あっちを立てればこっちが立たない」ような最適化もありますが、最適化以外の部分とのトレードオフも存在します。

* 最適化したコードは読解しづらく、また修正もやりづらい
* 特定の条件に合わせて最適化した場合、それ以外の条件で性能が低下する、あるいはまったく動作しなくなる
* 最適化の過程でバグを作りこむこともある
* 最適化自体にも時間がかかる

そんな訳で、最適化は「すればするほどいい」というものでは決してありません。

# ステップに応じた最適化を考えてみる
「人生はひと箱のマッチ箱に似ている。重大に扱うには馬鹿馬鹿しい。重大に扱わなければ危険である」なんて言葉がありますが、最適化にも似たようなことが言えます。プログラムを書く最初から細かな「最適化」をしていてもデメリットしかありませんが、逆に動作性能のことを何も考えずにプログラムを作ってしまえば、あとから修正するのもまた困難な話です。

## 設計レベルでの検討
プログラムを書き始める前に、（たとえ書類に落とさないとしても）本来のプログラムをいきなり書きだすのではなくて、ある程度設計を行うことも多いと思います。その時に性能面と関連して重要になってくるのが、**データ構造**と**アルゴリズム**です。

### データ構造
RDBMSを考えてもらうとわかりやすいですが、データ構造をどのように取るかで、どんなことがすんなりできるかが変化してきます。たとえば、カンマ区切りでデータを1行に詰めてしまうと、あとあとの集計で困難を来たします。

もちろん、理想的な形でデータを入れても速度が出ない、ということも考えられますが、そんな場合は適宜データをキャッシュさせて解決しましょう。元のデータ構造を曲げてしまうと扱いが面倒になります。

### アルゴリズム
小手先の改善で速度を2倍に上げることはそう簡単ではありませんが、アルゴリズムを変えることで一気に10倍以上高速化できることもあります。幼き日のガウスは「1から100まで全部足してみましょう」と言われた時に、等差数列の和の公式を使って、「5050」と即答したとのことですが、そのように計算の手間がアルゴリズムによって圧倒的に異なってくることがあります。

## コーディングレベルで考えること
実際にコーディングしていく上でも、少し意識を持っておくと、効率的なプログラムを効率的に作ることができます。

### 標準的な関数を使う
まずは、言語にある標準ライブラリを確認して、それで可能なことは積極的に使って行きましょう。すでにあるのを自分で書いても、それより性能が向上することはそうそうありませんし（ただ、ループ系でコールバックをとる関数だと、コールバックのオーバーヘッドで負けるということも時にはあります）、新たにバグを作りこんでしまう危険もあります。標準関数を使っておけばそんな心配もないですし、バージョンアップで高速化するかもしれません。言語によっては、ネイティブ実装になっていて、言語内では速度的に太刀打ちできない、ということもあります。

また、行列演算のBLAS、3DグラフィックのOpenGLのように著名なライブラリがある分野であれば、それを使ってしまうのも一案です。とりわけ、BLASなどはCPUメーカーが極限までチューニングしているバージョンを出していることもあって、一般プログラマーが手で書いたのでは到底叶わない性能を発揮します。

## 最適化フェーズにて
動作するコードが書き上がったけど、性能が足りないとなれば、本腰を入れて最適化する必要があります。何はともあれ、まずは**計測**です。思っていた以上に、意外な場所で時間を食っていることが多々あります。逆に、もともと1ミリ秒しかかからない処理は、どれだけ努力しても1ミリ秒以上高速化することはできません。

実際に行う「最適化」と言っても、多くの場合は無駄な処理の削減などできれいに書ける範囲内でも効果があることが多いです。また、[このように](http://qiita.com/jkr_2255/items/12081b3c066d371516f5)、特定の環境が持つ機能を活かすことで、高速化できることもあります。
株主優待でGMO INTERNET GROUPのvpsを安く借りる

## 概要
[GMOインターネット（9449）](http://stocks.finance.yahoo.co.jp/stocks/detail/?code=9449)の[株主優待](http://ir.gmo.jp/stock/st-newstockholders/?bid=dom01)で以下のサービスから年間10,000円の割引を受けることができます。
- [お名前.com レンタルサーバー](http://www.onamae-server.com/)
- [お名前.com クラウド](https://www.onamae-cloud.com/)
- [ConoHa](https://www.conoha.jp/)
- [GMO アプリクラウド](http://cloud.gmo.jp/)
- [GMO クラウド](http://shared.gmocloud.com/)

この中から、2015年10月時点のvpsの利用料金をまとめました。

## お名前.com vps

年契約の割引があり、それを使った場合、1GBは無料、2GBが最も安く利用できる。
初期費用がかかるが、無料キャンペーンを頻繁にやっている。

||1GBプラン|2GBプラン|4GBプラン|8GBプラン|16GBプラン|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
|初期費用|無料|1,600円(税抜)|5,410円(税抜)|9,220円(税抜)|15,886円(税抜)|
|月額費用|896円(税抜)|1,315円(税抜)|3,696円(税抜)|7,505円(税抜)|15,124円(税抜)|
|**月額費用<br>（割引）**|**63円(税抜)**|**482円(税抜)**|**2,863円(税抜)**|**6,672円(税抜)**|**14,291円(税抜)**|
|年額費用|9,523円(税抜)<br>（793円/月）|13,187円(税抜)<br>（1,099円/月）|37,065円(税抜)<br>（3,089円/月）|75,264円(税抜)<br>（6,272円/月）|151,665円(税抜)<br>（12,639円/月）|
|**年額費用<br>（割引）**|**0円(税抜)<br>（0円/月）**|**3,187円(税抜)<br>（266円/月）**|**27,065円(税抜)<br>（2,256円/月）**|**65,264円(税抜)<br>（5,439円/月）**|**141,665円(税抜)<br>（11,506円/月）**|
|CPU|2コア|3コア|4コア|6コア|10コア|
|メモリ|1GB|2GB|4GB|8GB|16GB|
|HDD|100GB|200GB|400GB|800GB|1TB|

## Conoha

ディスクにSSDを利用できるが、他と比較してやや割高。
1万円の割引が微々たるものになるほど高額な32GB、64GBというハイスペックプランもある。

|メモリ|1GB|2GB|4GB|8GB|16GB|32GB|64GB|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
|CPU|2コア|3コア|4コア|6コア|8コア|12コア|24コア|
|SSD|50GB|50GB|50GB|50GB|50GB|50GB|50GB|
|１ヶ月の料金|900円|1,750円|3,420円|6,670円|13,010円|25,370円|49,480円|
|**１ヶ月の料金<br>（割引）**|**67円**|**917円**|**2,587円**|**5,837円**|**12,177円**|**24,537円**|**48,647円**|

## GMOクラウド vps

1GBが無料で利用でき、他と比べて、4GBが最も安く利用できる。
OSにWindowsServer、データベースにSQLServerを選択することもできる。
初期費用がかかるが、無料キャンペーンを頻繁にやっている。

||1GB|2GB|4GB|6GB|8GB|12GB|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
|月額|780円|1,280円|2,380円|4,580円|6,580円|10,480円|
|**月額<br>（割引）**|**0円**|**447円**|**1,547円**|**3,747円**|**5,747円**|**9,647円**|
|初期費用|4,000円|4,000円|4,000円|4,000円|4,000円|4,000円|
|ディスク容量|50GB|100GB|200GB|400GB|600GB|800GB|
|CPU|2コア|3コア|4コア|5コア|6コア|7コア|

## 所感

パッと見、同じようですが、それぞれに特徴があり、SSDやWindowsServer等、用途に応じた選択ができます。
私は安くて、割引を余さず使える「お名前.com vps」の「2GBプラン」がいいなと思いました。
gradle daemonを使ってEmbulk Java版プラグインを高速コンパイル



## まとめ

* ``~/.gradle/gradle.properties``に設定を追加するだけでembulkのプラグイのコンパイルが速くなるようだ

## 高速化のメッセージ

Embulk 0.7以降を使っていている場合、gradleは2.6を使うようになる。
プラグインをビルドすると次のようなメッセージが表示される。「gradleデーモンを使えば、コンパイルが速くなるよとのこと。」

```
This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.6/userguide/gradle_daemon.html
```

詳しい説明はここに書いてある。

[Chapter 18. The Gradle Daemon](https://docs.gradle.org/2.6/userguide/gradle_daemon.html)

## やってみた

要するにホームディレクトリの``.gradle/gradle.properties``に
次のようなエントリを追加すれば良いようだ。

```
cat ~/.gradle/gradle.properties 
org.gradle.daemon=true 
```

次のコマンドを実行すれば上記のファイルを作成してくれる。

```
touch ~/.gradle/gradle.properties && echo "org.gradle.daemon=true" >> ~/.gradle/gradle.properties
```

ファイルを作成した後``gradlew gem``を実行すると次のようなメッセージが表示され、gradleのデーモンが起動する。

```
Starting a new Gradle Daemon for this build (subsequent builds will be faster).
```

デーモンが起動した状態だとコンパイルが速くなる...らしい

## 計測結果

自分のパッケージだと、コンパイル時間が2/3になった。embulk本体はあまり変わらなかった。

| デーモン未使用 | デーモン使用 |
| ----------- |-----------|
| 15秒        | 10秒　　　　|
Swift2.0で文字列の切り出しをする

# サンプルコード

```swift
let str = "abcde"

// 1文字目を取得する
print(str.substringToIndex(str.startIndex.advancedBy(1)))
// => a

// 2文字目以降を取得する
print(str.substringFromIndex(str.startIndex.advancedBy(1)))
// => bcde
```
Kotlinでクロスプラットフォーム開発　[1] Android開発環境の導入～エミュレーターで実行まで

#　[0] Kotlin導入の狙い。
##　背景
Kotlin関係、既に皆さんがいろいろと書いているので、軽く。

- Scalaなどと同様のJVM言語Kotlin。Java代替用途の他、Javascriptにも変換可能。簡潔な記述が可能で、最近、Android開発環境として注目されている。
- RoboVMがLLVM IRを介した、JVMコードのOS X/iOS環境への実用的な変換の道を切り拓く。
- Kotlinに近い立ち位置の、iOSのSwiftもClang経由でLLVM IRを活用（[参考](http://codezine.jp/article/detail/8768)）。Kotlin/Swift双方で使える、永続化ライブラリ[Realm](https://realm.io/jp/)が(SQLite代替として)普及しつつあるため、必要に応じ、iOS開発はSwiftでいくとの決断の敷居も低い。

要するに、Kotlinで、今ちょっと頑張っておくことが、LLVM時代本格化の近い将来にクロスプラットフォームな何かで役に立つという予感がしてるということ... ^^

参考リンク① [Android開発を受注したからKotlinをガッツリ使ってみた](http://j.mp/kotlin_gatz)
 
参考リンク②　[人間でもわかるLLVMバックエンド入門](http://sssslide.com/speakerdeck.com/kazegusuri/ren-jian-demowakarullvmbatukuendoru-men)
　＃ブラウザ向けLLVMの[WebAssemblyも熱そうだ](http://qiita.com/KENJU/items/3ec95aebd30bc95b862c)。

##　私的狙い
既存のJVMライブラリ資産を活かしたクロスプラットフォーム開発を行いたい。
Kotlin開発元のJetBrain社のIntelliJベースの３つの環境を適宜試しながら、進めていきたい。

- IntelliJ (EAP15)　@本家 => Kotlinの文法マスター、JavaFXの実行等に活用
- Android Studio(1.4)　@グーグル製=> IntelliJベースの環境で、android開発。
- RoboVM Studio 1.0 EAP for Mac OS X => OS X/iOS開発

今回は、Android Studio(1.4)を導入
参考　[AndroidプロジェクトのKotlin化](http://qiita.com/mattak@github/items/11dccace094963177422)

# [1] Android StudioにKotlinを導入
Android Studio(1.4)をダウンロード後の初回起動画面"Welcome to Android Studio"で、Preferences > Plugins > Browse Repositoryで、以下をインストール後に再起動するだけ。

- Kotlin
- Kotlin Extensions for Android
 
![Fig1](http://f.cl.ly/items/3r2A3B2f3O1h2i3Q1A0F/welcome1.png)

# [2] とりあえず、ハローワールド的なことを実行。
## 新規Androidプロジェクトを作成。
ターゲット機器として、Android5.0(API21)環境を選ぶ。
![API21](http://f.cl.ly/items/0N07233h1y2m282O0l3f/API21.PNG)
適当な雛形を選ぶと、...ビルドツールGradleがAndroidでのビルドに必要なファイルをいろいろダウンロードしてくれる。

## JavaコードのKotlinコードへの変換方法
変換対象とするjavaファイルを選び、Ctrl + Shift + A を押してクイックアクションを起動し、以下のようにConvert。
![](http://j.mp/conv2kotlin)
(WindowsのAndroid Studio1.4では、Ctrl + Shift + Alt +Kというショートカットも利用できるのかな)
例題のテキスト等を適当に実行し、エミュレーターで実行してみると...１分ほどでエミュレーターは立ち上がるが、アプリは、FATALで落ちる。

## buildscriptの設定
KotlinコードをAndroidアプリとして実行するには、build.gradleファイル内のbuildscriptの設定が必要。
先ほどインストールしたプラグイン”Kotlin Extensions for Android”のバージョンを調べ、dependenciesのclasspathを設定し、apply plugin: 'kotlin'する(下記参考)。そして、実行すると、無事動作っ。
![](http://f.cl.ly/items/332f1P1u3Z0J2D3j2Z3H/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202015-10-19%2020.35.11.png)
# [3] 感想
各所でいろいろ書かれているように、GoogleがJetBrain製IntelliJベースのAndroid Studioを採用した効果で、あまりわかっていなくても、とりあえず、実行まで持っていける(今回はと、インストール後の試行錯誤時間約１時間)。アプリのビルドには分単位の時間がかかった。Windows 10機でのメモリ使用量を調べるとブラウザやペイントなどのアプリがいくつか立ち上がった状態で6GB弱であったこと、参考値として。

次回は、Realmでの永続化に挑戦したい。
## [復習] プログラミング言語Kotlin 解説の[8.2 Androidアプリ開発](https://sites.google.com/site/tarokotlin/chap8/sec82)
...復習というか、ちゃんと学ぶ意味で、、

## [予習] [Realm Java最新版　日本語文書](https://realm.io/jp/docs/java/latest/)
グーグルスプレッドシートにポストする

# 経緯

＞GA解析でコンバージョンしたかったり項目を動的に変更したい。
＞＞インラインフレーム読み込みだと限界がある気がする。
＞＞＞他の方法を模索。

# 調査

## gasのgetPostメソッドで受信する方法

	Google Apps ScriptにてPOSTで受け取って書き込む | eye4brain
	http://goo.gl/c5BZmX


記載の方法で試してみたところ、iframeをターゲットにしてpostしていたためエラーが出た。
今のところ新しいChromeなど対応ブラウザのみの動作なのかな。

```
set 'X-Frame-Options' to 'SAMEORIGIN'.
```

ポイントとしては、スクリプトの公開範囲を「匿名含む全員」にすること。
その場合にもX-Frame-Optionsのエラーは出る。
自分の権限で実行するので（？）下手なことは出来ないかな。

	JavaScript - Google Apps ScriptだけでSpreadSheetへのPOST APIを持つWebアプリケーションを公開する - Qiita
	http://goo.gl/JvUTdW

上記も基本は同じだがcurlで実行している例がある。

	［GAS］Googleフォームを経由せず、外部からデータを更新する - 技術のメモ帳
	http://goo.gl/todroq

jsonでやりとりすればエラー無くレスポンスが受け取れた。

## APIをつかって実行する方法

	Google Apps Scriptを外部から実行できるGoogle Apps Script Execution APIを試してみた - F.Ko-Jiの「一秒後は未来」
	http://goo.gl/M0P127

「Google Apps Script Execution API」というAPIがあるらしい。
たぶん、こちらの方が新しい手法なのだろうな。
コチラを使うメリットはなんだろう？
サーバーサイドで複雑にスクリプトを叩く場合とかなのかな。
あとは認証があるからセキュアなのかな。
他にあるとすれば、ウェブアプリの公開設定もしなくていいのかもな。

公式ドキュメント

	Apps Script Execution API  |  Apps Script  |  Google Developers
	https://goo.gl/gdKVmr

	Create a Target Project for the Apps Script Execution API  |  Apps Script  |  Google Developers
	https://goo.gl/XGpL1t

## サーバーサイドでフォームを読み込む

（GASを経由せずにそのままフォーム送信）

GoogleFormを動的に取得してきたいと考えた。
動的取得じゃないとすると、変更があるたびに手動更新だったり、それ用の仕組みがほしくなるだろう。
汎用性を考えると、できればjsだけで完結させたかったのだけど、
下記条件を考えてとりあえずサーバーサイドで。

・GASのurlfetchapp()は利用に制限がある
・js単独だとクロスドメインで簡単にとって来れない
・安定したプロキシ的なサービスをしらない

某ライブラリを利用して、 下記のようにした。

```test.php
<?php
require_once '_include/php/simple_html_dom.php';
$html = file_get_html('https://docs.google.com/forms/d/hogehoge/viewform');
$html->find('base', 0)->href = 'https://docs.google.com';
$html->find('base', 0)->target = '_self';
$html->find('#ss-submit', 0)->onclick = 'alert(1);';
echo $html->outertext;
exit;

```

GASを経由せずにそのままフォーム送信してしまう。
とりあえず、最初のsubmitをトリガーにしてコンバージョンとしてしまうにはこれでいい。
そうじゃなければ、POST送信もサーバーサイドでするか。何か違う気がする。
今更で、どうせサーバーサイドなら、むしろ、なんちゃってプロキシ処理を用意した方が良い気がしてきた。
その場合にも、jsじゃなくてdom書き換えまでしてしまったほうがいいかな。

## js呼び出しでサーバーサイド送信処理など

（なんちゃってプロキシ処理）

略

サーバーサイド使わずにやりたい。。
Swarmatron的なものをVSTにしてみた。

こういうものの需要があるかどうかわからないのですが、Githubの勉強も兼ねてあげてみました。
[swarms](https://github.com/ttatsf/swarms) 
![swarms_on_t6.png](https://qiita-image-store.s3.amazonaws.com/0/61597/80417181-de67-edf8-b349-b478d3924438.png "swarms_on_t6.png")
8オシレータのモノシンセのVST instrumentです。

##Swarmatronって?

変った音を出すハンドメイドのアナログシンセです。
[Swarmatron](http://www.dewanatron.com/instruments.php?page=swarmatron)
映画「ソーシャルネットワーク」で使われて話題になったようです。観てないので最近まで知りませんでした。

変な音でうにょうにょするシンセを探していてみつけました。

スタンドアローンでReWire可のものは[refusesoftware.com](https://www.refusesoftware.com)さんが[the Swarm](https://www.refusesoftware.com/swarm)というフリーウエアを公開してくれています。

でもお手軽にVSTで使えるものは見当たらなかったので、SonicBirth v1.3.1で作ってみました。

##SonicBirthとは?
AudioUnitをデザインするアプリケーション、だそうです。[sonicbirth.sourceforge.net](http://sonicbirth.sourceforge.net)
GUIで作った同じサーキットからAUもVSTも作れます。
Max/MSPやPdと似ているかも知れません。
ただし、2007に開発が終了してメンテもされてないので、環境によってちゃんと動かないかも知れません。
最新(最終)版は[ここ](http://www.radio.uqam.ca/ambisonic/sonicbirth_v131 _beta2.zip)から。本家v1.3.0ではなく、こちらを使ってください。

ちなみに自分の環境では、今現在、だいたい問題なく使えています。
* macbook pro (Mid 2010)
* Yosemite
* Tracktion6, Live8 or Live9 (全て32bit)

AU instrumentはちゃんと動かないようです。MIDIを受けても反応しません。AU fxは使えてます。

フリーで手軽にプラグインを作れる環境が他にないので、使える機能を使える間だけ、ありがたく使わせていただく、というスタンスです。

新規に[SonicBirth v2](http://sonicbirth.com)が開発中です。
こちらはまだアルファ版です。
同じアドレスを指すterm同士の同値チェックは定数時間で行われるか？

表題の件、少し気になったので調べてみた。

```erlang
$ erl
Erlang/OTP 18 [erts-7.1] [source-2882b0c] [64-bit] [smp:4:4] [async-threads:10][hipe] [kernel-poll:false]

Eshell V7.1  (abort with ^G)
> A_0 = lists:seq(1, 10000). % 一万要素のリスト
> A_1 = A_0.                 % `A_1`に`A_0`を束縛 (両者は同じアドレスを指すはず)
> B   = lists:seq(1, 10000). % 別に作った一万要素のリスト

%% 参考計測: `1 =:= 1`を一万回実行
> timer:tc(fun () -> lists:bforeach(fun (_) -> 1 =:= 1 end, A_0) end).
{7954,ok} % 7.8ミリ秒

%% `A_0`と`A_1`の同値チェックを一万回
> timer:tc(fun () -> lists:foreach(fun (_) -> A_0 =:= A_1 end, A_0) end).
{9840,ok}  % 9.8ミリ秒

%% `A_0`と`B`の同値チェックを一万回
> timer:tc(fun () -> lists:foreach(fun (_) -> A_0 =:= B end, A_0) end).  
{269874,ok} % 269.8ミリ秒
```

同じアドレスを指すterm同士は、ちゃんと定数時間で比較されている模様。

ソースコード的には[utils.cのeq関数](https://github.com/erlang/otp/blob/OTP-18.1.3/erts/emulator/beam/utils.c#L2603)と[erl_term.hのis_sameマクロ](https://github.com/erlang/otp/blob/OTP-18.1.3/erts/emulator/beam/erl_term.h#L1237)辺りがおそらく該当箇所。

```c:utils.c
int eq(Eterm a, Eterm b)
{
    DECLARE_WSTACK(stack);
    Sint sz;
    Eterm* aa;
    Eterm* bb;

tailrecur:
    /*** 一番初めにis_sameマクロ(下記)でアドレスの一致チェックを行っている ***/
    if (is_same(a, a_base, b, b_base)) goto pop_next;
tailrecur_ne:

    switch (primary_tag(a)) {
    case TAG_PRIMARY_LIST:
        if (is_list(b)) {
            Eterm* aval = list_val_rel(a, a_base);
            Eterm* bval = list_val_rel(b, b_base);
            while (1) {
                Eterm atmp = CAR(aval);
                Eterm btmp = CAR(bval);
                if (!is_same(atmp,a_base,btmp,b_base)) {
                    WSTACK_PUSH2(stack,(UWord) CDR(bval),(UWord) CDR(aval));
                    a = atmp;
                    b = btmp;
                    goto tailrecur_ne;
                }
                atmp = CDR(aval);
                btmp = CDR(bval);
                if (is_same(atmp,a_base,btmp,b_base)) {
                    /*** リストの場合、cdr部のアドレスが一致したら、以降の比較は省略される ***/
                    goto pop_next;
                }
                if (is_not_list(atmp) || is_not_list(btmp)) {
                    a = atmp;
                    b = btmp;
                    goto tailrecur_ne;
                }
                aval = list_val_rel(atmp, a_base);
                bval = list_val_rel(btmp, b_base);
            }
        }
        break; /* not equal */

    case TAG_PRIMARY_BOXED:
/*** 以下、略 ***/
```

is_sameマクロは、(HALFWORDエミュレーションがOFFの場合は)単にアドレスの比較のみを行っている。

```c:erl_term.h
#define is_same(A,A_BASE,B,B_BASE) ((A)==(B))
```
JavaのDate and Time APIを整理する

Java 8で追加されたDate and Time APIについてまとめる。

# 参考URL
[ここが大変だよJava 8 Date-Time API](http://www.atmarkit.co.jp/ait/kw/java8datetime.html)
[必修！ Date and Time API──Java SE 8の新日時APIの基本を学ぶ](http://builder.japan.zdnet.com/sp_oracle/weblogic/35067620/)
[詳解 Java SE 8 第24回 Date and Time APIの日付/時刻クラス](http://itpro.nikkeibp.co.jp/atcl/column/14/224071/022400019/)

# java.util.Dateやjava.util.Calendarの問題点
* 日時の計算機能が乏しい
* スレッドセーフではない
* Mutableなクラスであるため値が変更可能である
* 月が0オリジン
* 日付のみ、時刻のみを扱えない

# 新たに追加されたクラス
## ISO 8601ベースのクラス
### タイムゾーンを考慮しない
単純に年や月などの日付、時や分などの時刻で構成されるクラス。タイムゾーンや地域ごとの時差についての情報は持っていない。
* [LocalDateTime](http://docs.oracle.com/javase/jp/8/api/java/time/LocalDateTime.html)
* [LocalDate](http://docs.oracle.com/javase/jp/8/api/java/time/LocalDate.html)
* [LocalTime](http://docs.oracle.com/javase/jp/8/api/java/time/LocalTime.html)

### タイムゾーンが設定されたクラス
日付や時刻の情報に加えてタイムゾーンの情報を持っているクラス。地域によってサマータイムを導入しているなどの情報も持つ。
* [ZonedDateTime](http://docs.oracle.com/javase/jp/8/api/java/time/ZonedDateTime.html)

### UTCからの時差が設定されたクラス
日付や時刻の情報に加えてUTCからの時差情報を持っているクラス。地域の情報を持っていないためサマータイムなどは考慮されない。
* [OffsetDateTime](http://docs.oracle.com/javase/jp/8/api/java/time/OffsetDateTime.html)
* [OffsetTime](http://docs.oracle.com/javase/jp/8/api/java/time/OffsetTime.html)

### 各クラスの変換マップ![Date and Time API.png](https://qiita-image-store.s3.amazonaws.com/0/78109/87f4ee81-113b-291f-d8dd-5d75fe0b6eba.png)

## エポックからの経過時間を扱うクラス
* [Instant](http://docs.oracle.com/javase/jp/8/api/java/time/Instant.html)

## 期間を表すクラス
### 秒とナノ秒を基に期間を表すクラス
* [Duration](http://docs.oracle.com/javase/jp/8/api/java/time/Duration.html)

### 年月日を基に期間を表すクラス
* [Period](http://docs.oracle.com/javase/jp/8/api/java/time/Period.html)
[備忘録]Swiftの#ifdef


```
#if DEBUG
    // something code for DEBUG ...
#elseif HOGE
    // other something code for HOGE ...
#else
    // code for No Option...
#endif
```

設定で、Other Swift Flagsを設定する。

TARGETS -> Build Settings -> Swift Compiler - Custom Flags -> Other Swift Flags

-D DEBUGを設定すれば、DEBUG部が有効
-D HOGEを設定すれば、HOGE部が有効
いろいろな乱数の使い方


ビジュアルプログラミングに興味がありちょこちょこ書いているのですが、いろいろ書いているとよく乱数を使う場面に出くわします。
乱数にもいろいろなパターンがあったのでちょっとまとめてみました。

# 乱数の取り方
## 普通に取ってみる
基本の乱数取得です。Mathオブジェクトのrandomメソッドで乱数が取れます。
乱数は0以上1未満の値が返ってきます。

```javascript:app.js
var x = Math.random();
```

## -aからaまでの乱数を取得する
0~1ではなく-1~1などの値で取りたいパターンは以下のように書きます。

```javascript:app.js
var x = Math.random() * a * 2 - a ;
```


## aからbまでの乱数を取得する
もっと汎用性のある乱数を取りたいのであれば以下のようにすれば取れます。

```javascript:app.js
var x = Math.random() * (b - a) + a;
```

## aからbまでの整数の乱数を取得する
整数で乱数を返す際はMath.floor()で値を切り捨てにすればOK。
四捨五入だと最小値、最大値の出る確率が低くなってしまうので注意。

```javascript:app.js
var x = Math.floor(Math.random() * (b - a + 1) + a);
```

# 乱数でランダムに実行する

乱数を使用する例としてよくあるのが、ランダムに様々な処理を実行するパターンです。

## ランダムな実行方法
そんな時はたとえばこんな風にします。

```javascript:app.js
function circle(){ /*some code*/ }
function rect(){ /*some code*/ }

var x = Math.random();
if(x < 0.5){
	circle();
}else{
	rect();
}
```

上記の場合はcircle()、rect()のどちらかが実行されます。


## 確率をあやつってみる 
ランダムな処理でも、実行する確率をあやつりたいパターンがあります。

そんなときは

```javascript:app.js
function circle(){ /*some code*/ }
function triangle(){ /*some code*/ }
function rect(){ /*some code*/ }

var x = Math.random();
if(x < 0.4){
	circle();
}else if(x < 0.75){
	triangle();
}else{
	rect();
}
```

上記の場合はcircle()が40%、trangle()が35%、rect()が25%の確率になります。

## 別の方法で確率をあやつってみる 
またちょっと回りくどいですがこんなやり方もあります。

```javascript:app.js
function circle(){ /*some code*/ }
function triangle(){ /*some code*/ }
function rect(){ /*some code*/ }

var results = [];

results[0] = circle;
results[1] = circle;
results[2] = circle;
results[3] = triangle;
results[4] = triangle;
results[5] = rect;

function intRandom(a, b){
    return Math.floor(Math.random() * (b - a + 1) + a);
}

var x = intRandom(0, 5);
results[x]();
```

実行したい関数を配列に突っ込んで整数の乱数で処理を変更するパターン。
上記の場合 circle、triangle、rectが3:2:1の確率で実行されます。
配列に処理を多く突っ込めば突っ込むほど確率が高くなります。


# 正規分布
以下のようなコードを書くと中央に値が偏った乱数を取得できます。

```javascript:app.js
var x = Math.random() * Math.random()　* Math.random() * Math.random() * Math.random()* Math.random() / 6;
```

このような値を正規分布・ガウス分布とも呼ぶらしい。
[正規分布 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83)


こちらから引用させていただきました。詳しい説明も書いてあります。
[インタラクティブ・プログラミング勉強会 第1回 乱数 | fladdict](http://fladdict.net/blog/2014/10/visual-coding-1.html)


機械的な乱数よりも、より自然な乱数になります。
fastlane でアーカイブに失敗する問題の対処


fastlane で gym でビルドしようとしてたらアーカイブに失敗する問題に遭遇しました。

```
The generated archive is invalid, this can have various reasons:
[19:32:54]: Usually it's caused by the `Skip Install` option in Xcode, set it to `NO`
[19:32:54]: For more information visit https://developer.apple.com/library/ios/technotes/tn2215/_index.html
[19:32:54]: Variable Dump:
...
```

調べたら github 上で同様の issue が発行されていたようです。

https://github.com/fastlane/gym/issues/115

# 解決策

gym に use_legacy_build_api オプションを渡すとビルドできるようです。
※gym 内でのビルド方法が変わったみたいですね

```
    gym(
      workspace: 'myapp.xcworkspace',
      scheme: scheme,
      configuration: configuration,
      use_legacy_build_api: true
    )

```

これでアーカイブができるようになりました。
php側でコンソールログにデバッグ出力する方法

SPA（※Single Page Application）の構成でWebアプリを開発する場合にphp側のデバッグで困ったのでメモ。

var_dumpやechoなどが使えないのでphpでコンソールログにデバッグ出力する方法を探した。
そしたら↓のやり方で即解決した。
[ここ見たら一発](http://blog.asial.co.jp/1152)


[※SPAについての記事はこちらが分かりやすかった](http://qiita.com/zoetro/items/46d2a8b57f2645bb5033)
UbuntuにSlackのアプリをインストールする際の注意点

Ubuntuに[Slack](https://slack.com/)のアプリをインストールする際の注意点についてまとめたいと思います。

#間違った方法
`sudo apt-get install slack`コマンドを実行すると、別のアプリがインストールされてしまいます。

#正しい方法
[Apps | Slack](https://slack.com/apps)より、debパッケージをダウンロードし、それを使ってインストールします。
Xcode7のUITestingがステキ

# Xcode7のUITestingがステキ

## 経緯

今回、アプリの案件でガッツリテストも書いていきたいなーと思っていて、いろいろQuickFrameworkとか調べていると、Xcode7から操作をRecordしてUIのテストができる機能ができたとの記事[^1]を発見。

http://dev.classmethod.jp/smartphone/iphone/xcode-7-ui-testing/

試しにやってみた。

## 作り方

### 最初から作る

プロジェクトから作るやり方はさっきのの記事[^1]に書いてあるけど一応。

![スクリーンショット_2015_10_19_18_39.png](https://qiita-image-store.s3.amazonaws.com/0/28990/8f081d1a-77a7-e28e-6580-e4e6eac3189a.png)

### 既存のプロジェクトに追加する

既存のプロジェクトに追加するときはTargetを新しく作ってやります。

![SampleUserTesting_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/28990/04047924-adc9-a8aa-6a8e-41b571161ef1.png)


Nextを押すと、名前変更できますが、そのままでOK

### 適当にコードを書く

ひとまず、以下の様なStoryboardを作りました。

![Main_storyboard_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/28990/9ec61c84-9736-3555-43b0-f9fe6a62fded.png)


### テストを録画

![SampleUserTestingUITests_swift_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/28990/d6ef528f-97b0-64d1-5c26-02f5effa3f78.png)

録画したらもう、テストの完成ですが、日本語対応が上手くいっていません。

![SampleUserTestingUITests_swift.png](https://qiita-image-store.s3.amazonaws.com/0/28990/9623200e-2005-2534-fe9f-8fdc23d7a627.png)


ちゃんと直すと上手くうごきます。

## 実行
行番号が振られている、ひし形を押してやると実行されます。

![uitest.gif](https://qiita-image-store.s3.amazonaws.com/0/28990/dd45efd1-2251-03b6-b056-5796ac165295.gif)


## まとめ

予めある程度動くように作られたものじゃないと動かないのでTDDとかには向かないですが、いろいろ改修していく中でエラーが起きないかというチェックだけをコンピュータに任せてしまうのはいいかもしれません。

[^1]: http://dev.classmethod.jp/smartphone/iphone/xcode-7-ui-testing/
Vagrantを導入する


・VirtualBoxをインストール

・Vagrantをインストール

・BOXファイルを作成、もしくはHTTP経由でサーバーから取得
(プロジェクト指定のBOXが作成済みの場合はそれを利用する)

・BOXファイルをaddする
例：vagrant box add centos7 /Users/user/Documents/centos7_php56.box

・vagrantを初期化
vagrant init centos7

・Vagrantファイルが作成されるので、編集する
例：
   #config.vm.network "private_network", ip: "192.168.33.10" 
   の、コメントをはずす
   
  config.vm.synced_folder "/var/www/xxxx/htdocs", "/var/www/xxxx/htdocs"
を追記


・自PCのhostsファイルにバーチャル環境の設定を追加する
例：
192.168.33.10 xxxx


・vagrant起動
vagrant up
Hashの抽出

```
params = {:aaa => "a", :bbb => "b", :ccc => "c", :ddd => "d"}
```

から

```
=> {:aaa=>"a", :bbb=>"b", :ccc=>"c"}
```
を生成する。

```sample1.rb
params = {:aaa => "a", :bbb => "b", :ccc => "c", :ddd => "d"}
#1.
result_1 = {:aaa => params[:aaa], :bbb => params[:bbb], :ccc => params[:ccc]} 
#2.
result_2 = {}
[:aaa, :bbb, :ccc].each{|k| result_2[k] = params[k]}
#3.
result_3 = [[:aaa, :bbb, :ccc], params.values_at(:aaa, :bbb, :ccc)].transpose.to_h
#4. Rails拡張
result_4 = params.slice(:aaa, :bbb, :ccc)

p result_1
p result_2
p result_3
p result_4
```

```result1.
{:aaa=>"a", :bbb=>"b", :ccc=>"c"}
{:aaa=>"a", :bbb=>"b", :ccc=>"c"}
{:aaa=>"a", :bbb=>"b", :ccc=>"c"}
{:aaa=>"a", :bbb=>"b", :ccc=>"c"}
```
4.のみキーが存在しない際の動きが異なる。

```sample2.rb
params = {:aaa => "a", :bbb => "b", :ccc => "c", :ddd => "d"}
#1.
result_1 = {:aaa => params[:aaa], :bbb => params[:bbb], :hoge => params[:hoge]}.
#2.
result_2 = {}
[:aaa, :bbb, :hoge].each{|k| result_2[k] = params[k]}
#3.
result_3 = [[:aaa, :bbb, :hoge], params.values_at(:aaa, :bbb, :hoge)].transpose.to_h
#4. Rails拡張
result_4 = params.slice(:aaa, :bbb, :hoge)

p result_1
p result_2
p result_3
p result_4
```

```result2.
{:aaa=>"a", :bbb=>"b", :hoge=>nil}
{:aaa=>"a", :bbb=>"b", :hoge=>nil}
{:aaa=>"a", :bbb=>"b", :hoge=>nil}
{:aaa=>"a", :bbb=>"b"}
```

100000回実行時の処理速度

| No.        | time(s)             | 
|:-----------|--------------------:|
|1           | 0.05948762223124504 |
|2           | 0.08977324888110161 |
|3           | 0.13127699121832848 |
|4           | 0.19742310792207718 |
Groovyで数値の桁数を簡単に取得する方法(Log関数) 

#Math.log10(doble d)で数値の桁を取る


下記は10進法の例です。
例えば、桁数を単純に取りたいなら、結果の整数部分に対して+1すると桁数が求められる。

groovy: 
//10*10
assert Math.log10(100.0)==2
assert 10 **  2==100.0
//10*10*10
assert Math.log10(1000.0)==3
assert 10**3==1000.0

//結果は2.0211892990699383
println Math.log10(105)
//結果は105.00000000000004
println 10 ** 2.0211892990699383

私のように、Log関数とかが記憶の彼方な人は下記の解説が便利。
http://w3e.kanazawa-it.ac.jp/math/q-and-a/sisuu-taisuu/henkan-tex.cgi?target=/math/q-and-a/sisuu-taisuu/question24.html
rake assets:precompileが正しく動かない。

たまに`assets:precompile`が正しく動かない場合の対処法

```sh
bundle exec rake assets:precompile RAILS_ENV=production
```

うまくできているのだが、古いjsを見ている場合がある。

```sh
bundle exec rake assets:clobber RAILS_ENV=production
```

これでキャッシュを全て消し去れる。
ただ、やって良いかどうかは確認してからにしようw

※rails4以前では`assets:clear`

なんでこうなるんだろうか・・・・？？
R言語のfinallyは先に実行される？【間違えがあったため追記】

タイトル通りR言語でtryCatchをするときに、finallyは先に実行される？
Javaは最後に実行だったので驚いた。危うくバグを残すところだった。

```r:R言語
tryCatch({
  rep("A",-1)  # ここで無理やりエラーを起こす
}, error = function(e) {
  print("エラー")
}, warning = function(e) {
  print("ワーニング")
}, finnaly = {
  print("ファイナリー")
})
```

```r:実行結果
[1] "ファイナリー"
[1] "エラー"
```

本当に最初に実行される。「`rep("A",-1)`」よりも前に。
finallyは必ず実行する（最後とは言っていない）ということだろうか。

おまけ(java)

```java:java
try{
    int a = 0 / 0;  // ゼロディバイドを起こす
} catch(ArithmeticException e) {
  System.out.println("エラー");
} finally {
  System.out.println("ファイナリー");
}
```

```:実行結果
エラー
ファイナリー
```

finallyは先に実行しても後で実行しても大丈夫なコード書きを心がけないとなと思いました。

# 追記
よく見たら「finally」ではなく「finnaly」と書いてました（汗

```r:正しいfinally
tryCatch({
  rep("A",-1)  # ここで無理やりエラーを起こす
}, error = function(e) {
  print("エラー")
}, warning = function(e) {
  print("ワーニング")
}, finally = {
  print("ファイナリー")
})
```

```r:実行結果
[1] "エラー"
[1] "ファイナリー"
```

R言語でも後で実行ということに。
これ、もしかしたら適当な変数だと先に実行されるのかな？

```r:
tryCatch({
  rep("A",-1)  # ここで無理やりエラーを起こす
}, error = function(e) {
  print("エラー")
}, warning = function(e) {
  print("ワーニング")
}, aaaa = {
  print("適当な変数")
}, finally = {
  print("ファイナリー")
})
```

```r:実行結果
[1] "適当な変数"
[1] "エラー"
[1] "ファイナリー"
```

わああ、これはこれで気を付けなきゃ・・（汗
CakePHP1.2.5をPHP5.4環境でのStrict Standards対応

##概要
CakePHP1.2.5をPHP5.4環境で実行すると、
**Strict Standardsなるエラー**がガンガン出てくるので、
エラーを非表示にして通過しちゃおうと言うやつ。

##注意点
※バージョン変更出来るならこれはオススメしません。

##作業手順
CakePHPではフレームワーク中でerror_reportingを定義している為、
php.iniの設定が反映されないので、記述部分を直接書き換えてしまいます。
４つ目のファイルは書き換えなくて良いが、個人的に気持ちが悪いので…

##変更ファイル
```php:cake/bootstrap.php（33行目）
- E_ALL & ~E_DEPRECATED
+ E_ALL & ~E_STRICT & ~E_DEPRECATED
```
```php:cake/console/cake.php（144行目）
- E_ALL & ~E_DEPRECATED
+ E_ALL & ~E_STRICT & ~E_DEPRECATED
```
```php:cake/libs/configure.php（295行目）
- E_ALL & ~E_DEPRECATED
+ E_ALL & ~E_STRICT & ~E_DEPRECATED
```
```php:cake/tests/cases/libs/configure.test.php（165行目）
- E_ALL & ~E_DEPRECATED
+ E_ALL & ~E_STRICT & ~E_DEPRECATED
```
【MongoDB】「隠されたコレクション」の正体がわからない

最近お仕事でMongoDB 2.6を触ってるのですが、
よくわからないモノに遭遇したのでメモ。

とりあえず、新規DBにCappedCollectionを作成。

```
> mongo
> show dbs;
admin  (empty)
local  0.078GB
> use DB;
switched to db DB
> show collections;
// コレクションなし
> db.createCollection("Col", { capped : true, size : 16384 });
{ "ok" : 1 }
```
これでコレクションの作成完了。
この時点でインデックスを管理するコレクションが作られているはずなので、
コレクションの総数は 2 のはずである。

```
> show collections;
Col
system.indexes
```
うん、2つだ。
で、ここで`db.stats()`を実行。

```
> db.stats();
{
    "db" : "DB",
    "collections" : 3,
    "objects" : 4,
    "avgObjSize" : 80,
    "dataSize" : 320,
    "storageSize" : 32768,
    "numExtents" : 3,
    "indexes" : 1,
    "indexSize" : 8176,
    "fileSize" : 67108864,
    "nsSizeMB" : 16,
    "dataFileVersion" : {
        "major" : 4,
        "minor" : 5
    },
    "extentFreeList" : {
        "num" : 0,
        "totalSize" : 0
    },
    "ok" : 1
}
```
… collections が 3。
このコレクションひとつは一体どこへ…？

これを仮に「隠されたコレクション」と名づけて進めてみる。
DB全体でのobjects が4。これきっと公開情報だけじゃ数が合わないよね。

```
> db.Col.stats()
{
    "ns" : "DB.Col",
    "count" : 0,
    "size" : 0,
    "storageSize" : 16384,
    "numExtents" : 1,
    "nindexes" : 1,
    "lastExtentSize" : 16384,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 8176,
    "indexSizes" : {
        "_id_" : 8176
    },
    "capped" : true,
    "max" : NumberLong("9223372036854775807"),
    "ok" : 1
}
> db.system.indexes.Stats();
{
    "ns" : "DB.system.indexes",
    "count" : 1,
    "size" : 112,
    "avgObjSize" : 112,
    "storageSize" : 8192,
    "numExtents" : 1,
    "nindexes" : 0,
    "lastExtentSize" : 8192,
    "paddingFactor" : 1,
    "systemFlags" : 0,
    "userFlags" : 1,
    "totalIndexSize" : 0,
    "indexSizes" : {

    },
    "ok" : 1
}
```

count が 0 と 1。
4 - (0 + 1) = 3
隠されたコレクションはどうやら3つのドキュメントを持っているらしい。

dataSizeの差を見てみる。
320 - (0 + 112) = 208
3つで208のサイズ。等分はできない。

storageSizeの差。
32768 - (16384 + 8192) = 32768 - 24576
                       = 8192
8192 byte 取ってるらしい。

まとめると、
隠されたコレクション
　storageSize : 8192
　size : 208
　count : 3

そのうち追記します。
何かわかる方とかいらっしゃいましたらコメントをお願い致します。
Kobito をUbuntuで使いたい


初投稿です。いろいろ[記事](http://qiita.com/yasunori/items/bf651a961945550b983b)ありますが試して見ました。

## Why?

仕事で使っているOSがUbuntu 12.04だってので。(LTSだから…

```bash
[sayamada@bin]$uname -a
Linux B1308-66-01 3.13.0-65-generic #105~precise1-Ubuntu SMP Tue Sep 22 13:23:18 UTC 2015 i686 i686 i386 GNU/Linux
```

## 使ったもの

* node.js
* electron-prebuilt
* electron-packager

## 手順

### 1. WIndows版のKobitoのダウンロード
とりあえず[Windows版](http://kobito.qiita.com/win)のKobitoをダウンロードしました。


### 2. とりあえず起動確認
electronで直接起動確認しておきます。

```bash
$ cd <download_dir>/resources/app
$ electron .
```

### 3. パッケージング
このままでもいいですが、一応実行可能ファイルにしておきたいのでelectron-packagerで  
単体ファイルにしておきます。

```bash
[sayamada@app]$electron-packager . kobito  --out=/tmp --platform=linux --arch=ia32 --version=0.30.0 --overwrite
Packaging app for platform linux ia32 using electron v0.30.0
Wrote new app to /tmp/kobito-linux-ia32
```

とりあえずビルドして/tmpに書きました。versionは0.30のelectronでとりあえず作ってありますが、最新は[ここ](https://github.com/atom/electron/releases)から確認できるので最新にしたほうがいいかもです。
※初めて指定するバージョンは裏で勝手にバイナリダウンロードしてきます。

### 4. 動作確認

`/tmp/kobito-linux-ia32/kobito`に実行モジュールが吐き出されています。  
`/tmp/kobito-linux-ia32`に関連ファイルが出ているので適当なディレクトリに異動した上でPATHでも通せばOKです。私は、$HOME/binにシンボリックリンクを張ってます。

### 5. デスクトップランチャの登録

Ubuntuのサイドメニューから起動できる方がうれしそうですね。`$HOME/.local/share/applications`配下にdesktopファイルを作れば出来ます。以下をkobito.desktopとして保存しています。

```
[Desktop Entry]
Type=Application
StartupNotify=True
Name=Kobito
Comment=Kobito for Ubuntu
Icon="どこか"/icon.png
Exec="任意"/kobito-linux-ia32/kobito
Terminal=false
Categories=Development;IDE;
```

あとは、kobitoを起動するとメニューにアイコン付で表示されるのでランチャーに登録しておけばOKです。


## ということで

electronなおかげでUbuntuでもKobitoが使えていいですね！
環境変数の確認とパスの追加

#brew doctorの実行で失敗したら
Homebrewをインストールして試しにbrewコマンドが実行されない時には.bash_profileにbrewコマンドを追加してあげる必要があります。

例えば以下のようなコマンドが実行されない時。
```brew doctor```

**環境変数の確認**
```$ echo $PATH```
もし表示結果に`/usr/local/bin`がなければ追加してあげます。

**環境変数にパスを追加**
```$ echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile```
`export PATH=/usr/local/bin:$PATH`を`User/ユーザー名/.bash_profile`に書き込んでいます。

**bashの設定を再読み込み**```
$ source ~/.bash_profile```
※追加しただけではすぐ反映されないので再読み込みが必要

#まとめ
brewコマンドが実行できなかったら.bash_profileにパスを追加してみる！
Redmineのプラグイン「Easy gantt」をメンバーにも使えるようにする方法

## Easy ganttとは
https://www.easyredmine.com/redmine-gantt-plugin
RedMineのプラグインで、ガントチャートにてDrag&Dropにて開始予定日、終了予定日を変更できたり、他タスクとの親子関係をつけられる素敵なプラグインです。
インストールするには、Redmineのバージョンが3.x以上であることを確認します。
今回利用したのはFreeのほうです。
## Redmineのアップグレード
http://redmine.jp/guide/RedmineUpgrade/
を参照し、2.5.1ー＞3.1.1に無事あげました。
Redmineのフォルダ名を変える場合はhttpd.confも編集する必要があります。
インストールは一般的なプラグインのインストールと同じでした。
## プロジェクトの設定
プロジェクトごとに「設定」->「モジュール」にて「Easy gantt」にチェックを入れます
![設定-モジュール-Easygantt.png](https://qiita-image-store.s3.amazonaws.com/0/72978/9c07529e-be1c-f576-eba4-6d13c4803502.png "設定-モジュール-Easygantt.png")

## ロールの設定
わたしはここでつまずきました。
システム管理者では、上記の設定で使えるようになりますが、その他のメンバーでは使えません。以下の作業で使えるようになりました。
「設定」->「ロールと権限」->「Easy gantt」のメニューにチェックを入れます。
これで、システム管理者以外も「Easy gantt」を使えるようになりました。

![メンバー-ロール.png](https://qiita-image-store.s3.amazonaws.com/0/72978/37288cb4-e278-56c6-b308-fc0b0671f2d4.png "メンバー-ロール.png")
OS X El Capitan (10.11)にaws cli をインストール

El Capitanにアップデートしたらaws cliのアップデートが出来なくなってしまいました。

```bash
Installing collected packages: six, python-dateutil, botocore, awscli
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-7.1.0-py2.7.egg/pip/basecommand.py", line 223, in main
........
```

上記の様なエラーがでます。pythonはよくわからないんですが、とりあえずsixってパッケージがアンインストール出来ないようです。

```bash
pip uninstall six
```

とやってもダメです。ちなみにOSXに最初から入っているpythonです。
色々考えるのが面倒なので[ここ](https://www.python.org/downloads/)から3系をダウンロードして別途pythonをインストール。
そうすると`/usr/local/bin`にpython3.5,pip3.5その他のシンボリックリンクが貼られるので、これを使用してインストール。そして、インストールされたawsへ`/usr/local/bin`からシンボリックリンクを貼りました。

```bash
pip uninstall awscli
php3.5 install awscli
cd /usr/local/bin
ln -s /Library/Frameworks/Python.framework/Versions/3.5/bin/aws aws
```


```bash
aws --version
aws-cli/1.8.13 Python/3.5.0 Darwin/15.0.0
```
ターミナルをいじってるとzshが「command not found」と叫ぶので、叫ばないようにした

Terminalでコマンド打ってると、ちょいちょい以下のような叫びを見かけました。

```
% brew -v
zsh: command not found: brew
```

このコマンドに出くわすたびに、
[ヾ(oﾟωﾟo)ﾉﾞzshが「command not found」と云う](http://qiita.com/harapeko_wktk/items/285d5c2a409346e3d55e)を参考に対応してたのですが、そろそろこの関係を終わりにしたいなと決意

結論としては、
[zshにしたときにbrewコマンドがcommand not found になる](http://taqi.hatenablog.com/entry/2014/11/12/222437)を参考に

zshenvファイルを開き、

```
vi .zshenv
```

この設定を記載し、保存しました。

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


その結果、わだかまりない、清々しい関係になりました。

```
% brew -v                                                                                                                                     (git)-[staging]
Homebrew 0.9.5 (git revision 7623d; last commit 2015-09-17)
```

おしまい。
CentOS 5 に Pound 2.7 をインストールして、SSLv3.0 を無効化する


Pound on CentOS 5 での POODLE 対策ですね。

Pound 2.7 から設定に`Disable PROTO`が追加されたので、これで簡単に SSLv3.0 を無効にすることができます。
http://www.apsis.ch/pound

ここでは、CentOS 5 に Pound の SRPM から RPM を生成して、インストールします。

## RPM 生成に必要なツールのインストール

開発ツールをインストールします。

```bash
$ sudo yum -y groupinstall 開発ツール
$ sudo yum -y install rpm-build yum-utils openssl-devel pkgconfig pcre-devel
```

## Pound の SRPM から RPM を生成し、インストール

Pound 2.7 の SRPM を取得し、RPM を生成します。

```bash
$ wget http://www.invoca.ch/pub/packages/pound/RPMS/ils-5/SRPMS/pound-2.7-6.el5.src.rpm
$ sudo rpmbuild --rebuild pound-2.7-6.el5.src.rpm
$ ls /usr/src/redhat/RPMS/i386/pound-2.7-6.i386.rpm
/usr/src/redhat/RPMS/i386/pound-2.7-6.i386.rpm
```

生成した RPM をインストールします。

```bash
$ sudo rpm -ivh /usr/src/redhat/RPMS/i386/pound-2.7-6.i386.rpm
準備中...                ########################################### [100%]
   1:pound                  ########################################### [100%]
```

Pound を起動します。

```bash
$ sudo /sbin/service pound start
Starting pound:                                            [  OK  ]
```

## SSLv3.0 を無効化

Pound 2.7 の設定ファイル（/etc/pound/pound.cfg）には、`Disable SSLv3`がデフォルトで指定されており、SSLv3.0 が無効化されています。

```
(snip)
ListenHTTPS
    Address 0.0.0.0
    Port    444
    Cert    "/etc/pki/pound/pound.pem"
    Disable SSLv3 # <--- SSLv3.0 が無効
    Ciphers "ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:-LOW"
    xHTTP   1
End
(snip)
```

openssl コマンドで SSLv3.0 で接続すると、エラーになります。

```
$ openssl s_client -ssl3 -connect 127.0.0.1:444
CONNECTED(00000003)
6785:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1092:SSL alert number 40
6785:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:536:
```

TLSv1.0 であれば、接続可能です。

```
$ openssl s_client -tls1 -connect 127.0.0.1:444
CONNECTED(00000003)
depth=0 /C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=localhost.localdomain/emailAddress=root@localhost.localdomain
verify error:num=18:self signed certificate
verify return:1
```
Mac でのバックスラッシュの入力方法 (画像あり) - Windowsユーザーのために

Option を押しながら ¥ を押そう。 

![IMG_9426.JPG](https://qiita-image-store.s3.amazonaws.com/0/90607/c8d85390-1fe7-adad-07c4-363c75099ead.jpeg)

キーボードにもよるけど。
¥ はたぶん、バックスペース ( BS ) の隣にあるはず！

---

## 余談

Macを使い始めてから。バックスラッシュが入力できないまま、2ヶ月ぐらい過ごしていた。

何度か [解説記事](http://qiita.com/miyohide/items/6cb8967282d4b2db0f61) は読んでいたのだが。
盲目に、¥ ではなくて \ を押し続けていた。

一番の誤解の元となったのは。
Windows では ¥ と \ は同じものだが、Mac では別物だということだ。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
SimpleHTMLDomParserの導入


導入手順）

以下を参考に…

参考URL>
http://sato-san.hatenadiary.jp/entry/2013/05/06/155919

#問題1#
　サーバーエラー 500 になる

##調査##
　apacheのエラーログを確認

``PHP Fatal error:  Call to undefined function mb_detect_encoding() in /var/xxxxxx``

　→　関数なしが原因

##対応##
　php-mbstringをインストール

``yum install php-mbstring
vi /etc/php.ini
service httpd restart``

参考URL>
http://ameblo.jp/ofuji-memo/entry-10359194696.html
railsで続きを読みたかったら会員登録の実装

# はじめに
続きを読みたかったら無料会員登録してねってよくある感じの機能を実装したいと思い、試行錯誤してやりました。初心者が試行錯誤した感じなのでもっといいやり方があるよって方はぜひコメントください。

# データの構成
Articleモデルに、紐づいて、Itemモデルが多数あります。見出しと本文はItemモデルに入れるようになっています。


```ruby:article.rb
#  title                 :string(255)
class Article < ActiveRecord::Base
  has_many :items
end
```

```ruby:item.rb
# head                 :string(255)
# body                 :text
class Item < ActiveRecord::Base
  belongs_to :article
end
```

# 続きを読みたかったら登録してねの実装
ユーザーがログインしているかどうかはdeviseで実装しています。

```html+erb:/articles/show.html.erb
<% if user_signed_in? %>
  <%= render "_article" %>
<% else %>
  <%= render "_require_login" %>
<% end %>
```

```html+erb:_require_login.html.erb
<% num = 0 %>
<% @article.items.each do |item| %>
  <% num = num + item.body.size %>
  <% if num < 400 %>
    <h2><%= item.head %></h2>
    <div><%= item.body %></div>
  <% elsif num - item.body.size < 400 %>
    <h2><%= item.head %></h2>
    <div><%= truncate(item.body), length: 400 - (num - item.body) %></div>
  <% end %>
<% end %>

<% if num > 400 %>
  <% link_to "無料会員登録して続きを読む", hoge_path %>
<% end %>
```

文字数をカウントするために、viewでnum = 0を定義しました。その上で、numが400文字までは普通に表示します。

始めに400文字をオーバーしてしまう段落については、見出しと400文字未満までの文字をtruncateで見せてあげます。

その後400文字以上の部分については会員登録して読んでねとリンクを貼ってあげて終了です。続きを読む部分を曇りガラス的にぼかすCSSについてはこちらのページを参考にしました。

[CSS3で画像の一部をiOS（曇りガラス）風にぼかす方法：レスポンシブ対応](http://www.webopixel.net/javascript/975.html)

# 最後に
何だかviewにロジックをゴリゴリ書く感じがあんまりよくないなーと思いながらも実装できたのでよしとしようかと思っています。もっといいやり方があれば指摘していただけるとうれしいです！
Railsのrakeでasset:precompile前に任意のタスクを流してをjsをビルドする


production でasset:precompile前にgulpを流したい。asset:precompileはdigestとかは任せたい。

```ruby
namespace :js do
  desc 'Run gulp tasks before assets:precompile'
  task :build do
    sh 'npm install; $(npm bin)/gulp'
  end
end

task 'assets:precompile' => ['js:build']
```
gem を全部アンインストールする



ちょっと環境を整理したくて gem を一度全部削除したくなったのでやり方を調べました。

下記コマンドでアンインストールできます。

```
t-fujiki$ gem uninstall -aIx
```

参考：http://guides.rubygems.org/command-reference/#gem-uninstall