OmniAICreator/Qiita-1.07M huggingface dataset:
Docker 化する際に大事なこと！

この記事は、[求ム！Cloud Nativeアプリケーション開発のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-cloudnative) の 2 日目です（後から追っかけで書いています）。

今まで携わっていないサービスに急にアサインされたり、転職して新天地でのプロジェクトなど、Docker 環境が構築されていないプロジェクトにジョインすることがあります。

そんなとき、開発環境の構築手順が「秘伝のタレ化」していることがままあります。しかし、「秘伝のタレ化」した手順にしたがっても開発環境は基本構築できません。そんなときは、可動しているマシン環境をコピーしたり、「秘伝のタレ化」した手順から構築する開発環境を想定してあーでもない、こーでもないと試行錯誤するといった作業を行う必要があり、かなり苦痛を伴う作業になります。

そういった状況に陥り、「コンテナ化（Docker）だ！」と環境構築周りを刷新するエンジニアのために大事なことを残しておきます。

大事なことを疎かにして後で困った事態に陥ったエンジニアをたびたび見てきたので、参考にしてください。

## 1. コンテナ化（Docker）するならすべての環境をコンテナ化すること

よくある状況として、開発環境構築だけコンテナ（Docker）化し、検証環境や本番環境はコンテナ化していないというのがあります。

これには「自分に閉じた開発環境だけであれば上司や関係各所と調整をしなくてもよい」という理由があります。今は少ないと思いますが、コンテナについての知識や理解が乏しい上司や関係各所を納得させるのが面倒というのをよく聞きます。

本番環境や検証環境で問題が起こらなければ一見何の問題もないように思えます。

しかし、本番環境の問題を検証環境では再現できるが、開発環境では再現できないという場合に問題が起こります。

この場合、本番で起こっている問題を防ぐ対応の前に、本番環境・検証環境と開発環境の差異の調査を行う必要があり、ただでさえ急いでバグ対応をしなければならない状況なのに他にも労力を割かなければならないのでやめた方がいいです。

今までこの調査をしてきてよくあったのは

* オレオレ開発環境だけライブラリのバージョンが異なる
* オレオレ開発環境だけそもそも入れているライブラリが異なる

といったものです。面倒な「秘伝のタレ化」した手順から環境構築するのが嫌なのはわかりますが、中途半端なことをせず、「プログラマーの三大美徳」の「第一の美徳」である「怠慢(Laziness)」の「**全体の労力を減らすために手間を惜しまない気質**」を発揮した方がよいです。

## 2. コンテナ化（Docker）するならミニマムにすること

「コンテナ化（Docker）するならすべての環境をコンテナ化する」についで大事なことはミニマムにすることです。

これは Docker 化に本人が不慣れだからなのか、オールインワンの方がよいと思っているのかなのか、何が必要なのかよく理解していないが故にとりあえず全部載せにしているのか、そのいずれもなのか要因は様々ですが、結果として巨大なイメージファイルを作成します。

巨大なイメージファイルだと、pull するのにも時間がかかりますし、どこかの設定を変えただけでビルドし直しになるので、柔軟性が損なわれます。

何が本当に必要で、ミニマムにするには対象のシステム・インフラを理解しなければできないので、とても面倒なことはわかりますが、中途半端なことをせず、「プログラマーの三大美徳」の「第二の美徳」である「短気(Impatience)」の「**今ある問題に対応するプログラムにとどまらず、今後起こりうる問題を想定したプログラムを書くことができるか。今後起こりうる問題を想定したプログラムとは、例えば要望に柔軟に答えられる作りにするなど**」を発揮した方がよいです。

## 3. コンテナ化（Docker）するならコードの意味を理解すること

「コンテナ化（Docker）するならミニマムにすること」についで大事なことはコードの意味を理解することです。

これは Docker 自体に本人が不慣れだったり、そもそも Docker を便利なツール程度にしか理解していない（本質を理解していない）、いずれもなのか要因は様々ですが、結果として本人も理解していないが一見して動作するコードを作成します。

本人的には環境構築で楽をしたいのが目的なので“動けばOK”なのでしょうが、まともなエンジニアならば、検証環境や本番環境に適応するものが“よくわからないけど、動くもの”では困ります。

人は誰しも変化を恐れるものです。特にインフラの意味をあまり理解していないエンジニアからすると Docker のコードは分かり易いものではありません。そのため、コードを理解するのはとても面倒なことはわかりますが、中途半端なことをせず、「プログラマーの三大美徳」の「第三の美徳」である「傲慢(Hubris)」の「**神罰が下るほどの過剰な自尊心、または人様に対して恥ずかしくないプログラムを書き、保守しようとする気質**」を発揮した方がよいです。

わからないのであれば、公式ドキュメントを読むのもいいでしょう。

私は Ruby on Rails のコードを書くのですが、[Quickstart: Compose and Rails | Docker Documentation](https://docs.docker.com/compose/rails/) は英語とはいえ、理解し易く書いてあります。

また、以下のドキュメントも知識チェックがついているので、参考になるかと思います。

* [Azure でコンテナーを管理するラーニング パス](https://docs.microsoft.com/ja-jp/learn/paths/administer-containers-in-azure/?WT.mc_id=AZ-MVP-5001601)

## 参考

[プログラマ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E4%B8%89%E5%A4%A7%E7%BE%8E%E5%BE%B3)

**3 日目は @changeworld の「[百聞は一見に如かず、Kubernetes の基礎を学ぼう！](https://qiita.com/changeworld/items/c2f7916144b55c02a233)」です。引き続きお楽しみください。**
プログラミング初心者的にFlutterで分かりづらいことまとめ

##はじめに
僕はプログラミングで最初に触ったのがFlutterです。
Flutterを始めたのは、2020年3月。
執筆している現在は2020/12月。

初心者向けの記事になるかなと思います。
また、Flutterに限らず、プログラミングの共通の基礎的な内容が含まれます。

##用語
用語も「大体こんな感じだろう」と、具体的にどの部分なのかきっちり説明できないことが多い気がする。
しかも、用語の意味が分からないせいでインプットの効率が落ちる。


###クラス
クラスはわかりやすい。classって書いてあるので。
クラス名は大文字で始める。

```
class MyApp{
//中身
}
```

###インスタンス(インスタンス変数)
クラス内で使用する変数。
下の例で言うと、text,countのこと。


```
class MyApp {
  String text; //ここ
  int count = 1; //ここ

  //中身
}
```
**インスタンス化** は、自分で与えた変数を何か定義すること。
例えば以下のように、整数countは1ですよ。っていうインスタンス化。

```
 int count = 1; 
```

###コンストラクタ
class名( )の部分。
クラス内のインスタンス変数に初期値をセットできる。

```
class MyApp {
  MyApp(this.text,this.count); //ここ
  
  String text;
  int count = 1;
}
```

他の部分から呼び出すときに、値を渡してやる。
もちろんコンストラクタ内でセットすることもできるが。
MyAppクラスのtextに'テスト'、countに100を渡すなら以下のように使う。

```
MyApp('テスト',100)
```
もうちょい詳しく知りたいなら↓
<a href="https://flutter.keicode.com/dart/constructor.php">Dartのコンストラクタ</a>


###プロパティ
クラスに渡せる値たちのこと。
よく使うScaffoldで言うと、appBarやbodyはScaffoldのプロパティ。
これらはコンストラクタ内で定義されてます。

```
  Scaffold(
    appBar: AppBar(),
    body: Container()
  );
```

以下はScaffoldのコンストラクタを抜粋しています。
これらがプロパティとしてScaffoldに渡すことができます。

```
const Scaffold({
    Key key,
    this.appBar,
    this.body,
    this.floatingActionButton,
    this.floatingActionButtonLocation,
    this.floatingActionButtonAnimator,
    this.persistentFooterButtons,
    this.drawer,
    this.endDrawer,
    this.bottomNavigationBar,
    this.bottomSheet,
    this.backgroundColor,
    this.resizeToAvoidBottomPadding,
    this.resizeToAvoidBottomInset,
    this.primary = true,
    this.drawerDragStartBehavior = DragStartBehavior.start,
    this.extendBody = false,
    this.extendBodyBehindAppBar = false,
    this.drawerScrimColor,
    this.drawerEdgeDragWidth,
    this.drawerEnableOpenDragGesture = true,
    this.endDrawerEnableOpenDragGesture = true,
  })
```

###メソッド
**クラス内**にある、且つ、処理を記述する部分。
(**クラス外**にある場合は「**関数**」)

・メソッド名(triple)は小文字からスタート。
・メソッド名の前に戻り値の型を記述。(ここではint)
・戻り値がない場合はvoidにする


```
class MyApp {
  MyApp(this.text,this.count);

  String text;
  int count = 1;

  //-------ここ---------
  int triple(int number){       
    return number * 3; 
  }
  //-------ここ---------
}
```
例えば、３を渡してやると９になります。

```
print(triple(3));  //結果は9
```

これはmain'関数'。
なぜならクラス内にないから。

```
void main(){
  runApp(MyApp());
}
```

随時、内容は追加していきます。
Express + PostgreSQL でつまづいたところ

# はじめに

今回 Express / Heroku で業務効率化ツールを作成しました。

普段バックエンドのコードに慣れていないので特にDB周りで躓くことが多かったです。

DB関連でざっと躓いた内容を備忘録的に残しておきます。

## dotenv は文字列として呼び出されます

環境変数としてDB接続情報を呼び出す時に

```
require("dotenv").config();
```

を使っていたのですが、最初接続できずませんでした。
出たエラー文は覚えていないのですが、dotenv ではなく直接書き込むと接続できる。

そこで  `process.env.hoge` を `typeof` で評価すると全てstring扱いになってました。

## configのpathに気を付ける

今回最初にDB接続の関数を作って後で export して使えばいいか〜
と思って接続確認後に他の階層から呼び出したら、

`Error: The server does not support SSL connections`

んぉ？？

で、公式ドキュメントやらなんやら見てると解答が。

https://github.com/motdotla/dotenv/issues/135#issuecomment-254211441

神様ありがとう。サンキューダッチ。

## DB接続した関数を外部で呼び出すと値が undefined になる

完全に非同期の初歩的なミスしてました。

値を直接returnするのではなく、式をreturnする必要があります。

- ダメだった例

```js
  const newPostgreSQL = new Client({
    // 接続情報を記載してください
    // 中は省略
  });
  newPostgreSQL
    .connect()
    .then(() => newPostgreSQL.query(query))
    .then((results) => {return results.rows})
    .catch((e) => console.log(e))
    .finally(() => newPostgreSQL.end());
};
```

- 正しくはこっち

```js
  const newPostgreSQL = new Client({
    // 接続情報を記載してください
    // 中は省略
  });
  return newPostgreSQL
    .connect()
    .then(() => newPostgreSQL.query(query))
    .then((results) => results.rows)
    .catch((e) => console.log(e))
    .finally(() => newPostgreSQL.end());
};
```

ダメだった例は同じファイルで`console.log()`してたときは正しく取れてたのでちょっとハマってしまった…

## 番外編：バージョンに気をつける

まぁ当然といえば当然なのですが…

今回最初に使ったコードがExpress3系で書かれていて気付かずに作成していて、中盤で4系に全部直すみたいな無駄な作業が…

ちゃんと公式ドキュメントよもうね。自分。

(というかnpmで管理されてるものは最終履歴まで確認した方がいいですね)

まぁどの公式も主要な変更はわかりやすく載せてくれてるので、それほど大変ではなかったです。

https://expressjs.com/ja/guide/migrating-4.html


## さいごに

最後まで読んでいただきまことにありがとうございますm_ _m

DBに関わらず、普段やっていない領域なので学びしかありませんでした！

Expressが規約がゆるいFWということで、次は規約が強めのFW触って色々学んでいこうと思います＾＾
別のStoryboardのViewControllerへ遷移

画面の遷移方法ってどれだけあるんだろう・・・



###環境
 Xcode 12.2

###NavigationControllerを使う場合(push遷移）

```swift
    //遷移先のViewControllerがあるストーリーボード(Second.storyboard）をインスタンス化
    let storyboard = UIStoryboard(name: "Second", bundle: nil)
    //遷移先のviewControllerをインスタンス化（Storyboard IDを”SecondViewController”にした場合）
    let viewController = storyboard.instantiateViewController(identifier: "SecondViewController")
    //pushViewControllerでpush遷移
    navigationController?.pushViewController(viewController, animated: true)
```

###NavigationControllerを使わない場合（modal遷移）

```swift
    //遷移先のViewControllerがあるストーリーボード(Second.storyboard）をインスタンス化
    let storyboard = UIStoryboard(name: "Second", bundle: nil)
    //遷移先のviewControllerをインスタンス化（Storyboard IDを”SecondViewController”にした場合）
    let viewController = storyboard.instantiateViewController(identifier: "SecondViewController")
    //modalPresentationStyleの指定
    viewController.modalPresentationStyle = .pageSheet
    //遷移
    present(viewController, animated: true,completion: nil)
```

###最後に
独学で勉強していますので、間違って理解しているところがあったら
ご指摘いただけると幸いです。

###参考

iPhone開発での画面遷移方法まとめ(Swift)
https://qiita.com/devalon/items/bc6af21035786aee1e1f
アダプト・ジオデータ

これは [FOSS4G Advent Calendar 2020](https://qiita.com/advent-calendar/2020/foss4g) の記事の一つです。

[国連ベクトルタイルツールキット](https://unvt.github.io)に随伴するプロジェクトとして、[アダプト・ジオデータ](http://github.com/optgeo)という独立プロジェクトを運用しています。

これは、世の中に既にオープンデータとして出ているベクトル形式の地理空間情報をベクトルタイルに変換して、世の中の人々によりわかりやすく見せていこうというプロジェクトです。

Adopt Geodata の中からアルファベットを抜き出して、プロジェクトのコードネームは optgeo としています。

アダプト・ジオデータという言葉は、アダプト・ア・パークに代表されるような協働活動を指す用語を参考にして作っています。いま調べてみると、[アダプト・プログラム](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%80%E3%83%97%E3%83%88%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)という用語があるようですね。この記事によれば、アダプトプログラムとは「一定区画の公共の場所を養子にみたて、市民がわが子のように愛情をもって面倒をみ（清掃美化を行い）、行政がこれを支援する制度」であるとのことです。

アダプトプログラムにおける行政の役割として例示されている「清掃に必要な用具の貸与」での「必要な用具」として、国連ベクトルタイルツールキットが存在しているともいえそうです。
Done is better than perfect

***Done is better than perfect***

***完璧を目指すよりまず終わらせろ***

Facebook CEO マーク・ザッカーバーグの有名な言葉ですね。

そして私のとても好きな言葉です。

# 絶対に失敗しないサービスなんて作れない

これまでのプロジェクトでよくあったのが、**「全員が納得するまで先に進まない」**という**同調圧力**的な進行で一向に話が進まないことです。
10人いれば10人の考えがあって、それが新規サービスなどになれば尚更それぞれのアイデアが膨らんで、いつまで経っても収束しません。

また、新しいことを始めるときは必ず不安やリスクが有り、「あとでこういう問題出るんじゃないの？」とか「それ流行るの？」とか果てには「必ず利益が出る保証有るの？」とか**必ず利益が出る保証有るならみんなやってるわ**と突っ込みたくなるような不毛な意見まで出てきます。

# 3年経っても完成しないプロジェクト

社長の思いつきで始まった新サービスのプロジェクトがありました。
ただ、アサインされたメンバーは社長のアイデアにあまり共感できず、さらにそのサービスに必要なノウハウを持っているメンバーもおらず、「これ何をどうするの？」という最初から暗中模索のプロジェクトでした。

納得できなくてもしなければいけないのが仕事なので、目標を「良いサービスを作る」ではなく**「社長が納得するサービスを作る」**にきっぱり切り替えて、「何でも良いからちゃっちゃと終わらせちゃおう」というのがメンバーの一致した気持ちでした。

社長も具体的なアイデアを出しているわけではなくふわっとしたアイデアだけなので、社長の要望を最低限満たし、かつ今いるメンバーで実現可能なデザインをし、プロトタイプを作りました。その頃にはメンバーもサービスに愛着が湧いてきて「もしかしてこれ流行るかも？」くらいの気持ちになっていました。

しかしながら、こまめにデザインを確認しながら進めて来たのにも関わらず、完成したプロトタイプに納得しない社長含む上層部たち。「やりたかったのはこういうことじゃない」、「こういうことをやりたいんだ」と今思いついたとしか思えないようなふわっとした改善案を出してきます。

その後も、**①こちらから具体的な改善案を出す → ②OKをもらう → ③プロトタイプ作る → ④「やりたかったのはこういうことじゃないんだよなー」  → ①に戻る**、の一向に前に進まない**スパイラル（ループ？）開発**が進み、気がつけば3年がたった今もローンチされていません。

# ユーザに揉んでもらってサービスは進化する

絶対にうまくビジネスはないし、最初から何もかもうまくいくビジネスも永久にうまくいくビジネスも無いと思います。
特にWebサービスは水物で流行っても一時だけということがよくあります。
**どうせうまくいく確証なんていつまで経っても得られないんだから、なんでもいいから完成させてとりあえず世の中に出さないことには何も始まらない**、と思います。

とりあえずローンチして、ユーザの反応を見て、新しい発見があったり、新しいアイデアが浮かんだりして、それをすぐにサービス改善の形にできるのがITの良いところではないでしょうか。

そしてその成功の種を持っているのがエンジニアだと思います。これまでの経験上エンジニアが「こんな事やったら面白そう」とかで遊びで勝手に追加機能とか作って、「それいいね！」と周りの共感を得て、「もう開発もほぼ終わっちゃっているしローンチしようぜ！」の流れで良き改善が世に出ることが多かったです。今流行っているサービスもそういうふうに進化してるんじゃないかと思っています。

**「何か新しいことを始めるときは、偉い人には言わずに、勝手に少人数で進めるのが良い」** とGoogle Glassを開発したエンジニアも言っていました。

# 一勝九敗

ユニクロの柳井正会長の座右の銘で、私の好きな言葉です。
**「私の人生は色々挑戦してほとんど失敗してきた。ただ、九敗がなければ一勝もなかった。」** というようなことを言っています。
幸いITの世界は、自動車などの工業製品とは違って、簡単に改善できて、失敗しても損失が少ないことが多いです。どんどん挑戦して、どんどん失敗できる世界です。

今後エンジニアの皆さんには、偉い人たちに臆することなく、どんどんアイデアを出して挑戦していって欲しいですし、非エンジニアの皆さんにはエンジニアがそうしやすくなるような環境を作っていって欲しいと思っています。

# So This is Christmas

I hope all the system engeneers have fun,
The near and the dear one,
The old and the young,
The geek and the nerd.

***A very merry Christmas, and a happy new year***
Nextcloud の Google Authenticator 認証ができなくなったときの救済方法 (その1)

様々な Web サイトで採用されている 2 要素認証ですが、Nextcloud でもログインの際に 2 要素認証を利用することができます。特に Google Authenticator を利用した 2 要素認証は個人のスマートフォンがあれば簡単に導入できます。
しかし、スマートフォンを破損／紛失した際にログインができなくなってしまいます。
これを救済するために、Nextcloud では、あらかじめ利用者個々にバックアップコードを取得しておいて、これでログインができる仕組みがあります。
が、バックアップコードを取得しておいても、いざという時に「バックアップコードどこやったっけ？」というのはよくある話です。

最後の砦であるバックアップコードを紛失してしまっては Nextcloud の利用者はこれ以上は何もできなくなるため、システム管理者に問い合わせるしか手はありません。

問い合わせがあった際にシステム管理者がどう対処すればよいのかを今回記事にしてみます。

# 救済手順をざっくりまとめ
1. 管理者は Impersonate アプリを利用して 申告ユーザーに代理ログインし、このユーザーのバックアップコードを発行、通知。
2. 申告ユーザーは通知されたバックアップコードでログイン、Google Authenticator の再設定。

# もう少し詳しく
## ①システム管理者の手順
1. Nextcloud で代理ログインを実現するための [Impersonate](https://apps.nextcloud.com/apps/impersonate) アプリをインストール、有効にしておく。Impersonate アプリに関する解説は [こちら](https://nextcloud.stylez.co.jp/blog/nextcloud-inpersonate.html)　。
2. 管理者権限をもつユーザー (="admin" グループに属しているユーザー ) で Nextcloud にログイン。
3. 右上のアイコンをクリック→「ユーザー」をクリックでユーザー管理画面に遷移する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/0f87cb4c-ea1b-0285-77c5-2488bd053e6a.png)
4. ログインできなくなったと申告のあったユーザーの "…" をクリック→「代理」をクリック。これで申告ユーザーとして代理ログインができる。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/4bcb1d42-1d47-d1f2-2ab6-1a32db78be92.png)
5. **【申告ユーザーで代理ログイン中】**  
右上のアイコンをクリック→「設定」をクリックで設定画面に遷移。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a2e4c0da-44ba-70f2-430a-eeeb2bdd6dfc.png)
6. **【申告ユーザーで代理ログイン中】**  
個人設定の「セキュリティ」をクリック。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/e48e5185-6495-9c2c-44da-9a7c0376ea4a.png)
7. **【申告ユーザーで代理ログイン中】**  
「二要素認証」の「バックアップコードを再生成」をクリックしてバックアップコードを取得。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/09142f9b-e711-7578-49e2-60e2da5c1d2e.png)
8. **【申告ユーザーで代理ログイン中】**  
ログアウト。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/bd63d4f2-e8b2-e0d5-9690-c3ec3764f14c.png)
9. 取得したバックアップコードを申告のあったユーザーに通知。

## ②申告ユーザーの操作
1. ログイン画面でユーザー名とパスワードを入力。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/7e77ca5c-78b4-4a30-3cdb-eff76e029be9.png)
2. 「TOTP (Authenticator app)」画面で「バックアップコードを使用する」をクリック。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/ef5a4684-8125-5229-9cd2-de0c1c683eb8.png)
3. システム管理者から通知されたバックアップコードを入力。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/e3c8b798-0ebd-afa0-4213-ab20c632f0ec.png)
4. 個人設定の「セキュリティ」をクリック。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/4cfd2758-a9c3-6248-bc7f-74f8c2f51dd8.png)
5. 「TOTP (Authenticator app)」の「TOTP有効化」チェックを一旦外し、再度チェック。表示される QR コードを利用して Google Authenticator 認証を再設定。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/c810159c-a808-df9d-3474-cde1069ed186.png)
Docker初心者がよく使うDockerコマンド集

#はじめに
Dockerを使い始めると、今までローカルで使えていたコマンドが使えなくなったり、新しいコマンドが増えたりして困惑すると思います。
そこで、この記事ではDocker上でローカルのコマンドを使うための方法や、Docker上で使えるようになるコマンドについて、まとめていきます。

#対象者
・Dockerやdocker-composeを使い始めた人
・Dockerで使えるコマンドが、いまいちよく分からない人

#環境
MacOS Catalina 10.15.7
Docker 19.03.13
Rails 5.2.4.4

#コマンド集
Railsの場合、``bundle exec``で使っていたコマンドは、そのままでは使えなくなります。
すべて``docker-compose run web``を先頭に付けるようにしましょう。

###＜例＞
``bundle exec rspec``
　↓
``docker-compose run web bundle exec rspec``

###新しくimageをつくりたい
``docker-compose build``

```
   Name                  Command               State          Ports       
--------------------------------------------------------------------------
app_db_1      docker-entrypoint.sh --sql ...   Exit 0                     
app_nginx_1   /docker-entrypoint.sh /bin ...   Up       0.0.0.0:80->80/tcp
app_web_1     dockerize -wait tcp://db:3 ...   Exit 0   
```
docker-compose.ymlを参考にして、imageをつくります。

###新しくコンテナを立ち上げたい
``docker-compose up``

```
Creating network "app_default" with the default driver
Creating app_db_1 ... done
Creating app_web_1 ... done
Creating app_nginx_1 ... done
Attaching to app_db_1, app_web_1, app_nginx_1
```
コンテナが立ち上がり、localhostでwebページが表示できるようになります。

###コンテナの動作を終了させたい
``docker-compose down``

```
Stopping app_nginx_1 ... done
Stopping app_web_1   ... done
Stopping app_db_1    ... done
Removing app_web_run_7895745c68e2 ... done
Removing app_nginx_1              ... done
Removing app_web_1                ... done
Removing app_db_1                 ... done
Removing network app_default
```

###コンテナの一覧を確認したい
``docker-compose ps``

```
   Name                  Command               State                 Ports              
----------------------------------------------------------------------------------------
app_db_1      docker-entrypoint.sh --sql ...   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
app_nginx_1   /docker-entrypoint.sh /bin ...   Up      0.0.0.0:80->80/tcp               
app_web_1     dockerize -wait tcp://db:3 ...   Up      0.0.0.0:3000->3000/tcp   
```

コンテナの稼働状況が分かります。


#おわりに

Dockerを使っていて、不調を感じるようであれば、上記のコマンドで状態を確認してみましょう。
エラーが出るときには、Docker独自のコマンド文になっていない場合が多いです。
コマンド文に十分注意しながら、Dockerを使いこなしましょう！
javascript 問題集 No.1 No.2 Arry.filter自作

No.1
コマンド引数を読み取るにはprocess.argvを使う。
例えば

process.argv[2]

0と1はファイル名が読み取られているのでこのようになる。

process.argv.slice(2)とすると2より下の引数を呼び出すことができる。

No.2
この問題ではコマンド引数を数値にする必要があった。
そこで使ったのが

Number()

これで()の中身を数値にします。

今回は　Number(process.argv[2])
WSL2ベースのDocker_Desktopを起動すると，「docker-usersグループに追加してください」というメッセージ

## 環境

- Windows 10 Pro

## 経緯

- Administratorユーザで，WSL2 + Docker Desktop 環境をセットアップした（[手順](https://docs.docker.com/docker-for-windows/wsl/)）
- 一般ユーザでDocker Desktopを起動しようとすると，「docker-usersグループに追加してくれ」という旨のポップアップが出た

## 解決方法

利用しているユーザのグループを，「docker-users」に変更する．

コントロールパネル > ユーザアカウント > アカウントの種類の変更 から，
対象ユーザのグループを，docker-usersグループに変更．（[画面](https://manual-shop.com/Windows/0005_UserAccount/07_AccountType/24_Win10Pro/index.html)）

Docker Desktopが起動できるようになった．
CarbonのaddSecondsとaddRealSecondsの違い

CarbonのaddSecondsとaddRealSecondsの違い

・addSecondsはミリ秒も保持されたまま秒数が追加される。
・addRealSecondsはミリ秒が削除されて秒数が追加される。

addRealSecondsはタイムスタンプベースの追加になる。タイムスタンプは秒単位なのでミリ秒は消える。

```.sh
>>> $b = now('Asia/tokyo')
=> Illuminate\Support\Carbon @1607132885 {#4267
     date: 2020-12-05 10:48:05.334754 Asia/tokyo (+09:00),
   }
>>> $c = $b->copy()
=> Illuminate\Support\Carbon @1607132885 {#4265
     date: 2020-12-05 10:48:05.334754 Asia/tokyo (+09:00),
   }
>>> $b->addSeconds(10)
=> Illuminate\Support\Carbon @1607132895 {#4267
     date: 2020-12-05 10:48:15.334754 Asia/tokyo (+09:00),
   }
>>> $c->addRealSeconds(10)
=> Illuminate\Support\Carbon @1607132895 {#4265
     date: 2020-12-05 10:48:15.0 Asia/tokyo (+09:00),
   }

```
Cannot find module 'express'の解決法

nodeをインストールしてプログラムを実行しようとした所、エラーが出た。

## エラー文
```
internal/modules/cjs/loader.js:834
  throw err;
  ^

Error: Cannot find module 'express'
```
## プログラム

```Javascript:app.js
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})
```

https://expressjs.com/ja/starter/hello-world.html

## 対処方法
expressをinstallし、パスを通す。
oh、簡単。。。

```
$ npm install -g express
$ export NODE_PATH=/usr/local/lib/node_modules
```

## 参考
[Nodeでnode_modulesにパスを通す](http://kayakuguri.github.io/blog/2016/04/11/node-express-server/)
Androidの仮想マシン/総括

# 作者について
Androidの黎明期に製品開発のテーマがあり、先行研究でDalvik仮想マシンの調査を始めたのがきっかけで、Android仮想マシンマニアになりました。

実はAndroidのアプリケーションを書いたこともありませんし、AndroidのOS、ミドルウェア層に関する知識はありません。純粋に仮想マシンだけです。

# Androidの仮想マシンとは
Androidではアプリケーションを開発するのにJavaまたはKotlinが使われます。歴史的経緯でJava仮想マシンのクラスファイルをdxというツールでDalvik仮想マシンのdexファイルにコンパイルする方式になっています。今はdexファイルを直接使う形式にはなってませんがアプリケーションパッケージ（apk）にはdexで格納されています。

# 旧世代 Dalvik仮想マシン
Android2.2より前ではJITコンパイラではなくインタープリタでした。そのためインタープリタの高速化に力が入れられています。アーキテクチャの基本的な特徴は以下のとおりです。

- Javaのクラスファイルをdexファイルにコンパイルします。
- アプリケーションパッケージはapkです。
- apkの中にdex実行ファイルが入っています。
- バイトコード方式です。
- レジスタマシン（Java仮想マシンはスタックマシン）です。
- 実行時にJITコンパイルされます。
- CGは並列マークアンドスイープです。
- 一部のJavaフレームワークのメソッドは仮想マシンに埋め込まれています。

# 現世代 ART仮想マシン
Android4.4で導入された新しい仮想マシンであるARTについては実行ファイルの仕組み、AOTコンパイラ、GCをおさえておけば後はDalvikとの差分かなと思っていますが、自分の知識が古いので違うかも知れません。

- AOTコンパイラ
	- アプリケーションインストール時にLinuxで一般的なELF実行ファイルにコンパイルします。
	- 最適化が高度化されているのでコンパイラの最適化の知識がないと読めません。
- GC
	- Androidはモバイル向けなのでゲームなどのためにGCの停止時間を短くする必要があります。特殊な方式で停止時間を短くしています。
	- これを調べるだけで大学の修士論文ぐらいにはなります。

# 自分の書いた仮想マシン記事一覧
（今後記事を書く度に追加していきます）

- Dalvik仮想マシンのアーキテクチャ 改訂版
	- https://www2.slideshare.net/kmt-t/dalvik-10316622
	- 世代が古いですがアウトラインの理解にはいいと思います。
- 進化するART
	- https://www2.slideshare.net/kmt-t/art-47396171
	- DroidKaigi2015の発表資料です。
	- 世代が古いですがアウトラインの理解にはいいと思います。
- Androidの仮想マシン Dalvik編
	- https://tatsu-zine.com/books/androidvm-dalvik
	- 自分が書いた本ですAndroidの仮想マシンについては世界で一番くわしい本です。AOSPのソースコードを読んで書いているので、書いてある内容はこの本以外に書かれている文献はありません。Androidの仮想マシンを理解したければ辞書的に使えると思います。内容的にはかなり量があるので通読しようとすると挫折すると思います。

# 参考文献
- AOSPドキュメント
	- https://source.android.com/devices/tech/dalvik?hl=ja
	- 本家本元のドキュメント。
	- とりあえず普通の人が知りたいことは全部書いてある。
	- 日本語なのでわかりやすい。
- AOSPリポジトリ
	- https://android.googlesource.com/platform/art/
	- ARTの最新のコードを勉強するにはこれしかありません。
	- というかワールドワイドでAndroidの仮想マシンのドキュメントを書いている人はほとんどいません。
- コンパイラ―原理・技法・ツール
	- https://www.amazon.co.jp/dp/478191229X
	- 通称ドラゴンブック。恐らくAndroidの仮想マシンを書いている人はこの本を読んで開発していると思います。本に書いてある内容が非常に多いです。タイガーブックと呼ばれる本もあってそっちも楽しいのですが、基本はドラゴンブックです。
- Java仮想マシン仕様
	- https://www.amazon.co.jp/dp/489471356X/
	- 絶版なのと必読ではないのでスルーでも良いです。最新版のJavaVMの仕様って日本語で読めないんですかね。
- VMの歩む道。 Dalvik、ART、そしてJava VM
	- https://www2.slideshare.net/yyyank/vm-dalvikartjava-vm
	- あの @kmizu さんから名指しでほめられたのがうれしい。
- Android 仮想マシンのランダムテストにおける命令列生成の強化
	- https://ist.ksc.kwansei.ac.jp/~ishiura/publications/T2019-03b.pdf
	- 人生で初めて論文の文献リストに載ったぜ！
ディスプレイフレックス一覧

ディスプレイフレックス一覧



○○○ {
  display: flex;
○○○
}

右
justify-content: flex-end;


真ん中
justify-content: center;

左右全部間隔あけて離す
justify-content: space-around;

等間隔で離す 間にスペース
justify-content: space-between;

下
align-items:flex-end;

右　真ん中　下真ん中
justify-content: center;
align-items: center;

　
横軸を反対にする
flex-direction:row-reverse;

縦軸を下に
flex-direction: column;

反対にして左（逆の後ろ）
flex-direction:row-reverse;
justify-content: flex-end;

縦にして一番下
flex-direction: column;
justify-content: flex-end;

縦にしてひっくり返して間隔あける
flex-direction: column-reverse;
justify-content: space-between;

反対にして真ん中にして下
flex-direction:row-reverse;
justify-content: center;
align-items:flex-end;

アイテムの並びを変える
順番変える
.yellow{order:1;}

指定したものだけ動かす
align-self

flex-wrap
* nowrap: 全てのアイテムは、ひとつの行にフィットします。
* wrap: アイテムは他の行へ折り返します。
* wrap-reverse: アイテムは逆順になって他の行へ折り返します。

align-content
* flex-start: 行はコンテナーの上側に詰められます。
* flex-end: 行はコンテナーの下側に詰められます。
* center: 行はコンテナーの中央に詰められます。
* space-between: 行はその間に等しい間隔を空けて表示されます。
* space-around: 行はその周囲に等しい間隔を空けて表示されます。
* stretch: 行はコンテナーに合うよう引き延ばされます。
UnityAssetStoreからアセットを入れる方法

#はじめに

この記事では[UnityAssetStore](https://assetstore.unity.com/)から素材をUnityに入れる方法について簡単に解説しています。

UnityAssetStoreは、Unityで使用できる3Dモデルの素材や画像などを購入できるショップのことです！有料のものも無料の物をもあります！！！
とてもありがたい！
これを使うだけであっという間に、ゲームのクオリテイがあがっていくので自分のゲームを磨くためにも有効活用していきましょう！

![assetsotre.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465974/9ecc5b33-1ec1-3815-63cf-69037245c590.jpeg)



#やり方

①今回はjoystickを入れて見たいので[joystickのダウンロードページ](https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631)に飛びます！

注意点として、事前にAssetを追加したいUnityのプロジェクトは立ち上げていきましょう。

②![①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465974/983d25d8-9af0-12be-67e1-523ce27c1289.png)
このページで　「Add to My Assets」をクリック！

③![②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465974/6c47f527-4f72-1efd-ac81-92913a6dd376.png)

次に「Open in Unity」をクリックすると、Unityを開きますかと聞かれるので、「Unityを開く」をクリック

④![③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465974/d665853d-e071-11f2-39a0-f37601265f30.png)

Unity Asset Store 使用するためにはUnityIDでログインする必要があるので、ログイン。アカウント持ってない人はアカウント作成していきましょう！

⑤ログイン完了するとUnity側に移行します
![④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465974/98ff1244-1c4f-7256-b03e-552ffdf4a653.png)

ここで「Import」をクリック
*初めて入れる場合はこの画面出ない場合ありますがその時は無視してください🙏

⑥![⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465974/2ade9411-6882-03f6-4938-6efbe28baa59.png)

ここでも「Import」をクリック

⑦![⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465974/8650780c-5791-e668-b001-5ffa3fa3c144.png)

Uniyt開いたらProjectビューに「JoyStick Pack」が入っていたら成功です！

#終わり
お疲れ様でした！！


普段はGeekSalonという大学生限定プログラミングコミュニティでメンターをしております。
Unityを使ったGameアプリ開発のコースがあるので
もし興味ありましたら下のURLからぜひ！！
👇詳細はこちらから👇

https://bit.ly/3f8zWgJ
「安全なWEBアプリケーションの作り方」を読み進めた時に参考にした内容とかメモ

体系的に学ぶ 安全なWEBアプリケーションの作り方　第2版 第8刷

環境
windows10 home
version 2004

#2章
VirtualBoxが起動しない！
P22～図2-18が実行出来ない

[このブログの内容で解決](https://yrhw0609.hatenablog.com/entry/2019/11/25/214258
)

原因は、Dockerを使う為にHyper-Vを有効にしていた為
windows10 homeにはHyper-Vロールをインストール出来ないと書いてあったけど、実際にはすべてのWindowsに組み込まれている。

[Windows 10 上に Hyper-V をインストールする]
(https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)
[WSL2とHyper-Vの関係]
(https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce)


#3章

##3-1
GETとPOSTの使いわけ
[・GETとPOSTの違いについて]
(https://qiita.com/kanataxa/items/522efb74421255f0e0a1)
GETはブックマーク出来て、POSTはブックマーク出来ない
使い分けについては、「プロになるためのWEB技術入門」のP78～にも記載あり

ステートレスってなんだ？
[・ステートレスとは](https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6)

##3-2

受動攻撃について
[・能動的な攻撃と受動的な攻撃](
https://ocw.kyoto-u.ac.jp/ja/graduate-school-of-informatics-jp/06/video01/05
)


##3-3



読み進め中
4日目：観覧車で学ぶコライダーの設定

この記事はアドベントカレンダー「[【VCI】テーマパークを作ろう](https://adventar.org/calendars/5855) 」の4日目の記事です。

# 今回の内容
今回は観覧車を作成しながら以下のことを学びます

* コライダーの種類について
* コライダーの設定方法

# コライダーとは
コライダーとは簡単に言うとオブジェクトに物理的な判定(衝突など)をもたせる機能です。
オブジェクトがぶつかった際にコライダーがない場合はすり抜けてしまいますが、コライダーがあるとオブジェクトがぶつかるようになります。

VCIではコライダーの種類(レイヤー)が以下のようにいくつかあり、何とぶつかりたいか、何とぶつかりたくないかに応じてコライダーを変更します。
今は理解できなくてもレイヤーの種類によってぶつかるものとそうでないものがあるということだけ把握してれば問題ないと思います
![image_ph_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/debba5b5-eb77-b178-4964-baedb0ba1d80.png)
(人間はCharacterとHumanoidPartsという2種類のコライダーを持っております)
詳細は [VCIwikiのコライダーページ](https://virtualcast.jp/wiki/doku.php?id=vci:component:unitycomponent:collider) 参照

また、「物理的な判定は持たせたくないが物体が触れ合ったことは検出したい」という時用に、コライダーには「トリガー」という設定が存在します。こちらは今後登場時に詳しく説明します。

今回は前回作成したゴンドラに乗ってもすり抜けて落ちないようにするためコライダーが必要となります。

# コライダーを設定する
Unity内で作成したアイテムとは違い、Blenderから持ってきたファイルにはFBXファイルにはコライダーがついておりません。
このままだと中に乗ることができないのでコライダーを作成していきます。
今回は環境オブジェクト(持ったりしないが人は衝突させたい)として作成したいのでコライダーレイヤーをLocationとして作成をしていきます。

追加したゴンドラのオブジェクトを選択し、Incpecterの一番上にあるレイヤーをLocationにします。
Incpecterの下にあるAddConponentボタンを押し、追加したいコライダーを選びます。
今回は例として長方形型のBoxColliderを追加しました。(2dというのもありますが、2dがついていないものを選択して下さい)
するとオブジェクトにコライダーが追加されます(緑で枠表示されている部分がコライダーです)。サイズもいい感じのサイズに設定してくれます。
![20201204-214020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/9486f257-32e3-b10b-0d7d-39a3642ac089.png)

ただ持つだけのアイテムなどであればこれだけで十分なことも多いのですが、今回は中に入る必要があるため調整を行います。
円柱の外枠のみというコライダーはないため、代替として長方形を並べて八角形をつくるイメージで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/263cfd0b-fccd-d3cd-7378-09e6d361b1b5.png)
1つのオブジェクトに複数のコライダーをもたせることはできるのがすが、コライダーの設定項目には回転の項目がなく斜めのコライダーが設定できないため別の方法で作成します。
(コライダーのサイズや位置はInspecterから変更可能です)

まずは先程作成したコライダーを一旦削除し、ゴンドラの子に空オブジェクトを追加します。
作成したオブジェクトの中心をゴンドラの中心まで移動し、床面となるコライダーを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/d102e6e9-bb31-e0a0-3488-1c638d2b1ca0.png)

次にこのオブジェクトを7つコピーし、TransformのRotateionを少しずつ変えて設定し八角形となるようにします。
これで側面部分は完了です。最後に全面と背面のコライダーを設定して完了です。
(全面は入れるように隙間を開けています)
![20201204-215627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/89ad3416-9ed6-ff6f-f10b-5fd4956ffca1.png)

(**今回はコライダーを分けましたが、衝突をスクリプトで検出したい場合は分けないほうがいい場合もあります。(後日説明予定)**)

ついでに乗り場も作成しました。こちらはUnityのCubeのオブジェクトを使用しました。
坂や階段などを作るときは繋ぎ目部分に段差ができないように注意して下さい(Vキャスは少しの段差でも引っかかってしまいます)
![20201204-220940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/e1a41374-53f5-7be5-a9b5-a150046a179e.png)


あとはVCIを再度エクスポートしてルームに持って行くだけです！以下のようにゴンドラに乗ることができました。
![20201204-222408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/116d65d2-bad2-e1cd-32d8-6fee417b26a7.png)

以上で今回の作業は完了です。

# 終わりに 
いかがでしたでしょうか？
今回addcomponentからコライダーを作成しましたが、他の機能を実現する際にもこのaddcomponentからコンポーネントを追加することが多いので是非覚えておいて下さい。
【学習法】自動運転系Deep Learningエンジニアになる為の勉強法

<h1>この記事を書いた経緯</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/3fb04e03-d9aa-a7f8-17b3-a146c5df450e.png)

「Computer Vision系でDeepLearningを勉強したいな〜!」

「自動運転エンジニアになりたいな〜!」

「じゃあなんか凄いらしいしYoloから勉強しよう!」と思って始めました。

「何アンカーボックスって？なんでグリッドサイズを決めるの？えっムッず！てかパラメータメチャあるやん！」

賢くなかったので「理解した！」と思ったのに「やっぱよく分からん」ってのが何回もあって、完全に理解するまでに相当な時間が掛かりました。

今思うと物体検出のアルゴリズムって地味に複雑なんですよね。

正直、物体検出はDeepLearningのParameter設定がいらないと言う素晴らしさをあんまり感じられないのではないだろうか？

という事でどこから勉強すると理解しやすいのか、個人の意見100%でまとめてみました！


<h1>オススメの勉強手順</h1>
代表的なタスクを簡単度と関連性で順番を付けてみました。

1. Image Classification
  写真に写っている物体のクラスを推定するタスク。画像全体の特徴を抽出出来るようにネットワークを設計する事が大切。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ddb50f83-3399-7e13-4244-007758147f25.png)

2. Semantic Segmentation
  画像のPixel一つ一つのClass(車、人、猫)を推定するタスク。Cross Entropy Lossさえ理解すれば後は楽勝。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6425d409-f52a-43ad-1eb2-984ae3ac3009.png)

3. Stereo Depth
  右目と左目に映る視差を求める事で画像から距離を推定するタスク。Stereo Matchingを理解していれば数学的で馴染みやすい。Cost Volume(matching scoreを計算する為の物)の定義の仕方が主に2つある。Lossの定義はGround Truth Loss,LR Consistency Loss,Disparity Smoothness Loss,Reconstruction Lossなどがある。画像処理などの知識がついて面白い!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/59abfbbd-089d-d111-c884-69d9f9a2ff21.png)

4. Object Detection
  物体の位置をBounding Boxで囲うタスク。pixel毎に物体の確率を出せる事がSemantic Segmentationから分かると、後は境界線を決めたら終わりってイメージ(実際は違うのだが)。感覚的でないので最初は「そうゆう物なのねって」割り切って慣れるのが良いかもしれない。僕は理解しようとしすぎて泥沼にハマりました(；´Д｀)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/9110c6e2-d5a0-299f-73a2-d16c85a76679.png)

5. Instance Segmentation
  物体のIdとクラス推定するタスク。Object Detectionで得たBounding Box内にSemantic Segmentationをすると物体の境界線が引ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6251053b-1aae-c890-1ddf-385aa9fa73ca.png)

6. Panoptic Segmentation 
  Semantic SegmentationとInstance Segmentationを組み合わせて物体のクラス(数えられる物と数えられない物)とId(数えられる物)とを推定するタスク。Instance Segmentationに空や地面など(数えられない物体)の推定も行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/da4f1d12-bc17-70fb-5cbd-2a746f2fd8bf.png)

7. Mono Depth
　単眼カメラで距離を推定するタスク。位置関係やカメラの傾きから距離を推定する。精度良く推定するのがStereo Depthに比べて難しい。研究としては面白いと思うが実用はかなり難しい印象。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/0c57ed43-7cd9-2679-d0ee-7d9f01bb5507.png)

8. 3D Object Detection
　物体の3次元位置と向きを画像から推定するタスク。今回あげたタスクの中で最難関。Mono Depth/Stereo Depth/Semantic Segmentation/Instance Segmentationなどを組み合わせたりする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/11f8de5e-5226-ea97-32e1-f9fa9f44fa56.png)


<h1>結論</h1>
・Image ClassificationかSemantic Segmentationから始めましょう
他のタスク(特にObject Detection)に比べてシンプルで感覚的に理解出来ると思います！

以上勉強始めた頃の僕に言いたかったをツラツラと書きました！

参考になったら幸いです
【Kotlin】Androidアプリでボタン連打を抑止する方法（DataBinding編）

この記事は[Kotlin Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kotlin)の5日目の記事です。
Androidアプリ開発初心者ですが、空きがあったので勢いだけで参加してみました。(1日ぶり2回目)

## はじめに
Androidに限らず色々なアプリを開発していて、ついつい忘れがちなボタン連打対策。。。
処理の多重実行によってバグが発生することも多々あるため対処が必要です。

いざ実装しようと調べて見ると、通常の連打対策の記事はよくありますが、
DataBindingを利用しているプロジェクトで、簡単に導入できる方法が見つからなかったため、備忘録として記事にしようと思います。

## DataBindingを使った場合の通常のボタン押下処理
`android:onClick`を利用してボタン押下時処理と紐付けを行います。

```xml:MainLayout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools">
  <data>
    <variable name="viewModel" type="com.sample.viewmodel.MainViewModel" />
  </data>
  <LinearLayout>
    <Button
      android:onClick="@{() -> viewModel.onClickButton()}"
    />
  </LinearLayout>
</layout>
```
※ 実際は幅、高さなどの属性も指定しないとエラーになりますが、今回の説明に不要な部分は省略してあります。

## 連打対策済みボタン押下時処理
Extensionを利用し全てのビューの基底クラスに
OnClickListenerのセッターのラッパー(連打防止が処理入り)を定義し、
カスタム属性と紐付けます。

```Kotlin:ViewExtension.kt
package com.sample.extension

import android.view.View
import androidx.databinding.BindingAdapter
/**
 * ==============================================
 *  View Extensions
 * ==============================================
 */
/**
 * setOnSingleClickListener
 */
@BindingAdapter("android:onSingleClick")
fun View.setOnSingleClickListener(listener: View.OnClickListener) {
  // 押下後一時的に押下処理を無効化する時間(ms)
  val delayMillis = 500L
  // 前回押下時間(タイムスタンプ, ms)
  var pushedAt = 0L

  this.setOnClickListener {
    if (System.currentTimeMillis() - pushedAt < delayMillis) {
      // 前回押下から規定時間分経過していない場合は、処理終了
      return@setOnClickListener
    }
    // 押下時間を更新
    pushedAt = System.currentTimeMillis()
    // 押下時処理を実行
    listener.onClick(this)
    return@setOnClickListener
  }
}
```

レイアウトでの利用方法は`android:onClick`の代わりに利用するだけです。

```xml:MainLayout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools">
  <data>
    <variable name="viewModel" type="com.sample.viewmodel.MainViewModel" />
  </data>
  <LinearLayout>
    <Button
      android:onSingleClick="@{() -> viewModel.onClickButton()}"
    />
  </LinearLayout>
</layout>
```

## さいごに
次からは初期段階から導入するように注意します....
~~私の場合、気づいたときには、`android:onClick`が既に100箇所以上定義されていたので、少しの書き換えで済んで良かった。。。~~

## 参考記事
- [ボタンの連打を防止する処理を共通化する - コジオニルク](https://kojion.com/posts/1057)
STM32L010F4P6に中華ST-LINKでプログラムを書き込む。


商品名は、
ST-LINK V2
STM8 ＆ STM31

巷(ちまた)では、
中華ST-LINK
と言うらいしのお話であった。

200円から500円でアマゾン等で売っている怪しい装置だそうだ。

リセットの設定と改造方もあるらしい。

1.何らかの方法でSTM32L010F4P6を入手して
何らかの方法でVDD,VDDAに結線、GNDに結線
boot0をプルダウン、Nretをプルアップする。
2.何らかの方法で中華ST-LINKを入手する。
今回使った中華ST-LINKは、aitendoの
500円のやっです。
ついでに、STM32L010F4P6の
VDD,GND,STCLK,SWDIOを中華ST-LINKと結線する。
3.何らかの方法でSTジャパンの会員になる。
https://www.stmcu.jp/member/entry/regist/
4.STM32 ST-LINK Utilityをダウンロード
https://www.stmcu.jp/design/sw_dev/pc_soft/53396/
STSW-LINK004 STM32 ST-LINK utility 4.6.0
でダウンロードボタンをおす。
5.ダウンロードディレクトリーで
en.stsw-link004_v4-6-0.zipを展開する。
6.en.stsw-link004_v4-6-0ディレクトリーの
setup.exeを実行する。
7.STM32 ST-LINK Utilityを実行する。
msc140.dellがないが自分の環境では、出たが
c++のランタイムを入れたら治った。
vc_redist.x64.exe
vc_redist.x86.exe
詳しくは、各自調べてね!
気にもしていなかったけど、当然、ソフトウェアリセットに設定する。
一旦挿す。
セッテングボタンを押してソフトウェアリセットを選択する。
一旦抜く。
リセットピンを接続しない為に必要な設定です。
8.STM32L010F4P6と中華ST-LINKを繋いだ物をUSBに挿す。
9.接続ボタンを押す。
メモリーマップが表示される。
10.書き込みボタンを押す。
mbed_blinky_011.NUCLEO_L011K4 (4).binを選択する。　各自違う。
スタートで書き込み開始。
11.切断ボタンを押す。
12.終わり。

参考

https://www.aitendo.com/product/16082

http://penguinsan.hatenablog.com/entry/2016/12/29/221733


忙しい人よう
https://github.com/caa45040/mbed_binky_010
mbed_blinky_010.NUCLEO_L011K4.bin を書き込むとブリンクします。(PA4)



![中華link_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d822f3c8-5725-6ac6-a2e1-07cbcaa2e19f.jpeg)

![中華link_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bf03af77-491d-8b55-cc96-bdaaede8753c.jpeg)

![中華link_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/df8c37a5-d31a-651e-c21c-dda4333df59e.jpeg)

![st_link_2_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fe301e1c-f9bb-d108-0c03-fd80684fcb07.jpeg)

![st_link_2_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a82828ec-97c4-ec19-0161-de6e37f860d1.jpeg)

![st_link_2_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/eb6b224d-9e50-79dd-bbed-1594b356cea4.jpeg)
Githubにpushしても、contributionsに反映されない時の対処法

ローカル環境からGithubにcommit、pushできても、contributionsに反映されない。。。
いわゆる草が生えないっていうやつです。

自分もこの問題にぶち当たったので解決策を書いておきます。

参考資料
https://findy-code.io/engineer-lab/github-contributions-rule

###ローカル環境でのgitに、GitHubアカウントでのメールアドレスが追加する必要がある

だいたいの人が、メールアドレスが追加されていなかったり、一致してなかったりして、contributionsに反映されないようです。メールを確認する方法は以下です。

```
＄ git config --global user.email
```
このコマンドでローカル環境でのgitに登録されているメールアドレスが確認できます。このとき、何も表示されていない場合はGitにメールアドレスが登録されていないです。

###GitHubアカウントでのcommitから、メールを確認する方法

Githubのcommitからも、メールが登録されているか確認できます。

手順は
①リポジトリのコミットを確認できるページにアクセス。確認したいコミットをクリック。
②その飛んだURLの一番後ろに「.patch」をつける
③ページ一番上の「From」の部分を確認します。設定できていればメールアドレスが表示されます。

###ローカル環境でのgitに、GitHubアカウントでのメールアドレスが追加する方法
設定ができていない人はターミナルから下記のコマンドで設定ができます。

```
git config –-global user.email “email@example.com“
```

このコマンドでメールアドレスを追加後に、再度commit、pushして見てください。contributionsに反映されるはずです。また、リポジトリのコミットを確認できるページでもcommitしたアカウントが変更されているはずです。

以上参考になれば幸いです。
.ssh/configにgithubに接続する時の鍵を指定する

## .ssh/configにgithubに接続する時の鍵を指定する
```
Host github.com
 User git
 port 22
 Hostname github.com
 # 鍵の指定
 IdentityFile ~/.ssh/id_rsa
 # 接続状態を継続したい場合：yes　継続しない場合：no
 TCPKeepAlive yes
 # IdentityFileが必要な場合：yes　必要ない場合：no
 IdentitiesOnly yes
```
参考：https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1

## github側で指定した鍵でのアクセスを許可する
https://github.com/settings/keys
ここで.ssh/configで指定した秘密鍵に対応する公開鍵を登録する。


これでgithubのレポジトリを操作できる。
【Panoptic Segmentation】UPSNet : Unknow classの推定

<h1>UPSNet: A Unified Panoptic Segmentation Network</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6402b12d-f10b-b875-88a4-9ed421ba5b50.png)

Panoptic + FPNの構成の[Semantic FPN](https://qiita.com/minh33/items/e43d30129cd52efed59e)について前回解説したので、それ以外の所に触れていきたいと思う

Unknownクラスの推定が出来るらしい。


<h1>新規性</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e5bde5c2-9d9a-f7ad-1bd6-1a887bce502f.png)
Panotic Head以外は過去に既に研究されているので飛ばします。


<h2>Unknown Prediction</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/3aa1cc71-5dc6-d40f-7813-61cee8789ba9.png)

間違ったclassification(定義していないclassの物体など)をするよりunkown classとして振り分けた方が良いのではないかという主張。

例)歩行者を自転車として検出した場合
歩行者の検出漏れ(FN)が1増える
自転車の誤検出(FP)が1増える

FPまたはFNが増えるとRQが悪くなってしまう。
1つ間違えるとダブルで精度が落ちるのが良くないそうです。

この問題を解決する為にUnknow Classを推定します。

Unknowとして検出されると検出漏れ(FN)の物体が1増えてるが、誤検知(FP)の数が増えずに済む。やった〜〜!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f400b7b3-a749-131c-04cb-d1784bccaab4.png)

Yi: instance iのinstance segmentationの結果
Xthing :数えられるクラスに分類されたsemantic segmentationの結果
Xstuff :数えられないクラスに分類されたsemantic segmentationの結果
Xmaski :Xthingの中のinstance iのROIに対応するもの(赤の点線)

とりあえず紫で囲ったUnknow Predictionの流れだけ理解出来ればokayです。
Zunknown = max (Xthing) − max (Xmask)
Xmask :Xmaskiをチャネル方向に結合(検出物体数xClass数 ,H,W)

例)
max(Xthing)で車が2台検出されていて、max(Xmask)で車が1台しか検出されなかった。
すなわち、Instance Segmentationで物体の検出漏れの可能性が高い

<h1>結論</h1>
・Unknowクラスを推定する事で間違ったClass推定によってPQを下げすぎずに済む。

あんまり深く考えると分からなくなっていくので、使い慣れていきたいと思います！

<h1>参考文献</h1>
UPSNet: A Unified Panoptic Segmentation Network
https://arxiv.org/pdf/1901.03784.pdf
情報処理技術者試験の長文読解3つのコツ

# はじめに

- これはAdvent Calendar 2020の資格試験攻略 6日目の記事です。
- この記事では、情報処理技術者試験における自分なりの午後問題の解き方のコツを書いていきたいと思います。

- 今回は[ネットワークスペシャリスト試験の平成29年度の午後Ⅰ問題](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29.html#29aki)を例としていますが、他試験でも基本は同じです。
- 以下の画像は100点満点の答案ではなく、あくまで例なのでご了承ください。

# コツ①問題の進め方
- 問題文の[タイトル]と設問はほぼ対応している&書いてある順番通り
- ですので、[]内の問題文を読む→対応する設問を解く　を繰り返して行くのがオススメです。


# コツ②マークの付け方
- 自分なりにマークを付けながら読んでいきます。これは、問題を読み直す時間を短縮するのに役立ちます。
- 私は主に、以下のように分けています。
 - □：用語・キーワード
 - ○：怪しい・違和感があるところ
 - ~~~：固有の条件（要件）
- また、必要があれば図に書き込んだり、図に起こしたりして頭を整理していきます 
 ![縦長画像 12-05-2020 09.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/5133df5c-ffc9-90cf-54cf-e9167b361e72.jpeg)
![縦長画像 12-05-2020 09.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/a025b264-31fe-b5b2-4cc7-8911c35b3011.jpeg)



# コツ③設問の読み方
- 重要な部分にマークしていきます
- 設問の趣旨を読み違えると、×になってしまうので気をつけましょう
![イラスト30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/a0b5512f-fe89-0c14-ebcb-7af244a2447f.jpeg)


# おわりに
- この記事が皆さんの参考になれば嬉しいです！
結婚生活における不吉な匂いをリファクタリングする方法を考えてみる

[アジャイルを使ってクリスマスまでに彼女を作る方法を考えてみる](https://qiita.com/Let_kdm_free/items/7287325f4a3541e4551e) を踏まえ
[結婚生活は生涯にわたるリファクタリング](https://qiita.com/Let_kdm_free/items/7287325f4a3541e4551e#comment-d37ae4bb02ce78decb91) との声があった。良い指摘だとおもった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/4f527e57-dcef-fbff-4948-38ad3f8dfc20.png)

ので、考えてみました。


## 結婚生活における[不吉な匂い](https://qiita.com/NagaokaKenichi/items/22972e6ba698c7f2978a#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%B8%8D%E5%90%89%E3%81%AA%E8%87%AD%E3%81%84%E3%81%A8%E3%81%AF)
それにはまず結婚生活の不吉な匂いを考えなければなりません。

### 不吉な臭いとは
[深刻な問題、リファクタリングの必要が存在することを示す何らかの兆候、雰囲気を、臭いで比喩して表したもの](https://qiita.com/NagaokaKenichi/items/22972e6ba698c7f2978a#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%B8%8D%E5%90%89%E3%81%AA%E8%87%AD%E3%81%84%E3%81%A8%E3%81%AF)。です。

### 各臭いに対する対応
[新装版　リファクタリング](https://www.amazon.co.jp/%E6%96%B0%E8%A3%85%E7%89%88-%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B-%EF%BC%AD%EF%BD%81%EF%BD%92%EF%BD%94%EF%BD%89%EF%BD%8E%EF%BC%A6%EF%BD%8F%EF%BD%97%EF%BD%8C%EF%BD%85%EF%BD%92-ebook/dp/B01IGW5MG0)　に対応方針が載っているので、気になる人は是非読んでみましょう。

### コードの不吉な臭いとは

1. 重複したコード
2. 長すぎるメソッド
3. 巨大なクラス
4. 長すぎるパラメータリスト
5. 変更の偏り
6. 変更の分散
7. 特性の横恋慕
8. データの群れ
9. 基本データ型への執着
10. Switch文
11. パラレル継承
12. 怠け者クラス
13. 疑わしき一般化
14. 一時的属性
15. メッセージの連鎖
16. 仲介人
17. 不適切な関係
18. クラスのインターフェース不一致
19. 未熟なクラスライブラリ
20. データクラス
21. 相続拒否


## 変数のスコープ

踏まえると、まず [スコープを小さくする](https://qiita.com/alt_yamamoto/items/25eda376e6b947208996#star5%E5%A4%89%E6%95%B0%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%82%92%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%99%E3%82%8B) ことが重要。
日々のいさかいや喧嘩は対象を絞り、影響度を最小限にすることが大事です。


## 単一ソースの原則

[同じ情報を重複して持たない。](https://qiita.com/alt_yamamoto/items/25eda376e6b947208996#star5%E5%8D%98%E4%B8%80%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E5%8E%9F%E5%89%87) つまり、同じ、つまらないことは何度も言わない。

## 可読性を意識する

[逆に、わかりやすく大事なことは声に出して言いましょう](https://qiita.com/alt_yamamoto/items/25eda376e6b947208996#star5%E9%81%A9%E5%88%87%E3%81%AA%E5%90%8D%E5%89%8D%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B)。感謝の気持ちとか。
ありがとう。ごちそうさま、等々。[気持ちの可読性を意識しましょう。](https://qiita.com/alt_yamamoto/items/25eda376e6b947208996#star5functionobject%E3%81%AE%E5%BD%A2%E3%82%88%E3%82%8Aobjectfunction%E3%81%AE%E5%BD%A2%E3%82%92%E5%A5%BD%E3%82%80) 

## 結婚生活における依存度

不吉な匂いを考えると重要なポイントは、「責務」の切り分け、「関係」の度合いであることがわかります。つまり結婚生活も [疎結合と密結合のバランス](https://qiita.com/alt_yamamoto/items/25eda376e6b947208996#%E7%96%8E%E7%B5%90%E5%90%88%E3%81%A8%E5%AF%86%E7%B5%90%E5%90%88%E3%81%AE%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9) が重要な要素であることが考えられるのではないでしょうか。

> 一般にプログラムは疎結合である方が汎用性やメンテナンス性に優れるが、
> 結合度を高めすぎると、1つのファイルが肥大しすぎたり密結合により汎用性やメンテナンス性を損なってしまうが、不必要で過剰な疎結合もまたメリットよりコストが大きくなってしまうというデメリットがある。

結婚生活も互いに、適切に、疎であるほうが、汎用性や保守性が維持できる期待があります。何がベストかはケースバイケースで正解のない課題ではあります。適切なバランスでまとめることを意識していきましょう！


## 参考

[良いコードの書き方](https://qiita.com/alt_yamamoto/items/25eda376e6b947208996)
[不吉な匂い](https://qiita.com/NagaokaKenichi/items/22972e6ba698c7f2978a#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%B8%8D%E5%90%89%E3%81%AA%E8%87%AD%E3%81%84%E3%81%A8%E3%81%AF)
Googleスプレッドシートで色見本を作る

Googleスプレッドシートで下の図のような色見本を作りたいと思って、やってみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/e333a3b6-f766-7aae-5fd0-41a533538ac1.png" width="30%">

# やり方

カラーコードは、6桁の16進数から作られています。#000000であれば、黒。#FFFFFFであれば、白です。
Googleスプレッドシートには、画像を表示する関数`IMAGE`がありますので、この関数に色見本の画像のURLを渡してあげれば、色見本帳ができることになります。
では、色見本の画像はどうやってつくればいいでしょうか。
それには、the color apiという便利なAPIサービスがあります。

https://www.thecolorapi.com/

このAPIに適当な変数を渡してあげると、HTMLやSVGなど様々なフォーマットで色情報を返却してくれます。

例えば、
```
https://www.thecolorapi.com/id?format=html&hex=D91E41
```
と指定すると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/756e89c2-4bae-d5ab-c7e4-d601e93b547c.png" width="30%">
こんな感じです。

# 実際の関数

今回は、SVGという画像フォーマットがほしいので、`format=svg`とします。
さらに、カラーコードでの指定するので、`&hex=`とします。
そのあとに文字列を結合する`CONCATENATE`関数を使ってカラーコードの入力されたセルを指定します。
その時に注意するのが、`#`マークです。APIの仕様では#は不要なので、関数`RIGHT`を使って右から6文字だけを抜き出しておきます。

セルに入力した関数のサンプルはこちらです。

```
=IMAGE(CONCATENATE("https://www.thecolorapi.com/id?format=svg&hex=",RIGHT(A1,6)),1)
```


# 色見本帳

最終的に作ってみた色見本帳はこちらです。
カラーコードのリストは、以下のサイトより引用にさせていただきました。
https://www.colordic.org/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/c0045523-fa4f-da6d-06e5-f9cf1534a160.png" width="60%">
【CSS3】transform + translateでアニメーション

transformプロパティ + 用意されている関数を指定することでアニメーションを設定することが可能です。

# 準備

まずはbodyタグ内に以下のような正方形を動作の確認用として作成します。
※今回は`style.css`内に動きが分かりやすいよう、<br>`transition: transform 1.0s`で1秒間かけて移動するようにしています。

```html:index.html
<div>
   <div class="target"></div>
</div>
```

```css:style.css
.target {
    width: 100px;
    height: 100px;
    margin: 0 auto;
    background-color: skyblue;
    transition: transform 1.0s; 
}
```
![スクリーンショット 2020-12-04 6.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/2b520970-15ca-666b-29bd-92c81613fcf4.png)


##translateで移動させてみる
物体の位置を移動するときに使用

```css:style.css
.target {
    width: 100px;
    height: 100px;
    margin: 0 auto;
    background-color: skyblue;
    transition: all 1.0s;
    transform: translate(100px, 100px); 
}
```
`transform: translate(x軸(横方向), y軸(縦方向));`　と指定することで物体を指定した位置に移動させることが可能。

今回の場合だと <strong>第一引数(x軸)に100px,第二引数に100px(y軸)</strong> を指定することで、
x軸方向に100px、y軸方向に100px移動させることが可能です。

![041.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/b132f2fe-0858-714b-c70c-8ccfb1987cae.gif)
【Kotlin】KFunctionがトップレベル関数か判定する

# TL;DR
- トップレベル関数は実体が`static`関数になるため、`javaMethod`について`Modifier.isStatic(javaMethod.modifiers)`で判定できる

# 本文
`KFunction`がトップレベル関数（トップレベル拡張関数含む）なのかを判定します。
`KFunction`には`isTopLevel`というようなプロパティが無いため、単体でトップレベル関数なのかを判定することはできません。

冒頭で書いた通り、トップレベル関数の実体は`static`関数になるため、それを使うことで間接的に判定することができます。

```kotlin
fun topLevelFunc(arg: Int) = arg.toString()

val kFunction = ::topLevelFunc
val javaMethod = kFunction.javaMethod!!

val isTopLevelFunc = Modifier.isStatic(javaMethod.modifiers)
```
決定木の不純度

決定木の不純度を表す代表的な関数3種類を備忘録メモとして残しておきます。
式中の記号の意味: $t$:各ノード, $P(C_{i}|t)$:ノードtにおけるクラス$C_{i}$の湿る割合, $K$:クラス数

# 誤り率

```math
E(t) = 1 - \max_{i} P(C_{i} | t)
```


# 交差エントロピー

```math
E(t) = - \sum_{i=1}^{K} P(C_{i}|t) \ln P(C_{i}|t)
```

# ジニ係数

```math
E(t) = 1 - \sum_{i=1}^{K} P^{2}(C_{i}|t)
```

# Reference
* [Pythonと実データで遊んで学ぶ データ分析講座](https://www.amazon.co.jp/dp/B07VRZRR1G/)
SQLで分析関数を使わずに簡単に連番を振る方法

# 例題
このようなテーブルに対して連番を振る

| 氏名 | 教科 | 点数 |
| ---- | ---- | ---- |
| 佐藤 | 国語 | 0    |
| 佐藤 | 数学 | 31   |
| 佐藤 | 英語 | 19   |
| 鈴木 | 国語 | 59   |
| 鈴木 | 数学 | 38   |
| 鈴木 | 英語 | 25   |
| 高橋 | 国語 | 92   |
| 高橋 | 数学 | 100  |
| 高橋 | 英語 | 39   |
| 田中 | 国語 | 40   |
| 田中 | 数学 | 52   |
| 田中 | 英語 | 30   |

# スキーマ

```sql
CREATE TABLE 成績テーブル(氏名 varchar(4), 教科 varchar(4), 点数 int);
INSERT INTO 成績テーブル(氏名, 教科, 点数)
VALUES
    ('佐藤', '国語', 0 ),
    ('佐藤', '数学', 31),
    ('佐藤', '英語', 19),
    ('鈴木', '国語', 59),
    ('鈴木', '数学', 38),
    ('鈴木', '英語', 25),
    ('高橋', '国語', 92),
    ('高橋', '数学', 100),
    ('高橋', '英語', 39),
    ('田中', '国語', 40),
    ('田中', '数学', 52),
    ('田中', '英語', 30);
```

# 全体に連番を振る場合
```SQL
SELECT *
     , (SELECT COUNT(*) 
          FROM 成績テーブル 
         WHERE (氏名, 教科, 点数) <= (Z.氏名, Z.教科, Z.点数)
        ) 連番
 FROM 成績テーブル Z
ORDER BY 1,2,3;
```

実行結果

| 氏名 | 教科 | 点数 | 連番 |
| :--- | :--- | :--- | :--- |
| 佐藤 | 国語 | 0    | 1    |
| 佐藤 | 数学 | 31   | 2    |
| 佐藤 | 英語 | 19   | 3    |
| 田中 | 国語 | 40   | 4    |
| 田中 | 数学 | 52   | 5    |
| 田中 | 英語 | 30   | 6    |
| 鈴木 | 国語 | 59   | 7    |
| 鈴木 | 数学 | 38   | 8    |
| 鈴木 | 英語 | 25   | 9    |
| 高橋 | 国語 | 92   | 10   |
| 高橋 | 数学 | 100  | 11   |
| 高橋 | 英語 | 39   | 12   |

# 特定のキー毎に連番を振る場合
```SQL
SELECT *
     , (SELECT COUNT(*) 
          FROM 成績テーブル 
         WHERE (氏名, 教科, 点数) <= (Z.氏名, Z.教科, Z.点数)
           AND (氏名) = (Z.氏名)  -- 複数カラムの時は(列1,列2) = (Z.列1, Z.列2) とできる
        ) 連番
 FROM 成績テーブル Z
ORDER BY 1,2,3;
```

実行結果

| 氏名 | 教科 | 点数 | 連番 |
| :--- | :--- | :--- | :--- |
| 佐藤 | 国語 | 0    | 1    |
| 佐藤 | 数学 | 31   | 2    |
| 佐藤 | 英語 | 19   | 3    |
| 田中 | 国語 | 40   | 1    |
| 田中 | 数学 | 52   | 2    |
| 田中 | 英語 | 30   | 3    |
| 鈴木 | 国語 | 59   | 1    |
| 鈴木 | 数学 | 38   | 2    |
| 鈴木 | 英語 | 25   | 3    |
| 高橋 | 国語 | 92   | 1    |
| 高橋 | 数学 | 100  | 2    |
| 高橋 | 英語 | 39   | 3    |

# 解説
この記事で強調したかった部分はここです。

```SQL
WHERE (氏名, 教科, 点数) <= (Z.氏名, Z.教科, Z.点数)
  AND (氏名) = (Z.氏名)  -- 複数カラムの時は(列1,列2) = (Z.列1, Z.列2) とできる
```

多くのSQLでは、複数のカラムに対して比較演算子が使えます。

# お試し
http://sqlfiddle.com/#!9/d3b459/1/0
docker-composeで生成されるdefault networkのsubnet範囲を指定する

# 背景
docker-composeでは特に指定のない限り、xxx_defaultというネットワークが作成されるが、このsubnetのCIDRは `172.17.0.0/12`、`192.168.0.0/16` から重複しないように選ばれる。（前者が枯渇すると後者から選ばれる）
[linuxでhost.docker.internalを使う](https://qiita.com/skobaken/items/03a8b9d0e443745862ac)
この手法を使うにはホスト側でdocker-composeが生成するサブネットからのパケットをfirewallで許可しないといけないが、上記のサブネット全部を許可するのはなんとなく嫌で、サブネットの範囲を限定したかった。

# default-address-pool

dockerdの起動オプションで、自動でnetworkを作る時のサブネットのCIDR範囲を指定できる。

```json:/etc/docker/daemon.json
{
  "default-address-pools": [
    { "base": "10.123.0.0/16", "size": 24 }
  ]
}
```

上のように指定すると、`10.123.0.0/16` からネットワークアドレスが24bitであるようなサブネット（`10.123.0.0/24`、`10.123.10.0/24`等）を選んでくれる。