OmniAICreator/Qiita-1.07M huggingface dataset:
ExcelVBA_tsuichi_work

# 要件定義

### 複製の作成:
・各 .xlsx ファイルを処理する前に、VBA実行ファイルを複製します。複製ファイルは、元のVBAファイルのコピーとして、新しい名前で保存されます。
・複製ファイルの名前は「実行後_」＋ .xlsx ファイル名（拡張子除く）＋ .xlsm です。


### データのコピペ処理:
・複製ファイルが作成された後、その複製ファイルに対して処理を行います。
・各 .xlsx ファイルの「sheet1」のデータを複製ファイルの指定されたシートにコピーします。
　条件分岐:
　.xlsx ファイル名に「店舗」が含まれている場合: 複製ファイルの「貼付_店舗」シートにコピー。
　.xlsx ファイル名に「店舗」が含まれていない場合: 複製ファイルの「貼付_本社」シートにコピー。

### 保存:
・データ処理が完了した後、複製ファイルを保存します。保存するファイル名は、「実行後_」＋ .xlsx ファイル名（拡張子除く）＋ .xlsm です。

### 次のファイル処理:
・次の .xlsx ファイルに対しても、同様にVBA実行ファイルを複製し、処理を行います。


# コード

### MainProcess ファイルを開くループ処理

```
Sub MainProcess()
    Dim folderPath As String
    Dim fileName As String
    Dim wb As Workbook
    Dim newFileName As String
    Dim newWorkbook As Workbook
    
    ' VBAが実行されるフォルダを取得
    folderPath = ThisWorkbook.Path & "\"
    
    ' フォルダ内の最初の .xlsx ファイルを取得
    fileName = Dir(folderPath & "*.xlsx")
    
    ' すべての .xlsx ファイルを処理するループ
    Do While fileName <> ""
        
        ' VBAファイルを複製して新しいファイルを作成
        newFileName = folderPath & "実行後_" & Left(fileName, InStrRev(fileName, ".") - 1) & ".xlsm"
        ThisWorkbook.SaveCopyAs newFileName
        
        ' 新しく保存されたVBAファイルを開く
        Set newWorkbook = Workbooks.Open(newFileName)
        
        ' 現在の .xlsx ファイルを開く
        Set wb = Workbooks.Open(folderPath & fileName)
        
        ' コピペ処理を実行★★★★★★★★★★★★★★★★★★★★★
        
        Call CopyDataToSheetWithCondition(newWorkbook, wb, fileName)
        
        '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
        
        ' 開いた .xlsx ファイルを閉じる
        wb.Close False
        
        ' 新しく保存されたVBAファイルを保存
        newWorkbook.Save
        
        ' 新しく保存されたVBAファイルを閉じる
        newWorkbook.Close
        
        ' 次のファイルを取得
        fileName = Dir
    Loop
    
    ' 終了メッセージ
    MsgBox "全てのファイルが処理されました！"
End Sub
```

### コピー処理
```
Sub CopyDataToSheetWithCondition(targetWorkbook As Workbook, sourceWorkbook As Workbook, fileName As String)
    Dim sourceSheet As Worksheet
    Dim targetSheet As Worksheet
    Dim lastRow As Long
    Dim targetSheetName As String
    
    ' コピー元のシート
    Set sourceSheet = sourceWorkbook.Sheets("sheet1")
    
    ' 「店舗」がファイル名に含まれているかをチェックして、適切なシート名を設定
    If InStr(fileName, "店舗") > 0 Then
        targetSheetName = "貼付_店舗"
    Else
        targetSheetName = "貼付_本社"
    End If
    
    ' 以下にコピペ処理を実行★★★★★★★★★★★★★★★★★★★★★
       
    '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

End Sub
```
AlmaLinux8の自動セキュリティアップデートシェルスクリプト

### 動作対象
- AlmaLinux 8
- 通知メールを送信したい場合は、`dnf install mailx`の実施および別途メール送信設定が必要

### このスクリプトについて

`dnf-automatic`を使ったパッケージの自動アップデートのようなことをシェルスクリプトで作成してみました。異なる点としては、カーネルアップデートを適用させるためにOS再起動もできるようになっています。
- `--reboot` オプションでOS再起動も指定できるようになっています。
- `dnf autoremove`, `dnf clean all` で次回起動以降のディスクスペース節約する処理追加。（※依存されなくなったものを削除`dnf autoremove`はまずいという環境では任意で当スクリプトから消してください）

### 設置手順
- `/root` ディレクトリに`security_update.sh`を設置。（場所は任意）
- オーナー・グループを、`chown root:root security_update.sh`に設定。
- パーミッションを、`chmod 744 security_update.sh`に設定。
- `crontab` にスクリプトを追記。
```sh:（例）28日午前4時にセキュリティアップデート後再起動する。
# Linuxセキュリティアップデート
0 4 28 * * root /root/security_update.sh --reboot
```

### シェルスクリプト
- セキュリティアップデートのみにしている。
- 通知メールアドレス、メール送信処理もしています。
- dnf 以外にもsnap 更新もしています。
- `/var/log/update_log/update_log` にメール通知内容と同じ内容でログを出すようにしています。
- リブート前に、`systemctl stop httpd`しているが実施するかは任意。`apachectl -k graceful-stop`ではないのは、apachectl を使用して httpd に引数を渡すことはサポートされなくなるため。（まぁ、なんとかなるっしょ！でとりまアパッチ停止しま～す、か～ら～の～OS再起動しま～す）
```bash:security_update.sh
#!/bin/bash

function usage {
    cat <<EOF
AlmaLinux８のセキュリティアップデートシェルスクリプト

使用方法: $(basename ${0}) [引数]
   もしくは: $(basename ${0}) [help|--help|-h]  ヘルプ(このメッセージ)を表示し終了する
   もしくは: $(basename ${0}) [version|--version|-v]  バージョン情報を表示し終了する

引数:
   --reboot             セキュリティアップデート後にOS再起動を実施する

説明:
   AlmaLinux８のセキュリティアップデートを実施します。
   root権限ユーザーでの実施をしてください。
EOF
}


function version {
    echo "$(basename ${0}) version 1.0 "
}


function proc() {
    mailaddress="通知メールアドレス"
    folderpath="/var/log/update_log"
    filepath=${folderpath}/update_log

    if [ ! -d $folderpath ]; then
        mkdir ${folderpath}
    fi
    if [ ! -e $filepath ]; then
        touch ${filepath}
    fi

    dnf autoremove
    dnf clean all
    dnf upgrade --security -y 2>&1 | tee ${filepath}
    snap refresh 2>&1 | tee -a ${filepath}
    cat ${filepath} | mail -s "【通知】 - AlmaLinux 8 SECURITY UPDATE" ${mailaddress}

    if [ $# = 1 ]; then 
        if [ $1 = "--reboot" ]; then 
            systemctl stop httpd
            reboot
        fi
    fi
}


case ${1} in 
    help|--help|-h)
        usage
    ;;
    version|--version|-v)
        version
    ;;
    *)
        proc $1
    ;;
esac
```

### さいごに
たぶん設置しても大丈夫だろう的な温度感で著者は考えているためOS再起動失敗したらのことを考慮していないまま◯◯社で本番設置しています。ワンオペ職場のためコードレビューしてもらえません😢。親切な兄貴、姉貴からここ問題ありそう的な指摘をもらえたらありがたいです。ぺこりん子。
date('Ym', strtotime('2024-08'))とdate('Ym', strtotime('202408'))の罠


`202408`は**Ym**と評価されるのではなく、**His**として評価されるので実行日の20時24分08秒になります。気をつけてください
```php
date('Ym', strtotime('2024-08')) !== date('Ym', strtotime('202408'))
```

https://www.php.net/manual/ja/datetime.formats.php#:~:text=%27t%27%3F-,HH%20MM%20II,-%22040837%22%2C%20%22T191919%22
迷いたくても、迷えない！

あっという間に75になってしまいました。
久しぶりの投稿です。
![turetette.me.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5135/412d35a6-56c3-58af-d47b-e8cfe30e9130.png)
復帰のご挨拶代わりに。
道案内はいろいろありますが、私はどれを使っても迷います。
仕方ないので、作りました。

運営代行者探しています。（自分であげてもいいのですが、もうじきいなくなるので）
VScodeプラグイン 各言語おすすめ

VScodeの拡張機能について各言語ごとにまとめる

## 共通

### Japanese Language Pack
　日本語化するための言語化パック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/dab28482-ae62-81f6-c8c9-d89dad705f12.png)

### Code Spell Checker
スペルチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/b106fc87-20c2-9cf9-b235-b6c52f836d0e.png)

### vscode-icons
アイコン表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/48d74c47-fa84-433c-461b-f448ab0c9157.png)


## Git
### Git History
Git操作簡易化（過去履歴関連）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/cedc626a-64ca-aaba-5539-7660227fe996.png)

### GitLens
Git操作簡易化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/3b2c8a55-9499-4b71-4096-ea618b737ff7.png)

## PHP
### PHP Intelephense
コード補完や定義元へのコードジャンプ・クラスインポート等
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/b2256f3d-aad6-f306-9ebf-1b36d807ecb2.png)

### PHP Debug
VScode上でのXdebugの使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/366c6973-0e63-bf22-1039-f57ee42b813b.png)

### PHP import checker
使用していないクラスのインポートを強調
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/69fd8e07-216f-beb9-e1e9-455b52806338.png)


## Laravel
### Laravel Extension Pack
Laravelに関する拡張機能パック（下記拡張機能全て+α）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/f717087e-59d7-7b21-e75b-fa89610c5333.png)

### Laravel Snippets
Laravelの構文の自動補完
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/4331efce-09a4-07bd-5d1f-97541bdb7d37.png)

### Laravel Extra Intellisense
Laravelコード補完
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/9ef85185-a436-99e6-0e61-3b4ecd22b5cf.png)

### Laravel Blade Snippets
Bladeファイルのコード補完
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/98096f32-9ed8-3016-df5c-0558f765f33b.png)

### Laravel Blade formatter
Bladeファイルの自動整形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/84e3cd91-31f9-fa10-a121-d8fa8687224c.png)

### Laravel goto view
Viewファイルへのジャンプ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/c1d8c865-b152-f18c-5609-8f2444664387.png)

### laravel-jump-controller
ルーティングファイル等からコントローラーへのジャンプ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/8da52ec7-eddd-b291-84b2-9577fa8d7a7f.png)

### laravel-goto-components
Bladeコンポーネントタグからコンポーネントファイルへのジャンプ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/2c81cab7-9009-28e5-3c47-4db6d7e23ced.png)

## プラグイン以外の設定
### ユーザー設定
・Wrap Line Length
　コードの自動整形（Ctrl+F）の1行あたり最大文字数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879789/d7d546c0-4eb4-7006-f8d2-adaaccc0e7da.png)
Laravel PHPコマンドを使いこなす

LaravelでのWebアプリケーションの作る際の初期段階として、migrationを使用したDB操作のやり方について随時更新していく

### DBの作成
migrationではDBの作成自体はすることができないため、PHPMyAddmin等でDBをあらかじめ作成しておく

DB作成については[こちら](https://qiita.com/aMASSO/items/08e1ee8b2245d0f524e4)


### テーブル作成
```
php artisan make:model {table名} -m
php artisan migration
```

### ログイン機能の実装
デフォルトのログイン機能を実装
```
composer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev
```
初めてのインターン体験記

## 初インターン参加 
先日[「【学生向け】ICI&SST 夏季合同インターンシップ 2024」](https://www.securesky-tech.com/2024/07/08/7537/)に参加してきました。  
初めてのインターンシップで期待と不安を抱きながら臨んだので体験記を書いてみようと思います。  

## なぜこのインターンに参加したのか？
  
このインターンを知ったきっかけは、大学の学部Teamsに教授が「こんなインターンがあるよ！」と投稿していたのが目に留まり、調べてみたことが始まりです。  
私はまだ大学2年で、セキュリティに興味はあるものの業界については漠然とした知識しかありませんでした。そのため、これは良い機会だと思い応募することにしました。  

インターンでは「Webセキュリティ」「マネジメント＆インテリジェンス」「マルウェア解析」の中から専門課題を選び、最終日に課題をまとめて報告するという内容でした。  
講義の内容が分からなくても、調べて頑張ればなんとかなるだろうという気持ちもありましたw  
  
## インターン1日目
  
1日目はハイブリッド開催で、私はオンサイトを選択しました。    
まずはこのインターンで取り組む内容の説明があり、その後各専門テーマの講義が始まりました。    
  
最初は「Webセキュリティ」についての講義があり、Webサイトの脆弱性について学びました。    
認証の突破や権限の設定不備などを具体的な例をもとに学び、その後SQLインジェクションやXSSなどの代表的な脆弱性について学習しました。  
演習サイトを用いて実際に体験したのが初めての経験で、勉強になりました。  
  
お昼休憩を挟んで次に「マルウェア解析」の講義を受けました。  
個人的に今回のインターンシップで一番楽しみにしていたのがマルウェア解析だったので、どんなことを学べるのだろうと期待していました。  
事前連絡で講義中にデモを行うために「IDA free」と「x86dbg」をインストールするよう指示されていたので、準備して講義に臨みました。  
マルウェア解析の概要を学んだ後、具体的な解析手法へと進みました。  
デモ用のファイルが用意されており、逆アセンブリコードへの変換やUPXのパックをアンパックする方法を学びました。  
~~私は講義内で十分に理解できず課題でかなり苦戦することになりました~~  
  
この日最後は「マネジメント＆インテリジェンス」の講義を受けました。  
セキュリティとは何かについて考えさせられた後、セキュリティの歴史などを学び、データの価値について機密性・完全性・可用性の観点から考察しました。  
そして、脅威インテリジェンスについての説明を受けました。  
専門用語が多く、理解するのが難しかったです...  
  
初日にこれらの3つの講義を受け、この中から私はマルウェア解析の課題に取り組むことに決めました。  
  
## 課題に取り組む日々
初日のインターンが終わり、出された課題を解く週間になりました。  
マルウェア解析課題では、ファイルを解析して埋め込まれた{FLAG}を見つけて報告書にまとめるというCTFっぽい形式の課題でした。  
私はしょっぱなから解析につまずくことになり、調べてもよくわからず１日が経過し諦めて講師の方に質問をすることにしました。  
講師の方が分かりやすく講義中にやったデモの解説をテキストで送ってくださり、なんとか第一の関門を超えたあたりでこうやってやるのかとコツをつかみ、解析が楽しくなってきました。  
  
## インターンシップ2日目
初日のインターンシップが終わって一週間がたったタイミングで自由参加の日がありました。  
この日はSSTのオフィスを解放していただき、同じインターンシップに参加している方々と雑談しながら各自の進捗状況を話したりして楽しい時間を過ごしました。  
  
## インターンシップ3日目最終日  
課題が出て2週間が経ち、ついに最終日の課題報告会をしてきました。
最終日は全員がオンサイトに集まり、取り組んだ課題を持ち寄って講師の方に講評をいただきました。  
講評では報告書の内容から体裁まで評価していただき、今後のレポート作りに活かせる点は活かしていこうと思いました。  
また、課題解説では盲点を突かれまくっており、疑う意識を持つようになりましたw  
~~戒め:書いてあることを鵜吞みに信用しない~~  
  

## まとめ
初めてのインターンシップでどんなことを記録したらいいか分からなくだらだらと書いてしまいましたが、有意義なインターンシップになりました！  
マルウェア解析を初めて行い、分からないことだらけの中進めていくのがとても楽しかったです。
  
私のこのインターンの良かった点は  
・ 講義形式でセキュリティ初学者でもついていけた  
・ 講師の方々がすごい人だらけで勉強になった  
・ インターンシップ生と色々なお話ができた  
・ 楽しくインターンシップを終わることができた  
~~・ 伊藤忠の社食が美味しかった~~  
です！  

インターンシップが終わってもセキュリティなどの勉強はずっと続くので、これからも頑張っていこうと思います！  

p.s. 今回の期間で解けなかった解析の部分は時間のある時に進めてもう一度報告書を作って提出しようと思ってます～
Windows10のWSL2内にDocker Engineを入れてVSCodeで動かす

キレイなReact開発環境を作るのに結構調べるのが大変だったのでメモです。

## Windows 10
### 環境構築と開発に必要なものをインストール
1. Gitをインストール
   https://git-scm.com/download/win
2. VSCodeをインストール
   https://code.visualstudio.com/docs/setup/windows
3. WSL（Ubuntu）をインストール
   https://learn.microsoft.com/ja-jp/windows/wsl/install
4. WSLにDocker Engineをインストール
   https://docs.docker.com/engine/install/ubuntu/
5. VSCodeの拡張機能パック「Remote Development」をインストール
   https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

### 任意のGitリポジトリ内のDockerfileを使ってコンテナを立ち上げる（以下はviteで構築されたReact開発環境を想定）
1. VSCode内のターミナルでWSL内の任意のディレクトリにGitリポジトリ（ルートディレクトリにDockerfileあり）を`git clone`\*
8. cloneして作成されたディレクトリをVSCodeで開く
9. VSCodeで「Reopen in Container」を実行してDockerコンテナを起動・接続（「Remote Development」内の拡張機能「Dev Containers」を使用）
   https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers
10. 作業したいブランチに移動
11. ターミナルで`yarn install`を実行してmoduleをインストール
12. ターミナルで`yarn dev`を実行して開発環境をビルド
13. http://localhost:5173/ を開く

\*: Windows上のディレクトリに配置されたプロジェクトからDockerを立ち上げるとビルドとホットリロードに時間がかかるのとCPUの利用率が高くなるためWSL内にプロジェクトを配置する（参照：[https://vitejs.dev/config/server-options.html#server-watch](https://vitejs.dev/config/server-options.html#server-watch)）
Git_作業ディレクトリとステージングエリア



#### 作業ディレクトリ（Working Directory）

作業ディレクトリとは、パソコンで確認できるディレクトリのことです。たとえば、私の`learngit`フォルダが作業ディレクトリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809422/e7669e55-bf27-baf7-530d-7da8c3d7b595.png)


#### リポジトリ（Repository）

作業ディレクトリには`.git`という隠しディレクトリがあり、これは作業ディレクトリではなく、Gitのリポジトリです。

Gitのリポジトリには多くのデータが保存されていますが、その中でも最も重要なのは`stage`（または`index`とも呼ばれる）と呼ばれるステージングエリアです。また、Gitは自動的に最初のブランチ`master`と、その`master`を指すポインタ`HEAD`を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809422/b2e338fb-d1c2-d5ed-2cc1-13e4fdb2dd99.png)


ファイルをGitリポジトリに追加する際には、次の2ステップで実行されます。

1. `git add`コマンドを使ってファイルを追加します。実際には、ファイルの変更をステージングエリアに追加するという作業です。
2. `git commit`コマンドを使って変更をコミットします。これは、ステージングエリアの全ての内容を現在のブランチにコミットする作業です。

Gitリポジトリを作成した際、Gitは自動的に`master`という唯一のブランチを作成するため、`git commit`コマンドを実行すると、変更は`master`ブランチにコミットされます。

簡単に言うと、ステージングエリアにはコミットしたいファイルの変更をすべて置いておき、その後、一度にすべての変更をコミットします。

実際にやってみると理解が深まります。まず、`readme.txt`を修正し、以下のような行を追加します。

```plain
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
```

次に、作業ディレクトリに`LICENSE`という新しいテキストファイルを追加します（内容は何でも構いません）。

`git status`コマンドで状態を確認します。

```plain
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   readme.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	LICENSE

no changes added to commit (use "git add" and/or "git commit -a")
```

Gitは非常に明確に状態を教えてくれます。`readme.txt`は変更されており、`LICENSE`はまだ追加されていないため、`Untracked`の状態です。

ここで、`git add`コマンドを2回使用して、`readme.txt`と`LICENSE`をステージングエリアに追加し、もう一度`git status`で状態を確認します。

```plain
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   LICENSE
	modified:   readme.txt
```

これで、ステージングエリアの状態は次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809422/25618b60-f481-654f-fd6b-5642e6c971dc.png)


つまり、`git add`コマンドは、コミットするすべての変更をステージングエリアに置く作業です。そして、`git commit`コマンドを実行すると、ステージングエリアにあるすべての変更を一度にブランチにコミットします。

```plain
$ git commit -m "understand how stage works"
[master e43a48b] understand how stage works
 2 files changed, 2 insertions(+)
 create mode 100644 LICENSE
```

一度コミットすると、作業ディレクトリに変更がない場合、作業ディレクトリは「クリーン」な状態になります。

```plain
$ git status
On branch master
nothing to commit, working tree clean
```

現在のリポジトリの状態は次のようになり、ステージングエリアには何も残っていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809422/482a738c-79fa-b4dc-91a5-48dc4aac5831.png)

------------------------

長文をお読みいただき、ありがとうございました。

ご質問や異論があれば、コメントをお願いします。

( •̀ ω •́ )y
DJI Assistant2のシミュレーター画面で軌道が確認しやすくする方法

# 問題点
DJI Assistant2 のシミュレーター画面が緑背景でどのように動いているか分かりづらい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/98d11649-1281-6671-a654-a8c93f076e93.png)

# 解決策
画面を右クリックして「Setup」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/7ff7fe98-56a3-9d36-267e-3a044d7ceafb.png)

「show trac」にチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/f0e0e616-b4e2-2400-e52c-c6a1fc0a6336.png)

すると軌道が分かる。Clear traceで先ほどの軌道を消せる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/2da49bbc-74f9-1978-7084-7e166204493b.png)
Visual Studio Code Tips

# コマンドパレットの開き方

> Ctrl + Shift + P

ユーザsetting.jsonを開く場合は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/1bfb8d42-e0a3-ff57-afe0-83f63c812a12.png)
を選択

# Black Formatter

Microsoftの拡張機能 **Black Formatter** を採用している場合している場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/eefd3808-be5c-6255-d080-302d2fb548db.png)

setting.jsonではなく拡張機能の設定で設定を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/3e9ea2fd-1f28-b8f1-00ef-4ebe9e156c77.png)
カバレッジレポートの見方（メモ）

## はじめに
Jestテストを実行して、カバレッジレポートを出力しました。
カバレッジレポートの見方と活用の仕方を、備忘録として記録したいと思います。

## カバレッジレポートとは？
テストがどの程度のコードをカバーしているかを示すものです。各行が実際にテストで実行されたかどうかを測定し、未カバーの部分を特定するのに役立ちます。このレポートをもとに、テストの改善が必要な部分を見つけることができます。
実際に出力したものがこちら⇩

![スクリーンショット 2024-09-12 10.02.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/237281fd-8f3b-990b-2726-5b2515420e8a.png)

### レポートの基本構成
- <font color="green">**File:** テスト対象のファイルのパスとファイル名</font> 
- <font color="red">**% Stmts:** ステートメントカバレッジ (Statements)</font> 
    - テストで実行されたコード内の命令文の割合
    - if や return のような命令文がテストされた割合
- <font color="red">**% Branch:** 分岐カバレッジ (Branches)</font> 
    - 条件分岐のカバー率を表す
    - if や switch などの分岐で、すべてのパス（条件が真の場合も偽の場合も含む）がテストされているかを示す
- <font color="red">**% Funcs:** 関数カバレッジ (Functions)</font> 
    - 関数やメソッドがテストで実行された割合
- <font color="red">**% Lines:** 行カバレッジ (Lines)</font> 
    - 実行されたコード行の割合
    - コードのどの行が実行されたかを示す
- <font color="red">**Uncovered Line #s:** テストされていない行番号のリスト</font>
    - このリストに載っている行はテストでカバーされていないため、追加のテストが必要

ふむふむ、、、ということは

![スクリーンショット 2024-09-12 10.02.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/5b850537-1c57-bec8-da86-6e71f45e3d67.png)

### 各列の解釈：
- **All files:全体のカバレッジ** 
    - テストされているステートメントの割合が 74%、
    - 条件分岐のカバレッジが 64.28%、
    - 関数は 90.9%、
    - 行は 72.66%

- **context/logger.ts と prisma/index.ts:**
    - 100% カバレッジです。すべてのステートメント、分岐、関数、行がテストでカバーされています
- **router/categories.ts:**
    - ステートメントのカバレッジが 57.69%、分岐のカバレッジが 14.28% とかなり低めです。特定の分岐がほとんどテストされていないことがわかります
    - **Uncovered Line #s 列**テストされていない行番号 (14-16, 30-32, 47, etc.) に対するテストを追加する必要があります
- **router/transactions.ts:**
    - ステートメントカバレッジが 79.72%、分岐カバレッジが 78.57% 
    - これも、特定の行 (22-24, 53, etc.) がカバーされていないので、追加のテストが必要です

### 改善ポイント：
分岐カバレッジが低いファイル (router/categories.ts など) は、特に if 文や switch 文の分岐条件に対するテストが不足しています。分岐のすべてのケースをテストするようにテストケースを追加する必要があります。
テストされていない行がリストアップされている場合、その行のコードに対するテストが不足しているので、追加のテストを書くことが推奨されます。

### 終わりに
今回は、トランザクションの処理機能に関する処理を重点的にテストしたため、カテゴリーのCRUD処理は低めという結果でした。
重点的に確認するべき機能と時間の制約を考慮して、保守性を高めつつ、迅速な実装ができるように意識したいです。
最後まで、読んでいただき、ありがとうございました！
ゼロから作る Deep Learning; Kerasで実装

# ゼロから作る Deep Learning; Kerasで実装

輪読編でみたことをKerasで実装してみます。

https://qiita.com/kokeshiM0chi/items/64cd83e559c1acea6da6

## データセット作成

今回は、入力信号の数（ノード数またはニューロン数）を5個にします。5個の数を持つ配列を250個作り、各データ（5個の数を持つ配列）の総和が2.5よりも大きければ、 1、そうでなければ０を返す処理を250個分行います。labelsには0か１の値が入ります。

### ラベル作成

```math
\begin{equation} label =
\left\{ \,
    \begin{aligned}
    & 1 \space (\sum_{i=1}^5data[i] > 2.5) \\
    & 0 \space (\sum_{i=1}^5data[i] <= 2.5)\\
    \end{aligned}
\right.
\end{equation}
```


実装です。

データセット作成
```python
import numpy as np
data = np.random.rand(250,5)
labels = (np.sum(data, axis=1) > 2.5) * 1
```

今回は分類問題で、入力は５次元、出力は２次元。
入力値の総和 > 2.5 ならば、`[0, 1]`そうでなければ、`[1, 0]`となるようなラベルを生成する。

ラベルの生成
```
from keras.utils import to_categorical
labels = to_categorical(labels)
```

### モデル作成

このような入出力関係を持つモデルを作成します。（イメージ）

5次元なので、 項数$n = 5$ です。

```math
\begin{equation} y =
    \left\{
    \begin{aligned}
         1 \space (\sum_{i = 1}^5 w_ix_i + b > 0) \\
         0 \space (\sum_{i = 1}^5 w_ix_i + b <= 0) \\
    \end{aligned}
    \right.
\end{equation}
```


今回は、活性化関数に`relu`を指定します。

モデルの作成
```
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
    Dense(20, input_dim=5),
    Activation('relu'),
    Dense(2, activation='softmax'),
    Activation('softmax'),
])
```
プロセスの状態遷移

# 5状態プロセスモデル

オペレーティングシステムにおいて、プロセスがシステム内でどのように動作し、状態がどのように遷移するかを理解する上で非常に重要な概念です。このモデルでは、プロセスがとりうる状態を5つに分類します。

## 5つの状態

1. **新規状態 (New)**
   - システムに新しく到着したプロセスが置かれる状態です。

2. **準備状態 (Ready)**
   - CPUの使用を待っている状態です。実行可能ですが、他のプロセスがCPUを使用しているため、実行の順番を待っています。

3. **実行状態 (Running)**
   - CPUで実際に命令を実行している状態です。

4. **待機状態 (Waiting)**
   - あるイベント（例えば、I/Oの完了、他のプロセスの終了など）を待っている状態です。この状態の間、CPUは他のプロセスに割り当てられます。

5. **終了状態 (Terminated)**
   - 実行が完了し、システムから削除される状態です。


![Untitled diagram-2024-09-12-013142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564975/6f26d432-3ee8-c044-02e4-b873518c2196.png)
【Azure/Firebase】Azure PipelinesでCLIツールのインストールに失敗するのを解決する方法

## はじめに

Azure Pipelineでアプリを`Firebase App Distribute`に配布しています。
このパイプラインで本日(2024/09/12)突然エラーが発生したため、解決方法を記録しておきます。

## 環境

- Firebase CLI 13.17.0
- Azure Pipeline
  - ubuntu-latest (Ubuntu 22.04) 
  - macos-13

## 起きたこと

以下の公式サイトにある、「Standalone Binary」の手順でインストールしていました。

https://github.com/firebase/firebase-tools

具体的には以下のコマンドを使用しインストールする方法を使用していました。

```sh
$ curl -sL https://firebase.tools | bash
```

ですのでパイプラインの定義は以下のようになります。(前後省略)

```yml
  - script: curl -sL https://firebase.tools | bash
    displayName: Install Firebase CLI
```

すると以下のようなエラーが発生していました。

```
-- Setting permissions on binary...
/usr/local/bin/firebase: line 1: Not: command not found
Something went wrong, firebase has not been installed.
Please file a bug with your system information on Github.
https://github.com/firebase/firebase-tools/
-- All done!
```

## 原因

最近アップデートされていたようで、関連のLinuxバイナリの最新が欠落していることが原因のようです。
古いものですが内容は以下のIssueと同じようです。

https://github.com/firebase/firebase-tools/issues/3234

アップデート直後でしたので、もう少し様子見たら解決した可能性もあります。

![firebase-cli-version-v13.17.0-image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/69a91ea3-3f4b-7ba9-5488-0fb4ec600791.png)

## 対応方法

私は公式にも記載にある、`npm`を使用した方法に変更しました。
以下のサイトを見ても最新になっていたので問題無さそうです。

https://www.npmjs.com/package/firebase-tools

以下のように変更し、問題なくインストールできました。

```yml
  - script: npm install -g firebase-tools
    displayName: Install Firebase CLI
```

## さいごに

`https://firebase.tools`のスクリプトの内容を見ると、コメントで以下のような記載がありました。

```bash
#
# If you do not want to use this script, you can manually
# download the latest "firebase" binary.
#
:   curl -Lo ./firebase_bin https://firebase.tools/bin/linux/latest
#
# Alternatively, you can download a specific version.
#
:   curl -Lo ./firebase_bin https://firebase.tools/bin/linux/v7.2.2
#
```

今回エラーが発生している際には、`https://firebase.tools/bin/linux/latest`のものが404エラーとなっていたので最新のものがまだアップロードされていないようでした。

一つ前のバージョンを指定したもの`https://firebase.tools/bin/linux/v13.16.0`では期待通り取得できましたので固定バージョンを使用して解決する方法もありそうです。

ただし、Firebaseのサービス側は常に最新ですしCLIツールも常に最新を使用したほうが良いと考え、バージョンの固定化の方法を採用しませんでした。
日曜日から土曜日ではなく、月曜日から日曜日までのデータを取得する設定




かなり前からアイデアにあがっています。

+ [Reporting - Last Week: Monday through Sunday vs. Sunday through Saturday](https://ideas.salesforce.com/s/idea/a0B8W00000GdjSBUAZ/reporting-last-week-monday-through-sunday-vs-sunday-through-saturday)

この中で興味深いのはロケールを変えて月曜から週をが始まる国に個人の設定を変えるというのがあります。
しかし、項目によってはフォーマットが変わるから日本の環境では難しいと思われます。少々2013年と古い東湖なのが気になりますが...

+ [Can I start the calendar week with Monday instead of Sunday?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7XGbSAN)

:::note
日付時刻形式と週の開始時刻の両方についてすべてのロケールを比較したところ、次の組み合わせで月曜日から日曜日、および MM/DD/YYYY または MM-DD-YYYY 形式が提供されることがわかりました。  
 
 ついに、「先週」を使用したレポートが使用でき、会社の週の定義と一致するようになりました。
 
誰かの役に立つことを願っています!
 
スペイン語 (エルサルバドル) 月曜～日曜 ダッシュ デート スペイン語 (ホンジュラス) 月曜～日曜 ダッシュ デート スペイン語 (ニカラグア) 月曜～日曜 ダッシュ デート スペイン語 (パナマ) 月曜～日曜 パーフェクト スペイン語 (プエルトリコ) 月曜～日曜 ダッシュ デート
:::


もう一つ気になる回答がこれ

+ [How to change calendar week on salesforce?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BqT54)

数式項目を作って検索条件に使う日付を-1日する方法。レポートなら行レベル数式でもいいかもしれません。

:::note
I know this is old, If you create a date formula field that is DateField - 1 then use this in your report filter for This Week it will work.
:::
SQL文の裏技サンプル

:::note info
【集計】　``OVER (PARTITION BY 顧客ID ORDER BY 変更履歴連番)``
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/d5d642af-790b-4a1b-9c01-57e7ef614486.png)
【Python】スペース区切りで入力された値を別の変数に入れる


文字列の場合
---
※変数の数は、入力される文字列と同じ数でないと動きません
```Python
#文字の場合
a,b = map(str, input().split())
print(a)
print(b)
```

```
入力
banana chocolate
```
aの変数にはbananaが、bの変数にはchocolateが入っています
```
出力結果
banana      #a
chocolate   #b
```
整数の場合
---

```Python
#整数の場合
a,b = map(int, input().split())
print(a)
print(b)
```

```
入力
123 4
```
aの変数には123が、bの変数には4が入っています
```
出力結果
123   #a
4     #b
```

int(整数)か、str(文字列)を使い分けて、入力する値のデータ型を変えています。

使用例
---
```Python
hoge1,hoge2,hoge3,hoge4 = map(int, input().split())
print(hoge1)
print(hoge2)
print(hoge3)
print(hoge4)
```
```
入力
12 3 456 78
```

```
出力結果
12   #hoge1
3    #hoge2
456  #hoge3
78   #hoge4
```
Mac / Mac Book - 設定で 画面起動の自動調整を無効にしているのに、ディスプレイが暗くなってしまう場合

# 問題

設定で 画面起動の自動調整を無効にしているのに、ディスプレイが暗くなってしまう

![CleanShot 2024-09-12 at 10 00 45@2x](https://github.com/user-attachments/assets/712522f9-3a5c-4df4-bfbb-d07225b9ace0)


# 解決

バッテリー使用時の設定にディスプレイを暗くする設定が効いているだけだった

これをオフにしたら解決した

![CleanShot 2024-09-12 at 10.04.31@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/84b9e57e-00f4-1660-8b2f-10fa716b60c8.png)



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
表示コードはアルゴリズム用のコードとは別にする

#### はじめに
アルゴリズムを調査し、比較し、実装したりするとき、表示用のツールが毎回異なっていて、不便さを感じる。

### この文章が主張すること
表示目的のコードはアルゴリズム用のコードとは別々のリポジトリとして管理する。
表示用のツールをアルゴリズムの開発用のリポジトリから除外することで、
アルゴリズムの実装を変えても共通のツールで表示できる。

## ステレオ計測の例
- ステレオ計測は、歴史ある画像認識タスクだ。
    - ステレオカメラからどうやってカメラパラメータを決定するタスク
    - カメラパラメータを使ってステレオ平行化する作業
    - ステレオ平行化済みのleft画像, right画像から視差を算出するタスク
    - 視差から点群を算出するタスク
    - 透明物体や反射物体を適切に処理をするというタスク
これらに分解される。
いま、残っている中心なタスクはステレオ平行化済みのleft画像, right画像から視差を算出するタスクである。


そのため、いまでも視差を計算する部分を中心に多数の論文が発表されている。

## 個別のアルゴリズム実装が、表示コードを持っていることの不都合
- それぞれの方法で可視化された結果は、同じ土俵で比較することができない。
- 自分がよいと思う表示方法で、異なるアルゴリズムの結果に対して共通に比較することができない。


## アルゴリズム自体を利用するとき
#### モジュールとしての書き換え
論文に書かれた実装は、論文に示したデータセットで、既存の実装をよりもよい結果をでていることを主張するためのものです。
そのため、そのライブラリを実機で組み込んで使うためのものになっていません。


- ロボティクス分野でステレオ計測を使うときは、完全に組み込み目的で自律的に動くときには、表示は不要になるはずである。
- せいぜい人が目視で確認したり、ログやバッチ処理の結果を表示するときである。
- 表示用のコードでは、matplotlibなどの巨大なライブラリを必要としてしまうことがある。
- そのため、最小限のインストールには、表示用のコードを含めない方がのぞましい。
```
python3 -m pip install .[dev]
```
などとして、[dev]を追加で指定したときにだけ、表示用のライブラリをインストールするようにできるだろう。

#### リポジトリを小さく作る理由
- 多くの処理をすればするほど、依存ライブラリの数が増えてしまう。
依存ライブラリの数が増えていけば、いくほど、依存ライブラリのバージョンの
conflictも生じてしまう。
例：numpy, opencv, matplotlib, sckit-learn, onnruntime, pytorch, tensorflow など

### 類例：結果の通信用のコードも別にする。
結果を他のプロセスと通信する必要があるとき、
そのコードをアルゴリズムに依存しないように作ろう。
dataclasses-jsonを使うと、
@dataclass として定義してあるclass のインスタンスを簡単にserialize, deserialize できる。
https://pypi.org/project/dataclasses-json/

そのため、結果の受け渡し方へのアルゴリズムの依存性は減らしやすくなっている。

## 参考
[Model View Controller](https://ja.wikipedia.org/wiki/Model_View_Controller)

ここでもModel, view を分離することを主張している。
アルゴリズムは、モデルに相当するだろう。
paizaラーニング問題集「二次元区間和」を解いてみた

▼感想：

区間和の計算方法のやりかたを踏まえて、本問を解くことができました。

縦方向の変数（y,H,ruisekiwa_tate,j,a,c）と
横方向の変数（x,W,ruisekiwa_yoko,i,b,d）を
しっかり定め、混同しないように気を付けました。

二次元区間和が、横長か縦長か、に応じて処理を分けました。

▼コード：

```py
########## 処理0(準備) インプット,リスト定義など ###########

H,W,N = map(int,input().split())

A = [[0 for i in range(W)] for j in range(H)]

# ruisekiwa_yoko,ruisekiwa_tate: 横方向,縦方向の累積和格納用リスト
ruisekiwa_yoko = [[0 for i in range(W)] for j in range(H)]
ruisekiwa_tate = [[0 for i in range(W)] for j in range(H)]

########## 処理1 横方向の累積和の計算、格納 ##########

for j in range(H):

    A[j] = list(map(int,input().split()))

    ruisekiwa_yoko[j][0] = A[j][0]

    for i in range(W-1):
        ruisekiwa_yoko[j][i+1] = ruisekiwa_yoko[j][i] + A[j][i+1]

########## 処理2 縦方向の累積和の計算、格納 ##########

for i in range(W):

    ruisekiwa_tate[0][i] = A[0][i]

    for j in range(H-1):
        ruisekiwa_tate[j+1][i] = ruisekiwa_tate[j][i] + A[j+1][i]

########## 処理3 入力に応じた区間和の計算 ##########

for _ in range(N):

    # total: 計算した区間和の格納用変数
    total = 0
    a,b,c,d = map(int,input().split())

    # 入力が横長
    if c-a < d-b:
        # 横方向の区間の左端が1
        if b == 1:
            for j in range(c-a+1):
                total += ruisekiwa_yoko[a-1+j][d-1]
        else:
            for j in range(c-a+1):
                total += (ruisekiwa_yoko[a-1+j][d-1] - ruisekiwa_yoko[a-1+j][b-1-1])
        
    # 入力が縦長、または横と縦が同じ長さ
    else:
        # 縦方向の区間の上端が1
        if a == 1:
            for i in range(d-b+1):
                total += ruisekiwa_tate[c-1][b-1+i]
        else:
            for i in range(d-b+1):
                total += (ruisekiwa_tate[c-1][b-1+i] - ruisekiwa_tate[a-1-1][b-1+i])
            
    print(total)
```
マトリックスレポート



+ [[Salesforce]レポート形式（表形式、サマリー、マトリックス、結合）はどのように選べばよいでしょうか](https://csminfo.uhuru.jp/hc/ja/articles/200514954--Salesforce-%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E5%BD%A2%E5%BC%8F-%E8%A1%A8%E5%BD%A2%E5%BC%8F-%E3%82%B5%E3%83%9E%E3%83%AA%E3%83%BC-%E3%83%9E%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9-%E7%B5%90%E5%90%88-%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E9%81%B8%E3%81%B9%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B)

サマリーレポートをベースに、グルーピングを縦軸（行）と横軸（列）に拡張したレポート形式です。集計するデータ量が多く、様々な項目の値を比較する必要がある場合に役立ちます。行と列、それぞれ２階層までグルーピングを設定できます。行のみ、もしくは列のみにグルーピングを設定した場合は、サマリーレポートとして表示されます。サマリーレポート同様、「詳細の表示/非表示」を切り替えることができます。

【マトリックス形式に適したレポート】

+ フェーズごと＆月ごとの商談売上予測
+ 月ごと＆商品ごとの商談売上実績


# 事例

+ [Parent and Prior Group Valueを使って経時的な傾向をつかむ方法](https://qiita.com/Keiji_otsubo/items/51bc0ea61b4d11db4319)
+ [Report Formula Issue](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erX2I)

以下のようなレポートを作ったけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8cb22be6-7e4c-b8fd-f674-8197527082e0.png)

レポートを行で Prevention_Age_Groups__c でグループ化し (すでに行ったように)、列で Obesity_class_by_BMI__c でグループ化します (マトリックス レポートにします)。これにより、必要な数値が得られ、6 つのフィールドではなく 2 つのフィールドだけを気にすればよくなります。


Caseの結果が1ならtrueになる式みたい

```
CASE(Obesity_class_by_BMI__c,
"Overweight",1,
"Class I obesity", 1,
"Class II obesity",1,
"Class III obesity", 1, 0)=1
```

```
RowCount / PARENTGROUPVAL(RowCount, TYPE, COLUMN_GRAND_SUMMARY)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dd133416-d955-ad57-4ffa-b97af59ce8f4.png)
【Python】スペース区切りで入力された数字を別々にして配列(list)に入れる

Pythonでよく使うコードです。
```Python
hoge = list(map(int, input().split()))
print(hoge)
```



実行例
```
入力
1 2 3 456 78 9 10
```

```
出力
[1, 2, 3, 456, 78, 9, 10]
```
Prisma スキーマの構造を Python からいじって遊ぶ

Prisma のスキーマファイルの構造をコネコネいじって遊びたいときってありますね？ ない？ そう...

Prisma スキーマを parse した AST の構造は **DMMF** (Data Model Meta Format)[^dmmf] というらしく、TypeScript Client なんかだとかなり簡単に取得することができるらしい。

[^dmmf]: https://github.com/prisma/prisma/blob/main/ARCHITECTURE.md#the-dmmf-or-data-model-meta-format

ただデータをコネコネいじって遊びたいときは Python のほうがやりやすい (主観) ので、Python で遊ぶ用に取得できないかと思って試していたらできたので、まとめておく。

## DMMF を Pickle として dump する
別に DMMF を JSON に dump してもいいんだけど、Prisma Client Python [^python] が提供する Pydantic の型にハメたほうが扱いやすい。

[^python]: https://prisma-client-py.readthedocs.io/en/stable/


直接的に DMMF を取得する `getDMMF` みたいな便利関数は Prisma Client Python ではサポートされていないようなので、構造を Pickle として dump するカスタムジェネレータを作ってみる。

まずは Prisma Client Python を入れる。

``` console
$ pip install prisma
```

カスタムジェネレータをつくる。

``` python:dmmf_pickle_dumper.py
import pickle

from prisma.generator import BaseGenerator, DefaultData, Manifest


class DmmfPickleDumper(BaseGenerator):
    def get_manifest(self) -> Manifest:
        return Manifest(
            name="DMMF Pickle Dumper",
            default_output="dmmf.pickle",
        )

    def generate(self, data: DefaultData) -> None:
        with open(data.generator.output.value, "wb") as f:
            pickle.dump(data.dmmf, f)


if __name__ == "__main__":
    DmmfPickleDumper.invoke()
```

スキーマファイルにカスタムジェネレータの設定を追記する。

``` prisma:prisma.schema
generator dmmf_pickle {
  provider = "python dmmf_pickle_dumper.py"
}
```

実行する。

``` console
$ prisma generate
```

すると `dmmf.pickle` が生成されている。ﾔｯﾀｰ!

## DMMF で遊ぶ
お好きな Python 環境で Pickle をロードすれば Pydantic な型の DMMF データ構造が得られるので、あとはご自由に！！

``` python
import pickle

with open("dmmf.pickle", "rb") as f:
    dmmf = pickle.load(f)
```
Amazon MemoryDB

## はじめに

**ビジネスのスピードが加速する現代において、データの処理速度は非常に重要です。** 従来のデータベースでは、データの読み書きに時間がかかってしまい、顧客満足度やビジネスの成長を阻害する可能性がありました。

そこで登場したのが、**Amazon MemoryDB** です。これは、データをメモリ上に格納することで、従来のデータベースと比べて **圧倒的に高速な処理** を実現するサービスです。

**MemoryDBのメリット**

* **高速処理:** データをメモリ上に置くことで、高速な読み書きが可能になります。まるで、データへ瞬時にアクセスできるイメージです
* **耐久性:** データが複数箇所にバックアップされるため、万が一システムが停止してもデータが失われることはありません
* **簡単操作:** AWSが管理してくれるので、ユーザーは複雑な設定や運用に悩まされる必要がありません

**MemoryDBが必要な場面**

* **リアルタイム分析:**  大量のデータをすぐに分析して、ビジネスの意思決定に役立てたい場合
* **ユーザーの行動分析:** ユーザーがWebサイトやアプリでどのような行動をしているかをリアルタイムで分析したい場合
* **ゲームのランキング:**  オンラインゲームのランキングを常に最新の状態に保ちたい場合
* **チャットサービス:**  ユーザー間のメッセージを高速にやり取りしたい場合

**MemoryDBとElastiCacheの違い**

MemoryDBは、ElastiCacheよりも**耐久性が高い**という点が大きな特徴です。ElastiCacheは、高速な処理を重視する一方、データの永続的な保存を保証していない場合があります。

**まとめ**
Amazon MemoryDBは、高速で安全なインメモリデータベースサービスです。ビジネスの成長を加速させ、競争力を強化するために、ぜひ活用してみてください。 

**関連資料**
[Amazon MemoryDB【AWS Black Belt】 - YouTube](https://www.youtube.com/watch?v=Ll7U34tTHis)
[Amazon MemoryDB【AWS Black Belt】 - PDF](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbHkwcjcwdnBjTURGbU9Uckd2ODZOWkZBRUFiQXxBQ3Jtc0ttWjIwa056alJjTFFwNVIyeHdJX204dWtKVEJvTG5HVlY4c1JVV0l0YXJxVWNzQTlzR2NjNGJQNXJZVDdfVjhmaEVkU1ByWE9rdkVabnRhc0YwbGhZTlRSaEdJVExpWmh3cV9zX0RKQUtUS3hsbjNvWQ&q=https%3A%2F%2Fpages.awscloud.com%2Frs%2F112-TZM-766%2Fimages%2FAWS-Black-Belt_2024_Amazon-MemoryDB_0831_v1.pdf&v=Ll7U34tTHis)
Web開発エンジニアになるために

# 目次
1. Webエンジニアとは
1. そのために必要な知識
1. 現在の研究と業務のつながり
1. まとめ

# Webエンジニアとは
主に, フロントエンドとバックエンドの2つに分ける. ユーザからみてわかるフロントと在庫数やカード情報の照会等を行うバックエンドから成る.

# そのために必要な知識
1. インターネットについて
1. OSについて
1. データベースについて
1. APIについて
1. プログラミング
1. セキュリティ

多くの知識を必要とする.
>引用 https://tech-parrot.com/engineer/backend-engineer-roadmap-and-skills/#i-2

# 現在の研究と業務のつながり
セキュリティについて学ぶ ➡ 必須の知識となる(特に, バックエンドエンジニア)

# まとめ
多くの知識を必要とするため, 勉強量も凄まじいことになる. 現研究と並行して空き時間でGoやRubyの勉強を行う必要があるのではないか. シンプルに用語の理解を深める必要もある.
gccとアセンブラの連携

# Cからシステムコール

```fig1.c
// C (gcc)
// cc -masm=intel -o fig1 fig1.c

void hoge(char *str, int len);
__asm__("\n\
hoge:						\n\
	mov	edx, esi	# len		\n\
	mov	rsi, rdi	# str		\n\
	mov	edi, 1		# stdout	\n\
	mov	eax, 1		# write		\n\
	syscall					\n\
	ret					\n\
");

int main(void)
{
	char msg[] = "hello, world\n";
	hoge(msg, sizeof msg - 1);
}
```

https://tio.run/##VZDPbsMgDMbP@Cms7JJMZFWuq3rqYyxThIAQJP5IwNpu0159DFC1ZRyQzc@f7Q8@Ks5zPhzwjH0JBygh5zhaFu1JuyQNjh5XraZ2PXGAi9cCN69kzzcW8DGmQLGUopFuOMKyFOmy9N3sZqhlz6SdmhLrL0SKG0UZNXmoih0IUVMMooLS85@igIm0d@Hf0o6w251cg07yronvkTNj/sYGmX6TruwIdV3LtOurmQE@gTQvNqqXVzxht0ljPMWrD0bMrjsCaYYLpxj1h/RrrcURp9LtC3L@5qthKubdx/0A

# アセンブラからprintf

```fig2.s
// C (gcc) -xassembler
// cc -o fig2 fig2.s

	.intel_syntax noprefix
	.section	.rodata
fmt:	.string	"hello, %d\n"

	.text
	.globl	main
main:
	push	rbp
	mov	rbp, rsp

	mov	esi, 42
	lea	rdi, fmt[rip]
	call	printf

	pop	rbp
	ret
```

https://tio.run/##TU9BasMwEDzvvkIEAi3YDoSecu0z2lBkeaUI1pLQbor7@apyc8lldmZYZhg3BudaO53Mu3np9NWMmxWhdWaq2G3nzJiNj@H8D5MgwhSTEn/JT1K7mZRLJR@37gs5jTnBVPNi1aJf9dJdrTEFONyIOQ/muHymw56itGk/gfPMsNqYcIcLQrnLDepcENb8vZPBVCn4kCRxMG9nBCYLdemit3zUWK4IzjJD6W3q@3fJ5ZFSSbG1X@fZBmlPA/8A
ChatGPT によるリバーシの作成その２

ChatGPT によるリバーシゲームに機能追加してみます。

[ChatGPT によるリバーシの作成その３](https://qiita.com/rex0220/items/69ea415d6d3c08717866)に続く。

# 概要

[ChatGPT によるリバーシの作成](https://qiita.com/rex0220/items/b5d8fe7373c32f5faa44)で、作ったゲームに機能を追加してみました。
現時点では、機能追加と問題解決をすべてをチャットで行うにはまだ無理がありそうです。
また機能追加によりコードが長くなると、「生成を続ける」待ちになり面倒です。

![2024-09-12_08h36_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7ac4a418-3c6c-62d3-b3a9-0c749d626349.png)

## 機能追加概要

「チャットを続けて機能を追加する」方針で、下記機能を追加します。

- 駒を四角から丸に変更
- ゲームの履歴を追加
- 駒位置を示す番号を枠外に追加
- 「もどす」・「すすむ」機能追加
- パス機能を追加

## 機能追加中にあった問題

問題の指摘だけでは直らないケースもあり、その場合は改善方法を指摘する必要がある。
ただし、問題発生と変更の無限ループになる場合があり、チャットでの改善には今のところ限界がありそうです。

- 盤面が長方形になった
    - プロンプトで長方形を指摘すると、CSS で調整を行うが、直らない
    - 盤面を table タグで実装していたためそれを指摘すると、div と CSS に変更
- ゲームを始めると、ゲームの履歴表示で盤面の表示位置がずれる
    - 問題を指摘しただけでは直らず、履歴の横幅を固定長にするように指示
- 機能追加により、エラーが生じるケースあり
    - html を変更して、 JavaScript コードの対応が漏れていた
- 機能追加・問題点を指摘するとその問題は解決するが、以前の問題が復活する
    - 「駒位置を示す番号を枠外に追加」でエラーが発生し、指摘すると番号が表示されなくなる
    - その繰り返しで、実装が進められない

## 現時点での状況

機能追加すると以前の問題を復活する場合があり、すべての機能追加が出来ていない状態です。

- 駒を四角から丸に変更
    - OK
- ゲームの履歴を追加
    - OK
- 駒位置を示す番号を枠外に追加
    - 機能追加とエラーの繰り返しで、実装を断念
- 「もどす」・「すすむ」機能追加
    - 単純に「もどす」・「すすむ」を行った場合はOK
    - 「もどす」後に、別の手順を行うとNG
    - さらに機能追加が必要
- パス機能を追加
    - 駒を置く場所が無いとアラートなしで、別プレーヤーの順番になる
    - 順番が変わったのがわかりにくいので、アラート表示が必要


# チャットの内容

https://chatgpt.com/share/d1bfccd4-8df2-47e1-8247-3da6004f7ac3
Carthage で IPHONEOS_DEPLOYMENT_TARGET を設定

最近、MacBook を買い換えたので Git から新しい端末へ iPhone アプリのプロジェクトをクローンしてビルドしています。その時に carthage update を実行すると古いプロジェクトでエラーが発生しました。

>The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 12.0 to 17.5.99.

外部ライブラリが古すぎるということだろうな...
使わないというのが一番いいのかもしれませんが、とりあえず、xconfig で、IPHONEOS_DEPLOYMENT_TARGET を一時的に変更するスクリプトにより対処しました。
このスクリプトを使えば、carthage update は成功するので書いておきます。

## シェルスクリプト
```bash:carthage.sh
#!/usr/bin/env bash

set -euo pipefail

xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX)

trap 'rm -f "$xcconfig"' INT TERM HUP EXIT

echo 'IPHONEOS_DEPLOYMENT_TARGET = 12.0' >> $xcconfig

export XCODE_XCCONFIG_FILE="$xcconfig"

carthage "$@"
```
このスクリプトは、Carthage を使用して依存ライブラリをビルドする際に、カスタムの xcconfig ファイルを一時的に作成し、特定のビルド設定（ここでは iOS のデプロイメントターゲット）を上書きするために使用できます。具体的には、`IPHONEOS_DEPLOYMENT_TARGET`を**12.0**に設定しています。

## スクリプト解説
### 1. Shebang とスクリプトの開始

```bash
#!/usr/bin/env bash
```
- **Shebang (`#!/usr/bin/env bash`)**:
スクリプトが `bash` シェルで実行されることを指定しています。`env` を使用することで、システムの環境に依存せず、`bash` を見つけて実行します。

### 2. エラーハンドリングの設定
```bash
set -euo pipefail
```
- **`set -e`**:
コマンドがエラー（非ゼロの終了ステータス）を返した場合、スクリプトを即座に終了します。

- **`set -u`**:
未定義の変数を参照しようとするとエラーを発生させます。

- **`set -o pipefail`**:
パイプライン内のどのコマンドが失敗してもスクリプト全体をエラーとします。

まとめると、`set -euo pipefaile` になり、スクリプトの信頼性が向上し、予期しない動作を防ぎます。

### 3. 一時的なxcconfigファイルの作成
```bash
xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX)
```
- **`mktemp /tmp/static.xcconfig.XXXXXX`**:
一時的なファイルを作成します。`XXXXXX`はランダムな文字列で置き換えられ、ユニークなファイル名が生成されます。このファイルは後で xcconfig の設定を保持します。

- **`xcconfig=`**:
生成された一時ファイルのパスを変数 xcconfig に格納します。

### 4. 一時ファイルのクリーンアップ設定
```bash
trap 'rm -f "$xcconfig"' INT TERM HUP EXIT
```
- **`trap`**:
スクリプトが終了する際に特定のコマンドを実行するように設定します。ここでは、スクリプトが中断（`INT`）、終了（`TERM`）、ハングアップ（`HUP`）、または終了（`EXIT`）する際に、一時ファイルを削除します。

- **`rm -f "$xcconfig"`**:
xcconfig ファイルを削除します。これにより、一時ファイルが残らず、システムのクリーンな状態が保たれます。

### 5. xcconfigファイルへの設定追加
```bash
echo 'IPHONEOS_DEPLOYMENT_TARGET = 12.0' >> $xcconfig
```
- **`echo 'IPHONEOS_DEPLOYMENT_TARGET = 12.0' >> $xcconfig`**:
xcconfig ファイルに、iOSのデプロイメントターゲットを12.0に設定する行を追加します。

- **`IPHONEOS_DEPLOYMENT_TARGET`**:
アプリがサポートする最低限のiOSバージョンを指定します。ここでは、iOS 12.0以上を対象としています。

### 6. 環境変数の設定
```bash
export XCODE_XCCONFIG_FILE="$xcconfig"
```
- **`export XCODE_XCCONFIG_FILE="$xcconfig"`**:
環境変数 `XCODE_XCCONFIG_FILE` に、先ほど作成した一時的な xcconfig ファイルのパスを設定します。Xcode はこの環境変数を参照し、ビルド時に指定された xcconfig ファイルの設定を適用します。

### 7. Carthageの実行
```bash
carthage "$@"
```
- **`carthage "$@"`**:
スクリプトに渡された全ての引数（`"$@"`）をそのままCarthageに渡して実行します。

## 実際の使用例
### Carthage コマンドの実行
スクリプトを使用して Carthage コマンドを実行します。例えば、iOS用にライブラリをビルドする場合：
```bash
./carthage.sh update --platform iOS --use-xcframeworks
```
このコマンドにより、Carthage は指定された xcconfig ファイルを参照してビルドを実行し、`IPHONEOS_DEPLOYMENT_TARGET` が12.0に設定された状態でライブラリをビルドします。

## さいごに
とりあえず、carthage のビルドもプロジェクトのビルドも成功しました。ちなみエラーが発生したライブラリは、[PKHUD](https://github.com/pkluz/PKHUD) でした。
jermをいじった

[IchigoJamをシリアルで操作](https://qiita.com/yamori813/items/eacefd26d959afd84802)するときにローカルエコーが必要なのでjermに機能を追加してみました

https://github.com/yamori813/jerm

eオプションでローカルエコーします。

![スクリーンショット 2024-09-12 7.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/9ca27784-3593-4ffd-d60c-e497099c73b5.png)

bluetoothモジュールのHC-05の設定にも使えます。

ZRouter.orgのjermのportsもどきもこのソースでビルドするようにしました。
社内のサーバーやPCからSalesforceに接続するシステムのトラブル時の対応


実際には色々考えられるとは思いますが、まずはエラーメッセージがあるかないかで対応が異なると思います。


# 社内のシステム側にエラーメッセージが無い場合

ここではSalesforceに接続できているかを確認するのがいいと思います。
ログインに使っているユーザのログイン履歴を見ることで判断できることがあります。

### ログイン履歴が無い
 
ネットワークの問題かもしれません。Salesforceに到達できていません。

+ [バッチでアップロードができなくなった](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erUOL)

:::note
ログイン履歴をみたところログインできていないことが分かり、原因を調べたところアップロード出来ないＰＣがある拠点のグローバルIP第4オクテットが変わっていました。

信頼済みIP範囲に拠点グローバルIPを追加することでアップロードできるようになりました。

ブラウザではアクセスできていたのですがバッチだとはじかれていたようです。
:::


### ログイン履歴がある。

ログイン履歴の中にヒントとなるエラーメッセージがあるかもしれません。Salesforceの中でのエラーの場合、通常なら社内のシステム側にエラーメッセージが通知されているとは思います。無い場合は社内システムが受け取れてない（バグ、あるいは機能がない）のでしょう。


# 社内のシステム側にエラーメッセージがある場合
さくらのレンタルサーバに最新のPythonをインストールする苦行

コストの問題など、レンタルサーバでPythnを使いたい場合が多くあります。その場合には、かなりの苦行が必要ですが下記の手順で操作します。

ポイントは下記の通り:

- SSH接続が必要なので「スタンダードプラン」以上が必要
- pyenvを使って最新版をインストール
- OpenSSLを最新版にアップデートする必要がある

### レンタルサーバとの接続

スタンダードプラン以上を契約し、以下のコマンドでサクラに接続します。

```sh
ssh (初期ドメイン)@(初期ドメイン).sakura.ne.jp
```

### 設定ファイルの変更

続いて、シェルをBashに切り替えます。

```sh
chsh -s /usr/local/bin/bash
```

コマンドを実行したら、SSHコマンドでサーバーに接続しなおします。
その後、下記のコマンドを実行して、各種設定を行います。

```
# ~/.bash_profileを作成する
echo 'if [ -f ~/.bashrc ]; then' >> ~/.bash_profile
echo '  . ~/.bashrc' >> ~/.bash_profile
echo 'fi' >> ~/.bash_profile

# pyenvをインストール
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# pyenvを有効にする
cat << EOS >> ~/.bashrc
export PATH
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export TMPDIR=/home/nashio/tmp
eval "$(pyenv init -)"
pyenv rehash
EOS
source ~/.bashrc
```

上記を実行したら切断して、もう一度SSHでログインし直します。

### OpenSSLを最新にアップデート

続いて、OpenSSLのインストールの準備です。

```sh
mkdir -p $HOME/local/src
cd $HOME/local/src/
```

OpenSSLの最新版を以下のサイトから一度ローカルにダウンロードします。

https://github.com/openssl/openssl/releases

この記事を書いたときの最新版は、OpenSSL 3.3.2でした。

`openssl-3.3.2.tar.gz`をローカルにダウンロードしたら、それを、FTPを使って、レンタルサーバーの`$HOME/local/src/`にアップロードします。

なぜか、curlコマンドがまともに動かなかったため。
その後、以下のコマンドを実行してOpenSSHをビルドします。それなりに時間がかかります。

```sh
tar xvfpz openssl-3.3.2.tar.gz
cd openssl-3.3.2
./config --prefix=$HOME/local/openssl/3.3.2 --openssldir=/etc/ssl
make
make install_sw
```

これで、パス`$HOME/local/openssl/3.3.2`にOpenSSLがインストールされました。

```sh
echo 'export LD_LIBRARY_PATH=$HOME/local/openssl/3.3.2' >> ~/.bashrc
source ~/.bashrc
```

### Pythonのインストール

```sh
# install
CONFIGURE_OPTS="--with-openssl=$HOME/local/openssl/3.3.2" \
PY_UNSUPPORTED_OPENSSL_BUILD=static \
TMPDIR="${PWD}/tmp" \
pyenv install 3.12.6
# pyenvを有効に
pyenv global 3.12.6
```

バージョンを試してみましょう。

```sh
$ python --version
Python 3.12.6
```

以上です。

### 参考

以下の記事が参考になりました。ただし、既にそのままでは動きませんでした。敢えて苦行に挑むか悩むところです

- https://qiita.com/hkato/items/5d5dcd6eec7b1cf514bc
M5Stack MP135 Port CをGPIOとして使う方法


# 手順

Port Cは、GPIOのPC6,PC7が割り当てられています。
このピンはシリアル通信用になっています。

```
cat /sys/kernel/debug/pinctrl/soc:pinctrl@50002000/pinmux-pins
～～省略～～
pin 38 (PC6): device 44003000.serial function af7 group PC6
pin 39 (PC7): device 44003000.serial function af7 group PC7
～～省略～～
```

.dtbファイルから.dtsファイルを作成する

```
dtc -I dtb -O dts -o stm32mp135f-coremp135.dts /boot/stm32mp135f-coremp135.dtb
cp stm32mp135f-coremp135.dts custom.dts
```

```custom.dts```
の
status =
を
status = "disabled";
に変更する

```
                serial@44003000 {
                        compatible = "st,stm32h7-uart";
                        reg = <0x44003000 0x400>;
                        interrupts-extended = <0x0c 0x1d 0x04>;
                        clocks = <0x08 0x81>;
                        resets = <0x08 0x354d>;
                        wakeup-source;
                        power-domains = <0x0d>;
                        status = "okay";<----この行を修正
                        pinctrl-names = "default\0sleep";
                        pinctrl-0 = <0x1d>;
                        pinctrl-1 = <0x1e>;
                        rx-tx-swap;
                        phandle = <0x85>;
                };
```

編集したdtsファイルから、dtbファイルを作成し、/bootにコピーする
```
dtc -I dts -O dtb -o custom.dtb custom.dts
cp custom.dtb /boot
```

/boot/extlinux/extlinux.conf
の
devicetree /boot/stm32mp135f-coremp135.dtb
この行を
devicetree /boot/custom.dtb 
に変更する

```
label stm32mp135f-coremp135-buildroot
  kernel /boot/zImage
  devicetree /boot/custom.dtb <----この行を修正
  append root=/dev/mmcblk0p5 rw panic=5 quiet rootwait
```

デバイスを再起動する。

# 動作確認

次のコマンドでGPIOに出力してみる

```bash
root@CoreMP135:/# echo 39 > /sys/class/gpio/export
root@CoreMP135:/# echo out > /sys/class/gpio/PC7/direction
root@CoreMP135:/# echo 0 > /sys/class/gpio/PC7/value
root@CoreMP135:/# echo 1 > /sys/class/gpio/PC7/value
```

echo 0とした時に、LEDが点灯する事を確認できました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/4b43fad0-f86b-93f7-970a-ffa4c61bce1a.png)
mindの研究 その85

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
開いたペイントを操作して、文字を書け。

# 環境
windows11

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7164994a-5b56-6c6a-31e2-809e8832b883.png)

# サンプルコード

```
右クリックとは
　結果は　変数
　数１は　変数
　数２は　変数
　数１に　入れ
　数２に　入れ
　数２をつみ
　数１をつみ
　"user32"と　"SetCursorPos"で　ＡＰＩ呼出し２　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　一秒待つ
　２をつみ
　０をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"mouse_event"で　ＡＰＩ呼出し５　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　４をつみ
　０をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"mouse_event"で　ＡＰＩ呼出し５　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　。


送信とは
　数１は　変数
　結果は　変数
　数１に　入れ
　数１をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　数１をつみ
　０をつみ
　２をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
。

テキストを開くとは
　結果は　変数
　038hをつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　054hをつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　058hをつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　058hをつみ
　０をつみ
　２をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　054hをつみ
　０をつみ
　２をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　038hをつみ
　０をつみ
　２をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
。

 
メインとは
　１００をつみ　１００をつみ　右クリックし
　テキストを開く
　５００をつみ　３００をつみ　右クリックし
　５００をつみ　３００をつみ　右クリックし
　041hをつみ　送信し
　042hをつみ　送信し
　043hをつみ　送信し
　044hをつみ　送信し
　045hをつみ　送信し
　046hをつみ　送信し
　047hをつみ　送信し
　５００をつみ　５００をつみ　右クリックし
。



```


以上。
PowerAppsアプリでアナログ時計を作りたい

https://youtu.be/HjfOFs8Eo_M

動画:PowerAppsアプリでアナログ時計を作りたい
を公開しました。

今回の動画で使用した数式です。
角度を入れると回転中心位置からその角度の位置にオブジェクトが配置されます。
タイマーで1秒毎に時間を取得し、時間によって針の角度が徐々に変わるようにして、アナログ時計にしました。

//Xプロパティ
```
回転中心位置 - (Self.Width/2) + (回転半径 * Sin((角度-45)/57.17) + 回転半径 * Cos((角度-45)/57.17))
```
//Yプロパティ
```
回転中心位置 - (Self.Height/2) + ((-1 * 回転半径) * Cos((角度-45)/57.17) + 回転半径 * Sin((角度-45)/57.17))
```

↓こちらはタイマーのOnTimerEndプロパティの数式です。
算出した角度が格納された変数を上の数式の角度にいれます。
タイマーの期間は1000(1秒)

```
UpdateContext({_nowtime: Now()}); //現在時刻を取得
UpdateContext({_sangle: 360 / 60 * Second(_nowtime)}); //秒針の角度を算出
UpdateContext({_mangle: 360 / 60 * Minute(_nowtime)}); //長針(分)の角度を算出
UpdateContext({_hangle: 360 / 12 * Value(Hour(_nowtime) & "." & Int(Minute(_nowtime) * 100 / 60))});//短針(時)の角度を算出
```

↓秒針をスムーズ秒針にする場合は
_sangleの行をこちらに変更
タイマーの期間を50(0.05秒)に変更

```
UpdateContext({_sangle: 360 / 60 * Value(Text(_nowtime,"ss.fff")) });
```

時計の針にしたアイコンは、指し示す角度に応じて座標だけじゃなく、アイコン自体の角度を変える必要があるので、rotationプロパティにはそれぞれ指し示す角度に応じた変数が入っています。
_sangle + 〇〇など(アイコンに元々角度が付いてるので+して調整する)