OmniAICreator/Qiita-1.07M huggingface dataset:
Local Valueとfor_eachを使ってリソース定義を楽したい

## tl;dr
[Local Value](https://developer.hashicorp.com/terraform/language/values/locals)で定義したいリソースのパラメータを事前に用意し、 `for_each` でそれを読み込むとresource定義はひとつで済むので便利。

## まえがき
terraformでリソースを定義するとき、名前や保持期間など、一部パラメータが違うだけのほとんど同じリソースを複数定義することがあります。
AWSで言うと、たとえばElastic Container RegistryやCloudwatch Logsのロググループなどが該当します。

これらのリソースを一個一個定義するのもいいのですが、時には短く書きたい場合もあります。
そんなときに便利な、`Local Value` と `for_each` について紹介します。

## やってみる
### キーだけを参照するシンプルな例
まずは実際のコードを例示します。
以下のコードは、Elastic Container Registryのリポジトリを `for_each` で定義するものです。

まずは、Local Valueとしてリソースごとに変更させたいもののリストを定義します。
今回はリポジトリ名のみを可変にしたいので、`aws_ecr_repository.repositories` という名前の `list(string)` 型の変数として定義します。

```locals.tf
locals {
  aws_ecr_repository = {
    repositories = [
      "php",
      "nginx",
    ]
  }
}
```

その後、リソースを定義する時に、リソースの中で[for_each](https://developer.hashicorp.com/terraform/language/meta-arguments/for_each)を使います。

```ecr.tf
# リストを元にリソースを作成する
resource "aws_ecr_repository" "repositories" {
  for_each = toset(local.aws_ecr_repository.repositories) # aws_ecr_repository.repositories の数だけリソースを定義する

  name = each.key # repositoriesのキー(php, nginx)が参照される
  image_tag_mutability = "MUTABLE"
}
```

これをapplyすると、`aws_ecr_repository.repositories[]` が定義されます。
他のリソースから特定のリポジトリを参照したい場合は、`aws_ecr_repository.repositories[リストのキー]` で参照できます。
上記のサンプルコードだと、`aws_ecr_repository.repositories["php"]`, `aws_ecr_repository.repositories["nginx"]` のようにします。

### キー・バリューを活用する例
先ほどの例では、シンプルに名前のリストを作ってそのぶんだけリソースを作る、というものでした。
実際には、リソースごとに微妙に変えたい値があるケースもあります。
そうした場合、下記のようにkey-valueの形式を使って、可変したい値を含めたLocal Valueを定義すると便利です。

CloudflareのDNSレコードを定義するコードで例示します。

まずは、このようにLocal Valueを定義します。

```locals.tf
locals {
  records = {
    "example.com" = { value = "example.com", comment = "hoge", proxied = false }
    "www"         = { value = "example.com", comment = "piyo", proxied = true }
  }
}
```

そして、以下のようにkeyに加えてvalueも参照します。

```cname.tf
# CNAME Records
resource "cloudflare_record" "cname" {
  for_each = local.records

  zone_id         = var.cloudflare_zone_id
  name            = each.key # "example.com", "www" が参照される
  comment         = each.value.comment
  type            = "CNAME"
  value           = each.value.value
  proxied         = each.value.proxied
  allow_overwrite = false
}
```

DNSのTTLや向き先、ログの保持期間など、リソースごとのちょっとした差分についてもLocal Valueを使うことで吸収し `for_each` で楽してリソース定義することができます。

## まとめ
こうした `for_each` を使った書き方を使うことで、同じようなリソースの定義が楽になります。
また、嬉しい副作用として、localsを見ればそのtfファイルで何を定義しているかがすぐにわかるようにもなります。

使ったことがなければ、一度試してみることをおすすめします。

(もちろん、複雑な差分がある場合には素直に個別にresourceブロックを記述することをおすすめします。あくまでシンプルな差分で使うのがよさそうです！)
gpt-4oの音声対話機能について

# まだ展開されていない機能なのに・・・


２週間ほど前、gpt-4oを使用した感情のこもった会話やビジョン機能が発表されて以来、所々で既にこれらのモデルを使ってそのような機能が使用できると考えている人がちらほら見受けられます。

本来、信頼できる記事を提供することが求められているような日経クロステックの記事でさえChatGPTで既にこのような機能にアクセスしているという内容の記事を投稿している方もいました。

https://xtech.nikkei.com/atcl/nxt/column/18/00682/052200153


ですがこのモデル自体に備わった、声のトーンを変えたり、相手の感情を反映したような応答をする機能はレッドチーム（技術の危険性に関して検証する一部の専門家グループ）の間でリスクに関して検証を受けている段階で、一般のユーザーには公開されていません。

https://openai.com/index/hello-gpt-4o/

これ関しては、優先的にサービスを利用できるような特別な人がいるわけではありません。

https://community.openai.com/t/announcing-gpt-4o-in-the-api/744700

むろんOpenAIというアメリカの企業が開発している技術である事など、諸事情を考慮すればアメリカの企業であれば既に利用している所もあるのではと考えるのは無理のない話しですが、現在OpenAIの内部での検証の域を出ません。

また仮にレッドチームの一員としてリスクを検証しているとしても、NDAなどを結んだ上で家族や友人にもその検証の結果について口外しないための契約が必要になっている状態です。

そのためgpt-4o特有のマルチモーダルな機能に既にアクセスしているという認識は正しくありません。

一応ビジョン機能（VQA）はgpt-4oを使ったものになっていますが、アナウンス時に印象深かったような感情のこもった会話をする（音声をテキストに書き下さず、直接音声として認識し音声を返す機能）機能などはまだ利用できません。

実際にこれらのサービスが展開されるさいは過去のサービスの展開と同じくアカウントごとに、ランダムに展開されていくことになるはずです。

その過程では、同じ職場の同僚はアクセス出来るのに私はまだ利用できないという不公平な雰囲気が生じるかも知れません。

今回も同じ経緯を辿るとは思いますが、gpt-4oの音声による感情のこもった会話機能については、5月末時点でまだ広く一般に公開されてはいません（応答速度が多少は早くなったかも知れませんが・・・）

利用できるようになる前と後ではChatGPTを使った利用体験が変わることは容易に想像できますが、まだ誰も利用していない状態であるということは覚えておく必要がありそうです。
Pythonコードを１回実行するだけで、VRMにパーツを簡単に追加する[Pythonやプログラミングの知識不要]

# VRMにパーツを追加するPythonコード
コードのオブジェクトとボーンの名前を変更して実行すれば、
あっという間にくっ付けられます。
```
import bpy

# アタッチしたいオブジェクトの名前(アタッチしたいオブジェクトの名前に変更)
ATTACH_OBJECT_NAMES = ['sakura_tree', 'sakura_flower']
# アタッチするボーンの名前(アタッチするボーンの名前に変更)
BONE_NAMES = ['J_Bip_C_Head', 'J_Bip_C_UpperChest']

for attach_object_name, bone_name in zip(ATTACH_OBJECT_NAMES, BONE_NAMES):
    # ボーンにアタッチ
    attach_object = bpy.data.objects[attach_object_name]
    armature = bpy.data.objects['Armature']
    original_matrix_world = attach_object.matrix_world.copy()
    bpy.ops.object.select_all(action='DESELECT')
    attach_object.select_set(True)
    armature.select_set(True)
    bpy.context.view_layer.objects.active = armature
    bpy.ops.object.parent_set(type='ARMATURE_NAME', xmirror=False, keep_transform=True)
    armature.select_set(False)
    attach_object.parent_type = 'BONE'
    attach_object.parent_bone = bone_name
    attach_object.matrix_world = original_matrix_world

    # 頂点グループの割り当て
    vertex_group_name = bone_name
    if vertex_group_name not in attach_object.vertex_groups:
        vertex_group = attach_object.vertex_groups.new(name=vertex_group_name)
    else:
        vertex_group = attach_object.vertex_groups[vertex_group_name]
    vertices = attach_object.data.vertices
    for vertex in vertices:
        vertex_group.add([vertex.index], 1.0, 'ADD')

```


アタッチしたいオブジェクトの名前とアタッチするボーンの名前に合わせて
下記コードを変更します。
```
# アタッチしたいオブジェクトの名前(アタッチしたいオブジェクトの名前に変更)
ATTACH_OBJECT_NAMES = ['sakura_tree', 'sakura_flower']
# アタッチするボーンの名前(アタッチするボーンの名前に変更)
BONE_NAMES = ['J_Bip_C_Head', 'J_Bip_C_UpperChest']
```

例えば、オブジェクトcubeをボーンJ_Bip_C_Headにアタッチしたい場合は、
下記コードになります。
```
# アタッチしたいオブジェクトの名前(アタッチしたいオブジェクトの名前に変更)
ATTACH_OBJECT_NAMES = ['cube']
# アタッチするボーンの名前(アタッチするボーンの名前に変更)
BONE_NAMES = ['J_Bip_C_Head']
```

cube1をJ_Bip_C_Head、cube2をJ_Bip_C_Head、cube3をJ_Bip_C_UpperChestに
アタッチしたい場合は、下記コードになります。
```
# アタッチしたいオブジェクトの名前(アタッチしたいオブジェクトの名前に変更)
ATTACH_OBJECT_NAMES = ['cube1', 'cube2', 'cube3']
# アタッチするボーンの名前(アタッチするボーンの名前に変更)
BONE_NAMES = ['J_Bip_C_Head', 'J_Bip_C_Head', 'J_Bip_C_UpperChest']
```

## blenderでpythonコードを実行する方法
https://youtu.be/Gokn9Cnsnzw?si=2mbX4z1XaQJ50dAe

1 上部のScriptingをクリック
2 上部の+ Newをクリック
3 コードを入力
4 上部の三角形のボタン▷(Run Script)をクリック
wijmo のGrid作成について 

こんにちは塚田と申します。

今回はWijmo（ウィジモ）を紹介します。
Wijmo（ウィジモ）はメシウスが販売するWebアプリケーション開発で使われるJavaScriptライブラリです。

データグリッド、チャート、ゲージ、入力、ナビゲーションなどの
Webページを作成する際に必要となる部品を提供するJavaScriptライブラリです。今回はその一部の**データグリッド**を紹介します。

※画像は公式HPのサンプルを載せています
URL:https://demo.mescius.jp/wijmo/demos/Grid/Overview/purejs

# Gridの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801327/de0de0fe-7464-11f5-7902-d75aa0030680.png)

つづいてサンプルコード↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801327/88c57ff3-8a4f-00f0-fce2-cc282dec9bac.png)

WijmoのGrid(FlexGrid)は
依存ライブラリなしで軽量・高速に動作し、
運用開始後の保守性にも優れたJavaScriptライブラリです。

Columns クラスのbindingプロパティでヘッダーを作成し、
引数にJavaScriptから取得したdataを指定することでFlexGridを表示できます。

# Columnsクラスのプロパティ
- isReadOnly = 列or行にあるセルを編集できるかどうかを指定できます。
- allowDragging = 列or行の移動を許可するかどうかを指定できます。
- dataType = 列or行に格納される値の型を取得または設定します。
- visible = 列or行が表示されているかどうかを示す値を設定します。
- getIsRequired = 列or行の値が必須かどうかを決定する値を取得します。
- etc...

全45種のプロパティが存在します。

# チェックボックス
Selectorクラスを使用すると、チェックボックスで行を選択することができます。
全チェックボックスの活性/非活性の切り替えも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801327/b8cb78e9-dcca-c7d1-ab7f-f542231542a4.png)

Selectorクラスを使うことで、データ操作がより直感的かつ効率的に行えるようになり、ユーザインターフェースの柔軟性が向上します。

# ソート機能
ColumnsクラスのプロパティであるallowSortingをTrueにすることで
ヘッダー押下時にソートが可能になります。

以下は"日付"ヘッダー押下時にソートをかけた例です。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801327/1f757c55-4d0d-d1c5-e4e7-0ceefb10fb8d.png)


つづいてサンプルコード↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801327/e29632d5-bc07-26a6-bc91-d57271d198fd.png)


# おわりに
今回紹介したものは一部であり、他にも様々な機能や活用方法があります。
Wijmoの公式ページには実用例と使用例の詳細が記載されているので、
是非、そちらをご参照ください。
以上、塚田でした。
aria-currentの値はいくつかあるけれど、それぞれどのUIで使うとよいのか整理してみた

## これは何？

ARIA属性には現在選択されている項目を示すものがあります。
タブ（`role="tab"`）なら、 `aria-selected`があります。
`aria-current` も選択されている項目を示すものです。

こういった選択されている項目を示すARIA属性は、結構使っても良い `role` が限られているなと感じました。
正確には `role` と言ったほうが正しいと思いますが、ざっくり理解するためにこの記事では「UI」と表現したいと思います。

`aria-current` には7つ値があり、それぞれ適したUIがあります。
いざ使ってみようと思ったときに、どのUIで使うべきか迷ったので、記事として残しておこうと思います。

この記事が誰かのお役に立てれば幸いです。

## `aria-current` とは

W3Cの[Accessible Rich Internet Applications (WAI-ARIA) 1.2](https://www.w3.org/TR/wai-aria-1.2/#aria-current) によると
>Indicates the element that represents the current item within a container or set of related elements

とありました。

コンテナーや関連する要素の集合の中で現在の項目を表すときに使います。
`<a href="/" aria-current="page">Page<a>` のような書き方をします。

## 値

`aria-current` には7つの値があります。

[Element: ariaCurrent プロパティ - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Element/ariaCurrent) から引用します。

値 | 説明
--- | ---
`page` | 設定するには、一連のページ内での現在のページを表します。
`step` | プロセス内の現在のステップを表します
`location` | 現在の位置、例えばパンくず階層内の現在のページを表します。
`date` | 日付の集合の中における現在の日付を表します。
`time` | 時刻の集合内の現在時刻を表します。
`true` | 集合内の現在の項目を表します。
`false` | 集合内の現在の項目を表しません。

正直、私は`location` がパンくずリストで使うことしか、初見では把握できませんでした。

## どのUIで使うとよいか整理してみた

値 | 主なUI | 補足
--- | --- | ---
`page` | グローバルナビゲーション | ナビゲーションで使用する。1ページに1つが良さそう
`step` | ステップを表現するUIがある申込みフォームやアンケート、プログレスバー | 
`location` | パンくずリスト | 
`date` | カレンダー | 
`time` | 時刻表 | 
`true` | 上記以外 | タブ（`role="tab"`）なら、 `aria-selected`のほうが適切
`false` | all | [デフォルト値]<br>選択されていないことを表す。<br>空（`null`）または `undefined` だと`false`と認識されます。

この記事を書いた時点では、ざっくりですがこのようなUIで使うと良いと思います。

## 参考

- [Accessible Rich Internet Applications (WAI-ARIA) 1.2](https://www.w3.org/TR/wai-aria-1.2/#aria-current)
- [aria-current - Accessibility | MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
CCNAを取得した時の記録

作業ログ
2024/05/28
# CCNA挑戦

## 目的
- システム一回り入門したかった。今回の観点はNW。
- NWの各プロトコルの基礎を体系的に理解したい。
- Cisco機器の操作を個人的に行ってみたかった。単純な憧れ。

## 状況
- 文系学部卒、特別なプログラミング経験やソフト、ハードなどの知識、経験なし。
- 基本情報FE取得済、セスペSC、ネスペNW取得済。OSSDB gold、LPIC1取得済、デスペ1敗して保留中。
- もっと完璧に準備して挑戦のつもりだったが、あと3か月で今の試験が終了すると通知があり、
取り敢えず急いで威力偵察を実施。落ちても即対策してリトライのつもりで受験。

>CCNA Exam Updates
>As part of our Certification Roadmaps review cycle, our CCNA exam will be updating soon. 
>The last date to test for the current exams is August 19, 2024. 
>Candidates can expect to be tested on the new exam material starting August 20, 2024.

→今回の「200-301」に改定される前にも受験を考えていて、結果準備間に合わず範囲広がって痛い目を見ている。
https://www.cisco.com/c/dam/global/ja_jp/training-events/training-certifications/cln/seminar/cisco-learning-day-19.pdf
9分野合体。キングスライムかな？
当時はルーティングだけ取って満足する積りだったのに。。
次の試験範囲がどうなるか分からない以上、今回で仕留める。

## 準備
pingtのみ。
pingtを集中したのが2023/06/26～09/28。2024/02/02～05/27。計7カ月。
＃間はqiita開始とGPTでwebアプリ作成で一時中断。
通勤時間で細々と継続。
2時間/日＊4日/週＊4週/月＊7カ月/今回
＝224時間
ほんとはpingt模試を即答できるようにした後、
コマ問や簡易シミュレータも行うつもりだった。
実際は、
web問題集を4周し、
5周目の途中で試験へ。

## 当日
試験時間120分に対して、10分残して終了、その場でpass。
CCNAは、各質問が戻れない。
原文となる英語は確認できない。

↓暫くしたらマイページに詳細が更新された。

|Section Analysis|%|
|---|---|
|Network Fundamentals|65%|
|Network Access|50%|
|IP Connectivity|72%|
|IP Services|80%|
|Security Fundamentals|60%|
|Automation and Programmability|90%|

酷い結果だがこれでpass。

## 振り返り
- 自分の場合は90問程度出題されて、ラボ問もあり。
→先ずはしっかり公式の案内を確認すべき。
https://learningnetwork.cisco.com/s/certification-exam-tutorials
- 終わってみれば、pingtで問題なかった。
本質は、「何を聞かれていて、何を答えてあげれば良いか」、だけだった。
基本は即答した。情報量多くても、回答に必要は情報はごく一部の場合がある。
- ラボ問は全滅した。簡易シミュレータは最低でも実施しておくべき。可能なら実機で操作しておくべき。
普通の実機操作と同様にヘルプや補完が使えるので、完全な暗記は不要で操作になれておけば良かった。
「ena→conf t」という当たり前の打ち始めくらいノータイムで打てるようにしておくべきだった。

## お勧めする準備
- pingt：移動時間で可能な最強の対策。簡易シミュレータも是非。
- safeguard：1回落ちても2回分の受験料払うより少し安く済む保険。
https://learningnetworkstore.cisco.com/cisco-study-bundles/ccna-exam-safeguard-offer/EX-SG-CCNA-027329.html
- 公式チュートリアル：試験問題の出題イメージ、操作イメージの把握。特にラボ問。
https://learningnetwork.cisco.com/s/certification-exam-tutorials
- バイナリゲーム：IPv4の最長一致、集約の即答準備。
https://learningnetwork.cisco.com/s/binary-game

## 結果
- ルーティング、スイッチング、アクセス制御など、NW基礎を一通り確認できた。
- NW基礎を理解したい、という新人にはおすすめしたい。
  - 机上のみで挑むべきでないと思った。シミュレータもあるし、実機も中古数千円でも買える。
  - 実機操作以外は、pingt主軸で問題無く行けると思う。
  - 範囲広いと思うので、新人なら短期決戦より1年くらいかけて合格狙う方が良いと思う。
  - 試験改定が控えているため、今準備始めるのか改定後、pingtなどが対応するのを待つか、
動く前に良く検討を。
- 次は改定後にCCNPの範囲も見つつ、他の資格と順番考えて引き続き対応する。

以上
Vanilla Javascriptで Fade In / Out

個人的によく使うので残しておきます。:desktop:

## Javascript
### Fade In 関数
| 引数 | 型 | 説明 |
|:-:|:-:|:-:|
| element | HTMLElement | フェードインする要素 |
| display | String | 要素に適用する表示スタイル。デフォルトは"block" |
| duration | Number | アニメーションの時間をミリ秒で指定 |

```javascript
const fadeInElement = (element, display, duration) => {
  const startTime = performance.now();
  element.style.display = display || "block";

  function animate(currentTime) {
    const elapsedTime = currentTime - startTime;
    const opacity = elapsedTime / duration;
    if(opacity > 1) {
      element.style.opacity = 1;
    } else {
      element.style.opacity = opacity;
      requestAnimationFrame(animate);
    }
  }

  animate(performance.now());
};
```

### Fade Out 関数
| 引数 | 型 | 説明 |
|:-:|:-:|:-:|
| element | HTMLElement | フェードアウトする要素 |
| duration | Number | アニメーションの時間をミリ秒で指定 |

```javascript
const fadeOutElement = (element, duration) => {
  const startTime = performance.now();

  /**
   * 要素のOpacityを徐々に下げるアニメーション機能
   *
   * @param {DOMHighResTimeStamp} currentTime - アニメーションの現在時間
   */
  function animate(currentTime) {
    const elapsedTime = currentTime - startTime;
    const opacity = 1 - (elapsedTime / duration);

    if (opacity > 0) {
      element.style.opacity = opacity;
      requestAnimationFrame(animate);
    } else {
      element.style.display = 'none';
    }
  }
  requestAnimationFrame(animate);
};
```

## 参考
[Performance: now() メソッド - MDN](https://developer.mozilla.org/ja/docs/Web/API/Performance/now)
[Window.requestAnimationFrame() - MDN](https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame)
新規ユーザーの作成：OSS-DB道場でPostgreSQLを勉強してみた

### pgAdmin4で新規ユーザーを作成するには

以下のSQLで作成できます。

```
CREATE USER ユーザー名
```

pgAdmin4では以下の手順で作成できます。

①pgAdmin4のObject Explorerの新規ユーザーを作成したいDatabaseを右クリックし「Query Tool」を選択。

②ユーザーを作成するためのSQLを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/8620c49c-4f32-859f-d3b4-c55eaa4ada3d.png)

③作成したユーザーを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/4f974d1c-9f15-8293-20dd-cadd7b0d9921.png)

新しいユーザーが作成されたことを確認できます。

■参考サイト
https://oss-db.jp/dojo/dojo_info_02
トレンド調査（2024.05）

# 初めに
この記事はIT関連のトレンドをまとめた記事です。
**この記事をきっかけに詳細を調べてもらうことを目的にしています。**

# 2024年5月のITトレンド
## AIと機械学習の進展
### 小型AIモデル
クラウドコンピューティングのコストが上昇し、ハードウェアの利用が減少する中、小型で効率的なAIモデルの開発が進んでいます。Low-Rank Adaptation（LoRA）や量子化などの技術が普及しており、より迅速な微調整とメモリ使用量の削減が可能です。

### カスタムローカルモデル
企業はオープンソースモデルを利用してカスタムAIソリューションを開発することが増えています。これにより、広範なインフラ投資を必要とせずに、独自データを使用して強力なAIツールを構築することができます。

## 生成的AI
### ビジネス向け生成的AI
生成的AIの利用は、カスタマーサポートからサプライチェーン管理に至るまで、さまざまな分野で拡大しています。生成的AIの革新により、予約の取り付けや旅行の計画など、複雑なタスクを実行できるより高度なバーチャルエージェントが登場しています。

## サイバーセキュリティ
### サイバーセキュリティへの関心の高まり
デジタルトランスフォーメーションが進む中で、サイバーセキュリティへの関心が高まっています。企業は高度なセキュリティ対策に投資し、洗練されたサイバー脅威に対抗しています。プロアクティブなセキュリティ戦略と、AIを活用した脅威検出と対応能力の向上が重視されています。

## クラウドコンピューティング
### ハイブリッドおよびマルチクラウド戦略
組織はコスト最適化と柔軟性向上のために、ハイブリッドおよびマルチクラウド戦略を採用することが増えています。このアプローチにより、異なるクラウドプロバイダーの強みを活用しつつ、ベンダーロックインのリスクを軽減することができます。

## ソーシャルメディアのトレンド
### 長尺ビデオコンテンツ
ソーシャルメディアプラットフォームで長尺ビデオコンテンツの人気が再び高まっています。InstagramやTikTokなどのプラットフォームは最大ビデオ長を延長しており、ユーザーはより長く、より情報豊かなビデオへの関心を示しています。

### DM中心のエンゲージメント
ソーシャルメディアのエンゲージメントは、パブリックフィードからプライベートメッセージ（DM）へと移行しています。InstagramのClose Friendsストーリーやブロードキャストチャンネルなどの機能が、よりプライベートでパーソナライズされた交流を促進しています。

これらのトレンドは、2024年のIT分野の動的な状況を反映しており、技術およびビジネス戦略における継続的な進歩と優先事項のシフトを示しています。

詳細については、以下のオリジナルソースをご参照ください：
- [IBM Blog](https://www.ibm.com/blog/artificial-intelligence-trends/)
- [Hootsuite Blog](https://blog.hootsuite.com/social-media-trends/)


# 2024年5月のプログラミングトレンド

プログラミングの世界は常に進化しており、2024年5月におけるいくつかの主要なトレンドが注目されています。

## AIによる音声認識の進展
音声認識と応答システムが多くのデバイスで標準となりつつあります。自然言語処理（NLP）の進歩により、人間のように機械と対話することが可能となり、情報を迅速かつ便利に取得できるようになっています。このトレンドは、様々なアプリケーションにAIツールがますます統合されることによって推進されています。

## 2. ローコードおよびノーコード開発
ローコードおよびノーコードプラットフォームは、広範なコーディング知識を必要とせずに迅速なプロトタイピングとアプリ開発を可能にします。これらのプラットフォームは、開発時間とコストを大幅に削減することが予測されており、企業や新しい開発者にとって魅力的です。この分野の主要なプレーヤーには、Appian、Wix、Microsoft PowerAppsなどがあります。

## 3. 5G技術の展開
5G技術の展開が加速しており、これにより前例のないダウンロード速度と接続性が提供されます。この進歩は、AIおよび仮想現実アプリケーションの開発を促進し、より高度で応答性の高いソフトウェアソリューションの道を開くことが期待されています。

## 4. クロスプラットフォームアプリ開発
開発者は、React Native、Xamarin、Flutterのようなクロスプラットフォームフレームワークをますます採用しています。これらのフレームワークにより、複数のオペレーティングシステムでシームレスに動作するアプリケーションの開発が可能となり、iOSおよびAndroid用に別々のコードベースを必要としなくなります。

## 5. JavaScriptとそのエコシステム
JavaScriptはその強力なフレームワークとライブラリ（Angular、React、Vue.jsなど）のエコシステムで依然としてプログラミングの世界を支配しています。これらのツールは、動的で応答性の高いウェブアプリケーションの構築に不可欠であり、その人気は衰える兆しがありません。

## 6. iOS開発におけるSwift
Swiftはそのシンプルさと効率性から、iOS開発においてObjective-Cを上回る言語となっています。Swift 5のリリースは、多くの開発者にとって使いやすい新機能を提供し、モバイル開発の分野での地位を確固たるものにしています。

## 7. PHPの復活
PHPはその衰退が予測されながらも、依然としてウェブ開発において人気のある言語です。Just-in-Time（JIT）コンパイラやHipHop Virtual Machineのような革新により、PHPのパフォーマンスは大幅に向上し、その継続的な関連性が確保されています。

## 8. データサイエンスにおけるR
Rは統計学者、データサイエンティスト、およびアナリストにとって重要な言語であり続けています。データサイエンスコミュニティではPythonが好まれることが多いものの、Rの統計分析とデータ可視化の能力は依然として需要があります。

## 9. Ruby on Rails
Ruby on Rails（RoR）は、その効率性と使いやすさからウェブ開発において好まれる言語です。その強力なコミュニティサポートと堅牢なフレームワークにより、スケーラブルなウェブアプリケーションの構築において信頼できる選択肢となっています。

## まとめ
これらのトレンドは、プログラミング業界の動的な状況を反映しており、最新の技術や方法論を取り入れる重要性を強調しています。経験豊富な開発者から新規開発者まで、これらのトレンドを取り入れることでスキルを向上させ、急速に進化する技術環境で競争力を維持することができます。
Python環境構築

## Python
Pythonを触ることも増えたので、自分の環境でPythonを動かせるようにしたよ。
Pythonを勉強したいけど、構築が、、、って人！簡単だから大丈夫だよ～。

## Python環境構築編
### 必要なもの
* PC（今回はWindows環境で行うよ）
* 基礎知識


### Pythonインストール
以下のリンクからPythonをインストールするよ。
https://www.python.org/downloads/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678424/19071d63-7c8f-f442-7721-dd9b2163d55a.png)

今回は最新バージョンでダウンロードしたよ。
インストールしたファイルを開いて、、、
下のチェックボックスにチェックを入れてからインストール！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678424/75eab290-3dd5-9612-8bc8-ff584856b22a.png)



### バージョンの確認
インストールが完了したら、コマンドプロンプトでインストールされたPythonのバージョンを確認するよ。今回はver.3.12.3をインストールしたので、以下のように表示されるよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678424/accac255-d8d9-f3c1-1147-6d87c84312e3.png)


## Pythonを動かしてみよう
VSCodeやeclipseがある人はそれで、ない人はメモ帳で以下のようなファイルを作成するよ。
```python
# 果物の名前が入ったリストを作成
list = ['apple', 'orange', 'peach']
# for文でリストの中身を取り出して出力
for fruit in list:
    print(fruit)
```

今回は`py_test.py`として保存して、コマンドプロンプトで実行してみるよ。
まず、`cd xxx`でファイルを保存したディレクトリ(pywork)に移動し、ファイル名(py_test.py)を実行するよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678424/d35de927-4c1c-a32d-7161-0b69a0421730.png)

実行すると、リストの中身が表示されるよ。

## まとめ
以上がPythonのインストールから実行までの流れだよ。
環境構築が大変そうで諦めていた人もこれで実行までできるようになったはずだよ。
Vercelでデプロイしてみた

webエンジニアの風速です。

今回はVercelにNext.jsのアプリをデプロイしてみました。
VercelとはNext.jsの開発元のVercel社が提供している、主にフロントエンドのプロジェクトをホスティングできるPaaSです。
いろいろ機能はありますが今回はデプロイまで。

# 始める前に
Vercelのアカウントが必要なので作成しておきます。
Vercelを使い始めるには、ProjectsとDeploymentsを理解しておくと役立つそうなので以下に書いておきます。

## Projects
>ProjectsとはVercelにデプロイしたアプリケーションのことです。1つのリポジトリ（例えばmonorepo）に複数のProjectsを接続し、Projectsごとに複数のデプロイを行うことができます。ダッシュボードですべてのProjectsを表示し、プロジェクトダッシュボードから設定を行うことができます。

## Deployments
> Deploymentsは、プロジェクトのビルドが成功した結果です。Deploymentsは、既存のプロジェクトやテンプレートをインポートしたとき、または接続されているインテグレーションを通じて Git コミットをプッシュしたとき、または CLI から vercel deploy を使用したときにトリガーされます。すべてのDeploymentsは自動的に URL を生成します。

# やってみた
ダッシュボードの右上からNew Projectすると色々選択できます。Githubからデプロイできそうなので、今回はそれを試してみようと思います。

![スクリーンショット 2024-05-31 15.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/34b472fc-ce77-8a54-b37c-58e18330d4c6.png)

Githubに接続し、リポジトリのアクセスは全部と、選択があったのでNext.jsをさわってみたやつをリポジトリにあげたので、そちらをデプロイします。
権限を与えるとダッシュボードから選択できました。

![スクリーンショット 2024-05-31 20.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/bd730d3b-8f8d-e824-64c9-c5db35b3c658.png)

Importを押すとデプロイの設定画面に遷移します。

![スクリーンショット 2024-05-31 20.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/c20e59b2-a12d-2677-cd8e-33b78c5c49de.png)

一旦デフォルトで、下に行きDeployを押すとビルドが始まり、デプロイされます。

![スクリーンショット 2024-05-31 20.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/021abc5b-93bd-a671-9ac4-537195bc53ca.png)

デプロイされました。

![スクリーンショット 2024-05-31 20.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/3319af21-0616-428e-e269-fe58161afbee.png)

テキストをhome -> Dashboardにしてdevelopブランチにプッシュすると、developブランチがデプロイされます。
![スクリーンショット 2024-05-31 21.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/a74972d1-635c-00ae-3166-bbae74623120.png)
変更が反映されています。
![スクリーンショット 2024-05-31 21.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/c38f589b-c09e-222a-9e0e-a7f6e892bd9f.png)


developをmainにマージすると、mainが再度デプロイされて、デプロイごとに見れます。
- 初回のデプロイ
![スクリーンショット 2024-05-31 21.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/d3aba537-239a-c862-7be2-2491c2d53b84.png)
- 最新のデプロイ
![スクリーンショット 2024-05-31 21.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/20ee2dc2-de7a-2aff-3c88-6d0b36e5ec5b.png)


# 感想
今回はデプロイまでをwebでぽちぽちしただけですが、cliからもできます。
ブランチやデプロイごとに環境（おそらくこれがDeployments？）が用意され、CI/CDまで簡単にできてしまうのはすごいですね...
ほかにもモノレポの場合にフロントエンドのみデプロイなど、細かな設定が色々できるみたいです。
今回は触れられなかったのですが、developの環境にあるツールバーにもいつか書けたらと...

# 参考

https://vercel.com/docs
３Dプレイヤーの回転をなめらかにする方法

➀リアルタイムのプレイヤーの角度情報、向けたい角度（goalRot）を指定。
➁目的のキーを押したときにgoalRotを代入（例：右だと90度）
➂goalRot以下だとspeedRotずつ回転


しかしこのやり方だと、speedRot=8の時など、割り切れないときに、90度以上（96度）になった時に8度だけ引き戻そうとして88度になって、90度以下になるからまた8度回転して96度になって…という繰り返しになり、プレイヤーがぶるぶるする。（ちなみにspeedRot=8でないといけないという条件付きなのでspeedを変えるということはできない）

なのでしきい値を使って、90＋しきい値、９０－しきい値は９０度ということにするという処理が必要みたいだが、そこはまだわかってない。
EXCELの条件付き書式（指定値に等しい）

# 概要
今日はExcelについて話をしたいと思います。
Excelで表と表の比較結果で違いところに色を付けて表示する編集についてメモです。

# 事前準備
２つの表を用意する
一部の値が異なる表を作成する
比較結果の表も作成する

# 条件付き書式に反映前
A表とB表、結果表の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/4ab393ad-74c1-6aa8-f0e0-701a43012a60.png)

# 条件付き書式に反映手順
①結果の表を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/1111256c-51e0-c0d8-13d7-eb6044a9fe47.png)

②Excelのメニューにて「ホーム→条件付き書式→セルの強調表示ルール→指定値に等しい」を選択すると以下のポップアップが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/8323b72d-804d-f4cd-c026-74a697f95d80.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/737c6709-5c70-9bd7-0058-6d14bed38d1b.png)

③次の値に等しいセルを書式設定：「FALSE」を入力し、「OK」ボタンを押下すると以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/b5d5b104-22e4-ad1d-8704-48abc48919e2.png)

④全体の表を確認するとどこが異なっているか色で分かりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/1c7be77a-041d-fad3-0ce5-0672e467f18b.png)

# 終わりに
今日は簡単なExcelの編集でしたが、今まで差分結果に色を付けたことがなかったので初めてExcelの編集をしることになりましたので、メモしました。
Excelは最高のドキュメント作成ツールですね。すごい～～～
今日はここまでです。ありがとうございます。
機械学習の話題

# 概要
機械学習の昨今の話題についてまとめる

# 対照学習
- 対照学習（Contrastive Learning）は、自己教師あり表現学習のうち有効なアプローチの一つ
- 対照学習について理論的な理解が進んでいるが、学習された表現のクラスターを特徴づける方法については探求の余地がある。
    - 「対照学習によって事前学習されたエンコーダーモデルから出力される特徴ベクトルのクラスタは、どのように特徴付けられるのか？」
- クラスターの特徴付けの研究の過程で生まれたKCL(Kernel Contrastive Learning)というフレームワークが注目されている。(https://arxiv.org/pdf/2304.00395)
[NestJS] NestJSの特徴を整理。

## 参考

https://docs.nestjs.com/

https://zenn.dev/kisihara_c/books/nest-officialdoc-jp/viewer

## 予備知識

## 特徴
> Nest (NestJS) は、効率的でスケーラブルなNode.jsサーバー側アプリケーションを構築するためのフレームワークです。プログレッシブ JavaScript を使用し、 TypeScriptで構築され、TypeScript を完全にサポートしています(ただし、開発者は純粋な JavaScript でコーディングできます)。

> OOP (オブジェクト指向プログラミング)、FP (関数型プログラミング)、FRP (関数型リアクティブプログラミング) の要素を組み合わせています。

> 内部的には、Nest はExpress.js(デフォルト) などの堅牢な **HTTP サーバー** フレームワークを利用しており、オプションでFastifyも使用するように構成できます。
- フロントエンドからバックエンドまで、一貫してTypeScriptでの開発を実現するフレームワークです。
- Node.js上で動作するバックエンド開発のフレームワークです。

- GitHubでは、[**NestJS**](https://github.com/nestjs/nest) は 64k のスターを獲得しています。（比較対象として、[**Laravel**](https://github.com/laravel/laravel) は 77k です。）
- Laravel とは異なり、モジュール毎にMVCが存在します。
- RESTfullAPIの構築を簡単にし、GraphQLをサポートしています。

1. *Express.js* : Node.jsで最も有名なフレームワークです。NestJSと同様にフロントエンドとバックエンドを一貫してTypeScriptで開発できます。
1. *Node.js* : JavaScriptのバックエンド実行環境です。フレームワークではありません。非同期処理とイベント駆動型の設計により、同時接続や大量アクセスに強いです。GitHubでのスター獲得数は 100k です。

## 長所(6)

|  長所 |  根拠 |
|:-:|:-:|
|  保守性が高い |  TypeScriptの静的型付けによる恩恵です。 |
|  開発の柔軟性が高い |  モジュール構造を採用しているためコードの再利用性が高いです。また、依存性注入（DI）による恩恵も受けています。 |
|  テストが実行しやすい |  テストフレームワークとしてJestが標準搭載されています。 |
|  拡張性が高い |  モジュール構造により、アプリケーションの各部分を個別に拡張・更新することができます。 |
|  ビジネスロジックの構築に集中できる |  アーキテクチャがすでに処理されています。 |
|  ドキュメントが充実 ||
|  エンジニアが確保しやすい |  TypeScriptが開発言語であり、フロントエンドでTypeScriptを使用する場面は多くあるからです。 |

1. *依存性注入（DependencyIInjection、DI）* : コードの再利用性を高め、モジュール間の独立性を保ちながら、柔軟にアプリケーションを構築できる仕組みです。依存性を後から注入することで、柔軟性を確立します。


## 短所(2)

| 短所 | 説明 |
|:-:|:-:|
|  学習コストの高さ |  NestJSはTypeScriptの使用、依存性注入、モジュール構造など、高度なプログラミング概念を多用しています。 |
|  日本語情報の少なさ |  NestJSは古参のフレームワークと比較するとコミュニティ規模が小さいです。このフレームワークは、2017年にリリースされたものであり、比較的新しいです。 |

## NestJSプロジェクトの基本構造(5)
参考記事は [**こちら**](https://zenn.dev/higuchimakoto/articles/21c8420c4a612a#nestjs%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E9%80%A0)

```html
.
├─ main.ts
├─ app.module.ts
├─ app.controller.ts
├─ app.controller.spec.ts
└─ app.service.ts
```

| 基本構造 | 説明 |
|:-:|:-:|
|  main.ts |  プロジェクトのエントリーポイント |
|  app.module.ts |  アプリケーションのルートモジュール |
|  app.controller.ts |  単一経路を持つ基本的なコントローラ |
| app.controller.spec.ts |  コントローラのユニットテスト |
|  app.service.ts |  単一のメソッドを持つ基本的なサービス |

## NestJSの基本要素(3)

参考記事は [**こちら**](https://zenn.dev/higuchimakoto/articles/21c8420c4a612a#nestjs%E3%81%AE%E5%9F%BA%E6%9C%AC%E8%A6%81%E7%B4%A0)

| 基本要素 | 説明 |
|:-:|:-:|
|  Module |  関連するContorollerやServiceなどをまとめて、NestJSに登録します。 |
|  Controller |  ルーティングの機能を担います。 |
|  Service |  ビジネスロジックを定義します。 |

- モジュールの中に、ControllerとServiceをもちます。


## [Introduction](https://docs.nestjs.com/)
参考は[**こちら**]

NestJSは、オブジェクト指向プログラミング、関数プログラミング、リアクティブプログラミングの組み合わせで構成されます。

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |
|   |   |   |
- OOP (Object Oriented Programming、オブジェクト指向プログラミング)
- FP (Functional Programming、関数プログラミング)
- FRP (Functional Reactive Programming、リアクティブプログラミング)
[**こちら**](https://ninjinkun.hatenablog.com/entry/introrxja)の記事によると、FRPとは、非同期データストリームを用いるプログラミングのことである。
SORACOM Lagoon 3のメールアラートで届かなくなった話

## はじめに
SORACOM Lagoon 3でアラートメールを複数のメールグループに送信しようとした際にメールが届かなくなりました。
その際に解決した方法の一つについてメモとして書き残したいと思います。
なお検証内容をメモとしてまとめたものなので、この情報が正しいとは限りません。あくまで参考として見ていただければと思います。

## アラートメールの設定方法
Alert rule、Contact point、Notification policyのそれぞれを設定することで、アラートメールが届くようになります。
この記事では各項目の詳細な設定方法は触れませんが、簡単に説明すると
Alert ruleは監視するデータと通知される条件を設定できます。またContact pointと紐付けるためのLabelを設定できます。

Contact pointは通知方法、通知先、通知内容を設定することができます。今回の通知方法はEmailで通知先にはメールアドレスを入れています。

Notification policyはAlert ruleと Contact pointの紐付けの設定ができます。具体的にはLabelとContact Point名で紐付けます。

上記の設定をすることでアラートメールが届くようになります。

## 今回詰まった内容
当初は、検証用でAlert rule、Contact pointを、labelそれぞれ一つずつ作成しました。これを紐づけることでアラートメールが届きました。

検証ができたので、一つのAlert ruleに対して複数Labelを作成し、それに対応するContact pointを作成し、紐付けました。するとアラートメールが届かなくなりました。

## 解決した方法
Alert rule、Contact point、Notification policy、Labelをそれぞれ一つずつ作成し、紐づけることでメールが届くようになりました。
この時、Alertruleは全く同じ内容で、他の名前を変更して分けました。

## まとめ
今回は一つのアラート監視対象に対して、複数のメールグループを作成したいと思い、試行錯誤をしました。
上記を実現するための方法をすべて試したわけではありません。そのため参考程度にしていただきたいのですが、基本的にはAlert rule、Contact point、Notification policy、Labelはそれぞれ１対１対応になるようにするのが良いと思いました。
またそもそも同じ内容のアラートに対して、Contact pointを分けずに一つのContact pointで通知したい人のメールアドレスをすべて登録することも可能です。（むしろこちらが正しい使い方かも...）
他にも方法があるかもしれませんので、同じことをもう一度することになれば試して見たいと思います！
直流安定化電源SPE6103を校正する

## はじめに
こんにちは、ドロッパ電源が欲しくてたまらんbockringです。個人でOWONのSPE6103という直流安定化電源を所有しているのですが、電圧の誤差はほとんどないのに電流計の誤差が数百mAくらいあるんですよね(3A表示時、出力が350mA低いとかw)。ということで校正(キャリブレーション)をしていきます。

でも使いやすいのでそれなりにはおすすめです(ホビー用途)。

https://amzn.to/42YCgBP

:::note warn
この記事を読み校正を行おうと考えている方へ

校正については[取扱説明書](https://www.owon.co.jp/Upload/DownFiles/SPEシリーズ%20シングル・チャンネル直流電源%20ユーザー・マニュアル.pdf)にも載っていないことです。当然ですが、校正は自己責任で行ってください。なお、くれぐれも校正作業中の事故には気を付けて行ってください。

また、この記事を参考に校正作業を行なったことによる不利益の責任は執筆者は負いかねます。
:::
ちなみに、これが電源本体の見た目の模式図です。
![IMG_1258.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/b41d1a94-709f-b918-7955-94ca611b87f2.jpeg)
2万円程度で買える電源としては高性能品の部類に入るとは思います。この価格帯で珍しく可能な機能は
・液晶画面搭載
・電圧流のグラフ表示
・OVP/OCP(過電圧/過電流保護)機能
・ロータリーエンコーダによるデジタル設定
・任意出力の保存
・シーケンス出力
・ユーザーキャリブレーション機能(今回の内容です)
・電源ON時の出力ON/OFF設定機能
・SCPIコマンドによる専用ソフトからの制御/電圧流データの書き出し
と盛りだくさんです。それだけにスイッチングのリプル電圧の大きさと平滑用キャパシタの電荷抜けの遅さが足を引っ張る様な感じです。

## 校正モードに入る
OWONのSPEシリーズ(SPMシリーズについてはできるのか不明です)のスイッチング電源には校正機能があります。このモードに入るためには
**↑↑↓↓→←→←BA**
みたい…いやこんなものではありませんが隠しコマンド的なものの入力が必要です。それは

[Display]
↓
[Memory]
↓
[ロータリエンコーダ押し込み]
↓
[V]
↓
[A]

の順番にボタンを押す必要があります。誰でも辿り着けそうなコマンドではありますが、これが一応隠し(？)コマンドです。

## 校正する
校正には校正された測定器(マルチメータ)が必要です。校正の有効期限は1年ですので、1年以内に購入したマルチメータを使用します。私の場合、
・[KYORITSU KEWMATE 2012RA](https://www.kew-ltd.co.jp/products/detail/01080/)
・[OWON OW18D](http://owon.co.jp/products_info.asp?ProductID=57)
の2台が当てはまります。本当はお気に入りかつ購入も比較的最近の2012RAの方を使いたいのですが、OW18Dの方が確度も高いですし、桁数も5桁です。よって今回はOW18Dを用いて校正を行っていきます。(あと、2012RAは電流測定がクランプというのもある)

先に言っておきますが、操作はロータリーエンコーダ(回し/押し込み)と「Dsiplay」ボタンを用います。機能はそれぞれ
ロータリーエンコーダ回し:オプションの選択/数値の変更
ロータリーエンコーダ押込:オプション・数値の確定
「Display」ボタン押込:詳細設定画面から校正メニューへ戻る
です。

### 1 電圧の出力設定値と計測値の誤差の補正
校正メニューから「Man Volt」を選択します。まずエンコーダをクリックした後、計測器側が耐えられる範囲の電圧を指定し、エンコーダをもう1度クリックします。そして、設定した電圧と計測器側の電圧の誤差がない様にエンコーダを回して調整します。その後エンコーダをクリックし、ADCの入力値と計測器の表示値の誤差がない様に調整します。
計測器側が耐えられる(安全な)範囲で全ての電圧を校正してください。調整が完了したら「Display」ボタンを押して校正メニューに戻ります。

### 2 電流の出力設定値と計測器の誤差の補正
:::note alert
これを行う際にはマルチメーター、そして使用しているテストリード、場合によってはそのテストリードに繋いでいるアクセサリの許容電流に十分に気を付けてください。必ず確認してから行ってください。

例えば、
マルチメーター許容電流:20A(10A以上は10秒以下/それ未満は制限なし)
テストリード許容電流:20A
ワニ口クリップ変換アクセサリ許容電流:3A
の場合、最も許容電流の小さな3Aを優先します。また、校正作業中は誤差によって設定値より大きな電流が流れることもあります。この場合、許容値より1A程度小さな電流で設定し、校正作業を行いましょう。

最悪の場合ケーブルの発煙・発火、そしてそれに伴う火傷などの被害が発生する可能性があります。

なお、計測器側も「◯A以下/未満ではヒューズは永久的に溶断しません」などの記載がある場合があります。その時は溶断しない方の電流を優先しましょう。上記の例の場合10Aです。
:::
私の場合、使用している自作のバナナ↔︎ワニ口のケーブルがが4A程までなので、3Aに設定して校正を行いました。電圧の誤差補正と操作はほとんど同じですから、省略します。また同じく、範囲内で全ての電流を校正しましょう。

:::note info
2024.6/2追記

10A対応のケーブルを自作したので、テスターが耐えられる9Aまで(10Aで実行するとヒューズが飛ぶ可能性あり)校正しましたが、危険なのでやめた方がいいかもしれません。
また、遊んではいけません。調子に乗って遊ぶと火花が飛びます(飛びました)。
:::

ただし、こちらは特に使用機器・アクセサリの電流制限に気を付けて行ってください。ヒューズが飛んで済めば良かったね、って感じです。あとは使っているケーブルの発熱にも注意が必要です。数秒程度なら耐えられますが、時間がかかるので過電流にも気を付けてください。

### 3 保存して終了
最後に校正したデータを保存します。校正メニューで「Save & Exit」を選択し、保存してから終了します。間違えても「Exitlは選択しないでくださいね。データが飛びます(多分)。

### 4 校正が成功しているか確認
校正を行なった範囲内でご使用の計測器との数値の差がほとんど無いことを確認しましょう。もしズレがあったら1からやり直しです…

**これで校正作業は終了です。お疲れ様でした。**

## おわりに
最後読んでいただきありがとうございます。あまり情報がない(特に日本語の)ので記事にしてみました。電流の校正の際にはくれぐれも気を付けて行ってくださいね。

あと使う時は校正した範囲で使いましょう。校正した範囲で使えばテスターなどを繋ぐ必要はなくなりますしね。

それではまた次の記事で〜
【Rails】初心者がform_withを使うときに気を付けるポイント

# はじめに
form_withとは、Railsでデータを送るときに使うヘルパーメソッドです。

https://railsguides.jp/v6.1/form_helpers.html

このform_withを扱う時に、初心者の私が勘違いしていたことや、うっかり忘れてしまいがちだった部分をご紹介します。


## 1. modelで渡している@&#8203;listとかって何者なのか
```html:ビュー
<%= form_with model: @list do |f| %>
<% end %>
```
form_withで新規登録フォームを表示したり編集用のデータを呼び出したりするためには、オブジェクトに紐づける必要があります。

新しくデータを作りたいときは、
<b>List.new</b>
更新をしたいときはどのデータを編集するか判別するために
<b>List.find(1)</b>
などをこのmodel部分で指定します。

これをコントローラから指定するために、
```ruby:新規作成の場合
  def new
    @list = List.new
  end
```

```ruby:編集の場合
  def edit
    @list = List.find(params[:id])
  end
```
のように@&#8203;listとしてform_withにデータを渡すことで、新規作成の場合は「保存先の準備」を、編集の場合は「編集したいデータの表示」をすることが出来ます。

form_withを使ってデータの編集画面を表示したい場合は、元々登録されているデータを表示する必要があります。
例えば、
```ruby:コントローラ
  def edit
    @list = List.find(params[:id])
  end
```
```html:ビュー
<%= form_with model: @list do |f| %>
<%= f.text_field :title %>
<% end %>
```
この場合、<b>List.find(params[:id])</b>に登録されている<b>title</b>が参照されることになります。

https://railsguides.jp/v6.1/form_helpers.html#%E3%83%A2%E3%83%87%E3%83%AB%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%89%B1%E3%81%86

お恥ずかしながら私は最初の頃、この@&#8203;listが何を表しているのか分からずなんとなくで付けていました。

例えば、一覧ページに新規作成フォームと一覧表示用のデータを用意したい場合、
```ruby:コントローラ
  def index
    @lists = List.all
    @list = List.new
  end
```
のように記述したときにform_withへ@&#8203;listsを記述してしまったりと、データの渡し方に混乱していました。
今は当時より理屈が分かってきたので間違えることも少なくなりましたが、学習の際は混乱を避けるために、新規作成のモデルオブジェクトを<b>@&#8203;list_new</b>とするのもありだなと感じています。
```diff_ruby:コントローラ
  def index
    @lists = List.all
-   @list = List.new
+   @list_new = List.new
  end
```
頭の回転が速い方には何てことのない部分なのかもしれませんが、複数形と単数形の扱いや見分けも、理屈が理解しきれていない初心者には難しかったです…。


## 2.編集フォームのvalueにデータを渡す
form_withからデータを渡したのと同じように、<b>Item</b>に紐づけた<b>tags</b>をフォームに表示したいときは<b>value: @&#8203;tag_list</b>のように呼び出すことができます。
```ruby:
  def edit
    @item = Item.find(params[:id])
    @tag_list = @item.tags.pluck(:name).join(',')
  end
```

```html:
<%= form_with model: @item do |f| %>
<%= f.text_field :name %>
<%= f.text_field :tag_name, value: @tag_list %>
<% end %>
```
ちなみに、<b><%= f.text_field :tag_name, value: @item.tags.pluck(:name).join(',') %></b>で直接ビューから指定することもできました。

@&#8203;itemなどのインスタンス変数を使ったデータの作り方や渡し方が少しずつ分かってきました。
学習3か月目にしてようやく、インスタンス変数ってなんて便利なんだ！と実感してきています笑

## 3.urlとmethodのオプションを設定する
form_withでは、urlとmethodのオプションを追加することで、厳密にどのアクションへデータを送信するか指定することが出来ます。

```html:
<%= form_with model: @list, url: '/lists', method: :post do |f| %>
<% end %>
```
form_withからデータが上手く渡せない…！というときは、データの送信先が間違っている可能性もあるので、このurlの部分は要チェックです。

私は何度もここでつまづきました。
特に、似たようなフォームだからコピペで作っちゃえと思って作成したときに失敗しがちです。
原因が単純なだけに、もったいないですね。

:::note warn
ちなみに…form_withでurlを指定する際にlists_pathのようにRailsのヘルパーメソッドを使用する際は、''が不要になります。
:::

```html:
<%= form_with model: @list, url: lists_path, method: :post do |f| %>
<% end %>
```
こんな感じです。
私はここを<b>「url: 'lists_path'」</b>と書いてしまいがちで、なぜか謎のURLを探しに行ってしまう…何故なんだ…となりがちでした。
こちらも足止めされがちなうっかりポイントだったので、初心者の方はお気を付けください。

# おわりに
私の場合、最初に学んだ時よりだいぶ時間が経ってから、あれってそいうことなのか…！すごい便利だ！と、何度も伏線回収をしながら感動を覚えています。

基礎が身についていないことをひしひしと感じているので、これからも定期的に戻ったり進んだりしながら確認作業を続けていこうと思います。
コードゴルフ大会のためのコードチェックが500エラーになって困った


# はじめに

こんにちは、エンジニアのkeitaMaxです。

前回、コードゴルフ大会のために、コードの正当性を判定する処理を作成しました。しかし、コードがエラーになると500エラーが発生し、任意のレスポンスを返すことができず困ってしまいました。これを備忘録として記事にまとめます。

前回の記事

https://qiita.com/keitaMax/items/2e10d9a78897ff6d02d4

# 前回のコード

```php
function codeExecutionOutput($code){
    ob_start();
    eval($code);
    $output = ob_get_clean();
    return $output;
}
```

こんな感じで同じファイル内に関数として置いて、関数を呼び出すというような実装をしていました。

# だめだったこと

単純にtry catchで囲えばいいかなと思って、関数を呼び出しているところを以下のように囲んでみました。
```php
try {
    self::codeExecutionOutput($code);
} catch (Exception $e) {}
```
これだけではcatchに入っていくれないで500エラーになってしまいました。

# 結論

コードチェック用の別のコンテナを立てて、そちらのAPIを叩くことで対応しました。

もしevalでエラーになってしまっても、フロント側に返すレスポンスはAPIサーバ側で操作できます。

ついでに別コンテナになったことでセキュリティ面も向上した？のでよかったかなと思います。


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
登録ユーザーの確認：OSS-DB道場でPostgreSQLを勉強してみた

### PostgreSQLで登録ユーザーを確認する手順

登録ユーザーは、pgAdmin4からであれば以下の手順で確認できます。

①pgAdmin4のObject Explorerの登録ユーザーを確認したいDatabaseを右クリックし「PSQL Tool」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/49d626da-abd0-8b22-fb99-9f55d1ad1e64.png)

②「\du」コマンドを実行し結果を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/17706fc7-5309-a4fd-cb37-2a4c41bd547e.png)

ロール名とそのロール名に与えられた権限が確認できます。

### 参考サイト
https://oss-db.jp/dojo/dojo_info_02
若手社員の挑戦！はじめてのスクラムマスター！

## はじめに
こんにちは、社会人二年目のGUです!

先日(憧れの？)スクラムマスターになってきました。そこで今回はスクラムマスターを行ったときの、よかった行動、次回改善できる点(反省点)、スクラムマスターをやってよかったことを述べたいと思います！

## スクラムマスターとは
そもそもスクラムマスターとは？ChatGPTに聞いてみました。以下のような返答が返ってきました。

> スクラムマスターは、アジャイル開発手法の一つであるスクラムにおける役割の一つです。スクラムマスターの主な役割は、スクラムチームが効果的に機能するようにサポートし、スクラムのプロセスが正しく実行されるように導くことです。
> #### 主な役割と責任
> 1. スクラムの促進: スクラムマスターは、スクラムイベント（スプリントプランニング、デイリースクラム、スプリントレビュー、スプリントレトロスペクティブ）が適切に行われるようにします。
> 1. 障害の排除: チームが効率的に作業を進められるように、外部からの障害やチーム内の問題を取り除く役割を担います。
> 1. コーチング: スクラムの原則とプラクティスに従うようにチームをコーチし、チームメンバーが自己管理できるようにサポートします。
> 1. 利害関係者との調整: プロダクトオーナーや外部のステークホルダーと協力し、チームが目標を達成するた めに必要なリソースやサポートを確保します。
> 1. 改善の推進: チームのパフォーマンスを継続的に改善するためのプロセス改善を支援します。


## よかった行動

- 引き継ぎ

    スクラムマスターを行う期間にお休みをいただいた日があったのですが、事前にスクラムマスターを代わりにやっていただけるようメンバーにお願いをしていました。これをしておかなければマスター不在が原因でごたごたになる可能性もありますので当たり前ですが忘れずに行う必要があると思います。
   <br> 
    
- 曖昧さをなくす行動　<br>
 スクラムマスターになるにあたり始めて行うタスクも多くありました。議事録作成、会議の開催、これらは先輩が行っているの見てどのようなことを行うのかはそこそこ理解しているつもりではいました。
しかし、少しでも分からないことはその都度スクラムマスターを経験した先輩らに質問をし**不明点の解消**を欠かさず行っていました。<br>
このまま質問せずにでも実行できたと思います。しかし、そのあいまいな理解では大きな問題になる可能性が高いです。末端でも問題となるのになにせチームを取り仕切る存在ですもんね...あいまいな理解での行動は許されません。

## 次回改善できる点

- 周りへの気配り<br>
周りへの気配りがあまりできていなかったなあというのが一番の反省です。各自メンバーの、タスクの進捗状況を把握し、終わりそうだったらこのタスクどう？、助けに入ってもらった方がよいのでは？など適切な声掛けを行うことですね。<br>
正直なところ、今までは自分のことで手いっぱいで他メンバの持ちタスク、状況をあまり把握しようとしていませんでした。これをいきなりスクラムマスターになったときにいきなりやるというのは難しいですよね。日頃から行う必要があると思いましたし、実際、経験後は以前とは比べ他メンバの状況も気になるようになりました。この調子で自分のことだけでなく他メンバの状況もしっかり把握することに慣れていき、それを考えたフォローもできるようになっていきたいと思います！<br> <br>


- 議事録の作成 <br>
私のチームでは議事録を作成することもスクラムマスターの役割の一つとなっているのですが、これもなかなかに大変でした。会議に参加し、理解しながら話されたこと、決まり事をとっていく...はじめてだと難しいです。これも上と同じなのですがスクラムマスターでなくても普段から会議内容を理解し必要事項をメモを取っていくということを繰り返していけば慣れていくはずなのでこちらも頑張っていきます！



## やってよかったスクラムマスター！

スクラムマスターをやってよかったなと思うことは以下の二点です。
- 意識の変化 <br>
スクラムマスターを行った前と後では意識が変わったと感じています。チームに入ってくる要望、不具合のメールも自分のこととして受け取るようになりました。どうやったら解決できるだろう？こういう機能あったよなとか...また、上でも述べたようにメンバーの進捗具合も気になるようになりました。こうした経験を積んで憧れの先輩みたいに成長していくきっかけなのかなってワクワクしています。<br><br>

- 周りへの刺激 <br>
自分は教えていただくまで気が付かなかったのですが、それは**メンバーらへの刺激**です。私の上司はリーダーも完璧にできなくてもよい、若手は姿勢を見せることでメンバへの刺激となりチームに貢献できるといってくださりました。
確かに、私の働く会社にも4月に新入社員らが入ってきて優秀エピソードを聞くたびに自分も頑張らなきゃ...！ってなりますし。
メンバーの中で一番社会人歴の少ない自分がマスターを行った結果、先輩メンバーもうれしい言葉をかけてくださりましたし少しは刺激になれたのかなと思います。
もっと刺激を与えられる存在になっていきたいですね！



## おわりに

今回、一度スクラムマスターを経験したことでお仕事における、普段の感じ方も変わりました。

至らぬところが多くありながらも、経験させてくださった上司、チームメンバーに感謝です！
今後もスクラムマスターを行うことは何度もあると思いますのでそのたびにひとつ前より良い行動をとれるように成長してきたいと思います！

(余談で、あまり論理的ではないですが個人的にもうちょっと士気のある声だせたらやる気も上がるのかなと思いました。)

以上です、読んでいただきありがとうございました！
UnityのEditorスクリプトでXR Plug-in ManagementのPlug-in Providersをセットする

UnityのEditorスクリプトでXR Plug-in ManagementのPlug-in Providersをセットする方法です。
![Screenshot 2024-05-31 at 20.59.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99370/3d87f949-7c01-6564-f823-d83a7d129012.png)

Assemble Definitionを適切に設定
![Screenshot 2024-05-31 at 20.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99370/4c5947be-106b-86de-cf76-b8f978a807e4.png)

```cs
using UnityEngine;
using System;
using System.Linq;
using UnityEditor;
using UnityEditor.XR.Management;
using UnityEngine.XR.Management;

public class EnablePluginProviders : MonoBehaviour
{
    [MenuItem("Tools/Enable XRPlugin")]
    public static void EnableOpenXR()
    {
        EnableXRPlugin(BuildTargetGroup.Standalone, typeof(UnityEngine.XR.OpenXR.OpenXRLoader));
        EnableXRPlugin(BuildTargetGroup.Android, typeof(UnityEngine.XR.OpenXR.OpenXRLoader));
        EnableXRPlugin(BuildTargetGroup.VisionOS, typeof(UnityEngine.XR.VisionOS.VisionOSLoader));
    }

    public static void EnableXRPlugin(BuildTargetGroup buildTargetGroup, Type loaderType)
    {
        // Get the current XRGeneralSettings instance
        XRGeneralSettings xrGeneralSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(buildTargetGroup);

        if (xrGeneralSettings == null)
        {
            Debug.LogError("XRGeneralSettings is null. Make sure XR Plugin Management is installed and configured.");
            return;
        }

        // Get or create the XRManagerSettings instance
        XRManagerSettings xrManagerSettings = xrGeneralSettings.AssignedSettings;
        if (xrManagerSettings == null)
        {
            xrManagerSettings = ScriptableObject.CreateInstance<XRManagerSettings>();
            xrGeneralSettings.AssignedSettings = xrManagerSettings;
        }

        // Enable the specified loader if it's not already enabled
        if (!xrManagerSettings.activeLoaders.Any(loader => loader.GetType() == loaderType))
        {
            var xrLoader = ScriptableObject.CreateInstance(loaderType) as XRLoader;
            xrManagerSettings.TryAddLoader(xrLoader);
        }

        // Set the initialization mode to OnDemand or Automatic as needed
        xrManagerSettings.automaticLoading = true;
        xrManagerSettings.automaticRunning = true;

        // Save the changes
        EditorUtility.SetDirty(xrGeneralSettings);
        EditorUtility.SetDirty(xrManagerSettings);
        AssetDatabase.SaveAssets();

        Debug.Log($"{loaderType.Name} has been enabled successfully for {buildTargetGroup}.");
    }
}

```
ZED2iセンシング検証 ～ロングスカートを履いた状態でどこまで正確に反応してくれるのか～

# この記事の目的
自分が知っておきたい範囲で、ロングスカートを履いた状態でZED2iを使ってどこまで人として認識してくれるのかやんわりと記録する。備忘録。（まあなんとなく結果は想像できそうですが）
ZED2iでトラッキングまでできたけど、なんとなく部屋一つ分での精度は知っておきたい人向け。

[ZED2i公式サイト](https://www.stereolabs.com/products/zed-2)

## 早く結果が知りたい人向け
ロングスカートだとうまく反応しません。足の膝辺りの認識はさせないといけないみたいです。

# この検証で行うスペック環境
### 内部（PC）
+ Windows11
+ AMD Ryzen 5 3600X 3.8GHz
+ Windows(C:)残り容量が15.6GB 
※10GB以下になるとZEDExplorerから注意されます
+ ZEDExplorerの設定
HD1080/30fps 他全てDefault
+ ZED SDK4.0を使用して、Unityで検証を行う
※今(2024/5/30)にUnitySDKを見てみたところ4.1VerのSDKが見つかったので今からやる人は4.1のSDKをダウンロードしておくことをお勧めします。（ZED SDKのverと合わせておくように！）

### 外部(配置など)
+ USB3.0に直接接続
+ 三脚を使用　ZED2iセンサーの底辺から約80cm
使用した三脚 [TOKISTAR ライトスタンド コンパクトスタンド TS-104-ST](https://www.amazon.co.jp/TOKISTAR-TS-104-ST-%E3%83%A9%E3%82%A4%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89/dp/B00P7F7M86/ref=asc_df_B00P7F7M86/?tag=jpgo-22&linkCode=df0&hvadid=266446530473&hvpos=&hvnetw=g&hvrand=2942333450138495595&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009308&hvtargid=pla-470170236404&mcid=61d81aed428d3841b420f72237f97bd7&th=1)

# 実践
1. 所定の位置に立つ
2. 照明の明るさを明、暗に分け、計三回行う
3. 1m、2m、3mと距離を放していってセンシングするか試す
Unityのプロジェクトにモデルが出てきたらセンシング成功です

![A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723719/39fd69e8-6b74-66c8-f6e1-c220531d96e7.png)

:::note info
公式では20mまでセンシング出来ると記述されている
:::

### 実験 ロングスカートを着た状態で立つ

#### 照明　明るい
1m:画角に収まらない

2m:反応するが挙動が不安定（モデルが回転する）
![C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723719/e72c3a6a-213a-4c57-1820-6e7075358639.png)

3m:反応　2mより挙動は良かった
![D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723719/95ab75be-b5e3-4cd9-9714-29ace6141f00.png)

所感
全体を通して、ロングスカートは足として認識してくれないみたいです。若干動いてはくれますが満足した挙動はしてくれません。手を広げて左右に振ると足が浮きます。
実験した中だと3mが一番センシングしやすかったです。

#### 照明　暗い
1m:画角に収まらない　ちょっとだけ反応した

2m：明るい場所より挙動が怪しかった
![F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723719/cd1f5d98-2358-0d3c-b609-848ec480b115.png)

3m：白い服を着ていたおかげか反応は良かった
![G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723719/9f4047d0-a0e8-9e32-5a25-f6f79895fd54.png)

所感
服の色と背景の色にも関係しているみたいです。
恐らく意図してないであろう暗い場所でも、人は認識したのでよほど暗くなければ使うことができそう。

### 補足

暗い場所で黒いワンピースを着て実験を行うと更に精度が悪くなり、後ろに暗幕を被せて行うともはや人として認識しませんでした。
ZED2iを使用する際は、なるべく服の色と背景の色を乖離させた方が良いかと思われます。
Tips: Macでターミナルを起動するごとにデスクトップとダウンロードディレクトリを空にする

## この記事は何
僕はデスクトップフディレクトリ、ダウンロードディレクトリが散らかっているのが好きではないので、
ターミナルを起動するごとに置いてあるファイルをすべてゴミ箱へ移動させるようにしています。

この記事では、その設定方法をまとめます。

:::note warn
この設定を行う前に、大切なファイルなどがデスクトップディレクトリ、ダウンロードディレクトリにないかを確認することをお勧めします。
:::


## 環境
端末: Mac （brewインストール済み）
ターミナル: zsh

## 準備
コマンドでファイルをゴミ箱に送るのを簡単にするため、`trash`というライブラリをインストールしています。

インストールは以下のコマンドで可能です
```sh
$ brew install trash
```

## `.zshrc`に書くコード
以下のコマンドを`.zshrc`に書いています。

```zsh
# trashがインストールされている場合のみ実行
if type trash > /dev/null 2>&1; then
  # 起動時に自動削除
  eval "trash -F ~/Downloads/* > /dev/null 2>&1"
  eval "trash -F ~/Desktop/* > /dev/null 2>&1"
fi
```

これで、ターミナルを起動するごとにデスクトップ、ダウンロードディレクトリのファイルをすべてゴミ箱に移動し、常に綺麗な状態を保つことができます。
ElixirとCのコミュニケーション方法

ElixirとCのコミュニケーション方法についてまとめてみました．

# Native Implemented Functions (NIFs)

https://www.erlang.org/doc/apps/erts/erl_nif

https://erlang.org/documentation/doc-15.0-rc1/doc/system/myths.html#myth-a-nif-always-speeds-up-your-program

* ElixirからCへは，NIF関数の呼び出しとして実現し，所定のインタフェースを使って引数をC側で取り出します．
* CからElixirへは，[`enif_send`](https://www.erlang.org/doc/apps/erts/erl_nif.html#enif_send)を用います．サンプルプログラムはこちら: https://github.com/zacky1972/nif_send_sample

NIFの欠点は，Cプログラムがアボートすると，Erlang VMごと異常終了することです．防ぐ方法は下記を地道にやります:

* [堅牢なNIFの書き方: パフォーマンスの高いフォールト・トレラント・システムのためのElixirとCの併用〜その1 関数呼び出しそれぞれに条件分岐を設ける](https://qiita.com/zacky1972/items/b1cbac9a4f31cd60800a)
* [堅牢なNIFの書き方: パフォーマンスの高いフォールト・トレラント・システムのためのElixirとCの併用〜その2 慣習に従ったエラー処理を書く](https://qiita.com/zacky1972/items/fa52c07532c8d4c704b0)
* [堅牢なNIFの書き方: パフォーマンスの高いフォールト・トレラント・システムのためのElixirとCの併用〜その3アサーションを積極的に書く](https://qiita.com/zacky1972/items/23736bc430286b29f3c5)


# Ports

https://www.erlang.org/doc/system/c_port

PortだとElixirのデータとのやりとりに少し困るので，Cのプログラムで，`ei.h` をインクルードして，データ構造をやりとりできるようにします．

Erl_Interface User's Guideはこちら．

https://www.erlang.org/doc/apps/erl_interface/ei_users_guide.html

次のような機能があるそうです．

> * Manipulation of data represented as Erlang data types
> * Conversion of data between C and Erlang formats
> * Encoding and decoding of Erlang data types for transmission or storage
> * Communication between C nodes and Erlang processes
> * Backup and restore of C node state to and from Mnesia

Google翻訳による日本語訳はこちら

> * Erlang データ型として表現されるデータの操作
> * C 形式と Erlang 形式間のデータ変換
> * 送信または保存のための Erlang データ型のエンコードとデコード
> * C ノードと Erlang プロセス間の通信
> * Mnesia との間での C ノード状態のバックアップと復元

* ElixirからCへは2通りあります．
  * ElixirからPortで送って，C側で Conversion of data between C and Erlang formats (C 形式と Erlang 形式間のデータ変換)の機能を使って受け取ります．Erlangですが，サンプルプログラムはこちら: https://www.erlang.org/doc/system/erl_interface.html
  * Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って，[Node](https://hexdocs.pm/elixir/Node.html)通信のプログラムとして作る．
* CからElixirへは次のようにします．
  * Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って，[Node](https://hexdocs.pm/elixir/Node.html)通信のプログラムとして作る．

# SpawnCoElixir + NIF

SpawnCoElixirは，Elixirをコマンド起動し，Node接続します．Nodeとのやりとりを Elixir 側で行い，NIFに渡します．

https://hex.pm/packages/spawn_co_elixir

起動したElixirでNIFを起動することができます．こうすると，NIFがアボートしても，SupervisorがElixir+NIFを起動し直してくれます．

したがって，従来のNIFのコードをそのまま利用することができ，かつ，NIFがアボートしても異常終了することなく，再起動できます．

* ElixirからCへは2通りあります．
  * ElixirからCへは，NIF関数の呼び出しとして実現し，所定のインタフェースを使って引数をC側で取り出します．
  * Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って，[Node](https://hexdocs.pm/elixir/Node.html)通信のプログラムとして作る．
* CからElixirへも2通りあります．
  * [`enif_send`](https://www.erlang.org/doc/apps/erts/erl_nif.html#enif_send)を用います．サンプルプログラムはこちら: https://github.com/zacky1972/nif_send_sample
  * Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って，[Node](https://hexdocs.pm/elixir/Node.html)通信のプログラムとして作る．
Uipath　条件分岐について

# 条件分岐

分岐処理を作りたい場合は「条件分岐(if)」を使用。

![★new説明001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/a6f58926-9acd-5ea3-2ffd-fed343d1c406.jpeg)


用途に合わせて条件分岐(Else if)でも可。
![★new説明002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/8e3feffe-2b5f-34a7-d234-46bdfd52f87a.jpeg)




使い方は簡単で

条件に式を入力
ThenとElseの中にアクティビティを入れる。

処理の動きは
条件に入った式が正しければ

Thenの中の処理を行い、Elseの中の処理は行わない。

逆に
条件に入った式が正しくなければ、
Thenの中の処理は行わず、Elseの中の処理を行う。





以下の例では
条件式に1=2
Then、Elseにはメッセージボックスを設定。

![★new説明003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/8c28cfd7-35af-00da-ddf6-95bbf5e97fca.jpeg)





試しにこれを動かしてみると




「×」のメッセージボックスが表示され、処理は終了する

![★new説明004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/c6595ac8-eb2d-d6eb-1edf-32f6c8c92988.jpeg)





条件を1=1にした場合は

「○」のメッセージボックスが表示されます
![★new説明005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/2eac14d2-8351-05b4-35dc-7529b36f889d.jpeg)





サンプルのため、条件の式を固定値にしましたが

数字情報を保有した変数と変数を条件の式に設定することもできます。
[Python3][Linux]画像サイズを一括変換する方法

## 要　旨
Linux下においてPython3を使用して画像サイズを一括変換する方法について記述します。
## 実施要領
### 準備
作業用フォルダimage_resizeの作成
```linux
mkdir image_resize
```
作成したimage_resizeフォルダ内に入る。
```
cd image_resize
```

仮想環境venv構築
```
python -m venv .venv
```
仮想環境のアクティブ化を実施
```
source ./.venv/bin/activate
```
画像処理に便利なPIL(Python Image Library)をインストールする。
```
pip install pillow
```
画像サイズを320x320に一括変換する処理を含ませたpythonコードを作成する。
なお変換可能な画像の型式は、png、jpg、jpegである。
```python3:resize.py
from PIL import Image
import os

def resize_images(input_dir, output_dir, target_size=(320, 320)):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            input_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, filename)

            img = Image.open(input_path)
            img_resized = img.resize(target_size)
            #img_resized = img.resize(target_size, Image.ANTIALIAS)
            img_resized.save(output_path)

#入力ディレクトリと出力ディレクトリを指定
input_directory = 'input_dir'
output_directory = 'output_dir'

resize_images(input_directory, output_directory)
```
変換したい画像を配置するinput_dirフォルダ及び変換先画像を格納するoutput_dirフォルダを作成する。
```
mkdir input_dir
```
```
mkdir output_dir
```
これで画像を一括変換する準備完了である。
### 画像サイズの一括変換実施要領
変換したい画像をinput_dirに配置する。
python3コードの実行
```
python resize.py
```
venvのアクティブ化を解除する。
```
deactivate
```
これでinput_dir内の画像が全て320x320のサイズに変換されてoutput_dirに格納される。
変換したい画像サイズが320x320以外の場合は、resize.pyファイルのtarget_size=(320, 320)の部分を適宜変更する。
## 結　言
今回は、Linux下においてPython3を使用して画像サイズを一括変換する方法について記述しました。