OmniAICreator/Qiita-1.07M huggingface dataset:
物の名前スパっと出てきますか？

![10 Best AI (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459001/68ea62d0-846e-6408-3907-fb9fb4529520.png)


## 物の名前
皆さんは、物の名前ってスパッと思い出すことできますか？
私の身近だと、パートのおばちゃんに _「●●使って！」_ と頼むと *「●●ってどんなのでしたっけ？」* と
伝わらないことが多々あります。業務の都合上、電話口だけで伝えなければならないときが多くその際は<b>さらに難易度が上がります。</b>
*「黒色で～どこどこに置いてあって～」* と伝えるのは大変です…。

## LINE Botが教えてくれたら便利では…？
本来であれば、直接聞いて貰ってコチラが教えて上げられるのであればベストですが
前述したとおり常にそうとも限りません。パートさんが一人で作業しているときでも名前を教えてもらえた方がいいですよね。
<b>そこで…！</b>
前回に引き続きLINE Botさんに活躍していただき
AI判別機能を駆使した業務改善に役立つかもしれないツールを作ってみましょう。

## 出来上がったものがコチラ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">名前を教えてくれてありがとう。　<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/eK7sg0J6Zv">pic.twitter.com/eK7sg0J6Zv</a></p>&mdash; ok-93 (@ok931024869) <a href="https://twitter.com/ok931024869/status/1681449713432952832?ref_src=twsrc%5Etfw">July 18, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 使用ツール
<ul>
<li><a href="https://nodered.org/">Node-RED</a>
<li><a href="https://teachablemachine.withgoogle.com/">Teachable Machine</a>
<li>LINE Bot
</ul>

## 作り方
#### 下準備
判別させたい物を被写体にして、判別モデル用の画像を用意する必要があります。
今回私は判別させたい物を動画で撮影⇒画像に変換⇒Teachable Machineでトレーニングという流れを踏みました。
![スクリーンショット 2023-07-19 090145.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459001/ba1373bf-674e-c034-6040-54d6bd7f5f2b.jpeg)

#### Node-REDのフロー全体図
![スクリーンショット 2023-07-19 084601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459001/d1e26ee1-5d24-7fd8-612f-ecfda8198a8a.jpeg)
各ノードの設定は下記記事を参考に設定しました！先人の知恵に感謝。
<ul>
<li><a href="https://qiita.com/kuma_ssss/items/098715c74c087a19aa65">Teachable Machineを使ってLINE Botを作成！機械学習AIに初めて触れてみました^^</a>
<li><a href="https://blog.enebular.com/event/noncoding-machine-learning/">ノンコーディングで機械学習を体験</a>
</ul>

## 最後に
今回はNode-REDというローコードツールとTeachable Machineという機械学習AIを用いた
業務改善に役立つかもしれないツールを作ってみました。
今回作成してみて、機械学習AIの活路やツール同士を組み合わせたことによる
便利さに改めて気が付かされました。
もっと知識を深めれば色々なことが比較的簡単に作成できそうですね…！

また今回作成したものを職場でお披露目してみたのですが
*「そんなの作れちゃうの！？」* 
 *「そんなこと出来てなんで今の部署にいるの！？」* 
とまで言われちゃいました笑
*「画像判定の速度がもう少し早ければ本当に使えそう！」* 
といった具体的なフィードバックも頂けました。これについてはTeachable MachineとNode-REDの組み合わせ上、短縮が難しそうに見えますが何か方法がないか調べてみます。

いずれにしても、思っていた以上に皆さん驚いてくれて自分がすごいことを成し遂げたようで照れくさくなっちゃいました笑
OneDriveが関係するエラー（主にインストールの失敗）

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [Identity Connect v 7.1.5 fails to run](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000078S7mX)

:::note alert
Using LOGGING_CONFIG: -Djava.util.logging.config.file=/c/Users/nholland/OneDrive - armacell.com/Desktop/salesforce_identity_connect_v7.1.5/salesforceIdConnect/conf/logging.properties

Error: Could not find or load main class org.forgerock.openidm.launcher.Main

Caused by: java.lang.ClassNotFoundException: org.forgerock.openidm.launcher.Main
:::

:::note
Are you using OneDrive?

I think the program may not be able to reference it correctly.

There is a case where the shortcut could not be created successfully due to OneDrive even when installing the data loader.

One workaround at the time was:

Can you stop the OneDrive sync for 24 hours, fully uninstall the Data Loader and try installing it again?
:::
Gitでdiffを渡すときに最低限必要な3つのコマンド

# はじめに

会社ではトランクベース開発をしているのですが、どうしてもGitにPushしてしまうと問題が起きてしまうコードなどが存在します。そこでdiffとして`patch`を出力してもらいapplyすることで対応しています

そんな中でやり方を毎度聞いてしまうので個人的にメモとしてまとめます

# diffを渡す手順

## 1. ステータスを確認する

```
$ git status
ブランチ main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
watanabejin@watanabejin-ThinkPad-P1-Gen-5 ~/workspace/git_diff_handson (main) 
$ git add .
watanabejin@watanabejin-ThinkPad-P1-Gen-5 ~/workspace/git_diff_handson (main) 
$ git status
ブランチ main
Your branch is up to date with 'origin/main'.

コミット予定の変更点:
  (use "git restore --staged <file>..." to unstage)
        modified:   test.md

watanabejin@watanabejin-ThinkPad-P1-Gen-5 ~/workspace/git_diff_handson (main) 
$ git status
ブランチ main
Your branch is up to date with 'origin/main'.

コミット予定の変更点:
  (use "git restore --staged <file>..." to unstage)
        modified:   test.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test2.md
```

現在の状態は

`test.md`が`commit`
`test2.md`が`add`

されている状態です。

ここですべてのdiffを出すためには、`test.md`をコミットからおろして、`add`した状態にする必要があります。

# 2. commitをやめる

```
$ git restore --staged test.md
$ git status
ブランチ main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.md
        modified:   test2.md

no changes added to commit (use "git add" and/or "git commit -a")
```

`git restore --staged <file名>`でコミットからおろすことができました

# 3. すべてaddされているか確認

`diff`をだすには差分を出したいファイルがすべて`add`されていないといけないのでaddされているか確認します

# 4. diffを出力

```
$ git diff --cached > file_name.patch
$ xdg-open .
```

`xdf-open`することでpatchを共有しやすくなります (現在のディレクトリが開きます)

# おわりに

備忘録程度にまとめてみました。
聞く前に自分で参考にしたいとおもいます
MetaとMicrosoftが提携し、「Llama 2」をリリース



本日、MicrosoftはMetaとの新たなパートナーシップを発表し、商用および研究目的の両方を目指した次世代の大規模言語モデル「Llama 2」をリリースすることを発表しました。

## バリエーション
Llama 2は、3つのバリエーションで展開され、それぞれ7Bから70Bのパラメータを持っています。これらのモデルは2兆個のトークンで学習されており、Llama 1よりも2倍のコンテキスト長を持っています。また、これらのモデルは100万以上の人間のアノテーションで微調整されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/76e25d76-6bee-b532-efca-71e057dc7e42.png)


## ベンチマーク
Llama 2は推論力、コーディング、熟達度、知識テストなど、多くの外部ベンチマークにおいて他のオープンソース言語モデルを上回っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/85c054f4-7411-5dd1-5938-1a1383cbfe29.png)

## モデル
Llama 2モデルは2兆トークンで学習されており、Llama 1のコンテキスト長は2倍になっています。さらに、Llama-2-chatモデルは100万以上の新しい人間のアノテーションで学習されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/6430fa79-f626-7373-a3b0-240a79b13352.png)


Llama-2-chatは、安全性と有用性を確保するために、人間のフィードバックから強化学習を使用しています。Llama-2-chatのトレーニング：Llama 2は公に利用可能なオンラインデータを使用して事前に学習されます。その後、教師あり微調整を使用して、Llama-2-chatの初期バージョンが作成されます。次に、Reinforcement Learning from Human Feedback（RLHF）を用いてLlama-2-chatが反復的に洗練されます。これには、棄却サンプリングと近接方策最適化（PPO）が含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/0cbbbc6a-1c52-4c21-3df0-81af309e1fbd.png)

モデルのダウンロード：
https://ai.meta.com/resources/models-and-libraries/llama-downloads/


参照：
https://ai.meta.com/llama/
Rmarkdownを利用して、ggplotで書いたグラフ１枚１スライドのパワポを作りたい。

Rmarkdownを利用して、forループ内ggplotで書いたグラフ１枚１スライドのパワポを作りたい。

R-wakalangで聞いたところ、良い回答を貰えたので備忘録的に貼っておく。
tnkkntさんありがとうございました。

```R
##チャンクオプション {r setup, include = FALSE}
library(knitr)
knitr::opts_chunk$set(cache = FALSE, dev = "svg", dpi = 300)
library(tidyverse)
```

```R
##チャンクオプション {r eval=TRUE, echo=FALSE, message=FALSE, warning=FALSE, results="asis"}
for (i in 1:10){
    slide_title <- paste0("## 第", i, "節\n\n")
    cat(slide_title)
    dat <- rnorm(10, mean = i)
    df <- data.frame(id = 1:10, dat)
    p <- ggplot(df, aes(x = dat)) + geom_histogram()
    print(p)
    cat("\n\n")
}
```
results="asis"を使うことで、テキストを生の Markdown として出力することができる。生のMarkdownに改スライドを入れておけばループでスライドが切り替わる。
とてもcoolですね。
neovim + packer の rocks オプションでインストールに失敗するときの対処

## 備忘録
同じことでまた悩みたくない、またそういう人たちを見たくない...

## ことの発端
私は macOS で neovim を使っています。
```zsh
❯ system_profiler SPSoftwareDataType
Software:

    System Software Overview:

      System Version: macOS 13.4.1 (22F82)
      Kernel Version: Darwin 22.5.0
      Boot Volume: Macintosh HD
      Boot Mode: Normal
      Computer Name: GoichiMacBook
      User Name: Goichi Iisaka (goichiiisaka)
      Secure Virtual Memory: Enabled
      System Integrity Protection: Enabled
      Time since boot: 24 days, 21 hours, 46 minutes
```

```zsh 
❯ rtx list
deno   1.35.1  ~/.config/rtx/config.toml latest
go     1.20.6  ~/.config/rtx/config.toml latest
lua    5.4.6   ~/.config/rtx/config.toml latest
neovim 0.9.1   ~/.config/rtx/config.toml latest
node   20.4.0  ~/.config/rtx/config.toml latest
pdm    2.7.0
python 2.7.18  ~/.config/rtx/config.toml 2.7
python 3.8.17  ~/.config/rtx/config.toml 3.8
python 3.9.17  ~/.config/rtx/config.toml 3.9
python 3.10.12 ~/.config/rtx/config.toml 3.10
python 3.11.4  ~/.config/rtx/config.toml 3.11
```


neovim で [jakewvincent/mkdnflow.nvim](https://github.com/jakewvincent/mkdnflow.nvim) を使いたくて、
リポジトリのREADME.md にあるとおりに、

```lua
  use { "jakewvincent/mkdnflow.nvim",
    rocks = "luautf8", -- Ensures optional luautf8 dependency is installed
    config = function() require("mkdnflow").setup() end
  }

```
と書いて　`:PackerSync` を実行すると変なエラーがでてしまいました。

```
packer.nvim] [ERROR 19:32:52] luarocks.lua:104: Failed to install hererocks: {
[packer.nvim]   exit_code = 1,
[packer.nvim]   signal = 0
[packer.nvim] }
```
プラグイン自体はインストールできるのですが、
エラーは消えない...

調べていくうちに　LuaJIT の [Issue764](https://github.com/LuaJIT/LuaJIT/issues/764)
にたどりつきました。
そもそもhererocks が失敗しているらしく、ビルドしなすと何事もなく通りようになりました。

```
❯ ls ~/.cache/nvim/packer_hererocks
2.1.0-beta3	hererocks.py

❯ export MACOSX_DEPLOYMENT_TARGET=13.4
❯ python3 ~/.cache/nvim/packer_hererocks/hererocks.py \
  --verbose -j 2.1.0-beta3 -r latest \
  ~/.cache/nvim/packer_hererocks/2.1.0-beta3

```

つまるところ、MACOSX_DEPLOYMENT_TARGET を設定しないといけない。
これは、難しいわ...
NFTについて（応用例と可能性）

# アート業界でのNFTの活用
これまでデジタルアート作品はいくらでも複製可能であり、それぞれが同じものであるというふうに考えられてきました。
ですが、NFTを使うことによってデジタル作品であっても固有のIDをつけることができるようになり、唯一性を付与することができるようになった。

**●実際の例**
2021年3月、ビープルというアーティストの作品「Everydays: The First 5‌0‌0‌0 Days」が、クリスティーズ・オークションにおいて約75億円で落札されました。
当時ものすごく話題になったので、知ってる方も多いのでは...?

前回の記事でも軽く触れていますが、アーティストはNFTの販売によって直接的な収益を得るだけでなく、転売時にも自身へのロイヤリティを受け取ることができる特典を設定することも可能です。これにより、アーティストの活動を支援し、収益の共有を促進することができます。

また、アーティストやクリエイターは、NFTを使用してデジタルアセットを限定版として発行することもできます。これにより、ファンやコレクターに独自性のあるデジタルアセットを提供し、需要と価値を高めることができます。

# ゲーム業界でのNFTの活用
また、NFTの活用の場として、大きく注目されたのがゲーム業界です。
国内外のゲーム業界においてNFTは活用され、ゲーム上のキャラクターやアイテム、土地などが売買できるようになりました。

**●NFTゲームの特徴**
・手に入れたアイテムがなくならない
・初期投資がかかる場合がある
・チート行為が起きにくい

*○手に入れたアイテムがなくならない*
NFTゲームでNFTとなっているアイテムなどは、もしそのゲームのサービスが終了しても、ゲームの外に持ち出して保有し続けることができる。

*○初期投資がかかる場合がある*
NFTゲームで実際に稼ぐためにはアイテムの購入などで「初期投資」が必要な場合が多い。初期投資無しでも始めることができるゲームもあるが、その場合稼ぐと言うNFTゲームの醍醐味を体験することのハードルはあがる。

*○チート行為が起きにくい*
不正に強いブロックチェーン技術を基盤にしてつくられているため、チート行為が起きにくくなっている。


# 不動産やライセンスなどの実世界資産におけるNFTの活用
NFTは、実世界の不動産やライセンスなどの資産のデジタル化にも応用されます。

例えば、不動産のNFT化によって、分割所有や投資のしやすさが向上します。複数の投資家がNFTとして発行された不動産の一部を所有し、その不動産の収益や価値の変動に応じて収益を分配することができます。

また、NFTを使用することで、ライセンスや知的財産権の管理が効率的に行われます。例えば、音楽や映画のライセンスをNFTとして発行することで、そのライセンスの所有権や使用権限を透明かつ確実に管理することができます。

これにより、ライセンスの取引やロイヤリティの支払い、著作権の保護などが容易になり、クリエイターと利用者の間での信頼性と公平性を高めることができます。

# まとめ
NFTは様々な分野で既に活用が進められています。まだ、生活には馴染みのないですが、今後主流になってくる技術だとしたら、最低限の知識は今のうちから学んでおきたいなと思いました。
安いNFTアートとかだったら、買ってみるのも面白そう...

最後まで読んでいただきありがとうございました！
顧客IDでテーブルを結合し重複する２つの列を比較する(SPSS Modeler データ加工逆引き6-9)

# 顧客IDでテーブルを結合し重複する２つのフィールド（列）を比較する

![スクリーンショット 2023-07-18 14.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/daa4a2a7-f2b4-9138-8100-9767c6f8b836.png)

## 1.想定される利用目的

・顧客データの時系列変化
・設備データの時系列変化

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/rank_transition.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-07-18 14.42.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4e4c8f17-1528-22cb-6f7e-fc570f459fa6.png)

a.入力するデータひとつ目は以下の通りです。2022年の顧客ランクが記されています。
![スクリーンショット 2023-07-18 14.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ab03b802-7e83-a7c7-5c1b-dc9a8b949f71.png)


b.入力するデータふたつ目は以下の通りです。2022年の顧客ランクが記されています。
![スクリーンショット 2023-07-18 14.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2da5f93f-fad2-f281-10a8-7acb8f2bfcaa.png)

c.[フィルター]ノードを編集します。FY列を削除してrank2022とフィールド名を変更。
![スクリーンショット 2023-07-18 14.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/39812025-9942-9f6e-81b0-6cb309d53333.png)

d.[フィルター]ノードを編集します。FY列を削除してrank2023とフィールド名を変更。
![スクリーンショット 2023-07-18 14.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5252501c-5294-704a-238d-52cae4d3ea92.png)

e.[レコード結合]ノードを編集します。
![スクリーンショット 2023-07-18 14.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0da1f79f-ae7e-d348-d647-7fb91658a4c1.png)

[テーブル]を実行します。
![スクリーンショット 2023-07-18 14.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/07483e14-2540-dad5-e7ac-9fa16bcf8d5b.png)

#### 注意事項

[フィルター]ノードを事前に利用（または[入力]ノードの[フィルタ-]タブを操作）しないでレコード結合すると　FYとrankが重複を起こします。[レコード結合]ノードの[フィルター]タブで以下のように設定しても、同じ結果になります。
![スクリーンショット 2023-07-18 14.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fe6b3506-2607-e881-8eb3-7b972d865c01.png)



## 4.参考情報

#### レコード結合を解説した記事

https://qiita.com/416nishimaki/items/be61a82c12cd83558def

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
PNG画像にメタデータをPythonで追加する

# はじめに
画像にテキストデータ保存できないかなーって思ってたらやり方ありそうだったのでGPTを駆使して探しました
このコードはそれを整理して関数にしています。

# コード

```python
from PIL import PngImagePlugin

def add_metadata(input_path: str, output_path: str, metadata: dict):
    img = PngImagePlugin.PngImageFile(input_path)
    imgInfo = img.info
    imgInfo.update(metadata)
    info = PngImagePlugin.PngInfo()
    for k, v in imgInfo.items():
        info.add_itxt(k, v)
    img.save(output_path, pnginfo=info)


def init_metadata(input_path: str, output_path: str, metadata: dict):
    img = PngImagePlugin.PngImageFile(input_path)
    info = PngImagePlugin.PngInfo()
    for k, v in metadata.items():
        info.add_itxt(k, v)
    img.save(output_path, pnginfo=info)


def get_metadata(path: str):
    img = PngImagePlugin.PngImageFile(path)
    info = img.info
    for key, value in info.items():
        print(f'{key}: {value}')

```

とりあえずこれで初期化と追加と取得ができる。
Power10でOpenMPジョブを実行する際の環境変数GOMP_CPU_AFFINITYの設定方法

# 記事の概要
IBM Power10プロセッサ搭載サーバーで、GCCのOpenMPスレッド並列なジョブを実行する際の環境変数GOMP_CPU_AFFINITYの設定方法について。

# 想定環境
例としてPower10の物理プロセッサ16コア搭載するサーバーで、SMT=8の環境を想定する。OSはLinuxを想定。
ppc64_cpu --info というコマンドでは以下のように見えている。

```
$ ppc64_cpu --info
Core   0:    0*    1*    2*    3*    4*    5*    6*    7* 
Core   1:    8*    9*   10*   11*   12*   13*   14*   15* 
Core   2:   16*   17*   18*   19*   20*   21*   22*   23* 
Core   3:   24*   25*   26*   27*   28*   29*   30*   31* 
Core   4:   32*   33*   34*   35*   36*   37*   38*   39* 
Core   5:   40*   41*   42*   43*   44*   45*   46*   47* 
Core   6:   48*   49*   50*   51*   52*   53*   54*   55* 
Core   7:   56*   57*   58*   59*   60*   61*   62*   63* 
Core   8:   64*   65*   66*   67*   68*   69*   70*   71* 
Core   9:   72*   73*   74*   75*   76*   77*   78*   79* 
Core  10:   80*   81*   82*   83*   84*   85*   86*   87* 
Core  11:   88*   89*   90*   91*   92*   93*   94*   95* 
Core  12:   96*   97*   98*   99*  100*  101*  102*  103* 
Core  13:  104*  105*  106*  107*  108*  109*  110*  111* 
Core  14:  112*  113*  114*  115*  116*  117*  118*  119* 
Core  15:  120*  121*  122*  123*  124*  125*  126*  127* 
```

# 16スレッド並列実行
例えば16スレッド並列で実行する場合、以下のように指定すると（一般に）パフォーマンスが出やすい。
```
$ export OMP_NUM_THREADS=16
$ export GOMP_CPU_AFFINITY="0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120"
```

# 32スレッド並列実行
例えば32スレッド並列で実行する場合、以下のように指定すると（一般に）パフォーマンスが出やすい。（GOMP_CPU_AFFINITY="0,4,8,12,16,・・・" ではない点に注意。）
```
$ export OMP_NUM_THREADS=32
$ export GOMP_CPU_AFFINITY="0,1,8,9,16,17,24,25,32,33,40,41,48,49,56,57,64,65,72,73,80,81,88,89,96,97,104,105,112,113,120,121"
```
あるいは、以下のように指定することもできる。
```
$ export OMP_NUM_THREADS=32
$ export MAXT=127
$ export GOMP_CPU_AFFINITY="0-$MAXT:8,1-$MAXT:8,2-$MAXT:8,3-$MAXT:8,4-$MAXT:8,5-$MAXT:8,6-$MAXT:8,7-$MAXT:8"
```
上記の場合、GOMP_CPU_AFFINITYの内容は展開されて、
"0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,2,10,18,26,34,42,50,58,66,74,82,90,98,106,114,122,3,11,19,27,35,43,51,59,67,75,83,91,99,107,115,123,4,12,20,28,36,44,52,60,68,76,84,92,100,108,116,124,5,13,21,29,37,45,53,61,69,77,85,93,101,109,117,125,6,14,22,30,38,46,54,62,70,78,86,94,102,110,118,126,7,15,23,31,39,47,55,63,71,79,87,95,103,111,119,127"
と同値になる。
前述の32スレッド並列と比べると、割り当ての順番は変わるが、使用する論理プロセッサは同じ。（OMP_NUM_THREADSを64,128などと変化させてベンチマークする場合等はこちらが便利。GOMP_CPU_AFFINITYを書き換える必要がないので。）

ちなみに、seqコマンドやrsコマンドが使える場合、以下のコマンドで同様の文字列（カンマ区切りの数列）を生成することも可能。
```
$ seq 0 127 | rs 0 8 | rs -T | rs 1 0 | sed "s/  */,/g"
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,2,10,18,26,34,42,50,58,66,74,82,90,98,106,114,122,3,11,19,27,35,43,51,59,67,75,83,91,99,107,115,123,4,12,20,28,36,44,52,60,68,76,84,92,100,108,116,124,5,13,21,29,37,45,53,61,69,77,85,93,101,109,117,125,6,14,22,30,38,46,54,62,70,78,86,94,102,110,118,126,7,15,23,31,39,47,55,63,71,79,87,95,103,111,119,127
```
Teachable Machineを使って海老天が骨折してるかどうか判定したい

お疲れさまです。デジタル勉強中の惣菜バイヤーです。
商品開発と店舗の商品管理等を行っています。
[前回](https://qiita.com/gushisushi/items/984a2810f09d0adc0947)デジタル始めたばかりで、今回が2回目の挑戦です。まだまだ勉強中ですが頑張ります!

タイトルが唐突なので、読んでいる方の頭の中は「海老天？骨折？」という状態だと思います。なのでまずは作成に至った経緯（理由）からいきたいと思います。

## 社長から1本のメール
先日、部長経由で社長からこんなメールがきました
![1コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481572/c4ec1c53-379a-f794-c957-da46bf793cf6.png)
本文の詳細は割愛しますが、内容はお昼に海老天丼を買って食べようとしたら、
海老天の尻尾が折れて全然美味しそうじゃなかったという内容でした。
添付画像がこちら↓
![8コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481572/bee79d51-a7b5-c0c2-386a-fbf7e0f70b56.png)
本来商品としては尻尾まで綺麗な真っ直ぐにならないといけません。
理想の海老天（未骨折）がこちら↓
![1コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481572/41dc36f6-a6ad-8677-6278-628d68d581c1.png)
社長からのメールが「海老骨折事件」という印象的な件名だったので、
今回そのままタイトルに使用しました。

お惣菜は出来栄え（見た目が美味しそうかどうか）で売上が大きく変わります。
作り方の手順や基準はありますが、実際作業中はあまり見る余裕がありません。
忙しい作業中でも簡単に出来上がり基準がわかるツールがあればいいなと思いつくりました。


## できたもの
今回、**Teachable Machine**と**Node-RED**を使って海老天が骨折していないかどうか判定してくれるものをつくりました。



## 使ったもの
・[Teachable Machine](https://teachablemachine.withgoogle.com/)
・[Node-RED](https://nodered.org/)
・海老天サンプル


## 作り方
①まずは`Teachable Machine`のやり方からです。
下記簡易的ですがイメージです。
![2コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481572/0750b90a-2811-7d08-3e1d-76005725b00b.png)

>使い方はこちらの方の記事がわかりやすいと思います↓

https://qiita.com/misa_m/items/d8a20d153c8ee7daf0c1

自分の場合はきれいな海老天と、曲がった海老天を2本（2パターン）ずついろんな角度から撮影しました

②次に`Node-RED`のやり方です

先程Teachable MachineでつくったモデルをNode-REDと連携させます。

今回追加したノード3つです
①node-red-contrib-teachable-machine　（Teachable Machineのノード）
②node-red-contrib-browser-utils　（自分のPCのカメラの写真データを読み込んでくれるノード）
③node-red-contrib-image-output　（読み込んだ画像をNode-RED上に表示してくれるノード）

そしてノードを下記のように配置してcameraのボタンを押すと判定が出ました！
![骨折.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481572/b4391e7f-5692-377d-63b8-c36b8402e722.png)

## もうちょっと何かやりたい！
ここまでできて他の方々の記事を見ていたらいろいろさらに繋げているので、
自分ももう少し何か繋げたいと思いました。
前回Makeを使ってLINE Botを作ったので、試してみることにしました。

`Webhooks`と`LINE Send a Notification`を使って、
先程のTeachable MachineとNode-REDでつくったものを連携させます。

![6コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481572/6db1f65a-a719-3ae8-2b4b-3b8965e7e380.png)

さらに1時間程かかってようやくできました。詳細書きたかったのですが、正直よく覚えていません。よくわからないままできました。。。
とりあえず判定のテキストが来ました！感動！
自分にとっては大きな一歩です👏👏👏
![7コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481572/fd7e7e6b-8852-c1af-a012-1cab6f7ce958.png)

## 今後に向けて
今回も時間都合上ここまででしたが、本当はもう少しやりたかったリストです。

:::note
●**ちゃんとつくったものをアウトプットできるようになる**
頭パンパンなのが大きな原因ですが、作成の詳細がそもそも自分自分把握できていない…

●**カメラで撮った写真をLINEに送ったら判定するようにしたい**
今回はパソコンのカメラでしたが、実際の使用状況は店舗の作業場想定していました。
それを考えると、スマホで撮った画像をそのまま判定できたらいいなと思いました。

●**海老天の判定精度を上げたい**
曲がり具合、尻尾が開いているか、天ぷら粉がきれいに花咲いているか
:::

Teachable Machineはお惣菜の実技試験や巡回時の指導にもかなり使えると思いました。
店舗のパートさんがわざわざ社員に確認しなくても、こういうツールを使って自分たちで判断できるようになればかなり業務改善になると思います。

また、自分自身のことですが前回よりも少しだけいろんな記事を参考にすることができました。
実際できたかどうかは別にして、読むだけ眺めているだけでもかなり勉強になりました。

今後も少しずつですが、いい意味で他人と比べず過去の自分自身と比べて成長していけたらと思います。
ご覧いただきありがとうございました。m(__)m
UnityHub「Install failed: Validation Failed」回避法

環境 Windows11

Unity Hub 3.5.0にupdateしてからUnityインストール時に
「Install failed: Validation Failed」と出るようになってしまった

原因は不明だがWindowsユーザー名に日本語を使っていることが原因なのではと考え、
以前エルデンリングの起動しない問題の対象法と同じものを試してみた。

手順
1. 「設定」を開く
2. 「時刻と言語」を選ぶ
3. 「言語と地域」を選ぶ
4. 「管理用の言語の設定」を選ぶ
5. 「システムロケールの変更」を選ぶ
6. 「ベータ:ワイルドワイド言語サポートでUnicode UTF-8を使用」にチェック
(再起動が要求されるので再起動しておく)
7. UnityHubを一度タスクから消しておき、右クリックの「管理者として実行」で起動する
8. あとは普段通りにインストールを進める

自分は動作確認の過程でダウンロード先を C:/tmp に変更していたため、
もしかしたら同じような対応をする必要はあるかもしれません。


今回はWindowsでの対処法を記載しました
Macでも同様の事象が起きていて、その解決方法を知っている方がいたら教えて欲しいです。
「DevRel Meetup in Tokyo #85 〜ハードウェアのDevRel〜」 参加レポ

## 前提（筆者のスペック）
- ハードウェアエンジニアではなくソフトウェアエンジニア
- エンジニア歴 9年目
- 主にEM・アジャイルコーチとして活動
- 現在採用文脈でのDevRel活動を行っている（現在3ヶ月目）
- 上記コミュニティには初参加

## イベント概要

https://devrel.connpass.com/event/288507/

### タイムテーブル
19:00	開場
19:15	挨拶&会場紹介&自己紹介
19:40	セッション1 by 古家さん@NVIDIA
19:55	セッション2 by グレさん
20:10	セッション3 by ひげだるまさん@ヒーローズリーグ
20:25	はじめまして、ｽﾀｯｸﾁｬﾝ 今までとこれから by ししかわさん
20:40	ミニパネルディスカッション
21:10	懇親会
21:30	終了

## 現場の雰囲気・状況
参加者はいつメン感のある方々だったらしく、私が到着した時にはすでに雑談が弾んでいるようでした
貸し会議室内には十数人は座れそうな長テーブルが1つあり、プロジェクターへの投影機器と飲料（アルコール/ノンアルコール）、ハンバーガーセットが振る舞われ、もぐもぐごくごくしていたらこの会の説明とセッションが始まりました

## セッションを聞いて一言感想
### [furuyaさん](https://twitter.com/sfuruyaz)
NVIDIAのDevRelな組織や活動について説明していただき、技術的な点では、GPUに突出した話からCPUからGPUな言語への変換サポートを行っている話など、ソフトウェアエンジニアリングのみに携わっていた身からすると初めましてな用語が目白押しでした :eyes: 
かろうじて私も聞いたことがあるゲーマー御用達なGeForceから、CADなど業務用で用いるRTX/Quadro、データセンター向けのデータセンターGPUと用途に合わせて様々な種類があり、最近だと生成AI向けもあるとか！


### [グレさん](https://twitter.com/ic_lifewood)
[CHIRIMEN](https://tutorial.chirimen.org/)というJSでハードウェアを制御するプロトタイピング環境について説明していただきました
活動の三本柱として
1. WEBブラウザの技術だけでハードウェアを動かす
1. OSSの開発方法・考え方を、ハードウェアに広める
1. 先の2つのゴールを多くの人たちに社会に広める

をあげており、特に驚きだったのは2.のOSSの開発方法・考え方である「[OSHW](https://www.oshwa.org/definition/japanese/)」です
ハードウェア業界では競合他社との優位性の観点から製品仕様を秘匿するような文化があるらしいのですが、その中でもOSHWのように、製品仕様を開示しそれをフォークした製品が広まることで、その製品の業界がより豊かになることを目指して活動していることには胸を打たれました！

### [ひげだるまさん](https://twitter.com/masaya3)
[ヒーローズリーグ](https://heroes-league.net/)というものづくりの祭典（私の解釈）についてご説明いただきました！
パケットダンプした情報をブラウザ上でモンスターに変換する可愛い作品から、気泡で絵を表現する水槽という美術的な作品、また波動ティッシュという、ティッシュを出すと某キャラクターが波動を繰り出すというユーモア溢れる作品まで多種多様！
面白かったのが、2018年度での受賞割合が6割ソフトウェア、4割ハードウェアだったことに対して、2022年度では「3Dプリンターの普及」によって受賞割合が**逆転**し8割ハードウェア、2割ソフトウェアになっているそうです！
他にも作品が見たくなった方は是非[ProtoPedia](https://protopedia.net/)を見てみましょう！

### [ししかわさん（twitterアカウントが見当たらなかったのでｽﾀｯｸﾁｬﾝのアカウントのリンクです）](https://twitter.com/stack_chan)
ｽﾀｯｸﾁｬﾝというコミュニケーションロボットの説明から、ｽﾀｯｸﾁｬﾝ界隈が盛り上がっていくさまを説明してくださいました。
当時コミュニケーションロボットは大半がクローズドだったため、オープンにしたいということがきっかけで作り始めたそうで、それを体現するようOSHW認証をとっていたりApache2.0ライセンスで公開していたり、メカ・回路・ソフトを自由に拡張できたり、ファームウェアにはModdable SDKを採用していることからJS（ECMAScript）で作れたりと、オープンなだけでなく自由でハードルも低い！
そのオープンさから現在ではコミュニティでは、ChatGPTの登場とともにGUIツールでぽちぽちするとAIｽﾀｯｸﾁｬﾝを作れるようになったりと、その広がりは勢いを増しているそうです :flushed: 
また「People Powered 遠くへ行きたければ、みんなで行け」の6つの原則である
1. 価値のある資産を築く，シンプルなところから始めよう
1. 明確で客観的なリーダーシップを持とう
1. 文化と期待をハッキリとさせよう
1. 人間関係と信頼，関係づくりに集中しよう
1. 常に敏感で洞察的で辛抱強くあろう
1. 意表を突こう

を大事にしているようで、それぞれについて具体的な活動例もご教示いただけました（ここでは長くなり過ぎてしまうので割愛）
ｽﾀｯｸﾁｬﾝはｶﾜｲｲ。ｶﾜｲｲは正義。

## 雑感
- 一言DevRelといっても語る方々それぞれ違う色を持っていて面白かった
- 自身もハードウェア業界に関係する身となったため、こういった環境に身を置き適宜情報をキャッチアップしたいなと感じた
- 自身がDevRel活動をする上で、何を大事にすべきか？を考える良いきっかけとなった
- ｽﾀｯｸﾁｬﾝは可愛い。可愛いは正義。
- Meetupが終わった後の飲み会に行きたかった...
【Go】ログイン機能でウェブアプリを作ってみる（1）

こんにちは。

Go言語で仮登録・本登録・ログイン機能だけのアプリを作成します。

追加で
```
・CORS＋CSRF
・リフレッシュ
・アクセス回数制限
```
なども扱ってます。

# Part 1 はじめに

## 何を作るのか？

ユーザーの仮登録、本登録、ログイン、制限されたリソースへのアクセスをするだけのWEBアプリ

## 何が学べるの？

ログイン処理が学べます

追加で
```
・docker composeの基本的な使い方
・JWTの基本
```

## 前提

```
- Go 1.20.6
- WEBのフレームワークとしてlabstack/echoを使用します。
- データベースとのやりとりはjmoiron/sqlxを使用します。
- 認証トークンとしてJWTを使用します。また、lestrrat-go/jwxを使用します。
- メールサーバーはmailhogを使用します。
- テストは書かない
```

## 作成するエンドポイント

* 仮登録 /auth/register/initial
    - クライアントからemail, passwordを受け取る
    - email宛に本人確認トークンを送信する
* 本登録 /auth/register/complete
    - クライアントからemailと本人確認トークンを受け取る
    - ユーザーの本登録を行う
* ログイン /auth/login
    - クライアントからemail, passwordを受け取る
    - 認証トークンとしてJWTを返す
* ユーザーリストの取得 /restricted/users
    - クライアントからJWTを受け取る
    - ユーザーリストを返す

簡単に
1. ユーザーを仮登録する（/auth/register/initial）
2. ユーザーを有効化する（/auth/register/complete）
3. ログインしてトークンを取得する（/auth/login）
4. 最後に、トークンを使ってユーザーリストを取得する（/restricted/users）

という処理を実装していきます。

Part 1は以上です。
ありがとうございます。


次のPart 2は準備（Go）です。よろしくお願いいたします。
[Unity Visual Scriptng] Dialogue System のベースとなる待機可能なユニットをコルーチンで作る

# 導入
Unity Assets で公開されている Dialogue System などの会話システムでは独自のグリッドビューで実装されていることが多い。それを Visual Scripting で独自ユニットを作って実装したい。

必要となるユニットは「メッセージを送り返事がくるまで待機するユニット」、「メッセージが送られてくるのを待つユニット」と「送られてきたメッセージに返事をするユニット」の3つ。

## ListnerUnit （メッセージが送られてくるのを待つ）
```cs
public class ListenerUnit : Unit {
    [DoNotSerialize] ControlOutput Exit;
    [DoNotSerialize] ValueOutput Message;

    protected override void Definition() {
        Exit = ControlOutput(nameof(Exit));
        Message = ValueOutput<string>(nameof(Message));
    }

    public override void Instantiate(GraphReference instance) {
        EventBus.Register<string>(new EventHook("CALL"), message => {
            var flow = Flow.New(instance);
            flow.SetValue(Message, message);
            flow.StartCoroutine(Exit);
        });
        base.Instantiate(instance);
    }
}
```
まずは、メッセージが送られてくるのを待つユニット。インスタンス作成時に `EventBus` にイベントリスナーを登録する。`EventBus` は Visual Scripting に標準で含まれる Custom Event ユニットでも内部で使用していて `String` や `GameObject` をキーとして登録できる。イベントを受け取ったら新しい `Flow` を作成して起動する。

## CallbackUnit（送られてきたメッセージに返事をする）
```cs
public class CallbackUnit : Unit {
    [DoNotSerialize] ControlInput Enter;

    protected override void Definition() {
        Enter = ControlInputCoroutine(nameof(Enter), EnterCoroutine);
    }

    IEnumerator EnterCoroutine(Flow flow) {
        EventBus.Trigger(new EventHook("CALLBACK"), "Callback!");
        yield break;
    }
}
```
次に、送られてきたメッセージに返事をするユニット。`EventBus` でイベントを発火して終了する。

## MessageUnit（メッセージを送り返事がくるまで待機する）
```cs
public class MessageUnit : Unit {
    [DoNotSerialize] ControlInput Enter;
    [DoNotSerialize] ControlOutput Exit;
    [DoNotSerialize] ValueOutput Message;

    protected override void Definition() {
        Enter = ControlInputCoroutine(nameof(Enter), EnterCoroutine);
        Exit = ControlOutput(nameof(Exit));
        Message = ValueOutput<string>(nameof(Message));
    }

    IEnumerator EnterCoroutine(Flow flow) {
        var replyed = false;
        System.Action<string> callback = message => {
            flow.SetValue(Message, message);
            replyed = true;
        };

        EventBus.Register(new EventHook("CALLBACK"), callback);
        EventBus.Trigger(new EventHook("CALL"), "Hello world!");
        yield return new WaitUntil(() => replyed);  // 返事を待機

        EventBus.Unregister(new EventHook("CALLBACK"), callback);
        yield return Exit;
    }
}
```
最後に、メッセージを送り返事がくるまで待機するユニット。`EventBus` に一時的にイベントリスナーを登録する。メッセージを引数として `EventBus` を発火する。返事が返ってくるまで待ってイベントリスナーを登録解除して `Flow` を進める。

## スクリプトグラフ
作成したユニットを使ってグラフを作成する。メッセージを送る側と受け取る側で完全に2ラインに分けることができる。
![stepexecutegraph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512900/1c29ff1f-b266-3456-8c60-49703e9283f0.jpeg)

# テスト
```cs
[22:56:39] Click!
[22:56:41] Hello world!
[22:56:43] Callback!
```
出力結果は上記。秒数を開けて期待した順にログが出力できた。

# さいごに
実際には上のラインにはメッセージを表示する前準備、表示、ユーザーのクリックを待機といった処理を挟み。下のラインでは Visual Scripting の多様なユニットと組み合わせて会話の流れをノードで表現できるようになる。`EventBus` さえ仕込んでしまえばいいので、上のラインは `MonoBehavior` 側に任せて、会話だけノードベースで管理することもできる。詳細な実装にはパッケージ内の `EventUnit.cs` のソースコードを参考にされたい。
React Router 子階層のルーティング

<h1>はじめに</h1>
React Routerで子階層のルートが複数存在する場合、子ルートへの遷移をどう書けばいいかわからなくなったので備忘録。

<h1>検索したら出てきた解決案の一つ</h1>

App.tsxでRouter.tsxを呼び出し
```react:App.tsx
import "./styles.css";
import { ChakraProvider } from "@chakra-ui/react";
import { BrowserRouter } from "react-router-dom";

import { Router } from "./router/Router";

import theme from "./theme/theme";

export default function App() {
  return (
    <ChakraProvider theme={theme}>
      <BrowserRouter>
        <Router />
      </BrowserRouter>
    </ChakraProvider>
  );
}
```

・/home
・/home/user_management
・/home/setting
と子階層に遷移したいとき

```react: Router.tsx
import { FC, memo } from "react";
import { Routes, Route } from "react-router-dom";

import { Login } from "../components/pages/Login";
import { homeRoutes } from "./HomeRoutes";

export const Router: FC = memo(() => {
  return (
    <Routes>
      <Route path="/" element={<Login />} />
      <Route path="home" element={<Home />}>
        <Route path="user_management" element={<UserManagement />} />
        <Route path="setting" element={<Setting />} />
      </Route>
    </Routes>
  );
});
```

Outlet部分にUesrManagementやSettingに当たるコンポーネントがネストされる。
```react:Home.tsx
import { FC, memo } from "react";
import { Outlet } from "react-router-dom";

export const Home: FC = memo(() => {
  return (
    <div>
      <p>HOME</p>
      <Outlet />
    </div>
  );
});
```

だがしかし、やりたいことはあくまで子階層に「遷移」すること。
あとぱっと見、見栄えが良くない気がする。

<h1>【解決】ルートパスを別ファイルに切り出してmapで展開</h1>

ルートパスを別ファイルで管理する。

```react:HomeRoutes.tsx
import { Home } from "../components/pages/Home";
import { Setting } from "../components/pages/Setting";
import { UserManagement } from "../components/pages/UserManagement";

export const homeRoutes = [
  {
    path: "",
    children: <Home />
  },
  {
    path: "user_management",
    children: <UserManagement />
  },
  {
    path: "setting",
    children: <Setting />
  }
];
```

HomeRoutesを呼び出して、定義している各ルートをmap()で展開。
HomeRoutes.tsxで、pathの記載だけ注意すれば、これだけで実現が可能。

```react:Router.tsx
import { homeRoutes } from "./HomeRoutes";

    <Routes>
      <Route path="/" element={<Login />} />
      <Route path="/home">
        {homeRoutes.map((route) => (
          <Route key={route.path} path={route.path} element={route.children} />
        ))}
      </Route>
    </Routes>



```

<h1>おわりに</h1>
今回初投稿でした。
最近ReactやNext.jsの学習を始めたんですが、ReactRouterでさえv6とv5が大きく変わっていたりと、最新情報を追うのが大変ですね。
これからも気づきや学びをこまめに登校したいと思います。

何かご意見ございましたらご教授ください。
Slack チャンネルを指定してIncoming WebHook URLを新たに取得する方法

## 概要

- Slackにて Incoming WebHook URLを新たに取得する方法を簡単にまとめる。

## 前提

- 下記の方法でIncoming WebHooksのアプリがSlackに追加されていること。

https://qiita.com/miriwo/items/ad66407ba763ea648c41

## 方法

1. Slackのサイドバーの「App」をクリックし「管理する」にカーソルホバーし「アプリを検索する」をクリックする。

    ![test_-_miriwo-notice_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/01c06efc-31dd-24d1-84c0-b93981fcffa2.png)

1. 「incoming-webhook」をクリックする。

    ![App_-_miriwo-notice_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a1fcacd2-f9bb-41a1-f104-010faff21ae8.png)

1. 「設定」をクリックする。

    ![miriwo-notice_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/eef18c0a-9a28-617a-e582-339cd572b903.png)

1. 「Slackに追加」をクリックする。

    ![Incoming_Webhook___Slack_App_ディレクトリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/50956d23-a871-4355-baf9-82827c55339b.png)

1. 通知したいチャンネルを選択し、「Incoming Webhook インテグレーションの追加」をクリックする。
An error occurred while installing pg (1.5.3), and Bundler cannot continue.

# 経緯
bundle installを行ったところ、エラーが発生しました。
```
bundle install
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies.....
Using rake 13.0.6
Using racc 1.7.1
Using rack 2.2.7
(省略)
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
（省略）

Gem files will remain installed in

An error occurred while installing pg (1.5.3), and Bundler cannot continue.

In Gemfile:
  pg
```

表示の通りpgをインストールしましたが、上手くいきませんでした。
```
＄ gem install pg 
```


# 結果
下記を行ったところ、解決しました。
```
＄ brew install postgresql
```
dependabotに入門する

## dependabotとは
> Dependabot を使って、プロジェクトで使用される依存関係の脆弱性を監視し、依存関係を最新の状態に保ちます。
https://docs.github.com/ja/code-security/dependabot

です。
言語に応じたパッケージを監視して、いい感じに最新の状態にしてくれます(PRを作ってくれます)。

↓ GitHubの内部でも使われているみたいです。

https://github.blog/2022-05-25-how-we-use-dependabot-to-secure-github/

## 使ってみる
https://docs.github.com/ja/code-security/getting-started/dependabot-quickstart-guide#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B-dependabot-%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96

1. 特定のリポジトリから`Settings`を開きます。
1. `Code security and analysis`を開き、`Dependabot alerts`と`Dependabot security updates`を有効化します。
1. どのパッケージを監視するのかを`.github/dependabot.yml`に記述します。
1. mainブランチにpushしたら完了です。


- `.github/dependabot.yml`の例
    - `package-ecosystem`
        - パッケージマネージャーを指定します(この例では`gem`の管理をするので、bundlerを指定しています)。
    - `directory`
        - パッケージマネージャーが探すマニフェストファイルの位置を指定します。
        - npmならpackage.json、bundlerならGemfileなどの位置です。
    - `schedule.interval`
        - どれくらいの頻度で、新しいバージョンを確認するかを指定します。
        - この例では1日に1回の頻度で確認するように指定しています。
    - 他の設定もあるので、詳しくはこちら！
        - https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

```.github/dependabot.yml
  version: 2
  updates:

    - package-ecosystem: "bundler"
      directory: "/"
      schedule:
        interval: "daily"
```

mainブランチにpushして更新できるものがあれば、以下のようにPRが作られます。
めちゃくちゃ便利！！

![スクリーンショット 2023-07-19 0.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849988/c4ae4d1d-cada-6f72-fed5-3cd674fab730.png)



## 参考

https://dev.classmethod.jp/articles/github-dependabot-2021/

https://docs.github.com/ja/code-security/dependabot

https://github.blog/2020-06-01-keep-all-your-packages-up-to-date-with-dependabot/
はじめてのDockerでRails7の環境構築

[Dockerクイックスタート](https://docs.docker.jp/compose/rails.html)に倣いRails7の環境構築を行いました。
環境は以下の通りです。

* `Ruby: 3.2.2`
* `Ruby on Rails: 7.0.6`
* `Postgres: 12` 

# 前提
* [Docker Desktop](https://docs.docker.com/desktop/)のインストールが必要です

# 本記事でわかること
* DockerによるRails7環境構築

# 作業ディレクトリの作成
作業用に任意ディレクトリ(本記事では`rails-docker`)を作成します。
```terminal:terminal
# mkdir rails-docker
```

# Dockerfileの作成
前項で作成したディレクトリに移動します。
```terminal:terminal
# cd rails-docker
```

<br>

次に`Dockerfile`を新規作成して以下を記述します。

<br>

```dockerfile:Dockerfile
FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs

WORKDIR /rails-docker
COPY Gemfile /rails-docker/
COPY Gemfile.lock /rails-docker/
RUN bundle install
COPY . /rails-docker
```

# GemfileとGemfile.lockの作成
`Gemfile`と`Gemfile.lock`を新規作成する。
`Gemfile`は以下を記述し、`Gemfile.lock`は空ファイルとします。

```ruby:Gemfile
source 'https://rubygems.org'
gem "rails", "~> 7.0.6"
```

```ruby:Gemfile.lock

```



# docker-compose.ymlの作成
`docker-compose.yml`を新規作成し、以下を記述する。
`volume`の`- .:/rails-docker`によりホスト側の`docker-compose.yml`があるディレクトリをコンテナ内の`docker-rails`の関連付けています。

```yml:docker-compose.yml
version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails-docker
    ports:
      - "3000:3000"
    depends_on:
      - db
  
  db:
    image: postgres:12
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
```

# rails new を実行する
`docker-compose run`を実行することで、Railsアプリのひながたを生成する。
```terminal:terminal
# docker-compose run web rails new . --force --database=postgresql
```

# imageをbuildする

:::note warn
Linux上でDockerを動作している場合は`rails new`による生成ファイルの所有者が`root`になっているので`sudo chown -R $USER:$USER .`を実行してからイメージをビルドしてください。

:::

前項の`rails new`で`Gemfile`が更新されました。
更新された`Gemfile`を`bundle install`したイメージを再度ビルドするために`docker-compose build`を実行します。
```terminal:terminal
# docker-compose build
```

# database.ymlの修正
Railsアプリのデータベース接続設定を`db`サービスに接続するために
`config/database.yml`の`default: &default`に以下の記述を追加します。

```yml:database.yml
  host: db
  username: postgres
  password:
```

# データベースの生成
`docker-compose.yml`があるディレクトリで以下のコマンドを実行することでデータベースを生成する。
```terminal:terminal
# docker-compose run web rails db:create
```

# docker-composeでコンテナを起動する

```terminal:terminal
# docker-compose up
```

ブラウザを起動して`http://localhost:3000/`にアクセスすればRails起動画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475852/4f06a17c-0547-b355-1d61-dca7a79b569d.png)

# 参考
* [Dockerクイックスタート](https://docs.docker.jp/compose/rails.html)
* [Dockerfile リファレンス](https://docs.docker.jp/engine/reference/builder.html#from)
Slack すでに設定済みのIncoming WebHook URLを取得・確認する方法

# 概要

- Slackにて Incoming WebHook URLを取得する方法を簡単にまとめる。

# 前提

- 下記の方法でIncoming WebHooksのアプリがSlackに追加されていること。

https://qiita.com/miriwo/items/ad66407ba763ea648c41

# 方法

1. 「例」の通知の「webhookbot」にマウスカーソルをホバーする。

    ![test_-_miriwo-notice_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d13232cd-6b34-1012-5751-3161dda4879b.png)

1. ポップアップの「設定」をクリックする。

    ![test_-_miriwo-notice_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7286ddd1-7e0e-9714-fa68-a3fcaebb825b.png)

1. 遷移先の画面で「Webhook URL」の欄ですでに設定済みのIncoming WebHook URLを取得、確認する事ができる。

    ![Incoming_Webhook___Slack_App_ディレクトリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ceb5d746-654f-b762-06c7-8995398bd162.png)
faviconについての調べ物

## 各サイズ
ブラウザのタブに表示されるサイズは16px×16だが、色々なサイズが使われることがある。

* 16px×16px：ChromeやInternet Explorerのブラウザタブ、Safariの履歴など
* 24px×24px：Internet Explorer 9のピン留めなど
* 32px×32px：ブックマークアイコンなど
* 180px×180px ：iOSのホーム画面など
* 192px×192px Android Chromeのホーム画面、タブ
* 256px×256 px ：Androidのホーム画面など

ICO形式のファイルは複数のサイズに対応できる「マルチアイコン」にできる。ICO形式のファイルを設定しておけば、アプリケーションやOS、デバイス環境などに応じて、自動的に適切なサイズが表示できる。

## SVG形式
最近はsvg形式のfaviconが増えているっぽい。ただし、Safariは非対応
ベクター形式なので縮小しても劣化せず、cssでダークモードなどにも対応できるので良さげ
```css
<link rel="icon" type="image/svg+xml" href="/favicon.svg">

<style>
// ここにダークモードの色を指定
@media (prefers-color-scheme: dark) {
  .background {
      fill: #5C413C;
  }
  .text path{
    fill: #DBCFCB;
  }
}
</style>
```

## 参考
https://caniuse.com/?search=link-icon-svg
Dockerfile で asdf: command not found

# 環境

- `nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu20.04`

# 問題

Dockerfile において asdf をインストールした後，同 Dockerfile で asdf が実行できないエラーが生じる場合がある[^1][^2]．
`source ~/.bashrc` を行うことで，このエラーが出なくなる場合もあるらしいが，本環境では，改善しなかった．

**Dockerfileの抜粋**

```Dockerfile
SHELL ["/bin/bash", "-c"]
RUN git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.11.3
RUN echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc \
&& echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc \
&& RUN source ~/.bashrc \
&& asdf plugin add python \
&& asdf install python 3.10.0 \
&& asdf global python 3.10.0 \
```

**生じるエラー**

```Terminal
asdf: command not found
```

# 解決策

直接，環境変数としてパスを設定することによって解決した．
原因は，Dockerfile では RUN ごとに異なるシェルが実行されることか[^2]．

```Dockerfile
RUN git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.11.3
RUN echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc \
&& echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc 

# 追加
ENV PATH="/root/.asdf/shims:/root/.asdf/bin:${PATH}"

RUN source ~/.bashrc \
&& asdf plugin add python \
&& asdf install python 3.10.0 \
&& asdf global python 3.10.0 \
```



[^1]: [Can install asdf inside Docker container, but not at build time via Dockerfile](https://stackoverflow.com/questions/72063324/can-install-asdf-inside-docker-container-but-not-at-build-time-via-dockerfile)
[^2]: [Dockerfileでasdfを実行できないことについて](https://www.subcul-science.com/post/20230607dockerfileasdf/)
【JavaScript】サイト上のCanvasを一括でダウンロードするスクリプト【ブックマーク可能】

# やりたかったこと

複数の画像がCanvasで描画されているWebページにおいて、一括でダウンロードできないかと思いつつ、ワンクリックで保存ができるものを作りました。

# スクリプト

特定のWebページにある複数のCanvasを一括して画像保存します。
具体的には、特定のクラス名`hoge`のCanvasを取得し、一個ずつaタグを利用してダウンロードさせます。
※クラス名によらずCanvasすべての場合であれば、`canvas`と指定できます。

以下の例では、JPEG、品質90で保存します。

```javascript
function canvasdownload(){
var elements = document.querySelectorAll('.hoge'); // 特定のクラス名のCanvasを全て取得
    for(i = 0; i < elements.length; i++){
        var a = document.createElement('a');
        a.href = elements[i].toDataURL('image/jpeg', 0.90); // 形式と質を指定
        a.download = String(i).padStart(3, '0') + '.jpg'; // 連番のゼロパディング
        a.click(); // 保存
    }
}
canvasdownload();
```

- 2023/08/18追記：@ss8826さんに１ステートメントで書いた場合のスクリプトをいただきました。ありがとうございます！

```javascript
document.querySelectorAll('canvas').forEach((e, i) =>
  Object.assign(document.createElement('a'), {
    href: e.toDataURL('image/jpeg', .9),
    download: `${`00${i}`.slice(-3)}.jpg`
  }).click());
```


# 使い方

- 以下のスクリプト（1行にしたもの）をコピーし、テキストエディタに貼り付けます。
- 目的のWebページ上で開発者ツールを開き、対象のCanvasのクラス名を調べます（特定のクラスのみ抽出したい場合）。
- 特定のクラスのみの場合、`canvas`を上記のクラス名に変更します(例：`.hoge`)。
- 変更したスクリプトをコピーし、新規ブックマークのURL欄にペーストします。名前はわかりやすいものにしておきます。
- Ctrl+Shift+Bでブックマークバーを表示させます。

```javascript
javascript: function canvasdownload(){ var elements = document.querySelectorAll('canvas'); for(i = 0; i < elements.length; i++){ var a = document.createElement('a'); a.href = elements[i].toDataURL('image/jpeg', 0.90); a.download = String(i).padStart(3, '0'); + '.jpg'; a.click(); } } canvasdownload();
```

- 1ステートメント（処理は同等）
```javascript
javascript:document.querySelectorAll('canvas').forEach((e,i)=>Object.assign(document.createElement('a'),{href:e.toDataURL('image/jpeg',.9),download:`${`00${i}`.slice(-3)}.jpg`}).click());
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/073883cc-8ec8-11dd-79fb-5c23a644df22.png)


- 目的のWebページを表示し、先ほど作成した「Canvasダウンロード」をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/f7f7aada-6d79-ae14-3de6-75ba2254f757.png)

- すると、そのWebページにある目的のCanvasが一括でダウンロードフォルダに保存されます。
小学生でもわかる！Wordpressのすゝめ

こんにちは。小川智也です。
最近Wordpressでブログを始めました。

https://ogawa-tomoya.jp/

OGP画像は筆記体のかっこいい感じにしてみました。
サイトはこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518724/0dbbdd2f-eb50-9b3e-7c95-604658d9aa79.png)

いい感じの色味でいい感じのサイトになってると思います。
前にもWordpressをやろうと思ってたときはあったのですが、いじる項目が多すぎてカスタマイズだけで満足して続きませんでした(汗)
けど今回は個人事業主にもなったのでお財布やドメイン(ogawa-tomoya.jp,ogtm.jp)の更新料のためにもアフェリエイトとかでいい感じに稼げたらなと思っています。

現状サーバーにお金が払えないのでXREAという無料であんま広告目立たないのに無料とかいう神ってるサーバーを使ってます。

https://www.xrea.com/

で最近書いた記事でiOSは最新の1個前まではセキュリティサポートしてるからすぐに乗り換えなくても大丈夫という記事を書きました。よければみてください。

https://ogawa-tomoya.jp/ios17-support/

もうSEOとかで頭が混乱してやばいことになりそうです。とりあえず検索結果には出てくるようになりました。SEO ダイジ　ゼッタイ。

とりあえずまた今度親に頼んでAdsense申し込んでもらいます。
AttributeError: 'Engine' object has no attribute 'execute'

前に作成していたシステムで久々に素のSQLを動かすと下記のエラーがflaskで表示
たぶんpythonパッケージのバージョンが変わったことによるエラーです
昔はjsと違いpythonのパッケージ更新はそんなに頻繁でなかったのに最近は開発が早いのでしょうがないです

```
AttributeError: 'Engine' object has no attribute 'execute'
```

SQL実行部分を下記のように書き換えます
そうするとSQL自体を実行できます

```
 SQL = "SQL"
    with engine.connect() as conn:
        added_data = conn.execute(text(SQL))
```
Docker build時のキャッシュ問題とその解決方法

## 事象

Dockerでのビルド時、新しい変更が反映されずに前回のイメージが作成されてしまうことがあります！

## 原因

Dockerはビルドの高速化のためにキャッシュを利用します！そのため、変更がないレイヤーは再利用され、新しいイメージが前回のものと同じになることがあります！

## 対処法

キャッシュを無効にしてイメージをビルドすることで、最新の変更を反映したイメージを作成することができます！以下のコマンドを使用してキャッシュを無効にしてビルドできます！

```
docker build --no-cache -t your-image-name .
```


自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
【Python】トーナメント優勝者

# 作るもの
対戦カード（competitions）と結果（results）を与えて、最終的なトーナメントの勝者であるチーム名を返す関数。

# 実装
```python:tournament_winner.py
def tournamentWinner(competitions, results):
    dict = {}  # 勝利回数をカウントするための空の辞書を作成

    # 各競技の結果とその対戦を順番に処理
    for i, comp in enumerate(competitions):
        if results[i]:  # もしi番目の競技の結果がTrue（チーム1の勝利）なら
            dict[comp[0]] = dict.get(comp[0], 0) + 1  # チーム1の勝利回数を辞書に追加または1増やす
        else:  # もしi番目の競技の結果がFalse（チーム2の勝利）なら
            dict[comp[1]] = dict.get(comp[1], 0) + 1  # チーム2の勝利回数を辞書に追加または1増やす

    # 辞書の中で最も多く勝利したチーム名を返す
    return max(dict, key=dict.get)


# テスト
if __name__ == "__main__":
    competitions = [
        ["HTML", "Java"],
        ["Java", "Python"],
        ["Python", "HTML"],
    ]
    results = [0, 1, 1]
    print(tournamentWinner(competitions, results))

```

# 参考
https://www.algoexpert.io/questions/tournament-winner
AT+CGDCONT　について

## AT+CGDCONT

SIM7080GのAT+CGDCONTについての解説です。

マニュアルのサンプルコード
~~~
AT+CGDCONT=<cid>[,<PDP_type>[,<APN>[,<PDP_addr>[,<d_comp>[,<h_comp>][,<ipv4_ctrl>[,<emergency_fla
g>]]]]]]
OK
or
ERROR
Parameter
~~~

実際に打ち込んだコード
~~~

AT+CGDCONT=1,"IP","mmtcom.jp"

~~~

### cid

PDP Context Identifier） 特定の PDP コンテキスト定義を指定する数値パラメータ。このパラメータはTE-MTインタフェースにローカルで、他のPDPコンテキスト関連コマンドで使用される。許容値の範囲（最小値=1）は、コマンドのtest形式で返されます。1...15

PDPコンテキストIDを指定します。通常、複数のコンテキストを設定する場合に異なるIDが使われますが、この例では1が指定されています。

### PDP_type

(パケットデータプロトコルのタイプを指定する文字列パラメータ。
IP インターネットプロトコル（IETF STD 5）
IPV6 インターネット・プロトコル・バージョン6
IPV4V6 デュアルPDNスタック
非 IP 非 IP データの外部パケット・データ・ネットワークへの転送（3GPP 技術仕様 24.301 参照）。

パケットデータプロトコルのタイプを指定します。この場合、"IP"という文字列はIPv4接続を意味します。

### APN

 (アクセス・ポイント名） GGSN または外部パケット・データ・ネットワークを選択するために使用される論理名であ る文字列パラメータ（文字列は引用符を含む）。値が NULL または省略された場合は、サブスクリプション値が要求されます。
省略された場合、サブスクリプション値が要求されます。
値は NULL です。

使用するAPN（Access Point Name）の名前を指定します。この例では"mmtcom.jp"というAPNが指定されています。APNは、モバイルデータ通信に接続するためのアクセスポイントの名前であり、通信事業者によって異なるAPNが提供されます。

### PDP_addr

PDP に適用可能なアドレス空間の MT を識別する文字列パラメータ。フォーマット 「<n>.<n>.<n>.<n>" (<n>=0..255)
値がNULLまたは0.0.0.0の場合、動的アドレスが要求される。割り当てられたアドレスは、+CGPADDRコマンドを使って読み取ることができる。

### d_comp

PDP データ圧縮を制御する数値パラメータ
0 オフ（値が省略された場合のデフォルト）
1 オン
2 V.42bis

### h_comp

PDP ヘッド圧縮を制御する数値パラメータ
0 オフ（省略時のデフォルト）
1 オン
2 RFC1144
3 RFC2507
4 RFC3095

### ipv4_ctrl

MT/TA が IPv4 アドレス情報の取得を要求する方法を制御するパラメータ：
0 NASシグナリングによるアドレス割り当て
1 オン

### emergency_flag

emergency_flag：
0 off (省略時のデフォルト)
1オン
Python3 エンジニア認定データ分析試験攻略法：合格体験から学ぶ勉強戦略とコツ

## プロローグ: 試験への意欲と目標

会社の上司が勉強になったと言っていたからと、会社の目標設定にしてしまったので受験してみました。

一度目で850点で合格だったので、そのときの勉強法などをつらつら書いてみようと思います。

### 筆者のスペック

- 社会人（IT企業）2年目
- Pythonは軽く触ったことがあるが、業務経験なし
- 3月にG検定合格
- 残業三昧のときに、Python3 エンジニア認定データ分析試験を受験

## Python3エンジニア認定データ分析試験とは

Odyssey（オデッセイ）で申し込む、Pythonの基礎からデータの取得・加工、可視化、機械学習の流れや実行方法などが問われるCBT形式の試験です。
試験概要を簡単に。。

### 概要
- 40問中28問正解で合格（7割）
- 4択
- 試験時間60分
- 受験料：一般11,000（税込）、学生5,500（税込）、再受験での割引などないらしい
- 受験日：通年
- 再受験は2回目に関しては制限なし、3回目以降は前回の試験日から7日間は受験不可
- Odyessy IDの登録必須でちょっと面倒
- 認定テキスト・認定模擬問題・認定スクールなどがある
- 節ごとに問題数が決められているので、山を張るとなったときにありがたい

認定テキスト（私は第2版を買いました）
https://www.amazon.co.jp/Python-E3-81-AB-E3-82-88-E3-82-8B-E3-81-82-E3-81-9F-E3-82-89-E3-81-97-E3-81-84-E3-83-87-E3-83-BC-E3/dp/4798176613/ref=dp_ob_title_bk

詳しくは公式サイト↓
https://cbt.odyssey-com.co.jp/pythonic-exam/python3cda.html

## 試験の準備: 勉強法と学習プラン

### 勉強期間
3週間前から勉強を開始。

平日は仕事（深夜残業も多々）とごはんやお風呂などなんやかんやを終えて、23時頃から1〜2時頃まで勉強し、
休日は試験前以外はやったりやらなかったりでした。

### 勉強法
1〜3章（データ分析エンジニアの役割・Pythonと環境・数学の基礎）は1日1章、4章（ライブラリによる分析の実践）は1日1節を目安に読んでいました。

私は一度では覚えられないので、2周＋不安なところ（特に4-4のscikit-learn）を重点的に読みました。

本当は認定模擬試験をやりたかったのですが、時間が取れず、前日に問題を流し見して試験に挑みました。。

## 試験当日: 緊張と期待

なんの緊張も期待もせず試験会場へ。

私の場合、パソコン教室が試験会場で、同じ試験を受けている方がちらほらいました。

### 難易度
想像していたより簡単でした。
前日にちらっと認定模擬試験を見たのですが、おそらくそれより簡単だと思いました。

### 時間配分
問題を読むのが遅い私でも、かなりの時間があまりました。
簡単と言われている試験を舐めて受験して落ちた経験があるので、丁寧めに見直しをしましたが、それでも40分程度は余ったと思います。早めに退場できました。

## 試験後の感想と次のステップ
それなりにしっかり勉強していたからか、試験自体はかなり簡単だと思いました。

認定テキストの内容に関しても、大半は前提知識のない方でもとっつきやすい内容になっていると思います。4-4のscikit-learnは文章が多く、他の節に比べたら難しく感じるかもしれませんが、機械学習の流れを理解できるので、個人的にはよい勉強になりました。

実装力はまったくつかないので、あくまでPythonや機械学習の基礎を学んでみたい、という方には有益な資格勉強時間になると思います。

## 読者へのアドバイス: 試験対策のヒント

試験前でとりあえず受かりたいという方は、節ごとに問題数が決められているので（公式サイト参照）、それを見て山を張るのがいいと思います。（一番難易度的には高いであろう4章は逃れられないですが）

時間があるという方で初心者の方は、ぜひ手を動かして実装してみると楽しく深い理解ができる思います。

それなりの知識が既にある方は、流し読み＋不安なところを重点的にやればすぐに受かるでしょう。

## おわり

読んでいただきありがとうございました。少しでもお役に立てれば幸いです。
タイトルと見出しはChatGPTに考えてもらいました:relaxed: