OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftクイズ： extension Arrayでオーバーロードされたメソッドを呼び分ける

次のようなコードがあります。

```swift
protocol P {}
struct S: P {}

extension Array {
    func hoge() -> String { return "Any" } // ①
}
extension Array where Element == S {
    func hoge() -> String { return "Equal" } // ②
}
extension Array where Element: P {
    func hoge() -> String { return "Protocol" } // ③
}
extension Array where Element == P {
    func hoge() -> String { return "Existence" } // ④
}
```


# 問題 1

次のコードで呼ばれるのは、メソッド①〜④のどれでしょうか？

```swift
[S()].hoge()
```

# 問題 2 〜 4

それでは、残りの3つのメソッドを呼び分けるにはどうしたら良いでしょうか？
各々1行から2行のコードで回答してください。

---

thinking time! ⏱

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

# 解答


## 解答 1

```swift
[S()].hoge()
```

上記のコードで呼ばれるのは…

```swift
extension Array {
    func hoge() -> String { return "Any" } // ①
}
extension Array where Element == S {
    func hoge() -> String { return "Equal" } // ②
}
extension Array where Element: P {
    func hoge() -> String { return "Protocol" } // ③
}
extension Array where Element == P {
    func hoge() -> String { return "Existence" } // ④
}
```

のうち、②でした。
本記事のコードを

```shell
swift -frontend -typecheck -debug-constraints hoge.swift
```

に掛けてみると、解決のログが確認できました。
ログによると `[S()].hoge()` の `.hoge()` は ② `<Element where Element == S> (Array<Element>) -> () -> Int` の引数側と

```
Constraint restrictions:
  Array<S> to Array<S> is [deep equality]
```

という関係であるため、他の（サブタイプ関係の）オーバーロードよりも優先的に選ばれたようです。

なお、Swift実装の詳細について @ukitaka さんにご助言いただきました。ありがとうございました。

> debug-constraintsの出力みてみると、オーバーロードのどの候補を使うかの比較自体はこの辺りでやってそうな雰囲気ありますね
> https://github.com/apple/swift/blob/master/lib/Sema/CSRanking.cpp#L387-L725



## 解答 2 〜 4

オーバーロードされたメソッド①〜④それぞれを呼び分けるコードは、以下の通りです。

### ①

```swift
extension Array {
    func hoge() -> String { return "Any" } 
}

[S() as Any].hoge() // "Any"
```

解説：
extension Array に whereが省略されている場合、 `where Element: Any` と解釈される。
その証拠に `extension Array where Element: Any` で `hoge()` を実装しようとすると redeclaration だって怒られます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/ca60b7f6-d1b3-5907-d56e-481ac183f41a.png)

### ②

```swift
extension Array where Element == S {
    func hoge() -> String { return "Equal" } 
}

[S()].hoge() // "Equal"
```

解説:
解答1のとおり。
`== S` は「`S` 型(のサブタイプ)である」という意味。

### ③

```swift
extension Array where Element: P {
    func hoge() -> String { return "Protocol" }
}

func f<T: P>(_ t: T) -> String { return [t].hoge() }
f(S()) // "Protocol"
```

解説：
`: P` は「`P` プロトコルに適合している」という意味。
Pプロトコルとして見てほしければジェネリックな関数を通す（全称量化する）。
詳しくは https://github.com/apple/swift/blob/master/docs/TypeChecker.rst#polymorphic-types

### ④

```swift
extension Array where Element == P {
    func hoge() -> String { return "Existence" }
}

[S() as P].hoge() // "Existence"
```

解説:
`== P` は「Pプロトコルの存在型(のサブタイプ)である」という意味。
存在型については [型システムの理論からみるSwiftの存在型(Existential Type) - Qiita](https://qiita.com/ukitaka/items/a993b5d7ed5ae84b1b52)を参照して下さい。

`as P` したときには、存在型にパッケージングされる（これを存在量化という）。
存在型Pは、Pプロトコルには適合しない。
詳しい理屈は [Swiftでprotocol型の値がそのprotocol自身にconformしていない理由 - Qiita](https://qiita.com/ukitaka/items/8bcff4348c79d820ba32) を参照してください。
Unity ML Agents のPPOファイルが消えていたのでlearn.pyの使い方を調べたメモ

#はじめに
Unityを用いて機械学習(ML)で遊びたいと思い以下のページ
[Unityの公式サンプルml-agentsでAIを試す](http://am1tanaka.hatenablog.com/entry/2017/11/08/230525)
を参考にUnityでMLを行うための環境を整えていました。
しかし、いざ学習実行の段になったところでPPO.ipynbがどこにもなかったので調べてみました。
以下では、上記のページを参考に、学習の実行直前の段階まで環境を整え終わったと仮定しています。

・動作環境
Win 10
Python 3.6.4
Unity 2017.3.1f1
#PPO.ipynb が learn.pyに変わった
Unityの公式GitHub
[Unity-Technologies/ml-agents](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Getting-Started-with-Balance-Ball.md)
で述べられていることを要約すると、
>PPOを用いた強化学習をするには, learn.pyを実行する

とのことでした。

これによると、学習を実行するには、シェルスクリプトでexeファイルが保存されているフォルダへ移動し、
`python learn.py <env_file_path> --run-id=<run-identifier> --train `

を実行すると良いようです。ここで、env_file_pathはUnityのexeファイルのアドレス、そしてrun-identifierは学習毎に学習データを分けるためのフォルダです。
なので私の場合、
`python learn.py C:\Users\Downloads\Unity\ml-agents-master\python\3DBall.exe --run-id=C:\Users\Downloads\Unity\ml-agents-master\python\3DBallData1 --train `

とすることで、学習が実行され、学習データも新しく作成したC:\Users\Downloads\Unity\ml-agents-master\python\3DBallData1
に保存されました。

実行毎に学習データを分けず、上書きしたい場合はデータ保存フォルダの指定を消して、
`python learn.py C:\Users\Downloads\Unity\ml-agents-master\python\3DBall.exe  --train`
とすると良いようです。
nginx 公開ディレクトリの変更

nginxの設定ファイルはここ。

```
/etc/nginx/nginx.conf
```

公開ディレクトリがデフォルトでは`/usr/share/nginx/html`になっている。
`/var/www/html`に変更する。

```
$ sudo vim /etc/nginx/nginx.conf
```

`server`コンテキストの`location`ディレクティブに設定を追加する。

```
server {
    location / {
        root /var/www/html
    }
}
```

nginxを再起動する。

```
$ systemctl restart nginx
```
VSCodeのターミナルをWSLのbashにしたとき、カレントディレクトリを表示できなかった

最初以下のように指定していた

```
"terminal.integrated.shell.windows": "C:\\Users\\user\\AppData\\Local\\Microsoft\\WindowsApps\\ubuntu.exe"
```

問題なく起動するが、プロジェクトのカレントディレクトリで起動してくれない。不便。

だが、これは指定方法が間違っていたようだ。

```
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\bash.exe"
```

これで解決。

## 参考

- https://github.com/Microsoft/vscode/issues/32717
ruby try/try!メソッドの活用法

ある配列の値を取得してきてその値を`c = a[b]`という方法で変数に代入しようとしたら、
`undefined method `[]' for nil:NilClass (NoMethodError)`
というエラーが出て、解決方法が全く分からなかった。

ググり続けていると、`tryメソッド`にいきついた。

## tryメソッドとは
`user.name`というメソッドを記述したときに、`userがnilだと`エラーになります。
もしくは、`name`がない場合もエラーになります。
この二つの問題を解決するのがtryメソッドで、user.try(:name)としてやる。
まとめると、tryメソッドは、

(1)userがnilでなければ、nameを表示する。
userがnilの場合は、何もしないというメソッド。

(2)もう一つの意味は、userにnameが実装されていない場合は何もしない。

ただ、二つ目の使い方はあまりしないな。

## try!メソッドとは
もう一つ、try!メソッドというメソッドがあります。
これは、tryメソッドの(1)のみの意味をもつメソッドになります。

tryの(2)はあまり使わないのだったら、try!メソッドの方を使って行った方がいいかな。
rbenvの使い方と仕組みについて

RubyやRailsを使って開発を行う上で、複数のバージョンを使いたい＆管理したい時がある。
そんな時、rbenvを使うと便利だ。

## rbenv
Rubyのバージョンを簡単に切り替えてくれるツール。

## rbenvのインストール→指定したRubyのバージョンをインストールする手順

```console
// 1.初期化設定
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
// 2.初期化設定の反映
$ source ~/.bash_profile
// 3.rbenvのインストール：
$ brew install rbenv ruby-build
// 4.インストール可能なRubyのバージョン一覧の表示
$ rbenv install -l
// 5.指定したRubyのバージョンをインストール
$ rbenv install 2.3.5
// 6.インストールしたRubyを使用可能な状態にする⇒shimsへの反映
$ rbenv rehash
```

　複数のバージョンのRubyをインストールしたい場合は、4.⇒5.⇒6.を繰り返す。

## rbenvのフォルダ構成

>~/.rbenv/ （ルートフォルダ）
>~/.rbenv/shims/ （rubyやgemがインストールしてくれるコマンドのラッパーを保存するフォルダ）
>~/.rbenv/version （グローバルに設定しているRubyバージョンを記録するファイル）
>~/.rbenv/versions/ （その他のインストールした各種Rubyバージョンをインストールするフォルダ）

引用元：[rbenvとは - Qiita](https://qiita.com/souichirou/items/d4196faa0df9e4bacf17)

## shims(rbenv rehash)について
rubyやgemをインストールして使えるコマンド(irb, gem, rake, rails, rubyなど)をバージョン毎に振り分けるフォルダ。

```console
// "rbenv which コマンド名"を使って、コマンドの参照先のバージョンが変わっている事を確認してみる。
// rubyコマンドの参照先を確認(rubyコマンドの参照先がバージョン2.3.5を向いている事を確認)
$ rbenv which ruby
~/.rbenv/versions/2.3.5/bin/ruby
// rubyのバージョンを切り替え
$ rbenv global 2.5.0-dev
// rubyコマンドの参照先が変わった事を確認
$ rbenv which ruby
~/.rbenv/versions/2.5.0-dev/bin/ruby
$
```

こういったコマンドをバージョン毎に参照先を切り替えをてくれるディレクトリが、shims(rbenv rehash)。
gemからインストールして、新しいコマンドが増える場合は必ず"rbenv rehash"を行うこと！

## rbenvを使ってRubyのバージョンを切り替える手順
切り替え方法は、localとglobalの2種類がある。

###### ■localで切り替え

```console
$ ruby -v
ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-darwin16]
$ rbenv local 2.5.0-dev
$ ruby -v
ruby 2.6.0dev (2018-03-11 trunk 62724) [x86_64-darwin16]
$
```

プロジェクト毎に使用するRubyのバージョンを切り替える時に使用する。
rbenv local X.X.Xコマンド時、カレントディレクトリにバージョン情報が書かれた.ruby-versionファイルを作成する。
.ruby-versionファイルがある層より下のディレクトリは、.ruby-versionファイルに書かれたバージョンが使われる。
なお、.ruby-versionファイルは、global切り替えよりも優先順位が高いため、.ruby-versionファイルに書かれたバージョンが優先される。

###### ■globalで切り替え

```console
$ ruby -v
ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-darwin16]
$ rbenv global 2.5.0-dev
$ ruby -v
ruby 2.6.0dev (2018-03-11 trunk 62724) [x86_64-darwin16]
$
```

パソコン全体で使用するRubyのバージョンを切り替える時に使用する。
上記のrbenvフォルダ構成にある~/.rbenv/versionのバージョンを切り替えている。
ただし、フォルダに.ruby-versionがファイルがある場合は、そちらに記載されているバージョンが優先される。

## 備忘録
rbenvについて調べたきっかけは、Rakeコマンド時に以下エラーが出たからだった。

ワーニングメッセージ：
　　warning: already initialized constant FileUtils::RUBY

原因：
　　Railsのvendor/bundleのgemとrbenvでインストールしたrubyの中のgemが競合したため。

対処方法：
　　Railsのvendor/bundleのgemを削除。
　　　　※rbenvでインストールしたrubyの中のgemのみにする。

rbenvはrubyのバージョンによって中のgemも同時に管理できるため、Railsのvendor/bundleでgemを管理する必要はないと判断。
また、Railsで新規プロジェクトを作成する際に、rails newする必要があるため、rbenvでgemを管理した方が楽と思った。

現在は以下２バージョンを使い分けて管理中。
　・ruby-2.3.5 →　Rails 4.2.1　
　・ruby-2.5.0 →　Rails 5.1.5

## ご参考にさせて頂いたQiita記事
[Rake コマンドで already initialized constant FileUtils::RUBY - Qiita](https://qiita.com/keisukeYamagishi/items/554abe1c93f579288314)
[rbenvでRubyのバージョンを指定する方法 - Qiita](https://qiita.com/makoto_kw/items/cc73b628c9ef039f6e6f)
競プロ用、Rust標準入力パースマクロ

競プロで標準入力のパースがめんどうだったのでマクロ作りました。
AtCoderのRust(1.15.1)でテスト済みです。

# ソースコード
https://github.com/kgtkr/procon-lib-rs/blob/master/src/parser.rs

# 使い方
## 事前準備
標準入力を全て読み込む

```rust
let text = {
    let mut s = String::new();
    io::stdin().read_to_string(&mut s).unwrap();
    s
};
```

## 例
```text:入力値
5
10 20
1 a
2 b
3 c
4 d
5 e
1 2 3 4 5
```

```rust
input!(text=>
    (n:usize)
    (a:i64 b:i64)
    {n;list:(i64,#)}
    (arr:[i64])
);
assert_eq!(n, 5);
assert_eq!(a, 10);
assert_eq!(b, 20);
assert_eq!(list, vec![(1,"a"),(2,"b"),(3,"c"),(4,"d"),(5,"e")]);
assert_eq!(arr, vec![1,2,3,4,5]);
```

# 解説
`input!(入力値=>パーサー...);`
## 1行の入力
`(変数名:型...)`
## 複数行の入力
`{行数;変数名:型}`

## 型

|構文|解説|例|例入力|
|:-:|:-:|:-:|:-:|
|型|単一の型とマッチ(`parse::<型>()`でパースされる)|i64|10|
|#|文字列|#|abc|
|@|1から始まるインデックスを0からに変換するやつ。<br>つまりusizeでパースして-1してるだけ|@|1|
|[型]|配列|[i64]|1 2 3 4 5|
|(型,...)|タプル|(i64,#)|10 abc|
U-netを短く書く

こちらでベタ書きしていてやばいと思ったので書きました。
https://www.kaggle.com/keegil/keras-u-net-starter-lb-0-277

準備部分

```python:layers
from keras.layers.convolutional import Conv2D

def Conv2D16(s):
    return Conv2D(16, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (s)

def _Conv2D(s,size,dsize=3):
    return Conv2D(size, (dsize, dsize), activation='elu', kernel_initializer='he_normal', padding='same')(s)
    
def CDCP(s,size,dsize=3,droprate=0.1,withpooling=True):
    c =_Conv2D(s,size,dsize)
    c = Dropout(droprate)(c)
    c =_Conv2D(c,size,dsize)
    if(withpooling):
        p=MaxPooling2D((2, 2)) (c)
        return p,c
    else:
        return c
    
def Ulayer(s,t,size,dsize=3,droprate=0.2):
    u = Conv2DTranspose(size, (2, 2), strides=(2, 2), padding='same') (s)
    u = concatenate([u, t])
    c = _Conv2D(u,size, dsize)
    c = Dropout(droprate)(c)
    return _Conv2D(c,size,dsize)

```

ネットワークを作る部分
下の方はやりすぎ感がある。

```python:gennet
IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS=1280,720,3

inputs = Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))

def genUnet1(inputs):
    s = Lambda(lambda x: x / 255) (inputs)
    a0,c0=CDCP(s,16,3,0.1)
    a1,c1=CDCP(a0,32,3,0.1)
    a2,c2=CDCP(a1,64,3,0.2)
    a3,c3=CDCP(a2,128,3,0.2)
    a4=CDCP(a3,256,3,0.2,False)

    a5=Ulayer(a4,c3,128)
    a6=Ulayer(a5,c2,64)
    a7=Ulayer(a6,c1,32)
    a8=Ulayer(a7,c0,16)
    a9=Conv2D(1, (1, 1), activation='sigmoid')(a8)
    return Model(inputs=[inputs],outputs=[a9])

import math
def genUnet(inputs,dropoutrate):
    width,height,channelnum=[a.value for a in inputs.shape]
    s = Lambda(lambda x: x / 255) (inputs)

    ls=[[s]]
    Nmax=int(math.log2(min(width,height)))
    startwidth=4

    for i in range(Nmax-startwidth):
        ni=i+startwidth
        if(i==0):
            ls.append(CDCP(ls[-1]   ,2**ni, channelnum,dropoutrate))
        else:
            ls.append(CDCP(ls[-1][0],2**ni, channelnum,dropoutrate))

    ls.append(CDCP(ls[-1][0],2**Nmax, channelnum,dropoutrate,False))

    for i in range(Nmax-1,startwidth-1,-1):
        ls.append(Ulayer(ls[-1][0],ls[i-startwidth][1], 2**i, channelnum,dropoutrate,False))

    ls.append(Conv2D(1, (1, 1), activation='sigmoid')(ls[-1]))
    return Model(inputs=[inputs],outputs=[ls[-1]])

```

コンパイル

```python:compile
model=genUnet(inputs)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=[mean_iou])
model.summary()
```

```python:fit

earlystopper = EarlyStopping(patience=5, verbose=1)
checkpointer = ModelCheckpoint('model-unet.h5', verbose=1, save_best_only=True)
results = model.fit(X_train, Y_train, validation_split=0.1, batch_size=16, epochs=50, 
                    callbacks=[earlystopper, checkpointer])
```

結果
https://gist.github.com/xiangze/d42d7c8e5ae967fba388d5c639365f3a

ちゃんとできてるっぽい。
全米世帯動向調査とそのドラマ、pythonを添えて

# はじめに
この投稿は以下リンク先を参考にしています。
[Think Stats: Exploratory Data Analysis in Python](http://greenteapress.com/thinkstats2/html/thinkstats2002.html#sec13"Think Stats: Exploratory Data Analysis in Python")

結局なんなのか、前置きいらんので結論だけ知りたいという方は最後の解釈だけ呼んでもられればいいです。

# 概要
上記リンク先で得た大量のデータから垣間見ることができる一つのドラマについて共有します。
データは [アメリカ疾病予防管理センター](https://www.icpsr.umich.edu/nsfg6/Controller?displayPage=labelDetails&fileCode=PREG&section=A&subSec=8016&srtLabel=611933 "アメリカ疾病予防管理センター")の妊娠出産に関する者で、横断調査によって得られたものです。つまりその内容自体はスナップショットです。

# コード

早速、中身を見てみましょう。基本的に上記リンク先通りに進めれば問題ないので該当のコードだけをあえて選びます。

```python:test.py
# 任意の調査対象者のidを定義
>> caseid = 10229
# データ内のインデックスに含まれるリストを要素にもつcaseidをキーとした辞書を作成
>> preg_map = nsfg.MakePregMap(df)
# 上記のcaseidからリストを呼び出し
>> indices = preg_map[caseid]
# リストに該当する結果、ここで出力されるそれぞれの数字は以下の対応表に準ずる。
"""
1 LIVE BIRTH (出生)
2 INDUCED ABORTION (人工流産)
3 STILBIRTH (死産)
4 MISCARRIAGE (流産)
5 ECTOPIC PREGNANCY (子宮外妊娠)
6 CURRENT PREGNANCY (妊娠中)
"""
>> df.outcome[indices].values
[4 4 4 4 4 4 1]
````

# 解釈
原文から上記結果の解釈について簡単にまとめます。

> "The outcome code 1 indicates a live birth. Code 4 indicates a miscarriage; that is, a pregnancy that ended spontaneously, usually with no known medical cause."

番号1は出生、4は流産を表しています。

> Statistically this respondent is not unusual. Miscarriages are common and there are other respondents who reported as many or more.

統計的には、この回答者は珍しいことではありません。 流産は一般的であり、より多くの報告をした他の回答者がいます。

> But remembering the context, this data tells the story of a woman who was pregnant six times, each time ending in miscarriage. Her seventh and most recent pregnancy ended in a live birth. If we consider this data with empathy, it is natural to be moved by the story it tells.

しかし、このデータは、6 回も妊娠し、そのたびに流産になった女性のことを伝えています。彼女の7回目の妊娠は無事に出生という形で終わりました。このデータを感情移入して考察すれば、そのストーリーに感動するのは自然なことでしょう。
Sort Swift4 Array of Dictionary

```

class Message {
    var date: NSDate?
    var isSender: Bool
    var text: String?
    var friend: Friend?
}

 var messages: [Message]?
 ...
 

 messages = messages?.sorted(by: { (msg1, msg2) -> Bool in
        return msg1.date?.compare(msg2.date! as Date) == .orderedAscending
      })

```
VTuber月ノ美兎の名言からセリフを自動生成する(マルコフ連鎖)

# 概要
僕はね、もうプログラムなんかどうでも良くて君のことが好きなんやけど、でも、あの、その、だからマウスを握るんじゃなくて、君の手を握りたいけど、だけれども、だけれでも、僕はもう、こうやってコードを書いて、君に言葉を伝えるその術しか持ってないから、僕は君のために、プログラムを作る、も、ぼ、僕のために作りたいんです！

※ヨーロッパ企画さんの[愛の歌が溢れ出てきて止まらねえんだよ!のXコピペ](http://tangerine.hateblo.jp/entry/2018/03/15/222557)の改変

# 概要(真面目)
最近バーチャルYoutuberが物凄く人気ですね。自分の好きなVTuberは月ノ美兎さんです。
![tsukinomito.jpg](https://qiita-image-store.s3.amazonaws.com/0/99605/e1c9195d-8f36-ae43-e68f-ee80ba162e84.jpeg)
普段はクソとか言っちゃうくせに、ホラゲーでクッソビビったり視聴者に持ち上げられるとすぐ調子に乗っちゃったり大物Vtuberにはヘコヘコしてたりするのすこ。~~ガチ恋勢になっちゃうやばいやばい~~ 
月ノ美兎さんといえば圧倒的な名言の数々がありますが、これらを学習させて新しい名言作れねーか？というところで、文章の自動生成をやってみます。既に誰かがやってそうな感じもありますが許して。

# 構成
Python3+mecabでマルコフ連鎖を使用します。マルコフ連鎖はtwitterのbotなどでよく用いられている奴ですね。[【エヴァンゲリオン】アスカっぽいセリフをDeepLearningで自動生成してみる](https://qiita.com/S346/items/24e875e3c5ac58f55810)で試されている方法と同じです。
プログラムは[からあげさん作のマルコフ連鎖プログラム](http://www.blue-weblog.com/entry/2017/07/17/081819)をほぼそのまま使っています。ありがたい…！ 
ただ、Python2系はそろそろ使うのをやめたいので、Python3を使ってみましょう。

# 準備
Python3とmecabをインストールします。以下はHomebrewを使った例です。

```sh:コマンド
# mecabインストール
$ brew install mecab
$ brew install mecab-ipadic

# Pythonインストール。pyenvを使う場合は他の記事を見てください。
$ brew install python3
$ pip install mecab-python3
```

# プログラム
[こちら](https://github.com/karaage0703/TextGenerator)ですが、Python2系のプログラムになっています。encode/decodeを消去、xrange→rangeに変換、などを行います。 
いるかどうか不明ですが、プログラムもupするかも。

# データについて
[10分で分かる月ノ美兎【にじさんじ公式】](https://www.youtube.com/watch?v=03H1qSot9_s) 
[10分で分かる月ノ美兎 *２【にじさんじ公式】](https://www.youtube.com/watch?v=VN_rVULV9UM) 
などから適当に集めます。
ちゃんとやるなら音声抽出→テキスト変換が良さげだが、今回はおいしい発言だけさっと集めたいので手作業で。誰かデータベース化はよ。

```sh:tsukinomito.txt
きりーつ！気をつけ！
こんにちは、月ノ美兎です。
ムカデ人間観ましたね。
ムカデ人間分からない方の為に説明させて頂きますと、人が3人拉致されて口と肛門を繋げられるっていう…
ニワトリ並みの脳味噌されてますけど大丈夫なんですか？この人は。
クソ雑魚パンチやめてくださいちょっとw
(以下略)
```

# 実行
```sh:コマンド
# ここで学習
$ python PrepareChain.py tsukinomito.txt 
# ここで文章生成。10個作る場合
$ python GenerateText.py 10
```

# 結果
何回か実行して、いい結果を集めてみました。

```sh:
ラブプラスをやったのは高橋真麻さんをスマホの待ち受けにして並べて井の頭公園で展示とかですか？
もうさぁ！ガチャガチャガチャ！みたいなコスプレですね…もみじ。
ヨーロッパ企画さん以外のゲームをやるだなんて、もう音楽なんかどうでも良くて君の手を握りたいけど、だけれども、だけれでも、あの、その中でいいのがね、誰が得するの？みたいな感じで雑草食べてましたよ〜
でももみじは本当に人が食べるものじゃないんですか、それの延長みたいな音でこっちはさぁ、心肺停止するんですか！ちょっと…
洗濯機の上でやってるんですか、それの延長みたいな音でこっちはさぁ、心肺停止するんだよコイツら…いい加減にしてくrあっそんなこと言ってはいけない…コココココココンじゃないですか？わたくしの顔を写しています
わたくし、成績優秀容姿端麗なんちゃらかんちゃらなんかポケモンマスターみたいな感じで雑草食べてましたね
```
こいつ息をするように雑草食べてるな。 
サンプルが少ない(100行程度)なので、もっとヨーロッパ企画要素とか入れたほうがいいかもしれない。

# おわりに

今回はデータ数が少なかったのでマルコフ連鎖で試してみたのですが、意外と面白い結果が得られました。元の発言がカオスな奴ばっかりなのに、生成文があまり崩壊していないのがすごい。 
もっとデータが集められたら、KerasのLSTM辺りで試してみたりしてもよさそう。

# 参考資料
[月ノ美兎(公式チャンネル)](https://www.youtube.com/channel/UCD-miitqNY3nyukJ4Fnf4_A) 
[【エヴァンゲリオン】アスカっぽいセリフをDeepLearningで自動生成してみる](https://qiita.com/S346/items/) 
[マルコフ連鎖を使ってブログの記事を自動生成してみた](http://karaage.hatenadiary.jp/entry/2016/01/27/073000)
Webpacker を 3.0.2 から 3.3.1 に上げたらアセットプリコンパイルで3連続エラーになった

# 背景

[ローカルで Rails アプリを production モードで起動する \- Qiita](https://qiita.com/mokuo/items/b766ca36521530fd3084) を行なっている最中に、
アセットプリコンパイルで以下のエラーが発生しました。

```
ERROR in application-f48cf4883ba9fb65ce1e.js from UglifyJs
Unexpected token: operator (>) [./node_modules/popper.js/dist/popper.js:34,0][application-f48cf4883ba9fb65ce1e.js:14240,20]
```

詳細は覚えていないのですが、 Issue を眺めていると、修正がマージされているっぽいので、
バージョンアップすれば治るかも？と思って `bundle update webpacker` しました。
上記エラーは解消しましたが、他のエラーが発生しました。
解消してはエラー、解消してはエラーになったので、対処方法をまとめておきます。

# バージョン情報

```
Ruby : 2.4.2
Rails : 5.1.4
React : 16.2.0
Redux : 3.7.2
Webpacker : 3.0.2 -> 3.3.1
```

# 発生したエラーと対処方法

**発生したエラー**

- can't find executable webpack for gem webpacker (Gem::Exception)
- Cannot find module 'postcss\-smart\-import'
- TypeError: environment.plugins.set is not a function

以下に、それぞれの対処方法をまとめます。

## can't find executable webpack for gem webpacker (Gem::Exception)

エラーの詳細は以下。

```
/Users/yuichiro/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/rubygems_integration.rb:458:in `block in replace_bin_path': can't find executable webpack for gem webpacker (Gem::Exception)
	from /Users/yuichiro/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/rubygems_integration.rb:489:in `block in replace_bin_path'
	from ./bin/webpack:17:in `<main>'
```

[Heroku: can't find executable webpack for gem webpacker \(Gem::Exception\) · Issue \#1321 · rails/webpacker](https://github.com/rails/webpacker/issues/1321)
を読むと、 `bundle exec rails webpacker:binstubs` を実行しろと書いてあるので、その通りにしてこのエラーは解決した。

```
$ bundle exec rails webpacker:binstubs
Copying binstubs
       exist  bin
    conflict  bin/webpack
Overwrite /Users/yuichiro/projects/pomodoro-rails/bin/webpack? (enter "h" for help) [Ynaqdh] y
       force  bin/webpack
    conflict  bin/webpack-dev-server
Overwrite /Users/yuichiro/projects/pomodoro-rails/bin/webpack-dev-server? (enter "h" for help) [Ynaqdh] y
       force  bin/webpack-dev-server
```

どうやら、 webpacker の binstub が Webpacker のバージョンと合わなかったようだ。
この場合は、 `bin/webpack` と `bin/webpack-dev-server` で、この2つを上書きした。

## Cannot find module 'postcss\-smart\-import'

以下にまとめたので、参照ください。

[Webpacker バージョンアップ後、アセットプリコンパイルで Cannot find module 'postcss\-smart\-import' エラー \- Qiita](https://qiita.com/mokuo/items/d414b5c178a9515703ab)

## TypeError: environment.plugins.set is not a function

[webpackerを使ったrailsアプリを実行するとき、TypeError: environment\.plugins\.set is not a functionというエラーが出る \- Qiita](https://qiita.com/hidehiro98/items/fb52be640e82e5a06100)
を参考にして解消しました。ありがとうございます :bow: 

```js:config/webpack/environment.js(diff)
 const { environment } = require('@rails/webpacker')
 const webpack = require('webpack')

-environment.plugins.set(
+environment.plugins.prepend(
   'Provide',
   new webpack.ProvidePlugin({
     jQuery: 'jquery/dist/jquery',
```
Eclipse(EGit)でremoteリポジトリの設定をする

# 環境
Eclipse Oxygen.3 Release (4.7.3)

# やりたいこと
git コマンドでいうところの

```bash
git remote add origin <url> 
```

上記コマンドと同等の操作をEGitでやりたい

# 手順
Git Repository View を表示
![スクリーンショット 2018-03-25 17.40.58.png](https://qiita-image-store.s3.amazonaws.com/0/83314/179d6a3f-093b-206d-bed3-15fcad060edf.png)

Remotesを右クリックしてCreate Remoteを選択
![スクリーンショット 2018-03-25 17.41.25.png](https://qiita-image-store.s3.amazonaws.com/0/83314/e1e55723-c3f0-91b0-5590-69c80fa3abd3.png)

originのまま、OK
![スクリーンショット 2018-03-25 17.41.36.png](https://qiita-image-store.s3.amazonaws.com/0/83314/1324a021-7348-b1af-23ad-03538d31e31f.png)

リポジトリの接続設定を入力（※画像はssh接続の例）
![スクリーンショット 2018-03-25 18.01.28.png](https://qiita-image-store.s3.amazonaws.com/0/83314/5ac8de08-0f82-9e2a-f937-efbaef18ed31.png)

RemotesにoriginができていればOK
![スクリーンショット 2018-03-25 23.07.12.png](https://qiita-image-store.s3.amazonaws.com/0/83314/52084bee-93b1-ca12-4a11-2c87738bcfd8.png)
.mp4ファイルへの直リンクではまった >_<

ひじょーにつまらないところでハマったんですが、なかなか原因を検索しづらかったのでメモ。

とあるサイトで、 .mp4 へのリンクが開かない！　という指摘を頂きました。
.mp4 のリンクをクリックすると、バイナリファイルをテキストエディタで表示しちゃった、みたいなページが表示されます。
なんだけど、そのリンクのURLをコピーして直接ブラウザで開くと普通に mp4 が再生されます。なのでリンクのURLが間違っているとかではなさそう。
たぶん mime-type が正しく解釈されてないんだろうなーと思って `<a href="example.mp4" type="video/mp4"...>` みたいなのを付けてみたりしたんだけど駄目。

ファイル名に日本語が入ってるから駄目なのか？　とかあれこれやってみたのですが、最終的に、 `target="_blank"` で開こうとしているのが問題だった、というのが判明しました。
ちなみに、環境は Windows 2008 + IIS7.5 で、この環境の場合に発生するのかな？
SyntaxError: Non-ASCII character が出た時

Pythonの勉強を開始した際に以下のエラーが起きたのでその解決策をメモ書きする。

###発生したエラー
```SyntaxError: Non-ASCII character ```

###解決策
```# coding:utf-8 ```
とファイルの一番上に追加すれば解決する。

###この問題はなぜ起きるのか。

・Pythonにおける文字列はAsciiコードにてエンコーディングされる。
・そのAsciiコードには日本語は登場しない。
・だから、日本語が登場する文字コードを設定すればエンコーディング時の問題は解決される。

そのため、今回はutf-8を設定したが、shift-JISでも解決をすることができる。

※エンコーディングとは、データを一定の規則に従って、目的に応じた情報に変換すること
PythonでTwitter読み上げ機能を作る

# はじめに
せっかくラズパイを買ったので何か作ってみようと思い開発に着手しました。
目標は30分に1回、過去30分のツイートを読み上げてくれる感じです。
私自身PythonもLinuxもほぼ初心者ですので間違いがあると思いますので、その際はご指摘いただければ幸いです。

# 環境
-RaspberryPi 3 (Raspbian)
-Python3.5.3 (アップデートしてなかった…)
-AquesTalkPi
-Tweepy

# 事前準備
1.Twitterアプリの登録とTweepyのインストール
Qiita登録前に[はてなブログ](https://norinorinozakki.hatenablog.com/entry/2018/03/21/215731)に書いたのでそちらをご覧ください。

2.AquesTalkPiのインストール
OpenJTalkというソフトもありますが、AquesTalkPiを使ってみました。
個人の非営利利用に限り無償とのことなので。
インストールや使用方法は下記リンクのまとめを参考にさせていただきました。


#実装
上から順にコードの内容と意図を説明していきます。
例外処理してないけど…

```python
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tweepy
import subprocess
from datetime import datetime, timedelta, timezone
import pytz
```
今回使うパッケージをimportします。

```python
#時刻設定
JST = timezone(timedelta(hours=+9),"JST")
now = datetime.now(JST)
old = now- timedelta(minutes=30)
```

タイムラインの取得は件数指定しかできないようなので
スクリプトの起動時刻と比較して範囲外のツイートは読み上げないようにしたい
と思って時間を取得しています。わざわざ日本標準時にしている理由は後述。

```python
#key
CONSUMER_KEY = 'xxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

#TL取得(最新30件)
i = api.home_timeline(id="ユーザID", count=30)
```

Twitterアプリ登録で取得したキーを使ってTwitterAPIを呼び出します。
このコードでは自分のタイムライン上の30件を取得しています。
200件までいけるらしいけどフォローしている人が少ないので十分かと。

```python

#読み上げ機能
#抽出結果を逆に読み込み
for result in i[::-1]:
#ツイート時刻をJSTに変換
    created = pytz.utc.localize(result.created_at)
    created = created.astimezone(JST)
#指定した時間より前のツイートは対象外
    if created >= old:
#ツイートに"が含まれると動かないので置き換え
        text = result.text.replace("\"","")
        cmd = "/home/pi/aquestalkpi/AquesTalkPi -s 130 \""+ text +"\" |aplay"
        subprocess.call(cmd, shell=True)
    else:
        continue
print("done!")
```



取得したツイートのリストは新しい順になっているので逆からループさせています。
その後、created_atを日本標準時に変換し、スクリプト起動の30分前の時間と比較しています。
そして30分以内のツイートであればAquesTalkPiに渡し、それ以外なら次のツイートへ。
ちなみに -s 130 は速度変更のオプションでデフォルトは100です。

#定期実行の設定
cronを設定して今回作成したスクリプトを定期実行するようにします。

```
# m h  dom mon dow   command
0,30 9-23 * * 6,7 python3 call_aquestalkpi.py
```
これで毎週土日の9:00〜23:30まで30分毎に読み上げてくれます。

# 感想
Pythonのタイムゾーンの概念を知らなかったため時間比較が一番苦戦しました…
時間比較自体は下記の記事を参考にさせていただいたのですが全く上手くいかない。

というわけで色々調べたところ[公式ドキュメント](https://docs.python.jp/3.6/library/datetime.html)内に下記の記述を発見。
>"naive" と "aware" の2種類の日付と時刻オブジェクトがあります。

時間型には2種類のオブジェクトがあり、タイムゾーンを明示しないとnaiveになり、
naiveとawareの間では時刻の比較ができないとのことです。
そして今回取得してきたツイートの書き込み時刻はnaiveです。
そのためタイムゾーンの補正が必要だったわけです。勉強になりました。



というか普通に急にゆっくりが話すのびっくりするので早々に読み上げさせなくなる予感。。。

#参考URL
下記の記事を参考にさせていただきました、ありがとうございます！
[AquesTalk Pi の使い方まとめ](http://blog-yama.a-quest.com/?eid=970157)
[Pythonの UTC ⇔ JST、文字列(UTC) ⇒ JST の変換とかのメモ](https://qiita.com/yoppe/items/4260cf4ddde69287a632)
[[cron]定期的に処理を行う](https://qiita.com/shunyooo/items/69c3523a8c500b37f33f)
[Python datetime 日付の計算、文字列から変換【決定版】](https://qiita.com/7110/items/4ece0ce9be0ce910ee90)
[8.1. datetime — 基本的な日付型および時間型](https://docs.python.jp/3.6/library/datetime.html)
if文でfalseと比較する

if文で ```true``` や ```false``` と比較しないよう勧めている記事が多いですね。
```true``` と比較しないということには賛成ですが、```false``` と比較しないということには反対です。

```true``` や ```false``` と比較すべきではない理由としては主に以下の２つだと思います。

- 冗長
- 代入と間違える

理解はできます。

```c++
if ( enabled == true ) { ... }
if ( enabled == false ) { ... }
```

よりも

```c++
if ( enabled ) { ... }
if ( !enabled ) { ... }
```

の方がシンプルですし、```==``` で比較すると

```c++
if ( enabled = true ) { ... }
if ( enabled = false ) { ... }
```

のように間違って代入してしまう危険もあります。
(代入に関しては、言語によっては認められていませんし、最近のコンパイラは警告を出してくれることも多いと思いますが。)
代入になってしまうのを防ぐためにヨーダ記法を採用するという手もありますが、ヨーダ記法は直感的じゃなくて読みにくいので個人的には嫌いです。

それを理解した上で何故反対かというと、読み間違えるからです。

ソースコードを、それこそ流し読みレベルで読んでいると、この ! という１文字を見逃します(少なくとも私は)。
たった１文字見逃すだけで意味が大きく変わってしまいます。
また、真偽値を返す関数は is で始めることが多く、"i" と "!" が似ていることも見逃す要因になっていると思います。
以下のソースを読むとき、脳も目も疲れていると、```if ( isEnabled() )``` と読んでしまいます。

```c++
if ( !isEnabled() ) { ... }
```

「なんか i がボヤけてた気がするけど、画面をスクロールした影響かな？」とか思いつつも ! を認識しません。
人間は愚かな生き物で、一度 ```if ( isEnabled() )``` だと思い込んだら、再度読み直した時も ! を見逃すのです。

今まで何度か、この ! 見逃しが原因で、デバッグ中に「なんでこのif文に入るのか分からん！」と悩んだことがあります。

以下のように ! の後ろにスペースがあると、かなり有り難いですが、! が孤立してしまって見た目が好きになれません。

```c++
if ( ! isEnabled() ) { ... }
```

「ちゃんと注意深く読め」と言われれると何も反論はできないですけど、これが ```false``` と比較する理由です。

ということで、私は ```true``` との == 比較は行いませんが、```false``` との == 比較は行います。

```c++
if ( enabled ) { ... }
if ( enabled == false ) { ... }
```

IDEやテキストエディターが ! の文字色を変えてくれるようになったら考えが変わるかもしれませんけど。
[UE4] UE4に自作Moduleを追加する手順

# 概要
UE4に自作Moduleを追加する手順をまとめました。
手順を簡略化するために、バッチファイルを用いてModuleを生成しています。
バッチファイルを含むフォルダ（UEMG）は以下からダウンロード可能です。
https://github.com/KanuraPoison/UE_PRA01

動作環境：Windows 10, UE4.18.3, VisualStudio 2017

# 1. UEを起動し、新規プロジェクトを作成。
既にプロジェクト作成済みなら2. へ。
※今回はプロジェクト名は"MyProject"とし、C++のThirdPersonテンプレートを使用しました。
プロジェクトが作成されたらUEが起動するので、一旦閉じる。VisualStudioも閉じる。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/d6346e5d-6c35-d312-ccdd-904d845df3a6.jpeg)

# 2. 追加するModuleを作成
UEMGフォルダ内の"UEModuleGenerator.bat"を実行し、作成したいModule名を入力（今回は"MyModule"）

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/afc97136-38a4-e762-cd2b-7378038ee759.jpeg)


# 3. 作成したModuleをMyProjectへ
Outputフォルダ内に、入力したModule名と同名のフォルダが生成されるので、それをMyProject\Source\にコピペする。

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/4a091e05-7944-3e1b-5d3d-30012ee095d7.jpeg)

# 4. ファイル内容修正
以下の３つのファイル内容を修正（追記）し、MyModuleが反映されるようにする。
 - MyProject\MyProject.uproject
 - MyProject.Target.cs
 - MyProject.Build.cs
※Editor用のModuleを追加する場合はMyProject.Target.cs -> MyProjectEditor.Target.csに。

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/1fd90ea5-db37-bfc3-dcab-72d1170f0b82.jpeg)

# 5. Module反映
MyProject.uprojectを右クリックし"Generate Visual Studio project files"を実行し、MyModuleが追加・反映されていることを確認。

![05.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/6170c604-6236-332e-cd2d-21d871e09fac.jpeg)

# 6. UE上で確認
MyProject.slnをVSで開き、ソリューションをビルドしデバッグありorなしで開始する（どちらでもok）。ビルド確認メッセージが出たら”はい”を選択し続行。
UEが起動し、MyModuleが追加されていれば成功。やったね！

![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/7f418af1-a49e-49bc-2607-c02efad69468.jpeg)

# 参考サイト
http://historia.co.jp/archives/3097/
https://qiita.com/go_astrayer/items/5d001a9cde182488f9f3
to_sメソッドはnilを""で返してくれる

取得した値がnilの場合、""してくれるやり方ないかなと調べていたら、いとも簡単な方法が見つかった。
a = nilの場合
a.to_sは、""となる。

すげ〜、ifで場合分けする必要なし!!
CloudFormationでRoute did not stabilize in expected timeが出る場合

CloudFormationで以下のようなエラーが出る場合があります。

```bash
Route did not stabilize in expected time
```
以下のtemplateで`PNPrivateRoute`(`AWS::EC2::Route`)  を作成する際に発生しました。5分くらい処理が止まり、このエラーが出て終了してしまいます。

```yaml
...

  PNNatGateway:
    Type: 'AWS::EC2::NatGateway'
    Properties:
      AllocationId: eipalloc-xxxxxx
      SubnetId: !Ref PNPublicSubnet
  PNPrivateRouteTable:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref PrivateNet
  PNPrivateRoute:
    Type: 'AWS::EC2::Route'
    Properties:
      RouteTableId: !Ref PNPrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref PNNatGateway

...
```

# 対応

`GatewayId`で指定している箇所を`NatGatewayId`に変更する。

```yaml
...

  PNNatGateway:
    Type: 'AWS::EC2::NatGateway'
    Properties:
      AllocationId: eipalloc-xxxxxx
      SubnetId: !Ref PNPublicSubnet
  PNPrivateRouteTable:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref PrivateNet
  PNPrivateRoute:
    Type: 'AWS::EC2::Route'
    Properties:
      RouteTableId: !Ref PNPrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref PNNatGateway

...
```
# 原因
上記のとおり、`GatewayId`はあくまで`AWS::EC2::InternetGateway`のIDを指定するプロパティであり`AWS::EC2::NatGateway`を指定したい場合は`NatGatewayId`を利用しなければならないためです。

# 備考
あまりにも挙動とエラーメッセージがわかりにくい..。
gem install pgでエラー（Can't find the 'libpq-fe.h header）

```
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
```

- ubuntu 16.04
- Ruby 2.5(rbenv)

以下で解決

```
% sudo apt-get install libpq-dev
```
SQLアンチパターンon Rails Ⅲ部（クエリ）

# はじめに
SQLアンチパターンをRailsの文脈で読み解いていきます。
この記事では、Ⅲ部 クエリのアンチパターン（13~18章）を取り上げます。

# リンク
- [SQLアンチパターンon Rails Ⅰ部（論理設計）](https://qiita.com/eduidl/items/8620787ffaf2b18922bf)
- [SQLアンチパターンon Rails Ⅱ部（物理設計）](https://qiita.com/eduidl/items/d535a25cd02c9007da29)
- [SQLアンチパターンon Rails Ⅳ部（アプリケーション開発）](https://qiita.com/eduidl/items/c39e9df63c990196fcdd)

# 本文
## 13. フィア・オブ・ジ・アンノウン（恐怖のunknown）
`null: false`を適切につけましょう。
`null`が嫌だからって、退職日に`2100-12-31`みたいな謎の値を入れるのはNG。
`&.`（ぼっち演算子）とか`try`とか`||`を適切に使ったらそこまで苦しめられることもない気もする。

## 14. アンビギュアスグループ（曖昧なグループ）
グループ内で最大値を持つ行を取得する、というのはActiveRecordだと無理っぽい。
パフォーマンスを妥協できるなら、rubyのコードで何とかする手はありますが、
そうでなければ、SQL書く（できれば、Window関数の`RANK()`とかを使いたい）とよいと思います。
そして、生SQL書くならクエリオブジェクトを作るのがよさそう。

## 15. ランダムセレクション

```rb
Bug.order('random()').take(1) # PostgreSQLの場合。MySQLだと`RAND()`ですかね。
```
がダメという話。1件取ればいいだけなのに、無駄に全件ランダムソートしているので遅い。とはいえ、

```rb
# NG
Bug.all.sample(1)
```
よりは遥かにましだし、

```rb
# NG
Bug.find(Bug.ids.sample(1))
```

よりも良さげ。
ただ、本に書いてある通り、以下がベスト。

```rb
# Best
Bug.offset(rand(Bug.count)).take(1)
```

(参考：[【Ruby on Rails】テーブルのレコード数を取得する - Model](https://qiita.com/operandoOS/items/f932ecac5a7e9cc9f098)のコメント欄)

## 16. プアマンズ・サーチエンジン（貧者のサーチエンジン）
ElasticSearchとか。

## 17. スパゲッティクエリ

クエリが複雑にならないように、「困難は分割せよ」という話。
Railsにおいては、scopeを切ったりすることがそれにあたりそう。
とはいえ、ActiveRecordでやってる限り、そんな滅多なことにならないのではという気がする。
そうなりやすいのは生SQLを書くときで、そのときの対処は本を参考に。
WITH句とか使うと少しわかりやすくなるか？

## 18. インプリシットカラム（暗黙の列）
`select(:id, :name)`とかすると、カラムが絞れますが、メソッド呼び出しでどのカラムが必要とかあまり気にしたくないので、使うことがあまりない。
とはいえ、カラム数が非常に多い場合`select`も必要になってくるかもしれません。
RubyのArrayが欲しい場合には、`pluck(:id, :name)`なんかも使えますね。
`rPoint`のようなフィールドに対して、lombokとEclipseでgetterの名前が異なる



# 環境
* Eclipse Pleiades 4.7.2(Build id: 20171218-0600)
* Java8(1.8.0_152)
* lombok 1.6.20(プロジェクトに取り込んだlombokとEclipseにインストールしたlombokは同じバージョン）

# 背景
lombokを利用する前はEclipseのgetter/setter生成機能を使っていました。


![image](https://qiita-image-store.s3.amazonaws.com/0/37903/7bbac264-c540-5407-de09-321b9acd8848.png)

この状態からlombokに移行する際、`rPoint`のようなフィールドに対応するメソッドでハマりました。


# `rPoint`のようにキャメルケースの区切りが1文字の場合、lombokとEclipseでメソッド名が異なる

フィールド`sPoint`に対して、Eclipseは`getsPoint()`というメソッドを作成します。
プレフィックス`get`の次の文字が小文字です。

```java:TwoCharacter.java
/* Eclipseの機能で生成したgetterも追加 */
public class TwoCharacter  {

	private String sPoint = "sPoint";

	public String getsPoint() {
		return sPoint;
	}
}
```

一方lombokは、`getSPoint()`というメソッドを生成します。
プレフィックス`get`の次の文字が大文字です。

```java:TwoCharacter.java
@Getter
public class TwoCharacter  {

	private String sPoint = "sPoint";

	public void print() {
		System.out.println(getSPoint());
	}
}
```


# まとめ
キャメルケースの区切りが1文字の場合は、注意が必要！
【GoogleChrome】新しいタブにニュース記事一覧を表示する拡張機能を作った

# 概要
GoogleChromeの拡張機能を作る企画第2弾です。第1弾は[こちら](https://qiita.com/mkt120/items/fb557605cd2ee0521034)。
新しいタブにニュース記事一覧を表示する拡張機能を作りました。

# 準備 ニュース記事取得API

以下のページでAPIキーを取得を取得してアクセスできるようにする。

Google News API
https://newsapi.org/s/google-news-api

[Get API key to start searching GoogleNews]をクリックして
必要事項を入力して[Submit]すれば発行できる。

# コード
Githubに上げてます。
https://github.com/mkt120/newTabExtention/tree/main/googleNews

## リクエスト

以下をページを参考にリクエスト＋レスポンス取得処理を実装。

ピュアなJSでAPIリクエストをするメモ（jsonとjsonp）
https://qiita.com/ikuwow/items/ed5f3c9ee0bd6147b7f3#json%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88

一番ハードル高い箇所と思っていましたが、すっごく簡単に解決できました。
ありがたやーです。

```js:googleNews.js
const URL_NEWS_API = "URLを張り付ける";

// 中略

requestAjax(URL_NEWS_API, function(response){    
    for (var i in response.articles) {
      var div = createNewsItem(document, response.articles[i]);
      document.body.appendChild(div);
    }
});
```

## コンテンツ表示
情報取得ができれば、あとはレスポンスに合わせてコンテンツを生成するだけ。

```js:googleNews.js
function createNewsItem(document,article) {
  var div = document.createElement("div");

  // 中略

  // サムネイル
  var img = document.createElement("img");
  img.setAttribute('class', CLASS_NEWS_IMG);
  img.src = article.urlToImage;
  div.appendChild(img);

  // テキスト
  var a = document.createElement("a");
  a.innerHTML = article.title;
  a.href = article.url;
  div.appendChild(a);
  
  return div;
}
```

# そんな具合で
できたものがこちら。まだまだ改善の余地はあるけど、まずは実現したいことが実装できた。
![newtab.png](https://qiita-image-store.s3.amazonaws.com/0/165833/922dda15-2316-2a72-b889-c187c6ebb0ca.png)

#最後に
Android Javaしか書けない私なので、HTMLとかCSSとかJavascriptの勉強も兼ねてですが、
将来的にはiGoogleの機能を独自実装できるようになることを目指しています。

[第2.5弾を投稿しました。](https://qiita.com/mkt120/items/b7c290f88ba8914aedb4)
C#で数学パズル - センチュリーパズル(西洋小町)を効率よく解く


小町数を使った数学パズルの第7弾です。たぶん、小町数を使ったパズルはこれが最後。

## センチュリーパズルとは

1～9までの数字を1回だけ使って帯分数をつくり、その値が100を表すようにするパズルをセンチュリーパズルと言います。

別の表現だと、「K + N / D = 100」を満たす K,D,Nを求めよ。ただし、K,N,Dは1～9の数を1つずつ使用すること。

となります。

例えば、

```
3 + 69258 / 714 ＝ 100
```

は求める答えの一つです。

欧米で知られている小町数パズル（いわゆる西洋小町パズル）のひとつです。（小町: 1-9が一つずつで構成されている）
 

## どうやって解くか

「[3つの式が等しくなる小町数]()」では、再帰処理をし1-9の順列を求めることで解を求めました。このセンチュリーパズルも同様の手法が使えますが、ここでは別のアプローチを取ることにします。
K + N / Dのそれぞれが、正の数であることから、Kは、1から99までの値に絞られます。
つまり、

```cs
 for (int k = 1; k <= 99; k++) {
     ...
 }
```

というループの中で、N,D を求めてゆけば良いことになります。
k=3の場合を考えてみると、N/Dは、97になるので、
```
97/1, 194/2, 291/3, 388/4, 485/5,...
```
と調べてゆき、K,N,Dが1-9で構成されていれば、求める答えになります。

N,Dは桁数がどんどん増えてゆきますから、K, N,Dの桁数の合計が10桁以上になったら、小町を満たさなくなりますので、Kの処理を終わります。

このパズルは再帰処理を使わないので、容易に理解できると思います。

## C#のコード

これをC#のコードにしたのが、以下のコードです。

```cs
using System.Linq;
using System.Collections.Generic;

namespace CenturyPuzzleApp {
    public class Answer {
        public int WholeNumber { get; set; }    // K K以外の名前を付けたが...
        public int Denominator { get; set; }    // D 分母
        public int Numerator { get; set; }      // N 分子
    }

    public class CenturyPuzzle {
        public IEnumerable<Answer> Solve() {
            // CenturyPuzzle
            // 整数部を基準にして、総当りで求めている
            for (int k = 1; k <= 99; k++) {
                var x = 100 - k;     // X == N / D
                var denominator = 1; // 分母 もっと大きな数から始められるはずだが...
                while (true) {
                    // 分子  K + N / D = 100 となる N を求めている --> N = D * (100 - K)  
                    var numerator = denominator * x;
                    var frac = $"{k}{numerator}{denominator}";
                    if (frac.Length > 9)
                        // これ以上やっても解はない。小町にはならない
                        break;
                    if (IsKomachi(frac)) {
                        yield return new Answer {
                            WholeNumber = k,
                            Numerator = numerator,
                            Denominator = denominator
                        };
                    }
                    denominator++;
                }
            }
        }

        // 小町数か、（引数は数値を文字列に変換したもの）
        private bool IsKomachi(string s) {
            return s.OrderBy(c => c).SequenceEqual("123456789");
        }
    }
}
```

```cs
using System;
using System.Text;

namespace CenturyPuzzleApp {
    class Program {
        static void Main(string[] args) {
            var cp = new CenturyPuzzle();
            var sb = new StringBuilder();
            foreach (var a in cp.Solve()) {
                sb.AppendFormat("{0} + {1} / {2} = 100\n",
                                 a.WholeNumber, a.Numerator, a.Denominator);
            }
            Console.WriteLine(sb.ToString());
        }
    }
}
```

## 結果

```
3 + 69258 / 714 = 100
81 + 5643 / 297 = 100
81 + 7524 / 396 = 100
82 + 3546 / 197 = 100
91 + 5742 / 638 = 100
91 + 5823 / 647 = 100
91 + 7524 / 836 = 100
94 + 1578 / 263 = 100
96 + 1428 / 357 = 100
96 + 1752 / 438 = 100
96 + 2148 / 537 = 100
```

最初のKの値が3からいきなり81に飛んじゃうんですね。

---

この記事は、Gushwell's C# Programming Pageで公開したものをに加筆・修正したものです。
explode関数の使い方

explode関数を使うことで、区切り文字列を配列に変換することができます。
第一引数に区切り文字列、第二引数に入力文字列をとります。

（例）
```$a = explode("_","hop_step_jump");
echo $a[0]; //hopが出力される
echo $a[１]; //stepが出力される
echo $a[２]; //jumpが出力される```

今回の入力文字列の"hop_step_jump"の区切り文字列は"_"なので、第一引数に"_"を取っています。
もし入力文字列が"hop,step,jump"ならば、
explode(",","hop,step,jump")
という記述になります。

参考
http://php.net/manual/ja/function.explode.php
アセットプリコンパイルで open-iconic の読み込みエラー

# バージョン情報

Ruby : 2.4.2
Rails : 5.1.4
React : 16.2.0
Redux : 3.7.2
Webpacker : 3.3.1

# エラー内容

アセットプリコンパイルで、以下のエラーが発生

```
ERROR in ./app/javascript/src/application.scss
Module build failed: ModuleNotFoundError: Module not found: Error: Can't resolve '../fonts/open-iconic.eot' in '/Users/yuichiro/projects/pomodoro-rails/app/javascript/src'
```

# 原因

`open-iconic-bootstrap.scss` の4行目で、アイコンのフォントを相対パスで読み込んでいること。

```scss:node_modules/open-iconic/font/css/open-iconic-bootstrap.scss
$icon-font-path: '../fonts/' !default;
```

open-iconic のディレクトリ構成は以下なので、 相対パスが間違っている訳ではないし、
develpment 環境では動いていたが、 production ではルートから読み込まないといけないっぽい。

```:open-iconicのディレクトリ構成
open-iconic
├── font
│   ├── css
│   └── fonts
├── png
├── sprite
├── svg
└── webp
```

# 対処方法

open-iconic を読み込んでいる箇所の前で、 `icon-font-path` を上書きする。

```js:app/javascript/src/application.scss
$icon-font-path: '~open-iconic/font/fonts/'; // ModuleNotFoundError エラー対策
@import '~open-iconic/font/css/open-iconic-bootstrap';
```

ちなみに `$icon-font-path: '../fonts/' !default;` の `!default`　は 「既に定義されている場合は上書きしない」という意味なので `application.scss` から上書きできる。

- 参考
    - [Error with Webpack Can't resolve '\.\./fonts/glyphicons · Issue \#129 · maxmx/bootstrap\-stylus](https://github.com/maxmx/bootstrap-stylus/issues/129)
    - [変数宣言の\!defaultは「既に定義されている場合は上書きしない」という意味 \- Qiita](https://qiita.com/yuku_t/items/0bebe541432cdfad4e14)
Makeでヘッダファイルの依存関係を生成するルールを独立させると混乱する

##はじめに

C や C++ で書かれたプログラムのビルドの際、Make でヘッダファイルの依存関係に対応するには、gcc の -MMD オプションを組み合わせればよいことが知られている。

- [Makeでヘッダファイルの依存関係に対応する][link1]

通常はこの記事と同じように -MMD オプションを使ってコンパイルと依存関係ファイル .d の生成を同時に行うことが多いと思われるが、諸事情があり、コンパイルと依存関係ファイルの生成を別々に行いたくなった。その際のハマりどころについて調査した内容を Qiita に投稿した。

- [Makeでヘッダファイルの依存関係を生成するルールを独立させる][link2]
- [Makeでヘッダファイルの依存関係を生成するルールを独立させる・続][link3]

ところが、今までの試行錯誤はほとんど骨折り損のくたびれ儲けであることがわかった。

##結論

結局、以下のような Makefile に落ち着いた。

```Make:Makefile
PROG := myapp
SRCS := main.cc foo.cc
OBJS := ${SRCS:%.cc=%.o}
DEPS := ${SRCS:%.cc=%.d}

CXX := g++

all: ${PROG}

${PROG}: ${OBJS}
	${CXX} -o $@ ${OBJS}

%.o: %.cc
	${CXX} $< -MM -MP -MF $*.d
	${CXX} -c $< -o $@

clean:
	${RM} ${PROG} ${OBJS} ${DEPS}

ifeq ($(findstring clean,${MAKECMDGOALS}),)
  -include ${DEPS}
endif

.PHONY: all clean
```

以下のように、依存関係ファイルの生成とコンパイルを単に2行に分けて書いている。

```Make
%.o: %.cc
	${CXX} $< -MM -MP -MF $*.d
	${CXX} -c $< -o $@
```

パターンルールでは、`$*` はターゲットの語幹部分が格納されている自動変数で、今回の場合は `%.o` の `%` の部分に相当する。余談だが、複雑なパターンマッチを設定していると `$*` に格納される文字列がやや奇怪なことになるため、注意が必要である。例えば [GNU Make のマニュアル][link4]には以下のような例が挙げられている。

> <dl><dt>$*</dt><dd>The stem with which an implicit rule matches (see How Patterns Match). If the target is dir/a.foo.b and the target pattern is a.%.b then the stem is dir/foo. The stem is useful for constructing names of related files.</dd></dl>

##解説

[前に書いた記事][link2]で述べた通り、最初は以下のように依存関係ファイル .d の生成ルールとオブジェクトファイル .o の生成ルールを独立させて書いていた。

```Make
-include ${DEPS}

%.d: %.cc
	${CXX} $< -MM -MP -MF $@
%.o: %.cc %.d
	${CXX} -c $< -o $@
```

というのも、「別のファイルを生成するルールは別の依存関係があるはずだ。それなら別々のルールとして書くべきだ。それが Makefile というものだ。」と**思い込んでいた**のであった。

しかし、よくよく観察してみると、「オブジェクトファイルは再生成しなければならないが、依存関係ファイルは再生成しなくてもよい」などという状況は普通は起こらないことに気づいた。オブジェクトファイルを再生成しなければならない状況ではソースコードが更新されているはずであり、それならやはり依存関係ファイルも再生成しなければならない。

その上、依存関係ファイルの生成ルールが独立して存在していることで、依存関係ファイルのインクルードの際に「Dry-run でも生成されてしまう」とか「わざわざ生成してから clean している」とか、無用な混乱を生んでいたのである。

ということは、手の込んだことをせずに、依存関係ファイルの生成とコンパイルを単に2行に分けて書くだけのほうがよかったということになる。

##参考文献

- [Makeでヘッダファイルの依存関係に対応する][link1] (wagavulin's blog, 2012/04/05)
- [Makeでヘッダファイルの依存関係を生成するルールを独立させる][link2] (Qiita, 2018/03/22)
- [Makeでヘッダファイルの依存関係を生成するルールを独立させる・続][link3] (Qiita, 2018/03/24)
- [10.5.3 Automatic Variables][link4] (GNU Make Manual, 2016/05/22)

[link1]:http://www.wagavulin.jp/entry/20120405/1333629926
[link2]:https://qiita.com/shu_ohm1/items/e84b5e5a3c461add03b4
[link3]:https://qiita.com/shu_ohm1/items/7f21d88a08c4fb01634c
[link4]:https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html#Automatic-Variables
lombokで生成されたgetterが、重複する場合の動き



# 環境
* Eclipse Pleiades 4.7.2(Build id: 20171218-0600)
* Java8(1.8.0_152)
* lombok 1.6.20(プロジェクトに取り込んだlombokとEclipseにインストールしたlombokは同じバージョン）


# 検証

lombokで生成されたgetterが、重複する場合の動きをまとめました。


## フィールド`a`と`A`が存在する場合

フィールド`a`と`A`から、どちらも`getA()`というメソッドが生成されます。
`getA()`を実行すると、どちらのフィールドの値が取得されるのでしょうか？
結果は以下の通りです。

```java:OneCharacter.java
/** 最初が小文字のフィールド */
@Getter
public class OneCharacter  {

	private String a = "a";

	private String A = "A";

	public void print() {
		System.out.println(getA()); //⇒"a"
	}
}
```


```java:OneCharacter.java
/** 最初が大文字のフィールド */
@Getter
public class OneCharacter  {

	private String A = "A";

    private String a = "a";

	public void print() {
		System.out.println(getA()); //⇒"A"
	}
}
```


## フィールド`A`とメソッド`getA()`が定義されている場合

クラス内で定義されたgetterと、lombokで生成されたgetterが同じ名前の場合、どちらが呼ばれるのでしょうか？

結果は以下の通りです。

```java:OneCharacter.java
@Getter
public class OneCharacter  {

	public String getA() { return "getA()";}

	private String A = "A";

	public void print() {
		System.out.println(getA()); //⇒"getA()"
	}
}
```

```java:OneCharacter.java
@Getter
public class OneCharacter  {

	private String A = "A";
    
	public String getA() { return "getA()";}

	public void print() {
		System.out.println(getA()); //⇒"getA()"
	}
}
```

宣言の順番に関係なく、クラス内で定義されたgetterが呼ばれました。


# まとめ

* lombokで生成されたgetterより、クラス内で定義されたgetterが優先される
* lombokで生成されたgetterが重複する場合、最初に宣言されたフィールドに対応するgetterが優先される

# 追記
@inabajunmr からコメントをいただきました。

上記の現象は、[lombok @Getter and @Setter](https://projectlombok.org/features/GetterSetter)に書いてありました。

>You can annotate any field with @Getter and/or @Setter, to let lombok generate the default getter/setter automatically.
A default getter simply returns the field, and is named getFoo if the field is called foo (or isFoo if the field's type is boolean). A default setter is named setFoo if the field is called foo, returns void, and takes 1 parameter of the same type as the field. It simply sets the field to this value.
PHPの1ヶ月後とは何か

ご大層なタイトルつけたけど、納得いかない度お高めの日付関連といえば「１ヶ月後」って言ってんのになんでだよーの、あれです。
せっかくなのでDatetimeクラスと並べて書きます

# 前提条件

- MacOS High Sierra 10.13.3
- PHP7.1.7

# 今回のお題
PHPの「+1 month」って・・・


# strtotimeの+1month
まぁPHP書いたことある人なら、一度は「何でだよ？」って思う、あれです。

```php
<?php
$t1 = strtotime('2018-01-31 00:00:00');
$d1 = strtotime('+1 month', $t1);
echo date('Y-m-d H:i:s', $d1) . "\n";

$t2 = strtotime('2018-02-01 00:00:00');
$d2 = strtotime('+1 month', $t2);
echo date('Y-m-d H:i:s', $d2) . "\n";

$dt1 = new DateTime('2018-01-31 00:00:00');
$dt1->add(new DateInterval('P1M'));
echo $dt1->format('Y-m-d H:i:s') . "\n";

$dt2 = new DateTime('2018-02-01 00:00:00');
$dt2->add(new DateInterval('P1M'));
echo $dt2->format('Y-m-d H:i:s') . "\n";
```
とりあえず、一番気になっていたstrtotimeのワナはDatetimeでも同じなのか確認しておきます。

早速実行。

```
2018-03-03 00:00:00
2018-03-01 00:00:00
2018-03-03 00:00:00
2018-03-01 00:00:00
```

どうしてこうなったんですかね・・・？Datetimeクラスも同じですね。
1/31の1ヶ月後が3/3で、2/1の1ヶ月後が3/1って・・・
改めて並べると、おかしさ満載ですね。
Datetimeクラスが出てきたときに、もしや・・・？って期待したんですけど、まぁそんな変わるわけなかったw

誰かに「1/31の１ヶ月後って何日？」って聞いて、「3/3だよ」って答えられたら「え？」って思いません？
しかし厳密に1/31の1ヶ月後とはいつか？って・・・はて？

ちなみにシェルスクリプトで1ヶ月後って書くと

```shell
#!/bin/sh

START='2018-01-31'
TARGET=`date -d "$START 1month" "+%Y-%m-%d"`

echo $TARGET
```

実行すると

```
2018-03-03
```

Linuxがこうだから・・・と言われれば納得する・・・？(モヤモヤするけど)
翌月に同じ日付がある1から28日までは問題ないです。
29から31日が問題になってきます。
とりあえず、+1 monthには、Datetimeクラスだろうが罠があるので、うっかり使うと痛い目にあうよ？っていうお話。
もちろん、-1 monthも。

日付まで必要ない場面なら、1日扱いで+1 monthするのはアリだと思います。
1日ならどの月でも一番最初の日ですからね。
日付まで必要ですっていう場合は、作ってるものの仕様に合わせる必要があるので、こういう場合はどうするのか？っていうところを詰めておく必要があります。
2/29生まれの人は、うるう年じゃない年は、いつ年齢カウントアップなのか？みたいなのと同じです。（4年に1回しか年取らないとか言いはるのは個人の自由ですw）
Pythonライブラリを学ぶ　SQLite3編

#環境
- python3.6


#学習のゴール
- 接続・切断ができる。
- SQLを実行できる

#実践
##接続と切断
以下のコードを実行してみましょう。
※実行した後カレントディレクトリにdb.sqlite3というファイルが作成されます。

```python:test1.py
import sqlite3

#db.sqlite3に接続
con = sqlite3.connect('./db.sqlite3')

#db.sqlite3とのコネクションを切断
con.close()
```

###解説
```python
con = sqlite3.connect('./db.sqlite3')
```

ここで、db.sqlite3に接続するConnectionオブジェクトを、
conという名前で作成しています。
指定したDBファイルがない場合は自動で作ってくれます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/237938/17ecfa3e-8e1f-3553-a605-3a22ca0b628e.jpeg" width=70%>


次に、

```python
con.close()
```

これはdb.sqlite3との接続を切ります。
closeを忘れると他のプロセスがそのDBファイルにアクセスできなかったりするので必ずcloseしておきましょう。

ここまででSQLiteへの接続と切断について学びました。
次はSQLの実行方法について学びましょう！

##SQLの実行

以下のコードを実行してみましょう。

```python:test2.py
import sqlite3

con = sqlite3.connect('./db.sqlite3')

#Cursorオブジェクトを作成
cur = con.cursor()

#SQLの実行
cur.execute("create table person(id integer, name text)")
cur.execute("insert into person values(1, 'yamada')")
person = cur.execute("select * from person")
print(list(person))

#追加したレコードをコミット
con.commit()
con.close()


```
結果

```bash
[(1, 'yamada')]
```

###解説

```python
cur = con.cursor()
```
ここではCursorオブジェクトをcurという名前で作成しています。
cursorオブジェクトは、SQLを実行したりその結果を受け取るためのインターフェース的な役割を担っています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/237938/31493236-224b-4b2f-8160-c7516ce2cec7.jpeg" width=70%>


このCursorオブジェクトの持つexecuteメソッドを使ってSQLを実行します。

```python
#SQLの実行
cur.execute("create table person(id integer, name text)")
cur.execute("insert into person values(1, 'yamada')")
person = cur.execute("select * from person")
print(list(person))
```

create文やinsert文などのデータを追加する操作には返り値はありません。
select文を使用すると、返り値をcursorオブジェクトが保持してくれるので、
list()でリスト型に変換してprint()で表示できます。

最後にcommitです。

```python
con.commit()
```

Connectionオブジェクトが持つcommitメソッドは、追加したレコードを恒久的に保存してくれます。
commitを忘れるとせっかく追加したデータが消えてしまうので注意が必要です。

これでSQLの実行ができるようになりました！

#まとめ
もう一度学習のゴールを確認してみましょう。

- [x] 接続、切断ができる
- [x] SQLを実行できる

すべて達成できましたね。
お疲れ様でした。

#関連資料
pythonドキュメント
https://docs.python.jp/3/library/sqlite3.html
rails 

コントローラー名は複数のデータ（コントローラー）を作るので
ファイル名は複数形にする。

ルーティング内に
resources コントローラー名　と記入すると７つのアクションの全てを利用できるようになる。


```
Rails.application.routes.draw do
  devise_for :users

  root 'tweets#index'
 ⑴ resources :tweets   #tweets_controllerのresourcesメソッド（７つのアクション）
 ⑵　resources :users, only: [:show] #users_controllerのresourcesメソッド
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　showアクションのみ定義している

end

```

tweetsコントローラは7つのアクション全て定義されるが
usersコントローラはshowアクションしか使っていないので、onlyオプションでアクションの指定をしましょう。
PythonからEvernoteにアクセスする下準備(その1)

Evernote上の情報をPythonから参照する個人的ツールが欲しいのでその下準備方法をメモしておく。

### 環境

Windows10
Python 3.6
PyCharm 2017.3

### EvernoteのSandbox環境でユーザーを作成

https://sandbox.evernote.com/ にアクセスしてアカウントを作成

### 開発用トークンの取得

Sandbox環境にログインした状態で下記URLへアクセスして開発用トークンを発行し、下記2つをメモしておく。

https://sandbox.evernote.com/api/DeveloperToken.action

- Developer Token
- NoteStore URL:

#### EvernoteのSDKをインストール

- PyCharmでSDKのパッケージをインストール
  - File -> Default Settingを選択
  - 左側メニューのProject Interpreter を選択
  - 右側の"+"マークをクリック
  - "evernote"で検索してインストールしているPythonのバージョンのSDKをインストール

#### githubから動作確認用サンプルのpythonファイルを取得

- https://github.com/evernote/evernote-sdk-python3/ からzipでダウンロード
- EDAMTest.pyの下記の部分を取得した開発用トークンに変更

```python
authToken = "your developer token"
```

#### PyCharm上でEDAMTest.pyを実行

```
https://sandbox.evernote.com/shard/s1/notestore
Found  2  notebooks:
  *  <Inbox>
  *  プロジェクトその１
```

のようにSandbox上のノートブック一覧が取得出来ている。