OmniAICreator/Qiita-1.07M huggingface dataset:
HTMLへonClickを記述しないメリット

# イベントリスナの登録

一般的にHTML上の要素にイベントリスナを登録する方法は、
https://developer.mozilla.org/ja/docs/Web/API/Event
によると3種類

* EventTarget.addEventListener
* HTMLのon***属性（onClickとか）
* DOMのプロパティ

とのことです。

現在やってるプロジェクトではコーディング規約でHTMLのon***に書けってことになってます。

しかし、この方式は先ほどのmdnのページによると

>この方法は避けるべきです。これはマークアップを大きくし、読みづらくします。「コンテンツ/構造」と「ふるまい」の関係がうまく切り離されません。そして、見つけるのが難しいバグをつくります。

と記載され、最も推奨されない記述方法のようです。

構造と振る舞いの関係が切り離されない。はそのとおりだと思います。
しかし、
> 見つけるのが難しいバグを作ります。

ってどんなんだろうと思ってたらプロジェクトで踏んだっぽいのでどういうことがおきたか記事化しておきます。

# ページの構築中に処理を始められた。

仮にaddEventListenerの登録であれば、画面遷移時の処理は

1.DOMの構築完了
2.イベントリスナの登録

という順序であれば、画面のボタンやフォームが構築される途中で何をしてもイベントリスナを設定していないので何も起こらないハズ。

ところが、
HTMLにonClickなどが書かれていると、ボタンやフォームが構築される途中でボタンを押下するなどのユーザ操作で、ボタンに設定したイベントリスナからjavascriptの処理が開始可能になってしまう。

具体的には

```html:sample
<form action="/hoge">
<input name="foo">
<input name="bar">
</form>
```
の状態でformされるのを期待しているのに、

```html:sample
<form action="/hoge">
<input name="foo">
```

位の状態でリクエストが飛んだり、まだDOMに構築していない要素の更新を試みてこけていた。

そのためサーバサイドでは、アプリケーション上想定してないパラメータの欠落等が発生していた。

#対応

ベタベタですが画面の操作を抑止する処理とonLoad後に画面の抑止を解除して対応した。
ベストプラクティスには乗っかっておいたほうがやはり無難だなぁ。
Swiftのビルドコンフィグレーション

# はじめに

SwiftとObjective-Cのコードは条件付きで異なる方法でコンパイルすることができます。
例えば、trueとfalseのリテラル、コマンドラインフラグやプラットフォームのテスト機能を利用することができます。

[Using Swift with Cocoa and Objective-C: Interacting with C APIs](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_13)

# プラットフォームのテスト機能

iOSシミュレータとiOSデバイス（実機）、その他で異なるメッセージを表示します。

```swift:sample1.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
        #if (arch(i386) || arch(x86_64)) && os(iOS)
            let message = "iOS Simulator"
        #elseif (arch(arm) || arch(arm64)) && os(iOS)
            let message = "iOS Device"
        #else
            let message = "Other"
        #endif
        
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .Alert)
        self.presentViewController(alertController, animated: true, completion: {
        })
    }
}
```

iOSシミュレータで実行すると`iOS Simulator`と表示されます。
![iOS Simulator](https://qiita-image-store.s3.amazonaws.com/0/3862/6ffab181-28a3-4c92-307c-195ab1b97f90.jpeg)



iOSデバイスで実行すると`iOS Device`と表示されます。
![iOS Device](https://qiita-image-store.s3.amazonaws.com/0/3862/0333601c-60c8-b018-cc4c-7903942f2018.jpeg)


os()とarch()の引数にとれる値は以下のとおりです。

| Function | Valid arguments |
|----|----|
| os() | OSX, iOS, watchOS |
| arch() | x86_64, arm, arm64, i386 |

ビルドコンフィグレーションには`&&` `||` `!` を使用できます。

# #if DEBUG

デバッグ時のみ実行にしたいコードがあるときは、以下のように`#if DEBUG`を使用します。

```swift:sample2.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
        #if DEBUG
            let message = "true"
        #else
            let message = "false"
        #endif
        
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .Alert)
        self.presentViewController(alertController, animated: true, completion: {
        })
    }
}
```

デバッグが有効のとき`true`、無効のとき`false`を表示します。
このまま実行すると`false`が表示されます。

有効にするためには、`Build Settings`の`Swift Compiler -Custom Flags`にある`Other Swift Flags`に`-D DEBUG`を追加します。

![debug](https://qiita-image-store.s3.amazonaws.com/0/3862/b825a911-23cd-03c0-020b-640951db847f.jpeg)

ドキュメントには`-D <#flag#>`とあるので、`-D Hoge`として`#if Hoge`と変更しても動作します。
Laravel5.1でbehatを使ってjenkinsで自動テストする

# 今日やること
これまで構築した環境でGitHubにPushしたら
自動でjenkinsさんにbehatのテストシナリオを走らせてもらう。
さらに結果もSlackへも通知する。

behatのテスト結果をjenkinsで認識するには
Junit形式でxmlを読ませるのが必要らしいのでその設定手順をやります。

# 環境
前回Laravelでbehatを使うためBehat-Laravel-Extensionを導入したところ
[Laravel5.1でbehatを使ってみる](http://qiita.com/inaka_phper/items/a57776253fc5008f7616)の状態から引き続き作業を行う。

サーバー側のjenkins設定はこちらの記事で行った。

* Jenkinsのインストールと初期設定
[さくらのVPSにjenkinsをインストールして、テストOKで自動デプロイする環境を構築する(1)](http://qiita.com/inaka_phper/items/f264401ed7a0bc25f407)

* GitHubにPushしたらJenkins動かす
[さくらのVPSにjenkinsをインストールして、テストOKで自動デプロイする環境を構築する(2)](http://qiita.com/inaka_phper/items/f37c71b5bc0a7ba57157)

* GithubにPushしたらサーバーに自動デプロイ
[さくらのVPSにjenkinsをインストールして、テストOKで自動デプロイする環境を構築する(3)](http://qiita.com/inaka_phper/items/fcb46982b3b74afe1e2c)

* Slackにテスト結果を通知
[さくらのVPSにjenkinsをインストールして、テストOKで自動デプロイする環境を構築する(4)](http://qiita.com/inaka_phper/items/79845a7210c48a27786b)

# 作業
主な設定はこちらの方の記事が参考になりました。というかそのままいけました。
[behat 3.0とJenkins CIでBDDに挑戦(5)](http://qiita.com/dozo/items/4de280e580bdc48c9d93)
[Junit formatter for Behat 3.x](https://groups.drupal.org/node/453803)

**2015年7月15日時点**でbehat-laravel-extensionをcomposerで入れた際、
behat3.0.15が入りますが、このバージョンではJunitでの出力に対応していません。
masterには対応したPRがマージされているのでこちらを使用します。

## behatのバージョンをJunitに対応したバージョンへ変更する
masterブランチから3.0.*の開発中をもってくるように
以下のコマンドで変更します。

`composer require behat/behat:~3.0@dev --dev`
behatが入れ替わって
`./vendor/behat/behat/features/junit_format.feature`
などJunit関連のファイルが含まれているかと思います。

## Junit形式出力してみる
以下のコマンドでテスト結果をxmlで出力してみます。
`./vendor/behat/behat/bin/behat --format=junit --out=.`
実行後、default.xmlが生成されていれば成功です。

```default.xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="default">
  <testsuite name="show laravel home" tests="1" skipped="0" failures="0" errors="0">
    <testcase name="Home" status="passed"></testcase>
  </testsuite>
</testsuites>
```

## GitHubにPushしてサーバーに反映させる
すでに[自動デプロイさせるように設定](http://qiita.com/inaka_phper/items/f264401ed7a0bc25f407)しているのでPushするだけで反映。

## サーバー側でcomposer updateを実行する
サーバー側でもbehatを入れ替えなければいけませんので、
`composer update`を実行して入れ替えを行います。

## Junit形式で出力してみる
サーバー側でも正常に動くか試してみましょう。

## Jenkinsに設定を行う
ジョブの設定画面を開き、シェルの実行にテスト＆結果をJunit形式で出力するコマンドを入れます。
Junitの結果を読むのにWORKSPACEにJunitを出力すると後の指定が楽ですね。
具体的に以下のように設定しました。
![jenkins.jpg](https://qiita-image-store.s3.amazonaws.com/0/85113/fb89a3de-8184-95ee-8ba6-625be2a11404.jpeg)
※あれ？これじゃテストだめでもデプロイしちゃう気がしてならない。追々調整します。

## ビルド実行してみる
slackへ通知が流れます。
一番上にTest Status: Passedってでてますね！
無事設定完了です。

![jenkins2.jpg](https://qiita-image-store.s3.amazonaws.com/0/85113/11668b33-e13d-0270-247d-3e623f123cbb.jpeg)
Swiffy v7.2のテキスト改行がおかしくなる件

Google Swiffyは死にました。この記事はゴミになりました。


Swiffyのテキスト改行がおかしくなる件
Swiffyって何？ → [Swiffy | Google Developers](https://developers.google.com/swiffy/)

↓こういう状態
（左がバグ状態、右が修正済みの状態です）
![20150716-000416-8000.png](https://qiita-image-store.s3.amazonaws.com/0/22610/b41f96eb-ecff-f35c-6521-d65509124700.png)

とりあえずどこを直せばいいのか書いておく。


```js:runtime.js
    g.Ix = function(a, b, c, d) {
        for (var e = this.Zo(), f = 0; f < a.length;) {
            for (var h = f + 1, k = a.length, m; k > h;) {
                var n = h + (k - h) / 2,
                    n = Math.ceil(n);
                m = a.substring(f, n);
                e.measureText(m).width <= b - c ? h = n : k = n - 1
            }
// console.log('"' + a + '".substr('+f+','+h+'); => ' + a.substr(f, h));
// console.log('"' + a + '".substring('+f+','+h+'); => ' + a.substring(f, h));

//            d.push(a.substr(f, h)); // ← この行がバグ
            d.push(a.substring(f, h)); // これが本来期待する動作
            f = h;
            c = 0
        }
    };
```

substrとsubstringを勘違いしてただけっていうね…
余談ですが、整形した時に2万行超えてて発狂しそうになりました。(+コードの難読化）
電卓サーバーを書く

# これは何？

面白サンプルを見つけたので紹介です。
ネットワーク経由で四則演算の結果を返すサーバーモジュールの公式サンプルです。

# 準備

一つインストールします。

```bash
# yum install perl-Net-Daemon
```

# プログラム

ここのサンプルそのままです。
https://metacpan.org/pod/Net::Daemon

```pl:calc_sv.pl
# -*- perl -*-
#
# Calculator server
#
require 5.004;
use strict;
 
require Net::Daemon;
 
 
package Calculator;
 
use vars qw($VERSION @ISA);
$VERSION = '0.01';
@ISA = qw(Net::Daemon); # to inherit from Net::Daemon
 
sub Version ($) { 'Calculator Example Server, 0.01'; }
 
# Add a command line option "--base"
sub Options ($) {
    my($self) = @_;
    my($options) = $self->SUPER::Options();
    $options->{'base'} = { 'template' => 'base=s',
                           'description' => '--base                  '
                                  . 'dec (default), hex or oct'
                            };
    $options;
}
 
# Treat command line option in the constructor
sub new ($$;$) {
    my($class, $attr, $args) = @_;
    my($self) = $class->SUPER::new($attr, $args);
    if ($self->{'parent'}) {
        # Called via Clone()
        $self->{'base'} = $self->{'parent'}->{'base'};
    } else {
        # Initial call
        if ($self->{'options'}  &&  $self->{'options'}->{'base'}) {
            $self->{'base'} = $self->{'options'}->{'base'}
        }
    }
    if (!$self->{'base'}) {
        $self->{'base'} = 'dec';
    }
    $self;
}
 
sub Run ($) {
    my($self) = @_;
    my($line, $sock);
    $sock = $self->{'socket'};
    while (1) {
        if (!defined($line = $sock->getline())) {
            if ($sock->error()) {
                $self->Error("Client connection error %s",
                             $sock->error());
            }
            $sock->close();
            return;
        }
        $line =~ s/\s+$//; # Remove CRLF
        my($result) = eval $line;
        my($rc);
        if ($self->{'base'} eq 'hex') {
            $rc = printf $sock ("%x\n", $result);
        } elsif ($self->{'base'} eq 'oct') {
            $rc = printf $sock ("%o\n", $result);
        } else {
            $rc = printf $sock ("%d\n", $result);
        }
        if (!$rc) {
            $self->Error("Client connection error %s",
                         $sock->error());
            $sock->close();
            return;
        }
    }
}
 
package main;
 
my $server = Calculator->new({'pidfile' => 'none',
                              'localport' => 2000}, \@ARGV);

$server->Bind();
```

# 起動

デフォルトだとSys::Syslogを使ってログを書きだそうとします。
Sys::Syslogが入っていない場合は ``--logfile`` オプションを使えばよいです。

```bash
$ perl calc_sv.pl --logfile daemon.log
Wed Jul 15 23:41:45 2015 notice, 0, Server starting
```

これで待ち受け状態になりました。

# クライアントからの接続

サンプルソースの通り、port2000で待ち受けているのでtelnetで接続してみます。

```bash
$ telnet 127.0.0.1 2000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
1+1<Enter>
2
2*2<Enter>
4
<Ctrl>+]
telnet> q<Enter>
Connection closed.
```

# 解説

* 実際の計算はevalのところです。入力された文字列はperl構文として評価されるわけです。
* ``--base hex``とすると16進、``--base oct``とすると8進で計算されます。

# 参考
Hashの順番をそのまま逆順にする

最初reverseしてinvertだろって思ったんですが、

```rb
p Hash[*<<-"EOS".split.reverse].invert
  HOGE1 1
  HOGE2 2
  HOGE3 3
EOS

# {
#  "HOGE3"=>"3",
#  "HOGE2"=>"2",
#  "HOGE1"=>"1"
# }
```

一度reverseしてからhashにするとkeyが重複しているものが綺麗に消えてしまいます。

```rb
p Hash[*<<-"EOS".split.reverse].invert
  HOGE1 1
  HOGE2 1
  HOGE3 2
  HOGE4 2
  HOGE5 3
  HOGE6 3
EOS

# {
#  "HOGE5"=>"3",
#  "HOGE3"=>"2",
#  "HOGE1"=>"1"
# }
```

じゃあkeyをsortかなって思いましたが、

```rb

p Hash[*<<-"EOS".split].sort_by{|k, v|k}.reverse.to_h
  HOGE1 1
  HOGE2 1
  HOGE3 2
  HOGE4 2
  HOGE10 3
  HOGE12 3
EOS

# {
#   "HOGE4"=>"2",
#   "HOGE3"=>"2",
#   "HOGE2"=>"1",
#   "HOGE12"=>"3",
#   "HOGE10"=>"3",
#   "HOGE1"=>"1"
# }


```

そもそも純粋な逆順を満たすものじゃないですね。

なので結果こんな感じになってしまいました。

```rb
p Hash[*<<-"EOS".split.reverse.each_slice(2).map(&:reverse).flatten]
  HOGE1 1
  HOGE2 1
  HOGE3 2
  HOGE4 2
  HOGE5 3
  HOGE6 3
EOS

# {
#  "HOGE6"=>"3",
#  "HOGE5"=>"3",
#  "HOGE4"=>"2",
#  "HOGE3"=>"2",
#  "HOGE2"=>"1",
#  "HOGE1"=>"1"
# }
```
ジャイロとMainCameraの傾き・プレイヤーの同期をもっと密にとる

ここまでスマホのジャイロセンサと[カメラの同期](http://qiita.com/fumishitan/items/c2b023b9b9655d0a7d46)、[プレイヤーの同期](http://qiita.com/fumishitan/items/8c1dd0ece271d2f8b72d)２回に渡って触れてきたが完全なものとは言い難かったので今回それをブラッシュアップした形で書き直します。

大きな問題点は以下の二つだった
・Mainカメラが回転に追従しない
・プレイヤーがz軸周り、x軸周りどちらの回転角の値を指定しても左右にプレイヤーがうごいてしまう

## Mainカメラが回転に追従しない

この事象が起きたのは下記のコードが原因でした。

```csharp
this.transform.localRotation = Quaternion.Euler(0, -start_gyro.y, 0);
```

正面の向きに合わせるキャリブレーションを行うコードが固定的に各軸周りの回転度を指定していたため起こったようです。さらにいうとクオータニオンで指定されたものをオイラー変換なしにオイラー角に指定するのはどうやら御法度のようです...
クオータニオン難しい、、、
これを正面の向きに合わせるキャリブレーションを行いつつ、現在のジャイロセンサの値を反映させるには、初期回転の逆回転を行い、そのご現状のジャイロセンサの値分だけ回転させる操作が必要になります。それを行った方法が以下

```csharp:CameraController.cs
using UnityEngine;
using System.Collections;
//OnGUIの部分は今回は削除
public class CameraController : MonoBehaviour {
  private GUIStyle labelStyle;
  Quaternion start_gyro;
  Quaternion gyro;
  
  void Start(){

  }
	
  void Update () {
   Input.gyro.enabled = true;
   if (Input.gyro.enabled)
   {
    gyro = Input.gyro.attitude;
    gyro = Quaternion.Euler(90, 0, 0) * (new Quaternion(-gyro.x,-gyro.y, gyro.z, gyro.w));
    this.transform.localRotation = Quaternion.Inverse(StartCameraController.ini_gyro) * gyro;
   }
  }	
}
```

StartCameraController.ini_gyroが初期のジャイロセンサの値、Quaternion.Inverseがジャイロセンサの値をもとに逆回転を行う関数です。その後、現状のジャイロセンサの回転をかけてさらに回して現状のジャイロセンサの値を反映しています。
※逆回転の時にくれぐれも「各要素にー１をかけて回転すればいいや！」と勘違いしてはいけません。-1をかけていない時と同じ回転をするらしいですよ！下記の記事参考↓
http://www23.atwiki.jp/yahirohumpty/pages/13.html

## プレイヤーがz軸周り、x軸周りどちらの回転角の値を指定しても左右にプレイヤーがうごいてしまう

今回は[VRレーシングゲーム用ジャイロセンサで操作するプレイヤーを作成する](http://qiita.com/fumishitan/items/8c1dd0ece271d2f8b72d)の記事で記載するプレイヤーをジャイロセンサで操作するロジックの下記の部分が問題だったから起こった事象だと考えられます。

```charp:before
Vector3 p = new Vector3 (action_gyro.x, 0, Speed);
```

上記の部分が下記のように変更することで解決しました。

```csharp:after
Vector3 p = new Vector3 (-1.0f*Mathf.Sin(action_gyro.eulerAngles.z * Mathf.Deg2Rad), 0, Speed);
```
今まで、クオータニオンから直接x軸周りの値を入れていましたが、そもそもx軸周りの回転を入れることが正しくないことに気づきました（このゲームの進行方向がz軸方向なのでこの場合z軸周りの値をとるのが正しい）。
それでも正しく作動していたように見えたのは、x軸とz軸の値が同時に変化していたためでした。
なぜ、x軸とz軸の値が同時に変化していたのかはわからないですが多分、それこそがクオータニオン特有の回転だったのだと思います。

上記のことを改めるべく、クオータニオンをオイラー角に変化させ、それにSin関数を当てはめました。
コードの完全版は下記になります。

```csharp:Runner.cs
public class Runner : MonoBehaviour {
 private GUIStyle labelStyle;
 Quaternion gyro;
 bool goal = false;
 public float Speed = 0.3f;
 void Update () {
  if (goal == false) {
   Input.gyro.enabled = true;
   if (Input.gyro.enabled) {
    Quaternion gyro = Input.gyro.attitude;
    Quaternion action_gyro = Quaternion.Euler (90, 0, 0) * (new Quaternion (-gyro.x, -gyro.y, gyro.z, gyro.w));
    action_gyro = Quaternion.Inverse(StartCameraController.ini_gyro) * action_gyro;
    Vector3 p = new Vector3 (-1.0f*Mathf.Sin(action_gyro.eulerAngles.z * Mathf.Deg2Rad), 0, Speed);
    Debug.Log (action_gyro.eulerAngles.z);
    transform.position += p;
   }
  }
 }
 void OnGoal() {
  goal = true;
 }

}
```

## まとめ

今回学んだことはくれぐれもクオータニオンを要素で使おうとしてはいけないということでした、なるべくクオータニオンは一つの行列として扱うべきだったのです。そして、各要素にアクセスする場合は直感的にも想像できるオイラー角に直して利用するべきでした。それにしてもクオータニオンは難しいです。
MySQLとMariaDBで実験

# MySQL と MariaDB


*注: 私はMySQLとMariaDBについて、何も知りません*

MariaDBはMySQL互換というイメージを持っている。
```mysql```コマンドでつながるし、```/etc/mysql/my.cnf```を参照している。

もしかして中身一緒なんじゃないかと思ったので以下のように実験をした。

## 実験内容

1. docker で mysqlのDBを作り、データファイル的なもの（```/var/lib/mysql```）はvolumeに保存。
2. mysqlコマンドで、データベース、テーブル、レコードを作成。
3. mysqlのコンテナを削除。
4. mariadbのコンテナを作成。データファイル的なものは先程のボリュームを指定。
5. mysqlコマンドでselect出来るか確認。

## 実験手順

```bash
#!/bin/bash

mkdir db
docker run -d -p "3306:3306" -v "$(readlink -f ./db):/var/lib/mysql:rw" -e MYSQL_ROOT_PASSWORD=password --name db mysql

sleep 20

mysql -u root -ppassword -h 127.0.0.1 << EOF
create database test1;
use test1;
create table test_table(name varchar(255));
insert into test_table(name) values ('fooo');
EOF

docker stop db
docker rm db

docker run -d -p "3306:3306" -v "$(readlink -f ./db):/var/lib/mysql:rw" -e MYSQL_ROOT_PASSWORD=password --name db mariadb

sleep 20


mysql -u root -ppassword -h 127.0.0.1 << EOF
select * from test1.test_table;
EOF
```

環境はUbuntu Server 14.04 + docker 1.7.0
## 結果

こんなんなりました

```
ubuntu@ubuntu:~$ bash -x test.sh
+ mkdir db
++ readlink -f ./db
+ docker run -d -p 3306:3306 -v /home/fujioka/db:/var/lib/mysql:rw -e MYSQL_ROOT_PASSWORD=password --name db mysql
e64ce620ae9b849dde62338e63bd35375f36221ed989142bda40dfe31b8582b3
+ sleep 20
+ mysql -u root -ppassword -h 127.0.0.1
+ docker stop db
db
+ docker rm db
db
++ readlink -f ./db
+ docker run -d -p 3306:3306 -v /home/fujioka/db:/var/lib/mysql:rw -e MYSQL_ROOT_PASSWORD=password --name db mariadb
475af5ed11ce71d37075b87ce6aae7482d304bfde95bc9cb00d31613336ed3e2
+ sleep 20
+ mysql -u root -ppassword -h 127.0.0.1
name
fooo
ubuntu@ubuntu:~$
```

とりあえず、ちゃんとselect出来たように見えます。（最後のfoooは、test1.test_tableにinsertしたもの）

## まとめ

MySQLとMariaDBは内部的なファイルの持ち方も同じで、差が無いように見える。
が、engineがInnoDBだからじゃないのか？とか、MariaDBのdockerのイメージがマイグレーション的なことをしているんじゃないのか？とか、これだけではわからないことが沢山有る。
なので、同じとは断言できないかなぁと思うものの、少なくともdockerのMySQLのイメージからMariaDBのイメージへの乗り換えはんたんに出来ると思われる。
Cloud Foundryのコンテナに入る、ファイルをコピーする

Cloud FoundryにデプロイしたアプリはWardenと呼ばれるコンテナで動いています。
通常はこのコンテナ内に入ることができませんが、ツールやプラグインを使うことでコンテナに入ったり、ファイルを取得したりができるようになります。


# cf-ssh

Cloud Foundryにデプロイしたアプリのコンテナに入ります。
コンテナの中に入ってしまえば、通常のLinuxと変わらないのでデバッグやファイル操作などを行うことができます。

## 前提

* Linux or Mac
* `cf` CLIが導入されている
* `$HOME/.ssh/`にSSH認証鍵がある


## コマンドのインストール

以下から`cf-ssh`のバイナリをダウンロードします。

Releases · cloudfoundry-community/cf-ssh
https://github.com/cloudfoundry-community/cf-ssh/releases

ダウンロードしたファイルを`cf-ssh`にリネームして実行権限を付加します。
そして、このファイルをPATHの通っている場所に配置します。

```
mv cf-ssh_linux_amd64 cf-ssh
chmod +x cf-ssh
mv cf-ssh /usr/bin
```

## 使い方

`cf-ssh`コマンドを使うには、`manifest.yml`を用意しておく必要があります。

```
cd APPNAME
cf-ssh APPNAME -f manifest.yml
```

コマンドを実行すると`APPNAME-ssh`という名前のアプリがデプロイされます。
この状態ではルートがバインドされていないため、アプリの動作を確認するためには主導で別途ルートを設定する必要があります。


## 注意事項

コンテナから一度ログアウトするとそのコンテナには入れなくなるようです。
再度コンテナに入るにはアプリをデプロイし直す必要があります。


## トラブルシューティング

### Permission denied (Publickey)

認証鍵がない場合にこのエラーが発生します。
`ssh-keygen`コマンドを使って鍵ファイルを作成しておきます。
私の環境では、`$HOME/.ssh/`に認証鍵をおいておけば認識されました。


# cf-download plugin

Cloud Foundryで稼働しているアプリケーションのファイルをローカルにコピーします。
`cf` CLIのプラグインとして動作します。


# 前提

* `cf` CLI（バージョン6.10以上）が導入されている


## プラグインのインストール

以下のにコマンドを実行すると`cf download`コマンドが使用可能になります。

```
cf add-plugin-repo CF-Community http://plugins.cloudfoundry.org/
cf install-plugin cf-download -r CF-Community
```


## 使い方

アプリのディレクトリ構造が以下の通りだったとします。

```
app
　├ src/
　├ log/
　│　　├ access.log
　│　　└ error.log
　└ lib/
```

このアプリに対して、以下のコマンドを実行するとカレントディレクトリに対象ディレクトリとその親ディレクトがコピーされます。

```
cf download APPNAME log
```

今回の場合は、以下の構造でダウンロードされます。

```
APPNAME-download
　└ log/
　　　├ access.log
　　　└ error.log
```


## 注意事項

ダウンロードするパスを指定しないとすべてのファイルがダウンロードされます。
例えばJavaの場合、`.java`ディレクトリに含まれるファイルも含まれているため、パスを指定して必要なファイルのみをダウンロードしないと時間がかかります。


# まとめ

Cloud Foundryにアプリをプッシュしたけどうまく動かず、`cf logs`してもエラーログが確認できないといった場合のデバッグ用途には`cf-ssh`は便利かと思います。
`cf download`はコマンドをバッチで定期的に実行するなどして、ログを外部に保存する簡易な仕組みを構築するのに向いているのではないかと思います。


# 参考情報

cf-sshでCloud Foundryのコンテナ内に潜り込む - Cloud Penguins
http://jaco.udcp.info/cf-ssh/

cloudfoundry-community/cf-ssh
https://github.com/cloudfoundry-community/cf-ssh

ibmjstart/cf-download
https://github.com/ibmjstart/cf-download
whereで複数条件検索

忘れないようにメモしときます。短いです、一瞬です。

```ruby
モデル名.where("(カラム名 = ?) OR (カラム名 = ?)", 変数,変数)
```

って感じです。
具体的に書くとこんな感じ

```ruby
User.where("(id = ?) OR (id = ?)", 11, 12)
```


おまけ
--------
範囲検索もしたいときがあるのでそれもついでに載せます

```ruby
モデル.where(:id => 変数..変数)
```
具体的に書くとこんな感じ

```ruby
User.where(:id => 1..10)
```

これで1~10がとれます。

```ruby
from = 1
to = 10
User.where(:id => from..to)
```

とかもできると思います。


おまけ2
--------

あいまい検索とか言われているものもついでにメモしておきます。
ここ以降はバラバラなんだよなーといったときに使います。

```ruby
モデル名.where("カラム名 like '%検索テキスト%'")
```

具体的になるとこんな感じ。

```ruby
Company.where("url like '%hegehoge/hoge/%'")
```

これだとurlがhogehoge/hoge/1とかhogehoge/hoge/2
とかが取得できます。。。。
【AWS】参照専用のIAMユーザを削除する手順

[こちら](http://qiita.com/iron-breaker/items/181006f013c3825d7044)からの続きです。

# 参照専用ユーザを削除する

※事前にAWSにログインください。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/55774822-6745-7468-2945-0a650b39ef91.jpeg "1.jpg")

ーーーー


![削除.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/d7c6dc06-78e5-6c10-041e-450ed9fe94e6.jpeg "削除.jpg")
チェックボタンのアンカーの範囲を広げる

チェックボタンをつけたときにどちらにチェックが付いているのか判別したかったのとそれをカラムとして保存したかったときにちょろっと詰まったのでメモしときます。

レファレンスとかもろもろに従って最初に書いたコードが以下です。
たしかこんな感じだったような・・・
[radio_buttonのレファレンス](http://railsdoc.com/references/radio_button)
[f.labelのレファレンス]
(http://railsdoc.com/references/label)

```erb:hoge.erb
<%= form_for @user, url: hogehoge_path do |f| %>      
  <div class="glay">
    <%= f.radio_button :hoge_flg, true %>
    <%= f.label :hoge_flg_true,"Yes" %>
  </div>
  <div class="glay">
    <%= f.radio_button :hogee_flg, false %>
    <%= f.label :hoge_flg_false,"No" %>  
  </div>
  <%= render partial: 'form_submit' %>
<% end %>
```

このコードだとYes Noの文字の部分かチェックボックスをクリックしないとチェックボックスにチェックが入らないという状態になり、それを囲んでいるdivのglayが意味ない感じになっています。
divのglayで囲んでいる部分をどこでクリックしてもチェックできるようにしました。
以下です。

```erb:hoge.erb
<%= form_for @user, url: hogehoge_path do |f| %>
  <%= f.label :hoge_flg_true do %>
    <div class="glay">
      <%= f.radio_button :hoge_flg, true %>
      Yes
    </div>
  <% end %>
  <%= f.label :hoge_flg_false do %>
    <div class="glay">
      <%= f.radio_button :hoge_flg, false %>
      No
    </div>
  <% end %>
  <%= render partial: 'form_submit' %>
<% end %>
```

正直labelでブロックを使用しその支配下にするなんて方法を知らなかったので今回なかなか感動しました。
なにかのときに参考になれば幸いです。。。。
第13章 リファクタリングとは

リファクタリングの種類

# リファクタリングとは？
一つ以上のテーブルの設計を変更する作業のこと。

# リファクタリングの手順
バックアップ
変更
データ移行
トリガー作成
デプロイ
トリガー削除

リファクタリングして性能堕ちる場合もある。→ベンチマークテスト
ベンチマークテスト　→　スペック/os/データサイズまでも本番と同様のテスト環境で速度と性能をチェック　

マイグレーションファイルでDBの履歴を管理

# トリガー
移行期間は同じデータが二箇所存在することになる。　→　面倒　→　トリガー
２つのテーブル間で双方向にトリガーをつけておけば、データが同期される。

# インデックス　
# カラム名　
# not null制約　
→　見極めが大切
# 主キーの定義変更
→　規約出ない時、

主キーが一意性制約を満たせることが重要　

# 無損失分解(正規化)
→ トリガーで同期

# テーブルの垂直分割と統合
複数のテーブル間で直交性が満たされていない場合、テーブルの統合が必要。

# リファクタリングのベストプラクティス
## カラムではなくテーブルを追加する。
既存のテーブルにカラムを追加してしまいがちですが、1NFを満たさなくなる可能性があります。


## select * を使わない
→　railsだと考慮できない。全部fetch allしてしまう。

## 1つのDBには1つのアプリケーションからしか直接アクセスしない。
→　API使え
14章　トランザクションの本質


# トランザクション
データを保守するための考察された手法 
同時実行制御
クラッシュリカバリ→中途半端な更新はロールバックする。

# 並列実行
直列だと簡単だが、並列にしないとパフォーマンスが悪い。　
→　スケージューリングが重要。

# スケジューラの性能
以下に多くのトランザクションを並列化出来るか
最適なスケジュールを探しだすために必要なコスト
RDBでは、ロックを用いたロッキングスケジューラ

# ACID
## Atomicity(原子性)
完成か、全壊か

## Consistensy(一貫性)
アプリケーション側しか判断d境内

## Isolation(分離性) 
トランザクション同士が干渉しない

## Durability(永続性)
一旦コミットが完了したトランザクションが消失しない(マシンが消失しても)

# トランザクションの異常
## ロストアップデート
別トランザクションのせいで自分の更新が消える

## インコンシステントリード
ある人のトランザクション中に、別の人がそのデータを読むと一貫性の無い値になる

## ダーティリード
コミット前のデータを読み取ることによって起こる

## ノンリピータブルリード
同トランザクション内で同じレコードをselectしても異なる値が返ってくる

## ファントムリード
範囲検索を下場合に、新しい行が増える

# トランザクションの分離レベル(下に行くほど堅牢)
## read - uncommitted コミットしてないデータも読める
## read - committed コミットしたデータが読める
## repeatabe read トランザクション中は他のトランザクションでコミットしたデータも読めない
## serializable 直列のトランザクションなので、データに異常が起きない

# MVCCのメリット
更新が参照をブロックしない事
インデックスとインデックス間をロックするのはファントムリードを防ぐため

transactionは、
テーブルが２つ以上の更新時とかにかける。
「アジャイルサムライ読書会 廣島道場　２−５」参加したよ

https://sukusuku-scrum-hiroshima.doorkeeper.jp/events/28350

前々回の２−３に参加したのですが、メモをとり忘れて話ばかりしていました。
今回は、３０分遅刻しましたが、無事参加でき、メモもとれました。

## 「第５章　具現化させる」

目に止まったワードは

* チームを選ぶことはアーキテクチャを選ぶこと
* ITプロジェクトの守備範囲は６ヶ月以内

![20150715_agile-05.png](https://qiita-image-store.s3.amazonaws.com/0/53620/cdc27890-4570-ac03-81f5-637c8e77a709.png)

「夜も眠れない」にもつながりますが、初めてのことはリスクがあると思います（そのためのスパイクがあるっとの発言もありました）。

新しいことをしない理由はたくさんあります。
使い慣れたやり方で無難にこなすことも大切だと思います。

が、それがアーキテクチャを狭め、お客様に迷惑をかけるのであればダメですね。
日々新しいことを学ぶ必要を再認識しました。
.tmux.confメモ

# prefixキーをC-zに変更
```
set-option -g prefix C-z
```
# C-bのキーバインドを解除する
```
unbind C-b
```
# キーストロークのディレイを減らす
```
set -sg escape-time 1
```
# ウィンドウのインデックスを1から始める
```
set -g base-index 1
```

# ペインのインデックスを1から始める
```
setw -g pane-base-index 1
```

# 設定ファイルをリロードする
```
bind r source-file ~/.tmux.conf \; display "Reloaded!"
```

# | でペインを縦に分割する
```
bind | split-window -h
```
# - でペインを横に分割する
```
bind - split-window -v
```

#コマンド複数画面一括入力on/off
```
bind s setw synchronize-panes on
bind S setw synchronize-panes off
```
# 256色端末を使用する
```
set -g default-terminal "screen-256color"
```

# ◆◆◆コマンドメモ◆◆◆
#セッションの作成
tmux

#セッション名をつける
tmux new-session -s

#セッションのデタッチ
C-z d

#セッションの確認
tmux list-sessions
tmux ls

#セッションをアタッチする
tmux a

#セッション名を指定してセッションをアタッチ※例:セッション 0 をアタッチする場合
tmux a -t 0

※参考ページ
http://kaworu.jpn.org/kaworu/2009-10-25-1.php#2009-10-25-1-02228e222c01ebbb787f016fba435607
Tmux install

RPMforgeリポジトリ：標準のyumコマンドではインストールできないパッケージを追加する。
ここから使用しているLinuxに合ったものをダウンロードする。
(CentOS6の64bitなら”rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm”)
wgetコマンドを使ってダウンロード
$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpmコマンドを使ってインストール
rpmコマンド

rpmパッケージをインストールする。
"-i"はインストールのオプション，"-v"と"-h"は情報表示のオプション。
$ sudo rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
”/etc/yum.repos.d/”ディレクトリにはyumのリポジトリファイルが入っている。
インストールが正常に完了していれば”rpmforge.repo”ファイルが確認できる。
tmuxをインストールする

yumコマンドを使ってインストール
$ sudo yum -y install tmux
Mac の boot2docker が動かなくなった

# 久しぶりの起動
マックで久しぶりに ```boot2docker``` を起動。
以前書いた [MacでDocker(boot2docker)](http://qiita.com/takara@github/items/6acefb5c709b8833b5fc)なのですが、そもそもマックではサービスとして利用していないので使わないときは落としていて、イメージを作るときだけ使う感じなのですが、久しぶりに起動すると動かない。わーいｗ

```bash
$ boot2docker up
Waiting for VM and Docker daemon to start...
............oo
Started.
Writing /Users/<user>/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/<user>/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/<user>/.boot2docker/certs/boot2docker-vm/key.pem
Your environment variables are already set correctly.

$ docker ps
Error response from daemon: client and server don't have same version (client : 1.19, server: 1.17)
```

なんかバージョンがどうの言ってる、クライアントが上だとダメなのだろうか？別件で ```brew update``` とかやったりしてるけどサーバーも一緒にあげてくれないの？（・・；

```brew update``` ```brew upgrade``` したけど状況変わらず（・・；

## バージョンアップ
という訳でサーバーのアップデートをググると ```boot2docker``` 自身でアップグレードするのね・・・ 
```Homebrew``` で入れたのに分かりづらいね・・・
しかも！１．１７から１．７．１にあがったぞ！？上がりすぎじゃね？ｗ
これ先のメッセージと比べるバージョンじゃないのかな？あれ？２つ目の数字が１７だと逆に下がってない？ｗ


```bash
$ boot2docker down
$ boot2docker upgrade
docker is up to date (1.7.1), skipping upgrade...
boot2docker is up to date (v1.7.1), skipping upgrade...
Latest release for github.com/boot2docker/boot2docker is v1.7.1
Downloading boot2docker ISO image...
Success: downloaded https://github.com/boot2docker/boot2docker/releases/download/v1.7.1/boot2docker.iso
	to /Users/<user>/.boot2docker/boot2docker.iso
```

## 動作確認

とりあえず、動かしてみる。
うーん、私のバージョンの認識違いなだけだったのかな？

```bash
$ boot2docker up
Waiting for VM and Docker daemon to start...
................oo
Started.
Writing /Users/<user>/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/<user>/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/<user>/.boot2docker/certs/boot2docker-vm/key.pem
Your environment variables are already set correctly.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

## バージョンを確認してみる

するとどうやら先ほどみたバージョンは ```API Version``` だったみたいですね。

```bash
$ docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): darwin/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
```

```docker``` で何かやるつもりだったけどこれだけやったら今日はやる気失せたｗ
mysqlでcreatedとmodifiedを作成

#以下をセットし、INSERTのときにcreatedにnullを指定すると現在の時間が保存される。
```
created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
```

#カラムを作成
```
create テーブル名 (id int auto_increment not null primary key, name varchar(255), created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
```

#データを入れてチェック
```
INSERT INTO テーブル名 (name, created) VALUES('田中太郎', null);
```

#結果
| id | name     | created             | modified |
|----|----------|---------------------|----------|
| 1  | 田中太郎 | 2015-07-15 21:19:48 |    2015-07-15 21:19:48      |

#参照
http://blog.morizotter.com/2012/06/10/make-created-and-modified-columns-in-mysql/
Git submodule で登録するとき


もうあるリポジトリをサブモジュールとして追加する場合

```
git submodule add -f [repository_url]
```

※.gitignoreで無視しているとエラーが出た場合[-f]オプションをつける。


削除するとき

```
git submodule deinit [submodule_path]
```

```
git rm [submodule_path]
```
RuboCopの設定アレコレ


# 概要
RuboCop 設定に関するアレコレです。

- 設定ファイルってどこに何を置くんだろう？
- 設定項目一覧ってどこにあるんだろう？
- デフォルトの設定ってどこにあるんだろう？

ということが気になったので、それについてまとめています。

# RuboCop とは
(Omitted)

以下の資料が非常にわかりやすかったため、RuboCop に関する説明は省略します。

- [RuboCop なるものがあるらしい](http://yamanetoshi.github.io/blog/2015/02/25/translating-rubocop-readme/)
- [RuboCopをRailsオプションやLintオプションで使ってみよう](http://sideci.hatenablog.com/entry/2015/03/12/160441)


# 設定ファイル (`.rubocop.yml`)
RuboCop の挙動は`.rubocop.yml`で設定可能です。

ホームディレクトリとかプロジェクトディレクトリに配置できるとのことですが、基本はプロジェクトのルートディレクトリに配置しておくと良いと思います。

> The behavior of RuboCop can be controlled via the .rubocop.yml configuration file. It makes it possible to enable/disable certain cops (checks) and to alter their behavior if they accept any parameters. The file can be placed either in your home directory or in some project directory.

> <cite>[Rubocop#Configuration](https://docs.rubocop.org/en/stable/configuration/)</cite>

# 設定項目一覧
Cop (Check項目) 一覧は [RuboCop のデフォルト設定ファイル](https://github.com/rubocop-hq/rubocop/blob/master/config/default.yml) を見るのが一番良さそうでした。

次に良さそうだった方法としては、RubyDoc を直接見ると内容がわかりそうでした。
検索窓に気になる単語を入れて、頑張ってお目当ての設定を探しましょう！

- [Module: Rubocop::Cop](https://www.rubydoc.info/gems/rubocop/RuboCop/Cop)

基本となる Cop は以下の4種類があるそうです。

> - Style (スタイルについてのCop)
> - Lint (誤りである可能性が高い部分やbad practiceを指摘するCop)
> - Metrics (クラスの行数や1行の文字数などに関してのCop)
> - Rails (Rails特有のCop)

> <cite>[RuboCopをRailsオプションやLintオプションで使ってみよう](http://sideci.hatenablog.com/entry/2015/03/12/160441)</cite>

Lint ってなんやねんって思って調べてみると、通信用語の基礎知識が出てきました。

> 通常、単にlintと言うとUNIXコマンドのC用構文チェッカの意だが、C以外の言語にも同種のプログラムがいくつか作られている。例えばHTML用のHTML-lintとして、Another HTML-lintが有名である。

> なお、lintとは元々「リント」という布(リンネルの片面を起毛して柔らかくした布で昔の包帯などに用いられた)または「糸くず」の意で、乾燥機の糸くず取り(lint trap)から余計なゴミを取り除く様をプログラム名として流用したものである。

> <cite>[lint - 通信用語の基礎知識](http://www.wdic.org/w/TECH/lint)</cite>

な、なるほど？

# デフォルト設定
デフォルト設定の確認は YAML ファイルを確認すれば行えます。

- [rubocop/config](https://github.com/rubocop-hq/rubocop/tree/master/config)

それぞれ、

- default.yml (デフォルトで設定されている値)
- disabled.yml (デフォルトでオフになっている Cop)
- enabled.yml (デフォルトでオンになっている Cop)

に記載されています。

# Ruby バージョン
Ruby バージョンを以下のとおり指定できます。

```yaml:.rubocop.yml
AllCops:
  TargetRubyVersion: 2.2
```
# Rails モード
Rails 用に最適化されたモードは以下を`.rubocop.yml`に追記しておけば使用可能です。
ファイルパスからからどのチェックをするのが良いかを自動的に判断してくれるそうなので、Rails プロジェクトなら基本`true`にしておけば良いと思います。

```yaml:.rubocop.yml
Rails:
  Enabled: true
```

## 該当ソース
- [rubocop/config/default.yml#L524-L559](https://github.com/rubocop-hq/rubocop/blob/5d1bf0ff64d8254b33cf0a10ad7a4b19c4de6b1e/config/default.yml#L524-L559)

# 対象ファイル
RuboCop は開始したディレクトリから再帰的に全てのファイルをチェックしますが、基本は Ruby ファイルのみをチェックします。

チェック対象の追加や削除は`Include`や`Exclude`で行えるそうです。

> ```yaml
> AllCops:
>   Include:
>     - '**/Rakefile'
>     - '**/config.ru'
>   Exclude:
>     - 'db/**/*'
>     - 'config/**/*'
>     - 'script/**/*'
>     - !ruby/regexp /old_and_unused\.rb$/
> ```

> <cite>[Including/Excluding files](https://github.com/bbatsov/rubocop#includingexcluding-files)</cite>

# まとめ
PullRequest 作成時に CI ツールが自動で RuboCop してくれるようにするとめっちゃ便利(\*´ｪ`\*)
VTKによるファイル読み込みと書き込み

#VTKによるファイル読み込みと書き込み
VTKによるファイルからの読み込みと書き込み(保存)の方法について説明する．

##対応ファイル形式
VTK独自のフォーマットの他にもSTLなどの汎用的な形式の読み込みにも対応している．
* VTKフォーマット (.vtp, .vti, .vtu, .vtkなど)
* STL (.stl)
* PLY (.ply)
* OBJ (.obj)
* テキスト

##読み込み
読み込むファイル形式によって，使用するReaderが異なるが基本的には．以下の手順で行う．
1. Readerを宣言してNew.
2. SetFileName()でファイル名を指定して，Update().
3. GetOutput()でデータを取得．

一例としてVTKフォーマットのポリゴンデータ(.vtp)をvtkPolyDataに読み込む方法は以下の通り．
[(公式サンプル)](http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/ReadPolyData)

```cpp
vtkSmartPointer<vtkXMLPolyDataReader> reader = vtkSmartPointer<vtkXMLPolyDataReader>::New();
reader->SetFileName("filename.vtp");
reader->Update();
vtkPolyData* polydata = reader->GetOutput();
```

また，ファイル拡張子でReaderを切り替えるようには以下のようにする．
[(参考)](http://marc.info/?l=vtk-developers&m=126471789304821)


```cpp
vtkSmartPointer<vtkPolyData> output;

if (extension == ".stl")
  {
  vtkNew<vtkSTLReader> reader;//vtkSmartPointer<vtkSTLReader>でもOK.
  reader->SetFileName(filename);
  reader->Update();
  output = reader->GetOutput();
  }
else if (extension = ".vtk")
  {
  vtkNew<vtkPolyDataReader> reader;
  reader->SetFileName(filename);
  reader->Update();
  output = reader->GetOutput();
  }
```


##書き込み
読み込みと同様に書き込むファイル形式によって，使用するReaderが異なる．
1. Writerを宣言して，New.
2. SetFileName()で書き込みファイル名を指定．
3. SetInputData()でデータをセット．
4. Write()を呼ぶ．正常に保存した場合には1を返し，失敗した場合には0を返す．

VTKフォーマットのポリゴンデータ(.vtp)を保存するコードを以下に示す．
[(参考)](http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/WriteVTP)

```cpp
//vtkPolyData* polydataを書き込みたいデータとする．
vtkSmartPointer<vtkXMLPolyDataWriter> writer　=　vtkSmartPointer<vtkXMLPolyDataWriter>::New();
writer->SetFileName("file.vtp");
writer->SetInputData(polydata);

//保存形式を選べる．アスキー/バイナリを選択可能．
//writer->SetDataModeToBinary();
//writer->SetDataModeToAscii();
writer->Write();
```
Kobito の export


### 簡単な方法
https://github.com/suin/kobito-cli
をインストールした後

```
kobito ls | perl -lane 'next if $. == 1 ; qx{kobito show $F[0] >> $F[0].md}'
```
タイトルをファイル名にしたい人は、`$F[1].md` に出力させれば良いがお勧めはしない。

### SQL を叩く方法

```
sqlite3 Kobito.db 'select ztitle zraw_body from ZITEM;'
```

まとめて出力するので良ければ、これだけで事足りる。
SQLite3 のメンテ



最近 Kobito が編集内容を保存してくれない事がある。

編集後、一旦 quit しても、再度開いた時には、編集前のデータに戻ってしまう[^1]。
[^1]: 他のデータを弄ったら上手く行く時もあるが、、、
要するに、内部データベースの更新が上手く行ってないっぽい。
つー事で、`sqlite3` のメンテの定番を実行する。

## sqlite3 database の場所

20150710 現在

```
% pwd
${HOME}/Library/Containers/com.qiita.Kobito/Data/Library/Kobito
```


### メンテ
単に `sqlite3` で `VACUUM` する。

```
% ls -alh Kobito.db
-rw-r--r--@ 1 XXXXXX  staff   1.9M  7 9 19:46 Kobito.db
% sqlite3 Kobito.db 'VACUUM; REINDEX;'
% ls -alh Kobito.db
-rw-r--r--@ 1 XXXXXX  staff   1.7M  7 9 19:55 Kobito.db
```
多少は良くなったか？、、、

## ついでに汎用ワンライナー
`~/Library/Containers` にでも入って、以下のコードを叩く。

```
find . -type f -exec file {} \; | perl -F: -lane 'next if $F[1] !~ /sqlite.*?database/i ; qx{sqlite3 \047$F[0]\047 \047VACUUM;REINDEX;\047} '
```

単に `file` コマンドで SQLite の database だと結果が現われたもんだけ拾って、メンテコードを流し込んでるだけ。

Chrome とか割と軽くなる。
gulp-compass がimage-url から生成するパスの意味がわからない君へ

# ゴール

(全容を掴んだ上で書きなおしたので、実際にはあまり使わない構成かもしれないが気にしない)

* src/sass/*.scss にてimage-url("bg_body.gif") を指定
* src/images/* に画像を配置

* src/compiled_css/*.css にコンパイル結果が置かれる
* dist/css/ に*.css が置かれる
    * url("../images/bg_body.gif") で参照
* dist/images/ に画像が置かれる

# 検証
## 相対パスはどう計算される？

* 仮説
    * コンパイル後のCSS から見た時の、project への相対パス?
    * images_dir があれば、css とimages_dir の相対パスを計算、images_dir が無ければ、project との相対パスの後ろにデフォルトのiamges_dir をくっつけるだけ？

* 検証に使用したリポジトリ
    * https://github.com/masaki925/gulp_compass

* 検証によく使ったコマンド

```bash
# 前回のビルド結果を消す
bundle exec gulp clean

# ファイルの配置を確認。node_modules とかを避けたいのでdir 指定
ll ; tree dist src

# ビルド
bundle exec gulp build
```

* 検証結果シート
    * 挙動がよくわからんかったのでいろいろパラメータを変えてはビルドしてを繰り返してた。。
    * https://docs.google.com/spreadsheets/d/1Z6SyKVOoBQGzq99-OEO6WKb6esdCzLuuCRdKb_HPv2o/edit#gid=0

## デバッグ

* gulp のcompass にdebug: true を渡すと、実際に実行されているcompass コマンドが表示される

# 結論

* config.rb の設定は無視される
* relative true のときはcss ファイルからみたときのimages のディレクトリの相対パスを取得する
    * https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/urls.rb#L126
    * https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/urls.rb#L260
* その他の条件も、↑のコードを読めばわかる、かも。


* relative false だとディレクトリ構成が違っていても最終的に辻褄を合わせることはできるが、build のときにimages が無いよとwarning が出てしまう
    * compile 前後でディレクトリ構成が変わらない場合
        * relative true で、普通にcompile 前のパスを指定 (css, image)
        * => warning 出ない
    * compile 前後でディレクトリ構成が変わる場合
        * relative false で、普通にcompile 前のパスを指定 (css, image)
        * => warning 出る

* こうするとよさそう
    * compile 前後でディレクトリ構成は揃える
        * build 後のcss から見たimages の位置を、compile 前後で同じにする
    * relative はtrue
    * image もパスを指定する

# 余談

最初からソースコード見れば検証シート不要だったかな。。でもソースコードがなかなか見つけられなかったからしょうがない。
ちょっと特殊なJavaのアノテーション


# 特殊なアノテーション
型定義の際や、JavaDocに記述できるアノテーション（タグ）について紹介、
というよりメモ。

## アノテーションを独自定義する
### interface

アノテーションの宣言を行う。

```java
@interface OriginAnnotation {
	String value();
}
```

## メタアノテーション

### Documented
型の宣言に@Documentedが付加されていれば、
その注釈は注釈付き要素の公開APIの一部となる。

### Retention
アノテーションの読み込みタイミングを指定できる。
``java.lang.annotation.RetentionPolicy``から選択

- ``CLASS``: コンパイル時にクラスファイルに記録される。実行時にVMに読み込まれない。
- ``RUNTIME``: 実行時にVMに読み込まれる
- ``SOURCE``: コンパイル時に破棄

### Target
注釈型が適用可能なプログラム要素の種類を示す。
``java.lang.annotation.ElementType``から選択

- ``ANNOTATION_TYPE``: アノテーションに適用可
- ``CONSTRUCTOR``: コンストラクタに適用可
- ``FIELD``: フィールドに適用可
- ``LOCAL_VARIABLE``: ローカルに適用可
- ``METHOD``: メソッドに適用可
- ``PACKAGE``: パッケージに適用可
- ``PARAMETER``: 引数に適用可
- ``TYPE``	Class、Interface、Enum可

### 上のをAnnotationたちを合わせる
```java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface OriginalAnnotation {
	String value();
}
```


## JavaDocタグ（JavaDoc内で利用するアノテーション）

### author
筆者を示す。

```java
/**
 * @author kashira2339
 */
```

### param
引数の変数名と説明。

```java
/**
 * @param email 会員のEメールアドレス
 */
```

### return
返り値の説明。

```java
/**
 * @return 検索結果
 */
```


### throws, exception
メソッド内で発生する例外のクラス名、及びその説明を記述する。

```java
/**
 * @exception IOException 文字入力エラー
 */
```

### link
JavaDoc内に参照可能なリンクを作成する。

```java
/**
 * @exception {@link IOException} 文字入力エラー
 */
```

### literal
テキスト向け。不等号を書ける。

```java
/**
 * {@literal A<B>}
 */
```
 

### code
JavaDoc内にコードを書く時。

```java
/**
 * {@code null}
 */
```

### inheritDoc
オーバーライドしたメソッドのJavaDoc部分に付与すると、
スーパークラスにて記述されたJavaDocを参照できる。

```java
/**
 * {@inheritDoc}
 */
@Override
public String getString() {
	return path;
}
```

# まとめ
Javaを書く中で見慣れないアノテーションに出会ったら、
その度追記する予定。
シグモイド曲線の定義域が有界でないので、有界なシグモイド曲線を勝手に作ってみた

[Wikipedia - シグモイド](https://ja.wikipedia.org/wiki/シグモイド)
タイトルの通り、シグモイド曲線の定義域は $(-\infty,\ +\infty)$ と有界ではありません。
これでは計算機で取り扱う時、閉区間でないことが原因でぴったりした値を出せないため、中途半端な値を相手にプログラミングしなければなりません。
もっと厳密に結果を出したい！ということで、同じような曲線を描く、定義域も値域も閉区間な関数を勝手に作っちゃいましょう。

```math
PseudoSig_{t}(x)\ =\ \frac{\sinh^{-1} [ (2x-1) \sinh(t) ] }{2t}\ + \ \frac{1}{2}
```

次の図は $t = 4$ とした時に出力した図です。
![60909528306.png](https://qiita-image-store.s3.amazonaws.com/0/34654/28d1b98b-1cf8-c93d-50ce-7862522e21a5.png)
一般に、 $t$ を大きくすると曲がり具合が強くなります。
今回の例では $\frac{1}{2}$ を足すことで値域を $[0,\ 1]$ にしましたが、この項を消すことで通常のシグモイド曲線の様に変形することが可能です。

#### 謝辞
図の出力には以下のサイトを用いました。
[http://keisan.casio.jp](http://keisan.casio.jp)
Node Express ProjectをHerokuで起動してみました

## 目的
Nodeclipseで作成したNode Express ProjectをHerokuで起動します

## 手順
1. Node Express Projectを新規作成します
2. herokuで起動できるようにProcfileを作成します<br/>
※[foreman start web]コマンドでローカル起動できなくてもherokuでの起動には問題ありませんでした。
3. 作成したProjectにローカルリポジトリを作成します
4. herokuにプッシュしないファイルを除外し、コミットします
5. コマンドプロンプトでプロジェクトのカレントディレクトリへ移動します
6. コマンドプロンプトからheroku createコマンドを実行してherokuのアプリケーションを作成します
7. herokuへソースをプッシュします
8. プロジェクトを起動させます
9. heroku openで確認します

## 感想
手順を覚えてしまうとかなり簡単な印象を受けました
Phalcon ルーターの作成

# Phalconでのルータ作成

初投稿になります。
Phalconでルーティングするための設定を書いたので、忘れた時ように書いておきます

**前提としてPhalconをインストール及びDevToolsをインストールしているとします。**

## Router.php の作成
/app/config/ の中に router.php を作成しておきます。

## Config.php の編集
/app/config/config.php の application の中に以下を追記します。

``` lang:config.php
    'configDir'      => APP_PATH . '/app/config/',
```

## Service.php の編集
/app/config/service.php の url の下ぐらいに以下を追記します

``` lang:service.php
    /**
     * Router
     */
    $di->set('router', function () use ($config){
        require $config->application->configDir . 'router.php';
        return $router;
    });
```

## Router.php の編集
先ほど作成したRouter.phpを編集します。
PATH : /app/config/router.php

``` lang:router.php
<?php
    $router = new \Phalcon\Mvc\Router();

    /**
     *  /
     */
    $router->add(
        '/',
        array(
            'controller' => 'index',
            'action' => 'index'
        )
    );
```

これでRouterが動くはずです。

### 参考文献
[Phalcon Router](https://docs.phalconphp.com/ja/latest/reference/routing.html)
Ansibleの「unarchive」でハマった件

Vagrantで起動したCentOSに、Ansibleで最新のGitをインストールする際に(しょーもないことで)ハマったのでメモ。

自社の方々に助けていただき、窮地を脱しました。ありがたいことです。

### ■ハマったこと

Ansibleの「unarchive」は、**ローカルマシン**のファイルを解凍し、**ホストマシン**へコピーするものです。

自分はてっきり、ホストマシン上にあるファイルを解凍してくれるものだと思っていました…。

### ■ドキュメント、もとい英語の確認を怠るな

公式のドキュメントに、英語でバッチリ記載されていました…。
ドキュメントは見ていたのですが、オプションの部分しか見ていませんでした。
英語はきちんと読め、自分…。

[unarchive - Unpacks an archive after (optionally) copying it from the local machine.](http://docs.ansible.com/unarchive_module.html)

### ■解決方法

というわけで、「unarchive」は使用できなかったので、tarコマンドを実行して解凍するようにしました。
以下のようなYAMLで解凍ができます。

```yaml:playbook.yml
# ファイルを解凍する
- name: unarchive source
  command: tar zxvf /tmp/source.tar.gz chdir=/tmp
```
三項演算子メモ

#PHPで三項演算子を使う

```
条件式 ? 式1 : 式2
```

```
$lang = 'En';

$msg = $lang == 'Jp'  ? 'こんにちは' : 'Hello';
print $msg;
```

#参照
http://www.phpbook.jp/tutorial/if/index8.html
docker-composeでfluentd + elasticsearch + kibana4　環境をつくる


* いろいろ探しましたが、集約した情報がなかったのでまとめました。
* ~~docker-compose 1.3ではlog-driver設定にfluentdが対応していないようです。~~ → 1.8で対応したので追記しました。

# dockerおよびdocker-comoposeのインストール

* docker/docker-composeのインストールは公式ページを参考にインストール
* [docker](https://docs.docker.com/)
* [docker-compose](https://docs.docker.com/compose/install/)

# 設定ファイルなど

以下のファイルを作成する

```docker-compose.yml
fluentd:
  build: ./fluentd
  links:
   - "elasticsearch"
# Fluentd logging driver対応の場合
  ports:
   - "22422:22422"
# Fluentd logging driver非対応の場合
  volumes:
   - /var/lib/docker/containers:/var/lib/docker/containers
   - /var/run:/var/run
   - /var/log/docker:/var/log/docker

elasticsearch:
  build: elasticsearch
  expose:
    - 9200

kibana:
  image: kibana
  links:
   - "elasticsearch"
  ports:
   - "5601:5601"
```

## fluentd

### Fluentd logging driver対応の場合
pluginsディレクトリが必須なので前もって作成する

```
mkdir -p fluentd/plugins
```

fluent-plugin-elasticsearchをインストールする

```fluentd/Dockerfile
FROM fluent/fluentd

RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri"]
```

```fluentd/fluent.conf
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>
<match docker.**>
  type elasticsearch
  log_level debug
  host elasticsearch
  port 9200
  include_tag_key true
  logstash_format true
  flush_interval 5s
</match>
```

### Fluentd logging driver非対応の場合
* dockerのコンテナ名が無いと何かと辛いので[fluent-plugin-docker-tag-resolver](https://github.com/ainoya/* fluent-plugin-docker-tag-resolver)を使って出力しました。

```fluentd/Dockerfile
FROM kiyoto/fluentd:0.10.56-2.1.1
MAINTAINER kiyoto@treausure-data.com
RUN mkdir /etc/fluent
ADD fluent.conf /etc/fluent/
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "--yes", "make", "libcurl4-gnutls-dev"]
RUN ["/usr/local/bin/gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri"]
RUN ["/usr/local/bin/gem", "install", "fluent-plugin-record-reformer", "--no-rdoc", "--no-ri"]
RUN ["/usr/local/bin/gem", "install", "fluent-plugin-docker-tag-resolver", "--no-rdoc", "--no-ri"]
ENTRYPOINT ["/usr/local/bin/fluentd", "-c", "/etc/fluent/fluent.conf"]
```

```fluentd/fluent.conf
<source>
  type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-docker.pos
  time_format %Y-%m-%dT%H:%M:%S
  tag docker.log.*
  format json
</source>
<match docker.log.**>
  type docker_tag_resolver
</match>
<match docker.container.**>
  type record_reformer
  container_id ${tag_parts[4]}
  container_name ${tag_parts[3]}
  tag docker.all
</match>
<match docker.all>
  type elasticsearch
  log_level debug
  host elasticsearch
  port 9200
  include_tag_key true
  logstash_format true
  flush_interval 5s
</match>
```

## elasticsearch

デフォルトではコンテナ外から接続できないので``network.bind_host``を設定する

```elasticsearch/Dockerfile
FROM elasticsearch

RUN echo "network.bind_host: 0.0.0.0" >> /usr/share/elasticsearch/config/elasticsearch.yml
```

# 起動方法
docker-compose.ymlのあるディレクトリで以下のコマンドを実行

```run
docker-compose up -d
```

# 参考情報
[Docker 1.8 の Fluentd logging driver でコンテナログをフォワードする](http://qiita.com/kumatch/items/744076da68fa71b36a35)
Emacs の Tronesque Theme を Tera Term 上で使うときの設定

めちゃくちゃニッチです。

## Tronesque Theme とは？

* 映画「トロン・レガシー」をフィーチャーしたかっこいい Emacs テーマ
    * 劇中で登場人物が Emacs を使ってハッキングするシーンがある
* http://emacsthemes.caisah.info/tronesque-theme/

## 問題

* nw 環境で使用する場合、ターミナルエミュレータが定義する ANSI カラー16色を Tronesque 仕様にする必要がある
    * 当然 Emacs 以外の色も変わっちゃう
    * でもかっこいいのでそこは許した
* 作者の Github リポジトリには Mac の ターミナル.app 向けの設定ファイルしか存在しない

## 解決方法

* Teraterm.ini の該当箇所を下記のように設定する

```ini
ANSIColor=0,8,23,36, 1,245,181,95, 2,166,243,221, 3,29,84,131, 4,40,114,178, 5,175,192,253, 6,255,254,217, 7,239,255,254, 8,3,51,64, 9,255,105,77, 10,104,246,203, 11,255,254,78, 12,186,214,226, 13,150,165,217, 14,210,241,255, 15,211,249,238
```

## うまくいかないとき

* Emacs で256色出せていない？
    * .bashrc などに `export TERM=xterm-256color` を追記する
* Tera Term の設定→ウィンドウを確認
    * 16色モードにチェックが入っているか 
    * 256色モードにチェックが入っているか
【PHP】switch文の中でcontinue

結論から書くと他の言語と違いswitch文中のcontinueはswitch文を対象にする。

ループの中で、該当なしならスキップしたい場合にcontinueを使うと、switch文を抜けるだけでループをスキップしない。

```php:ループ内でスキップしない
foreach($member as $name){
  switch($name) {
    case 'suzuki':
      $score = '70';
    case 'sato':
      $score = '85';
    defalt:
      continue;
  }

  echo $score;
}
```

continueがswitch文を対象にするので、この場合continue 2とするのが正解。

```php:ループ内でスキップする
foreach($member as $name){
  switch($name) {
    case 'suzuki':
      $score = '70';
    case 'sato':
      $score = '85';
    defalt:
      continue 2;
  }

  echo $score;
}
```
AWS CLI 逆引きメモ


使ったことのあるコマンドのメモ。使ったものは順次追記していきます。
# はじめに


## 動機
### シェルでワンライナーしたい
`--output text` は"特定の( *InstanceId* などの)値を持つ何か"を取得したい場合に便利。
「特定の値」を持つ何かを手打ちしてもいいんです。が、そこで「なんかスマート感がないんだよなぁ...」などと思ったらシェル芸の素質アリ。ワンライナー始めましょう。ちなみに私はまだまだシェル芸新卒1年生ぐらいのもんです。

## filtersの表記
*--filters* オプションで指定する`Name=XXX,Values=XXX`ですが、Nameの表記が落とし穴です。
例えばEC2の`describe-instances`などで出てくる *InstanceId* 、これを *--filters*で検索しようとするときは

```bash
# [属性名] <---> [filters書式]
# InstanceId <---> instance-id
aws ec2 describe-instances --filters "Name=instance-id,Values=XXXXXXXX"
```

のように、 **単語の頭を小文字** にした上で **単語間をハイフンで区切る** 表記にする必要があります。

# 単発コマンド

## EC2をタグ検索してInstance IDを取得
めちゃくちゃ便利なんだけど毎回どこかでタイポしてしまう。

```bash
aws ec2 describe-instances --filters "Name=tag:MyTagKey,Values=MyTagValue" --query "Reservations[].Instances[].InstanceId" --output text

```

ちなみに *jq* コマンドを使うと以下のような感じになる。

```bash
# タグ検索したEC2のInstanceId取得 jq版
# -rオプションは 別名"--raw-output"
# このオプションをつけない場合、二重引用符付きで文字列(InstanceId)が返される
aws ec2 describe-instances --filters "Name=tag:Project,Values=tech-cource" | jq -r .Reservations[].Instances[].InstanceId
```

## StopしていないEC2インスタンスを列挙
※正確にはStop, Terminated 以外のステータスになっているインスタンスの列挙です。

```bash
aws ec2 describe-instances --filters "Name=instance-state-name,Values=pending,running,shutting-down,stopping"
```

## StopしていないEC2インスタンスを列挙（全リージョン）
上記の（簡易）全リージョン版。出力結果はそのままだとちゃんとしたJSONにならないので注意。いい感じにまとめたい。

```bash
for rg in ap-northeast-1 ap-southeast-1 ap-southeast-2 eu-central-1 eu-west-1 sa-east-1 us-east-1 us-west-1 us-west-2 ;do aws ec2 describe-instances --region $rg --filters "Name=instance-state-name,Values=pending,running,shutting-down,stopping" ; done```

## Default VPCのIDを取得

```bash
aws ec2 describe-vpcs --filters "Name=is-default,Values=true" --query "Vpcs[].VpcId" --output text
```

## AutoScaling Group の名前を一覧

```bash
aws autoscaling describe-auto-scaling-groups --query AutoScalingGroups[].AutoScalingGroupName --output text
```



# 複合系
バッククオートも使ってちょっと複雑な処理をワンライナーしてみます。

## Default VPCに関連付けられたSGを取得

```bash
aws ec2 describe-security-groups --filters "Name=vpc-id,Values=`aws ec2 describe-vpcs --filters \"Name=is-default,Values=true\" --query \"Vpcs[].VpcId\" --output text`"
```

## Default VPCに関連付けられたSGのGroupIdを取得

```bash
aws ec2 describe-security-groups --filters "Name=vpc-id,Values=`aws ec2 describe-vpcs --filters \"Name=is-default,Values=true\" --query \"Vpcs[].VpcId\" --output text`" --query "SecurityGroups[].GroupId" --output text
```

## ELB配下インスタンスのIPを取得

```bash
aws ec2 describe-instances --instance-ids `aws elb describe-load-balancers --load-balancer-names some-elb-name --query LoadBalancerDescriptions[].Instances --output text` --query Reservations[].Instances[].PrivateIpAddress --output text
```
Macのターミナル（bash）でGitを使いやすくしてみた。（補完、branch表示）

## やったこと

最初は `oh-my-zsh` を使用したやり方を検討したが `bash` を使い続ける方向でやり方を探した。
（複数の環境でターミナルを操作するのでいちいち環境を揃えるのが面倒なため）


* gitで補完ができるようにした。（特にbranch名とか）
* 現在のbranch名を表示するようにした。

## 補完機能

まずは必要ファイルがあるかどうか確認。

```bash
$ ls /usr/local/etc/bash_completion.d/
git-completion.bash git-prompt.sh
```

最新のMacのデフォルトのgitでは入ってない可能性があるので、ない場合はbrewコマンドなどでgitをインストールしなおす。

```bash
$ brew install git
```

`.bash_profile`, `.bashrc` のどちらかに以下の記述を追加する。

```bash:.bash_profile
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
```

## 現在のbranch名の表示

`.bash_profile`, `.bashrc` のどちらかに以下の記述を追加する。

```bash:.bash_profile
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\h\[\033[00m\]:\W\[\033[31m\]$(__git_ps1 [%s])\[\033[00m\]\$ '
```

## 設定の反映

終わったら設定を反映させる。

```bash
$ source ~/.bash_profile
```