OmniAICreator/Qiita-1.07M huggingface dataset:
ESP32 V2.0 が macOS Big Sur で書き込めない問題の解決

## MH-ET LIVE ESP32 Mini Kit V2.0

### 背景
　研究用として提供いただいた MH-ET LIVE ESP32 Mini KIT （以下、便宜上 ESP32と略）には V1.1（画像左側）と、同V2.0（画像右側）の二種類があった。
![IMG_6946D.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/4ee122d5-4fd9-c860-7b87-6c1c900e9086.jpeg)
![IMG_6945D.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/627835e4-e16e-7670-191b-60cdfb28fd25.jpeg)


どちらもボード設定は https://dl.espressif.com/dl/package_esp32_index.json からインストールした ESP32 内にある「MH ET LIVE ESP32MiniKit」を選択して使っている。
　ちなみに使用しているのは M1 Mac mini, macOS Big Sur (11.5.2) だ。

### 問題（コンパイルした結果が書き込めない）
　V2.0のESP32では、コンパイルした結果を書き込もうとすると次のエラーが出て書き込めないのだ。
「A fatal error occurred: Failed to write to target RAM (result was 01070000)」
シリアルポートの問題なのだが、ArduinoIDEのシリアルモニターにはESP32からの出力が表示される。（一見接続できている風）

### 調査
　USBシリアル用のチップが V1.1では CP2104 チップが載っていて、
![IMG_20210912_110119_edit_220816002881408.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/7c4f7f84-cdef-78d2-4243-448b2c72cd1e.jpeg)
V2.0にはCH9102Xというのが載っている。
![IMG_20210912_110200_edit_220849815603799.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/5bce16f2-6d4d-f98c-b27c-5fd96b730715.jpeg)

このためか、ArduinoIDEでシリアルポートを選ぼうとすると、
V1.1では　/dev/cu.usbserial-019572BB
V2.0では　/dev/cu.usbmodem52870175061
が表示される。この usbserial が usbmodem となっているあたりが怪しい

### 解決
　CH9102X driver mac でググって出てきたものを当たるとここに解決策があった！
https://github.com/Xinyuan-LilyGO/LilyGo-T-Call-SIM800/issues/139#issuecomment-904390716
ここから CH9102_Mac_Driver.zip をダウンロードして解凍すると中身は
「CH34xVCPDriver_signed.pkg」なので手違いかと思うが、上記サイトの記事にCH9102で使えるとあるので、気にしないでインストール。
途中で中国語のポップアップウインドウが出てくるが、読めないのでそのままボタンをクリックする。そうすると「ドライバーをインストールしても良いか？」と聞かれるので、流れのまま環境設定の鍵をクリックして許可するとインストールが完了する。
念の為、macOSをリブートしてから ArduinoIDE を起動すると、シリアルポートの選択には
・/dev/cu.usbmodem...... と
・/dev/cu-wchusbserial..... の二つが表示されるようになった。
![ESP32_USBSERIAL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/f71ca8c4-13d2-dd67-6188-f8e6ce151915.png)

/dev/cu.wchusbserial.... を選ぶと書き込みができるようになって問題が解決した。

追記：ドライバーーインストール時、「システム環境設定」ー「セキュリティとプライバシー」の「一般」タブの左下の鍵マークをクリック＆パスワード入力して、「ダウンロードしたアプリケーションの実行許可：」の「一部のシステムソフトウェアでは使用する前に確認が求められます」の右にある詳細をクリックして「CH34xVCPDriver」のチェックを入れて実行を許可する必要があります。うまくいくと下のようにインストール成功のウインドウが表示されます。
![CH34xDriverinstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/b58faa16-806b-d644-0153-271f8aab7785.png)
kintone JavaScriptカスタマイズ Vol.1

#初めに
最近、業務の中で「Kintone」に触れる機会がありました。
事前情報として私にはシステム開発等の経験はありません。
そんなプログラミング初心者の私が、「Kintone」のシステムカスタマイズを少しずつ行なっていく過程を、自身の備忘録的な意味も込めて記事にして発信していきます。

#「kintone」って何？
一言で言うと、webデータベース型のビジネスアプリ構築クラウドサービスです。
「Kintone」の大きな特徴として、システム開発をした事がない人でも、簡単かつ直感的にシステム構築ができる事が挙げられます。
また、APIやプラグイン、JavaScriptなどを用いて比較的簡単にカスタマイズも行うことも可能です。

Kintoneとは？　https://kintone.cybozu.co.jp/

#本記事の目的
本記事では、kintone JavaScriptカスタマイズを行う際の基本的な考え方を理解した上で、簡単な処理を行なっていきます。
今回エディターは、kintone内でJavaScriptの編集・保存が簡単に行えるプラグイン「JSEdit for kintone」を使用していきます。
JSEdit for kintone： https://developer.cybozu.io/hc/ja/articles/205452653

#いざカスタマイズ！
今回は任意のアプリにおいて、「新規レコード作成画面で指定したフィールドのみを非表示にする」というカスタマイズをしていきます。
下の画像の赤丸の部分だけを非表示にするという処理です。
![スクリーンショット 2021-09-12 11.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1954118/ad25d105-68bd-d8aa-b4f3-b650b3a469c0.png)
まず初めに、kintone JavaScriptカスタマイズを行なっていく上で基本となる考え方についてです。
kintoneにはイベントというものがあります。
イベント一覧：　https://developer.cybozu.io/hc/ja/articles/360000361686-kintone-JavaScript-API-%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88-%E4%B8%80%E8%A6%A7

このイベントを発火点に、処理したい内容を記載していくという流れとなります。
今回は、「新規レコード作成画面を開いた時」を発火点にしたいので、app.record.create.show というイベントタイプを使用します。
このイベントですが見方はすごくシンプルで、「アプリのレコード作成画面を開いた時」という内容となっており、イベントコードを左から直訳して読んでいくとイベントの内容となります。

処理内容に関しても、developer network内に関数が既に用意されているので、そちらを使用していきます。
Kintone developer network ：https://developer.cybozu.io/hc/ja/articles/360015513211

それでは実際に書いていきます。

```javascript
(function() {
    "use strict";
    kintone.events.on('app.record.create.show', function(event) {
        kintone.app.record.setFieldShown('文字列', false);
    })
})();

```

これまでの内容をもとに、上記のJavaScriptを日本語にしていくと、
「アプリのレコード作成画面を開いた時（イベント）」に「文字列というフィールドを非表示にする（処理）」という内容になります。
では保存をして、実際に処理内容が上手くいっているか確認してみます。![スクリーンショット 2021-09-12 12.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1954118/a8caa3cb-5392-2332-ab9a-0fc7c406e614.png)

おお！非表示にしたかった「文字列」のみがきちんと非表示になっていますね。
処理がうまくいったようです。

#まとめ
今回は、簡単なkintone JavaScriptカスタマイズをしてみました。
今回の内容を実際に使用するシーンとして、例えば、入力する項目（フイールド）が多いレコードの初回入力画面で、入力必須の項目以外は表示しないようにする。といった使い方ができそうです。
kintoneはこのように、ユーザーのこうしたい！を簡単に実装することができる小回りがきくクラウドサービスです。
次回以降は、もう少し実例に沿った処理をしていけたらと考えています。
TeraTerm SSH 転送を使用する

# 初めに

TeraTerm の SSH 転送をよく忘れるのでメモしておきます。

# やりたいこと

使用している端末のブラウザで、リモートの localhost で実行しているアプリケーションを閲覧することが目的です。

現在、アプリケーションサーバーは、localhost の 8080 をリッスンしています。

```
[ec2-user@ip-172-31-46-239 compose_test]$ curl http://localhost:8080
Hello World!
```

# TeraTerm の SSH ポート転送

TeraTerm を開き、「設定」→ 「SSH 転送」→ 「追加」の順にクリックします。以下のように設定し、「OK」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/83d1a4c9-7155-cc15-837b-2393222b3aa2.png)

続けて「OK」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/8842dd5e-2e4a-3ccf-f4b4-014659014c3d.png)


ブラウザの URL に `localhost:8080` と入力し、アプリケーションにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/e89f5bd7-0d41-fa94-a27c-a05d21575270.png)

# 参考記事

https://isleofhoso.com/teraterm-portforward-web/
Open ID Connect(OIDC)をスライド形式で理解する

<iframe src="//www.slideshare.net/slideshow/embed_code/key/BqIWu5ykthdbex" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> 

##### 参考
https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe
【AWS S3】S3バケットをEC2にマウントしてみる

https://github.com/kahing/goofys/tree/v0.24.0

goofysを使ってS3バケットをEC2にマウントしてみます。

# インストール
依存パッケージのインストール

```bash
sudo yum install -y golang fuse
```

READMEに書いてある通りにやるとビルドでエラーが出るので、バイナリをインストールします。

```bash
sudo curl -sS -L -o /usr/local/bin/goofys https://github.com/kahing/goofys/releases/download/v0.24.0/goofys
sudo chmod 755 /usr/local/bin/goofys
```

# バケット作成

```bash
 aws s3 mb s3://バケット名
```

# マウント

```bash
# マウントポイント作成
sudo mkdir /mnt/s3
sudo chown ec2-user:ec2-user /mnt/s3 

# マウント
# 何かエラーがったら/var/log/messagesに書き込まれます。
goofys バケット名 /mnt/s3

# マウントされたか確認
df -h
#Filesystem                   Size  Used Avail Use% Mounted on
#... 中略 ...
#バケット名  1.0P     0  1.0P   0% /mnt/s3

# マウント解除
sudo umount /mnt/s3
```

## fstabの設定
起動と同時にマウントする場合は `/etc/fstab` に追記します。
fstabの書式 -> [fstabについて | Qiita](https://qiita.com/kihoair/items/03635447591358210772)



```bash
# rootユーザーでawsの認証情報を参照できる必要があるので、とりあえずシンボリックリンクを設定しておきます。
sudo ln -s /home/ec2-user/.aws /root/.aws

# アカウントのuidとgidを調べます
id

# fstabに設定(後述)を追記します
sudo vim /etc/fstab

# fstabの設定が正しいか確認
sudo mount -a
df -h
```

fstabに追記する設定。バケット名とマウントポイント、--uid、--gidを設定してください。

```/etc/fstab
/usr/local/bin/goofys#バケット名  /mnt/s3        fuse     _netdev,allow_other,--file-mode=0666,--dir-mode=0777,--uid=1000,--gid=1000    0       0
```

リブートして、 `/mnt/s3` にバケットがマウントされていればOKです。

# ■ 参考

- https://github.com/kahing/goofys/tree/v0.24.0
- https://qiita.com/kihoair/items/03635447591358210772
YAMAHA ルータで CATV 接続拠点から本社への拠点間 VPN 経由でインターネット接続する設定

# 導入

YAMAHA ルータの RTX1220 や RTX830 を用いた拠点間 VPN 接続のの設定はよくあるケースで、CATV インターネットの拠点との VPN 接続の例も公式の設定例が掲載されています。
![01_vpn-multiple_network-internet_vpn-rtx5000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43383/404443d5-8280-fc0b-448e-1193c91a8a32.jpeg)
https://network.yamaha.com/setting/router_firewall/vpn/multi_function/internet_vpn-rtx5000

一方で、業務で利用する Web サービスの接続が本社 IP 経由に絞られてたり、本社にのみ UTM 等によるセキュリティ強化がなされており、子拠点からのインターネット接続を親拠点経由にしたいというケースもあるあるながら、次のように CATV 拠点を本社経由のインターネット接続する設定例というのは見当たりません。
![ネットワーク構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43383/a6299db6-2132-228a-55ac-5ab4b43152f7.png)

今回はこの構成例を実現する設定例をご紹介します。

# 設定例

ポイントは子拠点側のデフォルトルートと親子拠点間のルーティングの設定です。

## 今回の前提条件

- 親拠点の WAN 側は `LAN2` を利用し、PPPoE 接続で固定 IP (`118.xxx.xxx.xxx`)
- 子拠点の WAN 側は `LAN2` を利用し、CATV 接続で DHCP でグローバルアドレスが払い出される
- 拠点間のインターネット VPN は IPsec
    - 親拠点の子拠点向けの tunnel は `1`
    - 親拠点の子拠点向けの tunnel は `1`
- `${pre-shared-key}` や `${key-id}` をそれぞれ決めて設定

## 親拠点の設定
ポイント部分だけの抜粋です。

```sh
# WAN 側の 固定 IP の設定
ip lan2 address 118.xxx.xxx.xxx/26

# 子拠点向けのルーティング
ip route 192.168.10.0/24 gateway tunnel 1

# 子拠点向けの IPsec 接続設定
tunnel select 1
 description tunnel "to child"
 ipsec tunnel 1
  ipsec sa policy 1 1 esp aes-cbc sha-hmac
  ipsec ike keepalive log 1 off
  ipsec ike keepalive use 1 on heartbeat 10 6
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 text ${pre-shared-key}
  ipsec ike remote address 1 any
  ipsec ike remote name 1 ${key-id} key-id
 ip tunnel tcp mss limit auto
 tunnel enable 1
```

## 子拠点の設定
こちらもポイント部分だけの抜粋です。

```sh
# WAN 側の DHCP の設定
ip lan2 address dhcp

# デフォルトルートの設定 - 本社接続の VPN にする
ip route default gateway tunnel 1

# 親拠点 IP と 子拠点のルーティング
ip route 118.xxx.xxx.xxx gateway dhcp lan2

# 親拠点向けの IPsec 接続設定
tunnel select 1
 description tunnel "to parent"
 ipsec tunnel 1
  ipsec sa policy 1 1 esp aes-cbc sha-hmac
  ipsec ike keepalive log 1 off
  ipsec ike keepalive use 1 on heartbeat 10 6
  ipsec ike local address 1 192.168.10.1
  ipsec ike local name 1 ${key-id} key-id
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 text ${pre-shared-key}
  ipsec ike remote address 1 118.xxx.xxx.xxx
 ip tunnel tcp mss limit auto
 tunnel enable 1
```

# 結び
設定例がネットに見当たらず多少試行錯誤したので、備忘録的にまとめました。

YAMAHA は Netvolante あるので、今回の設定で key-id 使った部分は Netvolante 使った方が素直だったかもしれません。あとは、CATV 接続側が親になってもやはり Netvolante 使えば設定は容易そうです。

# 参考
- 公式設定例ページ
    - [インターネットVPNで接続](https://network.yamaha.com/setting/router_firewall/vpn/multi_function/internet_vpn-rtx5000)
    - [CATVインターネットなどイーサネット回線を利用する](https://network.yamaha.com/setting/router_firewall/internet/internet_connect/catv)
    - [IPsecを使用したVPN拠点間接続 + センター(UTX200) 経由インターネット接続](https://network.yamaha.com/setting/router_firewall/security/utm_appliance/ipsec_via_utm#ipsec)
ポートフォリオのテーブル設計を見直してみた

#まえがき
[２章 Naive Trees(素朴な木)](https://qiita.com/hirashunshun/items/06adf4f42f03a9f3b63d)　を参考に自分のポートフォリオを見直してみました。

#RDBにおけるデータ構造
RDBにおけるデータ構造には大きく分けて４つあります。
①隣接リストモデル（ナイーブツリー）
②経路列挙モデル
③閉包テーブルモデル
④入れ子集合モデル

##素朴な木とは？
素朴な木とは、①の隣接リストモデルに該当します。
###例
隣接リストモデルとは、最も単純な構造で以下のようなテーブルとなります。
特徴は、それぞれの要素が自分の親だけを知っていることです。

|id  |name  |parent_id  |
|---|---|---|
|1  |地名 |NULL  |
|2  |日本|1  |
|3  |アメリカ|1  |
|4  |東京|2  |
|5  |大阪|2  |
|6  |渋谷|4  |
|7  |吹田|5  |
|8  |品川|4  |
|9  |ニューヨーク|3  |
|10  |ナイアガラ|9  |
|11  |ロサンゼルス|3  |


![tree_table.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110285/8d202887-93c0-4ce5-aa3d-16126ca18603.png)

###メリット、デメリット

- メリット
    - 単純な構造で理解しやすい

- デメリット
    - 階層が決まっていない場合の取得が困難
    (日本に関する子孫ツリーの数を取得しようとするのが困難になる)







##現状の構造
コメントをスレッド形式で表示する機能にて、
「コメント」、「コメントに対する返信」も両方Commentsテーブルに格納されています。

|comment_id  |content  |reply_comment  |
|---|-------|---|
|1  |朝ごはんを食べました  |NULL  |
|2  |早起きしました  |NULL  |
|3  |何食べたの？  |1  |
|4  |今日は出かけます  |NULL  |
|5  |僕も食べました！  |1  |
(reply_commentはどのコメントに対する返信かを表しています)

今回のパターンでは、
**階層は2階層で固定**
の構造なので、デメリットの部分を意識する必要はなく隣接リストモデルでも問題ないのかなと思います。

![スクリーンショット 2021-09-12 12.58.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110285/f1040ba6-cd39-f22b-3f5e-fc8ce642136b.png)


##改善するなら
今後、改善としてスレッド内でさらにどのコメントに対するコメントかを細かく分類したい場合は、隣接リストモデルでは不十分だと考えられます。

その際は、閉包テーブルモデルを採用しテーブルを二つに分ける必要が出てきます。


#参考文献
[The Cusp Of Helix](http://lab.kochlein.com/ja/FertileForest/models/AdjacencyList)
[Railsでツリー構造（階層構造）をもったカテゴリを隣接リストモデルで実装する](https://qiita.com/yuyasat/items/1200d7a6b56bae0c6f57#1-%E9%9A%A3%E6%8E%A5%E3%83%AA%E3%82%B9%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9)
TableauからPostgresSQL接続する環境構築メモ

WEBスクレイピングして、RDBにデータ格納して、BIツールで可視化したい。Dockerで環境で構築したほうがよさそうだけど、まずは簡単にローカルにデータ格納して、Tableau Desktopで可視化。

# 環境
- macOS Big Sur
- Tableau Desktop2021.3
- PostgresSQL 13
- pgAdmin 4（PostgresSQLのGUIツール）

# 環境構築
### Postgresインストール
以下サイトをみると、homebrewを使う方法もあったが、一番簡単そうなapp方法でインストール。

https://www.postgresql.org/download/macosx/

appでのダウンロードはこちらから。

https://postgresapp.com/downloads.html

### Postgres GUIツールインストール
GUIツール、いろいろあるが、使い方をググって出てきた、pgAdminを選択。

https://postgresapp.com/documentation/gui-tools.html

pgAdminのインストールはこちらから。

https://www.pgadmin.org/

### pgAdminでテストデータベース作成
使い方をググって一番上に出てきた記事を見ながら、テストデータベース作成。

https://itsakura.com/pgadmin4-db-create

### Tableau Desktopから接続
データソースをPostgresを選択して、テストデータベースで設定した、サーバー、ユーザーネーム、パスワードで接続したが、エラー発生。
エラーメッセージから以下サイトから、ドライバーをインストール。

https://www.tableau.com/ja-jp/support/drivers

ドライバーをインストールしたが、解決できず。普段Tableu Desktop2020.1を使っていたので、おそらくTableau Desktop2020.4以降使えそうな感じがしたので、Tableau Desktop2021.3をインストールして、無事接続完了。
vim,nano 基本コマンド集







#Vim 基本コマンド


######コピー(ノーマルモード)
```
yy
```
######貼り付け(ノーマルモード)
```
pp
```
######一行切り取り(ノーマルモード)
```
dd
```


######１つ目の状態(ノーマルモード)
```
U
```
######一つ先の状態(ノーマルモード)
```
Ctrl + R
```
######ノーマルモード
```
ESC
```
######インサートモード(ノーマルモード中で)
```
I　、Insert
```

######ビジュアルモード(ノーマルモード中で)
```
V
```
######ビジュアルモード矩形(ノーマルモード中で)
```
Ctrl + V
```
######ビジュアルモード行選択(ノーマルモード中で)
```
Shift + V
```
######置換モード切り替え
```
Insert
```
######その場で保存(ノーマルモード)
```
:w
```
######保存ないで終了(ノーマルモード)
```
:q！
```
######終了(ノーマルモード)
```
:q
```
######保存　終了(ノーマルモード)
```
:wq
```

#emacs基本コマンド

######範囲選択
```
Ctrl + ^　,　Alt + A  , Shift + 十字キー   ※同じキーでキャンセル
```









#nano 基本コマンド
###選択範囲をコピペするには？
```
方法はないので範囲選択して切り取りをしてから二回貼り付けを行うことで事実上のコピペとなる
```

######範囲選択
```
Ctrl + ^　,　Alt + A  , Shift + 十字キー   ※同じキーでキャンセル
```
######切り取り
```
Ctrl + K
```
######貼り付け
```
Ctrl + U
```
######終了
```
Ctrl + X
```
######保存（上書き）
```
Ctrl + S
```
JDK11をVisual Studio Code  に入れる 

### 確認環境

Visual Studio Codeをインストールしていない人は下からインストールしてください。

Visual Studio CodeインストーラーとJavaのインストーラーセット
http://aka.ms/vscode-java-installer-win 


エラーメッセージ
Java 11 or more recent is required to run. Please download and install a recent JDK

Visual Studio Codeのバージョンが上がって、
このままでは、Javaaが使えないのでJDKのバージョンアップを行う


AdoptOpenJDKのダウンロード
AdoptOpenJDK のバイナリは次の URL から取得します。

https://adoptopenjdk.net/index.html

インストール先の変更
C:\Users\「自分のユーザー名」\AppData\Local\Programs\AdoptOpenJDK

インストール

参考サイト

https://jp.techcrunch.com/2019/06/15/2019-06-14-microsoft-makes-getting-started-with-java-and-vs-code-easier/amp/

https://www.javadrive.jp/start/install/index6.html
【flutter】freezedモデルを複数持つListを、特定のプロパティーでgroupByしてMapEntry化する。

ListViewでは、Mapの状態では使用することができないので MapEntry化する必要がある。

```userModel.dart

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';

part 'userModel.freezed.dart';
part 'userModel.g.dart';

@freezed
class UserModel with _$UserModel {
  const factory UserModel({
    @Default("") String name,
    @Default("") String age,
  }) = _UserModel;

  factory UserModel.fromJson(Map<String, dynamic> json) =>
      _$UserModelFromJson(json);
}
```

```dart
List<UserModel>  users = [
  UserModel(name:"Ichiro", age:"29"),
  UserModel(name:"Jiro", age:"33"),
  UserModel(name:"Saburou", age:"29"),
  UserModel(name:"Sirou", age:"33"),
  UserModel(name:"Gorou", age:"21"),
  UserModel(name:"Rokurou", age:"60"),
]
```

上記のようなモデル構造User、及びそれらを配列で持つusersがあるとします。

まずは、下記のように年齢ごとにマップ化する関数を定義します。

```dart
//このようにしたい。
{ 
  "29":
    [
      UserModel(name:"Ichiro", age:"29")
      UserModel(name:"Saburou", age:"29"),
    ],
  "33":
    [
      UserModel(name:"Jiro", age:"33"),
      UserModel(name:"Sirou", age:"33"),
    ],
  "21":
    [
      UserModel(name:"Gorou", age:"21"),
    ],
  "60":
    [
      UserModel(name:"Gorou", age:"21"),
    ],
}

//関数定義
  Map<String, List<UserModel>> _makeGroupByAgeMap(
      List<UserModel> userModelList) {
    Map<String, List<UserModel>> _groupByAgeMap = {};

    for (UserModel userModel in userModelList) {
      //ループしてきたuserModelのageでまだグループ化してない場合は先に空配列を代入する。
      _groupByAgeMap[userModel.age] ??= [];
      _groupByAgeMap[userModel.age]!.add(userModel);
    }
    return _groupByAgeMap;
  }
```
ListViewはマップのままでは表示できないので、MapEntry化する必要がある。

```dart
//関数定義
  List<MapEntry<String, List<UserModel>>> _makeMapEntryListPerAge(
      Map<String, List<UserModel>> _groupByAgeMap) {

    List<MapEntry<String, List<UserModel>>> _listPerAge = [];

    _groupByAgeMap.forEach((key, value) {
      _listPerAge.add(MapEntry(key, value));
    });

    return _listPerAge;
  }
```

```dart
//最初に呼び出す関数
  List<MapEntry<String, List<UserModel>>> getMapEntrysGroupByAge(
      List<UserModel> userModelList) {

    //ListをGroupByしたMapにする。
    Map<String, List<UserModel>> _groupByAgeMap =
        _makeGroupByAgeMap(userModelList);

    //MapEntry化してListに格納する。
    List<MapEntry<String, List<UserModel>>> _listPerAge =
        _makeMapEntryListPerAge(_groupByAgeMap);

    return _listPerAge;
  }
```
pipenv で Django の開発環境をパパッと用意する

Django プロジェクトの開発を進める際、ひとまず別プロジェクトを用意して動作を確認してみたくなることがある。そういう場合を想定し、「パパッと Django 開発環境を用意するためのメモを残そう」と思って書いたのが本記事。

## 本記事での最終的なディレクトリ構成

ルートディレクトリを `pipenv_django` として、設定ファイル群は `config` ディレクトリ内に置き、 `myapp` ディレクトリ内に model や view などに関するファイルを置く想定。

```
pipenv_django
├── Pipfile
├── Pipfile.lock
├── config
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── myapp
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py
```

## 前提

python がインストールされている。（執筆時点で筆者の python version は 3.9.6）

## pipenv のインストール

念のため記載。

```
$ pip3 install pipenv
```

## pipenv でパッケージのバージョンを管理するプロジェクトの作成

ここではプロジェクトのルートディレクトリ名を `pipenv_django` とする。

```
$ mkdir pipenv_django && cd $_
$ pipenv install
```

## Django のインストール・設定ファイルを置く config ディレクトリの作成

Django のプロジェクトを始めるには `startproject` すればよい。コマンド末尾にカレントディレクトリを指定すれば、カレントディレクトリに設定ファイルが置かれるディレクトリが作成される。

```
$ pipenv install django
$ pipenv shell
$ django-admin startproject config .
```

## model などを定義するファイルを置く myapp ディレクトリの作成・設定ファイルの編集

models.py などが置かれるディレクトリを作成するには `startapp` すればよい。

```
$ python manage.py startapp myapp
```

設定ファイルの編集

```config/settings.py
...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',  # 追加
]

...
```

~完~
Docker Compose を使ってみた

# インストール

以下のコマンドを実行し `docker-compose` コマンドをインストールします。

```
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` \
-o /usr/local/bin/docker-compose
```

実行権限を付与します。

```
sudo chmod +x /usr/local/bin/docker-compose
```

正常にインストールされたことを確認します。

```
[ec2-user@ip-172-31-46-239 ~]$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
```

# docker-compose.yml の作成

作業ディレクトリを作成し、以下の手順はすべてこのディレクトリで行います。

```
mkdir compose_test
cd compose_test
```

次の 2 つのコンテナを作成します。

- Web アプリケーション用の Flask コンテナ
- アクセスカウンタ用の Redis コンテナ

以下のファイルを作成します。

```py:app.py
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
```

```requirements.txt
flask
redis
```

次に Dockerfile を作成します。

```Dockerfile:Dockerfile
FROM python
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
```

次に docker-compose.yml を作成します。

- web サービスは Dockerfile で作成するイメージから構築する
- redis サービスは Docker Hub から取得するイメージから構築する
- コンテナの公開用ポート 5000 を、ホストマシンのポート 8080 にポートフォワードする
- ホストマシンの compose_test ディレクトリを コンテナ内の /code ディレクトリにマウントする

```yml:docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
     - "8080:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"
```

以下のコマンドを実行し、コンテナを起動します（バックグラウンドで実行する場合は `-d` オプションを付けます）。

```
docker-compose up
```

# アプリケーションにアクセスする

もう一つターミナルを開いてアクセスします。

```
[ec2-user@ip-172-31-46-239 compose_test]$ curl http://localhost:8080
Hello World! I have been seen 1 times.
```

app.py を編集したい場合、compose_test ディレクトリと /code ディレクトリは同期しているので、ローカルで app.py を編集すれば、再度 docker-compose up コマンドを実行することなく、変更がアプリケーションに反映されます。

# 参考記事

https://docs.docker.jp/compose/index.html
STM32L010とS-5851Aで液晶温度計 (Mbed)(AQM0802A) HAL


x Mbedのリビジョン143

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


![h_con65.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fe30d581-1cbc-80e6-99d8-7eebf955642c.jpeg)



```c++


#include "mbed.h"

#define ADDR        ((0x48)<<1) //  address 5851
//#define ADDR        (0x39<<1)   //  address 751
#define ADDR_LCD    (0x7C)      //  address

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

int     tempval;        //温度
char    data_read[6];   //i2cバッファー
int     n10;            //10の桁
//int     ii;             //ループカウンター
uint8_t b[]="@A";       //i2cバッファー


I2C_HandleTypeDef hi2c1;

//I2Cの初期化
void I2C_INIT1()
{
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    __HAL_RCC_I2C1_CLK_ENABLE();


    //I2C_HandleTypeDef hi2c1;

    hi2c1.Instance = I2C1;
    hi2c1.Init.Timing = 0x00000708;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.OwnAddress2 = 0;
    hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    HAL_I2C_Init(&hi2c1);    

    HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE);

    HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0);

}//I2C_INIT1

uint8_t INIT_com[]={
0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

uint8_t INIT_cls[]={0x0,0x1};

//メイン関数
int main()
{
    //I2Cの初期化
    I2C_INIT1();

    //液晶の初期化
    wait_ms(200);
    for(int ii=0;ii<11;ii++){
        HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, &INIT_com[ii*2], 2, 3000);
        wait_ms(3);
    } //for

    uint8_t b[]="@A";

    //無限ループ
    while (1) {
        //液晶のクリア
        HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, INIT_cls, 2, 3000);
        wait_ms(3);

        //温度センサーの初期化
        //set address 0
        b[0]=0;HAL_I2C_Master_Transmit(&hi2c1, ADDR, b, 1, 3000); //addres 0

        //温度の読み込み
        // Read temperature register
        HAL_I2C_Master_Receive(&hi2c1, ADDR, b, 1, 3000);

        //温度の保存
        // Calculate temperature value in Celcius
        tempval =  b[0];

        //tempval = 12; //debug

        //計算
        // Calculation temp
        n10 = DVI10(tempval);             //10の桁
        tempval = tempval - ( n10 * 10 ); //1の桁

        //液晶に出力 xなぜか連続送信するとバグる為に個別送信
        // Display result
        data_read[0] = '0' + n10;
        data_read[1] = '0' + tempval;
        data_read[2] = 0; 
        for(int ii=0;ii< 2 ;ii++){
            b[0]='@';b[1]=data_read[ii];
            HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, b ,  2  , 3000);
            wait_ms(1);
        }//for

        //1秒待つ
        wait_ms(1000);
    }//while
}//main







```
1/1~4/1の時系列データの変換

# 本記事での目的
とあるデータ分析での前処理に必要になった際にざっと調べても出てこなかったのでここで共有します。要は、`str`を`pd.datetime64[ns]`に変換したうえでデータを連番にしてあげればいいです。  
  

+ 変換前  
  
![1png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2012682/9a2f0bd5-81b5-44bb-82c8-92ac54a738e5.png)  
  
+ 変換後  
  
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2012682/ed05286f-cdda-97d3-1a40-60df79d3aebd.png)


  
# 実装する
  
まず、文字列から`~`を区切りと分割して新しいカラムとして用意します。カラム名は後で削除するので、わかりやすい名称であれば何でもいいです。西暦はデータによりますが、ここでは2021年としました。  
  
```
import pandas as pd 
from datetime import datetime
# 分割する
df["first"] = df["datetime"].apply(lambda x: "2021/"+x.split("~")[0])  
df["last"] = df["datetime"].apply(lambda x: "2021/"+x.split("~")[1])
```  

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2012682/bff47fc4-a18c-e75b-c328-19d6f792d60e.png)


形式を整形しつつ、`pd.datetime`型に変換。

```
# 年/月/日
df["first"] = df['first'].apply(lambda _: datetime.strptime(_,"%Y/%m/%d"))
df["last"] = df['last'].apply(lambda _: datetime.strptime(_,"%Y/%m/%d"))
# ここでdatetime変換
df["first"] = pd.to_datetime(df["first"])
df["last"] = pd.to_datetime(df["last"])
```  

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2012682/dc499f72-ca45-3202-9860-498c44454bc7.png)


最後に系列順になるように縦に結合します。大雑把に説明するとデータの分だけループさせて最初のデータフレームを基に下にくっつけていくイメージです。より汎用的な方法もあるかもしれません。  
  
```
for i, (f, e) in enumerate(zip(df["first"].tolist(), df["last"].tolist())):
  # 日付を連番で作成
  date = pd.date_range(start=f, end=e)
  if i == 0:
    # 一番最初だけ変数で保持しておいて縦に結合していく
    df1 = pd.DataFrame({"a": df.loc[i, "a"], "b": df.loc[i, "b"]}, index=date)
  else:
    df2 = pd.DataFrame({"a": df.loc[i, "a"], "b": df.loc[i, "b"]}, index=date)
    # データを結合してから変数に上書きする
    df1 = pd.concat([df1, df2])
# インデックス名を定義
df1.index.name = "datetime"
df1
```  
  
# 最後に  
データ分析の際のざっとした確認になれば幸いです。
Nucleo-F303K8 STM32CubeIDEでブレークポイント設定・レジスター確認

思い切り初歩的です... 自分のメモです。

# ブレークポイント

ソース上で右クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/677f6161-277a-b048-2934-583c38c36fd2.png)

# デバッグ開始

とにかく進む。ブレークポイントで止まる。
Fileメニューの下の方に [F8] Resume ボタンがあるので，そこで再開できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/bbb38a9e-1b09-2d59-a5bc-0f1033a57608.png)

# レジスター確認

ソースの右にある [S] をクリックすると，見えるようになる。以下ではGPIOの出力データレジスタ ODR (Output Data Resistor)  を見ている。ちなみに入力は IDR (Input Data Resistor)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/41ea3e68-a040-19ac-65e3-42a7a4aeb79f.png)

いわゆる「食わず嫌い」でしたね... あっけなく簡単でよかったです！
Android StudioとGitHubとの連携手順

#概要
GitHubにプライベートリポジトリが無償作成できるようになって、アプリ開発をする際のバージョン管理が楽になりました。
が、意外に手順を忘れかけた時に必要となってくるので忘備録を残しておきます。

#環境
基本的に、WindowsでもmacOSでもLinuxでも手順は変わらないので、あえてOS別には書きません。
今回はWindows10です。

##Android Studio
Android Studioのバージョンは、「Arctic Fox //2020.3.1」です。
一応、日本語化してます。（日本語化：https://mergedoc.osdn.jp/ ）
![q0912001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/1c1a7cbf-583b-2f45-3dd2-ac149ff215f7.png)

##Git
Git：https://git-scm.com/

Gitをインストールしている状態にしてください。
GitHubで管理するにしても、裏ではGitのコマンドを実行しているので・・・

##GitHub
GitHub： https://github.com/

GitHubにアカウントを持っている前提です。

#連携手順
##手順1：GitHubでTokenを入手する
まずは、GitHubにサインインして、「Setting」-「Developer settings」-「Personal access tokens」と開きます。
![q0912002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/70822570-08e2-64b8-de53-3d0e60223eba.png)

続いて、「Generate new token」ボタンをクリックしてTokenの作成をします。
![q0912003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/dfd06dfa-7428-55e0-e871-07de6559fb4e.png)
"Note"欄は、管理上の名前なのでTokenを使うPCの名前など入れておくといいかもしれません。
"Expiranation"は、有効期限を無期限にするといろいろセキュリティ上の懸念材料になるので「90days」ぐらいでしょうか。
3か月経ったら失効するので、再度生成する必要があります。
"Select scopes"は、毎回repoとadmin:orgのreading、gistにチェックしてるぐらいですね。

「Generate token」ボタンを押してTokenを生成します。

生成したTokenは、Android Studio以外でも使えるので、メモしておくのもありですが、細かく管理したいなら必要数のTokenを作ってください。

:::note warn
Token生成すると表示されるTokenは、ここでメモしておかないと、後で生成したTokenを再度見ることはできません。
:::

##手順２：Android StudioのProjectをVCS管理する
![q0912004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/51e7ce1a-b193-6544-0874-aea602620c59.png)

* メニューから「VCS」を選択し、「バージョン管理統合を使用可能にする」をクリック
* バージョン管理の種類を聞かれるので、「Git」（初期選択）を選択して「OK」

そうすると、メニューが「VCS」→「Git」に変わります。

* メニューから「Git」を選択し、「GitHub」を選択、「GitHubでプロジェクトを共用」をクリック
* 共用する際のダイアログが表示されるので
 * リポジトリー名： GitHub上のリポジトリで表示される名称
 * Private：チェックを入れるとPrivateリポジトリになる。入れないと公開（Share状態）になる
 * Add account：クリック
* Log in with Token...　を選択

![q0912005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/f973c430-4240-042c-13b4-cda6ccd0a123.png)

* 「トークン」欄に、手順１でメモしたTokenを貼り付ける
* 「アカウントの追加」ボタンをクリック

![q0912006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/f350737b-6360-ca35-eb49-e6d9dc4de26f.png)

そうすると「Share by:」欄にTokenのアカウントが表示されるので「共用」ボタンをクリックする

![q0912007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/dc1c4e04-12f7-2702-ab34-6cf90bdd048d.png)

GitHubにコミット＆プッシュする一覧が出てくるので、内容を確認して「コミット・メッセージ」に適宜入力して「追加」ボタンをクリックする

![q0912008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/4c568e74-91e1-32cd-6682-45fb6c78925d.png)

Android Studioの右下に成功のメッセージが表示されたら完了。

##手順３：GitHubで確認する
GitHub側のリポジトリ一覧に追加される（すぐ反映されます）ので、中身を確認します。

:::note warn
GitHubにサインインしてないと、もちろん確認できません
:::

![q0912009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/56ceedaf-d074-17ac-ae38-f37e19959ee4.png)

#GitHubのPrivateは見れるのは自分だけ？
意外に心配性なので確認してみると、自分しか見れない状態だとわかります。
ただ、生成したTokenを使うと、普通に見れるので管理は注意しましょう。

![q0912010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/3704fe46-d5e6-c3dc-3507-8fb906ea4ba6.png)
ニュートラルネットワーク（重みとバイアス）応用

##ポイント
➀ニュートラルネットワークの構造
・入力ノードは二個　中間ノードは二個　出力ノードは一個
⇒中間層に必要な重みは四個　出力層に必要な重みは二個
➁重みやバイアスを変更することで、様々な出力状態を表現できるため、試してみるとよい。
➂活性化関数としては、今回シグモイド関数以外に恒等関数を用いた。
➃重みとバイアスのサイズが異なるため、演算時にはブロードキャストの知識が必要になる。
➄行列同士の計算では、dotにより実装することができる。
➅行列の初期化では、zerosやonesがよく使われる（zeros⇒0詰め行列　ones⇒1詰め行列）

##ソース

```Python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
```

```Python
#x,yともに、10個のデータを準備する
X=np.arange(-1.0,1.0,0.2)
Y=np.arange(-1.0,1.0,0.2)

#10x10の0詰め行列の準備
Z=np.zeros((10,10))

#重み行列
#中間層(2x2)
w_middle=np.array([[-4.0,-4.0],
                   [4.0,-4.0]])
#出力層(2x1)
w_out=np.array([[1.0],[-1.0]])

#バイアス行列
#中間層
b_middle=np.array([3.0,-3.0])
#出力層
b_out=np.array([0])

#中間層の実装
def middle_layer(x,w,b):
  u=np.dot(x,w)+b#線形変換
  return 1/(1+np.exp(-u))#非線形変換(シグモイド関数)

#出力層の実装
def out_layer(x,w,b):
  u=np.dot(x,w)+b #線形変換
  return u #非線形変換(恒等関数）

#ニュートラルネットワークの実装
for i in range(10):
  for j in range(10):

    #入力層
    inp=np.array([X[i],Y[j]])
    #中間層
    mid=middle_layer(inp,w_middle,b_middle)
    #出力層
    out=out_layer(mid,w_out,b_out)

    #出力データの格納
    Z[j][i]=out[0]

#グリッド表示
plt.imshow(Z,"gray",vmin=0.0,vmax=1.0)
plt.colorbar()
plt.show()
```

##出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246864/f02a4d70-37d8-4a41-1312-65dfa5d380c5.png)

##補足
・ブロードキャスト(サイズの異なる行列の演算）

```Python
a=np.array([[1,1],[1,1]])#2x2の行列
b=np.array([1,2])#一次元配列
c=np.array([[1],[2]])#2x1の行列

print(a+b)
print(a+c)
>>>
[[2 3]
 [2 3]]
[[2 2]
 [3 3]]
```

・行列同士の積(一般的に、MxHの行列とHxNの行列の積の結果はMxNの行列となる）

```Python
x=np.array([[2,3],[1,2],[5,6]])#3x2の行列
y=np.array([[3,3,2],[3,7,9]])#2x3の行列
print(np.dot(x,y))#3x3の行列が出力される
>>>
[[15 27 31]
 [ 9 17 20]
 [33 57 64]]
```

・行列の初期化(0詰め行列と1詰め行列の生成）

```Python
np.zeros((2,3))
>>>
array([[0., 0., 0.],
       [0., 0., 0.]])
```

```Python
np.ones((2,3))
>>>
array([[1., 1., 1.],
       [1., 1., 1.]])
```

##関連記事
[ニュートラルネットワーク(重みとバイアス)](https://qiita.com/sama1017/items/fb171d2763c0398b5c0d)
仮想化とはなんぞや

1.仮想化って？仮想マシン？ 
手では触れないPCをPCの中に作る。そんなイメージ 
仮想化されてできた仮想の機器のことを「仮想マシン」「Virtual machine 」略して「VM」などと言う 
 
 
2.仮想化の特徴は？ 
物理を超える性能は出せない 
「仮想化」そのものにも力（物理マシンのリソース）を使ってしまう 
しかし 
実際の複数の機器を束ねて１つの大きな機器のように管理できる 
そのため機器や部品同士の無駄を少なくできる 
 
 
3.仮想マシンの正体 
実体はファイル 
仮想マシン自身は物理的な機器だと思い込んでいる 
幽霊みたいなもの 
 
 
4.物理と論理 
仮想化でよく目にするのは「物理」と「論理」 
 
「物理」はそのまま、実際にどうなっているかを指している 
仮想マシンの実体はファイルで、機器は増えていない 
現実、と言い換えると理解しやすい 
 
「論理」機器の中での動き？を指している 
仮想とはいえ機器が増えてる、と思い込んでる 
想像、理想、などと言い換えてもおk 
 
仮想化を理解するには
今、物理ではどうなっているか、論理ではどうなっているかを意識すると少し楽になる 
 
 
5.仮想化するには？ 
手持ちのPCで行うなら「仮想化専門家」の手を借りる。 
その専門家のこと「ハイパーバイザ」と言い、その中でも「ホストハイパーバイザ」を使うことで手持ちのPCの中に仮想マシンを作り出せる 
 
VirtualBox、 VMware Playerなどがある 
気になる人は「Type2ハイパーバイザー」でググってみよう 
 
 
6. 
ここも解説しています。わかりやすい 
https://pfs.nifcloud.com/navi/beginner/virtualization.htm
AWS CLIの操作対象を確認

# 前提
プロジェクト用と勉強用などAWSアカウントを2つ持っている状態で
１つのPCから操作している場合に現在どのAWSアカウントに対して操作をしているのかを確認したいという前提です。

# AWS CLIがどのアカウントを見ているかを確認
以下のコマンドでAWS CLIが現在どのアカウントを操作しているかを確認できます。

```getcallaws.sh

$ aws sts get-caller-identity

```

以下のコマンドでs3のリストが表示されるのでそれとAWSコンソールを照らし合わせることで確認もできます。

```s3ls.sh

$ aws s3 ls

```

# 仕組み
どのAWSアカウントを使うかというのは何段階かで判断しているようです。オプションが無い場合
macであれば~/.aws/credentialsにファイルが生成されていて開いてみると以下のような記述があります。

```~/.aws/credentials

[default]
aws_access_key_id=EXAMPLEEXAMPLEEXAMPLEEXAMPLE
aws_secret_access_key=EXAMPLEEXAMPLEEXAMPLEEXAMPLEEXAMPLE
[account1]
aws_access_key_id=ACCOUNT1ACCOUNT1ACCOUNT1ACCOUNT1
aws_secret_access_key=ACCOUNT1ACCOUNT1ACCOUNT1ACCOUNT1ACCOUNT1

```
これによりアカウントを判断しているようですね。

# コマンドオプションとして指定することも可能です
またコマンドオプションとして指定してawsアカウントを切り替えて実行することもできます。

```profile

$ aws s3 ls --profile account1

```

このようにすると~/.aws/credentialsのaccount1の情報を元にコマンドが実行されます。

~/.aws/credentialsとコマンドオプションで指定された値の優先順位は以下のページのように判断されるとのことでした。
[構成設定と優先順位](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-precedence)

環境変数を使用することもできました。
[環境変数を使う](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html)
.bash_profileなどに書き込んで適用された場合は明示的にunsetで削除するのを忘れないよう注意です。

# 注意点
eb cliなどサービスごとのCLIツールはまた独自にどのアカウントかを判断しているのでこのAWS CLIが必ず引き継がれるわけではありませんでした。
Xcode 13 SwiftUI New Projectで「Life Cycle」消えた

![2021-09-121154.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933235/bc71ab08-5406-7244-53a8-526f722ea1fc.gif)

# Xode 12のNew Projectにあった Life Cycleの項目がXcode13ではのぉなっとる
![2021-09-1212.01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933235/bc26ced3-48d8-f388-e92e-dba41ac48845.gif)
↑これ[``Xcode 13``](https://developer.apple.com/jp/xcode/)は ［Life Cycle］項目があらへん

「[`AppDelegate.swift`](https://mjeld.com/xcode-12macos-swiftui-app-appdelegate/)」なしでいかなあかんか

``` swift
@main
struct hoge: App {
```
ここからいかなあかんのか

[@NSApplicationDelegateAdaptor](https://mjeld.com/xcode-12macos-swiftui-app-appdelegate/)でなんとかからかまへんのやけどな
macOSアプリの場合、結局[NSWindows](https://developer.apple.com/documentation/appkit/nswindow)をさわらなあかんし「[`AppDelegate.swift`](https://mjeld.com/xcode-12macos-swiftui-app-appdelegate/)」てきなやつはいるわな
SDKとAPIって結局何？

#本記事について
本記事は、SDKとAPIに関してまとめた記事です。
筆者の備忘録的な位置付けで作成したものであり、誤り等ある可能性ございます。
もし気づかれた方は、お手数ですが、ご連絡いただけますと幸いです。

#SDKとは
`Software Development Kit`の略。ソフトウェア開発キットのこと。
本来であれば、何かアプリケーションを作る際にはゼロから作り上げていくべきところを、<font color="red">必要な文書やプログラムがパッケージされたSDKを使用することでその手間を省く</font color="red">ことができる。

また、既存のソフトウェアに追加できる。


#SDKの例
Windows SDK、iOS SDK、FBX Software Developer Kit、　Unreal Development Ki

#APIとは
`Application Programming Interfaceの略。`
<font color ="red">ソフトウェアの機能を共有できる仕組み</font color="red">のこと。
FacebookやGoogleアカウントを使用したログイン機能などもこれに該当する。

要は、アプリの機能を使えるように、`誰でも入れる玄関作っておきますよ〜、使いたかったらルールに従って許可したもの取っててね〜`的な感じで理解した。


#APIの例
こちらのサイトに例が貼り付けられているの、よければご覧ください。

https://www.sejuku.net/blog/7278

#両者の違い
結局、`何が違うの？`のと感じた方が多いのではないかと思う。
APIの説明時に使用した例を思い出してほしい。
いくらインターフォンを鳴らして家に入ろうとしても、他人の家なので作法がわからない。
靴は脱ぐのか、履いたままでいいのか、訪ねる前に連絡を入れないといけないのかetcその家ごとにクリアしなければならない条件がある。

即ち、`API`は、開発されているアプリケーションが様々な言語で記述されている可能性があるため、きちんと思った通りの挙動を得られるのかどうかが不明である。

先程の例で言うところの、<font color="red">家ごとのルールが異なる</font color="red">のである。

この問題を解決するのが、SDKである。
SDKは<font color="red">よそアプリの機能を、自分の使用している言語でも使えるようにしてくれる超便利な22世紀の犬型ロボット</font color="red">である。

これが違い。

じゃあ、SDKだけでいいじゃん！っていうのは、少し長くなるかもしれないので、次の機会に書かせていただけたらと思います。

#最後に
最後までお読みいただきありがとうございました。
皆様のお力になれましたら幸いです。
MS-Windows 3.1のアプリを開発

Open WatcomでWindows 3.1アプリを作ってみました。Windows 3.1は16Bitのアプリケーションでした。95以降は32Bitになっています。

いろいろ検索してみたところ、

http://blog.ssokolow.com/archives/2017/10/19/useful-info-on-win16-targeting-compilers-and-a-list-of-resources/

が見つかり以下のページにたどりつきました。

https://www.transmissionzero.co.uk/computing/win16-apps-in-c/

githubにソースがあります。

forkしてOpen Watcomのwmake用のファイルを用意しました。

https://github.com/yamori813/Win16-Example-Application

いつものようにOpen Watcom V2のLinuxのELFバイナリーをFreeBSDのLinuxエミュレーションで使います。パスを通してWATCOM環境変数を設定するだけでOK牧場です。（後日追記：procfsも必要でした）

```
% wmake
Open Watcom Make Version 2.0 beta Jun  1 2021 00:24:31 (64-bit)
Copyright (c) 2002-2021 The Open Watcom Contributors. All Rights Reserved.
Portions Copyright (c) 1988-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
        wcc -zW -I"/usr/home/hiroki/watcom/h" -I"/usr/home/hiroki/watcom/h/win" -zq -oaxt -d2 -w8 -fo=.obj AboutDlg
AboutDlg.c(6): Warning! W303: Parameter 'lParam' has been defined, but not referenced
        wcc -zW -I"/usr/home/hiroki/watcom/h" -I"/usr/home/hiroki/watcom/h/win" -zq -oaxt -d2 -w8 -fo=.obj MainWnd
        wcc -zW -I"/usr/home/hiroki/watcom/h" -I"/usr/home/hiroki/watcom/h/win" -zq -oaxt -d2 -w8 -fo=.obj WinMain
WinMain.c(10): Warning! W303: Parameter 'lpCmdLine' has been defined, but not referenced
        %create Win16App.lnk
        wlink @Win16App.lnk
        wrc -I"/usr/home/hiroki/watcom/h/win" Resource.rc Win16App.exe
Open Watcom Windows and OS/2 Resource Compiler
Version 2.0 beta Jun  1 2021 00:34:51 (64-bit)
Copyright (c) 2002-2021 The Open Watcom Contributors. All Rights Reserved.
Portions Copyright (c) 1993-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
```

最初自力でmakefileを作ろうとしたのですが、オプションとかいろいろわからなかったので、Open Watcomのディレクトリにあるsamples/win/alartのwin16のビルドを参考にしました。

出来上がったEXEはPC-9801FA2のMS-Windows 3.1で動きました。

![WIN16APP (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b7499941-c374-27a1-8c69-96dc91721bf6.jpeg)

Windows 7にもある画面キャプチャ機能のプリントスクリーンはWindows 3.1にもあってPC-9801のPrt ScキーはCOPYキーでAltはGRPHキーです。コピーしたものをペイントブラシにはって、サイズを調整してWindows 7にもってきて、JPEGで保存しなおしました。

Open Watcomすんばらしいです。

こちらにもWin16のプログラムを作られた方がいました。

https://qiita.com/Stosstruppe/items/7b4451db7df5eef88deb

MSVCよりOpen Watcomの方が簡単に使えると思います。

ちなみにWindows 3.0Aで試したら動きませんでした。

![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/0f9493b2-ca3c-5798-7939-2844d984c8a2.png)

もちろんWindows 3.1(Win16)のバイナリはWindows 95(Win32)では動きません。ソースコードレベルでは互換があるようですが、今となって考えるとよくやったもんだと思います。ただWindows 95のバイナリはWindows 7の32Bit環境までだいたい動いていたわけでそこはすごいと思います。
var count by remember { mutableStateOf(0) } の意味

この記法の意味と、以下のような import 文を記述しなければならない理由がわからなかったので、これらの意味を調べていく。

```kotlin
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
```

### `var ... by ...` とは

[委譲プロパティ](https://kotlinlang.org/docs/delegated-properties.html)と呼ばれるもの。この構文を使うためには、`Foo` クラスに `getValue(Nothing?, KProperty<*>): T` と `setValue(Nothing?, KProperty<*>, value: T)` を実装する必要がある。

```kotlin
import kotlin.reflect.KProperty

class Foo {
  operator fun getValue(a: Nothing?, b: KProperty<*>): Int {
    return 1
  }
  operator fun setValue(a: Nothing?, b: KProperty<*>, value: Int) {
  }
}

fun main() {
  var foo by Foo()
  println(foo)  //=> 1
  foo = 2
  println(foo)  //=> 1
}
```

`foo` は Int 型にも関わらず、式評価時と代入時には `getValue()` と `setValue()` が実行される。プロパティに似ている。

まとめると、次のような構造をしていることがわかる。

```golang
var foo/* 変数名 */ by Foo()/* getValueとsetValueを持つオブジェクト */
```

### `var count by remember { mutableStateOf(0) }` とは

これを `var count by remember { mutableStateOf(0) }` に当てはめる。

* `count` : 変数名
* `remember { mutableStateOf(0) }` : `getValue`と`setValue`を持つオブジェクト

`remember { mutableStateOf(0) }` は `MutableState<Int>` 型のインスタンスを返す関数の呼び出しである。`MutableState<Int>` とそのインタフェースである `State<T>` はそれぞれ次のように定義されている。

```kotlin
package androidx.compose.runtime

@Stable
interface State<out T> {
    val value: T
}

@Stable
interface MutableState<T> : State<T> {
    override var value: T
    operator fun component1(): T
    operator fun component2(): (T) -> Unit
}
```

`var count by remember { ... }` といった記述を行うために必要な `getValue` と `setValue` の定義が見当たらない。これらのメソッドは拡張関数として定義されている。

```kotlin
package androidx.compose.runtime

@Suppress("NOTHING_TO_INLINE")
inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value

@Suppress("NOTHING_TO_INLINE")
inline operator fun <T> MutableState<T>.setValue(thisObj: Any?, property: KProperty<*>, value: T) {
    this.value = value
}
```

よって、`var count by remember { ... }` と書くためには次の import 文を追加する必要がある。

```kotlin
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
```

## まとめ

* `var A by B` という記法は[委譲プロパティ](https://kotlinlang.org/docs/delegated-properties.html#providing-a-delegate)と呼ばれるもので、`B` は `getValue` と `setValue` を持つオブジェクトでなければならない
* `remember { mutableStateOf(0) }` は `MutableState<T>` 型のインスタンスを返すが、この型とそのインタフェースである `State<T>` 自体には `getValue` と `setValue` の定義が含まれていない。これらは拡張関数として定義されており、`androidx.compose.runtime.getValue` と `androidx.compose.runtime.setValue` をインポートすることで使えるようになる
【Kotlin】カードを配る

「[これが10分でできない人は自分がかなりプログラミングができないというつらい事実を認識しましょう。](https://qiita.com/hisui@github/items/b47c411437d60440a605)」を Kotlin でやってみた。

## 解答

```Kotlin
fun deal(playerCount: Int, cards: String): List<String> {
    // 各プレイヤーの手札
    val hands = List(playerCount) { StringBuilder() }

    cards.windowed(playerCount, playerCount) // 余りを無視するため、chunked ではなく windowed を使う。
        .forEach { chunk -> // ここから各プレイヤーに1枚ずつ渡す。
            hands.forEachIndexed { index, hand ->
                val card = chunk[index]
                hand.append(card)
            }
        }

    return hands.map { it.toString() }
}
```

## 別解（関数型プログラミング的解答）

ちょっと分かりにくい。

```Kotlin
fun deal(playerCount: Int, cards: String): List<String> =
    cards
        .dropLast(cards.length % playerCount) // 余りを除く。
        .withIndex()
        .groupBy(
            { it.index % playerCount }, // カードを誰(※)に配るか。※プレイヤーのインデックス（Int型）
            { it.value } // カード（Char型）
        )
        .map { it.value.joinToString("") }
        // ↑ではカードの枚数が人数未満だった場合にはリストが空になる。
        // そのため↓で人数分の空文字列を持つリストに差し替える。
        .takeIf { it.isNotEmpty() }
        ?: List(playerCount) { "" }
```

／以上
保守運用の際に既存メソッドの定義場所を調べるメソッド[Ruby, Rails]

## 想定

1. 既存のアプリの改修を担当することになった
2. 独自に定義されているメソッドについて、どこで定義されているか知りたい

## 結論

**メソッドがどこで定義されているか調べるメソッド**

```ruby
method("メソッド名").source_location
#=> ["/Users/user_name/dir1/dir2/app/helpers/application_helper.rb", 78]
# これが定義場所
```

## 使い方

このメソッドは、`binding.pry`を用いたデバッグ中やrailsコンソール時などに用いることが可能です。（恐らく

以下では、`binding.pry`を用いたデバッグを用いて、メソッドの定義場所を調査しています

```html:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
	<head>
		:
	</head>
	<body>
		<%= flash_messages %>
		<% binding.pry %>
		<%= yield %>
		<%= javascript_include_tag 'application' %>
	</body>
</html>
```

```shell:サーバー内にて
Frame number: 0/114

From: /Users/user_name/dir1/dir2/app/views/layouts/application.html.erb:209 

    207:         <%= flash_messages %>
    208:         <% binding.pry %>
 => 209:         <%= yield %>
    210:         <%= javascript_include_tag 'application' %>
    211:     

[1] pry(#<#<Class:xxxxxxxxxxxxxx>>)> method("flash_messages").source_location
=> ["/Users/user_name/dir1/dir2/app/helpers/application_helper.rb", 78]
```

## 参考

https://qiita.com/jnchito/items/fc8a61b421d026a23ffe

## さいごに

参考記事では、`'x'.method(:blank?).source_location`でメソッドの定義場所を調査されていますが、自分の環境ではうまく動作しませんでした。

また、自分が紹介した`method("メソッド名").source_location`では、アプリ内で定義されているメソッド以外を調査することはできませんでした。（なんでだろう？

### 余談ですが…

久しぶりの投稿になります。現在インターンとして、実務開発に参加してから1カ月が経ちます。
初めての開発現場はとても学びが多いですが、全然アウトプットの時間を確保できていませんでした…

これからは、自分の中でのアウトプットに対する敷居を下げ、誰に向けた記事なのか意識することで、少しずつアウトプットの時間を確保しようと思います！

最後までお読み頂き、ありがとうございました！
EJS

Node.jsの学習の備忘録と振り返りの記事です。
何かの参考になれば幸いです。
付け足しや訂正などある場合ご教授いただけると
大変嬉しく思います！！

##EJSとは
HTMLとJavaScriptのコード両方を記述できるNode.jsのパッケージ

**インストール**
npmからインストール``npm install ejs``

**JavaScript利用**
<details><summary><% %>または<%= %>でかこう</summary><div>

<% %>:ブラウザに何も表示されない（変数の定義などに使用）
<%= %>:ブラウザに表示される

```ejs
<%const items = [
{id:1,name:'じゃがいも'},
{id:2,name:'にんじん'},
{id:3,name:'玉ねぎ'},
];%>

<ul>
  <% items.forEach((item) => {%>
     <li>
       <span><% = item.id %></span>
       <span><% = item.name %></span>
     </li>
   <%]);%>
</ul>
```
</div></details>
Railsのアクションについて

基本的事項の復習。
#1. Railsにおける７つのアクション
|アクション|役割|HTTPメソッド|
|--|--|--|
|index|リソースの一覧を表示する|get|
|new|リソースの新規作成|get|
|create|リソースを新規作成して保存する|post|
|show|記録されたリソースの詳細表示|get|
|edit|リソースの編集|get|
|update|リソースの更新|patch/post|
|delete|リソースの削除|delete|
#2. newとsaveの違い
newのコマンドはリソースの生成のみを行うので、このままではDBに反映するにはsaveのコマンドの実行も必要になる。
createは生成して保存を行うため、イメージとしてはnew+saveというアクション。
Flutter2.5のリリースノートを読んでみた

---
# :book: Flutterの記事を整理し本にしました :book:
https://zenn.dev/kazutxt/books/flutter_practice_introduction

* <font color="red"><b>本稿の記事を含む様々な記事を体系的に整理し本にまとめました</b></font>
* 今後はこちらを最新化するため、<font color="red"><b>最新情報はこちらをご確認ください</b></font>
* 30万文字を超える超大作になっています!!

---

## まとめ記事
* [Flutter系の記事のまとめ](https://qiita.com/kazutxt/items/524acb1c134015682ccf)

# はじめに
* Flutter2.5が2021/9/9にリリースされ、追加された機能が多いようだったので、整理してみました。


# 概要
* 2021/9/9にFlutter2.5がリリースされました
* Flutter2になってからは一番大きいアップデートのため変更点を情報を整理します    

# 元記事
https://medium.com/flutter/whats-new-in-flutter-2-5-6f080c3f3dc


# 重要なポイント

## Performance: iOS shader warmup, async tasks, GC & message passing
* シェーダーの性能改善(ウォームアップや非同期処理のポリシーの改善)
* メモリの再利用によるGCの削減
* DartとiOS/Android間のメッセージングの待ち時間の短縮

## Dart 2.14: formatting, language features, pub & linting out-of-the-box
* トリプルシフト演算子の復活(ビットシフト)
* Lintによる標準静的解析が利用可能

## Framework: Android full screen, Material You & text editing shortcuts
* Anroidのフルスクリーンの不具合の解消
* Material You(Googleのデザインフレームワーク)が利用可能
* フローティングアクションボタンのサイズ/テーマの更新
* ScaffoldMessengerの導入(SnackBarの上部版)
* 文字列操作のショートカットによる操作が可能
    * [API仕様](https://api.flutter.dev/flutter/widgets/DefaultTextEditingShortcuts-class.html)

## Plugins: camera, image picker & plus plugins
* カメラプラグインの改善(オートフォーカス、露出、FPSなどを扱える様になった)
* より機能が拡充されたプラスプラグインの提供(旧プラグインからは対応するプラグインへ移行を推奨)
    * [プラスプラグイン公式](https://plus.fluttercommunity.dev/)

## Flutter DevTools: performance, Widget inspector, & polish
* DevToolsのさらなる改良
* アプリのレンダリングやシェーダーの情報をタイムラインでライブで表示可能
* Widgetのインスペクタ機能の改良

## IntelliJ/Android Studio: integration tests, test coverage, and icon previews
* IntelliJ/AndroidStudioの統合テストのサポートの強化とアイコンプレビュー機能の追加

## Visual Studio Code: dependencies, Fix All, and Test Runner
* **Dart:Add Dependency**と **Dart：Add Dev Dependency**コマンドの追加
    * Pubspec Assistのような機能を提供する
* **FixAll**コマンドの追加
    * 今開いているファイル全てに対して、**dart fix**コマンドを行う
    * **source.fixAll**や**editor.codeActionsOnSave**の設定を行うと、保管時のアクションで使える

* 既存のDart and Flutterテストランナーが削除され、新しいVisual StudioCodeテストランナーが採用
    * [詳細リリースノート](https://dartcode.org/releases/v3-26/)


## Tools: exceptions, new app template & Pigeon 1.0
* デバッガが接続されている場合の処理されなかった例外の取り扱い
    * [issue:17007](https://github.com/flutter/flutter/issues/17007)
* 新しいテンプレート(スケルトン)の提供
    * 今まではデフォルトでカウンタアプリでしたが、ページ遷移などを行うもう少し実用的なスケルトンが提供されます
    * `flutter create -t skeleton my_app`
* Pigeon 1.0のリリース
    * プラグイン開発などをする時に、Dart/Java/Objective-Cを相互運用するためにコードを生成するCodegenツール


## Breaking changes & deprecations
* 以下の通り重要な変更が行われました(google翻訳のため、詳細は原文や詳細を確認することをお勧めします)
    * デフォルトのドラッグスクロールデバイス
    * 非推奨のAPIはv2.2以降削除されました
    * パッケージの紹介：flutter_lints
    * ThemeDataのアクセントプロパティは非推奨になりました
    * GestureRecognizerのクリーンアップ
    * AnimationSheetBuilder.displayをcollat​​eに置き換えます
    * HTMLスロットを使用してWebでプラットフォームビューをレンダリングする
    * LogicalKeySetをSingleActivatorに移行します

* Flutter 2.5リリースでは、2020年9月に発表されたiOS8のサポートを廃止



# まとめ
* Flutter2.0の時のも性能改善がありましたが、性能はFlutterの大きな関心ごとのようで、常に改善が行われています
* DevToolsも機能拡充がめざましいです
* 開発環境の拡充やプラグインなど、Dart以外の部分の機能もどんどん使いやすくなっています
* 長らくカウンタアプリがデフォルトだったので、新しいテンプレートが使えるのは嬉しい
* 非推奨/無くなる機能には注意