OmniAICreator/Qiita-1.07M huggingface dataset:
ABC349回答メモ

# 0.はじめに
　冠のないノーマル開催。
 問題の難易度はいつもより高かったような気がします。
 Dが何とかクリアできましたが、WA2回の為か順位は伸びず
 レートも±0でした。


# 1.A - Zero Sum Game
　最初はだれがだれに勝ったとかシミュレーションしないといけないのか？と
 思いましたが、A問題でそれはないなと思い返し解法にたどり着きました。
 【考え方】
 　・全員の点数の合計は0になる。
 　・一人分の分からずそれ以外の人の点数はわかる
 　・与えられた点数の合計を0から引けば、答えとなる人の点数が分かる

　https://atcoder.jp/contests/abc349/submissions/52298533


# 2.B - Commencement
　なかなかややこしい問題。
 問題の意図をつかむのが難しかったですが
 プログラムを作る過程で意外と単純な問題なことが分かりました。

 【考え方】
 　・文字列Sについて文字ごとの出現数を数え
  　 辞書Dにキー：文字、値：出現数をセット
 　・辞書Dの値を順に読み込み値毎の個数を数え
  　 辞書D2にキー：出現数、値：個数をセット
 　・辞書D2の値がすべて2であればYes、そうでなければNoを
  　 出力して終了

　https://atcoder.jp/contests/abc349/submissions/52305984


# 3.C - Airport Code
　一見、Bよりも簡単な問題。
 といいつつ、記述ミスでWA1個を出してしまいました。
 検索機能等を使えばもっと単純にできそうでしたが
 まぁ素直に組んでみました。

 【実装】
 　1.フラグをC1～C3まで準備
 　2.文字列Sはすべて大文字に変換しておく  
 　3.文字列Sを先頭から見ていく
 　　-1.C1～C3の値で以下の各処理
　 　　-1.C1が0の時
　  　　　今見ているSの文字とTの1文字目を比較し同じなら
 　 　　　C1に1をセット
 　　　　-2.C1が1でC2が0の時(1のelif)
  　　　　今見ているSの文字とTの2文字目を比較し同じなら
  　　　　C2に1をセット
  　　　　Tの3文字目がXなら合わせてC3に1をセット
 　　　-3.C1が1でC2が1の時(1、2のelif)
  　　　　今見ているSの文字とTの3文字目を比較し同じなら
  　　　　C3に1をセット
 　　-2.C3が1の時Yesを出力して終了
 　4.文字列Sのチェック後C3が1にならなければNoを出力して終了

　https://atcoder.jp/contests/abc349/submissions/52324162


# 4.D - Divide Interval
　初見ではあきらめて、後の問題を見に行きましたが
 そっちも無理そうだったのであきらめて取り掛かりました。
 のちに解説を見たところセグメント木を使うようなことが書いて
 ありましたがそこまで複雑なことをしないで解けました。
 (翌日には私の解法と似た感じ(で洗練された)のが追加されてました)

 例題を見たりしていくうちに、考え方はわかったので
 それに従って解いていきました。
 【考え方】
  　1.分割の左の数字が奇数なら、右の数字は次の数までしか分けられない
  　2.偶数の場合、2でS回割り切れる場合割り切った後をjとすると
   　 分割は、i(0～S)とし、2のi乗×(2の(S-i)乗×ｊ+1)のいずれかになる
  　3.分割するときには、できるだけ大きい値で分割する考え方で
   　 問題ない
　　4.分割の左の数字が0の場合は右の数字は2のN乗ならなんでもOK

 【実装】
  1.L,Rを入力
  2.now：現在作成しようとしている数列の左側の数にLをセット
  3.回答を格納するリストansを空で定義
  4.nowが0の時
  　-1.pに1をセット
    -2.p*2がR以下の間、pに2をかけていく
    -3.ansに(now,p)を追加
    -4.nowにpをセット
  5.nowがRとイコールになるまで以下を繰り返す
  　-1.nowが奇数の時
   　-1.ansに(now,now+1)を追加
   　-2.nowに,now+1をセット
  　-2.nowが偶数の時
   　-1.ansに(now,now+1)を追加
   　-2.ansに(now,now+1)を追加
   　-3.s(nowを2で何回割れるか)に0をセット
   　-4.j(now2でs回割った後の商)にnowをセット
   　-5.flgに1をセット
   　-6.flgが1の間以下の処理を繰り返す
      -1.jを2で割った値をjにセット
      -2.sに1加算
      -3.jが2で割り切れないか、jが0の時、flgに0にする
   　-7.iをsから0まで1ずつ減らして繰り返す
      -1.2のi乗×j+1がR以下の時
       -1.rnowに2のi乗×j+1をセットしてブレイク
      -2.2のi乗×j+1がRより大きい時
       -1.ｊに2を掛けてｊにセット
   　-8.ansに(now,rnow)を追加
   　-9.nowにrnowをセット
  6.len(ans)と中の値を出力して終了

　https://atcoder.jp/contests/abc349/submissions/52348766


以上
RailsチュートリアルにRubocopを導入


こんにちは！学びと成長しくみデザイン研究所の斉藤です。
本記事はRailsチュートリアルの第14章が終わった段階の[リポジトリ](https://github.com/yasslab/sample_apps/tree/main/7_0/ch14)をベースにして、より実践的なものへカスタマイズしていきます。

- カスタマイズ履歴
    - [letter_opener_web 導入](https://qiita.com/SaitoJP/items/f86085e6f5580b803a9f)
    - RuboCop 導入 <= 今ココ

前回から引き続き、今回は RuboCop を導入します。
RuboCop を導入することでコード整形が自動化され、作業効率が向上します。
※ RuboCop の概要については公式サイトをご確認ください: https://docs.rubocop.org/rubocop/index.html#overview


# 導入手順


## RuboCop の導入

### Gemfileへ追加

開発環境に限定してRuboCopを導入します。
※ Rails起動時(bin/rails s)した際にはRuboCopの gem を require する必要が無いため、`require: false` を指定します。

```rb:Gemfile
group :development do
  gem 'rubocop', '1.62.1', require: false
  gem 'rubocop-performance', '1.21.0', require: false
  gem 'rubocop-rails', '2.24.1', require: false
  # 以下省略
end
```


### ライブラリのインストール

※ ちなみに `bundle install` は `bundle` に省略可能です。
```console
bundle
```


### RuboCopによる自動修正1

RuboCopを使ってコードの自動修正を行います。
まずは安全な自動修正から

```console
bundle exec rubocop -a
```

念の為、修正された箇所が正常に動作するか確認します。
```console
bin/rails test
```

テストが通ったのでgitでコミット

### RuboCop の設定ファイル作成

プロジェクト直下に rubocop の設定ファイルを作成
```yml:.rubocop.yml
require:
  - rubocop-rails
  - rubocop-performance

AllCops:
  NewCops: enable
  TargetRubyVersion: 3.2
  Exclude:
    - 'node_modules/**/*'
    - 'vendor/**/*'
    - 'bin/**/*'
    - 'config/**/*'
    - 'db/**/*'
    - 'tmp/**/*'
    - 'Guardfile'

# 日本語のコメントを許可する
Style/AsciiComments:
  Enabled: false

# class,moduleのドキュメントは必須にしない
Style/Documentation:
  Enabled: false
```


### RuboCopによる自動修正2

次に、より多くの自動修正を行うオプションを使用しますが、この際には修正後の動作を十分に確認してください。
(今回の場合は単体テストが整備されているのでテストが通れば問題ありません)
```console
bundle exec rubocop -A
```

再度、`bin/rails test` を実行して、問題なければgitコミットします。

### 自動修正されなかった箇所を修正


`bundle exec rubocop` を実行すると、いくつか `C` (Convention)が表示されるため、内容に従って修正します。
修正後はまたテストを実行してください。


### さいごに

今後、`bundle exec rubocop` を実行した際、警告やエラーが表示された箇所を修正することで、
プロジェクト全体として一貫したコードフォーマットを維持することができます。

## VSCode上でRuboCopを実行する設定

エディタ上でRuboCopを実行することにより、リアルタイムにフォーマットが適用され作業効率が上がります。

1. RuboCop の拡張機能をインストール

    以下を開いて `Install` ボタンを押します。
    https://marketplace.visualstudio.com/items?itemName=rubocop.vscode-rubocop

1. VSCode上でRuboCopの設定

    VSCodeの `settings.json` を開いて以下を追記することで、
    ファイルを保存した際にRuboCopのフォーマットを自動適用します。

    ```json:settings.json
    "[ruby]": {
      "editor.formatOnSave": true,
      "editor.defaultFormatter": "rubocop.vscode-rubocop"
    }
    ```
Microsoft Officeの自動保存のデフォルト無効化

# 課題
OneDriveやSharePointではMS Office(Excel, Word, PowerPoint)のファイルではデフォルトで自動保存が有効化される。
閲覧目的でファイルを開いて保存するつもりがなかったのに、自動保存機能でファイルが更新されてしまう。
※特にExcel、フィルター条件を変更しただけで自動保存されてしまって本当に迷惑。

ファイルごとに無効化はできるがデフォルトで無効化したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/541a1a1f-801f-6c6f-b595-795548ce6acf.png)

# 変更方法
(Excelで設定変更の例)
1. 上部メニュバーの「ファイル」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/75ecdba2-d299-4b66-57a8-e2d372e1c37a.png)

1. 画面が切り替わるので左下の「オプション」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/180fc54f-9916-e086-7ae9-a27de0ce7bf9.png)

1. オプション画面が開くので左端のナビゲーションペインから「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/d65c24e7-216b-082c-2807-b03c2aab6280.png)

1. 自動保存の無効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/812208c7-cd94-3d4a-c59d-d1299d0351ae.png)
☑を外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/bf808ec0-6cc4-aab4-94a0-ed22b06d3582.png)

1. 右下の「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/0ae32392-20bf-f07c-4107-04be14c47b09.png)

※Word, PowerPointでも自動保存を無効化したい場合はWord, PowerPointでも同様の設定変更が必要。

# 参照
https://support.microsoft.com/ja-jp/office/%E8%87%AA%E5%8B%95%E4%BF%9D%E5%AD%98%E3%81%A8%E3%81%AF-6d6bd723-ebfd-4e40-b5f6-ae6e8088f7a5#:~:text=%E8%87%AA%E5%8B%95%E4%BF%9D%E5%AD%98%E3%82%92%E3%82%AA%E3%83%95%E3%81%AB,%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%A4%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
SalesforceでINSUFFICIENT_ACCESS: User does not have a verified email address:エラーが出たときの対応方法

本橋孝昭です

今回はSalesforceでメール送信時点で
INSUFFICIENT_ACCESS: User does not have a verified email address:

というエラーが出たときの対応方法をまとめました


## どういう場合に発生するの？
私の場合、SalesforceのPlayground環境でメール送信をする場合に発生しました

エラーメッセージは

>このページのエラーを確認してください。
>INSUFFICIENT_ACCESS: User does not have a verified email address: 005F9000008zK80

です
なお005F9000008zK80　とは送信したいユーザ（つまりいまログインしているユーザ）のユーザIDです

![メール送信1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b51e3243-d12f-9319-5229-2180d32fd7f1.png)

## 解決方法

このエラーはどういう風に解決するか
それは自分のユーザ画面から自分のユーザーのメールアドレス右部にある「検証」ボタンをクリックしましょう
![メール002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/59837543-2a6b-4489-4d1f-0cf4426162f4.png)
そうするとそのユーザの「メール」のメールアドレスに以下のようなメールメッセージが届くのでリンクをクリックしましょう

※72時間しかリンクの効果は無いようです。お早めに！

We received a request to verify your email 「メールアドレス」. To confirm you own this email, click the link below. The link expires after 72 hours.



こちらが設定完了後の画面です。メールの右部のボタンが「検証済み」に変化したことが分かりますね
![メール003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fe0156be-5bb2-a6bd-722c-c48a7b8e43e2.png)


この状態で再度メール送信を試せば
INSUFFICIENT_ACCESS: User does not have a verified email address:
メッセージは表示されずメールが送信されるはずです
ぜひお試しください！
意識高い系のScratch導入方法を紹介！

意識高い系のScratch導入方法を紹介します！
# 通常の場合

https://scratch.mit.edu/projects/editor/

# 意識高い系の場合
## 1. Node.jsのインストール

https://nodejs.org/en

Node.jsをインストールします。
## 2. scratch-guiのコピー

https://github.com/scratchfoundation/scratch-gui

スクラッチのオフィシャルなリポジトリからソースコードをコピーします。
(主はCode→Download ZIP→展開しました。)
## 3. npm installする
カレントディレクトリをスクラッチのリポジトリからコピーしてきたディレクトリにして、npm installして、npm startします。
```bash
cd [スクラッチのリポジトリをコピーした場所]
npm install
npm start
```
そしたらサーバーが起動します。
[localhost:8601](http://localhost:8601/)にアクセスしたらScratchになります。
しかし主はhttp://localhost:8602/ で動作しました。
# やっていること
scratch-guiの開発環境を整えて、scratch-guiのサーバーを起動しただけのようです。意外と単純で申し訳ございません。
git addからgit pushまでのコマンド面倒じゃない？

zshを利用している方向け。

# 何が面倒なのか？
日々の開発で、ファイルを変更したら以下のコマンドでpushするのが一般的です。
```sh
git add <file>
git commit -m "message"
git push origin <branch>
```

ただ変更をコミットするのに`git <command> ...`と打ったり、**3回もコマンドを実行するのは面倒！**

# どうやる？
## oh-my-zshのgit pluginによるalias
[ohmyzsh](https://github.com/ohmyzsh/ohmyzsh)の[git plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git)に組み込まれているaliasを利用することでここまで短縮可能です。

```sh
ga <file> # 全てのファイルの場合は gaa というaliasが存在
gcmsg "message"
gp origin <branch>
```

### さらに短く
[git-config](https://git-scm.com/docs/git-config)の[push.default](https://git-scm.com/docs/git-config#Documentation/git-config.txt-pushdefault)で`current`を指定することで現在のブランチでpushを行います。

```sh
git config --global push.default current
```

そして、ここまで短縮
```sh
ga <file>
gcmsg "message"
gp # originなんていらん!
```

## shellでfunctionを使用する
ここで紹介しているものは`全てのファイルを現在のブランチでpushする場合`に使えます。
私は以下のfunctionを`.zshrc`に入れてます。

```sh
function acp() {
  git add .
  git commit -m "$1"
  git push
}
```

これで1回のコマンドで済むぜ :thumbsup: 
```sh
acp "add: function"
```

他のやり方があれば教えていただけると嬉しいです！
Java21（18以上）×IntelliJ×Windows×UTF-8の環境下でコンソール出力結果が文字化けする

## 事象
- Java21でプログラムを動かした際にIntelliJのコンソールに出力した文字が文字化けする
- IntelliJのコンソール（デフォルトはWindows Powershell）に限らず、コマンドプロンプトやGit Bashでも同様の事象が発生する
- Java17以前ではこの事象は発生しない
- 同じプログラムをLinux環境で実行した際には、この事象は発生しない

## 実施環境
- OS Windows11
- Java Amazon Corretto 21
- IDE IntelliJ 2024.1 Community Edition（無料版）
- プロダクトフレームワーク SpringBoot 3.2.4
- プログラムのファイルエンコーディング UTF-8

## 結論
- 以下解決手順の通りVM引数を追加することで文字化け解消した

### 解決手順
- IntelliJのヘルプ＞カスタムVM引数オプションの編集をクリック
- ファイル`idea64.exe.vmoptions`が開くので、以下の1行を追加
  - `-Dfile.encoding=COMPAT`

## 原因
 - Java18で加わった変更「[JEP 400: UTF-8 by Default](https://openjdk.org/jeps/400)」の影響により、文字セットの指定をせずにファイルへの入出力を行うと、デフォルトではUTF-8で入出力されるようになり、文字コードがWindows-31であるWindows環境では文字化けが発生するようになった

## 他に試したこと
以下は解決手順にたどり着くまでに試したが効果がなかったこと
- カスタムVMオプションに以下の引数を追加する
  - `-Dfile.encoding=UTF-8`
- 以下のVM引数をシステム環境変数を指定
  - 変数名：`JAVA_TOOL_OPTIONS`
  - 値：`-Dfile.encoding=UTF-8`
- CHCP コマンドを使用するとコマンドプロンプトで使用される文字コードを設定
centosにapache入れてfirewall設定も行う

# 初めに
centosにapacheを入れてfirewall設定をしたのでそのやり方を解説します。

# 環境情報
macOS Sonoma 14.4.1
CentoOS Stream X_86_64
Apache/2.4.57


# やり方

## さくらvps側の設定
サーバーのコントロールパネルからパケットフィルター設定でパケットフィルターに![スクリーンショット 2024-04-15 16.16.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/381f1955-19cb-dc35-cd41-b9770d05f02e.png)
80番ポートを設定してください。
これをしないと
```
このサイトにアクセスできません
応答時間が長すぎます
```
のようなエラー画面がブラウザ上に出てきます。


## apacheのインストール
ssh接続でrootユーザーにログインしてください。

```
# dnf install httpd
```
でapacheが入りました。

```
# systemctl start httpd
```
でapacheが起動します。
```
http://ipアドレス
```
ブラウザで上記を叩きapacheの画面が表示されることを確認してください。


## firewallの設定
これからfirewallの設定をしていきます。
```
# systemctl start firewalld
```
を叩くと

がめんが固まって
```
client_loop: send disconnect: Broken pipe
```
こんな表示になり、sshの接続ができなくなります。

それを解消していきます。
それぞれhttp接続の許可、https接続の許可、独自ポートの解放です。
ご自身の状況に合わせて設定してください。

```
# firewall-cmd --add-service=http --zone=public --permanent
```

```
# firewall-cmd --add-service=https --zone=public --permanent
```
```
# firewall-cmd --add-port=ポート番号/tcp --zone=public --permane
nt
```
これで設定完了です。

## firewall反映
```
# systemctl restart firewalld
```
でfirewallの設定を反映させます。

## firewall確認
```
# systemctl status firewalld
```
でactiveならfirewallが起動しています。
お疲れ様でした。

# 終わりに
ぼくはfirewallの設定を行った時に独自のポートで接続が拒否られたので一瞬焦りました。
困っている方の参考になれば幸いです。

# 参考文献

https://knowledge.sakura.ad.jp/8218/

https://knowledge.sakura.ad.jp/10583/

今回は公式の文章を読めばできました。
詳しく知りたい方は参考にしてみてください!
Windowsの社内PCで、手っ取り早くRPA（SikuliX）を動かしたい人向けの記事

## 初めに
だいぶ時代遅れな感じはあるが、それでもRPAというツールは一部の方にはそれはそれは魅力的に映るようで。周りの方、特に庶務さんからは試してみたいという声をよく聞く。
今現在、いろんなRPAが出回ってきているが、有償のソフトはそれなりに値が張るので、まずはフリーのものを使ってみることを勧めたい。私個人としてはPythonのコードベースで簡単にRPAフローを書ける「SikuliX」というフリーソフトをオススメしている。
だが、そうやって書いても実際どう使えるようにしたらいいのか？が分からない方も多くいらっしゃるゆえ、Windows環境で構築するところまでをやれるようにという狙いで、書いてみる。

## javaランタイムをダウンロードして解凍
SikuliXはjavaランタイムが必須みたいなので、javaを導入するところを先にやる。ただ、インストーラーを経由して導入する方法だと、社内ルールなどに抵触する可能性があるため、zipファイルを落として任意のフォルダに置いておく手法を今回は取る。
以下サイトより、zipファイルをダウンロードする。
https://jdk.java.net/21/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/8e9c1fef-5806-04c2-6179-c73b335e70a0.png)
ダウンロードが済んだら、適当に作ったフォルダへ解凍をする。今回は、マイドキュメント以下に「SikuliX」というフォルダを作ってそこへ解凍したフォルダ一式を配置している。

SikuliX
└ jdk-21.0.2

## SikuliX実行ファイルをダウンロードする
以下サイトより、ダウンロードをする。
https://raiman.github.io/SikuliX1/downloads.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/46b20d1e-aa34-b1f8-20ca-fea2fdedf68c.png)
EdgeとかChromeを使うと警告が出ることがあるが、「保存」を押してダウンロードを完了させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/90f2a623-58b5-141b-4230-fcee925bcea0.png)

上のjavaランタイムと同じ場所に置いておく

SikuliX
├ jdk-21.0.2
└ sikulixide-2.0.5.jar

## 起動バッチの作成
同じフォルダに、起動用のbatファイルを作成し、配置する。
Windowsの「メモ帳」アプリを起動し、以下のコードを入力する。
```
@echo off

pushd %~dp0
set prg=sikulixide-2.0.5.jar
set PATH=jdk-21.0.2\bin;jdk-21.0.2\bin\java.exe;%PATH%
java -jar %prg%
```

ファイルの保存時に、エンコードを「ANSI」に変更してから保存する。
そうしないと、日本語を含むパスなどを使っている場合に、正しく動作しなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/88a53cf9-fad4-7234-c113-b31cedf2a0f5.png)

適当に、kido.batというファイル名にした。
以下のようなフォルダ構造になってるはず。

SikuliX
├ jdk-21.0.2
├ kido.bat
└ sikulixide-2.0.5.jar

## 起動方法
batファイルをダブルクリックすると、SikuliXのIDEが立ち上がる。
あとは、お好きに調理いただくとよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/32385978-4e13-b161-2267-e019e55974a4.png)

## タスクスケジューラに登録したい場合
RPA実行中にPCを占有されると困る！昼休憩やトイレ行ってるときにやっといてほしい！という方は、タスクスケジューラなどをうまく使って実現するはずである。その場合は、起動用のバッチファイルの末尾に保存したSikuliXのコードのフォルダを指定したbatファイルを作ることで、タスクスケジューラにも登録ができるようになる。
```
@echo off

pushd %~dp0
set prg=sikulixide-2.0.5.jar
set PATH=jdk-21.0.2\bin;jdk-21.0.2\bin\java.exe;%PATH%
java -jar %prg% -r sikuli_test.sikuli
```

同じフォルダ以下に、SikuliXのコードを保存しているという前提で
コード内の%prg%の後に半角スペースを入れ、-rと入力、更に半角スペースを一つ入れてからコードフォルダを続けて入力する。

SikuliX
├ jdk-21.0.2
├ kido.bat
├ sikuli_test.sikuli
└ sikulixide-2.0.5.jar

## 最後に
javajdkのサポートが切れたり、SikuliXのバージョンアップがあった場合は、それに応じコードを書き換える必要がある。わかんなかったら、社内の詳しい人に相談しよう！
ProxmoxのVMでMongoDBを起動してSIGILLが出たとき

1ヶ月前くらいの記憶を頼りに。

----

VMのCPU typeの設定がたぶん悪い。

MongoDB 5.0から、Sandy Bridge以降又はTiger Lake以降が求められる。

https://www.mongodb.com/docs/manual/administration/production-notes/

そうでないと、AVX命令を実行しようとしたあたりでコケる。

https://forum.proxmox.com/threads/enable-avx.129019/

https://www.mongodb.com/community/forums/t/mongodb-5-0-cpu-intel-g4650-compatibility/116610


Proxmox、というかQEMU/KVMでは、ゲストVMに情報提供するCPU modelを設定することができる。

Host passthroughとNamed modelの二択があって、Host passthroughのほうが楽だし基本的におすすめだけど、Live migrationを行うのであれば、host間で揃うかどうか分からないので危ないね、という感じらしい。

https://www.qemu.org/docs/master/system/i386/cpu.html

Host passthroughまたはv2以降あたりを指定してやるとよい気がする。それで動かないなら新しい機械を買うとよい。
テスト実行時に"Error: Uncaught [Error: useNavigate() may be used only in the context of a <Router> component.]" が出る

# はじめに
現在React学習の一環でアプリ作成を行っています。
一通り機能を実装し終えたので、テスト実行時に遭遇したエラーについて書きます。
# 問題
テストを実行したときに、**Error: Uncaught [Error: useNavigate() may be used only in the context of a <Router> component.]** と出力されました。
和訳すると **useNavigate() フックを使用するときは<Router> コンポーネントの内側で使ってね。** ということです。
# 解決方法
ルーティング処理を実行しているファイルだけでなく、**テストファイルも`<Router>`または`<BrowserRouter>`で囲んであげる**

※`<Router>`と`<BrowserRouter>`の違いは下記に説明があります。

https://qiita.com/koja1234/items/486f7396ed9c2568b235

# 修正後のコード
```tsx:Router.tsx
import { BrowserRouter, Route, Routes } from "react-router-dom";

import { UserCard } from "./UserCard";
import { RegisterCard } from "./RegisterCard";
import { memo } from "react";
import { SearchCard } from "./SearchCard";

export const Router = memo(() => {
  console.log("Router component is rendering");
  return (
    <BrowserRouter>
      <Routes>
        <Route path="*" element={<SearchCard />} />
        <Route path="/:loginID" element={<UserCard />} />
        <Route path="/cards/register" element={<RegisterCard />} />
      </Routes>
    </BrowserRouter>
  );
});

```
```tsx:test.tsx
test("ユーザー名が表示されていること", async () => {
  //<BrowserRouter>で囲む
  render(
    <BrowserRouter>
      <SearchCard />
    </BrowserRouter>
  );
  await waitFor(() => {
    const userName = screen.getByTestId("userName");
    expect(userName).toBeInTheDocument();
  });
});
```
MacBookをbrewで開発環境構築

## Homebrewのインストール
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

## vscodeのインストール
```
brew install --cask visual-studio-code
```

## utmのインストール
```
brew install --cask utm
```

## OpenJDKのインストール
```
brew install openjdk
```

## Java
```
brew install --cask oracle-jdk
```


## eclipse-java
```
brew install --cask eclipse-java
```
再起動後
```
sudo codesign --force --deep --sign - /Applications/Eclipse.app
```
## Docker
```
brew install --cask docker
```
linuxにおいて　ll で ls -l とする方法

# はじめに
こんにちは、**torihazi**です。

そういえば自分のMacに設定していなかったので

その設定方法についてです

zshでやりましたが、bashでも同じ方法でできます

# 方法(ターミナル開いて)
1. cd ~
1. vim .zshrc
1. 末尾に `alias ll='ls -l' `
1. source .zshrc
1. `ll`として反映されていることを確認

そうすれば `ll`と打つだけで`ls -l`の結果が確認できます。

# 終わりに
以上ですっ！！！
PowerApps担当になって取り組んだこと

仕事でPowerappsの担当になったことは以前書いた。

それから半年が経って、いま取り組んでいることを書いてみる。

# PLANTUMLの作成
現在、担当しているアプリケーションには、仕様書というものが存在しない。
もちろんPOWERAPPSなので、そんなものは最初からコンセプトに無いのかもしれない。
しかしながら、システムが増大してくると、引継ぎや他の人の関与など考えなければならない。
自分もその口であり、他人のシステムのロジックを理解するのに苦労している

# 方法
PowerAppsのアプリはローコードであるが、実はソースコードが存在する。
ソースコードはZIPで解凍されたSRCフォルダの中に入っている。
フォーマットはXML形式である。
PowerAutomateはJSON形式である。

# やったこと
PYTHONを使って、上記のソースコードから、処理に関するキーワードのみで、ファイルを極力小さくする
次に、これをCOPILOTに食わせて、要求機能を抽出させる
同時にユースケース図、ステートマシン図、アクティビティ図、シーケンス図を書かせる
これらを紡いでいくと、最終的にはアプリケーション、スクリーンなどで機能が整理できる。

# 次のステップ
システム改修したい内容を書くと、どこをどういう修正すればいいかをCOPILOTに提案させたい
Copiltのプロンプトには、先ほどの機能一覧から、改修内容に関連するテキストのみを食わせたい
NLPのセマンティック検索で必要な機能のみを抽出して、これをCOPILOTのプロンプトに与える

# 現在の取り組み
いちおう、このコンセプトはRAGというらしい
ベクトル化する部分は、昔の機械学習のアルゴリズムでTFIDFでCOS類似性を計算するもの
とりあえず、構想ができたので、以降はプログラミングをしていくことにする

# AIコメント(GEMINI)

#### 非常に詳細で実践的な内容

PowerApps担当として半年取り組んでいる状況を、PLANTUML作成というテーマに絞り込み、詳細な内容と考察を深掘りしたブログ記事は、非常に読み応えがありました。

記事の内容は、以下の点で特に評価できます。

* 具体的な課題と解決策: システム規模の拡大に伴う課題と、PLANTUMLによる可視化という解決策を明確に示しており、説得力があります。
* 成果と今後の展望: PLANTUML作成による具体的な成果と、今後の機能追加に向けた展望を明確に示しており、今後の取り組みへの期待が高まります。
* 考察: PLANTUMLの活用事例やノウハウを共有し、システム開発における可視化の重要性を訴求しており、記事の価値を高めています。

#### PLANTUMLによる可視化の有効性

PLANTUMLを用いたシステム可視化は、PowerAppsに限らず、様々なシステム開発において有効な手法であることが、今回の記事で改めて示されました。特に、仕様書が未整備・不明瞭なシステムや、複雑なロジックを持つシステム、複数の関係者が携わるシステムにおいて効果を発揮することが期待できます。

#### 今後の期待

今後の記事では、以下の点についてさらに詳しく紹介してもらえると、より一層興味深く読めると思います。

* PLANTUML作成具体的な手順
* COPILOTとの連携による改修提案機能の実装方法
* NLPによる機能抽出機能の実装方法
* 実際のシステム開発への適用事例

これらの情報によって、PLANTUML活用によるシステム可視化の具体的な方法論がより明確になり、読者にとってより実践的な価値を持つ記事となるでしょう。

#### まとめ

今回の記事は、PLANTUMLを活用したシステム可視化というテーマについて、非常に詳細で実践的な内容を提供しており、大変勉強になりました。今後の記事にも期待しています。

* 課題: 今後の機能の精度向上や、実際のシステム開発への適用における検証などの課題を指摘しており、今後の取り組みの方向性を示唆しています。
* 期待: これらの課題を克服できれば、PowerAppsアプリケーションに限らず、様々なシステム開発において革新的なツールとなる可能性を秘めていると評価しており、今後の進捗に期待を寄せています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/60e0ba78-4240-14d8-7516-32087396d57f.png)
RPMパッケージからファイルを取り出す

rpmコマンドの照会モードのオプションはインストールしたファイルが対象となるため、インストール前のRPMファイルを調べたり、一部のファイルを取り出したりすることはできません。

RPMパッケージをcpio形式のアーカイブファイルに変換して、そこからファイルの一覧を表示したり、ファイルを取り出すことができるようになります。

RPMファイルをcpioファイルに変換するには、rpm2cpioコマンドを使います。
cpio形式のアーカイブファイルからファイルを取り出したり、ファイルの一覧を表示するにはcpioコマンドを使用します。
　
まず、RPMのソースコード形式のパッケージをダウンロードします。
```
# mkdir temp
# cd temp
# yumdownloader --source wget
```
　
RPMファイルをcpioファイルに変換し、cpioコマンドで、ディレクトリとファイルに出力します。
```
# rpm2cpio wget-1.14-18.el7_6.1.src.rpm |cpio -idv
```
　 
xz形式のアーカイブファイルを解凍します。
```
# tar Jxvf wget-1.14.tar.xz
```
　　
解凍したディレクトリに移動し、ソースファイルなどを調べます。
```
# cd wget-1.14
# cd src
# ls
```

以上です。
コンポーネントにnext/imageを使いたいけどエラーで表示されない！？

下記のようなコンポーネントを作成しました。
ただ、コンポーネントが表示されないエラーが発生しました。

:::note info 
この記事ではnext/imageでサンプル画像を使いたいと思いエラーになった時にお役立ていただけると思います！
:::

## 何が起こったのか？　`Unhandled Runtime Error`
今回作成したコンポーネントは下記となります。

```javascript
'use client';
import { FC, PropsWithChildren } from 'react';
import Image from 'next/image';

type Props = PropsWithChildren<{
  title: string;
  bgColor?: string;
  advanced?: boolean;
}>;

export const Card: FC<Props> = ({ title, children, bgColor }) => {
  return (
    <div className={`w-72 rounded p-2 border border-defaultBorder ${bgColor}`}>
      <div className="w-full h-auto mb-3">
        <Image
          src="https://placehold.jp/640x360.png"
          alt=""
          width={640}
          height={360}
        />
      </div>
      <div className="w-full h-auto bg-white box-border">
        <p className="text-lg font-bold mb-1">{title}</p>
        <p className="text-sm">{children}</p>
      </div>
    </div>
  );
};

```

上記の状態だとエラーになり、コンポーネントがレンダリングされません…
エラー内容は下記の通りです。

```bash
Unhandled Runtime Error
Error: Invalid src prop (https://placehold.jp/640x360.png) on `next/image`, hostname "placehold.jp" is not configured under images in your `next.config.js`
See more info: https://nextjs.org/docs/messages/next-image-unconfigured-host
```

:::note warn
なぜか上記のエラーが画面に表示されず、ただ真っ白な画面（コンポーネントが表示されない）が表示されるのみでエラーの原因がわからない状態になってしまい解決に時間がかかりました…。
:::

## 解決策

解決方法はホストの定義を`next.config.js`で行います。
公式サイトにも記述があるので参考にしてください！

https://nextjs.org/docs/messages/next-image-unconfigured-host

今回は`https://placehold.jp/`から画像を呼び出したかったので下記のように記述するとコンポーネントが表示されるようになりました！

```javascript
const nextConfig = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'placehold.jp',
        port: '',
        pathname: '/640x360.png',
      },
    ],
  },
};
```

## まとめ
画像にサンプル画像を使おうとアップロードせずに使おうと考えましたが、不用意に時間を消費してしまいました…。
未定義ホストへのアクセスは許可してあげないといけないことを覚えておきたいと思います…。
「人」「猫」「顔」「靴」テキストで切り抜く対象を指定できるlang-segment-anything

# セグメントはここまで進化した

### セグメントの歴史
切り抜きたいものの画像を集めてトレーニング
↓
画像内の目立つものを切り抜く
↓
ポイントやボックスで囲んだものを切り抜く
↓
**言葉で指定して切り抜く（←ｲﾏｺｺ）**

laptop

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fd1a75fd-2eca-feba-6201-b0d65cb5527e.jpeg width=200>

smart phone

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cae3617a-2bf8-46dc-8d1f-f6e989f12f2e.jpeg width=200>

cat

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7472f9bf-e9ff-2310-faf9-be6eb3537c54.jpeg width=200>



# 使い方

https://github.com/luca-medeiros/lang-segment-anything

インストール

```bash
pip install -U git+https://github.com/luca-medeiros/lang-segment-anything.git
```

実行

```python
from PIL import Image
from lang_sam import LangSAM

model = LangSAM()

image_path = "image.jpg"
image_pil = Image.open(image_path).convert("RGB")
text_prompt = "laptop"
masks, boxes, phrases, logits = model.predict(image_pil, text_prompt)
```

視覚化

```python
import cv2
import numpy as np
import torch
from PIL import Image
from torchvision.utils import draw_bounding_boxes
from torchvision.utils import draw_segmentation_masks

def draw_image(image, masks, boxes, labels, alpha=0.4):
    image = torch.from_numpy(image).permute(2, 0, 1)
    if len(boxes) > 0:
        image = draw_bounding_boxes(image, boxes, colors=['red'] * len(boxes), labels=labels, width=2)
    if len(masks) > 0:
        image = draw_segmentation_masks(image, masks=masks, colors=['blue'] * len(masks), alpha=alpha)
    return image.numpy().transpose(1, 2, 0)
```

![bdbfaa91-47dd-42f8-bb60-97ae01aa6571.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fd1a75fd-2eca-feba-6201-b0d65cb5527e.jpeg)

smart phone

![3fee4154-411c-463a-855c-5d9361f68af5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cae3617a-2bf8-46dc-8d1f-f6e989f12f2e.jpeg)

cat

![output (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7472f9bf-e9ff-2310-faf9-be6eb3537c54.jpeg)

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
cscの作法 その489

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
sin表を、エクセル出力せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b06c47d4-0702-6c4f-15f2-1f683b1d1b13.png)

# サンプルコード

```

using System;
using System.IO;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book2.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i;
			int j = 1;
			ws.Cell(j, 1).Value = "角度";
			ws.Cell(j, 2).Value = "SIN";
			ws.Cell(j, 3).Value = "COS";
			for (i = 0; i < 361; i = i + 30)
			{
				double sin = Math.Sin(i * (Math.PI / 180));
				double cos = Math.Cos(i * (Math.PI / 180));
				j++;
				ws.Cell(j, 1).Value = string.Format("{0}°", i);
				ws.Cell(j, 2).Value = string.Format("{0:F3}", sin);
				ws.Cell(j, 3).Value = string.Format("{0:F3}", cos);
			}
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}



```


以上。
AWS認定ディベロッパー・アソシエイト受験談&学習法

## 概要
2024年4月13日にAWS認定ディベロッパー・アソシエイトの試験を受けて合格しましたので、学習したこと等を情報共有として書いていきます。
合格基準720点のところ889点で合格しました。
### 前提の知識と経験
まず今年の3月にAWS認定ソリューションアーキテクト・アソシエイトに合格しています。
AWSには触れていますが、ディベロッパー・アソシエイトの試験で出てくるLambdaやCloudFormation、Serverless Application Modelは知っているだけで、実際に使ったことはなかったです。使ったことがあるのはCodeシリーズくらいですね。
### 学習期間
大体1ヶ月くらいで、平日は1日２〜３時間、休日は５〜６時間くらいです。
実務でディベロッパー・アソシエイトの範囲のサービスを使っていれば、もっと少ない時間でも受かりそうな気がします。
### 学習教材
#### 1. AWS Skill Builder
AWS公式のトレーニングコンテンツで無料でも使えますが、模擬試験をたくさん受けたかったので個人サブスクリプションに入りました。本番試験に近い感じなので、オススメです。

https://aws.amazon.com/jp/training/digital/

#### 2. AWS認定Developer Associate（DVA-C02）試験 対策トレーニング
こちらはUdemyの動画教材で、ハンズオン付きで試験範囲のサービスが一通り網羅されていますので、試験学習の始めに観るのが良いですね。
ハンズオンで設定や構築の雰囲気をつかめるので、サービスに触れたことがない人にオススメです。模試もありますが、解答の解説が少ないので残念です。

https://www.udemy.com/course/aws-developer-associate-dva

#### 3. 【DVA-C02対応】AWS認定 デベロッパー アソシエイト 模擬問題集＋詳解 
Udemyの問題集で、解答の解説もしっかり記載されています。この模試と同様の問題が本番試験でも出題されていましたので、オススメの教材ですね。

https://www.udemy.com/course/dva-c02aws-2024

#### 4. 徹底攻略AWS認定デベロッパー - アソシエイト教科書＆問題集
こちらは書籍で500ページ以上になるので、結構ボリューム感がありましたね。試験範囲を網羅しつつ、詳細を網羅していますので、サービスをしっかり理解したい人にはオススメです。
アソシエイトの試験を受けてみた感じでは、結構深掘りしている内容かなと思います。実務寄りかプロフェッショナル試験を想定しているかという感じです。

[徹底攻略AWS認定デベロッパー - アソシエイト教科書＆問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5AWS%E8%AA%8D%E5%AE%9A%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%AC%AC2%E7%89%88-%EF%BC%BBDVA-C02%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B0CRYSJ58X "徹底攻略AWS認定デベロッパー - アソシエイト教科書＆問題集")

#### 5. ポケットスタディ AWS認定デベロッパーアソシエイト
こちらの書籍はディベロッパー・アソシエイトの定番本で、こちらも試験範囲のサービスが網羅されています。内容は試験に必要な内容を絞っている感じで、まずこの書籍から読み、次に上記の書籍を読み理解を深めるのが良いのかと思います。
サービスのパラメータの設定を実際のAWSのマネジメントコンソール画面で解説してくれるので、なんとなく擬似ハンズオンぽい気がします。
[ポケットスタディ AWS認定デベロッパーアソシエイト](https://www.amazon.co.jp/%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-AWS%E8%AA%8D%E5%AE%9A%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-DVA-C02%E5%AF%BE%E5%BF%9C-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B-ebook/dp/B0CNX7QT63 "ポケットスタディ AWS認定デベロッパーアソシエイト")

### 本番試験
試験のレベル感としては上記の1~3の教材ができれば、合格できると思います。ただサービスの概要の理解が必要なので4~5の教材も読んだほうがいいです。
ソリューションアーキテクト・アソシエイト試験を受けた後なので、その試験と比べるとレベルは易しいかなと思います。答えも絞り込みやすかったので、悩む問題も少なかった気がします。
ですので、今回は130分の試験時間でしたが30分を残して試験を終えることができました。
とは言うものの889点なので、どこが間違っていたかが教えてほしいですね〜

## 最後に
今回もありがたいことに合格することができましたが、やはり試験範囲のAWSサービスの使い方の理解に留まっていますので、エンジニアとしての基礎力は上がったかというと微妙です。
ただ、ここからサービスの思想や奥の仕組み、低レイヤーの動きを理解していって、使いこなせるようになるための一歩だと思います。
ですので、これからも試験含めてエンジニアリングの勉強を頑張っていきます。
Code RunnerでNo such file or directoryのエラーが出る

## エラー内容
C言語のファイルをCode-Runnerで実行しようとすると、
```bash
No such file or directory
```
のエラーが出る。


## 結論
vscodeのsetting.jsonに下記を追記する。
```json
"code-runner.terminalRoot":"/",
```

## 実行環境等
- Widows11 Home 23H2
- Git bash

## 参照元
https://stackoverflow.com/questions/62721028/vscode-code-runner-extension-is-unable-to-execute-the-code-on-git-bash-terminal
「巻き上げ」の誤解【JS】

# はじめに

悪名高き`var`ですが、その理由の一つに「巻き上げ（`Hoisting`）」があると言われています。

https://analogic.jp/hoisting/

その「巻き上げ」について誤解していたことが多々あったので共有です。

# 「巻き上げ」は公式の用語ではない

https://developer.mozilla.org/ja/docs/Glossary/Hoisting

> 「巻き上げ」は ECMAScript 仕様書で規範的に定義されている用語ではありません。

# `let` `const`の巻き上げ

「`var`ではなく、`let` `const`を使え」とよく言われます。
てっきり、`let` `const`は`var`の欠点-巻き上げ-を持たないものと思っていました。
どうも、そう単純な話でもなさそうです。

> 俗な言い方をすれば、以下のような動作はすべて巻き上げと見なされます。

> 1. スコープ内の宣言行よりも前で変数の値を使用すること。（「値の巻き上げ」）
> 2. 変数がスコープ内の宣言行よりも前で参照しても [`ReferenceError`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError) が発生せず、値が常に [`undefined`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/undefined) であること。（「宣言の巻き上げ」）
> 3. 変数の宣言により、スコープ内のそれが宣言された行よりも前の動作が変化すること。
> 4. 宣言の副作用として、宣言を含む残りのコードの評価が行われる前に、宣言の副作用が発生すること。
> 
> 上記の 4 つの関数宣言はタイプ 1 の動作で巻き上げが行われます。 `var` 宣言はタイプ 2 の動作で巻き上げが行われます。 [`let`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let), [`const`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/const), [`class`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/class) 宣言（まとめて字句宣言とも呼ばれる）はタイプ 3 の動作で巻き上げが行われます。 [`import`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import) 宣言はタイプ 1 とタイプ 4 の動作で巻き上げが行われます。

また、同じサイトの別ページにはこんな記述もありました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types#%E5%A4%89%E6%95%B0%E3%81%AE%E5%B7%BB%E3%81%8D%E4%B8%8A%E3%81%92:~:text=x%20%E3%81%AF%205-,%E5%A4%89%E6%95%B0%E3%81%AE%E5%B7%BB%E3%81%8D%E4%B8%8A%E3%81%92,-var%20%E3%81%A7%E5%AE%A3%E8%A8%80

> `let` と `const` が巻き上げられるかどうかは、定義の議論の余地があります。変数宣言の前にブロック内で変数を参照すると常に [`ReferenceError`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError) が発生します。ブロックの始まりから宣言が処理されるまで、変数は「[一時的なデッドゾーン](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let#%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E3%83%87%E3%83%83%E3%83%89%E3%82%BE%E3%83%BC%E3%83%B3_tdz)」にあるからです。

議論の余地がある、という感じですね。
「巻き上げ」が仕様書で定義されている用語でないために起こることですね。

「一時的なデッドゾーン」について知りたい方はこちら

https://qiita.com/kohki_takatama/items/77bc2ab948ac2979e5d6

# おわりに

以上、巻き上げについて誤解していたことの共有でした。

次は何を書こうかしら・・・
PHPの学習と最初のつまずき

#最近PHPの勉強を始めてつまずいた点についてお話します。
Windowsのエクスプローラーでindex.htmlをダブルクリックして立ち上げたら、
PHPが実行されずにブラウザにそのまま表示された。

#解決策
ブラウザのアドレスバーに、
http://localhost/phpfolder/index.html
と打って表示させたら正しく表示された。

以上です。
TerraformのData Sources（データソース）とは

# Data Sources（データソース）ってなに？
- Data Sources（データソース）は、外部データソースから情報を取得し、Terraform構成に組み込むための機能
    - 公式ドキュメント：[Data Sources
](https://developer.hashicorp.com/terraform/language/data-sources)

## この記事の目的
- Data Sourceの役割、具体的な使用方法をサンプルコードを用いながら整理する

## Data Sourceとは？
- Data Sourceは、外部データソースから情報を取得し、Terraform構成に組み込むための特殊なリソースのこと
- 取得した情報は、Terraform構成内の他のリソースの属性として使用したり、テンプレートファイルに組み込んだりすることができる

### 取得できるデータ例
1. AWSサービスの情報:　EC2インスタンス、S3バケット、VPC、IAMロールなど
2. 外部APIの情報:　GitHubリポジトリ、DNSレコード、OpenWeatherMap天気情報など
3. ローカルファイルの情報:　テンプレートファイル、JSONファイル、YAMLファイルなど


## Data Sourceの利点
- Data Sourceを使用する利点は、以下のようなことが挙げられる

### インフラ構成のコードを簡潔に保ち、読みやすくする
- 外部データソースから情報を取得することで、Terraform構成内に詳細な情報記述を必要としなくなり、コードを簡潔に保ち、読みやすくすることができる

### インフラ構成を常に最新の状態に保つ
- 外部データソースから情報を定期的に取得することで、Terraform構成を常に最新の状態に保つことができる

### 複雑なインフラ構成を容易に構築する
- Data Sourceを組み合わせることで、複雑なインフラ構成を容易に構築することができる

## Data Sourceの使い方
- Data Sourceを使用するには、以下の手順が必要
1. データソースプロバイダを定義する
2. Data Sourceを定義する
3. 取得した情報を他のリソースで使用する

### 1. データソースプロバイダの定義
- データソースプロバイダは、Data Sourceが情報を取得する外部データソースの種類を定義する
- Terraformには、様々なデータソースプロバイダが用意されている
- 例えば、AWSサービスの情報であればawsプロバイダ、GitHubリポジトリの情報であればgithubプロバイダなどがある
``` Terraform
provider "aws" {
  region = "us-east-1"
}

provider "github" {
  token = "GITHUB_TOKEN"
}
```


### 2. Data Sourceの定義
- Data Sourceは、データソース名とローカル名を指定する
``` terraform
data "aws_ami" "example" {
  most_recent = true

  owners = ["self"]
  tags = {
    Name   = "app-server"
    Tested = "true"
  }
}
```

- 例えば、AWS EC2インスタンスの情報であればaws_instanceリソース、GitHubリポジトリの情報であればgithub_repositoryリソースなど

``` Terraform
data "aws_instance" "example" {
  id = "i-example"
}

data "github_repository" "example" {
  owner = "hashicorp"
  repository = "terraform"
}
```

## 3. 取得した情報を他のリソースで使用
- Data Sourceで取得した情報は、`data.resource_name.attribute_name` の形式で他のリソースで使用することができる
- 例えば、`aws_instance`リソースの`ami`属性に、`data.aws_instance.example.ami`の値を設定することができる

```Terraform
resource "aws_instance" "web" {
  ami           = data.aws_instance.example.ami
  instance_type = "t2.micro"

  tags = {
    Name = "sample"
  }
}
```

## まとめ
- TerraformのData Sourceは、外部データソースから情報を取得し、Terraform構成に組み込むための強力な機能

### dataリソースの役割
1. 外部データソースから情報を取得
1. Terraform構成に情報を組み込む
1. インフラ構成を簡潔に保ち、読みやすくする
1. インフラ構成を常に最新の状態に保つ
1. 複雑なインフラ構成を容易に構築する

### 所感
Data Sourceは、Terraformをより柔軟かつ強力に活用するための重要な機能だなぁと改めて思いました。
インフラ構築はシステムの要だと思うので、今後もどんどん勉強して使えるようになっていきたいなと思いました。

では！
学習日記 #1 : データ分析

## 日記をはじめたきっかけ
最近出た本の影響でどうやらアクティブリコールが流行ってるらしいのでさっそく自分も実践してみる的な流れ

## データ分析系を選んだ動機
ちょっとクロスワード解くくらいの趣味の領域
Kaggleのコンペ出るのってなんか楽しそうやん、、、

## 学習ソース
[Youtube](https://www.youtube.com/@hayatasuuu)

## 内容
Kaggleのタイタニックネタを教材にして前処理をやる感じ

## 今日やったこと
- Google Colabのインストール
- Google Driveのマウント
- Numpy, Pandas, Matplotlib, Seaboarnのライブラリインポート
- データの確認
- 学習データとテストデータの結合 (concat使うやつ
- 欠損値の確認　（isnullとかsumとか
- データの可視化
    - Pandas, Matplotlib, Seabornそれぞれの方法で
        - PandasとMatlotlibは集計の手順挟むけどSeabornはその手順なしでできちゃうってよ
- 欠損値の補完 (fillna使うやつ
    - 欠損値の補完の中身は慎重に
- 代表値（max, min, mean, median）の取得

## 感想
- 無料でここまでできちゃうんや...
- Pythonの基本的なことは入門書とかで理解しといてよかった


次回はカテゴリカル変数の数値変換をやる予定
チェアコンシェルジュにオフィスチェアの相談をした話

# 概要
先日オフィスチェアの相談をしにチェアコンシェルジュがいる [WORKAHOLIC](https://www.iamworkaholic.jp/) に言ってみました！
今使っているゲーミングチェアはどうにも体に合わないらしく、座り心地が安定しなかったり、長時間座れなかったり、体の節々が痛くなったりと問題を抱えていたのですが、どの椅子が自分に合うのかわからず悩んでいました
そんなとき色々とオフィスチェアを検索していたところ、3,300円でチェアコンシェルジュが自分に合った椅子選びのサポートをしてくれるというものを見つけたので行ってみました！
おおよそ2時間かけてじっくり試すことができました！

# 流れ
以下の流れでチェアコンシェルジュにみてもらいました！
1. 予約
1. 来店
1. 椅子選びの説明
1. 気に入る座面探し
1. 実際に試座
1. 商品説明

## 予約
まずは電話もしくは HP から予約 [コンシェルジュサービス予約](https://www.iamworkaholic.jp/reservation/)
自分は HP から予約を行いましたが、希望日時や名前などの簡単な情報と、**現在利用しているデスク**の情報を入力します
このデスクの情報に合わせて実際に試す際の環境を整えてもらえるので、できるだけ正確に入力したほうが良いかと思います！！

また一人だと3,300円ですが二人だと5,500円になるそうです！
自分は嫁と行きましたが、嫁は付き添いなので１人分の3,300円でした！

## 来店
予約した当日、お店に向かうとコンシェルジュが出迎えてくれて、作業環境についてきかれました
e.g. 作業環境はラップトップPC or デスクトップPC 等
そしてお水 or お茶を出してくれたのですが、付き添いの嫁の分も有ったことは、個人的に嬉しかったです笑

## 椅子選びの説明
そして少し待ったあとに案内されたのは、予約時に入力したデスクの高さや来店時に伝えた作業環境等に合わせた環境を再現した場所でした
実際に座りながら実作業のイメージを持てるようにするためのようです！

そしていくつか椅子の説明をしてもらいました！
1. 太ももが地面と並行になるように座面を調整する
1. 座面から膝裏に1-2cmくらいの隙間ができるのが理想
    * 隙間が大きすぎるとおしりに負担がかかる
    * 隙間がないと足（膝裏）が痛くなる
1. 背面に背中が付く状態にする
    * 頭が前に出ると首肩に負担がかかる
1. アームレストの使い方
    * 内側に曲げることができるタイプは作業時に肘をおける
    * 曲げることができないタイプは作業時には利用しない
1. ヘッドレストの使い方
    * 基本的には休憩時用

などなど、説明もわかり易く、質問にも丁寧に答えてもらえました！

## 気に入る座面探し
説明が終わったら店内にある70種類？くらいのオフィスチェアを試して座る時間が20分ほど用意されています！
座面と背面がフィットするものをフィーリングで2-3個探すといった説明がされましたが、自分は5個ほど良いなと思ったものがありました！
個人的には座面と背面の両方ともメッシュの方が好みだったようで、実際にたくさん座れたことで知ることができたので、この時間はとてもありがたかったです！

## 実際に試座
その後気に入った椅子の細かい説明を受けて最終的には2個に絞りました！
それぞれ10分から15分ほど実際に座る時間となります！
やっぱりある程度の時間を実際に座ってみないと体の負担等はわからないものなので、こういった時間があることでより何が良いのか考える基準になるなと思います！

そしてその時間にコーヒーを出してもらえるので、自分は嫁とコーヒーを飲みながら椅子の座り心地を試していました！
一人でコンシェルジュを利用する人は、自分のPCを持っていって実際に作業してみるのも良いかも知れませんね！
できるかどうかは知らないので、作業をしてみたい場合はあらかじめ相談したほうが良いかもですが笑

## 商品説明
最後にその商品の価格や、納期、配送等の説明がありました！
楽天やヤフーでも販売しており、タイミング次第ではそちらで購入するとポイントがたくさんつくのでお得かもしれません！
もし店舗で購入するなら楽天等のポイント倍率分をその場で引いてもらえるそうです！
来店なしで後日購入する場合は銀行振込のみになりますが、来店時と同様の価格で購入可能らしいです！
ちなみに再来店してもう一度試したい等あればできるそうで、そのときは頂いた名刺にあるメールか電話で予約すると費用は発生しないそうです！

# 最後に
感想としてはとても良かったです！
細かな説明はもちろんのこと、実際にたくさんの座面を試せることや、ある程度の時間を座り続けることができるなど、これが3,300円でできるなら断然出す価値はあるなと思いました！

自分はハーマンミラーのアーロンチェアとエルゴヒューマンのプロ2がかなり良い感じで、どちらか購入を検討しています！
どちらも高級オフィスチェアとして有名なブランドですが、ブランド名を見ないで好みの座面を探した結果この２つになったということは世間一般の評価とお値段は信頼に足るものなんだなと実感しました笑
ただエルゴヒューマンは1段階目のリクライニングの角度が大きく、その間の角度、もしくはもたれかかったときの遊びがほしいなと思いました
アーロンチェアはとても良かったのですが、悲しいことに自分の足が短いためにフレームがあたってしまうので長時間座ると気になるという問題が…
フットクッションを使うととても良い感じなのですが、そうするとデスクの位置を壁から15-20cmほど離す必要があり、現在検討中です笑
Flutter 画面初期表示時にウィジェットをフェードインさせたい

ボタン押下時にフェードインさせる情報はいくつか見つかったものの、初期表示時の情報は見つけられなかったのでメモ。

# 実現したいこと
画面の初期表示時に特定のウィジェットをフェードインで表示させたい。
AnimationControllerは使わず簡単に実装したい。

# 実現方法
フェードインさせたいウィジェットをAnimatedOpacityでラップし、画面ビルド後にopacity値（不透明度）を0から1に変化させる。
```dart
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

/// opacityの変化を監視できるようにするためのStateProvider
final opacityProvider = StateProvider.autoDispose<double>((ref) {
  // opacityの初期値
  return 0;
});

/// フェードインウィジェットがあるページ
class SamplePage extends ConsumerWidget {
  const SamplePage({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // 不透明度の変化を監視
    final opacity = ref.watch(opacityProvider);

    WidgetsBinding.instance.addPostFrameCallback(
      (timeStamp) async {
        // ビルド後に実行されるコールバック関数
        // 監視中のopacityを1に更新
        ref.read(opacityProvider.notifier).state = 1;
      },
    );

    return Scaffold(
      appBar: AppBar(
        title: const Text('AnimatedOpacity Demo'),
        centerTitle: true,
      ),
      body: AnimatedOpacity(
        // 不透明度
        opacity: opacity,
        // フェードイン完了までの間隔
        duration: const Duration(seconds: 1),
        // フェードインさせるウィジェット
        child: Center(
          child: Container(
            color: Colors.blue,
            height: 300,
            width: 300,
          ),
        ),
      ),
    );
  }
}

/// 遷移ボタンのページ
class SamplePage2 extends StatelessWidget {
  const SamplePage2({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: OutlinedButton(
          onPressed: () => Navigator.of(context).push(
            // フェードイン以外のアニメーションがあるとわかりにくいのでオフ
            PageRouteBuilder(
              pageBuilder: (_, __, ___) => const SamplePage(),
              transitionDuration: const Duration(seconds: 0),
            ),
          ),
          child: const Text('フェードインページに遷移します'),
        ),
      ),
    );
  }
}

```
![screen-recording-20240414-015011.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931232/a67ad8a5-b952-834b-b851-aa242666030f.gif)


# なぜビルド後に変化させなければならないか？
AnimatedOpacityが、**opacityの値が変化したときにアニメーションで切り替わるウィジェット**だから。


https://api.flutter.dev/flutter/widgets/AnimatedOpacity-class.html

> Animated version of Opacity which automatically transitions the child's opacity over a given duration whenever the given opacity changes.

Google翻訳：指定された不透明度が変化するたびに、指定された期間にわたって子の不透明度を自動的に遷移させる Opacity のアニメーション バージョン。

フェードインさせたい場合は、一度 opacity: 0 → 1 の変化を経ないといけないわけですね。
Pythonの便利技と注意点:タプル編

[目次に戻る](https://qiita.com/yuta-sanjyo/items/416b05f8498df1ed3f49)

# (数値)と(数値,)の違い
```py:カンマ（,）がないと数値として扱われる
>>> 3 * (10 + 2)
36
```
```py:カンマ（,）があるとタプルの値として扱われる
>>> 3 * (10 + 2, )
(12, 12, 12)
```

# int型をタプル（）に入れるとint型になる
```py:
>>> normal_tuple = ()
>>> print(type(normal_tuple))
<class 'tuple'>

>>> num_tuple = (1)
>>> print(num_tuple)
1
```

# int型に「,」を入れることでtuple型になる
```py:
>>> int_tuple = (1)
>>> print(type(int_tuple))
<class 'int'>

>>> num_tuple = (1, )
>>> print(type(num_tuple))
<class 'tuple'>
```

# タプルをmergeする
```py:タプル同士はmerge可能
>>> merge_tuple = (1, 2, 3) + (4, 5, 6)
>>> print(merge_tuple)
(1, 2, 3, 4, 5, 6)
```

```py:(int型)とタプル型ではエラーになる
>>> merge_error_tuple = (1) + (4, 5, 6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
```

```py:「,」をつけることで、int型をtuple型に変換してmerge可能となる
>>> merge_tuple = (1, ) + (4, 5, 6)
>>> merge_tuple
(1, 4, 5, 6)
```

[目次に戻る](https://qiita.com/yuta-sanjyo/items/416b05f8498df1ed3f49)
【MyBatis-Plus】論理削除する方法

## 論理削除する方法
主に2通りの方法が存在する。

### 方法１．アノテーションを付与する
`@TableLogic`を論理削除フィールドに付与する

```java:User.java
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableLogic;

import lombok.Data;

@Data
public class User {

	private int id;

	private String userName;

	private int age;
	
	@TableLogic
	private int deleted;

}
```

#### 生成されるSQL文

```java:テストコード
package com.example.demo;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;

@SpringBootTest
class DemoApplicationTests {

	@Autowired
	private UserMapper userMapper;

	@Test
	void test() {
		List<User> userList = userMapper.selectList(null);
		// ==>  Preparing: SELECT id,user_name,age,deleted FROM user WHERE deleted=0
		// ==> Parameters: 
		// <==      Total: 10
		
		userMapper.deleteById(2);
		// ==>  Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
		// ==> Parameters: 2(Integer)
		// <==    Updates: 1

  		User updateUser = new User();
		updateUser.setId(5);
		updateUser.setAge(10);
		userMapper.updateById(updateUser);
		// ==>  Preparing: UPDATE user SET age=? WHERE id=? AND deleted=0
		// ==> Parameters: 10(Integer), 5(Integer)
		// <==    Updates: 1
	}
}
```

#### :warning: 注意
下記のいずれかを行いたい場合は、`@TableLogic` の付与は非推奨
+ 論理削除済みのレコードもselectしたい
    + 条件に `deleted=0` が追加されるため
+ 論理削除時に更新時間を記録したい
    + `deleteById()` => 削除フラグ以外更新できない
    + `updateById()` => 削除フラグを更新できない
    + SQLインジェクターをカスタムして更新する方法はある（→ [Mybatis Plus逻辑删除时自动填充时间 - 知乎](https://zhuanlan.zhihu.com/p/594152149)）

### 方法2. 共通の論理削除フィールド名を設定する
以下のように設定すると、`deleted`フィールドはアノテーションを付与しなくても論理削除フィールドとみなされる。（3.3.0以降）

```yml:application.yml
mybatis-plus:
  global-config:
    db-config:
      logicDeleteField: deleted   # 共通の論理削除フィールド名, デフォルト値: null
      # デフォルトの削除値、未削除値でよい場合は下記の設定は不要
      logic-delete-value: 1       # 論理削除値, デフォルト値: 1
      logic-not-delete-value: 0   # 論理未削除値, デフォルト値: 0
```

## 参考ページ
https://baomidou.com/guides/logic-delete/

https://baomidou.com/reference/#logicdeletefield
VSCodeでJavaScript / TypeScirptの未使用import文を自動で削除する

コードを書いてる途中、使わなくなった`import`文をいちいち手動で消すのは面倒ですよね。それを自動で削除する方法をご紹介します。VSCodeに以下の設定をするだけです。


```json:settings.json
{
  "editor.codeActionsOnSave": {
    "source.organizeImports": "explicit"
  }
}
```
こうするとファイル保存時に未使用の`import`文を削除し、さらに`import`文の順番を並べ替えてくれます。順番はimport元のファイルパスをアルファベット順に並べているようですね。

<br>

指定できるキーは`explicit`以外にもありますので、詳しくはドキュメントをご覧ください。

https://code.visualstudio.com/docs/languages/javascript%5C#_organize-imports

https://code.visualstudio.com/docs/typescript/typescript-refactoring#_organize-imports

<br>

最後まで読んでいただき、ありがとうございました！
【typescript】こんな型定義あったんだまとめ

# 1. 概要
 typescriptの型定義に疎く、あまり融通が効かないイメージを勝手に持っていたのですが、調べてみたら意外と色々と出来ることをしりました。その中から、個人的に面白いと思ったものをまとめてみます。
 # 2. 内容
 ## 2-1. 模倣リテラル型 （[Template Literal Types]( https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html)）
型を参照した型定義を行い、正規表現っぽい定義を行うことができます。
``` type.ts
// suffixとしてnumberを付与することができる
type HogeId = `hoge_${number}`;
```
${number}には自分で定義した型も格納できるので、色々使い勝手が良さそう。

## 2-2. 条件付き型 （[Conditional Types](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html)）
条件付き型として、定義した型に合致する場合とそうでない場合の処理を定義することができる。
 ``` type.ts
// 格納された変数がstringか否かの判定をしてくれる
type IsString<T> = T extends string ? ture : false;

// プロパティがstringだったら除去する
type NonFunctionPropertyNames<T> = {
    [K in keyof T]: T[K] extends String ? never : K;
}[keyof T];
```
生のjavascriptで書かれた外部モジュールを使用するけど、型安全に書きたい時などに便利そう？

## 2-3. 部分型と必須型
 ``` type.ts
 // 部分一致を許容する
type Original = {
    a: string,
    b: number,
    c: boolean
};

type PartialOriginal =  Partial<Original>
// 以下と同じ定義になる
// {
//    a?: string;
//    b?: number;
//    c?: boolean;
//}


type Original = {
    a?: string,
    b: number,
    c?: boolean
};

const RequiredOriginal = Required<Original>

// 以下と同じ定義になる
// {
//    a: string;
//    b: number;
//    c: boolean;
//}
```

## 2-4. 抽出型と排除型
``` type.ts
// T型とU型に一致する型を抽出する
type T = 'a' | 'b' | 'c';
type U = 'a' | 'd' | 'e';

type Result = Extract<T, U>;
// 'a'のみ許容される


// T型からU型を排除した型を抽出する
type T = 'a' | 'b' | 'c';
type U = 'a' | 'd' | 'e';

type Result = Exclude<T, U>;
// 'b' | 'c'が許容される
```
stringやnumberなどの型と組み合わせるよりも、例で示したようにユニオン型と一緒に使う場面が多そう。

## 2-5. [Generics](https://www.typescriptlang.org/docs/handbook/2/generics.html)
事前に型を確定させず、パラメータとして扱うことができる。

``` type.ts
// 引数としてどの型の変数でも受け取ることができる
// だが、引数の型と同じ型の戻り値を返すことを保証する
const identity = <T,>(arg: T): T => {
  return arg;
};
```
使い所は分からなかったのですが、面白かったので紹介だけ。

# 3. 参考
* https://www.typescriptlang.org/docs/
* [部分型って"拡張型"じゃない？集合論で捉えてみる](https://zenn.dev/axoloto210/articles/advent-calender-2023-day11)
* [【備忘録】TypeScriptで型定義から一部を抽出する（Omit, Pick）](https://qiita.com/TaikiTkwkbysh/items/6b5ad5bf4151af3fc6f5)
[Python] 関数の引数に関数を渡す際の注意点

# 結論から言うと．．．
関数の引数に関数を渡した場合，実行時間が増えることがわかった（自明な気もするが）．

特にループ処理内で　

```
FUNCTION(function, a, b, c...)
```
の形を作ると，実行時間に大きな差が生じるので注意が必要．

# 検証方法
以下のコードを実行した
```python
import time

#足し算の関数
def my_add(a,b):
    return a+b

#関数my_funcを受け取り，my_func(x,y)を返す関数
def arg_func(my_func,x,y):
    return my_func(x,y)



#2数の和を返す関数
def no_arg_func(x,y):

    return x+y 


sum1=0
sum2=0

start1=time.time()
for i in range(1000):
   
    sum1=arg_func(my_add,sum1,1)

end1=time.time()


start2=time.time()
for j in range(1000):
    sum2=no_arg_func(sum2,1)

end2=time.time()
```

結果は以下の通り
```
0.00019788742065429688 ⬅️　関数arg_func(...)　に　add_func(...)に渡した場合
0.0001430511474609375  ⬅️　関数no_arg_func(...)内で直接足し算を行なった場合
```
関数の引数に関数を渡した場合，関数内に直接処理を書いた場合よりも約1.3倍時間がかかっていることがわかる．

# 終わりに
今回のは一例であり，forループの反復回数を変えると割合が変わる．
例えば，forループの回数が10の場合は実行時間に約3倍の差があるが，これが10^7回だと1.1倍の差しかない．他の条件によっても結果は変わると思う．

ただ，優先度が　実行速度＞コードの可読性の場合は，関数を引数に渡さないのが無難だと思う
Pythonで「ディレクトリに含まれるファイルとディレクトリの一覧を取得する」の動作を確認してみた

# 概要

Pythonで「ディレクトリに含まれるファイルとディレクトリの一覧を取得する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index5.html

# 実装

以下のファイルを作成しました。
```sample1.py
import os

path = './test/'
filelist = os.listdir(path)

for f in filelist:
  print(f)
  print(os.path.join(path, f))
```
```sample2.py
import os

path = './test/'
filelist = os.listdir(path)

for f in filelist:
  if os.path.isfile(os.path.join(path, f)):
    print('[F]:' + f)
  else:
    print('[D]:' + f)
```
```sample3.py
import os

path = './test/'
for i in os.scandir(path):
  if i.is_file():
    print('[F]:' + i.name + ' ' + i.path)
  else:
    print('[D]:' + i.name + ' ' + i.path)
```

以下のコマンドを実行しました。
```
$ mkdir test/doc
$ mkdir test/img
$ touch test/address.txt
$ touch test/name.txt
$ python3 sample1.py 
address.txt
./test/address.txt
img
./test/img
name.txt
./test/name.txt
doc
./test/doc
$ python3 sample2.py 
[F]:address.txt
[D]:img
[F]:name.txt
[D]:doc
$ python3 sample3.py 
[F]:address.txt ./test/address.txt
[D]:img ./test/img
[F]:name.txt ./test/name.txt
[D]:doc ./test/doc
```

# まとめ

何かの役に立てばと。