OmniAICreator/Qiita-1.07M huggingface dataset:
あなたのアマゾンアカウントをbot化するAmazonBotify

# はじめに
アマゾンで頻繁に注文するものを毎回サイトにアクセスして注文するのがめんどくさいということはよくあることかと思います。
そこで今回はタイトルの通りボットとしてamazonを使えるsinatraアプリを作成しました。
(余談ですが先日[AmazonがSlackを買収するかもしれないというニュース](https://wired.jp/2017/07/13/slack-complete-amazon-empire-acquisition/)が話題になりましたが、それが実現すればこんなものをamazon自体が提供しそうですね笑)

# システム構成
![system.png](https://qiita-image-store.s3.amazonaws.com/0/71154/f9cbefc6-2e2e-0469-2f27-758706f3ce32.png)

システム構成は上記のようになっています。

メッセンジャーから注文コマンドを送ると

1. slackからoutgoing web hook で出したリクエストをローカルのmacに立てたsinatraがngrok経由で受け取る。
2. sinatraはseleniumを使って注文操作を実行する。
3. 完了したらスクショを撮る
4. スクショと共に注文が完了した通知をslackに返す

の流れで注文を処理します。

作っている時に起きた問題は以下の2つで

 * EC2 + Headlessブラウザを使っていたらrecaptchaで弾かれた → ローカルPCで対応(なのでこれを使うためにはサーバー用のPCを1台用意しないといけません...)
 * ローカルのPCをサーバーとしてどうやって安全かつ簡単に外部公開できるかわからない → [ngrok](https://www.google.co.jp/search?q=slack+ngrok&hl=en&lr=lang_en)が使えた

の形でそれぞれ対応しました。

あとはslackのoutgoing web hookと注文のエンドポイントを繋いで、実際注文するとうまく注文できました！！
<img width="507" alt="order.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/321e51d1-6a1c-0424-717a-7732b9b72ec8.png">


# 完成形
その他いくつかコマンドを足して、完成形がこちらです。

* 使い方

<img width="397" alt="az_hiwto.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/bf96e6c1-88d2-4090-7993-d201b74a839f.png">

* 商品登録
<img width="761" alt="az_add.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/e5738fc9-a251-e35f-2143-47fa8c6cb01e.png">

* 商品登録解除
<img width="764" alt="az_delete.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/747ea81b-3b90-7c37-3015-36e654818882.png">

* 登録商品一覧
<img width="761" alt="az_list.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/daa74fd9-807e-5253-5c83-a89bac5cc28f.png">

* 商品注文
<img width="761" alt="az_order.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/d21f2951-40e0-bf57-641c-c2f8f6a1b062.png">

* 注文履歴参照
<img width="959" alt="az_his.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/509e01ef-d36d-d777-7141-fcea707ac1d4.png">

結構いい感じに出来ましたね！！

またslack以外のメッセンジャーを使いたい場合はBotBaseを継承したクラスに#send_messageメソッドを実装すれば簡単にカスタムのbotクライアントを追加できます。


```ruby
module Bot
  class CustomBot < BotBase
    # required
    def send_message(message)
      some_messanger_client.send_message(message)
    end
  end
end
```

もし自分でも使ってみたいという方がいればソースとセットアップの方法は[こちらのGitのレポジトリ](https://github.com/kazuooooo/amazon_botify)にあるので使ってみてください :thumbsup: (プルリクもお待ちしていますmm) 

さて、ここまで読んでこれ別にamazonで注文するのがめんどくさいのがslackに投げるのめんどくさいに変わっただけじゃないか？と思った方が多いかと思います。
そうです。あくまでもこれは副産物で本当に今回作りたかったのは[こちら](http://qiita.com/kazuooooo/items/47d3729f7037fe51aa35)です！！
オンプレMySQLからAuroraへの移行で躓いたポイント（その1・移行準備段階）

中小規模のオンプレWebシステム（DBとしてMySQLを使用）をAWS環境（Auroraを使用）に移行する際に躓いたポイントをいくつか記録しておきます。

# 0. 前提

移行前、移行後の環境として、以下のようなものを想定してください。

## 0-1. 移行前

 * VMwareによる仮想環境
 * ストレージはエントリレベル（10G-iSCSI）
 * MySQLは5.5／バイナリログあり／sync_binlog=1（遅い！）、複数あるがメインは1台
 * データ量は1TiB未満
 * DR:DBなどでのDBサーバ冗長化は行っていない
 * Webサーバは数台（Java8(G1GC)／Tomcat8）
 * Web～DB間のコネクションプーリングあり（DBCP2）

## 0-2. 移行後

 * WebサーバはほぼそのままEC2へ（東京リージョンAZ-a/cに等分して配置）、ALBを使用
 * Auroraはr3.xlarge～2xlarge程度、Multi-AZ、バイナリログあり（sync_binlog=1固定）、KMSで暗号化

# 1. 事前検証時

小規模なインスタンスを使って動作検証および軽い負荷テストを行った時点では、特に問題はありませんでした。
しかしその後、Auroraを冗長化してフェイルオーバー試験を行い始めたときに、問題が発生。

1つ目は、テスト用のAuroraクラスタ／インスタンスを削除する際のミスによる**「あれ？フェイルオーバーしない」**問題。

 * **[Aurora小ネタ／テストDBを削除するときに…](http://qiita.com/hmatsu47/items/b5db6f3ea958841e41ac)**

2つ目は、**JavaのDB Connectorの選択**問題。
Java環境向けにはAurora Driverを含むMariaDB Connector/J（1.2.0以降）があり、これを使えばAuroraのフェイルオーバーに対応できますが、

 * （使用中の）MySQL Connector/Jと細部の挙動が違う（パラメータで調整可能なものもあるが全て合わせるのは難しい）
 * Connector/Jから返される値の型や評価結果が違うことがある（これはアプリケーション側のコードの品質の問題ですが…）

ということで、断念。
結局、MySQL Connector/Jのまま、以下の対応を行うことに。

 * **[Amazon Auroraクラスタへの接続にコネクションプーリングを使うときのフェイルオーバー対応](http://qiita.com/hmatsu47/items/605f7edaf390d52ec828)**

但し、プールしたコネクションの有効性確認にValidation Queryを使う「古い方法」でありパフォーマンス面ではあまりよろしくないです（対症療法です…）。

また、負荷を上げてフェイルオーバーを行うと**「切れたコネクションプールの回収処理が詰まる」**という3つ目の問題が発生。
当初はコネクションプーリングを外したり（接続負荷が低いMySQLがベースとはいえ処理が遅くなってしまったので断念）、プーリングのパラメータ調整で何とかしようと試行錯誤しましたが、**「JavaのGCが追いついていない」**のを見て、**G1GCの目標時間（-XX:MaxGCPauseMillis）を調整して改善**しました（オンプレ時は処理時間が短く済んでいたので、デフォルト値よりも短くしていました）。
※GCとして、G1GCではなくCMSを使っている場合も同様に「GCが追い付かなくなる」問題が出る可能性があります。

なお、速度改善のため、TomcatのコネクションプーリングをDBCP2からTomcat JDBC Connection Poolに変えてみましたが、一部のクエリの実行順序・タイミングに問題が見られたので、こちらも断念しました（調査・検証期間が足りず…）。

また、Auroraとは直接関係ありませんが、ALBでDraining時のリクエストが一部受け付けられずタイムアウトする問題が発生。
こちらはサポートから「現象は確認しており改善方法を検討しましたが困難なため、現時点では『仕様』ということになります」という主旨の回答を受けました。

# 2. データ移行時

AWSにはDMSもあるのですが、MySQLレプリケーションのほうが慣れているので、

 * ある定点のバックアップを初期データとしてmysqldump形式でS3バケットへ（バケットは暗号化しておきましょう）
 * ↑のS3バケットをEC2インスタンスからgoofysで読み取りマウントして、Auroraへリストア
 * 定点からの差分はMySQLレプリケーションを使って反映
 * 移行作業当日は、レプリケーションを切ってオンプレ側からAWS側にDNSのレコードを切り替える
 * 万一のために、オンプレ側に切り戻し用の環境を作っておく（オンプレ側マスタDBがMySQL 5.5のため、切り戻し用にはMySQL 5.6を用意）

という形での移行を進めました。

まず、オンプレMySQL⇒Auroraのレプリケーションを行うときに、**「レプリケーション元とレプリケーション先で時間がずれる」**問題が発生。

 * **[オンプレMySQL～RDS for MySQL／Aurora間のレプリケーションにおけるタイムゾーン設定](http://qiita.com/hmatsu47/items/c8b573ec4839ca1e7394)**

続いて、オンプレ側切り戻し環境へのレプリケーションを行う際に、**「スレーブでマスタの指定ができない（エラーになる）」**問題と**「レプリケーションが止まる」**問題が相次いで発生。

 * **[Aurora小ネタ／MySQLレプリケーションでのしくじりポイント](http://qiita.com/hmatsu47/items/96ab32c9116ad98fee4f)**

慣れていても、油断は禁物ですね。

特に前者は、そもそもオリジナルのDBの初期設定時の設定漏れが原因ですので…。

なお、切り戻し環境としてオンプレ環境をAuroraのスレーブにするときには、オンプレMySQL側に以下の記事の**「3. rds_heartbeat2の作成」**の作業も必要です。
これをしていなくても、Aurora⇒MySQL（RDS以外）のレプリケーションが止まります。

 * **[Amazon RDS のレプリケーションをEC2で行う。](http://qiita.com/kooohei/items/4fdbbfbb7dc3f884577c)（koooheiさんの記事）**


※その2に続きます。

 * **[オンプレMySQLからAuroraへの移行で躓いたポイント（その2・移行前後）](http://qiita.com/hmatsu47/items/a4d98ab9416b5cbdd57b)**

---

**【おまけ】**
Amazon Aurora関連投稿記事へのリンクを集めました。

 * **[Qiitaに投稿したAmazon Aurora関連記事](http://hmatsu47.hatenablog.com/aurora)**
文字列と数値を比較したらなぜか文字列が0と認識される

文字列と数値を比較するif文を作ったらなぜか文字列なのにifの中に入ってしまってハマったのでメモ。

参考コード

```php
$x = 'all';
if($x == 0){
   echo "if文の中に入ってるよ";
   echo "xの中身は"$x;
}else{
   echo "ifには入らなかったよ";
}
```
結果

```
if文の中に入ってるよ
xの中身はall
```


phpは文字列と数値を比較すると文字列をなぜか0に変換するらしい。
なので下記のように書き換えると解消。

```php
$x = 'all';
if($x === 0){
   echo "if文の中に入ってるよ";
   echo "xの中身は"$x;
}else{
   echo "ifには入らなかったよ";
}
```

これで結果

```
ifには入らなかったよ
```
osx zsh+crontab+rbenvでの/usr/libexec/path_helperパス変更問題

# 問題
crontabで以下のように確認しても$PATHがおかしい、設定が通常のログインと微妙に違う。それ故にエラーなどが起きる

```:crontab
* * * * * $(which zsh) -lc 'echo $PATH > /Users/USER_NAME/Downloads/PATH; which zsh >> /Users/USER_NAME/Downloads/PATH'
```

ファイルの監視

```zsh
touch /Users/USER_NAME/Downloads/PATH && tail -f /Users/USER_NAME/Downloads/PATH
```

#原因

起動のさせ方（いつも通りターミナルを開く、cronなどからシェルパスを明示して実行など）により読み込まれるファイルの種類はあるが、流れは次のよう。

1. /etc/zshenv
2. $ZDOTDIR/.zshenv
3. /etc/zprofile
4. $ZDOTDIR/.zprofile
5. /etc/zshrc
6. $ZDOTDIR/.zshrc
7. /etc/zlogin
8. $ZDOTDIR/.zlogin
9. /etc/zlogout
10. $ZDOTDIR/.zlogout

el capitan以降のOSXでは `/etc/zprofile` に `/usr/libexec/path_helper` というものが書かれていてパスを書き換えている様子。
この書き換えによってcronでは`/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin`が`~/.rbenv/shims` `~/.rbenv/bin`などより先に来て、cron実行時にシステム側のrubyが呼ばれて、gemが無いとか色々な問題に出くわす。

#対処法

検索すると色々あり、`brew install --without-etcdir zsh` でそもそも`/usr/libexec/path_helper`呼ばない方法などもあるが、出来るだけ現状を崩さず、設定ファイルに変化を加えない方向でやってみた。


1. `.zshrc`にユーザー特定のPATHのexportを書かない
2. 従って`.zshrc`にrbenvの為の`eval "$(rbenv init -)"`を書かない
3. `.zshrc`にユーザー特定のaliasを書かない
4. `.zshrc`に各種定数exportを書かない

代わりに`~/.zprofile`を無ければ新規で作って、`.zshrc`に追記するだろう項目をいつも通りに入れていく

これによりcronから`$(which zsh) -lc '....'`呼ばれようが、通常通りシェルを開こうが`.zprofile`は通るので設定が同じになる。

#.zprofile例

```zsh:.zprofile

# rails
export SECRET_KEY_BASE=4a15a58c0c7bc18b3d2cce505ccfc2896f9a7e2452b4abd858a3e27eadfaf71070a250c76bd51499c201efd622adc78e24b38f7b2c99505634cf6d26c767da6e
export RAILS_SERVE_STATIC_FILES=true

#rbenv
export PATH=$HOME/.rbenv/bin:$HOME/bin:$PATH
eval "$(rbenv init -)"

# zshだとrakeのパラメーター[]でno matches foundエラーになるのでその回避
# https://github.com/robbyrussell/oh-my-zsh/issues/433
alias rake='noglob rake'

```

#whenever使用例

```zsh:.zprofile
# bundle execした時の no matches found 回避
alias bundle_rake='noglob bundle exec rake'
```

```rb:schedule.rb
set :job_template, "$(which zsh) -lc ':job'"
# bundle_rakeを使う
job_type :rake,    "cd :path && :environment_variable=:environment bundle_rake :task --silent :output"

...
...
```
Mac OS X 10.12 (Sierra) + emacs + org-mode で [Shift]+[Tab] が効かない


**困りごと**
org-mode の テーブル内で [Shift] + [Tab] を押した際、左のセルに移動できない。
エコーエリアには以下のメッセージが表示される。

```
M-[ z is undefined
```

**解決手順**
init.el に以下を追加する。

```~/.emacs.d/init.el
(define-key function-key-map  "\e[Z" [backtab])
```
**環境**
- OS X Sierra 10.12.6
- GNU Emacs 25.1.1
GitLab/TortoiseGit/Puttyの連携について

■はじめに
2017/09/18時点における、TortoiseGitとPuttyを用いて、GitLab上のリポジトリを
ローカル環境に複製する操作方法についての、メモ

---
◆環境
・TortoiseGit 2.3.0.0 
・git version 2.14.1.windows.1
・Putty 0.70

---
◆手順概要
1. 各種インストール
    1.1. TotiseGitをインストール。次へ次へ次へ。。。
    1.2. MSYSGitをインストール
    1.3. Puttyをインストール 
2. GitLabでアカウント/プロジェクト作成
3. TortoiseGit/設定/Gitに、IDとメールアドレスを登録。ついでにグローバルを指定。
4. TortoiseGit/設定/Git/ネットワークに、インストールしたPuttyの"plink.exe"を指定
5. Puttygenで鍵作成。公開鍵を.key、秘密鍵を.pptで保存
6. 公開鍵情報をGitLabに登録
7. フォルダからGitクローン。その際に秘密鍵を指定

---
■補足
・URLはgitでもよい?

---
■参考情報
http://nick-udon.hatenablog.com/entry/2016/10/31/182554
http://blog.dksg.jp/2015/05/windowsgitmsysgit-tortoisegitgitlabpush.html
UbuntuにSQL Serverをインストールする

# 前提条件
メモリが3.25 GB 以上である必要があります。

# インストール

「端末」を起動します。

以下のコマンドを実行し、rootに切り替えます。
`sudo su`

以下のコマンドを実行し、リポジトリキーをインポートします。
`curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -`

以下のコマンドを実行し、リポジトリーを登録します。
`curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list > /etc/apt/sources.list.d/mssql-server.list`

以下のコマンドを実行し、rootからユーザーに戻ります。
`exit`

以下のコマンドを実行し、パッケージインデックスファイルを更新します。
`sudo apt-get update`

以下のコマンドを実行し、「SQL Server」 をインストールします。
`sudo apt-get install -y mssql-server`

以下のコマンドを実行し、初期設定を開始します。
`sudo /opt/mssql/bin/sqlservr-setup`

※エディションの選択では、今回はExpressを選択しました。

その後、Windows のSQL Server Management Studioから接続できることを確認しました。
![UbuntuにSQLServer2017インストール後.PNG](https://qiita-image-store.s3.amazonaws.com/0/202753/835d7d10-96a3-d819-daf6-d96dbe677606.png)
インスタンス名は無しの状態でした。
OSはNT6.2なのでWindows 8として見えている？

参考：
[SQL Server をインストールし、Ubuntu でデータベースを作成](https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu)
YMF825 レガシーMIDI音源

# YMF825 MIDI音源モジュール

YMF825board,Arduino,MIDIシールドを使った　レガシーなMIDI音源モジュールのスケッチを上げました。
2017/10/3 更新

https://github.com/ringoro/YMF825_Midi_module/blob/master/README.md


- CC 1 Modulation
- CC 7 Master Vol.
- CC 123 All Off
- PitchBend

に対応しました。

10/3 更新：ピッチベンド関数を本家のコードを参考にテーブル方式に変更しました。
参考URL: https://github.com/yamaha-webmusic/ymf825board/tree/master/sample2

MIDIシールド前提ですが、setup()内でボーレートを 38400 等にしてCOMポートを通して直接パソコンからコントロールはできると思います。
[Resharper] if/for/foreachで中身が１行でも中括弧で囲むようにする設定に変更

ResharperのCleanup Codeで１行の時と直後にtry-catchがある場合に中括弧が消されないようにする設定方法

# 検証環境

Resharper Ultimate 2017.2

# 設定方法
Options > Code Editing > C# > Code Style > Braces で該当箇所を Enforce always に変更する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/3b9524d9-d4a8-7e68-eec0-80f1b89be560.png)

# 参考
[c# - ReSharper - force curly braces around single line - Stack Overflow](https://stackoverflow.com/questions/3622236/resharper-force-curly-braces-around-single-line)
Xcodeでのビルド時間の表示と短縮


# ビルド時間の表示

Xcodeでビルド時間を表示するには、Terminalで以下のコマンドを入力し、Xcodeを再起動します。

```
$ defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
```

上記のコマンドを実行すると、Xcode上でビルド時間が表示されるようになります。試すにはProductからCleanした後にArchive実行することで、正しい時間が測定できます。

# ビルド時の複数タスクへの分割

Xcodeはデフォルトでは1コアしか利用せず、ビルド作業を行います（というより、ビルド単位をわけずにビルドをしているため）。そのため、ビルド単位を小さいタスクで分割させることで、複数コアで同時にビルド作業を行うことができます（実世界と同じで一つの作業があったときに手分けしてやるのと同じようなイメージ）。ただし、CPUの持っているコア以上にタスクを分割しても、効果が薄いため注意が必要です（実世界でも頭数が二人しかいないので、10個のタスクに分けて、作業者の数が増えない限り、特に効率的になるわけではないですよね。）。

以下がタスク数を変更する命令です。

```
$ defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 2
```

# サンプル実行結果

手元のプロジェクトで試した結果次のような効果を得ました。

```
1コア時：264.992s
2コア時：220.232s
```
ABC01CとD問題

#C問題
問題はhttp://abc001.contest.atcoder.jp/tasks/abc001_3 から

##解答の方針
ごり押しの条件分岐で書けそうでもあったけど、さすがにめんどくさい。
角度は22.5度周期で変化するのでそれを利用して出力できそう。

風速も基本的には角度と同じ、
Pythonの四捨五入は少し変わってて？そこで少しつまった。

##コード
```python:abc01c.py
Deg,Dis = list(map(int,input().split()))

direction = ["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"]
ws_list = [0.3, 1.6, 3.4, 5.5, 8.0, 10.8,13.9, 17.2, 20.8, 24.5, 28.5, 32.7]

res_speed = 0
res_direction = 'C'

Deg = (Deg + 112.5)
num = int(Deg/225)
if 15 < num:           
    num = 0
    

round = lambda x:(x*2*10+1)//2/10
speed = round(Dis/60)

for i in ws_list[::-1]:
    if i <= speed:#speedがws_listのいずれよりも小さい場合、参照されないので初期値が出力される。
        res_speed = ws_list.index(i)+1
        res_direction = direction[num]
        break

print(res_direction,res_speed)


```
#D問題
問題はhttp://abc001.contest.atcoder.jp/tasks/abc001_4から

##解答の方針
時間に対応するbool配列を用意して、雨が降っている時間をTrueにしておいて、
最後によみこんで感雨時間を出力する。

最初2400などの4桁の数値を（なぜか）そのまま利用していたが、
(上二桁＊60)+下二桁とのように、すべて分単位に戻し、最後に戻す必要があることに気づいた。
また、5分刻身で出力すればよいので、分単位の時間を5で割ったものを利用し、最後に5をかければ、
メモリ、実行速度が改善できる（それをしなかったら、PythonだとTLEだった）

表示の仕方もゼロパティングする必要があった。
調べてみたところPythonではformatを利用することが簡単らしい。

##コード
```python:abc01d.py
N = int(input())
Max = 24*60//5+1
time = [False for i in range(Max)]

res_start = []
res_end = []
flag = True

def rain(a):
    
    global flag
    if flag:
        flag = False
        res_start.append(a)

    if time[a+1]:
        rain(a+1)
        time[a+1] = False
    else:
        flag = True
        res_end.append(a+1)




for i in range(N):
    s,e = list(map(int,input().split("-")))
    start = (s//100*60 + s%100 - s%5)//5         #start = 左二桁*60 + 右二桁 - 丸見込み誤差
    end = (e//100*60 + e%100 + (5 - e%5)%5)//5
    for j in range(start,end):
        time[j] |= True

for i in range(Max):
    if time[i]:
        res_start.append(i)
        for j in range(i,Max+1):
            if time[j] == False:
                res_end.append(j)
                break
            time[j] = False


for i in range(len(res_start)):
    res_start[i] = (res_start[i]*5//60)*100 + res_start[i]*5%60
    res_end[i] = (res_end[i]*5//60)*100 + res_end[i]*5%60

for i in range(len(res_start)):
    print("{:04d}-{:04d}".format(res_start[i], res_end[i]))

```


#参考資料
http://www.lifewithpython.com/2015/10/python-zero-padding.html
http://qiita.com/sak_2/items/b2dd8bd1c4e4b0788e9a
VirtualBoxにUbuntu16.04をインストールする

# isoイメージの取得
下記のサイトからisoイメージを取得します。
http://releases.ubuntu.com/16.04/

※自分の場合、ubuntu-16.04-desktop-amd64.iso を取得しました。

# 仮想マシンの作成
VirtualBoxを起動し、仮想マシンを新規作成します。

|名前|タイプ|バージョン|
|:-----------------|------------------:|:------------------:|
|任意の文字列|Linux|Ubuntu(64-bit)|

※VirtualBoxのバージョン：5.1.28 r117968 (Qt5.6.2)

# isoファイルを指定
１．仮想マシンの設定ダイアログで、左側のメニューから「ストレージ」を選択します。

２．コントローラー:IDEの下の「空」をクリックし、「属性」の「光学ドライブ」の右に表示されているディスクのマークをクリックします。

３．「仮想光学ディスクファイルを選択」を選択して、ダウンロードしたisoファイルを選択します。

# インストール
１．仮想マシンを起動します。

２．ウィンドウの左側から言語を選択し、「Ubuntuをインストール」をクリックします。

３．「Ubuntuのインストール中にアップデートをダウンロード」を選択して「続ける」をクリックします。

４．「ディスクを削除してUbuntuをインストール」を選択して「インストール」をクリックします。

５．ディスクに変更を書き込むかどうか聞かれるので「続ける」をクリックします。

６．タイムゾーンやキーボードのレイアウトを設定する画面が表示されるので任意のものを選択します。

７．ユーザー情報を入力して「続ける」をクリックします。

８．インストールが完了しましたというダイアログが出たら「今すぐ再起動」をクリックします。
cakephp3 shell から controllerを使う

これで シェルから、tweetscontroller を使うことができる。


CronShell.php


```

<?php
namespace App\Shell;

use Cake\Console\ConsoleOptionParser;
use Cake\Console\Shell;
use Cake\Log\Log;

use Cake\ORM\TableRegistry;
use App\Controller\TweetsController;

/**
 *
 *
 * Simple console wrapper around Psy\Shell.
 * /var/www/html/caba-ageha.com/bin/cake
 */
class CronShell extends Shell
{

    public function initialize()
    {
        parent::initialize();
        $this->Tweets = new TweetsController();
    }

    public function main(){

        $this->out($this->Tweets->video());

    }



//    cron を直接実行
// /opt/remi/php70/root/usr/bin/php -c /etc/opt/remi/php70/php.ini /var/www/html/twitube.jp/bin/cake.php cron


}



```
LaravelでPostgreSQLのbigserial, bigintを使う

## 概要
PostgreSQLでbigserial, bigintを使いたいと思い、調べたことをメモしておく。

## migrateでの指定方法

```php
// bigserial
$table->bigincrements('id');

// bigint & foreign key
$table->biginteger('organisation_id_fk')->unsigned()->unique();
$table->foreign('organisation_id_fk')->references('organisation_id')->on('organisations');
```

## 参考サイト
- [laravel-schema-for-postgresql-sequence](https://stackoverflow.com/questions/28981423/laravel-schema-for-postgresql-sequence)
LaravelでPostgreSQLの配列型を使いたい

## 概要

PostgreSQLで部分インデックスを使いたかった（論理削除で...）のでマイグレーションを
カスタマイズするために調べた内容をメモとして残します。

## CustomBlueprintクラス作成

```App/Migrates/CustomBlueprint.php
<?php

namespace App\Migrates;

use Illuminate\Database\Schema\Blueprint;

/**
 * Blueprintクラスの拡張
 *
 * @package App\Migrate
 */
class CustomBlueprint extends Blueprint
{
    /**
     * テキストの配列型を作成する
     *
     * @param  string  $column
     * @return \Illuminate\Support\Fluent
     */
    public function textArray($column)
    {
        return $this->addColumn('textArray', $column);
    }
}
```

## PostgresGrammarクラス作成

```php:App/Migrates/PostgresGrammar.php
<?php

namespace App\Migrates;

use Illuminate\Support\Fluent;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Schema\Grammars\PostgresGrammar;

/**
 * PostgresGrammarクラスを拡張
 *
 * @package App\Migrate
 */
class CustomPgsqlGrammar extends PostgresGrammar
{
    /**
     * テキストの配列型の列定義を作成
     *
     * @param  \Illuminate\Support\Fluent  $column
     * @return string
     */
    protected function typeTextArray(Fluent $column)
    {
        return 'text[]';
    }
}
```

## 使ってみる

```php:database/migrations/****_**_**_******_create_users_table.php
<?php

use Illuminate\Support\Facades\Schema,
    Illuminate\Database\Schema\Blueprint,
    Illuminate\Database\Migrations\Migration,
    App\Migrates\CustomBlueprint,
    App\Migrates\CustomPgsqlGrammar;

/**
 * 会員テーブルの作成
 */
class CreateUsersTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @access  public
     * @return  void
     */
    public function up()
    {
        DB::connection()->setSchemaGrammar(new CustomPgsqlGrammar());
        $schema = DB::connection()->getSchemaBuilder();

        $schema->blueprintResolver(function($table, $callback) {
            return new CustomBlueprint($table, $callback);
        });

        $schema->create('users', function (CustomBlueprint $table) {
            $table->bigincrements('id');
            $table->string('email');
            $table->password('password');

            // 会員種別（文字列を複数格納する）
            $table->textArray('type');

            $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
            $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        });
    }

    /**
     * 元に戻す
     *
     * @access  public
     * @return  void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```
PHPオフィシャル Dockerコンテナに redis exension を追加するメモ


PHPのアプリサーバーのクラスタを組んで、Redisで、セッションを共有させたいと思ったのですが、課題があったので、備忘録です。

Dockerコンテナで実現したいことは、この図の内容です。 もちろん、redisのクラスタ化も別途検討しますが、PHPとredisの接続をDockerコンテナ上で、どの様に設定するか？ 自動化して何度でも、同じソフトウェア構成を作れる様にするか？という課題です。

![スクリーンショット 2017-09-18 9.20.32.png](https://qiita-image-store.s3.amazonaws.com/0/42829/9d82f452-4896-f793-27e9-b5bd6335ff6c.png "スクリーンショット 2017-09-18 9.20.32.png")


## 課題

Docker Store の [PHPオフィシャル・リポジトリ](https://hub.docker.com/_/php/) にある コンテナイメージに、redis エクステンションを追加しようと次の様に書くと失敗する。

~~~
RUN docker-php-ext-install redis
~~~

エラーメッセージを読むと、追加できる対象として redis が入っていない事が解ります。

~~~
Step 4/6 : RUN docker-php-ext-install mcrypt pdo_mysql redis
 ---> Running in 6a2e232a0958
error: /usr/src/php/ext/redis does not exist

usage: /usr/local/bin/docker-php-ext-install [-jN] ext-name [ext-name ...]
   ie: /usr/local/bin/docker-php-ext-install gd mysqli
       /usr/local/bin/docker-php-ext-install pdo pdo_mysql
       /usr/local/bin/docker-php-ext-install -j5 gd mbstring mysqli pdo pdo_mysql shmop

if custom ./configure arguments are necessary, see docker-php-ext-configure

Possible values for ext-name:
bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mcrypt mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip
ERROR: Service 'app' failed to build: The command '/bin/sh -c docker-php-ext-install mcrypt pdo_mysql redis' returned a non-zero code: 1
~~~


そこで、グーグル先生に聞いてみると、Stackoverflow に [How to install php-redis extension using the official PHP Docker image approach?](https://stackoverflow.com/questions/31369867/how-to-install-php-redis-extension-using-the-official-php-docker-image-approach) というピッタリの記事を発見した。 しかし、色々な方法がありました。

## 解決策

いくつかの方法を試して、一番シンプルにかけて、分かりやすい方法が、以下のDockerfileでした。 余分なところも入っているけど(笑) 
php redis extentionを クローンしておいて、docker-php-ext-install に追記すると、あとはコンパイル、インストール、そして、設定ファイルを書き出してくれます。　これだけでいけるとは、なかなか気が利いてますね。

~~~file:Dockerfile
FROM php:7-fpm

RUN apt-get update \
    && apt-get install -y libmcrypt-dev mysql-client \
    && apt-get install -y zip unzip git \
    && apt-get install -y vim

RUN git clone -b php7 https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis 

RUN docker-php-ext-install mcrypt pdo_mysql session json mbstring redis

RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer

WORKDIR /var/www
~~~


## 感想
Dockerコンテナをビルドするには、サーバー構築とは違うノウハウが必要ですね。とほほ
Laravelでjsに値を渡すヘルパー関数を作成

## 概要

ヘルパー関数を作りたかったのとJavaScriptで表示制御を行う場合、PHPからパラメーターをJavaScriptに渡したい。
そのため、受け渡し用の関数を作成してみたのでメモを残します。

## ヘルパー関数の作成
ヘルパー関数を記述するファイルがなかったので追加し、関数を定義する。
※ json_encodeのオプションについては、参考サイトで紹介されているものを指定

```php:app/helpers.php
<?php

/**
 * JavaScriptの変数に変換する
 *
 * <JSONのエスケープ>
 * http://blog.ohgaki.net/json-escape
 *
 */
function jsVariable($data) {
    return json_encode($data, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
}
```

## 作ったファイルの読み込み

composerで管理しているので、そちらで読み込むようにする。

**composer.jsonに追記**

```json:composer.json
    "autoload": {
        "files": [
            "app/helpers.php"
        ],

        ・
        ・
        ・

    },
```

**composerを更新する**

```sh:ターミナル
$ php composer.phar self-update
$ php composer.phar dump-auto
```

以上

## 参考サイト
- [Creating a Helpers File](http://laravel-recipes.com/recipes/50/creating-a-helpers-file)
- [Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る (5) テンプレート編](http://qiita.com/nunulk/items/343688311472b7855437#blade-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%A8-html-%E3%83%9E%E3%82%AF%E3%83%AD)
- [JSONのエスケープ](https://blog.ohgaki.net/json-escape)
- [PHPからJavaScriptに変数を渡すまとめ](http://qiita.com/cither/items/b98cc4e237dcc8f7e51f)
XCode9βGMでFirebase入れようとすると、GoogleService-Info.plistをProjectに入れているにもかかわらず、「could not find a valid GoogleService-Info.plist in your project」とエラーが出る....

# エラー内容
FirebaseをPodsでインストールして、GoogleService-Info.plistもプロジェクトに入れて、ビルドも通ったし、さて、Runさせてみると、以下のエラーが出てきて困ってました。
Xcode8の時は何にもしなくても、ちゃんと動いたのに....
ビルドは何も問題なく通るんですよね.....

** Terminating app due to uncaught exception 'com.firebase.core', reason: '[FIRApp configure]; (FirebaseApp.configure() in Swift) could not find a valid GoogleService-Info.plist in your project. Please download one from https://console.firebase.google.com/.'**

#解決方法
困った時のStackoverfllow...
https://stackoverflow.com/questions/45317777/could-not-find-a-valid-googleservice-info-plist-in-your-project
に解決法ありました。

1.XCodeプロジェクトにいれた、GoogleService-Info.plistを選択する。
2.FileInspector内の「Target Membership」の該当プロジェクトのチェックボックスにチェックを入れる

![Qiita用画像.png](https://qiita-image-store.s3.amazonaws.com/0/9961/91b2769d-6624-dfab-e87c-bc93c1f762f3.png)


以上で解決。簡単.....
お悩みの方おためしあれ....。こんなんで2時間ほど悩んでしまった。さっさとググレばよかった(ToT)

***2017年9月24日追記***
Firebaseじゃなくて全般にいえることでした。
どっかからファイルをドラッグ&ドロップで追加すると、今までは、Destinationで「Copy items if needed」をチェックすれば、後は何もしなくてよかったんですが、この「Target Membership」のチェックボックスが外れたままになってるぽいです(XCode8まではチェックボックはチェックされてました)。
他のプロジェクトやライブラリなどでコピペする際はご注意ください。
こりゃXCode9のバグですなー
SciLabでCSV読み込み

###背景
vivadoで回路開発をする場合、chipscopeで簡単な信号解析ができます。それでも、固定小数の変換や波形のレンジ指定が煩雑になりますし、トリガー毎の背景色が邪魔で観察がしにくい。
このため、CSVにexportしてexcelで加工して可視化していました。でもデータが増えると処理が遅くなります。あまりの遅さに耐えられなくなったため、CSVファイルをSciLabで分析することにしました。

## chipscopeデータのExport
あとから16進数を変換するのは大変なので、予めvivadoで全信号をsigned指定しておく。キャプチャデータをCSV形式でexportする。

## CSVデータ読み込み
`
DATADIR='データファイルのディレクトリ';

//ファイル名の取得　この辺りは適宜
files=listfiles(DATADIR+'ila*.csv');
fn=files(1);

//全部読み取る。但し先頭はNanとなる。型は'double' or 'string'
//16進数のまま読み込むならば'string'を指定すること
raw=csvRead(fn,',',型);

//観察したい信号だけ選ぶ
dat=cat(2,raw(:,カラム番号1),raw(:,カラム番号2),raw(:,カラム番号3));

//（必要に応じて）トリガー後最低２サンプルキャプチャするので1つ捨てる
dat2=dat(2:2:length(dat(:,1)),:);

//作画して確認
clf;plot2d(dat2(2:1000,2:$));
`
変数エディタから作画することで、観察が簡単になりました。あたりをつけてから、スクリプトで作画すればよさそう。

##SciLab関連ドキュメントリンク
*install*
[macOSでSciLabを動かすまで](https://qiita.com/0x20FE/items/2ba5e60685816485ea4c)
[SciNoteのオートコンプリートをとめたい](https://qiita.com/0x20FE/items/cb17fda3f7456a807d41)

*実践*
[SciLabでCSV読み込み](https://qiita.com/0x20FE/items/dd6cbf94be0f2c20d002)
[SciLabでGUIを使ってみる](https://qiita.com/0x20FE/items/cf9cdad0e4be88714118)
[Mac/Windows共用scilabスクリプト]()未公開
[SciLabでフィルタを適用する]()未公開
[プロットメモ]()未公開
[プロットあれこれ]()未公開

*他の言語と比較・書き換え*
[Scilab (NumPy) - plotの書き方](https://qiita.com/0x20FE/items/311ac0e61a129e6a01fa)
 [配列と文字列処理の比較](https://qiita.com/0x20FE/items/ b6ea768692297b721951)
   [関数とオブジェクトの書き方メモ](https://qiita.com/0x20FE/items/02e2a6d8380851272a2c)
  [Scilab,NumPy,R行列処理の比較](https://qiita.com/0x20FE/items/75622186ba8a0c6086ce)

##履歴
2019.11.26 更新
2019.12.05 カラムデータ切り出し部分の諸々誤記を訂正
2020.08.18 関連リンク追加
PlantUMLのシーケンス図(他)のgistでの公開手順

# PlantUMLのシーケンス図(他)のgistでの公開手順
他のサービスでも類似ではあるが、gistだとmarkdownの画像埋め込みが利くから便利ではある
link https://gist.github.com/tsuyoshicho/f8e3e3be5ae4b7a262328b493ce875f0

PlantUMLの生成は [PlantUML Server](http://www.plantuml.com/plantuml/)を上手く活用できれば、どこでもできるんだけど...

----
先にgistに上げてしまったので、中身はgistと同じ

# [PlantUML](www.plantuml.com)のシーケンス図(他)の公開手順

1. 新規Gist
2. ベースのMarkdown記事を作る、PlantUMLなソースも作る
3. Gistをclone
4. cloneしたリポジトリに、PlantUMLから生成した画像をadd
5. commit&push
6. 画像のURLを確認
7. Markdownにリンク追加 "![alt txt](img url)"
8. 必要なら、更新の都度、pull->edit->plantuml generate->add->commit->pushで更新

でいいかな?

---
# 結果

![PlantUML Sample](https://gist.githubusercontent.com/tsuyoshicho/f8e3e3be5ae4b7a262328b493ce875f0/raw/6ad4ffbb03655d672ac43a696e618e76cc591f2a/PlantUML-Sample.png)
JavaのEnumを別要素で検索する、の検討

# 本文
ときどき話題になる「JavaのEnumを別要素で検索する」を自分なりに情報収集し、実装してみた
自分的にはまずまずのものになったとは思うが、解決しない問題は多い

[ideoneでの試作](https://ideone.com/Stg71F)

```java:test.java
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.function.*;

interface Searchable {
  public static <T extends Enum,N extends Comparable> Optional<T> getByCode(Supplier<T[]> v,Function<T,N> s,N code) 
  {
    return Arrays.stream(v.get())
                 .filter(data -> s.apply(data).equals(code))
                 .findFirst();
  }
}

enum TestEnum implements Searchable { 
  A(1),B(2),C(3);
  private final Integer id;
  private TestEnum (int id) { this.id = id;}

  public Integer getId() { return id; }
    
  public static Optional<TestEnum> getById(Integer id){
    return Searchable.getByCode(TestEnum::values,TestEnum::getId,id);
  }
}

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
  public static void main (String[] args) throws java.lang.Exception
  {
    TestEnum.getById(2).ifPresent(System.out::println);
  }
}
```

----

肝となる要素は

1. valueOf以外での検索(取得)手段を提供する
2. 任意追加できるようにする ex enum 性別 なら 男性(0,"M"),女性(1,"F")で、getByCode,getBySymbolとかできるようにする
3. それを持っていることをどうにか識別可能にする(インタフェース)

ただ

1. 継承するメリットはとくにない(staticは継承はどうしようもない)
2. クラス情報をジェネリクスで持ってけない(クラスのジェネリクスはstaticで活用できない、イレイジャ的にしょうがないけど)
3. 2について、メソッドのジェネリクスで持っていった時にT.values()とかもできない、ので、毎度同じような引数が必要
4. Optionalになる(これは、無い場合があるからしょうがない)
5. (必要はないとはいえ、基本型メンバはだめ(equalsできないため)、がある)

など、悩む所も多い
正直、Lombokライブラリ的にenumのクラスアクセッサ、メンバアクセッサを付けることで、識別と検索APIを付けれたりしたほうが便利なんだがなあ

# 追記
コメントでいただいているものを利用の中核に据えるのがよさそう。

# 考えの元、参考になったリンク
* [Javaのenum書式テンプレート集](https://qiita.com/munieru/items/3238393b3598c5ce66e1)
* [Enumを中身から逆引きして取得する](https://qiita.com/ushidatmhr/items/bd5ae8cdd8f0348650c8)
* [Enumにlookupをコピペして回るのはもうやめて！](https://qiita.com/mt-village/items/d1d88b24d4689e8c3b4d)
TensorFlowでkeras その10

#概要
TensorFlowでkerasやってみた。
binary_crossentropy 使ってみた。
load_weights して、load_img、predict で推論してみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード

```
import os
from tensorflow.contrib.keras.python.keras.models import Sequential, Model
from tensorflow.contrib.keras.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.contrib.keras.python.keras.layers.convolutional import Convolution2D
from tensorflow.contrib.keras.python.keras.layers import Dense, Dropout, Activation, MaxPooling2D, Flatten, Conv2D
from tensorflow.contrib.keras.python.keras.optimizers import Adam
from tensorflow.contrib.keras.python.keras.preprocessing import image
from tensorflow.contrib.keras.python.keras.metrics import binary_accuracy
import numpy as np

pwd = os.getcwd()
img_width, img_height = 128, 128
result_dir = pwd
classes = ['cats', 'dogs']
list = [0, 1.0]

if __name__ == '__main__':
	model = Sequential()
	model.add(Conv2D(32, (3, 3), activation = 'relu', input_shape = (img_width, img_height, 3)))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Conv2D(32, (3, 3), activation = 'relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Conv2D(64, (3, 3), activation = 'relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Flatten())
	model.add(Dense(64, activation = 'relu'))
	model.add(Dropout(0.5))
	model.add(Dense(1, activation = 'sigmoid'))
	model.load_weights(os.path.join(result_dir, 'cnn2.h5'))
	model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['accuracy'])
	img_path = '1.png'
	img = image.load_img(img_path, target_size = (128, 128))
	x = image.img_to_array(img)
	x = np.expand_dims(x, axis = 0)
	x = x / 255.0
	pred = model.predict(x)[0]
	print (pred[0])	
	idx = np.abs(np.asarray(list) - pred[0]).argmin()
	print (classes[idx])
    
```

以上
jsdoでshadertoy sandbox その9

#概要
shadertoyのコードをjsdoでやってみた。
webgl2でなくても、shadertoyは、textureLodが、動く。魔法だ。

#サンプルコード



```
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
	vec2 uv = fragCoord.xy / iResolution.xy;
    vec3 col = textureLod(iChannel0, uv, (sin(iGlobalTime) + 1.) * 2.).xyz;
	fragColor = vec4(col, 1.0);
}
```

#魔法の正体
EXT_shader_texture_lodがTrueなら、以下のコードを挿入すれば、textureLodが、動く。

スクリプトへ

```
gl.getExtension("EXT_shader_texture_lod");
```
シェーダーソースへ

```
#extension GL_EXT_shader_texture_lod : enable

vec4 textureLod(sampler2D s, vec2 c, float b)
{ 
    return texture2DLodEXT(s, c, b);
}    
```

#成果物

http://jsdo.it/ohisama1/6ae2
http://jsdo.it/ohisama1/Wp2X

以上
Decorator のイメージ

Angular をやっていて、デコレータが出てきた。Java などでいうアノテーションだが、どのような仕組みなのかスッキリしないので、ちょっとだけ試して見た。

# クラスの Decorator

Decorator の実態は関数だ。クラスのデコレータはコンストラクタに対してかける。
ここでは、新しいプロパティを追加定義している。

```ts
function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        newProperty = "new property";
        hello = "Overriden";
    }
}

@classDecorator
class Greeter01 {
    hello: string 
    constructor(m: string){
        this.hello = m;
    }
}
console.log(new Greeter01("This is it"));
```

実行結果

```
class_1 { hello: 'Overriden', newProperty: 'new property' }

```

# メソッドのデコレータ

メソッドのデコレータで、ロガーを書いてみる。おそらく、リフレクションとか使うと、
引数とかもダンプできそうだが、元々の目的と異なるので、ここでは深堀しない。ポイントは、関数の引数に、ターゲットのオブジェクト、呼ばれたメソッド名、そして、プロパディディスクリプタが呼ばれた時に引き渡される。関数を呼び出しているので、このケースでは、descriptionはnull になった。

```ts
function logger(value: boolean) {
    return function (target: any, propertyKey: string, description: PropertyDescriptor) {
        if (value === true) {
        console.log(propertyKey + " is called");
        console.log(Object.getOwnPropertyDescriptor(target, propertyKey));
        }
    }
}

class Greeter02 {
    @logger(true)
    greet(message:string) {
        console.log("I'm Greeter 02 " + message);
    }
}

var greeter = new Greeter02();
greeter.greet("hello");
```

実行結果

```
{ value: [Function],
  writable: true,
  enumerable: true,
  configurable: true }
I'm Greeter 02 hello
```
# まとめ

ざっくりと、デコレータのイメージがつかめた。ただし、ここを本気でやろうと思ったら、リフレクションの深堀が必須っぽいので、今日はこの辺にしておく。

* [Object.getOwnPropertyDescriptor()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor)
* [Decorators
](https://www.typescriptlang.org/docs/handbook/decorators.html)
[openFrameworks]画面にいろんなエフェクトを簡単にかけてみる


##この記事を読んでできるようになること

<動画>
https://youtu.be/SsKdUQJesNk

このように今回はpcカメラの映像にリアルタイムでキーをおしたら画面に何層ものエフェクトをかけることができるようになる、というものをつくれるようにします。
だいぶ前につくられたaddonなのですがとても面白いことが簡単にできるのでしっかりと残しておきます。

##使用するもの

openframeworks : http://openframeworks.cc/ja/
ちなみに僕のバージョンはv0.9.8です。

addon : ofxPostGlitch
https://github.com/maxillacult/ofxPostGlitch

###いやそれどんなaddon?
FBOへのいろんなエフェクトが簡単にかけることができるようになるaddonです。
たくさんのエフェクトが用意されています。もちろんカスタムも可能です。

紹介動画(?) : https://vimeo.com/58698980

用意されているエフェクトの文字(たぶんあとでつかいます)

```C++:名前集

    OFXPOSTGLITCH_CONVERGENCE
	OFXPOSTGLITCH_GLOW
	OFXPOSTGLITCH_SHAKER
	OFXPOSTGLITCH_CUTSLIDER
	OFXPOSTGLITCH_TWIST
	OFXPOSTGLITCH_OUTLINE
	OFXPOSTGLITCH_NOISE
	OFXPOSTGLITCH_SLITSCAN
	OFXPOSTGLITCH_SWELL
	OFXPOSTGLITCH_INVERT
	OFXPOSTGLITCH_CR_HIGHCONTRAST
	OFXPOSTGLITCH_CR_BLUERAISE
	OFXPOSTGLITCH_CR_REDRAISE
	OFXPOSTGLITCH_CR_GREENRAISE
	OFXPOSTGLITCH_CR_REDINVERT
	OFXPOSTGLITCH_CR_BLUEINVERT
	OFXPOSTGLITCH_CR_GREENINVERT

```

##使用手順

・ofxPostGlitchをダウンロードしてaddonsのフォルダに追加します。
・projectGeneratorで

![スクリーンショット 2017-09-17 15.10.26.png](https://qiita-image-store.s3.amazonaws.com/0/173252/b80603fd-1ec4-1b48-6808-d646d24c0530.png)

このようにaddonsとして追加してプロジェクトを作成します

・<重要>つくったプロジェクトのbin>dataの中に"ofxPostGlitch-master"に入っているShadersというファイルをコピーしてきておきます

・projectを開き、早速コードを書いていきます！


##コード

```C++:ofApp.h
#include "ofxPostGlitch.h"
```

インスタンス化

```C++:ofApp.h
ofxPostGlitch postGlitch;
ofFbo buffer;

//pcカメラに使用
ofVideoGrabber video;
//音楽に使用
ofSoundPlayer soundplayer;
//キーの判定に使用
bool pressedKey = false;

```

ofFboとは? : http://qiita.com/gantyu/items/5df79b025205aafa3dc8


```C++:ofApp.cpp
void ofApp::setup(){

    buffer.allocate(512, 384);
    postGlitch.setup(&buffer);
    
    //pcカメラについて
    video.initGrabber(ofGetWidth(), ofGetHeight());

    //音楽について
    soundplayer.load("音楽ファイルの名前:bin>dataの中に入れておく");
    soundplayer.setLoop(true);
    soundplayer.setVolume(1.0);
    soundplayer.play();

}
```
```C++:ofApp.cpp
void ofApp::update(){
    //pcカメラについて
    video.update();
}
```

```C++:ofApp.cpp
void ofApp::draw(){
    
    // pcカメラで撮影している映像を描画する処理
    buffer.begin();
    video.draw(0,0);
    buffer.end();
    
    // エフェクト選択
    //ここのOFXPOSTGLITCH_TWISTのところをかえればいろんなエフェクトにできます
    postGlitch.setFx(OFXPOSTGLITCH_TWIST, pressedKey);
    
    // エフェクトをかける(エフェクトを描画できるようにする)
    postGlitch.generateFx();
    
    //bufferで囲んだ部分の処理を描画
    buffer.draw(0,0);

}
```


```C++:ofApp.cpp
void ofApp::keyReleased(int key){
   //1のキーがはなされ時エフェクトがかかる
    if(key == '1'){
        pressedKey = !pressedKey;
    }
 
}
```

どうでしょう？
エフェクトがかかったのではないでしょうか？
ここからさらに配列などを使用していくつもエフェクトを使えるようにすれば重ねることができるので面白い映像が出来上がっていくとおもいます。
ぜひこのaddonを活用して面白いopenframeworksの作品をどんどん作っていきましょう！

このコードきたないよ、とかこここうしたほうがいいんじゃない？とか意見があればぜひいってください！
よろしくお願いします！

では。



##参考資料

https://note.mu/loveandsheep/n/n0d7cfafa9794
http://d.hatena.ne.jp/shu223/20141011/1413030973
Flowtypeのactionの型付け。String Literal型とString型について

flowtypeでactionの型付けをする際に、定数として宣言したアクション名をtypeofを使いActionの型に変形するパターンを使うことが多いと思います。(スクショはAtom-IDE)

![スクリーンショット 2017-09-18 06.06.37.png](https://qiita-image-store.s3.amazonaws.com/0/15319/336d3e31-0235-d50f-e551-16fb7f236724.png)

この場合、`{type: string}`型として認識されています。

ここで、`const action: 'Action' = 'Action'`のように**String Literal**型にすると型が明確になります。

![スクリーンショット 2017-09-18 06.08.07.png](https://qiita-image-store.s3.amazonaws.com/0/15319/b7374b92-c114-8966-4ba0-4e775355b84b.png)

これにすると、デバックが容易になるだけでなく、開発時においてアクションをディスパッチする際の型が明確なので迷うことがなくなります。(画像はAtom-IDE)

#### stringバージョン

![スクリーンショット 2017-09-18 06.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/15319/f7e88f48-e7ee-bc76-f488-e830ecca48d6.png)


#### string literalバージョン

![スクリーンショット 2017-09-18 06.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/15319/d81f861e-7304-3712-2a03-d2af4595856d.png)

## 気持ち
コード量は増えるのでそのトレードオフを考える必要はあります。
またそれを改善する記事を今週中には上げる予定です。

なにか議論あればコメント欄またはtwitterまでよろしくお願いします。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">どちらが読みやすい？ <a href="https://t.co/TV0bCvsKIH">pic.twitter.com/TV0bCvsKIH</a></p>&mdash; 無職.js (@akameco) <a href="https://twitter.com/akameco/status/909522344749686784">September 17, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 関連記事

**flowtypeによるredux-thunkの型付け**
http://qiita.com/akameco/items/c7e48e4666dc1b17350c

**Flowtype+reduxにおけるreducerの正しい型付け**
http://qiita.com/akameco/items/fe7ba22c158a2593b077

**Atom-IDEについて**
http://qiita.com/akameco/items/d883094c5c8152915cf2
さっき git push しちゃったコミットに含まれる一部のファイルだけを revert する

## 場合

`*.foo`だけ入れたと思ってたのに、実際は`*.bar`も含んじゃっていた。

## 解決

`checkout`を使う。

> #### `checkout`の例
>
> ```bash
> git checkout <commit-id> -- <file1> <file2> <fileN>
> # <file1> <file2> <fileN> を <commit-id> 前に戻す
> ```

例えば、さっきプッシュしちゃったコミットが対象なら

```bash
git checkout HEAD~1 -- path/to/hoge.bar
```

となる。

ただ、`*.bar`となるファイルを思ってたより多くの入れてしまったけど、手動で指定するのだるいし、`*.bar`って簡単なパターンで絞り込めそうと考えた場合。

とりあえず全ファイル一覧は、`diff`を使って取り出すことができる。

> #### `diff`の例
>
>```bash
>git diff --stat --name-only <commitA> <commitB>
># <commitA> 時点と <commitB> 時点で異なるファイル一覧
>git diff --stat --name-only <commitA> // 多分HEADと
>```

さっきプッシュしちゃったコミットから取りたいので、`HEAD~1`でOK。`grep`で狙ったファイルに絞る。

```bash
git diff --stat --name-only HEAD~1 | grep *.bar
```

あとは、`xargs`とかでファイル一覧をまとめて`checkout`に渡すようにすれば完了す🎉

```bash
git diff --stat --name-only HEAD~1 | grep .bar| xargs -I@ -n 100 git checkout HEAD~1 -- @
```
zshのctrl+zでジョブのサスペンドが出来なかったときの対応

## 概要

Vim使っている人なんかだと`ctrl+z`を押してシェルに戻る。シェル操作する。`fg`でVimに戻るとかよくやると思います。私はある日、いつも通りVim上で`ctrl+z`を押しました。するとVimのジョブがバックグラウンドにならずに消えました。絶望です。

それから３日間位ずっと`ctrl+z`が効かない生活を送っていました。Vim上で全部やらずに適宜シェルも織り交ぜるエディタタイプの私にとってそれは地獄でした。なので同じ問題で地獄を味わっている人のためにメモを残します。

## 調査

結論を先に言えば原因はチョークールなzshプラグインマネージャ[zplug](https://github.com/zplug/zplug)でした。調査の詳細を以下に記載します。

`ctrl+z`でジョブがサスペンドするのはVimの機能だと思っていましたがそれは錯覚でした。実はシェルの機能だったのです。どおりでGoogle先生に`vim ctrl+z bug`とか聞いても答えてくれないはずです。

ならばシェル側の問題のはずと思いbashを起動してからvim起動からの`ctrl+z`を実行しました。普通にvimはjobとしてバックグラウンドに残りました。朗報です。

ですが私はzsh使いです。bashでサスペンドできてもまだ問題は残ります。次に空の`.zshrc`を用意してサスペンドしました。これも正常に動きました。

これで`.zshrc`の設定が原因と分かりました。あとは適当にあたりを付けて怪しい設定をコメントアウトしていくだけです。結果[zplug](https://github.com/zplug/zplug)の読み込み時にのみこの現状が発生することがわかりました。

## 対応

調査の結果、以下のissueを見つけました。
https://github.com/zplug/zplug/issues/374

英語力がゴミカスな私はなんとか`$ZPLUG_HOME/log/job.lock`を削除したら治ったという一文を見つけました。

`$ZPLUG_HOME/log/job.lock`を削除したところ、無事にvimをサスペンドすることができました。

喜びのあまり私は数十回vimをサスペンドしましたとさ。おわり。
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 序章1

# モデル駆動設計の構成要素

> 本書は、オブジェクト指向設計の解説書でもなければ、急進的な設計原理を提案することもない。ドメイン駆動設計は、伝統的ないくつかの考え方を基に、強調する点をずらしているのだ。(第三章 序章より)

[ちょっとずつ読むドメイン駆動設計 まえがき1](http://qiita.com/YasuhiroKimesawa/items/0b56bc82d8220ccc4092)にて、『ドメイン駆動設計は、オブジェクト指向におけるモデリングと設計・実装について、Ericを含めたコミュニティが実践・経験してきたものをEric自身がまとめたもの』と書きました。

モデル駆動設計の構成要素についても、まさにそれで、元になっているのは、

- 「責務駆動設計」(Wirfs-Brock ら)
- 『[オブジェクト指向入門](www.amazon.co.jp/dp/4798111112)』（Meyer）で説明されている「契約による設計」
- 『[実践UML](www.amazon.co.jp/dp/4894716828)』

などの書籍で紹介されているオブジェクト指向の基本原則たちだということです。

> 開発者は広く知られた基本原則が、モデル駆動設計をどのように支えているかを理解する必要がある。(第三章 序章より)

ドメイン駆動設計について学ぶとき、こういった、オブジェクト指向の基本原則を理解することも大事かと思います。

長い時間かけてドメイン駆動設計やオブジェクト指向設計の原則を学び続ける価値というのはこういうところにあるんだろうなと思うわけです。

まあ、「オブジェクト指向入門」は鈍器だし、「実践UML」は廃版状態。。。ですが、、、
Webpacker + Vue + Vuex + ActionCable で動作するサンプルを作った話

# はじめに
Qiita では初めまして、主に ProjectHL2 という名義で活動している何でも屋のおじさんです。
小さなソフトウェア開発会社でエンジニアをやっており、主に Ruby on Rails を用いた業務システム開発を行っておりました。
最近は会社にも後輩のエンジニアが増え、フロントやモバイルの開発もバンバン行うようになり、こうした技術についてもっと世のエンジニアの皆さんとも共有して行きたい（ついでに仕事も欲しい）と思い記事を書いていく事にしました。
今後ともよろしくお願いします。

## 動機
元々 React + Redux はたまたま実案件でご一緒させて頂いたエンジニアさんと「全然分からないんですか！僕もです、やりましょう！」といった流れで勉強しました。意味不明ですが、人生とはそういうものだと思います。
ともあれ Vue + Vuex でも同じような事ができそうだったので、後輩エンジニアに React を教える傍らで自分の学習を兼ねてサンプルを作りました。

## リポジトリ
以下に動作するサンプルを用意しています。

https://github.com/projecthl2/vuex_actioncable

動作方法は README に詳しいと思うので、確認してみてください。

### これは何？
表題の通り Rails 5.1 の Webpacker を使いつつ Vue + Vuex や ActionCable 周りを動作させた Todo リストのサンプルです。捻りはありませんが Todo リストです。すまない…

具体的には

- 通常の REST API 経由によるリスト一覧取得
- ActionCable を経由した閲覧中の全端末向けのリスト追加
- 上記を Vue + Vuex で実現

あたりまでをカバーしています。

### バックエンドについて
当然ながら Ruby on Rails による実装なわけですが、普段自分が仕事で作るとしてもこれくらいのテストは書くだろう程度のテストは記述しております（なお、コントローラーのテストは書かず `Request Spec` を書いて行くのが今のところのベターなやり方だと思っています）。

また、普段からフォームオブジェクトやデコレーターの導入によるロジックの分離（最近では `Trailblazer` や `Hanami.rb` と言った技術もこの辺りに触れています）なども行っているのですが、今回はそこまでに至るような複雑さは持たなかったので素の MVC をレールに乗って使っています。

ActionCable については[チャンネルがコントローラーのように使われるべき](https://railsguides.jp/action_cable_overview.html#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB)と公式に書いてあったので、そのような実装になっています。

### フロントエンドについて
実は、これに近いものを React + Redux でも作っており、一部そこから影響を受けた設計になっています。

具体的には `app/javascript/packs` 以下が Vue で作られた範囲ですが、今回は Vue コンポーネントの入るディレクトリを `components` と `containers` に分けています。
これは[ Redux のドキュメント](http://redux.js.org/docs/basics/UsageWithReact.html#presentational-and-container-components)で述べられている 内容を意識しているのですが `components/AddTodo.vue` で

```js+cheetah
this.$emit('post-from-child', todo)
```

と書いてしまっているあたりイマイチ結合度を下げ切れていない気もします。Vuex 公式の[ショッピングカートのサンプル](https://github.com/vuejs/vuex/tree/dev/examples/shopping-cart)でも特に分離していないので、そのあたり Vuex では割り切って実装を優先しているのかもしれません。

### カバーできていない範囲
Github のリポジトリでも記載しましたが ActionCable については実装、テスト含めてとりあえず動かした感が否めません。フロント側にしても、エラー時の制御は必要ないのかなど気になります。

またフロント側のテストについても Vuex のテストは書いても良さそうですが今回は含める事ができませんでした。入れるとしたらどこのディレクトリに入れるべきかなどご意見頂けるとありがたいです。

### 展望
当たり前ですが、終わった Todo の削除などを実装するのが良いと思います。

他に簡単にできる改良としては、例えばページングの追加などが挙げられます。バックエンドでは Kaminari Gem あたりによるページ処理、フロント側では State にページ状態を持たせて管理する事になるので RoR と Vue 双方の知識が深まると思います。
Mac買い替え時の初期設定（2017秋）

Macを買い替えたので初期設定手順をメモ。設定内容は好みにもよるし、自分が次に買い換える時にどこまで参考になるかもわからないので、手順の流れを把握できるレベルでまとめておく。


# ブラウザ

ネットで調べることが多いので早めにChromeを入れて同期しておく

[パソコン版 Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)

# Xcode

App Storeからインストール（時間がかかるし、あとで他のアプリで必要になることもあるので早めに入れておく）


# システム環境設定

## Dock

- 画面上の位置
- Dockを自動的に隠す／表示

## キーボード

- `装飾キー` Caps Lockを `Command` に置き換えるなどお好みで
- `ショートカット>Spotlight` 誤爆が多いのでOFF

## トラックパッド

- タップでクリック
- アプリケーションExpose（3本指で下にスワイプ）

## 日付と時刻

- `時計>日付を表示`

## 省エネルギー

- `ディスプレイをオフにするまでの時間` を適宜調整
- ついでに右上のバッテリーマークで`割合（%）を表示`を設定

## 共有

- コンピューター名を適当に変更

# Finder

`環境設定` を開く

- `一般>新規Finderウィンドウで次を表示` お好みで変更
- `サイドバー` お好みで変更
- `詳細` すべてのファイル名拡張子を表示

# ターミナル

`環境設定` を開く

- Basicをお好みのものに変更
- `ウィンドウ` ウィンドウサイズを好みのサイズに変更

# Homebrew

- https://brew.sh/index_ja.html のコマンドを実行
- Xcode Command Line Toolsが一緒にインストールされる

``` bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Homebrew install

使っていくうちに随時入れていくんだろうけど最低限これはすぐ使うだろうというものを入れていく

``` bash
$ apps=(
  zsh
  git
  tree
  # お好みで追加
  )
$ brew install ${apps[@]}
```

## Homebrew cask

``` bash
$ apps=(
  iterm2
  dropbox
  google-japanese-ime
  vivaldi
  java
  android-studio
  # お好みで追加
)

$ brew cask install --appdir="/Applications" ${apps[@]}
```

## Font

[Caskroom-fonts](https://github.com/caskroom/homebrew-fonts) でFontもインストール

```bash
$ brew tap caskroom/fonts

# fonts
$ fonts=(
    font-migu-1m
    font-migu-1p
    font-migu-2m
    font-source-code-pro
    font-clear-sans
    font-roboto
  )
$ brew cask install ${fonts[@]}

```

## MacVim

`lua` とMacVimを入れてシステムのVimと置き換える

```bash
$ brew install lua
$ brew install macvim --with-lua --override-system-vim
$ brew linkapps
```

※ `macvim` をinstallした時にエラーになるケースがある。

https://github.com/nodejs/node-gyp/issues/569

上記を参考に以下のコマンドを実行。

``` bash
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
```

これで `brew install` してみるとまたエラー。

```bash
Error: You have not agreed to the Xcode license. Please resolve this by running:
  sudo xcodebuild -license accept
```

メッセージの通りにコマンドを実行。

```bash
$ sudo xcodebuild -license accept
```

これで再度installすると成功した。


# 各種設定の変更

dotfilesを `git clone` で取得して設定する。

```bash
$ git clone git@github.com:radiocat/dotfiles.git
```

`.bash_profile` や `.zshrc` などについても設定。

# Karabiner

Sierra用の [Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements) をリンク先の手順に従いインストール


# 参考

[Macの初期設定](http://qiita.com/kiyodori/items/64d2032e2a3c757a8e5c)
[homebrewでmacvimを入れてviを置き換える](http://qiita.com/macoshita/items/63188395375686cd6e79)
[HomeBrewでフォントも管理する](http://qiita.com/deeeet/items/0a88117cb73d64b5874e)
JavaScript のプロトタイプを理解する

`prototype` はふわっと知っているけど、実はよくわかっていないので、調べて見た。

JavaScript は、クラスベースのオブジェクト指向と違って、あくまでプロトタイプベース。`class` キーワードがあるが、単なるシンタックスシュガーである。

# prototype

継承に関して言えば、JavaScript はオブジェクトしかない。各オブジェクトはプライベートプロパティ([[Prototype]]と呼ばれる) を持っていて、これは、他のオブジェクト（これは、prototypeと呼ばれる) を持っている。プロトタイプオブジェクトは、自身にプロトタイプオブジェクトを持っている。そのチェーンが null （つまりプロトタイプオブジェクトがnull) に到達すると、そのチェーンが終了する。これをプロトタイプチェーンと呼ぶ。イメージとしてはこんな感じか？

<img width="988" alt="Screen Shot 2017-09-17 at 9.30.38 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/20e86b6f-dccd-ad9f-6990-4c1875dcb868.png">


# Object

JavaScript の全てのオブジェクトは、`Object` のインスタンスになっている。`Object` がプロトタイプチェーンのトップになる。JavaScript の オブジェクトは、ダイナミックなバッグみたいなもので、(own properties と呼ばれる) JavaScript のオブジェクトは、プロトタイプオブジェクトへのリンクをもつ。ある、オブジェクトのプロパティにアクセスすると、そのオブジェクトが持っているプロパティだけでなく、そのオブジェクトのプロパティになければ、プロトタイプのプロパティも参照される。そこになければ、その先のプロトタイプのプロパティ、、、といったようにそのチェーンを辿って参照する。それがnull になるまで。
　
# prototype の参照

prototype は、`obj.[[Prototype]]` に格納されているが、それはプライベートになっている。`Object.getPrototypeOf()` や、`Object.setPrototypeOf()` 経由でアクセスされる。これは、`__proto__` と同等である。

他にも、`func.prototype` というものもある。これは、この関数のコンストラクタを使った時に、全てのインスタンスオブジェクトに対して、`[[Prototype]]` をアサインするものになる。

# prototype のサンプルコード

上記の理屈を理解すべく、サンプルコードを書いて見た。

```js
var a = {
    a: 1,
    b: 2
}

var obj = Object.setPrototypeOf(a, {
    b: 3,
    c: 4
});

obj.__proto__ = {
     c: 5,
     d: 6
}

console.log(obj.a);
console.log(obj.b);
console.log(obj.c);
console.log(obj.d);
console.log(obj.e);
```
実行結果

```
1
2
5
6
undefined
```

Prototype のチェーンにないもの `e` のみが undefined になり、それ以外は、チェーンを辿って表示されている。興味深いものは、`b` の結果で、２番目のプロトタイプオブジェクトで、`b=3` にしているが、先に、最初のオブジェクトですでに、`b`が存在するので、その先のチェーンまで調査されない。



# メソッドと、prototype 

次に、メソッドタイプのものを作成してみる。

```js
function Graph() {
    this.vertices = [];
    this.edges = [];
}

Graph.prototype = {
    addVertex: function(v) {
        this.vertices.push(v);
    }
}

var g = new Graph();
console.log(g.hasOwnProperty('vertices'));
console.log(g.hasOwnProperty('edges'));
console.log(g.hasOwnProperty('addVertex'));
console.log(g.__proto__.hasOwnProperty('addVertex'));
console.log(Object.getPrototypeOf(g));
```

前回のポストでもある通り、`Graph.prototype` を用いると、インスタンス作成時に、毎回メソッド分のメモリが必要にならない。これは、`addVertex` のメソッドが、プロトタイプからのリンクになっているからで、新しいインスタンスを作っても、単にそこにリンクが貼られるだけだからだ。だから、上記のプログラムを作って、どこにプロパティがあるかを調査すると、メソッドのみが、プロトタイプに存在することがわかる。

```
true
true
false
true
{ addVertex: [Function: addVertex] }
```

試しに、同じ方式で、プロパティもいけるか試してみる。

```js
function SomeObj(name, age) {
    this.name = name;
    this.age = age;
}

SomeObj.prototype = {
    name: "Proto desu",
    salary: 100, 
    print: function() {
        console.log(this.name + " " + this.age);
    }
}

var some = new SomeObj("Tsuyoshi", 46);
some.print();
console.log(some.salary);
console.log(Object.getPrototypeOf(some));
```

実行結果

```
Tsuyoshi 46
100
{ name: 'Proto desu', salary: 100, print: [Function: print] }
```
しっかり、想定通りの結果になっている。プロパティも同じ方法が使える。

#  まとめ

これでかなりプロトタイプに関して学べた気がします。挙動がわかってスッキリ！次は、JavaScript の関数に関して書いて見ます。


# リソース

今回の記事はほぼこのページから学びました。

* [Inheritance and the prototype chain](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)