OmniAICreator/Qiita-1.07M huggingface dataset:
社内AI勉強会


# ワークショップ: インディー市場向けミニゲーム企画の作成

## 目的
- AIを活用してインディー市場向けのミニゲーム企画を作成する方法を学ぶ
- プロンプトの改善を通じて、具体的なゲーム企画を発展させるスキルを身につける


---

## セッション1: オープニングセッション

### イントロダクション
- 雑に、使ってみましょう

### プロンプト例
```text
あなたはゲームクリエイター、企画者、プランナーです。パズルゲームをつくってください。
```
---

## セッション2: 基本プロンプトの作成

### プロンプト例
```text
あなたはゲームクリエイター、企画者、プランナーです。以下のテーマ情報を元に、かつ、以下の付加情報をもとに、ミニゲームの企画を作成してください。ゲームはインディー市場に出荷されるもので、開発規模は小さいものとします。
```

### テーマ情報と付加情報
- **テーマ情報:** ゲームのジャンル、ターゲットユーザー、ゲームの目的
- **付加情報:** プレイヤーの操作方法、ゲーム内のチャレンジ、報酬システムなど

### ワーク
- 各参加者が個々のプロンプトを作成し、共有



---

## セッション3: プロンプトの改善

### グループディスカッション
- 参加者が作成したプロンプトをグループでレビュー
- フィードバックを基にプロンプトを改善

### 改善例
```text
あなたはゲームクリエイター、企画者、プランナーです。以下のゲームジャンル、ターゲットユーザー、ゲームの目的を元に、プレイヤーの操作方法やゲーム内のチャレンジ、報酬システムを含むミニゲームの企画を作成してください。
- ゲームジャンル: パズルゲーム
- ターゲットユーザー: カジュアルゲーマー
- ゲームの目的: 時間内に全てのパズルを解く
- プレイヤーの操作方法: タッチスクリーンまたはマウスクリック
- ゲーム内のチャレンジ: 増える難易度、ランダムに出現する障害物
- 報酬システム: レベルクリアごとにポイント獲得、ポイントでアイテム購入
```

---

## セッション4: 具体的なゲーム企画の作成

### シナリオ例
```text
以下のテーマ情報と付加情報を元に、具体的なミニゲーム企画を作成してください。
- ゲームジャンル: アクションアドベンチャー
- ターゲットユーザー: 若年層
- ゲームの目的: 謎解きをしながらステージをクリアする
- プレイヤーの操作方法: キーボードとマウス
- ゲーム内のチャレンジ: 敵との戦闘、パズル解き、時間制限
- 報酬システム: ステージクリアごとにキャラクターのスキルアップ、ボーナスアイテム獲得
```

### ワーク
- 各グループで具体的なゲーム企画を作成
- シナリオ、キャラクターデザイン、ステージ設計、報酬システムなどを詳細に書き出す

---

## セッション5: フィードバックとディスカッション

### 発表とフィードバック
- 各グループが作成したゲーム企画を発表
- 他の参加者からフィードバックをもらい、企画を改善

### ディスカッション
- プロンプトと企画の改善点を全体で議論
- どのようにAIを活用して企画を発展させるかを共有

---


---

どうぞよろしくお願いいたします。皆様とのお話を楽しみにしています！
【Rails】You need to supply at least one validation エラーが発生したら

## 概要

Rails アプリでフォームデータを送信するとき、以下のようなエラーが発生しました。

```
You need to supply at least one validation
```

## 原因

このエラーは以下のように `validates` メソッドにバリデーションの内容が指定されないと発生します。

```rb
class Profile < ApplicationRecord
  validates :user_id
end
```

## 対処法

このエラーを解決するためには `validates` メソッドに適切なバリデーションを指定します。例えば `user_id` が一意であることを検証するために `uniqueness: true` オプションを指定できます。以下のようにすると、エラーは解消されます。

```rb
class Profile < ApplicationRecord
  validates :user_id, uniqueness: true
end
```

## まとめ

`validates` メソッドを使用する際は、バリデーションの内容を必ず指定します。指定しない場合 `You need to supply at least one validation` エラーが発生します。以下は、よく使用されるバリデーションオプションです。

- `presence: true` : 存在を確認します。
- `uniqueness: true` : 一意性を確認します。
- `length: { minimum: 6 }` : 長さの最小値を確認します。
- `format: { with: /\A[a-zA-Z]+\z/ }` : 特定のフォーマットを確認します。
- `numericality: true` : 数値であることを確認します。

また `validate` メソッドはカスタムメソッドに対して使用されます。
カスタムバリデーションを定義する場合に利用します。
リンク先をBigに表示するChrome拡張機能を作った！

タイトルの通りですが、chromeの拡張機能を作りました。
chromeの基本機能では、ブラウザ左下に小さくリンク先が表示されます。
視線を移すのが面倒&文字が小さくて視認性が悪い
という不満があったので、GIFのようなものを作りました。
（公開するのに若干時間がかかるので、公開出来次第、ストアのリンク追記します）

![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/53b7af11-c7d1-e98a-c977-89eba92cc1b0.gif)

# 実装
- manifest.json
- popup.html
- popup.html
- contents.js
- styles.css

を作成します。
```json:manifest.json
{
  "manifest_version": 3,
  "name": "Big Link View",
  "version": "1.0",
  "description": "Displays the URL of a link when hovering over it.",
  "action": {
    "default_popup": "popup.html"
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["contents.js"],
      "css": ["styles.css"]
    }
  ]
}

```
```html:popup.html
<!DOCTYPE html>
<html>
  <head>
    <title>Popup</title>
    <style>
      body {
        min-width: 200px;
        min-height: 100px;
      }
    </style>
  </head>
  <body>
    <h1>Big Link View</h1>
    <button id="close-button">close</button>
    <script src="popup.js"></script>
  </body>
</html>

```
```js:popup.js
document.getElementById("close-button").addEventListener("click", () => {
  window.close();
});

```
```js:contents.js
let hoverTimer;
let currentLink;
let mouseX;
let mouseY;

// マウスの位置を取得
document.addEventListener("mousemove", function (event) {
  mouseX = event.clientX;
  mouseY = event.clientY;
});

// 要素にマウスオーバー
document.addEventListener("mouseover", function (event) {
  // マウスオーバーした要素（親含め）にaタグが含まれる
  const target = event.target.closest("a");
  if (target && target.hasAttribute("href")) {
    currentLink = target;

    // 0.8秒後にリンクを表示
    hoverTimer = setTimeout(() => {
      const urlDisplay = document.createElement("div");
      urlDisplay.id = "url-display";
      urlDisplay.innerText = target.getAttribute("href");
      document.body.appendChild(urlDisplay);

      urlDisplay.style.left = `${mouseX}px`;
      urlDisplay.style.top = `${mouseY}px`;
      urlDisplay.style.transform = "translateY(-100%)";
    }, 800);
  }
});

// マウスアウト
document.addEventListener("mouseout", function (event) {
  if (currentLink) {
    clearTimeout(hoverTimer);
    const urlDisplay = document.getElementById("url-display");
    if (urlDisplay) {
      urlDisplay.remove();
    }
    currentLink = null;
  }
});

```
```css:.styles.css
#url-display {
  position: absolute;
  background-color: yellow;
  color: black;
  border: 1px solid black;
  padding: 5px;
  z-index: 1000;
  font-size: 18px;
  font-weight: bold;
  pointer-events: none;
}

```

popupは、上部のタブからクリックしたときに表示されるもの。
contents.jsは拡張機能の本丸です。

# 今後
今後、改修したいのは以下3点

1. 現在は0.8秒同じ要素をマウスオーバー（選択）した際に大きなリンクが表示されるように作りましたが、各自の設定で表示するまでの時間を変更できるようにしたい
1. 表示されるリンクのスタイルを各自の設定から変更できるようにしたい
1. クリックイベントで作られる遷移先も表示できるようにしたい（ただの願望。できるかどうかは調査必要）
育休中に個人開発をするためにやったこと

はじめまして。
小１(6歳)と1歳の二児の母です。

第二子が生後9ヶ月頃にReact特化のプログラミングスクールShiftBに入会してリスキリングを始めました。
少し前に岸田総理が育休中のリスキリングについて発言して「そんなものできるか！！子供育てたことあるんか！！増税メガネ！！」と大炎上していました。
炎上するのも当然だと思いますが、私が育休中に1日5～6時間の勉強時間を確保し、個人開発をするためにしたことをまとめてみたいと思います。
※出来る出来ないの判断をするのは保育者本人です！まわりが勝手に出来る出来ないを判断しないようにしてほしいと思いますが、この記事を読んだら「出来る出来ない」より「やるやらない」の判断になるかなとは思います！

前提として、第二子が生後9ヶ月のころの話です。
育休中といっても状況は様々で、赤子の月齢が新生児なのか、11ヶ月なのかで昼間の過ごし方も夜間の睡眠の長さも大きく異なりますので、月齢は重要な問題です。

さて本題ですが、私がやったことは「赤子の睡眠を親主導で整える」です。
これだけです。
第二子には新生児のころから一人で寝てもらう練習をしていました。
授乳して寝落ちさせたり、抱っこでスクワット、ゆらゆら、抱っこ紐等々寝やすい手段を探して、あの手この手で寝かそうと努力するだろうと思いますが、すべて「癖」になりますし、教えた寝方で寝るようになります。
「抱っこじゃないと寝ない！」は思い込みで、「抱っこで寝る練習を繰り返した結果抱っこで寝るようになった」だけのことです。
「布団に置かれたら寝る。寝床は布団」と教えて「布団で寝るのが当たり前」の赤ちゃんに育てたら良しです。
私は安全な寝床に置く、お休み！で寝るんだよとずっと教えていました。
つまり、セルフねんねを教えていました。
セルフねんねは母子ともに最高だと感じています。

抱っこや車では寝られたとしても充分に身体が休まらないと思います。
赤ちゃんは寝た時の状況と眠りが浅くなった時の状況が一緒じゃないと起きて泣いてしまうことが珍しくないです。
ですから最初から布団で(ベビーベッド)寝かしました。
抱っこでゆらゆらして寝かせて、寝ている間に立ったままスマホで学習～なんて見かけることもありますが、私はそんな大変なことしていません。
置くと起きるのも当然ですので、抱っこで寝かすことが習慣化している場合は親の意思で改善していかないと仕方ないのかもしれません・・
セルフねんねしてもらうために重要な要素がいくつかありますが、他が完璧でもこれを間違えると寝られるわけがない。

それが「寝かしつけのタイミング」です。

いい感じに眠くなっているタイミングで寝床に置くことが何より重要なんです。
個人差ありますが、眠くないと寝られないのは当然のことで、眠気通り越すと逆に寝られなくなるのも赤ちゃんあるあるです。

ということで赤ちゃんが一番眠りやすいタイミングを計算する(あくまで机上の計算です。)アプリを開発することにしました。

第二子は昼寝を2-3時間、最初から最後まで一人で寝室でしてくれて、就寝時刻は18-19時で9ヶ月から夜通しねました。(12-13時間)
8か月頃までは夜間睡眠は10時間が限界でした。(それでも優秀ですよ)
小1の子は20時には寝室に行きますし、もちろんセルフねんねで私は20時には自由なのです。

そこから24時までの時間と昼寝の時間も1-2時間は勉強する時間です。
赤ちゃんが起きている時間に抱っこして勉強とか、そんなことはしていません。
6年ぶりの可愛い赤ちゃんを存分に愛でています。それでも時間は確保できます。

ただし、これが生後半年未満となると夜間の授乳もまだ必要な月齢だったりするので、保育者も夜通し寝られず寝不足だと思いますし、無理はしない方がいいと思います。
逆にそれくらいの月齢の赤ちゃんは分離不安もまだなかったり、一回あたり長くはないにしても昼寝の回数も3-4回あるので細切れの非効率的な学習なら出来るかもしれません。。が無理はしない方が、、、と思います。

産後3か月未満のほぼ産褥期の人は寝た方がいいです。
勉強している場合ではないです。

育休中は赤ちゃん寝ないし、置けないから自分の時間がないというのが当たり前のように言われているように思いますが、上手く寝かすことができたら自分の時間を確保できますし、赤ちゃんも寝られてるから機嫌も良くひたすらかわいい我が子になります！

__まとめ__
セルフねんねしてもらう、これが全てです！
育休中でも赤ちゃんに布団で寝て貰えば十分時間の確保は可能です。
赤ちゃんが起きている時間はお世話したり遊んであげたり愛でることに集中してもです。
昼寝をさせる(しないと夜泣きに繋がりますし。)、布団で寝させる、夜通し寝られるように睡眠を整える！そのために私が開発したアプリを使っていただきたいなと思います！


__補足__
低月齢(～3ヶ月頃まで)の赤ちゃんは教えた方法で寝るようになる習得スピードが速いです。
なぜならまだ癖がついていないからです。
月齢が大きくなっていくと抱っこで寝るんだ🎵を記憶しているので、今日から布団だよが通じにくくネントレも候補に挙がってきます！
そんな時に乳幼児睡眠コンサルタントの資格を持つ専門家がいるのでぜひ頼って自分の時間をしっかり確保して楽しく充実した育休ライフを満喫できたらと思います！
※相談したらネントレを進められるというわけではないですのでご安心ください！

次は個人開発したアプリのご紹介を記事にしたいと思います！
【TypeScript】制御フロー分析とin演算子を使った型ガードについて

## はじめに
プロダクトのソースコードで見慣れないコードを見つけました。
何をやっているのか文法から理解できなかったので先輩に聞いてみると、「*型ガードで型を絞り込んでいるね*」と教えていただきました。
なんのことかわからなかったので調べてみました。

## わからなかったコード
前後のソースコードは省略しています。
わからなかったのは、`'id' in currentMenu`という文法です。
```typescript
if ('id' in currentMenu && currentMenu.id === targetId ) {
   return //...省略
}
```
なんとなく、「*currentMenuにidプロパティが存在するなら、idプロパティにアクセスする*」みたいな意味かと推測しました。

試しに消してみましょう。
```typescript
if ( currentMenu.id === targetId ) {
   return //...省略
}
```
>プロパティ 'id' は型 'LimitedMenu | StandardMenu' に存在しません。
  プロパティ 'id' は型 'LimitedMenu' に存在しません。ts(2339)

エラーが出てしまいました😱

私：「*なんだこのエラーは？？？？？？プロパティがないってどういうこと？？？？？？？*」

さらに、`currentMenu.`まで書いてVSコードの推論を見てみたところ、確かに`id`が出てきませんでした。どうやら本当に`id`プロパティが存在していないようです。

何が起きているのかわからなかったので先輩に質問して、「**制御フロー分析**」と「**型ガード**」を教えていただきました。

## JavaScriptのin演算子
まずは、使われている`in`演算子について。

これはJavaScriptの文法で、**指定したオブジェクトに特定のプロパティが存在するかどうか**をチェックすることができます。
プロパティが存在する場合はtrue、存在しないならfalseを返します。
```typescript
const user = { name: 'odeko', id: '@odendayoko' };

console.log('id' in user);
// Expected output: true
```
詳細はこちらをご覧ください。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/in

よって、`'id' in currentMenu`と書いた場合、`currentMenu`に`in`プロパティが存在すればtrue、存在しない場合はfalseと判定されます。

## 制御フロー分析（Control Flow Analysis, CFA）
ここからはTypeScriptのお話です。
**制御フロー分析**という機能があるらしいです。

https://typescriptbook.jp/reference/statements/control-flow-analysis-and-type-guard#%E5%88%B6%E5%BE%A1%E3%83%95%E3%83%AD%E3%83%BC%E5%88%86%E6%9E%90

> TypeScriptはifやforループなどの制御フローを分析することで、コードが実行されるタイミングでの型の可能性を判断しています。

下記の例で考えてみます。

monthの型は`string | number`です。if文の分岐に入るまでは、monthがstring型かnumber型のどちらかが決まっていません。この場合、string型でしか使えないメソッドへアクセスしようとするとTypeScriptのエラーが出ます。
そこで、if文でmonthの型をstring型に確定させるように条件分岐させます。これにより、メソッド実行時の型がstringに決まるので、エラーは発生しません。
```typescript
const showMonth = (month: string | number) => {
  // ここでメソッドにアクセスすると、string型かnumber型か決まらないのでエラーになる
  // console.log(month.padStart(2, "0"))
  
  if (typeof month === "string") {
    // string型に決まるのでエラーは起きない
    console.log(month.padStart(2, "0"));
  }
}
```
こんな感じで、TypeScriptはコードの特定の部分で変数がどの型であるかを推論してくれるみたいです。

## 型ガード
上記の例で、`if(typeof month === "string")`という条件分岐で変数の型を判定して型の絞り込みを行っています。このような型の制御を**型ガード**と呼ぶらしいです。

代表的なのは`typeof演算子`を使った型ガードです。
他にも色々種類があるようなので詳しくはこちらをご覧ください。

https://typescriptbook.jp/reference/statements/control-flow-analysis-and-type-guard#%E5%9E%8B%E3%82%AC%E3%83%BC%E3%83%89

今回は、`in演算子`を使って型を絞り込んでいたことがわかりました。

## コードを読み解いてみる
ではわからなかったコードに戻ってみましょう。
```typescript
interface LimitedMenu {
  id: number
  name: string
  url: string
}

interface StandardMenu {
  name: string
  url: string
}

// currentPhoto: LimitedMenu | StandardMenu
if ('id' in currentMenu && currentMenu.id === targetId ) {
   return //...省略
}
```
`currentMenu`の型は`LimitedMenu | StandardMenu`です。型を確認すると、`LimitedMenu`には`id`プロパティが存在しますが、`StandardMenu`には存在しません。

よって、`'id' in currentMenu &&`とすることで、右項では`currentMenu`の型が`LimitedMenu`に決まります。`LimitedMenu`型なら、`id`プロパティが存在するのでアクセスしてもエラーは起きません。

`currentMenu.id`とした場合にエラーが発生したのは、`currentMenu`が`id`プロパティを持たない`StandardMenu`型をとる可能性があるからです。型として存在しないプロパティにアクセスすることはできません。

## 終わりに
簡単そうに見えて意外と奥が深い内容でした！
ユニオン型で、各要素の型のプロパティに違いがある場合は注意が必要ですね💡
ジンバルモーター、SimpleFOCで動かす(3) - Commander編

# はじめに

[前回の](https://qiita.com/8ga3/items/9448e5cb4ce6a69effb0)の続きです。

Commanderについての紹介をします。

https://qiita.com/8ga3/items/9448e5cb4ce6a69effb0

# Commanderとは

シリアルモニターを通じて、モーターを操作したりパラメータを変更する機能となります。

公式のドキュメントは[こちら](https://docs.simplefoc.com/commander_interface)になります。

https://docs.simplefoc.com/commander_interface

# コード説明

前記事の[ソースコード](https://qiita.com/8ga3/items/9448e5cb4ce6a69effb0#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)から抜粋します。いちばん基本的なところを説明しようと思います。

Commanderのインスタンスを作成します。

onTarget関数はコールバック用です。

とりあえず、お決まりのパターンだと思ってコーディングしましょう。

```cpp
Commander command = Commander(Serial);
void onTarget(char* cmd){ command.motion(&motor, cmd); }
```

setup関数でmotorオブジェクトの設定と初期化のあと、Commanderのメンバ関数addを使って登録します。シリアルモニターを通じてキーボード入力で操作できるようになります。

第1引数はコマンドの最初に入力する文字です。なんでもいいです。大文字・小文字は区別されます。モーターが複数あるときは、違う文字を使ってモーターの数だけaddします。onTarget関数側でswitchなどを使って個別に制御できます。もちろんまとめて動かすことだってできますね。

第2引数はコールバック関数です。

第3引数はラベルです。シリアルモニターで受信した文字列にラベルが入るのでわかりやすくなります。必要なければNULLにします。

```cpp
void setup()
{

  ...

  command.add('T', onTarget, "motion control");

  ...

}
```

loop関数ではメンバ関数runをコールするだけです。

```cpp
void loop()
{
  motor.loopFOC();
  motor.move();
  motor.monitor();
  command.run();
}
```

# 使い方

詳しい使い方は公式ドキュメントを見てください。

ここではCommander::motion()の使い方を紹介します。

まず前提として、Visual Studio Code拡張機能の[Serial Monitor](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-serial-monitor)を使っています。インストールされているものとします。自動再接続が便利で、PlatformIOでArduinoへUploadのときに接続が一度切れても、マイコン側がリブートしたあとに何もしなくてもポートが開きます。再接続できるかポーリングしているようで、Arduino側はシリアルポートを開いてから文字出力するまえに1秒くらいディレイを入れてあげると、文字が欠けることがなくなると思います。

シリアルモニターのタブはこんな感じです。一番下の行に送信したいコマンドを入れます。

![serialmon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/09470687-c50b-d8da-6ea3-41733c7377d3.png)

前回のソースコードは、初期状態で角度制御モードにしています。それではコマンドを入れてモーターを動かしてみましょう。

最初に`T`とし2文字目から角度を入れます。ラジアンですので、例のように3.14なら180度回転します。マイナスをつければ反対に回ります。どちらに回るかはモーターの3ピンコネクタの刺した向きによるので、自分で決めておいたほうが良いと思います。わたしは時計回り(CW)を＋、反時計回り(CCW)をーにしています。

一周の$2π=6.28$を超えた場合は、超えた分だけ回ります。T100だと16回転くらいします。

```shell
T3.14
```

コマンドを受け付けると、以下のようなメッセージを受信します。

```shell
Target: 3.14
```

モード変更するためにはコマンド`C`を使います。`TC1`を送信すると速度指定モードになります。数値を入れないと現在のモードがなにか教えてくれます。

```shell
TC1
```

コマンドは6個あります。Dだけサブコマンドとなっていて、ダウンサンプリング数を変更できます。初期値は0でダウンサンプリングなしです。

3と4はオープンループです。角度センサーを付ける前に、とりあえずモーターだけ確認するとか使ってもいいと思います。

* D - downsample motion loop
* 0 - トルク
* 1 - 速度
* 2 - 角度
* 3 - 速度（オープンループ）
* 4 - 角度（オープンループ）

モードを変更すると、以降のコマンドで`T`に続く数値の意味は変わります。そのままですが、速度とトルクの指定値になります。制御モードによってはスペース区切りで数値を複数渡せます。

```shell
# トルク指定
TC0
T2.0

# 速度指定（オープンループも同一）
TC1
# オプションの2番目の数値はトルク制限を変更、省略可能
T3.0 2.0

# 角度指定（オープンループも同一）
TC2
# オプションの2番目の数値は速度制限を変更、省略可能
# オプションの3番目の数値はトルク制限を変更、省略可能
T3.14 3.0 2.0
```

`T`はトルク制御方法の表示または設定できます。

* 0 - 電圧
* 1 - 電流
* 2 - FOCアルゴリズムで計算した推定の電流

`E`はモーターへ電力供給をオンオフします。使わないときはオフにすることでバッテリーを節約できます。

* 0 - 無効
* 1 - 有効

# おわりに

次回、Teleplotでテレメトリをグラフ表示します。

https://qiita.com/8ga3/items/ae252c0afe864eb960ae
AviUtlでGPUを用いてエンコードする方法

# この記事の対象者
- GeForce系GPUを使用している方
- GPUを用いた高速なエンコードをしたい方
# 結論
NVEncプラグインを使いましょう．
# 導入方法
- [rigaya氏のブログ](https://rigaya34589.blog.fc2.com/)からNVEncのダウンロードページを開く
- `Aviutl_NVEnc_x.xx.zip`をダウンロード [^1] 
- [7zip](https://7-zip.opensource.jp/download.html)等でダウンロードしたzipファイルを解凍する
- 解凍したzipファイルの中身をすべてAviUtlフォルダの中に入れる
    - この際ファイルを上書きするか聞かれることがある．聞かれた場合はファイルを置き換える
- [その他] > [出力プラグイン情報]を選択すると出力用プラグインの情報が表示される．拡張NVEnc出力が表示されていれば成功
:::note alert
他サイトで「`auo_setup.exe`を実行することで自動で導入ができる」と紹介されていることがありますが，この方法は最新版では使用できません．
:::

# エンコード方法
- [ファイル] > [プラグイン出力] > [拡張NVEnc出力]を選択，エンコードが終了するまで待つ
- エンコード成功！
[^1]: x.xxは最新版のバージョン
【Python】Edge操作の環境構築から基本操作まで

Python環境を構築後、anacondaをインストールする。

●Seleniumインストール
pip install selenium
●beautifulsoup4インストール
pip install beautifulsoup4

※下記の内容で、Edge操作ができた(pyautoguiでの、自動操作も含む)

#webdriverのインポート
from selenium import webdriver
#byを使用するためにインポート
from selenium.webdriver.common.by import By

import time
import os
import datetime
import pyautogui as pag

#Edgeを起動する
browser = webdriver.Edge()
browser.implicitly_wait(3)

#開くURLを指定(例:ストレージのアドレス)
url_login = "http://192.168.1.249"
browser.get(url_login)

#画面最大化
browser.maximize_window()

#待機時間
time.sleep(20)

#ログイン(パスワード入力、OKを押す）
browser.find_elements(By.ID,'password')[0].send_keys('Rengo-gunm@')
browser.find_elements(By.ID,'btnOk')[0].click()

#待機時間
time.sleep(20)

#ダッシュボードのスクリーンショットを取得
browser.save_screenshot('ディスク使用容量.png')

# ストレージを左クリック
pag.leftClick(104, 392)

#待機時間
time.sleep(5)

#ドライブの歯車を左クリック
pag.leftClick(1059, 335)

#待機時間
time.sleep(5)

#ドライブの歯車を左クリック
pag.leftClick(1245, 507)

#待機時間
time.sleep(5)

#ディスク使用容量のスクリーンショットを取得
browser.save_screenshot('ディスク使用容量.png')

#待機時間
time.sleep(5)

#Edge終了
browser.close()

参考URL:
https://zenn.dev/mac709/articles/848fdbf9db6919#%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB(.exe%EF%BC%89%E3%82%92%E4%BD%9C%E6%88%90

https://qiita.com/mimuro_syunya/items/f7da1bd54f627f926e6c

スクショ
https://note.com/odu873/n/n6a59c7d45bb9
サードパーティリポジトリインストール

## 概要
サードパーティリポジトリ（EPEL, remi）を dnf でインストールする

#### EPEL とは
>Red Hat Enterprise LinuxでFedoraと同等環境を実現する信頼性の高いパッケージの提供するRHEL用レポジトリ。目標のFedoraと同等環境にはほど遠いものの、多数の有用なパッケージが収録されている。正式名称はExtra Packages for Enterprise Linux。
（ウィキペディアから抜粋）

#### EPEL インストール
>Rocky Linux 9の場合は、crbリポジトリ(CodeReady Builderリポジトリ)を有効にしておくことが推奨されています。
[dnf/yumにEPELリポジトリを追加する Rocky Linux 8, 9/CentOS 7](https://centos.bungu-do.jp/archives/66 'Rocky Linux 9の場合') より抜粋

インストール時に依存関係でとちらないためにcrbリポジトリも有効にしとけと...
```console
// crbリポジトリを有効にする
[root@marmoset ~]# dnf config-manager --set-enabled crb

// インストール
[root@marmoset ~]# dnf install epel-release
```

#### Remi インストール 
```console
// インストール
[root@marmoset ~]# dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

// リポジトリを有効にする
[root@marmoset ~]# dnf config-manager --enable remi

// 有効なリポジトリのリストを表示する
[root@marmoset ~]# dnf repolist
repo id                      repo name
appstream                    Rocky Linux 9 - AppStream
baseos                       Rocky Linux 9 - BaseOS
crb                          Rocky Linux 9 - CRB
epel                         Extra Packages for Enterprise Linux 9 - x86_64
epel-cisco-openh264          Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64
extras                       Rocky Linux 9 - Extras
remi                         Remi's RPM repository for Enterprise Linux 9 - x86_64
remi-modular                 Remi's Modular repository for Enterprise Linux 9 - x86_64
remi-safe                    Safe Remi's RPM repository for Enterprise Linux 9 - x86_64
```

#### 感想
* サードパーティリポジトリの知識は必要
* dnf コマンドって便利（yumで勉強していなかった分、ちょっと感動）
【2024マラソン17】マジックキーボードとコンパニオンモードでクリスタの作業速度を上げる


# 何の記事？
ipad proのMagic Keyboardとコンパニオンモードを使って、作業を簡略化することを試みました。

# 誰向け？ どんな役にたつ？
- クリスタのコンパニオンモードについて気になる人
- ipadクリスタの画面をなるべく広く使いたい人
- Magic Keyboardを持っていて、クリスタのショートカットキーをイマイチ使いこなせていない人
- 他のクリスタユーザのショートカット設定が知りたい人

# 便利ツール
### コンパニオンモード
#### ペンサイズ調整
今までペンのサイズをショートカットキーの連打で調整をしていたのですが、アナログのバーを操作して変更できるようになったことで、とても楽になりました。

#### サブビュー
参考画像などが表示できるサブビューをスマホ側で表示ができることで、iPadは描画画面のみに専念できるようになりました。
注意点としては、iPad側のサブビューとスマホ側のサブビューは画像を共有していないので、スマホ側のサブビューで表示させたい画像についてはスマホのほうに入れておく必要があります。

#### 全体ビュー
全体ビューをスマホで見れるのも重宝しています。
前述のサブビューと全体ビュー、どちらもスマホで見れることでレイヤーを変更する時以外は、iPadは描画のみにできるようになったので、書ける面積が増えて作業効率が上がりました。

### Magic Keyboardをショートカットツールにする
####ショートカットキー用ステッカー
キーボード用ではありませんが、イラストソフトのショートカットキー用のステッカーがあったのでそれを使っています

https://www.amazon.co.jp/dp/B092MCZWRD?psc=1&ref=ppx_yo2ov_dt_b_product_details

また、Magic Keyboardに直接貼るのは少し抵抗があったので、Magic Keyboardにつける薄手のキーボードカバーをつけてその上からシールを貼っています

https://www.amazon.co.jp/dp/B08975MDC3?ref=ppx_yo2ov_dt_b_product_details&th=1

シールについては、リンクのシールを私は使っていますが、とりあえず使ってみると言うことであれば、100円ショップなどでも今こういったシールがあるのでそれを使うのも良いかと思います
ちなみに、私が使っているのは色がいくつもあったり、最初からいくつかのアイコンが書かれていたりするので、割と使いやすくて重宝しています

### Magic Keyboardで高さ調整をする
これは推奨された使い方では無いとは思いますが、Magic Keyboardを装着してした状態で、iPadの向きをひっくり返すとイラストを書くのにちょうどいい高さになります
Magic Keyboardは固定スタンドとしてもしっかり重ねてくれるので、絵を描くときの筆圧や腕の重みなどをかけるような形でなければ、これでも充分書けるかなと思います
ただ、以上にタブレットMagic Keyboardに負担をかけるような使い方にはなるので、文章を見ながら使ってみてください
【2024マラソン16】クリスタのオートアクションでwip一覧試作を作ってみる

![IMG_3647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/6df039ee-78fd-78b9-5219-50f2d410d54a.png)

未完ですが、wip画像をまとめて1枚にできるオートアクションを作っています。

# 何の記事？
クリップスタジオで選択した6枚のレイヤから制作過程を1枚にまとめられるオートアクションを作ってみることにしました。

# あらすじ
以前、制作過程をファイル上に残すオートアクションを作りました。

https://qiita.com/c9h11o2/items/ea27d212914ac795369b

その際、この制作過程一覧を自分で振り返ったり、過程一覧をSNSにあげたりするのに、便利なオートアクションが作れないかなー……と思い、作ることにしました。

# できたもの
とりあえず形にはなりました。
キャンバスサイズや対象レイヤーが変わるとうまく動かなかったりする部分が残るので、オートアクションとして配布するまでには至りませんが、同じような一覧画像を作る際の手順はわかったので、うまく調整して配布できる形まで持って行けたらいいなと思います。

また、完成するか、妥協版を配布できるようになったら、その時点で分かった仕様もまとめたいと思います。

# まだ調整が必要なところ
- キャンバスサイズが変わった際の位置調整
- 対象レイヤーが10日の場合の調整
- 一覧に載せる画像枚数が変動でも動くようにしたい
- 選択範囲に対してwipを作れるようにしたい

# 参考にしたページ

https://tips.clip-studio.com/ja-jp/articles/3502

ざっくりですが、公式が**オートアクションでできないこと**をま止めてくれているので、参考になりました。
ただ、実際に作り始めてみると、思った挙動にならず、別ファイルで実行するとうまくいかない……ということも多いので、調整を重ねていきたいと思います。
[Swift] オーバーフローを判定する

# ABC324-C

[ABC324-C](https://atcoder.jp/contests/abc324/tasks/abc324_b)問題を例にします。

https://atcoder.jp/contests/abc324/tasks/abc324_b

- 問題文

  正の整数 $N$ が与えられます。 $N = 2^{x} \\ 3^{y}$ を満たす整数 $x, y$ が存在するなら Yes 、そうでなければ No と出力してください。<br>　

- 制約

  $ 1 ≤ N ≤ 10 ^ { 18 }$
  $N$ は整数<br>　


## 考察

$x, y$が取り得る値の範囲を考えます。
制約の下限より、

&emsp;&emsp; $2^{0} = 3^{0} = 1$
  
制約の上限より、

&emsp;&emsp; $2^{59} < 10^{18} < 2^{60}$
&emsp;&emsp; $3^{37} < 10^{18} < 3^{38}$

よって、  
&emsp;&emsp;  $0 ≤ x ≤ 59、0 ≤ y ≤ 37$ だと分かります。
  
$O(xy) = 60 *38 = 2280$ですから、全探索で問題ないです。

## RE 回答

しかし、以下のコードは、乗算でオーバーフローが発生し、ACできません。
⭐️ _Thread 1: Swift runtime failure: arithmetic overflow_

```swift:ABC324-C（RE）
let main: () = {
    let N = Int(readLine()!)!
    for x in 0 ..< 60 {
        for y in 0 ..< 38 {
            let a = 2.pow(x)
            let b = 3.pow(y)
            let ab = a * b //⭐️
            if ab == N { return print("Yes") }
        }
    }
    print("No")
}()
```

Intの最大値（$>10^{18}$）を超えてしまうためです。

「Intの最大値を超えてしまう」場合は、制約により "Yes" は あり得ません。よって、事前にチェックしてスキップします。

```swift:ABC324-C（AC）
let main: () = {
    let N = Int(readLine()!)!
    for x in 0 ..< 60 {
        for y in 0 ..< 38 {
            let a = 2.pow(x)
            let b = 3.pow(y)
            if Int.max / a < b { continue } // ⭐️
            let ab = a * b
            if ab == N { return print("Yes") }
        }
    }
    print("No")
}()
```

上のコードでは、`Int.max / a < b`によって、自力でオーバーフローを判定しましたが、[Swiftにはそれを判定してくれる便利な関数が用意されています](https://developer.apple.com/documentation/swift/int#Performing-Calculations-with-Overflow)。


## オーバーフロー判定付き演算関数

加減乗除余、それぞれが用意されています。

- (+) _`func addingReportingOverflow(Int) -> (partialValue: Int, overflow: Bool)`_
- (-) _`func subtractingReportingOverflow(Int) -> (partialValue: Int, overflow: Bool)`_
- (*) _`func multipliedReportingOverflow(by: Int) -> (partialValue: Int, overflow: Bool)`_
- (/) _`func dividedReportingOverflow(by: Int) -> (partialValue: Int, overflow: Bool)`_
- (%) _`func remainderReportingOverflow(dividingBy: Int) -> (partialValue: Int, overflow: Bool)`_

`overflow`が`true`ならオーバーフロー（アンダーフロー）が発生したということです。

先の問題の場合は、_`multipliedReportingOverflow`_ が使えます。

```swift:ABC324-C
let main: () = {
    let N = Int(readLine()!)!
    for x in 0 ..< 60 {
        for y in 0 ..< 38 {
            let a = 2.pow(x)
            let b = 3.pow(y)
            let (ab, overflow) = a.multipliedReportingOverflow(by: b)
            if overflow { continue }
            if ab == N { return print("Yes") }
        }
    }
    print("No")
}()
```

自力で実装しなくてもよいので、このような関数が「有ることを知っている」と（関数名を覚えていなくても）焦らずに済みますね。。。

---

上のコードで使用した`pow`関数。
今回は不要でしたが、この中にも「オーバーフロー判定」を入れておくとよいかも。。。

```swift:整数のべき乗
extension FixedWidthInteger {
    func pow(_ power: Self) -> Self {
        var ans = Self(1)
        for _ in 0 ..< power { ans *= self }
        return ans
    }
}
```

**以上**
Firebase のメアドログインでアカウントがあるかを判断する方法（fetchSignInMethodsForEmailがDeprecatedだったよ）

:::note info
FirebaseAuthのfetchSignInMethodsForEmailがdeprecatedになっていて、少し設定を加えないと正しくデータが取得できなかったので書きました。
該当のメアドのアカウントで過去にログイン済みかどうかを判断したいケースがある場合に使ったりするメソッドです。
:::

## メアドが過去に使用されたことがあるかを確認する方法

Firebase Authenticationを使用してメールアドレスでログインを実装する場合、`fetchSignInMethodsForEmail(email)`メソッドを使用すると、指定したメールアドレスが過去にどのログイン方法で使用されたかのリストを取得できます。

以下のコードは、指定したメールアドレスが既に登録されているかどうかを確認する例です。

```dart
Future<void> checkEmailRegistered(String email) async {
  try {
    List<String> signInMethods = await auth.fetchSignInMethodsForEmail(email);
    return signInMethods.isNotEmpty;
  } catch (e) {
    print("エラー: $e");
  }
}
```

例えば、メールアドレスとパスワードでログインしている場合、レスポンスのリストに"password"が含まれます。リストが空の場合は、そのメールアドレスでログインしたことがないことを意味し、空でない場合はログインしたことがあると判断できます。

## fetchSignInMethodsForEmailがDeprecatedに！？

2023年9月15日以降、新しいFirebaseプロジェクトではメール列挙攻撃に対する保護がデフォルトで有効になり、`fetchSignInMethodsForEmail`メソッドが機能しなくなってました。

https://x.com/Firebase/status/1745493276222734784

以下のドキュメントによると、「指定されたメールアドレスのサインイン方法のリストは、createAuthUri REST APIを呼び出しても、すべてのプラットフォームでfetchSignInMethodsForEmailクライアントSDKメソッドを呼び出しても返されなくなります」
とのことでした。

https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection?hl=ja&authuser=0

## 解決方法

このメール列挙攻撃に対する保護を無効にすることで、`fetchSignInMethodsForEmail`メソッドを再び使用できるようになります。以下はその手順です。

1. Firebaseコンソールを開きます。
2. FirebaseAuthの設定ページに移動します。
3. メール列挙攻撃に対する保護を無効に設定します。

![Firebase設定スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/baea24d9-3ee1-cb43-f296-be4cf81bc1c5.png)

保護を無効にする前に、メール列挙攻撃に対する保護の意味を理解し、リスクを検討した上で無効にするかどうかを判断してください。
2度目にはなりますが、大事なのでURLをもう一度貼っておきます。

https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection?hl=ja&authuser=0

## 他の方法

Firestoreデータベースにあるメールアドレスを参照して、アカウントの存在を確認する方法もありますが、手間がかかり、セキュリティ面でのリスクも考慮する必要があります。そのため、上記の方法を推奨します。

https://github.com/firebase/firebase-android-sdk/issues/5586

## まとめ

`fetchSignInMethodsForEmail`がDeprecatedになったものの、メール列挙攻撃に対する保護を無効にすることで、再び使用可能です。

ただし、既にDeprecatedであることはもちろん、無効にすることにはセキュリティ上のリスクが伴うため、慎重に検討してください。
配列データを表示するときにkey属性が必要だった話

Reactを使用して配列データを出力したい場合、key属性を付与しなければならないというお話。
例えば以下のようなデータをリスト形式で画面に表示したい場合。

``` ts
dataList = [
{
    "name": "taro",
    "gender": "male",
    "age": 25,
},
{
    "name": "hanako",
    "gender": "female",
    "age": 30,
}
];
```

JSXを用いて実装するとこのようになる。
map関数を用いて配列内のデータを出力している。

``` tsx
export const List = () => {
  return (
    <ul>
      {dataList.map((data, index) => (
        <li key={index}>
          {data.name} ({data.gender}, {data.age} years old)
        </li>
      ))}
    </ul>
  );
};
```

![Pasted image 20240703215618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152706/d8b12a5b-c1a1-9927-9217-1dc84feec753.png)

しかし、上記実装では問題がある。コンソールには以下のようなエラーメッセージが出力されていることが確認できる。

![Pasted image 20240703215711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152706/7842df80-8790-558e-1f77-a4eb5ff89b37.png)

これを回避するためには、ユニークな値でもってkey属性を付与しなければならない。
つまり以下のようにmap関数を使って生成している要素に対して、key属性を付与することで先ほどのエラーは解消できる。

``` tsx
export const ListData = () => {
  return (
    <ul>
      {dataList.map((data, index) => {
        return (
          <li key={index}>
            {data.name} ({data.gender}), {data.age} years old
          </li>
        );
      })}
    </ul>
  );
};
```

なお、今回はindexを使用しているがベストプラクティスではないようです。
この辺りは扱うデータが持つ固有の値を用いるようにしたほうがよさそうですね。

## 参考

https://ja.react.dev/learn/rendering-lists#keeping-list-items-in-order-with-keyhttps://ja.react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key

Reactのリファレンスはしっかりと日本語で書かれていて、ありがたいですね。
Sequence Makerで移動先をいい感じに指定する裏技

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerを使用すると、測定器を制御するためのいろいろなシーケンスが自由に組めます。シーケンスを組む際には、ワークシート内を自由に移動可能な専用コマンドを使用します。今回は移動先をいい感じに指定する裏技（というほどでもなく、実は取説にも書かれている）を解説します。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## ワークシート内を移動する専用コマンド
以下のような専用コマンドがあります。
| コマンド | 内容 |
|:-|:-|
| #JMP(セル)	  | 指定されたセルに移動して処理を継続します。<br>例えばB20のセルに移動する場合は#JMP(B20)のように指定します。<br>Excelの「名前の定義」で付けたセルの名前でも指定できます。|
| #SUB(セル)	| 指定されたセルに移動し、移動先の処理が終わる（空白セルがある）と元の位置に戻り処理を継続します。<br>Excelの「名前の定義」で付けたセルの名前でも指定できます。  |

（https://sequencemaker.hioki.com/manual/ja/#command より引用）

どちらもセル間を移動するときに便利なコマンドですが、#JMPは移動したら移動しっぱなしなので戻る必要があるときは再度#JMPで戻ります。#SUBは移動先の処理が終われば、移動元に戻ってきます。サブルーチン的な使い方ができます。

## 例えばこんな感じ
実際の使用例はこんな感じです。C3のセルからスタートして、#JMPや#SUBで別のセルに移動して処理した後、元に戻って最後C13のセルで終了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/9ec21267-af04-bedd-2f87-bd1985adb8ec.png)

## これでは問題が起きる
#JMPや#SUBはセルの番地（G8とかC8とか）を指定すれば良いのですが、ここで1つ問題があります。例えば、専用コマンドを追加するために、行や列を挿入したような場合です。今回は緑色の専用コマンドを追加したところ、3行下にずれ、移動先の番地もずれてしまいました。行や列の挿入、削除については自動的に追従してくれないのです。このまま実行しても、まともに動いてくれません（G8のセルにジャンプして終わりです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/4632751a-242d-3f30-9d7a-9120452c104b.png)

## どうするか？
取説にもある通り、移動先を番地で指定するのではなく、名前で指定しましょう。まずは名前を定義します。名前を付けたいセルを選択し、左上の名前入力欄に入れるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/c2e2b417-512c-8afe-e5bb-df52a0988378.png)

定義した名前は「数式」タブの「名前の管理」で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/6d16ef04-780a-4fa9-27f4-05d2029422e6.png)

今回は3つのセルの名前を定義しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/d86ba25b-01f3-8f06-7a75-2547d9ce3910.png)

そして、セルの番地で書いていたところを名前に変更します。
これでシーケンスが正しく組めました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/545c944e-fc02-4bda-31be-0b4fa8e70a24.png)

## 試しに行と列を追加してみる。
行を2つ、列を3つ挿入してみました。名前の定義を確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/b0e7d859-f647-ba31-08eb-5e1195a9d666.png)

参照範囲が自動的に変わっていることが確認できました。
これなら行や列を挿入、削除してもシーケンスが壊れることはありません！

## まとめ
今回は#JMPや#SUBコマンドで移動先を指定する際には「名前の定義」を使用する方法を解説してみました。
どのセルにどの名前を付けたかわからなくなったら「名前の管理」で確認するのが良いでしょう。
ここから削除や編集も可能です。
VSCodeとGitHubを連携する方法【Gitコミット方法も解説】

# VSCodeとGitHubを連携する方法

VSCodeとGitHubを連携することで、コードのバージョン管理がよりスムーズになります！
この記事では、VSCodeとGitHubを連携する手順を詳しく説明しますので、ぜひ参考にしてください！

## ステップ1: GitHubアカウントの準備

まず、GitHubのアカウントを作成しましょう。
アカウントがない場合は、[GitHub](https://github.com/)でサインアップしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3636333435382f34653061306539302d633835372d656332622d383233332d3531333332343831366339302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/04bc0f70-aee3-6b20-1b81-7f6fc113cedf.png)

## ステップ2: Gitのインストール

Gitがローカルにインストールされていることを確認します。
以下の手順でインストールできます！

- **Windows**: [Git for Windows](https://gitforwindows.org/)をダウンロードしてインストールします。
- **Mac**: ターミナルで`brew install git`と入力してインストールします。
- **Linux**: ターミナルで`sudo apt-get install git`（Debian系）または`sudo dnf install git`（RPM系）と入力してインストールします。

```terminal
こちらのコマンドでgitのバージョンが出てきたらインストールできています！
$ git --version
```

## ステップ3: VSCodeのインストール

VSCodeをまだインストールしていない場合は、[こちら](https://code.visualstudio.com/)からインストールしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3636333435382f61376636326662642d653932352d336533302d356537612d3866633638663032623665342e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/1e9cf6c6-cc55-8c60-f358-c891cbc6a446.png)

## ステップ4: VSCodeの設定

1. VSCodeを開き、左サイドバーのソースコントロールアイコンをクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3636333435382f31653135656564652d656139372d336364362d366537332d3930343437623862656539342e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/a6f9e9c2-2a56-c49c-e621-3bdb33a5f3f0.png)

2. 「リポジトリを初期化する」を選択し、ローカルリポジトリにコミットします。
![スクリーンショット 2024-07-03 23.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/0e65e776-33ff-6db7-586b-85237be65674.png)
![スクリーンショット 2024-07-03 23.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/a269c03c-f813-15d5-dbe5-d1f5dbae83b1.png)

3. 「Branchの発行」を選択し、リモートリポジトリにプッシュします。
![スクリーンショット 2024-07-03 23.47.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/0e33b900-2a97-8ccc-0d4a-c244c299d6cd.png)
![スクリーンショット 2024-07-03 23.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/1b600378-4ca3-044b-87c7-3eb66f9764fe.png)
![スクリーンショット 2024-07-03 23.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/5ded447a-5cd5-fed8-9c30-b859454f3ff0.png)

## ステップ5: GitHubでの確認
GitHubのリポジトリにアクセスし、変更が反映されていることを確認します。
![スクリーンショット 2024-07-04 0.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663458/0fe3c893-3a2f-7ab8-8212-29debb155e27.png)


# まとめ
これで、VSCodeとGitHubの連携が完了です。
簡単な手順で、効率的なバージョン管理が可能になりました！
VSCodeではGitの操作全般を行えるので、色々調べて使いこなしてみてください！
もし機会があれば、その辺りの便利な使い方も記事にできればと思っています！
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（35/100）

【35日目】
トピック4：SAPS/4HANAの資材所要量計画（MRP）（2/10）

≪問題35≫
仕入先と分納契約を結んでいます。品目不足の場合は、従来のMRPによって自動的に納入日程行を登録するものとします。以下のどの操作を実行する必要がありますか。
（２つ選択）
□MRP実行の第一画面で、購買依頼の作成区分を設定する。
□MRP実行の第一画面で、納入日程行の作成区分を設定する。
□供給量割当に契約を追加して、MRP関連のマークを付ける。
□供給元一覧に契約を追加して、MRP関連のマークを付ける。

≪解答≫
□MRP実行の第一画面で、購買依頼の作成区分を設定する。
■MRP実行の第一画面で、納入日程行の作成区分を設定する。
□供給量割当に契約を追加して、MRP関連のマークを付ける。
■供給元一覧に契約を追加して、MRP関連のマークを付ける。

≪解説≫
≪解説≫
◆計画実行の第一画面で定義された登録区分は、納入日程行にも適用されます。これにより、分納契約が品目用に存在する場合、MRPを使用して納入日程行を自動的に登録することが可能となります。購買依頼の作成区分だけでなく、納入日程行の作成区分も設定する必要があります。
◆供給元一覧に契約を追加し、MRP関連のマークを付けることで、システムがMRPに基づいて供給元の契約を認識し、自動的に納入日程行を生成します。
任意のタイミングでps1スクリプトを（一般ユーザで）実行できるようにするコマンド Set-ExecutionPolicy

# 概要
一般ユーザで
平常時はスクリプト実行ポリシーは初期値のままにしておき、
特定のPowershellコンソールセッション（プロセス単位）に限り、任意のタイミングでps1スクリプトを実行できるようにしたい。

# コマンド
```powershell:最初にこれを実行
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```
`上記コマンドを実行したコンソール上でps1スクリプトが実行できるようになる。`

**コンソールを閉じて再度開くとスクリプト実行不可に戻る。**
**上記コマンド実行していないほかのコンソール上からもスクリプト実行はできない。**

# 参考
https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f
続・RAGの練習。HyDEを試して見る

前回（https://qiita.com/mebi/items/1f29335a7afb9e92c440 ）、生成AIを使った検索でRAGの実装しましてみました。

今回は、RAGを改良したHyDEという手法をためして見たいと思います。

---

# HyDEの仕組み

RAGは、
予め検索対象ドキュメントを生成AIを通しておき、Embeddingというベクトル情報を作成しておきます。
そして、ユーザー入力に対して、Embeddingを作成します。
２つのEmbeddingが近しい（差が０に近い）ドキュメントを検索結果として、そのドキュメントをもとにユーザー質問へ答える・・・というものでした。


ここで、ユーザーは「質問」しているのにRAG側では「回答」を探しており、
そもそも「質問」と「回答」は意味的に近しいのか？という疑問が生まれます。

そしてそのあたりは、生成AIの元データだったり学習のさせ方に依存んしていたり、実質ブラックボックスの状態なので知るすべがありません。

HyDEではこの疑問に答えます。
HyDEは、ユーザーからの「質問」に対して、一度「架空の、質問の答えとなるテキスト、架空の回答」を生成します。
そして、その架空の回答に対してEmbeddingを算出するのです。
以降はRAGの流れとなります。


「質問」と「質問に対する回答」よりも、
「質問に対する架空の回答」と「質問に対する（真の）回答」のほうがマッチしやすそうなのが体感でわかります。
（テキストの文章構造などを想像してみてください）

---

# 実装

前回（https://qiita.com/mebi/items/1f29335a7afb9e92c440）
の実装に加えて、HyDEを追加実装します。

まずは、架空のドキュメントを作成する部分です。


    # 要件に合わせて具体的に書いたほうが良さそう。
    # 例えば、「架空の社内規定を作って」など。
    def make_hypothetical_document_prompt(input_text):
        prompt  = "次のユーザー質問への回答や対応が書いてある、架空の文書の内容を出力してください。\n"
        prompt += "ユーザーが、ルールを尋ねているのか、具体的な対応を尋ねているのかに注視して、回答文書の内容を記述してください\n"
        prompt += "・適切に改行を入れてください\n"
        prompt += "# ユーザーの質問 \n\n"
        prompt += input_text + "\n\n"
        prompt += "# あなたの答え"
        return prompt
    
    def make_hypothetical_document(input_text, api_key):
        prompt = make_hypothetical_document_prompt(input_text)
        openai.api_key = api_key
        response = openai.ChatCompletion.create(
            model="gpt-4o",
            messages=[
                {"role": "user",
                "content": prompt},
            ],
        )
        ret_msg = response.choices[0]["message"]["content"].strip()
        return ret_msg

あとはユーザー入力からEmbeddingを作成する処理を
架空回答文書から作成するように差し替えればOK


    INPUT_TEXT="ユーザーからの入力を設定します"

    # RAG版の実装は以下のコメントアウト。
    # input_vector = get_embedding(INPUT_TEXT)
    # dists = calc_ebd_dist(df, input_vector)

    # HyDE版の実装はこちら。
    hy_doc = make_hypothetical_document(INPUT_TEXT, API_KEY)
    input_vector = get_embedding(hy_doc)
    dists = calc_ebd_dist(df, input_vector)
    # 以降は同じ〜。

---

# 実装を終えて。

仕組みが簡単で、非常に明快な改良法なので良かったです。

デメリットはAPI呼び出し回数が２倍になることです。
各種要件と相談ですね（gpt-4oがでて、コスト面で制約がゆるくなったので　やりやすくはなっています）

---

# Embeddingの出力を見る。

あと、最後にRAG版とHyDE版で、
入力Embedding と 検索ドキュメントのEmbeddingの差を出力してみました。
差 = ２ベクトル間の距離で 0 〜 1.0 です。

そして、これおは何度か入力質問を変えて、
**「RAG版が誤った結果を返す、HyDE版が正しい結果を返す」**
結果となったときのEmbeddingの差になります。
（これは、うまく性能差を引き出す質問ができずRAGもHyDEも、期待するドキュメントを参照してばっかりいたからです。結果に違いがある質問をするのに苦労しました・・・）

| ファイル名 | RAG版Embeddingとの差 | HyDE版Embeddingとの差|
|:-:|:-:|:-:|
| リファレンス1.txt（HyDE版が参照したドキュメント） | 0.594 | 0.503 |
| リファレンス2.txt  | 0.601  | 0.512  |
| リファレンス3.txt  | 0.632  | 0.579  |
| ...  | ...  | ...  |
| リファレンス98.txt  | 0.619  | 0.560  |
| リファレンス99.txt（RAG版が参照したドキュメント） | 0.571  | 0.530  |

0に近いほど、よいリファレンスドキュメント検索ができたと言えます。

今回の質問では、リファレンス１.txtを参照してもらいたかったのですが、
RAG版では他のドキュメントがヒットしていました。

RAGからHyDEにすることで、
全体としてEmbeddingの差が0.04〜0.05ほど改善していますが、
より正解に近いドキュメントでは、0.09〜0.10ほど改善しておりまして、

HyDEにすることで、より正解に近いドキュメントのほうが、Embeddingの差がより小さくなる傾向が確認できました。
SQLでデータが作られた時間のタイムスタンプを作ろう for BigQuery

## はじめに
今回は、BigQueryを使用してデータが作成された時間のタイムスタンプを日本時間で記録する方法について説明します。また、タイムゾーンを指定しない場合のデフォルト動作についても解説します。

## サンプルデータセットの作成

まず、サンプルデータセットを作成します。データセットのパスは `data-sandbox-421715.db_test_001` を使用します。

以下のクエリを実行して、サンプルデータセットを作成します。
**IF NOT EXISTS**でスキーマが存在しない場合のみの作成を指定できます。
```sql
-- データセットの作成
CREATE SCHEMA IF NOT EXISTS `data-sandbox-421715.db_test_001`;

-- テーブルの作成
CREATE TABLE `data-sandbox-421715.db_test_001.sample_table` (
    id INT64,
    name STRING,
    created_at TIMESTAMP
);
```
## 日本時間のタイムスタンプを使用したデータ挿入
次に、データが作成された時間のタイムスタンプを日本時間で挿入します。ここでは、CURRENT_TIMESTAMP をUTCで取得し、TIMESTAMP_ADD関数を使用して日本時間に変換して挿入します。

TIMESTAMP_ADDは、指定されたタイムスタンプに一定の時間を加えるための関数です。INTERVAL 9 HOURは、UTCタイムスタンプに9時間を加えることで日本時間に変換することを意味します。

```sql
-- データの挿入（日本時間）
INSERT INTO `data-sandbox-421715.db_test_001.sample_table` (id, name, created_at)
VALUES 
    (1, 'Alice', TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 9 HOUR)),
    (2, 'Bob', TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 9 HOUR)),
    (3, 'Charlie', TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 9 HOUR));
```
また日付のみを追加したい場合は **CURRENT_DATE()** 関数を使用して、データ型にDATE型を指定することで日付が追加されます。
```sql
CREATE TABLE `data-sandbox-421715.db_test_001.sample_table` (
    id INT64,
    name STRING,
    created_date DATE
);
INSERT INTO `data-sandbox-421715.db_test_001.sample_table` (id, name, created_date)
VALUES 
    (1, 'Alice', CURRENT_DATE()),
    (2, 'Bob', CURRENT_DATE()),
    (3, 'Charlie', CURRENT_DATE());
```
## タイムゾーンを指定しない場合のデフォルト動作
タイムゾーンを指定しない場合、CURRENT_TIMESTAMP はUTC（協定世界時）でタイムスタンプを返します。これは、BigQueryがデフォルトでUTCを使用するためです。

以下は、タイムゾーンを指定しないでデータを挿入する例です。

```sql
-- データの挿入（デフォルトUTC）
INSERT INTO `data-sandbox-421715.db_test_001.sample_table` (id, name, created_at)
VALUES 
    (4, 'David', CURRENT_TIMESTAMP()),
    (5, 'Eve', CURRENT_TIMESTAMP()),
    (6, 'Frank', CURRENT_TIMESTAMP());
```
## データの確認
挿入されたデータが日本時間およびUTCで正しく記録されているか確認するためのクエリを実行します。

```sql
SELECT 
    id,
    name,
    created_at
FROM 
    `data-sandbox-421715.db_test_001.sample_table`;
```
![スクリーンショット 2024-07-03 232214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/9bbd73e1-51ec-c2f5-4daa-0c07e70ca074.png)

このクエリを実行すると、各レコードの created_at 列に日本時間およびUTCで記録されたタイムスタンプが表示されます。
#### 日付のみの場合
![スクリーンショット 2024-07-03 234349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/52b9236e-5c0a-7f91-c002-942f09e41450.png)


## まとめ
この記事では、BigQueryを使用してデータが作成された時間のタイムスタンプを日本時間で記録する方法と、タイムゾーンを指定しない場合のデフォルト動作について紹介しました。サンプルデータを作成し、CURRENT_TIMESTAMP 関数と TIMESTAMP_ADD 関数を使用してタイムスタンプを日本時間に変換して挿入する手順を示しました。また、デフォルトでUTCを使用する場合の挿入方法についても説明しました。
これにより、データが作成された時間を日本時間およびUTCで簡単に追跡できるようになります。ぜひ試してみてください。
[Rails] rspec_{ } と () の使い方

# はじめに
rspecでテストを実装していて、以下の箇所で詰まりました...。

```rb
# NG
expect(subject).to raise_error(RuntimeError, 'testだよ')

# RuntimeError:
#   testだよ

# OK
expect{ subject }.to raise_error(RuntimeError, 'testだよ')
```

`{}`と`()`の違いだけなのに、テストが成功するか変わりました。
挙動が違うと思い、調べた内容をアウトプットいたします。


# `( )`
仮に、上記のコードで例を挙げます。

- `subject`を評価され、`subject`の結果を`expect`メソッドに渡します
- なので、`subject`を実行した内容で例外があれば、そこで処理が止まります
    - テストもエラーになります

流れの結果として、どんな値が返ってきたのかをテストするには、すごく向いています。

# `{ }`
`{...}`で記載したコードは、コードブロックとして評価され、「後で実行される」ことを意図しています。
処理の流れとしては、以下になります。

- ブロックの評価
    - `{...}`で記載したコード
- マッチャの呼び出し
    - 今回の例だと、`raise_error`が、ブロックが実行されたときに例外が発生するかを確認します
- ブロック内のコードの実行
- 例外のキャッチ

特に今回のような、`subject`内で、例外が発生する処理の場合は、使用する場面が多いと思います。

# まとめ
`expect`でのかっこの違いで、結果が大きく変わることを知りました。
処理の流れを頭に入れて、自分がテストしたい項目の場合、どちらが適切か都度考えて、実装しましょう。

最後までご覧いただき、ありがとうございました。

# 参考文献
https://github.com/rspec/rspec-expectations
SGF形式の棋譜をKIF形式に変換するだけのサービスをFlet>Fly.ioでデプロイ

## はじめに
めっちゃ簡単にFletで作ったappをfly.ioでデプロイするだけ。それだけ。
DBもAWSもDockerの知識もいらない。


### きっかけ
とあるオンライン将棋サイトでは棋譜がSGF形式で出力される。

```:SGF形式
1. P2g-2f P3c-3d 2. P2f-2e B2b-3c...
```

棋譜解析するにはKIF形式のが都合がよい。

じゃあそういうサイト作ってしまえ。で作ったのでそのメモ。


## やってみるか
1. sgfのテキストをkifのテキストに変換する関数をつくる　←　ここは簡単
1. Fletで見た目を作る　←　こだわると時間溶ける
1. fly.ioでデプロイ　←　デプロイって言葉、1回使ってみたかった

### 関数編
P→歩、+S→成銀、2f→2六　こんな感じに置換するだけ

### GUI編
`ft.TextField`（入力・出力）
`ft.TextButton`（変換・コピー）
以上

### デプロイ編

https://flet.dev/docs/publish/web/dynamic-website/hosting/fly-io/

https://fly.io/docs/getting-started/launch-demo/

上記ふたつで完結

おおまかな流れを書くと、
* `flyctl`のインストール
* コマンドラインからログイン
* 支払い方法などの登録（無料利用有）
* `toml`ファイルやフォルダの作成
* コマンドラインから **create**、 **deploy**、 **open**！

### 改修編
ファイル更新してもう一回 **deploy**

## やってみたら

<details><summary>これが</summary>

```
1. P2g-2f P3c-3d 2. P2f-2e B2b-3c 3. P7g-7f S3a-2b 4. G6i-7h P8c-8d 5. P6g-6f P8d-8e
```
</details>

<details><summary>こう</summary>

```
1 ２六歩(27)
2 ３四歩(33)
3 ２五歩(26)
4 ３三角(22)
5 ７六歩(77)
6 ２二銀(31)
7 ７八金(69)
8 ８四歩(83)
9 ６六歩(67)
10 ８五歩(84)
```

</details>

## やってみて
* `favicon`とか`font`とか時間あったらいじりたい
* 先は長い


___
https://sgftokif.fly.dev/
【Python】複数のシェルスクリプトのAPIコールを１コマンドですべて実行させる方法

# 概要
とあるディレクトリにある複数のシェルスクリプトファイルを１コマンドで勝手に一つずつ実行させていくコードを書いたので紹介します。

# サンプルコード解説

```py
import subprocess
import os

# スクリプトが存在するフォルダのパス（現在のディレクトリとしています）
folder_path = './'

scripts = sorted([files for files in os.listdir(folder_path) if files.endswith('.sh')])

# APIのエンドポイント
api_endpoint = 'http://localhost/api'

for script in scripts:
    script_path = os.path.join(folder_path, script)
    print(f"Executing {script}...")
    subprocess.run(['sh', script_path, api_endpoint])
    print(f"Finished executing {script}.\n")
```

`os`モジュールの`listdir`関数は、指定されたディレクトリ内のすべてのファイルとディレクトリと名前を`list`として取得する関数。リスト内包表記を使用して、取得したファイル名のリストから`.sh`で終わるファイル名を選択しています。これにより、シェルスクリプトのファイルたちが取得できます。

`sorted`関数を使用しているのは、ファイル名のリストをアルファベット順にソートしたいためです。特にソートしない場合は順番など関係なくランダムに（？）実施されていくので、ソートして実施した方が分かりやすいと思いました。

あとは、ソートされたシェルスクリプトのリストをループで回し、各スクリプトを`subprocess.run`関数を使用して実行していきます。この関数は、指定されたコマンドを実行することができるので外部のシェルスクリプトを実行させる際に使えます。こちらの関数については以前別記事で書いたこともあるのでご参考までに（以下にも書きましたが、例外処理を入れる場合は`subprocess.CalledProcessError`でキャッチできます）。

https://qiita.com/Ryo-0131/items/f4c931db885be0e49aac

詳細にいうと、`script_path`で指定されたシェルスクリプトを`sh`コマンドを使って実行し、そのスクリプトに`api_endpoint`を引数として渡しています。これにより、Pythonスクリプトから外部のシェルスクリプトを実行し、そのスクリプトに必要なデータを渡すことができました。
【AppleScript】特定のアプリケーションが起動中か確認する方法

AppleScriptを以下のように記述すると特定のアプリケーションが起動中か確認することができます。

```applescript
if application "アプリケーション名" is running
  "running"
else
  "not running"
end if
```

メモアプリが起動しているか検証する場合には以下のようになります。

```
if application "Notes" is running
  "running"
else
  "not running"
end if
```
UE5勉強日記 UPARAM(ref)  

blueprintでC++の関数を呼ぶ時に、
参照型のパラメータを同時に入力と出力として使いたい場合は
関数定義する時にUPARAM(ref)を追加する必要ある
```
関数定義
void Buy(UPARAM(ref) int32& Capital);
実装
void AMyGameMode::Buy(int32& Capital)
投稿 3 display:flex;

本日の勉強時間　3H



ある要素に定義するだけで、その直下の要素が並列になる便利なスタイル。




display: flex;
flex-wrap: wrap;


↑
ポイントとして親要素に指定する！
よって中の要素（子要素）にレイアウトを適用させることが可能となります。
自己紹介ページ　進捗

お疲れ様です。

今日は昼にJSのDOM操作について復習し、現在は自己紹介ページの編集を行っているところです。

リンクの貼り方が分からないため、タイトルのみの紹介となりますが、
**1冊ですべて身につくJavaScript入門講座**
という本を読みながら、実装させつつ中身を勉強しています。
コードのスクショは省きます。

具体的な内容ですが、「ページ内の青空の写真をある程度スクロールするとじわじわと表示するようにする」コードを調べ、VS Codeで書いております:computer:
**intersectionObserver**を用いて、監視をつけることにより、その画像まで到達すると動作が実行されるようになるというものです。


初めて聞いた単語で、JavaScriptの勉強もまだまだ初歩の初歩しか学べておりませんが、奥が深いなぁと、新しいことを学ぶたびに思います。

今日は、言葉の意味を調べたりコードを書いたりしながら、監視をつけたところまで進みましたので、明日には動作チェックするところまで進められたらいいなぁ・・
[備忘録 その１]  Java Silver ～Javaプログラミング基礎～ 

Java Silverを勉強する中で、ただ参考書を見ているだけだとつまらなかったので、アウトプットととして備忘録を投稿しています。



## Javaの特徴
### ①Write Once, Run Anywhere (一度書けばどこでも動く)
Javaで作ったプログラムはOSとの間に依存関係がなく、どのOSでも動きます。

### ②ガベージコレクションによる自動的なメモリ管理
ガベージコレクションは使わなくなったメモリを自動的に開放してくれる機能です。この機能により、メモリリークの発生を回避できます。
メモリリークとは、プログラムで使い終わったメモリが適切に開放されないことで、時間とともにメモリが不足していく現象です。

### ③オブジェクト指向
Javaはオブジェクト指向という考え方を実現できるようになっており、プログラムの再利用や拡張をオブジェクト単位で効率良く行えます。

## コンパイルと実行
### コンパイル
#### 1. ソースコードの作成
まず、Javaプログラムのソースコードを記述します。ソースコードは、「.java」という拡張子のテキストファイルに保存されます。
```java:HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```

#### 2.Javaコンパイラを使ってコンパイル
「javac」コマンドを使用して、Javaソースコードをコンパイルします。これにより、Javaバイトコードが含まれる「.class」ファイルが生成されます。
```sh
javac HelloWorld.java
```
成功すると、HelloWorld.classというバイトコードファイルが生成されます。

### 実行
#### 3.Java仮想マシン（JVM）を使って実行
「java」コマンドを使用して、生成されたバイトコードをJava仮想マシン（JVM）上で実行します。
```sh
java HelloWorld
```
これにより、以下のような出力がされます。
```sh
Hello, World!
```
## ソースコード
ソースコードはプログラムの設計や動作を記述するためのテキストで、プログラミング言語を使用して書かれます。ソースコードは、プログラムの開発、デバッグ、メンテナンスの基本です。

### Javaソースコードの基本構造
#### 1.クラス宣言
Javaでは、すべてのコードはクラスの中に含まれます。クラスは、データ（フィールド）とそのデータを操作するメソッドを持つ設計図です。
```java:HelloWorld.java
public class HelloWorld {
    // フィールド
    private String message;

    // コンストラクタ
    public HelloWorld(String message) {
        this.message = message;
    }

    // メソッド
    public void printMessage() {
        System.out.println(message);
    }

    // メインメソッド
    public static void main(String[] args) {
        HelloWorld hello = new HelloWorld("Hello, World!");
        hello.printMessage();
    }
}
```
#### 2.フィールド
クラスのインスタンス変数（属性）です。データを保持します。
```java
private String message;
```
#### 3.コンストラクタ
クラスの新しいインスタンスを初期化するための特別なメソッドです。クラス名と同じ名前を持ち、戻り値を持ちません。
```java
public HelloWorld(String message) {
    this.message = message;
}
```
#### 4.メソッド
クラスの操作や機能を定義します。メソッドにはアクセス修飾子（public, privateなど）、戻り値の型、メソッド名、引数リスト、メソッドボディが含まれます。
```java
public void printMessage() {
    System.out.println(message);
}
```
#### 5.メインメソッド
Javaアプリケーションのエントリーポイントです。プログラムの実行が開始される場所です。
```java
public static void main(String[] args) {
    HelloWorld hello = new HelloWorld("Hello, World!");
    hello.printMessage();
}
```

### ソースコードの他の要素
#### 1.パッケージ宣言
クラスをグループ化するための名前空間を定義します。パッケージ宣言はソースファイルの最初に記述されます。
```java
package com.example;
```
#### 2.インポート宣言
他のパッケージのクラスやインターフェースを使用するために必要です。
```java
import java.util.List;
```
#### 3.コメント
ソースコードに説明やメモを追加するために使用されます。
```java
// シングルラインコメント
/* マルチラインコメント */
/**
 * ドキュメンテーションコメント
 * このクラスはHelloWorldアプリケーションを表します。
 */
```

※ChatGPTに聞きながら記事は作成しています。


次のページ
[[備忘録 その２] Java Silver ～Javaプログラミング基礎～](https://qiita.com/MagicShowTime/items/738335281da58f45b6cf "[備忘録 その２] Java Silver ～Javaプログラミング基礎～")
Sequence MakerのFAQ

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerは誰でも直感的な操作で使えるのですが、少し使い込んでくるといろいろと疑問がわいてくることがあります。そんな日頃感じている疑問・質問をまとめていきます。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 質問：Sequence Makerはどこで入手できますか？
:::note
回答
以下のサイトからダウンロード可能です。
:::
https://sequencemaker.hioki.com/ja/

## 質問：使用にあたり、ライセンス費用などかかりますか？
:::note
回答
かかりません。無料です。Excelは有償製品なので買ってください。
:::

## 質問：測定器何台まで制御可能ですか？
:::note
回答
最大12台の測定器まで制御可能です。V1.60から6台⇒12台に増えました。
:::

## 質問：測定器以外も制御可能ですか？
:::note
回答
Arduinoなどのシリアル通信可能なマイコンと通信することができます。またCONTECのデジタルIOボードと組み合わせてリレーなどを制御して回路を切り替えることができます。他にもLANで制御可能なパトライトなんかも制御できます。
:::

## 質問：「通信コマンド」はどこを見ればわかりますか？
:::note
回答
「制御したい測定器の型名＋通信取説」や「型名＋通信コマンド」といったキーワードでGoogle検索すればたぶん見つかります。例えば、Keysignt社のE4980Aのコマンドを知りたいときは「E4980A 通信コマンド」と検索すると見つかります。ただし、メーカーによっては閲覧するのにユーザー登録が必要な場合があります。
:::

## 質問：VISAを使って通信することもできるの？
:::note
回答
できます。NI-VISA、IO Libraries Suite、KI-VISA、R&S VISAなどに対応しているので、お好きなものが使えます。注意点としては、1つのPCに複数のVISAを入れることはやめた方が良いです。通信できない、などのトラブルの元になります。
:::

## 質問：詳しい使い方を知りたいときは？
:::note
回答
Webマニュアルに細かく書かれているので参照。
:::
https://sequencemaker.hioki.com/manual/ja/

## 質問：多言語対応？
:::note
回答
日本語、英語、韓国語、中国語に対応しています。Excelの言語設定と連動して自動的に切り替わります。
:::

## 質問：パソコンと測定器はどうやって接続するの？
:::note
回答
RS-232CやUSB、GPIB、LANなどいろいろな接続方法があります。下記の記事参照。オススメはUSB。
:::
https://qiita.com/sequencemaker/items/08d1fb66d1ba284e00a4

## 質問：測定器を自動制御することもできるの？
:::note
回答
通信コマンドをExcelシートに並べて書くだけで、いろいろな制御が可能です。測定の自動化も可能です。測定条件を変えながら何万回も測定するとか、長時間測定するとか、余裕でできます。
:::

## 質問：VBAとの連携や外部プログラムの実行はできる？
:::note
回答
余裕でできます。
Sequence Makerを外部プログラムから制御するためのAPIも公開されていますので、Sequence Makerの制御を自動化することも可能です。ちょっと複雑な制御をしたい場合はチャレンジしてみましょう。
:::
https://sequencemaker.hioki.com/manual/ja/Sequence%20Maker%20API.html

## 質問：ちょっと変わった使い方は？
:::note
回答
マイコンと通信するとか、LINEにメッセージを送るとかできます。以下の記事参照。
:::
https://qiita.com/sequencemaker/items/e68cf7d242e01de62f97

https://qiita.com/sequencemaker/items/63e3aa822b09250a6b95

## まとめ
この記事は思いついたら随時追記していきます。また、掲載の無い質問などありましたらコメント欄にご記入ください。可能な範囲で回答いたします。