OmniAICreator/Qiita-1.07M huggingface dataset:
Javaのロギングライブラリの歴史と現状をふんわり把握する（初学者向け）

かつて、**Log4j**というロギングライブラリがありました。
最強でした。1999年のお話です。

![jvm-logging_01.png](https://qiita-image-store.s3.amazonaws.com/0/51567/d0c29e73-b6f1-d76b-21fb-b613161c819f.png)

ロギングの大切さと**Log4j**の素晴らしさが見直され、Java標準に**java.util.logging**というAPIが追加されました。2002年のお話です。
**java.util.logging**は**Log4j**を参考に作られましたが、ところどころ使いづらかったため、「標準」という武器をもってしても、**Log4j**に置き換わることはできませんでした。そのため、Javaの世界には2つのロギングライブラリが残ってしまいました。

![jvm-logging_02.png](https://qiita-image-store.s3.amazonaws.com/0/51567/65786e38-e2bf-6463-c302-df817a7dab61.png)

Maven1.0が2004年にリリースされ、人々はOSSライブラリを組み合わせてアプリケーションを作るようになりました。

![jvm-logging_03.png](https://qiita-image-store.s3.amazonaws.com/0/51567/ce7d8019-494c-90ca-16a3-f6d8a6afdcb0.png)

ところが、ロギングライブラリが2つあったため、**Log4j**を使っているライブラリと、**java.util.logging**を使っているライブラリが混在してしまい、アプリケーションの運用に困ってしまいました。

![jvm-logging_04.png](https://qiita-image-store.s3.amazonaws.com/0/51567/c45baf1a-27f9-2d44-6d71-bc1f357a6ed8.png)

そこで、ログファサードライブラリとして**Commons Logging**が登場しました。
ログファサードライブラリは、ログ出力APIだけを提供し、API経由で出力要請されたログを、適切にロギングライブラリを選んで委譲してくれるライブラリです。

![jvm-logging_05.png](https://qiita-image-store.s3.amazonaws.com/0/51567/c5209302-34c5-67f9-690c-2511236498e0.png)

ところが、**Commons Logging**はいろいろと技術的に小難しい事情により、上手く使えませんでした。

そこで代わりに現れたログファサードライブラリが**Slf4j**です。
**Slf4j**は、**Log4j**、**java.util.logging**、**Commons Logging**を利用しているライブラリを組み込んでアプリケーションを構築する際にも、これらのライブラリに送られるログを乗っ取る「アダプタ」という仕組みを提供していました。

![jvm-logging_07.png](https://qiita-image-store.s3.amazonaws.com/0/51567/b9b1a1bc-930e-d4a9-4919-e05cc4653791.png)

人々は**Slf4j**とアダプタを上手に使うことで、どんなライブラリを組み合わせても、ログ出力を自由に制御することができるようになりました。
めでたしめでたし。

![jvm-logging_08.png](https://qiita-image-store.s3.amazonaws.com/0/51567/5d6a9266-a1bc-c556-b8a4-cef524dd21e0.png)

------

簡単に、気軽に読めるように、Javaのロギングの歴史をまとめてみました。

Java(JVM系)のロギング系ライブラリは、初学者には少々複雑です。
これは歴史的経緯によるところが大きいので、大雑把に歴史を知るのが、理解のための一番の近道だと思い書いてみました。

わかりやすさを重視するため、一部誇張や省略などもありますので、ご注意ください。

参考: http://www.slideshare.net/miyakawataku/concepts-and-tools-of-logging-in-java
IBM Bluemix で無料の IBM API Connect インスタンスを作る

# はじめに
IBM Bluemix 上で IBM API Connect のインスタンスを作成する手順です。IBM API Connect の概要は [IBM API Connect 使ってみた〜APIを作る〜](http://qiita.com/capsmalt/items/c21ed4b75fa468952671) などにまとまっています。
また前提として IBM Bluemix のIDが必要になりますので、[IBM Bluemixフリートライアルアカウント作成手順](http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63) あたりを参考にアカウント登録しておきましょう。登録後30日間はIBM Bluemixとしての無料トライアル期間ですが、IBM API Connect はトライアル終了後も月間 50,000 APIコールまでは無料で利用できるEssentialsプランが提供されていますので、今回はこちらを利用します。

# 免責
本記事は2016.06.10時点の公開情報をベースに執筆しておりますが、誤解・誤植を含んでいる可能性があります。ご利用の際は自己責任で、必ず最新の情報を自ら確認されますようお願いします。特に予期せぬ課金請求などが発生しても著者は一切責任を持ちません。
また誤りを見つけられた方は是非ご一報ください。

# API Connect インスタンスを作る
Bluemixへログインし、コンソールの右上の![image](https://qiita-image-store.s3.amazonaws.com/0/129138/d927374b-1abb-d29c-aca0-9eaee2889fba.png)をクリックしてサービス作成を開始します。
![image](https://qiita-image-store.s3.amazonaws.com/0/129138/ce5273d0-6e01-1aef-12fe-51ff0a9112b4.png)

キーワード`api connect`でフィルターするとAPI Connectが表示されるので、これを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/129138/c09b42ad-a829-af80-faef-c12d562a913d.png)

API Connectに関する利用条件や機能説明が表示されるので、下の方へスクロールして利用するプランを選びます。ちなみにBluemix アカウント作成後30日間のトライアル期間中は、どのプランを選択しても料金は発生しません。各エディションの概要は以下の通りです。Essentials以外の有償プランを利用する場合、利用量をコミットできるのであればバルクのプランがお得ですね。

| プラン | 概要 | 料金体系 |
|:-----------|------------|------------|
|Essentials| API管理のための基本機能を提供 |月間50,000APIコールまで無料|
|Professional| 部門単位の小規模プロジェクト向け。従量課金モデル |月間100,000APIコール毎に料金発生|
|Enterprise| 大規模プロジェクトや組織間での共有環境向け。従量課金モデル |月間100,000APIコール毎に料金発生|
|Professional 5M| 部門単位の小規模プロジェクト向け。月間5Mのコミット付きサブスクリプション・モデル |5,000,000コール分の利用権を含む。以降100,000APIコール毎に料金発生|
|Enterprise 25M|大規模プロジェクトや組織間での共有環境向け。月間25Mのコミット付きサブスクリプション・モデル|25,000,000コール分の利用権を含む。以降100,000APIコール毎に料金発生|

利用プランを選んだら`作成`をクリックするとインスタンスが作成されます。ここではEssentialsを選択します。
※ なお本稿執筆時点ではBluemixのスペースあたり1インスタンスしか作成できず、また一度選んだプランを変更する場合はインスタンスを削除して作り直す必要があるようですので、注意が必要です。
![image](https://qiita-image-store.s3.amazonaws.com/0/129138/17c4a43d-ffdc-3428-d3ef-ffa43968a1e4.png)

API Connect のインスタンスが正常に作成されると、以下のような画面が表示されます。まずは API Manager を起動してみましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/129138/b63883c0-6ead-0ed5-a54a-a5cac638a806.png)

無事に API Manager が起動し、API管理を開始できそうです。無料で！
![image](https://qiita-image-store.s3.amazonaws.com/0/129138/150394e5-c1af-bae4-0ccb-f398834e99d8.png)
私が「Getter/Sestterの"乱用"はアンチパターン」という理由と前提


書いてたら、見覚えないけど、私の中では定着しつつある実装パターンを書き殴る感じの記事になってたので、整理する。

# 概要
1. 『[マジックメソッド（特に__construct()）は、Traitに「メソッドの引き上げ」をしてはいけない](http://qiita.com/ndxbn/items/0e3160b20f64cff0323b)』のツッコミを依頼したら、[無事にツッコミを頂戴](http://d.hatena.ne.jp/gallu/20160608/p2)できました。
1. この記事中で、私の師匠氏に「Getter/Sestterの乱用はアンチパターン」については、実はおいちゃんは些か懐疑的。」と言われたので。多分、**「乱用」のボーダの認識を共有できていない**ので、私の認識を書いとこうと思いました。

この記事での結論は、以下の通りです。

* 不要なGetterを作らない。
    * もし、Unitテストでのみ使用するようなものなら、[PHPUnitならprivate/protectedなパラメータでもAssertできる](https://phpunit.de/manual/current/ja/appendixes.assertions.html#appendixes.assertions.assertEquals)ので、不要。
    * PHPUnitのAssertionで機能不足なら、[リフレクション](http://php.net/manual/ja/book.reflection.php)を使えばなんとかなる。
* 不要なSetterを作らない。
    * インスタンスのアイデンティティを示すような、primary なプロパティにSetterを作るな。

# 乱用に当たる例

## インスタンスの primary なプロパティがSetterで変更される
[この記事でも言っているように](http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html#existing-arguments)"Violated Encapsulation Principle（カプセル化原則に違反）"してると思います。SOLIDで言えば、[OCP（Open-Closed Principle）](https://ja.wikipedia.org/wiki/%E9%96%8B%E6%94%BE/%E9%96%89%E9%8E%96%E5%8E%9F%E5%89%87)違反でしょうか。

```php
class User
{
    private $id; // 主キー的なやつ
    private $name;
    private $age;
    public function setId(int $id)): User
    {
        $this->id = $id;
        return $this;
    }
    public function setName(string $name)): User
    {
        $this->name = $name;
        return $this;
    }
    public function setAge(int $age): User
    {
        $this->age = $age;
        return $this;
    }
}

$userA = new User();
$userB = new User();
$userA->setId(1)->setName('a')->setAge(14);
$userB->setId(2)->setName('b')->setAge(196);

$userA->setId(2); // ユーザBを示すようになった！！
    // 普通に提供されているメソッドを使っただけなのに、
    // なんでデータに矛盾が生じてるんだよ！！ふざけんな！！！
```

以下の操作と同じだから、ダメです。

```sql
CREATE TABLE user(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARBYNARY(127),
    age INT
);

INSERT INTO user(name, age) VALUES('a', 14);
INSERT INTO user(name, age) VALUES('b', 196);
UPDATE uesr SET id = 2 WHERE id = 1; // ここで本来エラーになる
```

常識的に考えて、**Priamry Key が重複しようものなら Duplicated Errorが発生するべきです**けど。それはUserクラス自身ではなく、UserManagerの責任です。

上記の場合だと「主キーをUPDATEする」事自体がよくなさそうに感じますが、そこは別に問題ありません。問題点は、**本来エラーになる操作が、普通に使えるAPIのように実装されていること**です。ふつーに使ったらバグるってヤバい。  
管理者は主キーを更新することがあるかもしれませんが。管理者はUserクラスではなく、UserManagerという、Userとは全く別のインターフェースを持つクラスなので、無関係です。UserManagerを実装した上で、更にUserクラスの実装もComposite（or 継承）するかは、また別の話。  

# 場合によっては乱用じゃない

## 設定とかフラグ建設
フィルタリングとかをするときのフラグメントは、普通に```setFlags```でいいと思います。[SplFileObject::setFlags](http://jp2.php.net/manual/ja/splfileobject.setflags.php)とか、普通に使いやすいですし。ただし、当然、ビットマスクにはそのクラスのオブジェクト定数を使うのが必須になります。  
振る舞いに直に影響しますが、「デフォルトの引数の再設定」をしているようなものだし、抽象クラスとかならセーフかなぁと思います。
explorerの右クリックメニューからemacsでファイルを開く

WindowsのExplorerの右クリックメニューからファイルやフォルダemacsでを開きたい。
Explorerの`shell:sendto`フォルダにemacsのショートカットを作れば、右クリックの”送る”メニューにemacsが追加されるが、メニューをたどるのが面倒。

レジストリに右クリックメニューの設定を追加。

```registry:open_with_emacs.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\open_emacs]
@="emacs(&E)"
"Icon"="C:\\emacs\\bin\\emacsclientw.exe"

[HKEY_CLASSES_ROOT\*\shell\open_emacs\command]
@="C:\\emacs\\bin\\emacsclientw.exe -n -a C:\\emacs\\bin\\runemacs.exe \"%1\""

; [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\open_emacs]
; @="emacs(&E)"
; "Icon"="C:\\emacs\\bin\\emacsclientw.exe"

; [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\open_emacs\command]
; @="C:\\emacs\\bin\\emacsclientw.exe -n -a C:\\emacs\\bin\\runemacs.exe \"%1\""

[HKEY_CLASSES_ROOT\Folder\shell\open_emacs]
@="emacs(&E)"
"Icon"="C:\\emacs\\bin\\emacsclientw.exe"

[HKEY_CLASSES_ROOT\Folder\shell\open_emacs\command]
@="C:\\emacs\\bin\\emacsclientw.exe -n -a C:\\emacs\\bin\\runemacs.exe \"%1\""

[HKEY_CLASSES_ROOT\Directory\Background\shell\open_emacs]
@="emacs(&E)"
"Icon"="C:\\emacs\\bin\\emacsclientw.exe"

[HKEY_CLASSES_ROOT\Directory\Background\shell\open_emacs\command]
@="C:\\emacs\\bin\\emacsclientw.exe -n -a C:\\emacs\\bin\\runemacs.exe \"%V/\""

```

設定を例えばopen_with_emacs.regファイルに保存し、emacsのパスを適切に編集して、そのファイルをダブルクリックすればレジストリに追加される。

emacs上でサーバーを動かしておく。

```el:init.el
(server-start)
```

![menu.png](https://qiita-image-store.s3.amazonaws.com/0/40128/62f41243-2ffd-e6d2-6c4c-afdcd17d4271.png)

参考
[エクスプローラーの右クリックメニューをカスタマイズする](http://ascii.jp/elem/000/000/953/953807/)
[サーバーとしてのEmacsの使用](https://ayatakesi.github.io/emacs/24.5/Emacs-Server.html)
Flashとここが違うよSpineは（アニメ制御編#1）

思い立った時に書きだめるFlashとの違いという視点でSpineを説明する不定期シリーズです。
なお、前回の投稿はこれ [Flashとここが違うよSpineは (深度編)](http://qiita.com/harayoki/items/1aba43b250a3198c23b8)です。

<img width="600" alt="sc" src="https://qiita-image-store.s3.amazonaws.com/0/8302/90264d91-ff5b-1ba8-19fa-3cdeafa513d6.png">
今回の動作サンプル。http://harayoki.github.io/qiita_demo/gogh1/
解説は投稿の最後に。

#アニメーションを２つ同時に再生したい
あいさつするアニメーションとにっこり笑うアニメーションを同時に再生したい、ジャンプしつつ攻撃するアニメーションを再生したい。このような時、FlashとSpineではどうするでしょうか。それぞれ見てみます。

##入れ子アニメーションまたはパターンを用意するFlash
Flashのアニメーション再生指定はMovieClipにひも付き、ラベル指定で行います。２つのラベルは同時に再生できないので、

```sample.as
girlMc.gotoAndPlay("greeting");
girlMc.face.gotoAndPlay("smile");

manMc.gotoAndPlay("jump");
manMc.body.gotoAndPlay("attack");

```

のように、MovieClipを入れ子にしてそれぞれに対してアニメーション指定をしてやります。あいさつ＋笑う、のように対象パーツがはっきりしていれば合点がいきますが、ジャンプ攻撃のような場合は入れ子の順序を逆にして

```sample.as
manMc.gotoAndPlay("attack");
manMc.body.gotoAndPlay("jump");
```

のような形でも良さそうですし、入れ子が面倒ならグラフィックシンボルを駆使して両者をまとめたラベルを作ってしまうのもよく取られる手です。

```sample.as
manMc.gotoAndPlay("jump_attack");
```

ただ、ここにさらに後ろを振り返るだとか、ダメージモーションなどが入ってくると、どの方法であれ、仕組みが破綻して管理が難しくなってきます。結果Scriptでの補佐が入ったり、カラーの適用やフィルタの適用など、アニメーションを阻害しない方法での状態表現に向かったりしますね。

手腕の見せ所でもあるので、もっとクールに問題を解決している人もいると思いますが、一般的にはこのようなところかと思います。複雑なアニメーションでの限界は垣間見えます。まあ、そもそもキャラクターアニメーションツールではなく、いわゆるムービーを作ためのツールから始まったものですしね。

##アニメーションの複数同時再生ができるSpine
対してSpineのアニメーションは階層構造にある各BoneやSlotに紐付いてはおらず、キャラクター全体に紐付いています。とすると全体で１つのアニメーション指定しかできないかというとそうではなく、再生命令時に引数のtrack番号指定をずらすことで、複数のアニメーションを同時に再生することができます。setAnimationByNameメソッドの第一引数の番号がそれです。(Starling Spine runtimeの場合)

```sample.as
manSkeletonAnim.state.setAnimationByName(0, "attack");
manSkeletonAnim.state.setAnimationByName(1, "jump");
```

これでジャンプするアニメーションと攻撃するアニメーションが同時に再生されます。両者で制御しているパーツ(Bone/Attachment/Slot/mesh)がかぶっている場合もうまい具合に折り合いを取ってくれます。便利ですね！

なお、track番号を同じにすることで、普通にアニメーションの切り替えが行われます。この際に切り替わり具合を調整できたりもしますが、また気が向いたときに別の投稿にまとめます。

#デモの解説

強面のGさん(仮名)がゆらゆらと歩いているループアニメーション(yurayura)に、うなずくアニメ(unun)と、不機嫌な顔になるアニメ(musu)を違うtrack番号指定で合成再生します。それぞれ制御しているメッシュ部分がかぶっていますが、うまく合成される事が確認できます。
また気持ち悪いループアニメ(gungun)をyurayuraと同じトラック番号で再生できるので、アニメーションを切り替える場合の挙動も確認する事ができます。

<img width="600" alt="sc" src="https://qiita-image-store.s3.amazonaws.com/0/8302/15ecae83-5bba-171e-3c75-eadbbd496db0.png">
_gungun_

なお、デモに使っているテクスチャアトラス画像は以下になります。メッシュアニメーションの偉大さがわかる素材構成。モンティパイソン万歳。
<img src="http://harayoki.github.io/qiita_demo/gogh1/assets/gogh.png" width="400" />

ソースコードのメイン処理は[このへん]
(https://github.com/harayoki/SpineTest1/blob/gogh1/src/demos/GoghDemo1.as)に。
 
#おわりに
この系統の投稿ではFlashの不便なところを指摘することがありますが、個人的には今もFlash大好きですし、上記のSpineのデモもActionScript制御です。Flash愛がこもった上で別のツールとの比較をしている事に留意していただければと。
Watson Speech to Textをターミナルから実行してみた

この投稿は[Watson Speech to Text](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/speech-to-text.html)をcurlを使って実行した記録です。

## 実行方法

Speech to TextをBluemix上に作成していない場合は以下から作成し、Service Credentialsにあるusernameとpasswordをメモします。(現在の料金体系では毎月1000分までの処理が無料)
https://console.ng.bluemix.net/catalog/speech-to-text

[ドキュメント](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/speech-to-text/api/v1/#recognize_audio_sessionless12)に従い、以下の様にcurlでPOSTすると文字起こしされた結果が返ってきます。

```bash
curl -X POST -u service-username:service-password --header "Content-Type: audio/wav" --header "Transfer-Encoding: chunked" --data-binary @out000.wav "https://stream.watsonplatform.net/speech-to-text/api/v1/recognize?continuous=true&model=ja-JP_BroadbandModel"
```

## ハマったところ

### m4a拡張子のファイルに対応していない

iPhoneのボイスメモで記録したm4a形式の音声をテストに使う場合は、wavなどの形式に変更します。

```
brew install faad2
faad sample.m4a -o sample.wav
```

### curlのPOSTがタイムアウトする

音声ファイルのサイズが大きすぎるとPOSTが終わらず処理がエラーになったので、ファイルを小さいサイズに分割しました。実行時間も短くなるので試しやすくなります。

以下は60秒の音声ファイルに分割する場合の例です。

```
brew install ffmpeg
ffmpeg -i sample.wav -f segment -segment_time 60 -c copy out%03d.wav
```

### 英語で文字起こしされる

デフォルトは判定のモデルに`en-US_BroadbandModel`が使用されます。
現在、日本語に対しては以下の2つのモデルが用意されています。

- ja-JP_BroadbandModel
- ja-JP_NarrowbandModel
django.db.utils.ProgrammingError: column "hogehoge" cannot be cast automatically to type integer HINT:  You might need to specify "USING hogehoge::integer".

##背景
Androidアプリ開発で、django(python)を利用したbackend側のプログラムを、デバッグするためにpostgresSQLを使用した時に、長時間はまったのでメモ書きします。

##migrateしようと下記コマンドを実行後エラー発生
・コマンド
`python manage.py migrate` or `python manage.py syncdb`
・エラー
`django.db.utils.ProgrammingError: column "hogehoge" cannot be cast automatically to type integer HINT:  You might need to specify "USING register::integer".`

##原因調査方法
エラーからテーブルのカラム(hogehoge)の型をintegerにしろとのことなので、現状のDBのテーブル内からhogehogeのカラムの型を調査後、integerに型変換して、型が変更されていることを確認して再度migrateしてみます。

1. postgresSQLのコマンドを受け付ける状態にするため、下記コマンドを実行  
    `psql [dbname]`  
    ※その前にdbnameがわからない場合は、settings.pyから事前に確認して下さい。  
    また、下記コマンドでDBのリストを取得出来ます。  
    `psql -l`
2. 下記コマンドでDB内にあるテーブルの一覧を取得  
    `\d`
3. 表示されたテーブルのリストから(hogehoge)カラムが存在していそうなテーブルを先ほどのコマンドのオプションにしてカラムの一覧を取得  
    `\d [tablename]`
4. hogehogeの型がintegerではなく別の型になっているか確認(私の場合char型になってました)  
5. 下記のコマンドで、char型をintegerに変更する  
    `ALTER TABLE [tablename] ALTER COLUMN [hogehoge] TYPE integer USING [hogehoge]::int`
6. コマンド実行後、下記のように表示される(なぜ下記のような応答なのかは調べていません)  
    `ALTER TABLE`
7. カラム(hogehoge)がintegerに変更されているか確認  
    `/d [tablename]`  
9. 型の変更を確認後、下記コマンドでmigrateする  
    `python manage.py migrate`

#参考サイト
http://pamo.dip.jp/blog/archives/000770.html
http://dqn.sakusakutto.jp/2012/02/cannot_be_cast_to_type_integer.html


以上、疑問点があれば随時コメントお願いします。
PowerShellスクリプトをWindowsバッチ経由で起動する

Windows PowerShellはデフォルト状態ではそのままps1のファイルを叩いても権限的に怒られて動作しない。常に実行するような環境であれば Set-ExecutionPolicy RemoteSigned などを実行する必要がある。

が、ちょろっと実行させたい場合にイチイチそれをやる(またはやらせる)のかと言われると説明が面倒になるし、永続的にその設定でよいのかという議論が出たりする場合もある。というかそもそも安易に管理者権限で～はどうなの。という話もある。
[PowerShellのExecutionPolicyのスコープとかについて詳しく](http://qiita.com/kikuchi/items/59f219eae2a172880ba6)


そこで sample.ps1 というごじゃごじゃするPowerShellを実行する場合、同じディレクトリに同じ名前のバッチファイル

```sample.bat
@powershell -ExecutionPolicy RemoteSigned -File %~n0.ps1 %*
```

を配布することで「batの方を叩いて」程度の指示で話が済むようになる(はず)。
【Postgres】目的別ユーザー関連SQLの備忘録

Postgresでユーザー関連操作をする時に使うSQLの備忘録です。
バージョンは9.3.13で確認しています。

# ユーザー一覧を表示する

```
\du
```

# パスワードを付けてユーザーを作りたい

```
create user [ユーザー名] with password ‘[パスワード]';
```
`\password [ユーザー名]`でもパスワード変更できる

# DBの作成権限を付けてユーザーを作りたい
```
create user [ユーザー名] with createdb;
```

# ロールの作成権限を付けてユーザーを作りたい
```
create user [ユーザー名] with createrole;
```

# SuperUser権限のユーザーを作りたい
```
create user [ユーザー名] with superuser;
```

# ログイン可能なユーザーを作りたい
```
create user [ユーザー名] with login password `[パスワード]`;
```
`psql -U [ユーザー名]`でログインできるようになります。

# 複数の権限を付けてユーザーを作成したい
withの後に列挙します

```
create user [ユーザー名] with createdb　createrole password ‘[パスワード]';
```

# ユーザーの権限を変更する
```
alter user [ユーザー名] with createdb;
```

# ユーザーを消す
```
drop user [ユーザー名];
```
ファイルがどの位置までログが転送されたか確認する方法（fluentd/FlyData）

例えば、**複数台のサーバのアクセスログの分析**を行いたい！
そういったとき、便利なのが**エージェント型のログ取集ツール**です。
代表的なサービスには、[fluentd](http://www.fluentd.org/)、[FlyData](http://www.flydata.com/ja/)があります。

これらのサービスは、**サーバにエージェントを常駐させ、監視対象ファイルに差分が発生したら、その差分をログとしてHadoopやAWSのRedshiftなどのストレージに書き込み**をします。


分析をしている中で、**なんだか値が変？ログがロストした気がする・・・！？**
そんなとき、どこまで書き込みが行われたか確認する方法です。


# 確認する方法
エージェント型ログ収集ツールは、**定期的に監視対象のファイルをどこまで読み込んだか記録**します。
そのファイルを、**posファイル**と呼びます。
このposファイルの中身をチェックすれば、どこまでストレージに書き込みが行われたか確認することができます。


## posファイルからわかること

監視対象ファイルと、そのファイルの読み込んだバイト位置までわかります。
それでは、早速posファイルの中身を覗いてみましょう。

### posファイルの中身を確認する
```sh:apacheのアクセスログのposファイルを開く
$ cat /var/log/httpd/access_log.pos
```

```sh:posファイルの中身
/var/log/httpd/access.log   0000000000014e3d        060d4a45
```

このファイルは、右から

* 監視対象のファイル名
* 監視対象ファイルの読み込んだバイト位置
* 監視対象ファイルのinode

という構成になっています。

ここで重要となるのが、**監視対象ファイルのinode**と**読み込んだバイト位置**です。


読み込んだバイト位置を説明する前に、inodeについて簡単に説明します。

inodeとは、各ファイルやディレクトリに割り当てられる**管理用の番号のこと**です。
posファイルにinodeが書き込まれている理由は、ログローテートが発生した時のためです。
ログローテートが発生すると同じファイル名が作成され、古いファイルは別名で保存されます。つまり、**監視対象のファイルのinodeはログローテートによって、新しいものに変わります。**

では、実際にinodeを確認してみましょう。

```sh:ファイルのinodeを確認する
$ ls -i /var/log/httpd/access_log
```

```sh:実行結果
101534277 /var/log/httpd/access_log
```

`ls`コマンドに`-i`オプションをつけると、各ファイルやディレクトリに割り当てられたinodeを確認することができます。

**あれ、posファイルに書き込まれた数値が違うと思ったあなた・・・！**
posファイルは16進数で書き込まれているため、16進数から10進数に変換する必要があります。

```sh:16進数から10進数に変換
# 英字は大文字にする必要があります
$ echo "obase=10;ibase=16;060D4A45" | bc
```

```sh:実行結果
101534277
```

というわけで、先ほど確認したinodeと一致します。

同様に、監視対象ファイルの読み込んだバイト位置も10進数に変換すると・・・

```sh:16進数から10進数に変換
# 英字は大文字にする必要があります
$ echo "obase=10;ibase=16;0000000000014E3D" | bc
```

```sh:実行結果
85565
```

これらのことから、

* inode番号`101534277のファイル`の`85565バイト`

まで読み込まれたことがわかります。

### 実際にログファイルを確認してみる
それでは、inode番号`101534277のファイル`の`85565バイト`を表示させてみます。

```sh:
$ head -c 85565 /var/log/httpd/access_log
```

`head`コマンドに`-c`オプションを付け、バイト数を指定すると、そのバイト数まで表示することができます。
重たいファイルを実行するときには、気をつけてください。

ここまでは確実にデータが転送されたということになります。
それ以降に書き込まれたファイルが確実に転送されたかを確認するには、ログの保存先であるHadoopやredshiftでクエリを打ちます。

### ログの保存先でクエリを実行する
クエリを打つ前に、`85565`バイト以降の`/var/log/httpd/access_log`に書き込まれたデータから**IPアドレス**や**日付**、**アクセス先**といった特定できそうな情報をメモしておきます。
特に、日付は秒数まで記録されているので重要な手がかりとなります。

特定できそうな情報をもとに、SQLを作成してクエリを実行します。

```sh:クエリ例
SELECT *
FROM apache_access
WHERE date = '2016-06-1015:00:00+09:00'
```

ここでデータが返ってこれば、ログが保存されたことが保証されます。
もし、返って来なければ、転送する最中にロストした可能性が高いです。


# まとめ
代表的なサービスとして紹介したエージェント型のログ取集ツールは、定期的に監視対象のファイルをどこまで読み込んだか記録しています。
**このファイルに書き込まれたinodeとバイト位置を確認することで、どこまでデータが転送されたか分かります。**

それ以降の差分データを手掛かりに、実際にデータが転送されていることを確認しましょう。
Kube-SoloでKubernetesをmacで動かす

Kube-Solo for Max OS XはKubernetesをMacOSで動かすための、ステータスバーアプリで、内部的にはCoreOSを VM machineで動かして動作します。

https://github.com/TheNewNormal/kube-solo-osx

似たようなツールは他にもいくつかありますが、試した中ではこれが一番簡単でした。

https://github.com/TheNewNormal/kube-solo-osx/releases

このページからdmgファイルを落としてきて実行するだけでインストールはあっという間に終わります。

ステータスバーアプリなので、動作は全てステータスバー上に表示されているコマンドを実行して行います(ただし実際にはUpで起動して、Preset OS Shellでターミナル開いたら、後はほとんどの処理をターミナルで実行することになるのであまり使いません)。

Kubernetes DashBoard等も標準で付いてくるし、ローカルに別で入れている他のDockerとの共存も問題なさそう。 

とにかく手軽にKubernetesいじれる環境を作りたいという人にはかなりおすすめのアプリです。
RDSをMagneticからSSDにするときのmy.cnfパラメータ調整など

監視用のRDSをMagneticからSSD（gp2の600GB）にしていい（アイテム登録とかが超遅いのはI/Oがキテるせいではないのかという話になった）ということでそれ用パラメータグループの修正箇所の備忘録です。5.6です。はやまって5.7にしたりはしない予定です。

変えたところ：

|パラメータ|デフォルト値|変更後値|理由|
|:------|:---------:|:---:|:--|
|innodb_io_capacity|200|500|本来ディスクのIOPS性能くらいがいいらしいが5.6だと効率悪いらしくそこから1/3から1/4程度をOracleACEのyoku0825先生にオススメされたのとどこかでみたベンチの結果を思い出して。|
|innodb_open_files|2000|3000|mysqltunerでのアドバイス結果とshow global statusでTable_open_cache_overflowsが増えてるため|
|innodb_read_io_threads|4|6|読み込むI/Oスレッドが気持ちふえてたほうが早そう|
|innodb_sync_array_size|1|4|待機中スレッドについての同時実行性を高めるために、内部データ構造をいくつに分割するかを指定します。（mutex/rw_lockのイベント待ち処理の並列性に影響。）だそうです|
|innodb_write_io_threads|4|6|書き込むI/Oスレッドがきもち増えたほうがパフォーマンスがあがるので|
|query_cache_size|1048576|0|query_cache_typeがOFFなのとperconaのサイトの推奨値なので|
|table_open_cache|2000|3000|mysqltunerでのアドバイス結果とshow global statusでTable_open_cache_overflowsが増えてるため|
|max_heap_table_size|16777216|268435456|show global statusでCreated_tmp_disk_tablesが増えてるため|
|tmp_table_size|16777216|268435456|show global statusでCreated_tmp_disk_tablesが増えてるため|
|slow_query_log|0|1|スロークエリログ有効化|

もしいっこだけしか調整しちゃいけなかったら迷わず`innodb_io_capacity`ですがそんな制限もないので`mysqltuner`とか`show global status;`とかみました。
こちらはgp2で600GBでその3倍のIOPSがベースなので1800だけど、その1/4とか1/3とからへんの値を適宜。
他も色々調整しておきました。さすがにいまよりは早くなるんじゃないですかね。

他に気になったのは`innodb_buffer_pool_instances`とかですが、バッファプールに割り当てられたやつを1GB以上で割った商とかにするといいらしいけど、
5.6だとデフォルト8なので今度割りあたるのは12GBであってまあほっとけばいいのかなという結論です。
（既知情報そうですが一応。`innodb_buffer_pool_size`は搭載メモリの75%とかに勝手になるので放置推奨というのがRDSが未調整で使える理由のひとつかなと。）

あと、`innodb_io_capacity_max`ですが、デフォルト2000で最大バーストが3000だけど`io_capacity`と同様に5.6だと効率悪いらしくあんまり増やさないほうがいいようです。
`innodb_io_capacity`がディスクのI/O性能カタログ値の1/3～1/4とかで`innodb_io_capacity_max`もあわせてギリギリにしないほうがいいらしいけど、減らすのもアレなのでデフォルト値のままにしておきました。
（むかしioDrive的な高速ディスクで%_io_%らへん調整でとんでもなくチートだった思い出。。最近だとAuroraがいいんですかね？地味に繰り返す大量処理が早くなるような話は聞いた気がします。

移行はReplicaつくってMaster昇格してHost名リネーム（または向き先修正）なつもりでいますがdumpするかも。
Master昇格で3時間ほどかかり(データ量がアレだからですかね。。)reboot後にbackupがとられてbackupにsnapshot的(おそらくsingle-transaction)にdumpとるのがデータ量分（今回1時間くらい）かかるぽくアクセスできるけどそのあとHost名かえるとrebootはしるので断ありみたいなことでbackup中に名前変えずにアクセスするにはRoute53(PrivateHostedZoneのほう)とかつかっとくのが無難そうなのかなというところです。TTLは60秒以上短くするとクエリが増えてお高くなると公式マニュアルに書いてあったので60でよさそうかな。
あとでディスク拡張するのは断なしでいけるようでした。

参考：
https://dev.mysql.com/doc/refman/5.6/ja/slow-query-log.html
https://www.percona.com/blog/2014/11/14/optimizing-mysql-zabbix/
https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
http://qiita.com/sh-ogawa/items/088edd8ef46eaa3ad79c
https://blog.cloudpack.jp/2015/03/02/attention-about-operating-amazon-rds-on-ssd-of-general-purpose/
https://yoku0825.blogspot.jp/2014/10/innodbfileformat-antelopebarracuda.html
http://dev.classmethod.jp/cloud/aws/rds-monitoring-replication-state/
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/white-label-name-servers.html
C > 幾何学 > 角度の重なりチェック > 外積使用 > 破綻

## 問題

- 角度範囲A,B,C,Dがある
- それぞれ角度の最小と最大の値は [0,360)が入る

A,B,C,Dの角度領域が重なっていないかを確認する


## 方法(案)

以下、間違っているかもしれない。

### 外積

[外積](http://www.deqnotes.net/acmicpc/2d_geometry/products)

角度範囲A内のベクトルAvecと角度範囲B内のベクトルBvecの外積は

```math
Avec \times Bvec = (a_x b_y - a_y b_x) 
```

### 重なりチェックのパターン

以下の6通りのチェックを行う

- A, Bの重なり
- A, Cの重なり
- A, Dの重なり
- B, Cの重なり
- B, Dの重なり
- C, Dの重なり

### 重なりのチェック

例として角度範囲A, Bの重なりのチェックをする場合

以下のxは外積

- Amin x Bmin と Amin x Bmaxの符号が同じ
- Amax x Bmin と Amax x Bmaxの符号が同じ

これを上記の6通りでチェックすれば重なりがあるか確認できるはず。

## 確認
(2016/06/12追記)

ベクトルV に対して、角度範囲A [0,90]を検討してみる。

Aminのベクトル bx = 0, by = 1
Amaxのベクトル bx = 1, by = 0

### ベクトルVが vx = 1, vy = 1の時

VとAminの外積: vx by - vy bx = 1*1 - 1*0 = 1
VとAmaxの外積: vx by - vy bx = 1*0 - 1*1 = -1

上記2つの外積の符号が異なるのでVはAmin,Amaxの範囲に含まれる。

これは意図通り

### ベクトルVが vx = -1, vy = -1の時

VとAminの外積: vx by - vy bx = -1*1 - (-1)*0 = -1
VとAmaxの外積: vx by - vy bx = -1*0 - (-1)*1 = +1

上記2つの外積の符号が異なる、Amin,Amaxの範囲に含まれるように思えるが、実際にはVはAmin,Amaxの範囲の外側にある。

破綻した。

## 別の方法

外積でなくclockwiseの角度の大小比較に方針を変える

## 重なりのチェック
(2016/06/12追記)
WordPressでページ分割して2ページ目以降はログインしないと見れないパターン

# ページの分割

投稿本文内で `<!--nextpage-->` 使う（デフォルト）。
あるいは プラグイン [Custom Nextpage](https://ja.wordpress.org/plugins/custom-nextpage/) を使う。

# 2ページ目以降に直アクセスされた時
投稿がページ分割されている場合、2ページ目以降は未ログインのユーザは閲覧できないように1ページ目に戻す。

```php
<?php
add_action( 'pre_get_posts', 'mytheme_single_login' );
function mytheme_single_login( $query ) {
	if ( is_admin() || ! $query->is_main_query() )
		return;

	if ( $query->is_single() ) {
		if ( ! empty( $query->query_vars['page'] ) ) {
			if ( ! is_user_logged_in() ) {
				wp_redirect( get_permalink( $query->query_vars['p'] ) );
				exit;
			}
		}
		return;
	}
}
```

# ページ分割部分を改変して、ログイン部分をつくる

- ページが分割されていない場合は何もしない。
- ページ分割されていてもログインしている場合はページのリンクが出る。
	- Custom Nextpage は wp_link_pages をオーバーライドするので特にPHPを書く必要はない。
- プラグイン [Gianism](https://ja.wordpress.org/plugins/gianism/) を使うとSNSアカウントでのログイン可能。WordPressのユーザー情報との連携も可能なのでお手軽。そうじゃない場合はよしなに実装。
	- ログインしたあとはどこにリダイレクトさせるかは `gianism_login` の第3引数で。

`single.php` あたりにある `wp_link_pages()` を `mytheme_multipage_must_login()` に置き換える。

```php
<?php
function mytheme_multipage_must_login() {
	global $multipage;
	if ( ! empty( $multipage ) ) { // multipage
		if ( is_user_logged_in() ) {
			wp_link_pages( array(
				'before'      => '<div class="page-links">',
				'after'       => '</div>',
				'link_before' => '<span class="page-num">',
				'link_after'  => '</span>',
			) );
		} else {
			if( function_exists( 'gianism_login' ) ){
				gianism_login( '', '', get_permalink() );
			} else {
				// Gianism 使っていない場合はこの辺にログイン処理なりリンクなり入れておく
				// @link : https://codex.wordpress.org/Function_Reference/wp_login_form
				wp_login_form();
			}
		}
	}
}
```
# 管理バーの処理
権限グループが閲覧者の場合は管理バーを出さない（お好みで）

```php
<?php
add_filter( 'show_admin_bar', 'mytheme_show_admin_bar' );
function mytheme_show_admin_bar( $show_admin_bar ) {
	if ( current_user_can( 'subscriber' ) ) {
		$show_admin_bar = false;
	}
	return $show_admin_bar;
}
```

# ログアウトの処理
権限グループが閲覧者の場合はHOMEに戻す（お好みで）

```php
<?php
add_filter( 'logout_redirect', 'mytheme_logout_redirect', 10, 3 );
function mytheme_logout_redirect( $redirect_to, $requested_redirect_to, $user ) {
	if ( isset( $user ) && in_array( 'subscriber', $user->roles ) ) {
		$redirect_to = home_url( '/' );
	}
	return $redirect_to;
}
```
- - - -

なお、これらのコードはテーマの `fucntions.php` に書くよりはプラグイン化したほうがいいでしょう。
その場合、テーマの `wp_link_pages()` を置き換える場合は

```php
<?php
if ( function_exists( 'mytheme_multipage_must_login' ) ) {
	mytheme_multipage_must_login();
} else {
	wp_link_pages( array(
		'before'      => '<div class="page-links">',
		'after'       => '</div>',
		'link_before' => '<span class="page-num">',
		'link_after'  => '</span>',
	) );
}
```
って書くのが親切。
Mirantis OpenStack DVR 徹底解剖（第三回）

[第二回](http://qiita.com/h-otsuka/items/738bdbc8cb5bd0ac6db5)では、仮想マシンから外部ネットワークへの通信（North-South）について書きました。
今回は、仮想マシン間通信（East-West）について記載していきたいと思います。

# East-West 通信
今回は、以下のネットワークトポロジのように、任意のルータ配下に２つのネットワークを作成し、
それぞれのサブネットに対して仮想マシンをぶら下げる構成を採用しています。
仮想マシン VM#4 は、compute02 ノードに、その他の仮想マシンは、compute01 ノードに配置しています。
<img width="500px" alt="network_topology.png" src="https://qiita-image-store.s3.amazonaws.com/0/121387/f6ce5aa4-c31c-14d0-7cd7-8202d8062c36.png">

## 同一サブネットの仮想マシン間の通信
まず、上のネットワークトポロジで青く塗られている領域の仮想マシン間通信について確認していきます。
![simple_ew1 (2).png](https://qiita-image-store.s3.amazonaws.com/0/121387/a867608d-d1d1-acf6-9dfa-c02d4bbfae89.png)

この場合、仮想ルータは通らず、br-int を経由して直接宛先の仮想マシンへ通信を行います。

## サブネットの異なる仮想マシン間の通信（同一ホスト）
次に、サブネットの異なる仮想マシン間で通信を行う場合について確認してきます。
![simple_ew2 (2).png](https://qiita-image-store.s3.amazonaws.com/0/121387/ce1a6067-2e99-6f0b-62a0-e541669c0433.png)

このケースでは、以下のステップの通り、仮想ルータを経由し、VM#3へと接続します。

1. まず、Subnet A に属する仮想ルータ（qrouter-\*\*\*）のインターフェース（qr-\*\*\*#1）へと向かいます。
<br><br>
2. 仮想ルータ（qrouter-\*\*\*）へ到達後、Src MAC が qr-\*\*\*#2 の MAC に、Dst MAC が VM#3 の MAC となり、
Subnet B に属している VM#3 まで到達します。

## サブネットの異なる仮想マシン間の通信（別ホスト）
最後に、別々の Compute Node に配置したサブネットの異なる仮想マシン間の通信について説明したいと思います。
![simple_ew3 (2).png](https://qiita-image-store.s3.amazonaws.com/0/121387/d15abe21-aab8-6216-9198-d455742bf1b9.png)

このケースでは、主に以下のような特徴がうかがえます。

- 仮想マシンから出ていく側の通信は、まず、自身の Compute Node の仮想ルータへ向かう
- 上記の仕様により、Request と Reply の通信経路が異なる
- Compute Node 間の通信の際は、br-tun にて、Src MAC が、DVRの自ノードMACに書き換えられる
RailsアプリでBowerで入れたAdminLTEの表示が動かなくなった件

## 経緯

新しく環境作って、RailsのアプリケーションをデプロイしてみたらAdminLTEのデザインが崩れた！

AdminLTEは`rails-bower`でインストールされていました。

## 原因

jQueryのバージョンが3になったことが影響してるみたいです。
AdminLTEのdependenciesがちゃんと指定されていないからみたい。

`jquery-rails`でインストールされているjQueryと`rails-bower`でインストールしたAdminLTEのjQuery名前が両方`jquery`になって重複してるっぽい。

## 対処法

`jquery-rails`のjQuery2系を使ってやれば治ります。

`application.js`内の以下の部分を変えたら、`jquery-rails`のjQuery2系を使ってくれます。

```diff
- //= require jquery
+ //= require jquery2
```

## まとめ

俺に黙ってアップデートすんな、と言いたくなった。
anyenvとkerlとの組み合わせで最新erlangをインストールする

anyenvで global とか使い方統一したいし、やっぱりkerlでソースまで探してきてほしいというわがまま向けで、両方合わせたらうまくいったのでメモします。

環境は、CentoOS6,7

#合わせるって？
ソース取得とコンパイルまでは、kerlで行い、インストールをerlenvの中にします。

#anyenvのインストール

```
git clone https://github.com/riywo/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
exec $SHELL -l
```
参照
http://qiita.com/luckypool/items/f1e756e9d3e9786ad9ea

#erlenvのインストール
```
anyenv install erlenv
exec $SHELL -l

```

#kerlのインストール

```
curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
chmod a+x kerl
```
参照
http://qiita.com/tatsuya6502/items/f15da8ea6e793c5038a2

#erlangの依存関係インストール
erlangコンパイルに依存関係がある。
```
sudo yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf
sudo yum install curl git
```

#最新を探す

```
./kerl list releases
R10B-0 R10B-10 R10B-1a R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8 R10B-9 R11B-0 R11B-1 R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3 R12B-4 R12B-5 R13A R13B01 R13B02-1 R13B02 R13B03 R13B04 R13B R14A R14B01 R14B02 R14B03 R14B04 R14B_erts-5.8.1.1 R14B R15B01 R15B02 R15B02_with_MSVCR100_installer_fix R15B03-1 R15B03 R15B R16A_RELEASE_CANDIDATE R16B01 R16B02 R16B03-1 R16B03 R16B 17.0-rc1 17.0-rc2 17.0 17.1 17.3 17.4 17.5 18.0 18.1 18.2.1 18.2 18.3
Run './kerl update releases' to update this list from erlang.org
```


#ビルド
```
./kerl build 17.5 17.5
```

#インストール
ここがミソでerlenvの中にインストール
```
./kerl install 17.5 ~/.anyenv/envs/erlenv/releases/17.5
```

#実行
```
erlenv global 17.5
erlenv rehash

$ erl
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.4  (abort with ^G)
1>

```
やったー！
Jenkinsおじさんをイケメンにすべくblueoceanをインストールしてみる

jenkinsおじさんをイケメンにするplugin（おじさんの絵はおじさんのままです）がリリースされたという記事を見たので、早速入れてみました。


# github

https://github.com/jenkinsci/blueocean-plugin


# インストールする

インストールにはmavenがいるので、jdkとmavenをインストールしてからお試しください。

## githubからcloneしてくる

まずblueoceanをgithubから落としてきます

```bash
# ホームディレクトリ直下におかないと起動時にエラーするっぽいです
$ cd ~
$ git clone https://github.com/jenkinsci/blueocean-plugin.git
```

## mvn clean installする

必要なものを諸々インストールするため、mvn clean installします。

```bash
$ cd ./blueocean-plugin
$ mvn clean install
```

## 起動する

blueocean-pluginの下に移動してmvnコマンドで起動します

```bash
$ cd blueocean-plugin

$ pwd
/home/hoge/blueocean-plugin/blueocean-plugin

$ mvn hpi:run
```

なんか色々ダウンロードが始まります。
僕の場合、結構時間かかりました。気長に待ちます。

最後は以下の感じで終わるので、ここまで行ったら完了！

```bash
$ mvn hpi:run
*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

xxxxxxxxxxxxxxxx

This may also be found at: /root/blueocean-plugin/work/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

6 09, 2016 7:04:43 午後 hudson.model.UpdateSite updateData
情報: Obtained the latest update center data file for UpdateSource default
6 09, 2016 7:04:43 午後 hudson.model.UpdateSite updateData
情報: Obtained the latest update center data file for UpdateSource default
6 09, 2016 7:04:43 午後 hudson.WebAppMain$3 run
情報: Jenkins is fully up and running
6 09, 2016 7:04:44 午後 hudson.model.DownloadService$Downloadable load
情報: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
6 09, 2016 7:04:46 午後 hudson.model.DownloadService$Downloadable load
情報: Obtained the updated data file for hudson.tools.JDKInstaller
6 09, 2016 7:04:46 午後 hudson.model.AsyncPeriodicWork$1 run
情報: Finished Download metadata. 13,577 ms
```

# アクセスしてみる

アクセスする際は、普段のjenkinsのURLに/blueを追加すればいいみたいです。

```
http://localhost:8080/jenkins/blue/
```

みたいな感じで

ログイン画面ぽいとこにたどり着きます。

ここには上記で起動したときに******で囲まれているところの値を入れればよいようです。

アカウント発行とかしたらまた/jenkinsに戻されてしまったので、再び

http://localhost:8080/jenkins/blue

こんな感じで表示されました！

![スクリーンショット 2016-06-10 19.08.46.png](https://qiita-image-store.s3.amazonaws.com/0/105934/31e91c96-b58f-3c57-b529-c009f63e9a92.png)


ただ、New Pipelineとか押すと死ぬっぽいので、引き続き調べます(´・ω・｀)
わかる方がいらっしゃったらコメント頂けると嬉しいです！
AWS実践入門　仮想サーバーの作成でハマったとこ

## 作成したサーバー

AMI : Amazon Linux AMI
インスタンスタイプ：　t2.micro
VPC :default
EBS : 8GB

Security Group : SSH(20) HTTP(80) Rails(3000) 

ミドルウェア　：　nginx 
          ruby on rails
          MySQL

##ハマったとこ

rails のコマンドで

```rake db:create```  →データベース作成
```rake db:migrate``` →マイグレーションファイル作成

　があるのですが、　

```Could not find rake-10.4.2 in any of the sources
Run bundle install to install missing gems.```

このようなエラーが出てきました。　”bundle install" をたたくのですが、、、、、

```Failed to build gem native extension.　
sqlite3.h is missing```

このようなエラー汗

railsの知識がないのでどのことが起こっているかもわからない

##解決方法　


```Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.```

    /usr/local/bin/ruby extconf.rb
```checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).```

このようなエラーを発見！！　　

そして
```sudo yum install sqlite-devel```
```sudo gem install sqlite3```

を実行すると解決しました！！

##結論

今回のハマった原因はrailsの知識がなかったこと＋　エラーを部分的にしか見てなかったことです。
何が原因でハマっているのかを正確に追求することがとても重要だと認識しました。
Apache BenchのTime per requestを調べてみた

# 注意
Apache Benchの利用方法についての解説記事ではありません。

# 目的
Apache Benchの結果にある2つのTime per requestの意味を自分なりに理解する。
（間違いなどありましたら、ご指摘ください。）

# 結論
* 一つ目のTime per request(mean)は、同時実行したリクエストの平均処理時間
* 二つ目のTime per request(mean, across all concurrent requests)は、1リクエストの平均処理時間

# 背景
* Apache Benchの結果にある一つ目のTime per requestが何を意味しているのか分からない。

# 公式サイトより
> Time per request
The average time spent per request. The first value is calculated with the formula concurrency * timetaken * 1000 / done while the second value is calculated with the formula timetaken * 1000 / done

http://httpd.apache.org/docs/2.4/programs/ab.html

訳すと、
一つ目の値の公式は、「同時実行数 * 全てのリクエストが完了するのにかかった時間 * 1000 / 処理したリクエスト数」
二つ目の値の公式は、「全てのリクエストが完了するのにかかった時間 * 1000 / 処理したリクエスト数」

ということで、
一つ目の値は、二つ目の値に **同時実行数** をかけた値ということになる。

# 例えば
総リクエスト数100、同時実行数10で以下の結果が得られたとする。（関係のない項目は省略）

```
Concurrency Level:      10 # 同時実行数
Time taken for tests:   12.029 seconds # 全てのリクエストが完了するのにかかった時間
Complete requests:      100 # 処理したリクエスト数
Failed requests:        0
Requests per second:    8.31 [#/sec] (mean)
Time per request:       1202.947 [ms] (mean)
Time per request:       120.295 [ms] (mean, across all concurrent requests)
```

二つ目のTime per requestは公式に基づき、 12.029 sec * 1000 / 100 で 120.295 ms。
一つ目のTime per requestは上記の値に同時実行数をかけたものになるので、 120.295 * 10 で 1202.947

※ 実際の計算は一つ目からされていると思いますが、今回は理解のために二つ目から計算しています。



# 良く分からなかったのは
Time per request を 1リクエストにかかった時間と解釈していたから分からなかった。


# 最後に
Time per concurrent request とかの方が分かりやすいと思う。

# 参考サイト
* eAcceleratorによるPHP高速化の効果 – No:441 – Linuxで自宅サーバ構築（新森からの雑記） : http://www.uetyi.com/server-const/linux-server/entry-441.html

# 追記（2016/06/10)
同時実行数といっているのに、1リクエストの平均処理時間に同時実行数をかけた値になっているのが良く分からない。
これだと同時実行数に指定したリクエスト数をシーケンシャルに実行した場合にかかる時間になるだけではないのかな。
うーん・・・よくわからない。
GCPでビルド環境としてGitLab+Gitlab CI使おうとしてハマったポイント


## 対象バージョン

- docker-machine : 0.7.0
- gitlab-runner : 1.2.0

## 何があったか

GCP上に立てたGitLabにあわせてせっかくクラウドでやるんだからオートスケールするビルド環境がいいぜ！って思いgitlab-ciの導入に踏み切りました。
そして動かしたら、待てど暮らせどインスタンスは作成されずビルドが始まりません。

gitlab-ci-multi-runnerの設定でexecutorを`docker+machine`にします。

ログを確認しました。

```
Jun 10 17:20:32 gitlab-runner1 gitlab-ci-multi-runner[28551]: (runner-8d80da44-auto-scale-runners-1465546832-960a1434) Generating SSH Key
Jun 10 17:20:33 gitlab-runner1 gitlab-ci-multi-runner[28551]: (runner-8d80da44-auto-scale-runners-1465546832-960a1434) Creating host...
Jun 10 17:20:33 gitlab-runner1 gitlab-ci-multi-runner[28551]: (runner-8d80da44-auto-scale-runners-1465546832-960a1434) Opening firewall ports
Jun 10 17:20:33 gitlab-runner1 gitlab-ci-multi-runner[28551]: (runner-8d80da44-auto-scale-runners-1465546832-960a1434) Creating instance
Jun 10 17:20:35 gitlab-runner1 gitlab-ci-multi-runner[28551]: Error creating machine: Error in driver during machine creation: googleapi: Error 400: Invalid value for field 'resource.disks[0].initializeParams.sourceImage': '/de
bian-cloud/debian-8-jessie-v20160606'. The URL is malformed., invalid
Jun 10 17:20:35 gitlab-runner1 gitlab-ci-multi-runner[28551]: The default lines below are for a sh/bash shell, you can specify the shell you're using, with the --shell flag.
Jun 10 17:20:36 gitlab-runner1 gitlab-runner[28551]: Machine creation failed, trying to provision exit status 1
```

かなC。
じゃあちょっと調べましょうか。

## なんでそうなったのか

gitlab-ci-multi-runnerの設定でexecutorを`docker+machine`にするのですが、この時のパラメータに注意が必要です。

`google-machine-image`こいつが鬼門でした。

なぜなら、ちょっと前まではGCPのデベロッパーコンソールでもインスタンス作成→コマンドラインで表示したらフルのイメージのURLが出ていたんですが、今は省略可能になっています。

gcloud sdkでインスタンス作るなら、これで問題ないはずです。(他のパラメータについては省略。)

```
gcloud compute instances create hoge --image debian-8-jessie-v20160606
```

インスタンス作成で`debian-8-jessie-v20160606`を指定すれば普通にDebianのインスタンスできます。
これと同じノリでgitlab-runnerの設定もします。

```
MachineOptions = [
  "google-machine-image=debian-8-jessie-v20160606"
]
```

これで行きます。

**`The URL is malformed., invalid`**

お、おう…。
プロジェクト名と名前だけで指定できるようになって久しいので、フルなURLなんてそらで言えないよ…。

## どうしたか

そういえばdocker-machineでイメージ指定しなかったら普通に作れたな。
てことはどっかに書いてあるな。

docker-machineのソースコード読んだらありました。

```
defaultImageName   = "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1510-wily-v20151114"
```

やったぜ。

こういうことですね。

`https://www.googleapis.com/compute/v1/projects/` + `プロジェクトID` + `/global/images/` + `イメージ名`

これでOK。

```
MachineOptions = [
  "google-machine-image=https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20160606",
  "google-scopes=https://www.googleapis.com/auth/cloud-platform",
```

ちなみに、スコープもURLで指定しないと怒られるので注意してください。
こっちは`gcloud compute instances --help`とかすれば内容確認できます。

## 最後に

そのうちdocker-machineがバージョンアップしてできるようになるかもしれないですね。
てか、image-family使わせてください。
PHP Goutte で filter 後の要素から直下の子のタグのみをリストにしたり絞り込んだりする

多重にtableを使用しているhtmlなどに対してスクレイピングするときに、深い階層のタグは検索にfilterに入れたくない場合がある。

```html
<table id="top_table">
  <tr>
    <td>data1</td>
    <td>data2</td>
    <td>
      <table>
        <tr>
          <td>data3-1</td>
          <td>data3-2</td>
          <td>data3-3</td>
        </tr>
      </table>
    </td>
  </tr>
  <tr>
    <td>data1</td>
    <td>data2</td>
    <td>
      <table>
        <tr>
          <td>data3-1</td>
          <td>data3-2</td>
          <td>data3-3</td>
        </tr>
      </table>
    </td>
  </tr>
  ...
</table>
```

`filter` で頑張ってみたが出来なかったので、 `filterXPath` を使ってみたら出来たのでメモ。

```php
$top_table_tag = $crawler->filter('table#top_table');
$top_table_tag->filterXPath('./*/tr')->each(function($tr_tag) {
  $child_td_tags = $tr_tag->filterXPath('./*/td');
  $data1_tag = $child_td_tags->eq(0);
  $data2_tag = $child_td_tags->eq(1);
  $data3_tag = $child_td_tags->eq(2);
}
```

ちなみに、下記のようにすると直下のタグをリストできる。

```php
filterXPath('./*/*')
```

filterでも `$table_tag->filter('> tr')` とかできたら良いのになぁ。
[Android]画面遷移（備忘録）

画面遷移はアプリの基本なので備忘録的な意味で書きます。
これが分かるだけで開発の幅も広がると思います。

＜結果を遷移元に戻さない＞


```MainActivity.java（遷移元）
// インテントの作成＆遷移先を指定
Intent intent = new Intent(this, ResultActivity.class);
// 遷移先に渡すオブジェクトを設定
intent.putExtra("KEY", value);
// 遷移先に移る
startActivity(intent);
```
```ResultActivity.java（遷移先）
// Intentを取得する
Intent intent = getIntent();
// 渡されたオブジェクトを取得する
value = intent.getDoubleExtra("KEY",0.0);
```

```AndroidManifest.xml
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name="com.example.student.calcbmi.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
            android:name="com.example.student.calcbmi.ResultActivity"
            android:label="@string/app_name" >
    </activity>
</application>
```





＜結果を遷移元に戻す＞

```MainActivity.java（遷移元）
// インテントの作成＆遷移先を指定
Intent intent = new Intent(this, ResultActivity.class);
// 遷移先に渡すオブジェクトを設定
intent.putExtra("KEY", value);
// 遷移先に移る（遷移先から結果を送り返す）
startActivityForResult(intent, 0);
```

```ResultActivity.java（遷移先）
// Intentを取得する
Intent intent = getIntent();
// 渡されたオブジェクトを取得する
value = intent.getDoubleExtra("KEY",0.0);
// インテントの作成
Intent intent = new Intent();
// 遷移元に送り返すオブジェクトを設定
intent.putExtra("MESSAGE", message);
// 結果コードを設定
setResult(RESULT_OK,intent);
// 遷移先を閉じる
finish();
```

```MainActivity.java（遷移元）
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
　　　　　　　// 遷移先からオブジェクトを受け取る
            String message = data.getStringExtra("MESSAGE");
　　　　　　　// トーストを表示する
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        }
    }
}
```

```AndroidManifest.xml
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name="com.example.student.calcbmi.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
            android:name="com.example.student.calcbmi.ResultActivity"
            android:label="@string/app_name" >
    </activity>
</application>
```
GitHub上でWebプレイヤー形式のUnityを実行させる。

##GitHub上でUnityを動かした時の備忘録
###目次
①WebPlayer形式でゲームをビルドする
➁GitHub上にWebページを作る
③ビルド下ゲームをWebページに配置する
###①Unity側の設定
![aa.png](https://qiita-image-store.s3.amazonaws.com/0/114205/866939ad-1b73-e1ab-6b4a-7c734c31e595.png)
Platformを「Webプレイヤー」に切り替える。
適当なフォルダにビルドして終わり。
###➁GitHubの設定
![ｂｂ.png](https://qiita-image-store.s3.amazonaws.com/0/114205/27e7e81d-1671-5cbf-93bd-ed378b30ffcf.png)
「Automatic page generator」をクリックすると、GitHub上にWebページを作成出来る。
しばらく、テンプレートなどの設定画面に入るが適当なものを選んで完了させる。
このWebページ自体は「gh-pages」というBranchに保管されている。
そこで、ビルドしたUnityのプロジェクトを「gh-pages」にPushする。
###③Webページにゲームを載せる
git clone [URL]
このフォルダにビルドしたゲームを入れる
git add --all(ゲームがaddされればOK)
git commit -a
git push origin gh-pages(push先はgh-pagesじゃないとWebページに反映されない)

http://[アカウント名].github.io/[リポジトリ名]/[①で出力されたHTMLファイル名]


###完成:grin:
Python ナップザック問題を貪欲法( greedy algorithm)で解く

[ナップサック問題 (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C) を [貪欲法 (Wikipedia)](https://ja.wikipedia.org/wiki/%E8%B2%AA%E6%AC%B2%E6%B3%95) で解きます。貪欲法で求められる解は厳密解とは限らないので注意が必要です。
コードに関して不備や改良案等があればご教示頂けますと幸いです。

```
(貪欲法についてWikipediaより)

以下にナップサック問題での適用例を示す。この問題の場合は各荷物ごとに分割して評価することで適用可能である。
ナップサック問題の各荷物の評価値を決定する。（価値）÷（容積）という数字がよく使われる。
評価値の一番高い荷物を選ぶ。
その荷物をナップサックに入れても最大容量を越えないならナップサックに入れる。
全ての荷物を評価値の順に選び上記の操作を繰り返す。
なお、この問題に関しては貪欲法では最適解を得られない。
```

容積あたりの価値を計算してお得な荷物から詰めていく感じですね！

## 問題

```
4*x1 + 5*x2 + x3 + 3*x4 <= 6
xi = 0 or 1 (i = 1, 2, 3, 4)

上記条件の下で
7*x1 + 8*x2 + x3 + 2*x4
を最大にする( x1, x2, x3, x4 )を貪欲法を用いて求めよ。
```

## 解答

```py
import numpy as np
from pandas import DataFrame

# 制約条件より
weights = np.array([4, 5, 1, 3])
# 目的関数より
values = np.array([7, 8, 1, 2])
# xの配列。初期値はすべて0とする。採択した時に1にする。
results = np.array([0, 0, 0, 0])
# 評価値を算出。
evaluates = values/weights
# DataFrameにまとめる
target_df = DataFrame(np.c_[evaluates, weights, values, results], index=['x1', 'x2', 'x3', 'x4'], columns = ['evaluate', 'weight', 'value', 'result'])
# evaluateの値で降順に並び替える
target_df.sort_values('evaluate', ascending=False)

# 採択した項目のweightの和。初期値0。
weight_sum = 0

# 評価値の高いものからループを回す
for index, target in target_df.iterrows():
    # 制約条件をクリアしたら採択
    if weight_sum + target['weight'] <= 6:
        weight_sum += target['weight']
        target['result'] = 1
        
print(target_df)
print("---answer---")
print(target_df['result'])
```

### sort
DataFrameのsortは `sort_values`で出来ました。`sort`でやろうとしたら`DEPRECATED`が出ました。
`ascending` で逆順に並びます。
[pandas.DataFrame.sort](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort.html)

numpyだけで逆順ソートをやろうとすると以下のようにして出来ました。

```py
import numpy as np
arr = np.array([[4, 2], [5, 2], [6, 4], [1, 3], [2, 3]])
arr = arr[ arr[:,0].argsort() ] # 0番目でsort
arr = arr[::-1]
print(arr)
```

```

[[6 4]
 [5 2]
 [4 2]
 [2 3]
 [1 3]]
```

少し面倒くさい。。

## 結果

```
    evaluate  weight  value  result
x1  1.750000     4.0    7.0     1.0
x2  1.600000     5.0    8.0     0.0
x3  1.000000     1.0    1.0     1.0
x4  0.666667     3.0    2.0     0.0
---answer---
x1    1.0
x2    0.0
x3    1.0
x4    0.0
Name: result, dtype: float64
```

よって、
( x1, x2, x3, x4 ) = ( 1, 0, 1, 0 )
よく使うくせに触らなければすぐ忘れるviでのコマンド備忘録

編集操作は忘れませんが、移動関連がすぐ抜け落ちて途方に暮れる昨今。

2016.06.17
　- コメント頂いた内容を本文に追記

## 現在の行で移動
$で行末尾へ、0で行頭へ移動。
## 現在の行の末尾に "追記"
shift + a で A
## 現在の行周辺に1行追加
oで後ろに追加、大文字で前に追加。
## ドキュメント末尾に移動。
shift + g で G
## ドキュメント先頭に移動。
shift + h で H
## 画面上の...
Mで真ん中へ移動、Lで最下部へ移動。
## 単語単位での移動
wで次の単語へ、bで前の単語へ。
jQuery Easing 関数で背景のアニメーション

イージング関数を使用して背景をアニメーションさせます。
背景画像のポジション、背景画像のサイズ、背景色のアニメーションです。
背景サイズはIE9以上対応。

http://web.loft-net.co.jp/lofttecs/jquery_easing_background_animation/

参考：
[jQuery Easing Plugin のイージング関数を直接利用する方法](http://rd.uniba.jp/blog/2010/10/11/jquery-easing-plugin-%E3%81%AE%E3%82%A4%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E9%96%A2%E6%95%B0%E3%82%92%E7%9B%B4%E6%8E%A5%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
[Easing Function 早見表](http://easings.net/ja)
Beamerのenumerate環境の文字色を白色にする方法

定義ファイルにパッチを当てることで、Beamerのenumerate環境の文字色を黒色から白色に変更するための方法についてまとめます。

# 前提
以下の環境であることを前提とします。

* Ubuntu
* TeXLive

# 手順
1. [rivanvx / beamer / コミット / ec57015adb09 — Bitbucket](https://bitbucket.org/rivanvx/beamer/commits/ec57015adb092d0f2e77c50e088e212d0fc63956)にアクセスし、`View raw commit`のリンク先(パッチ)を保存します。
2. 端末を起動します。
2. `cd /usr/share/texmf/tex/latex/beamer/base`コマンドを実行し、Beamerの定義ファイルがあるディレクトリに移動します。
3. `sudo patch -p2  < {保存したパッチ}`コマンドを実行し、Beamerの定義ファイルにパッチを当てます。

# 参考文献
* [patch コマンドのオプションを理解するためのエントリ(diff/patch の使い方) - それマグで！](http://takuya-1st.hatenablog.jp/entry/20110213/1297592211)
* [QA: Beamerのenumerateでballの中の数字の色が白ではなく黒になる件](http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1301)
【実際にやって出来た】Mysqlで3つのテーブルを結合する方法

これでOK↓
select * from table1 inner join table2 on table1.id = table2.id inner join table3 on table1.id = table3.id;

引用元
http://d.hatena.ne.jp/atelier-shin/20090515/1242368331
Private Docker Betaのインストールと問題の対処


#はじめに
Docker Toolboxを使用していたパソコンに、[Docker for Mac private beta](https://beta.docker.com/docs/mac/getting-started/#download-docker-for-mac) をインストールした時、コケたのでメモ。
###使用した環境
OSX El Capitan 10.11.5
MacbookAir
iMac

#Docker for Mac private beta のインストール
1.[Dockerのページ](https://beta.docker.com/)に移動

2.「Login with Docker ID」からログイン　（Docker IDがない場合は、[Docker Hubのサイト](https://hub.docker.com/)から作成)

3.名前、会社名、プラットフォームなど必要事項を記載![スクリーンショット 2016-06-09 9.02.27.png](https://qiita-image-store.s3.amazonaws.com/0/96755/579ef92e-2b7c-c959-bba6-304d7d8ddfb3.png)

4.送信後、数日でDocker Teamからメールが届く（自分の場合は２日）。メールにはインストールに必要なコードがあるので、削除しないように気をつける。
![スクリーンショット 2016-06-09 9.15.42.png](https://qiita-image-store.s3.amazonaws.com/0/96755/4ebc5ff8-bc69-b243-2064-373798992261.png)

5.メールの「Get docs and download the app」からダウンロードして、インストールする。
6.インストールが成功したか確認。
```
$docker -v
Docker version 1.11.1, build 5604cbe
$docker images
```
Docker version、Dockerイメージが表示されればインストールが成功している。
（初回の場合はDockerイメージがないので、REPOSITORYなどの項目だけが表示される）

###エラーの症状
```
$ docker ps
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```
Dockerのデーモンに接続できないエラーが表示される。
###エラーの原因と修正
Toolboxを使用していた時の環境設定が影響している。Private Docker Betaを使用するために必要な環境設定と異なる。

1.現在のDockerの環境設定を確認
```$env | grep DOCKER```
DOCKER_HOSTなどの環境設定が表示されたら、手順２を行う。

2.環境設定の削除
```$unset ${!DOCKER_*}```

3.Private Docker Betaをインストール
インストール済みの場合は、アンインストールしてから、インストールしてください。

4.Dockerの動作確認
Private Docker Betaが起動していることを確認してから、コマンド上で
```$docker images```
などを実行する。
問題なく実行できれば成功

###最後に
Private Docker Betaはベータ版であります。まだエラーとかも多数存在すると思いますが、更新の方も常にされているのが現状です。
早く安定版が公開されて利用できるようになって欲しいですね。