OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10をMac/Linuxのように設定する．



Macユーザだったが，GPUぶん回すためにWindows使うことになった勢なので，Windowsの操作感に困っていました．[Keijiro氏のテストライブ配信](https://www.youtube.com/watch?v=DiFShrBIkN4&t=4015s)を参考にセットアップをしてみました．

## Terminalを入れる
コマンドプロンプトは使いづらいので，Windows terminalとUbunsu（terminal）を入れます．

Microsoft StoreからWindows terminalをインストールします．以下のような見た目です．
![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/23134545-0a41-0d6e-4e2e-0ac3be20e76e.png)


その後，Windows Subsystem for Linuxを[コントロールパネル]->[プログラム]->[プログラムと機能]->[Windowsの機能の有効化と無効化]をクリックし，Linux用Windowsサブシステム]を**オン**にする．

![WSL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/2d8b0a1e-58ff-e101-a2cc-13bc2b123008.png)

![abc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/4a0d8066-ceea-00ab-ecfd-26938374103b.png)


次に，Microsoft StoreからUbuntuをインストールし，完了したらWindows Terminalで以下のようにタブからUbuntuを設定する．設定項目からデフォルトをUbuntuにすると便利．

![aaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/f844010d-a77f-2be6-e074-4577e9766c01.png)

![bbbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/63f1c60e-e294-c397-da59-41de0899c4d9.png)

## 複数Window移動

Windows 10ではどうやらMacのように複数枚の画面を管理できるようになっているらしく，Ctrl + Windowsボタン + 方向キーで移動できるようだ．相変わらずパクリ大好きなWindowsさんですね．

![windows.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/28fac559-1911-0d5b-8dae-4262e7c63022.png)

## 最後に

発見があれば，なるべくアップデートかけていく予定です．

- [Twitterアカウント](https://twitter.com/supertask_jp)
- [YouTubeアカウント](https://www.youtube.com/c/TasukuTAKAHASHI)
Swift if let guard let の使い分け

Swiftのif let guard let とは
---

```swift
//guard let
guard let safeData　= data　else { return }

//if let
if let safeData = data {
//値が入っていたときの処理を行う。
} else {
//nilだった場合の処理を書く
}
```

If let … もしnilでなければ、何か処理をする時
guard let … もしnilだったら処理をする

基本、どちらもオプショナルバインディングができるが、```guard let```はnilだったら問答無用で先に進ませない使い方が多い。
```if let```は値がnilの場合でも処理を書く事が多い。
MySQLでINTERSECTやEXCEPT(MINUS)をJOINを使用せず代替する方法

# サンプルデータ
```SQL
CREATE TABLE T1(ID int, COL1 char(1), COL2 int);
CREATE TABLE T2(ID int, COL1 char(1), COL2 int);
CREATE TABLE T3(ID int, COL1 char(1), COL2 int);

INSERT INTO T1(ID, COL1, COL2)
VALUES
    (1, 'A', 1),
    (2, 'A', 1),
    (3, 'A', 2),
    (4, 'A', 3),
    (5, 'A', 3),
    (6, 'A', 4),
    (7, 'A', 5),
    (8, 'A', null),
    (9, 'B', null);

INSERT INTO T2(ID, COL1, COL2)
VALUES
    (1, 'A', 2),
    (2, 'A', 2),
    (3, 'A', 3),
    (4, 'A', 3),
    (5, 'A', 4),
    (6, 'A', 5),
    (7, 'B', null);

INSERT INTO T3(ID, COL1, COL2)
VALUES
    (1, 'A', 3),
    (2, 'A', 3),
    (3, 'A', 4),
    (4, 'A', 6),
    (5, 'B', null);
```


**T1**

| **id** | **col1** | **col2** |
| ------ | -------- | -------- |
| 1      | A        | 1        |
| 2      | A        | 1        |
| 3      | A        | 2        |
| 4      | A        | 3        |
| 5      | A        | 3        |
| 6      | A        | 4        |
| 7      | A        | 5        |
| 8      | A        | (null)   |
| 9      | B        | (null)   |

**T2**

| id   | col1 | col2   |
| :--- | :--- | :----- |
| 1    | A    | 2      |
| 2    | A    | 2      |
| 3    | A    | 3      |
| 4    | A    | 3      |
| 5    | A    | 4      |
| 6    | A    | 5      |
| 7    | B    | (null) |

**T3**

| id   | col1 | col2   |
| :--- | :--- | :----- |
| 1    | A    | 3      |
| 2    | A    | 3      |
| 3    | A    | 4      |
| 4    | A    | 6      |
| 5    | B    | (null) |

# 積集合(INTERSECT)
## postgreSQLでは
```SQL
SELECT COL1,COL2 FROM T1
INTERSECT
SELECT COL1,COL2 FROM T2
INTERSECT
SELECT COL1,COL2 FROM T3
```
**結果**

| col1 | col2   |
| :--- | :----- |
| A    | 3      |
| A    | 4      |
| B    | (null) |

## MySQLでは

```SQL
SELECT COL1,COL2
FROM (
    SELECT 
      1  -- 各テーブルのレコードをユニークにするためのコード
    , 1 AS CNT
    , COL1, COL2 FROM T1
    UNION
    SELECT 2, 1, COL1, COL2 FROM T2
    UNION
    SELECT 3, 1, COL1, COL2 FROM T3
    ) AS T
GROUP BY COL1, COL2 
HAVING SUM(CNT) = 3  -- 対象のテーブル数を指定
              -- T1,T2,T3すべてに存在すれば合計で3になる
```
**結果**

| col1 | col2   |
| :--- | :----- |
| A    | 3      |
| A    | 4      |
| B    | (null) |





# 差集合(EXCEPTやMINUS)
## postgreSQLでは
```SQL
SELECT COL1,COL2 FROM T1
EXCEPT
SELECT COL1,COL2 FROM T2
EXCEPT
SELECT COL1,COL2 FROM T3
```

**結果**

| col1 | col2   |
| :--- | :----- |
| A    | 1      |
| A    | (null) |

## MySQLでは
```SQL
SELECT COL1,COL2
FROM (
    SELECT 
      1  -- 各テーブルのレコードをユニークにするためのコード
    , 1 AS CNT
    , COL1, COL2 FROM T1
    UNION
    SELECT 2, -1, COL1, COL2 FROM T2
    UNION
    SELECT 3, -1, COL1, COL2 FROM T3
    ) AS T
GROUP BY COL1, COL2 
HAVING SUM(CNT) = 1 
              -- T2,T3に存在すれば1未満になります
```

**結果**

| col1 | col2   |
| :--- | :----- |
| A    | 1      |
| A    | (null) |

# 応用記事

https://qiita.com/takahasinaoki/items/831b9dfc6187fc151a4b
Linuxのターミナルで処理を長時間する時に途中でもターミナルを終了できる方法

# 端末を閉じたりログアウトしたりしても処理を継続させる方法

処理時間が長い処理を走らせる時などで、ターミナルやリモート接続で実行してても途中でターミナルを終了させたり接続が切れても処理を継続できる方法をメモしておく。

## 実行時に設定する

コマンドとしては``nohup``を使う。

```:実行時にターミナルが閉じたりしても実行を続行させる
$ nohup コマンド &
```

コマンド実行時に端末が閉じたりログアウトすると、実行中のプロセスにHUPシグナルが送られ、そのままプロセスも終了する。特にリモートで接続していると接続が切れたり長時間接続し続けないといけないので大変。なのでHUPシグナルを無視して実行し続けるnohupコマンドを使う。

実行時に``&``をコマンドの後ろに付けるだけでも大丈夫な場合もあるが、使っているシェルの種類にもよるのでこちらが安定かな。

## 実行した後に設定する

実行時に``nohup``コマンドを忘れたり、実行後に長時間かかることが分かって、後からHUPシグナルを無視して実行してほしい時に設定する方法。

1. ``ctrl+z``で対象のプロセスを一時停止する。
2. バッググラウンドで``bg``コマンドで一時停止したプロセスを再開させる。
3. ``disown``コマンドを使い、ジョブテーブルから対象のプロセスを削除する。

```:1はプロセス番号
$ bg 1
$ disown %1
```

**以上**
ServerlessFrameworkを利用したLambdaでデバッグを実施する。

###記事作成に当たって
最近、Serverless Frameworkを利用してLambdaにNode.jsをデプロイしている。Serverless Frameworkはテンプレートも充実してるし、CI/CDの面でも優れているのでなかなか便利。だけど、デバッグのやり方がわからなくて困っていた。どうにか、簡単にデバッグをできないかなぁと思って、試行錯誤する中でデバッグ環境ができあがったので、記事にして共有します。

###構築時の環境情報
端末:Mac
エディタ：VsCode
node:v14.17.4(versionが古いと)
npm:7.20.5

###パッケージの環境構築

```:packageのインストール
~/develop/study/serverless $ serverless create -t aws-nodejs-typescript -n debug_lambda -p debug_lambda
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/kawamurakouji/develop/study/serverless/debug_lambda"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v2.53.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs-typescript"
~/develop/study/serverless $ cd debug_lambda 
~/develop/study/serverless/debug_lambda $ yarn add serverless-offline

```

```yml:serverless.tsにpluginを追加
  plugins: ['serverless-webpack','serverless-offline'],
```

###vscodeの設定変更
.vscodeのディレクトリ配下にlaunch.jsonを作成する。

```shell:launch.jsonの追加
~/develop/study/serverless/debug_lambda $ mkdir .vscode
~/develop/study/serverless/debug_lambda $ cd .vscode 
~/develop/study/serverless/debug_lambda/.vscode $ code  launch.json
~/develop/study/serverless/debug_lambda/.vscode $ ls
launch.json
```

```json:launch.json
{
    "configurations": [
      {
        "name": "Lambda",
        "type": "node",
        "request": "launch",
        "runtimeArgs": ["--inspect", "--debug-port=9229"],
        "program": "${workspaceFolder}/node_modules/serverless/bin/serverless",
        "args": ["offline"],
        "port": 9229,
        "console": "integratedTerminal"
      }
    ]
}
```
###ブレークポイントの作成
止めたい箇所の横にブレークポイントを設定する。

<details><summary>ブレークポイントの設定ができない場合</summary><div>
Code→基本設定→設定の順に押下する。
![スクリーンショット 2021-08-06 20.50.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/6c8bf76a-5afa-35c8-5a38-df2aba9d955b.png)
「allowBreakpointsEverywhere」で検索する。
![スクリーンショット 2021-08-06 20.51.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/e8866023-7b4f-26b2-0ff7-16562ffd59cd.png)
</div>
</details>

###デバッグ方法
![スクリーンショット 2021-08-06 20.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3c037bb6-30a4-a2c5-6c38-0d2a0a6a9657.png)

![スクリーンショット 2021-08-06 21.12.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/b2dfde33-d77b-8cd3-ae48-d63d4fcf0386.png)
サーバの待受状態が完了。ここで、curlコマンドを実行する。

デバッグが完了！！！格納された中身を確認することもできています。
![スクリーンショット 2021-08-06 21.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/ef86b4ee-0e17-4ce5-11f1-b31043b12548.png)
この拡張子はどんなファイル?

Qiita初投稿。
一応投稿してみただけで、ほぼ自分用。
あんまり使えんと思う...

新しいのを発見したらどんどん追加していくよ。
二つ以上の意味があるものは、①②のような丸数字で区別しているよ。
意味が分からなくても、とにかく発見したらどんどん追加していく。
##A
**.arc**
不明
##B
**.bat**
バッチファイルの、Windows 9x系 でよく使用されていた方。(しかし、Windows 10には対応)
(ちなみに、.comは Windows NT系 で使用されている)
コマンドプロンプトのコマンドをこのファイルに記述し、上からコマンドを実行していく。
**.bin**
バイナリファイル。数字の羅列のファイル。
##C
**.com**
windowsバッチファイル。windows NT系で使用されている...はずなのだが、私の環境(ちゃんとWindows 10)だとなぜか実行出来なかった。.batは問題なく実行される。
**.conf**
不明
**.cpp**
プログラミング言語C++のソースファイル。
中身はテキストデータ。
**.cs**
プログラミング言語C#のソースファイル。
中身はテキストデータ。
##D
**.dll**
不明
**.dsy**
不明
##E
**.exe**
①プログラムファイル(実行可能ファイル)。
②自己解凍ファイル。圧縮ファイル。アーカイブファイル。
##F
##G
##H
**.htm**
HTMLファイル。「.htm」と「.html」は同じ。
**.html**
HTMLファイル。
webサイトはこのファイルを元にできている。
中身はテキストデータ。
##I
**.ico**
アイコンファイル。中身は画像。
**.ini**
設定ファイル。設定値が記録されている。
**.iso**
ディスクイメージファイル。
光学ディスクを1つのファイルにしたもの。
##J
**.json**
不明
##K
##L
**.log**
ログファイル。中身はただのテキスト。
##M
**.mp3**
音楽のファイル。
##N
##O
##P
**.pdf**
PDFファイル。
**.ps1**
PowerShellの命令文をまとめたファイル。
PowerShellで実行出来る。
##Q
##R
##S
**.sln**
Visual Studioのソリューションファイル。
このファイルをダブルクリックする事で、開発の続きを始めることが出来る。
**.sys**
システムファイル。システムに関係するファイル。
エクスプローラーで見つけたら、あんまり手出さん方がいいファイル。
##T
**.txt**
ただのテキストファイル。
##U
##V
**.vbs**
プログラミング言語VBScriptのソースファイル。
中身はテキストデータ。
##W
**.wad**
不明
##X
**.xlam**
Excelのアドインのファイル。
**.xlsm**
マクロ付きExcelファイル。
**.xlsx**
Excelのファイル。
**.xml**
xmlファイル。
中身はテキストデータ。
##Y
##Z
**.zip**
zipファイル。アーカイブファイル。圧縮ファイル。
##数字
**.7z**
7z形式の圧縮ファイル。アーカイブファイル。zipよりも圧縮率が高い。
DockerのPHP公式コンテナを拡張してComposerとlaravelインストーラーをインストールする

# dockerfile
```dockerfile
FROM php:7.4-apache
RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    vim \
    libonig-dev \
    libzip-dev
RUN docker-php-ext-install \
    pdo_mysql \
    mysqli \
    mbstring \
    zip
RUN apt-get install -y curl git unzip

# https://getcomposer.org/download/ に差し替える
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
# https://getcomposer.org/download/ に差し替える ここまで

# mvでなぜかディレクトリが作成されてしまうのでシンボリックリンクを貼る
RUN mv ./composer.phar $(dirname $(which php))
RUN chmod +x $(dirname $(which php))/composer.phar
RUN ln -s $(dirname $(which php))/composer.phar /usr/bin/composer
RUN composer global require laravel/installer
RUN a2enmod rewrite

ENV PATH $PATH:/root/.composer/vendor/bin
```

# 実行

```
$ docker compose build
$ docker compose up -d
$ docker compose exec php sh
# laravel new stock               

 _                               _
| |                             | |
| |     __ _ _ __ __ ___   _____| |
| |    / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V /  __/ |
|______\__,_|_|  \__,_| \_/ \___|_|
```

# 参考

https://readouble.com/laravel/8.x/ja/installation.html

https://getcomposer.org/download/
hubコマンドでプライベートリポジトリにパスワードなしで飛ぶ設定

# 背景及び実現したいこと
[hubコマンド](https://github.com/github/hub)にはbrowseというサブコマンドがある。
このサブコマンドは、リポジトリの上に存在するときに対応するgithubのリポジトリをブラウザで表示してくれるものである。
ただしプライベートリポジトリなどの場合は当然ながらユーザ名およびパスワードが聞かれる。

```bash
$ hub browse
github.com username: YOUR_NAME
github.com password for YOUR_NAME(never stored):
```
※上記および以降で出現する文字列 `YOUR_NAME` と `YOUR_PASSWORD` は各々のgithubのユーザ名およびパスワードに変換してください。
この入力を省略する方法が無いか調べた。

# 方法
[hubのマニュアル](https://github.com/github/hub/blob/c8e68d548a39ec0fab6f674a669c21b54d4eec61/share/man/man1/hub.1.md#github-oauth-authentication)に2パターン書かれていたので紹介する
## 方法1. $HOME/.config/hub を作成する
hub用の設定フィアルを作る。
参考:https://github.com/github/hub/issues/225#issuecomment-414630699

```yaml:$HOME/.config/hub
github.com:
- user: YOUR_NAME
  oauth_token: YOUR_PASSWORD
  protocol: https
```

## 方法2. 環境変数を使う
環境変数 `GITHUB_USER` と `GITHUB_PASSWORD` を設定しても良い（らしい）。

```bash
$ export GITHUB_USER="YOUR_NAME"
$ export GITHUB_PASSWORD="YOUR_PASSWORD"
```

上記で「らしい」と書いた理由は、環境変数でユーザ名とパスワードを指定して動作させたが、下記のようなコメントが出力されブラウザが開かなかったためである。多分何か自分がミスしているのだと思うが現時点では真因がわかっていない。

```bash
$ export GITHUB_USER="n-hachi"
$ export GITHUB_USER="MY_PASSWORD" # 正式な文字列ではない
$ hub browser
Error in browse: Not Found (HTTP 404)
Not Found
```

# まとめ
少なくとも `$HOME/.config/hub` を作成したら意図通りブラウザで開くことができた。
上でも書いたが環境変数の方はなにか間違っていると思うので追加で調べる。もしくは指摘があればコメントください。
プライベートサブネットのEC2インスタンスにSSHする

## 前提
マルチAZ構成ですでにEC2インスタンスは2つ起動済み。

## 流れ
1. キーペアをパブリックサブネット内のEC2インスタンスに保存
2. パブリックサブネットのインスタンスへSSH
3. パブリックサブネットを踏み台に、保存したキーペアを用いてプライベートサブネットへSSH

## SCPコマンド
キーペアをパブリックサブネットに保存するには、scpコマンドを使う。

```
// scpコマンドで秘密鍵（送りたいもの）を送信する
scp -i 秘密鍵 送りたいもの ユーザ名@パブリックIP:/送信先
scp -i sample.pem sample.pem ec2-user@パブリックIPアドレス:/任意のディレクトリ
```


パブリックサブネットからプライベートサブネットへSSH

```
ssh -i sample.pem ec2-user@プライベートIPアドレス
```
IT業界と、東京2020オリンピックに関する話題ハイライト

酸いも甘いも色々な気持ちになってしまう今回のオリンピックで、なるほどと思った記事の記録くらいは残しておこうと、この業界界隈 x オリンピックの話題をまとめておいたもの。硬軟なんでも。（まだ追記する目標）


## オリンピック情報システム

>計算機の歴史、システムアーキテクチャの話として「東京オリンピック情報システム（1964年）」〜日本のオンライン化の契機

という記事が掲出されていたがその後IBM社のサイトからは消えてしまった。

https://b.hatena.ne.jp/entry/s/www.ibm.com/blogs/systems/jp-ja/1964-tokyo-olympics-information-system/

以下に少し説明アリ。

http://museum.ipsj.or.jp/heritage/olympic-list.html

他[資料](https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_action_common_download&item_id=106354&item_no=1&attribute_id=1&file_no=2
)


## オリンピック・パラリンピックとICTについて

2020年を見据えた2014年頃の資料。

https://www.soumu.go.jp/main_content/000329528.pdf

## 東京五輪とワクワクIT

> 最先端の技術やサービスを提供しようとするIT企業各社の取り組み

という2017年頃の資料。

https://xtech.nikkei.com/it/atcl/column/17/032200092/


## 東京五輪・パラリンピックを支えるテクノロジー

https://xtech.nikkei.com/atcl/nxt/column/18/01188/

2020年頃の記事。


## インテルの技術

ここからは実際の今大会の技術の話。

https://robotstart.info/2021/07/20/intel-tokyo2020.html

https://japan.zdnet.com/article/35174180/



## 手書き国旗検索

https://mame.github.io/world-flag-search/ja/

## Flag Icon CSS

https://github.com/lipis/flag-icon-css

https://flagicons.lipis.dev/

## ワードクラウド

https://news.yahoo.co.jp/articles/f77ef9ebf57df9226259cbb90c2b7b03cbb72a07

https://qiita.com/miso_taku/items/b9d9912f84160899409b


## 開会式のピクトさん

https://nlab.itmedia.co.jp/nl/articles/2107/26/news131.html

https://www.itmedia.co.jp/news/spv/2107/31/news023.html

https://www.itmedia.co.jp/news/articles/2107/31/news026.html

https://qiita.com/yuikoito/items/274f926b5c5e59b43ce9


## 微笑ましいやつ

https://togetter.com/li/1751144


なんだかんだで、もうオリンピックは終盤ですね。
ゆるすぎるまとめですがお楽しみいただけたら幸いです。

## 追記

https://piyolog.hatenadiary.jp/entry/2021/08/09/070000
pyinstallerインストール ( Python3, Ubuntu 20.04 )

pythonをexe化するためのライブラリ`pyinstaller`をubuntu20.04でインストールしてみました.

その時の手順を記載します.

## 環境

```
ubuntu 20.04
```

## install

```
$ pip3 install pyinstaller
```

その後実行すると,以下のエラー発生

```
pyinstaller: コマンドが見つかりません
```

インストール先を調べる

```
$ sudo find / -name "pyinstaller"
/home/hoshina/.local/bin/pyinstaller
find: ‘/run/user/1000/gvfs’: 許可がありません
```

以下に実行ファイルがあることがわかった.```~/.local/bin/pyinstaller```

/usr/binにコピー

```
sudo cp .local/bin/pyinstaller /usr/bin/pyinstaller
```

確認 -> OK

```
$ pyinstaller -v
4.5
```

## 参考

https://www.it-swarm-ja.com/ja/linux/pyinstaller%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93/944504412/
kivy-iosで作ったプロジェクトがXcodeでビルドできない（Command PhaseScriptExecution failed with a nonzero exit code）

#　困ったこと
[kivy-ios](https://github.com/kivy/kivy-ios)で作成したプロジェクトファイルが、Xcodeでビルドしようとすると```Command PhaseScriptExecution failed with a nonzero exit code```というエラーを出して止まる。

# 環境情報
MacOS: Big Sur 11.5.1
XCode: 12.5.1
kivy-ios(toolchain): 1.2.1
Python: 3.9.4
フォルダ構造：

```
~/working_dir/
　└ MyApp/
　 　 ├ main.py
　 　 ├ main.kv
　 　 └ resources/
```
# エラーが出た方法
※ 事前準備として、Xcodeのインストールと、[2021.8.6時点の公式readme](https://github.com/kivy/kivy-ios/blob/0ef85dcdea98f79739a12ba8a3df881241de4f03/README.md)に従って、「Installation & requirements」セクションまで終わらせた。

```bash
cd ~/working_dir/MyApp/ #すべての元凶
toolchain build python3 kivy　# recipeのビルド
toolchain create toshoapp /Users/MyName/working_dir/MyApp/
open toshoapp-ios/toshoapp.xcodeproj
```
以上を行うと、XCodeが立ち上がる。ビルド（左上の▶︎）すると、10-30分後ぐらいにエラーで止まる。
（さらにエラー内容が表示されるまでに異常に時間がかかる・・・）

そして実際に発生したエラーがこちら↓↓↓↓

![エラー画像](https://i.imgur.com/BdP9tna.png)

rsyncのエラーに見える。
この時のディレクトリ構造が以下

```
~/working_dir/
　└ MyApp/
　 　 ├ main.py
　 　 ├ main.kv
　 　 ├ resources/
　 　 ├ build/ # ここから下が増えた
　 　 ├ dist/
　 　 └ toshoapp-ios/
　 　    ├　toshoapp/
　 　    ├　YourApp/
　 　    ├　LaunchImages/
　 　    ├　toshoapp/
　 　    ├　resources/
　  　 　 　├ toshoapp.xcodeproj
　 　    └　雑多なファイル類
```

# 試した右往左往
色々試した。

- main.pyが```toolchain create```の第二引数のフォルダに入っているか確かめる
- 同時に発生していたWARNING（recipeで導入したpip内のフォーマット演算子が[欠損しているみたいなエラー](https://stackoverflow.com/questions/62344188/receiving-this-error-command-phasescriptexecution-failed-with-nonzero-exit-code)を修正
- createの第二引数が悪いのかと再度チェック(https://github.com/kivy/kivy-ios/issues/381)
- google, google, google...


# 結局、解決策
[ここ](https://github.com/kivy/kivy-ios/issues/513)で議論されていた。issue探しまくった・・・
書いてある問題の原因を転記する。自分が書いたソースコードのディレクトリ（main.pyが含まれるディレクトリとその配下）で```toolchain build```や```toolchain create```を行うと、toolchainが作ったフォルダをXcodeが誤って参照しエラーが起こるらしい。

具体的には以下のようにした。
①まずrecipeを使用したライブラリのコンパイル

```bash:
cd ~/working_dir/
mkdir ./for_link/ # toolchain用の別のフォルダを作成
cd for_link
toolchain build python, kivy # 新しく作ったフォルダ内でtoolchainを利用
```
↓①の結果

```
~/working_dir/
　├ MyApp/
　│　 ├ main.py
　│　 ├ main.kv
　│　 └ resources/
　└ for_link/ #ここから下が増えた
　　　 ├ build/
　　　 └ dist/
```

②次に、Xcodeプロジェクトの生成

```bash:
toolchain create toshoapp /Users/MyName/working_dir/MyApp/
cd ~/working_dir/
mkdir ./prdct/
mv ./MyApp/toshoapp-ios ./prdct/
cd ./prdct
open toshoapp-ios/toshoapp.xcodeproj
```
↓②の結果

```
~/working_dir/
　├ MyApp/
　│　 ├ main.py
　│　 ├ main.kv
　│　 └ resources/
　├ for_link/
　│ 　├ build/
　│ 　└ dist/
　├ prdct/ #ここから下が増えた
　  　└ toshoapp-ios/
　 　    ├　toshoapp/
　 　    ├　YourApp/
　 　    ├　LaunchImages/
　 　    ├　toshoapp/
　  　 　 　├ toshoapp.xcodeproj
　 　    └　雑多なファイル類
```

以上のようにフォルダを分けることで、動かすことができました〜！

# 学び
公式のりーどみーの書き方に騙されたが、常識的に考えてビルドするのに使う作業ディレクトリはソースコードのディレクトリと分けた方が良かった。
まさかカレントディレクトリを汚すとは思わなかったが・・・・
yukicoder contest 308 参戦記

# yukicoder contest 308 参戦記

## [A 1636 森](https://yukicoder.me/problems/no/1636)

N頂点の木の辺の数は*N*-1なので、答えは(*N*-1)<sup>2</sup>です.

```python
N = int(input())

print((N - 1) * (N - 1))
```

## [B 1637 Easy Tree Query](https://yukicoder.me/problems/no/1637)

素直に部分木の頂点にコストを足してまわると *O*(*NQ*) で TLE です. 増えるコストは部分木の頂点数に*x*を掛けたものなので、最初に各部分木の頂点数を DFS で求めておけば *O*(1) でクエリに回答できます.

[ABC138D - Ki](https://atcoder.jp/contests/abc138/tasks/abc138_d)を思い出しましたが、こっちのほうがやや簡単かな.

```python
from sys import setrecursionlimit, stdin

readline = stdin.readline
setrecursionlimit(10 ** 6)

N, Q = map(int, readline().split())

links = [[] for _ in range(N)]
for _ in range(N - 1):
    a, b = map(int, readline().split())
    links[a - 1].append(b - 1)
    links[b - 1].append(a - 1)

visited = [False] * N
subnodes = [0] * N


def f(i):
    visited[i] = True
    result = 1
    for j in links[i]:
        if visited[j]:
            continue
        result += f(j)
    subnodes[i] = result
    return result


f(0)

result = []
t = 0
for _ in range(Q):
    p, x = map(int, readline().split())
    t += subnodes[p - 1] * x
    result.append(t)
print(*result, sep='\n')
```
CSVファイルのみを取り込むボタンをrailsで作る

CSVファイルの取り込みはできたのですが、CSVファイルのみを指定する挙動のコードの部分で躓いてしまったため、記事に残したいと思います。

まずはviewです。ここではファイルのimportに関するボタンを作成しています。

```erb
index.html.erb

<div class="col-md-10 col-md-offset-1">
      <%= form_tag import_users_path(format: :csv), multipart: true do %>
        <%= file_field_tag :file, class: "btn btn-default" %>
        <%= submit_tag "CSVをインポート", class: "btn btn-md btn-primary btn-width" %>
      <% end %>
    </div>
```

次にusers_controllerに次の記述を行いました。
ここでファイルの末尾に".csv"と入っているファイルとそれ以外の挙動を書きます。

```rb
def import
    if File.extname(params[:file].original_filename) == ".csv"
      flash[:success] = 'CSVファイルを読み込みました'
      User.import(params[:file])
      redirect_to users_url
    else
      flash[:danger] = 'CSVファイルを選択してください'
      @users = User.all
      redirect_to users_url
    end
  end
```

次にuser.rbモデルでimportをしたcsvファイルについての処理を記述します。


```rb
def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
      # IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成
      user = find_by(id: row["id"]) || new
      # CSVからデータを取得し、設定する
      user.attributes = row.to_hash.slice(*updatable_attributes)
      user.save
    end
  end
  
  # 更新を許可するカラムを定義
  def self.updatable_attributes
    ["id", "uid", "name", "role", "password", "password_confirmation"]
  end
```
[シリーズ 全7回] C言語の独自メモリアロケータの振り返り

# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/drafts/be9e965ac06ca1af798b/edit)」に記しているが、
13年前(=2008年) に 書籍『プログラミング言語C』(通称 K&R) をマネて実装した
「自作メモリアロケータ」の振り返りである.

|コンテンツ|実装時期|
|:--|:--|
|[[07] C言語の独自メモリアロケータの振り返り ... ソースコード全文](https://qiita.com/robozushi10/items/1a98df9262ecd5b5c300)|2008/10|
|[[06] C言語の独自メモリアロケータの振り返り ... 「メモリ解放」処理](https://qiita.com/robozushi10/items/bc39a25a0d75eb39b0ff)|2008/10|
|[[05] C言語の独自メモリアロケータの振り返り ... 「メモリ獲得」処理](https://qiita.com/robozushi10/items/04273751b36ec30c34b7)|2008/10|
|[[04] C言語の独自メモリアロケータの振り返り ... アクセッサのセットアップ](https://qiita.com/robozushi10/items/7e5e62ca92cc14816070)|2008/10|
|[[03] C言語の独自メモリアロケータの振り返り ... 「リソース申請」](https://qiita.com/robozushi10/items/affcc807b6985ab6e3bd)|2008/10|
|[[02] C言語の独自メモリアロケータの振り返り ... ファイル構成とMakefile](https://qiita.com/robozushi10/items/5f7fdcb0912dec7863d0)|2008/10|
|[[01] C言語の独自メモリアロケータの振り返り ... 概要](https://qiita.com/robozushi10/items/be9e965ac06ca1af798b)|2008/10|
Array.reduce()を使ってGSAP3 timeline.to()のチェーンを作る

JavaScriptのPromiseの使い方を解説したMDNのドキュメントに、Array.reduce()を使って複数の処理を直列的に繋げるコードが載っていて、数学のような不思議な記述形式にちょっぴり感動しました。

MDN: [Promiseを使う](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises) &mdash; [合成 (Composition)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises#composition)

なるほど。`Something.fn().fn().fn()` ...というふうにメソッドチェーンを作れるオブジェクトならこの方式が適用できるのですね。GSAP3の[Timeline](https://greensock.com/docs/v3/GSAP/gsap.timeline())も[to()](https://greensock.com/docs/v3/GSAP/Timeline/to())メソッドなどでチェーンを作れます。

早速やってみました。たとえば、4個の要素を順番にアニメーションするこのTimelineの場合、

```javascript:javascript
gsap.timeline({ defaults: {duration: 2, x: 300} })
.to('.a', {})
.to('.b', {})
.to('.c', {})
.to('.d', {});
```

これをArray.reduce()を使って次のように書き換えます。

```javascript:javascript
['.a', '.b', '.c', '.d'].reduce((tl, e) => tl.to(e, {}),
       gsap.timeline({ defaults: {duration: 2, x: 300} }));

```

サンプルはこれです。
<p class="codepen" data-height="594" data-default-tab="js,result" data-slug-hash="eYWmBKj" data-user="kaz_hashimoto" style="height: 594px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kaz_hashimoto/pen/eYWmBKj">
  Array.reduce, gsap.timeline</a> by Kazuhiro Hashimoto (<a href="https://codepen.io/kaz_hashimoto">@kaz_hashimoto</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
[06] C言語の独自メモリアロケータの振り返り ... 「メモリ解放」処理

本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/ca7c25dab3c279ba4e2b|

# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/drafts/be9e965ac06ca1af798b/edit)」に記しているが、
要は 13年前(=2008年) に K&R をマネて実装した「自作メモリアロケータ」の振り返りである.

本項では次の (7) のうち、「メモリ解放」処理について記す.

>(7) 以後、ユーザはアクセッサを介してメモリプールからメモリ獲得・解放をする

# 詳細

## (7) について 

>(7) 以後、ユーザはアクセッサを介してメモリプールからメモリ獲得・解放をする

### main.c

下記🛑での i には解放したいメモリサイズである.

```c
int
main()
{
略
#if 1
    instance = Mman_new_inst(&req);
    for(j = 0; j < 500; j++)
    {
        for(i = 0; i < 1000; i++)
        {
            buf[i] = instance->alloc(0,i); 
        }

        for(i = 0; i < 1000; i++) /* alloc よりも小さい値にするとメモリリークが確認出来る */
        {
            instance->free(0, buf[i]); // 🛑メモリ解放処理. 第1引数「0」は自身の id である
        }
    }
```

### memman.c

上記 🛑 の free の実体が下記 Mman_free である.
書籍「K&R」の free をマネた部分である.

```c
void
Mman_free(int id, void * ptr) 
{
    mman_t  * p = mman_get_rsrc(id);

    Mmc_free(id, ptr, p->functor_free);
}

```

### memman_core.c

以下は、上記 🤹 の Mman_free に進むと、下記 `mmc_free()` に繋がる.

`mmc_free()` の 第3引数が free() へのポインタである.

コード内の「`robozushi10: need sem lock`」や「`〜 unlock`」というコメントの箇所は、
<font color="darkred">それぞれ排他ロックと解放処理を加えるつもり</font>だったようである.
が,  (13年前の私は) 未実装のまま放置してしまった模様.

なお、排他制御をしている理由は、クリティカルセクション保護のためである.


```c
/* メモリ解放関数。実際には free せずにフリーリストにつなぐだけ */
static void
mmc_free(int id, void * p, void * functor)
{
    Header * bp = (Header *)p;
    Header * hp = ((Header *)p)-1;

    (void) functor;
/* robozushi10: need sem look */
    MMAN_DBP("[id:%d]mmc_free(): mmc_free(%p)\n", id, p);

    hp->s.ptr = NULL;

#ifdef DEBUG_CHK_MEMLEAK
    Mmc_debug_rm_addr((unsigned)p);
#endif /* DEBUG_CHK_MEMLEAK */
    MMAN_DBP("[id:%d]mmc_free(): call add_freelist(%p)\n", id, bp);
    add_freelist(id, (void *)bp);
/* robozushi10: need sem unlook */
}

```
aws loadbaranser controllerトラブルシュート虎の巻

## 調べるエラー
- サブネットを検出できない旨のメッセージだけれど、適切なタグを割り振っているつもり

```
{"level":"error","ts":16777773446.32888895,"logger":"controller","msg":"Reconciler error","controller":"service","name":"fluentd","namespace":"logs","error":"unable to discover at least one subnet"}
```

## クラスタにOIDCプロバイダーが存在するか確認

### クラスターの OIDC プロバイダーの URL を表示します。

```
aws eks describe-cluster -- <ClusterName> --query "cluster.identity.oidc.issuer" --output text
```

### OIDCが存在するか確認

```
aws iam list-open-id-connect-providers | grep <OIDCプロバイダーのUID的なもの>
```

#### 対応するコマンド
```
eksctl utils associate-iam-oidc-provider \
    --region <region-code> \
    --cluster <your-cluster-name> \
    --approve
```

## 適切なポリシーが割り当たっているか確認

### 最新のAWSLoadBalancerControllerIAMPolicy用のポリシーを確認する

- 少し間があくと、ポリシーの増減があったりするので、すでにポリシー作成済かと思うので作り直したり、更新したりする

```
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.3/docs/install/iam_policy.json
```

## サブネットに自動検出用のタグが割り当てられているか確認
- タグを手動で入力していたりするとタブ、スペース、改行コードなどが含まれていてコンソール画面からはぱっと見わからない場合があるので、コマンドで確認するといい

### パブリックサブネット 
```
aws ec2 describe-subnets --filters "Name=tag:kubernetes.io/cluster/cluster-name,Values=shared" "Name=tag:kubernetes.io/role/elb,Values=1" | jq '.Subnets | map(.SubnetId)'
```

### プライベートサブネット
```
aws ec2 describe-subnets --filters "Name=tag:kubernetes.io/cluster/cluster-name,Values=shared" "Name=tag:kuberne
tes.io/role/internal-elb,Values=1" | jq '.Subnets | map(.SubnetId)'
```
[05] C言語の独自メモリアロケータの振り返り ... 「メモリ獲得」処理

本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/ca7c25dab3c279ba4e2b|

# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/drafts/be9e965ac06ca1af798b/edit)」に記しているが、
要は 13年前(=2008年) に K&R をマネて実装した「自作メモリアロケータ」の振り返りである.

本項では次の (7) のうち、「メモリ獲得」処理について記す.

>(7) 以後、ユーザはアクセッサを介してメモリプールからメモリ獲得・解放をする

# 詳細

## (7) について 

>(7) 以後、ユーザはアクセッサを介してメモリプールからメモリ獲得・解放をする

### main.c

下記🛑の i は、獲得したいメモリサイズである ... ?ん、メモリプールの 4096 を超えているぞ...

```c
int
main()
{
略
#if 1
    instance = Mman_new_inst(&req);
    for(j = 0; j < 500; j++)
    {
        for(i = 0; i < 1000; i++)
        {
            buf[i] = instance->alloc(0,i); // 🛑メモリ獲得処理. 第1引数「0」は自身の id である
        }

        for(i = 0; i < 1000; i++) /* alloc よりも小さい値にするとメモリリークが確認出来る */
        {
            instance->free(0, buf[i]);
        }
    }
```

### memman.c

上記 🛑 の free の実体が下記 Mman_alloc である.
書籍「K&R」の free をマネた部分である.

```c
void
Mman_free(int id, void * ptr) 
{
    mman_t  * p = mman_get_rsrc(id);

    Mmc_free(id, ptr, p->functor_free);
}

```

### memman_core.c

以下は、上記 🤹 の Mma_free に進むと、下記 `mmc_free()` に繋がる.

`mmc_free()` の 第3引数が free() へのポインタである.

排他制御が必要だが、実装


```c

```
[04] C言語の独自メモリアロケータの振り返り ... アクセッサのセットアップ

本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/ca7c25dab3c279ba4e2b|

# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/drafts/be9e965ac06ca1af798b/edit)」に記しているが、
要は 13年前(=2008年) に K&R をマネて実装した「自作メモリアロケータ」の振り返りである.

本項では次の (4)(5)(6) について記す.

>(4) 「アクセッサ」は「動的メモリ獲得・解放」を持つ関数ポインタ「alloc」「free」を提供する.
　⬇️ 
(5) ユーザはアクセッサの関数ポインタ「alloc」と「free」に対して、任意のメモリ操作関数を設定する.
　⬇️ 
(6) ユーザはアクセッサを使って初回に必要なメモリプールを獲得する. (以後、拡張・縮小はできない).

# 詳細

## (4) について 

>(4) 「アクセッサ」は「動的メモリ獲得・解放」を持つ関数ポインタ「alloc」「free」を提供する.

### memman.h

```c
/* ユーザが使用するアクセッサ */
typedef
struct _mem_inst_t
{
    void   * (* alloc)        (int id, size_t  size); /* メモリ獲得I/F */
    void     (* free)         (int id, void  * ptr);  /* メモリ解放I/F */
    void     (* get_used_size)(void);                 /* 使用量取得I/F */
    void     (* get_rest_size)(void);                 /* 残量取得関I/F */
    int      id;
}
    mem_inst_t;
```

　

## (5) と (6) について

>(5) ユーザはアクセッサの関数ポインタ「alloc」と「free」に対して、任意のメモリ操作関数を設定する.
(6) ユーザはアクセッサを使って初回に必要なメモリプールを獲得する. (以後、拡張・縮小はできない).


### main.c

下記 🛑 が、アクセッサの構造体変数「alloc」「free」に登録したい情報を持つ構造体である.

下記 🏷️ より、アクセッサの「alloc」「free」に対して、使用したい関数ポインタを (変数`req`に) 
登録している.　ここではシステム関数である malloc と free を登録している.

下記 📋 にて、獲得したいメモリプールのサイズを定義している. ここでは 4096 = 4K である.

下記 🔐 sem は、(クリティカルセクションである) アクセッサの「alloc」「free」での排他制御である.

末尾の「`instance = Mman_new_inst(&req);`」 によって instance すなわちアクセッサが得られる.

```c
int
main()
{
    mem_inst_t     * instance = NULL;
    char           * buf[1000];
    int              i        = 0;
    int              j        = 0;
    req_mem_inst_t   req;🛑

    /* セマフォについても管理モジュールを作成し，内部で資源情報を
     * 保持すると良いが，ここでは作成していない  */
    sem_init /* セマフォの初期化 */
    (
        &Sem, /* セマフォ変数の初期化 */
        0,    /* 0：スレッドでセマフォ共有, 非0：プロセスで共有 */
        1     /* 並列処理数 */
    );

    req.functor_alloc = &malloc, 🏷️
    req.functor_free  = &free,   🏷️
    req.pool_size     = 4096,    📋
    req.key           = "main",
    req.sem           = &Sem;    🔐
    req.pshared       = 0;
    req.value         = 0;

#if 1
    instance = Mman_new_inst(&req);
```
[03] C言語の独自メモリアロケータの振り返り ... 「リソース申請」

本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/ca7c25dab3c279ba4e2b|

# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/drafts/be9e965ac06ca1af798b/edit)」に記しているが、
要は 13年前(=2008年) に K&R をマネて実装した「自作メモリアロケータ」の振り返りである.

本項では次の (1)(2)(3) について記す.

>
(1) ユーザは「動的メモリ獲得・解放」のために、直にシステム関数(例: malloc, free) は使えない.
　⬇️ 
(2) 「動的メモリ獲得・解放」を行いたい場合は、事前に「リソース申請」をしておく.
　⬇️ 
(3) 「リソース申請」が通ると、「アクセッサ」が得られる (リソース割り当てが行われる).


# 詳細

## (1) について

下記については、当時の開発現場(組み込み機器開発) のルールとして決められていた.

>(1) ユーザは「動的メモリ獲得・解放」のために、直にシステム関数(例: malloc, free) は使えない.


## (2) について

メールにて所定の書式で **"リソース管理者"** に申請していたと思う.

> (2) 「動的メモリ獲得・解放」を行いたい場合は、事前に「リソース申請」をしておく.


## (3) について

下記については次の意味である.

> (3) 「リソース申請」が通ると、「アクセッサ」が得られる (リソース割り当てが行われる).

リソース管理者が、`memrtbl[]` に対してレコードを追加する.
レコード追加し終えたら、`id` (ここでは 1)を申請者に通知する.

### memman_resource.c

```diff
 /* メモリリソーステーブル *//* 型の定義は priv_memman_std.h にて */
 #define  MMAN_RESOURCE_BOTTOM   \
     {   -1,     "",    NULL,        0,        0,      NULL,        NULL,       NULL,          0,          0,      NULL}
 
 mman_t
 memrtbl[] =
 {   
     /* [id]   [key] [sem_id] [pshared] [sem val] [instance] [alloc func] [free func] [pool size] [rest size] [position]*/
+    // 申請者「main」用のレコードをリソーステーブルに追加する.
+    // このとき申請者「main」には id = 0 が割り当てられた
+    {    0, "main",    NULL,        0,        0,      NULL,        NULL,       NULL,          0,          0,      NULL},

     MMAN_RESOURCE_BOTTOM
 };
```
ロジックICで構成するエレクトリックキーヤーの製作

約25年前、HTML手打ちで自作機器のWEBサイトを作っていました。
Geocitiesで長らく公開＆放置していたのですが、Geocities廃止と共に消えてしまいました。
何かの役に立つと思うので、当時の内容を（多少修正して）QiitaにUPします。
今見るとずいぶんわかりづらいが追って修正します。
***
当時まだPICマイコンはメジャーではなく、すべてロジックICで74シリーズで組んでいました。
さらに多数制作するためにエッチングで基板を作っていました・・・
***
#初めに
だいたい、エレクトリックキーヤーの回路なんて決まりきっています。
あとは、いかに部品点数を少なくし、ＣＭＯＳを使用し、低消費電力化します。
ユニバーサル基板で自力で配線して作るのもいいですが、ここはうまく量産できるように
フリーソフトのＫＢＡＮを使用して製作しました。これを透明フィルムに印刷し、フォトエッチングを施します。
![keyer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/8524973e-62f2-eca7-4f32-067082198de5.jpeg)

#設計
##回路図は？
シェアウェアのＤ２ＣＡＤを使ってかいてみました
で、できたのがこれ。
![key.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/7c1731b0-3ccd-6be4-0bf4-f2ce5defac78.gif)
KBANの画面
↑製作中のKBAN画面
##基板設計
![key-cad.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/42921608-08d2-fb16-a76c-8cf3dfabb577.gif)
基本回路を参考に、ＫＢＡＮを使って製作します。紙に大まかな回路図を書いて、 それを参考にしながらやっていくといいよ。配線チェックは紙に印刷してやると良いでしょう。（やり方は後述）
KBANに書き終わったら[file]-[save as bitmap]でビットマップファイルにして保存します。

#制作
##フォトエッチングの原稿を透明フィルムに印刷する。

SFOの画面 	
↑実行中のSFOの画面 	紙に印刷してチェックする

次に印刷します。WINDOWS附属のペイントで印刷すると正しい大きさで印刷されないので、SFOというソフトを使用し、 透明フィルム等に印刷します。
ここでまず、紙に拡大印刷して蛍光ペン等で配線をチェックします。 間違いが見つかったらKBANで修正しましょう。間違いがなかったら透明フィルムに印刷します。

透明フィルムについて：サンハヤト(株）から「ポジ感光基板用フィルム」が発売されていますが、あんまり安くない。 昔の初歩のラジオよろしくトレーシングペーパーを使用するのも手でしょう。

##感光とエッチング
透明フィルム等に印刷したら次はフォトエッチングを施します。市販の感光基板を使用します。
なるべく太陽光でやるのがミソ。光を当てたら現像します。
感光基板を買うのもいいが、普通の生基板にスプレーを吹き付けると、
それが感光基板になってしまうものが秋葉原で売っています。
![range.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/6abffe59-3d2c-ccbb-ade8-316b891d8f72.jpeg)
![spray.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/31ca1d13-dc02-528f-a236-14bf4de9ec65.jpeg)
最後にエッチングします。エッチング液の温度を４０℃程度に保ちます。 湯煎をして温度を保つのが一般的ですが、私はエッチング液を電子レンジで暖めてやってます。（かなり嫌がられますが。） んで、後は穴あけて、おしまい。ケース組み込み等はてきとう。
【完全版】Unityで何をやってもスクリプトがアタッチできないときの解決方法

## 事象
プログラムをオブジェクトにアタッチするときは、プロジェクトビューにあるスクリプトをオブジェクトに持ってくるが、
何をやっても以下のようなエラーが出てしまう。

![85f37401bf8cebbdc5b09ce03a87d2d3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/60069837-3dea-6bfa-a915-7de2df1c95b4.png)

こういうパターン懐かしいなって思ってググったら「ファイル名とプログラムの中のクラス名が一致していない」ことが原因みたいな記事ばっかり出てきて、
「それは知ってるわ！一致してるのに何故かアタッチできないんや！」って気持ちになった。

●以下試したこと
➡reimport
➡Unity再起動
➡PC再起動
➡スクリプト新規作成でコピペ
➡スクリプトの変更が自動更新(Auto Refresh)になっていることを確認。これはデフォルトでそうなってるはずで、そもそもこの設定を変えるメリットってなんやって感じ

## 異変に気付く
今作ってアタッチしようとしてるプログラムではなく、試しに過去に作成していたプログラムを少しいじって修正してみても、何も変わらないことに気づいた。
「あ、これ今から作ろうとしてるプログラムだけじゃなくて今までのプログラムも全部修正が出来なくなってるな」と。
Unityの設定で自動反映（Auto Refresh）にもなってるにも関わらず、変わらないってことは、これは他に原因がありそう

## 解決方法
コンソールを見たらエラーがめっちゃ出ていた。
業務とかだったら1つでもエラーが出てたら必ず無くすことが当たり前だと思いますが、僕はゲーム開発は趣味なのと、そもそもUnityをゲーム開発を目的に使っていないのもあって、インポートしたアセットがエラーが出ててもスルーしてました(ゲーム開発を目的でやっていた学生時代はもちろんエラーは無くしていましたが笑)

なので、使ってないアセットの中のプログラムでめっちゃエラーが出ていたので、そのアセットフォルダ全部消したら、エラーは全て無くなって、
その後にスクリプトをアタッチしようとしたら、

できた！！！！

なるほど、何かしらエラーが出たらそれらを修正するまでこういうことが起こるのか、まあ納得はいく。


## 結論
何やってもうまくいかない問題は、たいていPCやソフトを再起動したら直ることが多いですが、それでもうまくいかないときは、どこかエラーが出てるかもって思うと良い
[02] C言語の独自メモリアロケータの振り返り ... ファイル構成とMakefile

本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/ca7c25dab3c279ba4e2b|

# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/drafts/be9e965ac06ca1af798b/edit)」に記しているが、
要は 13年前(=2008年) に K&R をマネて実装した「自作メモリアロケータ」の振り返りである.

本項では「ファイルの構成」と「Makefile」について記す


# ファイル構成

```
$ tree . --charset=c 
.
|-- Makefile
|-- main.c .............. アクセッサによる alloc と free の実行例
|-- memman.h ............ アクセッサの型定義、アクセッサのインスタンス化 API の定義
|-- memman.c ............ 上記 memman.h の実装部.
|-- priv_memman_core.h .. メモリチャンク(chunk)の型定義.
|-- memman_core.c ....... メモリチャンク(chunk)をリンクリストで管理する実装部.
|-- priv_memman_std.h ... リソース管理テーブルの型定義.
|-- memman_resource.c ... リソース管理テーブルの操作部.
|                         「リソース申請」が通ると、🛑人が手動でテーブルの要素を1個追加する🛑
|-- priv_memman_debug.h . デバッグ用ログ関数を定義している
`-- memman_debug.c ...... デバッグ用ログ関数の実装部

```


# Makefile

常に「デバッグあり」(`-g`)で且つ「最適化なし」(`-O0`)でコンパイル〜リンクが行う.
生成されるプログラム名は「memman」である.

```make
PROGRAM=memman

SRCS=main.c \
     memman.c \
     memman_core.c \
     memman_resource.c \
     memman_debug.c 
     

HDRS=memman.h \
     priv_memman_core.h \
     priv_memman_debug.h \
     priv_memman_std.h
    
OBJS=$(SRCS:%.c=%.o)

CC = gcc
LIBPATH = 
LIBS    = -lpthread
CFLAGS  = -Wall -g -O0 $(INCHEADER) 
LDFLAGS = $(LIBPATH)

$(PROGRAM):$(SRCS) $(HDRS)
	$(CC) $(CFLAGS) -o $(PROGRAM) $(SRCS) $(LDFLAGS) $(LIBS)

clean:
	\rm -f $(PROGRAM) $(OBJS)

```
BigQueryのUNNESTは空配列のレコードを出力しない

# 背景

BigQueryを使っている。
BigQueryはテーブルの列の型としてARRAY型が指定できる。
例えば以下のようなテーブルだ。

```sql
  SELECT
    1 AS id,
    'Alex' AS name,
    [1] AS book_ids
  UNION ALL
  SELECT
    2 AS id,
    'Brian' AS name,
    [] AS book_ids
  UNION ALL
  SELECT
    3 AS id,
    'Carol' AS name,
    [1,
    2,
    3] AS book_ids
```

| 行  | id  | name     | book_ids |
| --- | --- | -------- | -------- |
| 1   | 1   | Alex | 1        |
| 2   | 2   | Brian     |          |
| 3   | 3   | Carol   | 1        |
| 4   |     |          | 2        |
| 5   |     |          | 3        |

book_ids列がARRAY型の列だ。Alexが `[1]`、Brianが `[]`、Carolが `[1, 2, 3]` という配列を持っていることを表す。

さて、このテーブル（以降、 `users` テーブル）は（R）DB理論からすると行儀の悪い設計になっていて、ユーザー情報とそのユーザーがこれまでに読んだ本のIDを同じテーブルで管理してしまっている
（book_ids列がこれまで読んだ本のIDを表す）。

今回、各ユーザーがどんな本を読んできたかのリストを表示したくなった。つまり、 `users` テーブルと、本の一覧を管理する `books` テーブルをJOINしたくなった。

`users` と `books` テーブルをJOINすればいいのだが、ARRAY型はそのままではON句に書けないので、1レコード1冊の本になるようにテーブルを平坦にしてやる必要がある
（いわゆる第一正規化というやつだ）。

# 問題

BigQueryではARRAY型の列を平坦にする操作はUNNESTという関数で行うため、下記のようなSQLを書いて実行した。

```sql
 SELECT
   id,name,book_id
 FROM
   users,
   UNNEST(book_ids) as book_id
```

| 行  | id  | name     | book_id |
| --- | --- | -------- | -------- |
| 1   | 1   | Alex | 1        |
| 2   | 3   | Carol     | 1         |
| 3   | 3   | Carol   | 2        |
| 4   | 3   | Carol    | 3        |

**Brianがいなくなってる……**。

Brianはこれまで本を全く読んでいなかったため、 `users` テーブルにおいてbook_idsは要素数0の空配列であった。

UNNESTはARRAY型カラムと他のカラムとの純粋な掛け合わせらしい。
0に何を掛けても0ということでBrian行は消滅してしまった。

本を読んだことがあるユーザーに絞ったリストが欲しいのであればこの挙動でもよいのだが、本を読んだことのないユーザーも表示して欲しい（book_id=nullにして表示して欲しい）ので、困ったことになった。

# 解決方法

サブクエリーで第一正規系を作って、それを改めて `users` とJOINする方法を取った。

```sql
SELECT
  users.id,
  users.name,
  book_id
FROM
  users
LEFT OUTER JOIN (
  SELECT
    id,
    book_id
  FROM
    users,
    UNNEST(book_ids) AS book_id ) AS sub
ON
  sub.id = users.id
```

| 行  | id  | name     | book_id |
| --- | --- | -------- | -------- |
| 1   | 1   | Alex | 1        |
| 2   | 2   | Brian     | null         |
| 3   | 3   | Carol   | 1        |
| 4   | 3   | Carol    | 2        |
| 5   | 3   | Carol    | 3        |

# おわりに

解決できたが、もっとよいクエリーの発行の仕方があったかもしれない。
まあそもそも `users` テーブルの設計を改めろという話ではありますが。
FlaskとVue.jsを使ってSPAを作ってみた

## はじめに
[FlaskとVue.jsでSPA Webアプリ開発](https://qiita.com/y-tsutsu/items/67f71fc8430a199a3efd)
上記を参考に作成し、調べた内容について書く。

## 用語の意味
* FlaskはPythonでWebアプリを開発するためのフレームワーク
* Vue.jsはJavaScriptで開発するためのフレームワーク
* SPAはSingle Page Applicationの略でページの遷移をしないでコンテンツを切り替えるもの
* RESTful APIはフロントエンドとバックエンドを繋げるためのもので、RESTのルールに基づいたAPI


RESTはRepresentational State Transferの略であるが、意味が曖昧でよく分からなかったので具体的な例を調べた。

* GET,POST,PUT,DELETEの4つのHTTPメソッドに対して/GetUSer, /DelteUser,...とURLを複数作るのでなく、/UserのURLにそれぞれのHTTPメソッドを紐づけする
* Web APIには他にもSOAPやRPCがある。


## プロジェクトの作成 
[FlaskとVue.jsでSPA Webアプリ開発](https://qiita.com/y-tsutsu/items/67f71fc8430a199a3efd)をもとに作成。
詰まったところについて書いた。

### vue create frontend
* BabelはjavascriptをES6からES5に書き換えてくれる  
 [モダンフロントエンド開発環境からVue.js環境までひと通り作ってみた](https://qiita.com/isihigameKoudai/items/520c1cb6540e0641a00c)
* RouterはSPAを作るために必要なもの
* 設定は以下のようにした

```
Vue CLI v4.5.13
? Please pick a preset: Manually select features
? Check the features needed for your project: Choose Vue version, Babel, Router, Vuex, Linter
? Choose a version of Vue.js that you want to start the project with 2.x
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a linter / formatter config: Standard
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? No
? Pick the package manager to use when installing dependencies: NPM
```

### pipenv install flask
* flaskのインストール後に`backend/main.py`で`Import “flask” could not be resolved from source Pylance (reportMissingModuleSource)`のエラーメッセージが表示されることがあった。

色々触っていたら解決してしまったのでよく分からない。`pip install`で良い？

### vue add element
* elementはvue2.x用なので初めにvue3.xにすると出来ない。

* element-plusがvue3.xに使えるが今回は使わなかった。


## 終わりに

今回初めてSPAを開発したが、難しい概念も多く、取り敢えず手を動かすという状況が多かった。
少しずつ理解が出来たらいいと思う。
[01] C言語の独自メモリアロケータの振り返り ... 概要

本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/ca7c25dab3c279ba4e2b|

# はじめに

書籍『プログラミング言語C』(通称 K&R) には、
簡易な malloc と free (以降「動的メモリ獲得・解放」)の実装例がある.

13年前(=2008年) に K&R をマネて、次の「自作メモリアロケータ」を実装をしていたようで、
13年ぶりに同コードを見た.

良い機会なので、C言語のポートフォリオ(作品)を兼ねて、該当コードを振り返ることにした.


# 自作メモリアロケータ

```
(1) ユーザは「動的メモリ獲得・解放」のために、直にシステム関数(例: malloc, free) は使えない.
　⬇️ 
(2) 「動的メモリ獲得・解放」を行いたい場合は、事前に「リソース申請」をしておく.
　⬇️ 
(3) 「リソース申請」が通ると、「アクセッサ」が得られる (リソース割り当てが行われる.
　⬇️ 
(4) 「アクセッサ」は「動的メモリ獲得・解放」を持つ関数ポインタ「alloc」「free」を提供する.
　⬇️ 
(5) ユーザはアクセッサの関数ポインタ「alloc」と「free」に対して、任意のメモリ操作関数を設定する.
　⬇️ 
(6) ユーザはアクセッサを使って初回に必要なメモリプールを獲得する. (以後、拡張・縮小はできない).
　⬇️ 
(7) 以後、ユーザはアクセッサを介してメモリプールからメモリ獲得・解放をする
```

# 補足

13年ぶりにコードを見ると, 完全に赤の他人のコードであった.
たぶん職場でこのようなメモリ管理の機構を採用していたので、自宅で実装練習をしたのだろう.
(コーディングスタイルも当時の職場のものであった)

# さらに補足

正直、本コードがどこまで正確に動作するのかは不明である.
ただ、13年ぶりに本コードの main関数（単体テスト）が動いたので、ある程度動作するのだろう.
初心者必見-メンタルケア-1ヶ月目

# はじめに
本記事では、１ヶ月学習を終えた私の近況と、
身につけたメンタルケアを紹介いたします。
本日は、メンタルケアに集中した１日でしたので、方法を忘れないようにここに記述します。

# １ヶ月(30日間)学習した近況
エンジニアになりたいと思い、
前職：不動産会社を辞職し、
キッカケがないと学習をはじめない性格でもあったため、
高額でしたが、某プログラミングスクールに入校しました。

１ヶ月(30日間)の学習時間の合計時間としては、おおよそ`350時間`です。

初めの３週間は、
`HTML`、`CSS`、`Ruby`、`Rails`、`JavaScript`をとにかくインプットし、
スクール同期の皆さんとアウトプットをする。

という流れで、とにかく楽しかったです！

４週目から現在にかけて、
エラーに立ち向かうような自走力向上、学習したことの深堀を行うため、
アプリケーションの実装を行う学習にシフトしていきました。

現在も、商品出品や購入ができるアプリケーション実装を学習しています。

# 4週目からの違和感
私のTwitterを見ていただくと、
ある日突然からエラーに関する投稿が増えているかと思います。

https://twitter.com/progmkatogorp/status/1419647235306917892

https://twitter.com/progmkatogorp/status/1420178887581913088

https://twitter.com/progmkatogorp/status/1420769561821990915


適当にピックアップしましたが、
先週あたりは結構ピークでしたね。

ここからはとにかく、

```
[リフレッシュ]の時間を大事に
```

をモットーにしていました。

###リフレッシュの方法
いくつか列挙しておきます。

`①ランニング`
時間に余裕があれば、運動しておくと、体が軽く、ストレスが溜まりづらいです。
ここまで`運動との相性`がいいのは、「プログラミング」ぐらいだと思ったぐらい、
これは本当にお勧めします。

`②周りに話す・紙に書く`
`「書く」「話す」`は「行動する」の次に有効なアウトプット方法です。
吐き出すことで、溜まっていたストレスが発散し、
気持ちが落ち着きます。
周りの迷惑になりそうなら、「書く」を実行して、紙を眺めてください。
また、10分ほど書き続け、深堀をしてください。
最終的に、ネガティブ要素を吐き終わったら、
`「次は、こうやってみよう」`とポジティブに変わる場面がやってきます。


`③趣味`
私は、FXのチャートを見ている時間が好きです。
なんでもいいと思います。
美味しいご飯を食べるでも、お酒を飲むでも。
`自分を癒すこと`もストレスを緩和します。


`④散歩`
エラーに当たった時、まずは、プログラミングのことを忘れて、
散歩すると、いざ戻ってきた時、さらっと解消できます。

考え続けていると、
`頭の中がぐちゃぐちゃ`になります。
何も考えず、散歩することで、
カバンの中のイヤホンがスラリとほどけるように、
頭の中が整理されます。

`⑤その日の学習はやめる`
言葉通りです。
なんとか解決しよう、目標を達成しようとすると、ストレスになります。
長時間頑張ったのに、解決できなかったりすると`イライラ`します。

イライラするとどうなるかと言うと、
楽しい気持ちはなくなり、「解決しないといけない」
という`使命感`でいっぱいになります。

そうなると、最悪です。
次の日、`コード見たくない`という現象に陥ります。

そうなる前に止めてください。
せっかく楽しいと思って、プログラミング始めたんですから。

`⑥遠出する`
それでもやらなければいけない、という場合は遠出します。
`行ったことのないところ`で、学習してください。

この方法は、本日思いつき、実行しました。
リフレッシュでき、モチベーションを維持できた上、
`集中力が向上`しました。
騙されたと思って実行してみてください。
＊遠出とは言ってもやはりカフェが良いと思います。

# なぜプログラミングを始めたのか
メンタルが辛い時は、ここを思い出してください。
例えば、

①プログラミングは将来性がある。
→ここで踏ん張ったら、将来明るい可能性が高い。

②手に職をつけられる。
→会社が倒産しようが、無一文になろうが、自分には技術がある。

③「IT業界」という響きがかっこいい！
→ここで諦めたら、カッコ悪い。

④お金持ちになれる。
→エンジニア不足のため、エンジニアになれたら自分に価値が生まれる。

⑤自分の自由な時間に働ける
→たくさんのエラーを乗り越えた先には、自分らしい働き方ができる。


・・・・考えたら止まらないので、やめます。

```
誰でも簡単に乗り越えられるものではないからこそ、
その先にいる自分を想像してみるのも良いかもしれません。
```

# 「辛い」「しんどい」は当たり前
当たり前ということは、今エンジニアとして活躍している`みんなが経験している`。
↓
そんなみんなが経験したレールに脱線せず、自分も戦っている。
↓
レールに脱線していないということは、今活躍しているエンジニアに近づいていっている。
↓
これが正規ルートか！

「辛い」「しんどい」が無く、給料がいい業界があったら、
みんなその業界にいます。
その分、プラスに転じた時、跳ね上がると信じています。

# 不安に思っていること
・Google検索で解決するなら、即解決する。

・Google検索で解決できないなら、周りに意見を聞く。

・周りがいなければ、Twitterを初めて専門の方に直接聞く。

・「就活」「給料」「フリーランス」
そんなよりも、目の前にいるエラー解決を優先。
先のことを不安に思っても、目の前の問題が解決できていないのに考えても無駄。
順序を決めて、不安を取り除く。

・不安は溜めない。集中力が低下する。

＊どうしたら不安が取り除けるのかというのは、
みんな知っているのに、気づいていないだけです。
この辺は行動力です。思い切ってプログラミングを始めた一番初めの頃のように！

#　終わり
長々と書きましたが、私もまだ１ヶ月しか学習していないことを思い出しました。
しかし、的を得ているとは思います。
いかに無理しすぎず、`楽しむ`か。ですね。

こんな私も、今日は実は、過去一番落ち込んだ日でした。
以上に記述したことを実行し、なんとか持ち直しました。

自分を追い込まないように！！


明日も頑張ります！！！
pandasでNaNをNoneに置き換える

<!-- wp:paragraph -->
<p>pandasのデータフレーム内でNaNになっている値をNoneに替えたほうがコードが書きやすいことがあります。例えば、値をif文で処理するときなどNaNだったら</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code lang="python" class="language-python">羽の数 = 生き物['羽の数'] if <meta charset="utf-8">生き物['羽の数'] is not np.NaN else 0　</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>などと書くところ、Noneだったら</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code lang="python" class="language-python"><meta charset="utf-8">羽の数 = 生き物['羽の数'] if <meta charset="utf-8">生き物['羽の数'] else 0</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>で動作します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>データフレーム中のNaNを一度にNoneに置き換えるときは</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code lang="python" class="language-python">生き物_df.replace({np.NaN: None}, inplace=True)</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>これでいけます。</p>
<!-- /wp:paragraph -->
UITableViewCellに作ったButtonに機能を追加

#今回の内容
<img width="150" alt="531A42CB-BA1F-493D-BC5E-4E850B3BE8ED_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/9029bcfa-dfce-7e3a-e9b5-7f81830261d4.jpeg">

#機能説明

* Cellに表示したハート型のButtonを押すと、ButtonのBackgroundImageが変わります。
* Buttonの初期状態はハートの内側が白いです。押すとハート全体が青い画像に変わります。


#コードと簡単解説

##func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}

* Cellの作成

* cellHeartButtonをCellのUIButtonとして作成します。

* `cellHeartButton.tag = indexPath.row`は、Buttonが押された時にどのButtonが押されたか、判別するためにButtonにTagを設定しています。

* `cellHeartButton.addTarget(self, action: #selector(goodOrNoGood), for: .touchDown)`は、Buttonが押された時の処理を追加します。

```Swift:

let cellContentsArray = ["1","2","3","4","5","6","7","8","9","10"]

           ~~~一部省略~~~ 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        
        let cellContentsLabel = cell.contentView.viewWithTag(1) as! UILabel
        let cellHeartButton = cell.contentView.viewWithTag(2) as! UIButton
        
        cellContentsLabel.text = cellContentsArray[indexPath.row]

        cellHeartButton.tag = indexPath.row
        cellHeartButton.addTarget(self, action: #selector(goodOrNoGood), for: .touchDown)
        
        return cell
    }
```

## #selector(goodOrNoGood)

* `if sender.backgroundImage(for: .normal) == UIImage(systemName: "heart"){}`では、Buttonの画像が`UIImage(systemName: "heart")`の時は`UIImage(systemName: "heart.fill")`に変化させます。


```Swift:goodOrNoGood
    @objc func goodOrNoGood(sender:UIButton){
        
        if sender.backgroundImage(for: .normal) == UIImage(systemName: "heart"){
            
            sender.setBackgroundImage(UIImage(systemName: "heart.fill"), for: .normal)
            print(sender.tag)
            
        }else{
            
            sender.setBackgroundImage(UIImage(systemName: "heart"), for: .normal)
            print(sender.tag)
            
        }      
    }
```

#終わり

ご指摘、ご質問などありましたら、コメントまでお願い致します。
安全なWebアプリケーションの作り方　環境構築で詰まった点 (Mac)

## 概要
[安全なWebアプリケーションの作り方](https://wasbook.org/)の環境構築(２章)で困った点があったので、残しておく。

Mac(Intel)で行ったので、別環境だとうまく行ったり、行かなかったりするかもなので、ご了承ください。

## バージョン
Macバージョン： Big Sur 11.1
VirtualBox：6.1.26

## 内容
##### 2.1章
ダウンロードしてきた実習用仮想マシンのファイルが開けず「???」となる。
→ のちにVirtualBoxをダウンロードすると開けるようになるので焦らず。

##### 2.3章
ホストネットワークマネージャー上に設定がなければ、新たに設定を作成してくださいと本に書いてあるが、作成しようとすると下記のエラーが出て作成できない。

![Screen Shot 2021-08-06 at 23.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/db45b342-0293-5b26-809a-a12ade181de6.png)

↓参考に解決 (スクショ載っていてわかりやすい)
https://www.nemotos.net/?p=3707
再起動までが終わると、以前までホストネットワークマネージャーから新規作成できなかったが可能になった。


##### 2.4章
・仮想マシンの起動後、画面が小さいとき。
→下記のアイコンをクリックすると「Virtual Screen」という選択肢が出るのでそこから画面サイズを選択する。
![Screen Shot 2021-08-07 at 15.26.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/aa0682ac-b154-d51b-eb7f-43181a229da2.png)

・所々、仮想マシン(ホスト)と繋がっているかpingコマンドで確認するところがある。
→ pingの由来は「ping pong(卓球)」らしい。 パケット(小さいデータ)を送り、相手からも帰ってくるかで確認するため、卓球みたいだなと思った人がいたんだろう。

##### 2.7章
・2.6章での設定が終わって以降、指定のページに遷移するためには
- 仮想マシン
- OWASP ZAP
の二つが起動状態である必要がある。

・firefoxでプロキシを経由させているサイトの左右に邪魔な表示が出る (↓)
![Screen Shot 2021-08-07 at 18.14.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/55784bbf-761d-972c-2d1d-213af1bfc3a5.png)
→ OWASP ZAP > Tools > Options > HUD > Enable when using the ZAP Desktopのチェックを外し、OKボタンを押すと治る。 (一度行った人も再確認を)
参考：(https://teratail.com/questions/197984)