OmniAICreator/Qiita-1.07M huggingface dataset:
何でもかんでも「コンソールでやってみない？」3日目


# ArduinoCLIで出来ること
ArduinoCLIで何が出来るかを簡単にまとめてみましょう。

1. なんでもできる。

終わりです。

これもCLIアプリの特徴ですが、大半のCLIアプリケーションにおいて、GUIアプリケーションと同等の機能が提供されています。
そのため、プログラムをコンパイルしてESP32に転送することだってできます。

じゃあこのなんでもできるArduinoCLIを使用して、プログラムのコンパイルなどなどしてきましょう。

# まずはプロジェクトを用意

今回は既にプロジェクトがあるものとしましょう。
ターミナルで編集する方法については後で話しますね。

ファイル構成として、カレントディレクトリに`esp32_ledtest`というフォルダがあり、その中に`esp32_ledtest.ino`というファイルがあるとします。

（これはArduinoのプロジェクトのファイル構成がこんな感じだからです。）

# 設定の初期化
では早速、`arduino-cli config init`と実行してみましょう。

これは、ArduinoCLIのユーザー設定を初期化するコマンドです。

# ボードの追加

次に、ESP32用の追加のボードマネージャーのURLを設定しましょう。
ArduinoIDEでは設定から簡単に追加できましたが、CLIではどうでしょう。

先ほどのコマンドの実行結果に`xxx/arduino-cli.yaml`といったパスが表示されたと思います。
この設定ファイルの`board_manager`>`additional_urls`の中に`https://espressif.github.io/arduino-esp32/package_esp32_index.json`を追加してください。

```yaml
board_manager:
  additional_urls:
    - https://espressif.github.io/arduino-esp32/package_esp32_index.json
```

こんな感じになりますかね。

そしたら次に`arduino-cli core update-index`と実行してみましょう。
これは、インデックスのアップデートなので、ボードマネージャー追加とかしたら実行しておいてあげましょう。

最後に`arduino-cli core install esp32:esp32`と実行しましょう。
これで、ESP32のボードマネージャーが追加されました。

これが初期セットアップですね。

# コンパイルしてみよう

```sh
$ arduino-cli compile -b esp32:esp32:esp32 esp32_ledtest -e
```
実行してみましょう。

なんかちょっと経ったらビルドが成功したあれが表示されると思います。

もうこれだけです。これだけでコンパイルは終わりなのです。

## 今のコマンドの構造

```sh
$ arduino-cli compile -b FQBN プロジェクトフォルダ -e
```

FQBNっていうのは、`ESP32 Dev Module`とか`ESP32 Wrover Module`のような、ボードの選択を表すもので、`esp32:esp32:esp32`(これはESP32 Dev Module)のような形式で指定します。

プロジェクトフォルダはまんまプロジェクトフォルダで、`xxx.ino`があるフォルダのことです。
ちなみにカレントフォルダに`xxx.ino`があればプロジェクトフォルダは指定しなくても大丈夫です。

`-e`オプションは、指定したらコンパイルされたバイナリが`build`フォルダに保存されます。
あってもなくてもまぁどっちでも...

# コンパイルすると...？
先ほどの設定でコンパイルすると、`build/esp32.esp32.esp32`に沢山ファイルが出来上がると思います。
~~そのうち、実際に書き込みに使うのは`esp32_ledtest.ino.zip`というファイルのみです。~~
ESP32でのコンパイルにおいては、`.zip`ファイルは生成されませんでした。悲しいですね。代わりに`esp32_ledtest.ino.bin`が書き込みに使われるらしいです。
何でもかんでも「コンソールでやってみない？」2日目


# わー！Arduinoの伏線回収だ〜！
今回は、Arduinoのプロジェクトに対して、すべてコマンドでビルドから何までやってみたいと思います。

そのために使うのは`Arduino CLI`というものです。

https://arduino.github.io/arduino-cli/latest/installation/

こちらからダウンロードできます。

展開するなりなんなりして、実行できる環境まで持っていってください。
`arduino-cli.exe`とか`arduino-cli`みたいなファイルだけにすれば大丈夫だと思います。
分かりやすく、ユーザーディレクトリの上に`arduino-cli`ってフォルダを作ってその中に入れておいてください。

ではここから大事な「PATH通し」という作業を行います。

# PATH通し？
ここからはPATH通しという作業を行なっていきます。
そもそも、PATHとはご存知でしょうか。

## PATHとは。
一言でまとめるなら「実行ファイルがあるディレクトリの一覧的なやつ」です。

Linuxユーザーのみなさん、パッケージをアップデートするときはなんかコマンド打ちますよね。
そうそう、aptとかyumとかpacmanとかsnapとか。

ターミナルに`apt`って入れたらaptが実行されますよね。
でも、そのディレクトリに`apt`という実行ファイルがあるわけじゃないですよね。
じゃあ`apt`がどこにあるかっていう話なんすけど、`which apt`とかって入れてみましょう。

```sh
$ which apt
/usr/bin/apt
```

どうやら`/usr/bin/apt`にあるらしいですね。
じゃあターミナルは、何を参考にして`/usr/bin`に`apt`があるよってわかったのでしょうか。

そこで`PATH`という環境変数が登場します。
この`PATH`という環境変数は、実行ファイルがあるディレクトリを一覧でまとめています。

あなたが`apt`と入力すると、PATHにあるディレクトリ全てにおいて`apt`って実行ファイルがあるかどうか調べ、あったら実行するみたいなことをやっているのです。

つまり逆を返せば、`PATH`のディレクトリにある実行ファイルは、どこからでも実行できるというわけです。
じゃあ、このPATHにディレクトリを追加すれば楽だよね〜っていうのがPATH通しみたいな感じです。

ちなみにイメージなんで実際とはちょっと違うと思います。多分違う。

# じゃあPATHを通そう
とりあえずLinuxから。

## for Linux

雑にいえばPATHという環境変数にディレクトリを追加するだけです。
それにはexportコマンドを使用します。

```sh
$ export PATH="$PATH:~/arduino-cli"
```

わぁ簡単。

一応ちゃんとした説明として、`export`コマンドというものがまず環境変数を設定するコマンドです。
今回は`PATH`という環境変数を`$PATH:~/arduino-cli`にしています。
この`$PATH:~/arduino-cli`というののうち、`$PATH`は現在の環境変数`PATH`に置き換えられるので、実質的に`~/arduino-cli`をPATHに追記したという感じになります。
ちなみにコロンは区切りです。

でも、これだと該当ターミナルが閉じちゃうとリセットされます。
じゃあこれを永久的に設定する方法はないものでしょうか。

よく使われる方法として`~/.bash_profile`に今のコマンドを書くという方法があります。
`~/.bash_profile`というのは、bash起動時に実行されるコマンドをまとめてるで〜みたいな感じのやつです。
そこに追加すれば、bash起動時に勝手にPATHに追加してくれますよね。
（もちろんzshだったら`~/.zprofile`とかって別のファイルがあります。）

## for Windows

とっても簡単。

みんな大好きエンターキーを押して`PATH`と入力。
「システム環境変数の編集」を選んで、ユーザーの`Path`って書いてあるやつを編集するだけです。

# じゃあ実際に実行してみよう！
Windowsの方は、一回すべてのターミナルを閉じることを推奨します。

じゃあ`arduino-cli`って入力してみましょう。

すると...！？

# まとめ

多分みなさんArduinoCLIがこれで実行できるようになったと思います。
さて、体調不良など相も変わらず冬は忙しいですね。
もうちょっと私もなんとかします。

次回はちょっとArduinoCLIの最低限の環境構築だけでもしてやめます。
日にちがたりないかもおお！！！！！！！
何でもかんでも「コンソールでやってみない？」1日目


# 割り込み処理とは
プログラムの流れがある時、何か途中で別のプログラムを動作させる時、そのメインのループ処理内で割り込んで処理するやつのことを言います多分。
今回で言うメインルーチンは「Discord BOTでも作ってみない？」で、割り込み処理は今回から始まる「コンソールでやってみない？」です。
ごめんなさい脱線話です。

# コンソールでやってみるメリットとデメリット

それぞれのメリットデメリットを見てみて、何でもかんでもコンソールでやってみよっかな〜って思った人はぜひ次以降の記事も見て見てください。

## メリット
### 何よりかっこいい！！！！！
まぁこれにつきますよね。
なんか黒い画面でかちゃかちゃしてるのみるとかっこいいですよね。多分。
ただスタバでドヤる時にあんまコンソールやってる人見かけませんよね...みんなSlackかWordかなんか開いてますよね...
スタバ以外ならきっといい感じになるに違いないかっこよさはあります。

### GUIより早い場合がある
マウスでカチカチ開いているよりも早い場合があります。
わざわざVSCodeを開くほどでもない時にnanoで秒速編集して終わりみたいな感じです。
複雑な操作もコマンド一つでできるってなったら結構楽な気がしますよね。

### 他のプログラムと連携させることができる
今回の記事で主に取り上げていくのはこれですね。
前回の記事でDiscordBOTで何かする〜みたいなことを言ったと思うのですが、そう言う時にコマンドが実装されていれば簡単に作成できますよね。
そうじゃなくても、複数のコマンドをまとめて実行することで、多くの作業をひとまとめにできちゃいます。
言葉だけ聞くとなんか楽そうですよね。

## デメリット

### 初心者にはちょっと抵抗感がある
「いや普通にGUIでやった方が楽じゃん」っていう声がちらほら聞こえてきます。
やっぱりコマンドを打つっていうのは初めての人にはちょっと怖かったり抵抗感がありますよね。
あと、大体のコンソールアプリは英語だったりするので、英語に慣れてないとちんぷんかんぷんかもしれません。

### ぱっと見じゃわからん
GUIだったらどこを押せばどうなるかとかがわかりやすいものが多いですよね。
ただCUIでは初心者には難解で何言ってるのか分からないdocsを見ないと何がどうできるのかが分かりにくいかもしれませんね。
勢いで実行してみてもただコマンドヘルプが表示されるだけで困っちゃいますね。

# まとめると...？
何でもかんでもをコマンドでやるのは、ロマン世界だなんて言われます。
が、もちろん利便性もあるので、全てがロマンでできているわけでもないです。
もし、興味を惹かれたらまずはターミナルを開いてみましょう。
2023年に学習終了したUdemy講座まとめ

## はじめに
フリーランスエンジニア8年目の自称フルスタックエンジニアです。
そろそろ2023年も終わりに近づいてきたので今年1年Udemyにて学習修了した教材をまとめたいと思います。
個人的には今年はかなりやった方かなと。

## 終了したUdemyの教材
- [NestJS + Next.js によるフルスタックWeb開発](https://www.udemy.com/course/nestjs-nextjs-restapi-react/)
- [Go言語で学ぶ実践gRPC入門](https://www.udemy.com/course/go-grpc-x/)
- [【NotionをCMSに】NotionAPI + Next.js + TypeScript でブログ開発〜デプロイまで](https://www.udemy.com/course/notion-next-blog/)
- [実践DApp開発入門 〜NFT編ステージ２〜](https://www.udemy.com/course/dappnft2/)
- [【注目スキル：DApp(分散アプリケーション)】体系的に学ぶ『スマートコントラクト』開発〜NFT編ステージ１〜](https://www.udemy.com/course/dappnft1/)


## 各教材の紹介

### [NestJS + Next.js によるフルスタックWeb開発](https://www.udemy.com/course/nestjs-nextjs-restapi-react/)
NestJSを現場で開発することになりそうなのでこちらのコンテンツを学習しました。
NestJSの基礎であるModule、Controller、Service、DIについて体系的に学べるので個人的にはかなり良かったです。
この講座ではORMの仕組みをPrisma、フロントエンドの仕組みをNextJSを使用しているので、周辺のモダンなフロントエンド開発をまとめて勉強することが可能なのでかなりおすすめです。

### [Go言語で学ぶ実践gRPC入門](https://www.udemy.com/course/go-grpc-x/)
Go言語の学習を行いたく今まで避けてきたgRPCをこの機会に学習しました。
gRPCを独学で勉強しようとするとかなり理解に時間が必要かと思いますが、この講座重要な要点をまとめてくれているので
短時間で基本的な仕組みを知ることができました。
Protocol Buffers、HTTP2、通信方式についてそれぞれかなり分かりやすく説明してくれてます。
双方向通信でGo言語のキモとなるゴールーチンとチャンネルについても触れているのでGoの学習にも適していると思います。

### [実践DApp開発入門 〜NFT編ステージ２〜](https://www.udemy.com/course/dappnft2/)
DAppを本格的に学習するためにこちら講座を一通りやりました。
スマートコントラクトの開発、デプロイまでを体系的に学べかなり実践的な知識が身に付くことができたのかなと思います。
Hardhatのスマートコントラクトの実装、単体テスト、デプロイ学ぶことが可能です。
こちらはかなり実践的なので後述で紹介するNFT編ステージ１を先に学びことをおすすめします。
辛かった点は現在はethereumテストネットのGoeri、Mumbaiともに無料でトークンが取得できなくなっているのでsepoliaに置き換えて実装した点は苦労しました。

### [【注目スキル：DApp(分散アプリケーション)】体系的に学ぶ『スマートコントラクト』開発〜NFT編ステージ１〜](https://www.udemy.com/course/dappnft1/)
スマートコントラクト、Solidity、ERC721の基本を学ぶにはまずこちらを学習することをおすすめします。
Solidityの基本文法とNFTについての基礎が学べます。開発はRemixIDEで行うので基本的には準備不要でスマートコントラクト開発がすることが可能です。
こちらもethereumテストネットのGoeri、Mumbaiともに無料でトークンが取得できなくなっているのでsepoliaに置き換えて実装した点は苦労しました。

### [【NotionをCMSに】NotionAPI + Next.js + TypeScript でブログ開発〜デプロイまで](https://www.udemy.com/course/notion-next-blog/)
実用的なアプリケーションをさくっと学びたいと思い、こちらの講座を行いました。
NotionAPIをバックエンドに、Vercelにデプロイするのでこの講座を行うだけで簡単ブログを作成するところまで体験できます。NextJSに関してもISR(Incremental Static Regeneration)で描画する仕組みを教えてくれるのでNextJSならではの機能も学ぶことができます。

## まとめ
どの講座も比較的新しい技術を使ったものを学習したので収録時点でのバージョンや環境とは異なることが多い点が苦戦しましたが、それを乗り越えて修了したことに意味があったかなと思います。
最近は開発、テスト、デプロイまでの実装を一つの講座で学習できる教材が多いのでやり切る達成感を味わえるで初学者の方にもおすすめします。
ちなみに次は[NestJS × Reactで学ぶフルスタックGraphQLアプリケーション開発](https://www.udemy.com/course/nestjs-react-graphql/)を学習予定です。
Python xampp python/CGI localhostで動かしてみる。

pyton をローカルホストで*.cgiとして動かすには、xamppをどこも触る必要はありません。
ただし、htdocsディレクトリ内にfileを置く必要はあります。
アナコンダ(anaconda)統合環境でflaskが使えるのに、入っているのと、pyton本家にあるのと、2つanacondaディレクトリ、Pytonディレクトリにそれぞれ、フォルダーを指定してインストールしました。使いやすい様に。
それでは、anacondaのpytonを動かす方
```python
#!C:/anaconda/python -X utf8
# coding=utf-8

#anaconda python3.10.9
point_err = bool(1)
point_return = bool(0)
settig_msgA = 'NO Settig.'
settig_msgB = 'NO Settig.'
error_detail = 'No Error.'
def my_error(error_detail):
    if point_err:
        print ("Content-type:text/html\n\n")
        print ('<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>Error</title></head><body>')
    print ('<h1>エラー発生(An error has occurred.)</h1><h2>detail :'+error_detail+'</h2><div style=\"background-color: #000066;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgA+'</div><div style=\"background-color: #006600;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgB+'</div><br>')
    if point_return:
        return
    print ('</body></html>\n')
    exit()
    
my_error('オープン前エラー Occurrence before opening <b>test.</b>')

```
一応ファイル名として「py_anaconda_test.cgi」として「http://127.0.0.1/python_test/py_anaconda_test.cgi」として、呼び出します。
1行目と２行目が他のcgiと違います。

次にPyton3_12_1をインストールした方です。
```python
#!C:/Python/python -X utf8
# coding=utf-8

#python python3.12.1
point_err = bool(1)
point_return = bool(0)
settig_msgA = 'NO Settig.'
settig_msgB = 'NO Settig.'
error_detail = 'No Error.'
def my_error(error_detail):
    if point_err:
        print ("Content-type:text/html\n\n")
        print ('<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>Error</title></head><body>')
    print ('<h1>エラー発生(An error has occurred.)</h1><h2>detail :'+error_detail+'</h2><div style=\"background-color: #000066;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgA+'</div><div style=\"background-color: #006600;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgB+'</div><br>')
    if point_return:
        return
    print ('</body></html>\n')
    exit()
    
my_error('オープン前エラー Occurrence before opening <b>test.</b>')

```
1行目以外はanacondaと、同じにしています。
ファイル名は「py_python_12_test.cgi」で呼び出しは「http://127.0.0.1/python_test/py_python_12_test.cgi」となっています。

他にも参考を掛ければ良いのですが、以前に出したサンプルから、進化していません。ここまで一応、報告として。
kintone から Teams への通知投稿


## Kintone から Teams への通知投稿の手順

### やること
kintoneから新規データが作られたときに、特定のチャネルのTeamsに通知を送る

### 手順


2. **特定のイベントにフックしてTeamsに通知を飛ばす**（ここでは保存成功時）
   - Kintoneで新しいデータが作られたら、その情報をTeamsに通知する処理を書く

   ```javascript
   (function() {
    "use strict";

    // kintoneのレコード保存時のイベントをトリガーに設定
    const EVENTS = ['app.record.create.submit.success', 'app.record.edit.submit.success'];
    kintone.events.on(EVENTS, function(event) {
        
        // Teamsへの投稿処理を実行
        postToTeams(event.record);

        // イベント処理を続行
        return event;
    });

    // Teamsへの投稿処理
    function postToTeams(record) {
        const webhookUrl = 'https://outlook.office.com/webhook/...'; // ここにWebhook URLを設定
        const payload = {
            "@type": "MessageCard",
            "@context": "http://schema.org/extensions",
            "summary": "kintoneからの通知",
            "sections": [{
                "activityTitle": "新しいレコードが追加/更新されました",
                "facts": [
                    { "name": "レコード番号", "value": record['$id'].value },
                    // 他のフィールド情報をここに追加
                ],
                "markdown": true
            }]
        };

        kintone.proxy(webhookUrl, 'POST', {'Content-Type': 'application/json'}, JSON.stringify(payload), function(body, status, headers) {
            console.log('Teamsへの投稿に成功しました。', body, status);
        }, function(error) {
            console.error('Teamsへの投稿に失敗しました。', error);
        });
    }
    })();
【Spring Data JPA】Database操作①

# 基本クエリ
**SpringBoot**でDatabase操作を行うときrepositoryに自動生成されるメソッドを使うのがよい
|メソッド|引数|戻り値|説明|
|:---:|:---:|:---:|:---:|
|findAll()||`List<T>`|すべてのレコードを取得|
|findById()|キー|`Optional<T>`|キーに該当するレコードを取得|
|getById()|キー|`T`|キーに該当するレコードを取得|
|count()||`long`|レコード数を取得|
|existsById()|キー|`boolean`|キーに該当するレコードが存在するかを取得|
|save()|`T`|`T`|キーが存在する場合は更新、存在しない場合は登録|
|saveAll()|`List<T>`|`List<T>`|`Entity`の数だけ`save()`を実行|
|deleteById()|キー||キーに該当するレコードを削除|
|deleteAllById()|`List<キー>`||キーの数だけ`deleteById()`を実行|
Nextcloud Hub 6でAIを動かす！

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

第65回ニフクラエンジニアミートアップで講演しました。
クラウドストレージ「Nextcloud」入門　Nextcloud Hub 6でAIを動かす！ - AI動かす編 -
https://www.youtube.com/watch?v=MkfbrcKlANU
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/fdbf0532-807f-ba64-4680-e7a3326f8b54.png)

Nextcloud Hub 6が9月16日にリリースされました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/03a39ba1-c4d2-1e43-dd14-651b9230c326.png)

Nextcloud Hub 6ではAIを使った「Nextcloud Assistant」が実装されましたテキスト、メール、Talkで利用できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/8838d1c8-5dd4-43c5-04ab-1711c6f9c95d.png)

# 1. Nextcloudで使えるGenerativeAIは2つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/da749351-668a-1525-937d-8671f4599704.png)

# 2. セットアップ
## 2-1. アプリを有効化
「アプリ」>「連携」>「OpenAI and LocalAI Integration」を有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/93661d32-2662-f7be-867c-43a9f85fa6fd.png)

## 2-2. NextcloudでAIプラグインを設定(OpenAI編)

1. 「管理者画面」>「接続済みアカウント」>「OpenAI and LocalAI Integration」
1. APIキーを入力
1. モデルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/1f391cc8-bc06-f1f9-c533-fe2a1b9fc018.png)

## 2-3. NextcloudでAIプラグインを設定(LocalAI編)
### 2-3-1. LocalAIを動かす

1. Git Cloneする
```
git clone https://github.com/go-skynet/LocalAI
cd LocalAI
```
1. モデルをダウンロードする
```
wget https://huggingface.co/TheBloke/Luna-AI-Llama2-Uncensored-GGUF/resolve/main/luna-ai-llama2-uncensored.Q4_0.gguf -O models/luna-ai-llama2
```

1. ダウンロードしたモデルにマッチするテンプレを作成
```
cp -rf prompt-templates/getting_started.tmpl models/luna-ai-llama2.tmpl
```
1. Dockerコンテナを起動
```
docker compose up -d --pull always
```
1. モデルを追加ダウンロード
```
curl $LOCALAI/models/apply -H "Content-Type: application/json" -d '{
    "id": "huggingface@TheBloke/WizardLM-13B-V1-0-Uncensored-SuperHOT-8K-GGML/wizardlm-13b-v1.0-superhot-8k.ggmlv3.q4_K_M.bin"
}'
```

## 2-3-2. NextcloudでAIプラグインを設定(LocalAI編)
「管理者画面」>「接続済みアカウント」>「OpenAI and LocalAI Integration」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/73817bce-9b7b-bb3c-06b7-b27aabf0346c.png)

# 3. まとめ

Nextcloudで生成AIを使う事ができると夢が広がります。
骨格のランドマーク推定でダンスを比較する【スコア調整】

## 概要

前回，音楽を元に同期された動画を入力し，ダンスの比較するプログラムを作った．

https://qiita.com/Killinneko/items/58b4377ba03da7a9c037

比較にはコサイン類似度を用いている．
遊び要素として，各フレームでのコサイン類似度の平均をスコアとしたが，
お手本の動画と関係がない動きをしても，だいたい40点くらいは取れてしまう.
そこで，スコアの計算にシグモイド関数や最低・最高点の設定を用いてスコアの調整を行う．

## スコアの調整：シグモイド関数


### シグモイド関数とは

以下の`f(x)`で表される関数で，どのようなxを入力しても0~1の範囲に変換する関数．
ニューラルネットワークの活性化関数で0か1に近づけたいときに利用される．
今回のスコアの計算も同じように，2値化に近い計算をしたいので利用する．

シグモイド関数のパラメータとして，`α`があるが，数値が大きいほど0から1の変化が急になる．

```math
f(x) = \frac{1}{1+e^{-ax}} 
````
### 実装

閾値でスコアの調整を行う．

全域をシグモイド関数行わず，上限・下限を設定してその間をシグモイド関数で補完する．
実装は以下のようにした．

upper以上の場合は，1をとり
under以下の場合は，0を取るようにしている．
その間をシグモイド関数で補完するようにしている．

```python:スコア調整
def score_adjust(score):
    under = 0.5
    upper = 0.8
    alpha = 60
    
    if score <= under:
        return 0
    elif score >= upper:
        return 1
    else:
        return 1 / (1 + math.exp(-alpha * (score - (under+upper)/2)))
```
上記の`score_adjust`関数は以下のようなグラフになる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/4e94376d-33c9-dcee-c94e-7b2d98942951.png)

お手本とまったく関係がない動きのダンスを比較した場合で試してみる．
そのため，理想は0点に近い点数が出ればよいと思っている．

スコア調整の有無をグラフで比較すると以下のようになった．
調整を入れると，動画全体のスコア平均が0.44 から 0.11となった．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/e8c8dec6-24e3-237e-7104-22d3422cb68d.png)

逆に，お手本と同一演者が同じダンスした際を比較してみる．
この場合は100点に近い点数が良い．

無編集でもほぼ同一の動きができていることにも驚いたが
調整を入れると，動画全体のスコア平均が0.958から0.997になった．

大きくしゃがんだり後ろを向くような動作に関してはわずかでもタイミングがずれると極端にスコアが悪くなるので，
スコアの閾値に関しては，他のダンス動画を入力して調整する必要があると思う．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/f01b4b58-7604-1ee4-2ac6-95c7613b2c49.png)

## まとめ

前回作成したダンスの比較プログラムのスコアをシグモイド関数を使って調整した．
全く関係のない動きを動画が0点に近いスコアになり，同一演者のお手本に近い動きをすると満点になる調整ができた．

現状の課題として，動画の入力前に同期する必要がある．
動画を入力した際に音楽を元に自動で同期してダンスを比較することができれば，
実用的なものができるのではないかと思う．
Pythonで家計予算自動配分プログラムを作ってみる（Tkinterを使ったGUI実装※未完成）

# はじめに

　↓の記事で、家計予算自動配分プログラムを作成しました。

　今回の記事では、Tkinterを利用してGUIを実装し、より使いやすくコードを書きます。

:::note warn
　現時点で未完成です。方法がわかり次第、追記いたします。
:::


https://qiita.com/awonohata/items/41a8a50acc2a82624225

# Pythonで家計予算自動配分プログラムを作ってみる（Tkinterを使ったGUI実装）

## Tkinterのドキュメント

https://docs.python.org/ja/3/library/tkinter.html

## コード

　gridとplaceで位置を整える方法がわかりました！

:::note alert
こちらは未完成のコードです。
テキストボックスとボタンを配置するところまでは辿り着いたのですが、その後のボタンを押して計算を実行するところがまだ実装できていません。

途中まで考えたところはコメントアウトしています。
:::


~~~Python

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry("600x400")
root.title("budget Tkinter")

label1 = tk.Label(root, text= "お仕事お疲れ様でした！　予算配分をしましょう！")
label1.grid(row = 0, column =0)

label2 = tk.Label(root, text = "先月の給与を教えてください。")
label2.grid(row = 2, column =0)

entry1 = tk.Entry()
entry1.configure(state = 'normal', width = 20)
entry1.grid(row = 2, column =1)

label3 = tk.Label(root, text = "家賃（月額）を教えてください。")
label3.grid(row = 3, column =0)

entry2 = tk.Entry()
entry2.configure(state = 'normal', width = 20)
entry2.grid(row = 3, column =1)

button1 = tk.Button(root, text = "計算する") # commandでget関数を呼び出せばいけそう？
button1.place(x = 280, y = 80)

# salary = entry1.get()
# rent = entry2.get()

# food = int(salary * 0.2) # 食費
# communication = int(salary * 0.12) # 交際費
# transportation = int(salary *0.1) # 交通費
# hobbys = int(salary *0.1) # 娯楽費
# savings = int(salary - (rent + food +communication + transportation + hobbys)) # 貯金（給与から各費目を差し引き）


# label4(f"f"今月の予算配分は\n家賃　：{rent:,}円\n食費　：{food:,}円\n交際費：{communication:,}円\n交通費：{transportation:,}円\n娯楽費：{hobbys:,}円\n貯金　：{savings:,}円\nです！")

root.mainloop()
~~~

### 出力イメージ

![スクリーンショット 2023-12-24 18.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/94ab1570-a41a-2b45-e087-999a71412f1a.png)


# まとめ

 GUIを実装することにより、よく見る形のアプリが作成できるのですが、ボタン押下で計算、の実装まではまだ辿り着けていません…。出来次第更新していこうと思います。
 
 次回の記事では、『Python2年生』で紹介されていた、PySimpleGUIを使って、よりデザイン性のあるGUIを実装したいと思います。（tkinter同様、テキストボックスとボタン配置で終わってしまいそうな気もしますが…）

https://www.seshop.com/product/detail/25110

## 参考リンク

https://qiita.com/nnahito/items/ad1428a30738b3d93762

https://www.school.ctc-g.co.jp/columns/hishinuma/hishinuma19.html

https://tomtom-stock.com/2022/02/13/tkinter-button-adjust/
【Android】GoogleMapで自分の向いている向きを示す方法【kotlin】

# はじめに
今回はタイトルにもある通り、GoogleMapを使った時に自分の向いている向きを示す方法を記事にします。
GoogleMapの機能を使用して簡単に実装できそうなものですが、調べて見てもなかなか出てこなかったので記事に残して今後すぐに思い出せるようにしておこうと思います。

# 実践

以前記事にした　
と、下の参考記事にあるGoogleMapのマーカーをアレンジする方法を併せて実装していきます。

    private var myDirectionMarker :Marker? = null

    override fun onSensorChanged(event: SensorEvent) {
        val azimuth = event.values[0]　　// 方位
        if (event.sensor.type == Sensor.TYPE_ORIENTATION) {
            if (myDirectionMarker == null) {
            // 初めての場合はaddMarkerでマーカーを表示する
                myDirectionMarker = googleMap.addMarker(
                    MarkerOptions()
                        .position()// 自分の位置など表示させたい場所を引数に指定する。
                        .icon(
                            BitmapDescriptorFactory.fromResource()　// 矢印などの画像を引数に指定する。
                        )
                        .rotation(azimuth) // マーカーの角度を指定する ここではセンサーで取得した方位を指定。
                )
            } else {
            // 初めてじゃないならマーカーの角度と位置の更新
                myDirectionMarker?.rotation = azimuth
                myDirectionMarker?.position = location　//自分の位置のlocation
            }
        }
    }

# 参考

https://qiita.com/mmmmk/items/4d28595535abade508d2
複合機が勝手にパソコンに登録される

複合機でWSDプロトコルを有効にすると、勝手にパソコンに登録され、既定のプリンタに設定されてしまう
ユーザー気づかず、ガンガン印刷して紙でない、と思ったら他部署の複合機に印刷されるという迷惑機能

https://faq.ricoh.jp/app/answers/detail/a_id/188

https://rara-haha.com/2021/11/18/pc-86/

https://blog.treedown.net/entry/2019/10/16/010000
好きなもの食べたい

## イヴなんですね
「コラボフロー Advent Calendar 2023」24日目の記事です。

メリークリスマス！
イヴですね。:snowman:

恋人と過ごしてる方や、家族と過ごしてる方達、人さまざまですよね。
あっ、おっさんは今ひとり寂しくPCパチパチ？カタカタ！？やってます　:frowning2:

今日はせっかくのイヴなので、なんか自由に食べたいものを選べたらなーっていう私の勝手なエゴからの投稿となります。。:helmet_with_cross:（イヴ関係ないんすけど）

イヴの日くらい好きなもの食べたいですよね。
別にやけ食いではないですよ　:cake:

そんなこんなで、今回は自分のためだけにコラボフローを利用させていただきました。

## 申請書かわいいでしょ
「自分のためだけ」にコラボフローの申請書を作成してみました。　（笑）

![2023-12-21_104247.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/b82b4545-b081-05f2-7471-6d5014a1f0e5.jpeg)

かわいいでしょ。

## 食べたいものが選べるようにしました
メニューを選択すると・・・

![2023-12-21_104837.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/d0f2d370-d518-52a8-21d0-61b3b666a384.jpeg)

ラーメンはやっぱりとんこつにかぎります:ramen:
このチャーシューがまた・・・

![2023-12-21_104820.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/cae3f526-fb0e-6eae-97cd-df85e819569e.jpeg)

九州定番のかしわおにぎり　うまそー:rice_ball:

![2023-12-21_104755.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/9e07e8ac-af8c-b498-8c3c-b1b09f97ae14.jpeg)

ボリュームたっぷりのゴボウ天うどん　やばいな:stew:

![2023-12-21_104736.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/018c8df5-07b8-d495-c691-4c5d63a9714e.jpeg)

中丼（食べかけ）:boy_tone1:

![2023-12-21_104712.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/14abbcd3-4b0b-51c6-72c0-db2c4ab34373.jpeg)

大分名物のとり天　これまたうまそー:bento:

どれもこれもうまそーなものばかりです！:relaxed::relaxed::relaxed:

## 動画はこちら

![コラボフロー-個人-Microsoft_-Edge-2023-12-21-10-49-13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/f7e7cef6-ded5-3bbe-636b-225707735ae9.gif)



## さいごに
いかがでしたでしょうか。
カタい～～イメージがあるコラボフローですが、
たまには自分のためにヨダレをたらすような利用方法があってもいーんではないでしょうか！？（知らんけど）:runner:
みなさんのお口に、清きヨダレがたまりますようにー　:sake:

明日は @miko3 さんの記事です！
お楽しみに！！

それでは良いクリスマスを、良いお年を！！！
:santa_tone2:
MySQL Connectorを使いDBに接続するのに苦戦した話.

## 概要
- Pythonのライブラリにある mysql.connectorを使って, Kubernetes上で動作しているpodに接続しようとした.
- 接続テストした際, `Authentication plugin 'caching_sha2_password' is not supported`との表示があった.
- 改善策として, 接続設定(データベースのホスト名, port番号等)の指定に`auth_plugin`の記述と, MySQLのPodのパスワードの形式を`mysql_native_password`の指定を行った.


## バージョン, 構成
MySQL: v8.0.35
k3s環境にMySQLのPodを立て, そのPodに接続

## 原因
MySQL8.0以上のインストールまたはアップグレード後に作成された新しいアカウントのパスワードの認証方式は, `mysql_native_password`の認証プラグインではなく, `caching_sha2_password`に置き換えられていた.
実際にデータベースサーバーにアクセスしようとしていたユーザーは`caching ~ `の形式になっていたため, mysql.connectorで接続した際, 認証できずプログラムが実行できなかった.

- 参考サイト
    - [2.11.4 MySQL 8.0 での変更 | Oracle Help Center](https://docs.oracle.com/cd/E17952_01/mysql-8.0-ja/upgrading-from-previous-series.html)

## 解決策

### MySQLに登録しているDB用ユーザーパスワードの認証形式を`mysql_native_password`に変更する.


---

現在の状況を確認する. 
```
mysql -u root -p
```

パスワードの認証方式の確認コマンド.
```
MySQL [(none)]> select user,plugin from mysql.user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| cdsl             | caching_sha2_password |
| root             | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
+------------------+-----------------------+
```

今回はcdslというユーザーを使って, mysqlconnectorに接続する. そのため, 該当ユーザーのパスワードの認証方式を変える必要がある.
ユーザーとパスワードに関しては適宜設定された値に置き換えてください.

```
alter user 'cdsl(your user)'@'%' identified with mysql_native_password by '(your password)';
```
コマンド入力後, `Query OK`が表示されていたら, 認証方式が変更されている.

実際に, 認証方式が変更されたかどうかの確認を行う.

```
MySQL [(none)]> select user,plugin from mysql.user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| cdsl             | mysql_native_password |
| root             | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
+------------------+-----------------------+
```
変更されていることが確認できる.

---
最後に, Pythonに記述したデータベースの接続情報のコードに, パスワード認証方式(auth_plugin)を`mysql_native_password`を利用する旨を記載する.

```
db_config = {
    'host': '(データベースのアドレス)',
    'port': (データベース上で設定したポートの指定),
    'user': '(Your Name)',
    'password': '(Your Password)',
    'database': '(Your Database)',
    'auth_plugin': 'mysql_native_password',
}
```

これにて完了!!! お疲れ様でした!

## 最後に
ここまでお読みいただいて, ありがとうございました!

この情報が参考になれば幸いです.
それでは!
【Vonage】コミュニケーションAPIから読み解く、無料化について

Vontageでは、無料での体験をすることが出来ます。

今回はVontageを無料で体験すると、どういうメリットがあるのかをいくつか書いていきます。

### リスクの低下

ユーザーがお金を払うことがないので、失う物をなく、体験をすることが出来ます。

### 見極めが出来る

実際に体験をすることが出来るので、続けるかどうかを使ったうえで判断をすることが出来ると思います。

## 最後に

これらのメリットを思いつきました。
まずは、使ってみるといった結論になりました。
社会人半年で学んだこと①プレゼン資料作成編

はじめまして、NHと申します。社会人になって学んだことを備忘的にまとめていきたいと思い、本記事を書き始めました。
今回は初回ということで資料作成について教えていただいたことを共有します。

①資料作成の流れ

まず最初にパワーポイントを開いて、というのはおすすめしません。まずは資料に載せる内容を決定することから始めましょう。
そのために行うべきことは、
1.プレゼンをする対象をあらためて確認する。
そんなことは当たり前だと思うかもしれませんが、ここは重要です。新人同士で行うプレゼンと部長や課長にプレゼンを行う場合では自ずと内容も変わってくるはずです。

2.プレゼン全体の目的を決める。
こちらはさきほどの対象の決定の続きになります。具体的に「このプレゼンによって誰をどんな状態にする」ということを決定していない状態だと資料に盛り込むべき内容の判断が永遠とつかないことになってしまいます。

3.設定したプレゼン全体の目的から共有した方がいいと思う内容を片っ端からあげていく。
この時点では、どんな構成にするかとかは考える必要はありません。設定した目的を達成するために「必要そう」とか「こんな情報あったら面白そう」くらいのテンションのものでも紙に書き出しましょう。

紙に書き出してアイデアを頭だけで完結させないことが割と重要だと思っています。このときもスライドの形にする必要はなく、一文程度の概要だけに留めないようにしましょう。

4.上限を決めて、書き出した情報の取捨選択を行う。
次にスライド枚数（＝メッセージの数）を決定しましょう。こちらは発表時間の分数×0.5~0.7くらいにするのがおすすめです。
資料に入れたい情報を一通りあげたら、2.で設定した目的を達成するためにはを考えてメッセージの取捨選択と順番の決定をします。目次と各スライドで言いたいことを一文か二文のみ用意するところまで行います。

5.客観的な視点を得にいく、使える既存資料がないか確認しにいく。
ここまでで一度レビュー依頼をしましょう。スライドを作り込んでからレビューしてもらうと大幅な手戻りが発生してしまう危険性も増えます。ここまでの段階でプレゼン資料の骨子はできているはずなので、自信をもってレビューしてもらいましょう。
また、この骨子をみてもらった上で、自分のメッセージを伝えるうえで使いまわせる既存資料がないか確認しておきましょう。例えば毎年行っているような新人の業務紹介などの資料は先人たちが作ってくれていることが多かったです。

6.レビューを踏まえて骨子を確定して資料を作り込む
ここまでできれば、資料作成自体はほとんど完成です。骨子の作成を面倒くさがらずに丁寧に行うことが、結局時短になります。
見栄えの良い資料の作りこみ方などは他の方がわかりやすくまとめていますので、本稿では省略します。
eMMC付CM4＋CM4-to-Pi4-Adapter（OS書き込み）

# 1. はじめに
ひょんなことから、eMMC付きのCM4とWi-Fiアンテナを入手したので、使い込んでいこうかと思い、色々調査して試した結果を示す。今回はOSの書き込みについて

# 2. 機材
* CM4102032（RAM 2GB、eMMC 32GB）
* CM4-to-Pi4-Adapter
* Raspberry Pi Compute Module 4 アンテナ（RPI-SC0480）
* USB Type-C-Type-C ケーブル
* ヒートシンク（ちょっと起動する程度ならなくてよい）

# 3. CM4とCM4-to-Pi4-Adapterについて
# 3.1 CM4
Raspberry Pi 4に積まれているCPUやメモリなどだけが独立しているモジュール。したがってこれだけではLAN、USB、Wi-Fiなど一切使えないまさしくコア。eMMC搭載モデルがあるので、Raspberry Pi 4BのSDカード起動に不安があるという状況を打破できる製品。

# 3.2  CM4-to-Pi4-Adapter
Raspberry Pi 4Bとコネクタの配置に互換があるのでケースなどを使いまわせる。4つのUSBコネクタがUSB 3.0になってる。（4Bは2つが3.0、2つが2.0）
40Pinもそのままついている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/286a5ab6-9467-5808-fa57-341f79322d4f.png)


# 3.3 入手先など
CM4はこの記事を書いている時点でdigikeyなどで入手可能。
CM4-to-Pi4-AdapterはWareshareが出している（作っている？）ボードで、直接入手してもよかったが、今回は千石電商オンラインショップで入手した。
ボードのWiki: https://www.waveshare.com/wiki/CM4-to-Pi4-Adapter
また、WareshareではCM4を載せられる製品を色々出している。

# 4. 準備
CM4をAdapterにしっかり差し込む。このAdapterの良い点はCM4の挿し込み向きを間違えるとAdapterからCM4がはみ出してしまうこと。
CM4を挿し込むときは垂直にしっかりと挿さないと接触不良がおきてしまう。割と気が付かないで電源を入れてしまうので本当に注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/434050d7-49ff-4bc6-d248-7aaf73e2aabe.png)

# 5. eMMCへの書き込み
# 5.1 書き込みツールの準備
Wikiに書いてある通りなのだけど、ちょっと間違えてしまったので備忘録を兼ねて書いておく。
https://www.waveshare.com/wiki/Write_Image_for_Compute_Module_Boards_eMMC_version

eMMCをWindows PCでマスストレージとして認識させないとeMMCにOSイメージを書き込むことができない。認識させるにはwaveshareが用意してくれているバイナリを使う。
https://files.waveshare.com/upload/f/f3/Rpiboot_setup.zip

ソースは以下の模様。
https://github.com/raspberrypi/usbboot

# 5.2 書き込み
1. CM4-to-Pi4-AdapterのBOOTスイッチをONにする
1. USBケーブルでPCと接続する。（安定と安心のためPC側もType-Cを推奨する）
1. シリアルバスデバイスとして認識される。
もし出ていない場合、CM4の接触不良の可能性あり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/26cf6f40-eb2d-5076-7c95-d4811e4e1994.png)
1. rpibootを管理者モードで起動する。（コマンドプロンプトが出て勝手に色々やってくれる）
1. マスストレージとして認識されて画像のようにRPi-MSD-0001が出てくる。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/222747ac-558d-3ac9-45a0-100751b1a7a6.png)
1. 従来通り、Raspberry Pi ImagerでOSを書き込む
1. 終わったらいったん電源（USB Type-Cケーブル）を抜き、BOOTスイッチをOFFにする。
これを忘れるとOSが起動しなくて困惑する。

# 6. まとめ
eMMC付CM4＋CM4-to-Pi4-AdapterにOS書き込みを行った。Raspberry Pi 4Bと性能や使い勝手について比較を試していきたい。

以上
C - Repunit Trio を 部分的に Nx で解いた〜トヨタ自動車プログラミングコンテスト2023#8（AtCoder Beginner Contest 333）

トヨタ自動車プログラミングコンテスト2023#8（AtCoder Beginner Contest 333）の C - Repunit Trio を部分的にNxを用いて解いたので報告します．

## 問題

https://atcoder.jp/contests/abc333/tasks/abc333_c

## 部分的にNxを用いた解答例

https://atcoder.jp/contests/abc333/submissions/48822235

```elixir
defmodule Main do
  import Nx.Defn

  @s64_max Bitwise.bsl(1, 63) - 1

  def main() do
    n =
      IO.read(:line)
      |> String.trim()
      |> String.to_integer()

    a =
      0..333
      |> Stream.map(fn n -> repunit(n) end)
      |> Enum.take_while(& &1 <= @s64_max)

    t =
      a
      |> Enum.map(fn x ->
        a
        |> Enum.map(fn y ->
          a
          |> Enum.map(fn z ->
            x + y + z
          end)
        end)
      end)
      |> Nx.tensor(type: {:s, 64})

    1..n
    |> Enum.reduce(0, fn _, acc ->
      reduce_min_greater_than_n(t, acc, @s64_max)
    end)
    |> Nx.to_number()
    |> IO.puts()
  end

  def repunit(0), do: 1
  def repunit(n) when n > 0, do: 1 + 10 * repunit(n - 1)

  defn reduce_min_greater_than_n(t1, t2, t3) do
    t3 = Nx.multiply(Nx.less_equal(t1, t2), t3)
    t1 = Nx.multiply(Nx.greater(t1, t2), t1)
    Nx.add(t1, t3) |> Nx.reduce_min()
  end
end
```

考えられる全てのRepunit trioを求め，`Enum.reduce`と`reduce_min_greater_than_n`で小さいものから順に取り出すというアルゴリズムです．

`reduce_min_greater_than_n`は，次のようなロジックです．

1. 第1引数`t1`のテンソルで，第2引数`t2`の値より小さいものを，第3引数`t3`で置き換えて，それ以外はそのままにする
2. 1に`Nx.reduce_min`を適用して，テンソル中の最小の値を取り出す

1を実現する方法は，Nxでは割とお決まりのパターンです．
VSCodeでエクスプローラーにフォーカスしているときにショートカットでファイルとフォルダを作成できるようにする

## はじめに
サイドバーのエクスプローラーで、ctrl/cmd+nでファイル作成したりshift+ctrl/cmd+nでフォルダ作成したくありませんか？？

できます！

## やり方
ショートカットはMac前提で書きます。
WindowsやLinuxの方は、基本cmdをctrlにするだけでいいはず。

1. コマンドパレットを開く(cmd+p)
1. `key` と入力して出てくる `Preferences: Keyboard Shortcuts` を選ぶ
 ![Screenshot 2023-12-24 at 18.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130946/f157b699-061b-92b5-88db-b0c61bf4423f.png)

1. 検索ボックスに `file new` と打つ
1. `File: New File...` ( `explorer.newFile` ) の左の鉛筆マークを押す  
![Screenshot 2023-12-24 at 18.06.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130946/4f8fe4d5-68a8-4f45-8ec7-39088d203ce7.png)

1. 設定したいショートカットのキーをすべて同時に押す（長押しでも平気です）
1. Enterを押す（ここまででショートカット自体は設定されます）
1. 同じく `File: New File...` ( `explorer.newFile` ) を選択して、右クリック
1. `Change When Expression` を押す
![Screenshot 2023-12-24 at 18.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130946/f20c51de-5153-9e19-e7e7-37552676cf4c.png)

1. `filesExplorerFocus` を入力する
1. Enterを押す
1. おわり！

フォルダ作成のショートカットは、ショートカット設定画面の `File: New Folder...` で、上記と同じことをやるだけです！

`When` を `filesExplorerFocus` とすることで、エクスプローラーにフォーカスされているときにしかこのショートカットは動きません。
よって、既存のショートカットとバッティングしません。
エクスプローラーにフォーカスしているときは、この記事で設定したショートカットが優先して動きます。


## おわり
おわり
モバイルアプリの自動化テスト

 ## モバイルアプリの自動化

 私は、モバイルアプリの自動化が出来れば良いと思いました。

 モバイルアプリは、様々なデバイスによって使用が変わってくるため、１つ１つ手動で操作をすることは多々あります。

 そこで、自動で様々なデバイスでアプリを共有できる物があれば、とても便利だと思いました。
次世代WebカンファレンスのPrivacyセッションに登壇した話

## はじめに

[次世代 Web カンファレンス 2023](https://nextwebconf.connpass.com/event/300174/)のPrivacyセッションに登壇させていただく機会がありましたので、登壇するにあたって考えていた内容や登壇しての感想をまとめていきます。

[次世代 Web カンファレンス 2023](https://nextwebconf.connpass.com/event/300174/)は「テーマ毎に 今 Web がどうなっていて、これからどうなっていくのか  をひたすら議論するセッションのみのカンファレンス」です。

「今起こっていること」や「これからのこと」を登壇者が90分間議論し続けるカンファレンスとなっています。  
カンファレンスは特定の技術などをメインに開催されることが多いと思いますが、このカンファレンスはWebという広い分野をテーマにしているので、そこで話される内容も多種多様です。

1日で色々な技術要素に触れることのできる非常に面白いカンファレンスです。

## 登壇前日までについて

めったに見ないLinkedinでメッセージが来ており、いつものスパム系メッセージかと思ったら[@k-o-ta](https://twitter.com/k_ota_1990)さんからでした。  
面識も繋がりもなかったのですが、内容を見てみると会社で書いていた[PrivacySandbox関係のブログ](https://techblog.gmo-ap.jp/2022/12/25/2022privacysandbox/)をみて、スピーカー参加しないかとのとのお誘いでした。

プライバシーという議題で自分が登壇者としていいのかと悩んだのですが、前回2019年のadセッションでの自由な雰囲気をみて、難しく考えずに楽しく参加できるんじゃないかと思いお受けさせていただきました。

90分台本無し、打ち合わせもなしのディスカッションで、最初の議題はITPというのだけが決まってました。

ネタ切れになるのはつらいと思ったので、社内の何人かに、「広告観点でのプライバシーだとどんなことが聞きたいか」や「PrivacySandboxについてどう思うか」などを聞いたりしてネタ集めだけはして臨みました。

いつもとは違う視点で話すことができたので、これはこれで楽しかったです。

## 当日について

聞きたいセッションもあったのですが、担当のセッションに集中するために、15時すぎに会場入りしました。  
登壇者向けのストラップ受け取りやWifiの接続などでギリギリまでバタバタしてしまい、もう少し早く来ていればと後悔しました。

セッションでは、せっかくのディスカッション形式なのでファシリテータの方と１対１での会話にならないようにしたいなと考えていました。

始まると[@kyotonio](https://twitter.com/k_ota_1990)さんと[@tana3939](https://twitter.com/tana3939)さんがいい感じで喋ってくれてていたので、話している内容に対して自分の考えなども伝えていくようにしてました。  
ただ、全体の流れとかはあまり意識せずに喋っていたので、ファシリテータをしていた太田さんは大変だったんだろうなと思います。

議論はいい感じに盛り上がりもしましたし、話したいことも話せたので、自分としては割りと満足でした。

ただ、PrivacySandboxの実装やプライバシー技術についてなど技術的な深掘りができなかったことに終わってから気が付きました。  

あとは、自分の意見をいうだけでなくて、そこから話を振ったりとかがもっとできたら良い議論ができたんじゃないかなと反省してます。  

最後に、当日は時間がなくて2025年のWebがどうなっているのかについて言えなかったのでこちらで書いておこうと思います。

自分としては2年くらいではそこまで変わらないんじゃないかと少し楽観的に考えてます。  
ですが、メディアも徐々に収益が下がって行く状況で、収益を確保するために、ユーザ体験は徐々に悪くなっていくとは思っています。
インタースティシャルなどの広告が増えたり、ログインしないと見れないページが増えたりはしていくんじゃないかなと思います。  

また、一般的な広告は単価が下がっていくので、広告が必要ないアフェリエイトサイトが増えていくような気はしています。
きちんと専門家による製品レビューをしている質の高い？アフェリエイトサイトが増えるのであればユーザにとっても歓迎すべきだとおもいますが、、、

2年では変わらないと予想してますが、IP保護やPrivacyBudgetが実装されていくと本当に厳しくなっていくと思います。

こちらはまだ実装時期は明示されていませんが、IP保護については開発中ステータスに進んだので24年以降に動きがあるのではないかと思ってます。

## 最後に

このようなカンファレンスに呼んでいただきありがとうございました。  
非常に勉強になりましたし、楽しく議論することができました。  
始まる前は90分は長いのかなと思っていましたが、始まってからはあっという間でした。

主催をしていただいた[Jxck](https://jxck.io/)さん、一緒に登壇していただいた[@k-o-ta](https://twitter.com/k_ota_1990)さん、[@kyotonio](https://twitter.com/k_ota_1990)さん、[@tana3939](https://twitter.com/tana3939)さん、本当にありがとうございました。


最後にこのエントリーで[GMOアドマーケティング Advent Calendar 2023](https://qiita.com/thomi40/items/8a48f6ab458c2f2c8de5) は最後となります。  
お楽しみいただきありがとうございました！

ちなみに、会社のアドベントカレンダーではありますが、内容については、「所属する組織とは関係なく、個人の発言である」とご理解ください。
地球儀マーク(ネットワーク接続状態インジケーター/NCSI)関連

https://jpwinsup.github.io/blog/2021/09/30/Networking/NCSI/network-connectivity-status-indicator-overview-and-troubleshooting-guide/

https://learn.microsoft.com/ja-jp/windows-server/networking/ncsi/ncsi-frequently-asked-questions#what-is-the-default-system-minimum-hop-count

https://learn.microsoft.com/ja-jp/windows-server/networking/ncsi/ncsi-overview

https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/troubleshoot-ncsi-guidance#9-passive-probe-related-settings

NCSI自体を無効は色々差しさわりがあるようなので、そこまでは実施せず、以下で対応

- (2)グローバル DNS を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70042/c8ccfe80-4b06-79c8-0f34-c32cc60597f5.png)

- (3)パッシブ プローブの判定基準の変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70042/0d0d54c0-dcb7-3b99-53f6-0605671e32c8.png)

- (4)プロキシの認証対象から除外
※(2),(4)はプロキシ環境のみ
テスト自動化ツールT-DASHを使ってみて、良かった点

今回は、テスト自動化ツールT-DASHを使ってみて、良かった点を書いていこうかと思います。

## 使ってみた感想

### 良かった点
#### その１
良かった点は、初めて触る際のチュートリアルがとてもわかりやすかった点。
どこにどういう機能があるのかがわかりやすく書かれていました。

#### その2
自由度が高く、機能も沢山あったので、いろんなことが出来るという点。
これにより、いろんな構想を想像することが出来た。
custom-resource-existing-s3 という Lambda 関数と対応例

## はじめに
- 謎の Lambda 関数　*-custom-resource-existing-s3　というのが作られていた
- 調査した内容を備忘の為記載します
- 「S3 イベント通知による Lambda 実行」の設定手順も含みます
    - PowerShell による AWS CLI 操作を想定

## 調査
- 先述のとおり、作った覚えのない Lambda が存在していました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436115/7c8fb5a4-c7ff-9bac-808f-35c28a2cda7e.png)

- 画面上の「こちらをクリックしてください」のリンクを辿ると、Serverless Framework で作成したアプリケーションに含まれていました

## 原因
- Serverless Framework にて、既存 S3 の Event を設定した際に自動で作成される関数
- https://forum.serverless.com/t/function-s3-trigger-with-existing-true-generates-another-lambda-called-custom-resources/9440

## 原因に至る背景
- Serverles Framework を使用して環境デプロイしていました
- S3 イベントトリガーで Lambda を起動する必要あり
    - Serverles Framework 内で S3 作成することもできるが、環境の更改などでコマンド「sls remove」実行した際等、S3 上のデータも消えてしまうことを懸念
    - S3 バケットは Serverless Framework 外で管理とした
    - この S3 イベント通知を設定する為、「existing: true」オプションを指定
→ 今回の事象に至った

https://www.serverless.com/framework/docs/providers/aws/events/s3/#using-existing-buckets
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436115/83deca5b-3ca5-5034-107b-46b79bd4a2d2.png)

## 対応

### 検討案
- 自動で Lambda が作成されることを許容する　<font color="red">**←お奨め**</font>
- 許容できない場合
    - S3 を Serverles Framework 管理対象とする　<font color="red">**←嫌**</font>
    - 管理対象としない場合
        - 環境デプロイ後に手動で S3 イベントトリガーを追加する
### 結果
- なんやかんやで「環境デプロイ後に手動で S3 イベントトリガーを追加する」ことに
- Serverless Framework の対象 yaml 上からは、関連する events 設定をすべて削除
- イベント通知したい各 S3、Lambda にて、以下の作業手順で設定
    - Windows PowerShell からの AWS CLI 操作例です

### 作業手順

1．S3イベント通知の詳細を記載した JSON ファイルを作成
- 以下の例では、S3上に拡張子「.txt」のファイルが作成された任意のケースを想定
- ファイル名　**s3.json**　としてローカルに保存

```
{
    "LambdaFunctionConfigurations": [
        {
            "Id": "任意のイベント名",
            "LambdaFunctionArn": "実行したいLambda関数ARN",
            "Events": [
                "s3:ObjectCreated:*"
            ],
            "Filter": {
                "Key": {
                    "FilterRules": [
                        {
                            "Name": "suffix",
                            "Value": ".txt"
                        }
                    ]
                }
            }
        }
    ]
}
```

---

2．Lambda側：S3トリガーを許可

```
aws lambda add-permission `
    --profile "AWS CLI で操作可能なプロファイルを指定" `
    --function-name "実行したいLambda関数名" `
    --statement-id "s3-put-event" `
    --action "lambda:InvokeFunction" `
    --principal "s3.amazonaws.com" `
    --source-arn "S3バケットARN"
```

---

3．S3側：イベント通知設定

```
aws s3api put-bucket-notification-configuration `
    --profile "AWS CLI で操作可能なプロファイルを指定" `
    --bucket "S3バケット名" `
    --notification-configuration file://ローカル端末上のファイルs3.jsonへのパス
```

---
Laravel Eloquentでのget(),find(),where()の使い方について

Laravel学習中に、get(),find(),where()の使い方で詰まってしまった為、備忘録。
# 早見表
|句|簡単に|備考|
|:----:|:----:|:----:|
|get()|指定したキーの全ての要素を取得|all()と同じだが、他のメソッドと組み合わせ可能|
|where()|条件を指定してフィルタをかける|戻り値がBuilderなので、get()、find()と組み合わせて使う|
|find()|指定したキーの要素だけ取得||

# get()
get()を使うと、指定したテーブルの要素全てを取得することができる。
```
$users=User::get(); 
return view('user.index', compact('users'));
```
:::note info
＄usersにUserクラスの要素を取得して格納。
compact('users')で＄usersに格納した値もビューファイルに受け渡すことができる。
:::
where()などと組み合わせると、単に全件取得するだけでなく、
条件に合うデータ全てを取得することも可能。

get()で取得したデータをビューファイルで表示するには、以下のようなコードになる。
```
@foreach($users as $user)
{{$user->name}}
@endforeach
```
こうすることで、取得した値を1つずつ表示させることができる。

:::note warn
get()で取得したデータが1つであったとしても、@foreachを使用しないと、
「property [hoge] does not exist on this collection instance」
というエラーが出てくるので注意！
:::

# where()
データベースから条件指定して取得することができる。投稿した記事に対するコメントを表示したいときは下記のようなコードになる。
```
$users = User::where('name', 'John')->get();
return view('user.index', compact('users'));
```
:::note info
Userクラスの要素'name'が'John'と同じものを取得して＄usersに格納。
compact('users')で＄usersに格納した値もビューファイルに受け渡すことができる。
:::

where()は、戻り値がBuilder。そのため、コード例のようにget()などを組み合わせないと、ビューファイルで取得した要素が表示できない。

# find()
指定した1個の要素だけを取得したい場合に使用。
指定したidのデータを取得する場合は以下のコードになる。
```
public function user($id)
{
  $user = Conduit::find($id);
  :
```
:::note info
get()とは違い、@foreachでは表示しない。単にビューファイルで{{ $user->name }} と記述すると表示できる。
:::

# まとめ
各句の違いを分かっていないと、エラー発生の原因となる為、注意。
他にも使えるものはたくさんあるので、公式リファレンス参照。

https://readouble.com/laravel/9.x/ja/queries.html
VonageのHPのデザインを見て思った感想

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660761/125f13fc-02e7-f233-092b-0ea215c2a884.png)

### はじめに

Vonageのことなら何でも共有しようと書いてあるので、今回は、VonageのHPのデザインを見て思った感想を2点書いておこうと思います。

## シンプルでわかりやすいCard

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660761/5a7efca5-7fea-fec6-7ed6-393c9c1268db.png)

Appleなどが実践しているシンプルデザイン。
瞬時に理解することが出来るメリットがあり、ユーザビリティに優れた良いデザインだと思いました。

## わかりやすく成果を伝える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660761/91c77bb5-b653-c937-81ea-d75fe7094c4c.png)

数字で結果を示し、下に企業ロゴを出すことで、評価と信頼を示すいいデザインだと思いました。
自動化できたらうれしいテスト: バージョン管理の自動化

## バージョン管理の自動化

### はじめに

プログラムを作っていると、複数の言語を使うので、新しいバージョンが来ても、忘れたままになってしまうケースが多々あります。

今回は、バージョン管理の自動化が出来た際のメリットとデメリットについて書いていこうと思います。

### メリット　時代に遅れない

ITでは、バージョンの最新がすぐにあるため、忘れているといつの間にか古い扱いをされてしまいます。

そのため、自動化をすることにより、その問題に対処することが出来るという風に思いました。

### デメリット　機能が使えなくなる場合がある

物によっては、旧バージョンでしか機能しない部分もあるでしょう。
知らずにアップグレードしてしまうと、いきなりエラーになってしまう場合があると思います。
Perl xampp でperl/CGIを動かそう。

xamppについてきているんだから、動かせる知識は持っていて損はないでしょうね。
cgi が、何かは。。。
https://www.bing.com/search?q=cgi&form=ANSPH1&refig=4d2dcc4ba4f04ae6b34c905121694567&pc=W011&showconv=1
BingAI やわ。無料で聞けるで。読み上げモードと入れてね。説明してくれたやろ?

テキスト形式だから、textで書いておけば良いのだが、utf8言うのを覚えといて、それで、話をするから。
まず、html でtext型式で話すと知らせるんや。他にもzipとかイメージとかあるから、テキストと。
次に html の何や言うの。バージョン違うと困るやろ。昔の話は小学生の時とつけてもらわんと。
次になくても良いが、英語圏で無いから、お国は「日本」と英語で短く。
その次は無くても良いが、fileとして、初めの(head)産まれる時は頭から、一応、そういう決まりや。
head　の中での情報
meta charset="UTF-8"　日本人の教育受けますよって標準語として、安土桃山やないと。
title　上のタブでこのページはQiitaやと書いているように。真似されんように、もう少し前にiconを入れられるが、持っていないやろ?　*.ico　言うファイル。
書いていないのもあるが、この中で指示、定義をしてひとまずhead終わる。
BODY　足とか手とかいろいろ書くとこ。
ここに、言いたいことをタグと言う物を使って書いておく。
全体BODYの閉じをして
htmlの終わりを知らせて、私の手はかかりませんよって終わる。
例として
```perl
#!C:/xampp/Perl/bin/perl

print "Content-type:text/html\n\n";
print <<EOF ;
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<BODY BGCOLOR="#ffffff">
<h1>xampp perl test</h1>
</BODY>
</html>
EOF
exit;
```
見慣れんのが、先頭にあるな。って、仕事の依頼先で、一応「依頼(#!)」と書いてあって、最初に一回しか受けんぞ、宛先はC:/xampp/Perl/bin/perlやと。
これだと、htmlと変わらんやろ、もっとできるやつや、って、その2。

```perl
#!C:/xampp/Perl/bin/perl

$point_err = 'bol1_1';
$point_return = 'bol2_0';
$settig_msgA = 'NO Settig.';
$settig_msgB = 'NO Settig.';
$error_detail = 'No Error.';
sub my_error(error_detail){
	#callされた時点での変数内容に従う。
	if($point_err eq 'bol1_1'){
        print "Content-type:text/html\n\n";
        print "<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>Error</title></head><body>";
	}
	print "<h1>エラー発生(An error has occurred.)</h1><h2>detail $_[0]</h2><div style=\"background-color: #000066;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">$settig_msgA</div><div style=\"background-color: #006600;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">$settig_msgB</div><br>";
	
	if($point_return eq  'bol2_1'){
		return;
	}
	print"</body></html>\n";
	exit;
}
# &my_error('test error.');
$settig_msgB .= 'kokowo tsuuka.';
$point_err = 'bol1_0';# ヘッダー作成領域を過ぎたので、チェンジ。
print "Content-type:text/html\n\n";
print <<MY_EOF ;
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<BODY BGCOLOR="#ffffff">
<h1>xampp perl test</h1>
MY_EOF
$point_return = 'bol2_1';# 表示した後戻ってもらう事にここから戻せば終わる。

$puroburem = "i't no";
$settig_msgA  = "problem $puroburem problem".'.'; $settig_msgB .= $settig_msgA;
&my_error('test error.');

print <<MY_EOF ;
テスト終了
</BODY>
</html>
MY_EOF
exit;
```

やってみた結果を、お楽しみに。書いていてイメージ出来れば、釈迦に説法だが、釈迦はそれも、考えた、結果が楽しみと、聞くだけやと、思うが。
次回に続く。
localhost としての xampp downloadと簡単な試験

<b>注意</b>　インストールディレクトリをxamppから大文字の「XAMPP」に<b>しないで</b>ください。phpの基本パスが小文字のため、通らなくなり、phpを使いたい時は名前を変えずに再インストールしてください。

xampp をダウンロードして試験するまでをやってみた。機能として入っているのは再確認となっています。
BingAI　検索で xammp download　と入れるとページを案内してくれます。分からない言葉が出てきたら「Copilot」サイドに出しておくと便利に質問することも、出来ます。時々、嘘を教えるので見抜く学習もしてください。
それでは、インストール編。
![Animation_xampp3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/7e282c4c-b192-e92b-18c7-8ea66dadefe8.gif)
1.　downloadで最新のものがあったら、選ぶのも手。
2.　インストールapachを許可する。
3.　コンフィグでlocalhost:80と.cgiが許可されているか確認。　
4.　adminでlocalサーバーの設定にもできるが、無断開局はしない方がいい。
　　要望としてはユーザーメールアドレスを設定出来てxamppの所有者か分かるように期待したい。
5.　mysq　localにおいて仕様出来る様になってる。よく知らない。password　の設定が必要。
　　php にアクセスすると詳細を求めるようになる。
6.　filezilla　localにおいて仕様出来る様になってる。よく知らない。　　
7.　mercury　localにおいて仕様出来る様になってる。よく知らない。
8.　Tomcat　はサービスをしていない。ポートの割り当てを実行していない。Java関係の様だ。
Quit localサーバーにもなっているから、終わらせるな接続が切れるって事だろう?
:Executing "c:\xampp\"としろって、アンインストーラーのテストやん。
:
:
:
次に、点検と試運転。
![ani_xampp_5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/f49034ca-2a3d-d33c-4915-a80b49e97edd.gif)
1.　localhostの実行できるエリアが「XAMPP\htdocs\内部」だから、そこに置いて呼び出せば表示を実行する。
2.　ログから、アクセスログ、エラーログを見られるとなっている。ErrorlogはVSCoodに出して置けば、追従変更表示がでるけどね。
3.　ディスクトップにアイコンとして出す。ファイル、フォルダーの上にマウスカーソルを乗せ右クリック「その他のオプション」「送る」「ディスクトップ(ショートカット作成)」　
;
https://notepad-plus-plus.org/ ;ノートパッド
VSCood ;製品には、自分のdownloadサイトは見つかりませんでした。
;
アンインストーラーを使ってみて　htdocsフォルダーが消えるため、中の作成した物がすべて消えます。残すように改善して欲しいです。
;
最後に、続編として、perlの起動、pythonの起動、rubyの起動、phpの設定確認方法へと続くので、あります。
テスト自動化ツールT-DASHを使ってみた

## テスト自動化ツールT-DASH
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660761/d6436343-02dd-14cd-da35-28ace643aeb9.png)


## T-DASHで出来ること



https://service.valtes.co.jp/t-dash/request

以下、T-DASH公式サイトより引用

### 日本語で書いたテストケースが スクリプトになる
T-DASHは日本語で書いたテストケースが、 そのままスクリプトとして自動テストを実行できます。
自動化の導入を妨げる要素としてまず第一に挙げられるのがスクリプトメンテナンスです。T-DASHではスクリプトを従来の開発言語で作成したスクリプトではなく、T-DASHで設定できる日本語のテストケースをそのまま実行することができるため、今まで諦めていた自動化の導入を促進することができます。


## すぐに使えて操作が簡単

分かりやすいUI/UXなので、習熟時間も短くすぐにツールを使いこなすことができます。
スクリプトが必要ないとはいえ、ツールの操作自体が専門のエンジニアでないと難しいとなっては、誰でも使えるツールとはいえません。T-DASHではマウス操作で選択していく箇所も多く、また直感的に操作をイメージしやすいデザインにしているため、インストール後すぐに使い始めることができます。


## 月額3,960円で開発スピードを高速化
T-DASHは業界騒然の1ライセンス3,960円で利用可能。 ランニングコストを下げて”使い続ける”ことができるツールです。
ランニングコストの低さもT-DASHの特長の一つです。月額利用料が高いツールは導入に関する障壁も高くなります。T-DASHは無料トライアルが30日間あり、月額料金も圧倒的な低価格を実現しています。T-DASHがクライアントソフトなのが値段の秘密。そのため実行回数も制限なく、ハイパフォーマンスのツールを安く利用できます。

## 使ってみた感想

実際に使ってみた所、普段手動で操作をしている行動を、自動化できるポテンシャルがあるツールだと思いました。
お試しもあり、無料で試せるので、興味を持ったら、使ってみるのがおすすめです。
anaconda 仮想環境内で pip install uwsgi ができない

uwsgiをインストールしようとすると下記のログが出力されました。

```terminal
pip install uwsgi 
```

install output
```terminal
Collecting uwsgi
  Using cached uwsgi-2.0.23.tar.gz (810 kB)
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: uwsgi
  Building wheel for uwsgi (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [205 lines of output]
      /Users/username/anaconda3/envs/django_docker_env/lib/python3.11/site-packages/setuptools/_distutils/dist.py:265: UserWarning: Unknown distribution option: 'descriptions'
        warnings.warn(msg)
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib
      copying uwsgidecorators.py -> build/lib

~~~~
/Users/username/anaconda3/envs/django_docker_env/lib/python3.11/config-3.11-darwin/libpython3.11.a
      clang: error: no such file or directory: '/Users/username/anaconda3/envs/django_docker_env/lib/python3.11/config-3.11-darwin/libpython3.11.a'
      *** error linking uWSGI ***
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for uwsgi
  Running setup.py clean for uwsgi
Failed to build uwsgi
ERROR: Could not build wheels for uwsgi, which is required to install pyproject.toml-based projects
```

ログを見て見る限り、clangの必要なファイルがなさそう。
ただ、いろいろ検索で調べて見るものの、解決策となるような回答が発見できなかった。

##  解決策
ChatGPTに色々質問していると下記の内容で解決できることがわかった。

```terminal
conda install -c conda-forge uwsgi
```

上記のコマンドは、Anacondaのパッケージ管理ツールにuwsgiをインストールする方法。
conda-forge はコミュニティによって維持されているCondaのサードパーティパッケージのリポジトリ。
conda-forge チャネルは、数多くのオープンソースのパッケージがメンテナンスされている場所であり、一般的に利用されている。ここからダウンロードしているのが、上記コマンド。

便利ですね。
作品：LDAPソート（LDAP_Sort）

#概要

LDAPファイルをソート。

Github: https://github.com/RistoLibera/LDAP_Sort

#使用技術

・Powershell
・LDAP

#機能一覧

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/6d839ce2-2e57-ef9f-8f5d-da9adc918dd5.png)
スクリプトとldifファイルを同じフォルダに入れ。

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/1ac614dd-84e9-55ac-6451-99c1467e1a5d.png)
WindowsのCLIを開いて、ファイルの名前と順序を指定して実行。

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/87cd8c7e-121b-701f-9d38-90d119ea0c22.png)
ソート成功!

#まとめ

memory leakエラーに遭わないため、生成するtempファイルによってソートします。
カレンダー折り返しや！

# 君なんでカレンダーやってるの？
これについては、前々から後輩君にアウトプットめっちゃ大事ですよ！
と言われていたものの生来のめんどくさがりな自分はそのうちやります・・・やり・・ま・・す・・・
と言いつつわーいゲームたーのしー！バイクきーもち～と趣味に逃げ続けてました

しかし今年のカレンダーはなぜか旧チームのメンバーが全員「俺一人で書ききりますけどなにか？？」みたいな状態になりつつありました。
カレンダー開始の1日時点では参加の意思もなかったチーム内の唯一の先輩も4日ころには記事を投稿しはじめており、半ばやけくそ気味とノリで俺も参戦するか、と思い立った訳でした

# やっと重い腰上げたけど君大丈夫そ？
いざ記事投稿始めたのが12月8日とアドベントカレンダー開始から1週間後という状態で、
何も準備もしていないし、そもそも自分は業務的に開発する機会も少なめだったりでネタが・・・という状態になってました。
とりあえず技術系の詳しい記事だったりを書くには期間も足りなさすぎるのもありここ最近を振り返りつつ（年重ねるごとにここ最近の幅が広くなる）おもひでぽろぽろするか、となっております。

なので基本的にはライトな記事をとりあえず頑張って放出するスタイルでなんとかやりくりしたい

# 折り返し迎えたけどどんな気持ち？
最終日前日に折り返しを迎えてまさに小学生の夏休みの気分です。
思えば小学生のころから夏休みの宿題は最終日付近に頑張る子供でした。
頑張って今日中にカレンダーに追いつけるように努力したいです。
~~今年のGameOfTheYearになったBaldur'sGate昨日購入してやってるけどめっちゃたのしい~~