OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase Analyticsのユーザーリスト（カスタムのイベント・パラメータでも作成可能）

# 背景
例えば、Firebaseのイベント計測でフィルタを使用する場合、既に読み込まれたユーザープロパティしか選択できない。
そのため、ユーザーリストを設定しようと思って上記の考えでいると、まだWebコンソール上にパラメータが反映されていない。特にカスタムイベントやパラメータは設定無理なのだろうかと誤解しがちになる。
この記事は、それが誤解であることをシェアするために書いた。

# ユーザーリストの設定
カスタムのイベント・パラメータでも、こんな流れで設定が可能である。
<img width="1027" alt="スクリーンショット 2017-05-06 3.11.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/175433/167db3ce-3131-0b02-d0c7-7e128ef9de33.png">
<img width="1024" alt="スクリーンショット 2017-05-06 3.12.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/175433/86b5ab21-6163-2785-5769-8628f42a4a8d.png">
<img width="1022" alt="スクリーンショット 2017-05-06 3.12.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/175433/e0306ab5-0809-5609-27ab-4a9022bea54a.png">
<img width="1021" alt="スクリーンショット 2017-05-06 3.12.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/175433/bee133c3-e7b7-7b4c-abaa-255bece2989f.png">

# Webコンソールに値が反映されていない？
過去のユーザーリストの値は一切反映されていない。
ユーザーリスト設定以後のユーザー数の値が表示されるため、注意が必要である。
そして、Webコンソール上への反映にも24時間かかるのでそちらも注意。

# 注意点
一度でも、ユーザーリストの対象になったユーザーは永続的にその対象になる。
例えばユーザーリストでのちに指定した条件から外れてしまっても、一度その条件の対象になってしまったユーザーはユーザーリストに含まれているため注意する。

引用：
[ユーザーリスト](https://support.google.com/firebase/answer/6317509?hl=ja)

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
RaspberryPi3 64bitモード ベアメタルでシリアル出力する

ほとんど備忘録として・・・

# 今回目指す環境

[Raspberry Pi 3] ⇔ [USB⇔シリアルケーブル] ⇔ [WindowsPC]

- Raspberry Pi 3は64bitモード
- ベアメタルプログラムを動作させる
- RPi3からPC側へ文字をポーリング出力する

# 必要なもの

- Raspberry Pi 3一式
- USBシリアル変換ケーブル（TTL-232R-3V3を使用した）
- シリアルをたたくベアメタルプログラム
- teraterm等のWindows側でシリアル接続するアプリ

# ハード接続
## Raspberry Piの仕様
Raspberry Piには元々以下2つのUARTが付いている
・ARM Primecell UART（PL011 UART）
・Mini UART

ただし以下文献によると、Raspberry Pi3では、
ARM Primecell UARTはデフォルトでBT Moduleと接続されているらしい。
ここではMini UARTを使用する。
https://www.raspberrypi.org/documentation/configuration/uart.md

GPIOピンにUART機能を割り当ててシリアル通信を行う。
使用するピン、ピン配置は以下のとおり。

RPiのピン | ALT | ファンクション
---|---|---
GPIO14 | ALT5 | TXD1
GPIO15 | ALT5 | RXD1
GND | - | - |

ピン配置↓
https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md

## USBシリアル（TTL-232R-3V3）の仕様
TTL-232R-3V3以外を使用する場合は、そちらの仕様書を確認すること。
TTL-232R-3V3は以下仕様書を参考にする。
http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL-232R_CABLES.pdf

ケーブルの色 | 信号名
--- | ---
BLACK | GND
BROWN | CTS#
RED | VCC
ORANGE | TXD
YELLOW | RXD
GREEN | RTS#

## Raspberry Piとシリアルの接続
TXD、RXD、Groundの3本を間違えないように接続するだけ。

RPiのピン | 結線 | TTL-232R-3V3のピン
---|---|---
GPIO14(TXD1) | ⇔ | YELLOW(RXD)
GPIO15(RXD1) | ⇔ | ORANGE(TXD)
GND | ⇔ | GND |

以下の写真は他にJTAGやGPIO16にLEDが接続されている。
![rpi3_serial.jpg](https://qiita-image-store.s3.amazonaws.com/0/176334/5696c20c-52ff-8ebc-551b-a56fe7dcebe4.jpeg)

# ソフトの用意

Mini UARTを使用するには２通りのやり方がある
- UART初期設定をSoCに任せる
- 自前でUARTの初期設定を行う

UART初期設定をSoCに任せる方法が簡単でお勧めである。

## config.txtの記述
以下のような内容のconfig.txtを用意する。
大事なのは`enable_uart=1`の部分である。
この行を追加するだけでUARTが使える状態でARMプロセッサをブートすることができる。

```text:config.txt
kernel=my_program.bin
arm_control=0x200
kernel_old=1
disable_commandline_tags=1
enable_uart=1
```

## UART出力するプログラム
プログラム側では、Mini UART仕様に従ってレジスタをたたく。
UARTのFIFOに空きがあるかどうか調べて、空きがあったら出力したいデータをレジスタに書き込む。
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf

AUX_MU_LSR_REG Register (0x3f21 5054)のTransmitter empty(5bit)が1であれば、
UART出力するFIFOに空きがある。

AUX_MU_IO_REG Register (0x3f21 5040)のTransmit data write(7:0)に
1バイトデータを書き込めば1バイト出力できる。

Cやアセンブラで書くと以下のような感じ
プログラム一式は公開準備中

```c:C言語
#define MU_IO                   0x3f215040
#define MU_LSR                  0x3f215054
#define MU_LSR_TX_EMPTY_BIT     (0x1 << 5)

uint32_t read_mem(const uint32_t *mem)
{
    uint32_t data;
    data = *((const volatile uint32_t *)mem);
    return(data);
}

void write_mem(uint32_t *mem, uint32_t data)
{
    *((volatile uint32_t *)mem) = data;
}

...

while ((read_mem((uint32_t *)MU_LSR) & MU_LSR_TX_EMPTY_BIT) != MU_LSR_TX_EMPTY_BIT);
write_mem((uint32_t *)MU_IO, 'A');
```

```asm:アセンブラ
uart_output
    ldr   x1, =MU_LSR
    ldr   w0, [x1]
    mov   w2, #MU_LSR_TX_EMPTY_BIT
    and   w0, w0, w2
    cmp   w0, #MU_LSR_TX_EMPTY_BIT
    b.ne  uart_output
    ldr   x1, =MU_IO
    mov   w0, #0x41
    str   w0, [x1]

```
## WindowsとRaspberry Pi3の接続
Widnwos側ではteraterm等を用いてシリアル接続する
ボーレートは115200bps

適切にソフトを記述すれば、UART送信、受信、割込みも動作した。
Firebase Analyticsの目標到達プロセスの誤解

# 背景
目標到達プロセスが、他のアナリティクスツールと感じが異なるので共有したく記事を作成した。
具体的にどういうことかというと、以下に例を書く。

```
「A→B→C」という画面経由のPVを測定したい。
そのため、上記のようにFirebaseの目標到達プロセスを設定する。

PV数を以下のように考える
A: 総計100
B: 総計200(うちAを経由したものは50)
C: 総計300(うちAとBを経由したものは25)

このとき、目標到達プロセスでは、
100 → 50 → 25
となっていることが期待される。

しかし、実際は
100 → 200 → 300
という表示になる。
```

どうやらこちら「オープンな目標到達プロセス（Open Funnel）」という考え方でFirebaseの仕様らしい。
一方で、あるイベントを経由したもののみの場合の目標到達プロセスを「閉じた目標到達プロセス（Closed Funnel）」というらしい。

参考：
[目標到達プロセス](https://support.google.com/firebase/answer/6317523?hl=ja)

# 解決策
以下のページの「Analytics: 閉じた目標到達プロセスの作成方法を教えてください。」に解決策が書いてある。
[よくある質問](https://firebase.google.com/support/faq/?hl=ja)

結局、イベントを複数作って力技で...という感じらしい。。
何故このような仕様にしたのか正直謎である。

このことから、当該部分でGoogle Analyticsを使用し、分析を使い分けているみたいな方もいた。

参考：
[Firebase Analyticsのユーザープロパティとユーザーリスト](http://qiita.com/yamacraft/items/d0e860e1cc13d1c8ce8e)

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
PowerShell で Windows Server backup するときの備忘録

備忘録です。

スクリプトにすると、GUI でカチカチやるより随分簡単に終わるなぁ。

```ps1
# バックアップデータの保存先（ターゲット）を指定する
$Target = "\\hostname\D$\wb"

# 空のバックアップポリシーを作成する
$policy = New-WBPolicy

# ベアメタル回復を使用する指定をポリシーに追加する
Add-WBBareMetalRecovery -Policy $policy

# システム状態をバックアップする指定をポリシーに追加する
Add-WBSystemState -Policy $policy

# バックアップターゲットの指定をポリシーに追加する
New-WBBackupTarget -NetworkPath $Target | % { Add-WBBackupTarget -Target $_ -Policy $policy -Force }

# バックアップ対象とするファイルパス・ドライブの指定をポリシーに追加する
New-WBFileSpec -FileSpec "C:" | Add-WBFileSpec -Policy $policy

# 参考にしたサイトには記載されていたが、New の時点で VssCopyBackup なので指定は不要
# Set-WBVssBackupOptions -Policy $policy -VssCopyBackup

# ポリシーの内容を確認する
$policy

# バックアップを開始する
Start-WBBackup -Policy $policy -Force
```

# 参考

[PowershellスクリプトにてWindowsServerバックアップを行う - とあるエンジニアの技術メモ](http://kan3aa.hatenablog.com/entry/2015/03/22/184312)
Firebase Remote Configのキャッシュにおけるキモ

# キャッシュ
RemoteConfigのfetchは毎回は行われず、基本的に一度fetchしたらキャッシュ時間内では、再度fetchが行われることはない。デフォルトは12時間である。

参考：
[public Task<Void> fetch (long cacheExpirationSeconds)](https://firebase.google.com/docs/reference/android/com/google/firebase/remoteconfig/FirebaseRemoteConfig.html#fetch(long))
[Firebase Remote Config の Android 向けサンプルアプリのチュートリアル](https://firebase.google.com/docs/remote-config/android)

# キャッシュ時間0とした場合の制約
仮にキャッシュ時間を0とした場合でも、1時間以内でfetch回数は5回までと制限されており、それ以上のfetchは自動的に遮断され、キャッシュされた値がそのまま利用される。
DeveloperModeをtrueにすると、最大10人までこの制約は解除される。

参考：
[Github: Firebase RemoteConfigサンプル](https://github.com/firebase/quickstart-android/blob/master/config/app/src/main/java/com/google/samples/quickstart/config/MainActivity.java)
[[Android] Firebase Remote Configを試してみる]
(http://qiita.com/hymmr/items/2fc647db04d3861cd17b)
[Firebase Remote Config の Android 向けサンプルアプリのチュートリアル](https://firebase.google.com/docs/remote-config/android)

# キャッシュの問題点
上記を考える上で、もし仮にキャッシュ時間内に以下の２つの操作が行われた場合、それぞれ以下のような問題が発生する

1. RemoteConfig上の値がWebコンソール上で更新される 
**→ リアルタイムで更新されない**

2. アプリ内部でユーザープロパティの値など条件が変更される
**→ fetchが走らないので、設定した値が不変**

また、RemoteConfig値は、各値ごとfetchではなく一括ですべての値がfetchされるため、それぞれの値でfetchする/しないを決めることが難しい。

# 対策
もし仮に以上のような問題が発生する場合、やはり以下のように現状対策するしかないのかなと考えている。。
① キャッシュ時間をゼロにする
② fetchはスプラッシュ部分など最低限しか実行しない
③ 仮にアプリ内部でユーザープロパティの値など条件が変更され、それについてのfetchを再度行う必要がある場合、その状況が起こりうるのはアプリ内で１回〜２回にとどめる

もっとうまいやり方がないものかとは思う。

# その他考察
## 値不変
RemoteConfigにおいて、fetchされて各端末に設定されるConfig値は一定になる。
検証してみたが、RemoteConfig上での条件が変更されない限り、fetchを何度行ったとしてもアプリ内に保持されている値が変わることは基本的になかった。
つまり、もし仮に上記問題点にあたらない場合は、キャッシュ時間を長めに設定するのも手なのではと思われる。

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
UbuntuとVNCは仲が悪いから、Ubuntu MATEに切り替える

# はじめに

Ubuntu 14.04 LTSのVirtualBox用仮想ハードディスクイメージをUbuntu Japanese Teamのサイトからダウンロードして1年ぐらい使っている。最近、同バージョンのUbuntuをVMware vSphere 5.1の仮想マシンとして構築し、Windows上のVNCクライアントを経由してデスクトップを使用したいと考えたため、先行でVirtualBoxのUbuntuで色々とVNCを試した。その結果、以下のことからUbuntuとVNCは基本的に相性が悪いと結論付けた。

* パッケージ化されているのはvnc4serverとtightvncserverの2つだが、いずれを使ってもUnityデスクトップをVNCでアクセスすることは困難。
* GNOME3デスクトップを使うにはGNOME自体のインストールとGNOMEのパーツを個別に実行する必要があり、多くのディスク消費の割に煩雑な手順で不完全な状態しか構築できなかった。
* GNOME2デスクトップのMATEであれば割りと素直にVNCでアクセス可能だが、PPA（パーソナル パッケージ アーカイブ）を使う必要があり今後に憂いを残す。

参考： http://server-setting.info/ubuntu/vnc-remote-desktop.html

そこで、いっそのこと、1年ほど前にディストリビューションとしてリリースされたUbuntu MATE 16.04 LTSに切り替えてみようと考えた。

Ubuntu MATE公式サイト： https://ubuntu-mate.org/

# Ubuntu MATEインストール＆設定

以下の通りの手順でUbuntu MATE 16.04 LTSのインストールと設定を行った。

* https://ubuntu-mate.org/download/ から64ビット版インストールCDのISOファイルをダウンロード。
* VirtualBox仮想マシンにISOファイルをマウントしてインストール。
* インストール時に作成した管理ユーザーでログインしてMATE端末を開き、SSH接続ができるように「sudo apt-get install ssh」でSSHサーバーをインストール。
* 一旦OSを再起動。  
<font color="#f00">※再起動後はコンソールでログイン禁止！</font>
* PuttyやTera Termなどのターミナルソフト（今回はPutty）でSSH接続。
* 「sudo apt-get install vnc4server」でVNCサーバーをインストール。
* 「sudo apt-get install vim」でVIMテキストエディターをインストール。
* 「vncserver :1」で一旦VNCサーバーを起動し、「vncserver -kill :1」でVNCサーバーを直ぐ停止。
* 「vim ~/.vnc/xstartup」でVNCの初期設定ファイルを開き、以下の内容に変更。

```
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

unset DBUS_SESSION_BUS_ADDRESS
export XMODIFIERS="@im=fcitx"
fcitx

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
#- vncconfig -iconic &
#- x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#- x-window-manager &
mate-session &
```

* 「vncserver :1」でVNCサーバーを起動。  
サイズを指定したい場合は「vncserver :1 -geometry ＜幅＞x＜高さ＞」で起動（デフォルト：1024x768）。
* RealVNCやUltraVNCなどのVNCクライアント（今回はRealVNC）で「＜Ubuntu MATEのIPアドレス＞:5901」にアクセス。
* しばらくすると、Ubuntu MATEのデスクトップが表示されるのを確認。

![UbuntuMateVnc.png](https://qiita-image-store.s3.amazonaws.com/0/167705/d04a01d0-7686-10fc-2f43-54e810293875.png)

右上のトレイアイコンの背景が白色なので違和感が残ったが、日本語もちゃんと入力可能で問題なく使えそうである。
なお、インプットメソッドシステムはOS標準のfcitx（インプットメソッドはmozc）を使用している。

# コンソールログイン禁止について

「再起動後はコンソールでログイン禁止！」と前述したが、VNC接続する前にコンソールからログインすると、その後でログアウトしたとしても、VNC接続で正しくデスクトップが表示されない事象が発生する。
原因は不明確だが、先にコンソールでログインすると、VNC接続時に初期化されなくなる処理が存在するものと想定される。
逆にVNC接続後にコンソールでログインしても、正常にデスクトップが表示される。
メソッドについて(覚書)

#メソッド
メソッドはオブジェクトに定義されているものでそのオブジェクトに関連する「操作」を行うために使われる。
Rubyでは全ての「操作」がメソッドとして実装されている。

##メソッドの呼び出し

###単純なメソッドの呼び出し

メソッドの呼び出し構文は以下の通り

```ruby:ruby
オブジェクト.メソッド名(引数1, 引数2, ..., 引数n)
```


先頭にオブジェクトが一つ置かれ、その後ろにピリオド「.」を挟み、メソッド名が続く。
メソッド名の後ろには「()」で囲まれたメソッドの引数が並ぶ。
引数の数と順番はメソッドごとに決められているので、それに合わせて指定しなければならない。
なお、この「()」は省略できる。
上記構文のオブジェクトは「**レシーバ**」とも呼ばれる。
これはオブジェクト指向の世界ではメソッドを実行することを「オブジェクトにメッセージを送る」、その結果として
「オブジェクトはメッセージを受け取る」と考えるから。

##メソッドの分類

Rubyのメソッドはレシーバにによって3種類に分けることができる

- インスタンスメソッド
- クラスメソッド
- 関数的メソッド

###インスタンスメソッド

あるオブジェクト(インスタンス)があった時、そのオブジェクトをレシーバとするメソッドのことを「インスタンスメソッド」と呼ぶ。インスタンスメソッドには以下のようなものがある。

```ruby:ruby

p  "1,2,3,4,5".split(',')
#=> ["1", "2", "3", "4", "5"]

p [1,2,3,4,5].index(2)
#=> 1

p 1000.to_s
#=> "1000"

```

上から順に文字列、配列、数値の各オブジェクトがレシーバになっている。
オブジェクトに対してどのようなインスタンスメソッドが使えるかは、そのオブジェクトの種類(クラス)によって決められる。オブジェクトに対してインスタンスメソッドを呼び出すと、そのクラスごとに決められた処理が実行される。

###クラスメソッド

レシーバがインスタンスではなくクラスそのものだった場合、そのメソッドは「クラスメソッド」という。
例えば、インスタンスを作るような場合にはクラスメソッドが使われる。

````ruby:ruby

Array.new #新しい配列オブジェクトを作る
File.open("some_file") #与えらしいファイルオブジェクトを作る
Time.now #新しいTimeオブジェクトを作る

```
また、直接インスタンスを操作するわけではないけれども、そのクラスに関連する操作を行いたい場合にもクラスメソッドが使われる。例えば、ファイル名を変更するにはファイルクラスのクラスメソッドを使用する

```ruby:ruby

File.rename(oldname, newname) #ファイル名を変更する

```

補足：クラスメソッドの呼び出しには「.」の代わりに「::」をつけることもできる
どちらもRubyの記法としては同じ意味。


##関数的メソッド

レシーバがないメソッドを関数的メソッドと呼ぶ。
もっとも「レシーバがない」と言ってもレシーバに該当するオブジェクトがないわけではない。
関数的メソッドにはそれが省略されている。


```ruby:ruby

print "test" #コンソールに文字列を出力する
sleep(10) #指定された秒数の間、処理を休止する。


```

関数的メソッドはレシーバの状態によって結果が変わることのないように作られている。
printメソッドやsleepメソッドはレシーバの情報を必要としない。
[Angular2] 開発時のCORS対策

`ng serve`を使用した時にCORSの制約でAPIが叩けないときの対策をメモ。。。

json形式で以下のファイルを作成する。


```proxy-config.json
{
    "/api": {
        "secure": false, 
        "target": "http://localhost:8080"
    }
}
```

で、

```
ng serve --proxy-config proxy.conf.json
```

を実行。

Angular Cli便利やね〜
Numpyで乱数のグラフを作ってみた


#必要なライブラリををインポート
```python
import numpy as np
import matplotlib.pyplot as pp 
```
#x軸、y軸を設定する
```python
x = np.arange(11)
y = np.random.randint(100, size = 11)
```
x軸では０から１０まで数値を配置しています。y軸では０から１００までの乱数からなる配列を10個配置しています。
#グラフを描画する
```python
pp.plot(x, y)
pp.axis([0, 10, 0, 100])
pp.xticks([dg for dg in np.arange(11)])
pp.grid(True)
```
一行目でデータをプロットしてます。二行目ではx軸の表示範囲とy軸の表示範囲を指定しています。三行目ではx軸に一つずつ目盛りをつけています。ちなみにy軸で同様に目盛りを指定したい場合はyticks関数を使います。そして、四行目のTrueを引数にしたgrid関数で目盛りから方眼を作っています。
#グラフを出力する
```python
pp.show()
```
ここまでをまとめると以下のコードになります。

```python:randplot.py
import numpy as np
import matplotlib.pyplot as pp 

x = np.arange(11)
y = np.random.randint(100, size = 11)

pp.plot(x, y)
pp.axis([0, 10, 0, 100])
pp.xticks([dg for dg in np.arange(11)])
pp.grid(True)

pp.show()
```
完成したグラフがこちら
![スクリーンショット 2017-05-06 1.33.59.png](https://qiita-image-store.s3.amazonaws.com/0/170520/56e7512c-df98-2d49-96f2-d95967ae2cb8.png)
angular4とrails5をスッと使ってみる

Rails5で簡単なAPIを作成し、Angular4で表示します。

今はAngularJSでアプリ開発をしていますが、
Angularへの移行を夢見てちょっと試してみた時のメモです。

#Versions

| |バージョン|
|:---:|:---:|
|Angular| 4.1.0|
|ruby| 2.4.0 |
|rails| 5.1.0|

# Angular 4
詳しくはhttps://Angular.io/ を参照。

```AngularCLIインストール. 
npm install -g @Angular/cli
```
```test用ディレクトリ作成.  
mkdir testApp
cd testApp/
```
```angulatアプリ作成. 
ng new test-web
cd test-web
```
```実行. 
ng serve
```
#### http://localhost:4200 を叩く
<img width="310" alt="Screen Shot 2017-05-06 at 0.48.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/62016/60d2757b-584b-5af5-5d43-9ca47dbae86e.png">

**実質コマンド２つでAngularは動く！**


# rails5でAPI作成
rails5.1のwebpackオプションは使いませんm(_ _)m

```railsアプリの作成. 
rails new test_api --api -T -d mysql
cd test_api
rails db:create
```
```comment.rb
rails generate scaffold comment name:string
rails db:migrate
```
```db/seeds.rb
Comment.create!([
  { name: "I'm Kanadai." },
  { name: 'カナダイです' }
])
```
```seed投入. 
rails db:seed
```
```実行. 
rails server
```

#### API完成
http://localhost:3000/comments.json
<img width="857" alt="Screen Shot 2017-05-05 at 23.39.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/62016/f5c172d5-1065-e7b1-79e0-3023829db60e.png">



# AngularからRailsのAPIを叩く
## Angular側
#### component.tsに`// 追加`の箇所を追記

```src/app/app.component.ts
import { Component } from '@Angular/core';
import { Http } from '@Angular/http'; // 追加

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app works!';
  comments; //追加

  // 追加
  constructor(private http: Http) {
    http.get('http://localhost:3000/comments.json')
      .subscribe(res => this.comments = res.json());
  }
}
```
#### component.htmlにも追加

```src/app/app.component.html
<h1>
  {{title}}
</h1>

<!--追加-->
<div *ngFor="let comment of comments">{{ comment.name }}</div>
```

#### http://localhost:4200 を叩いてみる。。
<img width="712" alt="Screen Shot 2017-05-06 at 0.16.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/62016/b899474c-1f26-9934-a75b-14ec1cb11a53.png">
はいダメー。`cors.rb`を追加します。Rails側を参照↓

## Rails側

#### Gemfileの`gem rack-cors`のコメントを外す

```Gemfile. 
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
gem 'rack-cors'
```
`bundle install`

#### cors.rbのコメントを外す。

```config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
```
productionではちゃんと設定しよう。。
https://github.com/cyu/rack-cors

#### Railsサーバーを再起動
もう一度http://localhost:4200 を叩く
<img width="348" alt="Screen Shot 2017-05-06 at 0.40.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/62016/ac714e30-59de-96ab-1ce1-0914d48d3d1b.png">


OK！seedの内容が表示されました！

---
いやーAngularCLI本当に便利ですね。ほとんど何もしなくてもサラッと動く。α版の時はめちゃめんどくさかった気がするんですけど、実質コマンド2発で動いちゃう。
でも中身を全然見てませんね〜笑

次はGoogle認証を試してみます〜
AWS S3互換 minioをCentOS7にインストール

# minioのインストール
```
$ sudo curl https://dl.minio.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio
$ sudo chmod +x /usr/local/bin/minio
```

# minioクライアントのインストール
```
$ sudo curl https://dl.minio.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc
$ sudo chmod +x /usr/local/bin/mc
```

# systemdスクリプトのインストール
```
$ sudo curl https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service -o /etc/systemd/system/minio.service
$ sudo useradd -s /sbin/nologin minio-user
```
```shell-session:/etc/default/minio
# Local export path.
MINIO_VOLUMES="/var/lib/minio/"

# Use if you want to run Minio on a custom port.
MINIO_OPTS="--address :9000"

# Access Key of the server.
MINIO_ACCESS_KEY={Server-Access-Key}

# Secret key of the server.
MINIO_SECRET_KEY={Server-Secret-Key}
```
Server-Access-Key, Server-Secret-Key は自分の設定で上書き可能。

```
$ sudo mkdir /var/lib/minio
$ sudo chown minio-user:minio-user /var/lib/minio
```

# minioの有効化と起動
```
$ sudo systemctl enable minio
$ sudo systemctl start minio
```

# minioクライアントの設定とテスト
```
# 設定
$ mc config host add minio http://127.0.0.1:9000 {Server-Access-Key} {Server-Secret-Key}

# バケットの作成
$ mc mb minio/test

# ファイルのコピー
$ mc cp ~/Downloads/test.png minio/test/

# ファイルのリスト
$ mc ls minio/test

# ファイルの削除
$ mc rm minio/test/test.png
```
Server-Access-Key, Server-Secret-Key は適宜書き換えてください。

HTTPS化などはリバースプロキシにnginxなりを設定してよしなに。
BigQueryからGCSを経由せずにデータをエクスポートする

# 背景
▼BigQueryから大きめのデータを取得するにはGCSを経由して取得するように公式に書いてある
https://cloud.google.com/bigquery/exporting-data-from-bigquery?hl=ja

でもある理由によりあんまりGCSを経由してエクスポートしたくなかったので、色々調べてみた。
以下はpythonとBigQueryクライアントライブラリを利用してデータを取得してくる方法。

# やりかた
以下はGoogleAnalyticsのデータをBigQueryで取り扱うことを想定。
クエリを発行して、結果をpandasのDataFrame型に変換するところまでを例にとってみた。あとは`to_csv()`でCSVファイルにするなりなんなり。

```py3

from google.cloud import bigquery
import numpy as np
import pandas as pd

client = bigquery.Client()

QUERY = (
    'SELECT fullVisitorId FROM [${projectId}:${datasetId}.${tableId}]'
    'WHERE totals.newVisits = 1'
)

query = client.run_sync_query(QUERY)
query.timeout_ms = 100000
query.run()

rows = query.rows
token = query.page_token
df = None

'''
結果が100,000行を超える場合そのまま結果を取得できないので、
page_tokenをつかって次のページを取得
'''
while True:
    if df is None:
        df = pd.DataFrame(rows)
    else:
        df = pd.concat([df, rows], axis=1)
        
    if token is None:
        break
    rows, total_count, token = query.fetch_data(page_token=token)
```

# 参考にしたページたち
https://pypi.python.org/pypi/google-cloud-bigquery
http://gcloud-python.readthedocs.io/en/latest/bigquery-client.html
https://cloud.google.com/bigquery/docs/reference/libraries?hl=ja
https://cloud.google.com/bigquery/exporting-data-from-bigquery?hl=ja
https://cloud.google.com/bigquery/docs/data?hl=ja
[Unity] ハイスコアの実装 & アプリを終了しても記録を残す方法

今回はハイスコアの実装と、アプリを終了しても記録を残す方法を同時進行で記述します。

UnityのPlayerPrefsという機能を使って、プロジェクト内に記録を保存して、アプリを終了しても記録が残るようにします。

#1. ハイスコアのテキストを配置

Unityの　*Hierarchy→Create→UI→Text*　で、Canvas内にハイスコアを表示するテキストを配置します。

<img width="276" alt="スクリーンショット 2017-05-06 0.13.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/178874/89aab509-9b47-2ad7-0ad1-87ab8de98120.png">

位置と大きさは自分の好きな様に設定します。

#2.スクリプトを記述

宣言は以下の様にします。

今回はスコア機能が実装されている上での説明なので、あらかじめ自分で用意されているスコアの部分の記述は割愛します。

```

public Text highScoreText; //ハイスコアを表示するText
private int highScore; //ハイスコア用変数
private string key = "HIGH SCORE"; //ハイスコアの保存先キー

```

次にvoid startの部分に記述する部分です。

```

		highScore = PlayerPrefs.GetInt(key, 0);
//保存しておいたハイスコアをキーで呼び出し取得し保存されていなければ0になる
		highScoreText.text = "HighScore: " + highScore.ToString();
//ハイスコアを表示

```

最後にvoid updateの部分です。

```

//ハイスコアより現在スコアが高い時
if (score > highScore) {

				highScore = score;
//ハイスコア更新

				PlayerPrefs.SetInt(key, highScore);
//ハイスコアを保存

				highScoreText.text = "HighScore: " + highScore.ToString();
//ハイスコアを表示
			}

```

※*この部分でのscoreは、各々で設定している名前によって違ってくるかと思います。*


#3.ScriptにTextを貼り付ける

ScriptをObjectに貼り付け、Textを貼り付けたら完了です！！

<img width="756" alt="スクリーンショット 2017-05-06 0.35.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/178874/559f7b03-17b1-2462-c535-377e94224ed6.png">

ゲームを終了しても、ハイスコアが残ってるかと思われます！！


#4.ハイスコアを削除する方法

このままではハイスコアをリセットすることができないので、PlayerPrefs内に保存されているハイスコアをリセットしたい時に、次のコードを書けばリセットすることができます。

```

PlayerPrefs.DeleteAll();

```

これをvoid startに書いて、一度再生すると、ハイスコアがリセットされます。



以上、unityでハイスコアを実装する方法でした。
rex0220 文字計数プラグイン

文字列の文字数をカウントするプラグインです。

- リアルタイムに文字数をカウントして、ラベル欄に表示
- 編集画面で文字列項目の入力時に、文字数をカウント
- 最小最大文字数を超えた場合は、文字数を赤表示、保存時にエラー表示
- 半角・全角文字、スペースは、１文字としてカウント
- 改行はカウントしません
- ３ヶ国語対応
- PC/スマホ対応

※一覧編集画面は対象外

# 直近の変更点
Ver.3 変更点

・文字数の最小指定を追加
・文字数エラーチェック機能を追加
・対象項目に文字列 (1行)を追加
・プラグイン設定のダウンロード・アップロード機能追加

# 操作例

![2022-05-01_14h53_51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2388e531-8be3-28a8-960a-6f83b9debc8a.gif)


# 編集画面

![2017-05-05_23h56_07.png](https://qiita-image-store.s3.amazonaws.com/0/100572/73a2b1f6-8175-4f6c-0dc0-c31de07066af.png)


# 詳細画面


![2017-05-05_23h58_20.png](https://qiita-image-store.s3.amazonaws.com/0/100572/7b1b1d89-f8df-5e37-a487-22583a927bae.png)


# スマホ画面

編集画面と詳細画面です。

![文字計数プラグインスマホ画面1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/b5945999-003b-ef24-e654-d20a00ce77b4.png)



# プラグインの読み込みとアプリへのプラグイン追加設定

- 「Kintoneシステム管理＞プラグイン」で、プラグインを読み込みます。
- 「アプリの設定＞プラグイン」で、プラグインを追加します。


![文字計数プラグイン設定画面1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/0de092d3-b78a-7ff5-b24b-c62994cb037a.png)


# 文字計数プラグイン設定

- 項目毎に、最小・最大文字数を指定します。
- 項目設定後、「保存」ボタンをクリックします。


![2022-05-01_14h47_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/644a9509-c563-f499-8899-551274d7b485.png)


# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- アプリ設定を変更した場合は、プラグインを再設定してください。
UniOSCでOSCを受信する

#UniOSC
UnityでOSC通信やろうと思ったらとりあえず無料の[UnityOSC](https://github.com/jorgegarcia/UnityOSC)を使いたくなるかもしれない。ただ、うまくいかないこともしばしばあるようである。そこで次に考えたいのが[UniOSC](http://uniosc.monoflow.org/)である。公式サイトの見た目からしてMIDIコントローラーなどとの連携にしか適していないような印象を受けるかもしれない。しかし、そんなことは全然なく普通にOSC通信を柔軟に組み込むことが可能なアセットとなっている。執筆時点で$30。買って損ではないと思われる。

##Implementation
今回は受信のみ簡潔に記載。UniOSCをプロジェクトに取り込んだら`window -> UniOSC -> OSCEditor`、そして`Create OSC Connection`タブをクリックするとシーンに`OSCConnection ...`オブジェクトが追加される。その後はインスペクターを見ると設定に何が必要かほぼ分かるだろう。

あるイベントのトリガーをクリックではなく、OSCメッセージに変更したいということが開発中にあるかと思う。UniOSCを組み込んだスクリプトは非常に作りやすい（汎用的なものであれば）。公式のドキュメンテーションにも記載されているが`OSCEventTargetImplementation`が参考になるだろう。
> 3.6 OSCEventTarget
>> The OSCEventTargetImplementation class is good blueprint for your own implementations.
オープンデータのコンテスト（2017年）まとめ！

ハッカソンのまとめは良いものがあるのに、オープンデータの活用コンテストはまとめがない！
ということで、調べて出てくる範囲で作ってみました。随時追加予定。

追記、修正のリクエストは歓迎です！コメント欄までお願いいたします。


# 4月

### [次世代ロジスティクスオープンデータ活用コンテスト](http://contest.frameworxopendata.jp)
- 4月8日-9月27日（応募期間）


# 5月

### [デジタルアーカイブ オープンデータ画像人気コンテスト](http://www.oml.city.osaka.lg.jp/index.php?key=jo5ke0jtq-510#_510)
- 5月1日-6月14日（応募期間）

### [第6回オープンイノベーションビジネスコンテスト](http://oi.nttdata.com/contest/6th/)
- 5月10日-7月7日（応募期間）

# 7月

### [第7回オープンイノベーションビジネスコンテスト](http://oi.nttdata.com/contest/7th/)
- 7月26日-10月10日（応募期間）

# 9月

### [U-18こどもオープンデータハッカソン](https://www.value-press.com/pressrelease/188729)
- 9月9日（応募期間）

### [チャレンジ！！オープンガバナンス](http://park.itc.u-tokyo.ac.jp/padit/cog2017/)
- 9月中旬～12月20日

### [LODチャレンジ2017](http://peatix.com/event/292321)
- 9月28日（キックオフ）

# 10月
### [実践！共通語彙基盤ワークショップ・ハッカソン](http://peatix.com/event/298493)
- 10月8日,9日
Google Apps Scriptを使ってtrelloのカードリストとメンバ一覧を取得してスプレッドシートに保存する



## はじめに
[Trello](https://trello.com/)というかんばんツールをタスク管理に使っているのですが、タスクを自動で通知したりしたいなと思い、Google Apps Scriptで一覧を取得してみました。

## 事前準備
参考にしたのは以下の記事です。
http://blog.serverworks.co.jp/tech/2016/05/16/trello-api/

こちらの記事を参考に、KEY、TOKEN、BOARD ID、LIST IDを取得します。

## sample
```trello.js
function main() {
   //Trello
   var key   = <your key>;
   var token = <your token>;
   var board = <board id>;
   var list  = <list id>;
   
   var cardsUrl = "https://trello.com/1/lists/" + list + "/cards?key=" + key + "&token=" + token;
   var membersUrl = "https://trello.com/1/boards/" + board + "/members?key=" + key + "&token=" + token;
  
   var cardsJson = fetchTrelloData(cardsUrl);
   var arrCards = parseCardsJson(cardsJson);
   
   var columnsCard = ["name", "due", "idMembers", "dataLastActivity", "shortUrl"];
   var sheetCards = initSheet("cards", columnsCard);
   setDataToSheet(sheetCards, arrCards);
   
   var membersJson = fetchTrelloData(membersUrl);
   var arrMembers = parseMembersJson(membersJson);
   var columnsMembers = ["id", "fullName", "username"];
   var sheetMembers = initSheet("members", columnsMembers);
   setDataToSheet(sheetMembers, arrMembers);
}

function fetchTrelloData(url) {
    var res = UrlFetchApp.fetch(url);
    var json = JSON.parse(res.getContentText());
    return json;
}

function parseCardsJson(json){
  var maxRows = json.length;
  var cards =[];
  for(var i = 0; i < maxRows; i++){
    var name = json[i].name;
    var due = json[i].due;
    var idMembers = json[i].idMembers;
    var dateLastActivity = json[i].dateLastActivity;
    var shortUrl = json[i].shortUrl;
    var card = [name, due, idMembers, dateLastActivity, shortUrl];
    cards.push(card);
    }
    return cards;
}

function parseMembersJson(json){
  var maxRows = json.length;
  var members =[];
  for(var i = 0; i < maxRows; i++){
    var id = json[i].id;
    var fullName = json[i].fullName;
    var username = json[i].username;
    var member = [id, fullName, username];
    members.push(member);
    }
    return members;
}

function initSheet(sheetName,columns){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  try{
     spreadsheet.insertSheet(sheetName);
     var sheet = spreadsheet.getSheetByName(sheetName); 
  }catch(e){
     var sheet = spreadsheet.getSheetByName(sheetName); 
     sheet.clear();
  }
  var column = columns.length;
  var tmp = [];
  tmp.push(columns) //二次元配列にしている
  sheet.getRange(1,1,1,column).setValues(tmp);
  return sheet;
}

function setDataToSheet(sheet,array){
  var lastRow = array.length;
  var column = array[0].length;
  sheet.getRange(2,1,lastRow,column).setValues(array);
}
```
homebrewが嫌いな私のような人向けのMacへのMongoDBの入れ方

以下を参照
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

```
curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.4.4.tgz
```
ダウンロード

```
tar -zxvf mongodb-osx-x86_64-3.4.4.tgz
```
解凍

```
mkdir -p mongodb
cp -R -n mongodb-osx-x86_64-3.4.4/ mongodb
```
フォルダー作って移す

```
export PATH="$PATH:./mongodb-osx-x86_64-3.4.4/bin"
```
でパスを足す

＊注意：この記事はあくまで2017/5/5の最新バージョン（のはず）です

あと
data/dbがないよって言われたら

```
sudo mkdir -p /data/db
```

を入れたらいけました。

ちなみに

```
sudo mongod
```
でmongoDB起動

```
mongo
```
でdbを触るっぽくって

```
use admin
db.shutdownServer()
```
をmongo上で実行したらdbを終了できます。
Travis CI にまつわる Docker 関連のメモ

Travis CI を触っている中で扱うことになる、 Docker に関わる設定についていくつかメモ的に書きます。

# .travis.yml に `sudo : false` と設定すると docker container ベースで起動する
これは 2015 年くらいから各所でよく言われている travis tips だと思います。

以下の公式マニュアルにあるように、2015 年以降から .travis.yml に `sudo : false` と設定すると docker container の上で CI が動作するようになります。これにより、CI が動作するまでのオーバーヘッドが短縮され、かわりに CI 中に sudo コマンドが使用できなくなります。

現在は、`sudo` オプションを明示的に指定しない場合は、デフォルトでは `sudo : false` 扱いになるようです。 

<https://docs.travis-ci.com/user/ci-environment/>

> sudo: false  default for repositories enabled in 2015 or later

結構多くの現場で、過去の設定例などを参考にしてか `sudo : required` と指定しているケースをよく見かけますが、 sudo コマンドを発行する必要がなければ未指定にするか、 `sudo : false` と指定する方が無難です。
個人的なヒューリスティックな感想だと、CI の開始までの時間が、少なく見積もっても数分は短縮されるように思えます。

なお、正直 `sudo : false` 指定で docker container 起動となる、というのはかなり直感的ではないと個人的には感じますが、、 travis の設定にはこういう個所が複数あるように見え、個人的には諦観を以って接しています。


# CI 中に docker サービスを起動する
以下の公式ドキュメント中にある docker についての解説に従い、 `services` で `docker` を指定すると、docker サービスが　CI 上で起動されます。

```
sudo: required
services:
  - docker
```

services で指定すると、travis 内部では `sudo service docker start` が呼び出されるためか、`sudo : false` と指定していても自動的に `sudo : required` 扱いになります。
ですのでこの方法だと CI 開始までのオーバーヘッドが少しかかってしまうことに留意してください。

> Travis CI automatically routes builds to run on Trusty sudo: required when services: docker is configured.

なお、2017年5月5日現在では、 標準の travis 環境 (trusty 14.04) にあらかじめ含まれている docker のバージョンは `1.12.3` のようです。

```
$ docker --version
Docker version 1.12.3, build 6b644ec
```

これを最新のものに更新したい場合は、 `before_install` などで明示的に `apt-get` を呼び出す必要があります。

```
before_install:
  - sudo apt-get update
  - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-engine
```

# local の docker 環境を用いて travis ci の debug を行う
travis は標準で docker image を提供しているので、こちらを用いて travis の local debug を行う事ができます。

<https://docs.travis-ci.com/user/common-build-problems/#Troubleshooting-Locally-in-a-Docker-Image>

ただし、 `.travis.yml` をそのまま実行する、というようなオプションは提供されていないので、出来ることとしては docker image 上で .travis.yml に書いたようなコマンドが正しく動作するか、の確認までになります。(工夫次第でやりようはあるかもしれませんが)

```
$ docker run --name travis-debug -dit quay.io/travisci/travis-ruby /sbin/init
$ docker exec -it travis-debug bash -l
# su - travis
```
といったような形で local 環境の docker で travis のイメージを起動し、ログインすることが出来るようになります。

あとは、.travis.yml に記述した内容を、コマンドとして実行して正しく動くか試す、という感じです。
Swift3でTwitterのタイムラインを取得EP5(Twitterにログイン編)

#前回のおさらい
[EP4(Xcode編-2)](http://qiita.com/thimi0412/items/7bf6c99ed6ffcd78c88b)

#Log In With Twitterの導入
1.Log In With Twitterの「Get Code」をクリックしましょう。
<img width="326" alt="スクリーンショット 2017-05-05 21.28.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/3e42fe37-46d3-1b68-4d25-ec2996c32f2f.png">

2.初期画面はObjective-Cになっているので右上のSwiftをクリックしましょう。
挿入コードをViewController.swiftに挿入しましょう。
<img width="757" alt="スクリーンショット 2017-05-05 21.43.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/dd99cf2a-6f9a-5a34-5485-8f8802eee1a4.png">

3.しかしこのまま挿入すると以下の画像の通りエラーが出てしまします。
<img width="759" alt="スクリーンショット 2017-05-05 21.47.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/0b140a15-86c4-1ae9-7b4f-94b4c37e6862.png">

エラーの部分を以下のコードに変更しましょう。


```swift
if let button: UIButton = logInButton as TWTRLogInButton! {
            button.center = self.view.center
            self.view.addSubview(button)
        }
}
```

4.以下の画面が出ればOK!　ボタンを押してログインしましょう。
<img width="381" alt="スクリーンショット 2017-05-05 22.07.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/d9560ea4-ebd7-d74f-5935-cf16c1c2b2d9.png">

5.ログイン成功！　アラートでユーザ名が表示されます
<img width="379" alt="スクリーンショット 2017-05-05 22.08.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/42da5a7b-1ffa-0cf5-2b49-c666675359e4.png">

次回はついにタイムラインの取得です。

#参考
[参考コードgithub](https://github.com/thimi0412/Swift/blob/master/Twitter/ViewController.swift)
electromagnetic clock

電磁石のテスト. 

high/lowで磁石化/非磁石化が可能
pwmで強度を変えられるかな?と思ったけど, 異音がするだけで実現できているか不明
モノによるのかも. 

今回テストしたのはこれ:
http://amzn.asia/hWVdTOP
Chinese製で, 12Vで2.5kgまで支えられるとのこと. 

# code
コードはarduinoです. 
かなり適当ですが

```electromagnetic_clock
void setup(){
  pinMode(9, OUTPUT);
}

void loop(){
  digitalWrite(9, HIGH)
  delay(980);
  digitalWrite(9, LOW);
  delay(20);
}
```

という感じ. Relayとかと同じです. 

# 配線
コレも単純. 
arduinoからのhigh/lowを12Vでswtchingできるように
ダーリントン トランジスタ
http://akizukidenshi.com/catalog/g/gI-01877/
をかませただけ. 

今回は遊びとして, 水を少し入れたペットボトルを付けた. 
これはlowの間に少し下がるようにするため. 
これで1秒ごとに電磁石が下がる時計ができる. 

![IMG_3948.jpg](https://qiita-image-store.s3.amazonaws.com/0/102253/a4dd01a1-7e20-4450-92a5-ee3ba938ebbd.jpeg)


# result
動画:
https://youtu.be/B6QCUDnZkJY
https://youtu.be/NNhkXLMJxkg

移動量が思った以上に一定じゃないらしく, 調整が難しい. 
まぁ動いてるのでよい. 
電磁石は色々遊べそうでよいです.
Swift3でTwitterのタイムラインを取得EP4(Xcode編-2)

#前回のおさらい
[EP3(Xcode編-1)](http://qiita.com/thimi0412/items/4ade1dd913f69ef60d54)

#コードを挿入する
前回でプロジェクトのビルドが成功したのでFabricのアプリ側では以下のこのような画面が表示されています。

1.プロジェクト内の「AppDelegate.swift」にアプリ側に表示されている導入コードを挿入しましょう。コードを挿入したらアプリ側で右下の「Next」をクリックしましょう。
<img width="321" alt="スクリーンショット 2017-05-05 20.43.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/9fb86963-5319-edd3-768d-812237e9f3fb.png">

2.その後「command + R」(ビルドと実行)を行います。
![17.png](https://qiita-image-store.s3.amazonaws.com/0/166626/9d6908b7-0ec3-795f-295e-1b615e8b64d2.png)

3.ビルドと実行ができれば以下の画面が出ればOK!そしたら「Done」をクリックしましょう。
![18.png](https://qiita-image-store.s3.amazonaws.com/0/166626/1b72b4c8-5672-04cd-9baf-447daa833086.png)

次回は以下の画面からテストとしてTwitterにログインしてみましょう！
<img width="326" alt="スクリーンショット 2017-05-05 21.28.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/5cc33cdb-febc-6fdf-41d0-006bb9b756a5.png">

#参考コード
[参考コードgithub](https://github.com/thimi0412/Swift/blob/master/Twitter/AppDelegate.swift)
Spring Boot + ThymeleafでWEBアプリを動かす

Spring MVCを修正する機会が多かったのですがBootをあまり利用して来なかったので復習も兼ねて動かします。

## 構成
Mac OS X 10.12
Java 1.8.0_92
Spring Tool Suite 3.8.4
Spring Boot 1.5.3
thymeleaf 2.1.5

## 導入
1.Javaを[Oracleの公式](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)からDLしてインストールします。

2.Spring Tool Suite（以降「STS」）を[公式](https://spring.io/tools/sts/all)からDLしてインストールします。

3.プロジェクト作成
STSで以下のように作成
![1.png](https://qiita-image-store.s3.amazonaws.com/0/110457/cd7e288d-9a0b-ad18-3dbc-aa7cd8e0453d.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/110457/011e98e9-4a05-90b7-2879-9b0d925206e7.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/110457/138292ce-5797-d8a9-de4b-7908fbcf8292.png)


4.コントローラとテンプレートの作成
以下、2つのファイルを作成します
![4.png](https://qiita-image-store.s3.amazonaws.com/0/110457/36ed422e-e1b2-ee4b-7dd9-04219b51e9a5.png)

**Java**

```java:SampleController.java
package com.example;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/sample")
public class SampleController {

	@RequestMapping(method = RequestMethod.GET)
	public String test(Model model) {
		model.addAttribute("name", "草苅API");
		model.addAttribute("get", "GET /sample");
		model.addAttribute("post", "POST /sample");
		return "sample/index";
	}

}
```

**HTML**


```html:index.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h2 th:text="${name}"></h2>
  <p th:text="${get}" /> 
  <p th:text="${post}" /> 
</body>
</html>
```

5.WEBアプリを動かす
![5.png](https://qiita-image-store.s3.amazonaws.com/0/110457/1d626c97-8a0d-12a0-80a2-4c4151fc13e6.png)

想定通りに動きました
![6.png](https://qiita-image-store.s3.amazonaws.com/0/110457/c7aba302-9ab6-b3d2-ab77-ad457d105141.png)
LaTeX において大きさを数値で調整できる括弧

数式はやはり括弧の大きさを調整することで圧倒的に見やすくなりますが、`\bigl` / `\Bigl` / `\biggl` / `\Biggl` のような呪文は覚えにくいしわかりにくいです。`\left` / `\right` による自動調整もありますが、案外上手く機能しなかったりするので、数値で調整することにしました。

![Screenshot 2017-05-05 20.42.44.png](https://qiita-image-store.s3.amazonaws.com/0/31593/0c25e941-a219-8fdb-19d9-dc78bb3ce3b6.png)

```latex:brackets.tex
\documentclass{article}

\usepackage{expl3}
\usepackage{amsmath}
\usepackage{newtxtext}
\usepackage{newtxmath}

\ExplSyntaxOn
\cs_new_eq:NN \If \bool_if:nTF
\cs_new_eq:NN \Compare \int_compare_p:nNn
\ExplSyntaxOff

\newcommand{\leftright}[4][0]{%
	\If{\Compare{#1}={0}}{%
		#2#4#3%
	}{\If{\Compare{#1}={1}}{%
		\bigl#2#4\bigr#3%
	}{\If{\Compare{#1}={2}}{%
		\Bigl#2#4\Bigr#3%
	}{\If{\Compare{#1}={3}}{%
		\biggl#2#4\biggr#3%
	}{\If{\Compare{#1}={4}}{%
		\Biggl#2#4\Biggr#3%
	}{%
		\errmessage{leftright: illegal optional argument}%
	}}}}}%
}

\newcommand{\p}[2][0]{\leftright[#1](){#2}}
\renewcommand{\b}[2][0]{\leftright[#1][]{#2}} % \b used to be a diacritic
\newcommand{\pb}[2][0]{\leftright[#1](]{#2}}
\newcommand{\bp}[2][0]{\leftright[#1][){#2}}
\renewcommand{\c}[2][0]{\leftright[#1]\{\}{#2}} % \c used to be a diacritic
\newcommand{\g}[2][0]{\leftright[#1]\langle\rangle{#2}}
\renewcommand{\t}[2][0]{\leftright[#1]||{#2}} % \t used to be a diacritic
\newcommand{\n}[2][0]{\leftright[#1]\lVert\rVert{#2}}
\newcommand{\f}[2][0]{\leftright[#1]\lfloor\rfloor{#2}}
\renewcommand{\l}[2][0]{\leftright[#1]\lceil\rceil{#2}} % \l used to be a special character

\begin{document}

\[\p[4]{1 + \p[3]{2 + \p[2]{3 + \p[1]{4 + \p{5 + 6} + 7} + 8} + 9} + 10} \times 2 = 10 \times \p{10 + 1} \]
\[\p[4]{\p[3]{\p[2]{\p[1]{\p{}}}}}
\ \b[4]{\b[3]{\b[2]{\b[1]{\b{}}}}}
\ \c[4]{\c[3]{\c[2]{\c[1]{\c{}}}}}
\ \g[4]{\g[3]{\g[2]{\g[1]{\g{}}}}}
\ \t[4]{\t[3]{\t[2]{\t[1]{\t{}}}}}
\ \n[4]{\n[3]{\n[2]{\n[1]{\n{}}}}}
\ \f[4]{\f[3]{\f[2]{\f[1]{\f{}}}}}
\ \l[4]{\l[3]{\l[2]{\l[1]{\l{}}}}}\]

\end{document}
```

ちょっとした工夫ではありますが、このように括弧をマクロ化しておくと、大きさの調整が圧倒的に楽になるだけでなく、開き括弧と閉じ括弧の対応も自動的に取れるので、非常に便利です。
zipがUTF8ファイル名のフラグがついているかどうかを確認したい

MacでZIP圧縮すると、Windowsで化けるという話はよく聞きます。

直接の原因は、MacではUTF8でファイル名を保存するけど、WindowsはデフォルトのSJISとして解釈しちゃうから。

ただ、Gmailで添付ファイルを一括ダウンロードするときにはzipアーカイブしているんだけどこれはMacもWindowsも両方カバーできている。不思議。

どうもファイル名はUTF8ですよって示すフラグがあるらしい。
http://tmtms.hatenablog.com/entry/2017/04/05/zip

ファイル名がUTF8ですよって主張しているzipをみたことがない。手元にあったとしても確認の方法が分からない。じゃぁgmailが作るzipファイルをよくみれば分かるかも知れない。

ということで、gmailから複数の添付ファイルを一括ダウンロードしてみる。
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/53489/c5c18aa6-62d3-4800-3a61-0c8316ffa149.png)

すると、zipがダウンロードできる。そのzipをzipinfoで内部をみてみる。一番たくさん情報がでるであろう -v オプションで実行。

```bash
$ zipinfo -v attachments.zip
```
すると、最後の方には、ちゃんと、UTF8ファイル名がどうのこうのって出てくる。Mac標準のZIPアーカイブだとこのメッセージはなかった。

```
 The central-directory extra field contains:
  - A subfield with ID 0x7075 (UTF8 path name) and 31 data bytes. The first
    24 UTF8 bytes in the extra field (V1, ASCII name CRC `7d095e15') are:
    e4 bd 9c e6 a5 ad e8 a8 98 e9 8c b2 32 30 31 37 2d 30 35 2d 30 36 2e 74.
```

ということで、Gmailの添付ファイルの一括ダウンロードは、MacでもWindowsでも大丈夫なように、UTF8 path nameってやつに対応していましたってことが分かる。
npm、Bowerでパッケージを公開するときにつまづいたこと

# JSONを事前にバリデートしたほうがいい
bower.json内の余計なカンマに気づかず公開してしまい、試しにダウンロードしようとしてエラーに気づきました。
結局、パッチのバージョンを上げて公開し直しました。
package.jsonもbower.jsonも事前に検査しておいたほうがいいです。

#### Webで検査
- package.json: http://package-json-validator.com/
- bower.json: 適当なサービスが見当たりませんでした。[ここ](http://www.jsonschemavalidator.net/)でいろいろなJSONの検査ができるようですが、余計なカンマをエラーと認識しませんでした。

#### コマンドラインで検査
それぞれのnpmパッケージが提供されています。

- package.json: [package-json-validator](https://www.npmjs.com/package/package-json-validator)
- bower.json: [bower-json](https://www.npmjs.com/package/bower-json)

devDependenciesに追加して、一括して検査できるようにします。
なお、bower-jsonは実行用のJSファイルを別途用意しなければなりません。
今回は`bower-json.validate.js`に記述しています。

```js:package.json
{
  "devDependencies": {
    "bower-json": "^0.8.1",
    "package-json-validator": "^0.6.1"
  },
  "scripts": {
    "validate-json": "pjv && node bower-json.validate.js"
  }
```

```js:bower-json.validate.js
var bowerJson = require('bower-json');
bowerJson.read('bower.json', function (err, json) {
  if (err) {
    console.error('There was an error reading the file');
    console.error(err.message);
    return;
  }
  console.log('bower.json is valid');
});
```

これで、下記のコマンドで一括して検査できます。

```
$ npm run validate-json
```


# descriptionは必須
`description`がないとパッケージの紹介ページがかっこ悪くなります。
たとえば[npmのユーザーのページ](https://www.npmjs.com/~sutara79)で。
現在は`description`を書いているので下記のように表示されています。

```
jquery.add-input-area - v4.9.1 - jQuery plugin to add or delete form fields.
```

以前は横着して`description`を書いていなかったので、[README.md](https://raw.githubusercontent.com/sutara79/jquery.simple-scroll-follow/master/README.md)のh1見出し直後の1行、TravisCIのバッジのコードが表示されていました。

```
jquery.add-input-area - v4.9.0 - 
[![Build Status](https://travis-ci.org/sutara79/jquery.simple-scroll-follow.svg?branch=master)](https://travis-ci.org/sutara79/jquery.simple-scroll-follow)
```

これでは意味不明です。
というわけでpackage.jsonでもbower.jsonでも`description`は必須です。

```js
{
  "description": "jQuery plugin to add or delete form fields."
```
npm run (npm run-script) コマンドで実行するスクリプトに引数を渡す。2017

# `--`記号を使う
 
`npm run`コマンドの末尾に`--`記号を書き、空白に続けて文字列を書くと、その文字列がスクリプトにそのまま渡されるようです。

`package.json`に下記のようなスクリプトが用意されている場合に`package.json`ファイルを書き換えることなく、`--host 0.0.0.0`という引数を追加する方法を探していました。

```json:package.json
{
  "scripts": {
    "start": "yarn check-env && ng serve"
  }
}
```

以下のようなコマンドを実行すると

```
npm run start -- --host 0.0.0.0
```

下記のように処理されるようです。

```
yarn check-env && ng serve --host 0.0.0.0
```

## 拝見した情報源
* http://qiita.com/monpy/items/be5fa8a900728aaab5ba
* https://docs.npmjs.com/cli/run-script


### メモ書き

サイトには下記のような説明がされていました。

> As of npm@2.0.0, you can use custom arguments when executing scripts. The special option -- is used by getopt to delimit the end of the options. npm will pass all the arguments after the -- directly to your script:

> npm@2.0.0からは、スクリプトの実行時にカスタム引数を使用できます。特別なオプション `--` は、オプションの終わりを区切るために`getopt`によって使用されます。 npmはすべての引数をスクリプトの後に渡します：

どうやら、

1. `npm`は`getopt`という仕組みを使って、コマンドラインに渡される文字列を解析している
2. `getopt`は`--`記号より後ろの部分は、1つの文字列として解釈する
3. `npm`はこの仕組みを利用して`--`記号の後の文字列を取り出し、`npm script`の後ろに渡している

ということっぽいです。

下記のコマンドを
```
npm run start -- --host 0.0.0.0
```

下記の2つの部分に分けたのは`getopt`の仕業で、

* `run start`
* `--host 0.0.0.0`

手に入れた文字列`--host 0.0.0.0`を

```
yarn check-env && ng serve
```

の後ろに付け足して

```
yarn check-env && ng serve --host 0.0.0.0
```

にしたのは`npm`の仕業ということのようですね。
move_baseでMap上に立ち入り禁止区域を設定する

#目的
ROSのmove_base(Navigation Stock)で、Map上にロボットの立ち入り禁止区域を設定する方法について説明する。

#map_serverを2個立ち上げる。
map_serverを2個立ち上げ、move_baseのMapにはロボットの立ち入り禁止区域を黒く塗りつぶしたMapを指定し、amclのMapには、通常のMap(gmapping,cartgrapherなどで作成したMap)を指定する。

move_baseでは、map_serverで読み込んだMap上の黒い箇所は障害物として認識されており、この場所は立ち入り禁止区域となる。move_baseのゴールとして指定することはできず、経路探索の領域からも除外される。立ち入り禁止区域を画像編集ソフト(Gimp・Pintaなど)で立ち入り禁止区域を黒く塗る。

ただし、障害物が本来ないところに障害物を設置すると、amclなどの自己位置推定モジュールが誤検出を起こしてしまう可能性がある。

そこで、map_serverを2個に立ち上げ、move_baseとamclで別ファイルを指定する。自己位置推定の誤検出を防ぎつつも、立ち入り禁止区域を設定することができる。

![map.png](https://qiita-image-store.s3.amazonaws.com/0/73020/6a2531aa-3ba6-fd9d-889b-1cef6254c3a6.png)

#launchファイル例

```

<launch>
  <arg name="map_amcl_file" default="$(find test_maps)/maps/map_amcl.yaml" />
  <arg name="map_movebase_file" default="$(find test_maps)/maps/map_movebase.yaml" />

  <arg name="move_base_include" default="$(find test_navigation)/launch/include/move_base.launch.xml" />
  <arg name="amcl_include" default="$(find test_navigation)/launch/include/amcl.launch.xml" />

  <node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />

  <node name="map_movebase_server" pkg="map_server" type="map_server" args="$(arg map_movebase_file)" >
    <remap from="map" to="map_movebase" />
    <remap from="static_map" to="static_map_movebase" />
  </node>

  <include file="$(arg amcl_include)" />

  <include file="$(arg move_base_include)" >
　   <remap from="map_topic" value="map_movebase" />
  </include>

</launch>
```


なお、fetch roboticsのmove_baseのlaunchファイルには、この機能が実装されています。
https://github.com/fetchrobotics/fetch_ros/blob/indigo-devel/fetch_navigation/
PHPからMastodon APIを使って投稿する

PHPでMastodonのAPI Client(あるいはSDK)を書いてみたので、紹介をします ヾ(〃＞＜)ﾉﾞ

この記事を書いたのは高橋会長(@takahashim)の[Mastodon API gemを使って投稿する](http://qiita.com/takahashim/items/a8c0eb3a75d366cfe87b)にインスパイヤされて。

## インストール

[BaguettePHP/mastodon-api: Mastodon API Client for PHP](https://github.com/BaguettePHP/mastodon-api)は開発中で全部のAPIが網羅されてるわけじゃないけど、投稿APIはあるので投稿はできます。

対応してるPHPのバージョンは5.5以上です。残念ながら5.4系では動きません。

[最近のモダンなPHPを意識](http://qiita.com/tadsan/items/a0a14e58aa4d88f19624#composer)して書いてるので、インストールにはComposerが必要です。Composerがなければ、[Download Composer](https://getcomposer.org/download/)の通りに手元に持ってきてくださいね。

ここではサンプルコードなので、特定のPHPプロジェクトではなくグローバルインストールしてみることにします。

<details><summary><code>php composer.phar global require</code></summary>
<pre><code>Changed current directory to /Users/megurine/.composer
Using version ^0.0.1 for zonuexe/mastodon-api
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing respect/validation (1.1.12): Loading from cache
  - Installing zonuexe/objectsystem (0.6.0): Loading from cache
  - Installing zonuexe/mastodon-api (0.0.1): Loading from cache
respect/validation suggests installing egulias/email-validator (Strict (RFC compliant) email validation)
respect/validation suggests installing malkusch/bav (German bank account validation)
respect/validation suggests installing symfony/validator (Use Symfony validator through Respect\Validation)
respect/validation suggests installing zendframework/zend-validator (Use Zend Framework validator through Respect\Validation)
respect/validation suggests installing fabpot/php-cs-fixer (Fix PSR2 and other coding style issues)
Writing lock file
Generating autoload files</code></pre></details>

はい、自分のホームディレクトリにインストールできましたね。

## 設定

`.env`ってファイルに情報を書き込みます。適当にぐぐってアプリケーションを作成してください。ぐぐれ。

```sh:.env
APP_NAME="PhpMastodon Test"
USERNAME="mail@example.com"
PASSWORD="password"
CLIENT_ID="xxxxxxxxxxxxxxxxxxxxx"
CLIENT_SECRET="yyyyyyyyyyyyyyyyyyyy"
```

## 注意

ここで紹介する`.env`ファイルを使った設定は検証用のカンタンな仕組みだから、Webアプリとかで利用するときは十分に注意してね。

## 書き込んでみる

```php
<?php
require_once getenv('HOME') . '/.composer/vendor/autoload.php';
use Baguette\Mastodon as m;
error_reporting(E_ALL);

$config = new m\Config\DotEnvStorage(__DIR__ . '/.env', ['read_only' => false]);
$client = $config->getClientIdAndSecret();
$service = m\session(
    'pawoo.net', $client['client_id'], $client['client_secret'],
    [
        'scope' => 'read write follow',
        'grant' => $config->getUsernameAndPassword(),
        'authorization' => $config->getAuthorization(),
    ]
);

// .env ファイルにアクセストークンがなかったときに勝手に書き込んでくれるよ
$config->setAuthorizationFromObject($service->session->authorize());
$config->save();

// やっほーって書き込むよ
$service->postStatus(m\toot('やっほー'));
```

簡単でしょ？
SQLite3::BusyException: database is locked:のエラーの解決

SQLite3::BusyException: database is locked:のエラーの解決

```ruby:環境
rails 5.0.2
```

lendモデルを作ろうとして、最後にrake db:migrateをしたら、以下のエラーが出た。

```ruby:エラー
SQLite3::BusyException: database is locked: CREATE TABLE "lends" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user_id" integer, "book_id" integer, "begin" datetime, "finish" datetime, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)

```

解決法１
　ターミナルを開いて、rails cでコンソールを開いて、以下を打つ。

```ruby:コンソール
　　 ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")

```



打ったら、エラーが直った。

解決法２
　エラーが出ているモデルが、他の関係が間違っている。

```ruby:user.rb
dependent:destroy
```
付け加える

参考
http://stackoverflow.com/questions/7154664/ruby-sqlite3busyexception-database-is-locked
プログラミング言語の人気


日本でプログラミング言語を勉強し，書く上でQiitaに触れる機会は多い．
たくさんのご指摘を頂いたので記事を少し修正した．まず 人気＝記事数 の方程式は確かに成立しないあくまでの学習の参考文献などが多く学びやすいなどの解釈で，プログラミング言語学習の参考にして欲しいと思う．

##日本のトレンド言語ランキング

自分が最初にプログラミング言語を学んだ時に，何を学ぶかで悩んだことを思いだしたのでプログラミング言語のトレンドを調べるためにQiitaでの記事数を基にランキング化した．
調査するプログラミング言語の選定基準としては，主要プログラミング言語（Java，Cなど）と注目されているプログラミング言語（Go，Rustなど）を主観的に決めた．

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/179632/c2ca1fd0-d68a-65b0-162d-3c838a70bc73.png "figure_1.png")

結果として1位と2位はJavaScriptとRubyになった．JavaScriptは近年急速な発展をしていることからも予想通りだと思う．Rubyに関しては日本製であることが強く影響してると考えられる．Pythonは日本で採用してる企業は少ないと思っていたが人気はあることが伺える．
後，注目できるのはSwiftの注目度の高さだと思う．2014年に発表されてからまだ3年でこの記事の数である．

現在までの記事数のランキングのみでは言語のトレンドはわからないとのご指摘頂きました．
確かにその通りだと思うので，そこでトレンドをより鮮明にするために，去年1年間での記事投稿数の変化をグラフにした．

![figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/179632/f7fce714-737d-d914-5a3f-2a3e30b5560f.png "figure_2.png")

これでより鮮明な言語の日本におけるトレンドが明らかになったと思う．顕著に見えるのはPythonの人気の高さで，これは近年の機械学習などへの関心の高さが起因していると思われる．
また加えて，Objective-CがSwiftの台頭により関心の減少が顕著であるのが見て取れる．

##世界のトレンド言語ランキング

前述までで，Qiitaの記事数からトレンドとなる言語調べてみた．そこで，世界のトレンドについても考えてみた．日本がQiitaなら世界はStackOverFlowかなと思ったので同様にランキング化してみたのでこちらも参考に．

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/179632/8594a23f-32ef-e0ae-ef43-f82efaedf3dc.png "figure_1.png")

StackOverFlowはQiitaよりも歴史が長く記事数も多いため古くから存在する主要言語が上位を占める結果となった．個人的には贔屓のJavascriptがまた1位で関心度の高さを感じた．
前述の日本ランキングと同様に，去年1年における各言語に対する質問数の変化をランキング化した．

![figure_3.png](https://qiita-image-store.s3.amazonaws.com/0/179632/e7b995cf-8be6-b20e-c68b-6927bed4c2fe.png "figure_3.png")

日本と比較するとRなどが高い伸び率を記録していることがわかる．また依然としてPythonは伸び率が高くSwift，Goなども注目されている言語と言えるだろう．
Rubyでのコーディング規約を整える

スタディプラスではサーバサイドをRuby on Railsで書いとります。
が、出身言語がバラバラだったりすることもあり、言語文化の影響でけっこー書き方が違ってたりしてコードレビュー時とかに気になったりするので、そこを統一する目的もあって[RuboCop](https://github.com/bbatsov/rubocop)を導入しています[^1]。

んで、最初は .rubocop.yml を各プロジェクトのレポジトリごとに置いていたのですが、やっぱズレとかが出て来てめんどくさくなったので、[rubocop_config](https://github.com/studyplus/rubocop_config)として共通で扱うようにしました。

```Gemfile(.rb)
group :test, :development do
 gem 'rubocop_config', github: 'studyplus/rubocop_config'
end
```

```.rubocop.yml
inherit_gem:
  rubocop_config: config/rubocop.yml
```

的に書いとけば、よしなにやってくれます。

んで、こういう静的解析的であるあるネタとして設置して満足ってのがあったりするので、習慣的にチェックするために[SideCI](http://sideci.com)を導入してPRのたびにチェックが走るようにしとります[^2]。
これによって、出身言語による間違ったクセとかを機械的にツッコんでくれるので、非常に大助かりです。

---
[^1]: 一番RuboCopに怒られてるのは、PHPerとしてのクセが抜けない俺だったりしますが...
[^2]: 2017/5現在、SideCIさんは野良gemに対応してなかったりするので、結局各レポジトリに置いていたりするのですがorz