OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてCentOS7を入れてみた


##概要
今年中にサーバー周りを触れておきたいと思いCentOS7を入れてみた
OSを入れるので自己責任でお願いします

##下準備
windows7の入ったパソコンに入れるので
コントロールパネル -> システムとセキュリティ -> 管理ツール
-> コンピューターの管理 -> ディスクの管理
としてCドライブあたりから空き領域(30GBくらいあれば大丈夫)を作る
[ここから（CentOSダウンロード）](https://www.centos.org/download/)ISOを取ってきてDVDに焼く

##インストール

###起動時
さきほどのDVDをパソコンにセットして電源をいれる
すると黒い画面が出てくる
そこでInstall CentOS 7を選択してEnterを押す

###最初の設定
言語の選択で日本語を選ぶ
(矢印キーで動かすと思いのでマウスで操作するといいかもしれない)
選択したら右下の[続行]を押す

##インストールメニュー画面

###インストール先
ローカル標準ディスクでインストール先のディスクを選択する
パーティション構成を行いたいにチェックを入れて完了を押す
パーティション構成画面が開くので
スキームを使用させますの下のところをLVMにして[+]を押す
新規マウスポインタの追加が出てくるので

1. マウスポインタを /boot を入力、割り当てる容量を768MBとする
2. マウスポインタを swap を入力、割り当てる容量を2GBとする
3. マウスポインタを / を入力、割り当てる容量を空欄にする

終わったら[完了]を押す

###ソフトウェアの選択
標準で最小限のインストールとなっているが、このままにするとOS起動時CUIのみが表示される
ここはやりたいことによって選択をすると良い
私はサーバーを建てたいので[サーバー(GUI使用)]にチェックをいれて、アドオンで[開発者ツール]にチェックをいれた
終わったら[完了]を押す

###他の項目について
他の項目は特に難しいところはないとおもう
インストールソースの設定はDVDから行うので不要
ネットワークは設定しとくと良い

##インストール開始
rootのパスワードを設定とユーザーの設定をする。
ユーザーの設定でフルネームは省略可能
終わったら後は待つだけ

##インストール終了後
[再起動]のボタンを押す
再起動するまえにDVDを抜かないとまたインストール画面出てきて面倒くさいことになる
起動後はライセンスに同意する

##CentOS7にログイン後
CentOS7にログインした後、再起動するとわかるが、、、
windows7に戻れなくなる
###windows7を起動できるようにする
端末を開く
Vimがわからない場合は[【Vim】Vim入門](http://qiita.com/knife0125/items/5e91176c8401acd6bb0a)

```端末
[hogehoge@hogehoge]$ su -
パスワード: rootのパスワード入力
[root@hogehoge]# fdisk -l /dev/sda
windows7が入ってるパーティションを探す
私はsda2入ってた
[root@hogehoge]# vim /boot/grub2/grub.cfg
次のコードを入力する(sda2の場合)
一番下の方にある
```

```shell-session:grub.cfg
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry "Windows 7"{
    set root='(hd0,1)'
    chainloader +1
}

### END /etc/grub.d/40_custom ###
```

打ち終わったらrebootとして再起動をかける
これでwindows7を選択することができた
同じ環境なハズなのにSSH接続が出来ないとき

Gitを使用している際にリモートレポジトリとのやり取りでSSH接続が必要なことってありませんか？
それもそれらをクライアントのGUIツール上（例えばGitHub Desktopの様なアプリなど）からではなく、コマンドライン上で行いたい時って。
Macだったらターミナルだったり、WindowsだったらGit標準ののBash（GitHubのPowerShellではない）という風に。
ここでは**同じ環境**つまりは**同じ端末**なのに、SSH接続が出来る時と出来ない時があるパターンとその解決法について説明したいと思います。

***

1. まずは以下のコマンドをターミナルなどで叩く。<br>
`ssh git@github.com`<br>
<br>
すると、SSH接続が上手く行っていない時には以下文言が表示されたりします。<br>
`Permission denied (publickey).`<br>
<br>
2. 次に以下のディレクトリを確認します。<br>
/Users/ユーザー名/.ssh<br>
このディレクトリのファイル名が自分の場合は以下の様になっていました。<br>
<br>
github_rsa, github_rsa.pub, known_hosts<br>
<br>
これらの鍵ファイルはGitHubのGUIクライアントツールを使っていた時に作ったものと思われます。つまりはこれらの鍵ファイルが参照されてないとSSH接続が出来ないということになります。<br>
基本的にはターミナル等でGitを扱おうとすると、デフォルトではid_rsa, id_rsa.pubというものを参照する様になっています。これを解決するには２種類の方法があると考えられます。<br>
<br>
・id_rsa鍵を新規作成しGitHubへの登録を行う<br>
・~/.ssh/configファイルへ設定の追加を行う<br>
→SSH鍵の生成の仕方や.sshのconfigファイルへの設定追加の方法などは別記事を参照ください。<br>
<br>
※id_rsa鍵を参照しているかどうかは以下のコマンドで確認が可能です。<br>
`ssh -vT git@github.com`<br>
identity fileの箇所にid_rsaを参照していることが確認できるかと思います。<br>
<br>
3. 最後に以下のコマンドを叩いて接続が出来ているかどうかを確認します。<br>
`ssh -l git -i ~/.ssh/github_rsa github.com`<br>
以下の内容が表示されれば接続に成功したことになります。<br>
<br>

>PTY allocation request failed on channel 0
Hi ユーザー名! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

MacであればキーチェーンにSSH接続情報を保存することで次回よりパスフレーズ等の入力を省略することが出来ます。

参考ページ
https://teratail.com/questions/23361
【Google App Engine】User Objects（日本語訳）

[原文](https://cloud.google.com/appengine/docs/python/users/userobjects)
誤訳等ありましたら、ご教示頂ければ幸いです。

#User Objects
（注意：このページで述べられているOpen IDの特徴は、廃止され、削除される見込みです。詳細は、[OpenID 2.0 Support Turndown](https://cloud.google.com/appengine/docs/deprecations/open_id)を参照のこと。） 

　Userクラスのインスタンスは、ユーザーを示します。Userインスタンスは、固有のもので比較することができます。もし、２つのインスタンスが同じであれば、２つは同一ユーザーのものと言えます。
　アプリケーションは、[users.get_current_user()](https://cloud.google.com/appengine/docs/python/refdocs/modules/google/appengine/api/users#get_current_user)関数を呼び出すことで、当該ユーザーのUserインスタンスにアクセスできます。

```py
from google.appengine.api import users

user = users.get_current_user()
if not user:
    # The user is not signed in.
else:
    print "Hello, %s!" % user.nickname()
```
　アプリケーションにどの認証オプションを用いていた場合でも、users.get_current_user()関数を用いることができます。
　Userインスタンスは、メールアドレスから構成されているといえます。

```py
user = users.User("Albert.Johnson@example.com")
```
　もしくは、federated_identityを有している場合、Userインスタンス下記のように使うこともできます。

```py
user = users.User(federated_identity="http://example.com/id/ajohnson")
```
　もし、Userの内容が既存のGoogleアカウントと合致しないメールアドレスで呼ばれた場合は、User Objectは新規に作成され、これは実際のGoogleアカウントと一致しないことになります。これは、誰かが、一旦自分のUser Objectがデータベースに登録された後に、改めて別のGoogleアカウントを作成した時にも起こります。既に登録されているユーザー情報は、新しくGoogleアカウントが作られた場合、合致することはありません。
　開発サーバを動かしている場合、登録された全てのUserオブジェクトは、有効なGoogleアカウントとして扱われます。
  有効なユーザーのUser objectは、固有のIDを各ユーザーに与え、ユーザーがメールアドレスを変更するまで、そのIDは変わりません。user_id()メソッドは、IDを文字列で返します。
　アプリケーションでどの認証メソッドを使ったとしても、User objectは同じフォームを持ちます。もし、GoogleアカウントからOpenIDに認証オプションを変更したとしても、既存のUser objectは有効であり続けます。

#データストアでUser objectを使う方法
　ユーザーIDは、固定的なものです。ユーザーIDは、key名、もしくは文字列として使うことができます。　それゆえ、Userの情報を使うときは、ユーザーIDを保存しておきたいことでしょう（そして多分、ユーザーとメールでコミュニケートするため直近のメールアドレスも）。下記の例は、当該ユーザーをユーザーIDと照合する方法です。

```py
from google.appengine.api import users
from google.appengine.ext import ndb

class UserPrefs(ndb.Model):
    userid = ndb.StringProperty()

user = users.get_current_user()
if user:
    q = ndb.gql("SELECT * FROM UserPrefs WHERE userid = :1", user.user_id())
    userprefs = q.get()
```
UserPropertyには、メールアドレスとユーザー固有のIDが含まれているため、データベースに保存しないことを強く勧めます。もしユーザーがメールアドレスを変更した場合、保存されている古いUserと新しいUserを照合しようとしても、合致しません。代わりに、ユーザー固有のIDを設けてそれで照合した方が良いです。
JenkinsのGit Pluginの設定の意味がやっとわかった

JenkinsでGitを使う時には[GitPlugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin)を使うと思いますが、この設定の細かな意味がわからずにいたのですが、いい加減本腰で調べてみました。

GitPluginの設定ではビルド対象のブランチを指定します。
ここでは複数のブランチを指定できるのですが、１つのジョブで複数のブランチを指定するとどれが対象になるのでしょうか？また、ある特定のブランチを明示的にビルドするにはどうすればいいでしょうか？

![Git設定](https://qiita-image-store.s3.amazonaws.com/0/47562/4a2fd767-ab5d-b7ae-889d-3a19dc8b509f.png)

動作を調べたところ、このブランチ設定は「ビルド対象ブランチ」というよりも「更新監視対象ブランチ」と言った方がよさそうです。
実際の動作は以下のようになっているようです。

1. ジョブが実行される
2. Gitをfetchし、リモートブランチの状態を収集
3. 以下の手順でビルド対象ブランチを収集する
    1. [Branches to build]の設定（対象ブランチ設定）が１つだけで、その定義(変数は展開済み)が明確なブランチ指定である(ワイルドカードや正規表現形式ではない）場合
        1. そのブランチの最新リビジョンをビルドしていなければ、ブランチ(リビジョン)を対象とする
        2. すでにビルド済みであれば、現在workspaceでチェックアウトしてあるブランチのHEADリビジョンを対象とする
    2. そうでなければ（対象ブランチ設定では１つに明確に決まらない場合）
        1. 全ブランチの中で、対象ブランチ設定にマッチし、そのリビジョンがビルドされていないものの一覧を対象とする
4. Step.3で収集したブランチ一覧の１つを、このジョブの実行対象としてチェックアウトする
5. Step.3のブランチ一覧が複数ある場合は、SCM更新検知トリガーを実行することで収集したブランチ１つずつをビルドするジョブを生成する


端的にいえば、以下のようです。

* ブランチ設定が単一ブランチを明示していればそのブランチをビルド（未ビルドかどうかは不問）
* 複数ブランチを対象にしていればそれらのブランチの中で未ビルドのブランチ全てをビルド
  * 未ビルドのブランチがなければ、workspaceにチェックアウトしているブランチをビルド

この動作を踏まえてかんがえると、基本的には１つのブランチが対象になるようにした方がよさそうです。その上で、変数を使って動的にブランチを変えるようにした方がよさそうです。
特に、例えば[ビルド・トリガ]の[定期的に実行]でmasterブランチを毎日ビルドさせたいような場合は、対象のブランチを明示する方法がないので単一ブランチ指定にしておく必要があるようです。
node-redでグラフ表示

#概要
node-redにwebsocketでつないで、グラフ表示する。
chart.jsをjsdo.itで実行する。
#写真
![gra.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/bebdff41-951b-e9ec-f8b0-d74dd7f3f33b.jpeg)
![gra2.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/b7264917-8ac8-2bf6-7927-e1a2a66ebdaa.jpeg)

#サンプルコード
```
var myChart;
window.onload = function() {
    var ctx = document.getElementById("chart").getContext("2d");
    var data = {
        labels : ["", "", "", "", "", "", "", "", "", "", ""],
        datasets : [{
            label : "temp",
            fillColor : "rgba(151, 187, 205, 0.2)",
            strokeColor : "rgba(151, 187, 205, 1)",
            pointColor : "rgba(151, 187, 205, 1)",
            pointStrokeColor : "#fff",
            pointHighlightFill : "#fff",
            pointHighlightStroke : "rgba(151, 187, 205, 1)",
            data : [20, 20, 20, 20, 20, 20, 20, 20, 20]
        }]
    };
    myChart = new Chart(ctx).Line(data, {
        scaleOverride : true,
        scaleSteps : 10,
        scaleStepWidth : 3.0,
        scaleStartValue : 10,
        scaleShowGridLines : false
    });
}
var websocket;
function setup() { 
    websocket = new WebSocket("ws://node-red /test0");
    websocket.onopen = function() {
        alert("CONNECTED"); 
    };
    websocket.onmessage = function(e) {
        var s = parseFloat(e.data);
        myChart.addData([s], "");
        myChart.removeData();
    };
    websocket.onerror = function(e) {
        alert("ERROR: " + e.data);
    };
}
setup();
```
Ansibleの勉強と実行環境の作成方法1

前提

* VirtualBoxのインストール
* Vagrantのインストール

ローカル環境ではMacを使っています。

```:bash
mkdir ansible_lessons
```
```:bash
cd ansible_lessons
```
```:bash
vagrant box add "centos_6.6" https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box
```
```:bash
vagrant init
```
```:bash
vi Vagrantfile
```

```:Vagrantfile
config.vm.define "host" do |node|
  node.vm.box = "centos_6.6"
  node.vm.hostname = "host"
  node.vm.network :private_network, ip: "192.168.43.51"
end
config.vm.define "web" do |node|
  node.vm.box = "centos_6.6"
  node.vm.hostname = "web"
  node.vm.network :private_network, ip: "192.168.43.52"
end
config.vm.define "db" do |node|
  node.vm.box = "centos_6.6"
  node.vm.hostname = "db"
  node.vm.network :private_network, ip: "192.168.43.53"
end
```

vagrantを立ち上げる

```:bash
vagrant up
```

vagrantのサーバーの確認

```:bash
vagrant status
```

ローカルからログインできることを確認

```:bash
vagrant ssh web
```

ローカルからログインできることを確認

```:bash
vagrant ssh db
```
```:bash
vagrant ssh host
```

```:bash
vi ~/.ssh/config
```

```:~/.ssh/config
Host web
  HostName 192.168.43.52
Host db
  HostName 192.168.43.53
```

sshのkeyを作成

```:bash
ssh-keygen -t rsa
```

webサーバーにログインできるようにする。

```:bash
ssh-copy-id web
```

ログインできることを確認

```:bash
ssh web
```

dbサーバーにログインできるようにする。

```:bash
ssh-copy-id db
```

ログインできることを確認

```:bash
ssh db
```

HostサーバーにAnsibleをインストールする。

```:bash
wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

```:bash
rpm -Uvh epel-release-6-8.noarch.rpm
```

```:bash
sudo yum install -y ansible
```

```:bash
vi hosts
```

```:hosts
[web]
192.168.43.52
[db]
192.168.43.53
```

Ansibleの疎通確認

```:bash
ansible all -i hosts -m ping
```

```:bash
vi playbook.yml
```

```:playbook.yml
---
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=ansible_test
```

ユーザーの作成

```:bash
ansible-playbook -i hosts playbook.yml
```

ユーザーの削除

```:playbook.yml
---
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=ansible_test state=absent
```

```:bash
ansible-playbook -i hosts playbook.yml
```

Ansibleのmoduleはここから確認できます。
http://docs.ansible.com/ansible/user_module.html


[続きはこちら](http://qiita.com/joji/items/021614bd313c2fc81745 "続きはこちら")
Bitbucket のpush,commitをslackに通知する方法



* UI/UXが悪すぎて毎回わからなくなるので、メモ


## 手順概要

1. Slack で Webhook URLをゲット
2. Bitbucket のレポジトリの Webhookにセット


## 1. Slack側でWebhook URLを取得する

* https://slack.com/apps に行く
* 右上の Configure をクリックする
* ログインしているなら、ログイン中の設定画面に行く
 * フックしたいSlackのチャンネルに入っている必要あり
 * https://名前.slack.com/apps/manage みたいなURL
* Installed Apps にBitbucketがないなら、検索して追加
 * Title includes のフォームのところ
* BitbucketのAppをクリック
* Configurationの中の "Add Configuration"ボタンをクリック
* チャンネルを選んで "Add Bitbucket Integration"ボタンをクリック
* Webhook URLをコピーする
* "Save Integration"ボタンを押して保存する


## 2. Bitbucket側で設定する

* レポジトリに行く
* 左メニューに一番下の"Settings"をクリック
* "Add webhook" ボタンをクリック
* Titleを書く
* Webhook URLをペーストして保存
ProcessingをLeapmotoinで動かしてみた

年末だし久々にProcessingでも触ろうかと思ったのでメモ。

使ったライブラリはこれ
https://github.com/onformative/LeapMotionP5

gitからzipファイルをDLして解答すると
「LeapMotionP5-master」
って名前なので↓の画像のように名前を変更してライブラリフォルダに突っ込む
<img width="635" alt="スクリーンショット 2015-12-27 17.57.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/15778/6d6c6d0d-03e4-4948-27dc-02f14eac5a95.png">

とりあえずREADME.mdに書いてあるサンプルを実行してみる

``` sketch_1.pde
import com.onformative.leap.LeapMotionP5;
import com.leapmotion.leap.Finger;

LeapMotionP5 leap;

public void setup() {
  size(500, 500);
  leap = new LeapMotionP5(this);
}

public void draw() {
  background(0);
  fill(255);
  for (Finger finger : leap.getFingerList()) {
    PVector fingerPos = leap.getTip(finger);
    ellipse(fingerPos.x, fingerPos.y, 10, 10);
  }
}

public void stop() {
  leap.stop();
}
```

こんな感じです。
![sketch_1-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/15778/e21950ed-8b4d-cb45-6300-cd2b40f59f33.gif)


これだけじゃ味気ないので、拾い物のパーティクルと組み合わせて
![sketch_2-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/15778/259d88af-e2d9-979a-f426-69cdb642e3d3.gif)


こんな感じです。
GlusterFSで 0-nfs: readv on XX.socket failed が出まくる問題の対応

GlsuterFSのNFS機能を使ってないのに `/var/log/glusterfs/etc-glusterfs-glusterd.vol.log` に↓こんなログが大量に出ていたら。

```text:/var/log/glusterfs/etc-glusterfs-glusterd.vol.log
[2015-12-27 09:26:31.241557] W [socket.c:588:__socket_rwv] 0-nfs: readv on /var/run/gluster/3b8b9a076198b28c9e93ab3085a45842.socket failed (無効な引数です)
[2015-12-27 09:26:34.241924] W [socket.c:588:__socket_rwv] 0-nfs: readv on /var/run/gluster/3b8b9a076198b28c9e93ab3085a45842.socket failed (無効な引数です)
[2015-12-27 09:26:37.242350] W [socket.c:588:__socket_rwv] 0-nfs: readv on /var/run/gluster/3b8b9a076198b28c9e93ab3085a45842.socket failed (無効な引数です)
[2015-12-27 09:26:40.242810] W [socket.c:588:__socket_rwv] 0-nfs: readv on /var/run/gluster/3b8b9a076198b28c9e93ab3085a45842.socket failed (無効な引数です)
[2015-12-27 09:26:43.243294] W [socket.c:588:__socket_rwv] 0-nfs: readv on /var/run/gluster/3b8b9a076198b28c9e93ab3085a45842.socket failed (無効な引数です)
[2015-12-27 09:26:46.243760] W [socket.c:588:__socket_rwv] 0-nfs: readv on /var/run/gluster/3b8b9a076198b28c9e93ab3085a45842.socket failed (無効な引数です)
```

ボリュームの `nfs.disabled` を確認して `false` だったら `true` に変えてあげましょう。

```shell-session:
[root@r17 glusterfs]# gluster volume get vol1 nfs.disable
Option                                  Value
------                                  -----
nfs.disable                             false
[root@r17 glusterfs]# gluster volume set saba2 nfs.disable true
volume set: success
```
CentOS7でKVM 環境構築

CentOS7 で KVM 環境を構築する

[Machine Spec]
CPU: AMD Athlon(tm) X2 Dual Core Processor BE-2400
MEM: 8GB
OS: CentOS7 [minimal install]
    CentOS7 を最小構成でインストール後、yum update を実行した
NIC: 2（一方の NIC を仮想ゲスト専用の NIC とする）

```
# yum update
```

仮想化関連パッケージのインストール

```
# yum groupinstall "Virtualization Host"
```

KVM のモジュールが読み込まれていることを確認

```
# lsmod | grep kvm
kvm_amd                60314  0
kvm                   461126  1 kvm_amd
```

ゲストマシン作成ツールをインストール

```
# yum install virt-install
```

仮想マシン制御を起動
自動起動設定

```
# systemctl start libvirtd
# systemctl enable libvirtd
```

仮想マシンのネットワークは NAT ではなく、ブリッジ接続とするため、ブリッジネットワークを構成する

```
# nmcli con add type bridge ifname br0
# nmcli con modify bridge-br0 bridge.stp no
# nmcli con modify bridge-br0 ipv4.method manual ipv4.address "192.168.1.200/24" ipv4.gateway "192.168.1.254" ipv4.dns 192.168.1.254
# nmcli c modify bridge-br0 ipv4.gateway ""
# nmcli c modify bridge-br0 ipv4.dns ""
```

物理 NIC enp2s7 をブリッジに接続する

```
# nmcli con add type bridge-slave ifname enp2s7 master bridge-br0
```

既存のインターフェースは削除

```
# nmcli con del enp2s7
```

Network Manager の再起動

```
# systemctl stop NetworkManager; systemctl start NetworkManager
```
アソシエーション図の作成

今回はCompanyモデルとCustomerモデルを作成。
今回の関係は以下の通り。


```models/company.rb
class Company < ActiveRecord::Base
  has_many :customers
end
```

```models/customer.rb
class Customer < ActiveRecord::Base

  belongs_to :company
  end
```

#graphvizをインストールする
```bash
$ brew install graphviz
```

#gem　rails-erdをインストール

```Gefile
group :development do
gem 'rails-erd'
end
```

```bash
$ bundle install
```

`gem list`でインストールできているか確認するとよい。

#PDFで出力する

```bash
$ rake erd
```
作成したrailsアプリケーション内にPDFで作成される


![kobito.1451207800.299344.png](https://qiita-image-store.s3.amazonaws.com/0/93394/aa0b9a70-30e0-17f2-1d0b-db027d55434c.png "kobito.1451207800.299344.png")
中央揃え


##Bootstrapのブロック中央揃え

```html
    //中央よせ
    <div class="center-block">
      <div>ブロックの中央よせ</div>
    </div>
```

##CSSの中央揃え(divなどのブロック要素)

```html
<div class="main">  
    <div>  
    <h2>ブロックレベル要素をセンタリング</h2>  
    <p>ブロックレベル要素</p>  
    </div>  
</div> 
```

```css
.main {  
    width: 100%;  
    border: 1px solid #000;  
}  
.main div   {  
    width: 80%;  
    border: 1px solid #FF0000;  
    margin: 0 auto;  
}
```

##CSSの中央揃え(テキストなどのインライン要素)

```css
h1{
  text-align: center;
}
```

##inputタグの中央揃え
```html
<div class="text-center">
　　<input class="btn btn-primary" id="send" name="commit" type="submit" value="送信">
</div>
```


##btn-group(Bootstrap)の中央揃え

```html
      <div style="text-align:center;">
        <div class="btn-group"  role="group">
          <%= link_to 'Show', sentence, class: "btn btn-primary" %>
          <%= link_to 'Edit', edit_sentence_path(sentence), class: "btn btn-success" %>
          <%= link_to 'Destroy', sentence, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-danger" %>
        </div>
      </div>
```

##参考
http://www.css-lecture.com/log/css-beginner/026.html
http://creatorclip.info/2014/05/css-layout-center/
Railsで任意のjavascriptだけを読み込む


##1. 共通で読み込みたいjavascrptをマニフェストに記述

```ruby:app/assets/javascripts/application.js
-  //= require_tree .  
+  //= require bootstrap
+  //= require calendar
+  //= require events
```

##2. app/assets/javascripts/ 配下に置かれているJSファイル群はAssets Pipeline の対象外になってしまうので以下の行を追加

```ruby:config/environments/production.rb
+  config.assets.precompile += ['*.js']
```

##3. 特定のページのみでjavascript読み込む

assets/javascript/chat.js.coffeeを読み込む場合

```html.erb
<%= javascript_include_tag 'assets/chat' %>
```

```ruby:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( chat.js )
```
railsでwebsocketを利用する


##1. gem(websocket-rails)をインストール

```ruby:Gemfile
gem "websocket-rails"
```

```bash:ターミナル
$ bundle install
```

##2. installation generatorを実行

```bash:ターミナル
$ rails g websocket_rails:install
      create  config/events.rb
      create  config/initializers/websocket_rails.rb
      append  app/assets/javascripts/application.js
```

##3. イベントルーターを設定する

```ruby:config/events.rb
WebsocketRails::EventMap.describe do
  
  subscribe :confirmation, to: WebsocketChatController, with_method: :connect_confirmation
  subscribe :event_confirmation, to: WebsocketChatController, with_method: :event_confirmation
end
```

##4. WebsocketRailsコントローラーを作成

```ruby:app/controllers/websocket_chat_controller.rb
class WebsocketChatController < WebsocketRails::BaseController

  def initialize_session
    # perform application setup here
    controller_store[:message_count] = 0
  end

  def connect_confirmation
  	broadcast_message(:confirmation, recieve_message)

  end

  # イベントをクライアントに送る
  def event_confirmation
  	recieve_message = message()
  	new_message = {:message => recieve_message}

  	# new_message = {:message => 'this is a message'}
		send_message :event_confirmation, new_message
  end
```

##5. javascriptクライアントを作成

```ruby:app/assets/javascript/...js.coffee
$ ->
	ws_rails = new WebSocketRails("192.168.33.10:3000/websocket")

	# 接続確認関数
	ws_rails.on_open = (data) ->
  	console.log('Websocketの接続ができました: ', data)
  	return

  success = (response) ->
  	console.log("event_confirmationイベントが発生しました: " + response.message)
  	return


	failure = (response) ->
  	console.log("event_confirmationイベント生成に失敗しました " + response.message)
  	return

	object_to_send = 
		data: 'test'

	# イベントの起動確認
	ws_rails.trigger('event_confirmation', object_to_send, success, failure)

	# イベントの発生確認
	ws_rails.bind 'event_confirmation', (data) ->
  	console.log(data.message) # would output 'this is a message'
  	return
  return
```

##6. Rack::Lockを削除

```ruby:/config/environments/development.rb
config.middleware.delete Rack::Lock
```

##参考
http://websocket-rails.github.io/
写真の横にコメントを表示


##デフォルト

```html.erb
<div class="media">
<!-- pull-right にすると、画像が右端に表示される -->
  <a class="pull-left" href="#">
    <%= image_tag '', width: 64, height: 64 %>
  </a>
  <div class="media-body">
    <h4 class="media-heading">名前とか</h4>
    ...文字とか。ネストとか
  </div>
</div>
```

##リスト形式

```html.erb
<ul class="media-list">
  <li class="media">
    <a href="#" class="pull-left">
    <%= image_tag '', width: 64, height: 64 %>
    </a>
  <div class="media-body">
    <h4 class="media-heading">Media heading</h4>
      ...
    </div>
  </li>
</ul>
```

##参考

http://tkymtk.hatenablog.com/entry/2013/12/20/132739
1つ前のコミットと現在のコミットを統合する


```bash:ターミナル
$ git rebase -i HEAD~2
```

```vi:
pick 6e47024 gem 'websocket-rails'
-pick 85a6886 Fix typo
+fix 85a6886 Fix typo

# Rebase b00cd93..85a6886 onto b00cd93
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
```
railsでの存在確認


##nil?(存在しない)

```ruby
book.nil?
```

```true
bookが存在しない場合
```

```false
booK == ""
```

##enpty?(入れ物は存在するが中身が空)

```ruby
book.empty?
```

```true
booK == ""
```

```false
book == "aaaaa"
```

bookが存在しない場合、NoMethodErrorを返す

##blank?(中身が空か、または入れものそのものが存在しないときの判定)

```ruby
book.blank?
```

```true
bookが存在しない場合
booK == ""
```

```false
book == "aaaaa"
```

##present?(== !blank?)

```ruby
book.present?
```

```true
book == "aaaaa"
```

```false
bookが存在しない場合
booK == ""
```





##参照
http://qiita.com/somewhatgood@github/items/b74107480ee3821784e6
要素の表示


##表示(showメソッド)

```html
<button>Show it</button>
<p style="display: none">Hello</p>
```

```jquery
$("button").click(function () {
  $("p").show();
});
```

##非表示(hideメソッド)

```html
<p>Hello</p>
<a href="#">Click to hide me too</a>
<p>Here is another paragraph</p>
```

```jquery
$("p").hide();
$("a").click(function () {
  $(this).hide();
  return false;
});
```

##表示・非表示の切り替え

```html
<button>Show it</button>
<p style="display: none">Hello</p>
```

```jquery
$("button").click(function () {
  $("p").toggle();
});
```
data属性の使い方


##data属性を使用することにより変数をタグに埋め込むことができる

```html
<div id="user1" data-id="1" data-user="Jack" data-date-of-birth="2000-10-01">Jack</div>
```

```jquery
("#user1").data("id"); // => 1 (数字扱い)
("#user1").data("user"); // => "Jack"
("#user1").data("date-of-birth"); // => "2000-10-01"
("#user1").data("dateOfBirth"); // => "2000-10-01"
//attr()の場合
("#user1").attr("data-id"); // => "1"  (文字列扱い)
("#user1").attr("data-user"); // => "Jack"
("#user1").attr("data-date-of-birth"); // => "2000-10-01"
```

##参照
https://w3g.jp/blog/jquery-data-attr-cache
hidden_field_tagに値を入れる方法


###hidden_field_tagの場合

```
hidden_field_tag(要素名 [, 値, オプション])
```

例

```
<%= hidden_field_tag :name, "tsuchiya" %>
```

注)valueオプション不要

###hidden_fieldの場合

```
hidden_field(オブジェクト名, プロパティ名 [, オプション])
```

例

```
<%= hidden_field :user, :username, value: "tsuchiya" %>
```

注)valueオプション必要
多対多の関係


###例：UserモデルとEventモデルに多対多の関係を持たせる


###中間テーブルの作成
```bash:ターミナル
$ rails g migration CreateJoinTableUserEvent
$ rake db:migrate
```

###モデルに対してアソシエーションを設定

```ruby:user.rb
has_and_belongs_to_many :events
```

```ruby:event.rb
has_and_belongs_to_many :users
```

###Userモデルに関連したEventモデルを新規に生成

```ruby:events_controller
@user.events.build(start: '201509011200', end: '201509011200')
#Userモデルに関連したEventモデル(空)を3つ生成
3.times { @event.timeplans.build }
#Userモデルに関連したEventモデルを新規に生成し保存する
@user.events.create(start: '201509011200', end: '201509011200')
```

###Userモデルに関連したEventモデルを取得

```ruby:events_controller
@events = @login_user.events
```
RailsのオブジェクトをJavaScriptに渡す


###RubyからJSON形式に変換

配列からJSONへ

```ruby
[1, 2, 3].to_json
=> "[1,2,3]"
```

ハッシュからJSONへ

```ruby
{ "hash" => { "foo" => 1, "bar" => 2 } }.to_json
=> "{\"hash\":{\"foo\":1,\"bar\":2}}"
```

ActiveRecordからJSONへ

```ruby
User.last.to_json
=> "{\"id\":2,\"name\":\"田中\",\"created_at\":\"2014-11-29T03:02:30.449-06:00\",\"updated_at\":\"2014-11-29T03:02:30.449-06:00\"}"
```

###JSONをJavascriptに渡す

```html
<div id='user' data-json='{"key":"value"}'></div>
```

```js
$(function(){
    json = $('#user').data('json');
    //=>{key:value}
    typeof(json);
    //=>object
});
```

JSONの文字列はシングルコーテーションは使えないので注意

##参考
http://qiita.com/kazu56/items/3b78b1666670514f0ab1
railsのformをbootstrapで実装する


フォームの作り方
(1)form_forの上に\<div class="form-horizontal" role="form">を入れ、\</div>を<% end %>の下につける
(2)各項目（名前など）を \<div class="form-group"></div> で囲む
(3)labelには、カンマのあとに:class => "col-sm-3 control-label"を付け加え、
    inputには、 まず <div class="col-sm-7"></div> で囲み、<%=  %>のなかにclass="form-control"を付け加える。

##参照
https://sites.google.com/site/rubyonrailsapps/view_tips/railsnoformwobootstrapde-shi-zhuangsurutoki
複数の子レコードを作成、更新するフォームの作成


#例：Eventモデルに3つのTimeplanモデルを作成

##1. アソシエーションの設定

accepts_nested_attributes_forメソッドを使うことにより
timeplans_attributesのようなフィールドができる

```ruby:app/models/events.rb
class Event < ActiveRecord::Base
  has_many :timeplans
  accepts_nested_attributes_for :timeplans, allow_destroy: true
end
```

```ruby:app/models/timeplans.rb
class Timeplan < ActiveRecord::Base
  belongs_to :event
end
```

##2. 入れ子のフォームを作成

```ruby:app/controllers/events_controller.rb
def new
    @event = Event.new
    # 子モデル(Timeplanモデル)のフィールドを作成
    # @event.timeplans.build
    3.times { @event.timeplans.build }
    end
end
```

```ruby:app/views/events/_form.html.erb

<%= form_for(@event) do |f| %>
  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>

...
  
  <%= f.label :timeplans, "候補日時" %><br />
  <%= f.fields_for :timeplans do |tp| %>
    <div class="field">
      <%= tp.label :start %><br>
      <%= tp.datetime_select :start %>
    </div>
    <div class="field">
      <%= tp.label :end %><br>
      <%= tp.datetime_select :end %>
    </div>
  <% end %>

...

  <div class="actions">
    <%= f.submit %>
  </div>
  
<% end %>
```

DBに保存

```ruby:app/controllers/events_controller.rb
def create
  # イベントに対する候補日時を作成
  @event = Event.new(event_params)
  @event.save
    
end

private
  def event_params
      params.require(:event).permit(
        :title,
        timeplans_attributes: [:start, :end]
        )
```

##参考
http://ruby-rails.hatenadiary.com/entry/20141208/1418018874
ttf-mscorefonts-installerで<OK>がクリックできない(Ubuntuにwineをインストール時)

tabを押してOKまで移動し、Enter
(最初、フリーズしているのかと思いました)

![Screenshot - 2015年12月27日 - 17時28分40秒.jpg](https://qiita-image-store.s3.amazonaws.com/0/106789/cc55f5d8-1493-16e0-8cc8-583b95d018f9.jpeg)

### 参考

[How can I accept the Microsoft EULA agreement for ttf-mscorefonts-installer?](http://askubuntu.com/questions/16225/how-can-i-accept-the-microsoft-eula-agreement-for-ttf-mscorefonts-installer)
スクロールしたら2段目だけついてくる2段メニューを作る

小ネタ的な内容ですが、スクロールしたら2段目だけついてくるメニューの作り方のメモです。
[iPhone6sの公式サイト](http://www.apple.com/jp/iphone-6s/)にあるメニューのようなイメージです。

# サンプルコード

```html:sample.html
<!DOCTYPE html>
<html>
<head>
  <title>Sample</title>
  <link rel="stylesheet" type="text/css" href="sample.css">
  <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  <script src="sample.js"></script>
</head>
<body>
<nav>
  <ul id="mainmenu" class="menu">
    <li>1st menu1</li>
    <li>1st menu2</li>
    <li>1st menu3</li>
  </ul>
  <ul id="submenu" class="menu">
    <li>2nd menu1</li>
    <li>2nd menu2</li>
    <li>2nd menu3</li>
  </ul>
</nav>
<div id="content">contents</div>
</body>
</html>
```

```css:sample.css
* {
    margin: 0;
    padding: 0;
}
nav {
    width: 100%;
    height: 96px;
    width: 920px;
    margin: 0 auto;
}
ul.menu {
    width: 920px;
    height: 48px;
    display: block;
}
ul.menu li {
    list-style-type: none;
    float: left;
    padding-left: 12px;
    line-height: 48px;
}
ul#mainmenu {
    background-color: red;
}
ul#submenu {
    background-color: blue;
}
div#content {
    height: 800px;
    width: 920px;
    margin: 0 auto;
}
ul.menu-fixed {
    position: fixed;
    top: 0;
}
```

```js:sample.js
$(function() {
    var submenu = $('#submenu');
    var offset = submenu.offset();

    $(window).scroll(function() {
        if ($(window).scrollTop() > offset.top) {
            submenu.addClass('menu-fixed');
        } else {
            submenu.removeClass('menu-fixed');
        }
    });
});
```

# ちょっと解説
あらかじめ2段目のメニューをトップに固定するclass（サンプルだと`.menu-fixed`）を用意し、
スクロール時にウィンドウのトップと2段目のメニューの位置を比較して
ウィンドウの位置が2段目のメニューより下だったら上記classを追加しています。
Swiftの型に付いている"!"について調べてみる

今日はStoryboardを使って開発をしているとよく見かける`UIView!`の`!`部分について書いていこうと思います。

```swift
let view: UIView!
```

## `!`とは
`!`はImplicitlyUnwrappedOptionalの糖衣構文になります。

```swift
// 下の2つは同じ意味
let view1: UIView!
let view2: ImplicitlyUnwrappedOptional<UIView>
```

`?`がOptionalの糖衣構文な事に似ています。

```swift
// 下の2つは同じ意味
let view1: UIView?
let view2: Optional<UIView>
```

## ImplicitlyUnwrappedOptionalとは
Optionalと同じでnilを代入する事ができる型です。
Optionalと違ってアンラップせずに使えるというメリットはあるのですが、中にnilが入っていた場合はクラッシュします。

```swift
let view: UIView! = nil
print(view.frame) // → アプリが落ちる
```

## ImplicitlyUnwrappedOptional型とOptional型
ImplicitlyUnwrappedOptional型とOptional型があると書いたのですが、そうなるとそれぞれのnilが等しいかが気になります。
実際に確かめたところ、Optional.NoneとImplicitlyUnwrappedOptional.Noneの比較はtrueを返す事が分かりました。

```swift
let int1: Int? = nil
let int2: Int! = nil
print(int1 == int2) // true
print(Optional.None == ImplicitlyUnwrappedOptional.None) // true
```

nil以外の比較は下の結果になりました。

```swift
let int1: Int? = 1
let int2: Int! = 1
let int3: Int  = 1
print(int1 == int2) // true
print(int1 == int3) // true
print(int2 == int3) // true
```

## ImplicitlyUnwrappedOptionalの使いどころ
ImplicitlyUnwrappedOptionalは普段開発をしていて使う事は少ないです。
自分が使うとしたら下の2つの条件を満たした時かと思います。

* インスタンス変数
* initで初期化できない
* nilが入った場合にはアプリがクラッシュしてほしい

上2つについて説明していきます。

### インスタンス変数
ローカル変数ではnilを許可するならOptionalを使えばいいしnilを許容しないなら`!`も`?`も付かない普通の型として宣言すれば済みます。
その為インスタンス変数以外では使う事はほぼないかと思っています。

一応Optionalを代入できるという長所はあるのですが、Optionalを代入する場合はアンラップした方が安全なのでその辺りは考慮しなくて良い気がしています。

```swift
var view1: UIView?
var view2: UIView!
var view3: UIView
view2 = view1 // エラーにならない
view3 = view1 // エラーになる
```

### initで初期化できない
Swiftではinitializerで初期化できるプロパティーには`?`や`!`を付ける必要がありません。
その為nilを許容したくないインスタンス変数はinitializerで値を入れるだけで済みます。

逆にStoryboardのように裏側で値をセットする場合はinitializerでの値セットが難しいのでImplicitlyUnwrappedOptionalとして宣言する必要が出てきます。

```swift
class MyClass {
    var prop: Int
    
    init(prop: Int) {
        self.prop = prop
    }
}
```

## まとめ
今日はImplicitlyUnwrappedOptionalの概要・仕様・使いどころについて書いてきました。
ImplicitlyUnwrappedOptionalは「初期化時に値を入れずにnilが入らない事を明示的に示せる」という事でしっかり使えば堅牢なアプリケーションを使えそうな気がしています。
とは言えImplicitlyUnwrappedOptionalを使うかどうかの基準をチーム内で共有する事は大変そうですし、アプリがクラッシュするのは痛いので基本的に使わない方が安全な気がしています。
さくらVPSにGitlab Omnibusをインストールしてみた

ソース管理、バックアップ用に自分専用のgitサーバー構築をしてみました。
技術メモとして記載させていただきますので、ご参考になればと思います。


**パッケージのインストール**

Gitlabの公式サイトを参考にパッケージのインストール
https://about.gitlab.com/downloads/

Gitlab Omnibusはgitlabサーバー構築に必要なミドルウェアが用意されています。

```
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
```
続いてインスートールします


```
sudo yum install gitlab-ce
```
gitサーバURLの設定
gitlabの設定は /etc/gitlab/gitlab.rb に記載されていますので
GitLabのWebGUIやGitリポジトリへアクセスするときに使うURLを指定します。


```
$ sudo vim /etc/gitlab/gitlab.rb
external_url "http://gitlab.example.com"
```

**セットアップ**

```
gitlab-ctl reconfigure
```
セットアップするとGitLab用のディレクトリ (/opt/gitlab/sv/ ) に下記記載のミドルウェアがインストールされます。

logrotate
nginx
postgresql
redis
sidekiq
unicorn

パッケージのGitlab Omnibusはデフォルトでnginxで動作します。
Webサーバーは一般的に80番ポートが使われるので、既にWebサーバーが稼働しているシステム（apacheなど）にGitLabをインストールしたいときは衝突しないよう調整する必要があります。

自分はすでにapacheをインストール済みでホームページを公開していましたので衝突しました。。。

衝突した場合はポートを指定してやります。

```
$ sudo vim /etc/gitlab/gitlab.rb
external_url "http://gitlab.example.com:88"
```

再度、セットアップしてあげれば、変更内容が反映されます。
webサーバーのVirtualHost設定

gitlabはローカルで起動しているので
apacheでリバースプロシキの設定をしてやります。

```
$ sudo vim /etc/httpd/conf.d/gitlab.example.com.conf
 
<VirtualHost *:80>
   ServerName gitlab.example.com
   DocumentRoot "/opt/gitlab/embedded/service/gitlab-rails/public"
   ProxyPass / http://localhost:88/
   ProxyPassReverse / http://localhost:88/
   ErrorLog /var/log/httpd/gitlab.example.com_error_log
   CustomLog /var/log/httpd/gitlab.example.com_access_log combined
   AddDefaultCharset UTF-8
   <Directory "/opt/gitlab/embedded/service/gitlab-rails/public">
       Allow from all
   </Directory>
</VirtualHost>
```

apacheを再起動

こんな画面が出たらとりあえずインストールは完了です

![スクリーンショット 2015-08-01 23.30.51.png](https://qiita-image-store.s3.amazonaws.com/0/107164/3c53f6fe-821b-14aa-8178-dd0d8c9d3e87.png)

**■参考サイト**
http://biokids.org/?%A4%C9%A4%D6%A4%AA%2F%B3%AB%C8%AF%A4%B7%A4%E8%A4%A6%A1%AA%2FGitLab%207.3.2%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB
http://ez-net.jp/article/6F/ULEm_R1H/-ZBF5BCCmpC2/
http://urashita.com/archives/3074
AVDが起動しないときに確認する箇所

# AVDが起動しないときに確認する箇所

・仮想化が有効になっているか？
　BIOSで設定するかウイルス対策ソフトのAVASTで仮想化を無効にしてないか確認する

・Hyper-Vが有効になっていないか？
　Hyper-Vが有効になっていると動かないらしいです
　http://qiita.com/oboenikui/items/56da72def4cf477cf1e7

・HXAMをインストールしているか
　インストールしていない場合はSDK Managerから
　HAXM InstallerをDLし　C:\Users\｛ユーザ名}\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager
  intelhaxm-android.exeを実行

・自分のPCがVT-xをサポートしているか？
　サポートしていない場合は、
　Android StudioのツールのAVD Managerをクリックして
　actionsの鉛筆アイコンをクリックして機種の下のChangesをクリックして
　ABIをX86からarmeabiに変更する
　http://opendata.jp.net/?p=2989

結局私は自分のPCがVT-xをサポートしていないため、AVDが動きませんでした。

http://opendata.jp.net/?p=2989
のページがあったので、すぐ解決できました :clap:
簡易ツールだって、パッケージで行こう！

仕事でUbuntu向けの簡単なシェルスクリプトを書くことがありますが、喫緊の課題に対処するために遣っ付け仕事で作成することが多く、再利用時に以下のような問題になることも度々です。

* 時間が経過して使用方法が解らなくなる
* システムのアップグレードで動かなくなる

上記問題への対処として、短手番で作成したスクリプトをオンラインマニュアル添付のパッケージ化することができればと思い、テンプレートを準備しました。

# 前提条件 #

以下のパッケージがインストールされている必要があります。

* autoconf
* automake
* dh-make
* dpkg-deb
* ruby-ronn

# テンプレート #

## ダウンロード先 ##

https://github.com/takushi1969/shellDpkgTemplate/archive/master.zip

## 構成 ##

テンプレートのパッケージ名は、hello、バージョンは、1.0としました。
パッケージ名とバージョンの間は、dh_makeを使用するために、'-'で結ぶ必要があります。

    hello-1.0
    ├── hello-1.0/configure.ac
    ├── hello-1.0/Makefile.am
    └── hello-1.0/src
        ├── hello-1.0/src/Makefile.am
        ├── hello-1.0/src/hello.1.ronn
        └── hello-1.0/src/hello.sh

## パッケージの作成 ##

では、テンプレートを使用して実際にパッケージを作成してみましょう。

1. 環境変数の設定
 
    export EMAIL="takushi1969@hoge.hoge"
    export DEBFULLNAME="takushi1969 hoge"

    これらの環境変数は、インストール済のパッケージを`dpkg-query -p`コマンドで参照した時の情報として展開されます。

2. テンプレートの展開

    コマンド： unzip shellDpkgTemplate-master.zip

3. 作業ディレクトリへの移動

    コマンド： cd shellDpkgTemplate-master/hello-1.0

    上記の手順で展開した作業ディレクトリに移動します。

4. GNU build systemのスクリプトの生成

    コマンド： autoreconf -i

    テンプレート内にある*ac、*amファイルから、GNU build systemのスクリプトを生成します。

5. debianコントロールファイルの生成

    コマンド： dh_make -n

    dh_makeコマンドを実行すると、作成予定のパッケージを適用するアーキテクチャの入力を求められます。
    今回のパッケージはスクリプトのインストールで、アーキテクチャ依存ではありませんので、**'i'**を入力します。
    ![dh_make.png](https://qiita-image-store.s3.amazonaws.com/0/59920/8843101c-1ab2-1157-65fe-635f5e925cc4.png)

6. パッケージの生成

    コマンド： dpkg-buildpackage -uc -us

    deb形式のパッケージを生成します。
    生成したパケージは、親ディレクトリに**hello1.0_all.deb**として保存されます。

7. パッケージのインストール

    コマンド： cd ..;sudo dpkg -i hello1.0_all.deb

    保存されたパッケージを、上記のコマンドでインストールします。
    また、インストールされたファイルは、以下のコマンドで確認することができます。
    
    コマンド： dpkg -L hello、およびマニュアル参照
    ![dpkg_L.png](https://qiita-image-store.s3.amazonaws.com/0/59920/b98ef311-5893-d850-e87f-2e4672b5ad42.png)

# 流用の勘所 #

## パッケージ名の変更 ##

上記手順の**パッケージの作成 2. テンプレートの展開**の後、以下の部分を変更します。

* ディレクトリ名の変更

    ディレクトリ： shelldpkgtemplate-master/hello-1.0
	**hello**の部分を修正

* configure.acの定義の変更

    ファイル：shelldpkgtemplate-master/hello-1.0/configure.ac
	**AC_INIT**定義の**hello**の部分を、上記のディレクトリと同じ名前に。

## バージョンアップする ##

上記手順の**パッケージの作成 2. テンプレートの展開**の後、以下の部分を変更します。

* ディレクトリ名の変更

    ディレクトリ： shelldpkgtemplate-master/hello-1.0
	**1.0**の部分を修正

* configure.acの定義の変更

    ファイル：shelldpkgtemplate-master/hello-1.0/configure.ac
	**AC_INIT**定義の**1.0**の部分を、上記のディレクトリと同じ値に。

## スクリプトを増やす ##

上記手順の**パッケージの作成 2. テンプレートの展開**の後、以下の部分を変更します。

* スクリプトを追加

    追加するスクリプトを、ディレクトリ： shelldpkgtemplate-master/hello-1.0/srcに配置
	以下の説明では、追加するスクリプトを**goodbye.sh**として説明します。
* オンラインマニュアルの追加

    オンラインマニュアル：ronn-format(7)を参考に、オンラインマニュアルのソースイファイル: shelldpkgtemplate-master/hello-1.0/src/goodbye.ronnを作成します。
    

* Makefile.acの変更

    ファイル ： shelldpkgtemplate-master/hello-1.0/src/Makeiflle.ac
    **googbye.sh**を追加する場合は、以下のように設定します。
    
        dist_man_MANS = hello.1 goodbye.1
        dist_bin_SCRIPTS = hello.sh goodbye.sh
        CLEANFILES = $(dist_man_MANS)

        hello.1: hello.1.ronn 
           ronn --roff $?
        goodbye.1: goodbye.1.ronn
           ronn --roff $?
		
以上です。
MySQL互換のPercona-Serverで準同期レプリケーションを作る

自分用のメモなので説明など端折って完全に手順のみです。

## 準備
### パッケージのインストール(マスター、スレーブともに)
```shell-session
$ sudo rpm -Uvh http://www.percona.com/redir/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
$ sudo yum install Percona-Server-server-56 Percona-Server-client-56 Percona-Server-shared-56 Percona-Server-shared-compat percona-toolkit xtrabackup -y
```
### 準同期レプリケーション向けmy.cnfの設定
マスター側のmy.cnf設定(抜粋)

```
[mysqld]
# Replication
server-id=101 # この数値は適当に
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=500
```
スレーブ側のmy.cnf設定(抜粋)

```
[mysqld]
# Replication
server-id=102 # この数値は適当に
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
```
### pecona-serverの起動(マスター、スレーブともに)
```shell-session
$ sudo /etc/init.d/mysql start
```
## 準同期レプリケーション作成
### マスター側操作
レプリケーション専用アカウントを作成、更新をロック、バイナリログ進行位置を取得する。
レプリケーション専用アカウント名はここでは `repuser` 、パスワードを `repuserpassword123` 、接続許可ホストを `192.*` とする。

```shell-session
# mysql -u root -p
```
```mysql
GRANT REPLICATION SLAVE ON *.* TO `repuser`@'192.%' IDENTIFIED BY 'repuserpassword123';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS\G;               -- 'File'と'Position'を記録しておく
-- このコンソールはこのままにしておく(*exitしない*)
```
マスター側の全てのテーブルをdumpしてスレーブにscpする。

```shell-session
$ mysqldump -u root -p --events --all-databases > all_db_dump.sql
$ scp all_db_dump.sql ユーザ名@スレーブ側のIP:
```
### スレーブ側操作
マスターからscpされたall_db_dump.sqlを食わせる。

```shell-session
$ mysql -u root -p < all_db_dump.sql
```
マスター情報を設定する。`binログファイル名`はマスター側操作でおこなった`SHOW MASTER STATUS;`で表示された `File` の値、 `ログファイルのポジション` は `Position` の値を指定する。

```shell-session
# mysql -u root -p
```
```mysql
CHANGE MASTER TO  
MASTER_HOST = 'マスター側のIP', 
MASTER_USER = 'repuser', 
MASTER_PASSWORD = 'repuserpassword123' ,
MASTER_PORT = 3306, 
MASTER_LOG_FILE = 'binログファイル名' ,    -- 'File'
MASTER_LOG_POS  = ログファイルのポジション; -- 'Posistion'
```
レプリケーションを開始する。

```mysql
START SLAVE;
SHOW SLAVE STATUS\G;
-- 以下の状況になっていればOK
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
```

### マスター側操作
`SHOW MASTER STATUS\G` を行ったコンソールで更新のロックを解除する。

```mysql
UNLOCK TABLES;
FLUSH PRIVILEGES;
```

## SSDに最適化された(と言われている)Percona-Serverを知るためのリソースとか

http://blog.father.gedow.net/category/hardware/iodrive/

http://ijin.github.io/blog/2015/03/27/serverfesta-2015-spring/

http://www.slideshare.net/ttkzw/svfes2

http://www.slideshare.net/GedowFather/welcome-to-iodrive-world

http://yakst.com/ja/posts/61

## ioDriveを使ううえで考慮すべき(なのか？)ポイント
* I/Oのスレッドとか

```
innodb_read_io_threads=いくつにする？
innodb_write_io_threads=いくつにする？
innodb_adaptive_flushing_method=keep_average
innodb_adaptive_flushing=true
```
* numa方面
* [binlogのdisk flush](http://blog.father.gedow.net/2014/05/20/mysql-binlog-rotate-problem-on-iodrive/)
El Capitanでgemのinstallにopensslが必要だった

El Capitanでmiddlemanの環境構築しようとしたらgemのinstallがうまくいかなかったのでメモ。
bundle installしたら下のようなエラーが出た。

```
Using compass 1.0.3
Installing eventmachine 1.0.8 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/USERNAME/.rbenv/versions/2.2.1/bin/ruby -r ./siteconf20151227-26756-loa7l0.rb extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... no
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for inotify_init() in sys/inotify.h... no
checking for __NR_inotify_init in sys/syscall.h... no
checking for writev() in sys/uio.h... yes
checking for rb_thread_fd_select()... yes
checking for rb_fdset_t in ruby/intern.h... yes
checking for pipe2() in unistd.h... no
checking for accept4() in sys/socket.h... no
checking for SOCK_CLOEXEC in sys/socket.h... no
checking for rb_wait_for_single_fd()... yes
checking for rb_enable_interrupt()... no
checking for rb_time_new()... yes
checking for sys/event.h... yes
checking for sys/queue.h... yes
CFLAGS= -O3 -Wno-error=shorten-64-to-32  -pipe  -Wall -Wextra -Wno-deprecated-declarations -Wno-ignored-qualifiers -Wno-unused-result
CPPFLAGS=-I/Users/yulily100/.rbenv/versions/2.2.1/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) -Wall -Wextra -Wno-deprecated-declarations -Wno-ignored-qualifiers -Wno-unused-result
checking for clock_gettime()... no
checking for gethrtime()... no
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling binder.cpp
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make: *** [binder.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/yulily100/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.8 for inspection.
Results logged to /Users/yulily100/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-14/2.2.0-static/eventmachine-1.0.8/gem_make.out
An error occurred while installing eventmachine (1.0.8), and Bundler cannot
continue.
Make sure that `gem install eventmachine -v '1.0.8'` succeeds before bundling.
```
opensslがおかしい？のでhomebrewでopensslを入れる

```
$ brew update
$ brew install openssl
```

これだけではダメで、homebrewでインストールしたOpenSSLを使うようにリンクさせる必要があります。

```
$ brew link openssl --force
```

bundle installできるようになりました。



以下を参考にしました。
https://github.com/eventmachine/eventmachine/issues/643
Electronの認証でwill-navigateが使えないときはdid-get-redirect-requestが使えるかもしれない

ElectronアプリでWebサービスの認証を行うときは、

- 新しいウィンドウで認証ページを開いて、
- 認証ボタンが押されたら、
- window.webContentsの will-navigate イベントをキャッチして、
- 戻り値のURLからトークンを取り出す。

という手順が一般的だと思います。

```
window.webContents.on('will-navigate', function(e, url) {
  // urlからトークンを取り出す
})
```

最近Trelloのユーザー認証を同手順で行おうとしたところ、このwill-navigateイベントが発火せずどうしたもんかと悩んだことがありました。

とりあえずの解決方法としては、 [did-get-redirect-request](https://github.com/atom/electron/blob/master/docs/api/web-contents.md#event-did-get-redirect-request)イベントが使えるようです。

これを使うと、３番目の戻り値にトークンが付加されたUrlが返ってきました。

```
window.webContents.on('did-get-redirect-request', function(e, oldUrl, newUrl) {
  // newUrlからトークンを取り出す
  // Trelloの場合は newUrl = https://_____#token=foobar の形
})
```

ただし、did-get-redirect-requestイベントを使う方法はおそらくあまり一般的ではありません。
githubでコードを検索してもやはり will-navigate のほうがずっと多く使われています。

私のコードが悪かったのかはたまたTrelloが特殊なのかはわかりませんが、will-navigateが使えず困ったときは試してみてもいいかもしれません。
マウントと名前空間めもめも

### 概要
コンテナ(LXC)について調べようと思っていろいろ見ていたら、いろいろ脱線してカーネルのことについて復習したのでその時の自分めもめも。

### 用語メモメモ
#### マウント

##### マウントコマンド

~~~zsh
mount -t <タイプ> -o <オプション> <デバイスファイル> <マウントポイント>
~~~

##### マウントとは
* ファイル・システム(super_block)をシステムのディレクトリツリー(マウントポイント)に関連づけること。関連づけるとはvfsmount構造体、mount構造体に対してマウントポイント、スーパーブロックなどを設定すること。
* ファイルシステム≒デバイス
* ファイルシステムとファイルシステムを結びつける

##### ファイルシステムの実体
  
  * [super_block構造体](http://lxr.free-electrons.com/source/include/linux/fs.h#L1289)
    - s_inodesかコメントに書かれているようにすべてのinodeリストに繋がっている。

OSをインストールするときに各パーティションに対してファイル・システムを決定してシステムのディレクトリツリーを割り当てる。OS起動するとメモリ上ではそのファイル・システム(システムの各部分)をシステムの対応するディレクトリツリーにマウントする。

#### マウントの関連性を表している構造体
  * [vfs_mount構造体](http://lxr.free-electrons.com/source/include/linux/mount.h#L66)

  * [mount構造体](http://lxr.free-electrons.com/source/fs/mount.h#L30)
    - struct vfsmount mntでvfsmountと関連している。
    - マウントポイントなどなど

これがメモリ上で構築されているのでマウント状態がわかる。

#### 名前空間(namespace)
* カーネル2.6から導入された
* task_struct構造体(プロセスの実体)から->namespaceで辿れる。(2.6系ではあるみたいだけど、それ以降はどうもnsporxyからたどるみたい？)
* vfsmount構造体はnamespace構造体から知ることができる。

##### 名前空間の使用
各プロセス(task_struct)はnamespace構造体を保持している。そのプロセスからforkする場合、forkされたプロセス(task_strcut)はnamespace構造体を共有する。共有せずに新たな名前空間を使用したい場合clone(CLONE_NEWSNSフラグ指定)を使用する。するとnamespase構造体は共有せずに別に独立して獲得されるみたい。
なのでunshareコマンドなんかは内部でcloneしてCLONE_NEWSNSフラグが指定されているのではないのかなぁ。

##### 名前空間まとめ
マウントはvfsmount構造体、mount構造体に対してマウントポイントなどを設定することなので、cloneを使用して名前空間が異なるプロセスがあった場合、一つの名前空間でマウントなどを実行した場合は、もう一つの名前空間のプロセスのマウントには影響を与えない(vfsmount構造体などは独立しているので)。
なるほどー、コンテナで名前空間を使ってる意味が見えたきがします。
systemdにサービスを登録するAnsible role

サービス`systemd`へ登録するための[systemd-service](https://galaxy.ansible.com/detail#/role/6664)という`Ansible`ロールを書いたので公開します。`Ubuntu Wily`用に書いてますが`systemd_service_root_dir`を設定すれば`RedHat`にも対応できるはず。

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

`ansible-galaxy`で以下のようにします。

    $ ansible-galaxy install tumf.systemd-service

プレイブック
-----------

プレイブックに以下の例ように書いてロールを実行します。

    - hosts: servers
      roles:
        - role: systemd-service
          systemd_service_name: "swarm-manager"
          systemd_service_envs:
              - "DOCKER_HOST=tcp://127.0.0.1:2375"
          systemd_service_Unit_Description: Docker Swarm Manager
          systemd_service_Unit_Requires: docker.service
          systemd_service_Unit_After: docker.service
          systemd_service_Service_ExecStartPre:
              - -/usr/bin/docker stop swarm-manager
              - -/usr/bin/docker rm swarm-manager
              - /usr/bin/docker pull swarm
          systemd_service_Service_ExecStart: /usr/bin/docker run -p 2377:2375 --name swarm-manage


### パラメータ

|パラメータ名         |型    |デフォルト|説明
|--------------------|------|---------|-------------
|systemd_service_root_dir|String|""|デプロイ先のルートパス(注1)
|systemd_service_default_dir|String|"/etc/default"|環境変数用パス
|systemd_service_systemd_dir|String|"/etc/systemd/system"|systemdのパス
|systemd_service_name★|String||サービス名
|systemd_service_envs|Array|[]|環境変数 (/etc/default/:name)
|systemd_service_Unit_Description|String||[Unit]のDescription
|systemd_service_Unit_Requires|String||[Unit]のRequires
|systemd_service_Unit_After|String||[Unit]のAfter
|systemd_service_Service_Type|String|"simple"|[Service]のType
|systemd_service_Service_ExecStartPre|Array||[Service]のExecStartPre
|systemd_service_Service_ExecStart★|String||[Service]のExecStart
|systemd_service_Service_ExecStartPost|Array||[Service]のExecStartPost
|systemd_service_Install_WantedBy|String|"multi-user.target"|[Install]のWantedBy

★必須

> **注1**
> `systemd_service_root_dir`によりデプロイ先を替えることによりユニットテストしやすくしています。

パラメータ自分が使う分しか用意していないので、適宜追加します。[プルリクエスト]( https://github.com/tumf/ansible-role-systemd-service)お待ちしております。

テスト(開発者向け)
-----------------

以下のコマンドでローカルで単体テストを実行します。

    ./tests/run
binding.gypでOS毎の分岐を記述するには

# 背景

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">neon、binding.gypにOSの分岐入れてLinuxでもgccに怒られないようにしたら、どうもLinuxだとrustで生成している.soがld的には途中で途切れたファイルとなっているらしく、ここを解決できれば、先に進めるのかも。。</p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/680654987886596096">2015, 12月 26</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">neonのwc-demoをLinuxで動かせるようにできた <a href="https://t.co/cJFzxEtCmo">pic.twitter.com/cJFzxEtCmo</a></p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/680763958286929920">2015, 12月 26</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
# 記述方法

以下のように、OSXオンリーの記述があった。

```js
# FIXME: OSX-specific
"action": ["gcc", "-dynamiclib", "-Wl,-undefined,dynamic_lookup", "-Wl,-force_load,<(static_lib)", "-o", "<(shared_lib)"]
```
以下のように、OS毎に分岐を記述できる。

```js
"conditions": [
  ["OS=='linux'", {
                "action": ["ld", "-shared", "--whole-archive", "<(static_lib)", "-o", "<(shared_lib)"]
  }],
  ["OS=='mac'",{
                "action": ["gcc", "-dynamiclib", "-Wl,-undefined,dynamic_lookup", "-Wl,-force_load,<(static_lib)", "-o", "<(shared_lib)"]
  }]
]
```

割とこの手の記述は

```js
'OS=="linux"', {}
```

というようにシングルクォートで囲まれることが多いが、Neonではbinding.gypをnode.jsも内部的に読み込んでJSONとして解釈するので、
今回の書き方にする必要があった。