OmniAICreator/Qiita-1.07M huggingface dataset:
【アイディア】ゲーミングシンタックスハイライト


## 前書き

これはただのアイディアを書いただけの記事です。

## 本題

ぼーっとしていたらふと思いついた。
最近はゲーミング○○と称して何でもかんでも虹色にしているが
シンタックスハイライトを虹色にしたら面白いのではないだろうか？

VSCodeやEmacsとかだとシンタックスハイライトを自作できるから作れるかも。

さらに、時間経過で色相が変わるとよりゲーミング感がより出て面白いかも。

終わり。

## おまけ

https://qiita.com/mogamoga1337/items/db51fe4413bf24061461
【Unity】Failed to import package with error: Couldn't decompress packageのエラーが発生する

# はじめに
Unity2022.3.21の環境で以下のエラーが発生したので対処方法を記録します。

```
Failed to import package with error: Couldn't decompress package
Opening File *** アクセスが拒否されました
UnityEditor.AssetDatabase:ImportPackage (string,bool)
```

# 原因
アセットストアからダウンロードしたアセットのキャッシュファイルが破損している or アセットストアのアセットがプロジェクトに含まれているがpackagesに定義されていない。

# 対処方法

PackgeManagerまたはpackagesに該当するパッケージを追加する
Nuget のEntityFrameworkパッケージのバージョンを6.0.0→6.4.4にしたら今まで動作していたSQLがエラーになった(The specified cast from a materialized 'System.Int32' type to the 'System.String' type is not valid.)

# はじめに
タイトルの通り、EntityFrameworkパッケージをアップデートしたら特定のSQL文のみエラーとなってしまいました。

### 環境
- VisualStudio2019
- .NET Framework4.8
- MySQL8.0
- EntityFrameworkパッケージ 6.0.0 → 6.4.4

# エラー内容
`The specified cast from a materialized 'System.Int32' type to the 'System.String' type is not valid.`
プログラムを起動すると上記のようなエラーが発生

# 結論
SQL文を実行して取得する項目とクラスのメンバの型が異なることが原因でした。
SQL文内にCASTを用い型を合わせることによりエラーが出なくなりました。

# 詳細
エラーが発生したのは以下のコード部分です。
SQLからデータを取得しMyClassというモデルに格納するとします。
```vb:SQL
            sql.AppendLine("SELECT ")
            sql.AppendLine(" ID      AS id ") 'VARCHAR(255)
            sql.AppendLine(",NAME    AS name ") 'VARCHAR(255)
            sql.AppendLine(",PRICE   AS price ") 'INT(2)　←ここが原因
            sql.AppendLine("FROM  mytable ")
            sql.AppendLine("WHERE ID = '0000' ")

'ここでエラー発生
result = entities.Database.SqlQuery(Of MyClass)(sql.ToString, params.ToArray).First()
```

```vb:MyClass
Public Class MyClass
    'クラス
    Public Property id As String
    Public Property name As String
    Public Property price As String '←ここが原因

End Class
```

ここで`PRICE`に注目してほしいのですが、DBテーブルとしてはINT型になっておりますがクラスの定義ではString型となっております。
そのため型の不整合が起きタイトルのようなエラーが発生しておりました。

# 解決策
この場合、以下のようにCASTしてString型に変換すれば不整合が発生せず正常動作します。

```vb:修正前
sql.AppendLine(",PRICE   AS price ")
```

```vb:修正後
sql.AppendLine(",CAST(PRICE AS CHAR(255))   AS price ")
```

# そもそも何故バージョンアップ前に動作していた？
よく考えれば動作しないはずですが、おそらくEntityFrameworkの方で型の自動変換やキャストが行われていたのではと思っています。
しかしEntityFrameworkを6.4.4にバージョンアップすることで内部的な型チェックがより厳格になったのだと考えています。
古いバージョンでは、型の自動変換やキャストが柔軟に行われていた部分が、新しいバージョンではエラーとして扱われるようになったのかもしれません。

# まとめ
そもそもクラス内メンバの型の定義が間違っていたのが原因でしたが、フレームワークやライブラリのアップデートにより思わぬところでエラーが発生してしまうということを学びました。

# 参考
https://github.com/neisbut/EntityFramework.MemoryJoin/issues/6
言語処理学会2024論文紹介/大規模言語モデルにより生成した疑似データを用いた自由記述アンケートの自動集約

【一言で言うと】
大規模言語モデルを用いて、質的データ分析（QDA）の代表的な手法であるグラウンデッド・セオリー・アプローチ(GTA)における「切片化」と「カテゴリ分類」の自動化手法を提案した

【タイトル/URL】
大規模言語モデルにより生成した疑似データを用いた自由記述アンケートの自動集約
https://www.anlp.jp/proceedings/annual_meeting/2024/pdf_dir/D9-5.pdf

【まとめ】
・ローカル環境（gpt-3.5-turbo-0613）で新型コロナアンケートの擬似回答を3,002件作成
・擬似回答をもとに「擬似回答自動切片化データ」と「実回答人手切片化データ」を作成し、東北大版BERTで学習
・擬似回答自動切片化データに対して、カテゴリ生成モデル（bilingual-gpt-neox-4b-instruction-sft＋LoRA）を適用し、６２３種のカテゴリを生成→最終的に10種類のカテゴリに統一
・擬似回答自動切片化データと実回答人手切片化データを10種類のカテゴリに分類し、分類モデルの性能比較
・自動化手法は時間/費用面で優れているが、「切片化」と「カテゴリ分類」の性能は人手作成データよりも性能で劣る

【感想】
・医療カウンセリングデータも直接chatGPTに読み込ませる事ができないので、本手法は参考になった
・提案手法は政府カテゴリを誤って多く分類する傾向があったので、医療データでの傾向を検討したい

【画像】
![スクリーンショット 2024-04-11 14.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2106750/33f64397-2a03-f16c-ad22-860feeca3a85.png)
![スクリーンショット 2024-04-11 14.05.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2106750/1f916974-c8cd-8d3b-0add-638f160b4f2e.png)
WWDC24の開催日程が発表されたので予想をまとめてみる

# 概要
毎年6月あたりに開催されるWWDC24、今年は6月10日から6月14日（日本時間では6月11日から6月15日）の４日間に渡り開催される。WWDCでは例年macOS、iOS、iPadOS、watchOS、tvOSなどのソフトウェアが発表されます。またついでにと言わんとばかりの新しいハードウェア製品が発表されることもあります。

# 今出ている予想
それでは本題の予想についてまとめてみます。ここに記載されているものはあくまで予想なので必ず実現されるとは限らないので暇つぶしにと思って読んでいただければ幸いです。
まずはソフトウェアから…

### iOS　〜今年はAIの年になりそう〜
1. iOSのソフトウェアで大きく期待されているのは***Siri***です。Apple製品全般に搭載されているSiriですが賢いと言われるほどの機能はありませんでした。ですが今年のアップデートではSiriの機能が大きく変わると予想されています。具体的には複雑な質問に返答できるようになったり、24時間の会話を録音しその日の出来事を理解し何かアクションを起こしてくれるかもしれないなど。後者はプライバシーの面では不安要素もありますが、プライバシーの鬼と言っても過言ではないAppleならば実現する可能性もありそう。
2. ホーム画面に表示されているアイコンが丸みを帯びた視覚から丸になると予想されています。 （想像しづらいという方はYouTubeで「VisionPro」と検索してホームアイコンを見てください）
このデザインは人を選びそうなので設定でカスタマイズできると良いと思います。
3. iOS17で実現されると言われていたアプリのサイドローディングが実現されると言われています。これによりApp Store以外の場所から様々なアプリをiPhoneにインストールして利用することができます。ですがセキュリティー面に心配が残ります。iPhoneにウイルスが入ろうもんなら天下のAppleさんが黙ってないですからね...

はい、iOSのアップデートで予想されているのはこんな感じです。次にmacOSにいきましょう

### macOS 〜次の名前は山、川、公園？〜
毎年発表されているmacOSですが名前にアメリカの名所の名前が付けられます。何気にこれが一番気になっているという冗談はさておき予想を見てみましょう。
1.こちらもiPhoneに付随してSiriの機能が向上すると考えられます。最近WidowsではCopilotがありますがそれに似た機能になるのでしょうか？
2.新しいアクセシビリティ機能と強化について適応型音声ショートカット、ライブスピーチ機能に新しくカテゴリの項目が追加、フォントサイズのカスタマイズに対応するアプリが拡大の３つが追加、強化されるようです。

macOSに関してはそれほど大きく変わる所はなさそうな気がします

### iPadOS ～iOSとあまり変わらない？～
iPadOSについてはiOSとあまり変わらない可能性があります。
1.iPadOSについてもSiriの機能が進化すると考えられています。

というわけでiPadOSは以上になります。少なっ！と思ったそこのあなた決してめんどくさくなった訳ではありません。情報がまったくなかったためです。

### watchOS　～まもなく10周年～
Apple Watchに関してはまもなく10年になることから特別なモデルの開発が進められているとの噂が出ています。

1.ヘルスケアを中心にAI機能が大幅にアップデートされると予想されています。またオンデバイスでのSiriなどの応答ができるようになりオフライン状態でもSiriに関わる機能が使用できるようになるかも知れません。

Apple Watchに関してもAIの機能が目立つような予想が見受けられました。

# まとめ
というわけで以上が各OSの予想になります。今年はどOSに関しても主にAIに関する予想が飛び交っていた印象でした。AI分野に関しては出遅れているAppleですがどういった形で参入してくるのか注目されるポイントになりそうです。
Macでasdfの環境構築

プロジェクトの直下に`.tool-versions`が存在していたらasdfを使っているかと思いますので、素直にインストールしましょう。

## 環境

- M2Mac
- Homebrew
- ZSH

## インストール

[公式](https://asdf-vm.com/guide/getting-started.html) に従って進めます

```
brew install coreutils curl git
brew install asdf
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```

## 既存プロジェクトのnodejsを設定する

```
$ cat .tool-versions 
nodejs 20.12.0
```

```
brew install gpg gawk
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf install
```

## トラブルシューティング

### Xcodeが古くてエラーが出る

```
Error: Your Xcode (11.1) at /Applications/Xcode.app is too outdated.
Please update to Xcode 15.1 (or delete it).
Xcode can be updated from the App Store.
```

→AppStoreからXcodeをインストールする
cscの作法 その486

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
datatableを、listviewで表示せよ。

# 方針
- datasource無いので、スクラッチで組む。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1912d3b4-646e-e062-b2c6-1a1759158a60.png)

# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Data;

namespace App
{
	public partial class Form1: Form {
		private ListView lsv;
		public Form1() {
			Text = "listview";
			ClientSize = new Size(310, 300);
			DataTable dt = new DataTable();
			dt.Columns.Add("id", typeof(int));
			dt.Columns.Add("Name", typeof(string));
			dt.Columns.Add("Age", typeof(int));
			dt.Rows.Add(1, "太郎", 20);
			dt.Rows.Add(2, "次郎", 15);
			dt.Rows.Add(3, "三郎", 10);
			lsv = new ListView();
			lsv.Location = new Point(0, 40);
			lsv.Size = new System.Drawing.Size(300, 200);
			lsv.View = View.Details;
			lsv.FullRowSelect = true;
			lsv.GridLines = true;
			lsv.Columns.Add("id", 50, HorizontalAlignment.Right);
			lsv.Columns.Add("Name", 100, HorizontalAlignment.Left);
			lsv.Columns.Add("Age", 50, HorizontalAlignment.Right);
			for (int i = 0; i < dt.Rows.Count; i++)
			{
				DataRow row = dt.Rows[i];
				ListViewItem listitem = new ListViewItem(row["id"].ToString());
				listitem.SubItems.Add(row["Name"].ToString());
				listitem.SubItems.Add(row["Age"].ToString());
				lsv.Items.Add(listitem);
			}
			Controls.Add(lsv);
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}







```

以上。
Typstで英数字・日本語文字と見出し・本文の組み合わせごとにフォントを変える

# やりたいこと
- Typstで日本語と英数字の両方を含む文書を作成している
- 日本語（ひらがな・カタカナ・漢字）とそれ以外の文字に別のフォントを適用したい
- 見出しはゴシック体（Sans Serif）、本文は明朝体（Serif）にしたい

# 環境
- Windows 11
- `typst 0.11.0 (2bf9f95d)`
    - 注意：Typstの仕様の変化が速く見えるので，バージョンにあわせて修正が必要かもしれません

# 結論

次のコードを使う：
```
// for main text
#set text(
    lang: "ja",  // 英語しか使わない文書では"en"とする（もしくは指定しない）
    font: ("Linux Libertine", "BIZ UDPMincho"),  
    // font: (日本語文字を含まないフォント, 日本語文字を含むフォント),  となっている
)

// for headings
#let heading_font(body) = {
    set text(font: ("Arial", "BIZ UDPGothic"))  // weightの指定は反映されないらしい
    // font: (日本語文字を含まないフォント, 日本語文字を含むフォント),  となっている
    body
}
#show heading: heading_font  // heading_fontを適用する
```
ポイントは、`font-family`を指定する（`font: (FONT1, FONT2)`とする）方法を選んだこと。理由は次の「注意点」を参照。

フォントは自分の環境（Windows）の中で選んだので、環境や好みに応じて修正が必要。
メインのファイルに直接書ける形（コードに`#`をつけてある）になっているが、もちろんテンプレートとして使ってもよい。
コードブロックの中に書く場合には、`#set`や`#let`の`#`を削除すればよい。

# 注意点

Google検索していると、正規表現を使ってひらがな・カタカナ・漢字を抽出し、それらに日本語フォントを適用する方法が出てくる。
1. [Typstで日本語文字と英数字のフォントを別々に指定する](https://zenn.dev/mkpoli/articles/6234c1d2a595bd, "Typstで日本語文字と英数字のフォントを別々に指定する")
2. [【Typst】レポート用テンプレート](https://benifl.site/typst-template/, "【Typst】レポート用テンプレート")

しかし1.の著者がGitHubのissueで議論しているように（[リンク](https://github.com/typst/typst/issues/794#issuecomment-1881146449, "コメント")）、正規表現を使うルール（`#show regex(...): set text(~~~)`）の優先度がかなり高いらしく、上のように`heading`に別のフォントを適用することができなかった。
例えば本文を明朝、見出しをゴシックにしたくても、本文を明朝にする
`#show regex(...): set text(font: "BIZ UDPMincho")`
が常に適用されて、見出しまで明朝になってしまう。

この問題を回避するために、`font-family`を指定することにした。
`font: (FONT1, FONT2, ...)`のFONT1から順番に適用されて、そこに含まれない文字にはFONT2が使われる、という振舞いのはずなので、FONT1に日本語対応のフォントを指定した場合は何も起こらない。

:::note info
最近Typstを使い始めました。面白いし便利な反面、開発が進んでいる途中だからか、ここに書いたようなトリッキーな部分もあるな、という感想です。当面はLaTeXとうまく使い分けていくことになりそうです。
:::
SwiftUIのViewからWKInterfaceCotrollerへの遷移について

SwiftUIで作成したViewからWKInterfaceControllerへの遷移を紹介します。
SwiftUIでの通常の遷移の場合は
``` swift:swiftUI
NavigationLink(destination: ContentsView(), label: {
    Text("Test")
})
```
で行えます。

しかし、ContentsViewに設定されている箇所がWKInterfaceControllerだった場合はエラーとなります。

SwiftUI → SwiftUIのような遷移は行えますが、
SwiftUI → WKInterfaceControllerは行えないといった感じです。

ではどうすればSwiftUI → WKInterfaceControllerが行えるかというと以下の通りになります。


遷移したいWKInterfaceControllerが、
``` swift:swift
class TestInterfaceController: WKInterfaceController {
}
```
だった場合は、NavigationLinkにこのように設定すると遷移することができます。
``` swift:swiftUI
NavigationLink(destinationName: "TestInterfaceController", label: {
    Text("Test")
})
```
Windows11でプリントスクリーン押した時に画面キャプチャー機能が起動しないように設定

# 概要

PrintScreenキーを押すと画像切り取り機能が起動してしまう。
おそらくSnippingTool。

でも、Lightshotという名前のスクショ用ソフトと競合してしまう。
PrintScreenキーを押した時に、 **Windows標準の画像切り取り機能が起動しないように** 設定したい。

# やり方

Windowsマーク右クリック ⇒ 『設定』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/dd7ef916-d1fb-1d11-86f8-5e2d8c6fdd23.png)

『アクセシビリティ』 ⇒ 『キーボード』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a1fa660c-0ae8-5c6d-7edd-b3b8bb230239.png)

『PrintScreenキーを使用して画面キャプチャを開く』を『オフ』に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/62382a2e-75e3-c7fa-cf8f-2becdfd2f2dd.png)


# 参考サイトさん

https://jp.finalfantasyxiv.com/lodestone/character/19188057/blog/5243040/#:~:text=1.Windows%E3%82%AD%E3%83%BC%E3%82%92%E6%8A%BC%E3%81%97,%E9%96%8B%E3%81%8F%20%E3%82%92%20%E3%82%AA%E3%83%95%20%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82

# バージョン

Microsoft Windows [Version 10.0.22631.3447]
C++の学習に役立つもの

## はじめに
こんにちは、大学3年のカズマといいます。
突然ですが、みなさんは現在、どのプログラミング言語を学んでいますか？
私は大学の授業やゼミで、HTML&CSS,JavaScript,Pythonなどを学んで、独学ではC++,C#などを学んでおり、現在も取り組んでいる最中です。
そんな中で今回は、C++を学習している中で役立つものについて色々と取り上げたいと思い、記事にしました。
今後、C++を学びたい人に役立つことができれば、本当に嬉しく感じます。

## C++のHello Worldはどうやる？　
以下がC++でHello Worldを出力するプログラムです。
```cpp
#include <iostream>
using namespace std;

int main(){
    cout << "Hello World" << endl;
    return 0;
}
```
### 他の言語との比較
次にPythonでHello Worldを出力するプログラムは以下の通りです。
```python
print("Hello World")
```
上記の二つのプログラムを見てもらうとわかると思いますが、圧倒的にPythonの方が短く、全体的にわかりやすいプログラムであり、C++の場合は
+ #includeとかiostream、using namespace stdって一体なんなんだよ...？
+ なんか関数を使ってて、難しそう。。

という印象を持たれるのではないかと思います。

このHello Worldを出力するプログラムから伝わるように、
**C++は言語仕様が難解なものであり、
学習することもハードルが高く、初心者には難しい**
というイメージを与えてしまっているのではないかと思います。
実際、私もそう感じており、このプログラミング言語をいつか学びたいと思っていましたが、なんか難しそうというイメージを勝手に作り上げ、取り組まずにいました...

## しかし大丈夫！！
そんな私の不安も消し飛ばすような、C++の入門学習を教えてくれる**神動画**にYoutube上で出会い、現在ではオブジェクト指向プログラミングの基礎とも呼ばれる「クラス」を用いた簡単なプログラムまで書けるようになりました！！（本当にありがとうございます...😭）
その動画とはこちらです！！
[C++入門学習 神動画：前編](https://youtu.be/U-25Qc4aSK4?si=Rjj2mNtT8f0aIQFr)
[C++入門学習 神動画：後編](https://youtu.be/HVFgO_QiwoQ?si=kWuoE3LBtny2I5ff)

前編と後編に分かれていて、
+ 前編は基礎構文や変数,if文,ループ処理といったプログラミングの基礎的内容
+ 後編はクラスを用いたプログラムやカプセル化,コンストラクタ,継承の内容

上記の内容を学習できます！
動画で教えてくれる方は実際にエンジニアとして働いている方で、本当に1から丁寧に教えてくれます！
またC++の入門学習以外にも、C言語やJava,アルゴリズムとデータ構造についての動画もあるので、是非とも確認してみてください！

## 最後に
動画とは違いますが、環境構築などに関して載っているネットサイトがあったのでそれも記載させていただきます。
[ゼロから学ぶ C++](https://rinatz.github.io/cpp-book/)

今回の記事で1人でも多くの、C++の学習に挑戦しようと考えているプログラマーに役立てることを祈っております。ここまでご覧いただき、ありがとうございました！！
scaffdogを導入してStorybookを使ったコンポーネント作成を幸せにしてみた

クライアントワークという業態で日々様々なプロジェクトに携わっているのですが、その中で一定数のコンポーネントをStorybookを使いながら一心不乱に作成するというフェーズがよく発生します。

新規ファイルを作成してexport constから書き始めてtype Props書いて、ストーリーファイルも作成して…という作業は地味に手間がかかる＋既存のファイルをコピペするにもファイル名を変更したり不要な部分を確認しながら削除したりが地味に手間…ということで、いい感じに自動化＋テンプレート化できないかと模索していたところscaffdogにたどり着きました。何度かプロジェクトに導入してみて、無事幸せになれたので備忘録を残します。

https://scaff.dog/

## 喜びポイント
- セットアップがめっちゃ簡単（準備から使用開始までコマンドは2つだけ）
- マークダウンでテンプレートの記述が可能なので、とっつきやすい
- とはいえJSのような感覚で条件分岐もできるので、難易度と便利性のバランスがとって私にとってはちょうど良かった
- 複数のテンプレートが登録可能＆管理も簡単なので、幅広いユースケースに対応できる

## テンプレートを基にファイルを作成している様子


```shell
$ npx scaffdog generate
```
上記のコマンドを叩くと、自分で作成したテンプレートの質問事項が順番に表示されるので、↓ のようにそれぞれ答えていくだけです！
　
![Screenshot 2024-04-10 at 23.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2487729/ddd12a2b-d7b6-2239-0433-e2c858651ada.png)

↓ 完成！ :dog: :tada: 

![Screenshot 2024-04-10 at 23.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2487729/ce8df555-74bc-9466-8e9c-0588bfef44ab.png)

## 実際に作成したテンプレート


### コンポーネントの格納先

ざっくりイメージはこんな構造の想定です。

- 共通するコンポーネントを格納するディレクトリ
- 管理画面に関する色々を格納するディレクトリ
- エンドユーザーが閲覧する画面に関する色々を格納するディレクトリ

```
- app
    - _components
        - CommonButton
            - CommonButton.tsx
            - CommonButton.stories.tsx
    - a
        - _components
            - ComponentA
                - ComponentA.tsx
                - ComponentA.stories.tsx
    - b
        - _components
            - ComponentB
                - ComponentB.tsx
                - ComponentB.stories.tsx

```

### テンプレートファイルの中身

````markdown
---
name: "component"
root: "."
output: ["./app/_components", "./app/*/_components"]
questions:
  name: "コンポーネント名をパスカルケースで入力してください (ex. CommonButton)"
  story:
    confirm: "ストーリーファイルも一緒に作成しますか？"
---

# `{{ inputs.name | pascal }}/{{ inputs.name | pascal }}.tsx`

```typescript
export type Props = {}

export const {{ inputs.name | pascal }}: React.FC<Props> = ({ }) => {
  return <div></div>;
};
```

# `{{ inputs.name | pascal }}/{{ inputs.name | pascal }}.stories.tsx`

```typescript
import type { Meta, StoryObj } from "@storybook/react";
import { {{ inputs.name | pascal }} } from '{{ "./" + inputs.name  }}';

const meta: Meta<typeof {{ inputs.name | pascal }}> = {
  component: {{ inputs.name | pascal }},
  title: "{{ inputs.name | pascal }}",
};

export default meta;
type Story = StoryObj<typeof {{ inputs.name | pascal }}>;

export const Default: Story = {
  args: {
  },
};

```
````

## まとめ
コンポーネントファイルとストーリーファイルを違う場所に格納したい場合にももちろん少し調整すれば可能なので、scaffdogすばら〜！臨機応変力〜！となりました。学び！

コンポーネントファイルだけを作成する、ストーリーファイルだけを作成する、両方作成するなどのパターンも準備したことで、今のところ発生し得るほとんどのケースを網羅できている気がします。

もっとこういう良いやり方あるよ！などあればぜひ教えていただけると嬉しいです＼(^o^)／
引数のおける参照・所有権のまとめ？ in Rust

**rustc : ver 1.77.1**
<br>

初めまして **Twil3** です。

<br>
いきなりなのですが、

<br>

関数を作るときに引数に
**&** を付けるのか、付けないのか。
**mut** を付けるのか、付けないのか。 

<br>


**わからないのですよね？！**
<br>

そこで、自分なりに調べてみたので、まとめとして残しておきたいと思います！
稚拙な文章ですがどうぞ許してくださいm(_ _)m

<br>

今回は例として特定の値に**1**足して返す(add_one)関数を使って書いていきます。
<br>

### まず、add_one関数を定義します。

~~~Rust:add_one.rs
fn add_one() -> {
    a+1
}
~~~

では、引数の設定をしたいのですが....
<br>

**&** を付けるのか **mut** を付けるのか、はたまた **なにも付けない** なのか判断が難しいんですよ！

<br>

### ここで **&,mut**について調べてみると、
<br>

+ **&** 
-> 変数の値を用いて、新しく変数を作る ( = 参照 )
-> **元の変数の値を変更しない場合**

+ **mut**
-> 変数の値自体を変更することが可能 ( = 可変 )
-> 元の変数の値を変更したい場合
+ **なにも付けない**
-> 変数の値自体を変更 ( = 所有権 )
-> 元の変数の値を変更したい場合

<br>
と、出てきました。
<br>

### 結局どうすればいいのか

<br>
つまるところ、今回の引数には **mut** もしくは **なにもつけない** のが正解ということになります。

<br>

~~~Rust:add_one.rs
fn add_one(mut n: i32) -> i32 {
    a+1
}
~~~

もしくは

~~~Rust:add_one.rs
fn add_one(n: i32) -> i32 {
    a+1
}
~~~
となるのですが、ここで上の.rsをコンパイルすると

~~~ add_one.rs -> warning
warning: variable does not need to be mutable
 --> add_one.rs:1:12
  |
1 | fn add_one(mut n: i8) -> i8 {
  |            ----^
  |            |
  |            help: remove this `mut`
  |
  = note: `#[warn(unused_mut)]` on by defaul
~~~

という **Warning** が出ます。
要約すると **mut要らないよ！** っていうことですね。

--------
#### 最後に
関数の引数で **mut** を使うことは多分少ないと思います。
まだ **Rust** を学び始めて間もないので全然わからないことが多いので、補足があれば是非教えてください！
Riderで差分が多めのブランチを切り替えていると赤線が出現しまくる

## 現象
差分が多めのブランチ同士を切り替えていると、解析がうまくいっていないのか赤線が出まくりました。
ビルド自体はできるし、実行も問題なくできるが赤線は消えないという状態です。
再現性もあったので記事にします。

## 環境
SonomaになってからJava周りのバグが多いと聞いているので一応環境も載せておきます。
.NET8
Rider 2023.3.3
MacOS Sonoma 14.3.1

## 解消方法
とりあえずRiderをアップデートしましょう。
2024/04/11現在最新版は2024.1です。
アップデートすれば解消されます。

以上

:::note info
ここからはどうしてもRiderのアップデートをしたくない人向けです。
:::


## 明示的に再解析してもらう
Problemsタブの更新マークみたいなものを押して、ReAnalysis Allをする。

![スクリーンショット 2024-04-11 11.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/4086cc91-bdcc-e0a4-1d6d-9d6209f8ffb2.png)
全部再解析していいかの同意画面が出るので問題なければYes

再度全文解析されて赤線が消えていく。

## 試したこと
右下のタブでオンオフを切り替えても消えない。
![スクリーンショット 2024-04-11 11.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/cbfd23bf-229c-e6e1-3f3e-176e45d28f8c.png)

ブランチ切替時に切り替え前の解析情報が残っていて、そのせいでおかしくなっていると予想。
VSCodeのRemote-SSHでProxy下のホストに接続できなくなった

# 概要
## 状況・症状
VSCodeをアップデートした際、proxy下のホストにRemote-SSHができなくなった。
症状としては、「VS Code Server をダウンロードしています。」というメッセージが終わらない。

## 解決方法
以下の設定を追加する。(Ctrl+,で開くGUIの設定からでも変更可能）
``` setting.json
{
    "remote.SSH.useExecServer": false,
}
```
## 参考
https://github.com/microsoft/vscode-remote-release/issues/9752



# 経緯（想像が主）
## 想定原因
今回のアップデートに付随して、Remote-SSHもアップデートされており、その際、当該オプションがのデフォルトがTrueになったものと考えられる。

## 根拠
- VS Code自体のVersionを1.85.2まで落として、Remote-SSHも再インストールした場合、当該症状が発生しなくなることを確認している。
- 以下のstack over flowを見ると、当該機能は7ヶ月前には導入されているようであるが、私は当該オプションを変更した記憶は無い。
- githubのissueが5日前に立っていることからも、最近挙動が変わった人がそれなりに居ると予想できる。

https://stackoverflow.com/questions/77066938/remote-ssh-connection-hangs-at-downloading-vscode-server-step-after-updating-v

### VSCodeのバージョン
バージョン: 1.88.0 (system setup)
コミット: 5c3e652f63e798a5ac2f31ffd0d863669328dc4c
日付: 2024-04-03T13:26:18.741Z
Electron: 28.2.8
ElectronBuildId: 27744544
Chromium: 120.0.6099.291
Node.js: 18.18.2
V8: 12.0.267.19-electron.0
OS: Windows_NT x64 10.0.14393

# 昔話
数年前はproxyへの接続が糞めんどくさくて、普通にputty等のssh接続をメインにしていた。

https://qiita.com/waterame/items/9979f1730cccddc8e608

いつの頃からか、Client経由でhostにServerを設置する機能が追加されていた。
<後でURLを追加する>

github copilotを使用するようになって、host上の編集もVS Codeを使用するようになった。

今回の症状が発生し発狂する。
「速くて性能がよいのは大正義」な大人気モデル Mixtral-8x7B

同社の Mistral-7B を以下で解説しました。

https://qiita.com/kernelian/items/98be743010316d44e21e

今回は Mixtral-8x7B について解説していきます。

## Mixtral-8x7B が人気な理由

Mixtral-8x7B が人気な理由は 3 つあります。

- OSS である
- ChatGPT に次ぐ性能の高さ
- 推論が速い

### OSS である

Mistral-7B の時にも言いましたが、OSS のモデルは、ライセンスが定義されているものの、ライセンスの許す限りであれば自分で好きなようにチューニングができます。
そのため、個人・企業でチューニングモデルを作るときのベースモデルとして活用ができます。

例えば、ChatGPT でもチューニングはできますが、Pre-Training まではできなかったり、PEFT は試せないとか制限が多いです。

### ChatGPT に次ぐ性能の高さ

読んで字のごとくです。
LLM は進化が激しいので時間が経てばより性能の良いモデルが出てくるでしょうが、2023 年の OSS モデルで最も性能が良いモデルは間違いなく Mixtral-8x7B でした。

### 推論が速い

これが Mixtral-8x7B の大きな特徴です。

この理由には以下の 2 つがあります。

- Mistral-7B と同じアーキテクチャ
- Sparse Mixture of Experts 

#### Mistral-7B と同じアーキテクチャ
Mistral-7B には以下の 4 つのアーキテクチャを採用していました。
これにより、性能を落とすことなく速度を出しています。

- Grouped-Query Attention
- Sliding Window Attention
- Rolling Buffer Cache
- Pre-fill and Chunking

詳しく知りたい方は以下を見てください。

https://qiita.com/kernelian/items/98be743010316d44e21e

#### Sparse Mixture of Experts とは

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  Mixture of Experts Layer の概要図\n(出典：Mixtral of Experts)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/68c5ba75-16f1-a01e-23d1-4d607ee675c1.png>
@enduml
```

Sparse Mixture of Experts は Expert 部分と Router 部分で構成されます。

Expert を日本語に訳すと「専門家」といったところで、モデルは推論時に、その問題に適した「専門家」を選択することで素早く良質な回答を返すことができます。

- 例
    - 「翻訳タスク」を依頼 -> 「多言語に強い Expert」を使って output を生成
    - 「多言語能力が必要な推論タスク」を依頼 -> 「多言語に強い Expert」と「推論に強い Expert」を使って output を生成

このような感じで、問題解決に必要な Expert のみを使って推論するので、Expert を全部闇雲に使って推論するよりも推論が早く、かつ性能もよく output が生成されます。

そして、どの Expert を使うかといった判断を担っているのが、Router 部分です。

なお、Sparse Mixture of Experts の "Sparse" とは、必要な Expert だけが選択され使われていることを意味しています。

#### Sparse Mixture of Experts の利点

Sparse Mixture of Experts の利点は次の 3 つです。

- 計算効率
    - 先述の通り。必要な計算のみ実行するので速い
- 特化した Expert
    - Expert が特定のタイプのタスクに特化できるので、性能が高い
- 拡張性
    - 新しい Expert を追加することで、モデルを容易に拡張でき、追加タスクやデータに対応できる

#### Mixtral-8x7B の Mixture of Experts

Mixtral-8x7B には、この Expert が 8 つ含まれています。先述の通り、推論時には必要な expert のみを利用するので、「**Mixtral-8x7B 自体は 47B のモデル**」だが「**推論時は 13B 相当のモデルとして機能する**」ようです。

なお、Mixtral-8x7B では、Expert の選択に Softmax 関数を用いた Top-K Gating を採用しています。この方法では、各 Token に対して選ばれた *K* 個の Expert が出力を行い、その加重和が最終的なレイヤーの出力となります。


## まとめ

以上が Mixtral-8x7B の解説でした。
私は Mixtral-8x7B のチューニングは試していませんが、Mixture of Experts の Expert 部分のみを個別でチューニングするとかなら、基盤が弱くてもいけるかもしれませね。

おわり。
Command R+ で elixir を学ぶ (その1）掛け算九九の表を作成

こちらで行ったことと同じことを[Command R+](https://huggingface.co/spaces/CohereForAI/c4ai-command-r-plus)で行いました。

## Command R+ で変換した結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/55e35246-a32d-2ebc-3b58-f7ecaf3bb743.png)


```elixir:multiplation.exs
#!/usr/bin/env elixir

IO.inspect "*** 開始 ***"

for i <- 1..9 do
  for j <- 1..9 do
    k = i * j
    IO.write "#{k} "
  end
  IO.puts ""
end

IO.inspect "*** 終了 ***"
```

実行結果
>まったくコードを変更しないで動かした結果です。

```text
$ ./multiplation.exs 
"*** 開始 ***"
1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 
"*** 終了 ***"
```
Postmanインストール

![Postmanインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/1b7cfb76-e6dc-eb81-de13-dea4c1814e86.png)

## 本記事で実現できること
Postmanをインストールする

## 簡単な解説
全部で3フェーズ

①下記URLからインストールを実行する。
[Install](https://www.postman.com/downloads)

![Postmanインストール (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/25f19796-36d2-9fbe-5108-e424cb09bb1e.png)

②ダウンロードからファイルを開くとデスクトップにPostmanがインストールされている

③Postmanを開き、
 アカウントを作成せずに使用する場合は[**Skip and go to the app**]　をクリック。
 アカウントを作成する場合は[Email]を入力して [**Create Free Acount**]をクリックする。

![Postmanインストール (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/6581f068-c9d9-c86f-1674-a0c372583cf2.png)


## まとめ
本稿が、Postmanインストールを行いたい方の参考になれば嬉しいです。

ITエンジニア向け、AWS資格取得を目指す方向けに個人ブログで記事も投稿していますので、
合わせて読んでもらえると嬉しいです。
[ことなの学校(個人ブログ)](https://kotona-school.com)

更によりレベル感の高そうなAWS関連の発信はZennの方で行います。
こちらももしよければフォロー、ご確認いただけると嬉しいです。
[Zenn個人アカウント](https://zenn.dev/tomo_itbizblog)

Twitterでも役立つ情報を発信しますのでフォローしてもらえると嬉しいです 
→ [@tomo_ITBizBlog](https://twitter.com/tomo_ITBizBlog)
【RSpec】APIを使うメソッドのテストでVCRを使う【Youtube Data API】

# はじめに
この記事ではポートフォリオ作成中に学んだことを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれませんが、その場合はご指摘いただけると幸いです。

# やりたいこと
- VCRを使ってAPIを使用しているメソッドのテストを書く

YouTube Data API v3を使用して動画情報を検索するヘルパーメソッドのテストをRSpecで書いていきます。
実装の詳細は下記の記事でまとめているのでよければご覧ください。
[【Rails】Youtube APIを使ってIDで動画を検索する](https://qiita.com/mnmnm_37/items/315033fd8a63f8aad4e8)

# VCRとは？
テストでのHTTP通信を1回目で記録しておき、以降のテストではその記録（カセットと呼ばれるyamlファイル）を使用することで通信の結果を再現してくれるgem。
2回目以降のテストは実際のHTTP通信を行わないため処理が早くなります。
また、APIを使用するテストにおいては何度テストを実行しても割り当てを消費しないというメリットがあります。

# やること
- gemのインストール
- 設定ファイルの作成
- テストの記述
- 機密情報を環境変数に書き換え

# gemのインストール
```ruby:Gemfile
gem 'vcr'
gem 'webmock'
```
webmockも一緒にインストールします。

## 設定ファイルの作成
公式ではspec/spec_helper.rbに追記していましたが、作成中のポートフォリオではspec/supportにcapybaraの設定ファイルを置いているのでvcrも同様に設定ファイルを作成します。

```spec/support/vcr.rb
require 'vcr'

VCR.configure do |config|
  config.cassette_library_dir = "spec/vcr"
  config.hook_into :webmock
  config.configure_rspec_metadata!
  config.default_cassette_options = { :erb => true }
  config.allow_http_connections_when_no_cassette = true
end
```

### 設定の内容
`config.cassette_library_dir = "spec/vcr"`
カセットの保存先を指定

`config.hook_into :webmock`
webmockを使ってHTTP通信をスタブ化

`config.configure_rspec_metadata!`
RSpecでvcrを使う時の設定

`config.default_cassette_options = { :erb => true }`
カセット内でerb形式の記述を使うための設定（環境変数を使用するため）

`config.allow_http_connections_when_no_cassette = true`
カセットを使用しないテストではHTTP通信を許可
これをfalseにするとvcrを使わない他のテストが一部通らなくなってしまいました。
<br>
なお、spec/support内に作成した設定ファイルを有効にするにはspec/rails_helper.rbの変更が必要です。

```spec/rails_helper.rb
Rails.root.glob('spec/support/**/*.rb').sort.each { |f| require f } #コメントアウトを外す
```

# テストの記述
```spec/helpers/bookmarks_helper_spec.rb
describe "#video_title" do
  it "渡されたIDを持つ動画のタイトルを返すこと", :vcr => "youtube_success" do
    expect(helper.video_title("HIgvP7B3Hg8")).to include "Runaway Baby"
  end
end
```

vcrを使いたいテストに __:vcr__ の記述を追加します。
自動的にカセット名をつけてくれるようですが、カセット名を指定して作成することもできます。（上記ではyoutube_successを指定）

# 機密情報を環境変数に書き換え

```
---
http_interactions:
- request:
    method: get
    uri: https://youtube.googleapis.com/youtube/v3/videos?id=HIgvP7B3Hg8&key=<%= ENV['YOUTUBE_API_KEY'] %>&part=snippet
    body:
      encoding: UTF-8
      string: ''
    headers:
･･･
```

初回のテストを実行するとこのようなカセットが作成されます。
上記の例ではヘッダーのURIにAPIキーが含まれていたので環境変数に書き換えました。
APIキーに限らずユーザー名・パスワードなどカセット内に機密情報が含まれる場合があるので要注意です。

カセット作成の際に機密情報をマスキングしてくれる __Filter sensitive data__ という機能もあるのですが、これを使ってAPIキーを環境変数に置きかえようとしたところ謎の改行が入ってしまったので自力で変更しました。

### GitHub ActionsでRSpecを実行する場合
- GitHubリポジトリのsecretsにAPIキーを登録
- ワークフローを定義しているファイルに環境変数を追記

```
env:
  YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
```
これでGitHub Actions上のRSpecでもカセットを使用してテストを実行することができました。


# 感想
できるだけ公式の情報を基に実装したのでドキュメントを読むのに時間がかかりましたが、その分理解して進められた気がします。
カセットの中身を見ることでリクエスト・レスポンスはこういうやりとりをしているんだな〜という勉強にもなりました。

# 参考
- [VCR documentation（公式）](https://benoittgt.github.io/vcr/#/)
- [gem VCRでweb mockを使う](https://qiita.com/Dai_Kentaro/items/05aea088c1d417f75ed3)
- [VCRでWeb APIのモックを楽しよう！](https://tech.actindi.net/2019/06/07/093705)
if文の条件部分で代入式があるけど？

# はじめに
[Railsチュートリアル](https://railstutorial.jp/ "Railsチュートリアル") でRailsの学習をしている中で
気になった箇所があったので知識整理も兼ねて調べた内容をまとめます。

## if文の条件で代入してる
以下のコードにてif文の条件部分にてある変数に代入している箇所がありました。
元々は session[:user_id] が存在すれ真の判定、存在しなければ偽の判定でした。

```ruby
if (user_id = session[:user_id])
  @current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.encrypted[:user_id])
  user = User.find_by(id: user_id)
  :
end

# 元々は以下のコードだった
# if session[:user_id]
#   @current_user ||= User.find_by(id: session[:user_id])
# elsif cookies.encrypted[:user_id]
#   user = User.find_by(id: cookies.encrypted[:user_id])
#   ：
# end
```
ですが、sessionメソッドやcookiesメソッドそれぞれ2回ずつ使用されていて、
処理が重複していまっているため、下記のような書き方で重複を避けています。
```ruby
if (user_id = session[:user_id])
```

あまり、見慣れない書き方だったのですが、
他の言語でもこのような書き方ができるみたいで言語によってはあまり推奨されていなかったりします。

(恥ずかしながら、Javaでも書ける知らなかった…)

## どうやって評価しているのか？
改めて、if文の条件の中では比較を行っているのではなく、代入を行っています。
ですが、代入を評価しているのではなく
代入した結果ユーザーIDが存在するかどうかを評価しています。

先ほどのコードを言葉にすると以下になるようです。

>「ユーザーIDにユーザーIDのセッションを代入した結果、ユーザーIDのセッションが存在すれば」
> 引用：[Railsチュートリアル](https://railstutorial.jp/ "Railsチュートリアル")

## 簡易的に実演してみる
簡易的にしてわかりやすくしてみました。
Rubyの真偽評価の前提としては以下があります。

:::note info
Rubyは `nil` や `false` 以外は真と評価されます
:::


以下のコードにて`1`の値を代入された`a`という変数をif文の条件部分で`b`に代入します。
変数`b`に`1`が代入された結果、Rubyではnilとfalse以外は真のため、
**「bの値にnilやfalse以外の値が代入された」** が出力されます。

```ruby
a = 1
if (b = a)
    puts 'bの値にnilやfalse以外の値が代入された'
else 
    puts 'bの値にnilやfalseが代入された'
end
# 出力：'bの値にnilやfalse以外の値が代入された'
```

変数`a`に`nil`または`false`を代入すれば、偽の判定になります。
```ruby
a = nil # またはfalse
if (b = a)
    puts 'bの値にnilやfalse以外の値が代入された'
else 
    puts 'bの値にnilやfalseが代入された'
end
# 出力：'bの値にnilやfalseが代入された'
```


## おわりに
`if (user_id = session[:user_id])` で書かれている意味、そういえばどんなだっけ :sweat_drops:
と思い調べましたが、知らないことだったので調べてよかったです。

`if (代入式) ` があればif文では代入した結果で評価していることがわかりました。
AWSエンジニアとしてのキャリアを築く

## はじめに
コラムとしてAWSエンジニアとしてのキャリアを築く上で、
やったこと、これからやりたいことを書く。
AWSエンジニアとして走り出したいエンジニアの参考になれば幸いです。
※個人ブログに後でまとめようかな
## AWS全冠をとる
AWS全冠をとる、これは個人として箔をつけるためにまずやっておきたいこと
但し、受験費用もかかる。
そのため、受験費用の補助や、資格手当が出る企業を選べるとモチベも上がりやすい
## AWSを含め技術発信を深める
Qiita、Zenn、SpeakerDeck、個人ブログなどで
些細な内容でも発信を続けていくと、発信慣れしてくる。
発信しながら、PDCAを回して改善を繰り返すと情報発信が早く、上手くなってくる。

## AWSパートナー企業で働く
AWSが躊躇なく使える企業で働くという意味でクラウドの部署がある一般企業より、
クラウドやAWSを専門としている会社があればそこに入るのが確実。

ただ、初心者から飛び込んで敷居が高い場合は、目当ての企業に最初から飛び込まず、
1社挟んで下積み期間で設計構築の実務経験を積むことを年齢とのバランスを見て
検討してみるのもありだと思う。


## AWSパートナー企業で働く　せっかくなら
プレミアティア認定を受けている企業で自分のAWS実務経験を高め、
技術発信の箔をつけて、更に高みを目指してみるといいかもしれませんね。

**★2024年4月現在、日本国内では15社の企業がプレミアティアの認定を受けています。**
- クラスメソッド
- アイレット
- サーバーワークス
- CTC
- SCSK
- NHNテコラス
- NTTデータ
- TIS
- NEC
- NRI
- 日立システムズ
- 富士ソフト
- 富士通
- TOKAIコミュニケーションズ
- BeeX

## 参考
https://qiita.com/ShiroT/items/9752d477606de8714f4a


## まとめ
本稿が、AWSエンジニアとしてのキャリアを築く上での参考になれば嬉しいです。

ITエンジニア向け、AWS資格取得を目指す方向けに個人ブログで記事も投稿していますので、
合わせて読んでもらえると嬉しいです。
[ことなの学校(個人ブログ)](https://kotona-school.com)

更によりレベル感の高そうなAWS関連の発信はZennの方で行います。
こちらももしよければフォロー、ご確認いただけると嬉しいです。
[Zenn個人アカウント](https://zenn.dev/tomo_itbizblog)

Twitterでも役立つ情報を発信しますのでフォローしてもらえると嬉しいです 
→ [@tomo_ITBizBlog](https://twitter.com/tomo_ITBizBlog)
flowbite-reactでスタイルが当たらない

# はじめに

flowbiteをRemixのプロジェクトに導入したのですが、うまくスタイルが当たらなかったのでまとめます

# 問題

以下のチュートリアル通りに設定をしたところボタンがうまく表示されませんでした
真っ白なボタンになってしまい、文字は表示されませんでした

https://flowbite.com/docs/getting-started/remix/

```ts
import { Tooltip, Button } from "flowbite-react";

export default function Index() {
  return (
    <div>
      <h1>Welcome to Remix</h1>
      <Tooltip content="Flowbite is awesome">
      <Button>
        Hover to find out
      </Button>
    </Tooltip>
    </div>
  );
}
```

# 解決方法

`flowbite`をアンインストールしたら解決しました
flowbite-reactが入っていれば問題なかったようです

https://github.com/themesberg/flowbite-react-template-remix/blob/main/package.json

https://flowbite-react.com/docs/guides/remix

# おわりに

とりあえず使ってみようかなと思います
Oracle Database の date 型への変換処理を Databricks へ移行する際の注意事項

## 概要

Oracle Database では文字型から Date 型へ変換する処理を Databricks に移行する際には、フォーマットを指定せずに変換可能なフォーマットが異なることに注意が必要です。

Oracle では、`yyyy-MM-dd`、`yyyyMMdd`、および、`yyyy/MM/dd`にいずれの日付形式でも data 型に変換ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/207e70a3-1cfc-1ba5-5a72-d4b1e1862be1.png)

それに対して、Databricks では、`yyyy-MM-dd`の日付形式でのみ data 型に変換ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c4b46813-ef39-7d1f-7206-98a5dc6e0426.png)

よって、Oracle Database では文字型から Date 型へ変換する処理を Databricks に移行する際には、フォーマットを明示する必要があるケースがあることに注意が必要です。仕様確認のコードと対応方法のコードを共有します。

## 仕様確認と対応方法

### Oracle Dataabse の仕様確認

```sql
WITH src AS (
    SELECT
        '2020-01-01' AS "date_str_yyyy-mm-dd"
        ,'20200102' AS "date_str_yyyymmdd"
        ,'2020/01/03' AS "date_str_yyyy/mm/dd"
    FROM
        dual
)
SELECT
    "date_str_yyyy-mm-dd" AS date_str
    ,CAST("date_str_yyyy-mm-dd" AS date) date_col
FROM
    src
UNION ALL
SELECT
    "date_str_yyyymmdd"
    ,CAST("date_str_yyyymmdd" AS date) date_col
FROM
    src
UNION ALL
SELECT
    "date_str_yyyy/mm/dd"
    ,CAST("date_str_yyyy/mm/dd" AS date) date_col
FROM
    src
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/207e70a3-1cfc-1ba5-5a72-d4b1e1862be1.png)

### Database の仕様確認

```python
%sql
WITH src AS (
    SELECT
        '2020-01-01' AS `date_str_yyyy-mm-dd`
        ,'20200102' AS `date_str_yyyymmdd`
        ,'2020/01/03' AS `date_str_yyyy/mm/dd`
)
SELECT
    `date_str_yyyy-mm-dd` AS date_str
    ,CAST(`date_str_yyyy-mm-dd` AS TIMESTAMP) date_col
FROM
    src
UNION ALL
SELECT
    `date_str_yyyymmdd`
    ,CAST(`date_str_yyyymmdd` AS TIMESTAMP) date_col
FROM
    src
UNION ALL
SELECT
    `date_str_yyyy/mm/dd`
    ,CAST(`date_str_yyyy/mm/dd` AS TIMESTAMP) date_col
FROM
    src
;
```

### Databricks での対応方法

```python
%sql
WITH src AS (
    SELECT
        '2020-01-01' AS `date_str_yyyy-mm-dd`
        ,'20200102' AS `date_str_yyyymmdd`
        ,'2020/01/03' AS `date_str_yyyy/mm/dd`
)
SELECT
    `date_str_yyyy-mm-dd` AS date_str
    ,CAST(`date_str_yyyy-mm-dd` AS date) date_col
FROM
    src
UNION ALL
SELECT
    `date_str_yyyymmdd`
    ,try_to_timestamp(`date_str_yyyymmdd`, 'yyyyMMdd') date_col
FROM
    src
UNION ALL
SELECT
    `date_str_yyyy/mm/dd`
    ,try_to_timestamp(`date_str_yyyy/mm/dd`, 'yyyy/MM/dd') date_col
FROM
    src
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2a260027-c064-bdf0-0b9f-154d56f5c0c2.png)
仮想環境を使う（venv）

下記内容の要約、一部環境でのエラー対応を追加
参考：https://camp.trainocate.co.jp/magazine/venv-python/

#### 1. プロジェクトディレクトリの作成
```
mkdir venv-test
```

#### 2. 作成したプロジェクトディレクトリに移動
```
cd venv-test
```

#### 3. Pythonのバージョン確認
```
python -V
```

#### 4. 仮想環境作成
    python -m venv [env]    
    
 []内が環境名。「env」や「venv」などが名称としては一般的
 →envフォルダが作成される

#### 5. 仮想環境の有効化
    env\Scripts\Activate.ps1
    
:::note alert
エラーが出る場合
    Set-ExecutionPolicy RemoteSigned -Scope Process
PowerShellの設定を変更
（今開いているPowerShellウィンドウのみ実行ポリシーを変更。管理者権限不要。）

参考：https://qiita.com/ryu22e/items/520b35db6a444d8289da
:::
    

#### 6. 環境内でライブラリインストールなど

#### 7. 仮想環境の無効化
仮想環境を使用しない場合や切り替える場合は、以下のコマンドを実行します。
    
    deactivate

#### 8. 仮想環境の削除
仮想環境を１から作り直したい場合などは、仮想環境を削除するか別名称の仮想環境を作成することを勧めます。仮想環境の削除については、仮想環境フォルダ（今回の場合はフォルダ名：env）を削除すれば完了です。
SPSS Modelerで外部要因時系列データから先行指数を探す

SPSS Modelerで目的変数に相関する外部要因時系列データから交差相関係数を求めて、先行指数を探してみます。


## 実行動画（5分25秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/OrhOw-HdCdk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


# データの読み込み
商品Aの売上が2014－01－01から毎月記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0512a0d7-eb6f-5127-1555-4b2f2f54cdd3.png)

この売上に関係のありそうな外部要因の時系列データからどの要因の時系列の相関が大きいかを探してみます。

以下には「平均気温」「原油価格」「株価指数」「長期金利」「消費者物価指数」などが、やはり2014－01－01から毎月記録されています（ダミーデータであり、現実のデータではありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7b630183-9955-e949-8824-7e50297843ee.png)

これらの外部要因候補のデータの何期前のデータが相関するのかを探していきます。

まず、「レコード結合」ノードで「date」をキーに結合します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fe89e5dc-1a50-b358-98e8-2c42110da1ff.png)

以下のように結合されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2f11c359-cbba-e806-ac08-6bb102829831.png)

# LAGデータの作成
「時系列」ノードで選択したフィールドに「平均気温」「原油価格」「株価指数」「長期金利」「消費者物価指数」を入力し、「スパン」を「3」にします。
各外部要因の過去3か月分の時系列的相関を調べたいという意図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/da672ac7-8d48-515e-dd80-af75d6c15fb1.png)

以下のように過去三か月のデータが列に展開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1d37eda4-836e-6ca3-8b9a-7512617fb138.png)

# 目的変数と説明変数の定義
「商品A売上」を「対象」（目的変数）として設定し、「時系列」ノードで作成した「平均気温」「原油価格」「株価指数」「長期金利」「消費者物価指数」の過去3か月の列を「入力」（説明変数）として設定します。「商品A売上」と各外部要因データとの交差相関係数を出してきたいと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e4bbe08d-dd25-e6ae-6756-0db0be0dfbd6.png)

# 交差相関係数を調べる
「データ検査」ノードを実行して、「相関T優位確率」を昇順に並べ替えます。
そうすると「商品A売上」との相関係数の絶対値が高い順に外部要因の時系列変数が並びます。

* 一番高いのは「平均気温__1」で0.719でした。1か月前の平均気温との正の相関が一番高いという意味になります
* 「原油価格__1」は-0.492でした。1か月前の原油価格と負の相関があるということです
* 「株価指数__2」とは0.458でした。2か月前の株価指数と正の相関があると出ています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bf1c130a-8128-a82e-ab7a-be926a6ff6fe.png)

グラフをダブルクリックするともう少し拡大してみることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/674a0845-cdeb-8b1b-8273-a1ba3ee99b2f.png)

このように過去の外部要因と「商品A売上」の相関が高いものは先行指数である可能性があります。
「平均気温__1」の相関係数が高いということは、気温が上がり始めると次月の売上があがり、気温が下がり始めると次月の売上が下がる傾向があるということです。

このように多くの外部要因候補の指標を入れて、その先行指数を一気に探すことができます。
また、今回は過去３か月としましたが、12か月分のLAGデータをつくれば年単位の周期性なども捉えられるかもしれません。


# サンプルストリームとデータ
#### サンプルストリーム
https://github.com/hkwd/spsssample/raw/master/240411%E5%85%88%E8%A1%8C%E6%8C%87%E6%95%B0/timeseriesRel2.str
#### サンプルデータ

https://github.com/hkwd/spsssample/blob/master/240411%E5%85%88%E8%A1%8C%E6%8C%87%E6%95%B0/01sales.csv

https://github.com/hkwd/spsssample/blob/master/240411%E5%85%88%E8%A1%8C%E6%8C%87%E6%95%B0/02ext.csv

* テスト環境
    * Modeler 18.5
    * Windows 11 64bit
pythonの __name__ == "main"の意味

#  `__name__ == "__main__"`の意味
参考

https://aiacademy.jp/media/?p=1669

関数用のファイル「test_m.py」、関数呼び出し用ファイル「call_m.py」
```py
#test_m.py
def sample():
    print(__name__)
    
sample()

#出力結果
__main__
```


```py
#call_m.py
from test_m import tax
sample()

#出力結果
test_m
test_m
```

モジュールの呼び出し(import)で出力したときに2回出力するのを防ぐ。
```py
#test_m.py
def sample():
    print(__name__)
    
if __name__ == "__main__":
    print(sample())
```
```py
#call_m.py
from test_m import tax
sample()

#出力結果
test_m
```
InDesingを使用することになりわかったこと

## InDesingは何がいいのか？
コンセプトが決まり、製本に向けて制作スタートです。
制作する本はB6サイズで、フランス装になります。
まずは、原稿を入稿できる形に整える作業からスタートです。
入稿する原稿は印刷屋さんによってそれぞれ異なりますが、拡張子は pdfをメインに指定されるところが多いです。さらに、印刷屋さんから文字切れや塗り色が切れないよう、塗りたし、トンボの設定、実際に印刷物を仕上げるためにデータ入稿に必要な基本用語の解説が入っていたりします。

入稿用の原稿は、もちろんWordで作れると書いてあるところもあります。さらに、表紙や画像の多い場合などIllustratorやPhotoshopの拡張子で受付けてくれるところもあります。
それなら、なぜInDesingはDTPに適しているのか調べてみました。

まず、同じAdobe製品のIllustratorやPhotoshopとは異なる点がいくつかあります。
小説など長文で同じ仕様のページを連続して作る場合、ノンブルはマスターページで設定すれば自動で番号が入り、統一したページレイアウトを作れます。連続したページ制作をする際、Indesingはこの辺りを得意としているようです。
また、原稿用紙のような枡目（グリットフォーム）を使用すると、文字サイズ、文字幅、１行に入れられる文字数、行間など設定できるので、１ページに決まったボリュームの文書を入れるとき、便利です。
実際にInDesignを使用してみてわかったことは、新規作成時の時に塗りたしの設定ができ、さらにPDFへ書き出す際に、トンボを自動で追加できます。
文字切れを防ぐためのガイド線は自分で作成することにはなりますが、これもマスターページに設定すればマスターページを使用したページは反映されます。とにかく印刷時に切れたり、ズレたりするのを防ぐために必要なトンボの設定がスマートにできるので安心です。
印刷屋さんにもよりますが、トンボやノンブルの設定は、出来上に影響するので丁寧に解説しているところが多いです。

### 入稿データを制作するまで知らなかったこと
A4の紙に、四方余白を設定する。
これはWordで文書を作成したことのある人なら容易に想像できると思います。
しかし、書籍の入稿データを作る際、紙面の余白は、上下・左右4箇所に名前が付いています。
上下の余白は、「天・地」と呼ばれ、紙面左右の余白にも名前があります。見開きでページが隣接する部分の余白は、「のど」外側を「小口」と呼びます。
これらを総称してマージンとも表現されます。
その他、ページ番号は「ノンブル」で一般にヘッダー、フッターと言われる部分に入れる文字は「柱」と呼ばれています。
柱は、章立てや見出しなど入ることが多いです。

### マスターページ（親ページ）を作る
マスターページの主な役割は以下の通りです。

1. **一貫性のあるデザインの実現**
   - マスターページに柱、ノンブル、グリッドレイアウトなどを設定することで、すべてのページに同じデザイン要素を適用できます。
   - 文書全体で一貫性のあるレイアウトを実現し、ブランディングにも役立ちます。

2. **効率的な作業**
   - 1度マスターページを設定すれば、個々のページはそれを活用して作成できます。
   - もし、レイアウトに変更がある場合も、マスターページ上で編集すれば同期して全ページに反映されます。
   - 作業効率が良いです！

3. **エラーの低減**
   - マスターページ上の設定を変更すれば、個々のページ設定に影響を与えずに全体を統一できため、手作業による設定ミスのリスクが低減されます。

4. **複数マスターの利用**
   - 文書内で複数のマスターページを使い分けることが可能。マスターページを基に複数作ることができます。例えば、同じのど・小口、地でも天のマージンだけ変更をしたい場合は、元のマスターページを基に新たに天のマージンを変更したものを作成できます。
   - 章ごとや用途ごとにデザインを変えられる柔軟性があるも特徴です

マスターページの適切な活用により、大規模な出版物でも品質とデザインの一貫性を保ちながら、効率的で間違いの少ない作業が可能になります。

### ページ全体のレイアウト
今回の制作は詩集なので、行間は広めに設定します。
縦書きで行間・字間を広めに設定します。
文字数にかなりばらつきがあるため、余白パターンは２つ設定しました。
つまり、マスターページは２種類です。

マスターページは
グリットレイアウトで行数や文字数、行間など設定し、ノンブルの位置を決めました。
実際にWordの原稿を流し込むのはこの上にグリットフォーマットというものを作ります。
レイアーのようにグリットレイアウトは、グリットフォーマットの上に重ねるイメージです。このグリットレイアウトを設定していないと、グリットフォーマットをいくら設定しても同じように行間も文字間も、フォントも設定されません。
この仕組みが分からず、しばしグリットレイアウトに入れた文字が枡目に収まらない自体が起きました。これは、まるでモゴモゴと、障害物競走の網の中で身動きが取れない状態のような気分でした。

## まだまだ、調べたいこと
見出しなど特定の文章を統一するのに便利⁈と言われる、段落スタイルとは？
文字スタイルと、段落スタイルの違いは？

入稿データを作る道のりはまだ長そうです。

## 気がついたこと
アテもなく行った日曜午後の図書館。
ここにInDesingの本があったので借りてきたのがラッキーでした。この本を読んで、いろいろ調べると分からないことがわかり、取りかかりやすかったです。
これは、やり方を教えてもらうのとは異なり、獲得していく感じです。
また、InDesingの使い方など動画を見て練習するのもいいかもしれませんが、実際に作ってみたい原稿があると「知りたい」と、望むことがはっきりしているので習得しやすいと思いました！
同時に、動画解説は、ノンブルを中央配置にしたいなど、細かいポイントは動画解説に助けられました。
Renovateで特定ライブラリの特定バージョンだけスキップ・除外する

# 例

正規表現の否定を書いて頑張れば良いようだ

例: npm の eslint の `8.57.0` と `8.57.1` をスキップする場合

```json
  "packageRules": [
    {
      "matchManagers": ["npm"],
      "matchPackageNames": ["eslint"],
      "allowedVersions": "!/^8\\.57\\.0|8\\.57\\.1$/"
    },
  ]
```


# チャットメンバー募集


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

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


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
docker container exec -it apache/bin/bashしたらrequires at least 2 argumentsと言われた。

dockerイメージをbuildするべくDockerfileを起動させようと、dockerの中に入ろうとして

```
$docker container exec -it apache/bin/bash
```

したら

```
"docker container exec" requires at least 2 arguments.
See 'docker container exec --help'.

Usage:  docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]

Execute a command in a running container
```

「引数を最低2つ以上設定せよ」

とのこと。
よく見ると
apache/bin/bash
となっていたので
apache /bin/bash
に書き換えて

```
$docker container exec -it apache /bin/bash
```
したら

```
root@8ebdbaaac367:/# 
```
成功。
iOS 14以降、UICollectionViewのscrollToItem(at:at:animated:)メソッドは特定の状況下で壊れる


問題を回避するには、以下のように`scrollToItemメソッド`の前にページングを `false` に設定し、その後 `true` に戻します。

```swift
self.collectionView.isPagingEnabled = false
self.collectionView.scrollToItem(at: indexPath, at: .left, animated: false)
self.collectionView.isPagingEnabled = true
```

[参考](https://forums.developer.apple.com/forums/thread/663156)
Pardot データモデル (+ オブジェクトの配置)


+ [アカウントエンゲージメント (Pardot) は Salesforce プラットフォーム上にありますか?](https://qiita.com/Keiji_otsubo/items/319c5194fef75bc910cf)
+ [Salesforce アーキテクト向けのアカウントエンゲージメント (Pardot) の概要](https://qiita.com/Keiji_otsubo/items/c0f59b89792dba9df5a2)
+ [Guide to Pardot Custom Objects – What You Can and Can’t Do](https://www.salesforceben.com/guide-to-pardot-custom-objects-what-you-can-and-cant-do/)
+ [How to Use Custom Object Fields in Pardot HML](https://www.salesforceben.com/how-to-use-custom-object-fields-in-pardot-hml/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b7db7b95-ca3b-ddfa-780c-55bc006c9ac4.png)


# Pardot側にしかないオブジェクト

+ [AEメール最適化配信結果の配信時間をカスタムレポートで集計したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLCyf)


サポートにも問い合わせた結果もAccount Engagement レポートからの確認、あるいは API での開発の方法とのことでしたので

他に同様の目的を持った方のためにログを残しておきます。

ーーーーーーーーーーーーーー

プロスペクト単位の送信時間の取得方法は以下いずれかであり、標準機能では Salesforce レポートでの閲覧ができかねることを確認しております。

 

・[Account Engagement レポート] タブ | [メール] | [リストメール] より対象のリストメールを選択のうえ、[送信総数] 横のリンクをクリック

・Account Engagement API を使用する

 

Email Object にてプロスペクト毎の送信日を取得いただけますが、Visitor Activity Object を使用して、type を 6 - Sent に指定いただいたうえで、createdAt（アクティビティの作成日＝送信日）の日付を確認することも可能でございます。

 

参考：Email Object

https://developer.salesforce.com/docs/marketing/pardot/guide/email-v5.html

参考：Visitor Activity Object

https://developer.salesforce.com/docs/marketing/pardot/guide/visitor-activity-v5.html

 

拡張メール（メールコンテンツから送信するメール）は Account Engagement からメールが送信されますため、Account Engagement にのみ記録される情報がございます。

あいにくでございますが、ListEmail オブジェクトから参照可能な項目は以下開発ドキュメントに記載の項目のみであり、プロスペクト単位の送信日は参照いただくことができかねます。

 

参考：ListEmail

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_listemail.htm
AWS Lambda LayersでError importing numpy: you should not try to import numpy from its source directory

# AWS Lambda LayersでError importing numpy
AWS Lambda Layersでlangchainを使おうとして以下のエラーが発生しました。

```
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python interpreter from there.
Traceback (most recent call last):
```

Keith's Layers (Klayers) のnumpyをレイヤーに追加して解決する。

## numpyのARNを確認

### Klayersへ遷移

https://github.com/keithrozario/Klayers/?tab=readme-ov-file#list-of-arns

### 対象Pythonバージョン選択

例えば、`Python 3.12`を選ぶと以下が開きます。
https://github.com/keithrozario/Klayers/tree/master/deployments/python3.12

### 対象Region選択

例えば、`ap-northeast-1` `Asia Pacific (Tokyo)`の`html`を選ぶと以下が開きます。
https://api.klayers.cloud/api/v2/p3.12/layers/latest/ap-northeast-1/html

### 対象パッケージARNコピー

今回は`numpy`の`arn`をコピーします。

## レイヤー追加

あとはAWS Lambdanの対象関数へ戻り、`レイヤー` `レイヤーを追加` `ARN を指定` でコピーしておいたARNを貼り付けて`追加`すればOK。
Group と User のパーミッションを合わせる

グループのパーミッションは基本的にユーザーよりも絞られている。グループにはユーザーと同じパーミッションを与えたいときに大変。

そういうときは `=` を使う

## 対象のみ

```
chmod g=u file
```


## 再帰

```
chmod -R g=u directory
```


# 参考

* https://ja.manpages.org/chmod
ServiceNow注目記事3選（2024/03-LinkedIn）

#### こんにちは。
ServiceNowの情報を様々な情報源から検索していますが、私個人としては、参加者の数と質の両方で最も優れたツールはLinkedInです。LinkedInには主に英語圏のユーザーが多く、CTA（Certified Technical Architect）、CMA（Certified Master Architect）、Community MVPなど、名だたる実力者たちが有益な投稿を行いながら交流しています。

私自身も興味深いと思った記事を適宜リポストしていますが、その中で特に反響が大きかった投稿を3つご紹介したいと思います。

社内のSlackでも共有している情報ですが、オープン情報ですので、知見を共有する意味ではこちらでもよいのかと思いまして。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/c8fae895-dced-12f3-176e-cd76909c7272.png)

(2024/3)
1.[:globe_with_meridians::globe_with_meridians::globe_with_meridians: IT Operations Management ➡ data models :globe_with_meridians::globe_with_meridians::globe_with_meridians:](https://www.linkedin.com/feed/update/urn:li:activity:7168262145917214720/)(3235 PV)
2.[Empower your IT infrastructure with ServiceNow Discovery! :globe_with_meridians::sparkles:](https://www.linkedin.com/feed/update/urn:li:activity:7176629253067706368/)(1260 PV)
3.[Time-limited User Roles : Washington DC Release Updates](https://www.linkedin.com/feed/update/urn:li:activity:7172525791807827968/) (1069 PV)

### 概要
#### 1.:globe_with_meridians::globe_with_meridians::globe_with_meridians: IT Operations Management ➡ data models :globe_with_meridians::globe_with_meridians::globe_with_meridians:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/715a0e7d-51eb-c0c7-5a84-395c70f0c2c7.png)
→個人的にはService Mappingが他社製品の買収からプラットフォームに機能を組み込んでアプリケーションとして販売提供している、というSNowのMA戦略を知って驚いたのが最初の気づきでした！

#### 2.Empower your IT infrastructure with ServiceNow Discovery! :globe_with_meridians::sparkles:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/0e5b0dee-cac8-6b0f-362c-f84f372a7c1e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/54e0dff8-6751-cd14-288c-9a640f441d6e.png)
→Discoveryとはなにで、メリットは何かということが簡潔にまとまっていました。

#### 3.Time-limited User Roles : Washington DC Release Updates
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/89035792-2ebc-a2bd-859e-160d1d2064c7.png)
→Washintonリリースの（地味に）一番神アップデートである時間制限付きのアドミン付与です。運用現場にいたエンジニアならわかると思うのですが、Admin権限付与ポリシーって厳しいですよね。この機能があれば、厳格なポリシーをシステム的に緩和されて、顧客・開発・運用の三方良しの神アプデだと思います。
ZED SDK でcustom detectorを使う

## 想定する読者
stereolabsのzed2, zed mini, zed x などのステレオカメラの利用者
いまどきのステレオカメラは何ができるのかを知りたい人

## 前提
ZED SDK 4.0
Ubuntu 20.04
ZED2i
Python 版のAPI

### 注意： ZED SDK 4.1 がリリースされています。
このドキュメントはまだZED SDK 4.0 でしか検証していません。


## 既に用意されているcustom detector
- zed sdk 4.0をインストールしてあり、上記のバージョンで
- `git clone  git@github.com:stereolabs/zed-sdk.git` してあることを前提とした記述です。
- `./object detection/custom detector/python/pytorch_yolov8/`
- `./object detection/custom detector/python/pytorch_yolov5/`
- 実行のしかた
```
$ python3 detectory.py
```
これで、COCO　80 カテゴリでの物体検出が可能になっています。

## それ以外の検出器でのOpenCVの画像形式での物体検出
ZED SDKでは標準の物体検出の他に、yolov5でもyolov8 でもないcustom detector　を用いた物体検出が可能です。(yolox を使いたい人もいるでしょう。)
OpenCVと同じデータ形式で画像が扱えるのですから、
GPUの使えるライブラリで物体検出ができるのは当然なことです。
TensorRTが使えるのですから、TensorRT化した重みファイルを使って推論を行うと、
変換前の重みファイルを使って推論する場合よりは高速化できます。
```
cvimg = image_left.get_data()
```
のようにして取得した画像cvimgは、opencvの画像なので、channel数を3にしてRGBもしくはBGRのその検出器が必要とするデータ形式にしたうえで、推論を実行させます。
その結果を以下に述べるようにZED SDK に渡してやることができます。

## ZED SDKだからこそできること
#### 空間としての解釈・点群との連動・世界座標系との関係
- ステレオカメラであるZED2i を使っているのだから、検出結果を空間として理解したいよね。
- 標準の検出器で結果を3Dとして解釈しているのだから、カスタムの検出器でもできることを期待します。
- そう、カスタムの検出器でもできるんです。
- 

## カスタムモデルの検出器を用いた場合の例題

```.py:
# 2Dでの検出情報を、ZED SDKでのデータ形式の変換する。
# - 次の関数は、使用している検出器の戻り値によって異なります。
# -関数の戻り値はsl.CustomBoxObjectData型のリストになります。
detections = detections_to_custom_box(det, image_net)
# 変換した結果をZED SDKに渡す。
zed.ingest_custom_box_objects(detections)
# zed.retrieve_objects()の実行
zed.retrieve_objects(objects, obj_runtime_param)
# このようにすると,objectsの中に対応するデータが得られます。
```

### sl.CustomBoxObjectData型
このデータ構造は、2Dの検出器での検出結果をZED SDK に渡すときに用いるデータ形式です。
```
class CustomBoxObjectData(builtins.object)
(中略)
 |  bounding_box_2d
 |      CustomBoxObjectData.bounding_box_2d: np.array[int][int]
 |  
 |  is_grounded
 |      CustomBoxObjectData.is_grounded: bool
 |  
 |  label
 |      CustomBoxObjectData.label: int
 |  
 |  probability
 |      CustomBoxObjectData.probability: float
 |  
 |  unique_object_id
 |      CustomBoxObjectData.unique_object_id: str
```

### 3Dとして解釈し直したあとのデータ型
sl.ObjectData　型
bounding_box　# 直方体としてのbounding boxです。8点の空間座標があります。
dimensions  # その座標系と単位での物体のbounding boxの大きさになります。

viewerの適切な設定をすれば、top_view での物体の配置を可視化することができます。

詳しくは
[ZED SDK を使いこなす object](https://qiita.com/nonbiri15/items/9d8550fb3ab5242c1eae)