OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu24.04にSIPpを構築する手順


# はじめに
ここ1年くらいのSIPpの構築用の記事が見つからなかったので忘備録代わりに記載します。

## 環境

| 名称 | バージョン |
| :-- | :-- |
| OS | Ubuntu 24.04 LTS |  
| SIPp | v3.7.2-58-g241f5bd-TLS-SCTP-PCAP-SHA256. |  
| sippのソースコードのDL先 | ~/projects/sipp |

## 構築手順

下記の順で構築していきます。

> 必要なパッケージのインストール  
↓  
ソースコードのDLとビルド  

### 必要なパッケージのインストール

```:パッケージインストール
sudo apt install -y pkg-config dh-autoreconf ncurses-dev build-essential libssl-dev libpcap-dev libncurses5-dev libsctp-dev lksctp-tools cmake libgsl-dev 
```

### ソースコードのDLとビルド

ダウンロードするディレクトリは適当に書き換えてください。

```:DL
mkdir ~/projects
cd ~/projects
git clone https://github.com/SIPp/sipp.git
cd sipp 
```

```:ビルド
cmake . -DUSE_SSL=1 -DUSE_SCTP=1 -DUSE_PCAP=1 -DUSE_GSL=1; make all
sudo make install 
```

### 確認

```:バージョンチェック
cd /
sipp -V
```

パスが通っていれば下記のような結果が返ってきます。

> SIPp v3.7.2-58-g241f5bd-TLS-SCTP-PCAP-SHA256.
>
> This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License as
 published by the Free Software Foundation; either version 2 of
 the License, or (at your option) any later version.
>
> This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
>
> You should have received a copy of the GNU General Public
 License along with this program; if not, write to the
 Free Software Foundation, Inc.,
 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
>
> Author: see source files.


## 終わりに
githubを確認すると`build.sh`による構築支援もあるようです。
こちらを使ってもいいかもしれません。  
また、`libgsl-dev`パッケージをインストールしてください。私はそこで躓きました。ubuntu24.04依存なのかもしれません。ネット上に転がっている構築記事にはこのパッケージへの言及がないので・・・。  

ところで、git-hubからソースコードをダウンロードするとき、どのディレクトリに保存するのが一般的なのでしょう？  
/opt派、/usr/local/bin派、~/派、~/projects派あたりは聞いたことがあるのですが、あまり統一されていない印象があります。  


## 更新履歴
2024-08-23 初版公開
LinuxOS ディスク容量調査・管理した件

# 前置き

こんにちは！
今回はLinuxの、デバイスの容量確認を行いたい時にさっと確認する方法をまとめます。

**<背景>**
Linuxサーバでツールを実行しようとしたところ、エラーが発生しました。

原因はディスク容量不足でした。
duコマンドを使って容量を確認することにしました。コマンドの意味とオプションについて、簡易的ですがまとました。

# コマンド実行
使用するコマンドは**du**コマンドを使います。

```
# 指定されたディレクトリ内のすべてのサブディレクトリやファイルの使用量をリストし全体のディスク使用量を表示する
du 

# 結果例
4       ./hp/tmp
8       ./hp
504     ./audit
---以下格納されているファイルおよびディレクトリ分表示---
・
・
・
```
オプション紹介
本記事では **-s -h** について紹介します

```
# -sについて
→指定したディレクトリまたはファイル自体の合計のみを表示
→Pathを指定しなければカレントディレクトリの容量を出力する

du -s

# 結果例
5740928 .
```

```
 # -hについて
 →出力結果を(KB, MB, GBなど）で表示します。
 →通常、du の出力はブロック単位で表示されますが、-h を使うとサイズが適切な単位で表示されます。

 dh -sh

 # 結果例
 5.5G    .
```

# 指定したディレクトリの容量を確認する

```
# /var/log/配下の各ディレクトリおよびファイル容量を確認する

du -sh /var/log/*

#結果例
.0K    /var/log/CertInstallTool
216K    /var/log/SkyProduct
4.0K    /var/log/alternatives.log
4.0K    /var/log/alternatives.log.1
4.0K    /var/log/alternatives.log.2.gz
4.0K    /var/log/alternatives.log.3.gz
4.0K    /var/log/alternatives.log.4.gz
・
・
```

:::note warn
**メモ**
・コマンドを実行するPathや対象のファイルによっては権限によって管理されている
→sudo コマンドを頭に付けるかroot権限で実行する

・*はワイルドカード
→logディレクトリ以下全てを対象にする意図でつける
:::

# ファイルの削除
容量が大きく不要ファイルは削除する
```
# ファイルを削除

rm /var/log/削除ファイル
```

# ファイルを圧縮
容量が大きく保存しておくファイルを圧縮し容量を抑える

```
# ファイルを圧縮
gzip /var/log/圧縮対象ファイル
```

:::note alert
**注意**
gzipを使って対象とする元ファイルは削除されます。

削除後.gz拡張子で圧縮されたファイルが生成されます。

実行前にcp コマンドを使てバックアップしておきましょう。
:::

# 該当ファイルの検索
一定の容量を超過したファイルはどんなファイルがあるのか調査する際に使えます。

```
# 100Mbyte以上のファイルを検索する

sudo find /var/log -type f -size +100M
```

:::note info
**参考**
・findコマンドで検索する
・探したい階層Pathを指定する
・typeオプションでファイルを指定する→f = ファイル
・検索対象のファイルの条件を決める
→size = サイズ
・サイズ容量を指定する
→100M(+をつけると以上、-をつけると以下)

:::


以上です。

Windowsではタスクマネージャーを起動して確認することが多いと思いますが、LinuxではCLIベースで確認していきます！
SQL 用語一覧表

自分用に一覧にしました:writing_hand:
追加する可能性あり

## SQL用語一覧
|　コマンド　　　　　|説明|
|:-:|:-:|
|CREATE DATABASE|データベースの作成|
|CREATE TABLE|テーブル作成|
|DROP DATABASE|データベース削除|
|DROP TABLE|テーブル削除|
|ALTER TABLE|テーブル構造の変更。テーブル名を指定して、サブコマンドと組み合わせて使用|
|ADD COLUMN|列の追加。ALTER TABLEと組み合わせる|
|DROP COLUMN|列の削除。ALTER TABLEと組み合わせる|
|MODIFY COLUMN|列の変更。ALTER TABLEと組み合わせる|
|RENAME COLUMN|列名の変更。ALTER TABLEと組み合わせる(一部DBで異なる構文が必要)|
|ADD CONSTRAINT|制約の追加。ALTER TABLEと組み合わせる|
|RENAME TO|テーブル名の変更。ALTER TABLEと組み合わせる|
|SELECT |データの選択|
|UPDATE| データの更新|
|ORDER BY|データの並び替え|
|JOIN|テーブル結合|


## 制約
|制約|説明|
|:-:|:-:|
|PRIMARY KEY|主キー。テーブル一意でNULL値を許さない|
|UNIQUE|列の値がすべて異なる(重複不可)。NULL値の格納は可能|
|NOT NULL|NULL値を許さない|
|CHECK|指定された条件式に対してtrueの場合のみ格納|
|FOREIGN KEY|外部キー。別のテーブルの主キーに関連付けることで整合性を確保|



## 条件
|条件　　　　　　　|　説明　　　　　　　　　|
|:-:|:-:|
|=|等しい|
| != または <>|等しくない|
| >|より大きい|
| >=|以上|
|<|より小さい|
| <=|以下|
|BETWEEN|指定した範囲内の値を持つか|
|IN|指定した複数の値と一致するか|
|LIKE|パターンに一致するか。完全一致、一部など指定可能|
|IS NULL|NULL値であるか|
|IS NOT NULL|NULL値でない|

## 文字列型
|データ型　　　　|説明|
|:-:|:-:|
|CHAR(n)|固定長の文字列。指定した長さ'n'で埋められる。|
|VARCHAR(n)|可変長の文字列。指定した長さ'n'までの文字列。0～255文字|
|TEXT|大きなテキストデータ。長さに制限がない。長い記事や詳細な説明。最大65,535文字|
|TINYTEXT|非常に短い文字列。短いラベルや説明。最大255文字。|
|MEDIUMTEXT|中程度の長さのテキスト。詳細なコメントや説明。最大16,777,215文字。|
|LONGTEXT|非常に長いテキストデータ。大規模な文章や長いログ。最大4,294,967,295文字。|
|BLOB|バイナリデータ。テキストのように扱うこともできる。画像やファイルも格納できる。|


## 日付・時刻
|データ型|説明|保存形式|例|
|:-:|:-:|:-:|:-:|
|DATE|日付を扱う。年月日のみ保存|'YYYY-MM-DD'|'2024-01-01'|
|TIME|時刻を扱う。時間、分、秒を保存|'HH:MM:SS|'10:10:00'
|DATETIME|日付と時間|'YYYY-MM-DD HH:MM:SS'|2024-01-01 10:10:10
|TIMESTAMP|タイムゾーンに依存する日付と時刻を扱う。|'YYYY-MM-DD HH:MM:SS'|2024-01-01 10:10:10
|YEAR|年だけを扱う|'YYYY'|'2024'|
Pythonによる行列と関数グラフの表示

## インストール
行列と関数グラフの表示するにあたり、pip installを実施する。
※インストールOSはWindows
```
# 行列やランダム関数に使うモジュール
py -m pip install numpy

# 関数グラフの表示に使うモジュール
py -m pip install matplotlib
```

## 配列操作
簡単に配列の操作についてまとめる
```python
def msg_split():

    _msg="aaa bbb ccc ddd eee fff ggg"

    msg = _msg.split()
    print(msg)           # 要素を表示
    print(msg[-1])       # 1番後ろの要素を表示
    print(msg[:2])       # 前から2つ目の要素まで表示
    print(msg[3:6:2])    # 前から3つ目から6つ目までを2つおきに表示
    print(msg[::-1])     # 後ろから要素を表示

msg_split()
```

```実行結果.
['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg']
ggg
['aaa', 'bbb']
['ddd', 'fff']
['ggg', 'fff', 'eee', 'ddd', 'ccc', 'bbb', 'aaa']
```

## 行列
行列の定義について
```python
import numpy as np 

print(np.array([[1, 2, 3], [4, 5, 6]]))
```

```実行結果.
[[1 2 3]
 [4 5 6]]
```

行列のファイル保存
```python
import numpy as np 

def data_array():
    data = np.random.randn(5)
    print(data)

    np.save('datafile.npy', data)

    data = []
    print(data)

    data = np.load('datafile.npy')
    print(data)
    
data_array()
```

```実行結果.
[-0.61221229 -0.31161491  0.28488986 -0.32403834 -1.59200472]
[]
[-0.61221229 -0.31161491  0.28488986 -0.32403834 -1.59200472]
```

## 関数グラフの表示
グラフを表示する
```python
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1)
x = np.arange(10)
y = np.random.rand(10)

plt.plot(x, y)
plt.show()
```
### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/237169b8-a8cb-0216-4316-1c4fdeee8110.png)

関数 f2 = (x -w) x (x + 2) のグラフを表示する
```python
import numpy as np
import matplotlib.pyplot as plt

def f2(x, w):
    return (x - w) * x * (x + 2)

x = np.linspace(-3, 3, 100)

plt.plot(x, f2(x, 2), color='black', label='$w=2$')
plt.plot(x, f2(x, 1), color='cornflowerblue', label='$w=1$')

plt.legend(loc="upper left")
plt.ylim(-15, 15)
plt.title('$f_2(2)$')
plt.xlabel('$x$')
plt.ylabel('$y$')
plt.grid(True)

plt.show()
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/bdf0d85d-17b4-2dc5-4066-91370773b93f.png)

## 参考
https://www.amazon.co.jp/Python%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6%EF%BC%81-%E3%81%82%E3%81%9F%E3%82%89%E3%81%97%E3%81%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%BC%8A%E8%97%A4-%E7%9C%9F/dp/4798144983/ref=asc_df_4798144983/?tag=jpgo-22&linkCode=df0&hvadid=295706574430&hvpos=&hvnetw=g&hvrand=4428191077297899628&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9198447&hvtargid=pla-526453134436&psc=1&mcid=f067f3ffdf2d39fe9b35a00cdf293bc7
ranges::toを使って関数型っぽくコンテナからコンテナを作る

コンテナからコンテナを作る例として, 下記のような (フィボナッチ数列をメモ化を使って求める) コードがあるとする.
このコードでは `vector<optional>` を元にして, `optional` をはがした `vector` を作っている.

```cpp:C++23以前:
using std::vector;
using std::optional;

vector<int> fibo_wrapper(const int N) {
  // メモ化のための vector (メモ済かどうかを optional で表す)
  vector<optional<int>> memo(N + 1);
  // フィボナッチ数列をメモ化を使って求める (※中身は割愛)
  fibo(N, memo);

  // この関数の結果を格納する vector
  vector<int> results;
  results.reserve(N + 1);

  // optional をはがした結果を詰めていく
  for (const auto& o : memo) {
    results.push_back(o.value());
  }

  return results;
}
```

ここで, `ranges::to` (C++23) と `views::transform` (C++20) をつないだパイプラインを使うと, 下記のようにコンテナからコンテナを作れる.
一時変数 (`results`) や `for` 文がなくなり, 関数型っぽく書ける.

```cpp:C++23以後: 関数型っぽく
#include <ranges>
using std::vector;
using std::optional;
using std::views::transform;
using std::ranges::to;

vector<int> fibo_wrapper(const int N) {
  // メモ化のための vector (メモ済かどうかを optional で表す)
  vector<optional<int>> memo(N + 1);
  // フィボナッチ数列をメモ化を使って求める (※中身は割愛)
  fibo(N, memo);

  // optional をはがして返す (パイプライン)
  return memo | transform([](const auto o) { return o.value(); })
              | to<vector>();
}
```

# 参考

https://cpprefjp.github.io/reference/ranges/to.html



https://en.cppreference.com/w/cpp/ranges/to.html

https://qiita.com/skkzsh/items/910f8fa4526e1f3d5174

# 確認環境
```console
$ g++ -v
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: arm64-apple-darwin23.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```
【SharePoint×PowerApps】公開したのにアプリが更新されない

はじめまして、初投稿です！備忘録など気軽に載せていきます。
（初投稿がこんなニッチな内容でよいのか）

# 問題

SharePointのページ内に配置したアプリや、SPOリストのフォームのカスタマイズで作成したアプリを編集・公開しても、変更内容が反映されない

# 原因
どうもブラウザに溜まったSharePointのキャッシュが悪さをしているようです。
というのも、PowerAppsのテスト画面や別タブでアプリを開くと、キチンと公開できていました。
SharePoint上で表示した場合のみ、変更内容が公開されず、古いVerのものが公開されていました。


# 解決方法
キャッシュクリア！無事、解決しました！
私がアロー関数を理解するまで

# これは何？

非エンジニア向けにGoogleAppsScript(GAS)レクチャーを行なっています。プログラムが全くの初めての人を対象にしています。このレクチャーを卒業し、基本的なことが理解できるようになった人が「その次に知っておいたほうがいいこと」の一つに **配列の扱い** があるなと思いました。これを説明してみよう、、、


と思ったのですが、実務でよく使いそうな、`filter`, `map`, `find` について説明するには **アロー関数** を説明しないと話が繋がらないので、この記事では **アロー関数が存在しない世界線のJavaScriptを書いていた私が、アロー関数をどうやって理解したのか** を記述します。


# 対象者

* GoogleAppsScriptおよびJavaScriptでの基本構文は知っているレベル
* 具体的には [ケーススタディでしっかり身につく! Google Apps Script超入門](https://www.amazon.co.jp/dp/4297126273) を修了しているレベル


# 関数を変数/定数に代入できるのは知ってる？

```js
const num = 1;
```

のように、`num`という定数に`1`を代入できることは知っていると思いますが、

```js
const func = function greet(){
  console.log('おはよう！');
}
```

のように、`func`という定数に `greet`という関数 を代入できます。
下記を実行してみましょう。

```js:
function arrowFunc1(){
  const func = function greet(){
    console.log('おはよう！');
  }

  func();
}
```

```plaintext:実行結果
おはよう！
```

# 引数、戻り値のある関数ではどうなる？

続いて、引数を受け取り、戻り値のある関数を作ってみます。
下記の`x100`関数は1つの引数を受け取り、それを100倍した値を返します。

```js
function arrowFunc2() {
  const func = function x100(num) {
    return num * 100 ;
  }

  console.log(func(3));
}
```

```plaintext:実行結果
300
```

`return`した結果が `func`定数に代入されるわけですね。


ここまでで「定数に関数を代入し、その定数(=つまり関数)に引数を渡して実行する」ことができました。


# 無名関数

ここで上記の `arrowFunc2()` を見てみます。

```js
  const func = function x100(num) {
```

のように、関数に `x100` という名前をつけています。しかし`x100`という名前で関数を呼び出していません。 **名前をつけたのにその名前を使う機会がない** んです。

だったら名前、いらなくね？ということで、

```js
function arrowFunc3() {
  const func = function (num) {
    return num * 100 ;
  }

  console.log(func(3)); // 300
}
```

↓ここに注目。関数の名前がありません。
```js
  const func = function (num) {
```



なぜ関数に名前をつけるかというと、その名前を使ってその関数を呼び出す(実行する)ことがあるからです。今回の例だと関数は一度しか実行されず、他から利用されることがないので名前をつける必要がありません。


# アロー関数の登場

ここからが本題です。アロー関数を使って書いてみます。

```js
function arrowFunc4() {
  const func = (num) => {
    return num * 100 ;
  }

  console.log(func(3)); // 300
}
```

`arrowFunc3`との違いは

* `function` を消す
* 引数の後ろに `=>` を書く

です。 `=>` が矢印に見えるので アロー関数 と呼ばれます。たぶん。

記述量が減っていますね。(パッと見て認識できるかどうかは慣れの問題ですね...)


# アロー関数の省略形

## 省略ポイント1: 引数が1つの場合は`( )`を省略できる

下記のコードでは `func = (num)` ではなく `func = num` になっています。


```js
function arrowFunc5() {
  const func = num => {
    return num * 100 ;
  }

  console.log(func(3)); // 300
}
```

## 省略ポイント2: 関数の中身が1行の場合は `{ }` と `return` を省略できる

ここが最終形です！

```js
function arrowFunc6() {
  const func = num => num * 100;
  console.log(func(3)); // 300
}
```

もうね、パッとみて理解できるようになるには慣れるしかないです。

# 引数が複数の場合は？

引数が複数の場合は、引数部分の`( )`は省略できないため、下記のようになります。

```js
function arrowFunc7() {
  const func = (a, b) => a + b;
  console.log(func(1,2)); // 3
}
```


# 最後に


ここまで書いておいてアレですが、私は関数を作るときに

```js
const add = (a, b) => a + b;
```

のような書き方はしていないです。

```js
function add(a, b){
  return a + b;
}
```

って書きます。

こうしたほうが「functionだよ！」ってわかりやすいと思うんですよね...
みなさんはどうですか？私がトレンドに乗れてないだけかな...
pyzbarライブラリの使用で発生した"ImportError: Unable to find zbar shared library"エラーを解消

# 環境
Mac book Air 2023(チップ：Apple M2)
macOS  Sonoma 14.6.1
Python 3.12.4

# Errorの内容
<font color="red">pyzbarライブラリを使用して</font>バーコードやQRコードを読み取ろうとした際に、<font color="red">ImportError: Unable to find zbar shared library</font>Errorが発生した。
```python
   from pyzbar.pyzbar import decode 
    :
    ImportError: Unable to find zbar shared library
```

これが発生するのは、zbarというバーコード読み取り用の外部ライブラリがシステムにインストールされていないか、正しく認識されていないことが原因だということ。

一旦それぞれをアンインストールした上で、zbar次にpyzbarの順番でインストールしてみたが、全く解決しない中**GitHub**（ https://github.com/NaturalHistoryMuseum/pyzbar/issues/37 ）に以下のコメントがあり,これについてChat-GPTに確認してみた上で実施したところ<font color="red">Errorは解消した</font>ので記録しておきます。

(githubのコメント)
marrtinol commented on May 4, 2022
@SandeepKumarRudhravaram7215
This worked for me. Try for yourself.
（私の場合はこれでうまくいきました。自分で試してみてください。）
```python
%％ mkdir ~/lib
% ln -s $(brew --prefix zbar)/lib/libzbar.dylib ~/lib/libzbar.dylib
```

# Chat-GPTからの回答
## 手順
### ディレクトリを作成
最初に、~/libというディレクトリをホームディレクトリ内に作成します。これは、libzbar.dylibファイルのシンボリックリンクを格納する場所になります。
```python
mkdir ~/lib
```

## シンボリックリンクを作成
次に、libzbar.dylibへのシンボリックリンクを~/lib/libzbar.dylibとして作成します。シンボリックリンクを作成することで、pyzbarがlibzbarを見つけやすくなります。

```python
ln -s $(brew --prefix zbar)/lib/libzbar.dylib ~/lib/libzbar.dylib
```
このコマンドでは、brew --prefix zbarでzbarのインストールパスを取得し、そのパスにあるlibzbar.dylibを~/lib/libzbar.dylibとしてシンボリックリンクを作成します。

## 背景
この方法は、Pythonやpyzbarがlibzbarライブラリを探す際のパスに問題がある場合に特に有効です。シンボリックリンクを作成することで、ライブラリをより標準的な場所（例えば、~/libなど）で見つけられるようにします。

## 念の為
ついでに、万が一うまくいかなかった場合のリカバリーの方法についても確認したところ
『**もしこの手順がうまくいかず、元に戻したい場合は、以下の方法で簡単に元に戻せます。**」とのことなので記録しておきます。（私はうまく行ったので使ってません）
### シンボリックリンクを削除
シンボリックリンクを削除することで、元の状態に戻すことができます。

```python
rm ~/lib/libzbar.dylib
```
このコマンドを実行することで、**libzbar.dylibのシンボリックリンクが削除**されます。
### ~/libディレクトリの削除（必要な場合のみ）
~/libディレクトリが**空**であり、**他に使用されていない**と判断した場合は、次のコマンドで削除できます。
これらの手順で、元の状態に戻せます。
```python
rmdir ~/lib
```
もし中にの重要なファイルやリンクが残っている場合は、削除されません。本件のシンボリックが残っていないことを確認します。

~/libディレクトリ内に他の重要なファイルやリンクがあるかどうかは、この（~/libディレクトリの削除）を実行する前に内容を確認(※１)してください。
<font color = "blue">※１・・~/libディレクトリの中に他のファイルやシンボリックリンクがあるかを確認するコード</font>
```python
ls -l ~/lib
```

存在するファイルやリンクがある場合、シンボリックリンクかどうかを確認します。
例えば、以下のように表示される場合は、その項目がシンボリックリンクであることがわかります。

```python
lrwxr-xr-x  1 user  group    24B Aug 22 12:34 libzbar.dylib -> /opt/homebrew
```
以上です。
pyproject.toml をベースにwhl ファイルを作る手順

Pythonでのパッケージ作成のためのツールはsetup.py（とsetup.cfg)の時代が長かった。
pyproject.toml を使ったwhl ファイルの作成手順をメモする。

# 未検証！！

#### 注意
（いまでは poetry というツールやuv, Rye というツールもあります。
まだ、それらを習得していないので、とりあえず、setuptoolsを用いた方法を試しています。）


## 前提：
すでに`python3 -m pip install .` でpyproject.tomlをもとにインストールできていること。

## 手順
```
python3 -m pip install --upgrade setuptools wheel build
sudo apt install python3.8-venv

cd /path/to/your/project

python3 -m build wheel
ls dist
```
## 結果
目的のwhl ファイルがえられた。
レビュー分析AI レビューアイ、無料デモを公開中


![point_of_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/64f62e40-4773-d37c-0c1a-4cd4e06dd3a6.png)


株式会社リテジーリンクは、レビュー分析AI[レビューアイ](https://reviewai.next-seed.work/)の無料デモを
BtoB市場向けに公開しました。これにより、企業は商品やサービスに対する
レビューを効率的に分析し、具体的な強みや改善策を見える化することが可能になります。
本サービスは、レビュー分析によりデータに基づく経営判断を支援します。
特に、以下の3つの効果をもたらすことが期待されています。

## 1. 強みの見える化と新規顧客の獲得
レビューアイは、商品やサービスの強みを自動的に抽出し、分かりやすく提示します。
これにより、企業は自社の強みを効果的に宣伝し、新規顧客を獲得するための材料を
得ることができます。

## 2. 改善点の見える化と顧客満足度の向上
レビューアイによりサービスや商品の改善点を具体的に示されることで、
企業は迅速に改善策を講じることができます。
これにより、顧客満足度が向上し、リピーターを増やすことが可能です。

## 3. 競合他社との比較による差別化ポイントの明確化
レビューアイを使って他社のレビュー分析結果と自社の結果を比較することで、
自社ならではの強みが浮き彫りになります。
これにより、競合他社との差別化ポイントが明確になり、
マーケットでの独自のポジショニングを確立する手助けとなります。

## 無料デモ公開中
詳しい情報や具体的な事例については、[レビューアイのランディングページ](https://reviewai.next-seed.work/)を
ご覧ください。無料デモの詳細やサービス導入についても、
同ページでご案内しています。
【記録】サバイバルTypeScript

サイト

https://typescriptbook.jp/

... 随時更新中

# トップ
積極的に使ってみたい便利そうなものを板書

## [タプル型](https://typescriptbook.jp/#%E3%82%BF%E3%83%97%E3%83%AB%E5%9E%8B)

タプル型を使うと、配列の要素数と要素の型が固定される。
それぞれの要素のインデックスごとに型が決まる
```typescript
let tuple: [string, number];
tuple = ["hello", 10]; // 代入できる
tuple = [10, "hello"]; // 順序が正しくないため、代入できない
tuple = ["hello", 10, "world"]; // 要素が多すぎるため代入できない
```


## [Shorthand property names](https://typescriptbook.jp/#shorthand-property-names)
- プロパティの値がすでに定義されている変数である場合、そのプロパティ名を省略して記述できる。
- [詳細](https://typescriptbook.jp/reference/values-types-variables/object/shorthand-property-names)
```typescript
const name = "John";
const age = 20;
const obj = { name, age };
console.log(obj);

// { name: 'John', age: 20 }
```

## [オプショナルチェーン](https://typescriptbook.jp/#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3)
プロパティが存在するかどうか不確定である場合、`?.`演算子（オプショナルチェーン）で安全にアクセスできる。
```typescript
function printLength(obj: { a?: string }) {
  console.log(obj.a?.length);
}
printLength({ a: "hello" });
// 5
printLength({});
// undefined
```


# 作って学ぶTypeScript

### セットアップ時のエラー記録

[チュートリアル](https://typescriptbook.jp/tutorials/setup)を参考にtscインストールした後も`command not fouond`になる
```
tsc --version
zsh: command not found: tsc
```

以下を実行して解決した
```
npm bin -g
export PATH=$PATH:`npm bin -g`
```
- 参考: [Why wont my npm package commands work?](https://stackoverflow.com/questions/35540692/why-wont-my-npm-package-commands-work)
手続き型プログラミングとオブジェクト指向プログラミングの違いを考えてみる

## はじめに
　手続き型プログラミングの説明ですが、私が手続き型言語を触ったことがないため、この記事で話される手続き型プログラミングはオブジェクト指向言語でのものです。オブジェクト指向言語だけど、実際手続き的に書いているというケースは多いと思っています。~~なので、両者の違いを理解し、オブジェクト指向言語を利用する利点を享受しようというのがこの記事の目的です。~~
 ※いまいち自分の中でこれという結論が出なかったので、疑問を投げかけるような内容になってしまいました。コメントで皆さんの考えをお聞きできると嬉しいです。

## 手続き型プログラミングにおける問題点
　まず１ファイルで手続き的にプログラムを書く際に発生する問題点について考えてみました。
+ クラスの肥大化
+ 似た処理（考え）が色々な場所に散乱する（DRY原則）

　この辺りは説明せずともプログラムを書いたことがある人なら直感的に感じられるところかと思います。

　上記の問題点は手続き型プログラミングではUtilクラスを使って解消することが一般的です。Utilを利用すれば、似た処理（考え）は***Utilクラスに集約され、手続きを行う側のクラスも幾ばくかスッキリします。
 
 　ただUtilクラスも完璧ではなく、以下の問題点が上げられます。
+ データと処理が同じ場所にないので、処理（考え）がどういう使われ方をされるか分からない
+ データと処理が同じ場所にないので、ロジックの切り分けの基準がなく、メソッドのスコープは肥大化したり、一つのUtilクラスに大量のメソッドが生まれるなどの悪い凝集に陥る
+ 振る舞いの抽象化が出来ないため、ポリモーフィズムが実現できない

　ポリモーフィズムは置いておいて、1，2点目に関しては、手続き型言語でいう構造体、所謂データ型を利用すれば解決する気がします。引数は必ずデータ型を利用するとして、一つのUtilは一つのデータ型しか利用できないというルールを設けるという考えです。

  　もちろんオブジェクト指向言語を利用しているのであれば、わざわざデータ型とロジックを分けて書かなくてもいいし、どうせデータ型を使わずにプリミティブな型で書いている場合がほとんどなのは理解していますが、両者が出来ることを考えた場合、手続き型プログラミングとオブジェクト指向プログラミングの違いは振る舞いの抽象化（ポリモーフィズム）くらいなのかなと思います。

　ポリモーフィズムを利用して拡張性に富んだソフトウェアを作ることの利点は理解しますが、これだけで手続き型プログラミングがアンチパターンとされ、オブジェクト指向プログラミングがあらゆる場面で優れていると言うのは自分の中で疑問符が残ります。

 　上記以外にも抽象クラスを使い、依存関係をコントロールしたり、疎結合を図ったり、ユースケースのみに注目して手続き的に分析するのではなく、ドメインに注目してモデリングを行い、価値のあるソフトウェアを作ろうという考えもあると思いますが、このあたりの話はクリーンアーキテクチャであったりDDDの話なので、オブジェクト指向プログラミングの説明としては正しくないような・・
　自転車置き場の議論かもしれませんが、自分が誤った理解をしているような気がしてもやもやします・・

  ~~**良く分からん！！
  どなたか教えてください:sob:**~~

　手続き型とオブジェクト指向の違いはポリモーフィズムで良い気がしてきました。
　ポリモーフィズムを使い拡張性の高いソフトウェアを作る。ある程度作りきりのようなシステムは手続き型でも良いのかなというのが個人的な見解です。
[Pinia] 状態管理されている変数の変更をトリガーとして処理を行う方法

## 始めに
現在、Vue3を用いてフロントエンド開発をしており、状態管理としてPiniaを使用しています。
開発中に状態管理された変数の値が変わるたびにその値を使用した処理を行う必要がありました。
そこで、Piniaの標準機能を用いた方法を活用するととても簡単に実装できたので記事にしようと思います。
## Piniaとは
Vue.jsのコアチームの1人でVueRouterの開発者でもあるEduardo San Martin Morote氏によって開発が進められ、2019年にリリースされたコンパクトで使いやすい状態管理ツールです。
Vue3では状態管理ツールとして、Piniaを使用することが推奨されています。

基本的なPiniaの使い方は以下の記事をご参考ください！
とても分かりやすくまとめられていましたので勝手ながら紹介させていただきます。
[【Pinia】Vue3標準状態管理ツールPinia入門](https://qiita.com/whopper1962/items/6549448ac6bea705a697)

## 状態管理されている変数の変更をトリガーとして処理を行う方法
基本的な使い方をわかっていることを前提として次は、状態管理されている変数を監視して、値の変更が起きた時になんらかの処理を実行する方法です。

Piniaが標準で用意してくれているものを扱えばよいだけなのでとても簡単で,`$subscribe`を使用するだけです。
これによって状態が更新されるたびにコールバック関数が呼ばれます。
例えば以下のようになります。
```
import { useCounterStore } from '../store/count.js';
const counterStore = useCounterStore();

counterStore.$subscribe((mutation, state) => {
  console.log(state.count)
});
```
状態の新しい値がstate引数に含まれるので、コールバック関数内でstateを使用すると更新後の変数を扱うことができます。
## まとめ
Piniaにはほかにも便利な機能が用意されているのでぜひ使ってみてください！
Jetpack Compose のダイアログの背景を透明にしたい

## 概要
Dialog はデフォルトで半透明の灰色背景になっているので、これを透明したかった。

## 方法
以下のStackoverflow の記事によると以下のように setDimAmount(0f) をしてあげれば透明になると書いてある。

https://stackoverflow.com/questions/71766321/jetpack-compose-dialog-is-there-a-way-to-change-the-background-transparency

```kotlin
@Preview(device = "id:Nexus S")
@Composable
private fun Test() {
    Dialog(onDismissRequest = { }) {
        ((LocalView.current.parent as DialogWindowProvider).window).setDimAmount(0f)
        Box(modifier = Modifier.fillMaxSize()) {
            Text(
                text = "Okay!",
                color = Color.Cyan,
                modifier = Modifier.align(Alignment.Center)
            )
        }
    }
}

```

## Preview
Preview は以下のようになる。全然透明になってない！！

![mr-android_–_GroupShotResultDialogView_kt__mr-android_streaming_main_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7869/60f1d3da-04c0-1f3f-1573-fe7567d966be.png)

## 実機で見る
実機では以下のようになる。透明になってる！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7869/7375aee2-0bf7-a68f-ef92-d6ead20147d9.png" width=300>
The getter 'bodyTextX' isn't defined for the type 'TextTheme'となる対応方法

## 英訳要約
TextThemeにbodyTextが定義されていない

## 理由
3.19 stable版のリリース後にAPIが削除されたため

## 対応
[こちら](https://docs.flutter.dev/release/breaking-changes/3-19-deprecations)を参考に書き換えていってください

## 参考
https://docs.flutter.dev/release/breaking-changes/3-19-deprecations

https://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#deprecations
Pythonのf-stringは書式指定文字列にも式を書ける

Pythonの文字列をフォーマットする際には、コンパクトに書ける[f-string](https://docs.python.org/ja/3.12/tutorial/inputoutput.html#tut-f-strings)をよく使います。例として、下記は整数を5桁右詰め０埋めで表示する方法です。

```python
>>> value = 198
>>> print(f'{value:0>5d}')
00198
```

とても便利ですが、場合によっては桁数を実行時に決めたい場合があるかと思います。例えば複数の整数を表示するときに桁数を揃えて右詰めで出力したいとか。

```python
>>> value_list = [1, 11, 121, 1331]
```

こんなときには、出力する桁数を動的に決めて、書式指定文字列に反映させなければなりません。f-stringの式の中に式がネストすることになるので、動くのかどうか不安でしたが、これが**動きます**。

```python
>>> num_digit = len(str(max(value_list)))
>>> for value in value_list:
...     print(f'{value:0>{num_digit}d}')
... 
0001
0011
0121
1331
```

なんかいろいろと応用が効きそうでワクワクしますね。

ちなみに上記コードはPython 3.12で動作確認しています。
Linuxmint22にしたら、pulseaudio-equalizer(qpaeq)が使えなくなってたので、代わりのEasy Effectsを入れてみた

pluseaudio-equalizerをインストールしようと思っても、全然入れられなくて、調べましたら、

pulseaudioに代って、新しくpipewireがサポートされていて、こっちのがいろいろ高度な操作ができるようです。
<br />

さっそく

```shell
sudo apt install easyeffects
```

します。

インストールできたら、メニューからEasy Effectsを起動します。

なんだかおしゃれなUIが起動しました。

![easyeffects01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526103/6739b766-c1be-7bee-72a1-e29bfd62ab65.png)

※UIはダークにしました
<br />

下部に有る、「♫エフェクト」ボタンをクリックして、

左側にある、「エフェクトの追加」ボタンをクリックし、「イコライザー＋」をクリックしてみると、グライコが出ましたので、さっそくローをカットしてみました。

![easyeffects02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526103/c175b01b-dce7-4548-389c-fe36096fea8b.png)


しっかり調整されました。
<br />

面白いので「オートゲイン」も追加すると、デフォルトのままでもいい感じにゲイン調整してくれます。

![easyeffects03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526103/f7382f01-5354-883e-7656-1f784afe743c.png)


これ、とってもいいですね。

mint22いい感じです。

ありがとうございます。
Husky、ESLint、Prettierでワークフローを最適化

## 紹介

コードの品質を一貫して保つことは、チーム開発でも個人開発でも非常に重要です。これにより、コードの可読性が向上し、バグが減少し、将来のアップデートが楽になります。

Husky、ESlintとPrettierは、コード品質と一貫性を保つために必要なツールです。ESlintとPrettierは日常的に使われており、導入に関する記事も数多く存在しますが、今日はHuskyに焦点を当てます。

Huskyはコメント前にテストやリンターなどのスクリプトを自動的に実行し、コード品質を確保し、問題がコードベースに入るのを防ぎます。

それでは、早速始めましょう。

## Huskyの設定
### 前提条件
Huskyはnpmでインストロールされるため、Node.js環境とnpm/yarn/pnpmを使用するプロジェクトがすでにあろことを前提とします。また、Gitリポジトリも初期化されている必要があります。まだ初期化されていない場合は、下記のコマンドをルートディレクトリで実行してください。
```
git init
```
### Huskyのインストール
下記のコマンドを実行してください。
```
npm install husky -D
```
Git Hooksを有効化します。
```
npx husky install
```
インストール後にGit Hooksを自動的に有効化するために、以下のコマンドを実行して`package.json`を更新します。
```
npm pkg set scripts.prepare="husky install"
```
これらのコマンドを実行すると、ルートディリレクトに`.husky`フォルダが生成され、その中に`pre-commit`ファイルが作成されます。

生成されたの`pre-commit`ファイルは下記のようになります。
```
#!/usr/bin/env sh  
. "$(dirname -- "$0")/_/husky.sh"  
  
npm test
```

## Husky、ESlint、Prettierを組み合わせる
デーフォルトでは、コミット前に`npm test`だけが実行され、基本的な問題しかチェックされません。しかし、コミット前にコードを自動的にフォマットし、リントエラーを修正したい場合はどうすれば良いでしょうか？ここで`lint-staged`が登場します。

簡単に言うと、このツールはGitでステージされたファイルに対してリンターを実行します。

使い方を見てみましょう！
1. `pre-commit`ファイルを更新します。
```
	npx lint-staged
```
2. `package.json`ファイルを設定します。
```json
"lint-staged": {
	"*.{ts,tsx}": [
		"prettier --write",
		"eslint ."
	]
}
```
こちらの設定では、ステージされたすべての`ts`および`.tsx`ファイルが対象になります。Prettierを使用してコードスタイルを強制的にフォマートし、エラーを自動的に修正します。また、ES Lintは対象ファイルのコード品質をチェックします。

## コミットメッセージをリントします
整理されたわかりやすいプロジェクト履歴を保つためには、明確なコミットメッセージが重要です。適切にフォマットされたコメットメッセージは、将来必要な情報を見つけやすくします。`commitlint`を使用して、コミットメッセージスタイルを強制できます。

まずは下記のコマンドを実行して始めましょう！
```
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit $1'
```
これにより、`commit-msg`ファイルを生成され、その中に`npx --no -- commitlint --edit $1`という内容を追加されます。

次に、必要な`commitlint`パッケージをインストールします。
```
npm install @commitlint/config-conventional @commitlint/cli -D
```

そして、ルートディレクトリに以下の内容で `.commitlintrc.json` ファイルを作成します。
```json
{
	"extends": ["@commitlint/config-conventional"],	
	"rules": {
		"type-enum": [2, "always", ["ci", "chore", "docs", "ticket","feat", "fix", "perf", "refactor", "revert", "style"]]
	}
}
```

設定を説明します：
1. **type commit**: 特定のコメットタイプを強制します。
2. **2**: 重要度レベル。２はエラーに示します。
3. **always**: ルールが強制的に適用されることを保証します。
4. **Commit Types**: 有効なコミットタイプは次のとおります。 `ci`, `chore`, `docs`, `ticket`, `feat`, `fix`, `perf`, `refactor`, `revert`, `style`.

成果物をチェックしましょう。
```
git commit -m "invalid commit"
```
![Pasted image 20240821143241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1560883/a5f6c177-0181-9c5c-e2f2-c8545e2be757.png)


コミットメッセージは[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)のルールに従う必要があります。

これで全て完了です。あとはご自由に他の設定を試してみてください。

よりスムーズで信頼できる開発環境を楽しみましょう！
Xcode 15.3/15.4で発生する`Package.resolved`の削除問題について

Xcode 15.3および15.4で、git ブランチの変更や `pod install` など、リポジトリに変更を加えるたびに、ワークスペースの `Package.resolved` が削除されてしまう現象が報告されています。この問題により、ビルド時にSwift Package Manager (SPM)で管理しているライブラリが一部削除され、ビルドエラーが発生するケースが確認されています。本記事では、この現象の再現手順と対処方法について解説します。

## 再現手順

以下の手順で問題を再現することができます。

1. `pod install` を実行する。
2. Xcodeでプロジェクトをビルドする。ビルドエラーが発生し、エラーログが表示される。
3. Xcodeで「Resolve Package Versions」を実行すると、エラーが解消される。しかし、この方法ではキャッシュを削除しても問題は完全に解決しません。

## 問題の詳細

この問題は、`pod install` やgitブランチの切り替えを行う際に、`Package.resolved` が意図せず削除されることが原因です。このファイルが削除されると、Xcodeはパッケージのバージョン情報を失い、ビルドに必要なライブラリが見つからなくなるため、ビルドエラーが発生します。

**注意:** git ブランチ変更時にこの問題が発生したという報告が他の開発者から寄せられていますが、私の環境では再現しませんでした。現象が発生する条件が環境や設定によって異なる可能性があります。

## 対処方法

問題が発生した場合、以下の方法で一時的にエラーを解消することが可能です。

1. Xcodeのメニューから「File」 > 「Packages」 > 「Resolve Package Versions」を選択し、パッケージのバージョンを再度解決します。
2. 必要に応じて、`Package.resolved` ファイルを手動で復元するか、`pod install` を実行する前にバックアップしておくと良いでしょう。

しかしながら、これらの対処法は根本的な解決には至らず、再度リポジトリに変更を加えた際に同じ問題が再発する可能性があります。

## 今後の対策

現在、Xcode 16 Beta 6がリリースされていますので、この問題が修正されているか確認することをお勧めします。Appleの公式リリースノートや開発者フォーラムなどで、Xcodeの最新バージョンの修正内容を確認することが重要です。

## まとめ

Xcode 15.3および15.4で発生する `Package.resolved` の削除問題は、プロジェクトのビルドエラーの原因となる厄介な問題です。手動でバージョン解決を行うことで一時的に回避可能ですが、根本的な解決策としてXcodeのアップデートを検討する必要があります。

同様の現象が報告されているユーザーもいるため、最新の情報を追いかけながら対応することが重要です。
【C#】Interfaceを使用した条件分岐【初心者向け】

# 概要
Interfaceを使用した条件分岐について記載します。

# コード
Interfaceを定義しておき、そのInterfaceを持つ複数のクラスを用意します。
```C#
     internal interface ISampleClass { }
```
```C#
    internal class HogeSampleClass : ISampleClass
    {
        // クラス内の適当な実装
    }
```

```C#
    internal class HugaSampleClass : ISampleClass
    {
        // クラス内の適当な実装
    }
```
以下のようにキャストの可不可で条件分岐ができます。
```C#
    var sampleClass = SampleClass.Get();
    if (sampleClass is HogeSampleClass hogeSampleClass)
    {
       // hogeSampleClass用の処理
    }
    else if (sampleClass is HugaSampleClass hugaSampleClass)
    {
        // hugaSampleClass用の処理
    }
    else
    {
        // キャスト失敗のためエラー処理
    }
 ```

```C#
internal static class SampleClass
{
    public ISampleClass Get()
    {
        // HogeSampleClass、もしくはHugaSampleClassを返却
        if(条件式)
        {
            return HogeSampleClass;
        }
      else
       {
            return HugaSampleClass;
       }
    }
}
```
初めまして

#  初めまして

他の記事から **Qiita** へ引っ越してまいりました。  
今後もよろしくお願いします！
備忘録を投稿していきます。

---

##  今までの記事はこちら

> 過去の記事を見ていただけると嬉しいです。

[**note.com/koichi_2426**](https://note.com/koichi_2426/)

---
OCIのリソース・スケジューラーでインスタンスを自動起動・停止する

# はじめに
OCIのリソーススケジューラーを使ってインスタンスの自動起動・停止を設定します。

https://docs.oracle.com/ja-jp/iaas/Content/resource-scheduler/concepts/resourcescheduler-overview.htm

できないと思ってたのですが、2024年5月にリリースされてたんですね

https://docs.oracle.com/ja-jp/iaas/releasenotes/changes/8e6ae6ab-d126-4530-b623-ac1289908e79/index.htm

# ポリシーの設定

必要に応じてリソーススケジューラーを作成できるポリシーを設定します。

https://docs.oracle.com/ja-jp/iaas/Content/resource-scheduler/tasks/getting-started_resource_scheduler.htm

# スケジュールの設定

OCIコンソールからスケジュールを作成します。

![スクリーンショット 2024-08-23 13.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/7f81e35f-79b8-3a8a-4df5-b0f8b90ad0d1.png)

停止のスケジュールを作成します。

![スクリーンショット 2024-08-23 13.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/6535c14f-0dba-bf8e-be8f-7ec8be500b9b.png)

対象のインスタンスを選びます。

![スクリーンショット 2024-08-23 13.15.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/cd50bc08-d6f8-00f2-cce9-2a0d7e7499b8.png)

停止する間隔と時間を設定します。時間はUTCで設定します。

![スクリーンショット 2024-08-23 13.17.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/a9fbbae1-3012-8eb9-1393-c5077a56cbde.png)

こんな感じになります。

![スクリーンショット 2024-08-23 13.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/4b0b7aad-f4cd-c322-744f-f7be4293f9b2.png)

# ポリシーの設定
ターゲット・リソースに対してアクションを実行する権限を作成したリソース・スケジュールに付与します。

https://docs.oracle.com/ja-jp/iaas/Content/resource-scheduler/tasks/getting-started_resource_scheduler.htm

# 動作確認
成功することを確認します。
（リソーススケジュールへの権限設定を忘れてたので、最初は失敗しました）

![スクリーンショット 2024-08-23 13.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/d434bc43-6d4d-5d1c-159f-89e79e6faacc.png)

# まとめ
最終的には起動も設定して、
- 毎週月曜日から金曜日の9:00（UTCだと0:00）起動
- 毎日19:00（UTCだと10:00）停止
にしました

![スクリーンショット 2024-08-23 13.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/3d5c078e-4e5e-d8b7-3184-7b0e20857551.png)
Macのアップデートが出てこない！！

# TL;DR;
時刻を合わせましょう．

# 経緯
- `MacBook Air (M1, 2020)`(以下 `MacAir`) の†ほぼ全ての内臓入力インターフェース(i.e. キーボード&トラックパッド)†が反応しなくなった．
- `MacBook Pro (Intel, 2020)`(以下 `MacPro`) が眠ってた．
- `MacAir` のデータを `MacPro` に移行すればモーマンタイじゃん．
- `移行アシスタント` を使って移行させるか．
- ほう．`MacPro` のバージョンを上げないと `移行アシスタント` は動作しないのか．
- 今 `MacPro` は Catalina(10.15.7) だね．
- Sonoma(14.6.1) までアプデさせれば良いかな？


# 事件
- さあ．設定から OS アップデートしてみるか．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534163/2ace0ebc-dfb1-ae75-d9bc-f3dd70229ca7.png)
- **?!**
- **†*1976年4月1日 木曜日 9:15日*†**
- [検索🔍] 1976年 Mac
    - [1976年4月1日、ジョブズとウォズニアックにロナルド・ウェインを加えた3人は、共同で「Apple Computer Company（アップルコンピュータ・カンパニー）」を創業し、カリフォルニア州のビジネス・パートナーシップとして登録した。](https://ja.wikipedia.org/wiki/Apple%E3%81%AE%E6%AD%B4%E5%8F%B2)
- 明らかに時間がおかしいね．時刻がズレてるね．

# 解決
- 時刻を合わせるか．
    - `Wi-Fi` に繋げる．
    - 再起動をかける．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534163/9826600c-cc80-5274-3d39-64298784fbab.png)
- アップデートが出た〜
dockerコンテナでPlaywrightを実行した時のみダウンロードしたファイル名が「download」になってしまう

## 概要
PlaywrightをDockerコンテナで実行すると、`download`という名前のファイル名で返却されてしまいこのようなエラーが発生した。
ローカルで実行すると想定どおりのファイル名が返ってくる。

```
Error: expect(received).toBe(expected) // Object.is equality

    Expected: "サンプルファイル.xlsx"
    Received: "download"

```

## 該当コード
```daonwload.spec.js
      await expect(download.suggestedFilename()).toBe(
        'サンプルファイル.xlsx'
      )
```

## 原因
`suggestedFilename()`がロケールおよびタイムゾーンを取得できないがために日本語を認識できず、`download`という文字列を返していた。
なので、ロケールとタイムゾーンを設定させてあげることで解決。

```playwright.config.js
    // 略
    locale: 'ja-JP',
    timezoneId: 'Asia/Tokyo'
  },

```

またDocker環境のLocaleも設定されているか確認してください。

https://qiita.com/yuri_t/items/a927744770d0be9f7aca

## 参考記事
Thank you guys!

https://stackoverflow.com/questions/77869473/suggestedfilename-in-playwright-docker-is-not-set-correctly-default-to-downl
日常業務で使えるOCR３選

# はじめに
日常業務を行う中で画像中の文字列を取得してどこか別の場所に書き写したいという場面に遭遇したことはありますか？
そんな時に活躍するのがOCRという技術です。
本記事では設定不要で使えるOCRの方法をいくつか紹介し、シーン別にどの方法を使うのが適切かを解説していきたいと思います。

# OCRとは
光学文字認識（こうがくもじにんしき、英: Optical character recognition）は、活字、手書きテキストの画像を文字コードの列に変換するソフトウェアである。画像はイメージスキャナーや写真で取り込まれた文書、風景写真（風景内の看板の文字など）、画像内の字幕（テレビ放送画像内など）が使われる(Wikipediaより抜粋)

https://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98

OCRを使うことにより、手書き文字や画像中の文字をコピペして使える状態にすることができるようになります。



# OCRの種類と比較
では、Windows11上でデフォルト設定のまま使えるOCRの紹介と使用用途を解説していきます。

### １．Snipping Tool
#### 評価
精度：５点
速度：３点

#### 使用シーン
特にこだわりがない場合、ほぼすべてのシーンでSnipping Toolを使用して問題ないと思います
精度も申し分なく日本語、英語、記号が入り混じったような文字列でも簡単かつ正確に取得できます

#### 使い方
windowsキー + shift + sを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/fcf634b9-b208-a899-a3d6-c70041a3863d.png)


文字列を取得したい範囲をトリミング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/5c63d45d-c9e3-1f89-538c-2ee48e83453b.png)


右下にSnipping Toolのポップアップが出てくるのでクリック（ポップアップが出ない場合は設定→システム→通知から通知を許可するように設定を変更してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/91e9e68a-4df7-5b6e-a302-1d04a15c56e9.png)

画面上部のテキストアクションをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/0cb1f345-6220-d9e6-c4bc-c6e6e5d93195.png)

すべてのテキストをコピーするをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/a9f5153f-f660-5461-6899-47ea33e0c84c.png)

Ctrl + v で好きな場所に貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/fc1b3a10-14b6-4b17-7406-9ffbb984fe60.png)

慣れれば１０数秒で作業が完了する上に精度も申し分ないため、筆者はこの方法をメインで用いています

### ２．Windows Power Toys
#### 評価
精度：２点
速度：５点

#### 使用シーン
速度は圧倒的に速いものの精度が高くなく、生かせる場面がないかなという印象です

#### 使い方
windowsキー + shift + tを押下（画面が暗くなりトリミングができる状態になります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/3ac18c17-a5aa-0024-7b8e-81bd376f2494.png)

文字列を取得したい範囲をトリミング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/53a14102-dd02-4124-f75d-23ba6d105763.png)

Ctrl + vで好きな場所に貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/8c5804b5-cca8-2a5f-1834-755140264c85.png)

文字列取得にかかる時間は圧倒的に短いものの精度が良くないため今後に期待です

### ３．Google Documents（番外編）
#### 使用シーン
pdfを文字列として読み込みたいときに使用
特に文章量が多いpdfで検索機能を使いたいという場面で活躍する方法です

#### 使い方
該当のpdfをGoogle Driveにアップロード→右クリック→アプリで開く→Google ドキュメントを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/a37ee5fe-4a42-5be3-3334-cae408fa97c8.png)

特定のシーンでは非常に重宝する方法だと思います



# おわりに
専用のソフトウェア等を利用すればより快適にOCRを利用する方法もあるかと思いますが、特に設定をせずとも使える方法を紹介させていただきました
Snipping Toolを使ったOCRの方法はWindows11になってから使えるようになったらしいのですが、筆者はそのことを知らず時間のかかる方法を使っていたため、ほかの方にも情報を共有しようと思い記事を作成させていただきました
【Flutter】NullチェックのためにNullable型の拡張関数を作る

# Nullable型の拡張関数なしの場合
Nullable型のインスタンスを使用する場合、条件付きメソッド(`?.`)やnullチェックが必要になります。

```
Counter? counter = Counter();

// 条件付きメソッド
// nullじゃない場合、実行される
// 複数行の場合、?を毎回使用する
counter?.increment();
counter?.increment();
counter?.increment();

// nullチェック
// 変数に代入してnullチェックする必要がある
final local = counter;
if (local != null) local.increment();

// 値を使う時もチェックが必要
if (local != null) return;
final a = A(local);
class A {
  final Counter counter;
  A(this.counter);
}
```

上記のコードだと、可読性が低くなったり、Nullable型を使用している場所で同じようなコードを書くようになりコード量が増えます。

# Nullable型の拡張関数ありの場合
この問題に対してNullable型の拡張関数を作成することで、より直感的にコードを書くことができて可読性が向上し、コード量を減らすことができます。

```
// nullable_extension.dart

// ジェネリクスを使用しているため、nullableならどのような型でも使用可能
extension NullableExtension<T> on T? {
  // nullではない場合は、受け取った関数を実行する、nullの場合は何もしない
  void ifNotNullExecute(void Function(T value) function) {
    // thisはT?型でnullableなので、nullチェックを行うためにlocalに代入
    final local = this;
    // ｎullの場合はreturnする
    if (local == null) return;
    // nullじゃない場合は、受け取った関数を実行する
    function(local);
  }

  // nullではない場合は、受け取った関数を実行して戻り値を返す、nullの場合はnullを返す
  R? ifNotNullReturn<R>(R Function(T value) function) {
    // Rは引数の無名関数の戻り値の型に自動で決まるので、ifNotNullReturn()<int>のように指定しなくていい
    // thisはT?型でnullableなので、nullチェックを行うためにlocalに代入
    final local = this;
    if (local == null) return null;
    return function(local);
  }
}
```

```
Counter? counter = Counter();

// 無名関数内で複数行の処理も実行できる
// 直感的でわかりやすい
counter.ifNotNullExecute((value) {
              value.increment();
              value.increment();
            });

// チェックした値を使って、インスタンスを生成できる
final a = counter.ifNotNullReturn((value) => A(value));
class A {
  final Counter counter;
  A(this.counter);
}
```
エディタで使えるキーボードショートカット

Qiitaのエディタではキーボードショートカットを利用できます！
この記事では、**便利なキーボードショートカット**を紹介しますので、ぜひご活用ください🙌✨

## 利用できるキーボードショートカット一覧

| 操作 | ショートカット |
|:-|:-|
| 行を上/下に移動 | `Option(Mac) または Alt(Windows)` + `↑/↓` |
| 行を上/下に複製 | `Shift` + `Option(Mac) または Alt(Windows)` + `↑/↓` |
| 本文検索 | `Command(Mac) または Ctrl(Windows)` +  `F` |
| インデントを増やす | `Tab` |
| インデントを減らす | `Shift` + `Tab` |
| コマンド補完機能 | `/` |
| 本文の編集エリアから離脱 | `Esc` を押してから `Tab` |

## キーボードショートカットの説明

### 行を上/下に移動

ショートカット：`Option(Mac) または Alt(Windows)` + `↑/↓`

現在カーソルがある行または選択している行を上/下に移動することができます。
複数行選択している場合は、選択している行をまとめて移動できます。

### 行を上/下に複製

ショートカット：`Shift` + `Option(Mac) または Alt(Windows)` + `↑/↓`

現在カーソルがある行または選択している行を上/下に複製することができます。
複数行選択している場合は、選択している行をまとめて複製できます。

### 本文検索

ショートカット：`Command(Mac) または Ctrl(Windows)` +  `F`

本文内の検索機能を利用できます。
本文内で一致したテキストはハイライトされ、矢印ボタン（前の検索結果/次の検索結果ボタン）でフォーカスを移動できます。

![Qiitaのエディタのスクリーンショット。「Markdown」と入力された検索フォームが表示されており、本文の「Markdown」がオレンジにハイライトされている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/068be7d5-24d5-87ec-7940-4bdac0306711.png)

### インデントを増やす

ショートカット：`Tab`

現在カーソルがある行または選択している行のインデントを増やすことができます。
複数行選択している場合は、選択している行のインデントをまとめて増やすことができます。

### インデントを減らす

ショートカット：`Shift` + `Tab`

現在カーソルがある行または選択している行のインデントを減らすことができます。
複数行選択している場合は、選択している行のインデントをまとめて減らすことができます。

### コマンド補完機能

ショートカット：`/`

特定の操作や機能を直接呼び出せるコマンド補完機能を利用できます。

- コマンド補完機能の利用方法
    - `/`を入力し表示されるドロップダウンから利用したいコマンドを選択する
    - `/`に続けてコマンド名を入力し、`Enter`を入力する

![Qiitaのエディタのスクリーンショット。本文に「/co」と入力されており、「codeblock コードブロックを挿入します、commentout コメントアウトを挿入します」というドロップダウンが表示されている。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/d2cda1d0-cd20-2a96-f9bc-d18d016af46c.png)


#### 利用できるコマンド補完機能

| コマンド名 | 操作 |
|:-|:-|
| codeblock | コードブロックを挿入します |
| alert | 警告の補足説明を挿入します |
| warn | 注意の補足説明を挿入します |
| info | 補足説明を挿入します |
| commentout | コメントアウトを挿入します |
| details | 折りたたみを挿入します |
| reference | 脚注へのリンクを挿入します |
| footnote | 脚注の注釈内容を挿入します |
| table | テーブルを挿入 2x2と書いてもテーブルを挿入できます |

### 本文の編集エリアから離脱

ショートカット：`Esc` を押してから `Tab`

`Esc`を押すことで`Tab`キーでフォーカス移動ができるようになり、本文の編集エリアから離脱することができます。
dpkgで循環依存のあるパッケージをインストールする

結論： `dpkg -i` コマンドに循環依存（依存関係のループ）のあるdebパッケージをまとめて指定すればよい。

## 状況

検証などの目的で、Ubuntu環境に古いバージョンのカーネルをインストールすることがある。

この場合。[Launchpadのビルド結果ページ](https://launchpad.net/~canonical-kernel-team/+archive/ubuntu/bootstrap/+build/23512974)などからdebパッケージをダウンロードしてきて、手動でインストールする方法がある。

この際、 `linux-image-unsigned` パッケージは同じバージョンの `linux-modules` パッケージに、 `linux-modules` パッケージは同じバージョンの `linux-image` か `linux-image-unsigned` パッケージに依存している。
したがって、 `dpkg -i` コマンドで１つづつインストールしようとすると、互いにもう片方が未インストールであるため、インストールに失敗する。

## dpkg -i のマニュアルで見る、複数指定の存在

ここで、 `man dpkg` で、dpkgコマンドのマニュアルを見てみる。

```
ACTIONS
       -i, --install package-file...
           Install the package. If --recursive or -R option is specified, package-file must refer to a directory instead.
```

上記で `package-file...` となっていることから、 `dpkg -i` には複数のdebパッケージを指定して、一括でインストールすることができそうであることが分かる。

実際に、 `dpkg -i` に `linux-image-unsigned` と `linux-modules` のパッケージを両方指定することで、正常にまとめてインストールされる。
【SwiftUI】アニメーションとトランジションを組み合わせて連続して使う


こんなカクカクのメッセージ的な表示。


![sc 2024-08-23 at 11.20.52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/3617e8dd-4365-3ace-7b55-f6fe230b78bf.gif)

```swift
import SwiftUI

struct Message: View {
  var text: String

  @State private var showIcon = false
  @State private var showText = false

  var body: some View {
    HStack(spacing: 0) {
      if showIcon {
        Image(systemName: "heart.fill")
          .foregroundStyle(.red)
          .font(.title)
          .padding()
      }
      if showText {
        Text(text)
          .padding(.trailing, 24)
      }
    }
    .clipShape(.capsule)
    .background(
      .regularMaterial.shadow(.drop(radius: 16)),
      in: .capsule
    )
    .frame(height: 50)
    .onAppear {
      Task {
        showIcon = true
        try await Task.sleep(for: .seconds(1))
        showText = true
        try await Task.sleep(for: .seconds(1))
        showText = false
        try await Task.sleep(for: .seconds(1))
        showIcon = false
      }
    }
  }
}

private struct RefreshPreview: View {
  var text: String

  @State private var id = false

  var body: some View {
    Message(text: text)
      .id(id)

    Button("Refresh") {
      id.toggle()
    }
    .buttonStyle(.borderedProminent)
  }
}

#Preview {
  RefreshPreview(text: "Hello, world !!!")
    .padding()
    .frame(maxWidth: .infinity)
}
```

# 🤔 アニメーションとトランジションを組み合わせて使う

こんなに雰囲気変わるようです。

![sc 2024-08-22 at 21.49.39.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/07e5dffc-2f33-94b6-e154-661fbfc3e6d4.gif)

これは、組み合わせて使ったほうがいいですね!

https://android.benigumo.com/20240822/swiftui-animation-transition/

https://x.com/maochanz/status/1826954096848630014

https://x.com/maochanz/status/1827873597471199498

https://qiita.com/chanzmao/items/be518afd494de7f394c4

https://qiita.com/chanzmao/items/ee609916751c1521969c
【ChatGPT＋Code Interpreter】でOCRしてみます。


　どうも、カーブミラーです。

　今回は、OCRしてみます。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::
　ニュースはないので、
　　さっそく本題です。

　今回は、
　　OpenCVでOCRしてみます。

　OCRとは
　　なんでしょうか？

***
***user***
質問。OCRとはなんですか？

***ChatGPT***
OCR（Optical Character Recognition、光学文字認識）とは、画像やスキャンしたドキュメントなどに含まれる文字を、コンピュータが認識し、テキストデータとして変換する技術のことです。例えば、印刷された書類や手書きのメモをスキャンして、その内容をデジタルテキストとして編集したり検索したりできるようにするのに使われます。

具体的には、OCR技術は画像内の文字の形状を解析し、対応するテキストを認識します。これにより、紙媒体の資料や画像化された情報を、コンピュータ上で扱いやすいテキストデータに変換できるようになります。

OCRは、書籍のデジタル化、名刺の管理、自動データ入力など、さまざまな分野で活用されています。
***

　簡単に言うと
　　画像や写真に写っている文字を
　　　コンピュータが読み取って、
　　　　デジタルの文字に
　　　　　変える技術のことです。

　大量の文書（書籍など）があり、
　　デジタル化しなければ
　　　ならない場合に
　　　　よく使われます。

　一時期、「自炊」と呼ばれる、
　　書籍を裁断し、
　　　スキャナーを使って
　　　　デジタルデータに
　　　　　変換する行為が
　　　　　　流行りましたね。

　そこで使われた
　　技術になります。
***
　さっそくやってみましょう。

　今回は、
　　スマホの画面を
　　　スクショで取得して
　　　　行ないます。

　まずは
　　英文です。

　Promptはこちら。
```Text:英語文章OCRPrompt
OpenCVで、OCRしてください。
```
　画像をアップロードして
　　Promptを送信します。

　なんの問題もなく
　　OCRできました。

　ここで
　　ひとつ注意を。

　OCRできたとしても
　　確実に、完璧に、
　　　行なえるわけでは
　　　　ありません。

　必ず確認してくださいね。
***
　では次に日本語文章です。

　同じPromptを使いました。

　すると
***
***ChatGPT***
現在の環境では日本語のOCRが利用できないため、テキストの抽出ができませんでした。代わりに、手動で内容を確認して入力いただくか、別の方法でテキストを抽出することをお勧めします。他にお手伝いできることがあればお知らせください。
***
　と出てきました。

　そうです。
　　OpenCVでは、
　　　日本語文章のOCRは
　　　　できないのです。

　では、
　　OCRできないのか？

　そんなことは
　　ありません。

　“Code Interpreterを使う”という
　　目的にはそぐいませんが
　　　日本語文章のOCRも
　　　　できます。

　画像をアップロードしたら
```Text:日本語文章OCRPrompt
OCRしてください。
```
　と入力して送信してください。

　これは
　　Code Interpreterではなく、
　　　ChatGPT自体が
　　　　処理を担当します。

　ChatGPTには
　　GPT-4Visionという
　　　ビジュアルを認識できる
　　　　能力があるのです。

　それで
　　日本語も認識できる
　　　わけです。

　それでも
　　完璧ではありませんので、
　　　内容は必ず確認してください。

　絵文字なんかは
　　認識が甘いのか
　　　近くはあるけれど、
　　　　間違ったものを
　　　　　出してきますので。

　それから
　　本格的に「自炊」する場合は
　　　ChatGPTでは時間が掛かります。
　　　　専用のシステムの
　　　　　利用をおすすめします。
***
　最後に
　　同じ日本語文章でも
　　　手書き文字がありますよね。

　これは
　　OCRが難しいと
　　　されるものです。

　やってみました。
　　某お店のメニューです😅
![IMG_20240802_173039394~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/f985180f-c231-e63b-fc76-763f21a27323.jpeg)

***
***ChatGPT***
以下の内容が画像から読み取れました。

---

**8月のおすすめフード**

- 枝豆つかみ取り　440円
- ひんやりナスの揚げびたし　440円
- みょうがの豚肉巻き揚げ　660円
- チキンとグレープフルーツのサラダ仕立て　770円
- イワシのスパニッシュオムレツ　770円
- ゴーヤとツナの全粒塩レモンパスタ
  - S 715円
  - M 935円
  - L 1045円

---

このような内容です。
***

　さすがです😸

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Excelファイルのバックアップ、VBAを利用したファイルコピー及びリネームの方法

こんにちは、小磯と申します。

Excelファイルの破損や削除されてしまった場合、ファイルサーバにバックアップされているデータより戻す企業が多いと思います。
中にはバックアップを行わない企業もあると思います。
破損や削除された場合は再作成や復元に時間が掛かったり、記載漏れが発生することもあります。
管理者やPM(PMO)が始めての方へ参考になればと思います。


### バックアップ、ファイルコピー及びリネーム

誤操作でファイルが移動されてしまった場合は、検索をすれば元のフォルダへ戻せば問題ありません。
破損した場合はファイルを開くことが出来ず、ファイルサーバより削除されている場合はゴミ箱に移動されません。
ファイルをリネームすることにより、どのタイミングで作成したファイルか分かります。
今後発生しうるため、事前防止に繋がればと思います。


## 1.バックアップ方法
①ファイルを作成
②「ファイル」-「名前を付けて保存」を選択
③名前を付けて保存画面より、「保存先フォルダ」を選択
④「ツール」-「全般オプション」を選択
⑤全般オプション画面より「バックアップファイルを作成する」にチェックを入れ「OK」を押下
　※読み取り、書き込みパスワードは空白で問題ありません。必要な場合は設定願います。
⑥ファイル名を入力し「保存」を押下
⑦ファイル名.xlk(バックアップファイル)を確認

## 2.ファイルコピー
①ファイルを作成し、「ファイル名+日付」にファイル名を変更し、「xlsm」
②メニューバーより「ファイル」-「オプション」を選択
③Excelのオプション画面より「リボンユーザー設定」を選択
④リボンのユーザー設定より「開発」のチェックBOXをONにし「OK」を押下
　メニューバーに「開発」が表示されたことを確認
⑤メニューバーより「開発」-「マクロ」を選択
⑥マクロウィンドウより、マクロ名欄に任意の名称を記載し「作成」を押下
⑦「Microsoft Visual Basic for applications」画面にて、右側にあるウィンドウへ以下のコードを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/64d1e117-bab6-38f6-b075-193f795dc3db.png)


⑦「上書き保存」ボタンを押下
⑧「Microsoft Visual Basic for applications」画面を閉じ、Excelファイルを上書き保存し閉じる
⑨メニューバーより「開発」-「マクロ」を選択
⑩「オプション」を押下し、ショートカットキーの「任意キー」を設定し「OK」を押下
　「×」ボタンでマクロウィンドウを閉じる
⑨ファイル名をリネームしExcelファイルを開いて上書き保存
⑩ファイルがコピーされファイル名が設定した名称になっていることを確認

## 3.コピーファイルの管理
コピー前のファイルについては、別フォルダへ退避させ過去ファイルとして保管してもよいと思います。
ドライブの容量圧迫にもなるため期限を設け、特定の日にファイルを削除することもよいと思います。


 - ## まとめ
破損や削除された場合、再作成や復元に関する確認の時間短縮になります。
バックアップやファイルコピーをすることで、更新内容の差分を確認することが出来ます。

以上、小磯でした。
API Gatewayを利用してLambdaを叩くcurlコマンドは？ ただし、AssumeRoleと、Cognito認証が必要

前提条件
Cognito認証: ユーザーはCognito User Poolを介して認証され、Cognito Identity Poolを使用してAWSリソースにアクセスします。
AssumeRole: Cognito Identity Poolを通じて取得した一時的な認証情報を使って、指定されたIAMロールにAssumeRoleします。
API Gateway: Lambda関数に連携されたAPI Gatewayエンドポイントが設定されています。
手順
1. CognitoでIDトークンを取得
まず、Cognito User Poolでユーザーが認証されると、IDトークン（JWT）を取得します。

bash
Copy code
aws cognito-idp initiate-auth \
    --client-id <your-client-id> \
    --auth-flow USER_PASSWORD_AUTH \
    --auth-parameters USERNAME=<your-username>,PASSWORD=<your-password>
<your-client-id>: Cognito User Poolで設定されたアプリクライアントID
<your-username>: Cognitoユーザー名
<your-password>: Cognitoユーザーパスワード
レスポンスにはIdTokenが含まれています。

2. Cognito Identity Poolから一時的な認証情報を取得
次に、取得したIDトークンを使って、Cognito Identity Poolから一時的な認証情報を取得します。

bash
Copy code
aws cognito-identity get-id \
    --identity-pool-id <your-identity-pool-id> \
    --logins cognito-idp.<your-region>.amazonaws.com/<your-user-pool-id>=<IdToken>
<your-identity-pool-id>: Cognito Identity PoolのID
<your-region>: Cognito Identity Poolが存在するリージョン
<your-user-pool-id>: Cognito User PoolのID
<IdToken>: 先ほど取得したIDトークン
次に、一時的なAWS認証情報を取得します。

bash
Copy code
aws cognito-identity get-credentials-for-identity \
    --identity-id <your-identity-id> \
    --logins cognito-idp.<your-region>.amazonaws.com/<your-user-pool-id>=<IdToken>
レスポンスにはAccessKeyId、SecretKey、SessionTokenが含まれています。

3. AssumeRoleを実行
取得した一時的な認証情報を使ってAssumeRoleします。

bash
Copy code
aws sts assume-role \
    --role-arn <your-role-arn> \
    --role-session-name <your-session-name> \
    --duration-seconds 900 \
    --credentials \
    --access-key <AccessKeyId> \
    --secret-key <SecretKey> \
    --session-token <SessionToken>
<your-role-arn>: AssumeRoleするIAMロールのARN
<your-session-name>: 任意のセッション名
<AccessKeyId>, <SecretKey>, <SessionToken>: 取得した一時的な認証情報
レスポンスには新しい一時的なAccessKeyId、SecretKey、SessionTokenが含まれています。

4. 署名付きリクエストを作成してAPI Gatewayを呼び出す
新しい一時的な認証情報を使って、API Gatewayに署名付きリクエストを送信します。

bash
Copy code
curl -X POST https://your-api-id.execute-api.your-region.amazonaws.com/your-stage/your-resource \
    -H "Authorization: Bearer <IdToken>" \
    -H "Content-Type: application/json" \
    -d '{"key1":"value1", "key2":"value2"}' \
    --aws-sigv4 "aws:amz:us-west-2:apigateway" \
    --aws-access-key <NewAccessKeyId> \
    --aws-secret-key <NewSecretKey> \
    --aws-session-token <NewSessionToken>
<your-api-id>, <your-region>, <your-stage>, <your-resource>: API Gatewayの設定
<IdToken>: Cognitoで取得したIDトークン
<NewAccessKeyId>, <NewSecretKey>, <NewSessionToken>: AssumeRole後に取得した一時的な認証情報
これにより、AssumeRoleとCognito認証を経由して、API Gatewayを介してLambdaを呼び出すことができます。
pythonでgnuradio その25

# 概要
pythonでgnuradioやってみた。
USBトングル、つけてみた。

# 環境
windows11

# USBトングル
DVB-T+DVB+FMと、書いてある水色のやつ。

# ドライバー
zadig-2.9.exe

ユニバーサルシリアルバスデバイス
Bulk-in,interface

以上。