OmniAICreator/Qiita-1.07M huggingface dataset:
可変抵抗器とポテンショメータの本質的な違い：知っておくべきこと

<p>エレクトロニクスの世界では、抵抗器は回路内の電流の流れを制御する上で重要な役割を果たしています。その中でも、可変抵抗器とポテンショメータは、抵抗値を調整するために一般的に使用されるコンポーネントです。一見すると似ているように見えますが、これらの特徴や用途の違いを理解することは、電子回路に取り組む上で非常に重要です。</p> <h2>可変抵抗器とは何ですか？</h2> <p><strong>可変抵抗器</strong>は、抵抗値を調整できるタイプの抵抗器です。抵抗値が一定で変更不可能な<a href='https://www.bostk.com/categories'>固定抵抗器</a>とは異なり、可変抵抗器は特定の回路要件に合わせて抵抗値を変更する柔軟性を提供します。この調整は通常、抵抗体に沿ってワイパーを移動させることで行われ、電流が通る経路の長さを変えることで抵抗値が変わります。</p> <p>可変抵抗器はさまざまな形状があり、抵抗値を正確に調整する必要がある回路で使用されます。調整回路、校正デバイスなど、抵抗値の微調整が必要な状況でよく見られます。</p> <h2>ポテンショメータとは何ですか？</h2> <p><strong>ポテンショメータ</strong>は、3つの端子を持つ特定のタイプの可変抵抗器です。2つの端子が抵抗体に接続され、3つ目の端子が可動式のワイパーに接続されています。ポテンショメータのノブやスライダーを調整すると、ワイパーが抵抗体に沿って移動し、抵抗体の両端間で連続した抵抗値の範囲を提供します。ポテンショメータは、音量調整、調光スイッチ、センサーの校正など、頻繁な調整が必要な用途で広く使用されています。</p> <img src='http://media.bostk.com/media/2024/08/dbvr002.png' alt='トリマーポテンショメータ' /> <p>ポテンショメータの3つの端子は、2つの端子を使用して<strong>可変抵抗器</strong>として、またはすべての端子を使用して<strong>分圧器</strong>として使用できます。分圧器として使用する場合、ポテンショメータは入力電圧をワイパーの位置に基づいてより低い出力電圧に分割し、電子回路の多用途コンポーネントとなります。</p> <h2>可変抵抗器とポテンショメータの主な違い</h2> <p>可変抵抗器とポテンショメータの両方が抵抗値の調整を可能にしますが、いくつかの重要な点で異なります：</p> <ul> <li><strong>調整頻度と目的：</strong><br> <strong>可変抵抗器：</strong>通常、製造過程で設定され、調整は一度だけ行われます。その目的は、初期設定や校正中に回路の性能を微調整することです。一度設定されると、調整は恒久的になります。<br> <strong>ポテンショメータ：</strong>ユーザーによる頻繁な調整を目的に設計されています。音量や明るさの調整など、抵抗値を定期的に変更する必要があるユーザーインターフェースで一般的に使用されます。 </li> <li><strong>物理的構造：</strong><br> <strong>可変抵抗器：</strong>通常、外部ハンドルやノブのないシンプルなデザインです。回路基板に直接ハンダ付けされ、ドライバーや類似のツールを使用して調整されます。<br> <strong>ポテンショメータ：</strong>簡単かつ連続的に調整できるようにノブ、スライダー、または回転ハンドルが付いています。デザインはユーザーフレンドリーで、頻繁な操作を意図しています。 </li> <li><strong>用途：</strong><br> <strong>可変抵抗器：</strong>校正回路、センサー補償、またはプリント基板上のトリミング抵抗器など、正確な一回限りの調整を必要とする用途に使用されます。<br> <strong>ポテンショメータ：</strong>音量調整、チューニングダイヤル、消費者向け電子機器のユーザーインターフェースなど、ユーザーの定期的な入力が必要な用途に理想的です。 </li> <li><strong>抵抗範囲：</strong><br> <strong>可変抵抗器：</strong>通常、調整範囲は限定的であり、特定の回路パラメータの微調整に使用されます。<br> <strong>ポテンショメータ：</strong>より広範な調整範囲を提供し、汎用制御アプリケーションに適しています。 </li> <li><strong>サイズと耐久性：</strong><br> <strong>可変抵抗器：</strong>通常、ポテンショメータよりも小さく、頑丈さは劣ります。回路内に恒久的に取り付けることを目的としています。<br> <strong>ポテンショメータ：</strong>大きく、より耐久性があり、繰り返し使用するために設計されています。ポテンショメータは、ユーザーが簡単にアクセスして調整できるパネルに取り付けられることが多いです。 </li> <li><strong>接続端子：</strong><br> <strong>可変抵抗器：</strong>通常、2つの端子があり、配線がよりシンプルなコンポーネントです。<br> <strong>ポテンショメータ：</strong>3つの端子があり、回路設計に応じて可変抵抗器または分圧器として使用できます。 </li> </ul> <h2>用途と使用例</h2> <p><strong>可変抵抗器</strong>は、精度が重要な回路でよく使用されます。例えば：</p> <ul> <li><strong>校正回路：</strong>センサーの読み取り値や回路内の他の重要なパラメータを微調整するために使用されます。</li> <li><strong>調整回路：</strong>周波数応答を調整するためにRF回路で使用されます。</li> </ul> <p><strong>ポテンショメータ</strong>は、ユーザーが設定を調整する必要があるユーザー向けのアプリケーションでより一般的に使用されます：</p> <ul> <li><strong>音量調整：</strong>スピーカーやヘッドホンの音声出力を調整します。</li> <li><strong>調光器：</strong>照明の明るさを調整します。</li> <li><strong>ユーザーインターフェース：</strong>ラジオのチューニングなど、電子機器のさまざまな機能を制御します。</li> </ul> <p>この記事を通じて、可変抵抗器とポテンショメータの違いについてより深く理解していただければ幸いです。それぞれの設計と用途は、さまざまな回路設計で重要な役割を果たします。適切なコンポーネントを選択することで、電子プロジェクトの機能と性能を向上させることができます。</p>
【Python】集計に便利なピボットテーブルを紹介！

Pythonで、よく使う外部ライブラリの「pandas」にピボットテーブルという便利な機能があります。集計の際に使うと便利だな～と思い、今回は、簡単に使い方を紹介したいと思います！！

:::note
集計したい内容
各担当者がどのお弁当を何個売ったか、
そしてそれに伴うお渡し品（マヨネーズ、ソース、しょうゆ）のお渡し数を集計します。
:::

今回は、以下のデータを基に集計を行います。
# **1. データの準備**
まず、提供されたデータを整理して、Pythonのデータフレームに変換します。

``` python
import pandas as pd

# データをリスト形式で整理
data = {
    '日付': [
        '2024-08-01', '2024-08-01', '2024-08-01', 
        '2024-08-01', '2024-08-01', '2024-08-01', 
        '2024-08-02', '2024-08-02', '2024-08-02', 
        '2024-08-02', '2024-08-02', '2024-08-02', 
        '2024-08-03', '2024-08-03', '2024-08-03', 
        '2024-08-03', '2024-08-03', '2024-08-03'
    ],
    '担当': [
        '担当A', '担当A', '担当B', 
        '担当B', '担当C', '担当C', 
        '担当A', '担当A', '担当B', 
        '担当B', '担当C', '担当C', 
        '担当A', '担当A', '担当B', 
        '担当B', '担当C', '担当C'
    ],
    '弁当': [
        'からあげ弁当', '幕の内弁当', 'とんかつ弁当', 
        '幕の内弁当', 'とんかつ弁当', '幕の内弁当', 
        'とんかつ弁当', '幕の内弁当', 'からあげ弁当', 
        'とんかつ弁当', 'からあげ弁当', 'とんかつ弁当', 
        'からあげ弁当', 'とんかつ弁当', 'とんかつ弁当', 
        '幕の内弁当', 'からあげ弁当', 'とんかつ弁当'
    ]
}

# データフレームに変換
df = pd.DataFrame(data)

# お渡し品の対応を追加
df['お渡し品'] = df['弁当'].map({
    'からあげ弁当': 'マヨネーズ', 
    'とんかつ弁当': 'ソース', 
    '幕の内弁当': 'しょうゆ'
})

print(df)
```
# 2. 担当者ごとの弁当販売数の集計
次に、担当者ごとに各弁当の販売数を集計します。

``` python
# 担当者ごとの弁当販売数を集計
pivot_bento_sales = df.pivot_table(
    index='担当', 
    columns='弁当', 
    aggfunc='size',
    fill_value=0
)

print(pivot_bento_sales)
```

# 3. 担当者ごとのお渡し品の集計
同様に、担当者ごとのお渡し品の集計も行います。

``` python
# 担当者ごとのお渡し品の集計
pivot_watashi_sales = df.pivot_table(
    index='担当',
    columns='お渡し品',
    aggfunc='size',
    fill_value=0
)

print(pivot_watashi_sales)
```
# 4. 結果の出力
上記を実行すると、以下のような結果が出力されます。

◆各担当者ごとの弁当販売数の集計結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/3492d0b4-9e55-d557-a808-471cf8d15179.png)

◆各担当者ごとのお渡し品の集計結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/bd7ea1d7-263d-166c-16c3-6fc937e4956d.png)


このようにまとめて集計を行うのにピボットテーブルはとても便利です！
AlacrittyをHotkeyで立ち上げるLauncherを作った

作ったもの↓
[Alacritty-Hotkey-Launcher](https://github.com/Masa-Ryu/Alacritty-Hotkey-Launcher)

# きっかけ
普段はUbuntuかMacを使って開発しているのですが、最近Ubuntuのターミナルの動作がかなり遅くなってきてました。入力数秒後に表示され、遅延がひどい。原因はわからず困ってました。
ChatGPTで代替ツールがあるか聞いたところ、Alacrittyがあることを知りました。
GPUレンダリングを使ってることが特徴のようで、動作はかなり早いです。

リビングで開発をするときはMacBookProを使っており、AlacrittyもiTerm2のようにサクッと起動したいと思い作りました。
※Alacrittyは現時点では、Hotkey対応しない方針が出ているようです。なので、じゃあ自分で付け足そう！とういうことです。

# 要件
- Hotkeyで起動する→まずは、Macと同様、コントロールキー(コマンドキー)２回プッシュで起動させる。
- Hotkey入力した際に、Alacrittyが起動してなければ起動する。
- Alacrittyが起動した状態で、Hotkey入力すると最前面表示する。
- Alacrittyが起動した状態で、最前面表示されている時に、Hotkey入力すると非表示にする。
- 他のWorkspace(仮想デスクトップ)で、Hotkeyを入力した際には、今使っているWorkspaceにAlacrittyを移動させて、上記の動作をすること。
以下は現時点では未実装です。
- Hotkeyを自由に設定できる。
- Mac対応（HammerspoonでもHotkey対応できるが、Alacritty用に作りたい）。
- 常駐化→PC立ち上げたら、自動的にこのソフトが起動しHotkey受付状態にしておきたい。
- 設定を自由にできる→現時点では、Alacrittyの配置場所やタイトルなどが一意に決まってる。
- 設定画面がある。

# できた
Alacrittyと同じく、Rustで書きました。Githubからダウンロードし、
```
cargo run -r
```
と入力すれば、立ち上がります。Hotkey待ち状態になり、コントロールキーを2回0.5秒以内に入力するとAlacrittyが表示/非表示されます。

作ったもの↓
[Alacritty-Hotkey-Launcher](https://github.com/Masa-Ryu/Alacritty-Hotkey-Launcher)

# 困ったこと
自分のUbuntu22.04でしか動作確認できてないです。テストしてみたいのですが、DockerなどではGUI立ち上げられないので、どうやってテストしようか悩んでます。

# 今後
未実装部分を作っていきます。

アイディアやコメント等がありましたら、お願いいたします！
public class Main { public static void main(String[] args) { } }について一つ一つ説明してみた。

https://java-code.jp

# public class Main

### public
これは「公開する」という意味です。このキーワードがついていると、このクラスは他のプログラムからも見えて、使うことができるようになります。言い換えると、publicを使うことで、このクラスが他のプログラムからアクセスできるようになります。
### class
これは「クラス」というものを作るという意味です。クラスは、オブジェクト指向プログラミングの基本で、何かを表す設計図のようなものです。例えば、犬のクラスを作ることで、犬が持つ特徴やできることを定義できます。ここでは、Mainという名前のクラスを作っています。

### Main
これはクラスの名前です。Javaではクラスの名前は自由に決められますが、Mainという名前は特にプログラムの開始地点を示すために使われることが多いです。ここでは、プログラムのメイン（中心）になるクラスを示しています。

### { }
この波括弧は、クラスやメソッドの始まりと終わりを示すために使います。つまり、波括弧の中にクラスやメソッドの内容が書かれます。

## public static void main(String[] args)
この部分はJavaプログラムのスタート地点で、プログラムが実行されるときに最初に呼ばれます。一つ一つのキーワードについて説明します。

### public
さっきと同じく、「公開する」という意味です。このメソッドが他のプログラムやシステムからも見えるようにするために使います。

### static
これは「静的」という意味です。簡単に言うと、このメソッドを使うのにインスタンス（具体的なオブジェクト）を作る必要がないことを示しています。staticを使うことで、クラスそのものから直接呼び出すことができます。

### void
これは「何も返さない」という意味です。このメソッドが何か結果を返す必要がないときに使います。mainメソッドはただプログラムを始めるためのもので、何か特定の値を返すわけではありません。

### main
これはメソッドの名前です。Javaプログラムのエントリーポイント、つまりプログラムが最初に実行される場所です。この名前は特別で、Java仮想マシン（JVM）がプログラムを実行するために最初に探すメソッドです。

### String[] args
これは「文字列の配列（複数の文字列を入れられる箱）」を引数として受け取るという意味です。argsはプログラムを実行するときに外から渡される情報を受け取るために使います。例えば、コマンドラインでプログラムを実行するときに入力する追加の情報がここに入ります。

### { }
この部分はmainメソッドの中身を囲む波括弧です。mainメソッドの中で実行される内容はここに書かれます。

## 全体の流れ
### クラス定義
public class Mainで、公開されたMainという名前のクラスを定義しています。

### メソッド定義
public static void main(String[] args)で、プログラムの実行開始地点となるmainメソッドを定義しています。
### メソッドの中身
{ }の中にmainメソッドが行う処理を記述します。ここには、プログラムが最初に実行する内容を書きます。
## まとめ
### public class Main
プログラム全体の設計図を定義しています。Mainクラスはプログラムの中心となる部分です。
### public static void main(String[] args)
このメソッドは、Javaプログラムが実行されるときに最初に呼び出されるメソッドで、プログラムのスタート地点です。
### { }（波括弧）
クラスやメソッドの内容を囲み、どこからどこまでがそのクラスやメソッドの範囲かを示します。
このように、public class Main { public static void main(String[] args) { } }は、Javaプログラムの基本的な骨組みで、プログラムの開始地点を明示的に指定するための構造です！
EC2でパブリック IPv4 アドレスをつけ忘れた対処方法

### EC2でパブリック IPv4 アドレスをつけ忘れた対処方法
EC2作成時にパブリック IPv4 アドレスをつけ忘れましたが、後から設定できることが出来るので備忘として残します。



### 後からパブリック IPv4 アドレスを付与する方法

1.該当EC2を選択
2.アクション、ネットワーキング、IPアドレスの管理
3.パブリック IP の自動割り当てにチェック
4.保存

これでパブリック IPv4 アドレスが付与できました。
意外と知られておらず、EC2を再作成されていた方もいらっしゃたので備忘で残して起きます。
【ChatGPT＋Code Interpreter】でPDFの連結をします。


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

　今回は、PDFの連結をします。

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

　ニュースはないので、
　　さっそく本題です。

　ふたつのPDFの
　　連結を行ないます。

　ここでは
　　両方とも
　　　日本語の入ったものに
　　　　しました。

　実験的に
　　行なったのですが、
　　　日本語フォントは
　　　　必要ありませんでした。

　では、
　　手順です。

　手順は
　❶GPT-4oであることを確認
　❷ふたつのPDFをアップロード
　　　順番に注意してください。
　❸Prompt入力
```Text:
CodeInterpreterで、このふたつのPDFを結合してください。
コード不要。
必ず実行してください。
```
　❹送信
　❺ダウンロードリンクが表示

　Promptの
　　下の二行は
　　　コードを見せられたくないのと
　　　　解説モードに行かないように
　　　　　というものです。

　PDFファイルの数を増やせば、
　　それだけ結合できます。

　結合が役立つのは
　　おそらく、別々に作成した場合
　　　でしょうね。

　なぜ別々なのか？

　一度にPDFを作成すると
　　途中の処理にハルシネーションが
　　　入り込む余地が生まれやすい。
　　　　こうした経験はないですが
　　　　　なんとなくありそうに
　　　　　　思いました。

　また、
　　一気に作成するには
　　　Promptが複雑になりやすいです。

　　シンプルが一番です。

　　まぁ、
　　　その分だけ時間は
　　　　掛かりますが、
　　　　　正確性を得たいならば
　　　　　　急がば回れ、です。

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

　今回は、ここまで。
Terraformで利用する外部モジュールの参照エラーについて

# はじめに

どうも、@to-fmakです。今回はTerraformで利用する外部モジュールの参照エラーと、その対応方法について共有したいと思います。

# 事象

最近、インフラ変更を適用しようとした際に、次のようなエラーが発生しました。

```txt
│ Error: Failed to download module
│
│   on sample.tf line xx:
│   xx: module "sample" {
│
│ Could not download module "sample-module" (sample.tf:xx) source code from
│ "git::https://github.com/xxxx/xxxx?ref=xxxx":
│ error downloading
│ 'https://github.com/xxxx/xxxx?ref=xxxx':
│ /usr/bin/git exited with 128: Cloning into
│ '.terraform/modules/sample-module'...
│ fatal: could not read Username for 'https://github.com': Input/output error
│ .
```

エラー内容を見る限り、該当モジュール（サードパーティモジュールで、ここではsample-moduleとします）の取得が失敗していたようです。

以下は、問題が発生したtfファイルの一部です。

```hcl:sample.tf
module "sample" {
  source  = "xxxx/sample-module"
  ...
}
```

# 原因

このモジュールは[Terraform Registry](https://registry.terraform.io/browse/modules?page=3)に登録されていたため、Registryのページから該当のGitHubリポジトリを確認したところ、リポジトリが「404」で見つかりませんでした。

おそらく、リポジトリが非公開になったか、削除された可能性があります。このようなケースに遭遇したのは初めてでした。

※2024年8月29日時点で、モジュールが消えた理由は不明です。

# 解決策

考えられる解決策は以下です。

- モジュールの移行先リポジトリを探してみる
  - 開発者が新しいリポジトリに移行している可能性がある、その場合、移行先のリポジトリからモジュールを再度取得できる
- .terraformディレクトリのキャッシュを確認する
  - `.terraform`ディレクトリに以前取得したモジュールのキャッシュが残っている場合がある、キャッシュに残っていたソースコードを利用してモジュールを自作することも可能
- フォークされたリポジトリを探す
  - 他のユーザーがモジュールをフォークしている場合がある、フォークされたリポジトリが存在すれば、そちらからモジュールを取得して利用できる
- 自前でモジュールを作成する
  - 必要に応じて、自分で同等の機能を持つモジュールを一から作成することが最終的な解決策になる

## 急ぎのリリースが必要な場合の解決策

- 適用対象のリソースが少ない場合、terraform apply 時に `-target` オプションを指定して特定のリソースだけを適用することが可能
- -target オプションの利用が難しい場合、`terraform state rm` コマンドで問題が発生したモジュールをStateファイルから削除し、その後、tfファイル内の該当ソースコードをコメントアウトまたは削除することで、対象モジュールをTerraformの管理対象外にすることが可能（必要に応じて後から terraform import コマンドで再度管理対象に追加することが可能）

# 今回の対応

モジュール管理者のGitHubリポジトリには一部のソースコードが残っていましたが、モジュール自体が古いため、今回は新しいプロバイダーを利用し、自前でモジュールを一から作成することにしました。

# 外部モジュール利用時の注意点

今回の経験から、外部モジュールを利用する際には以下の点に注意することが重要だと感じました。

- 依存性管理
  - 外部モジュールに依存することで、モジュールが削除されたり非公開になった場合対応が必要になります。重要なモジュールは、自前で管理するか、forkしておくことを検討すべきではないかと思います

- バックアップ
  - 利用するモジュールのコードをローカル等にもバックアップしておくことで、万が一の場合にも対応できるようになります

# おわりに

今後は、モジュールの選定や管理を慎重に行い、インフラの安定運用に努めたいと思います。

## エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

<https://gakken-leap.co.jp/recruit/>
this.name=name;について解説してみた。Java超入門

https://java-code.jp
# this.name = name;の意味
まず、このコードが何をしているのかを説明します。

### name（右側のname）
これは、外からもらった情報です。例えば、新しい犬を作るときに、その犬の名前を決めるために使います。このnameは、コンストラクタに渡される引数（ひきすう）です。

### this.name（左側のname）
これは、クラスの中で使われているフィールド（変数）です。このnameは、クラスの中でその犬の名前を**保存するため**の場所です。thisを使うことで、「このクラスの中にあるname」という意味を持たせています。

## 具体例で説明
犬を例に考えてみましょう。Dogというクラスを使って新しい犬を作るとき、犬には名前が必要です。this.name = name;というコードは、その犬の名前を決めて、クラスの中に保存するために使います。

コードの例

```java
class Dog {
    String name; // 犬の名前を保存するための箱

    // コンストラクタ：新しい犬を作るときに名前を設定する
    Dog(String name) {
        this.name = name; // 外からもらった名前をこの犬の名前として保存する
    }

    // 犬の名前を表示するメソッド
    void printName() {
        System.out.println("犬の名前: " + name);
    }
}
```

```java
public class Main {
    public static void main(String[] args) {
        Dog dog1 = new Dog("ポチ");
        dog1.printName(); // 出力: 犬の名前: ポチ
    }
}
```

## this.name = name;の具体的な説明
犬を作るとき: new Dog("ポチ")のようにして新しい犬を作ります。このとき、"ポチ"という名前を渡しています。
### コンストラクタでの処理
Dogクラスのコンストラクタが呼ばれます。このとき、nameという引数に"ポチ"が渡されます。

### this.name = name;の役割
この行で、外からもらったname（"ポチ"）を、このクラスのnameフィールドに保存します。this.nameはクラスの中にある名前のことを指していて、右側のnameはコンストラクタで受け取った名前です。

## 簡単なイメージ

### クラスの中の名前を書くノート
this.nameは、犬の名前を書くためのノートみたいなものです。このノートは、各犬ごとに1冊ずつ持っています。
外からもらった名前（name）を書く: this.name = name;は、外からもらった名前をそのノートに書く作業です。
まとめ
### this.name = name;
外からもらった名前を、クラスの中にある名前の場所に保存するためのコードです。
**this**は、「このクラスの中にあるもの」という意味で使います。これにより、外からもらったnameと区別することができます。
このように、this.name = name;を使うことで、プログラムの中で情報をしっかり管理して、正しい場所に保存することができるのです！

# ではString name;との違いは？

### String name;とは？
String name;は、クラスの中で「犬の名前を保存するための箱（変数）」を用意しているという意味です。この箱には文字列（テキストの情報）が入ります。

### String
これは「文字列」という意味です。名前や文章などのテキストを扱うために使います。
name: これは変数の名前です。具体的な犬の名前をここに入れるための場所です。
String name;を使うことで、Dogクラスの各犬に名前を持たせることができるようになります。

## イメージで説明

### ノート
String name;は、犬の名前を書くためのノートを**用意する**ようなものです。でも、まだ何も書かれていません。このノートは、後で名前を書き込むために用意されています。
this.name = name;とは？
this.name = name;は、その用意したノートに実際の名前を書き込む作業です。ここで使われているnameは、コンストラクタに渡された名前です。

### this.name
これは、クラスの中で用意したノート（String name;で作った変数）です。
### name
これはコンストラクタで外からもらった実際の名前です（例えば、"ポチ"）。
this.name = name;は、「ノートに外からもらった名前を書き込む」という意味です。thisを使うことで、「このクラスの中のname変数に」という意味を明確にしています。

## イメージで説明

### ノートに書き込む
this.name = name;は、「ポチ」という名前をノートに書き込むようなものです。ノートを用意しただけでは犬の名前はまだ決まっていないので、ここで実際の名前を記入して、犬に名前を持たせることになります。

まとめ
String name;: これは「犬の名前を入れるための場所（箱）」を用意しています。でも、まだ名前は決まっていません。
this.name = name;: これは、用意した場所に実際の名前を書き込む作業です。nameという引数で外からもらった名前を、this.name（このクラスの中にある名前）に保存します。
paiza.ioでelixir その310

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
16進文字列を数値にせよ。


# サンプルコード

```

Base.decode16!("0001FEFF")
|> IO.inspect

Base.encode16(<<0, 1, 255, 255>>)
|> IO.inspect


Base.encode16(<<0x66, 0x6F, 0x6F>>)
|> IO.inspect


Base.encode16("foo")
|> IO.inspect

Base.decode16!("3F")
|> IO.inspect

Base.decode16("39")
|> IO.inspect


```

# 実行結果

```
<<0, 1, 254, 255>>
"0001FFFF"
"666F6F"
"666F6F"
"?"
{:ok, "9"}
```

# 成果物

https://paiza.io/projects/LM4tgd9z6ap9w9vGLVbk9g

以上。
kaminariの使い方

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## kaminariとは
Railsでページネーションに便利なgem。
大量のデータを効率的に分割し、ページリングされたビューを返す。
gem 'bootstrap5-kaminari-views'と合わせるとスタイリングも簡単にできる。

## 手順
1．gemfileにgem 'kaminari'を書く
2．bundle install
3. サーバーの再起動
4．ターミナルでrails g kaminari:config
5．生成されたファイルに1ページあたりのデフォルトのレコード数を書く。
```config/initializers/kaminari_config.rb
Kaminari.configure do |config|
  config.default_per_page = レコード数
end
```
6.indexアクションでpageスコープを使用。
※requireに(:page)追加を忘れないこと！
```
def index
    @objects = Object.includes(:user).order(created_at: :desc).page(params[:page])
end
```
7. index.html.erbにページネーションするためのヘルパーを使用。

```
<%= render @objects %>
<%= paginate @objects %>
```
renderでデータを呼び出してからpaginateする流れ。
render時点でデフォルト設定のレコード数ずつしか来ないようになってることを忘れずに。
countだとデフォルト設定の数値が返ってくる。
**総数をcountしたいならtotal_countメソッドを使用すること！**
Qiita はじめました


# 祝！初投稿！✨

HillTopです。こんにちは。  
エンジニアとしての経験（=社会人歴）は10年を超えているものの、  
未だに `若手` と呼ばれることに慣れない今日この頃です。  
Qiitaへの投稿によってアウトプットの経験の一つとしていきたい所存です。

# Qiitaを始めた経緯

転職を経てSESの会社に入ったのですが、SESでの案件獲得活動を通して

**取り組みを記事やYoutube動画で発信している職場っていいな**

と思うようになっていました。

幸いなことに、行きたいと感じた現場とのご縁に恵まれましたが、  
今後も行きたいと感じた現場に見合う人材であり続けたいものです。

そこで考えました。  
**記事やYoutube動画を作った募集企業に見合うには、  
自分も職務経歴書やスキルシート以外にポートフォリオを持てばいい。**  
と。

基本的には忘備録としての使い方にはなると思いますが、  
ポートフォリオに使えるような記事もなるべく書いていきたいと思っています。
useRefアンチパターン: クリックしても画面が更新されない

## アジェンダ
現場でReact開発をしている際に、ボタンをクリックしても画面が期待通りに更新されない問題に直面しました。デバッグを進めると、その原因が `useRef` を使っていたことにあると判明しましたので、この件について簡単にまとめます。

## 問題のコード例 (`useRef` 使用)
現場で遭遇したコードは以下の様なコードでした。

```tsx
import React, { useRef } from 'react';

function Counter() {
  const countRef = useRef(0);

  const handleClick = () => {
    countRef.current += 1;
    console.log(countRef.current); // コンソールには更新された値が表示されるが、画面は更新されない
  };

  return (
    <div>
      <p>Count: {countRef.current}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

export default Counter;
```

`useRef` は、コンポーネントの再レンダリングを引き起こさないため、`countRef.current` の値が更新されても画面には反映されません。つまり、UI に影響を与える値を保持するには適していないのです。

## 解決策のコード例 (`useState` 使用)

この問題を解決するために、`useState` に変更しました。

```tsx
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

export default Counter;
```

`useState` を使用することで、状態が変更されるたびにコンポーネントが再レンダリングされ、画面に最新の状態が反映されるようになります。

## useRef の使いどころ
• 再レンダリングを避けたい場合: 例えば、フォームの入力フィールドや DOM 要素に直接アクセスしたいとき、または過去のレンダリング間でデータを保持したいときに使います。
• 例: フォーカス管理

```tsx:
import React, { useRef } from 'react';

function TextInputWithFocusButton() {
  const inputEl = useRef(null);

  const onButtonClick = () => {
    // useRefで作ったrefオブジェクトは.currentプロパティを通じてDOM要素を指す
    inputEl.current.focus();
  };

  return (
    <div>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </div>
  );
}

export default TextInputWithFocusButton;
```
この例では、useRef を使って入力フィールドのフォーカスをボタンで制御しています。ここではレンダリングは不要です。

## useState の使いどころ

•	状態が変更された際に画面を更新したい場合: 例えば、ユーザーが操作することで変更される値（カウンターやトグル状態など）を管理したいときに使います。
•	例: カウンター
上記の Counter コンポーネントがその例です。useState は、ユーザー操作による状態の変更に応じて UI を更新するために使用されます。


## まとめ

この経験から、UI の状態管理には `useState` を、レンダリングに影響しない変数には `useRef` を使うべきだということを改めて認識しました。状況に応じたフックの使い分けが、React 開発において非常に重要です。
vscode: Partial Diff を使う

あれ？これはインストールの必要なし？？

#### 1か所目をエディタでドラッグして選択し、右クリックで「Select text for compare」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/b01eca18-21ae-3f46-5f43-bc20523265ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/5420813d-3f71-3fd1-1611-485786cb0ef6.png)

#### 2か所目をエディタでドラッグして選択し、右クリックで「Compare text with previous section」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/0c1e103e-1ab8-434e-20d7-625999aba3e6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/f7211747-3e80-bfd0-be4d-6b6cd3a713ec.png)

#### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/6a0cc1f5-d855-b17f-2dfa-0341546d50f8.png)
JuliaのPlotsでColorbarの目盛りを扱う（邪道）

# 目的
これをこうしたい。
|変更前|変更後|
|:-:|:-:|
|![test_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/79434ba1-aa32-e99b-0c4a-55d13936f1ad.png)|![test_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/822768b0-c94d-be52-6358-f92ee7e5e8f7.png)|



どうやら、`GR`をバックエンドにした際には、こういったColorbarの目盛りの扱いがうまく機能していないようです（今後直ることを祈りましょう）。。。
そこで、今回は無理やりそれっぽくする方法を紹介します。

# データ
サンプルデータは次のようにしました。
```julia
X = range(-2, 2, length=100)
Y = range(-2, 2, length=100)
Z = [exp(-(x^2+2y^2)/√2) for y in Y, x in X].*10000000
```
意図的に、とても大きな値となるようにしています。

# 通常の場合
heatmapを作成しようと試みると、次のようなコードになるかと思います。
```julia
heatmap_plot = heatmap(
  X,Y,Z,
  c=:bwr,
  size=(500, 400),
  cbar_title="COLORBAR_LABEL",
)
```
しかし、こうすると次のようにColorbarの目盛りの桁数によっていまいちな挙動になります。
![test_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/f7bc319f-18ae-5ffb-88c2-e961b0d3e141.png)


# 邪道な解決法
そこで、今回は別にColorbarを人工的にheatmapでプロットし、それらを`@layout`で並べて再現します。

1. まず、Colorbarのないheatmapを`heatmap_plot`として作成します。
    ```julia
    heatmap_plot = heatmap(
      X,Y,Z,
      colorbar=:none,
      c=:bwr,
    )
    ```
2. 続いて、Colorbarをプロットする`cbar(data)`という関数を作成します。こちらは`data`すなわちZ軸の値をもつデータを入力することで、実質的なColorbarを返してくれます。
    ```julia
    cbar(data,step=100) = begin
      cbar_data = range(minimum(data),maximum(data),step)
      cbar_fig = heatmap(
        [1],cbar_data,
        cbar_data .* ones(step, 1),
        c=:bwr,
        legend=:none,
        xticks=:none,
        yticks=:none,
        formatter=:scientific,
      )
      axes_fig = twinx(cbar_fig)
      plot!(axes_fig,
        [1],cbar_data,
        legend=:none,
        xticks=:none,
        ylabel="COLORBAR_LABEL",
      )
    end
    ```
3. 最後に、これらを`@layout`を用いて結合させます。
    ```julia
    plot(
      heatmap_plot,
      cbar(Z),
      layout=@layout([grid(1, 1) a{0.03w}]),
      size=(500, 400),
    )
    ```

すると次のような図が得られるはずです。
![test_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/822768b0-c94d-be52-6358-f92ee7e5e8f7.png)

# 最後に
邪道な方法ですが、自由度はかなり高いので、いろいろといじりやすいと思います。早く`GR`でも`:scientific`などが使えるようになるといいですね。
[Github Actions] 追加されたIssueを自動で Github Projects に紐付ける

## はじめに
現在参画している新サービス開発では、Github Projects を使って変更管理・不具合管理をしており、管理票を Issue として作成する運用にしています。

その中で
「特定のリポジトリに追加された Issue は、自動で所定の Githubプロジェクトに紐付けてほしい（紐付け忘れるので）」
という要望があり、Github が公式に提供している action を利用してサクッと実現しました。

メモがてらその方法をシェアします。


## 利用する action
Issue・Pull Request（以下、PR） のイベントをトリガーに、それらをGithubプロジェクトに紐づける方法として、Github は以下の action を提供しています。
[actions/add-to-project | Github](https://github.com/actions/add-to-project)

<br />

この action の概要は以下の通り。

* Issue・PRのイベントをトリガーに、Personal access token を利用して得た権限で、指定された Githubプロジェクト に紐づける
* サポートしている Issue・PR イベントは以下の通り
  * Issue
    * `opened`
    * `reopened`
    * `transferred`
    * `labeled`
  * Pull Request
    * `opened`
    * `reopened`
    * `labeled`
* その Issue・PR を処理対象とするかどうかの条件として、**label での条件を設定することができる**
  * 複数のラベルを指定可能。合致条件として `AND` と `OR` を指定できる

<br />

※ `secret.GITHUB_TOKEN` ではダメなのだろうかと思ったが、以下の stack overflow で回答されている通り、権限が不足するためNGでした。

https://stackoverflow.com/questions/77198990/request-failed-due-to-following-response-errors-could-not-resolve-to-a-projec 

それでは、具体的にどう導入するかを以下にご紹介します。

## 導入手順
### Step 1. Personal access token（PAT） を作成する
以下のリンクからPATを作成することができる。
https://github.com/settings/tokens/new

その際、`repo` と `project` の権限が必要となるためチェックをつけておく。


### Step 2. PAT を Repository secrett に登録する
PATを Github Actions から利用できるように、リポジトリの [Settings]->[Secrets and variables] -> [Actions] から Repository secrets に登録する。

より具体的な手順は、以下の Github ドキュメントを参照。
https://docs.github.com/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository

<br />

なお登録する際、 Name を `ADD_TO_PROJECT_PAT` にしておくと、add-to-project の README.md にあるサンプルがそのまま利用できる。


### Step 3. Github Actions のワークフローyamlをリポジトリに追加
対象とするリポジトリの `.github/workflows` に、以下内容を書き換えてyamlファイルとして配置しコミット・プッシュする。

``` yaml
name: Add bugs to bugs project

on:
  issues: # ここを pull_request にすると、PRを対象にできる
    types:
      - opened # 前述のイベントを指定する

jobs:
  add-to-project:
    name: Add issue to project
    runs-on: ubuntu-latest
    steps:
      - uses: actions/add-to-project@RELEASE_VERSION #利用する Release バージョンに書き換える
        with:
          project-url: https://github.com/orgs/<orgName>/projects/<projectNumber> # 紐づけたいプロジェクトのURLをここに反映する
          github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} # Step 2 でシークレットの Name を ADD_TO_PROJECT_PAT にしていたら、そのままでOK
          labeled: bug, needs-triage # label条件を追加する場合、登録する
          label-operator: OR # ANDも指定可能
```

## まとめ
上記の手順で、特定のリポジトリに作成された Issue を、自動で所定のGithubプロジェクトに紐づけることができます。

加えて、Github Projects の Workflows で Item added to project を有効化すれば、初期パイプラインも指定できるのでこちらも設定をオススメします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115077/d1bc1b2e-2b0f-9b6b-2bb3-e5b3e7a445fc.png)
React/Next.jsプロジェクトにCSSモジュールとしてインストール・インポートする方法

## アジェンダ
React/Next.jsプロジェクトにCSSモジュールとしてインストール・インポートする方法について簡単にまとめます。

## 手順
### ステップ 1: `destyle.css` のインストール

まず、npm または yarn を使用して `destyle.css` パッケージをインストールします。プロジェクトのルートディレクトリでターミナルを開き、次のコマンドを実行してください。

```sh
npm install destyle.css
```

または

```sh
yarn add destyle.css
```

これにより、`destyle.css` がプロジェクトに追加されます。

### ステップ 2: グローバルスタイルとして `destyle.css` をインポートする

次に、`destyle.css` をグローバルスタイルとしてインポートします。これを行うために、Next.js プロジェクトのエントリーポイントである `_app.js` または `_app.tsx` ファイルを編集します。

まず、`pages/_app.js` または `pages/_app.tsx` ファイルを開きます。そして、以下のように `destyle.css` をインポートします。

```tsx:pages/_app.js または pages/_app.tsx

import 'destyle.css';
import '../styles/globals.css';  // 他のグローバルスタイルがある場合

function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

export default MyApp;
```

これで、`destyle.css` がプロジェクト全体に適用され、すべてのデフォルトブラウザスタイルがリセットされます。

## 参考
- [destyle.css/destyle.css at master · nicolas-cusan/destyle.css](https://github.com/nicolas-cusan/destyle.css/blob/master/destyle.css)
- [Destyle.css - Opinionated reset stylesheet that provides a clean slate for styling your html.](https://nicolas-cusan.github.io/destyle.css/)
【備忘録】Ubuntu 24.04 LTSにLAMP環境を構築する

# はじめに
ubuntuでサーバーを立てる際にいつも調べてしまうので備忘録として残しておきます。

# まずはいつもの
```
sudo apt update
sudo apt upgrade
```

# apacheインストール
```
 sudo apt install -y apache2
```

 ブラウザで「<foo>http</foo>://localhost」と入力し画面が表示されればおｋ

# MariaDBインストール
```
sudo apt install -y mariadb-client mariadb-server

sudo mysql -u root -p
create user "userName"@localhost identified by 'pass'; //ユーザー作成
grant all on *.* to userName@localhost;//権限追加(すべて)
```
userNameはお好みのものを入れる

# phpインストール
```
sudo apt install -y php libapache2-mod-php php-mysql
php -v

//2024/07/23現在
PHP 8.3.6 (cli) (built: Jun 13 2024 15:23:20) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies
```

# phpmyadminインストール(お好みで)
```
sudo apt install phpmyadmin
sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin//シンボリックの作成
sudo systemctl restart apache2
```

インストール中に出てくる選択肢はすべて空欄でよい
「<foo>http:</foo>//localhost/phpmyadmin」で確認する

# ドキュメントルートの変更(お好みで)
保存先のフォルダとシンボリックの作成
```
sudo mkdir -p /path/to/new/documentroot //ファイルを作る
sudo nano /etc/apache2/sites-available/000-default.conf
sudo ln -s /usr/share/phpmyadmin /path/to/new/documentroot/phpmyadmin　//シンボリックの作成
```

000-default.confファイルに追記
```/etc/apache2/sites-available/000-default.conf
# DocumentRoot /var/www/html
DocumentRoot /path/to/new/documentroot

<Directory /path/to/new/documentroot/>
    Options FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
</Directory>
```
apacheを再起動した後、保存先にテスト用のphpファイルを保存して確認
```
sudo systemctl restart apache2
sudo nano /path/to/new/documentroot/test.php
<?php echo phpinfo(); ?>
```

ブラウザで「<foo>http</foo>://localhost/test.php」が開ければおｋ
iOS で画像に設定したキャプションを Ruby で取得する

# やりたいこと

iOS で画像に設定したキャプション (任意の文字列) を Ruby で取得したいです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6697/64f10956-52bc-22ad-14ca-49c33b115806.png" alt="iOS の画像" width="360px">

# 方法

キャプションは Exif 情報として画像ファイルに保存されています。Exif 情報を読み取るために [mini_exiftool](https://github.com/janfri/mini_exiftool) という Gem を使用します。まず [ExifTool](https://exiftool.org/install.html) というコマンドラインツールをインストールしておきます。そして mini_exiftool をインストールします。

```shell-session
$ gem install mini_exiftool
```

そして MiniExiftool オブジェクトを使用して Exif 情報を取得します。iOS で画像に設定したキャプションは `imagedescription` というキーで取得できます。

```rb
require 'mini_exiftool'

filepath = Pathname(Dir.home).join('Downloads/IMG_2133.JPG')
mini_exif_tool = MiniExiftool.new(filepath)
mini_exif_tool['imagedescription']
#=> "🪀 UNPRLD - アイオン"
```

もちろん MiniExiftool オブジェクトは他の Exif 情報を取得することもできます。

```rb
mini_exif_tool['filetype']
#=> "JPEG"
mini_exif_tool['model']
#=> "iPhone 14 Pro"
mini_exif_tool['orientation']
#=> "Horizontal (normal)"
```

# バージョン情報

```shell-session
$ ruby -v
ruby 3.3.4 (2024-07-09 revision be1089c8ec) [arm64-darwin22]

$ exiftool -ver
12.93

$ gem list | grep mini_exiftool
mini_exiftool (2.11.0)
```
「The command could not be loaded...」エラーが表示されたとき

#### 背景
今回はエラー解消方法の紹介なので、簡潔にいきます。
VS Codeで.Netを使用したWEB JOBへアップロードするモジュール作成のために、「dotnet new consoloe」コマンドを実行すると・・・以下のようなエラーが!?

>The command could not be loaded, possibly because:
>  * You intended to execute a .NET application:
>      The application 'run' does not exist.
>  * You intended to execute a .NET SDK command:
>      No .NET SDKs were found.
>
>Download a .NET SDK:
>https://aka.ms/dotnet-download
>
>Learn about SDK resolution:
>https://aka.ms/dotnet/sdk-not-found

色々検索してみましたが、日本語でのこれといった解決方法は出てこず。。
詰んだと思いましたが、Stack Over Flowには以下投稿があり救われました。
https://stackoverflow.com/questions/73247933/how-to-fix-no-net-sdks-were-found-error-vscode

ここに日本語の記事を残しておきます。

## 解決方法
このStack Over Flowに記載のあった方法で解決しました。

#### 解決策1：「C:\Program Files (x86)\dotnet」内のフォルダを全削除
怖かったので、dotnet配下にbakupフォルダを作ってその中に移動させました。
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/3553a348-8c07-22d2-48f6-5fdbc565a26d.png)

結果：これで再び、「dotnet new console」を起動すると問題なく動作しました。

#### 解決策2：32bit版の.NET SDKをアンインストールする
「コントロールパネル>プログラムと機能」から確認してみました。
しかし・・・以下の通り32bit版の.NETは見当たりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/2779d787-ffc4-36c6-1e62-2b331525f25e.png)

#### 考察
32bit版の.NET SDKが邪魔していることは確実なのですが、Windows向けのモジュールで64bit版をインストールした際に32bit版もおまけに入ってくることはよくあります。実際に、何故こんなことになったのか結論は分かりませんでした。

追求したいところですが、「解決策1」で対応可能なので、今回はこれで良しとします。

もし詳しい方いたらコメント下さい。お願いします。
アプリケーションランチャー

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

+ [アプリケーションランチャーで別のものを選択してから標準のセールスに戻そうとしても表示されなく戻せなくなってしまいました。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifi20)

:::note
設定 --> アプリケーションメニュー　で

以下の四角で囲んだところをクリックして表示に変えてみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/13786bc1-3343-4df5-e9f1-a4be7935b4d3.png)
:::
3Dモデリングにおける曲げ操作のアルゴリズムと実装

# 曲げ操作Bend

## 曲げ操作の目的:  
   曲げ操作は、オブジェクトの一部を特定の軸の周りで曲げる特殊なプロセスであり、CSG（Constructive Solid Geometry）システムなどでは再現が難しい操作です。この操作は、モデルの一部を物理的に曲げるように、選択された軸の周りで特定の角度だけ回転させることで、オブジェクトの形状を変更します。

## 操作の指定方法:  
   曲げ操作は次の要素を定義することで指定されます:
   - **スイング軸**: オブジェクトを回転させる中心となる軸。
   - **曲げ部分のフェース**: 曲げ操作の対象となるオブジェクトの一部を示す平面フェース。
   - **移動される部分のフェース**: 曲げ操作によって移動するオブジェクトの一部を示すフェース。
   - **曲げ角度**: オブジェクトの指定部分をどれだけ曲げるかを示す角度。

## 曲げ継ぎ目の作成プロセス:  
   曲げ継ぎ目は、曲げ操作によって新たに挿入されるエッジの連続体です。この継ぎ目は次のようにして作成されます:
   - 曲げ対象のオブジェクトのフェースから開始し、曲げ面と各フェースの交点を計算します。
   - 曲げ面とフェースの交点から得られる曲線を基に、新しいエッジや頂点が挿入されます。
   - 隣接するフェースに順次進みながら、同様の処理を繰り返し、最終的に曲げ継ぎ目が閉じるまで続けます。

## 曲げ操作後のオブジェクトの構造:  
   曲げ操作が完了すると、オブジェクトは3つの部分に分けられます:
   - **移動部分**: 曲げによって回転する部分。
   - **固定部分**: 曲げ操作によって影響を受けない部分。
   - **曲げ部分**: 曲げ継ぎ目と隣接するエッジで囲まれた部分で、ここでオブジェクトが実際に曲げられます。

## アルゴリズムの詳細  
   曲げ操作では、以下の手順でオブジェクトの形状を変更します:
   - 曲げ面とフェースの交点を計算し、そこから得られる曲線でエッジや頂点を生成。
   - フェース、エッジ、頂点の各要素を個別に処理し、必要に応じて回転させます。
   - 同じエッジや頂点を複数回処理しないように、各要素にマーカーを使用して管理します。
   - 曲げ操作によって生成される新しいエッジやフェースは、曲げ継ぎ目や隣接するシームに関連付けられ、幾何学的に一致するように配置されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/86070fc7-ea40-aedf-fadf-a2bee4153d8d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/8f2734d5-f7b2-9f5f-87be-3e1b56ecef18.png)


## 曲げ後の面の処理
   曲げによって形成された新しいフェースは、円錐、円柱、球、トロイド、回転自由形状などの回転面として定義され、曲げ操作に基づいて適切な形状に設定されます。

この曲げ操作のアルゴリズムは、オブジェクトの形状を変更する際に、モデルのトポロジーを極力維持しながら、指定された部分を正確に曲げるために使用されます。
Tailscale Funnelを使って、サーバをinternet公開してみる

## 公式document

https://tailscale.com/kb/1223/funnel

## tailscale Funnnel の制限事項
tailscale Funnnelは以下の制限がかかる。

1. DNS名はテールネットのドメイン名（node-name.tailnet-name.ts.net）に制限される
2. funnelはポート443, 8443, 10000でのみリッスンできます。
3. ファネルはTLS暗号化接続でのみ機能する
4. Funnel 経由のトラフィックは帯域幅制限の対象となります。これらの制限は現在設定できない。
5. macOSアプリのサンドボックスの制限により、ファイルとディレクトリの提供はオープンソース版に限定される。


## 手順

以下のサイトでMagicDNSとHTTPS Certificatesを有効化する

https://login.tailscale.com/admin/dns


下記のコマンドを実行する。```--bg```を入力することによってプロセスをバックグラウンドで実行することが出来る。

```bash
# tailscale funnel --bg http://127.0.0.1:80
```

web認証を促されるので指定されたURLで認証を済ます
```
Funnel is not enabled on your tailnet.
To enable, visit:

    https://login.tailscale.com/f/funnel?node=xxxxxxxxx
```

認証が終わると、internet公開されたURLが発行される。
```bash
Success.
Available on the internet:

https://shoma-dynabook-r732-f.typhon-atria.ts.net/
|-- proxy http://127.0.0.1:80

Funnel started and running in the background.
To disable the proxy, run: tailscale funnel --https=443 off
```

## 使い終わったら
公開を辞めたい場合には以下のコマンドを実行する
```bash
tailscale funnel off
```
kintoneアプリに適用しているJSやCSSファイルの一覧を抜き出す

kintoneのSEをやっていると、システムを構築した後にお客様の要望で仕様書を提出することがある。
例えばカスタマイズJSのファイル名の一覧とその内容などをエクセルで提出せよ的な。
JSファイルがたくさんある場合は、APIで抜き出すと簡単です。

# 準備

`jq`をインストールしておきます。
https://jqlang.github.io/jq/

# API

利用するAPIは下記です。

JavaScript / CSSカスタマイズ設定を取得する
https://cybozu.dev/ja/id/9b499a476dafed45a6f62dd3/

# 注意点

APIトークンは使えません。
当然ですが、アプリ管理権限がないと実行できません。

# API叩いて設定情報のJSONを取得する

アプリをブラウザで開いて、開発者コンソールにてコマンドを打ち込むのが一番簡単です。


>kintone REST APIリクエストを送信するAPIを使ったリクエスト
>
>const body = {
>  app: kintone.app.getId()
>};
>
>await kintone.api(kintone.api.url('/k/v1/app/customize.json', true), 'GET', body);

コンソールにJSONが吐き出されるのでコピーします。

コピーしたJSONをエディタに貼り付けてファイルに保存します。

# jqにて必要な情報を抜き出す

設定情報をJSONファイルに保存したら、jqコマンドで整形していきます。

APIドキュメントの下記のサンプルレスポンスを参考にします。

```
{
  "scope": "ALL",
  "desktop": {
    "js": [
      {
        "type": "URL",
        "url": "https://sample.com/example.js"
      },
      {
        "type": "FILE",
        "file": {
          "contentType": "application/javascript",
          "fileKey": "20150519023802B3EB762E870645F889B22F9D4F1F3059023",
          "name": "sample.js",
          "size": "12345"
        }
      }
    ],
    "css": []
  },
  "mobile": {
    "js": [
      {
        "type": "FILE",
        "file": {
          "contentType": "application/javascript",
          "fileKey": "20140823043800E9F53A742F7F4416B6E47234DBD6C0D4025",
          "name": "mobile.js",
          "size": "12345"
        }
      },
      {
        "type": "URL",
        "url": "https://sample.com/example-mobile.js"
      }
    ],
    "css": []
  },
  "revision": "15"
}
```

## desktop js name の抽出

`cat [JSONファイル名] | jq '.desktop.js[] | .file.name'`

## desktop js url の抽出

`cat [JSONファイル名] | jq '.desktop.js[] | .url'`

## desktop css name　の抽出
cat [JSONファイル名] | jq '.desktop.css[] | .file.name'

## desktop css url　の抽出
cat [JSONファイル名] | jq '.desktop.css[] | .url'

## mobile js name　の抽出
cat [JSONファイル名] | jq '.mobile.js[] | .file.name'

## mobile js url　の抽出
cat [JSONファイル名] | jq '.mobile.js[] | .url'

## mobile css name　の抽出
cat [JSONファイル名] | jq '.mobile.css[] | .file.name'

## mobile css url　の抽出
cat [JSONファイル名] | jq '.mobile.css[] | .url'
WordPressをMVCモデルで構築する

## 動機
WordPressの特性上、ビルドイン関数で簡単に操作できるとはいえ、一つのファイルに全て詰め込んでしまうのもいかがなものかと感じたのがきっかけです。

テンプレートファイルを触っている時に、いつの間にか機能改善や追加などで膨れ上がっていることがあります。修正するのも一苦労で、どこにどういった処理が書かれているのかわからなくなることもあります。

そのようなことにならないよう、責務をしっかり分けたディレクトリ構成にしたいのが目標です。

## なぜMVCモデルなのか
アーキテクチャとして理解しやすかったからです。
それぞれ役割を分けファイル分割することでコードの見通しと責任が明確になります。

:::note
Viewについては、WordPressテンプレートファイルとみなします
:::

- **Model**
DB操作、ビジネスロジックを担う
- **Controller**
Viewへのデータ引き渡し、Modelへのデータ処理指示を担う
- **View**
ユーザーインターフェイス側（表示させる画面）を担う

## ディレクトリ構成
Viewについては各テンプレートファイルとみなします。
```
.
└── sample-theme/
    ├── front-page.php
    └── includes/
        ├── models/
        │   └── Post.php
        └── controllers/
            └── FrontPageController.php
```
### Model
ここでは取得したい投稿やページなど引数で指定し、得たデータを返す関数を設定しています。モデルの責務らしく、データベースへの問い合わせ場所になっています。
```php:models/Post.php
<?php

class Post
{
    public function getPosts(array $args = []): array
    {
        global $post;

        $posts = [];

        $postQuery = new WP_Query($args);

        if ($postQuery->have_posts()) {
            while ($postQuery->have_posts()) {
                $postQuery->the_post();
                $posts[] = $post;
            }
            wp_reset_postdata();
        }

        return $posts;
    }
}

```
### Controller
Viewへ渡すデータを用意しています。
今回の例では記述量が少ないですが、必要なデータが増えるほどモデルとのやり取りが増え、処理の複雑さも増してくることが予測されます。

最もここではなるべくロジックは書かないようにしたいので、ページ特有処理がある場合はユースケースなどを作成し、そちらに委譲するのも一つの手かと考えます。
```controllers/FrontPageController.php
<?php
require_once __DIR__ . '/../models/Post.php';

$postModel = new Post();
$posts = $postModel->getPosts([
    'post_type' => 'post',
]);
```
### View
Controllerから得たデータを表示させています。

```php:front-page.php
<?php
require_once __DIR__ . '/includes/controllers/FrontPageController.php';
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <ul>
        <?php foreach ($posts as $post) : ?>
            <li><?= $post->post_title; ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>
```

## 注意点
先述したControllerについて、処理の複雑さはFatなControllerを招きます。これらの対策として、ユースケースもしくはモデルに処理を委譲できないか見直していくことが必要です。

## さいごに
GoQSystemでは一緒に働いてくれる仲間を募集中です！
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site/?qiita=0a727cdbb7dc6eff66e7
柳井さん、前澤さんの「日本人は滅びる」論争についてエンジニアとして考えるべき事

柳井さんの「日本人は滅びる」発言を発端に炎上が始まり、それに前澤さんも参加して議論が活性化してます。

これに参加して、Xで議論する人。
見ても発言しない人
スルーして見ない人。

**色んな人が居ると思いますが、こういう炎上系の話しを見る度に、エンジニアとして考えるべき事があると思います。
それは、議論のプロセスを考える事です。議論に参加して結論を導き出すのは大事ですが、所詮、素人の情報量なんか大したものではないです。議論の中での議論のプロセスを考える事で、日常の業務に生かされると思います。**

# まず概要
（個人的に適当にまとめてますので、細かいツッコミはご勘弁ください）

柳井さんが
```
日本は、このままでは将来が厳しい。人口を増やすために移民を受け入れるべき
```
ここで炎上開始。移民を受け入れるべきではない。他に課題が発生する

これに前澤さんが
```
移民を受け入れなくても生産性を上げれば良い
```
そうだ。そうだ。とX民が賛同。

議論のプロセス整理
# １．両方やれば良い
「人口を増やすために移民を受け入れる事」と「生産性をあげる事」は同時にやる事が出来ます。
 なんで、どっちがで議論してるのか意味がわかりません。

 これ仕事上でもよくあるんです。

 品質をあげるために、
 ・設計をしっかりやる事
 ・テストをしっかりやる事
 この２つが上がった時に、どっちからやりましょう？と相談してきたり、悩んでる人います。
 両方やれば良いんです。

 ただ１点だけ、双方に負の相関がある時は、注意が必要です。
 ・コスト削減したい
 ・開発速度をあげたい
 これは、結構、負の相関があります。コストを下げると速度が阻害される可能性が高いです。
 同じく、速度を上げるとコストがあがる事がよくあります。
 この２つの両方をやる事は出来なくはないですが、実行＆達成ハードルがあがります。
 したがって、なるべく同時にやらない方が良いです。

# ２．本来の目的をずらさない
柳井さんが発言した目的は、労働人口を増やすことです。その手法として、移民の話しをしているだけです。
労働人口を増やすために効果があるのが移民を増やすって話しであって、反対の人は、では、人口を増やす方法を提案すべきです。
そして、やっぱり移民を増やすしかない、もしくは、一番効果的であれば、移民を増やした上でどうにかなる方法を考えるべきです。

テストをしっかりやろうという話しになると、工数が増えてしまいますと反論するエンジニアがいます。

それならば、テストの自動化を検討して、テストもしっかりやりながら、工数もさげる方法を検討しましょう。
それがエンジニアとしての仕事です。

# ３．議論する前にやってしまえば良い
今回の議論等もそうですが、どっちが良いかとか、どこに問題が発生するか等はわかりません。
わかったとしても結果はかわる可能性も高いし、想定は非常に難しく、ベストな解を探す事にコストをかけるのは無駄です。
そして大事なのは、実行してみた後に速やかに検証して、その瞬間にベストな道に軌道修正を常に行う事です。

エンジニアとしては、***速やかに検証できる環境つくり***が重要です。

プロダクト開発でも、Aの機能とBの機能のどちらが良いのかは常に頭の痛い話しです。
エンジニアとしては、ABテストの実施やCV、LTV等の各種数値をリアルタイムに分析できる環境を構築する事です。

# まとめ
## 分析と改善提案

* **多角的な視点:** 単なる炎上ではなく、議論のプロセスそのものに着目し、エンジニアの業務に繋げる思考
* **具体的な事例:** 品質と開発速度のトレードオフなど、エンジニアが日常的に直面する問題との関連付け
* **改善提案:** 検証環境の重要性など、具体的な解決策の提示

### 今後の議論への応用

* **炎上を学習の機会に:** 炎上を単なる騒動ではなく、社会や技術に関する重要な議論が巻き起こっている場として捉え、そこから学びを得る。
* **多様な意見を尊重:** 異なる意見を持つ人々との対話を通じて、自分の考えを深める。
* **建設的な議論を促す:** 根拠に基づいた議論を行い、より良い解決策を見つけるために貢献する。

エンジニアは、単に技術的な問題を解決するだけではなく、社会的な課題に対しても、客観的な視点と論理的な思考力を活かして貢献できる存在であると言えます。

是非、エンジニア皆さんは、Xの炎上を眺めたり、参加するだけでなく、議論のプロセスについて考えてみて、自分たちの業務と照らし合わせて、より良い議論のプロセスを見つけ出してみてください。
Flutterでのレイアウト制御: ExpandedとFlexibleの違いと使い方

### **はじめに**

FlutterでUIレイアウトを構築する際、`Expanded`と`Flexible`はよく使われるウィジェットですが、その違いについて曖昧な理解であったため、簡単にまとめでみました。
この記事では、`Expanded`と`Flexible`の違いを簡潔に説明します。

### **Expandedの使い方**

`Expanded`は、Flexウィジェット（`Row`や`Column`）内で利用可能なすべてのスペースを均等に占有します。

### **コード例: Expanded**

```dart
Column(
  children: [
    Expanded(child: Container(color: Colors.red)),
    Expanded(child: Container(color: Colors.green)),
  ],
)
```

**説明**: 2つの`Container`が垂直方向に均等にスペースを占有します。赤と緑の`Container`が同じサイズで表示されます。

### **Flexibleの使い方**

`Flexible`は、`flex`プロパティを使って、子ウィジェットの占有するスペースの割合を指定できます。

### **コード例: Flexible**

```dart
Column(
  children: [
    Flexible(flex: 1, child: Container(color: Colors.red)),
    Flexible(flex: 2, child: Container(color: Colors.green)),
  ],
)
```

**説明**: 2つの`Container`が1:2の割合でスペースを占有します。緑の`Container`は赤の2倍の高さになります。

### **まとめ**

- **Expanded**は、利用可能なスペースをすべて均等に分けたいときに使用します。
- **Flexible**は、ウィジェットのサイズを比率で指定したいときに使用します。

どちらもレイアウト制御に非常に役立つツールですので、適切に使い分けましょう。
Amazon EFS 解説

## はじめに

Amazon EFS (Elastic File System) の基本的な内容を、AWS初心者の方でも理解できるように解説します。

### Amazon EFS とは？

Amazon EFSは、クラウドネイティブなワークロードに最適な分散ファイルシステムのフルマネージドサービスです。つまり、**ファイルの保存や管理をAWSに任せることができるサービス**です。

**Amazon EFS の特徴**

* **フルマネージドサービス:** サーバーやOSの管理が不要で、簡単にNFSサーバーを利用できる
* **自動拡張:** 保存容量に応じて自動的に容量が増えるので、容量不足を心配する必要がない
* **プロビジョンドシステム:** 必要に応じてストレージ容量を事前に設定できる
* **様々なサービスとの連携:** Amazon EC2、AWS Lambdaなど、様々なAWSサービスからアクセスできる
* **セキュリティ対策:** アクセス制御や暗号化など、セキュリティ対策を施すことができる

### Amazon EFS の利用方法

Amazon EFSは、NFS（Network File System）プロトコルを使って、様々なサービスからアクセスできる

* **NFSバージョン4.0または4.1:**  Amazon EFSはNFSバージョン4.0または4.1に対応している
* **efsマウントヘルパー:**  Amazon EC2インスタンスからAmazon EFSにアクセスする際は、efsマウントヘルパーというツールを使用します。このツールは、AWS IAM認証情報を使ったアクセスやファイルシステムIDを使ったマウントなどを簡単に行える

### Amazon EFS のセキュリティ

Amazon EFSは、様々なセキュリティ機能を提供しています。

* **ファイルシステム管理:** ファイルシステムの作成、削除、監視などの管理操作を制限することができる
* **アクセス制御:** AWS IAMやファイルシステムポリシーを使って、ファイルシステムへのアクセスを制限できる
* **セキュリティグループ:** ファイルシステムへのネットワークアクセスを制限することができます。
* **データ保護:** ファイルシステム内のデータを暗号化したり、クライアントとの通信をTLSで暗号化することができる

### Amazon EFS の便利な機能

Amazon EFSは、ビジネスの継続性や災害対策、コスト最適化を支援する便利な機能を提供しています。

* **レプリケーション:** ファイルシステムを同一リージョン内または別のリージョンに複製することができる
* **ストレージの回送化:** ファイルのアクセス頻度に応じて、低頻度アクセスストレージやアーカイブストレージにデータを移動することができる
* **自動バックアップ:** AWS Backupを使って、ファイルシステムを自動的にバックアップすることができる
* **アクセスポイント:** ファイルシステムへのアクセスを制御するために、アクセスポイントを作成することができる
### 注意点
* WindowsベースのEC2からEFSを利用することはサポート対象外
* 一部のファイル操作には課金が発生するため、注意が必要

### まとめ

Amazon EFSは、クラウドネイティブなワークロードに最適なフルマネージドファイルストレージサービスです。セキュリティ対策や便利な機能も充実しており、AWSでファイルストレージを利用する際には検討すべきサービスです。
ESP32-CAM CameraWebServer

ESP32-CAM(Aliexpressで1,000円弱)で色々テストしました。まずは定番のCameraWebserverです。

![esp32-cam.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806156/8128f9ff-4565-07b5-5409-c8c9d139bce0.png)


![esp32cam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806156/17a64053-9c0a-a13f-ee26-39cd50897f0b.png)


# 設定
* ArduinoIDE ver 2.3.2(UBUNTU)
* ボードマネージャー ESP32 ver2.0.14
* ボード AI-THINKER
* ソース(スケッチ例) ESP32>camera>Camerawebserver
  修正箇所　
  #define CAMERA_MODEL_AI_THINKER 及びssid,pass入れること

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806156/928aba3e-0db5-273a-d3c2-e1701d5c3110.png)

# 結果
URLにArduinoIDEのシリアルモニタに表示されるhttp://192.168.x.x を指定する。


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806156/ef9367c8-066e-4726-534f-12f496385858.gif">
労働安全衛生をする１(スペースの判別)

# 委託工場でDX化してみたい

:::note info
インフォメーション
- 現在の所属会社非公認計画書です
- 工数測定等のツールはできている
- 検査ツールも作りました
- 作業品質と安全衛生をしてみたい
- 本格的な工場では当たり前にやっていたことですね・・・
:::

## DXとは銘打つものの、アナログな会社にいます

:::note warn
注意
- ガバナンスがガバガバな社の事例なので参考にはならないかも・・・
- これからガバナンスを作ろうとしているらしい
- エンジニアは営業の下僕というスタンスで見てください
:::

## これまでにまとめたツールなど
1. 教育資料

https://zenn.dev/manyan3/books/39f40bcda10b53

2. 小規模LLM動作まとめとツール

https://zenn.dev/manyan3/articles/175977d27c4c50

- 技術的なところの予算は使いたくないらしい
- 多分、主幹部門を待っていたら製造事業なくなっているかも
- 正直予算をあてて、買うかもっといい環境で動かした方がよさげ


3. 検査ツール（一部）
- プロの方はこの辺肝のようで全公開されてないですよね；）

https://zenn.dev/manyan3/articles/01693dfae439e4

# 使用したデータセット
### corridor floor segmentation

https://www.kaggle.com/datasets/deepakmedam/corridor-floor-segmentation

:::note info
インフォメーション
本来、現場写真をアノテーションしたほうがいいですね
:::

### 作業環境確認ツール

https://github.com/mi-kaneyon/workspace_segmentation?tab=readme-ov-file

:::note info
Information
- If you're English required, please check above github README.md
- Factory worksapce observing tool
:::


### 要改良点
**若返りツール？なっている**
- 人がセグメンテーションされてオジサマは20代といっても過言ではない見た目になっている
- フロア以外を色付けしてしまっている
- 反転させると精度が下がる
- データが少ないかも

# ROAD某を使うがいいのでしょうかねぇ
- 調査・試作継続します。
Mac の標準ブラウザ設定は Chrome なのにリンクがSafariで開いてしまう問題の対策 

# 解決

Macの設定で

- デフォルトブラウザをいちどSafariに戻す
- デフォルトブラウザをChromeに設定し直す

という手順で直った

![CleanShot 2024-08-29 at 08 18 24@2x](https://github.com/user-attachments/assets/253772ea-32df-4a30-9320-9201eea29d93)


# 問題

SlackのリンクがSafariで開いてしまう
Slackを再起動しても、Macを再起動しても直らない

という問題が起きていた

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
メール自動生成

    @echo off
    setlocal enabledelayedexpansion
    
    rem メールの設定
    set to=to@example.com
    set cc=cc1@example.com,cc2@example.com
    set bcc=bcc@example.com
    
    rem 日付の取得とURLエンコード
    for /f "tokens=2 delims==" %%i in ('wmic OS Get localdatetime /value ^| find "="') do set datetime=%%i
    set year=!datetime:~0,4!
    set month=!datetime:~4,2!
    set day=!datetime:~6,2!
    set subject=自動生成メール（!year!-!month!-!day!）
    set body=これは自動生成されたメールの本文です。%0D%0A次の行のテキストです。%0D%0Aさらに次の行のテキストです。
    
    rem メールを開く
    start "" "mailto:%to%?cc=%cc%&bcc=%bcc%&subject=!subject!&body=!body!"
高速なinferenceなcerebrasを試した

## 結論 - 体感では速度重視しすぎて、文章の品質が酷い
https://inference.cerebras.ai/
APIで試せるようにならないと、実際の評価は下せないが。

Chatした限りだとtoken絞りすぎて、Lhama3.1-70Bとは思えないほど酷い答えが返ってくる。
極端な話、こちらの言った内容のオウム返しが多くて実用性がない。無料で高速で使えるにも関わらず、継続して使いたいとは少しも思わない。(groqのAPI経由でいい)

ローカルのPhi-3-3Bの方が頭いいのではと思ったほどだ。

　技術的に、高速に返信するには、token数絞る必要あるでしょうが。いずれにせよ、ユーザーの体感を考えると、速度は重要だと、内容が酷いと意味がない。
 
 速度と品質のバランスは大事だなと改めて思いました。
Teamsの特定のフォルダにファイルがアップロードされたら、チャネルにアナウンスするフローをつくるよ【PowerAutomate】

# はじめに
最近PowerAutomateに手を出し始めたので、それ関連も投稿していきます。

さて突然ですが、Teamsの特定のフォルダにファイルをアップロードしたら、自動でその旨をチャネルにアナウンスしてくれたら嬉しいですよね？なんならメンションとファイルへのリンクも付いたらもっと嬉しいですよね。

できるんですよね。

そう、**PowerAutomate**ならね。

# フロー
早速ですが、フローはこちらです。そもそもPowerAutomateとは何ぞやとは先人たちが素晴らしい記事を多数書いているのでここでは割愛します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/a5b70810-f517-6c48-c925-08a771eb42cb.png)

#### トリガー：ファイルが作成または変更されたとき（プロパティのみ）
Teamsのファイルの所在はSharePointなので、SharePointのトリガーを使用します。
このトリガーはポーリングトリガーなので**一定間隔でデータの発生を監視するトリガー**となります。つまり、ファイルがアップロードされたと同時にフローが開始するのではなく、**一定間隔でフォルダを監視し、条件が満たされていればフローが開始する**仕様です。この監視の間隔はライセンスのグレードによって固定された値で、**変更はできません**。

https://tana-techlog.net/?p=201

#### タグの@メンションを取得する
メンション用です。PowerAutomateでTeamsに投稿する際、**チームに対してメンションを付けることは現状できません**。個人もしくはタグにはメンションを付けることができるので、必要であればチーム員全員が入ったタグを用意しておきます。

#### チャットまたはチャネルでメッセージを投稿する
Teamsに投稿する部分です。この中で先ほど取得したメンションを使ったり、ファイルへのリンクを作成します。

# トリガー：ファイルが作成または変更されたとき（プロパティのみ）
一つ一つ中身を見ていきましょう。まずはトリガー部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/9ce9ca3e-f25c-dda0-81a7-c53ec353b722.png)

① サイトのアドレスとライブラリ名はプルダウンで選択します。
② 監視するフォルダーを選択します。
③ 「項目を確認する頻度」があります。頻度をいじることはできますが、フローを保存するとリセットされるので、いじっても意味は無いです。冒頭で述べた通り、ライセンスのグレードで固定された値です。

# タグの@メンションを取得する
次はメンションを付けるために、トークンを取得しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/3ce5327d-e788-c99f-547a-62c74d179336.png)

これもチームとあらかじめ作成しておいたタグをプルダウンで選択するだけです。
個人にメンションを飛ばしたい場合は、「ユーザーの@メンショントークンを取得する」アクションに変更してください。
また、複数のメンションを付けたい場合は、その数だけアクションを追加して、トークンを取得してください。

# チャットまたはチャネルでメッセージを投稿する
リンクの作成が多少煩雑ですので、細かく見ていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/33ebf799-87af-d5a5-2059-be96a259a4c1.png)

① 投稿者、投稿先、Team、Channelをプルダウンで選択します。
投稿者を**フローボットにするとタグの@メンションが使えない**ので要注意です。ユーザーへのメンションはできます。

https://qiita.com/SnorlaxDX/items/9eea5466cc3ddf86c7fa

②-1 本文（メンション）
雷マークをクリックすると、前の手順で取得したデータを使用できます。
「タグの@メンショントークンを取得する」で取得したトークンを挿入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/a0dd5aeb-04d7-0bb1-e848-e5e3a24ed23f.png)

②-2 本文（ファイル名、投稿者）
同様に雷マークをクリックして、トリガーで取得したファイル名と投稿者を任意の位置に挿入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/d95b3ede-a0fd-4471-d096-a9885a9cbfdb.png)

②-3 本文（ファイルへのリンク）
始めに、雷マークから「アイテムへのリンク」を取得します。また別に、リンクに表示させたい文字列（例では、詳細はこちら）を記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/8aa37cb6-a29f-ca94-82f0-1e86ee406488.png)

続いて、アイテムへのリンクをCtrl+Xで切り取り、「詳細はこちら」を選択、上部のリンクの挿入をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/e53317d8-d8e4-a5df-f9a2-a7587ad553c0.png)

リンクの中身に、先ほど切り取った「アイテムへのリンク」をCtrl+Vで貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493004/a52f34af-599b-5090-aef5-cf207107bd1a.png)

お疲れ様でした、これで完成です。

# おわりに
いかがでしたでしょうか。プルダウンで選択したりボタンをポチポチするだけで素敵なフローが出来上がりましたね。様々応用が利くフローだと思いますので、参考になれば幸いです。

もっとおしゃれな投稿したいよ！って方は「アダプティブカード」で検索してみてください。私も勉強中です。

それでは、次の記事でお会いしましょう('ω')ノ