OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Railsアップデート(Action Mailer/Active Storageの修正  他 2023-11-17)

## 引用元
https://world.hey.com/this.week.in.rails/action-mailer-bug-report-template-active-storage-fixes-and-more-6264430d

## 今週のトピック

### [word_wrapが空文字列を返すように修正](https://github.com/rails/rails/pull/50069)
[word_wrap](https://railsdoc.com/page/word_wrap)(指定された長さ以降の空白に改行を入れて出力するメソッド)が空の文字列を与えられたときに、nilの代わりに空の文字列を返すように修正された。

### [プレビュー処理時にバリアントを処理する](https://github.com/rails/rails/pull/50044)
[ActiveStorage::Preview#processed](https://api.rubyonrails.org/v7.0.8/classes/ActiveStorage/Preview.html)はプレビュー画像のみを処理し、バリアントまでは処理しなかった。 例えば、`thumb = attached_pdf.preview(:thumb).processed`は`thumb.url`が呼ばれるまでフルサイズのプレビュー画像のみを生成し、`:thumb`のバリアントは生成しなかった。

### [プレビュー可能ファイルを受け付けないTransformJobの修正](https://github.com/rails/rails/pull/50006)
[ActiveStorage::TransformJob](https://api.rubyonrails.org/v7.1/classes/ActiveStorage/TransformJob.html#method-i-perform)は、添付ファイルがpreprocessedオプションで定義済みのバリアントを持つときに使用される。画像ではなくpdfドキュメントのようなプレビュー可能なファイルをアップロードすると、`ActiveStorage::InvariableError`で落ちてしまう。今回の修正では、blobがプレビュー可能かどうかを判断することでこれを修正した。

### [Action Mailer バグ報告テンプレートの追加](https://github.com/rails/rails/pull/50004)
`ActionMailer::TestCase`インスタンスで失敗した問題を再現するために、Action Mailer のバグ報告テンプレートが導入された。
(こういうdocの整備、いいですね)

### [Cache::Store#writeの戻り値に一貫性を持たせる](https://github.com/rails/rails/pull/49873)
`Cache::Store#write`の戻り値は以前は指定されておらず、バックエンドによって異なっていた。このプルリクエストにより一貫性が保たれるようになった。
- true: 書き込み成功
- nil: キャッシュバックエンドとの通信エラー
- false: 別の理由での書き込みの失敗
キーがすでに存在する場合と、memcached（またはRedis）のエラーがあった場合を区別するのに役立つ。
マルチキャストの性質とユースケース

## マルチキャストとUDPユニキャスト
### 両者の違い
- UDPユニキャスト
    - 1対1の送信
    - サーバ1台，クライアント複数台という1対多の通信を行う場合，"**送信する総パケット数 x クライアント台数分**" のパケットを送信する必要があり，トラフィックとサーバのリソースを圧迫
    - 信頼性を確保するならTCPも利用可能
- マルチキャスト
    - 1対多の送信
    - 同じパケットを必要とするクライアント群に1パケットのみでデータを送信可能であるため，トラフィックとサーバのリソースを節約

## 一般的なマルチキャストプロトコル
- 基本的には，単純な同ネットワーク(LAN)環境でのマルチキャスト送信ではルーティングプロトコルは必要ない
- 明示的にマルチキャストルーティングを確立したい場合は以下のプロトコルを用いる

### PIM
- 基本的にIGMPとセットで使用
- ルータ間のルーティングを確立するために使用 
### IGMP
- クライアントのマルチキャストグループの参加/離脱を管理
- クライアントに隣接するルータにIGMPを通してマルチキャストパケットの受信希望を通知

## マルチキャストのユースケース
### メディア配信やVoIP
- インターネットテレビやIPを通したオンラインビデオ通話サービス
- 一つのサービスを複数のユーザが受信するサービスや各々の通信状況をメンバー全体で共有するビデオ通話などで使用可能

### オンラインゲーム
- 自分のプレイ状況をマルチキャストを通してユーザ全体に共有

### ストリーミングサービスでは一般的にマルチキャストは使用されていない
:::note info
ストリーミングサービスではマルチキャストを使用しない場合が多い．大抵の場合はHTTPを通したHLS(HTTP Live Streaming)を使用するため，HTTP通信，つまりTCP(ユニキャスト)を用いる
:::

## マルチキャストの課題
マルチキャストではセキュリティや**信頼性**に関する課題が存在する．
特に信頼性の高いマルチキャスト(Reliable Multicast: RM)は長い間議論されている．しかしながら再送機構をプロトコルレベルで行うRMが無いため一般的には使用されていない．
OpenAIのAssistants APIを使ってLINEスタンプ返却botを簡単に作れないかを検証

# はじめに

Adventカレンダー用に考えたネタです。openaiの機能を使って簡単にLINEスタンプ自動返却botを作成できないか検討してみた、という内容の記事です。

https://qiita.com/advent-calendar/2023/lineapi

# LINEスタンプについて

この機能については特に説明は不要かと思いますが、LINEbot（Messaging API）でスタンプを返したい場合は基本的には公式で提供されている以下のリストから適切なものを選ぶことになると思います。

https://developers.line.biz/ja/docs/messaging-api/sticker-list/#sticker-definitions

スタンプをメッセージとして送るためには`packageId`と`stickerId`が必要になります。今回はこの２つのプロパティ要素をopenaiの提供するgptが自動で判断してくれないかを検討しました。

# Assistants APIとは

Assistants APIは名前の通り、AIアシスタントを手軽に作成できるAPIです。2023/11/20時点ではPythonとNode.jsのパッケージが公式でサポートされているみたいです。

https://platform.openai.com/docs/assistants/overview

# ナレッジベースの読み込み

まずはGPT側に必要なスタンプの情報を読み込ませたいと思います。このナレッジベースの構築に関しては先例があります。

https://qiita.com/bizposan/items/082b49e2165987108516

今回はもっと簡単に、Retrieval機能を使ってナレッジベースを構築できないかを考えてみました。

https://note.com/npaka/n/n1e4e8720b1ac

上記の例のように**ファイルをアップロードするだけ**でGPT側が勝手に必要情報を拾ってきてくれるみたいなので、そのファイルを作成してみました。
今回やってみたことはかなりシンプルで、先ほどのLINEスタンプのリストの公式ページを丸々スクリーンショット保存したものを使いました。

![スクリーンショット 2023-11-20 16.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/31362964-0f29-afa6-d3e0-35eaa78d80fa.png)

# モデル構築

先ほどのブログのように、Playgroundを使えば手軽にAssistants APIを試すことができるのでそれを使います。

https://platform.openai.com/playground

モデルは`gpt-4-1106-preview`を使って、toolsはRetrievalを有効化して今回用意したスタンプリストのページのスクリーンショットをアップロードしました。
ちなみにInstruction（GPTに与える事前設定のようなもの）は以下のようにしました。

```
## 命令

ナレッジベースを元に、入力されたメッセージに対して適した内容のLINEスタンプのIDを返答してください

## 出力形式

{
  "packageId":  {id here},
  "stickerId": {id here}
}
```

# 結果

まずはちゃんとナレッジベースを読み込んだ上での返答をしてくれるかどうかの検証からです。

![スクリーンショット 2023-11-20 17.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/877c8197-a55b-b959-ebf0-4bb6167682fe.png)

とりあえず期待した形式での回答をしてくれたので一安心です。ちなみにこのIDに対応するスタンプは、これです。

![スクリーンショット 2023-11-20 17.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/f6195ec9-cc65-7048-50b3-d18269cb4b05.png)

ちゃんと存在するスタンプ情報が返ってきました！他の回答も試してみましょう。

![スクリーンショット 2023-11-20 17.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/9b3cf5bc-1e29-4e0a-b4ae-0224e5752471.png)

存在しないIDが返ってきました。うまくいかない場合もあるようです。。。他の内容も試してみましょう。

![スクリーンショット 2023-11-20 17.09.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/6e449890-7ff9-2f08-29fd-9b5e7365c727.png)

存在するIDではあるのですが、よくよくみてみると「こんにちは」と同じ返答内容のようです。。。

# さいごに

今回記事にする内容を思いついてQiitaを書き出すまでに1時間ほどしかたっていないので、Assistants APIを使えば本当に簡単に自分専用のAIアシスタントが作れることを実感しました。
ただし性能については何とも言えないのが現状なので、もう少しナレッジベースかInstructionsの調整が必要そうですね。
lnコマンドのnオプションについて

# はじめに
lnコマンドのnオプションについての備忘録。

# lnコマンドとは
lnコマンドはLinuxにおいてリンクを張るためのコマンドです。リンクを用いることでファイルやディレクトリに対して別名を付けることができるようになります。

イメージとしてはWindowsにおけるショートカットやMac OSにおけるエイリアスに近いものになります。

リンクにはハードリンクとシンボリックリンクがあります。sオプションを付与するとシンボリックリンクになります。

ハードリンクの使用は限定的です。本記事でもシンボリックリンクを前提に進めていきます。違いについては言及しないので別記事をご参考ください。


# nオプションについて
lnにはさまざまなオプションがあるのですが、その中でnオプションについて実例を交えて説明します。
まず、ヘルプを見ると

>        -n, --no-dereference
>              treat LINK_NAME as a normal file if it is a symbolic link to a directory

「指定したシンボリックリンク(LINK_NAME)が既にディレクトリを参照している場合、LINK_NAMEを通常のファイルとして扱う」と言っています。よくわかりません。

実際にコマンドを打って動作を確かめてみます。
```
$ mkdir dir1
$ ln -s dir1/ link1
```
カレントディレクトリにディレクトリ `dir1`、シンボリックリンク `link1` があり、`link1` が `dir1` を参照しているような状況です。
lnコマンドの記法はさまざまあるのですが、
```
ln -s <TARGET> <DIRECTORY>
```
とすると通常 `TARGET` に対するシンボリックリンクが `DIRECTORY` の配下に生成されます。
例えば
```
$ ln -s /etc/os-release link1
$ ls link1
```
とすると、`link1` ( `dir1` )の中に `os-release` という名前のシンボリックリンクが生成されているのが確認できると思います。

一方、nオプションを付けるとどうなるか。
```
$ ln -snf /etc/os-release link1
$ cat link1 
```
とすると、`os-release` の中身が確認できたと思います。つまり、`link1` はもはやディレクトリ `dir1` を参照しておらず、ファイル `/etc/os-release` を参照しています。

これが、LINK_NAMEがもともとディレクトリを参照していても通常のファイルとして扱う、という動作の結果になります。

ちなみに、fオプションは既に存在するリンクを一旦強制的に削除するというオプションで、これがないと失敗します。nオプションはfオプションとセットで利用することになりそうです。
Pythonで「四則演算に関する演算子」の動作を確認してみた

# 概要

Pythonで「四則演算に関する演算子」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/num/index2.html

# 実装

以下のファイルを作成しました。
```sample.py
print("5 + 7 = " + str(5 + 7))
print("4 * 8 = " + str(4 * 8))
print("15 / 2 = " + str(15 / 2))
print("15 // 2 = " + str(15 // 2))
print("15 % 2 = " + str(15 % 2))

print("5.2 + 7.485 = " + str(5.2 + 7.485))
print("8.21 * 3.5 = " + str(8.21 * 3.5))
print("15.78 / 2.4 = " + str(15.78 / 2.4))
print("15.78 // 2.4 = " + str(15.78 // 2.4))
print("15.78 % 2.4 = " + str(15.78 % 2.4))

print("5 + 7.485 = " + str(5 + 7.485))
print("8.21 * 5 = " + str(8.21 * 5))
print("18 / 4.2 = " + str(18 / 4.2))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
5 + 7 = 12
4 * 8 = 32
15 / 2 = 7.5
15 // 2 = 7
15 % 2 = 1
5.2 + 7.485 = 12.685
8.21 * 3.5 = 28.735000000000003
15.78 / 2.4 = 6.575
15.78 // 2.4 = 6.0
15.78 % 2.4 = 1.38
5 + 7.485 = 12.485
8.21 * 5 = 41.050000000000004
18 / 4.2 = 4.285714285714286
```

# まとめ

何かの役に立てばと。
LAMPスタックの基本ガイド

## はじめに
LAMPは、Linux、Apache、MySQL、PHP（またはPerl、Python）の頭文字を取ったもので、ウェブアプリケーションを構築するためのポピュラーな技術スタックです。この記事では、初学者向けにLAMPスタックの基本的な概念と各コンポーネントの役割について説明します。

## LAMPとは？
Linux (オペレーティング システム): LAMPの基盤となるOS。安定性とセキュリティが特徴です。

Apache (Webサーバー): ウェブサーバーとしての役割を果たし、クライアントからのリクエストを処理して静的および動的なコンテンツを提供します。

MySQL (データベース管理システム): データベースの作成、読み書き、更新、削除などのデータ管理を担当します。

PHP (スクリプト言語): 動的なウェブページを作成するためのスクリプト言語。データベースとの連携が得意。

## LAMPの特徴
#### オープンソース
LAMPコンポーネントはすべてオープンソースであり、無料で利用できます。これは特に初学者にとって負担のない環境を提供します。

#### 柔軟性
各コンポーネントは独立しており、他の代替コンポーネントと組み合わせることが可能。例えば、MySQLの代わりにPostgreSQLを使用することもできます。

#### 豊富なドキュメントとサポート
LAMPは長い間使われており、コミュニティが大きいため、解決策やドキュメントが豊富に
SphinxとGitHubの連携メモ

# 目的
Sphinxでドキュメントを書き、webで公開したい。ドキュメントは少しずつアップデートしていくため、その度にweb公開版を簡単にアップデートできるようにしておきたい。

そこで、ドキュメントをGitHubで公開するためのセッティングを行った。備忘録として記録しておく。

なお、GitHubのアカウントは既に取得しており、localマシンにはgitがインストールされているものとする。

# GitHubでrepositoryを新規作成

GitHubのアカウントページにて、repositoryの新規作成を行う。
repository名を決めなくてはいけない。ここではnoteとしておく。

このとき、Settings-->pagesを開き、
Branchの設定を main + /docs に変えておく。

READMEは一応つけておく（チェックボタンがあるはず）。

# localにrepositoryを作る
remoteからcloneすることで、localにrepositoryを作成する。
例えばGitHubのアカウント名がhogeであれば、

```
git clone https://github.com/hoge/note.git
```

とすると、現在いるディレクトリの下に note/ フォルダが作成される。

note/ フォルダに移り、docs/ フォルダを作成する。
docs/ フォルダに移り、.nojekyll という名の空ファイルを作成する。

note/ フォルダに戻り、
```
git add -A
git commit -m "初めてのコミット"
git push
```
とすると、localマシンの note/ フォルダの中身が remote に送られる。

# Sphinx側の設定
以下の設定をしておく必要がある。

make.bat を以下のように変更。

```
set BUILDDIR = ../docs #フォルダ_buildより変更

%SPHINXBUILD% -b %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% #オプション-Mより変更
```

# ドキュメント作成とアップロード
上記で環境は整った。

あとは、Sphinxドキュメントを更新するたびに
sources/ フォルダ内で
```
make html
```
としてドキュメント作成し、note/ フォルダ内で
```
git add -A
git commit -m "（更新内容の説明）"
git push
```
とすれば公開される。公開ドキュメントのリンクは
```
https://github.com/hoge/note/
```
となる。
Let's Encrypt を活用して Yellowfin にセキュアアクセス

## はじめに
[『セキュリティ要件に対応した Yellowfin コンテンツ埋め込みサイトの構築』](https://qiita.com/ExtremeCarvFJ/items/398c66a02c11daa5f85d)の記事で、Yellowfin 埋め込み画面に SSL 接続する環境の構築手順を紹介しました。SSL 接続するためには、言うまでもなく証明書と鍵が必須です。そこで、[Let’ Encrypt](https://letsencrypt.org/ja/) が発行する証明書と鍵を活用する方法を紹介しようと思います。Let's Encryptは、非営利団体の Internet Security Research Group (ISRG) が提供する自動化されたフリーでオープンな認証局です。

今回、Let’s Encrypt を利用する上で、ブラウザで動く Let’s Encrypt クライアント [『SSL なう!』]() を活用させていただきました。同クライアントを使って、Let’s Encrypt が発行するサーバー証明書、中間証明書、秘密鍵を取得します。

## 証明書と鍵の取得
おおよその手順は、[SSL なう! を開発された方の説明](https://qiita.com/tappie/items/76881fdf7996c57a105a)をご参照ください。
下記に、設定例を紹介します。

##### 1. Let's Encrypt へ登録
自身のメールアドレスを登録します。

##### 2. チャレンジトークンの取得
Web サーバーと Yellowfin サーバーのドメインをそれぞれ登録します。
例 : web.example.jp
例 : yellowfin.example.jp

##### 3. ドメイン名の所有確認
「dns-01」 タブで、“_acme-challenge.web.example.jp.” と ”_acme-challenge.yellowfin.example.jp.” に対する文字列が生成されるため、これら 2 行を DNS に TXT レコードとして登録します。DNS の登録権限を持っていない場合は、管理者に登録作業を依頼してください。
DNS の設定が反映されるのを待って、登録されていることを確認します。

##### 4. 証明書発行申請
「サーバーで使用する SSL 秘密鍵」 として RSA の鍵を生成します。生成した鍵は RSA.key という名称で保管します。

##### 5. 発行された証明書
サーバー証明書を cert.pem、中間証明書を chain.pem という名称で保管します。

###### 結果
ここまでの作業で、RSA.key、cert.pem、chain.pem の 3 ファイルが生成されました。

## Yellowfin と Web サーバーの設定
Yellowfin と Web サーバーの設定に関しては、[前回記事](https://qiita.com/ExtremeCarvFJ/items/398c66a02c11daa5f85d)を参照願います。その際、前回とはファイル名が異なっているため、以下の表を参考に、ファイル名を読み替えてください。

|役割|前回|今回|
|---|---|---|
|中間証明書|ca.crt|RSA.key|
|サーバー証明書|server.crt|cert.pem|
|秘密鍵|server.key|chain.pem|

## 最後に
これまで、デモや検証環境に SSL 接続を実装するためには自己証明書を使っていました。おかげで、サイトにアクセスする度に、ブラウザから警告が上がってました。あまり格好の良いものではありませんね。

しかし、Let’s Encrypt と SSL なう! のおかげで、自己証明書を使わない選択肢が増えてしまいました。もっと早く存在を知りたかったです。
ありがたや。

何はともあれ、皆様良いデータ分析を! See you then geeks! Cheers!!

## 参考情報

https://letsencrypt.org/

https://sslnow.cf/

https://qiita.com/tappie/items/76881fdf7996c57a105a
美國留學：追尋夢想的跨國之旅


隨著全球化的浪潮不斷增強，越來越多的學生決定前往美國攻讀大學學位，這個選擇不僅為他們提供了博大精深的學術知識，還開啟了一個多采多姿的跨國之旅。[美國留學](https://www.win-ed.com.tw/post/study-in-the-us)已經成為了一種趨勢，吸引著來自世界各地的學子。本文將探討美國留學的種種優勢，以及留學生在這個國家的經歷和成長。

第一個吸引學生前往美國的理由是卓越的教育資源。美國擁有世界上一流的大學和學院，提供了各種各樣的學科和專業，學生可以根據自己的興趣和職業目標選擇適合自己的課程。無論是工程、商業、藝術、醫學還是人文科學，美國都有頂尖的學府，為學生提供了優秀的教學資源和研究機會。

此外，美國的教育體系注重學生的全面發展。除了學術課程，學生還可以參加各種課外活動，如體育、藝術、社會服務等，這有助於培養他們的領導能力和社交技能。而且，美國的大學強調學生參與式學習，鼓勵他們參加實習和研究項目，這有助於將理論知識轉化為實際技能。

除了教育資源，美國還提供了豐富多彩的文化體驗。留學生有機會與來自不同國家和文化背景的人交流，這擴闊了他們的視野，增強了跨文化交流的能力。美國是一個多元化的國家，擁有豐富的文化遺產和多樣性的社會結構，留學生可以在這個國家體驗到各種不同的文化活動和節日。

此外，美國留學也為學生提供了實現夢想的機會。許多留學生將美國視為實現個人和職業目標的理想場所。無論是追求學術研究的夢想、創業的抱負還是藝術家的野心，美國都提供了充分的自由和機會，讓學生追求自己的夢想並實現它們。

然而，美國留學也面臨著一些挑戰。首先，高昂的留學費用是許多學生所擔憂的問題。美國的大學學費相對較高，加上生活費用和其他支出，使得留學成本成為一個重要的考慮因素。然而，許多大學提供獎學金和貸款選項，幫助學生減輕財務壓力。

此外，文化適應和語言障礙也可能是留學生面臨的挑戰。適應一個新的文化和語言環境可能需要一段時間，但這也是一個豐富的學習經驗。許多大學提供支持服務，幫助留學生適應新的環境，提高英語能力。

總的來說，美國留學是一個充滿機會和挑戰的跨國之旅。它不僅提供了優秀的教育資源和文化體驗，還為學生提供了實現夢想的機會。當然，留學生需要克服一些困難，如費用和文化適應，但這些挑戰也是成長和發展的機會。美國留學是一個豐富多彩的經歷，將為學生的未來帶來無限可能。
【React 初心者向け！】 Propsって結局なに！？



Reactはユーザーインターフェースを構築するためのJavaScriptライブラリです。
Reactを学ぶ上で重要な概念の一つが「Props」です。

Reactについて、詳細は以下で解説しているので、ご興味があれば見てみてください！

https://qiita.com/ri-oo/items/9ab1e6eb07f6bb248cbf

### Propsの特徴

Propsは、Reactコンポーネントにデータを渡す方法で、
親コンポーネントから子コンポーネントへ値を渡すために使用されます。
Propsは読み取り専用で、コンポーネント内で直接変更することはできません。

### propsで渡せる値
文字列、スタイル、イベントなど

### propsの使い方
親コンポーネントには、子コンポーネント呼び出し時に、子に渡したい値を設定する
子コンポーネントには、親から値をもらいたいところにpropsを定義する

### コードを使用した例

例えば、ユーザーの名前を表示するシンプルな`User`コンポーネントがあるとします。このコンポーネントは、親から`name`というPropを受け取り、それを表示します。

### コードを使用した例

```jsx
// 親コンポーネント
function App() {
  return <User name="山田太郎" />;
}

// 子コンポーネント
function User(props) {
  return <h1>こんにちは、{props.name}さん！</h1>;
}
```

この例では、`<User name="山田太郎" />`のように書くことで、`User`コンポーネントに`name`というPropを渡しています。そして、`User`コンポーネントでは、`props.name`でその値を参照しています。

### メリット

- コンポーネント間でデータを簡単に渡すことができる。
- コンポーネントの再利用性が高まる。
- 親からのデータフローが明確で、追跡しやすい。

### デメリット

- 多層にわたるコンポーネント間でのデータの受け渡しが複雑になることがある（Prop Drillingの問題）。
- 大規模なアプリケーションでは、状態管理ライブラリ（例：Redux）を検討することが推奨されます。

### まとめ

Props、Reactでコンポーネント間のコミュニケーションを容易にするための重要な概念です。しかし、大規模なアプリケーションではPropsだけに頼るのではなく、適切な状態管理戦略が必要になる場合があります。Propsの基本的な理解を深め、それをどのように使うかは、Reactを学ぶ上で非常に重要です。
wslでnerves その24

# 概要
wsl(wsl2じゃない)でnervesやってみる。
qemu(x86_64エミュレータ、ラズパイじゃない)でやってみた。
生成したnerves_livebook.imgを、qemuで起動して、Run in Livebookバッジを踏んでみた。

# 手順
# qemuを起動

# Run in Livebookバッジをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/60cb30fb-48bb-f3d1-ad65-1ae52dfd9d54.png)

livebook.devに、飛ぶ。

![run0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dddaee1d-649b-e21e-3b01-3ac6e6a04991.png)

アドレスに、http://localhostを入れる。
run livebookをクリック

![run1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/befa769c-a301-e6c7-1dcd-61b1c0b1e732.png)

パスワードを入れる。nerves
authenticateをクリック

![run2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9717b0a7-a2d2-6d67-1d60-d997ea70b4aa.png)

livebookが起動する。

以上。
Rails – トランザクションをネストするとロールバックが効かない

# 例


内側でロールバックを実行してもコミットされてしまうようだ

```rb
p Example.count

ApplicationRecord.transaction do
  ApplicationRecord.transaction do
    Example.create
  end

  raise ActiveRecord::Rollback
end

p Example.count # カウントが増えてしまう
```

単純なコードであれば気づくが、コードが入り組んでいる場合は注意

# 外側の制御で回避

外側のトランザクションで  `joinable: false` を指定すると、外側のトランザクションへの合流を防げるようだ

```rb
p Example.count

ApplicationRecord.transaction(joinable: false) do
  ApplicationRecord.transaction do

  Example.create


  raise ActiveRecord::Rollback
  end
end

p Example.count
```

# 回避 - 内側の制御

内側のトランザクションで `requires_new: true` を指定すると、外側との合流を防げるようだ

```rb
p Example.count

ApplicationRecord.transaction do
  ApplicationRecord.transaction(requires_new: true) do

  Example.create


  raise ActiveRecord::Rollback
  end
end

p Example.count
```

# 参考

[ActiveRecord - ネストしたトランザクションの落とし穴 #Rails](https://qiita.com/jnchito/items/930575c18679a5dbe1a0)


[Railsにおけるネストしたtransactionの挙動](https://zenn.dev/merda/articles/cbe2fdfd97ee75)



# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
MacターミナルでApplicationsの中身がない時ってなった初心者はこの記事みよう

## 課題
Macのターミナルで`cd`コマンドでディレクトリ間を移動して、`Applications`ディレクトリに入る。`ls`コマンドを実行するとMAMPなどのアプリケーションが見当たらない。

## 対策
```
cd /Applications/MAMP
```
Applicationsの前に/を付ける。

## おわり
お恥ずかしい内容だが、自戒をこめて。
小さなスタートアップで早めにslack を立ち上げるべき理由

以下の記事は、これらのサービスについて利用していない人を多く含む組織で、小さな会社の社内用にシステムを立ち上げるための作業を書く。
qiitaを使っているようなソフトウエアエンジニアの多い会社では、何を今更という内容にすぎないだろう。
この文章はそうでない小さな会社の中の人に向けて書く。
- 間違えていたら修正したいので、ご指摘を歓迎します。
- もっと良い記事があると思うので、判明したらリンクを追記します。

## 小さなスタートアップで早めにslack を立ち上げるべき理由
- 各人の考えていることはまちまち。バックグラウンドもまちまち。
	- 各人の考えていることがわかるようにすることが大事。
	- 他のメンバーから教わった内容をメモする。
- 遅すぎる整理された分析よりも、稚拙でも早い分析の積み重ね
	- 十分に整理された非の打ち所のない状況に整理するのを待っている時間がもったいない。
	- 不十分な内容なりに共有していくことで、お互いの考えていることがわかるようになっていく。
- 人数が少なく直接話をするのがslackよりも効果的ではある。
	- しかし、やり取りした内容の記録が残らないでの、本人でさえ忘れてしまう。
	- せっかくの対面での議論の要点をslack に残す。
- 成功するためのビジネスプランを立てて、成功できるように物事を単純化していくことが大事
	- よくない課題設定は、ビジネスを失敗させる。


## slack の組織への導入
- slackのありがたみ
- mailを使う場合に発生する以下の欠点をslackは回避できる。
### mail の欠点１：ローカルディスクの圧迫 
- メールの送信記録・受信記録をローカルPCに保存してしまうので、ローカルPCのディスクを圧迫してしまう。
- slackの場合：　クラウドサービスなので、ローカルPCのディクスにデータを保存しない。
### mailの欠点２：情報の共有範囲問題
- メールの場合： ついCCの送付先が生じてしまう。
- 入社前の過去のやりとりなど：全員向けのメールであっても知りようがない。
- slackの場合：
    - 特定のチャネルの範囲の閲覧権限者は、だれでも見れる。
    - チャネル内での特定の人への依頼内容は@{メンバーの名前} でメンションをすることができる。
    - 新規に加わった人も過去のchanelの内容が読めるので、過去の経緯を知ることができる。
    - ある人が、異なるPCからそれぞれ、アクセスしても問題を生じない。データは常にクラウド上にある。
- 将来の引き継ぎという視点で見たとき：
    - mail：　担当者がいなくなった時点で、そのメールはだれもアクセスできなくなる。
    - slack: 担当者がいなくなっても、slackでの投稿は残る。そのため、担当者がどのような問い合わせを受け、どのような対応をしたのか、チームとして継承できる。

### mailの欠点３：ささいなメモを共有するには向かない
- slack の場合: メンションをつけていない限りにおいては、そのチャネルに興味がある人が、適宜読み飛ばしてくれればいい。
- そのため、ささいなメモを書いていくこともできる。
### mailの欠点４：そのやりとりがどういう分類になっているかを共有できない。

- mail の場合、自分の作ったルールで受信メールを自動分類・手動分類することはできる。
しかし、分類方法は部署で共有されることはない。あのやり取りは、いつだれとして、どこに保存したのかなど、把握が大変になってくる。
さらには、同じ目的の書類を何度も改訂していくと、どれが有効な版かがわからなくなっていくことと合わせて、厄介さを生み出す。
- slackの場合：
　どのチャネル、どのスレッドでのやり取りなのかは、どの参加者にとっても共通。（クラウドサービスだから。）
　そのため、「いつ、こういうやりとりをしたよね」という部分をたどるのがとても簡単。

### mailの欠点5：本当に同じファイルを見て議論している？　どっかで違ったのを見ていない？
関連していると、議論をしているときに、同じファイル名のファイルにアクセスしているからといって、本当に同じ内容のファイルを見ているかの保証がない。
ある人は、受信したメールの添付を編集して、同じファイル名で保存している**かもしれない**。
この「かもしれない」という可能性が残るだけで厄介さを生じてしまっている。

slackの場合：自分も相手も同一の状況にあることが確実なので、間違えて別の話とごっちゃになる心配がない。


## してはいけないこと
- 業務用のメールアドレス以外を登録すること。
- 社内においても、知るべき範囲が限られる内容を、メンバーの制限されていないチャネルで議論すること。

# [Slack を導入するための 7 つの手順](https://slack.com/intl/ja-jp/resources/slack-for-admins/launching-slack-while-remote)

slack 
[料金プラン：プロ 925円 一人あたり月額](https://app.slack.com/plans/T02J4E4009K?_gl=1%2A6l2u93%2A_gcl_au%2ANDAwNzM5MzM1LjE2OTg4ODgxODc.)

### slack導入のためのヒント
- slackには無料で始められるフリー版がある。
- [Slack を導入するための 7 つの手順](https://slack.com/intl/ja-jp/resources/slack-for-admins/launching-slack-while-remote)から「SLACKを始める」のボタンをたどって、
無料のワークスペースを作ろう。
そうして、使い勝手を試してみてもらおう。
- [自社導入の経験からSlack導入のアンチパターン]( https://qiita.com/comefigo/items/d9c1c4051b55b99c9509 )

## 同様なサービス
Microsoft Teams

## 参考にした外部記事

- [「中小企業はクラウドを導入すべき？」](https://cloud-ace.jp/column/detail299/)
- [50人規模の部門にSlackを導入してみた結果])(https://qiita.com/comefigo/items/8fbc4e34c07d141e328a
- [なぜSlackを導入するのか、メールとは何が違うのか、他の選択肢はないのか](https://qiita.com/will_meaning/items/21a88ec0b61435e8652f)
    - この説明がわかりやすかった。
[1日目] 学校の食堂をIT化させる話　どのようにIT化させるか

こんにちは、なりかくんと申します。
この記事はなりかくん Advent Calender 2023の1日目の記事です。

私の学校の食堂は、現在現金しか使えず一切IT化が進んでいません。そこで、私が学校の食堂をIT化するためのお話を何記事かに分けてお話していこうと思います。

:::note warn
この記事は、私が独自で書いているものであり学校公認の記事では無いです。学校を特定したりはくれぐれもしないようにお願いします。
:::


# 学校の食堂をIT化とは
まず最初に、今回のプロジェクトではどのようなIT化をするのかを簡単に紹介します。

## 混雑度状況を確認できるようにする
私の学校の食堂は、お昼の時間帯に非常に混雑します。そこでスマホやタブレットから食堂の混雑度をリアルタイムで確認できるようにすれば、少しでも空いた時間帯に食堂を訪れることが出来るのではないかと考えました。

その点から、スマホやタブレットから食堂内の混雑度をリアルタイムで確認するシステムがまず一つ目のIT化システムです。

## キャッシュレス決済に対応させる
これが一番やりたかったことで、現在私の学校の食堂は現金オンリーなのが現状です。もっと利便性を向上させるために食堂をキャッシュレス決済対応にさせようと考えました。

その点から、キャッシュレス決済システムが二つ目のIT化システムです。

## 弁当予約システム
私の学校では、3時限目までに食堂に行って弁当を予約することが出来ます。
遠い教室では、食堂までには7分程度かかります。3限目までにわざわざ食堂に行って紙に書いて予約するのは大変です。
そこで、スマホやタブレットから弁当をデジタルで予約することが出来れば便利だと考えました。

その点から、スマホやタブレットから弁当を事前に予約しておくシステムが三つ目のIT化システムです。

# これによりどのようなメリットがあるのか

では次にこのようなIT化により利用者・食堂側にはどのようなメリットがあるのかをシステムごとに説明していきます。
## 混雑度状況システム
### メリット
- 時間の調整
混雑度状況をリアルタイムに確認できることで、空いている時間に行くことが出来るので待ち時間を減らすことが出来る
- データ活用
混雑度のデータを分析して、メニューや人員を調査することが出来る

### デメリット
- コスト
混雑度を測定するための機器の導入と運用にコストがかかる
- 故障
機器が故障してしまった際に、メンテナンスを行う必要がある。

## キャッシュレス決済システム
### メリット
- 利便性向上
現金を持ち歩かなくても、スマホで決済することが出来る
- 安全性
現金の紛失や盗難のリスクを減らすことが出来る
- データ活用
キャッシュレス決済のデータを活用して、マーケティングやサービスの改善に役立てることが出来る

### デメリット
- コスト
キャッシュレス決済のための機器や決済時の手数料などのコストがかかる
- 故障
機器の故障やネットワーク障害などのためにメンテナンスを行う必要がある
- セキュリティ
個人情報や決済情報などのデータが不正アクセスや漏洩などからしっかり守る必要がある

## 弁当予約システム
### メリット
- 利便性
食堂に行かなくても予約することが出来るため、利便性を上げることが出来る。また利便性向上に伴って予約数を増やすこともできる
- 確実性
事前に弁当を予約しておくことで、売り切れの心配がなくなる。また、食堂側もどのぐらい弁当が必要かがわかる
- データ化
予約のデータをもとに、今後の食材の発注や調理の計画を立てることができ、ロスを減らすことにもつなげることが出来る

### デメリット
- コスト
システムのための機器にコストがかかる
- 故障時の対応
もし弁当予約システムが障害発生や故障した際に、別の予約形態を用意しておく必要がある

このようにメリットとデメリットがたくさんあります。これからこのデメリットを解決できるようにシステム改善も含めた記事を投稿していきます。

# 最後に
今回は、学校の食堂をIT化させる概要とメリット・デメリットをまとめました。
最後までお読みいただきありがとうございました。
Setting up Automated Release Workflow with GitHub Actions

A few years ago, I posted the [article about setting up Release with Travis CI](https://qiita.com/shooter/items/0297587c76625b92b835).

Now, Github Action more and more popular, I used the that on my new project, aim to same goal.

## github action config

```yml
name: new-release

on:
  workflow_dispatch:

  push:
    tags:
      - 'v*'

jobs:
  create-release:
    name: create release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18.x'
      - name: Install dependencies
        run: |
          node -v
          npm -v
          pnpm -v
          npm install -g yarn
          yarn -v
          yarn install
      - name: yarn build
        run: |
          yarn build
          ls -l ./dist
      - name: zip asset
        run: |
          mv ./dist x-wallet
          zip -q -r x-wallet.zip x-wallet # zip --junk-paths
          shasum -a 256 x-wallet.zip | tee x-wallet.asc
      - name: create release
        id: create_release
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body: |
            Changes in this Release:
          draft: false
          prerelease: false
      - name: upload release asset 1
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./x-wallet.zip
          asset_name: x-wallet.zip
          asset_content_type: application/zip
      - name: upload release asset 2
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./x-wallet.asc
          asset_name: x-wallet.asc
          asset_content_type: application/txt
```

---

Ref:

https://birtony.medium.com/setting-up-automated-release-workflow-with-github-actions-628dbca2446e
尋找幸福的4個方法：擺脫情緒勒索，找回內心平靜


幸福是每個人都渴望的目標，然而，有時生活中的種種壓力和情緒勒索可能讓我們感到困惑和迷失。這篇文章將介紹四個方法，幫助您找到[幸福](https://www.goodtv.tv/watch?episode=95853)，同時解脫[情緒勒索](https://www.goodtv.tv/watch?episode=66062)的束縛。

昨天一位律師朋友來找我做美甲。她是個聰明、自信的職業女性，但當她一進門時，我注意到她的表情有些沮喪。我問她發生了什麼事情，她深深吸了口氣，開始分享她最近面臨的挑戰。原來，她參與了一個重要的法律案件，而這個案件牽涉到通緝、妨害性自主和貪污等多個複雜的問題。她感到壓力重重，同時也擔心自己是否能勝任這個案件。我們開始討論這些問題，並在過程中，我們也談到了如何在生活中追求幸福。

瞭解情緒勒索
在我們深入探討尋找幸福的方法之前，讓我們先來談談情緒勒索。情緒勒索是一種控制他人行為的方式，通常是通過操控其情緒來達到目的。這種行為可能在個人關係中出現，也可能在工作環境中存在。我的律師朋友正是因為案件的壓力而感到情緒勒索的影響，這對她的幸福造成了威脅。

接受自己的情感
我建議我的朋友首先要接受自己的情感，不要對自己施加壓力。面對困難和挑戰時，我們經常會感到焦慮、恐懼或沮喪，這是正常的情感反應。重要的是要允許自己感受這些情感，而不是試圖壓抑它們。只有當我們接受自己的情感時，才能更好地處理它們。

尋找支持
在面對壓力和情緒勒索時，找到支持是非常重要的。與朋友、家人或專業人士分享您的感受和困難，可以幫助您獲得情感支持和建議。我的朋友決定與她的同事和家人分享她的煩惱，這讓她感到更加支持和理解。

學習應對策略
最後，我建議我的朋友學習一些應對壓力和情緒勒索的策略。這可以包括深呼吸、冥想、運動或尋求專業心理諮詢。通過這些方法，我們可以更好地管理情緒，保持內心平靜，並找到幸福。

在我們分享了這些方法後，我的朋友顯得更加放鬆和自信。她決定嘗試這些方法，並相信自己可以應對目前的挑戰。這個過程讓我們兩個都深刻地意識到，尋找幸福不僅僅是追求外在的成功和成就，更是建立健康的情感和心理狀態，以應對生活中的困難和壓力。

總之，要尋找幸福，我們需要瞭解情緒勒索的影響，接受自己的情感，尋找支持，並學習應對策略。幸福不是一個永遠不變的狀態，而是一個持續的努力和過程。當我們學會管理情緒，並建立健康的內在世界時，我們將更容易找到幸福，即使在困難的時刻也能保持內心平靜。讓我們一起追求幸福，同時擺脫情緒勒索的束縛，讓生活更加美好。
Cursorを日本語に設定する方法



Cursorをより使いやすくするために、インターフェースを日本語に設定することができます。

以下の手順で簡単に言語設定を日本語に変更することが可能です。

## 日本語設定の手順

1. **メニューバーから設定を開く**:
   - Cursorを開いたら、メニューバーから「View」を選択します。
   - その後、「Command Palette (Ctrl+Shift+P)」をクリックします

2. **言語設定の変更**:
   - コマンドパレットが開いたら、「Configure Display Language」を探して選択します
  ![スクリーンショット 2023-11-20 14.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/8d7e030b-a131-ada0-4aa9-3955a666d8eb.png)


3. **日本語を選択**:
   - 言語の選択肢の中から「日本語(ja)」を選びます

4. **Cursorの再起動**:
   - 言語を日本語に変更するためには、Cursorを再起動する必要があります。「日本語に切り替えるためにCursorを再起動するか？」という確認ウインドウが表示されるので、「Restart」をクリックして再起動します
wslでelixir その107

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
githubに、livebook、アップしたので、Run in Livebookバッジを量産してみた。

# Run in Livebookバッジ


- hello2.livemd
[![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fohisama%2Fohi_Livebook%2Fblob%2Fmain%2Fstage1%2Fhello2.livemd)

- map.livemd
[![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fohisama%2Fohi_Livebook%2Fblob%2Fmain%2Fstage1%2Fmap.livemd)

- qiita.livemd
[![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fohisama%2Fohi_Livebook%2Fblob%2Fmain%2Fstage1%2Fqiita.livemd)

- ronri.livemd
[![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fohisama%2Fohi_Livebook%2Fblob%2Fmain%2Fstage1%2Fronri.livemd)

- socket.livemd
[![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fohisama%2Fohi_Livebook%2Fblob%2Fmain%2Fstage1%2Fsocket.livemd)

- vega.livemd
[![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fohisama%2Fohi_Livebook%2Fblob%2Fmain%2Fstage1%2Fvega.livemd)

以上。
VS Codeよりも優れている「 Cursor 」の使い方


CursorはAIを活用したコードエディタです。
この記事では、Cursorの基本的な使い方を分かりやすく解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/c6c158df-6132-b711-ffd5-c44b2268849b.png)


## はじめに

CursorはVSCodeをベースにしたエディタで、AI技術を利用してプログラミングをサポートします。まずは、[Cursorの公式サイト](https://cursor.sh/)からソフトウェアをダウンロードし、インストールしてください。

https://cursor.sh/

## 基本操作

### AIチャットの起動

- `Ctrl + Shift + L`を押すと、エディタ内にAIチャットが表示されます。ここでコードに関する質問やアドバイスをAIに求めることができます。



### コード生成・編集

- 編集したいコードの部分を選択して、`Ctrl + K`を押します。
- チャットウィンドウに表示される入力ボックスに、どのようにコードを変更するかを入力します。
- `Ctrl + Enter`で編集内容を確定し、AIが提案するコード変更を適用します。

![スクリーンショット 2023-11-20 14.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/aa27204c-f72f-da83-0e01-df70374c1355.png)

↓　プロンプトを入力して実行

![スクリーンショット 2023-11-20 14.49.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/c7b7296c-2aba-535f-71a2-690839d807a7.png)


### 対話型デバッグ

- コード内にバグがある場合、その部分にカーソルを合わせて`Ctrl + Shift + L`を押します。
- AIチャットで問題の原因と解決策を尋ねます。
- AIが提案する解決策を参考にしてコードを修正します。

### ドキュメントの参照

- `@`記号を使って、特定のライブラリやフレームワークの情報をAIに問い合わせます。
- 例えば`@React`と入力すると、Reactに関する情報をAIが提供します。

## まとめ

Cursorは、AIを活用してコーディングをより簡単かつ効率的にするツールです。

初心者から経験豊富な開発者まで、幅広いユーザーに利用価値があります。
ぜひこの記事を参考に、Cursorの便利な機能を活用してみてください。
IPアドレスによるブラックリストで動的にアクセスを制御する(apache + mod_rewrite)

## apacheのconfigに追加
```
vi /etc/httpd/conf.d/ssl.conf
--------------------
RewriteEngine On
RewriteMap blacklist dbm:/path/to/blacklist.dbm
RewriteCond ${blacklist:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^ - [F]
--------------------
```

## ブラックリスト用テキストファイル
```
vi /path/to/blacklist.txt
--------------------
192.168.1.20 {登録日時等任意の文字列}
--------------------
```

## dbmファイルの作成
```
httxt2dbm -i /path/to/blacklist.txt -o /path/to/blacklist.dbm
```

## apache再起動
```
apachectl graceful
```

## dbmファイルを空にしたい場合
```
rm -f /path/to/blacklist.dbm* && httxt2dbm -i /path/to/blacklist.txt -o /path/to/blacklist.dbm
または
truncate /path/to/blacklist.dbm.* --size 0
```

※blacklist.txtが空の場合、blacklist.dbmファイルが存在していると更新されない。
RDB設計についてプライベートでチームメンバーに相談してみたお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

## 登場人物

### Jさん：
昨年で転職。在籍時は社内に新しい風を巻き起こし、その影響度は今でも意志を受け継ぐ者がいるほど。

### ちいかわトミカさん：
先輩で頼りになる方。疲れたらちいかわトミカで遊んでいる？よくダジャレを言う。得意なダジャレは「今日言う共有事項はないです」

### ミュートさん：
先輩で頼りになる方。zoomを繋いでいる際、高確率でミュートのまま話す。よくシステムを自作している。

# RDB設計について相談してみたお話

よくある話かどうかはさておき、有難いことにたまたまプライベートでメンバーに相談に載ってもらったお話です。設計内容はここではお見せできないので雰囲気だけ記載します。

私「このお題のとき皆さんならどういう設計にしますか？ 私はこうしてみました(ER図を添付する)」

Jさん「このテーブルを中間にしているのが気になりますね」

ミュートさん「他で使いまわしたいって感じかな？」

私「そうです！」

Jさん「ならこれも中間になりません？」

私「あ、理解しました。確かにそうですね」

Jさん「中間にするのって検索しやすくするためかなと思っているので、無理して作る必要があるのかなと思っています。普通にカラムとして持たせてもいいのかなーなんて」

私「データの正規化を考えて色々な中間テーブルを作っていました。大規模なデータを扱わない仮定ならほぼマスタにしてもいいんですかね」

Jさん「そういう考え(正規化)ならいいと思いますが、ほとんどの項目を中間にする必要がありそうです」

ミュートさん「自分はほとんどの項目をマスタにおいて、価格を中間テーブルかつメインとして利用しますね」

～後日～

ちいかわトミカさん「回答しようと思いながらLINE見てましたがゲームで忙しくて回答できませんでした…」

# おわりに
一部かつ文面のみでしたが、人によって設計の考え方があることを学びました。
このような問題をモブプロで勉強会の題材にしても良さそうだねという話にもなりました。
CRMAnalytics_出力コネクタ_ジョブ失敗時の確認方法

#目次
[こんな時どうする？](#こんな時どうする？)
[対応方法](#対応方法)

# こんな時どうする？

#### ジョブがなぜか失敗した。また警告が表示されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/c262d415-c709-b9e2-9ec8-c70027672e8f.png)

#### この画面で確認できればOKだけどだいたいわからん
データフローを管理_
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/92288e02-10e8-ac28-16d3-995e98185c40.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/8d5b7a24-8502-2cde-8238-9eda45c3a1aa.png)

# 対応方法
参考文献に詳細手順あり。こちらではメモのみ
ワークベンチで調査
https://workbench.developerforce.com/login.php

#### このジョブIDを用いる
APIバージョンの記載もある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/06c1e4cd-96f4-6bde-f8d3-6b57c3e4572c.png)

失敗の場合
````
/services/data/v00.0/jobs/ingest/jobid/failedResults/
````

成功の場合
````
/services/data/vXX.X/jobs/ingest/jobID/successfulResults/
````

# 参考文献
[失敗した Salesforce 出力コネクタの実行の調査](https://help.salesforce.com/s/articleView?id=sf.bi_integrate_troubleshoot_output_workbench.htm&language=ja&type=5)
SnowPro Core (COF-C02) 取ったどー！

たまたま取れちゃった。(759点)
## やった勉強
- udemy の解説講座受講
- udemy の模試問題の反復
- しらない部分のドキュメント読み
- 実際に機能を使ってみる
## わかったこと
#### 多かった問題
- 半構造化データについて多く問われた
- COPY INTO の使い方を細かく聞かれた(知らないオプション)
- コマンドの種類や使い方を多く問われた
##
SnowPro Advanced も日本語化されたらしいので次はそっちを目指していきたい。
CKA対策vol.3

CKA対策vol.3です。

バックナンバーはこちら

https://qiita.com/kisama2000/items/25ea779419ae95b61011

https://qiita.com/kisama2000/items/23dcee5a7bc2aec97e7d


## 設定ファイルに問題がある場合
- `kubectl cluster-info --kubeconfig=/path/to/the/file`というコマンドを打つと指定したkubeconfigファイルに基づいて選択されたクラスターの情報が出力される。あとはその内容を是正していく。

## 「すべてのノードのExternal IPのリストを表示します」を深堀する
`kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'`が何をしているのかを詳しく見る。

https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%A8%E9%96%B2%E8%A6%A7

- `.items[*]`
    - kubectlが返すJSONオブジェクトのitems配列を表す。
    - ワイルドカード`*`はその配列内の全ての要素を指す。`items[]`配下の全ての`.status.addresses[?(@.type=="ExternalIP")].address`が出力される。
- `[?(@.type=="ExternalIP")]`
    - フィルタ演算子`?`は条件に一致する要素だけを抜き出す。
    - 現在の要素(ちゃんとした呼び名がわからなかった)`@`は配列内の現在の要素を表す。
    - `type=="ExternalIP"`その中からtypeがExternalIPのものを抜き出す。
 

## TaintとTolerations
- `kubectl taint node <nodeName> <key>=<value>:<effect>`でnodeにtaintを付与する。
- Tolerationsはpodに付与する。spec.tolerationsに設定をする。`operator: "Exists"`の場合は、`value: "value1"`は不要。
```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "example-key"
  　value: "value1"
    operator: "Equal"
    effect: "NoSchedule"
```

https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
Node.jsでCSVをJSONに変換する【csvtojson】

[csvtojson](https://www.npmjs.com/package/csvtojson)というモジュールを使えばできるのだが、使い方について調べると古い情報が多かったり複雑なことをしていたりと、**CSVをJSONに変換する**というただそれだけのことの情報が見つからないので、備忘として残しておく。
# やり方
CSVファイルを読み込んでJSONの配列にするモジュールなので、あとはそれを好きに修正してファイル出力すれば良い。
## 環境
||version|
|---|---|
|[Node.js](https://nodejs.org/en)|20.9.0|
|[npm](https://docs.npmjs.com/cli/v10)|10.0.0|
|[csvtojson](https://www.npmjs.com/package/csvtojson)|2.0.10|
## コード（使用例）
```javascript
// モジュール読み込み
const fs = require('fs');
const csv = require('csvtojson');

/* CSVをJSONに変換する関数 */
const csv2json = async (inputCsvPath, outputJsonPath) => {
  // CSVを配列として読み込み
  const jsonArray = await csv().fromFile(inputCsvPath);
  // ここで配列を加工してもOK
  // console.log(jsonArray);

  // 配列をJSONに変換
  const jsonIndent = 2;
  const jsonStr = JSON.stringify(jsonArray, undefined, jsonIndent);

  // ファイルに出力
  fs.writeFileSync(outputJsonPath, jsonStr);
}

/* メイン処理 */

// パス定義
const targetCsvPath = './target.csv';
const targetJsonPath = './output.json';

// 実行
csv2json(targetCsvPath, targetJsonPath);
```
## 実行例
上記のコードを実行するとこんな感じ
### 元となるCSV
1行目はヘッダー
```csvs:target.csv
company,model
Apple,iPhone
BlackBerry,BlackBerry
Google,Pixel
kyocera,TORQUE
Samsung,Galaxy
SHARP,AQUOS
SONY,Xperia
Xiaomi,Redmi
```
### 出力JSON
CSVのヘッダーがJSONのkeyになる。
```json:output.json
[
  {
    "company": "Apple",
    "model": "iPhone"
  },
  {
    "company": "BlackBerry",
    "model": "BlackBerry"
  },
  {
    "company": "Google",
    "model": "Pixel"
  },
  {
    "company": "kyocera",
    "model": "TORQUE"
  },
  {
    "company": "Samsung",
    "model": "Galaxy"
  },
  {
    "company": "SHARP",
    "model": "AQUOS"
  },
  {
    "company": "SONY",
    "model": "Xperia"
  },
  {
    "company": "Xiaomi",
    "model": "Redmi"
  }
]
```
# おわりに
これからこのモジュールを使い始める方で同じ悩みを持っている方にこの記事が届きますように。
動的配列 Python3編

https://paiza.jp/works/mondai/data_structure/data_structure__array_boss

>N 個の要素からなる数列 A が与えられます。数列 A に対し、次の 3 つの操作を行うプログラムを作成してください。

>・ push_back x : A の末尾に x を追加する
・ pop_back : A の末尾を削除する
・ print : A を半角スペース区切りで1行に出力する


>例えば、入力例 1 において、数列 A は最初「1 2 3」です。最初の操作は「push_back 10」なので、末尾に 10 を追加して「1 2 3 10」となります。 2 つ目の操作は「push_back 12」なので、「1 2 3 10 12」となります。 3 つ目の操作は「print」なので「1 2 3 10 12」を出力します。 4 つ目の操作は「pop_back」なので末尾の「12」を削除して、「1 2 3 10」となります。最後の操作は「print」なので「1 2 3 10」を出力します。

というなかなかややこしい問題。

```py
N,Q = map(int,input().split())
A = [int(x) for x in input().split()]
for i in range(Q):
    query = list(map(int,input().split()))
    if query[0] == 1:
        del A[-1]
    elif query[0] == 2:
        print(*A)
    else:
        A.append(int(query[1]))
```
たとえば`queryが 0 10 じゃなくて　１とか２だったら
配列は作れるのかな？というのが問題だった。
結果的に作れてそのおかげで解決したのだけど、
最初多分作れないだろうとおもって他の解法探してたけど
なかなかうまくいかずで試しにやってみたらできた。

もっときれいにやるなら、query[0]を活かすやり方で

```py
for _ in range(Q):
    query = [int(x) for x in input().split()]
    if query[0] == 0:
        # push_back
        A.append(query[1])
    elif query[0] == 1:
        # pop_back
        A.pop()
    else:
        # print
        print(" ".join(map(str, A)))
```
まあ普通に大ヒントがあるので素直に`pop()`使えばよかったのだけど。
（使い方がよくわかってなかった）
あと、2のときの`print`も`print(*A)`の代わりのやつ。
join()は文字列しか使えないので、mapで配列をstr()にしてから使っています。


久しぶりに詰まっててしまった。
色々勉強になるなあ
ncnnでStable-Diffusionを動かしてみる

## 概要
Stable Diffusionは「入力されたテキスト」をもとに画像を生成する訓練済のAIモデルです。
ncnnで、入力されたテキストからアニメ絵への生成をしてみます。

![Screenshot from 2023-11-22 13-51-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/6f9b584e-b7fc-7481-ab08-53d138add8cf.png)

## 環境構築
まず、M5UnitV2のクロスコンパイル環境を構築する手順で、ncnnやOpenCVをUbuntuにインストールします。

[M5UnitV2のクロスコンパイル環境を構築する手順](https://qiita.com/nnn112358/pbulic/9e15450265b689300216)

```
Ubuntu 22.04.3 LTS(x64)
OpenCV ver 0.4.4
ncnn ver 231027
```

## Stable-Diffusionのダウンロード

GitHubからfengwang氏のStable-Diffusion-NCNNのコードをダウンロードします。

```
$ git clone https://github.com/fengwang/Stable-Diffusion-NCNN
$ cd Stable-Diffusion-NCNN
```

## CMakeLists.txt ファイルの作成

cmakeでコンパイルするために、CMakeLists.txtを編集します。

```
gedit CMakeLists.txt
```

```CMakeLists.txt
SET(CMAKE_BUILD_TYPE "Debug")

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS}  -std=c++17 -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS}  -std=c++17 -O3 -Wall")

#SET(TARGET_COMPILER "arm")
if(TARGET_COMPILER STREQUAL "arm")
    message(STATUS "TARGET_COMPILE STREQUAL arm")
    SET(CMAKE_CXX_COMPILER arm-none-linux-gnueabihf-g++)
    SET(CMAKE_C_COMPILER arm-none-linux-gnueabihf-gcc)
    SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/arm/)
    SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/arm)
    SET(OpenCV_DIR /opt/external/opencv/build/arm)
else()
    message(STATUS "TARGET_COMPILE STREQUAL X64")
    SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/x64/)
    SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/x64/)
    SET(OpenCV_DIR /opt/external/opencv/build/x64) 
endif()

set(Target "Stable-Diffusion")

PROJECT(${Target})
cmake_minimum_required(VERSION 3.5)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)

find_package(OpenCV REQUIRED)

if(OpenCV_FOUND)
 message(OPENCV_VERSION)
 message(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")
 message(STATUS "OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")
endif(OpenCV_FOUND)

include_directories(${OpenCV_INCLUDE_DIRS} )
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${NCNN_INSTALL_DIR}/include)

add_executable(${Target}
    test.cpp 
)

target_link_libraries(${Target} ${OpenCV_LIBRARIES})
target_link_libraries(${Target} ${NCNN_INSTALL_DIR}/lib/libncnn.a -fopenmp)

```

## 学習モデルのダウンロード

このリポジトリのReleaseページより、学習モデルのダウンロードしてassetsフォルダに格納します。

```
$ wget https://github.com/fengwang/Stable-Diffusion-NCNN/releases/download/release/assets.20221204.tar.zst
$ zstd -dc assets.20221204.tar.zst | tar -xf -

```

## ビルド
Ubuntu用のバイナリをcmakeでコンパイルして、生成されたバイナリを実行します。
celeba/face_paint_512_v1/face_paint_512_v2という異なる学習モデルで生成された３枚のアニメ絵が作成されます。

```shell
$ cmake .
$ make
$  ./bin/Stable_Diffusion 
```


## 注記
Stable Diffusionは大容量のメモリを消費するため、M5UnitV2で動作させることは困難です。


## 参考資料
この記事を作成するにあたり、以下のウェブサイトを参考にしました。

[EdVince/Stable-Diffusion-NCNN](https://github.com/EdVince/Stable-Diffusion-NCNN)
AP0 インスタンスリフレッシュの影響【2023年11月20】



【重要】11月18日 AP0 インスタンスリフレッシュへの準備について　というメールを受け取って、ざっと内容をみて土曜日だし切替タイミングでの問題も発生しないだろうって高を括っていたら.... ああああ今朝からシステムが使えないって...

以下を甘く見てました...

+ [インスタンスリフレッシュメンテナンス](https://help.salesforce.com/s/articleView?id=000387056&type=1)

i.ハードコード化された参照 (na1.salesforce.com など) がある場合は、必ずインスタンス固有ではない相対 URL (login.salesforce.com など) に更新してください。
ii.会社のネットワーク設定およびメールセキュリティフィルタを、特定の IP 範囲またはデータセンターのみへのアクセスに制限するように設定している場合、追加された最新の範囲を必ず含めてください。含める IP 範囲についての詳細は、ナレッジ記事「許可すべき Salesforce の IP アドレスとドメイン」を参照してください。

+ [許可すべき Salesforce の IP アドレスとドメイン](https://help.salesforce.com/s/articleView?id=000384438&type=1)


さて、弊社では見積をSalesfroceで入力して最終的な見積書(PDF）は外部のサーバーで作成しています。Salesforceと外部サーバーの接続時のセキュイティを確保するために、認証とは別に外部サーバーでは接続可能なサーバー(Salesforceからのコールアウトと弊社の社内)だけにアクセス許可を与えています。

まぁ、apache2.conf なんですがね。ここでIPアドレスでなくてドメイン名を使ってました... まさか変わっているとは思いませんでした。


さて、実際のエラーメッセージは以下でした。

```
Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at input location [1,2]
```

Google先生で検索しても意味が良く分からないですね。今となってはapacheの設定でアクセス禁止にしていたことがわかるので、エラーを出しているコードを見れば納得なんですが... はじめは本当に意味が分かりませんでした。

Salesforce側のカスタムコンポーネントや外部サーバーのCGIはここ最近変更した記憶もないし、アップデート等はこの期間中にやっていません。

仕方ないので、Apexのログを眺めていると... うん　403エラーじゃないか。
権限がない？　何でだろう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1120b61d-4c5d-4ad3-4778-6523297538c8.png)

ということでapacheのエラーログを見てみました。

これだな。IPアドレスが変わったのかもしれない。

```
[access_compat:error] [pid 5062] [client 161.71.194.8:6576] AH01797: client denied by server configuration: ```
```

しかし、設定ファイルを見るとドメイン名で指定してました。

以下のサイトでIPアドレスからドメイン名を検索すると、ああああ違うな。違う。

[cman.jp > サーバ監視TOP > サーバメンテ支援 > ドメイン/IP検索結果](https://www.cman.jp/network/support/go_ip.cgi)

今まではALLow from proxy-hnd.net.salesforce.comを許可してました。

```
Allow from proxy-hnd.net.salesforce.com
```

ところが、今はproxy-hn3.net.salesforce.comに変わってますね。
Sandboxも変わってました...

素早く、設定を変えてapacheを再起動です。

```
>systemctl stop apache2
>systemctl start apache2
```

無事にエラーは無くなりした。

これに気付くのに40分ほどかかりましたね。　最初からApexのログをくまなく見ておけば...

```
Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at input location [1,2]
```
これに騙されたなぁ。今後のためには403エラーの時のエラーの出し方を変える。
またapacheでの設定はドメイン名をやめてIPアドレスを範囲してした方が無難なのかもしれません。

疲れました。
AGI(汎用人工知能)について知ってみよう

AGIについてご存知でしょうか？
先日ソフトバンクの孫正義会長が「AGI」について講演会で語っていました

👇その模様がこちら

https://www.youtube.com/watch?v=Gh0xzbgCIgg

# AGIって何？
AGI、つまり「Artificial General Intelligence（人工汎用知能）」は、特定のタスクに限定されず、人間のように多岐にわたるタスクを理解し、学習し、実行できるAIのことを言います。現在のAI技術は特定の分野では人間を超えることもありますが、AGIはあらゆる知的タスクで人間レベル、あるいはそれ以上の能力を持つことが期待されています。ただし、AGIはまだ実現しておらず、技術的なハードルや倫理的な問題も多いんです。

# AGIの特徴をもっと詳しく
GIは、人間ができる様々な知的タスクをこなすAIです。これは、特定の助けを借りずに人間並みの知能を持つことを意味します。AIの研究は1900年代初頭から始まり、AGIはAI研究の究極の目標とされています。

AIが特定のタスクで人間よりも優れた性能を発揮することはありますが、汎用性に欠けています。つまり、新しい状況に迅速に適応する能力が不足しているんですね。私たち人間は長い時間をかけて多様な状況に適応してきました。生存にはこの汎用性が重要です。

最近のテクノロジーの進展としては、ChatGPTのような生成AIが注目されています。生成AIは特定のトレーニングデータに基づいてテキストや画像を生成しますが、AGIとは異なります。例えば、AIチェスプログラムはチェスでは強いですが、世界情勢については理解できません。これは、特定の分野に限定されているからです。 

# AGIへの進歩はどうなってる？
つまり、AGIを正確に達成していないことは理解していますが、現在はどのような状況にあり、何が進行中なのでしょうか?
### 研究開発の動向
ディープラーニングはAGIに向けた重要な研究分野です。これは、コンピュータに人間のような学習をさせる手法で、多くの入力から最適な出力を導き出すアルゴリズムのトレーニングを含みます。自然言語処理や画像認識などの複雑なタスクに取り組むために、進化したニューラルネットワークと大量のデータが使われています。

### 強化学習
強化学習も重要なアプローチです。これは、特定の問題に対して最適な解決策を導き出すためにモデルを訓練する方法です。モデルが正しい選択をすると報酬が与えられ、間違うとペナルティがあります。これによって、AIは環境を理解し、行動に基づいたフィードバックから学習します。

# AGIの課題って何？
### 適応性の問題
AGIが直面する大きな課題の一つは、人間のように入力の文脈を理解し、それに適応する能力を持つシステムの開発です。研究者たちは、アルゴリズムがより創造的に考える方法を模索しています。例えば、生涯にわたって学習し続けるインテリジェントAIシステムの開発が進んでいます。

これに基づくと、私たちは AGI に近いところでしょうか?

### ハードウェアの制約
AGIシステムを構築するのは簡単なことではありません。大量の計算能力が必要で、高価なGPUやTPUなどの特殊ハードウェアが使われます。これには時間、データ、その他のリソースが必要で、完成までには数週間から数ヶ月かかる可能性があります。

# AGIはいつ実現するの？
AGIの専門家の中でも意見が分かれています。数年以内に実現すると考える人もいれば、まだ数十年の仕事が残っているという人もいます。重要なのは、技術の進歩の速度です。新しい技術システムが進歩すればするほど、専門家はAGIの実現に近づきます。

また、政府や組織は、これらのAIシステムが社会に与える倫理的な影響にも注目しています。AGIに関する物語を押し付けることは、これらのシステムを理解し制御する能力を失うリスクを伴います。

# おわりに
今日はAGI、つまり人工汎用知能について一緒に学んできました。AGIはまだ実現していない夢の技術ですが、その可能性には無限の魅力があります。AIの分野は日々進化しており、私たちの生活にも大きな影響を与えています。AGIが実現したら、私たちの世界はどう変わるでしょうか？

技術の進歩は予測が難しいものですが、AGIへの道のりはとてもワクワクするものです。ディープラーニングや強化学習など、AIの様々な分野での研究がAGIの実現に近づけてくれることでしょう。そして、その過程で我々が直面するであろう倫理的、社会的な問題にも、真剣に取り組んでいく必要があります。

最後に、AGIの研究と開発は、私たちの創造性と想像力を刺激し、未来への期待を膨らませるものです。この分野の進歩に注目しながら、私たちも日々の生活でAIの可能性を最大限に活用していきましょう！

これからもAIの世界は進化し続けます。私たちもその一部として、新しい技術の波に乗り遅れないよう、学び続けましょう！
RealSenseの中の人が伝えたいことトップ3　　（2023年版）

# はじめに

### 今年(2023年)にRealSenseの担当者が製品関連で多かった問い合わせ事項を発表！！！
1. あれ？RealSenseってまだ続いているんだっけ？
2. RealSenseについての技術的な質問があるんだけどー？
3. なんかD455の画像がピンクっぽいんだけど、

# 自己紹介
RealSense担当営業（とはいえ、日本というかアジアの担当者私だけなんでなんでもやってます）
チームの人が日本の文化に詳しくないため、本来名字＋さんの呼び方のはずなのに、下の名前＋さんで呼ばれているのでTakumi-san→Takumi3
本家アカウントがあまりつぶやかないので、たまにRealSenseについて役立つ情報を呟いてます。

# 1. あれ？RealSenseってまだ続いているんだっけ？
<font color="Red">ちゃんと続けてます！！！</font>
2年くらい前に「事業閉鎖」の記事がでましたが、（記事書いたサイトの日本語版サイト自体が今は消えてますが、）メイン製品であるステレオカメラは続いています。
今年は新製品を3つ市場に投入しました。その3製品のご紹介！
#### D435if & D455f　
赤外線フィルターを追加したことにより、RealSenseというか赤外線カメラが苦手である明るすぎる環境への耐性が強くなりました。ただ、屋内の蛍光灯に合わせて作っているので、屋外ではあまり効果がありません。床がピカプカの工場とかでRealSenseが乗っているロボットには向いていると思います。
![D435f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621465/e1c5b57a-024a-f21f-118c-74ec3286c00b.png)
#### D456　
RealSenseって屋外で使えないんでしょ～という方向けの製品です！防滴防塵のIP規格（IP65）を取得したD455ベースのモデルです。USBの口の位置や放熱孔がなくなるなどの工夫でIP規格に対応しました。水の中にぽちゃんは無理でも雨の中でもRealSenseを特殊なケースに入れなくても使えます。
![D456hole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621465/e88356a6-85af-d6aa-6665-06dc6f14e3dd.png)
![D456USB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621465/f71f340e-bd97-5b86-3ec1-fdf16d27c412.png)


# 2. RealSenseについての技術的な質問があるんだけどー？
あまり知られていないのですが、RealSenseの技術的なお問い合わせ先は２つあります。
1. 公式フォーラム(https://support.intelrealsense.com/hc/en-us/community/topics)
こちらは個人プロジェクトや趣味でRealSenseを扱っている人向けです。誰でも質問できます。
(RealSenseに質問があった人がググると大抵ここにたどり着いていかと思います)
2. 公式フォーラム(https://realsensesupport.intel.com/hc/en-us)
こちらは企業などがRealSenseを検討したり組み込んだりする時向けのサポートです。インテルとNDA（秘密情報保持契約）を結んでいる必要がありますが、RealSenseのエンジニアがメールベースで質問などに答えてくれます。NDAを結んでいるか分からない人や新たに締結したい人は連絡ください。(NDAはすぐ結べます)

# 3. なんかD455の画像がピンクっぽいんだけど、
これは昔から言われていた問題で、個体差もあるんですが、D455系(455,456,457)を屋外の明るい環境で使うとRGB画像がピンクっぽくなる現象。対応としては今年から製造したモデルには画像センサーを新しいものに変えてこの現象の発生率を下げています。ただ、未だに個体差が大きいらしく、新しいセンサーが使われている個体でもピンクっぽくなってしまう現象が起きてしまうのもあるもよう、、、
![D455pink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621465/c4a7e060-a142-76f2-d545-698bf6812c9a.png)
これは新しいセンサーでピンク問題が上手く抑えられている成功ケース。

# 最後に
depthカメラの中では老舗に近い立場になってきましたが、色々新しいこともやってます。ただ、宣伝とかが下手なんで、あまり知られてないことが多いです(笑)。これからも色々情報発信していきます！
[Cursor] AIで変わる新しいエディタ


Cursorは、AIを活用した革新的なコードエディタとなります。

https://cursor.sh/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/c039e04d-99e9-feaf-b465-92e64962b1b0.png)


## 主な特長

- **VSCodeベース**: Cursorは、人気の高いVSCodeを基にしています。VSCodeの操作に慣れている方なら、すぐに使いこなせるはずです。
  ![スクリーンショット 2023-11-20 13.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/5ba800b5-aea7-12a2-aae2-0d0b7605c956.png)


- **ChatGPT内蔵**: AIの力でコードに関する質問やアドバイスが得られます。`Ctrl + Shift + L`でチャットエリアを開いて、AIに質問しましょう。

- **AIによるコード生成・編集**: `Ctrl + K`でAIを活用し、コードの生成や編集が可能です。編集したいコードを選択して`Ctrl + K`、簡単な指示を入力するだけです。

- **対話型デバッグ**: バグがある時に役立ちます。AIが問題の解決策を教えてくれるので、デバッグがスムーズに進みます。

- **ドキュメント活用**: `@`記号を使用して特定のライブラリやフレームワークの情報をAIに参照させることができます。ドキュメントのURLを入力すると、AIがその内容を読み込んでくれます。

## 料金プラン
- Basic（無料）: 月間50回の「slow」GPT-4使用、月間200回のGPT-3.5使用が可能です。
- Pro（月額$20）: 月間500回の「fast」GPT-4使用、無制限の「slow」GPT-4およびGPT-3.5使用が可能です。
- Business（月額$40/ユーザー）: Proプランの全機能に加え、無制限の使い放題とプライバシーモードが可能です。

![スクリーンショット 2023-11-20 13.53.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/e3c97f29-c832-9d33-e314-384cb44e7f03.png)


## 使い方

- **AIチャット起動**: `Ctrl + Shift + L`でチャットウィンドウを開きます。
- **コード生成・編集**: `Ctrl + K`でAIチャットを開いて、コードの生成や編集を指示します。
- **ドキュメント参照**: `@`記号とライブラリ名を入力して、AIにドキュメントを参照させます。

## おすすめする人

- **プログラミング初心者**: AIのサポートで学習が効率的に進みます。
- **経験豊富な開発者**: コードの生成やデバッグが速くなり、作業の効率が上がります。
- **VSCodeユーザー**: 既存の知識を活かして、すぐに慣れることができます。
Proxmox インストールからVM立ち上げまで

# proxmox インストールからVM立ち上げまで　メモ
## IPアドレスの固定
インストールする予定のPCのIPアドレスを固定にします。私はWifiの設定からPCのMacアドレスをもとに固定のipアドレスが割り当てられるようにしました。
## isoダウンロード
https://www.proxmox.com/en/downloads/proxmox-virtual-environment
からダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/670be1f3-7d9e-1654-caa8-907b32320852.png)
USBに書き込み。私はRaspberry Pi Imagerを使用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/b479d92f-2fa9-e41e-45f5-d3f8602cfd68.png)
## インストール
PC起動時にBIOS画面を表示させ、作成したUSBを起動ディスクに選択し、起動する。
設定がGUIで行えるのでそれに沿って必要事項を入力する。

:::note alert
 インストール先に指定したssdの既存データはすべて消えます
:::

![IMG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/0843f454-7b2f-4d39-a4b2-90b2675c702f.jpeg)
![IMG_1709.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/22896508-eb3c-83ae-4e85-670cdcc20534.jpeg)
![IMG_1752.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/aaf0bf08-e414-423d-eb25-79e84b83a62f.jpeg)
![IMG_1711.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/c2211065-39b6-78a8-6d1f-5113cab79012.jpeg)

## アクセスする
インストール後画面に表示されたアドレスにアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/53c0848b-f2fa-aae5-afe8-2f8441ad8535.png)
警告が出ますが、アクセスします（安全ではありません）を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/d7b7d762-bbcd-edf8-ab93-e327a54f43a6.png)
OKを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/c11364d3-88c9-2dd3-2d67-7fc2c1bb66bb.png)
## VM作成
isoをダウンロードしてくる。URLからダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/45f44550-2d59-967f-41d9-d85ca010b8d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/3fab5afc-ebba-e4ca-fa47-fec891d6c00a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/e9a534f6-e731-9e12-8cfc-51f87b25076d.png)
VMを作成を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/20ebb300-c9c7-8e09-c74c-ee847d1ec43c.png)
OSで先ほどダウンロードしたISOを選択。
システム、ディスク、ネットワークはデフォルトでCPUは２コア、メモリは4096に変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/992707bd-0589-b66a-ea93-a6d52ea325f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/cc6c6312-06f6-e8df-5300-ee3a9dcecb6f.png)
開始ボタンを押した後、コンソールを押すと画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/619983e0-0e92-b99c-c004-7f4e1877afbe.png)
後は通常通りOSのインストールです。
prependメソッド

### prepend() メソッドを調べる
Element: prepend() メソッド
Element.prepend() メソッドは、一連の Node または文字列をこの Element の最初の子の前に挿入します。
出典 

https://developer.mozilla.org/ja/docs/Web/API/Element/prepend

```js
a = document.createElement("div");
a.id = "parent";

b = document.createElement("div");
b.id = "child";

a.prepend(b);

c = document.createElement("div");
c.id = "child2"

a.prepend(c);
```
```html
<div id="parent">
    <div id="child2"></div>
    <div id="child"></div>
</div>
```

# 感想
insertBefore() メソッド以外にも要素の追加をすることができてよかった