OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでの「async」と「await」を用いた非同期処理


## はじめに
Pythonでの「async」と「await」を用いた非同期処理に関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇

## 🦁<INS>**非同期処理とは**</INS>🦁
一つのCPUコアで時間がかかってしまう処理を待ちの待ち時間が発生する操作（例えば、ネットワークI/O）をブロッキングを回避して実行させることができることで効率よく処理を進められる処理のこと


## 非同期処理はどんなときに使うのか？
リクエストからレスポンス待ちで時間がかかる処理（IOバウンド）を行ってる時に他の処理も進めたいときに使う

:::note info
非同期処理の利用シーン
* サーバーへのアクセス処理
* データのIO（読み書き）
:::  


## 非同期処理をしてる例
→サーバーからのアクセス待ちでぐるぐるローディングと書いてあって回ってる画面
→サーバーからのレスポンス待ち
→レスポンスを待ってる間に「ぐるぐる回る」処理を実行
これがまさに非同期処理を実行してる

***  

## 各言葉の定義
### コルーチン
asyncで定義した非同期化された関数。非同期処理を行うための特殊な関数。await式を用いて非同期処理の完了を待つことができる。

### async
特定の関数に定義することで非同期化することができるキーワード。このキーワードが付いた関数はコルーチンを返し、awaitを使用して呼び出される。

### イベントループ
awaitにて定義されたコルーチン（非同期処理）をタスク管理をして、処理が円滑になるように処理のスケジュールを立ててくれる。
awaitのある関数（コルーチン）がレスポンス待ちになってるのを確認して一時停止させて他の処理を進める。
awaitのある関数（コルーチン）のレスポンスが来たので今やってる処理が終わったら完了をかける。
などを実行して全体の効率を向上させてくれる。


### asyncio.run() 
引数に定義されたコルーチンからイベントループを作成して実行する。
よくエントリーポイントして使われる。

***  

## 非同期処理での並列処理
※実行は1つのCPUコアにて実施される

### ①asyncio.create_task()
個々のタスクで処理するイメージ。
<INS>**asyncio.create_task()は単一の非同期タスクをスケジュールするのに適している。一つ一つのタスクの管理に焦点を当てた並列処理。**</INS>

:::note info
asyncio.create_task()利用シーン
* ユーザーからの入力を待ちながらバックグラウンドで定期的にデータを更新
* ウェブサイトのスクレイピングタスクを非同期に実行する
:::  

***  

### ②asyncio.gather()
一括で処理するイメージ。
<INS>**asyncio.gather()は複数の非同期タスクを並行して実行し、すべてのタスクが完了するのを待つのに適しています。これにより、複数の非同期操作の結果を効率的に同時に処理することが可能。**</INS>

:::note info
asyncio.gather() 利用シーン
* 複数のデータを集約して比較検討などをする時に良い。
:::  

***  

## 同期処理を非同期処理へ変換する
### asyncio.get_running_loop()
現在実行中のイベントループを取得する。


### loop.run_in_executor()
同期的な関数を非同期に実行できます。第一引数にはexecutorを指定する。Noneを指定した場合はデフォルトのスレッドプールエグゼキュータが使用される。
第二引数には実行したい関数を指定し、その後の引数にはその関数に渡す引数を指定する。

:::note alert
注意点
* async関数内でブロッキング操作（例：time.sleep()）を行うと、イベントループがブロックされ、他の非同期処理の実行が妨げられてしまう。
* エラーハンドリングが複雑になりがち。
* デバッグも複雑になりがち。
:::  

***


## まとめ😺
非同期処理はすごく便利で、Pythonには必須だなと感じました。ただ理解するには苦労しました（多分まだ30%も理解してないと思いますが…）。ただ利用シーンがわかると少しずつ理解を深めることができました。
どなたかの助けになればいいのですが笑

***

## 参考にしたサイト📗
[Pythonの 非同期処理ライブラリ asyncio の使い方](https://note.com/npaka/n/n5cc248cc9f62)
[Pythonにasyncioってあるけどよく知らなかったので調べた](https://zenn.dev/knowhere_imai/articles/ba850780152b01)
JetpackComposeでライセンス画面を実装する

# はじめに
今回はAndroidでは必須なライセンス画面をJetpackComposeで実装していこうと思います。
Google公式のAPIだと手動で追加するのが面倒だったり、coockpadさんのライブラリだとアーカイブされてしまっているので少し面倒に感じるかもしれませんが、実はとても便利なライブラリがあるのでそれを紹介しつつ実装していきます
### 本文
まず、今回利用させていただくライブラリは`aboutLibraries`です
実装の方法としてはとても簡単で、まずプロジェクトの`build.gradle`に下記のように記述します
```gradle:rootBuild.Gradle
plugins {
id("com.mikepenz.aboutlibraries.plugin")
}
implementation "com.mikepenz:aboutlibraries-core:${latestAboutLibsRelease}"
```
次に表示させたいUIが置かれているModuleの`build.gradle`に下記のように記述します
二種類記載していますがMaterial3を使うかどうかで分けてください
```gradle:UIModuleBuild.Gradle
implementation "com.mikepenz:aboutlibraries-compose:${latestAboutLibsRelease}"

// Alternative Material3 based module
implementation "com.mikepenz:aboutlibraries-compose-m3:${latestAboutLibsRelease}"
```
あとはCompose関数内で下記のように実装するだけです
```kotlin:ComposeView
LibrariesContainer(
    Modifier.fillMaxSize()
)
```
### 最後に
今回はライセンス画面の実装に非常に便利な`aboutLibraries`を紹介させていただきました
以前にも自分の記事で書きましたが、次の記事ではライセンスの手動追加方法を改めて詳しく紹介していこうと思います
Scratchでじゃんけんゲームを作成しよう：カメラを使ったAI学習プロジェクト

# Scratchでじゃんけんゲームを作成しよう：カメラを使ったAI学習プロジェクト

## はじめに
プログラミングは、創造的なアイデアを形にする楽しい方法です。特に、Scratchを使ったプロジェクトは、プログラミング初心者にとって理想的なスタート地点となります。この記事では、「Scratchでじゃんけんゲームを作成する方法」を紹介します。特に、カメラを使用してプレイヤーの手の形を認識するAI（人工知能）の基本を学びます。

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

## ステップ0: Teachable MachineでじゃんけんAIをつくる
- [Teachable Machineの公式サイト](https://teachablemachine.withgoogle.com/train)にアクセスする
- グーチョキーパーそれぞれの画像を撮る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/e1f798de-405c-cf07-6d95-1128a34fe575.png)
- トレーニングする
- 出力を試してみる
- モデルをエクスポートする
- モデルをアップロードする
- 共有可能なリンクをコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/efba422c-36a2-18f3-e6ac-b86d71d56948.png)


## ステップ1: Streach3とカメラを準備する
- [拡張版Scratchの公式サイトStreach3](https://stretch3.github.io/)にアクセスし、新しいプロジェクトを開始します。
- 「拡張機能」から「TM2Scratch」を選択し、プロジェクトでカメラを使用できるようにします。
> Stretch3(ストレッチスリー)は自作の拡張機能を使えるように改造したScratch(スクラッチ)です。音声認識(スピーチ トゥー スクラッチ)、ポーズの認識(ポーズネット トゥー スクラッチ)、画像や音声を学習させることができる機械学習(エムエル トゥー スクラッチ)、ChatGPT(チャットジーピーティー トゥー スクラッチ)などが使えるいろいろな拡張機能があります。https://github.com/stretch3/stretch3.github.io

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/6bf0cc9d-3435-2e1c-c43e-f82220004cf7.png)


## ステップ2: じゃんけんの手のスプライトを作成
- 「グー」「チョキ」「パー」のスプライトを用意します。これらはゲーム内で使用される主要な要素です。
- 「ねこ」「いぬ」「審判」のスプライトを用意します。
- 審判のコードに設定用のロジックを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/68ad2cd8-eb63-9c09-e4a3-04a403b8c78a.png)
- 画像分類モデルURLに先程のURLを貼り付けます
- 緑の旗マークをおします。

## ステップ3: ゲームのロジックを設計
- プレイヤーの手の形をカメラで認識し、それをもとにじゃんけんの勝敗を決めるプログラムを作成します。
- AIはランダムに手を選びます。プレイヤーの手とAIの手を比較して、結果を決定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/7d5f86cc-808b-7392-f7b8-3378bebe59dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/beda9ddf-7d7b-8a64-a337-d42d41a8b039.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/b5a1d727-af72-8739-0eef-d8d65191384f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/3837a1db-d155-1779-8a34-59d2d6c58fa1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/561c44e6-9d16-876c-8dc6-fc5825a70240.png)
::: note info
乱数1,2,3をグーチョキパーに対応させています！
:::

::: note info
「じゃんけんの判定は、審判のスプライトが行う」「いぬの手はいぬがきめる」というのがポイントです。![Something went wrong]()

オブジェクト指向といいます！
:::

## ステップ4: コスチュームを設計
- ねこの手といぬの手のコスチュームをつくります
- コスチュームの名前を工夫しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/b694c051-6346-d759-38c6-a118b2d1a1f0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/acef1568-20c0-cea5-0da6-cf59ffe4f4fc.png)


## SEO対策
- **タイトル**: 「Scratchで学ぶ：カメラを使ったじゃんけんゲームの作り方」
- **メタディスクリプション**: 「この記事では、Scratchとビデオセンシングを使用して、カメラで手の形を認識するじゃんけんゲームを作成する方法を紹介します。AIの基礎を楽しく学びましょう。」
- **キーワード**: 「Scratch じゃんけんゲーム」「Scratch AIプロジェクト」「プログラミング 学習」「Stretch3 Teachable Machine 」

## まとめ
Scratchを使ったこのじゃんけんゲームプロジェクトは、プログラミングとAIの基本を学ぶのに最適な方法です。カメラを使ってプレイヤーの手の形を認識するプロセスを通じて、プログラミングの楽しさと、AI技術の基礎に触れることができます。このプロジェクトを通じて、皆さんがプログラミングにより一層興味を持っていただければ幸いです。
windowsサインインパスワード忘れた時の対処法

※本記事は困った時の対処法や、セキュリティ観点で見た時のセキュリティ意識の向上を図る為の記事であり、悪用する事を示唆したりするものではございません。悪用厳禁でお願いします。また、本記事の作業には危険を伴う為、作業で発生したトラブル等に関しては一切の責任を負いません。自己責任でお願い致します。

では、本作業の内容と目的から記載したいと思います。

本作業の内容
・windowsサインイン画面の「コンピューターの簡単操作」を「コマンドプロンプト」に書き換えてサインインパスワードの強制変更

目的
・本作業はwindowsのサインインの際にパスワードを忘れた等の理由によりログイン出来なくて困った際の対処
・セキュリティ観点でパスワード突破の安易さを知り、意識向上を図る

本文
他にも有識者の方々が同じ様な内容の投稿やブログへの記載もしておりましたが、私自身の実施記録としても残しておきたい為、私の実施内容を記載させて頂きたいです。

情シス時代にサーバーの構築完了後、数日後再度サーバーの操作の為サインインしようと思ったその時！
パスワード忘れた！！！！と言う事態に陥ってしまった。（そうならない為の対策は必要）
せっかくセットアップは終わったのでクリーンインストールは嫌だし何かないかなと探していた時に見つけた方法です。
その際はwindows serverでしたがwindows10にもサインイン画面に「コンピューターの簡単操作」があるため同じ要領で作業可能なはず。(windows11を使用していましたがこちらでは試しておりません)

手順
1.セーフモードで起動（オプションの選択）
    -機種によって「Shift」＋「再起動」等でも起動できたはずなのでサインイン画面から試してみる　←個人的にはこちらの方が楽なのでこちらでやりました
    -windowsインストールメディアをUSBや外付けHDD等で接続しBIOSよりブート順序変更
2.トラブルシューティングを選択後「コマンドプロンプト」を選択
3.コマンドプロンプトが起動したら下記のコマンドを入力(下記にコマンドの意味も書いておきますので読んだ上で打ち込んだ方が良いかもしれません)
    c:                                
    cd Windows\System32
    ren Utilman.exe Utilman.exe_backup
    copy cmd.exe Utilman.exe

    1行目「Cドライブへ移動」
    2行目 cdコマンドでWindows\System32へチェンジディレクトリ（ディレクトリ移動）
    3行目 ※要注意！重要！※renコマンドでファイル名の変更（ここではUtilman.exeという実行ファイル）の名前を変えておく（後でcmd.exeをコピーしてきた際に戻せなくならないように）
    4行目 copyコマンドでファイルコピー（ここではコマンドプロンプトを使いたい為cmd.exeをUtilman.exeと言う名前でコピーしてくる）
    以上で準備完了
    Utilman.exeというプログラムファイルだが中身はコマンドプロンプトが立ち上がるようになっている認識

上記作業が終了したらコマンドプロンプトを閉じてオプション選択画面に戻ったら「続行」からOS起動
OSが起動したら「コンピューターの簡単操作を押下してみてください。
コマンドプロンプトが立ち上がるはずです。

コマンドプロンプトが立ち上がったら下記コマンドでユーザー名の強制変更
    net user <ユーザー名> <新しいパスワード>
    コマンドは正常に終了しましたと表示されたら完了
    サインインできるか確認してください。

最後に先ほど名前を変更したUtilman.exe_backupを元に戻してあげます。
初めの手順に戻りトラブルシューティング画面からコマンドプロンプトを再度起動　※ここからじゃないと（OS起動状態だとNGの為）戻せないので要注意です。
    c:                                
    cd Windows\System32
    del Utilman.exe
    ren Utilman.exe_backup Utilman.exe
    
これが完了したらサインイン画面に戻り「コンピューターの簡単操作」が正常の状態に戻ったことを確認で終了です。
※renコマンドで名前変更する際に同じ名前のファイルがある場合上書きできるか忘れてしまい、不安だったのでrenの前にdelコマンドで中身がコマンドプロンプトのUtilman.exeを先に削除した気がします。

これを自分自身でやった時パスワード変更できて無事サインインできた事と、こんなに簡単に突破できてしまうと指紋認証もしくは顔認証の必要性そもそもPCを他人が触れる状態にしないことの重要性が良く分かり一石二鳥でした。

画像等あればもっと分かりやすいですが、時間の都合上テキストのみとなります事ご了承ください。

大事な事なので再度記載しますが、他人のPC等で絶対に悪用はしないでください。
※本記事は困った時の対処法や、セキュリティ観点で見た時のセキュリティ意識の向上を図る為の記事であり、悪用する事を示唆したりするものではございません。悪用厳禁でお願いします。また、本記事の作業には危険を伴う為、作業で発生したトラブル等に関しては一切の責任を負いません。自己責任でお願い致します。
PalWorldでSteamCMD(Windows→Linux)へ環境を移植する手順

# 前書き

何も考えずに普段遣いのWindowsPCでdedicated server立てたら
再起動のタイミングとか調整しないといけなくて面倒なのでUbuntu 22.04に移植したよ！

# サーバ構築

まずは以下公式手順からDedicated Serverを構築する
https://tech.palworldgame.com/ja/getting-started/deploy-dedicated-server

最終的に以下メッセージが出てくればOK
```
[S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.
```

データを移行するため一旦Ctrl+Cで終了させる。

# データ移行

1. 移行元(Windows)のPalWorldSettings.iniを移行先(Ubuntu)にコピーする
ファイルのパス: `~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer`
1. 移行先のGameUserSettings.iniを開き、DedicatedServerNameを移行元のIDに置き換える
1. 移行元のSaveGamesフォルダを移行先にコピーする

以上。

今回の手順は以下記事を参考にさせていただきました！(Thanks!!)
https://qiita.com/lainzero/items/bccb97d1ff3e6110f320
エスケープとは

# エスケープとは
エスケープ（Escape）とは、コンピュータプログラミングやテキスト処理において、特別な意味を無効にしてくれる文字、あるいは特別な意味を付与するための文字のことです。
主な使用目的は以下の通りです。

1\. **特殊文字の表現**: 文字列中に特殊文字（例: シングルクォート、ダブルクォート、バックスラッシュなど）を含める際に、その文字を特別な意味ではなく、そのままの文字として解釈させるためにエスケープします。

2\. **制御文字の表現**: 文字列中に制御文字（例: 改行文字、タブ文字など）を含める際に、その文字を文字列の一部として解釈させるためにエスケープします。

3\. **予約語の表現**: 特定のコンテキストで予約語（例: JavaScriptの予約語、SQLの予約語など）を文字列として使用する際に、その意味を特別な意味として解釈させないためにエスケープします。

エスケープは、通常、バックスラッシュ（\）や特定のエスケープシーケンス（例: \n、\tなど）を使用して行われます。エスケープシーケンスは、バックスラッシュの後に特定の文字を記述することで特殊な意味を持つ文字を表します。

例えば、JavaScriptでダブルクォートを含む文字列を表現する際には、そのダブルクォートをエスケープする必要があります。
```js
const stringWithQuote = "She said, \"Hello!\"";
// She said, "Hello!"
```
ここでは、ダブルクォートが文字列自体の終了を意味するため、その前にバックスラッシュが付けられています。
Python エポック　標準秒を算出する。

秒のエポック標準時を算出する。
```python
#!c:/Python3/python -X utf8
# coding=utf-8

#######################################################################################
# DATA   2024/02/11 エポック標準時刻を表示する
# this script        http://127.0.0.1/my_python/python_time1.cgi
#
########################################################################################

# test on *.py
#! /usr/bin/env python3
#  -*- coding: utf-8 -*-
#

import datetime

print ('Content-type:text/html'+'\n'+'\n')
print ('<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>pyton_v5</title>'+'\n')
# print ('<link rel=\"stylesheet\" href=\"popupw_css.css\">'+'\n')
print ('<script src=\"python_time.js\" defer></script>'+'\n')
print ('</head><BODY BGCOLOR=\"#ffffff\">'+'\n')
point_err = bool(0) #ここから後はヘッダータグを打ち出さなくていい。########### printをここから使える ######################
print ('エポック標準時の比較<br>\n')

now = datetime.datetime.now()
#my_date = now.strftime("%Y/%m/%d %H:%M:%S")
my_year = int(now.strftime("%Y"))-1970

my_month = int(now.strftime("%m"))-1
my_day = int(now.strftime("%d"))-1
my_hour =int(now.strftime("%H"))
my_minute = int(now.strftime("%M"))
my_second = int(now.strftime("%S"))

def_moon_days = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
def_moon_days4 = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]

if my_year%4 == 0:
    my_moon_days = def_moon_days4[my_month]
else:
    my_moon_days = def_moon_days[my_month]

epoch_tokyo = 9
print("1:javascript<div id=\"mymy\"></div>\n")
my_year2 = int(my_year/4)
epoch_0 = my_year*365*24*60*60 + (my_moon_days + my_day+my_year2)*24*60*60 + (my_hour-epoch_tokyo)*60*60 + my_minute*60 + my_second
print("2:python計算<div id=\"mymy1\">",epoch_0,"</div>\n")
print("3:差<div id=\"mymy2\"></div>\n")

print('<br>\n')
epoch_1 = epoch_0 + 9*60*60
print(epoch_1," Epo_tokyo<br>\n")
print ('</BODY>'+'\n')
print ('</HTML>'+'\n')
exit()

```
検証のためのjavascropt  python_time.js
```js
/* test time */
my_jst_Epo=  Math.floor(Date.now()/1000);
document.getElementById("mymy").innerHTML = my_jst_Epo;
my_py_Epo = document.getElementById("mymy1").innerHTML;
my0 = parseInt(my_py_Epo);
my_sa = my_jst_Epo - parseInt(my_py_Epo);
my_sa /=24*60*60;
document.getElementById("mymy2").innerHTML = String(my_sa);
```
仕様書が無いので自己流です。逆算も、そのうちやりたいとは思っています。
住所から市区町村を抜き出すのに苦労した話

## はじめに

実務で住所を使った処理を実装することがあり、そこで苦労したため、今後同様の対応で苦労しないように記載しました。


## 苦労したこと

以下のようにお客様の住所の都道府県と市区町村の情報を入力するフォームは元々ありました。そのフォームから入力されたデータを使用したバッチ処理を実装することになりました。すでに作成されたテーブルの中にある都道府県と市区町村を取得したかったのですが、市区町村のデータを取得するのに苦労しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673263/d49cd96b-f8bb-213d-7474-318504c990a0.png)

<br>

なぜなら、市区町村部分は以下のような形式で入っていたため、「さいたま市北区」だけを取得したいという処理が想像以上に難航しました。

```
さいたま市北区ホゲホゲ1-1-1
```

<br>

最初は正規表現で市区町村部分だけ取得すればよいのでは？と思い、調べていたところ以下の記事を見つけました。

https://qiita.com/zakuroishikuro/items/066421bce820e3c73ce9

記事の中で市区町村をベタ書きしております。ということは、市区町村名が変わったりしたら、正確に取得できないのでは？と思いました。例えば、埼玉県のさいたま市は元々、浦和市だったのですが、他の市と合併してさいたま市になりました。そのような状況が他の市区町村でも起こった場合、以下のコードを保守し続けなければいけないなと思いました。

> (...??[都道府県])((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村)市|.+?郡(?:玉村|大町|.+?)[町村]|.+?市.+?区|.+?[市区町村])(.+)


<br>

そもそもどれほど市区町村名って変わっているのだろう？と疑問に思い、調べてみたところ意外にも市区町村名って変わってしまっているということを知りました。

https://www.kokudo.or.jp/marge/result.php

また、テストコードを書く際にも労力がかかりそうだと思ったため、別の方法が良いと思いました。


## 解決法
住所から市区町村を抜き出すためには市区町村のマスター情報が必要と思い、それを含んでるgemはないか探したところ、以下があてはまりました。


- 住所から市区町村を取得してくれるgem

https://github.com/yamat47/japanese_address_parser

- 郵便番号から市区町村の情報を取得できるgem

https://github.com/rinkei/jipcode/blob/583c56ddb641bd5968777cc9c7717c300f3185a7/lib/jipcode.rb#L10

個人的には住所から市区町村を抜き出すためのgemを使用したかったのですが、そちらはruby2.6以降が対象で、弊社のrubyは2.5だったため、使用できず、、

gemの選定でrubyのバージョンを早めにチェックすることが大事であることを改めて痛感しました。

仕方なく、郵便番号のお客様情報もテーブルにあったため、そこから市区町村情報を取得して、住所から抜き出すようにしました。

なぜgemで取得した郵便番号から取得した市区町村をそのまま使用しなかったのかを説明します。

そもそも郵便番号というのは一つの郵便番号に紐づいている市区町村は一つと思っていたのですが、そうではなく、一つの郵便番号に複数の市区町村が紐づいていたり、同じ郵便番号なのに、違う都道府県の市区町が紐づいていることがあります。

例えば以下の郵便番号みたいに1つの郵便番号でも違う都道府県の市区町村が紐づいていたりします。（はがきを書く時に郵便番号だけでなく、都道府県や市区町村を書く必要があるのかと思いました！）

>郵便番号 498-0000
愛知県 弥富市
三重県 桑名郡木曽岬町

詳しくは以下の記事です。

https://qiita.com/_takwat/items/3a121656425fac7bb820


かなり勉強になりましたが、システム実装するには嬉しくないですね、、


お客様が入力した郵便番号からgemで市区町村を抜き出すことをしました。gemで取得した市区町村の情報とお客様が入力した都道府県、市区町村以降の住所を使って、お客様の市区町村を抜き出すことを致しました。


## 改善点
今回はバッチ処理で市区町村の情報が必要だったために上記の実装しましたが、お客様が市区町村以降を入力する画面のバリデーションも直したいと思いました。

なぜなら、入力フォームが手入力であり、ユーザが間違えた市区町村を入力してしまうことがあるため、チェックする仕組みを実装したいと思いました。

## 今回の学び
- データを結合することは簡単だが、分割するのは難しい。また、工数もかなりかかる。住所の市区町村とそれ以降で分けた入力フォームとテーブル設計にすることが大事。以下のようなフォームはgood。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673263/35c33cd1-303f-b79e-4fc3-1f35711cb6a6.png)


以下のようなフォームはBad。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673263/153052f3-1b9d-195f-cdf4-d68189979100.png)


- gemが対応しているrubyバージョンのチェックは大切。なるべく早めにgemを使ってみて、要件に合うかもチェックする。
.NET 8でAOT構築時のエラーを避ける方法

前回の記事「.NET 8リリース後、JWT AuthenticationがAOTによって解決された」というもので、Visual Studio内で実行する分には問題ありませんが、デフォールトのリリース設定を使用するとエラーが発生します。
.NET 8がリリースされた後、JWT AuthenticationがAOTによって解決されました
桂素伟、 公式アカウント：桂迹.NET 8がリリースされた後、JWT AuthenticationがAOTによって解決されました
最初に、デフォールトでリリースする場合、ターゲットランタイムのデフォのルト設定は「ポータブル」で、以下のようなエラーが報告されます：
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBU0D4qaC5g0LkBrsJC61smfsr1pURibJR11U4sYtKJiaiaB9CiaibhpHsQRzl4j9KCW8LNlAIHD5Mplvg/640?wx_fmt=png&from=appmsg)
AOTメカニズムはネイティブ実行コードを生成するため、「ポータブル」という設定は正しくありません。正確に対応するプラットフォームを選択する必要があります。この例ではWindowsで、現在のAOTはx32をサポートしていないため、x64を選択します。
その後、再度リリースすると、システムはリリース成功と提示しますが、プログラムを実行すると、アプリがMicrosoft.AspNetCoreを見つからないというエラーを提示します、具体的なエラーは以下の通りです：
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBU0D4qaC5g0LkBrsJC61sm5FM0AmQiaT2HRewLpXAibw6qmXTGIdxM75Rx5BZsEct8uFbMfQ8Kw4dQ/640?wx_fmt=png&from=appmsg)
リリースに成功したのに、なぜファイルが見つからないのでしょうか。特にMicrosoft.AspNetCoreファイルで、理論上このNugetパッケージは早いバージョンで不要になりました。ここでは、ファイルが不足しているか、環境に問題があると疑われやすいです。しかし、リリースは成功したのに、実行に問題があるということです。しかし、よく観察すると、リリースが成功したとしても、リリース時のコマンドラインプロンプトに「ILC: Method '[AOTDemo01_dotnet8]Program.<Main>$(string[])' will always throw because: Failed to load assembly 'Microsoft.AspNetCore'」という情報があり、実際にはリリース中にMicrosoft.AspNetCoreが見つからないと言及されています。しかし、この時点での提示は名前空間であるため、間接的にリリースが失敗したことを意味します。
この情報を見て、環境に問題があると疑うかもしれません。実際、AOTはネイティブコードをリリースするわけですから。そのため、リリース設定をさらに確認する必要があります。この時、「デプロイモード」オプションは「フレームワーク依存」になっています。AOTはasp.net coreのランタイムに依存することはありませんので、ここを変更しないと、パッケージの検索にこの部分が含まれず、リリースされたアプリケーションには自然とMicrosoft.AspNetCoreの名前空間が欠けることになります。「デプロイモード」を「独立」に切り替えて、再リリースすると成功し、正常に実行できるようになります。すると、15.5Mのexeが手に入ります。
したがって、Visual StudioはAOTプロジェクトであるかどうかを判断し、リリースファイル内でサポートされていないターゲットフレームワークとターゲットランタイムを自動的に非表示にするとより良いでしょう。
また、コマンドラインでdotnet publish -r win-x64を使用すると、直接成功することができます。やはりコマンドラインが最強ですね、コマンドラインのデフォルトリリース位置は：bin\Release\net8.0\win-x64\publishです。

(Translated by GPT)
【JavaScript】テンプレートリテラルとは　

# テンプレートリテラルとは
テンプレートリテラル（Template literals）は、JavaScriptの文字列の記法の一つであり、バッククォート（``）で囲まれた文字列リテラルのことを指します。テンプレートリテラルを使用すると、文字列内で変数や式を埋め込むことができ、より簡潔で読みやすいコードを書くことができます。

テンプレートリテラルの主な特徴は以下の通りです。

1\. **変数の埋め込み**: テンプレートリテラル内では`${}`を使って変数や式を埋め込むことができます。
```js
const name = 'John';
const greeting = `Hello, ${name}!`;
console.log(greeting); // 出力: Hello, John!
```
2\. **複数行の文字列**: テンプレートリテラル内では複数行の文字列をそのまま書くことができます。
```js
const multiLineString = `
This is
a multi-line
string.
`;
console.log(multiLineString);
/*
出力:
This is
a multi-line
string.
*/
```
3\. **式の埋め込み**: テンプレートリテラル内では、`${}`内にJavaScriptの式を埋め込むことができます。
```js
const x = 10;
const y = 5;
const sum = `Sum of ${x} and ${y} is ${x + y}.`;
console.log(sum); // 出力: Sum of 10 and 5 is 15.
```
テンプレートリテラルはES6（ECMAScript 2015）で導入され、以降のバージョンのJavaScriptで広く利用されています。文字列の結合や複雑な文字列操作を行う際に、従来の文字列結合よりも使いやすく効率的です。
GPUインスタンスの料金比較(2024)

## はじめに

東工大スパコンTSUBAME4.0の料金が公開されたこともあり、本記事では、国内外の主要なクラウドとスパコンのインスタンスの、1GPUの1時間あたりの料金を比較しまとめました。

## 注意事項

- この比較は独自調査に基づくものです。
- スパコンの利用は一部の研究者や企業に限定される場合があります。
- 学内利用やスポットインスタンスなどの値を掲載しています。
- 為替の変動などにより実際の料金は変化する可能性があります。
- 為替レートは2024年2月1日時点に基づきます。
- 情報に誤りがある場合はコメントで教えて下さい。

## GPU毎の料金ランキング

### H100 GPU料金ランキング

| ベンダー            |   タイプ    |  ¥/h   |
|-------------------|:---------:|:------:|
| 東工大 TSUBAME 4.0|   スパコン   |  15.6  |
| 産総研 ABCI3.0    |   スパコン   | 206.2 |
| Scaleway          | 海外クラウド | 305.8  |
| Lambda            | 海外クラウド | 372.0  |
| さくらのクラウド(月額利用) | 国内クラウド | 528.8 |
| Azure             | 海外クラウド | 1101.7 |
| AWS EC2           | 海外クラウド | 1836.1 |

### A100 GPU料金ランキング

| ベンダー          |   タイプ    |  ¥/h   |
|-----------------|:---------:|:------:|
| 東大 Wisteria   |   スパコン   |  20.8  |
| 産総研 ABCI      |   スパコン   |  74.3  |
| GCP             | 海外クラウド | 156.1 |
| AWS EC2         | 海外クラウド | 183.6 |
| Lambda          | 海外クラウド | 192.7 |
| Azure           | 海外クラウド | 219.5 |
| PALTEK GPUSOROBAN | 国内クラウド | 361.0 |

### V100 GPU料金ランキング

| ベンダー          |   タイプ    |  ¥/h   |
|-----------------|:---------:|:------:|
| 筑波大 Cygnus   |   スパコン   |  7.5   |
| 産総研 ABCI     |   スパコン   |  44.6  |
| Lambda          | 海外クラウド |  82.2  |
| GCP             | 海外クラウド | 110.6 |
| AWS EC2         | 海外クラウド | 137.1 |
| Azure           | 海外クラウド | 153.6 |
| IBM Cloud       | 海外クラウド | 413.4 |
| さくらのクラウド | 国内クラウド | 481.0 |

### P100 GPU料金ランキング

| ベンダー          |   タイプ    |  ¥/h   |
|-----------------|:---------:|:------:|
| 東工大 TSUBAME 3.0 |   スパコン   |  5.0   |
| Azure           | 海外クラウド |  30.9  |
| GCP             | 海外クラウド |  64.2  |
| Scaleway        | 海外クラウド | 199.6 |
| IBM Cloud       | 海外クラウド | 304.2 |
Google ChromeやMicrosoft Edgeブラウザで使える拡張機能

# はじめに
Google ChromeとMicrosoft Edgeでは互換性があるので、同じ拡張機能をそれぞれ利用できる。
以前、Edgeが独自ブラウザで開発していたが、Chromiumベースで動作する開発に切り替えたためである。

・ Microsoft Edge アドオン

https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home

- Chrome ウェブストア

https://chrome.google.com/webstore/category/extensions?hl=ja

# 拡張機能一覧
## Web Search Navigator

https://chromewebstore.google.com/detail/cohamjploocgoejdfanacfgkhjkhdkek

使い方

https://yuki-papa.com/google_search_shortcut/

## Bingoogle

https://microsoftedge.microsoft.com/addons/detail/bingoogle-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89/kkjkkfplkpioclicbmaehaadbhclfdhn?hl=ja

## DeepL翻訳：読みながら、書きながら使える翻訳ツール

https://microsoftedge.microsoft.com/addons/detail/deepl%E7%BF%BB%E8%A8%B3%EF%BC%9A%E8%AA%AD%E3%81%BF%E3%81%AA%E3%81%8C%E3%82%89%E3%80%81%E6%9B%B8%E3%81%8D%E3%81%AA%E3%81%8C%E3%82%89%E4%BD%BF%E3%81%88%E3%82%8B%E7%BF%BB%E8%A8%B3%E3%83%84/fancfknaplihpclbhbpclnmmjcjanbaf

## Dark Reader

https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh

## 1Password – パスワード保管庫

https://microsoftedge.microsoft.com/addons/detail/1password-%E2%80%93-%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E4%BF%9D%E7%AE%A1%E5%BA%AB/dppgmdbiimibapkepcbdbmkaabgiofem?hl=ja

## Keyboard Shortcuts

https://chromewebstore.google.com/detail/lplcmnhgijkkmflbmhabnccgelffpnog

## Enhancer for Youtube

https://chromewebstore.google.com/detail/enhancer-for-youtube/ponfpcnoihfmfllpaingbgckeeldkhle?hl=ja

## ChatHub
複数のチャットを同時に比較することができる。
35ドルの買い切り。

https://microsoftedge.microsoft.com/addons/detail/chathub-%E3%82%AA%E3%83%BC%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%AF%E3%83%B3%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E3%82%AF/kdlmggoacmfoombiokflpeompajfljga?hl=ja-JP&gl=JP

## Sakura Check Linker
Amazonの口コミのサクラを見分ける

https://chromewebstore.google.com/detail/sakura-check-linker/dmelpckhjikcpmppkcnjmjmedhjpjmce?hl=ja

## keepa-amazon-price-tracke

https://chromewebstore.google.com/detail/keepa-amazon-price-tracke/neebplgakaahbhdphmkckjjcegoiijjo?hl=ja

## vimium

https://vimium.github.io/

個別設定は以下
```
- Excluded URLs and keys
https?://mail.google.com/*
https://www.google.com/*  jk/aivmg
https://www.bing.com/*  jk/AIVM
https://www.youtube.com/* <>

- Custom key mappings
# Insert your preferred key mappings here.
map h goBack
map l goForward
# map n scrollPageDown
# map m scrollPageDown
# map i scrollPageUp
map <space> scrollDown
map <c-y> scrollUp
map w removeTab
map T restoreTab
map g scrollToBottom
map G scrollToTop

- Scroll step size	
100 px
```
Websocketで、異空間通信。

# 概要

４番ohisamaです。
私達チームの第一回Qiitaハッカソンの予選会、テーマ「つながり」への提出作品が
「Websocketで、異空間通信。」です。
チームは、一人です。
この作品で、異空間と通信する手段を提供します。
異空間とは、メタバースです。
メタバースとは、インターネット上に構築された人数参加型の仮想空間を指します。 

# 実演

## serverの準備

下記内容で、serverを設置します。

https://qiita.com/ohisama@github/items/ad0aeb92a7fac12524d5

## clientの準備

下記に、clientが設置されています。

https://embed.plnkr.co/plunk/6EFcKfiohjzCyHvB


## clientの準備２

下記内容で、NeosVR内にtransiverを設置します。

https://qiita.com/ohisama@github/items/99d65ebc8e1498ee04db



![2023-05-01 23.55.39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/00eccbb5-567a-1b15-9a0f-07258033de9b.jpeg)

## 動作の確認

chatです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5a97320b-1ca3-70ce-ad25-410b5d957d0a.png)


![2023-05-02 00.05.25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c4517229-7c92-0e83-d7ae-0e78883c6cb5.jpeg)


# 課題と解決策

- メタバースは、インターネット上に構築された人数参加型の仮想空間を指します。
外部から、影響を与える方法がありませんでした。
- NeosVrは、ビジュアルプログラミングのLogiXがあり、「websoket connect」ノードがあることがわかりました。

LogiXを、俺コードで、neos uiを使って、websocketで、オウム返しを取得するオブジェクトを表現してみた。

```

{p0, _} = ButtonEvents Obj.Button
{p1, _} = ButtonEvents Obj.Button
{_} = WebsocketConnect p0, FrooxEngine.WebSocketClient, "ws://localhost:50002", HostUser
{_, _, _} = WebsocketTextMessageSender p1, FrooxEngine.WebSocketClient, Obj.TextField.text
{p2, d} = WebsocketTextMessageReceiver FrooxEngine.WebSocketClient
{v} = Write p2, d
Obj.test.txt.text = v

```

- NeosVRは、VRで自分だけの世界を作ったり、他のユーザーと交流したりできるメタバースプラットフォームです。
NeosVRは、チェコにあるSolirax社によって開発されました。
NeosVRでは、VRで自由に創造やコミュニケーションができる環境を作りたいという思いから、ユーザーが自分の好きなデジタルデータやコンテンツをVR内で簡単に呼び出したり、共有したり、編集したり、様々なことができます。
また、プログラミングツールや投げ銭システムなども備えており、ユーザーが自分のアイデアやスキルを発揮できる場でもあります。


![2021-11-26 05.33.25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/09abc215-e9ab-e2eb-94a8-be642cc8abc9.jpeg)


- LogiXは、NeosVRで使われるビジュアルプログラミング言語です。
LogiXでは、ノードとワイヤーで図形を作りながら、オブジェクトにカスタムの動作やインタラクションを追加できます。
- websocketは、ウェブブラウザとサーバー間で双方向の通信を可能にする技術です。
通常、ウェブブラウザはHTTPプロトコルを用いて、サーバーにリクエストを送り、レスポンスを受け取りますが、この場合、通信は一方的で、サーバーからのプッシュ通知などはできません。
websocketでは、HTTPプロトコルの上に、新たなプロトコルを構築し、ハンドシェイクを行うことで、ウェブブラウザとサーバー間に永続的な接続を確立します。
これにより、サーバーからのプッシュ通知や、リアルタイムなデータのやり取りが可能になります。
- Elixirで、serverを構築しました。
- Elixir (エリクサー) は並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語です。

- Plunker、Javascriptで、ブラウザ上でclientを構築しました。
- Plunkerは、Webブラウザ上でHTMLやCSS、Javascriptのコーディングをすることを可能にするコードエディタです。
- Javascriptは、Webページに動きをつけるためのプログラミング言語です。 ボタンに触れると形や色が変わる機能や、スライドショー、ポップアップウィンドウ、ログインなど、さまざまな機能の実装に用いられます。

# 残された課題

- LogiXは、ビジュアルプログラミングなので、ドキュメント化に苦労した。
そのため、NeosVRコンパイラを開発中。

https://qiita.com/tags/%e4%bf%ba%e3%82%b3%e3%83%bc%e3%83%89


- 「自動運転シュミレーター」にしたいが、センサーが無い状態です。


- NeosVRが、過疎化していて、やばい。
    Resoniteは、Yellow Dog Man Studiosが開発した新メタバースプラットフォームで、2023年10月7日に正式リリースされました。
NeosVRの開発チームが手がけ、自由度と創造性を重視した新しいソーシャルVR空間であり、急速に成長しているプラットフォームとして注目を浴びています。



# 以上。
【JavaScript】DOMとは

# DOMとは
DOM（Document Object Model）は、ウェブページやXML文書などの文書の構造化された表現を提供するためのプログラミングインターフェースです。DOMは、HTML、XML、XHTMLなどの文書を、プログラムやスクリプトから操作できるようにするための標準化された方法を提供します。
具体的には次のような機能を提供します。
1\. 文書の階層構造の表現: 文書内の要素（タグ）、属性、テキストなどを木構造で表現します。これにより、文書内の要素やその関係をプログラムから操作できます。

2\. 要素へのアクセスと操作: DOMを使用すると、JavaScriptなどのスクリプト言語を使って文書内の要素にアクセスし、属性や内容を変更したり、新しい要素を追加したりできます。

3\. イベントの処理: DOMは、ユーザーの操作（クリック、キーボード入力など）やブラウザの状態の変化（ページの読み込み、スクロールなど）などのイベントを捕捉し、処理するための機能も提供します。

DOMはクライアントサイドのWeb開発で非常に重要な役割を果たしており、JavaScriptを使用して動的なWebページを作成する際に広く利用されています。
OCIでUbuntuイメージのwebサーバを作る時のファイアウォールの設定で手抜きをしたら失敗した話

といっても、ただ単に、ufwじゃなくてiptablesを使おうという話です。
### コンピュートインスタンスでのwebサーバの作成
[OCIのヘルプセンター記事](https://docs.oracle.com/ja/learn/lab_compute_instance/index.html#introduction)

手順通りに進めていきますが、ここに記載されている例はOracle Linuxの場合の手順です。
大まかにはUbuntuの場合も同じですので、適宜読み替えて進めていきます。

### 手抜きをして失敗した箇所
ファイアウォール・ルールの設定で次の指示があります。
```
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --reload
```
Ubuntuイメージにはfirewalldがインストールされていないため、firewall-cmdコマンドを使うことができません。
で、手抜きでufwでいいかと思って80番ポートの開放設定をしてもブラウザからアクセスすることができません。

OCI用のルールがufwではなくiptablesで設定されているので、手抜きをせずに正直にそちらを使わないとうまくいかないようです。

で、
```
sudo apt install firewalld
```
でfirewalldをインストールして、指示通り設定をすれば、普通にブラウザからアクセスできてしまうのでした。。

楽をしようとして手抜きした結果、回り道になっちゃいました…
AIはマンガの見すぎ

　GoogleのAIに「宇宙人が攻めてくるとしたら」と質問をしたら[こんな回答が返ってきた](https://nordot.app/1128389121253949682)らしい。曰く
>「重力を曲げる」テクノロジーを使う
>星のエネルギーを使用し壊滅的な爆発を伴う武器
>人間の精神を神経インターフェースを通して躊躇なくコントロール

　こんな事をいう子供がいたら「テレビやマンガの見すぎだよ」と言われそうである。
　しかし、その子は、それが絵空事だと理解している程度の良識は持ち合わせているものだ。
　一方、AIはそれこそ、ただひたすらに「マンガの見すぎ」なのである。

　ところがテレビやマンガの画像ではなく、生成AIの回答となると真に受けてしまう人が出てきそうだと危惧している。「宇宙人の行動」ならそもそも現実的ではない前提であるから誰もが気がつくが、ちょっと馴染みの薄い分野のことなら納得してしまうことが多いのではなかろうか。たとえば隣の国の歴史とか。
　
　肝に銘じておこう
生成AIは、テレビやマンガ飲み過ぎで、それを絵空事と判断できない困った子である。
ABC340回答メモ

# 0.はじめに
　A～Cは順調に解けたのですが、Dでつまづきました。
　最近は順調にレートを上げていましたが、ここでブレーキ。
　それでも、-16で947と、900台はキープできているので
　気合を入れなおしていきたいと思いました。


# 1.A - Arithmetic Progression
　Aにしては難しめの問題。
　回答用配列ansを用意し、Aをセット
　以降最後の値にDを加算した値を加えていくループを回し
　最後の値がBになったらansを出力して終了。

　https://atcoder.jp/contests/abc340/submissions/50141495


# 2.B - Append
　Bでは珍しいクエリー問題。
　まぁ、言われた通りに実装。
　特にこれといった工夫ポイントもない感じでした。

　https://atcoder.jp/contests/abc340/submissions/50147049


# 3.C - Divide and Divide
　メモ化再帰の例題のような問題。
　lru_cacheは使わず自前で辞書を使って実装しました。
　今のとこ自前の辞書で不自由したことはないので
　lru_cacheを使うことはしばらくない気がします。
　【実装】
    1.Nを入力
    2.辞書Dを定義
    3.回答変数ansに関数chk(N)をセット
    4.ansを出力
    -関数chk-引数n
     1.nがDにある場合は、D[n]+nを返す
     2.nが1の場合は0を返す
     3.上記以外の場合
     3-1.nが偶数の時（黒板にnを2で割った数を二つ書く）
      -1.変数ansにchk(n//2)*2をセット
      -2.D[n]にansをセット
      -3.ans+nを返す
     3-2.nが奇数の時（黒板にn//2とn//2+1を書く）
      -1.変数ansにchk(n//2)+chk(n//2+1)をセット
      -2.D[n]にansをセット
      -3.ans+nを返す

　https://atcoder.jp/contests/abc340/submissions/50156872


# 4.D - Super Takahashi Bros.
　ググったダイクストラ法を参考に実装しましたが
　WA7つがどうしてもクリアできず時間切れ。
　解説をもとに実装したところACとなりました。
　テストケースが公開されたらどこがダメだったか
　調べられますが、テストケースが公開される頃には
　忘れていることがままあります・・・。

　https://atcoder.jp/contests/abc340/submissions/50193904


以上
プルリクの際に不要なアップロードファイルを削除したいとき

## .gitignoreの設定を忘れて画像ファイルなどまでaddしてしまった時は・・・


### ファイルをコミットした後にファイルを削除したい時
```
git rm --cached ファイル名
```

### コミット＆pushした後にファルを削除したい時
```
git rm ファイル名
```
でリモートリポジトリから削除。
Haskellのリストの比較でハマったところ

## 背景
関数型プログラミング言語に興味があり、
以下のサイトでHaskellを勉強している。
https://learnyouahaskell.com/

（日本語の本も出ているみたい：https://www.amazon.co.jp/dp/4274068854 ）

[リストについてのチャプター](https://learnyouahaskell.com/starting-out#an-intro-to-lists)で
Haskellでは`<`、`<=`、`>`、そして`>=`で
リストの比較が行え、
辞書式順序で比較すると説明されているのだが
その挙動がなかなか理解できず、
日本語の記事も見つけられなかった。

同じことで悩んでいる人のためにメモを残す。

## ハマったところ
リストの比較は以下のように書けるのだが、
なぜこれが`False`になるのかわからなかった。
```haskell
ghci> [10,20] > [15,15]        
False
```
`10 > 15`は`False`だが、
`20 > 15`は`True`なので、
「ひとつでも`False`があれば`False`になるのか？」と考えたが、
一方で以下の例は`True`になる。
```haskell
ghci> [20,10] > [15,15]
True
```
わからない🤔

## なぜこうなるのか？
こうなる理由は、
辞書式順序での比較というのが
次のように行われるため。
- まず最初の要素を比較
- それらが等しいなら2番目の要素を比較
- それらが等しいなら3番目の要素を比較
- （繰り返す）

例えば、次のような例を見てみる。
```haskell
ghci> [1,2,10,0] > [1,2,0,10]     
True
```

これは以下のようなステップで比較される。
- `1 > 1`を比較 → 等しいので次へ
- `2 > 2`を比較 → 等しいので次へ
- `10 > 0`を比較 → 等しくない、`10`の方が大きいので`True`を返す

## 最初の例に戻って確認
```haskell
ghci> [10,20] > [15,15]        
False
```
- `10 > 15`を比較 → 等しくない、`10`の方が小さいので`False`を返す

```haskell
ghci> [20,10] > [15,15]
True
```
- `20 > 15`を比較 → 等しくない、`20`のほうが大きいので`True`を返す

## `==`の場合どうなるのか？
`==`の場合でも同じ考え方が適用できる。
以下の例を見てみる。
```haskell
ghci> [1,20] == [1,3]
False
```
- `1 == 1`を比較 → 等しいので次へ
- `20 == 3`を比較 → 等しくない、`False`を返す

## まとめ
Haskellのリストの比較は辞書式順序で行われる。
つまり、先頭から見ていって、
等しくない要素同士が出てきて初めて比較する。

[ちゃんと書いてあった](https://learnyouahaskell.com/starting-out#an-intro-to-lists)のだが、
「たぶんこういう挙動だろう」という先入観があって
読み間違えてしまっていた。。
> Lists can be compared if the stuff they contain can be compared. When using <, <=, > and >= to compare lists, they are compared in lexicographical order. First the heads are compared. If they are equal then the second elements are compared,

## 参考
https://learnyouahaskell.com/starting-out

https://stackoverflow.com/questions/3651144/comparing-lists-in-haskell-or-more-specifically-what-is-lexicographical-order
AtCoderで入青したので記事を書く

こんにちは、hiro1729です。2/10に行われたABC340で入青したので、記事を書きます。

# 水色の間に参加したコンテストなど

## 9月

### ABC321

ABCD4完で入水しました。BのFAでした。

### ABC322

ABCDE5完、ABCで初、全体では2回目の青パフォをとりました。

### ABC323

ABCD4完しました。EとFが水diffだが解けず…

### ARC166

AB2完でした。重実装すぎない？(特にB)

### ABC324

ABCDE5完しました。A問題でFAを取りました。

### ARC167

レートグラフの意味わからない部分です。ABE3完しました。初の橙パフォです。初の銅diff自力ACです。

### ABC325

ABCE4完、もちろん冷えました。このDは絶対解けないだろ、あとFは思いついてました。

### ABC326

初めてABCDEF6完しました。半分全列挙を知ってて嬉しかったです。ところでDが重い。AのFAです。

### ABC327

ABCDE5完です。ペナりすぎて冷え…

### ABC328

ABCEF5完です。茶diffが解けない…

### ABC329

ABCD4完です。まさかの緑perf、EFの水diffがどちらも解けない…　AのFAです。

### ARC168

A1完です。ゲームがあのDiff、信じがたい…

### ABC330

ABCDEF6完、青perfで回復、やったね！Eまでは早過ぎたんですがFで沼りまくって…ちなみに自分の解法で解いた人は少数派だそうです、そんな…

### ABC331

ABCDEF6完、2度目の黄perf！自分はロリハをセグ木に乗せる方法を知っていました！

### ARC169

B1完でした。Aはしょうもないミスだったので通したかった…

### ABC332

ABCD4完、青perfのはずが間違えてUnratedにしてしまい…このミスはもう絶対しないぞ

### ABC333

ABCDE5完。G通せなかったの悔しい

### AGC065

太陽です、夜なのに… A=500のAGCには絶対参加しません

### ABC334

ABCDE5完、5完最速だったそうです。Bで嘘解法を通したそうです。青perf

### ABC335

ABCD4完、緑下位perf！！！！！AのFAでした。

### ABC336

ABCD4完、前回に比べればよかったです。

### ABC337

ABCDE5完、解くの早いね。Gは既出だったそうです

### ARC170

B1完です。Aは絶対に解けません…

### ABC338

ABCDE5完。Eは嘘解法だったそうです。

### ABC339

ABCDE5完。色々やばかったらしい。

### ARC171

A1完。冷えすぎ。

### ABC340

詳細を書きます。

#### 20:00

親に明日JJMOがあるので早く寝ろと言われます。参加できるかわからない。

#### 20:40〜20:55

風呂から上がって、参加できるかどうか検討します。

#### 20:58

参加を決意します。本当に賭け。

#### 21:00〜21:01

2完します。BでPythonで嬉しいねと思います。(後ろからのインデックスを取れるので)

#### 21:02〜21:09

厳しい。JJMOの用意を済ませてしまい、ペンケースがリュックの中にあるので取るのがめんどくさい。なのでメモ帳を使いました

#### 21:10〜21:15

あーはいDはダイクストラやるだけですね(鉄則のコードを持ってくる音)

#### 21:15〜21:21

あーはいFは拡張ユークリッドやるだけですね(extgcdを窃盗する音)

#### 21:21〜21:29

あーはいEは遅延セグ木やるだけですね　ほんとか？　自分のRange Affineが遅そうなのでめっちゃ不安でしたがまあ余裕で通りました。

#### 21:30

勝利を確信します。

#### 21:40台

寝ます。この時点で59位だったかな

#### 29:39

起きて入青を確認します。

# 勉強したアルゴリズムなど

[このバチャ](https://kenkoooo.com/atcoder/#/contest/show/313976ae-7e70-4805-bd5b-9cbd2bd3f10f)を埋めながら勉強するなどしました。特に水色の間に使えるようになったのはセグ木、遅延セグ木、半分全列挙、重み付きUnionFindかなぁ…窃盗は多いです。

# 今後の目標

年内入黄の前にもう一つ目標を設定したいので設定します。7月末までに1800です。
codepenでカメラ、マイクのテスト

# 概要

ハッカソンなので、getusermediaでカメラ、マイクのテストしてみた。

# 参考にしたページ

https://qiita.com/sueasen/items/abf2d27c888c4d6d268d

# 手順

- 下記のEDIT ON で、codepen を開いて、initボタン押すでは、足りなくて、htmlかcssかjsをいじってから、ボタン押下。

# 成果物

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="vYPVJqx" data-user="ohisama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ohisama/pen/vYPVJqx">
  webrtc test 0</a> by ohisama (<a href="https://codepen.io/ohisama">@ohisama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


以上。
STM32C011とSSD1306にクリアして豆腐を召喚する(スペルは、「40-FF」...)(STM32C011J4M7)



x だんだんめんどくなったので　過去ログを見よ


目的
OLEDのテスト
豆腐がどこかに表示される
(まだ、アドレスの事は、やってないので?)


結果

![o_cop937.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/47d2a8e7-5a79-9de1-1c5f-915ac3a556d0.jpeg)



プログラム

```c++



//有機ELのSSD1306で豆腐を召喚
//秋月のOLEDとアイテンドウの売り切れOLEDのアドレスは3c
//SSD1306_int_cls_8x8box_C011_1


//ヘッダー
#include <Arduino.h>
#include <Wire.h>


//定義
#define COMMAND_MODE               0x80 // continuation bit is set!
#define DATA_MODE                  0x40

#define SET_MEMORY_ADDRESSING_MODE 0x20 // takes one byte as given above
#define HORIZONTAL_ADDRESSING_MODE 0x00


//I2Cに配列を転送する
void write_s(uint8_t *str1, uint8_t len1) {

  Wire.beginTransmission(  0x3c  );

  for (int ii = 0; ii < len1; ii++) {

    //一文字出力
    Wire.write(*str1 ++);

  }//for

  Wire.endTransmission();

}//write_s


//セットメモリーアドレシングモード
void setMemoryAddressingMode()
{
  uint8_t databytes[4] = {COMMAND_MODE, SET_MEMORY_ADDRESSING_MODE, COMMAND_MODE, HORIZONTAL_ADDRESSING_MODE};
  //_i2c->write(_writeOpcode, databytes, 4);
  write_s(databytes, 4);
}//setMemoryAddressingMode


//初期化
void setup() {

  delay(3000); //not Delete (絶対消すな)(消しちゃィゃーん)

  //I2Cのポートの変更
  Wire.setSDA(19); //PA10
  Wire.setSCL(18); //PA9

  //I2Cの初期化
  Wire.begin(); //C011
  delay(200);

  //SSD1306の初期化スペル(魔法)
  //0x80,0x8d,0x80,0x14,0x80,0xAF
  write_s( (uint8_t*) "\200\215\200\024\200\257", 6);
  delay(100);

  //セットメモリーアドレシングモード
  setMemoryAddressingMode();

  //データの配列の定義
  uint8_t databytes[2] = {DATA_MODE,0x00};

  //画面のクリア
  databytes[1] = 0x00;
  for (int icount = 0; icount < ((128/8)*64); icount++) {
    write_s(databytes, 2);
  }//for

  //8x8の豆腐の表画
  databytes[1] = 0xFF;
  for (int icount = 0; icount < 8; icount++) {
    write_s(databytes, 2);
  }//for

}//setup


//メインループ
void loop() {
}//loop



```
STM32C011とSSD1306に豆腐を召喚する(スペルは、「40-FF」...)(STM32C011J4M7)


STM32C011とSSD1306に豆腐を召喚する(スペルは、「40-FF」...)(STM32C011J4M7)


Arduino STM32 oled ssd1306 STM32C011

x OLED096UNO-Aです。(売り切れ)
x STM32C011J4M7


目的
OLEDのテスト


結果

![o_cop936.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1f70b639-7723-74fb-da79-f79ac3fc0d3c.jpeg)


![o_con778.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c8631992-057b-dc37-c982-782d5f5b9d0d.jpeg)




プログラム


```c++



//有機ELのSSD1306で豆腐を召喚
//秋月のOLEDとアイテンドウの売り切れOLEDのアドレスは3c
//SSD1306_int_8x8box_C011_1


//ヘッダー
#include <Arduino.h>
#include <Wire.h>


//I2Cに配列を転送する
void write_s(uint8_t *str1, uint8_t len1) {

  Wire.beginTransmission(  0x3c  );

  for (int ii = 0; ii < len1; ii++) {

    //一文字出力
    Wire.write(*str1 ++);

  }//for

  Wire.endTransmission();

}//write_s


//初期化
void setup() {

  delay(3000); //not Delete (絶対消すな)(消しちゃィゃーん)

  //I2Cのポートの変更
  Wire.setSDA(19); //PA10
  Wire.setSCL(18); //PA9

  //I2Cの初期化
  Wire.begin(); //C011
  delay(200);

  //SSD1306の初期化スペル(魔法)
  //0x80,0x8d,0x80,0x14,0x80,0xAF
  write_s( (uint8_t*) "\200\215\200\024\200\257", 6);
  delay(100);


//SSD1306のデータモード
#define DATA_MODE                  0x40


    //8x8の豆腐の表画
    uint8_t databytes[2] = {DATA_MODE,0xFF};
    for (int icount = 0; icount < 8; icount++) {
        write_s(databytes, 2);
    }//for

}//setup


//メインループ
void loop() {
}//loop




```
TOPPERS BASE PLATHOME for Raspberry Pi Picoの補足

## リファンレンス・マニュアル(解説書的なもの)
TOPPERS BASEPLATFORM V1.4.5 Reference Manual(RP) 231212.pdf
https://www.toppers.jp/docs/TOPPERS%20BASEPLATFORM%20V1.4.5%20Reference%20Manual(RP)%20231212.pdf

## 教材
TOPPERS BASE PLATFORM対応版基礎1、2、3セミナー教材のダウンロード
https://www.toppers.jp/edu-download.html#edu-basebp123-download

TOPPERS BASE PLATFORM対応版基礎1、2、3セミナー教材のpdf・ソース
https://www.toppers.jp/download.cgi/base123-111018.zip
別ボード用の資料なので、Pico向けに内容(アドレス等)を置き換える必要あり。

## TOPPERS BASE PLATFORM
https://www.toppers.jp/edu-baseplatform.html
※ドライバは、下記の pdic/rp2040にある。
TOPPERS BASE PLAFORM(ST/RV/RP)
https://www.toppers.jp/download.cgi/asp_baseplatformv1.4.5_012024.tar.gz

以下、参考まで。
---
## 開発環境
TOPPERS BASE PLATFORM(RP)は Windows10/11 上に MSYS2 をインストールし、GCC コンパイラソースをビルドする。ソース公開のためLinuxでも可能

(1) gcc version 5.4(GCC ARM-2016q2-20160926)
(2) gcc version 10.2.1(GCC ARM-2020q4-major)
上記いずれかを、https://developer.arm.com/downloads/-/gnu-rm
から取得する。
・Windows 32-bit版 zip版の方が面倒が少ない。
PATHを追加
export PATH=$PATH:~/asp/gcc-arm-none-eabi-10-2020-q4-major/bin

## インストール手順
「TOPPERS BASE PLATFORM対応版 基礎２セミナーコンテンツ」の１日目の４章 TOPPERS/ASPの導入以降、または、「基礎３セミナーコンテンツ」の１日目の2章 ASPプラットフォーム環境構築以降を参照

TOPPERS/ASPカーネル個別パッケージ asp-1.9.3
https://www.toppers.jp/download.cgi/asp-1.9.3.tar.gz

ARM Coretex-M0アーキテクチャ・GCC依存部パッケージasp_arch_arm_m0_gcc-1.9.6
https://www.toppers.jp/download.cgi/asp_arch_arm_m0_gcc-1.9.6.tar.gz

TOPPERS BASE PLAFORM(ST/RV/RP)
https://www.toppers.jp/download.cgi/asp_baseplatformv1.4.5_012024.tar.gz

メモ：
cd ~/asp/OBJ/RASPBERRYPI_PICO_GCC
mkdir SAMPLE1
../../../configure -T raspberrypi_pico_gcc
OpenOCDで、asp.exeをターゲットのpicoに書き込み
getting-started-with-pico.pdf
参考：Raspberry Pi Pico上でTOPPERS/FMP3をデバッグ
https://qiita.com/2hobata/items/351e8a8a75f544ba0807
src/openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -s tcl
gdb-multiarch -ex "target extended-remote localhost:3333" asp.exe

ROMモニタ 
https://www.toppers.jp/download.cgi/rommon-022123.tar.gz
(予想)rommon-022123\rommon\raspberrypi_pico で、make

解説書のメモ：
TEB001
TEB003
周辺機器を接続するためのI/Fボードなので必須では無い。
LED等の部品はあったほうが良い。<- 買う。
STM32C011とOLED,SSD1306で初期化して遊ぶ(初期化魔法のスペルは、「80-8d-80-14-80-AF」)(STM32C011J4M7)


STM32C011とOLED,SSD1306で初期化して遊ぶ(初期化魔法のスペルは、「80-8d-80-14-80-AF」)(STM32C011J4M7)

Arduino STM32 oled ssd1306 STM32C011


x OLED096UNO-Aです。(売り切れ)
x STM32C011J4M7


目的
OLEDの初期化

説明
スペルを唱える事により、OLEDを始動する

チャージポンプ　起動
ディスプレイオン　発動

画面が点いてノイズがでたらミッション完了
まず、スタートラインにつける


結果


![o_cop935.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1c645a02-17fb-bf8b-d4c0-a734a382e61c.jpeg)


![o_con774.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b1c61ac3-ed5f-e1c6-d3cd-a95f8b201620.jpeg)


![o_con776.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bc05dc07-935a-daac-9959-a36a848c4e5a.jpeg)


![o_con775.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a8eaea72-b744-e9bd-3038-42618362d8b4.jpeg)



プログラム


```c++



//有機ELのSSD1306を魔法のスペルで初期化
//秋月のOLEDとアイテンドウの売り切れOLEDのアドレスは3c
//SSD1306_int_C011_1


//ヘッダー
#include <Arduino.h>
#include <Wire.h>


//I2Cに配列を転送する
void write_s(uint8_t *str1, uint8_t len1) {

  Wire.beginTransmission(  0x3c  );

  for (int ii = 0; ii < len1; ii++) {

    //一文字出力
    Wire.write(*str1 ++);

  }//for

  Wire.endTransmission();

}//write_s


//初期化
void setup() {

  delay(3000); //not Delete (絶対消すな)(消しちゃィゃーん)

  //I2Cのポートの変更
  Wire.setSDA(19); //PA10
  Wire.setSCL(18); //PA9

  //I2Cの初期化
  Wire.begin(); //C011
  delay(200);

  //SSD1306の初期化スペル(魔法)
  //0x80,0x8d,0x80,0x14,0x80,0xAF
  write_s( (uint8_t*) "\200\215\200\024\200\257", 6);
  delay(100);

}//setup


//メインループ
void loop() {
}//loop




```
僕が技術カンファレンスで宿を取らない理由

# はじめに
僕は，全国各地で開催される技術カンファレンスに参加するときに，基本的にホテルなどの寝床を確保せずに現地に向かいます．
この記事では，その理由についてお話しします．

## きっかけ
この記事を書こうと思ったきっかけは，2024年2月10日に開催された，YAPC::Hiroshimaにて，いつものように宿を取らずに現地入りしたところいろんな人に心配されてしまい，申し訳なく思ったというか，弁明というか，なんというかという気持ちになったことです．ちなみに，今この記事を書いているのは，YAPCのアフターイベントの会場近くのカラオケボックスです．現在時刻AM2:37．深夜テンションでお送りします．

# なぜ宿を取らないのか
## 結論
~~当たり前を再認識したいから~~
宿を予約するのがめんどくさいから

## 前提
僕に計画性がないわけではありません(~~いや無計画です~~ そんなことない)
お金にものすごく困ってて宿が"取れない"わけではありません
ホームレスに憧れてるわけではありません

## 理由
僕が宿を取らない理由はズバリ，当たり前を再認識したいからです．
僕は旅行が好きです．なぜなら，初めて行った場所では普段は意識してみないような自然や建物，風景もものすごく新鮮に見えて刺激的に感じることができるし，それにより日々の生活の中でも身近に潜む魅力を再発見できるからです．
***だとしたら，夜にホテルに泊まってウロウロしないのは勿体なくないですか？***
夜にしか見えない景色や，感じ取れない雰囲気がきっとあるはずです．もしかしたら，それは危険な雰囲気かもしれません．安全な場所に移動したいと思うかもしれません．でも，その感情は実際にそういう場面に遭遇しないと味わえないものです．その経験は将来の自分にとって糧となる．
そうは思いませんか？

想像してみてください．
土地勘のない場所にいきなり放り出されて，特に何も準備ないけど無事に夜を明かしてください．と言われたら．
***最高にワクワクしませんか？***
安全な場所はどこか，何をして過ごすか，寝ても大丈夫か，考えなければならないことはたくさんあります．
慣れない土地で想定外のことも起こるでしょう．その土地独自の暗黙のルールを破ってしまうかもしれません．
無事に朝を迎えるためにあらゆる事態を想定して思考を巡らせる．
大変かもしれませんが，それもまた日常では体験できないことのはずです．

## 実績
僕の今までの実績を簡単にではありますが，紹介させていただきたいと思います．
### 1Day インターン
これは技術カンファレンスではありませんが，東京にインターンに行った時のことです．
あれは7月の暑い日のことでした．
次の日横浜に用事があった僕はインターン終了後とりあえず横浜に行きます．
とりあえず，家系ラーメン食べました(美味しかった)
とりあえず，赤煉瓦倉庫に行ったことがなかったので，行きました
とりあえず，夜遅かったので寝ました(野宿．ちゃんとベンチで寝ました)
眩しくて目が覚めました．
どうやら，無事朝がきたようです
**CLEAR!!**

### PIXIV MEETUP 2023
9月末サークルのOBに招待いただきPIXIV MEETUP 2023に参加した時のことです．
イベント終了後もmeetupで知り合った人とカラオケに行きました．楽しかったです
カラオケ後，知り合った人とは別れて先輩と2人になりました
先輩が歌舞伎町周辺にホテルとってたので，とりあえず，ついていきました．
先輩と別れました．
とりあえず，夜の歌舞伎町の観光をしました．
キャッチとか，なぜか立ってる女の人とかいっぱいいて面白かったです
TOHOシネマズを中心に5周くらいしました．
流石に気まずくなりました．
とりあえず，コメダに行きました．
ミックスジュース美味しかったです．90分くらい滞在しました．
とりあえず，駅に行きました．
終電逃したんだろうなぁって人がいっぱいいました．
とりあえず，それに混ざりました．
空が明るくなってきました．
駅のシャッターが開きました．
どうやら始発の時間のようです
山手線に乗って脱出しました．
**CLEAR!!**

### Go Conference mini 2023 Winter IN KYOTO
Go Conference miniに当日スタッフとして参加した時のことです．
あれは12月のクソ寒ぃ日のことでした．
冬場は，屋外で夜を明かすのは普通に生命の危機を感じるので，いい感じに夜を越せそうな場所を探します．
(僕は基本上着は着ずに薄着なので，流石に寒さが堪える)
ネカフェを見つけました
**CLEAR!!**

# おわりに
イベントで遠征する場合，宿は確保しておいた方がいいです．
慣れない土地だと，どういう危険があるかわからないし，何かしらの事件や犯罪に巻き込まれるかもしれません．
今晩の宿ないっていうと周りの人に無駄に心配をかけてしまうかもしれません
...それでも，人生に1回くらいはこういう経験をしてみてもいいんじゃないかなとも思います．
普段の生活がいかに平和なものか，雨風凌げることがいかに大切か，ベッドがあることがいかに嬉しいか，きっと再認識することができるはずです．
当たり前にそこにあるものの重要性がわかるはずです．
頭のおかしい人が何か言ってる，そう受け流して頂いても結構です．
どうぞ，ふかふかのホテルのベッドで安眠してください．
僕はそろそろ二日酔いがキツくなってきました(アフターイベントで飲みすぎた)

それではまた，どこかの技術カンファレンスでお会いしましょう！
ギター指板の音名を覚えたい！！ハッカーが練習アプリを作った結果....

# ギター指板の音名、覚えていますか...?

こんにちは、jikao1919です。
突然ですが、皆さんはギターの指板上の音名を覚えていますか？？？？

私は覚えていません（）。
練習していて自然に覚えられる程練習するのが理想なのでしょうが、毎日マックばかり食べているためか、近年記憶力の逓減が著しく、全く覚えられません。

# もっと効率的に練習したい...。

やはり、もっと効率的に練習したいものです。
そこで、練習用のアプリケーションを自作することにしました。

アプリの挙動は

1. 弦の番号（1弦か、2弦か、...6弦か）と音名(CからBまで12音)をランダムに指定される。（例：1弦でCの音を出すフレットは？）
1. 考慮時間のWait処理
1. 考慮時間の間に考えて答えを出し、実際にピッキングして音を出す。（例：8フレットだな）
1. 答えとなる周波数の音を発生させ、自分の出した音があっているか答え合わせする

となります。正解、不正解は自分の耳で判断してください（）。

# 実際に作ってみる

Pythonを使って実装します。GUIウィンドウ生成に`Tkinter`、正解となる音を出すために`winsound`を使います。

全体コードがこちらになります。

```py:flet_memorize.py
from random import random
import random
import tkinter
import winsound

counter = input("繰り返し回数: ")
interval = input("インターバル秒数: ")
interval = 1000*int(interval)

strings = ["6弦", "5弦", "4弦", "3弦", "2弦", "1弦"]
flet = list(range(0, 12))

# 全音名のリスト
pitch = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
# 1~6弦における0fのpitchインデックス
idx_0f_pitch = [-8, -3, -10, -5, -1, -8]
# 全フレットの音名リスト
pitch_all = [[pitch[i] for i in range(j, j + 12)] for j in idx_0f_pitch]

# 6弦ギター（0~11f）の音域をカバーする周波数(A1~A4 = 55Hz~880Hz)
freq = [55 * 2 ** ((1/12) * i) for i in range(4 * 12 + 1)]
# 1~6弦における0fのfreqインデックス
idx_0f_freq = [7, 12, 17, 22, 26, 31]
# 全フレットの周波数リスト
freq_all = [[freq[i] for i in range(j, j + 12)] for j in idx_0f_freq]

def strings_deter(idx_pre):
    idx = strings.index(random.choice(strings))
    while idx_pre == idx:
        idx = strings.index(random.choice(strings))
    return idx

def flet_deter(idx_pre):
    idx = flet.index(random.choice(flet))
    while idx_pre == idx:
        idx = flet.index(random.choice(flet))
    return idx

def ring(f):
    winsound.Beep(int(f), 1000)

# Window表示を関数として定義
def disp(mytxt, mytime):
    root = tkinter.Tk()
    # テキストを表示させる
    w = tkinter.Label(root, text=mytxt, font=("normal", 20))
    w.pack()
    # 決まった時間後に閉じる
    root.after(mytime,lambda: root.destroy())
    # 継続して表示
    root.mainloop()

strings_idx = -1
flet_idx = -1

for num in range(int(counter)) :
    strings_idx, flet_idx= strings_deter(strings_idx), flet_deter(flet_idx)
    disp(strings[strings_idx], int(interval*0.5))
    disp(pitch_all[strings_idx][flet_idx], interval)
    f = freq_all[strings_idx][flet_idx]
    ring(f)
```

# うおおおおおおおおおお動いたあああああ

インターバル秒数に考慮時間を入れてください。おすすめは5秒ぐらいです。
繰り返し回数は問題の出題数です。やりたいだけ入力してください。おすすめは50回ぐらいですかね...。

アプリはexeファイルにまとめてgitで公開しています。

https://github.com/Jikao1919/test/tree/main/guitar/flet_memorize.exe

画面右側のDownload raw fileを選択していただくと、実行ファイルをダウンロードできます。

jikao1919でした＾＾
github copilot の認証


# github copilot の認証

急に github copilot が使えなくなったので，そのときの対処法をメモしておきます．

## こうなった理由

毎回開くたびに，Github Copilot の認証が必要になり，邪魔だったため，一旦**Github 認証**という拡張機能を無効にしたらこうなった．

## 結果

Github 認証は拡張機能と書いてあったので拡張機能から有効にしようとしたが，拡張機能一覧にはなかった．

調べたところ，同じような人たちに遭遇．

https://github.com/orgs/community/discussions/11324

無事解決した．

## 解決法

上で紹介されていた方法を簡単にまとめる．

ファイル -> ユーザー設定 -> プロファイル -> プロファイルコンテンツの表示を押す．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/75e4391d-f266-95d5-eab3-2b0ddbebe5ca.png)

サイドバーに表示されたら，**Github 認証**が無効になっている（チェックはついていても無効の場合はある）ので有効にする．

完了．

ちなみに，有効化されている場合は，**Github 認証**がプロファイルコンテンツに表示されないっぽい．

# 教訓

とりあえず消してみようは良くない．
ServiceNow CEOのBillがAIの生産性向上をニュースで語ってたので、AIで要約した


## ServiceNowとは...
同企業は、SaaSでもPaaSでも活用されるローコードクラウドサービスを提供しています。そのサービスは米国で開発され、米国の大企業を中心に広く受け入れられており、日本でも日経225に採用されているグローバル企業を中心に導入が進んでいます。以下はそのブランドイメージロゴです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/d8bd8635-e68b-45f9-0c50-3edd2b749762.png)
### CEOのBillとは...
> William R. McDermottはアメリカのビジネスマンであり、現在ServiceNowのCEOです。 ServiceNowの前は、テクノロジー企業SAPSEのCEOを務めていました。共同CEO兼CEOとしての在職中、SAPの市場価値は390億ドルから1,560億ドルに増加しました。

コメントでは、「ボンドの悪役」と書かれているが、この方は非常に素晴らしい能力を持っています。AIではないかと疑われるほどです。
![Screenshot_20240211-010201~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/edd8199c-19a8-a256-a084-77109aa9d960.png)

ServiceNowは、半年に一度のメジャーリリースであるVancouver（2023.8）から、生成AIと業務推進の全面的な活用を打ち出しています。生成AIに関しては、Release Noteを確認しながら動向を注視しています。Youtubeで有用なリソースを探していたところ、最近（三週間前）のBillのインタビューを見つけました。とりあえず確認してみます。しかし、AIの生産性についての話題なので、こちらも要約の生産性向上として、内容をAIで要約してみました。以下の[NoteGPT](https://notegpt.io/youtube-video-summarizer)というサイトで要約しました。
要約文は英語で出力されるため[Poe](https://poe.com/)というサイトで翻訳しました。


#### 要約：
ServiceNowの会長兼社長兼CEOであるBill McDermottは、彼らのAI技術が企業の変革と生産性向上にどのように役立っているかを説明しています。彼らは、エンジニアが新しいアプリケーションの設計図をテキストで入力することができるプラットフォームを開発し、コーディング時間を50％削減しています。ServiceNowはまた、15分でセットアップできる仮想エージェントなど、すぐに使用できる特定のドメイン向けのソリューションを作成しています。McDermottは、ビジネスの変革の必要性とAIの革新と生産性向上の可能性を強調しています。

#### ハイライト
00:00-00:45 🤖 ビル・マクダーモットは、ServiceNowのAI技術がビジネスを変革し、エンジニアが新しいアプリケーションの設計図をテキストで送信できることにより、生産性を50％向上させていることについて説明しています。
01:18-01:40 📱 このプラットフォームにより、仮想エージェントなどの特定のドメイン向けのソリューションを作成できます。これにより、わずか15分でセットアップが可能となり、生産性の大幅な向上がもたらされます。
02:14-02:35 💰 マクダーモットは、AIイニシアチブのコストは顧客にとって懸念事項ではなく、生産性を向上させ、成長を促進できる場合には問題にならないと強調しています。
02:36-03:13 💼 マクダーモットは、AIによる仕事の喪失についての懸念に対処し、技術が常に成長を促進してきたと主張し、仕事の置き換えの恐れが過大評価されていると述べています。

#### 主な洞察
🚀 ServiceNowのAI技術は、コーディングプロセスを効率化し、サイクルタイムを短縮することで、ビジネスの運営方法を革新しています。これにより、エンジニアはイノベーションに集中し、生産性の向上を推進することができます。 （タイムスタンプ：00:00-00:45）
💡 ServiceNowプラットフォーム上で特定のドメイン向けのソリューションを作成することで、企業は業界に合わせたすぐに使用できるアプリケーションを迅速に導入することができます。これにより、効率が向上し、従業員はより効果的に業務を遂行することができます。 （タイムスタンプ：01:18-01:40）
💰 顧客は、生産性への変革的な影響がコストを上回るため、AIイニシアチブに投資する意欲があります。 ServiceNowのプロジェクトは、著しい生産性の向上を示しており、投資は価値があります。 （タイムスタンプ：02:14-02:35）
🌐 ビジネス変革の管理は、デジタルトランスフォーメーションと生成AIを組み合わせたもので、企業が適応し繁栄するために重要です。これには、技術から人々、顧客までを共通のプラットフォーム上で考慮することが含まれます。 （タイムスタンプ：02:36-03:13）

### 要約の要約：
・わずか15分でセットアップが可能となり、生産性の大幅な向上がもたらされます。
・AIイニシアチブのコストは顧客にとって懸念事項ではなく、生産性を向上させ、成長を促進できる場合には問題にならない
・AIによる仕事の喪失についての懸念は過大評価である
・ビジネス変革の管理は、デジタルトランスフォーメーションと生成AIを組み合わせたもの