OmniAICreator/Qiita-1.07M huggingface dataset:
エポスカードのhigh&lowゲームの期待値を計算する

# 概要
エポスカードをお持ちの人ならご存知だと思うが、エポスカード専用アプリでは１日１回トランプのhigh&lowゲームをして最大3ポイント取得することができる。
その期待値と勝つ確率を計算してこの記事を読むすべての方に約40円の不労所得（？）を得てもらうべくこの記事を書いた。

私は数学が極めて苦手であるので、もしかすると、計算ミスがあり確率が違う可能性があるためミスを発見した場合は優しく指摘してほしい。

# ゲームルール
このゲームは、Joker、A、K、Q、J、10、9、8、7、6、5、4、3、2の14枚のカードがあり、最初に1枚のカードが提示される。
その後、highかlowを選び、2枚目に出たカードがhigh、lowどちらか合っていれば1ポイントもらうことができる。同じカードだった場合はやり直す。
1ゲームごとにやめるか続けるかを選択でき、3回までゲームを続けることができる。
カードの強さは、上に書いた順番通り
Joker > A > K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2
である。
とすると、8、9の場合は7枚が当たり、1枚がやり直し、6枚がハズレということになり、8以下が提示された場合はhigh、9以上が提示された場合はlowを選ぶのが最善であることがわかる。
これを式にする。

# それぞれのカードの勝つ確率
$$ 9,8で勝つ確率 => \frac{7}{14} \underset{n\to \infty }{\text{lim}}\left(\sum _{n=1}^n \left(\frac{1}{14}\right)^{n-1}\right)=\frac{7}{13} $$
$$ 10,7で勝つ確率 => \frac{8}{14} \underset{n\to \infty }{\text{lim}}\left(\sum _{n=1}^n \left(\frac{1}{14}\right)^{n-1}\right)=\frac{8}{13} $$
$$ J,6で勝つ確率 => \frac{9}{14} \underset{n\to \infty }{\text{lim}}\left(\sum _{n=1}^n \left(\frac{1}{14}\right)^{n-1}\right)=\frac{9}{13} $$
$$ Q,5で勝つ確率 => \frac{10}{14} \underset{n\to \infty }{\text{lim}}\left(\sum _{n=1}^n \left(\frac{1}{14}\right)^{n-1}\right)=\frac{10}{13} $$
$$ K,4で勝つ確率 => \frac{11}{14} \underset{n\to \infty }{\text{lim}}\left(\sum _{n=1}^n \left(\frac{1}{14}\right)^{n-1}\right)=\frac{11}{13} $$
$$ A,3で勝つ確率 => \frac{12}{14} \underset{n\to \infty }{\text{lim}}\left(\sum _{n=1}^n \left(\frac{1}{14}\right)^{n-1}\right)=\frac{12}{13} $$
$$ JOKER,2で勝つ確率 => \frac{13}{14} \underset{n\to \infty }{\text{lim}}\left(\sum _{n=1}^n \left(\frac{1}{14}\right)^{n-1}\right)=\frac{13}{13} $$

# １回のゲームで勝つ確率
$$ \frac{1}{7} \times \frac{7}{13} + \frac{1}{7} \times \frac{8}{13} + \frac{1}{7} \times \frac{9}{13} + \frac{1}{7} \times \frac{10}{13} + \frac{1}{7} \times \frac{11}{13} + \frac{1}{7} \times \frac{12}{13} + \frac{1}{7} \times \frac{13}{13}=\frac{10}{13} $$

# 回数別の期待値
$$ 1回勝って終わる場合=>1 \times \frac{10}{13}=\frac{10}{13}\approx0.769... $$
$$ 2回勝って終わる場合=>2 \times (\frac{10}{13})^2=\frac{100}{169}\approx1.183... $$
$$ 3回勝って終わる場合=>3 \times (\frac{10}{13})^3=\frac{1000}{2197}\approx1.365... $$

# まとめ
最善の手を打てば3回チャレンジし続けるのが一番期待値が高く、１日の期待値は約1.365円、仮に１ヶ月が３０日だとすると、40.95円得られる計算になることがわかった。

# 謝辞
協力してくれたぼんずくんありがとう。
npm run buildできるのにnpm run startが出来なくてハマった話

# 何が起きたか？

端的に書くと表題の状態。

nuxt.jsにおいて、buildできるのにstartできなくてなんで？となったのでその解決手法。


# どう解決したか

Server Middlewareの設定に拡張子が抜けていたのを補っただけ。


**nuxt.config.js**

```javascript

  serverMiddleware: [
    (略)
    '~/server-middleware/xxxx',
    '~/server-middleware/yyyy'
  ]
```

この状態でbuildした場合start出来なかった。

```
% npm run start
> my-project@1.0.0 start
> nuxt start


 FATAL  No build files found in /path/to/.nuxt/dist/server.
Use either `nuxt build` or `builder.build()` or start nuxt in development mode.

  Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
  at VueRenderer._ready (node_modules/@nuxt/vue-renderer/dist/vue-renderer.js:758:13)
  at async Server.ready (node_modules/@nuxt/server/dist/server.js:637:5)
  at async Nuxt._init (node_modules/@nuxt/core/dist/core.js:482:7)


   ╭───────────────────────────────────────────────────────────────────────────────────────────────╮
   │                                                                                               │
   │   ✖ Nuxt Fatal Error                                                                          │
   │                                                                                               │
   │   Error: No build files found in /path/to/.nuxt/dist/server.                                  │
   │   Use either `nuxt build` or `builder.build()` or start nuxt in development mode.             │
   │                                                                                               │
   ╰───────────────────────────────────────────────────────────────────────────────────────────────╯
```

こうしたら出来た。

**nuxt.config.js**


```javascript

  serverMiddleware: [
    (略)
    '~/server-middleware/xxxx.ts',
    '~/server-middleware/yyyy.ts'
  ]
```

しょうもないことで1時間くらい損した。

以上。
AWS Global Accelerator とは

## 勉強前イメージ

リージョン超えてのLB的な？

## 調査

### AWS Global Accelerator とは

ALB、NLB、EC2の前段に置いてアプリケーションの可用性とパフォーマンスを改善するサービスです。
まず、ALB、NLB、EC2はGlobal Acceleratorにおいて `エンドポイント` として扱われ、
エンドポイントはエンドポイントグループというものに属します。
基本的には特定リージョンにエンドポイントグループを作成しますが、リージョンを跨いでバランシングすることも可能なので、
リージョン間でのアプリケーションのバランシングも可能です。
EC2に置いてALBなどがLBの役目をしますが、ALBに置いてはGlobal AcceleratorがLBのような役目を行います。

### AWS Global Acceleratorの言葉(他のサービスでも使うことはあります)

- エンドポイント

上記に記載の通り、 `ALB、NLB、EC2` のこと

- エンドポイントグループ

上記に記載の通り、エンドポイント(ALB、NLB、EC2)のグループ
エンドポイントグループはリージョンに作成され、リージョン跨いでもOK。同一リージョンに複数エンドポイントグループを作成するのもOK

- アクセラレーター

AWS Global Accelerator のメインのコンポーネントの1つで、
1つ以上リスナーを持って、リスナーで受けたトラフィックをどのエンドポイントグループにルーティングするかを決めることができます。
LBのようなものになります。

- エッジロケーション

AWSのグローバルネットワーク内で、エッジロケーションは同一のGIPをもちます。
ユーザが最寄りのエッジロケーションにアクセスすると、そこからグローバルネットワーク内の通信でエンドポイントに通信が到達します。

### cloudfrontとの違い

cloudfrontと似たようなサービスですが、以下の差分があります。

- cloudfront
	- プロトコル : http/httpsのみ対応
	- キャッシュ : 使う
	- クライアント証明書 : 利用しない
- global accelerator
	- プロトコル : TCP/UDPのトラフィック・ルーティングに対応
	- キャッシュ : 使わない
	- クライアント証明書 : 利用する

## 勉強後イメージ

ALB、NLBの上位のLB的な存在で速くなるような感じかな？

## 参考

- [AWS Global Accelerator を導入するとざっくりどのくらい速くなるの？手軽にシミュレーションできるWebツールができた](https://dev.classmethod.jp/articles/aws-globalaccelerator-speed-comparison/)
- [【AWS】Global AcceleratorとCloudFrontの違い（初心者向け）](https://sonnaka.com/aws-globalaccelerator-vs-cloudfront/)
Cos類似度の拡張「t-vMF類似度」で山容をカスタマイズしましょ


# 10秒でわかった気になれる概要

Cos類似度の**山頂を狭く**することで、**劣悪データセット**に対する分類問題で高性能を発揮しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269839/6cccb346-289a-0da1-c7f3-42152bd267e8.png)



↓論文
[t-vMF Similarity for Regularizing Intra-Class Feature Distribution](https://staff.aist.go.jp/takumi.kobayashi/publication/2021/CVPR2021.pdf)

t-vMF類似度とは、上記論文で提案された、**Cos類似度の拡張**です。
この論文は、トップカンファレンス**CVPR2021**に採択された、なんと、**日本人**論文です！！
産総研（AIST）の小林匠さんという方が書かれています。

# そもそもCos類似度ってなに？
Cos類似度とは、**サンプル間の類似具合の尺度**です。
[深層距離学習](https://tech-blog.optim.co.jp/entry/2021/10/01/100000)の分野では、画像から抽出される特徴ベクトルの類似具合をCos類似度で測ります。
別の類似度として、２つの特徴ベクトルの直線距離が近ければ類似度が高いとするユークリッド距離という類似度がありますが、
一方でCos類似度は、**特徴ベクトル間のなす角θが小さければ類似度が高い**とする測り方です。
このCos類似度は、深層距離学習の代表モデル[ArcFace](https://qiita.com/yu4u/items/078054dfb5592cbb80cc)や、同じCVPR2021に採択された[MagFace](https://qiita.com/miiuchu/items/bf970a6fe4ab01866511)で用いられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269839/814f5316-f84c-ee78-7088-a2acbada6801.png)



# どうやってCos類似度を拡張したの？

詳細を知りたい方はSlideShareにまとめましたので、そちらをご覧ください。↓↓↓

https://www.slideshare.net/ShioriUchiumi/tvmfsimilarity-250527082
総和情報量という定義から良いコードについて考えてみる

# 良いコードと情報量

僕の中の良いコードの定義は、目的を達成するためのコードを最小の情報量で記述したコードのことだ。
殆どのプログラミング原則についてはこの観点から説明できる（と思っている）。

しかし、この観点から解説した文がみつからなかった（多分探し方が悪い。あれば教えて下さい）のでここにシェアしようと思う。
また、ここに書く専門用語らしきものは「僕の定義」である。注意されたし。（適切な語句があれば教えて下さい）
ここの優秀な方々がガンガン訂正・追記・ブラッシュアップしてくれることを祈る。

## 情報量の定義
ここで情報量を定義しておきたいと思う。
僕がコーディングの文脈で使用する情報量には「明示情報」と「暗示情報」の２種類がある。

ざっくりと言って、ソースコード内に記述されているのが明示情報、ソースコード内に記述されていないのが暗示情報になる。

明示情報に近ければ近いほど検索、発見が容易である。

## 情報量の総和

コードリーディングにおいて（良いコードということでコールドリーディングの文脈に移らせていただく）の情報量は明示的情報と暗示的情報の和である。

これを総和情報量と定義する。

総和情報量　＝　明示情報量　×　明示情報係数　＋　暗示情報量　×　暗示情報係数

ここで、暗示情報のほうが検索難易度が高いため、

明示情報係数　＜　暗示情報係数

となる。

余談：意図をコメントしろというのは、暗示情報を明示情報にしろということである。そうすれば、暗示情報係数が明示情報係数になるので、総和情報量が少なくなる。

### 各種情報についてより詳しく（飛ばして構わない）

また、明示情報係数、暗示情報係数はそれぞれの情報特性により上下する。（例えば、明示情報でも検索容易性が低いのであれば明示情報係数は高くなる）
明示情報にも、非文脈情報、文脈情報などの種類があり、各種検索難易度が違う。情報係数はそれぞれの検索難易度に比例する。


## 具体的に見ていく

### 関数の目的の明示化（暗示から明示の例）

```php
Class Human {
    public function x(){
        print('Hello!');
    }
}
```

これはxが何をしているかが不明である。
おそらく挨拶をするための関数であることが推測できるが、目的が暗示化されているために情報量が上がっている
ここで、関数の目的を明示化する。

```php
Class Human {
    public function greet(){
        print('Hello!');
    }
}
```

総和情報量↓　＝　明示情報量↑　×　明示情報係数　＋　暗示情報量↓　×　暗示情報係数

関数の目的を明示化し、総和情報量を減らした。

### 長い関数名を完結にする（明示情報量の削減）

```php
Class Human{
    private string $name;
    public function getNameOfThisObject(){
        return $this->name;
    }
}
```

↓

```php
Class Human{
    private string $name;
    public function getName(){
        return $this->name;
    }
}
```

総和情報量↓　＝　明示情報量↓　×　明示情報係数　＋　暗示情報量　×　暗示情報係数

明示情報量が減ったので、総和情報量が減っている。

また、今回の例では、「getから始まる関数名はゲッターである」という暗示情報が必要だが、既にエンジニアに共有されている前提であるため、暗示情報係数が０に限りなく近くなるため、暗示情報を増加させたけれども総和情報量が減っているという珍しい例になる。

### ビジネスロジックの複雑さの軽減（暗示情報の削減）

人の顔を老人にするサービスの開発に携わっているとする。
このサービスでは、老化パラメータというものがあり、細かく指定できる。
・年齢
・シワの数
・たるみ
・性別
・シミ
・ほくろ
・身長
・体重
・まぶたの下がり具合

これを暗示情報量を減らすために思いっきり削減する。

老化パラメータ
・年齢

総和情報量↓　＝　明示情報量　×　明示情報係数　＋　暗示情報量↓　×　暗示情報係数


## おわりに

本当はもっと色々な原則について書きたかったのですが、疲れたので。
今回の例では「情報量」「暗示情報」「明示情報」と定義しましたが、本当は検索難易度によって定義したい。ただ、そうすると分類が複雑になってしまって「お前ら俺の大統一理論についてこれるか」状態になりそうなのでやめました。（いや、そっちのがわかりやすいのかもしれない）

あと、これに近い理論の提唱者の方とか知ってれば教えて下さい。大体設計原則とかに関して書かれた書籍しか知らないので抽象度のレイヤーがこの記事と同じぐらいのを読んでみたいです。

あとあと、批判コメント歓迎です。というか自分でもこの記事は全然改善点があると思っている（ので記事を書いています）のでバシバシお願いします。
DEV,OV,EV証明書の違いについて

# はじめに
SSL証明書の3種類についてまとめました。

# ドメイン認証(DV)
ドメイン名が正しいかどうかを証明
会社名の証明は行われないため、会社の公式ホームページなどにはふさわしくない。
# 実在証明型(OV)
ドメインに加えて会社名も証明
URLの鍵マークから会社の所在地や会社名を表示されるようになります。
基本的にOV証明書でことたりる。GoogleもOV証明書を利用。
# 実在証明拡張型(EV)
OVよりも厳格な審査を受けてから発行されドメイン名と会社名が証明
EV証明書の特徴だった会社名が緑色に表示されるのはChrome 77以降は廃止されたようで、
現在のchromeだとURLの鍵マークをクリックすると会社名が表示されます。
ただInternet explorerだけは今でもEV証明書は緑色で表示されています。
AVTOKYO 2021 はんだごてを売ってみよう

「Hack に使える T12 ステーションはんだごてオリジナルキットを組み立てよう」
https://qiita.com/nanbuwks/items/bd594a1acf8ab1d90b60


で作ったオリジナルキットを売ってみよう！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/b7d41f5f-d0e5-3bb6-dce5-faed78759042.png)


自分で作った電子工作を売るにはどうしたらいいかな？


# AVTOKYO 

今回、AVTOKYO というイベント連動で販売することにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/f3d513d3-1c30-0901-e85a-b344c7fba34a.png)
ロゴなどを入れたバージョンを作成しました。

# 作戦

大元は、
「はんだごてを Hack - ステーション型はんだごてキットを組み立てよう」
https://qiita.com/nanbuwks/items/3101d1a04554ba0b6dcc

の格安T12ステーションはんだごてです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/5269b50c-6fbc-7acc-5b41-da8496780cde.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/91ebc340-42b6-1126-af80-47999aa8ec8f.png)

中国国内で130元、日本円で2235円。

これを元にしたら、安くいい製品が作れるのではないかな？？

# 改造

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/6b3144f8-e6ec-bb89-cba2-2433e8a37ebe.png)

- コテ先を3本セットに変更
- T12-K に加え、T12-KU , T12-BC2 をセット
- 制御基板を STM32 互換マイコンボードに変更
- ディスプレイ表示を 1.3" OLED に変更
- はんだごてハンドル、ステーションベゼルをオリジナルデザインに変更
- AC ケーブルを日本仕様アース付に変更
- コンセント 3穴→2穴 変換アダプタを添付
- はんだごて台をセットに追加

このうち、以下について


- 制御基板を STM32 互換マイコンボードに変更
- ディスプレイ表示を 1.3" OLED に変更


はそれに合わせたセットを選択、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/b9cd1f88-8908-60a8-fe04-f1f0d2d1d66e.png)

152.19元、2714円となりました。

次に、以下の変更点

- AC ケーブルを日本仕様アース付に変更
- ステーションベゼルをオリジナルデザインに変更

については、数量をまとめて購入することで、無償でアレンジしてもらいました。


- はんだごてハンドルをオリジナルデザインに変更


これは販売元での対応が無理だったので、深センで中継するときにハンドルだけ取り出して彫刻しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/27868abb-82a7-267e-373d-95566ec91f9f.png)

彫刻費用 20pcsで80元 + 中国国内輸送費用 30元ぐらい？
日本円で 1 本あたり 合計 100 円ぐらいかな。

- コテ先を3本セットに変更
 -  T12-K に加え、T12-KU , T12-BC2 をセット
- はんだごて台をセットに追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/c41d1575-0e4c-e236-44d6-27886b36d4b5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/9f87619d-d992-8ff2-6500-21f8dc3a78de.png)

T12-KU 追加 13.9元 T12-BC2追加  13.9元 こて台追加 8元
合計 35.8 元 610 円ぐらい


- コンセント 3穴→2穴 変換アダプタを添付

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/be29818e-3314-8143-bccc-0c82c344b7ba.png)

オマケでつけるようにします。

さて、いくらになったかな？？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165002/9283a137-1849-683f-3e92-cf751a498068.png)

#原価計算

- 3300円 はんだごてセット187.99元
-  80 円 彫刻費用
- 150 円 3P→2P変換アダプタ
- 500 円 日本への送料
- 300 円 現地作業費用
- 4763 円 小計4330+TAX 433


定価は4763円の3倍としたら14289円。高くなっちゃったなあ。
https://akizukidenshi.com/catalog/g/gT-05660/
これ(8500円)よりは安くしたいぞ。 



通常売価を9800円とかにして、AVTOKYO特価で8499円とかかなw
[ Python ] クラス変数とインスタンス変数



`class`をpythonで宣言する際に、クラス内変数を宣言することがあります。
特にクラス内で値を追加したり削除したりするリストを使いたい場面がよくあります。
クラス内変数の宣言方法や「クラス内変数」という呼び方が実は曖昧な呼び方であったことを知ったので備忘録としてまとめていきます。

[以下は、公式ドキュメントから引用しています。](https://docs.python.org/ja/3/tutorial/classes.html)

- 一般的に、**インスタンス変数**はそれぞれのインスタンスについて固有のデータのためのもので、**クラス変数**はそのクラスのすべてのインスタンスによって共有される属性やメソッドのためのものです:

    

```python
class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind                  # shared by all dogs
'canine'
>>> e.kind                  # shared by all dogs
'canine'
>>> d.name                  # unique to d
'Fido'
>>> e.name                  # unique to e
'Buddy'
```

同じクラス内で使う変数でも「クラス変数」と「インスタンス変数」が区別されています。

- クラス変数：全てのインスタンスによって共有される属性。
- インスタンス変数：１つのインスタンス固有の属性。

すなわち、**コンストラクタ以下で宣言する変数**と

`class ***`

以下で宣言する変数が**異なる**ということです。
特にクラス変数で宣言してしまうと、**全てのインスタンス（ここ大事）で変数が共有**されているので、リストや辞書などの値を追加・保持する系のオブジェクトを使用する際には特に注意が必要です。

公式ドキュメントでは、以下のソースコードのようにクラス変数としてlist型objectを宣言すべきでないとしています。

```python
class Dog:

    tricks = []             # mistaken use of a class variable

    def __init__(self, name):
        self.name = name

    def add_trick(self, trick):
        self.tricks.append(trick)

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks                # unexpectedly shared by all dogs
['roll over', 'play dead']
```
上記の例では、クラス変数として宣言したlist型変数`tricks`について、2つの異なるインスタンス`d`と`e`に`add_trick`された値が2つのインスタンス`d`と`e`で共有されていることわかります。
すなわち、クラス変数は、インスタンスが異なっても変数を共有します。
予期しない動作を防ぐためにも、**list型などmutableなオブジェクトはインスタンス変数**で使用しましょう。
開発効率を上げるコミットメッセージ、プルリクを書こう！

#コミットとプルリクに書くこと決まってる？
開発をするのに避けて通れないのが、コミットとプルリク（マジリク）です。

新人であってもベテランであってもしないといけませんが、どんな書き方をするか決まっていますか？

個人個人で書くことがバラバラだったり、必要な情報が入っていないと書き手にもレビュワーにも負担がかかってきます。

書き手が意図していることがレビュワーにしっかり伝わること
また、レビューをしやすくするようなものにできると開発もスムーズに進むと思います。

一つ使えそうなお作法をまとめたので、良さそうだと思ったらプロジェクトに導入することをぜひ検討してみてください！


#コミットメッセージにプレフィックスを

####プレフィックスを先頭につけよう！

プレフィックスを見れば、一目でどんな種類の修正かが分かるし、統一感がでます！


add: 新規機能の追加
ref: 機能の修正
del: 機能の削除
fix: バグ修正

![スクリーンショット 2021-10-23 13.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933058/29d2e943-5515-96fa-940a-72cfc948272e.png)



#プルリクに書くこと
コミットメッセージには書ききれなかったことや詳細を記載しましょう！
![スクリーンショット 2021-10-23 13.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933058/9c1c0a55-0545-84ca-5168-24a45b4a56e6.png)

よくあるのは実装の概要を記載することかなと思います。

それ以外だと
[レビューコメントにラベルをつけるだけで開発効率があがって幸せになれそうな話](https://qiita.com/godgarden/items/3ea57a7ee6dbff1df6e6)
からの引用ですが、下記を記載しても良さそうです。

>本文には以下のようなことをMarkdownの見出しにして書くと便利です。

>・目的
>・達成条件
>・実装の概要
>・レビューして欲しいところ
>ここはこうしたけどこの点で問題はないだろうか
>このあたりいじってるけど特に悪いことはないか
>・不安に思っていること
>何をレビューしてほしいかを書こう
>設計や企画のレビュー
>・保留してること
>このプルリクでしないこと
>レビューの範囲を絞れる
>・スケジュール
>マージすべき日、リリースすべき日の指定があれば書く
>・関連
>関係するプルリクエスト

#まとめ
コミットメッセージにプレフィックスをつけるだけでもかなり効果があると思います。

ここで紹介した以外のプレフィックスをオリジナルで作って使ってもいいですし、プロジェクトを進めるのに最適なやり方を見つけてもらえればと思います。

他にいいやり方があればコメントもらえると嬉しいです！


#おまけ：レビュワーが書くといいコメント
指摘をするときにもプレフィックスをつけると分かりやすい！

[MUST] 必ず対応してほしい！
[IMO] 自分の意見や提案・好み。 自分ならこう書くけどどうかな？
[NITS] 些細な指摘。 ほんの小さな指摘だけど出来れば直してほしい。インデントやタイポ
[ASK] 質問,確認。 コードの意味や背景が分からないから教えて！こういう理解でOK?

[例]　[MUST]変数dataにはnullかどうかチェックを入れて欲しい！


##参考URL
・[Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)
・[レビューコメントにラベルをつけるだけで開発効率があがって幸せになれそうな話](https://qiita.com/godgarden/items/3ea57a7ee6dbff1df6e6)
PythonでLTSpiceのパラメトリック解析(.step)結果をグラフ化する

この記事の応用編。.step param list ～でパラメトリック解析結果が見にくいとお嘆きのアナタ向けの記事。パラメトリック解析結果をグラフィカルかつ直感的に見る方法。

https://qiita.com/mamekan/items/d3ae708a9cda4bafeb70

サンプルはこれ。.step param を使って抵抗値を６種類変えたときのCR LPF AC解析。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527090/d866562e-526e-eb08-89ba-eec6bc4f61f7.png)

LTSpice上でグラフ化するとこうなる。グラフ概形を見るだけなら良いんだけどグラフ上で４番目のパラメータ時のグラフにカーソル当てたいとか言い出すと直感的に操作できなくて大変面倒。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527090/5d835e93-af46-0cad-3499-fa6efc5dfed8.png)

で、先日の記事の発展形。パラメトリック解析結果をグラフィカルに表示させるためのコードがこれ。先日のコードから微妙に使用しているメソッドが変わっているのは、DeprecationWarningのワーニングがうっとおしくなったから。ついでに過渡解析への使い回しが効きそうなget_x()で周波数の情報を取るようにした。


```python:parametric-graph.py
import ltspice
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np
from plotly.subplots import make_subplots

filepath = 'Draft2.raw'
l = ltspice.Ltspice(filepath)
l.parse()

# DataFrame変換元ひな形の辞書初期化
data={
      'case':[],
      'freq':[],
      'Gain':[],
      'Phase':[]
      }

# ループでパラメトリック解析結果を仕分けできるように読み込み
for i in range(l.case_count):
  curx = l.get_x(i)
  curi = [i] * len(curx)

  V1 = l.get_data('V(out)',i)

  curGain = 20*np.log10(abs(V1))
  curPhase = 180/np.pi*np.angle(V1)

  data['case'].extend(curi)
  data['freq'].extend(curx)
  data['Gain'].extend(curGain)
  data['Phase'].extend(curPhase)

# DataFrameに変換
df = pd.DataFrame(data)
print(df)

# グラフ表示部 colorオプションでパラメトリック解析結果を色分け
fig_g = px.line(data_frame=df,x='freq',y='Gain',
              title = 'AC analysis bode plot Gain',
              color='case',
              log_x=True, log_y=False)
fig_g.show()
fig_p = px.line(data_frame=df,x='freq',y='Phase',
              title = 'AC analysis bode plot Phase',
              color='case',
              log_x=True, log_y=False)
fig_p.show()

```
グラフ化したJupyter Lab上の実行結果がこちら。パラメトリック解析結果はget_x(case),get_data(case)で個別に取得できるのでDataFrame化しやすいようにcase列を付与する加工をし、plotly expressでcolor='case'で色変え表示させている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527090/890bec08-9a5f-6b50-0871-9f7cd3c21ab5.png)

LTSpice上で直感的に出来なかったPhaseの４番目のパラメータ時のsim結果にカーソルが当たっているのがおわかりいただけるだろうか？

さらに言うとこんなこともできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527090/adf1b21e-b05d-629a-f5cc-2fe098ed8136.png)

右側の凡例表示部をクリックすることで、表示させたくない奴だけを選択して非表示にできる。

今日はここまで。
【MUI】コピペで使える：ログインページ

webアプリを作り始めました。ログインページを作ったので共有します。
詳細な書き方等は手が空いたときに追記します。

```ts
import {
  Avatar,
  Box,
  Button,
  Checkbox,
  FormControlLabel,
  Grid,
  Link,
  Paper,
  Stack,
  TextField,
  Typography
} from "@mui/material";
import LockOutlinedIcon from "@mui/icons-material/LockOutlined";
import { teal } from "@mui/material/colors";
export const Login = () => {
  return (
    <Grid>
      <Paper
        elevation={3}
        sx={{
          p: 4,
          height: "70vh",
          width: "280px",
          m: "20px auto"
        }}
      >
        <Grid
          container
          direction="column"
          justifyContent="flex-start" //多分、デフォルトflex-startなので省略できる。
          alignItems="center"
        >
          <Avatar sx={{ bgcolor: teal[400] }}>
            <LockOutlinedIcon />
          </Avatar>
          <Typography variant={"h5"} sx={{ m: "30px" }}>
            Sign In
          </Typography>
        </Grid>
        <TextField label="Username" variant="standard" fullWidth required />
        <TextField
          type="password"
          label="Password"
          variant="standard"
          fullWidth
          required
        />
        {/* ラベルとチェックボックス */}
        <FormControlLabel
          labelPlacement="end"
          label="パスワードを忘れました"
          control={<Checkbox name="checkboxA" size="small" color="primary" />}
        />
        <Box mt={3}>
          <Button type="submit" color="primary" variant="contained" fullWidth>
            サインイン
          </Button>

          <Typography variant="caption">
            <Link href="#">パスワードを忘れましたか？</Link>
          </Typography>
          <Typography variant="caption" display="block">
            アカウントを持っていますか？
            <Link href="#">アカウントを作成</Link>
          </Typography>
        </Box>
      </Paper>
    </Grid>
  );
};
```

## イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669821/acca9c95-d717-d347-ae24-96d674ee79d6.png)
Databricksで機械学習を始めてみる

[Get started with machine learning in Databricks \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/train-model/ml-quickstart.html) [2021/6/24時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

このノートブックでは、Databricksにおける機械学習モデルトレーニングの概要を説明します。モデルをトレーニングするには、Databricks機械学習ランタイムにプレインストールされているscikit-learnのようなライブラリを利用することできます。加えて、トレーニングしたモデルをトラッキングするために[MLflow](https://qiita.com/taka_yayoi/items/1a4e82f7e20c56ba4f72)を利用したり、ハイパーパラメーターチューニングをスケールさせるために、[Hyperopt](https://docs.databricks.com/applications/machine-learning/automl-hyperparam-tuning/index.html#hyperparameter-tuning-with-hyperopt)とSparkTrialsを活用することができます。

このチュートリアルでは、モデル開発をトラッキングするためにMLflowを用い、モデルのパフォーマンスを改善するためにHyperoptを用いて、シンプルな分類モデルをトレーニングします。モデルのライフサイクル管理やモデルの推論などDatabricksにおける機械学習の本格運用に関しては、[エンドツーエンドのサンプル](https://qiita.com/taka_yayoi/items/f48ccd35e0452611d81b)をご覧ください。

Databricksにおけるクイックスタートの他のサンプルノートブックについては、[Databricksにおける機械学習の10分チュートリアル](https://qiita.com/taka_yayoi/items/24d240adabb63291643e)をご覧ください。

# 要件

Databricks機械学習ランタイム7.5以降が必要となります。

# サンプルノートブック

https://github.com/taka-yayoi/public_repo/tree/main/spark_ml_tutorial

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
プログラミングスクールで意識する事

#はじめに
私はプログラミングスクールに2回通っています。
1回目はテックアカデミーさんのAndroidアプリコース（2ヶ月)、2回目（現在）は地元の産業支援センターとテックアカデミーさんが開催している4ヶ月の長期コースに参加します。

今回は、1回目のスクールで意識してかなり成長したなと思った事を書きます。

#プログラミングスクールに参加した理由
参加した理由としては、2021年10月半ばまで、海外でインターン（NGOとIT企業）をしていたのですが、
NGO（日本語学校）の方で、どこでも学べる日本語アプリを作成する必要がありました。
アンドロイドのアプリを作成する手段はいくらでもありましたが、いい機会だと思い自作する事を決意しました。
ですので、勉強する手段として独学でできる自信がなかったので、プログラミングスクールに通うことを決めました。

#プログラミングスクールに参加する目的
目的としては、NGOのためにアプリを作成する事ももちろんそうですが、スクールでは「自走できるようになる事」としました。


#意識したこと
意識したことは、「メンターの方に指摘された事をストックする」です。例えば、〇〇のソースコードも一緒に送ってください
やこういう風に調べてみてください。などの様な事をストックしていき、自分で言われた事を参考に調べていき、問題を解決できる様に心がけていました。
大事な事は、プログラミング言語の知識をストックする事ではなく、問題の解き方や考え方など、どこを参考にするといいのかなどを考えるといいと思いました。
[AWS]SAMテンプレートの記述をサポートするVSCode拡張機能を作成した

# 成果物
![使い方のgif](https://storage.googleapis.com/zenn-user-upload/893d87f42267ec05ccd0d557.gif)
github：https://github.com/engineer-taro/aws-sam-snippets-VSCode
VSCode：https://marketplace.visualstudio.com/items?itemName=engineer-taro.aws-sam-snippets

# 前提
## SAMのtemplate.yamlを書くのが大変
AWS SAMを利用してデプロイしているのですが、SAMのテンプレートを書くとき、毎回過去に使っていたテンプレートを参考にしながら書くか、公式ドキュメントを参考に書くか、非効率な方法を取っていました。
これを機に、どうせならVSCodeの拡張機能を作ってみるか、と思い立った次第です。

## SAMテンプレートを書くときどうしているか聞いてみた
ひとまず、他の方にSAMテンプレートの記述の効率化について聞いてみたところ、以下の様でした。

- CloudFormationの拡張機能を入れる
- 良く使うテンプレートを保管しておく

やはり、他の方もSAMのテンプレートを書く際に効率化できているとは言いづらい状況でした。
私もVSCodeでSAMテンプレートの入力を補助してくれるような拡張機能を探してみたのですが、実用性の高いものは見つかりませんでした。
そういうわけで、VSCodeの拡張機能を作ってみることにしました。

# 作成した拡張機能
![AWS SAM Template Snippets](https://storage.googleapis.com/zenn-user-upload/5e45e7d3dff85530dd582b08.png)

SAM独自の記述方法のみのサポートを目的としており、CloudFormationの記述方法はサポートしていません。
CloudFormationの補完は素晴らしい拡張機能がいくつもあるので、CloudFormationの拡張機能を入れた上で今回私が作成したものを入れてもらうことを前提としています。
なので、`sam-`と入力されたときにサジェストを出すようにしました。

## AWS SAM Template Snippets
SAMテンプレート記述の補助を出来る拡張機能を作っています。
最初は最低限の機能でリリースしてみたかったので、現在は`Type: AWS::Serverless::Api`のようなType属性の値のみ入力補助ができる状態です。
`sam-`と入力してサジェストを出すと、補完が効くようになっています。
![使い方のgif](https://storage.googleapis.com/zenn-user-upload/893d87f42267ec05ccd0d557.gif)

## 今後のリリース
忙しくないときに合間を縫って、少しずつ補完を充実させていければと思っています。
まだまだ拡張機能を出すときのお作法等含めて拙い部分はあると思いますが、自分に出来る限りで進めていきます。
READMEの方にも記載していますが、今回の初めのリリースをPhase1として、以下のように進めていこうと思っています。

- Phase1では`Type: `の属性を入力補完し、利用できるプロパティも補完するようにする
- Phase2では`Events: `のような良く使うプロパティの入力補助ができるようする
- Phase3では`CorsConfiguration`のようなあまり使わないプロパティの入力補助をできるようにする
- Phase4以降 未定だが徐々に出来ることを増やしていく

仕事では無いので、ゆるく続けていこうと思ってます。

# 拡張機能をマーケットプレイスに登録するまで
## 拡張機能の作り方
「VSCode 拡張機能 自作」などのキーワードで調べて出てきたサイトを参考に作りました。
こちらは特に難しいことなく、スムーズにいきました。
大きな流れは以下の通りです。詳しくは他サイトを参考にしてください。

1. Node.jsのインストール（既に入っていたのでスキップしました）
2. `npm install -g yo generator-code`で拡張機能開発に必要なソフトウェアをインストール
3. `yo code`を実行すると、作りたい拡張機能について質問されるので、答えていくとひな形が作成される


## 拡張機能をマーケットプレイスに登録
VSCodeの拡張機能を公開しているような日本語の情報は少なかったです。
結果、こちらの公式ドキュメント通りにやっていけば大丈夫でしたが、英語なのでいくつか見落としがあり、少し手こずりました。
https://code.visualstudio.com/api/working-with-extensions/publishing-extension

大きな流れは以下になりますが、基本は公式ドキュメントを参考にすれば大丈夫です。

1. `npm install -g vsce`で必要なソフトウェアをインストール
2. `yo code`で出来たひな形のpackage.jsonを変更する。こちらは他の拡張機能のgithubリポジトリを参考に作成しました。
3. [Azure DevOps](https://azure.microsoft.com/ja-jp/services/devops/)に登録し、Personal Access Tokenを発行する
4. Publisherを[Azure DevOpsのコンソール](https://marketplace.visualstudio.com/manage)から作成する
5. Publisherを指定して公開する

# 感想
Pythonを使っている際に、有志の方が作成したライブラリに助けられることがよくあります。特にAWS関連の実装では助けられることが何回もありました。
私も役に立つライブラリを作ってみたいと思っているのですが、なかなかライブラリを実装するような機会がありませんでした。
そこで、いつも時間がかかってしまっているSAMテンプレートの補助機能があれば役に立つのではと思い、今回はとりあえず拡張機能のリリースをしてみました。
独自ライブラリを作成するほど難易度が高くなく、とりあえず最小限でスタートできたので、完成度はともかく成功かなと思います。

いつも見ていたマーケットプレイスに、自分の拡張機能が出てくるのは嬉しいです。
今は本当に最小の補完しかしないので、これから徐々に補完できるものを増やしていき、使われるものにしていきたいです。
ラムダ式の基礎


## ラムダ式とは
C#3.0で導入されたデリゲート（delegate）や、メソッド・ベースのLINQ文を簡単に記述するためのもの。

(参考：デリゲートについて)
[デリゲート再入門][link-1]
[link-1]:https://atmarkit.itmedia.co.jp/fdotnet/onepoint/onepoint03/onepoint03_01.html

今ではだいぶ浸透してきていると思いますが、
初めて見た時は正直わけがわからなかったです（笑）
以下はラムダ式の冗長な書き方から始めて、
最も簡潔な書き方に変更していく様子です。

###①STEP0(冗長なコード)
judge変数の右辺がラムダ式と呼ばれているもの。
(ラムダ式は一種のメソッド)
C#2.0の時のdelegateの代わりに =>(ラムダ演算子)
が使われています。
=>の左側が引数宣言している箇所。
こちらでは式が<font color="red">judge変数に代入されるだけで{}内の処理が実行されるわけではありません。</font>

```ruby

            Predicate<int> judge = (int n) =>
            {
                if (n % 2 == 0)
                    return true;
                else
                    return false;
            };

            var count = Count(numbers,judge);
```

###②STEP1
変数judgeは、代入後すぐにCountの引数に渡してしまうため、<font color="red">judge変数をCountの引数に</font>します。

```ruby

            var count = Count(numbers,
                (int n) => {
                    if (n % 2 == 0)
                        return true;
                    else
                        return false;
                }
                );
```
###③STEP2
次の2点から、if文をなくすことができます。

1.returnの<font color="red">右側には、式を書くことができる。</font>
2."n % 2 == 0"は式であり、<font color="red">boolean型の値</font>を持つ。


```ruby
var count = Count(numbers, (int n) => { return n % 2 == 0; });
```
###④STEP3
式の{}の中が1つの場合は<font color="red">{}とreturnを省略</font>できる。


```ruby
var count = Count(numbers, (int n) => n % 2 == 0);
```
###⑤STEP4
ラムダ式では<font color="red">引数の型を省略</font>できます。
(コンパイラが型を正しく推論してくれるため)

```ruby
var count = Count(numbers, (n) => n % 2 == 0);
```
###⑥STEP5
<font color="red">引数が1つの場合、()を省略</font>することができます。

```ruby
var count = Count(numbers, n => n % 2 == 0);
```

よく見かけるラムダ式の形になりました。

## ラムダ式を使った例
ラムダ式は<font color="red">「どうやるか(HOW)」</font>ではなく、<font color="red">「何をやるか(WHAT)」</font>の視点で、コードを書けるようになりました。

・奇数の数をカウントする。

```ruby
var count = Count(numbers, n => n % 2 == 1);
```

・5以上の数をカウントする。

```ruby
var count = Count(numbers, n => n >= 5);
```

・数字の1が含まれている数をカウントする。

```ruby
var count = Count(numbers, n => n.ToString().Contains('1'));
```

##### 参考文献
###### この記事は以下の書籍を参考にして執筆しました。
実戦で役立つ
C#プログラミングのイディオム/定石＆パターン
いにしえのScalaライブラリで遊ぶ

こんにちは。Scala 楽しいですよね。こんなに Scala が楽しいのは、楽しくするために発展していった歴史があった訳ですが、残念ながらその歴史の中には今では埋もれてしまったものたちもいます。この記事では sbt を使って、古い Scala バージョンのライブラリを遊んでみたいと思います。なんで sbt かはこちら。

https://qiita.com/kijuky/items/6e95db63689083de9e55

# 考古学班、出番です！

いくら古くても、GitHub にソースコードがあって、README.md に環境構築方法が書いてあるのなら、それに従うといいと思います。今回は Maven Repository に pom/jar があって、利用すべき Scala バージョンがわかる、と言う想定にします。

例えば、これとか。Maven Central には、掘っていくとたくさんのライブラリが置いてあって楽しいですね :skull: 

https://mvnrepository.com/artifact/com.m3/m3util

ソースコード（GitHub）へのリンクもありましたが、閲覧権限がありませんでした。どうやって環境構築すればいいかわかりませんね。これを sbt を使って遊んでみます。

もし、対象とする Scala のバージョンと sbt のバージョンが揃っていれば、sbt 内部でそれを使うことができます。明示的なコンパイルが必要なくなるので、お試しするならまずはこれが便利です。ただし、全ての Scala バージョンが使えるわけではないので注意です（というか、この記事はこの表を書きたくて書いた）。

| Scala のバージョン | sbt のバージョン | 備考 |
|:-:|:-:|:-:|
| ~2.9 | NG | 先史時代 |
| 2.10 | 0.13.18 |   |
| 2.11 | NG |   |
| 2.12 | 1.5.5 |   |
| 2.13 | NG |   |

どこまで遡れるかな？と思って書いたけど、そもそも sbt が 0.13 以上じゃないと動かないっぽいから、 2.10, 2.12 以外なら素直にプロジェクト作った方がいいのかな...

気を取り直して、先のライブラリは 2.9, 2.10, 2.11 まで対応していたので、sbt 上で遊べます。ヤッタネ！

```project/build.properties
sbt.version=0.13.18
```

```project/plugins.sbt
libraryDependencies += "com.m3" %% "m3util" % "1.0.2"
```

この状態で IntelliJ を開くと sbt が依存しているライブラリが見れます（通常と違って jar ファイル名でソートされてるので探しづらいですが...）。型である程度想像できますが、Java にデコンパイルすれば気合い :muscle:  で読めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59468/e123d54b-37de-48dd-6702-b134a0e13048.png)

文字列型から Option[Int] にしてますね。 parseInt の結果を Try ではなく Option で扱うためのライブラリでしょうか。さくっと build.sbt で動作確認してみましょう。

```build.sbt
lazy val t = taskKey[Unit]("")
t := Def.task {

  import com.m3.util._
  println(s"0 -> ${AsInt.unapply("0")}")
  println(s"+1 -> ${AsInt.unapply("+1")}")
  println(s"-1 -> ${AsInt.unapply("-1")}")
  println(s"1,000 -> ${AsInt.unapply("1,000")}")
  println(s"0.001 -> ${AsInt.unapply("0.001")}")
  println(s"${Int.MaxValue} -> ${AsInt.unapply(s"${Int.MaxValue}")}")
  println(s"${Long.MaxValue} -> ${AsInt.unapply(s"${Long.MaxValue}")}")
  println(s"a -> ${AsInt.unapply("a")}")
  println(s"0xa -> ${AsInt.unapply("0xa")}")
  println(s"z -> ${AsInt.unapply("z")}")

}.value
```

```
[IJ]> t
0 -> Some(0)
+1 -> Some(1)
-1 -> Some(-1)
1,000 -> None
0.001 -> None
2147483647 -> Some(2147483647)
9223372036854775807 -> None
a -> None
0xa -> None
z -> None
[success] Total time: 0 s, completed 2021/10/23 12:36:23
```

いい感じですね。16進数は扱えないようです。

# まとめ

こんな感じで、Scala 2.10, 2.12 であれば、 sbt から直接実行が確認できるため、昔のライブラリのちょっとした挙動を確認したい場合に便利かもしれません。ちなみに Java ライブラリであれば言語バージョンによる制限はないので、sbt 1.5.5 で遊べます。ただし、JVM 9 以上だとジグソーの影響で Runtime 依存を増やす必要があるかもしれません。それも面倒なら JVM のバージョンは 1.8 で試すと良いかもしれません。

インターネットの技術は日々進化していますが、温故知新とも言いますし、昔のライブラリで遊んでみるのもいかがでしょうか（頑張って綺麗にまとめてみた）。
GithubへのSSH接続手順



# 鍵の作成

`~/.ssh` に移動し、鍵を作成。

```
% cd ~/.ssh
% ssh-keygen -t rsa
...
（色々と表示される。入力を求められたら`Enter`で今回は全てok。）
% ls
id_rsa   id_rsa.pub
```

この場合、`id_rsa`が秘密鍵で `id_rsa.pub`が公開鍵。
`ssh-keygen -t rsa` を実行すると何やらいくつか確認されるが、今回は全部`Enter`で受け流す。（というかこれを入力することで何が変わるのか理解していない。。。）
`ssh-keygen`にオプションで`-f ファイル名`とすると、任意のファイル名をつけられる。
例えば`ssh_keygen -t rsa -f id_rsa_github`とすると、`id_rsa_github`と`id_rsa_github.pub`が生成される。
いくつも鍵が`~/.ssh`配下にあるならば、名前をつけるべき。
ちなみに`keygen`は`key + generator`の混成語。


# Githubへの公開鍵の設置

公開鍵`id_rsa.pub`の中身を出力して、コピーする。(秘密鍵`id_rsa`をコピーしないように注意。)

```
% cat id_rsa.pub 
ssh-rsa ....（ランダムな文字列）
# `ssh-rsa` の部分から全てコピー。
```

Githubをブラウザで開き、`Setting`をクリック。

![スクリーンショット 2021-10-23 12.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/937972/5162ccc9-2282-8f27-1a81-8b610b113306.png)


`SSH and GPG keys`を選択し、`New SSH key`をクリック。

![スクリーンショット 2021-10-23 12.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/937972/0388f355-a456-a0aa-4058-aaf8c2095b13.png)


`Title`は任意。`Key`に先ほどコピーした公開鍵の文字列をペースト。`add SSH key`をクリック。

![スクリーンショット 2021-10-23 12.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/937972/823c1e79-439b-f9c6-45ce-eca88122c1ea.png)


これでGithub上に公開鍵が設置された。


# ~/.ssh/configの編集(もしくは新規作成)

ターミナルに戻り、`~/.ssh/config`を設定する。
今回は`vi`を使って編集。
`vi ~/.ssh/config`とすれば、ファイルが元々存在しない場合でも、新たに作成された上で編集作業ができる。

```
% vi ~/.ssh/config
```

以下を入力。

```
Host github.com
        IdentityFile ~/.ssh/id_rsa   # 秘密鍵のパス
        User git
```

接続を確認する。

```
% ssh -T git@github.com  # configにて`User git`を設定しているため、`ssh -T github.com` でも可
Hi taip315! You've successfully authenticated, but GitHub does not provide shell access.
```

接続できた。

また、
`You've successfully authenticated, but GitHub does not provide shell access.` とある。
これはシェルアクセスは許可されていないが、SSH接続はできているので特に心配しなくてOK。
kvm仮想マシンイメージファイル置き場にbtrfsはあまり良くない件

少し前に、ubuntuのhomeディレクトリが載るファイルシステムを、snapshot使いたくてbtrfsに変換して使っているのだが、ここにあるwindowsの仮想マシンを久々にKVM起動して使ったら、どうにも遅い。exploreでちょっとファイルを操作する度にグルグルする。仮想マシンに限った話ではなく、ubuntu全体が遅い。調べてみると、hddに対してずっとwriteがかかるような状態で、hddのアクセスに時間がかかっていた。

原因は、btrfsのCopy-On-Write(COW)のせいだったのだが、「chattr +C」でCOWを切ったイメージファイルにコピーしたら、改善はしたものの、どうもまだ遅い感じがした。

で、同じHDDの上にext4のファイルシステムもあるのだが、そこにイメージをコピーしてみたら十分早くなった。

以下、スマホのストップウォッチで測ってるのでそう厳密ではないが、windows7のスタートメニュー内にあるシャットダウンボタンを押してから、仮想マシンが落ちるまでの時間を測ってみた。
それぞれのイメージは、元のCOWが効いたファイルからコピーしたもので、何度か起動/shutdownでwindowsが書き換える部分を除けば同一である。

|イメージファイルの置き場|シャットダウンにかかる時間(分:秒)|
|-|-|
|btrfs noCOW|3:37|
|ext4|0:18|
|btrfs withCOW|8:15|
|再度btrfs noCOW|2:10|
|再度ext4|0:18|

とうわけで、KVMで仮想マシン置くのに、btrfsはあまり良くないという話でした。
scikit-learn バージョン1.0について

## はじめに
2021年9月24日にscikit-learn 1.0がリリースされています。

Version 0.24.2 → Version 1.0 へのアップデートだった為、
さぞ大きな更新があるかと思いましたが、**重大な変更というのはない**ようです。
いくつかの新しい主要機能に加えて、多くの改善とバグ修正が加えられています。

変更点が気になったので纏めようかと思いましたが、
自身が初学者の為、説明すると間違いが頻発しそうなのでリンクだけ纏めてます。

## リリースノートの変更数

[リリースノートの変更ログ](https://scikit-learn.org/dev/whats_new/v1.0.html#version-1-0-0)では以下の様な凡例で修正点が記載されています。
※Chromeの翻訳機能で日本語に翻訳して載せています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177960/95342353-a517-d0ce-0d84-87284dac33d0.png)
Version 1.0でそれぞれ、どのくらいの変更があったのかは以下の通りです。

| 汎用名 | 個数 |
|:-:|:-:|
| 主な機能 | 0 |
| 特徴 | 12 |
| 効率 | 7 |
| 強化 | 17 |
| 修理 | 47 |
| APIの変更 | 21 |
| 合計 | 104 |

## リリースハイライト
[リリースハイライト](https://scikit-learn.org/dev/auto_examples/release_highlights/plot_release_highlights_1_0_0.html#release-highlights-for-scikit-learn-1-0)に追加更新された主な機能について詳しく説明されています。

また、更新内容について紹介して下さっている参考になるサイトです。
ありがとうございます！
[scikit-learn 1.0 リリース！更新内容を一部紹介します。 ](https://future-architect.github.io/articles/20211008a/)
[Scikit-learnのバージョン1.0の変更に関する6分間のガイド](https://ichi.pro/scikit-learn-no-ba-jon-1-no-henko-nikansuru-6-funkan-no-gaido-160216135606129)

その中でも、特徴量の追跡機能に関する簡単なチュートリアルノートブックを作成して下さっている方もいらっしゃいました。

https://twitter.com/aureliengeron/status/1451358280618446872

## Google Colabのscikit-learnのバージョンについて

Google Colabでは、デフォルトで`scikit-learn`がインストールされている為、意識せずに使えますが、現状(2021/10/23時点)では`0.22.2`になります。アップグレードすることで、`1.0`を使用可能です。

```python
!pip install --upgrade scikit-learn
# または
!pip install -q -U scikit-learn >= 1.0.0
```

## 後書き
色々調べていると、バージョン1.2で削除されるものが多そうなので、
そこがライブラリを更新する際に特に注意すべき転換点なるのかなと感じました。
[Python]Google Chrome検索履歴からWordCloudを生成してStreamlitで可視化する方法 メモ


* Google Chromeの検索履歴データからStreamlitを利用し、頻出単語の一覧表とWordCloudを描画する方法についてメモする。



## 事前準備

**ライブラリインストール**

  ```shell
  pip install pandas
  pip install streamlit
  pip install janome
  pip install matplotlib
  pip install wordcloud
  ```

  * pandas:データ整形に使用
  * streamlit:データ可視化に使用
  * janome:形態素解析に使用
  * matplotlib:wordcloud描画に使用
  * wordcloud:WordCloud生成に使用



**Google Chromeの検索履歴データ`History`を取得する。**

  * Windows例

  ```
  C:\Users\XXXXXXXX\AppData\Local\Google\Chrome\User Data\Default\History
  ```

**WordCloud用日本語フォント準備**

  * Windowsの場合：以下のフォルダにあるフォントから使用するものを選択しておく。

    ```
    C:/Windows/Fonts/...
    ```

    



## コード

* `wc.py`
  * 同一階層に`History`を配置する。

```python
import streamlit as st
from janome.tokenizer import Tokenizer
import collections
import pandas as pd
import sqlite3
from contextlib import closing
import matplotlib.pyplot as plt
from wordcloud import WordCloud

history = './History'

# ブラウザ履歴データを検索
def search_history():
    browser_history_text = ''

    with closing(sqlite3.connect(history)) as conn:
        c = conn.cursor()
        statements = "select title LONGVARCHAR from 'urls'"
        results= c.execute(statements)
        for result in results:
            browser_history_text += result[0]
    return browser_history_text 


# ブラウザ履歴データを形態素解析
def analyze_history(history: str):
    t = Tokenizer()

    # 頻出単語を取得
    freq_of_words = collections.Counter(token.base_form for token in t.tokenize(history)
                            if token.part_of_speech.startswith('名詞,固有名詞'))
    return freq_of_words 

# WordCloud生成
def generate_wordcloud(analyze_result: str):
    dic_result = dict(analyze_result)
    # フォントファイル名指定
    wordcloud = WordCloud(background_color='white',
                          font_path='C:/Windows/Fonts/...',
                          width=800, height=600).fit_words(dic_result)
    return wordcloud


if __name__ == "__main__":
    browser_history_text = search_history()
    freq_of_words = analyze_history(browser_history_text)
    wordcloud = generate_wordcloud(freq_of_words)
    st.title('ブラウザ検索履歴 分析')
    
    # Wordcloud描画時の警告を非表示にするため
    st.set_option('deprecation.showPyplotGlobalUse', False)
    
    # WordCloud 表示
    plt.axis("off")
    plt.tight_layout()
    plt.imshow(wordcloud, interpolation='bilinear')
    st.pyplot()

    # 頻出検索単語表 表示
    df = pd.DataFrame(freq_of_words.most_common()[:10], columns=['単語', '回数'])
    st.dataframe(df)

```



## 動作確認

* 起動

```shell
streamlit run wc.py

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://10.4.113.198:8501
```

![wc_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/b5c1e739-17af-cc90-ef82-57ad1dfc5889.png)



## 参考情報

* [How to add WordCloud graph in Streamlit](https://discuss.streamlit.io/t/how-to-add-wordcloud-graph-in-streamlit/818)
【python3】jsonファイルの読み書き

# jsonファイルの読み書き
同じ内容を何度も調べている気がします。
アウトプットしなければ覚えられないという結論に至ったので
jsonファイルの読み書き関数を記事にまとめます。

## コード
```handle_json_file.py
import json
import os

def write_json_file(path, file_name, data):
    """
    辞書データをファイルに書き出す
    
    :param path: 親フォルダのパス
    :param file_name: ファイル名
    :param data: 辞書データ
    """
    file_path_name_with_ext = os.path.join(path, file_name + '.json')
    with open(file_path_name_with_ext, 'w') as fp:
        json.dump(data, fp)

def load_json_file(path, file_name):
    """
    ファイルから辞書データを読み込む
    
    :param path: 親フォルダのパス
    :param file_name: ファイル名
    :return data: 辞書データ
    """
    file_path_name_with_ext = os.path.join(path, file_name + '.json')
    with open(file_path_name_with_ext) as fp:
        data = json.load(fp)
    return data

# Example
data = {}
data['key'] = 'value'

write_json_file('.', 'file-name', data)
data = load_json_file('.', 'file-name')
print(data)
```

## 参考サイト
[PythonでJSONファイル・文字列の読み込み・書き込み](https://note.nkmk.me/python-json-load-dump/)
言語・環境非依存なOSS界隈の規格一覧

# はじめに

言語や環境に依存しないOSS界隈の規格（デファクトスタンダードを含む）のリストです。

ちょいちょい忘れがちなので、備忘録として纏めておきます。

# OSS

* [オープンソースガイドライン | Open Source Guides](https://opensource.guide/ja/)

# 構成管理

構成管理の規格です。

## バージョン管理

構成管理のうち、バージョン管理に関する規格です。
ここで言うバージョン管理とは、git, svnなどのバージョン管理ツールでサポートされる範囲の構成管理のことです。

* 変更履歴
    * [Keep a Changelog](https://keepachangelog.com/ja/1.0.0/)
* コミットメッセージ
    * [Conventional Commits](https://www.conventionalcommits.org/ja/v1.0.0/)
* バージョン番号
    * [セマンティック バージョニング 2.0.0 | Semantic Versioning](https://semver.org/lang/ja/)
    * [Calendar Versioning | CalVer](https://calver.org/)
* バージョン指定(言語毎に方言が存在する)
    * Node.js - [npm/node-semver: The semver parser for node (the one npm uses)](https://github.com/npm/node-semver#versions)
    * Python - [PEP 440 – Version Identification and Dependency Specification | peps.python.org](https://peps.python.org/pep-0440/)

## コンポーネント管理

構成管理のうち、コンポーネント管理に関する規格です。
ここで言うコンポーネント管理とは、個別にバージョン管理されたコンポーネントを組み合わせを管理することです。

* SBOM(Software Bill Of Materials)
    * [SBOM at a Glance](https://www.ntia.gov/files/ntia/publications/sbom_at_a_glance_ja.pdf)
    * [SPDX specifications | ISO/IEC 5962:2021](https://spdx.dev/specifications/)
* OSS管理
    * [OpenChain | ISO/IEC 5230:2020](https://www.openchainproject.org/)
* パッケージ管理
    * [PURL: Package URL Specification](https://github.com/package-url/purl-spec)

## セキュリティ

* 脆弱性の分類
    * CVE
        * [共通脆弱性識別子CVE概説：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/vuln/CVE.html)
* 脆弱性の評価
    * CVSS
        * [共通脆弱性評価システムCVSS v3概説：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/vuln/CVSSv3.html)
    * VEX(Vulnerability-Exploitability eXchange)
        * [VEX one-page summary](https://www.ntia.gov/files/ntia/publications/vex_one-page_summary.pdf)
    * KEV(Known Exploited Vulnerabilities)
        * [悪用される既知の脆弱性](https://nvd.nist.gov/General/News/cisa-exploit-catalog)

# コントリビューション管理

* コントリビューション規約
    * [Contributor Covenant](https://www.contributor-covenant.org/ja/version/2/0/code_of_conduct/)

# ライセンス管理

* ライセンス識別子
    * [SPDX IDs](https://spdx.dev/ids/)
* 著作権
    * [REUSE Specification – Version 3.0](https://reuse.software/spec/)

# 自然言語

* 差別のない言葉(inclusive language)の選び方
    * [Language recommendation lists](https://inclusivenaming.org/word-lists/overview/)
    * [Language evaluation principles and framework](https://inclusivenaming.org/language/evaluation-framework/)

# ファイルフォーマット

* Markdown
    * [CommonMark](https://commonmark.org/)
* YAML
    * [The Official YAML Web Site](https://yaml.org/)
* JSON
    * [RFC7159 The JavaScript Object Notation (JSON) Data Interchange Format
](https://datatracker.ietf.org/doc/html/rfc7159)
    * [JSON Schema](https://json-schema.org/)

# プロトコル

* API
    * [OpenAPI Specification | Swagger](https://swagger.io/specification/)
Dockerコンテナ内のmysqlでタイムゾーンのロードを行う

#Dockerの外からmysql内でコマンドをを実行する

Bash上からDockerコンテナ内のmysqlにコマンドを送りたかったときに四苦八苦しましたので、備忘録として残します。

##環境

Ubuntu 18.04 LTS
Docker 19.03
MYSQLコンテナのMYSQLバージョン　5.7
ホストの/usr/share/zoneinfoがコンテナ内の/usr/share/zoneinfoにバインドされている

##やりたい事

MySQLドキュメント：タイムゾーンのロード　にある以下のコマンドをコンテナ外から実行したい

```bash
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
```

コンテナ形式で提供される海外製のプログラムを組み込む際に、構築をスクリプトにしたかった
手順内でmysqlにタイムゾーンをロードする処理がボトルネックになった
手動で実行すると以下のコマンドに

```bash
sudo docker exec -it {mysqlコンテナ名} bash
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
exit
```

mysql -u root mysql の１番目のmysqlがコマンドで、２番目のmysqlが、mysqlというデータベース名だという事に気づくまでに時間がかかった
出来上がったのが以下。

```bash
sudo docker exec -it {mysqlコンテナ名} sh -c 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p{パスワード} mysql -P 3306'
```

本当はパスワードをスクリプト内に書きたくないので、良い方法をご存じの方、ご教示いただけますと幸いです。


https://dev.mysql.com/doc/refman/5.7/en/mysql-tzinfo-to-sql.html
C++20 自作クラスのイテレータをコルーチンで書いてみる

# はじめに

自作クラスを範囲forにぶちこみたいときに、`begin` `end`を定義したりするわけですが
その時に書くイテレータを直感的に書きたいなと思い

C++20コルーチンを使ってみました。

# 実装

基本的にはgeneratorっぽい実装をイテレータのみに集約した感じです。
※generatorの概念についてはここでは特に触れません。以下などを参考にしてください。
https://qiita.com/yohhoy/items/aeb3c01d02d0f640c067

```cpp:co_iterator.hpp
#pragma once
#include <coroutine>

struct co_iterator_end {};

template<class Type>
struct co_iterator
{
	struct promise_type
	{
		Type value;
		auto get_return_object() { return co_iterator{ handle::from_promise(*this) }; }
		auto  initial_suspend() { return std::suspend_never{}; }
		auto final_suspend() noexcept { return std::suspend_always{}; }
		auto yield_value(const Type& _value)
		{
			this->value = _value;
			return std::suspend_always{};
		}
		void unhandled_exception() { std::terminate(); }
		void return_void() {}
	};

	using handle = std::coroutine_handle<promise_type>;

public:
	explicit co_iterator(handle h)
		: coro(h)
	{}

	co_iterator(const co_iterator&) = delete;

	co_iterator(co_iterator&& rhs) noexcept
		: coro(std::move(rhs.coro))
	{
		rhs.coro = nullptr;
	}

	~co_iterator()
	{
		if (coro) {
			coro.destroy();
		}
	}
	co_iterator& operator++()
	{
		if (!coro.done()) {
			coro.resume();
		}
		return *this;
	}
	decltype(auto) operator*()
	{
		return coro.promise().value;
	}
	bool operator!=(const co_iterator_end&) const
	{
		return !coro.done();
	}
private:
	handle coro;
};
```

# 使い方

```cpp:main.cpp
struct Vector3
{
    int x, y, z;

    co_iterator<int> begin() const
    {
        // コルーチンで書けるとわかりやすい
        co_yield x;
        co_yield y;
        co_yield z;
    }
    co_iterator_end end() const
    {
        return {};
    }
};

int main()
{
    Vector3 vec{1,2,3};
    for(auto&& elm : vec) {
        std::cout << elm << std::endl;
    }
}
```

```:output
1
2
3
```

# まとめ

- C++20コルーチン楽しい
- C++20コルーチン便利
- (generatorでも似たようなことができるよ)
[Dfinity] Stoic Wallet の使い方と仕組み

#####概略
[toniq labs](https://igpeu-waaaa-aaaad-qaava-cai.raw.ic0.app/)が作成した Internet Computerの基軸通貨ICP等を管理・送金するノンカストディアル・アプリケーションWalletです。
現在（2021/10/22）Internet Computerで利用できるwallletはstoic wallet・NNS以外は [Plug](https://plugwallet.ooo/)と[EARTH Wallet](https://www.earthwallet.io/)があります。


#####使い方-新規作成・ログイン
[Stoic wallet](https://www.stoicwallet.com/)のサイトトップにアクセスすると以下の画像と同じスクリーンになります。walletの新規作成&ログインとログインすることが出来ます。順に説明します。

![スクリーンショット 2021-10-23 9.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137730/98f0d05f-e07d-9e7d-262b-e398175e3256.png)

1. `Create a new Wallet` シードフレーズを作成して新規にwalletを作成します。Security Tipsを数回クリックすると１２の英単語が表示されます。これを書き写して安全な場所に保管して、パスワード設定するとログインして利用できます。
1. `import an existing Wallet` は３種類のimportの仕方があります。
    1. `Import using seed phrase`は 1. で作成したシードフレーズからwalletを回復します。
    1. `Import using a PEM file`はPem fileからwalletを回復します。stoic walletにエクスポートする機能が見当たらず、実際に試すことが出来ておりません。もし分かる人がいらしゃっいましたら教えてほしいです。ちなみにPlugのエクスポート機能を使ってみましたが様式が違うようで失敗します。暗号化方式は同じ　Secp256k1　なので期待しましたがダメでした。
    1. `Read only account`　Principal IDを入力すると残高と履歴を見れます。エクスプローラーで検索するのと同じです。
    
1. `Link your Internet Identity` これが一番一般的なログインの仕方です。NNSにIdentity Anchor を持っていればInternet Identityでシードフレーズを発行することなくstoic wallet にアカウントが持てます。Internet Computerを利用するならまずはNNSにAnchorを作成して利用する必要があるので、持っていない方は作成したほうが良いと思います。

1. `Login using a trust 3rd party via tor.us` twitter、facebook、githubにアカウントを持っていればOAuth機能を利用してアカウント作成をしてくれます。Internet Identityと似ていますが、これらはInternet Computerのセキュリティ外になるので指定したメールアドレスに自動生成されたシードフレーズが送られてきます。尚、私が試したところgithubでしか作成出来ずにtwitterとfacebookは失敗しました。この当たり、どうなっているのか未調査です。

1. `Connect hardware Wallet` はまだ実装されていません。(2021/10/22)

#####使い方-ログイン後
1. `neurons`NNSと同じようにneuronsでステーキングが出来ます。未確認ですが、wallet全体をプールしてのステーキングではなく、各Principal IDでステークしている模様。試してみてますがまだ不安定な印象。rewardsが確認できましたらまた追加で書き込んでおきます。
1. `Marketplace*BETA*` Cronics 限定で購入可能のようです。[Entrepot](https://entrepot.app/)にアクセスは可能。

#####その他
settingsからアカウントを同時に立ち上げ切り替えることで複数アカウントを利用できます。
シードフレーズとパスワードからアカウントを作成した場合、パスワードを入力はするフォームがサイトトップにないのは何故なのか不明、分かる方いらしゃったらお教え下さい。

不明な点、間違えている点がありましたら連絡して下さい。
Dartの基礎を勉強しました(1)

<h1>前置き</h1>
さて、今回はいつもの「汎用型AIを作りたいんじゃぁ！！」と言っていますが、まぁ今回はなんでDartになるんだ？という話を前置きとして書きます。(あ、興味なかったら本題に飛んでください。)

Dartを勉強する理由として、FlutterとFirebase、MLkitを使用することでAIを搭載したアプリケーションを作成できるということを最近知りました。
なので、Flutterで使用されている「Dart」を勉強し、応用できるようにしようと思ったので勉強を始めたという理由ですね。

Dartが理解でき次第、次は、Flutterの活用などについて記事を書いていきたいと思います。

では、始めていきましょう

<h1>[Hallo World!]を出力してみよう</h1>
<h2>DartPadを使用してみよう</h2>
今回はDartPadを使用していきたいと思います。
手を動かしながら学びたい方はDartPadで実際に書いていきましょう。

https://dartpad.dev/?null_safety=true


まずはコードを載せておきましょう。


```dart
void main(){
   print("Hello World!");
}
```
上記のコードはタイトル通りに、[Hello World!]を出力します。
さて、ここで補足ですが、Dartってなんだよ！？って方のための補足なので知ってるという人は飛ばして大丈夫です。
<h3>補足:実行したいコードをどこに書くべきか？</h3>
まず、抑えておきたいのは、最初に実行するコードはどこに書くのか？ということです。
答えは

```dart
void main(){}
```
この部分です。"{}"の部分に最初に実行したいコードを記載します。
*実行するコードはmain関数の中に記述する*ということが重要です。

まぁ、最初の第一歩なのでこんなモノでしょう！

<h1>変数について理解しよう</h1>
<h2>変数の種類</h2>

整数

```dart
int age = 5;
```

小数

```dart
double weight = 3.7;
```

文字列

```dart
/*
文字列を囲む際には
[""]または['']を使用しましょう。
*/
String name = "powder";
```

bool型(true, false)

```dart
bool powder = true;
```

型推論

```dart
/*varは最初の代入時に型推論する
 例えば下記に文字列型でvarの部分を記載します。
 その後、nameの部分に他の変数と変更しようと
 してもエラーになります。
 理由としては、最初に型推論したものを後から
 別の型に変更できないということです。
*/
void main(){
  var name = "powder";
  name = "Hello";
//この[name]の部分に適当な変数を入れてみましょう。
```

何型でも良い(dynamic)

```dart
/*
var(推論型)とは違い、dynamicは
後で変数をの型を変えることができる
*/
dynamic number = 12340;
number = 23450;
number = "powder";
//numberの部分を適当な変数に変えてみましょう。
```

final(値の変更を不可にする)

```dart
final name = "powder";
 name = "小麦粉";  //値の変更はできない
 name = 12345;    //値の変更はできない
```

const(値の変更を不可にする)

```dart
const price = 123;
 price = 333;      //値の変更はできない
 price = "powder"; //値の変更はできない
```

さて、補足的な説明ですが
[final]と[const]の違いについて少々補足しますね。
この補足で今回の[Dartの基礎を勉強しました(1)]を
終わりましょう。

<h3>補足:finalとconstの違いは？</h3>
さて、finalとconstの違いですが
*finalは処理できた時に、値が決まる*
→処理できた段階で、値が決定されるので、それ以降は値が変更できません。
*constはコンパイル時に、値が決まる*
→constで定義したものがコンパイル(実行時)で呼び出された時に値が決まります。

さて、今回はこの辺で失礼しますね。
ここまで読んでくださり、ありがとうございました。
いつもの挨拶文を書いておきますが、読まなくても大丈夫です。
では、また次回


#挨拶
どうも、組込みエンジニアとして、とある企業におります粉です。

・組込みエンジニアですがAIエンジニア、機械学習エンジニアとして転職したいので、自身でいろいろと勉強を行っております。

・なんでAIエンジニアや機械学習エンジニアになりたいの？と疑問をもたれる方も多いと思いますので、簡単に説明させていただきます。
１、元はAIを作ってみたい、社会問題、労働に関してもっと働きやすい環境が必要なのではないか？と考えたため様々な課題をAIなどの先端技術でアプローチをかけてみたいと思い、AIエンジニアを目指しました。
２、ですが、今やっているのは組込みエンジニアのため、使用する技術、言語が違うといったことから、独学でやってみようと思いまして、最近勉強をはじめました。
３、転職を目指す、自身の夢を叶えたいという願いもありますので、こうやって学んだことを記事しています。

・いろいろとお話ししましたが、まずは、私よりも知識、技術が豊富な先輩方から多くのことを意見、修正点、アドバイスをいただけることを楽しみにしています。

・まだまだ新参者、理解が足りていない部分もあるので記事を書きながら、修正を繰り返して理解を深めれればと思っております。(AIを研究している企業や研究機関に転職したいです。

・こんな手法もあるぞ、やり方はこうだ！！などの意見も募集しております。
raspberry pi 1 model bで、navit その4

#概要

raspberry pi 1 model bで、navitやってみる。
地図をダウンロードする。


#地図をダウンロードする。

```
wget -O japan-all.bin -c 'http://maps3.navit-project.org/api/map/?bbox=133.0,33.0,145.0,43.0'

```

以上。