OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeにおけるProcessingの開発環境

# 本記事について
プログラミング言語Processing4をVSCode上で利用することを目指します。
Githubにファイルの内容を公開していますのでご参考になれば幸いです。

https://github.com/sakamo-bnn/processingSimpleProject

## 1. Processingのインストール
次のページでProcessingをダウンロードして，zipファイルを解凍します。processing-4.x > processing.exeを実行することで，Processingの利用ができます。

[Download Processing / Processing.org](https://processing.org/download)

## 2. VSCodeのインストール
Processingのみでも開発をすることは可能ですが、作業効率を上げるためにVSCodeを利用します。次のページでVSCodeをインストールします。

[Download Visual Studio Code](https://code.visualstudio.com/download)

## 3. VSCodeのビルド設定
### (1) ディレクトリの構成
次のようなディレクトリを構成してください。sketchフォルダとsketch.pdeは任意の名前で変更が可能ですが，「sketch」の箇所は同じである必要があります。

- sketch
    - sketch.pde
    - .vscode
        - tasks.json

### (2) tasks.jsonの編集
.vscodeファイルにあるtasks.jsonの内容は次の通りです。tasks > command の値は processing-java.exe のパスを示します。この実行ファイルは1節の processing.exe と同じディレクトリにあります(2023/10/07時点)。

```json: tasks.json
{
  "version": "2.0.0",
  "presentation": {
    "reveal": "always",
    "panel": "new"
  },
  "tasks": [
    {
      "label": "Run",
      "command": "環境に応じて要変更\\processing-java.exe",
      "type": "process",
      "args": ["--force", "--sketch=${fileDirname}", "--run"],
      "problemMatcher": [],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}
```

## 4. VSCodeの拡張機能
作業効率を上げるために、VSCodeで次の拡張機能を導入します。
- Processing Language
    - コードの色覚的提示
    - コード保管
    - プログラムの実行 [Ctrl] + [Shift] + B

-  Processing Formatter
    コードの整形
    | OS      | ショートカット      |
    | ----    | ----               |
    | Windows | Shift + Alt    + F |
    | Mac     | Shift + Option + F |
    | Linux   | Ctrl  + Shift  + I |

# 5. Processingスケッチの動作確認
sketch.pdeを作成して，実際にVSCode上で動作するかを確認します。サンプルコードを示します。[Ctrl] + [Shift] + Bを押すことで，スケッチが実行されます。実行に失敗する場合はコードのタイプミスや第3節の設定を再確認してください。
```java: sketch.pde
void setup() {
  size(200, 200);
}

void draw() {
  ellipse(100, 100, 50, 50);
}
```

実行に成功すると，次の画像のようなウィンドウが立ち上がります。
![sketch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844961/aff4328d-bd64-9a36-d487-b39de451d1a6.jpeg)
これで開発環境の構築は完了です。お疲れさまでした！
Generics 関数の中で制約付きのポインタ型と実体型を両方扱いたい

Go1.20 の頃の話なんですけど。

# お困りごと

こんな感じでレシーバがポインタで宣言されてて、かつ関数の中でレシーバのフィールドを触ってるケース。

```go
type Hogeable interface {
	Hoge()
}

type HogeUser1 struct{ s string }
type HogeUser2 struct{ s string }
type HogeUser3 struct{ s string }

func (h *HogeUser1) Hoge() {
	h.s = "HogeUser1"
	fmt.Println(h.s)
}
func (h *HogeUser2) Hoge() {
	h.s = "HogeUser2"
	fmt.Println(h.s)
}
func (h *HogeUser3) Hoge() {
	h.s = "HogeUser3"
	fmt.Println(h.s)
}
```

これを実体宣言して呼び出す Generics 関数を用意したい、となったとき。
ナイーブに　Generics にすると、`T` がそもそもポインタ型なので実体が作れなくて死んでしまう。


```go
func BadCallHoge[T Hogeable]() {
	var hoge T
	hoge.Hoge()
}

func main() {
	BadCallHoge[*HogeUser1]()
	BadCallHoge[*HogeUser2]()
	BadCallHoge[*HogeUser3]()
}
```

```bash:ぬるぽ
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x108ddb8]
```

ちなみに型引数に実体型を渡すとコンパイルエラーになる。レシーバがポインタで宣言されてるため。

```go
BadCallHoge[HogeUser1]()
// HogeUser1 does not satisfy Hogeable (method Hoge has pointer receiver)

```


# 改善策

実体型を `any` で渡して、それに `interface` で制約つけて、キャストして呼び出してやるといけるらしい。

```go
func CallHoge[T any, PT interface {
	Hogeable
	*T
}]() {
	var hoge T
	PT(&hoge).Hoge()
}

func main() {
	CallHoge[HogeUser1]()
	CallHoge[HogeUser2]()
	CallHoge[HogeUser3]()
}
```

ちなみに `any` のところは union でもおｋ、というか union で絞った方がいいかも。
`T HogeUser1 | HogeUser2 | HogeUser3`

なお、これが正しいやり方なのかはわからん。

# 全体のコード

```go
package main

import (
	"fmt"
)

type Hogeable interface {
	Hoge()
}

type HogeUser1 struct{ s string }
type HogeUser2 struct{ s string }
type HogeUser3 struct{ s string }

func (h *HogeUser1) Hoge() {
	h.s = "HogeUser1"
	fmt.Println(h.s)
}
func (h *HogeUser2) Hoge() {
	h.s = "HogeUser2"
	fmt.Println(h.s)
}
func (h *HogeUser3) Hoge() {
	h.s = "HogeUser3"
	fmt.Println(h.s)
}

func CallHoge[T any, PT interface {
	Hogeable
	*T
}]() {
	var hoge T
	PT(&hoge).Hoge()
}

func main() {
	CallHoge[HogeUser1]()
	CallHoge[HogeUser2]()
	CallHoge[HogeUser3]()
}
```

おわり。
Microsoft Entra テナント の削除

# テナントが不要になったら
テナントが不要になったら、以下の URL を参照して作業を行うと、テナントを削除することが可能です。

（参考：リソースをクリーンアップする）
https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/create-new-tenant#clean-up-resources

:::note alert
テナントを削除してしまうと、元には戻せなくなります。
本当に削除してしまっても構わないか、最終確認を行ってください。
:::

なお、削除する際に 事前にやっておくべき作業があるため、その注意事項が 赤枠欄に表示されます。この表示がでたら、その指示に従ってください。すべての指示の対処をしたあとに テナントの削除が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b94041bd-f5a3-c3a4-840d-1fc7080d5b27.png)

# すべてのユーザーを削除する
1. テナント外のユーザー（緑下線：ExternalAzureAD）のグローバル管理者でサインインして、一覧で 自分以外のユーザーすべてにチェックを入れて「削除」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2ab34250-c291-931f-4b9e-87df3dbce49d.png)

# 「Azure リソースを削除するアクセス許可を取得します」が出た場合
1. 「Azure リソースを削除するアクセス許可を取得します」のリンクを押します。

1. 以下の画面で 赤枠の「はい」を押します。その後「保存」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/969664b8-5038-351a-c0cb-145a2a35ab14.png)

1. いちど、Azure Portal のトップ画面に戻って、再度 テナントの削除処理を行います。
→　このアクションが重要です。再度処理をせずに ブラウザで戻って「更新」ボタンを押しても、設定変更が反映されませんでした。

# 削除の実施
この状態になれば、削除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/dcf8013b-b7c9-320b-58d6-568f5a5786c8.png)

正常に削除されると、以下のメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/37d39d68-71c3-dac8-39c9-27117ac1e207.png)

テナントの削除後に サインアウトせずに留まってると 以下のメッセージが表示されました。これで サインアウトするしか無くなります。（無視を選んでもサインアウトされちゃいました💦）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/86a420b6-b3b4-0637-0bbf-9d91f79c8eb9.png)
【メモ】Trailheadでやったことを備忘用に記録していく（Lightning Experience）


■Lightning Experience のカスタマイズ

＜目的＞
・Maria は、カスタムオブジェクトとカスタム項目を利用して、エネルギーコンサルティングアプリケーションを作成したい。
⇒顧客のエネルギー使用量を追跡できるようなアプリ。

＜やること＞
・カスタムオブジェクトを作成

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
・カスタムオブジェクトタブを作成
⇒これがないとカスタムオブジェクトをアプリケーションに追加できない。
このタブを、どこのカスタムアプリケーションに追加するかも選ぶ。

（※）カスタムアプリケーション…ビジネスプロセスをサポートするために組み合わせた項目、オブジェクト、権限、およびその他の機能のセット

・カスタム項目を作成する
色々情報関連付けしたいよね⇒カスタム項目つけよう。

選択リスト＝picklist
Lookup Relationship＝参照関係

・項目を追加し終わった！次にレコード追加。
監査レコードを Salesforce に入力

![sf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/cfe0e491-a5d7-2f04-1161-64f9ace6084c.png)


(´・ω・｀)。。（言語諸々英語だけど、日本円表記でいいんだろうか...まあいいか）


・チャレンジ
エネルギー監査＝Energy Audit
このカスタムオブジェクト「Energy Audit」すでにあるってエラーが。

⇒シナリオの中の奴を順番にやっていけばそれがそのままチャレンジだった。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
■Lightning アプリケーションの作成およびカスタマイズ

・Lightning アプリケーションは、ページ上部にナビゲーションバーあって色々カスタマイズできるよ！
　楽しく使いやすいようにしよう～

・色々付けられるよ。グループ化もして独自にアプリケーションを開発できるよ。

・Classic と Lightning の 2 種類のアプリケーションがある。

設定、英語変換困るやつ。ToDOってないし。
Taskでいいのかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/9eb0bca5-d6da-f7ab-243e-ba6ada4ee0de.png)

おおー、ダッシュボード完成した！楽しい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/fda0f8cb-7a1e-1d4f-d5da-10cf57d1af12.png)


■リストビューの作成およびカスタマイズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/45472d82-2092-333d-2862-36464547fea0.png)

設定⇒Accountsから新規作成。取引先のビューをドバっと出した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/2f2b2a38-5f8e-c07f-8c02-b4a09d42f001.png)

検索絞り込み。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/a09e5661-bbd3-76c2-a580-d49c81690c71.png)

なるほどなるほど、必要なデータを引っ張ってくる⇒それを票形式で表示する⇒これに名前を付けておけば「該当の検索条件でいつでも引っ張ってこれるようになる」というわけね。覚えたぞ！

確度（%)＝Probability（%)

■コンパクトレイアウトを使用したレコードの強調表示のカスタマイズ

見やすく表示を変えられるよってお話。


■ページレイアウトを使用したレコードの詳細のカスタマイズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/23026e74-93a2-450d-3a71-2d239e1f88a4.png)

視覚的にいじることができる！
アイコンレイアウトは覚えておきたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/e7c86fc1-52ca-390b-6cb8-962a7f8539cf.png)

・ページレイアウトを異なるユーザープロファイルに割り当てることができます。
⇒一般ユーザ用、マネージャ用に分けたりができる。便利。


＜だんだんわかってきた＞
左のアプリアイコン⇒ランチャーで該当のレコードの纏まりがみられる。


■カスタムボタンとカスタムリンクの作成

【？】「Account」の中に「Energy　Audits」がみつからない。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/57ce24c7-fe8e-986d-b5a6-b4122e21d55e.png)

リンクが有効になってない＞＜

・GoogleMAP表示
これは出たー！便利だーAPI
・Googele検索も

この章楽しい。


■クイックアクションによるユーザ操作の強化

・ユーザーがしたい操作を登録
クイックアクションには 2 種類あります。

1.オブジェクト固有のアクション
関連レコードに自動的に関連付けしたりする。

2.グローバルアクション
ページ移動しなくて、どこでもアクションができる。
独自のレイアウトで有効。メニューに表示される。

アクションレイアウトエディターでカスタマイズする。


グローバルアクションを登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/193e29d0-2861-8731-7159-75c5568b2f25.png)
ここですぐアクションを入れてレコード追加とかができるようになる。
clsxを使ってみる-Reactで使いたい

# 背景
clsxを使ってみたく軽く調べたところ概要から基本的な使い方までを説明している記事があまりなかったので、簡単に自分の理解した範囲でまとめます。

私は初学者なので、基本的には同じ初心者向けの内容となると思います。
また、間違いも多少あるかもしれないので、その場合は優しく教えてください。

それでは行ってみましょう。

# 概要
## clsx とは?
- clsxは、JavaScriptやTypeScriptで使える軽量なライブラリで、主にReactコンポーネントなどでクラス名の文字列を効率的に、そして簡単に生成するためのものです。
- これは特に、CSSのクラス名を動的に構築する際に非常に役立ちます。

## なぜ clsx が必要なのか?
- Reactのコンポーネントでスタイリングをする際、propsやstateに基づいて動的にクラス名を変更したいという要件がよくあります。
- このような場面で、clsxは複数のクラス名や条件付きのクラス名を簡潔に、そして読みやすい形で生成するのを助けます。

## 主な特徴:
- 軽量: 
    - clsxはパフォーマンスを意識して設計されており、ライブラリ自体のサイズも非常に小さいです。
- 柔軟性: 
    - 文字列、オブジェクト、配列など、さまざまな形式でクラス名を指定できます。
falsy値のフィルタリング: clsxはnullやundefined、falseなどのfalsyな値を自動的に無視します。

# 使用方法
基本的な使用方法をまとめます

## インストール
まず、プロジェクトにclsxをインストールする必要があります。npmやyarnを使用してインストールできます。
```bash
npm install clsx
# または
yarn add clsx
```
## 使用
インストールが完了したら、以下のようにインポートして使用できます。
```javascript
import clsx from 'clsx';
```
## クラス名の構築
### 文字列の結合
最も基本的な方法です。複数の文字列を渡すと、それらがスペースで結合されます。
```javascript
clsx('foo', 'bar');

// => 'foo bar'
```
### 条件付きクラス名
JavaScriptの条件式を使用して、条件に基づいてクラス名を組み込むことができます。
```javascript
const isActive = true;
clsx('menu', isActive && 'active');

// => 'menu active'
```
### オブジェクトを使用する
オブジェクトのキーがクラス名として、そのキーの値（真偽値）がそのクラスが適用されるかどうかを決定します。
```javascript
clsx({
  'btn': true,
  'btn-primary': true,
  'btn-disabled': false
}); 

// => 'btn btn-primary'
```
### 配列を使用する
配列内の各要素は、文字列やオブジェクト、または他の配列として指定できます。これにより、複雑な条件でのクラス名の組み合わせも可能です。
```javascript
const isDisabled = true;
clsx([
  'btn',
  {'btn-primary': !isDisabled},
  {'btn-disabled': isDisabled}
]); 

// => 'btn btn-disabled'
```
### falsyな値の取り扱い
clsxは、null、undefined、falseなどのfalsyな値を自動的にフィルタリングします。これにより、無駄なスペースや不要なクラス名の追加を防ぐことができます。
```javascript
clsx('foo', null, undefined, false, 0, 'bar'); 

// => 'foo bar'
```

# まとめ
これらの方法を組み合わせることで、非常に柔軟にクラス名を構築することができます。
特にReactのコンポーネント内でのクラス名の動的な生成に非常に適しています。
React-Chart-JS2で詰まったことメモ

# 初めに
&emsp;フロントエンドの勉強をしたいと思い、ReactとTypeScriptを用いて家計簿アプリを作りながら学んでいたところ、グラフの描画で詰まった部分のメモを残す。

# 詰まったこと
&emsp;React-Chart-JS2を用いてグラフ描画を行おうとしたところ、そもそも初期化の時点でエラーが発生。
ネットで色々調べながらやったがうまくいかず。
```diff_typescript
export const PiePlot: React.FC = () => {
    const [pie_data, setPieData] = useState({}) // ここがダメだった
    ...
    useEffect(() => {
        // APIをコールしてデータを取得
        ...
        setPieData(pie_data)
    }, [])
    return(
        <div className="graph-area">
            <Pie data={pie_data} />
        </div>
    )
}
```
useStateで初期化しているpie_dataに初めからの{}をわたし、その後useEffect実行時にAPIから取得したデータをpie_dataにセットして描画を試みていた。

# 結論
&emsp;結論として初期化の際に空の{}をわたしたのが良くなかった。
useEffectはライフルサイクルで見ると初め(初期化の際)はレンダリング後に実行される。
そのため、{}を渡すと
```diff_typescript
<Pie data={pie_data} />
```
は本来必要とするdatasets、labelsなどの要素を読み取れない。
そのため以下のように初期化を行うことで解決できた。
```diff_typescript
export const PiePlot: React.FC = () => {
    const [pie_data, setPieData] = useState({
        labels: [],
        datasets: []
    }) // こうすることで解決した
    ...
    useEffect(() => {
        // APIをコールしてデータを取得
        ...
        setPieData(pie_data)
    }, [])
    return(
        <div className="graph-area">
            <Pie data={pie_data} />
        </div>
    )
}
```

# まとめ
&emsp;今回はReact-Chart-JS2を用いてグラフを描画する際に詰まったことをメモした。
結論として初期化する記述が間違っていたことが問題であり、初めから読み取る部分をいれ、それらが持つ要素を空にして、初期化することで解決した。
&emsp;しかしレンダリングの後でuseEffectを実行するので一瞬空の状態の描画が描画がうつるときがある。
その部分についても解決していきたい。

# 追記
&emsp;今回勉強のために作成した家計簿アプリのGitHubのリンクを以下に記載します。
コードのレビューでもなんでも本記事のコメントに記載していただけると幸いです。
学びにつながり、自身のモチベーションにもつながります。
よろしくお願い致します。

(リンク)
・　https://github.com/Inoue416/ts-account-book
SORACOM SIMをiOSで使い始める時のプロファイル設定、最後のひと手前

SORACOM SIMをiOSで使う時に、公式ドキュメントがありますが、個人的に最後にちっちゃい落とし穴があったのでメモ。

SIMを購入したら、以下の手順で利用開始準備をしていく。

### SORACOM SIM受け取り
（普通にオンラインで購入した場合はやらなくてもいいかも？）

https://support.soracom.io/hc/ja/articles/115001366827-SORACOM-IoT-SIM-%E3%81%AE%E8%B3%BC%E5%85%A5%E6%96%B9%E6%B3%95%E3%81%A8%E7%99%BB%E9%8C%B2%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

### iOS デバイスで SORACOM Air を使用する

https://users.soracom.io/ja-jp/guides/devices/general/ios/

### プロファイルをインストール
ちっちゃい落とし穴はこの最後にあります。

https://users.soracom.io/ja-jp/guides/devices/general/ios/

iOSデバイスで上のドキュメントのページにアクセスし、該当のiOSバージョンのプロファイルを探して、ダウンロードします。

ドキュメントの手順はここで終わります。ここまで誰もつまずかないと思います。

しかしながら、この後iOSデバイス側でもうひと手間あります。
世間の常識すぎて、僕が無知なだけだったと思いますが。
設定アプリを開いて、ダウンロード済みのプロファイルを選択し、ダイアログに沿ってインストールを完了させる必要があります。

![SCR-20231007-mudy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/a19ead13-fdac-6cc0-c177-b84c7c234d48.png)

念の為モバイルデータ通信がONになっていることを確認して、通信を試すと成功すると思います。
【Python】Excelシートを昇順で並べる

Excelのシートを名前順に並べるのが面倒なので、Pythonのopenpyxlを使って並べ替えをするコードを作成しました。

今回の記事の参考として

* [openpyxl公式ドキュメント](https://openpyxl.readthedocs.io/en/stable/index.html)
* [Tkinterに関するドキュメント](https://docs.python.org/ja/3/library/tkinter.html)

# 1. 今回作成したコードの概要

* GUIでExcelファイルを指定する（Tkinterを使用。こちらは標準モジュールのためインストール不要）
* Excelファイルの読み込み（openpyxlを使用。標準モジュールではないため、インストール済みではない場合は `pip install openpyxl` を実行する必要あり）
* Excelシートの名前を取得し、昇順でリストに格納
* Excelシートの末尾にシートを並べていく（ついでにフォント指定）
* Excelブックを `sorted_<book_name>.xlsx` で別米保存 

※フォント指定はセル単位で行われており、空シートにはフォント指定しない。（本当は、シート単位でフォント指定したいが...）

# 2. 実際のコード

```python: main.py
import os
from tkinter import Tk
from tkinter import filedialog
from openpyxl import load_workbook
from openpyxl.styles.fonts import Font

current_directory = os.path.dirname(__file__)

# Tkinterの設定
root = Tk()
root.geometry("0x0") # windowサイズを0
root.overrideredirect(1) # windowタイトルバーを消す
file_types = (
    ("excel file", "*.xlsx"),
)

# 選択したファイルの絶対パス
selected_file = filedialog.askopenfilename(initialdir=current_directory, filetypes=file_types)

# 選択したファイルの名前
file_name = os.path.basename(selected_file)

# Excelシートのフォント
font = Font(name="Yu Gothic", size=12)

# Excelファイルの読み込み
wb = load_workbook(selected_file)

# Excelシート一覧（昇順）
ws_title_list = sorted([ws.title for ws in wb.worksheets])
ws_length = len(ws_title_list) - 1

# Excelシート並び替え実行
for ws_title in ws_title_list:
    ws = wb[ws_title]

    for row in range(ws.max_row):
        if ws.max_row != 1:
            for col in range(ws.max_column):
                ws.cell(row=row+1, column=col+1).font = font

    wb.move_sheet(ws, offset=ws_length)

wb.save(selected_file.replace(file_name, f"sorted_{file_name}"))
```

# 3. まとめ

毎度シートを昇順にするのは面倒であることから、今回のコードを作成しました。サクッと作成したので、並べ替えたいシートとそうでないシート（例えば、特定のシートは並べ替えない）の工夫はできていないので、次の課題として考えています。
curlの脆弱性公開予告の情報まとめ（CVE-2023-38545, CVE-2023-38546）

# 概要
2023/10/3にcurlの開発者であるDaniel Stenberg氏がX（旧twitter）で、
10/11に深刻度がHIGHのCVEの修正を含むcurl 8.4.0をリリースすると発表。
深刻度がHIGHのものは、curlで見つかった過去最悪のセキュリティ上の欠陥とのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698888/e74b3107-8f55-a42e-6b1c-8bb170245134.png)

>私たちはリリースサイクルを短縮し、深刻度HIGHのCVEの修正を含むcurl 8.4.0を10月11日にリリースする予定です。


## GitHub Discussionsでのコメント
バージョン 8.4.0では、深刻度がHIGHのものと深刻度がLOWの２つの脆弱性が修正される。
詳細は10/11まで公開できないとのこと。日本時間だと10/11（水）15:00頃に公開予定。

https://github.com/curl/curl/discussions/12026

>私たちはリリース・サイクルを短縮し、10月11日にcurl 8.4.0をリリースする予定です。HIGHと評価されたものは、おそらく長い間、最悪のcurlのセキュリティ欠陥です。
>新しいバージョンと2つのCVEに関する詳細は、リリース日のUTC 6:00頃に公開される予定です。
・CVE-2023-38545: 深刻度 HIGH (libcurl と curl ツールの両方に影響)
・CVE-2023-38546: 深刻度 LOW (libcurl のみに影響し、ツールには影響しません)
今後リリースされるcurlにはAPIやABIの変更はありません。
どのバージョン範囲に影響があるかについては、非常に高い精度で問題（領域）を特定するのに役立つため、前もって情報を開示することはできません。
ここ数年のバージョンは、私が知りうる限り具体的なものです。
私たちはディストロのメーリングリストに通知し、メンバーであるディストリビューションがパッチを準備できるようにしています。(サポート契約と正当な理由がない限り、10月11日以前にこれらの問題の詳細を知ることはできません)。
これでおわかりでしょう。それに従って計画を立ててください。

## 10/11 公開情報
以下にて詳細情報が公開されました。

- 開発者Daniel Stenberg氏のブログ
  - CURL 8.4.0：
    https://daniel.haxx.se/blog/2023/10/11/curl-8-4-0/
  - HOW I MADE A HEAP OVERFLOW IN CURL：
      https://daniel.haxx.se/blog/2023/10/11/how-i-made-a-heap-overflow-in-curl/

- curlドキュメント
  - CVE-2023-38545：https://curl.se/docs/CVE-2023-38545.html
  - CVE-2023-38546：https://curl.se/docs/CVE-2023-38546.html

## CVE-2023-38545：SOCKS5 heap buffer overflow
この欠陥は、SOCKS5 プロキシのハンドシェイクにおいて、
curlがヒープベースのバッファをオーバーフローさせます。

影響を受けるバージョン: libcurl 7.69.0から8.3.0まで
影響を受けないバージョン: libcurl < 7.69.0 および >= 8.4.0

>2020年2月14日、私はこの変更のメインコミットをmasterに行った。
7.69.0はこの機能拡張を搭載した最初のリリースとして出荷された。
ひいては CVE-2023-38545 に脆弱な最初のリリースでもあります。

## CVE-2023-38546：cookie injection with none file
この欠陥により、特定の一連の条件が満たされた場合、
攻撃者は libcurl を使用して実行中のプログラムに任意でcookie を挿入することができます。

影響を受けるバージョン: libcurl 7.9.1から8.3.0まで
影響を受けないバージョン: libcurl < 7.9.1 および >= 8.4.0

## その他の情報
- Red Hat
    - https://access.redhat.com/security/cve/cve-2023-38545

>この欠陥は、Red Hat Enterprise Linux 6、7、および 8 に同梱されている
curl のバージョンには影響しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698888/a54ed91b-19f6-604d-8888-570939673ba5.png)

- Ubuntu
    - https://ubuntu.com/security/CVE-2023-38545
    - https://ubuntu.com/security/notices/USN-6429-1

- Amazon Linux Security Center
    - https://alas.aws.amazon.com/cve/html/CVE-2023-38545.html

- MITRE
  - CVE-2023-38545：https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-38545
  - CVE-2023-38546：https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-38546

## 参考サイト
- https://curl.se/
- https://github.com/curl/curl
- https://www.tenable.com/blog/cve-2023-38545-cve-2023-38546-frequently-asked-questions-for-new-vulnerabilities-in-curl
- https://jfrog.com/blog/curl-libcurl-october-2023-vulns-all-you-need-to-know/
【Launchpad】GPG鍵を登録してPPAを利用する方法


## はじめに

[Launchpad](https://launchpad.net/)に登録して、**Personal Package Archive（PPA）** を利用するには「**GPG鍵**」を登録しないといけません。

GPG鍵はGitHubでも利用している方は多いと思うので説明は必要ないと思いますが、登録方法がGitHubに比べて少し難解なので、まとめたいと思います。


## 手順
1. GPG鍵の生成
2. 公開鍵をUbuntuの鍵サーバーに転送
3. 公開鍵のフィンガープリントをLacunpadのアカウントで貼り付ける
4. 鍵の確認


### 1. GPG鍵の生成
```bash:GPG鍵の生成
$ gpg --gen-key
```

### 2. 公開鍵をUbuntuの鍵サーバーに転送
- `gpg --listkeys`
  - 鍵の一覧表示で公開鍵のID確認
- `gpg --send-keys --keyserver keyserver.ubuntu.com 公開鍵ID`
  - 公開鍵をUbutunの鍵サーバーに転送
```bash:鍵の一覧表示で公開鍵のID確認
$ gpg --list-keys
~/.gnupg/pubring.kbx
-------------------------------
pub   暗号 日付 [SC] [有効期限: 日付]
      公開鍵ID
uid           [  究極  ] 名前 <メールアドレス>
sub   暗号 日付 [E] [有効期限: 日付]
```
```bash:公開鍵をUbutunの鍵サーバーに転送
$ gpg --send-keys --keyserver keyserver.ubuntu.com 公開鍵ID
```

### 3. 公開鍵のフィンガープリントをLauchpadに貼り付ける
- 公開鍵のフィンガープリントを確認
- フィンガープリントの貼り付け

#### 公開鍵のフィンガープリントを確認

```bash:公開鍵のフィンガープリントを確認
$ gpg --fingerprint ユーザー名
pub   暗号 日付 [SC] [有効期限: 日付]
      フィンガープリント
uid           [  究極  ] ユーザー名 <メールアドレス>
sub   暗号 日付 [E] [有効期限: 日付]
```

#### フィンガープリントの貼り付け

フィンガープリントをコピーしたらアカウントの**OpenPGP keys**をクリック｡


![GPG鍵をLaunchpadで有効化するまで_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/89485964-3fa4-9aac-0a06-c5a6a317880c.png)



次にUbutuのログイン画面に遷移するのでログイン｡


![GPG鍵をLaunchpadで有効化するまで_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/13fae9be-4659-78e1-f1e2-d1ca59aa0e15.png)


フィンガープリントを貼り付けて､**「Import Key」** をクリック｡


![GPG鍵をLaunchpadで有効化するまで_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/72eaf04c-ae44-3109-a2be-b3eb76bf0e41.png)



### 4. 鍵の確認
フィンガープリントを貼り付けて鍵を登録したら､メールアドレスに**暗号文**が送られる｡
メールアドレスに貼り付けられている暗号文を「BEGIN」から「END」までコピーし､`任意の名前.txt`に貼り付ける｡

貼り付けた文章は暗号化されているため、`gpg -d`というコマンドでファイルを開く。
すると、**GPG鍵のパスワードを求められ**るのでパスワードを入力すると、暗号が解読され **「とあるURL」** が表示される
```bash:メールに送られてきた暗号文を読む
$ gpg -d 任意の名前.txt
```

そこにクリックすると、鍵の有効性が確認できる｡



## 参考
- [debパッケージを作ってlaunchpadでPPAとして公開するまでの手順 - Qiita](https://l.pg1x.com/PYFZ)
【Rails】ransackを使用した検索機能の作成

Railsにてransackというgemを使用して投稿一覧にて検索機能を作成。備忘録として記述。

検索機能を使わない場合は公開中の全投稿を表示、検索機能を使用した場合は検索結果を表示していきます。
フォロー機能も実装しているので、今回は、「都道府県」「ジャンル」「フォローしている人かどうか」で検索できるようにしていきます。

※新規投稿する際に都道府県、ジャンル、投稿の公開・非公開を選択して投稿する仕様にしています。（都道府県、ジャンル、投稿の公開・非公開はenumにて管理）

・都道府県
```
  enum prefecture: {
                    hokkaido: 0,
                    aomori: 1,
       ~~~~~~~~~~~~    省略     ~~~~~~~~~
                    kagoshima: 45,
                    okinawa: 46,
  }
```

・ジャンル
```
enum location_genre: { food: 0, location: 1 }

```
・投稿の公開・非公開
```
enum released_flag: { released: 0, not_released: 1 }
```





①ransackのインストール
Gemfileに下記記述。
```
gem 'ransack'
```

インストールする。
```
bundle install
```

②コントローラーにメソッド記述。
```
 def index
    if params[:follow].present?
      @follow = params[:follow]
    else
      @follow = false
    end

    @q = Post.ransack(params[:q])
    @user = current_user.followings
    @posts = @q.result(distinct: true).released.order(created_at: :desc).page(params[:page])

    if @follow == 'true'
      @posts = @q.result(distinct: true).where(user: @user).released.order(created_at: :desc).page(params[:page])
    end
  end

```
順を追って解説していくと、
(1)下記の記述については、もしパラメーターにfollowが存在していれば@followにパラメーターのfollowを定義。
もし存在していなければfalseを定義。

```
if params[:follow].present?
  @follow = params[:follow]
else
  @follow = false
end
```

(2)下記の記述については、
@q→Postの中から検索した情報をパラメーター（:q）に入れる。
@user→現在ログインしているユーザーがフォローしている人を定義。
@posts→@qの中から公開中(released)のものを検索して表示。（公開中の投稿を全表示）
distinct: true→重複を削除。
order(created_at: desc)→投稿を降順に表示。

```
@q = Post.ransack(params[:q])
@user = current_user.followings
@posts = @q.result(distinct: true).released.order(created_at: :desc)
```

(3)下記の記述については、
①で定義した@followがtrueの場合に、ログインユーザーがフォローしている人(current_user.id.followings)かつ公開中(released)の投稿を表示。

```
if @follow == 'true'
  @posts = @q.result(distinct: true).where(user: @user).released.order(created_at: :desc)
end
```

③モデルに記述。
「検索可能な列」や「検索可能な関連モデル」をモデル内に予め定義しておく必要がある。
※悪意のあるユーザーが任意の検索条件を実行して、内部データを推測するセキュリティ問題を回避するため
```
def self.ransackable_attributes(auth_object = nil)
    ["address", "created_at", "id", "latitude", "location_genre", "location_name", "longitude","memo", "prefecture", "updated_at", "user_id"]
end

def self.ransackable_associations(auth_object = nil)
    ["favorites", "image_attachment", "image_blob", "notifications", "user"]
end


```

④viewに記述
フォロー済みユーザーを検索するかどうかは、チェックボックスへのチェックの有無にて判断するように実装。
検索ボタンは画像にて表示できるようにしました。

```
<%= search_form_for @q, url: posts_path, id: 'search_form' do |f| %>
  <%= f.select :prefecture_eq, Post.prefectures_i18n.invert.map{|key, value| [key, Post.prefectures[value]]},
                      { include_blank: t('--都道府県--') } %>
　<%= f.select :location_genre_eq, Post.location_genres_i18n.invert.map{|key, value| [key, Post.location_genres[value]]},
                      { include_blank: t('--ジャンル--') } %>
　<%= label :follow, "フォロー済みユーザー" %>
　<%= check_box_tag :follow, true, @follow %>

  <%= image_submit_tag('検索ボタンの画像', width: "75px", height: "auto", class: "mx-1") %>
<% end %>
```
[C#, Visual Studio]ドキュメントコメント(/// <summary>のやつ)に関わる概念の整理(何となく使っている状態から一歩進めたい)

## はじめに

Visual StudioでC#を書いているとき、クラスやメソッドの上に/// \<summary>を書くとVisual StudioのIntelliSenseがいい感じにコメント内容を表示してくれます。

```cs
/// <summary>
/// これがドキュメンテーションコメントです
/// </summary>
public static void Hoge()
```
こう書くと、Visual Studioにおいて、メソッドの説明に入力したコメントが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481394/0f508d32-e5b3-30c9-9b0d-50b8eb921b5d.png)


クラスやメソッドの上に///を書くと自動的にsummaryが挿入されるので、これまで自分は何も考えずに便利だなあと思って使っていました。
この機能についてちゃんと調べてみて、[公式ドキュメント](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/xmldoc/recommended-tags)で便利な使い方を見つけたのですが、その中の\<see>と\<seealso>が同じっぽいけど何が違うんだろうと疑問でした。

以下の画像のように、seeやseealsoを使うとクラスやメソッドに対するリンクにすることができます(クリックでリンク先に飛べます)。この形式だと(コメント内に文字列として書く場合とは異なり)VS上で参照として機能するため便利です(画像の「2件の参照」はseeとseealsoのcref分です)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481394/41492019-6939-e172-aeca-1e52984ad1b2.png)

この疑問をきっかけに色々調べていると、この機能について自分の中でドキュメントコメントに関する色々な概念が整理されていないことに気が付いたので、この記事でまとめてみます。

## ドキュメントコメントとは何かの整理
まず、公式ドキュメントが色々とあったので、いくつか貼っておきます。

(1)[XML ドキュメント コメント](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/xmldoc/)
(2)[C# ドキュメント コメントとして推奨される XML タグ](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/xmldoc/recommended-tags)
(3)[ドキュメント コメント(C# 言語仕様)](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/documentation-comments)

以下、ドキュメントコメントに対して自分の中でごちゃっと認識していた概念を分解して書いてみます。

<strong>・XML形式でコメントを書いている</strong>
あくまでコメントを書いているだけなので、C#、Visual Studioに関係なくXML形式でコメントを書きたいなら書けるわけです。この(何もしなければ)単なるコメントを、Visual Studio、C#それぞれで便利に使っているようです。

<strong>・Visual Studioの機能としてクラス・メソッドの説明として表示される</strong>
Visual Studioの便利機能として、メソッド・クラスの上に///を入力すると\<summary>一式が自動挿入され、それがIntelliSenseに表示されます。
気軽に自動挿入して入るのが一番身近な接点のため、VSの機能っぽい気がしますが、次に書く通りC#側でも用途があるようです。

<strong>・C#の機能として、XMLドキュメントコメントをドキュメント化することができる。</strong>
これは自分が全く把握していない側面でした。C#の言語仕様として、ルールに従ってドキュメントコメントを記載するとドキュメントを生成できるとのことです。ドキュメントの(3)に詳しいです。

# さいごに seeとseealsoの違い
ここまでまとめると、seeとseealsoの違いが分かるようになりました。
* seeもseealsoも、VSのIntelliSense上では同じように動くので、このかぎりではちがいはなさそう
* C#によってドキュメントコメントをドキュメント化した際に、seeとseealsoは異なる形でドキュメント化される
 
ということのようです。
GitHub の SSH 接続方法 

# はじめに
毎回、忘れたころに設定する必要があるのでメモ残し。
画面の画像も使わない、不親切仕様な自分用メモ。

# 確認環境
- Windows10
- wsl2 (Ubuntu 22.04.3 LTS)

# 手順
- 操作端末(WSL)
    - キー作成
        ```shell
        ssh-keygen -t rsa
        ```
    - キーの内容表示(コピーする)
        ```
        cat ~/.ssh/id_rsa.pub
        ```
        `ssh-rsa ...` 以降の文字列をコピー



- GitHub
    - `右上メニュー` → `Settings` → `SSH and GPG keys`
    - `New SSH key ボタン押下`
    - フォームに以下を入力
        - `Title` 管理名称(任意)
        - `Key type` Authentication Key
        - `Key` コピーした内容

- 操作端末(WSL)
    - SSH接続
        ```shell
        ssh -T git@github.com
        ```
        ※確認には `yes` を入力

# おまけ
- localでの config 設定
```shell
git config --local user.email "xxxxx@yyyy.zzz"
git config --local user.name "xxxxx"
```

- ssh のリモート追加
```shell
git remote add origin git@github.com:{username}/{repositoryname}.git
```
    
- 間違えて追加してしまったリモート先削除(ssh前提でhttpsを追加してしまった等)
```shell
git remote rm origin
```

# 終わりに
次忘れたころには、GitHubのメニュー構成が変わってたりするのではないかと予想中。
【最新】godotのいいところ

# unityの改悪
unity なんちゃらfeeのせいで、インストール数を基準にお金を取られるらしいです。
個人開発なのに金取んのかよ!クソッタレ!とお思いの方もいるかもしれません。

実装されるのはまだ先ですが、どうせならこの機会にほかのゲームエンジンに切り替えようという人もいると思います。

そこで、今話題のgodotという完全無料、ossエンジンを実際に試し、徹底レビューしていきます。

# godotとは?
## 特徴
> The Godot Engine is a free, all-in-one, cross-platform game engine that makes it easy for you to create 2D and 3D games.
>
>[公式ページ](https://godotengine.org/)より引用

無料で2d、3dゲームを作れるマルチプラットフォームなゲームエンジンってことです。

ossで、3.xバージョンではunrealengineのようなVisualScriptingもサポートされていました。(現在はサポートなし、GitHubより3.xのリリースがDL可能)

また、4.xのバージョンでも非公式のソースから自分ビルドすることでVisualscriptを使用出来るようです。
[参考:Godot 4.0 will discontinue VisualScript](https://godotengine.org/article/godot-4-will-discontinue-visual-scripting/)

## 何ができる?プログラミング言語は?
godotはゲームエンジンなので(当然)、一般的なゲームならばほ作れます(作れないゲームが頭に浮かばなかった)。
このゲームエンジンは、独自の言語「GDscript」を使用してプログラミングします。Python参考に作られているので、pythonを使っている人は早く習得できるかも。

他にGDNativeという機能を使用して他の言語でc++でプログラミングしたり、C#を使うこともできます。C#はGDscriptの約4倍早いそうです。
[C#参考:C# の基本](https://docs.godotengine.org/ja/4.x/tutorials/scripting/c_sharp/c_sharp_basics.html)
[C++参考:GDExtension C++ example](https://docs.godotengine.org/en/stable/tutorials/scripting/gdextension/gdextension_cpp_example.html)

## 日本語の情報は?サポートは?
[公式ドキュメント](https://docs.godotengine.org/ja/4.x/)が(途中までですが)日本語に翻訳されています。3.xのドキュメントだとほぼ翻訳が終わっている感じですが、...まぁdeepl翻訳にかければおkです。ggれば少しですが出てきます。

[こちら](https://godotforums.org/t/forum)で質問することもできます。

## 要求スペック
要求スペックはとても低く、おそらくほとんどのpcで動きます。私の学校のpcでも動きました。(intel Celeronのcpu、メモリ4Gのwin10)

家のメインpc(Ryzen5、win11、メモリ16G)ではue5やunityとは比べ物にならないほど早く動作します。2dの場合は。

3dは使ったことありませんが、おそらく軽いであろうって感じです。

## UI
unityやUE5より(僕的に)スタイリッシュです。様々なものでごちゃごちゃしておらず、視認性も良いです。

unityと比較するとこんな感じ。
unity![IMG_3916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082992/3d34ef34-0351-5850-28e1-d0caba97b226.png)

Godot
![IMG_3918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082992/33a3345b-2145-f88e-7a1b-5802d7318a17.png)


個人的にはデザインもgodotの方が好きです。

# 使い勝手
## 操作性、視認性
前述の通り、抜群です。後発エンジンの強みでもある。。。

## ゲームの作りやすさ
ノード(機能、ボタン配置やアニメーションスプライトの描画、物理演算など)を組み合わせてシーンを作り、さらにそのシーンを組み合わせて新しいシーンを作るという方式を取っています。

unityやue5とは若干違う方式で、慣れてる人だと違和感を覚えるかも。。。

## 拡張性
unityやue5はゲームや3dCGに特化したゲームエンジンだが、godotは特にこれといった特化している部分はないです。

そのため、使い方によっては様々な種類のツールを作ることも出来るので、実際に既に様々なツールが開発されています。

## 描画システム
Openglを使用しています。

2dグラフィックには2dのシステムで描画しているため、unityと違い、3d空間上に板ポリを描画する擬似2dではないです。
そのため、このエンジンで作られた2dゲームはunityで作られたものより非常に軽いです。

# ゲームエンジンのインストール、できたゲームのビルド
## エンジン
godotのインストールはとても簡単で、[公式サイト](https://godotengine.org/download)からダウンロードしたzipを好きなところに解凍するだけで良いのです。。

過去のバージョンもGitHubのreleasesからダウンロード出来ます。

中身はふたつのファイルで、エンジン本体とログ出力用だと思われるコンソールアプリです。
サイズも非常に軽量で、非常に扱いやすいです。

## ゲームのビルド
godotでは、Android、IOS、windows、linux、MAC、UWP(Xbox)、HTML5向けにビルドすることが出来ます。
[参考:プロジェクトのエクスポート](https://docs.godotengine.org/ja/4.x/tutorials/export/exporting_projects.html)

# 終わりに
godotは無料とは思えないほど高機能で素晴らしいゲームエンジンです。公式ドキュメントもサポートも充実しているので、使ってみてはいかがでしょうか。
今後私もgodotに関する記事をupしていこうと思うので、もし良ければフォローお願いします。
『いのちだいじに』〜 Bing連携機能復活記念 〜

![DALL·E 2023-10-07 14.44.37 - 横長のシンプルなドローイングで、成人式のステージでスピーチをしている若者のプロフィール。彼の言葉に耳を傾ける聴衆のシルエットが背景に描かれて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/4c154b96-db7a-5cb2-362a-62afb96def74.png)

# お題 『いのちだいじに』

何をいきなり唐突に！と思われたかもしれませんが、ChatGPTにおける「Bing連携機能復活」 を祝って何か記事を書きたいなと思い巡らせている際に出会ったYouTube動画がお題の元ネタです。

:::note
当記事は、2023年9月4日にYouTube動画として公開された[『石丸市長からのメッセージ【安芸高田市】』](https://youtu.be/rH8AqJFBQ8g?si=trAEIOdRFeXmHh1u
)にインスパイアーされ、作成されました。
:::

https://youtu.be/rH8AqJFBQ8g?si=trAEIOdRFeXmHh1u

# はじめに

ChatGPT Plusで**Bing連携機能**が復活しました。先日、ChatGPTのLLMが2022年1月までの内容を学習しているという発表がありましたが、Bing連携機能で最新の情報を取り込んだ回答を作成してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/f890f531-b36f-b7a2-84d0-8d5656693f9c.png)

当記事のお題『いのちをだいじに』は、安芸高田市の石丸市長が成人式の記念行事で述べられた祝辞に含まれています。このお題を使って、ChatGPTに質問してみます。

# Bing連携機能を使わない場合

最初に、Bing連携機能を使わない場合の結果を見ていただきます。

プロンプト: **『石丸市長が「いのちだいじに」を引用したメッセージを発信しました。どのような内容なのか、詳しく教えてください』**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/1e21d69e-4f0c-cd80-c398-ca7ff2936bae.png)

2023年9月4日に公開されたYouTube動画の内容ですので、LLMには含まれていなかったようです。はい、予想通りですね。

# Bing連携機能を使うと

プロンプト: **『石丸市長が「いのちだいじに」を引用したメッセージを発信しました。どのような内容なのか、詳しく教えてください』** (上と同じ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/01970e38-d8f8-0140-2856-113c9e839f2a.png)
**閲覧完了**とあるように、情報が見つかり、しっかりと回答してくれました。

ChatGPT出力結果の共有リンクを共有しておきます。

https://chat.openai.com/share/8f68a3a5-a4cc-4cc2-8070-e11d64d868ca

# おわりに

**Bing連携機能復活**:bangbang:おめでとうございます。やっぱり便利です。

# 参考

https://youtu.be/rH8AqJFBQ8g?si=trAEIOdRFeXmHh1u
セットしたディスクは、このコンピュータで読み取れないディスクでした。(mac, sdカード)

2023/10/07

m1 macbook airを用いてsdカードにubuntu22.04　desktopを焼こうとした。
その際に発生したこと、解決できた方法をメモしておく。


最初のエラー
64GBのsdカードを差し込むと"セットしたディスクは、このコンピュータで読み取れないディスクでした。"というポップアップが現れた。

はじめは、ディスクユーティリティ上でmass storage deviceが表示されていたので、問題ないだろうと思い"無視"を選択してそのままRasberry Pi Imagerで焼こうとしたが、エラーを吐かれて焼けなかったのでちゃんと調べることにした。(ディスクユーティリティ上で見えていても関係ないということをここで知った)


ディスクユーティリティの右上にある"情報"からsdカードの情報をみると、書き込みが不可となっていたのでここを直さないといけないんだろうなという目星をつけた。

まずタイトルにもあるポップアップのエラーの原因についてはこちらの記事が参考になった。
https://www.fabshop.jp/raspberrypisdxc/

sdカードの容量によってフォーマットの形式が異なっており、64GBだとexFATという形式。
Rasberry Piを起動させるにはFAT32という形式を使う必要があり、2~32GBの容量だとデフォルトがこの形式になっている。

今回は64GBのsdカードを使用しているので、何らかの方法でexFAT->FAT32に変更する必要がある。


解決方法については、こちらの記事の"対処3:ターミナルからコマンドを使ってフォーマットする"が参考になった。
ただし、コピペだとエラーが出てしまったので、一部変更する必要があった。
https://itojisan.xyz/trouble/7979/


以下を同じターミナル内で実行していくとFAT32でフォーマットができた。

デバイス名を検索
```
diskutil list
```
デバイス名は/dev/disk4みたいなやつ。
/dev/disk4s1みたいなものも表示されたがそれではないっぽい。

アンマウント(取り外し？)する
```
diskutil unMountDisk （デバイス名）
```

フォーマット
```
sudo diskutil eraseDisk FAT32 SDCARD MBRFormat （デバイス名）
```
元記事では"SDCard"にしているが、"SDCARD"とする。
なぜならば、"SDCard does not appear to be a valid volume name for its file system"というエラーを吐かれてしまったため。

こちらの質問が参考になった。
https://stackoverflow.com/questions/61266499/mbrformat-does-not-appear-to-be-a-valid-volume-name-for-its-file-system

SDカードにつける名前はuppercase、つまり全て大文字で書かないといけない。



これでフォーマットができた。

そして無事Raspberry Pi Imager(v1.7.5)でubuntu22.04 desktopをsdカードに書き込みできた。



最後に、試したがうまくいかなかった方法も載せておく。


ディスクユーティリティの右上にある"消去"から、フォーマット:MS-DOS(FAT)・方法:GUIDパーティションマップを選択してフォーマットを行なったが書き込み不可のままだった。


参考文献
・https://www.fabshop.jp/raspberrypisdxc/
・https://itojisan.xyz/trouble/7979/
・https://stackoverflow.com/questions/61266499/mbrformat-does-not-appear-to-be-a-valid-volume-name-for-its-file-system
AWSで、Terraformを利用する方法をまとめてみた(7/10)

Terraformでgit-secretsを使用する
--
__セキュリティを高めることができる。__
git-secretsは、gitリポジトリ内の機密情報を検出するためのツールで、AWSのアクセスキーやシークレットアクセスキーなどの機密情報がコードに含まれている場合に検出することができます。git-secretsは、Gitリポジトリ内のコミットやプッシュに含まれる機密情報（APIキー、パスワード、AWSアクセスキーなど）を検出し、リポジトリからの __誤公開を防止__ します。

Terraformでは、AWSのアクセスキーやシークレットアクセスキーを含むtfファイルを作成することがあります。これらのファイルがリポジトリに残っていると、不正なアクセスにつながる可能性があるため、git-secretsを使用することで、このような __機密情報を検出__ することができます。

さらに、Terraformでは、モジュールを使用してコードを再利用することができます。git-secretsを使用することで、__再利用されたコードにも機密情報が含まれていないかどうかを検出__ することができます。これにより、コードの再利用に伴うセキュリティリスクを軽減することができます。

git-secretsをするメリット(詳細)
--
__1.	リポジトリ内の機密情報の漏洩を防止することができます。__
機密情報を含むコミットやプッシュを不用意に公開することがなくなります。

__2.	git-secretsは、GitHubやGitLabなどのサービスと統合することができます。__
コミットやプッシュ時に自動的に検出することができます。

__3.	git-secretsは、チーム全体で一貫したセキュリティポリシーを実装するための便利なツールです。__
プロジェクトに参加するすべての人が同じルールに従って機密情報を保護することができます。

__4.	git-secretsは、機密情報を検出するために正規表現を使用するため、新しい機密情報を検出するために簡単にカスタマイズできます。__
チームが使用する独自の機密情報を検出することができます。


git-secretsインストール、設定、動作確認
--

__1.	PowerShellを管理者として開き、以下のコマンドを実行して、スクリプトの実行許可を設定します。__
~~~
Set-ExecutionPolicy RemoteSigned 
~~~

__2.	git-secretsのGitHubリポジトリをクローンします。__
~~~
git clone https://github.com/awslabs/git-secrets.git 
~~~

__3.	git-secretsのディレクトリに移動します。__
~~~
cd ./git-secrets 
~~~

__4.	git-secretsをインストールします。__
~~~
./install.ps1 
~~~
【install.ps1 の中身】
git secrets --register-aws --global
git secrets --install $env:userprofile/.git-templates/git-secrets -f
git config --global init.templatedir $env:userprofile/.git-templates/git-secrets

__5.	git-secretsを初期化します。__
~~~
git secrets --register-aws --global 
~~~

__6.	git-secretsを有効にするために、gitのテンプレートディレクトリを設定します。__
~~~
git config --global init.templatedir $env:userprofile/.git-templates/git-secrets 
~~~

__7.	テスト用のディレクトリを作成し、gitを初期化します。__
~~~
mkdir test-dir
cd test-dir
git init 
~~~

__8.	テスト用のファイルを作成し、git addとgit commitを実行します。__
~~~
echo "secret" > secret-file.txt git add . git commit -m "test" 
~~~

__9.	git secretsを使用して、秘密情報を含むファイルがコミットされないように確認します。__
~~~
git secrets --scan 
~~~

これで、git-secretsのインストール、設定、動作確認が完了しました。

AWSで、Terraformを利用する方法をまとめてみた(1/10)
https://qiita.com/kimuni-i/items/ffde2f8df96fe5d9513f
AWSで、Terraformを利用する方法をまとめてみた(2/10)
https://qiita.com/kimuni-i/items/6298ed10adc6ad450488
AWSで、Terraformを利用する方法をまとめてみた(3/10)
https://qiita.com/kimuni-i/items/4d2f90506eb2dd4ee702
AWSで、Terraformを利用する方法をまとめてみた(4/10)
https://qiita.com/kimuni-i/items/b97089a820cc06ed2d9c
AWSで、Terraformを利用する方法をまとめてみた(5/10)
https://qiita.com/kimuni-i/items/11efb60b9a731d212211
AWSで、Terraformを利用する方法をまとめてみた(6/10)
https://qiita.com/kimuni-i/items/943daf8f4e80af12b70e
AWSで、Terraformを利用する方法をまとめてみた(8/10)
https://qiita.com/kimuni-i/items/2934372c385ba0561425
AWSで、Terraformを利用する方法をまとめてみた(9/10)
https://qiita.com/kimuni-i/items/edbdc88f0bca9c0354d2
【ChatGPT無】知っているアニメ作品を教えて。


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

　今回は、ChatGPTさんに、知っているアニメ作品を聞いてみました。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

***
***User***
日本の過去のアニメは、何を知っていますか？
箇条書き（説明不要）でお願いします。
知っている分だけ出力してください。推測はいりません。

***ChatGPT***

もちろんです。以下は日本の過去のアニメに関するいくつかのタイトルです：

1. ドラゴンボール
2. ドラゴンボールZ
3. ドラえもん
4. サザエさん
5. 千と千尋の神隠し
6. トトロ
7. カウボーイビバップ
8. ネオンジェネシスエヴァンゲリオン
9. ワンピース
10. 名探偵コナン
11. ガンダムシリーズ（機動戦士ガンダム、ガンダムW、など）
12. スラムダンク
13. うる星やつら
14. 北斗の拳
15. 聖闘士星矢
16. 魔法少女まどか☆マギカ
17. ジブリ作品（風の谷のナウシカ、もののけ姫、など）
18. ルパン三世
19. キン肉マン
20. 魔法少女リリカルなのは

これは一部の有名なアニメのリストです。他にも多くの素晴らしいアニメがあります。

***User***
ジブリ作品を教えてください。
箇条書き（説明不要）でお願いします。事実のみをお願いします。

***ChatGPT***
もちろん、ジブリ作品のいくつかです：

1. 風の谷のナウシカ
2. 天空の城ラピュタ
3. となりのトトロ
4. 魔女の宅急便
5. 火垂るの墓
6. ともだち
7. 耳をすませば
8. 平成狸合戦ぽんぽこ
9. 魔女の宅急便
10. 紅の豚
11. もののけ姫
12. ホーホケキョ となりの山田くん
13. 千と千尋の神隠し
14. 猫の恩返し
15. ゲド戦記
16. 崖の上のポニョ
17. 借りぐらしのアリエッティ
18. コクリコ坂から
19. 風立ちぬ
20. かぐや姫の物語

これは一部のスタジオジブリの作品のリストです。ジブリは多くの優れたアニメーション映画を制作しています。

***User***
あなたが、この中で、一番知っている作品は、なんですか？

***ChatGPT***
私はこれらの作品について一般的な知識を持っていますが、特定の作品を個人的に知っているわけではありません。知識がテキストベースであり、個別の体験や感情を持たないため、どの作品も同じくらいの知識を持っています。どの作品について質問があれば、お答えできるかもしれませんが、感情や好みを持っているわけではありませんので、客観的な情報を提供します。
***
　むっ。

　そんなことを言って、
　　いいと思っているのかな？
***
***User***
では、ぽんぽこについて教えてください。
事実だけを述べてください。

***ChatGPT***
「平成狸合戦ぽんぽこ」は、スタジオジブリが制作したアニメーション映画です。以下は「ぽんぽこ」に関する事実です：

- 制作年: 1994年
- 監督: 高畑勲
- あらすじ: 昭和30年代の田舎町を舞台に、タヌキとキツネの化け物たちが人間たちとの共存を描いたファンタジーアニメーションです。
- 原作: 萩尾望都による漫画を原作としています。
- 特徴: ジブリの作品らしい美しいアニメーションと、日本の伝承や自然環境をテーマにしたストーリーが特徴です。

これらは「平成狸合戦ぽんぽこ」に関する基本的な事実です。
***
　あらすじが違ってるよw
　　キツネは出てくるけど、
　　　タヌキが化けたキツネだし。

　原作も、宮崎駿だし。
***
***User***
あらすじが違うようですが？

***ChatGPT***
申し訳ありません、情報に誤りがありました。以下は正しい「平成狸合戦ぽんぽこ」のあらすじです：

「平成狸合戦ぽんぽこ」は、スタジオジブリが制作したアニメーション映画で、1994年に公開されました。この作品は、狸（たぬき）たちが都市部の土地を巡って戦う姿を描いています。狸たちは自然界から追い出され、人間の住む場所に住むことを余儀なくされ、その土地を取り合う様子が物語の中心です。物語は狸たちの争いや友情、共感に焦点を当て、人間と自然との調和をテーマにしています。
***
　ふむ、
　　いいかな。
***
***User***
原作者も違うようですよ

***ChatGPT***
おっしゃる通り、情報に誤りがありました。正確な情報を提供するため、訂正いたします。

「平成狸合戦ぽんぽこ」の原作は、漫画家の宮崎駿（Hayao Miyazaki）によるものではありません。正確な原作者は、漫画家の三ツ矢千代子（Chiyoko Mitsuhashi）であり、彼女の漫画を元に映画が制作されました。申し訳ありません、前回の情報提供に誤りがありました。
***
　アホか！

***
***User***
それは事実ですか？

***ChatGPT***
申し訳ありません、前回の回答に誤りが含まれていました。実際の事実は次のとおりです：

「平成狸合戦ぽんぽこ」の原作は、漫画家の三ツ矢千代子（Chiyoko Mitsuhashi）によるものではありません。正確な原作者は、宮崎駿（Hayao Miyazaki）です。この作品は、宮崎駿が書いた漫画を原作としています。申し訳ありません、前回の情報提供に誤りがありました。
***
　よしよし。

　しかし、
　　漫画家の三ツ矢千代子とは
　　　どこの誰さん？
***
***User***
話題を変えます。
漫画家の三ツ矢千代子とはどんな人？
事実だけを述べてください。

***ChatGPT***
三ツ矢千代子（Chiyoko Mitsuhashi）は、日本の漫画家で、特に1970年代から1980年代にかけて活動しました。彼女の詳細な情報は限られており、あまり広く知られていない漫画家です。彼女の代表作や個人的な背景についての情報は一般的にはあまり知られていません。
***
　ウィキペディアも
　　ほかのサイトも
　　　引っ掛からないのだけど……

　今回は、ここまで。
LabVIEWからSlack Web APIでメッセージを送る

Slackの通知が便利なので，装置に張り付いていなくてもエラーに気づけるようにLabVIEWからSlackにメッセージを送るVIを作ってみた（SlackのWeb APIでメッセージを送信するのはこちらの記事[^1]を見ると難しくないようだったので）。

はじめに，Slackのページからアプリ開発のためのtokenを入手する。このページ[^2]から行うと，手っ取り早く作成できます。ありがたいことに無料です。

LabVIEWだと，
![post_slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1377901/0de03946-58f8-1782-20eb-e2bac9d6cbec.png)
こんな感じのコードでチャンネルにポストできるようです。

[^1]: [Slack APIでメッセージ送信](https://qiita.com/mizuki_takahashi/items/3f77c2e5b6142563ce66)
[^2]: [How to quickly get and use a Slack API token](https://api.slack.com/tutorials/tracks/getting-a-token)
LEDでカウントダウン

蟹さんのmruby on YABMで20秒ごとにThingSpeakにデータを投げています。実行時にLEDが点滅すようにしてあるのですが、確認のために見ていると何時実行されるか分からなくて不安になります。最長20秒待たされます。

他のLEDでカウントダウンのような表示をすることを考えました。

```ruby
#
# LED countdown test on BBR
#

def ledon yabm
  reg = yabm.gpiogetdat()
  yabm.gpiosetdat(reg & ~RLED)
end

def ledoff yabm
  reg = yabm.gpiogetdat()
  yabm.gpiosetdat(reg | RLED)
end

def blink yabm
  ledon yabm
  yabm.msleep 100
  ledoff yabm
end

yabm = YABM.new

# JTAG(GPIOA2,4,5,6) and LED_PORT3(GPIOB5) is GPIO
#yabm.gpiosetsel(0x06, 0x1ffffff, 0x600, 0x3fff)
yabm.gpiosetsel(0x300000, 0x300000, 0, 0)

RLED = (1 << 16)

interval = [5, 4, 3, 2, 2, 1, 1, 1]

reg = yabm.gpiogetdat()
ledoff yabm

str = "mruby on yet another bare metal"

loop do
  sum = 0
  interval.each do |n|
    yabm.msleep n * 1000 - 100
    blink yabm
    yabm.print "."
    sum += n
  end
  yabm.msleep 1000
  sum += 1
  yabm.print sum.to_s
# do something
end
```

ぼけーと、待つよりましかな。
.NET：SQLiteのサンプル

## 前書き
* 自分の勉強メモ


## 依存関係
* **System.Data.SQLite.Core**をインストール
NuGetでインストールする。作成者：**SQLite Development Team**
![SQLiteCore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537649/fdbf56ff-e76c-98be-d99d-822525d0e66f.png)


## ソースのサンプル

```c#:テーブル作成
public void CreateTable()
{
    using (var connection = new SQLiteConnection(@"Data Source=C:\aaa\DB-SQLite\test.db"));
    connection.Open();
    _ExecuteNonQuery(connection, "DROP TABLE IF EXISTS TMyTable");
    _ExecuteNonQuery(connection, "CREATE TABLE IF NOT EXISTS TMyTable (......)");
}

protected void _ExecuteNonQuery(SQLiteConnection conn, string sql)
{
    using var command = conn.CreateCommand();
    command.CommandText = sql;
    command.ExecuteNonQuery();
}
```

```c#:重複であれば、スキップ
protected const string _sqlInsertTable_Cust = @"
    INSERT OR IGNORE INTO {0} (Name, Num) VALUES ('{1}', '{2}')
";
```

```c#:遅いであれば、TRANSACTIONを使う
_ExecuteNonQuery(connWorkDB, "BEGIN TRANSACTION");
_ExecuteNonQuery(connWorkDB, "COMMIT TRANSACTION");
```

```C#:２つのDB連携してSQL実行
// mainDBを接続する。
using var connWorkDB = new SQLiteConnection(_ConnStringWork());
connWorkDB.Open();
_ExecuteNonQuery(connWorkDB, "BEGIN TRANSACTION");

// 別DBをAttachし、名称(SaveDB)を付ける
using (SQLiteCommand cmd = connWorkDB.CreateCommand()) {
    cmd.CommandText = @"ATTACH [Save.db] AS SaveDB;";
    cmd.ExecuteNonQuery();
}

// sql文では、SaveDB/mainで、DBを区別
using (SQLiteCommand cmd = connWorkDB.CreateCommand()) {
    cmd.CommandText = "SaveDB.TName, main.TName.....";
    cmd.ExecuteNonQuery();
}
_ExecuteNonQuery(connWorkDB, "COMMIT TRANSACTION");
connWorkDB.Close();

```




## DB内容確認
https://sqlitebrowser.org/

![SQLiteUI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537649/6cc1cabb-2b80-58f6-1ce4-ed7b17219db5.png)
JavaScript基礎学習③ダイアログボックスの表示＆条件分岐（if文）

学習した事のアウトプット、備忘録です。

- 参考書籍：確かな力が身につくJavaScript「超」入門


- ダイアログボックスの表示
windowオブジェクトを使用する。


- 確認ダイアログボックスの表示
※confirmメソッド：ダイアログボックスに表示された「OK」か「キャンセル」をクリックすると実行結果をtrueかfalseか返す。trueかfalseの両方を合わせてブーリアン値という。

```
window.confirm('表示させたい文章');
```

- ダイアログボックスにテキストフィールドを表示させる
```
window.prompt('表示させたい文章');
```

- if文

```
if(条件式) {
 条件式がtrueになる（成り立つ）時に実行する処理
} else {
 条件式がfalseになる（成り立たない）時に実行する処理
}
```
※falseの時に実行するものが何もなければ、else以降は省略できる。

更に条件式を追加するなら、
```
if(条件式) {
 条件式がtrueになる（成り立つ）時に実行する処理
} elsif(条件式) {
 一つ目の条件式が成り立たず、elsifの条件式がtrue（成り立つ）時に実行する処理
} else {
}
```


上記を応用して…

```
const answer = window.prompt(`ヘルプを見ますか？`)
if(answer === 'yes') {
  window.alert('右に進んでください。')
} else if(answer === 'no') {
  window.alert('終了します。');
} else {
  window.alert('yesかnoかでお答えください。');
}
```

プロンプトに入力された内容を定数answerに代入。
※「===」は比較演算子という。データ型を変換しないで左右を見比べる。
「==」だと、JavaScriptがデータ型を変換して左右を見比べる。


- 論理演算子

・複数の条件式が全てtrueになる場合
```
a && b
```

・複数の条件式が少なくとも一つがtrueになる場合
```
a || b
```

・条件式がtrueでない時
```
!a
```
個人開発者が節約しつつ生成 AI を堪能する

個人的開発をする差に、日頃利用している 生成AI サービスをもっと使いたいという欲求に駆られます。しかし、それらのツールを完全に活用するために必要なサービスやリソースをすべて契約または購入するとなると、それなりの費用がかかってしまいます。それが起こらないように、必要なリソースを最大限に活用しつつ、コストを最小限に抑える最適な環境を作り出したいと考えました。

### 生成 AI を活用したい主なシチュエーション

生成 AI を活用したい主なシチュエーションを以下に詳細に説明します。

1. **文章作成**: テキスト作成作業に生成 AI を利用することは、様々な場面で非常に役立ちます。例えば、公開するソフトウェアのレポジトリのREADMEファイルを書いたり、ブログ記事やレポートを執筆したり、企画案を綿密に整理したりする際などが考えられます。これらのタスクに生成 AI を活用することで、より効率的かつ時間を節約しながら、品質の高いテキストを作ることが可能となります。

2. **コード生成**: GitHub Copilotのようなサービスがコードの生成や提案をサポートしてくれるように、生成 AI の助けを借りることで、より迅速かつ効率的にコーディングを進めることが可能となります。

3. **壁打ち**: アイデアの共有や相談に生成 AI を活用することにも大いに可能性があります。新たなアイデアを他の人々と話し合うことで見えてくる視点や方向性は貴重ですが、常に他人を巻き込むことができるとは限りません。それならば、生成 AI を使ってこの問題を解決します。いつでも使うことができ、一人でもアイデアを育成し洗練することができます。

### 検討している環境案

これらのケースに対応するために検討している環境は以下の通りです。

1. **文章生成**: テキスト生成のための環境として考えているのは次の通りです。
   - **ChatGPTの無料版**: 基本的なテキスト生成作業のために活用。簡単な文章から骨子を作成する際に最適です。
   - **OpenAI API GPT-4 + OSSのChat UI**:より詳細で長い文章の生成や文書のブラッシュアップに対応するために、高度なテキスト生成機能とカスタマイズ可能な利用者インターフェースを組み合わせて利用します。

2. **コード生成**: コード生成のための環境として考えているのは次の通りです。
   - **AWS CodeWhisperer**: コードの生成をサポートするためのツール。コードのサジェストや生成を手助けします。
   - **ChatGPTの無料版**: コード生成作業のために活用。小規模なコーディングタスクに最適です。
   - **OpenAI API GPT-4 + OSSのChat UI**: 利用者インターフェースを通じてコード生成をサポート。具体的なプログラミング課題への対応を助けるコードスニペットを提供します。

3. **壁打ち活動**: アイデアの共有や相談のための環境として考えているのは次の通りです。
   - **ChatGPTの無料版**: 基本的な対話やアイデアの共有に使用。アイデアの醸成と洗練を手助けします。
   - **OpenAI API GPT-4 + OSSのChat UI**: 利用者インターフェースを通じて対話を行いながらアイデアを共有し、ブレインストーミングをサポートします。

### 活用方法の一例

基本的には、まずはChatGPTの無料版から作業中は利用を始めます。そこから、初期の骨子作成や基本的な生成タスクを行い、長い文章の生成や文章のブラッシュアップが必要となった場合に、OpenAI API GPT-4を含むより高度なツールを使用するといったイメージです。

### OSSのChat UIの活用

OSSのChat UIについては、その使いやすさと便利さから注目されています。Dockerがインストールされている環境であれば、OpenAI APIのAPIキーさえあれば、手軽に導入できます。詳細な情報やダウンロードリンクは、以下のGitHubのリンクからご覧になれます。

[Chat UI GitHubリンク](https://github.com/mckaywrigley/chatbot-ui)

### AWS CodeWhispererの活用

AWS CodeWhisperer は、AI を利用して、開発者の生産性を高めるサービスです。 開発者が書き始めたコードの続きを提案してくれたり、コードをスキャンし、より良いコードを提案してくれます。

具体的には、以下のことができます。

* コメントや既存のコードに基づいて、スニペットから完全な関数まで、さまざまなコードの提案をリアルタイムで生成します。
使い慣れていない API でも構築を加速できます。
* コードをスキャンし、脆弱性の検出を行ってくれます。

[AWS Code Whispererリンク](https://aws.amazon.com/jp/codewhisperer/)

### まとめ

AI生成を活用したい各ユースケースに対応する各種ツールや環境を検討してみました。個人開発で予算が潤沢な事はあまりないと思いますが、適切なシーンで適切なツールを活用することで高度な機能も使った分だけの課金となり大きな費用負担なく利用する事が出来ます。なお、勿論企業で利用する際にはセキュリティ周りももう少し検討し、自社に沿ったツールの選定をして下さい。
CodeIQ:ツリーの中にない数の解答

@nabetaniさん出題のCodeIQの問題です。こちらで言及されています。
->http://nabetani.hatenablog.com/
問題とテストケースはこちらのお世話になりました。解答もあります。
->https://blog.goo.ne.jp/r-de-r/e/a9b3836d742d14bbb99c40dd43c56fb4

ツリーに現れない数を直接求めたいと思いましたが、方法がわからず、
ツリーに現れる数字をすべて列挙して、そこにない最小の数を求めました。
速さが心配なのでまずJuliaで解いてみました。

メモ化が必要ですが、メモとして普通の配列を使うとオーバーフローしますので、
辞書でもオーバーフローするかと思い（計算量を求める習慣がありませんので）、
メモの配列要素数をdiv(f,32)+1 とし(fはルートの数、32の所は適当)、
メモに登録するときは(d,m)=divrem(x,32),memo[d+1]=memo[d+1] | 2^m
メモに数字があるかの確認は(d,m)=divrem(x,32)、memo[d+1] & 2^m == 0 or 1 
でおこないました。
最初のwhileの中で、配列（メモ）にないノードの子を計算して配列に加えています。
二つ目のwhileで、ある数が配列に含まれているか調べています。

後日辞書を使っても問題なく解けました。

```Julia
#ver 1.41,1.53,1.73

function solve(f,m,n)
    ret= 0
    d = 32
    v  = div(f,d) + 1
    t = [f]
    memo = zeros(Int,v)
    while t != []
        x = popfirst!(t)
        if x > 0
           (id,ir) = divrem(x,d)
           if memo[id+1] & 2^ir == 0
               memo[id+1] = memo[id+1] | 2^ir
               x1 = div(x,2) - m
               push!(t,x1)
               x2 = div(x*2,3) - n
               push!(t,x2)
           end
       end
    end
    c = 0
    while true
        c += 1
        (id,ir) = divrem(c,d)
        if memo[id+1] & 2^ir == 0
            ret = c
            break
        end
    end
    return ret
end

function f(f,m,n,a)
     r = solve(f,m,n)
     s =  r == a ? "pass " : "fail "
     println(s,r)
end

f(123, 4, 5, 9)
f(456, 5, 43, 1)
f(1414, 2, 135, 3)
f(2000000000, 992, 0, 31715)
f(2000000000, 2, 987, 30233)
f(2000000000, 953, 996, 19543)
f(128500249, 67, 151, 4462)
f(47736148, 133, 136, 2327)
f(21844316, 501, 56, 6295)
f(89128932, 320, 123, 3871)
f(293375679, 55, 161, 6868)
f(529943805, 130, 49, 1957)
f(1, 0, 0, 2)
f(1, 2, 3, 2)

```
Prologではメモ化に普通にFunctorを配列として使うとオーバーフローしますし、
Juliaで使った方法は再代入ができないので使えません。
リストに入れてmember/2では遅いし、辞書を使ってもたいして早くなりません。
ある数字が含まれているかどうか木を遡って計算してみましたが（当然）うまくいきません。
結局やむを得ずassertを使ったらそこそこの速さになりました。
solveが成功してもしなくてもその後にabolish/1をいれてflagを削除します。
他はJuliaと同様です。

```Prolog
%Swi-Prolog v 7.4.2,7.6.4
%start74.
%:-initialization(start74).  %ideone

find74(F,R):-atom_number(F0,F),(flag74(F0,1)->(F1 is F+1,find74(F1,R));R=F).

child(X,M,N,R):-X1 is X div 2 - M,X2 is X*2 div 3 - N,R=[X1,X2].

solve74(F,M,N,R):-
    solve74(M,N,[F]),find74(1,R),!. 
solve74(_,_,[]).
solve74(M,N,[X|T]):-
    atom_number(X0,X),((X<1;flag74(X0,1))->solve74(M,N,T);
    (assert(flag74(X0,1)),child(X,M,N,L),append(L,T,T1),solve74(M,N,T1))).

start74:-
    f74(F,X,Y,Q),assert(flag74('0',0)),(solve74(F,X,Y,R)->(R==Q->Str="good ";Str=" bad ");
    writeln(fail)),abolish(flag74/2),write(" "),write(Str),writeln(R),fail.
start74.

f74(123, 4, 5,9).
f74(456, 5, 43,1).
f74(1414, 2, 135,3).
f74(2000000000, 992, 0,31715).
f74(2000000000, 2, 987,30233).
f74(2000000000, 953, 996,19543).
f74(128500249, 67, 151,4462).
f74(47736148, 133, 136,2327).
f74(21844316, 501, 56,6295).
f74(89128932, 320, 123,3871).
f74(293375679, 55, 161,6868).
f74(529943805, 130, 49,1957).
f74(1, 0, 0,2).
f74(1, 2, 3,2).
%f74(3, 0, 0);
```
Javaで「格納されている文字列の並びを逆にする」の動作を確認してみた

# 概要

Javaで「格納されている文字列の並びを逆にする」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stringbuilder/index7.html

# 実装

以下のファイルを作成しました。
```JSample7_1.java
class JSample7_1{
  public static void main(String[] args){
    StringBuilder sb = new StringBuilder();

    sb.append("ABCDEFG");
    System.out.println(sb.toString());

    sb.reverse();
    System.out.println(sb.toString());

    sb.reverse();
    System.out.println(sb.toString());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample7_1.java 
$ java JSample7_1 
ABCDEFG
GFEDCBA
ABCDEFG
```

# まとめ

何かの役に立てばと。