OmniAICreator/Qiita-1.07M huggingface dataset:
RasberryPiで感圧センサーを動作させるまで

##準備

###用意したもの
1)RasberryPi 3B 本体
2)RasberryPi周辺機器(電源、MicroSD、USBキーボード、USBマウス、HDMIケーブル、ディスプレイ)
3)感圧センサー(四角形)
https://www.switch-science.com/catalog/2615/
4)ＡＤコンバータ　ＭＣＰ３００２
http://akizukidenshi.com/catalog/g/gI-02584/
5)抵抗 10kΩ
6)ジャンパワイヤー 10〜15本くらいあればOK
7)ブレッドボード

##進め方
【STEP1】：RasberryPi 3Bと周辺機器をセットし、RasberryPiを立ち上げます
【STEP2】：RasberryPiをWifiに接続します。（STEP4でネットワークに接続が必要になります）
【STPE3】：RaspberryPi上のSPI driverを有効にする
画面左上のラズベリーパイHOMEボタンを押して、Preference->RasberryPiConfiguration
と進み、InterfacesタブのSPI:をEnabledにして、OKボタンを押します。

【STEP4】：A/Dコンバーターを利用するにあたって、SPI-Driverのインストールが必要なので、下記3つのコマンドをターミナルから入力し、インストールします。

$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install

Writing /usr/local/lib/python2.7/dist-packages/spidev-3.3.egg.info
が出力されればインストール成功

Fatal error:Python.h:No such file or Directory
のエラーが出た場合は、python-devのインストールが出来ていないので、
以下のコマンドでpython-devをインストールします。
sudo apt install python-dev 

【STEP5】：下記URLを参考に回路図を組み立て、pythonのプログラムを実行します。
http://qiita.com/f_nishio/items/4b9723c4e622a51aaeb5

※配線は以下のURLに載っているものが見やすいかもです（上記URLのものと回路は一緒です）
http://azwoo.hatenablog.com/entry/2014/01/25/154140

配線する際には、ただ真似して作るだけではなく、どこに何を繋いでいるのかきちんと把握しながら
すると、何をしているかをざっくりとですが理解できて良いと思います。

### まとめ
以下の5つのSTEPで感圧センサーを動作させることができると思います。
動作結果は感圧センサーを押す前は2や3などの小さな数値ですが、
感圧センサーを押すと、900くらいの大きな数値が出るようになります。
量子オセロというゲームを作りました

## はじめに
プログラミングを独学で勉強中の大学院生です。
量子オセロというゲームを作ったので、その実装を行いました。
[「プログラミング初心者がpythonの勉強がてら、オセロAIを作ってみた」をリファクタリングさせていただいた](http://qiita.com/shiracamus/items/f03127819fff0f1a4349#_reference-40542ad712767f14034b)を一部参考にさせていただきました。

Windows10, Chromeでのみテストしています。

[こちら](https://eduidl.github.io/quantum-othello/)で遊べます。

---

__注：当初はてなブログに書いていた記述をこちらに移動しました。__


量子人狼や量子将棋を知っているでしょうか。量子人狼であれば役職や生死を、量子将棋であれば駒を重ね合わせとして扱うような新しいゲームです。詳しくは、各自調べていただくとして、こんな感じの""量子ゲーム""を作りたいなと思いました。

そして一つの可能性に気付きました。オセロです。量子大富豪も考えたのですが、「[マスクメン](https://oinkgms.com/jp/maskmen)」の劣化にしかならなかったので、諦めました。

## ルール

基本は通常のオセロ同じです。大きく違うのは、石の色が重ね合わせの状態にあることです。

まず、初期配置を考えます。オセロのルールをあまり弄りたくなかったので、中央に４つ石を置くというルールはそのままです。ただ石は量子化されているので、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141207/5e1aadf2-e97a-a0d3-b053-e81194b6c992.png)
の16通りの状態があります。先手が、右上の石のさらに右上の位置に石を打つとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141207/2a07e5db-b719-6b6e-09a3-39df49c5bed1.png)
の8通りの場合、石を返すことができないため、石を置けませんが、以下の8通りは石を返すことができ、石を置けます。ここで注意しておきたいのは、持ち石も量子化されているため、相手の色を置いて返すことができる場合も含むということです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141207/dc79edcc-3f1c-97b3-e594-7b9000c31eed.png)
そして、実際に置いた結果が次の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141207/f43c1a57-ffa1-df9a-3d0a-c3bf97ceaf30.png)
先ほど持ち石が量子化されていると書きましたが、自分の色と相手の色が等確率だと勝負がつかないので、自分の色が相手の色より1.2倍でやすいことにし、対称性を崩しています。（盤の確率比は左上から、5：5：6：6：5：5：6：6となります。)

そして、このような複数の状態の重ね合わせを表わす手段として、それぞれの石が黒である確率(%)を用いています。例えば先ほど置いた石について計算する（存在比をそれぞれ足して比をとる）と、黒：白 = 24：20 = 6：5となることがわかります。つまり黒である確率は、6÷11×100≒55%となるので、55が表示されます。実際、下の図のようになります。グレーの丸は50を意味し、黒と白が22：22=1：1であることと合致します。

表記は0は白丸、1〜49は数字をそのまま白色で、50はグレーの丸、51〜99は数字をそのまま黒色で、100は黒丸で表わすことにしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141207/364234c5-0498-93a9-ae81-321e21b7b0bf.png)
次に後手が、白が1.2倍で表になりやすい量子石を置き、といった感じで手番を交代し、ゲームを進めていきます。

試合終了時、黒である確率が51以上の石を黒石、49以下の石を白石として扱い、石の数が多い方が勝ちです。
クロスエントロピー誤差の計算例

#追記：重大ミス
- - -
- - -
- - -
`binary_crossentropy`に変えたら精度が良くなったというのは勘違いでした。model.evaluate()で出てくる数字や学習中に出てくるaccuracyというのが `caetgorical_accuracy`ではなく `binary_accuracy`として表示されてしまっていたのが原因でした。
また、ここで手計算している `binary_crossentropy`というのもよくわからない計算をしたものになっています。混乱していた中で書いてしまった恥ずかしいミスです。こんなミスがあったということを覚えておくために残しておきますが、以下の情報は役には立ちません。
- - -
- - -
- - -

<del>kerasでcifar10の画像分類を試していたところ、最後の損失関数を`categorical_crossentropy`から `binary_crossentropy`に変えたら急に精度が良くなりました。</del>

###<del>70% -> 95%</del>


`categorical_crossentropy`と`binary_crossentropy`のイメージがつかなかったので手計算してみました。
これで合ってるかな・・・？
binary cross entropyの方が出力がなだらかになる感じですね。

##２クラス分類（categoricalもbinaryも同じ）
|y|p|
|:-:|:-:|
| 0 | 0.9 |
| 1 | 0.1 |

### if t = 0
-(0*log(0.1) + 1*log(0.9))
= 0.105

### if t = 1
-(1*log(0.1) + 0*log(0.9))
= 2.303

##３クラス分類① categorical
|y|p|
|:-:|:-:|
| 0 | 0.9 |
| 1 | 0.05 |
| 2 | 0.05 |

### if t = 0
-(1*log(0.9) + 0*log(0.05) + 0*log(0.05))
= 0.105

### if t = 1
-(0*log(0.9) + 1*log(0.05) + 0*log(0.05))
= 2.996

### if t = 2
-(0*log(0.9) + 0*log(0.05) + 1*log(0.05))
= 2.996

##３クラス分類① binary
|y|p|
|:-:|:-:|
| 0 | 0.9 |
| 1 | 0.05 |
| 2 | 0.05 |

### if t = 0
-(1*log(0.9) + 0*log(0.05) + 0*log(0.05))
= 0.105

### if t != 1
-(0*log(0.9) + 1*log(1 - 0.9))
= 2.303


##３クラス分類② categorical
|y|p|
|:-:|:-:|
| 0 | 0.6 |
| 1 | 0.3 |
| 2 | 0.1 |

### if t = 0
-(1*log(0.6) + 0*log(0.3) + 0*log(0.1))
= 0.511

### if t = 1
-(0*log(0.6) + 1*log(0.3) + 0*log(0.1))
= 1.204

### if t = 2
-(0*log(0.6) + 0*log(0.3) + 1*log(0.1))
= 2.303

##３クラス分類② binary
|y|p|
|:-:|:-:|
| 0 | 0.6 |
| 1 | 0.3 |
| 2 | 0.1 |

### if t = 0
-(1*log(0.6) + 0*log(0.3) + 0*log(0.1))
= 0.511

### if t != 1
-(0*log(0.6) + 1*log(1 - 0.6))
= 0.916
ABAP aRFC Call Sample Program

#aRFC Call ABAP sample
aRFC is very useful to process many data, especially when importing large volume of data.
This is memo of sample program.


```abap:Report.abap

DATA:
  gv_process TYPE i.

PARAMETERS:
  p_limit TYPE sy-uzeit,
  p_para  TYPE i,
  p_rfc_g TYPE rzlli_apcl.

START-OF-SELECTION.

  DATA:
    lt_order TYPE TABLE OF xxx.


  DO.

    GET TIME.
    IF sy-uzeit > p_limit.
      MESSAGE s398(00) WITH 'Finished'.
      EXIT.

    ENDIF.

    WRITE:/ sy-uzeit, 'Start Loop', sy-index.

    PERFORM f_select_target CHANGING lt_order.
    IF lt_order[] IS INITIAL.
      EXIT.
    ENDIF.

    gv_process = p_para.

    DO.

      GET TIME.
      IF sy-uzeit > p_limit.
        MESSAGE s398(00) WITH 'Finished'.
        EXIT.

      ENDIF.

      gv_process = gv_process - 1.

      PERFORM f_call_update
        CHANGING lv_index
                 lt_order.

      WAIT UNTIL gv_process > 0.
      CHECK lt_order[] IS INITIAL.
      EXIT.

    ENDDO.
    WAIT UNTIL gv_process = p_para.

* write result.

  ENDDO.
*&---------------------------------------------------------------------*
*&      Form  F_SELECT_TARGET
*&---------------------------------------------------------------------*
*       Select Targets
*----------------------------------------------------------------------*
FORM f_select_target  CHANGING et_order.

* Select Orders here

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  F_CALL_UPDATE
*&---------------------------------------------------------------------*
*       Call aRFC
*----------------------------------------------------------------------*
FORM f_call_update  CHANGING cv_index TYPE i
                             ct_order.


*  call aRFC
*  Performing f_end_of_call on end of task
* destination in group p_rfc_g

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  F_END_OF_CALL
*&---------------------------------------------------------------------*
*       Recieve Function
*----------------------------------------------------------------------*
FORM f_end_of_call  USING iv_task TYPE clike.


*  Recieve aRFC
*  Recieve results from function XXX
*   importing xxx = xxx
*  Performing f_end_of_call on end of task

ENDFORM.

```
[React] {ComponentName} is changing an uncontrolled input of type text to be controlled

## webコンソールで警告発生
> Warning: BasicInfo is changing an uncontrolled input of type text to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components

closeされたisuues内にそれらしきものがありました。（日本語訳）
https://github.com/twisty/formsy-react-components/issues/66

> 明確にするために、最初に値propとしてundefinedまたはnullを渡すと、コンポーネントは「制御されていない」コンポーネントとして寿命を開始します。 コンポーネントと対話すると、値を設定してそれを "制御された"コンポーネントに変更し、警告を出します。
>
> devブランチ（アルファクオリティ）は、より良いプロタイプのチェックを持っているので、将来これに関する警告を得るべきです。

なので、 `undefined` ・ `null` がpropsとして渡っているところを探し出して、デフォルトで `''`（空文字）が入るようにしてあげました。

## アンマウントされたコンポーネント内でのsetState、forceUpdate
> react.js v0.13rcからアンマウント済みのコンポーネントでsetState、forceUpdateが呼ばれたとしても、例外throwするのではなくWarningで留まる様になった。PromiseによってResolveされるのが大きく遅延した場合などにコンポーネントが先にアンマウントされてしまい、結果的に後になって例外が発生してしまう現象をどうにかしてほしい、という要望に答えてくれたみたいです。以下、setStateをアンマウント後のコンポーネントで呼び出した例。

## 参考
https://github.com/twisty/formsy-react-components/issues/66
https://github.com/facebook/react/issues/6779
http://stackoverflow.com/questions/37427508/react-changing-an-uncontrolled-input
http://qiita.com/kenfdev/items/dbe10e2f0256e22945ca
【Salesforce】データの一括削除の方法

# カスタムオブジェクトのtruncate
ビルド > カスタマイズ > ユーザインターフェースより以下をチェック

- [x] カスタムオブジェクトの切り捨てを有効化

ビルド > 作成 > オブジェクト > オブジェクト名をクリック
「切り捨て」ボタンをクリックすることで削除できます。

# 標準オブジェクトをtruncateしたい場合
管理 > データの管理 > 一括削除

から可能ですが大量データの削除には向いていません。

Apexバッチで削除用の処理を書くと楽に削除できます。
ただしカスタムオブジェクトの切り捨てに比べると時間はかかります。

```java:DeleteRecord.cls
public with sharing class DeleteRecord implements Database.Batchable<sObject>, Database.Stateful {
    String query;
    public DeleteRecord(String query) {
    	this.query = query;
    }

    public Database.QueryLocator start(Database.BatchableContext BC) {
        return Database.getQueryLocator(this.query);
    }

    public void execute(Database.BatchableContext BC, List<sObject> scope) {
        delete scope;
        DataBase.emptyRecycleBin(scope);
    }

    public void finish(Database.BatchableContext BC) {

    }
}
```

## 実行方法
開発者コンソール > Debug > Open Execute Anonymous Window　より

```java
DeleteRecord b = new DeleteRecord('select Id from Account');
Database.executeBatch(b, 2000);
```
2017年に開催される全国のPHPカンファレンスのまとめ

# 2017年に開催される全国のPHPカンファレンスのまとめ

## [PHPカンファレンス福岡 2017](http://phpcon.fukuoka.jp/2017)
- 開催日 : 6月10日(土)
- 開催場所 : [福岡ファッションビル FFB HALL](http://www.ffb.jp/access/)
- Twitter : https://twitter.com/phpcon_fukuoka
- ハッシュタグ : [#phpconfuk](https://twitter.com/hashtag/phpconfuk?src=hash)

## [PHPカンファレンス関西2017](https://2017.kphpug.jp/)
- 開催日 : 7月15日(土)
- 開催場所 : [グランフロント大阪](https://www.grandfront-osaka.jp/)
- Twitter : https://twitter.com/phpcon_kansai

## [PHPカンファレンス 2017](http://phpcon.php.gr.jp/2017/)
- 開催日 : 10月8日(日)
- 開催場所 : [大田区産業プラザ Pio](http://www.pio-ota.net/access/)
- Twitter : https://twitter.com/phpcon/
- ハッシュタグ : [#phpcon2017](https://twitter.com/hashtag/phpcon2017?src=hash)
- Facebook : https://www.facebook.com/pcon.japan/

## 過去のPHPカンファレンスまとめ
- [2016年に開催される全国のPHPカンファレンスのまとめ](http://qiita.com/akase244/items/a390b775267ab095e912)
- [2015年度 全国の PHP カンファレンス のまとめ](http://qiita.com/mukaken/items/71dbe2dde462d459adc8)
APIKitのresponseメソッドの中でObjectMapperのクラスを正しくインスタンス化する

# 事象

* APIKitの `func response(from object: Any, urlResponse: HTTPURLResponse) throws -> SomeClass` 関数の中でObjectMapperのクラスをインスタンス化する方法がわからない。
* ObjectMapperのクラスは `SomeClass(JSONString: jsonString)` というふうにインスタンス化する
* その `jsonString` の引っ張り方がわからない

# やってみたこと

* とりあえず `print(type(of: object))` する。
* `__NSDictionaryI` って出てきた
* __NSDictionaryI json string とかでググったら [ここ](http://stackoverflow.com/questions/6368867/generate-json-string-from-nsdictionary-in-ios) が出てきた。
* ~~どうやら `JSONSerialization.data(withJSONObject: object, options: .prettyPrinted)` ってやるといけるらしい！~~
    * →普通に `[String: Any]` に直すだけでいけた（コメントより）

# 結果

（下記のものは非推奨です。 [こちら](http://qiita.com/keisei_1092/items/2394e9758503cf330e78#comment-79d3a8dd1301c648a94a) を参照してください）

```swift
func response(from object: Any, urlResponse: HTTPURLResponse) throws -> SomeClass {
	let data = try JSONSerialization.data(withJSONObject: object, options: .prettyPrinted)

	guard
		let jsonString = String(data: data, encoding: .utf8),
		let someInstance = SomeClass(JSONString: jsonString)
	else { throw /* なんか例外 */ }

	return someInstance
}
```

これで正しくObjectMapperのクラスからインスタンスを得られるはずです。 🐣

# あわせて読みたい

pm11さんのこちらのエントリでは、 `buildWithArray` という関数を使っていました。
http://qiita.com/pm11/items/57b2dff4b1ac19bd89ba

もっとイケてる方法がありましたらこっそり教えてください :bow:
IntelliJ IDEA Ultimate に chef Integration pluginを導入したときにハマッたのでメモ

#前置き
Chefの本を買うも塩漬けにしたままだったので、いまさら勉強したのです。
Ansibleの話はNG。

#環境
・Windows7 Professional SP1

・IntelliJ IDEA 2016.3.5 Build #IU-163.13906.18, built on March 6, 2017

・Chef Development Kit Version: 1.2.22
　chef-client version: 12.18.31
　kitchen version: 1.15.0

#結果
Chefプラグインをインストールしても入力補完(Autocompletation)されなくてハマり、今も一部(Attributes)が補完されなくて辛い。
![image](https://qiita-image-store.s3.amazonaws.com/0/166036/3366a000-9275-58c6-a2bf-d1177e2ad2ca.png)

　　※action :installとかの:installのところ。

#経過
###■スタートラインに立つまで
IDEのインストール？Windowsだしインストーラーでちょいちょいでしょ（笑）
と意気揚々、IDEAとRubyとChefDKのインストールを終えました。
###■第一の試練
IDEAにプラグインをRuby,Chefの順でインストール。
しかし、Rubyプラグインインストールしたのに設定画面(Settings...)にRuby And Gemsがなくて辛い
![image](https://qiita-image-store.s3.amazonaws.com/0/166036/c30841ed-e9c4-02bb-4ade-3aa0e86f1eb2.png)
###■第二の試練
プロジェクトの構成(Project Structure)からSDK登録したもののChefのコードが補完できなくて辛い
![image](https://qiita-image-store.s3.amazonaws.com/0/166036/0b1a884d-783d-9f3d-b7fc-c00bd5ca8bae.png)
###■第三の試練
[インターネットのプロ](https://www.google.co.jp "Google")に質問したら
[先達の苦悩](https://intellij-support.jetbrains.com/hc/en-us/community/posts/206703755-Autocompletion-for-chef-plugin-doesn-t-work "QA")が見つかったので参考にしてChefDKの組み込み環境(emmbedded)のRubyを選択したらライブラリとしてChefが登録された。
しかし、一部入力補完されるも、:installとかがUnexpectedで辛い。
![image](https://qiita-image-store.s3.amazonaws.com/0/166036/9ebd56c9-9157-048e-8712-fc125b9477b8.png)


#現状
[この辺](https://youtrack.jetbrains.com/issue/RUBY-16637 "QA")になんかあるけどカスタムリソースなの？と思ったのでここまでにしていったん保留。
辛い。
ES2015 で LRU Cache

Map クラスは要素を挿入順で列挙するので、アクセス時に delete/set すると常に古い順に列挙されるようになります。これを利用して...

```js
class LruMap extends Map {
    constructor(capacity) {
        super()
        if (Number.isNaN(capacity) || capacity <= 0) {
            throw new Error(`Invalid capacity: ${capacity}`)
        }
        Object.defineProperty(this, "capacity", {value: capacity})
    }

    get(key) {
        if (!this.has(key)) {
            return undefined
        }
        const value = super.get(key)

        this.delete(key)
        super.set(key, value)

        return value
    }

    set(key, value) {
        super.set(key, value)
        if (this.size > this.capacity) {
            this.deleteOldestEntry()
        }
        return this
    }

    deleteOldestEntry() {
        for (const entry of this) {
            this.delete(entry[0])
            return entry
        }
    }
}
```

Minify すると 400 bytes くらい。
Devtools が見やすく表示してくれるのもポイント。

![How it shows with Devtools](https://qiita-image-store.s3.amazonaws.com/0/72555/b8430a94-69b9-7979-f26c-ef120befd554.png)
Railsのwebpacker:compileでUnexpected token puncを修正する手順

## 🎯ここでのゴール

RailsのWebpackerを使って本番環境むけにwebpacker:compileすると、Unexpected token punc が発生する問題を修正するする。

## 🔀手順

### UglifyJS2#harmonyを追加する

```
yarn add "git://github.com/mishoo/UglifyJS2#harmony"
```

### webpacker:compileする

./bin/rake webpacker:compile

### 確認する

```
cat public/packs/digests.json
```

このdigests.jsonが生成されていればOK

## 💚所感

* UglifyJS2のステーブルブランチがES6に対応していないのは課題。
* なにもしないでもminifyしたい。
virtualbox に入れた Windows 8のストレージを変更する

# virtualboxで使用しているwindowsのストレージが足りなくなって来た時にした作業の備忘録

## 仮想OSのディスクの保存先を開く

![スクリーンショット-2017-03-21-14.07.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/6ccde2dd-26f0-4969-1be1-c3461217b2c9.jpeg)

```
cd /Users/user_name/VirtualBox\ VMs/Windows\ 8.1\ \(64\)/
```

## 設定を確認
![スクリーンショット-2017-03-21-14.17.16.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/c58bfb65-f353-861f-ba32-eeacf2e64ddc.jpeg)

```
VBoxManage showhdinfo Windows\ 8.1\ \(64\).vdi
```

```
VBoxManage modifyhd Windows\ 8.1\ \(64\).vdi --resize 51200
```

```
VBoxManage showhdinfo Windows\ 8.1\ \(64\).vdi
```
![スクリーンショット-2017-03-21-14.27.13.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/98f96ab7-ab5a-0ace-95be-ed8754a1efaf.jpeg)

## BIOS の設定

１、GParted パーティション編集ツールのイメージファイルをダウンロード。
http://gparted.org/download.php

![スクリーンショット 2017-03-21 15.58.36.png](https://qiita-image-store.s3.amazonaws.com/0/30301/49926806-d402-e700-7fa9-2fa355b5606a.png)

2017年3月21日だと最新はDownload gparted-live-0.28.1-1-i686.iso

## イメージファイルを選択
![スクリーンショット-2017-03-21-16.02.29.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/ef741a65-b132-b252-b4eb-be2059dcbb01.jpeg)


選択後に起動してGPartedパーティション編集ツールで設定変更

１.Other modes of GParted Live
2.GParted Live (Default settings, KMS)
3.Don't touch keymap
4.15 Japan
5.ENTER

上記のように選択してパーティション設定画面が起動します。

リサイズしてApplyして終了。


参考：http://kabatin.hateblo.jp/entry/2016/02/25/190846
NATOフォネティックコード

## なぜこれがプログラミングに関係あるのか？
個人的な趣味の話であるが、自分は現実とは何の繋がりもない、意味のないプロジェクト名をつけるのが好き
ここでいうプロジェクト名とは、開発プロジェクトのコードネームというよりも、次に作成するディレクトリ名くらいの小さな話
ABC順に命名しておけば、新しいプロジェクト名が必ず下にくる

## NATOフォネティックコード
| Alphabet | Name |
| :------: | ---- |
| A | Alfa |
| B | Bravo |
| C | Charlie |
| D | Delta |
| E | Echo |
| F | Foxtrot |
| G | Golf |
| H | Hotel |
| I | India |
| J | Juliett |
| K | Kilo |
| L | Lima |
| M | Mike |
| N | November |
| O | Oscar |
| P | Papa |
| Q | Quebec |
| R | Romeo |
| S | Sierra |
| T | Tango |
| U | Uniform |
| V | Victor |
| W | Whiskey |
| X | X-ray |
| Y | Yankee |
| Z | Zulu |

## 参照

[NATOフォネティックコード - Wikipedia](https://ja.wikipedia.org/wiki/NATO%E3%83%95%E3%82%A9%E3%83%8D%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B3%E3%83%BC%E3%83%89)

[NATO phonetic alphabet - Wikipedia](https://en.wikipedia.org/wiki/NATO_phonetic_alphabet)
Class.newInstance()はJava9から非推奨になるので今から書き方を変えておこう

# 前置き

ちょっと前にこんなツィートを見かけました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Java 9 から java.lang.Class newInstance が deprecated になるのか、へー<a href="https://t.co/AI28VSqKS8">https://t.co/AI28VSqKS8</a></p>&mdash; Kenji Yoshida (@xuwei_k) <a href="https://twitter.com/xuwei_k/status/841696562606612480">2017年3月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

本当かな？と確認してみました。

# 確認環境
## Java9
[JDK 9 Early Access Releases — Project Kenai](https://jdk9.java.net/download/) から最新版をダウンロードしました。
（Build 161 で確認しました）

## IDEA
eclipseだとJava9を認識してくれなかったので、認識してくれるintellijを使用しました。
ただし、注意点が合って、Version: 2016.3.4だとプログラムが動きませんでした。
そのため、[IntelliJ IDEA: Early Access Program builds](https://www.jetbrains.com/idea/nextversion/) からIntelliJ IDEA 2017.1のEarly Access Programをダウンロードしています。

# 使ったプログラム
[JavaでReflection　第一回:コンストラクタ編 \- Qiita](http://qiita.com/manahirosan/items/32da2cc9f5f03dc454ca) に出てくるプログラムをお借りしました。

# 確認結果
## 見た目
Deprecatedの取り消し線が表示されていることが確認出来ます。
![save.PNG](https://qiita-image-store.s3.amazonaws.com/0/77910/7e622233-55f3-e6f4-9c97-08dcb4c78fa6.png)

## 動かしてみると
警告は表示されますが、正常終了します。
![save1.PNG](https://qiita-image-store.s3.amazonaws.com/0/77910/10ee2386-77ea-2e3e-d745-2f1235e46c5a.png)
![save2.PNG](https://qiita-image-store.s3.amazonaws.com/0/77910/0788134a-58c8-cf3b-e207-ee5f0cdc9064.png)

## どう書き換えればよいのか
発端のツィートのリンク先にも記載がありますように、getDeclaredConstructor().newInstance() と書き換えましょう。

```java
Bean bean = Bean.class.newInstance();
System.out.println(bean.pubVar);    //  default pubVar
```

これが

```java
Bean bean = Bean.class.getDeclaredConstructor().newInstance();
System.out.println(bean.pubVar);    //  default pubVar
```

こうなるだけです。
[Class \(Java Platform SE 8 \)](http://docs.oracle.com/javase/jp/8/docs/api/java/lang/Class.html#getDeclaredConstructor-java.lang.Class...-) を読むとJDK1.1から既に存在するメソッドなので、今お使いのバージョンが何であれ、使用可能です。
※バグが潜んでいる可能性は否定できないので、念のため書き換えた後は動作確認しましょう。

# そもそもなぜ非推奨になったのか？
[Class\.newInstance\(\)は、宣言されていないチェック例外を送出できてしまう \- しおしお](http://siosio.hatenablog.com/entry/2012/05/15/232823)
この対策なのかな？と思いましたが、明確なソースを見つけられていません。
議論源などご存じの方は指摘していただけると助かります。

## 2017/3/22 追記
Twitterでコメントを戴きました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">こういう経緯で deprecated になったのね。なるへそ：<br>　<a href="https://t.co/zJn1FajvXi">https://t.co/zJn1FajvXi</a><br>　<a href="https://t.co/mP8m8MTuHW">https://t.co/mP8m8MTuHW</a> <a href="https://t.co/8WCS20vn2f">https://t.co/8WCS20vn2f</a></p>&mdash; 古賀信哉 (Shin-ya Koga) (@shkoga) <a href="https://twitter.com/shkoga/status/844336325314527232">2017年3月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 気を付けないといけないこと
リフレクションで検索して出てくるコードの大半は、Java9で非推奨になる書き方をしています。
いつ廃止されるのかはまだ明言されていませんが、いつメソッドが消えるかわかりませんので転がっているコードをコピペする際は気を付けましょう。
nasa space apps challenge

#概要
nasa space apps challengeに行けないので、勝手にハッカソンしてみる。
人工衛星の軌道を計算してみる。


#2行軌道要素形式
アメリカ航空宇宙局 (NASA) と北アメリカ航空宇宙防衛司令部 (NORAD) が現在でも使用している、人工衛星の地心座標系におけるケプラー軌道要素のテキスト形式のフォーマットである。

#orb.js
calc the position of satellites
https://github.com/lizard-isana/orb.js
人工衛星の位置を計算する方法
衛星の位置計算に必要なのは core.js と satellite.js の二つ.。
軌道要素をこういうオブジェクト形式で作っておいて

```
var tle = {
    "first_line":  "1 25544U 98067A   11318.51274148  .00016717  00000-0  10270-3 0  9003",
    "second_line": "2 25544  51.6365 124.1685 0021724  56.2169 304.1052 15.60123650 24381"
}
```

軌道要素でSatellite オブジェクトを初期化

```
var satellite = new Orb.Satellite(tle);
```

jsのDateからOrb.jsのTimeオブジェクトを作って

```
var date = new Date();
var time = new Orb.Time(date);
```

地理座標系(geographic coodinates)で位置を計算

```
var geo = satellite.position.geographic(time);
```

これで

```
geo = {
    longitude: [経度],
    latitude: [緯度],
    altitude: [高度km]
}
```

というオブジェクトが返ります。

#成果物

http://jsdo.it/ohisama1/UHiL
英語の男性名一覧

## ABC順のリストを作成する意味
個人的な趣味の話であるが、自分はコンピュータに男性名をつけるのが好き
ABC順に命名していけば、悩む必要がない
女性名を使わないのは... 気安く命令できなくなっちゃうからですね

## 男性名一覧

| Alphabet | Name                   |
| :------: | ---------------------- |
| A  | Alan, Alfie, Aaron, Alex, Arthur |
| B  | Bob, Bobby, Ben, Bradley, Billy, Brody, Brandon |
| C  | Charlie, Cameron, Christopher, Cooper, Carter |
| D  | David, Daniel, Dylan, Danny, Douglas, Duncan |
| E  | Edward, Ethan, Elliot |
| F  | Fredrick, Finley, Frankie, Flynn |
| G  | George, Gabriel, Garry, Gary, Gavin |
| H  | Howard, Harry, Henry, Harrison, Harley, Harvey, Hugo |
| I  | Issac, Ian, Igor |
| J  | James, Jack, John, Jackson, Joe, Jay |
| K  | Kevin |
| L  | Larry |
| M  | Michael, Max, Matthew |
| N  | Nicholas, Noah |
| O  | Oscar, Oliver  |
| P  | Peter |
| Q  | Quincy |
| R  | Robert, Romeo |
| S  | Stephen, Steve |
| T  | Tom, Trevor, Thomas |
| U  | Ulysses |
| V  | Vincent |
| W  | William |
| X  | Xavier, Xander |
| Y  | Yaakov, Yakub |
| Z  | Zebedee, Zachary, Zack |

## 参照

[Baby Name Search](http://www.bounty.com/pregnancy-and-birth/baby-names/baby-name-search)

この赤ちゃんの名前検索サイトは、アルファベット別、人気順、男女明記なのでとても便利
sbt testで指定タグだけテストを除外して実施する

specs2を使ってる

``` scala
class HogeTest extends Specification {
  section("AAA")
  "ほげ" should {
  } 
  section("AAA")
}
```

``` bash
sbt 'testOnly -- exclude AAA'
```

sbtのオプションをシングルコートで囲うのを忘れない

[参考](http://stackoverflow.com/questions/30474711/specs2-tag-specification-individual-test-and-exclude-it-from-running-using-sbt)
svgのpolygonのpointsをpathのdとして扱う

タイトルがちょっと何言ってるかわからないっすね・・・

svgをcssでバックグラウンドで用いたいとき、dataで色や形を変更するときにちょっと困ってました。

```html:home.svg
<svg version="1.1" id="icon_home" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 13 14" style="enable-background:new 0 0 13 14.2;" xml:space="preserve">
<polygon class="st0" points="6.5,0 0,6.4 0,14.2 5.1,14.2 5.1,8.5 7.9,8.5 7.9,14.2 13,14.2 13,6.4 "/>
</svg>
```
これを

``` css:style.css
.icon-home {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 13 14'%3E%3Cpath fill='#fff' d='6.5,0 0,6.4 0,14.2 5.1,14.2 5.1,8.5 7.9,8.5 7.9,14.2 13,14.2 13,6.4'/%3E%3C/svg%3E")
```
このパスのデータは`d`に入っているんですが、
これはpolygonのパスなので、うまく表示されません。

## polygonのpointsがsvgのdata形式で使えるようにする解決方法

*d=""の頭に`M`、尾に`z`を入れると表示されるようです。*

``` css:style.css
.icon-home {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 13 14'%3E%3Cpath fill='#fff' d='M6.5,0 0,6.4 0,14.2 5.1,14.2 5.1,8.5 7.9,8.5 7.9,14.2 13,14.2 13,6.4z'/%3E%3C/svg%3E")
```


ちなみに
svgの出力内容は結構バラバラだったりするんで、上記の方法だとうまく表示されない場合もあります。

統一された解決方法が見つかれば、また書き込むかもしれません( ´Д`)

### まとめ
とりあえずsassでsvgのアイコンを、色変えたりちょこちょこしたいときにぶち当たった問題なので、
もし同じような問題が起きたら試してみてはいかがでしょうか。
APIを経由してオブジェクトのプロパティを取得するときの注意


DBの参照用APIをLaravelでつくっていたときに詰まったハナシ。

```php:api.php
Route::get('/product', function(){
	$product = ProductEloquent::find(3);
	return $product;
});
```

こんな感じで、Eloquentで取得したデータをオブジェクトで返すようにして、
下のようなテストを実行。

```
class ProductTest extends TestCase
{
    /**
     * A basic test example.
     * @group api
     * @return void
     */
    public function testBasicTest()
    {
        $res = $this->get("api/product");

        dd($res->category);
    }
}
```

#エラー

`ErrorException: Undefined property: Illuminate\Http\Response::$category
`
プロパティがないとのこと。
`dd($res)` で中を見てみると、確かにEloquentで取得したときのオブジェクトに比べて何かフクザツな構造になっていた。

##解決法

これで解決。

```
    public function testBasicTest()
    {
        $res = $this->get("api/product");

        dd($res->baseResponse->getOriginalContent()->category);
    }
```
slack API Enable Subscriptions のための challenge valueの受け取り方

slackAPIのEvent Subscriptionsを書き始める際に、下記のようなchallenge/responseテストがあります。

![2017-03-21_15h26_30.png](https://k-rex.qiita.com/files/13d3ee0f-cdf8-565f-0f04-f11f552354f6.png)

https://api.slack.com/events/url_verification

> We’ll send an HTTP POST requests to this URL when events occur. As soon as you enter a URL, we’ll send a request with a challenge parameter, and your endpoint must respond with the challenge value.

POSTするというから、$_POSTで受け取れるのかというと受け取れません。
ただしくは下記で受け取れます。

```php
<?php

$json = file_get_contents('php://input');
var_dump($json);

```
exec()の実行成否をtry catchで判断するのは…やめようね！

```php
try{
    exec('Something_command',$output);
} catch (Exception $e) {
    echo 'コマンドの実行に失敗しました。';
}
```

と言った処理があったのですが、この書き方で`catch`には入りません。

コマンドが失敗する余地がある場合や動的にコマンドを生成して実行する場合（動的にコマンドを生成するのはバグ臭プンプンですがそこはスルー）には以下のようにしてコマンドの失敗検知を行なう様にする。

```php
exec('Something_command',$output, $return_var);
if($return_var !== 0){
    echo 'コマンドの実行に失敗しました。';
}
```

実行結果

```
コマンドの実行に失敗しました。
```

[PHPのリファレンス](http://php.net/manual/ja/function.exec.php)を見ると

>引数return_varが、引数 output と共に存在する場合、実行したコマンドの ステータスがこの変数に書かれます。

とあり、実行後の`$return_var`を見ることでコマンドが成功したか否かを判断することが出来ます。

---

#### 別パターン

`2>/dev/null`で標準エラー出力を捨てるパターン

```php
if(!exec('Something_command 2>/dev/null',$output)){
    echo 'コマンドの実行に失敗しました。';
}
```

実行結果

```
コマンドの実行に失敗しました。
```

`exec()`の戻り値はコマンド結果の最終行を返します。
戻り値をそのまま評価対象にするのは実行するコマンドをだいぶ選びますので、用法を守って正しくお使い下さい。
linuxサーバーで簡単にメールを送る方法

#linuxサーバーで簡単にメールを送る方法
mailxをインストールすれば簡単にコマンド or shellからメールを送ることができる。

##mailxインストール
```lang:
yum install mailx
```

##メールの送付
```lang:
echo "本文" | mail -s "タイトル" 宛先
```


shellでのアラートなどによく使ってます。
Pythonでコマンドラインからpickleの中身を確認する

### tl;dr

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">python -m picke hoge.pklでpickleの中身を直に見ることができることを初めて知った。これまで.pklにしたいけどlessできないしなと悩んでたのが馬鹿みたいだ……　<a href="https://t.co/QUXqS8WyLh">https://t.co/QUXqS8WyLh</a></p>&mdash; やぐ (@yag_ays) <a href="https://twitter.com/yag_ays/status/829566794918555648">February 9, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


### 課題

Pythonで様々なオブジェクトをpickleという形式でシリアライズすることができます。一方で、jsonファイルやテキストファイルと違いバイナリファイルとなるため、catやlessで容易に確認することができず、いちいちpythonのインタプリタでwith句を書いて中身を取り出す必要があると思っていました。

```python
# 書き込み
with open("hoge.pkl", mode="wb") as f:
    pickle.dump({"hoge":"fuga"}, f)

# 読み込み
with open("hoge.pkl", mode="rb") as f:
    hoge = pickle.load(f)
```

ちなみに、上記のhoge.pklをcatで表示すると以下のようになります。

```sh
$ cat hoge.pkl
?}qXhogeqXfugaqs.%
```


### 解決法：シェルから直にpickleの中身を確認する

しかし、pythonのコマンドで直にpickleの中身を確認することができる方法がありました。それが`python -m pickle`というコマンドです。`-m`というオプションはPythonの標準モジュールを実行してくれるため、pickleを指定するとその読み込み結果を表示してくれます。`python -m SimpleHTTPServer`や`python -m http.server`でWebサーバが立ち上がるのと同じ仕組みですね。

上のpythonコードで作成したhoge.pklというファイルがあった場合に、以下のようにして中身を表示させることができます。

```sh
$ python -m pickle hoge.pkl
{'hoge': 'fuga'}
```

また、オブジェクトの場合は以下のように表示されます。

```sh
$ python -m pickle dictionary.pkl
<gensim.corpora.dictionary.Dictionary object at 0x104e7ac51>
```

### シェルのエイリアスに登録する

これだけでも個人的には大発見でpickleを積極的に利用できる理由になるほど便利なのですが、いちいち`python -m pickle`とタイプするのは大変なので、シェルの機能でaliasを設定してみます。

bash/zshの場合、以下のようになります。pickleはPythonのバージョンで非互換なので、python2/python3を明示的に指定したい場合は、絶対パスでpythonを指定しておいた方が良いでしょう。 

```sh
alias pcat='python -m pickle'
```

こうすることによって、`$ pcat hoge.pkl`というコマンドで簡単にpickleファイルの中身を確認することができます。

### 参考

- [Is there a way to view cPickle or Pickle file contents without loading Python in Windows? - Stack Overflow](http://stackoverflow.com/questions/13568790/is-there-a-way-to-view-cpickle-or-pickle-file-contents-without-loading-python-in)
gitレポジトリで一番活発に編集されているファイル

```sh
git ls-files -z                     | \
    parallel -0 -j32 -I.           -- \
        echo -n . \\\              \; \
        git log --format=oneline . \| \
        wc -l                       | \
    sort -k2 -nr                    | \
    head
```

これでランキングが出せる。ただし体感ではコミット数のO(n<sup>2</sup>)で遅くなっていくぽく感じるので、歴史のあるレポジトリほど遅くなっていくので要注意ではある。

Rubyの場合だとこんなかんじ

```sh
zsh % git ls-files -z | parallel -0 -j32 --line-buffer -I. -- echo -n . \\\  \; git log --format=oneline . \| wc -l | sort -k2 -nr | head -n 30
version.h  5295
io.c  1519
configure.in  1467
parse.y  1396
gc.c  1363
eval.c  1340
string.c  1334
common.mk  958
NEWS  779
array.c  759
bignum.c  748
process.c  733
thread.c  680
file.c  677
numeric.c  661
win32/win32.c  655
vm.c  628
lib/mkmf.rb  619
compile.c  573
hash.c  568
object.c  538
internal.h  531
ruby.c  525
vm_insnhelper.c  490
win32/Makefile.sub  482
re.c  482
include/ruby/ruby.h  454
time.c  444
vm_core.h  426
proc.c  408
```
Playground で Carthage ライブラリを import する

View を作るのに毎回ビルドするのは時間がかかるので Playground でやりたい。
ググると幾つか手順が出てくるが、私のやり方が悪いのかうまくいかなかったので、2017年3月21日時点でうまく行ったやり方を書いておく。

# やり方

## まず Project を作成する

Xcode の File > New > Project で新規作成。

## xcworkspace の作成

File> Save as Workspace をすると、 xcworkspace がつくられる。
xcode を一回閉じて、 今作った xcworkspace を開く。

## Carthage ライブラリのインストール

今回は SnapKit と Rx を入れる。

```
$ vi Cartfile
github "SnapKit/SnapKit"
github "ReactiveX/RxSwift"

$ carthage update --platform iOS --use-submodules
```

## ライブラリの xcodeproj を Project に import

`Project/Carthage/Checkouts/SnapKit/SnapKit.xcodeproj`, `Project/Carthage/Checkouts/RxSwift/Rx.xcodeproj` をドラッグアンドドロップで Xcode にコピー。

こうなる。

![unspecified.png](https://qiita-image-store.s3.amazonaws.com/0/5678/ace198e8-e07f-e1b4-f178-213ac6dac8b2.png)


## Embedded Libraries にコピー

`Project/Carthage/Build/iOS/` に framework があるので、 RxSwift, RxCocoa, SnapKit など必要なのをドラッグアンドドロップで Embedded Libraries に入れる。

こうなる。

![unspecified.png](https://qiita-image-store.s3.amazonaws.com/0/5678/a9941576-69bf-6735-a71d-47f3f9f67a43.png)


## Build する

⌘ + B で一旦 build しておく (しなくてもいけるかも)。

## Playground ファイルにコードを書く

New File で Playground ファイルを作成する。
Targets などはチェックをつけないで大丈夫。

ファイルを作ったらとりあえず以下のように書いてみる。

```swift
// SnapKit + Rx で画面を作成する

import UIKit
import SnapKit
import RxSwift
import RxCocoa
import PlaygroundSupport

class VC: UIViewController {
    let button: UIButton = {
        let button = UIButton()
        button.setTitle("button", for: .normal)
        return button
    }()
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        view.addSubview(button)
        button.backgroundColor = UIColor.red
        button.snp.makeConstraints{ make in
            make.width.height.equalTo(100)
            make.top.left.equalTo(100)
        }
        
        button.rx.tap
            .subscribe(onNext: { _ in
                print("tap")
            })
            .disposed(by: disposeBag)
    }
}

let vc = VC()
vc.title = "title"
let nav = UINavigationController(rootViewController: vc)
nav.view.frame = CGRect(x: 0, y: 0, width: 320, height: 568)

/// MARK: - View を表示

PlaygroundPage.current.liveView = nav
PlaygroundPage.current.needsIndefiniteExecution = true
```

## ちょっと待つと

SnapKit, Rx を使い画面を Playground で作れるようになりました :tada:

![unspecified.png](https://qiita-image-store.s3.amazonaws.com/0/5678/e94048b2-6b41-4a5e-121e-57df12c3aedb.png)


# サンプルリポジトリ

[starhoshi/PlaygroundWithCarthage](https://github.com/starhoshi/PlaygroundWithCarthage) を clone すれば試せます。

```
$ git clone git@github.com:starhoshi/PlaygroundWithCarthage.git
$ cd PlaygroundWithCarthage
$ open PlaygroundWithCarthage.xcworkspace
```

これで Playground file を開けばすぐ試せます :ok_woman: 

# 参考

[Swift PlaygroundでCocoaPodsのライブラリを使う \- Qiita](http://qiita.com/banjun/items/f8a5df4ddef3e9d2405b)
[【iOS】Carthageで入れたframeworkをPlaygroundで使用する \- Qiita](http://qiita.com/ryokosuge/items/2551cd4faa9dca324342)
[C++11~] std::stoi で文字列を数値に変換する

C++11から文字列から数値への変換の標準ライブラリとして、`std::stoi`が存在します。
`std::stoi`ではC言語の`atoi`などと違い`std::string`をそのまま取り扱うことができます。

# 例外

+ 変換できない形式の文字列が指定された => `std::invalid_argument`
+ 範囲外の値が指定された => `std::out_of_range`

# 実装例

```cpp:使用例
#include <iostream>
#include <string>
#include <stdexcept>

int main(int argc, char* argv[]) {
	for (int i = 1; i < argc; ++i) {
		try {
			int num = std::stoi(argv[i]);
			std::cout << "[" << i << "]: " << num << std::endl;
		}
		catch (const std::invalid_argument& e) {
			std::cout << "[" << i << "]: " << "invalid argument" << std::endl;
		}
		catch (const std::out_of_range& e) {
			std::cout << "[" << i << "]: " << "out of range" << std::endl;
		}
	}

	return 0;
}
```

```console:実行例
$ g++ -std=gnu++11 test.cpp && ./a.out 1 a 2147483647 2147483648
[1] : 1
[2] : invalid argument
[3] : 2147483647
[4] : out of range
```

# その他の型に変換する

その他、`long`, `float`, `double` 向けなどに、`std::stol`, `std::stof`, `std::stod` が用意されています。

# 参考
[stoi - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/reference/string/stoi.html)
[std::stoi - C++入門](http://kaworu.jpn.org/cpp/std::stoi)
ConoHa VPSに情報共有システムcrowiを立てる。

# ![crowi.png](https://qiita-image-store.s3.amazonaws.com/0/121292/89beca36-98fe-06c9-9b89-7309c787ed1f.png) [crowi](http://site.crowi.wiki/)

node.jsで作られている情報共有ツール。おなじみのMarkdown形式で書けて、データベースにはMongoDBを利用。ElasticSearchでの検索にも対応している。

## VPSのセットアップ
ConoHaを契約して、サーバインスタンスを立てたらまずはファイアウォールの設定を行う。ConoHaのコンパネから開けるものとOSのファイアウォールとは別なので注意。インターネットからアクセスするには両方開ける必要がある。

[![https://gyazo.com/491c6dd23a312dc00fdd53e88a1e8535](https://i.gyazo.com/491c6dd23a312dc00fdd53e88a1e8535.png)](https://gyazo.com/491c6dd23a312dc00fdd53e88a1e8535)

```bash
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=http --permanent
```

node.jsをインストールする。今回はイメージにCentOS7を利用した。ConoHaに用意されているイメージはEPELが導入済みのためyumリポジトリの設定は必要ない。

```bash
sudo yum install nodejs
sudo yum install gcc-c++ #ネイティブのnpmパッケージをビルドするのに必要
```

## crowiのセットアップ
GitHubからクローンしてnpmコマンドで依存パッケージをインストールするのみ。

```bash
git clone https://github.com/crowi/crowi/
cd crowi
npm install
```

## MongoDBインストール

```bash
sudo yum install mongodb-server
sudo systemctl enable mongod
sudo systemctl start mongod
```

## Redisインストール(Option)

```bash
sudo yum install redis
sudo systemctl enable redis
sudo systemctl start redis
```

## ElasticSearchの導入(Option)
ElasticSearchは残念ながら標準リポジトリにもEPELにもないので、公式が用意しているリポジトリを追加する。なおcrowi v1.6以降はElasticSearch 2.xではなく5.xを使用する必要があるので注意([*1](https://github.com/crowi/crowi/wiki/Roadmaps-v1.6))。

```:/etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://packages.elastic.co/elasticsearch/5.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
```

その後、`sudo yum install elasticsearch`でインストール。

また、検索に使用するElasticSearchは日本語対応のためkuromojiプラグインを導入する必要がある。それには`/usr/share/elasticsearch/`で以下のコマンドを実行する。

```bash
bin/elasticsearch-plugin install analysis-kuromoji
```

そして起動する。デフォルトポートは9200番になっている。

```bash
sudi systemctl enable elasticsearch
sudo systemctl start elasticsearch
```

## 起動

```bash
sudo PORT=80 \
NODE_ENV=production \
MONGO_URI=mongodb://localhost:27017/crowi \
REDIS_URI=redis://localhost:6379 \
ELASTICSEARCH_URI=localhost:9200 \
PASSWORD_SEED=hogehogehoge \
SECRET_TOKEN=hogehogehoge \
node app.js
```

しかし、これではssh接続を切ったら終了してしまうのでデーモン化する必要がある。デーモン化にはforeverを使う。PM2も試したがこちらはなぜかデータベースに接続できないと言われてすぐに落ちるので諦めた。

```bash
sudo npm -g install forever
sudo PORT=80 \
NODE_ENV=production \
MONGO_URI=mongodb://localhost:27017/crowi \
REDIS_URI=redis://localhost:6379 \
ELASTICSEARCH_URI=localhost:9200 \
PASSWORD_SEED=hogehogehoge \
SECRET_TOKEN=hogehogehoge \
forever start app.js
```

# 終わりに
サークルのような小さなチームで情報共有する場合、Qiita:Teamやesa.ioなどは大げさな気がするしコストもかかる。crowiのようなオープンソースのwikiシステムはそういったケースで十分使用に耐えうるし、不足している機能があれば自分で実装することもできるのでオススメ。

今回は全てOSの、あるいはOSS公式が提供しているパッケージを利用したが、dockerで運用すれば疎結合な構成になり、負荷が高くなった際に他のインスタンスにコンテナを移動できていいかもしれないと思った。

# 参考
- [crowi github](https://github.com/crowi/crowi/)
- [Elasticsearch を yumでインストール (CentOS)](http://qiita.com/inouet/items/6276c5a08c4fe5eecdb5)
Macでdocker-machineの自動起動設定

Macでログイン時にdocker-machineを自動起動する設定手順

ここに手順があるけど、備忘録として投稿しておく。
http://docs.docker.jp/machine/get-started.html#start-local-machines-on-startup

# 手順

`~/Library/LaunchAgents`ディレクトリを作成

```bash
mkdir -p ~/Library/LaunchAgents
```

作成したディレクトリに`com.docker.machine.default.plist`というXMLファイルを作成する

```xml:~/Library/LaunchAgents/com.docker.machine.default.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>EnvironmentVariables</key>
        <dict>
            <key>PATH</key>
            <string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
        </dict>
        <key>Label</key>
        <string>com.docker.machine.default</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/docker-machine</string>
            <string>start</string>
            <string>default</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>
```

以降、ログイン時に起動するようになるが、ログアウトせずに起動するには以下のコマンドを実行

```bash
launchctl load ~/Library/LaunchAgents/com.docker.machine.default.plist
```
ipsj2017

先日行われたiosj2017で最も自分が興味を持ったのは、人狼ゲームの会話に基づく役職別のプレイヤー推定という研究内容についてです。
今までチェスや将棋などの完全情報ゲームなどでにおいて、コンピュータが人間に勝利したというのはニュースで耳にしたことはありますが、人狼といった不完全情報ゲームにおいてコンピュータが人間に勝ったという話は耳にしたことがないため、題名からもすごく興味を持ちました。
不完全情報ゲームでは、伏せられている情報が多く現在の状況をどのように記号化するのかが難しいとされています。
この研究のプレイヤー推定のプロセスとしては、まず会話を分かち書きにし、近似の意味をもつ単語の整形を行います。
次に形態素解析を行い、名詞の抜き出しを行います。
次に出現頻度の高い単語、ストップワード等の単語の削除を行います。
次にトピック解析を行います。ここでのトピックとは言葉の側面、おおざっぱな意味であり、トピック解析とは複数の言葉に共通するトピックを解析することを指します。
SVM（ガウシアンカーネル、線形カーネル）による学習を行わせます。ここでは、プレイヤーの発言データを役職毎に分類し、指定した人数分、ランダムに取り出し、10回の平均をそれぞれとり、80％を学習データ、20％をテストデータとしています。
F値により比較を行い、値が正なら人狼、負ならそれ以外の役職となります。
発表を聞いていた際に、人狼側としては人間側にばれたくないので、他の役職に成りすましたり、虚偽の発言をすることが考えられ、それは推定の悪影響にならないのかと考えました。
たまたま質問の時間に同じような質問がされ、役職の偽装などについては、いくつかあるトピックの中にそういう役職の偽装などしているときの発言などが含まれており、トピック解析することにより、推定が可能であるそうです。
ただ特徴のデータを知っている人と対戦するとトピック解析で判断できるかどうか微妙なところだそうです。
他にも擬音語や顔文字などはどのように解析するのかという質問がありました。
これはプロセスの名詞の抜き出しの際に削除されるそうです。
最後に人狼についての研究は会話を基に推定していくうえで、人工知能のコミュニケーション能力の向上につながっていくと思うので、これからも研究がどんどん進んでいってほしいと思いました。
初めてのQiita投稿

# タイトルを書いてみる
- 書きやすいかな
- 悪くない
- ほうほう

## どうかな
おなかへった
なにたべよう

## どうなのかな
あまり食べると眠くなる

# 次はどうかな
むむ
1. いち
2. に
3. さん
4.
Firebase Realtime Databaseのルールコンバータを作った


最近Firebaseを使ったシステムを開発しているのですが，Realtime Databaseの規模が少し大きくなると，ルール用JSON（`database.rules.json`）を直接編集するのが大変になってきました．
そこで，ルール設計にはスプレッドシートを使い，それを`database.rules.json`に変換するコンバータツールを作成しました．

## ソースとnpmパッケージ

* ソース：https://github.com/ottijp/fir-rule-gen
* npmパッケージ：https://www.npmjs.com/package/fir-rule-gen



## 例

エクセルなどのスプレッドシートで以下のようなエレメントの構造とルールを作成します．

![spread_sheet_input.png](https://qiita-image-store.s3.amazonaws.com/0/35592/2c87df22-7484-e02f-2a38-1941948e523e.png "spread_sheet_input.png")


これをCSVとして保存し，今回作ったコンバータツールで変換すると，次のようなJSONが作れます．

```csv:database.rules.csv
LV1,LV2,LV3,col2,INDEX,TYPE,description,READ,WRITE,CONDITION
users,,,abc,,,,,,
,$user,,,,string,,,,
,groups,,,,,"this
Is
Memo",,,
,,$group,,,string,,,,newData.val().length > 5
,name,,,x,string,,,,
groups,,,,,,,true,,
,users,,,,string,,,,
devices,,,,,,,auth.uid !== null,false,
,$devices,,,,,,,,
,name,,,x,string,,,,
,version,,,,,,,,newData.getPriority() != null
,valid,,,x,boolean,,,,
```

```json:database.rules.json
{
  "rules": {
    "users": {
      "$user": {
        ".validate": "newData.isString()"
      },
      "groups": {
        "$group": {
          ".validate": "(newData.isString()) && (newData.val().length > 5)"
        }
      },
      "name": {
        ".validate": "newData.isString()"
      },
      ".indexOn": [
        "name"
      ]
    },
    "groups": {
      ".read": "true"
    },
    "  users": {
      ".validate": "newData.isString()"
    },
    "devices": {
      ".read": "auth.uid !== null",
      ".write": "false",
      "$devices": {},
      "name": {
        ".validate": "newData.isString()"
      },
      ".indexOn": [
        "name",
        "valid"
      ],
      "version": {
        ".validate": "newData.getPriority() != null"
      },
      "valid": {
        ".validate": "newData.isBoolean()"
      }
    }
  }
}
```

## CSVのフォーマット

次のカラムを含む必要があります．これら以外のカラムは無視されます．

* LV1 - LV32
	* エレメントのレベル
	* ルートエレメントはLV1に配置する
* INDEX
	* `.indexOn`に入れる要素の場合は`x`を入れる
* TYPE
	* データタイプ
	* `string`, `number`, `boolean`が指定可能
	* 指定すれば`.validate`に`newData.isString()`などのバリデーション条件を入れてくれる
* CONDITION
	* `.condition`に直接入るバリデーション条件
* READ
	* `.read`に直接入る読み取り可能条件
* WRITE
	* `.write`に直接入る書き込み可能条件

## インストール

```bash:
$ npm install -g fir-rule-gen
```

## 変換コマンド

```bash:
$ fir-rule-gen <変換元CSVのパス> <変換先JSONのパス>
```

引数でパス指定せずパイプで渡すことも可能です．

```bash:
$ cat <変換元CSVのパス> | fir-rule-gen > <変換先JSONのパス>
```
3/16 の BigQuery Release Notes (Maximum rows per second が 1/10 に)

`Updated limits for maximum rows per second when streaming data into BigQuery.` という一文が入ってます。

- https://cloud.google.com/bigquery/docs/release-notes

つまり、 Maximum rows per second が 1/10 になりました。

```diff
- Maximum rows per second: 100,000 rows per second, per table. 1,000,000 rows per second, per project. Exceeding either amount will cause quota_exceeded errors. If your project requires a higher limit, contact support.
+ Maximum rows per second: 10,000 rows per second, per table. 100,000 rows per second, per project. Exceeding either amount will cause quotaExceeded errors.
```

- ref. https://cloud.google.com/bigquery/quota-policy 

サイトの日英でみると差分がはっきりします。

| 最新 |  以前 |
|:-----------------|------------------:|
| ![image](https://qiita-image-store.s3.amazonaws.com/0/24932/3858ed77-ef2a-d22c-7d25-7fa88683a675.png) |![image](https://qiita-image-store.s3.amazonaws.com/0/24932/68317ea9-834d-01b6-55de-5ea6e0816c74.png)
 |

あんまり話題になってないですが、事前にどこかで告知があったとか、こんなに書き込むプロジェクトが少ないとか、streaming insert 使ってないとか、すでにシャーディング済み当然、みたいな感じなんですかね？

とりあえずお気をつけください。
【ruby】mechanizeで現在いるページのcookieとURLを取得

mechanizeを使って、ログインした後のページでjsonファイルをスクレイピングしたいときに役立ったのでメモ:footprints:

##jsonファイルを開く際にcookie情報を付与しよう

```sq.rb
require 'mechanize'
require 'net/http'
require 'uri'
require 'open-uri'
require "json"


username = 'hoger'
password = 'hoge'

agent = Mechanize.new
page = agent.get('URL')

# login
login_form = page.forms[0]
  login_form.field_with(:name => 'identity').value = username
  login_form.field_with(:name => 'password').value = password
mypage = login_form.submit

# 現在いるページのURL
p mypage.uri.to_s

# cookie情報をゲット
cookie = agent.cookie_jar

# cookie情報を付与した状態でjsonファイルopen
# タイトル一覧をぶっこぬき

uri = URI.parse("jsonファイルpath")
request = Net::HTTP::Get.new(uri)
request["Cookie"] = cookie["hash"].to_s

req_options = {
  use_ssl: uri.scheme == "https",
}

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(request)
end
data = JSON.parse(response.body)

data.each { |e| p e["title"] }

```

##cookieなどの情報を付与するときに便利
[curl-to-ruby](https://jhawthorn.github.io/curl-to-ruby/)を使うと、JSONファイルを開く際に付与する必要な情報がすぐにわかるので、ソースコードを見比べてみてください！

##参考
[Mechanize::CookieJar](http://seesaawiki.jp/ruby_mechanize/d/Mechanize%3A%3ACookieJar#load)
【Rundeck】プロジェクトへのnode追加メモ

## /var/rundeck/projects/{Project}/etc/resources.xml　に追加したいノードの情報を追加

 例）

```
<node name="gate1" description="Sync contents server node" tags="" hostname="サーバA" username="rundeck"/>
```
※usernameは　rootを使用しない=>　rundeckにしておく

## 公開鍵の配置
　　サーバBの公開鍵をサーバAへアップロード

```
　　/var/lib/rundeck/.ssh/authorized_keys
```


## 追加先のノード（サーバA）で作業

### useridを確認する

```
cat /etc/passwd
```

### rundeckユーザー追加
未使用のidをuseridへ指定してrundeckユーザを追加する。

```
useradd -u {userid} rundeck
```

### 仮パスワード追加（後で削除する※パスワード認証できないようにするため）

```
passwd rundeck
```

### wheelグループが　sudo　コマンドをパスワードなしで使用できるように変更「visudo」

```
Defaults requiretty =>sshでsudoできない
Defaults:%wheel !requiretty =>wheelグループのみsshでsudoできるように
```


```
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
```


### wheelグループに追加する

```
gpasswd -a rundeck wheel
```

### .sshディレクトリ作成

```
mkdir /home/rundeck/.ssh
```

### 所有者変更

```
chown rundeck:rundeck /home/rundeck/.ssh
```

### 権限変更

```
chmod 700 /home/rundeck/.ssh
```

### ファイル移動

```
mv /tmp/authorized_keys /home/rundeck/.ssh/
```

### 所有者変更

```
chown rundeck:rundeck /home/rundeck/.ssh/authorized_keys
```
raspberryPi3でopenframeworks(勉強メモ)

#ラズパイ3のセットアップ
###mac使用
この記事を参考にNOOBS/Raspbianをダウンロード
http://deviceplus.jp/hobby/raspberrypi_entry_003/

解凍ソフト無しでいけました。
SDをフォーマットしてからダウンロードしたデータをコピー。
###ここからラズパイの操作
USB電源を差すと電源が入ります。
タッチ機能付小型ディスプレイのセットでやってましたが
色々設定してからじゃないと使えないみたいなので
ひとまずHDMI。

その後質問に答えると
勝手にインストールされます。
結構時間かかります、ご注意を


その後
```
sudo apt-get clean
sudo apt-get update
sudo apt-get upgrade
```

(バージョンはその都度変更しますが...)
```
wget http://openframeworks.cc/versions/v0.9.3/of_v0.9.3_linuxarmv6l_release.tar.gz
mkdir openFrameworks
tar vxfz of_v0.9.3_linuxarmv6l_release.tar.gz -C openFrameworks --strip-components 1
cd /home/pi/openFrameworks/scripts/linux/debian
sudo ./install_dependencies.sh
make Release -C /home/pi/openFrameworks/libs/openFrameworksCompiled/project
```
これまた かなり時間かかります。


#実行
cd /home/pi/openFrameworks/examples/graphics/polygonExample
make
make run
で動作確認。


プロジェクトジェネレータは使わず
emptyExampleをコピーして書いていくそうな。
Chainer で Hello World!

# 概要

[Chainer](http://chainer.org/) は、Preferred Networks が提供するニューラルネットワーク向けの機械学習フレームワークです。実際には、機械学習一般に汎用的に使うことができます。ネットで見かけるサンプルは複雑なニューラルネットワークを使ったものが多いので、まず Hello World! 的なプログラムを書いてみました。

# Chainer のインストール

お試し程度であれば GPU は要らないので、

```bash
$ pip install --install-option="--cupy-no-cuda" chainer
```

とすると良いと思います。バージョン 1.22 の場合、いきなり GPU を使おうとして「GPU の環境がないよ！」とエラーになりました。上のようにして Chainer を再インストールしたところうまく行きました。

# 対象読者

- Chainer を機械学習に利用することに興味がある
- Python について基礎知識がある
- 関数の最小化手法について基礎知識がある

# 二次関数の最小化問題

![image](https://qiita-image-store.s3.amazonaws.com/0/26146/39c02636-0349-0c47-4ee8-80cf83e53dfb.png)

```math
y = x^2
```

という二次関数の最小化問題を考えてみます。答えは、$ x=0 $ のとき $ y $ は最小になる、ですね。これを Chainer に解かせてみましょう。

```python:quadratic.py
import numpy as np
import chainer

class Quadratic(chainer.Link):
    def __init__(self):
        super().__init__(
            x=(1)
        )
        self.x.data = np.array([2], dtype = np.float32)

    def fwd(self):
        return (self.x * self.x)

model = Quadratic()
optimizer = chainer.optimizers.SGD(lr = 0.1)
optimizer.use_cleargrads()
optimizer.setup(model)

for i in range(80):
    model.cleargrads()
    y = model.fwd()
    y.backward()
    print("=== Epoch %d ===" % (i + 1))
    print("model.x.data = %f" % model.x.data)
    print("y.data = %f" % y.data)
    print("model.x.grad = %f" % model.x.grad)
    print()
    optimizer.update()
```

このコードの肝は、`optimizer.setup(model)` です。ここでは`chainer.optimizers.SGD`（確率的勾配降下法）を利用して関数の最小化を試みています。[chainer.Optimizer](http://docs.chainer.org/en/latest/_modules/chainer/optimizer.html#Optimizer) クラスの setup メソッドは [chainer.Link](http://docs.chainer.org/en/latest/_modules/chainer/link.html) クラスのインスタンスを取ります。

`chainer.Link` クラスを継承して `Quadratic` クラスを作っています。

```python
    def __init__(self):
        super().__init__(
            x=(1)
        )
        self.x.data = np.array([2], dtype = np.float32)
```
この部分で、`x=(1)` というのは、x が１次元ベクトル、つまりスカラーであることを伝えています。その後、x を`2`(32ビット浮動小数点型)で初期化しています。Chainer では主に32ビット浮動小数点型を使用するようです。この `2` という数字はランダムな初期値で、他の数字でもかまいません。

```python
    y = model.fwd()
    y.backward()
    ...
    optimizer.update()
```
この部分では、

- y = model.fwd() で $ x ^ 2 $ の計算
- y.backward() で、$ x $ の傾き(grad)の計算
- optimizer.update() で、$ x $ の傾きに基づいて、$ x $ を更新

しています。

実行すると、

```
=== Epoch 1 ===
model.x.data = 2.000000
y.data = 4.000000
model.x.grad = 4.000000

=== Epoch 2 ===
model.x.data = 1.600000
y.data = 2.560000
model.x.grad = 3.200000

=== Epoch 3 ===
model.x.data = 1.280000
y.data = 1.638400
model.x.grad = 2.560000

...

=== Epoch 80 ===
model.x.data = 0.000000
y.data = 0.000000
model.x.grad = 0.000000

```
と、$ x = 0 $ (`model.x.data = 0.000000`)に解が収束しているのがわかります。

# Chainer の学び方

Chainer を始めるなら、まずは本家のチュートリアルがとてもわかりやすいです。
[Introduction to Chainer](http://docs.chainer.org/en/stable/tutorial/basic.html)
[有志の方による和訳](http://www.iandprogram.net/entry/chainer_japanese)もあります（ただし、若干内容が古いようです）。

Chainer は[本家のドキュメント](http://docs.chainer.org/en/stable/index.html)も充実していますし、ソースコードも簡潔で読みやすいと感じました。チュートリアル→レファレンスマニュアル→ソースコードと読み進めていけばよいのではないでしょうか？

Python 言語自体や、Python の数値計算ライブラリ Numpy の知識も当然必要となります。ただ、どちらもインターネット上にいろいろ文献がありますので、プログラミングの知識のある方なら大きな問題はないかと思います。