OmniAICreator/Qiita-1.07M huggingface dataset:
【個人開発】「ロードバイク乗りのためのお店検索WEBアプリ」制作しました【Cycle Depot】

# 本記事の対象者
- 個人開発アプリ、オリジナルアプリ開発に興味がある方
- ロードバイクが趣味の方
- タイトルに興味を惹かれた方

# WEBアプリURL
https://cycledepot.herokuapp.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668589/7e0520e9-bcd0-f6e0-d481-a06cd54868fe.png)

# オリジナルアプリ概要
- 名称：　<strong>Cycle Depot</strong>(「サイクルデポ」と読みます)
- 開発環境：
    - Ruby3.0.1
    - Rails6.0.5.1
    - PostgreSQL1
- 説明：
    ロードバイクに乗っていて気軽に入れるお店が中々見つからないなと感じたことはありませんか？
　　ロードバイクは高価であるということに加えて、スタンドが付いておらず自立しないため駐輪場所に困ることが多いと思います。そんな時にサイクルラックを置いてくれているお店を簡単に検索できたら便利だと思いませんか？
　　そうです。サイクルラックを置いてくれているお店を簡単に検索できるということを実現したのが、「Cycle Depot」です。

# 制作背景
　私自身、ロードバイクが趣味で1日100km、200kmと走ることがあるのですが、途中に急に疲れてしまってこの辺でいいお店ないかなーと思うことが多々ありました。仲間と走りに行くことが多かったので、そんな時は仲間の中にお店に詳しい人がいて「この辺にたしか前行ったことがあるお店がある。」とか「そういえば最近この辺にカフェできたらしい」という仲間の脳内データベースに頼ってお店を探すことが多くありました。
　しかし、正直いって記憶力にも限りがあるので行くお店は大体、毎回同じような場所でした。そこで色んなお店に行ってみたいと思い「ロードバイク　カフェ」などのキーワードで検索してみると、ロードバイクで行きやすいお店が見つかることには見つかるのですが、個人でやっているブログだったり、相模原などといった自治体単位でお店が少しまとめられているだけで簡単にロードバイクで行きやすいお店を検索できるものが見つかりませんでした。
　そんな時に思った、ロードバイクで行きやすいお店を簡単に検索できるアプリがあったらいいなという気持ちがこのアプリの制作動機です。かなり個人的ではありますが、熱い気持ちがこもっております。
 
# 現状と今後の展望
　まずリリースをするということを目標としていたため、機能は最小限の実装になっています。非常にシンプルで使い方に迷うことは少ないのではないかなと思います。あとはロードバイクで行けるお店の登録は随時していっておりますが、中々スクレイピングなどで探すことができないため、手作業となり時間がかかりますが地道に続けていきたいと思います。
　今後はロードバイクを乗る仲間にこれを使ってもらいフィードバックをもらいながら細々を開発を続けていきたいと思います。現時点で追加実装したいと思っているのは以下の機能です。
- OAuth
- 口コミ、評価機能
- 英語対応
- 検索結果の並び替え機能
- お店のサムネイル画像表示　　...等

# おわりに
　プログラミングの学習開始から制作完了まで約半年かかりました。このWEBアプリの制作期間自体は約1か月ほどです。始めたばかりの時は仕事もしながらほんとにできるかなと疑問でしたが、コツコツ続けていくことで何とか制作することができました。
　話は変わりますが、もしロードバイクが趣味なエンジニアの方、ロードバイクが趣味でエンジニアになろうと思っている方、エンジニアでロードバイクを趣味として始めようとしている方がいらっしゃいましたら是非コメントなどでお声がけください！どんどんブラッシュアップしていきたいと思っているので、お話ができたら幸いです。

執筆：2022年9月6日(火)
今年のロボカップでしたいこと

# 今年もロボカップにでるよ
WROが終わり次はロボカップがやって来ました。ノード大会まで残された期間は３か月程度。テスト週間と学校祭を除けば2か月ちょいといったとことです。
まじで時間がないです。[WROの反省](https://qiita.com/kikou0517/items/61674997ac0d3ef3d4ad)で**スケジューリングの甘さ**を上げましたが、同じことが起こりそうで怖いです、、、。

## Arduino
今大会の新たな取り組みの一つとして、**Arduinoでセンサーを増やす**ことに挑戦したいと思います。

### 理由1
Arduinoを使いたい理由の1つは**センサーの数を増やす**ことです。私は去年の大会で傾斜路に苦しめられました。そしてその原因がデイジーチェーンでEV3インテリジェントブロックを増やした結果、機体が重くなりすぎたことです。「**センサー数を増やす**」「**軽い**」この2つを両立する方法としてArduinoを選びました。
他のマイコンを選ばなかった理由は、Arduinoがほかのマイコンに比べてネットの情報が多いこと、過去にArduinoを使うチームが多くいたことです。

### 理由2
Arduinoを使いたい理由の2つ目は**ジャイロセンサー**です。
坂やバンプを感知する方法として、カラーセンサーやスイッチのようなものを使うこともできますが、最も**確実かつ汎用性が高い**のはジャイロセンサーだと考えています。ところが**EV3のジャイロセンサーは1軸しかないのに加えて精度が悪く仕えたものではありません**。
すると代案として「市販のセンサーを使うこと」「HiTechnic社のセンサーを使うこと」の2つが考えられます。[Hitechnic社のジャイロセンサー](http://www.mdstorm.com/robotics/ht/product/ht1040Accel.html)は現時点で**8,360円**。高い、ムリ。市販のジャイロセンサーをEV3で使う方法として「EV3直付けでI2C接続」と「Arduinoを介して接続」の二つがあげられます。他のセンサーを使うことや、EV3側での処理を減らすことを考えて後者を選択しました。
ただし、ジャイロセンサーの扱いが難しかった場合にはチルトボールスイッチを使いたいと思います。
また、Arduinoを活かしてマイクロスイッチやフォトリフレクタを追加する予定です。
ToFセンサーを追加することも検討しましたが、ノード・ブロック大会の救助エリアが透明な壁であるため断念しました。
c# windowsフォームで表示した画像を右クリックで保存する（PictureBox）

windowsフォームで表示した画像を名前付きで保存する方法
`PictureBox`は、windowsフォーム上で簡単に画像を表示できる

![picturebox.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/525d5382-4e62-bd39-b08d-13e00358edaf.jpeg)

## マウスの右クリック検知
右クリックのイベントは標準にない
マウスダウンイベントのボタンを利用する

```C#:Form1.cs
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        SavePictureBoxImage();
    }
}
```


## ソースコード
右クリックを検知したら、保存ダイアログを開く関数を追加

```C#:Form1.cs
using System.Drawing.Imaging;

namespace WinFormsPictureBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox.ImageLocation = @"C:\Users\xxxx\Downloads\xxxx.jpg";
            pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                SavePictureBoxImage();
            }
        }

        private void SavePictureBoxImage()
        {
            try
            {
                string filePath = pictureBox.ImageLocation;
                if (!File.Exists(filePath))
                {
                    throw new FileNotFoundException();
                }
    
                using (var sfd = new SaveFileDialog())
                {
                    sfd.FileName = Path.GetFileName(filePath);
                    sfd.Filter = "JPG|*.jpg|PNG|*.png|All files(*.*)|*.*";            
                    sfd.RestoreDirectory = true;
    
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {                
                        pictureBox.Image.Save(sfd.FileName, ImageFormat.Jpeg);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("The file not found�B", string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

    }
}
```
https://github.com/pixcelo/WinFormsPictureBox

## Reference
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.picturebox?view=windowsdesktop-6.0

https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/input-mouse/events?view=netdesktop-6.0
2022/9/6主にITとかセキュリティの記事

QNAP製NASを狙うあらたなランサム攻撃 - アプリの更新を
https://www.security-next.com/139480

Go言語で作成された新しいランサムウェア「BianLian」とは？(9/4)
https://news.mynavi.jp/techplus/article/20220904-2442982/

サイバー犯罪 官民で阻止　県警がネットワーク設立(9/3)
https://www.chunichi.co.jp/article/538116?rct=k_ishikawa

PyPIダウンロード時にコード実行する機能、犯罪に悪用される恐れ(9/4)
https://gunosy.com/articles/epuOl

バカにはバカな検索結果しか表示されない…ネットの情報にダマされる人が後を絶たない根本原因リテラシーが低いと､質の悪い情報しか引き出せない(9/4)
https://president.jp/articles/-/61142?page=1

Appleマップがデビュー10周年！ようやく使用に耐えうるようになった？(9/4)
https://iphone-mania.jp/news-482528/

Windowsに標準で含まれているインボックスドライバーの仕組み(9/4)
https://ascii.jp/elem/000/004/104/4104176/?rss

デジタル遺品 損をしないために 5秒でできるデジタル終活(9/4)
https://gunosy.com/articles/e0qch

アメリカの銃市場で広がる暗号資産決済、プライバシーは守られるか？(9/4)
https://www.coindeskjapan.com/159145/

高度に回避的である新たなJavaScriptスキマーを発見(9/3)
https://news.mynavi.jp/techplus/article/20220903-2442873/

Apache OpenOffice、ダウンロード回数が3億3300万回を突破(9/3)
https://www.zaikei.co.jp/article/20220903/687982.html

「多重下請けはましになってきた」だって？SIerは適当なことを言わないでくれ(9/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00148/090100242/

Webアプリとクラウドが基本、Chrome OS Flexの使い方を学ぼう(9/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02159/080300003/
【PHP】`firebase/php-jwt`でトークンをdecode時に { "status": "\"kid\" empty, unable to lookup correct key" }のエラーが発生

## 概要
PHPでJWTの仕組みを実装する場合、[firebase/php-jwt](https://github.com/firebase/php-jwt)のライブラリが使用されることがあると思います。このライブラリを使用して、JWTのトークン作成からdecodeまでの実装は[PHP: JWT を使った認証](https://blog.sarabande.jp/post/123018347873)の記事が、参考になると思います。
さて、実際にトークンのdecodeを行う時に以下のような実装を行ったところ、` { "status": "\"kid\" empty, unable to lookup correct key" }`というエラーが発生しました。
```php
$decodedResult =  JWT::decode($token, env('JWT_SECRET_KEY'), ['HS256']);
```

なお、今回使用したライブラリのバージョンは`v6.3.0`です。

## 原因
[こちら](https://stackoverflow.com/a/72310650)のstackoverflowの記事によると、キーの指定に`Firebase\JWT\Key`のクラスを使用する必要になったとのこと。（どのバージョンからかは調べてないです・・）
stackoverflowにも`Google keeps changing stuff and breaking backwards compatibility with no respect of users. I find it extremely rude of them`というコメントがある通り、周知とかされずどこかでしれっと変わったのかもしれません。。

## 対応
以下のようにdecodeの実装をすればOKです。

```php
$decodedResult =  JWT::decode($token, new Key(env('JWT_SECRET_KEY'), 'HS256'));
```
# TypeScript 関連　リンク集

# 環境構築 (Backend Typescript + Express.js )
- TypeScriptでExpress(node.js)を動かす  | blog.kwst.site
https://kwst.site/201910192925/
- expressの開発にTypeScriptを利用する
https://qiita.com/zaburo/items/69726cc42ef774990279
- dockerコンテナ内でts-node-devのホットリロードを有効にする
https://qiita.com/manten120/items/3e1723d78c9c0d158262

# 環境構築 (Frontend Typescript + Vite + Vue)
- Docker+Viteでローカル環境を汚さないJSフレームワーク
(Vue,React,etc...)の環境構築をしてみる(Windows)
https://zenn.dev/ayuu/articles/84b482c37bea9a

# テスト環境 (Backend Typescript)
- Rest API Testing with Mocha, Chai, SuperTest
https://kishanchaitanya.medium.com/api-testing-using-mocha-chai-and-supertest-a7c7edc96c24
- TypeScriptでREST APIをテスト駆動するためのHowTo
https://qiita.com/kotauchisunsun/items/6361b8f53540404a4a20
GoのAPIサーバーの実行にAirを使っていたというお話

Goの初心者です。

発端は、golangの実行方法って

1. `go run main.go`
2. `go build main.go`でビルドして、`./main`で実行

の2種類のはずなのに、Dockerfileにそんな記述ないよ！どうして？

と思ったのがきっかけ。

初心者用の記事だとほとんど`go run main.go`で済ませてるし、開発プロジェクトに入っても、ローカルの実行は`docker-compose up -d [コンテナ名]`などでできてしまうため、あまり意識しなかったのだが、Dockerfile-localをちゃんと最後まで読んでみると、
`CMD ["air", "-c", ".air.toml"]` という記述で締めくくられていたため、そこで実行しているのだろうという仮説から題名に戻ることになる。

**Air**とはgolangのホットリロードツールのことである。

ホットリロードとはソースコードを更新するたびにソースをビルドし直して実行するという手間を省くため、ソースコードを更新し、保存したら自動でビルドと再実行を行うということである。

Airの使い方は簡単に言ってしまえば、****.air.toml**** という設定ファイルに設定を書き込んで、`air -c .air.toml`というコマンドを叩けば使える。

設定ファイルの書き方などは調べてみればすぐに書けるようになると思われるので割愛。気が向いたら加筆する。
https://github.com/cosmtrek/air

こういう大元になるような、足元の知識を知らず知らず飛ばして開発してるからなかなか自作できないエンジニアになるという自戒を込めてここに書き記す。

参考記事
https://zenn.dev/ajapa/articles/bc399c7e4c0def
ローカルのGitリポジトリのデフォルトブランチをmainに変更する

## 初めに
私は実務でも個人でもソフトウェア開発にGitHubを使用している。GitHubは2020年10月より、新たに作成したリポジトリのデフォルトブランチを**master**から**main**へと変更した。その背景は[こちら](https://techtarget.itmedia.co.jp/tt/news/2102/14/news01.html)を参照されたい。
今更ながら私も時代の潮流に乗ろうと思い、また**main**の方が**master**よりもタイピングしやすいとも感じたため、今後はリモート・ローカルリポジトリ共にデフォルトブランチを**main**で開発しようと思い、ローカルリポジトリにおけるその方法を執筆する至った。
## 環境
- macOS Big Sur
- 【更新前】git version 2.19.0 --> 【更新後】git version 2.37.3 
- Homebrew 3.5.10

## 手順
### #0 Gitのアップグレード
ローカルリポジトリのデフォルトブランチの指定は、Gitのバージョンが**2.28.0**以降の場合に設定できる。無指定の場合は**master**がデフォルトで作成される（git version 2.19.0時点で確認済）。[2.28.0のリリースに関するGitHubブログ](https://github.blog/2020-07-27-highlights-from-git-2-28/#introducing-init-defaultbranch)にて説明がある。
``git --version``で現在のバージョンを確認し、**2.28.0**未満の場合、Gitをアップグレードする必要がある。**2.28.0**以降の場合はこちらの手順は不要なため飛ばしてよい。以下はHomebrewを用いたアップグレード手順。

- Homebrewがインストールされていない場合は、まずは以下を実行。`brew --version`で情報が出力されればインストール済みのため当手順は不要。
```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
※最新のインストールコマンドは[こちら](https://brew.sh/index_ja)を参照。

- HomebrewでGitをインストールしていない場合は以下を実行。`brew list | grep git`でgitと出力される場合はインストール済みのため当手順は不要。
```shell
brew install git
```

- HomebrewのGitをアップグレード（前手順でHomebrewでGitをインストールした場合は不要）
``` shell
brew upgrade git
```

ここまで終了したら、`git --version`コマンドを実行し、バージョンがアップグレードされていることを確認する。
バージョンがアップグレード前と変わっていない場合、環境変数のパスが以前のGitを参照している可能性がある。その場合は、現在のパスとHomebrewでアップグレード後のGitのパスを調べ、アップグレード後のパスへ変更する必要がある。
```shell
$ which git
git version 2.19.0 #アップグレード前のGitのパスのままであることを確認
```
```shell
$ brew info git
# 中略
/usr/local/Cellar/git/2.37.3 #アップグレード後のGitのパス
# 後略
```
```shell
export PATH=/usr/local/Cellar/git/2.37.3/bin:$PATH #パスをアップグレード後のGitを参照するよう変更
source ~/.bash_profile #パスの変更を反映
```
上記手順を行えば、Gitの参照パスがアップグレード後のものへ変更されているはずです。
```shell
$ git --version
git version 2.37.3 #アップグレード後のバージョンに変更されていることが確認できる
```

ここまでで下準備は完了です。

### #1 リモードリポジトリのデフォルトブランチを変更する
ここからが本題となります。
まず以下のコマンドでデフォルトブランチの確認を行います。
```shell
git config init.defaultBranch
```
特に指定していない場合、何も出力されないと思います。この場合のデフォルトブランチは**master**となっています。
次に、デフォルトブランチを**main**へ変更します。
```shell
git config --global init.defaultBranch main
```
※`--global`の部分はご自身のご都合によりご変更ください。設定のスコープに関する説明は[こちら](https://note.nkmk.me/git-config-setting/)の記事が大変分かりやすいです。
最後にデフォルトブランチの確認です。
```shell
$ git config init.defaultBranch
main #mainに変更されていることが確認できる
```

これで、新規にローカルにGitリポジトリを作成した場合、デフォルトで作成されるブランチは**main**となっているはずです。
AWS認定SAA試験を受けて思ったこと【30代×資格】

AWS認定SAA試験(SAA-C02)（AWS Certified Solutions Architect – Associate 試験 、AWS 認定ソリューションアーキテクト – アソシエイト試験）を受けておもったことをつらつら書きます。

なお、SAA-C02は2022/08いっぱいで終了しています。次はSAA-C03ですね、どうなるか楽しみです。

## ◎ 全65問という問題数について

65 問と多すぎる問題が出題されますが、130 分あるので解き終わらせることはできます。ただし、勉強時は問題文の構成を簡易図に起こしていましたが、そこまでの猶予はありませんでした。

見返しは、先頭から40問ほどできたので、時間配分は勉強時から考えておいたほうが得策です。なお、見返すことはあまり念頭に置かず、分かりづらい・分からない問題にチェックしておいてそれを振り返るくらいがちょうどよいかなと感じました。

## ◎ 問題文について

様々な試験対策本が売られていますが、これらは日本語がかなり洗練されていることがわかります。逆に言うと、試験問題の文章はかなりおぼつかないです。といっても解いていかないといけないのは間違いないので、１問２分程度としてわかるまで読み返しました。

例えば、「ネイティブなバージョニング」・・・バージョニング機能が選択肢にあることか？それともデフォルトで備わっていることか？おそらく前者ですが迷いました。

AWSの試験は、AWS提供元のアメリカで作られていると思います。ここから考えると、実はIT業界は英語化が必須なのではないかなとも感じました。英語の文章で出されていたら迷うことや読みづらい問題が起きづらくなるのではないでしょうか。

## ◎ 出題されたサービスについて

サービスは様々な試験対策本よりは範囲が狭かった印象です。思ったより、DBはRDSよりもEC2でゴリ推している現状構成が多かったです。そこからの要件追加・改善要望のため、現実から見たら超特殊要件かなと感じました。

例えば、MySQL on EC2などです。

## ◎ 個人的な解き方

問題集は１つだけに絞って、わかるまでやるのがベストです。
なぜかというと、試験は以下２種類の解き方がほとんどです。覚えていく部分を覚える必要があるためです。
　・ベストプラクティスに当てはめて考えられるか？問題の目的を把握する
　・問題文を読んで、解答の想像と同じ選択肢があるか？
　　　あればそれが正解。
　　　なければ選択肢から消去法で選ぶ

## ◎ さいごに

すでに廃止したAWS認定SAA試験(SAA-C02)を受けた感想を書きました。

新試験SAA-C03は、試験範囲が抜本的に変わるようで恐ろしいです。機会があれば受けてみようと思います。といっても、まずはアソシエイトレベルから脱却が重要ですね。

https://qiita.com/yukkie1114/items/a6aa433a7354de80c6d6
numpyで統計②：単回帰分析で残差分散を求める

仮想通貨取引botのロジックを組んでいるとトレンド（傾向）の影響を取り除いたボラリティ（価格変動）を求めたい場合がある。

価格の上昇傾向・下降傾向といったトレンドを一次式で表せると仮定して、その推定した一次式の残差の標準偏差をボラリティの度合いとしてみなすことができる。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/62a39d9a-b46d-3c99-9ec7-d9565d45446e.png)

価格推移は連続しているのでこのようなグラフにはならないが、目をつぶってこのデータを用いるとして残差分散を求める。以下にコードを示す。

```python:tankaiki.py
import numpy as np
import matplotlib.pyplot as plt


def generate(a, b, c, n=1000):
    np.random.seed(9)
    print("傾き {}, 切片 {}, 誤差分散 {}".format(a, b, c ** 2))
    x = np.arange(n) - n + 1
    y = a * x + b + c * np.random.normal(size=n)
    return x, y


def regression(x, y):
    cov = np.cov(x, y)
    Sxx, Sxy, Syy = cov[0, 0], cov[0, 1], cov[1, 1]
    # assert Sxx == np.var(x, ddof=1)  # same value, unbiased variance
    # assert Syy == np.var(y, ddof=1)  # same value, unbiased variance
    a, b, c = Sxy / Sxx, np.mean(y) - Sxy / Sxx * np.mean(x), np.sqrt(Syy - Sxy ** 2 / Sxx)
    print("傾き（推定） {}, 切片（推定） {}, 残差分散 {}".format(a, b, c ** 2))
    return a, b, c


def main():
    fig = plt.figure()
    ax = fig.add_subplot(111)
    x, y = generate(0.25, -4.5, 10)
    ax.plot(x, y, label="source")
    a, b, c = regression(x, y)
    ax.plot(x, a * x + b, label="regression")
    ax.plot(x, a * x + b + c * np.sin(x / len(x) * 100), label="regression+$1\sigma$")
    ax.legend()
    plt.show()


if __name__ == "__main__":
    main()

# output

# 傾き 0.25, 切片 -4.5, 誤差分散 100
# 傾き（推定） 0.24944011563873922, 切片（推定） -4.463923597333633, 残差分散 103.9897989356159

```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/6ca71834-4e74-7cc4-5a71-eb505ce458d6.png)

上の出力画像は推定した残差分散の平方根で標準偏差を得てsin波の振幅で表現している。

関数`regression(x, y)`から分かるように残差分散$S_{ee}$を求めるのに推定値との残差を求めて分散を取る必要はない。
$S_{xx}$：xの分散, $S_{yy}$：yの分散, $S_{xy}$：xyの共分散が求まっていれば$S_{ee}=S_{yy}-\frac{S_{xy}^2}{S_{xx}}$で求まる

$\hat{y}=a\hat{x}+b$ という回帰式は傾きが$a=\frac{S_{xy}}{S_{xx}}$で切片が$b=\overline{y}-a \overline{x}$なので
残差分散$S_{ee}$は定義通り計算すると$\frac{1}{n}\sum (ax+b-y)^2$だが以下のように分散・共分散だけの式に整理することができるためである。
$S_{ee}=\frac{1}{n}\sum (ax+b-y)^2=\frac{1}{n}\sum (\frac{S_{xy}}{S_{xx}}(x-\overline{x})-(y-\overline{y}))^2$
$\frac{S_{xy}^2}{S_{xx}^2} \frac{1}{n}\sum (x-\overline{x})^2-2\frac{S_{xy}}{S_{xx}}\frac{1}{n}\sum(x-\overline{x})(y-\overline{y})+\frac{1}{n}\sum(y-\overline{y})^2=\frac{S_{xy}^2}{S_{xx}}-2\frac{S_{xy}^2}{S_{xx}}+S_{yy}=S_{yy}-\frac{S_{xy}^2}{S_{xx}}$

共分散行列で`np.cov(x,y)`が$\begin{bmatrix} S_{xx} & S_{xy} \\\\ S_{xy} & S_{yy} \end{bmatrix}$を返すので$S_{ee}=S_{yy}-\frac{S_{xy}^2}{S_{xx}}$はすぐ求まる。ただnp.cov(x,y)の返す値は全て不偏分散であるため残差も不偏分散である点には注意。
DynamoDB のテーブル設計


![dynamobasicknowledge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/2c799a4e-be49-d062-c617-5efa9e4cf38f.png)

引用元； https://d1.awsstatic.com/webinars/jp/pdf/services/20181225_AWS-BlackBelt_DynamoDB.pdf

## パーティションキーのみ

- パーティションキーは `ハッシュキー` (hash key)とも呼ばれる（AWS のドキュメントだと hash key を利用している例が多いように思える。）
- テーブルを作成後は変更できない
- テーブルからデータをフェッチするときは [Scan](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/APIReference/API_Scan.html) または [GetItem](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/APIReference/API_GetItem.html) を使う

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/bd0f8edd-b4be-db22-3808-ab7e96067fc1.png" width=500px>

## 複合キー

- パーティションキー と ソートキー を組み合わせる方法
- ソートキーはレンジキー(range key) とも呼ばれる
- テーブルを作成後は変更できない
- [Query](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/APIReference/API_Query.html) でフェッチできる
- ソートキーのみの条件検索はできない (パーティションキーの指定が必須)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/6eaaf4e0-cf78-6c57-1947-4b0aa041096a.png" width=500px>

## グローバル・セカンダリ・インデックス ( GSI )

- キー以外の項目を指定して検索できるようになる
- [Query](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/APIReference/API_Query.html) で GSI を指定してフェッチできる (キーの指定は不要)
- テーブル作成後でも変更可能

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/febe50c9-ee07-ea5b-ae8b-2ef45d44d923.png" width=500px>

## ローカル・セカンダリ・インデックス ( LSI )

- GSI と同じように機能する
- テーブル作成後は変更不可能

> 一般的に言えば、次の 2 つの理由から LSI を避けるべきです。
> GSI とは異なり、テーブルの作成後に更新または削除することはできません。テーブル作成時にすべての LSI を指定する必要があります。これにより、かなり柔軟性がなくなります。
> ローカル セカンダリ インデックスを使用してテーブルを作成する場合、そのテーブルにはパーティション キー値ごとに 10 GB のサイズ制限があります。

## 参考サイト

https://dynobase.dev/dynamodb-keys/
体験したCloud Identity Platform の制限(ユーザ新規作成、同時ログイン数)について

# はじめに
2種類の表題のサービスに関わる制限に出くわしたので、その内容、ケース、回避策を記載します。
今後利用する場合、参考にしていただければと思います。

# 制限1：ユーザ作成

## 制限内容
アカウントの新規作成	100 アカウント/IP アドレス/時間
https://cloud.google.com/identity-platform/quotas?hl=ja#account_creation_and_deletion_limits

## 出くわしたケース
何らかのサービスを移行するような場合、既存システムで作っていたユーザを新規システムに移行するようなケースがあるかと思います、その場合、制限に抵触する可能性があります。
長期的に移行が可能な場合、ゆっくり移行すれば良いので問題にはなりませんが、切り替えタイミングを決めて移行するような場合、スケジュールの都合上、この条件での移行が難しい場合もでてくるかと思います。

## 回避策
この上限は緩和可能なものであるためサポートへ依頼し上限を緩和してもらう必要があります。
数週間かかる場合もあるので余裕をもった依頼をしましょう。

# 制限2：同一ユーザによる制限

## 制限内容
1ユーザあたりの秒間の同時ログイン数(検証した方法だと秒間でした)

## 出くわしたケース
ログインで当該サービスを利用し負荷試験するような場合、同一ユーザで複数回ログイン(同時なのか時間でのログイン処理数なのか)するような処理をした場合、ある一定のエラー率でログインが失敗する。
DDoS対策の一環か、認証の仕組み側で制限がかけられているように見受けられます。

## 回避策
繰り返しログインするような負荷試験の場合、秒間などの同時リクエスト数分のアカウントを準備し、異なるアカウントでログインするような負荷試験のスクリプトとする。そうすることでエラーが発生しなくなった。

# 所感
これらのケースでも1つ目はこのサービスに特化した内容ですが、2つ目は負荷試験などでは当たり前に対応しなければいけない内容かもしれません、そういったことを知るいい機会となりました。
PHPの日付取得方法まとめ

# はじめに
主に自分用に、PHPで日付を取る方法をまとめています。
特に、前月や次月の日付を取得したいという場合、取得に注意が必要なので、以下にまとめておきます。

## 念のたPHPのバージョン
```
PHP 7.3.29
```

## 日付の取得・加算・減算
主にstrtotimeを使用した取得の仕方をまとめます。
```php
//現在の日付のtimestamp
strtotime("now")

//現在の日付をyyyy/MM/dd HH:mm:ssの形式で（デフォルトはUTC。変更したい場合はphp.iniのdate.timezoneを変更）
date('Y/m/d H:i:s', strtotime('now'));

//1年前・１年後
date('Y/m/d H:i:s', strtotime('-1 year'));
date('Y/m/d H:i:s', strtotime('+1 year'));

//１ヶ月前・１ヶ月後
date('Y/m/d H:i:s', strtotime('-1 month'));
date('Y/m/d H:i:s', strtotime('+1 month'));

//１日前・1日後
date('Y/m/d H:i:s', strtotime('-1 day'));
date('Y/m/d H:i:s', strtotime('+1 day'));

//１時間前・1時間後
date('Y/m/d H:i:s', strtotime('-1 hour'));
date('Y/m/d H:i:s', strtotime('+1 hour'));

//1分前・1分後
date('Y/m/d H:i:s', strtotime('-1 minute'));
date('Y/m/d H:i:s', strtotime('+1 minute'));

//1週間前・１週間後
date('Y/m/d H:i:s', strtotime('-1 week'));
date('Y/m/d H:i:s', strtotime('+1 week'));
```

## 特定の日付を取得
```php
//今月の月初
date('Y/m/d H:i:s', strtotime('first day of this month'));

//今月の月末
date('Y/m/d H:i:s', strtotime('last day of this month'));

//指定月の月初（targetTimeはstring型で指定。yyyy-MMという形でもOK）
$targetTime = '2022-03-31 00:00:00';
date('Y/m/d H:i:s', strtotime('first day of'.$targetTime));

//指定月の月末
$targetTime = '2022-03-01 00:00:00';
date('Y/m/d H:i:s', strtotime('last day of'.$targetTime));
```

## 次月・前月の取得
次月を取得したいからといって、うっかり+1 monthを指定すると、月末とかにズレが発生する。
```php
$targetTime = strtotime('2022-08-31 00:00:00');
echo date('Y/m/d H:i:s', strtotime('+1 month', $targetTime));                  // 2022/10/01 00:00:00
echo date('Y/m/d H:i:s', strtotime('first day of next month', $targetTime));   // 2022/09/01 00:00:00
```
2022/8/31から＋１ヶ月すると、2022/9/31になるが、9月に31日はないので、自動的に9/31→10/1と修正される。

前月も同様となる。
```php
$targetTime = strtotime('2022-03-31 00:00:00');
echo date('Y/m/d H:i:s', strtotime('-1 month', $targetTime));                  // 2022/03/03 00:00:00
echo date('Y/m/d H:i:s', strtotime('last day of last month', $targetTime));    // 2022/02/28 00:00:00
```
3/31から–１ヶ月は2/31だが、２月は２８日までしかないので2/28→3/3となってしまう。
【VSCode】改行にもsnippet使おう


# snippet ファイルへの登録

文章打ってて一番下の行が近づいてくると行を確保したくなってエンターキー押しまくることないですか？ 自分はよくあるので snippet にしちゃいました。ちなみに自分は mac ユーザーでホームディレクトリの名前を`home`にしています。あとこの snippet ファイルの名前を`global.code-snippets`にしています。

```json:/Users/home/Library/Application Support/Code/User/snippets/global.code-snippets
{
"たくさん改行": {
		"prefix": "@takusan",
		"body": "$0\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
	},
}
```

改行しまくって行を増やした後に現在打っている部分に戻るようにしています。`\n`は改行の正規表現です。必要に応じて`\n`の数を増やしてください。意外と結構使ってます。


以上です。
UIKitで作ったアプリでSwiftUIを使う

最近Swiftでアプリを開発しています。
UIKit（Storyboard）のスタイリングがとにかく苦痛で、途中まではコードベースでなんとか頑張っていましたが限界を迎えました。

UIKitの中でもSwiftUIを使うのは少し調べると対応できたのですが、データのバインディング周りで少し苦労したので共有します。

ボトムナビに以下のような戻る・進むアイコンを表示するものを作ります。

![IMG_8480.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/99dfb178-9246-3cc4-be37-62585dd8dd83.jpeg)

## UIKitの中でSwiftUIを使う

### SwiftUIのViewを作成

これだけでOK。UIKitに比べかなり分かりやすいですね。
`@ObservedObject`はこのコンポーネント外の状態管理に使っています。

``` BottomNav.swift
import SwiftUI
import Combine

struct BottomNav: View {
    @ObservedObject var historyViewModel: HistoryViewModel
    var back: () -> Void
    var forward: () -> Void
    
    var body: some View {
        HStack(spacing: 50) {
            Button(action: { back() }
            ) {
                Image(systemName: "arrow.uturn.backward")
            }
            .disabled(historyViewModel.isDisabledBack)
            Button(action: { forward() }
            ) {
                Image(systemName: "arrow.uturn.forward")
            }
            .disabled(historyViewModel.isDisabledForward)
        }
    }
}
```

### ObservableObjectプロトコルを使った状態管理

``` HistoryViewModel.swift
import Combine

class HistoryViewModel: ObservableObject {
    @Published var parentNodeBackHistory: [SCNNode] = []
    @Published var parentNodeForwardHistory: [SCNNode] = []
    
    var isDisabledBack: Bool {
        return parentNodeBackHistory.isEmpty
    }
    
    func pushBackHistory(node: SCNNode) {
        parentNodeBackHistory.append(node)
    }
}
```

### UIViewControllerのviewにSwiftUIを表示

``` XxxViewController.swift
class XxxViewController: UIViewController {
    private let historyViewModel = HistoryViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        let vc: UIHostingController = UIHostingController(
            rootView: BottomNav(
                historyViewModel: historyViewModel,
                back: popBackHistory,
                forward: { print("forward") }
            )
        );
        view.addSubview(vc.view);

        vc.view.translatesAutoresizingMaskIntoConstraints = false
        vc.view.heightAnchor.constraint(equalToConstant: 50).isActive = true
        // 左右いっぱいに底から10pxの箇所に配置
        vc.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
        vc.view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        vc.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -10.0).isActive = true

        ... 
        
        historyViewModel.pushBackHistory(node: node)
```

これでXxxViewController内からSwiftUIへデータが流れるようになりました。
逆にSwiftUIの変更をUIKitに流す場合は@Publishedアトリビュート変数の.sinkメソッドを使うと実現できます。

## さいごに

今までアプリ開発はFlutterでいいのではと思っていたのですが、今回iOSの新機能使いたく、Swiftでの開発が必要になりました。

SwiftUIを使うことで開発体験がかなり向上したのと、何よりiOSの新機能を使っての開発が楽しいです！
jquaryでのオリジナルダイアログの条件分岐

## alert()のように条件分岐したい
ワイの覚書きシリーズ

ある程度サイトを構築してくると、確認ダイアログのデザインにまでこだわりたくなるのはあるあるです。
今回はpromiseを利用してオリジナルダイアログで条件分岐できるコールバック関数を作成します。

▽ダイアログ関数
```JavaScript
function pop_listener(mes){
        $('.popup_title').html(mes);
        $('.popup_group').fadeIn(200);
        var promise = new Promise((resolve) => {
            document.querySelector('.pop_submit').addEventListener("click", () => {
                $('.popup_group').fadeOut(200);
                resolve(true);
            });
            document.querySelector('.pop_cancel').addEventListener("click", () => {
                $('.popup_group').fadeOut(200);
                resolve(false);
            });
        });
        return promise;
    }
```
　
▽ダイアログの表示
```JavaScript
$('.click').on('click', function(){
        pop_listener('発行しますか？')
        .then((judge) => {
            if(judge){
                window.location.href = 'https://example.com'
            }
        });
    });
```
Classに「click」を持つ要素がクリックされると発火。
pop_listenerでは引数に指定されたメッセージに書き換え、ユーザーがClassに「pop_submit」を持つ要素をクリックすればexample.comへリダイレクト、「pop_cancel」を持つ要素をクリックすればそのままダイアログをフェードアウト。

結構頻繁に使うダイアログは関数にまとめておくと楽です。
Github Actionsの話

## 背景
- 最近、SREを学習しているため、システムの構築、運用に対して、新たな考え方が出ました。今回はコスト削減を含めて、常に利用しているCodepipeline、Codecommit、CodebuildというAWSのCI/CDサービスを脱却して、Github actionsをためしたが、面白いことを見つけましたので、個人メモを含めて共有させます。

## Target 
- ブランチによって、github Actionsの動作を異なることにしたい
  - ①ブランチ：feature/test1 
      - push の際にActionsを動かない
  - ②ブランチ：develop
      - push_request の際にActionsを動く

## ソース
- 今回利用ソースは[こちら](https://github.com/Guan21/go-docker)

## 操作順番
まずは、Actionsファイルを作成して、Actionsを動きます。

```yml:BranchActions.yml
name: test github actions

on:
  push:
    branches:
      "feature/**"
  pull_request:
    branches:
      "develop"

jobs:

  build-for-test:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: echo name
      run: |
        echo "::debug this activate"
```
「feature/test1」ブランチにcommitして、Actionsを動けましたね。ーー有効性を証明した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/ffa5dccf-a22a-2278-1591-907d29dbc69c.png)

さて、pushの部分をcommand outして、動作を確認しましょう。
```yml:BranchActions.yml
name: test github actions

on:
  # push:
  #   branches:
  #     "feature/**"
  pull_request:
    branches:
      "develop"

jobs:

  build-for-test:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: echo name
      run: |
        echo "::debug this activate"
```
うん、良さそうですね。「feature/test1」ブランチにcommitしても、Actionsを動かなかった。ーーTargetの①を達成した。:o: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/ab918949-189d-2a3e-4681-f01a2ffdc434.png)

さあ、PRを出してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/a4dc05bb-bc93-cadb-b3fa-1545ba75b758.png)
あれ、なんか動いている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/db019382-db3b-da84-49db-94747523703e.png)
なるほど、なるほど、githubは「feature/test1」ブランチの中に、workflowsにymlファイルが検知できて、自動テストしているぽいね。
最高～～～
つまり、developブランチに対して、実際の手動マージをしなくても、PRの自動テストによりpull-requstテストができることですね。ーーTargetの②を達成した。:o: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/e972a09a-5a9f-dc39-c5e5-ed87375edcef.png)
このことです～～～～

じゃあ、まずいものがきました。
PRがOpenのまま、「feature/test1」ブランチにcommitして、どうなるでしょうか。
:goberserk: Actionsが動いている。。
※は↓↓↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/ced0800f-2711-edf0-4f7c-f3ed6a42dcac.png)
※は↑↑↑↑↑↑
マジか、ymlファイルのミスがあるのか。待って、待って、

PRをcloseして、もう一度、ブランチにcommitしたら......ドキドキ......

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/52329038-514f-a804-699c-4588b2a12ddc.png)
ジャンジャン。。。Actionsを動かなかった。Safe~~~~~

PS：※の画像をよく見ると、push actionではなく、pull requestですね。


## まとめ
- Ationsの修正があるのPRを出す際に、Github側は自動テストを行うため、手動確認なしでOK
- Ationsの修正があるのPRがOPEN状態だと、作業ブランチにコミットすると、Actionsが動けますので、注意してね。。

### githubのリポジトリの公開が忘れました。公開しましたので、コメントを追加します。
Windows10イベントログ有効化

先日、プライベートのPCを触っていたらWindowsDefenderが有害なスクリプトを検出しました。結果的に問題なかったのですが、改めて攻撃を受けた際にすぐに対処できるようにWindowsの設定を見直しました。自分用の備忘録としてまとめます。

# WindowsDefender関連

基本的にFirewallが有効になっていれば大概の攻撃は防げると思いますが、リバースシェルを叩かれたりした場合の攻撃者側の特定とブロックに使用できるかな～と思って有効化しました。(踏み台大量に持っているハッカーとかだったら意味ないですかね。。。)

※[「win」+「s」で検索窓を開き、「セキュリティが強化された Windows Defender ファイアウォール」を検索すれば有効化されているか確認できます。](https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=7510-8352)

- [WindowsDefenderのログ有効化](https://www.haruru29.net/blog/how-to-get-windows-firewall-log/)
    - wiresharkでログを記録をしてもよかったのですが、Defenderの方が見やすかったためこちらの方法をとりました

# プロセス関連

DefenderでブロックされたスクリプトはPIDが吐かれていたので、そのPIDの実行ユーザーを調査したりその他調査の足がかりに使えるかなーと思って以下手順でイベントログの有効化を行いました。

- [イベントログ有効化のための準備](https://docs.microsoft.com/ja-jp/windows-server/identity/ad-ds/manage/component-updates/command-line-process-auditing)
    - [グループポリシーの開き方](https://itojisan.xyz/settings/24869/#:~:text=%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95,%E3%81%97%E3%81%A6%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
- [イベントログ有効化設定](https://docs.microsoft.com/ja-jp/windows/security/threat-protection/windows-defender-application-control/applocker/monitor-application-usage-with-applocker)
    - [イベントビューアー開き方(「winキー」+「s」で検索画面開く→「eventvwr」を入力)](https://docs.microsoft.com/ja-jp/windows/security/threat-protection/windows-defender-application-control/applocker/monitor-application-usage-with-applocker)

## 使えそうだったのでメモ
- [PowerShellで特定のプロセスIDからプロセス名を調べる](https://cheshire-wara.com/powershell/ps-help/get-process-help/#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF)
多目的最適化手法の評価方法 ~ k% attainment surface ~

## はじめに

最適化手法は主に評価回数とそれに伴う目的関数の変動を可視化することで複数手法の経時的な性能を比較します．
一方で多目的最適化においては複数の目的関数が存在するため，そのような可視化が簡単ではありません．
従って，今回の記事では複数手法の複数試行における性能を可視化する方法 ($k$% attainment surface) を書きます．

なお，以下がattainment surfaceの提案論文になります

[1] [On the Performance Assessment and Comparison of Stochastic Multi-objective Optimizers](https://eden.dei.uc.pt/~cmfonsec/fonseca-ppsn1996-reprint.pdf)

## 記号の定義
1. 多出力目的関数 $f: \mathbb{R}^D \rightarrow \mathbb{R}^M$とする．
2. $f$ の最適化を $N$ 試行したものとし，各試行で得られた Pareto解集合を $\forall i \in \\{1,\dots,M\\}, \mathcal{F}_i \subseteq \mathbb{R}^M$ とする．
3. 目的関数ベクトル $\boldsymbol{f}$ が目的関数空間内のある点 $\boldsymbol{y}$ をdominateするとは任意の要素に対して $f_i \leq y_i$ であることを指し，$\boldsymbol{f} \preceq \boldsymbol{y}$と書く．
4. 目的関数ベクトル集合 $F$ が目的関数空間内の点をdominateするとはある要素 $\boldsymbol{f} \in F$ に関して$\boldsymbol{f} \preceq \boldsymbol{y}$ を満たすことを指し，$F \preceq \boldsymbol{y}$ と書く．


## Attainment surface
以下の図にあるように最適化中に得られたPareto解を基に目的空間を階段状に区切る面のことをAttainment surfaceと呼びます．
このような面は1試行につき1つPlotすることができますが，複数試行に関してこのようなPlotを行うには工夫が必要となります．
この工夫に関して説明するのが本記事の目的になります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355593/61304447-f2d2-1e90-deb9-daba0a38ac66.png)

Figure 4. in [Indicator-Based Evolutionary Algorithm with Hypervolume Approximation by Achievement Scalarizing Functions](https://dl.acm.org/doi/pdf/10.1145/1830483.1830578?casa_token=wAx-0-6HgLYAAAAA:LTZmyz4H20nnS9aaTJhQA84UejRISpWK_iCkl33LIT2ER6higBIahESB3x9-yZEq8jVkR9BzSjzMPQ).

## k% attainment surface
まず，empirical attainment functionという関数を以下のように定義します．
```math
\alpha(\boldsymbol{y}) := \alpha(\boldsymbol{y}|\mathcal{F}_1,\dots,\mathcal{F}_N) = \frac{1}{N} \sum_{n=1}^N \mathbb{1}[\mathcal{F}_n \preceq \boldsymbol{y}]
```

ここで，$k$% attainment surfaceとは $S = \\{\boldsymbol{y}\mid\alpha(\boldsymbol{y}) \geq k/100\\}$ のような点集合を指します．
従って，$\\{1/N,50,100\\}$% attainment surfaceはそれぞれbest, median, worstなattainment surfaceを指すことがわかります．

[2] [An Approach to Visualizing the 3D Empirical Attainment Function](https://dl.acm.org/doi/pdf/10.1145/2464576.2482716?casa_token=b9vWo8MI3i8AAAAA:4UaDmmM1YgQFVo-vEQdNKvk9-12RTT8sO7n16CQIvneP_J33w_eGo2wYhfphwufqY5OcYPYj_Gc3mA)

[3] [On the Computation of the Empirical Attainment Function](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.705.1929&rep=rep1&type=pdf)

## 実装

可視化に用いるのは主に2次元であり，2次元の実装は比較的簡単であるため，2次元の実装のみ行い[github上に公開](https://github.com/nabenabe0928/empirical-attainment-func)した．
Raspberry Pi3B+でVxWorksを動かしてみた

## はじめに
Raspberry Pi3B+でVxWorksを動かしてみたくなり、試してみました。いろいろ参考にしたけれど、3B+が旬を過ぎたせいか、どの情報も不十分でした。下記の情報を元に、実際に動かすところまでの手順をメモとして残します。

https://labs.windriver.com/downloads/wrsdk-vxworks7-docs/2103/README_raspberrypi3b.html

## 環境
### ターゲット
* Raspberry Pi3B+
* 有線LAN接続
  * Wi-Fiコンバータ可

### 開発環境
* CPU: Intel(R) Core(TM)2 Duo CPU     T7250  @ 2.00GHz
* RAM: 2GB
* Storage:　OS + tool + 6GB (Total:13GB)
* OS: Debian系Linux
  * Bodhi 6.0 (GNU/Linux 5.4.0-72-generic x86_64)
    * Linux version 5.4.0-72-generic (buildd@lcy01-amd64-019) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #80-Ubuntu SMP Mon Apr 12 17:35:00 UTC 2021
  * lubuntu
* 2022年4月にlubuntuで動作確認し、8月にbodhiでSDカード作成手順を再確認しています。 


## SDカードイメージ作成手順
基本は上記のREADMEです。
下記をコピペしながら、淡々と進めてください。
```bash
# Prerequisite(s)
sudo apt install build-essential libc6:i386

# for u-boot
sudo apt install gcc-aarch64-linux-gnu bison flex libssl-dev git

# pyftpdlib
sudo apt install python3-pip
sudo pip install pyftpdlib

# making sdcard image (require 6GB)
mkdir sdcard
mkdir sdcard/vx

# firmware
wget https://github.com/raspberrypi/firmware/archive/1.20200212.tar.gz
tar xf 1.20200212.tar.gz
cp -rp firmware-1.20200212/boot/* sdcard

# u-boot
git clone https://gitlab.denx.de/u-boot/u-boot.git
cd u-boot
git checkout v2019.10
git show -s --format=%H
#61ba1244b548463dbfb3c5285b6b22e7c772c5bd
CROSS_COMPILE=aarch64-linux-gnu- make rpi_3_b_plus_defconfig
CROSS_COMPILE=aarch64-linux-gnu- make
cp -p u-boot.bin ../sdcard/kernel8.img
cd ..

# SDK
wget https://d13321s3lxgewa.cloudfront.net/wrsdk-vxworks7-raspberrypi3b-1.6.tar.bz2
tar xf wrsdk-vxworks7-raspberrypi3b-1.6.tar.bz2
cp -rp wrsdk-vxworks7-raspberrypi3b/vxsdk/sdcard/* sdcard
cp -p wrsdk-vxworks7-raspberrypi3b/vxsdk/bsps/rpi_3_0_1_1_2/uVxWorks sdcard/vx

# disk usage
du -sh u-boot
#383M	u-boot

du -sh firmware-1.20200212
#401M	firmware-1.20200212

du -sh wrsdk-vxworks7-raspberrypi3b
#4.0G    wrsdk-vxworks7-raspberrypi3b

du -sh sdcard
#191M    sdcard
```
ここまでできれば、あとはFAT32でフォーマットしたてのSDカードをマウントして、sdcardフォルダの内容を丸々SDカードのルート以下にコピーするだけです。<P>
Pi3B+にカードを挿して電源を入れたら、telnetで接続します。IPアドレスの調べ方は以下の記事を参考にしてください。

https://qiita.com/e4rfx/items/aa97a40653c0f46515f6

## おわりに
UARTケーブルが必須だと思い込んで買ってしまいましたが、UART接続でわかるのは、telnet接続に必要なIPアドレスくらいで、その後はftp含めて有線LANポート経由で繋がっていないと、ほぼ何もできませんでした。有線LAN環境がない作業場所で動かすためには~~UARTケーブル~~ではなく、「Wi-Fiコンバータ」が必要でした。有線の口があれば、LANケーブルだけで大丈夫です。
88.super

## superとは
継承するために必要な処理

## 継承する為にすること２つ
1.継承先 extends 継承元を加える
2.super(継承元の引数を加える);
例）
```javascript
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    hello() {
        console.log('hello ' + this.name);
    }
}

class Japanese extends Person {
    constructor(name, age, gender) {
        super(name, age);
        this.gender = gender;
    }

    hello() {
        console.log('Konnichiwa ' + this.name);
    }

    bye() {
        console.log('Sayonara ' + this.name);
    }
}

const taro = new Japanese('Taro', 23, 'Male');
console.log(taro);
taro.bye()
```

## 重要事項
1.superはconstructorの真下に書くべき
```javascript:正
constructor(name, age, gender) {
        super(name, age);
        this.gender = gender;
    }
```
```javascript:誤
constructor(name, age, gender) {        
        this.gender = gender;
        super(name, age);
    }
```
```:エラーが出てきました。
<a class='gotoLine' href='#54:7'>54:7</a> Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor"
```
2.継承後に継承『前』のメソッドを呼びたい
    1.上記の継承の記述を完了させる
    2.継承先のメソッドの中にsuper.継承元のメソッド()を記述
    3.メソッドを呼び出す

```javascript
// 継承元のhelloは'hello '
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    hello() {
        console.log('hello ' + this.name);
    }
}


// 継承先のhelloは'Konnichiwa  '
class Japanese extends Person {
    constructor(name, age, gender) {
    		super(name, age);
    		this.gender = gender;
        
        
    }

    hello() {
        console.log('Konnichiwa ' + this.name);
// 継承先のhelloの中に継承元のhelloを呼び出したいときは？
        super.hello()
    }

    bye() {
        console.log('Sayonara ' + this.name);
    }
}
【LaTeX,listings】行番号を表示したい！でも行番号ごとコピーしないで……




# lstlisting について
LaTeX でソースコードを書ける環境の1つに listings パッケージの`lstlisting`があります。`\lstset`というコマンドでプレアンブルから色々カスタマイズできて、自分は下のような設定をしています。他のサイトからコピペした部分もあればオリジナルでカスタマイズした部分もあります。


例えばこんなふうに使います。

```latex:platex文書
\documentclass[a4j,12pt,dvipdfmx]{jsarticle}
\lstset{
	stringstyle={\ttfamily},
	commentstyle={\ttfamily},
	basicstyle={\ttfamily},
	columns=fixed,
  frame={tb},
  breaklines=true,
  columns=[l]{fullflexible},
	numbers=left,%行数を表示したければonにする
	numberstyle={\scriptsize}
  xrightmargin=0em,
  xleftmargin=3em,
  stepnumber=1,
  numbersep=1em,
	tabsize=2,
  lineskip=-0.5ex
}
\begin{document}
\begin{lstlisting}
import numpy as np
a=1
b=np.sqrt(0.5)
t=0.25
p=1
for i in range(1,4):
	a1=(a+b)/2
	b1=np.sqrt(a*b)
	t1=t-p*(a-a1)**2
	p1=2*p
	a=a1
	b=b1
	t=t1
	p=p1
mypi=((a+b)**2)/(4*t)
print(mypi)
\end{lstlisting}
\end{document}
```

ガウス・ルジャンドルのアルゴリズムによって円周率を求める python コードです。行番号つきです。

出力した pdf を png 画像にしたもの

![copipeimg3-nt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/e397bcda-e72e-4016-2780-5267196eb079.png)


出力した pdf
[https://github.com/migawariw/lstlisting_with_copy/files/9489821/cannotcopy.pdf](https://github.com/migawariw/lstlisting_with_copy/files/9489821/cannotcopy.pdf)


# 行番号をコピーさせない
さてここからが本題です。出力した pdf を開いての中のコードをコピーしてそれをどこかにペーストしてみてください（macの preview や safari を想定していますが他の viewer でも構いません）。おそらく次のように行番号ごと選択されて行番号が残ったままペーストされてしまうでしょう。
![SS_2022-09-05_21-44-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/354dcd89-56b3-9822-2102-768f5dc987db.png)
ペースト後の様子

```python
import numpy as np
2 a=1
3 b=np.sqrt(0.5)
4 t=0.25
5 p=1
6 for i in range(1,4):
7 a1=(a+b)/2
8 b1=np.sqrt(a*b)
9 t1=t-p*(a-a1)**2
10 p1=2*p
11 a=a1
12 b=b1
13 t=t1
14 p=p1
15 mypi=((a+b)**2)/(4*t)
16 print(mypi)
```

行番号が文字として表示されてしまっています。これではソースコードの意味を成しません（まあ列選択して消せばいいのですが…）。行番号を表示しつつ、なおかつ行番号を抜いてコピペできる必要があります。

しかしこれを何と検索したら解決するのか自分にはわかりませんでした。長らくこれに悩んで行番号をつけられずにいたのですが、最近ようやく解決しました。`\lstset`の中に以下を追加して背景色をつけます。

```tex
backgroundcolor=\color{white}
```

あと色を使っているので color または xcolor パッケージを読み込む必要があります。こうすると下のようにいい感じに選択できるようになります。
![SS_2022-09-05_21-52-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/12d628e8-3ac0-17b2-ca2b-4aa632fffc3a.png)
ペースト後の様子

```python
import numpy as np
a=1
b=np.sqrt(0.5)
t=0.25
p=1
for i in range(1,4):
	a1=(a+b)/2
	b1=np.sqrt(a*b)
	t1=t-p*(a-a1)**2
	p1=2*p
	a=a1
	b=b1
	t=t1
	p=p1
mypi=((a+b)**2)/(4*t)
print(mypi)
```

githubに上げました。copipeimg.pdf が行番号ごと選択しちゃう方、copipeimg2.pdfが行番号なしで選択する方です。

[https://github.com/migawariw/lstlisting_with_copy/blob/main/copipeimg.pdf](https://github.com/migawariw/lstlisting_with_copy/blob/main/copipeimg.pdf)




# 反省

サンプルコードが縦長すぎた…
人事のおじさんプログラミングを学ぶ Day11「配列を使って箇条書きのHTMLをつくる」

書籍『確かな力が身につくJavaScript「超」入門 第2版』に沿って、
配列を使って、箇条書きのHTMLをつくってみた。
![2022-09-05 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/4d20cb80-128b-8475-ebd2-5401441d1194.png)
![2022-09-05 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/30bf682e-f145-4be2-9089-79a201543bd9.png)
【PHP基礎復習5】文字列から数値のみを抽出する

[問題]
入力された文字列から数値の部分だけ取り出して出力しなさい。



# コード
```PHP
 $input = fgets(STDIN);
 echo preg_replace('/[^0-9]/', '', $input_line), PHP_EOL;
```

↓　15kgと入力
# 結果
```
15
```


☆文字列から数値のみを抽出する
preg_replace(正規表現,　置換後の文字列,　対象の文字列);
86.クラス,87,クラスと継承

## クラス
Javascriptにおいては、
コンストラクター関数をクラスっぽく表記したもの
*他言語ではコンストラクターよりもクラスの方が使われる
## 記述方法
#### 例
```javascript
class Product{

    constructor(name,price){
       
        this.name = name;
        this.price = price;
    }
//各インスタンスが参照するメソッドを定義
    display(){
        console.log(`名前:${this.name} 値段:${this.price}円`);
    }
    
}
```
## 書き方
#### 1.クラスを記述
```javascript
class Product{
// 
  }
}
```
#### 2. constructorの記述:クラスを生成した瞬間呼ばれるもの
→name,ageなどのプロパティを作成するときはこちらに入れましょう。
```javascript
class Product{
 // thisの設定、プロパティの初期化
    constructor(name,price){
       
        this.name = name;
        this.price = price;
    }
    
}
```
#### 3.メソッドの設定
```javascript
class Product{

    constructor(name,price){
       
        this.name = name;
        this.price = price;
    }
//各インスタンスが参照するメソッドを定義
    display(){
        console.log(`名前:${this.name} 値段:${this.price}円`);
    }
    
}
```
#### 4.インスタンスの生成
```javascript
const beef = new Product("Beef",300);

const beef = new Product("Pork",200);
```
#### 5.呼び出す
```javascript
beef.name
beef.display()
```
→デバックするとこんな感じになります。
![スクリーンショット 2022-09-05 22.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/fab20d0d-bd17-fe1f-721d-b38b553d3caf.png)

## 継承
#### 例
```javascript
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    hello() {
        console.log('hello ' + this.name);
    }
}

class Japanese extends Person {
    constructor(name, age, gender) {
        super(name, age);
        this.gender = gender;
    }

    hello() {
        console.log('Konnichiwa ' + this.name);
    }

    bye() {
        console.log('Sayonara ' + this.name);
    }
}

const taro = new Japanese('Taro', 23, 'Male');
console.log(taro);
taro.bye()
```
## クラス特有の継承のための記述
1.継承先のクラスを『extends 継承元』を加えて記述
```javascript
class Japanese extends Person {

    }
```
2.constructorを『super(元の引数);』を加えて記述
```javascript
class Japanese extends Person {
    constructor(name, age, gender) {
        super(name, age);

    }
```
3.追加する処理を加える
```javascript
class Japanese extends Person {
    constructor(name, age, gender) {
        super(name, age);
        this.gender = gender;
    }
```

4.呼び出す
```javascript
const taro = new Japanese('Taro', 23, 'Male');
console.log(taro);
taro.bye()

```
ElastiCache for Redisのフェイルオーバー時間を計測してみた

# やりたいこと

- ElastiCache for Redisの設計をしたい（まずは方式レベル）
- 用途はアプリケーションのセッション管理
- 可用性要件が高く、AZ障害の際にもダウンタイムを最小限にしたい


# 参考文献

- 公式ドキュメントだとこれがドンピシャ

https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/AutoFailover.html

- 2年前ですが分かりやすい公式スライド

https://pages.awscloud.com/rs/112-TZM-766/images/Session%201%20-%20ElastiCache-DeepDive_v2_rev.pdf

- 基本のおさらいには安定のクラメソさんブログ

https://dev.classmethod.jp/articles/elasticache-cluster-mode/

これらより、まずは「クラスターモード」を採用すべきか否か、の判断のためフェイルオーバー所要時間を実測してみる。


# 試したこと

### 準備

- 非クラスターモードのRedisクラスターを作成
    - クラスター名：single-shard
    - マルチAZ：有効
    - レプリカ数：2
    - AZの配置（ノード）
        - プライマリ：ap-northeast-1a
        - レプリカ1：ap-northeast-1a
        - レプリカ1：ap-northeast-1c

- クラスターモードのRedisクラスターを作成
    - クラスター名：multi-shard
    - マルチAZ：有効
    - シャード数：3
    - レプリカ数：2
    - AZの配置（ノード）
        - プライマリ：ap-northeast-1a
        - レプリカ1：ap-northeast-1a
        - レプリカ1：ap-northeast-1c

![スクリーンショット 2022-09-05 22.32.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/63c707e5-90f5-349e-12b2-89406d73107d.png)


### 手動フェイルオーバーの実行

ElastiCacheではAuroraのように手動でフェイルオーバーが実行できる！
お手軽なので今回はこれで試してみる。

- まずは非クラスターモードのクラスター（ややこしい）でプライマリノードを選択し「プライマリをフェイルオーバー」を実行
![スクリーンショット 2022-09-05 22.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d219f479-e083-49cf-223a-710c60a40fe9.png)

- すると **約20秒** でプライマリノードが001号機から003号機へ切り替わった！
![スクリーンショット 2022-09-05 22.44.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/e401ce76-4771-d376-6389-cb9ba80b07c5.png)

- お次はクラスターモードのクラスター（ややこしい）でシャードをどれか1つ選択し「プライマリをフェイルオーバー」を実行
※マネコンのノードリストが階層式で見やすくて嬉しい😊
![スクリーンショット 2022-09-05 22.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b263c96e-d43f-ac82-9695-095639666c8f.png)

- 実行はしたものの非クラスターモードのときと異なり、ノード一覧にプライマリ/セカンダリがマネコン上表示されていないため切り替わり完了時刻を確認できず。苦笑（CloudTrailも見たものの所要時間は確認できず）

- ただし、そもそもクラスターモードではマルチシャード構成のため、単一AZ障害＝部分的なシャード障害に陥ったとしても、シャード内のノード昇格を待たずして、生きているAZ上のシャードへそのまま書き込み可能なはず。そのため書き込みダウンタイムはほぼ発生しない？ ※ここは要確認。


# 分かったこと

- ElastiCache for Redisのシャード内におけるノード昇格所要時間はマネコン表示上、数十秒。（実測サンプルの一例として）
- その書き込みダウンタイムが許容できない場合、クラスターモードを有効にしてマルチシャード構成を利用すべし！

ちなみに手動フェイルオーバーの実行クォータは1日5回までのようなので、実験する方は注意。
おやつは1日５袋まで！（謎）

https://zenn.dev/shonansurvivors/articles/2bc034cf1fdad6

（Zennヒット率が個人的に高い山原さん。いつもありがとうございます！）


# 最後に一言

MemoryDB for Redis、早く大阪リージョン対応しないかなぁ (´ー｀)

https://aws.amazon.com/jp/memorydb/
データ値の累積分布（可視化、JavaScript）


こんにちは。
データ値（正規分布の例）の累積分布をプロットしました（二種）：
1. 直接法[^1] [^2]（赤線）
2. ヒストグラム経由法（青線）

[^1]: 参考：「[累積分布関数をソートで求める(Python版)](https://qiita.com/kaityo256/items/09e44c0435bd5a972272)」
[^2]: さらにこれを $\mathrm{erf}^{-1}$を用いて変換しました（橙線）。正規分布のこの例では、直線状となります。

![histogram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/566016c1-3734-d1fd-65cf-1ee05f1d1ebb.jpeg)

* ソースおよび動作例はこちら： "[Drawing cumulative density function](https://bl.ocks.org/kkdd/99f4befb33eaff3d0aa31f99182cfd98)" (bl.ocks.org)
【LaTeX】急にゴシックが太く（細く）なりすぎる時の対処法


# 原因（platex）

otf パッケージを`deluxe`オプションによって読み込んだことで太ゴシックと中ゴシックができたからかもしれないです。

もともと
- 明朝体：原ノ味明朝regular
- ゴシック体：原ノ味ゴシックMedium

の２書体のみだったのが７書体に増えて
- 明朝体細字、中字：原ノ味明朝regular
- 明朝体太字：原ノ味明朝bold
- ゴシック体中字：原ノ味ゴシックregular
- ゴシック体太字、極太字、丸ゴシック体：原ノ味ゴシックbold

のようになっています。





# 対処法
pxchfon パッケージを`otf`オプション付きでよみこんで以下のコードをプレアンブルに入れます。

```latex
\setlightminchofont{（明朝体細字用フォント）}%\ltseries\mcfamily
\setminchofont{（明朝体中字用フォント）}%\mdseries\mcfamily
\setboldminchofont{（明朝体太字用フォント）}%\bfseries\mcfamily
\setgothicfont{（ゴシック体中字用フォント）}%\mdseries\gtfamily
\setboldgothicfont{（ゴシック体太字用フォント）}%\bfseties\gtfamily
\setxboldgothicfont{（ゴシック体極太字用フォント）}%\ebseries\gtfamily
\setmarugothicfont{（丸ゴシック体用フォント）}%\textmg
```

例えば自分だったら

```latex
\setlightminchofont{HaranoAjiMincho-Light.otf}%\ltseries\mcfamily
\setminchofont{HaranoAjiMincho-Regular.otf}%\mdseries\mcfamily
\setboldminchofont{HaranoAjiMincho-Bold.otf}%\bfseries\mcfamily
\setgothicfont{HaranoAjiGothic-Regular.otf}%\mdseries\gtfamily
\setboldgothicfont{HaranoAjiGothic-Medium.otf}%\bfseties\gtfamily
\setxboldgothicfont{HaranoAjiGothic-Bold.otf}%\ebseries\gtfamily
\setmarugothicfont[0]{HiraMaruProN-W4.ttc}%\textmg
```

のようにしています。基本的に原ノ味フォントを使いますが丸ゴシック体だけは使えないのでヒラギノを使いました。あとゴシック体のボールドは Bold よりも Medium の方がいいと思います。 Medium でも十分に太い気がするので。
![otffont.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/3a4c6579-a33f-b776-7b7f-222640c714bf.png)
【Python】png,jpeg,gif画像をeps形式に変換する

PillowライブラリのImageモジュールにより，png，jpeg，gifなどの画像をeps形式に変換することができます．
Pillowをインストールしているのであれば，怪しいフリーソフトをダウンロードする必要はありません．

```py:img2eps.py
import os
from PIL import Image

image_path = 'C:/Users/' + os.getlogin() + '/Downloads/'
image_file = ['ABC.png', 'DEF.jpg', 'GHI.gif']

for i in range(len(image_file)):
    im = Image.open(image_path + image_file[i])
    # print(im.mode)
    fig = im.convert('RGB')
    fig.save(image_path + image_file[i].split('.', 1)[0] + '.eps', lossless = True)
```

ダウンロードフォルダ内にある 'ABC.png', 'DEF.jpg', 'GHI.gif' という3つの画像をすべてeps形式に変換して保存します．
Imageモジュールが読めるのであれば，その他の拡張子でも応用可能です．適宜改変してご利用ください．

>個人的にTeX文書を書く機会があったので，作成しました．

---
### 【参考】
- [**Python Pillow Convert PNG to EPS: A Completed Guide**  –  Pillow Tutorial](https://www.tutorialexample.com/python-pillow-convert-png-to-eps-a-completed-guide-pillow-tutorial/)
- [**Image Module**  –  Pillow (PIL Fork) 9.2.0 documentation](https://pillow.readthedocs.io/en/stable/reference/Image.html)
【LaTeX】\footnoteも\refしたい


LaTeX の脚注を`\footnote`で出した後もう一回同じ脚注を参照したいなとなったときは

- はじめに`\footnote{脚注の内容\label{ラベル名}}`として
- 再び参照するときは`\footref{ラベル名}`とする

だけです。特別なパッケージとかはいらないようです。~~気付かないで3時間くらい無駄にしました。~~ hyperrefも対応しているみたいです。


```latex:platex文書
\documentclass[dvipdfmx]{jsarticle}
\pagestyle{empty}
\usepackage{geometry}
\usepackage{hyperref}
\geometry{papersize={15cm,3cm}}
\begin{document}
吾輩\footnote{日本語の一人称の一つ。\label{fot:吾輩}}は猫である。吾輩\footref{fot:吾輩}は犬ではない。
\end{document}
```
出力（用紙サイズを横長にしました）
![footref.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/9fe1fd14-097b-5e89-37a8-96e6f73f4a86.jpeg)
トーストを表示する

## 対象読者
+ トーストを表示させたい

## できるようになること
+ トーストを表示できるようになる

## 手順

1. 例えば、ボタンを押したときに呼ばれる関数に、以下の内容を記載する。
    ~~~
    val toast = Toast.makeText(this, "表示したい文字列", Toast.LENGTH_LONG)
    toast.show()
    ~~~
    + 表示時間
    　　Toast.LENGTH_LONG->長め
    　　Toast.LENGTH_SHORT->短め
1. 実行してボタンを押下する

## まとめ
+ トーストが表示できる