OmniAICreator/Qiita-1.07M huggingface dataset:
nginxで特定のIPからは公開したいけどそれ以外はBASIC認証にしたいときの設定



> 本件、件名の件名の対応をやろうとググったら
> 昔自分が書いた（2013/02/21）会社のブログが出てて（記憶力のなさにビビった）
> だけど該当ページがなくなっててｗ
> キャッシュからからQiitaに再掲

やりたいことを端的にいうと
外部にあるテストサーバーとかで
社内からはアクセスは無条件で公開したいけど
それ以外のアクセスはBASIC認証にしたい場合の設定です
(社内だけじゃなく、外部からもチェックしなきゃいけない場合とか)

いきなり設定どーん

```
location / {
    satisfy any;
    allow 123.123.123.123;
    deny all;
 
    auth_basic  "basic authentication";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
```

きもは***satisfy any;***
これが無いと　指定IP and Basic認証で許可になるけど
指定していると　指定IP or Basic認証になりんす
複数IPの場合は

```
location / {
    satisfy any;
    allow 123.123.123.123;
    allow 111.111.111.111;
    deny all;
 
    auth_basic  "basic authentication";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
```

でOKよ

.htpasswdの設定とかは割愛

ではまた
NGINX Amplify (beta) を入れて見た

## まじで入れてみただけのネタですが

まだベータです。Nginxの監視モニタリングのSaaS的なサービスのようです。

URLにあるリクエストを送る。

https://www.nginx.com/amplify/

送ったら半日くらいでメールが来ます。招待コードでURLアクセスします。
それとは別にamplifyのエージェントイスト手順もメールにあります。APIコードを入れてインストシェルをcurlごしに叩きます。簡単です。<br>
こんな感じで↓

```
：
：
インストール:
  nginx-amplify-agent.x86_64 0:0.32-1.el6

完了しました!

 8. Installing package ... done.
 9. Building configuration file ... done.

 OK, it looks like everything is ready.

 To start and stop the agent type:

     # service amplify-agent start
     # service amplify-agent stop

 Agent logs can be found in:
     /var/log/amplify-agent/agent.log

 Please find the documentation here:
     https://github.com/nginxinc/nginx-amplify-doc

 After the agent is launched, it might take up to 1 minute
 for this system to appear in the Amplify user interface.

 Launching amplify-agent ...
 All done.

```

しばらくすると招待コードでアクセスしておいたWebページ側に情報が入って来ます。<br>

![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/27932/cf34e93b-dcfc-6c7d-df10-beb10b672c24.png)


dev-uehara01って名前のサーバーにNginx1.8入れてます。<br>
もっと取得メトリクス増やすために設定入れる必要がありますがドキュメント見ながらやってみます。(デフォ設定なう)

https://github.com/nginxinc/nginx-amplify-doc

## Alert

取得メトリクスベースでアラート設定もできます。インターバルの最小値は2mですね。
こんな感じ↓

![クリップボード02.png](https://qiita-image-store.s3.amazonaws.com/0/27932/86d50199-cf34-6885-7c80-85b2ce280c5f.png)

## あとは

ReportとEventがメニューにありますね。まだ出せてないですがどんな感じか確認してみたいと思います。

では！((((((((((っ･ω･)っ ﾌﾞｰﾝ
WKWebView で表示する アニメーションgif がスムーズに動かない

先日、アプリ内の UIWebView を WKWebView　に変更した時に アニメーションgif がスムーズに動かなかったり、
スクロールがうまく動かなかったりという症状が発生しました。

結論を言ってしまうと、

```objc
// StoryBoardで設定してもOK
self.navigationController.navigationBar.translucent = NO;
```

としたら問題なく動くようになりました。
なんか腑に落ちませんがおそらくバグですね。。

ちなみに背景を画像にしても動きました。

```objc
// この場合は透明な画像を設定している
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
```

WKWebView の設定で直るよーとかあったら教えていただきたいです。

## WebView内の埋め込み動画を再生するとアプリが固まる

これは別の話になってしまいますが、WebView内の埋め込み動画を再生するとカクついてまともに視聴することができず、アプリが固まってしまう問題も発生しました。調査した結果、スライドメニューに使っていた **iOS-Slide-Menu** というライブラリが原因でした。具体的にこのライブラリの何が原因で起こったのかはわかりませんが外したら直りました。

もしかしたらアニメーションgifがスムーズに動かないというのもこれが原因だったんではないかと思い、ここに追記した次第ですが、皆さんも実は **iOS-Slide-Menu** を使っていませんか？
c++ builder XE4, 10.2 Tokyo > 浮動小数の小数桁を自動削除 > 値3.14を"3.14000"でなく"3.14"とする

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

ある値を文字列変換するとき、小数桁の余分な0をとりたい場合がある。

2.71821は"2.71821"として表示し、("3.14000"でなく)3.14は"3.14"としたい。

FormatFloat()を使えばできそうだ。

参考http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/faq/00149.htm


```Unit1.cpp
double val = 3.14;
String msg;

msg = String().sprintf(L"%lf", val);
ShowMessage(msg);

msg = FormatFloat(L"0.######", val);
ShowMessage(msg);
```

(追記 2018/08/01)
上記において書式指定子`%lf`を使っているが、`%f`が正しいかもしれない。

- 関連情報
    - [printf() に float/double を渡したときの挙動と %lf の意義](https://qiita.com/lo48576/items/9901f7d52692567b931c)
    - [C/C++ printfの%lfはdouble(倍精度浮動小数点)をフル桁で表示してくれない](https://qiita.com/Urushibara01/items/081542c6fd44bbdbee0a)
    - [[迷信] double の出力書式は "%lf"](http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html)


<hr>
2つの変数に対して文字列にするには

```
double d1 = 3.14;
double d2 = 2.7182818;

String str = FormatFloat(L"0.#####", d1) + L"," + FormatFloat(L"0.#####", d2);
ShowMessage(str);
```

もっと簡易的な書き方があるかもしれない。
Rails rails generateコマンドの主な動作オプション


railsの初学者なので、メモを残していきます。
ベテランの方々には申し訳ないくらい初歩的ですが、ご容赦ください！

#Rails rails generateコマンドの主な動作オプション


|分類|オプション|概要|
|:--:|:--:|:--:|:--:|
|基本|-f, --force|ファイルが存在する場合に上書き|
|基本|-p, --pretend|実際にはファイルを作成しない、試験的な実行|
|基本|-q, --quiet|進捗状況を表示しない|
|基本|-s, --skip|同名のファイルが存在する場合はスキップ|
|コントローラー|--asset|アセットを生成するか|
|コントローラー|-e, [--template-engine=NAME]|使用するテンプレートエンジン|
|コントローラー|-t, --test-framework=NAME|使用するテストフレームワーク|
|コントローラー|--helper|ヘルパーを作成するか|
|モデル|--indexes|外部キー列にインデックスを付与するか|
|モデル|-o, --orm=NAME|使用するO/Rマッパー|
|モデル|--migration|マイグレーションファイルを生成するか|
|モデル|--timestamps|タイムスタンプ列を生成するか|
|モデル|-t, --test-framework=NAME|使用するテストフレームワーク|
|モデル|--fixture|フィクスチャを生成するか|



###参考
Ruby on Rails4 アプリケーションプログラミング

###追記:英単語アプリmikanのAndroidでのβ配布始めました。
[mikan Android β配信](https://goo.gl/sqs5ZL)
フィードバックお待ちしております。
rails database.ymlで利用できる主な接続パラメーター


railsの初学者なので、メモを残していきます。
ベテランの方々には申し訳ないくらい初歩的ですが、ご容赦ください！

#database.ymlでの主なパラメーター

|パラメーター|概要|
|:--:|:--:|
|adapter|接続するデーターベースの種類|
|database|データベース名|
|host|ホスト名・IPアドレス|
|port|ポート番号|
|pool|確保する接続プール|
|timeout|接続のタイムアウト時間(ミリ秒)|
|encoding|使用する文字コード|
|username|ユーザー名|
|password||パスワード
|socket|ソケット|


###参考
Ruby on Rails4 アプリケーションプログラミング

###追記:英単語アプリmikanのAndroidでのβ配布始めました。
[mikan Android β配信](https://goo.gl/sqs5ZL)
フィードバックお待ちしております。
パRailsを読んでみた 1章 scaffoldを使ってみる編



※まとまりのない文章になってますがご容赦ください※


[前回の概要編はこちら。](http://qiita.com/Hanocha/items/939f70ea0eee85c2ec56)

前回はrails以前のgem, rake, bundleについてと、
Railsインストール及びアプリケーション生成を行いました。

今回はその続きとして、パRails1章の後半にあたるscaffoldを使ったRails開発体験をしてみます。


# scaffoldって何？

## scaffoldの前にgenerateコマンドの確認

Railsには`generate`というサブコマンドがあります。
このコマンドは、Railsアプリケーションを構成するModelやView、Controllerといったものを生成することができるコマンドです。

これらのModel、View、Controllerは、Railsの基本概念として使用されている
MVCフレームワークの各要素です。
これは2章以降でまた出てくるので、その時に改めて調べます。


## で、scaffoldって？

そもそものscaffoldの意味は、

> (建築現場などの)足場、(ビルの窓をふく時に使うような)吊り足場、絞首台、断頭台、(絞首・断頭による)死刑、(野外の)組み立て舞台

> 『英和辞典 Weblio辞書』より

らしい。読みは「スカフォード」という感じ。

~~スカフォードと聞いて某戦争ゲームを思い出したり~~

`rails generate scaffold`を使うと、前述のMVCをまとめて生成できます。
より具体的には、パーフェクトRuby on Railsによれば、

> scaffoldでは指定したテーブルに対してのCRUD(Create, Read, Update, Delete)操作を行うMVCそれぞれのコードと、データベースのテーブル定義を行うmigrationファイルなどが生成されます。

とあります。

…あまり良いまとめ方が思い浮かばなかったので、
実際に使ってみて理解したほうが早そうです。

## 使ってみよう

```console
$ ./bin/rails generate scaffold モデル名 content:text
```

とするだけです。簡単。ズラーっと色々なファイルが生成されます。
今回はパRailsの例に従い、"モデル名"の部分をtaskにします。
この場合、Taskがモデル名となり、tasksテーブルが出来上がります。

更に、モデル名の後にある`content:text`はテーブルのカラムを示しており、
カラム名がcontent、テキスト型のデータを格納するという意味になります。

`content:text`の後にスペースを入れ、`hoge:fuga`のような記述を追記していくことで、カラムを追加することができます。

モデル名が〜、カラムが〜と言っていますが、モデルに関するファイルだけでなく、

- app/controllers/tasks_controller.rb
- app/views/tasks/*.erb
- app/models/task.rb

など、MVCに関わるファイルがそれぞれ生成されています。
これらは、前述したようなCRUD操作を行うための、MVCそれぞれのファイルです。
詳しいことはまた2章以降になったときに改めて。


## migrationファイル？
前節ではMVCファイルが作られると言いましたが、他にも作られているファイルがあります。
その中でも重要なファイルの一つに"migrationファイル"があります。

ちなみにmigrationは移住、移転といった意味の英単語です。

このファイルは

- db/migrate/******_create_tasks.rb

といったようなファイル名で存在しています。

このmigrationファイルは、パRailsによると、

> Rubyのコードで書ける内部DSLになっています。このファイルにデータベース上のテーブルに対する操作を抽象化した処理を記述します。

とあります。 ~~何を言っているのかよくわかりません。~~

内部DSLの話は置いといて、テーブルに対する操作を記述するものだということだけとりあえずおさえておきます。

このファイルをもとにテーブルが作成されます。実際に作ってみましょう。
以下のコマンドを打つとdbの生成とテーブルの生成が行えます。

```console
$ ./bin/rake db:create
$ ./bin/rake db:migrate
```

これでtasksテーブルが作成されます。

ここまでの処理で、Railsアプリケーション内にscaffoldで生成されたひな形が動作するようになっています。
実際に

```console
$ ./bin/rails s
```

でサーバを起動し、`http://localhost:3000/tasks`にアクセスしてみましょう。
（ちなみに、`rails s`はサーバの起動コマンドである`rails server`の省略形です。）


"Listing tasks"といくつかの文字列が書かれたページが表示されましたか？
表示されたら成功です。New TaskやEdit、Showなどといった操作をしてみましょう。


## まとめ
scaffoldでRailsアプリに新しいモデルを追加することができました。

scaffordについてもう少し深掘りしてもいいのですが、
まず基本となるMVCについて知らなければ…ということで、
次回からは2章の「Ruby on RailsとMVC」を読んでいき、
RailsにおけるMVCモデルについて調べていきたいと思います。
第30回山陰ITPro勉強会 参加レポート


http://sitw.techtalk.jp/sitwinfo/info30

- ハッシュタグ #sitw30
- 2015/04/23 松江オープンソースラボ

* * *

# メインセッション1: 最近のセキュリティの色々 まっちゃだいふく さん

- 最近は情報セキュリティ教育のお手伝いをしたり
    - お手伝い時の新人CTFの問題が[こちら](http://www.lac.co.jp/blog/category/education/20160331.html)
        - 筆者は会場で15分挑むも解けず、帰宅後に+15分で解けました
- 昨今のセキュリティ
    - [不正送金事案](http://d.hatena.ne.jp/Kango/?of=6)
        - メガバンク->地銀->企業と標的が推移してきている
        - メガバンクの対策が強化され標的が地銀に移り、地銀の対策が…という仕組み
    - 標的型攻撃
        - ランサムウェアで身代金要求
- セキュリティ情報
    - [piyolog](http://d.hatena.ne.jp/Kango/)([twitter](https://twitter.com/piyokango?lang=ja))が時系列などもまとまってておすすめ


# メインセッション2: CSIRTとは 橘喜胤 さん
- コンピュータセキュリティにかかるインシデントに対処するための組織の総称
- OKIにOKI-CSIRTを立ち上げる
- [日本シーサート協議会](http://www.nca.gr.jp/outline/index.html)
    - 活動内容は情報共有やWGなど
    - [チーム数は現在135](http://www.nca.gr.jp/member/index.html#number)
        - 数年前は年に10チーム増えるかどうかだったが、近年は月に10チーム増えることも
    - 加入の仕方
        - ISMSのように何か基準があるわけではない
        - 名乗るだけでOK
- CSIRTは小さく立ち上げて大きくしていくのがベター
    - 完璧にしようとすると回らなくなる
- [CSIRT奮闘記](http://itpro.nikkeibp.co.jp/article/COLUMN/20091120/340847/?rt=nocnt)
- CSIRTの歴史や実際のトラブル時の処理事例も紹介
    - メールを受け取った人の、おおよそ1%の人が、OS等が出す数々の警告を無視して感染する
        - 感染者曰く「怪しいとは思ったんですよねー！でも開いた」

# メインセッション3: ここだけは押さえておきたいIoTセキュリティ 渥美清隆 さん
- IoTは機能の話題に集中しやすい
    - セーフティ/セキュリティの話が実現の妨げになることもある
        - 見なかったことに…(隠ぺい・セキュリティ軽視)
- 問題となった事例
    - [運転の様子を記録するためのドングルで、車が操作できてしまう話](http://japanese.engadget.com/2015/08/13/sms-obd-ii/)
- 大事なこと
    - リスク評価ステージを作る
        - 企画中にリスク評価までは難しい
    - リスク評価がNGだったら企画にNOを突き付ける
        - 2,3回企画をやり直したら大概収束するはず
    - セキュリティの問題解決を現場だけで行なうのはNG
        - 設計者にできることは城壁を高くすることだけだが、経営者は他の選択肢も取れる
- どう守るか
    - 城壁を高くする
        - 最新(アップデートした)環境で
        - 不要なものはいれない
        - 作らない(内製しない)
- 起きてしまった場合は
    - 侵害発生前の準備
    - 侵害検知方法の検討
    - どんな侵害が起こるか考える
    - 被害を最小限にする手順を考える
    - 保険加入
        - 例：ドローン<-不具合がなくても落ちる

# サブセッション: SITW 30回のふりかえり あみだく さん
- あみだくさんが、まっちゃだいふくさんにやろうと誘われたのがきっかけ
- 序盤はスタッフで発表者を回していた
    - 月1ペースだったのでしんどくなってきた
    - ペース落としたのと同時に講師の方を招くように
- 山陰ITプロテイン協会
- 気がつけば他にも色んな勉強会が立ち上がる
- まっちゃだいふくさんご多忙のため、スタッフ卒業
(入門) Lumen

## 参考

* [Lumenでスレッド掲示板をつくろう！ - レッツPHP!](http://php.s3.to/tt/lumenbbs.php)

## 前置き

* [(メモ) Laravel5入門2 - Qiita](http://qiita.com/tukiyo3/items/d724cadac5997f224d2c#%E5%8F%82%E8%80%83)と同じことをLumenでやってみたかった。

```bash:laravelの場合
composer create-project laravel/laravel prj-laravel
```

```bash:lumenの場合
lumen new prj1
```


## 手順

```bash:
lumen new prj1
cd prj1
git init && git add -A && git commit -m init
# rm database/migrations/*.php
php artisan make:migration create_boards_table --create=boards
cp -a .env.example .env
```

```bash:.env
DB_CONNECTION=sqlite
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=homestead
#DB_USERNAME=homestead
#DB_PASSWORD=secret
```

```php:database/migrations/2016_*_create_boards_table.php
    public function up()
    {
        Schema::create('boards', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('txt');
            $table->timestamps();
        });
    }
```

```php:database/seeds/DatabaseSeeder.php
    public function run()
    {
        DB::table('boards')->insert([
            'name' => '板の名前',
            'txt'  => '板の説明',
        ]);
    }
```

```bash:
touch database/database.sqlite
php artisan migrate
php artisan db:seed
echo ".tables" | sqlite3 database/database.sqlite
```

```bash:make-modelが無いので出来ない
# php artisan make:model Models/Board
```

```php:app/Board.php(今回新規作成)
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Board extends Model
{
    // 代入可能な項目
     protected $fillable = ['name', 'txt'];
}
```

```php:app/Http/routes.php
$app->get('/', function () use ($app) {
    return $app->version();
});

use App\Board;
$app->get('/lists', function() use ($app) {

    //$data = $request->all();
    $data['name'] = "hogename";
    $data['txt'] = "hogetxt";
    $board = new Board;
    $board->name = $data['name'];
    $board->txt = $data['txt'];
    $board->save();

    $boards  = Board::all();
    return view('list', compact('boards'));
});
```

```php:resources/views/list.blade.php
    <table>
        @foreach($boards as $board)
        <tr>
            <td>{{ $board->name }}</td>
            <td>{{ $board->txt }}</td>
        </tr>
        @endforeach
    </table>

<form>
    name: <input type="text" name="name">
    txt: <input type="text" name="txt">
    <input type="submit">
</form>
```

```bash:webサーバ起動
# php artisan serve --port 8888 --host 0.0.0.0
cd public
php -S 0.0.0.0:8888
```

(まだRequest値からの保存に対応していない)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/94fcb067-f73e-548e-d560-ddbdbd4a21a5.png)
CIサービスまとめ（資金調達編）

CIサービスを提供している会社ってたくさんありますよね。機能比較も大事ですけど、各企業の継続性や今後の機能追加意欲なども気になったので、資金調達に成功している会社を調べてみました。

以下のリスト中、Travis CI以外の4社は400万〜2800万ドルの出資を獲得しています。特に直近で資金調達ができているCodeshipとWerckerはサーバ・インフラ系の投資及び人員増強にお金が使えそうです。（追記：と思っていたらCircleCIが巨額の資金調達を行ったというニュースが！資金面でもCircleCIが一歩リードといったところでしょうか）

一方で、Travis CIは株式での資金調達なしでここまで来ているんですね。現状の知名度では一人勝ちですし、有料プランも強気の価格設定なので、既に黒字化できているのかもしれません。外部出資なしでイグジットできたらすごいですね。

## Travis CI

* 社員数：20+
* ユーザー数：235K+
* 総出資額：外部出資なし
  * 参考：2012年にクラウドファンディングで13万ドル集めている

## CircleCI

- 社員数：40+
- ユーザー数：100K+
- 総出資額：5900万ドル+

| 日付    | 出資額    | 投資ラウンド |
|---------|----------|----------|
| 2018/1  | 3100万ドル | シリーズC |
| 2016/5  | 1800万ドル | シリーズB |
| 2014/2  | 600万ドル | シリーズA |
| 2013/2  | 150万ドル | シード    |
| 2012/4  | 非公開    | 非公開    |

## Codeship

- 社員数：20+
- ユーザー数：75K+
- 総出資額：440万ドル


| 日付    | 出資額    | 投資ラウンド |
|---------|----------|----------|
| 2015/12 | 150万ドル | シリーズB |
| 2014/2  | 260万ドル | シリーズA |
| 2013/3  |  30万ドル | シード |

## Shippable

- 社員数：30+?
- ユーザー数：50K+
- 総出資額：1005万ドル+

| 日付    | 出資額    | 投資ラウンド |
|---------|----------|----------|
| 2014/11 | 800万ドル | シリーズA |
| 2013/12 | 205万ドル | シード |
| 2013/8  | 非公開    | シード |

## Wercker

* 社員数：17
* ユーザー数：資料見つからず
* 総出資額：790万ドル

| 日付    | 出資額    | 投資ラウンド |
|---------|----------|----------|
| 2017/4  | 非公開   | Oracleが買収 |
| 2016/1  | 450万ドル | シリーズA |
| 2014/10 | 240万ドル | シリーズA |
| 2013/1  | 100万ドル | シード |

まだビジネスモデルが確立できていなさそうなのが不安点か。

（2017/4追記）WerckerがOracleに買収されました。巨大資本の後ろ盾があると安心して使えるので、ユーザー目線でも良いニュースだと感じます。

## Google Trendでみる勢い

![ci-services-google-trend.png](https://qiita-image-store.s3.amazonaws.com/0/46856/3eb29bd5-15b8-277e-4a9f-c16dd30e33cf.png)

Google Trendで見ても、上記のような並びになりそうですね。WerckerはShippableと同程度か若干下の知名度といった印象。

## 参考URL

### Travis CI

* https://travis-ci.org/
* https://www.crunchbase.com/organization/travis-ci#/entity
* http://love.travis-ci.com/

### CircleCI

* https://circleci.com/about/
* https://www.crunchbase.com/organization/circle-ci#/entity

### Codeship

* https://codeship.com/team
* https://www.crunchbase.com/organization/codeship#/entity

### Shippable

* https://app.shippable.com/company.html
* https://www.crunchbase.com/organization/shippable#/entity

### Wercker

* https://www.crunchbase.com/organization/wercker#/entity
* https://en.wikipedia.org/wiki/Wercker
* https://www.oracle.com/corporate/acquisitions/wercker/index.html
JDBC mock メモ

ちょっとさがしてるのでメモ

https://github.com/cchantep/acolyte
https://gist.github.com/cwarden/1225444
http://stackoverflow.com/questions/9326207/mock-database-driver
http://mockrunner.sourceforge.net/doc/api/com/mockrunner/mock/jdbc/MockDriver.html
https://blog.jooq.org/2013/02/20/easy-mocking-of-your-database/
https://code.google.com/archive/p/dummyjdbc/
Link > Sensor network @ 2003

2003年のLiving On Earthを聞いていると、センサーネットワークについて語られていた。

http://loe.org/shows/segments.html?programID=03-P13-00017&segmentID=2

>  the very, very low-power radios that these devices have are capable of transmitting from inside

という記載があるのみで、どういう通信規格かは不明。

2016年にはこういうのを個人で作成できそうな感じである。
PhpStorm系のMarkdownプレビューでテーブルが表示されないとき

PhpStormやWebStormでは「Markdown」プラグインを入れることでMarkdown文書をプレビューできます。しかし、デフォルトではテーブルが表示されません。テーブルを表示する方法を説明します。

<img width="1003" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/12939/3296e279-57e3-5dc7-5f67-47b26c221e59.png">

「Preference」→検索欄に「Markdown」→「Other SettingsのMarkdown」で「Tables」にチェックを入れる

<img width="638" alt="output_md_-_mindfulness_p160425_-____projects_170331_mindfulness_p160425_.png" src="https://qiita-image-store.s3.amazonaws.com/0/12939/6255809f-d36a-37ae-b5e4-cbfda1b1db29.png">

しかしこのテーブル・・・15年くらい前のスタイルですね。久々に見ました。

---
ブログやっています：http://weed.nagoya
技術英語 > [Was there any indication] yesterday that there was something wrong? / clue / culprit

@ Star Trek Voyager > MELD

機関室においてトレスがホーガンとワープドライブの故障原因の話をしている。
EPS Conduit 141に問題がありそうだというホーガンに対してトレスが

> <font color=red>Was there any indication</font> yesterday <font color=red>that</font> there was something wrong?

<hr>
関連して思い出したのは

> clue

http://eow.alc.co.jp/search?q=clue&ref=sa
> 〔解決のための〕手掛かり、ヒント、鍵

<hr>
関連して思い出したのは

> culprit

http://eow.alc.co.jp/search?q=culprit
> 3. 〈話〉問題の原因［発端］
Fetch PR from Github filtered by labels using PyGithub


Label cannot fetch from Github PR API. Therefere, Issue API should be used. Current implementation, I filter pr in local. It is better to filter Github API lebel. There is API for filtering issue by label. I will update this post.



```python
from github import Github



token = 'YOUR_TOKEN'
g = Github(token)

repos = ['YOUR_REPO', 'YOUR_REPO']
# You can change get_organization to get_user()
org = g.get_organization('YOUR_ORG')

git_repos ={repo: org.get_repo(repo) for repo in repos}


# Issue is a equivalent to pr
# Issue API should be called first to fetch tags
def get_pr_from_issues(issues):
    for issue in issues:
        if issue.pull_request is not None:
            pr_id = int(issue.pull_request.html_url.split("/")[-1])
            yield issue.repository.get_pull(pr_id), issue.labels

repo_prs = {}
for repo_name, repo in git_repos.items():
    repo_prs[repo_name] = get_pr_from_issues(repo.get_issues(state='open'))

```
Unityで実行時間を計測する


```C#:3msと出力される
using UnityEngine;
using System.Diagnostics;

public class Test : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Stopwatch sw = new Stopwatch ();
		sw.Start ();
		// 3秒待つ.
		System.Threading.Thread.Sleep (3);
		sw.Stop ();
		UnityEngine.Debug.Log (sw.ElapsedMilliseconds+"ms");
	}
}
```
独習PHP第3版を読んでみた

# 独習PHPとは

独習PHP第3版は、つい先日の2016/4/9に発売された本です。
http://www.amazon.co.jp/dp/479813547X

2010年に発売された、PHP5.3対応の第2版発売から6年経過し、
今回はPHP7に対応しています

作者の山田 祥寛さんの本としては、JavaScriptやJavaなども
読んだことがありますが、どの本も説明が丁寧でとても分かりやすいと思います。

独習シリーズはいろいろな言語で出版されており、
何かしら読んだことがある人も多いと思いますが、
中級レベルの内容になっており、十分実務で使用出来る本になっています。

# 対象者のレベル

目次はこのようになっています。

第1章　イントロダクション
第2章　PHPの基本
第3章　演算子
第4章　制御構文
第5章　組み込み関数
第6章　ユーザ定義関数
第7章　標準クラスライブラリ
第8章　リクエスト情報
第9章　データベース連携
第10章　オブジェクト指向構文
第11章　セキュリティ対策

**リクエスト情報、データベース連携、セキュリティ対策**あたりは、
他のPHP本ではあまり詳しく触れていないものも多いですが、
本書はとても詳しく書いていて、webプログラミングの基礎を学ぶのに最適と言えます。
Chromeのデベロッパーツールについても触れています。

数年web以外のプログラミングを経験し、webに転向してきたエンジニアには、
特に向いていると思います。

逆に全くのプログラミング未経験だと、オブジェクト指向、高階関数の部分など、
難しい部分が多少あるとは思います。
また、業務で十分にPHPを使っている場合にも、得るものは少ないと思います。

# 良かった点
## webの基礎を学べる
上で書きました、webの基礎と言語を同時に学べる本は貴重だと思います。

## 新機能の説明が分かりやすい
第2版のPHP5.3以降の**演算子、トレイト、ジェネレータ、finally、可変長引数、無名クラス、戻り値の型宣言**など、主要な新機能については網羅されています。
とても分かりやすいと思います。

目次にも、どのバージョンからの新機能か書かれているため、
新機能だけを読みたいという場合にも見つけやすいです。

## PDOの説明が丁寧
DB接続を扱うPDOというモジュールのメソッドについて、とても詳しく触れています。
オプションについてもしっかり説明していて、知らないものもいくつかありました。

# こういう内容があればなおよかった
## Linuxの環境構築方法
Linuxの環境構築方法が、FedoraのXAMMPをGUIで入れる方法になっていて、
実務で使うような、ソースをwgetしてきてconfigureしてmakeして・・・という入れ方は書かれていません。
第2版まではありましたので、少し残念に思いました。

なお、こちらにLinuxのインストール方法を作りました。
[MariaDBのインストール方法](http://qiita.com/d-dai/items/9b20c47402a8fc5f1a6a)
[PHPのインストール方法](http://qiita.com/d-dai/items/200e8b0540364c47adde)

## 総まとめとして、アプリケーションを作る章
本書の内容の総まとめとして、何かしらアプリケーションを作るような章があると
なおいいと思いました。
各章に練習問題はありますが、どれも小規模なため、
手を動かして身につけるという感覚はつかみにくいと思います。

特にオブジェクト指向については抽象クラス、インターフェース、トレイトなどの
違いを丁寧に説明をしているので、実例があった方が理解しやすいと思います。


## PhpStormなどのIDEを使った開発方法
vimやemacsなどのエディタを使った開発は少なくなりましたし、
よっぽどエディタを使いこなしていないと非効率ですので、
PhpStromなどのIDEを使った開発方法の説明があるといいと思いました。

## PHPUnitを使ったテスト方法
テストコードの作成はいまや一般的になってきていますので、
PHPUnitの実行方法、テストケースの例などがあればいいと思いました。
instagram api使うための、python-instagramモジュールで日本語検索ができなかった

## python-instagramモジュールで日本語検索ができなかった
 - 日本語でハッシュタグの写真検索するとエラーなる

## 英語は問題なく検索可能だ
```
tag_recent_media, next = api.tag_recent_media(tag_name='love')
```

## 日本語を検索かけるとエラーになる
```
tag_recent_media, next = api.tag_recent_media(tag_name='日本')
```

## エラー内容
```
  File "/Users/free31/git/instag/src/instagram/bind.py", line 197, in _call
    return method.execute()
  File "/Users/free31/git/instag/src/instagram/bind.py", line 189, in execute
    content, next = self._do_api_request(url, method, body, headers)
  File "/Users/free31/git/instag/src/instagram/bind.py", line 137, in _do_api_request
    raise InstagramAPIError(content_obj.get('code'), content_obj.get('error_type'), content_obj.get('error_message'))
instagram.bind.InstagramAPIError: (403) OAuthForbiddenException-Invalid signed-request: Signature does not match
```

## 解決
 - モジュールファイルのbine.pyを修正して解決

```
value = quote(self.parameters[name])
↓↓↓↓↓
value = self.parameters[name].encode('utf8')
```
名前空間を作って、ENTER_FRAMEを名前空間内で実装してみる


[名前空間を作って他の人との協業に備える](http://qiita.com/shunjiro/items/11bdafdf8cbe1bbbbc4c)

の続編です。

# 名前空間ができたので、ENTERFRAMEを名前空間内で実装をしてみました。

```lang:filename
ENTERFRAME = (function(){
  function ENTERFRAME(){
    //関数を突っ込む
    this.arr = [];
    this.flag = true;
    this.requestID;
  }
  ENTERFRAME.prototype.add = function(_obj) {
    //追加する時にIDを与える
    var _id = Math.floor(Math.random()*10000000)
    _obj.id = _id;
    this.arr.push(_obj);
    return _id;
  };
  ENTERFRAME.prototype.remove = function(_reqID) {
    //追加する時にIDを与える
    var _target = -1;
    for(var i = 0 ; i < this.arr.length ; i++){
        if(this.arr[i].id == _reqID){
          _target = i;
        }
    }
    if(_target != -1){
      this.arr.splice( _target, 1 );
    }
  };
  ENTERFRAME.prototype.loop = function() {
    var _this = this;
    for(var i = 0 ; i < this.arr.length ; i++){
        this.arr[i].fire();
        //console.log(this.arr[i].id);
    }
    if(this.flag){
      this.requestID = requestAnimationFrame(function(){
        _this.loop();
      });
    }
  };
  ENTERFRAME.prototype.init = function() {
    this.loop()
  };
  
  ENTERFRAME.prototype.destory = function() {
    cancelAnimationFrame(this.requestID);
    this.flag = false;
    this.arr = [];
  };
  
  return ENTERFRAME;
})();
```

これで使う時には、

```lang:filename
var thisman = new THISMAN();
thisman.init();
```

これをすると毎フレーム毎の実装ができるので、
関数の登録は、ちょっとfire()っていう関数名で発火をさせたいので


```lang:filename
var reqID1 = enterframe.add({fire:function(){
  console.log("add1");
}});
var reqID2 = enterframe.add({fire:function(){
  console.log("add2");
}});
```
みたいにしてみる。（下記の説明の為に２個登録をしている。）

登録を消したい場合には、上記で取得したIDを削除することで消せる

```lang:filename
//削除をする場合
enterframe.remove(reqID1);
```

ENTERFRAME自体を終わらせたい時には、

```lang:filename
enterframe.destory();
```

これで、一旦は実装が済んでますが、現在時間の取得などいれる事で、フレームレートの計算など内部に入れてしまったりできるともっと楽にいろんな事が出来たりするかもしれません。
「Scheme入門」（湯浅太一 著：岩波書店 1991年）をGaucheで読む（２）

P114の[5.3.6]の「ゲーム木」の解答はP123とP124に二通りある。
前者

```scm
(define (nim n)
  (case n
    ((0) (list 0))
    ((1) (list 1 (nim 0)))
    ((2) (list 2 (nim 1) (nim 0)))
    (else (list n
		(nim (- n 1))
		(nim (- n 2))
		(nim (- n 3))
		)
	  )
    )
)
```
（「Scheme入門」P123より引用）
ではたとえば

```scm
(nim 4)
```
を評価すると
gosh> (4 (3 (2 (1 (0)) (0)) (1 (0)) (0)) (2 (1 (0)) (0)) (1 (0)))


```scm
＊書き直すと

(4 (3 (2 (1 (0)) 
	 (0))
      (1 (0))
      (0))
   (2 (1 (0))
      (0))
   (1 (0)))
＊こう。
```
返ってくるのだが

P124の、より効率的なコード

```scm
(define (nim2 n)
  (case n
    ((0) (list 0))
    ((1) (list 1 (nim2 0)))
    ((2) (list 2 (nim2 1) (nim2 0)))
    (else (let ((x (nim2 (- n 1))))
	    (list n
		  x
		  (cadr x)
		  (caddr x))
	    )
	  )
    )
)
```
にすると（ただしnimをnim2に書き換えて引用）

gosh> (4 (3 #0=(2 #1=(1 (0)) #2=(0)) #1# #2#) #0# #1#)

と返ってくる。

[前回の（1.5）](http://qiita.com/tochu-cha/items/40ee3eb8f8924ccdbcd9)で言及しているように、Gaucheでは同一のオブジェクトを使いまわす（言葉悪いな）場合は
\#
を使って冗長を避けるので、上述のリストは

gosh> (4 (3 (2 (1 (0)) (0)) (1 (0)) (0)) (2 (1 (0)) (0)) (1 (0)))

と同一である。

試しに

```scm
(define y
'(3 (2 (1 (0)) 
	 (0))
      (1 (0))
      (0))
)
```
とリストを作った後（リストを作るというかリストをクオートした後）

```scm
(list (+ (car y) 1)
      y
      (cadr y)
      (caddr y)
)
```

とすると同じく
gosh> (4 (3 #0=(2 (1 (0)) (0)) #1=(1 (0)) (0)) #0# #1#)
と返ってきます。

図で表すと

![nim-3.png](https://qiita-image-store.s3.amazonaws.com/0/113031/eae83155-d24f-cab8-0429-2ee6a81c63b9.png)

なので、結果

![nim-1.png](https://qiita-image-store.s3.amazonaws.com/0/113031/2ea4242f-c616-b632-aec9-cf90dc1a7793.png)

と同じことになるわけですな。

PS.ボケとネタが足りないので後で編集したいです。
Atomの地味に便利なパッケージ5選

開発の上で必須なパッケージというわけではありません。
がしかし地味に便利だったり、またはちょっとしたイライラが解消されるようなジワジワくるパッケージをご紹介します笑

# [line-jumper](https://atom.io/packages/line-jumper)
上下移動の時に1行じゃ物足りず、1ページ分移動だといきすぎる。
数行くらいをパパッと移動したいんだよね
そんなあなたにこのline-jumper :running: 
一度に移動する行数も自分の好みに設定できます。
また移動だけでなく複数行の選択にも地味に使える :sparkles: 

# [last-cursor-position](https://atom.io/packages/last-cursor-position)
ちょっと前に編集した位置に戻りたい :sweat: 
メソッドジャンプしたはいいけど元の位置に戻るのがめんどくさい :anger: 
last-cursor-positionなら可能です(キリッ)
本当にかゆいとこに手が届いたパッケージです笑

# [change-case](https://atom.io/packages/change-case)
キャメルケース⇆スネークケースの相互変換ができます。
例えばリクエストパラメータはスネークだけどそれを代入する変数は規約上キャメルという場合によく使ってました :sweat_smile: 

# [sublime-style-column-selection](https://atom.io/packages/Sublime-Style-Column-Selection)
これはまあまあ有名ですね。
短形選択を可能にするパッケージです。
やっぱ短形選択したい場合が何かとあるので入れてよかったと思える一品

# [local-history](https://atom.io/packages/local-history)
最後にこいつ。ロ〜カルヒストリ〜 :grinning: 
ローカルでのファイル編集履歴を追えるので「あれ？やっぱあのコード必要だったんじゃないか？汗 よ、よし、戻そう！」
ってなった場合に役立つ :+1:
Docker machine(Windows)のVMイメージをCドライブ以外に作成

Windowsのdocker-machineはデフォルトで

````
C:\Users\username.docker\machine\machines
````

にイメージを作成します。

Cドライブの空き容量が足りない場合、VirtualBoxの設定を変更しても、イメージが作成されるディレクトリはなぜか変わらないので、シンボリックリンクを作成して対応します。（ショートカットでは不可）

管理者権限でコマンドプロンプトを起動し、以下のコマンドを実行すればシンボリックリンクが作成できます。

```
c:\>mklink /D "C:\Users\username\.docker\machine\machines" "D:\Virtual Machines\machines"
C:\Users\username\.docker\machine\machines <<===>> D:\Virtual Machines\machines の
シンボリック リンクが作成されました

c:\>
```
読書メーターを goutte でスクレイピング

読書メーターから自前の蔵書管理システムに移行したいのだがエクスポート機能がない。APIもない。
仕方ないのでスクレイピングした。
GitHub に上げるほどのこともないのでここに貼っておく。

- 自分のアカウントにログインして「読んだ本」のASINと「読み終わった日（yyyymmdd）」を取ってくる。
- goutte だがなぜか selectButton() でボタンのvalue文言からフォームの取得はできるのに selectLink() でアンカー文言からリンクの取得ができなかったのでURL指定してリクエストで遷移。
- 動いた時点でやめたのでお見苦しい点がございます。

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

require_once('./vendor/autoload.php');
//include './goutte-v3.1.0.phar';

// 出力ファイルパス
$csvPath = './books.csv';

// 読書メーターログイン情報：コマンドラインオプションから受け取る
/*
$opt = getopt('u:p:');
$mail = $opt['u'];
$pwd = $opt['p'];
*/
// 面倒ならベタ書きでもよい
$mail = 'YOUR_MAIL';
$pwd = 'PASSWORD';

$client = new \Goutte\Client();

$baseUri = 'http://bookmeter.com';

$cr = $client->request('GET', $baseUri.'/login');

// ログイン
$form = $cr->selectButton('ログイン')->form();
$form['mail'] = $mail;
$form['password'] = $pwd;
$cr = $client->submit($form);

// 読んだ本／リスト
//$cr = $client->click($cr->selectLink('読んだ本')->link());
$cr = $client->request('GET', $baseUri.'/home?main=book');

// ページナビから最後のページのページ番号を取得
$node = $cr->filter('span.page_navi_hedge a')->extract('href');
preg_match('/&p=(\d+)/', $node[0], $matches);	// /home?main=book&p=99"
$pLast = $matches[1];

for ($p = 1; $p <= $pLast; $p++)
{
	$cr = $client->request('GET', $baseUri . '/home?main=book&p=' . $p);
	printf("page: %d\n", $p);
	
	$nodes = $cr->filter('div.book_box_book_title a');
	foreach($nodes as $a)
	{
		$path = $a->getAttribute('href');
		$cr2 = $client->request('GET', $baseUri . $path);
		
		try {
			$form = $cr2->selectButton('更 新')->form()->getValues();
			$asin = $form['asin'];	// ASIN
			$date = $form['current_read_date']; // 読み終わった日
			printf("[%s][%s]\n", $asin, $date);
			
			// CSVに出力
			file_put_contents($csvPath, sprintf('"%s","%s"'."\n", $asin, $date), FILE_APPEND);

		} catch (Exception $e) {
			print $e->getMessage();
		}
		
		$client->back();
	}
}
```
Learning Rails 10 (Create edit form)


![スクリーンショット 2016-04-26 18.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/39073/bc1651b1-7196-6f66-86e9-fa31138bbf53.png "スクリーンショット 2016-04-26 18.57.13.png")

We use it

|Prefix | Verb | URI | Controller#Action| Explanation |   
|:-----------|:------------|:------------|:------------|:------------|
|edit_user_path|GET|/users/:id/edit|users#edit|users controller and edit action|


```bash
vi app/views/users/index.html.erb
```

Add this line

```ruby:index.html.erb
<%= link_to 'edit', edit_user_path(user.id) %>
```

current index.html.erb

```ruby:index.html.erb
<h1>Users</h1>
 
<ul>
  <% @users.each do |user| %>
    <li><%= link_to user.name, user_path(user.id) %>:<%= user.approved%>:<%= link_to 'edit', edit_user_path(user.id) %></li>
  <% end %>
</ul>
 
<p><%= link_to "Add New", new_user_path %></p>
```

```bash
vi app/controllers/users_controller.rb
```

Add this line

```ruby:users_controller.rb
def edit
  @user = User.find params[:id]
end
```

Create new view file

```bash
vi app/views/users/edit.html.erb
```

```ruby:edit.html.erb
<h1>Edit</h1>
 
<%= form_for @user do |f| %>
  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
    <% if @user.errors.any? %>
      <%= @user.errors.messages[:name][0] %>
    <% end %>
  </p>
 
  <p>
    <%= f.submit %>
  </p>
<% end %>
```
社内限定サイトにCloudFrontを使う（EC2オリジン）

例えば本番リリース前のAWS検証環境は、社内限定のアクセス制限をかけていることが多いと思いますが、
EC2のセキュリティグループを社内IPのみに制限していると、CloudFrontからのアクセスも遮断されてしまいます。

ですので、CloudFrontからのアクセスも許可しておく必要があります。

CloudFrontの送信元IPアドレスの範囲を以下のURLから確認します。
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html

※2017/4/27現在、以下のCIDRのみHTTP、HTTPSの通信を許可しています。

```
13.32.0.0/15
13.54.63.128/26
34.195.252.0/24
35.162.63.192/26
35.167.191.128/26
52.15.127.128/26
52.46.0.0/18
52.52.191.128/26
52.56.127.0/25
52.57.254.0/24
52.66.194.128/26
52.78.247.128/26
52.84.0.0/15
52.199.127.192/26
52.212.248.0/26
52.220.191.0/26
52.222.128.0/17
54.182.0.0/16
54.192.0.0/16
54.230.0.0/16
54.233.255.128/26
54.239.128.0/18
54.239.192.0/19
54.240.128.0/18
204.246.164.0/22
204.246.168.0/22
204.246.174.0/23
204.246.176.0/20
205.251.192.0/19
205.251.249.0/24
205.251.250.0/23
205.251.252.0/23
205.251.254.0/24
216.137.32.0/19
```

上記CIDRをHTTP、HTTPSに対して追加すると、34個分のルールが消費されてしまいます。
1セキュリティグループのルール設定上限値はデフォルトで50のため、このセキュリティグループはCloudFront専用とし、EC2個別のセキュリティ設定は、別途セキュリティグループを設定するのが良いと思います。
Learning Rails 9 (Save user data)


Please check routes

```bash
rake routes
```

![スクリーンショット 2016-04-26 18.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/39073/bc1651b1-7196-6f66-86e9-fa31138bbf53.png "スクリーンショット 2016-04-26 18.57.13.png")

We use it

|Prefix | Verb | URI | Controller#Action| Explanation |   
|:-----------|:------------|:------------|:------------|:------------|
||POST|/users|users#create|users controller and create action|

```bash
vi app/controllers/users_controller.rb
```

Add these two methods

```ruby:users_controller.rb
def create
  @user = User.new(user_params)
  @user.save
 
  redirect_to users_path
end
 
private
 
  def user_params
    params[:user].permit(:name)
  end
```

You can confirm to save data from user form

![スクリーンショット 2016-04-26 23.05.35.png](https://qiita-image-store.s3.amazonaws.com/0/39073/6c6c902a-f37e-4e40-9300-912edcb889ca.png "スクリーンショット 2016-04-26 23.05.35.png")

Setting validation

We will implement to prevent empty data

```bash
vi app/models/user.rb
```

```ruby:user.rb
class User < ActiveRecord::Base
  validates :name, presence: true
end
```
validation run when save method is called

```bash
vi app/controllers/users_controller.rb
```

If save fails or there is validation problem, render new view.

```ruby:users_controller.rb
def create
  @user = User.new(user_params)
  if @user.save
    redirect_to users_path
  else
    render 'new'
  end
end
```

Display error message

```bash
vi app/views/users/new.html.erb
```

Add these lines

```ruby:new.html.erb
<% if @user.errors.any? %>
  <%= @user.errors.messages[:name][0] %>
<% end %>
```

current new.html.erb

```ruby:new.html.erb
<h1>Add New</h1>
 
<%= form_for @user do |f| %>
  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
    <% if @user.errors.any? %>
      <%= @user.errors.messages[:name][0] %>
    <% end %>
  </p>
 
  <p>
    <%= f.submit %>
  </p>
 
<% end %>
```

You can see error

![スクリーンショット 2016-04-26 23.22.44.png](https://qiita-image-store.s3.amazonaws.com/0/39073/0e9b47bb-59a3-5814-1540-12f14eae0860.png "スクリーンショット 2016-04-26 23.22.44.png")

Add other validation

```bash
vi app/models/user.rb
```

```ruby:user.rb
class User < ActiveRecord::Base
  validates :name,
            presence: true,
            length: {minimum: 3}
end
```
You can see other error

![スクリーンショット 2016-04-26 23.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/39073/a519a6b2-e458-7068-0d8f-184d1c85031a.png "スクリーンショット 2016-04-26 23.25.03.png")
Mailgun-PHPで"Puli Factory is not available"エラーが出た時


[Mailgun-PHP](https://github.com/mailgun/mailgun-php) （v2.0）をREADMEの


```php
$mailgun = new \Mailgun\Mailgun('api_key');
$domain = "example.com";
$mailgun->sendMessage($domain,[..送信データ])
```


のように使おうとしたら

```
RuntimeException: Puli Factory is not available
```

というエラーが出てしまいました。
調べると

> http://stackoverflow.com/questions/36443480/fatal-error-uncaught-exception-runtimeexception-with-message-puli-factory-is

こちらのstackoverflowで解決方法のひとつが見つかりました。


まずはGuzzle6HTTPAdapterをインストール

```
$ composer require php-http/guzzle6-adapter
```
そして

```php
$client = new \Http\Adapter\Guzzle6\Client(); 
$mailgun = new \Mailgun\Mailgun('api_key', $client);
$domain = "example.com";
$mailgun->sendMessage($domain,[..送信データ])
```

このようにしたらとりあえず使えるようになりました。
Mailgun-PHPのバージョンが上がるなどしてこの問題が解決したらソースを元に戻すことになるかもしれません。
PHPの名前空間


##はじめに
基礎的な部分ではありますが、PHPの名前空間はわりと分かりやすかったです。
自分の学習用なので、間違いがあったらコメントください。

##名前空間
名前空間は、変数や関数の衝突を避けるために使用します。
jsでは空のオブジェクトを使って名前空間を作ったりしてましたが、PHPはわかりやすいです。

名前空間を作るには、``namespace``で作ります。


```User.php
<?php
namespace myLib\lib;

function showAge(){
  echo '55';
}

const NICK_NAME = '加藤';

class User{
  public $name = '佐藤';
}
?>
```

```index.php
<?php

require 'User.php';

$user = new myLib\lib\User();
echo $user -> name;//佐藤

myLib\lib\showAge();//55

echo myLib\lib\NICK_NAME;//加藤

?>
```

###名前空間のルール

名前空間の前に記述できるのは、declare文のみです。
htmlなどの記述があるとエラーとなります。

```User.php
<!DOCTYPE html>
<?php
namespace myLib\lib;//Fatal error

class User{
  public $name = '佐藤';
}
?>
```


###名前空間の階層構造

ディレクトリと同じように、名前空間は階層構造を持たせることができます。
階層構造を定義するには``\``（バックスラッシュ）を使用します。

```
namespace myLib\lib;
```

###useで名前空間の参照をシンプルにする
例えば下記のように、名前空間の参照が複数登場したとします。
そんな場合、``use 名前空間識別子　as 識別子名``を使用します。

```
<?php

require 'User.php';

$user = new myLib\lib\User();
echo $user -> name;//佐藤

myLib\lib\showAge();//55

echo myLib\lib\NICK_NAME;//加藤

?>
```

####useを使う

```
<?php

require 'User.php';

use myLib\lib as lib;

$user = new lib\User();
echo $user -> name;//佐藤

lib\showAge();//55

echo lib\NICK_NAME;//加藤

?>
```

##終わり
他にも色々あるようなのですが、追記していきます。
canvasでカラフルな円を生成


デモ：http://mo49.tokyo/qiita/20160426/

Circleオブジェクトを定義

```javascript:Circle.js
var Circle = function(){
  // デフォルトで呼び出されるメソッドを定義
  return this.set();
};

Circle.prototype.set = function(){
  var radian = Math.random() * (Math.PI * 360);
  this.x = cv.width * Math.random(); 
  this.y = cv.height * Math.random(); 
  this.to_x = Math.cos( radian );
  this.to_y = Math.tan( radian );
  this.speed = Math.random() * 3 + 2;
  this.size = Math.random() * 8 + 3;
  // this.color(); // 初回だけならこちらで設定
};

Circle.prototype.move = function(){
  this.x += this.to_x * this.speed;
  this.y += this.to_y * this.speed;
  this.out_square_in();
  this.color();
};

// 画面からはみ出したとき戻す
Circle.prototype.out_square_in = function(){
  if( this.x + this.size < 0 ) this.x = cv.width;
  if( cv.width < this.x ) this.x = 0 - this.size;
  if( this.y + this.size < 0 ) this.y = cv.height;
  if( cv.height < this.y ) this.y = 0 - this.size;
};

Circle.prototype.color = function(){
  this.r = Math.floor(Math.random()*255);
  this.g = Math.floor(Math.random()*255);
  this.b = Math.floor(Math.random()*255);
};
```

canvasの処理を記述

```javascript:main.js
var cv = document.getElementById("cv");
var ctx = cv.getContext("2d");

setCanvasSize();
function setCanvasSize() {
  cv.style.width = window.innerWidth + 'px';
  cv.style.height = window.innerHeight + 'px';
  cv.width = window.innerWidth * window.devicePixelRatio;
  cv.height = window.innerHeight * window.devicePixelRatio;
}
$(window).on('resize load', function(){
  setCanvasSize();
});

// スワイプによるスクロールを禁止させる
document.body.addEventListener('touchstart', function(event) {
  event.preventDefault();
});

// canvasが使用可能か判定
if( cv && cv.getContext ) {
  canvasInit();
}

function canvasInit(){

  var instances = [];
  var count = 0;

  for( var i = 1; i <= 100; i++ ){
    instances.push( new Circle() );
  }

  function draw(){
    // 背景
    var p;
    ctx.fillStyle = "#000";
    ctx.fillRect( 0, 0, cv.width, cv.height );

    // 円
    for ( var i = 0; i < instances.length; i++) {
      p = instances[i];
      ctx.fillStyle = 'rgba(' + p.r + ',' + p.g + ',' + p.b + ', 1)';
      ctx.beginPath();
      ctx.arc( p.x, p.y, p.size, 0, Math.PI * 2, false );     
      if (count > 1500) {
        ctx.arc( p.x, p.y, p.size*3, 0, Math.PI * 2, false );     
        if(count > 2000){ count = 0; }
      }
      count++;
      ctx.fill();
      p.move();
    }
  setInterval(draw, 50);
  
}
```

>　引用
[JavaScriptで学ぶ オブジェクト指向入門](http://codeprep.jp/ja/books/book/36)
[ブラウザいっぱいのキャンバスを作る](http://qiita.com/tyfkda/items/d1c650786bce6ff825b1)
Learning Rails 8 (Create user form)


Please check routes

```bash
rake routes
```

![スクリーンショット 2016-04-26 18.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/39073/bc1651b1-7196-6f66-86e9-fa31138bbf53.png "スクリーンショット 2016-04-26 18.57.13.png")

|Prefix | Verb | URI | Controller#Action| Explanation |   
|:-----------|:------------|:------------|:------------|:------------|
|new_user|GET|/users/new|users#new|new_user_path is users controller and new action|

```bash
vi app/views/users/index.html.erb
```

Add this line

```ruby:index.html.erb
<p><%= link_to "Add New", new_user_path %></p>
```

current index.html.erb

```ruby:index.html.erb
<h1>Users</h1>

<ul>
  <% @users.each do |user| %>
    <li><%= link_to user.name, user_path(user.id) %>:<%= user.approved%></li>
  <% end %>

  <p><%= link_to "Add New", new_user_path %></p>
</ul>
```

Add method to Controller

```bash
vi app/controllers/users_controller.rb
```

Add this line

```ruby:users_controller.rb
def new
  @user = User.new
end
```

current users_controller.rb

```ruby:users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end
 
  def show
    @user = User.find params[:id]
  end
 
  def new
    @user = User.new
  end
end
```

Create view file

```bash
vi app/views/users/new.html.erb
```

```ruby:new.html.erb
<h1>Add New</h1>
 
<%= form_for @user do |f| %>
  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </p>
 
  <p>
    <%= f.submit %>
  </p>
<% end %>
```

http://192.168.43.200:3000/

![スクリーンショット 2016-04-26 23.05.26.png](https://qiita-image-store.s3.amazonaws.com/0/39073/08eda1f4-4d09-808e-1f0b-369cb1f6b350.png "スクリーンショット 2016-04-26 23.05.26.png")

http://192.168.43.200:3000/users/new

![スクリーンショット 2016-04-26 23.05.35.png](https://qiita-image-store.s3.amazonaws.com/0/39073/6c6c902a-f37e-4e40-9300-912edcb889ca.png "スクリーンショット 2016-04-26 23.05.35.png")
Java から始めた新人はとっとと読めばいいのにと思っている5冊

自分が新人時代に読んでよかったもの，
それよりちょっと後に読んで「もっと早く読めばよかった」と思ったもの，
後輩と接していて「あれを読ませておけば」と何度も思った本を，5冊挙げる．

# [Effective Java](http://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056/ref=sr_1_1?ie=UTF8&qid=1461681584&sr=8-1&keywords=effective+java)
新人が一目見たら難しそうに見えるかもしれないが、必死に食らいつくべし。
ただ Java の文法を勉強しながらプログラミングを学習しているだけでは学べない Java の仕組みや方法論を学べる．
自分は例年，チームに新人が配属された時には毎週1時間確保して読書会をしている．
わからないところは先輩に聞くべし。

# [リファクタリング 新装版](http://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E2%80%95%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B%E2%80%95-OBJECT-TECHNOLOGY-Martin-Fowler/dp/427405019X)

「コードの匂い」に「ウッ」と思えるようになっていただきたい．

# [リーダブルコード](http://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Dustin-Boswell/dp/4873115655/ref=sr_1_5?ie=UTF8&qid=1461681606&sr=8-5&keywords=%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)
『リファクタリング』と通ずるところもあるが，読むべき．
Java しか触ったことがなかったとしても、「ヤバいコードはどの言語もだいたい同じ」と思ってもらえれば。
ジュンク堂が毎年やってる「このコンピュータ書籍がすごい！」というイベントによると、2015年まで3年連続売り上げ1位だったというお化け書籍。

# [JUnit 実践入門](http://www.amazon.co.jp/JUnit%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%8A%80%E6%B3%95-WEB-PRESS-plus/dp/477415377X/ref=sr_1_1?ie=UTF8&qid=1461681737&sr=8-1&keywords=junit+%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80)

研修で JUnit を書けと言われても意味が理解できてなかったり，
カバレッジ100%を目指しながら自分のやっていることに疑問を感じている人は今すぐ読むべき．

テストコードがあればすべてが解決されるわけではないけれども，
2年目だった自分はこの本を読んで，「テストコードでどこまで解決できるだろう」とめっちゃ真剣になって極めようとしたのは今の自分の一番の糧になっているなぁと思っているし，それはそこまで誇張じゃないと思う.

# [チーム開発実践入門](http://www.amazon.co.jp/%E3%83%81%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~%E5%85%B1%E5%90%8C%E4%BD%9C%E6%A5%AD%E3%82%92%E5%86%86%E6%BB%91%E3%81%AB%E8%A1%8C%E3%81%86%E3%83%84%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89-WEB-PRESS-plus/dp/4774164283/ref=sr_1_1?ie=UTF8&qid=1461681751&sr=8-1&keywords=%E3%83%81%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80)

文法の勉強をしているだけでは，実際にアプリケーションとして本番環境で動かしてユーザーに触ってもらうことは出来ない．そこに至るまでの要素要素を優しく解説してくれている．それぞれの動機をしっかり説明してくれているのが本当に良い．
Raspberry PiにMariaDBをコンパイルして入れてみる

Raspberry Pi 2にMariaDBを入れたかったのでコンパイルしてインストールしてみた話。
(aptitudeでも入れられるっぽい？)

# 検証環境
Raspberry Pi 2
Raspbian Jessie Lite(2016-03-18)
MariaDB 10.1.13

# コンパイル
以下のスレッドで書かれているとおりなんだけど、意外とこのスレッド見つけるのに苦労したので・・・。

[Raspberry Pi • View topic - How I compiled MariaDB and Phidget drivers](https://www.raspberrypi.org/forums/viewtopic.php?f=31&t=12859)

コンパイルするために必要なものをインストールします。(以下はすべてpiで行っています)

```bash
sudo apt-get install cmake libncurses5-dev bison
```

本家からソースをダウンロードしてきます。
[Database Downloads at MariaDB](https://mariadb.com/resources/downloads)

任意の場所において、展開します。

```bash
tar xvf mariadb-10.1.13.tar.gz
cd mariadb-10.1.13
```

コンパイルとインストールを行います。(あわせて1時間くらい？)

```bash
cd BUILD
./autorun.sh
cd ..

./configure
make
sudo make install
```

configureにて特に設定をしていなければ /usr/local/mysql にインストールされます。

# 初期化
mysqlグループとユーザーを作成し、インストールフォルダの所有者を変更します。

```bash
sudo addgroup mysql
sudo useradd -g mysql mysql
 
sudo chown mysql:mysql -R /usr/local/mysql
```

データベースの初期化を行います

```bash
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql
```

普通はこれで問題なく完了するはずなんだけど、自分の場合は
**「ねえ、mysqldがないんだけど、ちゃんとmake installした？」**
と言われたので「してるよ！」と思いながら原因探し。

結果、apt-getで入れていたmysqlのゴミが残っていた事が原因だとわかった。
[Ubuntu 11.04 に MySQL5.5をソースからインストールしてみたら「FATAL ERROR/ Could not find mysqld」って言われて困った/ 猫目 ΦωΦ)]
(http://blog.neko.me/article/47602677.html)

わかったのでmysqlとつくものを探して、ソース以外を全部削除。
もういっかいmake installしたら動きました。
もしDBが既にある人はDBを消さないように注意してください。

```bash
sudo find / -name mysql
```

Raspbianもsystemdになったんだなー、としみじみしながらsystemdに登録。

```bash
sudo ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/
sudo systemctl daemon-reload
sudo systemctl start mysql
```

これでサービスが起動するはず。

後はいつも通りMariaDBの設定をしたら完成！

```bash
sudo su mysql -c /usr/local/mysql/bin/mysql_secure_installation
```

お疲れ様でした！

あとで見直してみると特に変わったことはしていない模様・・・。
普通に別のディストリビューションでも出来そう。

間違いがあったり、うまくいかない場合は指摘をしてもらえると助かります。
SafariのAdblockかけた時のエラーを回避

Safariの[Adblock](https://safari-extensions.apple.com/details/?id=com.betafish.adblockforsafari-UAMUU4S2D9)という拡張機能をオンにした時、一部ページが表示されないという事で対応したのでそのメモを。

## 拡張機能によるエラーの追い方
今まで拡張機能あるなしという環境の違いでの改修をしたことなかったので、一応手順を書いておく。
### 開発環境で再現できるか？
まずこれを確認するのが大事。
できるだけ報告された環境に近づけつつも、本番環境でしか起きないとなるとやっかい。。
今回の場合は、Mac/Safari/Adblockオンで再現できたので非常にやりやすかった。
本番環境でしか起きないときは、限りなく近い環境にしたテスト環境みたいなのを構築した上で進めていく事になる。
JSだけのエラーなら開発ツールを駆使すればできなくないかも？(これは試してません。)

### 1. 開発ツールでエラーを確認
今回は開発環境で再現できたので、その時の対応。
再現した開発環境で開発ツールを開き、エラーが出ていないかを確認。
詳しくわからないけど、拡張機能はJSでいろいろブラウザにやらせるみたいで、JSがエラーになっている事が多いみたい？なので、JSのエラーをまずは確認した。

## 2. 実際の対応
実際に確認してみると、fingerprintがエラーになっていて、このページではfingerprintをできればとりたいぐらいの部分だったため、無理ならtry catchでスキップできるようにした。
こんな感じ。

```
 try{
   var fingerprint = new Fingerprint({canvas: true}).get();
   $.cookie('fingerprint', fingerprint, {expires:365, path:'/'});
 }
 catch (e) {
   // fingerprintがなくても支障がないので、取得できなかったら何もしない
 }
```

tryにかかれている処理がエラーになったらcatchにかかれた処理を行う。
（逆にtryでエラーにならなかったら、catchは行われない。）
取れなかった時の対応はなしで良いと今回は判断したため、catchに処理はかかなかった。
APIGatewayのHTTP ProxyでKintoneのREST APIを呼ぶ（２）

[前回](http://qiita.com/monamu/items/a257a57e3236fca91ddc) からだいぶ期間が空いてしまいましたが、Amazon APIGatewayのHTTP Proxyを使ってKintoneのREST APIを呼び出す続編です。

__注意__
__kintone REST APIは同時アクセス数がドメインごとに10と制限されています。__

> ドメインへの同時アクセス
> 　・APIによる同時アクセス数はドメインごとに10が上限です。
>
> [REST APIの共通仕様](https://cybozudev.zendesk.com/hc/ja/articles/201941754-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98#step12)

実システムで利用する場合は、API Gatewayのスロットリング設定やエラーのリトライなどを考慮する必要が有ります。

注意ここまで


# 今回のゴール

Kintoneからエラーが返されたらAPIGatewayもエラーとなるようにしたうえで、Methodをデプロイします。

# Kintone REST APIのエラーについて

[REST APIの共通仕様](https://cybozudev.zendesk.com/hc/ja/articles/201941754-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98#step10) によると、

> HTTPステータスコードが「200」であれば正常終了、それ以外はエラー終了です。 エラー時には下記情報を含むJSONデータをレスポンスとして受け取ります。

だそうなので、APIGatewayのIntegration ResponseでKintoneからのHTTPステータスコードを判定します。
判定基準としては2xx以外はすべて400 BadRequestで返すことにしましょう。

# APIGatewayの設定

## Method Response

HTTP Statusとして400を定義します。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/f3e0fb58-48b6-ba5e-3901-1db61a06268c.png)

## Integration Response

HTTP endpoint（今回はKintone）からのHTTP statusが2xx以外はMethod response statusが400になるように設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/fff16c49-dc09-ebfd-0f72-b2b2ca2d466a.png)

## Method をテスト

前回と同じようにBodyを空にしてテストを実行します。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/4263fb9d-6cd9-d3e2-f24f-b7ac763d1d5d.png)

期待通り、APIGatewayのResponseが400になりました！

## デプロイとStage Variablesの設定

Methodを"prod"という名前のStageにデプロイしてから、Stage Variablesを編集します。（StageNameはなんでもいいです）

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/63c9f471-6363-000e-8220-94c9cd355e96.png)

# 呼ぶ！

```bash
$ curl -X POST -H "Content-Type: application/json" -d '{"item1":"request from curl","日本語項目":"curlから送信"}' "https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod" 
```

結果（curl)

```bash
{"id":"16","revision":"1"}
```

結果(Kintone)

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/1077f359-40ed-f214-9338-676d40502265.png)

やりました！ これでKintone隠蔽した状態でKintone REST APIを呼び出せるようになりました。

# 緊急ニュース

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/f61ba7d0-5548-5fee-3998-3558ecf147c2.png)

つい先日、CloudFormationがAPIGatewayをサポートするようになりました！
ここまでやったことが一気に作成できてしまいますので、次回はCloudFormation化とCORS対応を一気にやってしまいたいとおもいます。

では！
名前空間を作って他の人との協業に備える


# 名前空間ってなんだ？

なんだか漫画喫茶の名前みたいだけど、クラスみたいな集合に名前を与える事で、誰かと一緒にjsを書いたりする時に例えば、init()って関数を作った時に、他の人もinitって書いてたら上書きしちゃって不具合起きちゃうので、関数の前に所属を書きましょう。って話。プログラムによっては、
NameSpace::init()
みたいな明示的な書き方するのもあるけど、JSには存在してないので、Objectの型の中に突っ込んでいくっていうスタイルでJavascriptでは実装をするのが一般的みたい。考え方としては、Classの生成に近いかもしれない。



# とりあえず作ってみる

名前をMATEっていう空間を作成。名前空間っていうかクラスだな。。

```lang:sample.js

MATE = (function () {

  function MATE(){
    this.name = "no name";
  }
  MATE.prototype.introduce = function() {
    alert("私の名前は "　+　this.name);
  };
  return MATE;
})();

```

こんな感じ。で使う時には、

```lang:sample.js
var who = new MATE();
who.introduce();
```


ってすればいいので、
whoとMATEさえかぶらなければ、関数は自由に作れる。

```lang:sample.js
var who = new MATE();
who.introduce();

var who2 = new MATE();
who2.introduce();
```

こうやると、２回呼ばれるのですが、ちょっとわかりずらいので、MATEのコンストラクタを変更して、

```lang:sample.js
MATE = (function () {

  function MATE(_NAME){
    this.name = _NAME;
  }
  MATE.prototype.introduce = function() {
    alert("私の名前は "　+　this.name);
  };
  return MATE;
})();
```

みたいに初期登録時に文字列登録できるようにして、

```lang:sample.js
var tom = new MATE("tom");
tom.introduce();

var brown = new MATE("brown");
brown.introduce();
```

ってやると、別の名前を呼ぶので、違うのが呼ばれてるなっていうのが分かるかと思います。

クラスじゃんって思うんだけど、名前空間ってした方がよいのかな？って。

よくわからないけど、これで他の人と作業しやすくなったかと。名前空間の作り方もprototypeを外に出してたりする人もいたりするので、一緒に作る人とスタイルをすり合わせた方が、なんとなく見やすいかも。