OmniAICreator/Qiita-1.07M huggingface dataset:
EV3 と Python3

ある講義で EV3 を用いましたが様々な要因により，なかなか厄介だったので，私が初めに出会いたかったドキュメントを残しておきます．

# EV3 の OS
プロジェクトのホームページは [ev3dev](https://www.ev3dev.org/) です．
やる気がある方や初めからやる方はここから OS のイメージをダウンロードして SD カードに書き込みます．
EV3 の性能的にもしばらく放置したときは， `sudo apt update && sudo apt upgrade` するよりも大人しく OS 落としてくると色々といいです．

ちなみに弊学の講義で用いたものは Python3 でライブラリを扱えないため，Python3 で開発したい場合はこの作業がほぼ必須でした．

# Python3 でプログラミング
[GitHub: ev3dev/ev3dev-lang-python](https://github.com/ev3dev/ev3dev-lang-python) のライブラリが入っているので用います．
`ev3dev.ev3` でも動きますが， `ev3dev2` を用いる方が良さそうです．
ドキュメントなどもありますが，最後にはソースコードを見ることになることもあると思うので紹介．

ちなみに，[Python language bindings for ev3dev](https://python-ev3dev.readthedocs.io/en/ev3dev-stretch/index.html) が ev3dev2 のリファレンスサイトです．
[python-ev3dev Documentation](https://media.readthedocs.org/pdf/python-ev3dev/latest/python-ev3dev.pdf) という PDF のドキュメントもあるので合わせて参照すると良さそうです．

# 備忘録
## モータがうまく制御できない（暴走する）
弊学の講義に用いたレゴロボットは，モータの回転検知センサが壊れていて，現在の回転数のフィードバックが得られず全速前進する例が確認できました．
ガチャ運がなかったと思って他の人のを借りるか交換しましょう．

## ev3dev2 で `SoundSensor` が使えない
使えませんでした (ev3dev 2.0.0 beta 3)．
使えないときは，`ev3dev` (無印) から扱うと良さそうです (ただし弊学の演習のライブラリのバージョンではバグがあり，更新するかライブラリの書き換えが必要[^1])．

[^1]: ハイフンとアンダースコアをあれやこれやすると動くようです．

## モータのページの P, I, D とは？
[モータのＰＩＤ制御法](http://www.picfun.com/motor05.html) に書いてあることだと思います．
詳細はあまり調査していませんので悪しからず．
VEGA Frontier Edition + ROCm TensorFlow で waveglow-tensorflow で text-to-speech する

漢なら VEGA Frontier Edition(memory 16 GB) で waveglow-tensorflow 動かしたいですね!

やりましょう!

できました.

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">VEGA Frontier Edition で waveglow tensorflow 学習, 順調に 3 日連続稼働してよいが, rocm-smi で setsclk 1 で 110W くらいにしていても GPU 温度 80 度で, 冬は暖房として良いですが夏場はつらいので水冷 VEGA FE 777,777 枚くらい調達したい. <a href="https://t.co/X3hI3UdLLq">pic.twitter.com/X3hI3UdLLq</a></p>&mdash; Syoyo Fujita ⚡️ No ray tracing No life (@syoyo) <a href="https://twitter.com/syoyo/status/1094589858763268096?ref_src=twsrc%5Etfw">2019年2月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##  repository

ありがとうございます. 

https://github.com/b04901014/waveglow-tensorflow

VEGA Frontier Edition であればデフォルトの設定でメモリ足りて動くのを確認しました.

ROCm 2.1 + ROCm TensorFlow 1.12 で動かしました.




## 結果

waveglow-tensorflow の hparams でのネットワークサイズはそのままで学習を回しました.
VEGA FE は 100W くらいに powerlimit してだいたい 5~6 日まわして Epoch 35 まで進みました.
clyp に生成された sample をアップロードしました.


https://clyp.it/i50tahjw
https://clyp.it/tetkor3w
https://clyp.it/otspccf3
https://clyp.it/mbm5h0dp
https://clyp.it/olk0kmfw

アーティファクトはありますが, なかなかいい感じの結果が得られたような気がします.
より学習を回せば精度があがりそうですが VEGA FE 1 枚だと計算に時間がかかって try & error がやりずらいですね.

## TODO

* VEGA FE 複数枚で学習を試す(今なら ebay で 5~6 万円くらいで手に入るか?)
* 空冷版だと powerlimit しても, 学習時 GPU 温度 80 度超えになってつらいので水冷化 or 水冷版 VEGA FE ほしい
* Radeon VII(16 GB mem) で学習をためす
* Radeon VII 複数枚で学習を試す
* Radeon Instinct で学習を試す
* RX470 など Polaris 世代の 8GB mem を持つ GPU 複数枚で学習を試す(hparams でネットワークサイズを減らすの必須)
ElmerGUIへ様々なビルトインソルバーを導入する(メモ)

Elmerには様々なソルバーが用意されているが
デフォルトだと何故かElmerGUIから選択できない
簡単に導入できるため方法を解説する
対象バージョン　Elmer8.2, Elerm8.3

# Elmerに用意されているソルバー一覧

流体解析では乱流モデルであるk-εモデルやk-ω SSTモデルなどもある。

CAELinux2018内のElermGUI(File - Definitionsから閲覧可能)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/76c0cd6a-1e8b-69c2-f9ed-9270e2074004.png)

# ElmerGUIから選択できるソルバー

以下はElmerGUIから選択できるソルバーだが、主要なソルバーしか選択できない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/d515963e-edbd-00db-2cd7-cdbe852cf746.png)

# ソルバーの導入方法

ElmerGUIの設定が記述されたxmlファイルを開くことで導入できる

1. ELmerGUIを起動する

2. File - Definitions

3. Elmer Definitions File EditorからAppendをクリックする

4. 以下のフォルダから選択 C:\Program Files (x86)\Elmer 8.3-432ee0dd\share\ElmerGUI\edf-extra
　実際の場所はインストール先に依存する

5. xmlファイルを選択すると再起動などをすることなくソルバーを選択できるようになる

## xmlファイルの書式
ElmerGUI manualの「C ElmerGUI definition files」からどのような書式で書かれているかがわかる。
自作する際に参考となる。
メモ：flutterでflutter_local_notificationsを使うためのManifest設定

- flutterでflutter_local_notificationsを使って、スケジュール設定された通知などを行いたい時、コードを書くだけでなく、androidの場合はmanifest設定も必要なので、調べた内容とともにメモ。基本的には公式ドキュメントにも記載されているので、そちらを読んでもらった方が正確だが一応。あと、pluginに同梱されているexampleプロジェクトにも同じ設定があるのでそれを見てもいい。

[flutter_local_notifications | Flutter Package](https://pub.dartlang.org/packages/flutter_local_notifications#android-integration)

- スケジュール通知を行う場合は、androidでは以下のmanifestで権限設定をする必要がある。ちなみに、BOOT_COMPLETEDというのはAndroidOSの起動時にブロードキャストされる「android.intent.action.BOOT_COMPLETED」というイベントのこと。

```
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
```

- また、以下はそのスケジュールを受け取るためのレシーバー。

```
<receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
```

- あとスケジュール通知を表示するためには、以下のレシーバーをmanifestに設定する必要がある。

```
<receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
```

- 通知パターンでバイブレーションを使う場合は以下のmanifestを設定する必要がある。

```
<uses-permission android:name="android.permission.VIBRATE" />
```
ビジネスでインパクトが出せるデータサイエンティストになるには 

[Retty岩永様](https://twitter.com/pseudo_finite)より
経営システムNo.2 2019年1月
発行元：[日本経営工学会](http://www.jimanet.jp/)
をご好意で頂きました。
その中で下記記事について感想を述べさせていただきます。

***P127「ビジネスでインパクトが出せるデータサイエンティストになるには」***

**はじめに**
　私はSierに所属するDWH/BI/ETLを専門とした中堅SEです。
　流行に乗っかる形で統計検定２級を取った程度で、データサイエンティストというよりは、データ分析者に近いのですが、業務上関連する点もあり、感じた点を書かせていただきます。

**２．データサイエンティストが力を発揮する場**
　事業ドメイン・サービス規模が大きければインパクトが大きいという点は同意します。
　ビッグデータが社内に蓄積されていて手掛けやすい、成果が目に見えやすいという点が浮かびましたが元をたどれば事業ドメイン・サービス規模に起因すると考えられます。
　事業ドメイン・サービス規模という観点ではIoTと関連が高い製造メーカーが浮かびましたが、PoCはおろか、データ入手にも数か月以上の労力を強いられることが多いのでいちがいに発揮できるとは言い難いでしょうか。
　これまで製造メーカーの情報システム部門の方とお話ししてきましたが、やはり製造現場の理解・協力を得るのが大変という声が多かったです。
　業種であげるとすれば、IT企業、特にEC・サービス系で歴史深めのベンチャー企業でしょうか。他にはITリテラシーの比較的高い外資系企業もそれなりに活躍する場はありそうです。
　
**３．課題設定**
　課題設定が肝という点は同意します。
　経験上、ゴールを設定し、そこから逆算するかたちでプロセスを計画していくほうが、認識のずれも起きにくく、成功する確率は高いと考えていることが理由です。何かで読んだ知識ですが、データサイエンティストが１つの分析案件に所要する期間は２～３か月くらいが多いらしいので、1人で年間４～６つの課題にしか取り組めず、それだけ優先度・取捨選択の精度が問われると考えます。

**４．解決方法の設計**
　Sier的にはアーキテクチャ設計・実現方式検討（言語、フレームワーク）に該当し、使い慣れたものを使うか、新しいことにチャレンジするか、技術者としてやりがいが出てくるところで、共感できました。
　Sierの視点からみると、精度＝品質、運用コスト＝工程＋原価と置き換えるとイメージしやすかったです。

　「ビジネスの上で仕組み自体を変えて問題を簡単にしてしまおうという発想を
実践するのはちょっとした訓練と経験が必要である。」
　SierとしてPL/PMを担当している立場からも、この考え方は大事だと思います。プロジェクトでコスト・工程上実装が難しい要求が発生したとき、代替策を客先に提示し調整を行う場合があり、それと似ていると感じました。
　
　人間どうしても思い込みがあったり、熱中するあまり視野が狭くなってしまったりすることが多々あるので、そうした局面で全体を客観的に俯瞰できる能力がデータサイエンティストでも必要なのかなと思いました。

**５．検証**
　施策の検証ですが、これは必ずやっておくべきと思います。
　検討の結果、提案した施策が実施されないという場合もあると思いますし、一通りの形でアウトプットを残すことに意義があると考えました。
　
**６．育成**
　これは難しい問題である点は同意します。データサイエンティストという専門職がバズワード化しており、定義が広範囲なことも要因ですが、日本企業の情報系システムは欧米よりもワンテンポ以上遅れていることが大きいです。
　定型レポート、非定型レポート、ダッシュボードくらいで良い、機械学習など高度な計算処理までは求めていないという企業が非常に多く、そうしたITリテラシーの低さが、実務経験の場を奪ってしまっており、結果、データサイエンティストが育ちにくい現状につながっていると考えます。
　今の子供は幼少時からＰＣ／タブレット／スマホに触れる機会が多くITリテラシーも自然と高くなるので、経営者層・管理職の世代交代が進むにつれて解決されるだろうなとは思っています。もちろん企業内での地道な啓蒙活動は必要です。
　一方で巷ではDataRobotというデータサイエンティストの存在が危うくなるような機会学習の自動化ツールが出回り始めており、今後どうなっていくのかSierとして注視していこうと思っています。
　
**７．まとめ**
　データサイエンティストのブームは間違いなく収束すると思います。そうなっても、他のバズワードに目移りすることなく、自身を見失うことなく地道な努力・研鑽を積み重ねていくことが大事であり、データサイエンティストとしてインパクトを残していけるのかなと思いました。
　
**最後に**
　こうした論文誌は初めて目を通したのですが、ベイジアンネットワーク、アクティブラーニング等ぜひ購読したいと思わせるような興味深い内容が満載です。
情報収集はネットや書籍で行うことが多いのですが、論文でも、専門的かつ先進的な知識・手法を調査できると知りえただけでも大きな発見でした。

　最後になりましたが、本書を提供いただき、自分なりに考えを整理する機会をくださった岩永様にお礼を申し上げます。
npmとは

なんとなくCLIなどで打ち込んでる`npm`。
正直よくわからずに使っているところがあったので、概要を調べまとめてみた。

## npmとは
- Node.jsのパッケージを管理するもの
- *Node Package Manager* の略  

### Node.jsとは
JavaScriptは本来クライアントサイドで動く言語。HTMLで書かれたページに動きをつけたりする。

**Node.js**はサーバサイドで動くJavaScriptである。

#### メリット
- 大量のデータ処理が可能
  - ノンブロッキングI/Oモデル
  - C10K問題(クライアント1万台問題)(*)に対応
- メモリの消費が少ない
  - イベントループ
- 処理速度が早い
  - Google V8 JavaScript Engine
- サーバサイドでjsが使える

> **C10K問題(クライアント1万台問題)**(*)
HWの性能上は問題がなくても、クライアントの数が多くなりすぎると効率が悪化し、サーバがパンクする問題のこと。

### Packageとは
npmが管理する*package*とは、Node.jsの予め用意された便利な機能をまとめたもの。
ライブラリみたいな感じか。

（例）Express, promise, async, Socket.io


## インストール・使い方
### Node.js, npmインストール
npmはNode.jsをインストールすると一緒についてくる。

1. homebrewインストール
homebrewインストールする。


2. nodebrewインストール
nodebrewをインストールする。

```
brew install nodebrew
```

パス通す。

```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
```

3. Node.jsインストール

インストール可能なバージョンを確認。

```
nodebrew ls-remote
```

なんかいっぱい出てくるので、よくわからないときは最新版をインストール。↓

```
nodebrew install-binary latest
```

4.インストールされたのを確認
以下コマンドでインストールされたnode.jsのバージョンが確認できる。

```
nodebrew ls

v11.3.0

current: none
```

使うバージョンを指定。

```
nodebrew use v11.3.0
```

バージョン確認↓  

```
node -v
```

5.npmのバージョン確認
以下で、npmのバージョン確認する。  

```
npm --version
```

### npmでパッケージインストール
以下コマンドでnpmでパッケージをインストールできる。

```
npm install パッケージ名
```

以下コマンドでインストール済のパッケージを確認できる。

```
npm list -g
```

### package.jsonについて
npmではpackege.jsonというファイルで依存関係のあるパッケージを一括インストールできたり、タスクも管理できる。

必要な設定事項を記述することで、簡単にプロジェクトの管理や環境構築を行うことができるのだ。

以下コマンドで、カレントディレクトリにpackage.jsonを生成する。  

```
npm init
```


## まとめ
npmとは何かについてざっと調べたことをまとめた。
package.jsonへの記述や具体的な使い方の例などは、今後調べてまとめるかもかも。
Python ライブラリ Pandas で基礎統計量を計算する方法

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88460/2a800a02-4314-911e-aa48-f87ab3b58778.png)

ぶっちゃけ, 雰囲気で Pandas イジっていますが, 基礎統計量を超カンタンに計算できたので, シェアします.

# コード
```python

# pandas をインポート
import pandas as pd

# tsv ファイルを読み込み
data = pd.read_csv(
    'example_reviews.tsv',
    delimiter="\t",
    names=[
        'FOOD',
        'SERVICE',
        'AMBIENCE',
        'COST_PERFORMANCE',
        'TOTAL'
    ]
)

# 基礎統計量を表示
print(data.describe())
```

# 結果
```shell

$ python descriptive_statistics_value.py 
            FOOD    SERVICE   AMBIENCE  COST_PERFORMANCE      TOTAL
count  30.000000  30.000000  30.000000         30.000000  30.000000
mean    3.066667   2.466667   3.183333          2.800000   2.933333
std     1.150212   1.090186   1.125591          1.141687   1.135124
min     1.000000   1.000000   1.000000          1.000000   1.000000
25%     2.000000   2.000000   2.625000          2.000000   2.000000
50%     3.250000   2.000000   3.000000          3.000000   3.000000
75%     4.000000   3.000000   4.000000          3.875000   3.875000
max     5.000000   4.500000   5.000000          5.000000   4.500000
```

# サンプルデータ
```
4.5	4.5	5	4	4.5
3.5	2	4	3	3.5
2	2	4	2	3
4	3	3	4	4
3.5	3	4	3.5	3.5
5	3	4.5	4	4.5
4	3	3	3	4
3	2	3	2	3
4	3	3	5	4
1	1	1	1	1
2.5	1.5	3	2	2
1	2	2.5	1	1
2.5	2	2	3	2.5
2	2.5	3	2	2
3	3	3	3	3
2	2	3.5	2	2
1	1	1	1	1
2	1.5	1.5	2	2
4	1	5	5	3
4	2	2	2.5	3
3.5	3.5	3.5	4	3.5
4	1	3	2	3
3.5	3	3	3.5	3.5
1.5	2	3	2	2
3	1	2	2.5	2
3	3	4	3	3
4	4.5	5	4	4.5
4.5	4.5	4.5	4	4.5
2	2	2	1	1
4.5	4.5	4.5	3	4.5
```
Python ライブラリ Pandas で相関係数を求める方法

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88460/2a800a02-4314-911e-aa48-f87ab3b58778.png)

ぶっちゃけ, 雰囲気で Pandas イジっていますが, 相関係数を超カンタンに求められたので, シェアします.

# コード
```python

# pandas をインポート
import pandas as pd

# tsv ファイルを読み込み
data = pd.read_csv(
    'example_reviews.tsv',
    delimiter='\t',
    names=[
        'FOOD',
        'SERVICE',
        'AMBIENCE',
        'COST_PERFORMANCE',
        'TOTAL'
    ]
)

# 相関行列を表示
print(data.corr())
```

# 結果
```shell

$ python correlation_analysis.py 
                      FOOD   SERVICE  AMBIENCE  COST_PERFORMANCE     TOTAL
FOOD              1.000000  0.599945  0.662754          0.811401  0.914692
SERVICE           0.599945  1.000000  0.644448          0.576259  0.771395
AMBIENCE          0.662754  0.644448  1.000000          0.673517  0.752079
COST_PERFORMANCE  0.811401  0.576259  0.673517          1.000000  0.827508
TOTAL             0.914692  0.771395  0.752079          0.827508  1.000000
```

# サンプルデータ
```
4.5	4.5	5	4	4.5
3.5	2	4	3	3.5
2	2	4	2	3
4	3	3	4	4
3.5	3	4	3.5	3.5
5	3	4.5	4	4.5
4	3	3	3	4
3	2	3	2	3
4	3	3	5	4
1	1	1	1	1
2.5	1.5	3	2	2
1	2	2.5	1	1
2.5	2	2	3	2.5
2	2.5	3	2	2
3	3	3	3	3
2	2	3.5	2	2
1	1	1	1	1
2	1.5	1.5	2	2
4	1	5	5	3
4	2	2	2.5	3
3.5	3.5	3.5	4	3.5
4	1	3	2	3
3.5	3	3	3.5	3.5
1.5	2	3	2	2
3	1	2	2.5	2
3	3	4	3	3
4	4.5	5	4	4.5
4.5	4.5	4.5	4	4.5
2	2	2	1	1
4.5	4.5	4.5	3	4.5
```
Microservicesの9つの原則

[マーティン・ファウラーの記事](https://martinfowler.com/articles/microservices.html)を読んで、備忘のために投稿。
これから記載する9つの原則は`Microservices`アーキテクチャで守るべき！という様な話ではなく、実際の事例の共通点を集めたに過ぎないと記事では述べられているが、成功事例に学びたいという気持ちはあるので、意識していきたい。

# Microservicesの9つの原則

## サービスはライブラリ単位ではなく、ドメイン単位で分割
- ドメイン単位で分割したサービスはそのサービスの関心事によってのみ変更される。リリースもまた然り。
- ライブラリ単位で分割したサービスは明示的なインターフェースを外部に示せない。ドメイン単位で分割したサービスは明示的なインターフェースを外部に示せる。それにより、カプセル化を破壊してしまう可能性を排除できる。

## 組織は一つのビジネスコンテキストで単一であるべき
- アプリ開発チーム、インフラチーム、DBAなど、レイヤ単位でチームを分割すべきではない。一つのビジネスコンテキストを実現するチームが全ての責任を持って、開発し、運用していくべき。
- 一つの機能を実現するまでに複数のチームが互いに連携を取るのはコストがかかる。

## 「プロジェクト思考」ではなく「プロダクト思考」
- プロジェクト単位でシステムを開発、運用するのではなく、プロダクト単位でシステムを開発、運用していくべき。
- 運用チームが運用を開始したときには、開発を行ったチームは解散しているなんて論外。

## Smart endpoint,Dumb pipe
- `Microservices`アーキテクチャでは一つのサービスを互いに疎結合にする必要がある。
- `UNIX`で言う所のパイプの処理のようなものを目指すべき。
- サービス同士の通信も、また疎にすべき。一つのアプローチはRESTを使用した通信手段。もう一つは`RabbitMQ`などのメッセージハブを使用する方法。
- 互いにサービスを疎結合にするためにサービス単位の粒度を細かくしすぎると、通信コストの増加によるパフォーマンス低下を引き起こす。そこはトレードオフ。

## 分散統治
- サービスは全て一つのアプリケーションとして独立しているため、どんな技術を適用しても、そのサービスにしか変更は影響しない。つまり、そのサービスに最適な技術選定を安心して行える。
- ただし、サービス間は互いに通信を行い、ビジネス要求を満たす。そのため、新しく作ったサービスが全く違う技術で作られていたとしても、お互いに通信ができなければならない。
- この問題を解決するための一つのアプローチに`Consumer-Driven`というフレームワークが適用できる。これは二つのサービスを`Consumer`と`Provider`の役割に当てはめ、`Consumer`で定義した形式に乗っ取って`Provider`のAPIを作成するフレームワーク。
- これにより二つのサービスを毎回結合してお互いのテストをする必要がなくなり、`Provider`は`Consumer`の必要とするAPIを実現できているかを確認するテストを行えば良い。Springだと[Spring Cloud Contract](https://spring.io/projects/spring-cloud-contract)が`Consumer-Driven`テストフレームワークとして実装を提供している。

## データの分割統治
- 複数の境界付けられたコンテキストを一つのアプリケーション内で実装している場合はよくある。これは例えば、エンドユーザ向け販売画面と売り上げ管理画面でお互いに表現されているデータが異なるといった形で現れる。
- これを適切に別のサービスに分割する方法の一つに`DDD`のコンテキストマッピングの手法があげられる。これはモノシリックなアプリケーションでも`Microservices`なアプリケーションでも有効だ。
- `Microservices`アプリケーションではこの手法をデータベースに対しても適用し、1サービスは1データベースを保有する。これにより、サービスは自分自身に最適なデータベースを選択できる。
- しかし、これは分散トランザクションを管理しなければならないという課題を生み出すことにもなる。これにはいくつもアプローチの方法はある。モノシリックなデータベース構造の維持による開発コストの削減が、データの終始完璧な一貫性よりも価値があると考えるなら、このトレードオフは十分に検討の余地がある。

## インフラの自動化
- システムをできるだけ高品質に保つために自動テストを行う。
- 継続的デリバリを行う目的はデプロイプロセスを単純でつまらなくすることにある。モノシリックなアプリケーションであれ、`Microservices`なアプリケーションであれ、それは変わらない。
- モノシリックなアプリケーションと`Microservices`なアプリケーションの違いはどう継続デリバリを実現するかという方法が異なるだけ。
- 正直この原則は何を伝えたいのかよくわからなかった。。

## 障害設計
- `Microservices`アーキテクチャを採用し、サービスをいくつか作った場合、障害を容認する設計を行わなければならない。
- サービスを呼び出し、クライアントに対して応答を返す際にこれらの障害を容認し、ハンドリングする必要がある。これはモノシリックなアプリケーションよりも複雑な点である。
- Netflixの`Simian Army(現Chaos Monkey)`はプロダクション環境で障害を許容するテストを行う。これはモノシリックなアプリケーションでは許容できる様には思えない。
- `Microservices`アーキテクチャは機能的な監視項目(DBアクセス数など)とビジネス的な監視項目(注文数など)に重点をおく。なぜならイベント駆動であったり、複数サービスの連携であったりと突発的に起こる事象に影響されるものだからだ。
- `Microservices`アーキテクチャでは監視・ログは機能的にビジネス的に充実させておくべきである。スループット、レイテンシ、秒間あたりの注文数など。

## 進化的設計
- `Microservices`アーキテクチャにおける1サービスを定義つけるものの一つに、そのサービスを単体でアップグレードもしくは捨てることができるかという観点がある。
- 1サービスを長生きさせて成長させていくのではなく、サービス自体を捨てることを検討していくべき。
- サービスの交換容易性は`Microservices`アーキテクチャの重点をおく観点の一つ。ビジネス要求は変動するため、数ヶ月前に追加した機能も今では必要のない機能になっている可能性がある。そこですぐにそのサービスのみを捨てられるかどうかという点が交換容易性。
PHP5 技術者認定上級試験対応【関数】

###■ 関数基礎知識

**関数**とは、一まとまりのコードに名前をつけたものである。
関数への入力を**パラメータ(仮引数)**、関数からの出力を**返り値**と呼ぶ。

関数には大きく分けて2種類存在し、PHPが標準で持つ**組み込み関数**と、
ユーザーが独自に作る**ユーザー定義関数**である。

関数は必ずしも返り値を持つとは限らない。

関数は**定義**と**呼び出し**があるが、コードの中で定義されるよりも先に関数が呼び出された場合でもその関数は実行される。
以下のようなパターン

```php:hello.php
hello();

function hello() {
    echo 'hello';
}
```

関数の中には、引数から返り値を計算する以外の動作をすること（**副作用**）がある。

【例】

- テキストを出力する
- ファイルを削除する

関数名が数字で始まるものは定義できない
英字または、アンダースコア（_）から始まる関数名で定義しなければならない。

関数名の大文字、小文字は区別されない。
以下の出力結果は全て同じになる。
<font color="Red">**※変数は大文字、小文字を区別する**</font>

```php:date.php
echo date('Y/m/d');

echo DATE('Y/m/d');

echo Date('Y/m/d');
```

関数内には複数のreturn文を書くことができる。
呼び出し時、最初に到達したreturn文のところで呼び出しが終了する。

関数の中に、別の関数を定義できる。
これを**入れ子**の定義という。
入れ子にされた関数を呼び出すには、先にそれを含む関数を呼び出さなければならない。
以下の例では、hoge()を呼び出した時点でfuga()が定義され、fuga()の呼び出しができるようになる。
fuga()のスコープがhoge()内に限定されることはない。

```php:hoge.php
function hoge() {
    function fuga() {
        echo 'fuga';
    }
}
```

phpコードの中に　終了タグ：?> → 開始タグ：<?php の順で記述されている場合、その2つのタグに囲まれたテキストはそのまま出力される。


###■ 変数のスコープとスタティック変数

変数の有効範囲を**スコープ**と呼ぶ。
スコープには、**グローバルスコープ**と**関数レベルのスコープ**の2種類がある。

|  宣言位置  |  種類  |  有効範囲  |
| ---- | ---- | ---- |
|  関数の外側  |  グローバルスコープ  | すべての位置  |
|  関数の内側  |  関数レベルのスコープ  | その関数内  |

デフォルトでは、関数内からグローバルスコープの変数にアクセスすることはできない。

関数内からグローバルスコープの変数にアクセスしたい場合は、関数内で**global**キーワードを使用して、その変数を指定しておく必要がある。

**【例】関数内からグローバル変数へのアクセス**

```php:func.php

function func() {
    global $x;
    echo $x;
}
$x = 1;
func();

// 結果：1
```
関数レベルのスコープ変数には、関数の外部からアクセスすることはできない。
ただし、return文を使用して変数の値を返すことは可能である。
returnの記述が無ければ$xへのアクセスはできずに出力はされない。

**【例】return文を使用して値を返す**

```php:func.php

function func() {
    $x = 1;
    return $x;
}
$x = func();
echo $x;

// 結果：1
```


関数内の変数は、関数の呼び出しが完了するときに消えてしまう。
**static**キーワードを付けることで、関数の呼出しが完了しても変数の値を保持させることができる。

**【例】staticキーワードによる変数の値の保持**

```php:func.php

function func() {
    static $x = 1;
    $x++;
    echo $x, "\n";
}
func();
func();
func();

/* 
結果：2
     3
     4
*/
```

staticキーワードが付いた変数の代入は、その関数の最初の呼び出しの時にだけ実行される。

staticキーワードが付いた変数は、リテラルあるいは定数を用いて初期化することができる。
式で初期化することはできない。

**【例】式による初期化**

```php:func.php

function func($x) {
    static $y = $x;
}

// 結果：Fatal error
```

###■ 値渡しと参照渡しのパラメータ

パラメータには**値渡し**と**参照渡し**の2種類存在する
参照渡しの場合は、パラメータの前に `&`をつける。

**【例】パラメータの違い**

```php:func.php

/*
 * 値渡し
 */
function func($num) {
    $num++;
    echo "$num\n";
}
$num = 10;
func($num);
func($num);

/* 結果：11
        11
*/

/*
 * 参照渡し
 */
function func(&$num) {
    $num++;
    echo "$num\n";
}
$num = 10;
func($num);
func($num);

/* 結果：11
        12
*/
```


##参考
[PHP5 技術者認定上級試験](https://book.impress.co.jp/books/1111101169 "PHP5 技術者認定上級試験")
macでheroku deploy

herokuでflaskアプリをデプロイする作法のメモ

herokuをインストール

以下でheroku toolbelt をインストール
Download and run the OS X installer.
https://devcenter.heroku.com/articles/heroku-command-line

今回はターミナルで落とす

```
＄brew tap heroku/brew && brew install heroku
```
インストールできたら

```
＄heroku login
```
ブラウザが立ち上がりログインが求められる

デプロイしたいフォルダに移動して

設定用のファイルを作成する
requirements.txtにはインストールしたいライブラリが
記述されるが、これが無駄に多かったり、versionに問題が
あると後のpushで失敗する。

```
$pip freeze > requirements.txt
$echo python-3.6.3 > runtime.txt
$echo web: gunicorn アプリ名:app --log-file=- > Procfile
```
```
$heroku create 
$heroku buildpacks:set heroku/python
$git add -A
$git commit -m "first deploy"
$git push heroku master
```

ソフトやライブラリーのダウンロードが始まればオーケー

```
$heroku ps:scale web=1
$heroku open
```
STマイクロエレクトロニクス　2019年セミナー情報更新

ＳＴマイクロのセミナー予定が更新されました。
https://www.stmcu.jp/event/

上級編として以下3コースが新設されました。
##・STM32マイコン体験セミナー（グラフィック描画編）
GUI設計ツール「TouchGFX Designer」を使用したセミナー
##・STM32マイコン体験セミナー（高性能マイコン編）
Cortex-M7を使用したセミナー（デュアルコアマイコン）
##・STM32マイコン体験セミナー（モータ制御編）
三相モーターを使用したセミナー
##・STM32マイコン体験セミナー（RTOS編）
イー・フォース社のµC3（RTOS）およびµNet3（ネットワーク･スタック）を使用したセミナー

GUI設計ツール「TouchGFX Designer」とモータ制御用ソフトウエア開発キット「MCSDK v5.x」は非常に興味があります。
CortexM7については、高性能を生かしきれない為、活用手法について非常に興味があります。
Javaってこーなってるんだの５日目

本日のプロゲートは Java にチャレンジしました。
Javaはあっちこっちで見かけることが多いので、なんとなく親近感のある言語です。

でもクラスとかメソッドとかさっぱり分かりません。オブジェクト指向なにそれって感じです。でもIFの展開やForやWhileの使い方はどの言語も共通ですし、変数を定義してデータを入れて使い回すとかもだいたい一緒です。{ }や[ ]の使い方が違って、あれれと思う事もありますが、津軽弁と博多弁ほどは違わないと思いました。初級クリアが手際よくなってきた感じがします。

というわけで、作ったアプリをHerokuにアップして公開しようと思ったんですが、これまた全く動きません。サーバー側の動きを勉強しなくっちゃですね。そんなこんなの5日目でした。

##JavaⅠ
###Javaの基本
　Javaに触れてみよう
　Javaの基本・文字列
　数値
　数値の計算
　文字列の連結
###変数を使ってみよう
　変数の定義
　変数を使ってみよう
　変数の更新
　自己代入
　自己代入の省略
　変数の役割と注意点
　小数を扱おう
###型変換
　自動型変換
　強制型変換
###総合課題
 課題に挑戦しよう

##JavaⅡ
###真偽値と条件式
　真偽値・比較演算子
　比較演算子（２）
　論理演算子
###条件分岐
　if文
　else, else if
　switch文
　switch文（２）
###繰り返し処理
　while文
　for文
　break, continue
###配列
　配列を使ってみよう
　配列の要素の上書き
　配列と繰り返し
　配列用のfor文
###課題に挑戦しよう
 総合課題
個人的TensorFlowまとめ(2)~TensorFlowの使い方編~

#TensorFlowの使い方
前回の動作の仕組み編で説明したように、TensorFlowは完全に計算をバックエンドに任せるために計算グラフを構築する。
今回はその計算グラフの構築の仕方と計算開始方法について説明する。

#tf.Session
TensorFlowのセッションオブジェクトを返す関数。これがないとTensorFlowで計算できない。
このオブジェクトは後でclose()することが望ましいとされているため、一般的にtf.Session()はwith文と一緒に宣言されることが多い。
また、sessという名前の変数に格納される場合が多い。

```python
with tf.Session() as sess:
 ###各種処理###
```

#sess.run
tfで計算を開始できる関数。構築した計算グラフを元に実際に計算ができる。

```python
sess.run(calc_graph, feed_dict={x:train_x,y:train_y})
```
calc_graphに構築した計算グラフを、feed_dictにはplace_holderへの入力を格納する。
返り値は計算グラフの計算結果であり、いわゆるニューラルネットワークであればそれの計算結果が返ってくる。

#計算グラフ系関数
実際にTensorFlowで計算グラフを構築する際に必要になる関数群。

##tf.constant
計算グラフで定数ノードを定義したい場合に使う関数。

```python
const = tf.constant(1)
print(const)
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  print(sess.run(value))
````
上記の例は定数1のノードを計算グラフに定義している。
もちろんこれは定数を確保するという計算グラフを構築しただけであり、
print(const)しても「1」が出力されず、「Tensor("Const:0", shape=(), dtype=int32)」と出力される。
あくまでも計算グラフ上でどういうノードが存在しているのかを示しているだけである。

##tf.Variable
計算グラフにおける変数ノードを定義する関数。
ニューラルネットワークの重みなんかはこれで定義されているらしい。

```python
value = tf.Variable(1)
print(value)
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  print(sess.run(value))
````

##tf.assign
計算グラフにおける代入処理を行うノード。どんなふうに使うか例を挙げてみる。

```python
value = tf.Variable(0)
const = tf.constant(1)
add = value + const
assign = tf.assign(value, add)
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  for i in range(10):
    print(sess.run(assign))
```
上記のコードは0に1を足す計算グラフを１０回繰り返すという簡単な計算をコードである。
計算した結果をvalueに格納するために毎回assignで代入していることが分かる。

##tf.placeholder
何が入るか具体的な値は分からないが、型と配列サイズなどを指定して値を格納するノードだけ定義する関数。
計算グラフを関数に例えるなら引数みたいな役割をこなす。
placeholderで確保された箱はsess.runをする際にfeed_dictで受け取る必要がある。

```python
value = tf.placeholder(tf.int32)
array = tf.placeholder(tf.int32,[5])
multiple = value * array
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  print(sess.run(multiple,feed_dict = {value:3,array:[1,2,3,4,5]}))
```
上記のコードのようにただの定数のみのノードを用意することもできるし、大きさを指定した配列のノードも用意できる。
ちなみに以下のように型の後ろの配列をNoneにするとその次元数で受け取れるサイズの大きさが任意になる。

```python
array = tf.placeholder(tf.int32,[None])
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  print(sess.run(array,feed_dict = {array:[1,2,3]}))
  print(sess.run(array,feed_dict = {array:[1,2,3,4,5]}))
```

##その他関数メモ
基本的には上に書かれた関数を分かってればとりあえずTensorFlow入門は完了してそう。
後は自分で構築したい計算グラフの処理に応じて検索掛ければ多分色々出てくる。
英語だけど公式リファレンス見てもいい。
とりあえずなんとなく調べてて目についたその他の関数。

- tf.cond
- tf.while_loop
- tf.cast
- tf.shape
- tf.unstack
- tf.one_hot
- tf.reshape
UnityTestRunnerを導入してT・D・D入門してみる

#はじめに

T・D・D！
T・D・D！

USA的なノリでTDDしてみよう。
あと[@t\_wada](https://twitter.com/t_wada)さんっていうライオンにも怒られるらしいのでテスト書いていきましょう
![a94dd56d.png (600×315)](http://livedoor.blogimg.jp/goodimpact/imgs/a/9/a94dd56d.png)

TDDが何とかどうしてやる必要があるのかとかはwikipediaあたりを見てください。

環境
Unity 2018.3.4f1

#参考

[Unity使いは全員Unity Test Runnerを使え！爆速のトライ＆エラー環境だぞ！ \- Qiita](https://qiita.com/su10/items/67a4a90c648b1ef68ab9)
[Unityでちゃんとテストを書きたい人のためのまとめ \- Qiita](https://qiita.com/su10/items/560302ceafa6bf43a13e)
[Unity Test Runner \- Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/testing-editortestsrunner.html)
[Unityテスト完全に理解した\(実機、自動、利のあるテストに食らいつく話\) \- Speaker Deck](https://speakerdeck.com/sassembla/unitytesutowan-quan-nili-jie-sita-shi-ji-zi-dong-li-falsearutesutonishi-raitukuhua)

上記リンクを参考にしてUnityで動作するテストコードを書いていきます。

#やったこと

まず最初に失敗するテストを書きます。
最初にUnityTestRunnerを起動してテストコード保存フォルダ、スクリプト作成ボタンを押していってシンプルなテストコードだけ記述されたスクリプトを作成します。
その追加されたクラスの中に、とりあえずこんなバカみたいに必ず失敗するコードを書いてみます

```csharp
// バカみたいに失敗するテスト
[Test]
public void NewTestScriptSimpleRun()
{
    Assert.IsTrue(false);
}
```

UnityTestRunnerでテストを走らせます。
![UnityTestRunnerFailedShot.png (438×191)](https://raw.githubusercontent.com/KTA552/MediaUploader/master/img/UnityTestRunnerFailedShot.png)

はい、見事に追加したコードだけ失敗しました。やったね。
コンソールには下記のようなエラーが出ます。

```
Assertion failure. Value was False
Expected: True
UnityEngine.Assertions.Assert:IsTrue(Boolean)
kt.Tests.NewTestScript:NewTestScriptSimpleRun() (at Assets/Tests/NewTestScript.cs:26)
System.Reflection.MethodBase:Invoke(Object, Object[])
NUnit.Framework.Internal.Reflect:InvokeMethod(MethodInfo, Object, Object[])
NUnit.Framework.Internal.MethodWrapper:Invoke(Object, Object[])
NUnit.Framework.Internal.Commands.TestMethodCommand:RunNonAsyncTestMethod(ITestExecutionContext)
NUnit.Framework.Internal.Commands.TestMethodCommand:RunTestMethod(ITestExecutionContext)
NUnit.Framework.Internal.Commands.TestMethodCommand:Execute(ITestExecutionContext)
NUnit.Framework.Internal.Commands.TestActionCommand:Execute(ITestExecutionContext)
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()
```

ちゃんと意図通りにテストが失敗することを確認したら、今度は成功するコードを書きます。
とりあえずバカみたいに成功するコードを書いてみます。

```csharp
// バカみたいに成功するテスト
[Test]
public void NewTestScriptSimpleRun()
{
    Assert.AreEqual(2, 1+1);
}
```
![UnityTestRunnerSuccessShot.jpg (460×231)] (https://raw.githubusercontent.com/KTA552/MediaUploader/master/img/UnityTestRunnerSuccessShot.jpg)

成功しました。今回は中身に意味のないコードですが、

**実装→失敗するテスト→機能するテスト→コードの拡張→失敗するテスト→機能するテスト→・・・**

上記を繰り返すことで多くのテストが行われ、保守性の高くモジュール化されたコードが書けると思います。
ちゃんと意味のあるテストコードを書いていく場合、上述した参考リンク先を元にテスト機能を拡充していけばいいかなと思います。

今回のサンプルのリポジトリは下記です。
[KTA552/UnityTestRunnerTrial](https://github.com/KTA552/UnityTestRunnerTrial)
cloud9のNode.jsはnvmでアップデートしよう

[前回](https://qiita.com/ginger893/items/ecc13b5ab2960b069706)の続き

## nvmを信じろ

以下のコマンドでサクッとインストールできました

```
$ nvm install <<version>>
```

こんな感じ。

```
$ nvm install v8.11.2
Downloading https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz...
########################################################################################################################################################################################################################### 100.0%
Now using node v8.11.2 (npm v5.6.0)
$
```

うーん、くだらないことで時間を無駄にしているのは新しい技術を学ぶ時の醍醐味だなぁ(ぐるぐる目)
ELECROWでPCBをWalk IN(現地受け取り)する方法

#ELECROWでPCBをWalk IN(現地受け取り)する方法

以前はELECROWの基板注文でのSHIPPING METHODに"Walk In"があったのですが、無くなってしまいました。でも、問合せしたら可能だとわかったので、ElecrowでのWalk Inでの注文方法を書いておきます。

- まず、以下のサイトからPCBのガーバーをアップロードし仕様を入力します。

https://www.elecrow.com/pcb-manufacturing.html

この時、発送情報は以下にします。

Country：Japan
Shipping Cost:はカートでの注文時に変更できるので適当でいいです。

- 入力したらAdd to Cart でカートに追加し、カート画面へ移動します。

- カートのSHIPPING METHODで "Shipped by customer's express account"を選択します。そうするとShippingコストが0になります。

- Order Comment欄に以下の様に記述します。
"I want to pick up this order by Walk In.
I am planning to visit your office on ss/mm/yyyy (with Mr.xxxx), so I will pick it up at this time."

これで注文すると完了です。
自分の場合、order No.を控えた上で、念押しでELECROWのContact Usのページから、Order No.を入れて、上記と同様のメッセージを送信しています。
PHP修行の道＃01

#なぜ修行の道を歩むのか
最近はピュアな言語の勉強をしていなかったな～と思ったため、日ごろ使っているPHPについて公式リファレンスを使って再度知識を深めていこうと思い立ちました。
（就活で武器をピュアな言語で持ったら？と言われたのもあります。普段はVueなどのFWばっか触っていました。）

あと間違いがあればコメント欄で教えてくださると非常に嬉しいです。

#そもそもPHPとは？
>PHP (PHP: Hypertext Preprocessor を再帰的に略したものです) は、広く使われているオープンソースの汎用スクリプト言語です。 PHP は、特に Web 開発に適しており、HTML に埋め込むことができます。
--  公式リファレンスから引用  --

らしいです。
特徴としてはサーバーでコードが実行され結果だけがクライアントに届くので**ユーザがコードを見れない**というものがあげられると思います。

#PHPでできること
ほんとに色々できるのですが大きな括りで列挙してみます。

- サーバーサイドのスクリプティング
- コマンドラインでのスクリプティング
- クライアントでのGUIアプリケーションの作成

具体的には、

- フォームからのデータ取得
- 動的にページを生成
- クッキーの送受信
- イメージやPDF、flashムービーの生成
- XHTMLやXMLの文章生成
- ファイルの保存、印刷
- 各種DBMSの操作
- 様々なプロトコルを使うサービスの状態を監視

など、あげだしたらきりがないですね。

#まとめ
今回は第1回なのでPHPの概要をさらっとなでるだけにとどめておきます。
これからメインに学習していくのはサーバーサイドのスクリプティングになります。
次回から学習環境の整備と基本的な構文についてやっていこうと思います。

次の記事はこちら⇒「[PHP修行の道＃02　～学習環境を整えるの巻～](https://qiita.com/harachan/items/7815a39be93804a5ae24)」
cloud9でNode.jsのバージョンを確認してアップデートしようとして失敗した話

**注意：本記事は試行錯誤を書いてるので即効性はありません。**

## 積んでる技術書をそろそろ片付けよう

Twitterでバズってたのでノリで買ったけれど、積みっぱなしにしちゃあ意味がない。
せっかくcloud9使ってるんだから、いつもとは違う環境を作ってサクサクやってみよう。

## 前提

- 記載内容は2019年2月13日現在
- 環境はcloud9
- Node.js触ったこと無いマンが試行錯誤するお話

## まずはバージョンを揃えよう

バージョンが異なると本に書いてある内容とは違う挙動をして心が折られるのは技術者あるある話。
そこを揃えてからがスタートですよ。
ということで、バージョンを確認して必要ならアップデートしましょう。

## 作りたてほやほやのcloud9は何が入ってる？

cloud9のコンソールで作ったばかりの環境にnpmやNode.jsは入っているのか！？
サクサク確認していきましょう。

```
$ npm version
{ npm: '3.10.10',
  ares: '1.10.1-DEV',
  http_parser: '2.8.0',
  icu: '58.2',
  modules: '48',
  napi: '3',
  node: '6.16.0',
  openssl: '1.0.2q',
  uv: '1.16.1',
  v8: '5.1.281.111',
  zlib: '1.2.11' }
```

よしよし、npmは入ってますね。
では次、Node.jsのバージョンを見てみましょう。
~~(おっと！この人npmのバージョン確認時に出ていることに気がついてません！クソザコエンジニアだと早々に露呈してしまいましたね！)~~

```
$ node -v
v6.16.0
```

対象としている技術書では「**v8.11.2**」を対象としているので、アップデートをする必要がありそうです。

## じゃあアップデートしていこう

アップデートする前にnを導入してみましょう。
どうやらこれでインストールや環境の切り替えができるっぽい。
ていうかアップデートを検索するとみーんな入れてるから入れてみよう。
情報は多いほうが検索しやすいしね。

```
npm install -g n
```

インストールが終わったらnのバージョン確認してみましょう。

```
$ n --version
mkdir: cannot create directory ‘/usr/local/n’: Permission denied
mkdir: cannot create directory ‘/usr/local/n’: Permission denied
2.1.12
```

ぱーみんしょんなんちゃらなんてみえてないぼくはなにもしらないよ
気になるけど今は一旦おいておこう。
だからQiitaに書いてるわけだし。
それではlsオプションでインストール可能なNode.jsの一覧を出してみましょう。

```
$ n ls
mkdir: cannot create directory ‘/usr/local/n’: Permission denied
mkdir: cannot create directory ‘/usr/local/n’: Permission denied

    0.0.1
　　　：
　　　(中略)
　　　：
    11.8.0
```

この中に目的の「8.11.2」があるのでインストールできそうです。

## 一歩前へ出てみよう…

ではインストールしていきましょう。

```
$ n 8.11.2
mkdir: cannot create directory ‘/usr/local/n’: Permission denied
mkdir: cannot create directory ‘/usr/local/n’: Permission denied

     install : node-v8.11.2
       mkdir : /usr/local/n/versions/node/8.11.2
mkdir: cannot create directory ‘/usr/local/n’: Permission denied

  Error: sudo required
```

**須藤ォ…いるんか…**
なんか嫌な予感がしてきました。

```
$ sudo n 8.11.2                                                                                                                                                                                            
sudo: n: command not found
```

*やぁ、コマンドハウスへようこそ。このcommand not foundはサービスだからまずは落ち着いてほしい。*
仕方がないのでsuになってnを実行してみましょう。

```
$ sudo su
# n 8.11.2
bash: n: command not found
```

デスヨネー…。
と、ここまでやって時間切れ。
後で続きをやることにします。
Angular7でQRコードを表示したい

# はじめに
Angular7でQRコードを画面上に描画します。
## 環境
- angular 7
- etc...

## 利用パッケージ
**angular2-qrcode**
https://github.com/SuperiorJT/angular2-qrcode

# 手順
## 前準備
angular cli を利用してプロジェクトを作成します。
自分はWebStormを使っているので、メニューからNewProject - Angular CLI を選択して作成しました。

## angular2-qrcode の導入
基本的にReadme.mdのガイダンス通りです。
https://github.com/SuperiorJT/angular2-qrcode

```Console
npm install angular2-qrcode
```
別の話題ですが、最近は--saveと書く必要はなくなったんですね。
自動でPackage.jsonが更新されるとのこと。
https://qiita.com/glhfdev/items/c5beda8572aa8c1e6be6

### なんかエラー出た!!
で、上のコマンドを実行するとインストールされますがエラーが出ます。

```Console
./util/has_lib.sh: line 31: pkg-config: command not found
gyp: Call to './util/has_lib.sh freetype' returned exit status 0 while in binding.gyp. while trying to load binding.gyp
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:345:16)
gyp ERR! stack     at ChildProcess.emit (events.js:182:13)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:240:12)
gyp ERR! System Darwin 16.7.0
以下略
```

これもReadme.mdに下記のように

>Feel free to ignore it.

無視してくださいと書いてあるので無視します。

## モジュールに追加する
`app.module.ts`に今回追加したパッケージモジュールを追加します。
（ここら辺の手順はお決まりですね）

```TypeScript:app.module.ts
import {QRCodeModule} from 'angular2-qrcode'; // <-- 追加

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    QRCodeModule   // <-- 追加
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
```
## とりあえず表示してみる
### HTMLテンプレートにタグ追加
これもReadme.md通り...

```HTML:app.component.html
<div>
  <qr-code [value]="'Hello QR code!!'" [size]="150"></qr-code>
</div>
```
### できた！
非常に簡単。
![スクリーンショット 2019-02-13 23.26.04.png](https://qiita-image-store.s3.amazonaws.com/0/200286/9f4347df-1da5-e695-c575-7eb719592e10.png)

### Canvasに出力
初期設定だと`img`として描画されています。
![スクリーンショット 2019-02-13 23.28.57.png](https://qiita-image-store.s3.amazonaws.com/0/200286/a192e5b5-7766-b2c7-7edf-42d4d9a96cef.png)

オプションで`canvas="true"`を指定することで`canvas`に描画されるようになります。

```HTML
<div>
  <qr-code [value]="'Hello QR code!!'" [size]="150" canvas="true"></qr-code>
</div>
```
↑こうすると、こうなる↓
![スクリーンショット 2019-02-13 23.32.29.png](https://qiita-image-store.s3.amazonaws.com/0/200286/a9abf296-5ffa-1407-0c3e-c3b7a9ef385d.png)

# 最後に
非常に簡単にQRコードを描画することができました。
スマホ決済などで最近一段と馴染みが出てきた感があるQRコード、ちょっとアプリ加えたい時などにどうぞ。
IntelliJでSafe navigation operator requires at least Ruby 2.3が出るときの対象法

## IntelliJでSafe navigation operator requires at least Ruby 2.3が出るときの対象法
IntelliJでSafe navigation operator requires at least Ruby 2.3というエラーが出てきて困っていました。
解決策がわかったので共有します。

`command + ;` でproject settingを開き、Project SDKおよびModule SDKを適切に設定します。

これで問題は解決します。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
初心者がAndroid Studioを動かしてみる（実機接続編）

#はじめに
前回の記事（[初心者がAndroid Studioを動かしてみる](https://qiita.com/qtminuro/items/f22b46eb302940fdd7e5)）の続きです。
今回はエミュレータではなく、実機でHelloWorldを表示してみたいと思います。

#使用する実機
端末：Zenfone Max(M1)
バージョン：Android8.0

#実機側の準備
開発者オプションを表示します。
機種によって違うと思いますが、ビルド番号を何度か押すと出るようです。
（何回押したか忘れました……）

あとは、開発者オプション内のUSBデバッグをONにするだけです。
![ss2.jpg](https://qiita-image-store.s3.amazonaws.com/0/311225/598c225d-754b-0ecf-9ea9-3eb076c52b79.jpeg)

#PC側の準備
まず、SDK ManagerでSDK Toolsのタブを開きます。
![tool.png](https://qiita-image-store.s3.amazonaws.com/0/311225/ec8427f5-f870-dc59-b123-7fb5369d5d25.png)
画像のように、「Google USB Driver」がインストールされていることを確認します。
（されていなければインストール）
おそらくこれだけです。

#実行
準備したPCとAndroidをUSBで接続します。
あとは、前回と同様に、実行を押します。
端末の選択画面に実機があると思いますので、選択します。
（端末側に「USBデバッグを許可しますか」みたいなメッセージが出るかもしれませんが、「OK」を押します。）

実行ポチッ……

エラー！
![jikki2.png](https://qiita-image-store.s3.amazonaws.com/0/311225/a6398446-a9ab-81b2-c8b1-e3021bd749ac.png)

#エラー
どうやら、実機のバージョンが、アプリの対象の最小バージョンより前のバージョンだったみたいです。
以下のように設定を変えました。

ファイル＞プロジェクト構造（File＞Project Structure）を選択。
「フレーバー」タブ内の最小SDKバージョンを変更します。
![ver.png](https://qiita-image-store.s3.amazonaws.com/0/311225/09e8aaf4-09df-11c7-c1d4-e6ac4bce03d1.png)


# 再度実行……

HelloWorld！
![ss3.jpg](https://qiita-image-store.s3.amazonaws.com/0/311225/8a1e7b0e-eb56-aca6-4e33-bd509d99088c.jpeg)

無事実行できました。

#おわりに
無事、実機まで動かすことができたので、
今後は、アプリの内容を作るのにチャレンジしたいと思います。
macでAWSのUbuntuにアクセス

基本的にAWSのインスタンスへの接続にしたがってターミナルで入力すれば良い

＄shmod 400 秘密鍵
＄ssh -i "秘密鍵" パブリックDNS

この二行で入れる。

windowsの時はTeraTermを使用していて面倒であったが
Macだとターミナルで接続できて非常に楽


●ファイルのアップロード
FileZillaを使用
・ファイルを選択
・サイトマネージャーを選択
・新しいサイトを選択
・プロトコル：SFTP　ーSSH File　Transfer　Protocol
・ホスト：パブリックIPアドレス
・ログオン　タイプ：　鍵ファイル、秘密鍵ファイルを選択
・作成後、接続
初学者向けGit勉強会実施時　参考URL

## Git 概要・作業フロー
[新人ではないがGit初心者であるエンジニアが「このリポジトリをフォークしてローカルで開発できるようにしておいて！」と言われた時にやること](https://qiita.com/sky0621/items/8b6e88f4327b42ade5d7)

## Git メリット・デメリット
[SVNを捨ててGitを使うべき5つの理由](https://qiita.com/YusukeHosonuma/items/14c59f3878d640a401a1)
[SVN脳患者から見たGit](https://qiita.com/kaityo256/items/81e7951a1ca2706955a4)
[Subversion 対 Git：どちらを使うべきなのか？いろいろな観点から比較してみた](https://tracpath.com/works/development/subversion_vs_git/)

## Git のブランチについて
[GitのブランチはSubversionのブランチとは全く違うモノ](https://www.ricksoft.jp/blog/archives/9483/)
[Gitのブランチモデルについて](https://qiita.com/okuderap/items/0b57830d2f56d1d51692)

## Git, GitHub のフローについて
[キャリア1年未満だった僕が、社内にGitの運用を布教するために読みあさったもの ( +ちょ〜簡単に各Gitの運用方法のメリット・デメリット )](https://qiita.com/h0ng0yut0/items/d0ef7224abc5e07525d4)

## 少し踏み込んだ内容
[Git の Reset, Checkout, Revert の違い](https://yu8mada.com/2018/06/01/the-difference-between-reset-checkout-and-revert-in-git/)
[Git のマージコンフリクトを解決する方法](https://yu8mada.com/2018/06/13/how-to-resolve-a-merge-conflict-in-git/)


## ツール
[はじめてのSourceTree（使い方編）](https://qiita.com/naoki85/items/c7660d70347e9e70b201)
SDカードを削除できないときのMacでの初期化方法

SDカードをつい忘れて「SDカードを取り出す」を押す前に抜き取ってしまい、SDカードが破損しました。

中のデータは救出してあるものの中身へ新たな書き込みや削除もできない。
ユーティリティで初期化しようとしてもできない。
完全に詰んだ人向け(自分)のやり方です。


#ターミナルで認識できるディスクなどを表示
``` 
$ diskutil list
``` 
と打つと外部から接続されているものが一覧で表示されます。

#その中からその死んでるSDカードを見つける
私の死んだSDカードはNO NAMEという名前なのでこれですね。
ディスク番号は``` /dev/disk8```  ということを確認します。

``` 
/dev/disk8 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.8 GB     disk8
   1:                 DOS_FAT_32 NO NAME                 7.7 GB     disk8s1
``` 
#そのディスクをアンマウントする
``` 
$ diskutil unMountDisk /dev/disk8
``` 

#ディスクを初期化
``` 
$ diskutil eraseDisk HFS+ Untitled /dev/disk8
``` 

#終わり
ちゃんとSDカード取り出そうな自分。
Pythonでランダムに作成した平面上3頂点列の時計回り/反時計回りを判定する

久しぶりに小ネタ．

- 前回: [Python+Scipyでランダムに作成した点から凸包を描く](https://qiita.com/takilog/items/82ca4a9ccdcb74100588)


#  平面上に3頂点をプロット

- わざと色付けてます

```python
import numpy as np
import matplotlib.pyplot as plt

X = np.random.rand(3, 2)

fig = plt.figure(figsize=(2, 2))
ax = fig.gca()
ax.scatter(x=X[0, 0], y=X[0, 1], color='r')
ax.scatter(x=X[1, 0], y=X[1, 1], color='g')
ax.scatter(x=X[2, 0], y=X[2, 1], color='b')
ax.set_xlim(0., 1.)
ax.set_ylim(0., 1.)
```

![g1.png](https://qiita-image-store.s3.amazonaws.com/0/7181/705665d9-87cc-d6de-a132-2d7264f43c5b.png)

- 適当に0番目の点を固定し，ベクトルを描いた場合は次のようになります
    - v01が0番目の頂点から1番目の頂点のベクトル
    - v02は0番目から2番目


```python
v01 = np.array([X[1, 0] - X[0, 0], X[1, 1] - X[0, 1]])
v02 = np.array([X[2, 0] - X[0, 0], X[2, 1] - X[0, 1]])
fig = plt.figure(figsize=(2, 2))
ax = fig.gca()
ax.scatter(x=X[0, 0], y=X[0, 1], color='r')
ax.scatter(x=X[1, 0], y=X[1, 1], color='g')
ax.scatter(x=X[2, 0], y=X[2, 1], color='b')
ax.arrow(X[0, 0], X[0, 1], v01[0], v01[1], length_includes_head=True, head_width=0.03, color='k', zorder=-1)
ax.arrow(X[1, 0], X[1, 1], X[2, 0] - X[1, 0], X[2, 1] - X[1, 1], length_includes_head=True, head_width=0.03, color='k', zorder=-1)
ax.arrow(X[2, 0], X[2, 1], -v02[0], -v02[1], length_includes_head=True, head_width=0.03, color='k', zorder=-1)
ax.set_xlim(0., 1.)
ax.set_ylim(0., 1.)
```

![g2.png](https://qiita-image-store.s3.amazonaws.com/0/7181/f0df9770-2548-1bef-8dc9-70d79e517714.png)


# 時計周り/反時計回りの判定

- 頂点順序を**0→1→2**と見た時，これが三角形を「時計回り(CW)」するのか「反時計回り(CCW)」するのかを判定する
- 2つのベクトル**v01**と**v02**が計算できているので，外積を計算して正負を判定すれば良い
    - 2次元の場合，v01(x) v02(y) - v01(y) v02(x)


- 計算してタイトルに書いてみる

```python
N = 3
for n in range(N):
    X = np.random.rand(3, 2)
    fig = plt.figure(figsize=(2, 2))
    v01 = np.array([X[1, 0] - X[0, 0], X[1, 1] - X[0, 1]])
    v02 = np.array([X[2, 0] - X[0, 0], X[2, 1] - X[0, 1]])
    z = v01[0] * v02[1] - v01[1] * v02[0]
    ax = fig.gca()
    ax.scatter(x=X[0, 0], y=X[0, 1], color='r')
    ax.scatter(x=X[1, 0], y=X[1, 1], color='g')
    ax.scatter(x=X[2, 0], y=X[2, 1], color='b')
    ax.arrow(X[0, 0], X[0, 1], v01[0], v01[1], length_includes_head=True, head_width=0.03, color='k', zorder=-1)
    ax.arrow(X[1, 0], X[1, 1], X[2, 0] - X[1, 0], X[2, 1] - X[1, 1], length_includes_head=True, head_width=0.03, color='k', zorder=-1)
    ax.arrow(X[2, 0], X[2, 1], -v02[0], -v02[1], length_includes_head=True, head_width=0.03, color='k', zorder=-1)
    ax.set_xlim(0., 1.)
    ax.set_ylim(0., 1.)
    title = "CCW" if z > 0 else "CW"
    ax.set_title(title)
```

- 結果(例)

<img width="133" alt="trial3.png" src="https://qiita-image-store.s3.amazonaws.com/0/7181/224633d4-ff7e-7617-455d-7452ceec75c4.png">




# 参考

- おぼろげな高校数学の知識
- [３点の座標から簡単に角度と回転方向を求める．](http://www5d.biglobe.ne.jp/~noocyte/Programming/Geometry/RotationDirection.html)
ReactをRedux+TypeScriptで始めてみる

# はじめに
普段はAngularを使っているので、他のフレームワークを触ってみようと思った今日このごろ。
Vueは[超絶軽く触ったこと](https://minase-program.hatenablog.com/entry/2018/11/03/001545)があるので今回はReact。
JSXがパッと見とっつきにくかったので後回しにしてたけど、ちゃんと向き合うことにする。

# TL;DR.
[今回作ったサンプルコード](https://github.com/Tetsuya-Minase/program-samples/tree/master/react-sample)

# インストール
手作業でファイルを作ってもいいけど、Facebook作成の[**create-react-app**](https://github.com/facebook/create-react-app)があるのでそれを使う。

```sh
$ npm install -g create-react-app
# TSを使いたいからオプション指定
$ create-react-app react-sample --typescript
```

# サンプルプログラムを作る
いつも？通りToDoリストを作ることにする。
今回Reactのサンプルなので、せっかくだから[Redux](https://redux.js.org/)も導入することにする。
インストールは下記の通りでOK。

```sh
# 必要なライブラリのインストール
$ npm install -save redux react-redux

# 実装時楽したいので型定義もインストール
$ npm install --save-dev @types/react @types/react-redux
```

サンプルの実装は[Reduxの公式サイト](https://redux.js.org/basics/usage-with-react)のサンプルプログラムを参考にしてTSへリファクタしていくことにする。
今回のリファクタリングの方針は下記の通りにした。
ちなみにこれがベストかどうかはわからないので、あくまで今回の方針とする。

* DOM作ってるところは`.tsx`にする
* component周りはclassにする
* propTypesの代わりにTSのinterfaceを使う

## サンプルコード
全量は流石に多いので[Git](https://github.com/Tetsuya-Minase/program-samples/tree/master/react-sample)に上げた。
ActionとかReducerは型つけたぐらいなので、Componentとinterfasceをサンプルとして載せとく。

### Component
```tsx
import React, { Component } from 'react';
import { ITodoProps } from '../commons/interfaces';

export default class Todo extends Component<ITodoProps, {}> {

  render() {
    return (
      <li
        onClick={this.props.onClick}
        style={{
          textDecoration: this.props.completed ? 'line-through' : 'none'
        }}
      >
        {this.props.text}
      </li>
    );
  }
}
```

### interface
``` typescript
export interface ITodoProps {
    completed: boolean;
    id: number;
    onClick: any;
    text: string
}

export interface ITodoListProps {
    todos?: Array<ITodoProps>;
    toggleTodo: any;
}

export interface ILinkProps {
    active: boolean;
    children: string;
    onClick: any;
    filter: string
}

export interface IState {
    todos: Array<any>;
    visibilityFilter: string;
}
```

# まとめ
今回は簡単にReact + Reduxのチュートリアルをやってみた。
JSX(TSX)の書き方はとっつきにくいかなって思ってたけど、意外とそうでもなかった。
Reactが学習コスト低めって言われている理由がちょっとわかった気がする。
そのうちオリジナルの何かを作ろうと思った。
それでは今回はこの辺で。

# 参考サイト
* [React公式サイト](https://reactjs.org/)
* [Redux公式サイト](https://redux.js.org/)
* [create-react-app](https://github.com/facebook/create-react-app)
Vue-cli, Vue-chart.js, Vuetifyの入門サイトまとめ

`環境`：Windows 10 pro

Vue.js関連を理解するのに役に立ったサイトをまとめました。

**Node.js環境が構築されているかを確認**
---
下記のように、"バージョン"が表示されない場合、Node.jsをインストールする必要があります

```
$ node --version
　v 10.15.1
```
**Node.jsをダウンロード**
---
[Windows版 Node.js環境構築方法まとめ](https://qiita.com/maecho/items/ae71da38c88418b806ff) を参考にダウンロードする
**Vue-cliを理解する**
---
[VueCLIからVue.js入門①【VueCLIで出てくるファイルを概要図で理解】](https://qiita.com/po3rin/items/3968f825f3c86f9c4e21)
[VueCLIからVue.js入門 ②【トグル機能作成からVue.jsの基本的な機能を掴む】](https://qiita.com/po3rin/items/15e1972ef5165b3725bf)
を参考に理解する
**Vue-chart.jsを理解する**
---
[Creating Beautiful Charts Using Vue.js Wrappers for Chart.js](https://www.sitepoint.com/creating-beautiful-charts-vue-chart-js/)
(上記の翻訳版)[Vue.jsでカッコいいグラフを手軽に作るChart.jsのラッパー3つ](https://www.webprofessional.jp/creating-beautiful-charts-vue-chart-js/)
を参考に理解する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/bb1256d2-40a6-8db6-893c-46c031321174.png)

**Vuetifyを理解する**
---
[Vuetifyが便利すぎる【マテリアルデザイン3分入門】](https://windii.jp/frontend/vue/vuetify)
[Vuetifyチュートリアル。CSSを書かないマテリアルデザイン](https://windii.jp/frontend/nuxt/vuetify-tutorial)
[公式Vuetify](https://vuetifyjs.com/ja/)
を参考に理解する

**参考**
---
***Node.js***
[Windows版 Node.js環境構築方法まとめ](https://qiita.com/maecho/items/ae71da38c88418b806ff)
***Vue-cli***
[VueCLIからVue.js入門①【VueCLIで出てくるファイルを概要図で理解】](https://qiita.com/po3rin/items/3968f825f3c86f9c4e21)
[VueCLIからVue.js入門 ②【トグル機能作成からVue.jsの基本的な機能を掴む】](https://qiita.com/po3rin/items/15e1972ef5165b3725bf)
***Vuetify***
[Vuetifyが便利すぎる【マテリアルデザイン3分入門】](https://windii.jp/frontend/vue/vuetify)
[Vuetifyチュートリアル。CSSを書かないマテリアルデザイン](https://windii.jp/frontend/nuxt/vuetify-tutorial)
[公式Vuetify](https://vuetifyjs.com/ja/)
Gitの基本コマンド

Gitの基本まとめ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/ef41de0c-08ab-6aae-ce6b-803bc038a121.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/9e4c7b01-fe04-7948-eaa1-de69cc57038e.png)


**＜ローカルリポジトリ＞**
---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/cd57dade-f914-3c34-554d-6cbd80d07e2b.png)


**gitを使えるようにする**
---
```
$ git init
```

**ステージングエリアに上げる**
---
```
$  git add {filneName}
```
`.`: ディレクトリ内すべて

**ローカルリポジトリに上げる**
---
```
$ git commit -m "message"
```
```
$  git commit --amend
```


```
$ git commit -am "message"
```

**コミットのログを見る**
---
```
$ git log
```
`--oneline`: ログを一行で表示
`-p`: `git diff`を同時に表示
`--stat`: 変更したファイルの情報を表示

**現在の状況を見る**
---
```
$ git status
```

**変更点を確認**
---
作業ディレクトリにあるファイルの変更点を確認

```
$ git diff
```
`--cached`: ステージングエリアにあるファイルの変更点を確認

**gitの管理に特定のファイルを含めない方法**
---

```:.gitignore
*.log
```
**`commit`を戻す時**
---

直前の`commit`に戻す

```
$ git reset --hard HEAD
```

３番目の`commit`に戻す

```
$ git reset --hard HEAD^
```
指定した{commitID}まで戻す

```
$ git reset --hard {commitID}
``` 
***`reset`を取り消す***
---
ひとつ前の`reset`をキャンセルする

```
$ git reset --hard ORIGIN_HEAD
```
**branch**
---
branch listを表示

```
$ git branch
```
branchを作成

```
$ git branch {branchName}
```
branchを切り替え

```
$ git checkout {branchName}
```
branch作成から切り替えまで行ってくれる

```
$ git branch -b {branchName}
```
**marge**
---
今いるbranchに{branchName}を反映させる

```
$ git marge {branchName}
```
branchを削除

```
$ git branch -d {branchName}
```
**tag**
---
tag listを表示

```
$ git tag
```

tagを作成

```
$ git tag {tagName}
```
tagを付与

```
$ git tag {tagName} {commitID}
```
tagを削除

```
$ git tag -d {tagName}
```
**alias**
---
コマンド名を短縮して登録

```
$ git config --global alias.co checkout
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.ci commit
```
alias listを表示

```
$ git config -l
```

***＜リモートリポジトリー＞***
---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/3a66213d-3138-4a2d-4252-2910e122dc8f.png)

**リモートリポジトリーを設定**
---

```
$ git init --bare
```
**リモートリポジトリの追加**
---
```
$ git remote add {remoteRepositoryName} {remoteRepository's absolutePath}               
```
{remoteRepositoryName} = origin など
**リモートリポジトリーに上げる**
---
```
$ git push {remoteRepositoryName} {localBranchName}
```
{remoteRepositoryName} = origin, {localBranchName} = master
**リモートリポジトリーに上がっている内容を作業ディレクトリにコピペする**
---
```
$ git clone {remoteRepository's absolutePath} {directoryName}
```
**リモートリポジトリーにあるファイルの変更点を作業ディレクトリにあるファイルにも反映させる**
---
```
$ git pull {remoteRepositoryName} {localBranchName}
```
{remoteRepositoryName} = origin, {localBranchName} = master


**参考**
---
[【Git入門！】Gitって何？から基本的な使い方までを簡単解説](https://www.sejuku.net/blog/72524)
rails S3へファイルアップロード・ダウンロード

# 前提
* AWSの認証設定済。

# 詳細
## gemインストール
Gemfile

```ruby
gem 'aws-sdk'
```

## 操作
###　ファイルアップロード

* parms[:file]でファイル受け取り

```ruby
  def upload
　  region = 'XXXX'
    bucket = "#{bucket_name}" # S3バケット名
    key = "#{key}"　#S3のファイル名
    client = Aws::S3::Client.new(region: region)

    upload_file = params[:file]

    client.put_object(bucket: bucket, key: key, body: upload_file.read) 
   end
```   

### ファイルダウンロード

```ruby
  def download
　  region = 'XXX'
    bucket = "#{bucket_name}" # S3バケット名
    key = "#{key}"　#S3のファイル名

    client = Aws::S3::Client.new(region: region)
    data = client.get_object(:bucket => bucket, :key => key).body
    file_name = "#{file_name}"　#ダウンロード時ファイル名
    type = 'xxx' # ファイルの型　csvの場合　'text/csv'

    send_data data.read, filename: file_name, disposition: 'attachment',  type: type
  end
```



## 備考

* rails初心者です。アウトプット練習で書いてみました。
* バリデーション等は考慮外。
CURLでkintoneのレコード追加/取得をしてみる

#はじめに
こちらの記事はCURLで基本的なkintone REST APIを叩く方法を紹介します。
事前知識として、kintoneアプリの作り方、フィールドコードの編集方法、APIトークンの生成方法、アプリIDの確認方法、レコードIDの確認方法、CURLの叩き方を知ってる必要があります。

#事前準備
文字列(1行)、数値、ドロップダウンで構成された下記のようなアプリを用意します。
フィールドコードはフィールド名と同じにしました。この例では、アプリIDは111が設定されているとします。
![screenshot_of_app.png](https://qiita-image-store.s3.amazonaws.com/0/100542/b52d3b6c-fec5-4032-c000-b2a06759eeb3.png)


CURLを叩く前にレコードデータを適用に追加します。
![screenshot_of_recordlist.png](https://qiita-image-store.s3.amazonaws.com/0/100542/8ece772f-4a60-afe9-e4fa-1979bb730932.png)

#CURLで叩いてみる

## レコード登録
NameにAndrew, Ageに77, SkillにPython を含めたデータを登録する例：

```curl:post
curl -X POST 'https://{subdomain}.cybozu.com/k/v1/record.json' \
 -H 'X-Cybozu-API-Token: {API_TOKEN}' \
 -H 'Content-Type: application/json' \
 -d '{"app": 111,"record": {"Name":{"value":"Andrew"},"Age":{"value":77},"Skill":{"value":"Python"}}}'
```
APIの情報はこちら： [レコードの登録](https://developer.cybozu.io/hc/ja/articles/202166160#step1)

## レコード取得(1件)
レコードIDが3のレコード情報を取得する例：

```curl:getrecord
curl -G 'https://{subdomain}.cybozu.com/k/v1/record.json?app=111&id=3' \
 -H 'X-Cybozu-API-Token: {API_TOKEN}'
```

APIの情報はこちら： [レコードの取得(1件)](https://developer.cybozu.io/hc/ja/articles/202331474#step1)

## レコード取得(クエリを指定して複数件取得)
SkillにRubyが設定されているレコードを複数取得し、かつレスポンスに含むフィールド情報をNameとAgeだけにする例：

```curl:getrecords
curl -G 'https://{subdomain}.cybozu.com/k/v1/records.json' \
 -H 'X-Cybozu-API-Token: {API_TOKEN}' \
 --data-urlencode 'app=111' \
 --data-urlencode 'fields[0]=Name' \
 --data-urlencode 'fields[1]=Age' \
 --data-urlencode 'query=Skill in ("Ruby")'
```

APIの情報はこちら： [レコードの一括取得（クエリで条件を指定）](https://developer.cybozu.io/hc/ja/articles/202331474#step2)


#最後に
複数レコードの取得のクエリに指定方法はトリッキーかもしれませんが、上記の例を参考にし、必要なクエリを投げてみましょう！
うまくリクエストが通らない場合、CURLのオプションに --verbose を追加し、リクエスト内容を確認しながらデバッグしてみましょう。