OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7から private や private static のテストがクソ簡単に書けるぞ！

# はじめに

- [Qiita - 今cURLで並列処理を書くならジェネレータを使え！](http://qiita.com/mpyw/items/44a001101914450257dc)
- **[GitHub - mpyw/co](https://github.com/mpyw/co)**

cURLの非同期処理をJavaScriptみたいに器用にやってくれるやつ書いてたんですが，privateフィールドが多くてテストごとにリフレクション書くのが面倒くさい！試行錯誤しているうちに，PHP7からの新機能である**無名クラス**を活用する方法をひらめきました．

# 簡易実装

`private static` なメソッドをテストする例です．

```php:Example.php
<?php

namespace mpyw\StupidExample;

class Example {
    private static function hello()
    {
        return 'Hello';
    }   
}
```

```php:テスト
<?php

require_once 'Example.php';

use mpyw\StupidExample\Example;

$Example = new Çlass { // ハイライトが未対応なので全角文字で小細工
    private $rc;
    public static function __callStatic(string $name, array $args)
    {
        $rm = new \ReflectionMethod(Example::class, $method);
        $rm->setAccessible(true);
        return $rm->invokeArgs(null, $args);
    }
};

assert($Example::hello() === 'Hello');
```

無名クラスが生きるのはやはりマジックメソッドの活用ですね…！

# 応用

`private static` なメソッドのテストの例を示しましたが，いろんなものに対応させたものをライブラリとして公開しました．

- **[mpyw/privator](https://github.com/mpyw/privator)**
- [テスト関連ファイル一覧](https://github.com/mpyw/privator/tree/master/tests/unit)

## 使い方

```php:Codeceptionでの例
<?php

require_once 'Example.php';

use mpyw\Privator\Proxy;
use mpyw\StupidExample\Example;

class ExampleTest extends \Codeception\TestCase\Test
{
    
    public function _before()
    {
        $this->Example = Proxy::get(Example::class);
    }

    ...

}
```

全てのテストメソッドの前に実行される `_before` にこの1行を書くだけです！後は何でもやりたい放題！コンストラクタが`private`でもOK！

```php
// 静的メソッドのコール
$this->Example::staticMethod();
// コンストラクタ無しのインスタンスの生成
$example = $this->Example::newWithoutConstructor();
// コンストラクタ有りのインスタンスの生成
$example = $this->Example::new();
// インスタンスメソッドのコール
$example->instanceMethod();
// インスタンスプロパティへの代入
$example->instanceProperty = 'value';
// インスタンスプロパティの取得
$value = $example->instanceProperty;
```

ただ，妥協しなければいけないところも…

```php
// 静的プロパティへの代入
$this->Example::setStatic('staticProperty', 'value');
// 静的プロパティの取得
$value = $this->Example::getStatic('staticProperty');
```

静的プロパティはマジックメソッドが無いのでどうしようもありませんでした．まあこれでも十分便利だよね，うん！

# 追記

よく考えたら同等の機能は `ClassProxy` `InstanceProxy` としてクラスを定義しておいて全部 `__call()` `__get()` `__set()` で解決すればどうにでもなりますね…

```php
$class = new ClassProxy(Example::class);
$class->staticMethod();
$instance = $class->getNew(); // new InstanceProxy(Example::class, []);
$instance->instanceMethod();
```

`__callStatic()`を使うことのメリットは，静的メソッドに対して`::`演算子でのアクセスができるので，より本来の形に近いように見えることだと思います．これを実現するにあたって，PHP7であれば**複数のクラスの面倒を同時に見ることができます**．

```php
$A = Proxy::get(A::class);
$B = Proxy::get(B::class);

$A::staticMethodOfA();
$B::staticMethodOfB();
```

もし複数クラスを対象としてPHP5でやろうとすると `__call()` での妥協が必要になります…

(何かあんまり意味のないエントリになってしまって申し訳ない)
Amazon RedShiftからS3に出力する方法

# 概要
- Amazon RedShiftに保存されているデータをS3バケットに出力

# 手順

## S3バケットの準備

### 手順
- RedShiftと**同じリージョン**でS3バケットを作成
- アクセスキーIDと秘密アクセスキーの準備
  - https://console.aws.amazon.com/iam/home?#users
- 上記で作成したユーザに次のポリシーをアタッチ（もしかしたら不要かも）
  - AmazonS3FullAccess

### 参考
- [アクセスキー ID と秘密アクセスキーの取得 - Amazon Simple Queue Service](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html)


## SQLコマンドによるデータ出力

### 手順
- SQL Workbenchで次のコマンドを実行

### コマンド例
- selectの中身は適宜調整
- limitは使えない

```sql
unload ('
  SELECT 
    customer_id,
    customer_created,
  FROM customers
')
to 's3://my-backet/test/clients_' credentials 
'aws_access_key_id=XXXX;aws_secret_access_key=XXXX'
parallel off
allowoverwrite
delimiter as '\t'
GZIP
```

### 参考
- [データのアンロード - Amazon Redshift](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_unloading_data.html)
- [UNLOAD - Amazon Redshift](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html)
- [UNLOAD の例 - Amazon Redshift](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD_command_examples.html)
- [区切り文字付きまたは固定幅形式でデータをアンロードする - Amazon Redshift](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_unloading_fixed_width_data.html)
Shinobilayer: SoftLayerにおけるCDN拡張機能 - ベンダーポータルへのユーザー追加

#はじめに
SoftLayerにおけるCDNの拡張機能を紹介する記事です。
下記リンクを参照して、CDNのベンダーポータルに事前にログインできるようにしておいて下さい。
http://qiita.com/testnin2/items/ae2b2034334732c806e7

#ユーザーの追加
SoftLayerからもらったID/passwordは管理者情報なので、CDNを利用するメンバーが複数人いる場合は、別途ユーザーを作成した方がよいでしょう。

1. Admin -> UsersからAdd Usersを選択<br>
![EdgeCast04.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/69358fe1-e648-8db5-8751-12b278c99081.jpeg)
2. First NameとLast NameとE-mail/usernameは必須項目なので入力する。あとは、権限などを適当に設定し、Saveボタンを押す。<br>
![EdgeCast05.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/69fa536b-198c-109f-4a80-2f91ff2884d5.jpeg)
3. しばらくすると、設定したメールアドレス宛にEdgeCastからメールが届くので、そのリンクを選択。<br>
![EdgeCast06.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/f27d2809-4de7-31fb-59a2-c54b18a82694.jpeg)
4. メールアドレスを入力。<br>
![EdgeCast07.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e0a8e0f3-e0e6-031f-0a5a-967aa81c9742.jpeg)
5. パスワードを入力。<br>
![EdgeCast08.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/1ad81ac1-dad4-1446-2d63-56a6dda95fc3.jpeg)
6. 無事パスワード登録が完了。<br>
![EdgeCast09.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/bdec3272-2342-1e44-4b07-eaf315404bd5.jpeg)
Shinobilayer: SoftLayerにおけるCDN拡張機能 - ベンダーポータルへのアクセス方法

#はじめに
SoftLayerのCDNはEdgeCastを利用していますが、SoftLayerのCustomer Portal経由だとほとんどこのEdgeCastの機能は使えません。
SoftLayerのCDN機能って大したことないなーって思っている方もいらっしゃるかもしれませんが、実はSoftLayerでチケットを起票すれば、EdgeCastの有料オプションなどを使って機能拡張できるってご存知でしたか？これから何回かに分けてEdgeCastの機能を順に紹介していきたいと思います。

#ベンダーポータルへアクセスするためのチケット起票
当然、URL/ID/passwordのどれもわからないので、Ticketで起票します。

```text:Ticketの例
Hello, could I get the credential information of CDN vendor portal for account xxxxx because we'd like to access Edgecast directly to use such as "HTTP Rules Engine" or "Country filtering" ?
```

CDNのAccount IDは、CDN注文後に以下の画面から確認することができます。account xxxxxのところは、ご自身のアカウント番号をご利用ください。
![EdgeCast01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/eb7564d8-0497-102c-f1af-2c81ba8fd7e3.jpeg)


そうすると、
CDN portal URL: https://my.edgecast.com/Account/Login
CDN account username: xxxxxxx
CDN account password: xxxxxxx
がもらえると思います。

#ベンダーポータルへのアクセス方法

1. CDN Portalにアクセスし、CDN account username/passwordを入力する。
![EdgeCast02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6f7b3be7-c0b1-eee4-f206-2e6b9147b08c.jpeg)
2. ログイン後、言語設定を選択する。
![EdgeCast03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e05d288b-7290-1528-7bcb-1b46e86b4093.jpeg)

とすることで、無事ログインできました！次回からはこのベンダーポータルを使って色々カスタマイズしていきたいと思います。今日はここまで！
超簡単にSlackで匿名の意見を投稿できるようにする


## はじめに
会社やチームで活動していると、メンバーが匿名で意見を言える場がほしかったりします。
Slackを使って簡単に匿名で意見を投稿できる仕組みを作れたので、今回はそれを紹介したいと思います。

完成イメージはこんな感じ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/084c0694-e335-1cb4-13b4-491b27242f36.png" width="300px" />

## Botを追加する
まずはSlackにBotを追加します。
下記のリンクをクリックするとBotの新規作成ができます。
https://my.slack.com/services/new/bot

適当に`anonymous`とでも名前をつけて、「Add bot integration」のボタンをクリック。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/7b714039-8155-f0f4-9029-b358cb146663.png" width="600px" />

「API Token」が表示されるので、これをコピーしてください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/c8dc9336-02ee-e0ae-ef2e-2e90271edb38.png" width="600px" />

これでSlackにBotが作られました。

## Botkitをインストール
今回はSlack公式のBotフレームワーク[Botkit](https://github.com/howdyai/botkit)を使います。
（※BotkitはNode.js上で動くので、先にNode.jsをインストールしておいてください）

インストールしたいサーバーで、下記コマンドを実行します。

```bash
cd インストールしたいディレクトリ
git clone git@github.com:howdyai/botkit.git
cd ./botkit
npm install
```

インストールはこれだけです。超簡単。

## プログラムを追加する
次に匿名で投稿できるような機能を追加します。

投稿にはSlackのidが必要なので、URLから取得します。
投稿先によってそれぞれ取得方法が異なるので注意してください。

```bash
# 投稿先がユーザーの場合
https://slack.com/api/users.list?token=さっきのAPI_Token
# 投稿先がprivateチャンネルの場合
https://slack.com/api/groups.list?token=さっきのAPI_Token
# 投稿先がpublicチャンネルの場合
https://slack.com/api/channels.list?token=さっきのAPI_Token
```

URLを実行するとjsonが表示されるので、投稿先のid（ユーザーの場合はuser_id）を探してください。
idが分かったら、先ほど取得したBotkitのディレクトリ直下にあるslack_bot.jsに下記のコードを追加します。

```javascript:slack_bot.js
controller.on('direct_message',function(bot,message) {
  bot.reply(message,"匿名で投稿しました:mailbox_with_mail:");
  
  // 投稿先がユーザーの場合
  bot.startPrivateConversation({user: "さっきのuser_id"}, function(response, convo){
    convo.say(message);
  })

  // 投稿先がチャンネルの場合
  bot.startConversation({channel: "さっきのid"}, function(response, convo){
    convo.say(message);
  })
});
```

投稿先がユーザーかチャンネルかで書き方が若干違うので、そこだけ注意してください。

## Botを起動する

あとはBotを起動するだけです。
コマンドで以下を実行してください。

```bash
token=さっきのAPI_Token node slack_bot.js
```

文字列がずらずらと表示されて、Botがアクティブになれば起動しています。
コマンドを止めたらBotも非アクティブになります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/ab5f9946-243d-4ce5-b8e2-34f6271d664b.png" width="200px" />

では匿名で投稿したい内容を`anonymous`に話しかけてみましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/93eee3b7-4663-6e1a-4f6b-0049d3abfdb4.png" width="300px" />

設定したチャンネルにはBotからの発言として届くので、誰がこのメッセージを送ったかは分かりません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/4d17e2d9-1cb5-20f3-d6c6-c71b5c14ee7c.png" width="290px" />

## おわりに
人間関係上言えないことやネガティブな意見も、Botを使えば簡単に拾うことができるかもしれません（すみません、実はまだ導入してませんw）。

また、BotkitはこれまでのBotより簡単に起動できる印象でした。
Redisとかも使えるようなので、乗り換えるのはアリだと思います。
【React学習教材】React.js Koansのちょっとしたヒントとかメモとか

「[なぜ仮想DOMという概念が俺達の魂を震えさせるのか](http://qiita.com/mizchi/items/4d25bc26def1719d52e6)」という記事の[学習資料](http://qiita.com/mizchi/items/4d25bc26def1719d52e6#%E5%AD%A6%E7%BF%92%E8%B3%87%E6%96%99)にある[Awesome React](https://github.com/enaqx/awesome-react)で、[React General Tutorials](https://github.com/enaqx/awesome-react#react-general-tutorials)の中の[React.js Koans](https://github.com/arkency/reactjs_koans)を一通りやったのでメモを残しておきます。リンクばかりですみません。

React.js Koansは問題を解く形式で進めていくReactの学習教材です。日本語でざっくりとした概要を知りたい方は以下の記事あたりを読むといいかと思います。

- [Reactに慣れるためにReact.js Koansってのをやってみました（React初心者向け）](http://qiita.com/morizotter/items/af65ec2bc50c2eb31e1e)

## 教材のインストール

```sh
$ git clone https://github.com/arkency/reactjs_koans.git
$ cd reactjs_koans
$ npm run setup
```

でセットアップをした後は、`npm run start`とか`npm run watch`などとして、後はブラウザとエディタを行き来しながら問題に答えていくだけなので楽です。

exercises内のファイルをいじっていきます。

## 学習メモ
### 01-HelloWorld.jsx

コメントアウトの説明を読むと、どうやらタグに気をつけて文章をちょこっと変えるだけということに気がつくはずです。

最初なんで初心者でも簡単ですね。仮に失敗したとしても、エラーメッセージがテストを動かした結果に出るので修正しやすいと思います。

### 02-PartiesList.jsx

`ul`内に`li`を追加してclassName部分を変えるだけです。

ここもまだ簡単ですね。

### 03-WhatsYourName.jsx

ちょっと長くなります。`State`について触れます。以降、大活躍する`setState`の初登場です。

コメントアウトにあるように、`console.log(event.target.value)`するとわかりやすいです。

自分は条件分岐の結果、勘違いして`"Hello Hey there. Enter your name."`のように表示していたので無駄に時間がかかりました…。

### 04-Quiz.jsx

クイズに答えるだけのチャプターです。ブラウザは使いません。

`true/false`で答える問題は適当に答えても50%の確率で正解しますが、ちゃんと考えて答えましょう。

個人的にこの`true/false`で答える系の問題が比較的難しかったです。わからなかったらきちんと前の１〜３に戻って説明を読むべきです。

### 05-Challenge-GroceryList-part-1.jsx

最初に

```js
// This exercise is a bit bigger than the previous ones.
```
とあるように、これまでに比べ量が増え、一気にReactっぽくなったような気がしました。

`this.props.hoge`といった部分を理解していないときつそうです。どことどこがつながっているか、よく確認しながらやりました。

### 05-Challenge-GroceryList-part-2.jsx

インプットフォームに文字を入力して追加、という機能を実装します。

自分は配列操作の部分で少し試行錯誤しましたが、慣れている人だと一瞬だと思います。

### 05-Challenge-GroceryList-part-3.jsx

追加したアイテムを全部消すボタンの実装。前回ができていれば瞬殺かと思います。

### 05-Challenge-GroceryList-part-4.jsx

追加したアイテムに対して、やった・やっていない（今回だと用意した・用意していない？になるのか）を切り替える機能を実装します。

![スクリーンショット 2016-03-01 0.53.14.png](https://qiita-image-store.s3.amazonaws.com/0/90682/4efd34f1-fb03-9df0-b12f-1885a8bb257e.png)

(アイテム自身をクリックすると切り替わります)

これも、前回のとかが出来ていれば楽勝・・・かと思ったのですが、自分は思いの外時間がかかってしまいました。。

最初、`map`とか使うのかな？と思ったのですが、よく考えたら切り替えたいアイテムに対して`groceryIndex`が用意されているので直接それだけ切り替えればOKでした。

ちょっと頭が硬かったです。

### 06-RenderComponent.jsx

`ReactElement`とか`ReactComponent`の説明。

今までは特に説明がなかった？ので、確認みたいなものだと思います。`build/index.html`とか見ると理解が深まる？かもしれません。

### 07-LifecycleMethods.js.jsx

ReactのLifecycleの話。正直あまり良くわかっていないため、今調べると

- [React.jsのComponent Lifecycle](http://qiita.com/koba04/items/66e9c5be8f2e31f28461)

がヒットしました。やはり[一人React.js Advent Calendar 2014](http://qiita.com/advent-calendar/2014/reactjs)はReact初心者にとっては神記事集っぽい。

問題自体は`console.log`を書くだけなのですぐ終わるでしょう。大切なのは上の記事にあるような説明を理解することだと思います。

## さいごに

これで一通り終了したわけですが、自分は`05-Challenge-GroceryList-part-4.jsx`の13行目以降にあるような

```js
// === Tasks below aren't required for proceeding in Koans, but we encourage you to try ===
```

には取り組んでおらず、テストが通ることだけ意識してやったので、今後暇な時にでも今回触れなかった部分を確認したいです。

Reactは（ほぼ英語教材だけど）学習資料が多いように思うため、今後も積極的にいろいろ試そうと思います。
YAMLとMarkdownではtrailing whitespaceをtrimしたくない

[参考](http://qiita.com/muyuu/items/658113b1b381f473a073)

指定したい拡張子のファイルを開いている時にメニューから
Sublime Text -> Preferences ▶ Settings - More ▶ Syntax Specific - User

Markdown.sublime-settings / YAML.sublime-settings

```json
{
  "trim_trailing_white_space_on_save": false
}
```

理由としては、Markdownで行末にスペース2つで改行するパターンがあるのと、YAMLはrailsのlocaleを自動生成するような仕組みを使っている時に、valueが無いkeyの行末がスペースになるので、それらが削除されるのを防ぐため
(gitはgitで設定とかaddの方法次第で行末のスペースを自動削除してしまうので注意が必要)
(メモ) Vagrant の ubuntu から Xming へ x forwarding する

windows 上で x forwarding をやったことなかった人が、 vagrant の中の ubuntu から x forwarding をしたときにやったことメモ

* Xming のインストール & 起動
* Vagrantfile に `config.ssh.forward_x11 = true`を記述して `vagrant up`
* PuTTY の起動時の config で、 SSH -> X11 -> enable x forwarding にチェック

この状態で

    sudo apt-get install x11-apps
    xeyes

とか実行すれば、 windows 上で目玉アプリが表示される。
Software Product Line(SPL) の用語集

# 用語集

| 英語 | 日本語 | 備考 |
|:-----------|:------------|:------------|
| Alternative | 排他的必須特性（XOrと同義） | フィーチャモデルの用語 |
| Artefact| 成果物 ||
| Basic configuration management | 基本構成管理 ||
| Baseline management | ベースライン管理 | コンポーネントの逐次管理 |
| Branch management | ブランチ管理 | ファイルの並行管理 |
| Branched baseline management | ブランチ・ベースライン管理 | コンポーネントの並行管理 |
| Branched composition management | ブランチ合成管理 | 製品の並行管理 |
| Component composition | コンポーネント合成 ||
| Component | コンポーネント ||
| Composition | 合成 ||
| Composition management | 合成管理 | 製品の逐次管理 |
| Context | コンテクスト | 製品の管理で用いられる手法 |
| Customization component management | カスタマイズ・コンポーネント管理 | 製品のドメイン空間管理 |
| Customization management | カスタマイズ管理 | コンポーネントのドメイン空間管理 |
| Domain space | ドメイン空間 ||
| Feature | フィーチャ ||
| Files | ファイル ||
| Mandatory | 必須特性 | フィーチャモデルの用語 |
| Mass Customization | 大量個別生産 ||
| Mutual Dependency | 相互依存関係 | フィーチャモデルの用語 |
| Mutual Exclusion | 相互排除関係 | フィーチャモデルの用語 |
| Optional | 選択特性 | フィーチャモデルの用語 |
| Optional Alternative | 排他的選択特性(Optional XOrと同義) | フィーチャモデルの用語 |
| Optional Or | 選択的選択特性 | フィーチャモデルの用語 |
| Optional XOr | 排他的選択特性(Optional Alternativeと同義) | フィーチャモデルの用語 |
| Or | 選択的必須特性 | フィーチャモデルの用語 |
| Parallel time | 並行 ||
| Portfolio management | ポートフォリオ管理 ||
| Product | 製品 ||
| Product family | 製品系列 | Product lineと同義 |
| Product line | 製品系列 | Product familyと同義 |
| Product management | 製品管理 ||
| Product portfolio| 製品ポートフォリオ ||
| Sequential time | 逐次 ||
| Shelf | 棚 | コンポーネント管理で用いられる手法 |
| Variation management | 可変管理 ||
| Version management | バージョン管理 | ファイルの逐次管理 |
| Variability | 可変性 ||
| Variant | 変異体 ||
| Variation point | 可変点 |  |
| Variation point management | 可変点管理 | ファイルのドメイン空間管理 |
| XOr | 排他的必須特性（Alternativeと同義） | フィーチャモデルの用語 |

# 参考文献
1. [Krueger, Charles W. "Variation Management for Software Production Lines," 37-48. Software Product Lines: Proceedings of the Second Software Product Line Conference (SPLC2). San Diego, CA, August 19-22, 2002. Berlin, Germany: Springer, 2002.](http://biglever.net/papers/Krueger_SPLC2.pdf)
2. [Klaus Pohl, Günter Böckle, Frank van der Linden, 林好一(訳), 吉村健太郎(訳), 今関剛(訳), ソフトウェアプロダクトラインエンジニアリング―ソフトウェア製品系列開発の基礎と概念から技法まで, 2009.](http://www.amazon.co.jp/gp/product/4434127063/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4434127063&linkCode=as2&tag=i0fe2-22)
3. [Kang, K.; Cohen, S.; Hess, J.; Nowak, W.; Peterson, S. (1990). Feature-Oriented Domain Analysis (FODA) Feasibility Study (PDF) (Report). Software Engineering Institute, Carnegie Mellon University. CMU/SEI-90-TR-21.](http://www.sei.cmu.edu/reports/90tr021.pdf)
Android Support Library 23.2のBottomSheetDialogの高さについて

# 最初に
ModalなBottomSheetsを実装するのに、サード・パーティのライブラリを使っていた。
先日のDroidKaigi2016で、Support LibraryにBottomSheetsが実装されると聞き、待っていたらすぐリリリースされた！
なので、さっそくライブラリを置き換えてみた。

# 問題発生
通常のDialogFragmentをBottomSheetDialogFragmentに変えて実装してみた。

```java
        @Override
        public void setupDialog(Dialog dialog, int style) {
            super.setupDialog(dialog, style);
            mContentView = View.inflate(getContext(), R.layout.dialog_content, null);
            dialog.setContentView(mContentView);
        }
```

そうすると、このようにDialogの中身が全部表示されない。。。
![Screenshot_20160301-001010.png](https://qiita-image-store.s3.amazonaws.com/0/62159/87f52aed-582c-f510-8a02-8dd4d77c416e.png)

# 問題解決
色々と試してみた結果、以下のように書くと中身が全部表示された。(∩´∀｀)∩ﾜｰｲ

```java
        @Override
        public void setupDialog(Dialog dialog, int style) {
            super.setupDialog(dialog, style);
            mContentView = View.inflate(getContext(), R.layout.dialog_content, null);
            dialog.setContentView(mContentView);

            mListener = new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    // BottomSheetの高さなどを設定
                    View parent = (View) mContentView.getParent();
                    BottomSheetBehavior behavior = BottomSheetBehavior.from(parent);
                    behavior.setPeekHeight(mContentView.getMeasuredHeight());
                    CoordinatorLayout.LayoutParams layoutParams =
                        (CoordinatorLayout.LayoutParams) ((View) mContentView.getParent()).getLayoutParams();
                    layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;

                    // OnGlobalLayoutListenerを外す
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        removeGlobalLayoutListener();
                    } else {
                        removeGlobalLayoutListenerCompat();
                    }
                }
            };
            mContentView.getViewTreeObserver().addOnGlobalLayoutListener(mListener);
        }
```

![Screenshot_20160301-001330.png](https://qiita-image-store.s3.amazonaws.com/0/62159/f10afa63-ff97-f924-38e4-20eccf542150.png)

***
サンプルのコードは、[GitHub](https://github.com/KohsakuOnozawa/BottomSheetDialogSample)で公開しています。
Linuxでまずしておきたいこと

#Linuxでまずしておきたいこと
Linuxを導入したときにまずしておきたいこと色々。

##SSHのポートを変更する
インターネットに繋がっているサーバでは繋いですぐに攻撃が来るので取り急ぎSSHのポートをデフォルトの22から変更する
※変更した場合、firewallも変更することを忘れずに。

```lang:/etc/ssh/sshd_config
#Port 22
Port 18022
```

`# /etc/init.d/sshd restart`

取り急ぎ、上記をやって鍵への認証などに変更すればよいと思う。
鍵認証のやり方などは
http://qiita.com/kite_999/items/aa03870eb071683a8feb


##historyの履歴数変更及びformat変更
historyはデフォルトだと1000行しか残らない＋日時が出ないのでこれを変更しておく。

下記のようにファイルを編集する

```lang:/etc/profile
HISTSIZE=1000

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
↓
#HISTSIZE=1000
HISTSIZE=100000
HISTTIMEFORMAT='%Y/%m/%d %H:%M:%S '

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL HISTTIMEFORMAT
```

反映
`# source /etc/profile`

##crontab -r が危険なので確認を求めるようにする
crontab -eとcrontab -rが近く、rは削除してしまうので
crontab実行時に確認を求めるように変更する。

下記のようにalias設定群の直下に追加する。

```lang:/root/.bashrc
alias crontab='crontab -i'
```

反映
`# source /root/.bashrc`

新たにユーザ作った時に反映されるように下記ファイルも変更しておきます。

```lang:/etc/skel/.bashrc
alias crontab='crontab -i'
```

##rootになれるユーザを限定する
suでrootになれるユーザを限定しておく
下記のように編集するとwheelグループに所属しているユーザのみsuでrootになれる。

```lang:/etc/pam.d/su
#auth           required        pam_wheel.so use_uid
↓
auth           required        pam_wheel.so use_uid
```

wheelグループに追加したい場合は下記のようにする
`# usermod -aG wheel hogeuser`

##自動起動を精査して止めておくこと
自動起動をとめるか、不要ソフトは削除しておく

##logの期間を調整する
syslogはデフォルトのままでは４週間しか残らないので3年間は残すようにする。
下記のように編集する。
月ごとのローテートで36カ月
ログの量によっては週ごとにしてローテート数を増やしてもよい。
compressを指定して古いものは圧縮をかけておく。

```lang:/etc/logrotate.conf
weekly
rotate 4
#compress
↓
#weekly
monthly
rotate 36
compress
```




以上
zabbixのインストールでつまづいた所のメモ

自分の忘備録として、zabbixのインストール時につまづいたところをメモ。

①phpの設定
zabbixインストール後、エラーが出た。
設定を見てみたら、timezoneの設定が空白だったので、timezone="Asia/Tokyo"とした。
まあ、php　timezoneみたいに検索すればすぐ出てくるかと。

②DB接続のPWがそもそも間違えていた
ケアレスミス。まぁ、技術的という部分での問題ではなかったけど、設定ファイルとかの確認はやろうな！という戒め。
ただ、zabbix自体にログインはできていたので、そもそも原因が特定しづらかった、ということだけ。

こういう使い方で良いのかな？
とりあえずzabbixは現在windowsに仕込んだAgentで監視中……。
もうちょっとNW全般を見るような設定を探せば捗りそう。
Go言語のスクレイピング系ライブラリまとめ

# Go言語のスクレイピング系ライブラリまとめ
Goでスクレイピングしようと思い、ライブラリを探していた際に行き当たったパッケージをまとめます。
調査段階なので一部しか利用はしておらず、実際の使い勝手等はわからないです。後々ピックアップして試していきますが、オススメがあればご意見ください！

# [scrape](https://github.com/yhat/scrape)
* `A simple, higher level interface for Go web scraping.`って。その物言い嫌いじゃない。
* 2015/06/25から更新されていないがStarは一番多い(2016/03/01現在)
* Find,Attr,Textがあるので王道的な感じがします
* [godoc](https://godoc.org/github.com/yhat/scrape)有り

# [goquery](https://github.com/PuerkitoBio/goquery)
* jQueryに近しい構文と使い勝手が実現できる
* net/htmlと[cascadia](https://github.com/andybalholm/cascadia)をつかっているみたいでJSerとしては相性が良さそう
* いろんなライブラリで使われているライブラリでした
* [godoc](https://godoc.org/github.com/PuerkitoBio/goquery)有り

#[go-metainspector](https://github.com/fern4lvarez/go-metainspector)
* 与えられたURLにアクセスしてmeta情報を取得するライブラリ
* URL、Scheme、Host、Root、Title、Language、Author、Description、Charset、Feed、Links、Images、Keywords、Compatibilityを取得する関数が用意されている
* CLIでも提供されているのでバッチ作る際に重宝しそう
* Webで[go-metainspectornのサンプル](http://gometainspector.cloudcontrolled.com/)が公開されているので簡単に利用イメージがつかめます
* [godoc](https://godoc.org/github.com/fern4lvarez/go-metainspector/metainspector)あり

## [Spider](https://github.com/celrenheit/spider)
* HTMLParserはgoqueryを利用しているが、スケジューラー機能が付いているのが特徴的
* 定期的に巡回する用途であれば使えそう
* [godoc](https://godoc.org/github.com/celrenheit/spider)有り

# [go-html-transform](https://bitbucket.org/zaphar/go-html-transform)
* [Extract links from a web page using Go lang](http://stackoverflow.com/questions/11080936/extract-links-from-a-web-page-using-go-lang)でメンテされているし良いよと紹介されてました
* BitBucketを見ると2015/12/08で更新が止まっている様子(2016/03/01現在)


## [dockerstats](https://github.com/remind101/dockerstats)
* Webスクレイピングではなく、Docker Stats API を利用してリソース情報の収集を行うライブラリ
* [cAdvisor](https://github.com/google/cadvisor)をものすごくシンプルにしたものと書いてありました


## [web-scraping-example](https://github.com/kyokomi/web-scraping-example)
* jsonでconfigを書いてそれを基に対象のページからgoqueryを内部で利用してパースして画像を取得するライブラリ
* READMEに書いてある情報は少ないですがものすごくシンプルですぐに使えそうです
* サンプルでラブライブの画像をスクレイピングしているあたりが日本人っぽくて親近感を覚えます

## [newsbot](https://github.com/alaska/newsbot)
* Goとgopherjsで書かれたライブラリらしくTwitterのフィード監視と抽出ができるらしい
* Webスクレイピングもできると書いてあったがリファレンスが見当たらず、わからなかったです

## [goatscrape](https://github.com/sewh/goatscrape)
* PythonのWebスクレイピングフレームワークのScrapyに触発されて作ったらしいGo言語製のWebスクレイピング、クローリングツールと書いてあるが、、、
* ToDoが多い
* `goatscrape is currently very alpha.`とか書いてある。実際、1年以上更新されていないので実利用はないですかね
iTunesConnectで「ビルド無効」と表示されたときの対処法

アプリを申請しようと思った時にはまったのでメモしようと思います。

いつも通りにxcodeで Arcive → Validate → Update という手順でアーカイブのアップロードを行い、iTunesConnectからビルドを選択して申請しようと思ったところ、

![スクリーンショット 2016-02-29 23.48.15.png](https://qiita-image-store.s3.amazonaws.com/0/78102/ee939f66-ab30-895e-9c41-dbc0a891ca43.png)

こんな表示が．．．．．．

いろいろ設定を見直してアップロードしなおしましたが、何度やってもビルドは無効になってしまう。

#原因
アップルからメールが届いていた。
>
Invalid Swift Support - The files libswiftContacts.dylib don’t match /Payload/support.app/Frameworks/libswiftContacts.dylib. Make sure the files are correct, rebuild your app, and resubmit it. Don’t apply post-processing to /Payload/support.app/Frameworks/libswiftContacts.dylib. 

調べてみると、どうやらCocoaPodsのバージョン0.39.0だとこのような事態が起きるようです。

#解決方法
１：xcodeでArchiveした後、OrganizerでArchiveを右クリック → show in finder の手順でFinderで表示する

２：Fiderで表示したら、右クリック → パッケージを開く でパッケージを開きます

３：  SwiftSupport/iphoneos/ ファイル内の libswiftXxx.dylibファイルをすべてコピーし、 Products/Applications/YourApp.ipa/Frameworks/ に貼り付け、上書きします。

４：ValidateしてUpload

#参照
https://github.com/CocoaPods/CocoaPods/issues/4188
Slackで特定の文字列に対してbotにEmojiリアクションさせる


# 概要
WEB+DB PRESS Vol.91のBotkit特集を読んだところ、Botkitを使うと特定の文字列に対してbotが絵文字でリアクションする「Emojiリアクション」が簡単に設定できるようなので試してみました。

# ビールが含まれる投稿に対して:beers:を付ける

開発環境の構築方法やbotのEmojiリアクションの設定方法等はWEB+DB PRESSの特集を読み参考にしました。

```javascript
import Botkit from 'botkit'

const ctrl = Botkit.slackbot({
  debug: false
});
const bot = ctrl.spawn({
  token: process.env.token
}).startRTM();

ctrl.hears(
  ['beer', 'ビール'], ['ambient'],
  (bot, message) => {
    bot.api.reactions.add({
      timestamp: message.ts,
      channel: message.channel,
      name: 'beers',
    }, (err, res) => {
      if (err) {
        bot.log("Failed to add emoji reaction", err);
      }
    });
  }
);
```

# 結果

![4f33031c6308420614c702ec8d4ab9aa.png](https://qiita-image-store.s3.amazonaws.com/0/43438/88ebbec5-6ad7-bfdc-9cfe-0a2fa76d6ac2.png "4f33031c6308420614c702ec8d4ab9aa.png")


Botkitおもしろい

# hears関数の第2引数について
WEB+DB PRESSのサンプルコードで紹介されているhears関数の第2引数へのbotに反応して欲しい呼びかけの種類の渡し方では上手く動きませんでした。[botkitのリポジトリ](https://github.com/howdyai/botkit)を参考に以下のように修正したところ上手く動きました。

```javascript:修正前
'direct_message, direct_mention, mention'
```

```javascript:修正後
['direct_message', 'direct_mention', 'mention']
```

# 参考
* http://gihyo.jp/magazine/wdpress/archive/2016/vol91
VimでSwiftのSyntax Highlight

## VimでSwiftの環境を整えたい

Swiftは良い言語ですよね。  
ただXcodeに依存しちゃってる感があるのが残念です。

やはりXcode userの98%くらいの人はVimでSwift書きたいんじゃないでしょうか。

というわけでVimでSwift環境をどうにかしたいと思います。  
どうにかできる保証はないです。

肝心の実行環境は`xcrun`が最初から使えるので何とかなります。  

## Syntax highlight

重要ですね。

swiftのsyntaxのpluginなのですが、githubにいろいろありました。

しかし、2.0以降に対応できていなかったりとアレだったのと、  

appleの[公式リポジトリ](https://github.com/apple/swift)にVimのftpluginがあったので、
そちらを使いたいと思います。

以下、NeoBundleの設定です。
余談ですがNeoBundleからdein.vimに乗り換えると闇の力を得られるそうです。

リポジトリを直接指定できないので、手動でディレクトリを掘りましょう。

簡単のため、こんな感じで

~~~sh
$ mkdir ~/.vim/bundle/manual
~~~

ディレクトリ名は何でも大丈夫です。

.vimrcに以下を記述します。

~~~vim
NeoBundle 'apple-swift', {'type': 'nosync', 'base': '~/.vim/bundle/manual'} 
~~~

今回は`apple-swift`にしてみました。ここは何でも大丈夫です。
`base`以下もお好みで大丈夫です。

`base`で指定したディレクトリに移動し、cloneします

~~~sh
$ cd ~/.vim/bundle/manual
$ git clone git@github.com:apple/swift.git apple-swift
~~~

結構時間かかります。  
終わったら以下のコマンドを打ちます。
swift.gitリポジトリからutils/vimだけ取り出します。

~~~sh
$ cd apple-swift
$ git filter-branch --subdirectory-filter utils/vim HEAD
~~~

これでSyntax highlightが動きます。

## 完成

こんな感じ
ソースはどっかからコピペしました

![swift-syntax.png](https://qiita-image-store.s3.amazonaws.com/0/99635/a6ad5305-cd22-88ab-ac15-c5c22e49546e.png)
kubernetesでjenkinsを立てる

kubernetesでwebサーバをたてて、kubernetesクラスタの外部からアクセスする方法。
webサーバとしてjenkinsをたててみた。

Replication Controllerのサンプル

```
apiVersion: v1
kind: ReplicationController
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      volumes:
        - name: jendata
          hostPath:
             path: /jenkins_home
      containers:
      - name: myjenkins
        image: jenkins
        ports:
        - containerPort: 8080
        volumeMounts:
        - mountPath: /var/jenkins_home
          name: jendata
```

selectorでapp:webと名付ける。また、containerPortは8080に。この辺の設定が後で効いてくる。コンテナイメージはjenkinsでpullする。
また、Replication ControllerでPodがリカバリされた際に、基本VolumeはPodに紐づくので、せっかくPodが復活しても設定が全てクリアになっていたらあまり意味がない。
そこで、Volumeをローカルホストに規定し、Podのライフサイクルに依存せずデータを保持する。

コンテナ内の/var/jenkins_home配下を、ホストの/jenkins_homeにマウントする。
この時、ホスト側のディレクトリにchmod 777しておくことを忘れずに。適切な権限がない場合、Podが正しく起動できず（マウントできず）、kubectl get podコマンドのstatusでCrashLoopBackOffとなってしまう。

RCを起動してみる

```
kubectl create -f rc.yaml
```

```
$ kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
jenkins-34f36          1/1       Running   0          45m
k8s-master-127.0.0.1   3/3       Running   0          3d
```

このままでは、起動したjenkinsはコンテナの外からはアクセスできない。コンテナと外部との接続を実現する方法がService。

Serviceのサンプル

```
{
    "kind": "Service",
    "apiVersion": "v1",
    "metadata": {
        "name": "my-service"
    },
    "spec": {
        "selector": {
            "app": "web"
        },
        "ports": [
            {
                "protocol": "TCP",
                "port": 80,
                "targetPort": 8080,
                "nodePort": 30000
            }
        ],
        "type" : "NodePort"
    }
}
```

selectorで先ほどのReplicationControlerと同じapp:webとする。selectorで両者の対応付けをしているらしい。

type:NodePortとすることで、ホストのIP(local/global)と、kubernetesのコンテナのIPとの紐付けがされる。
※Typeは他にLoadBalancerがあるが、利用可否はCloudサービスに依存するらしい。

ports内の各要素は次の通り
・port： ローカル(kubernetesの外)からPodへ接続用ポート
・targetPort: コンテナ（Pod）内の規定ポート
・NodePort: ホストを経由して外部からPodへの接続用ポート

例では、jenkinsのpodで8080を待ち受けポートにしていたので、targetPortを8080にする。
外部からホストIP(local/global)に30000ポートで接続すると、Pod内の8080ポートでjenkinsに接続される流れ。

80ポートは、kubectl get svcで取得できるIP宛にアクセスすると、80:8080に変換されてjenkinsに接続できる。

Serviceを起動する
※podやrcと同じ

```
kubectl create -f service.json
```

接続先を確認

```
$ kubectl get svc
NAME         LABELS       SELECTOR   IP(S)        PORT(S)
my-service   <none>       app=web    10.0.0.191   80/TCP
```

このIPが外部からの接続先。
kubernetesで付与される。

試しに接続

```
curl http://10.0.0.191:80
```

応答が返ってくる。

Global IPを持つ場合は、http://[global ip]:30000に接続すると、外部ホストからjenkinsにアクセスできる。

※Firewall（AWSならセキュリティポリシー）で該当ポートを許可する必要あり。


試しにkubectl stop pod [pod名]で起動中のjenkinsを停止させてみると、replication controllerですぐに新しいjenkinsが起動され、Volumeをホストに指定していると、設定情報も引き継がれることがわかる。


参考
http://kubernetes.io/v1.1/docs/user-guide/services.html
複数のファイルの中から特定の文字列を探す

ちょっと間があきましたが。

Linuxコマンドで複数のファイルの中から特定の文字列を探したいと思います。

ログファイルの中に「警告」という熟語が出力されているものを探すと。
ログファイルひとつひとつ確認していたこともあったんですがさすがに・・・と思いまして。

$ grep -l '警告' *　

で、そのディレクトリ内で"警告"という文字列を含むファイルをすべて
出力してくれます。
SlackクローンのMattermostをCentOS+MySQLで立ててみた

大人の事情でSlackは使えないので、
SlackのクローンであるMattermostでサーバを立ててみました。

いくつか他にもプロダクトはあるようでしたが、今回は以下の理由からMattermostを選定しています。
1. DBがMySQL or Postgresが使える
2. hubotプラグインが用意されている
3. 開発がまだ続いている

基本は[公式ドキュメント](http://docs.mattermost.com/install/prod-rhel-6.html)の通りなのですが、公式ドキュメントではPostgresを使っていたためMySQLを使って立てた時のメモとして残しておきます。

# 注意点
1. 手順を簡易的にするためあえてrootでインストールしています。
2. 1と同様の理由からパスワードの設定を省いてます。
3. OSはCentOS6.7を使っています。

# MySQL Setup
## MySQL Install
```
# OracleのMySQLレポジトリを導入
## http://dev.mysql.com/downloads/repo/yum/
rpm -ivh mysql57-community-release-el6-7.noarch.rpm

# このままだとMySQL5.7なのでレポジトリの向き先を修正
vim /etc/yum.repos.d/mysql-community.repo
  [mysql56-community]
  enabled=1

  [mysql57-community]
  enabled=0

yum clean all
yum install mysql-community-client mysql-community-server
service mysqld start
```

## MySQLにデータベースを作成
```
mysql -uroot
mysql > CREATE DATABASE mattermost;
mysql > GRANT ALL PRIVILEGES ON mattermost.* TO 'mmuser'@'localhost' IDENTIFIED BY 'mmuser_password' WITH GRANT OPTION;
```

# MatterMost Setup
```
wget https://github.com/mattermost/platform/releases/download/v2.0.0/mattermost.tar.gz
tar zxvf mattermost.tar.gz
mv mattermost /opt
mkdir -p /opt/mattermost/data
adduser mattermost
chown -R mattermost:mattermost /opt/mattermost
chmod -R g+w /opt/mattermost
vim /opt/mattermost/config/config.json
 34         "DataSource": "mmuser:mmuser_password@tcp(localhost:3306)/mattermost?charset=utf8mb4,utf8",
cd /opt/mattermost/bin
su mattermost
./platform
```

# Nginx Setup
```
vim /etc/yum.repos.d/nginx.repo
  [nginx]
  name=nginx repo
  baseurl=http://nginx.org/packages/rhel/6/$basearch/
  gpgcheck=0
  enabled=1

yum install nginx

vim /etc/nginx/conf.d/mattermost.conf
  server {
    server_name mattermost.example.com;
  
    location / {
       client_max_body_size 50M;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Frame-Options SAMEORIGIN;
       proxy_pass http://localhost:8065;
    }
  }

sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak

service nginx restart
```

# ログイン
http://サーバのIP
<img width="698" alt="スクリーンショット 2016-02-29 23.39.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/70732/57b6f7c1-cb4d-158d-2a19-06f046fd9583.png">

# hubot
[mattermostのhubot](https://www.npmjs.com/package/hubot-mattermost)もあるようですので、気になる方はご参考まで。

# 使い方
[こちらの記事](http://qiita.com/terukizm/items/4a4016d8ec5a21856e4f)に凄いわかりやすくまとめられてました！
ありがたや！
Mac版 Minecraft でバニラの texture を探す方法

# 環境

* Mac OS X Yosemite
* Java 1.8.0_25
* Eclipse Mars.1 Release (4.5.1)

# 手順

1. 探したいバージョン.jar を探す (例えば1.8.9)。場所は後述
2. `jar xf 探したいバージョン.jar` で解凍する
3. assets/minecraft/texture から該当するファイルを見つける

って感じです。

# jar の場所

例えば 1.8.9 ならば `~/Library/Application Support/minecraft/versions/1.8.9` の中に `1.8.9.jar` があるので、デスクトップなどにコピーします。

上記手順 2. の方法で解答する前にディレクトリを作っておいて解凍した方があわわわってならないで済みます。
MacでElastic Beanstalk + Multi Container Dockerの `eb local run` を動かす


追記: 2016-03-31 EB CLI 3.7.4で改善され、手元の環境(Docker 1.10.3)でも動作することが確認できました。
[Release: EB CLI 3.7.4 on 2016-03-22 : Release Notes : Amazon Web Services](https://aws.amazon.com/releasenotes/AWS-Elastic-Beanstalk/3603679041199514)

---


Elastic BeanstalkのEB CLIには、Multi Container Dockerのコンテナの場合、定義ファイル(`Dockerrun.aws.json`)を元にローカル環境でコンテナを実行できる`eb local run`という便利なコマンドがある。この使い方では、Docker Composeのようなもの、といった方がわかりやすいかもしれない。

*追記: Docker Composeのようなもの、というかDocker Composeだった。`eb local run` 実行後、`.elasticbeanstalk/docker-compose.yml`が生成されている。*

ただし、現時点(2016/02/29)でbrewでインストールできる最新バージョンは1.10.2だが、EB CLIで必要としているバージョンは1.6.0なので、単純に動かそうと思っても動かない。

動かすためにちょっと苦労したので、手順をメモする。

## 環境

* OS X EL Capitan Version 10.11.3
* EB CLI 3.7.3 (Python 2.7.1)
* docker-machine version 0.6.0, build e27fb87
* VirtualBox 5.0.6 r103037

## 現象

Docker1.10.2で該当コマンドを実行するとエラーが発生する。

```
$ eb init
$ eb local run
ERROR: You must install Docker version 1.6.0 to continue. If you are using Mac OS X, ensure you have boot2docker version 1.6.0. Currently, "eb local" does not support Windows.
```

## 手順

### Docker1.6.0をインストール

`~/bin` にパスが通って無ければ通す。

```
$ echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile
$ source ~/.bash_profile
```

brewでDockerをインストールしている場合はアンリンク。

```
$ brew unlink docker
```

Docker1.6.0をインストール。

```
$ mkdir -p ~/bin && cd ~/bin
$ curl -LO https://get.docker.com/builds/Darwin/x86_64/docker-1.6.0
$ chmod +x docker-1.6.0
$ ln -s docker-1.6.0 docker
$ docker --version
Docker version 1.6.0, build 4749651
```

### Docker Machine上でDocker1.6.0をインストール

DockerとDocker Machine上のDockerは同じバージョンである必要があるので、対応するboot2dockerでイメージを作成。

```
$ docker-machine create -d virtualbox \
  --virtualbox-boot2docker-url https://github.com/tianon/boot2docker-legacy/releases/download/v1.6.0-rc7/boot2docker.iso \
  b2d-160
$ eval $(docker-machine env b2d-160)
```

### 動作確認

公式デモのNginx+PHP-FPMを使うのでGitHubからClone。

```
$ git clone git@github.com:awslabs/eb-docker-nginx-proxy.git
$ cd eb-docker-nginx-proxy
```

本記事の目的のコマンドを実行。

```
$ eb local run
...
Attaching to elasticbeanstalk_phpapp_1, elasticbeanstalk_nginxproxy_1
phpapp_1     | [29-Feb-2016 13:49:39] NOTICE: fpm is running, pid 1
phpapp_1     | [29-Feb-2016 13:49:39] NOTICE: ready to handle connections
```

Nginx+PHP-FPMが動作していることを確認。

```
$ curl -i http://$(docker-machine ip b2d-160)
HTTP/1.1 200 OK
Server: nginx/1.9.11
Date: Mon, 29 Feb 2016 13:50:28 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.0.3

<h1>Hello World!!!</h1>
<h3>PHP Version 7.0.3</h3>
<a href="/static.html">Static HTML Page</a>%
```

## HomeBrewでインストールしたバージョンに戻したい場合

再度リンクを張ればOK。~/.binの方が優先度低いので、brewでインストールしたバージョンになる。

```
$ brew link docker
Linking /usr/local/Cellar/docker/1.10.2... 4 symlinks created
$ docker --version
Docker version 1.10.2, build c3959b1
```

## 苦労の軌跡

* homebrew/versionsにhomebrew/versions/docker162があったが試す前に`brew install`に失敗
* [dvm](https://github.com/getcarina/dvm)というDocker Version管理ツールを見つけたが1.6.0はインストールできない

## 最後に

ElasticBeanstalkのPrivate Registryの認証もDocker1.6なので、その辺りが関係していると思われる。`eb local run`はすごく便利なのでもう少し簡単に動くようになれば、と思う。
コンパイルとビルドとメイクの違い

#コンパイルとビルドとメイクの違い
>
**コンパイルとは**
\*.cpp ファイルなどテキスト形式で書かれたプログラムソースを中間ファイル\*.objに変換すること。この時点で概ね機械語に翻訳されている。
**ビルドとは**
コンパイル＋リンク。複数の中間ファイルから実行ファイルを作り上げること。
**メイクとは**
コンパイルの対象となるファイル、ビルドの対象となるファイルに関する情報を一ファイルとして保存しておき、これに基づいてコンパイル、ビルドを効率的に行なうシステム。更新されたファイルがあればそれだけを対象にコンパイル、ビルドを実行するので、時間を無駄にすることがない。

#参考文献
>
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q126988002
mac os x 10.9 にfinkをinstallしてapt-get使えるようにする

mac環境にapt-getであるモジュールをインストールしたくなった。
ただ、mac上ではデフォルトではapt-getが入っていないため、そのインストール方法を書いて行きたい。

#環境
mac os x 10.9

#手順
macに「fink」をインストールする事でapt-getを利用する事が出来るようだ。

○ダウンロード
http://www.finkproject.org/download/srcdist.php
こちらから、自分のmacバージョンのリンクをクリックする。
今回はOS X 10.9-10.11のリンク → fink → 0.39.2 → fink-0.39.2.tar.gzをダウンロード



○インストール
`cd ~/Downloads/fink-0.39.2 `
`./bootstrap`


色々聞かれるが基本的にデフォルトで問題ない。
結構時間かかります。


○finkをpath登録
`/sw/bin/pathsetup.sh`

以上でfinkの環境は構築された。
ターミナルを再起動したら、apt-getを叩いてみましょう！

#おまけ
○finkのアップデートとかしてくれる
`fink selfupdate-rsync`
ansibleでnginx入れてみる

#### 個人的メモなので、あまり期待はしないでください。

- まず手始めにSElinuxをヤる
   - 毎度のことながらselinuxが邪魔をするので息の根を止める
- 以下適当なところにファイル作ってください。

```
# selinux_kill.yml
---
  - name: Install libselinux-python
    sudo: true
    yum: name=libselinux-python state=installed

  - name: disable SELinux
    sudo: true
    selinux: state=disabled
```

- ansibleのファイル構成

```
ansible/
  inventory/
    local
  roles/
    nginx/
      tasks/
        main.yml
        selinux_kill.yml
      template/
        default.conf.j2
  local.yml
```

上記の感じでselinuxをヤれば、多分他のサイト参考にnginxが入るはず。

#### ansibleを使用しての感想

- 見やすい
- 理解すれば管理も楽？
- chefと比べると・・・どうだろ？

##### 参考

- [備忘録](http://gyagya1111.blogspot.jp/2015/02/ansibleselinuxoff.html)
Android標準のFragmentよりsupport.v4.app.Fragmentを使うべき、という理由を徹底調査[随時更新]

2/19のDroidKaigi2016の基調講演で「Android標準のFragmentよりsupport.v4.app.Fragmentを使うようにしましょう」というGoogleの中の人からのお触れが出たのですが、その理由を徹底的に自分が納得するまで探ろうかなという趣旨でこの記事をアップします。

主な理由は以下の２つです。

- 「標準版Fragmentで残っている不具合がSupportLibrary版では治っているため」
- 「OSのバージョンによる振る舞いの違いをなくすため」

具体的にどんな不具合か？どのような振る舞いの違いを吸収したのか？という疑問が残って調べてみましたのに私がわかった範囲で記載していきます。

「わかった範囲で」とは書きましたが現在私も完璧には追いかけれられていません。要所要所でわかってきたら随時更新していきます。（こういう事実があるよ！的な編集リクエストは大歓迎です!）

# 「標準版Fragmentで残っている不具合がSupportLibrary版では治っているため」
## Android Support Library rev9(2012/6月発表)で発覚・修正された不具合
http://developer.android.com/intl/ja/tools/support-library/index.html#revisions
によると…

>Fixed many bugs for Fragment, including proper handling of onActivityResult() when the target fragment no longer exists, dispatching selection events to invisible fragments, improved FragmentTransaction.replace() behavior and added better state handling for fragments being moved out of view.

らしい。。


## Android Support Library rev23.0.1(2015/9月発表)で発覚・修正された不具合

>Changes for v7 appcompat library:
>
>Fixed crash issues for the Fragment class by limiting the use of hardware layers to Android 4.1 (API level 16) and higher. ([Issue183896](https://code.google.com/p/android/issues/detail?id=183896))

# 「OSのバージョンによる振る舞いの違いをなくすため」

ちょっと調べてみます。。。
Laravel で掲示板作りたくなった

僕も[インスパイヤ](http://qiita.com/tadsan/items/cdbbb5b08591af2b110d)されたので掲示板作ってみる。[Laravel](https://laravel.com/) で同じものを作るよ。

# PHP を入れる

[元記事](http://qiita.com/tadsan/items/cdbbb5b08591af2b110d) にそってよしなにやって下さい。Laravel には [Homestead](http://readouble.com/laravel/5/1/ja/homestead.html) っていう開発に便利な Vagrant box があるよ。もちろん PHP7 だよ。

今回は最小構成ということで

- ビルトインウェブサーバ
- SQLite
- パッケージ名: `localdisk/inspire-bbs`
- 名前空間: `InspireBBS`

で、やります。

# Composerを入れる

これもまぁよしなに。

# Laravel をインストールする

今回は LTS である 5.1 を使います。

```shell-session
$ composer create-project laravel/laravel inspire-bbs-laravel "5.1.*"
```

# 名前空間を変える

Laravel はデフォルトでは `App` という名前空間なんだけど、今回は `InspireBBS` にするのでコマンドで名前空間を設定するよ。

```shell-session
$ php artisan app:name InspireBBS
```

これでOK. `composer.json` とかデフォルトで用意されているクラスの名前空間が設定されているのがわかると思います。確認してみてね。

# データベースを用意する

Laravel は色んなDBに対応してて、もちろん SQLite も使える。接続等の設定は `.env` ファイルに1行足せばOK。

```text:.env
DB_CONNECTION=sqlite
```

んで、データベースとなるファイルを作成します。

```shell-session
$ touch storage/database.sqlite
```

できた。

# サーバーを起動します

```shell-session
$ php artisan serve
Laravel development server started on http://localhost:8000/
```

とするとビルトインウェブサーバが起動する。`http://localhost:8000/` にアクセスしてみよう。
ブラウザに `Laravel 5` と表示されればOK!

続きは次回! [本家](http://qiita.com/tadsan/items/cdbbb5b08591af2b110d) となるべく同じように作っていくよ。

https://github.com/localdisk/inspire-bbs

Partごとに tag をうっていくので後から辿りやすいと思います。

では、おやすみなさい。

続きを書いたよ。[Laravel で掲示板作りたくなった(2) - Qiita](http://qiita.com/localdisk/items/10f209252114b1a8b86d)

つづきのつづき。[Laravel で掲示板作りたくなった(3) - Qiita](http://qiita.com/localdisk/items/d62327d064970635fcdd)
6日目 => デザインパターン（シングルトンパターン）

# はじめに
次はシングルトン。

# 説明
## シングルトンパターン
作成されるクラスのインスタンスが１つのオブジェクトに制限。
JavaScriptのシングルトンは関数へのアクセスポイントをただ１つ提供。

```js
var singleton = (function(){
  // シングルトンへの参照保持
  var instance;

  function init(){
    // プライベートメソッド
    function introduction(){
      console.log("I am John.");
    }

    // プライベート変数
    var age = 28;

    return {
      // パブリックメソッド
      publicIntroduction: function(){
        console.log("John is " + age + "years old.");
      },

      // パブリック変数
      publicAge: 18
    }
  };

  return {
    // インスタンスが存在するかのチェックと
    // 存在しなかった場合の作成処理
    getInstance: function(){
      if(!instance){
        instance = init();
      }

      return instance;
    }
  }
}());


var singletonA = singleton.getInstance();
var singletonB = singleton.getInstance();

console.log(singletonA === singletonB ? "２つは同じインスタンス" : "別物");
// ２つは同じインスタンス
```

# 参考
* JavaScriptデザインパターン
Adodb.Stream

職場で簡単なスクリプトを作るときに、意外とインストールとかしない縛りだと厳しいこともあるので、JScriptチート用。ファイルの読み書き用。

TypeScriptのPlaygroundにまるっとコピペするとコーディングがしやすい。

そしてこんなん用意するぐらいならpowershell_ise使ったほうが捗るのではと気づく。


``` stream.ts
namespace Adodb {

// https://msdn.microsoft.com/ja-jp/library/cc389884.aspx
export const enum StreamTypeEnum {
  adTypeBinary = 1,
  adTypeText = 2
}

// http://msdn.microsoft.com/ja-jp/library/cc389881.aspx
export const enum StreamReadEnum {
  adReadAll = -1,
  adReadLine = -2
}

// http://msdn.microsoft.com/ja-jp/library/cc389886.aspx
export const enum StreamWriteEnum {
  adWriteChar = 0,
  adWriteLine = 1
}

// http://msdn.microsoft.com/ja-jp/library/cc389870.aspx
export const enum SaveOptionEnum {
  adSaveCreateNotExist = 1,
  adSaveCreateOverWrite = 2
}

// https://msdn.microsoft.com/ja-jp/library/cc389826.aspx
export const enum LineSeparatorsEnum {
  adCR = 13,
  adCRLF = -1,
  adLF = 10
}

// https://msdn.microsoft.com/ja-jp/library/cc389847.aspx
export const enum ObjectStateEnum {
  adStateClosed = 0,
  adStateOpen = 1,
  adStateConnecting = 2,
  adStateExecuting = 4,
  adStateFetching = 8  
}

// https://msdn.microsoft.com/ja-jp/library/cc389773.aspx
export const enum ConnectModeEnum {
  adModeRead = 1,
  adModeReadWrite = 3,
  adModeRecursive = 0x400000,
  adModeShareDenyNone = 16,
  adModeShareDenyRead = 4,
  adModeShareDenyWrite = 8,
  adModeShareExclusive = 12,
  adModeUnknown = 0,
  adModeWrite = 2
}

// https://msdn.microsoft.com/ja-jp/library/cc364272.aspx
export interface Stream {
	Open() : void;
	Close(): void;
	Write(data: any): void;
	WriteText(data: string, option: StreamWriteEnum): void;
	Read(read?: StreamReadEnum): any;
	ReadText(read?: StreamReadEnum): string;
	Flush(): void;
	CopyTo(destStream: Stream, numChars?: number): void;
	SkipLine(): void;
	LineSeparator: LineSeparatorsEnum;
	EOS: boolean;
	SetEOS(eos: boolean): void;
	SaveToFile(fileName: string, saveOptions: SaveOptionEnum): void;
	LoadFromFile(fileName: string): void;
	Charset: string;
	Cancel(): void;
	Size: number;
	Position: number;
	Type: StreamTypeEnum;
	State: ObjectStateEnum;
	Mode: ConnectModeEnum;
}

/**
 * @return adodb.stream
 */
export function CreateStream() {
  return <Adodb.Stream>new ActiveXObject("ADODB.Stream");
}

} // Adodb
```
サーバサイドRubyの環境（再）構築を高速化する、たった１つの設定

# TL;DR
環境変数を`BUNDLE_JOBS=4`と設定する（※最適な値は環境によって変化します）

# 重たいBundler
EBやHerokuなど、PaaS型のサービスもいろいろあって、Rubyを動かす環境も整っています。そして、Rubyで動くものを作る上で、多数のGemが必要となりますが、その利用にBundlerも欠かせないものとなっています。

ただ、特に新規インストール時には、Bundlerは

* Gemのメタデータの取得
* 依存関係の解決
* Gemのダウンロード、展開しての配置
* ネイティブエクステンションのコンパイル

と、いろんな作業をすべてのGemに対してこなさなければなりません。ローカル環境では新規でということが稀にしかないのでどうということもないのですが、とりわけオートスケールが必要になるような環境だと、スケールで増えた分に対しては新規インストールになってしまうので、Bundlerの間は戦列にも加われない時間となってしまいます。

# 並列Bundler
最初の依存関係解決はともかく、それが済んでしまえば1つ1つのGemのインストールの間に依存関係は発生しないので、並列してインストールを行っても特に問題はありません。インストールには通信待ちの時間も多いので、並列化で時間削減ができます。

[Bundlerには実際にそんな機能が用意してあって](http://qiita.com/camelmasa/items/5ca27ab398f105f86c76)、`bundle`コマンドへの引数、あるいは`bundle config`で設定することができます。

# PaaSとの相性
ところが、最初からRuby環境が用意してある、ということはBundlerまで自動で回してくれる環境、ということになります。そうなると、引数を付けたりということは逆に面倒になってしまいます。

どうしたものだろうと調べていると、なんと並列実行の設定は、`BUNDLE_JOBS`という環境変数でできることが判明しました。環境変数で挙動設定というのは定番中の定番なので、これで悩むことなく設定可能です。

手元のRails 4.2 プロジェクト（AWS EB、Gemは合計160個程度）で試してみたところ、標準で3分半程度かかっていた`bundle install`が、4並列で2分半と、1分短縮できました。

# 並列実行の問題点
Windowsでは、[マルチスレッドでOpenSSLを使うとうまく動かないRuby側のバグ](https://bugs.ruby-lang.org/issues/11033)があって、並列でやるとうまく行きません（HTTPSを使わないようにすれば通るかもしれませんが）。

# 挙動の確認
[Bundlerのソースを追いかけてみた](https://github.com/bundler/bundler/blob/7db169c6acd43abe57db66c80227ea3892abe703/lib/bundler/worker.rb)ところ、並列実行はRubyの`Thread`で行なっていることがわかりました。CRubyの場合、GVL（Ruby全体にかかるロック）があるので、I/O待ち以外のスレッドが同時に動くことはないのですが、通信や他のプロセス待ちが多いという性格を踏まえればこれで必要十分な気もしました。
SublimeText3 で Haskell (Stack) を書くための環境構築 (Mac OS X)

## 概要

SublimeText3 (以下、ST3) で Haskell を書くために必要な環境構築の手順をまとめました。
主に SublimeHaskell, SublimeREPL というプラグインを使います。
ST3 や Haskell, Stack の操作方法の詳細は他の記事などを参照してください。
本記事は Mac OS X での動作を想定しています。

## 出来ること

* stack build がファイル保存ごとに自動実行できる
* stack repl を SublimeText 上で実行できる

## 事前準備

実行環境にHomeBrew がインストールされているものとします。

* Haskell-Stack のインストール  
`brew install haskell-stack`
* Sublime Text 3 のインストール  
`brew cask install sublime-text3`

## セットアップ

1. stack の初期セットアップを実施する  
`cd && stack setup`
2. モジュール依存関係のファイルを差し替える  
`~/.stack/global-project/stack.yaml`
を以下の内容で差し替える。  
`https://gist.github.com/algas/7c4f3997b84880d0d92d
3. 依存関係をインストールする  
`cd && stack install hsdev stylish-haskell ghc-mod haskell-docs hdevtools`
4. ST3 に PackageControl をインストールする  
`https://packagecontrol.io/installation`
5. ST3 に SublimeHaskell をインストールする
`https://github.com/SublimeHaskell/SublimeHaskell`
6. ST3 で SublimeHaskell の環境を設定する  
`Preferences`>`Package Settings`>`SublimeHaskell`>`Settings - User`  
`https://gist.github.com/algas/3f2a269a059d1b8af785`
7. ST3 で SublimeREPL の環境を設定する  
http://qiita.com/ryo0ka/items/ecda1f5d6dc36853d7f7

## 使い方
1. Stack プロジェクトを作成する  
`stack new myproject`
2. 作成したプロジェクトディレクトリを ST3 で開く  
`File`>`Open`>`"/path/to/myproject"`
3. プロジェクトを作成する
`Project`>`Save Project As...`
`/path/to/myproject/myproject.sublime-project`
4. コードを書いて保存(`Command+S`)する  
ファイル保存のたびに自動でビルドが実行される。

## 注意事項
* SublimeText, SublimeHaskell のバージョンアップで上記のとおりに設定しても正常に動作しない可能性があります。
* Mac OS X 以外の環境では、設定やインストール方法をそれぞれの環境に合わせる必要があります。

## ソフトウェアのバージョン
* Mac OS X El Capitan:  10.11.3
* Sublime Text 3: 3103
* SublimeHaskell: v2016.02.18.18.13.17
* SublimeREPL: v2.1.2
【メモ】Cloud9にてHeroku用にRubyのバージョンを切り替えた際の注意点(2016年2月)

# 注意
下記の方法でいったんは解決？したように見えたのですが、後日またCloud9を開いたら、結局「Run Project」からはサーバー起動できなくなりました。（Ruby versionは2.2.4、rvmの警告文はでない）  
よってあくまで参考程度にしていただければと思います。  
（やっぱりRunnerをカスタマイズしないといけないのかな・・・）

----------


以前このような記事を書いたのですが

<a href="http://qiita.com/noriyotcp/items/26165a556f96a5e844fe" target="_blank">【メモ】Cloud9からHerokuにRailsプロジェクトをデプロイする際の注意点(2015年10月)</a>

今回別のプロジェクトを作った際にまた問題が起こりました。

-----
Herokuが対応しているバージョンが2.2.4になったようなので、前回と同じように2.2.4に切り替えることにしました。

## （まだ入れていなければ）rvmで2.2.4のインストール

```bash
rvm install 2.2.4
gem install bundler
bundle install # or bundle install --without production
# 今回はrvm --default use 2.2.4は行わない
```

## GemfileにRuby versionを記述
```rb
source 'https://rubygems.org'

ruby '2.2.4'
```
## .bashrcに記述
```bash
$ cd ~
$ pwd
/home/ubuntu
$ vi .bashrc
```
.bashrcの一番最後に
``rvm use 2.2.4``と追記します。  
これで新しいターミナルを開いた時でも、``2.2.4``になってくれるようにしました。
**だがしかし**

# Run Projectを押すと問題が起こる
Cloud9のIDE上部の「Run Project」ボタンを押すと
``Your Ruby version is 2.3.0, but your Gemfile specified 2.2.4``  
とのエラーメッセージが出て、サーバー起動しません。ターミナルとcloud9のRunnerが連動しないようです。  
コマンドラインから打つの面倒なのでなんとかしたいのですが、そのためにはRunnerをカスタマイズしなければいけないようで、もうわけわからんw

# 原因は``rvm rvmrc warning ignore /home/ubuntu/workspace/Gemfile``?
Ruby versionを2.2.4にした時から、このような警告がでるようになりました。 
 
```bash
RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too,
you can ignore these warnings with 'rvm rvmrc warning ignore /home/ubuntu/workspace/Gemfile'.
To ignore the warning for all files run 'rvm rvmrc warning ignore allGemfiles'.
```

前回は出ていたかどうか覚えていませんが、毎回目にするのもうざいので、``rvm rvmrc warning ignore /home/ubuntu/workspace/Gemfile``をやってしまったんですな・・・。

## 結論：``rvm rvmrc warning ignore /home/ubuntu/workspace/Gemfile``をしない。  
どーにもならないので、いったんプロジェクトを破棄し、新規作成する際にBitbucketからクローンしてくることにしました（作っておいてよかった）  
そしてまた上記の作業をし、最後に``rvm rvmrc warning ignore /home/ubuntu/workspace/Gemfile``を**行わない**・・・と、無事にRun Projectボタンからサーバー起動させることができました。  
毎回警告文が出ますが、**目に入っても脳には入らない**くらいに慣れるしかありません。

-----  
結局どうなっているのかというと  

```bash
$ rvm list

rvm rubies

   ruby-1.9.3-p551 [ x86_64 ]
   ruby-2.1.5 [ x86_64 ]
=> ruby-2.2.4 [ x86_64 ]
 * ruby-2.3.0 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
```

前回とは少し違い、``default``は``2.3.0``だが``current``は``2.2.4``というふうになっております。