OmniAICreator/Qiita-1.07M huggingface dataset:
CODESYS ラズパイ OPCUA Server

ラズパイにてOPCUA serverを設定して繋ぐ

# client
Ua Expert Version 1.7.1 540

# プログラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/023d8c62-b44a-cbc4-b118-62ba28ab721f.png)

```ruby:変数部分
VAR
	iCount:INT;
	bOnoff:BOOL;
	bUpDown:BOOL:=FALSE;
	iRate:INT:=100;
	iSignal:INT:=1000;
END_VAR
```

```ruby:プログラム部分
iCount:=iCount+1;
//ONOFF
IF iCount MOD 20 = 0 THEN
	bOnoff:=NOT(bOnoff);
END_IF

//Sig
IF iSignal > 11000 OR iSignal < -1000 THEN
	iRate:=iRate*((2*TO_SINT(bUpDown))-1);
	bUpDown:=NOT(bUpDown);
END_IF
iSignal:=iSignal+iRate;

```
なんか動くやつを作っておきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/ac47f5bd-48bd-2f68-2647-9d7e97e6cb1d.png)
シンボルってやつを作ってOPC UA機能をサポートにしておく


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/f5fb52e6-f30c-88c0-c377-66ecd9c18a21.png)
本来であればセキュリティなしで設定し
動かしたかったがなぜか繋がらなかったので
参考URLを見てセキュリティ有で接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/fda9f7ac-5d40-3a6d-629c-23334d2dd10b.png)
接続に成功上がUaExpart下がCODESYS

# 参考URL
https://www.unified-automation.com/products/development-tools/uaexpert.html
https://misoji-engineer.com/archives/opc-ua-security.html
SQL基本操作(集計、副問合せ、結合) 備忘録

# はじめに
基本的なデータ操作に関する備忘録です。
細かい構文というより処理の流れを把握できるようにメモしています。

# 集計とグループ化
集計関数を用いて検索結果(かグループ化した場合はグループ毎)に対して集計を行う。
そのためSELECT文の選択する列名、HAVING句、もしくはORDER BY句のみ記述できる。

### 処理の流れ
①もとのテーブルに対して検索をかける&emsp; (where)
②グループ化する&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; (group by)
③グループ毎に集計する&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; (集計関数)
④集計結果に対して絞りこむ&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; (having)
⑤結果表に表示する列を絞りこむ&emsp;&emsp;&emsp;&emsp; (select)

```流れ.sql
select 列名,集計関数         -- 4.グループ毎に集計する
                            -- 6.表示する列を絞りこむ
from テーブル名              -- 1.テーブル指定
where 条件式                 -- 2.行を絞って検索する
group by 列名                -- 3.検索結果をグループで分ける
having 条件式                -- 5.集計結果に対して条件で絞りこむ
order by 列名                -- 7.結果表をソートする
```

# 副問合せ
選択条件の中に別のselect文による検索結果を指定できる。

### 処理の流れ
①内側(カッコ内)のselect文が実行される
②外側のselect文が①の結果を受け取り、選択のための条件とする

```いくつかのパターン.sql
--　一意の値が返る
select 品名,単価
from 商品一覧
where 単価 = (select max(単価)
              from 商品一覧);  -- 単価が最も高い商品とその単価を表示する

update 名簿1
set 氏名 = (select イングリッシュネーム 
            from 名簿2 
            where 名簿1.ID = 名簿2.ID);  -- 同一IDのデータに対して名簿1の氏名を名簿2のイングリッシュネームで更新する

-- 複数の値が返る
select 品番, 数量
from 在庫
where 品番 in (select 品番 
               from 商品一覧 
               where 分類 = '1') -- 分類1のすべての品番の在庫数を表示する

-- 表が返る
select sum(total.数量)
from (select 品番, 数量 
      from 関東在庫 
      where 品番 = '1'
      union
      select 品番, 数量 
      from 関西在庫 
      where 品番 = '1') as total; -- 関東と関西の在庫の合計を表示する

insert into 出荷履歴 (日付, 品番, 数量)
select '2024-08-11', 品番, 数量 
from 出荷履歴 
where 日付 = '2024-08-10'; --翌日データとして前日データをそのままコピーする
```
# 相関副問合せ
### 処理の流れ
①主問合せで1行を取り出す
②①で取り出した1行に対して副問合せで検索が実行される
③主問合せで取り出す行数分①と②を繰り返す
```相関副問合せ.sql
select 品名
from 商品一覧 as S
where not exists (select * 
                  from 在庫 as Z
                  where S.品番 = Z.品番); -- 在庫テーブルに登録されていない商品名を表示する
```

# 結合
結合条件に応じて複数のテーブルをまとめて表示することができる。

### 処理の流れ
左表(from)に対して、右表(join)の内容を条件に応じて繋げ合わせる。
※3テーブル以上を結合する場合、前から順番に結合される
&emsp;&emsp;①左表(from)と右表(最初に出てくるjoin)が結合される
&emsp;&emsp;②①の結果を左表として右表(2番目に出てくるjoin)が結合される

#### 内部結合
・結合条件に合致する行が右表に複数ある場合、左表をコピーして結合する
・結合条件に合致する行が右表にない場合、左表の行を削除して結合する
```内部結合.sql
select S.品名, Z.数量
from 商品一覧 as S
inner join 在庫 as Z
on S.品番 = Z.品番  -- 在庫テーブルに登録されていない品番のデータは結果に出力されない
```

#### 外部結合
・左外部結合(left outer join)では、左表に対して右表に結合相手となるデータがない場合、右表の値をNULLに設定した上で左表の全行を結果として出力する。
・右外部結合は上記の逆で、右表は全行が出力される。
```外部結合.sql
select S.品名, Z.数量
from 商品一覧 as S
left outer join 在庫 as Z
on S.品番 = Z.品番  -- 在庫テーブルに登録されていない品番のデータは数量NULLとなるが、品名はすべて出力される。
```

# おわりに
追記したいことがあれば随時更新します。
また、誤りを見つけられましたら報告いただければ幸いです。
yukicoder No.80 四角形を描こう　解説

[問題文](https://yukicoder.me/problems/no/80)

# 解説
まず、縦の長さを$i$と決めうつ。すると、残りの書ける長さは$D-2\times i$となる。
横の長さは大きくすればする方がいいので、横の長さの最大値は$\lfloor \frac{D-2\times i}{2}\rfloor$($\lfloor x\rfloor$とは、$x$以下の最大の整数のこと)。
よって、縦の長さを$i$にしたときの答えは$i\times \lfloor \frac{D-2\times i}{2}\rfloor$となる。
$i$として成り立つ数は$1\leqq i\leqq \lfloor D\rfloor$なので、
```math
\max_{0\leqq i\leqq D}i\times \lfloor \frac{D-2\times i}{2}\rfloor\\
```
が答え。
普通に$i$を全探索すると、実行時間は$O(D)$なので十分高速。
また、数学的に考えると$O(1)$で解けるらしい(割愛)。

# C++での解答例
```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int D,ans=0;cin>>D;
  for(int i=1;i<=D/2;i++)
    ans=max(ans,i*((D-i*2)/2));
  cout<<ans<<endl;
}
```
yukicoder No.79 過小評価ダメ・ゼッタイ　解説

[問題文](https://yukicoder.me/problems/no/79)

# 解説
$L$の大きさごとに人数を求めたいとき、**map**を使うとよい。
ここで、人数を管理するmapの名前を$P$と置く。
mapで都度人数を管理し、任意の$i$において$P_i<P_j$または$P_i=P_j$&$i<j$となる$j$を求めればよい。
さらに、$j$を小さい順にみていけば、$P_i\leqq P_j$が成り立つ$j$として随時更新していけば解ける。
実行時間は$O(N \hspace{2pt}log\hspace{2pt}max(L))$。今回の$N\leqq10^5,L\leqq6$という制約化なら十分高速。
また、今回は$L$が小さいので、vectorで管理するという方法でも$O(N+max(L))$で解ける。($L$が大きいとメモリ容量で死ぬので注意)。
```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int N;cin>>N;
  map<int,int> P;
  for(int i=0;i<N;i++){
    int L;cin>>L;
    P[L]++;
  }
  int ans=0;
  for(auto i:P)
    if(P[ans]<=i.second)ans=i.first;
  cout<<ans<<endl;
}
```
【2024/8/10】インフラ勉強日記

## 勉強した内容
### カーネル
- OSの中核
- CPUやメモリなどのハードウェア制御を行う

### シェル
- カーネルのインタフェースとなっているソフトウェア（ユーザとカーネルの中間）
- コマンド（usr/bin/）を探し出し、カーネルに実行を依頼する

| シェル名 | 特徴 |
|:-:|:-:|
|bash|多くのLinux環境でデフォルトのログインシェルとして使われている|
|zsh|macOSで使われている|

:::note info
ログインシェルの確認コマンド
echo $SHELL
:::

### シェルの役割とカーネル
1. キーボードから入力された、dateという文字列を受け取る（ユーザ>シェル）
1. dateという名前のコマンドを探す（シェル）
1. 見つかったコマンドを実行する（シェル>カーネル）
1. 実行した結果として得られた日時の文字列を画面に表示する（カーネル>シェル>ユーザ）

### ディストリビューション
- カーネルに加えてコマンド群やアプリケーションが含まれたパッケージ

| 系統 | ディストリビューション |
|:-:|:-:|
|Red Hat系|CentOS、RHEL(Red Hat Enterprise Linux )、AmazonLinux2023|
|Debian系|Ubuntn|

### 仮想化ソフトウェア
- コンピュータ上に仮想的なコンピュータ（仮想マシン）を構築できるアプリケーション
- ホストOS：コンピュータのOS
- ゲストOS：仮想マシンのOS

### プロンプト
- 「何かコマンドを入力してください」ということを、シェルが意思表示している記号
- $：一般ユーザのプロンプト
- #：スーパユーザ（root）のプロンプト

## 本日の参考書
https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E7%AC%AC%EF%BC%92%E7%89%88-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B0CW1MW6HB/ref=sr_1_1?crid=216E68GPE5H9E&dib=eyJ2IjoiMSJ9.X04RHOOx-dU_OfHyidFOdTHPNsLDE5Tq1mP93h4lW2Ii099O3dFpcF22XM3ylOvWq5CZ1iykLJ-xVyG3wwRgxg.SQs-4elVvcbM5nezgxry0rN7bY-HOsbRDf2KaP_36IA&dib_tag=se&keywords=%E6%96%B0%E3%81%97%E3%81%84linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8+%E7%AC%AC%EF%BC%92%E7%89%88&qid=1723213361&sprefix=%E6%96%B0%E3%81%97%E3%81%84Linux%2Caps%2C238&sr=8-1
Missing argument for parameter #1 in call。flutterとswiftでのhomewidget作成

flutterとswiftでのhomewidget作成

```
@available(iOS 14.0, *)
struct WidgetEntryView: View {
    var entry: Provider.Entry

    var body: some View {
        if #available(iOS 17.0, *) {
            Text(entry.summaryContent)
                .padding()
                .containerBackground(for: .widget) 
        } else {
            Text(entry.summaryContent)
                .padding()
        }
    }
}
```

これを以下のように修正
```
@available(iOS 14.0, *)
struct WidgetEntryView: View {
    var entry: Provider.Entry

    var body: some View {
        if #available(iOS 17.0, *) {
            Text(entry.summaryContent)
                .padding()
                .containerBackground(.regularMaterial, for: .widget) // 修正箇所
        } else {
            Text(entry.summaryContent)
                .padding()
        }
    }
}
```
エイリアスを利用して開発効率を高めよう！

## はじめに
LinuxやMacでエイリアスを設定する方法について、エイリアスとはなんぞやという話からつらつらと書き連ねていきます。

## エイリアスとは？
シェル内で利用することができる別名のこと

## エイリアスを使うと何が良いか
入力するのが大変なコマンドを省略して入力できるようになるため、開発効率が格段に向上する

## エイリアスの設定方法
1. vi等で自分の利用しているshellのrcファイルを開く
    - 利用しているシェルは`echo $SHELL`で確認できる
2. 以下の記述を追加する
    ```sql
    alias 任意の文字列="エイリアスとして設定したいコマンド"
    
    例
    alias ga="git add"
    ```

1. `source rcファイル`を実行する
2. 設定したエイリアスが利用できたらOK!

shell上でエイリアスコマンドを実行することでも実現できますが、その場合現在開いているシェル上でしか動作しないので、永続化したい場合はrcファイルに記述する必要があります。

ちなみにrcはruncomの略らしいです。

https://www.oresamalabo.net/entry/2020/05/02/235959

## 他の環境でも
別の環境でも利用する場合はdotfilesを作成し、環境設定をどこかに保存しておくと別の環境でもその設定を利用できるため便利です。

また、基本的にエイリアスには自分のよく利用するコマンドを設定するのが良いのですが、他の人が公開しているdotfilesリポジトリを見ることでどのようなエイリアスを設定しているか確認することができます。

## おわりに
エイリアスを利用するのとしないのは、開発効率がかなり変わってくるため、利用するのをお勧めします。
ただ、エイリアスはとても便利ですが、エイリアスがある環境で慣れすぎて実際のコマンドを忘れる可能性があるので注意が必要です。

## 参考

https://qiita.com/ydah/items/18d242b632e5486fe912

https://www.oresamalabo.net/entry/2020/05/02/235959
【JavaScript】モジュールについて

# はじめに
JavaScriptのモジュールについて概要をまとめました。

# モジュール
- 初期のJavaScriptスクリプトは規模の小さなものが多かったが、現在では規模の大きなスクリプトが用いられている
- そのため、スクリプトを分割して必要な時にインポートできるような仕組みが必要となった
- こうしてできたスクリプトのひとまとまりを**モジュール**と呼ぶ
- 実体は、JavaScriptで書かれたファイルである

# インポート
- 　モジュールを使用するには、`import`文を使う
    - ここで、`name`、`draw`、`area`は、モジュール`square.js`の中で定義されている機能の名前である。具体的には、関数、`var`、`let`、`const`又はクラスのいずれかである
    - `from`以降の文字列は、モジュールのファイルパスである。この場合は相対パスで記述されており、この`import`文が記述されたスクリプトのあるディレクトリ内にある`modules`というディレクトリの中に`square.js`というモジュールが配置されている
```js:import文の例
import {name, draw, area} from "./modules/square.js";
```
- `as`を用いて別名を付けることもできる
    - この例では、`square.js`モジュールの`name`という機能を、`squareName`という名前で用いることができる。また、`circle.js`モジュールの`name`という機能を`circleName`という名前で用いることができる
    - この例のように、複数のモジュールで同じ名前の機能が定義されている場合は、それらに別名をつけて判別する
```js:asを用いた例
import {name as squareName, draw, area} from "./modules/square.js";
import {name as circleName, draw, area} from "./modules/circle.js";
```
- モジュールオブジェクト
    - この例では、`module.js`の中にある全てのエクスポートされた機能を取得して、`Module`というオブジェクトのメンバーとして利用できるようにしている
    - 独自の名前空間を持たせるような効果があるため、多くのモジュールを`import`するような場合に名前の衝突を防ぐのに有効
```js:モジュール内の機能をモジュールオブジェクトにインポートする例
import * as Module from "./modules/module.js";

Module.function1();
Module.function2();
```
- インポートされた機能はインポートしたスクリプトの内部からしかアクセスできない
- importとrequireの違い
次のリンク先を参照
https://qiita.com/minato-naka/items/39ecc285d1e37226a283

# エクスポート
- モジュールが持つ機能を外部に提供するためには、`export`文を用いる
    - この例では、`name`及び`draw()`がエクスポートされる
    - エクスポートできるものは、関数、`var`、`let`、`const`又はクラスのいずれかである。例えば、関数内で`export`を使うことはできない
```js:export文の例（MDNからそのまま引用）
export const name = "square";

export function draw(ctx, length, x, y, color) {
  ctx.fillStyle = color;
  ctx.fillRect(x, y, length, length);

  return { length, x, y, color };
}
```
- より便利なエクスポートの方法として、モジュールファイルの末尾に単一の`export`文を置き、その後にエクスポートしたい機能のカンマ区切りリストを中括弧でかこむ方法がある
```js:export文の別の例
export { name, draw, area };
```
- `export`文においても、`import`文と同様な方法で別名をつけることができる

# モジュールの集約
- 依存性の階層が複数になった場合などに、いくつかあるサブモジュールをひとつの親モジュールにまとめて管理を単純化することができる
```js:親モジュール(XYZ.jsとする。)におけるサブモジュールの集約部分の例
export { x } from "./modules/x.js"
export { y } from "./modules/y.js"
export { z } from "./modules/z.js"
```
```js:親モジュール(XYZ.js)を利用するスクリプトにおけるインポート部分の例
import {x, y, z} from "./modules/XYZ.js";
```
# HTMLへの適用
- HTMLページにモジュールを適用するには、`<script>`要素に属性`type="module"`を含める
```html:例
<script type="module" src="module.js"></script>
```
# 参考文献
[MDN JavaScript モジュール](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules)
【SQL】テーブル結合が一生分からないSEのための備忘録

# はじめに
SQLを使い始めて少し経ちましたが、テーブル結合の種類が多くいまいち覚えきれていないため備忘録を残します。
同じような方のお役に立てば幸いです。

# テーブル結合の種類
テーブル結合には以下の種類があります。
|種類|概要|
|---|---|
|内部結合（INNER JOIN）|テーブル間で指定した項目が一致するレコードのみを取得する|
|外部結合（OUTER JOIN）|テーブル間で指定した項目が一致しないレコードも取得する|
|交差結合（CROSS JOIN）|テーブル間の全てのレコードの組合せを取得する|
|自然結合（NATURAL）|項目を指定しなくてもテーブル間で共通する項目で結合して取得する|
|統合結合（UNION）|2つの問い合わせで得られた表を統合して取得する|

ここから先はよく使う内部結合と外部結合について記述します。

# 内部結合（INNER JOIN）
内部結合は、テーブル間で指定した項目が一致するレコードのみを取得します。
例えば、以下のようなSQLクエリがあります。
```
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
```
このクエリは、table1とtable2のidカラムが一致するレコードを結合し、結果として共通するレコードのみを取得します。

実際にテーブルを結合するイメージは以下のようになります。
![内部結合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858088/1b927353-f84e-59d9-9914-ee8552207775.png)

# 外部結合（OUTER JOIN）
外部結合は、テーブル間で指定した項目が一致しないレコードも取得します。
外部結合には、主に以下の3種類があります。
|種類|概要|
|---|---|
|左外部結合（LEFT OUTER JOIN）|左側のテーブルの全てのデータと、右側のテーブルの一致するデータを取得する|
|右外部結合（RIGHT OUTER JOIN）|右側のテーブルの全てのデータと、左側のテーブルの一致するデータを取得する|
|完全外部結合（FULL OUTER JOIN）|両方のテーブルの全てのデータを結合し、どちらか一方に一致するデータも含めて取得する|

## 左外部結合（LEFT OUTER JOIN）
左外部結合は、左側のテーブルの全てのデータと、右側のテーブルの一致するデータを取得します。
例えば、以下のようなSQLクエリがあります。
```
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
```
このクエリは、table1の全ての行と、table2の一致する行を結合し、table2に一致する行がない場合はNULLを返します。

実際にテーブルを結合するイメージは以下のようになります。
![左外部結合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858088/33ff08fc-1adb-eedc-5686-726e4a735b00.png)

## 右外部結合（RIGHT OUTER JOIN）
右外部結合は、右側のテーブルの全てのデータと、左側のテーブルの一致するデータを取得します。
例えば、以下のようなSQLクエリがあります。
```
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
```
このクエリは、table2の全ての行と、table1の一致する行を結合し、table1に一致する行がない場合はNULLを返します。

実際にテーブルを結合するイメージは以下のようになります。
![右外部結合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858088/9e461df8-6f30-93db-e82a-8eca2f6ff08c.png)

## 完全外部結合（FULL OUTER JOIN）
完全外部結合は、両方のテーブルの全てのデータを結合し、どちらか一方に一致するデータも含めて取得します。
例えば、以下のようなSQLクエリがあります。
```
SELECT * FROM table1 FULL JOIN table2 ON table1.id = table2.id;
```
このクエリは、table1とtable2の全ての行を結合し、どちらか一方に一致するデータも含めます。
一致しない部分にはNULLが入ります。

実際にテーブルを結合するイメージは以下のようになります。
![完全外部結合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858088/185802a9-d738-3bbb-c44e-de50f5fecde7.png)

---
以上です。
またなにかあれば追記します。
複数の非同期処理を並列に実行し、非同期関数の結果が返されるまで待機する！~Swift Concurrency: async let~

# はじめに
SNSアプリでユーザーのプロフィールを表示する画面が表示されたとき、ポスト数といいね数が同時に取得されるのではなく、下記の画像のように先にいいね数取得し表示し、ポスト数を取得後表示するようにタイムラグがあるのは不自然ですね。
それを解決するため`async let`を用い、いいね数取得とポスト数を取得を並列して行い、2つとも取得できるまで待機し、同時に画面を更新するという実装にアップデートした方法を紹介したいと思います！


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/99ed461c-d600-eee6-ab6f-ff6cbc844d62.png" width=300>

# async let 使用前

```Swift
func updateMyCounts(userID: String) {
        myPostCount = ""
        myLikeCount = ""
        Task {
            do {
                let likeCount = try await DataService.instance.sumLikePost(userID: userID)
                myLikeCount = String(likeCount)
                let postCount = try await DataService.instance.sumUserPost(userID: userID)
                myPostCount = String(postCount)
            } catch {
                print("Count Error")
            }
        }
    }
```

`sumLikePost`メソッドで取得したいいね数を`myLikeCountString`に代入し、画面にいいね数を表示した後、`sumUserPost`メソッドが実行される直列処理になってしまっているので、いいね数が画面に表示された後、ポスト数が画面に表示されるというタイムラグが発生してしまっています。
# async let 使用後

```Swift
func updateMyCounts(userID: String) {
        myPostCount = ""
        myLikeCount = ""
        Task {
            do {
                async let likeCount = try await DataService.instance.sumLikePost(userID: userID)
                async let postCount = try await DataService.instance.sumUserPost(userID: userID)
                let count = try await [likeCount, postCount]
                (myLikeCount, myPostCount) = (String(count[0]), String(count[1]))
            } catch {
                print("MyCount Error")
            }
        }
    }
```
上記のコードでは`async let`を使用することで、2つのメソッドの呼び出しで、前の呼び出しが完了するのを待たずに並列実行されます。
`await`で2つの非同期関数の結果が返されるまで待機し、2つとも取得できたら`count`配列に格納し、`myLikeCount`と`myPostCount`に代入することで、下記の画像のようにいいね数とポスト数を同時に画面に表示することができました。
`async　let`を使用することで、並列処理を行うことでいいね数とポスト数を取得するスピードも早くなりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/08ef5d8f-13f0-141d-8909-7b0fdc720bdf.png" width=300>
# 参考文献

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/
CODESYS ラズパイ GPIO

CODESYSを触ったことはあるが、ラズパイのGPIOは初めてなのでやってみました。

# CODESYSインストール
プロジェクトを新規作成
参考URLを見てラズパイにランタイムをインストール

# プログラム
動いていることが分かればいいが
LEDなどを持っていない為PWM端子のON電圧をテスターで測定することにした。

グローバル変数を作成
４つ作りましたがBit13だけ個別にONOFFさせました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/64cb82ea-ddac-879d-7431-6f86f7e44979.png)

```ruby:
VAR_GLOBAL
 bGPIO_out_b13:BOOL;
END_VAR
```
プログラム
カウントして反転するだけの簡単なやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/f8dbda98-645d-800e-5e5b-1355ebccf323.png)

```ruby:変数部分
VAR
 iCount:INT;
END_VAR
```

```ruby:プログラム部分
iCount:=iCount+1;
IF iCount MOD 20 = 0 THEN
 GVL.bGPIO_out_b13:=NOT(GVL.bGPIO_out_b13);
END_IF
```
タスクは100msにしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/334d6968-5f7e-4484-a7f1-d3ae7332ed72.png)

GPIOs_A_BでBit13にグローバル変数を割り付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/7eab1979-51ba-d344-ae40-4ac1f5e473d7.png)


パラメーターにてOutputに設定
（動かなくて調べたところ、参考URLを見つけて動かすことができました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/021dd9c8-0eae-2417-cbae-c0553b6e4b30.png)


後はビルドしてログインして運転でGPIO13からONOFFを確認しました！


# 参考URL

https://qiita.com/oofunctionblock/items/75ea902b11c9d8d67baf
https://qiita.com/Erytheia/items/f362a3d68e57cd088713
http://soup01.com/ja/2020/08/08/codesysy-raspberry-gpio/
Figmaの使い方メモ

# 概要
Figmaの基本的な操作を勉強したので、備忘録としてアウトプットしていきます。
今後は、ポートフォリオサイトやアプリケーションのデザインを自身で考えるときに活用していきたいなと思っております。

# 読んで欲しい人
* Figmaの機能をなんとなくさらっと見たい人
* 「これどう使うんだっけ」と迷った時の備忘録で来た人

# 詳細
## Frame
 Frameの中に入れた図形などはFrameと一緒に動く。
 中のコンテンツを触りたい場合は、コマンドを押しながら操作する。

## ショートカット
* 貼り付け
一番上位のFrameはそのままその位置でペーストされる。
スタイルのコピーもできる、「コマンド + option + C」、貼り付けは「コマンド + option + V」
* 移動
スペースキーを押しながら、クリックすると、移動ができる。

## 諸々操作
* 図形の縦横比を保ったまま拡大する
「shift」を押しながら、マウス操作。
* 拡大縮小
メニューのツールバーから「拡大縮小」を押すと、文字の大きさも図形の大きさと比例して拡大縮小する。
* セクション（ファイル整理機能）
複数のFrameがあった場合、そのまとまりに名前をつけることができる。
右クリックでセクション解除することもできる。
右のクリックで「セクション」または「Frame」などに変更できる。
セクションにするとコンポーネントの名前がはっきり見える。
* スライス（左上のアイコン　Frameの選択肢の一つ）
画像などの一部分を切り出しての、エクスポートができるようになる。
* シェイプツール
*図形の挿入からカスタマイズができること
右のツールバーで変形や回転をすることができる。

## パネル
* 等間隔に揃える
![スクリーンショット 2024-08-06 23.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/7d5df453-a882-98c7-656f-0aca4fae9e3c.png)
* レイヤーのパーセンテージで透過が変えられる。
* エフェクトでぼかし図形の作成もできる

## 便利な機能
### オートレイアウト(フレームの一種)
2つのコンテンツを選択して、オートレイアウトを押す（^+shift+A）
例では、ボタンなどに使っている
親フレームを自動的に調整させたい場合は、サイズ調整を「コンテンツを内包」にしておかないといけない。（内包は自動調整）
コンテナに合わせて拡大は、コンテナに合わせて、文字が調整される

**【フレームとの違い】**
オートレイアウトには制約はない。
制約を左右にするとコンテナに合わせて拡大ができる。各コンテンツに設定する必要がある。
オートレイアウトは、コンテンツを拡大縮小してもコンテンツ同士をよしなに調整してくれる。

### コンポーネント
ボタンのコンテンツを選択して、右クリック「コンポーネントの作成」を選択する。
複製し、原本を修正すると、同じように複製したものも変わる。
コンポーネントは別のセクションでまとめておくと良い。
複製したものをインスタンスと表現する。

**【バリアント】**
ヘッダーの真ん中左のアイコンをクリック。
バリアントを作った後は、複製うまくできないので、左上の図形アイコンから、使用したコンポーネントを選び、使用する。
または、複製したものを複製する。
複製した後、個々のコンテンツに独自のスタイルを施すことができ、そのスタイルをつけた後は、そのスタイルに関しては、親を変更しても変更されない。（独自で変更していない部分は親と一緒に変更される。）

## スタイル
サイドバーの塗りなどの4つの点を押して、+ボタンを押すと、カラーに名前をつけることができる。

## マスク
画像を図形の形に切り抜きすること。
画像と図形を表示させる。
画像を図形の上にする（右サイドバーの表示で上にする）
画像と図形を両方選択した状態で右クリックの「マスクとして使用」（コントロール + ⌘ + m）

## プラグインとウィジェット
便利プラグイン
* Unsplash：画像を検索して挿入できる
* iconify：フリー素材のアイコンを使用できる

便利ウィジェット
* TODOリスト：メモ機能

# 最後に
自分なりに使い方等を整理してみました。

## フレーム、オートレイアウト、コンポーネントの使い分け
### 使い分けの指針
大きな構造や画面全体を定義する際はフレームを使用する。
要素間の関係や配置を柔軟に管理したい場合はオートレイアウトを使用する。
繰り返し使用する要素や、一貫性を保ちたい要素はコンポーネント化する。

| 機能 | 目的 | 特徴 | 使用例 |
|------|------|------|--------|
| フレーム | デザインの基本的な構造を作る | • 特定のデバイスやスクリーンサイズに合わせたキャンバスを作れる<br>• 要素をグループ化し、整理するのに役立つ<br>• スクロール動作やオーバーフローの設定ができる | ウェブページ全体、モバイルアプリの画面、カードデザインなど |
| オートレイアウト | 要素間の関係や配置を自動的に調整する | • 要素の追加や削除、サイズ変更時に自動的にレイアウトを調整する<br>• 間隔やパディングを簡単に管理できる<br>• レスポンシブデザインの作成に役立つ | ナビゲーションメニュー、リスト、ボタンのグループなど |
| コンポーネント | 再利用可能なデザイン要素を作る | • 一度作れば、複数の場所で使用でき、一括で更新が可能<br>• バリエーションを作って、異なる状態や種類を管理できる<br>• デザインシステムの構築に不可欠 | ボタン、フォーム要素、ヘッダー、フッターなど |

## Atomicデザインと関連させてみた

### Atoms（原子）
Figmaの機能：主にコンポーネントを使用
例: ボタン、入力フィールド、アイコンなど
実装: 最小単位の UI 要素をコンポーネントとして作成し、バリエーションを設定

### Molecules（分子）
Figmaの機能：コンポーネントとオートレイアウトを組み合わせて使用
例: 検索フォーム（入力フィールドとボタンの組み合わせ）、ナビゲーションアイテムなど
実装: Atoms レベルのコンポーネントを組み合わせ、オートレイアウトで配置を調整

### Organisms（有機体）
Figmaの機能:コンポーネント、オートレイアウト、場合によってはフレームを使用
例: ヘッダー、商品カードのリスト、フォームセクションなど
実装: Molecules や Atoms を組み合わせてより大きな機能ユニットを作成。複雑な場合はフレームを使用

### Templates（テンプレート）
Figmaの機能: 主にフレームを使用し、コンポーネントとオートレイアウトを組み合わせる
例: ページのワイヤーフレーム、レイアウトの基本構造
実装: フレームでページ全体の構造を定義し、その中に Organisms や Molecules を配置

### Pages（ページ）
Figmaの機能：フレームを使用し、すべての要素を組み合わせる
例: 完成したウェブページ、アプリの画面
実装: Templates に実際のコンテンツを適用し、最終的なデザインを作成
Javaで「最長一致数量子、最短一致数量子、強欲な数量子の違い」の動作を確認してみた

# 概要

Javaで「最長一致数量子、最短一致数量子、強欲な数量子の違い」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index11.html

# 実装

以下のファイルを作成しました。
```JSample11_1.java
import java.util.regex.*;

class JSample11_1{
  public static void main(String[] args){
    String regex = "AB+";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher("ABBBC");
    if (m.find()){
      System.out.println(m.group());  // ABBB
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample11_1.java 
$ java JSample11_1 
ABBB
```

# まとめ

何かの役に立てばと。
MVCをレストランに例えてみた

# はじめに
今回はRubyonRailsなどで用いられているMVCというものについて解説していきたいと思います。Railsをはじめ、MVCを採用しているフレームワークは多くあると思います。RailsにおいてはRailsチュートリアルやProgateでも初めの方で解説していることからこの構造を理解しておくことは非常に重要です。今まであまり考えずに使用してきたのであれば、この際詳しく知っておくと良いでしょう。

## MVCとは
ソースコードをそれぞれ
**・モデル（Model）**
**・コントローラー（Controller）**
**・ビュー（View）**

の3つに分割して管理しようという考え方の1つです。それぞれの頭文字を取ってMVCとなっています。


*****
**モデル（Model）**
例えば投稿した人の名前や投稿したテキストなどを保存する際などにデータベースとのやりとりをします。データの登録・更新・削除などの処理を行います。

**コントローラー(Controller)**
モデルにデータ処理の指示を出したり、ビューに画面表示の指示を出したりする指示役です。

**ビュー（View）**
Controllerからレスポンスデータを受け取って画面に表示します。HTMLを構成する見た目の部分です

**※ルーティングとは**
MVCの頭文字には入っていませんがルーティングも重要な役割を果たしていますので覚えておくと良いでしょう。主にリクエストが来たときにどのコントローラーのどのアクションを呼び出すのかを設定します。

![MacBook Air - 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/298d1dd0-02a0-d0f4-6f07-7b91f8c0d504.png)




## MVCをレストランに例えると・・・・

と、ここまでは調べるとこんな流れで書かれていると思いますが、ここでちょっとMVCというやつをレストランで例えてみましょう。下の図になります

![MacBook Air - 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/56db03ae-6e5a-8900-a0a5-208df06b97b6.png)


## MVCを採用する理由は？

ズバリ、役割分担がしやすいからです

レストランでも1人で接客して、料理を取り出して、料理を作って、料理を渡して、さらに皿洗い・・なんてなると大変ですよね。小さい個人店なら実際にあり得ますが多くの顧客を迎え入れようとすると1人でのルーティンは難しそうです。ゆえに店長は全体の流れを見て人を動かす、シェフは料理を作る、洗い場の人は洗うことに専念するなどの役割分担が効率的ですよね。

MVCでも同じようにビューの部分はデザイナーに任せ、モデルとコントローラーの部分をエンジニアに任せるなどの分業がしやすいのが特徴です。


## おわりに

いかがだったでしょうか？MVCの流れを理解しておくとRailsをやっていくうえで今自分が何をやっているのか、エラーがどこで出ているのか把握しやすくなると思います。Rails初心者の方は是非この流れを覚えておくと良いでしょう。
テスト110

```vb

Public Sub Search_Image()

Dim obj As Variant

With ThisWorkbook.Sheets("テストA")

    For Each obj In .Shapes
    
        If obj.Type = msoPicture Then
            'シート内にあるオブジェクトが画像であれば終了
            MsgBox obj.Name
            Exit Sub
            
        End If
    
    Next obj
    
End With

End Sub
ubuntu 24.04 LTSで自宅サーバー構築（Sambaの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install samba
taisuke@ubuntuserver:~$ sudo mkdir /home/share
taisuke@ubuntuserver:~$ sudo chmod 777 /home/share
taisuke@ubuntuserver:~$ sudo vi /etc/samba/smb.conf
[global]
   #25行目 : 追記 (文字コードを設定)
   unix charset = UTF-8
   dos charset = CP932
   #39行目 : コメント解除してバインドするインターフェース変更
   interfaces = 127.0.0.0/8 enp1s0（サーバーのLANのインターフェース名）
   #46行目 : コメント解除
   bind interfaces only = yes
   #100行目 : 確認 (認証不要とする)
   map to guest = bad user
   .....
   .....
   #最終行に追記
   #任意の共有名を設定
[Share]
   #共有フォルダーを指定
   path = /home/share
   #書き込みを許可する
   writable = yes
   #ゲストユーザー (nobody) を許可する
   guest ok = yes
   #全てゲストユーザーとして扱う
   guest only = yes
   #ファイル作成時のパーミッションを [777] とする
   force create mode = 777
   #フォルダー作成時のパーミッションを [777] とする
   force directory mode = 777 
   taisuke@ubuntuserver:~$ sudo systemctl restart smbd
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
【基礎から】PythonでExcel扱えるようにする（4）テキストデータの読み込み

## 目的
テキストファイルから定型部分の取り込みをできるようにする。

## step5:テキストファイルの読み込み
```python:
def step05():
    print("step05")

    # テキストファイルオープン
    with open('./lifedata_man_2023.txt', encoding='utf-8') as f:
        # 1行読み込み（先頭行）
        line = f.readline()
        while line:
            # 1行のデータを表示（改行部分を除く）
            print(line.rstrip("\n"))
            # 次の行を読み込み
            line = f.readline()   

# 動作部 
step05()
```

#### 動作結果（terminal）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176596/1ac3c847-e16d-51d5-cf60-f9f46540085c.png)

#
[本編へ戻る](https://qiita.com/YossyIto/items/ae822beb7350338e89fb)

### 履歴
2024/08/10 新規作成 

### リンク
[1] 生命表 2023年 男
https://www.mhlw.go.jp/toukei/saikin/hw/life/life23/dl/life23-06.pdf

### eof
Ubuntuのディレクトリ名を英語に戻す方法

Ubuntuを日本語でインストールした後、ホームディレクトリの名前が日本語（例: ドキュメント、ダウンロード）になってしまうことがあります。しかし、開発や他の操作で英語名（例: Documents、Downloads）を好む場合、ディレクトリ名を英語に戻したいと思うでしょう。この記事では、その方法を詳しく説明します。

## 開発環境
```
仮想環境: UTM
OS: Ubuntu24.04
```


## 1. LANGとLANGUAGEの設定
まず、システムのロケール設定を確認します。これにより、システムがどの言語設定で動作しているかがわかります。

```bash
locale
```

もし、`LANG` が `ja_JP.UTF-8` に設定されている場合、システム全体で日本語が使用されています。この設定を英語`（en_US.UTF-8）`に変更します。

### ロケールの確認とインストール
英語のロケールがインストールされているか確認します。

```bash
locale -a
```
`en_US.UTF-8` が表示されない場合、以下のコマンドでロケールを生成します。

```bash
sudo locale-gen en_US.UTF-8
```

## 2. ディレクトリ名の変更
次に、ディレクトリ名を英語に戻します。以下のコマンドを実行してください。

```bash
LANG=C xdg-user-dirs-gtk-update
```

このコマンドを実行すると、ディレクトリ名を英語に変更するかを尋ねられます。**「Update Names」** を選択すると、ホームディレクトリ内の標準ディレクトリが英語に戻ります。

## 3. ~/.config/user-dirs.dirs の編集
設定が反映されない場合や、手動で確認したい場合は、`~/.config/user-dirs.dirs` ファイルを編集します。

```bash
nano ~/.config/user-dirs.dirs
```
ファイル内のディレクトリ設定をすべて英語名に変更し、保存します。

```plaintext
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
```

## 4. ロケール設定の変更
ロケール設定を英語に変更するため、以下のコマンドを実行します。

```bash
sudo update-locale LANG=en_US.UTF-8 LANGUAGE="en_US:en"
```
`LANGUAGE` の部分をダブルクオートで囲むことで、システムが正しく認識します。

## 5. 再起動
最後に、システムを再起動して、設定が反映されているか確認します。

```bash
sudo reboot
```
【ChatGPT＋Code Interpreter】で文字列が落ちてきて逃げていくアニメGIFです。


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

　今回は、文字列が落ちてきて逃げていくアニメGIFです。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::

　まずは、ニュース。

　動画生成AIのRunwayに
　　iOSアプリが登場。

　[Runway公式ポスト](https://x.com/runwayml/status/1821901294744764764?t=G1WIQA7Az97KRIIMHN5M5g&s=19)
***
　さて、本題です。

　今回は、
　　文字列が落ちてきて
　　　逃げていくアニメGIFです。

　出来上がりがこちら。
![falling_text (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/13990d61-4450-c7e2-5a54-6940d4e7383b.gif)

　Promptがこちら。
```Text:
# CodeInterpreterで文字列処理

### 初期設定
1. 画像のサイズ: `width = 512`, `height = 512`
2. 背景色: `bg_color = (255, 255, 255)` （白）
3. テキスト: `text = "I am a ChatGPT."`
4. テキストの色: `text_color = (0, 0, 0)` （黒）
5. フォントサイズ: `font_size = 48`
6. フォントパス: `font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"`
7. フレーム数: `frames = 60` （1秒あたり30フレーム）

### 注意事項
コード不要。
確実に実行せよ。

### 処理内容
1. 白い正方形画像を作成する。
2. 画像中央にテキストを描画する。
3. [文章が上から落ちてくる。底に着いたら、落下と同じ速度で、左に文字列が消えていく]アニメーションGIFを作成する。
    - 各フレームにおけるテキストの位置を計算して配置する (`x`, `y`)
4. GIFを保存する (`gif_path`).
```

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

　今回は、ここまで。
ubuntu 24.04 LTSで自宅サーバー構築（ProFTPDの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install proftpd-core
taisuke@ubuntuserver:~$ sudo vi /etc/proftpd/proftpd.conf
#11行目 : 必要なければ [off] に変更
UseIPv6 off
#17行目 : サーバー名変更
ServerName "ご自分の構築するサーバーのドメイン名"
#39行目 : コメント解除 (chroot のルートディレクトリ指定)
DefaultRoot ~
taisuke@ubuntuserver:~$ sudo vi /etc/ftpusers
#FTP 接続を禁止するユーザを 1 行ずつ記載
test
taisuke@ubuntuserver:~$ sudo systemctl restart proftpd
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
Terraformと生成AIでAWSインフラ構成図を自動生成する方法

このガイドでは、Terraformの状態ファイルを解析して、AWSインフラストラクチャの構成図を自動生成する方法を説明します。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">TerraformのAWSの構成図を可視化してみる④<br>DiagramsでPythonスクリプトをLLMに書かせてみた！<br>カスタマイズ性は向上するけど精度が。。。 <a href="https://t.co/UwpA8jKdYH">https://t.co/UwpA8jKdYH</a> <a href="https://t.co/kJTcG2XG4d">pic.twitter.com/kJTcG2XG4d</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1822140550314631535?ref_src=twsrc%5Etfw">August 10, 2024</a></blockquote> 

## 概要

1. LLM（大規模言語モデル）を使用して`aws_terraform_visualizer3.py`スクリプトを生成
2. 生成されたスクリプトを実行してAWS構成図を作成

## 手順

1. 以下の情報をプロンプトとしてClaude 3.5 Sonnetなどのモデルに入力します：
   - `main.tf`ファイルの内容
   - `terraform.tfstate`ファイルの内容
   - https://diagrams.mingrammer.com/docs/nodes/aws のURL

2. LLMに`aws_terraform_visualizer3.py`スクリプトの生成を依頼します。

3. 生成されたスクリプトを`aws_terraform_visualizer3.py`として保存します。

4. 以下のコマンドでスクリプトを実行します：
   ```
   python aws_terraform_visualizer3.py
   ```

5. 生成された`aws_ec2_infrastructure3.png`ファイルで構成図を確認します。

## 注意事項

- 生成された構成図はあくまで参考程度です。実際のインフラストラクチャと完全に一致しない場合があります。
- このプロセスは機械的に行われるため、生成された図の正確性を必ず人間が確認する必要があります。
- 実際のプロジェクトでは、手動でのレビューと調整が重要です。

## メリット

- Terraformの状態を視覚化することで、インフラストラクチャの理解が容易になります。
- 構成図の作成プロセスを自動化することで、時間を節約できます。

この方法を使用することで、AWSインフラストラクチャの概要を素早く把握できますが、詳細な設計や重要な決定には、必ず手動での確認と専門家の判断を伴うようにしてください。

## リポジトリ

https://github.com/Sunwood-ai-labs/aws-terraform-sandbox/tree/main/sandbox/s03_ec2_aws_visual

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【基礎から】PythonでExcel扱えるようにする（3）セルへのアクセス 

## 目的
OpenPyxlでセルへのデータ更新ができるようにする。

## step1:新規ワークブックの作成
```python:
import openpyxl

def step01():
    print("step1")

    # Excelファイルの新規作成
    wb = openpyxl.Workbook()

    wb.save('input_file_step01.xlsx')
    wb.close()

# 動作部 
step01()
```

#### 動作結果（エクセルファイル：input_file_step01.xlsx）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176596/b6d03928-054c-38dd-78ca-5ea3e20c260f.png)


### シートでの座標関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176596/beefc2d3-d170-b64c-2bfd-108c3039ba0b.png)

## step2:セルの値の更新
```python:
import openpyxl

def step02():
    print("step02")

    # Excelファイルの新規作成
    wb = openpyxl.Workbook()
    # ワークシートの取得 （デフォルトでは"Sheet"が作られる）
    ws = wb["Sheet"]

    # セルに値の入力 cell(row,column)
    # セルの位置は、縦=row ,横=col
    ws.cell(1,1).value = "test"
    ws.cell(1,2).value = "あああ"
    ws.cell(2,1).value = "いいい"
    ws.cell(row=1, column=3).value = "ううう"

    wb.save('input_file_step02.xlsx')
    wb.close()

# 動作部 
step02()
```
#### 動作結果（エクセルファイル:'input_file_step02.xlsx'）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176596/ff4a2b80-acf3-f6b0-2248-8d2009487aad.png)


## step3:セルの取得
```python:
import openpyxl

def step03():
    print("step03")
    # Excelファイルの読み込み
    wb = openpyxl.load_workbook('input_file_step02.xlsx')
    ws = wb["Sheet"]

    # 最大行、最大列
    print("max_row:", ws.max_row)
    print("max_col:", ws.max_column)

    for r in range(1, ws.max_row+1):
        for c in range(1, ws.max_column+1):
            data = ws.cell(r,c).value
            print("r=", r, "c=", c, ",data=", data)

    wb.close()

# 動作部 
step03()
```
#### 動作結果（terminal）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176596/4a475f9a-6646-8369-40c2-98ac74571684.png)

## step4:セルの代入2
```python:
import openpyxl

def step04():
    print("step0")

    # 配置するデータ配列
    table_num = [1,2,3,4,5]

    # Excelファイルの新規作成
    wb = openpyxl.Workbook()
    ws = wb["Sheet"]

    # 縦に配置
    num_row = 1
    for row_data in table_num:
        ws.cell(num_row,1).value = row_data
        num_row += 1

    # 横に配置
    num_col = 1
    for col_data in table_num:
        ws.cell(10,num_col).value = col_data
        num_col += 1

    # 保存
    wb.save('input_file_step04.xlsx')
    wb.close()

# 動作部 
step04()
```
#### 動作結果（エクセルファイル:'input_file_step04.xlsx'）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176596/13d4b5e6-992d-3556-5f38-17379afd579d.png)



#
[本編へ戻る](https://qiita.com/YossyIto/items/ae822beb7350338e89fb)

### 履歴
2024/08/10 新規作成 

### eof
wslでmanim

# 概要
wslでmanimやってみた。
開発環境構築編。

# 環境
windows11
wsl(wsl2じゃない)
ubuntu 22.04

# 手順

```
>sudo apt update

>sudo apt install build-essential python3-dev libcairo2-dev libpango1.0-dev ffmpeg

>sudo apt install python3-pip

>pip3 install manim


```

# サンプルコード

```
from manim import *

class Test(Scene):
	def construct(self):
		func = lambda pos: np.sin(pos[0] / 2) * UR + np.cos(pos[1] / 2) * LEFT
		stream_lines = StreamLines(func, stroke_width=2, max_anchors_per_line=30)
		self.add(stream_lines)
		stream_lines.start_animation(warm_up=False, flow_speed=1.5)
		self.wait(stream_lines.virtual_time / stream_lines.flow_speed)




```

# コンパイル手順

```
> export PATH=/home/****/.local/bin:$PATH

> cd project

> manim test0.py -ql -i


```

# 成果物

![Test_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/39461991-3b99-f7be-e3d1-d3f9fa1e9acb.gif)

# 追加インストール

```
sudo apt install texlive texlive-latex-extra texlive-fonts-extra texlive-latex-recommended texlive-science tipa
```


以上。
Android クイック設定タイル開発 使える物を作ってみよう その1

# はじめに
- [こちら](https://qiita.com/stranger396/items/d001172004755cd8c65a)の記事で紹介した、最小限タイルをカスタマイズしていきます。
:::note warn
この記事は、断片的に役立つ人間もいるだろうとの考えの下、「筆者の筆者による筆者のためのタイル」の開発過程を共有するものです。
:::

# 完成イメージ
- タップしたときにダイアログが表示され、ディスプレイの輝度を数パターンから選んで変更するタイルを目標とします。
- イメージが近いのは、インターネットの設定を行うタイルです。それのダイアログで選択するものがWiFiアクセスポイントではなくディスプレイ輝度になっているようなものをイメージしています。

# 本記事の範囲
- ユーザーがタイルをタップしたときに、あらかじめ決められたディスプレイ輝度に変更するところまでを実験します。

# 手順
1. AndroidManifest.xmlにて、システム設定の変更権限を要求します。
1. TileServiceを継承したクラスの*onClick*にタップしたときの動作(ディスプレイ輝度変更)を追加します。

# AndroidManifest.xmlの修正
以下を追加して、本アプリがシステム設定を変更する権限が必要であることを示します。

```xml:AndroidManifest.xml
    <uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
```
:::note warn
システム設定を変更する権限を要求する仕組み(ダイアログを出す等)は、本記事では取り扱いません。
動作確認をする場合は、本体設定のアプリの項目から、本アプリに変更権限を与えてください。
:::

# ディスプレイ輝度変更動作の実装
後々のことを考えて、希望の輝度を引数とする関数として実装します。
以下を、TileServiceを継承したBrightnessSwitchTileServiceに追加し、onClickから呼び出します。

```Kotlin:BrightnessSwitchTileService.kt
    fun BrightnessChange(brightness: Int): Boolean
    {
        val cr = applicationContext.getContentResolver()
        var ret = false
        runCatching {
            Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brightness)
        }.fold(
            onSuccess = {
                Log.d("test","true")
                ret = true
            },
            onFailure = {
                Log.d("test","false")
            }
        )
        return ret
    }
```

:::note warn
輝度0はなく、引数は1以上の整数にしなければならないようです。
:::
:::note
輝度変更は、権限がない場合、失敗します。
将来的に、権限がなかったときに何かしたくなるかもしれないので、戻り値として成功か失敗かを返すようにしています。
:::

# 動作確認
- タイルをタップして固定輝度に変更できるはずです。
- 権限があるときとないときで、動作が変わるはずです。ログで確認できます。

# 次回
- 次の記事を書いたらリンクを貼ります。
CODESYS環境の作成

# 環境
CODESYSをインストールしたので環境をメモしておく

Windows 11 Home  23H2
(Ryzen 7 1700 Ram 16GB)
CODESYS V3.5 SP20 Patch2 (64Bit)

# Windows
古いPCを引っ張り出してきてWindows10から11にした。
CPUが古かったのでMicrosoftに記載のレジストリを変更して回避
うまくインストールできなかったのでマザーボードのメーカーを調べて
Windows11対応のバージョンにBIOSアップデート後、
BIOSの設定をデフォルトに戻すことでWindows11に変更できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/a7f7e836-c521-68f4-31c8-055e28148072.png)

# 参考URL1
https://support.microsoft.com/ja-jp/windows/windows-11-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-e0edbbfb-cfc5-4011-868b-2ce77ac7c70e
https://www.asus.com/microsite/motherboard/ASUS-motherboards-Win11-ready/



# CODESYS
最新の物をダウンロードしてインストールした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/7d7110a5-68c8-cb77-3ebd-d3406dcbc549.png)
下記のパッケージもいるようなのでインストールした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/7d02dec7-2320-35d1-d41c-7e24793d6f84.png)

# 参考URL2
https://qiita.com/oofunctionblock/items/75ea902b11c9d8d67baf
[ webpack ] sass-loader v16で、Sass JavaScript APIが切り替わりました

## はじめに

この記事は、sass-loader v16.0.0で導入されたSass JavaScript modern optionsについての解説と、その移行方法について共有するためのものです。

### 対象とする読者

- webpackを利用している
- sass-loaderを利用している
- sass-loader v14以前を利用している
- sass-loader v16.0.0への移行を検討している

### 対象とする環境

- node.js v20.16.0
- webpack v5.83.0
- sass-loader v16.0.0

## sass-loader v16.0.0での変更点

2024/07/26にリリースされたsass-loader v16.0.0では、Sass JavaScript modern optionsがデフォルトで有効になりました。
v14まで利用されていたオプションは、Legacy optionsと呼ばれるようになります。
Legacy optionsは引き続き利用可能ですが、将来的には廃止される予定です。

### sass-loaderにおけるdart-sassのoptionsとは？

sass-loaderは、webpackでSassをコンパイルするためのローダーで、内部的にdart-sassなどのSassコンパイラを利用しています。
sass-loaderは`webpack.config.js`からdart-sassを設定するためのオプションを提供しています。

```js
module.exports = {
  module: {
    rules: [
      {
        test: /\.s[ac]ss$/i,
        use: [
          "style-loader",
          "css-loader",
          {
            loader: "sass-loader",
            options: { // ここがdart-sassに渡されるオプション
              ...
            },
          },
        ],
      },
    ],
  },
};
```


### dart-sassのモダンオプションとレガシーオプション

dart-sassは現在v2へのアップデートが進められています。レンダリング関数はv1のrender()からv2のcompile()に差し替えられます。

[modern options](https://sass-lang.com/documentation/js-api/interfaces/options/)
[legacy options](https://sass-lang.com/documentation/js-api/interfaces/legacystringoptions/)

modern optionsはcompile()関数の引数、legacy optionsはrender()関数の引数に対応しています。

## 移行方法

v14までのsass-loaderを利用しているユーザーが、v16に移行する際には、以下の2つの方法があります。

### レガシーオプションを有効にする

sass-loaderのオプションに`api: "legacy"`を指定することで、レガシーオプションを有効化します。

```js
{
    loader: "sass-loader",
    options: {
        api: "legacy", // レガシーオプションを有効にする
    },
},
```

レガシーオプションはdart-sass v2で廃止される予定です。

### モダンオプションに切り替える

レガシーオプションとモダンオプションは直接対応する項目がありません。それぞれの設定に合わせて移行方法を調査する必要があります。

一例としてincludePathsの移行方法を示します。

```js
{
    loader: "sass-loader",
    options: {
        api: "legacy",
        includePaths: ["node_modules/bootstrap/dist/css"]
    }
}
```

`includePaths`はsassの`@use`インポートパスを省略するためのオプションです。上記の例ではbootstrapのインポートパスを指定しています。

モダンオプションには`includePaths`に直接対応する機能はありません。代替として`Package Importer`という新機能が提供されています。

https://sass-lang.com/blog/announcing-pkg-importers/

```bash
npm i -D sass-embedded
```
まず最初に[`sass-embedded`](https://github.com/sass/embedded-host-node)をインストールします。このパッケージはsassをDart実装です。モダンオプションに対応しており、また動作速度が向上しています。

```scss
@use "pkg:<パッケージ名>"; //対象パッケージのpackage.jsonで、exportsフィールドが指定されている場合
@use "pkg:<パッケージ名>/build/bundle.css"; //exportsフィールドが指定されていなくても、パッケージ内のファイルを呼び出せる
```

sassファイル内で`@use "pkg:<パッケージ名>"`を呼び出せば、npmパッケージ内のスタイルファイルをインポートできます。
Package Importerはsass-loderとsass-embeddedの組み合わせではデフォルトで有効化されており、`webpack.config.js`で設定は不要です。`includePaths`は削除します。

modern optionsへの移行について、現状ではマイグレーションガイドがありません。最新情報を確認したい場合はsassの公式Blogを参照してください。

https://sass-lang.com/blog/

以上、ありがとうございました。
Transformer ExplainerでTransformerの仕組みを視覚的に理解しよう

## 概要
Transformerモデルの動作を深く理解したい方に向けて、[Transformer Explainer](https://poloclub.github.io/transformer-explainer/)というインタラクティブツールをご紹介します。このツールを使えば、GPT-2の動作を視覚的に確認でき、Transformerアーキテクチャの核心である「注意メカニズム」を直感的に理解することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/850f8138-dd56-ef82-bfb9-23bc9c08cd08.png)

## 特徴
- **入力テキストの分析**: 任意のテキストを入力し、モデルの予測プロセスをリアルタイムで観察可能。
- **注意メカニズムの可視化**: Transformerの注意メカニズムがどの単語に注目しているかを詳細に視覚化。これにより、モデルがどのようにコンテキストを理解し、次の単語を予測しているかがわかります。
- **出力確率の解析**: 出力された単語の確率分布を確認し、生成されたテキストの信頼性を評価。

## 使い方
1. ツールページにアクセス。
2. テキストを入力し、Generateボタンを押下して分析開始。
3. 注意メカニズムの可視化や出力確率の確認を行い、モデルの動作を探索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c772714b-0a0b-a36d-f217-4167ebc93ae2.png)

## Transformer Explainer 画面の説明

### 1. テキスト入力エリア (左上)
- **説明**: ユーザーが入力したテキストを基に、Transformerモデルが次に予測する単語や注目する部分が表示されます。

### 2. Embedding (左側の列)
- **説明**: 各単語が数値ベクトルに変換されるステップを表示しています。この変換は、モデルがテキストを理解するための初期ステップです。

### 3. Multi-head Self Attention (中央)
- **説明**: モデルがどの単語に注目しているかを視覚化します。複数の「頭」(ヘッド)を使って異なる視点から文脈を捉え、次の単語を予測します。

### 4. Attention マトリックス (中央右)
- **説明**: 各単語が他の単語にどの程度注目しているかを示すマトリックスです。色の濃淡で注目度が表現されます。

### 5. MLP (右側の列)
- **説明**: Attentionの出力をさらに処理し、次のステップで使う情報に変換します。この処理により、より精緻な予測が可能になります。

### 6. 出力確率 (右端)
- **説明**: 次に生成される単語の予測確率をリスト形式で表示します。これにより、モデルの予測の信頼性を評価できます。

### 7. Temperatureスライダー (右上)
- **説明**: 出力のランダム性を制御するパラメータです。温度を高くすると予測が多様化し、低くすると確実性が増します。

### 8. Generateボタン (右上)
- **説明**: 入力テキストに基づいて、モデルが次の単語を生成します。ユーザーはリアルタイムで生成結果を確認できます。


## 注意事項
現時点では、入力に日本語を使うと文字化けしてしました。英語のテキストで試すことをお勧めします。

## 可視化することでわかること
Transformer Explainerを使うことで、モデルがテキストのどの部分に注目して次の単語を予測しているのかがわかります。たとえば、文脈の中で特定の単語がどのように影響を与えているかを視覚的に確認することで、モデルの解釈性や信頼性を高めることができます。また、出力確率を分析することで、生成されたテキストがどれだけ妥当であるかの判断も可能になります。

## まとめ
Transformer Explainerは、深層学習におけるTransformerモデルの理解を深めるための強力なツールです。研究者や開発者にとって、モデルの内部動作を直感的に理解するための最適な選択肢と言えるでしょう。

## 参考
もっと詳細を知りたいかたは、以下の動画をチェックしてみてください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/ECR4oAwocjs?si=imGrZCXkZOtBJ9WE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
UIの実現のアイデア

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)



+ [選択リスト フィールドで、回答が「はい」の場合、ユーザーが日付を選択できるようにカレンダーの日付がポップアップ表示されます。たとえば、選択リスト フィールドで「結婚していますか」と尋ねられます。回答が「はい」の場合、ポップアップ カレンダーを表示したいです。  ](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007cmVNU)

:::note
実際にはポップアップではありませんが、これを実現するための優れた標準的な方法は、レコード Lightning ページで動的フォームを使用することです。

1. オブジェクトのLightningページでフィールドセクションを追加します
2. セクションに選択リストフィールドを追加する
3. セクションに日付フィールドを追加する
4. 上記で選択した選択リストの値に基づいて、日付フィールドの条件付き表示を管理します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6b329e20-d845-0de8-4243-5382a55dd941.png)

結果は下記をご覧ください:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/83f2e935-fe24-ea7a-790f-c440c3133e6c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ef6553d3-47ec-534f-43ca-773597d8b814.png)
:::
ASUS ZenFone 2 Laserをバッテリレスで使用する

### 背景
ASUS ZenFone 2 Laserのバッテリは交換可能なバッテリなのですが、バッテリが妊娠して使い物にならなくなって新規に購入する気もなく放置していました。このたび、USB充電器から直接配線して復活させたのでそのメモです。

### 回路は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/e0af6701-c2ca-d23e-a2ce-17a7bb2c4c42.png)

### 用意したダイオード
・整流用ダイオード 100V 2A PS2010R(秋月電子で10個80円のもの）
### 整流用ダイオードを入れている理由
 ・バッテリ電圧が定格3.85VのためUSB充電器(5.0V)の電圧を下がるため
 ・スマホ本体にPCとのUSBケーブルをつないだ時逆流しないようにするため
の２点です。

スマホの内臓バッテリの定格電圧が3.85Vでした。ダイオードのデータシート（仕様）をみると順方向での消費電圧は0.6V-1.2V(1A)、200mA時0.7Vでしたので２個直列して起動確認したところ電圧が低すぎたのか電源オン後、再起動を繰り返したので１個だけにしています。結果、電圧高めになるのですが、モバイルバッテリで使用してみてモバイルバッテリの容量が減るとスマホでのバッテリ容量表示が100%を下回るのでこのままでも大丈夫だろうとみています。
このスマホのバッテリ端子は４端子あり、プラス、マイナス以外にサーミスタのT端子があるはずなのですが、残り２端子のうちどちらかわからなかったので何もせずにしています。おかげでROM側ではバッテリ情報が出力されていなくなっているのですが、気にせず使っています。
ubuntu 24.04 LTSで自宅サーバー構築（Chronyの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install chrony
taisuke@ubuntuserver:~$ sudo vi /etc/chrony/chrony.conf
#20行目:必要に応じて デフォルト設定はコメントにして使用したい NTP サーバーを追記
#pool ntp.ubuntu.com        iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
pool ntp.nict.jp iburst
#最終行に追記
allow 192.168.3.0/24
taisuke@ubuntuserver:~$ sudo systemctl restart chrony
#動作確認
taisuke@ubuntuserver:~$ sudo chronyc sources
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
Gradio APIを使ってCurlで画像ファイルを入力して推論を行う


ドキュメントが整っていなかったので手順をまとめました。

参考
How to curl a Gradio App
https://www.freddyboulton.com/blog/gradio-curl

# コードの準備
以下のapp.pyファイルを作成する。
```python
import gradio as gr
from transformers import pipeline

pipe = pipeline(
    task="depth-estimation",
    model="depth-anything/Depth-Anything-V2-Small-hf",
)


def estimate_depth(image):
    return pipe(image)["depth"]


demo = gr.Interface(
    api_name='estimate_depth',
    fn=estimate_depth,
    inputs=gr.Image(type="pil", label="Input Image"),
    outputs=gr.Image(type="pil", label="Estimated Depth"),
    examples=[
        [
            "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
        ]
    ],
    title="Depth Estimation",
)
if __name__ == "__main__":
    demo.launch(
        server_name="127.0.0.1",
        server_port=7870,
    )

```

**ポイント**
APIの入出力形式は、Gradioのインターフェース定義部分`gr.Interface(... inputs=gr.Image(...`で決まる。今回は画像入力となる。


# run Gradio App

```bash
python app.py
```

なお、以下にアクセスするとAPIの呼び出し方の説明が見れる。
http://127.0.0.1:7870/?view=api

# Curl API

カレントディレクトリに深度推定したい画像`0.png`を用意して、Bashから以下のコマンドを実行する。

```bash
__TARGET_URL__=http://127.0.0.1:7870 \
&& curl -s -F files=@0.png "${__TARGET_URL__}/upload" \
| jq -r '.[0]' \
| { read INPUT_FILE_PATH; curl -X POST "${__TARGET_URL__}/call/estimate_depth" -s -H "Content-Type: application/json" -d "$(cat <<EOF
{
  "data": [
    {
        "orig_name" : "0.png", 
        "path": "$INPUT_FILE_PATH"
    }
  ]
}
EOF
)"; } \
| jq -r '.event_id' \
| { read EVENT_ID; curl -s -N "${__TARGET_URL__}/call/estimate_depth/$EVENT_ID" ;} \
| sed -n 's/^data: //p' | jq -r '.[0].path' \
| { read IMAGE_PATH; curl -s -o image.webp ${__TARGET_URL__}/file=$IMAGE_PATH; }
```

成功すると、カレントディレクトリにimage.webpが保存される。

**コマンドの内容**

1. **画像をアップロードする**
   - `curl -s -F files=@0.png "${__TARGET_URL__}/upload"`
   - ローカルのファイル`0.png`を指定されたURLにアップロードし、アップロードされたファイルのパスをJSON形式で取得します。

2. **深度推定リクエストを送信する**
   1. **アップロードされたファイルのパスを抽出して変数に格納する**
      - `jq -r '.[0]' | { read INPUT_FILE_PATH; }`
      - JSONレスポンスからファイルパスを抽出し、`INPUT_FILE_PATH`変数に格納します。
   2. **深度推定リクエストを送信する**
      - `curl -X POST "${__TARGET_URL__}/call/estimate_depth" -s -H "Content-Type: application/json" -d "$(cat <<EOF ... EOF)"`
      - 抽出したファイルパスと元のファイル名を使用して、深度推定のリクエストをサーバーに送信します。

3. **深度推定結果を取得する**
   1. **イベントIDを取得する**
      - `jq -r '.event_id' | { read EVENT_ID; }`
      - 深度推定リクエストのレスポンスからイベントIDを抽出し、`EVENT_ID`変数に格納します。
   2. **イベントIDを使用して深度推定の処理結果を取得する**
      - `curl -s -N "${__TARGET_URL__}/call/estimate_depth/$EVENT_ID"`
      - イベントIDを用いて、サーバーから深度推定の結果（深度画像のパス）をストリーミング形式で取得します。
   3. **深度画像のパスを抽出して変数に格納する**
      - `sed -n 's/^data: //p' | jq -r '.[0].path' | { read IMAGE_PATH; }`
      - 取得したストリーミングデータから深度画像のパスを抽出し、`IMAGE_PATH`変数に格納します。

4. **深度画像をダウンロードする**
   - `curl -s -o image.webp ${__TARGET_URL__}/file=$IMAGE_PATH`
   - 抽出した深度画像のパスを使用して、深度画像を`image.webp`という名前でローカルにダウンロードします。
【TypeScript】interfaceで配列の配列(numberとstring含む)を定義する方法

TypeScriptって難しいなっていつも思う泉（[@izumin_0401](https://twitter.com/izumin_0401)）です。

業務で[Angular](https://traveler0401.com/tag/angular/)を触っているんですが、any型で定義された箇所があったのでinterfaceを作った際の備忘録。

# ブログ記事はこちら

https://traveler0401.com/typescript-interface-array-of-array

# interfaceで配列の配列(numberとstring含む)を定義する方法
```typescript
{
  "unkos": [
    [
      1,
      "大きいウンコ"
    ],
    [
      2,
      "小さいウンコ"
    ],
  ]
}
```
たとえば、上記のような変なデータがあるとします。

```typescript
interface Unkos {
  unkos: (number | string)[][];
}
```
interfaceを定義すると上記のようになります。

意外と簡単だったけど、いつも「あれ、どうするんだっけ？」ってなる...

# まとめ
普段Angularを触っているので、なるべくany型は撲滅していきたい所存。

TypeScriptって奥が深いぜ...

ではまた。

# 最後に
暇つぶしに[Twitter](https://twitter.com/izumin_0401)と[ブログ](https://traveler0401.com/)もやってるので見てね。
[Amazon Web Services]AWS Resource Groupsを使ってアクティブなリソースを検索

これまで試してみたいAWSサービスを好き勝手に個人AWSアカウントを使っていました。
不要なリソース削除のためにアクティブなリソースを一括で知る方法がないかを探していたところ、AWS Resource Groupsを使用すれば簡単に使用中のリソース一覧を取得することができました。

## AWS Resource Groupsを使ってアクティブなリソースを検索
①　Resource Groupsコンソールに遷移
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/8ce31499-f884-87b4-996a-824e105e46a9.png)

②　左ペイン > タグエディタをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/4f26bc55-233d-5564-5d60-49d5a2aac1cb.png)

③　対象リージョンを「すべてのリージョン」にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/282a2197-fd99-a985-faa3-d49f9aede14d.png)

④　検索対象リソースを「すべてのリソースタイプ」にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/482bc8f5-3cac-ed53-c2e3-e0564ad406b5.png)

⑤「リソースを検索」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/9bd4bfd8-9bd3-6241-e01c-504a497d4fb3.png)

⑥　アクティブなリソース一覧の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/96184bb5-e755-34ef-2e76-4ac4c9690321.png)

今まで個人AWSアカウントの整備を疎かにしていたので、
今回のような発見を楽しみつつ、少しずつ整理を進めたいと思います。

owari