OmniAICreator/Qiita-1.07M huggingface dataset:
snowflake ミリしらから2週間で SnowPro Core Certification(COF-C02-JPN) を取った

ひょんなことから、snowflake を全く知らない状況から2週間程度で SnowPro Core Certification を取る必要が生じ、RTA じみた対策をしたのでその記録です。  
以下、合格時のスコアレポート。
![Screenshot 2023-08-01 at 10.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/49480ecd-a95e-c573-f5fd-91dcafaa04a4.png)

## SnowPro Core Certification とは

https://learn.snowflake.com/en/certifications/snowpro-core-jpn/

パブリッククラウドをベースに提供されるデータウェアハウス、データレイクサービス [snowflake](https://www.snowflake.com/ja/) の認定資格。  
snowflake の認定資格の中では最も基礎的な内容を問われるものであり、まずはここから取得を目指すもの。

昨年9月に新バージョンがリリースされ、COF-C02（日本語版は COF-C02-JPN）となった。  
試験の概要は大まかに以下の通り。

- 問題数: 100問
- 試験時間: 110分
- 合格ライン: 750点以上
- 試験範囲
    - Snowflakeでのデータのロードと変換
    - 仮想ウェアハウスのパフォーマンスと同時実行
    - DDLとDMLのクエリ
    - 半構造化データと構造化データの使用
    - クローニングとTime Travel
    - データ共有
    - Snowflakeアカウントの構造と管理

## 受検前の知識レベル

snowflake ミリしらの状態だったので、受検前の知識レベルとしては以下の通り。

- snowflake って何？
- DWH? データレイク??
- 業務を通してデータベースを触ることはあるので、SQL の基本的な知識

## 試験対策

主に Udemy を活用した。  
また、snowflake は30日間の無料トライアルが利用可能なため、こちらも併せて利用し実際に手を動かして理解を深めた。

### Ultimate SnowPro Core Certification Course & Exam - 2023

https://www.udemy.com/course/ultimate-snowpro-core-certification-course-exam/

COF-C02 に対応したコース。動画コンテンツとトライアルアカウントでも実施可能なハンズオンが含まれる。  
全編英語だが字幕も表示できるので、聞き取りが困難だった場合は巻き戻したりして確認した。  
動画コンテンツとしては総時間7時間程度なので、ゆっくり確認しても2週間もあれば完了することができる。
私は動画を見ながら Notion に内容を纏めていました。


snowflake 自体、機能改善を続けているサービスであるためこういった動画コンテンツはすぐ陳腐化することが懸念されるが、動画コンテンツはなるべく最新の情報に更新する努力が見られ、試験対策には十分な内容であった。

コースの最後には Mock Exam（模試）も利用できるため、理解度の確認に役立つ。

### [COF-C02]Snowflake SnowPro Core Certification Practice Sets

https://www.udemy.com/course/snowflake-snowpro-core-certification-exam-practice-sets/

こちらは動画コンテンツはなく、3回分の Mock Exam のセットと分野別復習問題セット。  
試験前2日くらいはこれを何度も行い、不正解だった問題については公式ドキュメントを参照した。やはり試験は模試をぶん回すのが効果が高い。

### 公式ドキュメント

https://docs.snowflake.com/ja

まずは公式のドキュメント。前述した通り Mock Exam で知識不足が確認された項目や、Mock Exam を通して頻出したトピックについて知識の強化を目的として折に触れて参照した。

https://learn.snowflake.com/courses/course-v1:snowflake+SPSG-Japan+B/about

公式に提供されている試験学習ガイドも利用した。動画コンテンツと Mock Exam でカバーし切れていないトピックがないかの確認を中心に利用し、追加で確認が必要なトピックについても公式ドキュメントを参照できる状態とした。

## 試験内容と感想

- 試験会場
    - Pearson VUE 試験なので、自宅または最寄りのテストセンターで受検が可能。
    - 私は以前の AWS SAA と同様、テストセンターで受検しました
- 試験の内容
    - Mock Exam から大きく逸脱した難易度の問題はなかった印象
    - 動画コンテンツ、Mock Exam ではカバーし切れていないトピックもあったが、合格に支障が出るほどではない
    - 難易度としては AWS SAA よりは低かったように思う。複雑な状況を問う問題は少なく、単純にサービスをざっと理解できていれば答えられる問題が多い印象。
- 試験時間
    - 110分の試験時間が与えられるが、見直し含めて60分程度で完了できた


## おわりに

以前、[1日で Oracle Cloud 認定資格を取った記事を書いた](https://qiita.com/hitsumabushi845/items/2ecac49cd516e2248167)が、これは業務で Oracle Cloud を触っていたからできたことで、ミリしらの状態から2週間で取得するのは若干骨が折れた。  
が、短期にデッドラインを設定することで集中して勉強が行えたし、自身の成功体験として刻まれるというメリットもあった。できればもうやりたくないけど。
JavaScriptを勉強していたら、途中からバッティング練習になった

おはようございます！
今日も昨日やったことの振り返りをしていきます！

## 昨日やったこと

昨日は、下記のサイトのチュートリアルで数字当てゲームを作りました。

https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/A_first_splash

初心者から上級者までレベルが設定されていて、JavaScriptを体系的に学ぶことができるサイトです。

実際に作ったものがこちらです。

https://twitter.com/YangYooji3942/status/1685890227343351808


### 気付き


数字当てゲームを作る上で、最初のステップとして用意されていたのが、ゴールを思い描くということでした。

>プログラマーのように考えるプログラミングで一番難しいのは、書き方を覚えることではなく、現実の問題にどう適用するかということです。
>プログラマーのように考え始める必要があります — それは一般的に、そのプログラムが何をしなければならないかという説明を見て、それを満たすためにコードのどんな機能を用いるかを考え、さらにそれを組み合わせていかなければなりません。
>これには努力・プログラミング文法の経験・練習に加え、少しの想像力が必要です。
>たくさんコードを書けばもっと慣れていくでしょう。たったの 5 分で「プログラマー脳」を開発することは約束できませんが、このコースを通じてプログラマーのように考えるたくさんの機会を提供したいと思います。
>まずはそれを念頭に置いてから、この記事で作るプログラムの実例を見てみましょう。さらにその後、具体的な手順に落とし込む方法について学習しましょう。


考えてみれば当たり前ですが、今から作るものの設計図を描けていなければ完成するものも完成しません。
しかし、これまで写経的に学習を進めていたところがあったので、「全くその通りだ！！」と叫びそうになりました。

ということで、今回作った数字当てゲームのロジック部分を復習も兼ねて以下に書いてみます。


1.　答えとなる数値を数値を1~100の間でランダムに設定する
2.　プレイヤーが答えを入力･送信できる場所を用意する
3.　プレイヤーが回答した数値を記録しておく場所を用意する
4.　プレイヤーの回答数の初期値を1に設定する
5.　プレイヤーが入力した数値と答えの数値を比較する
6.　2の結果によって処理を分岐する
　6-1.　正解の場合
　　6-1-1.「正解です！」というメッセージを表示する。
　　6-1-2.新たに数値を入力･送信出来ないようにする。
　　6-1-3.　新しくゲームを始めるボタンを表示する。
　6-2.　不正解の場合
　　6-2-1.　回答数が9回以下の場合
　　　6-2-1-1.　回答が答えに対して大きいか小さいかのメッセージを表示する
　　　6-2-1-2.　回答数のカウントをプラス1する
　　　6-2-1-3.5に戻る
　　6-2-2.　回答数が10回に達した場合
　　　6-2-2-1.　ゲームオーバーというメッセージを表示する
　　　6-2-2-2.　新たに数値を入力･送信できないようにする
　　　6-2-2-3.　新しくゲームを始めるボタンを表示する
7.　ゲームが再び始まったら、画面とロジックがリセットされるようにして1に戻る

### 野球で言うとこれはなんなのか？

ロジックが考えられなければ、コードを書こうにもどのように書いたらいいのかがわかりません。
プログラミングの学習を始めてから、コードの書き方を覚えることが最重要だと思っていましたが、それだけではないことに昨日気づきました。

そしてこれはどちらが重要ということではなく、どちらも無いと作りたいものは作れない不可分な関係性ものです。

バッティングでいうと、コードを書く技術を高めることは「スイングスピード」を上げること、最適なロジックを考えることは「バットコントロール」の技術を上げることと言えると思います。

そのように考えると、打席に入る時にどのボールをどこに打ち返すかというイメージの部分が抜けていることに気が付きました。
いつもとは逆で、野球からプログラミングに関連することはないかと考えた結果、それは「作りたいものを想像する」ことではないかと考えました。

:::note info
[野球の場合]
どのボールをどこに打ちたいかをイメージする
↓
来たボールに対してバットを当てに行く
（バットコントロール）
↓
ボールを強く叩く
（スイングスピード）
:::

:::note info
[プログラミングに置き換えると]
作りたいものをイメージする
↓
どんな機能があれば実現できるかを考える
（ロジックを考える）
↓
実際に処理を実装する
（コードを書く）
:::
こう考えると、今プログラムの勉強をしているのは野球の練習をしていることとほぼ同義かと思います。面白くなってきました！そしてこれは誰かに伝わるものなのでしょうか？今日も学習スタートします！
[Swift]AWSCognitoからログインユーザーの「idToken」「accessToken」「refreshToken」「deviceId」を取得する

# 投稿の経緯
Amplify / Cognitoを利用してログイン機能を開発する機会があり、
公式ドキュメントを参考に

・idToken
・accessToken
・refreshToken
・deviceId

をCognitoから取得できたので記事にします。


# 前提
```
pod 'Amplify'
pod 'AmplifyPlugins/AWSCognitoAuthPlugin'
```

CocoapodsでもSPMでもなんでもいいですがSDKは導入している前提で記事を書いています。


# 実装
ライブラリをimportします

```Hoge.swift
import AWSCore
import AWSCognitoIdentityProvider
```

`amplifyconfiguration.json`に記載されている値を参照してCognitoのPoolを設定します。
設定したPoolから現在ログインしているユーザー情報を取得することができます。

```Hoge.swift
final class Hoge {

    private let clientId = "YOUR_CLIENT_ID"
    private let poolId = "YOUR_USER_POOL_ID"
    private let identityPoolId = "YOUR_IDENTITY_POOL_ID"
    private let clientSecret = "YOUR_CLIENT_SECRET"
    private let key = "UserPool"
    
    func hogehoge() {
        let configuration = AWSServiceConfiguration(region: .APNortheast1, credentialsProvider: nil)
        let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: clientId, clientSecret: "", poolId: poolId)
        AWSCognitoIdentityUserPool.register(with: configuration, userPoolConfiguration: userPoolConfiguration, forKey: key)
        let userPool = AWSCognitoIdentityUserPool(forKey: key)
        let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .APNortheast1, identityPoolId: identityPoolId, identityProviderManager: userPool)
        guard let session = userPool?.currentUser()?.getSession() else {
            return
        }
        let task = session.continueWith { task in
            return task
        }
        
        if task.error != nil {
            print("Fail getCognitoUserData:", task.error as Any)
            return
        }
        
        guard let result = task.result as? AWSCognitoIdentityUserSession else {
            return
        }
    
        print("idToken", result.idToken?.tokenString as Any)
        print("accessToken", result.accessToken?.tokenString as Any)
        print("refreshToken", result.refreshToken?.tokenString as Any)
        print("deviceId", userPool?.currentUser()?.deviceIdentifier as Any)
    }
}
```

# 参考記事
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html


# おわりに
私はCognitoからユーザー情報を取得するドキュメントや記事を見つけるのに少し苦労しました。
最終的に公式ドキュメントに記載されていましたが、検索中は「なかなか記事がないな〜🤔」と感じていたのでこの記事が誰かの助けになれば幸いです。

最後までご覧いただきありがとうございました！
ポートフォリオ作成に用いたもの

現在私自身のポートフォリオを作成中です。

ここではポートフォリオ作成の際に私が最低限用意し、使用しているものを上げておきます。

# 最低限必要なもの

## PC環境
- OS: Windows11 Home (Ver 22H2)
- ブラウザ: Google Chrome


## サーバー
- ConoHa WING (ベーシックプラン)


## 言語・ツール
- WordPress
     - テーマ：　Perfect Portfolio


テーマは外部のサイトで無料配布されているものです。

無料版と有料版があるようですが、無料版でも十分使えそうなので有料版を購入する予定は今のところないです。



ポートフォリオ制作はWordPress以外でも可能ですが、個人的には汎用性の高いサイト制作ツールのWordPressに慣れておきたいこともあってこれを選びました。


基本的にポートフォリオはWordPressで制作していきますが、必要(興味?)に応じてHTMLやCSSで記述していきます。




# あると便利なもの

- Unsplash : 有名な画像素材サイト。背景などに使えそう。
- Font Awesome: HTML本文に埋め込んで使うアイコン素材のサイト。


どちらもWeb制作でよく使用されるサイトのようです。


個人的には今のところアイコン素材はWordPressで使用するテーマのもので事足りますが、必要に応じて上記のサイトの素材も使います。


# 外部リンク

私はこちらのサイトを参考にテーマをインストールしました。

https://r-chapter.com/wordpress/themes-perfect-portfolio



Perfect Portfolioのテーマを配布しているサイトです。

これ以外にも様々なテーマが揃っておりますのでご参考までに。



https://rarathemes.com/ref/RYUJI/



UnsplashとFontawesomeのリンクです。

Fontawesomeはアカウント登録なしには使えないのでご注意ください。


https://unsplash.com/ja

https://fontawesome.com/
特徴量エンジンKaskadaリファレンス〜Pythonでのクエリ実行

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/developing/queries.html#querying-with-python


## Pythonでのクエリ実行

Pythonプログラムでは、以下のようにクエリを作成し、実行することができます。

```python
from kaskada import compute
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

query = """{
  time: Purchase.purchase_time,
  entity: Purchase.customer_id,
  max_amount: last(Purchase.amount) | max(),
  min_amount: Purchase.amount | min()
}"""

response_parquet = compute.query(query = query).output_to.object_store.output_paths[0]
```

上記では、クエリの結果をParguetファイルとして出力しています。
このファイルを使って、以下のように、クエリの結果をPandasのデータフレームとして利用することもできます。

```python
# (Optional) view results as a Pandas dataframe.
import pandas
pandas.read_parquet(response_parquet)
```



### Pythonオプションパラメータ
Python から直接クエリを実行する場合、次のオプションパラメーターを使用できます。

 - `with_tables` : クエリで使用するテーブルのリスト（システムに保存されているテーブルへの追加指定として）
 - `with_views` : クエリで使用するビューのリスト（システムに保存されているビューへの追加指定として）
 - `result_behavior` : 以下のどの`result_behavior` タイプのクエリ実行結果が返されるかを決定します。（以下で具体的に説明します。）
   - `all-results` (デフォルト)
   - `final-results`
 - `response_as` : 応答がどのように返されるかを決定します。
   - `parquet` (デフォルト)
   - `redis-bulk`: この場合、 `result_behavior` は 自動的に、`final-results`であるとみなされます 
 - `data_token_id` : 反復可能なクエリを有効にします。
   - 同じデータ トークンに対して実行されるクエリは、常に同じ入力データに対して実行されます。
 - `limits` : 出力セットの制限を構成します。


## `result_behavior`詳説：Kaskadaクエリの2種類の計算結果取得方法

Kaskadaでは、同じクエリの実行結果として、2つの異なる種類の計算結果取得方法が存在します。
それは、**(特定の時点の) 最終結果 (final results)** 、または **全履歴結果(all historic results)** のいずれかです。「タイムライン履歴(timeline history)」とも言います。
そして、クエリ実行時に、それらのどちらの種類の結果を生成するか（いうならば「結果の振る舞い(result behavior)」）を選択することになります。

 - **全履歴結果(all historic results)** では、各エンティティの値が時間の経過とともにどのように変化したかに関する完全な履歴が返されます。
 - **(特定の時点の) 最終結果 (final results)** では、指定された時点 (デフォルトはすべてのイベントが処理された後) での各エンティティの最新の結果を返します。「スナップショット」とも言います。

クエリ時に`result_behavior`設定を使用して、どちらのタイプを実行するかを決定します。明示的に指定しない場合、デフォルトでは、**全履歴結果(all historic results)**　となります。 **最終結果(final results)** に変更するには、`create_query`メソッドのオプションとして、`result_behavior="final-results"`を与えます。


```python
from kaskada import compute

query = """{
  time: Purchase.purchase_time,
  entity: Purchase.customer_id,
  max_amount: last(Purchase.amount) | max(),
  min_amount: Purchase.amount | min()
}"""

resp = query.create_query(expression=query, result_behavior="final-results")
```
ThingsBoard(Community Edition) と IoTデバイス を MQTT 通信させる

ThingsBoard の MQTT 通信は独特な仕様のため、初見で困ることがあったのでメモを残す。

# デバイスの認証方法
いくつか用意されているが、わかりやすい AccessToken による認証を選択した。
ThingsBoardをブローカーとした MQTT 通信の場合、IoT デバイスは ユーザー名に AccressTokenを指定するだけでよい（クライアントIDは自由。パスワードは空欄）

# IoTデバイスからみた publish 先の Topic の違い

Topic: v1/devices/me/telemetry
　測定データなどを UPLINK　する場合に利用。
　時系列の履歴データとして記録される。
 
Topic: v1/devices/me/attributes
　IoTデバイスの状態、情報などを UPLINK　する場合に利用。
　既存のクラインと属性を上書き更新する。

# 属性って何？

サーバーのコンテキスト上に保持される変数のようなもの。
サーバー属性、共通属性、クライアント属性の３種がある。

サーバー属性
　サーバー内部で完結する属性情報
　IoTデバイスとのやり取りには向かない。

クライアント属性
　IoT デバイスからサーバーに UPLINK できる
　IoT デバイスからリクエストを publishして サーバーから DOWNLINK できる
　サーバー側からは操作しない。

共通属性
　IoT デバイスからサーバーに UPLINK できる
　IoT デバイスからリクエストを publishして サーバーから DOWNLINK できる
　サーバー側からも操作できる。　

# トピックのスコープ
ここは普通のMQTTブローカーと異なる。
異なるデバイスで接続しても AccessToken がことなれば、他のクライアントが Publish した内容は見えない。

# DOWNLINK（サーバー主導）

ここも普通のMQTTブローカーと異なる。
Topic: v1/devices/me/attributes を subscribe

共通属性を追加、更新すると、IoTデバイスと TCP接続が有効な時にのみMQTTパケットを送信する。
それ以外は破棄される。

つまり常時接続状態でないと、取りこぼすことになる。

# IoTデバイス主導で属性情報を DOWNLINK する方法（共有属性、クライアント属性のみ）

同一の TCPセッションにて、以下の手順で MQTT通信を行う。
1) Topic: v1/devices/me/attributes/response/+ を subscribe
2) Topic: v1/devices/me/attributes/request/1 に取得したい属性名のリスト（カンマ区切り）を publish

TCPセッションがことなるとリクエストとした属性情報は受信できない。

mosquitteクライアントなどで個別の端末でサブスクライブしつつパブリッシュしても受信できない。
（サンプル例がPythonで記述されているのは、同一セッションで通信させるため）


リクエスト用の MQTTメッセージは以下のようなJSON形式になる。
{"clientKeys":"<属性名>,<属性名>,....","sharedKeys": "<属性名>,<属性名>,...."}

{"clientKeys":"<属性名>"}や、{"sharedKeys": "<属性名>"} といった形式でも良い。

ここまで理解できれば ThingsBoardもそれなりに使えるようになると思われる。

# 以上
devise_token_authでproviderを変更する

## 概要

RailsのAPIサーバでdevise_token_authによるトークン認証を実装しようとした際に、providerにかなり苦しめられたので、providerを変更する手順について記事にしました。

## やりたいこと
devise_token_authのデフォルトのproviderはemailになっていますが、私はただの文字列（login_idと定義）で認証を行いたかったので、providerを'login_id'に変更したい。これは、usernameなどで認証を行いたい場合も同じで、これから説明することを行う必要があります。

## 方法
以下を行うことでproviderの変更ができます。
- devise_token_authのUserテーブルのproviderを'email'→'login_id'にする
- providerをオーバライド

それぞれについて説明していきます。

## テーブルのproviderを変更
devise_token_authでインストールした直後（devise_token_authをinstallしてからdb:migrateするまで）にmigrationファイルを書き換えてproviderの部分を以下のように変更します。

```ruby:migration
create_table(:user_devise_infos) do |t|
    t.string :provider, :null => false, :default => "login_id" # <= 自分のprovider名に変えてください
    # （以下省略）
```

devise_token_authの直後というのは、db:migrateしてテーブルを作成した後にproviderの変更のためにrollbackしようとすると、indexの関係でエラーが出てるかもしれないからです。テーブルを作成した後にproviderを変更したい方は以下の記事を参考にするといいと思います。

- https://stackoverflow.com/questions/74816468/argumenterror-no-indexes-found-on-likes-with-the-options-provided

## providerをオーバライド
これは非常に簡単です。application_controller.rbを以下のようにするだけです。
```ruby:application_controller.rb
class ApplicationController < ActionController::API
        include DeviseTokenAuth::Concerns::SetUserByToken
        include DeviseTokenAuth::Concerns::ResourceFinder

        def provider
                super
                'login_id' # <=　自分のprovider名に変えてください
        end
end
```

## おわりに
今回の内容が少しでも誰かのお役に立てれば幸いです。
Railsほぼ初心者の人間が書いているので、何か問題点等ありましたら、ご指摘よろしくお願いします。
PowerAutomateのアクションリクエスト過多について

# 説明

PowerAutomateでアクションのリクエスト過多でエラーになることがある。両方ともエクセルスクリプトで正規表現チェックを行ったところ。

### パターン1

    "body": 
    {
        "message": "Graph Item not found, was it unshared or deleted?\r\nclientRequestId: 8c63cc88-bdfa-40f7-be42-94e6b2af687a",
        "storageErrorCode": 5
    }

このタイプは正規表現でもファイルの名前を検証している時に発生した。
どうも1時間単位のリクエスト制限に引っかかっているようで、1時間後には解除されている。

### パターン2

    {
      "statusCode": 403,
      "message": "Out of call volume quota. Quota will be replenished in 07:04:20."
    }

こちらはエクセルループ内の欠品月_システム用の形式を検証するところで発生した。
エクセルスクリプトの実行には1日の制限があるらしく、1日あたり1600回の実行しかできないらしい。

https://learn.microsoft.com/ja-jp/office/dev/scripts/testing/platform-limits
DX開発でメタデータのサポート状況を確認する方法

# メタデータのサポート状況を確認するには
下記のURLより、該当するメタデータを検索して各開発モードでのサポート状況を確認可能。
https://developer.salesforce.com/docs/metadata-coverage

例：第二世代管理パッケージ管理パッケージにガイダンスを追加しようとして、いろいろ作業実施後、パッケージバージョン作成したら、Promptエンティティはサポートしませんとエラーが発生。
上記で確認する。なんと第二世代管理パッケージでのみサポートしていない！何でしょう！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/f5d9bff3-038e-d9c8-1926-4c0bbfbc517d.png)
MySQLエラー「The used SELECT statements have a different number of columns」

# 起こったこと
My SQLにてSELECT文で、あるカラムの値を取得しようとした際に`The used SELECT statements have a different number of columns`のエラーが発生した。

# 原因
SELECT文にほしいカラムを追加したが、よく見ると**UNION**にて結合を行っており、UNION側のカラム数とSELECT文のカラム数が合わなくなっていた。

# UNIONとは
複数の SELECT 文によってデータをそれぞれ取得し、その結果を結合した上で1つのデータとして取得する場合に使う。
LEFT JOINやRIGHT JOIN などの左右結合でなく、**縦に結合**するためカラム数が一致しないといけない。

例　SELECT id, name, age from uranohoshi UNION SELECT id, name, age from otonokizaka 

table:uranohoshi
|id|name|age|             
|:--:|:--:|:--:|
|1|watanabe|17|
|2|kunikida|15|
|3|matsuura|18|

table:otonokizaka
|id|name|age|             
|:--:|:--:|:--:|
|1|takasaka|17|
|2|nishikino|15|
|3|ayase|18|

結合後
|id|name|age|             
|:--:|:--:|:--:|
|1|watanabe|17|
|2|kunikida|15|
|3|matsuura|18|
|1|takasaka|17|
|2|nishikino|15|
|3|ayase|18|

# まとめ
`The used SELECT statements have a different number of columns`のエラーを見るのは初めてだったが、UNIONで結合を行っている場合以外では起きないエラーっぽい？
このエラーが出た場合はUNION結合をしていないか確認する必要あり。
2023年08月何故かベストアンサーをつけてくれない質問

[2023年8月の質問の中から整理します](https://qiita.com/Keiji_otsubo/items/3c40178915002e55f0e6)

+ [rror：Test login failed. Your login information may be incorrect. See the **debug log** report for more information. You also need to enter your security security. This setting was never saved.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007BH8Pk)

:::note
May I ask what your Debug Logs are showing?

Have you tried to log in as the integration user?

Do you have a security token?

I had the same authentication errors.

I checked the debug logs, checked the integration user credentials, regenerated a security token that was then emailed to the email account set up for the integration user. **Please be mindful that if you have any other integrations using the security token, they will need to be updated with the regenerated version**

I then used the integration user USERNAME, PASSWORD & SECURITY TOKEN.

I left the Debug Level as Errors Only

I left the Custom Domain blank even though we have one setup.

I ticked the Standard License Type & hit save.

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

+ [We can’t find the service appointment created for work order](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PexVZ)

:::note
Please check this article. 

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

+ [Not able to install NPSP error : Oops! It looks like you don’t have permissions to run an installation on this org.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CJcK3)
OpenAIのEmbeddingの仕組みについて解説

## はじめに

OpenAIは、人間レベルの一般的な人工知能を開発することを目指している組織です。そのための手法の一つとして、深層学習モデルが自然言語を理解するためのEmbeddingがあります。本記事では、その仕組みとその影響について解説します。

## Embeddingとは

文や単語、文字などのテキストデータを高次元空間上における数値ベクトルに変換することを指します。この空間上では、意味的に近い単語は互いに近い位置に配置され、遠い単語は遠くに配置されます。

テキストデータは、人間が理解するためには意味を持つ記号の集まりですが、コンピュータはこれを直接扱うことが難しいです。そのため、テキストデータを数値化しコンピュータに理解できる形式に変換する必要があります。この変換する方法としてEmbeddingがあります。

## OpenAIとEmbedding

OpenAIは、Embeddingを利用して大規模な言語モデル（GPT-3やChatGPTなど）を訓練します。この訓練過程は、大量のテキストデータを利用して、単語や文章がどのように関連し合っているかを学習します。その結果、モデルは、与えられた文脈から新しい単語や文の生成を予測できるようになります。

Embeddingの学習は、トークン化と呼ばれるプロセスから始まります。テキストは個々の単語や句読点に分割され、それぞれが一意の数値ID（トークン）に変換されます。次に、これらのトークンは、ベクトル表現（Embedding）に変換されます。

OpenAIのモデルは、Transformerアーキテクチャを利用しています。このアーキテクチャは、Attentionメカニズムを利用して、各トークンが他のすべてのトークンとどのように関連しているかを理解します。これにより、モデルは、文脈に応じた単語の意味を捉えることができます。

さらに、位置エンコーディングと呼ばれるテクニックを使用して、単語の位置情報をEmbeddingに追加します。これにより、モデルは単語が文のどの部分に現れるかを理解し、文法的な構造を捉えることが可能になります。

## Embeddingの学習と最適化

Embeddingは、大量のテキストデータに基づいて学習されます。OpenAIのモデルは、インターネット上の大量のテキストデータを使用してEmbeddingを学習します。これにより、単語やフレーズがどのように使用されるか、どのように関連しているかをモデルが学習します。

この学習プロセスは、誤差逆伝播と確率的勾配降下法によって最適化されます。モデルは、入力と出力のペアに基づいてパラメータ（つまりEmbedding）を調整します。このプロセスは何度も繰り返され、最終的にはモデルが正確な予測を行えるようになります。

## 使用方法(Pythonの場合)
### 1.OpenAI APIキーを取得する
### 2.OpenAI APIのPythonライブラリをインストールする
```bash:bash
pip install openai
```
### 3.OpenAI APIのEmbeddingを取得するPythonコードを記述する
```python:getEmbedding.py
import openai

# APIキーを設定
api_key = 'YOUR_OPENAI_API_KEY'
openai.api_key = api_key

# Embeddingを取得する関数を定義
def get_embedding(text):
    response = openai.Embedding.create(
                  model="text-embedding-ada-002", 
                  input=text)
    return response['data'][0]['embedding']

# テキストをEmbeddingに変換
text = "こんにちは、ChatGPT!"
embedding = get_embedding(text)
print(embedding)

```
### 4.実行
Responseの形は下記のような形で返されます。
```json:resopnse
{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "embedding": [
        0.0023064255,
        -0.009327292,
        .... (1536 floats total for ada-002)
        -0.0028842222,
      ],
      "index": 0
    }
  ],
  "model": "text-embedding-ada-002",
  "usage": {
    "prompt_tokens": 8,
    "total_tokens": 8
  }
}

```
※OpenAI APIの公式ドキュメント参照
[OpenAI API Reference](https://platform.openai.com/docs/api-reference/embeddings/create?lang=python)
今回の場合、「こんにちは、ChatGPT!」というテキストをEmbeddingした結果が返ってきます。

## Embeddingの可能性

Embeddingは、自然言語を理解するためのAIの能力を飛躍的に向上させました。Embeddingにより、モデルは単語やフレーズの意味を把握し、より自然な言語生成や質問応答、感情分析などのタスクを達成できます。

特に、OpenAIのような大規模なモデルにとって、Embeddingは膨大な数のパラメータを効率的に扱う方法を提供します。このようにして、OpenAIのモデルは、人間と同等のパフォーマンスを達成するための大きな一歩を踏み出しています。
WZR-HP-G300NH に公式ファームを焼き戻す

:::note warn
うろ覚えです。文鎮になっても責任取りません。
:::

## 下準備
#### シリアルを引き出す

https://kghr.blog.fc2.com/blog-entry-32.html

#### ubootのenvを引っこ抜く

- シリアルポートを115200で開いて、起動待ちのタイミングでなんか押してubootに入る。
- `printenv`するとenvが吐かれるのでとりあえず保存

#### PCのIP+ARPの固定
##### IPを固定する
envのserverip(たぶん`192.168.11.2`)にする。サブネットは24。

##### ARPを固定する
envのethaddrを使う。
cmdを管理者権限で開き、`netsh interface ip show interface`を実行。
ルーターと繋いでるNICの"名前"を取得する。

固定するコマンドを実行
```
netsh interface ipv4 set neighbors "<インターフェース名>" 192.168.11.1 <ethaddr(ハイフン区切り)>
```


#### buffalo-encのビルド
公式から配布されてるファームの暗号化を解除するツール。
OpenWRTをビルドすると付いてくる。
`build_dir/host/firmware-utils/buffalo-enc`

https://www.emb-se.com/?page_id=1004

### 公式ファームを変換
#### 先頭のゴミを落とす
バイナリエディタで`start`を探す。たぶん先頭200byte前後にある。
そこでぶった切って、`start`から始まるファイルにする。

#### buffalo-encで変換
機種名とか出てくるはずなので、出なかったらゴミ取りの確認とファームのバージョン変えて試す。
```
./buffalo-enc -d -i firmware.bin -o firmware.modified.bin
```


### ルーターに焼く


https://qiita.com/13310/items/c05699419dabcb94a386
DAOパターン

# DAO とは...
- **D**ata **A**ccess **O**bject の略
- デザインパターンの一種で、データベースへのアクセスロジックを集約したクラスのこと
- 業務ロジックとデータを取得するのを分離するために考えられたもの
- DBへのアクセスロジックがテーブルごとに集約される
- データベースへのアクセスはDAOを使用して行われる

![DAO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664075/a083cc65-e4a5-0538-ff9a-4606f311626f.png)

# メリット
- メインロジックとデータベースアクセスの処理を明確に分けることで、修正や変更があった場合に、互いのクラスに影響を与えない

- SQLが一カ所にあるため、使用しているSQLの一覧性がある

- データベースアクセス処理の重複した記述を防ぎ、ソースコードがシンプルに！

![DAO2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664075/e5f91305-b0ec-cc80-d87d-318a326b23be.png)

# デメリット
- どのクラスから参照されているか分からないので、同じ関数を複数クラスから使用している場合に考慮範囲が広がる(メンテナンスしづらい)
「開発が完了する」とは？

あるプロダクト開発において計画やTODOリストをつくるとき、

> 開発を完了する

とか

>実装を完了する

などのような文言でタスクを定義することはよくあるかと思います。

## 「開発が完了する」とは？

しかし「開発が完了する」と書くと、のちにチーム内の認識ズレによるトラブルが起きることがあります。

たとえば「開発が完了する」というタスクが完了しました。そこでプロダクトオーナーが

> よし、じゃあリリースしましょう！

と言ってもエンジニアからは、

> 「**いや、開発が終わっただけです。テストはまだだし、リファクタリングもしたいです**」

みたいなやりとりは、オーナーもエンジニアも人生で一度はかならず経験があるでしょう。

つまり「開発」および「開発が完了する」という**言葉に対してさまざまな解釈できてしまう**、という問題があります。

## どう定義すべきだったのか

これを解消するためには「開発」という言葉を使わずに表現するのが良さそうです。

経験則では、とくに下記を意識して定義しなおすと上手くいきやすいと感じています。

- **解釈の余地がない「状態」や「条件」を定義する**
- **「次のステップ」が存在する場合は「（ステップが）開始できる」状態を完了条件とする**

たとえば次のような例はどうでしょうか。

## 具体例

> リリースが完了している

書けるならこれがもっとも適切な表現でしょうか。

開発のタスクのすべてのみならず、リリースに関するタスクも含んでいることがよくわかります。成果物としても完成してることが明確ですね。

同じような表現として「ユーザが〜を利用している」みたいなのも良いでしょうか。

> マージの準備が完了している

「リリースが完了する」までが難しそうな場合、次に書けそうなのはこれでしょうか。

この書き方だと、テストやドキュメントをふくむ様々なタスクの完了が期待されていることがよくわかります。

「開発が完了する」の定義をこれにしてしまうのはどうでしょう？　組織やチームが同じ認識で動けるなら、それもアリに見えますね。

> 〜をローカルで動かせるようになる

この書き方は、あいまいな部分こそ残りますが、まだ「完成」ではないことは伝わるでしょう。テストやリファクタリングの完了有無はスコープに入っていません。

またリリースまでを見通していないこともわかるため、この計画の完了目処をリリース日にしてしまうようなトラブルはなくなるはずです。

## まとめ

DDDの文脈では「ユビキタス言語」が重要視されていますが、これはプロダクトにかぎらずコミュニケーションにおいても同様だと感じています。

ただコミュニケーションにおいてはわざわざ言葉の定義をするよりは、よりわかりやすい、解釈の余地が小さい言葉をつかってするべきだと思いました。

「うちはこんな表現で計画している！」などあれば、ぜひコメントで教えてください！
Vim 9.0 patchダイジェスト (2023/07)

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([9.0.1672](https://github.com/vim/vim/commit/d392a74c5a8af8271a33a20d37ae1a8ea422cb4b) ～ [9.0.1677](https://github.com/vim/vim/commit/4c0089d696b8d1d5dc40568f25ea5738fa5bbffb))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**

* [9.0.1673](https://github.com/vim/vim/commit/80adaa8ae8398403ca4e9797219ea9a501fc76a5): :four_leaf_clover:`err_teapot()`を追加しました。[RFC 2325](https://www.rfc-editor.org/rfc/rfc2325) (ジョークRFC)の実装に必要な 418 番のエラーを生成します。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
c2kでMULTIPROCESSOR

私のマルチプロセッサー初体験は1990年にモトローラの88Kでした。当時は何もできなかったのですが、最近はちょっと利口になったかもしれないのでc2kでマルチプロセッサーを試してみます。

comcerto 2000(Cortex-A9 armv7)は最初はシングルコアの製品もあったようですが、ほとんどコアが2つ入っています。armのマルチプロセッサーはarmv6mpで公式仕様になりました。armv6mpの製品はほとんどなくて、実質armv7以降になります。

c1kもマルチコアがあるのですが、armv6mpではないようで謎マルチコアです。

共通仕様にはなっていますが、決まっていない事もいろいろありSOC毎の処理も必要です。

NetBSDではinitarmの終わりのほうでセカンダリーのCPUを上げます。

Snoop Control Unit(SCU)を設定して、c2kの場合、物理アドレスの0番地から実行を始めるので、そこのメモリに処理をおいてCPUのリセットを解除します。

0番地からの処理はcpu_mpstartへのジャンプにします。

いつもの最初の一歩作戦です。

```diff
--- a/sys/arch/arm/arm/armv6_start.S
+++ b/sys/arch/arm/arm/armv6_start.S
@@ -834,6 +834,9 @@ ENTRY_NP(cpu_mpstart)
 #if defined(__ARMEB__)
        setend  be                              // switch to BE now
 #endif
+       ldr     r2, .Luart
+       mov     r1, #78
+       strb    r1, [r2]
 
        /* disable IRQs/FIQs. */
        cpsid   if
@@ -897,6 +900,8 @@ ENTRY_NP(cpu_mpstart)
        movw    lr, #:lower16:armv7_mpcontinuation
        movt    lr, #:upper16:armv7_mpcontinuation
        b       armv7_mmuinit
+.Luart:
+       .word   0x96400000
 ASEND(cpu_mpstart)
 
 /*
```

文字が出たので、CPUは起動したようです。

VERBOSE_INIT_ARMを設定してビルドするとログでます。

```
midr  : 0x412fc091revidr: 0x412fc091
mpidr : 0x80000901
index : 0x00000001
sp    : 0x034cf000
AB sctlr:0x00c50078/0x00c50078 CFG01H1JKIL
MMU
virtual
index: 0x00000001 ttb (TTBR0=0x034d405b) (TTBR1=0x034d405b) (TTBCR=0x00000011) ci = 0x833d4740 vfp hatched |=0x00000002
```

定義間違えて、てこずりましたが、できました。

https://dmesgd.nycbug.org/index.cgi?do=view&id=7238

割り込みの処理状況は以下のようにして確認できます。

```
c2k# intrctl list
interrupt id    CPU0   CPU1  device name(s)
armgic irq 0     303*   259* IPI ast
armgic irq 1      51*    52* IPI xcall
armgic irq 2    3665*  7674* IPI nop
armgic irq 3       0*     0* IPI shootdown
armgic irq 4       0*     0* IPI ddb
armgic irq 5     281*   521* IPI generic
armgic irq 27  88945* 88945* 
armgic irq 36 274013*     0  
armgic irq 53      1*     0  
armgic irq 54  16572*     0  
armgic irq 59   2030*     0  
```

irq 27はA9のタイマーです。

CPUが結構熱くなるのでヒートシンク貼って、温度測ってみたところ、気温30度の時に、通常時57度で、コンパイル流して負荷かけると63度になりました。結構熱持ちます。

後日追記：BCM5301XでもMULTIPROCESSORを試したのですが、セカンドのCPUは起動できたのですが、cpufuncが上手く動かなくて落ちてしまうようです。

ちょっといじったらcpu_init_secondary_processor()まで進んで、cpu_setup()で落ちるようになりました。

cpu_init_secondary_processor()がなんだか不安定で、デバッグライト入れると挙動が変わったりします。なんでかな。。。

c2kはBCM5301Xを雛形にしてポートしたのだがc2kはMULTIPROCESSORで動くのにBCM5301Xは動かない。。。

Linuxのコードを見ると、L2キャッシュを止めているのだが、同じようにinitarmの最初で止めると、initarmの最後のセカンダリを上げたところでハングする。

ブートローダーのL2キャッシュの初期化に依存してしまっているのかも。。。またいつか調べよう。
君たちはどうテストデータを作るか

# これは
何かアプリなりシステムなりを作る時にテストはつきものです。
多くのプログラムは動かしたりテストをする時にデータが必要となり、それらはテストデータと呼ばれます。
テストデータはデータベースに直接投入したり、出来上がってる画面からテストとして入力やアップロードされることによって作られることが多いでしょう。
この記事では、そんなテストデータを作るときに気を付けるべきことをお伝えします。

# そのテストデータは使っていいのかよく考る
ユーザーの登録フォームの例だと、こんな感じの入力項目があるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/f1776a0e-2ac3-fc05-4ffe-6231ffcdbd47.png)

ここで、メールアドレスや電話番号は**実際にシステムからメールやSMSが送信される可能性がある**ので要注意です。
メールアドレスで言えば適当に書いたメルアドが実際に存在して届いてしまう可能性があるので必ず自分のメールアドレスや[エイリアス](https://www.gizmodo.jp/2019/05/email-alias-guide.html)を使いましょう。
電話番号はプロジェクトの中でテスト用に決めた番号を使うなどを検討すべきでしょう。

実際に送信されるかどうかはシステムの仕様次第ですが、将来に渡っても確実に飛ばないとは言えないので気を付けるにこしたことはありません。

画面やファイルのアップロード系も気を付ける必要があります。
アップロードするテストデータが著作権のある情報じゃないかちゃんと確認しましょう。
[いらすとや](https://www.irasutoya.com/)などの著作権フリーのデータを使うのが無難です。

名前や自由入力欄でも、何かのIDやパスワードやURL、プログラムが入ったデータを入れてしまうと場合によっては重大なセキュリティインシデントに繋がる恐れがあります。
気をつけましょう。

# なるべく意味のなさすぎるテストデータを避ける

 「ああああ」とか「ほげほげ」を入力するのをよく見かけるがこれは気をつけた方がいいです。
例えば先ほどのフォームの「ユーザー名」と「その他」の両方に「ああああ」とか入れちゃうと登録結果を見たときに「ユーザー名」と「その他」どっちのデータが出てるのか識別が困難になってしまいます。

そのデータが人名なら人の名前っぽいもの、商品名ならそのシステムが扱う商品っぽいものを（もちろん架空で）登録しておけば間違ってデータが出てるときに気づきやすくなりますし、利用者をイメージしやすくなります。

システムの規模が大きくなれば大きくなるほど入れたデータの繋がりや流れができるので適当なデータばかりだと何が正しいかよくわからなくなってくるので多少面倒でも**本当に入れそうな、でも架空のデータ**を入れるようにしましょう。

これはテストだけでなく、UIデザインや画面設計書に仮で置かれているデータも同じで、レビューするクライアントやこれを見て実装するエンジニアがその機能をイメージしやすいように適切な値を置いておくのが重要です。

# テストデータで遊んではならない
↓こちらの良スライドを読みましょう。

<iframe src="https://www.slideshare.net/slideshow/embed_code/key/vVkD0uryq1QJPi?startSlide=1" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px;max-width: 100%;" allowfullscreen></iframe><div style="margin-bottom:5px"><strong><a href="https://www.slideshare.net/ketaiorg/ss-250149770" title="テスト文字列に「うんこ」と入れるな" target="_blank">テスト文字列に「うんこ」と入れるな</a></strong> from <strong><a href="https://www.slideshare.net/ketaiorg" target="_blank">Kentaro Matsui</a></strong></div>

追記：2024年版が出ました💩

https://www.infiniteloop.co.jp/tech-blog/2024/04/unko2024/

# まとめ
いついかなる時も、データを入れる前にそのデータが適切かどうかよーく考えましょう。

※記事タイトルは流行に乗せただけで内容とは関係ありません:pray:

# Appendix
## テストデータを再利用、共有できるようにしておく
テストデータは一度使って終わりになることはあまりありません。
他の機能のテストで使い回されたり、別環境でテストする時に再利用されたり、再現テストに利用されることもあります。

テストデータ作成のSQL文を保存しておくとか、LaravelフレームワークであればSeederやFakerなどテストデータを作成、再利用する仕組みを使ったり、データ取り込みのがあればストレージサービスに使ったデータを残しておくなど。
テストデータを共有、再利用できる工夫を行なっておくとテスト工数の削減になります。
【JAVA・学習ログ①】プログラムの基本構造／変数・定数の宣言


無知識・未経験の事務系OLによるプログラミング学習備忘録です。

≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ

## ■プログラムの基本構造
![スクリーンショット 2023-07-31 224854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/508ccef8-5691-c964-d6cc-61a78760f3db.png)
【実行】
![スクリーンショット 2023-07-31 231046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/4a361f26-c11c-d4a5-8cec-6ae96e51b7d8.png)

＊文末の「；(半角)」は忘れがちになるので気を付ける

## ■変数宣言

変数…データ値を代入できる箱のようなもの。
![スクリーンショット 2023-08-01 004233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/d7942abc-e31c-7c8a-af8f-b8f22a2065fa.png)
【実行】
![スクリーンショット 2023-08-01 000646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/c9bd6490-64b3-a8dc-7e9a-24dffe950054.png)

▽①整数の型の代入制限の目安。
　少・byte 型 (約±128)
　　・short 型（約±3.2万）
　　・int 型 (約±21億)　★無難な型！
　多・long 型 (約±900京)

▽②文字・文字列を入力するときは引用符で囲む
・「文字」データ ('E')
・「文字列」データ("サキ")

※変数の上書き
![スクリーンショット 2023-08-01 050947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/fe71490b-98be-3db8-651e-8570a277cf43.png)
【実行】
![スクリーンショット 2023-08-01 051420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/fd94dbdb-cd65-7c64-9c71-ed93cda0a3b1.png)

## ■定数の宣言
定数…宣言後、代入した初期値から書き換えることができない変数。
上書きしたくない変数に「final」と付けると定数に。値を再代入してコンパイルすると…
![スクリーンショット 2023-08-01 052940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/35868255-8f4d-4315-0f03-a02cf66eee3c.png)
![スクリーンショット 2023-08-01 052954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/0bcaecae-6ba9-6c53-1b9b-6207bb4d44d7.png)

修正して実行します。

【実行】
![スクリーンショット 2023-08-01 053113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/80623ef3-09a4-3ed1-2303-75f882a1e7ee.png)

できました。

ここまでは順調です！
jsp:paramのvalue属性に指定した日本語データでの文字化け回避する

jsp:forwardやjsp:includeに添えるjsp:paramでリクエストパラメータを指定してあげるとき、value属性に日本語を指定すると、リクエストパラメータを取り出したとき文字化けしている。

ググっても、解決策まで書かれていないサイトのほうが検索結果の上位に出てくるようなので、書いておきます。
[Java フォワード先のJSPファイルで文字化け](https://teratail.com/questions/258736?sort=3)
[JSPにて、他のJSPをincludeした場合の文字化けについて](https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=35770&forum=12)

この文字化けを解消するのは、**リクエストパラメータを渡す側でエンコード**をする必要がある。`<% request.setCharacterEncoding("UTF-8"); %>`を入れればOK。

もちろん、受け取り側でエンコードなどをすることは忘れないように。

ソースコードの書き方としては、以下。

```JSP:paramを書くほうの.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% request.setCharacterEncoding("UTF-8"); %> <%-- **ここが対策** --%>
<jsp:forward page="paramを渡す相手のプログラム">
	<jsp:param name="パラメタ名" value="渡す日本語データ" />
</jsp:forward>
</body>
</html>
```
2023/8/1主にITとかセキュリティの記事

Tomcatサーバへのサイバー攻撃、設定ミスを突くブルートフォースで認証突破(7/30)
https://news.mynavi.jp/techplus/article/20230730-2737300/

SEOフィッシングを防御するための対策とは？(7/30)
https://news.mynavi.jp/techplus/article/20230730-2737372/

Google、Androidベンダーはパッチリリースまでに時間をかけすぎと指摘(7/30)
https://iphone-mania.jp/news-546986/

情報処理推進機構がサイバー攻撃の傾向および手口や対策などを網羅した「情報セキュリティ白書2023」を発行(7/29)
https://dime.jp/genre/1628862/

【要注意】国税庁をかたった「税務署からの【未払い税金のお知らせ】」メールは危険！被害に遭わないための対処法とは？(7/29)
https://gunosy.com/articles/e1chs

私のクレカ情報を求めて偽のモバイルSuicaが釣り竿を垂らしてきた(7/29)
https://ascii.jp/elem/000/004/147/4147434/?rss

Blanccoの調査により、日本では、厳格な規制下にある業界の企業の37％がライフサイクルが終了したデータの管理において持続可能性の問題に対処していないことが明らかに(7/30)
https://japan.cnet.com/release/30882951/?ref=rss

agoda（アゴダ）でのクレジットカード使用は安全？ 不正利用された時の対応方法は？(7/30)
https://mag.app-liv.jp/archive/143515/

ソフトウェアはなぜバージョンアップしなければならないのか(7/29)
https://qiita.com/autotaker1984/items/a3091772dbb0fb91473d

ケニア、e-Visaの発給を当面停止　サイバー攻撃で(7/30)
https://www.traicy.com/posts/20230730275566/

社労士クラウド、重いサイバー被害　復旧遅れや顧問料減(7/29)
https://www.nikkei.com/article/DGXZQOUF3045Y0Q3A630C2000000/

「社労夢」サイバー攻撃　顧問料減額の要求も(7/30)
https://www.nikkei.com/article/DGKKZO73182650Z20C23A7EA5000/

米軍基地あるグアムで送電・給水システムにマルウェア、米政府は中国ハッカーと断定(7/30)
https://www.yomiuri.co.jp/world/20230730-OYT1T50146/

防衛白書　日米韓連携で抑止効果高めよ(7/30)
https://www.yomiuri.co.jp/editorial/20230729-OYT1T50370/

４府県警、運転免許交付できず 警察庁でシステム障害(7/30)
https://www.chugoku-np.co.jp/articles/-/339892

新潟県の運転免許作成システムに障害、498人に即日交付できず　聖籠町の免許センターと長岡支所、計4府県警で発生(7/30)
https://www.niigata-nippo.co.jp/articles/-/256324

警察庁のシステム障害で群馬など４府県で運転免許の即日交付出来ず　県内は約１３０人影響(7/30)
https://news.yahoo.co.jp/articles/31f623d053598c830fbe723171302ce946520f84?source=rss

11万時間分の業務を削減　RPAを全社最適に活用
オープンハウスグループ(7/31)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/072100136/

ChatGPTの「幻覚」を悪用してマルウエア配布
研究者が実演してみせた驚きの手口(7/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800013/072000067/

高野山金剛峯寺がネットワークを全面刷新
築100年超の建物も「参拝者のためにある」　設計と構築にお寺ならではの工夫施す(7/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/072000219/

WindowsのChromeだとネットにつながらない、特定のISPで起こった怪現象(7/31)
https://xtech.nikkei.com/atcl/nxt/column/18/02538/072700001/

脱SAPは「2027年問題」解決の現実解か、オラクルや国産ベンダーに問われる真価(7/31)
https://xtech.nikkei.com/atcl/nxt/column/18/02536/072700001/

サイバーセキュリティー対策が型式認証の要件に(7/31)
https://xtech.nikkei.com/atcl/nxt/mag/nmc/18/00046/00052/

標的型攻撃の被害が判明、セキュリティー担当者が青ざめながらもやるべきこととは(7/31)
https://xtech.nikkei.com/atcl/nxt/column/18/02531/072000004/

「一番大きなプロジェクトを担当したのはぼくなのに……後輩が先に昇格するのはなぜ？」(7/31)
https://xtech.nikkei.com/atcl/nxt/column/18/02518/00013/

耐量子計算機暗号（Post-Quantum Cryptography、PQC）(7/31)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/072400147/

生成AIで客を呼ぶ　躍進セールステック(7/31)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/072400150/

生成AIブームはDXの正念場　変革からの「逃避」はあり得ない(7/31)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/071900144/

Javaの記述を簡潔にする機能　2023年秋登場「JDK 21」が搭載(7/28)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100112/071900074/
Javaのフラグの利用について学習してみた

# 概要
Javaのフラグの利用について学習してみました。以下のページを参考にしました。

フラグの利用

正規表現でフラグを有効にする

https://www.javadrive.jp/start/regex/index16.html

CASE_INSENSITIVEフラグ(大文字と小文字を区別しない)

https://www.javadrive.jp/start/regex/index17.html

MULTILINEフラグ(複数行モードを有効にする)

https://www.javadrive.jp/start/regex/index18.html

DOTALLフラグ(ドット(.)が行末記号とマッチする)

https://www.javadrive.jp/start/regex/index19.html

UNIX_LINESフラグ(\nのみ行末記号として認識される)

https://www.javadrive.jp/start/regex/index20.html

COMMENTSフラグ(パターンの中にコメントを記述する)

https://www.javadrive.jp/start/regex/index21.html

UNICODE_CASEフラグ(Unicode準拠の文字でも大文字と小文字を区別しない)

https://www.javadrive.jp/start/regex/index22.html

LITERALフラグ(パターンの中のメタ文字が特別な意味を持たなくなる)

https://www.javadrive.jp/start/regex/index23.html

CANON_EQフラグ(パターンと対象の文字がUnicode正規等価であればマッチする)

https://www.javadrive.jp/start/regex/index24.html

UNICODE_CHARACTER_CLASSフラグ(Unicodeバージョンの定義済み文字クラスとPOSIX文字クラスを有効にする)

https://www.javadrive.jp/start/regex/index25.html

# まとめ
何かの役に立てばと。
jQuery CSS系メソッド

# css
指定した要素のCSSスタイルを取得または変更・追加する．
**取得**
指定する要素のCSSスタイルを取得したい場合は，引数に取得したいプロパティの値を入れることで，すでに設定されているプロパティの値を取得できる．
```javascript
//基本形
var style = $('selector').css('propertyName');

//例
var style = $('p').css('color')  // pタグの要素の色を取得
```
**変更**
cssの変更や追加を行う場合，CSSのプロパティと値を引数で指定する．すでに設定されている場合は，その設定を上書きする．
```javascript
//基本形
$('selector').css('propertyName','value');

//例
//javascript
$('p').css('color','#f00'); // pタグの要素を赤色に変える
```
* <font color="DarkTurquoise">`selector`</font>: CSSプロパティを取得または設定する要素を指定する．
* <font color="DarkTurquoise">`propertyName`</font>: 取得または設定したいCSSプロパティ名を指定する．
* <font color="DarkTurquoise">`value`</font>: CSSプロパティに設定する値を指定する．

# width
指定した要素の幅を取得または設定する．
**取得**
```javascript
//基本形
var elementWidth = $('selector').width();

//例
var elementWidth = $('p').width(); 
```
**設定**
```javascript
//基本形
$('selector').width('value');

//例
$('p').width(200); // pタグの要素の幅を200pxに変更する
```
* <font color="DarkTurquoise">`selector`</font>：幅を取得または設定する要素を指定する．
* <font color="DarkTurquoise">`value`</font>:設定する要素の幅を指定する．ピクセル値となる．

# height
指定した要素の高さを取得または設定する．
**取得**
```javascript
//基本形
var elementHeight = $('selector').height();

//例
var elementHidth = $('p').height(); 
```
**設定**
```jsx
//基本形
$('selector').height('value');

//例
$('p').height(200); // pタグの要素の高さを200pxに変更する
```
* <font color="DarkTurquoise">`selector`</font>：高さを取得または設定する要素を指定する．
* <font color="DarkTurquoise">`value`</font>：設定する要素の高さを指定する．ピクセル値となる．

# innerWidth
指定した要素の<font color="red">paddingを含んだ幅</font>を取得する．
```javascript
//基本形
var elementWidth = $('selector').innerWidth();

//例
var elementWidth = $('p').innerWidth(); 
```
* <font color="DarkTurquoise">`selector`</font>：paddingを含めた幅を取得または設定する要素を指定する．

通常のwidthとの違いは，指定した要素の**paddingを含めた幅**を取得する．
valueを指定することで，設定することもできるが，基本的に要素の幅の設定はwidthを使う．

# innerHeight
指定した要素の<font color="red">paddingを含んだ高さ</font>を取得する．
```javascript
//基本形
var elementWidth = $('selector').innerHeight();

//例
var elementWidth = $('p').innerHeight(); 
```
* <font color="DarkTurquoise">`selector`</font>：paddingを含めた高さを取得または設定する要素を指定する．

通常のheightとの違いは，指定した要素の**paddingを含めた高さ**を取得する．
valueを指定することで，設定することもできるが，基本的に要素の高さの設定はheightを使う．

# outerWidth
指定した要素の<font color="red">paddingとborderを含んだ幅</font>を取得する．
```javascript
//基本形
var elementWidth = $('selector').outerWidth();

//例
var elementWidth = $('p').outerWidth(); 
```
* <font color="DarkTurquoise">`selector`</font>：paddingとborderを含めた幅を取得または設定する要素を指定する．

通常のwidthとの違いは，指定した要素の**paddingとborderを含めた幅**を取得する．
valueを指定することで，設定することもできるが，基本的に要素の幅の設定はwidthを使う．

# outerHeight
指定した要素の<font color="red">paddingとborderを含んだ高さ</font>を取得する．
```javascript
//基本形
var elementWidth = $('selector').outerHeight();

//例
var elementWidth = $('p').outerHeight(); 
```
* <font color="DarkTurquoise">`selector`</font>：paddingとborderを含めた高さを取得または設定する要素を指定する．

通常のheightとの違いは，指定した要素の**paddingとborderを含めた高さ**を取得する．
valueを指定することで，設定することもできるが，基本的に要素の高さの設定はheightを使う．
ネットワーク論

# はじめに
勉強の一環でネットワーク論についてざっくりまとめました。

## ネットワークアーキテクチャの必要性
ネットワークの処理を階層化し、一つのアーキテクチャとすることで、処理の分担、責任の境界が明確となり、メンテナンスや機能拡張がが格段に行いやすくなる。

## よいネットワークとは
よいネットワークかどうかを判断する指標として、利用者の主観的な評価である**QoE**と、観測に基づく客観的な評価である**QoS**の二つがある。
QoEは利用者のアンケートに基づいて評価し、QoSは通信速度や遅延など数値から評価する。
常に一定の通信品質を保つ品質保証型と、最大限努力をするものの、一定の通信品質保てないこともあるベストエフォート型がある。
輻輳などのトラブルに対し、予防、発見、復旧を各レイヤで行うことも重要である

## 輻輳とその対策
**輻輳**とは、発生した処理落ちの後始末のためにさらに処理能力が低下するという悪循環により、急激に処理能力が落ちていく現象である。
大量のデータが集中して送られると輻輳が起きる。
輻輳の対策には、輻輳を通知することと、レートを調節することの二つがある。

* AIMD方式
加算法で徐々にレートを上げて、乗算法で徐々にレートを下げる。
TCPの場合はウインドウサイズをAIMD方式で変える。

## 同期処理
多くの同期処理はクロックを用いて行うが、クロックは必ずしも正確ではない。特に同一のビットが連続して続いた際に問題が起こりやすい。そのため、マンチェスター符号などが考えられた。
また、情報の先端と終端を判断するために、特殊な文字コードやビット列が付加されている。

## メディアアクセス制御

+ Aloha方式
衝突したらランダム時間待って再送
* CSMA方式
ALOHA+信号が送られている途中かを確認する
+ CSMA/CD方式
CSMA+ 衝突を検知したら他の端末にも知らせてあげる
フレームがあまりに短いと衝突の検知を正しく受け取れなくなる
* CSMA/CA方式
CSMA/CDの無線用
なるべく早く衝突を知らせる

## ウインドウフロー制御
送信したらウインドウを広げる。ACKが返って来たらウインドウを狭める。
ウインドウサイズには限界がある。
受信したらACKを返す。
JSにおけるBabelについて調べてみた

# きっかけ
そうだ！
そろそろ前から気になっていたReactの勉強を始めよう！
というひょんな気まぐれで[Reactのチュートリアルサイト](https://ja.legacy.reactjs.org/docs/create-a-new-react-app.html#create-react-app)を開きました。

その中でこんな記述を見かけたので、触りくらいは学んでおこう。というのかBabelを調べようと思ったきっかけです。

>内部では Babel と webpack を利用していますが、

# Babelとは
Babelの公式サイトは[こちら](https://babeljs.io/ "Babel Home")になります。

次世代のJavaScriptの標準機能を、ブラウザのサポートを待たなくても使えるようにするNode.js製のツールで、**BabelはJavaScriptのコンパイラー**です。
サイトのタイトルにも書いていますね。

次世代の標準機能を使って書かれたコードを、それらの機能をサポートしていないブラウザでも動くコードに変換(トランスパイル)してくれます。

「次世代のJavaScriptの標準機能」というのはESのバージョン６や7で追加された機能、またはさらにその先の基準機能のことを示しています。

# まとめ
まだブラウザでサポートされてないバージョンを使えるバージョンのコードに変換（トランスパイル）してくれるツール
ということらしいです。

# 参考
[Babel](https://babeljs.io/)
[Babelとは](https://www.codegrid.net/articles/2015-babel-1/)
OutSystemsでネットワークカメラの動画を一斉配信

# はじめに
現場にあるネットワークカメラ（IPカメラ）の動画をブラウザから確認したいというニーズがリモートワークやIoTの普及に伴い増えてきています。
従来、ネットワークカメラなどの映像を動画配信する場合には、ストリーミング用のプロトコルを使い、専用サーバーや専用クライアントという環境が必要でした。
近年モバイル端末の普及に伴い、手軽にブラウザからストリーミング動画を確認したいという要望が増えてくるのは自然な流れかと考えます

そこで、今回はローコード開発プラットフォームのリーダーでもあるOutSystemsを使い、手軽にネットワークカメラの映像をWebサーバーから配信することができるようになる **LiveCamera**（Forgeアプリ） についてご紹介します。

# 前提
ローコード開発基盤であるOutSystemsの基本的な知識がある人

# ストリーミング技術
多くのネットワークカメラは、RTSP（リアルタイムストリーミングプロトコル）で動画を配信可能ですが、これはブラウザと直接やりとりすることができません。
そこで、アップル社が開発したHLS（HTTPライブストリーミング）のように、長い動画を細かく分割し使い慣れたWebサーバーからHTTPで動画配信可能な技術が生まれました。
その後、Google社が類似のテクノロジーとしてMPEG-DASHなどをリリースし多くの動画配信サービスでこれらの技術が採用されています。

# HLSとは
HLSは、Apple社により開発されました。 この方式の特徴は、インデックスファイル（プレイリスト）と小さく分割したセグメントファイルを配信して動画を再生します。 セグメントファイルは、MPEG-4ビデオ、AACまたはMP3圧縮方式のオーディオファイルから生成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/4970227e-4626-0457-9eb3-b62d3899e2e5.png)

# LiveCamera
LiveCameraのモジュールは、こちらからダウンロードできます。

https://www.outsystems.com/forge/component-overview/16024/livecamera

# アーキテクチャ
LiveCameraは、ネットワークカメラからRTSP経由で動画を取得し、リアルタイムでHLS形式に変換することが可能です。これによりRTSP URLをサーバーに設定するだけですぐに映像をクライアントのブラウザから視聴出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/d638860d-5216-0cb7-9ffe-452c21092b2e.png)

# 利用方法
利用方法は簡単です。

一覧画面からストリームの新規登録時にRTSP URLを指定するだけです。 あとは、一覧画面上で「開始」ボタンをクリックすれば、配信が始まります。もちろん、複数動画を一斉に配信することも可能です。
なお、機能としてボタンひとつでクライアント端末で動画を録画したり、スナップショットを撮ることが出来ます。

また、動画配信部分Web Blockで部品化されているので、スクリーンに配置して動画配信を確認できるモバイルアプリケーションなどを簡単に開発することが可能となります。

RTSP例 TP-Link Inc.
rtsp://username:password@IP Address:554/stream1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/03b09b3c-32d9-9f4e-e578-02d1fb21a9a7.png)
インポート "XXX" をソースから解決できませんでした(PylancereportMissingModuleSource)にサヨナラしよう

## 起きていること
VSCodeで拡張機能Pylanceを導入すると使用するパッケージの格納箇所によってはimport文で次のメッセージが表示されることがある。

`インポート "XXX" をソースから解決できませんでした(PylancereportMissingModuleSource)`
このメッセージは実行可能であっても表示されることがある。

今まで特に実行に影響ないためそのままだったがソースを開いていつも波線が出ているのは気持ちが悪いので対応しようと思う。

## 対応時の環境
Python 3.11.4
VSCode 1.80.2
Pylance v2023.7.40
記事作成時OSはWindows10を使用している。

Macの場合はかまるもさんが記事を作成されているのでこちらもご覧ください。

https://qiita.com/kamakama/items/a786c591f93e822788f5
## 対応内容
今回仮想環境を導入していてフォルダ構成は次のようになっている。
関係のないディレクトリ、ファイルは省略している。

```
.
├── .vscode
│   └── settings.json
├── venv
│   └── Lib
│       └── site-packages
│           └── pandas
└── example.py
```

example.pyには次のようなimport文がある。
```example.py
import pandas as pd
```
import文には波線が出ておりカーソルを合わせると次のように表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310625/517bd674-6c75-2009-549a-af64762f0400.png)
./.vscode/settings.jsonに次の設定を加えることで解決する。

```settings.json
{
    "python.analysis.extraPaths": ["./venv/Lib/site-packages"]
}
```

## まとめ
 Pylanceのトラブルシューティングによるとユーザーが使用しているワークスペースディレクトリや`src`といった一般的な名前のディレクトリの場合は自動取得されるため明示的にsettings.jsonに書かなくても問題ない模様。
そうではない今回のように自動取得の対象とならないような階層の場合設定が必要となるようだ。

## 参考
https://github.com/microsoft/pylance-release/blob/main/TROUBLESHOOTING.md#unresolved-import-warnings
DiscordのWebhookを使ってテスト投稿を実行（Python）

DiscordのBOTを作る機会があったので備忘録代わりに残していきます。
他に良い方法があるのかもしれませんが、
ひとまずPythonとcronを使ってBOTを作ろうとしています。
# Discordのウェブフックを使ってテスト投稿する
コマンドプロンプトから直接実行
```Python
import requests

webhook_url = "webフックURL"

def send_dummy_message():
    message = "これはダミーのテスト投稿です。"
    data = {
        "content": message
    }
    headers = {
        "Content-Type": "application/json"
    }
    response = requests.post(webhook_url, json=data, headers=headers)
    if response.status_code == 204:
        print("ダミーの投稿に成功しました。")
    else:
        print(f"ダミーの投稿に失敗しました。ステータスコード: {response.status_code}, レスポンス: {response.text}")

if __name__ == "__main__":
    send_dummy_message()
```
投稿を実行するところまで出来たの備忘録として( ..)φ
「実行可能な Dockerfile」を作ってみる

タイトルは「実行可能な Docker イメージ」の間違いではありません。「実行可能な **Dockerfile**」で正解です。実行するとこのようにイメージのビルドが走ります：

```bash
chmod +x Dockerfile
./Dockerfile
```

![ExecutableDockerfile.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/7dbb3140-d8bf-6c00-25b0-c1bb4c70b55f.gif)


仕掛けは単純で、シバンで `docker build` を呼び出しているだけです：

```Dockerfile
#!/usr/bin/env -S docker build . -f
# syntax=docker/dockerfile:1.5.0
FROM busybox
```

Dockerfile は `#` で始まる行がコメントとして扱われるため、1 行目のコメントとしてシバンを仕込めるわけですね。

`env` コマンドの `-S` オプションはシバン行で複数の引数を渡すのに使用されます。このオプションを付加しないと `docker build . -f` で 1 コマンド扱いとなり `No such file or directory` となります。

```log
/usr/bin/env: `docker build . -f': そのようなファイルやディレクトリはありません
/usr/bin/env: shebang 行でオプションを渡すには -[v]S を使ってください
```

`docker build` の `-f` オプションは Dockerfile のパスを指定するものです。シバン行で指定されたインタプリタには実行されたファイルのパスが渡されるので、これを `-f` オプションで受けられる順番にしています。

## `syntax` ディレクティブとの相性問題（解決済み）

このトリックは以前から使用可能だったのですが、`syntax` ディレクティブとの相性問題がありました。`syntax` ディレクティブは通常 1 行目にありますが、シバンを書くと 2 行目に移動してしまいます。この結果、Buildkit はその行を `syntax` ディレクティブではなく通常のコメントとして理解し、拡張構文が使用できない状態になってました。

この点について、2023-01-10 リリースの [Dockerfile v1.5.0](https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.5.0) で `syntax` ディレクティブの拡張が行われ、シバン行の次にある場合でも理解されるようになりました。同時に `// syntax = ...` や `{ "syntax": "..." }` といった形式の表記も理解されるようになっています：

```go:frontend/dockerfile/parser/directives.go
// DetectSyntax returns the syntax of provided input.
//
// The traditional dockerfile directives '# syntax = ...' are used by default,
// however, the function will also fallback to c-style directives '// syntax = ...'
// and json-encoded directives '{ "syntax": "..." }'. Finally, starting lines
// with '#!' are treated as shebangs and ignored.
//
// This allows for a flexible range of input formats, and appropriate syntax
// selection.
```

<https://github.com/moby/buildkit/blob/dc706a966d050323082c44de9c5bfe49b7251191/frontend/dockerfile/parser/directives.go#L103-L111>

Buildkit には同日リリースの [v0.11.0](https://github.com/moby/buildkit/releases/tag/v0.11.0) でビルトインされ、Docker Engine には 2023-05-17 リリースの [v24.0](https://github.com/moby/moby/releases/tag/v24.0.0) で取り込まれました。

Dockerfile が実行可能であることのメリットは正直あまりないですが、タグ等 `docker build` に渡してほしいオプションを明示する際には使えそうです：

```Dockerfile
#!/usr/bin/env -S docker build --no-cache --progress plain --tag tag --build-arg KEY=build-time . -f
# syntax=docker/dockerfile:1.5.0
FROM busybox

ARG KEY
RUN echo $KEY
```

なお、`ARG` についてはこんなことをしなくても `ARG KEY=value`形式でデフォルト値を明示可能です。

## 参考リンク

* [Proposal: Directives should be parsed even if they appear after a shebang line in the dockerfile #2904](https://github.com/moby/buildkit/issues/2904)
* [Proposal: support multiple formats for syntax directives #2937](https://github.com/moby/buildkit/pull/2937)
* [dockerfile/1.5.0](https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.5.0)
* [Dockerfile v1.4.0 以降のヒアドキュメント機能を使うときにハマったこと](https://qiita.com/yokra9/items/8eec13c83e4c59eb0f8e)
* [Man page of ENV](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/env.1.html)
* [Denoでshebangを使って実行する](https://qiita.com/the_red/items/d1ab611983da310ef00c)
* [これは Java スクリプトですか？](https://qiita.com/hanohrs/items/c4b519739e4d733b9aba)