OmniAICreator/Qiita-1.07M huggingface dataset:
技術英語 > the best way to prepare for future requirements is not to write [speculative code]

@ Code Complete (No. 18313 / 36077)

> Experts agree that the best way to prepare for future requirements is **<font color=red>not to write speculative code</font>**; it's to make the currently required code as clear and straightforward as possible ...

意訳「将来の要求に対しての良い方法は、推測的なコードを書かないこと」。

将来に備えて機能を用意するというのも手ではあるが、将来の修正時点で考えるというのが良いということらしい。

将来の修正時点で動作の大枠が変更になったとしたら、大幅な修正が必要となるだろう。一方で、小修正で済みそうなら、その時点で考えるというのがいいのかもしれない。

過去の修正経験で一番役立ったことは、「読みやすいソースコードにしておくこと」。検索して絞り込めるようなコードにしておくことが大切だと常々感じていて、実際に数多の場面において役に立っている。
TAPL8-1.ブール値のための型付け規則

```math
\begin{array}{lr}
新しい構文形式\\

\begin{array}{llr}
\bbox[lightgray]T ::= & …    & \hspace{170px} 型：\\
      & \bbox[lightgray]{Bool} & ブール値型\\
\end{array}\\
\\
\begin{array}{cr}
新しい型付け規則 \hspace{100px} & \bbox[3px,border:1px solid black]{t : T}\\
\bbox[lightgray]{true : Bool}                          & \text{(T-True)}\\

\bbox[lightgray]{false : Bool}                         & \text{(T-False)}\\

\bbox[lightgray]{
\dfrac{t_1 : Bool \quad t_2 : T \quad t_3 : T}
{if\;t_1\;then\;t_2\;else\;t_3 : T}} & \text{(T-If)}\\
\end{array}
\end{array}
```

```prolog:tapl08_1.pl
/*
構文

t ::=                項：
　true               定数真
　false              定数偽
　if(t,t,t)          条件式

v ::=                値：
　true               定数真
　false              定数偽

Ty ::=               型：
　bool               ブール値型
*/
:- op(900, xfx, [ : ]).
:- op(910, fx, [ ⊢ ]).
:- op(920, xfx, [ ==>, ==>> ]).
:- op(1200, xfx, [ -- ]).
:- style_check(-singleton).
term_expansion(A -- B, B :- A).

t(true).
t(false).
t(if(T1,T2,T3)) :- t(T1),t(T2),t(T3).
v(true).
v(false).

% 評価 t ==> t’

if(true, T2,T3) ==> T2.         % (E-IfTrue)
if(false,T2,T3) ==> T3.         % (E-IfFalse)

T1 ==> T1_
--%------------------------------ (E-If)
if(T1,T2,T3) ==> if(T1_,T2,T3).

% 新しい型付け規則 t : T

⊢ true : bool.                    % (T-True)

⊢ false : bool.                   % (T-False)

⊢ T1 : bool, ⊢ T2 : Ty, ⊢ T3 : Ty 
--%-------------------------------- (E-If)
⊢ if(T1,T2,T3) : Ty.

T ==>> T3 :- T ==> T2, T2 ==>> T3.
T ==>> T.

run(T) :- ⊢ T : Ty, T ==>> T2, writeln(T:Ty==>T2).

:- run(true).
:- run(if(true,false,true)).
:- run(if(false,false,true)).
:- run(if(if(true,false,true),if(true,false,true),if(true,false,true))).
:- halt.
```
CentOS 5 でHDD流用本体交換を行った後のネットワーク設定

* シングルユーザモードで起動。
    * GRUBの起動オプションに`1`をつける。

通常のランレベルでもOS起動するが、ネットワークタイムアウト待ちで10分くらい待たされる

## ネットワーク設定

いままでの設定は /etc/sysconfig/network-scripts/ifcfg-eth0.bak に保存され
新しく /etc/sysconfig/network-scripts/ifcfg-eth0 が作成される。

差分見ながら修正。

```diff:/etc/sysconfig/network-scripts/ifcfg-eth0
- BOOTPROTO=dhcp
+ BOOTPROTO=none
+ (bondingなどの設定)
```

OS再起動するか、init 3で起動するか、以下

```
service network restart
```
Juliaインストール

こんにちは。Livesense Advent Calendar 2016 その２、８日目を担当させて頂くfkm_yです。

## はじめに
アドベントカレンダーのネタが思いつかず困っていたら
Juliaいいよと聞いたのでJuliaを触ってみました。

## Juliaとは
* 機械学習や統計で使われる計算向け言語
* RやPythonに比べて高速

公式サイト http://julialang.org


## Juliaのインストール
mac上でbrewを使ってJuliaをインストールする。
（結構時間がかかる。。）

```
$ brew update
$ brew tap staticfloat/julia
$ brew install julia
```

参考 https://github.com/staticfloat/homebrew-julia/

## 起動/動作確認
インストールが完了したら起動確認する。

正常にインストールされると下記のようなメッセージが出る。

```
$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.6.0-dev.1392 (2016-12-04 14:17 UTC)
 _/ |\__'_|_|_|\__'_|  |  Commit cdabda1* (0 days old master)
|__/                   |  x86_64-apple-darwin16.1.0



julia> 123 - 30
93

```
確認が終わったら`julia> exit()`で終了


# ブラウザ上で動作させる
書いたコードの結果をグラフで表示して確認できるようにするために
Webブラウザ上で動作する任意の言語の記述・実行・表示を行うサービスJupyterを導入します。
JupyterはPythonで書かれているため、Pythonのインストールも必要になる。

## Pythonインストール
mac上でbrewを使ってJuliaをインストールする。

```
 $ brew install python
 $ pip install --upgrade pip
```

## ipythonインストール

```
 $ pip install ipython
 $ pip install ipython[notebook]
```

## Juliaパッケージインストール
IJuliaをインストール
IJulia：Webブラウザ上でJuliaを動作させるためのパッケージ

```
 julia> Pkg.add("IJulia") 
```


## jupyter起動


```
 julia> using IJulia
 julia> notebook()
```
または

```
  $ ipython notebook
```
C++で型なしラムダインタプリタを書いた

この記事は[言語実装 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/lang_dev) 7日目の記事です。

表題の通りC++で型なしラムダインタプリタを書きました．
githubへのリンクは以下です．
[https://github.com/pointwiseproduct/untyped_lambda](https://github.com/pointwiseproduct/untyped_lambda)
Linuxではmakeすればバイナリファイルを生成するはずです．(Ubuntuで動作確認をしました．)

## 概要
untyped_lambdaはC++によって記述された，ラムダ計算のインタプリタです．

## プログラムの使用方法
untyped_lambdaを実行するには，式の書かれたファイルのパスを以下のようにコマンドラインから引数として渡します．

- untyped_lambda `inputfile`

このとき，以下のオプションを後続して渡すことで動作を切り替えられます．

- `-h` : ヘルプメッセージを表示する．  
- `-o` : 式の評価結果のみ表示する．
- `-b` : 式の評価結果の前に値を表示する．  
- `-s` : 式の評価ごとに一時停止する．任意のキーを押下することで再開．

## 式の記述方法
## コメント
`(* ... *)`で囲むことによって，ソースコードの任意の位置にコメントを書き込むことができます．  
コメントは空白と同じ扱いになります．

## 評価対象の式
式はピリオド`.`で区切られます．以下は`x`と`y z`と`u v w`の式です．  
空白は字句解析時に無視されます．  

```
x.  
y z.  
u v w.
```

## ラムダ式
例えば引数xを取りxを返すラムダ式を記述するには`/x. x.`とします．  
複数の引数を取る場合は`/x y z. ...`と記述するか，1引数のラムダを連ねてください．  

```
(* λx. ... *)
/x. ...
(* λx. λy. λz. ... *)
/x y z. ...
/x. /y. /z. ...
```

### 代入式
左辺トークンに`=`で右辺を設定することで，代入式として扱うことができます．  
代入式そのものは評価されません．
代入式の左辺に用いられたトークンは，以降別の式で記述されるたびに右辺の式として評価されます．

```
0 = /f x. x.
1 = /f x. f x.
2 = /f x. f (f x).
3 = /f x. f (f (f x)).
add = /m n. m succ n.
(* ... *)
add 3 3.
```

```
-> /f x. f (f (f (f (f (f x))))).
```

### 一通り実装を終えての感想
Zコンビネーターで階乗を書いたけど無限に再帰してうまく動かない；；
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 2日目(タイムラインで簡単なアニメーション)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 4日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

クエストを作る前にタイムラインを利用したアニメーションがサクっと出来たので、記事を書きます。
今回もUE4よちよち初心者レベルです。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#タイムライン

カメラのOrtho Widthの値をタイムラインで返すようにします。

まずレベルブループリントを修正します。
右クリックしてタイムラインを検索しましょう。日本語はタイムラインと入力すると出ます。
![タイムライン２.png](https://qiita-image-store.s3.amazonaws.com/0/104377/31101a75-5c8d-e842-eca4-293bdd9c18bf.png)

新規追加されたタイムラインをダブルクリックするとエディタが開きます。
![タイムライン3.png](https://qiita-image-store.s3.amazonaws.com/0/104377/c3cae4a9-6879-115c-2beb-6d5fe4e12214.png)

ついでにタイムラインの名前も変えます。

タイムラインノードをダブルクリックするとタイムラインエディタが開きます。
![タイムライン1.png](https://qiita-image-store.s3.amazonaws.com/0/104377/1fc63e1e-f205-fb6d-5ae7-88d570ad99ba.png)

floatをクリックして追加。時間０には値０、時間２に値９６０をセットします。

タイムラインの編集が終わったので、レベルブループリントをつなぎなおしました。
![タイムライン.png](https://qiita-image-store.s3.amazonaws.com/0/104377/f0b4e4b1-1d37-68ab-50b6-2e558f34a52b.png)

これでズームアウトするアニメーションが簡単に実装できました。

#タイムライン完成

サクッとできました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">予想以上に短時間で出来てしまった。タイトル画面に簡単なアニメーションを付けてみた<br>（また寄り道してしまったorz） <a href="https://t.co/l5dnFO0zuq">pic.twitter.com/l5dnFO0zuq</a></p>&mdash; 荻野雄季＠クルーズから出荷された豚 (@YuukiOgino) <a href="https://twitter.com/YuukiOgino/status/806460943991390208">2016年12月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

今回は番外編です。次こそクエスト画面を実装します。
完成に向けてやれることをやります。
Wio Node SDKをWebSocket対応した

※この記事は[NIFTY Advent Calendar](http://qiita.com/advent-calendar/2016/nifty) 8日目の記事です。

[前回の記事](http://qiita.com/heppoko_dev/items/eb6621cf32d68a665541)のFuture WorkだったWebSocket接続に対応しました。
これで、センサーの値の変化をリアルタイムで検知して、イベントを発火することができるようになりました！

リポジトリ：https://github.com/fuku2015/wio_node

(Wio Nodeそのものについてや、基本的な導入方法については、先に前回の記事をご覧ください。=> [Wio NodeのSDKをNode.jsで書いてみた](http://qiita.com/heppoko_dev/items/eb6621cf32d68a665541) )


### 使い方
WebSocketはセンサーそれぞれではなく、Wio Node本体と一本のコネクションをはるので、モジュールのインスタンスから`connectWS`メソッドを生やします。
引数として、メッセージ受信時のハンドラを設定します。

```javascript
"use strict"

const token = "YOUR_TOKEN";

const Wio = require("./lib/wio_node");
const wio = new Wio(token);

wio.connectWS(function(err, res){
  if(err) console.log(err);
  console.log(res);
});
```
これで、メッセージが届くたびに、ハンドラが実行されます。
メッセージフォーマットは以下の通りです。

```
{event: "EVENT_NAME", port: PORT_NUMBER} // PORT_NUMBER -> 0 or 1

```
生のフォーマットだとJSON形式でもないし、ポート情報も0/1とかPORT0/PORT1とかじゃなかったので、大分使い勝手が良くなったハズ。


#### 活用例
片方のセンサーの値の変化によって、もう片方のセンサーの値をリアルタイムに書き換えるような処理も簡単に書けるようになりました！(APIでサポートしてそうですが、実はされてない。)

以下のサンプルでは、PORT0にLED、PORT1にボタンやタッチセンサーを接続すると、プッシュやタッチするたびにLEDがON/OFFするようになっています。

■ Wio Linkの設定
PORT0: GenericDigitalOutput
PORT1: GenericDigitalInput


```javascript
"use strict"

const token = "YOUR_TOKEN";

const Wio = require("./lib/wio_node");
const wio = new Wio(token);
const digiOut = new wio.GenericDOut(0);

var onoff = 0;
wio.connectWS(function(err, res){
  if(err) console.log(err);
  if(res.event === "input_rise" && res.port === 1){
  	onoff = 1 - onoff;
  }
  digiOut.send(onoff);
});
```
これはあくまで一例です。
他のサービスやシステムと組みあわせて、人感センサーが反応したらプッシュ通知でアラートがくるとか、温度センサーが一定以下になったら暖房が入るなどといった使い方ももちろんできます。
(SDK使って作ってみた系の記事も追って書くつもりです。)

### 感想
書き出す前はもう少しめんどくさい使い勝手になるかと思ってましたが、意外とシンプルでいい感じになりました。
リアルタイムに値の変化を取れると、やっぱり動いてる感があってテンション上がりますね！
APIたたくよりもこっちのほうを先に実装すべきだった気がします。

WebSocket接続ができた勢いでnpm公開をしそうになりましたが、検索して出てきたモジュールがこのクオリティだったら、自分ならそっ閉じするなぁと思ったので、イケてるコードとまではいかなくても、せめてテストとかバリデーションとかをちゃんとやってからにしようと思います。
(npmで使えないとなかなか使ってもらえないので、年内にさっさとやろう…。)

明日は@uochanさんです！お楽しみに！
GetWildの信号強度を解析し、音の大きさを可視化する

[Get Wild Advent Calendar 2016](http://qiita.com/advent-calendar/2016/getwild) の8日目です。

# 概要
* GetWildの信号強度を解析して、音の大きさを可視化させます

# 内容
## ①Get Wildの曲をflacに変換する
* ネットにあるやつで変換しましょう。

## ②秒間毎に数値に出す
* Goで書きました　https://github.com/sioncojp/flac2float
* 名前の通り、.flac拡張子にしか対応してません。
* アルバム[TMN BLACK](https://www.amazon.co.jp/Tetsuya-Komuro-Presents-TMN-black/dp/B00005G4I7)にあるGet Wildの再生時間は 4:01 = 241秒 です。
* 1秒間毎のデータを出しますので、241個のデータが出力されます。


```bash
### インストール
$ go install github.com/sioncojp/flac2float/...

### 241個でるか確認
$ cat ~/Music/GET\ WILD.flac | flac2float | wc -l
241

### 出力
$ cat ~/Music/GET\ WILD.flac | flac2float
0.07720291381341982
0.07691403913539886
0.08191831107113605
0.07342890560008171
0.08762865644699959
.
.
.
.
# 量が多いので省略
```

## ③ここでGet Wildの構成を振り返る
* TMN BLACKにあるGetWildの構成は下記の通りです

```
0秒: 1サビ
30秒: アスファルト
62秒: get wild and tough
91秒: 2サビ
106秒: 車のライトに
138秒: get wild and tough
168秒: 3サビ
182秒: get wild and tough
そのままフェードアウト
```

## ④スプレッドシートあたりでグラフにしてみる
* スプレッドシートで出力したグラフにさきほどのポイントを追記しました

![スクリーンショット 2016-12-08 1.10.18.png](https://qiita-image-store.s3.amazonaws.com/0/29405/49f01d48-819a-31a7-de47-c65b698f4e43.png)

## ⑤考察 
* 最後の`Get wild and tough`が一番音が大きいです。
* ただ、`Get wild and tough`->`2サビ` と、`3サビ`->`Get wild and tough` の高低差は同じです。
* **全力Get wild and tough**に向けて、あえて`3サビ`を高めにセットしてるのは興味深いです。
* この高低差の同一性が**小室マジック**なのかもしれません。

## 最後に
* 他の曲でも出力出来ますので、`BEYOND THE TIME`あたりなども是非考察にお使いください

# 参考
* https://github.com/mdlayher/waveform
SearchProtect除去手順 Windows10

Windows 10 における手順
ただし環境はIE, Edge, Firefoxというもの
1.serachprotectが入ったことに気付く
Troviというサイトにつながった。
2.Geek UnistallerをDL
これはインストールの必要がないので便利。個人は無料の非商用版が使える。
3.タスクマネージャを起動
[WindowsCPU.com - CltMngSvc.exe](http://windowcpu.com/qr.php?q=cltmngsvc-exe-c-program-files-searchprotect-main-bin-cltmngsvc-exe)
* [コントロールパネル] - [管理ツール] - [サービス]で関連項目を見つけるのプロパティでサービスを停止
* さらにサービス管理ツールを開いてスタートアップの種類を無効
4.そしてIEとFFから検索のプロバイダからtrovi seach conduitを除く
5.geek unistallerを起動し、searchprotectを強制削除する
※フォルダを開いてアンインストーラーを起動しても無理
※レジストリもまとめて一括削除
6．セーフモードで再起動する
7.searchprotectのフォルダを削除できるだけ削除する(全部は削除できない)
8.Win+R %temp%で一時フォルダを開き、実行形式ファイルを削除
spstub.exe
dlLogic.exe
という名前でした
※これを削除しないとまたインストールされてしまう。
9.通常再起動
[WindowsCPU.com - CltMngSvc.exe](http://windowcpu.com/qr.php?q=cltmngsvc-exe-c-program-files-searchprotect-main-bin-cltmngsvc-exe)
前述のサイト次のコマンドラインを入力します。
sc delete "CltMngSvc"
を適用してサービスを削除

以上のような手順になるようだ。最も手早くやらないとまたインストールされてしまう。その場合最初からやり直しになる。
再帰関数をループで表現してエラーを回避する

#はじめに
再帰関数はコンパクトに書けて便利ですが,言語の仕様などによって定められた**再帰回数をこえてしまうとエラーになってしまいます**
そのようなときは再帰関数はループに書き直すことでエラーを回避できます
特に幅優先探索で代用したくないような状況では重宝します

#使用環境
私のパソコン(Windows10 ,BCC32)だとOSが勝手に動作を停止させてしまうので
クラウドでコンパイル実行できるCodingGround の c++ を利用させてもらいました


Coding Ground
https://www.tutorialspoint.com/codingground.htm


gccのバージョンは以下の通りです

```text
gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
```

#考察に使うプログラムについて
1行目に幅と高さが空白区切り,
2行目からはデータとして0と1がスペース区切りで与えられている
このデータに4近傍(縦横)で隣接した1の島がいくつあるかを数えるプログラム
データの最大サイズは1000x1000として
受け取ったデータは保持しなくてもいいものとします

#再帰関数を使った例
```cpp:island1.cpp
#include <iostream>
using namespace std;

int search(int i,int w,int h,char data[1000000]){
  if(data[i]=='1'){
    data[i]='0';
    if((i%w)!=0)     search(i-1,w,h,data);
    if((i%w)!=(w-1)) search(i+1,w,h,data);
    if((i/w)!=0)     search(i-w,w,h,data);
    if((i/w)!=(h-1)) search(i+w,w,h,data);
    return 1;
  }
  return 0;
}

int main(void){
  char data[1000000];
  int w,h;
  int count=0;
  cin >> w >> h;
  for(int i=0;i<w*h;i++){
    cin >> data[i];
  }
  for(int i=0;i<w*h;i++){
    count += search(i,w,h,data);
  }

  cout << count << endl;
  return 0;
}
```

```text:結果(100x100オール1)
1
```

```text:結果(1000x1000オール1)
Segmentation fault (core dumped)
```
1000x1000のオール1なのでこのときの最大の深さは1000000になります
このように深さが深くなるとエラーになってしまいます

#再帰関数を展開した例
```cpp:island2.cpp
#include <iostream>
using namespace std;

#define RIGHT  0
#define LEFT   1
#define DOWN   2
#define UP     3
#define END    4


int main(void){
  char data[1000000];
  int w,h;
  int count=0;
  cin >> w >> h;
  for(int i=0;i<h*w;i++){
      cin >> data[i];
  }

  for(int i=0;i<h*w;i++){
    if(data[i]=='1'){
      while(true){
        /* marking start-point */
        if(data[i]=='1') data[i]=END;

        /* search */
        if((i%w)!=0)     if(data[i-1]=='1'){ data[--i]=RIGHT;      continue;}
        if((i%w)!=(w-1)) if(data[i+1]=='1'){ data[++i]=LEFT;       continue;}
        if((i/w)!=0)     if(data[i-w]=='1'){ data[i-w]=DOWN; i-=w; continue;}
        if((i/w)!=(h-1)) if(data[i+w]=='1'){ data[i+w]=UP;   i+=w; continue;}

        /* dead end */
        if(data[i]==RIGHT)  {data[i]='0';i++;continue;}
        if(data[i]==LEFT)   {data[i]='0';i--;continue;}
        if(data[i]==DOWN)   {data[i]='0';i+=w;continue;}
        if(data[i]==UP)     {data[i]='0';i-=w;continue;}

        /* terminate */
        if(data[i]==END)    {data[i]='0';count++;break;}
      }
    }
  }

  cout << count << endl;
  return 0;
}
```
再帰関数では一つ上の関数の保持する情報で戻っていましたが
一つ上の関数というものはないのでデータ自体に呼び出し元の情報を書きます
袋小路に来たら'0'に書き換えて呼び出し元に戻ります

```text:結果(100x100オール1)
1
```

```text:結果(1000x1000オール1)
1
```
このようにエラーを回避できました
#まとめ
- 再帰関数で書かれたプログラムは呼び出し元を記録しておくことによってループで書き替えられる
- エラーの原因となるので,再帰する数が不明の場合あるいは最大呼び出し数を超過する場合はループで書くほうが望ましい
- ただしループで書く場合は無限ループに入った際停止しないので使うときは注意が必要である
開発した Android アプリに見知らぬ permission が増えていたときの削除法

検索してなかなか出てこなかったので書きました。

Android アプリで知らないうちに permission が増えていたときの対処法です。

外部のライブラリを使うと、 AndroidManifest に記載していなくても、開発したアプリでは使わない権限が増えてしまうことがあります。
その場合の削除方法です（これを実行することで、予期せぬ不具合を起こす場合があるため、よく確認した上で実行してください）。

###解決方法

例えば、 android.permission.INTERNET を削除したい場合は以下のように、不要でも一度 AndroidManifest.xml に書き

```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="hogehoge">

    <uses-permission
        android:name="android.permission.INTERNET"
        tools:node="remove"
    />

```

remove を付加することで削除することができます。
背景とかがフェードで切り替わるSassのmixin

「[Adobe MAX Japan 2016（9/2開催） \| Adobe Creative Station](https://blogs.adobe.com/creativestation/general-adobe-max-japan-2016)」のセッションで使ったトリッキーなSCSS

# mixin

```scss
@mixin fade($classes) {
  $length: length($classes);
  $persent: percentage(1 / $length);
  @each $class in $classes {
    $index: index($classes, $class);
    $step1: ($persent * $index) - $persent;
    $step2: ($persent * $index) - 3;
    $step3: $persent * $index;
    $step0: $step1 - 3;

    .#{$class} {
      animation-name: #{$class};
      @if $index == 1 {
        opacity: 1;
      }
    }
    @keyframes #{$class} {
      @if $index == $length {
        #{$step0} {
          opacity: 0;
        }        
      }
      @if $index > 1 {
        #{$step0} {
          opacity: 0;
        }        
      }
      #{$step1} {
        opacity: 1;
      }
      #{$step2} {
        opacity: 1;
      }
      @if $index != $length {    
        #{$step3} {
          opacity: 0;
        }
      }
    }
  }
}
```

# 変数

```scss
$fade-duration: 10s;
$fade-classes: (
  hero__item1,
  hero__item2,
  hero__item3,
  hero__item4
);
```

# SCSS

```scss
.hero {
  position: relative;
  height: 100vh;
}
[class*="hero__item"] {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  opacity: 0;
  z-index: 1;
  background-repeat: no-repeat;
  background-position: 50% 50%;
  background-size: cover;
  animation-duration: $fade-duration;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

@include fade($fade-classes);
```
Windows で Ocra を使わずに Ruby 製アプリケーションを exe にして配布する

この記事は [Ruby Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ruby) の 8 日目の記事です。

Windows で Ruby 製のアプリケーションを配布したいことがあります（例：デスクトップアプリケーション、ゲームなど）。

そういうときはたとえばスクリプトと一緒に Ruby の実行環境をまるごと配布する、Ocra を使って Ruby の実行環境をまるごと単体の exe にまとめるなどの方法があります。

Ruby の実行環境ごと配布する方法の場合、起動は bat ファイルになるでしょう。これはデスクトップアプリケーションやゲームのユーザにはちょっと馴染みのない実行方法になってしまいます。

Ocra を使う方法は実行するだけでアプリケーションを起動可能な exe にまとめられるという点で前者の方法よりはよいのですが、temp ディレクトリにまとめておいた Ruby の実行環境をまるごと出力してここで Ruby を実行するので、起動が遅く、ユーザ名に非 ASCII 文字が含まれている場合に実行できないなどの問題があります。

# Ocra を使わないやり方

そこで、Ruby 2.0 が出るちょっと前くらい頃に、こういう方法はどうですか、という構想が提案されています。

- [超簡単に Ruby プログラムを exe にする新しい方式 (構想)](http://d.hatena.ne.jp/ku-ma-me/20120510/p1)

exe の末尾にスクリプトが連結されていたらそれを読み込んで実行するようにする、というシンプルなアイデアです。

基本的にはこのパッチで実現できるのですが、埋め込んだスクリプトから `require` がうまく動かなかったり、Ruby 2.2 や 2.3 では Ruby のコードが更新されていてパッチが当たらないので、そのあたりを対応したものを作りました。

- [2.1 用](https://gist.github.com/aoitaku/303ca4da30d6c681ec9a)
- [2.2、2.3用](https://gist.github.com/aoitaku/9f90db0080d49a6fbe0e2c32a4030502)

このパッチを当ててビルドすれば末尾に連結されたスクリプトを読み込んで実行可能な Ruby のバイナリが得られます。

# ビルド方法

ビルドすればというものの、Windows でそう簡単にビルドできたら……いいえ、Windows でもわりと簡単にビルドする方法はあります。

- [oneclick/rubyinstaller](https://github.com/oneclick/rubyinstaller)

RubyInstaller という Windows 版 Ruby のビルド済みバイナリを配布しているサイトがあるんですが、そこが使っている Ruby ビルドキットがありまして、このリポジトリをクローンしてきて、`rake ruby23` のようにバージョンを指定して `rake` するだけで Ruby がビルドできます。

Ruby 2.3 なら `resources/patches/ruby23` に 2.3 用のパッチを入れるとパッチを当てた状態でビルドしてくれます。

Windows でビルドって聞くとめちゃ大変そうなイメージありますが、キットを使うとコマンド叩くだけなのでとても簡単です。

# 実際にスクリプトを連結するには

`copy` コマンドで連結できます。

```
copy /B ruby.exe+rubyapp.rb rubyapp.exe
```

配布には DLL とか拡張ライブラリとか必要だったりするので、スクリプトの連結から読み込んでるファイルをまとめてフォルダにコピーするところまでコマンドライン一発でできるといいなということを思ったので、そういうコマンドライン用のスクリプトを書きました。

- [rpk](https://gist.github.com/aoitaku/1b8c68187cb8d369ced9ec7d688b2dfd)

この rpk をパッチ当ててビルドした Ruby の bin に入れて

```
rpk rubyapp.rb
```

ってやるとファイル一式まとめて dist というディレクトリにコピーします。

パッケージングするときにスクリプトと同じディレクトリ内に rpk.json というファイルを作っておいておくとそこに書かれたファイルを一緒にコピーします。

json の構造はこんな感じです。

```json
{
  "extra" : [
    "resources"
  ]
}
```

extra というキーにコピーしたいディレクトリを配列で書くと dist にコピーされます。  
ゆくゆくはほかにもオプションを記述できるようにということを考えています。

バージョンが決め打ちになってるところがあるので実行中のバージョン見るようにしたりとか、gem に対応してないので gem 経由のライブラリをうまいこと配置するようにとか、DLL が exe と同じ階層にずらっと並んでしまうので bin 配下に配置したいとか、いろいろ改善するところはありますが、とりあえずこれでコマンド叩けば配布用のファイル一式を揃えるところまでできます。

# アイデアください

いまだと

- RubyInstaller のキットをクローンしてくる
- patches にパッチファイルを入れる
- ビルドする
- ビルドした Ruby の bin ディレクトリに rpk を入れる
- ビルドした Ruby にパスを通す（たとえば [uru](https://bitbucket.org/jonforums/uru) を使うとかあります）

という感じで割と手間なので、コマンド一発叩くと github からリポジトリ引っ張ってきてパッチ当ててビルドして rpk 入れてというところまでできるツールがあればなーということを思っています。

たとえば個人がビルド済みバイナリを用意して配布するとかでもいいんですが、件の RubyInstaller の中の人が今年の頭に交通事故にあって Ruby 2.3 のビルド済みバイナリの配布が遅れたという話を考えると、誰でもビルドできるようになってるほうがのぞましいなということを思います。

というわけで、アイデアを募集します。お気軽にお声かけください。

# 追記

"Luaのexe化ツールも同じ方法" という情報を [ブコメ](http://b.hatena.ne.jp/entry/311621225/comment/wordi) でいただいたので、ちょっと調べてみたんですけど [srlua](https://github.com/LuaDist/srlua) というのがあるみたいですね。ちょっと参考にしてみようかと思います。ちなみに sr は self-running の略だそうで。
SublimeText3でUTF-8のLaTeX環境を構築する（Windows）

# 背景
Tex文書の共同執筆やリユースをするときに、WindowsやMacなどで文字コードがことなると面倒なことになります。TeX文書もUTF-8に統一したほうがよいでしょう。

また、atomでもTeX関連のパッケージがあります。それらもトライしましたが、その2016-12-08の時点ではbibtexが動かなかったりplatexがなかったりで、イライラしたのでやめました。

# 確認済みのバージョン
- Windows 10
- TeXLive 2015
- Sublime Text 3
- LaTeXTools v3.12.11
- SumatraPDF 3.1.2 (64bit)

# 手順
- Sublime Text 3をインストールする
- SublimeにPackage ControlをインストールしてLaTeXToolsをインストールする
- TeXLiveをインストールしてパス(e.g. C:\texlive\2015\bin\win32)をとおす
- SumatraPDFをインストールしてパス（e.g. C:\Program Files\SumatraPDF）をとおす
- Sublimeのメニュー[Preferences]->[Package Settings]->[LaTeXTools]->[Settings-User]を選択してLaTeXTools.sublime-settingsのbuidlder_settingsの部分を下記のように編集する

```py:LaTeXTools.sublime-settings
	"builder_settings" : {

		// General settings:
		// See README or third-party documentation
		
		"command" : ["latexmk", "-cd",
				"-e", "$latex = 'platex %O -no-guess-input-enc -kanji=utf8 -interaction=nonstopmode -synctex=1 %S'",
				"-e", "$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B'",
				"-e", "$bibtex = 'pbibtex %O %B -kanji=utf8'",
				"-e", "$makeindex = 'upmendex %O -o %D %S'",
				"-e", "$dvipdf = 'dvipdfmx %O -o %D %S'",
				"-f", "-%E", "-norc", "-gg", "-pdfdvi"],

		// (built-ins): true shows the log of each command in the output panel
		"display_log" : false,

		// Platform-specific settings:
		"osx" : {
			// See README or third-party documentation
		},

		"windows" : {
			// See README or third-party documentation
		},

		"linux" : {
			// See README or third-party documentation
		}
	},
```

# 確認
下記のソースをコピペして`Ctrl+b`を押し、SumatoraPDFが起動すればOKです。
初回はビルド方法を聞いてくるので`Build With LaTeX - Traditional`を選ぶ。[Tool]->[Build With...]からもビルド方法の選択は可能です。

```tex:sample.tex
\documentclass[a4j,12pt]{jarticle}

\title{ {\LaTeX} サンプルファイル}
\author{長谷川大}
\date{\today}
\begin{document}
\maketitle

\section{はじめに}
ハローワールド！

\section{おわりに}
ハローワールド！

\end{document}
```

# Ref. 
- https://github.com/SublimeText/LaTeXTools/wiki/BIber-Support
- https://texwiki.texjp.org/?Sublime%20Text#jbbbbc43
FEED43でQiitaのストックをRSSにする

はじめに
====================

フィードを提供していないWebページのRSS化はいくつか記事がありますが、RSS化サービスが続々終了していたりするため、2016/12/08現在利用できるものを投稿しておきます。

使用するサービス
--------------------
[Feed43 : Convert any web page to news feed on the fly](https://feed43.com/)

FEED43独自のスニペットを使用した正規表現を登録することにより、HTML内から自由に内容を抽出します。HTMLが分からないと使えませんが、柔軟に抽出箇所を指定できます。

FEED43の使い方
====================

Step 0. FEED43にアクセス
-------------------- 

下記にアクセスして「Create your own feed」をクリック。
[Feed43 : Convert any web page to news feed on the fly](https://feed43.com/)


<img width="300" alt="スクリーンショット 2016-12-08 0.41.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/e42ac100-d8bc-3346-4a2c-a6eaddb870c9.png">

Step 1. Specify source page address (URL)
--------------------

下記のストックページのURLを記入して「Reload」をクリック。
http://qiita.com/&lt;user_name&gt;/stock

<img width="300" alt="スクリーンショット 2016-12-08 0.53.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/770d3f3e-0167-aa62-86b8-4cb2f3a83f28.png">

Step 2. Define extraction rules
--------------------

下記のスニペットを使用して抽出ルールを指定する。

- `{*}` : 任意の文字列に一致する文字列（抽出対象としない）
- `{%}` : 任意の文字列に一致する文字列（抽出対象とする）

面倒な場合は、「Item (repeatable) Search Pattern」に下記のルールを使用してください。
（改行はダメです）

```html
<article {*}><a {*}><img {*} src="{%}" /></a><div class="media__body"><div class="ItemLink__info"><a href="{%}">{%}</a>が{%}に投稿 {*}</div><div class="ItemLink__title"><a class="u-link-no-underline" href="{%}">{%}</a></div>{%}</div>{*}</article>
```

<img width="300" alt="スクリーンショット 2016-12-08 0.57.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/cc2a4ad7-6760-3c9c-59c2-bd66b3e343ad.png">

下記のように、データが抽出されたら成功です。
- `{%1}` : 投稿したユーザーのサムネイルへのURL
- `{%2}` : 投稿したユーザーのユーザーページへのURL
- `{%3}` : 投稿したユーザーのユーザー名
- `{%4}` : 投稿日
- `{%5}` : 記事のURL
- `{%6}` : 記事のタイトル
- `{%7}` : タグリスト

**注意** : 繰り返しアイテムの中で更に繰り返しができなかったので、タグは`<ul>`ごとごっそり取ってきています。

<img width="300" alt="スクリーンショット 2016-12-08 1.07.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/a66cb9c8-0d99-aa83-b09c-909540a8ef0a.png">

Step 3. Define output format
--------------------

フィードアイテムの内容を指定し、「Preview」をクリック。
ここでは、簡単に、タイトル／URL／タグのみを出力しています。

<img width="300" alt="スクリーンショット 2016-12-08 1.07.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/6e4314ae-ee77-c949-732d-e75e93fc8a67.png">

Step 4. Get your RSS feed
--------------------

「Feed URL is: ***.xml」の部分をクリックすると、フィードのxmlにアクセスできます。

<img width="300" alt="スクリーンショット 2016-12-08 1.13.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/269c0a07-17f5-a9db-ef21-226196a44c9f.png">
爆速! kintone開発でPython SimpleHTTPServerの利用

# JavaScriptアップロードするの面倒くさい
kintoneでJavaScriptカスタマイズをするなら

1. アプリの設定
2. JavaScript/CSSカスタマイズ
3. アップロードして追加
4. アプリの更新

という感じでめんどくさい。結構早くやっても20秒くらいかかる。

ほかの方法としてはDropBoxの活用があるが会社で禁止されていたり、クライアントPCからDropBoxに同期するのがおそいときもある。

もっと爆速でkintoneアプリ作りたいよ!

# localhostでWebサーバー立てればOK

ご存知の通りkintoneならJavaScriptをURLで登録出来るのでそのURLをローカルで作ってしまおうという作戦です。

vagrant等でVM立ち上げてやるのも大袈裟な気がしたのでタイトルの通りpythonを使うことにしました。

おもな手順は細かいこと気にしなければ下記の4点です｡

- ターミナルの準備(Windowsの場合cygwinなど使用)
- pythonインストール
- 証明書作成
- https://gist.github.com/dergachev/7028596 のPythonを実行

### ターミナルでの作業

```bash
$ wget https://gist.github.com/dergachev/7028596/raw/abb8bd2b53501ff7125b93e8d975e77ffd756bf1/simple-https-server.py
$ ls
./  ../  css/  js/  simple-https-server.py
$ openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes

$ ls
./  ../  css/  js/  server.pem  simple-https-server.py
$ python simple-https-server.py
```

証明書の設定は国の名前とか色々聞かれますが、取り敢えずめんどくさいからEnter連打します。

上記の作業後https://localhost:4443/ にアクセスすれば、、
![directory.jpg](https://qiita-image-store.s3.amazonaws.com/0/76525/c59f57c6-8d85-e6ec-36e9-9115842da617.jpeg)
みたいな感じで、さっきのpython実行したところがそのままDocumentRootになってる感じです。(便利)
https://localhost:4443/js/script.js にアクセスすると
![directory.jpg](https://qiita-image-store.s3.amazonaws.com/0/76525/50f48c75-7267-b1ef-a29c-f7b7ac55f825.jpeg)
ローカルのjsがブラウザからアクセス出来るようになっています、、

が、よく見るとhttpsが赤字斜線で証明書のエラーになっています笑
でも取り敢えず中身は取れてるのでOKです。。！

すみません、、調べる時間ありませんでした。一応、これでkintoneに登録しても使えます！
※ちなみにわざわざhttpsにしてるのはkintoneがhttpのURL登録できないからです。

ということで上記のソースの間違いをローカルで修正してブラウザをリロードすると
![directory.jpg](https://qiita-image-store.s3.amazonaws.com/0/76525/3f62f0a8-4aae-7d08-d6ef-82fd0c871e62.jpeg)
変更が反映されます。これでkintoneの開発、デバッグも爆速です。

わざわざキャプチャ取ってしまいましたが、要はアプリの設定の｢URLを指定して登録｣でこのURLを登録してあげれば手元のファイルの編集が素早くローカル簡易httpsサーバーに反映されるので、DropBoxとかに比べてもkintoneアプリに登録しているJavaScriptファイルの更新はかなり早くなると思います。

# 注意事項
- 外部からはアクセス出来ないようにしましょう
- あくまでも｢開発｣、｢デバッグ｣としての利用です。kintoneアプリには自分のPCでしかJavaScriptは読み込まれません。(他の人のPCではJSは全く動きません)
- サーバーサイドあまり詳しくないので、証明書エラーのところは勘弁してください。解決策わかり次第更新します。
ドメインコントローラーであるサーバーが公開したプリンターを、ワークグループに所属するコンピューターから使用しようとした吝嗇家にのみ訪れる悲劇

## はじめに

表題のような構成のサーバーは現実に存在しており、以下の問題は現実に発生したものである。

## 症状

Windows 7 Home Premiumが動作するPCから、Windows Server 2008 R2が動作するサーバーに接続されたプリンタを使用しようとしたとする。ただしサーバーにはファイル共有だけでなくドメインコントローラーの役割が与えられている。

このとき、いうまでもなく問題のPCとそのユーザーは当該サーバーが管理しているActive Directoryには参加できない。そこでGuestユーザーとして例のサーバーに接続する。今回はActive Directory上にユーザーアカウントを用意して認証を得る方法は採用しない。なぜならたかだか共有ファイルへのアクセスでサーバーへの明示的なログオンを求めることは一般的なユーザーには負担にしかならないし、IDとパスワードを同一にするにしても表だって使われないIDを適切なパスワードポリシーを保ったまま管理し続けることは一般的な零細企業のネットワーク管理者にとって手に余ることが想像できるためである。

さて、Guestアカウントによるログインとサーバーへのアクセスが許可されていれば、いわゆるホームエディションの端末からであってもドメイン ネットワークの共有フォルダとプリンタは普通にブラウズできるし、ファイルの読み書きも実行できる。**しかしドメインコントローラーが共有しているプリンタへの接続はできない。アクセスが拒否されるのだ。**

この問題についてインターネット検索する過程で遭遇するほとんどのQ&AはドメインネットワークのGuestユーザーを有効化していなかったり、共有フォルダやファイルシステム上のアクセス許可が不適切だったりしたケースを想定したものである。**"ドメインネットワーク上のサーバーが公開したEveryoneアクセスを許可している共有フォルダはGuest扱いのワークグループユーザーから読み書きできるが、同じサーバー上のEveryoneアクセスを許可した共有プリンタへのアクセスは拒否される"**という症状についての説明は、少なくとも今回、日本語のQ&Aサイトからは見出されなかった。

## 原因

基本的には以下の不具合と同じことが起こっていた。

> この問題は、ドメインコントローラーに昇格されたことのあるコンピューターでは、昇格のタイミングでシステム フォルダー配下の権限設定が変更されることが原因で発生します。
> - 詳細な動作について
> 以下のフォルダはスプーラー サービスがスプール ファイルを格納するために利用するフォルダとなりますが、通常はスプール ファイルの作成のため、一般のユーザーから書き込みができる権限設定になっています。

> c:\windows\system32\spool\printers

> ドメイン コントローラーに昇格されたことのあるコンピューターでは、昇格のタイミングでシステム フォルダー配下の権限設定が変更され、スプール フォルダーも合わせて変更されます。

> [ドメイン コントローラー上では Easy Print によるリダイレクトされたプリンターからの印刷に失敗します(KB2673414)](https://support.microsoft.com/ja-jp/kb/2673414)

## 対策 

さて、上記の不具合においては、スプールファイルが作成できないのが原因であるため system32 の下のPRINTERSフォルダへのアクセス権限のみを変更するように推奨されている。

だが、プリンタがまだ追加されていない環境ではPRINTERSフォルダだけでなく、少なくともdriversフォルダへもアクセスできなければインストールができない。おそらくdriversはEveryoneへの読み取りアクセスだけ許可すれば、どのPCからでもインストールできるようになるはずである。

## まとめ

今回は、共有プリンターにアクセスしたとき具体的にどのユーザーアカウントによってスプーリングされるのか、厳密に検証したわけではない。結果としてスプーリングとプリンタードライバの配布に関するファイルシステム上のアクセス許可を修正したことで問題が解消したという結果しか得られなかった。

このような事例は世界にどのくらい存在するのだろうか。つまり、顧客からの文書セキュリティの要求を満たすためにActive Directoryの構成が必要になって、それを実現するサーバーは1台しかなく、そこにはUSB接続のプリンタが接続されていて、オフィス内のほかのユーザーがWindows 7 Home PremiumでGuestアカウントによってサーバー上のプリンタを使用しなければならないようなネットワークだ。

このメモが世間の役に立たないことを切に願う。
リポジトリのメンテナンス法

#メンテナンスの必要性
Forkやcloneしてきたリポジトリは、装置していればリモートリポジトリに対して古くなってします。ここでは、**ローカルリポジトリをいかにして最新に保つか**を解説する。

単刀直入に言えば、開発者のローカルリポジトリに、リモートリポジトリとしてオリジナルのリポジトリを設定し、そこにリモートリポジトリを取り込んで(fetch)、自分のリポジトリにマージ(merge)する。こうすることによって最新のソースコードを保つことができる。


#git fetchとは
git fetchとはリモートディポジトリからローカルリポジトリに最新情報をもってきて、**ローカルリポジトリが更新されるコマンド**のことである。


#git mergeして最新に保つ実践
####手順１：リポジトリをFork,cloneする(最初の一回に限る）
まず、GitHub上でのリモートリポジトリをFork,およびcloneする。

```Bash
$git clone git@github.com:[ユーザー名]/[ディポジトリ名].git
```

####手順２：オリジナルのリポジトリに名前を設定
自分のローカルリポジトリ（ここにリモートリポジトリの最新情報が格納される）として、オリジナルのリポジトリを「origin」という名前で設定する。

```Bash
$git remote add origin git://github.com/{ユーザー名]/[ディレクトリ名].git
```

####手順３：最新データの取得
最新データをfetchして、自分のリポジトリにmergeする。リポジトリの操作を最新状態にするには、この操作を継続的に行うだけ。

```Bash
$git fetch origin
$git merge origin/master
```

もしmergeが上手くいかない場合は

```Bash
$git merge --allow-unrelated-histories origin/master
```
をやってみたらいいです。mergeだけでいけないのはGit2.9からmergeコマンドとpullコマンドでは，--allow-unrelated-historiesを指定しない限り，無関係なヒストリを持つ２つのブランチをマージすることはできなくなった。

####手順４：開発していく
これを行うことによってmasterが常に最新状態となる。開発者は**ブランチを切って開発を進めていく形になる**。

#git pullと何が違うの
git pull は上の工程をすべてひとるのコマンドで行う方法である。便利なコマンドである一方で、conflictなどが起きた時に慌ててしまう。そのため、**fetchを用いてひとつひとつ作業していくことで安心して作業を進める**ことができる。
FreeBSD勉強会、FreeBSDワークショップに参加しませんか?

# オフラインでの Face to Face もいいもんです

[FreeBSD](https://www.freebsd.org/) の情報は Linux に比べるとめっきり減ってしまいました。
そしてオフラインで開発者、ユーザが顔を合わせる場も減ってしまいました。
とはいえ、全くなくなったわけでもなく、細々とですが続けているものがあります。
ネットを検索すればいろいろな情報を得られるようになっていますが、勉強会などのオフラインではオンラインでは出てこないような情報を得られたり、開発者と知り合ったりといった Face to Face ならではの良さもあります。

今からそういう場に参加したいという方に、[FreeBSD](https://www.freebsd.org/) 関係で現在活動中なものとして、二つの勉強会・ワークショップを紹介します。

# FreeBSD勉強会

[gihyo.jp](http://gihyo.jp/admin/serial/01/bsd-yomoyama) で [BSD界隈四方山話](http://gihyo.jp/admin/serial/01/bsd-yomoyama)を連載している [後藤大地](https://twitter.com/daichigoto)（[BSDコンサルティング株式会社](http://www.bsdconsulting.co.jp/)）さんが中心になって活動しています。
大体月一回のペースで一般的な勉強会の形式で活動しています。
ここ数回はZFSに関する話題を扱っています。
最近ではニコ生の中継も始めています。
主に主催者の後藤さんがしゃべていますが、資料の用意とかはなかなか大変で、ネタがある人をいつでも募集中です。
「こんな話ならできるけど」という人はコンタクトをとってみてください。
終わった後は、会場で飲みながら続きをやったり、質問や情報交換をしたりといったことをやっています。

次回は 12月 13日の予定です。
- [第59回 FreeBSD勉強会 ZFSボリューム管理とハードウェア](https://atnd.org/events/82906)

# FreeBSDワークショップ

[FreeBSD](https://www.freebsd.org/) Core Team のメンバーでもある [佐藤広生](https://twitter.com/Hiroki_Sato) ([BSD Research](https://www.bsdresearch.org/index.html.ja)) さんの主催で行われています。
FreeBSD のユーザと開発者の間で意見交換をできる場の提供を主目的として活動しています。
意見交換が目的であるため、勉強会のようにほとんどの人が聞く側というのではなく、とりあえず何か言って帰るということを目指しています。
そのため、最初に全員の自己紹介と言いたいことを言う、ということから始まり、その後にネタを持っている人がしゃべる、という感じでやってます。
開発者としての話だけでなく、完全なユーザとしての意見や文句、希望、質問といった内容でも構いません。
出てきた意見は、佐藤先生から開発側に伝えてもらったりといったこともできます。
中継もやっていますが、中継を見るための情報は参加者に対してのみ通知されるので、リモートで視聴したい場合は参加申し込みを行ってください。
終わった後は、希望者で近所で飲みながら話したりなかったことを話たり、という感じす。

次回は 12月 21日の予定です。
- [第24回FreeBSDワークショップ(+懇親会)](https://freebsd-workshop.connpass.com/event/42769/)

# そして AsiaBSDCon へ

[FreeBSD](https://www.freebsd.org/) に興味が出てきたら、次は *BSD はどうでしょう?
三大 *BSD Conference の一つ、 [AsiaBSDCon](https://asiabsdcon.org/) が日本で行われています。
[FreeBSD](https://www.freebsd.org/) 、[NetBSD](https://www.netbsd.org) 、 [OpenBSD](https://www.openbsd.org/) といった BSD 系の開発者が日本に集まります。
名前を聞いたことある開発者に直接質問したりすることができるいい機会ですので、興味があれば参加してみてください。

次回は、2017年 03月 09日から 03月 12日までです。
- [AsiaBSDCon 2017 will be held on March 9-12, 2017 in Tokyo, the same venue as 2016's.  CFP will be announced soon.](https://twitter.com/asiabsdcon/status/796830983320268801)
Bio.Phyloのdraw_ascii関数で描いた系統樹をテキスト形式で保存する

Biopython のdraw_ascii関数で得られる系統樹が戻り値ではなく標準出力だったのでそれをテキスト形式で保存する方法についてメモ．

```py
from Bio import Phylo
import sys

f = open("output.txt","w")
sys.stdout = f

tree = Phylo.read("****.dnd", "newick")
Phylo.draw_ascii(tree)

sys.stdout.close()
```

<img width="615" alt="スクリーンショット 2016-12-08 1.06.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/133375/802af70a-d971-81ec-dae9-8670407e2411.png">


アスキーアートで描かれた系統樹を保存する利点が特に思いつかないけど...
プッシュ通知の実装

タイトルにもある通り、スマホアプリのプッシュ通知許諾を得るためのダイアログを、任意のタイミングで表示するための実装方法を書いていきます。


# プッシュ通知配信許諾までの流れ
プッシュ通知を配信の許諾を得るまでの流れは大きく分けると下記の通り。

- プッシュ通知のアクションを設定する
- プッシュ通知配信許諾ダイアログを表示してUIApplicationにプッシュ通知設定をした引数を渡す
- 登録したプッシュ通知の設定内容をAPNsサーバーに送信
- デバイストークン登録可否のレスポンスを受け取る(Reoro導入の場合SDKへデバイストークンを登録)

実装自体はすごく簡単なので、つらつらと必要なところだけ書いていきます。
  
  
# 実装
プッシュ通知のアクションに設定できるプロパティはいくつかありますが、今回はシンプルに `alert` と `badge` `sound`　のみを設定します。

```
//プッシュ通知のアクションを設定する
let settings:UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)

//iOS10では非推奨。UNNotificationSettingsを使用するようにとWarningがでる。これは追い追い手が空いた時にでも調べます。

//プッシュ通知配信のダイアログを表示(UIApplicationの引数に"settings"を渡す)
UIApplication.shared.registerUserNotificationSettings(settings)

//"settings"で設定した内容をAPNsサーバーに登録する
UIApplication.shared.registerForRemoteNotifications()
```


# デバイストークン登録可否の確認
プッシュ通知の許諾ダイアログを表示後にAPNsサーバーに送った結果、デバイストークンの登録ができたかどうかが、Delegateファイルに返ってきます。

```
func application(application: UIApplication!, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) {
    // プッシュ通知が利用可能であればdeviceTokenが取得できる
    NSLog("Device Token: " + "\(deviceToken)")
}

func application(application: UIApplication!, didFailToRegisterForRemoteNotificationsWithError error: NSError!) {
    // プッシュ通知が利用不可であればerrorが返ってくる
    NSLog("error: " + "\(error)")
}
```

# versionによるプッシュ通知の設定と取得できる値の違い
- 設定: iOS7以下ではpush通知を有効にするタイミングで設定を送信
- 設定: iOS8以降ではpush通知を有効にするタイミングとは別に設定を送信
- 値取得: iOS7~9のversionではプッシュ通知配信可否の値が取得可能
- 値取得: iOS10以降からプッシュ通知配信可否以外の設定値も取得可能

# iOS9以前のversionでのプッシュ通知の配信可否の取得メソッド
```
func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
        if notificationSettings.types == .none {
            print("通知を不許可")
        } else {
            //.badge / .sound / .alert
            print("通知を許可")
        }
    }
```

# iOS10以降で取得できるプッシュ通知の設定値
- 「通知を許可」の可否
- 「通知センターに表示」の有無
- 「Appアイコンにバッジを表示」の有無
- 「ロック画面に表示」の有無
- 「通知スタイル」の種類
- サウンドの可否
- バッジの可否
- アラートの可否

[取得メソッドの参照記事](http://qiita.com/eKushida/items/7d456258f8f8d19a2f1d#1-%E9%80%9A%E7%9F%A5%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%AE%E5%8F%AF%E5%90%A6)


以上僕が現時点で理解した内容ですが、間違っているところなどありましたらコメントいただけると嬉しいです。

ではでは。
Dvorakのその先へ（その1）

この投稿は :calendar: [ErgoDox Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ergodox) の 8日目の記事です。

----

ErgoDoxキーボードについての[概要](http://qiita.com/miyaoka/items/3fb5245262f7883dc76d)や、[周辺キー](http://qiita.com/miyaoka/items/36301f1f451364f6b7a1)の話から、いよいよ文字配列をいじっていく話に入ります。

まず始めに断っておきたいのですが、文字配列についての話なので厳密にはErgoDoxに限りません。ですが実際に自分が文字配列までいじりたいと思ったのは、ErgoDoxのカスタマイズ性の高さや、格子配列だから考えやすかったことなどによるものです。周辺キーも含めて自分に合う配列を追求していった結果、いじらざるを得なかったのです。

またこれは、**即座に実務的な効率を求める**というよりは、キーボードの効率、タイピングの良さとはなんぞやという興味で研究している話になります。これまでに数ヶ月費やしてきた

- 配列を変更する時間 :skull:
- 試す時間 :skull:
- 練習する時間 :skull:
- 考え直してまた変更する時間 :skull:
- そして毎回初心者レベルにリセットされてしまうタイピングスピード :skull::skull::skull::skull::skull:

など、**どう考えても効率的では無いです**。

上記のサイクルを積み重ねて日々試行錯誤を続けていますが、まだ日が浅くて従来のタイピングスピードにもなっていません。将来的にはきっと従来以上になるんだという期待だけがあるような状況です。

そんな話でも良ければ聞いてください。

# まず、どんな状況か

![keyboard-layout.png](https://qiita-image-store.s3.amazonaws.com/0/117743/55237ae4-9164-e3b8-b97c-f6b4e9d7228b.png)

とりあえず最新版の配列を図示するとこんな感じです。
Dvorakから入って、いろいろあって、いろいろになりました。
では順を追って話していきましょう。

# なぜ配列を変えるのか

- QWERTY配列に満足行かなくなった
- キーの依存性の高さが低まってきた
- ErgoDox界は変えている人が多い
- もっとキーボードのことを根源的に知りたい
- なんでもいいからカスタムしたい
- たのしい

このあたりが自分にとっての理由です。

## QWERTY配列に満足行かなくなった

よく言われるアレですね。後述の漫画を読んで下さい。

## キーの依存性の高さの変遷

タイプライター時代： 物理的にタイプバーと直結
↓ 電子化
計算機時代： 計算機環境ごとに専用キーボード
↓ 汎用キーボード
PC時代： キーボードごとに専用ファームウェア
↓ ErgoDox

時代を経て依存性が薄まり、ErgoDoxでついにキーボードが民主化されたような気がしたので。

## ErgoDox界は変えている人が多い

海外勢のブログとかキー設定を見てるとだいたいカスタムしてる気がします

## 知りたい

知りたいですよね

## カスタムしたい

したいですよね

## たのしい

たのしいですよね

# どう変えるのか

結論から言えば、**だいたいはDvorakで良い**と思います。

よく分かるDvorakまんががあるので読みましょう。
[DVzine.org - The Dvorak Zine](http://www.dvzine.org/)

![vm3c5vY.png](https://qiita-image-store.s3.amazonaws.com/0/117743/8d40cf60-5eb8-c4d3-a4c8-c762ac92d0ad.png)

序盤はQWERTY配列を作ったショールズさんへのDISが続きますが、ショールズさん自身も改良版を提案していたりします。

![P9dOZSF.jpg](https://qiita-image-store.s3.amazonaws.com/0/117743/ce90745a-1381-f58a-8c29-029aaa026111.jpeg)

こちらがそのパテントの記録です。[US568630A - Google Patents'](https://patents.google.com/patent/US568630A)
母音が中段片側に集められている配列で、ほぼDvorak的な特徴が見えます。
Dvorakの登場は1930年代ですが、こちらは1896年です。理想のタイピングにとって何が良くて何が悪いのかこの時点でもうだいたい分かってたんだと思います。

![rtCcEkb.png](https://qiita-image-store.s3.amazonaws.com/0/117743/933537e8-43df-a5ab-f723-0e0200565009.png)

**「ホーム行にセミコロンがあるなんてとんでもない！」**
…なんて言われてもたぶん多くの人は意識したことも無いと思います。
ですが、配列をいじるとまず例外無く変更する部分なのでこの驚きっぷりには共感してしまいます。

![05wz2l3.png](https://qiita-image-store.s3.amazonaws.com/0/117743/fc435db3-a5e8-90d3-25a6-be84a8fec107.png)

Dvorak信者の笑顔が素敵です。

![B4WFSti.png](https://qiita-image-store.s3.amazonaws.com/0/117743/8c5eab52-76d4-2024-9789-2ea1df1fc7a0.png)

でも人類に受け入れられず、ドヴォさん呪詛吐いて死にました。:skull: 
ErgoDoxが普及した今こそ人類の進化が求められているのです。
立ち上がりましょう。

# とはいえ

結局Dvorakではなくさらに変えていくことになりました。
そのへんの話は後の記事に続きます。
スクラムマスタとプロダクトオーナーと周りを巻き込む力

Advent CalenderでURLを書かずにタイトルを変更するって言うことが出来なくて、中途半端になってしまいました。
すみません。

そんなこんなで内容を更新したいと思います。

## 開発チームとの関係

スクラムマスタは基本的にチームの味方です。
チームの問題に対して、それを解消するための色々な雑多なこともこなします。
もちろん技術的な問題はチームが対応します。

プロダクトオーナーはチームの味方ではありません。
ただ敵でもありません。協力して良いものは作りますが、ビジネス側とのバランスを取る中立的な立ち位置です。

## スクラムマスタからの巻き込み方

スクラムマスタはチームの改善活動です。
チームと信頼関係を作る必要があります。
一人一人のメンバーをチーム活動に巻き込む仕組みづくりが必要になります。
また、チームがよりよい活動が出来るための通訳をプロダクトオーナーに行います。
プロダクトオーナーがカバーしきれない範囲の決済者などの協力はスクラムマスタもしていかなければなりません。

例を挙げると、より開発効率を上げるためのIDEやプロジェクト管理ツール、カンバンツール、ドキュメント管理ツールなどは有料のものもあります。予算を取る、承認を得る作業というものはなかなか面倒なものです。
ただ、これがないことによってチームの開発効率が上がらないのであれば、それは開発における障害であり、スクラムマスタは真っ先に対応する必要があります。

では、この決済者を巻き込むために何が出来ればよいのか？
一番重要なのはチームがこの決済者の信頼を得ることです。信頼があれば一言で承認が降りるでしょう。
信頼がなければ、必要な理由と競合の比較とプレゼンを行い、資料にまとめた上で役員の決済も必要になるかもしれません。
つまりスクラムマスタはチームの信頼を得るための仕組みを考え、普段から巻き込む必要があるのです。
開発チーム状態、雰囲気の見える化、進捗や生み出した価値のリスト化など、伝わる形にしておくことが必要かもしれません。

ここでは決済者だけですが、ステークホルダーは他にも居るので沢山の人がチームを見えるようにしましょう。


## プロダクトオーナーの巻き込み方

プロダクトオーナーはビジネスと開発の繋がる位置に最初から立っています。
ビジネス側との繋がりも強いため、開発チームだけではなくクライアントやユーザなどの巻き込み力が問われます。

開発チームの巻き込み方は以前の記事にも書いたとおり、ビジョンの共有が一番強力だと思います。
プロダクトとして実現したいこと、この開発する機能の価値。それを熱く語れることです。

そしてビジネスサイド、営業サイドの巻き込み方です。
プロダクトオーナーはプロジェクトマネージャとは別の人間になることがあります。
予算とスケジュールを持たないまま作るものを定義し直していくこともあります。

これらの人にはスケジュールと数字、市場の事例などでプロダクトの開発しているものを語れる必要があるでしょう。
また、これらの人たちは開発意識が低いため、定例の打ち合わせや相手が顧客などの場合も定例化したり、ヒアリングから開発したものをフィードバックするなど、参加している意識を増やすための情報をシェアしましょう。

なによりステークホルダーが誰なのかを把握する能力が必要です。



## それぞれの役割を理解すること

一人で開発をしてものを作ることは出来ません。
そのために役割を分けてプロジェクトを進めていきます。
スクラムマスタやプロダクトオーナーは各役割をつなぐ重要なポジションです。
本に書いてあるとおりのプラクティスを全てこなしてもうまく行きません。

うまいサイクルを回すためには糊のような動きをすることです。
情報をうまく流通させ、情報のボトルネックになっていることを拾い上げる役割が必要になります。


情報流通をするためにはどうすればよいか考えてみましょう。
プロダクトオーナーに必要な知識と手法

今日はスクラム開発の中の役割のプロダクトオーナーについて語ってみようと思います。

プロダクトオーナーはマネージャではありません。

スケジュールも考えますが、製品の品質として
必要な機能や重要な機能を定義すること
不要な機能や利用頻度の低い機能を開発させないこと
が重要なミッションです。

一番やってはいけないのはどの機能も重要という結論です。
これはどれも重要ではないと言っているのと同じです。
必ず開発する機能は１から順番に優先順をつけることが必要です。
これがなかなか難しく、かなり情報が必要で、判断と決断を何度も迫られる作業です。
開発チームはこの順番通りの開発を行います。
重要でない機能が順番の後になるはずなので、スケジュールどおり行かなくても影響が少ないはずです。
もし、他に大きな影響を与えてしまう遅延が起きてしまったら、それはプロダクトオーナーの責任も大きいです。


そして、もっとも重要なものはプロダクトのビジョンを描くことです。
プロダクトの将来像、理想像、こうなったら市場はこう変わる！ユーザはこんな風に喜んでくれる！
そうやって楽しそうに語る姿を見るからこそ、それを実現するために開発チームはモチベーション高く開発ができます。


## 必要な機能って何でしょうか？

ユーザやクライアントの要望が多いものは可能性が高いです。
ですが、全ての機能を作っていては開発リソースはとても足りません。
リソースが足りれば開発してよいのでしょうか？
いいえ。多機能なシステムはそのシステムの職人のような人が居なければ使いこなせないものになってしまいます。


必要な機能とはシンプルでユーザが間違うことなくシステムの意義や意図を理解して使うことが出来るシステムです。

そのためには一部のユーザの言うことを聞くのではなく、大多数のユーザが満足するシステムを作る必要があります。


## 必要な知識

まずはユーザの声です。ユーザの声も重要な情報の１つです。プロダクトオーナーは開発チームの中に閉じこもっていてはいけません。

次に市場です。現在の市場の状況はもちろん、半年後、１年後、将来、どのような変化が起きるのかをイメージするだけの知識が必要です。

これは細かく理解する必要はないですが会計の知識も必要です、市場の変化を見るときのキャッシュフローと心理の関わりや開発チームのリソースとプロダクトの作れるものの限界を理解しながら、そのコストの中で最大の価値を生む機能は何なのかを考える必要があります。壮大な開発項目を作ってもお金が足りずに機能として稼働できない途中のものが出来てもプロダクトとしては価値を生みません。コストとリソースのバランスを見ながら作るべきものを定義する必要があります。


そして、プロダクトのビジョンを開発チームに正しく伝えるための知識が必要になります。どんなにプロダクトの将来ビジョンを正しく伝えることが出来なければ良いものは出来ませんし、開発チームに描いた夢を実現させようという気持ちが乗ることはありません。


## プロダクトオーナーの手法

#### アイデアの手法
- ブレインストーミング
- シックスハット法
- オズボーンのチェックリスト
- KJ法
- マンダラート
- なぜなぜ法 (なぜを繰り返して深く考える)

#### リサーチ分析 

- カスタマージャーニーマップ
- ユーザエクスペリエンスマップ
- ロジカルシンキング
- マインドマップ
- メンタルモデルダイアグラム

#### 伝える手法
- グラフィカルファシリテーション
- 伝え方言い方
- プレゼンテーションの手法 話すスピード 高橋メソッドなど
- コーチング


#### 伝わるUI/UX (デザイナほどではないが使われ方を知っておく)
- 色の表現と特徴
- レイアウトと人の視線
- 伝わるコピー
- デザインの流行り (マテリアルデザイン、フラットマップ）
- 人を引きつける物の動き


## プロダクトオーナーとは

プロダクトオーナーは広い知識と情報収集に関する手法やアンテナが必要であり、それを分析し、実現するための方法論を学び、現実のコストやリソースと闘い調整する方法が必要です。
プロダクトオーナーは何の権限もなく、作るのは全て開発チームです。イメージしたプロダクトをうまく実現するために、正しく伝えるための方法を沢山知っていなければなりません。
そして、何が良いものか、悪いものかを見極める感性が必要です。
開発チームのように技術に深く知識を必要しないかわりに、広い知識が必要なのです。
**決して思いつきのアイデアを言うだけの役割ではありません！**


スクラム認定の講師の中には複数人のプロダクトオーナーが必要だという人も居るくらいです。
カスタマージャーニーマップなどをちゃんと作る時間があるでしょうか？
国内、海外の競合の情報を常に集め、機能を比較しているでしょうか？
常に市場に合わせたプロダクトの機能の優先順を定義できているでしょうか？
常にプロダクトのインパクトのある価値のアイデアを考えているでしょうか？
考えたアイデアを分析して、よりよい実現方法、タイミングを考えているでしょうか？
確かに、片手間では務まらないかもしれません。


プロダクト開発の中で兼務にしてしまうと、残念ながら手を抜いても開発が進めることが出来てしまうものが多いのです。
しかし、問題があった時に作った後に気がついてもダメージが最も大きいものでもあります。

- 作った機能は競合に存在して、競合の機能のほうがいいものだった。
- ニーズがなく市場で使われないものだった。
- ユーザが非常に使いにくい機能だった。

失敗したときにはとても取り返しが付かないものばかりです。


何かを開発している場合には、あらためてプロダクトオーナーの役割を定義してみてはどうでしょうか。
Docker alpineでGoプログラムを動かした時のメモ

#概要
研究室で作っているDockerコンテナを軽量化しようとalpineのコンテナを使用したい。そして、最近はやっている（先輩は反対しているが）Go言語を用いてウェブからのリクエストを処理したいと思ってやった。
いろいろ問題が発生したので、やったことと学んだことのメモ
#やりたいこと
ウェブページから投げられたリクエストをDockerのコンテナが受け取って、いい感じに処理して結果を返すと言った内容。そして、コンテナの容量はできるかぎり小さくすることが目的。個人的に勝手に立てた目標としては、１００MB以下にすることです！徹底的に贅肉を減らしたい！
#方法
悩んだ原因をはじめ、解決したところまでゆっくりと書いていきます。

##開発環境
使用した端末：MacBook Air(Early 2015)
OS: OS X Capitan (バージョン　10.11.6）
メモリ： 8GB
Dockerの利用方法：[Docker for mac](https://docs.docker.com/docker-for-mac/)(Version 1.12.3 Channel: Stable)

##間違っていたときの方法
Mac OS上でGoファイルを下記のコマンドでビルドする。

```
$go build hoge.go
```
実行ファイルが完成！
ひとまず実行してみて、いい感じに動作する。
次にDockerコンテナで実行できるか試してみた。Dockerfileは下記のようにした。
さてうまくいくのか！？

```
FROM alpine:3.4

WORKDIR /app
COPY hoge /app

EXPOSE 8000

CMD ["./hoge"]
```
安心してください。
必ずエラーになります！

###エラーの原因
ビルドで生成されたファイルは、Mac OSのためのバイナリーファイル。
したがって、alpine(Linux)では動作できません。

##Golangが使えるDocker alpineを利用してみる
結論から言えば、回り道をしていますが、実際にやったことなので書きます。
当時の私は、実行できない原因が理解できていなかったので、ひとまずGolangが使えるコンテナに逃げました。
Docker fileは下記の感じに作成

```
FROM golang:alpine

WORKDIR /app
COPY hoge.go /app

EXPOSE 8000

CMD ["go","run","hoge.go"]
```
実行も上手くできました。
まあ、goが使えるコンテナですからね。go runが利用できないことはないはず（ソースコードが正しければ）

###デメリット
単純に容量が大きい！
単に[alpine](https://hub.docker.com/_/alpine/)のコンテナだと５MB程度に対して、[golang:alpine](https://hub.docker.com/_/golang/)は240MBほどある！
およそ50倍ですよ！
まあ、goが入っているので、重くなるのはしょうがない
しかし、１００MB以下に抑える目標に反するので、別の方法にしましょう！

```
$docker images
golang              alpine              016944b25311        5 days ago          241.1 MB
alpine              3.4                 baa5d63471ea        7 weeks ago         4.803 MB
```
##ちなみにメリット
goが入っている＝OSやアーキテクチャに関係なく使用できる
ビルドする場合は、利用する環境に応じてビルドする必要がある。
しかし、goが備わっているコンテナのため、go run で起動できるので、融通が効くのがGood
ハード面で複数のOSやアーキテクチャを利用している場合は、こっちのほうが良いかもね！

##きちんとビルドしてコンテナで利用
きちんとビルドする＝利用するOS、アーキテクチャに合わせてビルドする事です
シンプルな解答ですが、何故か私はこのことを忘れていました。
まずは、正しいビルドを下記に示しておきます。

```
$ GOOS=linux GOARCH=amd64 go build hoge.go
```
OSとアーキテクチャをきちんとしましょう！
確認ですが、alpineは言わずと知れたLinuxです。
そして、私のPCのアーキテクチャはx86_64です。
したがって、GOOSとGOARCHの変数に、あのように書けばきちんとビルドしてくれます。（なんと便利！！）
指定している GOOSやGOARCHについては、[公式サイト](https://golang.org/doc/install/source#environment)を参考にしてください。
次にコンテナに載せるためのDockerfileは、次のように書いて

```
FROM alpine:3.4

WORKDIR /app
COPY hoge /app

EXPOSE 8000

CMD ["./hoge"]
```
きちんと動作してくれました！
コンテナの容量も、ビルドしたバイナリーファイル(2MB程度）が増えただけなので、目標の100MB以下を達成

このコンテナの注意点として、コンテナを動作する環境（アーキテクチャ）を確認しないと動作しない可能性があります。
ハードの交換を行う際は、きちんと確認してから運用するように研究室の運用マニュアルに記載しておきます。
pryでReadlineがないエラーの解決方法

# 環境
mac OS X El Capitan バージョン10.11.6
rbenv
ruby 2.3.1

# エラー内容
pryを実行しようとしたら突然以下の様なエラーが出た。

```
$ pry
Sorry, you can't use byebug without Readline. To solve this, you need to
rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get install libreadline-dev` and then reinstall your Ruby.
.....
/Users/XXXXX/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': dlopen(/Users/XXXXX/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib (LoadError)
  Referenced from: /Users/XXXXX/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle
  Reason: image not found - /Users/XXXXX/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle
```

# 解決方法
以下のコマンド実行で解決した。

```bash
ln -s /usr/local/opt/readline/lib/libreadline.dylib /usr/local/opt/readline/lib/libreadline.6.dylib
```

# 原因（と思われるもの）
`brew udpate` で readlineが何かアップデートされたのが原因かもしれない。
`/usr/local/opt/readline/lib/libreadline.6.dylib`が削除されていた。
上記コマンドでsymlinkを作成したことによって解決したと思われる。

```bash
$ ll /usr/local/opt/readline/lib/
total 1376
drwxr-xr-x 11 XXXXX admin    374 12  8 00:15 .
drwxr-xr-x 12 XXXXX admin    408 12  5 17:26 ..
-r--r--r--  1 XXXXX admin  84728 12  5 17:26 libhistory.7.0.dylib
lrwxr-xr-x  1 XXXXX admin     20  9  8 06:16 libhistory.7.dylib -> libhistory.7.0.dylib
-r--r--r--  1 XXXXX admin  84504  9  8 06:16 libhistory.a
lrwxr-xr-x  1 XXXXX admin     20  9  8 06:16 libhistory.dylib -> libhistory.7.0.dylib
lrwxr-xr-x  1 XXXXX admin     45 12  8 00:15 libreadline.6.dylib -> /usr/local/opt/readline/lib/libreadline.dylib
-r--r--r--  1 XXXXX admin 459608 12  5 17:26 libreadline.7.0.dylib
lrwxr-xr-x  1 XXXXX admin     21  9  8 06:16 libreadline.7.dylib -> libreadline.7.0.dylib
-r--r--r--  1 XXXXX admin 751552  9  8 06:16 libreadline.a
lrwxr-xr-x  1 XXXXX admin     21  9  8 06:16 libreadline.dylib -> libreadline.7.0.dylib
```

cf)["Sorry, you can't use byebug without Readline" · Issue #289 · deivid-rodriguez/byebug](https://github.com/deivid-rodriguez/byebug/issues/289)