OmniAICreator/Qiita-1.07M huggingface dataset:
PythonにおけるListについて

# はじめに
コーディングしていてよく使うListの基本的な記述をまとめていきます。

# Listの基本
## Listの宣言と値への参照方法
```python
# 変数宣言
a_list = []

# 宣言時に値を格納
b_list = [1, 2, 3]

# 値への参照
index = 1
b_list[index]
# 出力結果:2
```
## メソッドの使い方
### 値を追加する
```python
# listの末尾に要素を追加
# list.append(値)
b_list.append(4)
# 出力結果：1, 2, 3, 4

# listの値を指定したインデックスの位置に追加
# list.insert(index位置, 値)
index = 4
b_list.insert(index, 5)
# 出力結果:1, 2, 3, 4, 5
```

### 値を削除する
```python
# 指定したインデックスの要素を削除
# list.pop(index番号)
b_list.pop(0)
# 出力結果:2, 3, 4, 5

# 指定した要素を削除
# list.remove(要素)
b_list.remove(2)
# 出力結果:3, 4, 5
```

### Listを結合する
```python
# list.extend(list)
c_list = [6, 7, 8, 9]
b_list.extend(c_list)
# 出力結果:3, 4, 5, 6, 7, 8, 9
```

### Listを初期化する
```python
# Listの初期化
b_list.clear()
# 出力結果:
```

### インデックスを検索する
```python
# list.index(要素)
d_list = ["aaa", "bbb", "ccc", "ddd"]
d_list.index("bbb")
# 出力結果:1
```

### Listの要素数を取得する
```python
len(d_list)
# 出力結果:4
```

## List内包表記
List内包表記とは、既存のListから新しいListを作成する手法の1つです。
List内包表記は、通常の方法でListを作成するより簡潔に記述することが可能です。
```python
# 通常の方法
# 奇数をList
results = []
for i in range(1, 20):
    if i%2 != 0:
        results.append(i)

# List内包表記
# [式　for 任意の変数名 in イテラブルオブジェクト]
results = [i for i in range(1, 20) if i%2 != 0]
```
### 三項演算子と組み合わせてみる
三項演算子とは、`(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)`で表現されます。
これと、List内包表記を組み合わせる場合は`[真のときの値 if 条件式 else 偽のときの値 for 任意の変数名 in イテラブルオブジェクト]`となります。

```python
# ０から１０までの数を偶数の場合は「」、奇数の場合は「奇数」を出力
print(['偶数' if i%2 == 0 else '奇数' for i in range(10)])
```

## List内の要素を検索する
```python
e_list = ["aa", "bb", "cc", "dd", "ee"]
aa = "aa"
if aa in e_list:
    print("aaがあります。")
if aa not in e_list:
    print("aaがありません")
```

# おわりに
ここまで、読んでいただきありがとうございました。
PythonのListの使い方をまとめました。
次回は、Dictionaryについて書きたいと思います。
Java EEからJakarta EEへ

https://blogs.oracle.com/otnjp/post/transition-from-java-ee-to-jakarta-ee-ja

表にするとこんな感じかな？
|仕様　　|Javaパッケージ　　|MavenグループID　|管理　　　　　|メモ|サーブレット|Tomcat|WebOTX|
|:-|:-|:-|:-|:-|:-|:-|:-|
|JavaEE 6|javax.|javax.|Oracle|―|3.0|7.0.x(superseded)|9|
|JavaEE 7|javax.|javax.|Oracle|―|3.1|8.5.x|10|
|JavaEE 8|**javax.**|**javax.**|Oracle|リリース直後に移管発表|4.0|9.0.x(superseded)|-|
|JakartaEE 8|**javax.**|<font color=red>**jakarta.**</font>|<font color=red>**Eclipse</font>**|<font color=red>**Javaパッケージは変更無し**</font> |4.0|9.0.8|**11**|
|JakartaEE 9|<font color=red>**jakarta.**</font>|jakarta.|Eclipse|**Javaパッケージ変更のみ**|5.0|10.0.x|-|
|JakartaEE 10|jakarta.|jakarta.|Eclipse|移管後の初の機能アップデート|6.0|10.1.x|12|

TomcatとサーブレットAPIの対応バージョンを確認

https://tomcat.apache.org/whichversion.html

TomEEとTomcatの対応関係を確認

https://tomee.apache.org/comparison.html

その他

https://jakarta.ee/

https://qiita.com/SightSeekerTw/items/d4e597b81e3678de0ef0

https://associatejavaprogramer.blogspot.com/2018/07/java-ee-jsp-apache-tomcat-8-4.html

https://web-dev.hatenablog.com/entry/java/servlet/version-and-compatible-products
console.log()の色々な使い方

`console.log()` は複数の引数を受け取ることができます。  
それらの引数は、スペースで区切られてコンソールに表示されます。

```
console.log("alice", "john")
出力 => alice john
```

### 注意点
`console.log() `は実行時間にわずかなオーバーヘッドがあるため、本番環境のコードに残しておくのは推奨されません。  
多くの場合、ビルドツールやLintツールを使用して、本番環境のコードからこれらのログを自動的に削除するように設定します。  

過度なログ出力は、コンソールの可読性を低下させる可能性があります。適切な場所とタイミングでログを取ることが重要です。
【Figma】他の人のカーソルを表示させない方法

# はじめに
最近弊社のデザイナーと話をする機会があったのですが、その際に他のメンバーが参照してもカーソルを表示させない方法はあるのかと質問をもらいました。
確かにFigmaはリアルタイムでやり取りができる点は便利だと思いますが、これはかえって不都合になり得ることもあるなど実感しました。
そこで他のメンバーが参照していてもカーソルを表示させない方法を備忘録的にまとめておこうと思います。

# カーソルを非表示にする方法
非表示にする方法は非常に簡単で、メニューの【View】 → 【Multiplayer cursors】のチェックを外すことで非表示にすることが可能です。

![スクリーンショット 2023-08-27 17.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/f07818b3-1805-123f-14e3-737faacd69ab.png)

また、以下ショートカットでも表示非表示を切り替えることが可能です。

cmd + option/alt + \

以上になります。

# さいごに
常に誰かのカーソルが自分の近くにあったらやりづらいですよね。
そんな時は是非この設定を活用してみてください。
UnityのWebGLビルドで「'cp932' codec can't decode」エラーが出た時の対処方法【備忘録】

UnityではPluginsディレクトリ以下に `.jslib` ファイルを置くとJavaScriptを呼び出せます。

https://docs.unity3d.com/ja/2023.1/Manual/webgl-interactingwithbrowserscripting.html

Unity2022.3以降ではjslibファイル内で日本語(コメント含む)を書くとビルド時に `'cp932' codec can't decode` エラーが出て失敗します。

ですので日本語は書かないようにしましょう。
*BSDでDisplayLinkを試してみた

お台場であったODC2023の帰りに秋葉に立ち寄り、ジャンクを物色してきました。

今回はあまりめぼしいものがなく、最初にパスしたUSBのディスプレイユニット(Logitec LDE-WX015U)を最後に戻って日米商事さんで110円で購入しました。

帰ってきて検索してみたところDisplayLinkという製品で、FreeBSD,NetBSDにもudlというOpenBSDから移植したドライバーがありました。

翌日することもなかったので、ちょっと試してみました。

このUSBモジュールのVIDは製品のメーカーのものではなく、DisplayLink社のものになっていました。

ジャンクなので壊れている可能性もあり、一度Windows 7にドライバーを入れて確認したところ問題なく使えました。

まずFreeBSDなのですが買って来た製品のPIDがudl.cになく認識しなかったので、とりあえず足しました。

12-STABLEのコードでmipsを試したところAtheros,Ralinkとも認識するものの固まりました。LEDの点滅が続いているので完全に落ちているわけではないようなのですが、コンソールも何も出ず反応しません。USBが使い方によってはちょっと不安定なのかもしれません。

しかたがないのであきらめてNetBSDを試して見ます。

こちらはPIDがudl.cに入っています。

starはなぜかudlを入れるとARMBootがCRCエラーを起こしました。???

c2kのOTGではpanicしました。このような重い使い方では安定していないようです。

HDがSATAのKirkwoodに接続したところちゃんとDVIの同期信号が出るようになりました。(74KHz / 59.9Hz 1600x1200)

https://dmesgd.nycbug.org/index.cgi?do=view&id=7261

下記を実行するとttyになります

```
# wsconscfg -f /dev/ttyEcfg 0
```

これで/dev/ttyE0がディスプレイになり、文字が書けました。

```
# echo "MORI MORI" > /dev/ttyE0
```

USB HUBを入れると不安定になるようです。

ttyFと書いてあったページもあったのですが、変わったのかな？

日米商事では先代（今の店主のお父さん？）もいらっしゃってて、元気そうなすがた見れてよかったです。
react-hook-formのhandleSubmit関数を直接呼び出す際の注意点

## 事象
react-hook-formを使用してフォームの送信処理を実装していた際、handleSubmit関数の末尾に()をつけ忘れたことで、フォームを送信しても指定したコールバック関数が実行されないという問題が発生しました。具体的には、送信ボタンをクリックしても何も反応がなく、ブラウザのコンソールにもエラーメッセージは表示されませんでした。初めは他の原因を疑い、コードのデバッグを試みましたが、最終的にはhandleSubmit関数の呼び出し方に問題があることを発見しました。

```PaymentStatus.tsx
import { FormProvider, useForm } from "react-hook-form";

const PaymentStatus: React.FC<Props> = (props) => {
  const formMethods = useForm<{ ... }>();
  const { handleSubmit } = formMethods;

  const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    // フォームのデフォルトの送信動作（ページのリロードを伴う）をキャンセルします
    e.preventDefault();
    handleSubmit((params: { ... }) => {
      // ここで実際の処理を行うコールバック関数を呼び出し、その後()で関数を実行します
    })();
  };

  return (
    <FormProvider {...formMethods}>
      <form onSubmit={onSubmit}>
        ...
      </form>
    </FormProvider>
  );
};
```

## 対処法
上記のように、handleSubmit関数の後に()を追加することで、内部のコールバック関数が正しく呼び出されるようになります。

## handleSubmit関数の後に()が必要な理由
handleSubmit関数は、内部でフォームのバリデーションやエラーハンドリングを行った後、指定されたコールバック関数を実行する関数を返します。したがって、handleSubmit関数を呼び出すと、新しい関数が返されます。この返された関数を実行するためには、()を使用して呼び出す必要があります。

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
Next JSで画像を返すAPIを作る

Next JSで画像生成APIを作る時、調べてもなかなか出なかったので、ここに残しておきます

```powershell
npm i canvas
```
canvasのライブラリをインストールする

```image.ts
import type { NextApiRequest, NextApiResponse } from 'next'
import { createCanvas } from 'canvas';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse<any>
) {
    const canvas = createCanvas(1920, 1080); //1920×1080の画像を作成
    const ctx = canvas.getContext('2d'); //コンテキストを取得

    res.setHeader('Content-Type', 'image/png');
    res.setHeader('Content-Disposition', 'inline;');
    res.status(200).write(canvas.toBuffer()); //バッファーを返す
    res.end();
}
```

これで、apiにアクセスすると、1920×1080の透過画像が返って来るようになり、ctxで色々加工をするとそれも反映されます。
WindowsでTomcat起動時のコンソール文字化け

Windows+Tomcat環境でTomcatを起動すると(tomcat\bin\startup.bat)、コマンドプロンプトはSJISで表示するのに対し、TomcatのログがUTF-8になっているため、日本語表示で文字化けが発生します。

tomcat\conf\logging.propertiesを開き、51行目を以下のようにSJISに変更します。

```bat:tomcat\conf\logging.properties
# java.util.logging.ConsoleHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.encoding = SJIS
```

これで再度Tomcatを起動すると、日本語部分の文字化けは解消される。
【Chat GPT】質の高い回答を得るにはこれだ！プロンプトまとめ

# はじめに
こんにちは、エンジニア2年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！
未経験からエンジニアとして成長していきたいと思う中で、作業時間短縮やさまざまな知識やツールを活用し、情報収集をしたくなるのは当然のことですよね。
今回は、無料で利用できるGPT-3.5を使って、質の高い回答を手に入れる方法についてお伝えします。
ぜひ最後までお付き合いください！

# 目次
- [プロンプトとは](#プロンプトとは)
- [Chat GPTとは](#chat-gptとは)
- [質の高い回答を引き出す方法](#質の高い回答を引き出す方法)
  - [質問を明確にする](#質問を明確にする)
  - [役割を与える](#役割を与える)
  - [ルールを決める](#ルールを決める)
  - [実際の使用例](#実際の使用例)
    - [ビジネスメールの作成方法](#ビジネスメールの作成方法)
    - [議事録のまとめ方](#議事録のまとめ方)
    - [テストデータを考えてもらう](#テストデータを考えてもらう)
    - [最終兵器](#最終兵器)
- [最後に](#最後に)

# プロンプトとは
プロンプトとは、AIに対して質問や命令をする為に送信する指示文のことです。
プロンプト文は、目的や背景を明確にし、文脈を捉えた内容にすることが重要です。
適切なプロンプトの使い方が質の高い回答を引き出すカギとなります。

# Chat GPTとは
Chat GPTは、OpenAIが開発した自然言語処理モデルの一種です。
人間のような文章生成や対話を行うことが可能で、様々なタスクに応用されています。
無料で利用できるGPT-3.5もその一つであり、質の高い回答を得るために活用することができます。
# 質の高い回答を引き出す方法
質の高い回答を得るためには、以下のポイントが重要です。

## 質問を明確にする
GPT-3.5は、入力されたテキストに基づいて回答を生成します。
質問が明確でないと、望んだ回答を得るのは難しいです。

## 役割を与える
プロンプトに特定の役割や視点を設定することで、より的確な回答を引き出すことができます。

## ルールを決める
AIに対して具体的なルールや制約をプロンプトに含めることで、望ましい回答を得る手助けができます。

## 実際の使用例
以下では、実際のシナリオごとに効果的なプロンプトの使用例をご紹介します！
コピペで内容を変えれば使えるようになっているのでぜひ使用してください。

### ビジネスメールの作成方法
私自身、普段書かないのでビジネスメールを書く際にはかなり時間を使ってしまうタイプです。
そこで、GPTくんに頼ってみましょう！
以下がプロンプトです。
```
以下の情報を元にビジネスメールを作成してください：
宛先: [宛先の名前]
目的: [メールの目的（例：ミーティングのスケジュール調整、プロジェクトの進捗報告、お詫び、感謝など）]
主要な詳細: [メールの内容に関連する主要な詳細]
希望するアクション: [受信者に期待するアクション（例：返信、ミーティングの確認、フィードバックなど）]
```

### 議事録のまとめ方
議事録をとるのって難しくないですか…？
これもGPTくんに頼ります！
```
以下は、会議の{速記メモ}です。
{条件}を守って、きちんとしたフォーマットの
議事録を1回だけ書いてください。

【条件】
・アジェンダの目次は不要
・報告は人単位でまとめる
・その後の議論は、流れを追う
・最後に、全員のToDoを明示する

【速記メモ】
"""
[メモの内容]
"""
```

### テストデータを考えてもらう
seederに入れるデータ、考えるのに時間は使いたくないですよね…
```
以下の項目のダミーデータをmarkdown形式で作成してください。

・ユーザーID: 重複がない、1から昇順
・氏名: ユーザーIDに紐づく
・メールアドレス: ユーザーIDに紐づく
・性別: ユーザーIDに紐づく、0:無回答、1:男性、2:女性
・誕生日: ユーザーIDに紐づく

【出力フォーマット】
|ユーザーID|氏名|メールアドレス|性別|誕生日|

【件数】
10件
```

### 最終兵器
プロンプトもGPTに考えてもらいましょう！笑
```
下記の、ChatGPTに求める【リクエスト】に応えるため、
ChatGPTが最高の成果を出すためには、
どのようなプロンプトを与えればよいですか？
リクエストへの直接の回答は不要ですので、
プロンプトの中身だけを例示してください。 
No repeat, no remarks, only results, in Japanese

【リクエスト】
朝早く起きられるようになる方法が知りたい

【プロンプトの条件】
・まず、リクエストを詳細化して
・私が伝えるべき追加情報があれば、その項目の箇条書きを含めて、
・ユーザーの立場から、ChatGPTに向けて送信するスタイルの質問文
```

# 最後に
質の高い回答を得るためには、適切なプロンプトの選択がカギです。
これらのプロンプトを使いながら、GPT-3.5を上手に活用しましょう。
そして、作業時間を短縮して勉強の時間に回せると最高ですよね
また、メンターの役割を与えたり、キャリアアドバイザーとしても対応してくれることも可能です。
利用方法は無限大ですので、ぜひ有効に活用してみてください！私自身も成長できるように頑張ります。
【Node.js】簡易アプリ開発①～Node.jsインストール～

# Node.jsのインストール
### ① 以下URLにアクセス
　https://nodejs.org/ja
　※LTSを選択
### ② 最新LTS版のインストーラをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/adbc99c0-74e3-96ad-53c6-648305560354.png)
### ③ インストールを進める
　(1) ①でダウンロードしたインストーラをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/41426d94-0ffd-626b-ccd3-c574daaa88c0.png)
　(2) セットアップ開始
　　　[Next] クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/fae02c09-f50e-fa34-8164-0c8194e8b4a7.png)
　(3) ライセンス同意
　　(A) [I accept the terms …] チェックを有効化
　　(B) [Next] クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/82baf6e9-3845-4103-190c-c02a1f379d08.png)
　(4) インストール先
　　　任意の格納場所を選択し、[Next] をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/4228908f-8a1e-6a26-0084-5fe7c29ca1b6.png)
　(5) カスタムセットアップ
　　　今回は変更なしのため、そのまま[Next] をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/52cf757f-9d71-e275-f495-73f7bca14cbc.png)
　(6) 一緒にインストールする関連ツール選択
　　　今回は不要のため、そのまま[Next] をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/2b65cb0c-2f63-feb6-e8c3-fd0e86a562f3.png)
　(7) インストール開始
　　　[Install] をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/4bab9f78-8b9b-32df-0a07-b76b95628b09.png)
　(8) インストール完了
　　　[Finish] をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/919a7c62-c5a9-5220-3f1c-03555dcf8cf3.png)
### ④ バージョン完了確認
　コマンドプロンプトにて、[node -v]を入力。
　バージョンが表示されるか確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/ddf63628-4958-2c9a-2c3c-3a32acaf1fa6.png)
なんでモダンJavaScriptを使うの？

# Vanilla.js
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/fee20b85-ad02-3c8c-b5bb-0b1f3aae9a4a.png)
何のライブラリもフレームワークも使わないで書かれたJavaScript(JS)のこと

# モダンJS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/18b6d756-31c7-2dfc-808d-d3f989909d84.png)
- 仮想DOMを用いるライブラリやフレームワーク
- npmやyarnなどのパッケージマネージャ
- webpackなどのモジュールバンドラ
- Babelなどのトランスパイラ

具体的にはReact, Vue, Angularを指していると考えて差し支えない

## DOM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/286b47b8-3b39-dc3a-1c39-615ad32b6d06.png)
Document Object Model
HTMLなどの文書を木構造で表現したもの
DOM操作自体はコードが複雑化する上に、レンダリングコストが高いというデメリットがあった

## 仮想DOM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/b841398b-c726-74a6-4075-a159758db81e.png)
JSのオブジェクトで仮想的に作られたDOM
要素の追加や削除をする際に、いきなりDOM操作をするのではなく、JSで仮想DOMを操作し、差分を出してからDOMに反映をする
モダンJSではここの操作を行ってくれる

## パッケージマネージャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/1ba9131b-6f68-656f-8944-f351afa442a7.png)
元々のJSファイルは１つに全ての記述を書いていたためカオス化していた
後にファイルの分割が主流化したが、依存関係のために読み込み順を意識しないとエラーが発生していた
そんな面倒ごとをNode.jsが依存関係の解決をしてくれるのがパッケージマネージャ

npmというパッケージレジストリからコマンドを用いてライブラリをインストールできる
インストールしたライブラリの実態(jsファイルなど)はnode_modulesフォルダに保存される
インストールしたライブラリはpackage.jsonで管理される
package.jsonにあるライブラリの依存関係を解決するのがpackage-lock.json

## モジュールバンドラ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/d12ee577-ea75-f733-2d1d-9e6307f140d6.png)
複数のファイルを１つにまとめるためのもの
基本的にコードを書く際は、細かいファイル単位に分割する
それは可読性や再利用性などを考えた結果である
ただし本番環境で実行する際は1ファイルの方が読み込みなども少なくなって高速なので、ビルド時に１つのファイルにまとめてしまおうという考えが拡がった
この際に依存関係なども判定して１ファイルにしてくれるためのもの

## トランスパイラ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/fce82f82-5e43-89fa-abc2-b15fd933976b.png)
新しいJSの記法を古い記法に変換するもの
対応していないブラウザなどがあるので、新しい記法のままだとJSが動かない場合がある
新しい記法で開発し、実行するときは古い記法に変換を行うことで、この問題を解決する

# SPA
Single Page Applicaton
HTMLは1つだけ準備し、JSで画面を書き換えるアプリケーションのこと
モダンJSはSPAが基本である

元々はリンクを辿ることで、サーバサイドから異なるHTMLファイルが配信されるのが普通であった
配信するのがHTMLファイルからデータに変わり、データに応じてHTMLファイルのDOMを書き換えるということを行っている

UXの向上、コンポーネント化することでの開発効率向上などのメリットがある

# まとめ
開発のしやすさ、依存関係の解決などをしてくれるので、モダンJSを使う
[Python]文字列の入力を受けて文字数を数える

本当に簡単な作業をしましょう。
これは初めてPyhtonを学ぶ方向けの練習問題です。
名前を入力したら名前の文字数を出力します。


# 文字列を入力してもらおう
まず文字列を入力してもらう必要がありますね
**input**関数を使って名前をもらいます。
```python
input("名前を教えてください")
```

# 文字数を数える関数は？
**len**関数を使ったら文字数を数えることができます。
```python
len("abc")  # 3
```

# 結合
じゃあ上で学んだ関数を使って結合しましょう。
まず**input**を使ったところに入力した文字列が残ります。
これで入力した名前の文字数をわかりますね。
```python
len(input("名前を教えてください。"))
```

<br>
これを出力したいなら**print**関数に入れると出力されます。

```python
print(len(input("名前を教えてください")))
```

本当に簡単な関数ですが活用度が高いのでこのような簡単な問題で練習した方が良いですね
Harman Kardon Aura studio 2 を分解清掃する

※この記事は人力で作文した記事です。

執筆時点でiFixitなどで参考になりそうなものがなかった（探せなかった）ので投稿。

# 背景

2017年ごろに購入した Harman Kardon Aura studio 2、見た目はかっこいいのだけれど、中央にウファーのための大きな穴が空いていてそこから埃が侵入し放題。
掃除をしようにも、指は届かず、ハンディワイパーも絶妙に届かず...

![IMG_0624.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/0756a900-b1e3-dcc0-8355-27a152d0a924.jpeg)



どうしても埃がたまってきて耐えられないので、分解清掃を決行



ちなみにこのモデル、現在は廃盤で、新しいモデルはウーファーのための大きな穴は塞がれているようですｗ

(アフィリエイトはありませんのでご安心を)
https://www.amazon.co.jp/Harman-Kardon-Bluetooth%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC-HKAURASTUDIO2BLKJN-%E3%80%90%E5%9B%BD%E5%86%85%E6%AD%A3%E8%A6%8F%E5%93%81%E3%80%91/dp/B0739T9DLV/ref=sr_1_2?keywords=harman+kardon+aura+studio2&qid=1693112021&sprefix=harman+kardon+aura+2%2Caps%2C176&sr=8-2

# 用意しておいた方がいいもの

- No.0 くらいのプラスドライバー
- スパッジャー(薄いヘラみたいなやつ、スマホ分解キット買ったら大抵ついてきます)
- 床に敷く何か(今回はヨガマットを使いました)

![IMG_0625.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/daf62dfe-09a4-e066-5bac-80e2304e692c.jpeg)


# 分解

## 台座を外す

筐体を裏返してシリコン製の足を外す。
これ自体は両面テープ的なもので留まっているだけなので、ヘラを使って外す。雑に剥がすと両面テープが再利用できなくなるので注意。
ちなみに、元々貼られてたのは、スピーカーの円周上に貼るための専用品と思われます。

外したもの

![IMG_0122.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/e837af1f-eb20-daf0-c043-60045158423a.jpeg)

![IMG_0132.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/15ecd0b1-f163-f76a-be4c-e1351696035f.jpeg)

↑のように、裏側にネジ穴が13個ほどあるので順番に外していく

全て外すと、おそらく以下の様なネジが出てくるはず。

![IMG_0119.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/213eb7ae-30ec-388d-1a20-0eb306347969.jpeg)
![IMG_0120.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/f0d3405d-6bed-8540-4bc9-43428736698e.jpeg)
![IMG_0121.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/835c6318-50a9-31b3-c09b-35afb6013b18.jpeg)


慎重にスピーカーの本体があるベース部分と飾り()の上部を慎重に取り外す。
下から覗いて電源ボタンの配線が見えてきたら、それ以上は離さない。
![IMG_0124.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/68f9b83a-55d5-1151-2b22-96bebe93d387.jpeg)


このとき、写真のように半開き状態で、PMC基盤が見えるので、このコネクタを外しておく。
このコネクタは電源ボタンやBluetoothボタンの配線などが通っていると思われるので慎重に作業した方が良い。
![IMG_0125.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/77e71a7e-0457-423b-d668-ac473fb0dcc4.jpeg)


基盤を破壊しないように...
![IMG_0131.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/289248b5-a37e-a418-425b-9f5658f4473f.jpeg)

上下を繋ぐ部分はここだけなので、この後は素直に分解してOK


上下のパーツを分解した図
![IMG_0126.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/2d291e16-7b96-10c3-d432-02e66d04f54c.jpeg)



# 清掃

中身に手が入るようになったので思う存分、埃を拭き取る。

この辺の基盤は興味はあるがこれ以上の分解はまた今度。
![IMG_0129.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/274a8a40-a85c-639c-dede-a030b4cfb6d6.jpeg)


# 原状復帰

分解した逆の順番で元に戻す。
手順は省略



# 埃対策として

Harman Kardon Aura studio 2 の埃侵入対策として、穴の空いた部分に直径5cm程度のガラス玉を置くとよいそうです。
![IMG_0626.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/e07649be-d4b7-e677-1041-bbcf7a6d66e9.jpeg)


# 結論

- スピーカーが綺麗になってよい

# 参考

実際に分解した人の動画
https://www.youtube.com/watch?v=MhFnnnHgfNc
Docker基本コマンド

イメージ取得
```docker image pull {イメージ名}```

イメージ削除
```docker image rm {イメージ名}```

イメージ一覧
```docker image ls```

イメージの詳細情報を表示
```docker image inspect {イメージID}```

イメージからコンテナ実行
```docker container run --name {コンテナ名}　{イメージID}```

イメージからボリュームに接続してコンテナ実行
```docker container run -v {ボリューム名}:{コンテナ内の絶対パス} {イメージ名}```

イメージからホストのフォルダに接続してコンテナ実行（バインドマウント）
```docker container run -v {ホストの絶対パス}:{コンテナ内の絶対パス} {イメージ名}```

イメージからポートを紐づけてコンテナ実行
```docker container run -p {ホスト側のポート}:{コンテナ側のポート} {イメージ名}```

イメージからコンテナ実行して、コマンドを実行後にコンテナを削除
```docker container run --rm　 -it {イメージID} {コマンド(lsなど)}```

イメージからデタッチモードでコンテナを実行
```docker container run -it -d {イメージID} {コマンドなど}```

イメージからネットワークを指定してコンテナを実行(指定しない場合は「bridge」に接続)
```docker container run -it -d --network {ネットワーク名} {イメージID}```

コンテナ削除
```docker container rm {コンテナID}```

コンテナが実行中でも強制削除
```docker container rm -f {コンテナID}```

停止済みのコンテナを一括で削除
```docker container prune ```

コンテナ一覧表示
```docker container ls -a```

コンテナ実行
```docker container start {コンテナID}```

コンテナ停止
```docker container stop {コンテナID}```

実行中のコンテナに入る
```docker container exec -it {コンテナID} bash```

ボリュームを作成する
```docker vlume create {ボリューム名}```

ボリュームを表示する
```docker vlume ls {ボリューム名}```

ボリュームを詳細情報表示する
```docker vlume inspect {ボリューム名}```

ボリュームを削除する
```docker vlume rm {ボリューム名}```

ネットワークを一覧表示する
```docker network ls```

ネットワークの詳細を表示する
```docker network inspect {ネットワーク名}```

ネットワークを作成する
```docker network create {ネットワーク名}```

ネットワークを削除する
```docker network rm {ネットワーク名}```

Dcokerfileからbuildする
```docker image build {Dockerfileパス}```

Dcokerfileからbuildする時に名前を付けて実行
```docker image build -t {リポジトリ名(任意の名前)}:{タグ名}(任意の名前) {Dockerfileパス}```

DcokerfileからビルドコンテキストとDockerfileを別々に指定する
```Docker image build -f ./hoge/Dockerfile .```

---
Dockerfile
※RUNはimage作成時に実行される
※CMDはコンテナ実行時に実行される
※ENVは環境変数として設定される
```
FROM {イメージ名}　例：ubuntu:20.04
RUN apt update && ¥
    apt install vim
CMD ["ls","-a"]
COPY ./hoge.txt /opt/
ENV hoge="hogehoge"
```
---
コマンド実行時に変数へ引数を渡す
ARGはビルド時にのみ実行される
```docker image build --build-arg hoge="hogehoge" .```

このDockerfileを上記のコマンドで実行するとコンテナ実行時に「hogehoge」が表示される
```
FROM ubuntu:20:04

ARG hoge
RUN echo $hoge > hoge.txt
CMD ["cat", "hoge.txt]
```
---
ワーキングディレクトリを変更する
opt配下にhoge.txtが作成される
```
FROM ubuntu:20:04

WORKDIR /opt
RUN touch hoge.txt
```
---
マルチステージビルド
「--from=0」で最初に出現したFROMを指定
```
FROM gcc:xx.x.x
WORKDIR /opt
COPY ./hoge.c .
RUN gcc hoge.c

FROM ubuntu:20.04
WORKDIR /opt
COPY --from=0 /opt/a.out .

CMD ["./a.out"]
```
または名前を付けて指定することもできます。
```
FROM gcc:xx.x.x AS compiler
WORKDIR /opt
COPY ./hoge.c .
RUN gcc hoge.c

FROM ubuntu:20.04
WORKDIR /opt
COPY --from=compiler /opt/a.out .

CMD ["./a.out"]
```

本番と開発でENVを分ける書き方
```docker image build --target dev .```
```docker image build --target prod .```
```
FROM ubuntu:20.04 AS base
RUN apt update
CMD ["sh","-c","echo $environment"

FROM base AS dev
ENV environment=dev

FROM base AS prod
ENV environment=prod
---
Visual StudioでPull Request時のコンフリクト解消

自分用のメモとしてまとめます。

https://learn.microsoft.com/ja-jp/visualstudio/version-control/git-resolve-conflicts?view=vs-2022

# Conflictの起き方
例えば共通で利用しているdevelopブランチがあったとして、そこからfeatureブランチを切って開発している。developブランチがすでに同じ個所が更新されている場合、featureブランチをマージするときにConflictが起きる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9bde1b56-2082-e920-2ab9-e51367e230a9.png)

# Conflictを修正するフロー
developにマージする前に、featureブランチにdevelopブランチの修正を反映しておくことでConflictを修正できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9297c2d4-5831-8b95-15cc-48e86f3290a4.png)

# 実際にConflictを起こして解消してみる
## スタート時点
developもfeatureも同じ状態とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/c2242e25-cb37-9aaf-e7f0-9e6ea40ad45c.png)

## developブランチを更新
試しにブラウザから直接更新してしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/b08cbe7b-4c57-b386-57bf-753c0e5a60b2.png)

## featureブランチで同じ個所を更新
VSで同じファイル、同じ行を更新してPushする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/123f2e55-eaa8-4ab5-1dfa-180c4514a414.png)

## featureブランチからPush & Pull Rrequest
この状態で、ブラウザからfeature/TestをdevelopにマージするPRを出してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/6983f49f-4d4d-6d88-68ce-ec458c53fcd9.png)
Conflictになることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/1a8c40f9-04cf-2fe9-4cad-919923a91c99.png)

## VS上でConflictを解消する
### まずlocalのdevelopブランチを最新化
developをチェックアウト。現在developが古い状態になっていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/11d1ea61-f152-7183-9dc9-c07dadf4e06a.png)
developをPullし、最新の状態になったことを確認。先ほどのブラウザからの変更が反映されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/1f96304a-0bc7-5c78-94a3-c9ee954fea68.png)


### localのdevelopをlocalのfeature/Testにマージ
feature/Testブランチをチェックアウト。Git > ブランチの管理からdevelopをfeature/Testブランチにマージする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/76d31af0-74bd-e9c1-7ebb-02db854dc6d4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/efe6d5bb-b557-5386-162f-bc6cc4395fe4.png)

### localでConflictを解消
マージ時に競合が出るので、解決をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/dec89c64-5843-d62c-2a08-c12f53aa3e95.png)
VSのマージ機能を利用して解消。
今回はfeatureの内容が正しい前提で進める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/d48c9262-bac5-95cf-5eb2-1eea7226f94b.png)

### Conflictを解消するCommitをfeature/TestにPush
修正した状態で保存してCommit、Push。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/6a3fa759-2b7c-d256-24c6-57b832e7a6cc.png)
グラフを見ると、developのマージと競合の解決に２個分のCommitがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/73d61396-4aaa-e211-97d0-4c3ee134c0a6.png)
ブラウザからPRを再度確認するとConflictが解消されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/05cf723e-ade7-3b69-d378-012d5c056e81.png)


# プラクティス
お勧めは頻繁にDevelopをFeatureに頻繁にマージしておくこと。最低限Pushする前に一度ローカルで実施し、解消してからPushするようにする。
親ブランチの変更を子ブランチへ取り込む方法

## はじめに

こんにちは、駆け出しフロントエンジニアの**柿**です。
今回は、親ブランチの変更を子ブランチへ取り込む簡単な方法について書いていきます。

## こんな事ありませんか？

PR を出すとき、**コンフリクトが起きていることが！！**
子ブランチの情報が古すぎて、うまくいかないこと、ありますよね。

そんなとき、どうすればいいのか？

そう、親ブランチの最新の状態を子ブランチに反映させてあげればいいんです。

早速手を動かしていきましょう〜！

## 親ブランチの最新状態を子ブランチに取り込む

まずは、親ブランチに移動します。

```bash
git checkout 親ブランチ名
```

次に、親ブランチの最新状態を取り込みます。

```bash
git pull origin 親ブランチ名
```

次に、子ブランチに移動します。

```bash
git checkout 子ブランチ名
```

子ブランチに親ブランチの状態を取り込みます。

```bash
git merge 親ブランチ名
```

これで、親ブランチの最新状態を子ブランチに取り込むことができました！
簡単ですね！
rebase でもできますが、個人的には merge の方がわかりやすいので、merge を使っています。

ちなみに、

```bash
git merge -
```

とすると、直前のブランチの状態を取り込むことができます！

なので、

```bash
git checkout 親ブランチ名
git pull origin 親ブランチ名
git checkout -
git merge -
```

ってよくやりますｗ

## まとめ

さて、今回は親ブランチの最新状態を子ブランチに取り込む方法について書いていきました。
皆さんのお役に立てる瞬間があれば幸いです。

1 日 1pull はしておいたほうがいいかもしれませんね！

それではまた次回〜！
.NET MAUI+blazorでプラットフォーム固有コードを呼び出す。

# 概要
MAUIや以前のxamarinであれば、解説記事が出てくるのですが、blazorを組み合わせたものは無いなと思ったので書こうかと思いました。

参考mauiでプラットフォーム固有のコード

https://qiita.com/selfstudy/items/26841e8054e109c3c017


## blazorで書いてみる

### インターフェース
Serviceディレクトリを作成する。

``` ［プロジェクトディレクトリ］/Service/IDeviceNameService.cs
namespace TestApp.Service
{
    public interface IDeviceNameService
    {
        string GetDeviceName();
    }
}

```


## MauiProgram.csでそれぞれのコードを登録する

``` 
//省略
#if ANDROID
using TestApp.Platforms.Android;
#elif WINDOWS
using TestApp.Platforms.Windows;
#endif



namespace TestApp;

public static class MauiProgram
{
	public static MauiApp CreateMauiApp()
	{
		//省略

		#if ANDROID
				builder.Services.AddSingleton<IDeviceNameService, AndroidDeviceNameService>();
		#elif WINDOWS
				builder.Services.AddSingleton<IDeviceNameService, WindowsDeviceNameService>();
		#endif


		return builder.Build();
	}
}
```



### プラットフォーム固有のコード windows

``` ［プロジェクトディレクトリ］/Platforms/Windows/WindowsDeviceNameService.cs
using TestApp.Service;

namespace TestApp.Platforms.Windows
{
    public class WindowsDeviceNameService: IDeviceNameService
    {
        public string GetDeviceName()
        {
            return "Windows Device";
        }
    }
}
```


### プラットフォーム固有のコード Android

``` ［プロジェクトディレクトリ］/Platforms/Android/AndroidDeviceNameService.cs
using TestApp.Service;

namespace TestApp.Platforms.Android
{
    public class AndroidDeviceNameService: IDeviceNameService
    {
        public string GetDeviceName()
        {
            return "Android Device";
        }
    }
}

```

### 名前空間を定義する
直接viewで、名前空間を定義してもいいですが、直下にある_Imports.razorに名前空間を入れてあげると、viewで定義する必要はなくなるので、_Imports.razorに書きます。

``` _Imports.razor
//省略
@using TestApp.Service
```

### viewで表示
``` Index.razor
@page "/";
@inject IDeviceNameService DeviceNameService;
<p>デバイス名: @DeviceNameService.GetDeviceName()</p>

```

# MAUIのメモ
 Maui+blazorのメモを書きます。

## Maui+blazorとは何なのか？

MAUIはC#であらゆるプラットフォームのアプリを作成できるクロスプラットフォーム フレームワークです。
ただ、従来はxmlをベースにしたxamlで記述しないと行けないのでweb屋には取っつきづらいところが有りました。
(自分もhtmlだったらcssちょっと変更するだけで見た目変更できるのになって部分があってxamlはモヤモヤしてしまいました。)

Maui+blazorは何のかというと表示部分はhtmlで書きながらロジックはMAUI(C#)でかけるので技術になります。




## Maui+blazorとcordova比較してMaui+blazor魅了
htmlベースでかけるならcordova(monaca)で良いんじゃないのとなります。
自分も当初そう思いました。

WEBの延長線上のアプリであれば(ニュース系のアプリなど)、そうでしょうがプラットフォーム固有の機能を呼び出すアプリの場合はcordovaでは、kotlinやjava、iosであればswiftでそれぞれ書かなければ行けません。
（プラットフォーム固有の機能に関してはプラグインとして提供されていますし、monacaであれば、取っつきづらいコマンドを入力せずに、guiからプラグインをインストールして呼び出せます。
ただ、少し挙動を変更したい、トリッキーなことをしたい場合は先に述べたように、それぞれの言語でコードをかかければ行けません）

Maui+blazorの場合はC#でプラットフォーム固有のコードを書きつつ表示部分はhtmlでかけるというメリットがあります。
【aws cli】バージョニングが有効なS3バケットの削除方法

S3バケットのバージョニングが有効な場合、S3バケットを削除しようとしても失敗してしまいます。

そのためのコードをメモ代わりに記載しています。

※下記の例では、S3バケット名は`bucket-name-sample`としています。

```sh:deleteS3.sh
#!/usr/bin/env bash

# バケット内のオブジェクトを削除
aws s3api delete-objects --bucket bucket-name-sample --delete "$(aws s3api list-object-versions --bucket bucket-name-sample | jq '{Objects: [.Versions[] | {Key:.Key, VersionId : .VersionId}], Quiet: false}')"

# S3バケットを削除
aws s3 rm s3://bucket-name-sample --recursive
```

これでS3バケットの削除が成功します。
ABC317回答メモ

0.はじめに
　A、Bは快調にACをもらえましたが、Cで大ブレーキ。
　結局ABしか解けない結果でレートも下がり666に。
　縁起も悪いし8月は低迷しています・・・。
　あと、新ジャッジになったせいか、若干回答から結果が出るまでの
　時間が長くなったような・・・。

1.A - Potions
　A問題にしてはややこしいな・・・と思いつつ、まぁ
　薬情報が昇順なので
　ループを回して条件を満たした段階でexitすることで
　すんなりACでした。

　https://atcoder.jp/contests/abc317/submissions/44939741

2.B - MissingNo.
　問題は一見複雑でしたが
　ソートが使えれば簡単な問題でした。
　リストをソートして頭から順にみていき、
　前の数値との差が1でない時
　抜けている数値となりますので
　前の値+1を出力して終了としました。

　https://atcoder.jp/contests/abc317/submissions/44946962

3.C - Remembering the Days
　最近DFS問題も慣れてきたので、何とかなるかと挑戦。
　例題はクリアできたので、提出したところ、TLE×5。
　なんとかTLEを外そうと四苦八苦してましたがあえなく時間切れ。
　変数を関数内で持ち越せれば何とかなりそう・・・と思い
　global設定をしようとしたけどうまくいきませんでした。

　翌日解説を見ると、globalの宣言の仕方が間違っていたことが
　わかり、正しい書き方をしたところACとなりました。
　いままで、def～入力～メイン処理
　的に書いていたのですが
　入力～変数宣言～def(def内でglobal宣言)～メイン処理
　と書くことでglobal宣言できることを学べました。
　試験中にググれば行けたかもなと若干の後悔。

　https://atcoder.jp/contests/abc317/submissions/44988673

4.D - President
　Cが難しかったので、ちらっと見ましたが
　これはDPと思い、Cに戻りました。

　試験後頑張ろうと考えましたが全く解法が分からず解説を見たところ
　逆側から埋めていくタイプのDPという変則的？な方法で
　こんなやり方もあるんだなと勉強になりました。

　https://atcoder.jp/contests/abc317/submissions/44989441


以上
Vue3にESLintとPrettierを導入する

# はじめに
チーム開発を意識して開発できるようにESlintとPrettierを導入してみました。

# 環境
MacBook Pro intel 2020
macOS Monterey バージョン12.6
Node.js 18.7.1 
Vue 3.3.4
npm 9.8.1


## ESlintのインストール
JavaScriptの静的解析ツールであるESlintと、VueとPrettierに必要なプラグインとパッケージもインストールします。

**eslint**: デフォルトのESlint
**eslint-plugin-vue**: ESlintのプラグイン、Vueをサポート
**eslint-config-prettier**: PrettierとESLint間のスタイルルールの競合を解消

```bash
npm install --save eslint eslint-plugin-vue eslint-config-prettier
```

## Prettierのインストール
JavaScriptの自動フォーマッターであるPrettierをインストールします。
```bash
npm install --save-dev prettier
```


## ESlintの設定ファイル
手動で設定ファイルを作成します。私はYAML形式で作成しました。
rulesにルールの上書きが可能です。今回は最低限必要そうな設定のみ記述しています。


```yml:.eslintrc.yml
extends:
    # eslintデフォルト推奨ルール
  - 'eslint:recommended'
    # vue3推奨のルール
  - 'plugin:vue/vue3-recommended'
    # prettierのルール
  - 'prettier'

env:
  browser: true
  es2021: true
  # setup関数内でのコンパイラマクロをサポート
  vue/setup-compiler-macros: true

parserOptions:
  ecmaVersion: 12

rules: {}
```

## Prettierの設定ファイル
手動で設定ファイルを作成します。私はYAML形式で作成しました。
自動フォーマットのルールを記述します。

```yml:.prettierrc.yml
printWidth: 150
tabWidth: 2
semi: false
singleQuote: true
trailingComma: 'all'
endOfLine: 'lf'

```

## スクリプトの記述
スクリプトを記述します。拡張子jsとvueがスクリプトの対象です。

```json:package.json
{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "format": "prettier --write 'src/**/*.{js,vue}'",
    "lint": "eslint --fix 'src/**/*.{js,vue}'",
    "fix": "npm run format && npm run lint",
    "test": "jest"
  },
  "dependencies": {
  },
  "devDependencies": {
  }
}
```

下記のコマンドでPrettierとeslintが実行されます。

```bash
npm run fix
```


# あとがき
当たり前ですがfixしなければスクリプトは実行されません。commit前にfixするようにpre-commitを設定するのが良いと思います。

### 参考

https://qiita.com/soarflat/items/06377f3b96964964a65d

https://zenn.dev/kohski/articles/eslint-prettier-integration

https://zenn.dev/crsc1206/articles/d92548257fb445
AVX関連の用語集（自分用）

# 用語集
## 再生性
同じ確率分布を持つ2つの独立な確率変数の和は同じ確率分布を持つこと。再生性を持つ確率分布として、二項分布、ポアソン分布、正規分布などがある。（これ以上の深入りはしない）

## GMP（GNU MP）
(GMP) ライブラリは、整数、有理数、浮動小数点数に関する任意精度の演算を行うための、C で書かれた高移植性ライブラリ

## MPFR
(GNU Multiple Precision Floating-Point Reliably：高精度浮動小数点) は、GMP に基いた、任意精度浮動小数点(多倍長浮動小数点)演算ライブラリ。
C99 に含まれるすべての数学関数を多倍長でサポートしている。

## QD
D型　52bitの有効精度を保持（Double型）
DD型 106bitの有効精度を保持
QD型 212bitの有効精度を保持
AVX2 256bitベクトル
AVX-512F　512bitベクトル

## SIMD命令
有益な記事
https://www.isus.jp/products/c-compilers/compiler_part1/

## コンパイラによる計算時間の違い

## エリアシングの問題

## インラインアセンブラ
主にC言語やC++などで書かれたプログラムの中にアセンブリ言語によるプログラムを埋め込むことができるようにする、コンパイラの機能である

pythonでもできる？

## LAPACK/BLAS
https://www.r-ccs.riken.jp/wp/wp-content/uploads/2020/09/nakata190523.pdf


## ANSI C
標準Cともいう。C言語の標準の総称。

## シリアル計算
並列しない計算。並列計算の逆

## 

AMXはSIMD命令セットの総称。
AMXのSIMD命令セットを用いる為に、各レジスタを2Dタイルとして捉えている？




命令によってどこまでをひとくくりのレジスタにするか決めている？

”””重要文”””
XMM と呼ばれる 128 ビットレジスターには、複数のデータを格納できます。単精度浮動小数点データであれば、4 つのデータを格納することができます。データ要素を複数パックして一回の演算で処理することをベクトル演算、128 ビットレジスターの1つのデータ要素しか利用しない場合をスカラー演算と呼びます。当然ベクトル演算を行ったほうが効率良いわけです。


命令をして次の命令が行われるまではクロックサイクル時間で決まっている。
つまり、命令数は少ない方がいい。
ベクトル演算は一度の命令で、スカラー演算より多くの演算を行える。
ベクトル演算を増やした方が得。

コンパイラ（高級プログラミング言語からアゼンブリ言語への変換）

intel for pytorchの関数はコンパイラがAMXの命令セットに変換してくれる。
そのようにコンパイラを設計した？

tensolfrow、pytorchからしかAMXを使えないのは、コンパイラを設計する際にtensolfrow,pytorchの関数のみを

C言語+AMXの命令セットで記述

最適化とは、プログラムをアゼンブリ言語に変換した際に、アゼンブリ言語の命令数を小さくしていく事　
最適化の方法としては、
・AMX命令を多く使う。
・データを2Dタイルの大きさに事前に加工しておく。
・インラインアゼンブラを書く
・組み込み関数を使う。

組み込み関数　
・・組み込み関数とは、コンパイラーが提供する SIMD 命令に対応した関数形式の命令群

速度検証の記事
https://qiita.com/T-STAR/items/d8f60e1ec72f7193b32b
【Java・学習ログ⑦】オブジェクト指向の基本


教本に沿ってやってみたシリーズ、『第７・８章』です。

≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ


## ■オブジェクト指向

ソフトウェア開発における部品化の考え方のこと。①〜⑥までのプログラミング手法は手続型と呼ばれている。実行する手順毎にクラス分けしていくようなイメージ。オブジェクト指向の考え方では「物」や「登場人物」毎にクラスを分割し、それぞれに**責務** を割り当てる。

与えられる主な役割は<ins>行動責任</ins>,と<ins>情報保持責任</ins>に分類される。
このような責任を果たすために、オブジェクトは『属性』と『操作』を持っている。

##### ・属性
　その登場人物に関する情報を覚えておく箱
##### ・操作
　その登場人物が行う行動や動作の手順

##### ・インスタンス
Javaではオブジェクトそのものを定義できない。①クラスを定義をし、②そのクラスに基づいてオブジェクトを生成する。クラスから生成された仮想世界の中で活躍するオブジェクトのことを厳密に示したいとき、インスタンスという用語を用いる。
「クラス図」という設計図のルールに準じてプログラムを書いていく。

[クラス名]勇者
[属性]名前/HP
[操作]戦う/眠る/座る/転ぶ/逃げる

```java
public class Hero {

　　//【属性】変数宣言を記述。
		String name; 
		int hp;

    //【操作】　
		public void attack() {…}
		public void sleep() {…}
		public void sit(int sec) {…}
		public void slip() {…}
        public void run() {…}
}
```

【属性】…クラスブロック内に宣言された変数をJavaでは**フィールド**という。
フィールド宣言と同時に値を代入することも可能。
また、先頭にfinalをつけ書き換え不可能な定数フィールドにすることもできる。

```java
final int LEVEL = 10;
```
【操作】操作を定義するには下記の４つを考える必要がある。
・操作の名前
・操作するときに必要な情報の一覧
・操作の結果として指示元に返す情報
・処理内容

```java
//Heroクラス内にメソッドを代入。
public void sleep(){ //名前
    this.hp = 100;
    Sytem.out.printoln(this.name + "は、眠って回復した！");
```

##### ・this
自分自身のインスタンスを指す変数。

##### ・メンバ
フィールドとメソッドの総称。

##### ・クラス型変数
データ型、参照型のほかクラス定義によって使える型。int型やString型と同じように準備し、インスタンスを代入することができる。
```java
Hero h;
```

## ■インスタンスの利用方法

前述で定義したHeroクラスを動かすためには当然Mainクラスが必要になる。
```java
public class Main {

	public static void main(String[] args) {
		
		//１、Heroクラスからインスタンスを生成し、変数に代入。
        //※生成には「new」を使う。
		Hero h = new Hero(); 
		
		//２、フィールドに初期値を設定
		h.name = "ヤマト";
		h.hp = 100;
		System.out.println("勇者" + h.name + "が誕生した。");
		
		//３、メソッド呼び出し
		h.sit(5);
		h.slip();
		h.sit(25);
		h.run();

	}

}
```
【実行】
```java
勇者ヤマトが誕生した。
ヤマトは、5ポイント回復した！
ヤマトは、転んだ！
5のダメージ！
ヤマトは、25ポイント回復した！
ヤマトは、逃げ出した！
GAMEOVER
最終HPは125でした
```

<br>
<br>
今回は基本理解に努めました。
RAM容量の足りないマシンで大量のデータを処理しようとして／tmpが一杯になった時の対処法

RAM容量の足りないマシンで大量のデータを処理しようとして/tmpが一杯になった時の対処法。
/tmpを外部ストレージに移す。

/etc/fstabに、

```
LABEL=OtherDisk /tmp ext4 defaults 0 0
```

と書く。
普通、/tmpはRAM上に取られるので、こうすると遅いが、とにかく大量のデータを処理しなければならないときに使える方法である。
"libtiff dot org" is dead. (2004年から2024年1月までね!)

■ 追記(2024/2/18)
=================
関係者のご協力でlibtiff orgのコントロール権は復活できたとのことです！ありがとうございました！

https://qiita.com/hon_no_mushi/items/4113f5ddf0d90c19a2ba


TL;DR
======
libtiffの配布元URLは、libtiff.gitlab.io/libtiff/ だよ、気を付けてね！特に昔からやってる人は...

（逃げ）一応、wikipediaの記載が正しいはず、で書いているので、間違ってたら謝罪して訂正いたします。というか、どこに「最新の」正しい情報があるの…（大困惑）

これを書いた人
=============
社内失業中の元組み込み系プログラマー。

あなたのlibtiffは、どこからダウンロードしましたか？
===============================================
OpenCVのコンパイルなどで、tiff形式のファイルを扱うならば、libtiffライブラリを使う、という機会も少なくないだろう。ええ、きっとたぶん。

所で、libtiffの配布元ってどこですかね？ **libtiff dot org** ？いえいえいえいえ、実は違うのですよ

実はここにリスクが・・・！！

wikipediaを見てみよう
=====================
まずはwikipediaを見てみよう。

日本語
------
https://ja.wikipedia.org/wiki/LibTIFF を見ると・・・おや？libtiff dot orgが無い。

```
公式サイト	http://www.simplesystems.org/libtiff/

外部リンク
Home Page #1: http://www.simplesystems.org/libtiff/
Home Page #2: https://libtiff.gitlab.io/libtiff/
Home Page #3: http://libtiff.maptools.org/
```

英語
----

```
Website	libtiff.gitlab.io/libtiff/

External links
- Official website (https://libtiff.gitlab.io/libtiff/)
```

実は英語版のwikipediaには細かめに経緯が記載されている。

https://en.wikipedia.org/wiki/LibTIFF

> Website hijacking
> Around January 2004, the original LibTIFF website had been hijacked, after it had disappeared in September 2003 due to ISP problems.[7][8] The libtiff dot org site contains a very outdated mirror of the real site, and much of the information contained therein is incorrect, including the current version number, authors, mailing list address, and the CVS information.
>
> In September 2016, the LibTIFF maintainers lost control of remotesensing.org/libtiff/,[9] which had been the main site since 2003.

> ウェブサイトの乗っ取り
> 元の LibTIFF Web サイトは、ISP の問題により 2003 年 9 月に消滅した後、2004 年 1 月頃にハイジャックされました。[7][8]。 libtiff dot org サイトには実際のサイトの非常に古いミラーが含まれており、現在のバージョン番号、作成者、メーリング リストのアドレス、CVS 情報など、そこに含まれる情報の多くが間違っています。
>
> 2016 年 9 月、LibTIFF の管理者は、2003 年以来メイン サイトであった Remotesensing.org/libtiff/[9] の制御を失いました。


ということで、まとめるとこうなるわけですよ。

| No. | URL                    | 有効?     |
|----:|:-----------------------|:----------|
|   1 | libtiff dot org        | NG!(2004) |
|   2 | remotesensing dot org  | NG!(2016) |
|   3 | simplesystems.org      | OK        |
|   4 | libtiff.gitlab.io      | OK        |
|   5 | libtiff.maptools.org   | OK        |

偽公式サイトが存在するリスク
=============================
さて、ではここで「どんな実害があるのか？」と疑問を抱く人もいる。

実はこれが非常に恐ろしいわけですよ！

- 古いバージョンのlibTIFFを現在も、libtiff dot orgやremotesensing dot で配布している。
- この古いバージョンのlibTIFFに、こっそりアレなモジュールが仕込まれたら？
  - 例えば、libtiffで生成・展開した画像をこっそりアレなサイトに転送... 
- ダウンロードした本人は「正しいバージョン」だと思い込んでいるから、問題発覚も遅れる。

これは極端な例ではあるが、しかしこういうリスクは否定しきれない。

まとめ
======
libtiffの配布元URLは、libtiff.gitlab.io/libtiff/ だよ、気を付けてね！特に昔からやってる人は...
NodePortServiceを適用したのにlocalhostで接続できない場合の対処方法

minikube環境を構築して、遊び始めている。

https://qiita.com/LittleBear-6w6/items/9021b1d7a106a3760472

そこで困ったことが発生・・・
:sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile:

**`service.yaml`で`NodePortService`を設定しているのにも関わらず`localhost`で通信できない・・・**
```bash:curlを実行した際のイメージ
$ curl http://localhost:xxxx/test
***接続が拒否されました***
```

:sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile:

# 解決策
:warning:**minikubeを使用していて、`driver`に`docker`を使用している場合について検証しています**

`driver`に`docker`を使用している場合は、localhostではDockerネットワークにアクセスできないためDockerネットワーク上に構築したノードにアクセスできない。

:congratulations:***ノードの`IP`アドレスを調べて（`minikube service list`）、そのIPアドレスに対してアクセスすることで解決できます。***

この調べたIPアドレス宛の通信はトンネル化されていてDockerネットワーク上に構築されたノードにアクセスできるみたい。

```bash:Dockerネットワーク上のノードへアクセス
$ minikube service list

|----------------------|---------------------------|--------------|---------------------------|
|      NAMESPACE       |           NAME            | TARGET PORT  |            URL            |
|----------------------|---------------------------|--------------|---------------------------|
| default              | echo                      | http/80      | http://xxx.xxx.xx.x:YYYYY |
|----------------------|---------------------------|--------------|---------------------------|

$ curl http://xxx.xxx.xx.x:YYYYY 
Hellow, world!
```

# 参考サイト
下記サイトを参考にしました。

https://minikube.sigs.k8s.io/docs/commands/service/

https://kubernetes.io/ja/docs/setup/learning-environment/minikube/

https://zenn.dev/sugasuga/articles/08c4f3b1060862
LibreOffice で Python のデバッグ環境を試す

LibreOffice を Python で開発しようとしてきました。

> 「LibreOffice マクロを Ubuntu + Python で作る」
https://qiita.com/nanbuwks/items/77d5707b9a2507972676
「LibreOffice マクロ：Pythonでのプログラム例集」
https://qiita.com/nanbuwks/items/1f25e8839089eaefd6d4
「Python で LibreOffice 拡張をステップバイステップで作ってみる」
https://qiita.com/nanbuwks/items/53861bac26c521c4b549


LibreOffice のマクロなどの標準的な開発言語は BASIC。この場合、備え付けの IDE や デバッガなどもある。

しかしながら Python で開発しようとした場合、そういった環境は入っていない。

# LibreOffice + Python で極楽?

Python だからお気楽に書けるのかな・・・・Python の開発状況はかなり昔から可能ぽいし、ぐぐれば出てくるよね・・・

実際は・・・

- ドキュメントが不足していてサンプルプログラム頼り
- だけれども過去のサンプルプログラムの多くは謎のエラーを吐いて止まってしまう
- そんなときの出力メッセージは間に挟まっている LibreOffice レイヤから
- メッセージは何の役にも立たない


という地獄みたいな状況になる。


なのでせめてデバッガが必要だなあ。今回はデバッガ環境を作ることにチャレンジ。
# 環境

環境
- Ubuntu 22.04 LTS
- LibreOffice Ubuntu package version: 1:7.3.7-0ubuntu0.22.04.3
- libreoffice-script-provider-python パッケージインストール済み


# APSOをインストール

Python のデバッグ環境は、LibreOffice 拡張で実現します。

APSO (Alternative Script Organizer for Python)  、Python 用の代替スクリプト オーガナイザー
だそうです。

APSO 環境は、Ubuntu などでは`libreoffice-script-provider-python`パッケージをインストールしていないといけないそうです。
今回は  
「LibreOffice マクロを Ubuntu + Python で作る」https://qiita.com/nanbuwks/items/77d5707b9a2507972676
 にてインストール済みでした。

APSO パッケージはこちらからダウンロード、
https://extensions.libreoffice.org/en/extensions/show/apso-alternative-script-organizer-for-python
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1dab39c5-af0f-8493-d3e6-0e3db12c3571.png)

「ツール」-「拡張機能マネージャ」でインストールし、LibreOffice を再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6ea6b762-f561-f845-4987-34cc53033259.png)

# ASPOを使ってみる

再起動すると、
「ツール」-「マクロ」に-「Pythonスクリプトの管理」が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2c66017e-ef4c-a31d-890f-6e297083e22b.png)

APSOウィンドウから、「デバッグ」を選ぶと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/68733aeb-039e-ce67-7563-4da42137748b.png)

Python ソースレベルデバッガが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/aad0277a-a9af-9e6f-95ba-d5120cf86652.png)
Power Automateで複数の項目を取得してるが全件取得できない問題

# 初めに
今回は、power automateにて【sharepointの複数の項目を取得】コネクタを使用する上での注意点をまとめる
※環境としては個人で無料版を払い出している為、会社には関係なし

# sharepointの複数の項目を取得とは？
* 特定のサイト内にある、リストやドキュメント情報をまとめて取得できる。
 * 取得階層もネストをYes Or No で選択可能
 * クエリを書くことによって、範囲内の任意の値にフィルタリングして値の取得可能

公式リファレンス>>https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/guidance/working-with-get-items-and-get-files#decide-if-you-are-working-with-lists-or-libraries

# やりたいこと
sharepointコネクタ内、複数の項目を取得を使用し、sharepointのドキュメントプロパティを取得する

○使用コネクタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/205f3598-3ede-ca00-7a75-79221ed89fd7.png)

○取得したい項目
　　今回はエクセルファイル254件が格納されている情報を全て取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/234f6658-2a11-8cde-416d-7775bd1b7ef6.png)



# 単純に取得のみしてみる
テスト結果は成功
出力内容のクリックしてデータをダウンロードを押すと、詳細プロパティを確認できるのでクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/886a0cde-9305-a197-a240-5677b3b601f5.png)


○取得した結果
  ユニークな値であるIDで検索をかけてみる。と検索結果として100件しか取得できていない。
  テスト結果は成功なので、問題なさそうだが総数取得でていない為実質失敗
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/a5650d4f-97af-e1bb-413b-836e67a4d6f6.png)

# 何故？
調べて見ると、特に何も設定をしなければデフォルトで取得できるのは100件のみらしい。。。

# 対策
コネクタ自体の設定をいじってみる
1.設定を開き、改ページをオン。
2.しきい値を100000に設定。
※入力可能な上限閾値が100000

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/9b720014-bac8-c748-3c76-90384b0c7afd.png)


# 対策後再度取得
254件取得できている。OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/dec704fd-63e8-c37a-ff34-3e9d836b19b2.png)

# まとめ
デフォルト設定のまま起動しテストが成功すると、正直気づきにくい。。。
今回僕はPower AppsからPower Automateに値を渡し、その返り値を使用してアプリ上にドキュメントを表示する構成としていた為気付いたが、そうでないと気づきにくいだろう。
全部のデフォ設定をmicrosoftに変えていただくか、注意書きが欲しいと思った笑
VSCodeのfomatでforやifの後にくる始めかっこの位置を新しい行にしたくない[C++]

## 結論
`C/C++: Generate EditorConfig contents from VC Format settings`を実行すると`.editorconfig`が作成され、そのデフォルト設定によってforやifの後にくるブロックの始めかっこの位置が新しい行にならなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802335/20b8b74d-362d-a748-be5e-e50d749cafeb.png)

## 前提
以下のextensionが導入されていること

https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools

## 比較

### フォーマット前
```sample.cpp
#include <bits/stdc++.h>

using namespace std;

int main(){
  int n;
  cin>>n;
  if(n%2==0){
    cout<<"Even number!"<<endl;
  }else{
    cout<<"Odd number!"<<endl;
  }
  return 0;
}
```

### フォーマット後(.editorconfig作成前)
```sample.cpp
#include <bits/stdc++.h>

using namespace std;

int main()
{
  int n;
  cin >> n;
  if (n % 2 == 0)
  {
    cout << "Even number!" << endl;
  }
  else
  {
    cout << "Odd number!" << endl;
  }
  return 0;
}
```

### フォーマット後(.editorconfig作成後)
```sample.cpp
#include <bits/stdc++.h>

using namespace std;

int main() {
  int n;
  cin >> n;
  if (n % 2 == 0) {
    cout << "Even number!" << endl;
  }
  else {
    cout << "Odd number!" << endl;
  }
  return 0;
}
```

## 備考
- `.editorconfig`とはワークスペースレベルでコードのformat形式を指定するための設定ファイルであり、デフォルトからいい感じの設定になっていますが、必要に応じて以下の書式規則のガイドを見ながら設定を調整しても良さそうです。

https://learn.microsoft.com/ja-jp/visualstudio/ide/cpp-editorconfig-properties

- Settingsの`C_Cpp.vcFormat`配下にformatに関する設定項目があるようで、そちらでも同様に設定が可能なようです。ただしこちらよりも`.editorconfig`で設定した内容の方が優先されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802335/9d0709e7-d586-a6d2-0ee6-6e8662638843.png)
【PowerShell】複数のファイルに対して効率よくtarを実行する方法

# はじめに
Windowsでも地味にtarが使えます。
ただ、tarについてはUNIX系の記事が多いためあまりPowershellを前提とした記事が少ないと思います。

Powershellとtarを組み合わせて効率的な処理していくtips集のようなものを備忘として残していきたいと思います。

## カレントディレクトリに存在する複数のファイルとディレクトリをアーカイブ・圧縮
```powershell
$target=gci ; for($i=0; $i -lt ($target).Length ; $i++){tar cvzf test.tgz $target.name}
```
対象となるファイルが存在するディレクトリに移動して、
このワンライナーを実行することでカレントディレクトリ内のファイルをアーカイブ・gzip圧縮します。

尚、アーカイブファイル名は暫定的に"test.tgz"としています。

## カレントディレクトリに存在する複数のtar.gz(tgz)を解凍するワンライナー
```powershell
$target=gci ; for($i=0; $i -lt ($target).Length ; $i++){tar xvzf $target[$i]}
```
カレントディレクトリ内の複数のアーカイブファイルに対して解凍を行う場合に使用します。
解凍したい複数のアーカイブファイルを一つのディレクトリに纏めておき実行するといったケースで使えます。

注意点としては、tarの仕様として解凍先に同名のファイルやディレクトリが存在する場合に警告無しで上書きしてしまう点です。

事前に解凍後のファイル名と同名ファイルが存在するかの判定処理をいれるとよりセキュアになりますね、、、

### 再帰的に解凍させる
```powershell
$target=gci -Recurse
for($i=0; $i -lt ($target).Length ; $i++){
    if (-not ($target[$i].psiscontainer)) {
        tar xvzf $target[$i].FullName
        }
    }
```
複数のディレクト配下にアーカイブファイルが存在するといったケースで使用します。

さすがにワンライナーでは分かりづらくなるためスクリプトっぽく書きました。

# おわりに
以後、必要に応じてコマンドの追加・修正など行っていこうと思います。
NiceGUIでページの状態がユーザ間で共有される問題の対処


## 環境
- Python 3.10
- NiceGUI 1.3.11

## NiceGUIの概要
[NiceGUI](https://nicegui.io/)を使うと、簡単なPythonコードでWebのGUIを提供できます。類似のツールである[Streamlit](https://streamlit.io/)に影響を受けていると[公式ドキュメントに書いてあります](https://nicegui.io/#why)が、Streamlitほど抽象度が高くなくWeb開発の要素が求められる反面、柔軟なアプリケーションを構築しやすい印象です。

## 現象
NiceGUIで「そのまま」作ったページの状態は、デフォルトではすべてのユーザで共有されます。
文字で説明すると分かりづらいですが、テキスト入力フォームを作って適当な文字列を入力したあと、ブラウザのウィンドウをふたつ開いてみると、状態が共有されてしまっていることがわかると思います。

```python
from nicegui import ui

ui.input()

ui.run()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/3bdde196-8bff-a984-240e-4ba44c2f37fd.png)

これを避けるには`page`デコレータを使います。

```python
from nicegui import ui

@ui.page('/')
def main():
    ui.input()

ui.run()
```

こうすることで、ページの状態が共有されずユーザごとにプライベートになります。こちらのほうがフォームとして一般的な動作だと思います。

これは[公式ドキュメントのPagesのところ](https://nicegui.io/documentation#auto-index_page)に書いてあります。