OmniAICreator/Qiita-1.07M huggingface dataset:
(厳選) オブジェクト指向まとめ情報

# オブジェクト指向まとめ情報

最近、いいな、と思った「オブジェクト指向」関係の情報へのリンクです。
ここ1～2年の間によく目にした記事をブックマークしました。

初心者向けというより、一度勉強した人が、もう一度おさらいするための情報でしょうか。

## リンク

### リンク - Qiita

* [オブジェクト指向と10年戦ってわかったこと - Qiita](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)
* [オブジェクト指向と20年戦ってわかったこと - Qiita](https://qiita.com/shibukawa/items/2698b980933367ad93b4)
* [オブジェクト指向と24年くらい戦ってわかったこととか - Qiita](https://qiita.com/Air_Hold/items/85c1794f3c42be481f21)
* [オブジェクト指向とは結局何なのか あるいはプログラミングをする上で気をつけるべきたった一つのこと - Qiita](https://qiita.com/lamrongol/items/8a339721ee20a1c81e3c)
* [新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡 - Qiita](https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)

### リンク - 他

* [プログラミング勉強中の人にオブジェクト指向とは何なのかを何となく伝えたい話 - hateblo](http://tdak.hateblo.jp/entry/20140406/1396773476)
* [オブジェクト指向とは何だったのか？ - ubiteku.oinker.me](https://ubiteku.oinker.me/2016/05/09/what-is-oo-all-about/)

## スライド

* [オブジェクト指向できていますか？ - SlideShare](https://www.slideshare.net/MoriharuOhzu/ss-14083300)

  - 真のオブジェクト指向が身に付くコーディング規約

具体的なコーディング例と共に書いてあり、
非常にわかりやすいと思ったスライドがコレです。

## 本

* [オブジェクト指向設計実践ガイド ～Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 - Amazon](http://amzn.to/2zu0KHs)
* [なぜ、あなたはJavaでオブジェクト指向開発ができないのか - Javaの壁を克服する実践トレーニング - Amazon](http://amzn.to/2zqCVjT)

## まとめ

本も読み、コードも書き、
書いては捨て、作っては捨て、
の繰り返しだと思います。
fishシェルでの `brew doctor` で `"config" scripts exist outside your system or Homebrew directories.`

`phpbrew` や `pyenv` を入れた際に `brew doctor` でコケる様になってしまいました。

そこで、いい記事を発見。
[Avoid warning of `brew doctor` with fish & pyenv
](https://qiita.com/komo/items/450180282766ffb250ba)

参考にさせていただき、phpbrew も追加しました。

```bash
function brew
  set tmp_PATH $PATH

  # for phpbrew
  set -l i (contains -i $HOME/.phpbrew/php/php-7.1.11/bin $PATH)
  set PATH[$i] /bin # /bin is dummy

  # for pyenv
  set -l i (contains -i $HOME/.pyenv/shims $PATH)
  set PATH[$i] /bin # /bin is dummy

  command brew $argv

  set PATH $tmp_PATH
end
```
シンプルな形に戻ろう―ベースラインに愛を（翻訳）

# はじめに
　原文「[Backing off towards simplicity - why baselines need more love](http://smerity.com/articles/2017/baselines_need_love.html)」
　あなたは「**ベースライン**」という言葉に心当たりはあるでしょうか？　機械学習系の論文で著者が提案した手法がどれほど優れているかを主張するために引き合いに出される古典的な学習器のことです。一般的には**重回帰モデル、ナイーブベイズ、ランダムフォレスト**あたりがこれに当たるんじゃないかと思います。
　この記事のスタンスは、**最近深層学習ばかりが注目されてベースラインがないがしろにされている**ことに対して警鐘を鳴らすという立場です。個人的に共感する部分が多かったのでQiitaに載せようと思いました。省略している箇所もあるのでざっと読んで気になった方はぜひ原文をどうぞ。以下拙訳です（意訳もかなりあります）。

# 複雑なモデルに付随する問題
　ディープラーニングは**過度なパラメータ**を持つことに加えて**正則化**の問題もある。馴染みがない人のために説明すると、過学習する直前までパラメータを増やし続け、かつ過学習防止のための正則化の効果も増やし続けるというのがディープラーニングの基本戦略である。これはモデルの表現力と学習に要する時間、そして**過学習のリスクの間のダンス**とも呼べる。
　またディープラーニングはその**柔軟性**のため、すべての特徴量の並びと意思決定の骨組みを一気に投入することが頻回する。これはまるであらゆる食材のゴミをすべて引き受ける**キッチンシンク**さながらである。それはパフォーマンスを向上させるかもしれないが、結局どの特徴量が意味のある貢献をしたのかがわからなくなる。もちろんモデルからある部分を取り除いてパフォーマンスに与える影響を調べるやり方もあるが、学習が遅いモデルの場合はこれも事実上不可能である。これらの手法なしでは、我々の直感は容易にミスリードされるだろう。
　さらに、新しい発見に計算のリソースが求められるようになれば研究に参加できる研究者はロケットさながらの**GPUの艦隊**を所有している者に限られる。この分野の価値や社会に与えるインパクトを考えれば、あらゆる分野の研究者が参画することが望ましいにもかかわらず。

# ベースラインの価値
　忘れられがちだが、ベースラインはディープラーニングに匹敵する価値を持っている。なぜなら**改善の度合いをしっかりとチェックできるし、好奇心に任せて手軽に探索することができる。またベースラインを基に新しいイノベーションが起きる可能性も残されている**。
　単純な技法のほうが初心者に理解しやすいのでベースラインは教育のために用いられることが多い。ベースラインがそのシンプルさのためにパフォーマンスを犠牲にしているのだとすれば、ベースラインにどのくらい実用に耐える部分が残っているのだろうと疑問に思うのも当然だ。
　研究者は自分の提案したモデルは熱心にチューニングするが、比較対象となるベースラインについては他の論文で使われたモデルをそのままコピーするだけである。なぜなら**ベースラインを熱心にチューニングすれば、自分の功績を過小評価することになってしまうからだ**。

# ベースラインを最新の手法に改善する手法
　あなたが必要なだけの複雑さを持ったモデルを作成するためには、あなたが思っているよりもシンプルなモデルからスタートするのが良い。既存のライブラリを使うか自分で書くかして、シンプルで早いモデルを手に入れよう。このシンプルさと速さが、**広範なハイパーパラメータの探索、様々な正則化手法の適用、バグに対する入念なチェック、つまらない前処理**に費やす時間を増やし、より良いモデルづくりの礎となるのだ。基本的にベースラインは学習が早いので、我々はパラメータチューニングに多くの時間を費やすことができる。



# ディープラーニングに関する我々の直感は間違っている
　まず最初に紹介するのは、隠れ層のサイズが大きくなればモデルのパフォーマンスが常に改善するという誤解だ。同様の誤解にリカレントニューラルネットワークの依存関係を複雑にすればするよどパフォーマンスが改善するという信念もあるが、これらは必ずしも真ではない。
　具体的な例として私と同僚のジェームズが開発したQuasi-Recurrent Nueral Network (QRNN)がある。これはリカレントな構造を持っていないにも関わらずLSTMと同等の成績を一瞬にして叩きだした。
　もちろん、我々は深層学習の分野における発見が全く価値がないと言うつもりはない。そうではなくて、**ベースラインが劣った学習器であるという我々の直感に頼ることは避けなければならない**というのが我々の主張である。
Raspberry PiにUSBスピーカーを接続する


RaspberryPi 3 Model B にて、USBスピーカーを使えるようにする。
USBスピーカーにある音量ボタンも使えるようにする。

# 使用する機材
- RaspberryPi 3 Model B
- USBスピーカー　ELECOM MS-P05UBK
本体にボリュームボタン、MUTEボタンが付いている。


# 準備
- Raspbianをインストール
- SSH設定
作業用

# 作業
- 音声出力先をUSBスピーカーにする
- alsa-base.confを作成

```
bash: /etc/modprobe.d/alsa-base.conf
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
```

- 音声出力先優先度確認

``` 
cat /proc/asound/modules
 0 snd_usb_audio
 1 snd_bcm2835
```

- 再生テスト
以下でスピーカーから音が出ればOK

```
aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Center.wav
```

###### (補足)
-D plughw:0,0　の指定について
aplay -l にて、接続デバイスを確認
カード0、デバイス0が、対象のデバイス(USBスピーカー)なので、0,0を指定する

```
aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: Set [C-Media USB Headphone Set], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 1: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

- ボリュームを設定する
amixerにて、コマンドラインから設定可能
ボリュームを上げる

```
amixer set PCM 1%+ unmute
```

- ボリュームを下げる

```
amixer set PCM 1%- unmute
```

- ミュート(Toggle)

```
amixer set PCM toggle
```

- ボリューム設定をキーマッピングに設定
 以下、lxde-pi-rc.xml抜粋

```
xml: /home/pi/.config/openbox/lxde-pi-rc.xml
    <keyboard>

    <!-- Keybindings for audio volume media keys -->
      <keybind key="XF86AudioRaiseVolume">
        <action name="Execute">
          <command>amixer set PCM 1%+ unmute</command>
        </action>
      </keybind>
      <keybind key="XF86AudioLowerVolume">
        <action name="Execute">
          <command>amixer set PCM 1%- unmute</command>
        </action>
      </keybind>
      <keybind key="XF86AudioMute">
        <action name="Execute">
          <command>amixer set PCM toggle</command>
        </action>
      </keybind>
    </keyboard>
```

上記は、デスクトップユーザー向けのキーマッピング設定である為、
デスクトップユーザーでログインしないと使えない
そこで、デスクトップユーザーとしてログインしておくことで、キーを有効となるようにする。

電源ONでデスクトップユーザーとしてログインしておくようにraspi-configにて設定

```
sudo raspi-config
```

```
3 Boot Options         Configure options for start-up
　B1 Desktop / CLI                             Choose whether to boot into a desktop environ
　　B4 Desktop Autologin Desktop GUI, automatically logged in as 'pi' user　** <- こちらを選択 **
```

# 改善したい点
デスクトップユーザーでログインした状態にすることで、ボリュームボタンが有効になるようにしている。
ログインした状態にせずにボリュームボタンを有効にしたい。
Google Cloud Platform IoT Coreを使ってみる。

#初めに
##何故、Google Cloud PlatformのIoT Coreを使用するか。
自宅でセンシングしたデータをサーバレスでWEBから表示出来るようにしたかったため。
##何故、GoogleCloudPlatformか。
Google Cloud Next Tokyo'17に参加して興味を持ったため。

##目標
ラズパイからIoT Coreへ繋がるところ一通りやってみます。

#前提
2017年11月時点の情報です。
ラズパイでPythonが動く環境とpipとvirtualenvが入っている必要があります。

以下の投稿を参考にして環境は用意しました。

[Raspberry Piに Python開発環境を構築する](https://qiita.com/msrks/items/f4489c553fb2492f6616)
[pipのインストール方法](https://qiita.com/suzuki_y/items/3261ffa9b67410803443)
[Pythonの仮想環境を構築できるvirtualenvを使ってみる](https://qiita.com/H-A-L/items/5d5a2ef73be8d140bdf3)

#使用するまでの手順
##1.APIを有効にする
GCPのコンソールでビッグデータのIoT Coreを選択すると、APIを有効にするかどうか問われるので有効にする。
##2.端末レジストリを作成する
次に、端末レジストリを作成する。コンソールの指示に従い、レジストリID、Cloudリージョン、Pub/Subのトピックを入力する。IoT Coreのアカウント（iot@system.gserviceaccount.com）にPub/Subの公開権限を付与するようポップアップで指示されるので、続行する。</dd>
##3.デバイス（ラズパイ）で公開鍵、暗号鍵のセットを作成する
ラズパイでopensslを実行して鍵のセットを作成する。

```shell-session

$ openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes -out rsa_cert.pem -subj "/CN=unused" 
```

##4.デバイスを登録する
IoT Coreのコンソール上で作成したレジストリを選択すると「端末の追加」ボタンがあるので押す。
色々入力をもとめられるので以下の通り入力する。

| フィールド |入力内容 |
|:-:|:-:|
| 端末 ID   | (適当なID)  |
| 端末の通信   | 許可 |
|  公開鍵の形式 | RS256_X509|
|  公開鍵の値 | ラズパイで作成したrsa_cert.pemの中身  |

##5.デバイスからリクエストを送る
公式にサンプルプログラムがあったので、デバイスからPhysonを使用してリクエストを送ります。

```shell-session
$ curl -sL https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/iot/api-client/http_example/requirements.txt -o requirements.txt -o requirements.txt
$ curl -sL https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/iot/api-client/http_example/cloudiot_http_example.py -o cloudiot_http_example.py
$ virtualenv env
$ pip install -r requirements.txt
$ python cloudiot_http_example.py --registry_id=(レジストリID) --project_id=(プロジェクトID) --device_id=(デバイスID) --message_type=event --algorithm=RS256 --private_key_file=(秘密鍵へのパス)/rsa_private.pem --cloud_region=(プロジェクトがあるリージョン)
```
以下のようなメッセージが出力され、レスポンスが200であれば正常です。

```shell-session
Publishing message 1/100: 'reg-id/test-payload-1'
('HTTP response: ', <Response [200]>)
```
##6.コンソールを確認する
コンソールの端末詳細画面でLatest activityのTelemetry event receivedがデバイスでコマンドを叩いた時刻になっていればOKです。
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/168941/376ff660-3f39-be54-1647-db86f5dbc020.jpeg)


#終わりに
ひとまずデバイスをIoT Coreに繋ぐところまでできました。
IoT Coreのメイン機能はデバイスの管理とハブ機能の二つっぽいですね。センシングデータを見せる化するためにはPub/Subでさらにどうにかする必要なので、次回はPub/Subをやります。

#参考にしたサイト

[GCP公式Quickstart](https://cloud.google.com/iot/docs/quickstart)
[GCP公式HTTP Client Samples](https://cloud.google.com/iot/docs/samples/http-samples)

ラズパイのPython環境は以下のサイトを参考に構築いたいしました。偉大なる先人たちに感謝いたします。
[Raspberry Piに Python開発環境を構築する](https://qiita.com/msrks/items/f4489c553fb2492f6616)
[pipのインストール方法](https://qiita.com/suzuki_y/items/3261ffa9b67410803443)
[Pythonの仮想環境を構築できるvirtualenvを使ってみる](https://qiita.com/H-A-L/items/5d5a2ef73be8d140bdf3)
メモ：Python3でMySQLを操作するには

　普段はPerl使いな私ですが、趣味でPythonを使った開発をするようになってから日々コードを書いて練習するようになりました。せっかくなので、自分の勉強メモをここに残しておきます。
　何番煎じがわかりませんが、今回はmysql-connectorパッケージを使ったMySQLとの接続方法をメモします。
#開発環境
- CentOS:7.4
- MySQL:5.7.20
- Python 3.6.3 :: Anaconda, Inc.

#コマンド集
- mysql-connectorのインストール

```
# pip install mysql-connector-python-rf
```
- mysql-connectorでのMySQLとの接続
 - cursor()は名前無しのカーソルであり、この状態でSQLを実行するとサーバー側のカーソルの宣言はなく、全行を取得する。

```zisaku.py
import mysql.connector

conn = mysql.connector.connect(user='db_user',
                               password='db_password',
                               host='db_host',
                               database='db_name')
cur=conn.cursor()
```
- MySQLのテーブルを参照(select)

```
sql="select * from test_table"
cur.execute(sql)
```

- 参照した内容を標準出力

```
sql="select * from test_table"
cur.execute(sql)
row = cur.fetchone()

for i in row:
  print(i)
```

- MySQLのテーブルに挿入(insert)

```
sql="insert into test_table (column1) values (test)"
cur.execute(sql)
conn.commit()
```

- カーソルの終了

```
cur.close()
```

- MySQLとの接続を切断

```
conn.close()
```

#参考文献
- PythonとDB: DBIのcursorを理解する
https://qiita.com/knoguchi/items/3d5631505b3f08fa37cc

- MySQL公式ページ
https://dev.mysql.com/doc/
...await: 配列の中でawaitを使い非同期処理をする


早速ですが、以下のコードを見てください。(LTSであるv8.9.1で動作確認済)

```js
const fn = async () => [1, 2, 3]

const main = async () => {
  const list = [...await fn(), ...await fn()]
  console.log(list)
  // [1, 2, 3, 1, 2, 3]
}

main()
```

配列の中でawaitとして得た配列をを`...`で展開しています。
`...await`なんて実際出番ないだろと思うかも知れませんが、`GoogleChrome/puppeteer`でも使われています。

さて、伝えたいことはこれだけですが、それではアレなので、async/catchと一緒に使ってみましょう。

`async/catch`については、以下の記事を参照して下さい。

[async関数においてtry/catchではなくawait/catchパターンを活用する](https://qiita.com/akameco/items/cc73afcdb5ac5d0774bc)

さて、配列を返す関数をランダムでエラーを起こすようにしてみます。

```js
const fn = async () =>
  Math.random() > 0.5
    ? [1, 2, 3]
    : Promise.reject(new Error('hello from array!!!'))

const main = async () => {
  const list = [
    ...(await fn().catch(err => [])),
    ...(await fn().catch(err => []))
  ]
  console.log(list)
  // => []
  // or => [1, 2, 3]
  // or => [1, 2, 3, 1, 2, 3]
}

main()
```

`[]`か`[1,2,3]`か`[1,2,3,1,2,3]`と配列の中で非同期のエラー処理が出来ます。

少し邪悪にしてみます。awaitはthenも待てるので、普通に非同期な処理を配列の中で書くことが出来ます。

```js
const fn = async () =>
  Math.random() > 0.5
    ? [1, 2, 3]
    : Promise.reject(new Error('hello from array!!!'))

const main = async () => {
  const add1 = x => x + 1
  const map = fn => x => x.map(fn)

  const list = [
    ...(await fn().catch(err => console.log(err.message) || [])),
    ...(await fn()
      .then(map(add1))
      .catch(err => []))
  ]

  console.log(list)
  // => hello from array!!!
  // => [ 2, 3, 4 ]
}

main()
```

## おわりに
`...await`の利用シーンは限られている気はしますが、何か面白い使い方ができたらいいですね。
何かあればコメント欄またはツイッターまでお願いします。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr">...await <a href="https://t.co/ChYtTta1BX">pic.twitter.com/ChYtTta1BX</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/928727301474234369?ref_src=twsrc%5Etfw">November 9, 2017</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none" data-cards="hidden" data-partner="tweetdeck"><p lang="en" dir="ltr">...await/catch 🤔 <a href="https://t.co/yxKj5KLvmp">pic.twitter.com/yxKj5KLvmp</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/928764816101056512?ref_src=twsrc%5Etfw">November 9, 2017</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none" data-cards="hidden" data-partner="tweetdeck"><p lang="ja" dir="ltr">とんでもない邪悪が産まれた ...await with async/catch <a href="https://t.co/W8ADwDNUq9">pic.twitter.com/W8ADwDNUq9</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/928783476513312769?ref_src=twsrc%5Etfw">November 10, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
AngularMaterialのPaginatorを日本語化する


AngularMaterialのPaginatorを日本語化する方法を紹介します。
[公式ドキュメント](https://material.angular.io/components/paginator/api)にざっくりと方法が記載されているのですが、具体的な手順がなかったので、試してみた結果を残しておきます。

**日本語化前**

<img width="587" alt="スクリーンショット 2017-11-11 20.15.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/3f8a1fd5-0992-312a-c71a-eeffa50bf240.png">




**日本語化後**

<img width="666" alt="スクリーンショット 2017-11-11 20.34.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/c0abfddf-f337-37d7-9d5a-97b51390aed5.png">


# 環境

今回紹介する内容は、次の環境で試しました。


```bash
$ ng -v
@angular/cli: 1.4.9
node: 8.8.1
os: darwin x64
```

```bash
angular/material@2.0.0-beta.12
```

※最新のAngular5(angluar-cli v1.5.0 + AngularMaterial v5.0.0-rc0)の組み合わせでは未検証です


# 手順

## MatPaginatorIntlを継承したクラスを作成する

### ファイル追加

まずは、新規でファイルを追加します。
今回は、app/sharedに`MatPaginatorIntlJa`とういクラスを作成しました。

angluar-cliでクラスを作成します。

```bash
$ ng g class shared/matPaginatorIntlJa 
```
ファイル名は、`mat-paginator-intl-ja.ts`となりました。

### 実装

継承元のクラスは、以下のソースを参考にしました。
[GitHub -material2/src/lib/paginator/paginator-intl.ts](https://github.com/angular/material2/blob/9a05ecdb632fbe91dd74b6d1e937ab9343d24413/src/lib/paginator/paginator-intl.ts)


```ts:mat-paginator-intl-ja.ts
import { MatPaginatorIntl } from '@angular/material';

export class MatPaginatorIntlJa extends MatPaginatorIntl {
  itemsPerPageLabel = '件数';
  nextPageLabel     = '次へ';
  previousPageLabel = '戻る';

  getRangeLabel = (page: number, pageSize: number, length: number) => {
    if (length === 0 || pageSize === 0) { return `${length} 件中 0`; }

    length = Math.max(length, 0);

    const startIndex = page * pageSize;

    const endIndex = startIndex < length ?
      Math.min(startIndex + pageSize, length) :
      startIndex + pageSize;

    return `${length} 件中 ${startIndex + 1} - ${endIndex}`;
  }
}
```

MatPaginatorIntlクラスを継承して、それぞれのラベルの値をメンバ変数またはメソッドをオーバーライドして変更します。`getRangeLabel `メソッドは、上記「日本語化前」のスクリーンショットの`11 - 20 of 100`の部分の表示を行うものです。

## app.module.tsで読み込み

MatPaginatorModuleに加え、MatPaginatorIntlモジュールをインポートし、今回作成した多言語化用クラスを次`@NgModule`のprovidersに次のように追加します。

```ts:app.module.ts
import { MatPaginatorModule, MatPaginatorIntl } from '@angular/material';
import { MatPaginatorIntlJa } from './shared/mat-paginator-intl-ja';
...
providers: [
     ...
    { provide: MatPaginatorIntl, useClass: MatPaginatorIntlJa }
  ]
...
```

以上で、日本語化されているかと思います。

# 参考

* [Angular Material -Paginator](https://material.angular.io/components/paginator/api)
* [GitHub -material2/src/lib/paginator/paginator-intl.ts](https://github.com/angular/material2/blob/9a05ecdb632fbe91dd74b6d1e937ab9343d24413/src/lib/paginator/paginator-intl.ts)
Browser Solidityでスマートコントラクトをデプロイする際ハマったこと

Browser Solidityで簡単なスマートコントラクトをやってみたかったら、いろいろハマったので、メモしておきます。

## 前提
スマートコントラクト内容は特に何もないですが、やりたいのは、スマートコントラクトコンストラクタメソッドでパラメータのアドレスを`ownerAddress`に保持したいだけ。

```js
pragma solidity ^0.4.0;

contract TestTranster {
    address public ownerAddress;
    
    function TestTranster(address _ownerAddress) public {
        ownerAddress = _ownerAddress;
    }
}
```

## はまったこと
- `Web3 Provider` を使いたいが、`geth`を起動しておいているのに、`Not possible to connect to the Web3 provider. Make sure the provider is running and a connection is open (via IPC or RPC).`で接続できない
    - 現象
    ![スクリーンショット 2017-11-11 20.21.01.png](https://qiita-image-store.s3.amazonaws.com/0/4777/ab595366-fa26-f3ba-3ffa-8ecefe89b406.png)
    ![スクリーンショット 2017-11-11 20.21.08.png](https://qiita-image-store.s3.amazonaws.com/0/4777/087e4a2f-b680-d22a-67f5-c2a5b296a83c.png)
    - 解決方法：`geth`の起動コマンドに `--rpccorsdomain "*"`オプションを追加する`geth --networkid "10" --nodiscover --rpc --rpccorsdomain "*" --datadir . console 2>>./err.log`
- コンストラクタメソッドのパラメータはどうやって渡すかは分からない
    - 現象：確かにこの辺に入れれば行けるはずだが、正しいアドレスをコピペして入れてCreateボタンをクリックしたらエラー
      ![スクリーンショット 2017-11-11 20.27.18.png](https://qiita-image-store.s3.amazonaws.com/0/4777/0c32fcd7-1944-4798-f1ec-3c57604eee6b.png)
      - `creation of browser/ballot.sol:CloudeaClubTranster errored: Error encoding arguments: SyntaxError: Unexpected token x in JSON at position 2`
    - 解決方法：入力フィールドの普通にJSONとして解析されるので、文字列ならちゃんとダブルクオーテーションを入れれば上記エラーでなくなりました
- `creation of browser/ballot.sol:CloudeaClubTranster errored: authentication needed: password or unlock`
    - 現象：これはまあ、分かると思いますが、操作しているAccountをunlockしておく必要がある
    - 解決方法：geth consoleで、`personal.unlockAccount('選択されているアカウントのアドレス', 'そのアカウントのパスワード')`実行しておいてから、`Create`ボタンクリックするとできました。
    - **もちろん、`miner.start()`を実行しないと、ブロックチェーンに書き込まられない**

以上
Ruby on Rails チュートリアルで作成したヘッダーをレスポンシブデザインに対応させる

# 問題点

[Ruby on Rails チュートリアル 第5章](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#cha-filling_in_the_layout)を終えるとBootstrap3によってサイトのデザインが洗礼されますが、このヘッダーには次のような問題があります。

ウィンドウの幅が広い場合はヘッダーの表示に問題がありませんが、
![rails-header01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/321b7ed4-7194-9804-26eb-b611d0c73613.png)

ウィンドウの幅を狭くしたり、スマホなどで閲覧するとヘッダーの表示がくずれてボディ部分の表示に重なってしまいます。

![rails-header02.png](https://qiita-image-store.s3.amazonaws.com/0/141934/318121ce-58bb-663f-c2e4-9a014e178f59.png)

# 解決方法

1. ウィンドウ幅が狭くなった際にメニューボタンを表示させる。
2. メニューボタンをクリックすると、プルダウンが表示され、ヘッダーの項目が選択できるようにする。

![rails-header2.gif](https://qiita-image-store.s3.amazonaws.com/0/141934/281e33f9-cac7-7fa2-1165-42e1e44cdbee.gif)

![rails-header.gif](https://qiita-image-store.s3.amazonaws.com/0/141934/66271ff5-09f8-99a4-cb1e-7c1f31aecfe9.gif)

# 実装

## 準備

### Gemfile

Gemfileに`gem 'jquery-rails'`を追記してインストールしておく。

```ruby:Gemfile
gem 'bootstrap-sass', '3.3.6'
gem 'jquery-rails'
```

```shell-session
$ bundle install
```

### application.js

application.jsに`//= require jquery`と`//= require bootstrap`を追記しておく。

```js:app/assets/javascripts/application.js
//= require rails-ujs
//= require turbolinks
//= require jquery
//= require bootstrap
//= require_tree .
```

## ヘッダーの修正

### Before

```html+erb:app/views/layouts/_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home",   root_path %></li>
        <li><%= link_to "Help",   help_path %></li>
        <li><%= link_to "Log in", '#' %></li>
      </ul>
    </nav>
  </div>
</header>
```

### After
```html+erb:app/views/layouts/_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">

    <!-- 追記ここから-->
    <div class="navbar-header">

      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <!-- 追記ここまで-->

      <%= link_to "sample app", root_path, id: "logo" %>

    <!-- 追記ここから-->
    </div>
    <!-- 追記ここまで-->

    <nav>
      <!-- ulタグ内に「id="navbar"」を追記、classに「navbar-collapse collapse」を追記 -->
      <ul id="navbar" class="nav navbar-nav navbar-right navbar-collapse collapse">
        <li><%= link_to "Home",   root_path %></li>
        <li><%= link_to "Help",   help_path %></li>
        <li><%= link_to "Log in", '#' %></li>
      </ul>
    </nav>
  </div>
</header>
```

## 補足

**準備**を行わないで`_header.html.erb`を編集した場合、ウィンドウ幅を狭めた時にメニューボタンは表示されるものの、ボタンをクリックしてもメニューが表示されない動作となります。
Safariの「Intelligent Tracking Prevention（ITP）」がどう影響するか

こんにちは！エイチーム引越し侍の岸です。マーケティング部所属のエンジニアです。
今回は、マーケティングの知識と、エンジニアとしての知識を活かして、
2017年9月にリリースされたSafari 11.0より導入された「Intelligent Tracking Prevention（ITP）」についての記事を書きたいと思います。

#これ何の記事？
AppleのSafari 11.0から「Intelligent Tracking Prevention（以降ITP）」が搭載されました。
これなに？という説明から、これが導入されることによるマーケッターへの影響と、エンジニアが知っておくべきことをまとめます。

# ITPとは？
簡単に言うと、ITPはユーザーのプライバシー保護の観点から、「サードパーティードメインへのCookie保持期間を24時間までとする」といったものです。

こちら、[WebKit](https://webkit.org/blog/7675/intelligent-tracking-prevention/)から引用してきた画像になるのですが、本来のCookie保持期間は30日間なのに対して、サードパーティードメインへのCookie保持は24時間とはっきり記載されていますね。

![tracking-prevention-timeline.png](https://qiita-image-store.s3.amazonaws.com/0/117041/c86df7bd-e8c2-01eb-4f7a-a9b506c9ed4a.png)
>引用 : [WebKit Intelligent Tracking Prevention](https://webkit.org/blog/7675/intelligent-tracking-prevention/)

例えば、a.com（ファーストパーティードメイン）というサイトから、b.com（サードパーティードメイン）へのCookie情報引継ぎは24時間までとなります。

こちら、2017年6月5日のAppleの開発者向けカンファレンス WWDC 2017 で発表され、2017年9月20日にAppleがリリースしたSafari11.0より標準搭載された機能です。

# どんな影響があるの？
具体的には以下のような影響があると考えられています。

- Google Analytics、Google AdwordsでのCVタグが発動しないケースが発生する

　例えば弊社が運営している[引越し侍(https://hikkoshizamurai.jp/)](https://hikkoshizamurai.jp/)からしてみたら、Google Analytics、Google Adwordsはサードパーティードメインとなります。
　ですので、Safari11.0ブラウザを使って、24時間より後に再訪してきたユーザーについてはコンバージョンタグが発動しないという現象が発生します。
　コンバージョントラッキングが正常にできないのはマーケッターにとっては結構いたいですね...

- リターゲッティング広告で追跡できるのが最大24時間になる

　これも上記と同じ理由なのですが、サードパーティーへのCookie保持期間が24時間になることにより、リターゲッティング広告で追跡できる期間も24時間になってしまうことになります。
　余談ですが、この機能追加により、Criteo広告を展開しているCriteo社の株価が一気に下がったそうです...
> [safariのcookieポリシー変更により、Criteoの株価が約300億円吹き飛ぶ](http://adworld.hatenablog.com/entry/2017/06/13/004208)

# これにより影響を受けるのはだれ？
リターゲッティング広告で追跡できる期間が24時間になってしまうのはマーケッターにとっては非常に痛いです。リターゲッティング広告からの流入したユーザーは数あるディスプレイ広告の中でもCVRが高いと言われていますので、この広告での追跡期間が短くなるのは、企業にとっても痛手です。

尚、コンバージョンタグが発動しない問題への対策として、Googleが以下のような対策を打っているようです。

1. 自動タグ設定が有効になっており、Google Analyticsタグが実装されているサイトでは、今後、ドメインに Google Analyticsの新しい Cookie が設定されるようになります。この Cookie には、お客様のサイトにユーザーを誘導した広告クリックに関する情報が保存されます。AdWords と Google Analyticsのアカウントがリンクされている場合、AdWords のコンバージョン トラッキング タグでその情報が使用可能になります。

2. AdWords では引き続き、Google のサービスやドメインを最近利用したユーザーのコンバージョンをレポートいたします。

3. また、統計モデルを使用して、Safari で測定できなかったウェブサイト コンバージョンを推定し、その推定値もお客様のレポートに含めてまいります。

# エンジニアとして気を付けるべき点
Cookieを使ったデータの受け渡し処理というのは比較的よく使われている処理ではないでしょうか？
ドメインをまたいでというパターンは少ないかもしれませんが、そのような処理を行う場合は、24時間しかCookieが有効ではない点を意識したうえでの開発を行うか、そもそもドメインをまたいだCookieによるデータ引継ぎ処理を行わないように意識する必要がありそうです。


# 追伸
株式会社エイチーム引越し侍では、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい！という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております！！

> [エイチームグループ採用サイト（Web開発エンジニア職）](http://hikkoshi.a-tm.co.jp/recruit/request.php?ea=kekiqiita_itp)
Rails5.1@webpackerのDocker環境で使うときのメモ 2017/11/11


# はじめに
- いつのまにかwebpackerのconfigがpackage内に移ってた
  - [前](https://qiita.com/tetsuyainfra/items/2c3c456a6873323f863d)の方法は使えない
- 環境変数でWebpack-dev-serverの設定を変更可能
  - docker-composeで開発環境動かしてるのでdocker-compose.ymlの設定を記述する
- ちょっとよくわからないのがhmrの設定方法

# 関連
- [rails/webpacker: Use Webpack to manage app\-like JavaScript modules in Rails](https://github.com/rails/webpacker#development)
- [webpacker/config\.js at master · rails/webpacker](https://github.com/rails/webpacker/blob/master/package/config.js)


## 変更点
コンテナへ環境変数を渡して変更して貰う

```yml:docker-compose.yml
services:
  app:
    build: .
    environment:
      RAILS_ENV: development
      // ↓追加
      WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
      WEBPACKER_DEV_SERVER_PUBLIC: example.local:3035 // 外部からアクセスする時に使われるIP等
      WEBPACKER_DEV_SERVER_INLINE: "true"
      WEBPACKER_DEV_SERVER_HMR: "false" 
    ports:
      - '3000:3000'
      - '3035:3035' // <- 追加
```


直接設定ファイルを書き換えても問題ない

```yml:config/webpacker.yml
development:
  <<: *default
  compile: true

  # Reference: https://webpack.js.org/configuration/dev-server/
  dev_server:
    https: false
    host: localhost
    port: 3035
    public: localhost:3035
    hmr: false
    # Inline should be set to true if using HMR
    inline: true
    overlay: true
    disable_host_check: true
    use_local_ip: false
```



# 出力
```sh:BEFORE
$ bin/webpack-dev-server
Project is running at http://localhost:3035/
webpack output is served from /packs/
Content not from webpack is served from /code/public/packs
404s will fallback to /index.html
```

```sh:AFTER
$ bin/webpack-dev-server
Project is running at http://example.local:3035/          <- コレ
webpack output is served from /packs/
Content not from webpack is served from /code/public/packs
404s will fallback to /index.html
Hash: 2bf9e4a634e736c14d24
Version: webpack 3.8.1
Time: 5052ms
```


# その他
環境変数から書き換えてるコードの場所

```js:webpacker/package/config.js
// https://github.com/rails/webpacker/blob/b71db699e6937895b745cea6828a50d1d506037c/package/config.js#L11
const devServer = (key) => {
  const envValue = fetch(`WEBPACKER_DEV_SERVER_${key.toUpperCase().replace(/_/g, '')}`)
  if (typeof envValue === 'undefined' || envValue === null) return config.dev_server[key]
  return envValue
}

if (config.dev_server) {
  Object.keys(config.dev_server).forEach((key) => {
    config.dev_server[key] = devServer(key)
  })
}
```
twitterが280字になったので、ツイートをライブラリとしてバベって使う

ツイッターが英語で280文字書けるようになりました🎉
つまり、ツイッター上でコードを書くのが現実的になったということですね。

せっかくなので、ツイートをライブラリとして使ってみましょう。適当に呟いて、`import hello from 'twitter:あなたのツイート'`と書いたら、Babelをつかってツイートをコンパイルして実行です。

[![https://gyazo.com/e3851ff3d1cdee3acd8bef2a777b2dc3](https://i.gyazo.com/e3851ff3d1cdee3acd8bef2a777b2dc3.gif)](https://gyazo.com/e3851ff3d1cdee3acd8bef2a777b2dc3)



## How to Use

`babel-plugin-twitter`をインストールして、`create-babelrc`で.babelrcを生成します。

```
$ yarn add --dev babel-{cli,preset-env,plugin-twitter}
$ npx create-babelrc -o
Created .babelrc

{ presets: [ 'env' ], plugins: [ 'twitter' ] }
```

あとは適当にコードを書いて実行します。
もちろん280文字で出来るのはハローワールドだけじゃありません。

```js:index.js
import leftPad from 'twitter:712799807073419264'

console.log(leftPad(1, 5)) // '00001'
console.log(leftPad(1234, 5)) // '01234'
console.log(leftPad(12345, 5)) // '12345'
```

```
$ yarn run babel-node index.js
00001
01234
12345
```

🎉


これで、**ツイッター = コーディング** という関係が成り立ちました。
これからは堂々とツイッターという**エディタ**でコードを書くことが出来ますね。

## 実装
同期的にツイートを取得して、それを`node_modules/.cache`以下にキャッシュします。なので、リクエストは最初の1回だけで2回目からは不要なリクエストもせず高速で動きます。`node_modules/.cache`へのキャッシュは`ava`や`babel-loader`でも使われている手法です。

後はASTを適当にいじれば以下のように変換されます。簡単ですね。

```js
import leftPad from 'twitter:712799807073419264'

      ↓ ↓ ↓ ↓ ↓ ↓

const leftPad = (v, n, c = '0') => String(v).length >= n ? '' + v : (String(c).repeat(n) + v).slice(-n);
```

## おわりに
**絶対に**プロダクションで使わないで下さい。**ツイートが削除された瞬間**あなたのプロダクトは**終了**です。

https://github.com/akameco/babel-plugin-twitter

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">twitterはエディタなので、ツイートをバベるとコードを実行できる<a href="https://t.co/GlEDNmG8TY">https://t.co/GlEDNmG8TY</a> <a href="https://t.co/VRQ8fAac23">pic.twitter.com/VRQ8fAac23</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/928545495319851008?ref_src=twsrc%5Etfw">November 9, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">例のアレ<br> <a href="https://t.co/GlEDNmG8TY">https://t.co/GlEDNmG8TY</a> <a href="https://t.co/xEgjohhdR7">pic.twitter.com/xEgjohhdR7</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/929277391179988992?ref_src=twsrc%5Etfw">2017年11月11日</a></blockquote>


Babel Pluginについて興味が出たなら他の記事もどうぞ。

[**さよならボイラープレート。s2sによる高速reduxアプリケーション構築**](https://qiita.com/akameco/items/e1489c6bbf3439ec6ca4)

[面接でFizzBuzzを書けと言われたときにすべきこと - Qiita](https://qiita.com/akameco/items/d2851fd4868f833c8040)

[JavaScriptのfloatで正確な比較を行う - Qiita](https://qiita.com/akameco/items/019e1a0875ad236e859c)


## 参考
ツイートをローカルで実行するの元ネタはrauchg氏の`requireFromTwitter`です。

https://gist.github.com/rauchg/5b032c2c2166e4e36713
MySQL5.7をインストールしたあと、好きなパスワードに一発で変更するワンライナー

``` shell
mysql --connect-expired-password -u root -p$(grep 'temporary password' /var/log/mysqld.log | cut -d' ' -f11) -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'パスワード';"
```

パスワードのポリシーがデフォルトでMEDIUMなので、パスワードが最低1つの数値文字を含み、1つの小文字および大文字を含み、1つの特殊文字を含む必要がある。

カンタンなパスワードにしたい場合は、事前に

mysql> SET GLOBAL validate_password_length=4;
mysql> SET GLOBAL validate_password_policy=LOW;

のように変更しておく必要がある。

``` shell
mysql --connect-expired-password -u root -p$(grep 'temporary password' /var/log/mysqld.log | cut -d' ' -f11) -e "SET GLOBAL validate_password_length=4;SET GLOBAL validate_password_policy=LOW;ALTER USER 'root'@'localhost' IDENTIFIED BY 'パスワード';"
```

上記のコマンドで4文字以上であれば好きなパスワードにできる。
array_map（コールバック関数）の小さなサンプル

# コード

```php:test.php
<?php
function sum($param){
        return $param + 1;
}

$arr = array(1,2);
$result = array_map("sum", $arr);

var_dump($result);

$result = array_map(function ($param){
        return $param + 10;
}, $arr);
var_dump($result);
```

# 実行

```
$ php test.php
array(2) {
  [0]=>
  int(2)
  [1]=>
  int(3)
}
array(2) {
  [0]=>
  int(11)
  [1]=>
  int(12)
}
```
CakePHP3でストアドプロシージャを使った更新系の処理

CakePHP3に直接SQLを書く方法で、ストアドプロシージャを利用してみたいと思います。
ストアドプロシージャでは、他テーブルへの処理や複雑なクエリーなど色々と出来るうえ、メンテナンスも行い易いです。

##やりたい事
以下の様なURLで追加処理した際、ストアドプロシージャを使って全く別テーブルに対して追加処理を行いたいと思います。
http://localhost:8000/posts/add

##環境
CakePHP3.5.x
MySQL

##データベースの準備
他テーブル（sub_tables）に対して更新系の処理を行いたいと思います。
下記のストアドプロシージャを作成後、phpMyAdminでもコマンドラインからでも構いませんので、`CALL st_add('hogehoge'); ` とSQL実行すると、sub_tablesに**`hogehoge`**が挿入されていますので確認して下さい。
※ストアドプロシージャが正しく動いていないとCakePHPに問題があるのかMySQL側の問題なのか切り分けが出来ないため。

####*サブテーブルを作成*
```sql:MySQL
CREATE TABLE `sub_tables` (
  `id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

####*ストアドプロシージャを作成*
```sql:MySQL
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `st_add`(IN `parm1` VARCHAR(50))
    NO SQL
INSERT INTO sub_tables
(name)
VALUES
(parm1)$$
DELIMITER ;
```
##Controllerの修正
CakePHP3で直接SQLが実行するようにController側にConnectionManagerを使います。

```php:src¥Controller¥PostsController.php
<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Datasource\ConnectionManager; // 追加

class PostsController extends AppController
{
    public function add()

        $post = $this->Posts->newEntity();
        if ($this->request->is('post')) {


            // POSTデータを変数に格納
            $mydata = $this->request->getData();

　　　　　　　// 直接SQLを書くには ConnectionManager::get が必要ので 一番上のuse文も忘れずに。
        　　$con = ConnectionManager::get('default');

           // トランザクション処理
           //※ストアドプロシージャの場合、機能するかは未確認
        　　$con->begin();

           // 直接SQLでストアドプロシージャを実行（POSTの'title'をパラメータとします）
        　　$con->execute('CALL st_add(:name)',[
           　　　     'name' => $mydata['title']
                　　　]);
        　　$con->commit();

           return $this->redirect(['action' => 'index']);

        }
        $this->set(compact('post'));
        $this->set('_serialize', ['post']);
}

```
##その他
`sub_tables`テーブルに対して追加処理していますが、CakePHP側で`sub_tables`テーブルのMVCを作る必要はありません。
##参考サイト

> https://book.cakephp.org/3.0/ja/orm/database-basics.html
ジェスチャーに対応していないタッチパッドで仮想デスクトップ間の移動をジェスチャ風にやりたい

## はじめに
windows 10の機能に仮想デスクトップというものがあります．

この機能は標準だと，

* [windowsキー] + Ctrl + D : 新しいデスクトップの作成
* [windowsキー] + Ctrl + 右/左 : 仮想デスクトップの切り替え
* [windowsキー] + Ctrl + F4: 仮想デスクトップを閉じる

という設定になっているのですが，押すキーが多くて自分はあまり好きではありませんでした．
ノートPCのメーカーによっては，ジェスチャ割当に対応しているタッチパッドもあるようですが，残念ながら自分の使っているMacBookProのBootcampドライバではジェスチャ操作までは対応してくれていませんでした．

![bootcamp_notouchpad.PNG](https://qiita-image-store.s3.amazonaws.com/0/154671/d7cf15c5-d404-fb8d-c81b-c10f6741bf7d.png)


そこで，今回はAutohotkeyを使ってmacっぽく仮想デスクトップ間の移動をできるように設定してみました．

## 設定方法

次のようなスクリプトを`(ファイル名).ahk`で適当な場所に保存します．
このahkファイルをautohotkeyで実行（ダブルクリック）すると設定が適用されます．
シャットダウンすると設定が消えるので，自動設定したい場合はスタートアップフォルダ(C:\ProgramData\Microsoft\Windows\Start Menu\Programs)にこのスクリプトを置いておきます．

使い方はAlt + 2本指スクロールです．trackpad++を入れると3本指ジェスチャにも対応するようですが，自分は使ってないので2本指操作でやってます．


| 操作 | 効果 |  
|:-----------------:|:------------------:|
| Alt + 右スクロール| 右のデスクトップに移動 |
| Alt + 左スクロール| 左のデスクトップに移動 |
| Alt + 上スクロール| アプリケーション一覧を表示 |

なお，自分の設定では，レジストリエディタで通常スクロールと水平スクロールの向きをそれぞれ逆転させているので，そうではない方は逆に読み替えてください．

```autohotkey
Alt & WheelLeft::
    Send,#^{Left}
    Sleep, 1000 / 4
    return  
Alt & WheelRight::
    Send,#^{Right} 
    Sleep, 1000 / 4 
    return 
Alt & WheelDown::
    Send,#{Tab}
    Sleep, 1000 / 2 
    return
```

## 結論
AutoHotKey便利！！
sbtを使わないでScalaのインストール（Mac版）

新しいプロジェクトの開発環境がScalaということで、PHPerからScalarへ転身しようとしている私です。
ということで、まずは手始めにScalaのインストールのメモ書きです。
ここでは一般的なビルドツール、sbtを使わない方法を紹介します。

## 前提・環境

- MacBook Pro (Retina, 13-inch, Mid 2014)
    - macOS Sierra
- Java1.8.0_91

## 手順

### 1. Java8がインストールされているか確認

ターミナルで以下実行し、バージョン1.8がインストールされていることを確認

```bash:
$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
```

### 2. Scalaのインストール

[Scalaの公式サイトのDownloadページ](http://scala-lang.org/download/)のページ下部「Other Resources」より、
執筆時点で最新の scala-2.12.4.tgz をターミナルで以下実行し
ダウンロード＆ファイル展開、環境変数を設定

```bash
$ cd ~
$ mkdir XXX
$ cd XXX
$ curl -O https://downloads.lightbend.com/scala/2.12.3/scala-2.12.4.tgz
$ tar xvzf scala-2.12.4.tgz
$ echo 'export PATH=~/XXX/scala-2.12.3/bin:$PATH' >>~/.profile
$ . ~/.profile
```

### 3. scalaコマンドを実行してみる

```bash
$ scala
Welcome to Scala 2.12.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91).
Type in expressions for evaluation. Or try :help.

scala>  println("Hello, world, from a script!")
Hello, world, from a script!

scala> 
```

## 以上です

とっても簡単でした。これからどんどんScala記事アップしていきたいと思います。
powershellの実行結果をエクセルに出力

したいこと：
ショートカットのリンク先変更
以前の投稿より改善箇所が多いので改めて投稿

コメント：
いろいろな方のいいところの全部乗せ。
リンク先の書き換えができなかったときにそなえ、
もともとのリンク先をエクセルに落とし込みたかった。
エクセルの１列目にショートカットの名前、
2列目にリンク先が出力されます。

$$特殊フォルダとしてデスクトップを取得
$path=[system.environment]::getfolderpath([system.environment+specialfolder]::desktop)
cd $path

$$ファイルオブジェクトの生成
$wsh=New-Object -ComObject wscript.shell
$fnames=Get-ChildItem -Recurse -Include *.lnk

$$エクセルのオブジェクト生成
$excel=New-Object -ComObject excel.application
$excel.visible=$false
$wb=$excel.workbooks.add()
$sheet=$excel.worksheets.item(1)
$i=2　#エクセルファイルの2行目から書き込み

$$ショートカットをひとつひとつ処理する
foreach($fname in $fnames){
$sht=$wsh.createshortcut($fname)
$fnamefull=$sht.fullname
$link_name=$sht.targetpath
$sheet.cells.item(1,1)="ショートカットの名前"
$sheet.cells.item(1,2)="リンク先"
$sheet.cells.item($i,1)=$fnamefull
$sheet.cells.item($i,2)=$link_name
$i++
$str=$link_name.split("\")
$str.length

$$リンク先の判別。リンク先を￥で分割して配列にして対応
if($str[1] -match "Users"){
$変更したいリンク先と入れ替え
$str[1]="dell"
$new_path=$str -join "\"
$sht=$wsh.createshortcut($fnamefull)
$sht.targetpath=$new_path
$sht.save()
}else{
}
}

$$エクセルの列幅を文字にあわせる
$null = $sheet.Columns.AutoFit()
$wb.saveas($path + "\" + "recult.xlsx")
$excel.quit()
$excel=$null
$wsh.popup("完了しました。")
【PyQ/登録してみた】

#はじめに
「プログラミングって言葉は聞いたことはありますー」くらいの素人です。

PyQ
https://pyq.jp/

Pythonなるプログラミング言語を初心者からでも学べるサービスとの事(有料です)。

職場の先輩に教えてもらって、2時間悩んだ末に登録してみました。

---
…というのは一ヶ月ほど前の話。

初めて触れるプログラミングというジャンルに、全然馴染めず進捗もすこぶる悪い。。

そこそこな月額費を捨てる訳にはいかないと、改めて今日から気合を入れなおす。

取り合えず今までの振返りとしての記録を起こします。
LINE Rich Menu API のWindowsでの画像のアップロードの仕方

LINE MessageAPIでRich Menu APIを利用するのに画像をアップロードするときにWindowsだとcUrlが無いのでどうしたらいいんだっていう時のメモ

Rich Menu APIに関してはこちらを参照
[LINE BotのRich Menu APIの使い方まとめ](https://qiita.com/stachibana/items/5dcb5ed3c6b3015601a7)


1:  PowerShellをコマンドラインで立ち上げる
```c:xxx > powershell
```

2:  headerやファイルのパスを変数として登録しておく

```
$headers = @{"Authorization" = "Bearer {CHANNEL_ACCESS_TOKEN}";"Content-Type"="image/jpeg"}
$imagePath = "C:\xxxx\xxxxx.jpg"
```

3: 下記のコマンドを実行

```
Invoke-RestMethod -Uri "https://api.line.me/v2/bot/richmenu/{richMenuId}/content" -Method POST -Headers $headers  -InFile $imagePath2
```
ESLint v4.11.0

前 [v4.10.0] | 次 [v4.12.0]

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v4.11.0 has been released: <a href="https://t.co/g2g1iT90oT">https://t.co/g2g1iT90oT</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/929096783283851265?ref_src=twsrc%5Etfw">November 10, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.11.0 がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

## [#9464]: `--format` CLI オプションが npm パッケージをサポートしました

この CLI オプションは、`eslint` コマンドの表示フォーマットを制御します。もともとは[組込のフォーマッター](https://eslint.org/docs/user-guide/formatters/)とファイルパスをサポートしていました。

今回、新たに npm パッケージをサポートしました。

```console:例
$ npm install --save-dev eslint-formatter-pretty
$ eslint src --format pretty
```

----

[v4.10.0]: http://qiita.com/mysticatea/items/95d10cdf6ed713a8aada
[v4.12.0]: http://qiita.com/mysticatea/items/149f48ac8483a8571197
[#9464]: https://github.com/eslint/eslint/issues/9464
[#9999]: https://github.com/eslint/eslint/issues/9999
[xxxx]: http://eslint.org/docs/rules/xxxx

<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
特定のファイルを一括移動をコマンドでやりたい気分の時


やりたいこと：下のほうのフォルダ階層のあるファイルを一気に移動させたかった。
結論；findとxargsでok

finderで検索してもできるけど、コマンドでやりたい気分だった。
普通にmvコマンドでやるとArgument list too longエラーが出た。

自分の場合はこんな感じのフォルダー構成

```
001/1.jpg
001/2.jpg
001/3.jpg
002/1.jpg
002/2.jpg
002/3.jpg
```

#findコマンドとxargs

```
find [ディレクトリ] -name [条件] -print0 | xargs -0 -I{} mv {} [移動先]
```

自分の場合は正規表現で-Eオプションをつけて
これでいけた

```
find -E . -name "*.jpg" -print0 | xargs -0 -I{} mv {} .
```



#参考
https://qiita.com/ganessa/items/40fbaa50dd0b65e403a2
BigQueryで当月最終日を取り出す

BigQueryのtimestamp型の値から、その日付が属する月の日数を取り出す方法を考えてみました。レガシーではない方のSQLを使っています。

```sql
SELECT EXTRACT(
  DAY FROM DATE_SUB(
    DATE_ADD(
      DATE_TRUNC(DATE(TIMESTAMP "2000-02-01 01:23:45"), MONTH),
      INTERVAL 1 MONTH
    ),
    INTERVAL 1 DAY
  )
)
```

どうにも冗長っぽいのですが、これより短くできませんでした。

# 参考URL

* [BigQuery - クエリリファレンス（標準SQL） - DATE 関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators?hl=ja#date-functions)
実行中プロセスの確認

すぐ忘れるのでメモ。
たとえば、"python"関連の実行プロセスがあるかどうか確認したいとき。
以下の二つの方法を記載する。

1.pgrep
2.ps


# 1. pgrep使用

```.sh
#pgrep 検索したい実行プロセス
#-l は実行プロセスも同時に出力するオプション

$ pgrep -l python
```


# 2.ps 使用

```.sh
#ps で実行プロセスの表示
#a:自分以外のユーザーのプロセスも表示する
#u:ユーザー名と開始時刻を表示する
#x:実行中のプロセスだけ表示する
#全出力した実行プロセスのなかから、grepで"python"が含まれるプロセスのみを抽出

$ ps aux | grep "python"
```

psのオプションは他にもたくさんあるのでその時々に応じて。
IoTの無線方式とデバイス認証方式についてのまとめ

#スライドシェアにまとめました(2017年11月24日追記)
<iframe src="//www.slideshare.net/slideshow/embed_code/key/3vMwNA60GnzQBJ" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/RyosukeUematsu/io-t-v10" title="主要Io t通信規格と認証方式" target="_blank">主要Io t通信規格と認証方式</a> </strong> from <strong><a href="//www.slideshare.net/RyosukeUematsu" target="_blank">Ryosuke Uematsu</a></strong> </div>

#IoTの無線方式
最近話題のIoTについて無線通信技術からデバイス認証の方式についてまとめてみます。覚書程度の殴り書きですので、その点はご容赦ください。
誤りのご指摘や詳細な情報をお持ちの方はご指南いただけるとありがたいです。

さて、巷ではやれLoRaWANだ、SIGFOXだ、WiSUNだと様々な方式が乱立しています。その方式をまずは以下のようにまとめました。

**IoTの無線方式一覧**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155020/06b546a1-26b7-5f73-e9e1-b3bc648b0380.png)

セルラー系と非セルラー系と分けていますが、要はライセンスバンド使っているか、アンライセンスバンドを使っているかどうかで分かれます。非セルラー系の周波数は日本では特定小電力の周波数帯である920MHzをメインで使用しています。2.4GHzや5GHz帯などより回折に強く、伝播距離が長いため、より広い範囲をカバーすることが可能となる。

セルラー系は、現在の3G/4Gで通信キャリアが用いている、700MHz～5GHz帯のいずれか、または全てで利用可能と考えれます。IoT向けの規格であるNB-IOTでは、少々特殊な方式も存在し、ガードバンドを用いて通信する方式もあります。


**NB-IOTの周波数の使い方**
![NB-IoT-Frequency-Spectrum.jpg](https://qiita-image-store.s3.amazonaws.com/0/155020/30b27770-270b-fc36-e2d7-a0732a5bc9a2.jpeg)

#乱立するIoTの無線方式の本命は？
これだけ乱立していると、どの方式が今後広がっていくのか、どれが本命なのか気になるところではあります。現在のところ、すでに日本国内でサー展開さビス利用されているのは、LoRaWAN、SIGFOX、LTE/3Gを用いたサービスです。NB-IOTはまだ展開されておりません。(他にもあるかもしれませんが、主要なものということでご容赦ください。)

MVNOであるSORACOM社はIoTのサービスで規模拡大を図っています。そのSORACOMが採用している方式がまさにLTE/3G、LoRaWAN、SIGFOXであります。

また、LTE/3G、LoRaWAN、SIGFOXはそれぞれ特性が異なり、IoTの方式としては共存していく可能性が高いと考えられます。LTE/3G→NB-IoTのセルラー系は、高速・大容量・広いカバーエリア、ただしコストは一番かかるリッチな方式です。LoRaWANは、必要に応じてスポット的にエリアを構築することが可能であり、自社工場内のシステムに使う等に最適です。SIGFOXは、非常に低速ですが、消費電力は低く、かつコストも一番安く済む方式です。大量のデバイスでセンサデータなどを定期的に収集するようなサービスに最適な方式といえます。

この3方式を軸に今後IoT分野は発展していくのではないかと考えられます。

#IoTのデバイス認証方式
さて、私はまがりなりにもセキュリティエンジニアであるので、セキュリティ面でこの3方式を語りたいと思います。

###LTE/3Gのデバイス認証方式
携帯電話ではデバイス認証用にUSIMを挿入しています。このUSIMに秘密の鍵が焼きこまれており、この鍵を用いて、携帯電話網内の認証サーバと認証を行います。認証サーバとUSIMは共通の秘密鍵を保持しており、これを元に認証キーを生成、照合することで認証しています。
この方式はAKA認証と呼ばれており、3GPPで仕様が定められています。詳細は以下をご参照ください。

[3GPP TS34.108](http://www.3gpp.org/DynaReport/34108.htm)
[docomo テクニカルジャーナル SAE/LTE を実現するセキュリティ技術](https://www.nttdocomo.co.jp/binary/pdf/corporate/technology/rd/technical_journal/bn/vol17_3/vol17_3_027jp.pdf)

###SIGFOXのデバイス認証方式
残念ながらSIGFOXはフランスのSIGFOX社が開発した独自のプロトコルを用いており、この仕様が公開されていないため、詳細は不明です。しかしながら、SIGFOXを日本で展開している京セラコミュニケーションシステムの方に聞いた情報から、私なりに推測しました。
SIGFOX社が提供するパッケージをモジュールベンダが、ハードウェアのセキュアな領域に、暗号化鍵とデバイスID、PACKコードを焼きこみ、これらを暗号化鍵で暗号化またはハッシュかして、送信するメッセージに付与。基地局は土管のため特にチェックせずクラウドサーバにそのままメッセージを送ります。クラウドサーバで、共通の暗号化鍵を持っているため、送られてきたメッセージに付与された暗号データを検証して、正しいデバイスかどうかを認証します。

###LoRaWANのデバイス認証方式
LoRaWANの認証では、デバイスに書き込まれたAppEUI（アプリケーション固有の64bitID）とDevEUI（デバイス固有の64bitID）を用いて認証を行います。デバイスとバックエンドサーバには事前に共通する暗号化鍵AppKeyを保有しております。これらの情報からDevAddr（ネットワーク内のデバイスID）、AppSKey、NwkSKeyを算出して参加承認します。以降は AppSKey と NwkSKey で暗号化します。


IoTデバイスは今後世の中に大量に出回り、セキュリティ面も危惧されていることから、サービス提供される方はこうした認証などにも気を配って頂けると良いのではなかろうかと考えております。
fsockopenにリトライを追加

http://192.168.0.5:8000 に接続ができない場合、
以下だと1回で諦める。

```php:1回で諦める
<?php
$fp = fsockopen("192.168.0.5", 8000, $errno, $errstr, 30);
```

通信状況が悪い場合、何度か再試行してもらいたいのでリトライを入れる。

```php:10回リトライ(1秒間隔)
<?php
for($i=0; $i<10;$i++) {
    $fp = fsockopen("192.168.0.5", 8000, $errno, $errstr, 30);
    if($fp) break;
    sleep(1);
}
```

[PHP: fsockopen - Manual](http://php.net/manual/ja/function.fsockopen.php)
書籍「データ分析基盤構築入門」のサンプルアプリケーションを動かす時にハマった箇所メモ

http://gihyo.jp/book/2017/978-4-7741-9218-5

こちらの本に従いサンプルアプリケーションを動かそうと思ったが幾つかハマりどころがあったのでメモ

実行環境は

```
mac ox 10.11.6
docker Version 17.09.0-ce-mac35 (19611)
※ docker for mac でインストール
```


本に従いgithubからclone後に

```
$ docker-compose up -d
```

を行うと `fluent-plugin-elasticsearch` のインストールでエラーが発生

GCCがインストールされていないのが原因のようだったので、`Dockerfile-fluentd`に`RUN sudo apt-get install build-essential -y`を追記して色々インストールすると通った。


```text:Dockerfile-fluentd
FROM debian:jessie

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get -qq update && apt-get install --no-install-recommends -y curl ca-certificates sudo 
RUN sudo apt-get install build-essential -y # この行を追加
RUN curl -L https://toolbelt.treasuredata.com/sh/install-debian-jessie-td-agent2.sh | sh
RUN /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch fluent-plugin-record-reformer

EXPOSE 24224

CMD exec td-agent -c /fluentd/etc/$FLUENTD_CONF -p /fluentd/plugins $FLUENTD_OPT
```


これで`docker-compose up -d`が最後まで通ったので`http://localhost/`にアクセスすると`no such table: articles` とでたのでマイグレーションが実行されていない感じ。


```
$ docker-compose exec go make migrate/up
```

を実行すると

```
go get github.com/rubenv/sql-migrate/...
/go/bin/sql-migrate up -env=development
Applied 2 migrations
```

という感じでマイグレーションされた模様。

再びアクセスすると無事画面が表示された。
SRE本まとめ（23章 クリティカルな状態の管理）

自分の理解を深めるためにまとめてみました。[22章](https://qiita.com/bassbone/items/dacd2265e37d197d04b7)の続きです。

## 23章 クリティカルな状態の管理

### 分散システムの協調障害

#### スプリットブレイン問題
マスタとスレーブ間での通信で障害が発生した場合に、フェイルオーバーがうまく行われず、両方がマスタとして稼働してしまう。ここで問題は、システムがリーダーの選択を単純なタイムアウトで行っていることである。

#### 人間の介入を必要とするフェイルオーバー
人間が介入することでフェイルオーバーの信頼性は上がるかもしれないが、時間という観点で可用性は悪くなってしまう。また管理するサーバが増えるにつれて、人間では対応できなくなってしまう。

### 分散合意の動作

#### Paxosの概要
- プロポーザ（提案を行うプロセス）はシーケンス番号をアクセプタに送信する。各アクセプタは自分のそれ以上に大きいシーケンス番号を持つ提案を見ていない場合に限り、その提案を承認する。プロポーザはユニークなシーケンス番号を使わなければならない。
- 過半数のアクセプタから同意を得たら、プロポーザは値を付けてコミットメッセージを送信することで、その提案をコミットできる。
- Paxosが実現するのは、ある値を提案のナンバーに対して1回同意できるようにすることだけ。1つの値に同意しなければならないのはノードの過半数のみなので、任意のノードを取ってみれば、それは同意された値の集合の完全なビューを持っていないかもしれない。

### 分散合意のためのシステムアーキテクチャパターン

#### 複数ステートマシン
複数ステートマシン（RSM）は同一の処理の集合を同一順序で複数のプロセスで実行するシステム。ピアプロセス間で状態を一致させるにはスライディングウィンドウプロトコルが利用できる。

#### 信頼性を持つ分散キュー及びメッセージング
キューイングベースのシステムはワーカーに割当済みのタスクの処理が正常に実行されることを保証しなければならない。そのためにはキューをすぐに取り除くではなく、リースシステムを使うことが望ましい。アトミックなブロードキャストは信頼性を持ちながら全ての参加者が同じ順序でメッセージを受信する、分散システムのプリミティブ。queueing-as-work-distributionパターンはロードバランシングとしても使える。

（24章に続く）
BigQueryで"FROM dual"する

BigQueryで何のテーブルも参照しないクエリを投げるにはどうすればいいんだろう？と疑問に思ったのですが、単にFROM句を書かなければいいだけでした。

```sql
SELECT DATE_TRUNC(DATE "2016-12-25"), MONTH)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/46856/8db05416-0cb8-8a22-a37a-9f44be591776.png)

上記のようにFROM句なしのクエリを使えば、関数の挙動を簡単に確認することができます。

上記の例ではレガシーでない方のSQLを利用していますが、レガシーSQLでも同様にFROM句なしのSQLが利用できます。
Amazon Linuxのルートボリュームを拡張する方法

# ボリューム変更
![change_volume.png](https://qiita-image-store.s3.amazonaws.com/0/44393/876d32bc-9591-1587-71b7-7c023582b4a6.png)
# 念のためスナップショット保存
![snapshot.png](https://qiita-image-store.s3.amazonaws.com/0/44393/1f85e61b-3442-bc37-988f-068224dfec4e.png)

# lsblkで物理ディスクを確認
![ssh1.png](https://qiita-image-store.s3.amazonaws.com/0/44393/cabdc1ad-e52a-b0f9-b282-f43bc81d1015.png)

# 以下のコマンドで割当(ディスク名等は適宜読み替え)
```bash
$ sudo growpart /dev/xvda 1
$ sudo resize2fs /dev/xvda1
```
c# TreeViewに右クリックイベントを登録する

-TreeView のアイテムを右クリックした場合にポップアップメニューを表示する。

```
using System;
using System.Windows.Forms;
using System.Drawing;

class FormMain : Form {

	private TreeView menuTreeView;
	private ContextMenuStrip docMenu;

	[STAThread]
	public static void Main() {
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault(false);
		Application.Run( new FormMain());
	}

	FormMain()
	{
		InitializeMenuTreeView();
	}

	public void contextMenuStrip_SubMenuClick(object sender, EventArgs e)
	{
		string s = ((ToolStripMenuItem)sender).Text;

		MessageBox.Show("Item is " + s, "Item Clicke");
	}
	
	public void InitializeMenuTreeView()
	{
	    // Create the TreeView.
	    menuTreeView = new TreeView();
	    menuTreeView.Size = new Size(200, 200);

	    // Create the root node.
	    TreeNode docNode = new TreeNode("Documents");

	    // Add some additional nodes.
	    docNode.Nodes.Add("phoneList.doc");
	    docNode.Nodes.Add("resume.doc");

	    // Add the root nodes to the TreeView.
	    menuTreeView.Nodes.Add(docNode);

	    // Create the ContextMenuStrip.
	    docMenu = new ContextMenuStrip();

	    //Create some menu items.
	    ToolStripMenuItem openLabel = new ToolStripMenuItem();
	    openLabel.Text = "Open";
	    ToolStripMenuItem deleteLabel = new ToolStripMenuItem();
	    deleteLabel.Text = "Delete";
	    ToolStripMenuItem renameLabel = new ToolStripMenuItem();
	    renameLabel.Text = "Rename";

		openLabel.Click += contextMenuStrip_SubMenuClick;
		deleteLabel.Click += contextMenuStrip_SubMenuClick;
		renameLabel.Click += contextMenuStrip_SubMenuClick;

	    //Add the menu items to the menu.
	    docMenu.Items.AddRange(new ToolStripMenuItem[]{openLabel, 
	        deleteLabel, renameLabel});

	    // Set the ContextMenuStrip property to the ContextMenuStrip.
	    docNode.ContextMenuStrip = docMenu;

	    // Add the TreeView to the form.
	    this.Controls.Add(menuTreeView);
	}
}
```
![実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/211884/31da700a-1d4b-1ea6-9c92-cd510032224c.png)