OmniAICreator/Qiita-1.07M huggingface dataset:
UtilReadCoordinate.py > v0.1 > read coordinates of dipoles

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

### About

To read dipole coordinate file produced using [this code](http://qiita.com/7of9/items/183d1d9a2b5ab0944689).

### codev v0.1

```UtilReadCoordinate.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
import array
import sys

'''
v0.1 Apr. 09, 2017
   - add read_coordinate_file()
   - add wrap_fromfile()
'''

# codingrule:PEP8
# on Python 2.7.6


#np.set_printoptions(precision=6)


def wrap_fromfile(rfp, typecode, num):
    res = array.array(typecode)
    res.fromfile(rfp, num)
    return res


def debug_group_print(local_nvoid_Ndip, coord):
    print(local_nvoid_Ndip)
    for idx in range(10):
        print('%.5f,%.5f,%.5f' %
              (coord[idx*3], coord[idx*3+1], coord[idx*3+2]))


def read_coordinate_file(crdFilename, debugPrint=False):
    if debugPrint:
        print(crdFilename)

    with open(crdFilename, "rb") as crdfp:
        local_nvoid_Ndip = wrap_fromfile(crdfp, 'i', num=1)
        coord = wrap_fromfile(crdfp, 'd', num=local_nvoid_Ndip[0]*3)

    if debugPrint:
        print(local_nvoid_Ndip)
        for idx in range(10):
            print('%.5f,%.5f,%.5f' %
                  (coord[idx*3], coord[idx*3+1], coord[idx*3+2]))

    return local_nvoid_Ndip[0], coord


if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)

    if (argc < 2):
        print("ERROR: chpoint file is not specified\r\n")
        print("   [cmd] [coordinate file] \r\n")
        sys.exit()

    res = read_coordinate_file(argvs[1], debugPrint=False)
    local_nvoid_Ndip, coord = res
    #
    debug_group_print(local_nvoid_Ndip, coord)
```

```txt:run
$ python UtilReadCoordinate.py coord.0 
9328
-0.20944,-1.46608,-5.23599
0.20944,-1.46608,-5.23599
-1.04720,-1.04720,-5.23599
-0.62832,-1.04720,-5.23599
-0.20944,-1.04720,-5.23599
0.20944,-1.04720,-5.23599
0.62832,-1.04720,-5.23599
1.04720,-1.04720,-5.23599
-1.04720,-0.62832,-5.23599
-0.62832,-0.62832,-5.23599
```
技術英語 > what lies beyond / a brilliant beyond brilliant idea

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 41 / 12833)

> You see where to put code and data, get data in and out, handle options, tour the Python Standard Library, and take a glance at **what lies beyond**.

what lies beyond
https://eow.alc.co.jp/search?q=lie+beyond
> ～の向こうにある、～より先に待ち受けている

<hr>
関連して思い出した

> I have **a brilliant beyond brilliant idea**!

http://www.quotes.net/mquote/71686

brilliant を超えた brilliant な

意訳1「めちゃすごい考え」
意訳2「なまらすごい考え（奈良）」
意訳3「らずもねしったげ考え（岩手＋秋田）」

[「すごい」を意味する方言が、全国47都道府県で全部違っててすごい](http://jimococo.mag2.com/zenkoku/12310)
見積もりの重要性2

先日に引き続き、過去のイベントで使用した資料をslideshareにアップしました。

https://www.slideshare.net/MasashiNamba/2-74746967
![IMG_0156.JPG](https://qiita-image-store.s3.amazonaws.com/0/23404/09324f5e-7d9e-0d9f-520d-f64ad2bee96d.jpeg)

WBS作成の概論的な内容になってます。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/23404/18d5db5b-b4c3-2f80-70de-fd4826c8b7f0.jpeg)

次回分は来週以降にアップ予定です。
Reduxの基本的な仕組み

# Reduxとは？

Reduxは状態を一元管理してくれるやつ。Reactはそもそも状態を管理しやすくなるようにしているので、いつでも使う必要はない。一元管理したくなったら使う。[ドキュメント](http://redux.js.org/)には大量の説明とチュートリアルやサンプルがある。

# Reduxの仕組み

Reduxは状態（state）を一つのstoreに保存し一元管理します。`createStore()`でstoreがつくれます。`createStore()`には引数としてリデューサー(reducer)というのを渡します。

```
let store = createStore(reducer)
```

reducerとういのは、各アクションとstateを結びつける関数です。具体的には、現在のstateと、アクションを引数にとり、次のstateを返す関数です。

アクションというのは、stateが変わる要因となるアプリケーション上の挙動です（moneyというstateが100のときに、「お金を10支払った」とういアクションがあれば、moneyは90になるべきです）。具体的には下記のようになります。

```
{ type: 'PAY_MONEY', price: 10 }
```

reducerは、アクションが発生した場合に、どのstateをどのように変化させるかを規定する関数です。また、reducerには、stateの初期値も登録します。

```
const iniState = {
  money: 100
}
function reducer(state = iniState, action) {
  switch(action.type) {
    case 'PAY_MONEY':
      return Object.assign({}, state, {
        money: state.money - action.price
      })
    default:
      return state
  }
}
```

このreducerをstoreに渡すことで、storeは、全てのstateとその初期値と、発生しうるアクションと、アクションがあった場合のstateの変化のさせ方を知ります。

状態の取得や、状態の変化のさせ方は、それぞれstoreに対して、`store.subscribe()`と、`store.dispatch()`を使います。

`store.subscribe()`は、アクションがディスパッチされたときに呼び出される関数です。`store.subscribe()`の中で、`store.getState()`を使うことで、現状のstateを取得できます。store.subscribe()の戻り値は、subscribeの解除関数です。

```
store.subscribe(() => console.log(store.getState()))
```

`store.dispatch()`は状態を変化させたいときに使い、引数にアクションを渡します。

```
store.dispatch({ type: 'PAY_MONEY', price: 10 })
```

実際には、dispacthの引数に直接アクションオブジェクトを渡すのではなく、アクションクリエーター関数を渡します。アクションクリエータ関数は下記のようになります。

```
function payMoney(price) {
  return { type: 'PAY_MONEY', price }
}
```

# Reduxの簡単な例

```redux_sample.js
import { createStore } from 'redux'

//アクションクリエーター
function payMoney(price) {
  return { type: 'PAY_MONEY', price }
}

//Reducer
const iniState = {
  money: 100
}
function reducer(state = iniState, action) {
  switch(action.type) {
    case 'PAY_MONEY':
      return Object.assign({}, state, {
        money: state.money - action.price
      })
    default:
      return state
  }
}

//storeを作成
let store = createStore(reducer)

//subscribe登録
let currentPrice = iniState.money
let unsubscribe = store.subscribe(() => {
  let prevPrice = currentPrice
  currentPrice = store.getState().money
  if(prevPrice !== currentPrice) {
    console.log('changed', prevPrice, 'to', currentPrice)
  } else {
    console.log('no change')
  }
})

//actionをdispatchする
console.log('start pay money')
store.dispatch(payMoney(10))  //100 to 90
store.dispatch(payMoney(20))  //90 to 70
store.dispatch(payMoney(0))   //no change
store.dispatch(payMoney(40))  //70 to 30
let hoge = { type: 'hoge', hoge: 'hoge' }
store.dispatch(hoge)          //no change
store.dispatch(payMoney(10))  //30 to 20

//subscribeを解除
unsubscribe()
console.log('unsubscribed')

store.dispatch(payMoney(10))  //何も表示されない
console.log('finish pay money')
```
Windows版Google Cloud SDKのインストールに失敗する

![image](https://qiita-image-store.s3.amazonaws.com/0/174324/ecf72aa9-a0d8-8811-e682-8f1591ca6bb0.png)
イラッ…

# 原因
ユーザーフォルダが日本語文字を含む場合、インストール用のバッチファイルの途中でその日本語部分が文字化けを起こしてインストーラが落ちるようです。

# 回避方法

インストールフォルダ内にある`Cloud SDK\google-cloud-sdk\install.bat`を開き、36行目くらいにある'SET CLOUDSDK_PYTHON=%%i'の1行上に、'echo %%i'を入れます。

```bat
echo %%i
SET CLOUDSDK_PYTHON=%%i
```

直したら、install.batを実行します。
私の環境では、これで化けたユーザーフォルダが表示されましたので、テキストファイルにコピペして文字化け部分を修正し、`SET CLOUDSDK_PYTHON=%%i`の`%%i`の部分にべた書き。Forで何か回してるので、本来これだと不十分なんですが、私の環境ではループが1回だったのでこれでゴリ押します。

```bat
    echo %%i
    rem SET CLOUDSDK_PYTHON=%%i
    SET CLOUDSDK_PYTHON="c:\users\〇〇\appdata\local\temp\tmp2wbol7\python\python.exe"
```

これでとりあえずインストールは行けるはず。
私の環境では、インストール完了後に`Cloud SDK\google-cloud-sdk\bin`へのパスを書いてくれなかったので、そこは諦めて自分で登録しました。

# おわりに
日本語のユーザー名なんて二度とつけない。本当に。

## 追記
結局、`gcloud init`がうまくいかないんでこれだとダメでした。
諦めて、後日時間を見つけてユーザー名を半角に変更します。。
2つのブランチ間でmergeした場合の状態遷移について整理

merge commitやらFastFowardやらマージについてある程度理解できてきたので、図を混ぜつつ自分なりに整理してみようと思います。

## 検証

### 初期登録

テストリポジトリを作成して、ファイルの初期登録を行います。

```bash
$ mkdir test;cd $_
$ git init
$ echo 'aaa' > a.txt;echo 'bbb' > b.txt
$ git add .
$ git commit -m 'init'
```

#### `master`のファイル内容

```text:a.txt
aaa
```

```text:b.txt
bbb
```

#### git log

```bash
$ git log master --oneline
c06bbc0 init
```

![git merge_1.png](https://qiita-image-store.s3.amazonaws.com/0/154029/9cc6ff90-28dc-c028-1554-4671576f3273.png)

### `dev`ブランチを作成して`dev`にcommit

```bash
$ git checkout -b dev
$ echo 'devブランチで修正' >> b.txt
$ git add .
$ git commit -m 'update b.txt'
```

#### `dev`のファイル内容

```text:a.txt
aaa
```

```text:b.txt
bbb
devブランチで修正
```

#### git log

```bash
$ git log master --oneline
c06bbc0 init

$ git log dev --oneline
531732d update b.txt
c06bbc0 init
```

![git merge_2.png](https://qiita-image-store.s3.amazonaws.com/0/154029/a064b3b1-7c74-98a8-fae9-ad191ea06aa8.png)


### `master`にcommit

```bash
$ git checkout master
$ echo 'masterブランチで修正' >> a.txt
$ git add .
$ git commit -m 'update a.txt'
```

#### `master`のファイル内容

```text:a.txt
aaa
masterブランチで修正
```

```text:b.txt
bbb
```

#### git log

```bash
$ git log master --oneline
17f9c80 update a.txt
c06bbc0 init

$ git log dev --oneline
531732d update b.txt
c06bbc0 init
```


![git merge_3.png](https://qiita-image-store.s3.amazonaws.com/0/154029/7610b317-cacc-5661-7d6e-5cb45ae108cb.png)


### `dev`に`master`の内容をmerge


```bash
$ git checkout dev
$ git merge master
### Fast-Forwad出来ないので適当なコミットコメント設定
$ git add .
$ git commit -m 'update a.txt'
```

#### `dev`のファイル内容

```text:a.txt
aaa
masterブランチで修正
```

```text:b.txt
bbb
devブランチで修正
```

#### git log

```bash
$ git log master --oneline
17f9c80 update a.txt
c06bbc0 init

$ git log dev --oneline
b2a61a2 Merge branch 'master' into dev
17f9c80 update a.txt
531732d update b.txt
c06bbc0 init
```

![git merge_4.png](https://qiita-image-store.s3.amazonaws.com/0/154029/fb1e7ba3-61e6-b049-f334-47e0c447581c.png)


### `dev`にcommit

```bash
$ echo 'ccc' >> c.txt
$ git add .
$ git commit -m 'add c.txt'
```

#### `dev`のファイル内容

```text:a.txt
aaa
masterブランチで修正
```

```text:b.txt
bbb
devブランチで修正
```

```text:c.txt
ccc
```

#### git log

```bash
$ git log master --oneline
17f9c80 update a.txt
c06bbc0 init

$ git log dev --oneline
576d44b add c.txt
b2a61a2 Merge branch 'master' into dev
17f9c80 update a.txt
531732d update b.txt
c06bbc0 init
```

![git merge_5.png](https://qiita-image-store.s3.amazonaws.com/0/154029/9342d0c0-6c41-e125-db2d-9ce08aac37b3.png)


### `master`に`dev`の内容をmerge

```bash
$ git checkout master
$ git merge dev
```

#### `master`のファイル内容

```text:a.txt
aaa
masterブランチで修正
```

```text:b.txt
bbb
devブランチで修正
```

```text:c.txt
ccc
```

#### git log

```bash
$ git log master --oneline
576d44b add c.txt
b2a61a2 Merge branch 'master' into dev
17f9c80 update a.txt
531732d update b.txt
c06bbc0 init

$ git log dev --oneline
576d44b add c.txt
b2a61a2 Merge branch 'master' into dev
17f9c80 update a.txt
531732d update b.txt
c06bbc0 init
```

![git merge_6.png](https://qiita-image-store.s3.amazonaws.com/0/154029/f4f9bf7e-b86a-902e-68e6-d3f25b89278c.png)


以上。
Atomでショートカットを使って現在のディレクトリに新しいファイルを追加したい

## やりたいこと

Atomでは `cmd+n` で新しいファイルを作成するけれども、そうして出来たファイルは未保存で、 保存時に保存先を選んでやらないといけない。

<img src="https://qiita-image-store.s3.amazonaws.com/0/26921/401dd6ec-968f-eb85-8ac0-fe8767903631.png" width="424px" />

これが自分としては不便だった(モデルクラスを複数作る時に、先に空のファイルをmodel/以下にサクサク配置する、みたいなことをしたい。追加→保存→このダイアログで名前と保存先を指定→保存ボタン、というのはサクサク感無くて嫌なのです...)。

## ctrl+o → a のあわせ技があるけれど

ちなみに、 `ctrl+o` でエディタからファイルツリーにフォーカスを移すことができて、ファイルツリー上で `a` を押すとその場に新しいファイルを追加することが出来て便利だ。

だが、 `ctrl+o` を何度か使っているとフォーカスが移らなくなってしまうことが多くあって困る。

あと、ファイルツリーへ移したフォーカスをエディタへ戻すショートカットがわからなくてこれも困る。

## 編集中のファイルと同じディレクトリに新しいファイルを追加するショートカットを設定する

仕方がないのでプラグインでも探そうかと思っていたら、実は現在編集中のファイルと同じディレクトリに新しいファイルを追加することができる機能が存在していて、Keymapを設定してやれば利用することができることがわかった。

<img width="250" alt="スクリーンショット 2017-04-09 3.29.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/250eb0b6-cd10-1071-8d9a-592fb75019a6.png">

```keymap.cson
'atom-workspace':
  'cmd-alt-n': 'tree-view:add-file'
```

この状態↓で( `react-hands-on` プロジェクトの 　`pages/index.js` を編集中) `cmd+alt+n`　を押すと

<img width="410" alt="スクリーンショット 2017-04-09 3.30.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/ac10a539-75ef-193a-5c64-c63186f53975.png">

`pages/` がデフォルトの状態で新しいファイルパス入力画面が現れるので、

<img width="579" alt="スクリーンショット 2017-04-09 3.52.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/1e411fc7-f7ae-90f8-9dca-2f987d1b8ae2.png">

こんな感じ↓でファイル名を入力してやると

<img width="584" alt="スクリーンショット 2017-04-09 3.55.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/57f47b8f-3950-43f1-bc92-00aaac83c00f.png">

こうなる

<img width="204" alt="スクリーンショット 2017-04-09 3.30.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/d04e0c55-8841-af22-0532-416d1892ddbb.png">

※ cmd+alt+nを押した時のディレクトリがパスとして入力された状態でファイルパス入力画面が現れるというだけで、 pages以外のディレクトリにしてやれば他の場所にもファイルを作れる。
[Excel]1万件以上のデータから条件に一致するレコードを爆速で表示する

# やりたいこと
1万件以上のデータから特定の条件に一致するレコードだけを抽出し、別シートに表示したい。

例：下記住所マスタをもとに、

![1.png](https://qiita-image-store.s3.amazonaws.com/0/97601/581d9016-d0e8-8866-83c1-c3082a479f7e.png)

↓あいまい検索の結果を別シートに表示したい。
![やりたいこと.gif](https://qiita-image-store.s3.amazonaws.com/0/97601/f3f43d33-c4f8-f19d-ef35-db2511eabe48.gif)

# まずは結論から
できた。
上のGIFはデータが14万件、表示領域1万件で実際に動かしたものになる。

# ポイント

- 全件チェックするような関数を極力なくす
- 並び順を気にしない。
- VLOOKUPの近似一致が大活躍

### 全件チェックを減らそう
いろんなサイトを拝見し参考にしたが基本的な考え方はどれも同じで

 - 検索に引っかかるレコードに印をつけ、
 - 印をもとにデータをVLOOKUPやINDEX+MATCHで抽出する。

というもの。

自分と同じようなことをしたい方がたくさんいてサンプルは十分だが問題が。

**データ量が多くなると処理が重くなる。**

10万行を超えるとそれが顕著になる。EXCELが応答しなくなることも。
データ件数によって計算量が増えるような関数を使っているっぽい。

例えば、

- レコードに印をつける時にCOUNTIFやCOUNTを使っている。
- 抽出する順番を重視するためにSMAALやLARGEを使っている。
- 配列数式を使っている。

とか

### 速くするための方針
全件チェックするような関数を極力使わなければ速くなるんじゃね？

# 実装した中身
以下、理解しやすいよう式を構造化参照や名前定義で記述する。

### 【データ側】検索に引っかかるレコードをROWで採番しながら印をつける
抽出時の印となるPkeyを住所マスタに追加し、検索の表示対象になる場合はROWで採番する。逆に対象外の場合は空欄""。

```js
=IF(ISERROR(FIND(検索条件_市町村,[@市区町村])),"",ROW())
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/97601/3f79cd8c-4a09-9aa2-9370-c2177c16d362.png)

### 【表示側】印をVLOOKUPの近似一致で見つけ出す。降順になるが気にしてはいけない。
ここが一番のポイント。データには上と下なんかないんだから並び順は気にせずまずは印を集める。
それから好きなように並べる。
印さえ集めればVLOOKUPなりINDEX+MATCHなりで情報を収集すれば終わり。

以下、各項目の式とポイント
![3.png](https://qiita-image-store.s3.amazonaws.com/0/97601/98257d74-77ba-959e-bfec-86cfb7aa4bf0.png)
式
![4.png](https://qiita-image-store.s3.amazonaws.com/0/97601/2a2e4573-f87d-fd61-5bc1-713ca9b347cb.png)



| 項目名 |式 | ポイント |
|---|---|---|
| 抽出件数(WORK項目)| =COUNT(住所マスタ[Pkey]) |        表示する件数を計算しておく。抽出結果が表より大きくなりそうならROWS(検索結果[#データ])とMINを取っておく。|
| 最終行(WORK項目)|=ROW(住所マスタ[#見出し])+ROWS(住所マスタ[#データ]) | 住所マスタの最終行を取得しておく。Pkeyの最初の検索キーになる。|
| No             |  =ROW()-ROW(検索結果[#見出し]) | 無くてもよい。「Pkey降順」に埋め込んでしまえば不要。 1から採番できてればどんな式でもよい、ROW(A1)とかもいける。|
| Pkey降順               |1行目**=VLOOKUP(最終行,住所マスタ[Pkey],1,TRUE)** <BR> n行目以降**=VLOOKUP(*(n-1行のPkey)* - 1,住所マスタ[Pkey],1,TRUE)**|住所マスタのPkeyが昇順で並んでいるためVLOOKUPの近似一致、いわゆるTRUEが使える。<BR>1行目で検索結果の最終レコードを引っ張ってこれる。<BR> 2行目以降の検索キーは「1行上のPkeyから1を引いた値」にする。これでPkeyが降順に並ぶ。<BR> ※1行目の検索キーを「最終行」ではなく9999999のような大きな数字にしておけば実は最終行は要らない。|
| 行 | =MATCH([@Pkey降順],住所マスタ[Pkey],1)|Pkeyが住所マスタの何行目にあるか計算しておく。この値、以下の項目でたくさん使う。|
| 市町村          | =INDEX(住所マスタ[市区町村],[@行])| 行の値をもとに情報を集める。 |
| 町域          | =INDEX(住所マスタ[町域],[@行])| 同様。 |
| 字丁目          | =INDEX(住所マスタ[字丁目],[@行])| 同様。 |
**※本質的な部分だけを表記したため、エラー回避は省略している。**

どうしても昇順で表示したいのならば、Pkey昇順列を追加して`INDEX([Pkey(降順)],抽出件数-[@No]+1)`とか入れれば反対に並ぶ。
もしくはデータ自体を逆順に並べておけばよい。

# これホントに速いの？
雑に計測。
COUNTやSMALLを使ったやり方と比較してみた。

抽出結果最大1万件で選択率10%として計測。

| データ件数       | データ側でCOUNTを使用した場合 | 表示側でSMALLを使用した場合 | 今回のやり方 |
|-----------------|------------------|------------------|------------------|
| 1万 | 0.32秒 | 0.25秒 | 0.23秒 |
| 5万 | 4.66秒 | 2.44秒 | 0.71秒 |
| 10万 | 計測不能 | 21.70秒 | 0.92秒～2.84秒 |

データの偏りによって時間がかかったりかからなかったり。
体感はもっと速い気がする。

# どこまで使えるか。
100万件のデータ、100万件の表示領域、選択率3%と20%で計測してみた。

| 選択率       | 結果 |
|-----------------|------------------|
| 3% | 31.55秒 |
| 20% | 403.50秒 |

処理が終わったことに驚き。
というか、100万件のデータをエクセルでやらせてはいけない。

# しめ
もう少し検証したい。
結果によっては実運用でバリバリ使っていきたい。
[Unity] WaitUntilが常にtrueを返すときに1フレーム待機するか？

#概要
コルーチンの中でWaitUntilを使用するとtrueになるまで待機する。

https://docs.unity3d.com/ScriptReference/WaitUntil.html

常にtrueを返す場合、yield return nullのように1フレーム待機するのか？


#環境
Unity5.5.2p4

#結果
待機する。


#実験内容
Unityのスクリプトリファレンスには以下のように書かれている。

> Supplied delegate will be executed each frame after script MonoBehaviour.Update and before MonoBehaviour.LateUpdate. When the delegate finally evaluates to true, the coroutine will proceed with its execution.

UpdateとLateUpdateの間で実行される。
この間にログを出力して確認する。

```csharp
using UnityEngine;
using System.Collections;

public class TestWaitUntil : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(Loop());
        StartCoroutine(Loop2());
    }

    private void Update()
    {
        Debug.Log("Update()");
    }

    private void LateUpdate()
    {
        Debug.Log("LateUpdate()");
    }

    IEnumerator Loop()
    {
        WaitUntil wait = new WaitUntil(() => { return true; });

        while(true)
        {
            Debug.Log("Loop() Start WaitUntil.");
            yield return wait;
            Debug.Log("Loop() End WaitUntil.");
        }
    }

    IEnumerator Loop2()
    {
        while(true)
        {
            Debug.Log("Loop2() Start.");
            yield return null;
            Debug.Log("Loop2() End.");
        }
    }
}
```

#ログ出力

```
Loop() Start WaitUntil.
Loop2() Start.
Update()
LateUpdate()
Update()
Loop() End WaitUntil.
Loop() Start WaitUntil.
Loop2() End.
Loop2() Start.
LateUpdate()
Update()
Loop() End WaitUntil.
Loop() Start WaitUntil.
Loop2() End.
Loop2() Start.
```

#あとがき
当たり前シリーズです:wink:
yield文があるから待機しますよね。
じゃないと無限ループになっちゃうし。
GitLab8.5以降でraw viewerが動作しない時の対応

## rawが表示されない

なんか最近ファイルをrawで表示すると何も出てこないなーということに気づき、不便だったので調査／対応したメモ。

gitlabのissueにも[いくつか上がっているんだけど](https://gitlab.com/gitlab-org/gitlab-ee/issues/644#note_13643286)、Nginxを独自で設定している時に起こりやすいらしい。
リンクを参考にし、いくつかの設定を試してみたんだけど、最終的には [こちら](https://gitlab.com/gitlab-org/gitlab-recipes/blob/master/web-server/nginx/gitlab-omnibus-ssl-nginx.conf)の設定を試したところうまくいった。  

## 全リクエストをgitlab-workhorseにする

全然知らなかったんだけど、現在はGitLabのエンドポイントに直接アクセスせずに**全てのリクエストをworkhorse経由にする** ものらしい。
これでうまく動くの？と疑ったんだけど、結果的に問題なく動作しているのでこのまましばらく動かしてみる。
cuda7.0 Ubuntu14.04にcutorchを入れる

Cuda7.0の入ったUbuntu(14.04)にTorch7およびcutorchを入れようとして手こずったのでメモを残しておきます。

Torchにおける基本的なpackageの入れ方
`luarocks install packagename`
cutorchを入れるためには、
`luarocks install cutorch`
これでよいはずなのですが、ビルドエラーが出てインストールできませんでした。

調べてみると、
https://github.com/torch/cutorch/issues/606
を見つけました。
`git clone https://github.com/NVIDIA/torch-cutorch`
`cmake -E make_directory build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release -DLUALIB= -DLUA_INCDIR="/home/takeichi/Deeplearning/torch/install/include" -DLUA_LIBDIR="/home/takeichi/Deeplearning/torch/install/lib" -DLUADIR="/home/takeichi/Deeplearning/torch/install/lib/luarocks/rocks/paths/scm-1/lua" -DLIBDIR="/home/takeichi/Deeplearning/torch/install/lib/luarocks/rocks/paths/scm-1/lib" -DCMAKE_INSTALL_PREFIX="/home/takeichi/Deeplearning/torch/install/lib/luarocks/rocks/paths/scm-1" && make`
`cd path_to_torch/torch`
`./update.sh`
とすることで、cutorchを入れることができました。
python3 競プロ用memo

# Description
競技プログラミングはじめてみました。基本的な事柄についてのメモです。

# IO
## input
###use `sys`
```py3
import sys
inputs = sys.stdin.readline().split()
```
###use `input()`
```py3
#for multiple inputs
n, m = list(map(int, input().split()))

#when list is needed
x = list(map(int, input().split()))

#define as a function
def read(): return list(map(int, input().split()))
```

# Ideas
## 複数区間の距離の和
複数の点の座標が与えられたとき、任意の2点間を結ぶ線分の長さの総和

```py3
#given list of dots, **SORTED**
x = list(map(int, input().split()))
nx = len(x)
sumx = sum( x[i]*(2*i - nx + 1) for i in range(nx) )
```
`2*i -nx + 1` の部分は、総和の式の中でその点の座標の加算される回数（その点の左にある点の個数と等しい）と、その点の座標が減算される回数（その点の右にある点の個数と等しい）との、の和を求めています。

# Update Log
1. 170409 initial upload
1. 170410 コメントでいただいた内容を反映
重複ファイルをハードリンクに置き換える

`rdfind` コマンドを使うと、簡単に重複ファイルをハードリンクに置き換えられます。
（単に削除したり、 symlink にしたりすることもできます）

たとえば `rsync --link-dest` するつもりだったのに `--link-dest` をつけ忘れていた、といった時には便利でしょう。

# 使い方

- 以下のように実行します

    ```sh
rdfind -makehardlinks true dir
```

- 適用前に確認したいとき

    ```sh
rdfind -makehardlinks true -dryrun true dir
```

- 対象を複数指定することもできます

    ```sh
rdfind -makehardlinks true dir/subdir1 dir/subdir2
```

より詳しい使い方は [Rdfind – redundant data find][1] を参照してください。

[1]: https://rdfind.pauldreik.se/
春、新生活、FizzBuzzをざっくり書いてみた

4月のこの時期、新生活や就職活動などでFizzBuzzを書く機会があるかも?
まぁ[これ](http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm)に端を発してから、ちょっとしたテストに用いられる場合もあったりと、

>1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに｢Fizz｣と、5の倍数のときは｢Buzz｣とプリントし、3と5両方の倍数の場合には｢FizzBuzz｣とプリントすること。

早速ブラウザ上でコードを書いて実行できる[paiza.io](https://paiza.io/projects/new)にて、
使ったことがある言語を選択して書いてみました※。
※3と5両方の倍数の判定は、結果15で割り切れる判定。


```go:Go
package main

import "fmt"

func main(){

  for i := 1; i <= 100; i++ {
    if i%15 == 0 {
        fmt.Println("FizzBuzz")
    } else if i%3 == 0 {
        fmt.Println("Fizz")
    } else if i%5 == 0 {
        fmt.Println("Buzz")
    } else {
        fmt.Println(i)
    }
  }
}
```

```scala:Scala
object Main extends App{
    (1 to 100).map{
        case i if ((i % 15) == 0) =>"FizzBuzz"
        case i if ((i % 3) == 0) => "Fizz"
        case i if ((i % 5) == 0) => "Buzz"
        case i => i
    }.foreach(println(_))
}
```

```php:PHP
<?php

 for ($i=1; $i <= 100; $i++) {
    if (($i % 15) == 0) {
        echo "FizzBuzz";
    } else if (($i % 3) == 0) {
        echo "Fizz";
    } else if (($i % 5) == 0) {
        echo "Buzz";
    } else {
        echo $i;
    }
        echo "\n";
 }
```

```java:Java
public class Main {
    public static void main(String[] args) throws Exception {

      for (int i = 1; i <= 100; i++) {
        if ((i % 15) ==  0) {
          System.out.println("FizzBuzz");
        } else if ((i % 3) ==  0) {
          System.out.println("Fizz");
        } else if ((i % 5) == 0){
          System.out.println("Buzz");
        } else {
          System.out.println(i);
        }
      }

    }
}
```

```ruby:Ruby
for i in 1..100
    
    if i%15 == 0
        puts "FizzBuzz!"
    elsif i%3 == 0
        puts "Fizz!"
    elsif i%5 == 0 
        puts "Buzz!"
    else
        puts i
    end

end
```

erlang,python,c,bash,vba,javascript...時間あるときにupしたい。
他にも色んな書き方あるから、考えて試してみると楽しい。

```go:Go
package main

import "fmt"

func main(){
  
  var output string
  
  for i := 1; i <= 100; i++ {
    output = ""
    if i%3 == 0 {
        output += "Fizz"}
    if i%5 == 0 {
        output += "Buzz"}
    if output == "" {
        fmt.Println(i)
        continue
    }
    fmt.Println(output)
  }
}
```

自分は、go,rubyとそれ以外での書き方である種の傾向があるのがわかってみたり。
また時間を問われない場合は、関数等を定義して書くとよりスマート。
自分は今の会社入るときとか、プロジェクトに参画する前、
商談時にPCドンと置いて書いてみてという機会があったかな。

だいぶ前にブログで紹介されていた [FizzBuzzを使ったプログラミングコンテストの話](http://blog.jnito.com/entry/20111007/1317976730)とか面白かったのも思い出した。
Python pandasでカンマタブ混じりのcsvファイルを読み込み整形する


タブとカンマ混じりのcsvファイルの扱いで苦労したのでそのときの対応をメモ。
csvファイルをテキストエディタで開くと次のようになっていた。

```ruby:txt
0.2,	1.01,	0.60,	-0.68
0.4,	1.00,	0.67,	-0.69
0.6,	1.01,	0.61,	-0.72
```

まずはpandasのread_csvでファイルを読み込む。
ファイル名はsample.csvで同じディレクトリにファイルがあるとする。

```ruby:In
import pandas as pd

df = pd.read_csv_("sample.csv",header = None)

# DataFrameの中身を確認
print(df)
print(df.dtypes)
```

ここで
```df = pd.read_csv_("sample.csv",sep="\t", header = None)```
とすればよかったが、それをしなかったためにタブが混在するデータが1列目に入るように読み込まれてしまった。

```ruby:Out
	0
0	0.2\t1.01\t0.60\t-0.68
1	0.4\t1.00\t0.67\t-0.69
2	0.6\t1.01\t0.61\t-0.72


0    object
dtype: object
```

タブ区切りで別々の列に分けるために以下を実行。

```ruby:In
df = df[0].apply(lambda x: pd.Series(x.split('\t')))

# DataFrameの中身を確認
print(df)
print(df.dtypes)
```

```ruby:Out
	0		1		2		3
0	0.2		1.01	0.60	-0.68
1	0.4		1.00	0.67	-0.69
2	0.6		1.01	0.61	-0.72


0    object
1    object
2    object
3    object
dtype: object
```

この後計算を行いたいので、全てfloat型に変換する。

df.shape[1]でDataFrameの列数を取得し、range関数で列数のリストを作成してfor文を回す。


```ruby:In
for i in range(df.shape[1]):
    df[i] = df[i].astype(float)

# DataFrameの中身を確認
print(df.dtypes)
```

```ruby:Out
0    float64
1    float64
2    float64
3    float64
dtype: object
```

これで完了。

---
**補足1
フォルダ配下に置いたファイルを読み込むようにしたい場合は次のようにするとできた。

```ruby:In
import pandas as pd
import os

# ディレクトリをファイルがあるフォルダに変更する必要がある。
os.chdir("./ファルダ名")

# ファイル一覧をリストで取得する。
file = os.listdir("./")

# file[0]でファイル名を取得する（１ファイルのみ存在する前提）
df = pd.read_csv(file[0],header=None)
```

**補足2
調べたらastypeの引数は辞書型でも行けるらしい。
異なる型に変換する場合は便利そう。

```ruby:In
df.astype({'a': int, 'c': str}).dtypes
```

**補足3
column名を入れる場合、columnを追加する場合は次を実行。

```ruby:In
from pandas import DataFrame

#　column名を挿入
df.columns=['a','b','c','d']

# column名を指定してcolumnを追加
df = DataFrame(df, columns=['a','b','c','d','e'])
```
---
**20170410追記

コメントでご指摘があったので、read_csvの引数に「sep="\t"」を使う方法を試しましたが、カンマ混じりで読み込んでしまいました。

```ruby:Out
     0       1       2        3
0    0.2,    1.01,   0.60,   -0.68
1    0.4,    1.00,   0.67,   -0.69
2    0.6,    1.01,   0.61,   -0.72
```

しかし、そこで「sep="\t"」の記述を削除して、read_csvを行った所、splitやastype処理を行わなくても普通にfloat型として読み込んでくれました。

pycharmで実行しているのですが、sepの引数を再設定してやり直すと、ツールが自動で判別してくれるのでしょうか。分かりません。

```ruby:In
import pandas as pd
import os ##ファイル読み込みの為

# sampleフォルダ下のcsvファイルを読み込む
os.chdir("./sample")
file = os.listdir("./")

df = pd.read_csv(file[0],header=None)

os.chdir("../")

# DataFrameの中身を確認
print(df)
print(df.dtypes)
```


```ruby:Out
     0      1      2      3
0    0.2    1.01   0.60   -0.68
1    0.4    1.00   0.67   -0.69
2    0.6    1.01   0.61   -0.72

0    float64
1    float64
2    float64
3    float64
dtype: object
```

今のところ4通りの事象を確認しており、原因不明。

```
Pycharm使ってカンマタブ混在のデータをread_csvで読み込むと
    ①何もせずに正しくfloatで読み込まれる場合
    ②何もしないとタブ混じりで読み込まれる場合
    ③sep="\t" を指定すると正しくfloatで読み込まれる場合
    ④sep="\t"を指定するとカンマ混じりで読み込まれる場合
```
Firebase で Twitter 認証を実装する - iOS編

## はじめに

ザザッとまとめただけなので、追って詳細は補完していきたいです。

## 流れ

1. Fabric に登録する
2. Twitter にアプリを登録する
3. Firebase に iOS アプリを登録する
4. Firebase に認証の設定をする
5. iOS アプリに認証の実装をする

## Fabric に登録する

[fabric](https://get.fabric.io/) にアクセスし、アカウントを作成します。
`GET FABRIC` からアカウントを作成した後、確認メールからアカウントの登録を完了させます。

## Twitter にアプリを登録する

[twitter](https://apps.twitter.com/) にアクセスし、Sign in します。
※ Sign in には Twitter のアカウントを利用します。また、利用する Twitter のアカウントには電話番号が設定されている必要があるようです。

`Create New App` からアプリを登録します。登録する際に入力する情報の内、`Callback URL` は後述する `Firebase` で取得する値を設定します。

アプリ管理画面の `Keys and Access Tokens` で確認できる `Consumer Key` , `Consumer Secret` は Firebase の設定で利用します。

## Firebase に iOS アプリを登録する

[Firebase](https://firebase.google.com/docs/auth/?hl=ja) にアクセスし、Google アカウントでログインします。

[Firebase のコンソール](https://console.firebase.google.com/?pli=1) にアクセスします。
`新規プロジェクトを作成` からプロジェクトを作成します。

## Firebase に認証の設定をする

プロジェクトの管理画面から `Authentication` > `ログイン方法` > `Twitter` を選択し、ログイン方法の設定をします。
この際、前の手順（Twitter のアプリ管理画面）の `Consumer Key` , `Consumer Secret` を入力します。
また、`Twitter` でのログイン方法の設定画面に表示されるコールバック URL を Twitter のアプリ管理画面の `Settings` にて `Callback URL` として設定します。

## iOS アプリに認証の実装をする

### 準備
1. Podfile を設定して、インストールする
2. info.plist を設定する
3. ビルドフェーズにスクリプトを設定する
4. Fabric を初期化するコードを埋め込む
5. `Twitter.sharedInstance()` にカスタマーキー、シークレットを設定する

1~4 は [fabric: Twitter](https://fabric.io/kits/ios/twitterkit/install) のインストールガイドを参照ください。

### 認証の実装
手軽に済ませることを第一とする場合は TwitterKit が提供する `TWTRLogInButton` を利用すると良さそうです。

1. `TWTRLogInButton` を生成し、配置する
2. `TWTRLogInButton` に完了時の処理を設定する

`TWTRLogInButton` の完了時の処理では、下記の処理を実施します。

1. パラメータで渡ってくる `TWTRSession` から `FIRAuthCredential` を生成する
2. 1 の Credential を `FIRAuth.auth` の signIn メソッドに渡し、Firebase に Twitter 認証の結果を登録する

---

以上で Firebase で Twitter 認証を導入することができました。
ちなみに、認証した結果は Firebase のコンソールの `Authentication` > `ユーザー` から確認できます。
GitHub のシンタックスハイライト判定を上書きする

# tl;dr

- GitHub :octocat:  は Emacs や Vim の modelines に沿ったシンタックスハイライトをしてくれます
- .gitattributes でも設定できるはずですが、いまのところ有効ではないようです  
(2017-04-08 時点)

# 背景
 
「このファイルは実質 YAML なんだし、 GitHub 上でもそう表示してほしいなあ」なんてことありますよね。（たとえば [salt-ssh の Saltfile][1] ですとか）

王道は [linguist][2] の [languages.yml][3] へ Pull Request を出すことかと思いますが、ほかになにか手っ取り早い方法がないかと探したところ、 [README][4] にこんな記載がありました。

> ### Using gitattributes
> 
> Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics and will be used to syntax highlight files. You can also manually set syntax highlighting using [Vim or Emacs modelines][5].

# 検証

実際に検証してみました。

## 素の状態

- シンタックスハイライトされません
- HTML のクラスは `type-text` です

<https://github.com/elim/test-gh-linguist-overriding/blob/1ae6834/Saltfile>

![plain.png](https://qiita-image-store.s3.amazonaws.com/0/8171/74f725f0-19f2-0167-b8ba-43b349ef8a1d.png)

![plain-type.png](https://qiita-image-store.s3.amazonaws.com/0/8171/312a6ecc-d0c9-3009-3e9f-f8abd9d3160d.png)

## `.gitattributes`

下記の内容を用意しました

```text:.gitattributes
Saltfile linguist-language=YAML
```
- シンタックスハイライトされません
- HTML のクラスが `type-yaml` になります

<https://github.com/elim/test-gh-linguist-overriding/blob/62cf59f/.gitattributes>
<https://github.com/elim/test-gh-linguist-overriding/blob/62cf59f/Saltfile>

![gitattributes-type.png](https://qiita-image-store.s3.amazonaws.com/0/8171/63d46677-7386-eabb-eab0-0c56bff15378.png)

## Emacs 形式の modeline

- シンタックスハイライトされます
- HTML のクラスが `type-yaml` になります

<https://github.com/elim/test-gh-linguist-overriding/blob/2be0582/Saltfile>

![emacs-style-modelines.png](https://qiita-image-store.s3.amazonaws.com/0/8171/7443d5ac-5e5a-6290-12c1-4a138f45ac17.png)

![emacs-style-modelines-type.png](https://qiita-image-store.s3.amazonaws.com/0/8171/3d58b20f-8034-acd4-f60e-44d573953759.png)

## Vim 形式の modeline

<https://github.com/elim/test-gh-linguist-overriding/blob/76a9ada/Saltfile>

![vim-style-modelines.png](https://qiita-image-store.s3.amazonaws.com/0/8171/89b8c2b6-bee1-ea0e-b8d9-312eec90d947.png)

![vim-style-modelines-type.png](https://qiita-image-store.s3.amazonaws.com/0/8171/6ab2f9b0-1821-9b7a-7de3-8f4041d6fcfb.png)

* * *

以上です。

まだマイナーな環境や自作言語、自作 DSL に適用すると便利かもですね :diamond_shape_with_a_dot_inside: 

[1]: https://docs.saltstack.com/en/latest/topics/ssh/#define-cli-options-with-saltfile
[2]: https://github.com/github/linguist
[3]: https://github.com/github/linguist/blob/e80b92e/lib/linguist/languages.yml
[4]: https://github.com/github/linguist/blob/e80b92e/README.md
[5]: https://github.com/github/linguist/blob/e80b92e/README.md#using-emacs-or-vim-modelines
Test::Harnessでbase-2.16のバグを踏んだ

[Don't use base.pm, use parent.pm instead!](http://d.hatena.ne.jp/gfx/20101226/1293342019) を踏んじゃったお話です。

# 結論
古いPerlを使っていたらbaseのバグを踏んだ。
問題となったbaseのバージョン(2.16)はCPANには存在せず、下記のPerlバージョンに含まれているbaseでだけ問題になります。
baseのバージョンをあげるか、parentを使いましょう。

```sh
$ corelist -a base | grep '2\.16'
  v5.13.11   2.16
  v5.14.0    2.16
  v5.14.1    2.16
  v5.14.2    2.16
  v5.14.3    2.16
  v5.14.4    2.16
```

# 気づいたきっかけはTest::Harness


```
$ prove --harness TAP::Harness::JUnit
Can’t locate object method “new” via package “TAP::Harness::JUnit::SUPER” at hoge/TAP/Harness/JUnit.pm line 145.
```

harnessオプションで指定したモジュールの親クラスがロードできていません。
`App::Prove`の`require_harness`と`print_version`メソッドにbaseのバグを踏むコードがあるのですが、ここではシンプルに下記の再現コードを記載します。


```pl
package Foo;
use base 'FooBase';
sub new {FooBase->new;}
1;
```

```pl
package FooBase;
sub new {print "FooBase\n";}
1;
```

```pl
$FooBase::VERSION;
use Foo;
Foo->new;
```
本来なら`Foo->new`を呼び出せばFooの中で`FooBase->new`が呼び出されますが、baseのバグにより、Can't locate object method "new" via package "FooBase"と言われてしまいます。
`use Foo;`より前に親クラスの`$FooBase::VERSION`が記述してあると発生します。

# 追記
Test::Harnessのバージョン3.31未満だとエラーになりません
CentOS7でディレクトリを定期的に丸ごとバックアップする

# はじめに
自宅サーバーに外付けHDDを取り付けてNAS化していますが、データが飛ぶと非常に怖いため、定期的にバックアップして冗長化させようと思います。

色々やり方はあるかと思いますが今回はrsyncコマンドをcronで実行するよう設定します。

# 条件
- 事前に外付けHDDを２台マウントしていること

*※/nasと/backupにそれぞれ同じ容量のHDDをマウントしていることとします*

# rsyncコマンドをインストールする

rsyncコマンドがインストールされていない場合は、インストールしておきます。

```
# yum -y install rsync
```

# 初回バックアップを実行する

念のため、手動で一度フルバックアップしておきます。

```
# rsync -a /nas /backup
```

# cronにコマンドを登録する

一時間に１回バックアップを実行するように設定します。
/etc/cron.hourly/backup.sh を作成します。

```
vi /etc/cron.hourly/backup.sh
```

```bash:backup.sh
#!/bin/bash
rsync -a --delete /nas /backup
```

パーミッションを設定しておきます。

```
chmod 775 /etc/cron.hourly/backup.sh
```
一時間後、ログを確認して実行されていれば問題ありません。

```
less /var/log/cron
```

```
Apr  8 23:01:01 kuroko run-parts(/etc/cron.hourly)[8180]: starting backup.sh
Apr  8 23:01:13 kuroko run-parts(/etc/cron.hourly)[8198]: finished backup.sh
```
【Ruby on Rails】gem(Kaminari)でページネーション機能を追加してBootstrapを適用する。

# はじめに
アイテム一覧画面に表示されるアイテム数が増えるにつれ、スクロールするのが大変/見づらいので、指定したアイテム数毎に、複数ページに分けて表示されるようにします。
今回は[kaminari](https://github.com/kaminari/kaminari)というgemを使ってこれを実現して行きます。

ページネーションを追加する前
![スクリーンショット 2017-04-08 19.52.13.png](https://qiita-image-store.s3.amazonaws.com/0/151720/e1824d56-8c1c-b78b-2148-73810966c7c7.png)

ページネーションを追加した後
![スクリーンショット 2017-04-08 22.58.33.png](https://qiita-image-store.s3.amazonaws.com/0/151720/c4de6a57-1082-15d7-1433-c61bca09f3e9.png)

## 追記(2019/02/02)
個人的には[mislav/will_paginate](https://github.com/mislav/will_paginate)の方が導入が簡単な印象を受けたので一応名前だけ紹介しときます。どんな感じかは[Ruby on Rails チュートリアル：実例を使って Rails を学ぼう > 10.3.3 ページネーション](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-pagination)が分かり易い気がします。

# ページネーション機能を追加する
はじめに、「Gemfile」に以下を追記し、bundle installします。

```ruby:Gemfile
gem 'kaminari', '~> 0.17.0'
```

[Rails5系を使用しているため、バージョン0.17.0を指定しています。](http://nekakoshi.hatenablog.jp/entry/2016/06/11/133236)

```
$ bundle install
```

次に、「app/controllers/welcome_controller.rb」を編集します。

```ruby:welcome_controller.rb（編集前）
class WelcomeController < ApplicationController
  PER = 8

  def index
    @words = Word.all
  end
end
```

```ruby:welcome_controller.rb（編集後）
class WelcomeController < ApplicationController
  PER = 8

  def index
    @words = Word.page(params[:page]).per(PER)
  end
end
```

最後に、「app/views/welcome/index.html.erb」を編集します。

```ruby:app/views/welcome/index.html.erb(編集前）
<div class="page-header">
  <h1>単語一覧</h1>
</div>
<div class="list-group">
  <% @words.each do |word| %>
    <%= link_to(word, class: 'list-group-item') do %>
      <h4 class="list-group-item-heading">
        <%= word.word %>
      </h4>
      <p class="list-group-item-text">
        <%= word.reading %>
      </p>
    <% end %>
  <% end %>
</div>
```

```ruby:app/views/welcome/index.html.erb(編集後）
<div class="page-header">
  <h1>単語一覧</h1>
</div>
<div class="list-group">
  <% @words.each do |word| %>
    <%= link_to(word, class: 'list-group-item') do %>
      <h4 class="list-group-item-heading">
        <%= word.word %>
      </h4>
      <p class="list-group-item-text">
        <%= word.reading %>
      </p>
    <% end %>
  <% end %>
  <%= paginate @words %>
</div>
```

追記したのは、``` <%= paginate @words %>```だけです。以上でページネーションが出来上がったかと思います。

![スクリーンショット 2017-04-08 19.51.35.png](https://qiita-image-store.s3.amazonaws.com/0/151720/15e0df3a-f855-4cde-06bb-45aa6582710d.png)


# Bootstrapに合わせる
Bootstrap用にカスタマイズすることもできます。
まずは、Gemfileに[kaminari-bootstrap](https://github.com/mcasimir/kaminari-bootstrap)というgemを追記し、bundle installします。

```ruby:Gemfile
gem 'kaminari-bootstrap', '~> 3.0.1'
```

```$ bundle install```

そして最後に、i18nの設定を追加すれば完了です。
「config/locales/kaminari_ja.yml」を追加し、以下を書き込みます。

```yaml:config/locales/kaminari_ja.yml
ja:
  views:
    pagination:
      first: "&laquo; 最初"
      last: "最後 &raquo;"
      previous: "&lsaquo; 前"
      next: "次 &rsaquo;"
      truncate: "..."
```

# 最後に
上記の手順後、うまく表示されない場合は、一度「rails s」を終了し、再起動してみてください。
DockerでJupyter


###Dockerのバージョン
Version 17.03.1-ce-mac5 (16048)
Channel: stable
b18e2a50cc

###Docker Image
continuumio/anaconda3

###コマンドラインから起動する方法

「-v ~:/opt/notebooks」によってMacのホームディレクトリがノートブックのホームディレクトリとなります

```
docker run -v ~:/opt/notebooks -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser"
```
### ブラウザからノートブックを起動します

http://localhost:8888/tree?token=xxxxxxxxxxxxxxxxxx#
AtCoder Beginner Contest 058

2017年4月8日のAtCoderの記録。言語はRubyです。

問題はこちら：[AtCoder Beginner Contest 058](http://abc058.contest.atcoder.jp/)
私の回答一覧はこちら：[自分の結果](http://abc058.contest.atcoder.jp/submissions/all?user_screen_name=Linus)
35分で全問完答。 1回ミスったのでタイムは40分相当。4位です。**一桁順位だ!やった!**

#A問題
a+c = b*2 が成り立つか否かで場合分けして終わり。簡単だ。と思ってコードテストせずに提出したら**==の代わりに=と書く**という初歩的なミスのせいでWA1回。情けない。

#B問題
文字列の奇数文字と偶数文字を与えられたときに全体の文字列を出力する。例えば奇数文字がabcで偶数文字がxyzならば、axbyczと出力すればいい。
何かスマートな解き方がありそうな気がしたけど、思いつかなかったので愚直にループ。
終了条件が少し難しい。文字を書いたあとに終了判定するのではなく、文字を書く前に位置を見て終端位置に達していれば終了と判定している。

```ruby
o = gets.chomp!
e = gets.chomp!
 
ol = o.length
el = e.length
 
ans = ""
i = 0
while(1) do
	break if i == ol
	ans += o[i]
	
	break if i == el
	ans += e[i]
	
	i += 1
end
 
puts ans
```

#C問題
複数の文字列が与えられる。どの文字列S_iに対してもS_iの部分文字列の並び替えになるような文字列のうち、最長のものを求めよ。複数存在するときは辞書順で最初のもの。

考え方は以下。

- 文字ごとに考えれば良い。入力例1だとaの含まれる個数が上から2個、2個、3個なので、解答にaは2個まで入れられる。最長のものなので、2個入れる。min(2, 2, 3)を計算する。
- 辞書順の最初のものである。なのでアルファベット順に出力すれば良い。「解答にはaが3個、cが2個、eが1個含まれるな」と分かったら、解答はそのまま並べてaaacceである。
- つまりaから順に調べながら、解答となる文字列の後に順次追加していけばよい。

実装

- 「aからzのそれぞれに対して」はRangeオブジェクトの```'a'..'z'```が使える。 ```1..10```のように数字だけしか使えないのかと思ってた。eachはArrayクラスのメソッドなので、to_aで変換する必要がある……と思って書いたが、実際にはRangeクラスにもeachメソッドがあり、to_aは必要ない。
- 「文字列中に何回aが出現するか」はcountメソッド。毎回忘れる……　[公式ドキュメント](https://docs.ruby-lang.org/ja/latest/class/String.html#I_COUNT)
- 最小値を求める部分は[前回の上手い解答を見た反省](http://qiita.com/Linus_MK/items/b500a106046ddbb32f01#b%E5%95%8F%E9%A1%8C)を活かして、mapで書いた。スッキリ書ける。

```ruby
N = gets.chomp!.to_i
input = []
N.times do
	input << gets.chomp!
end
 
ans = ""
('a'..'z').to_a.each do |char|
	arr = input.map do |i| 
		i.count(char)
	end
		
	mi = arr.min
	ans += char * mi
	
end
 
puts ans
```

#D問題
定石となるアルゴリズムを知っている必要はなく、頭を使って計算量を上手く減らす問題。大得意。


- 縦と横で話は完全に独立しているので、(縦の合計)×(横の合計)で良いだろう。(ここは厳密な証明をしたわけではなく推測。)
- では横だけ考えると、横幅の合計はどう求めるか。M本の縦線から2つ選ぶのを全通り考えると時間オーバー。小さな例として下の場合を考えると縦線の選び方は6通りあり、横幅の合計は3×a1 + 4×a2 + 3×a3になる。
 
| 横幅a1       |      横幅a2 |   横幅a3   |
|:-----------------:|:------------------:|:------------------:|

- a2の左側に2つ、右側に2つ縦線があるので、a2を含むような縦線2つの選び方は2*2=4である。他も同様。

ここまで来れば実装量はとても少ない。

```ruby
N,M = gets.split(" ").map{ |v|
	v.to_i
}
xs =  gets.split(" ").map{ |v|
	v.to_i
}
ys =  gets.split(" ").map{ |v|
	v.to_i
}
mod = 100_000_007

yoko = 0
0.upto(N-2) do |i|
	yoko += (xs[i+1] - xs[i]) * (i+1) * (N-i-1)
	yoko = yoko % mod
end

tate = 0
0.upto(M-2) do |i|
	tate += (ys[i+1] - ys[i]) * (i+1) * (M-i-1)
	tate = tate % mod
end

puts (yoko * tate) % mod
```

(レート更新について追記予定)
Laravel Pug で Pug ファイルを Laravel へ導入する


Laravel Pug は Pug ファイルをLaravel のテンプレートとして使用するためのライブラリです。

https://github.com/BKWLD/laravel-pug

## 導入

- `composer require bkwld/laravel-pug` を実行
- サービスプロバイダに `Bkwld\LaravelPug\ServiceProvider::class`を追加

## 仕様

- pug ファイルは Blade と同じく、`resources/views` に配置する。
- 拡張子は `pug` でOK
- `resources/views/index.pug`は `view("index")`で呼び出せる。
- Pug の変数記述は `view`関数の第二引数とか `with`とかで普通に渡せる。
- extend とか include が動く
- baseDir が `resources/views` に設定されてるので, `/` 始まりのファイル参照とかも動く

## 変数の運用など

Pug に gulp から `locals` とか大量に突っ込んでた人は `View::share`とか使って、グローバルにView 変数を定義すると楽っぽい。

````
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\View\Factory;

class AppServiceProvider extends ServiceProvider
{
    public function boot(Factory $view)
    {
        $data = [
            ...
        ];
        $view->share($data);
    }

    public function register()
    {
        //
    }
}

````

## 内部的な仕組み

まずは Pug がコンパイルされれて、その結果が Blade として解釈される。

https://github.com/BKWLD/laravel-pug/blob/master/src/PugBladeCompiler.php#L38

Pug の中で Blade のSyntax を使用する場合は、ファイル名を `hoge.pug.blade`などの形式にしなければならないよう

内部のコンパイルには[pug-php](https://github.com/pug-php/pug)を使用しており、この`Pug`オブジェクトには `laravel-pug.pug` のコンテナキーワードでアクセス可能。

一応 設定ファイルで,`laravel-pug.php`という形で作成すれば、コンストラクタ引数を定義出来るが、 別に extend とかで対応しても良さそう。
EDIFACTについての備忘

###公募関連国連標準メッセージ（UNSMs）機能定義


###COARRI
```
COARRI Container discharge/loading report message(コンテナ揚積報告メッセー
ジ) 
```
船舶からの指定コンテナの荷降ろし(発注通りの荷降ろし、予定よりも多い荷降ろし、少ない荷降ろしなど)、船舶へのコンテナの積込み結果を報告するコンテナターミナルよりのメッセージ。 

###CODECO
```
CODECO Container gate-in/gate-out report message(コンテナゲートイン・アウト
メッセージ)
```
指定のコンテナが内陸運送業者(道路、鉄道、艀)によって配達または引取られたことを確認するためのターミナル、デポなどによって使用されるメッセージ。このメッセージを使用して、ターミナル内部のコンテナの移動状況(船舶へ/からの積み降ろしを除く)
を報告するために使用することもできる。 

リソース
[JASTPRO](http://www.jastpro.org/model/pdf/06-kekka-sokushin.pdf)
Powershellでドメインユーザのパスワードロックを解除する

## Unlock-ADAccountコマンドレット
試験環境のドメイン管理権限を持ってると「パスワード間違えてロックかけちゃったよ～」とHELP要請をもらうことがそれなりにある。はず。
ドメインがいくつもあったりすると、対応の内容は簡単だけどちょっとめんどくかったり。

Powershellでのロック解除は`Unlock-ADAccount`コマンドレットを使う。
DOSコマンドの`net user`に`/domain /active:yes`オプションを付けても解除可能だけど、ユーザ名をちゃんと指定してあげないといけないし、実行ユーザはあまり融通効かない。

以下のコマンドなら、実行ユーザの権限が及ぶ範囲で、ロックアウト中の全ユーザのロックを解除できる。（なんて暴力的！）

```.ps1
Search-ADAccount -LockedOut | Unlock-ADAccount 
```

## Script
…とはいえ、実運用ではさすがに問い合わせがきたアカウントだけ解除したいし、かつ自分も普段は権限が低いユーザを使ってたりする場合もあるのでスクリプトにする。
ドメイン名を名前解決できれば、実行端末と解除したいユーザが別ドメインでもいけるはず。

```Unlock-User.ps1
# ユーザアンロックスクリプト
# Usage: .\Unlock-User.ps1 -User testuser01 -Domain test1domain
Param($User = $null, $Domain = $null)

# 入力チェック
if ($User -eq $null){
    echo "Usage:.\Unlock-User.ps1 -User testuser01 -Domain test1domain"
    exit 2
} 

if ($Domain -eq $null){
    $Domain = $env:USERDOMAIN
}

# Credential作成 "AdminUser"=Adminのユーザ名
$secUser = $Domain + "\AdminUser"
$objCred = Get-Credential -UserName $secUser -Message "Domain Admins"

# ユーザチェック
$objUser = Get-ADUser -Filter 'Name -like $User' -Server $Domain -Credential $objCred

if ($objUser -eq $null){
    echo "ユーザ検索失敗"
    exit 2
}

$objUser = Search-ADAccount -LockedOut -Server $Domain -Credential $objCred | Where {$_.Name -eq $User}

if ($objUser -eq $null){
    echo "${domain}\${user}はロック解除済"
    exit 1
}

# ロックアウト解除
$objUser | Unlock-ADAccount -Credential $objCred

$objUser = Search-ADAccount -LockedOut -Server $Domain -Credential $objCred | Where {$_.Name -eq $User}

if ($objUser -eq $null){
    echo "${domain}\${user}のパスワードロックを解除"
    exit 0
}else{
    echo "${domain}\${user}のパスワードロック解除に失敗"
    exit 2
}
```

実行すると`Get-Credential`でAdminユーザのパスワード入力が求められます。
それも面倒なときは、パスワードベタ書きで。

```.ps1
# Credential作成 "AdminUser"=Adminのユーザ名
$secUser = $Domain + "\AdminUser"
$strPass = "password"
$secPass = ConvertTo-SecureString $strPass -AsPlainText -Force
$objCred = New-Object System.Management.Automation.PSCredential($secUser, $secPass)
```

## 雑感
ActiveDirectory周りは、現場が変わると常識も違うので面白いね。
個人的には、ADが主題じゃないような試験環境とかではパスワードロックポリシーなんて外しておいた方がいいと思ってるけど、ガチガチセキュリティでエンドユーザクライアント管理が第一目標の本番環境の設計思想なら気軽にロック解除出来てるようじゃまずい。
Spring Bootのjsonを返すサンプルを1分で動かす

シンプルなjsonを返すSpring Bootのサンプル[Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)を動かすまでのメモ

### ただ動かすだけなら  

1. [リポジトリ](https://github.com/spring-guides/gs-rest-service  )をcloneする

1. gs-rest-service/completeまで移動する 

1. `./gradlew bootRun` 

1. ブラウザで`http://localhost:8080/greeting`にアクセスする

1. 実行結果

```
{
id: 1,
content: "Hello, World!"
}
```  

### intelliJで動かすなら  
環境: IntelliJ IDEA 2016.3.6   

1. intelliJを起動してimport Projectを選ぶ  
<img width="361" alt="スクリーンショット 2017-04-08 19.59.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/b32793a0-7887-971e-6f34-0a43113f6018.png">  
1. gs-rest-service/complete配下のbuild.gradleを選択、初期設定のままでOK  
1. shiftを2連続タップで `Search Everywhere` を起動、Graまで入力してGradle Tool Windowを開く
<img width="527" alt="スクリーンショット 2017-04-08 20.00.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/6de3ed15-322d-78b8-f0c5-09f24112472d.png">
1. taskからbootRunを選択
<img width="298" alt="スクリーンショット 2017-04-08 19.57.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/733a7366-7f44-9d0b-6133-9a6f18595933.png">

1. ブラウザで`http://localhost:8080/greeting`にアクセスする

1. 実行結果

```
{
id: 1,
content: "Hello, World!"
}
```
Swift：文章中のURL部分だけを抜き出して手に入れる方法

# 背景

Twitter閲覧アプリの作成中にツイートからURLリンクを引っ張ってこようと思った際に作った関数をメモしておく。

# ソースコード

```swift
import UIKit

//Stringの配列を返してくれる関数
func getUrlText(text: String) -> [String] {
	var results = [String]()
	let urlPattern: String = "http(s)?://([a-zA-Z0-9-_]+\\.)+[a-zA-Z0-9-_]+(/[a-zA-Z0-9-_./?%&=]*)?"

	var index: String.Index = text.startIndex
	while index < text.endIndex {
		let range_: Range<String.Index>? = text.range(of: urlPattern,
	                                               options: .regularExpression,
	                                               range: index ..< text.endIndex,
	                                               locale: .current)
		if range_ != nil {
			results.append(text[range_!])
			index = range_!.upperBound
		} else {
			break
		}
	}
	return results
}


//使用例
let str = "リンクはこれhttp://qiita.com/hoge1とhttp://qiita.com/hoge2です。"
let links: [String] = getUrlText(text: str)

print(links) // <-- ["http://qiita.com/hoge1", "http://qiita.com/hoge2"]
```

# 備考

NSRegularExpressionを使った方法が主流で前例があるようだったが、Stringのrangeメソッドという便利そうなものがせっかくできたのでそれを使ってみた。
Explorer/Finder の右クリックで、その場所で、端末や GVim を開く


#問題
普段はGUIで用事を済ませていて、ときどき端末を使う人向け。(Windows/Mac)

Explorer や Finder の右クリックで端末とか GVim を開けるようにしたい。
ファイルを開くのではなくて、いまマウスでつかんでいる、**そのディレクトリ**でアプリケーションを立ち上げたい。つまり、

- Terminal.app を起動して `cd ` と打って `フォルダをドラッグ&ドロップ` とかしたくない。
- gvim.exe を起動して `:cd ` と打って `パスをコピー&ペースト` とか・・・。
- いまそのディレクトリを見ているのに、なんでまたパスを指定しなければならんのよ・・・察して移動してくれよ。

という話。よくある話だけど自分でやってみる。ちなみに GVim を立ち上げたいのは、ファイル名変更ツールとして renamer.vim がOS関係なく使えて便利なため。
参考: [ファイル名変更にVimの編集力を使う（renamer.vim）](http://oplern.hatenablog.com/entry/2016/05/13/000457)

![scr7.png](https://qiita-image-store.s3.amazonaws.com/0/144908/1f9d7c20-d846-81b1-3427-3b2a736e1b31.png)

#Windows の場合
レジストリを編集するため .reg ファイルを作る。
下記は、cmd.exe、msys2 の mintty.exe で tcsh を使う例。(msys2 便利ですね)
パスは適宜変更のこと。メニューの中で目立つように★とか■をつけた。

```registry:context_menu.reg
Windows Registry Editor Version 5.00

; vim:fileencoding=utf-16le:ff=dos
; ファイルエンコーディングは UTF-16LE

; cmd.exe
[HKEY_CLASSES_ROOT\Directory\Background\shell\open_cmd]
@="● cmd here"
[HKEY_CLASSES_ROOT\Directory\Background\shell\open_cmd\command]
@="C:\\WINDOWS\\system32\\cmd.exe"
[HKEY_CLASSES_ROOT\Folder\shell\open_cmd]
@="● cmd here"
[HKEY_CLASSES_ROOT\Folder\shell\open_cmd\command]
@="C:\\WINDOWS\\system32\\cmd.exe"


; msys2 terminal
[HKEY_CLASSES_ROOT\Directory\Background\shell\open_msys2]
@="■tcsh here"
[HKEY_CLASSES_ROOT\Directory\Background\shell\open_msys2\command]
@="c:\\msys64\\usr\\bin\\mintty.exe /bin/tcsh"
[HKEY_CLASSES_ROOT\Folder\shell\open_msys2]
@="■tcsh here"
[HKEY_CLASSES_ROOT\Folder\shell\open_msys2\command]
@="c:\\msys64\\usr\\bin\\mintty.exe /bin/tcsh"

; gvim
[HKEY_CLASSES_ROOT\Directory\Background\shell\open_gvim]
@="★gvim here"
[HKEY_CLASSES_ROOT\Directory\Background\shell\open_gvim\command]
@="c:\\Apps\\Vim\\gvim.exe"
[HKEY_CLASSES_ROOT\Folder\shell\open_gvim]
@="★gvim here"
[HKEY_CLASSES_ROOT\Folder\shell\open_gvim\command]
@="c:\\Apps\\Vim\\gvim.exe"
```
保存して実行すると、Explorer の右クリックメニューに出てくる。

#Mac の場合

Automator > 「新規」 > 「サービス」でワークフローを新規作成し、
下記のように「シェルスクリプトを実行」だけ含んだサービスを作る。

```bash:「シェルスクリプトを実行」に書く
open -a Terminal `dirname "$1"`
```
![scr2.png](https://qiita-image-store.s3.amazonaws.com/0/144908/ac272c66-7cc5-6a49-6463-c9d273dcc220.png)
シェルの設定は /bin/bash にしておいた。/bin/tcsh だと日本語を含むパスでエラーになったため。(これは Terminal.app で実行されるシェルとは無関係)

ワークフローを保存すると、保存するとき付けた名前が Finder の右クリックに現れる。
.workflow ファイル自体は `~/Library/Services/` に保存されているので、メニューを消したい時はファイルを削除する。

MacVim.app 起動の場合は、

```bash:「シェルスクリプトを実行」に書く
cd `dirname "$1"`
/Applications/MacVim.app/Contents/MacOS/Vim -g
```
Terminal.app も MacVim も既存のサービスがあるから、自分で作る意味はあまりないが、自分で作れるということに意味がある、ということにしよう。

#その他
Mac だと何もないところをクリックしてもメニューに現れないのでファイルかフォルダをつかむ必要がある。逆に Windows では何もないところかフォルダをつかむ必要があり、ファイルをつかんだときはメニューにでてこない。若干挙動が違うけど、動くからこれで良し。

#参考
[MSYS2 "Open Here" registry settings](https://gist.github.com/magthe/a60293fe395af7245a9e)

[Finderで選択したフォルダをiTermで開く](http://qiita.com/paulownia@github/items/2c3d841684e38d353713)