OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel Homestead（PHP7.2）環境におけるCountable周りのエラー対処方法

# エラー発生環境
- Laravel Homestead v6.4.0 以上
- PHP7.2

# エラー内容
### ErrorException in Builder.php line 1015:
`count(): Parameter must be an array or an object that implements Countable`

# 原因
[Counting of non-countable objects](https://wiki.php.net/rfc/counting_non_countables)

PHP7.2以降、[Countable](http://php.net/manual/ja/class.countable.php)でない値を`count()`しようとした場合にwarningが発生するため。

# 対処方法
`Homestead.yaml` にPHP7.2以前のバージョンを使用するように設定。
（**v6.0.0以降でNginxを使用している場合**、`sites` 毎にPHPのバージョンを指定可能）

[Laravel Homestead 複数のPHPバージョン](https://readouble.com/laravel/5.5/ja/homestead.html#multiple-php-versions)

```yaml
sites:
    - map: homestead.test
      to: /path/to/public
      php: "7.0"
```

設定後に `vagrant up --provision` で再度プロビジョニングしないと反映されないため注意です。
Vimで挿入モードに入ったり出たりした時にIMEをコントロールする

この記事は[Vim2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vim2)の19日の記事（代打）です。

この記事ではmacOS High Sierraでvimの挿入モードに入ったり、挿入モードから出た時にIMEの状態を自動で切り替える方法を説明します。
私はATOKを使っていますが、標準の日本語入力やGoogle IMEを使っていても少しの修正で使えると思います。
挙動としては、挿入モードを抜けた時にIMEの状態を記憶して、挿入モードに入ったときに復元する感じです。

まず最初に、環境設定＞キーボード＞入力ソースでお好みの英語の入力用ソースを追加します。私の場合はU.S.を追加しました。
結果として入力ソースは以下の画像のようになります。
![入力ソース](https://qiita-image-store.s3.amazonaws.com/0/33536/3e1a2082-2e16-b854-7ba9-99e6ae7ac8cd.png)

そして、macOSのIMEをcliで切り替えたりできる、[swim](https://github.com/mitsuse/swim) を入れます。
IMEを切り替えながら `swim list --current` を使って、日本語と英語のIMEの内部名称をメモしてください。

そんでもって、下記 Vim script を vimrc にどーん。
`s:JapaneseIM` と `s:AsciiIM` の値は先ほどメモしたやつに書き換えてくださいね。

```vim
" input method
let s:JapaneseIM = 'com.justsystems.inputmethod.atok30'
let s:AsciiIM = 'com.apple.keyboardlayout.all'

function! s:ImActivateFunc(active)
  if a:active
    call system('swim use ' . s:JapaneseIM)
  else
    call system('swim use ' . s:AsciiIM)
  endif
endfunction

function! s:ImStatusFunc()
  return system('swim list --current') is# s:JapaneseIM . "\n"
endfunction

let s:ImStatus = 0

function! s:insertEnter()
  call s:ImActivateFunc(s:ImStatus)
  call s:ImStatusFunc()
endfunction

function! s:insertLeave()
  let s:ImStatus = s:ImStatusFunc()
  call s:ImActivateFunc(0)
  call s:ImStatusFunc()
endfunction

augroup ime
  autocmd!
  autocmd InsertEnter * call s:insertEnter()
  autocmd InsertLeave * call s:insertLeave()
augroup END

```

本当は、`imaf`と`imsf`を適切に設定すればvimがかってにうまいことやってくれるんですが、`imsf`は頻繁に呼ばれてしまい、それでvimがもたついてしまうので挿入モードに出入りするときだけ呼ぶようにしたのが上記になります。
macOS以外の人もImActivateFuncとかImStatusFuncを適切に実装すれば同じことができるはず？

Vimで快適な日本語執筆環境をめざして！

追記:
ImActivateFuncを呼んだ後にImStatusFuncを呼んでいるのは、swimがIMEの切り替えに失敗？することがあって、そんなときに `swim list --current` を呼んでやるとうまくいくというworkaroundです。
Node.js環境設定備忘録

Macを新しくしたのでシリーズ。備忘録です。
nodebrew を使って node を管理しようと思います。

前提: Homebrewがインストールされていること。

# Nodebrew をインストール

```
$ brew install nodebrew
```

完了したか確認

```
$ nodebrew -v
nodebrew 0.9.8
```

# PATHを通す（zsh環境用！！）

```~/.zshrc
+ export PATH=$HOME/.nodebrew/current/bin:$PATH
```

```設定を反映
source ~/.zshrc
```

# Node.js のインストール
ひとまず、最新版してみます。

```最新版
$ nodebrew install-binary latest
```

そうするとエラーが・・・

```
Fetching: https://nodejs.org/dist/v8.9.3/node-v8.9.3-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /Users/hogehoge/.nodebrew/src/v8.9.3/node-v8.9.3-darwin-x64.tar.gz
Warning: : No such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 1124)
download failed: https://nodejs.org/dist/v8.9.3/node-v8.9.3-darwin-x64.tar.gz
```

ディレクトリを作ってあげます。

```
$ mkdir ~/.nodebrew
$ mkdir ~/.nodebrew/src
```

再チャレンジして、うまくいきました(^^)

```最新版
$ nodebrew install-binary latest
```

```安定版
$ nodebrew install-binary stable
```

なんて簡単なんでしょう！

# バージョンを指定して確認

```使用するバージョンを指定（今回は安定版）
$ nodebrew use stable
```

```確認
$ node -v
v8.9.3

```
Ruby on Rails の Scaffold でアプリを作って heroku にデプロイするまでの手順

初 Rails です。
忘れないうちに手順をメモします。

## 環境
- macOS High Sierra
- Ruby 2.4.1
- Ruby on Rails 5.1.4

## Ruby on Rails のインストール（初回のみ）

Rails のインストール
バージョンを省略すれば最新版が適用される。

```
$ gem install rails --version=5.1.4
```

railsのバージョンを確認

```
$ rails -v
```

## アプリの作成

任意のフォルダにプロジェクトを作成
バージョンを省略すれば最新版が適用される。

```
$ rails _5.1.4_ new myapp
```

プロジェクトフォルダに移動

```
$ cd myapp
```

アプリを作成
モデル名（今回はListの部分）は、単数形で頭文字は大文字にする。

```
$ rails generate scaffold List name:string age:integer
```

データベースの設定をデータベース（SQLite3）に反映

```
$ rails db:migrate
```

Rails内臓のWebサーバを起動
webサーバの停止は Ctrl + C キー。

```
$ rails server
```

※おまけ
Cloud 9 上で開発している場合は、以下のコマンドでWebサーバを起動する

```
$ rails s -b $IP -p $PORT
```


ブラウザでアプリが動作することを確認
URLの後ろの部分は、モデル名（今回はList）を複数形で頭文字が小文字にしたもの（＝データベースのテーブル名）になる（今回の場合は"/lists"）。

```
http://localhost:3000/lists
```

<img width="370" alt="スクリーンショット 2017-12-22 17.45.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/80120/1f7e30d5-88cd-3264-0c2d-7482c3bf7d83.png">


## デプロイの準備

ローカル環境ではデータベースに SQLite3 を使用したが、heroku では SQLite3 は使用できない。
heroku 標準のデータベースである PostgreSQL で動作するように変更を加える。

./Gemfile を修正

修正前：

```
gem 'sqlite3'
```

修正後：
ローカル環境（development)では　SQLite3　を、heroku環境（production）では PostgreSQL を使用することを明示する

```
gem 'sqlite3', group: :development
gem 'pg', group: :production
```

Gemfileの変更内容に基づき必要なモジュールを追加インストールする

```
$ bundle install
```

> 初回時、ここでエラーが出て gem ‘pg’ のインストールができなかった。
> 事前にローカル環境に PostgreSQL をインストールしておくと回避できる模様。
>
> ```
> $ brew install postgresql
> $ psql --version
> $ bundle install
> ```
>
> 詳細はこちらを参照。
> http://jyoko.hatenablog.com/entry/2016/10/08/gem_%27pg%27_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%99%82%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95

Config/database.yml を変更
heroku 環境（production）でのデータベース設定。タブは半角スペース2つ分。

```
#修正前（以下、削除）
production:
  <<: *default
  database: db/production.sqlite3

#修正後（以下、追記）
production:
 <<: *default
 adapter: postgresql
 encoding: unicode
 pool: 5
```

## heroku へのデプロイ

heroku へログイン

```
$ heroku login
```

heroku 上にアプリを作成

```
$ heroku create
```

heroku にアプリをデプロイ

```
$ git add .
$ git commit -m 'first commit'
$ git push heroku master
```

heroku 上でデータベースの設定を PostgreSQL に反映

```
$ heroku run rake db:migrate
```

アプリを起動

```
$ heroku open
```

ブラウザでアプリにアクセス（URLは各アプリごとに異なります）

```
https://xxxxx-xxxxx-12345.herokuapp.com/lists
```

<img width="601" alt="スクリーンショット_2017-12-22_17_55_26.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/80120/439e6bf6-6ef4-7d7d-1657-cc4bc9e853c5.jpeg">
Azure RMモデルの仮想マシン名からPrivateIPを取り出す

NIC名を自動生成にした場合にVMから外部IP取得する方法のメモ
もっとこれよりいい方法ないかしら？！

``` powershell
#VM名からPrivateIPAddress取得
$vm = get-azurermvm -ResourceGroupName $RGN -Name $VM
$nIIList=$vm.NetworkProfile.NetworkInterfaces.id.split("/")
$nicInfo = Get-AzureRmNetworkInterface -Name $nIIList[$nIIList.count-1] -ResourceGroupName $RGN
$nicInfo.IpConfigurations.PrivateIpAddress
```
OpenStack PTL の一日

「好きでやっている事ですからね。」

そう言って、彼はおもむろに Gerrit を開いて朝一のレビューを始めた。

"OpenStack" と聞くと、一つのソフトウェアと捉えてしまいがちであるが、実態は少し異なっている。OpenStack の名の元に、Nova や Neutron といったいくつもプロジェクトが存在しており、それらを束ねたものが "OpenStack" である。 The Apache Software Foundation 配下にいくつものプロジェクトが名を連ねているのと似ていると考えていただければわかりやすいだろう。

彼が就いている Project Team Lead (PTL) は、OpenStack の各プロジェクトにいるリーダー役である。 OpenStack では開発者について、プロジェクト毎に Contributor、Core reviewer, PTL の主に三つの役割がある。Contributor は自身が作成したコードやドキュメントを投稿し、他者のパッチに対してコメントし +1、-1 を Gerrit 上で付けることができる。 OpenStack Foundation に登録すればこういった活動は可能になる。 Core reviewer はパッチのマージ権限を持っており、Gerrit 上で +2、-2 を付けることができる。 PTL は Core reviewer と同等の権限を持っている。違いはプロジェクトを取りまとめる役割が追加される。

「良く言えばプロジェクトのリーダー、悪く言えばプロジェクトの雑用係かもしれませんね。」

「例えば、リリース作業やそのアナウンス、他のプロジェクトとコラボする時には必ず呼ばれますし、メジャーリリース時には OpenStack Summit でアップデート内容の紹介なんてこともしています。」

と、彼は笑いながら話す。

「感覚的にはコーディングとレビューをしている時間の割合は 3:7 ぐらいでしょうか。」

「Core reviewer の役割は、その名の通り "review すること" ですから。」

「review ばかりだと面白くないんじゃない? なんてたまに言われますけど、そんなことないですよ。他のすごい方々のコードを見てると、"なるほどな、今度参考にしよう" って思うことの方が多いくらいです。」

朝のレビューが終わった所で彼は出社の準備を始めた。

OSS 活動は場所に囚われずに仕事ができるのが良いですよね。ただ、世界中どこからでも毎日の活動が見えてしまうので、頑張った、サボったがバレてしまうのは考えものかもしれません。と彼は語る。

「なんだかんだ言っても、企業勤めですからね。出勤や書類仕事からは逃れられないですよ。はは」

「周りの方にもご協力いただいて、外部の活動がしやすいよう、かなり書類仕事とか面倒事は少なくして頂いてるように思います。感謝です。」


今日は開発マイルストーンのリリース日。

彼はさっとターミナルを開いて git の commit log を眺め始めた。

OpenStack では git の branch 作成、tag 付けや ML へのアナウンスから、pypi への投稿までが、全て自動化されている。 もちろんリリースノートやドキュメントの作成も全自動である。 やることは至って簡単でリリースの対象となるコミット hash を、リリース用のリポジトリに書き加えてパッチを投稿するだけだ。

「今度、社内でサービス開発をするとしたら、きっと OpenStack で利用している [zuul](https://github.com/openstack-infra/zuul) を活用しますね。」

Web やアプリケーション業界では当然となっているこれらのリリースなどの仕組みも、彼が勤めている会社ではまだ道半ばだと言う。 OpenStack のコミュニティで利用している [zuul job](https://github.com/openstack-infra/openstack-zuul-jobs) はもちろん OSS として公開されているので、これらを今後導入していきたいと彼は話す。

彼に PTL としての活動で嬉しい事があるか尋ねてみた。

「ユーザから直接フィードバックを貰えるのが嬉しい」

と彼はすぐに答えた。

OpenStack は Open を意識しているコミュニティであり、ユーザやオペレータから直接意見がもらえるのだという。 もちろんバグが見つかった時などは、きつい意見を聞くこともある。しかし、開発したソフトウェアを利用している方々と、直接話ができるのはとても楽しいと彼は嬉しそうに話す。

「レビューするときに、いつも意識していることは "Say Thank you." ですかね」

別プロジェクトの PTL が紹介していた言葉だ。当時はなるほどな、と理解した程度だったが、PTL の役職を持ってから昔以上にこの言葉の重要性を噛み締めている。

継続的にパッチを投稿・レビューする人が増えないことが最近の困りごとの一つだと彼は言う。

「別にフルタイムでコミットする必要はないんです。毎月 1 パッチ投稿とかでも良いので継続できる方が増えて欲しいですね。」

バグを直すパッチを投稿する事自体はとてもありがたい事である。ただ、プロジェクトの継続性という観点からみると、パッチ数は少なくても良いから、継続して活動できるメンバが増えると嬉しいと PTL になり実感したと語る。

「OSS にフルタイムでコミットできる人は、世界を見てもそこまで多くはないでしょう。 でも、OSS を使っている人やコミットしたいけどできていない人はたくさんいると思うんですよね。そんな方々が、少しでも OSS へコミットしやすい環境を作っていくことも、私の役目だと思っています。」

そう言うと、まだ見ぬ新しいパッチを求めて、彼はまた Gerrit の画面を開いた。
GCP Cloud IoT CoreにHTTPで接続する

## 基本的な流れ

1回のリクエストを送る度に:
1. JWTトークンを生成
2. 認証用のHTTPリクエストを `/config` に送信
3. publishかデバイスの状態を変更するリクエストを送る。
（1で生成したJWTトークンはここで破棄する。詳しくは↓で。）

というMQTTとは違いかなり複雑な手順が必要になります。
1回の処理をするために2回もHTTPリクエストを送らないといけないので、テスト目的や頻度の少ない用途でしか難しそうです。

JWTの生成ができれば設定などがMQTTよりは楽ではあるんですが、使い所がわからないので、何かしら原因がわかりづらいエラーが出た時に切り分けるときにしか使えないかもしれないです...。

## 注意点など

まずは送信時のタイムアウトを短く設定するのをやめましょうというのを言いたいことですね。
MQTTの接続時もやってしまったんですが、 `us-central1` という太平洋をまたいだリージョンにつないでいたんですが、1秒以下に設定してしまうとけっこうタイムアウトします...。
わたしはこれでデバッグ時間をとても無駄にしました...。

どうやら、Google側ではそれほどHTTPを積極的にサポートする気がないので、ちょいちょいよくわからない仕様があります。
`local_version` パラメーターの値が[ドキュメント](https://cloud.google.com/iot/docs/how-tos/http-bridge)と[サンプル](https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/80dda2987a0e109fcbc2e6b2393f3167a907b987/iot/http_example/cloudiot_http_example.js#L186)とで食い違っていたりします。
また、サンプルが不安定なのかけっこう高頻度で書き換わっているように見受けられます。

今回特に、なぜ毎回2回もリクエストを送らないといけないかというのが、謎です。
JWTの期限が切れるまで使いまわせる気もするんですが、nodeのexampleを動かすとどうもうまくいきません。
2回目のリクエストを送るとOAuth2準拠のリクエストと間違えられたり、beta版とはいえサンプルと連動したテストをしているのか不安です。
それっぽいMQTTブローカー（サーバー）をGolangで立てる

GCPのCloud IoT Coreの検証をするためだけにCIから外部APIを叩くのが不安だったのでついカッとなってGolangでそれっぽいMQTTブローカーを立てる技能を身に着けましたのを残しておきます。

今回は[VolantMQ](https://github.com/VolantMQ/volantmq)というOSSのMQTTサーバー実装を使いました。

今回の記事を書いた動機は[GCPっぽく動かすためのパッチがマージされた](https://github.com/VolantMQ/volantmq/pull/81)記念からです。
MQTTのクライアントIDは[規格では英数字しか許容しない](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc385349242)ようですが、まあ規格は規格なのでけっこう守らないところが多かったりします。
なので、今回 `/` 文字をClient IDに含めることを求めるGCPの仕様と揃えるためにパッチを書いて、それがめでたくマージされました。
コメントを見ると、他のブローカーとクライアントのために、制限を緩和しているのがわかるかと思います。

## コード解説

今回は認証だけをそれっぽく欲しかったので、認証周り中心をカスタマイズしました。
詳しくは[gcp-iot-core-glang-sample](https://github.com/fusic/gcp-iot-core-golang-sample/blob/5f078a18e928fb8656e0bcff06167be46f16e29d/main.go)見てもらった方がはやいと思うのですが、できるだけ解説します。

認証では、基本的に
- パスワードの検証 (`Password` メソッド)
- アクセス制御リストの検証 (`ACL` メソッド)

をするインターフェースを要求していてそれをそれっぽく上書きしてあげると、GCPっぽいMQTTサーバーが手に入りました。
パスワードの方は、接続時に実行され、アクセス制御リストは、publishなどの要求時に行われるようです。
（今回の用途は基本的にpublishだけだったのでpublish以外は検証していないです。）

GCPでは、MQTTのパスワードでJWTをやりとりする仕様なので、[`Password` メソッド](https://github.com/fusic/gcp-iot-core-golang-sample/blob/5f078a18e928fb8656e0bcff06167be46f16e29d/main.go#L45-L83)ではJWTの検証をします。
JWTをパースして、所定の公開鍵で復号化できることを確認し、
- Audience
- 期限
- 作成時

を検証します。

[`ACL` メソッド](https://github.com/fusic/gcp-iot-core-golang-sample/blob/5f078a18e928fb8656e0bcff06167be46f16e29d/main.go#L85-L99)では、クライアントIDとトピックがGCPっぽいかしか見てません。
いろんな権限制御をしたい場合は、もっと複雑な処理が入るのかもしれませんね。

そして、[`main` 関数](https://github.com/fusic/gcp-iot-core-golang-sample/blob/5f078a18e928fb8656e0bcff06167be46f16e29d/main.go#L106-L134)でMQTTブローカーをテスト時に起動します。
ローカルホストの空きポートを探すとかはしてますが、基本的にプロトコルを3.1.1に制限する以外は特別なことはしてないです。

## 雑感

Golangのいいところで、インターフェース設計をしっかりしておくと、疎結合で外部からカスタマイズしやすい設計ができるところを活かしたコーディングができてよかったです。

ただ、[VolantMQ](https://github.com/VolantMQ/volantmq#warning)の開発がとても不安定なので、実装当時はmasterブランチからforkしたら、CIが失敗していた状況のせいかうまくいかず、直近のリリースタグから開発になったりしてました。
テスト用には非常に高機能で使いやすいんですが、製品で利用するとなるとVolantMQはまだ不安定だと感じます。

それでも、MQTT 5の対応を進めているとのことなので、そこはとても期待しています。
時間に余裕があったら、実装のお手伝いをできればと思います。
create-elm-app は何をしているのか

[create-elm-app](https://github.com/halfzebra/create-elm-app) という便利なツールがあって、これを使うとコマンド一発でプロジェクトの雛形を作ってくれたり、アセットの最適化とか諸々うまくやってくれます。内部的には webpack が使われています。

create-elm-app 自体の説明は[こちらの記事](https://qiita.com/jooex/items/2ab96fa3f7b5beb1edf2)を参照してください。

# 一体何をしているのか

「確かに楽なんだけど、裏で何をしているのか分からなかったから調べてみた」というのがこの記事の主旨です。だいたい[ここ](https://github.com/halfzebra/create-elm-app/blob/master/template/README.md)に書いてありますが長くてしんどいので要点だけ並べておきます。


## 開発効率アップ編

### HMR (Hot Module Replacement)

リロードしなくても画面が最新に置き換わる魔法です。

### プロキシ機能

Dev Server を使いつつ API サーバーも同時に使うといったことが出来ます。elm-package.json に次のように設定を追加すると有効になります。

```json
"proxy" : "http://localhost:3010"
```

これで、ブラウザ ==> localhost:3000 ==> localhost:3010 という状態です。CORS を気にする必要もないです。


### エラーを画面に表示

コンパイルエラーや `Debug.crash` した時にエラーを画面に表示します。

### デバッガーの有効化

デフォルトでは開発モードで ON 、本番で OFF 。環境変数 `ELM_DEBUGGER=true/false` で上書きします。


### アセットのベース URL 変更

環境変数を使って `PUBLIC_URL=./` のように設定できます。デフォルトは `/` です。

```html
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
```

### CSS や画像のインポート

バンドルしたいスタイルを JS からインポートできます。これは webpack 自体の機能です。

```js
import './main.css';
import logoPath from './logo.svg';
```

HTML に直接タグを書くこともできますが、以下の点からこちらのほうが有利です。

- リンク切れを検査できる
- minify などの処理を通る
- ファイル名にハッシュ値が入る
- HTML の最適な位置でロードしてくれる


### Elm のインポート

Elm の場合はこういう風に書けます。

```javascript
import { Main } from './Main.elm';
Main.embed(
    document.getElementById('root')
  );
```

### カスタムな環境変数の設定

`ELM_APP_` というプレフィックス付きでカスタムな環境変数を設定できます。シェルまたは `.env` ファイルに書かれたものが読まれますが、両方で設定した場合はシェルで設定したほうが優先されます。

```
ELM_APP_API_KEY="secret-key"
```

## 本番用の最適化編

### デッドコード除去

デフォルトでは無効。環境変数 `DEAD_CODE_ELIMINATION=true/false` で有効になります。


### ファイル名にハッシュ値を含める

出力ファイルの名前が、例えば `build/static/css/main.2e08f693.css` や `build/static/js/main.e8e77659.js` のようになります。これによって、古いバージョンのファイルがキャッシュされたままになるトラブルを防ぎます。これは webpack 自体の機能です。


### CSS のマルチブラウザ対応

CSS のプロパティにプレフィックスをつけてマルチブラウザ対応します。

- `>1%`: シェア１％以上のブラウザ
- `last 4 versions`: 最新 4 バージョン
- `Firefox ESR`: Firefox ESR （延長サポート版）
- `not ie < 9`: IE9 以上

### JS のマルチブラウザ対応

Babel を通して ES5 でも動くようにします。

- `ie: 9`: IE9 以上

Google の検索エンジンが古めなので、これで SEO 対策にもなるらしいです。

### HTML / CSS / JS の最小化

HTML / CSS / JS のファイルサイズを小さくします。


### 画像の Data URI 化

10KB よりも小さい画像を Base64 エンコードした Data URI にして CSS に埋め込みます。


### PWA 対応 (Service Worker)

Service Worker を使って、バンドルされた静的ファイルを事前キャッシュします。また、これによってオフラインで動作するようになります。あとは PWA 用のメタデータが用意されたりします。

本番モードでのみ有効です。

# なぜこれを書いたのか

`elm-app eject` してみたら訳の分からない設定ファイルが沢山出てきて「うっ…」となったので、事前に一通り機能を知っておけばギリギリまで eject しないで済むはずと思って書きました。（本当は eject 後の拡張方法などを考察しようと思ったが激しく消耗して諦めた）

あとは、 Elm を導入されると色々とロックインされるイメージを持っている人がいそうなので、 JavaScript 以外はまあいつものフロントエンドのノウハウ使えますね、という感触を持ってもらえると良いかと思いました。
knzk.me Advent Calendar 2017

**わたしが突然変異を起こしても**
**機能はちっとも増えないが**

**増えるは自鯖はわたしように**
**地べたを早くは走れない**  データーベースは...走ります！！ 小保(殴 ≡ ≡

**わたしが頭をひねっても**
**新機能は実装できないけれど**

**デキる神崎丼はわたしのように**
**純粋な心は知らないよ** テヘ:stuck_out_tongue_closed_eyes:

**神崎丼と自鯖と　それからわたし**
**みんな違って　みんないい**

#自己紹介
神崎丼では不本意ながら"イキり島ひなた"と呼ばれている
霧島ひなたです。
<font color="Red">**ほ～んと神崎丼に関わったのは間違いだったなって思ってます。**</font> (爆）
<font color="white">**神崎丼と関わったことで新しいことにチャレンジするいいきっかけになったので感謝の気持ちの方が大きいです
神崎おにいさん、NCLS、そしてみかんさん！また絡んでくださってる方々、ありがとうございました。**</font>

#神崎丼に関わろうと思ってしまった訳
事の発端は2017年9月15日でした。
>最初は面白そうな人だと思ったんです(神崎おにいさんが)。
>実際、神崎おにいさん**『は』**いい人でした。
>**問題児はNCLSでした。**  後述
>まぁ、神崎おにいさんに絡んだ時点でNCLSは**ハッピーセット**みたいなものなんですけど...

#神崎丼に関わり始めて
神崎丼に関わり始めて変わったことをいくつかあげたいと思います。
<li>ローカル管理だったプロジェクトがgit管理になったこと</li>
<li>今までバニラだった私の鯖に機能が増え始めたこと</li>
<li>ネット上での呼び名が激変したこと</li>  
どうしてこんなことになってしまったのか…

###ローカル管理だったプロジェクトがgit管理になったこと
これは次の項にも関係してくるのですが、
それまで私はファイル名に「.back1」などと記載して変更したファイルを取っておく形式をとってきました。
別に意味があってgithubを使ってこなかったわけじゃありません。
ただ、言葉がめんどくさかったり、いちいち手動でバックアップを取ることに何の苦労もなかったので
githubを使うことはありませんでした。
ですが、今までの管理方法だと大変手間がかかるようになってしまったのでgithub管理にする事にしたのです。

###今までバニラだった私の鯖に機能が増え始めたこと
さて前項はなんだか内容がぼけるようになってしまいましたが
その理由の説明がこれです。
機能を増やしたかったということ。
神崎丼にアカウントを作って初めて感じたのは、その機能の豊富さが故の
遊び心をくすぐられる感覚でした。
そんな遊び心をくすぐってくるどこか子供の遊び場のようなその空間が気に入って、
いくつかの機能を取り込みたいと思うようになりました。
それで、いろいろやり始めたら今まで自分のやってたことがいかに手間暇かかるし不確実だったかを思い知ってしまったのですね。

###ネット上での呼び名が激変したこと
えぇ、まぁ、はい、これですよね。
『イキリ島ひなた』
その時は何徹目かの明け方。ふとPawooの方からあなたのtootはスパムなのかと
リプをいただいてですね。
カスタム絵文字に対応していないインスタンスから見るとカスタム絵文字の投稿は完全に
面白くも何もない文字のられつ...
はい、まぁここでちょっとした問題発言をしてしまって...
しかもぬるかるさんからリプライをいただき、
それに対するとても大切な返信のリプライを
**面白おかしく改変したNCLSによって**私はイキリ島ひなたになりました。
いまでもちゃんと
「素直に反省」(です)してるんですよ？＞＜
でも最近はなれたというか、なんだかんだ絡んでもらえる間が花だよなとか思って
結構、気に入ってたりもします。

# 終わりに
私は、先述の通り神崎丼の雰囲気がとても好きですし、来年も日々進化していくことを期待してしています。
頑張ってください！
拙い文章になってしまって申し訳ないです。
ラスト二日は鯖缶二人！楽しみにしてます

上の方、赤文字の下を反転させて読んでください。  

言葉の解説

ハッピーセット・・・子供を幸せにする物の象徴、おもちゃだったり、おもちゃを生む機構そのものをさしたりする。
実際は本当に売りたいものよりも高価である場合が多く、その機能は値段に不釣り合いなため本当に売りたいものがメインなのかハッピーセットの方がメインなのかわからなくなることも多々あるとか...
Re:dashでGoogle SpreadSheetを読み込む

> Re:dash v.4.0.0


## オフィシャルページを踏襲する


http://help.redash.io/article/114-querying-a-goog

`Service accounts page.`をクリックして`Google API Console`にアクセスして

<img width="1158" alt="account1.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/9a503bba-58f6-6756-45e2-f05e1a3b920c.png">

`サービスアカウントを作成`するをクリック

なんかこんな感じでつくっていく

<img width="533" alt="account2.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/3d5f1a0f-9e72-be92-f539-feaeb0361864.png">

必要なのはJSONファイルなのでこいつを拾う

<img width="803" alt="account3.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/427fff53-4cbf-d142-8d83-1417f05bc2c2.png">


### Re:dashの`Data Sources`をクリックする

Typeで`GoogleSpreadsheet`を選択して、さきほど落としたJSONファイルをアップロードする

<img width="1037" alt="Screen Shot 2017-12-22 at 15.40.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/8ef8b040-8d66-1302-ba5c-a451665c1d59.png">


## 対象のスプレッドシートでJSONファイルに記載されているメールアドレスを許可する

<img width="1391" alt="account4.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/d5fee887-403c-8092-6da5-955bf17c5864.png">

<img width="434" alt="account5.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/94bf1884-014f-1012-7071-b9d060cdc479.png">



あとはドキュメント通り、`DOC_UUID`を指定して読み込む
http://help.redash.io/article/114-querying-a-goog

<img width="1386" alt="account6.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/33a719f0-d6cb-fe09-1dd4-53e6da2f65b4.png">


## TODO

`Query Results(Beta)`から
Hanamiの２つの原則のうちの1つ モノリスファーストとは何なのか

モノリスとは一枚岩という意味で、マイクロサービスに対極に位置するものです。マイクロサービスという言葉を最初に使ったのは(おそらく)マーティンファウラーですが、彼は口を酸っぱくして「最初からマイクロサービスでつくるな」「まずはモノリスで始めよ(モノリスファースト)」といっています。

なぜ最初からマイクロサービスで作ってはいけないのでしょうか? それは初めからにマイクロサービスにしてしまうとメリットよりもデメリットのほうが大きくなってしまうからです。

ではHanamiがどのようにモノリスファーストを実現しているかをいていきましょう。

# Hanamiのモノリスファースト

Hanamiのアプリケーションのディレクトリ構造は以下のようになっています。

```shell-session:Hanamiのディレクトリ構造
[] % tree -L 3   
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── apps
│   ├── api_v1
│   │   ├── application.rb
│   │   ├── config
│   │   ├── controllers
│   │   └── types
│   └── web
│       ├── application.rb
│       ├── config
│       ├── controllers
│       ├── frontend
│       ├── node_modules
│       ├── package.json
│       ├── templates
│       ├── views
│       ├── webpack-assets.json
│       ├── webpack.config.coffee
│       └── yarn.lock
├── config
│   ├── boot.rb
│   ├── environment.rb
│   └── initializers
├── config.ru
├── lib
│   ├── my_app
│   │   ├── entities
│   │   ├── mailers
│   │   └── repositories
│   └── my_app.rb
```

`apps`というディレクトリがポイントで、このなかに複数のアプリケーション(`api_v1`, `web`)が入っています。
そしてそれぞれのアプリケーションに`controllers`と`views`があるのがわかります。
実は`config`のかなには`routes.rb`が入っています。

`lib`ディレクトをみるとここには`entities`と`repositories`があります。
entitiesはビジネスロジックを記述する場所で、repositoriesはDBとのやり取りを記述する場所です。

このようにコントローラやビューをアプリケーションごとに分離しながらビジネスロジックを共有することで、できるだけ管理可能な形でモノリスに保つというのがHanamiの特徴です。

いいね！

# 参考資料

- http://hanamirb.org/guides/1.1/architecture/overview/
- https://martinfowler.com/bliki/MonolithFirst.html
Twilio Studioのご紹介 

こんにちは。２日目、１５日目と続き２２日目も担当させて頂きます杉本です。

今回は現在個人的に技術勉強のため構築しているレストラン検索APIとTwilioを連携したデモの紹介を考えていたのですが、急遽内容を変更し、Twilio Studioの紹介をさせて頂きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217201/f9df6110-6807-a866-b37e-4bcd6443fbb2.png)

「Twilio Studio」は2017年９月19日にリリースされたばかりの新機能で、Web上でコミュニケーション機能の操作を可能にしたインターフェースになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217201/61771d0a-939a-07a9-56fc-2aee119fdfad.png)

現在は未だDeveloper Previewの為、ご利用頂く場合は別途申請して頂く必要がございます。
申請は https://www.twilio.com/studio こちらから可能です。

また、使用方法につきましては、弊社エバンジェリスト高橋が作成したとてもわかりやすいYouTubeビデオがございますので、是非こちらをご覧下さい。

・ Twilio Studioを使って電話転送を構築する方法
https://www.youtube.com/watch?v=eowoG0GCB8U

Twilio Studioのメリットは、プログラムのフローが目で見てわかるようになっているということと、ユーザーの要望に応じてその場でフローの変更や実装も可能な為、瞬時に挙動確認が可能であり、開発の時間を短縮する事も可能になります。

Twilio Studioはデベロッパーでない方でも簡単にお試し頂ける機能です。
是非この機会に試して頂けたらと思います！

ご不明な点等ございましたら、弊社サポートへお問い合わせください。
お問い合わせ窓口：https://twilioforkwc.zendesk.com/hc/ja/requests/new
ClickHouse シャーディングの方法とシャーディングされたテーブルへのSELECT方法

# はじめに

ClickHouse引き続いてシャーディング周りの操作方法を確認したので書いておきます。が…正直書いている本人、これが正しいのかさらに懐疑的です。


# 設定(config.xml)

シャーディングの設定自体はReplicatedMergeTreeあたりと同じノリで行おうと思います。今回は試しに1号機と2号機のシャードを分けてみます。

1号機

```xml:/etc/clickhouse-server/config.xml
    <macros>
        <set>1</set>
        <shard>1</shard>
        <replica>clickhouse01</replica>
    </macros>
```

2号機

```xml:/etc/clickhouse-server/config.xml
    <macros>
        <set>1</set>
        <shard>2</shard>
        <replica>clickhouse01</replica>
    </macros>
```

分散した各サーバ全てにSELECTなどのクエリがいきわたるよう、今度はクラスターの設定を行います。zookeeperからクラスタ設定自動生成する手段、無いのかなー…。なお、クラスタ設定はオンラインで適用されるため、ClickHouseの再起動は不要です。不要なんですが、以前のクラスタ定義が、system.clustersテーブルに残り続けているので、不快な人は再起動したほうがいいかもしれません。

1号機2号機両方

```xml:/etc/clickhouse-server/config.xml
    <remote_servers>
        <cluster01>
            <shard>
                <replica>
                    <host>clickhouse01</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>clickhouse02</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
        </cluster01>
    </remote_servers>
```

このように設定をいれておくと、クラスタ名「cluster01」で、2ノード構成で、互いの接続にはdefaultユーザを使う、という設定ができます。clickhouse01とclickhouse02はDNSやhostsで名前が引けるのが前提です。

# データテーブル作成

とりあえずこんな風にして、再度ReplicatedMergeTreeテーブルを両方で作ります。

```sql
CREATE TABLE sharding_access_log_20171222 (
  log_date Date,
  url String,
  referrer String,
  ip String,
  ua String,
  created_at DateTime
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{set}-{shard}/sharding_access_log' , '{replica}', log_date, (log_date, url, referrer, ip, ua, created_at), 8192)
```

その後各々にデータを入れて、各々にSELECTを打ってみますが…各々のデータしか見えません。残念。

# 参照用のDistributedテーブルの作成

各サーバに散らばった各テーブルを参照するために、Distributedテーブルを作成します。内部的にはこれもViewに該当します。

```sql
CREATE TABLE d_sharding_access_log_20171222 (
  log_date Date,
  url String,
  referrer String,
  ip String,
  ua String,
  created_at DateTime
) ENGINE = Distributed(cluster01,default,sharding_access_log_20171222);
```

このd_sharding_access_log_20171222にSELECTを行うことで、2017/12/22分の全サーバのアクセスログを横断的に見ることができるようになりました。あと一歩ですね。

# distributedテーブルをさらに横断的にみるMergeテーブルを作成

全日のデータを全シャード横断的にみるために、以下のようにまたまたViewとなるテーブルを作成します。

```sql
CREATE TABLE sharding_access_logs (
  log_date Date,
  url String,
  referrer String,
  ip String,
  ua String,
  created_at DateTime
) ENGINE = Merge(default,'^d_sharding_access_log_.*');
```

これで、このsharding_access_logsテーブルに対してSELECTを発行すれば全てのログが…見えます。

なお、Distributedテーブルを作る際にMergeテーブルを一度指定してみましたが、残念ながらエラーになりました。したがってこの順にマージしていく必要があるのかな、と思っています。
Git の初期設定

新しいMacを購入したので、諸々の設定備忘録です。今回はGitの設定。

# ユーザ情報の設定
大概設定し忘れてコミットしてしまったりして、恥ずかしい思いをしますね。

```
git config --global user.name "First-name Family-name"
git config --global user.email "address@email.com"
```

#エディタを vim に変更

```
git config --global core.editor 'vim -c "set fenc=utf-8"'
```

# git push のデフォルト設定
git push するときに出る警告を回避します。

```
git config --global --unset push.default
```
Kivy を Windows で動作させると UnicodeDecodeError が発生する場合の対処方法

#背景
Kivy を使用し、 .kv ファイルで記述したGUIを Windows 環境で動作させようとしたところ、UnicodeDecodeError が発生し、起動に失敗した。
エラーメッセージは以下。

`UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 174: illegal multibyte sequence`

#環境
- OS:Windows10
- Python:3.5.4 (Anaconda3)
- Kivy:1.10

#対処
Kivy の bulider.py を一部変更。
ファイルは（自分の場合は）以下の場所にあった。
`C:\Users\[ユーザー名]\Anaconda3\envs\[環境名]\Lib\site-packages\kivy\lang\builder.py`

#変更内容
builder.py 内、 load_file 関数の以下の箇所を編集。
kivy 1.10.0 の場合は 288行目。

##変更前
```python:builder.py
        with open(filename, 'r') as fd:
```
##変更後
```python:builder.py
        with open(filename, 'r', encoding='utf8') as fd:
```
上記変更にて、正常に動作することを確認した。

#原因
（推測だが）Windows でファイルを開く場合、自動的にShuft-JIS(cp932)として解釈される、しかしファイルはUTF8で記述されているため、エンコードに失敗した。
対処として、UTF8としてファイル指定し開くと問題なく開くことができる。
なお、これの対応を行ってしまった場合、万一、Shift-JIS や ECU-JP で.kvファイルを記述した場合、エラーが発生する可能性がある。（そもそも Python スクリプト書くなら UTF8 使うべきだとは思う‥）
1クリックURL切り替え

WEB開発の際に本番環境と確認環境の異なるURLがあると思います。
普段はキーボード操作でそんなに手間なく切り替えられるのですが、周囲のデザイナーさんたちからクリック1発で切り替えたいといった要望がありましたので作成しました。

javascriptをブックマーク登録し、そのブックマークを呼び出すことでjavascriptが実行されるという仕組みです。

URLを書き換えるサンプルスクリプト

```javascript:
var arr=location.href.match(/^(.*?)\.(.*)$/);
if( arr[1].match(/-s/) ) {
  location.href = arr[1].replace(/-s/,'') + '.' + arr[2];
} else {
  location.href = arr[1] + '-s.' + arr[2];
}
```

軽く解説。
最初の正規表現でURLの先頭から最初の「.（ドット）」までを取得。
その右端に「-s」が付いていれば削除。
「-s」が付いていなければ付与します。

1. このscriptの改行を取り除きコピー
- ブラウザのブックマークを新規作成
- URL欄に「javascript:」と入力。
- 続けてscriptをペースト
- URLを切り替えたいページを開き、登録したブックマークをクリック
 - ブックマークをクリックするたびに「-s」の有無が切り替わります
 - ツールバーあたりに置いておくとすぐにクリックできます

改行を取り除き「javascript:」を付与したscriptも置いておきます。

```javascript
javascript: var arr=location.href.match(/^(.*?)\.(.*)$/);if( arr[1].match(/-s/) ) {location.href = arr[1].replace(/-s/,'') + '.' + arr[2];} else {location.href = arr[1] + '-s.' + arr[2];}
```

同様の方法でPCサイト⇔スマホサイトのURL切り替え等も可能です。

```javascript:
var domains = [
  {pc:'pc.example.com',sp:'sp.example.com'},
  {pc:'hoge.example.com',sp:'poge.example.com'}
];
for( var service of domains ) {
  if(location.host == service['pc']) {
    location.href = location.href.replace(service['pc'], service['sp']);
    break;
  } else if(location.host == service['sp']) {
    location.href = location.href.replace(service['sp'], service['pc']);
    break;
  }
}
```

改造はご自由にどうぞ。
PapertrailをAnsibleで設定する

## Papertrail とは

> Frustration-free log management. Seamlessly manage logs from apps, servers, and cloud services.

https://papertrailapp.com


ログの集約・検索・アラートなどができて便利なやつ。


## Ansibleで設定する

例えば、Ruby on Rails apps のための設定方法は [Configuring centralized logging from Ruby on Rails apps](https://help.papertrailapp.com/kb/configuration/configuring-centralized-logging-from-ruby-on-rails-apps)に書かれている。


Ansibleのroleだとこんな感じになるかと。

```yaml
- name: install remote_syslog2 rpm
  yum: name=https://github.com/papertrail/remote_syslog2/releases/download/v0.19/remote_syslog2-0.19-1.x86_64.rpm state=present

- name: copy /etc/log_files.yml
  template: src=etc/log_files/template.yml dest=/etc/log_files.yml owner=root group=root mode=644

- name: copy /etc/init.d/remote_syslog
  copy: src=remote_syslog.init.d dest=/etc/init.d/remote_syslog owner=root group=root mode=755

- name: start remote_syslog
  service: name=remote_syslog state=started enabled=yes
```

なお、起動スクリプトの/etc/init.d/remote_syslog は https://github.com/papertrail/remote_syslog2/tree/master/examples に例があります。
息抜きにエディターにPower mode 2プラグインを入れて生産性爆発

![bam.gif](https://qiita-image-store.s3.amazonaws.com/0/107536/e4c04b2d-b90e-0c15-6bd3-7c1c9bbce5b3.gif)




自分はrubymineに入れましたが、settings > plugin > 検索バーにPower mode 2　で出てきます。

確かVSCodeとかAtomにもあった気がします。

見たいがためにctrl+zとかして遊んでたんですが、コミットしてないと事故で本当に生産性が爆発します。
iTerm2の設定備忘録

Macを新しくしたので、一から環境を作り直してみる。その際の備忘録。

参考: https://qiita.com/bake0937/items/79e350a474c1cd60a5e0
（ありがとうございます！）

* [iTerm２](https://www.iterm2.com/)をダウンロードし、インストールしておきます
* iTerm2 には prezto というフレームワークを使用します。

# コマンドラインツールをインストール
iTerm を開いて以下のコマンドでインストール。手順にしたがっていきます。インストールには数分かかりました。

```
$ xcode-select --install
```

# Homebrew インストール
[Homebrew](https://brew.sh/index_ja.html)に書いてあるコマンドを実行します。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

途中で return キーを押したり、パスワードを入力するところがあります。

# Git をインストール

```
$ brew install git
```

# zsh をインストール
最終的には iTerm に prezto をインストールしたいので、zsh を入れます。

```
$ brew install zsh
```

# ログインシェルを変更
さきほどインストールした zsh の場所を確認します。

```
$ which zsh
```

ここで出てきたパスを `/etc/shells` に追記します。

```/etc/shells
+ /usr/local/bin/zsh
```

保存したら、シェルの変更を反映します。

```
$ chsh -s /usr/local/bin/zsh
```

iTerm を再起動します。

# prezto をインストール
[prezto](https://github.com/sorin-ionescu/prezto)のドキュメントに従います。

```リポジトリをクローン
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

設定ファイルを新規追加します（今回は既存の設定がないため、このままいきます）

```~/.zshrc
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi
```

# デフォルトのエディタを nano -> vim に変更
Git でコメントを入力する際に、自動で立ち上がるエディタを変更します。

```~/.zprofile
#
# Editors
#

- export EDITOR='nano'
+ export EDITOR='vim'
- export VISUAL='nano'
+ export VISUAL='vim'
export PAGER='less'
```

# テーマをインストール
今回は簡単にインストールできる、themeにします

```~/.zpreztorc
zstyle ':prezto:module:prompt' theme 'steeef'
```

# zsh-completions をインストール
コマンドの補完機能を強化する[zsh-completions](https://github.com/zsh-users/zsh-completions)を Homebrew でインストールします。

```
$ brew install zsh-completions
```

次に設定ファイルに追記します。

```~/.zshrc
+ fpath=(/usr/local/share/zsh-completions/src $fpath)
```

強制的に zcompdump をリビルドしようとしたら、エラーがでました。

```
zsh: command not found: compinit
```

ということで、以下のコマンドを挟んでから .zcompdump を削除します。

```
$ autoload -U compinit
$ rm -f ~/.zcompdump; compinit
```
NAT接続のVMへVSCodeからリモートデバッグ

NAT接続したVM上のCentOSで動くPHPのWebアプリケーションをxdebugでホストOSからリモートデバッグする、
というちょっと面倒なことをしようとしたところ、案外(?)うまくいかなかったのでメモ。

## 環境

+ ホスト: Windows8.1
+ ゲスト: CentOS6.4

## ホスト側準備
### VirtualBox
+ ネットワーク設定
  - NAT
  - xdebugのポート(9000)は **ポートフォワードしない**
+ 共有フォルダ設定
  + ホスト側でソースを編集したいので

### VSCode
+ 拡張機能
  + [PHP Debug](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug) インストール
+ launch.json 編集(`pathMappings`の部分)

```json:launch.json
{
"version": "0.2.0",
  "configurations": [
    {
      // 基本的にはデフォルトのままで大丈夫
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "log": true,
      "port": 9000,
      "pathMappings": {
         "{ゲストOS上のパス}" : "${workspaceRoot}"
      }
    }
  ]
}
```

## ゲスト側準備
### xdebug
+ インストール
  - `sudo yum -y install php-pecl-xdebug --enablerepo=epel`
  - リポジトリの設定などは他のサイトを参考に
+ 設定

```ini:/etc/php.d/xdebug.ini
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_host=192.168.xx.xx #ホストOSのWAN側IPアドレス
xdebug.remote_port=9000

```
+ Apache再起動

## いざ、デバッグ
+ VSCodeで <kbd>F5</kbd> すると、無事ブレークポイントで止まりました。
【Vim】シェルの実行結果を行としてではなく現在のカーソル位置に挿入する

例えば`:read !date`などと打つと、dateの結果を挿入することができるけど、行で出力されてしまうので、カーソルの右側に出力したいという用途には使えない。

挿入モードやコマンドラインモードで`<C-r>=`を使うと現在のカーソル位置にVim scriptの結果が挿入されるので、`<C-r>=`を打った後、`system('date')`と打つとやりたいことが大体できるが、最後の改行が入ってしまうのと、`system('')`を打つのがめんどい。

そこで、`<C-r>!<command>`で`<command>`の実行結果から最後の改行を取り除いたものをカーソル位置に挿入できるようにした。

```vim
inoremap <expr> <C-r>! <SID>system()
cnoremap <expr> <C-r>! <SID>system()

function! s:system()
  let command = input("!", '', 'shellcmd')
  return substitute(system(command), '\n\+$', '', '')
endfunction
```

上記をvimrcに書いて

```
わたしは<C-r>!whoami<CR>です。
```

と打つと

```
わたしはtmsanrinshaです。
```
となる。
html pageのfull screenに関して

## google guides

  https://developers.google.com/web/fundamentals/native-hardware/fullscreen/

## awesome library
https://sindresorhus.com/screenfull.js/

## Browserのfullscreen API
### iOS Safari
<font color="darkred">video以外はsupportしてない見たい</font>

```javascript
video.webkitEnterFullscreen(); 
```
- 上記のコードはevent(original eventで, javascriptで誘導したeventでは無い)処理中しか、動作しない。それ以外は、`InvalidStateError (DOM Exception 11): The object is in an invalid state.`ようなエラーが発生する。原因はjavascriptで完全にコントロールできると、ユーザーがびっくりする可能性があるから？

### Chrome && Mac safari

```javascript
div.webkitRequestFullscreen();
video.webkitRequestFullscreen();
video.webkitEnterFullscreen();
```
- video elementはwebkitRequestFullscreenとwebkitEnterFullscreenを両方support、区別は不明。
- 上記のコードはevent(original eventで, javascriptで誘導したeventでは無い)処理中しか、動作しない。それ以外は、`InvalidStateError (DOM Exception 11): The object is in an invalid state.`ようなエラーが発生する。


### videoをfullscreenモード
```javascript
var videoElement = document.getElementById("videoElement");
videoElement.requestFullscreen();
```
- videoだけをfullscreenモードすると、他の機能が使えない可能性があるので、videoを含めたcontrainer全体をfullscreenするのをお勧め。

### fullscreenに関するpseudo selector
```css
<style>
  #goFS:-webkit-full-screen #goFS {
    display: none;
  }
  #goFS:-moz-full-screen #goFS {
    display: none;
  }
  #goFS:-ms-fullscreen #goFS {
    display: none;
  }
  #goFS:fullscreen #goFS {
    display: none;
  }
</style>
```
単なるソートで詰まった話

この記事は[JustSystems Advent Calendar 2017](https://qiita.com/advent-calendar/2017/justsystems)の22日目の記事です。

# はじめに

普段は自然言語処理に使う言語資源をいじっています。

担当している業務のひとつに、  

* 辞書リソース(語句リストのようなもの)をソートしてね
* Excelの「並べ替え」機能を使ってやってね  

という工程が含まれています。

たしかにExcelで行っても特段コストのかかる作業ではありませんが、普通に`sort`コマンドで済ませたらもっと楽になるのでは？とあるとき思いました。
とはいえ、「ソート手順を変えた」という要因だけで従来のリソースとの差分が大量に出ると面倒くさいです･･･。[^1]   
[^1]: 扱っているエントリは万オーダーです。リソースの並びが変わることで出力結果に影響はない？などの考慮が必要です。   

ということで、まずは様々な条件でソートしてみて、Excelのソート結果を再現できるものはあるか試してみました。
結論としては、自分がやってみた限りでは`sort`コマンドではExcelのソート結果を再現できませんでした。
ただ、単なるソートでも色々あるのね･･･とわかったため、今回やってみた検証について紹介しようと思います。

# サンプルでやってみる

## サンプルデータ

かなり適当ですが、さまざまなタイプの文字を並べてみます。
含めたのは、記号、数字、アルファベット、ひらがな、カタカナ、漢字です。それぞれの字種で、大文字小文字、濁点込みなど、適当にバリエーションをつけました。

<pre>
＠
1
2
ａ
Ａ
ｂ
Ｂ
ァ
ぁ
ア
あ
ィ
ぃ
イ
い
ハ
は
バ
ば
パ
ぱ
ゑ
亜
拼
</pre>

## Excelのソート条件

以下の条件でサンプルデータをソートしておきます。

* セルの表示形式は**文字列**にしておく
* 昇順
* オプションは**「大文字と小文字を区別する」**、**「行単位」**、**「ふりがなを使わない」**にチェック

## 実行コマンド

ただの`sort`です。
この実行結果とサンプルデータとの差分を見ていきます。

## 実行環境

以下の環境で実行します。できればwindows環境で作業を完結させたいという理由から、windows環境でコマンドを使えるものを2つ選定しました。複数選んだのは、使うツールによって結果に差がでないか？ということを確認するためです。いずれも凝った設定は特にしていません。

* linux環境
* windows環境: Cygwin
* windows環境: Git Bash

## 結果

* いずれのwindows環境でも`sort`でExcelのソート結果を再現できた
* linux環境とwindows環境ではソート結果に差分が出た

linuxだと普通にUTF-8の文字コード順に並んでいるようですが、
<pre>
1
2
＠
Ａ
Ｂ
ａ
ｂ
ぁ
あ
ぃ
い
は
ば
ぱ
ゑ
ァ
ア
ィ
イ
ハ
バ
パ
亜
拼
</pre>
windowsのこの並びは何順･･･？
<pre>
＠
1
2
ａ
Ａ
ｂ
Ｂ
ァ
ぁ
ア
あ
ィ
ぃ
イ
い
ハ
は
バ
ば
パ
ぱ
ゑ
亜
拼
</pre>
と思いましたが、どうやらJIS X 4061「[日本語文字列照合順番](http://kikakurui.com/x4/X4061-1996-01.html)」(辞書順)のようです。[^2]
[^2]: @masudakz さんアドバイスありがとうございました。  

ちなみに、LANG環境変数はいずれも日本語表記向けの`ja_JP.UTF-8`で設定されていますが、この設定をとっぱらうために`LANG=C sort`にしてみたところ、linux環境とwindows環境で同様のソート結果が得られました。
こうすることで普通の文字コード順になるようですね。  

ともかく、サンプルデータを試してみたところ、windows環境のコマンドでExcel結果の再現ができそうなことがわかりました。

# 辞書リソースでやってみる

今度は、実際の辞書リソースでソートの比較を行います。

## フォーマット

実際のリソースは以下のようにタブ区切りになっています。
Excelでソートをする際は、[文字列1]をキーにしています。
※実際のソースにはblacketは含まれていません。視認性のために便宜的に付与しています。

<pre>
\t[文字列1]\t[文字列2]\t[文字列3]\t[文字列4]\t[文字列5]\t[文字列6]
</pre>

## Excelのソート条件／実行コマンド／実行環境

サンプルデータと同様です。

## 結果

* linux環境、windows環境のいずれにおいてもExcelのソート結果を再現できなかった
* windows環境とExcelの結果差分が1箇所だけだった

1箇所だけというのも惜しいですね･･･。
具体的には以下のような行で差分が出ました。
<pre>
①　\t[文字列1]\t[文字列2]\t[文字列3]\t[文字列4]\t[文字列5]\t[文字列6]
②　\t[文字列1]\t[文字列2]\t\t[文字列4]\t[文字列5]\t[文字列6]
</pre>

②は3フィールド目が空白になっています。

この2エントリだけがソート条件によって逆になります。
Excelでは①→②の順、windows環境では②→①の順となりました。

この差分の理由ですが、どうやら

* Excelだと、[空白は後ろになる](https://support.microsoft.com/en-in/help/322067/how-to-correctly-sort-alphanumeric-data-in-excel)ので①→②の順  
  > Blanks - Excel always places blanks last.

* windows環境でのソートだと、単純に文字コードでタブと文字列を比較しているので②→①の順

ということだそうです。[^3]
[^3]: Tさんアドバイスありがとうございました。
つまり、Excelのソート順は **辞書順をベースにしつつ独自のルールを設けている** ということなのでしょうか。

# おわりに

これまでの内容をまとめます。

* Excelのソート結果と`sort`コマンド実行結果を比較してみた
* `sort`ではExcelのソート結果を再現できなかった
    * windowsは辞書順ベースらしい
    * ExcelはExcelなりのソートルールがあるらしい

冒頭にも書きましたが、ただのソートをとっても色々あるのだなあと思いました[^4]。
それとともに、文字コードまわりの話は厄介かつ奥深いものだなとも感じました。  
[^4]:  [漢数字も数字順にソートされない](http://blog.jnito.com/entry/2014/12/03/185146)ようですし･･･。

文字についてのもっと高次なお話はどうやら最終日に聞けるそうです:sunglasses:
ということで、前座噺に[^5]ソート・文字コードのお話を少ししてみました。それではよい週末を！  
[^5]: にもならない？
exa 使い方メモ

![img](https://raw.githubusercontent.com/ogham/exa/master/screenshots.png)
https://github.com/ogham/exa
http://wonderwall.hatenablog.com/entry/2017/08/07/222350

```:とりあえずalias
alias ls=exa
```

```:1行
ls -1
```

```:詳細
ls -al
```

```:超詳細
ls -halgHiS
```

```:再帰
ls -R
```

```:再帰l
ls -lR
```

```:ツリー
ls -T
```

```:ツリーl
ls -lT
```

```:再帰のDEPTH指定
ls -RL2
```

```:ツリーのDEPTH指定
ls -TL2
```

```:ファイルタイプ情報付与
ls -F
```

```:ディレクトリを先頭に
ls --group-directories-first
```

```:globに一致するもののみ表示
ls -d *.py
```

```:globに一致したものを無視
ls -I *.tmp
```

```:.gitignoreに記載されているものを無視
ls --git-ignore
```

```:git情報付与
ls -l --git
```

```:グループ情報表示
ls -lg
```

```:タイムスタイル指定
ls --time-style=iso
ls --time-style=long-iso
ls --time-style=full-iso
```

```:オススメalias
alias ls='exa --group-directories-first'
alias ll='exa -hal --git --time-style=iso --group-directories-first'
```

## exaコードリーディングのすゝめ

https://www.slideshare.net/ShinichiMakino1/exa-84358376
【Clojure】FirebaseCloudMessagingでプッシュ通知を送る

fcmでNotificationを送る時のメモ

送り方だけの説明です。[その前の設定はこちら](https://qiita.com/pubron/items/27e2ed29416109659887)

## 要件

シンプルに、

- 音鳴らしたい
- バイブレーション鳴らしたい

## データ構造

jsonで表すとこんな感じ

```json
{
 "to": "ここにFCMトークンをいれる",
 "notification": {"body": "Hello from curl via FCM!", "sound": "default"},
 "priority": "high"
}
```

## APIにする前にまずcommandlineでテスト

https://fcm.googleapis.com/fcm/send
にPOSTするだけ。

```bash

$ curl --header "Content-Type: application/json" \
--header "Authorization: key=あなたのサーバーキー" \
https://fcm.googleapis.com/fcm/send \
-d '{"notification": {"body": "Hello from curl via FCM!", "sound": "default"},
"priority": "high",
"to": "ここにFCMトークンをいれる"}'

```
serverKey は、

Firebaseコンソール -> Project Overview -> アプリの右上押して「設定」 -> 上部タブから「Cloudメッセージング」 -> 「サーバーキー」

に書いてあるトークンをコピペ。


## ClojureでAPI作るならこんな感じで

```clj
(ns yourapp.notification
 [org.httpkit.client :as http]
 [clojure.data.json :as json])

(def RIZM-FCM-SERVER-KEY "あなたのサーバーキー") ;キー直書きは非推奨

(http/request
   {:url "https://fcm.googleapis.com/fcm/send"
    :method :post
    :headers {"Content-Type" "application/json"
              "Authorization" (str "key=" RIZM-FCM-SERVER-KEY)}
    :body (json/write-str {:to "送信先のtoken"
                           :priority "high"                           
                           :notification {:body "通知メッセージ" :sound "default"}})
    } (fn [{:keys [status headers body error]}]
        (when error (info "fcm error:" error))))

```



他使えるパラメータは下記「通知ペイロードのサポート」の内容を参考に。
https://firebase.google.com/docs/cloud-messaging/http-server-ref?hl=ja
とりあえずLINEに通知が欲しいから、適当なスクリプトを作った

# 動機
- 社内のGPUサーバーでAIの学習をしている際、学習が終了するまでとても時間がかかる
    - 気づいたら終わってる、みたいなことが多い
        - 急ぎの学習の場合などはすぐに後続の作業にうつりたい

ということで、学習が終わったら何らかの形で通知が欲しいなぁと思いました。

で、LINEに通知が来ればまぁどこにいても受信できそうなので、
簡単にLINEで通知が来るスクリプトをPythonで作成しました。

# コード
- 前提
    - [LINE Notifyのページ](https://notify-bot.line.me/ja/)のマイページから、アクセストークンが発行できていること

とりあえずで作ったので超適当です:sweat_smile:
Python2.7環境で動作確認しました。


```line_notification.py
import subprocess
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        prog='line_notification.py',
        usage='Exec on terminal.',
        add_help=True,
    )
    parser.add_argument('-t', '--token', help='LINE ACCESS TOKEN', required=True, type=str)
    parser.add_argument('-m', '--message', help='message data', required=True, type=str)
    args = parser.parse_args()

    # LINE notification
    command = 'curl -X POST -H \'Authorization: Bearer {TOKEN}\' -F \"message={MESSAGE}\" https://notify-api.line.me/api/notify'.format(
        TOKEN=args.token,
        MESSAGE=args.message
    )
    subprocess.call(command, shell=True)
```

# 使い方

```console
python line_notification.py -t "ACCESS_TOKEN" -m "MESSAGE"
```
[Unity]カメラの消失点を中央からずらすスクリプト


#実行手順
##スクリプトを保存してAdd
```csharp:ObliqueProection.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[ExecuteInEditMode] 
public class ObliqueProection : MonoBehaviour {

	[Range(-1f,1f)] public float horizontal;
	[Range(-1f,1f)] public float vertical;
	public float distance;
	private Vector3 org_position_;

	void OnEnable()
   {
       EditorApplication.update += EditorUpdate;
	   org_position_ = transform.localPosition;
   }

   void OnDisable()
   {
       EditorApplication.update -= EditorUpdate;
   }

	void EditorUpdate ()
	{
		var cam = GetComponent<Camera>();
		var proj = cam.projectionMatrix;
		proj.m02 = horizontal;
		proj.m12 = vertical;
		cam.projectionMatrix = proj;		
		var tan = Mathf.Tan(cam.fieldOfView*0.5f*Mathf.Deg2Rad);
		var rect = cam.pixelRect;
		var ratio = (float)rect.width/(float)rect.height;
		transform.localPosition = org_position_ + new Vector3(-horizontal*distance*tan*ratio, -vertical*distance*tan, 0f);
	}
}

```

上記のスクリプトを `ObliqueProjection.cs` に保存し、カメラオブジェクトにアタッチします。

##カメラから基準面への距離を設定
Distance に入れた値で基準面を決定します。
![distance.png](https://qiita-image-store.s3.amazonaws.com/0/90046/111398cd-9188-d1a9-55b4-592423ac1551.png "distance.png")


##動かします
![oblique00.gif](https://qiita-image-store.s3.amazonaws.com/0/90046/3db9c9a8-4f01-997a-b0b6-37f48a71e8ed.gif "oblique00.gif")


#Enjoy!
原理の解説はなく使い方だけ書きました。エディタ機能で作りましたが、プレイ中にのみ使用する場合は EditorUpdate を Update にすれば良いでしょう。

消失点を変更する演出は、ゲームよりも映像系で重宝しそうですね。めでたしめでたし。
サーバー作った時にやってよかったこと・詰まったこと・後悔したこと

箇条書きで書いていきます(後からあればまた付け加えていきます)
※ 自戒を込めて書いてるので、知識のある方であれば色々お伝えしていただけますと幸いです🙇

基本的にやったことは↓を参照
[GCEでstaging環境作ったのでメモ](https://qiita.com/yogoken/items/5d899cce2f0328d93f8c)

## 開発環境のみ記述

```
RoR アプリケーション
Jsでwebpackを利用している
ディスクのOSイメージはCentOS6
```
## やってよかったこと

### Sprocketsからwebpackに移行した
assets配下のディレクトリを全て削除し、frontendという名前のディレクトリを作り、そこでjsなりscssを管理した。サーバーで特に目立ったり店はあまり見当たらなかったが、今後railsじゃ無くなるフロントエンド側の実行環境をrailsから切り離すことに意味があった。また、開発環境にてforemanを利用したことにより自動的にリロードしてくれるようになり、css変更時にリロードする必要がなくなったためスピードが上がった。

### ES6対応を早めにした
開発初期は特にサーバー側にyarnをインストールしてなかったためES2015しか利用できなかった。(ES6でデプロイするとcompileエラーになる)ただ、nvm経由のnpmでyarnを入れ、installするだけだったので思った以上に難しくなかったため初めから入れとけばよかったと思っている。

## 詰まったこと

### root権限で作業することは基本的にないと思ったほうがいい。(例外を除き)
root権限で作業してsshでgitをcloneすると、セッションが切れた際に誰も入れなくなった。個人的に厄介だったのが、root権限でsshしてgit cloneをしてしまうと、個々人で作った秘密鍵をssh時に利用してしまうことになるので誰もインスタンスにログインできなくなってしまう可能性が高い。実際に `ssh_exchange_identification: read: Connection reset by peer`感じのエラーが立て続けに起きて、誰も入れなくなってしまった。

### dbを構築するときは`言語`(mysql, psgl)としてのことか、`DB`としてのことかを理解しながら作ると詰まらなさそう
よくあるのがutf8->utf8mb4に変更するときdb自体を変更する時にrailsの機能を使うとか。つまり、railsの機能->dbに設定してるので、言語云々の話ではない。ただ、`Access denied for user ''@'localhost'`みたいなのはmysql側で変更してあげる必要があるとか。centOSにデフォルトでmysqlが入ってて、それ消さないと他のバージョンのMySQL入れたい時に競合するとか。こういった一つ一つの問題の主語を間違わないように気をつける。

## 後悔したこと

### ディスクのOSイメージの違いがあまり理解してない中でstaging環境とproduction環境を作ったこと
CentOs7, CentOs6, Debianなどなど、それぞれデフォルトのコマンドが違うとか、積んであるものが違うとかしか理解してなかったが、もっと吟味して選ばないとすぐに後悔することになりそう。GCPかAWSかHerokuかみたいなのと似てる気がする。もっというと、将来的には「Docker + GCP + k8s」が理想だけれども（←なんで？）状況的に考えて、GAE for rubyかherokuにしてDBだけGCPの使おうとかをもっと吟味したほうが良さそう。

### 属人性を防ぎたいがインフラできる人が多くない場合に、できるだけ2人目の権限は最小にすべきだった
もしちょっとかじった人が2人目でインフラを触った時に、killコマンドとか、ridgepoleを本番で実行するとかそういうのを`可能`にしちゃうととんでもない大惨事が起こる可能性が出ると感じた。もちろん環境ごとにrakeタスクを回させて、コマンドを打たせないとかは大切だと思うけど、全部が全部rakeタスク作ればいいというとそんな時間もないし...万が一最小にするのも面倒であればcapistranoとか利用してslackのprivate channelとかからコマンドでデプロイできる環境作って、そこに入れる人で管理するのも一ついい案だなと思った。


## 最後に
まだまだ運用してみてボロを経験できてないので、もっと大きく後悔することとか、つまるところがあるかと思います。
そういった際はまた追加していこうと思ってます...
SendGridのEvent WebhookをAWS Lambdaで受ける

SendGridのEvent WebhookをAWS API Gateway経由でLamdaで受けて、CloudWatchにログ出力してみました。



### SendGridアカウントの作成
https://sendgrid.kke.co.jp/app?p=signup.index からアカウント登録しました。

> 審査結果のメールが届くまで、しばらくお待ちください（通常2営業日以内）。
なお、アカウント発行時にはログイン情報をメールでお送りしております。
このメールは再送できませんので大切に保管してください。

とのこと。

> SendGridにようこそ！
それでは、さっそくマイページにログインしてみましょう。
お客様のユーザ名：●●●●●●@kke.com
パスワード　　　：ご登録時に指定したパスワード

無事審査通過です。日曜に申請して、月曜日に連絡きました。



### Event Webhook の設定

https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html を参考に進めました。

### AWS API Gateway
SendGrid Webhook送信エンドポイントおよびLambda起動用のAPI Gatewayを設定します。
![スクリーンショット 2017-12-22 午後4.18.52.png](https://qiita-image-store.s3.amazonaws.com/0/37984/98eb837f-39fb-9ee3-4117-3cefa31c2401.png)



### Lambda
Event Webhookの受信だけ確認できれば良いので、ログ出力する程度ものを実装しました。

```js
exports.handler = function(event, context) {
    console.log('**************** DUMP:START ****************');
    console.log(event);
    console.log('**************** DUMP:END ****************');
};
```



### 動作確認
SendGridには、Webhook動作確認用の「Test Your Integration」という機能があるので、そちらを動かしLamdaのログをClowdWatchに保存させました。
以下、CloudWathで確認できるログです。SendGridから送信されたEvent Webhookが確認できます。
![スクリーンショット 2017-12-22 午後4.22.28.png](https://qiita-image-store.s3.amazonaws.com/0/37984/1685b210-637a-7490-35ee-d69a85c1a0fe.png)



### 参考

- SendGrid Event Webhook: https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html

- Lambdaとは: http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
- サマリ: https://aws.amazon.com/jp/lambda/
- Lambda詳細: http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
- Amazon API Gateway での AWS Lambda の使用: http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-on-demand-https.html
command lineでbitbucket pull request

この記事は Wanoグループ Advent Calendar 2017の24日目の記事になります。

bitbucketとgit hub同じように、pull requestsの機能がある。
しかし実際使うの時、web UIの操作はけっこう重いと思いますので、出来ればcommand lineの操作したいです。

まずは調べで、Bitbucket Server Command Line Tools発見しました。
最初は入れる簡単と思うけど、うまく行けなかった。どうしていけないのと思うの時、一番上のお知らせ気づきました。"This command line tool is a utility for Bitbucket Server (where you download and host bitbucket yourself). If you are a user of Bitbucket Cloud (bitbucket.org) then this tool is not for you."。。。私はbitbucket.org使うので、悲しい。

別の方法探すと、もう一個のsolutionあった、bitkucket-cli。

まずinstallします：

```
pip install bitbucket-cli
```

configファイルの設定 (~/.bitbucket):

```
[auth]
username = < Your Username >
password = < Your Password > #設定しないも大丈夫

[options]
scm = <'git' or 'hg'>
protocol = <'https' or 'ssh'> # 実際はBitbucket REST API今https対応のみらしい、ここでhttpsしてください。
```

使うの時めちゃ簡単：

```
//bb pull_request --owner XXX source_branch destination_branch
bb pull_request --owner　Johnny develop master
```

結果：
Pull request successfully opened. 
Link: http://bitbucket.org/XXXX/test_project/pull-requests/1

参考記事:
https://bitbucket.org/zhemao/bitbucket-cli
https://bitbucket.org/atlassian/bitbucket-server-cli
金！！経費！！精算！！

AdventCalendar、解散カレンダー22日目
( ◔ ౪ ◔)

前回の続きです。

# 買い物じゃ
さぁ買い物です、予め予算を渡しておきその中で納めるようにしましょう。
超えそうであれば「報告、連絡、相談」です。
この時必ず**領収書**を忘れずに発行させましょう。
買い物をした動かぬ証拠になります。

#誰でも見れるように
買うものも買ったので早速管理をしましょう。
経費で信頼されるには"透明性"が求められます、
「"いつ""なにを""どれだけ""いくらで"買ったのか」とお金を払う側とすれば気になって当然ですが
それが分かりづらくよく分からない状態になると信頼されず追加徴収となると渡すのに抵抗が生まれてしまうでしょう。
なので必ず**”"いつ""なにを""どれだけ""いくらで"買ったのか**を**何時でも誰でも見れるよう**にしましょう。
![hoge.PNG](https://qiita-image-store.s3.amazonaws.com/0/217288/7746cde0-a837-0452-f7ab-c3fc139bfae2.png)
私たちのグループではこのようにスプレッドシートを使いだれ誰でも閲覧できる状態にしておきました。
また買った物の領収書などをチャットツールなどで共有し証拠を残しておきましょう。

#終わりに
いかがでしょうか？正直こう言う管理は本当にやりたくないしこれらの管理専用の人間が欲しいぐらいですが金も人もいないとやらなくてはいけなくなります。
「テキトーでいいや～」と放っておくと(その後の関係が)大変なことになるので、自分なりでもいいので皆の納得のいく管理をしましょう。
では素晴らしいクソメンドクサイ管理ライフを・・・

#本当の最後
はい、終わりました、もう終わりです僕の担当終わりです。

この「解散 Advent Calendar 」私だけコードについては一切書いてないんですね、
それもそのはず私殆どコード打ってません、初めての管理職をしました、もう二度としたくないです。
冗談はさて置き進捗やら管理やらは反省点ばかりでしたね、相当メンバーに迷惑をかけたんじゃないでしょうか・・・
そんな反省をしつつおわりです、制作がヤバイので終わりです。
では皆さま素敵な管理職ライフを！
( ◔ ౪ ◔)ﾇｯﾍｯﾎ！
Pitagora virtualbox VM (もしくはGalaxy一般？)にて、history error(?)でGalaxyが立ち上がらなくなった時の消極的対処法

この記事は、[Galaxy Advent Calendar 2017](https://qiita.com/advent-calendar/2017/galaxy)の12/22日分として書かれたものです。

#状況

　普段、sshでピタゴラVMにログインして中身をいじりつつ、実際にブラウザ(chrome)上で実装結果がどうなっているかを確認していた。
　ある日、ブラウザからgalaxyを開くと、トップページやら何やらに

```
"[history_id=None] Failed to retrieve history. History unavailable. Please specify a valid history 
```

　とメッセージが出て、ツール等の部品が、ブラウザ上で一切開けなくってしまった。
　新しくVMをダウンロードしてインポートし直せば良いのだろうけど、今いじってるVMだし、出来れば作り直しはせずに、そのままでしばらくは動かしたい。

　色々試したり、また、history error なんちゃらとかでGalaxyProject関連をぐぐってみたりもしたが、よく分からなかった。

#方針として、

* とにかくひとまず動けばいい。
* 余計な手間(時間)をかけずに作業に戻りたい、

……といった辺りだった。

#対応1

 **「同様の状況になったことあるけど、chromeのキャッシュをクリアしたら直った」**という情報を、ピタゴラメンバーより頂く

　やってみた。

　……変化は無かった。

#対応2(消極的解決)

　上記情報では解決しなかったが、でも、エラー状況が同様であることから、chrome側がなんか悪さしてるのかも……、と気づく。

　**ブラウザを変えてみた(Firefox)。**

　→普通に動いた（というか始めから動いていた）。

　とりあえずツール開発の為には何かしらで動けば良いので、そこでひとまず解決とした。
　具体的な原因解明はしていない（というか、できなかった）けれども、とりあえずブラウザ変えてみるとそれだけで何とかなることもあるかもですよ、という話。