OmniAICreator/Qiita-1.07M huggingface dataset:
Angular に Font Awesome を導入してモダンなアイコンを入れる

## 概要

ボタンとか画面で使用するアイコンを入れたい。。。と思った時に [Font Awesome](https://fontawesome.com) というパッケージを入れる時の備忘録。

### 前提条件

- Angular のバージョン： 7.0.1
- 導入する Font Awesome のバージョン： 5.6.3

## 手順

### インストール

```bash
npm i -D @fortawesome/fontawesome-free
```

### angular.json に追記

```json-doc
{
...
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
...
            "styles": [
              "client/styles.scss",
              // 追加
              "node_modules/@fortawesome/fontawesome-free/css/all.min.css"
            ],
            "scripts": [
              // 追加
              "node_modules/@fortawesome/fontawesome-free/js/all.min.js"
            ]
          },

...

        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
...
            "styles": [
              "client/styles.scss",
              // 追加
              "node_modules/@fortawesome/fontawesome-free/css/all.min.css"
            ],
            "scripts": [
              // 追加
              "node_modules/@fortawesome/fontawesome-free/js/all.min.js"
            ],
...
        },

...

}
```

上記は、Angular7 の場合の記載。
Angular6 以前の場合は、`"../node_modules/bootstrap/dist/css/bootstrap.min.css"` のように `../` が先頭に付く。（変更箇所は一緒）

### 使い方

こんな感じでアイコンは使用する。試しに Angular ロゴのフォントを使用。

```html
<i class="fab fa-angular"></i>
```

画面で見てみると、出た。

<img width="753" alt="スクリーンショット 2019-01-06 21.13.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/509ca9e4-0632-a79b-ce58-a15f01285c35.png">


以上で導入完了。
あとは公式の「[アイコン一覧](https://fontawesome.com/icons?d=gallery)」を見て好きなの使う。
WordPressをSSL化で無限ループしたときの対処法

WordPressのURLをhttpからhttpsに変更するときにハマったので、対処法をメモ

## 無限ループの原因

下記のような構成の場合、 ALBからEC2へは「HTTP」になっているため
wordpressをSSL化（httpからhttpsへリダイレクト)をすると無限ループになってしまいます。
![Untitled Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/6568/a8ef8da0-552d-5c2d-6d44-e3882900e48a.png)


※ 自分は、KUSANAGIを使っていて `https redirect` コマンドで、この状態になりました。

## nginxの設定変更
ALBを経由した場合、ユーザが使用したプロトコル (http か https)は、 X-Forwarded-Protoヘッダーに格納されています。
これを見てユーザがhttpでアクセスした時だけリダイレクトするように、設定ファイルを変更します。

```sl:/etc/nginx/conf.d/XXXX_http.conf
server {
・・・
  # この部分でリダイレクト判定
  if ($http_x_forwarded_proto = 'http'){
    return 301 https://$host$request_uri;
  }
・・・
}
```

## WordPressの設定変更
WordPressもユーザが使用したプロトコルを元に判断するように、wp-config.phpに下記を追加します。

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



nginxとwordpressの設定を変更したあと、
wordpressのURLを http→httpsに変更すれば、無限ループにならずに変更できました。
Raspberry Pi 3 Model b+ に Intel Movidius でTensorFlowの物体検出モデルを動かす

### はじめに
仕事の都合で、ラズパイ上で物体検出モデルを動かす必要性が出てきました
そこで、冬休みの宿題という感覚で、物体検出モデルを動かしてみた内容の覚書です

### ラズパイの購入
[RSオンラインのAI set]
(https://jp.rs-online.com/web/p/processor-microcontroller-development-kits/2552222583/?intcmp=JP-WEB-_-Pi-_-Dec-18-_-ai_set)

上記サイトのAI setを購入しました
説明書的なものはなく、セッティング方法は自分でググれというスタンスのようです
なお、ラズパイのケースは別で買わないといけないのかもと買ってから思い焦りましたが、ディスプレイの基盤の上につけるので不要でした

また、有線キーボードも購入しました.

### タッチパネルディスプレイとラズパイの接続

タッチパネルとラズパイを接続する手順は、以下のサイトを参考にしました。
https://raspberry-pi.ksyic.com/page/page/pgp.id/4

無事に接続が完了したところで、電源を入れてみると、タッチパネルが上下逆に映ってました。それを修正する方法については、以下のサイトを参考にしました
http://xn--r9j1d0b6i8jx814a8sl.com/raspberry-pi-3-how-to-setup/#i-5

実は、リボンケーブルなるものもこれまで触ったことがない人間です。そこで、初歩的なミスをしないように以下のサイトで取り付け方を参考にしました
https://studio.beatnix.co.jp/kids-it/hardware/raspberry_pi/7inch-touch-screen-display/

なお、上のサイトでは、ディスプレイのフレームはラズパイを取り付ける前に付けておかないとダメと書いてますが、私が購入したRSオンラインのディスプレイは、ラズパイを取り付けた後でフレームを取り付けるのが正解でした

### ヒートシンクの取り付け

以下のサイトを参考にして、Wi-FiとSOCに取り付けました
https://www.kabegiwablog.com/entry/2017/08/29/222553

### 専用カメラモジュールの接続

ラズパイの専用カメラモジュールを取り付ける方法に関しては、以下のサイトを参考にしました
https://raspi-wannabe.com/digital-camera/

また、以下のサイトの「4.準備」に記載されたモジュールのインストール部分も参考にしました
このモジュールを入れることで、専用カメラモジュールがWEBカメラと同様の扱いになるようです(適当な認識…)
https://hakengineer.xyz/2018/03/03/post-1056/


### 物体検出モデル利用するための準備
Tensorflowのモデルを動かすための準備として、以下を行いました

1. Tensorflow, OpenCVのインストール
2. Movidius SDKのインストール

下のサイトにおけるKerasのインストール以外の記載を参考にしました
https://karaage.hatenadiary.jp/entry/2018/05/23/073000

下のサイトも参考にしました
ただ、ncappzooについては途中でエラーでつまづくので放置してます
https://kokensha.xyz/ai/how-to-run-movidius-example-code-on-raspberrypi-3b-plus/

なお、Tensorflowのインストールについては、公式チュートリアルを見ておいたほうがいいと思います
https://www.tensorflow.org/install/

### 物体検出モデルの実行

サンプルは以下のリポジトリを使わせていただきました
ラズパイ上にcloneし、MobileNet-SSDのサンプルを実行することができました

なお、インストールしたncsdkがv1の場合、tag v1.0を使う必要があります
私はncsdkのv1をインストールしたのに、v2版のコードをcloneしてしまい、「mvnc.SetGlobalOption」の記載がv1とv2で違うというエラーに引っかかってしまいました

https://github.com/PINTO0309/MobileNet-SSD/tree/v1.0

追記：55,6行目のwindowWidth、windowHeightの値を変更しないと私の環境では動きませんでした.私はそれぞれ640,480に変更しました.

以上
別のdocker-compose.yml で起動しているサービスに接続する

## やりたいこと

docker環境で開発を行っていると、docker-compose.yml で管理しているMySQLのコンテナに対して、別の docker-compose.yml で管理しているアプリから接続したくなります。

１つの docker-compose.yml で管理している MySQLのコンテナとアプリのコンテナであれば、 [`link`](http://docs.docker.jp/compose/networking.html#links) を使うことで容易に参照できます。 docker-compose.yml が分かれると別のネットワークが割り当てられるので、コンテナ内のプロセスが直接通信できません。


## TL;DR

MySQLのコンテナの `3306` ポートがホストにマッピングされているのであれば、アプリのコンテナからデフォルトゲートウェイのIPアドレスのマッピングされたポート番号に接続します。

![別のDockerコンテナに接続.png](https://qiita-image-store.s3.amazonaws.com/0/145742/b181fc03-efa7-43f2-3770-ac294f4ef5ff.png)

## アプリのコンテナのネットワークの状態を調べる

```bash
$ docker inspect app02-myapp | jq '.[0].NetworkSettings.Networks|keys'
[
  "app02_default"
]
```

接続元になるコンテナに割り当てられたネットワーク名を調べます。 `docker inspect` でコンテナ情報を取得して、 `Networks` の下にあるネットワーク名を得ます。ネットワーク名がわかったら、 `docker network inspect` でネットワークの設定を参照します。


```bash
$ docker network inspect app02_default | jq '.[0].IPAM.Config[0].Gateway'
"172.26.0.1"
```

ここで表示されたIPアドレスがクライアントアプリのデフォルトゲートウェイです。


## クライアントアプリから接続する

クライアントアプリからMySQLに接続する際に指定するホストに `172.26.0.1`を、上の図であればホストの `13306`番ポートがマッピングされているので、ポート番号に `13306` を指定して接続します。

## 忘れずに行っておくこと

コンテナで動いているMySQLは任意の接続元からの接続を受け付ける状態にしておきます。
React NativeのAndroidのビルドで本番ビルドと開発ビルドで差異のあるときへの対処法

開発ビルドでは最新のソースが反映されているのに本番ビルドでは最新のソースが反映されていないということが起きたため、その対処法をメモしておく。

## iOS


## Android

### index.android.jsがあるとき

```
cd android && ./gradlew clean && react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res && ./gradlew assembleRelease
```

### index.android.jsがないとき

```
cd android && ./gradlew clean && react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res && ./gradlew assembleRelease
```
ModuleNotFoundError: No module named 'matplotlib.finance' 対応メモ

## ModuleNotFoundError: No module named 'matplotlib.finance' が出た場合

現在では mpl_finance を使うっぽい。

```
pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
```

## ソースコード変更

変更前

```python
from matplotlib.finance import candlestick2_ohlc, volume_overlay
```

変更後

```python
from mpl_finance import candlestick2_ohlc, volume_overlay
```

## こんな風に

```python
import pandas as pd
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ohlc, volume_overlay

# 2016年上半期の日経平均のデータを読み込む
start_date = "2016-01-01"
end_date = "2016-06-30"

df = pd.DataFrame(index=pd.date_range(start_date, end_date))
df = df.join(pd.read_csv("n225.csv", index_col="Date", parse_dates=True))
df = df.dropna()

# ローソクだけをプロット
fig = plt.figure(figsize=(18, 9))
ax = plt.subplot(1, 1, 1)

# candlestick2を使って描画
candlestick2_ohlc(ax, df["Open"], df["High"], df["Low"], df["Adj Close"], width=0.9, colorup="b", colordown="r")

# 軸メモリやラベルを整える
ax.set_xticklabels([(df.index[int(x)].strftime("%Y/%M/%D") if x <= df.shape[0] else x) for x in ax.get_xticks()], rotation=90)
ax.set_xlim([0, df.shape[0]]) # 横軸の範囲はデータの個数(df.shape[0]個)までに変更しておく
ax.set_ylabel("Price")

# ローソク足をプロット
fig = plt.figure(figsize=(18, 9))
ax = plt.subplot(1, 1, 1)
candlestick2_ohlc(ax, df["Open"], df["High"], df["Low"], df["Adj Close"], width=0.9, colorup="b", colordown="r")
ax.set_xticklabels([(df.index[int(x)].strftime("%Y/%M/%D") if x <= df.shape[0] else x) for x in ax.get_xticks()], rotation=90)
ax.set_xlim([0, df.shape[0]]) # 横軸の範囲はデータの個数(df.shape[0]個)までに変更しておく
ax.set_ylabel("Price")

# ローソク足を上側75%に収める
bottom, top = ax.get_ylim()
ax.set_ylim(bottom - (top - bottom) / 4, top)


# 出来高のチャートをプロット
ax2 = ax.twinx()
volume_overlay(ax2, df["Open"], df["Adj Close"], df["Volume"], width=1, colorup="g", colordown="g")
ax2.set_xlim([0, df.shape[0]])

# 出来高チャートは下側25%に収める
ax2.set_ylim([0, df["Volume"].max() * 4])
ax2.set_ylabel("Volume")
```

![スクリーンショット 2019-01-06 21.13.22.png](https://qiita-image-store.s3.amazonaws.com/0/266239/90fb3275-5bd4-34e9-dbb7-c3a30a81b454.png)

![スクリーンショット 2019-01-06 21.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/266239/160e9178-85f3-b361-c5fa-1632b50819a7.png)
テストエンジニアやめました。

###はじめに
2018年が終わりました。昨年の私のキャリアの中でもっとも大きな出来事は「転職をしたこと」、特に「テストエンジニア」から、過去に就業していた「開発エンジニア」に戻ることにしたことでした。
年末年始で時間があるので、振り返りもかねて記載しておきます。ポエムですがご容赦ください。
###私のバックグラウンド
新卒以来十数年、Javaでのシステム開発をしていました。要件定義、設計、実装、テストもろもろほぼ工程全体の経験を積み、プロジェクトで開発リーダーをするようになっていました。
スキルもそれなりに身につけたつもりでしたが、他の工程に比べてテストに関してはトラブルが多くなかなか上手く遂行できませんでした。それをきっかけにJaSSTに行ったり、参考文献にされている技術書を読むようになり、2015年に
**「ソフトウェアテストにもっと本格的に携わりたい」**
と思い立ち、ソフトウェアテスト(第三者検証)専門の会社に中途入社し、2018年夏まで、テストエンジニアとして勤務しておりました。
###結論を先に書くと
テストエンジニアからキャリアチェンジをすることになった最大の原因は
**「私にはテストエンジニアが合わなかった」**
**「テストエンジニアになったらテストに関わる機会が減った」**
と言うことに尽きました。相性の問題なので解決に感情面での負荷が想定され、そんなことをしてまでテストエンジニアを続ける意味を感じなかったので、もともとやっていた開発のエンジニアに戻ることにしました。
なお、客観的に見てどちらに優劣があるわけではなく、また私の経験や就業内容がすべてのテストエンジニアに当てはまるわけでもありません。もっと違う形でテストに携わっているエンジニアもいらっしゃると思います。飽くまで、私個人の話です。
###テストエンジニアを経験してよかった点
####知識やスキルを得られたこと
ソフトウェアテストに関しては「さすが専門会社」と言うようなスキルや知識を得ることも出来ました。オールペア法や観点表に基づくテスト設計などは書籍で読んだことはあっても業務で実践する機会はなかったので、実際に使ってみた際の効果の高さ、コツ、逆に扱いづらい点などを身を以て体験できました。テストエンジニアではなくてもソフトウェア開発、保守に関わるのにこうしたスキルや知識はとても有益でした。
####スキルの高いテストエンジニアのいるプロジェクトで仕事が出来たこと
それまでの職務では存在しなかった「テストマネージャ」と言う人と仕事をする機会も得られました。また、専門会社と言うことでエンジニアのテスト遂行、設計、実行のスキルもそれまで携わった会社の中では抜群に高く、「社内標準」とされているテスト設計技法もとても高度なものでした。勉強会やノウハウ、スキルの共有を目的にした発表会のようなものも頻繁に開催されていました。
###テストエンジニアをやめることにした理由
####主体的にソフトウェア開発に携わることが出来なくなったこと
第三者検証では他者(顧客)のソフトウェアの検証を行うことになります。特に私はSES(準委任契約下の客先常駐作業)でテストに携わっていたので、基本的に勤務先は客先で、客先のプロジェクトに単独[^1]もしくは数名の同僚と共に携わることになります。そう言った環境では弊社[^2]の流儀や技法より、顧客側で整えた様式、工程、事情が優先されるので、**弊社に優れた技法があっても適用できる機会は限られていました。**
また先述の通り私は小さなプロジェクトながらも上流も実装も経験があり、渡された設計書や要件定義書の疑問点や不明瞭点、その時点で明らかな不具合について指摘することもありました。ですが、(私の参加したプロジェクトの特性かも知れませんが)SESのテストエンジニアの立場では他工程の欠陥に起因する指摘を歓迎されない傾向がありました。端的に言うと
**「元請けの正社員で判断します」
「テストに専念してください」
「分かりました確認します(解決するとはいっていない)」**
と言うことです。大規模プロジェクトで分業を徹底するとそうなるのは理解できますが、特にマネジメントやリーダーのスキルが高くない状況でそうなると、**「前工程で無視された指摘をテスト工程で改めて大量に指摘し、テストのスケジュールが逼迫する」**と言う、何とも無駄な感のある状況になります。もともと開発リーダーで工程全体に目を配るのが職務だったのもあり、この状況が私にはかなりのストレスになりました。(優秀なテストマネージャーがいるとこういう状況にもならないのかもしれませんが)
####会社から求められるスキルが自分の身につけたいスキルと異なっていたこと
先述のような点から最初の転職のきっかけになった「テスト工程の遂行能力不足」を解決出来ず、テストスキルが向上している実感がない状態だったのですが、弊社から私に求められるスキルは大きく分類して
* 弊社のメンバーとして勤務している協力会社社員のとりまとめ、リーダーをすること
* 担当範囲や派閥の縦割り構造になった顧客の間を取り持ち、顧客の業務やソフトウェアの流儀を身につけながらプロジェクトの潤滑油となること
の２つでした。
前者に関しては１社目の時代から多重請負(SESなので厳密には違いますが)にあまりいい印象がなかったので、それを会社から求められることには少なからぬ反発がありました。さらに、こういうスキルを求めてくる割にはテストスキル以外のスキルの習得には不熱心で
「リーダー任務を目標にするからにはリーダーシップ研修とか行かせてもらえるのか」
と尋ねると、答えはノーでした。
また後者に関しては、確かにテストエンジニアはテスト設計のために開発エンジニアに仕様や要件を聞いて回る事が多いので、コネを作って情報を集めるのは確かに便利なスキルではあるのですが・・・それをメインスキルにされるのはどうも釈然としません。**開発エンジニアが仕様書その他のドキュメントを十分に書けるような体制を築けばいいだけでは？**と言う疑念がどうにも払拭できず、かといってSESの立場ではそんな提案も受け容れられず、
「それなら開発に戻ってそういう開発チームが作れるようになろう」
と言う結論に至りました。
###最後に
上記のような点は既に私以外からも指摘されている点もあり、弊社内でも「テストエンジニアの視点を上流工程に組み込むような体制作り」などに取り組んでいたそうです。また繰り返しになりますが、私のような働き方や状況がテストエンジニアすべてに適用されるわけではなく、退職する際に社内でのキャリアプランの変更や担当顧客の変更なども提案されましたが、SESで自社を離れているのが長かったため他の業務と言われても「よく知らない」「今更」な感覚が払拭できませんでした。
現在では以前と同じように開発工程全体が担当となりましたが、以前よりもテスト体制やテスト設計書のフォーマットの検討、テスト計画をする機会が多くなりました。そういったところで前職での経験と知識はとても役立っていますし、いい経験が出来たと思っています。
[^1]: 厚生労働省ガイドラインによると単独SESは偽装請負に当たるそうです。https://www.mhlw.go.jp/file/06-Seisakujouhou-11600000-Shokugyouanteikyoku/0000078287.pdf
[^2]: 既に退職している会社のことですが、わかりやすいかと思って「弊社」と記載しています。
goで継承っぽいことをする

goで継承っぽいことをやってみました。

# 作った例
MenとWomenは共通のプロパティとしてnameを持っており、共通のメソッドとしてWalk()を持つ。
また、MenはPower()メソッド、WomenはCook()メソッドをもつ。

ポイントとしてはMenとWomenの構造体が

- プロパティのベースとなるHuman構造体
- Men,Womenの振る舞いを定義したインタフェース

を含むようにして、継承っぽい雰囲気にしています。

```golang
package main

import "fmt"

type Human struct {
	name string
}

type Men struct {
	Human
	IMen
}

type Women struct {
	Human
	IWomen
}

type IHuman interface {
	Walk()
}

type IMen interface {
	IHuman
	Power()
}

type IWomen interface {
	IHuman
	Cook()
}

func (m *Men) Walk() {
	fmt.Printf("%vはてくてく歩く\n", m.name)
}

func (w *Women) Walk() {
	fmt.Printf("%vはてくてく歩く\n", w.name)
}

func (m *Men) Power() {
	fmt.Printf("%vは力持ち\n", m.name)
}

func (w *Women) Cook() {
	fmt.Printf("%vは料理上手\n", w.name)
}

func main() {
	takeshi := &Men{Human: Human{name: "takeshi"}}
	kasumi := &Women{Human: Human{name: "kasumi"}}

	takeshi.Walk()
	takeshi.Power()
	kasumi.Walk()
	kasumi.Cook()
}

// 結果
// takeshiはてくてく歩く
// takeshiは力持ち
// kasumiはてくてく歩く
// kasumiは料理上手

```

# 最後に
最近goを勉強し始めたばかりなので、上記のようなコードの場合、本来goならこう書くべき！みたいなのがあれば教えて欲しいです！
[python] Firebase Realtime Databaseのはじめ方

#Firebase Realtime Database とは
Googleの説明を引用します。無料枠があり、簡単に利用できるDBの一つです。
>Firebase Realtime Database は、リアルタイムにデータを保存およびユーザー間で同期できる、クラウドホスト型 NoSQL データベースです。 新機能: Cloud Firestore（ベータ版）を使用すると、グローバルなスケールでアプリデータを保存、同期、照会することができます。
https://firebase.google.com/docs/database/?hl=ja

#install
以下のコマンドで、firebase-adminをインストールします。

```
＄ pip3 install firebase-admin
```

#ルールを以下の用に変更する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/22472e38-9228-a59c-c067-963dc21efe17.png)


```
{
  "rules": {
      ".read": true,
      ".write": true
  }
}
```

#Firebaseにアクセスする
以下のコードでアクセスし、データを追加・参照することができます。

```firebase.py
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db

cred = credentials.Certificate('./<your service account json>')

firebase_admin.initialize_app(cred, {
    'databaseURL': 'https://<your database url>',
    'databaseAuthVariableOverride': {
        'uid': 'my-service-worker'
    }
})

##databaseに初期データを追加する
users_ref = db.reference('/users')

users_ref.set({
    'user001': {
        'date_of_birth': 'June 23, 1984',
        'full_name': 'Sazae Isono'
        },
    'user002': {
        'date_of_birth': 'December 9, 1995',
        'full_name': 'Tama Isono'
        }
    })

# databaseにデータを追加する
users_ref.child('user003').set({
    'date_of_birth': 'Aug 23, 1980',
    'full_name': 'Masuo Isono'
    })

##データを取得する
print(users_ref.get())
```
これを実行すると以下のようにデータが保管されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/4d9ed629-caae-6103-7687-bb07083addbb.png)



#一部データのみ更新する
データを保存後に一部のデータのみ更新したい場合があると思います。
例えば以下のようなケースです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/0b49e74b-d16d-8794-d8e0-166e741db3ac.png)

そのような場合はUPDATE関数を使って上記の図のような結果になるように更新することができます。

```firebase.py

##データを更新する
updates = {}
updates['/user001/full_name'] = 'Sazae Fuguta'
users_ref.update(updates)
```


#HerokuにデプロイしたPython3からFirebaseにアクセスするには

```pip freeze```を行い、必要なモジュールをrequirements.txt化して、Heroku側に教えて上げてくださいね。

```terminal

# インストール済みのpackage情報をrequirements.txtに保存
$ pip freeze > requrements.txt
```



#参考URL　

- [python3でfirebaseのRealtime Databaseを使う](https://mitubaex.hatenablog.com/entry/2018/02/11/151543)
- [初心者がHerokuにDjangoアプリをデプロイする方法](https://qiita.com/terappy/items/803ff638d63b3dc09ada)
[Rails5] .where like〜で「あいまいに（＝部分一致で）」検索ができなかったってだけの記事

本日、「.where like〜」を使ってあいまい検索（部分一致）をする必要がありましたが、
書き方間違えてエラーになりましたっていう記事です。
<br>

# 検索対象が１つのとき

`@p.variant_images.where("attachment_file_name like ?", "red")`

→Rails「ブッブーーーー！！！！」
<br>
<b>`@p.variant_images.where("attachment_file_name like ?", "%red%")`</b>

→Rails「ピンポーン！！」
<br>
※文字redの前後に「％」をつけただけ
<br>
#検索対象が複数のとき

`@p.variant_images.where("attachment_file_name like ? and not like ?", "%red%", "%back%")`

→Rails「ブッブー！！！！！」
<br>
<b>`@p.variant_images.where("attachment_file_name like ? and
attachment_file_name not like ?", "%red%", "%back%")`</b>

→Rails「ピンポーン！！」
<br>
※andのあとの「attachment_file_name」の省略をやめただけ
<br>
<br>
検索バーの実装をしていたわけではないですが、それでも検索ワードを％％で囲む必要はあるそうです。
正規表現っぽいですね。
<br>
<br>
おわり
<br>
<br>
helm-importプラグイン作った

Chart Repositoryの公開されていないHelm Chartに稀によく遭遇するので、そういったChartをローカルリポジトリに取り込むためのhelm-importプラグインを作りました。

[GitHub - k-kinzal/helm-import: Import Helm Chart where only public code into local repository.](https://github.com/k-kinzal/helm-import)

とりあえずtgzもしくはGitHubリポジトリで公開されているChartをローカルリポジトリに取り込むことができます。

```bash
$ helm import https://github.com/helm/charts/tree/master/stable/acs-engine-autoscaler
$ helm serve &
$ helm search local
NAME                             	CHART VERSION	APP VERSION	DESCRIPTION                                                 
local/acs-engine-autoscaler      	2.2.2        	2.1.1      	DEPRECATED Scales worker nodes within agent pool
```

まぁリリースのときに自前で`git clone`すれば良い話ではあるのですが、例えばhelmfileでChartを管理するときに毎回処理を書くのが面倒臭いのでそういうときにちょうど良いです。

```yaml
releases:
  - name: acs-engine-autoscaler
    namespace: acs-engine-autoscaler
    chart: "{{ exec "helm" (list "home") | trim }}/repository/local/acs-engine-autoscaler-2.2.2.tgz"
    values:
    - values/values.yaml.gotmpl
    hooks:
    - events:
      - prepare
      command: helm
      args:
      - import
      - https://github.com/helm/charts/tree/master/stable/acs-engine-autoscale
```

helmfileで使うときはこんな感じ。
本当は`helm serve`を使いたかったのですがhelmfileの問題なのかうまく動作しないのでtgzを直指定しています。（もしくはhelmfileの実行前に`helm serve`使うとシンプルになります）
過去に取り込んだChartを永続化する場合CIサーバーとかで`$HELM_HOME/repository/local`を永続化すれば溜め込んでいくことができると思います。


余談ですが、これは元々atlantisとかalb-ingress-controllerのChartを取り込むために作成しました。
が、気がついたらどちらも公式のhelm/chartに取り込まれてて作る必要なかった！！！という感じでとても悔しい気持ちです。
公式に入ってChart Repository経由で扱えるのは良いことなんですけどね！本当に便利になるので良いことなんですけどね！！！
「Unity 3D」: 「Rigid Body」と「Collider」を使う例

:sparkles:この学期に「Unity3D」でゲーム開発を勉強しています。この作文は「３Dゲームの開発」について学んだ言葉を書きます。特に基本的な「Unity」の物理です。

この作文は完璧なガイドじゃなくて、「奥タワー」というモションセンサーを使うタワーディフェンスゲームの開発の時に、理解の概要です。ガイドが欲しいなら、[Unity Physics Tutorial](https://unity3d.com/jp/learn/tutorials/s/physics)と[Physics Script Reference](https://docs.unity3d.com/ja/current/ScriptReference/Physics.html)を読んでください。

##序文

ゲームはリアルになるよに、ゲームの品の動くことはリアルにならなければなりません。リアルのいく物理的挙動をするには、オブジェクトがゲームの中で正しく加速したり、重力や他の力や衝突による影響を受けたりしなければなりません。Unity に組み込まれている物理エンジンは物理シミュレーションを処理するコンポーネントを提供します。

##概要

ゲームの物理について、４つの項目を説明と思います：
１）「Game Object」は何ですか？
２）「Rigid Body」は何ですか？
３）「Collider」は何ですか？
４）衝突の場合は「Game Object」の特徴の影響は何ですか？

##ゲームオブジェクト

「Game Object」はゲームの中に何も使う物です。オブジェクトは場面の品や、キャラや、武器などにられます。例えば、「奥タワー」というゲームにこの狸です。[^1]

<img width="400" alt="狸" src="https://qiita-image-store.s3.amazonaws.com/0/293083/aed3a767-48b8-35d7-6667-16b7afb92161.png">

##剛体
ゲームオブジェクトに「Rigid Body」な属性を付けることができます。もし、「Rigid Body」な属性を付けるなら、「Unity」の物理エンジンでゲームオブジェクトは物理法則に従います。

<img width="700" alt="Screen Shot 2019-01-06 at 1.05.43 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/293083/6982de81-9005-3550-96e1-9e0a9eda6651.png">

それから、ゲームオブジェクトに力は影響できます。力の例は重力です。重力を活性化するかどうかについて「Rigid Body」な属性にチェックボックスがあります。重力は下降の力だから、ボックスをチェックした時に、オブジェクトは落ちる（下降の方角は「Y軸」に「負の数」です）。

<img width="500" alt="Screen Shot 2019-01-06 at 1.05.43 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/293083/e162bcb7-cc65-13c6-8506-7d5d5d583803.gif">

##コライダー
狸は床に止まるように、「狸」と「Terrain」は、という場面の床、「Collider」の属性が必要です。「Collider」はゲームオブジェクトに追加できる属性です。そうして、ゲームオブジェクトを囲む見えない領域です。

「Collider」は色々な形があります。基本できな形は箱と玉とカプセルです。精度のために、出来るだけゲームオブジェクトの形の一番近い形を選びます。

他のゲームオブジェクトに接触による衝突の場合は「Collider」はイベントを起こします。そのままで、イベントは２つオブジェクトがお互いに突き当たる。でも、C＃のコードを入れることで、別な動くことが出来る。

##衝突の時に「Game Object」の特徴の影響

C＃コードの以外に属性を変えることでイベントを変更することができます。
３つ例を説明します。
１）「Physic Material」（コライダーの属性）：例えばつるつるな選んだマテリアルを使う時に衝突したゲームオブジェクトは他のオブジェクトをスライドします。
２）「Drag」（剛体の属性）: 「Drag」は空気抵抗らしいです。高い値はゲームオブジェクトの動くことが遅いになります。「Drag」の種類が２つあります。質素な「Drag」は直線的な動に抗う。「Angular Drag」は回すことに抗う。
３）「is Kinematic」（剛体の属性）：アクティブの時に力にゲームオブジェクトは関わないので、衝突の場合はオブジェクトを動かないです。

「Terrain」の中に貫かないのために、「狸」と「Terrain」の両方が「Collider」を追加して、「狸」の重力のチェックボックスをチェックして、「Terrain」の「is Kinematic」をチェックボックスをチェックしました。

![stay.gif](https://qiita-image-store.s3.amazonaws.com/0/293083/1d29cf53-3f15-0a56-3245-f8f99efc04fe.gif)

C＃のコードを入れて、「奥タワー」の動物の動きすることができます。

![ezgif-4-f5dfc6571ea4.gif](https://qiita-image-store.s3.amazonaws.com/0/293083/a49adc16-88ac-53a3-589d-96a11743d68d.gif)

ゲーム開発について「Unity」にたくさん物理のコンセプトがあるので、これから続けて勉強しています。:fist:

[^1]: 狸のモデル：https://free3d.com/3d-model/racoon-v1--112661.html
ユースケース駆動開発 - ドメインモデリング編

この記事は[ユースケース駆動開発実践ガイドメモ](https://qiita.com/terumichi1209/items/dce83261288b716b549b)のドメインモデリングについて記載します。

#ドメインモデルを定義する意味
ドメインモデルを繰り返し定義することで、言葉の揺れや不足しているドメインオブジェクトを抽出するのに役にたちます。

##はじめに
ドメインモデルを定義していくために、まずはサービスに対する要求を調べます。
ハンバーガーショップのデリバリーサービスを題材にします。

1. ハンバーガーショップはWebベースを予定している。
2. ハンバーガーショップは注文**を受け付け、**商品**を売ることができなければならない。
3. **ユーザ**は**商品一覧**から**ショッピングカート**に**商品**を追加、削除できなければならない。
4. **ユーザ**は**精算**前に**ショッピングカート**に**商品**がなければならない。
5. **配送**1時間前までなら、**ユーザ**は**注文**を**キャンセル**できなければならない。
6. **ユーザ**は**クレジットカード**で支払うことができなければならない。
7. **商品**のデータは**マスターデータ**から**取扱商品**を取得してそれを**商品一覧**に組み込まなければならない。
8. **商品**は**カテゴリ**別に検索できなければならない。
9. ハンバーガーショップは**ユーザ**の詳細情報(**メールアドレス、パスワード、住所**)を記録できるようにするために、**ユーザ**はログイン時に**顧客アカウント**を作成できなければならない。
10. **ユーザアカウント**は編集できなければならない。
11. **マスターデータ**は**本部の商品部門**が更新するため参照のみできる。

##ドメインモデルの抽出
題材からドメインモデルの情報源を抽出します。

``カテゴリ、クレジットカード、顧客アカウント、商品、商品一覧、住所、精算、ショッピングカート、注文、取扱商品、配送、パスワード、本部の商品部門、マスターデータ、メールアドレス、ユーザ、ユーザアカウント``

次にドメインモデルに落とし込む情報を抽出します。
アクターを判断して、この時点では不要な情報を削ります。

**アクター**
ユーザ、本部の商品部門

**重複**
顧客アカウント、ユーザアカウントのどちらを残すか決める。

**ドメインオブジェクトの整理**
メールアドレス、パスワード、住所は小さすぎる項目のため削除

抽出した結果が以下になります。
赤で記載している箇所は、抽出結果を元にステークホルダーと議論して新しく抽出されたと仮定してください。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/72433/ac02ce7b-7822-22ff-2b3b-2869a81ce80e.png)
ここでは集約関係(has-a関係)が表現されています。
この図はプロトタイプなので現時点では完全ではなく、最終的なクラス図とは異なっても問題ありません。

ここからまた議論して、下記のように洗練することもできます。
・**清算**はドメインモデルとして小さすぎるので削除
・**クレジットカード**と**注文**の間に**支払方式**を定義
・**書籍一覧**を汎化して、**推奨品リスト**と**検索結果**を定義
![Untitled (2).png](https://qiita-image-store.s3.amazonaws.com/0/72433/2724e125-bbbb-bfaf-8e2c-191e6a605a9a.png)
ここでは汎化関係(is-a関係)が追加されました。
詳細化したドメインオブジェクトを**サブクラス**、一般化したドメインオブジェクトを**スーパークラス**と呼びます。

チームが納得いくまでこの作業を続けても大丈夫ですが、本書での目安は2時間とされてます。（多分足りない。。）
先ほども記載しましたが、この工程で完璧さを求める必要はありません。

##まとめ
ドメインモデルを繰り返し定義することで、言葉の揺れや不足しているドメインオブジェクトを抽出するのに役にたちます。
logstashのelasticsearch input pluginとfilter pluginの違い

logstashにはElasticsearchのinput/filter pluginがあります。
挙動の違いを確認したので、備忘的に書きます。

# input plugin

``` logstash.conf(一部)
input {
  # Read all documents from Elasticsearch matching the given query
  elasticsearch {
    hosts => "localhost"
    query => '{ "query": { "match": { "statuscode": 200 } }, "sort": [ "_doc" ] }'
  }
}
```

サンプルとしてこういうのが公式には書かれています。

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-elasticsearch.html

これは、localhostのelasticsearchからqueryによって、200番台のdocsを取得してソースにするということです。

普通にやると1回だけですが、`Scheduling`を設定すると定期的にポーリングしてくれます。
ただし、どこまで読んだかという情報は記録しません。
ファイルの読み込みであればsincedbという名称で永続化しますが、ES inputの場合はしないようです。

そのため、クエリで絞り込みをしないと重複した内容をなんども読み込むことになります。
絞り込みをしてバッチ的に利用する、あるいはデータを一度だけ読み込むような場合に使われるかもしれません。

# filter plugin

公式にはこのようなサンプルが書かれています。

``` logstash.conf(一部)
if [type] == "end" {
      elasticsearch {
         hosts => ["es-server"] # 検索対象のESサーバ
         query_template => "template.json" # 検索クエリ
         fields => { "@timestamp" => "started" } # 検索結果をfieldに付加する
      }

      date {
         match => ["[started]", "ISO8601"]
         target => "[started]"
      }

      ruby {
         code => "event.set('duration_hrs', (event.get('@timestamp') - event.get('started')) / 3600)"
      }
}
```

``` template.json
{
  "size": 1,
  "sort" : [ { "@timestamp" : "desc" } ],
  "query": {
    "query_string": {
      "query": "type:start AND operation:%{[opid]}"
    }
  },
  "_source": ["@timestamp"]
}
```

https://www.elastic.co/guide/en/logstash/current/plugins-filters-elasticsearch.html

logstash.confには色々書いていますが、elasticsearchのpluginだけ見ましょう。
検索対象のESサーバ、クエリの書かれているjsonファイル、検索結果から付加するFieldsを設定しています。

template.jsonを見ると`"type:start AND operation:%{[opid]}" `で絞っています。これは、logstashのinputから来たopidかつ、type:start(起動時など）の条件を設定しています。

デフォルトのresult_sizeは1です。<b>Filterは、Inputからの条件を元にESのIndexから属性をもって来て付加する、という役割なように思います。</b>
おそらく、サンプルコードの結果はこんな感じになるでしょう。
（他の利用例でのfilter結果から手動で作りました。正確でない可能性があります。）

```single_result_example.json
{
        "opid" =>    "a1"
        "started" => "2019-01-01T15:05:00.562Z"
}
```

ESから帰ってくるresult_sizeを大きくした場合かつ、結果が一意に定まらない場合はこうなると思われます。

```multiple_result_example.json
{
        "opid" =>    "a1"
        "started" => [ 
        [0] "2019-01-01T15:05:00.562Z",
        [1] "2018-12-31T15:05:00.562Z",
        [2] "2018-12-30T15:05:00.562Z"
    ]
}
```

複数つくので、やや加工が大変なのと、result_sizeを無制限にするオプションは見当たらなかったので、基本的には一意に定められるような条件で設定することが必要な気がします。
PyMC3のsummaryメソッドで独自の統計値を出力する

# 動作環境
- PyMC3

# やりたいこと
PyMC3のsummaryメソッドは、以下のような統計値を出力してくれる。
- mean
- sd
- mc_error
- hpd_2.5
- hpd_97.5
- n_eff
- Rhat

大変便利な機能であるが、他の統計値（分位点など)も出力したい場合もある。

# 実現方法
統計関数を独自に定義し、summaryメソッドのstat_funcs引数に指定することで
独自の統計値を出力させることができる。

具体的な手順を以下に示す。

1. サンプル列を引数とし統計値を返却する関数を定義する

以下の例では、標準偏差と、5%, 50%, 95%の分位関数を定義している。

```
import pandas as pd
def trace_sd(x):
    return pd.Series(np.std(x, 0), name='sd')

def trace_quantiles(x):
    return pd.DataFrame(pm.quantiles(x, [5, 50, 95]))

```

2. 1で定義した関数をsummaryメソッドのstat_funcs引数に指定する


```
df = pm.summary(trace, stat_funcs=[trace_sd, trace_quantiles])
```

出力結果は以下のようになる。
![stat_func_result.png](https://qiita-image-store.s3.amazonaws.com/0/329816/21ee2e68-cd67-990d-fcdc-e246232349e4.png)

# 参考
以下のURLを参考にした。
https://docs.pymc.io/api/stats.html
楽天ブックス書籍検索APIを使用して、著書名で本を検索する(JavaScript)

## 目的
楽天ブックス書籍検索APIをたたいて、著書名からJSONデータを取得するまでの流れをまとめます。

## 実現方法・環境

- JavaScriptを使って、HTTPリクエストを送ります。

## コード
試しに、「鈴木たろう」という方の本を検索してみます。
1. 楽天ブックス書籍検索APIへアクセスするため、著書名をエンコードします。

```JavaScript
const author = encodeURI('鈴木たろう')
```
2. その後、アプリID/デベロッパーIDと組み合わせたURIを作成します。


```Javascript
const request = new XMLHttpRequest()
const author = encodeURI('鈴木たろう')
const testurl = `https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?format=json&author=${author}&applicationId=YOUR_APP_ID`

request.open('GET', testurl)
request.addEventListener('load', (event) => {
    console.log(event.target.status) //ステータスコードを返す
    console.log(event.target.responseText) //レスポンスに含まれるテキストを返す
})
request.send()
```
(アプリケーションIDがわからない方は、[ここから](https://webservice.rakuten.co.jp/app/create)IDを作成してください。楽天のアカウントがあれば、適当なサイトを登録するだけでアプリIDを取得できます。)

## コードの実行

ブラウザのコンソールにて、上記コードを実行します。
ステータスコード200と、書籍データが返ってこれば成功です！
【Python】変数の値を入れ替える

# 変数の値を入れ替える

```Python:
>>> x = 100
>>> y = 200
>>> x, y = y, x
>>> x
200
>>> y
100
```

※Python 3.7.1 で確認
※コメント頂いたのですがタイトル含め内容を更新しました（2019/01/07）
PyMC3でchain毎のサンプル列を取得する方法

# 動作環境
- PyMC3

# 課題
PyMC3で、MCMCを実行するsampleメソッドを呼び出す際に、以下のようにchainsを指定することで複数のサンプ列を取得することができる。

```
import pymc3 as pm

<略>

trace = pm.sample(2000, chains=5)
```

この場合、2000回のサンプル列が5chain分得られる。
しかしながら、各サンプル列の取得したい場合、簡単にはいかない。

例えばalphaという変数の5chain分のサンプル列を得たい場合、

```
import pymc3 as pm

<略>

trace = pm.sample(2000, chains=5)
alpha_sample = trace.get_values('alpha')
print(alpha_samples.shape)

<実行結果>
(10000,)

```

のようにMultiTraceクラスのget_valuesの引数でalphaを指定してえられるオブジェクトに対し、print(alpha_samples.shape)でその行列の形状を見ると、データ数10000(=2000x5)の一次元配列となっており、一つのデータにまとめられてしまっている。

# 解決策
get_valuesを呼び出す際にcombine=Flaseを指定することで、各chainのサンプルを
リストで取得することができる。

```
import pymc3 as pm

<略>

trace = pm.sample(2000, chains=5)
for samples in trace.get_values('alpha', combine=False):
    print(samples.shape)


<実行結果>
(2000,)
(2000,)
(2000,)
(2000,)
(2000,)

```
最速で Rails + Webpacker + React の開発環境を整える方法

Railsのプロジェクト作成から、Webpacker、Reactの最低限の設定を行ったレポジトリを作りました。
これをクローンしてサンプル通りに使えば、環境の出来上がりです。

```
git clone git@github.com:yazumoto/react-webpacker-rails.git
```
レポジトリはこれです↓
https://github.com/yazumoto/react-webpacker-rails

終わりです。

上記でクローンすると、サンプルのルートが存在するので（/sample)、それも不要な人は `clean_routes` というBranchを使ってください。

## セットアップ方法
クローンしたあと、起動するにはいくつかやることがあります。

- database.ymlを書き換える
    - ローカル環境に合わせてください
    - 必要ならignoreしてください
- `bundle install`
- `yarn install`
- `bundle exec db:create`
- (実際には不要) `app/config/application.rb` のクラス名が `ReactWebpackerRails` になっているので必要なら修正してください。 `app/views/layouts/application.html.erb` の `title` も同様です

## 起動方法

上記を実施後、

```
bundle exec rails s
# 別ターミナルで
./bin/webpack-dev-server
```

```
http://localhost:3000/sample
```
にアクセス

こんな感じになるはず。
![スクリーンショット 2019-01-06 17.40.39.png](https://qiita-image-store.s3.amazonaws.com/0/67424/04479833-3af9-acc4-84e7-80dbdc70109c.png)


# 解説

Railsをインストールして、WebpackerでReactの環境を整えています。

## やったこと一覧
- WebpackerでReactをインストール
- css moduleを使って SCSS をコードでコンポーネントごとに処理できるようにした
- コンポーネントのクラスを別ファイルに分けるサンプルコードを記載
- RailsのコントローラのデータをReactで使うサンプルコードを記載

### WebpackerでReactをインストール

`rails new` 後に、

```
bundle exec rails webpacker:install
bundle exec rails webpacker:install:react
```
を実行しました。

僕はだいたい `rails new` で `--skip-bundle` するのですが、これすると `--webpack=react` つけて `rails new` しても Reactがインストールされないんですよね。なのでだいたい後でやります。

### css module を使いたいので、SCSS をコードでコンポーネントごとに処理できるようにした

```
config/webpack/environment.js
```

を修正しています。
おまじないと思っていただければ。

### コンポーネントのクラスを別ファイルに分けるサンプルコードを記載、RailsのコントローラのデータをReactで使うサンプルコードを記載

Railsのコントローラのインスタンス変数をReact内で利用するために、 

```
app/views/sample/index.html.erb
```

で

`content_tag` を使ってデータを置いてます。

``` app/views/sample/index.html.erb
<%= content_tag(:div,
                id: "sample-data",
                data: @sample_data.to_json) do end %>
```

もっとスマートにデータを渡す方法を知りたいですね…。


また、Reactのサンプルコードについては、

```
app/javascript/packs/sample
```

ディレクトリを作ってその中にサンプルコードをおいています。
`css modules` を使ってコンポーネントごとにCSSを適用したり、一つのファイルではなく、別ファイルにコンポーネントを分けて書くサンプルです。


# 終わりに

今回は、3秒でRails+Reactの環境を整えました。

私はチーム開発で将来のことまで考えたプロジェクトの場合は、 `Rails` + `Angular` で作りますが、
小規模で個人でやる場合はこの構成でやります（楽なので）。

皆さんも、必要性に応じて考えながら技術選定をしてください。
では、楽しいRails+Reactライフを送ってください！
開発日記（２）

#2019/1/6

rubyでコマンド作りの続きをした。
とりあえず、gemspecとかを覚えた。
それで、とりあえず
1. https://qiita.com/9sako6/items/72994b8b1c00af4e61fe
2. https://qiita.com/akisame338/items/92379addeb1a17468498

を参考にしてやってみた。
コマンドをbundle exec exe/#{コマンド}をやってみた。

そこで、githubに作ったやつをあげて試しに自分のパソコンにコマンドをインストールしてみたが、かなりきつかった。

これのきつかった原因をあげると

1. 情報が乱雑していた。僕の場合は情報が乱雑しているのが苦手だ。最初にrubyをやったかと思えば、githubを学んでいたのがいけなかった。
2. 情報整理をするスパンをあけなかった。情報は整理されていたやり方のほうが疲れはたまらない。というのも、いちいちどこにどれがあるかが分かっていれば、取り出す時に楽になる

#反省

　次からは情報の整理を重点的に行うこととする。
　情報整理の方法も模索しなくてはならない。

#今日の一言

　学ぶとは、整理だ。
geth init で Failed to write genesis block: database already contains an incompatible genesis block


# 環境
geth 1.8.20-stable

# 事象と解決方法
下記のようなエラーになってしまう場合

```
$ geth --datadir ~/eth_private_net init ~/eth_private_net/myGenesis.json
（略）
Fatal: Failed to write genesis block: database already contains an incompatible genesis block
（略）
```

databaseを削除した後に init すれば良い（databaseを削除しても良いならば）。

```
$ geth removedb --datadir ~/eth_private_net
（略）
Remove this database? [y/N] y
（略）
Remove this database? [y/N] y
（略）
$ geth --datadir ~/eth_private_net init ~/eth_private_net/myGenesis.json
（略）
INFO [01-06|09:33:07.340] Successfully wrote genesis state
（略）
```

例えば、geth init の引数のjsonファイル（新しい genesis block の設定ファイル）で、"alloc" 等を編集して、再度 geth init する場合は、今回のケースに該当する。

```myGenesis.json
（略）
  "alloc": {
    "0x0cbce0f758799e2e849eb2508cc9b2dfed3a7536" : {
      "balance": "1000"
    }
  }
（略）
```

# 参考
[go-ethereum#14352 Custom Genesis file working anyone? I'm always getting "wrong genesis block in database"](https://github.com/ethereum/go-ethereum/issues/14352)
Twitterのツイートはエンジニアがよく知るツリー構造だった！ 

Twitter has Tree structure engineer knows. Study reply and understand Twitter.

Twitterのツイートはエンジニアがよく知るツリー構造だった！初心者のためのリプ講座。


# All tweets has tree structure.

最初はさっぱり仕組みがわからなかったけど、単純にツリー構造。

![image](https://user-images.githubusercontent.com/13635059/50734246-d6c31880-11df-11e9-9c02-c3bffdf6abe4.png)

# Even If you saw vertical chained proxied line but it is part of has one repeated tree

縦にチェーンがつながってる、proxy 串 みたいに見えるのは、それが直列に並んでいるのがそう見えているだけ

![image](https://user-images.githubusercontent.com/13635059/50734262-fb1ef500-11df-11e9-885c-cdb372e83e11.png)

# Reply create new tweet related with old tweet

ツイートはリプライで親から子が生まれる

![image](https://user-images.githubusercontent.com/13635059/50734285-45a07180-11e0-11e9-8e77-58aefd677b40.png)

# But when you reply to one tweet many times then tweets trees will be clustered!

ひとつのツイートに連続でリプをつけると、ツリーが分散することに‥！

![image](https://user-images.githubusercontent.com/13635059/50734287-551fba80-11e0-11e9-9f9a-7cb534dd0788.png)


# In the case you reply to "your last reply of Tweets" does not break tweets chain and make proxy vertical line

この場合は、自分の最後にリプをつけ続けることで「チェーン」を崩さず「串状態」にできる

![image](https://user-images.githubusercontent.com/13635059/50734326-e131e200-11e0-11e9-89bf-7eebc13f8e1c.png)

# But i though it is the most difficult point of twitter for tweet beginner

だがここがTwitterは初心者には難しい‥！と感じた最たる部分でもあった


![image](https://user-images.githubusercontent.com/13635059/50734402-ecd1d880-11e1-11e9-9708-cf47f854afa7.png)

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/281








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Light Shaftsでライブのライトを再現

ライブの照明、特に光の筋が見えるやつをUnityで再現したいなぁと思ってたらなんかできました。
Unity 2018.2.9f1

まず、Sample Assets for Unity 4.6をインポートします。
Unity4用に作られたものですが、インポートする際にUnity5に合わせて最適化することができるのでそうしましょう。
Light ShaftsのフォルダだけでOKです。

このままだとエラーを吐くのでコードを一行だけ変えます。
LightShafts.csの88行目の
`Application.platform == RuntimePlatform.WindowsWebPlayer`
（うろおぼえ）
を消せばライトにアタッチすることができるようになります。
Direct lightとSpotlightのみ対応しているようです。

アタッチした状態でSceneを見ても何も起きませんが、実際にGameビューで見ると光の筋が見えるようになっています。


参考元
http://mikasa.hatenablog.jp/entry/2015/05/05/125947
http://tsubakit1.hateblo.jp/entry/2014/10/01/013054
【Heroku】google-api-python-client を使用する際の注意点

## 概要
Heroku で `google-api-python-client` ライブラリを Python で使用した際につまづいたことをまとめました。

## 注意点
ここで使用している `oauth2client` ライブラリは廃止予定です。

> Note: oauth2client is now deprecated. As such, it is unlikely that we will address or respond to your issue. We recommend you use google-auth and oauthlib.

[oauth2client/.github/ISSUE_TEMPLATE.md](https://github.com/googleapis/oauth2client/blob/master/.github/ISSUE_TEMPLATE.md)

 気が向いたら修正します。

## 実行環境
- Python 3.6.5 
    - google-api-python-client==1.7.7
    - httplib2==0.12.0
    - oauth2client==4.1.3
- Heroku CLI

## 課題1：`token.json` をそのまま上げるわけにはいかない
### 解決策①：Heroku CLI で環境変数を設定
以下コマンドで、JSON ファイルを環境変数として設定できます。

```
$ heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< token.json)"
```
### 解決策②：ブラウザ上から環境変数を設定
JSON ファイルの中身をコピペします。
![スクリーンショット 2019-01-05 19.31.23.png](https://qiita-image-store.s3.amazonaws.com/0/245792/4b1150b1-7156-438c-5f86-127f41b11147.png)

どちらでも OK です。

## 課題2：環境変数をどう使うか

以下 [Google Calendar API のサンプルプログラム](https://developers.google.com/calendar/quickstart/python)の抜粋。

```python:calendar/quickstart/quickstart.py
store = file.Storage('token.json')
creds = store.get()
# 省略
service = build('calendar', 'v3', http=creds.authorize(Http()))
```
ここではローカルにある `token.json` を読み込んで、「**なにか**」してから`googleapiclient.discovery.build` に渡しています。

つまり、環境変数をそのまま渡してもうまくいきません。
環境変数に対して同じ「**なにか**」をしてあげる必要があります。

### 解決策: [ソース](https://github.com/googleapis/oauth2client) を見る
以下 [oauth2client のソースコード](https://github.com/googleapis/oauth2client/blob/master/oauth2client/file.py)抜粋。

```python:oauth2client/oauth2client/file.py
try:
    f = open(self._filename, 'rb')
    content = f.read()
    f.close()
except IOError:
    return credentials

try:
    credentials = client.Credentials.new_from_json(content)
    credentials.set_store(self)
except ValueError:
    pass
```
JSON ファイルを開いた後に、`client.Credentials.new_from_json` で処理しています。
そこで、環境変数 `GOOGLE_APPLICATION_CREDENTIALS` に対しても同じことをしてあげれば OK です。

```python

from httplib2 import Http
from oauth2client import client
from googleapiclient.discovery import build

CONTENTS = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
CREDS = client.Credentials.new_from_json(CONTENTS)
SERVICE = build('calendar', 'v3', http=CREDS.authorize(Http()))
```

`oauth2client/oauth2client/file.py` で `with`ブロックが使われていないことに違和感を感じ、いろいろ見ていたら `oauth2client` が廃止予定であることがわかりました。

## おわりに
Google API のサンプルプログラムが廃止予定の `oauth2client` で書かれていますが、現在[こちら](https://github.com/gsuitedevs/python-samples/issues/10)で issue が立っているので、そのうち修正されると思います。

## 参考資料
- [oauth2client](https://github.com/googleapis/oauth2client)
- [Using Google Cloud With Heroku](https://simpleit.rocks/apis/google-cloud/using-google-cloud-with-heroku/)
[JavaScript] スラッシュ区切りの文字列から特定の文字列のみを切り出す

URLから文字列をとりたいときに便利。（ファイル名とかディレクトリ名とか）

```js:index.js
//ex GitHubのURLからリポジトリ名をとりたいとき
const url = "https://github.com/sshono1210/gitLesson"
const arr = url.split("/") //スラッシュで分割して配列をつくる
console.log(arr.slice(-1)[0]) //リポジトリ名は一番最後のスラッシュの後にある
```

## 参考
https://www.two-ways.com/mt/usakorog/2010/05/url-1.html
https://qiita.com/kerupani129/items/64ce1e80eb8efb4c2b21
コマンドラインからDNS over HTTPSを発行する方法

# JSONを使う方法
人が目で見る場合はJSON形式が便利である。

```
#!/bin/sh

FQDN=www.yahoo.co.jp
#URI="https://cloudflare-dns.com/dns-query"
URI=https://mozilla.cloudflare-dns.com/dns-query
curl -H 'accept: application/dns-json' "$URI?name=$FQDN&type=A"
```

# バイナリパケットを使う方法
機械でする場合はバイナリの方がいいかも

```
#!/bin/bash

#----------------------------------
# ここでDNSのUDPバイナリパケットを生成する
#----------------------------------

#BASE64URL=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
#----------------------------------
# パケットをbase64urlでエンコードする
#----------------------------------

curl -H 'Content-Type:application/dns-message' https://mozilla.cloudflare-dns.com/dns-query?dns=$BASE64URL -o a
xxd a
#-----------------------------------
# 上記aに返信パケットバイナリデータが入っているのでちょっと見るためにxxdでダンプする
# 実際にはバイナリを解析する処理が必要
#-----------------------------------


```
H8/3664ではじめるマイコン制御6 押した回数を7segLEDで表示2 ダイナミック点灯

[H8/3664ではじめるマイコン制御2](https://qiita.com/kiki0817/items/2d28db186bf5cf9e2c4b)
では押した回数を一桁で表示させていましたがその表示を二桁まで拡張させたものが今回のプログラムになります。

```c:7segDisplay2.c

//ボタンの押した回数を二桁でカウントする
#include <stdio.h>　

#define	BRR		(*((unsigned char *)0xFFA9))
#define	TMA		(*((unsigned char *)0xFFA6))

#define	PMR1	(*((unsigned char *)0xFFE0))
#define	PMR5	(*((unsigned char *)0xFFE1))

#define	PCR1	(*((unsigned char *)0xFFE4))
#define	PCR5	(*((unsigned char *)0xFFE8))
#define	PCR7	(*((unsigned char *)0xFFEA))
#define	PCR8	(*((unsigned char *)0xFFEB))

#define	PDR5	(*((unsigned char *)0xFFD8))
#define	PDR7	(*((unsigned char *)0xFFDA))
int wait();

main()
   {
   unsigned char LED[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x27,0x7f,0x67};//1の位用配列
	unsigned char LED10[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfc,0xa7,0xff,0xe7};//10の位用配列
	int i,count=0,count10=0;
	
	//SWの状態記憶用
	int OldState=0;
	int State=0;
	
	BRR=12;			//16MHZ時には１２を　デフォルトは７　ボーレート変更	
 	PMR1 = 0x00;			/*ポート１を汎用ＩＯに設定*/
 	PMR5 = 0x00;			/*ポート１を汎用ＩＯに設定*/

	TMA = 0x98 ; 

 	PCR1 = 0xff;	//アドレス　FFE4
    PCR5 = 0xff;	//FFE8
    PCR7 = 0x00;	
    PCR8 = 0xff;	//FFED		//00入力　　ff出力
    
    for (;;) {/* 無限ループ */
        
        PDR5=LED[count];
        wait(500);
        PDR5=0x00;
        wait(50);
        
        PDR5=LED10[count10];
        wait(500);
        PDR5=0x00;
        wait(50);
        
       	State=0;
       	
        if((PDR7 & 0x40)==0x00)State=1;
        
        if(OldState!=State && OldState!=1){
        	if(count<9){
        		count++;
        	}
        	else{
        		count10++;
        		count=0;
        	}if(count10>=9)count10=0;
        }
        
        OldState=State;
        
    }
    return 0;
   }

int wait(int n)
{
	int i;
 	for(i=0;i<n;i++);
}
```

表示方法はダイナミック点灯です。
<details><summary>ダイナミック点灯とは</summary>点灯しているLEDを一定周波数で高速に点滅させる点灯方法です。 ... 高い周波数で点滅する間隔を短くすれば、人間の目で見た場合に残像現象によって常時点灯しているように見えます。</details>

```c
        PDR5=LED[count];
        wait(500);
        PDR5=0x00;
        wait(50);

        PDR5=LED10[count10];
        wait(500);
        PDR5=0x00;
        wait(50);
```
表示部分です。
間に0x00を挟んでいるのはゴーストを防ぐためです。
さらにwait()で表示時間を稼いでいます。

そのほか主な追加点は

```c
int OldState=0;
    int State=0;
```
にスイッチの状態を記憶させて以下のif文の条件に用いています。

```c
if(OldState!=State && OldState!=1){
```
#実行例

![93165.jpg](https://qiita-image-store.s3.amazonaws.com/0/333756/faa6c961-12e4-ee5b-83f2-727aaa5f3811.jpeg)

次回[H8/3664ではじめるマイコン制御7](https://qiita.com/kiki0817/items/a6158239087639e08792)
あるユーザについて特定のアドレスからのみSSH接続許可したい

SSH接続におけるパスワード認証滅べばいいのに、と思った案件。

# やりたいこと

以下の環境でusr01@svr00についてsvr01からのSSH接続のみを**許可**したい。
ただしusr00@svr00はどのサーバからもSSH接続できるものとする。

|server|address|user|
|:-----|:------|:---|
|svr00 |192.168.33.100|usr00,usr01|
|svr01 |192.168.33.101|usr00|
|svr02 |192.168.33.102|usr00|


## `authorized_keys`を使うパターン

公開鍵認証以外の認証を拒否している前提であれば`authorized_keys`でfrom条件を入れるのがお手軽。

```:/etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
```

```:/home/usr00/.ssh/authoried_keys
ecdsa-sha2-nistp256 AAAAE2U...
```

```:/home/usr01/.ssh/authoried_keys
from="192.168.33.101" ecdsa-sha2-nistp256 AAAAE2V...
```


## `AllowUsers`を使うパターン

「パスワード認証は許可したいんだよね」という場合は`AllowUsers`を使う。

```:/etc/ssh/sshd_config
AllowUsers usr00
AllowUsers usr01@192.168.33.101
```

注意しなければならないのは有効な`AllowUsers`を1つでも記載するといずれかのエントリでマッチしない場合に拒否されてしまう（＝デフォルト拒否になる）ので、SSH接続を許可するユーザはすべて記載する必要があること。
とはいえ、設定ファイルを見ればどのユーザがSSH接続できるかわかるので安全。


## `DenyUsers`を使うパターン

「パスワード認証は許可したいし、新規ユーザ追加時に`AllowUsers`は更新したくないよ」というワガママな人へ。

```:/etc/ssh/sshd_config
DenyUsers usr01
Match Address 192.168.33.101
    DenyUsers !usr01
```

192.168.33.101から接続したときのみ`DenyUsers`を上書きしてusr01の拒否を無かったことにする。
`DenyUsers`にマッチしない場合は後続の評価に回されるので、パターンに記載しなければ他のユーザには影響は出ない。
Chromebookでの、CLI web開発の進め方

# 序 
開発マシンで用いられることも増えてきているChromebook。３万円ちょいで衝動買いしたが、フルHD 15インチディスプレイで重さ２KG以下、半日作業くらいはバッテリーだけでこなせるので、重宝しそう。

Chromebookは、近時、GUIアプリが動く仮想Linux環境（crostini）が提供されたことにより統合開発環境（IDE）も動くようになっている。だが、日本で安価に入手できるChromebookは、RAM容量が2GBまたは4GBといった構成となる（RAM容量が多く高速なCPUを積んだChromebookは、Amazon等を介して輸入することに）。そのため、コマンドラインインターフェイス（CLI）で少なめのRAMを活かした開発を行う方法をマスターしておいた方が良いよ、というエントリー。

# Chromebrew
Chromebookで開発者モードに入った場合、はじめに[Chromebrew](https://github.com/skycocker/chromebrew)なるツールを入れることで、以下のような言語やツールが使えるようになる(バージョンは現時点のもの)。

>
gcc 7.3.0 
python(2.7.15)
ruby 2.5.3p105
perl 5, version 26, subversion 1 (v5.26.1)
git version 2.20.1

2.7系のpythonはさておき、rubyやperlでは実用的に開発を行える気がする。
ここでは、GoやJavaといったコンパイル言語でweb開発を行う際のTipsを書いておく。

# ポイントは、作業フォルダへの実行権限付与。
といってもポイントはただ一点。ChromeOSが実行権限を制限しているフォルダに権限をマウントすることだ。
以下、Java/Scalaを例に説明するが、他の言語でもそれぞれの環境に応じた同様のマウントを行う。

Javaについては、Chromeblewではまともにインストールできないようだが（コミュニティベースのChromeblewは、今のところ、Chromebookの開発環境を整える上ではさほど役に立たない存在と思っている、幸いGroovyベースのsdkmanによって任意のバージョンのJavaを手早く導入できる。
例えばJava8系の導入は以下のように行う。

```
sudo mount -i -o remount,exec /home/chronos/user/ 
curl -s "https://get.sdkman.io" | bash 
source "$HOME/.sdkman/bin/sdkman-init.sh" 
sdk list java 
sdk install java 8.0.192-zulu 
```
sudo mountコマンドによって、フォルダに実行権限（exec ）を付与している。

実行権限の付与は、マシンの再起動の都度行う必要があるため、用いる開発環境に応じ、シェルにまとめておくと良い。
例えば、sbtを用いたScalaの開発では以下のようにしている。

```runsbt.sh 
sudo mount -i -o remount,exec /home/chronos/user/
sudo mount -i -o remount,exec /tmp
sudo mount -i -o remount,exec /media
cd /media/fuse/crostini_…/to/your/folder
sbt
```

# 実行例

地味だが、ScalaでのWeb API開発を例に説明しておこう。
gitから取得したソースコードはお試し実行してみる

```
git clone https://github.com/maciejmroz/akka-money-transfer-service
sbt run
```

コンパイルまでは問題なかったが、ディフォルトで指定されていた8080番ポートはChromeが使っているらしく使えなかった。localhostではポート番号を9000等に変更すると実行できる。

pythonのpip経由で導入したhttpieを使って検証しておこう

```
$ http POST  http://localhost:9000/transfer  from:=1 to:=3 amount:=40
HTTP/1.1 200 OK
Content-Length: 15
Content-Type: application/json
Date: Sun, 06 Jan 2019 06:00:40 GMT
Server: akka-http/10.1.5

{
    "status": "Ok"
}
```

無事動作している。


# 私が使う主なCLIツール

以下の通り。

>
HTTP client : curl, httpie
CLI editor : micro, spacemacs
JVM tools installer : sdkman(Java/Scala/Groovy)

このうちmicroとspacemacsはchromebrew経由で導入。
他にChrome拡張やAndroidアプリも使える。加えて、GUIツールもIDEを使っている（intellij）。ただし、Chromebookでは、GUIツールはDebianベースの仮想マシン経由での実行となる。ため、Debianゆえaptも使えるがRAM割当が少ないことには注意。格安ChromebookではCLIツールを使ってコツコツ開発するが吉。
なお、データベースは現状未導入だが、仮想マシンの方を使ったほうが楽かも。


# Chromebookで富豪的な開発がしたかったら
Core i7 でRAM16GBというスペックを持つ Google Pixel Slateを個人輸入して使うが良いか。円高になってきたので、キーボードを入れても２０万円以下だし。というか、私も買いたいので誰か先に買ってお試ししてくれる人現れないかな。
php-master-changes 2019-01-05

今日はビルドシステムの Zend Engine 単体ビルド機能の削除、imagescale() でアスペクト比を保って高さを変えられるようにする修正があった！

# 2019-01-05
## petk: Remove separate *nix system build for Zend engine
- https://github.com/php/php-src/commit/e1f101d79840e171f1dcfe17f8ae7a3d0be7e89d
- ビルドツールから Zend Engine を単品でビルドするための記述を削除
- どうせ PHP 処理系以外で使わねーだろ！的な

## Andreas Treichel: Preserve aspect ratio for width or height
- https://github.com/php/php-src/commit/3c9af3095c1e076229a8d8fa933d27bb72daa79d
- ext/gd で、[imagescale()](http://php.net/manual/ja/function.imagescale.php) 利用時に幅へ -1 を渡すとアスペクト比を保って高さを変えられるよう機能修正
SQLの学習

# はじめに

エンジニアに転職し、業務でSQLを使うことが増えたので、
家でSQLの学習をしていました。
学んだことを、まとめておこうと思い、記事を書こうと思いました。
（まだまだ駆け出しエンジニアですので、基本的なことばかりになると思いますが・・・。）


#対象とする人

とかは特にないです（備忘録として、また、知識のアウトプット＆整理のために書きますので）。
エンジニア歴がまだ浅い人には役にたつかも・・・・ぐらいです！笑


#この記事の流れ

・SQLとはなんぞや？
・４大命令
・SELECT文
・UPDATE文
・INSERT文
・DELETE文
・WHERE句について
・まとめ
・コラム（というか雑記）
・というわけで・・・


#SQLとはなんぞや？
SQLとは何かと言いますと・・・一言で言うと・・・・

「データベースとやり取りをするときに使う言語」

です。

SQLという言語を使って、
「データベースさん、◯◯テーブルにある情報見せて」
「データベースさん、△△テーブル消すね〜」
とか、そんなことをデータベースに伝えます。
そんなイメージを持ってくれたらいいかな、と思います。



#４大命令

SQLには基本となる、４大命令文があります。

・SELECT文
・UPDATE文
・INSERT文
・DELETE文

順番に見ていきましょう。

### SELECT文
テーブルからデータを指定して取得します。

```sql
SELECT 列名 FROM テーブル名
```

### UPDATE文
テーブルのデータを書き換えます。

```sql
UPDATE テーブル名 SET 列名=値1  (WHERE 条件式)
```
※注:WHEREのないUPDATEは**全レコードが更新されます**。

### INSERT文
テーブルにデータを追加します。

```sql
INSERT INTO テーブル名 (列名1, 列名2, 列名3, ...) VALUES (値1, 値2,値3,... )
```
### DELETE文
テーブルに存在するデータを削除します。

```sql
DELETE FROM テーブル名 (WHERE 条件式)
```
※注:WHEREのないDELETEは**全レコードが消去**されます。

## WHERE句について
SQLでは、
「WHERE」
を使って様々な処理をします。

WHERE句には３つの基本があり、

1.処理対象行の絞り込み
2.SELECT,UPDATE,DELETEで使用（INSERT文では使用できない）
3.WHEREの後ろには条件式を記述

という３つの基本があります。
業務において、
UPDATE文
DELETE文
を使用する際、ほとんどの場合、WHERE句を一緒に使います。

#まとめ
・SQLには、基本となる４大命令「SELECT文」「UPDATE文」「INSERT文」「DELETE文」
があるということ。
・WHERE句は業務においてたくさん使うので、ちゃんと使えるようになっている方が良いということ。

#コラム（というか雑記）
エンジニアとして転職して、今日で五ヶ月目ぐらいです。
上司いわく、
「SQLはどんな現場に行っても使う可能性が高いから、ちゃんと勉強しているほうが良いよ〜」
とのことでした。

また、
UPDATE文
INSERT文
DELETE文
を使う場合は、使う前にそのSQL文が正しいかどうか、
上司に見てもらうか同僚に見てもらうかをした方が良いと思います。

理由としては、テーブルのデータを書き換えたり消したりするSQL文のため。

特に、DELETE文。
間違えて、データを消しちゃうとシャレになりませんので・・・(^_^;)
もしそれが本番環境のデータベースのテーブルとかだったらえらいこっちゃになります・・・。

まだまだ駆け出しエンジニアですが、
SQLを使いこなせるようになるために、
コツコツ勉強していきます。

#というわけで・・・
お読みいただきありがとうございました。
間違い等ございましたら、ご指摘いただけると嬉しいです！