OmniAICreator/Qiita-1.07M huggingface dataset:
ansibleでnvmを管理する

# ansibleでnvmを管理する

nodejsのバージョンを最新にしておきたいということでyumではなくnvmを入れてnodejsを入れます。
サーバはansibleで全てを管理しているのでnvmもansibleで入れるんですが

* 既存のものはユーザごとにインストールする系しかない -> システム共通で入れたい
* `command:`でも`shell:`でもそのままだとnvmが実行できない

ことからredhat系で手直し版を作ったところ、わりかし面倒だったのでまとめときます。

https://github.com/leonidas/ansible-nvm

を参考にしてます。

## 問題点

まずシステム全体にnvmコマンドを置くためにnvm.shは`/etc/profile.d/`以下としたいところですが、インストールを行ったディレクトリにバイナリが配置されるので直接置くと残念なことになります。

そのため、インストール用のディレクトリ`{{nvm_install_dir}}`を用意した上で、`/etc/profile.d/nvm.sh`からそこを参照させるようにしました。

また、`nvm`は実体のあるコマンドではないので、`command:`だと実行がこけてしまう上、ansibleは`/etc/profile`をデフォルトは見ないということもあり、`nvm`実行はすべて`source /etc/profile`をした上で`shell:`で実行させています。
`nvm`実行はこのroleからしか行わないので割り切ってます。

最後に、`/etc/profile`を読み込まない問題は`node`と`npm`にも及ぶので、/usr/binにリンクを貼ってしまうことで解決しansibleのモジュール`npm:`で`npm`がそのまま使えるようにします。

nvm_node_versionを変えたらnvmのdefaultのnodeが変わり、`which node`や`which npm`も変わるのでバージョンが差し代わることになります。

## roles/nvm

```tasks/main.yml
- name: install requirements nvm
  yum: name={{item}} state=installed
  with_items: [ "gcc", "gcc-c++", "make", "openssl-devel", "zlib-devel", "gyp", "glibc-devel" ]

- name: create nvm directoryc
  file: dest={{nvm_install_dir}} state=directory
  tags: nvm

- name: install nvm
  get_url: url=https://raw.githubusercontent.com/creationix/nvm/{{nvm_version}}/nvm.sh dest={{nvm_install_dir}}/nvm.sh
  tags: nvm

- name: set profile
  template: src=nvm.sh.j2 dest=/etc/profile.d/nvm.sh
  tags: nvm

- name: Install {{ nvm_node_version }}
  shell: source /etc/profile && nvm install {{ nvm_node_version }}
  register: nvm_install_result
  changed_when: "'is already installed.' not in nvm_install_result.stdout"
  tags: nvm

- name: Check if {{ nvm_node_version }} is the default node version
  shell: source /etc/profile && nvm ls | grep -e 'default -> {{ nvm_node_version }}'
  register: nvm_check_default
  changed_when: False
  ignore_errors: True
  tags: nvm

- name: Set default node version to {{ nvm_node_version }}
  shell: source /etc/profile &&  nvm alias default {{ nvm_node_version }}
  when: nvm_check_default|failed
  tags: nvm

- name: which node
  shell: source /etc/profile &&  which node
  register: nvm_node_install_path
  changed_when: false
  tags: nvm

- name: link bin node
  file: src="{{nvm_node_install_path.stdout}}" dest=/usr/bin/node state=link force=yes
  when: nvm_node_install_path.stdout is defined

- name: which npm
  shell: source /etc/profile &&  which npm
  register: nvm_npm_install_path
  changed_when: false
  tags: nvm

- name: link bin npm
  file: src="{{nvm_npm_install_path.stdout}}" dest=/usr/bin/npm state=link force=yes
  when: nvm_npm_install_path.stdout is defined
```
```templates/nvm.sh.j2
#!/bin/sh

source {{nvm_install_dir}}/nvm.sh
```
```defaults/main.yml
nvm_version: v0.4.0
nvm_install_dir: /opt/nvm
nvm_node_version: "0.10"
```
Android StudioのGradleでMaterial Design Libraryをインストール

iOSアプリ移植でAndroidアプリの製作に取り掛かっていて、デザインは踏襲しつつも
Androidらしくいきたいと思って、手っ取り早くMaterial Designを導入できそうだったので、
Material Design Libraryをインストールしてみたときの覚書です。

直接jarをインストールも良いですが、
Gradleでのインストールで思ったり簡単に導入できました。

1.プロジェクトの*build.gradle(app)*の*dependencies*に以下を追加

```buid.gradle(app)
compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
compile 'com.nineoldandroids:library:2.4.+'
```

2.追加した後に、一応Clean Projectを行ってからRebuild Project。
後は、layoutファイルで使いたいcomponentを使用する。

今のところ

```
com.gc.materialdesign.views.ScrollView
com.gc.materialdesign.views.ButtonRectangle
```

くらいしか使っていないので、もっと活用していく予定です。

あと、こちらの記事を読んで
http://qiita.com/Nunocky/items/3f8b94fdac1ed5afce1a
いまのところ被っていないようなので
Android Design Support Libraryとの併用も考えていこうかと検討中。

＜追記＞
ButtonRectangleを使用してみて
・backgroundに@drawableでのカラー指定ができない（shape系）
　MaterialDesignという時点でshapeは不要なのかもしれないですが、、、
・gravityの上下関係(top or bottomなど)を設定しているとテキスト位置がずれる
　ButtonRectangle内でcenterが有効になっているので、center以外を指定する場合は工夫が必要っぽい

※間違えていたら指摘ください。
CentOS6.6(x64)にPHP5.5をインストールする

rootになり、下記を実行する。

	rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
	rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

	yum install --enablerepo=remi --enablerepo=remi-php55 php php-devel php-mbstring php-mcrypt php-mysql

	php -v
	PHP 5.5.28 (cli) (built: Aug  6 2015 08:53:05)
	Copyright (c) 1997-2015 The PHP Group
	Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
C#のC/C++のdefine定数の定義方法

# C#のC/C++のdefine定数の定義方法

CもしくはC++の場合

```C:C/C++
#define MAX_STRING 256
#define ERROR_MSG "error!"
```

C#の場合変数を静的なクラスに~~static readonlyもしくは~~※ constで定義することで、C/C++のdefine定数のように扱うことができる。

※2016/04/13追記
readonly変数は初期化子またはコンストラクタ内で初期化できます。
defineは静的に値が決まっていますが、readonly変数は実行時に動的に値が設定されます。
そのため、C/C++のdefine定数とreadonly変数は同一のものとは言えません。

```csharp:C#
public static class Define
{
    // static readonlyの場合
    public static readonly int ST_MAX_STRING = 256;
    public static readonly string ST_ERROR_MSG = "error!"; 
    // constの場合
    public const int CS_MAX_STRING = 256;
    public const string CS_ERROR_MSG = "error!";
}
```

アクセスするときは以下のようにする。

```csharp:C#
public class Example
{
	public static void Main()
    {
        // static readonlyの定義
        var stVal = Define.ST_MAX_STRING;
		var stMsg = Define.ST_ERROR_MSG;
        // constの定義
        var csVal = Define.CS_MAX_STRING;
        var csMsg = Define.CS_ERROR_MSG;
    }
}
```
# 参考
<a href="https://msdn.microsoft.com/ja-jp/library/bb397677.aspx" target="_blank">https://msdn.microsoft.com/ja-jp/library/bb397677.aspx</a>
Stream.unfold/2 で無限 FizzBuzz

[無限リストによるエラトステネスのふるい](http://qiita.com/naoya@github/items/c71f614b5ed8c05b998c) でも書いたが Stream を使うと Elixir でも遅延評価な無限リストを扱うことができる。その Stream にあるコンストラクタ関数の一つであるところの `unfold/2` を使うと、再帰的に処理を行いながらアキュムレータに結果を積んでいく･･･というよくあるパターンを、無限リストとして実装できる。

カッとなって無限に FizzBuzz するストリームを書いてみた。 

```ex
fizzbuzz = fn
  {true, true}   -> "FizzBuzz"
  {true, false}  -> "Fizz"
  {false, true}  -> "Buzz"
  {false, false} -> nil
end

fst = Stream.unfold(1, fn(n) ->
  res = case fizzbuzz.({rem(n, 3) == 0, rem(n, 5) == 0}) do
    nil -> n
    s   -> s
  end
  {res, n + 1}
end)

fst |> Enum.take(100) |> IO.inspect
```

一見ただの FizzBuzz だが

```ex
fst |> Enum.take(100) |> IO.inspect
```

ここでストリームは `Enum.take/1` に評価されるまで遅延評価されている。`take(100)` なら 100件を、`take(10000)` なら 10,000 件をそのとき初めて処理する。何の役にたつかというと、何の役にも立たない。
PHPのCLIスクリプトでプログレスバー

PHPで長い時間のかかる処理(例えばデータベース間を何らかの変換をかませてデータ移行するバッチスクリプトなど)で途中経過の表示とかをしないとずっと走ってる間はダンマリなので本当にやってるのかどうか不安になる性分

かといって、var_dump()なりprint_r()は出力が冗長すぎ、節目節目にprint/echoするのもその節目間の処理が長い場合は結局不安なのは同じで、fluentdなり他のログサーバに吐き出すのもなあ・・・というときにyumとかのようにプログレスバーを出すのはどうでしょう？というお話

エスケープシーケンスを使ったりすれば自力でできないことはないんだろうけど、[PHP-CLI-Progress-Bar](https://github.com/guiguiboy/PHP-CLI-Progress-Bar)というものをありがたく使わせてもらう

例としてmysqlからデータを拾ってきて何かしらごにょごにょします、というスクリプトを(漢らしくmysqli直で使うあたりがいかにも使い捨てスクリプトっぽい) ~~


```json:composer.json
{
    "guiguiboy/php-cli-progress-bar": "dev-master"
}
```


```php:foobar.php
date_default_timezone_set('Asia/Tokyo');

require_once 'vendor/autoload.php';

$mysqli = new mysqli('localhost', '<<username>>', '<<password>>', '<<database>>');
$mysqli->set_charset('utf8');

$records = $mysqli->query('SELECT * FROM tableName');

$n = mysqli_num_rows($records);
$progressBar = new \ProgressBar\Manager(0, $n); // 0からnまでを扱うプログレスバーを作成
while ($record = $records->fetch_assoc()){
    /**
    *   ここで何か面倒な処理をしている
    */
    $progressBar->advance();    // バーの内部カウンタを1つ進める
}
$records->close();
$mysqli->close();

```
すると、デフォルトではこんな感じの出力に

20/20 [==================================================>] 100.00% 00:00:00

フォーマットは

処理済/全体 プログレスバー パーセンテージ 残り時間

の順番.
ドキュメントを読めば出力フォーマットを色々カスタマイズできるのでお好みで
Raid 0

* Linux Mint 17.2

## 参考

* [RAID setup - Linux Raid Wiki](https://raid.wiki.kernel.org/index.php/RAID_setup)
* 今回、/dev/sd[bc]1を用いる。fdisk>t>`fd`(Linux raid 自動検出)にしておく。

## パッケージインストール

```bash:
apt-get install -y mdadm
sudo mdadm --create /dev/md0 --level=stripe --raid-devices=2 \
  /dev/sdb1 /dev/sdc1
sudo sh -c "mdadm --detail --scan >> /etc/mdadm/mdadm.conf"

mkfs.xfs /dev/md0
mount /dev/md0 /mnt
```

```bash:再起動後もRAID認識させる
update-initramfs -u
```

### raidの停止方法

* [◇mdadmによるRAIDの解除◇初心者のためのLinuxサーバー構築講座](http://www.obenri.com/_raid_create/delete_mdadm.html)

```bash:
mdadm --misc --stop /dev/md0
```
ElixirでFizzBuzz書いてみた

Elixirに入門したのでFizzBuzzを書いてみました。書き方は色々あると思うので色んなパターンを見てみたいですね！

```elixir:fizzbuzz.ex
defmodule FizzBuzz do
  def fizz_buzz(n) do
    Enum.map_join 1..n, fn x ->
      cond do
        rem(x, 15) === 0 ->
          "FizzBuzz"
        rem(x, 3) === 0 ->
          "Fizz"
        rem(x, 5) === 0 ->
          "Buzz"
        true ->
          x
      end
    end
  end
end

IO.inspect FizzBuzz.fizz_buzz(30)
```

```
> mix run fizzbuzz.ex
"12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz1617Fizz19BuzzFizz2223FizzBuzz26Fizz2829FizzBuzz"
```
gitでpushしようとしたら403された話

新しくgitのアカウントを作り、ローカルでゴニョゴニョして、addしてcommitしてpushしたら↓のようなエラーが・・

```
$ git push origin master
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/hogehoge/rss.git/info/refs

fatal: HTTP request failed
```

### ここまでどうやったか

一応手順が間違ってなかったことを確認するために、
ここまでどうやって来たかをまとめて起きます。

#### A. githubでリポジトリ作成

最初にgithubでリポジトリを作りました。

#### B. ユーザ名登録

```
$ git config --global user.name "hogehoge"
$ git config --global user.email hogehoge@example.com
```

#### C. リポジトリの登録

```
$ git remote add https://github.com/hogehoge/rss.git
# 今回はrssという名前のリポジトリを作りました
```

#### D. sshキーの登録

```
(ローカルにて)
$ ssh-keygen -t rsa
```

これで、`~/.ssh/id_rsa.pub`をgithubに登録

#### E. いざPush！

```
$ git push origin master
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/hogehoge/rss.git/info/refs

fatal: HTTP request failed
```

おぉ・・・

## 解決策

リモートのURLにユーザ名を含めてあげる必要があるそうです。

```
$ git remote set-url origin https://hogehoge@github.com/ritukiii/rss.git
```

これで、git configでremoteのURLが変わったことを確認して変わってればOK.

## もう一度挑戦！！

pushしたらパスワード聞かれて無事に成功！

```
$ git push origin master
Password: 
Counting objects: 132, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (114/114), done.
Writing objects: 100% (132/132), 808.06 KiB, done.
Total 132 (delta 7), reused 0 (delta 0)
To https://hogehoge@github.com/ritukiii/rss.git
 * [new branch]      master -> master
```
技術英語 > way below normal / way much money


>way below normal

2000年頃にEnglish Journalで初めてみた気がする。

ここでwayは「ずっと」という意味で、「平均よりずっと下」となる。

<hr>
http://thecodist.com/article/how-many-programming-technologies-can-you-really-master

> they should be making <font color=red>way</font> more money than ...

<hr>
http://ejje.weblio.jp/content/way

> way
> [副詞・前置詞を強めて] 《口語》 はるかに，うんと.

<hr>
CentOS6.7(x64)からGitHubでcloneするときの手順


    git clone https://github.com/kenichiro-yamato/white_project.git

403 Forbidden　になる。

    ssh-keygen

Enter連打でキーを作成する。

    cat /root/.ssh/id_rsa.pub

キーの中身をコピペする。

    https://github.com/settings/ssh

にアクセスして、キーを登録する。

    git clone git@github.com:kenichiro-yamato/white_project.git

でクローンする。
CentOS6.7(x64)にgitをインストールする

rootになる。

    yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

    vi /etc/yum.repos.d/rpmforge.repo

el5 を el6 に書き換える。

    yum clean all

    yum install git

    git --version
指定したマイナーモードを表示しない(diminish篇)

Emacsにいろんなパッケージをインストールしていくと、べんりな反面、画面下部の行(**モードライン**)が圧迫されていく。

以前、[指定したマイナーモードを表示しない](http://qiita.com/tadsan/items/8b5976682b955788c262)を書いたけれど、もっと良いやつがあるので紹介する。

![mode-line-before](https://qiita-image-store.s3.amazonaws.com/0/4121/637159d6-7be8-f5fd-4d40-2853c5221dc7.png)

## 準備

Caskで[use-package](https://github.com/jwiegley/use-package)を使ってたら`diminish.el`も依存関係としてインストールされるので、追加で導入するものはない。

パッケージマネージャを利用しない場合、 https://github.com/emacsmirror/diminish からファイルを持ってくると良い。

> ### 宣伝
>
> 毎週土曜の午後10時からLingrにて[init.el読書会](http://emacs-jp.github.io/reading-init.el/)をやってるので、興味があればおいでください
> 参加方法などは http://emacs-jp.github.io/reading-initel.html を参照のこと ヾ(〃＞＜)ﾉﾞ


## diminish

* [EmacsWiki: Diminished Modes](http://www.emacswiki.org/emacs/DiminishedModes)
* https://github.com/larstvei/dot-emacs/blob/master/init.org

`safe-diminish`は以前[init.el読書会](http://emacs-jp.github.io/reading-init.el/)で上記の`init.org`を読んだときに知って拝借したもの。

```el:init.el
(defmacro safe-diminish (file mode &optional new-name)
  "https://github.com/larstvei/dot-emacs/blob/master/init.org"
  `(with-eval-after-load ,file
     (diminish ,mode ,new-name)))

(safe-diminish "abbrev" 'abbrev-mode)
(safe-diminish "auto-complete" 'auto-complete-mode)
(safe-diminish "eldoc" 'eldoc-mode)
(safe-diminish "flycheck" 'flycheck-mode)
(safe-diminish "flyspell" 'flyspell-mode)
(safe-diminish "helm-mode" 'helm-mode)
(safe-diminish "paredit" 'paredit-mode)
(safe-diminish "projectile" 'projectile-mode)
(safe-diminish "rainbow-mode" 'rainbow-mode)
(safe-diminish "simple" 'auto-fill-function)
(safe-diminish "smartparens" 'smartparens-mode)
(safe-diminish "smooth-scroll" 'smooth-scroll-mode)
(safe-diminish "undo-tree" 'undo-tree-mode)
(safe-diminish "volatile-highlights" 'volatile-highlights-mode)
(safe-diminish "yasnippet" 'yas-minor-mode)
```

`with-eval-after-load`を噛ますのは、ファイルがロードされたあとに確実にマイナーモードを隠せるようにするため。

第一引数に渡す文字列は、第二引数に渡すシンボルのモードが定義されてるファイル名を指定すると良い。実行時にそのマイナーモードがどのファイルで調べるには`M-x find-function`で探して、開かれたファイル名を指定するのが良い。

まあ、めんどくさいので`use-package`を使ってたら、次に紹介する方法の方がややこしくない。

## use-package

`use-package`を利用してるなら、定義をまとめることができる。

```el:init.el
(use-package yasnippet
  :diminish yas-minor-mode
  :init (yas-global-mode t))
```

`:diminish hoge-minor-mode`のように指定する。こちらで指定したものは`safe-diminish`では記述する必要はない。

筆者は`use-package`を利用しない一部のマイナーモードのみ`safe-diminish`を利用することにした。

## init.elの修正

2コミットに分けて修正したので、参考にどうぞ。

* [Use diminish instead of my/hiden-minor-modes · zonuexe/dotfiles@19d3909](https://github.com/zonuexe/dotfiles/commit/19d3909b4cd18be41e0623aa4a3fded877f120da)
* [Use :diminish instead safe-diminish · zonuexe/dotfiles@6fa00d5](https://github.com/zonuexe/dotfiles/commit/6fa00d5f1d1cc892a680865081018a43ae2b6b4d)

## 最後に

![mode-line-after](https://qiita-image-store.s3.amazonaws.com/0/4121/d59d0ebd-5360-1de7-8dee-d35c791f4b23.png)

どうでも良いのだけれど、`diminish.el`の末尾に謎ポエムが書かれてるので暇なら読むと良い。
> ### 宣伝
>
> 毎週土曜の午後10時からLingrにて[init.el読書会](http://emacs-jp.github.io/reading-init.el/)をやってるので、興味があればおいでください
> 参加方法などは http://emacs-jp.github.io/reading-initel.html を参照のこと ヾ(〃＞＜)ﾉﾞ
[WIP]PostgreSQLバックアップ

# pg_dump

- https://www.postgresql.jp/document/9.4/html/backup.html
- http://lets.postgresql.jp/documents/technical/backup/1

# pg_rman

- https://www.sraoss.co.jp/technology/postgresql/3rdparty/pg_rman.php
- http://sourceforge.net/p/pg-rman/wiki/ユーザマニュアル/
Linuxで一つのコアのCPU利用率が異様に高いのを何とかする

そういやこんなこと合って何とか解決したなあ。全然情報なくて困ったなあと思っていたので書いておきます。
#発端
Windowsの動作がいまいち重く、フォントも気に食わないのでLinux Mintに移行しようとしたのですが、タイトルに書いた現象が起きました。
`ps aux`コマンドで利用率の高いプロセスを探したところ、kworkerというプロセスがリソースを食っているのが分かりました。
#解決
このkworker,本来は起動時にちょこっと出る程度のおとなしいやつらしいのですが、何故か常にリソースを食って全力で妨害してきます。ググったところ、[askubuntu.com/questions/...](http://askubuntu.com/questions/176565/why-does-kworker-cpu-usage-get-so-high)このような記事を見つけたので、ここに書いている通りrootで`echo "disable" > /sys/firmware/acpi/interrupts/gpe13`したところ解決しました。
ただ、`@reboot`がうまく出来なかったので自分の場合は/etc/rc.localに`echo "disable" > /sys/firmware/acpi/interrupts/gpe13`を書いておきました。
gpe(数字)の数字の部分は人により異なる場合があるようなので、確認して値の高いものだけ`echo disable`してください。
技術的なことはさっぱりなのでよくわからないのですが、とりあえず解決できたのでよしとします。
#環境
Linux namachan-PC 3.16.0-38-generic #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
です。
#参考
[ubuntuでkworkerのcpu使用率がやたら高い](http://qiita.com/gooos/items/a97ae795f993c1adadb9)
[kworkerのCPU過負荷](http://amorph2020.blogspot.jp/2014/01/kworkercpu.html)
細かいことに関してはこちらのほうがしっかり書かれています。
この記事は単に「LinuxCPU 負荷」等で検索しても出てくるようにというだけの記事なので...
REST理論をわかりやすく。


# <i class="fa fa-cubes" style="font-size:1em;"></i> 前提
抽象的な概念。具体化しづらいことが難しいと感じるが全然難しくない。結局何者なのか？と聞かれたら、Webアプリケーションの設計規約。

# <i class="fa fa-book" style="font-size:1em;"></i> 原則


- ステートレスなクライアント/サーバープロトコル
- 全ての情報(リソース)に適用できるHTTPメソッドのセット
- リソースを一意に識別。
- ハイパーメディア(リンクのこと)を使用


### ◯ ステートレスなクライアント/サーバープロトコル
[ステートレスとは](http://e-words.jp/w/%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%AC%E3%82%B9.html)

RESTな考え方では、サーバーへのリクエストも、クライアントへのレスポンスもステートレスであることが必要。

### ◯ 全ての情報(リソース)に適用できるHTTPメソッドのセット
RESTな考え方では、リソースはそれぞれ固有のURIを持っており、それぞれのURIに対して、基本的に4つのHTTPメソッドでリクエストすることで、全てのリソースに対する操作を行う。4つのHTTPメソッドとは、

|  メソッド |  役割 |
|---|---|
|GET   | リソースの取得 |
|   POST|  リソースの新規作成 |
|  PUT |   既存リソースの更新|
|   DELETE|   リソースの削除|


### ◯ リソースを一意に識別
RESTな考え方では、すべてのリソースはURIで表されるユニークなアドレスを持つ。


### ◯ ハイパーメディア(リンクのこと)を仕様
今では結構当たり前。パソコンのOSに保存された設定情報に依存せずにリソースにリクエストすること。つまり、どのパソコンでも同じレスポンスが返ってくるリンクをHTMLとかXMLに含める。


### ※ クッキーとセッションを用いたアプリケーションはRESTではない。

[クッキーとセッションの仕組み](http://blog.takanabe.tokyo/2014/12/05/64/)

RESTはあくまで、固有のHTTPメッセージ(リクエスト/レスポンス)に対して、固有の表現を表示する。つまり、クライアント側はサーバーからのレスポンスをただ一意に読みこめば良い。逆にサーバー側もただ、クライアント側のリクエストを一意に返せば良い。しかし、クッキーとセッションの仕組みは、クライアント側(ブラウザ)にアクセスするためのクッキーを一時的に保存させてある。(だからログイン状態が保持される。)

つまり、HTTPレスポンスは同じでも、クライアント側がクッキーを保持していなければ、違う結果が表れてしまうという、RESTではない仕組みになっている。が、クッキーとセッションの仕組みはウェブアプリケーションにとって不可欠な仕組みである。

## <i class="fa fa-check" style="font-size:1em;"></i> まとめ
1. 全ての情報はリソースと表現
2. リソースに対するURIは一意
3. リソースを4つのHTTPメソッドで操作
4. メッセージ(リクエスト/レスポンス)はステートレス
5. OSの設定情報に依存しない

# <i class="fa fa-bookmark-o" style="font-size:1em;"></i> RESTfulとは？
RESTらしい〜Webサービス・システムのこと。

# <i class="fa fa-star" style="font-size:1em;"></i> REST理論のメリット

1. アプリケーション中のリソースがURIによって参照できる。
2. ステートレスにすることで、スケーラビリティが向上(一番のメリット)
3. シンプルで一貫性のある設計。リソースへの操作はCRUDの4種類という制約
4. 標準的なデータフォーマット(XML/JSON)を扱うことでほかサービスとの連携が容易になる。
5. REST理論に基づいたWEBアプリでは、インターフェースが固定されてるので、互換性の問題が発生しない。


# <i class="fa fa-diamond" style="font-size:1em;"></i> RailsにおけるRESTfulとは？　
1. 一つのモデルを、一つのリソースの集合(コンポーネント)と捉えている。
2. RDBMS(Relational DataBase Management System)の作成/読み取り/更新/削除(CRUD)操作と、4つの基本的なHTTP requestメソッド(GET/POST/PUT/DELETE)の両方に対応している。
WebSocketで計測したRTTを可視化してみる

# 回線品質を可視化
pingのRTTが不安定な方向に回線の品質が悪かったんで、グラフにしたら面白いはずだと思って実装したよ。

# RTTの計測方法
当初はpingの応答時間を取ろうと思ってたけども、アプリケーションからpingの結果とるのは通信レイヤが違うので実装が過激になりそう。
そこで今回はWebSocketでサーバからブラウザにpingを送り。ブラウザ側は即座にpongを送り返すことでRTTの計測をします。
これを２秒に１回ずつ計測し延々とグラフにしてみます。

# 実装
WebSocketといいつつSocket.IOを使って実装。
https://github.com/seiketkm/webping
Socket.IOはシンプルでわかりやすい。

[server.js（サーバ側）](
https://github.com/seiketkm/webping/blob/master/server.js)
[index.js(ブラウザ側)](https://github.com/seiketkm/webping/blob/master/client/index.js)

1. サーバ側で２秒ごとにping、
2. ブラウザ側ではpingを受け取ったらすぐさまpong
3. pongを受け取ったらrttを計算しブラウザに送信
4. rttをグラフにプロット。

という感じで、あまり難しいことはしてない。

# 動作キャプチャ

![スクリーンショット 2015-08-16 23.15.43.png](https://qiita-image-store.s3.amazonaws.com/0/19483/dee0e2b9-c8a3-b801-b613-c5459167cb42.png)
（Wimax）

![August_16__2015_at_1112PM.png](https://qiita-image-store.s3.amazonaws.com/0/19483/1964a8fc-97be-d959-b442-f7fb14493629.png)
(IIJmio)

こんな感じ、グラフは点が追加されるごとに新しい計測点が右から左に流れる。
[Cloud9](https://c9.io/)で作ってたので、ここで参照可能？
https://webping-seiketkm.c9.io
Cloud9の開発用のサーバ、どれくらい動き続けるのかよくわかってない。

WimaxだとRTTが1秒くらいかかってる時があって結構辛い通信環境。

# やろうとしたけどやめたこと
当初は同時に接続している端末のRTT情報をまとめて可視化しようと思ってたけど、増えたり減ったりする接続とグラフ描画に利用しているChart.jsのLineChartの制約でとりあえず未実装。
LineChartは同一の計測点に対して一つの値が必要なので、計測の開始地点が違うグラフや返ってこないこともあることを考えると複数の結果を重ねられる気がしなかった。

# 感想
リアルタイムに動くものはそれなりに面白くみえていいね。
AndroidのWebViewでPOST送信の結果をInterceptして解析する



# 結論
ない！
(ホントか！？誰か知っていたら教えて下さい。。)

# やりたいこと
1. WebViewでPOST送信を行う
2. レンダリング前に結果のHTTP-Header情報をスクレイピングしてアプリ内の別画面に遷移（Not WebView）

こんなことをやりたかったけど、どうやら難しい模様。。
単純にPOST送信結果をInterceptしてゴニョゴニョしたかったけど、Androidって受信したイベントをInterceptすることって出来ないんだね…
Electron+Aceを使って50行ぐらいで作る構文ハイライト付きJavaScriptエディタ

Electronに[Ace](http://ace.c9.io/)を組み合わせると、僅かなコードで構文ハイライト付きエディタアプリが作れるので、参考までサンプルを実装してみました。

※ (2016.05.24 修正) Electron v1.x 向けに記述を改めました。 Electron v0.x 系 では動作しません。

![スクリーンショット 2016-05-24 14.22.24.png](https://qiita-image-store.s3.amazonaws.com/0/43781/8cfcdd08-7413-252d-3828-6ec0fdbc4715.png)

アプリ画面にjsファイルをD&Dすると編集できます。保存機能は未実装です。

# 準備

前提条件として必要なものはnpmだけです。
最初にまだelectronを入れてなかったら、インストールします。

> $ npm install electron-prebuild -g

次にプロジェクトフォルダを作ります

> $ mkdir test-project
> $ cd test-project
> $ npm init -y

# Aceを入れる

> $ npm install ace-min-noconflict --save

# index.js を作る
以下のソースをindex.jsという名前でプロジェクトフォルダに保存します。
内容はElectronのサンプルコードほぼそのままです。

```index.js
const electron = require('electron');
const {app} = electron;
const {BrowserWindow} = electron;
let win;

function createWindow() {
  win = new BrowserWindow({width: 800, height: 600});
  win.loadURL(`file://${__dirname}/index.html`);
  win.on('closed', () => { win = null; });
}
app.on('ready', createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

app.on('activate', () => {
  if (win === null) createWindow();
});
```

# index.htmlを作る
以下のソースをindex.htmlという名前でプロジェクトフォルダに保存します。

```index.html
<!DOCTYPE html>
<html>
<head>
  <style>
    * {padding:0;margin:0;box-sizing:border-box;}
    html, body, #editor {width:100%;height:100%;}
  </style>
  <script>
    require('ace-min-noconflict');
    require('ace-min-noconflict/mode-javascript');

    var editor;
    window.addEventListener('DOMContentLoaded',function() { 
      editor = ace.edit("editor");
      editor.getSession().setMode('ace/mode/javascript');
      editor.$blockScrolling = Infinity; // ワーニングに対処
      if(process.platform == 'darwin') { // Ctrl+Pが効かない問題に対処
        editor.commands.bindKey("Ctrl-P", "golineup"); 
      }
      document.body.addEventListener('dragover', function(e) { 
        e.preventDefault(); 
      });
      document.body.addEventListener('drop', function(e) { 
        e.preventDefault(); 
        if(e.dataTransfer.files[0]) {
          var file = e.dataTransfer.files[0].path;
          if(/\.js$/.test(file)) { 
            openFile(file); 
          }
        }
      });
    });

    function openFile(file) {
      require('fs').readFile(file,'utf8', function(err,data) {
        editor.setValue(data,-1);
      });
    }    
  </script>
</head>
<body><div id="editor"></div></body>
</html>
```

# 完成

以上で完成です。プロジェクトディレクトリをelectronに食わせて起動します。

> $ electron .

# 制限
ace-min-conflict パッケージに worker-javascript.js が含まれないため、構文チェックは実行されません（コンソールに worker-javascript.js の読み込み失敗エラーが表示されます）。 

# おわりに

サンプルなのであくまで簡単に、ということでファイルの保存機能は付けていませんが、

- Electronの[Dialog](https://github.com/atom/electron/blob/master/docs/api/dialog.md)
- nodeの[fs.writeFile](https://nodejs.org/api/fs.html#fs_fs_writefile_filename_data_options_callback)

あたりを使うと簡単に実装できます。
Devise - email確認(confirmable)のテスト

#経緯

- アプリのURLを変更後にconfigの変更を忘れていたのにも関わらず、email確認ができなくなっているのに気づかなかった。
- 今後はテストで同様のミスを無くしたい。

#手順

```rb:Gemfile
#...
gem 'rails', '~> 4.2.3'
gem 'devise', '~> 3.4.1'
#...
group :test do
  gem 'rspec-rails'
  gem 'capybara'
  gem 'capybara-email'
  gem 'email_spec'
  #...
end
#...
```

```rb:/spec/rails_helper.rb
#...
require 'capybara/email/rspec'
#...
```

```rb:/spec/features/user_registration_spec.rb
require 'rails_helper';

# Adopted from http://www.vanderpol.net/2014/10/07/rspec-integration-tests-devise-user-registration/

describe 'User registration' do
  let(:submit) { "Create my account" }
  let(:user_email) { 'registration_test_user@example.org' }
  let(:user_password) { 'registration_test_password' }

  before :each do
    visit new_user_registration_path

    fill_in 'user_email', with: user_email
    fill_in 'user_password', with: user_password
    fill_in 'user_password_confirmation', with: user_password

    click_button submit
  end

  it "shows message about confirmation email" do
    expect(page).to have_content("A message with a confirmation link has been sent to your email address.")
  end

  describe "confirmation email" do
    # Include email_spec modules here, not in rails_helper because they
    # conflict with the capybara-email#open_email method which lets us
    # call current_email.click_link below.
    # Re: https://github.com/dockyard/capybara-email/issues/34#issuecomment-49528389
    include EmailSpec::Helpers
    include EmailSpec::Matchers

    # open the most recent email sent to user_email
    subject { open_email(user_email) }

    # Verify email details
    it { is_expected.to deliver_to(user_email) }
    it { is_expected.to have_body_text(/You can confirm your account/) }
    it { is_expected.to have_body_text(/users\/confirmation\?confirmation/) }
    it { is_expected.to have_subject(/Confirmation instructions/) }
  end

  context "when clicking confirmation link in email" do
    before do
      open_email(user_email)
      current_email.click_link 'Confirm my account'
    end

    it "shows confirmation message" do
      expect(page).to have_content('successfully confirmed')
    end

    it "confirms user" do
      user = User.find_for_authentication(email: user_email)
      expect(user).to be_confirmed
    end
  end
end
```

#参考資料

- https://github.com/dockyard/capybara-email
- https://github.com/bmabey/email-spec
- http://www.vanderpol.net/2014/10/07/rspec-integration-tests-devise-user-registration/
[rails]controllerのdry for 入門


dry前

```.rb
class BookController < ApplicationController

  def index
    @books = Book.all
  end

  def show
    @book = Book.find(params[:id])
  end

  def new
    @book = Book.new
  end

  def create
    book = Book.new(params[:book].permit(:title, :author))
    book.save
    redirect_to :root
  end

  def edit
    @book = Book.find(params[:id])
  end

  def update
    book = Book.find(params[:id])
    book.update(params[:book].permit(:title, :author))
    redirect_to :root
  end

  def destroy
    book = Book.find(params[:id])
    book.destroy
    redirect_to :root
  end
end

```

dry後

```.rb
class BookController < ApplicationController
  before_action :set_book, only: [:show, :create, :edit, update, :destroy]

  def index
    @books = Book.all
  end

  def show
  end

  def new
    @book = Book.new
  end

  def create
    @book = Book.new(book_params)
    @book.save
    redirect_to :root
  end

  def edit
  end

  def update
    @book.update(book_params)
    redirect_to :root
  end

  def destroy
    @book.destroy
    redirect_to :root
  end

  private
    def set_book

    end

    def book_params
      params[:book].permit(:title, :author)
    end
end

```


before_actionでset_bookを適用させた。
privateメソッドで、book_paramsを一つにまとめた
SwiftでのUnit Testのはじめかた

Swift で書いた Class の Unit Test を書こうとした時にハマったのでメモ

## Objective-C での Unit Test
![img0.png](https://qiita-image-store.s3.amazonaws.com/0/8300/67394a66-17c1-327c-0f1c-b70014dcfdde.png)
テスト対象のクラスがあり、
![img2.png](https://qiita-image-store.s3.amazonaws.com/0/8300/e9f92d53-bcbc-d830-ceaf-c0193c8143a1.png)
`Allow testing Host Application APIs`に✔して（デフォルトで✔されている）
![img1.png](https://qiita-image-store.s3.amazonaws.com/0/8300/a7b0997e-3634-3030-64c8-e2fc97cabb74.png)
普通にテストを書いて実行すればよかった。

## Swift での Unit Test
![img3.png](https://qiita-image-store.s3.amazonaws.com/0/8300/512537fa-4f13-78bc-e8ea-8d6d5a6f90e5.png)
何も考えずにテストを実行すると、テスト対象クラスが見つからず、`Use of unresolve identifier 'LogicA'` というコンパイルエラーが出る。
`Allow testing Host Application APIs`に✔していても関係ない。

### Swift1.2 以前
![img4.png](https://qiita-image-store.s3.amazonaws.com/0/8300/9abfcc7b-babc-16ef-59b4-426e5444b6eb.png)
テスト対象ファイルの File Inspector でちまちま ${PROJECT_NAME}Tests に✔していくか、

![img6.png](https://qiita-image-store.s3.amazonaws.com/0/8300/88805752-ddb6-2e55-595b-1dec57b67140.png)
「Build Setting > Compile Sources 」から複数ファイルを一気に ${PROJECT_NAME}Tests に含めるか
  
しかなかった。
でもこの方法だと、特に既存機能のテストを書いていこうとした場合に、
あるファイルの Target に ${PROJECT_NAME}Tests を追加するとその依存する別のファイルが芋づる式に必用になり非常にだるかった。


### Swift2 で追加された `@testable`
![img8.png](https://qiita-image-store.s3.amazonaws.com/0/8300/f043df9f-514e-f452-3bbb-0bdc99182133.png)
「Build Settings > Enable Testability」を`YES`にして

![img9.png](https://qiita-image-store.s3.amazonaws.com/0/8300/c0d654b4-e838-018e-9573-8f95f4d9dff6.png)
`@testable import ${PROJECT_NAME}`すると、${PROJECT_NAME}Tests をターゲットに追加しなくてもテストが可能になる。

---

参考URL
- http://natashatherobot.com/swift-2-xcode-7-unit-testing-access/
[rails]ViewのDRY


# partialを用いたdry 

dry前

```html.erb
<!DOCTYPE html>
<html>
<head>
  <title>hoge</title>
</head>
<body>
  <div>
    <% if @japanese.age >= 20 %>
      <p>もっと飲め!</p>
    <% else %>
      <p>飲むな!</p>
    <% end -%>
  </div>
  <div>
    <% if @american.age >= 22 %>
      <p>もっと飲め!</p>
    <% else %>
      <p>飲むな!</p>
    <% end -%>
  </div>
</body>
</html>
```

dry後

```html.erb
<!DOCTYPE html>
<html>
<head>
  <title>hoge</title>
</head>
<body>
  <div>
    <%= render partial: "app/views/hoge/alert", locals: {person: @japanese, adult_age: 20} %>
  </div>
  <div>
    <%= render partial: "app/views/hoge/alert", locals: {person: @american, adult_age: 22} %>
  </div>
</body>
</html>
```

partialファイル
app/views/hoge/_alert.html.erb

```html.erb
<div>
  <% if person.age >= adult_age %>
    <p>もっと飲め!</p>
  <% else %>
    <p>飲むな!</p>
  <% end -%>
</div>
```


# helperを用いたdry

dry前

```html.erb
<!DOCTYPE html>
<html>
<head>
  <title>hoge</title>
</head>
<body>
  <% if @user.age >= 18 %>
    <a href="http://matome.naver.jp/odai/2135298257006394001">リンクヘ飛ぶ</p>
  <% else %>
    貴方は未成年なので、閲覧できません。
  <% end -%>
</body>
</html>
```

dry後

```html.erb
<!DOCTYPE html>
<html>
<head>
  <title>hoge</title>
</head>
<body>
  <%= adult_check(@user.age)%>
</body>
</html>
```

app/helper/adult_check.rb


```
def adult_check(age)
  if age >= 20 
    return link_to "リンクへ飛ぶ", "http://matome.naver.jp/odai/2135298257006394001"
  else
    return "貴方は未成年なので、閲覧できません。"
end
```
三項演算子がfalse判定されるケース

| 値 | 結果 |
|:-:|:-:|
| false | false  |
| false(string) | true |
| 0 | false |
| -1 | true |
| "0" | true |
| null | false |
| undefined | false |
| "" | false  |

# テストコード

書いてみました。

```js
console.log("false")
console.log(false ? "true" : "false");

console.log("false(string)")
console.log("false" ? "true" : "false");

console.log("0")
console.log(0 ? "true" : "false");

console.log("-1")
console.log(-1 ? "true" : "false");

console.log("0(string)")
console.log("0" ? "true" : "false");

console.log("-1(string)")
console.log("-1" ? "true" : "false");

console.log("null")
console.log(null ? "true" : "false");

console.log("undefined")
console.log(void(0) ? "true" : "false");

console.log("empty string")
console.log("" ? "true" : "false");
```

[jsfiddle](https://jsfiddle.net/8845musign/zj5vg62s/1/)

# え？

-1は``true``となるんですね

あとで仕様を読みます。。。

http://www.ecma-international.org/ecma-262/6.0/#sec-conditional-operator
ErlangのBinary tree



```

%% 1> T1 = tree:insert("Jim Woodland", "jim.woodland@gmail.com", tree:empty()).
%% {node,{"Jim Woodland","jim.woodland@gmail.com",
%%        {node,nil},
%%       {node,nil}}}
%% 2> T2 = tree:insert("Mark Anderson", "i.am.a@hotmail.com", T1).
%% {node,{"Jim Woodland","jim.woodland@gmail.com",
%%        {node,nil},
%%        {node,{"Mark Anderson","i.am.a@hotmail.com",
%%               {node,nil},
%%               {node,nil}}}}}
%% 3> T3 = tree:insert("Anita Bath", "abath@someuni.edu", T2).
%% {node,{"Jim Woodland","jim.woodland@gmail.com",
%%        {node,{"Anita Bath","abath@someuni.edu",
%%              {node,nil},
%%               {node,nil}}},
%%        {node,{"Mark Anderson","i.am.a@hotmail.com",
%%               {node,nil},
%%               {node,nil}}}}}
%% 4> T4 = tree:insert("Kevin Robert", "myfairy@yahoo.com", T3).
%% {node,{"Jim Woodland","jim.woodland@gmail.com",
%%        {node,{"Anita Bath","abath@someuni.edu",
%%               {node,nil},
%%               {node,nil}}},
%%        {node,{"Mark Anderson","i.am.a@hotmail.com",
%%               {node,{"Kevin Robert","myfairy@yahoo.com",
%%                      {node,nil},
%%                      {node,nil}}},
%%               {node,nil}}}}}
%% 5> T5 = tree:insert("Wilson Longbrow", "longwil@gmail.com", T4).
%% {node,{"Jim Woodland","jim.woodland@gmail.com",
%%        {node,{"Anita Bath","abath@someuni.edu",
%%               {node,nil},
%%               {node,nil}}},
%%        {node,{"Mark Anderson","i.am.a@hotmail.com",
%%               {node,{"Kevin Robert","myfairy@yahoo.com",
%%                      {node,nil},
%%                      {node,nil}}},
%%               {node,{"Wilson Longbrow","longwil@gmail.com",
%%                      {node,nil},
%%                      {node,nil}}}}}}}
%% 6> tree:lookup("Anita Bath", T5).
%% "abath@someuni.edu"
%% 7> tree:lookup("Anita", T5).
%% undefined


-module(tree).

-export([empty/0, insert/3, lookup/2]).

empty() ->
    {node, 'nil'}.

insert(Key, Val, {node, 'nil'}) ->
    {node, {Key, Val, {node, 'nil'}, {node, 'nil'}}};

%% 一つのノードは`{node, {Key, Val, Smaller, Larger}}`で表現する
insert(NewKey, NewVal, {node, {Key, Val, Smaller, Larger}}) when NewKey < Key ->
    {node, {Key, Val, insert(NewKey, NewVal, Smaller), Larger}};

insert(NewKey, NewVal, {node, {Key, Val, Smaller, Larger}}) when NewKey > Key ->
    {node, {Key, Val, Smaller, insert(NewKey, NewVal, Larger) }};

insert(Key, Val, {node, {Key, _, Smaller, Larger}}) ->
    {node, {Key, Val, Smaller, Larger}}.

lookup(_, {node, 'nil'}) ->
    undefined;
lookup(Key, {node, {Key, Val, _, _}}) ->
    Val;
lookup(Key, {node, {NodeKey, _NodeVal, Smaller, _Larger}}) when Key < NodeKey ->
    lookup(Key, Smaller);
lookup(Key, {node, {_NodeKey, _NodeVal, _Smaller, Larger}}) ->
    lookup(Key, Larger).

```
caller ***** does not hold REAL_GET_TASKS; limiting output エラー


# 現象
Androidのバージョンを 5.1.1 へアップデートしたところ、以下のエラーが出るようになりました．

```
W/ActivityManager﹕ getRunningAppProcesses: caller 10204 does not hold REAL_GET_TASKS; limiting output
```

実行中のプロセスを取得するために `ActivityManager#getRunningAppProcesses` を呼ぶと上記エラーを吐きます．
また、これまではプロセス一覧がが返ってきていましたが、呼び出したプロセスの情報のみが返るようになっています．

# 原因
Android 5.0 (Lollipop) 以降、他のアプリ情報を取得するためのAPI(`ActivityManager#getRecentTasks`など)について、`GET_TASKS` パーミッションを与えるだけでは動作しなくなっていたのですが、`getRunningAppProcesses` だけは(何故か)動作していました．
これが、Android 5.1.1からいよいよ使用できなくなってしまったようで、ユーザアプリからは上記APIが動作しないようになっているようです．

参考: https://code.google.com/p/android-developer-preview/issues/detail?id=2347

# 対策
代わりにUsageStatsManagerを使います．
 参考: http://qiita.com/kgmyshin/items/35b002e42df2027fb56e
webページは見ることができるのにpingやsshが通らない時

ブラウザでwebページが見ることができるのにMacからのpingやsshが通らなかった。  

結局、RaspberryPiの本体をルーターに近づけたら通るようになった。
通信プロトコルの差に電波の強度が影響したんだろうか。
Bundlerでビルドオプションを指定する

gemコマンドでインストール時に

```bash
$ gem install nokogiri -- --use-system-libraries
```

というようにオプションを指定するとき、bundlerではどうやるのってなったので調べてみました

## やり方
`bundle install`をする前に

```bash
$ bundle config build.nokogiri --use-system-libraries
```

というコマンドを叩くと、`~/.bundle/config`(プロジェクトルート下ではなく**ホームディレクトリであること**に注意)という設定ファイルに以下の様な設定が追記されます。

```bash:~/.bundle/config
---
BUNDLE_BUILD__NOKOGIRI: "--use-system-libraries"
```

次回以降`bundle install`するときはそのオプションが適応されるようになります。

また、`--local`オプションをつけることで、ホームディレクトリ下ではなくプロジェクト単位の設定ファイルに設定を付与することができるようです。(@msfukuiさん多謝！)

```bash
$ bundle config --local build.nokogiri --use-system-libraries
You are replacing the current local value of build.nokogiri, which is currently nil
```

## Bundlerの設定の読み込み先と設定項目の確認

Bundlerの設定は

1. Railsルート下の .bundle/config
2. 環境変数
3. ユーザのホームディレクトリ下の .bundle/config

の３箇所から読み込まれ、この順番に設定を探します。

設定したBundlerの項目は、`bundle config`で確認することができます。

```bash
$ bundle config
Settings are listed in order of priority. The top value will be used.
build.nokogiri
Set for the current user (/home/vagrant/.bundle/config): "--use-system-libraries"

path
Set for your local app (/var/www/public/sample_app/.bundle/config): "vendor/bundle"

disable_shared_gems
Set for your local app (/var/www/public/sample_app/.bundle/config): "1"
```

どこの設定ファイルに書いてあるのか、ユーザーに紐付いているのかローカルアプリに紐付いているのかも書いていますね。
`bundle install --path vendor/bundle`としたときの`--path`の情報も書いてあるのがわかります。

>また、Railsコンソールからも`Bundler.settings["設定項目"]`で確認できるようです。

>```bash
>$ rails c
>> Bundler.settings["build.nokogiri"]
>=> "--use-system-libraries"
>```

### 参考
[bundle install で、gem install のオプションを指定する方法](http://www.kaeruspoon.net/articles/893)
[bundle config](http://ruby.studio-kingdom.com/bundler/bundle_config)
Ruby on Rails で　Foundation x kaminari を使ってみた


# Trigger

Ruby on Railsで某アプリケーションを作っています。
front-end frameworkで有名な[Foundation](http://foundation.zurb.com/)を使っているので、paginationで有名な[kaminari](https://github.com/amatsuda/kaminari)も導入してみたくやってみました。


# やり方

```shell-session
> rails g kaminari:views foundation
> tree app/views/kaminari/
app/views/kaminari/
|-- _first_page.html.erb
|-- _gap.html.erb
|-- _last_page.html.erb
|-- _next_page.html.erb
|-- _page.html.erb
|-- _paginator.html.erb
`-- _prev_page.html.erb

```

```erb:index.html.erb
<ul class = "pagination">
  <%= paginate @users %>
</ul>

```


# 結果
こんな感じに表示されます。

![kaminari_pagenation.png](https://qiita-image-store.s3.amazonaws.com/0/89700/373b325a-e0db-cd98-e86e-b4d60ca111f2.png)

[FoundationのPagination](http://foundation.zurb.com/docs/components/pagination.html)と同じだが。。


### 参考:Stack Overflow
http://stackoverflow.com/questions/21333480/how-to-use-kaminari-theme-for-zurb-foundation
Docker Engine 最新版のインストール

# 概要
ディストリビューション(CentOS等)のリポジトリでは必ずしも最新版の Docker Engine が配布されているわけではなく、通常は少し古い Docker Engine がインストールされてしまいます。

現在は Docker 社がの[リポジトリを公開](https://blog.docker.com/2015/07/new-apt-and-yum-repos/)しており、そこから最新版の Docker Engine を簡単にインストールできます。

端的に言うと、以下のコマンドを実行するだけでインストールできます。

```bash
$ curl -sSL https://get.docker.com/ | sh
```

これで終了なのですが、以下ではAWS EC2 上の CentOS に最新の Docker Engine をインストールした際の手順をまとめておきます(Docker 社のリポジトリでは、Amazon Linux 用の RPM が配布されていないため、CentOS を使っています)。

# 手順
EC2 上で CentOS のインスタンスを配備。CentOS は Marketpalce から選択可能。
![CentOS.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/821b4280-ea5a-77b4-5427-d73f610fb061.png)


インスタンスの起動後、"centos" というユーザーでログインして、まずはシステムを最新にアップデート。

```bash
$ sudo yum update -y

$ cat /etc/centos-release
CentOS Linux release 7.1.1503 (Core)
```

あとは、以下のコマンドを実行するだけ。スクリプトがダウンロード＆実行されて、自動で最新版の Docker Engine がインストールされる。

```bash
$ curl -sSL https://get.docker.com/ | sh
```

インストール完了後、Docker のデーモンを開始してバージョンを確認してみる。現時点(2015/08/15)での最新版である 1.8.1 がインストールされている。

```bash
# Docker デーモンの開始
$ sudo systemctl start docker.service

# Docker のバージョンを表示
$ sudo docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:19:43 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:19:43 UTC 2015
 OS/Arch:      linux/amd64
```

なお、"curl -sSL https://get.docker.com/ | sh" でダウンロードされるスクリプトは、以下のファイルを生成してリポジトリを追加し、"yum -y -q install docker-engine" を実行しているだけ。 なので同じことを手動でやっても最新版をインストールできる(baseurl 中の centos/7 という部分は環境に合わせて変更する必要あり。[ここ](https://blog.docker.com/2015/07/new-apt-and-yum-repos/)を参照)。

/etc/yum.repos.d/docker-main.repo：

```
ame=Docker main Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

# 参考サイト
[NEW APT AND YUM REPOS](https://blog.docker.com/2015/07/new-apt-and-yum-repos/)
[Installation on CentOS](https://docs.docker.com/installation/centos/)
Gradle の文字列置換ファイルコピーで、エンコーディングが指定できない問題の回避

Gradle の Copy タスクで filter メソッドを使うと、内容を書き換えつつファイルをコピーできる（ https://docs.gradle.org/current/userguide/working_with_files.html#filterOnCopy ）。だがこの際ファイルを JVM のデフォルトエンコーディングで開いてしまうため、文字化けが発生する場合がある（ https://issues.gradle.org/browse/GRADLE-1267 ）。

これを回避する一つの手段として次のように Ant の copy タスクを使用する手がある。

    task filterWithEncodig << {
        ant.copy(todir: 'copy_into_dir', encoding: 'UTF-8') {
            fileset(dir: 'copy_from_dir')
            filterset(begintoken:'@@', endtoken:'@@') {
                filter( token:'foo', value:'bar')
            }
        }
    }

補足：
Gradle copy task の filter メソッドに java.io.FilterReader 実装クラスを指定する方法の例として示される事の多い org.apache.tools.ant.filters.ReplaceTokens では、トークン開始・終了のマークに一文字しか指定できない（https://ant.apache.org/manual/Types/filterchain.html#replacetokens の begintoken, endtoken を参照）。この方法では文字列が指定できる。

参考：

* http://gradle.1045684.n5.nabble.com/How-do-I-configure-a-file-encoding-for-the-CopyTask-with-the-filter-for-replacing-tokens-td3311705.html
* http://stackoverflow.com/questions/10322148/gradle-change-begin-end-token-when-using-replacetokens
Skypeの3rd partyアプリケーション用cookbookを書いた

# 今北産業

1. Skypeの3rd partyアプリを動かすための[cookbook](https://supermarket.chef.io/cookbooks/skype-daemon)を作った
2. 競合と違い、VNCを使ったGUI操作がまったくいらないのが特徴
3. しかしMSはSkypeのAPIを縮小しつつあるので誰得今更感漂う

# 概要

Skypeはその成り立ちがP2Pメッセンジャーである関係からか、botを動かしたりチャット内容を取得するためにはSkype Desktop Application自体を動かす必要があります(ふだんチャットするために使っているものとまったく同じアプリケーション)。
CLI用のアプリケーションというものが一切ないため、サーバ上でbotを1つ動かすためには3rd Partyアプリケーションの認証やEURAの承認をすべてGUIを介して行わなければならない非常に残念な使用になっています。これではいちいちサーバを構築するたびにVNCで接続してGUI操作をする必要があるため、100台のサーバを構築するためには100回VNC操作をする必要があります。

* 参考
    * [Linux上で動くSkype用のbotを作る方法 - muddy brown thang](http://d.hatena.ne.jp/moriyoshi/20100926/1285517353)
    * [Ubuntu Server 12.04.2 LTSでSkypeのボットを動かすまでの手順 - orangain flavor](http://orangain.hatenablog.com/entry/20130223/1361629662)

しかし、EURAの承認や3rd Party APIの承認の記録はSkypeの設定ディレクトリの中にあるはずと思い
設定ディレクトリ内を調べた結果、かなりわかりやすい形でEURAの承認と3rd Party アプリケーションの承認が記録されていました。
そこでこのcookbookではSkypeを一度起動・終了させてデフォルトの設定ファイルを作成後、[直接設定ファイルを書き換えています](https://github.com/bigwheel/skype-daemon/blob/f482a0e11f031ff247c0e126845e7dc209f51b2e/recipes/default.rb#L61-L99)。
これにより今まで必要だったVNCによる接続・GUI操作をなくし、全自動でSkypeの3rd Partyアプリケーションを動作させることを可能にしました。
Bluemixでモジュールのインストールが必要となったとき

Node.jsやBluemixはまだはじめたばかり。独学で体系的には勉強してないので専門家から見ればレベルが低いかもしれないが、たぶん初心者ならこんなところでもつまづくと思うので書き記しておこうと思う。
*****
Bluemixで、Node.jsの実行環境で、モジュールのインストールが必要となったとき、一般のパソコンならnpmコマンドでインストールすることが出来るだろうが、Bluemixは仮想サーバーのため出来ない。（はず）
こんなときはpackage.jsonへ記述する。

例えば、jadeモジュールが必要となった場合。

```json:package.json(一部)
"dependencies": {
		"express": "4.12.x",
		"cfenv": "1.0.x",
		"jade": "1.1.4",
		"body-parser": "1.13.x"
	},
```

この４行目のように、package.jsonの中のdependenciesの値の中に、

```
"jade": "1.1.4"
```
のように

```
モジュール名：バージョン
```
を記載してあげると、デプロイ時にモジュールをダウンロードして組み込んでくれる。
【Swift】2つの配列を交互につなぎ合わせる

# Swift 3
```swift

let num = 1234

// Int -> [String]
let numList = String(num).characters.flatMap { String($0) }
print(numList)
// ["1", "2", "3", "4"]

let opeList = ["+", "-", "*"]
let zipped = zip(numList, opeList + [""]) // 要素数を合わせる
print(zipped)
// Zip2Sequence<Array<String>, Array<String>>(_sequence1: ["1", "2", "3", "4"], _sequence2: ["+", "-", "*", ""])

let equation = zipped.reduce("") { $0 + $1.0 + $1.1 }
print(equation)
// "1+2-3*4"
```

or

```swift

let num = 1234

// Int -> [String]
let numList = String(num).characters.flatMap { String($0) }
print(numList)
// ["1", "2", "3", "4"]

let opeList = ["+", "-", "*"]
let zipped = zip(numList, opeList + [""])
print(zipped)
// Zip2Sequence<Array<String>, Array<String>>(_sequence1: ["1", "2", "3", "4"], _sequence2: ["+", "-", "*", ""])

let concatenated = zipped.map { $0.0 + $0.1 }
print(concatenated)
// ["1+", "2-", "3*", "4"]

let equation = concatenated.joined()
print(equation)
// "1+2-3*4"
```


# Swift 2

```swift

let num = 1234

// Int -> [String]
let numList = String(num).characters.flatMap { String($0) }
print(numList)
// ["1", "2", "3", "4"]

let opeList = ["+", "-", "*"]
let zipped = zip(numList, opeList + [""]) // 要素数を合わせる
print(zipped)
// Zip2Sequence<Array<String>, Array<String>>(_sequences: (["1", "2", "3", "4"], ["+", "-", "*", ""]))

let equation = zipped.reduce("") { $0 + $1.0 + $1.1 }
print(equation)
// "1+2-3*4"
```

or

```swift

let num = 1234

// Int -> [String]
let numList = String(num).characters.flatMap { String($0) }
print(numList)
// ["1", "2", "3", "4"]

let opeList = ["+", "-", "*"]
let zipped = zip(numList, opeList + [""])
print(zipped)
// Zip2Sequence<Array<String>, Array<String>>(_sequences: (["1", "2", "3", "4"], ["+", "-", "*", ""]))

let concatenated = zipped.map { $0.0 + $0.1 }
print(concatenated)
// ["1+", "2-", "3*", "4"]

let equation = "".join(concatenated)
print(equation)
// "1+2-3*4"
```
CtrlPエクステンションでハイライト

CtrlPのウィンドウをハイライトする情報があまりなかったのでメモ。

```vim
function! ctrlp#xxx#init()
  " （中略）

  " highlight
  call ctrlp#hicheck('CtrlPGistaFilename', 'Identifier')
  syn match CtrlPGistaFilename ' [^\t]*\ze\t'

endfunction
```

CtrlPに表示する結果リストを作る`init()`の中で`ctrlp#hicheck('ハイライトグループ', 'リンク先')`でハイライトするグループ名とリンク先のハイライトグループを指定。
`syn`でハイライトするパターンなどを指定。

普通のシンタックスハイライト設定とそれほど変わらなかった。
`hicheck()`じゃなくて、単なる`hi`でもいけるのかもしれない。

ソース全文は[vim-ctrlp-gista](https://github.com/zeero/vim-ctrlp-gista)の`/autoload/ctrlp/gista.vim`を参照ください。
vimからGistを操作する素敵プラグイン[vim-gista](https://github.com/lambdalisue/vim-gista)（作者様に感謝）のオレオレCtrlPインターフェイスです。
同じ文字列を複数結合する in C

ある文字列`input`を複数個つなげた文字列`output`を生成する必要に駆られた。
例えば、`input`が`abc`だとすると、`output`として`abcabcabcabcabc`を生成する、という感じ。

これから、char型配列`input`の中身の文字列を5個つなげて、別のchar型配列`output`に吐き出す方法を考える。
`output`は`input`に比して十分に大きいものとする。
#そのまんま

```c
size_t input_len = strlen(input);
for(int i = 0; i < 5; i++){
	for(size_t j = 0; j <= input_len; j++){
		output[j + i*input_len] = input[j];
	}
}
```

配列`input`の中身を5回、`input_len`だけずらしてコピーする。
内側のforループの継続条件が`j <= input_len`なのは、最後にヌル文字を残すため。

おすすめ度:★★

#標準ライブラリ関数使えよ

```c
size_t input_len = strlen(input);
for(int i = 0; i < 5; i++){
	strcpy(output+i*input_len,input);
}
```

やってることは前と同じ。ただし標準ライブラリ関数を使ったことでネストが浅くなった。

おすすめ度:★★★

#文字列処理の十徳ナイフ

```c
sprintf(output,"%s%s%s%s%s",input,input,input,input,input);
```

文字列処理で何かと役に立つ`sprintf`だが、今回は適役ではないようだ。

おすすめ度:★

#結合するならこれだろ

```c
for(int i = 0; i < 5; i++){
	strcat(output,input);
}
```
"String Concatenation"というだけあってその通りのことをやってくれる。

ただ、これだと`output`が初期化されていない時に変なことになるので、こっちの方がいいだろう。
*2015/08/17 コメントを参考に編集*

```c
output[0] = '\0';
for(int i = 0; i < 5; i++){
	strcat(output,input);
}
```

おすすめ度:★★★★

#番外編:C++なら
真のC++erは裸の`char`型配列ではなく`std::string`を使う。

`input`、`output`を両方とも`std::string`として宣言しておけば次のようにできる。

```cpp
for(int i = 0; i < 5; i++){
	output += input;
}
```

#結論
`strcat`を使いましょう。
C++が使えるなら`std::string`を使おう。
CentOS7にEC-CUBE3を導入してみるメモ

Azure仮想マシンで作成したCentOS7にEC-CUBE3を導入してみる。

## 0.前準備
だいぶよろしくないけど、SELinuxが色々邪魔することが多いので、
http://rfs.jp/server/security/selinux01.html
辺りを参考にSELinuxを無効化しておくと吉。
謎の403エラーに悩まされずに済むかもしれない。

あと、タイムゾーンを適切に設定しておかないとインストール中にエラーを吐くので、

```bash
# timedatectl set-timezone Asia/Tokyo
```

でシステムのタイムゾーンを変更してから、php.ini内の

```ini:php.ini
date.timezone = "Asia/Tokyo"
```

を設定しておく。


## 1.httpd(Apache)のインストール
nginxで動かしたいと思いつつ、公式の要件にしたがってApacheでhttpdを導入。
このへんは山ほど参考資料があると思うので割愛。


## 2.phpのインストール
これまた山のように参考資料があるはずなので詳細は割愛。
必須PHPライブラリは以下(公式サイトより引用)
>pdo pgsql又はmysql phar mbstring zlib ctype session JSON xml libxml OpenSSL zip cURL fileinfo

### 2-1.php拡張ライブラリのインストール
上記の必須ライブラリはほとんど勝手にインストールされるが、一部インストールされないものがある。
このままだとapcとmcryptの2つが足りないと言われるはずなので、
EPELリポジトリを追加してからインストールする。

```bash
# yum install epel-release
# yum install php-mcrypt php-pecl-apcu
```

## 3.MariaDBのインストール
CentOS7の標準RDBMSはMariaDBっぽい？のでそれを使用。
これまた山のように(ry

インストールしたら文字コードをUTF-8に設定しておかないと後で泣く。かもしれない。

設定が終わったらrootでログインし、

```mysql
create database eccube3_db;
create user username identified by 'password';
grant all on eccube3_db.* to username;
```

のように、EC-CUBE用のデータベースとユーザーの作成、権限付与を行う。


## 4.EC-CUBE3のダウンロード
一応URIは以下。
http://downloads.ec-cube.net/src/eccube-3.0.2.tar.gz
会員登録しないといけないのが非常にめんどくさい…
直接サーバにダウンロードしたくなるが、curlしたら酷いことになったので注意。

(githubにリポジトリがあるので、https://github.com/EC-CUBE/ec-cube
からクローンするという手もあるかもしれない。やってないので自己責任で。)

## 5.ファイルの展開とパーミッションの変更
EC-CUBEをインストールしたい場所に展開。

手っ取り早い例としては、`/var/www/html`がドキュメントルートだった場合、
`/var/eccube-hogefuga.tar.gz`に本体を置いて、
`tar zxvf eccube-hogefuga.tar.gz`
のように展開する。

展開されたフォルダが`/var/eccube-hogefuga/`になるはずなので、
`mv eccube-hogefuga/ www/`みたいな感じでリネームすればそれだけでOK。

このままだとインストール中にパーミッションの警告が出るので、
htmlディレクトリのパーミッションを777にする必要がある。
`chmod 777 html`

## 6.外部ライブラリのインストール with Composer
github上のREADME.meに書いてある通り。

```bash
$ curl -sS https://getcomposer.org/installer | php
$ php ./composer.phar install --dev --no-interaction
```


## 7.Webインストーラでインストール
以上の準備が終わったら、ブラウザからインストール先のURIにアクセス。
インストーラが表示されるはずなので、あとは指示通りに。