OmniAICreator/Qiita-1.07M huggingface dataset:
ログイン画面の場合

# sWebMachineGun.exe実践編

ログイン画面では、パスワードを間違えすぎるとロックアウトしてしまう可能性を考慮しなければならない

ポイントは、sWebMachineGun.exeでは、「何もしない」という置換方法があるので、それを使って一旦正しく認証してもらってロックアウト回避を狙う。

## 診断対象

こんな感じ
<table border="1">
<tr><th align="center">ログイン画面</th><th align="center">認証(不)成功画面</th></tr>
<tr><td><a href="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/91e8e24f-67a6-7c2c-29bf-ad4ad13687ad.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/91e8e24f-67a6-7c2c-29bf-ad4ad13687ad.png" width="70%" height="70%"></a></td><td><a href="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/ee89e316-1cb7-7094-9167-810c6d5e8f99.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/ee89e316-1cb7-7094-9167-810c6d5e8f99.png" width="70%" height="70%"></a></td></tr>
<tr><td colspan="2" valign="top">POST /sanaki/yourdata/testLogin.asp HTTP/1.0<BR>
Content-Type: application/x-www-form-urlencoded<BR>
Content-Length: 0<BR>
<BR>
user=sasaki&password=password</td>
</tr>
</table>

ユーザ名とパスワードをポストするという画面が対象。
ただし、パスワードを間違えすぎるとロックアウトしてしまう可能性がある。

## sWebMachineGun.exeの設定

メインの設定は、HTTPリクエストの設定と、置換方法の設定

### sWebMachineGun.exeの設定1

「Request」タブに、一つのHTTPリクエストを設定する

場合によっては、二つ目としてログアウトのリクエストを投入してもよいだろう

![022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/9661fcb8-f76d-2ecb-2703-f8bdb658d2cd.png)

この画面は、「[一つのHTTPリクエスト(一番シンプル)](https://qiita.com/tomoki0sanaki/items/bf5425c33bab876b6287)」とかと同じなので、特に説明は不要だろう

### sWebMachineGun.exeの設定2

「Setting」タブの置換方法は、少し多めに入れてみた

![020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/9a9b8904-f791-3435-7c64-5fb777b27325.png)

- ポイントは、「何もしない」という置換方法を大体3回ごとに挟み込んでいること
- これによって、リクエストテンプレートに書かれた正しいユーザ名とパスワードで、一旦正しく認証されることを狙う
- つまり大体3回ごとに正しく認証されるためロックアウト数が3回程度でリセットされるだろう
- 「何もしない」の置換文字列を「=【変数名】」にすることで、その変数名の置換の時だけ有効にすることもできる
- 画面上では、変数「user」では「何もしない」置換は発動しないようにしてみた(ユーザ名を間違えた場合はロックアウトしない場合が多いので[→どのユーザをロックアウトさせるのか確定できないからね])

## sWebMachineGun.exeの実行

「Execute」ボタンで、実行できるのですが、結果はこんな感じで、変数「password」の時だけ3回に1回程度「何もしない」リクエストが送られて、ロックアウトを回避できていることが分かると思う。

![021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/98adb2ba-354c-c1bd-1a90-0d9c265a5926.png)

# sWebMachineGun.exe Index

[sWebMachineGun.exe のメインメニューに戻る](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3)
継承したコンポーネントへの参照ができなくなった場合の対処

# 起きた問題
BPでの作業中に親クラスから継承したコンポーネントへのアクセスができなくなった。
compileをしてもエラーが発生せず、同じ親クラスで子クラスを作成するとエラーは起きないため原因を探すにも方法がわからなかった・
なお、UE5になってから起き始めたというRedditでの投稿もあるため、私の環境に限らず起きるものかもしれない。![スクリーンショット 2024-05-13 181546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366802/52ad5021-ac7f-8d44-8b59-f53cfa2810ba.png)

# 環境
- バーション
Unreal Engine 5.3.2
- 使用プラグイン
PaperZD
- 問題が起きたクラス
PaperZDCharacterを継承したBPクラス

# 対処法
Reparent機能で一度Actorクラスなどに変更してからもう一度親クラスに戻したところ再度参照がされることでエラーが起きなくなった。
注意事項として一度コンポーネントが外されるため子クラスで個別で設定していた継承コンポーネントの値はリセットされるので何らかの方法でバックアップはとっておくこと
# まとめ
コメントを加えるといった編集中に起きたエラーなので原因は分からないがとりあえず直ったのでメモ程度に残しておく
改めてのプライベートブラウジングの機能について

プライベートブラウザを使用している人は多いはず。
そもそも、どのような仕組みなのか？
どこまでプライベートなのか？
個人的に疑問を感じたので調べて纏めてみた。

そもそもプライベートブラウジングは、
ブラウザ自体、端末自体に記録が残らないだけで、
サーバー側には記録が残る。
もちろん端末側のIPアドレスも隠せていない。

ブラウザのデータストレージ部分にデータを保存しないだけ。
ネットワーク層の通信はサーバ等に保存されている。

<font color='#ff0000'>ブラウザ構造（リクルートの技術研修を参照)

ユーザーインタフェース（見た目）
↓
ブラウザエンジン（レンダリングエンジンを操作）→<font color='#ff0000'>データストレージ（Cookieとか）</font>
↓
レンダリングエンジン（コンテンツの描画）
↓
ネットワーク（ネットワーク層、HTTPS、HTTPプロトコル）・JavaScriptEngine・UI Backend

https://speakerdeck.com/recruitengineers/browser-2023?slide=25

会社PCを資産管理ソフト・監視ソフトで、
通信をリアルタイムに監視か、
通信ログが保存されている場合は、
隠せていないはず。

なので会社PCからプライベートブラウザで私的利用しても
基本的には丸裸のはず。

有名なSKYSEAの監視からバレにくい方法がnoteで有料販売している。
監視側からすると、プライベートブラウジングは無意味なのかもね。
セキュリティ観点と技術的にもバレにくい方法が凄く気にはなるけど
有料note買うのもなぁ。

VPN使うとか、プロキシーサーバー挟むとかなのか？

https://note.com/burogushiru/n/n9690db8d265b


繰り返しにもなるけど、
プライベートブラウジングの機能はあくまでも
ブラウザ自体のデータストレージにデータが保存されないだけ。

当たり前と言えば当たり前だけど。

参考記事

https://www.keepersecurity.com/blog/ja/2020/12/14/incognito-mode-is-it-safe-keeper-security/

ゼロトラストセキュリティとかにも興味が出てきたので
まずは以下のnoteから読んでみる。

https://note.com/humihumi_infosys/n/n03986ac12d7c
【Ruby】MJITとかYJITよくわからなかったので勉強してみました

どうもこんにちは。

今回はRubyKaigi 2024に参加するにあたって、Rubyの処理系についてよくわかっていなかったので勉強してみました。

特に、以下の記事を参考にしています。

https://qiita.com/wataru86/items/ab2d1b507c8d67c73281

https://zenn.dev/kenzan100/articles/5a1b21d6207e64

# 処理系って何？

「処理系って言われても具体的に何を指しているの？」と思ったのでググってみると、

<font color="red">**処理系とは、「言語処理系」のこと**</font>らしいです。
言語処理系とは、RubyやPython、Javaなどの言語を処理して、実行できるようにするためのソフトウェアのようです。

ということは、言語処理系というソフトウェアによって、<font color="red">**Rubyで書いたコードが解釈されてコンピュータ内で実行できる形にしてくれている**</font>ということですね！

# Rubyで使用されている処理系

Rubyでは以下の処理系が使用されているようです。

- 公式の処理系
    - MRI (Matz' Ruby Implementation)
- その他の処理系
    - JRuby
    - IronRuby
    - MacRuby
    - Rubinius
    - MagLev
    - Cardinal
    - Ruby.NET
    - XRuby
    - HotRuby

公式の処理系であるMRIは、C言語で動作しているのでCRubyとも呼ばれているようです。

# JITとは

MJITとかYJITとか。これらは、**JIT**というコンパイラの一種だそうです。
JITは、「Just In Time」というフレーズの略語で、**「必要な分を、必要な時に」コンパイルするコンパイラ**だそうです。

コンパイラといえばC言語が思い浮かびますが、C言語の場合は事前にコンパイルして処理を実行します。
JITは同じコンパイラでもコンパイルのタイミングなどが違うらしいです。

JITは、MRIなどの言語処理系に組み込まれているものなのでC言語で実装されています。

# 言語処理系に欠かせないAST

少し前に、「**Rubyで書いたコードが解釈されてコンピュータ内で実行できる形にしてくれている**」と記述しましたが、これには <font color="red">**AST（抽象構文木）**</font>という存在が欠かせません。
これは、<font color="red">**構文解析の結果を木構造で表したデータ**</font>です。

言語処理が行われるときには、「字句解析」「構文解析」が行われ、ASTに解析結果が保存されるという流れを踏んでいるようです。

# Rubyの歴史とともに

ここからは、Rubyの歴史とともに、どのようにコンパイラが実装されていったのかを学んでいきます。

## Ruby1.8以前

Ruby1.8以前では、JITは使用されていなかったようです。そのため、以下のようにコードが実行されます。

1. Rubyのコードを読み込む
1. 字句解析が行われる
1. 構文解析が行われる
1. ASTに解析結果が保存される
1. **C言語で書かれたプログラムが解析結果を読んで処理が実行される**

## Ruby1.9以降

Ruby1.9からは少し変わりました。新たに**YARV**というバイトコードインタプリタが使われています。YARVもMRIに組み込まれたインタプリタなので、C言語で実装されています。

1. Rubyのコードを読み込む
1. 字句解析が行われる
1. 構文解析が行われる
1. ASTに解析結果が保存される
1. 解析結果を**YARV命令列(バイトコード)** にコンパイルする
1. **YARV命令列をYARVが実行する**

Ruby1.8以前のようにC言語で直接Rubyコードの解析結果を参照するよりも、バイトコードに変換してからYARVで処理を行うことでRubyのコードが高速で実行されるようになったようです。

## MJIT登場

Ruby2.6からは、MJITが登場しました。

1. Rubyのコードを読み込む
1. 字句解析が行われる
1. 構文解析が行われる
1. ASTに解析結果が保存される
1. 解析結果を**YARV命令列(バイトコード)** にコンパイルする
1. <font color="red">**YARV命令列の一部をC言語に変換する**</font>
1. <font color="red">**変換したコードをgccコンパイルする**</font>
1. <font color="red">**コンパイルされた機械語をYARVが実行する**</font>

Ruby1.9時点では、**YARV命令列(バイトコード)をYARVで実行していました**が、
MJITでは、<font color="red">**YARV命令列(バイトコード)をC言語化して先にコンパイルすることでYARVの処理がさらに高速化する**仕組みだそうです。</font>

難しいです...(~_~)ﾎﾍｰ

## YJIT登場

Ruby3.2からは、YJITが登場しました。

1. Rubyのコードを読み込む
1. 字句解析が行われる
1. 構文解析が行われる
1. ASTに解析結果が保存される
1. 解析結果を**YARV命令列(バイトコード)** にコンパイルする
1. <font color="red">**YARV命令列をIR（中間表現）を使用して機械語に変換する**</font>
1. <font color="red">**機械語をYARVが実行する**</font>

IR（中間表現）を使用して機械語に変換することで、さらに処理が早くなるらしいです。
C言語/gccコンパイルではなく、IRを使用して機械語に変更するようにしたことで、x86_64（AMD64）アーキテクチャだけでなく、ARM64アーキテクチャでも動くようになったとか...

難しいです...(~_~)ﾎﾍｰ

RubyKaigi 2024では、以下のセッションでJITのお話が聞けるようですね。（日本語翻訳で聞けたらいいな...）

https://rubykaigi.org/2024/presentations/maximecb.html#day2

# まとめ

初めてJITについて調べてみましたが、難しいお話でした...

RubyKaigiでしっかり吸収してきます。
C#で現在日時をフォーマットした文字列を取得

# やり方

* 月は ```MM```、分は```mm``` 。
* 24時間表記なら ```HH```、12時間表記なら ```hh``` 。

```C#:
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
```

# 参考サイトさん

https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings

https://www.sejuku.net/blog/50152

# バージョン

Microsoft Windows [Version 10.0.22631.3527]
Microsoft .NET Framework Version 4.8.09032
Oracle Analytics Cloud：加重平均を求めてみる

# はじめに
データ分析をする際に、平均値を求めるというのはよくあると思います。
単純に平均を求めれば良い場合と、重みを付けて平均を求めたい場合があります。
重みを付けた平均（加重平均）をOracle Analytics Cloud（**OAC**）で計算するやり方を紹介します。

# データ
準備したExcel形式のデータです。
| 商品 | 価格 | 数量 |
|:-|:-:|:-:|
|シュークリーム|320|24|
|ショートケーキ|630|20|
|チーズケーキ|560|16|
|プリン|240|36|
|モンブラン|720|8|

これをデータセットとしてOACに取り込みます。
「価格」列に関しては、処理形式をメジャー、データ型を数値、デフォルトの集計方法を平均とします。
「数量」列はデフォルトのままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d0271f8d-7866-99d8-4c1e-1e61eb30065e.png)

# 算術平均
作成したデータセットで新しいワークブックを作ります。
「価格」をキャンバスにドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5cc17b2d-d69f-4759-ae9f-075de115ed80.png)

タイルビジュアライゼーションが自動的に作成され、「494」円と表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c2599ef6-d6fc-66e7-d55f-c052807a21c4.png)

これは、「価格」のデフォルトの集計方法が平均であったため、取り扱い商品の価格の平均が算出されたものとなります。

# 加重平均
商品により売れ行きが違うので、それを加味して平均を求めたいと思います。

まず、次の値を合計します。
- シュークリームの価格 X シュークリームの売れた数
- ショートケーキの価格 X ショートケーキの売れた数
- チーズケーキの価格 X チーズケーキの売れた数
- プリンの価格 X プリンの売れた数
- モンブランの価格 X モンブランの売れた数

次に、これをすべての商品の売れた数で割り算します。

OACの式で表現します。
「マイ計算」を右クリックし「計算の作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/fb9caf5b-bfc2-6caa-9bb1-d9f3a1b21137.png)

式の名前を「加重平均」とします。
式として
```sql
SUM()
```
と入力し、カッコの内側に「Agg」と入力します。
途中まで入力すると、候補がいくつか表示されるので「Aggregate By」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/631ecead-af45-05b4-74dc-06dd1fbc250b.png)

こうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ec72fa6b-9c03-ea46-9b1c-ddeea9c5a4bd.png)

*メジャー*をクリックすると、メジャー列が候補として表示されるので「価格」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4c5ce7cd-a01c-355b-938c-5b9260163332.png)

*ディメンション*をクリックして、候補から「商品」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e5444a14-02e6-f30f-6288-813d01c5fd0d.png)

掛け算を定義するために \* を入力し、続けて Aと入力します。
候補が表示されるので、「Aggregate By」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/624c4a27-8d15-d52a-8eb6-3c199b69e9a4.png)

先ほどと同様の手順で *メジャー* を数量、*ディメンション*を商品とします。
これで、各商品ごとに価格と数量を掛け算したものを合計する、という定義ができました。
これを数量で割り算します。
\/を入力したあと、「数量」列をドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b273a3e7-c751-2bd6-887e-1efeabc748c5.png)

式に間違いがないかどうかを「検証」をクリックして確認したあと、「保存」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/14b456e9-2f77-da23-f435-b1cc3a7c00d8.png)

作成した式をキャンバスにドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/46c82794-a375-203d-1530-5733b767063b.png)

できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f91cdb00-083a-47d4-5a33-01eaecaf7d70.png)

少し見栄えを整えて完成です。
販売数を考慮した加重平均は商品単価の算術平均よりも低くなりました。
このお店は、比較的単価の低いシュークリームやプリンが売れ筋なのがよくわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/05d2a5cf-279b-2e0b-e544-0a5d164ff35a.png)
&(アンパサンド）

# バックグラウンドで実行する
linuxのデフォルトのシェルであるbashはコマンドの最後に「&」をつけると、そのコマンドをバックグランドジョブとして実行してくれる。
# 出典
https://eng-entrance.com/linux-basic-background#:~:text=linux%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8Bbash%E3%81%AF%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E6%9C%80%E5%BE%8C%E3%81%AB%E3%80%8C%26%E3%80%8D%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%A8%E3%80%81%E3%81%9D%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%83%B3%E3%83%89%E3%82%B8%E3%83%A7%E3%83%96%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%80%82

# 気づき
&&ではないらしい
知らないことばかりだな
JavaScriptで、Date型で開始日と終了日から期間を計算し必要な日数以上かチェックする方法

## はじめに
イメージとしてはユーザーがカレンダーから何らかの期間の開始日と終了日をリクエストし、その期間が必要とする日数以上かをJavaScriptでチェックします。
期間の申請機能についてはこの投稿では省略します。
よく使う機能だと思ったため自身の備忘録もかねて投稿します。
コメントで @think49 さんに最適化していただいたコードがありますので、実際に開発する場合はそちらを参考にしていただいたほうがいいと思います。

## 完成したコード
~~~js
function checkValid(start, end) {
    // リクエストされた開始日と終了日を引数で受け取り変数を作成
    var startDate = new Date(start);
    var endDate = new Date(end);
    var result = true;

    // 開始と終了のタイムスタンプをgetし、（終了　- 開始)で時間差を計算する。
    var diff = endDate.getTime() - startDate.getTime();
    // 時間差をミリ秒単位を日単位に変換し（切り捨て）、1日分を加算。
    var term = Math.floor(diff / (24 * 60 * 60 * 1000)) + 1;

    // 必要な期間は１週間以上とする
    if (term < 7) {
      result = false;
    }

    return result;
}
~~~

## 最後に
`Math.floor(diff / (24 * 60 * 60 * 1000))`
上記コードの時間差をミリ秒単位に日単位に変換に関しては詳細は私自身まだ力足らずでよく理解していませんが、JavaScript Date ミリ秒などで検索するとたくさん記事がでてくると思います。
Dateオブジェクトで期間を計算する際の基本みたいです。

## 参考にさせていただいた記事
https://www.prj-alpha.biz/entry/2018/08/09/004451
https://tcd-theme.com/2022/06/javascript-date-object-gettime.html
DMARCの設定でハマってしまった件…

# Gmail等への対策でDMARC対応に追われていました

めちゃくちゃ単純なことだったのですが、気付けずにハマってしまいました。
DMARCのDNSのレコードでよく以下のような例が紹介されています。

```
_dmarc.yourdomain.com IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-report@yourdomain.com"
```

自身でゾーンファイル編集している場合は上記で良いと思いますが、コンパネ等で設定する場合、以下のようなインターフェースのことがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398/4047a1ca-5c3e-9733-fc58-b866a6337518.png)


# ダメだったパターン
ホスト名を
```
_dmarc.yourdomain.com
```
値を
```
v=DMARC1; p=none; rua=mailto:dmarc-report@yourdomain.com
```
にすると上手く認証してくれないケースがあります。
※先ほどの画面と合わせると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398/e3bd5e15-b1c1-fd29-22ff-6e0866f76133.png)


## どういうことかと言うと
```
yourdomain.com
```
部分がデフォルトで設定されるパターンだと、おそらくこのように解釈されてしまいます。
```
_dmarc.yourdomain.com.yourdomain.com
```
yourdomain.com のサブドメイン yourdomain.com？

## ではどうすれば良いか
シンプルにホスト名は
```
_dmarc
```
のみとすればOKでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398/670091de-30d0-0141-9c37-a46c6027df85.png)

以上、覚書でした。
Keybord remap メモ

OSXのキーボード設定でいつもなやむのでメモ

## 前提となる環境と好み
- OSX
- 英語KB
- CapsLock はCtrlが良い
- Copy & Paste は Ctrl+C, Ctrl+V 
- 日本語入力切り替えは Ctrl+Space

## 変更作業
- VIAなKBでハード側でCTRLとCAPSは入れ替える
    - OS側でもできるが、RemoteのLinuxで頻繁に不具合が出るので、KBでの変換のほうがトラブルが少ない。
    - 問題はMacBookのKB。MacBookのKBは使いやすくないので、真面目に仕事するときは外付けKBを使う
- OSXでのコピペはコマンドキーなのでこれをCTRLに変更する
    - System Setting -> Keyboard　-> キーボードショートカット -> アプリのショートカット
        - コピー 　^C
        - ペースト ^V
        - 貼り付け ^V


| KB        |VIA Remap  | OSX      | iTerm    | Linux(remote) |
|-----------|-----------|----------|----------|---------------|
| CapsLock  | Control   | Control  | Ctrl     | Ctrl          |
| Ctrl_L    | CapsLock  | CapsLock | CapsLock | CapsLock      |
| Option_L  | Option_L  |
| Command_L | Command_L | Control


## 悩ましい

- OSX上で上記のCommandとCtrlの入れ替えは万能ではない
- OSX上でKBのCommandをCtrlキーを入れ替える方法は、OSX上ではうまくいくようだが、iTermやLinuxでハマる。
- ということでOSXはあまり好きではない。開発で使うマシンはUbuntuが一番無難。


## 参照
- Mac OSXのコピーペーストをCtrl+C,Vに設定する方法
    - https://qiita.com/lemonjp/items/481fe30e48c29576dbf0
- Macでキーの連続入力の速さを設定する
    - https://support.apple.com/ja-jp/guide/mac-help/mchl0311bdb4/mac
ダイナミックリスト　Pardot



+ [3ヶ月以上前の失注商談・現在進行形の商談がある企業を省く ダイナミックリストを作る](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aj5Tz)

:::note
ダイナミックリストルール条件
https://help.salesforce.com/s/articleView?id=sf.pardot_segmentation_dynamic_list_criteria.htm&type=5

＞現在進行形の商談がある企業を省く 
プロスペクトの商談の状況
プロスペクトの商談の状況に基づいてプロスペクトを絞り込みます。

＞ 3ヶ月以上前の失注商談 

この条件では商談に3ヶ月以上前の失注商談 の時にtrueになるような数式項目を追加して条件すれば可能だと思います。

プロスペクトの商談のカスタム項目
取引先責任者として関連付けられている商談に記録されたカスタム項目値に基づいてプロスペクトを検索します。

上記２つの条件を満たしたときにtrueになるような数式項目があれば１つの条件で可能なように思います。
:::


+ [Engagement Studio: 動的リストでのオプトアウトとバウンスの除外はレポート結果に影響しますか](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clIkPSAU)

:::note
エンゲージメント履歴では、エンゲージメント スタジオ プログラム内のオプトアウトまたはバウンスは、テンプレートに関連しているため、他の場所で発生した場合と同様に扱われます。エンゲージメント プログラムは、リスト メールや自動応答など、テンプレートを送信する手段にすぎません。あなたが削除したこれらのユーザーは、最後に完了したステップで「一時停止」されます。つまり、再アクティブ化すると、中断したのと同じ場所から再開されますが、これは必ずしも望ましいことではありません。また、エンゲージメント スタジオ プログラムを利用すると、購読解除されたり、拒否されたりした場合でも（電子メールが届かないだけで）、自分のやり方で仕事を進めることができます。
:::
robloxでassistant その36

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
マウスクリックしたら、partの色を変えよ。

# 手順
- workspaceに、partを追加。
- partに、clickdetectorを追加。
- partに、scriptを追加。
- スクリプトを書く。
```
local part = script.Parent
part.Position = Vector3.new(-5, 0, -10)
local clickdetector = part:WaitForChild("ClickDetector")
clickdetector.MouseClick:Connect(function(player)
	script.Parent.BrickColor = BrickColor.random()
end)

```

以上。
GPT4oを触ってみた


ChatGPT-4oがリリースされたので触ってみた速報です

* GPT-4に比べてChatGPT-4oは爆速になりました

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244232/b8126b62-4267-cd43-b5b6-beec199b4d75.gif)

* iPhoneでも音声認識も試してみましたが、GPT-4に比べてChatGPT-4oの方が速いとは思うのですが、音声認識のパートが遅いように感じました。

* 以下の内容は中島聡さんのメルマガで取り上げられてた、AIには回答が難しい質問なのですが、ChatGPT-4oで試してみたら正しく回答できる時(big/largeと答える)とそうでない時(smallと答える)があり、冪等性がないのは既知ですがこの質問については賢くなったとは言えない

```
Fill an appropriate word in the space for this text. "I parked my car in the compact parking space because it looked __ enough". Please explain why you think so.
```

気になったこと

* iPhone側が遅い理由について
  * 今回はモデルのアップデートでアプリケーションのアップデートではないから？？
  * 私が使ってる端末（iphone8）が古いから？？
* 今回の目玉は応答性が著しく良くなったことのみ？？他は見逃してない？？

5/15追記

OpenAIのYouTube見ました。目玉は応答性が上がったこと以外に以下があることな気がします。

* テキストや音声、画像を使ってマルチモーダルにコミュニケーションをとれること
* それぞれの領域ごとにカスタムのデスクトップアプリがあること

<iframe width="560" height="315" src="https://www.youtube.com/embed/DQacCB9tDaw?si=WKi0qfvhQM-60Mw4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
自然言語による大規模Gmailログの分析[Claude Tip]


ClaudeやChatGPTのような生成AIモデルの最近の進歩により、データベースへのクエリが非常に簡単になりました。 特に興味深い点は、**これらのAIモデルは、与えられたDBスキーマ情報に基づいて、自然言語クエリとそれに対応するDBクエリ（SQL）文**を自動的に生成できることだ。 これにより、ユーザーは複雑なクエリを書くことなく、自然言語を使ってデータベースに問い合わせることができる。 したがって、これはRAG(Retrieval-Augmented Generation)技術の部分的な応用と見ることができる。

DBスキーマは、テーブル、フィールド、リレーションシップなどを含むデータベースの構造を定義する。 このスキーマ情報がAIモデルの入力として提供されると、モデルはスキーマを分析し、どのような情報が格納されているかを理解する。 これに基づいて、モデルはユーザーがデータベースについてどのような質問ができるかを推測し、適切な自然言語クエリを生成する。

これにより、ユーザがDBのスキーマを直接分析し、マッチする質問を考えなければならない不便さを大幅に軽減することができます。 また、SQL構文に詳しくないユーザでも、自然言語を使って簡単にDBに問い合わせることができます。

この記事では、BigQueryでGmailのログスキーマを使用して自然言語クエリとSQL文を生成する方法を紹介します。

2023年2月より、GmailのログがWorkspaceのログやレポートと統合され、BigQueryのジョブが簡素化され、すべてのBigQueryデータを一箇所で管理できるようになりました。 すべてのWorkspaceサービスのBigQueryログとレポートは、Google Admin Consoleの同じ場所で管理できます。 GmailのBigQueryビュー、クエリ、スクリプトをWorkspaceのログとレポートに移行することをお勧めします。


BigQuery用GmailログDBスキーマベースの自然言語クエリとBigQuery用SQLの例

重要なポイントは、DBスキーマに関する情報を提供することで、AIがユーザーの視点から意味のある自然言語クエリを生成できることだ。 つまり、直接コードを書かなくても、会話を通じてデータ分析が可能になる。 これは今後さらに発展することが予想され、誰でも簡単にデータベースにアクセスし、洞察を得ることができるようになる。

以下に挙げる自然言語クエリやSQL文は、BigQueryでGmailのログ分析を行う際に、データベース（SQL）の専門家でなくても様々な観点からGmailのログを分析することができます。 これにより、幅広いユーザーが、豊富な技術的知識がなくても、Gmailデータから意味のある洞察を導き出せるようになることが期待されます。

Schema for Gmail logs in BigQuery

Gmail Schema情報（Geminiの場合は画像として、Claude/ChatGPTの場合はPDFとしてアップロードされている）を入力した後、各生成AIに以下の質問をする。
プロンプト Gmailのスキーマ情報に基づいて、10個の自然言語クエリとそれに対応するSQL文を書きました：

自然言語クエリ

1. 2023年1月1日以降に送信されたスパムメールの送信者メールアドレス、分類タイムスタンプ、およびスパム分類の理由を取得する

SQL statements

SELECT message_info.source.address, message_info.spam_info.classification_timestamp_usec, message_info.spam_info.classification_reason<br>FROM project.dataset.table <br>WHERE message_info.is_spam = true AND event_info.timestamp_usec >= UNIX_MICROS(TIMESTAMP('2023-01-01'))

2. Gmail がスパムとして分類した後に解除したメールの RFC2822 Message-ID、スパム分類のタイムスタンプ、アクションの種類、および説明を取得する

SELECT message_info.rfc2822_message_id, message_info.spam_info.classification_timestamp_usec, message_info.action_type, message_info.description<br>FROM project.dataset.table<br>WHERE message_info.is_spam = true AND message_info.action_type = 69

3. 過去 30 日間に添付ファイル コンプライアンス ポリシーによって添付ファイルが削除されたメールの送信者、受信者のメールアドレス、削除された添付ファイル名を取得します。

SELECT message_info.source.address, message_info.destination.address, message_info.triggered_rule_info.string_match.attachment_name<br>FROM project.dataset.table<br>WHERE message_info.triggered_rule_info.rule_type = 16 AND event_info.timestamp_usec >= UNIX_MICROS(CURRENT_TIMESTAMP()) - 302460601000000

4. S/MIME で暗号化された電子メールの送信者、受信者の電子メール アドレス、および暗号化の成功を取得します。

SELECT message_info.source.address, message_info.destination.address, message_info.destination.smime_decryption_success<br>FROM project.dataset.table<br>WHERE message_info.smime_content_type = 3


もう少し詳しくは「amazon.co.jp「Claude 3 AIの活用 :文章作成およびビジネス業務 Kindle版」からの抜粋です」をご覧ください。 https://bit.ly/4dW1cNH
[UE5]StateTreeを使うと何が良いのか

## この記事について

筆者が初めてStateTreeを見た時なぜこの機能が必要（便利）なのかがわからなかったのですが、試しに作ってみるうちになんとなくわかってきたので、ある場合とない場合の違いについてまとめてみました。


## わかったこと

まずStateTreeはゲーム開発において**必須の機能ではなかった**です。（UEを作っている会社（Epic）の人がスライドで推薦していたのでほぼ必須かと思っていたのですが、いざ使ってみたら全然そんなことはありませんでした）

基本的に何かのActorの制御をしたいときは、（語弊を恐れずに言えば）１つにつき１つのBPだけ用意すれば十分動くものを作ることができます。

ではなぜStateTreeのような子BPも使うかというと、**親BPを見やすい形に整理できる**からでした。
（さらにweb開発経験者向けにいうと、**webでいうコンポーネント指向**での実装ができるからです。）


#### 具体的な例
それでは具体的に[公式リファレンス](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/statetree-quick-start-guide?application_version=5.3)に沿って説明してみます。

チュートリアルでは５回攻撃が当たったら壊れる壁をStateTreeを用いて作成するのですが、壊れるかどうかの判定を壁ActorのBPからStateTreeに逃す実装をしていて、実際に実装したものが下記になります。

StateTreeを使うと壊れる場合をイベントとして切り出すことができるため、BPの中がイベントごとで状態がまとまり後からのソースコードリーディングがとても楽になっています。

一方で、親BPだけの場合は攻撃を受けるイベントで壊れるかどうかまでをひと繋ぎにする必要があり、後からのソースコードリーディングに辛みがあります。（下記図にて見比べてみてください）

※StateTreeを使った場合（HitとDestroyがどこで行われているか一目瞭然）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/a1b0ce14-d57e-7846-577a-46f454d1dbde.png)

※StateTreeを使わない場合（HitとDestroyがどこで処理されているかわかりにくい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/da7e7dfe-4e67-2550-c6d1-12329d8cb68a.png)


#### StateTreeの全体感

また影響範囲全体の視点だと、BPとStateTreeは以下のような親子関係となっていました。

![StateTreeのポンチ絵 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/72da7099-fcff-6a63-e8bf-48b6c2697dd8.png)

![StateTreeのポンチ絵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/bc7c94ea-ca0c-4b18-1a10-5a924114fd49.png)

~~※正直StateTreeがある方が複雑な構成になるのでとっかかりにくいのですが、vueの経験からコンポーネントの使い回しは工数削減に非常に役立つのがわかっているので、個人的には良くできた仕組みだなと思います。~~
↑StateTreeTaskの親BPの取得で`cast to 個別の親BP`を使う必要があるため、使い回しはできなさそうで、あくまで整理ができるのが強みの機能のようです。


## まとめ（結論）

- StateTreeを使うとActorに直接つけているBPが、通常はひとまとめの闇鍋状態のところをイベント単位に整理できるため運用保守が楽になります。

<div></div>

~~- 一度準備したイベント（StateTreeTask）を使い回すことができるので、概ね同じ処理をするけどActorごとにBPが異なるような場合（雑魚キャラの作成の時など）に力を発揮します。~~
↑これはできなさそうでしたm(__)m


## StateTreeの機能について思ったこと（余談）

今回の気づきを通して、（通常は親BPをコメントで整理すれば良いので、）大前提としてStateTreeは初手では作らなくても大丈夫なのかなと思いました。

ただ機能を拡張するに伴ってBP内の各種処理の影響範囲がどんど大きくなってコメントエリアからはみ出してしまって機能のまとまりがわかりにくくなってしまったりする場合がいずれ来ます。

そんな時に、別ファイル（StateTreeTask）に切り出しつつその総称と関係性をStateTreeで管理することで親BPを整理された状態に保てるようになるので、プロダクトが大きくなってきてからの有用性は高いと思いました。

しかしコンポーネント指向を知らない完全初心者の方が使うとドツボにハマりそうだなとも思ったので、そういう方はBPファイルが大きくなって管理が辛くなってきてから整理のために使うようにしてみると、良さがわかったり使いこなせたりするのでおすすめだと思いました。
「"」を使えばXSSを防げる・・・？

# はじめに

※私の根本的な理解が欠けているのだと思います。遠慮なくご指摘いただけると幸いです。

ある本に、以下の記述がありました。
> 属性値をくくる「"」や「'」は一定のルールのもとで省略が可能です。ただし、状況によってはセキュリティリスク、例えばWebアプリケーションの脆弱性を利用した攻撃であるクロスサイトスクリプティング（XSS）の原因になる場合もあるため、原則として必ず記述することをおすすめします。

-> <font color="LimeGreen">「"」を使用することでXSSを防げる、あるいは危険性を低くできる</font>
本当に？

# XSSを防げない例

ChatGPTと協力し、以下のコードを作成しました。

```html
<input type="text" id="text_form" placeholder="名前を入力">
<button id="btn">表示</button>
<div id="area"></div>
```

```js
const text_form = document.getElementById("text_form");
const btn = document.getElementById("btn");
const area = document.getElementById("area");

const output_user_name = () => {
  const user_name = document.createElement("p");
  user_name.textContent = text_form.value;
  user_name.id = text_form.value;
  area.append(user_name);
}

btn.addEventListener("click", output_user_name)
```

問題の箇所は、
```js
user_name.id = text_form.value;
```

の部分です。これにより、以下のHTML要素が作成されます。

```html
<p id=text_form.value>text_form.value</p>

<!--text_form.valueが「foo」のとき-->
<p id=foo>foo</p>
```

この入力フォームに対するXSSは、以下の文字列をフォームに入力することで可能です。

```
""><script>alert('XSS');</script>
```

これにより、HTML要素が以下の形になり、`alert('XSS')`が実行されてしまいます。

```html
<p id=""><script>alert('XSS');</script>>...</p>
```

# `"`を用いて XSSを防げる例

```diff_javascript
const text_form = document.getElementById("text_form");
const btn = document.getElementById("btn");
const area = document.getElementById("area");

const output_user_name = () => {
   const user_name = document.createElement("p");
   user_name.textContent = text_form.value;
-  user_name.id = text_form.value;
+  user_name.id = '"' + text_form.value '"';
   area.append(user_name);
}

btn.addEventListener("click", output_user_name)
```

先程の例に `"` を追加しました。
これにより、先程の入力によるXSSは無効化されます。

```html
<p id="""><script>alert('XSS');</script>">...</p>
```

しかし、この例にはいくつも問題があります。

- JSにおけるコードの改変であり、HTMLの入力において気をつけるべき、という事例には不適当
- ２つめの例であっても、文字列を変更すればXSSは可能
  その手間は変わっていないと言える
- 現代のブラウザの機能によるものだと思うが、この事例は実際には機能しない
  - `"`は自動で`&quot;`に変換される
  - `<script>`タグの中に直接処理が書かれている場合、これを実行しない

ですが、これ以上の良い事例を作ることはできませんでした・・・

# おわりに

なんとも曖昧な記事で申し訳ないです。
個人的な結論としては以下。
### HTMLの属性の記述において `"` を使用することに、XSSを防ぐ効果はほぼない

### HTMLの属性の記述において `"` は、「どこが属性か明確になる」「空白文字などを正しく解釈する」効果がある

### HTMLの属性の記述において `"` は使用することが推奨される
robloxでassistant その35

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
ぶつかったら、partを移動せよ。

# 手順
- workspaceに、partを追加
- partに、scriptを追加
- スクリプトを書く。
```
local part = script.Parent
part.Position = Vector3.new(-5, 0, -10)
part.Touched:Connect(function(hit)
	print("Part was touched!")
	local character = hit.Parent
	local humanoid = character:FindFirstChildWhichIsA("Humanoid")
	if humanoid then
		local attachment = Instance.new("Attachment", part)
		attachment.Position = Vector3.new(2, 0, 0) 
		attachment.Axis = Vector3.new(1, 0, 0) 
		local vectorForce = Instance.new("VectorForce", part)
		vectorForce.Attachment0 = attachment
		vectorForce.Force = Vector3.new(-30, 0, 0)  
	end
end)



```

以上。
Reflex（Webアプリ作成ライブラリ）：ログインやDB操作のサンプルコード

# 1. 2024年5月時点ではReflexの情報は少ない

PythonをコーディングするだけでWebアプリを作ることができるライブラリReflex。以下の記事をみて、記事を投稿してくださる人も増えてきました。

https://qiita.com/SFITB/items/c3361979b86f441993ff

ちなみに、21万Viewまでいったので、少しはReflexを知ってもらうきっかけになったのかなと思います。

それにしても、まだまだ情報は少ないです。海外サイトも少ないのですが、日本語サイトはもっと少ないです。

# 2. 公式ドキュメントは画面に関する内容は充実している

公式ドキュメントが比較的充実しています。
画面を作るだけであれば、公式の「Learn」を一通り読めば作れるようになると思います。

https://reflex.dev/docs/getting-started/introduction/

ちなみに、公式の左メニューのスクロールがスマホなら指でスワイプすればいいのですが、PCだとマウスのホイールを使わないと下にいかないように思います。スクロールバーがあればいいのにと最初は思いました。

# 3. DB操作に関するサンプルコード

公式ドキュメントは画面をつくるのに必要な情報はある程度掲載されています。
ただDBに関する情報はやや少ない気がします。

公式にAlembicを間接的につかってマイグレーションする方法とか、Modelクラスをつかってデータを取得したり、更新したりする方法は書かれています。

https://reflex.dev/docs/database/overview/

断片的に書いてあるので、具体的な実装をどうしたらいいのかは公式ドキュメントだけでは不足している感じがします。

やはりWebの業務アプリをつくるなら、DBからデータを取得して一覧に表示し、登録フォームをつくってデータを更新したいと思います。

私は、以下のサンプルサコードをみて勉強しました。
このサンプルで上記のDBに関する処理は一通り実装されています。

## a. Githubのサンプルコード

https://github.com/reflex-dev/reflex-examples/blob/main/customer_data_app/customer_data_app/customer_data_app.py

どのように上記のコードが動くかは、以下のデモサイトで確認できます。

## b. DB操作に関するデモサイト

https://customer-data-app.reflex.run/

以下、DBのマイグレーションの手順について整理した記事です。

https://qiita.com/SFITB/items/b339cc42290a74860af9


# 4. ログイン画面のサンプルコード

業務アプリを作るうえで、ログイン画面は必須です。
その実装については、以下のサンプルコードがとても参考になりました。

## a. Githubのサンプルコード

https://github.com/reflex-dev/reflex-examples/tree/main/twitter/twitter

## b. ログインのデモサイト

以下がデモサイトです。

https://twitter.reflex.run/login/

# 5. 最後に：サンプルコードの検索

以上、Reflexを学習する際に参考になりそうなコードを紹介しました。

他にもいろいろなサンプルコードがあります。
サンプルコードは、Galleryというページで検索できます。

Galleryページは公式サイトの以下のメニューから表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/7916245f-0944-7285-4de3-b03d233a2d9f.png)

公式ドキュメントにもGalleryのメニューがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/2ab1deac-8226-e3e2-ca7b-3603571f6ce6.png)

Galleryページでは、タグで実装機能ごとに絞り込みができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/55f1ace7-9ead-263e-93c1-de8cb978c293.png)

カードの下にある、「<>」をクリックするとGithubのコードが表示されます。
また、目のアイコンをクリックするとデモサイトが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/eb8b7be4-85f5-2002-ba6a-a17fbdd51031.png)

自分が実装したい機能をもつデモサイトのコードを参考に学習するのがよいと思います。

Reflexの学習の参考になればと思います。

# 6. ReflexのDiscordサーバ

最近は、言語やライブラリの開発者がDiscordサーバを設置するのが一般化してきました。
Reflexもサーバがあり、日本語チャンネルもあります。
質問や情報提供などをここで行えればよいと思っています。
私も参加しています。

https://discord.gg/DeWEstSxZy
robloxでassistant その34

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
ぶつかったら、partのサイズを変えよ。

# 手順
- workspaceに、partを追加
- partに、scriptを追加
- スクリプトを書く。
```
local part = script.Parent
part.Position = Vector3.new(-5, 0, -10)
part.Touched:Connect(function(hit)
	print("Part was touched!")
	local character = hit.Parent
	local humanoid = character:FindFirstChildWhichIsA("Humanoid")
	if humanoid then
		part.Size = Vector3.new(4, 4, 4)
	end
end)

```

以上。
Flutter 〜showDatePickerのサンプル〜

## showDatePickerとは
日付選択をするカレンダーを表示する。
今回のサンプルはボタンを押すとカレンダーが表示され、選択した日付を変数に設定する。

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743467/52f49d82-a100-9e0f-0516-04823edb2f89.png" >


<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743467/d08c3432-76cd-3863-6721-cebdc455616f.png" >

選択した日付ボタンを押すとコンソールに日付が表示される。

<img  width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743467/8080fa7e-9a84-3de7-20f1-ac20fae51240.png" >


## サンプルコード
```dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

// MyAppクラス: アプリのルートウィジェットを定義するStatelessWidget。
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('showDatePicker'),
          // AppBarのタイトルを設定。
        ),
        body: Home(),
        // HomeウィジェットをScaffoldのbodyとして使用。
      ),
    );
  }
}

// Homeクラス: 日付選択機能を提供するStatelessWidget。
class Home extends StatelessWidget {
  const Home({
    super.key,
  });

  @override
  Widget build(BuildContext context) {
    // 変数birthdayを宣言。選択された日付を保持する。
    DateTime? birthday;
    return Center(
      // Centerウィジェットで子ウィジェットを中央に配置。
      child: Column(
        // Columnウィジェットで子ウィジェットを垂直方向に並べる。
        children: [
          ElevatedButton(
            // 日付選択用のボタン。
            onPressed: () async {
              // ボタンが押されたときのアクション。
              birthday = await showDatePicker(
                context: context,
                initialDate: DateTime(DateTime.now().year - 10),
                firstDate: DateTime(DateTime.now().year - 100),
                lastDate: DateTime(DateTime.now().year),
                // showDatePickerダイアログを表示し、ユーザーからの入力を待つ。
              );
            },
            child: Text('日付選択'),
            // ボタンのテキスト。
          ),
          ElevatedButton(
            onPressed: () {
              // 選択した日付表示用のボタン。
              print('$birthdayを選択');
              // コンソールに選択した日付を出力。
            },
            child: Text('選択した日付'),
            // ボタンのテキスト。
          )
        ],
        crossAxisAlignment: CrossAxisAlignment.center,
        // 子ウィジェットを中央揃えに設定。
      ),
    );
  }
}

```
robloxでassistant その33

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
ぶつかったら、partの色を変えよ。

# 手順
- workspaceに、partを追加
- partに、scriptを追加
- スクリプトを書く。
```
local part = script.Parent
part.Position = Vector3.new(-5, 0, -10)
part.Touched:Connect(function()
	print("Part was touched!")
	part.BrickColor = BrickColor.random()
end)

```

以上。
robloxでassistant その32

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
partの位置を変えよ。

# 手順
- workspaceに、partを追加
- partに、scriptを追加
- スクリプトを書く。
```
local part = script.Parent
part.Position = Vector3.new(-5, 0, -10)
while true do
	for i = 1, 10, 1 do
		part.Position = Vector3.new(-i, 0, -10)
		wait(0.1)
	end
	for i = 10, 1, -1 do
		part.Position = Vector3.new(-i, 0, -10)
		wait(0.1)
	end
end

```

以上。
robloxでassistant その31

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
partのサイズを変えよ。

# 手順
- workspaceに、partを追加
- partに、scriptを追加
- スクリプトを書く。
```
local part = script.Parent
part.Position = Vector3.new(-5, 0, -10)
while true do
	for i = 1, 3, 0.1 do
		part.Size = Vector3.new(i, i, i)
		wait(0.01)
	end
	for i = 3, 1, -0.1 do
		part.Size = Vector3.new(i, i, i)
		wait(0.01)
	end
end

```

以上。
言語設定の中に英語が無い

+ [Hi. I can't select to change local language for english.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007TtoKr)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/998dc7fe-1fe4-92e4-c3f6-1b7ffc90697f.png)


:::note
It seems at least Lightning interface has limitations concerning the number of languages it shows in user language settings menu. English was missing in my case since it did not fit to the list. I fixed the problem by reducing the number of alternative languages shown to the user: Click Setup icon in the top right. Select settings->company settings->language settings on the left side panel. Reduce the number of Displayed Languages by removing them with the button. Remember to SAVE.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8YnZSAV

Anyone who is having difficulties default-setting language as English,

Try creating new Salesforce account and login, then it is already auto set in English.

Your google/ linkedin accounts that you have linked to trailhead might be a reason that the language shows as your preferred language and translated to English.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000DclbtSAB
:::

+ [Trailhead　Playgroundの言語設定を英語にできない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XF5j8)

:::note
少なくとも Lightning インターフェースには、ユーザー言語設定メニューに表示される言語の数に関する制限があるようです。私の場合、英語がリストに当てはまらなかったため欠落していました。ユーザーに表示される代替言語の数を減らすことで問題を解決しました。右上の [セットアップ] アイコンをクリックします。左側のパネルで、設定 -> 会社設定 -> 言語設定を選択します。ボタンで言語を削除して、表示言語の数を減らします。忘れずに保存してください。
:::
Javaで「変数を宣言する」の動作を確認してみた

# 概要

Javaで「変数を宣言する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/var/index2.html

# 実装

以下のファイルを作成しました。
```JSample2_1.java
class JSample2_1{
  public static void main(String[] args){
    int old, height;
    old = 20;
    height = 184;

    System.out.println("年齢：" + old);
    System.out.println("身長：" + height);
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample2_1.java 
$ java JSample2_1 
年齢：20
身長：184
```

# まとめ

何かの役に立てばと。
CAIプロセス実行時のプロトコル(HTTP/HTTPS)を確認する

## はじめに
CAIプロセスのデプロイ先をSecure Agentとした場合、HTTP・HTTPSの両プロトコルにてHTTPリクエストを実行できます。この記事では、実行されたCAIプロセスがいずれのプロトコルとして実行されたかを取得する実装を確認します。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [プロセス実行環境の切り替え(Secure Agent環境での実行)](https://qiita.com/shunsuzu/private/2afc72613d894b4d553e)



## 実行されたプロトコルの取得

CAIプロセス実行時のHeader情報から、どのポートを利用しているかを確認できます。規定値では各プロトコルが利用するポートは次のとおりです。

- 7080 ... HTTP実行
- 7443 ... HTTPS実行

次の手順では、Header情報を取得するCAIプロセスを作成しています。

1. CAIプロセスを次の設定で作成します。
    - 名前を __recipe-pca-getHttpProtocol__ とする
    - __匿名アクセス__ を許可する
    - __Secure Agentグループ__ にデプロイする
1. 出力フィールド __output__ を __タイプ=テキスト__ として定義します。

1. __割り当てステップ__ を追加して __フィールドの追加__ から出力フィールドとして定義した __output__ を選択します。
1. フィールド一覧に __output__ フィールドの設定が追加されているはずです。 __output__ フィールドに __計算式__ として`request:getHeader("host")`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/c8983b46-84eb-72f6-1959-447857d9390f.png)



## CAIプロセスの実行

確認したサービスURLを利用して、HTTP/HTTPS実行時の動作より、ポート番号が得られていることがわかります。ここで得られたポート番号を利用して実行時のプロトコル(HTTP/HTTPS)を判断できます。


```:curlコマンドと実行結果(HTTP実行)
// curl コマンド
curl http://localhost:7080/process-engine/public/rt/recipe-pca-getHttpProtocol

// 実行結果
{"output":"localhost:7080"}
```

```:curlコマンドと実行結果(HTTPS実行)
// curl コマンド
curl -k https://localhost:7443/process-engine/public/rt/recipe-pca-getHttpProtocol

// 実行結果
{"output":"localhost:7443"}
```

たとえば、HTTP実行された場合には、[ディシジョンステップ](https://qiita.com/shunsuzu/private/cf69000890ccdfd1d42f)を使って処理を行わないように制御できます。

## 参考情報

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/items/3d1971ef6e3b993516aa)
Vite+React+Typescript+ChacraUI+react-router-domのプロジェクトをnpmで作成する（備忘録）

### 1. viteで環境構築
```
$ npm create vite@latest
```
project name = <プロジェクト名>, framework = React, variant = TypeScriptを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768355/c2c195cd-7ab0-91eb-d551-f578673d730f.png)


### 2. my-appディレクトリに移動し、起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768355/df8abae8-50d6-5edc-dfaa-881eca0f0ae2.png)


### 3. Localhost:5173でVite+Reactの画面が出たら成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768355/4be29853-f000-193a-b1a8-c75c1801ef08.png)

### 4. Ctrl+Cでサーバーを停止し、ターミナルでChacra-uiをインストール
```
$ npm i @chakra-ui/react @emotion/react @emotion/styled framer-motion
```
### 5. react-router-domをインストール
```
$ npm install react-router-dom
```
VSCodeのステータスバーを表示する

- 何かの拍子でVSCodeのステータスバー(一番下の欄、ブランチなどが表示される場所)が非表示になることがある。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609640/36adefe4-7a92-3e05-1eac-b1d782093f32.png)
- 左上のView>Apperance>Status Bar  で再表示できる。
2024/5/14主にITとかセキュリティの記事

中国で買ったAndroidスマホ、個人情報がダダ漏れだった…(5/12)
https://www.gizmodo.jp/2024/05/android-xiamoi-oneplus-phones-personal-info-study-jpn-1.html

Dellから4,900万件の顧客情報が流出か(5/12)
https://news.mynavi.jp/techplus/article/20240512-2944117/

北朝鮮のハッカー、韓国裁判所の電算網にアクセスし個人情報５０００件持ち出す(5/12)
https://news.livedoor.com/article/detail/26391347/

Electronを使ったPC向け将棋アプリ開発(5/11)
https://qiita.com/sunfish-shogi/items/e58065a0f38f5888d845

「非対面式」「投資」がキーワード　特殊詐欺は減少気配も、ＳＮＳがターゲットに(5/12)
https://news.yahoo.co.jp/articles/8691d1992217edec1733c284526a7e2cb3eeb320?source=rss

韓国ネイバー「株売却含め協議」＝ＬＩＮＥ個人情報流出問題で(5/10)
https://www.risktaisaku.com/articles/-/91394

モバイルＳｕｉｃａで障害発生＝サイバー攻撃の可能性も―ＪＲ東日本(5/10)
https://www.risktaisaku.com/articles/-/91397

現金を持ち歩かない人、改札出られず閉じ込められる(5/12)
https://news.goo.ne.jp/il/100490/%E7%8F%BE%E9%87%91%E3%82%92%E6%8C%81%E3%81%A1%E6%AD%A9%E3%81%8B%E3%81%AA%E3%81%84%E4%BA%BA%E3%80%81%E6%94%B9%E6%9C%AD%E5%87%BA%E3%82%89%E3%82%8C%E3%81%9A%E9%96%89%E3%81%98%E8%BE%BC%E3%82%81%E3%82%89%E3%82%8C%E3%82%8B?from=gootop

高市早苗氏の執念実った、安倍元首相の「宿題」ＳＣ制度可決　国際共同開発参加可能、識者「〝普通の国〟としてスタート地点に」(5/12)
https://www.zakzak.co.jp/article/20240512-WJSSIBDSOJLYHAGGSL3C6C3EPU/

TikTok、米で安保懸念根強く　運営会社、禁止法に猛反発(5/12)
https://news.yahoo.co.jp/articles/9d78f571f1e4605deda64179709383e5a181ebd7
https://sp.m.jiji.com/article/show/3233731

「わからないと聞くこと自体が恥ずかしかった」学歴コンプレックスを持っていた男が変わったきっかけ(5/12)
https://jbpress.ismedia.jp/articles/-/80901

製造業でシステム障害が相次ぐ　事業を揺るがす事態の裏事情(5/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/050900165/

もはや高級コンデジ、写真を撮ることが楽しくなるスマホ「Leitz Phone 3」(5/13)
https://xtech.nikkei.com/atcl/nxt/column/18/00093/00169/

ベクトルデータベース（Vector Database）(5/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/050800168/

システム開発の新潮流　モジュラーモノリス(5/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/050800176/

基幹システムの切り替えでトラブル　1カ月経過も商品の出荷停止続く 江崎グリコ(5/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/050900155/
Flutter 〜asyncとawait〜

## async
関数を修飾するために使用され、その関数が非同期処理を含むことを意味する。
asyncを使って定義された関数は、Futureオブジェクトを返す。

## Future
Futureは非同期操作の結果を表すオブジェクトで、その操作が完了する未来のある時点で値を提供する。

## await
awaitキーワードはasync関数内で使用され、Futureが解決されるまで処理の実行を一時停止する。awaitの後ろにはFutureを返す式を置く。
Futureの処理が完了するのを待ってから次の行のコードが実行される。

asyncとawaitによって非同期処理のコードが同期処理のように直感的に書くことが可能。

## サンプルコード(Dart)
```dart
import 'dart:async';

// データを非同期的に取得する関数
Future<String> fetchData() async {
  // 2秒間の遅延をシミュレート
  await Future.delayed(Duration(seconds: 2));
  return '取得したデータ';
}

void displayData() async {
  print('データ取得中...');
  // fetchDataがデータを取得し終わるまで待機
  String data = await fetchData();
  // データが取得できたらそれを表示
  print('データ受信完了: $data');
}

void main() {
  displayData();
  print('リクエスト送信完了, 待機中。。。');
}

```
結果は
```
データ取得中...
リクエスト送信完了, 待機中。。。
**ここで2秒間待機**
データ受信完了: 取得したデータ
```
リリースされたGPT-4oを使って動画のサマリー生成をしてみる！

## 概要

GPT-4oが発表されました。
GPT-4oについては以下のツイートによくまとまっています。

https://twitter.com/MLBear2/status/1790069525372981452

使用している映像は以下でまとめられています。

https://twitter.com/OpenAI/status/1790072174117613963

非常に優秀でAI系のプロダクトがまた何個か死んだと思いますが、それはさておき使っていきましょう。
APIではすでに利用可能になっております。

今回は以下のcookbookにある動画要約をgradioに移植します。
https://cookbook.openai.com/examples/gpt4o/introduction_to_gpt4o

## デモ

以下の Huggingface Space を作りました。APIキーと動画を貼り付けて試用することができます。
1分間の動画で0.1ドル / 60秒くらいかかります。API使用料に注意してください。

https://huggingface.co/spaces/sakasegawa/gpt-4o-video-summarizer-demo

## 現状のGPT-4o APIの制限

- 動画はそのままアップロードできません
    - これは将来的にもできるとされていないため、ffmpegなどを使ってフレームを処理する必要があります。また、秒間30フレームとか送ると大量のトークンを消費するため、動画理解に必要と思われる分だけ送る必要があります
    - だいたい秒間0.5フレーム (2秒で1フレーム) 程度で十分でしょう
- 音声はそのままアップロードできません
    - これは数週間のうちに可能になるとのことです
    - 現状ではWhisperで書き起こしの形状にしてから送ります

## 実装

### 動画のフレーム抽出と音声抽出

cookbook にあるものと同じです。シンプルな処理です。

```py
def process_video(video_path, seconds_per_frame=2):
    base64Frames = []
    base_video_path, _ = os.path.splitext(video_path)
    video = cv2.VideoCapture(video_path)
    total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    fps = video.get(cv2.CAP_PROP_FPS)
    frames_to_skip = int(fps * seconds_per_frame)
    curr_frame = 0

    while curr_frame < total_frames - 1:
        video.set(cv2.CAP_PROP_POS_FRAMES, curr_frame)
        success, frame = video.read()
        if not success:
            break
        _, buffer = cv2.imencode(".jpg", frame)
        base64Frames.append(base64.b64encode(buffer).decode("utf-8"))
        curr_frame += frames_to_skip
    video.release()

    audio_path = f"{base_video_path}.mp3"
    clip = VideoFileClip(video_path)
    clip.audio.write_audiofile(audio_path, bitrate="32k")
    clip.audio.close()
    clip.close()

    return base64Frames, audio_path
```

### APIの呼び出し

APIの使い方はGPT-4Vと同様です。

```py
# Whisperで音声を文字起こし
transcription = client.audio.transcriptions.create(
    model="whisper-1", file=open(audio_path, "rb")
)

# GPT-4oで要約生成
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "system",
            "content": """あなたは優秀な要約者です。提供された動画とその書き起こしの要約をMarkdown形式で作成してください""",
        },
        {
            "role": "user",
            "content": [
                "これらは動画から取得されたフレームです",
                *map(
                    lambda x: {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/jpg;base64,{x}",
                            "detail": "low",
                        },
                    },
                    base64Frames,
                ),
                {
                    "type": "text",
                    "text": f"動画の書き起こしはこちらです: {transcription.text}",
                },
            ],
        },
    ],
    temperature=0,
)

return response.choices[0].message.content
```

## おわりに

今回は試してみやすいように Huggingface Space に上げました。
サンプルコードがなかったとしてもこの程度の実装であれば1分くらいでできると思います。いい時代ですね。
音声合成がAPIにパックされているかは不明であるため、APIで使う場合は別途text-to-speech APIを叩くか自前で用意しなければならないかもしれません。つらいですね。
自宅マシンでFugaku-LLM-13B を動かすために(複数GPU)

### Object
- 自宅マシンでFugaku-LLMをGPUで動かす環境を作る
- 13BのLLMモデルを自宅用GPUで乗せた時のメモリ使用量実績の記事があまりなかったので、メモ
- Fugaku-LLMならではの話は触れていないので、別記事で中身の検証色々やっていく

### Summary
- Fugaku-LLMは13Bのパラメータを持つ。そのため、**家庭用GPU1枚の上限24GBメモリに乗りきらない。**(約26~28GB)
- **メモリ利用量**:そのため、win10上のRTX3090(24GB),RTX3070(8GB)の2台でロード、計**約28.6GB**。GPUそれぞれの利用量は以下参照
    - RTX3090:21.6GB/24GB (MSI Ventus 24G)
        - メインGPUなのでwinで約600MB利用していたのを含む
        - ライザーケーブル利用
    - RTX3070:7GB/8GB (Palit Gaming Pro 8G)
- 　**速度**:LLMChain関数を用いて、llm_chain.runを実行したところ、**10s以内には大体応答帰ってくる**。十分利用できる
    - 　実行プロンプトは、公式READMEを参考に以下のような形
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
おいしいカレーを作る方法を教えてください。

### 応答:
```
- device_map=autoだと、cpuへのオフロードが行われたため、device_mapで詳細にデバイス指定を行った


### メモ
- device_map=autoの時に以下Warningがモデルロード時に出る。DRAMを使っているらしく、極端に推論速度が落ちたので対策必要だった。
    > WARNING:root:Some parameters are on the meta device device because they were offloaded to the cpu.

- そのため、以下のようなコードで一旦Warning回避
```python
for i in range(30):
    device_map["transformer.h." + str(i)] = 0
for i in range(30, 100):
    device_map["transformer.h." + str(i)] = 1
    # 実際にはtransformer.h.35~40くらいまでしかないはず
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    low_cpu_mem_usage=True,
    device_map=device_map,
    torch_dtype=torch.bfloat16,
) 
```

- 全体のコードは以下
```python
import os
from langchain import HuggingFacePipeline, PromptTemplate, LLMChain
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch

model_name = "Fugaku-LLM/Fugaku-LLM-13B-instruct"
task = "text-generation"
device_map = {
    "transformer.wte": 0,
    "transformer.wpe": 0,
    "transformer.ln_f": 0,
    "lm_head": 0,
}

for i in range(30):
    device_map["transformer.h." + str(i)] = 0
for i in range(30, 100):
    device_map["transformer.h." + str(i)] = 1
    # 実際にはtransformer.h.35~40くらいまでしかないはず
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    low_cpu_mem_usage=True,
    device_map=device_map,
    torch_dtype=torch.bfloat16,
)
pipe = pipeline(
    task,
    model=model,
    tokenizer=tokenizer,
    framework="pt",
    max_new_tokens=1024,
)
llm = HuggingFacePipeline(pipeline=pipe)
template = "{system_example}\n\n### 指示:\n{instruction_example}\n\n### 応答:\n"
prompt = PromptTemplate.from_template(template)
system_example = (
    "以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"
)
instruction_example = "おいしいカレーを作る方法を教えてください。"
llm_chain = LLMChain(prompt=prompt, llm=llm, verbose=True)
response = llm_chain.run(
    {"system_example": system_example, "instruction_example": instruction_example}
)
print(response)

```

- なお、回答は以下の通り。さて・・・おいしいカレーはできるのか。やってみる。
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
おいしいカレーを作る方法を教えてください。

### 応答:
おいしいカレーを作るには、いくつかの重要なステップがある。まず、肉を焼き、次に玉ねぎを炒め、次にカレーパウダーを加え、次に他のスパイスを加え、最後に水を加え、すべてのスパイスをよく混ぜ合わせ、次にトマトペーストを加え、すべてのスパイスをよく混ぜ合わせ、最後に他のスパイスを加え、すべてのスパイスをよく混ぜ合わせ、最後に1時間ほど煮込む。
```
cpuの使用率を確かめる

# sar
```
root@*********:/home/vboxuser# sar -P 0 1 1
Linux 5.15.0-100-generic (*******) 	2024年05月14日 	_x86_64_	(1 CPU)

01時34分48秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
01時34分49秒       0      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        0      0.00      0.00      0.00      0.00      0.00    100.00
```
### ```%idle```
プロセッサがアイドル状態で入出力を待っていない時間の割合が表示される 
### 出典
https://docs.oracle.com/cd/E19683-01/817-0160/6mfvs9jf1/index.html#:~:text=%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%81%8C%E3%82%A2%E3%82%A4%E3%83%89%E3%83%AB%E7%8A%B6%E6%85%8B%E3%81%A7%E5%85%A5%E5%87%BA%E5%8A%9B%E3%82%92%E5%BE%85%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E6%99%82%E9%96%93%E3%81%AE%E5%89%B2%E5%90%88%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%C2%A0

# sar -P 0 1 1
```-P 0```     論理cpu０のデータを採取する意味
次の```1```     1秒毎
その次の```1``` 1回だけデータを採取する

# 論理cpuとは
カーネルがcpuとして認識するもの。

### 論理cpu０とは？
physical id
Linuxが認識しているCPUの番号です。「0」が１個目のCPU、「1」が2個目のCPUを表します。上の表示例の場合は、すべての論理プロセッサーで「physical id」が「0」になっていますので、1個のCPUの中に論理プロセッサーが2個あることを示しています。

### 出典
https://www.sejuku.net/blog/58189#index_id7:~:text=%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%80%82-,physical%20id,%E8%AB%96%E7%90%86%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%83%BC%E3%81%8C2%E5%80%8B%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82,-siblings

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
いろんなコマンドがあるのか。