OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10で特定のサイトの特定の部分を閲覧すると画面全体が点滅する不具合の対処方法

# 環境
 Windows 10 Pro 64bit
 (DELL OptiPlex 7040 SFF)

# 現象
 ブラウザで特定のサイトの特定の部分を表示すると、画面全体が激しく点滅する。いままではほぼリモートデスクトップで利用していたので、現象に気づかず(2018/09/23時点)。

# 解析
 - Displayポート出力とVGA出力で試したが、改善なし。
 - ビデオカードを増設したが、改善なし。
 - ドライバを最新版に更新したが、改善なし。
 - 可能な限り試した限り、すべてのブラウザで再現。
  - Microsoft Edge
  - Internet Explorer 11
  - Google Chrome
  - Vivaldi
  - Firefox
  - Opera
 - ブラウザによって点滅の頻度は多少ばらつきがある。
 - 画面がちらつくときの対象方法を調査したが、特定の領域を閲覧すると画面が点滅するという記述がない。

# 解決までの手順
 - 対処方法を検索していると 'https://itojisan.xyz/パソコンのトラブル/windowsで画面がちらつき・点滅する/' のページにたどり着く。
 - このページの中で、'https://itojisan.xyz/wp-content/uploads/2017/10/%E3%83%86%E3%82%99%E3%82%A3%E3%82%B9%E3%83%95%E3%82%9A%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%BF%E3%82%99%E3%83%95%E3%82%9A%E3%82%BF%E3%83%BC-380x283.jpg' の部分を閲覧していると画面が点滅することに気づく。
 - 試しにJPEG画像をファイルに保存しダブルクリックすると、既定のアプリを選択するダイアログが表示される。
 - 今回は "フォト" で画像を表示したが、特に問題なし。
 - その後、ブラウザ閲覧時の画面点滅が発生しなくなる。
 
# 考察
 - （試した限り）すべてのブラウザでほぼ発生していたため、Windowsが問題の可能性が高い。
 - 改善されたのはJPEGの既定アプリを設定した直後のため、ブラウザで閲覧中にJPEGの既定アプリが設定されていないときに画面の点滅が発生した可能性が高い。

# その後
 JPEGの既定のアプリを削除しようとしたが、削除できず。不具合の再現には至っていない。
画像のSSIM算出のための6+2ツールまとめ

SSIMを算出できるツールについて調べたのでまとめました。6種類のツールと、おまけでふたつ紹介します。

# 単体で利用できるプログラム

お馴染みのプログラムでSSIMの計算ができます。

## ImageMagick

ImageMagickに同梱の`compare`コマンドで計算できます。

```bash
$ compare -metric SSIM sample/a.jpg sample/b.jpg NULL:

# 出力
0.909166
```

`compare`コマンドは通常、差分を視覚化した画像を出力しますが、出力画像(第三引数)に`NULL:`を渡すことで数値を取得できるようです。

SSIM値はなぜか標準出力ではなく、標準エラーに出力されます。

PSNRなど他の指標も計算することができ、次のコマンドでその一覧を確認することができます。

```bash
$ compare -list Metric
``` 

手元のImageMagick 7.0.8-4では、AE, DSSIM, Fuzz, MAE, MEPP, MSE, NCC, PAE, PHASH, PSNR, RMSE, SSIMが表示されました。

## ffmpeg

動画編集のツールキットとして有名なffmpegでもSSIMの計算ができます。本来は動画のSSIMを計算する機能ですが、静止画にも対応しています。

```bash
$ ffmpeg -i sample/a.jpg -i sample/b.jpg -filter_complex ssim -an -f null -

# 出力(中略)
[Parsed_ssim_0 @ 0x7f8d5ad01200] SSIM Y:0.932679 (11.718525) U:0.974958 (16.013383) V:0.975355 (16.082717) All:0.960998 (14.089098)
```

かなり多くの情報が出力されますが、最後の行で`0.960998`という結果が得られました。

## Jpeg Archive

Jpeg Archiveは、日本での知名度はあまり高くありませんが、とても強力なJpegファイルの軽量化のためのツールキットです。

同梱されている`jpeg-compare`コマンドでJpeg同士のSSIM値を求めることができます。

```bash
$ jpeg-compare -m ssim sample/a.jpg sample/b.jpg

# 出力
SSIM: 0.998998
```

こちらも`-m`オプションの値によりPSNRなどの計算も可能です。

## 参考 dssim

PNGの軽量化ツールでお馴染みの [pngguant](https://pngquant.org/) と同じサイトで公開されているプログラムです。
PNG専用で、SSIMをベースにした独自の指標のようです。結果の数値もSSIMと異なり、数値も差分が少ないほど0に近い数字となるようです。

**dssim**
https://pngquant.org/dssim.html

```bash
$ dssim sample/a.png sample/b.png

# 出力
0.004913	sample/b.png
```

## おまけ butteragli

Googleから登場して話題になったJpeg軽量化ツールの [Guetzli](https://github.com/google/guetzli) が評価指標に用いているのが [butteraugli](https://github.com/google/butteraugli) ですが、同じように単体で使うこともできます。

```bash
$ butteraugli sample/a.jpg sample/b.jpg

# 出力
3.929208
```

# 特定スクリプト言語向けモジュール

## Python

**jterrace/pyssim**
https://github.com/jterrace/pyssim

コマンドラインツールとしても利用できます。

```bash
# インストール
$ pip install pyssim

# コマンドとして実行
$ pyssim sample/a.jpg sample/b.jpg

# 出力
0.9198549
```

## JavaScript

NPMにはいくつかSSIM算出用のモジュールが登録されています。

**img-ssim**
https://www.npmjs.com/package/img-ssim

[graphicmagick](http://www.graphicsmagick.org/) が必要でした。

```bash
# インストール
$ npm i -g img-ssim

# ワンライナーでとりあえずSSIMを出力
$ node -e 'require("img-ssim")("sample/a.jpg", "sample/b.jpg", (e,s) => console.log(e || s))'

# 出力
0.9339968421131201
```

# Webツール

**Image SSIM**
http://darosh.github.io/image-ssim-js/test/browser_test.html

お手軽にブラウザ上でSSIMを算出できるツールです。次のJavaScript用モジュールのデモとして公開されています。

**darosh/image-ssim-js**
https://github.com/darosh/image-ssim-js


# ベンチマーク

圧縮率を変えて保存したある2枚のJpeg画像について、それぞれのツールのSSIM値と所要時間を計測しました。

|プログラム|SSIM値|所要時間|
|-------|-----:|------:|
|ImageMagick|0.909166|5.148s|
|ffmpeg|0.960998|0.134s|
|Jpeg Archive|0.998998|0.109s|
|pyssim|0.9198549|1.903s|
|img-ssim|0.9339968421131201|4.058s|
|butteraugli|※所要時間の比較まで|4.417s|

算出されるSSIM値も所要時間も、かなりバラツキがありました。

SSIMは小領域の分割サイズや数式上のパラメータを利用者が決めるようなので、おそらくその値の違いによる影響なのかと推測しています。
UNIXシステムに伝統的な主なディレクトリ

いつも忘れるのでメモ

# UNIXシステムに伝統的な主なディレクトリ
/sbin, /usr/sbin
システム管理用コマンドの置き場所

/bin, /usr/bin
基本コマンドの置き場所

/dev
プログラムから各種デバイスを扱うための「スペシャルファイル」と呼ばれる特別なファイルが置かれている

/etc
個々のシステムに固有の様々な設定ファイルの置き場所

・usr/lib
ライブラリファイルの置き場所

/usr/local
ユーザが独自にインストールしたソフトウェアの置き場所として使われる

/usr/share
プログラムが使用するシステムに依存しないデータファイルやドキュメント、オンラインマニュアルなどの置き場所です

/tmp
一時ファイルの置き場所
ここにおかれたファイルは次回のシステム起動時に削除される
実際には/private/tmpのシンボリックファイル

/var
「var」は「variable」(可変の略)キャッシュデータ、ログファイル(/var/log)など日常的に変更されるファイルの置き場所
実際には/private/varのシンボリックファイル

# macOS独自の主なディレクトリ
/Users(「ユーザ」フォルダ)
ユーザのホームディレクトリの保存場所

/System/Library
macOS独自の機能拡張などライブラリファイルの保存場所
/Libraryより重要度の高いファイルが保存されてる

/Library
macOS独自の機能拡張などのライブラリファイルの保存場所
主に
アプリケーション独自の機能拡張などが保存されている
SDカードのライトプロテクトを解除する@windows7

#■はじめに
ライトプロテクトが掛かったSDカードのプロテクトを解除します。
＃windows 7からdiskpartを利用します。

#■手順1. コマンドプロンプトを管理者権限で起動

#■手順2. diskpartを起動
コマンド：
`diskpart`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/7a7e2b7c-1133-11c6-30ee-eab4620d0198.png)

#■手順2. 対象ディスクの確認
コマンド：`list disk`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/9b6608f7-7666-b89e-56be-7f10d3183da8.png)

#■手順3. 対象ディスクの選択
コマンド：`select disk <ディスク番号>`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/dfc8a6b0-6645-0ccc-f023-418fab93e473.png)

#■手順4. 対象ディスクのクリーン
コマンド：`select disk <ディスク番号>`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/0cceadf2-5ec7-2e8d-5fca-7a315b21f924.png)

#■手順5. diskpartの終了
コマンド：`exit`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/a0d51a37-caa2-0f1d-f31f-819a2c787cca.png)

#■出典/参考
Windowsで、diskpartのcleanコマンドを使ってディスクの内容を消去する
http://www.atmarkit.co.jp/ait/articles/1004/16/news101.html

Windowsのdiskpartコマンドでディスクのパーティションを操作する
http://www.atmarkit.co.jp/ait/articles/0812/26/news119.html

DiskPart のコマンド ライン オプション
http://www.cs.tohoku-gakuin.ac.jp/~otofuji/ETC/Win-System/Appendix/diskpart-man.html

diskpart によるディスク全体の消去
https://qiita.com/aoi70/items/75f61ec679c1c1b71f8e
Jupyter notebookにRを追加したらPythonが動かなくなった時の対処の方法

###Jupyter notebookにRを追加したらPythonが動かなくなった時の対処の方法

環境: MacOS, Anaconda, Python3

自分用のメモのために書きました。
普段PythonとRを使っているんですが、Jupyter notebookでPythonを使っているとRもJupyter notebookで使いたいなと思い

```
conda install -c r r-essentials
```
をターミナルに入力してRをAnacondaにパッケージとしてインストールしたら無事にRは使えるようになりました。

![スクリーンショット 2018-09-23 21.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/239041/5cd45d3a-1343-3058-6fbb-ebcea14a977a.png)

しかし、なぜかPythonが実行できなくなるという問題が発生。まさかJupyter notebookがRしか使えないゴミと化したかと焦りながら解決方法を考える。

Jupter notebook起動時のターミナルを見てみると
**ERROR:tornado.general:Uncaught exception in ZMQStream callback**
と書かれていました。


これをググって見たところどうやら

```
conda upgrade ipykernel
```
でipykernelを最新のものにアップデートすれば解決するみたいです。
これを実行したところ、無事Pythonが動くようになり、PythonとRを自由に切り替えれるようになりました。
これからJuypter notebookでバリバリPythonとRを書いていこうと思います！
Railsのリンク方法

#link_to

`link_to 表示文字列, リンク先` という形で記述します。

リンク先 として `message` のように Model のインスタンス（レコード）を渡すと、
自動的にそのインスタンスの show アクションへとリンクされるようになります。

省略せずに書くと `message_path(message)` となり、
リンク先 にこう記述しても正常に動作します。 

`message` も `message_path(message) `もどちらも最終的に 
`/messages/1` など `/messages/:id `の形の URL を生成しているだけです。

#redirect_to
`redirect_to @message`は、 
処理を `messages#show` のアクションへと強制的に移動させるもので、
create アクション実行後に更に show アクションが実行され、
`show.html.erb` が呼ばれます。

#render
render :new は、単に messages/new.html.erb を表示するだけです。
（messages#newのアクションは実行しない）。

render :userであれば、user/_user.html.erbを表示させるだけ。
IKEA Trådfri Gatewayがいつの間にか売られていたので、Node.jsでド派手なLチカをしてみる。

# TL;DR
いい色のLED電球をNode.jsで操作できる。

# 日本でもIKEA Trådfri Gatewayが売ってる。
IKEAにふらっと行ってみたら、
うおおおおおおおお！！！！！
![IMG_20180922_161600.jpg](https://qiita-image-store.s3.amazonaws.com/0/25176/1eec9290-f3d8-7f5f-1b30-05756024d76a.jpeg)
いつの間にか、IKEA Trådfri Gatewayが売られている！！！！
おおおおおおおお！！！！

取り乱しましたが、IKEA Trådfriとは、かの家具量販店IKEAで販売している、無線で操作できるLED電球のことです。
![IMG_20180923_105325.jpg](https://qiita-image-store.s3.amazonaws.com/0/25176/d677fbfc-c900-33d3-92d5-1f9f2af27bb3.jpeg)


専用のリモコンで操作できる他、GatewayがあればGoogle Home,Alexaはもちろん、ソフトウェア操作できるものです。
ただ、悔しいながら、日本では、Gatewayが販売されていなかったのです。

シーリングライトはもちろん、床暖房までボイスコントロールするほどホームオートメーション好きの私でしたが、Amazonで入手したLED電球のダウンライトを赤外線操作可能なLEDに変更したところ、色が明るすぎ（白すぎ）て部屋に合わず、スイッチ操作のものに戻してしまっていました。
それに比べて、IKEA Trådfriは色がとても良いです。IKEAの店舗に行っては、Trådfriの暖かな色に羨望の眼差しを向けていましたが、専用のリモコンでしか操作できない日本のTrådfriでは無線のオイシさも半減。購入をできずにいました。

それが！今週ふらっとIKEAに行ってみたら！あるではありませんか！Gateway!
ということで、LED電球も合わせてGatewayを買ってしまいました！！！！！

# セットアップ（省略）
Trådfri GatewayがあればGoogle Home、Alexaとも接続できます。手順はたくさん書いてあるので、ググってください。ここでは省略します。

が、注意点を１点。
TrådfriはLED電球単体で販売していますが、Gatewayとの接続のためにはリモコン（上記写真のLED電球とともに写っている丸いやつ）が必要です。最初に買うときは、リモコンとセットのものを購入することをおすすめします。１つあればいいので、２個めからはLED単体のものをご購入することをおすすめします。

# NodeでLチカ
Node.jsで操作するときは、node-tradfri-clientを使えばAPI操作ができます。
先にAndroid/iPhoneでのセットアップを済ませておいてください。

```sh
mkdir tradfri
cd tradfri
npm install node-tradfri-client
```

サンプルコードは以下です。

```js:index.js
var tradfri = require("node-tradfri-client");
var Client = tradfri.TradfriClient
async function lightTo(deviceName, onOff) {
  const gateway = await tradfri.discoverGateway();
  var client = new Client(gateway.addresses[0]);
  const {identity, psk} = await client.authenticate(process.env.SECURITY_CODE);
  await client.connect(identity, psk);
  client.on("device updated", async (device) => {
    if (device.name === deviceName, device.type === tradfri.AccessoryTypes.lightbulb) {
      await client.operateLight(device, {onOff, transitionTime:5});
      setTimeout(() => client.destroy(), 500);
    }
  }).observeDevices();
}
lightTo(process.env.NAME, process.env.ON == "true");
```

簡単ですね。
あとは、コマンドで

```
NAME={Android/iPhoneで設定したLEDの名前} ON=true SECURITY_CODE={Gatewayの裏に書いてあるSecurity Code} node index.js
```
で実行完了。LED電球をつけたり消したりできます。
![out2.gif](https://qiita-image-store.s3.amazonaws.com/0/25176/d98c3fd3-8b29-6a69-ab2b-551f66326065.gif)

# まとめ
実はPhilips Hue Bridgeを使えば、これまでもTrådfriは操作できたのですが、Hue BridgeはAmazonで7000円以上、Trådfri Gatewayであれば、店舗に行けば5000円くらいで買えます。
まだホームオートメーションをやられたことがない方もTrådfriでお家のソフトウェア制御を始めてみてはいかがでしょう？
python3.5.4で画像処理モジュールのopencv-pythonを取得した後に pip install cv2をやってみました。

```
==============
使用環境(使っているエディターやアプリケーションなど):
・python3.5.4
・windows7Professtional 32bit
・VisualStudioCode
[pip --version]
・18.0
[pip list]　　※()内はバージョンです
numpy(1.14.2)
pandas(0.23.4)
scipy(1.0.1)
matplotlib(2.2.2)
beautifulsoup4(4.0.6)
cycler(0.10.0)
Django(2.0.6)
Flask(0.12.1)
geojson(2.4.0)
gunicorn(19.8.1)
Jinja2(2.10)
jupyter(1.0.0)
ipython(6.4.0)
jsonschema(2.6.0)
Pillow(5.2.0)
scikitlearn(0.19.1)
virtualenv(16.0.0)
wheel(0.31.1)
urllib3(1.22)
(他にもいろいろモジュールをいれてます)
==============
[今回やってみたこと]
・opencv-pythonモジュールのインストール
・pythonのopencvのコードを実行してみた。
・pip install cv2の実行
[実行したコード]
import cv2
import sys

image_file = "./pakutas/photo1.jpg"

cascade_file = "haarcascade_frontalface_alt.xml"

image = cv2.imread(image_file)

image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cascade = cv2.CascadeClassifier(cascade_file)

face_list = cascade.detectMultiScale(image_gs,
    scaleFactor=1.1,
    minNeighbors=1,
    minSize=(150,150))

if len(face_list) > 0:

    print(face_list)
    color = (0,0,255)
    for face in face_list:
        x,y,w,h = face
        cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=8)
    cv2.imwrite("facedetect-output.PNG", image)

else:
    print("no fafe")
[実行した結果]
C:\Program Files\python3.5\aaa>python test.py
Traceback(most recent call last):
  File "test.py" line 1, in <module>
    import cv2
ImportError: No module named 'cv2'


との表示がでましたので、pip install cv2をしてみることにしました

[試しに　pip install cv2を実行すると....]

C:\Users\user>pip install cv2
Collecting cv2
  Could not find a version that satisfies the requirement cv2 (from versions: )
No matching distribution found for cv2
....と表示がでました。
```
(ちなみにopencv-pythonは取得済みです。)
第18回学生LT in 名古屋 報告メモ

#これはなにか？
今日行われた学生LT in 名古屋　でプレゼンされた内容を簡潔にまとめた自分用メモです。
微妙にタイトルが違ってたりしたらすみません。
**なお、ここに出てくる@ は twitterのIDであって、QiitaのIDではありません。**
(とはいえ、たぶんそれなりにはかぶってる)

##1番目  Storyblock -AN API based Headless CMS
by @ssssssigma
htmlではなくjsonでWebページを構築するみたいな話。

##2番目　CSSと3Dのはなし
by @moscwa_ （自分です！）
cssだけで立体を作ろう的な。


##3番目　WSLのすすめ 
by @hrtshu
WindowsでLinuxバイナリを動かす！
LT資料: http://bit.ly/2xLYXuG

##4番目Golang + Gin + gorn　で部活用の管理システム 
by @onsd_

##5番目　まちと学生とソフトウェア開発 
by @ItyuJ
[http://5374.jp/](http://5374.jp/) というサイトの紹介など。
早速あなたの街でも導入しよう！

##6番目　さらばTLS1.0/1.1
by @KageShiron
SSLとかTLSとかのセキュリティと歴史の話。

##7番目 JKはお昼の放送の曲のリクエストシステムを作りたい 
by @unipple_
その名の通り。結局完成はしなかったらしい。
Google sheetをDB代わりに使うという話が面白かった。

##8番目　子供たちと始める、初めてのIchigoJam 
by @nittc_tia
ラズパイみたいな。
子供たちにプログラミングを教えてみてわかった苦労とか。

##9番目　人生で初めて女装をした話
by @siketyan
なんだこれ

##10番目　World Wide Webを再構築する 
by @megumish
wwwの弱点とか新しいアイデアの話とか

##11番目　自分のサイトを作るときの自分からの提案 
by @huequica
github.ioとかJekyll （静的サイトジェネレーター）とかの紹介

##12番目　自分の悩み 
by @smk7758
普通科高校生の悩みなど。同じ立場の人間として非常に共感できた。

##13番目　これからのandroidのアーキテクチャについて
by @Fumiya_Kume
Kotlinとか、androidの今後の話とか
個人的にパワポのページ遷移がかっこよかったのが印象的。

##懇談会
ピザがあっという間になくなりました。

##まとめ
今回はいつも以上に癖のあるメンバーだったかなと個人的には思いました。
windows+android勢 vs mac+iOS勢　の対立（？）が露骨に出た感じはしました。


以上、今回の自分用メモでした。
ionic4で困ったことの解消法 

###ページ作成コマンドでエラー
**本件はionic start 時に --type=angular 入力しなかったから起きたっぽい**


いつものように以下コマンドでページを作成しようとしたら、、

```
ionic generate page XXXX
```
エラーが出てページ作成ができない。

```
Error: Cannot find module '@ionic/app-scripts'
```

app-scriptsがないと言われたので、素直にインストールしたら解消した

```
npm install @ionic/app-scripts@latest --save-dev
```
ホームディレクトリを使いまわしたらGUI周りの設定消したのにUbuntuでログインループする

# 解決策の結論

Ctrl+Alt+F2でログインした後、以下のコマンドを実行

```shell
# chown -R ユーザ名:ユーザ名 /home/ユーザ名
```

# 症状

Ubuntu16.10をしばらく使ってきたがそろそろ18.04にしないとまずいかなと思いホームディレクトリを使いまわしながらインストールし前使っていたメインのユーザー名と同一のユーザーを作成したものの、ログインしたところどうにもマウスの挙動がおかしかったりなぜかズーム表示のまま固定されるという怪奇現象が起きる
最初はGUI周りの設定ファイルを使いまわした結果なんか知らんけどコンフリクトとか起きたんだろうなと思い、そのあたり含め必要なファイル以外を片っ端から消し飛ばして再びインストール
さあ問題なく使えるぞと思いウキウキ気分でログインを実行したところ、何故かログインしてもログインしても画面が真っ暗
この様子だとログインできない模様
ぐぐってみるとログインループと呼ばれる現象らしく、.XAuthorityあたりを使いまわすとGUIログインの際にトラブルが起きて失敗したりnVIDIAのGPUを使うとドライバ周りの都合で起きるとのこと
しかしGUI周りの設定は全部消したからログインすれば再度自動生成されるはずだし、別にGPUなんて積んでなかったのでそんなことでログインループするはずがない
幸いにもCtrl+Alt+F2によるCUIログイン及びそれによるコマンド実行は成功する。
また、CUIコンソールからadduserで新しくユーザーを作成した場合、そのユーザは問題なくGUIログインできた
やはりいままで使ってたユーザーのホームディレクトリに何かトラブルの原因がある様子

# 原因

ホームディレクトリを使いまわすとき、全てのファイルの所有者がrootとなっていた
なので個人ユーザーがGUIログインする歳の設定ファイルあたりが新しく書き込めなかったりして、GUI周りの起動時処理が失敗→起動時の処理に失敗するとログイン画面に戻る仕様のおかげでログインループした模様
これが原因らしい

# 解決策

ホームディレクトリの所有権がrootなので、根こそぎユーザー自身に戻す。

```shell
# chown -R ユーザ名:ユーザ名 /home/ユーザ名
```
Android / iOSでPC経由で実機テスト・デバッグを行う方法

　WebでAndroid端末やiOS端末の実機テストを行いたい場合に、USB接続を行うことでパソコンでインスペクターを表示することができるようにするための設定をまとめます。

## 環境
パソコン: MBP2015(15inch)
Android: Huawei P10 Lite
iOS: iPhone7

# Android -> Chrome(PC)

こちらの方法はパソコンがWindowsの場合でも行うことができます。

*解説はしませんが、Windowsで使用する前に、WindowsにUSBドライバを追加する必要があります。
こちらの[OEM USB ドライバのインストール](https://developer.android.com/studio/run/oem-usb)を参考にインストールした後は、下と同じ操作になります。*

## Androidの設定
1. `本体設定 > 端末情報`の中の`ビルド番号`を**7回タップします**
![Screenshot_20180923-190118.png](https://qiita-image-store.s3.amazonaws.com/0/93474/add7e051-473a-d9eb-7eb6-47fa8d6eddb4.png)

2. すると`本体設定 > 開発者向けオプション`が表示されるようになります。
![Screenshot_20180923-190625.png](https://qiita-image-store.s3.amazonaws.com/0/93474/d3d0bbae-e306-c624-abc7-8c18079e89e3.png)

3. `開発者向けオプション`を見ると、様々な設定があり、一番上にある`開発者向けオプション`のボタンをオンにすることでこれらの設定を利用できるようになります。今回は以下の項目を変更してください

- `ネットワーク > USB設定を選択` を**ファイル(MTP)**
- `デバッグ　> USBデバッグ` を**オン**

これで、Android側の設定が完了しました。

## Chrome(PC)の設定
1. ChromeのDevToolsを開いて、以下のように`Remote devices` を開きます。
<img width="921" alt="スクリーンショット 2018-09-23 19.19.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/93474/0c9b6ad1-7570-0388-ab3d-75e031fe5a52.png">


2. `Discover USB devices` をオンにすると、左側の欄に接続した端末が出てきます。
<img width="921" alt="スクリーンショット 2018-09-23 19.19.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/93474/188ddf9b-9b27-b7bf-4d90-a5e29190fa89.png">

3. 端末名をクリックすると、開いているタブ一覧が取得できるので、デバッグしたいサイトの`Inspect` をクリックします。
<img width="921" alt="スクリーンショット 2018-09-23 19.21.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/93474/0fe64041-4ce0-686a-3cd4-6afd6e90f872.png">

4. このようにして、Androidで開いているタブのDevToolsを開くことができます。
<img width="921" alt="スクリーンショット 2018-09-23 19.21.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/93474/0d8b11c6-6cee-8246-a6e1-7aa103bb8538.png">

普通のDevToolsと同じようにElementsをいじったり、Consoleに出力したりすることができます。また、左側のUIで、実機と同じようにタップ操作を行なうことができます。

# iOS -> Safari(PC)
こちらも同様にiOS、Safari(PC)でそれぞれ設定していきます。

## iOSの設定
1. 設定のアプリを開き、`設定 > Safari > 詳細`を開く
2. Webインスペクタをオンにする

<img width="375" alt="IMG_6395.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/93474/d85b8ed1-ec14-99fa-c91c-93026b6adb39.png">

## Safariの設定
1. メニューバーから`開発 > デバイス名 > タブ名` を選択します。
<img width="1071" alt="スクリーンショット 2018-09-23 19.37.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/93474/f0089f2c-9a2c-60f3-389f-a19ba03249a4.png">
2. このようにして、開いているタブのインスペクタを開くことができます<img width="961" alt="スクリーンショット 2018-09-23 19.37.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/93474/e122563e-8050-05c0-5a8a-79f0c70635c5.png">

# 注意事項
- Android -> Chrome(PC)の時に、毎回USBに接続してから、Androidの設定の3を行わないとできませんでした。

# まとめ

これで、面倒臭い実機テストを、効率よくパソコンだけでできるようになりました😉
以上になります。修正・質問などありましたら、よろしくお願いします。

# 参考文献
- [Android 端末のリモート デバッグを行う](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/?utm_source=dcc&utm_medium=redirect&utm_campaign=2016q3)
promisify についてのまとめ

もうだいぶ前の話になるが、Node.js v8.0 で [util.promisify](https://nodejs.org/dist/latest/docs/api/util.html#util_util_promisify_original) が実装された。
同じく v8.0 で実装された async/await と一緒に使うと非常に便利。

今回は、promisify の便利さを説明するための資料としてのまとめ。

ちなみに Promise については説明しない。

## 例
以下のような、何らかのデータベースにクエリ文字列を投げて結果を取得するようなコードがあるとする。

``` js
const db = new DB('db://user:pass@host');

db.execQuery('SELECT ... FROM ...', (err, results) => {
  if (err) console.error(err);
  else console.log(results);
});
```

結果をコールバック関数で取得してくる古き良き (？) 非同期処理だが、このままだと非同期処理をチェーンしたい場合にいわゆるコールバック地獄が発生したり、他の Promise のチェーンに組み込むのが面倒くさかったりする。

## 手動で Promise 化
よくやるのは、コールバック関数で実装されている非同期処理を自分で Promise を返すようにラップする。

``` js
const db = new DB('db://user:pass@host');

function execQuery(query) {
  return new Promise((resolve, reject) => {
    db.execQuery(query, (err, results) => {
      if (err) reject(err);
      else resolve(results);
    });
  });
}
```

この例だと `execQuery` を Promise を返す関数としてラップしたので、以下のように使えるようになる。

``` js
execQuery('SELECT ... FROM ...')
  .then(results => console.log(results))
  .catch(err => console.error(err));
```

また、async/await を使うと以下のように書ける。

``` js
async function main() {
  const results = await execQuery('SELECT ... FROM ...');
}
```

しかしこのままでは、Promise に対応していない非同期関数の数だけラップした関数を実装しなければならない。

ラップする際にやることはどの関数もだいたい一緒なので、数が多いとどうしてもコードが冗長になってしまう。

## `util.promisify` を利用
`util.promisify` を使うと、上記でやったことと同様の Promise 化を簡潔に書くことができる。

ただし適用できる関数には制約があり、以下の２つの条件を満たしている必要がある。

- 引数の最後でコールバック関数をとる
- コールバック関数がとる引数の最初の引数はエラー

これを満たしていない関数は `util.promisify` で Promise 化できないので、手動で Promise 化しなければならない。

今回の例の `db.execQuery` 関数はこの条件を満たしているので、以下のように Promise 化できる。

``` js
const util = require('util');

const db = new DB('db://user:pass@host');

const execQuery = util.promisify(db.execQuery).bind(db);
```

``` js
execQuery('SELECT ... FROM ...')
  .then(results => console.log(results))
  .catch(err => console.error(err));
```

注意点としては、Promise 化された関数はレシーバが束縛されていないので、必要に応じて `.bind(db)` のように束縛してから使う必要がある。

## (オマケ) 簡易 promisify を自分で実装してみる
`util.promisify` を使わずとも簡易的なものであれば自分で簡単に実装することもできる。

``` js
function promisify(original) {
  if (typeof original !== 'function') throw new TypeError();
  return function(...args) {
    return new Promise((resolve, reject) => {
      original.call(this, ...args, (err, ...values) => {
        if (err) reject(err);
        else resolve(...values);
      })
    })
  }
}
```

※ `...` は [スプレッド演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)

``` js
const db = new DB('db://user:pass@host');

const execQuery = promisify(db.execQuery).bind(db);
```

``` js
execQuery('SELECT ... FROM ...')
  .then(results => console.log(results))
  .catch(err => console.error(err));
```

## 参考
- [util.promisify が追加された - from scratch](https://yosuke-furukawa.hatenablog.com/entry/2017/05/10/101752)
ROS講座65 YDLIDARを使う

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 16.04 |
| ROS | Kinetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
LIDARはロボットの「目」として重要なセンサーです。しかしWebカメラなどに比べると効果で安くても10万円、高いと100万円を超します。その中で最近中国製の安い物が発売されています。今回はこの中でも100ドルを切る`YDLIDAR X4`を使ってみます。

![YDLIDAR.png](https://qiita-image-store.s3.amazonaws.com/0/254442/5dd6aa47-9f88-1ef8-55cc-35eec4a7704f.png)
[YDLIDARのwebサイト](http://ydlidar.com/product/X4)より

# 購入
[Aliexpress](https://ja.aliexpress.com/item/LIDAR-053-eai-ydlidar-x4-lidar-10-5-k-eai/32850437159.html?spm=a2g0s.9042311.0.0.3da24c4dSitzTv)で購入しました。値段は85ドルほどで1万円を切っています。注文してから18日間ほどして到着しました。Aliexpressで買うと大体2～3週間かかりますね。
最近はAmazonでも購入できます。

# 梱包・内容物
梱包はしっかりしていました。内容物は以下です。

* YDLIDAR本体
* USB変換基板(+ケーブル)
* 予備モーターベルト
* USBケーブル
* 固定用ねじ（M2.3）x5
* 合格証

![YDLIDAR中身.JPG](https://qiita-image-store.s3.amazonaws.com/0/254442/34755bce-d568-1e7d-6de0-5d31a53f06c5.jpeg)

YDLIDAR本体には6ピンのシリアルインターフェイスしかありません。変換基板を使うとUSBでアクセスできます。電源もUSBからの給電します。いちおう通信用とは別に給電用のUSBもついています。

# 動作テスト
公式リポジトリにサンプルプログラムがあるので、とりあえずLIDARを起動して動かすことができます。

## とりあえず刺してみる
YDLIDAR<-(6ピンケーブル)->変換基板<-(USBケーブル)->PCと接続したところLIDARの回転は起こらずPCからは`/dev/ttyUSB0`と見えました。ひとまずはここで接続を抜きます。

## リポジトリのclone
公式からgithubで動作用のプログラムが提供されています。

```shell:リポジトリのclone
cd ~/ros_catkin_ws/src
git clone https://github.com/EAIBOT/ydlidar.git
cd ~/ros_catkin_ws
catkin_make
```

## udevの追加
先ほど`/dev/ttyUSB0`と見えていましたが、これではほかにもUSBシリアル変換チップを混ぜるとどれがどれだか分からなくなります。udevを追加することでydlidarにつながっているシリアルポートを`/dev/ydlidar`という名前で見えるようにします。

```shell:udevの追加
cd ~/ros_catkin_ws/src/ydlidar/startup
chmod 777 *
sudo sh initenv.sh
```

`ls /dev/ydlidar`で見えます。

## 実行

```shell
roslaunch ydlidar lidar_view.launch
```

コマンドを打つとYDLIDARが回転を始めます。Rvizで`scan`トピックを見ることができます。これは手で持って部屋の中を写したものです。右側のひだはカーテンです。部屋の角もきれいに写っているのが見えます。
（たまに移ったり写らなかったりするのはちょうど手の高さの家具があってそれが角度や高さによって見えたり見えなかったりするだけです。）
![hard_ydlidar.gif](https://qiita-image-store.s3.amazonaws.com/0/254442/a1d16df1-5ea3-1566-cd1b-ff5b6413ad5f.gif)

# ydliderのscan topicがRvizで表示されない
2018年10月あたりのバージョンアップからscanをRvizに入れても可視化されなくなりました。トピックは来ているのですが、時間関連の値が不正ではじかれるみたいです。以下のように該当の部分をコメントアウトするととりあえず表示されるようになります。

```diff:ydlidar/src/ydlidar_node.cppの修正(git_diffの131行目あたり)
-            scan_msg.scan_time = scan.config.scan_time;
-            scan_msg.time_increment = scan.config.time_increment;
+            //scan_msg.scan_time = scan.config.scan_time;
+            //scan_msg.time_increment = scan.config.time_increment;
```

# オプション
よく使うのが以下のオプションです。

* reversion: 出力が180deg回転する。正面が前後逆になる。
* inverted: 出力が反時計回りの鏡写しのようになります。LIDARを上下逆に取り付けた時に使う。

# 参考
[$99と$400のLIDAR（360度レーザー距離測定機）を動かしてみた](http://asukiaaa.blogspot.com/2018/06/99400lidar360.html)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
jsreportのchapter名を変更する

#やりたいこと

LaTeXのjsreport環境下でchapterを使うと、デフォルトでは下図のように「第n章」と表示される。
![Screen Shot 2018-09-23 at 19.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/217692/01d5e412-a673-15e4-2136-a0431b0345f9.png)
この「第n章」を適当な文字列に変更したい。

# 方法
プリアンブルにて\prechaptername, \postchaptername, \thechapterコマンドを\renewcommandしてあげればよい。

```tex:chapterchanger.tex
\documentclass[12pt]{jsreport}

\renewcommand{\prechaptername}{これは}
\renewcommand{\postchaptername}{章目だよ}
\renewcommand{\thechapter}{\roman{chapter}}

\begin{document}
	\chapter{かわったよ}
\end{document}
```
# タイプセット結果
![Screen Shot 2018-09-23 at 19.07.44.png](https://qiita-image-store.s3.amazonaws.com/0/217692/5f3a72db-c442-bd3e-739c-9433a9954efe.png)

# chapter以外も変える場合
jsreport.cls内では、各コマンドが以下のように定義/再定義されている。なので、chapter以外も変えたければ各コマンドを\renewcommandを用いて再定義すればok

```tex:jsreport.cls
% the系
\renewcommand{\thepart}{\@Roman\c@part} 
\renewcommand{\thechapter}{\@arabic\c@chapter} 
\renewcommand{\thesection}{\thechapter.\@arabic\c@section} 
\renewcommand{\thesubsection}{\thesection.\@arabic\c@subsection} 
\renewcommand{\thesubsubsection}{% 
  \thesubsection.\@arabic\c@subsubsection} 
\renewcommand{\theparagraph}{% 
    \thesubsubsection.\@arabic\c@paragraph} 
 \renewcommand{\thesubparagraph}{% 
    \theparagraph.\@arabic\c@subparagraph} 

% pre~は前につく言葉, post~は後につく言葉
\newcommand{\prepartname}{\if@english Part~\else 第\fi} 
\newcommand{\postpartname}{\if@english\else 部\fi} 
\newcommand{\prechaptername}{\if@english Chapter~\else 第\fi} 
\newcommand{\postchaptername}{\if@english\else 章\fi}
\newcommand{\presectionname}{}%  第
\newcommand{\postsectionname}{}% 節
\newcommand{\contentsname}{\if@english Contents\else 目次\fi}
\newcommand{\listfigurename}{\if@english List of Figures\else 図目次\fi}
\newcommand{\listtablename}{\if@english List of Tables\else 表目次\fi}
\newcommand{\refname}{\if@english References\else 参考文献\fi}
\newcommand{\bibname}{\if@english Bibliography\else 参考文献\fi}
\newcommand{\indexname}{\if@english Index\else 索引\fi}
\newcommand{\figurename}{\if@english Fig.~\else 図\fi}
\newcommand{\tablename}{\if@english Table~\else 表\fi}
\newcommand{\appendixname}{\if@english \else 付録\fi}
\newcommand{\abstractname}{\if@english Abstract\else 概要\fi}
```



# 参考文献
[jsclasses(by texjporg)のGithub](https://github.com/texjporg/jsclasses)
Android：アプリのシェア機能でのちょっとした工夫

言語を指定する `hl` パラメータをシェア用の URL に付けると、
OGP の表示がちょっと見やすくなることがあるというお話です。

## 前提
Google Play Console の「ストアの掲載情報」に複数の言語で登録していること。

## 実装例

``` strings.xml
<!-- シェア用のURL -->
<string name="share_url" translatable="false">https://play.google.com/store/apps/details?id=com.byuubyu.freecalcleaf</string>
```

``` MainActivity.kt
    // 友達に教えるボタンなどからコールされるシェアメソッド
    fun onClickShare(v: View?) {
        ShareCompat.IntentBuilder.from(this)
                .setChooserTitle(R.string.share_chooser_title)
                .setText(getString(R.string.share_url) + "&hl=" + Locale.getDefault().language)
                .setType("text/plain")
                .startChooser()
    }
```

ポイントは、`setText` で `hl` パラメータに端末の言語をセットして文字列連結しているところです。
文字列リソース側に `&hl=%1$s` を（適切にエスケープしつつ）追加してテンプレート化し、`getString` の第2引数に言語を渡す形に書き換えてもOKです。
シェア用の URL 例は私の自作アプリです（隙あらば宣伝していくスタイル）。

## LINE での使用例
「ストアの掲載情報」のデフォルトを英語(アメリカ合衆国)として、他に日本語も登録しているアプリでシェア結果を確認します。
下の画像内のメッセージの上から順に①②③とします。

![Screenshot_20180923-181133.png](https://qiita-image-store.s3.amazonaws.com/0/266061/eeb3f374-ce16-9e51-88c7-6f1fdfe7fb33.png)

**① 端末の言語設定が日本語の場合**
`hl=ja` として URL が共有され、OGP 部分が日本語で表示されます。
端末を日本語で使っているユーザが日本語話者の友人などにシェアするパターンで見やすくなります。

**② 端末の言語設定が英語の場合**
`hl=en` として URL が共有され、OGP 部分が英語で表示されます。
端末を英語で使っているユーザが英語話者の友人などにシェアするパターンで見やすくなります。

**③ 端末の言語設定が日本語で `hl` パラメータを指定しない場合**
確認方法としては `hl` パラメータ部分を LINE 上で削除してから送信しています。
結果、OGP 部分がデフォルトの言語（このケースでは英語）で表示されます。
端末を日本語で使っているユーザが日本語話者の友人などにシェアするパターンを想定したとき、シェアされた側の受信時の印象が変わってきます。
英語に抵抗がなく普通に読めるユーザであれば問題ないですが、そうではないユーザへの対応としては言語の指定有無を検討する必要があります。
個人的には母国語で見えた方がやっぱり分かりやすいですし、設計としても親切だと思います。
ちなみに、`hl=zh` のように「ストアの掲載情報」に登録していない言語パラメータでシェアしても、OGP 部分はデフォルトの英語で表示されます。

## 補足
- アメリカ英語とイギリス英語を使い分けたい場合などは、`gl` パラメータで国も指定するといけるはずです（未検証ですが）。
- 今回の投稿内容は、母国語が異なる友人へシェアする場合などではあまり有効ではないかもしれませんが、例えば `hl=ja` としてシェアされた URL を言語設定が英語の端末でクリックすると、遷移先の Google Play Store は英語で表示され、端末の設定言語でストアの掲載情報を見ることができますので、特にデメリットはないと考えられます。
- 今回の投稿内容と直接は関係ありませんが、ビルドバリアントを使って、シェアする URL をグーグル用とアマゾン用などで使い分けるようにするとリリースしやすくなります。

## 最後に
ご意見やアドバイスなどがありましたら、コメントいただけると嬉しいです！
AWS CLIでアカウント切り替え

AWS CLIを複数のアカウントで使い分ける場合。

参考にさせていただいた記事
https://qiita.com/ryuzee/items/e3ce493f132f1981f57a

## 作業

#### アカウントの設定

`--profile`のあとに登録したいアカウント名を指定する

```
$ aws configure --profile another-account
AWS Access Key ID [None]: [Access key ID]
AWS Secret Access Key [None]: [Secret access key]
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

あとはコマンド実行時に`--profile`をつければOK

```
$ aws s3 ls --profile another-account
```
書籍「PHPフレームワーク Laravel 入門」の誤り修正


## 1. SQLite の設定でエラーが発生（P182あたり）

本の通りに進めると
`Database (database/database.sqlite) does not exist. (SQL: select * from people)`
というエラーが出る。[書籍サポートサイト](https://www.shuwasystem.co.jp/support/7980html/5258.html)にこの箇所の修正が載っておりこう書いてある。

```
【誤】　DB_DATABASE=database.sqLite
【正】　DB_DATABASE=……database.sqliteのパスを指定……
```

今の版は `DB_DATABASE=database/database.sqlite` と修正済になっているのだが、それでも同じエラーが出る。


## 解決方法

SQLite 選択時は、設定ファイル .env から "他のDBでは使うが SQLite では不要な設定"をコメントアウトする。

```
# 修正前
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database/database.sqlite
DB_USERNAME=homestead
DB_PASSWORD=secret
```

```
# 修正後
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=database/database.sqlite
# DB_USERNAME=homestead
# DB_PASSWORD=secret
```

SQLite のデータベースファイルは、config/database.php で指定しており、DB_DATABASE をコメントアウトしても問題ない。(`'database' => env('DB_DATABASE', database_path('database.sqlite')),` // 環境設定の DB_DATABASE が未設定なら database/database.sqlite を設定）


### 他の解決方法（非推奨）

* database.php の上記で説明している箇所を `'database' => database_path('database.sqlite'),` に変更すればエラーは消える。しかし、後々他のデータベースに変える可能性があることを考慮すると… 却下
* teratail に [DB_DATABASE は絶対パスで指定すれば動く](https://teratail.com/questions/134630) という情報もあったが、環境で絶対パスが変わると書き換えなければならなし、サーバーと同期させる際、.env を対象から外す設定が必要になったりと複雑になって良くない… 却下


## 参考記事

* [LaravelでSQLiteを使いたい - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/39441/laravel%E3%81%A7sqlite%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84)

- - -

## 2. シーディングを実行するとエラー(P223, P286)

本の通りに進めると以下のエラーが発生しシーディングできなかった。
`ReflectionException  : Class PeopleTableSeeder does not exist`

解決方法は `composer dump-autoload` するだけ。
（仮想マシンにログインし `cd code/laravelapp/`、プロジェクトディレクトリに移動した状態でコマンド）
[公式ドキュメント](https://laravel.com/docs/5.0/migrations#running-migrations)にも書いてある。

エラーの原因は、クラスが autoload されないため。
オートロードするファイルが配列でセットされているファイル（プロジェクトルート/vendor/composer/autoload_classmap.php）を上記のコマンドで更新すること解決できる。

参考記事：[Laravelで名前空間を指定してオートロードされなかったら見る場所。 - Qiita](https://qiita.com/niiyz/items/5b83ef5255a1ec64d9d6)

- - -

## 3. よくわからないパーミッションエラー (P290)

本の通りに進めると以下のエラーが発生。
`There is no existing directory at "/Users/ユーザー名/code/laravelapp/storage/logs" and its not buildable: Permission denied`

キャッシュクリアで解決した。
下に３つ書いたが、いずれかひとつで良いはず。

`php artisan cache:clear`
`php artisan route:clear`
`php artisan config:clear`


- - -

## 4. ルーティング設定の記載忘れ？(P324)

独自にログイン処理を実装するサンプルで、ルーティング設定が飛ばされていた。
何回も出てるパターンなので端折ってあるのかも。
web.php に以下を付け足す

```
Route::get('hello/auth', 'HelloController@getAuth');
Route::post('hello/auth', 'HelloController@postAuth');
```
R言語を用いたFIRフィルタの作成

初心者向きにR言語を用いたFIRフィルターの作成方法をまとめました。基本的な流れは、前回投稿した[R言語を用いたIIRフィルターの作成](https://qiita.com/hitomecha/items/80d6e3309aa33941cb5e)とほぼ同じです。

## パッケージの準備
signal パッケージ[1]を使用し、FIRフィルターを作成します。まず、パッケージをインストールします。

```R
#signalパッケージのダウンロード
install.packages("signal")
#ライブラリーの読み込み
library("signal")
```

## 入力データの準備
入力データは10Hzと50Hzの正弦波の合成波を使用します。

```R
#入力データの作成（周波数が10Hzと50Hzのサイン波のデータの合成、サンプリング周波数：1kHz、１０秒間のデータ）
time <- seq(from=0, by=1/1000, length=10000) #時間軸
data <- sin(2*pi*10*time) + sin(2*pi*50*time)
#入力データの図示
plot(time, data, t="l", xlim=c(1, 1.5))
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/293436/ba610be0-f14a-761c-e13e-4656e1a3682c.png" width=50%>

上図より、2つの周波数の合成波になっています。また、周波数解析を行うと、

```R
data_fft <- fft(data)
data_psd <- abs(data_fft)^2
plot_fft <- seq(from=1/10000, by=1000/10000, to=500)
#入力データの周波数特性の図示
plot(plot_fft, data_psd[1:(length(data_psd)/2)], t="l", log="x", xlab="frequency (Hz)", ylab="PSD (1/Hz)")
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/293436/c415c59a-4cfa-117f-0958-da7c01fcb98d.png" width=50%>

ピークが2つ（10Hzと50Hz）になっていることがわかります。

## FIRフィルターの設計
今回はFIRフィルターを実装するために、signalパッケージのfir1()を使用します。5〜15Hzを通すバンドパスフィルターを実装します。

```R
#バンドパスフィルタの設計
#FIRフィルターの各パラメータ
fil_N <- 128 #フィルターの次数
fs <- 1000  #サンプリング周波数
fn <- fs/2  #ナイキスト周波数
fc <- c(5,15) #帯域通過周波数
fc_norm <- fc/fn  #周波数の正規化

fir_filter <- fir1(fil_N, fc_norm, type="pass")
```

fir1()では、帯域周波数をナイキスト周波数で割った正規化周波数を使います。typeは、pass, low, high, stopの指定により、様々な種類のフィルターを実装できます。

## フィルター特性の確認
```R
freqz(fir_filter, Fs=fs)  #フィルター特性の図示
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/293436/204628bc-a5d9-7a80-d73b-fc88484a268b.png" width=70%>

5〜15Hzのバンドパスフィルターを設計できました。


## 設計したフィルターを入力データに通す

```R
#設計したフィルターを入力データに適応
data_fil <- filtfilt(fir_filter, data)
```

フィルターによる位相遅れを防ぐためにfiltfilt()を使用し、順方向と逆方向の両方の処理を行うゼロ位相デジタルフィルター処理を実装します。

## フィルターを通したデータの確認

```R
#フィルターを通したデータの図示
plot(time, data_fil, t="l", xlim=c(1, 1.5))
#周波数特性の図示
data_fft <- fft(data_fil)
data_psd <- abs(data_fft)^2
plot(plot_fft, data_psd[1:(length(data_psd)/2)], t="l", log="x", xlab="frequency (Hz)", ylab="PSD (1/Hz)")
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/293436/b078c3d8-b1a3-6718-93ca-e9006517f10d.png" width=50%><img src="https://qiita-image-store.s3.amazonaws.com/0/293436/6007a42c-da36-bab5-65fc-1bb5dc442b49.png" width=50%>

フィルターにより50Hz成分がなくなりました。

### 参考文献
[1] Uwe Ligges et al. "Signal Processing", ver. 0.7-6, https://cran.r-project.org/web/packages/signal/signal.pdf, 参照July 7, 2018.
Selenium でリンクをたどる　(Golang)

GoogleChrome でリンクをたどるサンプルです。

```go:follow_link_chrome.go
// ---------------------------------------------------------------
//
//	follow_link_chrome.go
//
//					Sep/23/2018
// ---------------------------------------------------------------
package main

import (
	"github.com/sclevine/agouti"
	"fmt"
	"os"
	"log"
)

// ---------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")

	driver := agouti.ChromeDriver()
	driver.Start()
//	defer driver.Stop()
	page, _ := driver.NewPage()

	url := "https://ekzemplaro.org"
	page.Navigate(url)
	log.Printf(page.Title())
	page.Screenshot("Screenshot01.png")

	tag := page.FindByID("ekzemplaro")
	tag.Click()
	log.Printf(page.Title())
	page.Screenshot("Screenshot02.png")

	tag = page.FindByLink("English")
	tag.Click()
	log.Printf(page.Title())
	page.Screenshot("Screenshot03.png")

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

```text:Makefile
follow_link_chrome: follow_link_chrome.go
	go build follow_link_chrome.go
clean:
	rm -f follow_link_chrome
```

コンパイル

```text
$ make
go build follow_link_chrome.go
```

実行方法

```bash
export PATH=/opt/chromedriver:$PATH
./follow_link_chrome
```
最近学んだCSSメディアクエリについて

# はじめに
最近、初めてメディアクエリについて学んだことをメモとして残しておきたいと思います。

# メディアクエリについて
Webページを閲覧する際に、ユーザーはPCやスマートフォン、タブレットなど様々な端末を用いています。その際に端末に応じて、Webページ上に表示する内容を表示する必要があります。レスポンシブなWebページを作成するために、メデイアクエリが使用されます。レスポンシブなWebサイトを作成する際に使用される有名な例だと**bootstrap**が挙げられます。
![Qiita_pc.png](https://qiita-image-store.s3.amazonaws.com/0/221678/bea670d8-c90e-0774-f7dd-06833a318ce4.png)
QiitaをPCで表示した場合
![Qiita_sp.png](https://qiita-image-store.s3.amazonaws.com/0/221678/8da254c8-0c13-802a-b311-cc338f79e665.png)
Qiitaをスマートフォンで表示した場合

上記のようにPCとスマートフォンで表示した場合、それぞれのデザインが異なっています。

# レスポンシブなWebデザインとは？
メディアクエリを調べた際に、**レスポンシブなWebデザイン**と見かけることが多かったのですが、そもそもレスポンシブとは何かと疑問に思い調べました。
>「レスポンシブWebデザイン」とは、PC、タブレット、スマートフォンなど、複数の異なる画面サイズをWebサイト表示の判断基準にし、ページのレイアウト・デザインを柔軟に調整することを指します。

[必読！5分でわかるレスポンシブWebデザインまとめ](https://liginc.co.jp/designer/archives/6154)
より引用

### メリット
- 1つのHTMLファイルで、複数の端末に対応ができる
- 1つのHTMLファイルによりメンテナンスが容易になる

### デメリット
- 1つのHTMLファイルを使用するので、スマートフォンで表示されない部分も読み込まれてしまい、ページスピードが遅くなる
- 複数のデバイスに対応するために、様々なメディアクエリを記述する必要がある

# 実際に書いてみる
私が普段関わっている[あなたのマイスター](https://yourmystar.jp/)ではSassを使用しているので、Sassも同時に記述したいと思います。CSSとSassで記述の仕方はそこまで変わらないのですが、普段Sassをメインに書いている自分からすると少し混乱しました。後から、自分で見返した際にわかるようにSassも書いておきます。

```Html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>メディアクエリ練習用</title>
    <link rel="stylesheet" type="text/css" href="index.css">
  </head>
  <body>
    <p>この部分が、端末の横幅に応じて変化します！</p>
  </body>
</html>
```

```Sass:index.sass
@media screen and (mxn-width: 767px)
  p
    font-size: 16px
    color: red

@media screen and (min-width: 768px)
  p
    font-size: 32px
    color: blue
```

生成されたCSSは

```CSS:index.css
@media screen and (min-width: 767px) {
  p {
    font-size: 16px;
    color: red;
  }
}

@media screen and (max-width: 768px) {
  p {
    font-size: 32px;
    color: blue;
  }
}
```

となります。
今回はiPadを一つの基準として、iPadの横幅768pxを基準のそれ以下なら16pxで赤色の文字で表示し、768pxからは32pxで青色の文字を表示するというようにしました。

# まとめ
ちょっとしたWebページを作成したいと思った時に、PC用とスマートフォン用の2つのHTMLファイルを作成するのは手間だなと感じる時がありました。その際にメディアクエリを使用すると便利だと思います。
MacにAWS CLIをインストール

公式ドキュメントの通りに進めていきます。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-install-macos.html

## 前提条件

- macOS Sierra

## 作業

Pythonのバージョンを確認

```
$ python --version
Python 2.7.10
```

> 前提条件
> ・Python 2 バージョン 2.6.5+ または Python 3 バージョン 3.3+
> https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-install-macos.html

とのことなので大丈夫そう。

インストーラをダウンロード

```
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
```

解凍

```
$ unzip awscli-bundle.zip
```

インストール実行

```
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
```

コマンド確認

```
$ aws --version
aws-cli/1.16.19 Python/2.7.10 Darwin/16.7.0 botocore/1.12.9
```

できました。

ちなみにbrewやpipでもインストールできるみたいです。
1秒で作る量産型Proxy Server

# 挨拶
こんにちは,いかがお過ごしでしょうか.

Proxy サーバを2,3作ってからというもの,それ以降のサーバ作りがめちゃくちゃめんどくさいし嫌になったので勢い余ってProxy Serverを作るgemを作りました.([こちらから](https://github.com/100010/proproxy))
(*今んところubuntuしか対応してないです、増やすかも)

で,タイトルがかなりイキってるんですがとりあえずこれさえすりゃ一瞬でProxyサーバができるよ！

というツールなのでそれ以外の用途があったりもっと作り込みたいみたいな人にはひょっとしたら不向きかもしれません.

とにかくシンプルさと即効性を求めたGemです.

## 1秒で作るProxy Sever

```ruby
 server = Proproxy::Server.new(:ubuntu, 'xxx.xxx.xxx.xxx', 22)
 server.provision
 server.update_ip_table('yyy,yyy,yyy,yyy',zzz)
```

<b>これでProxyサーバの出来上がりです(！？)</b>

xxx.xxx.xxx.xxx にはproxyサーバにしたいサーバのIP

yyy.yyy.yyy.yyy には接続を許可するIP(wifi名とか) を入れればもうおしまいです.

zzz はport番号です,接続を許可するport番号を指定してください.


なので自分のwifiのIPとproxy serverにしたいサーバのIPさえわかれば,コピペしてenterで終わりです🎉（~~1秒は盛ったね　!~~)


# Proxy サーバ概要

![for_qiita.jpeg](https://qiita-image-store.s3.amazonaws.com/0/105153/6c4e94ae-694b-df9a-10d4-b95485058923.jpeg)

`proxy` という言葉には `代理` とかいう意味があるらしく,平たくいうとインターネットにつなぐときにIPをwifiのIPからproxy server自体のIPに変更するための踏み台サーバのことです.


基本的な用途としてはやっぱりスクレイピングやセレニウムみたいなweb driverを使ってる時のIPバンされた時の対策とかですかね.




で、結局この `Proproxy` ってナニモン？というのは以下から↓↓↓↓

# Proproxy

基本的に　`sshkit` をラップしたもので,サーバには `squid` というサーバをインストールすることだけします.

`Proproxy::Server#initiailize`を呼んだタイミングでssh接続を開始し, `Proproxy::Server#provision`でsquidをインストールします.

provisionが終わって `Proproxy::Server#update_ip_table` でipの設定をするんですが、ここでipを間違えたりportとか間違えたりすると<b>一生誰もログインできなくなります</b>,悪しからず.

最終的なconfファイルの設定とかは [5分で作るPROXYサーバー](https://qiita.com/pcnikki/items/404329f9ad9cb6e235d4) を参考にしてます.

## options
だいたい[README](https://github.com/100010/proproxy/blob/master/README.md) に書いたんですが, squidの振る舞いをローカルから操作できるようにしました.


```ruby
server.clear_squid_cache
server.stop_squid
server.start_squid
server.restart_squid
```

# 未実装なこと

## ubuntuでしか使えない
まずubuntuで `apt-get` が使えるバージョンのものしかまだ使えてません.

ほんとはCentOSとかいい感じにやってみたかったんですが,~~めんどくさくて~~まだできていません.


## 間違えて追加したIPとかは手動でしか消せない
結構これは実装しないといけないなと思いながら全く実装できてないんですが,

何せshell scriptが全然できないので部分一致の行をいい感じに削除するとかどうやったらできるんだ(vimをexecuteするしかない気がしてるけどめんどくさそう.)

## サーバの立ち上げからできたら嬉しい(かも)
個人的に DigitalOceanやVultrのVPSを使用しているんですがこれ,APIがめっちゃ充実しててかなり使いやすいです.

なので `Proproxy::VPS::DigitalOcean.create` みたいな感じでできるとひょっとして幸せかも..？

まあここはちょっとやりすぎ感もあります.

# まとめ🖋
めちゃめちゃシンプルにproxy サーバを量産したり,シンプルに作りたい人には良いのではないか？

とおもう一方でもうちょっとローカルからの操作性を重視したいなと思います.

とりあえず僕個人としては Vultr APIをたたいてサーバ作ってIP取得して, Proproxy::Server.newに渡すということでProxyサーバ作成に関しては完全自動化することができました🎉

時間があったら未実装なやりたいことをちょこちょこアプデしていけたらなと思います.
オブジェクト指向のこころー演習問題(第8部)

# 第25章: デザインパターンのおさらい
## 基礎
Q1. パターンには、実装を隠蔽するという性質を持ったものがあります。何から実装を隠蔽するのでしょうか？また、それは何と呼ばれるのでしょうか？例をあげてください。
A1. 
・対象：クライアントオブジェクト
・呼び方：カプセル化
・例：Bridgeパターンでは、Abstractionあから派生したクラスの実装方法が、クライアントから隠蔽される。

Q2. パターンによって、責務の分解についての考察が深められる例をあげてください。
A2. 
1. Decoratorパターンでは、常に必要となる責務（Concrete Component)と任意に発生する流動的な責務(Decorator)に問題領域を分解することが可能
2. Strategyパターンを考えることによって、規則を使用するオブジェクト（どの規則を使用するかに関係なく）と規則自体に問題領域を分解する。

Q3. パターンを学習する際に探すべき５つのフォースと概念を答えてください。
A3.
・このパターンが隠蔽しているのはどのような実装化？
・このパターンにはどういった共通性が存在しているか？
・このパターンにおけるオブジェクトの責務は何か？
・これらのオブジェクト間にある関係は何か？
・パターン自体は、どのようにしてコンテキストにもとづく設計を具体化しているか？

## 応用
Q1. 実装を隠蔽する価値を答えてください。
A1. クライアントオブジェクトは、現実の実装についての詳細を関知する必要がなくなり、簡単にあらたな実装を追加できるようになる。
進化的アーキテクチャはんぱない

# Big Ball of Mud

# Monolith
- 非構造化モノリス
- レイヤ化アーキテクチャ
- モジュール式モノリス
- マイクロカーネル

# EDA(Event Driven Architecture)
- Brokerパターン
- Mediatorパターン

# サービス指向アーキテクチャ
- ESB駆動SOA
- マイクロサービス
- サービスベースアーキテクチャ

# サーバーレスアーキテクチャ
ビジネスロジックとビュー本体の分離が新しい分野


# 移行のボトルネック・基準
ビジネス機能グループ
トランザクション境界
デプロイメント目標

# 直面する問題の流れ
スパゲッティコード問題
- フレームワークやライブラリの導入、正しい理解

MVC等になっていない問題
- 単一責任の原則

MVC等になっているがcontrollerやmodelが大きすぎる問題
- アーキテクチャの分離の問題

管理画面やアプリコードなど色々くっつきすぎ問題
- ビジネスロジックの分離の問題

デプロイ・スケーリング問題、主にメモリとCPU
- インフラの分離の問題

データベースへのアクセス問題、主にプロセス
- 永続化層の分離の問題


# コスト面での歴史
Unix > 言語 > ツール > フレームワーク・ライブラリ

## インフラが高価だった時代
- オープンソース言語が生まれたため拡張性は言語で担保

## インフラが高価ではなくなった
- 言語はシンプルに保ち、アーキテクチャで担保

# データに基づいた設計とデザインに基づいた設計
- データがどれくらい結合しているかを発見するための設計
- どのように表示させたいかをもとにした設計
- バリデーションをデータでかけるかデザインでかけるか

# 結合をどのように定義するか、そもそもキーが必要なのか
## 表示方法
検索(必要なくなってきた)
比較(必要なし)
メモ化(ローカルストレージ)(場合による)
永続化(リモートストレージ)(場合による)
通知(必要なし)
取引(必要なし)

## キーの２つの役割
- IDentifier
- 検索

# リストでの表示と単一での表示(REST)
## リストでの表示
- ランキング
- 相関関係
- 関連

## 単一での表示
- 何らかのIDでの表示
- もっとも当てはまると思われるものの表示

# ステートレス・ステートフル
状態とはなんであるか
ステートレスでないと理解が難しい理由
本質的にステートフルな要素は時間

# 時間が関係する要素をどのように表現するか

# トランザクションが発生するかどうか
トランザクションとはステートの遷移の表現でもあり、究極的には時間によるデータの変化

# サーバーレスが向いているもの向いていないもの
## サーバーレスが向いている
記事の表示
検索
比較
永続化
- 記事サイト
- 比較サイト

## サーバーレスが向いていない
取引
時間が関連するデータを扱うもの?
- 予約サイト

## グラフデータベース
ビジネスロジック==リレーション
有用なデータ==リレーション
に限りなく近づいていく
データ自体はストレージや構造化されたデータとして保存してあればよい。
構造化されたデータもしく、限られた時間内に検索されたクラスタの意味の結びつきを表現するために、グラフさえあればよい。

そうするとスキーマの変更が比較的無制限に出来る。条件に合わないデータを除外する処理をいれればよい。
データが追加されるたびに、グラフが更新される。
インサートは考慮するべきトランザクションが減り、並行性が高くなる。
検索は逆に並行性が低くなる。

Neo4jが有名
Lightsail×WordPressでHTTPSにリダイレクト

httpをhttpsにリダイレクトさせるいつものやつです。

どうやらロードバランサーを通す場合はいつものリダイレクトの設定と少し書き方が違うみたいで少しハマりました。

参考にさせていただいた記事
https://qiita.com/foursue/items/58e74c4a8c946dd49e12

## 前提

- インスタンス作成済み（WordPress）
- ロードバランサー導入済み
- SSL導入済み

## 作業

設定ファイルにリダイレクトの設定を追記

```
$ vim /opt/bitnami/apps/wordpress/conf/httpd-prefix.conf
```

```conf:httpd-prefix.conf
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

Apacheを再起動

```
$ sudo /opt/bitnami/ctlscript.sh restart apache
```

これでできました。

Lightsail、ポチポチするだけで爆速でサーバーができました！かなりいい感じです。

次はスナップショットの自動取得をやりたいです。

## 追記

WordPressの管理画面に入れなかったです（泣）
ロードバランサを使う際にはWordPress側の設定が必要でした。

設定ファイルを開きます

```
$ vim /opt/bitnami/apps/wordpress/htdocs/wp-config.php
```

これを`require_once `の直前に入れたらうまくいきました。

```php:wp-config.php
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS'] = 'on';
```

参考URL
https://codex.wordpress.org/Function_Reference/is_ssl
オブジェクト指向のこころー演習問題(第７部）

# 第20章:生成に関するパターンから得られる教訓
## 基礎
Q1. 「ファクトリ」を定義してください。
A1. 他のオブジェクトを実体化するために使用される、メソッド、オブジェクトなど。

Q2. 以前の章で解説したファクトリパターンの名前を答えてください。この章で言及したファクトリパターンの名前を答えてください。
A2. 前の章：Abstract Factoryパターン、この章：Builderパターン、Factory Methodパターン、Prototypeパターン、Singletonパターン

Q3. オブジェクトの生成、管理が必要となった際に使用する一般規則を答えてください
A3. オブジェクトは、他のオブジェクトを生成および/あるいは管理するか、ほかのオブジェクトを使用するかのどちらかのみを行い、双方を行ってはいけない。

## 応用
Q1. オブジェクト指向プログラミングを初めて間もない開発者は、オブジェクトの生成管理とオブジェクトの実体化をごちゃまぜにして考えがちです。これによって生み出される問題を答えてください。
A1. どのオブジェクトを生成するのか、生成パラメータは何か、生成後はどうやってしようするのか、複数のオブジェクトをどうやって管理するのかを関知する必要が出てくる。そのため、凝集度が低下する

Q2. ファクトリによって凝集度が高くなります。その理由を答えてください。
A2. ファクトリを用いない場合を考える。この場合、状況毎に、コードの機能と、どのオブジェクトを実体化及び管理するかという規則をまとめて扱わなければならなくなる。これらを分離することによって、特定クラス内ではどちらか一方を扱えば済むようになる。

Q3. ファクトリによってテスティングの効率が改善されます。それは、どういった場合でしょうか？
A3. 使用側は派生クラスに関係なくテストでき、ファクトリ側
は派生クラス毎に独立してテストできる場合？

# 第21章: SingletonパターンとDouble-Checked Lockingパターン
## 基礎
Q1. Singletonとは、どういったタイプのパターンなのでしょうか？パターンの分類では、どのカテゴリに属するのでしょうか？
A1. 生成に関するパターン。特定クラスのオブジェクトを１つだけ実体化したい場合に使用する。

Q2. Singletonパターンの目的を答えてください。
A2. オブジェクトを１つだけ欲しいものの、そういったオブジェクトの実体化を制御するような大域的なオブジェクトが存在しない。また、このオブジェクトの同一インスタンスを、すべての実体間で参照を引き回すことなく使用させたい。

Q3. Singletonの責務は、いくつのオブジェクトを生成することでしょうか？
A3. 1つだけ

Q4. Singletonは、オブジェクトを生成するための特殊なメソッドを使用します。このメソッドの特殊な点を解説してください。
A4. 
1. メソッドが呼び出されたとき、オブジェクトがすでに実体化されているかどうかをチェックする。
2. コンストラクタをprotectedかprivateで宣言

Q5. SingletonパターンとDouble-Checked Lockingパターンは、どのようにして使い分けるのでしょうか？
A5.マルチスレッドアプリケーションの場合に、Double-Checked Lockingパターンを使用する。

## 応用
Q1. オブジェクトを１つだけ実体化させるという責務は、該当オブジェクト以外のオブジェクトに課した方がよいのでしょうか？その答えと理由を述べてください。
A1.
該当オブジェクトに課した方がよい。そうしないと、オブジェクトを管理するためのオブジェクトが必要となる。 

# 第22章: Object Poolパターン
## 基礎
Q1. 設計時に従うべき、一般的な３つの戦略とは何でしょうか？
A1. 
1. 自分の本能に注意を支払う
2. 自分自身（システム自身）システム変更の影響からシールドする
3. クライアントコードから切り離す（最も重要な問題に集中できるようになる）

Q2. Object Poolパターンに組み込まれている２つのパターンとは何でしょうか？
A2.
1. Singletonパターン
2. Objectの生成と管理をするfactoryパターン

Q3. Object Poolパターンの目的は何でしょうか？
A3. オブジェクトの生成が高価なものであるか、生成可能なオブジェクト総数が制限されている際に、オブジェクトの再利用を管理する

## 応用
Q1. エクストリームプログラミングのコミュニティで使われているYAGNIという言葉の意味を答えてください
A1. YANGIはYa ain't gonna need itの略で、訳すと、「そんな機能必要にならないって」ということ。今必要なものだけを
開発し、それ以外は無視スべきであるという考え方。

# 第23章: Factory Methodパターン
## 基礎
Q1. ファクトリの責務とは何でしょうか？
A1. オブジェクトの生成及び管理

Q2. Factory Methodパターンを使用する本質的な理由とは何でしょうか
A2. クラスは実体化に関する決定をサブクラスの実装時まで保留するため。これを行う要因としては、責務をクライアントに持たせないようにするなどがある。

Q3. Factory Methodパターンは、主要なオブジェクト指向言語でも使用されています。Java, C# C++ではどのような形で使用されているでしょうか。
A3. 
- Java：コレクションに対するiterator
- C# IEnumerableインタフェースでの、GetEnumerator
- C++ begin()、end()など

## 応用
Q1. このパターンが「factory Method」と呼ばれているのはなぜでしょうか
A1. 生成という責務の割当を支援するパターンであるため

Q2. Factory Methodパターンは、他のファクトリとどのように連携するのでしょうか？
A2. 抽象クラス内に定義した各メソッドを派生クラス内でオーバーライドする

Q3. GoFはFactory Methodの目的を「オブジェクト生成用のインタフェースを定義するものの、実体化するクラスの決定はサブクラスに任せる」と述べています。なぜこれが重要となるのでしょうか？
A3.　ファクトリの利点（テスティングの効率改善、凝集度の向上、結合度の低下、カプセル化、関心事項の分離）を実現できるため。
Railsアプリをherokuにデプロイできない。

railsで構築したアプリをherokuへデプロイする際にハマりました。
時間がかかったものの、なんとか解決したので、共有のため投稿します。

##事象：マニュアルに従ってもデプロイ不可

下記手順を実行してもデプロイがうまくいかない。

1. heroku Toolbeltをダウンロード
2. heroku側にアプリ作成
3. コマンド実行
 - $ git add .
 - $ git commit -am "make it better"
 - $ git push heroku master
4. エラー発生

```
	・・・
	remote: 	from /app/tmp/buildpacks/・・・/bin/support/ruby_compile:15:in `<main>'
	remote:  !     Push rejected, failed to compile Ruby app.
	remote: 
	remote:  !     Push failed
	remote: Verifying deploy...
	remote: 
	remote: !	Push rejected to アプリ名.
	remote: 
	To https://git.heroku.com/アプリ名.git
	 ! [remote rejected] master -> master (pre-receive hook declined)
	error: failed to push some refs to 'https://git.heroku.com/アプリ名.git'
```

##原因：assetsファイルのプリコンパイル

assetsのプリコンパイル部分でコケている模様。
ローカルでプリコンパイルし、gitへ追加、その上でpusuすると、無事デプロイされました。

 - $ RAILS_ENV=production bundle exec rake assets:precompile
 - $ git add .
 - $ git commit -am "make it better"
 - $ git push heroku master

　参考：https://stackoverflow.com/questions/36394297/heroku-push-error-could-not-detect-rake-tasks

・・・同じ事象で苦しむ貴方へ届きますよう。。。