OmniAICreator/Qiita-1.07M huggingface dataset:
RubyでGoogle Calendarをサービスアカウントから操作する


### 背景

サーバサイドでGoogle Calendarを使うとき、ユースケースとしては例えば

1. ユーザのデータをカレンダーに登録する
2. サーバ自体の情報をカレンダーに登録する

が考えられる。多くのサンプルは前者のようだが、バッチから公開用のカレンダーを更新するために後者を調べた。
"two-legged OAuth"(2LO)によりサーバ間だけで認証できる。(認証画面が出ない)

google-api-clientは未だalpha版のようである。また、google-api-clientのうち、認証部分はdeprecatedでありgoogle-auth-library-ruby(googleauth)が推奨となっている。

### 準備1: Google Cloud Console

- [Ruby Quickstart](https://developers.google.com/google-apps/calendar/quickstart/ruby)
- Google Cloud Consoleのアカウントがなければ作成する
- APIプロジェクトを作成する
- APIとサービスから、Calendar APIを有効化する
- 認証情報から、認証情報を作成
- サービスアカウントキーを選び、サービスアカウントを作成する
- サービスアカウントのメールアドレスをメモしておく
- JSONファイルをclient_secret.jsonとして保存しておく

### 準備2: Google Calendar

※ 以下は個人アカウントのGmailの場合。

- 新しいカレンダーを作成する
- カレンダー設定から、カレンダーIDをメモしておく
- 共有設定を変更から、サービスアカウントのメールアドレスを追加し、変更および共有の管理権限を与える

### 実行

これ: https://github.com/firewood/google-calendar-ruby/blob/master/google-calendar.rb
環境: https://github.com/firewood/google-calendar-ruby
client_secret.jsonを同じディレクトリに置いておく。

```bash
$ bundle install
$ ./google-calendar.rb
```

認証はしているが、サンプルでは公開カレンダー(日本の休日)を取得している。
MY_CALENDAR_IDにカレンダーIDを設定し、insert_eventを呼び出せばイベントの追加ができる。

### 参考

- https://developers.google.com/api-client-library/ruby/guide/aaa_oauth
- https://developers.google.com/google-apps/calendar/quickstart/ruby
- http://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/CalendarV3/CalendarService
- [Google Calendar API Rubyでイベントを登録する](http://mcommit.hatenadiary.com/entry/2016/04/18/183200)
【Unity】StartCoroutine()でコルーチンを使うときの注意点

StartCoroutine()はMonoBehaviourを継承したメソッドで、
MonoBehaviour.StartCoroutine()
である。

このMonoBehaviourはprint, Start(), Update(), Awake(), OnGui()
などに絡んでくる。StartCoroutine()では重要になる。


例えば別のクラスのコンポーネントを取得するとき、


public class ClassName1 : MonoBehaviour {
ClassName2 class2;
void Start()
{
    class2 = new ClassName2();
}

}

などと書いてしまうと、class2内のメソッドで
StartCoroutine()を実行したときにNullReferenceExceptionが発生する。

下記のサイトのように、ほかのクラスをほかのゲームオブジェクトにアタッチして、

class2 = GameObject.Find("class2Object").GetComponent< ClassName2 >();

とすると正常にコルーチンを実行できた。
http://unitygeek.hatenablog.com/entry/2017/05/23/111254
Ubuntu 16.04にSDL2のGolangバインディングをインストールする

# はじめに
SDL(Simple DirectMedia Layer)は低レイヤーでマルチメディアを扱うことができるクロスプラットフォームのライブラリです。

今回SDLの[Golangバインディング](https://github.com/veandco/go-sdl2)を試そうと思ったのですが、インストールで躓いたので直面した問題と解決策を共有しようと思います。

# 環境
- Ubuntu 16.04
- Golang 1.9 (1.9でなくてもバンディングは使えると思います)

# 問題
```bash
# ※ 各コマンド実行時の出力内容は省略しています。
$ sudo apt-get install libsdl2{,-mixer,-image,-ttf}-dev
# ubuntu 14.04以上ではlibsdl2-sdl-devが壊れているので、ソースからコンパイル
$ hg clone https://hg.libsdl.org/SDL SDL
$ cd SDL
$ mkdir build
$ ../autogen.sh
$ ../configure
$ make -j4 # コア数に応じて変更してください
$ sudo make instal
```
SDL2のソースのコンパイルが成功したら次はGolangのバインディングをインストールします。

```bash
$ go get -v github.com/veandco/go-sdl2/{sdl,mix,img,ttf}
github.com/veandco/go-sdl2 (download)                                      
github.com/veandco/go-sdl2/sdl       
github.com/veandco/go-sdl2/mix       
github.com/veandco/go-sdl2/img       
github.com/veandco/go-sdl2/ttf       
# github.com/veandco/go-sdl2/ttf     
In file included from ../../go/src/github.com/veandco/go-sdl2/ttf/sdl_ttf.go:7:0:
./sdl_ttf_wrapper.h:5:22: fatal error: SDL_ttf.h: No such file or directory
compilation terminated.              
# github.com/veandco/go-sdl2/img     
In file included from ../../go/src/github.com/veandco/go-sdl2/img/sdl_image.go:7:0:
./sdl_image_wrapper.h:5:24: fatal error: SDL_image.h: No such file or directory
compilation terminated.              
# github.com/veandco/go-sdl2/mix     
In file included from ../../go/src/github.com/veandco/go-sdl2/mix/midi.go:9:0:
./sdl_mixer_wrapper.h:4:24: fatal error: SDL_mixer.h: No such file or directory
compilation terminated.              

```
ヘッダファイルが見つからなくて失敗しているようです。ヘッダファイルは `/usr/include/SDL2`にちゃんとあるのですが、例えばgo-sdl2の [`go-sdl2/img/sdl_image_wrapper.h`](https://github.com/veandco/go-sdl2/blob/master/img/sdl_image_wrapper.h)には、

```c
#if defined(__WIN32)
	#include <SDL2/SDL_image.h>
	#include <stdlib.h>
#else
	#include <SDL_image.h>
#endif
```
とあり、どうやらwindows以外のOSではインクルードパス直下に `SDL_image.h`があることを前提としているようです。なので、今回はヘッダーファイルを`/usr/include`にシンボリックリンクを貼ることで対処しました。

```bash
sudo ln -s /usr/include/SDL2/SDL_mixer.h /usr/include
sudo ln -s /usr/include/SDL2/SDL_image.h /usr/include
sudo ln -s /usr/include/SDL2/SDL_ttf.h /usr/include
```
これでもう一度`go get...`を走らせるとうまく行きました！

# 最後に
このエラーはUbuntu16.04でもでないケースがあるようなのですが、理由はよくわかりません。
無事インストールできたので色々試してみようと思います！
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第ニ章 コミニュケーションと言語の使い方10

# 説明のためのモデル

ちょっと内容がわかりづらい箇所。

<DIV>
【2017/09/11 追記】<BR>
<font size="1" color="red">
ご指摘をいただき補足記事を書きました。</font> ⇛
<A HREF="http://qiita.com/YasuhiroKimesawa/items/1648f04f96a14013f4a2">説明のためのモデル補足</A><BR>
【2017/09/11 追記終わり】
</DIV>

モデルをドメインを学ぶ教材として、使用できる。

> この目的のためには、画像や言葉の中で、ソフトウェア設計とは関係しない、別の種類のモデルを伝えるものが使用できる(第一部 第二章より)

日本語がわかりずらいけど、別の種類のモデルというのは、
今まで「モデルは１つだけ」と言ってきたが、説明・教材のためにであれば、画像や言葉などを用いた別のモデルを使用してもよい。。。ということでしょうか。

UML・クラス図でないほうが、通常はよいと言ったり、voyageの例からもわかるとおり、説明のための独自の図を用いるということですね。そして、同時にモデル図を見ることで、より理解しやすくなるということです。

ここは臨機応変に、利用すればいいですかね。
ドキュメントとして、常に最新のバージョンを保つというよりは、紙やホワイトボードに書くような使い捨ての図のほうがいいかもしれないですね。あくまで説明・教材用なので。

説明・教材としてのモデルも臨機応変に利用してドメインを理解する。
【Python@Flask】URLからPython関数へのマーピングについて・その１

Flaskで、URLからPython関数へのマーピングについては次のような書き方があります。

```python:code.py
@app.route('/')
def index():
    return "Hello Python!"
```

尚、複数のURLから特定の関数へマーピングする場合は、次のような書き方となります。

```python:code.py
@app.route('/')
@app.route('/index')
def index():
	return "Hello Python!"
```
はじめてのUE4（エディタでの操作方法のメモ）

# いまさらなメモ
久しぶりにUE4を触ったら、基本操作をすっかり忘れてしまっていたので、メモしておく。

# 主な操作方法
[ALT] + [P] : 実行
[ESC] : 終了（Editorに戻る）

[CTRL] + [Z] : Undo

# オブジェクト（アクタ）の選択
[マウス左クリック] : 選択
[CTRL] + [マウス左クリック] : 複数選択
[CTRL] + [ALT] + [マウス左ボタン] + [上下左右にドラッグ] : 領域選択

[F] : 選択しているアクタにフォーカスする

# カメラの操作
[マウス左ボタン] + [上下にドラッグ] ： カメラを前後に移動する
[マウス左ボタン] + [左右にドラッグ] ： カメラを左右に回転する
[マウス中ボタン]（[マウス左ボタン]+[マウス右ボタン]） + [上下左右にドラッグ] ： カメラを上下左右に移動する
[マウス右ボタン] + [上下にドラッグ] ： カメラを上下に回転する
[マウス右ボタン] + [左右にドラッグ] ： カメラを左右に回転する

[ALT] + [マウス左ボタン] + [左右にドラッグ] : 注視点を中心にカメラを旋回する

# ブループリントでの操作
[マウス右ボタン] + [上下左右にドラッグ] : 可視範囲をスクロールする
[マウス中ボタン]（[マウス左ボタン]+[マウス右ボタン]） + [上下にドラッグ] ： 可視範囲を拡大・縮小する

[マウス左ボタン] : ノードを選択する
[SHIFT] + [マウス左ボタン] : ノードを複数選択する
[マウス左ボタン] + [上下左右にドラッグ] : ノードを領域選択する

[マウス右クリック] : ノードを新規作成する

[C] : コメントボックスを新規作成する

[F9] : ブレークポイントの設定
※実行中にブレークポイントで止まった
[F10] : ステップ実行
pythonをデーモン化するメモ

#pythonで書いたものをデーモンにしたい
さくらのVPSにてpythonで書いたプログラムを常に走らせたかった。
おまけにsystemctlで操作できるので楽ちん。
やり方は以下のパクリ。
[Systemdを使ってさくっと自作コマンドをサービス化してみる](http://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)

#環境
- さくらのVPS
- CentOS 7

#How to
##プログラム

```py:/opt/python_daemon.py
#!/usr/bin/env python
import time
import os
import sys

def main_unit():#10秒おきに時刻を書き込む
	while True:
		filepath = '/opt/pydmon.log'
		log_file = open(filepath,'a')
		try:
			log_file.write(time.ctime()+"\n")
		finally:
			log_file.close()
			time.sleep(10)

def daemonize():
	pid = os.fork()#ここでプロセスをforkする
	if pid > 0:#親プロセスの場合(pidは子プロセスのプロセスID)
		pid_file = open('/var/run/python_daemon.pid','w')
		pid_file.write(str(pid)+"\n")
		pid_file.close()
		sys.exit()
	if pid == 0:#子プロセスの場合
		main_unit()

if __name__ == '__main__':
	while True:
		daemonize()
```

###Shebangを指定しましょう。
先頭に`#!/usr/bin/env python`か`#!/usr/bin/python`を加えます。
`#!/usr/bin/env python`は`$PATH`の先頭にあるpythonを優先して使うそうです。
対して、`#!/usr/bin/python`は直接/usr/bin/配下にあるpythonを指定しているらしい。
バージョンが違うと不都合がおきるかもしれないです。

Stack overflowに詳しいことがありましたので、興味の有る方は参考にしてみてください。
[Why do people write #!/usr/bin/env python on the first line of a Python script?](https://stackoverflow.com/questions/2429511/why-do-people-write-usr-bin-env-python-on-the-first-line-of-a-python-script)

###`daemonize()`について
プロセスをforkして、親プロセスは変数pidに返った子プロセスIDをpidファイルに書き込んで消えます。
一方、子プロセスは`main_unit()`を10秒おきに無限ループで実行します。
###保存したら実行権限を与えましょう。
`sudo chmod 755 /opt/python_daemon.py`
これで実行権限が付与されたはずです。
## ユニット定義ファイルを作る

```:/usr/lib/systemd/system/pythondaemon.service
[Unit]
Description=PythonDaemon

[Service]
ExecStart=/opt/python_daemon.py
Restart=always
Type=forking
PIDFile=/var/run/python_daemon.pid

[Install]
WantedBy=multi-user.target
```

Daemonの定義ファイルです。
ExecStartとPIDFileが帳尻合えばあとはコピペでも大丈夫かと思います。

##デーモンを起動する
`sudo systemctl daemon-reload`
`sudo systemctl start pythondaemon.service`

デーモンをリロードしたら、新しく作った`pythondaemon.service`が認識されます。
そして`start`で起動させます。

##結果
```shell-session
$ sudo systemctl status pythondaemon.service


● pythondaemon.service - PythonDaemon
   Loaded: loaded (/usr/lib/systemd/system/pythondaemon.service; disabled; vendor preset: disabled)
   Active: active (running) since 月 2017-09-11 00:35:12 JST; 10s ago
  Process: 4633 ExecStart=/opt/python_daemon.py (code=exited, status=0/SUCCESS)
 Main PID: 4634 (python)
   CGroup: /system.slice/pythondaemon.service
           └─4634 python /opt/python_daemon.py
```

うごいた！

pydmon.logもこんな感じ

```shell-session
$ cat pydmon.log 
Mon Sep 11 00:35:12 2017
Mon Sep 11 00:35:22 2017
Mon Sep 11 00:35:32 2017
Mon Sep 11 00:35:42 2017
Mon Sep 11 00:35:52 2017
Mon Sep 11 00:36:02 2017
Mon Sep 11 00:36:12 2017
Mon Sep 11 00:36:22 2017
Mon Sep 11 00:36:32 2017
Mon Sep 11 00:36:42 2017
Mon Sep 11 00:36:52 2017
Mon Sep 11 00:37:02 2017
```

#感想
`systemctl`で管理ができるので楽ちんだし、何か感動する
Jekyllでやる夫まとめブログを書くコツ

どうも皆さん。知ってるでしょう？ダクト飯でございます。おい、やる夫路線来ねえか。

さて、昨日普通のやる夫板で、「AAで学ぶネット事件簿」という一種のモキュメンタリーを投下させて頂いたのですが(絶対AIあたりで間違いがあるので見てほしくないし見たなら間違いを指摘してほしい)、過去にやべー奴を投下しようとしていた因果か全くまとめられないので、自分でまとめブログを作ることにしました。この記事のその時に得られたコツをまとめたものです。

[個人的やる夫まとめ](https://duct-and-rice.github.io/yaruo-blog/)

レンタルサーバーなんて借りる暇はないのでGithub Pagesを利用し、JekyllとRubyで「普通のやる夫板から指定DatをDL→解析しJekyllでポストを作成→デプロイ」というサイクルを作りました。自動まとめって奴ですね。のび太みたいにならないように気をつけましょう。

なお、この記事はLinuxを使用していますが、RubyやGitをインストールすればWindowsでも動くはずです。頑張れ。

[WindowsにおけるRubyやRailsの環境構築方法をいろいろ調べてみた（2017年3月版）](http://qiita.com/jnchito/items/9de9e515f82dc1969cc5)
[私家版 Git For Windowsのインストール手順](https://opcdiary.net/?page_id=27065)
[WindowsでJekyllを動かす](http://jekyllrb-ja.github.io/docs/windows/#installation)

## Jekyllのプラグインは、コンバータとして作成すべき
`_plugins`に*.rbファイルを置くとプラグインとして作用する。プラグインには何種類かがあるが、今回はコンバータを採用する。最初はジェネレーターを使おうと思ったのだが、通常の投稿というよりも特別投稿的位置づけの記事ができてしまうので断念した。

コンバータは特別な拡張子がついたファイルを機械的に変換するプラグインの種類で、例えば.textileファイルをTextile言語として解釈してHTMLに変換する`jekyll-textile-converter`が代表例である。

んでもって、今回は*.yaruoファイルを、URLや引用範囲を含んだYAMLとして解釈し、自動DLやエンコーディング変換、整形を済ませたHTMLに変換するコードを書く。

以下がyaruoファイルのサンプル

```yaml:2017-09-02-internet-casefile-2.yaruo
---
layout: post
title:  "AAで学ぶネット事件簿 第2章 Wikipedia Forget-Me-Not Revolution"
date:   2017-09-02 23:51:00 +0900
categories: yaruo-thread internet-casefile
---

url: http://bbs.yaruyomi.com/test/read.cgi/ban/1499589234/
range:
  - 175
  - 332

```


## 2chからDLする部分について
ここに関しては得られた結論がある。2ちゃんねる系のウェブサービスはShift-JISでできていることは皆さんご存知のことであろうと思うが、AAを扱う場合、アレをShift-JISと思ってはいけない。

というのも、RubyでShift-JISとして読み込んでしまうと、デフォルトの文字コード変換であるKconvが「`￣`」という文字を「`¯`」として変換してしまったりするので、割と酷い悲劇が起こる。

そこで、Shift-JISではなくCP932として読み込むと良い。CP932はMicrosoftやらが定めた独自実装Shift-JISであり、これで変換するとなぜか文字崩れしない。

また、既存のRuby用2ちゃんねるライブラリは総じてあまり訳に立たないと思ったほうがいい(少なくともAAブログをやるなら)。どうやら、大抵Shift-JISとして読み込んでいるようである(あまり調べてないけど)。datの仕様は簡単なので、板一覧とかスレ一覧とか見ない限り、簡単に実装できる。

[Monazilla/develop/dat](http://info.2ch.net/index.php/Monazilla/develop/dat)

```
名前<>E-mail<>日付とIDとBE<>本文<>スレッドタイトル
名前<>E-mail<>日付とIDとBE<>本文<>
名 </b>fusianasan.2ch.net<b>前<>E-mail<>日付とIDとBE<>本文<>
名前 </b>◆ozOtJW9BFA <b><>E-mail<>日付とIDとBE<>本文<>
キャップ ★<>E-mail<>日付とIDとBE<>本文<>
名前 </b>◆ozOtJW9BFA <b>＠キャップ ★<>E-mail<>日付とIDとBE<>本文<>
あぼーん<>あぼーん<>あぼーん<>あぼーん<>あぼーん
```

それと、dat落ちに備えてキャッシュ化機能を書いておくべきであると思う。若干不純ではあるものの、一応このキャッシュは.gitignoreから外しておこう。そうじゃないと復旧が厳しくなる。

## CSSについて
とりあえずwhiteglassというテーマを使っているが、スマホ対応のためには、

```
<meta name="viewport" content="target-densitydpi=device-dpi, width=1000">
```

と設定してやる。するとスマホ側が自動でデフォ横幅を1000pxまで縮小してくれる。~~レスポンシブなんて糞食らえ。~~

## フォントについて
フォントはChromeだとAA表示を崩すDirectWrite機能が強制有効なため、専用のフォントをWebフォントとして使う必要がある。それが、Saitamaarである。
[ブックマークレットで iOS，Android 端末でも綺麗なアスキーアート（AA）を表示しよう！
](http://keagelog.blogspot.jp/2012/12/iosandroid-aa.html)

作者の方は、このフォントをWebフォントとして読み込むブックマークレットを公開し、自分のサーバーからリンクで参照できるようになさっている。私も可能であれば、作者のサーバーから取ってくるようにしたかったが、彼のサーバーは残念なことにhttpで、httpsであるGithub Pagesからは参照できないというまさかの問題を抱えている。

仕方がないのでリポジトリに無断転載させて頂いたが、可能であれば転載の許可を出すか[Let's Encrypt](https://letsencrypt.org/)や[CloudFlare](https://www.cloudflare.com/)使ってHTTPS化してほしいと思う。

え？お前がTwitterで要望出しに行けって？ワイは優しい怪物の類やぞ？

追記(2017/11/05). SaitamaarのライセンスはMIT Licenseだそうです。コメント欄で@tar-binさんからご教授頂きました。ありがとうございました。
入力フォームの効果的な改善案

デザイン性や人間工学に基づいたUI設計がWebページでは必要です。
ここでは、特に入力フォームにフォーカスを当てます。
どのようなフォームであれば、ユーザにとってマイナスイメージを持たれないものになるのか、ユーザとしての自分の見方や巷で有名な手法を紹介します。

- 推薦者の声でもうひと押しする
- 入力した情報がなぜ必要なのか、を伝える
- 返金保証などの安心材料は登録ボタンのそばに置く
- 項目は必要最低限にする
- フォームへのリンクは複数設置する
- 404ページにこだわる
- プレースホルダを使用する
- 必須項目に「必須」、任意項目に「任意」と記載する
dockerのコンテナに固定IPを振る

## 概要

Apacheコンテナなどで、Virtualhostで複数のサイトを構築している場合、
各サイトへ指定のドメインにてリクエストする場合に、固定IPにしたくて
調べた結果をメモしておく。

## ネットワークを追加する

compose fie version 2 の場合、ネットワークを追加することで対応できそうです。
また、version 2 の場合、linksの設定はなくても動くようなので削除してみる。

```yaml:docker-compose.yml
version: '2'
services:
 app:
  image: busybox
  container_name: 'app'
  volumes:
   - ../www:/var/www
   - ./logs/httpd:/usr/local/apache2/logs
  networks:
    app_net:
      ipv4_address: 172.16.238.2

 mysql:
  image: reflet/debian8-mysql55:1.0
  container_name: 'mysql'
  env_file: .env.mysql
  ports:
   - '3306:3306'
  volumes:
   - ./initdb.mysql:/docker-entrypoint-initdb.d/
   - mysql-data:/var/lib/mysql
  networks:
    app_net:
      ipv4_address: 172.16.238.3

 postgres:
  image: reflet/debian8-postgres91:1.1
  container_name: 'postgres'
  env_file: .env.postgres
  volumes:
      - ./initdb.postgres:/docker-entrypoint-initdb.d/
      - postgres-data:/var/lib/postgresql/data
  ports:
      - "5432:5432"
  networks:
    app_net:
      ipv4_address: 172.16.238.4

 php:
  image: reflet/debian8-php56:1.5
  container_name: 'php'
  ports:
   - '9000:9000'
  volumes:
   - ./php.ini:/usr/local/etc/php/php.ini
   - ./php-ssmtp.conf:/etc/ssmtp/ssmtp.conf
  volumes_from:
   - app
  extra_hosts:
   - "www.example.com:172.16.238.6"
  networks:
    app_net:
      ipv4_address: 172.16.238.5

 httpd:
  image: reflet/debian8-httpd:1.6
  container_name: 'httpd'
  ports:
   - '80:80'
   - '443:443'
  volumes:
   - ./virtualhost:/usr/local/apache2/conf.d/virtualhost/
  volumes_from:
   - app
  networks:
    app_net:
      ipv4_address: 172.16.238.6

volumes:
  postgres-data:
    driver: local
  mysql-data:
    driver: local

networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.238.0/24
         gateway: 172.16.238.1
```

## 参考サイト
- [Compose ファイル・リファレンス](http://docs.docker.jp/compose/compose-file.html#ipv4-ipv6)
- [Docker ドキュメント - Compose file version 2](https://docs.docker.com/compose/compose-file/compose-file-v2/#group_add)
- [Provide static IP to docker containers via docker-compose](https://stackoverflow.com/questions/39493490/provide-static-ip-to-docker-containers-via-docker-compose)
- [Docker 1.13.RC ドキュメント - 高度なオプションの設定](http://docs.docker.jp/engine/reference/commandline/network_create.html#specifying-advanced-options)
- [Dockerで固定IPアドレスを使う。](https://qiita.com/paihu/items/17aa47906dd2bf935a25)
GitHub pagesで更新内容がサイトに反映されない時の解決方法

# 事の発端
こちら( [福井ハッカソン予選 #MA_2017 求むトガった作品！！](https://mashupawards.connpass.com/event/64322/) )に参加して、こんな作品( [ペッパー坊主](http://hacklog.jp/works/50570) )を作ってた時のお話。
ドメインも持っていなければ、サーバーを立てるのもクラウド触るのもあんまり慣れてなくてめんどくさい、と言う理由から、以前使った事のあるGitHub pagesを使ってみた。

#すると困ったことが
GitHubにpushするだけでサイトの更新ができてしまう、と言う手っ取り早くとりあえず作るにはうってつけなものの、pushしてから更新がサイトに反映されるまでやたら時間がかかる時がある。
ひどいと1時間、2時間かかってしまった。

#そこで解決方法
結論から言うとGitHubのサポートにメッセージを送ることでそんなに待つことなく反映されるようになった。
全部英語だけど、Google翻訳バリバリな英語でも問題なかった。
海外相手だけど勇気を持って「反映されないんだけど、どうなってんの」と聞いてみよう！
手順は以下のとおり。

1. 下の図のHelpを選択
![GitHubSupport_step1.png](https://qiita-image-store.s3.amazonaws.com/0/201583/9cb59255-9483-7363-2503-956b8bce66fe.png)

1. すると、Helpページの右上が下の図のようになっているので、Contact Supportを選択
<img width="327" alt="スクリーンショット 2017-09-10 23.31.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/201583/7fafadd7-1164-3ed2-e798-5046ee18d02f.png">

1. 下の図のようなページに遷移するので、名前と題名、聞きたいことを英語で書いて、Send requestボタンを押す。
<img width="1064" alt="スクリーンショット 2017-09-10 23.32.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/201583/72ba21a3-332a-6a40-ec23-1285a3734870.png">

#その後
夕方に「こっちで手動でリビルドしてみたけどどうよ？マシになったか？」みたいなメールが来た。
確かにマシになったので、「Thank you very match!」と返しておいた。
Pythonのモジュールnum2words　英語とロシア語の挙動の違い

# Pythonのモジュールnum2words　英語とロシア語の挙動の違い
num2words version 0.5.5
Mac OS X 10.12.6

```python
from num2words import num2words
print(num2words(int(10), lang='ru'))  # десять →　10
print(num2words(float(10), lang='ru')) # десять запятая ноль →　10.0

print(num2words(int(10)))  # ten →　10
print(num2words(float(10))) # ten →　10
```

ロシア語では、.0となる場合それを表現してくれるようです。
英語では、.0となる場合は無いものとみなすようです。
PHP curlでCookieを現在の送信する

## 概要

現在、ブラウザで開いているページのクッキーをcurlでリクエストする際に追加したかった。
調べても、curlで連続してページを移動する場合のやり方はよくあるのですが、
現在のクッキーをセットして一度だけリクエストする方法がなかなか見つからなかったので
調べたことをメモしておく。

## $_COOKIEの値を一緒に送る
$_COOKIEの値をヘッダー情報に追加してリクエストする

```php
/**
 * 情報を取得する
 * @return array
 */
function getAuthInfo()
{
    static $auth;

    // 何度もリクエストしない対応
    if ($auth) {
        return $auth;
    }

    // header情報に追加するCookieパラメータ作成
    $cookie = [];
    foreach ($_COOKIE as $key => $val) {
        $cookie[] = $key.'='.$val.';';
    }

    // リクエスト(GET)
    $url    = 'https://' . $_SERVER['HTTP_HOST'] . '/ajax/hoge';
    $cookie = implode(' ', $cookie);
    $option = [
        CURLOPT_CUSTOMREQUEST  => 'GET',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_USERAGENT      => 'hoge',
        CURLOPT_TIMEOUT        => 1,
        CURLOPT_COOKIEFILE     => '',
        CURLOPT_HTTPHEADER     => [
            'Cookie: '.$cookie
        ]
    ];
    $results = httpRequest($url, $option);
    if ($results['option']['status'] === 200) {
        return $auth = json_decode($results['response'], true);
    }
    return [];
}

/**
 * Get Request (cURL)
 * ※ タイムアウトなどに問題がありそうなのでcURL版を新設
 *
 * @param   string  $url
 * @param   array   $option
 * @return  array
 */
function httpRequest($url, $option)
{
    $ch = curl_init($url);
    curl_setopt_array($ch, $option);
    $results   = curl_exec($ch);
    $error_no  = curl_errno($ch);
    $info      = curl_getinfo($ch);
    curl_close($ch);

    $status  = (isset($info['http_code'])) ? $info['http_code'] : null;
    $timeout = false;
    if ($status === 0 && $error_no === CURLE_OPERATION_TIMEDOUT) {
        $timeout = true;
    }

    return [
        'response' => $results,
        'option'   => [
            'status'  => $status,
            'timeout' => $timeout,
            'info'    => $info,
        ]
    ];
}
```

## 参考サイト
- [file_get_contents()関数で器用にGETリクエストを送る](https://www.softel.co.jp/blogs/tech/archives/2129)
- [PHP cURLの色々な使い方](http://qiita.com/wanwanland/items/a5f9574fadd214d7b5c8)
CentOS PHP

javascriptでいろいろ遊んでいたらPHPを使って見たくなったので、
PHPの環境を構築したので、メモ

まず、必要な~~レジストリ~~レポジトリを入れる。(EPELとRemi)

```text:EPEL
yum install epel-release
```

```text:Remi
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

PHP7をインストール

```text:php7
yum --enablerepo=epel,remi,remi-php70 install php70
```
Apacheをインストール

```text:apavhe
yum install httpd
```


これで下準備完了。
次にApacheの設定をする。
初期設定だと、phpはhtmlの拡張子で動かない(認識しない)ので、.htmlでもphpが動くように
Apacheの設定する
/etc/httpd/conf/httpd.conf
をvimでもgeditでもいいので開く
そして以下を追加すると.htmlは.phpと識別する

```text
AddType application/x-httpd-php .html .htm
AddHandler application/x-httpd-php .html .htm
```

これで終了と思いきや

```php:
<?php echo '<p>Hello World</p>'; ?> 
```

表示されない。
なんと、よく見る<? ~ ?>は省略タグで、本来は
<?php ~ ?>
の略らしいので、Apacheの設定を変えて省略タグを使えるようにする（非推奨らしい）

etc/php.iniの

```text:
short_open_tag = Off
```
を

```text:
short_open_tag = On
```
にする

以上で、設定終了
build.gradleでの設定について　備忘


build.gradleの記載内容についてメモ
   
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
 
    implementation 'com.android.support:appcompat-v7:26.0.1'
    implementation 'com.android.support:recyclerview-v7:26.0.1'

implementationに記載してある後半の'26.0.1'の記述は
buildToolsVersionに合わせてあげる必要がある。

以下のように記載をするとエラーでSync fieldになってしまうので注意！！

    implementation 'com.android.support:appcompat-v7:26.0.2'
    implementation 'com.android.support:recyclerview-v7:26.0.1'

動かして確認しただけなので正しい記述内容かは不明なので悪しからず。。
Laravel エラー時のレスポンス形式の変更（JSON）

## 概要
ajax, api のルーティングのグループを作成したが、通常の処理は、JSON形式で返るが、
エラー発生時（400, 404, 500, 503など)の際にHTMLが返ってしまう。

エラーの時にもJSON形式で応答して欲しいので、調べた結果をメモに残す。

## 例外処理のrenderメソッドで対応する
下記のように特定のURL(ajax,api)などへのリクエストに対してまとめて変更する。

```php:app/Exceptions/handler.php
// レスポンスをJSON形式に変更
if ($request->is('ajax/*') || $request->is('api/*') || $request->ajax()) {
    $status = 400;
    if ($this->isHttpException($exception)) {
        $status = $exception->getStatusCode();
    }
    return response()->json([
        'status' => $status,
        'errors' => $this->getMessage($status)
    ], $status);
}
```

以上

## 参考サイト
- [Laravel 5 general error as json](https://stackoverflow.com/questions/28444556/laravel-5-general-error-as-json)
- [Laravelでエラー時に表示するページのカスタマイズ](http://qiita.com/sakuraya/items/af38c4cf84459a8b5967)
- [Laravel5.3でAPIを簡単に作ってみる](https://www.wantedly.com/companies/matchingood/post_articles/38978)
- [LaravelのformバリデートでAjax通信時のエラーを独自のフォーマットに変更する](http://qiita.com/inaka_phper/items/2d7b8aa7ccb23a4c2f2f)
LaravelでSEVERの値をセットしてリクエストのテストを行う

## 概要

外部ライブラリをcomposerなどでインストールして使っていると、
$_SERVERなどの値が必要とのエラーが出たりした。
そういった場合の対応として調べたことをメモしておく。

## $_SERVERの値を追加する
$_SERVERの値をsetUpメソッドで定義する

```php
namespace Tests\Feature;

use Tests\TestCase;

class hogeTest extends TestCase
{
    /**
     * テスト前の準備作業
     *
     * @access  public
     * @return  void
     */
    public function setUp()
    {
        $_SERVER['HTTP_HOST']   = 'www.example.com';
        $_SERVER['REQUEST_URI'] = 'http://www.exsample.com/mypage';
        parent::setUp();
    }

    /**
     * テスト実行
     *
     * @access  public
     * @return  void
     */
    public function testGetRequest()
    {
        $response = $this
            ->withServerVariables([
                'HTTP_HOST'   => 'www.example.com',
                'REQUEST_URI' => 'http://www.exsample.com/mypage'
            ])
            ->get('/hoge');
        $response->assertStatus(200);
    }
}
```

## 参考資料

- [How to mock $_SERVER variables for laravel tests?](https://stackoverflow.com/questions/44641045/how-to-mock-server-variables-for-laravel-tests)
composerでgithubのコードをインストール

## 概要
phpのcomposerを使って、自分のコードをインストールしてみたのでメモを残しておきます。

## 対象のコードを作成する

[配布側のcomposer.json]

```
{
    "name": "{パッケージ名}",
    "description": "{説明文}",
    "keywords": ["authentication","{キーワード...}"],
    "homepage": "https://github.com/{ユーザー名}/{リポジトリ名}",
    "license": "MIT",
    "authors": [
        {
            "name": "{名前}",
            "homepage": "{ホームページのURL}"
        }
    ],
    "require": {
        "php": ">=5.6.0"
    },
    "autoload": {
        "psr-0": {
            "": "."
        }
    }
}
```

[インストール側のcomposer.json]

```json：composer.json
{
    "require": {
        "{パッケージ名}": "{バージョン}"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "git@github.com:{ユーザー名}/{リポジトリ}.git"
        }
    ]
}
```

以上
RxAndroidを利用しているソースでJVMでの単体テストをする方法


# 現象

普通に作っていると ```AndroidSchedulers.mainThread()``` の部分で ```ExceptionInInitializerError```になります。

# 何故エラーになるのか

これは、```AndroidSchedulers.mainThread()``` によって返されるスケジューラが、Androidに依存しているためです。(Androidに依存していると何もしなければ、エミュレーターを使いAndroidTestで実行する必要があります。)
この[リンク先が該当のソース](https://github.com/ReactiveX/RxAndroid/blob/eb27d7505b4776e88ca24d3f6bb0d5db3c16b16c/rxandroid/src/main/java/io/reactivex/android/schedulers/AndroidSchedulers.java#L29)になります。

# 解決方法

単純にテストが実行される前に、RxAndroidPlugins機構により別のSchedulerとして初期化することで、この問題を回避できます。

# 具体的なソース

以下kotlinのソースです。単純にPlugin機構を使って、利用するSchedulerをAndroidに依存しないようにしているだけのTestRuleを定義します。

```RxImmediateSchedulerRule.kt
class RxImmediateSchedulerRule : TestRule {

    private val immediate = object : Scheduler() {
        override fun scheduleDirect(run: Runnable, delay: Long, unit: TimeUnit): Disposable {
            return super.scheduleDirect(run, 0, unit)
        }

        override fun createWorker(): Worker {
            return ExecutorScheduler.ExecutorWorker { it.run() }
        }
    }

    override fun apply(base: Statement, description: Description): Statement {
        return object : Statement() {
            @Throws(Throwable::class)
            override fun evaluate() {
                RxJavaPlugins.setInitIoSchedulerHandler({ _ -> immediate })
                RxJavaPlugins.setInitComputationSchedulerHandler({ _ -> immediate })
                RxJavaPlugins.setInitNewThreadSchedulerHandler({ _ -> immediate })
                RxJavaPlugins.setInitSingleSchedulerHandler({ _ -> immediate })
                RxAndroidPlugins.setInitMainThreadSchedulerHandler({ _ -> immediate })

                try {
                    base.evaluate()
                } finally {
                    RxJavaPlugins.reset()
                    RxAndroidPlugins.reset()
                }
            }
        }
    }
}
```

そして、これをテストの前に実行するだけです。ちなみに```@ClassRule```を使わない理由は、[こちらの記事](http://qiita.com/ko2ic/items/52a7c399d1603fa2adbf)を参照してください。

```
@RunWith(PowerMockRunner::class)
@PrepareForTest(Auth::class)
class LoginViewModelTest {

    @Rule
    val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()

//    companion object {
//        @JvmField
//        @ClassRule
//        val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
//    }
    @Test
    fun onClickLogin() {

        val mockAuth = PowerMockito.mock(Auth::class.java)

        val target = LoginViewModel(mockAuth)

        target.mail.set("email")
        target.password.set("password")

        val result = Single.just(AuthEntity().apply {
            accessToken = "123456"
            userId = 100
        })
        PowerMockito.`when`(mockAuth.login("email", "password")).thenReturn(result)

        target.onClickLogin().run()

        Mockito.verify(mockAuth).login("email", "password")
    }
}
```
EmbulkのDockerコンテナを作ってみる

## 概要

下記の理由から、Embulkのdockerコンテナを作ってみたのでメモする。

- Embulkを使う環境を簡単に用意したい
- 他のメンバーでも設置を簡単にしたい
- ホスト(Mac)は汚したくないので作って要らなくなったら削除できるDockerにしたい

## コンテナを作る

Embulkがjavaのアプリケーションのため、
javaの公式コンテナをベースに構築を行うことにします。

- [docker.com - library/java](https://hub.docker.com/_/java/)

まず、Dockerfileを定義する

```:Dockerfile
FROM java:8

# system update
RUN apt-get -y update && apt-get -y upgrade

# locale
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

# timezone (Asia/Tokyo)
ENV TZ JST-9

# etc
ENV TERM xterm

# tools
RUN apt-get install -y vim git zip unzip less wget

# embulk
RUN curl -o /usr/local/bin/embulk --create-dirs -L "http://dl.embulk.org/embulk-latest.jar" && \
    chmod +x /usr/local/bin/embulk

WORKDIR /root
ENTRYPOINT ["/bin/sh", "-c", "while true; do echo hello world; sleep 1; done"]
```

イメージをビルドしてコンテナを起動してみる

```sh:ターミナル
## イメージ作成
$ docker build -t my/embulk .

## コンテナ起動
$ docker run -d --name java my/embulk

## コンテナへ接続
$ docker exec -it java bash

## javaのバージョン確認
root@0cdf3c285356:~# java -version
openjdk version "1.8.0_111"

## embulkのバージョン確認
root@0cdf3c285356:~# embulk --version
Embulk v0.8.32
```

## docker-hubに登録

DockerHubにAUTOMATED BUILDを使ってDockerfileとコンテナを登録する
https://hub.docker.com/r/reflet/docker-embulk/

## docker-composeで上記コンテナを使ってみる

```yaml:docker-compose.yml
version: '2'
services:
  embulk:
    image: reflet/docker-embulk
    container_name: embulk
```

```sh:ターミナル
$ docker-compose up -d
$ docker-compose ps

```

## 参考サイト
- [docker.com - library/java](https://hub.docker.com/_/java/)
- [yokogawa/embulk](https://hub.docker.com/r/yokogawa/embulk/~/dockerfile/)
- [docker-composeを使ってmysqlからbigqueryにデータを送る](http://cross-black777.hatenablog.com/entry/2017/04/08/203100)
PowerMockRunnerを使うと@ClassRulesが動かない


```@ClassRules``` は、```@BeforeClass```や```@AfterClass```の代替です。
```public static```な```TestRule```クラスにアノテーションをつけることで、テストクラス前に呼び出されます。

しかし、PowerMockRunnerを使うと呼ばれません。
これはバグのようです。[参考](https://github.com/powermock/powermock/issues/687)

以下は、kotlinのソースで、public staticなTestRuleを実装したRxImmediateSchedulerRuleという型のフィールドにClassRuleを宣言していますが、動作しません。


```
@RunWith(PowerMockRunner::class)
@PrepareForTest(Auth::class)
class LoginViewModelTest {

    companion object {
        @JvmField
        @ClassRule
        val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
    }

    @Test
    fun onClickLogin() {

        val mockAuth = PowerMockito.mock(Auth::class.java)

        val target = LoginViewModel(mockAuth)

        target.mail.set("email")
        target.password.set("password")

        val result = Single.just(AuthEntity().apply {
            accessToken = "123456"
            userId = 100
        })
        PowerMockito.`when`(mockAuth.login("email", "password")).thenReturn(result)

        target.onClickLogin().run()

        Mockito.verify(mockAuth).login("email", "password")
    }
}
```

根本的な解決ではないですが、```@ClassRule```をやめて```@Rule```にすると動作します。

```
    @Rule
    val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()

//    companion object {
//        @JvmField
//        @ClassRule
//        val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
//    }
```
frozen_string_literalが入って気づいた、メソッド設計の原則

`frozen_string_literal`が入ったことでプログラムを調整していたら、気づいたことがありました。

# `frozen_string_literal`とは

ことは、Ruby 2.1で`'str'.freeze`とコードに書いたときに、特別な最適化が入るようになったことに遡ります。この最適化を享受しようと、至る所の文字列を`freeze`しだすという混沌に陥ったこともあって、「Ruby 3.0からは、文字列リテラルはデフォルトで`freeze`状態にする」ということになりました。

ただ、いきなり3.0に移行すれば混乱も避けられないので、Ruby 2.3からは冒頭にコメントを書くことで、この「文字列リテラルの`freeze`」の挙動を変えられるようになりました。

* `# frozen_string_literal: true`→文字列リテラルはすべて`freeze`された状態になる
* `# frozen_string_literal: false`→文字列リテラルは`freeze`されない

なお、この指定はファイル単位で有効で、そのファイルに書かれた文字列リテラルだけに有効です。

# あぶり出された、おかしなプログラム

文字列でもなんでも、[非破壊的な操作を繰り返すとコストが嵩む](http://qiita.com/jkr_2255/items/af044a1ae2efca463b48)ことがあって、Javaでは`StringBuilder`という`String`生成用のオブジェクトが用意されていますが、Rubyの場合は`String`自体が可変なので、別途用意はされていません。

そうなれば勢い、`<<`で破壊的に連結、ということがよく行われるのですが、`frozen_string_literal: true`としたところでエラーになったのを確認してみたら、なんと**引数に与えた文字列**に`<<`で破壊的操作を加えていたのでした。

ActiveRecordオブジェクトのように、破壊的操作を行うことが念頭に置かれたオブジェクトもありますが、「文字列引数を渡したら、書き換わって返ってきた」というのは、多くの場合意図するような動作ではないでしょう。引数の文字列に直接`<<`する、なんていう操作は、（うっかりやらかしているかもしれませんが）基本的に、やったらまずい部類です。

# おまけ

Rubyのメソッドでは、最後に`some_method 50, foo: :bar, baz: 1`のような形でハッシュを渡すものが多いのですが、これの中で`.delete`などの破壊的操作を行っていることが時折見受けられます。

上の例のようなbare hashであればその場で生成するので問題ないのですが、ふつうの`Hash`を渡せば引数のパースで変わってしまうし、frozenなのを渡せば破壊的に操作できなくてエラーになってしまいます（複数のメソッドに同じハッシュを渡すので、使いまわそうとして気づきました）。

こちらも、`dup`するなどして対応が必要そうです。
pythonメモ：モジュール化：__name__ == '__main__'の使い方

#動機
pythonのスクリプトでよく見かける、

```pseudo.py
if __name__ == '__main__':
```
がどういうものか分からなかったため。

#モジュール化
こちらを参考にさせていただきました。
http://programming-study.com/technology/python-if-main/

pythonではよく他のスクリプトで定義されたものを引っ張ってきて使うことがありますよね。ライブラリをimportとか。自分で定義した関数を別のスクリプトにしておいて、モジュールとしてインポートするということも(今はできていませんが)ゆくゆくやりたい、そんなときに役立つもののだとか。

上記のif分にある\_\_name\_\_はスクリプト実行時に自動的に作成される変数で、スクリプトを直接実行したときには、\_\_name\_\_には\_\_main\_\_という名前が格納されます。

すなわち上記のif文は、スクリプトがシェルから直接実行されたかどうかで分岐するということですね。

以下のように、if文の内と外にそれぞれ実行文があるスクリプトを書いてみました。

```name_is_main.py
def func(a,b):
  return a + b

print('MY NAME IS ' + __name__)

if __name__ == '__main__':
  print('hello!')
  print(func(3,4))
```

実行結果：
MY NAME IS \_\_main\_\_
hello!
7

```name_is__not_main.py
import name_is_main as nim

print('my name is' + __name__)

if __name__ == '__main__':
  print('world!')
  print(nim.func(7,8))
```
実行結果：
MY NAME IS name_is_main
my name is \_\_main\_\_
world!
15

name\_is\_main.pyでは、そのまま\_\_name\_\_に\_\_main\_\_が入り、if文の中身も実行されました。

name\_is\_not\_main.pyでは、インポートしたname\_is\_main.pyのif文外のprint文も実行されてしまいました。インポートしたname\_is\_main.pyには、スクリプト名であるname\_is\_mainが\_\_name\_\_に格納されています。
一方で、name\_is\_not\_main.py自身の\_\_name\_\_には\_\_main\_\_が格納されました。


上記のように、インポートするスクリプトに余計な記述があると、インポートした側で勝手に実行されてしまうんですね。

#使い道？
参考にさせていただいたサイトでは、if \_\_name\_\_==\_\_main\_\_: の使い道として、モジュールの動作をテストするスクリプトを書いておくことが紹介されていました。
なるほど。

テスト以外では、どのような使い方がされているのでしょうか...。

モジュール化するつもりのないスクリプトを書いている時、「この関数は他のところでも使えそうだからモジュール化を考えるか...」となったら、皆さんどうしているのでしょうか？その時点で、関数は別のスクリプトに移すのか、それとも上記のようなif文を用いることにして、スクリプト内にそのまま残しておくのか。
Dockerのコンテナを起動したままにする

## 概要

dockerをデーモン指定して起動してもすぐに終了してしまうため、
起動したままにできないか調べたメモを残します。

## コマンドを指定する

```sh:ターミナル
$ docker run -d java:8 /bin/sh -c "while :; do sleep 10; done"
```

## docker-composeで試してみる

```yaml:docker-compose.yml
version: '2'
services:
  java:
    image: java:8
    container_name: java
    command: /bin/sh -c "while :; do sleep 10; done"
```

## Dockerfileにしてみた

```:Dockerfile
FROM java:8

WORKDIR /root
ENTRYPOINT ["/bin/sh", "-c", "while :; do sleep 10; done"]
```

```sh:ターミナル
## イメージ作成
$ docker build -t my/java .
$ docker images

## コンテナ起動
$ docker run -d my/java
$ docker ps -a
```

## 追記
docker-composeで「tty:true」とすると起動しっぱなしになるようなので、上記方法は不要となりました。

```yaml:docker-compose.yml
version: '2'
services:
  java:
    image: java:8
    container_name: java
    tty: true
```
※ [docker-compose up したコンテナを起動させ続ける方法](https://qiita.com/sekitaka_1214/items/2af73d5dc56c6af8a167)

## 追記
@dlpyvim さんからのコメントで、下記のやり方でも起動したままにできるようですね。

```bash:ターミナル
$ docker run -itd java:8 /bin/sh
```


## 参考サイト
- [Docker 化した Hello world の起動](http://docs.docker.jp/engine/userguide/containers/dockerizing.html#docker-hello-world)
- [Bash: infinite sleep (infinite blocking)](https://stackoverflow.com/questions/2935183/bash-infinite-sleep-infinite-blocking)
jest-styled-cmponents v4からはtoMatchStyledComponentsSnapshotがtoMatchSnapshotへ変更

styled-componentsを使う際テストでは、jest-styled-componentsは便利です。
styleの変化を検知することができます。

```diff
- Snapshot
+ Received

+.c0 {
+  color: green;
+}
+
 <button
-  className="sc-bdVaJa rOCEJ"
+  className="c0"
 />
```

v3では、このスナップショットを取るために、`toMatchStyledComponentsSnapshot`が必要でしたが、
v4以降は、このAPIが削除され`toMatchSnapshot`でスナップショットするように変更されました。
Java Realmの扱いづらい3点

扱いづらい点を書いてはいますが、概ねRealmは便利です。

前提として、主に単純なDBとしてRealmを使う場合に扱いづらいと感じたことです。
特にSwift版に比べると扱いづらい印象です。

# 単体テストがJVMだけで完結できない

Realmがandroidに依存しているので、AndroidTestで実行しないといけないです。
そういう時はRobolectricを使えばいいのですが、まだRealmには[対応していない](https://github.com/realm/realm-java/issues/904)ようです。

すなわち、実行に時間がかかるので、テストを気楽にできないのです。

もちろん、PowerMockで動作させることはできますが、Daoをターゲットにしたテストでrealmにinsert,update,selectが正しく動作しているかを検証したいのです。
(Dao以外のレイヤーでは、Daoはモック化するので問題ないです。)

[公式のサンプル](https://github.com/realm/realm-java/blob/master/examples/unitTestExample/src/test/java/io/realm/examples/unittesting/ExampleRealmTest.java)では、やはりPowerMockを利用しています。

現状、根本的な解決策はなく、mockで正しくメソッドを呼んでいるかどうかのテストしかできないと思われます。


# close後にアクセスするとクラッシュする

リソースを開いたら閉じるのは当然なのですが、entityに入れたつもりでプロパティにアクセスするとクラッシュ(```This Realm instance has already been closed```)します。
Java Realmはリソースを閉じた後にアクセスできない仕様です。

それを避けるために、トランザクション内で全てを処理する必要がります。 
Daoだけで完結させたい場合は、以下のようにrealm管理外のインスタンスにコピーする必要があります。


```
    fun find(): AuthEntity? {
        var result: AuthEntity? = null
        Realm.getDefaultInstance().use { realm ->
            val entity = realm.where(AuthEntity::class.java).findFirst()
            if (entity != null) {
                result = realm.copyFromRealm(entity)
            }
        }
        return result
    }
```

Realmは```onCreate()```でインスタンスして、```onDestroy()```でcloseする構成にするのが一般的（[公式のドキュメント](https://realm.io/docs/java/latest/)でも、「```onDestory()```でclose」と記載されている）のようです。

しかし、ActivityにDao要素を依存させたくないし、例えば、MVVMでもViewModelをRealmに依存させたくないでしょう。なので、Realmをラップしたクラスを作り依存性を無くす実装をするかと思います。
が、単純な取得処理でもRealmに依存させずにトランザクションを意識するのは大袈裟です。

そこで上記のようなコードを書くという判断/解決策もありかなと思います。ただ、この処理はメモリや処理時間にコストがかかるようです。

# EntityにPublicデフォルトコンストラクタが必要

Kotlinで利用する場合では、この制約のために引数にデフォルト値を入れないといけません。
kotlin-noarg Pluginを利用すれば、デフォルトコンストラクタを自動生成してくれるのですが、Realmの場合は、事前検証で弾いてしまっているためにビルドができませんでした。
該当の[ソース箇所](https://github.com/realm/realm-java/blob/9bef1333d160ac1dbc441a12f6dd2704bbe7a774/realm/realm-annotations-processor/src/main/java/io/realm/processor/Utils.java#L49)です。

なのでデフォルト値が必要なくても、こういったクラスを書くことになります。

```
@RealmClass
data class SampleEntity(
        @PrimaryKey
        @SerializedName("id")
        var id: Int = 0,

        @SerializedName("sample")
        var sample: String = ""
) : RealmModel 
```
不用意にレガシーエンコーディングから Unicode に変換しない


## 一対一の関係だけではない

ウィキペディアや Unicode の解説サイトのおかげで外国語の文字を調べることが容易になりましたが、一方で レガシーエンコーディングのすべての文字が Unicode と一対一で対応していると思い込んでいる人が一定数います。この記事では本当は一対一ではない関係や、一対一であると思い込んだために失敗した事例を取り上げます。

## 肉眼を信じない

文字のプログラミングに取り組むときに心がけることは肉眼を信じないことです。見た目は同じでもまったく異なる文字が存在します。キリル文字のなかにはラテン文字と区別しにくい文字があり、ラテン文字とキリル文字を混在させた国際ドメインを使ったフィッシング詐欺が問題になったことがあります。

さらに OS にフォントがインストールされていないために、豆腐のような四角形として表示されてしまい見わけがつかない文字はたくさんあります。

対策はバイナリデータを確認することです。Unicode エスケープシーケンスも役立ちます。なお、豆腐が表示されないように世界中の文字を表示することを目的にしているのが Noto フォントです。

## 往復変換が保障されない文字
レガシーエンコーディングの文字のなかには Unicode のコードポイントに対応する文字が存在しないことがあります。Unicode のコードポイントから求めることができないレガシーエンコーディングの文字が存在すると言い換えることもできます。

そのため、レガシーエンコーディングと Unicode のあいだで往復変換すると、変換前とは異なる文字に置き換わってしまうことがあります。肉眼では区別がつかない文字であっても、まったく違うデータになっている可能性があります。

マイクロソフトは SHIFT-JIS と Unicode のあいだで往復変換が保障されない文字の[リスト](https://support.microsoft.com/ja-jp/help/170559/prb-conversion-problem-between-shift-jis-and-unicode)を公開し、注意を促しています。

往復変換が保障されないほかの事例は文字が定義されていない範囲です。この場合、ライブラリによって戻り値が異なったり、想定しない戻り値になる可能性があります。

## 想定しない文字の変換

想定しない文字を変換してしまう事例として PHP の `mb_strtoupper`、`mb_strtolower`、`mb_convert_case` を取り上げます。確認したバージョンは PHP 7.1 です。これらの関数は大文字小文字変換をする関数です。問題は内部の処理において文字列を UTF-32 に変換してから大文字小文字を変換し、再び、もとのエンコーディングに戻すことをしています。そのため、大文字小文字以外の往復変換が保障され以内文字も変換してしまう問題を抱えています。具体的な文字は前述のマイクロソフトのサイトで確認できます。

大文字小文字は身近な処理ですが、トルコ語のような言語、ロケールごとの対応、半角だけでなく全角の大文字小文字を変換することなど以外と複雑です。全角半角の変換は ICU の Transliterator を使うことができます。


## 複数の変換候補のある絵文字

絵文字の変換は一対多の事例です。絵文字が Unicode に登録される前、通信キャリアはレガシーエンコーディングのコードポイントに独自の割り当てをしていました。Unicode の絵文字をレガシーエンコーディングに変換する場合、複数の変換候補から1つ選ばなければならないということです。PHP の場合、通信キャリアの名前を冠したエンコーディング (`SJIS-Mobile#DOCOMO`) の名前を登録しています。

変換表が導入されていない場合、想定しない文字に変換されてしまう可能性があります。また、通信キャリアの端末ごとに絵文字の形が大きく変わるので、絵文字に込められた意図が失われてしまう可能性があります。

ミャンマーでも絵文字と似た問題があります。フォント作成者ごとに Unicode のコードポイントに独自の割り当てをしているために、フォントを変更すると、文字を正しく表示できなくなります。正しく文字を表示するには、元のフォントのコードポイントから切替先のフォントのコードポイントへの対応表およびそれを使ったツールが必要になります。
[C#]配列の初期化いろいろ

C#では配列の初期化の方法が（静的型言語としては）簡単にできます。
いわゆる普通の配列、IList型、ISet型、IDectionary型の初期化方法を記述します。

##### 配列
```
  // 普通の配列
  var intArray = new int[2];
  intArray[0] = 5;
  intArray[1] = 49;

  // ブレースで初期値を設定
  var strArr = new string[] {"ゴシックは", "魔法乙女"};

  // 生成側から型省略。その為、宣言側はvar不可。
  string[] otome5 = {"ラナン", "カトレア", "スフレ", "プルメリア", "ロザリー"};

  // ブレ―ス内の値で配列要素の型を推測。
  var akuma5 = new[] {"ジギタリス", "リリー", "ルチカ", "カルミア", "ダチュラ"};
```
##### ジャグ配列、四角配列
殆ど使わないと思いますが、ジャグ配列、四角配列の初期化方法です。

```
  // ジャグ配列
  int[][] jagged = new int[][]
  {
    new[] {1, 2, 3},
    new[] {4, 5, 6, 7}
  };

  // 四角配列
  int[,] grid = new int[,]
  {
    {1, 2, 3},
    {2, 2, 3},
    {3, 2, 3}
  };
```

##### コレクション
IList、ISet、IDictionaryはnewの()の後ろにブレースで初期化できます。
コレクション型であってもQueue、Stack、LinkedListなどは上記3つのインターフェイスのどれも実装していないため、コンパイルエラーになります。

```
  // IList
  var iList = new List<string>()
  {
    "ヴォルクルス", "セイラザード", "ウィンダム"
  };

  // ISet
  var iSet = new HashSet<string>()
  {
    "イシュトバーン", "ヘカトリオン"
  };

  // IDictionary
  var iDic = new Dictionary<int, string>()
  {
    {1, "ポムラ"},
    {2, "いく"},
  };
```
MySQLでデータが増えてきたときのpt-query-digest

Qiitaを含め色々なところで何度も取り上げられている**[Percona Toolkit](https://www.percona.com/software/database-tools/percona-toolkit)**の**[pt-query-digest](https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html)**ですが、久々に引っ張り出してきて解析する機会があったので、忘れないうちにメモしておきます。

# 0. 準備と基本的な使い方

…私が書かなくても、Oracle ACEのyoku0825さんが、Think ITで詳しく解説されています。

* **[スローログの集計に便利な「pt-query-digest」を使ってみよう](https://thinkit.co.jp/article/9617)**

私の場合は、スロークエリログを純粋に「時間がかかるクエリの抽出」に使っているので、普段はtcpdumpでデータを取得してpt-query-digestしています。

```bash:tcpdump
tcpdump -s 65535 -x -nn -q -tttt -i eth0 -c 100000 port 3306 > 【出力ファイル名】
```

※この例では、10万パケット取得しています。

```bash:pt-query-digest
pt-query-digest --type tcpdump --limit 99%:1000 【tcpdump出力ファイル名】
```

※この例では、総実行時間が長い順から99%、または1,000件（どちらか小さい／少ないほう）までを解析しています。

プロダクト環境に影響を与えてはいけないので、pt-query-digestはWebサーバ・DBサーバ以外のところにインストールして実行します。

なお、AWSのようなクラウド環境でDBへの接続が同一ゾーン／別ゾーンで混在しているとき、ゾーンをまたぐクエリの実行時間にはゾーン間を往復する通信時間が上乗せされます（私がAWSで実験したときには、同一ゾーンと別ゾーンで2ms強の差が生じました）。結果を見るときにはその点を考慮に入れてください。

# 1. データが増えてきたときの確認ポイント

基本的なポイントは先の[Think ITの記事](https://thinkit.co.jp/article/9617)に書かれていますが、それだけではこのエントリを書く意味がないので、1つだけ付け加えておきます。

※データ量が増えてきたときだけではなく、バージョンアップやサーバー移行などを行ったときに確認するのも有効です（テーブルの統計情報やオプティマイザの判定内容が変わる可能性があるため）。

ランキングの**R/Call**（クエリ1回あたり実行時間平均値）が他と比較して大きく、**V/M**（標準偏差）の値が**0.00ではない**ものについて、**Query ID**をキーに集計結果詳細を見ます。
そのとき、

* **Query_time sparklineにピーク（^）が2つ以上ある**か、**値の分布に切れ目がある（_ __など）**
* **Query_time distributionにピークが複数ある**、または**分布に切れ目がある**

のであれば、

* 抽出条件によって**INDEXが使われたり使われなかったりしている**（**No index use**の行が表示されます）
* 結合（JOIN）している場合、**クエリ実行時の抽出条件によって駆動表（外部表）と内部表が入れ替わっている**

可能性があります。
とりあえず**「USE INDEX」「FORCE INDEX」などのヒント句を付けて**（使って欲しいINDEXが使われる状態で）クエリを実行してみて状況が改善されるようなら、その可能性が高いです。

対症療法としては、そのままヒント句の付いたクエリに変更するだけでも効果はありますが、あまり良い解決策とは言えないので、

* テーブル構造を変更する
* クエリが複雑な場合はできるだけ単純化する（アプリケーションの処理方法を再検討する）
* クエリを分解し、一部の要素をメモリにキャッシュする
* テーブル／オプティマイザ統計情報の計算に関わる設定を調整する（参考：**[MySQL 5.6 リファレンスマニュアル：14.13.16 オプティマイザ統計](https://dev.mysql.com/doc/refman/5.6/ja/innodb-performance-optimizer-statistics.html)**）

などの方法で改善します。

一方、単純なクエリであり実行時間の分布に切れ目ができる理由がない・ヒント句を付けても変わらない場合は、他のクエリの影響を受けたことによって実行時間が延びている可能性がありますので、その場合は原因となっているクエリを見つけてそちらを先に改善します。

但し、単純なクエリであっても、

* SELECTである
* 実行回数が非常に多い
* SELECT対象レコードの更新頻度が低い

のであれば、メモリにキャッシュするなどしてクエリ実行回数を減らすことも検討します。

# 2. その他

そもそも、Query_time sparklineの「_」の範囲が広い（長い）とか、Query_time distributionの各時間区分にまんべんなく「#」が表示されている場合、データ量の増加に合わせて線形に実行時間が延びており、さらにデータが増えたときにどんどん遅くなっていく恐れがあります。

INDEXが全く効いていないか、効いていても絞り込みが不十分かもしれません。

データ量に対する実行時間が設計時の想定通りであれば良いのですが、想定を超えて延びているのであれば、テーブル構造やアプリケーションの処理方法・アルゴリズムを再検討したほうが良いでしょう。
[Git][Bash][SourceTree] コミット時に自動でコミットメッセージの先頭にブランチ名(≒Issue ID)を挿入する

JIRAとの連携用にブランチ名(≒Issue ID)をコミットメッセージに入れるようにする方法メモ

SourceTreeでも動くように `commit-msg` を使用しています。
実装例はRubyが多かったですが、自分はほぼRubyユーザーではないのでbashスクリプトでの実装になります。

# 実装例
・Git Flow利用時には feature/AAA-123 のようになるので、後半のみ利用
・hotfix, feature のみ対象にする。(release, develop, masterは対象外)
・Amend用にすでにコミットメッセージに含まれているときには追加しない

```bash:.git/hooks/commit-msg
#!/bin/bash -u

current_branch=$(git branch | grep '*' | sed -e 's/\*//')

# feature or hotfix branch only
if [ ! `echo ${current_branch} | grep -E '(feature/|hotfix/)'` ]; then
    exit 0
fi

# e.g. feature/AAA-123 -> AAA-123
issue_id=${current_branch##*/}

# Insert Issue ID at the beginning of the commit message if it doesn't exist
if [ ! `grep "$issue_id" $1` ]; then
    sed -i -e '1 s@\(.*\)@'"${issue_id}"' \1@' $1
fi
```

# 参考
[コミットメッセージにgit issueのIDを入れるgit hookをつくった(Source Tree対応) - IO#blog](http://jit.hatenablog.com/entry/2017/01/31/091700)
tigでstatus-untracked-dirsが出たときの対処

`brew update`したあと、tigコマンドでwarningが出るようになったことへの備忘録です:cry:

tig version

```bash
$ tig -v
tig version 2.2.2
```

warningの内容

```bash
$ tig
tig warning: /usr/local/etc/tigrc:90: status-untracked-dirs has been renamed to status-show-untracked-dirs
tig warning: Errors while loading /usr/local/etc/tigrc.
```

`status-untracked-dirs`は`status-show-untracked-dirs`への置き換わったらしい。
`tigrc`なんて設定ファイルがあったのか。。。

`brew info`で情報ないか見てみる。

```bash
$ brew install tig
==> Downloading https://homebrew.bintray.com/bottles/tig-2.2.2.sierra.bottle.tar.gz
Already downloaded: /Users/jyotti/Library/Caches/Homebrew/tig-2.2.2.sierra.bottle.tar.gz
==> Pouring tig-2.2.2.sierra.bottle.tar.gz
==> Caveats
A sample of the default configuration has been installed to:
  /usr/local/opt/tig/share/tig/examples/tigrc
to override the system-wide default configuration, copy the sample to:
  /usr/local/etc/tigrc

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/tig/2.2.2: 12 files, 457.4KB
```

設定ファイルのサンプルがあるのね。

## 対処方法

tigの設定はデフォルトのままで使っていたため、exampleからtigrcファイルを置き換かえればwarningが出なくなった:smile:

```
cp /usr/local/opt/tig/share/tig/examples/tigrc /usr/local/etc/tigrc
```
CircleCI 2.0でworkflow間のrunコマンドを共通化する


CircleCI 2.0において、複数のworkflow間で処理を共通化したい。
shellで共通化するなども出来るが、`run`で直接記載するのにくらべてかなり遅くなる（理由は不明だが、runの場合は何か裏でキャッシュをしてくれてるように見える）

しかし、workflowで複数のjobの処理を共通するときにどちらにも同じことを書くのはまた面倒になる。

そこでymlのアンカーとエイリアスで共通化することで解決できた

```yml
# アンカーをまとめる場所
references:
  commands:
    setup_php: &setup_php
      name: Setup PHP
      command: |
        sudo docker-php-ext-install mcrypt && sudo docker-php-ext-enable mcrypt
        sudo docker-php-ext-install pdo_mysql && sudo docker-php-ext-enable pdo_mysql
        sudo docker-php-ext-enable xdebug
        composer install -n --prefer-dist

    setup_node: &setup_node
      name: Setup Node
      command: |
        npm install
        npm run gulp

# circle-ciの設定
version: 2
jobs:
  test1:
    steps:
      - checkout
      - run: *setup_php
      - run: *setup_node
      - run: some command

  test2:
    steps:
      - checkout
      - run: *setup_php
      - run: *setup_node
      - run: some command2

workflows:
  version: 2
  test_and_buld:
    tests:
      - test1
      - test2
```

`referecnes`を上の方でまとめる手法はドキュメント化されてないが、「Add Project」時に「Others」を選ぶとアンカーとエイリアスを利用したサンプルが出て来る。
プレゼンを行うときに気をつけることまとめ



プレゼンを行うときに、毎回いろいろとあわてることがあるので、
チェックリストを作成しました。
他に気にすべきこととかおもいついたらコメントいただけるとうれしいです。  
同じ内容をgistにもあげています。
https://gist.github.com/chie8842/24fc256d5c546ad38949c15bd9314313

運営側に事前に確認すること
=========
- [ ] モニタの入力端子の種類（VGA/DVI/HDMI/Display-portなど)
- [ ] PCの設置があるか
- [ ] インターネットの接続環境
- [ ] 音響設備
- [ ] マイク（手持ちか固定かハンズフリーか）

当日の持ち物
===========
- [ ] PC(充電しておく)
- [ ] ディスプレイケーブル、変換ケーブル・アダプタ
- [ ] 電源ケーブル
- [ ] Wifi端末
- [ ] 延長コード
- [ ] 音響設備
- [ ] ポインタ
- [ ] ストップウォッチなど(PCの時計が使えないときのため)

スライド作成の最終チェックで気をつけること
========
- [ ] 機密情報などが入っていないかどうか
- [ ] スライド進行の目安をつけておく  
       (例えば30分の発表だとしたら、15分でどこまで進んでいないといけないか)
- [ ] 書式揺れ(フォントの種類やサイズ、色使いなど)
- [ ] アニメーションがある場合は実際に再生しておく

発表前に確認すること
======
- [ ] 必要ないウインドウは閉じる
- [ ] スライドショーの設定で参加者用のモニターにする画面を設定する  
     (これを設定しておらず、発表者ツールを使ったときに手元のPCとフルスクリーン用のモニタが  
     逆になってしまったことがあった)
- [ ] スライドは事前にネット上にあげておく  
      (PCトラブルが起きたときのバックアップ用。ついでにTwitterなどで拡散しておくと、
      参加者に手元で資料をみてもらえる)
- [ ] PCはできれば2台用意しておく
- [ ] 音量の設定は適切か確認する
- [ ] 発表中に通知機能などがたちあがらないようにOFFにしておく
- [ ] インターネットの接続状況


デモをするときにで気をつけること
====================
- [ ] インターネットがつながるかどうか
- [ ] プロンプト
  - [ ] フォントサイズ 24, 背景 白, 文字の色 黒, フォントは縦長がよいかも（HGゴシックMなど？）
  - [ ] Ctrl + Lで画面をきれいにしておく
  - [ ] 環境を初期化して動作確認しておく
- [ ] デモが動作しなかったときのための準備をしておく
  - [ ] PPTにスクリーンキャプチャを貼っておく
  - [ ] デモの動画をとっておく
- [ ] デモを手伝ってくれる人を準備しておく  
      (デモの種類によっては、コマンドを打つ人と説明する人を分けたほうが良い場合もある)
Homebrewで自動起動の設定で謎にハマった恥さらし

# 一応環境

Mac OS 10.12.6
Homebrew 1.3.2
MongDB 3.4.7

みなさん、たまに`lsof -i`とかで動きっぱなしのプロセスとかないかなーって調べたりしますよね？
そしてなんとなくこれ無駄なんじゃないか？`kill`してダメでも再起動とかでどうにかなんだろとか思ってちょっと`kill`しちゃうことありますよね？（ない人には多分関係のない記事です）

私の場合、mysqlとmongodbがLISTENしてまして、mysqlは昔にちょっとだけ使っただけだったのでとりあえずkillして問題なし。そして、mongodbも今は起動してないのになんでずっとLISTENしてんだろう？別のmongodb動いてるのかな？とかよくわかってないくせに思い込んで`kill`してしまいました。

その結果...

```
ryusaka-MBA:~$ mongo
MongoDB shell version: 3.0.7  
connecting to: test  
2016-02-13T02:10:30.013+0900 W NETWORK  Failed to connect to 127.0.0.1:27017, reason: errno:61 Connection refused  
2016-02-13T02:10:30.015+0900 E QUERY    Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed  
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed  
```

こんなエラーが・・・調べてみると`mongod --repair`をしてみろとか`mongod.lock`を消してみろとか記事が出て来るんですが、どれも解決はせず。どうやら自動で起動できていたものが自分で`sudo mongod --dbpath=/usr/local/var/mongodb`と打たないと起動しなくなっていました。

どうやらHomebrewで自動起動ができる（おそらくmongodbを過去にHomebrewでインストールした時に設定していたと考えられる）とわかりました。

`brew services start mongodb`

これで大丈夫と思い
`ryusaka-MBA:~$ mongo`
......同じエラーが泣

ここから堂々巡りのどハマりをして半日後・・・
`sudo mongod --dbpath=/usr/local/var/mongodb`ってsudoじゃん...
もしかしたら・・・

`sudo brew services start mongodb`

・・・動いた！！
というクソみたいな結末でしたとさ。お恥ずかしい話です。
どうやら`sudo`をつけるかつけないかで追加先が異なるようです。
`sudo`無しでLaunchAgent(ログイン時にユーザー権限で起動)、
`sudo`ありでLaunchDaemon(起動時にlaunchedで起動)に追加されます。
RubyMineのlive templateの使い方。

###live templateとは
よく使うコードを登録しておきそれを貼り付ける機能。
登録された略語をエディタに書いてからtabで展開出来る。
キーマップがdefaultならエディタにカーソルを置いてctrl+jでlive templateのリストが表示される。

###新しいlive templateを作る
左上のFile/Setting/Editer/Code Style/Live templateをクリックする。
次のチェックボックスが出る。
html/xml
JavaScript
Rails
Ruby
Ruby RSpec
SQL
TextMate Cucumber
TextMate Rspec
user
Zen CSS
Zen HTML
Zen XSL
と並んでいるが、user以外のチェックを外してしまおう。
全部チェックを外してもemmetは使えるし他人が作った略語は使いづらい。

そうしたら
１　右上の緑色の＋をクリック
２　live templateを選択
で新しいtemplateを作ることが出来る。

###試しにhelloと入力してtabを押すとhello rubymine!と変換されるlive template
を作ってみる。
右上の緑色の＋をクリックした後、
Abbreviationの欄にhello
Descriptionの欄にlive templateの練習
Template textの欄にhello rubymine!
と入力
最後に赤字でNo application context yet.の横にある青字でDefineがあるのでクリック
今回はhtmlを選択して右下のOKを押す。
完成
これで最低限コーディングが出来る様になる。

ちなみに=を<%= %>に展開したい時は、<%= &END& %>とすると、カーソルが中に入った状態で展開してくれる。
右上にリセットボタンがあるので初期化したかったら押す。