OmniAICreator/Qiita-1.07M huggingface dataset:
多言語Universal Sentence Encoderで言語間転移学習を試す

# はじめに
Universal Sentence EncoderはTransformerを自然言語処理の様々なデータセットを使ってマルチタスク学習させて得られた文表現ベクトルのエンコーダーです。今回使うのはその、多言語バージョンで、英語、フランス語、ドイツ語、スペイン語、イタリア語、中国語、韓国語、日本語のタスクで学習されたものです。意味が似ている文ならば、それがどの言語であるかによらず、似たようなベクトル表現が得られるという特徴があります。

今回はその性質を利用して、言語間の転移学習の実験をしました。具体的には、ある自然言語処理のタスクの英語の訓練データセットを学習させ、他の言語のテスト用データセットで性能を評価しました。

# データセットの準備
今回実験に用いるデータセットは`TREC Question Classification Dataset`です。これは5452件の訓練セットと500件のテストセットからなり、英語の質問を6つの粗いカテゴリと42の細かいカテゴリで分類したものです。

配布されているデータセットは前処理としてcsvに変換しておきました。テストセットの先頭行は次のようになっています。

|label|text|
|:-:|:-:|
|NUM:dist|How far is it from Denver to Aspen ?|
|LOC:city|"What county is Modesto | California in ?"|
|HUM:desc|Who was Galileo ?|
|DESC:def|What is an atom ?|
|NUM:date|When did Hawaii become a state ?|
|NUM:dist|How tall is the Sears Building ?|
|HUM:gr|George Bush purchased a small interest in which baseball team ?|
|ENTY:plant|What is Australia 's national flower ?|
|DESC:reason|Why does the moon turn orange ?|

このテストセットはgoogle翻訳APIによって各言語に変換しました。変換後のデータセットの一例として日本語のものを示します。

|label|text|
|:-:|:-:|
|NUM:dist|デンバーからアスペンまでの距離は？|
|LOC:city|カリフォルニア州モデストとはどの郡ですか？|
|HUM:desc|ガリレオは誰ですか？|
|DESC:def|原子とは|
|NUM:date|ハワイはいつ国家になったのですか？|
|NUM:dist|シアーズビルの高さは？|
|HUM:gr|ジョージブッシュはどの野球チームにちょっとした興味を持っていますか？|
|ENTY:plant|オーストラリアの国花は何ですか？|
|DESC:reason|月がオレンジ色に変わるのはなぜですか。|

おかしな訳もあるものの、全体的に検証用のデータセットとしては十分なものが出来たと思います。

# 実験
tf-hubとtf.estimatorを使ってモデルを実装しました。モデルのコア部分のコードは次の通りです。入力文をtf-hubの多言語USEモジュールを使ってベクトル化したものを特徴量として、多層ニューラルネットワークで分類します。

```python
embedded_text_feature_column = hub.text_embedding_column(
    key="text", 
    module_spec="https://tfhub.dev/google/universal-sentence-encoder-xling-many/1",
    trainable=False)

estimator = tf.estimator.DNNClassifier(
    hidden_units=[512,256],
    feature_columns=[embedded_text_feature_column],
    n_classes=n_classes,
    dropout=0.5,
    optimizer=tf.train.AdagradOptimizer(learning_rate=0.005))
```

学習は英語の訓練データセットのみを使って行い、評価を多言語のテストセットで行いました。

# 結果
6つの大分類に分類した場合と、細かい42の小分類に分類した場合の両方を示します。

|言語|精度（大分類）|精度（小分類）|
|:-:|:-:|:-:|
|英語（訓練）|0.9473588|0.81969917|
|英語（テスト）|0.902|0.75|
|フランス語|0.842|0.7|
|日本語|0.882|0.714|
|スペイン語|0.904|0.732|
|韓国語|0.834|0.668|
|ドイツ語|0.876|0.742|
|中国語|0.894|0.732|
|イタリア語|0.852|0.694|

転移学習がうまく出来ているのではないでしょうか。
なんとなく言語リソースが多い言語ほど精度が高くなっている気がします。
アルゴリズムについての学び

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているtsuyoshi0514です。

##アルゴリズムとは
アルゴリズムとはいわゆるレシピのようなものです。
そして、その材料としてデータが存在しています。
料理と同じように作りたいものがあった時に、作る手順がわからないと作ることができませんよね？
これと同じで、プログラムを作る際にもアルゴリズムという手順が必要になります。
これを一から考えるというのはとても難しいことです。
しかし、現在ではプログラミングの歴史の中で蓄積された知識が豊富にあるので、それを利用していくという形をとります。

##フローチャート
フローチャートはアルゴリズムを図にしたものです。
これを記述することで、処理の流れを理解することができます。
フローチャートはプログラムを記述する上で役に立ちます。

##アルゴリズムの三大処理
- 順次処理：
処理を記述した順番に記述する。
- 分岐処理：
条件により処理の流れを変える。
- 繰り返し処理：
条件が成立する間繰り返す。

上記の三つの処理のことをアルゴリズムの三大処理といいます。
そして、この3つの処理を利用してプログラミングを行うことを構造化プログラミングといいます

##アルゴリズムの性質
###正当性
アルゴリズムの二つの性質の一つが正当性です。
アルゴリズムは与えられた課題に対して正しい結果を出さなければいけません。
このことをアルゴリズム正当性といいます。
そしてこの正当性は「指定された条件を満たす入力値が与えられたとき、必ず正しく動作する（正しい出力結果を得る）」を保証することで示されます。
###停止性
アルゴリズムの二つ目の性質が停止性です。
アルゴリズムは最終的には必ず停止しなければならず、停止しなければ処理が永遠と繰り返される、無限ループという状態に陥ります。アルゴリズムの停止性とは、「いかなる条件の入力値が与えられても、有限時間内に必ず正しく停止すること」を保証することで示されます。


##まとめ
表面的な内容だとこういったことがアルゴリズムの要素として挙げることができます。
アルゴリズムをしっかり理解するためには何年も勉強しなければいけないといわれています。
しかし、アルゴリズムはプログラミングを勉強していくうえで非常に重要なものなので、これからもしっかり勉強していきます。

参考文献：[一週間で身につくアルゴリズム](http://sevendays-study.com/algorithm/pr-day1.html)
PowerBIでseabornのpairplotを見たい

Microsoft Power BI でPythonビジュアルが使えそうなので、seabornのpairplotしたかったけどてこずったのでメモ。

## 環境
- Microsoft Windows 10 バージョン 1803(OS ビルド 17134.556)
- Microsoft Power BI Desktop バージョン: 2.68.5432.841 64-bit (2019年4月)
- Python 3.7.2

## Pythonまわり
まずPythonの必要なライブラリが入ってなかった。

```DOS:cmd
>pip list
Package         Version
--------------- -------
pip             19.1.1
```

pip installでSSLのエラーに悩まされる。プロキシの問題？と思ったり諦めかけたそのとき。

```DOS:cmd
>pip install pandas
 (略)
Could not fetch URL https://pypi.org/simple/pandas/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pandas/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)'))) - skipping
```

pipのオプションで証明書を受け入れる指定ができるらしい。

```DOS:cmd
>pip install pandas  --trusted-host pypi.org --trusted-host files.pythonhosted.org
Collecting pandas
 (略)
Installing collected packages: pytz, numpy, six, python-dateutil, pandas
Successfully installed numpy-1.16.3 pandas-0.24.2 python-dateutil-2.8.0 pytz-2019.1 six-1.12.0
```

同様にseabornも。

```DOS:cmd
>pip install seaborn  --trusted-host pypi.org --trusted-host files.pythonhosted.org
```

必要なのは入ったぽい。

```DOS:cmd
>pip list
Package         Version
--------------- -------
cycler          0.10.0
kiwisolver      1.1.0
matplotlib      3.0.3
numpy           1.16.3
pandas          0.24.2
pip             19.1.1
pyparsing       2.4.0
python-dateutil 2.8.0
pytz            2019.1
scipy           1.2.1
seaborn         0.9.0
setuptools      40.6.2
six             1.12.0
```

## PowerBI側
Power BI Desktopのレポート作成画面にPythonビジュアルを置き、Pythonスクリプトエディターにコードを貼り付ける。

```PowerBI:Pythonスクリプトエディター
import matplotlib.pyplot as plt
import seaborn as sns

sns.pairplot(dataset)
plt.show()
```

![Pythonビジュアル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152237/eab76824-8349-f580-92d8-36a27fa56b66.png) ←Pythonビジュアル
![Pythonスクリプトエディター](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152237/64072d54-9e7f-2185-8451-5a62061a0a6b.png) ←Pythonスクリプトエディター

無慈悲なエラー
![このビジュアルを表示できません。詳細を確認する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152237/83927078-aacd-5522-1cd7-068b9c42aa96.png)

「詳細を確認する」

```詳細:詳細
 (略)
ModuleNotFoundError: No module named 'matplotlib'
 (略)
```

なんと、入れたはずのmatplotlibがないというではないか。ここまでか。ついにあきらめかけたそのとき。

![Power BI オプション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152237/e784ea84-f111-c517-16c8-e50c0ce7c3d4.png)

Power BI DesktopのオプションでPythonのパスを設定できることが判明。（Pythonが2つ入ってることも判明！）
36_64→37_64に変更して無事表示できるようになった。やれやれ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152237/7f56dd69-f708-9144-7f7d-5c808ce2ed03.png)





## こちらの記事を参考にしました。（リスペクト）

https://qiita.com/agajo/items/73d6f14855da703972e0
https://qiita.com/h_kobayashi1125/items/afc55abf7e98581bcab3
https://qiita.com/h_kobayashi1125/items/e10986ff223306ed9f2f
Swift3-Swift4でExtra argument ‘****’ in call

Swiftを上げることで、

Extra argument ‘****’ in call

というエラーが発生してコンパイルできなくなりました。

原因は、引数に指定していたオブジェクトに、必要な引数がなかったためでした。型を合わせる必要がありそうですかね？

Swift3 -> Swift4.1 に上がって色々と変わったようですね。
Swift4.1 -> Swift4.2 に上げたりエラーが増えて

Xcode10.2 に上げると RXSwift Swift5 にしてください的なエラーが出てきた

諸々対応していかないとなのでここで何かしらどう対応していったのかエラーが出るたび（旅）書いていきたいと思います。

---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
SECCON 令和CTF Write-up書いてみたかったから書いた。

# CTFとは
Capture The Flagの略で、セキュリティ分野での技術を競う手法の1つになる。
## 令和CTF
以前から興味があり、丁度機会があり、今回初参加する事になった。
今回初参加したCTFになる、個人戦で2hの全部で8問(不確か)になる。
完全初心者で右も左も分からないことばかりですでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234904/593c7331-b5fa-bbaf-4c9e-d9eafe67062e.png)
一応210点で122位でした。嬉しい(｡>﹏<｡)。
遅ればせながら、Write Up を書いてみたかったから書いた。全然解けてないけど。
### 下準備
参加に当たり、下準備として、各種ツールとかの情報を調べておいた。
入れたのはこちら(元から入っているもの含む)。

- IDA
- objdump
- hexdump
- tcpdump
- pdfimages
- wireshark
- tshark
- 等々...

### 解けた問題
#### Misc
##### フラグの例は？ (10pt)
チュートリアルで、そのまま入力。
~~チュートリアルが始まらなかったあれ。~~

`SECCON{reiwa}`
##### bREInWAck (100pt)
brainf*uckだとヒントにあり、始めてみたが、なんかすぐに解けた。
ファイルは下記になる。  

```
令和和和和和和和和和和和和和和和和令和
和和和和令和和和和令和和和和和和和令和和
和和和和令和和平平平平平成令和和和。令
和和和和和。成成。。平成成成成。成。令令
和和和和和和和和和和和。令和和。平平平和
和和和。令和和。和和和和。令令和和和和和
和和和和和和和。平平平和和和和和和和和和
和和和和。成成成成成成成成。令成成成成成
成成成。令令。成成成成成。成成成成成成。
令和。平平和和。令令令和和和和和和和和和
和。
```
検索して、出てきたサイトにあったHello World等のサンプルプログラムで + が多いため、一番多い 和 は + で間違いないであろうと大部分が変換出来た。
その上で、 「」 は形的に、ループに使用している [] に対応しているであろうと予想。
もし違っていたら、 \<\> であろうと一応考えておきつつ、ほぼ [] であろうと決めつけてやった。
また、サンプルにしたプログラムで、最後に出力が必ず付いていた為、 。 は . で間違いないであろうと予想。
成は数的に - であると予想(決め付け)。

最後は、 令、平 は どっちが \<\> のどっちかわからないので2パターン両方試そうとして、最初の片方で解けた。
WEBインタプリタを使用して実行してみて思考錯誤しました。
これは多分全パターンを試すプログラムを書くといいのではないでしょうかね、と後日ちょっと思った。
走らしている間に別の解く事も出来ますしね。さくっとそういう事が出来るくらいプログラム書き込まねばば。

`SECCON{bREIn_WAnic!}`
#### Forensic
##### 新元号発表 (100pt)
開いたらQRコードが隠れていて見れないpdfファイルだった。
![Screenshot from 2019-05-08 17-19-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234904/a36391f1-65e5-c76d-5b47-5efc4b20cf84.png)
これは画像を全部取りだせばいいのかなーと思った矢先に、Windows環境にて、pdfを文章に変換してVimで読み込む為にmutoolが入っており(mupdfのcli)、それを使用してimgファイルを全て取りだしてみた。
何か令和の形をした部品が2つあり、合成なりなんなりすればよいであろうと思ったのでGIMPを開き、加工してみようとするも久しぶりのGIMPで使い辛すぎて、一時断念、他のものに移る。
終了時間が近づいてきて、特に進捗が無く、このままでは…と思い既に半分?解けているようなものであったのでなんとか頑張って合成。
![20190508_172521.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234904/6286d5b7-f43c-6d2e-0bc5-81b9397f1658.jpeg)
こんなのが出来た。スマホで読み込ませたらフラグが。
後で他の人を見るとXORでやればよかったらしい(言われていてもどうやるのか知らないけど、というか)、また、ペイントとかでも出来るくらい簡単だったらしい。

`SECCON{overlay_overlap_overera}`
### 後書き・所感
初参加の完全初心者ですが、運とか問題が優しくて？2問解けました。与えられている情報から問題を解く事が楽しく、解けた時の達成感があり楽しかったです。
興味がある人はぜひ参加してみて下さい。面白いですよ！
Brainf*uckは面白いなーと思った、バイナリがバイナリ(意味不明)、SQLインジェクションは出来そうだったので、悔しかった。
どうにかして自力で調べつつ他の人の解き方見るとかで解いてみて自分なりにどう解いたかをまた別で記事書きます。
完全に初心者の自分にはあるの人のWrite-Upでは全然わからん状態だったから、初心者なりに細かく詳しい解析記事を備忘録で書きたいってだけ。
CTF Beginnersとかセキュリティキャンプとかも参加したい。
### 他の人のWrite Up
- https://qiita.com/1gy/items/7e87935f47138aa48a88
- https://qiita.com/kusano_k/items/402ebf004e8f9463cb17
- https://qiita.com/Berg-jr/items/a3dd2860e1371b40cd8a
- https://qiita.com/nicklegr/items/57061f0baa928697f345
- http://shift-crops.hatenablog.com/entry/2019/05/01/024011
MacOS(OSX) - macのターミナルに(base)と表示され場合の対応方法

anacondaを使用した際ターミナルの冒頭に(base)と表示されたままとなった場合の対処方法を備忘録を含めまとめたいと思います。

<img width="294" alt="スクリーンショット 2019-05-08 17.20.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226787/1c650ba7-fb0e-9391-7f72-5260c8772e28.png">


#ターミナルで「conda config --set auto_activate_base False」をすることで解決。
```Swift:ターミナル
$ conda config --set auto_activate_base False
```


念の為に参照元を記述いたします。
https://askubuntu.com/questions/1026383/why-does-base-appear-in-front-of-my-terminal-prompt

`auto_activate_base`が`True`となっているため、`False`とすることで解決いたしました。

ご参考になれば幸いです。
#python の動作確認に まだipython なんか使ってるの？これからは bpython でしょ！ ( コンソール比較 )

# インストールと起動

```
pip install ipython
ipython
```

or

```
pip install bpython
bpython
```


# ipython

ls とか ll とかそのまま打てるlinuxコマンドがある

初めて知った

![image](https://user-images.githubusercontent.com/13635059/57352954-f8d6a280-71a1-11e9-93b2-fba779358251.png)

打てないやつも

![image](https://user-images.githubusercontent.com/13635059/57352975-09871880-71a2-11e9-95ef-b9a729e99ac6.png)

# bpython

なんかめちゃくちゃインタラクティヴに補完してくれる！

![image](https://user-images.githubusercontent.com/13635059/57352843-91205780-71a1-11e9-8ecc-c3322cf95997.png)

# 感想

お好みで。

# Stackoverflow のGoogle日本語翻訳

![image](https://user-images.githubusercontent.com/13635059/57352909-cf1d7b80-71a1-11e9-9fb5-2d400874630b.png)
---
対話的なインタプリタがほしいのであれば、bpythonは問題ないはずです。あなたがIPythonについて好きな機能を見逃すまでそれを使ってください。

IPythonがbpython上で提供する機能はたくさんあります。

特別なスレッドオプション 私-gthreadはPyGTKを試したり-pylab、matplotlib を試したりするのが好きです。

シェルコマンドの直接呼び出し  cdIPythonでは非常に便利です。

完全なreadlineライブラリのサポート - 私は慣れ親しんだキーボードショートカットを使うことができます。

モジュールのリロード機能 - コードを変更した後に、モジュールのディープリロードを実行できます。これはテストやデバッグにとても便利です。

とは別のタスクでバックグラウンドで関数を実行し%bgます。

完全な並列プログラミング環境（対話型Pythonシェルに期待する機能ではありませんが、IPythonが提供しています）。

このリストはほぼ任意に続けることができます。そしてもちろん、IPythonに欠けているbpythonの多くの機能があるでしょう、しかしあなたはそれらを求めませんでした。

だからあなたのために働くものを使うだけ！


[python - What are the differences between ipython and bpython? - Stack Overflow](https://stackoverflow.com/questions/4232923/what-are-the-differences-between-ipython-and-bpython)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Firebase でアプリケーション作ったら functionsで結構ハマったのでメモ

# 概要
Firebaseの勉強をしていたのでまとめ
hosting + authenticationはいろいろやっている人が多かったけどfunctionsも使っている人が少ない印象だったので。
ただ、ローカル起動はわからん。。。教えてくれる人募集。。。

## 対象
* nuxtとfirebase hosting + authentication を完全に理解した人
* functions とかわからんし、という人

## hosting + authentications + nuxt

このあたり画像つきで書いてくれている人が多いので割愛
例えば: https://qiita.com/potato4d/items/cfddeb8732fec63cb29c

## functions

https://firebase.google.com/docs/functions/get-started?hl=ja
のとおりやればいいらしいが、ちょっとハマったのでとりあえずやったことを書いてます。

functionsをinstallする

```
firebase init functions
```

デフォルトのリージョンがusになっていたので東京に修正する

```ts:index.ts
export const helloworld = functions
    .region('asia-northeast1')
    .https.onRequest
```

onRequestだとcrosでエラーと言われるので、 https://qiita.com/qrusadorz/items/40234ac0b5c5c2315cad
を読んで納得した後onCallに変更する（ドキュメントを見ててもよくわからなかった人

```ts:index.ts
import * as functions from 'firebase-functions';
import { CallableContext } from 'firebase-functions/lib/providers/https';

export const helloworld = functions
    .region('asia-northeast1')
    .https.onCall((data, context: CallableContext) => {
      if (!context.auth) {
        // permission-deniedで403を返したり
        throw new functions.https.HttpsError('permission-denied', '認証してないから使えません!');
      }
      if (!data.name) {
        // invalid-argumentで400を返したりする
        throw new functions.https.HttpsError('invalid-argument', 'nameは必須です!');
      }
      // なんかいろいろやって200でオブジェクトを返却する
      // nameはclientから送られてくるデータ
      const greet = `hello ${data.name}`;
      return {
        greet
      }
    })
```

で持って使用するnodeのバージョンを10(まだGAじゃない)に変更しようとしたが、実際に使おうとしたら何故か401が返ってくる
Issue: https://github.com/firebase/firebase-functions/issues/432
そのためバージョンは8にする

```json:package.json
{
  "name": "functions",
  "engines": {
    "node": "8"
  }
}
```

nuxt側で対象のfunctionを呼ぶようにする.ただリージョンは指定する. これしないとcorsでナンタラカンタラ言われる.
デフォルトのusを見ているので、おそらく存在しないから怒られているんだと推測

```vue:認証後のページ
<template>
  <section class="container">
    <div>
      <div>
        <p><input type="text" v-model="name" placeholder="名前">{{name}}</p>
        <p><button @click="call">call</button></p>
        <p>{{greet}}</p>
      </div>
    </div>
  </section>
</template>

<script>
import firebase from '~/plugins/firebase';
export default {
  data() {
    return {
      name: '',
      greet: '',
      client: firebase.app().functions("asia-northeast1").httpsCallable("helloworld")
    }
  },
  methods: {
    call() {
      this.client({
        name: this.name
      }).then(result => {
        this.greet = result.data.greet;
      })
    }
  }
}
</script>
```

## まとめ
いろいろまとめたらfunctionsって簡単につかえますねー。って感覚がある。この記事の意義、、、なんやねん。
歌会に学ぶcode reviewの仕方(かきかけ)

ある歌会で、自分の短歌を２首、自分の声で読み上げ、参加者の方から、意見をもらう方法の歌会に時々参加している。
算譜(program)の見直し(review)に必要な指向, 技能, 技法, 手順 上位７,
https://qiita.com/kaizen_nagoya/items/6d5962e1a0e4be28405c

Reviewの分類と仕方。仮説(74)
https://qiita.com/kaizen_nagoya/items/37a6751bb9764913af92

歌会に学ぶcode reviewの仕方(かきかけ)
https://qiita.com/kaizen_nagoya/items/a03223fa9f29e283b222

Reviewの仕方、され方。他分野の類似行為と比較。
https://qiita.com/kaizen_nagoya/items/edfbe867bb18cb39cf1b

学ぶことはたくさん。まず２つ。

<この項は書きかけです。順次追記します。>
#１　短歌は文字だけではなく、声（音）で聞いて価値がある。
読み方のわからない短歌は、声にできないので価値が引き算。

本人が声にするのだから、こう読んでほしいというよりも、
本人の意思が伝わってくる。

抑揚や声の大きさ、発生、間。どれをとっても大事な要素。

読み上げられるまでは、意味が全くつかめなかった短歌も、その場でさっと心に響く。
外国語の歌で、歌詞の詳細がわからなくても、感動するのに近い。

大事なのは意味ではなく、心の動き。動的把握。
#２　自由な発言
質問や、意見、誤解を含めて、相手に伝わっていないことがくっきり。

いろいろな方がいれば、いろいろな受け止め方があることがわかる。

みんなが同じ意見を言うような会では価値がないことがわかる。

#code reviewでの展開の仕方

# 1. codeはうごかしてみて価値がある
code reviewでは、コンパイルして、なんらかの試験プログラム、模擬試験プログラムで振る舞いがわかることが大事。

振る舞いのわからないcodeは価値が引き算。

静的な見栄えよりも、動的な振る舞いが大事。動的把握。

# 2. いろいろな意見がでること
みんなが同じ意見を言うような会では価値がない。

「前の人と同じですが」という言葉を言う時間が無駄。

いろいろな利用者を想定した、いろいろな視点での意見が必要。

いろいろな意見が発想できなさそうなら、HAZOPの魔法の言葉を使うといいかも。

# 参考資料(reference)
コードレビューに大事な褒め言葉
https://qiita.com/neko-neko/items/205553e98ea905dc691c

## 自己参照(self reference)
ちょけねこ　たんじょうびのおくりもの　
https://qiita.com/kaizen_nagoya/items/fc9675686c229f7a155e
効率的なHAZOPの進め方
https://qiita.com/kaizen_nagoya/items/2b8eae196945b7976446
安全分析（HAZOP）の際の声かけ
https://qiita.com/kaizen_nagoya/items/381649a6ea025ecba173

図を使って分析すればこんなに簡単
https://qiita.com/kaizen_nagoya/items/6347eb55b2812d745549

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 20190508
ver. 0.02 参考資料追記 20190509
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
画像処理100本ノックC言語で挑戦してみる　下準備

#画像をいじる下準備
早速画像処理開始、、、と言いたいところですが、少し下準備が必要であると考えました。
個人的な方針としては画像の各ピクセルの値を一度配列に格納してからいじるようにしたいので、まずは画像を読み込んで各ピクセルの値を配列に格納して、それを新たに出力するというプログラムを雛形として用意しようと思います。

#そもそもppm形式の画像とは
ppm形式という言葉を僕は最近になって知りました。
そこで一応ppm形式について軽く書き留めておこうと思います。

![スクリーンショット 2019-05-08 13.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333871/6aec80cf-fe70-e5b9-38ef-3e9f50cafbc0.png)


ppm形式の画像をテキストエディタで見てみると、上記のような構造になっています。
ppm形式はRBGでフルカラーを表現できる'pixmap'です。
最初の２バイトがマジックナンバーとなっており、ファイル形式と、データがテキストかバイナリかを表します。

前回の記事でjpg形式からppm形式への変換をweb上のサービスを利用して行いましたが、webサービスではP6の形式に変換されてしまいました。
僕はバイナリではなくテキストの形式でピクセルをいじりたかったのでP6形式のppm画像ではなくP3形式のppm画像を入手する必要がありました。
そこで、今回は**ImageMagick**というアプリケーションを利用してP3形式のppm画像に変換しました。

ImageMagickはコマンドライン上で操作するアプリケーションです。

```
brew install imagemagick
```
上記のコマンドでインストールします（Mac）。
インストールが終了したら、以下のコマンドで実際に画像を変換していきます。

```
convert -compress none imori.jpg imori.ppm
```
これだけで完了です。

#雛形プログラムの作成
ここからはいよいよC言語でプログラムを書いていきます。
【注意】筆者のコードはいつもクソコードなのでご了承ください。コードの書き方や使用する関数の選択など、これからの記事も含めて何かアドバイスをいただけると嬉しいです！

以下が、今回のプログラムになります。

```c:ex0.c
#include <stdio.h>
#define N 256

int main(void) {
    FILE *infp;
    FILE *outfp;
    char magic[64];
    char str[256];
    int width;
    int height;
    int max;
    char readline[N] = {'\0'};

    infp = fopen("../imori.ppm", "r");
    
    //magic
    fgets(magic, N, infp);
    //width, height
    int num[4];
    for(int i = 0; i < 2; i ++){
        fscanf(infp, "%d", &num[i]);
    }
    width = num[0];
    height = num[1];
    //max
    fscanf(infp, "%d", &max);
    //image
    int image[height][width*3];
    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3; j ++){
            fscanf(infp, "%d", &image[i][j]);
        }
    }

    outfp = fopen("imori.ppm", "w");

    fprintf(outfp, "%s", magic);
    fprintf(outfp, "%d ", width);
    fprintf(outfp, "%d\n", height);
    fprintf(outfp, "%d\n", max);

    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3; j ++){
            fprintf(outfp, "%d ", image[i][j]);
        }
        fprintf(outfp, "\n");
    }
    return 0;
}
```
割と本当にクソコードです。
もう少し綺麗に書ける部分がありそうですが、とりあえず気にしません。

###プログラムの内容
地道に１行ずつ読んで変数に格納するだけです。
入出力の関数については、これらを選択した理由は特にありませんが、あまり推奨されないものもあるようで何かアドバイスありましたらご教授お願いします。

メインとなるピクセルの値は２次元配列に格納しています。
触れなくても良いかと思いますが、画像のサイズはheight × widthですが、ppm形式の画像は各ピクセルの色をRBGで表しますので、実際に格納すべき値の数は縦がheight、横がwidth*3となります。

このプログラムではピクセルの値はいじっていないので入力した画像と同じ画像がカレントディレクトリに出力されます。

さて、これで準備はできたので次からいよいよ100本ノック、解いていきます！
Nuxt.jsでTypeScriptを使うための手順

# はじめに

Nuxt.jsがTypeScriptを公式サポートしているのですが、公式サイトに記載されている手順だと不足していたので、動作確認できるところまでの手順をまとめておきます。

[Nuxt.js | TypeScript サポート](https://ja.nuxtjs.org/guide/typescript)

# 前提条件
- nuxtのバージョンが2.4.0以上であること
- ESLintのバージョンが5であること。（2019/8/9追記）

#### バージョン確認方法
```console
# プロジェクトルートで以下のコマンドを実行
$ ./node_modules/nuxt/bin/nuxt.js -v
```

## TypeScriptの利用手順

### @nuxt/typescriptモジュールをインストール
```console
$ npm i -D @nuxt/typescript
```

### tsconfig.jsonファイルを作成
```console
$ echo "{}" > tsconfig.json
```

### configファイル名変更

変更前）nuxt.config.js
変更後）nuxt.config.ts

### nuxt.config.tsの修正

```diff:nuxt.config.ts
- import pkg from './package'
+ const pkg = require('./package')
```

### ts-nodeのインストール

```console
$ npm i -D ts-node
```

### vue-property-decoratorのインストール

```console
$ npm i -S vue-property-decorator
```

## ESLintの利用手順

Lintを行う必要がある場合のみ、以下の手順を行ってください。

### eslint-pluginのインストール

```console
$ npm i -D @typescript-eslint/eslint-plugin @typescript-eslint/parser
```

### .eslintrc.jsの修正

```diff:.eslintrc.js
- parser: 'babel-eslint'
+ parser: '@typescript-eslint/parser'

+ plugins: [
+   '@typescript-eslint'
+ ],
```
※ Prettierを利用している場合は、最初からpluginが用意されてますので、```@typescript-eslint```を追記する形になります。（2019/8/9追記）

```js:.eslintrc.js
plugins: [
    'prettier',
    '@typescript-eslint'
]
```

### package.jsonの修正

```diff:package.json
- "lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
+ "lint": "eslint --ext .ts,.js,.vue --ignore-path .gitignore .",
```
### Lint実行

```console
$ npm run lint
```

# 動作確認

Nuxtプロジェクトを作成した際に元々あるファイルをTypeScriptで書き直したあと、動作確認を行います。

### pages/index.vueを編集

```vue:変更前
<script>
import Logo from '~/components/Logo.vue'

export default {
  components: {
    Logo
  }
}
</script> 
```

```vue:変更後
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component({
  components: {
    Logo: () => import('~/components/Logo.vue')
  }
})
export default class Index extends Vue {}
</script>
```

### サーバ起動
```console
$ npm run dev
```

http://localhost:3000 にアクセスして、画面が表示されるか確認してください。
正しく表示されたら、TypeScriptのセットアップは完了です。
GoのLambdaでPOSTを送る

#JSON形式のクエリパラメータを持たせたPOSTをLambdaから送る

```main.go
package main

import (
  "net/http"
  "io/ioutil"
  "fmt"
  "net/http/httputil"
  "bytes"
  "github.com/aws/aws-lambda-go/lambda"
)

type MyResponse struct {
  Message string `json:"end:"`
}

func post() (MyResponse, error) {
  url := "http://xxx.xxx.xxx.xxx/hoge?"
  jsonStr :=`{"input": "xxx","order": "xxx"}`

  req, _ := http.NewRequest("POST", url, bytes.NewBuffer([]byte(jsonStr)))

  dump, _ := httputil.DumpRequestOut(req, true)
  fmt.Printf("%s", dump)

  // Content-Type 設定
  req.Header.Set("Content-Type", "application/json")

  client := new(http.Client)
  resp, _ := client.Do(req)

  dumpResp, _ := httputil.DumpResponse(resp, true)
  fmt.Printf("%s", dumpResp)

  defer resp.Body.Close()


  byteArray, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(byteArray))

  return MyResponse{Message: fmt.Sprintf("received!!")}, nil
}

func main() {
  lambda.Start(post)
}

```
実行結果
関数の実行から返された結果

```
{
  "end:": "received!!"
}
```

ログ出力

```
START RequestId: b7d5463d-5f58-45fd-8375-723789b411f7 Version: $LATEST
POST /hoge? HTTP/1.1
Host: xxx.xxx.xxx.xxx
User-Agent: Go-http-client/1.1
Content-Length: 54
Accept-Encoding: gzip

{"input": "xxx","order": "xxx"}HTTP/1.1 200 OK
Content-Length: 220
Content-Type: text/plain; charset=utf-8
Date: Wed, 08 May 2019 07:44:48 GMT

*Response*

END RequestId: b7d5463d-5f58-45fd-8375-723789b411f7
REPORT RequestId: b7d5463d-5f58-45fd-8375-723789b411f7	Duration: 506.21 ms	Billed Duration: 600 ms 	Memory Size: 512 MB	Max Memory Used: 14 MB	
```
deviseのメモ書き

#はじめに
railsでユーザー管理で欠かすことのできないgemファイルである、`devise`関連。
よく忘れがちなので、手順を個人的に控えておこうと思いこの記事をかき始めた。

##deviseとは
そもそもdeviseとは、webアプリケーションに認証機能を付け加えるというもの。認証機能というと仰々しいが、単純にいうとログインログアウト機能をつけて、ユーザーを登録したり管理したりするもの、というとわかりやすい気がする。
基本的にwebサービスを作っていくと、ここら辺の機能はつけていきたいと思うところだ。

##deviseのインストール
まずはdeviseをインストールしていく。deviseはgemの一種であるため、gemファイルに記述することでインストールが可能となる

```Gemfile
gem `devise`
```

そのあとターミナルにて、gemファイルの更新をする

```
bundle exec bundle install
```

これでgemファイルは更新されたため、deviseのインストールの準備が整った状態になっている。

```
rails g devise:install
```

これにてdeviseのインストールの完了。

###その後の手順
ここからは他にdeviseを用いてどういうことをやったかの一例を示していこうと思う。

####viewの導入
deviseで扱うviewをまずは導入していこうと思う。

```
rails g devise:views
```

これにて、deviseを用いるときのviewファイルを作成することができた。
この中で特に扱ったファイル群としては、`registration`ディレクトリと`session`ディレクトリである。
まず`registration`ディレクトリだが、これはユーザーの登録時のviewをここで管理している。ここで`new`アクション用のviewファイルを作成することで、ユーザーの登録をすることができる。
次に`session`ディレクトリだが、こちらはユーザーのサインインをするために扱うことになる。


##userモデルの作成
上記でdeviseを導入できているのだが、次はここからdeviseを用いてユーザーの管理をしていく。この時にまずは、ユーザーモデルの作成をしなければユーザーを登録することができないためユーザーモデルを作成していくのだが、その作成時にユーザーモデルとdeviseを結び付けて作成する。

```
rails g devise user
```

このコマンドでuserモデルを作成するとともに、devise機能をつけている。またモデルの作成であるため、この操作によりmigrationファイルが作成される。
この時に約一年前くらいまではこういうことが起きなかったのだが、現在このコマンドでモデルを作成すると一部がコメントアウトされてしまい後ほど実装に困ることになるため、以下の部分のコメントアウトを先に外しておくことを勧めておく。

```
      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip
```

ここはログイン情報を担っており、ログイン時間などの情報などを格納するようにしている。この`Trackable`の部分がデフォルトではコメントアウトされているためここを先にコメントアウトを外しておくべきかなと思う。

その他任意の部分を編集した後、migrationファイルを適用させなければならないためいつものコマンドでmigrationファイルを更新しておく。

```
bundle exec rake db:migrate
```

##configure_permitted_parameters
基本的に devise は`メールアドレス`と`パスワード`の設定のみとなっている。
そこで他の要素を追加したい時に、このメソッドを使って追加できるようにする。
`application_controller`に下記のように記述する。(下記例ではサインアップ時に名前の登録も追加)

```
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys:[:name])
  end
```

そしてこれを`before_action`で設定すればこのメソッドを呼び出す事ができるので、これも覚えておくと今後の追加要素に適用可能。

#まとめ
deviseの導入について今回はまとめさせてもらった。よく使う機能だと思うので、知識的にまとめておけばこれからすぐに使えるようになるのではないのかな。
10.3 Rio で「アップデートサブスクリプション残りxx日」の表示がブリンクして IDE が起動しない場合の対処方法

10.3 Rio ではアップデートサブスクリプションの終了期限が近づくと
![Rio_IDE_Thema.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/a4c983ea-46cc-7614-970c-45d6ab76fcb0.png)

のように、あとxx日ですよーとお知らせしてくれます

が、こんなことが起こることがあります
![ideThema.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/bb2e0fe5-083c-94dd-a7c7-d48e1eee6a88.gif)

きやぁぁぁぁ IDE が起動しないっ！！

##発生する組み合わせ

- Windows の表示スケールがデフォルト (100%) 以外 (たとえば 175% など) に設定されている
- 10.3 の IDE テーマが有効な場合

##対処方法
そのいち、そのに、のいずれか、または両方とも行う

###そのいち
レジストリを修正して 10.3 の IDE テーマを無効にします

レジストリエディタ (regedit) を起動して
\HKEY_CURRENT_USER\Software\Embarcadero\BDS\20.0\Theme
の中にある Enabled のキーの値を 1 から 0 に変更します

ちなみに変更すると
![Rio_IDE_noThema.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/9778deae-71c7-e891-6c74-f5079cd6be04.png)
のような表示になります

###そのに
Windows のディスプレイの設定で、表示スケールをデフォルト (100%) など、現状より小さいサイズにする
VisualC#で自動補完を使わずにプロジェクト名やフォルダ構成を変更したときの復旧手順

#はじめに
この記事は、WPFをVisualStudioExpress2017で開発したときのメモです。
普段は簡単な社内ツールをWPFで開発しています。
(ちなみに、Qiita初投稿です。練習中です。)
#概要
VisualStudioでなんとなく開発を始めてしまうと、
プロジェクト名やフォルダ構成を変えたくなることがあります。
手動で変えた後に、参照や名前空間がおかしくなって怒られたので
どこを修正して動くようにしたのかメモを残すことにしました。
#復旧手順
##1. プロジェクト名と名前空間を変更する場合
名前空間の変更箇所は、次の3点
###.xamlファイル(App.xaml以外）
"x:Class"をプロジェクト名に合わせる。
###.xamlファイル(App.xaml）
"x:Class"と"xmlns:local"をプロジェクト名に合わせる。
（私は、xmlns:localの変更を忘れていて怒られた。)
###.csファイル
namespaceディレクティブをプロジェクト名に合わせる。
VS2017では便利機能として、[右クリック]->[名前の変更]とすると
ソリューション内の同一文字列を一気に変更してくれる。
##.slnファイルを移動する場合
.slnファイルのプロジェクト定義部分をエディタで編集する。

```text:hoge.sln
/~~~省略~~~/
Project("{00000000-0000-0000-0000-000000000000}") = "ProjectHoge", "<ProjectHogeまでの相対パス>", "{00000000-0000-0000-0000-000000000000}"
/~~~省略~~~/
```
#まとめ
思い付きで開発ツール作り始めても、いつでも修正できるとちょっと安心です。
配布用の綺麗なリリースフォルダを作成したり、slnファイルを別フォルダに移動したり
知ってしまえば意外と簡単に設定できるもんですね。
Nginx と uWSGI で CGI

Nginx と uWSGI で CGI を行う方法です。

<ol>
<li>Nginx の　設定に追加</li>

```text:/etc/nginx/nginx.conf
（省略）
        location /uwsgi {
                        include uwsgi_params;
                        uwsgi_pass 127.0.0.1:3031;
                }
（省略）
```

<li>サーバープログラム</li>

```py:/var/www/html/uwsgi/index.py
# ---------------------------------------------------------------
def application(env, start_response):
	start_response('200 OK', [('Content-Type','text/html; charset=UTF-8')])
	str_out = "<h1>Hello World</h1>"
	str_out += "こんにちは<p />"
	str_out += "<blockquote>"
	str_out += "May/08/2019<p />"
	str_out += "</blockquote>"
#
	return [bytes(str_out,'utf-8')]
#
# ---------------------------------------------------------------
```

<li>uWSGI の起動　（手動）</li>

```text:uwsgi.ini
[uwsgi]
master = True
socket = 127.0.0.1:3031
wsgi-file = index.py
stats = 127.0.0.1:9191
logto = uwsgi.log
pidfile = uwsgi.pid
```

起動コマンド

```bash
uwsgi --plugin http,python3 --ini uwsgi.ini
```

<li>ブラウザーで http://hostname/uwsgi にアクセス</li>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/7431bbfe-9d6f-afae-eca7-d9fe053330c4.png)

</ol>

## 確認したバージョン

```text
$ python --version
Python 3.11.2

$ uwsgi --version
2.0.21-debian
```

## 参考情報

[uWSGI Basic test](https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html?highlight=bytes#basic-test)

```text
Take into account that Python 3 requires bytes().
```
Yahoo APIでアクセストークン有効期限切れのレスポンスサンプル

## 本稿で学べること

* 有効期限が切れたアクセストークンでYahoo APIを叩いたとき、どのようなHTTPレスポンスが得られるか。

## 送信したHTTPリクエスト

```http:Request
POST /ShoppingWebService/V1/orderList HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Authorization: Bearer [[...有効期限切れアクセストークン...]]
Connection: keep-alive
Content-Length: 241
Content-Type: application/xml
Host: test.circus.shopping.yahooapis.jp
User-Agent: HTTPie/1.0.2

<?xml version="1.0" encoding="UTF-8" ?>
<Req>
　<Search>
　  <Condition>
　　  <OrderTimeFrom>20190101000000</OrderTimeFrom>
　  </Condition>
　  <Field>OrderId,Version</Field>
　</Search>
　<SellerId>****-********</SellerId>
</Req>
```

## 得られるHTTPレスポンス

```http:Response
HTTP/1.1 401 Unauthorized
Age: 0
Connection: keep-alive
Content-Type: application/xml
Date: Wed, 08 May 2019 07:20:20 GMT
Server: Apache
Transfer-Encoding: chunked
WWW-Authenticate: Bearer realm="yahooapis.jp", error="invalid_token", error_description="expired token"

<?xml version="1.0" encoding="utf-8" ?>
<Error>
    <Message>
        Please provide valid credentials. Bearer realm="yahooapis.jp", error="invalid_token", error_description="expired token"
    </Message>
</Error>
```

* 可読性のためHTTPボディのXMLをインデントしているが、実際は1行になっている。
* HTTPステータスは`401`になる。
* XMLは[Yahoo!デベロッパーネットワーク:エラーメッセージおよびコード](https://developer.yahoo.co.jp/appendix/errors.html)に準拠した構造になる。
* [Yahoo! ID連携のドキュメント「エラーレスポンス」](https://developer.yahoo.co.jp/yconnect/v1/api_access.html#webapi_request_error)に記載されたとおりの、`WWW-Authenticate`ヘッダが与えられる。

## 関連

* [Yahoo APIのアクセストークンとリフレッシュトークンの有効期限 - Qiita](https://qiita.com/suin/items/6a67c999cfdd613ba497)
【Node.js】package.jsonとpackage-lock.jsonについて簡単にまとめる

## 結局何が違うの
買い物に例えて分かりやすく言うと

#### package.jsonは買うものリスト
100円のりんごを**買いたい**と書かれている

#### package-lock.jsonは実際に買ってきた領収書
実際には120円のりんごを**買いました**と書かれている

## package-lock.jsonの役割
package-lock.jsonはnode_modules配下やpackage.jsonに変更があった際に自動で作成・変更されるファイル

package.jsonに書かれたチルダ `~` やキャレット `^` に従って
アップデートまたはインストールしたパッケージとバージョンが記載されている

#### チルダ `~`
書いてあるバージョン以下のアップデートは許容する

* ```~1 → 1.1.0```  OK
* ```~1 → 1.2.5```  OK
* ```~1 → 2.1.0```  NG

#### キャレット `^`
一番左のバージョン以外のアップデートは許容する

* ```^2 → 2.1.0```  OK
* ```^2 → 3.1.0```  NG


## package.jsonの役割
中身とその役割は以下のようになっている

```js

{
  "name": "hoge", // プロジェクト名
  "description": "hoge", // プロジェクトの概要
  "version": "0.0.1", // プロジェクトバージョン
  "homepage": "https://hoge/hoge",  // プロジェクトのホームページ.
  // 開発者情報
  "author": {
    "name": "hoge",
    "email": "hoge@hoge"
  },
  // リポジトリ情報
  "repository": {
    "type": "git", // バージョン管理システム
    "url": "git://github.com/kokudori/xxx.git" // リポジトリのURL
  },
  // バグ報告先
  "bugs": {
    "url": "https://hoge/hoge"
  },
  // ライセンス
  "licenses": [
    {
      // ライセンスのタイプ
      "type": "MIT",
      // ライセンス情報ファイルのURL.
      "url": "https://hoge/hoge"
    }
  ],
  "main": "xxx.js", // 最初に読まれるファイル. エントリポイント.
  // nodeとnpmのバージョン指定
  "engines": {
    "node": "10.15.3",
    "npm": "6.4.1"
  },
  // パッケージのライフサイクルの様々な時点で実行されるスクリプトの設定
  "scripts": {
    "test": "nodeunit hoge.js"
  },
  // npm install 時にインストールされるパッケージ
  "dependencies": {
    "hoge1": "^0.0.1",
    "hoge2": "~0.0.2"
  },
}
```
よくある疑問なので簡単にまとめてみた
やっぱりアウトプットすると頭が整理されるね
もっと Node.js 頑張っていきたい
RaspberryPi3でWindows10とシリアル通信を出来るまで

#環境
windows10
RaspberryPi3
PL2303HX搭載　USB変換COMケーブル
#端末側の設定
今回使用するシリアルケーブルは下記のシリアルケーブルです。
https://www.amazon.co.jp/exec/obidos/ASIN/B00K7YYFNM/simotin-22/

このケーブルはPL2303HXというチップが搭載されておりPL2303系が搭載されているシリアルケーブルはwindows8から自動で認識されなくなりました。そのため専用のドライバーを使用するPCに入れなければならないようです。では、下のURL先を見てプログラムをインストールしましょう。
http://www.ifamilysoftware.com/news37.html
因みに私のパソコンだと起動するたびに認識されず、毎回プログラムを動かさないといけないのはなぜなのでしょう...

再起動してシリアルケーブルが認識されていれば次に進みます。

#RaspberryPI3の設定

###Bluetoothを切る
私の場合、Bluetoothを使わないので予めBluetoothを切る設定をしました。
このBluethoothを切る設定はやらなくてもいいみたいです。

/boot/config.txtの最後に追記します。


```/boot/config.txt
 #turn bluetooth off
 dtoverlay=pi3-disable-bt
```
はい、これで保存　再起動でBluetoothが切れます。

##シリアル通信を有効にする
まず、/boot/config.txtに以下のように追記します。

```/boot/config.txt
enable_uart=1
```

###シリアルコンソールを無効にする
まず、/boot/cmdline.txtの中身を確認しましょう。そしてもし以下のような文があったら消しておきましょう。

```/boot/cmdline.txt
console=serial0,115200
```


ここで、余計なものを消すや追記するといったことをしてしまうと次起動しようとした際、起動しないということになるので注意しましょう。

さらに、シリアルコンソールのデーモンを停止して、無効にもしておきましょう。
下のようにコマンドを打ちましょう

```
$ systemctl stop serial-getty@ttyS0.service 
$ systemctl disable serial-getty@ttyS0.service
```

ここで再起動をかけましょう。
そして先ほどドライバーを入れたPCでteratermを立ち上げてボーレートは115200にして繋げましょう。
RaspberryPIのほうでは下記のようにコマンドを打ちましょう。

```
$ stty -F /dev/serial0 115200
$ echo "Hello" > /dev/serial0
```

これで端末側にHelloと表示されたらシリアル通信は成功です.
【Blockchain】Truffle.jsフレームワーク

`Ethereum` には `SmartContract` の開発、テスト、デプロイをするためのフレームワーク `Truffle.js` をインストールして、利用してみたいと思います。

## インストール

https://www.truffleframework.com/truffle

```sh
npm install truffle -g
```

## プロジェクト作成

任意のプロジェクトフォルダを作成し、次のコマンドをターミナルで実行します。

```sh
truffle init
```

すると、プロジェクトの基本構造が作成されていることを確認できます。

```
任意のプロジェクトフォルダ/
├─ contracts
│  └─ Migrations.sol
├─ migrations
│  └─ 1_initial_migration.js
├─ test
└─ truffle-config.js
```

## Compile

次のコマンドで `contracts/` フォルダ内にある全ての `SmartContract` をコンパイルします。
コンパイル結果は、 `build/` フォルダに出力されます。

```sh
truffle compile
```

## Deploy

`truffle-config.js` にデプロイ先のネットワークを設定します。
この例では、ローカル環境(Ganache) を設定します。
※ `development` は、任意のネットワーク名です。

```js
module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*",
      gas: 5000000
    },
  }
}
```

そして、次のコマンドでデプロイします。

```sh
truffle migrate --network development
```

## Console

`Truffle.js` には、コンソール機能があり、ネットワークに接続をすることができます。

```sh
truffle console --network development
```

また、コンソールには `Web3.js` のライブラリを使うことができるので、ネットワークにいろんなリクエストをすることができます。

- アカウントリストを取得

```sh
web3.eth.getAccounts(function(err, dat) { accounts = dat });
```

- 指定のアカウント残高を取得 (単位: Wei)

```sh
web3.eth.getBalance(accounts[0]);
```

- 変換 Ether → Wei

```sh
web3.utils.toWei('1', 'ether');
```

- 変換 Wei → Ether

```sh
web3.utils.fromWei('1000000000000000000', 'ether');
```

- トランザクション (`アカウント0` から `アカウント1` へ `15ether` を移す)

```sh
web3.eth.sendTransaction({from: accounts[0], to: accounts[1], value: web3.utils.toWei('15', 'ether')});
```

- トランザクションの詳細確認

```sh
web3.eth.getTransaction('{トランザクションハッシュ}');
or
web3.eth.getTransactionReceipt('{トランザクションハッシュ}');
```

- デプロイした `SmartContract` を取得・利用

```sh
SampleContract.deployed().then( c => instance = c );

# そしてinstanceの機能を呼ぶには
instance.{関数}({引数,...});

# アカウントとGASを指定するには
instance.{関数}({引数,...}, {from: {アカウント}, gas: 150000});
```
分散キーとソートキー

#投稿のきっかけ
仕事でRedshiftを用いてデータベースを構築する必要があり、分散キーとソートキーという単語に引っかかった。
この記事は、自習用の備忘録として、そしてQiitaへの初投稿としてお試しで投稿してみる。

#参考サイト
[Redshiftの設計前に知っておくべき分散キーとソートキーの役割](https://tomokazu-kozuma.com/role-of-distkey-and-sortkey-that-should-be-known-before-redshift-design/)
[AWSデータベース開発者ガイド](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_Distributing_data.html)


#ノードスライス
本題の分散キー・ソートキーに入る前に、まずこの「ノードスライス」という単語は避けて通れないらしい。
###ノードスライスとはなんぞや
定義は「ノード数×CPU数」らしい。
つまりは１つのノード内に多量のデータを詰め込んで、それを並列CPUで処理する。。。その各計算単位？？？
→多分あってる。

AWSのガイドの言葉を借りると、
**「テーブルにデータをロードすると、そのテーブルの分散スタイルに従って、Amazon Redshift がテーブルの行を各ノードスライスに分散」**するらしい。
分散させた各ノードスライス１つ１つにCPUが割り当てられるイメージ？

この仕組みによって、Amazon Redshiftでは大量のデータを高速に扱うことができるらしい。

#本題
###分散キーとはなんぞや
- ノードスライスにデータを振り分ける時の基準となるカラム
- 分散キーは１テーブルに対して１つしか設定できない
- 分散キーに指定されたカラムの各レコードのハッシュ値ごとにデータを分散させている
    - ここでいうハッシュ値が何を指しているのかが今の自分にはわからない
- 分散の仕組みは「EVEN」「KEY」「ALL」の３つ

###ソートキーとはなんぞや
- データの並び順を決める時に基準となるカラム
- 最大４００個まで指定できる

#テーブル設計時に気を付けること
###分散キー選定
- **分散キーに設定するカラムの値は均一に分散しているか**
    - 各値のレコードごとにグルーピングされて、そのグループ（ノードスライス）ごとに処理が行われるため、ノードスライスごとに処理時間の差が生じ、結果無駄が生じてしまう。
- **ノードスライス数よりも値の種類が多いか**
    - ノードスライス数の方が多い場合、データが割り当てられないノードスライスが生じ、分散機能を十分に発揮できない。
- **WHERE句の最初で指定されるカラムでないか**
    - WHERE句でフィルタリングされると、ノードスライスに割り当てられるデータの種類が限定されることになり、結果、分散機能を十分に発揮できなくなる。
    
###ソートキー選定
- **ORDER BY,GROUP BYなどで指定されるカラムか**
    - ソートキーに指定したカラムに対してORDER BY, GROUP BYをかけると、クエリ実行時のソート処理時間を短縮できる
        - （なぜ短縮できるかの仕組みは別途調べたい）
- **WHERE句に指定して、ゾーンマップを有効活用できるか**（なんのこっちゃ）
    - ソートキーに指定したカラムの最小値と最大値をメタデータとして持つ　←　これがゾーンマップ
    - ゾーンマップの仕組みがあるので、ソートキーに指定したカラムをWHERE句の最初に指定すると、検索処理を短縮することができる。
    - ソートキーには「COMPOUND SORTKEY」「INTERLEAVED SORTKEY」の２種類があり、これらの特徴も理解しながら設定順などを考慮する必要がある。


#まとめ
分散キーは、Redshift特有の（特有なのか？）ノードスライスという仕組みを有効活用するための決め事
ソートキーは、ソート及び検索処理を効率的に行うための決め事

という理解。

間違ってたら詳しい人に教えを請いたい。
proxyやファイヤーウォールなどが設定された場所に設置してあるマシンに外部からアクセスする方法

# ngrokを使ってproxyやファイヤーウォールなどが設定された場所に設置してあるマシンに外部からアクセスする方法

proxyやファイヤーウォールが設置されてて、しかもsudo権限がないPCに外部から接続する方法...ありました！　筆者の実行環境はubuntuかMacです。

## 結論：ngrok使うといいです
ngrokを下記のurlからダウンロード

https://dashboard.ngrok.com/get-started


接続したマシン内で、ngrokが保存してあるフォルダで以下のコマンドを実行する。

```
./ngrok tcp 22
```

外部のマシンから、sshで接続したい時は以下のコマンドに変更を加え、打ち込む。

```
ssh ユーザ名@0.tcp.ngrok.io -p ポート番号
```

## localhostのサーバーを外部に公開することもできる
ngrokは試作段階のWEBサイトをlocalhostで立ち上げた後に、外部に公開し、どのように動くかを確認するために使われるケースが多いと思います。
ブラウザのブックマークにhtmlファイルを保存

#Data URI Scheme#
```
data:text/html,<html>hoge</html>
```
ちょっと上の文字列をアドレスバーにコピペして移動してみて下さい、大丈夫です怪しいものではありません。

URIスキームは一見ただの文字列ですが、ページに画像やhtmlを埋め込めるすごいやつです。
実はChrome等のブラウザではアドレスバーに入力するだけでそのデータを閲覧することができます、即ちブラウザのブックマークにhtmlファイルを保存できるということです。
容量に制限がありますが、オフラインでも使用できますしブックマークの同期ができているならスマホからでも開くことができます。
CSSもJavaScriptもhtmlに埋め込めばしっかり動作します。

こういった簡単なアプリも作れます。
・[メモ帳](https://yazoot.github.io/SimpleNotepad/)
・[タイマー](https://yazoot.github.io/CountdownTimer/)

#URIスキームの作り方#
`data:text/html,`のあとにhtmlの中身をくっつければURIスキームとして扱われます。
例えば以下の文字列をアドレスバーに入力し移動すると、簡単なメモ帳が開きます。

```:簡単なメモ帳
data:text/html,<html contenteditable>
```

ただしCSS等で使われる`#`はコメントとして扱われるようなのでBase64に変換するほうが良いでしょう。
URIスキームでBase64を扱う場合、`data:text/html;base64,`のあとにBase64に変換したhtmlをくっつけます。
上のメモ帳をBase64版にした場合、次のようになります。

```:Base64でメモ帳
data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPg==
```

#Base64への変換の仕方#
ではBase64へはどうしたら変換できるでしょう?
JavaScriptの場合、次の関数で可能です。

```javascript:文章をBase64へ変換する関数
const encode = text => {
    return btoa(unescape(encodeURIComponent(text)))
}
```

逆にBase64から普通の文字列に戻す場合は次の関数でできます。

```javascript:Base64から文章へと戻す関数
const decode = base64 => {
    return decodeURIComponent(escape(atob(base64)))
}
```

#Base64エン/デコードサイト#
しかしJavaScriptをブラウザ上で実行できるとは言え、いちいちコピペするのも大変なのでWebページとして公開します。
・[Base64 En/Decoder](https://yazoot.github.io/Base64EnDecoder/)

これもひとつのhtmlとして出来てるのでURIスキーム化してブックマークに保存できます。
是非ご利用ください。
Litghttpd で localhost では繋がるのにホスト名を指定すると"400 Bad Request"

## Litghttpd で 400 Bad Request エラー

> `docker-compose` 内に立ち上げた `Lighttpd` の Web サーバーに他のコンテナから `http://sample_1/` と**ホスト名（コンテナ名）で `curl` すると `400 Bad Request` エラーが返ってくる**。

しかし、IP アドレス（`http://172.23.0.4/`）だと `cURL` できるし、ホスト名の `sample_1` には PING は通る。

```shell-session:エラーの現象
$ # Localhost で取得 → OK
$ curl http://localhost/
<p>Hello World!</p>

$ # IPアドレス で取得 → OK
$ curl http://172.23.0.4/
<p>Hello World!</p>

$ # ホスト名で取得 → NG
$ curl http://sample_1/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>400 Bad Request</title>
 </head>
 <body>
  <h1>400 Bad Request</h1>
 </body>
</html>

$ # ホスト名宛に PING → OK
$ ping -c 3 sample_1
PING app2-php (172.23.0.4): 56 data bytes
64 bytes from 172.23.0.4: seq=0 ttl=64 time=4.026 ms
64 bytes from 172.23.0.4: seq=1 ttl=64 time=0.206 ms
64 bytes from 172.23.0.4: seq=2 ttl=64 time=0.203 ms

--- sample_1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.203/1.478/4.026 ms
```

- [「lighttpdとは」の Qiita 記事](https://www.google.com/search?q=site:qiita.com+lighttpd%E3%81%A8%E3%81%AF) @ Google
- 「[lighttpd](https://ja.wikipedia.org/wiki/Lighttpd)」@ Wikipedia

## TL;DR

> **ホスト名として利用できない文字が使われています**。RFC2616 および RFC2396 で定義されている文字である必要があります。

ドットのないホスト名（トップレベル）は `[a-zA-Z0-9-]` のみであるため、この場合 **`_`（アンダースコア/アンダーバー）が使われていることが原因**です。

```bash:RFC2396
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
```

## TS;DR

`docker-compose` で、`Hello World` タグを返すだけのコンテナ名に `sample_1` と付けて、他のコンテナから `cURL` したところ取得できなくなりました。

`docker-compose` は、コンテナ名（`container_name` ディレクティブ）を指定すると、それをホスト名としても割り当ててくれます。

`lighttpd` は起動時にホスト名のチェックを行うらしく、RFC に準拠していないホスト名によるアクセスは CGI に渡さないようです。

コンテナ名（ホスト名）のアンダーバーをハイフンに変え `sample-1` に変更すると、他のコンテナからも HTTP リクエストのレスポンスをするようになりました。

こんなことあるのか。。。

## 参考文献

- [Bug #2258 "Bad Request"](https://redmine.lighttpd.net/issues/2258) | チケット | Lighttpd.net

### RFC2616

```text:RFC2616より抜粋
14.23 Host
   Host = "Host" ":" host [ ":" port ] ;

3.2.1 General Syntax
   RFC 2396 [42] (which replaces RFCs
   1738 [4] and RFC 1808 [11]). This specification adopts the
   definitions of "URI-reference", "absoluteURI", "relativeURI", "port",
   "host","abs_path", "rel_path", and "authority" from that
   specification.
```

### RFC2396

```text:RFC2396より抜粋
3.2.2. Server-based Naming Authority

      host          = hostname | IPv4address
      hostname      = *( domainlabel "." ) toplabel [ "." ]
      domainlabel   = alphanum | alphanum *( alphanum | "-" ) alphanum
      toplabel      = alpha | alpha *( alphanum | "-" ) alphanum
プログラミング学習の基本8ステップについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257568/eecbecde-7325-b4c0-2729-27c36482fb34.png)

こちらの本を読んで個人的にも徹底したいと感じたのでまとめ

## プログラミング学習の基本8ステップとは
1. プログラミングを学ぶ目的を作る
2. 自己評価を上げる
3. 作りたい目標を決める
4. 作るために何を学習すればいいか知る
5. 作りたい物のための知識を得る
6. 得た知識を組み合わせて作品を作る
7. 作品を発表して改善する
8. 人に教える

## プログラミングを学ぶ目的を作る
上から順に考える。

- なぜプログラミングを学びたいのか。
- 何を作りたいのか。
- 何を学ぶか。

### 指標
- 今達成が想像できないレベルのものか。
- 誰かから言われたとかではないものか。
- 目的達成を想像すると好奇心が高まるか。

## 自己評価を上げる
**行動を断念しないために**高く保つことを意識する。

### 指標
- 目的を達成する想像と、現実とのギャップを把握できているか。
- 過去ではなく、未来を根拠に行動できているか。
- 自己評価を下げてきそうな人に目的や目標を言っていないか。
- 自己評価の高い環境に身を置いているか。
- 失敗した時に不必要に心理的負荷を掛けていないか。

## 作りたい目標を決める
具体的目標が既にあればそれを、抽象的目標な現状であれば周辺知識->周辺技術をつけることを目標にして具体的目標を見出す。

### 指標
- クローン作品
- 身近な課題解決作品
- 隣人の課題解決作品

## 作るために何を学習すればいいか知る
学習のスキルマップを作る

### 指標
- 作りたいものを中心にする
- 作りたいものからそれに必要な学習分野を派生させる

## 作りたい物のための知識を得る
必要なものを実際に動かしつつ学習する
学習とは**行為とその認識に対する予測結果にズレがあった時に起こる**というのを把握しておく

### 指標
- 書籍
- WEBページ
- WEBサービス
- プログラミングスクール
- 大学

## 得た知識を組み合わせて作品を作る
どんなアプローチをすれば目標の作品つながり、得られるものもあるかを考える

### 指標
- 作りたい作品に近いサンプルを作る
- 作りたい作品を部品に分ける
- 作った作品から知識の穴を認識する

## 作品を発表して改善する
フィードバックが更なる学習に繋がる事を認識し、公開方法を知る

### 指標
- WEBサービスに登録して公開する
- コンテストに応募する
- 市場に公開する
- 知人に使ってもらう
- ブログを書く

## 人に教える
キャリアに関わらず実践できる範囲と内容が存在する事を認識し、実践する

### 指標
- 学んだ内容を人に教える
- 昨日できるようなった自分を元に今日できない誰かを助ける
- 教えることで自分も学ぶ
- 整理して咀嚼して分かり易くする
- 思いきって教える側の立ち位置となってみる

## 書籍情報
北村拓也. 独学で身につけるためのプログラミング学習術
https://amzn.to/2Vh6jEZ

## 雑感
この例が全てではないけど取り組みがあっているか不安な時にこういうの読むと良さそう
LaravelのログをJsonで吐き出せる様にする方法、AWSのCloudWatchを使おう。

# AWSCloudWatchでログを見やすくするため、Laravelのログをjsonで出力

この記事はこちらの記事を参考にしました。
こちらの記事では、ログフォーマットを変更する方法について記載されており。
そちらのコードの必要な部分だけを抜粋し、ログファイルをjsonに変更する方法を紹介します。
https://qiita.com/nuuuuume/items/a6bcf340c50f18cfb71c

## 前提：設定ファイルにjsonと書くだけでjsonになるんじゃないの。
様々なサイトを見てみましたがどうやらそういった設定はない様です。
ログをjsonで出力するには自分でログを整形する必要がある様です。

ちなみにLaravel ver 5.7です。

## ログをjsonに変更する手順
今回触るファイルは大きく分けて3つです。

* config/logging.php ＜元からあるファイル
* app/Logging/CustomFormatterApply.php　＜作ってください
* app/Logging/LineExFormatter.php　＜作ってください


## app/Logging/CustomFormatterApply.php

こちらのコードは参考にした記事のコードそのままですorz

```php:CustomFormatterApply.php
<?php

namespace App\Logging;

use App\Logging\LineExFormatter;
class CustomFormatterApply {
  public function __invoke($logging) {
    $exFormatter = new LineExFormatter();

    foreach ($logging->getHandlers() as $handler) {
      $handler->setFormatter($exFormatter);
    }
  }
}
```

## app/Logging/LineExFormatter.php
ここが実際にjsonに変換している部分です。
eval(\Psy\sh());などで$recordの内容を確認するとわかりますが。
エラーやメッセージが発生した時の情報全てがここに詰まってます。

```php:
<?php
 namespace App\Logging;
 use Monolog\Formatter\LineFormatter;
 class LineExFormatter extends LineFormatter {
  public function format($record) {
    return json_encode($record);
  }
}
```


## config/logging.php
このファイルの中にある daily の部分にtapで作成したCLASSを配列で渡す

```php:config/logging.php

'daily' => [
    'driver' => 'daily',
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
    'tap' => [App\Logging\CustomFormatterApply::class],
    'days' => 14,
],
```

## 確認してみましょう
適当なControllerの適当なアクションにコードを挿入

```php:test.php
use Log;
Log::info('Test Log Show!!!!');
```

出力先は開発環境の中のこちら

```zsh:file
storage/logs/laravel-2019-05-08.log
```

## 出力結果
無事json形式で出力されました。

```json:result
{"message":"Test Log Show!!!!","context":[],"level":200,"level_name":"INFO","channel":"local","datetime":{"date":"2019-05-08 15:46:04.104462","timezone_type":3,"timezone":"Asia\/Tokyo"},"extra":[]}
```
[備忘録]Dockerコマンド

## server接続 
`ssh makimatsun`

## Dockerコマンド
dockerビルド `docker build -t sync-sheet .`
dockerイメージセーブ `docker save sync-sheet > sync-sheet.tar`
dockerイメージコピー　`scp sync-sheet.tar makimatsundocker:~/`
現在のprocess確認 `docker ps`
goを編集した場合は `GOOS=linux GOARCH=amd64 go build main.go`

## Linuxコマンド
強制的に `sudo`
管理者権限 `chmod 755 backup.sh`
解凍 `gzip -d pdb_2019-05-07_015204.sql.gz`
サービス有効 `sudo systemctl enable dbbackup.service`
サービス状態 `sudo systemctl status dbbackup.service`
サービス開始 `sudo systemctl start dbbackup.service`
GitHubでfork元のプライベートリポジトリに対するアクセス権限がなくなった場合の振る舞い

# 結論

- アクセス権限がなくなった個人アカウントからforkしたリポジトリはGitHub上から削除されます。
- ローカルにcloneされたリポジトリはそのままです。

# 気になった状況

1. 組織アカウントから個人アカウントへの紐づけを解除した。
1. その個人アカウントは組織アカウントのプライベートリポジトリをforkしていた。
1. 紐づけを解除した後、fork元とfork先のリポジトリはどうなるのか？

# 情報源

https://help.github.com/en/articles/what-happens-to-forks-when-a-repository-is-deleted-or-changes-visibility
'RedisException' with message 'Redis server went away' が出たときはそもそもRedisに接続できていない時もある

以下のようなコードを書いていたら…

```php
$redis = new Redis();
$redis->connect($host, $port);
$hoge_value = $redis_conn->get('hoge_value');
```

Redisから値を取得する３行目で次の例外が発生した
`FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught exception 'RedisException' with message 'Redis server went away'`
いろいろ調べたんだが情報も少なくどういうわけで値が取れないのかわからなかった。
接続できているのに値を取ることができないってどういう場合か思いつかない…

が結局はRedisへ接続できていなかった。
`$redis->connect($host, $port);` の戻り値を調べたところ `false` が帰ってきており、接続ができていない。自分の場合はAWSのセキュリティグループの設定をミスっており、該当のRedisへ接続ができていなかった。セキュリティグループを見直したところあっさりつながった。

エラーメッセージ的に、接続できたけど接続がどっかいったみたいな言い方だったので解決に時間がかかってしまった。