OmniAICreator/Qiita-1.07M huggingface dataset:
Genny: Elegant generics for Go

GoでGenericsの話題で盛り上がってるのに刺激されて、Gennyを使ってみた所感を書いてみます。
[Elegant generics for Go](https://github.com/cheekybits/genny)

[golang と Generics と吾](http://qiita.com/yuroyoro/items/6bf33f3cd4bb35469e0b)　の記事で、
[@nobonobo さんがGennyの例](https://gist.github.com/nobonobo/6f1a5c47cb86b382fe354f2dcd702e99)を紹介されています。

# Goでコード生成

Goの言語設計は、シンプルさ読みやすさ重視なので他の言語で用意されている便利な機能が
なくて物足りなくなることもあります。そういった便利機能は書くときに便利な機能で、読みやすさを損なうことが多いです。実際に実務で使って見ると、なくてもそんなに困らないし、読みやすさの恩恵の方が大きいと感じます。
それでも、やっぱりBoilerplate Codeはだるいし、interfaceはオーバーヘッドがあるしで
コード生成するというのが落としどころではないかと思ってます。

# コード生成辛い

text/templateとかでコード生成しようかと思うけど、辛いです。
コード生成用のテンプレートを書くのが辛い。IDLの支援はないし、テストはやりにくい。
生成されたコードが汚かったり、読みにくかったり、最適なコードを生成するのが難しかったり、、

# そこでGenny

Gennyは完璧ではないですけど、この辺を楽にしてくれます。
Gennyでは、GoのコードからGoのコードを生成するので、IDLの支援を受けられれますし
試験も比較的描きやすいのです。

仕掛けは、generic.Type型を使ってコードを書くと、ASTをパースしてコードを生成してくれます。

``` golang
type KeyType generic.Type
type ValueType generic.Type
```

READMEの例

``` Go
package queue

import "github.com/cheekybits/genny/generic"

// NOTE: this is how easy it is to define a generic type
type Something generic.Type

// SomethingQueue is a queue of Somethings.
type SomethingQueue struct {
  items []Something
}

func NewSomethingQueue() *SomethingQueue {
  return &SomethingQueue{items: make([]Something, 0)}
}
func (q *SomethingQueue) Push(item Something) {
  q.items = append(q.items, item)
}
func (q *SomethingQueue) Pop() Something {
  item := q.items[0]
  q.items = q.items[1:]
  return item
}
```

が

```　shell
cat source.go | genny gen "Something=string"
```

で

``` Go
// This file was automatically generated by genny.
// Any changes will be lost if this file is regenerated.
// see https://github.com/cheekybits/genny

package queue

// StringQueue is a queue of Strings.
type StringQueue struct {
  items []string
}

func NewStringQueue() *StringQueue {
  return &StringQueue{items: make([]string, 0)}
}
func (q *StringQueue) Push(item string) {
  q.items = append(q.items, item)
}
func (q *StringQueue) Pop() string {
  item := q.items[0]
  q.items = q.items[1:]
  return item
}
```

# でも万能ではないです、、

使ってみたのですが、
generic.Typeを操作したり、メソッドを読んだりできないのが不便でした。
generic.Typeはinterface Xを実装すること　とか書けるといいのですけど、、
（なので未だに泣く泣くtext/templateを使ってます）

つまりは、こういう記法をサポートしてほしいなと思います、、
まぁ書いてPR送ればいいんでしょうけど。

```
//Something ..
//genny.GenericType
type Something interface {
	Method1() Something
}
```

# 追記

無理やりこうすればできるっぽい、、hackyですけど

``` golang
package genny

import "bytes"

// NOTE: this is how easy it is to define a generic type

//Something ..
type Something interface { //generic.Type
	String() string //generic.Type
} //generic.Type

// SomethingQueue is a queue of Somethings.
type SomethingQueue struct {
	items []Something
}

func NewSomethingQueue() *SomethingQueue {
	return &SomethingQueue{items: make([]Something, 0)}
}

func (q *SomethingQueue) Push(item Something) {
	q.items = append(q.items, item)
}

func (q *SomethingQueue) Pop() Something {
	item := q.items[0]
	q.items = q.items[1:]
	return item
}

func (q *SomethingQueue) String() string {
	var buf bytes.Buffer
	for _, item := range q.items {
		buf.WriteString(item.String())
	}
	return buf.String()
}

```
jQuery Mockjax で Web API 非同期通信のシミュレート 

# 概要
JQuery を使用した UI 開発で、非同期通信で、Web API サーバにアクセスし、
レスポンス戻り値によって、画面表示を切り替える機能などを実装したいが、しばらく WEB API の準備が間に合わないらしい。
そのような状態で、UI開発を進める必要があった場面で、出会った jQuery Mockjax という、便利なプラグインのメモ。

# jquery-mockjax
相手先に通信しなくても、ローカルで、非同期通信のリクエストとレスポンスを、シンプルにシミュレートできる。超簡単。便利プラグイン。
[jQuery Mockjax: Ajax request mocking](https://github.com/jakerella/jquery-mockjax)

# 準備
- 上記ライブリのソースをクローンして、distディレクトリに格納された、jquery.mockjax.js をHTML側で読み込む。




- APIシミュレーション用のファイルを作成し、シミレート用のAPIを実装し、そのファイルをHTML側で読み込む。

```api_test.js
//API テスト
$.mockjax({
    url: 'http://localhost/heyapi',
    //正常な場合
    status: 200,
    responseText: {
        data1: "hello",
        data2: 5,
    },
});
```

```index.html
<label>HEY : <input type="text"></label>
<button id="sendApi">送信</button>
<h1>結果 : </h1>

<script src="js/lib/jquery-3.1.1.js"></script>
<script src="js/lib/jquery.mockjax.js"></script>

<script src="js/test/api_test.js"></script><!--TODO APIの準備ができたらお疲れ様-->
<script src="index.js"></script>
```

- 画面用の ajax 通信処理を実装する。

```index.js
//送信ボタン押下時の処理
$("button#sendApi").click(function () {
    let apiUrl = "http://localhost/heyapi";

    $.ajax(apiUrl, {
        type: 'GET',
        data: "heyhey"

    }).done(function (data) {
        console.log(data);
        $("h1").append("OK!");

    }).fail(function () {
        $("h1").append("Error....");

    });

});
```

- モックのレスポンスを変更し、正常系、異常系、値によっての画面更新処理などを実装していく。

```api_test.js
//API テスト
$.mockjax({
    url: 'http://localhost/hey',
    //正常な場合
    /*
    status: 200,
    responseText: {
        data1: "aaa",
        data2: 5,
    },
    */
    //エラーの場合
    status: 401,
    responseText: {
        msg: "権限がありません。。"
    }
});
```

- サーバサイドで API が準備できたら、APIシミュレーション用ファイル (api_test.js)の読み込み部分を削除

以上

# 感想
シンプル。実際の WEB API の準備ができて、結合で一発で決まったらとても気持ちが良い。
雑談：AndroidでMVVMを実装するとき

MVVMについての雑談のメモ

### どこに実装するか

- ViewModelとModelを分けると実装が面倒だよね。一緒で良いんじゃない？
- 一緒にしたら条件で表示を分けないと行けないから分けておいた方が良いんじゃない？
- なんかめんどくさいからDataBindingの変数定義でViewDataBindingのクラスが生成されるから、それをViewModelとして扱うのが良いんじゃない？
  - それはそれで乱暴な気がする

みんなバラバラ

### アニメーションについて

- Model→ViewModel→Viewをガチガチにやっちゃうと、エッジケースで変更した時にアニメーションさせたくても難しくない？
  - BindingAdapterメソッドにアニメーションのコードを押しこんだら良いんじゃない？
mLabが使えなくてつまった件(solved!)

ローカルからサーバー公開用に移すのは億劫だ
大体設定とかいろいろ詰まるに決まっている
今回もそうだ。結局詰まる。
「mLabというmongoDBを使えるDaaS（？）がよい」
と書いてあったので、使ってみるがcloud9から繋がっていない様子。
herokuでデプロイは成功しているみたいだけれども
dbにつながらないから動いちゃくれない。
単純にcloud9からmLabのDBに「コレクションありますか～？」とかそんなことを聞きたいだけなのに
そこから、もう、繋がっていない感じ。
そもそもだけれど、heroku上のログとか調べてみたらわかる、という確信を書きながら思った。
ログが見れないとか、ないはず（たぶん）だから、もう一度、探してやってみよう。
なんかこういう詰まり方は楽しくないよなぁ。

##追記：次の日

解決しました。

くそはまりどはまり先生（イミフ）でしたがなんとかできました。

mLabのmongoDBバージョンと、cloud9側のmongoDBバージョンが（だいたい）一致していないといけなかったみたいです。mongoDB自身のバージョンアップで動かないんですね。はい。

`# monogo -version`
で確認できます。

2.~.~系と3.~.~系を一緒に使うと「見る権限ないから！」と叱られるみたいです。はい。

じゃあ簡単ですね。cloud9上のmongoDBをバージョンアップさせればよいだけのはずですから。

えーと。たしかmongoDBのインストールのときもなかなかうまくいかずにいろいろやりましたよ、わたし。

`# sudo apt-get install mongodb-org` 
これをやるとできましたよね。はい。
（参照：https://community.c9.io/t/solved-mongod-command-not-found/6517/2）
(「cloud9側の仕様？とかプレインストールの権利問題？とかでなんか入れなおさないとmongoDBが使えないとかなんとか」)

インストールにさえ苦労したのに、バージョンアップとか……
でもやってみれば案外簡単かも！（結構めんどうくさかったです。はい）

結論このページを参照しました！（http://tk2-207-13211.vs.sakura.ne.jp/2016/10/905/）
まずmongoDBをアンインストールして、
次に最新版をインストールする！

`# suto apt-get autoremove mongodb-clients`
→修正
`# sudo apt-get autoremove mongodb-org`

あと、公式のやつ（https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/）を参照して順番にやるだけ。

cloud9上のターミナルでcloud9のubuntuバージョンを確認
`# lsb_release -a`
(参照：http://ubulog.blogspot.jp/2007/06/ubuntu.html）

なんどもmongoDBを入れたり外したりしてたので、
`# mongod --smallfiles`
でmongoを起動したら「mongo.lockが残ってるぞ、おいごら」ってしかられたりもしましたが、それも解決しました。

「mongo.lock* ファイル探して消して
`# mongo --repair`
したらええやん」
って書いてありました。
「よくある、よくある」とも。
（参照：https://www.mkyong.com/mongodb/old-lock-file-datadbmongod-lock-probably-means-unclean-shutdown/）

##まとめ（？）：

今回のくはまりどはまり先生の理由についてまとめてみる。
#１．mLabという方の仕様をよく理解していなかった
→そんなもん、初めて触るんやからしょうがないやろ。と思いつつ、mLab自体はそんな複雑な仕様もなく、かなり簡単なつくりにはなっているようでしたが、「DBはいっこやで。コレクションはたくさんつくってもええけどな」的なつくり、っていうのは、すこしつまづきました。苦労して、バージョンアップを確認したのち、mLabで表示されているコードでやっとDBにつながったあと、DBにつながっているのかの確認で、
`# [mongo] show dbs`
って打ったら、「権限ないんじゃ、われぇ、でなおせ！」って叱られたからです。すこし焦りましたが、深呼吸一つ。
`# [mongo] show collections`
って打ったら、さーっと表示されました。
cloud9上にDBを置いてある場合はデータベースもコレクションも適当に作ったり、参照したりしていた身としては、「あーそうっかー」的な感じでした。まぁ、DBをたくさん扱って来た人にとってはDaaS（？）の仕様としては、当然なのかもしれませんが。
あとcollection毎にユーザーとかパスワードとか、設定してからじゃないと接続できない、ってこれは仕様というよりDBさわる人には常識（？）なのでしょうか。まぁ、どっちでもいいんですけど。

#２．unix系という方の扱い
→設定とか環境構築とか面倒くさいし、意味不明だし（単なる勉強不足）、という感じで「環境構築すっ飛ばせる、cloud9すげぇぇぇぇ！」ってなってた私ですが、まぁ、当然、そこにunixやらlinuxやら、ubuntuやらでてきたら、「うげぇぇぇぇ！」ってなりますよね。
まぁ、でも少し触れたので今回わかったことを書いておきます。
`# sudo apt-get ~~~(動詞) ~~~(目的語)`
的な使い方でなんとかなる
`# yum ~~~~~`
は使えない、ということ（あほ）。
じつは前にほんのすこし（ほんとうにすこし）だけubuntuをさわったことがあって（なんで触っていたのかは覚えてない）、mkdirとか、rmとかvimとか（vimは開いたけど、慣れなくて、くそ面倒くさいのでそのままvimの閉じ方を検索した)まぁ、そこらへんが少しだけ役にたったかな、と。

#所感
まぁ、一番つまるだろうなぁ、と思っていたところで、まぁ、結局つまったわけだけれども。
「mySQLとかpostgresSQLとか面倒くさそうだなぁ、mongoDBのほうがherokuでデプロイするのがかんたんそうだなぁ」と思ってやって、結局このはまりよう。乙。
ま、一番大きなつまりポイントを克服できたんじゃないだろうか、と勝手に思っている。

追記：地味ながら重要なことheroku上のログをみること
`# heroku logs -t `
（参照：http://qiita.com/pugiemonn/items/c4077958b480eb29878d　）
とすること。cloud9の疑似ローカル環境とheroku上の本番（？）環境とはどうしても差異が生まれるので、そこのログをキャッチしないことには、このはまりは解決できなかった。書き終わった後になって「なんか書いてみると紆余曲折あんまりしてないなぁ」とか思ってたけど、herokuのログを見れる、ってことは地味ながら重要。重要。
Mac から GitHub へ Push するとき、古いアカウントで Push してしまう場合の対処方法

# 結論
- 原因
    - `credential.helper=osxkeychain` が設定されているため、Mac のキーチェーンでアクセスしようとしてしまう
- 解決策
    - キーチェーンに古いアカウントの情報が残っている
    - キーチェーンアクセスから github.com の古いアカウント情報を削除すれば OK

# エラー例
```
$ git push origin master
remote: Permission to itooww/itooww.git denied to old_itooww.
fatal: unable to access 'https://github.com/itooww/itooww.git/': The requested URL returned error: 403
```

# どういう場合に発生するか
- GitHub の古いアカウント情報が Mac のキーチェーンに保存されている
- 新しく作った GitHub アカウントでプロジェクトを作成して push しようとするなど

# キーチェーン認証が設定されているか確認
```
$ git config --list | grep credential.helper
credential.helper=osxkeychain
```
alias g="git" を許さない

# alias g="git" を許さない
`alias g="git"` なんていう横着コマンドがよく.bashrcに見受けられます。
そのような方たちは、そんなgitと打つのすら横着するような姿勢でこの情報化社会を
生き延びていけるとお思いなのでしょうか？？？？

断固としてそのような態度は許せません。

# 救世主 G あらわる

`g` なんてものを打つんですからそんなやつには `G` つまり「ゴキブリ」を走らせてやればよいわけです！

```sh
alias g='for i in `seq 0 $(($COLUMNS-8))`; do printf "\r%*sゴキブリ " "$i" " ";sleep 0.1;done;echo '
```

上のコマンドをそんなやつらの bashrcに書き換えてやりましょう
slのようにゴキブリが走ります
![](http://sagisawa.0am.jp/etc/g.gif)

# 結論
まあ、`alias g="git"` 使うんですけどね。

# 謝辞
このコマンドは@nonylene先生に作成してもらいました。
@nonylene先生は神
Laravel の Config はキャッシュに気をつけるべき

Laravel の Config はキャッシュされるので、かなりはまった。

特にCI周りでは注意が必要。

# 優先順位

`bootstrap/cache/config.php` > `phpunit.xml` > `.env` 

なので、ユニットテスト時に `DB_HOST` を変える、などしたくてもキャッシュされている場合うまくいかない。

なので、こういうコードで解決した。
他にいいやり方があれば教えてほしい。

```php:tests/TestCase.php
<?php

class TestCase extends Illuminate\Foundation\Testing\TestCase {

    // ...

    public function createApplication()
    {
        // testing 環境でもlocal 環境を見に行ってしまうため
        // キャッシュを読み込まないようにしている
        // TODO: もっとエレガントな方法を模索する
        if (file_exists(__DIR__.'/../bootstrap/cache/config.php'))
            unlink(__DIR__.'/../bootstrap/cache/config.php');

        $app = require __DIR__.'/../bootstrap/app.php';

        // ...

        return $app;
    }
}
```

`$this->artisan('config:cache')` は `$app` が未定義の状態ではできない。
かつ、恐らく `$app` が生成されると、その時点で環境変数を読むため、実質不可能である（要調査）。

# 環境変数

`php artisan config:cache` する時、

`環境変数` > `.env` 

となるので、

```bash:/etc/profile
export APP_ENV=testing
```

```bash:.env
APP_ENV=local
```

の状態で `php artisan config:cache` すると

`APP_ENV=testing` となる。
PDOとメモリ

http://php.net/manual/ja/mysqlinfo.concepts.buffering.php

> クエリは、デフォルトではバッファモードで実行されます。 つまり、クエリの結果がすぐに MySQL サーバーから PHP に転送され、 PHP プロセスのメモリ内に結果を保持し続けるということです。 これで、その後で行数を数えたり結果ポインタを移動 (シーク) したりといった操作ができるようになります。 また、同じ接続上でさらに別のクエリを発行しつつ、 現在の結果セットを使った作業をすることもできます。 バッファモードの弱点は、結果セットが大きくなると大量にメモリを消費するということです。 結果セットへの参照がなくなるか、結果セットを明示的に解放する (リクエストを終了すると、自動的に解放されます) まではメモリ上に残り続けます。 バッファモードは「結果を格納する」クエリとも呼ばれます。 ここでは、結果セット全体が一度に格納されます。


```php:php

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
   while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
       echo $row['Name'] . PHP_EOL;
   }
}

```
GitのインストールからPushまで

# Git使ってたけど、ちゃんと手順的にまとまってるところってほぼ皆無。

## コマンド打ってエラーが起きてる画面なんて大嫌い。
小学生の頃から嫌いだったこと。
それはコマンドプロンプト、ターミナルで、
コマンドを間違えて、エラーが出てくるところでした。
打っていたコマンドが見えなくなる上に、
無駄にエンターキーとか押してるエンジニアとかのコマンドラインを見てると正直
**生理的に無理っす**
って画面も見たくなくなるし、見せたくない。

# Gitインストールをエラー無くインストールしたい。
## 下準備はXcodeのアップデート。
Xcodeのバージョンが古いと
**エラー出る**
この段階で生理的にターミナルの内容をすっからかんにしたくなるので、
最初にXcodeのアップデートをしておく。

## Homeberewのインストール
[Homebrew](https://brew.sh/index_ja.html)
ここの一文を丸コピ
`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
とりあえず最新に更新
`brew update`
上記で確認。

## Gitインストール
`brew install git`
上でインストールができる。
`git –version`
上記でGitのバージョン確認。

とりあえずここまででGitの準備はできたよ。

# Git使うべ。
## とりあえずLinuxコマンド予習します
ターミナルで色々やる。
`cd .. //ディレクトリを移動するときに使うやつ`
カレントディレクトリって作業フォルダに移動するときに使うやつ。
`pwd`
フルパスで現在の作業ディレクトリを表示。
これが意外と大切だったりする。
Gitのリポジトリの落とす先を間違えてないか確認。
`ls`
ディレクトリの中身を確認。
`ls -a`
で全件表示。

## Gitリポジトリクローンしてこよう。
`git clone リポジトリのアドレス`
上だけ。
落としてきたGitのディレクトリに移動
`git status`
Gitの状況を確認。
`git branch`
Gitのブランチを確認
Cloneしてきた段階だとMasterに居るはず。

## ブランチ作る。
`git branch ブランチ名`
`git checkout 作ったブランチ名`
って二行書くのは**めんどくさい。**
だから
`git checkout -b 新しいブランチ名`
上でブランチの作成ト切り替えを一気に行う。

で
`git branch`
で現在位置を確認。

## はいはい。Gitのブランチで作業した。
作業内容は
`git status`
で確認

## 作業内容保存しよう。
`git status`
で確認した内容に問題がなければ、
`git add -A`
で一括Gitに追加しちゃう。
`git commit -m "今回作業した内容のコメントを記入"`
上記でコメントを追加した上でコミット
`git push origin 作業したブランチ`
でブランチに対してのPush
（リモートのリポジトリにブランチが追加、変更内容が追加されているはず。）

## 後はブラウザでマージ作業して完了。
これでターミナルで変なエラーとかのメッセージも無くできるはず。
mysqldumpコマンド

###全DB
mysqldump -u <ID> -p --all-databases > output.sql
###table選択
mysqldump -u <ID> -p testdb testtable > output.sql
###カンマ区切り 且つ 文字列"挟み
mysqldump -u <ID> -p -T output.sql --fields-terminated-by=, --fields-optionally-enclosed-by=\" testdb testtable
###insert文のみ
mysqldump -u <ID> -p -t testdb > output.sql
###create文のみ
mysqldump -u <ID> -p -d testdb > output.sql
###条件付き
mysqldump -u <ID> -p -w"id<=100 and name like 'yamada%'" testdb testtable > output.sql
###インポート
mysqldump -u <ID> -p testdb < output.sql
sympyで円と直線の交点 Intersection of Circle and Line

(参考)演習6より＜

https://qiita.com/tibigame/items/61cecf86fc978628bfee#%E6%BC%94%E7%BF%92

```python
#sympyで円と直線の交点
from sympy import *
var('xm ym r x1 y1 x2 y2')
ci=Circle(Point(xm,ym),r)
ln = Line(Point(x1, y1), Point(x2, y2))
result=ci.intersection(ln)
input={xm:0,ym:0,r:1,x1:0,y1:Rational(1, 2),x2:-Rational(1, 2),y2:0}
print(sympify(result[0]).subs(input),sympify(result[1]).subs(input))
#Point2D(-1/4 + sqrt(7)/4, 1/4 + sqrt(7)/4) Point2D(-sqrt(7)/4 - 1/4, -sqrt(7)/4 + 1/4)
```
YAPC::Kansai 2017 OSAKA のスライド、ブログなどリンクまとめ（非公式・跡地）

# 追記
公式さんのまとめが公開されました！
ということで、公式さんのまとめをご覧くいただくのが良いかと！

YAPC::Kansai 2017 OSAKA エントリまとめ - YAPC::Japan 運営ブログ
http://blog.yapcjapan.org/entry/2017/03/16/210517

# 以下、古い情報です

# まえおき

- おそらく公式さんが作成されるのかなと思いつつ、意外となかなか作成されないような雰囲気も感じられたので、まとめてみます。
- 非公式まとめです。
- 完成度は高くないと思いますすすみません。編集リクエスト歓迎します。
- でも公式から立派なものが公開されたら紛らわしくなると申し訳ないので削除すると思います。

# 公式サイト

YAPC::Kansai 2017 OSAKA
https://yapcjapan.org/2017kansai/

# 公式ハッシュタグ

[#yapcjapan](https://twitter.com/search?f=tweets&vertical=default&q=%23yapcjapan&src=typd)

# セッション発表資料

GUEST: 深沢 千尋
http://blog.kanpee.club/archives/19430116.html

# おまけ

YAPC::Fukuoka 2017 HAKATA
http://yapcjapan.org/2017fukuoka/

#家に帰ってBlogを書くまでがYAPC
~~私の YAPC::Kansai はまだ終わっておりません。。（；；）~~
書いたので終わりました v(^_^)v

YAPC::Kansai 2017 OSAKA に少し参加した感想など - haya2’s hatenablog
http://haya2.hatenablog.com/entry/2017/03/05/230711
sublime text 3にview in browseを入れたが実行出来なかった記事

#初投稿にあたって
---
慣れないMark down記法を用いた初めての投稿となります。プログラミングもそこまで出来ません。読みづらい、分かりづらい、配置センスがないなど多々あると思いますが、何らかしら役に立てたらと思っております。

##はじめに
OS Xでsublime text 3にview in browseを入れてみたがあまりに稚拙なミスで動かなかったので、同じ現象で動かないって人に参考になったらいいなと思います。

##Macにsublime text 3のview in browseを入れて実行してみた

view in browseとは、sublime textのパッケージの一つで、作成したhtmlファイルをショートカットキーなどでブラウザプレビューすることができます。

例えば下記のようなhtmlファイルを実行するとブラウザー上に反映してくれます。

```html
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
	<body>
	<b>hellow world</b>

	</body>
</html>

```

<img width="456" alt="スクリーンショット 2017-03-10 22.31.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/154154/7c0fc749-21d9-f0e3-4359-443e3a9807f8.png">

プログラムを作成しながらコマンドで実行できるって便利ですよね。導入方法についてですがいろんなところで紹介してるのでこの記事では割愛します。


##sublime text 3にview in browseを入れて実行が出来なく悪戦苦闘した記録


結論から言うと、作成したhtmlファイルを入れるフォルダー名が
>ファイル 名

のように半角スペース" "が入っているとうまく実行出来ないみたいです

例としてuntitled.htmlを
>動か ない

と名前をつけたフォルダー内に保存してview in browserで動かしたところコンソール画面には

```
View In Browser plugin v2.0.0, Python 3
open -a "/Applications/Safari.app" file:////Users/UserName/Documents/.../.../動か%20ない/untitled.html
```
と表示されました。
htmlファイルを開く際のフォルダーのpathの「動か ない」の部分が「動か%20ない」に変わってますね。
ファイルを開く際のフォルダーのpathが違うので上手く実行出来ないのは当然ですね。
とても稚拙なミスに気づくのに2時間近く試行錯誤してしまいました。


ちなみにフォルダー名を
>動　く

にしてフォルダー名に全角スペースを入れて中にあるhtmlファイルをview in browserで実行したところ上手く実行出来ました。

どうして半角スペースで実行出来なくて全角だと実行できるのかは原因不明です。

##ついでに
Sublime Text > Preferences > Package Settings > View in Browser > Setting User
で使用するブラウザを増やしたり選択することができます。デフォルトではfire foxが起動するようなっていたので、Userの設定でデフォルトでsafariが起動するようにしました。下のコードをSetting Userに貼り付けるとデフォルトでsafariが起動します。

```
{
	"posix": {
		"linux": {
			"firefox": "firefox -new-tab",
			"chrome": "google-chrome",
			"chrome64": "google-chrome",
			"chromium": "chromium"
		},
		"linux2": {
			"firefox": "firefox -new-tab",
			"chrome": "google-chrome",
			"chrome64": "google-chrome",
			"chromium": "chromium"
		},
		"darwin": {
			"firefox": "open -a \"/Applications/Firefox.app\"",
			"safari": "open -a \"/Applications/Safari.app\"",
			"chrome": "open -a \"/Applications/Google Chrome.app\"",
			"chrome64": "open -a \"/Applications/Google Chrome.app\"",
			"yandex": "open -a \"/Applications/Yandex.app\""
		}
	},
	"nt": {
		"win32": {
			"firefox": "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe -new-tab",
			"iexplore": "C:\\Program Files\\Internet Explorer\\iexplore.exe",
			"chrome": "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
			"chrome64": "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
			"yandex": "%Local AppData%\\Yandex\\YandexBrowser\\browser.exe"
		}
	},

	"browser": "safari"
}

```

対した記事ではないんですが、同じように動かない人がいたら役に立てたらと思います。
rspecで負数のパターンを検証するときのwarningをどうするか

rspecでこんな風な検証パターンを入れたときのこと

```
it { is_expected.to eq -5_000 }
```

そうするとrubocopでwarningが出てしまう。

```
W: Ambiguous negative number operator. Parenthesize the method arguments if it's surely a negative number operator, or add a whitespace to the right of the - if it should be a subtraction.
```

Parenthesize = かっこ ということでカッコが必要だ。
この投稿のコメントをいただいた知ったのですが () で囲んであげれば解決！

```
it { is_expected.to eq(-5_000) }
```

eqと-5_000の間に何もスペースを入れないのがよい。eq (-5_000)だとこんな風に言われてしまう。

```
W: (...) interpreted as grouped expression.
```

あとは、rubocopの設定を調整してもいいんだけど、結果、一旦変数に入れてしまえばOK

```
it do
  expectation = -5_000
  is_expected.to eq expectation 
end
```

毎回上記のような記載をするのもコード的には長くなってしまうのでshared_examplesにしてもいいですね。大体この手のパターンは多数使うこともあるでしょうし。

```
shared_examples do |expectation|
  is_expected.to eq expectation 
end
```
OpenStack Mitakaを構築（Horizon編）

OpenStackの構築といえば、DevStackや、Packstackなどを使う方が多いかもしれません。
Openstackは、その他様々な構築ツールが発表されています。
が、ツールを使わず、私のように一つ一つコンポーネントを導入している~~奇特~~な方は少ないのではないでしょうか。

ということで、今回はOpenStack Mitakaに、GUIダッシュボード機能を提供する、Horizonを導入します。


実行環境は以下のとおりです。
■Ubuntu 16.04


##Horizonのインストール
早速、Horizonをインストールします。

>$ sudo apt-get install -y openstack-dashboard


##設定ファイルの編集
ファイルを編集する前に、ファイルのバックアップを取得します。
>$ sudo cp /etc/openstack-dashboard/local_settings.py /etc/openstack-dashboard/local_settings.py.org

それでは、ファイルを編集していきます。
>$ sudo vi /etc/openstack-dashboard/local_settings.py

```local_settings.py
...
OPENSTACK_API_VERSIONS = {
	"data-processing": 1.1,
	"identity": 3,
	"volume": 2,
	"compute": 2,
}
...
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
...
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'default'
...
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
	'default': {
    	'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    	'LOCATION': 'controller:11211',
	},
}
...
OPENSTACK_HOST = "自身のOpenStackホスト名を指定"   ←例："192.168.2.4"
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
...
TIME_ZONE = "Asia/Tokyo"
...
ALLOWED_HOSTS = ['*', ]
...
```


Webサービスの設定を再読み込みます。
>$ sudo systemctl reload apache2

>$ sudo systemctl status apache2

ここまでできたら、以下のURLにアクセスできるはず。
**http://\<OpenStackが構築されているホストのIPアドレス>/horizon**

と・こ・ろ・が！
とある資料では、上記のみの手順となっていたのですが、
これだけでは、URLにアクセスしても、タイムアウトエラー（500エラーだったかな。。。）が発生し、
Horizonにはアクセスすることができません。


##エラーが発生したら
色んなサイトを漁りに漁り。
ようやく、ヒントが見つかりました。
英語ですが、以下のサイトが参考になりました。
[参考サイト](https://bugs.launchpad.net/horizon/+bug/1573488)

どうやら、以下のファイルを編集するようです。


>$ cd /etc/apache2/conf-enabled

>$ sudo vi openstack-dashboard.conf


```openstack-dashboard.conf
WSGIProcessGroup horizon   ←元々記載あり
WSGIApplicationGroup %{GLOBAL}　　←この記載を追加
```

WSGIApplicationGroupの１行を追加したら、再度、Webサービスの再読み込みをします。

>$ sudo systemctl reload apache2

>$ sudo systemctl status apache2

これで、改めて以下のURLにアクセスします。
**http://\<OpenStackが構築されているホストのIPアドレス>/horizon**

<img width="692" alt="スクリーンショット 2017-03-03 10.15.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/167745/270a2446-5a6f-80e4-4fa9-d35da35ed978.png">

無事、Horizonが起動しました。

※実際にログインするには、認証用のコンポーネントである、Keystoneを導入している必要があります。
[AWS] 特定のIPアドレスを含むセキュリティグループの一覧を表示する

とある事情で AWS EC2 に設定されているセキュリティグループから
特定のIPアドレスを含む一覧を抜き出す必要がでてきたので
aws-cli で抜き出してみた

```
$ aws ec2 describe-security-groups \
 --filters Name=ip-permission.cidr,Values='xxx.xxx.xxx.xxx/32'
 --query 'SecurityGroups[*].{Name:GroupName, Description:Description}'

[
    {
        "Name": "hoge",
        "Description": "from hogehoge"
    },
     ...
]
  
```


CSV で欲しかったので jq に食わせる

```
$ aws ec2 describe-security-groups \ 
 --filters Name=ip-permission.cidr,Values='xxx.xxx.xxx.xxx/32' \
 --query 'SecurityGroups[*].{Name:GroupName, Description:Description}' | jq -r ".[] | [.Name, .Description] | @csv"

"hoge","from hogehoge"

```
koa-routerの分割

expressでできたんだからkoaでもできる！と意気込んでやってみたことのまとめ

```JavaScript
const Koa = require('koa');
const Router = require('koa-router');
const index = require('./routes/index.js');
const user = require('./routes/user.js');

const app = new Koa();
const router = new Router();

router.use('/', index.routes());    // <-ここで目当てのパスに当てはめる
router.use('/user', user.routes()); // 上に同じ　分割できている！

app.use(router.routes());  // 忘れずにアプリケーションにも設定する
```

以上
Ubuntu mate において、ntp pool が使えない問題を直す

# Overview

ubuntu.pool.ntp.org が 使えなくなっているみたいです。
良い機会なので、日本のNTPの大御所 NICTのntp serverに変更してみます。

```
Mar 10 22:17:54 xxx ntpd[1491]: error resolving pool 2.ubuntu.pool.ntp.org: Temporary failure in name resolution (-3)
```

こんなエラーが出続けている方が対象です。

# ntp.conf で 設定 を 変更する

```/etc/ntp.conf
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
#pool ntp.ubuntu.com

server ntp.nict.jp iburst
```

のようにして、serverをpoolから直サーバーにする。

ntp を再起動しましょう。

```
# systemctl restart ntp
```

ちゃんと設定が反映されているか確認してみましょう。

```
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-b3.nict.go. .NICT.           1 u   45   64    1    3.900   -0.611   0.489
```

みたいにして出ていればOkです。
Let's Encrpytで発行した証明書をPowerShellリモート接続のHTTPS接続にも使ってみる

以前に[Let's Encryptで発行した証明書をRemote Desktopの証明書にも割り当ててみる](http://qiita.com/kazinoue/items/209846d0204caad46522)という話を書いたのですが、Let's Encrpytの証明書をPowerShellリモート接続でも使うことができたので、メモとして残しておきます。

# PowerShellリモート接続とは何か？

PowerShell からリモートのサーバを操作できる機能です。

# 用意するもの

- Let's Encrypt で発行した SSL/TLS 証明書のインストール（ここでは手順は説明しません）
- 証明書のフィンガープリント

(Let's Encryptでなくとも、商用の証明書でもOKですが。）

# 作業手順

## PowerShellリモート接続の受け側を設定する。

基本的には受け側のサーバで Enable-PSRemoting するだけです。

ただし、Amazon Web Services のインスタンスでこれを設定する場合には、これだけではうまく行きません。これについては d-hisame さんのはてなダイヤリーの下記エントリをご参照いただくと参考になります。
http://d.hatena.ne.jp/a-hisame/20131101/1383332166

私の手元には、この件の手順のログが残っていないので、後日補足しようかと考えています。

## 証明書のフィンガープリントを確認する

受け側の機材の PowerShell で "dir cert:\LocalMachine\My" を実行します。ここで出てきた ThumbPrint と FQDNホスト名を使います。

```ps1
PS C:\Users\hoge> dir cert:\LocalMachine\My


    ディレクトリ: Microsoft.PowerShell.Security\Certificate::LocalMachine\My


Thumbprint                                Subject
----------                                -------
0123456789ABCDEF0123456789ABCDEF01234567  CN=ssl.example.com
```

## winrm create を実行して、HTTPS のリスナを作る

winrm create をこんなふうに実行します。

> winrm create winrm/config/Listener?Address=\*+Transport=HTTPS '@{Hostname="**[サーバのFQDN]**";CertificateThumbprint="**[ThumbPrint]**";Port="5986"}'

なお、winrm create -? で表示されるヘルプには @{ ... } がシングルクオートで囲まれておらず、そのヘルプの通りに実行すると絶対にエラーになります。

というわけで、実行例はこちら。

```ps1
PS C:\Users\hoge> winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ssl.example.com";CertificateThumbprint="0123456789ABCDEF0123456789ABCDEF01234567";Port="5986"}'

ResourceCreated
    Address = http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
    ReferenceParameters
        ResourceURI = http://schemas.microsoft.com/wbem/wsman/1/config/listener
        SelectorSet
            Selector: Address = *, Transport = HTTPS

PS C:\Users\hoge>
```

## クライアント側から Enter-PSSession -UseSSL で接続してみる


こんなカンジでクライアント側から接続してみます。

```ps1
PS C:\Users\local> Enter-PSSession -ComputerName [FQDNホスト名] -Credential [ユーザ名] -UseSSL

[ssl.example.com]: PS C:\Users\hoge\Documents> 
```

接続できない場合は各種パケットフィルタ（Windowsファイヤウォール、ネットワーク機器、クラウドサービスのセキュリティグループの設定など）を確認し、5986/TCP が開いていることを確かめてください。


なお、PowerShell ISE で「リモート PowerShell のタブの新規作成」では私の環境ではHTTPS接続できていません。PowerShell ISE をお使いの場合でも Enter-PSSession -UseSSL して頂く必要があるかもしれません。


# しかし、そもそも HTTPS での PowerShell リモート接続は必要なのか？

最後の最後でこんなことを書くのもどうかと思いますが、HTTPS での PowerShell リモート接続の意味や目的を正しく理解することが大事です。

というのも、マイクロソフトの下記URLに掲載の記事によると「使用されているトランスポート プロトコル (HTTP または HTTPS) に関係なく、**PowerShell リモート処理では、常にすべての通信が、初期認証後に、セッションごとの AES256 対称キーを使用して暗号化されます。**」と書かれています。だから暗号化が目的ならば HTTPS での接続は必須ではありません。

https://msdn.microsoft.com/ja-jp/powershell/scripting/setup/winrmsecurity

つまり、こういうことです。

- 接続は HTTP で行っても暗号化されている。
- しかし **HTTPS 接続することで、接続先サーバが正しいサーバであり、Man-in-the-Middleではない、安全な接続がたしかに行われていることを検証できる**。
nginx の設定一覧の出力

nginx の設定ファイル（config）では、includeで複数ファイルを
読み込むことができます。
共通ファイルや特定ドメイン向けの設定をファイルに切り出して……みたいな
使い方をするのですが、
複数ファイルに分けていると最終的にどんな設定になったのかがわかりにくのです。

そんな時には、どんな設定になったかを確認する方法が提供されています。

```
# nginx -T
```

これを実行すると次のような結果が出力されます。

```
nginx: [warn] duplicate MIME type "text/html" in /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
# Elastic Beanstalk Nginx Configuration File

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {

```

便利ですね。
注意点としては、これはすべてのnginxのconfigファイルから読み込んだものを
出力しているだけで、メモリから取得しているわけではありません。

メモリから取得する方法は、[Dump nginx config from running process?](http://serverfault.com/questions/361421/dump-nginx-config-from-running-process)を参照してください。
エンジニアを辞めたい

# エンジニアを辞めたい。
大学を卒業して７年。
１年半はフリーター。
そこからネットワークエンジニア（CCNA取得）でSES１年少し。
業務委託と常駐、自社案件、
Java、PHP、Node.js、AWSとかサーバインフラを見て、
ゲーム運用の派遣に入って、契約打ち切り、
半年間の契約社員後は正社員になるはずだったが、
自社からも雇用止を言われた。

# 理由
## SESの営業が信じられなくなった。
もっと簡単にいえば人を信じられなくなった。
自社の案件で使えなくなれば派遣の資格を持っていれば外へ出す。
そこで認められなければ自社には席がないから契約は終了する。
人を大切にするという概念が無い。
## 技術は底なしに求められる
入った現場で求められる能力はその現場で様々で、
いくら多言語を扱えたとしても、
そこのソース規約、エビデンスの出し方、指示形態
どれも違う。
もっと言えばDBのリレーションから、セグメントの考え方、テンプレの使い分け
全部違う。
常駐したら、大体は３ヶ月ごとの契約、
最初の３ヶ月で覚えるではなく、１週間とか短期間で覚えて、
契約更新月までには居なくてはならない人になれなくてはならない。
## 自分の心は死ぬ
常駐先では営業モード、
常駐先で業務をしているときも営業モード。
現場上長と食事でも営業モード。
自社への報告も営業モード。
自社でのフィードバック面談は営業から、ひたすら自分の悪い点しか言われない。
それを認めて、改善した、改善策はなんだったか、
言葉にできない、でもしなくちゃいけない。
自分の欠点しか見えなくなる。むしろそれしか見るなと言われるレベル。
## 自分の体は死ぬ
新しい現場に慣れるために、生活を犠牲にした。
部屋が荒れる。
こんな家に人を呼ぶことは出来ない。
食生活は乱れる。
肌は荒れる。
彼氏とか居ない。
風邪をひいて、熱を出しても、誰も頼れない。
営業からは体調管理も仕事と言われ、休むことも出来ない。
### 常駐先と自社案件（納品）の両立は可能なのか。
不可能でした。
体は疲れてる。でも手を動かさなくちゃならない。
常駐が終わったら自宅で自社の作業。
自社案件の営業とはろくに連絡も取れない。
状況把握は全く出来ない。
自社の案件を抱えているのにも関わらず、雇用止を言われて、
私は、何から手放さなくてはならないのか、わからなくなりました。
このまま自社の案件をちゃんとまっとうに納品して終わらせられれば、
もしかしたら契約は更新されるかもしれない。
藁をもすがる思いで、
**とりあえずやれるだけやる**
とは決めたが、営業から何も連絡が無い。
このまま案件を進めてPHPのソースコードを書き続けても無駄になるかもしれない。

## 次何しよう。
仕事しなくちゃ生きていけないし、
転職活動とか、慣れちゃいるけど、正直これ以上、
いろんなことを殺して生活するのは本当に無理。
ただでさえ、もう精神崩壊度合いが半端なくて、
こんなソースコードとかの知識を置くところにエンジニア辞めたいとか言ってるわけで。

# そもそもエンジニアって
## エクセルワードパワーポイントなんて使えてあたりまえ。
エンジニアしているからにはオフィスなんて当然使える。
マクロ、参照式、一般事務程度ならいくらでも。
当然のように使える物がある。
## バージョン管理の方法だって知ってる。
SVN、Github
エンジニアなら当然知ってるバージョン管理だって
世間じゃ知られてないことのほうが多い。
もっと言えばエクセルの共有機能だって、
ちゃんと使える一般企業ってあるのか。
## ジョブ管理の方法だって
Confluence、JIRA、Redmine、
これを使ってるITは当たり前。
でも今コレで管理できてる他の業種ってあるんだろうか。
## 職業エンジニアでなくなること
これが一番怖い。
年収だって当然下がるだろう。
未経験の職種に就職するのだから。
でも、今まで自宅に作ってきた、開発環境を腐らせなかったのは、
仕事の外でもプライベートでも開発環境を触ってきたからだろう。
もう、職業エンジニアだからじゃなくて、
プライベートエンジニアだって言って自宅で趣味でやっていけばいい。
# 転職活動どうする
エンジニアとしてのエージェントはいくらでも知ってるし繋がってる。
でも、もうエンジニアのエージェントじゃないし。
どこに行ったらいいんだ。
とりあえずハロワ。
# エンジニアじゃないエンジニアが欲しい会社
どっかに無いかなって私は探そう。
dockerで自分専用クラウド立ててみた(NextCloud, Collabora Code)

# はじめに
nextcloud, owncloudは結構簡単に立ったのにcollabora officeとの連携がうまく行かなかったので自分用メモも兼ねて
この記事は2017/03/10での情報です。

# 環境
```
$ cat /etc/os-release

NAME="Container Linux by CoreOS"
ID=coreos
VERSION=1298.5.0
VERSION_ID=1298.5.0
BUILD_ID=2017-02-28-0013
PRETTY_NAME="Container Linux by CoreOS 1298.5.0 (Ladybug)"
ANSI_COLOR="38;5;75"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

$ docker version

Client:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   d5236f0
 Built:        Tue Feb 28 00:07:14 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   d5236f0
 Built:        Tue Feb 28 00:07:14 2017
 OS/Arch:      linux/amd64
```

## 使用したコンテナ
- [mariadb:10.1](https://hub.docker.com/_/mariadb/)
- [wonderfall/nextcloud:11.0](https://hub.docker.com/r/wonderfall/nextcloud/)
- [collabora/code:latest](https://hub.docker.com/r/collabora/code/)

# 必要なコンテナ準備
```text:MariaDB
docker run -d --name mariadb 
    -v {SQL Data Folder}:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD={Password} 
    mariadb:10.1
```

```text:CollaboraCode
docker run -td --name collabora --cap-add MKNOD collabora/code
```

```text:NextCloud
docker run -d --name nextcloud --link mariadb:db_nextcloud --link collabora:collabora -p 8888:8888
    -v {Data Folder}:/data 
    -v {Config Folder}:/config 
    -v {Application Folder}:/apps2 
    -e ADMIN_USER={AdminUser name}
    -e ADMIN_PASSWORD={AdminUser password}
    -e DOMAIN={NextCloud Domain}
    -e DB_TYPE=mysql -e DB_NAME=nextcloud -e DB_USER=root 
    -e DB_PASSWORD={Password}
    -e DB_HOST=db_nextcloud
    wonderfall/nextcloud:11.0
```

# NextCloudとCollaboraCodeのリンク
1. dockerHost:8888にアクセス
2. NextCloudにログイン
3. 左上「ファイル」から+「アプリ」を選択
4. 左カラム「Office&テキスト」から「Collabora Online」を有効にする
5. 右上のユーザー名から三「管理」を選択
6. 左カラム「Collabora Online」のコラボラ オンライン サーバーに「https://collabora:9980」を入力, 適用を押す

これでファイル画面+ボタンからドキュメントやスプレッドシートを作成, 編集出来るようになります
削除したツイートだけ取ってくるシステムを作ってみた

# なにこれ?
PythonでTweepyを使って、タイムラインを監視して削除したツイートだけを標準出力するだけのプログラム

# ネタ元
- [Twitter、政治家が削除したツイートのアーカイブサイト「Politwoops」復活で合意](https://japan.cnet.com/article/35075691/)
- [Politwoops](https://projects.propublica.org/politwoops/) (政治家が削除したツイートのアーカイブサイト)

# コード
Python3でTweepyを使っています.```pip install tweepy```すればインストールできます.
CONSUMER_KEYとかはご自身で用意したものを入力してください.

```python:delcheck.py

# coding: UTF-8
import tweepy
from datetime import timedelta
import json

CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_TOKEN = ""
ACCESS_TOKEN_SECRET = ""

my_db = {}

def get_oauth():
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    return auth

def pprint(dict_data):
    for k, v in dict_data.items():
        print(k, v)

class Listener(tweepy.StreamListener):
    def on_error(self, status_code):
        print("Error: " + str(status_code))

    def on_data(self, data):
        obj = json.loads(data, encoding="UTF-8")
        if "delete" in obj:
            tweet_id = obj.get("delete").get("status").get("id")
            print("deleted!")

            if tweet_id in my_db:
                print(my_db[tweet_id])
            else:
                print("-")

        elif "text" in obj:
            my_db[obj.get("id")] = obj.get("user").get("screen_name") + ": " + obj.get("text")

    def on_timeout(self):
        print("Timeout...")

if __name__ == "__main__":
    auth = get_oauth()
    listener = Listener()
    stream = tweepy.Stream(auth, listener)
    stream.userstream()
```


# 蛇足
削除とかの通知はon_dataに流れてきます.ユーザのタイムラインのデータを起動時から保存しておき,削除されたものに保存してあったものがあったら標準出力します.ちゃんとしたDBを用いずにmy_db(辞書型オブジェクト)にタイムラインからのデータ(ツイート本文のみ)を保存しています.

1日動かしてみて気づいたことは,わりとみんなツイート消してること.

# 追記(2017年10月24日)
こんな感じのサービスはTwitterの規約に反しています。
似たようなサービスがTwitterから怒られて消されているので注意。

# 宣伝
フォローお願いします:alien: [@redshoga](https://twitter.com/redshoga)
与えられた秒数を時間と分と秒数にする

```
def convert_seconds(ms):
    float_num = False
    if type(ms) == float:
        float_nums = ms - int(ms)
        ms = int(ms)
        float_num = True
    hour = ms / 3600
    minute = (ms - hour * 3600) / 60
    if float_num:
        second = ms - (hour * 3600 + minute * 60) + float_nums
    else:
        second = ms - (hour * 3600 + minute * 60)
    format_hour = "hour"
    format_minute = "minute"
    format_second = "second"
    if hour > 1 or hour == 0:
        format_hour = "hour" + "s"
    if minute > 1 or minute == 0:
        format_minute = "minute" + "s"
    if second > 1 or second == 0:
        format_second = "second" + "s"
    result = (str(hour) + " " + format_hour, str(minute) + " " + format_minute, str(second) + " " + format_second)
    return result[0] + ", " + result[1] + ", " + result[2]

print convert_seconds(3600)
#>>> 1 hour, 1 minute, 1 second

print convert_seconds(7325)
#>>> 2 hours, 2 minutes, 5 seconds

print convert_seconds(7261.7)
#>>> 2 hours, 1 minute, 1.7 seconds
```
小数が含まれるものがある場合条件分岐をして小数の値を保持。
最後の計算で足して実装
if文が多い...
HiveとPrestoのTRIM関数の違い

文字列の空白を除去するTRIM関数で、HiveとPrestoに違いがあったのでメモ。

基本は半角スペースを除去。

```
SELECT TRIM(' a')
=> 'a'
```

では全角スペースは？

```
SELECT TRIM('　a')
```

Hive - 除去されない
Presto - 除去される。

PrestoのTrimは、 `SliceUtf8.trim`で実現されていて、ライブラリ独自の挙動みたいですね。
https://github.com/airlift/slice

HiveでPrestoのTRIMと動作を揃えるには、regexp_replaceをしないとだめかなー、というところですね。

```
SELECT regexp_replace(TRIM('　a '), '^　|　$', '')
```

ryukoba-sanのコメントより複数全角空白を考慮した場合は下記。

```
SELECT regexp_replace(TRIM('　a '), '^　+|　+$', '')
```


ちゃんちゃん。
オブジェクトの配列から任意のフィールド値がtrueのものだけ取り出したい（Lodash）

### 問題
オブジェクトの配列から、任意のフィールド値がtrueのものだけ取り出したい

例えば、こんな配列があったとして・・・

```javascript:前提条件
  const items = [
    { code: 'code1', name: 'name1', checked: false },
    { code: 'code2', name: 'name2', checked: true },
    { code: 'code3', name: 'name3', checked: false },
    { code: 'code4', name: 'name4', checked: true },
    { code: 'code5', name: 'name5', checked: false }
  ];
```

checked=trueのものだけ抜き出したい場合

### 方法1 _.forEachでまわす
```javascript:方法1
  const selectedItems = [];
  _.forEach(items, (item) => {
    if (item.checked) {
      selectedItems.push(item.code);
    }
  });

  console.log(selectedItems);
```

```javascript:出力結果
  ['code2', 'code4']
```

まぁ、シンプルに書くとこうなりますわって感じです

### 方法2 _.transformを使う
```javascript:方法2
  const selectedItems = _.transform(items, (result, item) => {
    if (item.checked) {
      result.push(item.name);
    }
  }, []);

  console.log(selectedItems);
```

```javascript:出力結果
  ['name2', 'name4']
```

方法1とあんまり変わらないけど、 `transform` って文字列なんかカッコイイ！！ とか思った人にはオススメです

### 方法3 _.map + _.filter を使う
```javascript:方法3
  const selectedItems = _.map(_.filter(items, 'checked'), 'name');

  console.log(selectedItems);
```

```javascript:出力結果
  ['name2', 'name4']
```

記事をあげたら速攻指摘いただいたので、追記しました＞＜　ありがとうございます！
めっちゃシンプルに書けますね〜

### 方法3' _.map + _.filter を使う(lodashチェーン記法)
```javascript:方法３'
  const selectedItems = _(items).filter('checked').map('name').value();

  console.log(selectedItems);
```

```javascript:出力結果
  ['name2', 'name4']
```

### 方法3'' ネイティブの map + filter を使う
```javascript:方法３''
const selectedItems = items.filter(obj => obj.checked).map(obj => obj.name);

console.log(selectedItems);
```

```javascript:出力結果
  ['name2', 'name4']
```

### 方法3''' ネイティブの reduce を使う
```javascript:方法３'''
const selectedItems = items.reduce((array, obj) => {
  if (obj.checked) {
    array.push(obj.name);
  }
  return array;
}, []);

console.log(selectedItems);
```

```javascript:出力結果
  ['name2', 'name4']
```

### ベンチマークとりました！
結果はこちら
→ https://jsperf.com/lodashbenchmark

| 順位  | テスト                          | Ops/sec |
|:-----:|:------------------------------|--------:|
| 1     | reduce<br>(ネイティブ)          | 21,913  |
| 2     | map + filter<br>(ネイティブ)    | 20,022  |
| 3     | _.map + _.filter<br>(チェーン) | 16,512  |
| 4     | _.transform                  | 13,402  |
| 5     | _.forEach                    | 11,388  |
| 6     | _.map + _.filter             | 8,879   |

### ひとこと
やっぱネイティブがlodashに比べて２倍ほど早いですね
Lodashを使うにしてもチェーン記法で書いたほうが２倍速くなるというのは発見でした
コメントしていただいたベテランJavaScripterの方々、ありがとうございました！
UTF-8なCSVをExcelで開くと文字化けするのを直す

タイトル通りの小ネタです。

最初に余談ですが、MacでCSVファイルをいい感じに開いていじって保存できるツールがあったら教えて欲しいです。

↓などを試しましたが、ちょっとした閲覧にはいいものの痒いとこには手が届かないので困っています。

- [Atomのtablrパッケージ](https://atom.io/packages/tablr)
- [Table ToolというMac App](https://itunes.apple.com/jp/app/table-tool/id1122008420?mt=12)

# さて本題

上述のように他のツールでは間に合わないことがあるので仕方なくExcelでCSVファイルを開くわけですが、Shift-JISあたりで開こうとするので文字化けします。

このファイルをBOM付きUTF-8にしてあげることで、ExcelはUTF-8形式のCSVだと認識してくれるようになります。BOM付きUTF-8への変換は↓のような感じで、nkfコマンドで簡単にできます。

```
$ nkf --overwrite --oc=UTF-8-BOM file.csv
```

`--oc`は出力のエンコーディングを指定するオプションで、ここに`UTF-8-BOM`を指定するとファイルの先頭にBOMがついたものになります。また、`--overwrite`は既存のファイルを上書きしますよというオプションで、このオプションを指定するとファイルが上書きされるし、オプションを付けないと変換結果が標準出力に出力されます。

雑談ですが、Macで書いたソースコードをWindowsのVisualStudioに持っていって開くと警告か何かが出てBOMが付与されたような記憶があります。MicrosoftのアプリケーションはBOMを必要とすることが多いんですかね。

# 参考

[BOMの追加・削除（UTF-8） - Qiita](http://qiita.com/takuharu/items/455a413c6e7493398780)
$.ajax の done, fail, always を Promise の then, catch に置き換える

# はじめに

jQuery 3 から [$.Deferred](https://api.jquery.com/category/deferred-object/) が [Promises/A+](https://promisesaplus.com/) という [Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise) の標準規格に準拠するようになった。そこで、せっかくなので [$.ajax](http://api.jquery.com/jquery.ajax/) のコールバック処理も [then](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) や [catch](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch) で書いてみることにした。

# done, fail, always を使う場合

```js
$.ajax({
  type: 'GET',
  url: '/soul_gems',
  dataType: 'json'
})
  .done((data, textStatus, jqXHR) => {
    console.log('done', jqXHR.status);
  })
  .fail((jqXHR, textStatus, errorThrown) => {
    console.log('fail', jqXHR.status);
  })
  .always(() => {
    console.log('always');
  });
```

成功した場合

```
done 200
always
```

失敗した場合

```
fail 403
always
```

# then, catch を使う場合

```js
$.ajax({
  type: 'GET',
  url: '/soul_gems',
  dataType: 'json'
})
  .then((...args) => { // done
    const [data, textStatus, jqXHR] = args;

    console.log('done', jqXHR.status);
  })
  .catch((...args) => { // fail
    const [jqXHR, textStatus, errorThrown] = args;

    console.log('fail', jqXHR.status);
  })
  .then(() => { // always
    console.log('always');
  });
```

成功した場合

```
done 200
always
```

失敗した場合

```
fail 403
always
```
What type of coder are you?

Coders are very creative guys and that’s the reason every software development company likes them. Let’s discuss and know what’s in the mind of a coder and the types of coders around us

#Traits of a coder,
- Analytical Mindset

- Curiosity and Inquisitiveness

- Empathy Flexibility

- Love of Learning

- Pragmatism

- Team Player

- Technical Mindset


![coding.jpg](https://qiita-image-store.s3.amazonaws.com/0/154485/6b5dd4e9-bb8b-b774-b4db-d375d8881a61.jpeg)

##1. The Perfectionist - 
Comes on time, does his shit, leaves on time. Fixes a whole bunch of issues and never late on deadlines.

##2. The Street Smart Freak - 
Copy pastes a lot of things from the internet, although doesn't know the principle behind, somehow he gets things to work as expected.

##3. The Theoretical Dude - 
Knows a shit load of theory about computer science and coding, but not that great at coding. Gets into an argument with any who disagrees with him on theoretical aspects.

##4. The Sloppy Fellow - 
Knows the problem, knows how to fix it but ends up blowing things up because of some lack of concentration & focus elsewhere.

##5. The Code Police - 
A review nazi, difficult to get a PR approved, catches all the bugs, lets the others fix the bugs, argues about code indentation.

##6. Wildcard or Eureka Guy - 
Who keeps trying new stuff, kinda growth hacking guy.

###So let me know what type of coder are you?

Original post-credits: 
[Shippable](https://www.shippable.com/)
[HashNode](https://hashnode.com/post/what-type-of-coder-are-you-cj02akr8h000qgi53auxbpvq4)
Remix OS を VMware にインストールしてフルHD(1920x1080)で起動できました！

<div align="center">
  <a href="http://bit.ly/cyginst"><img width="426" height="67" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-0240.gif" /></a>
</div>

<hr />

Remix OS を VMware にインストールした際に画面の解像度を上げられず困っていました。
ネットで調べても上手い解決策が見つからなかったのですが、試行錯誤の結果フルHD(1920x1080)で起動できました！

完成した VMware イメージを [GitHub](https://goo.gl/Qn9Xyq) で公開しました。 
VMware Workstation 9.0 以上または VMware Player 最新版で実行できます。
ただし、画面の解像度はフルHD(1920x1080)で決めうちになっています！

~~ダウンロードは[こちら]から！(RemixOS-v3.0.207-64bit.2017-0310-1912.7z、ファイルサイズ＝1.31GB)~~
~~解凍後のフォルダ内の RemixOS-v3.0.207-64bit.vmx というファイルをダブルクリックしてください。(ただし、VMware Workstation または VMware Player がインストールされている必要があります)~~
~~起動直後の言語選択では「英語」「中国語(2種)」の選択しかできませんが、デスクトップが表示されたら、デスクトップ上の「Settings」を開いて日本語に変更できます。Google Play も導入済みです。~~


フルHDを含む4段階の解像度を選択できる新バージョンをリリースしましたので上記ファイルは廃版です。以下のURLの記事に新バージョンのダウンロードリンクがあります：
http://qiita.com/javacommons/items/f22c8de31ef01c7a2df9

よろしくお願いいたします。

<table height="400" width="600"><tr><td>
😲<b>セーラームーン / ムーンライト伝説 (ユーロビート)ver.</b>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">セーラームーン / ムーンライト伝説 (ユーロビート)ver.<a href="https://t.co/o91qCKNtAW">https://t.co/o91qCKNtAW</a></p>&mdash; JavaCommons (@javacommons) <a href="https://twitter.com/javacommons/status/849831235933224960">2017年4月6日</a></blockquote>
</td></tr></table>

```
    2017/03/19 223views
    2017/03/17 209views
```
Django事始め: 2_プロジェクト作成


# 目次
[Django事始め: 1_環境構築](http://qiita.com/roy29fuku/items/3fae6a1b474676cdb703)
[Django事始め: 2_プロジェクト作成](http://qiita.com/roy29fuku/items/306399ca5eb6f63ed691)
[Django事始め: 3_Apache連携](http://qiita.com/roy29fuku/items/578de62fbdd65f8ffbaa)
[Django事始め: 4_MySQL連携](http://qiita.com/roy29fuku/items/519becda21565e5a71a3)

前回は環境構築まで進めたので今回は実際にプロジェクトを作成します。
ぶっちゃけ僕がまとめるより公式のチュートリアルを参考にするのが１００倍為になるんですが。

[はじめての Django アプリ作成](https://docs.djangoproject.com/ja/1.10/intro/tutorial01/)

公式の丁寧な説明ですら難しく感じた自分のような初学者を対象にまとめます。

# 環境
- CentOS 7.1
- Apache 2.4.6
- pyenv 1.0.7
- anaconda 3-4.3.0
- django 1.10.5
- mariadb-5.5.52


# Djangoの構成
Djangoにはプロジェクトとアプリケーションという概念があります。
すごくざっくり言うと、プロジェクトの中にいくつものアプリケーションが入っています。

プロジェクトというのはDjangoで作りたいサイトだったりシステムだったり、一番大きな概念です。
アプリケーションはそのサイト内の細々とした機能（記事投稿とか投票システムとか）のことです。

アプリケーションの粒度は小さい方がいいらしいです。
なるべく細切れにして、それぞれのアプリケーションは１つの仕事に専念する。
アプリケーション同士の結合は疎にする（互いに依存させない）。

これによって簡単に別のプロジェクトにアプリケーションを流用することができるらしいです。


# プロジェクト作成
ということで何はともあれ、プロジェクトの作成から始めます。
適当なディクトリ、（/home/django とか作って）に移動します。

```
django-admin startproject PROJECT_NAME
```

PROJECT_NAMEにお好みのプロジェクト名を入れてください。
ただし、testやdjangoなどのpythonがインポートしそうな名前はバッティングするので避けましょう。
あと、作成する場所はapacheのドキュメントルートは避けるらしいです。

では早速、開発用の簡易サーバで確認します（こいつは公開用には使えないです、あくまで開発用）。

```
cd PROJECT_NAME
python manage.py runserver 0.0.0.0:8000
```

Vagrantなり、Djangoを動かしているサーバのIPアドレスの8000番ポートにブラウザでアクセスします。
http://192.168.0.2:8000
てな感じで。
もしくはwget --spider -S localhost:8000


Vagrantとか、Djangoが動いているサーバとアクセスするPCが別だと
DisallowedHost at...とでます。

settings.pyに許可ホストを加えます。エディタで開きましょう。
今回はとりあえず全て許可にします。

```
ALLOWED_HOSTS = ['*']
```

再びブラウザにアクセスして「It worked!」と表示されれば成功。


さて、これであとはアプリケーションをどんどん作っていろんな機能をつけていくんですが、次回は先にDB設定とウェブサーバの設定を行います。
しんどいことは先に片付けるに限ります。


# 参考URL
[はじめての Django アプリ作成](https://docs.djangoproject.com/ja/1.10/intro/tutorial01/)
[Django 1.5以降ではALLOWED_HOSTSの設定が必要](https://blog.ymyzk.com/2013/07/django-allowed_hosts/)
Django事始め: 1_環境構築

# はじめに


PythonフレームワークDjangoを触り始めましたが、苦労したりごちゃごちゃやって押し通したところがあったので整理するために書きます。
間違っている点があったらご指摘お願いします。

今回は僕が行った環境構築を記します。

なお筆者の経験値は、以下の通りです。

* プログラミング: 1年未満
* Python: 半年くらい
* Django: 初めて

これまではPHPを主に触っており、フレームワークはLaravelを使用していました。


# 目次
[Django事始め: 1_環境構築](http://qiita.com/roy29fuku/items/3fae6a1b474676cdb703)
[Django事始め: 2_プロジェクト作成](http://qiita.com/roy29fuku/items/306399ca5eb6f63ed691)
[Django事始め: 3_Apache連携](http://qiita.com/roy29fuku/items/578de62fbdd65f8ffbaa)
[Django事始め: 4_MySQL連携](http://qiita.com/roy29fuku/items/519becda21565e5a71a3)


# 環境
Vagrantで以下の環境を構築しています。仮想環境構築も近いうちにまとめたいです。

- CentOS 7.1
- Apache 2.4.6
- pyenv 1.0.7
- anaconda 3-4.3.0
- django 1.10.5
- mariadb-5.5.52


# Pyenvインストール
まず、PythonにはPython3とPython2があります。
一部互換性がありません。
そのため、プロジェクト毎にPythonのバージョンを切り替える必要が出てきます。

いちいちインストールし直していたら面倒で仕方がありません。
そこでバージョン管理ツールのPyenvを使います。

ディレクトリ毎に使用するPythonのバージョンを指定できます。便利ですね。
実際に初めてPythonを使おうと思った時、システムのデフォルトのPython2とインストールしたPython３の切り替えに苦労した僕が言うので間違いありません。

ざっといきます。

```
cd /usr/local/bin
git clone git://github.com/yyuu/pyenv.git ./pyenv
echo 'export PYENV_ROOT="/usr/local/bin/pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv --version
pyenv 1.0.7-12-g235eea3
```

gitでソースダウンロードして、パスを通してあげます。
最後にバージョンを確認できればちゃんと使えます。

# anacondaインストール
pyenvではいろんなPythonのバージョンだけでなく、ライブラリもセットになったPython環境も取得できます。
anacondaは代表的なPythonのライブラリが入っているらしいです。
後ほど機械学習とかで使いたいのでこちらを入れました。今の所、真価は不明です。

まずはpyenvでインストールできるanacondaのバージョンを確認します。
`pyenv install --list | grep anaconda`

ざっとたくさん出てくるので好みのバージョンをコピってインストールします。

```
pyenv install anaconda3-4.3.0
pyenv rehash
pyenv global anaconda3-4.3.0
```

`pyenv global`で全てのディレクトリで`python`コマンドを打ったらこのpythonを使うよと宣言します。
anacondaが設定されてるか確認します。

```
pyenv version
anaconda3-4.3.0 (set by /usr/local/bin/pyenv/version)
```

ちなみにこちらでも確認できます。

```
python -V
Python 3.5.2 :: Anaconda custom (x86_64)
```

# Djangoインストール
ではdjangoが使えるようにインストールします。
Pythonのパッケージ管理にはpipが使われますが、anacondaを利用しているとcondaコマンドで同じくパッケージ管理できます。
pipでもインストールできますが、せっかくなのでcondaを使います。
まぁcondaでインストールできないパッケージは結局pipでインストールするので使い分ける意味があるのか不明ですが。

```
conda install -c https://conda.anaconda.org/anaconda django
```

djangoがインストールされているか確認します。

```
python -m django --version
1.10.5
```

これでDjangoを使えるようになりました。
次回はDjangoのプロジェクトを立ち上げます。

# 参考URL
[CentOS7 pyenvを利用したpython環境構築](http://blog.umentu.work/centos7-pyenv%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Fpython%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/)
[データサイエンティストを目指す人のpython環境構築 2016](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#linux%E3%81%AE%E5%A0%B4%E5%90%88)
SDのext4パーティションにWindows/Macからアクセスできるツール


# はじめに

Raspberry Pi(Raspbian)のmicroSD内のファイルをPC/Macにコピーしたいことがあると思います。
scpやUSBメモリ経由という手もありますが、ファイルサイズが大きいと時間がかかる＆少々手間なので、microSDのext4パーティションに直接ファイルアクセスできるツールを調べました。

# 前提条件

* Raspbianのイメージを直接書き込んだmicroSDであること
    * NOOBSは試してないのでわからない…

# Windowsの場合

ext4パーティションにアクセスできるツールは複数あります。
しかし、Windowsの仕様（SD規格に準拠し、SDカードのパーティションは一つだけ認識）の影響なのか、実際に使えたのは下記の二つでした。
※PC内蔵のSDスロットでは無く、USB接続のカードリーダー経由であれば、[Ext2Fsd](http://www.ext2fsd.com/)でもOKかも

* [Paragon ExtFS for Windows](https://www.paragon-software.com/home/extfs-windows-pro/)
    * マウントしてExplorerからアクセスできる
* [Linux Reader for Windows](https://www.diskinternals.com/linux-reader/)
    * ExplorerライクなUIでアクセスできる
    * D&Dではファイルコピーできず、「Save」で保存する必要あり

# Macの場合

[FUSE for macOS(osxfuse)](https://osxfuse.github.io/)と[ext4fuse](https://github.com/gerard/ext4fuse)でext4パーティションをマウントできます。

osxfuseはbrewだとインストールに失敗（osxfuseのバージョンが古い？）したので、dmgからインストール後にext4fuseをインストールします。

```bash
$ brew tap homebrew/fuse
$ brew install ext4fuse
```

次にmicroSDをMacに接続して、デバイス名を調べます。

```bash
$ df
Filesystem        512-blocks      Used Available Capacity iused      ifree %iused  Mounted on
/dev/disk1         234573824 195229280  38832544    84% 1554478 4293412801    0%   /
devfs                    740       740         0   100%    1280          0  100%   /dev
map -hosts                 0         0         0   100%       0          0  100%   /net
map auto_home              0         0         0   100%       0          0  100%   /home
/dev/disk3s1          128912     80528     48384    63%     512          0  100%   /Volumes/boot
```

この場合、microSDのデバイス名は```/dev/disk3```です。
Raspbianのイメージを直接書き込んだmicroSDであれば、パーティション2がext4なパーティションなので、

```bash
$ sudo ext4fuse -o allow_other /dev/disk3s2 /mnt
```

でマウントできます。
※```-o allow_other```を付けないと、root権限でしかアクセスできません

# 参考情報

[osx で ext4 をread/write でマウントする。](http://takuya-1st.hatenablog.jp/entry/2016/06/07/232236)
[OSX 10.10.1 Yosemite で Fuse でext4使おうとしたら fuse インストール出来ない](http://takuya-1st.hatenablog.jp/entry/2014/12/12/183004)