OmniAICreator/Qiita-1.07M huggingface dataset:
symbol-sdk-core-python3.0.2のpipインストールエラー

# 概要
- ラズパイ環境でXYM送金のプログラムを書こうとして、SDKインストールからいきなりコケたので備忘です。

# 実行環境
- OS：Raspbian GNU/Linux 10 (buster)
- python 3.7,3
- pip 22.0.4 from /usr/local/lib/python3.7/dist-packages/pip (python 3.7)
- symbol-sdk-core-python 3.0.2

# 発生事象
`pip install symbol-sdk-core-python`で下記エラーが発生

```terminal
/usr/lib/python3/dist-packages/secretstorage/dhcrypto.py:15: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead
  from cryptography.utils import int_from_bytes
/usr/lib/python3/dist-packages/secretstorage/util.py:19: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead
  from cryptography.utils import int_from_bytes
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting symbol-sdk-core-python==3.0.2
  Using cached symbol-sdk-core-python-3.0.2.tar.gz (1.4 kB)
  Preparing metadata (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [6 lines of output]
      Traceback (most recent call last):
        File "<string>", line 36, in <module>
        File "<pip-setuptools-caller>", line 34, in <module>
        File "/tmp/pip-install-g97gfp6c/symbol-sdk-core-python_3e9ea494561146dfb38aa1453c23557d/setup.py", line 8, in <module>
          with open('version.txt', 'rt', encoding='utf8') as version_file:
      FileNotFoundError: [Errno 2] No such file or directory: 'version.txt'
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
```

# 回避策
- pipコマンドの末尾に`--use-deprecated=legacy-resolver`を付与することでとりあえずインストールは出来た。

# 顛末
- インストールは成功した者の、結果を見ると`3.0.1`がインストールされていた。
- 詳細まではわからないけど、どうもpipの不具合っぽい？
- `--use-deprecated=legacy-resolver`コマンドにより、旧来の依存関係解決方法にダウングレードすることで回避出来た模様。

# 参考ページ
- [pip の 新しい 依存関係 resolver が時間がかかってCIが失敗する](https://zenn.dev/ymd_h/scraps/744cba53c90fe5)
Windowsアプリケーション(DLL)の同一性を確認する方法

# 前書き
.NETのアプリケーションは、参照先のアプリケーションが持つ**厳密名**を使ってアプリケーションの同一性(ID)を判別することで、同一名称を持つバージョンの異なるアプリケーションの利用を可能にしている(side-by-side実行)。

# 厳密名とは
厳密名とはアプリケーションごとに設定されてた以下の4つの情報で決定している。

* アセンブリ名
* バージョン番号 (注：アセンブリバージョンのことで、アセンブリ情報バージョンではない)
* カルチャ
* public key(実際はpublic keyから作成されたハッシュ値であるpublic key tokenを利用しているらしい)

アセンブリ名はそのdllの名称そのままであるが、それ以外の項目はそれぞれ調べ方が異なるので注意したい。

### バージョン番号、public keyの調べ方
Visual Studioに付属するツールildasmを利用して、dllのmanifestを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/5b6bb839-0986-1832-7237-53cc515a5aab.png)

Manifest内の、.assembly <アセンブリ名> セクションに記載されている(以下の例では、アセンブリ名は System.Net.Http)、.publickey及び.verがそれぞれpublic key、バージョンンに対応する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/b8a677ca-93b7-1f2b-62b1-ce7758925acf.png)

### カルチャの調べ方
対象dllを右クリックし、プロパティを開くと、詳細タグで言語を確認することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/74d314fe-3e4d-b5f6-5d01-f70a56d2075b.png)

# まとめ
DLL同士の比較を行う際に、単純なバイナリファイルの比較を行うと差分が生じてしまうが、実際には同じ「ID」を持つDLLとして配布されているケースが多くありうる。

これは、内部実装などに差が生じているDLLでもインターフェースが同じであれば同様に参照して利用できるようにするためであるが、どこで同一IDであることを確認すればいいのかが不安になった場合には、以上のような方法で確認が可能してみるのも一つの手である。
Ubuntu 22.04にCockpitとcockpit-navigatorをインストール

[先日インストールした](https://qiita.com/rk05231977/items/ad3ac56c1805e669507d)Ubuntu 22.04にCockpitと、Cockpit経由でファイルをやり取りするためのプラグインcockpit-navigatorをインストール。

セットアップがものすごく簡単なら普段使い出来ることを期待。

# Cockpitのインストール
インストールガイドは以下だが、backportsとか上手くいかない。
https://cockpit-project.org/running.html#ubuntu
apt-updateとapt install cockpitで。GUIならUbuntu Softwareからでも良いかもしれないと思った。

```bash
$ sudo apt update
$ sudo apt install -y cockpit
$ sudo systemctl enable cockpit.socket --now
```

一応これで、Webブラウザで`https://＜IPアドレス＞:9090`にアクセスすればCockpitにログインできる。
まあまあ簡単か。

# cockpit-navigatorのインストール
https://github.com/45Drives/cockpit-navigator

```bash
$ sudo apt install -y git
$ git clone https://github.com/45Drives/cockpit-navigator.git
$ cd cockpit-navigator
$ git checkout v0.5.8
$ sudo apt install -y make
$ sudo make install
```

インストール後、navigatorを有効にするためにCockpitを再起動する必要は無い。Webブラウザのセッションでログアウトし、再度ログインすると、左メニューにNavigatorが追加される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/e9bdaf41-f1fa-7ff5-e03a-08ec08d6d784.png)

ファイルのアップロードもエクスプローラーからWebブラウザにドラッグ＆ドロップで行ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/c0bef629-5866-9a9b-85bf-382628a903c2.png)

大容量のバイナリファイルのアップロードも、とりあえず2GB強のファイルアップロードは行けた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/3fac6eb7-5872-a23d-82bc-d2b53d331f3c.png)

ただ、IPアドレスでCockpitにアクセスしていると、ファイルのダウンロードが上手くいかない。自己署名証明書の問題かと思ったが、それとは関係なくWebブラウザからのアクセスをIPアドレスではなく、hostsファイルを修正してホスト名でCockpitにアクセスするとダウンロードできるようになるとか、ちょっとよくわからない。UbuntuがAWS上とか、クラウド上でDNS名もちゃんと持ってるならあまり問題にならないかもしれない。

簡単なテキスト編集もWebブラウザから出来る。テキスト編集に関しては、cockpitの端末からviでも良いのだが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/3f7f03eb-e963-6c71-4bd1-c237bc60fd29.png)
Qiita始めました

# Qiita始めました

- 自分磨きのハンズオンをやってて、つど資料は書き留めてきたけど・・・
- 回を重ねるにつれ資料の管理が悩みになってきました。
- そんな悩みを解決するためにQiitaの利用を決めました。
- みなさん、よろしくお願いします。
accepts_nested_attributes_forで子要素を保存する時にfirst使ってはいけない

accepts_nested_attributes_forにおいて、最初のデータの保存がうまくいかないケースがあった。

## 前提

```ruby
# app/models/estimate.rb

class Estimate < ActiveRecord::Base
  has_many :estimate_items
  accepts_nested_attributes_for :estimate_items
end
```

## ❌ ダメなコード
```ruby
# rails console

$> est = Estimate.find(1)
$> puts est.estimate_items.first.name
=> "test1"
$> est.estimate_items.first.name = "hoge"
$> est.save!
$> puts est.estimate_items.first.name
=> "test1"  # 「hoge」が保存されてない！
```


## 🙆‍♂️ OKなコード
```ruby
# rails console

$> est = Estimate.find(1)
$> puts est.estimate_items.first.name
=> "test1"
$> est.estimate_items[0].name = "hoge"
$> est.save!
$> puts est.estimate_items.first.name
=> "hoge"  # 「hoge」が保存されている！
```

### 理由

firstがついているとSQLにlimitがついて `has_many :estimate_items` の全量がロードされないから。

```ruby
# rails console

est.estimate_items.first
#=> SELECT * from estimate_items where estimate_id = 1 limit 1

est.estimate_items[0]
#=> SELECT * from estimate_items where estimate_id = 1
```

##### ちなみに、うっかりデバッグでputsとかするとfirstでも保存されるようになる。

```ruby
# rails console

$> est = Estimate.find(1)
$> puts est.estimate_items  # ←デバッグ用のつもりが処理に影響を及ぼしている
#=> SELECT * from estimate_items where estimate_id = 1
$> puts est.estimate_items.first.name
=> "test1"
$> est.estimate_items.first.name = "hoge"
$> est.save!
$> puts est.estimate_items.first.name
=> "hoge"  # 「hoge」が保存されている！
```
　このロードの仕組みはデバッグがしづらいので結構ハマる。ちゃんと理解してないと本番環境でもRails.loggerが実際には処理に影響を及ぼすこともあるので要注意。

### 対策

accept_nested_attributesの時は`first`使わず`[0]`でデータ更新しよう。
makemigrationsを行っても、追加したアプリを認識しない

### make migrationsを行っても、追加したアプリを認識せず、テーブルも作成されない、エラーも出ないという現象が発生しました。その原因と解決方法を備忘録として記載します。


## 環境
### バージョン
python：3.10.4
django：4.0.4
django rest framework：3.13.1

## 現象
django restframeworkのプロジェクト内（以下参照）にフォルダを作成し、その中に、アプリを作成した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/42858c64-036b-fe53-bab8-a446b8ac4af4.png)

その後、models.pyの内容を追記し、settings.pyのINSTALLED_APPS内に、追加したアプリを記載。

そして、makemigrationsを行うと、「No changes detected」が表示さる。当然、miggrateを行っても、DB内にテーブルは作成されない。


## 調べたこと
1．作成した、functionsフォルダ内に「__init__.py」ファイルは存在するか？
　⇒あり
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/04fc10a4-9f24-0784-4ea1-43b6eea93d21.png)

2．一度、全てテーブルを削除し、再度作成
　⇒　変化なし。（新規追加してmigrateしてるのに、認識しないので、当然と言えば当然ｗ）

3. 追加したアプリを指定してmakemigrationsを実行
　⇒　GINGO!!!!

## 解決策
既にあるプロジェクトにアプリを追加する場合、ただ「python manage.py makemigrations」を行ってもダメなようです。
以下のように、アプリ名を指定して実行する必要があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/47ac1eb5-6e48-4917-53bf-f64957a7b515.png)

無事、migrateすることができ、テーブルも作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/5d9a6dfe-a28e-59ad-0068-0279a47e30cd.png)


※なぜこうなるのかは、調査中。
商品梱包作業の進捗管理ができるアプリをGlideを使って作りました

こんにちは。こんばんは。
私は小売業で働いています。今年の２月から新規依頼を受け、**指定の商品を梱包して週１回出荷する業務**がスタートしました。指定の商品は、食料品と日用品を併せて１８品目です。梱包作業は各商品の発注担当者が実施し、作業も順調に進みました。

４月中旬を過ぎた頃「**５月から出荷を週２回にしてほしい**」と追加の依頼を受けました。

これまで週１回だった作業を週２回実施するとなると、発注担当者ごとに梱包するよりも、メンバー全員でまとめて梱包したほうが効率が良いため、**５月からは新体制で再スタート**します。
![ビフォアアフター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/455f55ea-5fb0-c284-4d67-af8878494996.png)

# アプリの紹介
* 作成したアプリ
* Glideで使用したテンプレート
* 使用したメンバーからの評価
* 今後の活用に向けて

# 作成したアプリ
全員での梱包作業となるため、**商品の全体像が見えるものがあったほうが効率が良いと思い**、進捗管理が出来るアプリを作ってみようと思いました。

実際に作成したアプリがこちらです。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/9fb08db4-6182-073d-76f1-d3afc17e3be6.png)
梱包した商品を選択し、「MARK PRESENT」をタップすると進捗状況の画面で「PRESENT」へ移動します。まだ梱包してない商品は「To Be recorded」に入っています。

梱包作業は指示を出す人１名、梱包する人４～5名で実施します。指示を出す人にアプリを使ってもらうことにしました。**どの商品まで完了しているか目で見てわかるようにすることで、抜け漏れなくスムーズに指示だし出来るようにする**ことが狙いです。

# Glideで使用したテンプレート
アプリの作成はGlideを使いました。利用したテンプレートは「Attendance Tracker」です。こちらは生徒の出席確認をするアプリです。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/3aab75c7-10ed-c43c-e474-3ecf3e3a00bf.png)
「生徒が出席する」を「商品が梱包されている」に置き換えると進捗管理が出来ると考えました。
生徒を商品リストへ、出席状況を進捗状況へ変更しています。
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/225dde03-d2f0-a0d9-2917-34d0759a7697.png)
商品リストはGoogleスプレッドシートで作成しました。
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/aa3cb84c-e0a8-9d2e-7b41-4604f5b8f30d.png)

# 使用したメンバーからの評価
早速今週の梱包作業で指示を出す方に使ってもらい、感想を聞きました。
* 紙にチェックを入れるよりも簡単でよい
* どの商品まで完了しているかぱっと見て分かりやすい
* **「🚫MARK ABSENT」はないほうがわかりやすい**
* 食品と日用品で**リストを分けた方が見やすい**
* **指示を出す側だけでなく梱包する人も登録する**とお互いに進捗管理が出来る

# 今後の活用に向けて
今回は出席管理を進捗管理に置き換える方法でアプリを作成しました。作る過程もとても楽しく、作ったものをメンバーに使ってもらうこともとても楽しかったです。そして、実際に業務で使ってみて感想をもらうことで気づきも得られました。

この進捗管理方法を活用して、毎日、毎週、毎月の業務の進捗管理ができないか、検討していきたいです。

最後まで読んでいただき、ありがとうございました。

* **５月１０日更新**
タグを追加しました
梱包作業のイメージ画像を追加しました
AWS SAA 1ヶ月で取得した方法（実務未経験）

# はじめに
私は実務未経験の駆け出しエンジニアです。
EC2などのメインどころは自己学習で触れたくらいのレベルです。
この度、AWS認定ソリューションアーキテクトアソシエイト試験（AWS SAA）に無事合格しました！
実務未経験で、どの教材を使用し、どのように学習したかの合格体験記になります。
私自身も学習方法に悩み、色々な方の合格体験記を参考にしました。
今後、AWS SAAの合格を目指している方の参考になれば幸いです！！

# 結果
ギリギリの合格でしたｗｗ
受験日：2022/4/25
点数　：741点
![スクリーンショット 2022-05-03 22.18.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156198/4941c829-3efa-0358-1f0f-8b5809fa27a5.png)


# 使用教材
使用教材は下記4つのみ！！

1. 黒本（徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書 徹底攻略シリーズ）
2. [【2022年版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)
3. [【2022年版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
4. ping-t問題集(使用時点：426問)


# 学習方法
学習期間は約1ヶ月程。
平日2時間、休日5時間くらいを目安で学習しました。

①黒本 ＋ 2.の教材 ＋ ping-t
②模擬テスト

まずは黒本を一読。（1週間ほど）
同時に2.の教材でサービス全体理解。
ハンズオンは全部やると時間がかかりすぎるので
メインサービス（IAM、VPC、EC2、S3）のみ触れました。
単元終了ごとにping-tで学習した範囲の問題を解く。
ここまで3週間ほどで実施しました。

最後の1週間は模擬テストをひたすら受け続けました。
ping-tの模擬テストは8〜9割。（レベル24、未出題なし）
udemyの模擬テストは難易度が高く苦戦。。。
4つほど挑戦しましたが、初見では5〜6割しか取れず。。。
諦めそうになりましたが、テストの復習をしっかり行い2周目で
7〜8割取れるようになったところで本番を迎えました。

試験日の朝に模擬テストの問題を見直して試験会場へ
本試験は初見の問題も多く、難易度は高く感じました。
試験時間残り15分を残してなんとか終了。
恐る恐る終了ボタンを押すと合格の文字が！！


# 感想
私の体感としては、cloudfront、S3、ELB、Autoscaling、セキュリティについて多く出題されました。
学習教材のおすすめはudemyの模擬試験問題集。
こちらの問題集は必須だと感じました。
問題も本番に近い形式で出題されるので、試験になれる意味でも良い。
udemyの試験問題は本試験より難しいと書いてありましたが、本試験も同じくらい難しく感じました。
問題文が長く、英語を直訳した文章で読み解くのに苦労。。。
内容理解ができていない問題も多くあったがなんとか合格。(試験中はダメだと思ってましたw)
私は全ての模擬試験を受けていませんが、時間に余裕があれば受けた方が良いかと思います。
ping-tは使用時未完成。（総問題数426問）
基礎理解には良いが丸暗記では無理、これだけでは到底無理だと感じました。
以上がAWS SAAを1ヶ月で取得した方法（実務未経験）になります。
参考になれば幸いです！！
Visual Studio 2015 or 2017でテストが見つからない場合の対応方法

# 現象と解決方法
Visual Studioで正しくテストを作成して、単体テストを通していてた場合でも時たま、テスト自体がテストエクスプローラーに表示されずテストが実行できない場合がある。

以下は、正しい手順ではないかもしれないがStackOverflowなどで示されていた、cacheファイルの削除法である。

元ネタのStackOverflowは以下のサイト
https://stackoverflow.com/questions/29560011/visual-studio-2015-or-2017-does-not-discover-unit-tests/34108444#34108444

暇があったら要約を記載するかもしれないが、とりあえずはメモとして情報を残しておく。
Pythonソースコードのエンコーディングについて

Pythonのソースコードで利用できる文字コードについてチュートリアルにある記載とPEPにある記載をまとめます。

## チュートリアルの記載について

[2.2.1. ソースコードの文字コード](https://docs.python.org/ja/3/tutorial/interpreter.html#source-code-encoding)

Python3のチュートリアルでは上記に記載があり、Pythonのソースコードはデフォルトでは`UTF-8`でエンコードされているものとして扱われると記載されています。

またデフォルトエンコーディング以外のエンコーディングを利用する際は下記の書式で先頭行に記載すればよいようです。
(`shebang`を書く場合は、先頭行の次の行に記載する）

```python
# -*- coding: encoding -*-
```

また`encoding`として指定できる文字コードとしては下記ページにある`codecs`でサポートしている文字コードが指定できます。

[標準エンコーディング](https://docs.python.org/ja/3/library/codecs.html#standard-encodings)

## PEPの記載について

PEPではソースコードで利用する文字コードについて下記に記載がありました。

- [PEP 8 – Style Guide for Python Code](https://peps.python.org/pep-0008/)
- [PEP 263 – Defining Python Source Code Encodings](https://peps.python.org/pep-0263/)
- [PEP 3120 – Using UTF-8 as the default source encoding](https://peps.python.org/pep-3120/)

`PEP 3120`ではPythonのデフォルトのソースエンコーディングはUTF8を利用するとあり、また歴史的な経緯も記載されています。

`PEP 8`の[source-file-encoding](https://peps.python.org/pep-0008/#source-file-encoding)を見ると、標準ライブラリではutf-8を利用し、非ASCII文字は極力利用せずに、場所や人名のみに利用することが推奨されているようです。

`PEP 263`を見ると、ドキュメント上では`# -*- coding: encoding -*-`という書式と記載されていますが。

他の書き方も記載されています。

```python:書き方１
# coding=<encoding name>
```

```python:エディタの文字エンコーディング指定と互換のある書き方（emacs）
#!/usr/bin/python
# -*- coding: <encoding name> -*-
```

```python:エディタの文字エンコーディング指定と互換のある書き方（vim）
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
```

Pythonではemacsやvimのエディタで設定できるコーディング指定も対応している事がわかります。

より正確には下記の正規表現にマッチすればよいと記載があります。

```python
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)
```

ちなみにソースコードにBOMがついている場合は、許可される記載はUTF8のみになるようです。

>If a source file uses both the UTF-8 BOM mark signature and a magic encoding comment, the only allowed encoding for the comment is ‘utf-8’. Any other encoding will cause an error.

```python:encoding.py
#!/usr/bin/python3
# -*- coding: latin_1 -*-

print("Hello Encoding!")
```

たとえば上記のような`# -*- coding: latin_1 -*-`で`latin_1`を指定した`encoding.py`を`BOM付きUTF-8`で保存して実行してみると下記のように`latin_1(iso-8859-1)`にBOMがついているとエラーとなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/448af6f7-2726-6606-2fb2-f58494ffb12d.png)

## まとめ

よくサンプルコードで`shebang`だったりこのエンコーディング指定をみかけますが。
意味合いを理解して利用したい所ではあります。
リンクを別タブで開く

以下をaタグに追記する
```
target="_blank" rel="noopener noreferrer"
```

「target="_blank"」で別タブで開くが
「rel="noopener noreferrer"」を追記することで
「別タブで開いたWebサイトに万が一、悪意のあるプログラムが書かれていても安心」


---

### 参考サイト
[別タブでリンクを開く方法](https://techacademy.jp/magazine/23824)

---

### やりたいこと

対応できたが、詳細が理解できていないので調べる

---

### 便利

ホバーでリンク変わる記述
```
&:hover {
   opacity: 0.6;
}
```
Node.js: GitLab API の使い方

```json:package.json
{
  "type": "module"
}
```

トークンとプロジェクトID の設定

```text:.env
PERSONAL_ACCESS_TOKEN=glpat-xxxxxx
PROJECT_ID="35195199"
```

プロジェクトのメンバーの取得

```js:get_members.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	get_members.js
//
//					May/06/2022
//
// ---------------------------------------------------------------
'use strict'

import fetch from 'node-fetch'
import 'dotenv/config'

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const token = `${process.env.PERSONAL_ACCESS_TOKEN}`
const project_id = `${process.env.PROJECT_ID}`
const limit="?page=1&per_page=10"
const url="https://gitlab.com/api/v4/projects/" + project_id + "/members" + limit

const options = {
	method: "GET",
	headers: {
		"Content-Type": "application/json",
		"PRIVATE-TOKEN": token
		}
	}

const response = await fetch(url,options)
const body = await response.text()

const array_aa = JSON.parse(body)

console.log(array_aa.length)

for (var it in array_aa)
	{
	const unit_aa = array_aa[it]
	var str_out = unit_aa.id + "\t"
	str_out += unit_aa.username + "\t"
	str_out += unit_aa.name + "\t"
	str_out += unit_aa.web_url + "\t"
	str_out += unit_aa.created_at
	console.log(str_out)
	}
console.error ("*** 終了 ***")

// ---------------------------------------------------------------
```

プロジェクトのブランチの取得

```js:get_branches.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	get_branches.js
//
//					May/06/2022
//
// ---------------------------------------------------------------
'use strict'

import fetch from 'node-fetch'
import 'dotenv/config'

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const token = `${process.env.PERSONAL_ACCESS_TOKEN}`
const project_id = `${process.env.PROJECT_ID}`
const limit="?page=1&per_page=10"
const url="https://gitlab.com/api/v4/projects/" + project_id + "/repository/branches" + limit

const options = {
	method: "GET",
	headers: {
		"Content-Type": "application/json",
		"PRIVATE-TOKEN": token
		}
	}

const response = await fetch(url,options)
const body = await response.text()

const array_aa = JSON.parse(body)

console.log(array_aa.length)

for (var it in array_aa)
	{
	const unit_aa = array_aa[it]
	var str_out = unit_aa.name + "\t"
	str_out += unit_aa.merged + "\t"
	str_out += unit_aa.commit.author_name + "\t"
	str_out += unit_aa.commit.created_at
	console.log(str_out)
	}
console.error ("*** 終了 ***")

// ---------------------------------------------------------------
```
pyenvを使用してM1MacにPython3.8系をインストールする方法

### 結論
``` shell
$ pyenv install --patch 3.8.6 <<(curl -sSL https://raw.githubusercontent.com/Homebrew/formula-patches/113aa84/python/3.8.3.patch\?full_index\=1)
```
本当はマイナーバージョンまで合わせたいところだけど、開発用にPython 3.8系の環境が欲しいだけならコレで十分かな。

<br />


### v3.9.1以降は普通にpyenv install可能
``` shell
$ pyenv install 3.9.1
```
https://www.python.org/downloads/release/python-391/

### 参考
- https://github.com/pyenv/pyenv/issues/1768#issuecomment-753756051
パイプ区切りファイルをカンマ区切りファイル（CSV）へと変換したい

パイプ区切りファイルを CSV(Comma Separated Value) = カンマ区切り ファイルへと変換するスクリプトを紹介します。

以下のようなパイプ区切りファイルがあるとします。
```
$ cat pipe.txt 
 id |  name  | score | class
----+--------+-------+-------
  1 | Yamada |    90 |     2 
  2 |   Sato |    80 |     1
  3 | Suzuki |    95 |     1
```

以下の三つを目的としたワンライナーを書くと、次のようになります。
①　パイプ（|） をカンマ(,)に変換
②　余計な空白を削除
③　二行目を削除

```
$ sed -e 's/|/,/g' -e 's/ //g' ./pipe.txt | sed '2d'                
id,name,score,class
1,Yamada,90,2
2,Sato,80,1
3,Suzuki,95,1
```

ついでにこれをシェルスクリプト化しておきます。``chmod``コマンドで実行可能な状態にしておきます。

```
$ cat ./converter.sh 
#!/bin/bash

sed -e 's/|/,/g' -e 's/ //g' ./$1 | sed '2d' > ./$2
echo convert $1 to $2

$ chmod 755 ./converter.sh
```

第一引数に変換元のファイル、第二引数に変換後のファイル名を指定することで、変換可能です。
```
$ ./converter.sh pipe.txt comma.csv
convert pipe.txt to comma.csv

$ cat comma.csv 
id,name,score,class
1,Yamada,90,2
2,Sato,80,1
3,Suzuki,95,1
```

ご覧いただきありがとうございました。
B - Contest with Drinks Easy  AtCoder

## 問題
https://atcoder.jp/contests/abc050/tasks/abc050_b


## 回答

```Python

n = int(input()) #問題の数

t = list(map(int, input().split())) #ドリンクを飲む前の問題を解くのにかかる時間

m = int(input()) #ドリンクの種類

for _ in range(m):
    p, x = map(int, input().split()) #ドリンクを飲んだ後の問題と、それを解くのにかかる時間
    i = t[p-1] #ドリンクの種類　= ドリンクを飲む前の問題を解くのにかかる時間[ドリンクを飲んだ後の問題 - 1]
    t[p-1] = x #ドリンクを飲む前の問題を解くのにかかる時間[ドリンクを飲んだ後の問題 - 1] = ドリンクを飲んだ後の問題を解くのにかかる時間
    print(sum(t)) 
    t[p-1] = i #ドリンクを飲む前の問題を解くのにかかる時間[ドリンクを飲んだ後の問題 - 1] = ドリンクの種類

```

## ポイント
下記箇所がうまく言語化できず。

```
    i = t[p-1] #ドリンクの種類　= ドリンクを飲む前の問題を解くのにかかる時間[ドリンクを飲んだ後の問題 - 1]
    t[p-1] = x #ドリンクを飲む前の問題を解くのにかかる時間[ドリンクを飲んだ後の問題 - 1] = ドリンクを飲んだ後の問題を解くのにかかる時間
    print(sum(t)) 
    t[p-1] = i #ドリンクを飲む前の問題を解くのにかかる時間[ドリンクを飲んだ後の問題 - 1] = ドリンクの種類

```
[AWS] WAFマネージドルールのカスタマイズ

# 概要
AWS REST API で展開しているWebアプリケーションにおいて、[403 ERROR The request could not be satisfied.]エラーが発生してしまった際の解決メモ

# AWS構成
## 使用サービス
- AWS 
- Lambda
- API Gateway
- CloudFront
- WAF

## 構成
- Lambda(PHP)をAPI Gateway(REST API)にて展開している
- API GatewayはCloudFront経由で呼び出し
- WAFをCloudFront、API Gatewayの前に設置
    - マネージドルール[AWSManagedRulesCommonRuleSet]をデフォルトのまま設定

# Webアプリケーション／エラー発生個所
- PHP8.0.17
- エラー発生個所は画像ファイル(約1MB)を数枚アップロードしている処理内

# エラー情報の詳細
- PHPで記載したWebアプリケーションで画像ファイルなどをアップロードする箇所で以下のエラー発生

> 403 ERROR
The request could not be satisfied.
Request blocked. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/1d8c62a2-3868-5ae4-2db3-bc0ab3cedfb6.png)


# エラー調査
- WAFのメトリクスを確認した所、BLOCKのログが確認されました。
    - AWS#AWSManagedRulesCommonRuleSet#SizeRestrictions_BODY
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/0145370c-a8c5-c6ef-8cab-e50fd5448670.png)

- AWS デベロッパーガイドにて仕様を確認

> SizeRestrictions_BODY
リクエスト本文のサイズが最大 10,240 バイトであることを確認します。

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html

- 言い換えると、10,240 バイト(10KB)以上のリクエストを送信しようとしてWAFルールセットに引っかかってしまったようです。

# エラー解決策
- WAFマネージドルールをカスタマイズする事とします。
- WAFルールにおいてはブロックモードからカウントモードに変更する事によって、検知するが、ブロックはしない挙動に変更できます。
    - WAFルール編集画面を開きます。
    - SizeRestrictions_BODYのルールアクションを[カウント]に変更
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/dae1b6e1-69f7-4b9c-7edd-3b2f38d969ad.png)
    - [Save rule]をクリック

# まとめ
- AWS WAFマネージドルールは便利ですが、デフォルト設定のままだとWebアプリケーションが正常に挙動しない場合が有ります。
- マネージドルールは適宜、見直しが必要です。
- ルール検知はするが、ブロックしたくない場合は、[ブロックモード]から[カウントモード]への変更が必要です。
Google UXデザイン・プロフェッショナル認定コースを受けた

巷で話題のGoogleが提供してるオンラインのUXデザインコースを2月に受けてみたのでどんなものか？をまとめてみました。

#### 正式名称：Google UX Design Professional Certificate

https://www.coursera.org/professional-certificates/google-ux-design

*コースを作ってるのはGoogleで、オンラインコースを提供してるのは**Cousera**という会社。

#### 概要
[全７コース](https://www.coursera.org/professional-certificates/google-ux-design#courses)からなり、１コースが約１ヶ月のペース。自分のペースで進めてOK。
コース 1: Foundations of User Experience (UX) Design
コース 2: Start the UX design process: Empathize, Define, Ideate
コース 3: Build Wireframes and Low-Fidelity Prototypes
コース 4: Conduct UX Research and Test Early Concepts
コース 5: Create High-Fidelity Designs and Prototypes in Figma
コース 6: Responsive Web Design in Adobe XD
コース 7: Design a User Experience for Social Good and Prepare for Jobs
 
Googleはコース１から順番に受ける事を推奨してますが、自分の受けたいコースだけ受けるのも大丈夫です。コースごとに[こんな修了証](https://www.coursera.org/account/accomplishments/verify/SXZFSC5M3X2F)がもらえてLinkedinプロフィールに埋め込んだりもできます。
![スクリーンショット 2022-05-06 14.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/86df05bb-89d2-c714-ab6e-940b929bd196.png)

おそらく全7コースを終えるとプロフェッショナル認定証みたいなのが別途もらえるのかな〜と思います。（自分はコース1だけやりました）


#### 料金は？
コース毎の課金ではなく、月額$39のサブスク制。
最初の１週間は無料。
なので、頑張って1ヶ月に複数コース終わらせればかかるコストを抑えられます。


#### どんな感じで進めるのか？
１コースのボリュームが１ヶ月で、Week1〜4の4部構成（コースによって変動）
ビデオ教材、リーディング教材の併用
Googleの現役社員達が各トピックを解説してくれる
動画の途中で4択のクイズが出てきて、正解しないと次に進めない。

#### 英語は難しいか？
このコースは世界中の人のために作ってる感じなので、それほど難しいとは思いませんでした。みんなハキハキわかりやすく話してますし、字幕も出せます。


#### 課題はある？
・３問くらいの選択式の小テストや、実際に自分で思った事、学びを自由にテキスト入力して提出とか
・週の最後に選択式の１０問ほどのテストがある
選択式テストはコースをちゃんとやってさえすれば決して難しいものではないですし、万が一合格点に至らなくても再受験できます。（確か３回まで？？）

それに合格してなくても、そもそもテストをやらなくても次のステップへは進めます、ただ修了証が出ないだけです。自分は修了証ほしかったので頑張りました。

前に別のオンラインコースを受けた時は各セクションのテストが１回しか受けれなく、最初に悪い点を取ってしまい、その後頑張って挽回して最終的になんとか合格したという経験があったので、それに比べたら全然優しいと思います。

#### 実際にやってみての感想
コース１（Foundations of User Experience (UX) Design）は本当にその名の通り基本
・UXデザインとは
・専門用語の解説
・UX関連の様々な職種の紹介
・開発手法
などを体系的に学べます。

ただ、このコースがUIUXデザイナーとして転職する事をゴールとしてるので、ポートフォリオの作り方とか、就活の際のSNSの活用、どういう企業を狙うといいとか、などにも触れます（要はUIUXデザインとは無関係な話も少し出てくるのが個人的にだるかったです。。）

コース２はリサーチで、コース３からようやくストーリーボード、ワイヤーフレームなどを手を動かして作る課題も出てきます。実際にストーリーボードを手書きして、アップロードして提出、他の受講生のデザインを評価するという感じでやるみたいです。


#### 最後に
やはりデザインは実際にユーザーにインタビューしたり、手を動かして作ったりとオンラインコースで学ぶには限度があるかなと思いましたが、入門者が知識を得るにはいいのかなと思いました。
ゆめみのフロントエンドコーディングテストをベースにアプリを作ってみた話


# 初めに
こんにちは、フロントエンドを少しやっているエンジニアっぽい人です。
最近まとまった時間ができたので何か作りたいなーって思っていたらこんな面白そうなツイートを見つけました。


https://twitter.com/Yametaro1983/status/1516250171637923849

Qiitaで有名なやめ太郎さんのツイートです。
おー、いいの発見と思って作ってみることにしました。

ざっくりですが、どのように実装したのか自分の振り返りも込で記事にまとめてみようと思います。

###### 実際に作成したもの
[githubリポジトリリンク](https://github.com/HIROYUKI20200507/yumemi-coding-test2)
[つくったもの](https://yumemivuechart.web.app/)


# 開発環境

 macOS ``11.6.5``
node ``16.14.0``

```json:packaage.json
{
  "name": "yumemi-coding-test2",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "axios": "^0.27.1",
    "chart.js": "^3.7.1",
    "core-js": "^3.8.3",
    "firebase-tools": "^10.7.2",
    "vue": "^3.2.13",
    "vue-chartjs": "^4.0.7",
    "vue-router": "^4.0.3",
    "vuex": "^4.0.0"
  },
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^5.4.0",
    "@typescript-eslint/parser": "^5.4.0",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-plugin-router": "~5.0.0",
    "@vue/cli-plugin-typescript": "~5.0.0",
    "@vue/cli-plugin-vuex": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "@vue/eslint-config-typescript": "^9.1.0",
    "autoprefixer": "^10.4.5",
    "eslint": "^7.32.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "eslint-plugin-vue": "^8.0.3",
    "postcss": "^8.4.12",
    "prettier": "^2.4.1",
    "tailwindcss": "^3.0.24",
    "typescript": "~4.5.5"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/vue3-essential",
      "eslint:recommended",
      "@vue/typescript/recommended",
      "plugin:prettier/recommended"
    ],
    "parserOptions": {
      "ecmaVersion": 2020
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead",
    "not ie 11"
  ]
}
```

# 構成

package.jsonでわかると思いますが、
フレームワークとして、``vue3``を利用しています。

``vuex``を利用し、API通信はStore内で行っており、APIライブラリは``axios``を利用しております。
グラフのライブラリは``chart.js``を利用してビジュアライズしております。

cssについては、stylesheetを書きたくなかったので``tailwind css``を採用して実装しています。

本番環境のhostingには``firebase hosting``を利用してデプロイ環境を構築しています。

# 懸念点・改善点
- ``store``の``typescript``実装ができておらずany型を利用してしまっている
- コーディングテストの要件にマッチしていない点がある
    - 棒グラフで実装できていない
    - ``typescript``の実装が不十分
    - テストコードを書いていない
- ``chart.js``のグラフの色を無理やり実装しており、ライブラリのオプションを活かしきれていない
- APIkeyがどうしても隠せない・・・

# 作ってみての感想
まだ完全にできているわけではないのですが、形にはなりました・・・
データ加工を多分に実装してしまったので、もう少しきれいにコードをかけそうだなと思う点が多々あるので改善点は多く見られました。(途中でめんどくさくなってきてしまったのはここだけの話)
4日で実装できたので、その点は自分のレベルも上がったかなと感じました！！

全体的にディフェンスの部分がまだまだ不十分さを感じたので、今後テストや保守運用の設計を学習していこうかなと思いました。

# 参考にしたサイト
[API概要　仕様書](https://opendata.resas-portal.go.jp/docs/api/v1/index.html)
[chart.js 仕様書](https://www.chartjs.org/docs/next/)
アノマリ検知 とは

## 勉強前イメージ

なんかの検知方法？

## 調査

### アノマリ検知 とは

[IDS/IPS](https://qiita.com/miyuki_samitani/items/b4676484119a89c00467) での検知方法の一つ。
通常時の通信のパターンやデータ転送値の上限下限を設定しておき、
明らかに超えるような通信量や、通常時とは異なる通信先やプロトコルでの通信が発生した際は
異常とみなしてアラートを出すような仕組みになります。
また最近では機械学習やAIが活用されるケースもあります。
イメージとしてはホワイトリスト形式のような形になります。

不正を検知した状態を異常=アノマリーということから `アノマリー検知` と呼ばれます。

### アノマリ検知のメリデメ

#### メリット

通常時を設定しておいてそれ以外を異常とみなすので
怪しい動きのものは検知の対象になります。
その為、未知の脅威も検知できます。

#### デメリット

登録されている不正パターンの通信を検知するシグネチャ型よりも誤検知が多いです。
たまたま登録しているデータ通信量より多かったら検知の対象になるので通知が多くなる可能性があります。

## 勉強後イメージ

そういえば見たら前やってたな・・・
異常って英語でアノマリーって言うんや、、、

未知のやつって防ぎようのないこと多いから
こういうの設定しないといけないね。

## 参考

- [アノマリ型のIDS・IPSとは？シグネチャ型との違いも解説！](https://it-trend.jp/ids-ips/article/257-0029)
- [アノマリー検知](https://www2.deloitte.com/jp/ja/pages/technology/articles/cyb/glossary/glossary-anomaly-detection.html)
ScalaStyleの利用法

といっても

http://www.scalastyle.org/
http://www.scalastyle.org/sbt.html

を見るだけだが、

```
$ sbt scalastyleGenerateConfig
```
でデフォルトのConfigファイルを作って

```
$ sbt scalastyle
[info] welcome to sbt 1.6.2 (Ubuntu Java 11.0.13)
[info] loading settings for project main-build from plugins.sbt ...
（中略）
[info] scalastyle Processed 14 file(s)
[info] scalastyle Found 0 errors
[info] scalastyle Found 69 warnings
[info] scalastyle Found 0 infos
[info] scalastyle Finished in 46 ms
[success] created output: /home/XXXXXXXXXXX/main/target
[warn] warnings exist
[success] Total time: 1 s, completed Apr 6, 2022, 9:27:45 PM
```
とするだけである。何も迷うことはない。
デフォルト設定から変えたい場合は`scalastyle-config.xml`を修正しなければならないところだけ注意かな。
DockerでLaravelの開発環境をつくる

Dockerの使い方でググっても何もピンと来ない……

調べてるうちになんとなくわかってきたけど、
とりあえずパクるだけで行ける方法を探してみた

## 答え
https://qiita.com/pinevillage/items/57f63f9242cf00d103cb

この記事ほぼそのままでいい。
```docker laravel```だけだと既にあるイメージの使い方っぽいものが検索上位で見えなくて
```docker bitnami laravel```でググったら出てきた。

## 使用するイメージ
https://hub.docker.com/r/bitnami/laravel

CLIで```docker pull bitnami/laravel```として、

プロジェクトを立ち上げたいディレクトリの直下に
```docker-compose.yml```というファイルを作成する。
ファイルの中身は以下の記述。

```:docker-compose.yml
version: '2'

services:
  mariadb:
    image: docker.io/bitnami/mariadb:10.6
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=bn_myapp
      - MARIADB_DATABASE=bitnami_myapp
  myapp:
    image: docker.io/bitnami/laravel:9
    ports:
      - '8000:8000'
    environment:
      - DB_HOST=mariadb
      - DB_PORT=3306
      - DB_USERNAME=bn_myapp
      - DB_DATABASE=bitnami_myapp
    volumes:
      - './my-project:/app'
    depends_on:
      - mariadb
```

立ち上げたいディレクトリで```docker-compose up```を実行
まででとりあえずlaravelのプロジェクト立ち上げ完了。
あとは中身ごちゃごちゃやっていきましょうという感じ。

## 感想
なんとなくのイメージは掴んだつもりになってるけど、
実際に自分で書くのは遠い未来の話になりそう。
コンテナ複数作って接続するぐらいはちゃんとできるようになりたい
家計簿で各月のファイルをバックアップとして保存するマクロを組んでみた！

私はExcelにて家計簿をつけています。仕様としては、一つのファイルから各月のファイルを作成し、マクロにて保存する仕様にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631873/f7f859bc-3bcc-14f4-a1fb-31d954657a76.png)

家計簿を締めるのは月末ですので、月末に当月のファイルを指定のフォルダに保存し、当月のデータを消去して、次月の家計簿をまた入力するという形です。そのプログラムを下に記載しました。相変わらず変数は適当ですみません。
```vb

Sub 月ごとのファイル作成()

 
'    画面処理とYes/No判定の省略

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    
'        ファイル操作に関する処理をインスタンス化

        Dim fso As FileSystemObject
        Set fso = New FileSystemObject
        
    
'        変数の定義

        Dim nen As Long
        Dim tk As Long
        Dim srk As Long
    
'        必要な値を変数に格納
    
        nen = Mid(year(Date), 3, 2)
        tk = Month(Date)
        srk = year(Date)
     

'        家計簿ファイルを名前と拡張子を変更してコピーし､
'        所定のフォルダに格納
        
        Call fso.CopyFile("C:\Users\h_mat\Documents\その他\家計簿\家計簿.xlsm" _
            , "C:\Users\h_mat\Documents\その他\家計簿\" & srk & "\" & "家計簿" & nen & "年" & tk & "月" & ".xlsm", True)
     
     
'    後始末

    Set fso = Nothing
    

End Sub
```

ブロックごとの処理の解説は、コメントとして記載してあります。このプログラムの肝は何と言ってもFileSystemObjectのステートメントです。これを使うことにより、ファイルやフォルダ操作の処理を行うことができます。

手作業でファイル操作やフォルダ作成などを行うよりもはるかに効率が上がりますので是非一度、応用してみてください。

エンジニアファーストの会社　<a href="https://www.cre-co.jp/">株式会社CRE-CO</a>　H_M
プログラムの属性

## プログラムの属性
<b><font color = blue>再配置可能(リロケータブル)</font> - 主記憶上のどのアドレスに配置しても、実行できる。
<font color = blue>再入可能(リエントラント)</font> - 同時に複数のタスク（プロセス）が共有して実行しても、正しい結果が得られる。
<font color = blue>再使用可能(リユーザブル)</font> - 一度実行した後、リロードせずに、実行を繰り返しても、正しい結果が得られる。
<font color = blue>再帰的(リカーシブ)</font> - 実行中に自分自身を呼び出せる。
計算量　

## 計算量（オーダ）
<b>データ量の増加に対して、アルゴリズムの実行時間がどれくらい増加するかを割合で表した指標。
## オーダの求め方
<b>計算式の中での一番指標が大きい項だけを考え、それ以外の定数や係数は無視して考える。
①一番指数が大きい項のみ考える。
②係数は除く
## オーダ表記
<b>アルゴリズムの計算量を<font color = blue>0(オーダ)</font>で表す。0(n²)はデータ量がnの時に、n²に比例して計算量が増えていくという意味。
アルゴリズムが順次処理だけならnと計算量は無関係なので<font color = blue>0(1)</font>とする。
n回の繰返しが一重ならnに比例し、<font color = blue>0(n)</font>とする。n回の繰返しが二重なら、オーダを掛け合わせるので、0(n²)と表す。
#### 整列アルゴリズムの計算量
整列アルゴリズムの計算量は0(n²)になる。
#### 探索アルゴリズムの計算量
線形探索法 - 0(n)
2分探索法 - 0(log₂n)
ハッシュ探索法 - 0(1)
widthやheightをアニメーションしてはいけない

# widthやheightをアニメーション化してはいけない

width,heightのアニメーションについて、以下のように記述しているサイトがありました。

> Web上でアニメーション化する最初のルール：height,widthをアニメーション化しないでください。
>https://css-tricks.com/animating-css-width-and-height-without-the-squish-effect/

> CSSwidthとheightプロパティをアニメーション化できると非常に便利です。残念ながら、現時点では、ブラウザを苦痛で悲鳴を上げるための確実な方法です。
>https://pqina.nl/blog/animating-width-and-height-without-the-squish-effect/

英語らしいユニークな言い回しで最悪の手段だということが十分に伝わります。


## なぜいけないのか
結論から言うと、 **リフローを発生させてしまい、処理を重くしてしまう** からwidthやheightをアニメーション化はしてはいけないそうです。
ここから先はリフローの解説と、解決策を記述します。

## そもそもリフローとは
ブラウザでHTMLとCSSが読み込まれてからWebページを表示する際はブラウザレンダリングという処理が行われます。

https://www.yoheim.net/blog.php?q=20140703

![s300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210256/7c145c67-21b4-a290-3b64-e1a41efa121b.png)

ブラウザレンダリングの詳細はこの記事では書きませんが、リフローはこのブラウザレンダリングの工程の1つで **[4]** 、ドキュメント内の要素の位置とジオメトリを計算する処理のことを指します。
width,heightをアニメーション化すると、アニメーションをつけた要素の親要素または子要素のサイズにも影響を及ぼす可能性があり、要素の再計算をする必要が出てきます。つまり、上図の **[4]** と **[5]** の工程を再び行わなければならないということです。
これがパフォーマンスを下げる原因になります。


## 解決策
パフォーマンスの高いアニメーションを実行するには、transformまたはopacityプロパティを使用する必要があります。transformプロパティは、要素を画面に描画（Paint）する前に、要素のテクスチャを直前に更新するようにGPUに指示します。GPUはピクセルの処理に非常に優れているため、高速な処理を実現できます。

ですが、この処理にも欠点があります。要素の内容ではなく**ピクセルのみを操作する**という点です。要素の他のすべての情報がなくなっていることを忘れないでください。この違いがborder-radiusプロパティなどでよくわかります。transformを使用すると要素の角が単純に引き延ばされるあるいは縮ませられるだけになってしまいます。

https://pqina.nl/blog/animating-width-and-height-without-the-squish-effect/

## おまけ
![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210256/a2376871-9581-e857-c080-59d754bd541f.png)
CSS Triggersというサイトでは、どのプロパティにLayoutやPaintが発生するか書いてあります。
上の画像の例では、widthはLayoutやPaintがトリガーされてしまうことが分かります。

https://csstriggers.com/
YoastSEOのバージョン情報の表示


# YoastSEOを設定すると出てくるあのコメント表示させたくない

``` html
<!-- This site is optimized with the Yoast SEO plugin v○○○○ - https://yoast.com/wordpress/plugins/seo/ -->

↑　これとか

↓　これとか

<!-- / Yoast SEO plugin. -->
```


以下を追加して解決

``` functions.php
add_filter('wpseo_debug_markers', '__return_false');
```
CISO マインドマップ 2022 和訳

# CISO マインドマップとは
セキュリティで考慮すべき事項にはどのようなものがあるかが俯瞰できるマインドマップです。
セキュリティの専門家ではない人にセキュリティに対する考慮事項を説明するのに役立つほか、セキュリティプログラムの設計や改良にも活用できます。
セキュリティ業界の時流に合わせて毎年更新されています。
公式サイト：[RAFEEQ REHMAN | CYBER | AUTOMATION | DIGITAL](https://rafeeqrehman.com "RAFEEQ REHMAN | CYBER | AUTOMATION | DIGITAL")

# 著者
RAFEEQ UR REHMAN
オハイオ州コロンバス在住の IT エンジニア。ラホール工学技術大学で、電気とコンピューター工学の学士号および修士号を取得。著作は「HP-UX CSA: Official Study Guide and Reference」「Intrusion Detection with SNORT: Advanced IDS Techniques Using SNORT, Apache, MySQL, PHP, and ACID (Bruce Perens Open Source) 」等多数。

# CISO マインドマップ大分類
- セキュリティオペレーション
- ガバナンス
- ID 管理
- InfoSec 販売
- 在宅勤務
- 予算
- ビジネスの実現
- プロジェクト提供ライフサイクル
- セキュリティアーキテクト
- コンプライアンスと監査
- 法務・人事
- リスク管理

これらの分類を起点に、さらに詳細な事項が記載されています。

# CISO マインドマップ和訳

[PDF 版はこちら](https://drive.google.com/file/d/1EQvI1sGf2Y0YJC5a5oC8N1Z5Du46fd-5/view?usp=sharing "CISO マインドマップ和訳")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/0a159ab4-d711-467e-3a16-96ba69dfe731.png)
Python3: GitLab API の使い方

トークンとプロジェクトID の設定

```text:.env
PERSONAL_ACCESS_TOKEN=glpat-xxxxxx
PROJECT_ID="35195199"
```

プロジェクトのメンバーの取得

```py:get_members.py
#! /usr/bin/python
#
#	get_members.py
#
#					May/06/2022
# ------------------------------------------------------------------
import  os
import  sys
import  json
import  requests
from dotenv import load_dotenv
# ------------------------------------------------------------------
dotenv_path = '.env'
load_dotenv(dotenv_path)
token = os.environ.get("PERSONAL_ACCESS_TOKEN")
project_id = os.environ.get("PROJECT_ID")
#
limit="?page=1&per_page=10"
url="https://gitlab.com/api/v4/projects/" + project_id + "/members" + limit
#
sys.stderr.write("*** 開始 ***\n")
#
headers = {"Content-Type": "application/json",
	"PRIVATE-TOKEN": token}

rr=requests.get(url, headers=headers)
#
json_str = rr.text
dict_aa = json.loads(json_str)
print(len(dict_aa))
#
for unit_aa in dict_aa:
	str_out = str(unit_aa['id']) + "\t" + unit_aa['username'] + "\t"
	str_out += unit_aa['name'] + "\t"
	str_out += unit_aa['web_url']  + "\t"
	str_out += unit_aa['created_at']
	print(str_out)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

プロジェクトのブランチの取得

```py:get_branches.py
#! /usr/bin/python
#
#	get_branches.py
#
#					May/06/2022
# ------------------------------------------------------------------
import  os
import  sys
import  json
import  requests
from dotenv import load_dotenv
# ------------------------------------------------------------------
dotenv_path = '.env'
load_dotenv(dotenv_path)
token = os.environ.get("PERSONAL_ACCESS_TOKEN")
project_id = os.environ.get("PROJECT_ID")
#
limit="?page=1&per_page=10"
url="https://gitlab.com/api/v4/projects/" + project_id + "/repository/branches" + limit
#
sys.stderr.write("*** 開始 ***\n")
#
headers = {"Content-Type": "application/json",
	"PRIVATE-TOKEN": token}

rr=requests.get(url, headers=headers)
#
json_str = rr.text
dict_aa = json.loads(json_str)
print(len(dict_aa))
#
for unit_aa in dict_aa:
	str_out = unit_aa['name'] + "\t"
	str_out += str(unit_aa['merged'])  + "\t"
	str_out += unit_aa['commit']['author_name']  + "\t"
	str_out += unit_aa['commit']['created_at']
	print(str_out)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```
Python で標準入力から行列形式のデータを読み込む


# 概要

-   競プロをやる際に，行列形式のデータを int 型で受け取る場面がよく出てくるのでメモ．
    -   そのままコピペして使えます．
-   動作確認環境
    -   Ubuntu 20.04
    -   Python 3.8.10

```text:sample_input.txt
4
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
```

```python:read_input.py
import numpy as np

def read_stdin():
	n = int(input())
	mat = np.array([list(map(int, input().split(' '))) for _ in range(n)])
	print(mat)
	return (n, mat)

```

-   動作確認

```sh
python3 read_input.py < sample_input.txt
```

標準入力に関しては C 言語とかのほうが楽なんよ
BlenderからMixamo用のファイルを出力

## 概要

Blenderから[Mixamo](https://www.mixamo.com/)用のファイルを出力する方法を紹介します。

デフォルトではFBXにはテクスチャが含まれないため、Blenderから出力したFBXをMixamoにアップロードしてもテクスチャが反映されないようです。
ここでは、テクスチャを反映する方法として、「テクスチャを埋め込む方法」と「FBXとテクスチャをZIP化する方法」の2種類を紹介します。

なお、複雑なシェーダーノードはMixamoで認識されないので、一度テクスチャにベイクする必要があります。

参考：[Blenderで自動ベイク](https://qiita.com/SaitoTsutomu/items/f95fcc7b58f22b872bcf)

## 方法1：テクスチャを埋め込む方法

### 手順

- FBXをエクスポートするときに、パスモードをコピーにして、`テクスチャを埋め込む`をオンにする（下図の赤い枠）
- MixamoにFBXファイルをアップロードする。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/a8572724-8b14-311e-0371-70462f84b16c.png" width="200">

### Pythonで実行

ファイル作成の手順をPythonで記述すると以下のようになります。
対象のオブジェクトを選択して、下記を実行すると、Blenderファイルと同じ場所に、FBXファイルを作成します。

```py
from pathlib import Path

import bpy


def main():
    if not bpy.data.filepath:
        print("Save blend file.")
        return
    if not bpy.context.selected_objects:
        print("Select target.")
        return
    fnam = str(Path(bpy.data.filepath).with_suffix('.fbx'))
    bpy.ops.export_scene.fbx(
        filepath=fnam, use_selection=True, path_mode="COPY", embed_textures=True)
    print(f"Create {fnam}")


if __name__ == "__main__":
    main()
```

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

## 方法２：FBXとテクスチャをZIP化する方法

FBXファイルとは別にテクスチャをファイルに保存し、ZIPでまとめる方法です。テクスチャを一覧しやすくなります。

### 手順

- 関連するテクスチャをファイルとして保存する。
- 同じディレクトリにFBXをエクスポートする。
    - エクスポート時にパスモードをストリップパスにして、パスを無視する。
- これらのファイルをZIP化する。
- MixamoにZIPファイルをアップロードする。

### Pythonで実行

ファイル作成の手順をPythonで記述すると以下のようになります。
対象のオブジェクトを選択して、下記を実行すると、Blenderファイルと同じ場所に、ZIPファイルを作成します。
実行すると、テクスチャのパスが変わりパックが解除されるので注意してください。

```py
import shutil
import tempfile
from pathlib import Path

import bpy


def main():
    if not bpy.data.filepath:
        print("Save blend file.")
        return
    if not bpy.context.selected_objects:
        print("Select target.")
        return
    with tempfile.TemporaryDirectory() as td:
        for obj in bpy.context.selected_objects:
            for slot in obj.material_slots:
                mat = slot.material
                if mat and mat.use_nodes:
                    for node in mat.node_tree.nodes:
                        if node.type == "TEX_IMAGE" and node.image:
                            node.image.filepath = f"{td}/{node.image.name}.png"
                            node.image.save()
        fnam = Path(bpy.data.filepath)
        bnam = f"{td}/{fnam.stem}.fbx"
        bpy.ops.export_scene.fbx(filepath=bnam, use_selection=True, path_mode="STRIP")
        shutil.make_archive(fnam.with_suffix(""), format="zip", root_dir=td)
        print(f"Create {fnam.with_suffix('.zip')}")


if __name__ == "__main__":
    main()
```

以上
BigQueryClientを用いたNumeric型の取得

# はじめに
BigQueryのデータ型には、Structなどの複雑な方も存在するが、他のRDBでも利用できる一般のデータ型として、STRINGやINTEGERなどの型が用意されている。
BigQueryClientでそれらの値をc#の標準型として取得する場合、BigQueryRowからインデクサなどで取得した値の型判定をc#側で行った上でキャストをしてあげればいいパターンが多いが、Numeric(Decimal)型に関しては少し特殊な処理が必要になるので、メモを残しておく。

# データ取得の模擬コード
データ取得のコードとしては、以下のようなものを想定している。
```c#:データ取得
public object GetValue(BigQueryRow row, int columnIndex)
{
    TableSchema schema = row.Schema;
    TableFieldSchema fieldSchema = schema.Fields[index];
    object retObj;
    switch (fieldSchema.Type)
    {
        case "STRING":
        case "BYTES":
        case "INTEGER":
        case "INT64":
        case "FLOAT":
        case "FLOAT64":
        case "BOOLEAN":
        case "BOOL":
        case "TIMESTAMP":
        case "DATE":
        case "DATETIME":
        case "TIME":
            retObj = row[index];
            break;
        case "NUMERIC":
        case "DECIMAL":
            // 実際にこの列から取得されるTypeは<see cref="Google.Cloud.BigQuery.V2.BigQueryNumeric"/>だが
            // 利便性を考えて.NET標準の型直して返す。
            // decimalとして取得時にOverflowや丸めの必要が生じた場合は例外を投げる。
            retObj = row[index];
            if (retObj != null)
            {
                BigQueryNumeric bqn = (BigQueryNumeric)row[index];
                retObj = bqn.ToDecimal(LossOfPrecisionHandling.Throw);
            }
            break;
        case "BIGNUMERIC":
            // BIGNUMERICに対応するC#のクラスがライブラリ上定義されていないようなので例外発生
        default:
            throw new ArgumentOutOfRangeException($"{fieldSchema.Type} は扱えません");
    }
    return retObj;
}
```

# 解説
Numeric、Decimal以外の型は対応するC#の標準型があるのでそのままreturnしているが、Numericは範囲や制度の関係上単純にdecimalとすることができないため、C#ではBigQuery専用のBigQueryNumericとして取得される。
BigQueryNumericからdecimalへの変換は、ToDecimalメソッドを用いればよいが、その場合に丸めが生じた場合の扱いは業務要件によって異なってくる。なお、今回の例では例外を発生させている。
RPAとは

# 誤解
デスクワークの自動化に対する概念だと思っており、
マクロとかshで実現出来るからRPA用のツールを入れる必要が無いと考えてました。

# 実態
Robotic Process Automation
ロボットによる業務自動化

人間の作業を代替するロボットを作って作業を簡素化する
ソリューションによってはGUIベースでアルゴリズムを作れるから
ノンコーディング、プログラムスキルがなくてもロボット作れる。
フローチャートやワークフロー等でアルゴリズムを作ってロボットを操作する。



# 使用感
経費申請系の承認情報を全社員分確認するロボットを作ったのですが、
画面標示ViewだけではなくHTMLの内容を分析したり、
画面の挙動をチェックしたりと色々苦戦しました。
対象のページが綺麗なHTMLで記載されていれば多分楽だったんでしょう。

ブラウザ上での単純作業を自動化するのであればselenium等で代替する手段も選択肢に入りますが、
MSOffice文書とブラウザでのデータ登録の組み合わせ等で利用する場合、
アプリケーションやシステム導入をせずにRPAツールだけで実現可能な業務は結構多いと思われます。
データの探索

## データの探索
<b>配列などを使って目的のデータを探し出すこと
### 線形探索法
<b>配列の先頭から順番に目的のデータを探していく方法
時間がかかる。
#### 番兵法
<b>線形探索法を一工夫したもの。
探索したい目的のデータを配列の最後尾に追加する方法。
番兵で一致すれば、データは無いということ。
平均探索回数は<font color = blue>(N+1)/2</font>です。
### 2分探索法
<b>目的と配列の中央のデータを比較し、一致しなければ、大小関係から中央を除いた前半、後半のどちらかに範囲を限定する。これを繰返し、一致するか範囲がなくなるまで続ける。この探索法はデータが昇順、降順に並んでいることが前提。
平均比較回数はlog₂N回、最大比較回数はlog₂N+1回。※log₂はlogNと書くこともある。
### ハッシュ探索法
<b>目的のデータの格納先のアドレスを、関数を用いて算出して探索する方法。
格納先のアドレスが衝突してしまうことを<font color = blue>シノニム</font>という。
これが発生すると別の方法で格納先を求める必要がある。
#### 探索回数
<b>ハッシュ値が衝突する確率は無視できるほど小さいとすると、探索回数は1になる。
ハッシュ値が衝突する確率が最も低くなるのは一様分布で近似されるとき。
<font color = blue>一様分布</font>とは、全ての事象が起こる確率が一定である確率分布のこと。
docker-composeにてVue.jsの開発環境を構築する

# 環境構築手順
## 前提
1. Docker Desktopがインストールされていること

## Dockerコンテナ作成
### 1. docker-compose.ymlの作成

docker-compose.ymlファイルに以下の定義を記載します。
今回は、シンプルにVue.jsのプロジェクトを配置するためのコンテナのみの構成とします。

``` yml
version: "3.4"

services:
  client:
    build: ./app
    container_name: app
    ports:
      - "8080:8080"
    expose:
      - "8080"
    volumes:
      - ./app:/app
    tty: true
    stdin_open: true

```

### 2. Vueプロジェクトの作成先のディレクトリを作成
Vueプロジェクトの作成先のディレクトリを作成します。

``` command
mkdir app
```

### 3. Dockerfileを作成
Vueプロジェクトを配置するコンテナのイメージをDockerfileに定義し、`npm`、`vue-cli`をインストールします。

``` Dockerfile
FROM node:18.1-alpine

WORKDIR /app

RUN apk update && \
    npm install -g npm && \
    npm install -g vue-cli

EXPOSE 8080

```

### 4. コンテナを起動
定義をしたコンテナを起動します。

```
docker-compose up -d --buid
```

## Vueプロジェクト作成
### 5. Vueプロジェクト作成

`Vue CLI`を使用して、Vueプロジェクトを作成します。

```
docker-compose exec client sh
/app/tsun-docku # vue create .
```

以下の警告が表示されたら、記載に従って`vue/cli`の最新版を取得します。

```
Vue CLI v5.0.4
? Generate project in current directory? (Y/n) Y
```

以下の警告が表示されたら、記載に従ってvue/cliの最新番を取得します。

```
  vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6.
  You may want to run the following to upgrade to Vue CLI 3:

  npm uninstall -g vue-cli
  npm install -g @vue/cli
```

プリセットの要求が表示されたら、「` Default ([Vue 3] babel, eslint)`」を選択して、Enterを押下します。
```
Vue CLI v5.0.4
? Please pick a preset: (Use arrow keys)
❯ Default ([Vue 3] babel, eslint)
  Default ([Vue 2] babel, eslint)
  Manually select features


```

依存関係の要求が表示されたら、「`Use NPM`」を選択して、Enterを押下します。

```
Vue CLI v5.0.4
? Please pick a preset: Default ([Vue 3] babel, eslint)
? Pick the package manager to use when installing dependencies:
  Use Yarn
❯ Use NPM
```

Vue Projectの作成が完了するのを待ちます。

### 6. 疎通確認

作成されたVueプロジェクトを起動します。

```
 $ npm run serve

/app # npm run serve

> app@0.1.0 serve
> vue-cli-service serve

 INFO  Starting development server...


 DONE  Compiled successfully in 111561ms                                                                                                                                                                                     10:36:52 AM


  App running at:
  - Local:   http://localhost:8080/

  It seems you are running Vue CLI inside a container.
  Access the dev server via http://localhost:<your container's external mapped port>/

  Note that the development build is not optimized.
  To create a production build, run npm run build.
```

`http://localhost:8080/`にアクセスし、デフォルトの画面が表示されたら、初期環境構築の完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488212/6730e80a-dc28-7151-bf20-6cf873a4d5ad.png)
「dlibベースの顔照合プログラム face_recognition」への追記

先に[dlibベースの顔照合プログラム face_recognition](https://qiita.com/nonbiri15/items/f95b5fb01ae38980c9ce)の記事を書いた。

その後、ライブラリが更新されているので、その中で気づいた点を記載する。

## 理想的な顔照合では
- 良好な正面顔を登録画像としていれば、多少の顔向きの変動があっても、同一人物の判定が上手くいく、
- 良好な照明条件での正面顔を登録画像としていれば、照明条件の変動があっても、同一人物の判定が上手くいく、
- 良好な正面顔を登録していれば、口を大きく開けるとか表情の変動があっても、同一人物の判定がうまくいく。
そういった理想をもっている。

## 実際の顔照合では
- 顔向きの変動が大きくなると（例：顔の横向きの角度が大きくなると）、同一人物であるかどうかの判定ができなくなる。
- 照明条件の変動が大きくなると、同一人物であるかどうかの判定ができなくなる。
- 表情の変化が大きくなると、同一人物であるかどうかの判定ができなくなる。

そのため、1枚の登録画像だけで、顔照合を行なうのは実際的でなくなる。

## 複数枚の登録画像、顔画像の特徴量が得られるときの可能性
そのため、クラスタリングとして、顔画像の分類をする可能性もある。
今回見つけたスクリプトは、face_recognition で得られる特徴量ベクトルを使って、K近傍法あるいはサポートベクトルマシンで分類するスクリプトである。どちらも教師あり学習で、顔の分類を行なうものです。


顔の分類をKNN（K近傍法）を使って、trainしたあとにその結果で分類する例が追加になっている。

### ｋ近傍法を用いた分類 face_recognition_knn.py
ほとんどの顔照合では、顔特徴量間の距離（もしくは類似度）を計算して、それが所定のしきい値の範囲を満たしていたら、顔が一致していると判断するものである。
しかし、その所定のしきい値を何にしたらよいのかについての値は、本人を拒絶する比率と他人を受け入れてしまう比率とのバランスの中で設定される。

しかしながら、顔の特徴量ベクトルが得られるときは、顔照合についてもっと別の手法を使う可能性がある。一つにはクラスタリングによる教師なし学習、K近傍法などの教師あり学習などによって、顔を推定する選択肢の一つである。

ここに含まれているこのスクリプトは、ｋ近傍法を利用して顔照合を行なう例題である。


```
    knn_clf = neighbors.KNeighborsClassifier(n_neighbors=n_neighbors, algorithm=knn_algo, weights='distance')
    knn_clf.fit(X, y)
```

このスクリプトの中では、scikit-learn の中のK近傍法を用いている。
このライブラリでは特徴量がopenな実装になっているので、特徴量ベクトルを使って、ユーザーが学習を実施して、その結果に基づいて推論をすることができるようになる。

特徴量データが、特徴量ベクトルとして示されていないことが多い市販の顔照合ライブラリではできないことが、ここでは可能になる。

次のようなフォルダ構成で、<train_dir>, <test_dir> をスクリプトのユーザーがデータを用意する。

knn_examples/train
knn_examples/test

そうすると、<train_dir>に含まれる顔画像から顔を検出して顔特徴量ベクトルを抽出し、
それを<person1> などの顔のラベルにしたがって分類するようにK近傍法によって学習が実行される。 


```
        <train_dir>/
        ├── <person1>/
        │   ├── <somename1>.jpeg
        │   ├── <somename2>.jpeg
        │   ├── ...
        ├── <person2>/
        │   ├── <somename1>.jpeg
        │   └── <somename2>.jpeg
        └── ...
```


### サポートベクトルマシンを用いた分類 face_recognition_svm.py
これも顔特徴量ベクトルによって顔の推定を行なう学習と推論のスクリプトである。
教師あり学習のアルゴリズムの一つサポートベクターマシンを使っているスクリプトである。
顔検出・顔特徴量を導出したあとの学習と推論の部分が、K近傍法の場合と違っている。


### facerec_from_webcam_multiprocessing.py
[multiprocessing](https://docs.python.org/ja/3/library/multiprocessing.html) を使ってwebcam からの顔検出を実行するものです。

これも、実装の見本のコードなので,"obama.jpg" と"biden.jpg"と２つの画像の顔画像を参照画像とするものになっています。

自分用に実用になるツールにするには、参照用の顔画像を自分の目的にあわせてメンテナンスすることです。


## このライブラリでのサポート範囲外のこと
このライブラリでは、顔属性推定は含まれていない。
年齢性別、メガネの有無・口を開けているかどうか
表情の分析は含まれていない。