OmniAICreator/Qiita-1.07M huggingface dataset:
WooCommerce のマイページに独自のページを追加する方法

# マイアカウントページのメニューに新しい項目を追加

`woocommerce_account_menu_items` フィルターを使ってメニューを追加します。
追加方法は以下となります。
また、項目のキーとして、エンドポイントとして追加する名前を設定します。ここでは「my-new-page」とします。

```php: functions.php
add_filter( 'woocommerce_account_menu_items', 'woo_my_page_add_menu_item' ); 
function woo_my_page_add_menu_item( $items ) { 
  $items['my-new-page'] = '新しいメニュー名'; 
  return $items; 
}
```
このままにすると一番下に追加されます。もし、上から2番目に入れたい場合は　`$items`　の配列に入れ込む必要があります。
例えば、`orders`のエンドポイントの上に入れる場合は、`orders`の前に入れ込む処理を行えばいい。
もちろん、エンドポイント管理画面で変更できるので、変更していた場合は、変更したエンドポイントで対応する必要があります。単純に3番目にするとかは現状出来ないです。

```php: functions.php
add_filter( 'woocommerce_account_menu_items', 'woo_my_page_add_menu_item' ); 
function woo_my_page_add_menu_item( $items ) { 
  foreach($items as $key => $value ){
    if($key == 'orders'){
      $new_items['my-new-page'] = '新しいメニュー名'; 
    }
    $new_items[$key] = $value;
  }

  return $new_items; 
}
```

# 新しいエンドポイントを追加
次に、新しく追加したメニュー項目に対応するコンテンツを表示するために、新しいエンドポイントを追加します。
先に設定したエンドポイント「my-new-page」を指定します。

```php: functions.php
add_action( 'init', 'add_custom_my_account_endpoint' );
function add_custom_my_account_endpoint() {
    add_rewrite_endpoint( 'my-new-page', EP_ROOT | EP_PAGES );
    flush_rewrite_rules();
}
```
`flush_rewrite_rules()` はパーマリンクを更新する機能があるためにつけております。
なので、ページ表示速度を遅くしてしまう傾向があるので、この行を無くして、プラグインなどは `register_activation_hook` 関数の処理をしたり、テーマの場合は `after_switch_theme` のアクションフックの処理でパーマリンクを更新するようにした方がいいです。

# 表示する内容を定義
最後に、新しいエンドポイントで表示する内容を定義します。
定義する action の名前は　`woocommerce_account_***_endpoint`となります。
`***`の部分にはエンドポイント名が入りますのでここでは、「my-new-page」を入れます。

```php: functions.php
add_action( 'woocommerce_account_my-new-page_endpoint', 'add_custom_endpoint_content' );
function add_custom_endpoint_content() {
    // ここに表示したい内容を書きます。
}
```

ここで入る場所は `<div class="woocommerce-MyAccount-content">***</div>`の`***`部分に出力される形になります。
【知育おもちゃサブスク比較】人気6社の目的別ランキング！おすすめをアドバイザーが解説

この記事では、子育て世帯に話題の知育おもちゃサブスクを徹底調査。実際に人気6社を利用してわかった目的別ランキングも解説しています。
https://chiiku-world.com/subscription-ranking/
BizRobo! でメールが送信できない？と思ったら SPF を疑え！！

## はじめに

BizRobo!を使ってメールを送信したい場合、`メールの送信` というアクションを使って外部にメールを送信することができます。

一方で全て正しく設定したはずなのに、メール送信が失敗してGmail宛に送信するとエラーになると聞きました。

とういうことでしょうか。

## 検証してみよう

とりあえず送信してみます。
まず、BizRobo!を使ってメールを送ってみます。ド初心者ですから[ナレッジベースの記事](https://knowledge.bizrobo.com/hc/ja/articles/360034741911)を見ながら作りました。

思ったよりずっと簡単です！ワンスデップでクリアしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/0494820b-7dde-6d68-f626-8fd34e708726.png)
 
検証目的ですが、件名には「test」ではなくきちんとした文字列を設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/1066aa8e-eeb8-1844-5960-b74fc69ebe01.png)

 
サーバーとポートの設定は[Microsoft公式サイト](https://support.microsoft.com/ja-jp/office/pop-imap-smtp-%E3%81%AE%E8%A8%AD%E5%AE%9A-8361e398-8af4-4e97-b147-6c6c4ac95353)の情報を利用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/20b878ef-449c-7a47-39ed-27c589ece801.png)
 
送ってみます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/d8bbb5e7-a580-0fbb-f00e-4e4c8c20fb6c.png)
エラーは発生せず、メールを受信できました。
無事に届いていることは嬉しいけど、エラーが再現できないと検証作業は…私の検証作業……

直接上司に聞いてみました！
「SPF制限でなはいか？最近Gmailは更に厳しくなったみたいです」
とのこと。

聞いたことのない言葉が出ました！SPFとは何でしょうか？

## SPFとは？
ChatGPTに聞いてみます。長文読解は苦手ですから、念のため100文字で頼みました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/a9c550b6-3479-8a34-1af5-9073b497766f.png)
違うと思います。もう一回、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/365f5f59-3c23-7c55-b40b-072d06327082.png)
なるほど、要するにセキュリティ関連のメカニズムですね。

SPFは仕組みであり、その設定はSPFレコードといいます。
つまりロボットが送ったメールはなりすましメールと判断され、Gmail側で拒否されたために送信エラーが出たのかもしれません。これ、冤罪じゃないですか？

具体的にどう機能していますかね、SPF。ChatGPTは画像がないから長い説明を頑張って読んでみて……
結局Googleしました。うん。

## SPFとメール送信の仕組み
調べてみると、SPFのことを知るためには、メール送信の仕組みが分からないと進めません。むしろ、SPFはメール送信の仕組みの一環であることが分かりました。

実はロボットだけではなくIT自体もド初心者ですが、流れを描いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/09722500-47a3-591a-26f2-6b12f3f8d353.png)
完全な送信フローは複雑でたくさんの確認が飛ばされているようですが、一旦概要を抑えるための荒い図にまとめます。

図を見て分かったことは、SPF専用のサーバーがあるわけではなく、③と④のシーケンスでDNSサーバーと受信側のメールサーバーがやり取りしているプロセスであること。SPFはDNSサーバーに関連しているようですが、どんな関係でしょうか？

## SPFレコードとDNS？
SPFとは、DNSサーバーに設定するレコードのことです。
SPFレコードはDNS（Domain Name System）サーバー内で設定・保存され、メール送信元のドメインの正当性を示します。つまり、なりすましメール、迷惑メールではないことの確認に使用します。

受信側メールサーバーはDNSからSPFレコードを取得し、送信元のIPアドレスが許可されたものかを確認します。それにより、受信したメールが正しいメールかそうでないかの判別ができるということです。

:::note info
DNSサーバーにSPFレコードを設定することは必須ではありませんが、メールのセキュリティを高めるために、SPFレコードを設定することをお勧めします。
:::

## まとめ

Googleで検索すると以下のようなページが見つかりました。

https://support.google.com/a/answer/33786?hl=ja

どうやらGmailにメールを送信するためには、SPFが設定されたサーバーからのメール送信が必要なようです。

以上のことから、冒頭「BizRobo!でGmail宛にメールを送信できない」という事象は、`メールの送信` アクションの中に指定したメール送信サーバーが SPFレコードに登録されていないサーバーだったため、Gmail側でなりすましメールと判断されてしまったのではないかと思います。

最初に検証をしようとロボットを作って一発で送信成功した理由は、SPF指定済みの正しいメールサーバー情報を使ったからかな、と思っています。

「メールが届かない」現象は他の理由もあると思いますが、一つの対策として覚えておいても損はなさそうです。
jQueryでHTMLの共通部分をインクルードする懸念点

## 概要
過去にRailsの様な全部載せフレームワーク使う場合を除き、簡素のプロジェクトを運営する際に、HTMLの共通部分を記述する際に、これってDRY原則的にメンテナンスが大変になるのではと考えjQueryを用いてインクルードさせてはいけないのかと考えたことが御座いました。Railsの様なフレームワークを用いれば、当然この様なことが可能になりますが、`jQueryでインクルードを実現することが出来るのか？`というのがアジェンダとなります。
この事象について私なりの見解を記述させて頂きます。

## 本論
HTMLのページ間で共有する要素がある場合、例えばヘッダーやフッター、ナビゲーションバーなどがそれに当たりますが、これらの要素をすべてのHTMLファイルに直接書き込むと、DRY原則的に、メンテナンスが大変になるのではと前述させて頂きました。そこで、これらの共通部分を別のHTMLファイルに抽出し、それを各ページに挿入（インクルード）することを考えました。

jQueryを使用すると、このような要素の挿入が非常に簡単になります。次のコードスニペットは、共通のヘッダーを各ページにインクルードする例を示しています。

```html
<!DOCTYPE html>
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script> 
    $(function(){
      $("#includedContent").load("header.html"); 
    });
    </script> 
</head>
<body>
<div id="includedContent"></div>
<!-- 他のコンテンツ -->
</body>
</html>
```
上記の例では、header.htmlは共通のヘッダーコンテンツを含むHTMLファイルとなります。そして、$("#includedContent").load("header.html") というコード行がこのファイルを読み込み、#includedContentというIDを持つdiv内に挿入します。

## 問題点
しかし、このアプローチにはいくつかの問題点があると考えます。

1. `JavaScriptの依存性`： ユーザーが何らかの理由でJavaScriptを無効にしていたり、ブラウザがJavaScriptをサポートしていない場合、共通コンテンツは表示されません。これは、特に重要な情報が含まれている場合、大きな問題となる可能性があります。

2. `ページの読み込み速度`： 共通コンテンツを非同期にロードするため、ページ全体の表示が遅くなる可能性があります。これはユーザーエクスペリエンスに悪影響を及ぼす可能性があります。

3. `SEO問題`： 一部の検索エンジンはJavaScriptを正しく解析できない場合があり、その結果、共有コンテンツがインデックスされない可能性があります。これは、ウェブサイトのSEOに影響を及ぼす可能性があります。

## 結論
先述させて頂いた内容より、私が知る限りでは、jQueryを用いてHTMLの共通部分をインクルードするのはかなりリスクがあると考え使用しないことに致しました。
【Paiza問題集】標準出力メニュー/【ｎ行の出力】1000行以内の出力

# Paiza問題集
Pythonで回答

## 標準出力メニュー/【ｎ行の出力】1000行以内の出力

### Step01 1行または2行の出力
```Python
"""
1行または2行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_step1
"""

# 数値を受け取る
num = int(input())

# 数字を出力する
if num == 1:
    print(1)
elif num == 2:
    print(1)
    print(2)
```


### Step02 数行の出力
```Python
"""
数行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_step2
"""

# 数値を受け取る
num = int(input())

# 数行を表示する
for i in range(num):
    print(i)
```


### Step03 10行以内の出力
```Python
"""
10行以内の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_step3
"""

# 数字を受け取る
num = int(input())

# 数行を表示する
for i in range(num):
    print(i + 1)
```


### Final問題 【ｎ行の出力】1000行以内の出力
```Python
"""
【ｎ行の出力】1000行以内の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_boss
"""

# 数字を受け取る
num = int(input())

# 数行を表示する
for i in range(num):
    print(i + 1)
```
Unityで音声認識(Speech to text)

こんにちは。大学生のKuniと申します。
大学でちょっとUnityの音声認識を使う機会がありまして、その備忘録としてこの記事を書いています。

# やったこと
Unityの機能を使って話した言葉を文章として書き起こす(Speech To Text)ということをしました。
使ったものとしてUnityEngine内に含まれるWindows.Speech.DictationRecognizerというものを使いました。

https://docs.unity3d.com/ja/current/ScriptReference/Windows.Speech.DictationRecognizer.html

# 環境
Windows 11
Unity 2021.3.22f1
Visual Studio 2019

# 始める前に
Windowsの設定 → プライバシーとセキュリティ → 音声認識の中にある、オンライン音声認識の設定をONにしてください。
これをONにしないとエラーが出て動作をしません。

# コード
```c#:SpeechToText
using UnityEngine;
using UnityEngine.Windows.Speech;

public class SpeechToText : MonoBehaviour
{
	DictationRecognizer dictationRecognizer;

	private void Start()
	{
		dictationRecognizer = new DictationRecognizer();

		dictationRecognizer.DictationResult += DictationRecResult;
		dictationRecognizer.DictationError += DictationRecError;		
	}

	private void Update()
	{
		if (Input.GetKeyDown(KeyCode.Space) && dictationRecognizer.Status == SpeechSystemStatus.Stopped)
		{
			dictationRecognizer.Start();
			Debug.Log("音声認識開始");
		}
		if(Input.GetKeyUp(KeyCode.Space) && dictationRecognizer.Status == SpeechSystemStatus.Running)
		{
			dictationRecognizer.Stop();
			Debug.Log("音声認識停止");
		}
	}

    //音声が認識されたときに発生するイベント
	private void DictationRecResult(string text, ConfidenceLevel confidence)
	{
		Debug.Log($"認識した音声： {text}");
	}

    //何かしらのエラーが起きた時に発生するイベント
	private void DictationRecError(string error, int hresult)
	{
		Debug.Log($"エラー：{error}, {hresult}");
	}

    //オブジェクトが破壊されるときに破棄する
	private void OnDestroy()
	{
		dictationRecognizer.Stop();
		dictationRecognizer.Dispose();
	}
}

```
このコードでは、Spaceキーが押されている間は音声認識がされるようにしてあります。
離した時には、音声認識は止まります。

# まとめ
今回はUnityの音声認識を使用して実装を行いました。ただ精度が荒いときもあるので、気になる方は他のライブラリを探してみてください。
私の環境だと日本語は反応するのですが、なぜか英語は反応しませんでした。この点について詳しい方がいましたらコメント等いただけると嬉しいです。
MongoDBの公開鍵更新

aptで使用されるMongoDBの公開鍵の更新を行ったので、その際の手順についてご紹介します。

## 環境

- Debian 10 (Buster)
- MongoDB 4.2

## 起きたこと

Debianサーバーのセキュリティーアップデートをかけようとした際、次のような警告が出ました。

```bash
$ sudo apt update
...
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 Release: The following signatures were invalid: EXPKEYSIG 4B7C549A058F8B6B MongoDB 4.2 Release Signing Key <packaging@mongodb.com>
W: Failed to fetch http://repo.mongodb.org/apt/debian/dists/buster/mongodb-org/4.2/Release.gpg  The following signatures were invalid: EXPKEYSIG 4B7C549A058F8B6B MongoDB 4.2 Release Signing Key <packaging@mongodb.com>
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

どうやらMongoDBのリポジトリの認証が通らずフェッチに失敗し、MongoDBパッケージの更新ができなくなっているようです。

## 公開鍵の確認

MongoDBはDebianの公式パッケージリストに含まれていないため、リポジトリの情報と公開鍵をパッケージ管理システムに登録して、パッケージをインストールしています。

登録されている公開鍵の状態を確認します。

```bash
# apt-keyコマンドを使うためにgnupgをインストール
$ sudo apt install gnupg

# 登録済みの公開鍵リストを表示
$ apt-key list
/etc/apt/trusted.gpg
--------------------
pub   rsa4096 2018-04-18 [SC] [expired: 2023-04-17]
      E162 F504 A20C DF15 827F  718D 4B7C 549A 058F 8B6B
uid           [ expired] MongoDB 4.2 Release Signing Key <packaging@mongodb.com>

…
```

「[expired: 2023-04-17]」とあるように、有効期限切れのようです。

## 公開鍵の更新

最新の公開鍵をダウンロードして、登録済みの公開鍵と差し替えます。

```bash
# 最新の公開鍵をダウンロード
$ curl -O https://pgp.mongodb.com/server-4.2.asc
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1674  100  1674    0     0   2532      0 --:--:-- --:--:-- --:--:--  2532

# 登録済みの公開鍵を削除（冒頭の警告文中「EXPKEYSIG 4B7C549A058F8B6B」を指定）
$ sudo apt-key del 4B7C549A058F8B6B
OK

# ダウンロードした公開鍵を登録
$ sudo apt-key add server-4.2.asc
OK

# 確認
$ apt-key list
/etc/apt/trusted.gpg
--------------------
pub   rsa4096 2018-04-18 [SC] [expires: 2025-04-16]
      E162 F504 A20C DF15 827F  718D 4B7C 549A 058F 8B6B
uid           [ unknown] MongoDB 4.2 Release Signing Key <packaging@mongodb.com>

…
```

有効期限が「[expires: 2025-04-16]」に更新されました。
`sudo apt update`を実行しても警告は出ず、パッケージの更新ができるようになりました。

## さいごに

今回、Debian 10 (Buster)環境において`apt-key`コマンドを使用しましたが、`apt-key`コマンドは既に非推奨となっているため、最新のDebianでは使えなくなっているようです。

代替コマンドとして`gpg`コマンドを使った方法が提示されているようなので、お使いのバージョンに合わせてどちらのコマンドを使うかご検討ください。

## 参考

- [Install MongoDB Community Edition on Debian](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-debian/)

- [apt-key addで登録した鍵を削除する方法](https://vpslife.server-memo.net/apt-key_dell/)

- [apt-key が非推奨になったので](https://zenn.dev/spiegel/articles/20220508-apt-key-is-deprecated)

- [第675回　apt-keyはなぜ廃止予定となったのか | gihyo.jp](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675)

- [非推奨となったapt-keyの代わりにsigned-byとgnupgを使う方法 - 2021-05-05 - ククログ](https://www.clear-code.com/blog/2021/5/5.html)
【Quarkus】Linux環境でQuarkus＋Gradleを動かすときにやったこと


操作環境
OS:ubuntu
プラットフォーム: x86

※ 手順はRootユーザまたはsudoコマンドを利用して実施する。
（一般ユーザの場合はコンテナ関連のコマンドがうまく読み書きできない場合があるので権限を修正して実行すること）

以下手順

SDKMANのインストール
関連コンポーネントが通常のリポジトリ経由で取得できないのでSDKMANをインストールする。

```
curl -s "https://get.sdkman.io" | bash
source "/root/.sdkman/bin/sdkman-init.sh"
```

Gradleのインストール
SDKMAN経由で公式サイトの最新版をインストールする。

```
sdk install gradle 8.1.1
```

ビルド実行時にquarkus cliが入っていないとエラーになるのでインストールをしておく
```
sdk install quarkus
```

自作のサンプルサプリをダウンロード
Quarkusアプリであればなんでも良いのでない人は`quarkus create app --gradle`でサンプルアプリを生成する。

```
git clone https://github.com/tukapai/quarkus-micro-mail-lambda.git
```

既存のquarkusアプリを動かす場合はgradlewを更新する必要があるのでwrapperコマンドでgradleの情報を更新する。
```
gradle wrapper
```

あとはLinuxであれば`./gradlew build`コマンドが通るかを確認する。
(3) HTB: PC 'Seasonal Machine'に挑戦しました - 5/20/2023

Hack the boxのSeasonal Machineに挑戦しました第三弾です。今週は、LinuxのEasyなboxです。リタイヤしていないのでWriteupは紹介できませんので、感想のみ載せています。https://www.hackthebox.com/machines/pc

この手のタイプは初めてだったのですが、想像を働かせれば、クリアできるレベルと言い聞かせ挑戦してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/b25244e5-a5ce-32b4-4286-a5476a689341.png)

Postmanははじめて使ってみました。あまり触る機会がなかったので、今回はよい機会だったのかもしれません。
https://www.postman.com/　

但しAPI攻撃のような手法は使う必要はないと思います。クリアすべきは最初の箇所です。

ハッピーハッキング
Golangでdlvが動作してない件（ブレイクポイントで止まらない件）

# PCの環境
```
M1 MAC Monterey
Golang 1.17, 1.19
vscode
```

# 経緯
1. Golangのバージョンを`1.17`から`1.19.3`にあげた
1. go delveのバージョンをvscodeを通じてあげた
1. デバックは動作するが、ブレークポイントでブレークされない

# 対応記録
1. golangバージョンを`1.17`に下げる
    → delveからバージョンが低すぎるとエラーが表示された

1. golangバージョンをbrew, goenv としてダウンロード
    → ブレイクポイントで止まらない

1. [vscode launch.json substitutePathの変更](https://github.com/go-delve/delve/issues/2795)
  → ブレイクポイントで止まらない

1. 現在ダウンロードされている全てのGolangを削除し、[asdf](https://asdf-vm.com/)でGolangを再度ダウンロード、パスを通す
  → ブレイクポイントで止まらない


# 解決
https://github.com/golang/vscode-go/issues/2417

vscode > Run and Debug: Focus on Breakpoints Viewを実行し、dlv内部のエラーを確認

上記の対応で、ブレーキポイントを探さないというエラーが表示されていた
普通のDebugボタンではエラーが表示されなかった


GoFlagのオプションを確認した

https://github.com/microsoft/vscode-go/issues/2807

`go env` で私のPCで`GOFLAGS="-trimpath"`になっていることを確認
仕事で同じM1 MACを持っている人と比較し、そのMacでは`GOFLAGS`の設定がなかったので削除

```
go env -w GOFLAGS=''
```

## 対応完了
build ruby-3.3.0-preview1 on macOS  rbenv

環境は Intel Mac + Monterey です。

```bash
$ brew upgrade ruby-build

$ brew install openssl@3 readline libyaml gmp rust

$ RUBY_CFLAGS="-w" LDFLAGS="-L/usr/local/opt/openssl@3/lib" RUBY_CONFIGURE_OPTS="--disable-shared --with-openssl-dir=$(brew --prefix openssl@3)" rbenv install 3.3.0-preview1

$ RUBYOPT=--yjit ~/.rbenv/versions/3.3.0-preview1/bin/ruby -e 'p RubyVM::YJIT.enabled?'
true

$ RUBYOPT=--yjit ~/.rbenv/versions/3.3.0-preview1/bin/irb

```

refs https://github.com/rbenv/ruby-build/wiki
Railsのテーブル削除方法

## 概要
Railsでうっかり間違ったテーブルを作成してしまった時や、不要になったテーブルを削除する方法です。以下に手順を詳細に記載します。

## 手順

1. **モデルの削除**
    ```bash
    $ rails destroy model モデル名
    ```
    上記コマンドで指定したモデルを削除します。

2. **マイグレーションファイルの作成**
    ```bash
    $ rails generate migration ファイル名
    ```
    削除するテーブルのためのマイグレーションファイルを作成します。

3. **マイグレーションファイルの編集**
    作成したマイグレーションファイルにテーブル削除のコードを記述します。例えば、testというテーブルを削除する場合のコードは以下の通りです。
    ```ruby
    class test < ActiveRecord::Migration[7.0]
      def change
        drop_table :test
      end
    end
    ```
    
4. **マイグレーションの実行**
    ```bash
    $ rails db:migrate
    ```
    上記コマンドを実行することで、指定したテーブルがデータベースから削除されます。

以上の手順により、不要なモデルとテーブルが削除されます。

## 注意点

- モデルの削除コマンドはマイグレーションファイルを削除しますが、テーブル自体は削除されません。そのため、マイグレーションファイルへの削除コードの記述とマイグレーションの実行を忘れないようにしましょう。

- 複数の似たような名前のテーブルが存在する場合、混乱を避けるためにも不要なテーブルは削除しておきましょう。

## 参考
- [Ruby on Railsでテーブル削除](https://qiita.com/Kuragasaki/items/7d98cf29341611fb189a)
- [Railsでテーブルの削除](https://qiita.com/kanuu/items/a9223712ee0ff8d19d56)
Debianでシリアル通信

FreeBSD/i386のValueStarにJJYSをつなぐと受信できなくなるので、CelronのDebianでシリアル通信して確認してみました。

```
hiroki@debian:~$ sudo cu -l /dev/ttyS0 -s 2400
cu: open (/dev/ttyS0): Permission denied
cu: /dev/ttyS0: Line in use
hiroki@debian:~$ sudo chmod a+rw /dev/ttyS0
hiroki@debian:~$ sudo cu -l /dev/ttyS0 -s 2400
Connected.
23052321134362305232113437230523211343823052321134392305232113440230523211344123052321134422305232113443
```

sudoしてるのにPermission deniedってなんか変なの。
GitGuardianからセキュリティの警告メールが来た件

とあるUdemyの講座の模写を終えた後に
commit/pushをしたら以下の画像のように

![6B984742-6CB8-47D9-890C-A2BFA143DA05_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/a6154f97-a493-7ea6-c628-69bb80665f6b.jpeg)

GitGuardianという差出人からセキュリティの警告メールが来ました。

最初は心当たりがなかったのですが
よくよく自分のローカル環境を見てみると

おそらく「googleservice-info.plist」を
「Public」の状態でpushしたのが影響しているのでは？
という仮説に至りました。

#### 【今回のケーススタディから学んだこと】
Firebaseを使ったプロジェクトの場合
「googleservice-info.plist」を使う機会があると思いますが

その場合はリポジトリを「Public」ではなく「Private」に
する方が無難だなと思いました。

GitGuardian なるものからメールが来た件
https://www.yururiwork.net/archives/221
Laravelに向けたPHPで例外処理

# 例外処理とは
***プログラムの実行中に発生したエラー（例外）に対して、そのエラーをキャッチして特定の処理を行うことが例外処理***です。エラーが発生した箇所でプログラムの実行が中断されることを防ぎ、プログラムが正常に継続するための仕組みです。例外のエラーのことを```Exception```と言います。
例外が起きた時に行う処理を用意し、この一連の処理を```例外処理```と言います。

# 例外処理の書き方
```php
<?php
try{
    $bool = false;//bool格納
    $bool->method();//メソッドを呼ぶ処理 //ここでエラー発生
    echo '通常処理が実行<br>';
//例外が起こりうる処理
} catch(Error $e){
//例外が起きた時の処理
echo '例外処理が実行<br>';
echo $e->getMessage();
}finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}

//出力結果
//例外処理が実行
//Call to a member function method() on bool終了処理
```
***tryではエラーが出ているので通常処理が実行は出力されません***。

### 複数のcatch節
下のように***複数のcatch節つまるcatch{}***を書けます。

```php
<?php
try{
    new PDO('','','');
    $bool = false;//bool格納
    $bool->method();//メソッドを呼ぶ処理 //ここでエラー発生

    echo '通常処理が実行<br>';

//例外が起こりうる処理
} catch(PDOException $e){
    //例外が起きた時の処理
    echo 'PDOException<br>';
    echo '例外処理が実行<br>';
    echo $e->getMessage() .'<br>';

} catch(Error $e){
    //例外が起きた時の処理
    echo '例外処理が実行<br>';
    echo $e->getMessage() .'<br>';

} finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}

//PDOException
//例外処理が実行
//PDO::__construct(): Argument #1 ($dsn) must be a valid data source name
//終了処理
```
上の```new PDO('','','');```をコメントアウトすると
```
例外処理が実行
Call to a member function method() on bool
終了処理
```
と出力されます。エラーが出る場所によって表示が変わってきます。

***throwException(); をtryの外に書くとエラーが発生***します。

```php
<?php

function throwException(){
    $bool = false;
    $bool->method();
}
throwException(); //ここに記述だとエラー

try{
    // new PDO('','','');
    $bool = false;//bool格納
    $bool->method();//メソッドを呼ぶ処理 //ここでエラー発生

    echo '通常処理が実行<br>';

//例外が起こりうる処理
} catch(PDOException $e){
    //例外が起きた時の処理
    echo 'PDOException<br>';
    echo '例外処理が実行<br>';
    echo $e->getMessage() .'<br>';

} catch(Error $e){
    //例外が起きた時の処理
    echo '例外処理が実行<br>';
    echo $e->getMessage() .'<br>';

} finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}
echo 'finallyは終了しました';
```
***throwException();をtryの中に書くと***例外処理は実行されます。
```php
<?php

function throwException(){
    $bool = false;
    $bool->method();
}

try{
    // new PDO('','','');
    $bool = false;//bool格納
    $bool->method();//メソッドを呼ぶ処理 //ここでエラー発生
    throwException();

    echo '通常処理が実行<br>';

//例外が起こりうる処理
} catch(PDOException $e){
    //例外が起きた時の処理
    echo 'PDOException<br>';
    echo '例外処理が実行<br>';
    echo $e->getMessage() .'<br>';

} catch(Error $e){
    //例外が起きた時の処理
    echo '例外処理が実行<br>';
    echo $e->getMessage() .'<br>';

} finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}
echo 'finallyは終了しました';

//例外処理が実行
//Call to a member function method() on bool
//終了処理
//finallyは終了しました
```


# 資料

https://snome.jp/programming/php-intro-12/

https://www.udemy.com/course/backend-tutorial/
Laravelで認証機能を作ろうと思ったけど失敗した話

# Laravelには認証機能を自動生成する機能がある

Laravelでは`php artisan make:auth`コマンドを使用して
自動で認証機能を作成する機能があります。
このコマンドを実行すると、Laravelが認証に必要なコントローラー、モデル、ビュー、およびルーティングを自動的に生成します。

## php artisan make:authが失敗した原因について



```.実行したコマンド

$ php artisan make:auth 　

エラーメッセージ
$ Command "make:auth" is not defined. Did you mean one of these?  
```
![スクリーンショット 2023-05-23 10.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/8c8fbedf-344d-af9e-bc9d-0a8474672570.png)



### 結論
php artisan make:auth`はLaravel 5.7以降では使えないコマンドでした
### 理由
make:authコマンドはLaravel 5.6までのバージョンで提供されていました。
Laravel 5.7以降では、make:authコマンドはデフォルトで提供されなくなりました。

正確にはバージョン6以降からmake:authコマンドによる自動で認証機能を作成する機能が無くなっているため認証機能を自動で作成したい場合は、他の手段を選択する必要があります


## バージョン6以降で認証機能を付与したい

Laravelバージョン6以降で認証機能を作成するためにはLaravel公式推奨のコマンドで引き続き自動作成できます。

- 方法①：laravel/uiで認証機能などのテンプレートを作成する
- 方法②：jetstreamで認証機能のテンプレートを作成する

### laravel/uiについて
Laravelで利用できるUI（ユーザーインターフェース）のテンプレートを提供するコマンドです。
laravel/ui関連のコマンドを実行すると自動で認証機能などに必要なファイルを作ったり
既存のweb.phpファイルにルートを追記してくれます

#### バージョンがLaravel 8以前の場合
laravel/uiパッケージはデフォルトで含まれていないので、composerを使ってインターネットから
laravel/uiを追加インストールしなければ以降のコマンドを実行できません


```.コマンド
インターネット経由で"laravel/ui"をインストールする

$ composer require laravel/ui
```
### laravel/uiで認証機能を作成するコマンド
```
laravel/uiで認証機能の雛形を作る
（例：ログイン、登録、パスワードリセットのビューとルートを作成）

$ php artisan ui vue --auth
```

```

$ php artisan ui bootstrap --auth
$ npm install
$ npm run dev

コマンド実行完了後はブラウザを実際に見る
```

### jetstreamについて

Laravelフレームワークの公式パッケージで、一般的な認証機能やユーザー管理に加えて、チーム管理、2要素認証、API認証など、さまざまな機能を提供します。設定が難しいとされているため、セキュリティの強度を求めない場合はlaravel/uiで実装することになると思いますので割愛します
Power Appsで、データテーブルの〇番目から×個のデータを取得したい

# 結論
LastN関数とFirstN関数[^1]を組み合わせて使用することで取得可能です。

[^1]:LastN関数とFirstN関数は共にデータソースに委任できない関数です。ご注意ください。

# 解説
例えば、あるテーブルデータがあり、そのうちi番目からM個取得したい場合、以下のような実装をすることで取得ができます。
```vb
FirstN(LastN([データテーブル], CountRows([データテーブル]) - i + 1), M)
```

# 例
以下のようなテーブルが「IceCream」という名前で格納されている場合で考えます。
|Flavor|Quantity|
|-|-|
|"Chocolate"|100|
|"Vanilla"|200|
|"Strawberry"|300|
|"Mint Chocolate"|60|
|"Pistachio"|200|

2番目から3個、データを取得したい場合、以下のように記述します。
```vb
FirstN(LastN(IceCream, CountRows(IceCream) - 1), 3)
```

これをギャラリーのItemsに記述すると、確かに2番目から3個取得できていることが分かります。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/442c74e5-81fe-f468-5d0d-1f6e7ed246cc.png)

以上です。
ご不明点などがあれば教えていただけると幸いです。

# 参考
以下の記事を参考にしました。

https://anko7793.com/2022/04/1050/

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-first-last
WebGLテンプレートのBACKGROUND_COLORを変更する方法

# はじめに
UnityWebGLの内部プリプロセッサ変数の中にWebGLアプリをロードする際の背景色を設定する `BACKGROUND_COLOR` の設定方法が分からなかったので調べてみました。

# 設定方法
* `ProjectSettings > Player > SplashImage` から `ShowSplashScreen` のチェックボックスをONにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/41d99682-ae66-2859-8abe-c8dbc026f3a2.png)
* BackGraund > BackGraundColor を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/96b8c1dc-f50b-8146-e5be-a4a1d2b9d765.png)


# 最後に
普段スプラッシュスクリーンを使っていない場合は見つけるのが難しい位置にありますね。。。
Falcorを技術選定する基準


こんにちは！
今日はNetflixが開発したJavaScriptライブラリ、Falcorを技術選定する際の基準について話します。
新しいプロジェクトを始める際、もしくは既存のプロジェクトをリファクタリングする際に役立てば幸いです。

https://netflix.github.io/falcor/

## 1. データのモデリング

Falcorは**グラフ指向**のデータモデリングを採用しています。つまり、データはグラフとしてモデリングされ、このグラフはパスを使ってアクセスします。
関連データの読み取りと書き込みが一元化されるため、プロジェクトが大規模なデータセットを扱う場合、Falcorは非常に効率的な選択となるでしょう。

## 2. ネットワーク効率

Falcorは**単一のリクエスト**で必要なすべてのデータを取得するために設計されています。これにより、サーバーとクライアント間の通信が最小限になり、ネットワークの効率が向上します。これは大規模なWebアプリケーションや低帯域幅の環境で特に重要です。

## 3. 開発者エクスペリエンス

Falcorは**JavaScript**で書かれており、そのAPIはJavaScriptの開発者にとって自然に感じられる設計になっています。もしJavaScriptが得意であれば、Falcorの学習コストは相対的に低くなるでしょう。

## 4. コミュニティとサポート

NetflixがFalcorの背後に立っており、アクティブに開発と保守が行われています。そのため、ライブラリに問題が発生した場合でも、サポートを受けられる可能性が高いです。また、広いコミュニティが存在するため、質問や問題に対する解決策を見つけやすいです。

しかし、それらの基準はあくまで一部です。最終的な選定は、あなたのプロジェクトの具体的なニーズや要件、そしてチームのスキルセットに大きく依存します。

最後に、Falcorだけでなく他の技術（例えばGraphQLやRESTなど）と比較検討することも大切です。それぞれには長所と短所がありますので、それらを考慮に入れることで最適な技術を選定することができます。

たとえば、GraphQLは柔軟性と強力な型システムを提供しますが、より複雑なスキーマとクエリを必要とします。一方、RESTはシンプルさと広範なサポートが魅力ですが、多くのエンドポイントを管理する必要があります。

|    -        | Falcor | GraphQL | REST |
|------------|--------|---------|------|
| 柔軟性     | 高い   | 最高    | 低い |
| タイプ安全 | 低い   | 最高    | 低い |
| 管理性     | 高い   | 低い    | 中程度 |
| 学習コスト   | 中程度 | 高い    | 低い |


選定の際は、プロジェクトの要件をよく理解し、適切な技術を選択すると良いと思います。
[Jenkins]プラグインのダウンロードでエラーが発生した時の対処法

## はじめに
Windows版のJenkinsを使用するためにインストール後の初期設定が終わった後に推奨ライブラリの読み込みをスキップしてしまっていることに気が付きました。
ダッシュボード＞Jenkinsの管理＞プラグインマネージャーから推奨されるプラグインをダウンロードしようとしましたが
複数のプラグインがダウンロードできずエラー発生するという事態に遭遇いたしました、そちらの対処方法についてまとめます。


## 発生したエラー
![Jenkins1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699599/566fe8d8-9ab3-d08d-8720-2ba70a77e335.png)

ダウンロードがほとんど失敗してしまっています。
詳細をみると
![Jenkins![Jenkins1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699599/f7b19a1e-f89a-a295-49b4-608bfa4205ad.png)
2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699599/4b7021d6-5f36-1d91-b743-f225e9f5afb7.png)

```
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
```
とありますのでSSL関連で問題がありそうです。

## 解決策
Jenkinsをインストールした場所にあるjenkins.xmlを開きます。
![Untitsdfeled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699599/ae6b337c-0b9b-311d-0685-94e1de51795d.png)

こちらのjenkins.xmlファイルにある黄色の箇所を以下のように書き換えていきます。
![Untaaaaaaaaaaaaitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699599/1681e973-34a8-a73c-f0be-8286c770bc6f.png)


```
-Dhttp.proxyHost=proxy_server -Dhttp.proxyPort=proxy_port -Dhttps.protocols=TLSv1.1,TLSv1.2
```

その後、Jenkinsをrestartで再起動し、再度プラグインのインストールを行います。




## 結果
問題なくダウンロードできることを確認できました。
![aaaaUntitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699599/253d23ba-6c35-92f3-ac60-ed3a7833be37.png)
フリーなワイルドカードDNSサービス(nip.ipやsslip.io)

以前は xip.io あたりが有名だったが、今は閉鎖されている。ざっと探してみたところ、以下のサービスあたりが利用可能。

- nip.io
- sslip.io

IPアドレスではなくFQDNでアクセスしたい場合（例えば、バーチャルホストを必要とするシステムを開発していたり、テストしたりしていたり、その度にDNSを構成したりしなくて良いので便利。

```txt:10.0.0.1を返すFQDN
[root@new-syasuda-tok1-vpc1 ~]# dig +short 10-0-0-1.nip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short hoge-10-0-0-1.nip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short moge-hoge-10-0-0-1.nip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short 10.0.0.1.nip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short hoge.10.0.0.1.nip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short moge.hoge.10.0.0.1.nip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short www.10.0.0.1.nip.io
10.0.0.1
```
```
[root@new-syasuda-tok1-vpc1 ~]# dig +short 10-0-0-1.sslip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short hoge-10-0-0-1.sslip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short moge-hoge-10-0-0-1.sslip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short 10.0.0.1.sslip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short hoge.10.0.0.1.sslip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short moge.hoge.10.0.0.1.sslip.io
10.0.0.1
[root@new-syasuda-tok1-vpc1 ~]# dig +short www.10.0.0.1.sslip.io
10.0.0.1
```
10日目にAWS認定クラウドプラクティショナーに合格した話

# はじめに
https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

AWS認定クラウドプラクティショナーに合格したので体験談をメモしておきます。
今後、受験する方の助けになれば嬉しいです。

ご縁がありCloudTechに入会し勉強10日目で合格できたのでこのタイトルにしました。
## 目次
- [私のスペック](#私のスペック)
- [勉強時間](#勉強時間)
- [勉強方法](#勉強方法)
- [10日間の過ごし方](#10日間の過ごし方)
- [受験の感想](#受験の感想)
- [おまけ](#おまけ)
## 私のスペック
- 無資格（この度人生初の資格取得できたので嬉しいです）
- AWSは指示を出してくれればぽちぽち画面押せる
- 有名なサービスの名前くらいは知ってる
## 勉強時間
タイトルにもある通り10日間、約20時間勉強し合格できました。
## 勉強方法
結論から言うと、CloudTechの
【Amazon Web Servicesの基礎知識】【ネットワークとコンテンツ配信の動画】を全て視聴し、CloudTechの模擬問題集、Udemyの模擬問題集基本レベル①、②を正答率9割にしました。
## 10日間の過ごし方
1日目 
- CloudTechのAmazon Web Servicesの基礎知識の【Well-Architected Framework 6つの柱】まで視聴

動画が大変わかりやすくてどんどん理解できる！これならCLF合格いけそう？って薄々思い始める。（思うの早い）

https://kws-cloud-tech.com/lessons/amazon-web-services%e3%81%ae%e5%9f%ba%e7%a4%8e%e7%9f%a5%e8%ad%98

2日目
- Web Servicesの基礎知識の残り3動画の視聴、最後の確認テスト（12問あり10問正解）
- ネットワークとコンテンツ配信の【VPC講座2】まで動画視聴。

折角なら10日目に取りたいなって気持ちになる。

https://kws-cloud-tech.com/lessons/%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e3%81%a8%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e9%85%8d%e4%bf%a1

3日目
- ネットワークとコンテンツ配信の【VPC講座3~12】まで視聴
- CloudTechのCLF問題集1-50問まで解く
問題解けそうな気がしてきたが50問中28問正解だった。微妙すぎる。

https://kws-cloud-tech.com/courses/speciality

4日目
- 気合いでネットワークとコンテンツ配信残りの動画全部視聴
確認テストは量が多そうだったのでやりませんでした。
- CloudTechのCLF問題集1-100問解く
50問目までは3日目解いた内容と一緒だったので結果は100問中74問正解

問題集解くのが楽しくなってきた。

5日目
- CloudTechのCLF問題集101-200問解く
100問中76問正解
- CloudTechのCLF問題集201-300問解く
100問中71問正解

一回一回チェック押すごとに解答と解説がでてくるので、でてきた選択肢で正解でも不正解でもわからない単語があればNotionにひたすらサービス名とサービスの詳細を書きました。物理的に文字を書くのが遅い上に字が汚いのでNotionを使用しました。

6日目
- CloudTechのCLF模擬試験解く
65問中60問正解
- UdemyのCLF模擬試験（基本レベル①）解く
65問中48問正解
- UdemyのCLF模擬試験（基本レベル②）解く
65問中44問正解

Udemyの問題集は言い回しが難しくて結果が少し残念でした。

https://www.udemy.com/course/aws-4260/

7日目
- UdemyのCLF模擬試験（本番レベル①）解く
65問中41問正解
- UdemyのCLF模擬試験（本番レベル②）解く
65問中27問正解

いや難すぎ〜〜〜！！！
でも、ここまできたら10日目に取った方がキリいいし、気合い入るので私は決めました。
「本番レベルは捨てよう」難しいし、10日目に取りたいから本番レベルはやらず基本レベルの正答率を上げよう！！と。

後日談ですが、本番試験で言い回しが難しい問題もあったため、日数や時間に余裕のある方は本番レベルまで仕上げた方が安心できると思います。

8日目
- CloudTechのCLF模擬試験解く×2（模擬試験問題集は問題が少し変わります）
1回目 65問中61問正解
2回目 65問中58問正解
- UdemyのCLF模擬試験（基本レベル①）解く
65問中57問正解
- UdemyのCLF模擬試験（基本レベル②）解く
65問中51問正解

試験いけそうな気がしてくる。

9日目
- CloudTechのCLF模擬試験解く×2
1,2回どちらも 65問中60問正解
- UdemyのCLF模擬試験（基本レベル①）解く×2
1回目 65問中62問正解
2回目 65問中65問正解
- UdemyのCLF模擬試験（基本レベル②）解く×2
1回目 65問中58問正解
2回目 65問中63問正解

どれも2回ずつ受けていますが、朝と夜で時間の感覚を空けています。
この日、翌日に試験を受ける予約をしました。（ギリギリまでビビってました。）

10日目（試験当日）
- CloudTechのCLF模擬試験解く
65問中61問正解
- UdemyのCLF模擬試験（基本レベル①）解く
65問中64問正解
- UdemyのCLF模擬試験（基本レベル②）解く
65問中63問正解

当日は1回ずつ問題集を解き試験に臨みました。
## 受験の感想
結果合格できました！！
受験しながら感じたことは、試験独特の問題文の言い回しなどがあり問題文を理解するのに時間がかかりました。
問題集解いている時も意識していたことですが、出てきた選択肢で**わからない選択肢がない**という状態を極力なくすことが大事だと思います。選択肢を見て消去法で考えるとよくわからない問題文でも答えが自然とでてくると思います。（クラウドプラクティショナーでしか通用しない考え方だと思いますが）
![IMG_1211.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364431/433a8794-b8ed-0f9c-d1f0-4558075cd90a.jpeg)

## おまけ
- 参考書は買っていましたがほとんど読んでいません。深く知りたい単語があった場合に単語を調べる辞書感覚で使用していました。
- 「AWS Well-Architected と 6 つの柱」は試験に凄くよく出てきました。
- 個人的に勉強していて厄介だったのはS3の種類でした。
（下のリンクの記事がとてもわかりやすかったです）
- 覚える時は、問題文、答え、解説を**音読**しながらNoteをとると頭に入ってきました。

https://qiita.com/lune0415/items/91dbb8361a1d45355d73
自分のサーバーに紐づいているGlobal IP関連情報を確認する方法

ifconfig.meを利用する。

```txt:Global IPを取得
$ curl ifconfig.me

or 

$ curl ifconfig.me/ip
```
```txt:User Agentを取得
$ curl ifconfig.me/ua
```
```txt:Languageを取得
$ curl ifconfig.me/lang
```
```txt:Encodingを取得
$ curl ifconfig.me/encoding
```
```txt:MIME Typeを取得
$ curl ifconfig.me/mime
```
```txt:charsetを取得
$ curl ifconfig.me/charset
```
```txt:X-Forwarded-Forを取得
$ curl ifconfig.me/forwarded
```
```txt:全てを取得
$ curl ifconfig.me/all
```
```txt:全てをjsonでr取得
$ curl ifconfig.me/all.json
```
【学習】Ruby on Rails チュートリアル 第7版 - 第8章 基本的なログイン機構

5/23 8:35開始

・ログイン

cookies：
ユーザーのブラウザに保存される小さなテキストデータ。あるページから別のページに移動した時にも破棄されないので、ここにユーザーIDなどの情報を保存できる。

session(Railsのメソッド)を使って一時セッションを作成することができる。
Sessionリソースではcookiesを保存場所として使う。

セッション機能を作成する準備として...
Sessionコントローラ、ログイン用のフォーム、両者に関連するコントローラのアクションを作成する。

8.1.1まで終了

5/23 9:10終了


5/24 8:40 開始

8.1.3まで終了

5/24 9:10



5/25 8:30 開始

・フラッシュメッセージが消えない問題


    class SessionsController < ApplicationController
        .
        .
        .
      def create
        .
        .
        .
        else
            #ログイン失敗時の処理
          flash[:danger] = 'Invalid email/password combination' # フラッシュメッセージが消えない
          render 'new', status: :unprocessable_entity
        end
      end
        .
        .
        .
    end


別のページに行ってもフラッシュが残り続ける。
→
flashをflash.nowに置き換えることで、
レンダリングが終わっているページで特別にフラッシュメッセージを表示することができる。


・単純なログイン

↓ユーザーのブラウザ内の一時cookiesに暗号化済みのユーザーIDが自動で作成される。
(Railsで事前定義済みのsessionメソッド)

    session[:user_id] = user.id


5/25 9:10 終了


5/26 8:30 開始

・「||=」

「||=」(or equals)は、Rubyで広く使われているイディオム。
||式を左から右に評価し、演算子の左の値が最初にtrueになった時点で処理を終了する。

      >> @foo
      => nil
      >> ！！@foo
      => false 
      >> !!@foo = @foo
      => false
      >> @foo = @foo || "bar"
      => "bar"
      >> ！！@foo
      => true
      >> !!@foo = @foo
      => true
      >> @foo = @foo || "baz"
      => "bar"


↓のように●という演算子があるときは、「x = x ● y」と「x ●= y」の動作は同じ。

     x    =   x   +   1      ->     x     +=   1

||= も同様に...

    @foo = @foo || "bar" -> @foo ||= "bar"


8.2.2まで終了

5/26 9:00終了


5/29 8:30 開始

・RailsプロジェクトにJavaScriptを導入
ImportmapとTurboとStimulusをインストールする

Gemfileにそれぞれを記述。 xxはバージョン

    gem "importmap-rails", "xx.xx.xx"
    gem "turbo-rails",     "xx.xx.xx"
    gem "stimulus-rails",  "xx.xx.xx"

Importmap自身をインストールしてからTurboとStimulusをインストール

    $ rails importmap:install turbo:install stimulus:install



8.2.4まで終了

5/29 9:00終了


5/30 8:30 開始

・モバイル向けスタイリング
*metaタグ ビューポート（viewport）
開発者がPCモードとモバイルモードを切り替えられるようになる。

*トグル：ある同じ操作を繰り返すことで、機能や状態のON/OFFを切り替える仕組みのこと


5/31 7:40 開始

・safe navigation演算子（または“ぼっち演算子”）

　　obj && obj.methodのようなパターンを、
　　obj&.methodのように凝縮した形で書ける。

8.2まで終了

5/31 8:30 終了

6/1 8:30 開始

・ログアウト

*status: :see_other
 HTTPステータス
 RailsでTurboを使うときは、このように303 See Otherステータスを指定することで、
 DELETEリクエスト後のリダイレクトが正しく振る舞うようにする必要がある。

第8章 終了!

6/1 8:50 終了
Javaで和暦から西暦へ変換する時は、Locale.JAPANを指定しよう

# はじめに
Javaで和暦を西暦に変換する方法を調べると、下記のようにDateTimeFormatter#ofPatternで、"GGGGy年"とすることで、和暦を解釈出来るコードが出てくる。

## コード
```Java
public static LocalDate convertWarekiToSeireki(String strDate) {
    // DateTimeFormatterオブジェクトを生成し、和暦のパターンを設定する
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("GGGGy年M月d日")
            .withChronology(JapaneseChronology.INSTANCE)
            .withResolverStyle(ResolverStyle.SMART);

    // 和暦の文字列をLocalDateに変換する
    JapaneseDate wareki = JapaneseDate.from(formatter.parse(strDate));

    // JapaneseDateからLocalDateに変換する
    return LocalDate.from(wareki);
}
```

とある案件で利用したが、ローカル環境では動いていたが、STG環境(クラウド環境)だとExceptionが発生した。

```
java.time.format.DateTimeParseException: Text '' could not be parsed at index 0
```

# 原因
https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeFormatter.html#ofPattern-java.lang.String-

フォーマッタはデフォルトのFORMATロケールを使用します。これを変更するには、返されたフォーマッタに対してwithLocale(Locale)を使用するか、このメソッドのバリアントであるofPattern(String, Locale)を使用します。

とあるように、Localeが正しくセットされていない事が原因。

# 解決方法
第２引数でLocale.Japanを指定するようにした。(withLocaleでも良いハズ)

```Java
public static LocalDate convertWarekiToSeireki(String strDate) {
    // DateTimeFormatterオブジェクトを生成し、和暦のパターンを設定する
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("GGGGy年M月d日", Locale.JAPAN)
            .withChronology(JapaneseChronology.INSTANCE)
            .withResolverStyle(ResolverStyle.SMART);

    // 和暦の文字列をLocalDateに変換する
    JapaneseDate wareki = JapaneseDate.from(formatter.parse(strDate));

    // JapaneseDateからLocalDateに変換する
    return LocalDate.from(wareki);
}
```
【レビューで指摘されがちシリーズ】ありがちな処理は既存のメソッドがないか調べましょう

レビューで指摘された内容をそのまま放流するシリーズ。[まとめページ](https://qiita.com/lx-sasabo/items/c2d2e5ccae10ff3ecabd) もあります。

私が現在行っているプロジェクトでは一部 PHP を扱います。私は PHP を触る機会はほとんどありません。大体 C# 部分のコードを触っています。そんな私が Laravel で artisan コマンドを作っていたときの話です。

astisan コマンドで JSON ファイルの内容を一部ゴニョゴニョっと処理をして、 CSV フォーマットにしたものを標準出力に吐き出そうとしていました。標準出力で吐き出したものはユーザーが CSV ファイルにリダイレクトして、それをエクセルや Google スプレッドシートなどに読み込みさせることを想定しています。

ここでエクセルなどに読み込ませたときに、1つのセル内で改行して複数表示したい項目がありました。エクセルのイメージはこんな感じです。

![無題のスプレッドシート - Google スプレッドシート - Google Chrome 2023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/d3c72592-1059-80ca-87ad-071e74ac3eeb.png)

これを実現するためには、出力結果を `""` でエスケープする必要があります。（[参考：【JavaScript】CSV 書き出しの際に必要なエスケープ処理と二次元配列→文字列変換の方法](https://qiita.com/ndj/items/c248c5859158f3a85468#%E3%81%AA%E3%81%9C%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E5%87%A6%E7%90%86%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B))

そこで私は `""` で囲めばええんやな。OK！ってことでこんな感じのコードを書きました。
csv の要素が格納されている配列の全ての要素を `""` で囲んでいます。

```php
$csv_data[] = array_map(fn ($value) => '"'.$value.'"', $target);
```

それに対して次のようなコメントをもらいました。

> fputcsv と言う関数を使うとCSVのエスケープをしてくれるようです。

https://www.php.net/manual/ja/function.fputcsv.php

いわゆる、「車輪の再発明」状態になっていました。今思えば何が「 `""` で囲めばええんやな。OK！」なんだよ…昔の俺…という気分になります。

よくありそうな処理は一度自分で使えるメソッドがないか調べないといけないなと思いました。（普段から思っているつもりだったんですが、いざというとき出来ていませんでした。）得に経験が少ない言語は調べる必要がありそうです。

最近だと ChatGPT に聞くという手段がとれるので、経験が少ない言語でも調べるしきいが下がっています。

こういった指摘をもらわないように、自分で調べるというのを癖付けたいです。
axiosとrailsのCORS

# axiosのインストール
APIを呼び出し、データを取得するにはaxiosというライブラリを使用します。
次のコマンドでaxiosをインストールできます。今回はnpmを使用しています。

```
npm install --save axios
```

```frontend/src/components/MembersList.vue
<script setup>
// import { defineProps, defineEmits } from 'vue'
// import { ref } from 'vue'
import axios from 'axios';  // axiosをインポートする

let members = []

const fetchMembers = () => {
  axios.get('http://localhost:3000/members')
  .then(response => {
    events = response.data; 
  }).catch(error => {
    console.log(error);
  })
}

</script>
<template>
 <div>
    <p>{{ members }}</p>
    <button type="submit" @click="fetchMembers()">メンバーを取得</button>
  </div>
</template>
```

ここで、Railsサーバを起動した状態でVueサーバを起動し、local:8080を開くとコンソールにエラーが出て、GETリクエストに失敗してしまいます。

この原因はCORSです。

CORSとは Cross-Origin Resource Sharingの略で、異なるオリジン（スキーム・ホスト・ポート）間でリソース(データ)を共有したい時に、自身とは異なるオリジンにリソースへのアクセスを許可するための仕組みです。

オリジンが少し馴染みないかもしれませんが、
スキーム・ポスト・ポートで構成されたものをさします。
`http://www.example.com`
例えば上のURIの場合、以下のように分解できます。

スキーム：　`http`
ホスト: `www.example.com`
ポート： `3000`(Railsの場合)

これらが異なる場合は脆弱性が生まれてしまい、情報漏洩などのセキュリティリスクが生まれてしまいます。
今回は、Railsの3000番とVueの8080でリソースを共有しようとしているため、エラーが出てしまいます。

CORSの設定を行わないと、Railsは他のオリジンからのアクセスを拒否するため、API通信ができません。
したがって、Rails側でhttp://localhost:8080からのリクエストを許可する設定を行う必要があります。

## CORSの設定
Gemfileの# gem 'rack-cors'がコメントアウトされているので、その行のコメントを外してください。
```
# gem 'rack-cors'
  gem 'rack-cors'
```

bundle installを実行してrack-corsをインストールします。

次に以下のファイルを編集していきます。こちらもコメントアウトされているので、それを外して、`origins`の設定にVueのポート8080を受け付ける旨を記述します。

```backend/config/initializers/cors.rb
  Rails.application.config.middleware.insert_before 0, Rack::Cors do
    allow do
      origins 'http://localhost:8080'

      resource '*',
        headers: :any,
        methods: [:get, :post, :put, :patch, :delete, :options, :head]
    end
  end
```

:::note
これに加えてexposeもあります。
expose: ['access-token', 'expiry', 'token-type', 'uid', 'client'],

exposeでは、ブラウザからアクセスできるヘッダー情報の指定を行っています。
最後に、methodsはどのHTTPリクエストメソッドを許可するか、という設定になります。
APIで認証機能を作成する場合などは、これらを利用するので設定が必要ですね。
:::


CORSについては以下の動画が大変参考になります。最初の５分程度だけで概要を理解できます。
Access-Control-Allow　ヘッダーを使用しているんですねー。

https://www.youtube.com/watch?v=yBcnonX8Eak

axiosについては以下を参考にしました。

https://www.willstyle.co.jp/blog/2751/
子オブジェクトの重複を検証する


子オブジェクトなので入力規則ではできない。

+ [Validation Rule Possibility? Double-booking](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QL3A0)

:::note
I woudl create a record triggered flow that would update a text field with the start date and end date (in text format) and the Parent recordId (so the field would look soomething like 2023-4-12/023-4-15/ParentId).

You can then use a matching rule and duplicate rule to find duplicates with an exact match on the text field
:::
PostProcessingStackV2の導入方法と簡単な使い方のまとめ

# はじめに
Unityの公式アセットであるPostProcessingStackV2（ポスプロ）の導入方法とエディタ上での設定をまとめてみました。
そもそもポスプロとは、カメラにエフェクトを付けることを簡単にしたアセットです。初期から様々なエフェクトが提供されているので初めてでもかなり扱いやすいです。実際にポスプロを使用することで下のような表現をすることができます。
![5b0911b7c616544dbc86628a93f47ad7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/a0208dad-dd91-6ffe-a9ce-d638500830c7.png)
また、UniversalRenderPipeline（URP）というレンダーパイプラインを使用している場合は標準搭載されているVolumeというコンポーネントがあるのでそっちの使用をお勧めします。Volumeコンポーネントについては別の記事にてまとめる予定です。


# 目次
実行環境
インストール
エディタ上の設定方法
簡単な使い方

# 実行環境
Unity 2021.3.7f1（おそらく古いバージョンのUnityを使わない限り問題かと...）

# インストール
まずポスプロをUnityのパッケージからインストールします。
Windowタブ > Package Managerを選択します。
![e7380b365b8ba388134b1be5e456fee3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/17afcf79-6d4b-8399-2f59-4648f9164fcc.png)
次にPackages: Unity Registryを選択します。
そして一覧の中から「Post Processing」をインストールします。
![73ac4b865f9a23c67bfbf5fa2076ccd5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/667564a4-223a-7a75-6b7c-fcaa2995e7bb.png)
これでポスプロのインストールは完了です。


# エディタ上の設定方法
ポスプロを使用するには主に下二つのコンポーネントを使用します。
それぞれ順番に設定していきます。

## Post-process Layer

はじめにこのコンポーネントをメインで使用しているカメラにアタッチします。
次にLayerの部分をカメラと同じLayerに設定します。
下の例はメインカメラをDefaultに設定しているためLayerをDefaultにしています。
![7c330170c7aea2295c8f5a630893b96d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/bfeb0476-b77c-9dcb-d782-16820c3703bc.png)


## Post-process Volume
新しい空のGameObjectを作成し、Post-process Volumeをアタッチします。
下記の通りIs Globalにチェックを入れ、ProfileのNewから新しいエフェクトのプロファイルを生成します。
![f8522a6bf42f531ded5ca759b05d6168.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/f5af3e6c-2e9b-7af5-3a42-3baea5577716.png)

# 簡単な使い方
最後にポスプロのエフェクトの追加方法です
Post-process Volumeの一番下にあるAdd effect...を押すことで追加するエフェクトを選ぶことができます。
![9f1ae6db80d67e44cd1217c16e94928b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/34efecda-365d-5b62-0f68-08233910eb68.png)
エフェクトは初期から搭載されているものと自作したエフェクトを選択することができます。
初期から搭載されているエフェクトは以下の通りです。
|エフェクト|主な機能|
|:---|:---|
|Ambient Occlusion|オブジェクトの角に影を落とす|
|Auto Exposure|暗順応、明順応を表現|
|Bloom|光を強調する|
|Chromatic Aberration|色収差を表現|
|Color Grading|色調補正を行う|
|Depth Of Field|ピントを表現|
|Gain|画面にノイズを発生させる|
|Lens Distorion|レンズの歪みを発生させる|
|Motion Blur|モーションブラーを発生させる|
|Screen Space Reflections|物体の反射を表現する|
|Vignette|画面の端を暗くする|

# まとめ
今回はPostProceesingStackV2についてインストールから簡単な使い方まで解説しました。エフェクトがあるのとないのとではかなり見栄えや出来に差が生まれるのでぜひ組み込んでみてください！
GPTプラグインを10分で理解する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/20bc27b3-b8c5-7fd1-9aa6-cf0969853a5b.png)

これはLINEのサイト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/7dbdba9a-ffc5-d605-d0bc-78310b249a71.png)
WebPilot使ったよ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/f1b35e25-05cc-c92e-55f3-da9c87a19b68.png)

図解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/27dd330b-dd9e-2a78-a51c-96383ff192d5.png)

O365のCopilotが駆逐しそう。。。
公開問題は実際の試験より難しい？ITパスポートの最新公開問題を模擬試験代わりに解き、合格点を逃したけど1か月後の試験本番で合格する話

ITパスポートの令和５年度最新問題を模擬試験代わりに解きました。ちなみにまだITパスポートは受けてません。

それ以前の段階で令和元年から令和４年度までの過去問の４年分を解いていました。そしてすべて８５％以上とれるようにしていました。準備をきっちりした。そう自信をもって令和５年度の問題を解きました。

結果は５５点でした。。。合格点に届かず。１か月程度準備期間があって５点足りないならいっか？

見たことない用語がたくさん出てきました。公開問題は難しく作ってるのではないでしょうか？そう信じたくなる結果です。実際の問題より難しいわけではないかもしれませんが、最近のトレンドを入れた新作問題が多い気がします。


過去問＋シラバスの確認が必要ですね

<p><a href="https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000i9bs-att/syllabus_ip_ver6_0.pdf">最新シラバス</a></p>


選択肢のすべての意味を説明できる状態にします。そのために頑張ります。用語の確認も早急にします。

udemyの動画講義も追加で勉強します。

https://www.udemy.com/course/zettai-itpass/

タイトル通りの結果になるために頑張ります！
お母さんでもわかるVSCodeの拡張機能を共有する方法

## どのようなものなのか
クローンしたリポジトリをVSCodeで開いたときに「この拡張機能入れてくださいね〜」とアラートを出すことが出来るらしい。

設定をするフォルダは.vscodeディレクトリ（VSCodeの設定をチームで共有するときに使用するもの）のextensions.json。「おすすめしたい拡張機能」「おすすめしたくない拡張機能」を設定することができる。


## 設定方法
まずVSCode上でおすすめしたい拡張機能のページまでいく。
その画面で「command + shift + p」を押し、「add to」と入力すると下記画像にある「推奨事項に拡張機能を追加する」が出てくるのでそちらをクリック。
![スクリーンショット 2023-05-23 7.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/8adf064f-d90c-0454-3aba-50efd681628c.png)
するとextensions.jsonに勝手に追加される。
![スクリーンショット 2023-05-23 7.20.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/630e8e03-ce61-106c-1a0d-ad1ff47e75cc.png)
Brierスコアを理解しよう

こんにちは、機械学習の評価指標について学びたい方々へ。今回は、特に分類問題における評価指標の一つである「Brierスコア」について説明します。

Brierスコアとは？
まず基本から見ていきましょう。Brierスコアとは、予測された確率分布と実際の分布との間の距離を測る指標です。このスコアが低いほど、予測が正確であることを意味します。つまり、あなたの機械学習モデルの予測精度が高いことを示しています。

PythonでBrierスコアを計算する
では、Pythonを用いてBrierスコアを計算する方法を見ていきましょう。以下の関数は、真のラベルと予測された確率分布を引数に取り、それらのBrierスコアを計算します。

```
import tensorflow as tf

def brier_score_loss(y_true, y_pred):
    y_true = tf.cast(y_true, dtype=tf.float32)
    return tf.reduce_mean(tf.math.squared_difference(y_true, y_pred))
```

この関数について説明すると、まず第一引数のy_trueは真のラベルの配列で、実際の分類結果を示します。次に第二引数のy_predは予測された確率分布の配列で、機械学習モデルによって生成された予測結果です。

関数の中で行われる主な処理は次のとおりです。

真のラベルy_trueをtf.float32型にキャストします。これにより、後続の計算で型の不整合が起こらないようにします。
tf.math.squared_difference(y_true, y_pred)を用いて、真のラベルと予測値の間の要素ごとの二乗誤差を計算します。これにより、各要素の誤差が正の値になり、大きな誤差がより重要視されるようになります。
tf.reduce_meanを用いて、二乗誤差の平均を計算します。これがBrierスコアです。
この関数は、TensorFlowライブラリを用いて定義されており、計算の効率性とGPUサポートを利用できます。最終的に得られるBrierスコアは、予測の品質を評価するために使われます。

以上、Brierスコアについての解説でした。機械学習モデルの評価指標は多岐にわたりますが、Brierスコアは分類問題において有用な一つです。この記事が、あなたの機械学習モデルの評価を行う一助になれば幸いです。
MacでのDockerビルド時に buildx/current: permission denied が出たときの解決法

## 事象

M1 Macでdockerのビルドを実行したときに以下のエラーが出ました。

```sh
$ docker-compose build

open /Users/{user_name}/.docker/buildx/current: permission denied
```

## 結論

該当ファイルをオーナー変更してから `docker-compose build` すべし！

```sh
$ sudo chown -R {user_name} ~/.docker/buildx/current
```

## 解決までのメモ

エラーメッセージでググってすぐに出てくる記事がこちら。

https://book-reviews.blog/permission-denied-on-docker-build/

なるほどと思って、以下を実行してから再度トライ。

```sh
$ export DOCKER_BUILDKIT=0
```

```sh
$ docker-compose build

...(中略)
no matching manifest for linux/arm64/v8 in the manifest list entries
```

このエラーで検索すると、 `platform: linux/amd64` を付けよう、って記事が多数ヒットするんですが、今回の環境では既に付けてます。
M1 Macに移行したときにこのエラーには何度もお世話になったので、M1起因の問題かなと思ってそちら方面で調べ始めてハマってしまいました。

最初のエラーでもう一度ググり直したところ、ようやく以下の記事に辿り着きました。("7"って何よ...(スクショ参照))
![ScreenShot 2023-05-23 4.47.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245142/86f77183-4dc2-c4ce-d9bc-52542645f8a3.png)

https://stackoverflow.com/questions/75686903/open-users-user-docker-buildx-current-permission-denied-on-macbook

確かに権限を確認してみると、 `root` になってる！

```sh
$ ll ~/.docker/buildx 
total 8
drwx------  2 {user_name} staff  64  5 17 12:19 activity
-rw-------  1 root        staff  48  5 23 04:29 current
drwx------  2 {user_name} staff  64 11 29 12:18 defaults
drwx------  2 {user_name} staff  64 11 29 12:18 instances
```

記事の通り、ファイルオーナーを変更。

```sh
$ sudo chown -R {user_name} ~/.docker/buildx/current
```

これで無事に `docker-compose build` が成功しました！

## おわりに

すごく遠回りしてしまいましたが、 `permission denied` なんだから、該当ファイルの権限を見に行けばすぐに気づけそうな問題でした...。(脳死でエラー文言で検索しちゃってました)
この問題の記事が全然出てこなかったのも、これでハマる人はあまりいないのかもですが、誰かの役に立てばと思います。
GitHubのStarがいつ付けられたか確認する方法

GitHubのREST-APIを用いて情報を表示します．
以下にPythonでのコード例を示します．

```python
import subprocess as sb
from argparse import ArgumentParser


parser = ArgumentParser()
parser.add_argument("--user", required=True, type=str)
parser.add_argument("--repo", required=True, type=str)
args = parser.parse_args()

user_name = args.user
repo_name = args.repo
cmd = f"curl https://api.github.com/repos/{user_name}/{repo_name}/stargazers -H "
cmd += "'Accept: application/vnd.github.v3.star+json' "
cmd += '| grep "starred_at"'
results = sb.check_output(cmd, shell=True).decode().split('"starred_at": ')

cnt = 0
for r in results:
    timestamp = r.split(',')[0][1:-1][:10]
    if "20" in timestamp:
        cnt += 1
        print(f"Star {cnt:0>4}: {timestamp}")

```
2023/5/23主にITとかセキュリティの記事

KeePassに重大な脆弱性、マスターパスワードが盗まれる恐れ(5/21)
https://news.mynavi.jp/techplus/article/20230521-2683133/

広島市サイトの障害復旧　DDoS攻撃か、県警が捜査(5/21)
https://www.nikkei.com/article/DGXZQOUE210XH0R20C23A5000000/

「Windows Update」は面倒でもやるべき理由(5/20)
https://dime.jp/genre/1590400/

週末のKaikeiZine News：5月末が納付期限の「自動車税」(5/20)
https://kaikeizine.jp/article/39950/

週刊仮想通貨ニュース｜国内取引所の直接送金制限に注目集まる、テザー社がビットコインの継続購入を表明など(5/21)
https://coinpost.jp/?p=461345

【調査レポート】仮想通貨を知らない人でもすぐわかる！仮想通貨のメリットを調査しました！1位は「24時間365日取引ができる」！(5/21)
https://prtimes.jp/main/html/rd/p/000000472.000093294.html

DX推進の礎　データ基盤の作り方(5/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/051700145/

IDaaS・ゼロトラスト・一本化、知っておくべき「ID」取り巻く3つの変化(5/22)
https://xtech.nikkei.com/atcl/nxt/column/18/02457/051700001/

ソニーが挑むソフト設計工程の改善、欠陥リスクを発見する「パターン」とは(5/22)
https://xtech.nikkei.com/atcl/nxt/column/18/02403/032300003/

ChatGPTには「聞く力」がない　代替できないエンジニアの条件(5/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/051200139/

国の標準仕様で3市が相乗り　ガバクラで自治体初の本稼働(5/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/051700131/

GPT-4(5/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/051700142/