OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】環境構築まとめ

<h2>はじめに

現在Railsチュートリアル２周目に取り組み始めて約１週間が経つ
Railsチュートリアル７版ではGitHub CodespacesというクラウドIDE環境での開発が取り上げられている
→テンプレートが用意されていて、環境構築が非常に楽なのだが（というかほぼない）実際に環境構築をする際に何も知らなくて困ってしまう

更に私は来週から技育CAMPのオンラインハッカソンに出場する予定なので、
「さすがに環境構築を知らないのはまずい！」
と思い、環境構築について学習することにする。

もしかしたらチュートリアルのテンプレートは今後開発をする際にも流用できるのかもしれないが、他のエンジニアの方はおそらく環境構築から取り掛かっているだろうし、何かと今後困りそうなので！

基本的に<a href="https://qiita.com/kodai_0122/items/56168eaec28eb7b1b93b">こちら</a>の記事を参考にさせていただいてるが、具体的なインストール手順などは重複してしまうためこちらでは書かない。この記事では必要な部分を要約する形にしたい。


また私はMacBook Air M3を使用しているため、Mac OSでの環境構築となる


<h2>rbenv

そもそも私は何度か環境構築をしてきたのだが、まず聞き慣れないこのワードがでてきて何なのか全くわからなかった。

これは簡潔に言うと<strong>「Rubyのバージョン管理ツール」</strong>である。

これは1台のPCで複数のRailsアプリを作ろうとしたとき、「こっちのアプリではRuby2.5.0を使いたいけど、こっちはRuby2.6.0を使いたい...」という欲求が出てきたりします。
そんなときに活躍するのがrbenvだ。

では早速rbenvをインストールしていこう
しかしrbenvをインストールするためには<strong>Homebrew</strong>というツールが必要である。必要なツールが多重下請みたいで難しい。
具体的なインストール方法は元記事参照。

Homebrewがインストールできたら、次にrbenvをインストールしていく。
rbenvをインストールする際に、追加でruby-buildというプラグインもインストールしている。
ここでは簡単に、「`rbenv install`」コマンドを使うためだと理解する。
詳しくは<a href="https://takatoshiono.hatenablog.com/entry/2015/01/09/012040">こちら</a>のサイトが解説している。

<h2>Ruby

rbenvが無事インストールできたので、早速`rbenv install`でRubyのインストールに取り掛かる。
Macではデフォルトで`system`という名前でRubyがインストールされている。

ここで非常に重要なポイントが存在する。それは
**Rubyではディレクトリごとにバージョンを適用して運用する**点だ。

作業ディレクトリに移動している状態で、`rbenv local　バージョン名`コマンドをの後に`rbenv rehash`コマンドを打つことで適用できる。
このとき適用するバージョンはもちろんインストールされている必要がある
`rbenv -v`にて正しいバージョンが表示されていたら成功

<h2>Gem

Gemとは、　Rubyのライブラリであり、簡単に説明すると「プログラムをまとめて使いやすくしたもの」である。
ユーザー登録機能や認証機能といった複雑な機能も、gemを使えば簡単に実装可能になる。


<h2>Bundler

これは先程のgemを管理するためのツール。管理ツール多すぎ！！
bundler自体もgemの一種であり、これを使ってインストールしたりアンインストールしたりする。
Bundlerをインストールしたら、`bundle init`コマンドでGemfileを作成する
その後Gemfileのコメントアウトを外し、`bundle install`を実行する
詳しくは<a href="https://www.sejuku.net/blog/19426">こちら</a>を参照

<h2>データベースのインストール

データベースはよくわかってないので今後追記します！

<h2>Rails

ここまで来たらRailsをインストールする
最後に`gem install rails` を実行することでインストールできる
mruby on YABMのflashイメージをWindowsで作る

mruby on YABMの中でadmbm-mrubyやarmbm-mrubyはu-boot用になっています。

u-bootの場合vm(kernel)のu-bootイメージのファイルにmrbを連結するだけでflashに焼くためのイメージが作れます。

Windowsでmrubyをビルドするのは結構大変なので、itocさんがWindows版のmrubyのバイナリを用意してくれているので、それを使うことにします。

https://www.s-itoc.jp/support/technical-support/mrubyc/mrubyc-download/

mrbcコマンドを実行するためにはマイクロソフトのVisual C++の再配布パッケージのインストールが必要です。

![dll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/e169f7b9-e7b6-62ff-08fc-b9eeb51e9bea.png)

マイクロソフトのサイトでダウンロードしてインストールしてから実行してみます。

```
C:\Users\hiroki\armbm-win>mruby-3.3.0-win\mrbc hello.rb
```

これで出来たmrbファイルとu-bootイメージと連結します。[armbm-mruby](https://github.com/yamori813/armbm-mruby)のu-bootイメージはリリースに貼ってあります。

```
C:\Users\hiroki\armbm-win>copy /b main_wzr2.uboot+hello.mrb main.uimg
main_wzr2.uboot
hello.mrb
        1 個のファイルをコピーしました。
```

main.uimgをu-bootで焼けば出来上がりです。

実際に焼くにはtftpの機能が必要です。Windowsにはtftpのクライアントは入っていますが、サーバは入っていません。u-bootのtftpbootがサーバタイプでコンフィグレーションされていればWindowsのコマンドでイメージを遅れますが、クライアントタイプの場合には何らかのソフトが必要になります。
レシピ内のコメントを折り返す方法

# はじめに
Workatoはレシピ自体の可読性が高いので、チーム開発などで他者が作ったレシピを見た際に、「この処理は一体何をやっているんだろう？想像も付かない…」という状況になることはあまり無いかもしれません。

しかし、「レコード一括取得」などのアクションに見られるような、クエリーを駆使して自由度の高い条件を指定する場合や、formulaモードを利用して複雑なデータ加工をしている場合などには、レシピ作成者以外の人が初見でその動作や意図をくみ取るのは困難です。

コメントを書いておけば、複数の開発者がコメントを通じて意図や背景を共有できますし、将来のリファクタリングや機能追加の際にも、他の開発者や将来の自分がコードを理解しやすくなるため、メンテナンスが容易になります。

# コメントの追加方法
皆さんご存じの手順かと思いますが、念の為おさらいです。
該当アクションにマウスカーソルを置くと、右側に「･･･」(三点リーダー)が表示されます。
「･･･」をクリックし、「Add comment」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/f094fa43-8803-3378-241a-8af19f3049fc.png)

入力モードになるので、コメントを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/735e1878-61a7-5bef-c399-11809664e50f.png)


「✓」をクリックして、追加完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/c4d03895-3918-90bd-16cf-0f6df8044e13.png)



既存のコメントを修正する場合は、「･･･」をクリックし「**Edit comment**」を選択して編集します。

トリガーについても、同様の手順でコメントを追加・編集できます。

# コメントでの折り返し方法
先ほどのコメントは、読めば内容は分かりますが、長文がつらつらと書かれているので少し見づらい印象を受けます。
こういう時は改行を入れると、見た目が整理されて読みやすくなります。

コメント内で折り返すには、**Shift + Enter** を入力します。


＜改行を使って整えたコメントの例＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/307c2e05-6ad4-e6ea-ed1c-5016ab8520b6.png)


見出しを付けて構造化したことで、読みやすくなりました。
VSCodeの同期(SettingsSync)を一部非同期にして端末固有の設定を快適にする

## 結論
settings.jsonに

```
    "settingsSync.ignoredSettings": [
        "(除外したいキー)"
    ],
```

を指定するだけ。

### 例（最小構成）
```
    "simple-text-refine.prompt_path" : "(promptファイルのパス)",
    "settingsSync.ignoredSettings": [
        "simple-text-refine.prompt_path"
    ],
```

### 設定画面からみる
当該項目に「(同期されていません)」と表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/98c4104c-cacd-e64d-a153-9708674fa1fd.png)

## 発端
https://marketplace.visualstudio.com/items?itemName=yasuraok.simple-text-refine

を使っていて、WindowsとMacで同じアカウントを活用しており、これを同期（バックアップが目的）しているのだが、当然パスが違うので片方で設定して使用すると、もう片方の端末では使えないという状態になる
どちらも共通の環境で使えるようにWSL+Remote WSL構成にしたり色々やっていたが、VSCodeの環境構築のために色々手を尽くすのはなんだかなぁ、と思ったので、本格的にVSCodeの同期設定の課題解決に乗り出した。

対応した方法が↑の結論の通り。

## Simple Text Refine以外でも使えそうなもの
端末固有のパスを設定するものはほぼ全てが該当しそう
他にも端末固有に限定せず、色々な利用シーンがありそう
今すぐ使わないにしても、とりあえず一つ設定しておくとこのページをいちいちブックマーク・あとで読むなどに登録しなくて済むので、使っていない設定でもとりあえず置いておく、というのがおすすめ。

よく分からない場合は、本稿と同じように設定しておくと良いかも。
拡張機能置いときます
↓↓↓

https://marketplace.visualstudio.com/items?itemName=yasuraok.simple-text-refine
Flutterで二次元配列のJSONをDecodeする

二次元配列をDecodeしたかっただけやねん(´・ω:;.:... 

一旦`List<dynamic>`にしてから`List<List<int>>`にすればできました。

```dart
List<dynamic>.from(jsonDecode("json文字列"))
    .map((line) => List<int>.from(line))
    .toList();
```

お試し

```dart
    // 二次元配列をJSONに
    var array2d = [
      [1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]
    ];
    var jsonStr = jsonEncode(array2d);

    // 二次元配列に変換
    List<List<int>> decodedArray2d = List<dynamic>.from(jsonDecode(jsonStr))
        .map((line) => List<int>.from(line))
        .toList();

    print(decodedArray2d);
```
NiceGUI ネイティブアプリの作成向けTIPS

# NiceGUI ネイティブアプリの作成向けTIPS

自分の備忘録としても。

## ストレージパスの設定

NiceGUI は、アプリケーション内でデータを永続化するための仕組みとして「Storage」が用意されています。

https://nicegui.io/documentation/section_action_events#storage


ネイティブアプリ向けには ```app.storage.general``` を利用することになると思います。デフォルトでは実行フォルダに ```.nicegui/storage-general.json```という JSONファイルが作成され、ここに ```app.storage.general```の値が保存されるようになっています。

JSONファイルをどこ作るかは環境変数 ```NICEGUI_STORAGE_PATH``` を参照していて、定義がなければ、実行ディレクトリの ```.nicegui```以下に作られます。
なので、```ui.run``` を実行する前に適切なパスで環境変数を設定しておくと適当な位置に設定ファイルを保存することができる。パスについては ```platformdirs``` モジュールを利用すると適切なパスが取得できるため便利。

https://github.com/platformdirs/platformdirs


例えば以下によって、

```python
import platformdirs

os.environ["NICEGUI_STORAGE_PATH"] = platformdirs.user_config_path(
    ensure_exists=True
).as_posix()
```

```C:\Users\(UserName)\AppData\Roaming``` 以下に保存されるようになる。


## ファイルダイアログの表示

NiceGUIのドキュメントではファイルのアップロードに関しては```File Upload```エレメントがあるが、フォルダ選択やファイル保存のダイアログ表示については記載がありません。ネイティブアプリの場合はそれらが必要になることがあります。

例えば ```tkinter``` などを利用すればそれらダイアログを表示することもできますが、排他制御されないので、ダイアログが表示されている間もボタンなどはクリックできてしまいます。

どうするかというと、ドキュメントに

https://nicegui.io/documentation/section_configuration_deployment#native_mode

> In native mode the app.native.main_window object allows you to access the underlying window. It is an async version of Window from pywebview.

とあり、ネイティブモードでは ```app.native.main_window``` でNcieGUIアプリの```pywebview.Window``` オブジェクト（実際にはNiceGUIとの同期制御を含むラッパーになっている）にアクセスできるので、pywebviewのAPIを使用してダイアログを表示することができます。

https://pywebview.flowrl.com/guide/api.html#window-create-file-dialog


例えば、ボタンのクリックからフォルダ選択のダイアログを表示するには、

```python
async def onClickToPickFolder():
  selectedFolder = await app.native.main_window.create_file_dialog(
      dialog_type=webview.FOLDER_DIALOG
  )
  if selectedFolder is None:
    ui.label("canceled")
  else:
    ui.label(selectedFolder[0])

ui.button("Pick Folder", on_click=lambda: onClickToPickFolder())
```

のようにします。

ちなみに現時点でフォルダ選択のダイアログはツリー表示の形式であまり操作性というか見栄えが良くないのですが、今後より新しいスタイルのものに修正される見込みのようです。

https://github.com/r0x0r/pywebview/pull/1397
Copilot in Formsから改善提案されるようになった

Copilot in Formsで改善提案がなされるようになりましたのでまとめてみました（正直しょぼい）。

すでにたくさん回答が集まっているアンケートにも編集画面で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/16a5b1a5-4ef3-caee-2555-6c5d7c294504.png)


Copilotバナーの「表示」を押すとむちゃんこ分析を始めてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/7ce10cc2-6d34-5d3e-a3d5-2f0359bcf80c.png)

いくつかのアンケートで試してみたので書きなぐり（3つすべてを提案してくれるわけではなかったです）

## 改善提案①デザインの提案
デフォルトデザインでも、デザインものでもなにかしら提案してくれます。
いくつかのアンケートでみてみましたが、特に内容から提案してくれるわけではない模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/555e9389-5b20-4312-668c-4d95fb9ad86c.png)

## 改善提案②メールでのフォームの共有
Teamsグループや個人宛にフォームをOutlookで共有できるようです。
これは結構便利かも！！まだ本文は日本語対応していないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/8897d491-d08c-89c0-9e3e-f29300192edb.png)

## 改善提案➂設定の変更
Formsの回答後の設定（回答後にメールを送る設定や編集設定等）を変更できるようです。
むちゃんこ英語だけど、徐々に日本語になっていくのかなぁ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/2bce80a1-7899-8d92-1722-2e6270d4c8cd.png)

## 今後の予定
今のところ確認できたのは3件でしたが、うーんなんだかもうちょっと改善してほしかった。。
ロードマップにはCopilotを利用したドキュメントからのクイズ作成等が予定されています。

https://www.microsoft.com/en-us/microsoft-365/roadmap/?msockid=0ba57a4462376e721e256853634d6f53?msockid=0ba57a4462376e721e256853634d6f53&filters=Forms
BIMIって？？？

Voicy で SRE してます
今日は、メール認証技術の一つである BIMI について少し書いていきたいと思います

## BIMI って？
- Brand Indicators for Message Identification
- 認証された送信元からのメールにブランドロゴを表示する技術
- なりすましメールやフィッシング詐欺のリスクを軽減

## 前提条件
- SPF（Sender Policy Framework）
- DKIM（DomainKeys Identified Mail）
- DMARC（Domain-based Message Authentication, Reporting & Conformance）
- VMC（Verified Mark Certificate）

## 設定するには
- SPF/DKIM/DMARCの前提条件をクリア
- ロゴ用画像（SVG）を準備
- VMC（証明書）を購入・・・オプション
- DNSを設定

VMCを使用しない場合
```
default._bimi.domain.jp	text = "v=BIMI1;l=https://img.domain.jp/bimi.svg"
```
VMCを使用する場合
```
default._bimi.domain.jp	text = “v=BIMI1;l=;a=https://img.domain.jp/bimi.pem”
```

## こんな感じになるらしい（らしい）
![スクリーンショット 2024-07-16 15.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618488/b164a044-2185-6681-862e-4efd7dafd046.png)

## まとめ
- VMC証明書は現状 $1500/year とかする
- 画像ファイルのみだと対応してないとこが多い
- 使用できるSVGの条件が少し面倒
- 現状だと、導入するメリットがそこまでない

## We're hiring
絶賛、エンジニア（だけではなく）募集してます
カジュアル面談もやっていますので、お待ちしています

https://recruit.voicy.jp/
tegt

Sub ImportCSVFiles()
    Dim folderPath As String
    Dim fileName As String
    Dim ws As Worksheet
    Dim lastRow As Long

    ' CSVファイルが存在するフォルダのパス
    folderPath = "C:\"

    ' フォルダ内の最初のCSVファイルを取得
    fileName = Dir(folderPath & "*.csv")

    ' 新しいワークシートを追加
    Set ws = ThisWorkbook.Sheets.Add

    ' CSVファイルが存在する限りループ
    Do While fileName <> ""
        ' CSVファイルをインポート
        With ws.QueryTables.Add(Connection:="TEXT;" & folderPath & fileName, Destination:=ws.Cells(lastRow + 1, 1))
            .TextFileParseType = xlDelimited
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileColumnDataTypes = Array(1)
            .Refresh BackgroundQuery:=False
        End With

        ' 次のCSVファイルを取得
        fileName = Dir

        ' 最終行を更新
        lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    Loop
End Sub
Amazon Bedrock の Converse API 使って invoke_modelを置き換えてみる


## 前書き
Converse APIは２ヶ月前に発表されてますが、
langchainを使うケースが多かったので、メモとして残します。

https://aws.amazon.com/jp/about-aws/whats-new/2024/05/amazon-bedrock-new-converse-api/


## Converse APIとは

Converse API は Amazon Bedrock モデルと連動する一貫したエクスペリエンスを提供するため、開発者がモデル固有の実装を管理する必要がなくなります。この API を使用すると、コードを一度記述するだけで、Amazon Bedrock のさまざまなモデルでシームレスに使用できます。 ---公式の説明

今までモデルを使用する際に、モデルごとにフォーマットがバラバラでしたが、Converse APIを使用すれば、一貫したリクエストができるようになりました。

## サンプル

### 既存のコード

```python:invoke_model.py
import json
import boto3

bedrock_runtime = boto3.client(
    service_name = 'bedrock-runtime', 
    region_name  = 'us-east-1'
)

body = json.dumps(
    
    {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1000,
        "messages": [
            {
            "role": "user",
            "content": "Bedrockの意味"
            }
        ]
    }
)
    
modelId = "anthropic.claude-3-sonnet-20240229-v1:0"
  
    
accept = 'application/json'
contentType = 'application/json'
    
response = bedrock_runtime.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get("body").read())
answer = response_body["content"][0]["text"]
    
print(answer)
```
実行すれば、下記の出力が得られました。
```
BEDrockという言葉には、次のような意味があります。

1. 地質学での意味
- 基盤岩(がんばんがん)のこと。地層の最下部にある硬い岩石層を指します。

2. 転じた意味
- 基礎、根本、土台となるものを表す比喩表現。
- 例えば、「この発想は私たちの活動のベッドロックとなる」など、核心的な部分を指す言い方です。

3. その他
- Bedrockはマインクラフトの世界で、地下の一番下の固い岩盤層のことも指します。
- BEDrock(頭字語)は、ある組織の基本的な規則や価値観を表すこともあります。

つまり、BEDrockは文字通りの地質学的意味だけでなく、比喩的に重要な基礎、根源を表す言葉として使われています。組織や発想、活動の根幹を成す部分を指して用いられるの が一般的です
```
### Converse APIで置き換えてみます。

```python:converse_api.py
import boto3

bedrock_runtime = boto3.client(
    service_name = 'bedrock-runtime', 
    region_name = 'us-east-1'
)
modelId = "anthropic.claude-3-sonnet-20240229-v1:0"

prompt = "Bedrockの意味"

messages = [
    {
        "role": "user",
        "content": [{"text": prompt}],
    }
]

inferenceConfig = {
    "temperature": 0.1,
    "topP": 0.9,
    "maxTokens": 500,
    "stopSequences":[]
}

response = bedrock_runtime.converse(
    modelId=modelId ,
    messages=messages,
    inferenceConfig=inferenceConfig
)

print(response["output"]["message"]["content"][0]["text"])
```
同じ出力が得られました。
```
ベッドロック(bedrock)とは、次のような意味があります。

1. 地質学的な意味:
岩石の基盤となる最下層の固い岩層のこと。地表から掘り進んでいくと最終的にたどり着く非常に硬い岩層を指します。

2. 転じた意味:
- 基礎、礎、根底となるものの比喩表現
- 揺るぎない基盤や根本原理を表す言葉
- 何かの出発点や根源を指す言い方

例えば、
「この理論はベッドロックとなる原則に基づいている」
「彼の信念はベッドロックのように揺るがない」
など、物事の基盤や根本となる部分を表す言葉として使われます。

つまり、ベッドロックとは文字通りの地質学的な意味と、比喩的に何かの基礎や根源を指す
```
Amazon SageMaker Studio の Code Editor で docker build したり docker runできるようにする

# SageMaker Studio でも docker コマンドを使いたいこともあるよね
にわかに SageMaker Studio の Code Editor が脚光を浴びるようになってきました。

https://qiita.com/minorun365/items/f5289163795d5d7b21e2

ただ、そのままだと SageMaker Studio Code Editor では docker コマンドをネイティブに使えずに不便なことがあります。

しかし、実は公式に使えるようにできる方法があるのでその方法をガイドします。

ちなみに今回は Code Editor(CodeOSS)を対象としていますが、Studio JupyterLab でもできます。

## お作法その 1: create domain もしくは update domain
SageMaker Studio のドメインの作り方にお作法があります。
詳細は以下記事を見て欲しいのですが、create(update)-domain する際に、引数で明示的に設定する必要があります。

https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-local.html#studio-updated-local-enable

```shell
# region, domain-id は自身の環境に合わせて変更してください
aws --region region \
    sagemaker update-domain --domain-id domain-id \
    ### これが！！！
    --domain-settings-for-update '{"DockerSettings": {"EnableDockerAccess": "ENABLED",}}'
    ### 大事！！！
```
この `EnableDockerAccess` を `ENABLED` に設定することで、中に立てているインスタンスで docker コマンドが使えるようになります。

## お作法その 2: Code Editor で docker のインストール
Code Editor には docker がインストールされていないため、自分でインストールする必要があります。
ただし、インストール時に罠があります。
以下 URL 記載のここに細心の注意を払ってください。

> Studio only supports Docker version 20.10.X. and Docker Engine API version 1.41.

https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-local.html#studio-updated-local-enable

バージョン指定があります。なのでこれに合わせてインストールしましょう。

インストールの方法ですが、Code Editor の OS は Ubuntu なので、

https://docs.docker.com/engine/install/ubuntu/
に倣いつつバージョンだけ指定してインストールします。

Code Editor のターミナルから以下を打ち込みます。

```shell
sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce=5:20.10.24~3-0~ubuntu-jammy docker-ce-cli=5:20.10.24~3-0~ubuntu-jammy -y --allow-downgrades
```

## 使えるか確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504112/2c64ce95-7624-83aa-47e4-2a1c4c7da368.png)
いけましたね！

今回は

```Dockerfile
FROM public.ecr.aws/docker/library/python:3.9.19-slim-bullseye
```
という Dockerfile を用意して build したり、そのベースイメージで docker run してみました。

ちなみに注意があって、build するときは `--network sagemaker` という引数が、run するときは `--net sagemaker` という引数が必要です。

また、全ての docker コマンドがサポートされているわけではなく、ここに記載のコマンドのみなことに注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504112/8153bc37-3173-06da-47b1-0df0d4a31338.png)
https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-local.html#studio-updated-local-enable

以上、SageMaker Studio 大好きな人からの記事でした。

## 追伸
毎回インストールはだるいのでライフサイクルスクリプトとか使いましょう。
Amazon EBS ボリュームの種類

SAA-C03向けメモ

## Amazon EBS ボリュームの種類

<table>
<caption>Amazon EBS ボリュームの種類
<thead>
<tr><th><th colspan=2>プロビジョンド IOPS<br>SSD<th colspan=2>汎用<br>SSD<th>スループット最適化<br>HDD<th>コールド<br>HDD
<tbody>
<tr><td>ボリュームタイプ<td>io2　Block Express<td>io1<td>gp3<td>gp2<td>st1<td>sc1
<tr><td>最大 IOPS*/ボリューム<td>256,000<td>64,000<td colspan=2>16,000<td>500<td>250
<tr><td>最大スループット<br>(MiB/秒)<td>4,000<td>1,000<td>1,000<td>250<td>500<td>250
<tr><td>無料<td><td><td>3,000IOPS<br>125 MiB/秒(スループット)<td><td><td>
<tr><td>最小ボリュームサイズ<br>(GiB)<td colspan=2>4<td colspan=2>1<td colspan=2><b>125</b>
<tr><td>ユースケース<td>ミリ秒未満のレイテンシー<br>持続的な IOPS パフォーマンス<td>I/O 集約型のデータベースワークロード<br>持続的な IOPS パフォーマンス<td colspan=2>トランザクションワークロード<br>仮想デスクトップ<td>ビッグデータ<br>データウェアハウス<br>ログ処理<td>ファイルサーバー<br>低頻度アクセス
<tr><td>ブートボリューム<td colspan=4>◯<td colspan=2>×
</table>

*16Ki I/O サイズに基づく io1/io2 Block Express/gp2/gp3、1 MiB I/O サイズに基づく st1/sc1


<details>
<summary>表を横にスライドしたい場合はこちら</summary>

<table>
<caption>Amazon EBS ボリュームの種類
<thead>
<tr><th><th colspan=2>プロビジョンド IOPS<br>SSD<th colspan=2>汎用<br>SSD<th>スループット最適化<br>HDD<th>コールド<br>HDD
<tbody>
<tr><td>ボリュームタイプ<td>io2　Block Express<td>io1<td>gp3<td>gp2<td>st1<td>sc1
<tr><td>最大 IOPS*/ボリューム<td>256,000<td>64,000<td colspan=2>16,000<td>500<td>250
<tr><td>最大スループット<br>(MiB/秒)<td>4,000<td>1,000<td>1,000<td>250<td>500<td>250
<tr><td>無料<td><td><td>3,000IOPS<br>125 MiB/秒(スループット)<td><td><td>
<tr><td>最小ボリュームサイズ<br>(GiB)<td colspan=2>4<td colspan=2>1<td colspan=2><b>125</b>
<tr><td>ユースケース<td>ミリ秒未満のレイテンシー<br>持続的な IOPS パフォーマンス<td>I/O 集約型のデータベースワークロード<br>持続的な IOPS パフォーマンス<td colspan=2>トランザクションワークロード<br>仮想デスクトップ<td>ビッグデータ<br>データウェアハウス<br>ログ処理<td>ファイルサーバー<br>低頻度アクセス
<tr><td>ブートボリューム<td colspan=4>◯<td colspan=2>×
<tfoot>
<tr><th colspan=14>$\hspace{88em}$</th></tr>
</tfoot>
</table>

</details>


## その他

#### インスタンスストア
このストレージは、EC2インスタンスが稼働するホストに物理的に接続されているディスク上にある。エフェメラル（一時的）なストレージだが、ネットワーク越しのEBSよりも追加コストなしで高い IOPS/スループット。
||EBS|インスタンスストア|
|---|---|---|
|インスタンスの停止|可能|不可能|
|基盤ホストに障害|データを失わない|データを失う|
|終了|デフォルトでは終了時に削除。ただし、ルートデバイスボリュームをEBSボリュームと共に保持するように変更可能|失う|
|再起動|可能|可能|

#### スナップショット→S3
RAMにデータがあってはダメなので、インスタンスを停止すべき

#### 作成されたリージョン内でのみ共有可能
他リージョンに共有するにはまずコピーする

#### ブートボリューム
インスタンスの起動に使用されるイメージを含むボリューム

#### ボリュームタイプ
g=general
t=throughput
c=cold


## 参考
https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-volume-types.html
https://aws.amazon.com/jp/ebs/volume-types/
https://aws.amazon.com/jp/ebs/pricing/
Pythonを使ってWord文書の透かしを一括削除

Word文書は、さまざまな正式および非正式なコミュニケーションの場で広く使用されています。時には、これらの文書に不要な透かし（ドラフトマーク、秘密保持声明、プレビュー用情報など）が含まれていることがあります。これらの透かしは文書の読みやすさを妨げるだけでなく、場合によっては情報伝達の不正確さや誤解を招くことさえあります。**Word文書の透かしを削除する**ことで、不要なトラブルを減らすことができます。Pythonのようなプログラミング言語を使用することで、これらの作業を自動化し、効率的にWord文書から透かしを削除し、文書の専門性と正確性を確保することができます。本記事では、**Pythonを使用してWord文書の透かしを一括削除する方法**を紹介します。

- **[PythonでWord文書の文字透かしと画像透かしを削除](#pythonでword文書の文字透かしと画像透かしを削除)**

本記事で使用する方法には、[Spire.Doc for Python](https://jp.e-iceblue.com/introduce/spire-doc-for-python.html)が必要です。PyPIからインストールできます：`pip install Spire.Doc`。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## PythonでWord文書の文字透かしと画像透かしを削除
`Document.Watermark`プロパティを`None`に設定することで、Word文書から文字透かしや画像透かしを削除できます。操作手順は以下の通りです：

1. `Document`モジュールをインポートします。
2. フォルダを指定し、そのフォルダ内の`.docx`および`.doc`拡張子のファイルをループ処理します。
3. `Document`オブジェクトを作成し、`Document.LoadFromFile()`メソッドを使用してこれらのファイルを読み込みます。
4. `Document.Watermark`プロパティを`None`に設定して透かしを削除します。文字透かしも画像透かしも削除されます。
5. ファイルを保存し、リソースを解放します。

**コード例**
```python
import os
from spire.doc import Document

# Documentオブジェクトを作成する
doc = Document()

# 入力フォルダを指定する
inputFolder = "文書サンプル/"

# フォルダ内のファイルを巡回する
for root, dirs, files in os.walk(inputFolder):
    for file in files:
        # フォルダ内のWord文書のパスを取得する
        if file.endswith((".docx", ".doc")):
            # 現在のファイルを読み込む
            doc.LoadFromFile(os.path.join(root, file))
            # 透かしを削除する
            doc.Watermark = None
            # ファイルを保存する
            doc.SaveToFile(os.path.join("output/RemoveWatermark/", file))

doc.Close()
```

結果
![PythonでWord文書の透かしを一括削除](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/82db3175-6793-5afb-00bf-8bb27cdabed7.png)

本記事では、Pythonを使用してWord文書の透かしを一括削除する方法を示しました。

さらに多くのWord文書処理のコツについては、[Spire.Doc for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Spire.Doc-for-Python-Program-Guide-Content.html)をご覧ください。
Typescript + viteでworker/AudioWorkletProcessorつくるならimport suffixつけるだけ!

# TD; LR;
suffixつけるだけでworkerもurlなtsもちゃんとトランスパイルしてくれるよ、よかったね、という話です

# ちょっとだけ詳細
workerやWorkletのように外部のjsを読みこむ必要があるコードを実装する必要がある場合、そのファイルをどう生成するのかがちょっとした課題になることがあります
rawなjsを書くなり、buildの設定でoutputを追加してあげればいいのですが、viteではimportにparameterを追加することで、そういった生成をうけもってくれます

# 読め
https://ja.vitejs.dev/guide/features#%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%BC%E3%82%B5%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A4%E3%83%B3%E3%83%9B%E3%82%9A%E3%83%BC%E3%83%88
ちゃんとドキュンメントあるからね!

# サンプル
```typescript
import Worker from './worker.ts?worker'
import workletURL from './MyAudioProcessor.ts?url'
const setupAudioWorklet = async() => {
    const userMedia = await navigator.mediaDevices.getUserMedia({audio:true, video: false})    
    const audioContext = new AudioContext()
    audioContext.resume()
    const microphone =await audioContext.createMediaStreamSource(userMedia)
    await audioContext.audioWorklet.addModule(workletURL)
    const audioNode = new AudioWorkletNode(
      audioContext,
      'MyAudioProcessor'
    )
    microphone.connect(audioNode).connect(audioContext.destination)
 
}

const setupWorker = () => {
    const worker = new Worker();
    worker.postMessage({data: 'hello'})

}
const main = async() => {
    setupAudioWorklet()
    setupWorker()
}
document.addEventListener('DOMContentLoaded', () => {
    const button = document.querySelector('#button') as HTMLButtonElement
    button.addEventListener('click', async() => {
        main()
    })
}) 

```
https://github.com/generosennin/worker-sample
完全なコードはこちら


# まとめ
build設定をじらず、workerやWorkletのjsをトランスパイルする方法でした
ヒーロー保育士の誕生？！音声機能VUIとDifyのコラボで、子どもの怪我への対応をサポートするよ！完結編

## 保育士はヒーローだ ##

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/4d6c2535-bbad-2d12-8ebf-5a08b7371b3a.png" width=70%>

子どもが怪我をしたら、
自分の危険を顧みず、すぐに助けに行き
やりたいことを見守ってくれる保育士さん。
わたしは、**ヒーロー**だと思います。

そのヒーローたちが安心して活動できるよう
以前から怪我の時の対応を
サポートできるものを作っていました。

## 今回ついに完成しました！ ##
VUIで怪我の処置を教えてくれるアプリです！！
園でよく起こる怪我「擦り傷」や「鼻血」などは
一言で処置の対応を教えてくれます。

また、その他のケガも「◯◯の処置」などと
呼びかけると怪我の対応手順を
教えてくれるので、手が離せなくても
安心して、落ち着いた処置ができますよー！


**↓ここから使えます**

https://creator.voiceflow.com/prototype/66a71b300cf2e890e24f8ea2


**↓前回の記事はこちらから見られます**

https://qiita.com/riyu_11/items/e8c6a1a57d730bd38b40

### ↓当時の保育現場をのぞいてみよう ###

https://zenn.dev/riyu/scraps/b795c5e515024c


## 作り方はこうだ！！ ##

### 準備するツール ###

💻　**Dify**：https://cloud.dify.ai/apps
💻　**Voiceflow**：https://www.voiceflow.com/

**前回の続きからです！**
（前回の記事は冒頭にあります。）

### 作り方 ###




①DifyのアプリをAPI化する
左側の「APIアクセス」を選び
右上の「APIキー」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/c3b88ce7-2f64-6bd0-deaa-b6d70ba92a5c.png
" width=70%>


②「新しいシークレットキーを作成」から
APIキーを取得してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/56782590-0f8b-bee9-c21f-60710eefeb8f.png
" width=70%>


 ③VoiceflowでAPIキーを挿入
 ・Listenの中の「capture」を選択し
 　下記のように入れていきます。

  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/00fb295c-ec7d-0acf-bef3-d222f2e27340.png
" width=70%>

・APIのボックスを作ります。

 <img src="https://storage.googleapis.com/zenn-user-upload/6d1b4a368178-20240729.png
" width=70%>

・ボックスの中は下記のように入れていきます。
→Difyの中に説明が載っているので
この通りに入れていきます。
（DifyのAPIアクセスのページです。）

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/b3be3b4f-59e8-88f2-976c-4b8d4326ed7c.png
" width=70%>

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/f1009021-eb42-2a96-a747-f1fc43243a39.png
" width=70%>

（userのところは
　後に自分で設定することをおすすめします）


④ 最後に返答してくれるボックスを入れます。
　上と下とそれぞれ下記のように入力してください。

**・上のボックス**
　（基本的にこちらに流れるようになります）
 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/e353dc47-a869-7e12-d6ff-75bd3ef08d55.png
" width=70%>

**・下のボックス**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/ad3fef59-b34b-8937-0e43-299da28823d9.png
" width=70%>

⑤Run Testしてみると
どうでしょうか！！うまくいきましたか？？

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/acf2672d-140f-2a93-00d5-7cae2a7f541f.png
" width=70%>

**完成です！！**

## これからやってみたい！！ ##

**主にテキスト化に挑戦してみたいです！！**

💡音声がテキスト化され、
　保護者への状況を伝える時に共通資料となり
 怪我の状況を誰でも同じに伝えられ
 柔軟に保育士同士が対応できる。

💡音声がテキスト化されたものを
　事故報告書に自動的にテキスト入力され
 保育士の業務負担が改善！！

**このアプリを使って子どもたちの
怪我を保育士の心の負担もなくしながら
対応が実現する未来がもうすぐ・・・！！**

より良い保育のために
これからも全力で作っていきます！！
【AWS】teratermでAWS EC2(Linux)に接続しようとしたら失敗した

# はじめに
AWS初学者な著者はいつかに購入したUdemyを使用して勉強していたところ、EC2インスタンスにて立てたAWS Linux2024にTeraTermからSSH接続をしよう！というフェーズでなぜかうまくログインが出来ませんでした。



# 発生環境
+ OS：Windows11
+ Tera Term：4.106
+ 接続先：Amazon Linux 2023


# 作業内容

### 1.EC2を作成する
+ AMI(Amazonマシンイメージ）：Amazon Linux 2023
+ セキュリティグループ：インバウンドルールにTCP 22番ポートが許可されているもの（SSH接続に必要な通信を許可）
+ キーペア：プライベートキーが手元にあるもの、もしくは新規作成しプライベートキーをダウンロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/65fe69bb-92df-9480-5020-dc905b92ad80.png)

### 2.SSH接続を実施する
+ ユーザ名：デフォルトから変えていないので「ec2-user」
+ 認証方式：RSA/DSA/ECDSA/ED25519鍵を使う→プライベートキーファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/beb2eeb6-6633-c6af-11db-ae5ad3ecd936.png)

:::note alert
「認証に失敗しました。再試行してください」というエラーが出力される。
:::







# 解決法
teratermのバージョン5をインストールするとSSH接続ができるようになった。

https://github.com/TeraTermProject/osdn-download/releases










# Why
おそらくteratermを最新バージョンにすれば治る噂を信じて先に検証してしまいましたが、よくよく調べたら以下のような記載を見つけました。


### AWS Linux 2023 ユーザーガイド
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/ssh-host-keys-disabled.html

AWS Linux 2023のユーザーガイドに以下2つの記述があります。

> デフォルトの ssh-rsa 署名の無効化
>
>AL2023には、ssh-rsa従来のホストキーアルゴリズムを無効にし、ホストキーの削減セットを生成するデフォルト設定が含まれています。クライアントは ssh-ed25519 または ecdsa-sha2-nistp256 ホストキーアルゴリズムをサポートする必要があります。

> 公開キー認証に RSA キーペアを使用する場合、SSH クライアントは rsa-sha2-256 または rsa-sha2-512 署名をサポートしている必要があります。









### Tera Term 5.0 リリースノート
https://github.com/TeraTermProject/teraterm/releases/tag/v5.0

AWS Linux 2023のユーザーガイドに以下のような記述があります。

> SSH鍵生成ダイアログのデフォルトの鍵形式を ED25519 に変更した。







# Tera Termの設定を確認
[ Tera Term ] ＞ [ 設定 ] ＞ [ SSH ]を開き、以下の画像の赤枠を確認。

・優先するホストキーアルゴリズムの順(S)(SSHのみ)：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/ee8f8900-3565-35a2-fe0e-bfa83c18e427.png)

上は古いバージョン(Tera Term：4.106)、下は新しいバージョンの設定画面ですが、新しいバージョンにのみ ```「rsa-sha2-256 または rsa-sha2-512」``` がサポートされていることを確認しました。
```「ecdsa-sha2-nistp256」```は両方に存在するので関係なさそう？
勉強不足ですみません。ここはまたタイミングあればちゃんと勉強して更新します。





# 参考サイト

・【EC2】Amazon Linux 2023にTeratermで接続できない？

https://www.cloudbuilders.jp/articles/3200/


・Amazon Linux 2023に対してTera Term接続

https://qiita.com/AlmondTofu/items/0dba0f0880a4da3f0e2f


・ Tera Term 5.0 リリースノート

https://github.com/TeraTermProject/teraterm/releases/tag/v5.0


・AWS Linux 2023 ユーザーガイド

https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/ssh-host-keys-disabled.html


・Tera Term 5.0 がリリースされました！

https://dev.classmethod.jp/articles/tera-term-5-0-released/
ESP32: 距離計測センサー　AE-VL53L0X の使い方

## プログラム

```text:vl53l0x.ino
// ---------------------------------------------------------------------
//	vl53l0x.ino
//
//						Jul/30/2024
// ---------------------------------------------------------------------
#include "Adafruit_VL53L0X.h"
Adafruit_VL53L0X lox = Adafruit_VL53L0X();

// ---------------------------------------------------------------------
void setup() {
	Serial.begin(115200);

	// wait until serial port opens for native USB devices
	while (! Serial) {
		delay(1);
	}

/*
	pinMode(4,OUTPUT);
	delay(100);
	digitalWrite(4,HIGH);
	delay(100);
*/
	
	Serial.println("Adafruit VL53L0X test");
	if (!lox.begin()) {
		Serial.println(F("Failed to boot VL53L0X"));
		while(1);
	}
	// power 
	Serial.println(F("VL53L0X API Simple Ranging example\n")); 
}

// ---------------------------------------------------------------------
void loop() {
	VL53L0X_RangingMeasurementData_t measure;
		
	Serial.print("Reading a measurement... ");
	lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!

	if (measure.RangeStatus != 4) {	// phase failures have incorrect data
		Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter);
	} else {
		Serial.println(" out of range ");
	}
		
	delay(1000);
}

// ---------------------------------------------------------------------
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/12de71d4-fdb8-e1f8-7d99-a19a366577ad.png)
Outlookの予定リマインダーをLINEに通知する

## はじめに
メロスは（自分自身に）激怒した。
メロスは当日の会議予定を忘れる。
メロスは、ド文系の下っ端のゆとり世代の情シスである。笛を吹き、羊と遊んで暮して来た。
けれども自分のやらかしに対しては、人一倍に敏感であった。
<br>
<br>

会議予定をついうっかり忘れてしまう愚かな自分に会議のリマインダー通知を送るフローを作りました。

PowerAutomateとLINE Notifyを使います。
[LINE Notify](https://notify-bot.line.me/ja/)は個人のLINEアカウントがあれば誰でも無料で使えます。

## 準備
LINE Notifyにログインして、アクセストークンを取得します。
通知先はLINE Notifyを招待したグループチャットにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/97b64833-53bb-dd8d-b017-f6e7cc756a6f.png)

## PowerAutomate
全体図はこんな感じです。わぁ簡単
トリガーをOffice 365 Outlookの「予定しているイベントが間もなく開始されるとき(V3)」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/49d2e738-1e17-2f62-018c-c36ee69ad92c.png)
<br>
その次の「タイムゾーンの変換」はLINE通知用に時間の体裁を変えるために追加しています。
無くても良いですが、通知メッセージの中に時間を入れたい方は入れてあげましょう。
UTC世界標準時→UTC+09:00日本標準時間に変換し
24:00となるように書式を変更しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/dc137368-7616-3524-434e-5abac848cc82.png)
<br>
そのあとの並行処理ですが、
1つは個人LINEに、並行して会社ドメインのTeamsに通知を送ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/c23ba3fd-08a3-fb78-8c2f-ca7e0c83f087.png)
|項目|値|
|:-:|:-:|
|URI|https://notify-api.line.me/api/notify|
|Method|POST|
|Headers|Authorization=Bearer YOUR_LINE_ACCESS_TOKEN<br>Content-Type=application/x-www-form-urlencoded|
|Body|message=よしなに|
<br>
完成です。
<br>
<br>
テストとしてOutlookで予定を登録してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/6fd71976-4f3c-f373-4a9d-9eacdd074fde.png)
<br>
LINEに通知が来てますね。
（独り言：このぼのぼのの着せ替えメッチャかわいくないですか？）
![line.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/3b93e17e-993b-878a-2ab2-eb945975f04d.jpeg)
<br>

## おわりに
Web会議や打ち合わせなど、分かってはいるけどあることをうっかり忘れてしまう。
その度に「やっちまった！！」と自己嫌悪に陥っていました。
これで改善するといいナ...
あと弊社は個人デバイスから会社ネットワークにアクセスする際は
BYODの申請が必要なんですが、会社→個人デバイスはどうなんだろうな...と思う今日このごろ。
Don't Hit Me! Glass Detection in Real-world Scenes

[Don’t Hit Me! Glass Detection in Real-world Scenes](http://gdd.dluticcd.com/static/upload/file/20240229/1709205909146985.pdf)
https://mhaiyang.github.io/CVPR2020_GDNet/index

github [CVPR2020_GDNet](https://github.com/Mhaiyang/CVPR2020_GDNet)

![](https://mhaiyang.github.io/CVPR2020_GDNet/pipeline.png)
![](https://mhaiyang.github.io/CVPR2020_GDNet/CVPR2020_Glass_1.gif)

ガラスは私たちの日常生活において非常に一般的なものである。既存のコンピュータビジョンシステムはガラスを無視しているため、ロボットがガラスの壁に衝突するなど、深刻な結果を招く可能性がある。しかし、ガラスの存在を検知することは容易ではない。重要な課題は、ガラスの向こう側には任意の物体や風景が現れる可能性があり、ガラス領域内に表示されるコンテンツは通常、ガラスの外側に表示されるものと類似していることである。本稿では、1枚のRGB画像からガラスを検出するという、興味深いが重要な問題を提起する。この問題に対処するため、我々は大規模なガラス検出データセット(GDD)を構築し、新しい大視野文脈特徴統合モジュールを用いて、大局的な観点から豊富な文脈特徴を学習することにより、GDNetと呼ばれるガラス検出ネットワークを設計する。広範な実験により、提案手法がGDDテストセットにおいて優れたガラス検出結果を達成することを実証する。特に、ガラス検出のためにファインチューニングされた最先端の手法を凌駕する。

## この手法の特徴
- 1枚のRG画像からガラスを検知するという部分。
- ガラス領域のセグメンテーションをするものであって、depthの算出はしない。
結合.ps1(3)

``` powershell:sample
param (
    [string]$outputFile,
    [string]$inputFiles
)

# 引数のチェック
if (-not $outputFile -or -not $inputFiles) {
    Write-Host "Usage: script.ps1 -outputFile outputfile.txt -inputFiles inputfile1.txt,inputfile2.txt"
    exit 1
}

# 出力ファイルの初期化
if (Test-Path $outputFile) {
    Remove-Item $outputFile
}

# 入力ファイル名をカンマで分割して配列に格納
$inputFileArray = $inputFiles -split ','

# 配列の内容を処理
$firstFile = $true
foreach ($inputFile in $inputFileArray) {
    if (-not (Test-Path $inputFile)) {
        Write-Host "Error: Input file $inputFile not found."
        exit 1
    }

    # 最初のファイルはそのまま全ての行をコピー
    if ($firstFile) {
        Get-Content $inputFile | Add-Content $outputFile
        $firstFile = $false
    } else {
        # 2つ目以降のファイルは1行目をスキップしてコピー
        $lines = Get-Content $inputFile
        if ($lines.Length -gt 1) {
            $lines[1..$lines.Length] | Add-Content $outputFile
        }
    }
}

Write-Host "Files combined successfully into $outputFile."

```
[忘備録] venvで作成したPython3.12仮想環境でtkinterが使えない場合の対処法

## 解決方法
* `sudo apt-get install python3.12-tk` 
    * 使いたいPythonのバージョンに合わせた`python[version]-tk` をインストール

## 環境
* Ubuntu 22.04.4 LTS(WSL2)
* python3.12 
* venv 3.12

## 症状
* `python3.12 -m venv env_name` で仮想環境作成
* 作成した仮想環境下で`import tkinter as tk` すると以下のエラー
```bash 
> python main.py
Traceback (most recent call last):
  File "~", line 1, in <module>
    import tkinter as tk
ModuleNotFoundError: No module named 'tkinter'
```
## 参考記事
* [ModuleNotFoundError: No module named '_tkinter' on WSL 2 with ubuntu](https://stackoverflow.com/questions/78805000/modulenotfounderror-no-module-named-tkinter-on-wsl-2-with-ubuntu)
保守現場の不具合対応について

こんにちは、小林と申します。
今回は保守現場においてシステム関連の不具合対応をお話したい思います。



# 1．状況確認
- お問合せ内容の確認
例えば、「出力した項目の値が1になっていなければならないのに5になっている」や
「今まではこの作業が出来たのに今日になって出来なくなった」など
様々な内容のお問合せがあります。
そういった場合にどのような事が大切か説明していこうと思います。
〇お客様側に確認する事
　(1)どんな手順で出力したのか
　(2)どの値になる事が正しいのか
〇システム側に確認する事
　(1)なぜ1として表示されるはずの値が5になっているのか
　(2)データに誤りがない場合どのようにすれば正しい値が出力できるのか
　　など様々な方面へ内容の確認をする必要があります。

- 仕様の確認
正解をしっかり把握しておく事で闇雲に調査する事を防ぐ事が出来ます。
「こうなるはずだ」の思い込みで調査をするのは間違った結果につながる恐れがあり危険です。
また前提となる条件も確認して置く必要があります。


# 2．データを調査する
- システム部へ調査依頼
ヒヤリングした内容から該当の事象が再現できるのか調査します。
再現できる場合はその内容をシステム側へ調査依頼を依頼し「こうなっている」という事実の部分を把握。
再現出来ない場合、状況確認から再度調べていく必要があります。

- 他に結果を影響を与えているデータがないかを確認をする
希望の出力データを出せるように設定を変更した場合、別の部分で影響は出ないのか、など事実の解明依頼だけでなくその先の動きも把握していく必要があります。

# 3．最終確認
- 想定通りの動きをしているかの確認
システム部からの回答を元に想定している動きになるか確認します。
想定している動きをしていればお客様へ報告、していなければ再度調査を行います。

# おわり
調査は、結果的には大した原因ではない事もありますが、その原因を見つけるまでに時間を費やすことが多々あります。最短で解決まで導くために日々ヒヤリング力を上げていく事が大切です。


以上、小林でした。
ESP32: AE-BNO055-BO の地磁気センサーの使い方

## プログラム

```text:magnetic.ino
// ---------------------------------------------------------------------
//	magnetic.ino
//
//						Aug/01/2024
// ---------------------------------------------------------------------
#include <Adafruit_BNO055.h>

Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);
// ---------------------------------------------------------------------
void setup(void) {
	Serial.begin(115200);
	Serial.println("AE-BNO055-BO Test");

	if (!bno.begin()) {
		Serial.println("AE-BNO055-BO not detected. Check your connections or I2C address.");
		while (1);
	}

	delay(1000);
	Serial.println("*** setup end ***");
}

// ---------------------------------------------------------------------
void loop(void) {
	sensors_event_t mevent;
	bno.getEvent(&mevent,Adafruit_BNO055::VECTOR_MAGNETOMETER);
	Serial.print("Magnetic: ");
	Serial.print(mevent.magnetic.x, 4);
	Serial.print(" ");
	Serial.print(mevent.magnetic.y, 4);
	Serial.print(" ");
	Serial.print(mevent.magnetic.z, 4);
	double htt = (180.0 / PI) * atan2(mevent.magnetic.x, mevent.magnetic.y);
	double heading = 360.0 - htt;
	if (360.0 < heading)
		{
		heading -= 360.0;
		}

	if (heading < 0)
		{
		heading += 360.0;
		}

	Serial.print(" ");
	Serial.println(heading, 4);

	delay(2000);
}

// ---------------------------------------------------------------------
```

Ubuntu 24.04 上の Arduino IDE 2.3.2 を使いました。
ボードは、 ESP32 Dev Module です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0862c6e7-50ee-9318-c41c-5b911de7bdc6.png)
powershellでファイル結合２

```powershell:sample

param (
    [string]$outputFile,
    [string]$inputFiles
)

# 引数のチェック
if (-not $outputFile -or -not $inputFiles) {
    Write-Host "Usage: script.ps1 -outputFile outputfile.txt -inputFiles inputfile1.txt,inputfile2.txt"
    exit 1
}

# 出力ファイルの初期化
if (Test-Path $outputFile) {
    Remove-Item $outputFile
}

# 入力ファイル名をカンマで分割して配列に格納
$inputFileArray = $inputFiles -split ','

# 配列の内容を処理
foreach ($inputFile in $inputFileArray) {
    if (-not (Test-Path $inputFile)) {
        Write-Host "Error: Input file $inputFile not found."
        exit 1
    }

    # 入力ファイルの内容を出力ファイルに追加
    Get-Content $inputFile | Add-Content $outputFile
}

Write-Host "Files combined successfully into $outputFile."

```
FTPサーバーログイン時の Exit Programを書いてみる（苦手）

という事で書いてみます(´;ω;｀)。

## マニュアル記載のCLPサンプルを使う

[前の記事](https://qiita.com/gomAnomalocaris/items/9d61b8e0b7a3c311d94c)で紹介した、[CLPのサンプル](https://www.ibm.com/docs/ja/i/7.5?topic=fslep-example-ftp-server-logon-exit-program-in-cl-code)でやってみます。

### **①RDiでマニュアル記載のサンプル↓をコピペします。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a710f16a-871b-c1a1-58ee-8cf13f5babc3.png)

コピペしたソースをつらつら眺めますと、49行目以降がキモのロジックです。
下の方で、FTPにユーザーANONYMOUSなんちゃら でログインした場合は、ライブラリー（スキーマ） PUBLIC　に変更しています。
ANONYMOUSなんちゃら以外の場合は特に操作せず、リターンコードに1をセットしてプログラムを終了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ffd56623-d5d8-ef8b-1440-810a629f0e13.png)

一先ずこのまま動作確認するために、ライブラリー PUBLICを作成します。方法は色々ありますが、手っ取り早く、RDi で　*ALLUSRのフィルターを作ってそこから右クリック -> ライブラリーの新規作成でライブラリーPUBLICを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/106c4469-44fd-3a56-243a-54d8f4ec6ed5.png)


### **②では、コンパイルしてみます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5d70a64e-6215-354d-7eb8-2c09993389c4.png)

エラーになりました  ToT

### **③マニュアル記載サンプルをデバッグする**

・・・でエラーに従ってソースを眺めていると・・・・( ,,`･ω･´)ﾝﾝﾝ？

あー、

ココ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4f2ba40a-6090-e41e-2dac-4f68add17bb4.png)

マニュアルのオリジナルを見ると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8db7bd58-80ab-b18d-40cb-e2c1c7dc36cc.png)

おいおい・・・（脱力）・・・改行されてますがな・・・
***正しくは THEN(DO) は上の IF COND(%SST...) に続けて記述しないといけないのですが、何かの拍子に改行されてしまったようです。***

***クオリティ IS BAD.*** ですね。

修正します。52行目を修正完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/790dbc8a-395d-2e15-d3e2-9aa0bdf2e5ca.png)

### **④再度コンパイルします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/55408529-40bb-ac62-e51e-02cc36130577.png)

コンパイル通りました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/49fff3e3-fa5d-6406-5dd1-aa21320e15b3.png)

これでようやくExit Program が完成しました。このExit Programを出口点Exit Pointに登録すればアノニマスほにゃららはライブラリーPUBLICに変更されるはず？です。


・・・このレベルなら苦手な私でもExit Programが書けそうな気がしてきました。(　ﾟдﾟ)ｳﾑ

※次にもう一つのExit Point 妥当性検査 QIBM_QTMF_SERVER_REQ の出口プログラムも作成が必要です。（忘れてました・・^^;）
サンプルがこちらに記載ありました。（作成予定）
[例: CL コードで作成された FTP クライアントまたはサーバー要求妥当性検査用出口プログラム](https://www.ibm.com/docs/ja/i/7.5?topic=rvepcs-example-ftp-client-server-request-validation-exit-program-in-cl-code)

[(上記Exitプログラム作成後の)続きはこちらです。](https://qiita.com/gomAnomalocaris/items/71aef415716067fe80e5)
JuliaでPauli行列のコンストラクタをつくる1

# Pauli行列とは
特殊ユニタリ群$SU(2)$のリー代数$\mathfrak{sl}(2)$の生成子となる行列です。
カタカナだとパウリ行列です。
量子力学だとスピン角運動量のところで出てきたり、エルミートなハミルトニアンを記述しようと試みるとよく出てくるかと思います。

# (2024/8/26　追記)
続きの記事を作成しました。

https://qiita.com/ryoi084/items/f27dd0ad2ef17976fb4e

# コンストラクタを定義
実装してみます。

```julia
Base.@kwdef struct PauliMatrices <:AbstractFloat
    I = [1. 0.; 0. 1.]
    x = [0. 1.; 1. 0.]
    y = [0. -im; im 0.]
    z = [1. 0.; 0. -1.]

    Matrix = Array([I,x,y,z])
end # struct PauliMatrices

Base.getindex(L::PauliMatrices, ind::Integer) = L.Matrix[ind+1]
Base.getindex(L::PauliMatrices, inds::UnitRange) = L.Matrix[inds.+1]
```
(ちなみに、`Base.getindex(L::PauliMatrices, inds::UnitRange) = L.Matrix[inds.+1]`のコマンドは、パウリ行列をスライスで取り出す操作のためなので、省略していただいても実用上問題ありません。)

# 使用方法
次のように、Pauli行列にしたいインスタンスを用意して、`PauliMatrices`を入れてあげます。
```julia
 σ = PauliMatrices()
```
すると、次のようにindexで呼ぶことができるようになります。

```julia
julia> σ[1]
2×2 Matrix{ComplexF64}:
 0.0+0.0im  1.0+0.0im
 1.0+0.0im  0.0+0.0im

julia> σ[0]
2×2 Matrix{ComplexF64}:
 1.0+0.0im  0.0+0.0im
 0.0+0.0im  1.0+0.0im

julia> σ[2]
2×2 Matrix{ComplexF64}:
 0.0+0.0im  0.0-1.0im
 0.0+1.0im  0.0+0.0im
```
あるいはコンストラクタの中に`x,y,z,I`を定義しているので、そちらで呼び出すことも可能です。
```julia
julia> σ.y
2×2 Matrix{ComplexF64}:
 0.0+0.0im  0.0-1.0im
 0.0+1.0im  0.0+0.0im
```

# オマケ
個人的に、スピン3重項超伝導体を扱う際に、次のようなdベクトルとPauli行列との内積を計算する機会が多いです。
$$
  \boldsymbol{d}\cdot\boldsymbol{\sigma} = \sum_{\mu \in x,y,z} d_{\mu}\sigma_{\mu}
$$
なので、こちらの内積計算も定義しておくことにします。

```julia
using LinearAlgebra

LinearAlgebra.dot(V::Vector,σ::PauliMatrices) = (
    reduce(+,(V[i]*σ[i] for i in 1:3))
)
```
具体的には次のように使えます。
```julia
julia> d = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3

julia> dot(d,σ)
2×2 Matrix{ComplexF64}:
 3.0+0.0im   1.0-2.0im
 1.0+2.0im  -3.0+0.0im

julia> d⋅σ
2×2 Matrix{ComplexF64}:
 3.0+0.0im   1.0-2.0im
 1.0+2.0im  -3.0+0.0im
```
Workato：Lookup Tablesでちょっとしたファイルを管理する

# はじめに

Workato filesが契約プランの制限により利用できない場合や、外部ストレージを用意することが出来ない場合は、Lookup TablesがWorkato上で利用可能な唯一のストレージになります。

しかし、Lookup Tablesはファイルの管理に対応していないため、Lookup Tablesでファイルを扱う場合は少々工夫が必要となります。今回は、Lookup Tablesでファイルを管理する方法について以下にまとめました。

# Lookup Tablesでファイルを管理するには

Lookup Tablesは前述の通りファイル管理に対応していませんので、そのままファイルを保存することはできませんが、テキスト形式であれば基本的にはどのような値でもセット可能です。

また、WorkatoはBase64形式のエンコードとデコードに対応していますので、ダウンロードしたファイルをBase64形式のテキストに変換することで、Lookup Tables上にそのファイルを保存することが可能です。

# 対応手順

## 保存先のLookup Tablesの準備

ファイル保存先とするLookup Tablesを準備します。最低限必要なフィールドはfilenameとbase64です。base64フィールドにbase64エンコードされた値を格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ada20dce-f63b-d374-93f3-070983cd48fd.png)

## レシピ作成

ファイルを保存するレシピを作成します。Web上からダウンロードしたファイルをLookup Tablesへ保存する場合は、次のようなレシピになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/70c658f2-6a91-8644-cfd5-5fd8067f10c6.png)

Lookup Tablesには、「Add entry」アクションを使用してファイルを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e2fa2d62-8580-8c66-a906-f29e1fef5da5.png)

filenameにファイル名、base64にBase64エンコードされた値をセットします。ファイルコンテンツがBase64エンコードされていない場合は、`encode_base64`関数を利用してBase64エンコードを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/71144301-14a6-5d83-7673-88b3471b1606.png)

# 実行結果

上記レシピを実行すると、Lookup TablesのAdd entryアクションの結果は次の通りとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d48347a4-7e41-770e-9196-86bb7aef7b36.png)

また、Lookup Tablesにもbase64エンコードされた結果が保存されたことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9cdc61b9-6a05-93b3-7961-9512fa9dbdec.png)

これ以降は、Lookup tablesよりファイル名指定でbase64エンコードされた値を取得し、`base64_decode` 関数でファイルをデコードすることで、レシピ上で取得したファイルが利用可能な状態となります。

# Lookup Tablesへ保存可能なファイルサイズ

明示的な容量制限はなく、基本的にはセットされた分だけ値を保存することが可能です。極端な例ではありますが、約100MBのファイルをbase64エンコードしてセットすることも可能です。

# 制限事項

ファイルサイズの大きいファイルをLookup Tablesで管理すると、そのテーブルを開いた際にWebブラウザのタブがクラッシュし開けない場合があります。

WorkatoのLookup Tablesのリストは、レコードの値が省略せずに出力されるため、例えば100MBの値がセットされていれば、Webブラウザ上にも100MB分の値が展開されます。このため、Webブラウザはメモリ不足となり、以下のようなエラーを出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/377f70d2-65eb-7873-de50-14a24e3477e9.png)

なお、レシピ上で当該テーブルを操作する（参照・追加・削除等）際はエラーが発生しませんので、Lookup Tablesのユーザーインターフェースで追加されたレコードを管理する必要が無ければ、問題なく利用することはできます。

しかし、Lookup Tablesは本来ファイル管理が想定された機能ではありませんので、容量の大きなファイルはWorkato filesが利用可能であればその機能を利用するか、Amazon S3やGoogle Driveなどの外部ストレージの利用を利用することを強く推奨いたします。


※Workato上で良く利用するちょっとしたファイル（数KB～1MB程度のファイル）を管理したいという目的であれば、手軽に使えると思います。
【POSIX】何故ファイルの末尾に改行が必要なのか

「ファイルの末尾に改行を入れてね」と言われた経験はありませんか？
何故ファイルの末尾に改行を入れる必要があるのでしょうか・・・

## なんで末尾に改行を入れないといけないのか
POSIXに準拠した仕様だから
「基本的に標準仕様には従おうね」ということだそうです。

これでは納得できない人もいると思うのでPOSIXについて少し掘り下げていきます。

## POSIXとは何か

Portable Operating System Interfaceを略したもので、オペレーティングシステムの標準的なインタフェースや環境を定義するIEEEの規格になります。

詳しくは下記のWEBサイトを見てください

https://pubs.opengroup.org/onlinepubs/9799919799/


## 結局なんで改行が必要なの？

改行が必要な理由については、POSIXの `3. Definitions` に書かれています。
特にテキストに関連する記述を抜き出しました。

> 3.46 Blank Line
> A line consisting solely of zero or more <blank> characters terminated by a <newline>; see also 3.120 Empty Line .

> 3.120 Empty Line
> A line consisting of only a <newline>; see also 3.46 Blank Line .

> 3.172 Incomplete Line
> A sequence of one or more non-<newline> characters at the end of the file.

> 3.185 Line
> A sequence of zero or more non-<newline> characters plus a terminating <newline> character.

> 3.387 Text File
> A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the <newline> character. Although POSIX.1-2024 does not distinguish between text files and binary files (see the ISO C standard), many utilities only produce predictable or meaningful output when operating on text files. The standard utilities that have such restrictions always specify "text files" in their STDIN or INPUT FILES sections.

これらをまとめると、POSIXではテキストについて
1. テキストファイルは0行以上の行にまとめられた文字を含むファイル
1. 行は改行コードのみ、もしくは行の最後に改行コードがある文字列

と定められていると解釈できます。

## まとめ
POSIXの形式では行の末尾には改行コードが必要だと定められているため、ファイルの末尾に改行が無いと最後の行が不完全な行だと認識されます。
そのため、最後の行だけ認識されない可能性があるということですね。

全ての行を「行である」と認識させるためにファイルの末尾に改行が必要だということです。
ニューモーフィズムとグラスモーフィズムについて

株式会社ロジカルスタジオのブログを読んでいると、このようなデザインの記事を見つけました。
https://logical-studio.com/develop/design/20220513-illustrator_appearance/
様々なデザイン手法がありますが、昨今はやりのニューモーフィズムとグラスモーフィズムについてここでは紹介していきます。
# ニューモーフィズム (Neumorphism)

## 概要
ニューモーフィズム（Neumorphism）は、UIデザインのトレンドで、フラットデザインとスキューモーフィズムの要素を組み合わせたものです。オブジェクトが背景から浮き上がるような立体感を持たせることで、柔らかく自然な影とハイライトを使用します。

## 特徴
- **ソフトシャドウ**：エレメントにソフトな影をつけることで、浮き上がって見える効果を持たせます。
- **ハイライト**：影と対になる部分にハイライトを追加することで、エレメントが背景から浮き上がるように見せます。
- **モノクロームカラー**：淡い色合いを使用し、全体的に控えめなデザインにすることが一般的です。

## 利点
- 視覚的に魅力的で、モダンなデザイン。
- 簡単なインタラクションが直感的に理解できる。

## 欠点
- アクセシビリティの問題：コントラストが低いため、視覚的に識別しにくい場合があります。
- ユーザビリティ：過度に装飾されたデザインは、機能性を損なう可能性があります。

---

# グラスモーフィズム (Glassmorphism)

## 概要
グラスモーフィズム（Glassmorphism）は、透明感のあるデザインスタイルで、ガラスのような見た目を再現します。背景のぼかしや透明度を駆使して、エレメントがガラスのように見える効果を持たせます。

## 特徴
- **透明感**：エレメントが半透明で、背景が透けて見える効果。
- **背景ぼかし**：透明なエレメントの背景をぼかすことで、立体感を持たせます。
- **多層性**：複数のレイヤーが重なり合うことで、深みのあるデザインを作り出します。

## 利点
- モダンで洗練された見た目。
- 視覚的に魅力的で、注目を引きやすい。

## 欠点
- アクセシビリティの問題：透明度が高いと、視認性が低くなる場合があります。
- 複雑なデザイン：適切に使用しないと、デザインが煩雑に見えることがあります。

---

## 参考リンク
- [Neumorphism.io](https://neumorphism.io/)
- [Glassmorphism.com](https://glassmorphism.com/)