OmniAICreator/Qiita-1.07M huggingface dataset:
Comma Operatorについて

CやC++ではコンマがオペレーターらしい。

それを知らなかったので、整理

https://en.wikipedia.org/wiki/Comma_operator


```c
#include <stdio.h>

int main()
{
	int a,b;
	a = 1,2,3;
	b = (1,2,3);
	//printing the values
	printf("a: %d\n",a);
	printf("b: %d\n",b);
	return 0;
}
```

warningが色々出るのだけれども、出力は以下。

```
a: 1
b: 3
```

上のコードではcommaはふたつのコンテキストで意味が異なる。

**[追記]以下の内容は間違っていることがわかりました。詳しくはコメント参照**

# Separator

```c
int a,b;
a = 1,2,3;
```

上記の使い方は、a=1,と2と3を文として記述しているという書き方となるため変数aには1が代入される

# Operator

```c
int a,b;
b = (1,2,3);
```

上記の書き方の場合は、commaはoperatorとなる。()が式として、,がoperatorとして評価される。

この書き方の場合は、commaはoperatorであり、特にbinary operator（二項演算子）と呼ばれる。

binary operatorは２つのoperandを取る演算子である。

例

```c
x+y
x*y
x-y
x,y
```

comma operatorは`x,y`のように書くが、xを実行しその結果を破棄し、yを実行すると言うものである。

そのため

```c

int b;
b = (1,2,3);
```

では、1が評価のち破棄され、2が評価のち破棄され、最終的に右端の3が変数bに代入される。


# ちなみに

ちなみに、以下のように書くとコンパイルできない。


```c
int a = 1, 2, 3; 
```

# 参考

- https://www.geeksforgeeks.org/a-comma-operator-question/
- https://www.geeksforgeeks.org/comna-in-c-and-c/
- https://stackoverflow.com/questions/52550/what-does-the-comma-operator-do
OCNバーチャルコネクト（MAP-E）でのサーバ公開が簡単になっていた件

IPv6の接続方法として多くのプロバイダが採用しているOCNバーチャルコネクト（MAP-E）ですが、以下の記事のように、自宅サーバ公開は面倒くさそう、というのがこれまでの認識でした。

「MAP-Eでも、OCNバーチャルコネクトはポートフォワードができないので注意！！」
https://xanadu6291.stars.ne.jp/?p=824
「v6プラス (MAP-E)でのポート開放メモ【YAMAHA NVR510】」
https://tabikumo.com/v6plus-nat/

しかし、バッファローのルータで更新があったようで、OCNバーチャルコネクトでの自宅サーバ公開が容易になっているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7dc6463f-a94b-2710-9e68-8945dfa6386d.png)
こちらがルータの「インターネット設定」。ここでOCNバーチャルコネクトを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/81aa84ed-f827-e3de-e40f-58f184ff9c12.png)
ポート変換（NAPT項目）を見ると、利用可能ポート番号一覧が親切に表示されているではありませんか！（これまでは調べる手間がありました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1b7f8ceb-200d-b951-ef89-389cfc6928da.png)
そこで、自宅内の仮想マシンのIPv6をオンにして試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7a7c1c81-9f2c-2caa-c867-26fa2a2b630d.png)
・名前は任意
・WAN側ポートは、取りあえず先頭の1024
・LAN側IPは、リモート接続する仮想マシンのIP
・LAN側ポートは、リモートデスクトップ標準の3389
としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b9795e92-4f51-2c8d-85df-35f94ca6ecd6.png)
「安全な確認くん」で、現在接続しているIPv4アドレスを確認します。
https://kakunin.net/kun/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/3831fdbc-38dd-eaab-85a0-2c72287ac238.png)
テザリングしたノートPCで、自宅のISPにリモート接続します。コロンの後にポート番号を書きます。
＜接続するIpアドレス:ポート番号＞　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/30ac3930-987e-b684-00b5-c09e40e69d32.png)
すんなりと接続できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/70baa010-ce4b-ce8c-a113-efebc927f94e.png)
この時間帯、IPv4だと5Mbpsまで落ち込みますが、しっかりv6の速度が出ています。


結論：OCNバーチャルコネクトでもサーバー公開は簡単でした。

ポイントとしては以下となります。
・接続先のマシンでIPv6を有効にしておくこと
・バッファロールータでは、利用可能なポート番号がわかる（対応機種はこちら）
　https://www.buffalo.jp/support/other/network-ipv6.html
・IPv6アドレスではなく、＜IPv4アドレス+指定ポート番号＞を指定して接続すること

最初はちょっと面倒かなと思いましたが、標準でウェルノウンポート（よく使われる8080や3389など）がふさがれていて、NAPTを強制されるので、ある意味セキュリティが高いといえます。

またいざとなったら接続先マシンのIPv6プロトコルをOFFにしてしまえば、絶対に接続できません。

IPv6でサーバ公開することで、速度向上をしながら、運用の幅が広がるといえるのではないでしょうか。
簡単にコストを節約して多言語対応する方法

サービスやアプリなどのプロダクトを展開する際、グローバル（ダイバーシティも含めて）が大きな課題です。しかし、残念ながら日本語は世界共通言語ではありません。そのため、日本語以外の多くの言語に対応する多言語対応がほぼ必須になっています。

一口に多言語対応といっても、日本語から英語に翻訳し、そこから翻訳サイトを使ったり、翻訳家に依頼して多言語に翻訳するなど、様々な方法があります。こういった方法はコスト（お金以外の時間も含めて）がかかります。そこで、今回は、簡単にコストを節約して多言語対応をする方法についてご紹介したいと思います。

## 構成

構成は以下の通りです。

* Local environment
    * Windows
    * Visual Studio 2019 for Windows
    * Multilingual App Toolkit(MAT)
* Remote environments
    * Azure Cognitive Services

## 手順

### 初期設定

* [Visual Studio 2019 for Windows](https://visualstudio.microsoft.com/ja/downloads/?WT.mc_id=AZ-MVP-5001601) と [MAT](https://developer.microsoft.com/ja-jp/windows/downloads/multilingual-app-toolkit/?WT.mc_id=AZ-MVP-5001601) をインストールする
* [Visual Studio 2019 for Windows](https://visualstudio.microsoft.com/ja/downloads/?WT.mc_id=AZ-MVP-5001601) を起動し、Tools -> Multilingual App Toolkit から MAT を有効にする
* Azure Cognitive Services の subscription key を発行し、発行した key を MAT に入力する
* `Resources` フォルダを作成し、 `AppResources.resx` を追加する
* Tools -> Multilingual App Toolkit -> Add translation languages から翻訳して欲しい言語を選択する

### 初期設定後

* [Visual Studio 2019 for Windows](https://visualstudio.microsoft.com/ja/downloads/?WT.mc_id=AZ-MVP-5001601) で `AppResources.resx` に翻訳したい元の文字列を追加する
* `AppResources.resx` を元に MAT が [xyz].[xy].xlf をビルド時に自動生成する
* 自動生成された [xyz].[xy].xlf の文字列に対して、Azure Cognitive Services が機械翻訳した結果で置換する
* 各 [xyz].[xy].xlf から AppResources.[xy].resx を [Visual Studio 2019 for Windows](https://visualstudio.microsoft.com/ja/downloads/?WT.mc_id=AZ-MVP-5001601) がビルド時に自動生成する
* アプリはシステム内の言語設定と一致する AppResources.[xy].resx の文字列を表示する

といった具合です。

最初の初期設定の部分が少々手間ですが、一度設定してしまえば、後はビルドの度に自動的に翻訳してくれるので、とても簡単ですし、コストも節約できます。

## 参考

* [Visual Studio のインストール | Microsoft Docs](https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2019&WT.mc_id=AZ-MVP-5001601)
* [多言語アプリ ツールキット エディター - Windows アプリの開発](https://developer.microsoft.com/ja-jp/windows/downloads/multilingual-app-toolkit/?WT.mc_id=AZ-MVP-5001601)
* [Microsoft Translator Moves to the Azure portal – Welcome to Multilingual App Toolkit’s Suggestion Box!](https://multilingualapptoolkit.uservoice.com/knowledgebase/articles/1167898-microsoft-translator-moves-to-the-azure-portal)
* [Add Languages to Your Xamarin Apps with Multilingual App Toolkit | Xamarin Blog](https://devblogs.microsoft.com/xamarin/add-languages-to-your-apps-with-xamarin-and-multilingual-app-toolkit/?WT.mc_id=AZ-MVP-5001601)
* [Azure Cognitive Services のドキュメント | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/cognitive-services/?WT.mc_id=AZ-MVP-5001601)
ReactiveProperty 7.5.0-pre202010141113 をリリースしました

ReactiveProperty v7.5.0 のプレリリース版を NuGet に公開しました。

[ReactiveProperty 7.5.0-pre202010141113](https://www.nuget.org/packages/ReactiveProperty/7.5.0-pre202010141113)

変更内容は以下のような感じです。


`ObserveProperty` や `ToReactivePropertyAsSynchronized` や `ToReactivePropertySlimAsSynchronized` で `x.Hoge.Foo` みたいにプロパティがネストしているケースもサポートしました。

例えば、以下のようなコードを書くと Person クラスの Child プロパティの Name プロパティを監視する ReadOnlyReactivePropertySlim が出来ます。

```csharp
var p = new Person();
var rp = p.ObserveProperty(x => x.Child.Name)
  .ToReadOnlyReactivePropertySlim();
```

今までは、上記のようなコードを書いても動いていませんでした。途中で Child を null に設定すると Name プロパティの型の default 値が ReactiveProperty に設定されます。
一度 Child に null を設定しても、再度 null じゃない値が設定されると、その時の Child の Name の監視が行われて ReactiveProperty に設定されます。

`ToReactivePropertyAsSyncronized` や `ToReactivePropertySlimAsSyncronized` は、プロパティの途中の値が null などになると、null の間に ReactiveProperty の Value に設定された値は無視されます。

ぼちぼちコードを追加したので、とりあえず pre 版としてリリースしてみました。まだ GitHub の PullRequest で絶賛作業中です。

https://github.com/runceel/ReactiveProperty/pull/199
設計書の「使える化」

#設計書を「使える化」するために
##背景
今のままでは設計書は不良債権と化してしまう。
なんとか設計書を「使える化」しないといけない。
すでに設計書はあるが、よくわからない状態を想定しています。

##哲学
何か聞くにしても設計書を自分で書く
君が書いたものが設計書なんだよっていうようなことを教えてもらったことがあります。
そこからお客さんに見せる設計書ができるかどうかはわかんないです。
そこにとらわれると何もできなくなってしまうと思います。
今回は詳細設計が終わって以降残骸のような設計書をなんとか「使える化」
する話です。

##作るもの
実行計画・・・設計書一覧のこと
機能一覧・・・本当の一覧でいいと思います。
画面遷移図・・・あり物の図をパワーポイントに貼り付ける。無ければ四角をつなぐぐらいで作る。
状態図・・・全て網羅を考えず、主要なものを1つ2つ作る
主要テーブル・またはER・・・処理系・非処理系・オンライン用・バッチ用ぐらいを
色分けしながら
処理フロー・・・メモ帳に処理フローとかいて中身はDD書参照でもいいと思う。
SQL一覧・・・機能名・検索・更新を書いておくぐらいでいいと思う。作りながら
条件を見るのがポイント
クラス図・・・説明・クラス名・メソッド名・戻り値
##ノウハウ
・パワーポイントを使う
・表を作るときはNoを振る。
・タイトルをつける。
最初にどのプログラミング言語を学ぶか悩まなくて良い３つの理由

# はじめに
プログラミング学習を始めたばかりの方はきっと **どのプログラミング言語を学習するか** 非常に悩まれると思います。

「求人が多いし Ruby？
それともRubyはオワコンだから PHP ?
それとも人工知能に興味があるから Python?」
みたいなやつです。

私も悩んだ経験があるので気持ちはよく分かるのです。
しかし Web系エンジニアとして働き始めて約半年、当時の自分が悩んでいた意味はほとんど無かったかなと思います。

なので今回は私の考える **最初にどのプログラミング言語を学ぶか悩まなくて良い３つの理由** についてまとめてみたいと思います🙋‍♂️

## 1. １つできれば他もできる
これはよく耳にするのでは無いでしょうか？
私も学習を始めた時、このことをよく言われていましたが、全然信用していませんでした。。。

「だって「言語」ですよ、そんな訳ないじゃん！どれを勉強するのかはよく考えないといけないはず」という具合。
しかし断言できますが、これは本当です😬

最初はどの言語を学習しても大変です。プログラミングそれ自体に慣れていないのですから分からないことだらけで当然です。
これは Ruby を学習したから、PHPを学習したから楽になるという話では無いのです。

配列、ハッシュ、文字列、数字、クラス。。。

もちろん全部ではありませんが、各言語で共通している概念というのは非常に多いのです。
「方言」が違うようなイメージです。

最近になって改めて体系的に JavaScript を学習しました。
最初にRubyを学習した時の苦労を 10 だとすると、JSの学習に関しての苦労は **1ぐらい** です。

どの道１つの言語では対応できません。複数の言語を学ぶことになります。
なのでまずは１つの言語をしっかり学習してみてはいかがでしょうか？


## 2. 何があっている（楽しいと感じる）かなんて分からない
時間をかけて考えれば自分にぴったりの言語が見つかるというのも個人的にはちょっと違うかなと思っています。
そもそもプログラミングに限らず、何でもやってみないと分からないというのは多くのことに共通しています。

そしてプログラミングをこれから学習しようとする人にはそもそも **「判断材料」がありません** 。
これは仕方の無いことです。

本当に右も左も分からない状態ですし、頼る情報があるとするならばポジショントークまみれで不安を煽るような情報源ばかり。
判断する材料が頭に入っていないのに悩んでいては時間ばかり過ぎていくかもしれません。

迷うより、まずやってみれば良いんです。
勉強するのにお金はかかりませんし、大きなリスクにもなりません。
楽しく無いなら止めれば良いだけです。


## 3. 悩めば悩むほどポジショントークに振り回される
2番でも少し書きましたが、悩んでいる初学者にとって注意が必要なのがこのポジショントークです。
世間一般に見られる現象ですが、この業界に入ってからは特にポジショントークが溢れかえっていることに気付かされます。

悩めば悩むほど、様々なポジショントークに触れることでどんどん振り回されます。
結果、学習をそもそも始める前から疲れてしまったりするのです。

さらに恐ろしいことに、学習を始める前段階では **ポジショントークであることにすら気付かない** のです。
ただ単にメンタルが振り回されて消耗するだけです。

私は最初にRubyを学習していたとき、ネットの情報源で「Rubyはオワコンだから学習しても無駄」という声を散々聞いて無駄に不安になっていました。
しかし今となっては「何してたんだろう」という感じです。。。

ポジショントークに振り回されないコツは、「早く自分で行動する」ということです。
こうすることでしか自分で判断することはできません。

# とは言っても、どうしたら良いの？
きっと私も含めて多くの人が「損をしたくない」と思っているのでしょう。
一生懸命時間をかけて勉強したのが無駄になったら嫌だ、と。

でも途中で言語を変えたとして、それは「無駄」なのでしょうか？
少なくとも最初に学習した言語が自分に合わなかったという「発見」は得られるはずです。
これはあなたが感じたことなのでどのサイトにも載っていない、非常に価値のある発見です。

まずは一歩を踏み出すことが大前提です！！

それでも迷う方は、初学者に王道の

- Ruby
- PHP
- JavaScript

あたりから始めてみてはいかがでしょうか？
好きなのをやるのが1番ですが、難易度の振れ幅が無いわけではありません。

学習したことは無いですが、初めての学習で C言語とかやると心が折れやすいというのはよく聞く話なので、その辺を参考にしてみるのも良いかもしれません！


---
ごちゃごちゃ言いましたが、プログラミングは楽しいものです！！

一歩を踏み出して挑戦する未来のエンジニアさんにとってこの記事が少しでも役に立てたら嬉しいです。
CSM の更新をした件

# CSM の更新時期

CSM (Certified ScrumMaster®) は何年かに一度更新を行う必要があります。
これまでは特に何もなく更新費用だけで更新が出来たのですが、今回 (2020年) では何か SEUs なるものが追加されていました。

以下がそれです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/d8de71d0-5ff9-9a61-a1d2-c5cad7d6d59b.png)

```
更新可能な資格が1つあります。
バッジを選択して、スクラム教育ユニット（SEU）の数と認証更新に必要な料金を決定します。
```

SEU って何のこと？ですが、これを設定しないと更新が出来ないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/32bf13c0-c767-5ecd-e9ef-0077feb798e5.png)

```
『スクラムの基本的な原則と実践への参加と継続的な習熟度を証明する』
```

ようは資格だけ持ってても何の役にも立ててないなら更新は出来ひんよ！ってことらしい。
で、それを証明するには以下の4つのカテゴリで証明しなさいということ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/89edf843-d3c9-dcf9-fdb8-fd604f15684d.png)

- イベント
    - スクラムアライアンスグローバルミーティング、スクラムアライアンス地域ミーティング、スクラムアライアンス主催以外のイベント、ユーザーグループのイベントや活動に参加することで、SEUを獲得できます。プレゼン、コーチング、セッションへの参加はすべてSEU対象の活動としてカウントされます。
- 学習
    - このカテゴリーで許容されるSEUには、スクラムアライアンスのCST、CEC、CTC、REPとの協働のほか、さまざまな自主学習活動（プレゼンテーションの準備、関連書籍、記事、ブログの執筆、トレーニングビデオ/ウェビナーの視聴、1～2冊の本の詳細な読解など）が含まれます。
- ボランティア活動
    - コミュニティに還元することを奨励しています。そのため、SEUは有償ではないプロフェッショナルなスクラムサービスを提供することで獲得することができます。
- その他
    - スクラムアライアンスは、すべての学習が上記のカテゴリーにうまく収まるわけではないことを認識しているため、SEUは他のさまざまな学習活動を通じて獲得することができます。

それぞれのカテゴリで何をしてきたのかを登録することで目標の SEUs に達すれば更新できるらしい。
20SEUs で言えば 20 時間程度のことをすれば問題ないらしい。

無事に SEUs の登録が完了すると以下のように『RENEW NOW』と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/ead6e397-832a-dec2-9ecb-5755715ad75b.png)

更新費用の支払いは PayPal で行えるので後は簡単。
HTMLのfieldset要素について

#プログラミング勉強日記
2020年10月14日
HTMLのfieldset要素を初めて知ったのでまとめる。


#fieldset要素とは

- inputタグなど複数ある入力項目をまとめられる

　ウェブのフォーム内のラベル(`<label>`)のようにいくつかのコントロールをグループ化するために用いる。なので、複数のinputタグなどを項目としてグループ化するための要素である。

#fieldsetで使える属性

##disabled属性
　グループ化されている内部のすべての入力装置が無効になる。

##form属性
　`<form>`要素のid属性を指定することで`<fieldset>`要素は中になくてもその一部にできる。

##name属性
　グループに関連付けられた名前。

#使い方

```html
<form>
  <input type="checkbox">
  <fieldset>
    <input type="radio" name="radiocheck">sample1
    <input type="radio" name="radiocheck">sample2
  </fieldset>
</form>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/d0938982-dea3-6895-6ed0-5c15012e3b04.png)


```html
<form id="sample">
  <input type="checkbox">
  <fieldset>
    <input type="radio" name="radiocheck">sample1
    <input type="radio" name="radiocheck">sample2
  </fieldset>
  <fieldset disabled="disabled">
    <input type="text">
  </fieldset>
</form>

<fieldset form="sample">
  <input type="submit">
</fieldset>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/02b9ff09-ba97-b281-6510-995af471dc7f.png)



#参考文献
[フィールドセット要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/fieldset)
[HTMLのfieldset要素で使える属性を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/34963)
pybind11 +cmake で Python interpreter を C++ アプリに embed する

いつの頃からか, pybind11 でお手軽に python interpreter を埋め込んで exe ビルドできるようになっていました.

https://pybind11.readthedocs.io/en/stable/advanced/embedding.html

C++ がメインだったり, エントリポイントが C/C++ のプログラムの場合に役立ちます.

デフォルトでは, システムを探索して見つかった libPython とリンクします(conda などの場合は conda 環境の python など)

Python を明示的に指定したい場合は

`cmake -DPYTHON_EXECUTABLE=/path/to/bin/python ...` と, `PYTHON_EXECUTABLE` でしていします.
(lib も bin ディレクトリをベースに見つけてくれるっぽい)

pybind11 が内部的には `find_package(PythonInterp)` しているためです.

https://cmake.org/cmake/help/v3.18/module/FindPythonInterp.html

ちなみに python3.8m など suffix がついていたりしますが, suffix の意味はこちら.

https://stackoverflow.com/questions/32544974/naming-convention-what-does-the-m-mean-in-libpython3-5m-dylib

## 実行時エラーの対処

Python を Embed した C++ アプリをそのまま実行すると, `site` module が見つからないや,

``` 
Fatal Python error: initfsencoding: unable to load the file system codec                                                                    ModuleNotFoundError: No module named 'encodings'  
```

などのエラーがでるときがあります(特に Windows?).

リンクされている Python 自体は, 自身の Python 環境を知らないためです.

`PYTHONHOME` 環境変数を適切に設定してあげましょう.
(cmake bootstrap 時に見つかった Python のパスを使うのが理想)



# TODO

* [ ] 自前でビルドした Python ライブラリを指定してリンクする
  * python-cmake-buildsystem で libpython を自前 C/C++ アプリに組み込む https://qiita.com/syoyo/items/5a935fdcbdf89e0a2635
AWS 認定ソリューションアーキテクト – プロフェッショナル 試験で問われるシナリオの特性

#マルチアカウント/クロスアカウント管理のシナリオ
* Organizations
* SCP
* IAM

# ユーザディレクトリの管理
* simpleAD
* Connecter
* MSAD

# クレデンシャルとアクセス管理
*
Visual Studio 2019 で一括フォーマットしたい

Visual Studio 2019 で全ファイル一括フォーマットしたい！

こんな拡張機能があります。

https://marketplace.visualstudio.com/items?itemName=munyabe.FormatAllFiles

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/2219aa37-162d-227a-67fa-c1372a977277.png)

個人的には、この拡張機能は使ってなくてちょっとした C# のコードの一括フォーマットだと `dotnet format` コマンドを使ったりしてます。

https://github.com/dotnet/format

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/24d52bd6-9f72-2d5d-723b-c748ae5778e6.png)

インストールは以下のコマンドを叩けば完了です。

```
dotnet tool install -g dotnet-format
```

毎回コマンドを叩くのもだるいので、Visual Studio 2019 の外部ツールに以下のように登録しておくと開いているソリューションのファイルを全部フォーマットしてくれるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/f8d5df7a-3a4b-c470-f054-7ae2fbd8b627.png)

ごくごくまれにやりたくなる。
Torchvisionのmodelの最後にsoftmaxがいらない件について。

## 背景
以下のコードを見てくれればわかるが、最終層はLinerでsoftmax層が入っていない。
https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py

「え、これで大丈夫なの？」と思ったので、

## 理由
以下に全て書いてあった。
https://discuss.pytorch.org/t/torchvision-models-dont-have-softmax-layer/18071

学習時には、`nn.CrossEntoropyLoss()`を使うが、`nn.LogSoftmax`と`nn.NLLLoss.`から成り立ってるので、必要ないとのこと。

推論する際も、各クラスの確率が欲しいなら`nn.functional.softmax()`が必要だが、予測ならtorch.maxなどで最も大きい値のidxを抜いてこればいいとのこと。

クラス分類時は脳死で最終層はsoftmaxと考えていたけど、よくよく考えればloss計算に必要なだけなので、「なるほどな〜」と思った。
【python】ソートプログラムを自分で作ってみる。（選択ソート、挿入ソート、バブルソート）

#【python】ソートプログラムを自分で作ってみる。（選択ソート、挿入ソート、バブルソート）


1. [選択ソート](#選択ソート)
2. [挿入ソート](#挿入ソート)
3. [バブルソート](#バブルソート)


##選択ソート

最少値を見つけて先頭の要素と交換する。

実際の処理としては、複数の考え方を合わせる必要がある。
(1) 最少値を求める
(2) 最少値を先頭の値と入れ替える
(3) (1)と(2)を先頭が確定していない値の中で繰り返す


<br>

```python:選択ソート
def min_init(arr, x):
  min = x
  for i in range(x, len(arr)):
    if arr[min] > arr[i]:
      arr[i], arr[min] = arr[min], arr[i]

def min_sort(arr):
  for j in range(0, len(arr)-1):
    min_init(arr, j)
  print(arr)
```

```python:実行例
a = [2,4,5,3,10,1,8,6]
min_sort(a)

#[1, 2, 3, 4, 5, 6, 8, 10]
```


###考え方
####(1) 最少値を求める
まずは最少値を求める式を考える。
minの初期値を0番目として、次の数値と比較する。
次の数値が小さい場合に、minを入れ替える

```python:
#最少値を求める
def min_val(arr):
  min = 0
  for i in range(1, len(arr)):
    if arr[min] > arr[i]:
      min = i
  print(a[min])


#確認
a = [2,4,5,3,10,1,8,6,3,2]
min_val(a)

#1
```


####(2) 最少値を先頭の値と入れ替える
上記の最少値を求めるプログラムを応用して、最少値が見つかったタイミングで、その値と先頭の値を交換する。

最終的に、最少値が先頭にきた配列を求める。

```python:
#最少値を見つけて配列の先頭に移動する
def min_first(arr):
  min = 0
  for i in range(1, len(arr)):
    if arr[min] > arr[i]:
      arr[i], arr[min] = arr[min], arr[i]
  print(a)


#確認
a = [2,4,5,3,10,1,8,6]
min_first(a)

#[1, 4, 5, 3, 10, 2, 8, 6]
```


####(3) (1)と(2)を先頭が確定していない値の中で繰り返す
上記を応用して処理を繰り返す。
注意点は、minの初期値を変数にする。こうすることで比較対象範囲がひとつづつ後ろにずれていく。

定数にしてしまうと、常に同じ値と比較することになり狙った出力にならない。

```python:
def min_init(arr, x):
  min = x
  for i in range(x, len(arr)):
    if arr[min] > arr[i]:
      arr[i], arr[min] = arr[min], arr[i]

def min_sort(arr):
  for j in range(0, len(arr)-1):
    min_init(arr, j)
  print(arr)

#確認
a = [2,4,5,3,10,1,8,6]
min_sort(a)

#[1, 2, 3, 4, 5, 6, 8, 10]
```





<br>
##挿入ソート
先頭をソート済みとして、次の数値をどこに追加していくかを判断していく方法。


・未ソートの先頭の値とその前の値を比較
・未ソートの方が小さければ、未ソートがあった値を大きい値で上書きする。（未ソートの値は変数で保管しておく）
・未ソートの方が大きくなったところで確定する


```python:
def insert_sort(arr):
  for i in range(1,len(arr)):
    tmp = arr[i]  #未ソートの先頭
    j = i -1   #ソート済みの一番後ろ（未ソートの一個前）
    
    #要素を比較して、tmpの方が小さければj+1の値を置き換えていく
    while arr[j] > tmp and j >= 0:
      arr[j+1] = arr[j]
      j -= 1

    #tmpの方が大きいなら、j+1をtmpで確定する
    arr[j+1] = tmp
```

```python:確認
a = [2,4,5,3,10,1,8,6]
insert_sort(a)
print(a)

#[1, 2, 3, 4, 5, 6, 8, 10]
```

###tmpとは
変数。値が順次追加されたり、削除されたりしていく一時的な変数を明示するために使う。temporaryの略。





<br>
##バブルソート
後ろから、隣合う要素を比較して交換していく。

一番先頭の２つを比較し終わった時点で、先頭が確定する。
残りの要素で同じ操作を繰り返す。

処理の流れとしては、
(1) 最後の値を隣り合う値と比較して、より小さければ交換する。
(2) (1)の作業を繰り返す。先頭は1回づつ固定していく。

```python:
def bubble_sort(arrs):
  for j in range(0, len(arrs)):
    exchange(arrs, j)

def exchange(arr, j):
  for i in range(len(arr)-1, j, -1):
    if arr[i-1] > arr[i]:
      arr[i-1], arr[i] = arr[i], arr[i-1]
```

```
#確認
a = [2,4,5,3,10,1,8,6]
bubble_sort(a)
print(a)

#[1, 2, 3, 4, 5, 6, 8, 10]
```



**▼（参考）隣り合う値を比較し交換する**

```python:
#小さい数値を前方に移動する
def exchange(arr):
  for i in range(len(arr)-1, 0, -1):
    if arr[i-1] > arr[i]:
      arr[i-1], arr[i] = arr[i], arr[i-1]
  print(arr)


#確認
a=[8,2,6,1]
exchange(a)

#[1, 8, 2, 6]
```
Android Studio 4.1.0にアップデートしたら起動しない

Android Studio 4.1.0の正式版がリリースされましたね！
早速アップデートしてみたのですが、アップデートしたら起動しなくなってしまったので修正方法を記載しておきます！

私の場合、pleiadesで日本語化していたので、最新版のpleiadesをインストールして再度日本語化をsetupしたら無事直りました！

大した修正ではないですが、同様に躓いてる方がいましたらご参考までに！
python3.9にpillowをインストール時の対応

python3.9にpillowをインストールしようとしたらエラーになった時の対応メモ。
結論は、python3.9をpython3.8系にダウングレードしてインストール成功。

```shell

$ python3 -V
Python 3.9.0
$ pip3 list
Package    Version
---------- -------
pip        19.2.3 
setuptools 41.2.0 
six        1.15.0 
wheel      0.33.1 
```

pillowをインストール。

```shell

$ pip3 install pillow
Collecting pillow
  Using cached Pillow-7.2.0.tar.gz (39.1 MB)
Using legacy 'setup.py install' for pillow, since package 'wheel' is not installed.
Installing collected packages: pillow
    Running setup.py install for pillow ... error
    ERROR: Command errored out with exit status 1:
     command: /Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/bh/qn_1nbf10t93r800p2nf70840000gn/T/pip-install-2tumuz0z/pillow/setup.py'"'"'; __file__='"'"'/private/var/folders/bh/qn_1nbf10t93r800p2nf70840000gn/T/pip-install-2tumuz0z/pillow/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/bh/qn_1nbf10t93r800p2nf70840000gn/T/pip-record-mj6xe2pw/install-record.txt --single-version-externally-managed --compile --install-headers /Library/Frameworks/Python.framework/Versions/3.9/include/python3.9/pillow

（略）
```
調べてみるとpillowがpython3.9.0に未対応の様子。
python3.9.0をアンインストール。

```shell

$ sudo rm -rf  /Library/Frameworks/Python.framework
```

python3.8系をインストールするため、まずはpyenvをインストール。

```shell

$ brew install pyenv
```

pyenvにパスを通す。

```shell

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

python3.8.6をインストールする。

```shell

$ pyenv install 3.8.6
$ pyenv versions
* system (set by /Users/hoge/.pyenv/version)
  3.8.6
$ python3 -V
Python 3.8.6
```

pillowを再インストール。

```shell

$sudo  pip3 install pillow
$ pip3 list
Package    Version
---------- -------
Pillow     7.2.0  ★
pip        19.2.3 
setuptools 41.2.0 
six        1.15.0 
wheel      0.33.1 
```


以上。
Gitのお勉強

#Gitについてまとめていきます
最近gitを使う機会が増えてきて、理解しているつもりでも意外と理解できていないことがあったので自分なりにgitについてまとめていこうと思います。
何回かに分けて書いていこうと思いますので、「何かここ違うんじゃ、、、」等ありましたら指摘、アドバイスよろしくお願いします。

#そもそもGitって？
__分散型バージョン管理システムのこと__
簡単に言うといろんなファイルのバージョン管理が簡単にできるシステムのこと、分散型なので複数人で編集したりする時に便利で、編集履歴を複数人で共有できたりします。バージョンを戻したりするのも簡単です。


#分散型をもう少し詳しく
分散型というものを理解するにはSubversionと比較するとわかりやすいのでSubversionとの違いを見ていきたいと思います。
ちなみにSubversionというのは__集中型バージョン管理システム__です。大きな違いは。。

###ローカルリポジトリの有無
集中型のリポジトリ（バージョン管理するためのデータベースのようなもの）がリモートにのみ存在するのに対し、分散型は各々のローカルにもリポジトリが存在します。
![スクリーンショット 2020-10-14 16.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394397/f84a8fec-c06c-a1e9-8082-770c540bd075.png)
イメージでいうとこんな感じです。

Subversion（集中型）はリポジトリが１つで仕組みがシンプルですがGit（分散型）はリポジトリが複数存在することになるので少し複雑になります。集中型と違い分散型はローカル上でコミットでき、尚且つ変更内容を共有（リモート）リポジトリに反映させるかは任意なので試験的や未完成なもので他の人に迷惑をかけることがなく作業できます。またローカルにリポジトリが存在するのでブランチやマージといった操作が手軽に行えます。


***
ざっくりとした説明でしたがなんとなくgit（分散型）についてイメージできたでしょうか、リポジトリやコミット、マージと言った言葉が出てきて難しいとは思いますが、それぞれの言葉についても簡単に説明した記事を書きましたのでよかったらみて見てください。
こちら→[Gitで使う用語のまとめ](https://qiita.com/ken017/items/669841e877da5a103252)

あとはGitの仕組みについてなどもいろいろ試して書いていこうと思います。記事が完成次第こちらにもリンク等追加していこうと思いますのでよかったら見てみてください。
Travis CI で arm64/aarch64 な OSS プロジェクトの CI ビルドを行う


現状(2020/10 月)では, サービス側のビルドサーバで arm64 ビルドに対応しているのは Travis CI だけです(beta 段階).

https://docs.travis-ci.com/user/multi-cpu-architectures/

PowerPC なども対応しています. いずれ RISC-V 対応もくるかしらん?

ARM(aarch64)対応は `arm64` `arm64-graviton2` の二種類があります. `arm64-graviton2` は自前でビルドインスタンス用意する用かしらん. graviton のほうが性能いいのかしらん? 

## 例

embree-aarch64 を対応しました.

https://travis-ci.org/github/lighttransport/embree-aarch64


基本的には `arch` に arm64 を追加するだけですので簡単です.

## arm インスタンス

`cat /proc/meminfo`, `cat /proc/cpuinfo` でインスタンスを見たところ, メモリ 4GB + 32 cores(threads?)な構成でした. メモリ少なくいびつな感がありますが, 実際のところは Docker なりの sandbox で動いていて, 実メモリはもうちょっとありそうな感があります.
【Python3エンジニア認定データ分析試験】受験・合格体験記

# はじめに
[以前受験したPython3エンジニア認定基礎試験](https://qiita.com/drafts/43722644337c4f04a1e8/edit)に続いて、Python3エンジニア認定データ分析試験を受験し、合格しました。
合格のための勉強法や受験して思ったことを基礎試験同様まとめていきたいと思います。


# そもそもPython3エンジニア認定データ分析試験って？
[一般社団法人Pythonエンジニア育成推進協会](https://www.pythonic-exam.com/pythonic)が実施している民間資格試験です。
2020年春からPythonを使ったデータ分析の基礎や方法を問う試験として始まりました。

受験方式はCBTで全国の試験センターでいつでも受験でき、受験料は1万円(税別)。

# 筆者のレベル
* プログラミング歴4ヶ月
* 1ヶ月前にPython3エンジニア認定基礎試験合格
* Udemyで関連するコースをいくつか受講
* SIGNATEのBeginner限定コンペを経験、Tier5に昇格
* 実務未経験

# 出題範囲
「Pythonによるあたらしいデータ分析の教科書」（翔泳社）より出題、とされています。
私は上記教材を利用しましたが、そこまで目新しい情報はないのでなくても大丈夫かもしれません。
というか指定教材は内容も薄く索引が使いにくいので、正直微妙です。
ただし、基礎試験同様指定教材にあるコードがそのまま出たりするので、あると試験には有利です。
(唐突にライブラリに標準で入ってるデータセットの話とかが出てくるので知らないとぎょっとします。)

# 勉強方法
1. SIGNATEのBeginner限定コンペなどに挑戦し、実際に手を動かす。
1. 認定スクールである[Prime Strategy](https://study.prime-strategy.co.jp/)と[DIVE INTO EXAM※](https://exam.diveintocode.jp/exam)の模試を受験する。
1. 理解できていないところがわかるのでチュートリアルやGoogle先生で調べる。
1. 調べた内容をまとめてEvernoteに残しておく。

2〜4を繰り返し勉強しました。

※DIVE INTO EXAMの模試は2020年10月に始まったばかりで、まだ誤字がちらほら見られるので注意が必要です。
# 勉強期間
試験のために集中して勉強したのは丸一週間程度。
試験関係なくデータ分析の勉強をしたのは約50時間程度でした。

# 受験して思ったこと
実際受験してみてどうだったか？
## 難易度は？
指定教材をしっかり読み込んだり、実際にデータ分析をした経験がある程度あれば難しくはないです。
基礎試験同様__模試のほうがちょっと難しい__です。__模試と全く同じ問題が出た__りもします。
実際にライブラリを触った経験があったほうが圧倒的に理解が早いので一度SIGNATEやKaggleのコンペティションを通してデータ分析に挑戦することをおすすめします。
__試験ではメモ用紙が与えられない__ので、ある程度暗算・暗記が必要です。正直ちょっと焦りました・・・。

## 良かった点
* 自分が使ったことがないコードやその仕組みを知ることができた
* 試験を意識することで短期間で集中して勉強できた
* 未経験だけどちゃんと勉強してまっせ、という箔が付いた(と、思いたい)

## 悪かった点
* やっぱり受験料11000円は高いよね・・・
* 資格の価値が未知なのでコスパとしてはどうだったのか
* 試験結果が点数しか出ないのでどこの問題を間違えたのかわからない

# ちなみに
基礎試験同様試験に合格し、合格体験記を応募すると、公式~~ネタ~~グッズが貰えます。
データ分析試験合格者のみステッカーも選択することができます。
最近グッズにサーモスの水筒が追加されたようです。実用性ならこれ。

# おわりに
こういった民間資格は意味がない！と言う人もいますが勉強のモチベーションを得るきっかけや知識の証明にもなるので個人的にはアリだと思っています。
（ある程度実績が担保されている人が今更受けるのはさすがに無意味だと思いますが・・・。）

今後は統計検定2級などを目指したいですが、難易度が跳ね上がるのでしばらく先になると思います。
[Rails]enumの使い方

# はじめに
アプリ開発でActive Hashではなくenumを使ってみたので軽くまとめてみました。
# 目次
1.テーブルの設定
2.モデルの設定
3.ビューファイルの設定
# 1. テーブルの設定
今回はgenderというカラムにenumを使っていきます。
enumを使う際はカラム型を**integer型**にする必要があります。

|カラム名|カラム型|
|:------:|:------:|
|gender|integer|

# 2. モデルの設定
モデルファイルにデータを記述します。
enumは以下のようなハッシュの形で定義します。

##### 例
```ruby
enum gender: { man: 0, woman: 1, other: 2 }
```

# 3. ビューファイルの設定
今回はラジオボタンとして表示しました。
第一引数にカラム名、第二引数にモデルで定義した値を記述します。

```ruby
<div class="field">
  <%= f.label :man %>
  <%= f.radio_button :gender, :man %>
  <%= f.label :woman %>
  <%= f.radio_button :gender, :woman %>
  <%= f.label :other %>
  <%= f.radio_button :gender, :other %>
</div>
```

##### manが選ばれたときのデータベースへの保存の流れ
ビューでmanをキーとして送信→コントローラー→モデルで送られてきたキーを元に番号を探す→データベースに数値で保存
# 参考リンク
https://madogiwa0124.hatenablog.com/entry/2017/12/24/222156
【入門】Vagrant＋VirtualBoxの仮想環境をWindow10上に構築する【環境構築】

初めてWindow10でVagrantの環境構築を行いました。
色々な入門記事を参考にCentOS7をVagrantとVirtualBoxを使って、構築します。

初めての経験だったので、予期しないエラーが多く発生して大変でした…。


後学の方が簡単に環境構築できるように、役に立つと幸いです。

# 環境
Window10 
Vagrant2.2.10
VirtualBox5.2.44



# Vagrant の練習ファイル作成手順

## Hyper-V を無効にする

**_Docker_** を使ったことがある Window10 のユーザーは、まず Hyper-V をオフにします。

絶対にOFFにしてください！！！！！


```
bcdedit /set hypervisorlaunchtype off
この操作を正しく終了しました。
```

## VirtualBox インストール

僕は、5系の最新版をインストールしました。インストーラは[こちら](https://www.virtualbox.org/)から入手し、実行します。

## vagrant インストール

執筆時点の最新バージョン2.2.10をダウンロードしました。基本は最新バージョン(64bit)をインストールしましょう。インストーラは[こちら](https://www.vagrantup.com/downloads.html)から入手し、実行します。
インストール後、OS の再起動が必要です。

再起動後、コマンドプロンプトを起動し、バージョンを確認します。

```
vagrant -v
Vagrant 2.2.7
```

コマンドプロンプトで plugin をインストールしておきます。
必要に応じて Chef をインストールしてくれるオムニバスプラグインと、ホスト・ゲスト間の共有フォルダ構成のため VirtualboxGuestAddition ツールを導入します。（ないとエラーが出る）
複製用に vagrant-hostmanager もインストールします。

```
vagrant plugin install vagrant-omnibus
vagrant plugin install vagrant-vbguest
vagrant plugin install vagrant-hostmanager
```

アンインストールしたいときは、

```
vagrant plugin uninstall vagrant-omnibus
vagrant plugin uninstall vagrant-vbguest
vagrant plugin uninstall vagrant-hostmanager
```

### インストールされている pluigin の表示

```
vagrant plugin list
```

## CentOS7 box の追加

vagrant は box と呼ばれるイメージファイルと構成ファイルを使って管理します。CentOS 7.7 の box を [vagrantcloud.com](https://app.vagrantup.com/bento/boxes/centos-7.7)からダウンロードし、virtualbox 用として追加します。

これは**_コマンドプロンプト_**でいけます。

_不安なぐらい処理時間が長いので早くも休憩です。_

```
> vagrant box add bento/centos-7.7 --provider virtualbox
==> box: Loading metadata for box 'bento/centos-7.7'
    box: URL: https://vagrantcloud.com/bento/centos-7.7
==> box: Adding box 'bento/centos-7.7' (v202002.04.0) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/bento/boxes/centos-7.7/versions/202002.04.0/providers/virtualbox.box
    box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com
    box: Progress: 100% (Rate: 457k/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'bento/centos-7.7' (v202002.04.0) for 'virtualbox'!
```

## vagrant 管理用フォルダの作成と初期化

vagrant を管理したい場所のファイルを作成して、プロジェクトの初期化を行います。

```
vagrant init bento/centos-7.7
```

10MB 程度の Vagrantfile が作成される。  
仮想マシンが起動するとログファイルや管理情報が保存される。

## 仮想マシンを起動

vagrant up コマンドで仮想マシンを起動します。

```
vagrant up
```

## 仮想マシンに接続

```
vagrant ssh
```
これで、練習用に作成した仮想マシンに接続することが出来ます！！

## 再度 Docker を使いたいとき

設定を Auto に戻す

```
bcdedit /set hypervisorlaunchtype auto
```
そして、再起動


作成日 2020/10/14
更新日 2020/10/23

# 参考文献

1. [vagrant + VirtualBox + CentOS 7.7 環境構築 (Windows 10)](https://qiita.com/kanazwk/items/6d0c62480580a570cbb5)
1. [Windows で Vagrant を起動しようとすると Raw-mode is unavailable courtesy of Hyper-V と言われる](https://www.utakata.work/entry/20181021/1540122986)
2. [Window10でVirtualBoxが使えない。](https://teratail.com/questions/297165#reply-419528)
Gitの差分をSourcetreeで簡単にリセットする方法

#Gitの差分、元に戻すのめんどくセーー
Gitの差分を元に戻したい時、ありますよねーー。
別のブランチに変更したい時とか、ぐちゃぐちゃになってやり直したい時とかw

実はSourcetreeを使えば、簡単にリセットができました！:joy:

#Sourcetreeから差分をリセット
![スクリーンショット 2020-10-14 18.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/b2705a58-221c-8a92-d776-488b0565bd2c.png)
コミットをクリック

![スクリーンショット 2020-10-14 18.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/aecf295e-e981-0837-6352-95201eb118ac.png)

**リセットしたいファイルを選択して右クリック→リセット！**


これでローカルリポジトリは健全な状態に戻りましたとさ:blush:
【AWS初学者用】 AWS ELBとは？

# 本記事について
本記事はAWS初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## ELBとは？

>Elastic Load Balancing は受信したアプリケーションまたはネットワークトラフィックを、Amazon EC2 インスタンス、コンテナ、IP アドレス、複数のアベイラビリティーゾーンなど、複数のターゲットに分散させます。Elastic Load Balancing はアプリケーションへのトラフィックが時間の経過とともに変化するのに応じてロードバランサーをスケーリングします。また、大半のワークロードに合わせて自動的にスケーリングできます。

上の文はAWS公式ページからの引用です。私の知識不足のせいか分かりませんが、この文章ではいまいちピンときませんね...

ELB(Elastic Load Balancing)
「Elastic」は弾力性のある・伸縮性のある、という意味です。
「load」は負荷という意味。
「Balancing」はバランスとるやつ、みたいな意味と思ってください。

この訳通りに行くと「伸縮性があって負荷のバランスをとるやつ」。
要するにELBとはEC2などの他のサービスへの通信トラフィックを分散して、安定した稼働をサポートしますっていうやつですね！いわゆる**ロードバランサー**です。
EC2に適用したい場合はEC2インスタンスを登録するだけで利用でき、この登録されたEC2インスタンスを**バックエンドインスタンス**と呼びます。
ELBの主な機能としては「**通信トラフィックの分散**」、「**セキュリティ機能(SSL)**」、「**ヘルスチェック**」、「**高可用性**」があります。

## 通信トラフィックの分散
通信トラフィックの分散は、複数のサーバーに通信トラフィックを分散してサーバーへの通信トラフィックの集中によってサーバーダウンすることを防ぎます。

## セキュリティ機能(SSL)
ELBはセキュリティ機能としてSSLの復号機能があります。これによりSSLの証明書や設定の管理が行えます。

## ヘルスチェック
ELBは常に接続しているサーバーをモニタリングし、正常に動作しているかをヘルスチェックしています。ヘルスチェックで以上が検知された場合は、そのサーバーへの振り分けを停止して他の正常なサーバーで通信を行います。
また、ELBを解除するときにそのサーバーの処理が残っていると処理が中断してしまう危険があります。そんな時は「**Connection Draining**」という機能を使いサーバーの処理が終わってからELBを解除できるようにします。

## 高可用性
ELBは通信トラフィックを複数のAZに分散する事ができ、例えAZに障害が発生したとしても通信トラフィックは正常なバックエンドインスタンスにのみに振り分けられるので通信を継続する事が可能とのことです。

## ELBの種類
ELBには３種類あり、それぞれに特性があります。

### Classic load Balancer (CLB)
EC2インスタンスへの標準的な負荷分散を行う。標準的なロードバランサーです。
AWS VPCを使用する場合はCLBではなく以下で紹介する**ALB**か**NLB**を使用しましょうとのことです。

### Application Load Balancer (ALB)
3つの中でもっとも評価の高いロードバランサーです。CLBの機能に加え、HTTP・HTTPSトラフィックの負荷を分散し、柔軟なアプリケーションの管理ができます。
最新のアプリケーションアーキテクチャにも対応しています。

### Network Load Balancer (NLB)
低レイテンシで高いスループットを実現し、高度なパフォーマンスが必要なときに使用する。
送信元のアドレスを保持し、レスポンスはクライアントへ直接返す。TCP/UDP/TLSのトラフィックの負荷分散にも向いているようです。


##まとめ
AWS ELBは３種類あるロードバランスの総称という感じですね。
トラフィックの分散をし、セキュリティも強化でき可用性も上げられる大変便利なサービスです！
ELBには無料利用枠などはなく使用した分だけ支払う料金体系のようです。
Dockerを使ってpytorchでcuda11.0を使用する

2020年10月14日現在では、[pytorch公式](https://pytorch.org/)にはcuda11.0向けのインストール方法が掲載されていません。
そこで、Dockerを使用したcuda11.0向けのpytorchの環境構築の手順を説明します。

# 前提条件
前提としてDockerとnvidiaドライバーがインストールされているものとします。
これらのインストールは他の記事などを参照してください。

```
$ nvidia-smi
```

上記のコマンドで、cudaのバージョンが11.0になっていることも合わせて確認してください。

# Pytorchのコンテナをダウンロードする
[nvidiaのサイト](https://ngc.nvidia.com/catalog/containers/nvidia:pytorch)にアクセスしてユーザー情報を登録後、Pytorchの画面を開いてください。

```
$ sudo docker pull nvcr.io/nvidia/pytorch:20.09-py3
```

pull commandに上記のコマンドがあるのでこれをコピーしてターミナルで実行します。

```
$ sudo docker images
```

このコマンドでインストールできたかを確認してください。
nvcr.io/nvidia/pytorch    20.09-py3
というimageがあれば成功です。

# Pytorchがcudaを使えるか確認する
先ほどのimageを一覧表示するコマンドを実行して、pytorchのIMAGE IDを確認してコピーして下記コマンドを実行します。

```
$ sudo docker run -it --gpus all [IMAGE ID] bash
```

その後、bashで

```
$ python
>> import torch
>> print(torch.cuda.is_available())
```

これでtrueが返ってきたら成功です。
bashはcontrol + dで抜けれます。(Linux)

# コンテナを作成してファイルをマウントする
一度、bashから抜けてください。

```
$ sudo docker ps -a
```

上記のコマンドで先ほどbashを実行した際に作成されたcontainerが確認できます。これのCONTAINER IDを使用します。

```
$ sudo docker inspect [CONTAINER ID]
```

control + fでWorkingDirを探します。
さらに、自分が作業を行いたいPC上のフォルダのパスをコマンドで確認します。

```
$ pwd
```

その後、先ほどのnvidiaのサイトにoverviewで説明されているようにコンテナを作成します。

```
$ sudo docker run --gpus all -it --rm -v [作業を行いたいフォルダのパス]:[workingDir] nvcr.io/nvidia/pytorch:20.09-py3
```

私のケースだと

```
$ sudo docker run --gpus all -it --rm -v /home/myname/Desktop/hoge:/workspace　nvcr.io/nvidia/pytorch:20.09-py3
```

その後、containerが立ち上がることが確認できるはずです。

# 最後に
タイポなどがある可能性があるので気をつけてください。
公式がインストール方法を掲載してくれるまでの繋ぎになれば幸いです。
自作キーボード(chavdai40)を作ったお話。

# chavdai40を作ってみたので、買ったパーツなどをまとめておく。

1. 購入物品  
 + PCB chavdai40 (遊舎工房) https://yushakobo.jp/shop/consign_chavdai40/
 + キーキャップ Dolch Thick PBT key cap ANSI ISO layout (Aliexpress)
 + キーキャップその2 OEM profile PBT personality keycap big key area RGBY 10 Keys (Aliexpress)
 + スタビライザ 適当なやつ (Aliexpress)
 + キースイッチ Geteron 茶軸 (Aliexpress)  
61key用のキーキャップを購入したのでchavdai40を44keyで組むには一部サイズが足りず、カラーのキーキャップも別で買いました。
数字キーの列が実際にはないのでその辺りは思いっきり余ってますが…（汗）  
組み上がった写真はこんな感じです。
![Ei0m34KVoAENAgm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68052/ac1ed5db-eede-7980-75f9-819462313c67.jpeg)


2. 組み立て手順  
リンク先参照
https://github.com/dvorak55/chavdai40/
実際、キースイッチをはめて半田するだけでした。
スタビライザが安物だったんで、最初基盤にきちんと嵌まらず斜めになってるのに気付かなくて、キーが戻ってこないっていう罠がありましたが。

3. ファームウェア書き込み方法  
`sudo dfu-util -a0 -d 0x0483:0xdf11 -s 0x08000000 -D chavdai40_rev1_44keys-qwerty.bin`  
自分はホストPCがUbuntuだったんでdfu-utilを使って書き込みました。
dfu-programmerで書き込む手順は割と公開されてるのですが、Atmelのコントローラがターゲットの場合がほとんどでSTMicroのコントローラに書き込む事例があまり無くて少し探しました。

4. 現在のキーマップ  
 + Base Layer  
 ![chavdai40_baselayer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68052/b25013bb-89d2-5d76-3301-f4ef259cf368.png)

 + Layer1  
 ![chavdai40_layer1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68052/846c7ff8-3aed-21c1-0a6d-5a9d109c1088.png)

 + Layer2  
 ![chavdai40_layer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68052/7f20a90b-fd4a-7c30-6e6f-6e5e676825d1.png)

レイヤ切替はトグルにしてあります。
javascriptでitemの件数を指定し、シャッフルする関数

忘備録です。
既に設置してあるliが多い時、無理やり件数を絞ってシャッフル表示がしたい時用です。

    var shuffleItem = function (max) {
       var randomContent = [];
        i = 0;
        $('.itemList .item').each(function() {
            randomContent.push($(this).html());
        });
    
        randomContent.sort(function() {
            return Math.random() - Math.random();
        });
    
        $('.itemList .item').remove();
    
        for (i = 0; i < max; i++) {
            $('ul.itemList').append('<li class="item">' + randomContent[i] + '</li>');
        }
    }

よりスマートな書き方があれば教えてください。
rails test dbのみdrop

circle ciとローカル環境でテスト結果が異なるので、念のためtest用のdbをdropしてからmigrateしてみました


```

rake db:drop RAILS_ENV=test
rake db:create RAILS_ENV=test
rake db:schema:load RAILS_ENV=test
```

### 参考記事
[Rails 4: How to reset test database?](https://stackoverflow.com/questions/25877734/rails-4-how-to-reset-test-database)
Power AutomateでLINEに投稿された画像のbase64文字列を取得する

Power Automateを使ってLINE Botに投稿された画像を取得して、
その画像をbase64文字列に変換するのに手こずったのでメモとして残します。

# 経緯
とある画像解析APIに画像を渡す際、受け付けてくれるフォーマットがbase64だった。

# Power Automateで用意されているもの
既存の式にbase64のものが複数ありましたが、どれもbase64から変換するものばかりでした。

* [base64ToBinary](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#base64ToBinary)
* [base64ToString](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#base64ToString)

# ほしいもの
バイナリ形式→base64にエンコードしてほしい！! と検索したものの情報が全くありませんでした。

# 情報取得
色々検索すると下記の情報に行き着きました。
内容は、自動的にbase64に変換されたものが返ってくるみたいです。

https://debajmecrm.com/binary-to-base64-in-microsoft-power-automate-microsoft-flow/

返ってくる形は以下のイメージ。この `$content` の中身がほしい！！

```
{
  "$content-type": "image/jpeg",
  "$content": "/9j/4AAQSkZJRgABAQAAAQABAAD/......"
}
```

# $contentを取得
変数文字列にHTTPで取得した画像バイナリの中身を取得します。
LINEに投稿された画像は下記のように設定すればバイナリデータを取得することができます。

![s100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/7aa6d784-c982-3a3c-aa86-f3d0b4278199.png)

|項目|値|
|:--|:--|
|①名前変更|「LINE画像取得」に変更しました|
|②方法|GET|
|③URI|https://api.line.me/v2/bot/message/@{items('Apply_to_each')?['message']?['id']}/content|
|④ヘッダー|AuthorizationとBearerにLINEのアクセストークンを明記|

変数base64というものを用意して、そこに渡します。

![スクリーンショット 2020-10-14 18.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/12ad0918-02a8-f2fc-caee-f012307738bc.png)

値は下記の通り。途中にある `LINE画像取得` はHTTPの名前を変えたので、ご自身の環境に合わせてください。
値にコピペすると反映されます。

```
@{body('LINE画像取得')?['$content']}
```

LINE画像取得の本文内にある `$content` を取得します。

# まとめ
`@{body....}` の記述方法を見つけるのにとても苦労しました。
単純にbase64エンコードしてくれる式があればいいのにと思いました。
SPRING Pagination Max Page setting

```java
   @Configuration
   public class WebMvcConfig imlements WebMvcConfigurer{
      @Override 
      public void addArtgumentResolvers(List<HandlerMethodArgumentResolber> argumentResolvers){
           PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();

           resolver.setFallbackPageble(PageRequest.of(0, 100));
           argumentResolvers.add(resolver);


      }
}
```

https://stackoverflow.com/questions/23751193/spring-data-jpa-limit-pagesize-how-to-set-to-maxsize

設定したらJPARepositoryでPageableを渡したら、自動的にpaginationができる
pipfileを作成して dockerに反映したい

# pipfileを作成して dockerに反映したい
```
pipenv install django-localflavor
```
これをローカルで行う。

```
# Dockerfile
COPY Pipfile .
COPY Pipfile.lock .
RUN pip install pipenv
RUN pipenv install --system
```

```
docker-compose build
```
これで、Docker環境に反映できる

Docker環境に入って、pipでインストールとかしてもなぜかダメで、ローカルで環境をインストールしてからやる必要がある
E2Eテストの始め方 番外編 - reg-cliで差分比較 -

今回は、TestCafeで撮影したスクリーンショットの差分比較をreg-cliを使って実装していきます。

スクリーンショットについては↓を参考にしてください。
[E2Eテストの始め方 TestCafe③ -スクリーンショット編-](https://qiita.com/natsu_mikan/items/60b51a0d87dcc98e7e9b)

#reg-cli(reg-suit)とは
Visual Regression Testingのためのコマンドラインインターフェイスです。
画像は別途用意する必要がありますが、アサートする画像を指定するだけで現在の画像と以前の画像を比較し、差分のHTMLを作成してくれます。


2つの違いとして、
**reg-cli**：２つの画像(ディレクトリ)を指定し実行すると分かりやすい差分HTMLレポートを生成するコマンドライン。
**reg-suit**：reg-cliの進化版みたいなものでreg-suitの内部でreg-cliが使われています。正解データや差分レポートを自動的にクラウドストレージ(AWS S3, Google Cloud Storageなど)に保存できたり、GitHubと連携してPull Requestに対する差分レポートを表示してくれます。


reg-suitの方が多機能ですが、今はクラウドストレージに保存したりする必要がなかったのでシンプルなreg-cliを導入しました。将来的にはGitHub連携もできたらいいなと思っているのでその時にreg-suitに切り替えようと思います。

では、さっそくreg-cliを使ってみましょう！

##install
npmもしくはyarnでインストール。Node.jsはver.8以上をサポートしています。

```
$ npm i -D reg-cli
```

##usage
```
$ reg-cli ./path/to/actual-dir ./path/to/expected-dir ./path/to/diff-dir -R ./report.html
```

`./path/to/actual-dir`に比較元のディレクトリパス、`./path/to/expected-dir`に比較対象のディレクトリパス、`./path/to/diff-dir`に差分画像保存ディレクトリパス、`./report.html`にレポートHTMLの吐き出し先を指定します。


上のコマンドを実行すればreport.htmlが吐き出されるのでブラウザで見てみると、
![スクリーンショット 2020-10-14 16.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174180/cda05e78-a80e-522e-3cdb-eb12fb3f8149.png)
画像のようにサイドバーには「CHANGED：差分があるもの」「NEW:新規追加されたもの」「PASSED：差分のないもの」に分けられています。

差分があった箇所は赤く表示されており、確認したい画像を選択すると
**Diff**：生成した差分のOverview
**Slide**：BeforeとAfterのハンドルをスライドして比較
**2up**：BeforeとAfter2つを並列に並べて比較
**Blend**：BeforeとAfterを透過させながら滑らかに比較
**Toggle**：BeforeとAfterを切り替えながら比較
の5つの比較方法で確認することができます。
リニューアル前のUIですがサンプルが用意されているので下記URLから体験してみてください！
https://reg-viz.github.io/reg-cli/


reg-cli導入の基本は以上となります。インストールしてコマンド実行すればよいだけなのでとても簡単に導入することができます！

##実行環境をpackage.jsonにまとめる
reg-cliに関してはターミナルで上記コマンドを実行すれば良いですが、私の場合TestCafeでスクリーンショットを撮り、reg-cliで差分比較、sharpでスクリーンショット連結(今後記事を書く予定！)などの処理をしているのでpackage.jsonに諸々書いてそれらを実行しています。

```pacakge.json
"scripts": {
 "vrt": "yarn run vrt:screenshot && node e2e/convert.js && yarn run vrt:reg ",
 "vrt:screenshot": "testcafe e2e/screenshot.js",
 "vrt:reg": "reg-cli ./screenshots/20201009/**/corporate ./screenshots/20201010/**/sample ./screenshots/diff/sample -R ./screenshots/diff/sample/report.html -U"
}
```
`$ npm run vrt`とコマンド打てばスクリーンショット→画像連結系の処理→reg-cliで差分比較が順番に実行されるようにしています。(&一つで並列処理、&&で直列処理)

##

###GitHub
reg-cli：https://github.com/reg-viz/reg-cli
reg-suit：https://github.com/reg-viz/reg-suit
###参考
[コンポーネント/単体テスト単位でのvisual regressionテストを行うためのツールを作った話し](https://qiita.com/bokuweb/items/bf9de229a3c91c01a480#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%81%AE%E5%B7%AE%E5%88%86%E6%AF%94%E8%BC%83%E3%82%92%E8%A1%8C%E3%81%86)
[reg-cli の Report UI をリニューアルした](https://blog.wadackel.me/2019/reg-suit-report-ui/)
【小ネタ】その辺のReact(Vue)のGitHubリポジトリをcodesandboxで開く

超小ネタ注意報

「初めて出会ったあの時から知ってるわい」な人が多い気がするのだけど今まで全く気がつかなかったので同士へ向けて記事を書いてみた。

Reactでオートコンプリート(サジェスト機能)を実装したかったけどyarnで引っ張るの面倒だなあ「あれ、実はcodesandboxで普通にImportできるのでは？」と思ったら普通にできたので自分のケースでこの小ネタを紹介。

##ソース
海外エンジニアYoutuberのBigless27さんの動画に貼ってあったポケモンの名前のオートコンプリートの実装サンプル動画が主の元ネタだ
Custom Autocomplete in React with Hooks! - https://www.youtube.com/watch?v=vXO5JMiKtM8&ab_channel=LessononCoding

今回引っ張ってくるGitHubリポジトリのリンクはこちら https://github.com/Bigless27/react-autocompelte

### codesandboxの左側メニューの「Repositories」から「Import Repository」を選ぶ
![git1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/5065b265-cbf8-3a40-cb41-47e00fc0e6aa.jpeg)


### 先ほどのGitHubリポジトリの動画を貼って「Import and Fork」する

![git2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/5df8017f-c78a-a7a3-2682-eb7e8f341dd8.jpeg)

するとこんな風にimportできた

![git3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/667f9cc6-9b58-fc67-35e7-7a94e5a3b187.jpeg)

## 感想
1千兆年より前から知っておきたかったしこういう小さなところで便利な世界はきっともっとあるんだろうな
【shell】コマンドで任意のファイルをZip圧縮してファイル作成して元ファイルを削除する。

メモとして残します。


#やり方
```shell
zip -m -j "圧縮先ファイルフルパス" "圧縮対象ファイルフルパス"
# -m オプション：圧縮する元ファイルを削除する。
# -j オプション：対象ファイル単体を圧縮する。（このオプションがない場合はファイル構造込みで圧縮される。）
```

以上。
Ruby 指定範囲だけ大文字

# はじめに
これは学習のメモになります。

スペース区切りの2つの整数と、文字列が入力されます。2つの整数の範囲の部分文字列を、大文字に出力していきます。

```
入力例1
2 6
this is a pen

出力例1
tHIS Is a pen
```

```
入力例2
2 6
Welcome to the paiza! I`m studying ruby!

出力例2
WELCOMe to the paiza! I`m studying ruby!
```

# ソースコード
```
nums = gets.chomp.split(' ')
str = gets.chomp

(1..(str.size)).each do |i|
  if nums[0].to_i <= i && i <= nums[1].to_i
    print str[i - 1].upcase
  else
    print str[i - 1]
  end
end
```

# 解説

```
nums = gets.chomp.split(' ')
str = gets.chomp
```
getsメソッド：　入力を一行ごとに「文字列」で受け取る。
chompメソッド：　文字列の改行を取り除く。
splitメソッド：　文字列を分解して配列にする。

```
(1..(str.size)).each do |i|
```
1から`size`メソッドで`str`の文字列をi変数に代入して1つずつ繰り返す。（１３回）

```
if nums[0].to_i <= i && i <= nums[1].to_i
    print str[i - 1].upcase
  else
    print str[i - 1]
  end
```
if文でnums[0]（例１だと２）よりもi(配列番号)が大きいかつ、nums[1](例１だと6）よりもi
(配列番号)が少ない場合、`upcase`で大文字に変換する。

そうでなければそのまま出力。

# 最後に
ちょっと説明がわかりづらいかもしれません。
間違っているところがあればご指摘いただけると幸いです。
herokuでGoogle Cloud のサービスアカウントキーを設定する

# はじめに
Ruby on Railsでポートフォリオを作成しているRails初学者です。以前、以下の記事でGoogle Cloud Vision APIを使った簡単な画像解析を実装しました。

[Railsで画像プレビュー時にGoogle Cloud Vision APIに連携し、データラベルを取得する](https://qiita.com/mu-j/items/36676bd863ebfbafa2ae)

しかし、**heroku本番環境でうまく起動しない・・・(+ +)**
おそらく認証周りがうまくいってないようだなぁというのはわかったのですが、直すのに案外時間がかかってしまったので、覚書として残しておきます。

# 原因
herokuに各種プログラムファイルを投入する際、gitを使用しています。

```:terminal
git push heroku master
```

つまりは、githubと同じ情報をheroku側にpushしています。
githubにキー情報をもつファイルなどは上げないように設定をしているので（.gitignore）、結果的にherokuにもキー情報をもつファイルはアップロードされません。
結果、Google cloud vision APIで接続の際に必要な、サービスアカウントキーを持つjsonファイルもheroku側には投入されていませんでした。

今回はこの、情報をうまく渡すための方法について見ていきます。

# 解決策

今回行うのは、環境変数としてherokuに渡しておき、そこから呼び出すという作業です。
ファイル自体をherokuのコンテナ上に置くのではなく、必要なキー情報を変数に設定します。

## herokuの設定

1.herokuにアクセス
まずは、herokuの画面にアクセスし、設定するアプリを選択します。

2.Settingsにアクセス
画面内のタブ、Settingsをクリック

3.Reveal Config Varsをクリック
Settings内にある、Reveal Config Varsのボタンをクリック
![スクリーンショット 2020-10-14 17.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176783/eef2c439-6b19-6234-a464-ec27ebaa3e55.png)

4.環境変数を設定
3.のボタンを押すと、設定済みの環境変数が出てくるので、そこに新たに
`GOOGLE_CREDENTIALS`(任意の文字列でOK)と、サービスアカウントキーファイル内の全てをコピペし登録します。

5.herokuを再起動
環境変数を設定した後、`heroku restart`で再起動してください

## controllerの設定
controllerもこれに合わせて設定していきます。

```ruby:XXXX_controller.rb
:
    #Vision APIの設定
    if Rails.env.production?
      config.credentials = JSON.parse(ENV.fetch('GOOGLE_CREDENTIALS'))
    else
      config.credentials = ENV["GOOGLE_APPLICATION_CREDENTIALS"]
    end
:
```

今回は本番環境の場合、herokuに設定した環境変数を取得し、
JSONファイルとしてconfigに設定するように変更しました。

以上で、herokuでもGoogle Cloud Vision APIが使えるようになりました！

# 終わりに
簡単な設定にもかかわらず時間がかかってしまいました・・・
herokuのログをキチンと確認すること、またログの情報が不十分であれば、
以下の設定をし、詳細情報を確認してみるとわかるかと思います。
https://qiita.com/YujiNaito/items/3102ad59124d38433b2e

また、この環境変数から強引にやるが正解なのかどうかは不安です・・
セキュリティ的にOKなのかな？もっといい方法はありそうですね・・・
これよりもいい方法があるよ！などありましたら、ぜひコメントいただけますと幸いです。
Excel VBA 小技

# Excel VBAの覚書的小技集

## VBAで絵文字
UNICODEを直接埋め込む方法。
ワークシート関数のUnicha関数を使う。


    Call r.Replace("A", Application.WorksheetFunction.Unichar(&H1F60D)) '範囲にあるAを😍に置換

## ワークシートの有無
ループしないでワークシートの有無を調べる方法。
どのブックから探すのかを指定する方法と、戻り値を設定する方法が素敵。
以下からの引用
https://stackoverflow.com/questions/6040164/if-worksheetwsname-exists/6040390#6040390
日本語の解説はこちら
https://mk-55.hatenablog.com/entry/2017/05/24/003159

    Public Function SheetExists(byval SheetName As String, Optional wb As Excel.Workbook) as Boolean
        Dim s As Excel.Worksheet
        If wb Is Nothing Then Set wb = ThisWorkbook
        On Error Resume Next
        Set s = wb.Sheets(SheetName)
        On Error GoTo 0
        SheetExists = Not s Is Nothing
    End Function
【Flutter】VS Codeのフォーマットの行折り返しを変更する

Flutterをはじめました。
VS Codeだと自動的に公式で定められたコーディングスタイルにフォーマットしてくれるので、開発しやすいですね。

ただ、たまに変な改行が入るのが気になってました。
たとえばこんな感じ。

```
Container(
  height: selectedData == null ? 0 : 100,
  child: Text(selectedData == null
              ? 'No Selected Data'
              : selectedData.value.toStringAsFixed(2)),
)
```

同じ三項演算子なのに、改行されたり、されなかったり。
こういうコーディングスタイルなのかと思っていましたが、**じつは長くなった行が折り返されているだけ**。

折り返しは`settings.json`で変更できます。

```settings.json
    "[dart]": {
        "editor.rulers": [
            200 //行折り返しのガイドを表示
        ]
    },
    "dart.lineLength": 200, //行折り返しの長さ
```
デフォルトでは80文字で改行するようです。
200文字くらいに設定すると、気になる改行はなくなりました。
Nginx でファイル表示・ベーシック認証

ファイルだけをURLでお客様に公開したいな、という事案があり。
調べたところ、Nginxの機能で実現できるとのこと。ベーシック認証もかけられる。
久々のNginxでいろいろな事を忘れていたので、備忘録としてメモしておきます。

## autoindex で 「index of」表示

お客様ごとにURIを変える予定なので、locationディレクティブに記述しています。
・ server{} html{} でも可

```nginx:例）/etc/nginx/conf.d/xxxx.conf
server {
  listen 443;
  server_name xxx.com;
  # 省略

  location /output/develop {
    root /home/public_data;
    autoindex on;              # ディレクトリ表示（on：有効 / off：無効） 
    autoindex_exact_size off;  # ファイルサイズ（on：正確 / off：KB等にまるめ）
    autoindex_localtime on;    # タイムスタンプ（on：ローカル / off：UTC）
  }
}
```

Nginxを再起動すれば反映します。

```
 $ sudo nginx -s reload
```

これで **xxx.com/output/develop/** にリクエストすると、
**/home/public_data/output/develop/** 内のファイル一覧が表示されます。

表示例）ファイル一覧（空ですが…）
<img width="40%" alt="スクリーンショット 2020-10-14 16.53.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639589/55f5b2aa-4715-e00c-9338-95d24f0c6d93.png">

## auth_basic でベーシック認証

location内に記述することで、URIごとに異なるベーシック認証をかけることができます。
（プレフィックスの前方一致や正規表現を使えばもっと綺麗に書けるかもですが…）

```nginx:例）/etc/nginx/conf.d/xxxx.conf
  location /output/develop {
    root /home/public_data;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    # basic_authorization
    auth_basic "Login Authentication";
    auth_basic_user_file /etc/nginx/.htpasswd;
  }
```

**/etc/nginx/.htpasswd** は自分で作成する必要があります。

```
$ sudo htpasswd -c /etc/nginx/.htpasswd develop # 認証用ユーザー名
New password:             # 認証用パスワードを設定
Re-type new password:
Adding password for user develop
```

Nginxを再起動すれば反映します。

```
 $ sudo nginx -s reload
```

表示例）ベーシック認証
<img width="40%" alt="スクリーンショット 2020-10-14 17.33.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639589/9553d592-79a4-e66b-d5af-d40f75a093e1.png">
flutter sqfliteを使って複数のテーブルを作成する方法

```
class DBHelper {
  static Future<Database> databese() async {
    final dbPath = await getDatabasesPath();
    return openDatabase(path.join(dbPath, 'hogehoge.db'),
        onCreate: (db, version) async {
      return db.execute(
          'CREATE TABLE folders(id TEXT PRIMARY KEY, title TEXT, created_at TEXT)');
    }, version: 1);
  }
```

この方法でローカルDBを作成していたところ、複数のDBを作成する方法がわからなかった。

解決方法

```
class DBHelper {
  static Future<Database> databese() async {
    final dbPath = await getDatabasesPath();
    return openDatabase(path.join(dbPath, 'hogehoge.db'),
        onCreate: (db, version) async {
      await db.execute(
          'CREATE TABLE folders(id TEXT PRIMARY KEY, title TEXT, created_at TEXT)');
      await db.execute(
          'CREATE TABLE items(id TEXT, title TEXT, FOREIGN KEY(id) REFERENCES folders(id))');
    }, version: 1);
  }
```

returnをawaitに変えて、あとは繰り返すだけで複数のテーブルを作成することが出来た。