OmniAICreator/Qiita-1.07M huggingface dataset:
WebGLビルドの際に br で出力されるのを gz に変更する

# 結論
```
[File] -> [Build Settings ...] -> [Player Setting] -> [Player] -> [Publishing Settings]
```

の `Compression Format` を `Gzip` に変更する

# 環境

unity editor 2021.3.8f1

# 経緯

最新の LTS でビルドすると拡張子 `br` で出力されて、 unityroom で動作しなかったので変更するため。
ひたすら素数を生成するプログラムを書いてみた

アタマの体操がてら、ひたすら素数を生成するプログラムを書いてみた。
# Source
```prime_num.py
import math
import sys

def check(num, prime_num):
    index = 0
    if not prime_num:
        prime_num = [2]
    min_factor = prime_num[index]
    max_factor = math.floor(math.sqrt(num))
    while min_factor <= max_factor:
        remainder_big = num % max_factor
        remainder_small = num % min_factor
        if remainder_big == 0 or remainder_small == 0:
            return False
        else:
            index += 1
            min_factor = prime_num[index]
            temp = num / min_factor
            if temp <= max_factor:
                max_factor = math.floor(temp)
            else:
                max_factor -= 1
    return True

num = 2
prime_num = list()
max = int(sys.argv[1])
while num <= max:
    if check(num, prime_num):
        prime_num.append(num)
    num += 1
for i in prime_num:
    print(i)
```
# 仕様
単純にひたすら総当りで計算しても良いのだが、計算を効率化するためにいくつか改善点を導入した。
- ある値の最大の約数は平方根までになるので、それ以上の値は検証しないようにした。
- ある値を検証する際、小さい方と平方根を上限とする大きい方の両側から検証して、検証する値を小さい方の値で割った値を上限に更新していくことで検査する約数のレンジを絞り込むようにした。
- 合成数(非素数)を用いて検証する必要はない(合成数の約数で割り切れるのは明らかだから)ので、これまで生成した素数をListに格納して、それを用いて検証するようにした。
# 実行速度
```
$ date && pypy3 prime_num.py 10000000 >/dev/null && date
2022年  8月 23日 火曜日 17:51:48 JST
2022年  8月 23日 火曜日 17:52:04 JST
```
Pypy使えば、1000万以下の素数を全てリストアップするのに16秒くらい。けっこう速い。
[以前に同じようなコードを書いたとき](https://qiita.com/wildeagle/items/aecd448ede9965c8108a)には同じマシンで53秒かかっていたみたいだから、だいぶ高速化できた。
pipインストールで依存関係でエラー発生の対処　メモ

環境
Windows10 pro
python3.7


requirements.txtで以下のインストールする為のアプリケーションを記述。
````
base58==1.0.3
ecdsa==0.13
Flask==1.0.2
requests==2.21.0
````
ターミナルでインストールを実行
```
pip3 install -r requirements.txt  
````
依存関係のエラーが発生した。
```
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
pandas-datareader 0.10.0 requires lxml, which is not installed.
flask-sqlalchemy 2.5.1 requires SQLAlchemy>=0.8.0, which is not installed.
docxtpl 0.15.2 requires lxml, which is not installed.
conda-repo-cli 1.0.4 requires pathlib, which is not installed.

```
pandasに問題があると思い。
アップデートしました。
```
pip3 install --upgrade pandas
```
インストール時に次の依存関係のエラー
```
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
pandas-datareader 0.10.0 requires lxml, which is not installed.
```
pandas-datareaderをインストールするが、また依存関係のエラー
```
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
pyshark 0.4.5 requires py, which is not installed.
```
pyshark をインストールして無事にインストールができたので
再度、pandas-datareaderをインストール
正常にインストール完了し、 pandasを再度アップデートして無事インストール完了。
再度
```
pip3 install -r requirements.txt
```
を実行したら正常にインストール完了しました。
AIが画像を作成してくれるStableDiffusionを触ってみた　実行編　※NVIDIAのGPUがなくて断念

タイトル通りですが、NVIDIAのグラボ（GPU)がないとダメ見たいです。
とりあえずできたところまで記載します。

##### 環境構築がまだの場合以下で環境構築する
https://qiita.com/thithi7110/items/365cbb3fc16899b17aab

##### 1.txt2img.pyを実行
humanというテキストで画像を作成～

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/556bc7d9-22ff-d9c1-18b8-73b60aaeb308.png)

エラー　cudaのinitでこけてしまった。NVIDIAのGPUが必要とのこと・・。残念
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/5b082789-7de4-e4a6-0994-8a2fce2c1b88.png)
AIが画像を作成してくれるStableDiffusionを触ってみた　環境構築

## AIが画像生成してくれる、Python OSSであるSatableDiffusionを使ってみた


###### 1. Anacondaが必要なので[こちら](https://qiita.com/thithi7110/items/fd273fb7ae148b5335bc)を参考にインストール

https://qiita.com/thithi7110/items/fd273fb7ae148b5335bc)

##### 2. githubからstable-diffusionをクローン
github: [stable-diffusion](https://github.com/CompVis/stable-diffusion)

##### 3. Anaconda promptを起動し、ルートフォルダで以下を実行
conda env create -f environment.yaml

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/6b7ca02b-8f52-974b-8695-89306c0d6db0.png)

何やらエラーが・・
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/0be98751-009d-2054-e2f7-38a5a4491160.png)


環境変数追加したり、dll移動したりとやったけどAnacondaが古かったことが原因のよう。
（上記のAnacondaは最新のものに変えたバージョンのリンクを記載しております）

次に発生したエラーはコマンド実行できるgit入っていない・・（soucetree使ってたのでgitコマンド使えるようにしていなったため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/a36bfc99-257e-673f-1b14-4a80fd1a9b21.png)

git入れときます。
https://qiita.com/taiponrock/items/632c117220e57d555099

再度実行、別窓でくるくる　めちゃ時間がかかる・・あとサイズ約600MBと大きいので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/6dfdbced-37fc-2483-0039-0c33224b1cb4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/00747a44-c999-d973-5021-cf3e62edadd8.png)

###### 4. ldmを有効にする
conda activate ldm

##### 5. pytorchのインストール　1GBほどあるので注意
conda install pytorch torchvision -c pytorch

##### 6. transformersのinstallとeditable mode実行
pip install transformers==4.19.2 diffusers invisible-watermark
pip install -e .


##### 7.試しに動かすためのckpt(チェックポイント)ファイルを取得

the CompVis organization at Hugging Face　から取得
https://huggingface.co/CompVis
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/8383a97c-05f9-8a36-e3e0-2423adeb3b0f.png)

Modelの欄のstable-diffusion-v1-1-original
https://huggingface.co/CompVis/stable-diffusion-v-1-1-original
※サインアップとライセンスへの同意が必要。

Files and versionsの欄のsd-v1-1.ckptファイルを選択し、download実施
※4gbほどの大きいファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/06fbb7b4-eed6-f69d-a60c-4d2ec09a63a1.png)

ダウンロードしたファイルを以下に移動
C:\work\prod\stable-diffusion\models\ldm\stable-diffusion-v1
名前をmodel.ckptに変更
入出力装置まとめ（エンベデッドシステムスペシャリスト午前Ⅱ）

# 目的
アウトプットによる理解の促進と情報共有。

# 出力装置
### LED表示装置（LEDビジョン）
サイズが自由、高輝度であり屋外向け。耐久性もLCDより高い。
デジタルサイネージなどに利用される。

### CRT
蛍光体の塗布された面に順次電子銃で電子を当てて発光させる方式の表示装置。
応答性に優れるが、容積や重量が大きい。
いわゆるブラウン管。

### LCD
電圧をかけることで内部の結晶の配列が変化する性質を持つ物質（液晶）をガラス基板の間に封止し、両側に設置した電極に電圧をかけることにより光の透過率や変更の方向を変え、表示を行う。
規格に基づくサイズしか作れない。

### 有機ELディスプレイ（OLED）
電圧をかけると発光する性質を有する固体の両側から電圧を印加する方式の表示装置。
サイズが自由かつ視野角の問題がないが、寿命はLCDよりも短い。

# 補助記憶装置
エンベデッドシステムにおいても利用することがある。
代表的な補助記憶装置は以下。
| 名称 | 媒体 | 交換有無 | アクセス方式 |
|:-|:-|:-|:-|
| HDD | 磁気 | 固定式 |   |
| FDD | 磁気 | 交換式 | ランダムアクセス |
| 磁気テープ | 磁気 | 交換式 | シーケンシャルアクセス |
| SSD | 半導体 | 固定式 |   |
| USBメモリ | 半導体 | 交換式 |   |
| CD, DVD, BD | 光学 | 交換式 |   |

# 気になったこと
特になし
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その001

こんにちは。本橋孝昭です。

Salesfroce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト 
構成と設定の学習　にある練習問題1問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/study-up-on-org-setup

なお、こちらの内容はYouTubeでも公開しております
https://www.youtube.com/watch?v=1z_jjNf6JCE

<iframe width="560" height="315" src="https://www.youtube.com/embed/1z_jjNf6JCE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>






練習問題1問目はこちらです
![問題01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5c6f64a8-cd72-963e-4383-3c8a90fbf536.png)


それでは、解説について深堀りしていきましょう


今回の問題の「組織情報」ページはこちらです
![組織01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f6a5f655-1dda-26e0-b421-fb634aeba40f.png)

この「組織情報」ページから
・組織名
・タイムゾーンのデフォルト値
・言語のデフォルト値

の設定が可能です

なお、Aの「営業時間」は「営業時間」から設定するので間違いです
![営業時間01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a3d8b688-1d96-9e9f-99f9-7c5d827a46fb.png)

Cの「Chatter設定」は「Chatter設定」から変更するので間違いです
![chatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2177b9dc-687f-6e23-832b-025f2ed9d18e.png)

Dの「会計年度」は「会計年度」から変更するので間違いです
![会計年度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9be433ed-8a11-cab8-8157-e6999c62d463.png)

なお、組織情報について他の設定を詳しく知りたい場合、
Trailhead
「会社全体の組織設定」で勉強するのがおすすめです
https://trailhead.salesforce.com/ja/content/learn/modules/company_wide_org_settings



今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
Visual Studio でプロジェクトを作るってどうすればいいの？

Visual Studio でプロジェクトを作るってどうすればいいの？

もと組み込み制御プログラマーがWeb系やることになったのでやったこと書いてみる。

C#.NETでデータベースを引いてウェブブラウザで表示・編集するアプリを作れ、という話なので、とりあえず Kindleで2冊 ASP.NET のC#の本を手に入れて、開発環境から作るところを見ながらやってみる。

Visual Studio を用意しろ、とどっちにもあったので、Visual Studio Community のページを開いてダウンロード、多分本どっちかに書いてあったとおりに ASP.NETとWeb開発、データの保存と処理 を選んだハズ。

インストール後に 田→[V][S]⏎ と打って、どっちの本にも書いてある「新しいプロジェクトの作成」を押そうとするが、見当たらない。どこ？

30分ほど、どこにあるんだーーーーーと探し回ったが見つからず、どうなっているんだろうと考え込んで「Visual Studio 新しいプロジェクトの作成 ない」なんて検索したら、
https://teratail.com/questions/r9zv9ch0hgrsfn
に、”VScodeとVS2022は別” みたいなこと、そして「Visual Studio Code はしょせんエディタです。」なんて書いてある。え？

田→[V]でVisual Studio Codeだけがでて、[S]でもそのまま。
改めて 田→[V][I]って打つと、1行目は Visual Studio Code で同じだが 2行目にVisual Studio 2022 が出てきた！
えっ、そりゃ無いよ。VSCodeがVSで出ておいて、VS2022はVSでは出て来ないとは。
田→[V][I][↓][↓]⏎（もちろん環境によって変わりうるので自分の手元の画面を見る必要あり）で私の手元のマシンで無事VS2022が起動でき、「新しいプロジェクトの作成」を押すことが出来た。
【Unity備忘録】キャラクターが自立しない、ごろごろどっかに行っちゃうときの対処法

# 対処法
RIgidbodyを付けるとちょっとした弾みでキャラクターが転んだり、倒れたりしてしまったのでそれの対処法。

RigidbodyのConstraintsの「回転を固定」のX, Z（Y軸を上としてキャラクターを配置した場合）にチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/6a166888-8a09-4ad5-3ac7-e94b5246ded0.png)


簡単なことかもしれないけど知らないから苦労してしまった。
~/.python_history の場所を変更する

ホームディレクトリに存在する`.python_history`の場所を変更する方法を紹介します．

# この投稿の概要
- `.python_history`は Python の対話モードの履歴を記録するファイル
- デフォルトの設定では，ホームディレクトリに保存される
- ホームディレクトリに dotfiles が多く存在する状況は気持ちが悪い
- 本稿では，`.python_history`の保存場所を変更する方法について紹介

# 環境
- macOS 12.5.1 Monterey (2022 M2 MacBook Air)
- Python 3.10.6 (バージョン管理ツール asdf でインストール)
- zsh 5.8.1 (x86_64-apple-darwin21.0)

本稿では，macOS を対象として説明します．
ですが，Linux においても同様の方法が適用可能だと思われます．

# やること
- 環境変数`PYTHONSTARTUP`にインタプリタ起動時に自動で読み込むスクリプトを設定
- 今回は，`~/.config/python/pythonstartup.py`をスクリプトとして指定
```shell:.zshrc
export PYTHONSTARTUP=$HOME/.config/python/pythonstartup.py
```

- `~/.config/python/pythonstartup.py`に以下を記述
- 以下では，`~/.cache/.python_history`を履歴保存場所に変更
```python:pythonstartup.py
#!/usr/bin/env python3

import atexit
import readline
import os

# save history file as ~/.cache/.python_history
histfile = os.path.join(os.path.expanduser('~/.cache'), '.python_history')

try:
    readline.read_history_file(histfile)
    readline.set_history_length(1000)
except FileNotFoundError:
    pass

atexit.register(readline.write_history_file, histfile)
```

- シェルを再起動して，pythonを起動すると`~/.cache/.python_history`に履歴が保存されるようになる

<!--
# 補足説明

自分の中でも理解が不十分なので，間違い等があればご指摘ください．
-->

# 参考文献
[Python 3.10.6 Documentation](https://docs.python.org/ja/3/tutorial/interactive.html)
[Unix & Linux Stack Exchages](https://unix.stackexchange.com/questions/630642/change-location-of-python-history)
[まくまくの Python ノート](https://maku77.github.io/python/dev/python-startup.html)
PhpStormで結合された文字列をヒアドキュメントに置き換える

以下のような書き方を

```php
$sql = 'SELECT *' .
    'FROM book' . 
    'WHERE price >= 500';
```

以下にようにしたい
(モノによっては数十行になったりするので手作業は面倒臭い)

```php
$sql = <<<SQL
SELECT *
FROM book
WHERE price > 500
SQL;
```

## やり方

1. １つの文字列にする
    * PhpStormで `Convert concatenation to a scalar value` を選択する
1. ヒアドキュメントに置き換える
    * PhpStormで `Convert string literal to HEREDOC` を選択する

### 1. １つの文字列にする

`Convert concatenation to a scalar value` を実行

```php
$sql = 'SELECT * FROM book WHERE price >= 500';
```

### 2. ヒアドキュメントに置き換える

`Convert string literal to HEREDOC` を実行

```php
$sql = <<<SQL
SELECT *
FROM book
WHERE price > 500
SQL;
```

## 終わり

その他に楽な方法あれば教えてください
CORS

CORS を常に忘れるのでメモ。

CORS とは、ブラウザが別のドメインにある API へアクセス出来るようにする仕組み。これが無いと悪意のあるサイトがユーザのクッキーを使って勝手にユーザの情報を取ってしまえる。

## Simple request

GET, HEAD, POST の中で特定のヘッダしか使わないものを Simple request と呼ぶ。例えば Content-Type として次のものだけが含まれている。

* application/x-www-form-urlencoded
* multipart/form-data
* text/plain

foo.example からサーバ bar.other に単純な GET リクエストを呼ぶ時、ブラウザは Origin ヘッダに呼び出し元のドメインを付ける。

```
GET /data HTTP/1.1
Host: bar.other
Origin: https://foo.example
```

サーバ bar.other はこのリクエストに応答できる時、 foo.example へのレスポンスに `Access-Control-Allow-Origin: *` を付加する。

```
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/xml

body
```

## Preflighted requests

Simple request に当てはまらないヘッダを送る時、ブラウザは事前に Preflighted request を送る。

例えば 上記以外以外の Content-Type 付けたり独自ヘッダを付ける場合、ブラウザは次のような OPTIONS リクエストを送る。

* Origin: 呼び出し元ドメイン
* Access-Control-Request-Method: リクエストに使うメソッド
* Access-Control-Request-Headers: リクエストに使う追加ヘッダ

```
OPTIONS /data HTTP/1.1
Host: bar.other
Origin: https://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
```

サーバ bar.other はこのリクエストに応答できる時、 foo.example へのレスポンスに次のようなヘッダを付加する。

* Access-Control-Allow-Origin: 応答可能なドメイン。リクエストに含まれる Origin の内容か * を指定する。
* Access-Control-Allow-Methods: 応答可能なメソッド
* Access-Control-Allow-Headers: 応答可能な追加ヘッダ
* Access-Control-Max-Age: Preflight request のキャッシュ秒数 (デフォルト 5)

```
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
```

ブラウザは Preflight が成功したら次のようにリクエスト本体を送る。fetch API を使う場合 `mode: cors` オプションが必要な気がしてしまいますがデフォルトで `cors` になっています (https://stackoverflow.com/questions/44121783/fetch-api-default-cross-origin-behavior)。

```
POST /data HTTP/1.1
Host: bar.other
X-PINGOTHER: pingpong
Content-Type: text/xml; charset=UTF-8
Origin: https://foo.example

<data></data>
```

## Serverless framework の AWS Gateway HTTP API を使っての実現方法

手っ取り早く provider の httpApi に `cors: true` 指定すると、全ての API で CORS が有効になります。細かい設定もできる。

```
provider:
  httpApi:
    cors: true
```

参考: https://www.serverless.com/framework/docs/providers/aws/events/http-api/#cors-setup

## 参考:

* MDN: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
* 仕様: https://fetch.spec.whatwg.org/#http-cors-protocol
BitnamiでSSL証明書の更新方法を記載しているドキュメント

例えばBitnamiを使ったWordPressサイトのSSL証明の有効期限が切れたとき、証明書を更新しないとけないのだが、度々「ドキュメントはどこだっけ？」となるので、備忘録として投稿します。

# Generate And Install A Let's Encrypt SSL Certificate For A Bitnami Application

ドキュメントはココ

https://docs.bitnami.com/google/how-to/generate-install-lets-encrypt-ssl

# Step 5: Renew The Let’s Encrypt Certificate

更新手順は『[Step 5: Renew The Let’s Encrypt Certificate](https://docs.bitnami.com/google/how-to/generate-install-lets-encrypt-ssl/#step-5-renew-the-lets-encrypt-certificate)』に記載がある

# 証明書の有効期限が切れる前に自動更新する場合
『Step 5』の記載の直後に[To automatically renew your certificates before they expire](https://docs.bitnami.com/google/how-to/generate-install-lets-encrypt-ssl/#:~:text=To%20automatically%20renew)がある

※ 注意事項：**NGINX**と**Apache**の場合で手順が分かれているので注意
スクラムのスプリント0考慮リスト

## 記事の目的
スクラムにおいて、スプリント0は本来望ましくないが、
実は往々にして見え方を整える目的だったり、チーム整備の目的、発注の関係で、
実施が望まれる展開もある
そんな時のための情報



以下の項目を全てスプリント0中に実施する必要があるというわけではないが、可能な限り検討して進めることが望ましい。
最低半年以上は継続するプロジェクトを想定。

マストリスト（1-2週間以内に決めたいもの）
↓
優先度高リスト（スクラム開始後、1ヶ月以内に少なくとも相談まではしたいもの）
↓
優先度中リスト（スクラム開始後、1-3ヶ月以内に少なくとも相談まで相談はしたいもの）
の順に記載


# マストリスト
### イベントのスケジュール（どのイベントを何曜日に何時間やるか）
        スプリントの期間（1週間など）
        スプリントプランニング（1ヶ月8時間、1週間2時間、PO参加1時間、タスク切りで1時間など）
        リファインメント（1週間2時間など）
        レトロスペクティブ（1週間30分、内部30分）、有名どころでいうとKPT
### ワーキングアグリーメント記載場所の決定
### ざっくりとマイルストーンまでのプロダクトゴールのPBI作る
    POがビジネス目線で作成
    開発チームが着手可能かどうかの判断をするときの最大サイズの決定
    最大サイズの単位も決める（時間なのかポイントなのか）
### アーキテクチャ構成図（記載の粒度は段々あげていく前提）
### gitブランチルールの決定
    自動デプロイのCICDツール選定、モノレポなどを考慮しつつが望ましい
### スクラムガイド2020の確認
　https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf
### インフラパラメータ記載場所（awsなどでCDKを用いてい実装するならこれは不要）
### PBIの記載フォーマット
    少なくとも　完了条件（DOD）　は記載する
### PBIの完了ステータスフローの決定
    開発メンバーの実装終わりステータスはデプロイ待ちステータスとし、POがレビューして良い状態はPOレビュー、それが終わると完了とする？など
### プロダクトゴールの決定
    プロジェクトの期間と、それまでに何を成し遂げたいか、達成する肝となる指標は何か
    例：デザインとページのレスポンススピードでは、ページのレスポンススピードを優先するなど
### スプリントレビューでSM（もしくはdev）が提示する資料のフォーマットの決定
    このスプリントで何を開発したのか（インクリメント）
    何に何時間かかったのか　など、チームの成長のために有効な指標、バグの原因分析などを入れるプロジェクトもある
# 優先度高リスト
### コーディング規約wikiの作成
### テストコードを作るか、その評価敷居値
### 自動テストやるか、やる場合どのようにやるかの決定
### 受け入れの品質基準（コードカバレッジなど）の決定
### コードレビュールール（誰が、どういう観点で見るのか。レビュアーを固定した方がいいのか。何人が見るべきか。）の決定
### ざっくりとした非機能要件のPBI切り
    脆弱性試験
    負荷試験　などなど
### プログラミングの観点でのアーキテクチャ構成（デザインパターンなど）
### 使用環境バリエーションの決定、必要となる時期のざっくり決定
    開発環境、stg環境、prod環境は使用するタイミングがあるか、必要かなど） 

# 優先度中
### ローカル環境構築など作業手順wikiの作成（少なくとも記載場所の確定）
### エクストリームプログラミングの読了（スクラムとは厳密にいうと全く異なるものだが、より具体的なプラクティスが記載され、情報量も多く、スクラムを理解する上で有用。スクラムガイドだけでは記載や単語の意味が漠然としたところの疑問解決に役立てるように使用するのが良い）
### 品質指標の見える化をするかどうかの決定
　　　コードカバレッジやコード重複など
homebrew tapリポジトリを作ってみる

# 序
macOS（またはLinux）用パッケージマネージャー — Homebrew
https://brew.sh/index_ja
を自宅鯖でも利用しているが、
homebrewにないものについて個別にビルド・インストールするのもダルくなってきた。

# リポジトリを作る
homebrew tapのformulaファイルの置き場所 - 年中アイス
https://reiki4040.hatenablog.com/entry/2020/02/18/080000
を参考にリポジトリを作成する。

## 1
githubに homebrew-tap というリポジトリを作成する。
例:
https://github.com/tknr/homebrew-tap

## 2
homebrewリポジトリのテンプレートを作成する。

前提:
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
実行・インストール完了後に

zhlynn/zsign: Maybe is the most quickly codesign alternative for iOS12+ in the world, cross-platform ( macOS, Linux , Windows ), more features. https://github.com/zhlynn/zsign
を
https://github.com/tknr/homebrew-tap
に作成する。

## 3
```
brew tap tknr/homebrew-zsign
/home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/tknr/homebrew-zsign/
brew create https://github.com/zhlynn/zsign/archive/master.tar.gz
```

zsign.rb が作成されるので

```
mv /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/zsign.rb .
```
と自分のtap領域に移動してから
zsign.rb を zsign がビルドされるように、よしなに編集する。
内容の例:
https://github.com/tknr/homebrew-tap/blob/main/zsign.rb
参考:
Homebrewで自作のプロジェクト（ライブラリ）を公開する - Qiita https://qiita.com/mountcedar/items/f10161d4e483aa8c1283

## 4
デバッグ出力付きでインストールしてみる
```
brew install -vd zsign
```
あかんかったら
```
brew untap tknr/homebrew-zsign
(zsign.rbを修正したあとで)
brew tap tknr/homebrew-zsign
```

## 5
成功したら zsign.rb を適宜テキストエディタ等にバックアップして

```
brew untap tknr/homebrew-zsign
```
と、tapを削除する

## 6
作成した github リポジトリ homebrew-tap 以下に
zsign.rb を、先程バックアップした内容で作成する

## 7
以下のコマンドで homebrew-tap 以下の zsign.rb　のインストールコマンドを実行する

```
brew install tknr/tap/zsign
```

# 補足
https://github.com/tknr/homebrew-tap
の zsign 以外は Makefile でのビルド&インストールではないため保留。
NNC210でプラグインを更新する。 画像・音声ファイルの分割と復元が可能

NNCのプラグインは時折更新されていて、pluginsフォルダを更新するだけで利用できる。
定番の、説明可能なAI (XAI)のほか、画像や音を小さく分割して学習・推論などした後に、元の大きさに戻す機能が利用できる。

コードは以下のgithubから得られる。日本語の解説もあり有りがたい。

https://github.com/sony/nnc-plugin/blob/main/README_ja.md
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/0051b9e3-9bb0-e891-bb94-a60d49f8faac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/d68a394e-cd5a-3e2f-6001-a1d82f8dca09.png)
NNCチュートリアル：画像信号処理（超解像）：split imageの紹介と使い方が動画中にある。
https://www.youtube.com/watch?v=U7Gt0p8YqG0
SAP知識ゼロから始めるSAP on AWS - Specialty　取得

## はじめに
　この試験はリリースから歴史が浅く専門の対策講座が存在せず、SAPドキュメントを(SAPと契約していないと?)直接読むことができないです。
そのため、SAPの業務経験も知識もゼロの状態から、始めるには難しい試験であると感じました。

　私の場合は公開されている様々なドキュメント（AWSのドキュメントやSAP公式のブログ、Youtube上にあるSAP関連の動画、果てはAzureのSAPに関するドキュメント）を読み漁ることでなんとか合格をすることができました。

この環境で勉強をしていく中で特に役立ったと個人的に感じた3つの教材・資料を紹介したいと思います。

## 注意事項
* （2022年8月23日時点で)配信中の他のAWS認定試験11個を取得した程度の知識を持った前提で記載しています。AWSのサービスに関する知識も少なからず問われるので、試験範囲内のサービスについては適宜復習なり確認が必要です

* SAP関連の実務未経験者としての意見ですが、確実に合格したいのであれば、実際にSAPの運用経験があり、SAPドキュメントを読める状況にないと厳しいのかなと思いました。SAPドキュメントの中から検索すれば多分一発なんだろうなという情報の裏付けを得るために数時間ネットを彷徨った上で、確信が得られない事もあったりしたので効率がとても悪かったです。　

## ①AWS SkillBuilderにある講座 『SAP on AWS (Technical) (Japanese) (日本語字幕版) 』を受講する
https://explore.skillbuilder.aws/learn/course/external/view/elearning/12875/sap-on-aws-technical-japanese-ri-ben-yu-zi-mu-ban

　この講座を受けることでSAPをAWSで動かす上での概要や注意点を学びました。講座内で関連する資料のリンクを都度出してくれるのでそちらも併せて確認しました。
　ただ、2022年5月にリリースされたばかりの機能であるEC2の終了保護の話が講座内で取り上げられていたりと、験範囲外と思われる要素もあったので、SAP on AWS - Specialty用の講座では無いようです。

## ②AWS SkillBuilderの模擬試験 『AWS Certified: SAP on AWS - Specialty Official Question Set (PAS-C01 - Japanese)』 を受験する

https://explore.skillbuilder.aws/learn/course/external/view/elearning/12528/aws-certified-sap-on-aws-specialty-official-question-set-pas-c01-japanese

　SkillBuilderの模擬試験は、無料なので絶対に受験するべきだと思います。
20問しかありませんが、どんな感じの問題が出るか雰囲気はつかみやすかったです。
ただ、ブラウザの自動翻訳を使っているからか、iPadで開くと、
Japaneseと書かれた模擬試験でも英文のままでした。
PCを使って腰を据えてやる分には良いのですが
試験会場までの移動時間に最後の追い込みとして使うにはちょっと不便でした。

## ③SAPの英語ブログの中から関係してそうな記事を読む。
　正攻法としては、時間が許す限り Genral SAP Guides　のようなドキュメントを片っ端から隅から隅まで目を通すのが理想だと思います。

https://docs.aws.amazon.com/ja_jp/sap/latest/general/welcome.html

しかし、実際にやってみると分量がとても多くどこが重要かわかりずらかったため、時間をかけて読んだ割にほとんど頭に入りませんでした。

そこでSAPの公式ブログであれば(試験に出そうな)重要なネタを重点的に投稿してくれるはずとアタリをつけてチェックしました。

例えば2021年2月8日のKey topics for running sap oracle on aws

https://blogs.sap.com/2021/02/08/key-topics-for-running-sap-oracle-on-aws/

には以下のような情報が載っていたりするため、このブログから得た知見は個人的には大きかったです。

```Windows and Oracle Linux are the only operating systems that Oracle and SAP support on AWS. Linux distributions Suse SLES and Red Hat RHEL aren’t supported for deploying Oracle components in AWS.```

## 合格した感想
* AWS認定全冠制覇のために受験しましたが、そのような目標を持っている人やSAPの構築・運用を仕事にしたい人でない限りあえて受ける試験ではないと感じました。

* その一方で、オンプレからEC2への移行を題材にしてサードパーティー移行ツールとAWSが提供する移行ツールのメリット・デメリットを比較したり、EC2にソフトウェアをインストールして動かす際の運用について問われるため、他のAWS認定試験とは違う視点でより深く考えるきっかけとなり、AWSの理解が少し深まった感じがしました。
サクラエディタのキー割り当て（キーボードショートカット）の設定場所とCtrl+Wで閉じるように設定

# キー割り当て（キーボードショートカット）の設定場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/86326a4f-51a0-6ee7-cc81-d4016eb69d96.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/42ca6b8c-a9e0-062f-1c9f-18c842285c9c.png)

# Ctrl+Wで閉じるように設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8b73253f-e794-a169-8fe0-1ee84cbaa657.png)

『キーに割り当てられている機能』で、 **割付しようとしているキーが他機能で使われているかどうか** が確認可。


# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
サクラエディタ   v2.4.1.2849 32bit (tag v2.4.1)
FastHttpd で nginx を代替してみる

[valyala/fasthttp](https://github.com/valyala/fasthttp) を使って [fasthttpd](https://github.com/fasthttpd/fasthttpd) という http サーバを作ってみました。

大きなサービスでは ALB や Google Load Balancer 使うのですが、小さなサービスではまだまだ http サーバ使ってます。近頃の情勢でなんとなく nginx に代わるサービスないかなーと探していたところ valyala/fasthttp に出会い、開発に着手しました。

早速ですが、以下は私がよく使う nginx の設定ファイルです。 バックエンドは node や php で静的ファイルは nginx で配信します。

```
upstream backend {
    server 127.0.0.1:8000;
}

server {
    listen 80 default_server;
    return 302 https://$host$request_uri;
}

server {
    listen 443 default_server;
    ssl on;
    ssl_protocols      TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate  /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location ~ ^/(404|50.).html {
        root /usr/share/nginx/html;
        internal;
    }
    location ~ ^/(.*)\.(ico|css|git|jpg|jpeg|png|js)$ {
        alias /app/public/$1.$2;
    }
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_intercept_errors on;
        proxy_pass http://backend;
    }
}
```

これを fasthttpd の設定ファイルにすると大体こんな感じになります。https の設定は超簡単です。

```yaml
host: example.com
listen: ':80'

routes:
  - path: ^/(.*)$
    match: regexp
    rewrite: https://example.com/$1
    status: 302
---
host: example.com
listen: ':443'
root: /usr/share/fasthttpd/html
ssl:
  autoCert: true

errorPages:
  '404': /err/404.html
  '5xx': /err/5xx.html

handlers:
  'backend':
    type: proxy
    url: http://localhost:8080/
  'public':
    type: fs
    root: /app/public
    indexNames: [index.html]

routes:
  - path: ^/(.*)\.(ico|css|git|jpg|jpeg|png|js)$
    match: regexp
    handler: public
  - path: /
    handler: backend
```

特徴の 1つとして設定ファイルが yaml 形式なので [jarxorg/tree](https://github.com/jarxorg/tree) を使って一部を上書きできます。

```sh
fasthttpd -f config.yaml -e handlers.public.root=path/to/other-root
```

設定ファイルの全容は https://fasthttpd.org/configuration にあります。
今後はぼちぼちと http/2, http/3 対応やロードバランシングの高速化などやっていく予定です。
フィードバックなどいただけたら励みになります！
Gitでmain以外のブランチを一括削除する

タイトルの通り。ちょくちょく忘れるので備忘録として残しておきます。

```bash
git branch | grep -v main | xargs git branch -D
```

## ちなみにmaster以外のブランチを一括削除するのはこうする
```bash
git branch | grep -v master | xargs git branch -D
```
RaspberryPi Zero2WとペアリングしたJoyConでpygameを使ったイベント取得に躓いた件 [pygame.error: video system not initialized]


# 概要
以前　RaspberryPi3B+をJoyconで操作するプログラムを作っていましたが、やっと手に入れた2Wで動かそうとすると見慣れないエラーで詰まりました。
日本系の解説サイトや公式ドキュメントには `pygame.init()`で初期化してください。としか記載なく詰まっていたところ解決策を見つけたので共有します。

# 何が起きたか

RaspberryPi3B＋で作成し当時実行確認できたプログラムが2Wで動かなかった
まず発生したエラーとその時のソースコードは以下のものです。
JoyStickの名前とボタン数は取得できているためプログラム自体に問題はないように思います。

![エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/d0edbe86-6a5f-283e-9d57-1137671d0297.png)

```vim:修正前
import time
import pygame
from smbus2 import SMBus

def main():
    
    # pygameの初期化
    pygame.init()

    try:
        # ジョイスティックインスタンスの生成
        joys = pygame.joystick.Joystick(0)
        # ジョイスティックの初期化
        joys.init()
        print('ジョイスティックの名前:', joys.get_name())
        print('ボタン数 :', joys.get_numbuttons())
    except pygame.error:
        print('ジョイスティックが接続されていません')


    # ループ
    active = True
    while active:
        events = pygame.event.get()
        for event in events:
            print(event)
        time.sleep(0.1)


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

# 解決策

`pygame.error: video system not initialized` で調べると気になる投稿が見つかりました。

https://stackoverflow.com/a/70806061

```
#this will fool the system to think it has video access

import os
import sys
os.environ["SDL_VIDEODRIVER"] = "dummy"
```
上記のようにダミーのビデオアクセスを作ることで実行できるようになりました。

```vim:修正後
import time
import pygame
from smbus2 import SMBus
import os
import sys
os.environ["SDL_VIDEODRIVER"] = "dummy"

def main():
    
    # pygameの初期化
    pygame.init()

    try:
        # ジョイスティックインスタンスの生成
        joys = pygame.joystick.Joystick(0)
        # ジョイスティックの初期化
        joys.init()
        print('ジョイスティックの名前:', joys.get_name())
        print('ボタン数 :', joys.get_numbuttons())
    except pygame.error:
        print('ジョイスティックが接続されていません')


    # ループ
    active = True
    while active:
        events = pygame.event.get()
        for event in events:
            print(event)
        time.sleep(0.1)


if __name__=="__main__":
    main()
```
![スクリーンショット 2022-08-23 16.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/f13b28ba-6258-5c62-c953-0b60c08aba61.png)


## おまけ
この問題に直面した時の検索では見つけられなかったのですが後日 `os.environ["SDL_VIDEODRIVER"]`で検索すると面白い情報を見つけました。 私はどう足掻いても問題直面時にpygame公式Wikiのこの記事に辿り着けなかったんですが、、この方すごいです。。

> DummyVideoDriver — wiki
You can use PyGame without opening a visible display (e.g. for testing, or for integrating with other frameworks that have their own displays) by using SDL environment variables before you initialise pygame. Environment variables can be set with the os.environ dict in python.


文章的に見るとpygameはそもそもディスプレイ接続前提のように読み取れてしまいますが、pygameのチュートリアル見てもそんなこと書いてないんですよね..(もし書いてたらすいません、その箇所を教えてください)


https://www.pygame.org/wiki/DummyVideoDriver

https://sgrsn1711.hatenablog.com/entry/2021/05/02/224338
Stable Diffusionによる画像生成をGoogle Colaboratoryで実行する

## この記事について
最近オープンソースで公開され話題のStable DiffusionをGoogle Colaboratory上で実行するまでの流れをまとめました。Stable Diffusionは任意のテキスト入力に対して写真のようなリアルな画像を出力するtext-to-imageのモデルです。これはDiffusion Modelという非平衡熱力学から発想を得た生成モデルの一種に基づいており、LAION-5Bという大規模なデータベースを活用して訓練を行ったものです。今回は、主に自然言語処理を対象にした大規模なオープンソースコミュニティーであるHugging Faceより訓練済みモデルをダウンロードします。

## Hugging Faceへの登録
まず[https://huggingface.co/](https://huggingface.co/)よりHugging Faceにサインインする必要があります。

登録を終えたら「Settings > Access Token」より自分のアクセストークンを発行し、記録しておきます。

また、[https://huggingface.co/CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4)内の「Access Repository」をクリックすることで権限を得ましょう。またここで、モデルの作者にメールアドレスとユーザー名が共有されることに注意してください。

なお、モデルの使用にあたってはCreativeML OpenRAIL Licenseに準拠しなければならず、意図的に違法または有害な出力やコンテンツを作成・共有することの禁止や再配布のルールなどについての記載に同意する必要があります。

## Google Colaboratoryでの実行
### GPUの設定
[Google Colaboratory](https://colab.research.google.com/)で新しいノートブックを作成した後、「ランタイム > ランタイムのタイプを変更」からハードウェアアクセラレータとして「GPU」を選択してください。

### パッケージのダウンロード
以下のコマンドで、Stable Diffusionを始め必要なパッケージをダウンロードします。
```
!pip install --upgrade diffusers transformers scipy
```

### 重みのダウンロード
以下の<User Access Tokens>の箇所を、Hugging Faceで取得したアクセストークンで置き換え、モデルの重みをダウンロードします。

```download_weights.py
from diffusers import StableDiffusionPipeline

YOUR_TOKEN = "<User Access Tokens>"
model_id = "CompVis/stable-diffusion-v1-4"
pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=YOUR_TOKEN)
pipe.to("cuda")
```

### 画像生成
以下の<your original sentence>を画像生成の入力となる文章やフレーズに置き換えて実行します。Google Colaboratory上に入力と同名のpng画像が保存されます。なお、入力テキストは英語にのみ対応しているようですが、日本語でもそれらしい出力が見られました。
```generate.py
text = "<your original sentence>"
image = pipe(text)["sample"][0]
image.save("{}.png".format(text))
```

## 生成例
同じ文章（「雪国」の書き出し）から3つの画像を生成します。
```generate_example.py
text = "The train came out of the long tunnel into the snow country"
num = 3
for i in range(num):
  image = pipe(text)["sample"][0]
  image.save("{}_{}.png".format(text,i))
```
![The train came out of the long tunnel into the snow country_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/e6c7929a-7229-802b-d820-a786ac728a47.png)


![The train came out of the long tunnel into the snow country_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/63be8d48-e4f9-519d-9ee3-c065d1fa3c97.png)

![The train came out of the long tunnel into the snow country_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/7791e7ac-e550-b9c8-0062-a6c9a3e8c216.png)

素晴らしいクオリティとバリエーションに思えます。頭の中のイメージの具現化を容易にする技術の普及により、人々の創作活動がどう変化するのか興味深いです。
コメント化の切り替えTips

# 概要

リファクタリング等を行う際に元の処理と新しく作った処理を切り替えるのに「ここからここまでをコメントアウトして...ここからここまでを有効化にして...」というちょっと面倒な作業を解決するTipsです

# 解決策

```php
/*/
processA(); // ここがコメントアウト状態
/*/
processB();
//*/
```

```php
//*/
processA();
/*/
processB(); // ここがコメントアウト状態
//*/
```

(Qiita上でシンタックスハイライトが効いてくれているのでわかりやすい・・・ｗ)

CやPHPやGo、JavaScriptその他諸々の言語で採用されている↓の場合に使用できます。

```php
// 1行コメントアウト

/*
複数行コメントアウト
*/
```


:::note warn
ただしPHPDocのような書き方のコメントが途中にあるとうまく動いてくれないので注意

```php
//*
var_dump('a');
/*/

/**
 * PHPDOcとか
 */
var_dump('b');
//*/
```


:::
三角関数を使いこなそう

# 三角関数を使いこなそう

プログラマ向けの内容です。
三角関数で何が出来るかというのを覚えておくと、中身を知らなくとも怖くありません。
ぜひ使いこなしていきましょう。ここでは2次元での内容となります。3次元も応用として可能です。

# 三角関数で何が出来るか？
①原点(0,0)を中心とした座標の回転 
　※ベクトルの回転と言い換えてもよいでしょう。
②2点間の角度を知る
　※ベクトルの角度を取得すると言い換えてもよいでしょう。

# 前提知識
三角関数では、角度を取り扱うのですが弧度法(ラジアン)というものを使います。
我々の馴染みがあるのは、度数法と呼ばれるもので、何度(°)というやつです。

度数法でいいよー。弧度法(ラジアン)なんて興味ないよーと思われた方は
私もそうです。興味無いです…

なぜ使わなければならないかと言えば、世の中に用意されている数学系の
ライブラリがラジアンしか受け付けてくれないのです(涙)
仕方ないので、覚えてしまいましょう。

# 度数法の範囲 
 0°～ 360°

# 弧度法の範囲
 0.0 ～ 2PI
 ※PI=円周率

***

はい、これだけです。
なので、変換する場合は簡単に出来ます。

1° = 0.01745329251994329576923690768489 rad
※rad = ラジアン

# 度(°) → ラジアン
  degree × 0.01745329251994329576923690768489
  ※degreeが入力の角度

# ラジアン → 度(°)
  rad ÷ 0.01745329251994329576923690768489
  ※radが入力のラジアン角

変換するラッパー関数などを作成して、上手く付き合っていきましょう。
では、ここから本題です。

# ①原点(0,0)を中心とした座標の回転の方法
 どんなプログラミング言語でも、サインとコサインを計算する関数があるので探してみましょう。
 大抵は、sin, cosという名前です。

回転するには、下記の式に当てはめるだけです。
 x' = x * cos(角度) -  y * sin(角度)
 y' = x * sin(角度) +  y * cos(角度)

回転前(x,y) → 回転後(x', y')

※注意点
・原点(0,0)を基準に回転したものです。
   原点以外の回転を行いたい場合は、原点にずらして回転させた後に元の座標に反映させる必要があります。
・角度の指定はラジアンです。
・sinとcosは角度が同じであれば結果は同じなので、１度計算しておけば良いです。
 
# ②2点間の角度を知る方法
 どんなプログラミング言語でも、アークタンジェントを計算する関数があるので探してみましょう。
 大抵は、atan2という名前です。atanというものもありますが、こちらの場合
 第一象限(0°～90°)しか計算できないので、必ず2の方を使ってください。
 
 使い方
   atan2( 点2.y - 点1.y, 点2.x - 点1.x )
 
 これで点1, 点2のラジアン角を知ることが出来ます。


 第一引数に何でyなんやって私も思いましたがこの順番になっています。
 数学的な意味が何かあるんでしょう。(知らんけど)

 ※注意点
 ・単位はラジアンで返る。
 ・値の範囲は -PI ～ PI、弧度法で言えば-180°～180°です。
   0～360°を期待する場合は、変換が必要になります。

***

これで回転できたり、角度は取得できるようになりましたね。
ベクトルを混ぜると内積・外積の話が続きにあり、応用編として記事を書きたいと思います。

それでは良い三角関数ライフを！
AWS Lambdaからteamsへ送信してみる

# 背景
* 新プロジェクトに夜間のバッチ処理の開始の時に、teamsチャネルへ送信する
* バッチ処理失敗の時も送信する


# 調査

* [HTML を使用してカードを書式設定する](https://docs.microsoft.com/ja-jp/microsoftteams/platform/task-modules-and-cards/cards/cards-format?tabs=adaptive-md%2Cconnector-html#format-cards-with-html)
* [メッセージを作成して送信する](https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=cURL)

# webhookを作成
* 参照： [送信 Webhook を作成する](https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/add-outgoing-webhook?tabs=urljsonpayload%2Cjavascript)


# 実装

```py
import urllib3
import json
import datetime

http = urllib3.PoolManager()
DIFF_JST_FROM_UTC = 9

def lambda_handler(event, context):
    url = "xxx"
    
    now = datetime.datetime.utcnow() + datetime.timedelta(hours=DIFF_JST_FROM_UTC)
    theme_color_alert = "d700be"
    theme_color_normal = "0076D7"
    msg = {
            "@type": "MessageCard",
            "@context": "<http://schema.org/extensions",>
            "themeColor": theme_color_normal,
            "summary": "バッチ処理開始しました",
            "sections": [{
                "activityTitle": "バッチ処理定時実行",
                "activityImage": "http://xxx"
                "facts": [
                {
                    "name": "時間",
                    "value": now.strftime('%Y年%m月%d日 %H:%M:%S')
                }, {
                    "name": "メッセージ",
                    "value": "バッチ処理が開始になりました"
                }],
                "markdown": "true"
            }]
    }
    
    encoded_msg = json.dumps(msg).encode('utf-8')
    resp = http.request('POST',url, body=encoded_msg)
```

# 結果
![スクリーンショット 2022-08-23 15.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/efdab22f-7799-bc1f-e608-9c2f8b2cbb61.png)
備忘録：GitHub

コマンドラインからgitを使おうとして失敗したので、トークンを設定。

https://ios-docs.dev/20210813support-for-password/

を参考にトークンの設定を行なった。
（パスワードが変更されたということなのか不明w）

https://ralacode.com/blog/post/github-repository-push/

```shell
$ git init
$ git remote add origin https://github.com/[User_Name]/debug_GOEM.git
$ git add .
$ git commit -m "upload files"

[main 0d130a4] upload files
 19 files changed, 1956 insertions(+)
 create mode 100644 .DS_Store
 create mode 100644 Penalty_x_1__centroidIC_Uniform__betaIC_Mid__annealing_No__/.DS_Store

$ git push
Enumerating objects: 24, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 10 threads
Compressing objects: 100% (23/23), done.
Writing objects: 100% (23/23), 1.14 MiB | 1.88 MiB/s, done.
Total 23 (delta 8), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (8/8), done.
To https://github.com/[User_Name]/debug_GOEM.git
   0b0c0f3..0d130a4  main -> main

```


===

# ゼロからプロジェクトを作る

## create 
https://github.com/new

## プロジェクト名やReadme など最低限の事項を入力

例としてプロジェクト名を`stream_GC_interaction`にする。

## プロジェクトができる

`https://github.com/[username]/stream_GC_interaction`

## ローカルでの作業(最初だけ)

```bash
$ cd ~/Documents/GitHub

(GitHub) $ git clone https://github.com/[username]/stream_GC_interaction.git
Cloning into 'stream_GC_interaction'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

(GitHub) $ ls 
stream_GC_interaction

(GitHub) $ cd stream_GC_interaction/
```

## ローカルでの作業(アップデートなど)

```shell
$ git init
Reinitialized existing Git repository in /Users/[username]/Documents/GitHub/stream_GC_interaction/.git/

$ git remote add origin https://github.com/[User_Name]/stream_GC_interaction.git
# error: remote origin already exists.
(実は何のエラーなのか不明。)

$ git add .

$ git commit -m "upload files"

Enumerating objects: 34, done.
Counting objects: 100% (34/34), done.
Delta compression using up to 10 threads
Compressing objects: 100% (30/30), done.
Writing objects: 100% (33/33), 428.47 KiB | 12.98 MiB/s, done.
Total 33 (delta 5), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (5/5), done.
To https://github.com/[User_Name]/stream_GC_interaction.git
   c5d69f7..1212496  main -> main
   
$ git push
```
【Git】Gitエイリアスの使用 

# はじめ

　　最近、gitのドキュメントを読んでいます。
　　今後の復習のため、ポイントをメモしました。

# 2.7 Gitエイリアス　[gitのドキュメント](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)

Gitは、コマンドの一部だけが入力された状態でそのコマンドを自動的に推測することはない。「**git config**」でコマンドのエイリアスを設定することができる。
例えば↓
```
$ git config --global alias.co checkout
```
こうすると、**git checkout**と同じことが単に**git co**と入力するだけでできるようになる。

新しいコマンドを作成することはできる。(Gitが新しいコマンドをエイリアスで置き換えている)↓
例えば、ステージを解除するコマンド
```
$ git config --global alias.unstage 'reset HEAD --'
```
下記のコマンドが同じ意味となる
```
$ git unstage fileA
$ git reset HEAD --fileA
```

Gitのサブコマンドではなく外部コマンドを実行することもできる。
コマンドの先頭に！をつける。
例えば、git visualでgitkが起動する。↓
```
$ git config --global alias.visual '!gitk'
```
Djangoのセッション管理

Djangoで開発をしていますが、セッションの中身参照方法をよく忘れてしまうので自分用のメモです。

1  ターミナルを開き、現在編集中のファイルに移動しshellに入る。

```
python manage.py shell
```

2 セッションを有効にする

```
from django.contrib.sessions.models import Session
```

3 セッションの中身を参照

```
Session.objects.get(session_key='セッションキーを入力する').get_decoded()
```

*セッションキーに関しては、デベロッパーツールのアプリケーションから取得する。

以上です。
JAVA DTOとDAO

# DAO/DTOパターン
まず最初に、DAO/DTOパターンを理解するときに、
「なぜそんなものが必要なのか？」が一目でわかるような画像があったので
紹介したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661107/9feaa0a8-5d4b-4c56-2cde-88484181c01e.png)
[こちらの記事を参考にしました](https://kanda-it-school-kensyu.com/java-jdbc-contents/jj_ch04/jj_0402/)

メリットとして
- 1レコードのデータを一括で管理できるため、データの受け渡しが容易になる
- アクセス処理の回数を減らしパフォーマンスを向上することができる

よく言われるのは、
DAOはメソッドを持つがDTOはメソッドを持たないと違いを説明する人もいます

私の中での理解
`DTO`→ 型を事前に定義する。データを受け渡すためのクラス。
`DAO`→ SQLを呼び出す。データを操作するためのインターフェイス（メソッド）を提供する

## まとめ
まだ自分でも完全に理解をしていないため、
アウトプットの意味で投稿しました。
理解が違っているところがあればご指摘お願いします。
【SwiftUI】iOS15以前でアラートにボタンを3つ以上付ける

# はじめに
iOS15以前のSwiftUIではアラートに3つ以上のボタンをつける事ができません。
解決する方法があったので紹介します。

iOS15以降での方法は[こちら](https://capibara1969.com/3757/)を参考にしました

# 方法
```swift
Button(action: {
    let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
    let CancelButton = UIAlertAction(title: NSLocalizedString("キャンセル", comment: ""), style: .cancel) { _ in }
    let ActionButton1 = UIAlertAction(title: "システム設定", style: .default) { _ in
        print("システム設定")
    }
    let ActionButton2 = UIAlertAction(title: "ライトモード", style: .default) { _ in
        print("ライトモード")
    }
    let ActionButton3 = UIAlertAction(title: "ダークモード", style: .default) { _ in
        print("ダークモード")
    }
    alert.addAction(CancelButton)
    alert.addAction(ActionButton1)
    alert.addAction(ActionButton2)
    alert.addAction(ActionButton3)
    let windowScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
    windowScene?.windows.first?.rootViewController?.present(alert, animated: true, completion: nil)
}) {
    Text("外観モードの変更")
}
```

# おわり
SwiftUIできない事が多い。。。
正五角形「滋賀県立大学2015年後期第３問」をsympyでやってみた。 

オリジナル

https://mathmathmass.exblog.jp/32136672/


大学入試数学問題集成＞オリジナルと同じです。

https://mathexamtest.web.fc2.com/2015/201511521/2015115210200mj.html#top-0205

# 参考
五角形の作図を含む。

https://qiita.com/mrrclb48z/items/b7742bd57151dc35fdf6

# sympyで計算のみ
```python
from sympy import *
var('a AF')
O=Point(0,0)
A=Point(1,0)
B=Point(2,0)
#
Naikaku=pi*3/5
BAF=Naikaku-(pi-Naikaku)/2
print("#   内角=",Naikaku*180/pi,"度")
print("#   BAF= ",BAF   *180/pi,"度")
AF=solve(Eq(1**2,1**2+AF**2-2*a*AF),AF)[1]
AD=AF+1
AD=AD.subs({a:cos(BAF)})
print("#(1)",AF,AD)
C=B+Point(cos(pi-Naikaku),sin(pi-Naikaku))
OC2=(O.distance(C)**2).simplify()
print("#(2)",OC2)
D=A+Point(AD*cos(BAF)    ,AD*sin(BAF)    )
E=A+Point(   cos(Naikaku),   sin(Naikaku))
OA2=(O.distance(A)**2).simplify()
OB2=(O.distance(B)**2).simplify()
OD2=(O.distance(D)**2).simplify()
OE2=(O.distance(E)**2).simplify()
print("#(3)",pi*(max([OA2,OB2,OC2,OD2,OE2])-min([OA2,OB2,OC2,OD2,OE2])))
print("#(3)",float(pi*(max([OA2,OB2,OC2,OD2,OE2])-min([OA2,OB2,OC2,OD2,OE2])).simplify()))#   内角= 108 度
#   BAF=  72 度
#(1) 2*a 1/2 + sqrt(5)/2
#(2) sqrt(5) + 4
#(3) pi*(sqrt(5) + 3)
#(3) 16.449592691810107
```

# sympyでうまくいかなかった例
交点計算でチャレンジ。
(3)の数値は、正しいように見えます。
```python
from sympy import *
t=(2*pi)/5
A=Point(cos(pi/2+t*2),sin(pi/2+t*2))
B=Point(cos(pi/2+t*3),sin(pi/2+t*3))
C=Point(cos(pi/2+t*4),sin(pi/2+t*4))
D=Point(cos(pi/2+t*0),sin(pi/2+t*0))
E=Point(cos(pi/2+t*1),sin(pi/2+t*1))
scl=1/(A.distance(B)).simplify()
A=A*scl
B=B*scl
C=C*scl
D=D*scl
E=E*scl
#
O=Point(0,0)
Z=-A+Point(1,0)
A=A+Z
B=B+Z
C=(C+Z).simplify()
D=(D+Z).simplify()
E=(E+Z).simplify()
OA2=(O.distance(A)**2).simplify()
OB2=(O.distance(B)**2).simplify()
OC2=(O.distance(C)**2).simplify()
OD2=(O.distance(D)**2).simplify()
OE2=(O.distance(E)**2).simplify()
print("#(1)",AD)
print("#(2)",OC2)
print("#(3)",      pi*(max([OA2,OB2,OC2,OD2,OE2])-min([OA2,OB2,OC2,OD2,OE2])).simplify())
print("#(3)",float(pi*(max([OA2,OB2,OC2,OD2,OE2])-min([OA2,OB2,OC2,OD2,OE2])).simplify()))
#(1) 1/2 + sqrt(5)/2
#(2) (-10*sqrt(5) + 50 + (5 - sqrt(5))*(sqrt(sqrt(5) + 5) + 3*sqrt(5 - sqrt(5)))**2)/(4*(5 - sqrt(5))**2)
#(3) pi*(-4*(5 - sqrt(5))**2 - 10*sqrt(5) + 50 + (5 - sqrt(5))*(sqrt(sqrt(5) + 5) + 3*sqrt(5 - sqrt(5)))**2)/(4*(5 - sqrt(5))**2)
#(3) 16.449592691810107
```
VSストアドプロシージャの記録



複数のSQLを連続して実行してくれるようなステキ機能を教えてもらいました。
過程でちょいちょい詰まったのでメモ。

ストアドの解説はこちら↓が参考になりました。
[ストアドプロシージャの使い方（PostgreSQL）](https://qiita.com/jiyu58546526/items/5dd2cb70fd2f67d5acf9)



# 詰1　ソフトが落ちる
300行のSQL他数行のSQLをストアドに登録しようとしたところ、A5:SQL Mk-2が落ちました。
重かったのかもしれないです。すまん…。


[DBeaver](https://dbeaver.io/)というソフトに変えたら、長文SQLでもさく……っとはいかないけれど、落ちずに実行してくれるようになりました。
軽いので好きです。
インストールするときzipのものを使うとドライバがなかったりするのでexeを使いました。



# 詰2　Unterminated dollar quote started～　
A5でもDBeaverでもでました。
検索でもよく出てくる気がします。


まずは単純な書きミスの場合。
（このミスする人他にいるんですかね）

```sql
CREATE PROCEDURE hoge_sch.huga() 
LANGUAGE plpgsql
AS $$
(略)
END;
$procedure$
LANGUAGE plpgsql;
```

これだとエラーになります。
ドル引用符＝クォーテーションのような役割らしいので、これだとクォーテーションを閉じたことにならないようです。
そして引用符には名前もつけれるらしいです。
ここがはまったポイントですが。



```sql
CREATE PROCEDURE hoge_sch.huga() 
LANGUAGE plpgsql
AS $$
(略)
END;
$$
LANGUAGE plpgsql;
```

こうか

```sql
CREATE PROCEDURE hoge_sch.huga() 
LANGUAGE plpgsql
AS $procedure$
(略)
END;
$procedure$
LANGUAGE plpgsql;
```

こう書くとエラーはなくなります。
ドル引用符に名前をつけていると、終わりの引用符がないよ！　と怒られるようなので、名前を付けるときは注意しましょう。



# 番外編　Unterminated dollar quote started～　
ソフトの設定がよろしくない場合もあります。

A5であれば

実行位置：プロシージャモード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412138/5a05fe7a-f189-8a40-cf90-3d2bc69cbf93.png)
もしくは

実行位置：先頭からすべて
SQL区切り文字："/"のみの行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412138/0ed5fb98-9fdc-76df-de52-ea354090403b.png)


にすると動きます。
ストアド開いた時点でおおよそプロシージャモードになっているのですけども。
  

---
  

DBeaverであれば、
接続しているデータベースを右クリック->編集　接続->接続設定->Postgres SQLで
Show $$ quate as :の部分をStringに変更してOKをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412138/e72c33ed-31fb-40f8-598e-5f107b08b1a7.png)

これでドル引用符が文字列扱いされるようになります。
うまく実行できないときに発見した設定でしたが、ストアドというか平文でドル引用符使いたい人向けの設定な気が。
趣旨変わってしまいましたが、こういう設定もあるんだなあというメモ。


参考：https://github.com/dbeaver/dbeaver/issues/7183
SupabaseのQuickstart: Vue 3の `npm init @vitejs/app` でエラーになる問題の解決方法

## はじめに

postgresベースの BaaS、 [Supabase](https://supabase.com) を試していようということで、
Vue3のQuickstartをやってみましたが[vite](https://vitejs.dev)を使ってプロジェクトテンプレートを
作成するところでエラーになったので、解決方法を記録しておきます。

## 問題箇所とエラー内容

### Quickstart: Vue 3の問題のある箇所

[Building the App​ > Initialize a Vue 3 app​](https://supabase.com/docs/guides/with-vue-3#initialize-a-vue-3-app)

### エラーになったコマンド(npm 6.x or 7.x)

```bash
# npm 6.x
npm init @vitejs/app supabase-vue-3 --template vue

# npm 7+, extra double-dash is needed:
npm init @vitejs/app supabase-vue-3 -- --template vue
```

### 発生したエラー

```bash
@vitejs/create-app is deprecated, use npm init vite instead

internal/modules/cjs/loader.js:1102
      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
      ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/{username}/.npm/_npx/96769/lib/node_modules/@vitejs/create-app/node_modules/create-vite/index.js
require() of ES modules is not supported.
require() of /Users/{username}/.npm/_npx/96769/lib/node_modules/@vitejs/create-app/node_modules/create-vite/index.js from /Users/{username}/.npm/_npx/96769/lib/node_modules/@vitejs/create-app/index.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename /Users/{username}/.npm/_npx/96769/lib/node_modules/@vitejs/create-app/node_modules/create-vite/index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /Users/{username}/.npm/_npx/96769/lib/node_modules/@vitejs/create-app/node_modules/create-vite/package.json.

    at new NodeError (internal/errors.js:322:7)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1102:13)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:101:18)
    at Object.<anonymous> (/Users/{username}/.npm/_npx/96769/lib/node_modules/@vitejs/create-app/index.js:43:1)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32) {
  code: 'ERR_REQUIRE_ESM'
}
```

## 原因

ログにこのように記載されていました。
`@vitejs/create-app is deprecated, use npm init vite instead`

DeePL訳としては、
`vitejs/create-app は非推奨です、代わりに npm init vite を使ってください。`

ただ、念の為、[vitejsの公式サイト](https://vitejs.dev/guide/#scaffolding-your-first-vite-project)を見ると、コマンドが異なっていました。次の解決方法として記載します。

## 解決方法

[vitejsの公式サイト](https://vitejs.dev/guide/#scaffolding-your-first-vite-project)にある通り、
`npm init` ではなく `npm create` にすることで無事成功しました。

```
# npm 6.x
npm create @vitejs/app supabase-vue-3 --template vue

# npm 7+, extra double-dash is needed:
npm create @vitejs/app supabase-vue-3 -- --template vue
```
【Git】Gitタグ

# はじめ

　　最近、gitのドキュメントを読んでいます。
　　今後の復習のため、ポイントをメモしました。

# 2.6 Gitの基本　ータグ

### タグの一覧表示

Gitで既存のタグの一覧を表示する。(アルファベット順表示)↓

```
$ git tag
```

パターンを指定してタグを検索する。↓
例えば、1.8.5系のタグのみを見たい場合
```
$ git tag -l "v1.8.5*"
```

### タグの作成
Gitのタグには、軽量版と注釈付き版の2通りがある。
軽量版のタグは、変更のないブランチのようなものです。特定のコミットに対する単なるポインタでしかない。

注釈付きのタグはGitデータベース内に完全なオブジェクトとして格納される。
（タグ付けした人の情報とその日時、そして注釈メッセージ）

#### 注釈付きのタグ
Gitでは、注釈付きのタグを作成する。↓
-mで、メッセージを指定する。メッセージを省略すると、エディタが立ち上がるので、記入できる。
```
$ git tag -a v1.4 -m "my version 1.4"
```

タグのデータとその関連づけられたコミットを見る。↓
```
$ git show v1.4
```

#### 軽量版のタグ
軽量版のタグ、コミットのチェックサムだけを保存する。
付ける方法↓
```
$ git tag v1.4-lw
```

#### 後からのタグ付け
過去に遡ってコミットにタグ付ける場合、
特定のコミットにタグをつけるには、そのコミットのチェックサム（あるいはその一部）をコマンドの最後に指定する。↓
```
$ git tag -a v1.2 9fceb02
```

#### タグの共有
「**git push**」はタグ情報をリモートに送らない。タグを作ったら、タグのリモートサーバーにプッシュするよう明示する必要がある。プッシュ方法↓
```
$ git push origin v1.5
```

複数タグを一度にプッシュしたい場合。↓
```
$ git push origin --tags
```

#### タグのチェックアウト
タグ付けされた内容に変更を加えられない。
ある時点でのリポジトリの内容をタグ付けられたような形で作業ディレクトリに保持したい場合、git checkout -b [branchname] [tagname]を実行すると特定のタグと紐つけたブランチを作成する。（使用注意！）

```
$ git checkout -b version2 v2.0.0
```
あれ？LINE ログインさん localhost 使えなくなった？

# 現象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696283/958c7c34-aa7f-a2e9-263d-79dd91f10287.png)

localhost をコールバック URL にすると、「各行に有効なURLを入力してください」と怒られる。
# 解決策

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696283/095037ca-f8d2-ca1c-24c3-d2cb2121f3db.png)

かわりに http://127.0.0.1 を入れる。

# おわりに
http://localhost が使えないのがバグでないなら、そのうち http://127.0.0.1 も使えなくなる気がしています。ngrok を使いましょう。