OmniAICreator/Qiita-1.07M huggingface dataset:
JWTとJWSとは何か

# 概要

今回は`JWT`と`JWS`について自分の中でうまく説明できないことに気づき、改めて仕組み等を調べたのでアウトプットとしてこちらに記載していきたいと思います！

# JWTとは

まず、`JWT`とは`JSON Web Token`の略でよく認証などに用いられる仕組みです。

先に言っておくと`JWT`は、それ自体が認証について何か規定しているわけではなく認証を行う際に利用される仕組みに過ぎません。

なので`JWT=認証`ではないということは気に留めておいた方がいいかもしれません。

ではJWTは何をするのか？

## JWTは何をするのか

`JWT`の役割は制約のあるHTTPヘッダやクエリパラメータにJSONデータをうまく付与できるようにすることです。

主に役割は2つあります。

1. JSONデータを**URLセーフ**(Base64URLでエンコード)にする
1. JSONデータを**コンパクト**にする

### 1. データをURLセーフにする

URLセーフとはURLとして正常に使用できる文字列にするということです。

たとえば、`?`、`=`、`&`などのようなものは、パラメータなどに解釈されてしまうので

そうならないように**Base64URLエンコード**し、文字列として解釈してもらえるようにします。

### 2. データをコンパクトにする

これはJSONデータの**クレーム名**を省略することでデータを小さくすることです。

**クレーム名**とはJSONデータのキーとなる部分のことを指し、下記のようなものがあります。

|クレーム名|説明|
|---|---|
|expiration|JWTの有効期限|
|issuer|JWTの発行者|
|...|...|

他にもたくさんあるので詳しく知りたい方は下記を参照してください。

https://tex2e.github.io/rfc-translater/html/rfc7519.html#4-1--Registered-Claim-Names:~:text=Registered%20Claim%20Names-,4.1.%20%E7%99%BB%E9%8C%B2%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%82%AF%E3%83%AC%E3%83%BC%E3%83%A0%E5%90%8D,-The%20following%20Claim

実際に下記のようなものをデータのクレーム名を省略してデータを形成します。

```json
{
    "issuer": "sample.jwt",
    "expiration": 1670085336,
    ...
}
```

省略後

```json
{
    "iss": "sample.jwt",
    "exp": 1670085336,
    ...
}
```

### JSONデータをBase64URLでエンコード

最終的にJSONデータを下記の図のようにエンコードしてJWT生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629084/04a7f9d0-1c00-971a-ab09-7361dbc0c721.png)
引用：[基本から理解するJWTとJWT認証の仕組み
](https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/)

# JWSとは

`JWS`とは`JSON Web Signature`の略で`JWT`が本物か、もしくは中身が改ざんされていないかを検証する仕組みのことです。

`JWT`はJSONデータを**Base64URL**でエンコードしたデータのことでした。

しかし、デコードしデータの中身を変更し再度エンコードすれば簡単に中身を改ざんできてしまいます。

それを防ぐために`JWS`という仕組みがあります。

では`JWS`は何をするのか？

## JWSは何をするのか

結論、暗号鍵を利用して最終的に`ヘッダ.ペイロード.シグニチャ`で形成された文字列を生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629084/a1a190be-7ebb-330e-a996-77352c9fed48.png)
引用：[基本から理解するJWTとJWT認証の仕組み
](https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/)

先ほど出てきた`JWT`が真ん中に入る形になっています。

流れとしては下記になります。

なお今回は秘密鍵方式を前提としてます。

```txt
1. ヘッダをBase64URLでエンコード
2. JWTをBase64URLでエンコード
3. エンコードしたヘッダとJWTをヘッダの`alg`で指定されているアルゴリズムを利用して暗号鍵によって暗号化
4. 暗号化したシグニチャをBase64URLでエンコード
5. 各エンコードした値を`.`で繋ぐ
```

ちなみにヘッダの`alg`は必須です。

`alg`は暗号化を行う際のアルゴリズムを指定しており、

これがないとどのアルゴリズム利用して暗号化されたかわからず検証することができません。

### 検証の流れ

検証の流れはJWS生成の逆を行うことでできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629084/10a9261d-b939-3a8c-ce14-39b1d9d9eb39.png)
引用：[基本から理解するJWTとJWT認証の仕組み
](https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/)

流れとしては下記です。

```txt
1. JWSのシグニチャ部分をBase64URLでデコードする
2. デコードしたものを暗号鍵で復号化
3. 復号化したものとJWS内のヘッダとJWTを比較し検証
```

# まとめ

いかがだったでしょうか。

今回調べたことで`JWT`と`認証`がごっちゃになっていたのが解決しました。

次はJWTを利用した認証機構について調べたいと思います。

最後まで読んでいただきありがとうございました！

# 参考

https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/
RPO（目標復旧時点）とRTO（目標復旧時間）

# 【目的】
バックアップを正しく行うための基礎的な知識を身につける。
バックアップの重要性だけでなく、具体的なバックアップ方法を理解する。
RPOとRTOの理解を深める。

# バックアップの重要性
デジタルデータはほんの小さなミスや障害によって、一瞬にして喪失してしまう可能性がある。
例）
・うっかりデータを消してしまったり、間違ったデータを上書きしてしまうというオペレーションミス
・データを保存しているストレージやファイルサーバーといったハードウェアの障害
・データを暗号化して人質にとる「ランサムウェア」による被害
等

こういった万が一のデータ喪失に備えて、バックアップ（データのコピー）を取っておく必要がある。

# バックアップの指標となるRPO/RTO
まず、バックアップに求められる要件を明確にする。

・どのデータを
・どのような手段で
・どのくらいの頻度で
・どのくらいの期間
保存する必要があるかを定義する。

バックアップ手法やコスト、復旧までにかかる時間などを踏まえて要件を明確にしていくための判断材料が「RPOとRTO」である。


# RPO(Recovery Point Objective)
RPOは「目標復旧時点」。
障害が発生した際に、システムを過去のどの時点まで復元するかを定めた目標値を「RPO」と呼び、日・時・分・秒といった単位で表す。
データ更新頻度とバックアップにかかるコストの双方を考慮して決定する必要がある。

【ポイント】
・RPOを短くすることで、障害時に喪失するデータを少なくすることができる。
　※RPOが1秒だった場合は、1秒までまでのデータ復旧できることを意味する。
・1日に1回しか更新されないデータでとリアルタイムに更新され続けるデータでは、求められるRPOが異なってくる。

【バックアップとコストの関係】
30秒単位の頻度でのバックアップ・・・コスト大。データ喪失リスク低。（30秒分のデータ喪失リスク）
1日1回のバックアップ・・・コスト小。データ喪失リスク大。（２４時間分のデータ喪失リスク）

# RTO(Recovery Time Objective)
RTOは「目標復旧時間」。
システムが復旧までにかかる時間の目標値であり、RPOと同様に日・時・分・秒といった単位で表す。

【ポイント】
停止時間に基づく影響を理解する。
RTOを短くするほど、システムを短時間で復旧できる。
　→RTOを短くするためには、バックアップの取得のみではなく、”システムを冗長化して待機”させておき、ダウンタイムを短くするなどの工夫も必要となる。

# RPOとRTOの決定方法
・対象システムの経過時間によるビジネスインパクト
・企業のBPC(Business Continuity Plan、事業継続計画)
・ビジネスの規模に合わせた最適な値を探る。
OSI参照モデルとTCP/IPモデルについて

ネットワークの勉強をしています。これらについて２つの質問があります。

質問①
例えばプログラムを書く時なんかにもあるあるだと思うのですが、処理1～10を実行したい時、
関数Aに処理1～3を持たせて、
関数Bに処理4～6を持たせて、
関数Cに処理7～10を持たせる。

とするか、あるいは、

関数Aに処理1～5を持たせて、
関数Bに処理6～10を持たせる。

とするかなど、区分の仕方に迷うことがあるかと思います。OSIとTCP/IPもそういった違いに過ぎないのでしょうか？
つまり、どちらの場合も結局は処理1～10をやっていること自体は変わらないという認識でいいのでしょうか？




質問②
L7～L1でそれぞれ何かしらの役割（機能）を担っているというお話ですが、通信をする際、それらの機能は必ずL7～L1の順に
実行されていると考えていいのでしょうか？（往路の場合です。復路はその逆？）
単純にモデル図などを使った説明ではそんな風に見えてしまうのですが、実際どうなのでしょう？
仮置き

Ubuntuの共有フォルダの設定(Serverの場合)

https://turningp.jp/virtualization/virtual_box/manual-mount

# Laravel 9でログインフォームを作る

https://readouble.com/laravel/9.x/ja/authentication.html



## 先にlaravel/Breezeをインストール
下記記事からBreezeをインストールしてログインフォームを作成する。

https://readouble.com/laravel/9.x/ja/starter-kits.html


### エラー対処諸々
#### Laravel9をcomposerでインストールするときに必要なPHPのライブラリ(多分ほかにもある)
* php-xml
* php-curl
* php-mbstring
* php-cli

#### SQLサーバの設定をプロジェクト内の.envファイルに反映させる(今回はMySQLを使用した)
```configuration:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=データベース名    <-ここ
DB_USERNAME=root
DB_PASSWORD=パスワード       <-ここ
```

#### Vite manifest not found
Node.jsのバージョンを調節
apt installだとv12.*あたりがデフォルトでインストールされるけど
php artisan breeze:installを実行したときにnpm WARNで14.18.0以上を使えと警告が表示される。
nvmを使用してバージョンを変更する。

https://github.com/nvm-sh/nvm

npm run devでエラー：vite.jsでawaitが予期されない予約語ですみたいなエラーが出てたけどnvmでバージョン変えたら出なくなった。
【Python3】【Flask】flask migrate時にPostgreSQLでのカレントスキーマを指定する。

# JDBC URLの-cオプションでカレントスキーマを指定する
- FlaskアプリでPostgreSQLを構築
- `flask migrate`, `flask upgrade` でモデルをDBに反映する際に、publicスキーマにCREATE TABLEされてしまう。    
- JDBC URL のoptionでコマンド実行時セッションのカレントスキーマを変更する。

```
SQLALCHEMY_DATABASE_URI='postgresql://localhost:5432/test?user=postgres&password=password&options=-c%20search_path=test_schema'
```

参考:

https://stackoverflow.com/questions/70054746/how-to-set-the-postgresql-databases-schema-name-in-a-flask-session


https://jdbc.postgresql.org/documentation/use/


https://www.postgresql.org/docs/current/runtime-config-client.html
AWS ALL Certifications Engineersになるには

# 内容
[インフラ技術基礎勉強会 #1](https://infra365.connpass.com/event/272976/)で発表させて頂きました。要点だけ記載します。

https://speakerdeck.com/toru_kubota/aws-all-certifications-engineersninaruniha

# AWS ALL Certifications Engineersとは
[2023 AWS ALL Certifications Engineers クライテリアのお知らせ](https://aws.amazon.com/jp/blogs/psa/2023-aws-all-certifications-engineers/)に記載がある通り、APN参加企業のエンジニア向けの表彰プログラムとなっており、ざっくりいうと下記条件を満たすことで認定されます。（詳細は公式ブログを参照ください。）

* AWSの資格を全部取る
* 会社のパートナーティアが一定以上
* 申請する

# 勉強方法
過去に[1週間で「SAP on AWS - Specialty」を取得したのでポイントと勉強方法をまとめる](https://qiita.com/tkubota/items/6e5389ff2817171c2529)や[AWS認定資格11冠の勉強方法と振り返り](https://qiita.com/tkubota/items/b9f005ed86475524c88f)の記事を書いておりますのでそちらを参照ください。

# 受験について
10年以上前からピアソンやプロメトリックで色々試験を受けていますが、英検や情報処理試験など色々な試験がCBT化されたため、昔に比べると試験会場が混んでいる印象があります。オンラインでも何回か受けましたが、この時「試験監督の言語」を「英語」にすると今日、明日でも空いている時があるよ！

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/ca9341b7-1a92-4cf3-f2b2-d3c38be85689.png)

# パートナーパス
色々とあるパートナーの種類のことです。対象となっているのがソフトウェアパスとサービスパスです。ソフトウェアパスはAWS上で動作するソフトウェアを開発する組織が認定されるものです。FTRというプログラムがあり、概ねWell-Architectedに沿ってレビューが行われ、AWSから認定されるような流れです。サービスパスは付加価値をつけて再販を行うパートナーなのでSI企業はここが多いです。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5aedd303-a535-ffad-3d5a-9c30f7b3b650.png)

# パートナーティア
サービスパスのパートナーティアを例にします。パートナーのランクのことで最初はレジスタードから始まります。ここで案件数、金額、資格取得者数などある一定の条件も満たし申請することで次のセレクトに上がることが出来ます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/06119313-bddf-cd40-e8c5-426a5bac428d.png)

# まとめ
* まずAWS資格を全部とりましょう
* 会社がとのパートナーパスでどのランクか確認しましょう
Display Logicを使うことができない


この機能には毎回泣かされます。

+ [手順 2 の分岐ロジックの手順では、ページ分岐アイコンをクリックします。ないよ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FRqqk)

分岐アイコンは次の場所にあると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/18786d4a-7774-b666-5e16-9cc5bc1c588d.png)

 

+ [Survey Page branching logic not saving](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Dy9PnSAJ)

:::note
The issue was the Create Rule button!  I didn't realize you need to click it to actually create a rule.  I assumed it was it you wanted an additional rule besides the one you just entered.  So, it's resolved. 
:::

先に１のところのボタンを押してから保存しないと、この内容は次に開いても消えている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fb6b930b-92a3-a3cd-2d61-52ea839462b3.png)

+ [Display logic is greyed out in Survey challenge](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000O72pHSAR)

どんなに上記のように設定しても、Display Logicを使うことができない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0d5ba1d3-07a3-255f-e9ff-453192cf5cad.png)

これを見るとグレイアウトしてない。何で？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e95561b5-c11f-16f6-1675-bea265f06ff2.png)

以下の通りやっても設定できないな。
+ [How to Create a Survey](https://www.emizentech.com/blog/salesforce-surveys-configuration.html)

# 関連する質問

+ [Trailhead アンケートの基本](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A95d4SAB)


# Display Logicが表示されない

+ [「インストールでうまくいかなかった点を教えてください」の上に「表示ロジック」が表示されないのはなぜですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Dxmu5SAB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dec821f1-01cc-f2ff-e2b8-f0bfb4737051.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e425c360-14c3-c1e1-c1d8-62f7ff435934.png)


:::note
アンケートのアクティブなバージョンを編集していますか?

そうであれば、表示ロジックを編集することはできません。

調整するには、...を押して「新しいバージョンを作成」を選択して、アンケートの新しいバージョンを作成する必要があります。
:::
【個人開発】Webで水見式をやりたい(Preact, p5.js, handsfree.js)

株式会社mofmofのkomaです。

mofmofでは、毎週水曜日に「水曜日の個人開発」というイベントを行なっています。
この記事では、そのイベントで作っている「**[Web水見式(β)](https://kmkkiii.github.io/water-divination/)**」を紹介します。

:::note info
このプロダクトは、株式会社mofmofの「水曜日の個人開発」にサポートされています。
:::
https://indie-dev.mof-mof.co.jp

# Webで水見式？

![スクリーンショット 2023-02-23 3.10.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317957/7a5dc83b-aff4-2730-1fc0-f1125375ff27.png)

水見式とは、HUNTER×HUNTERという漫画の中に出てくる”念”という能力の系統を判定する方法です。

Web上でハンドトラッキングを活用して、さらに最近気になっていたp5.jsを使ったクリエイティブコーディングなどを組み合わせて水見式の判定結果を表現できたら面白いのでは？と思い、作ることにしました。

ハンター文字で表示されていますが、カーソルを当てるとひらがなで表示されます(読みづらい)。

https://kmkkiii.github.io/water-divination/

# 何で作っているか

- Preact
- Vite
- p5.js
- handsfree.js
- GitHub Pages
- GitHub Actions

このアプリの肝となるハンドトラッキングとp5.jsによる描画は、以下の記事を参考に作っています。

http://blog.livedoor.jp/reona396/archives/55878878.html

https://qiita.com/youtoy/items/70571c7066d41729c2bd

ハンター文字のフォントは以下のサイトからダウンロードして使わせてもらっています。

https://half-a.net/sozai-page4

# もっとこうしたいと思っている点

#### ジェスチャーの認識精度の向上

登録したジェスチャーをトリガーとして判定を行うようになっていますが、ジェスチャーがうまく認識されない場合があります。

#### 判定結果によってインタラクティブなエフェクトをcanvasに描画する

こんな感じ↓のイメージで系統ごとにインタラクティブなエフェクトを鋭意作成中。

https://openprocessing.org/sketch/1252955

#### 判定結果をユーザーごとに保存する

毎回ランダムな判定結果でも良いのですが、作中では本来その人の性質によって決定されるものなので、一度判定した結果は保存しておきたいですね(社内フィードバックより)。

# 最後に

このイベントが始まって2ヶ月という区切りを迎えたので、β版として公開しました！
よかったら遊んでみてください〜(下の方で水見式のジェスチャーをすると認識されやすいです！)

https://kmkkiii.github.io/water-divination/
AtCoder ABC290 C問題 詳解

# はじめに
**問題**
$数列Xに対しmを以下のように定める。$
- $Xは0 \leq x \lt m (m \in \mathbb{Z})を満たす全ての整数xを含む。$
- $Xはmを含まない。$

$このとき、A=A_{1}, \dots, A_{N} (0 \leq A_{i}), B=B_{1}, \dots, B_{K} (B_{i} \in A)におけるmの最大値を求めよ。$

**問題の意味**
$A$から$K$項を選んだ$B$に対して、$m$は$B$における$0$から始まる連続数列の項数を表します。
$A=7, 1, 2, 0, 5, 4$で$K=4$の場合、$m$の最大値は$B=0, 1, 2, \lbrace 4, 5, 7 \rbrace$における$3$となります。

# 詳解
**総当たりの場合**
計算量は$\mathcal{O}({}_N C_K)=\mathcal{O}(N!)$なので`TLE`となります。

**アルゴリズム**
$m$の最大値は$A$における連続数列の項数に一致するので、次のアルゴリズムが考えられます。
1. $A$に$i$が含まれないならば$m=i$として終了
2. $i=K-1$まで1を実行

計算量は$\mathcal{O}(N)$なので`TLE`になりません。

# Javaによる実装と動作例
**実装**
```
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in); 
        int N = s.nextInt();
        int K = s.nextInt();
        HashSet<Integer> A = new HashSet<>();
        int m = 0;
        for(int i = 0; i < N; i++) A.add(s.nextInt());
        for(; m < K; m++) if(!A.contains(m)) break;
        System.out.println(m);
    }
}
```
**動作例**
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627757/e931f2ea-10b2-d8df-a525-a6bf24d94b78.png)

# 参照
- [C - Max MEX](https://atcoder.jp/contests/abc290/tasks/abc290_c)
インフラ技術基礎勉強会を開催してみて

# 内容

本日[インフラ技術基礎勉強会 #1](https://infra365.connpass.com/event/272976/)を開催しました。多くの方に参加いただき大変ありがとうございます。本勉強会ですが、下記の目的のため、主催を行いました。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/f7789c1e-ebf7-9701-e177-bd7226ede7f7.png)

# インフラの基本的な技術力の向上
今でこそ、業務経験が長くなり少しは技術的なことも分かるようになりましたが、私は元々文系出身でITの知識がほとんどない状態でこの業界に就職したため、若いときは分からないことが多く、今思えば前向きに仕事に取り組めていなかったと思っています。分からないことに遭遇すると不安になったり、そもそも仕事が面白くなかったです。仕事に前向きに取り組めるようになったのは、ある一定の基礎レベルを超えた時からだと思っています。基礎技術を習得することでトラブルシューティングなどの応用が出来たり、AWSなど最近の技術に入っていく時もスムーズに入っていくことが出来ました。そのため、人に分かりやすく説明出来るくらい、基礎的な技術を習得することが重要だと思っています。難し問題や最新技術もここが分かっていると応用することが出来て仕事も面白くなります。

# これから発表したい人に第一歩を踏み出せる場所を作ること
アウトプットを繰り返すことによって、自分の重要だと思っている考えや芯にしている部分をだんだん作っていくことが出来ます。仕事でも判断や意見を求められる立場になると、自分の芯としている考えを中心に発言し意思決定する必要があります。ここがないと発言の内容がぶれたりしてしまうため重要です。このような理由からアウトプットは重要だと考えますが、今までLTで発表したことがない人がいきなりLTに申し込むのはハードルが高いです。気軽にLTに応募出来る勉強会を作りたかったのが今回主催した勉強会の背景でもあります。

# LT内容
初回ということでDNSやVPNなど基礎的なネットワークのキーワードを題材として、それをAWSで実装するとどのように便利になるか等の視点も取り入れました。また、パワーポイントのスライドを使用したプレゼン方式だけではなく動画を作成してプレゼンする方法も取り入れました。資料は[インフラ技術基礎勉強会](https://infra365.connpass.com/)にアップロードします。また```AWS ALL Certifications Engineersになるには```は別で記事を書こうかと思います。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/552b9783-f6cb-f64b-179d-97a0d5655100.png)

# 次回
次回の勉強会情報を公開しました。

https://infra365.connpass.com/event/276315/


ぜひ[インフラ技術勉強会](https://infra365.connpass.com/)のグループメンバー登録や、LTしたい方はこちらの[フォーム](https://docs.google.com/forms/d/e/1FAIpQLScItKgyj_H0aL3LslVAlVO-N7epndcBmm4PkF4IIF5YWpPQXw/viewform)から応募をお願いします！
XRP Ledgerの準備金

XRP Ledgerには **スパムなどの悪意ある行為から守り、低い手数料で利用するための仕組み** として準備金が存在します。
例えば誰も保有を望まない何万ものNFTが台帳へ存在することはノードへ不要な負担を強いることになりますが、NFTの保有に対して準備金を設定することで、所有者に対してNFTを **台帳から削除させるインセンティブ** を発生させます。

https://xrpl.org/ja/reserves.html

準備金は次の2種類存在し、準備金の量(XRP)はバリデータの投票により決定されます。

## 基本準備金(Base Reserve)

アカウントアドレスを使用するために必要な準備金です。アカウントがトランザクションを送信するためには少なくともこの準備金分のXRPを保有しておかなければなりません。
執筆時点では **10XRP** となっており、[アカウントの削除](https://xrpl.org/ja/accounts.html#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E5%89%8A%E9%99%A4)でのみ基本準備金を取り戻すことができます。
基本準備金を取り戻す際に、その内の一部(2XRP)は償却されます。これはアカウントの作成→削除によるスパムを防ぐためです。

## 所有者準備金(Owner Reserve)

XRP Ledgerにはいくつかの種類のオブジェクトが存在し、アカウントがこのオブジェクトを保有/利用するために必要な準備金です。
オブジェクト毎に準備金が必要となり、執筆時点では1オブジェクトあたり **2XRP** です。

準備金が課されるオブジェクトは次のようなものが存在します。

- Check (小切手)
- Deposit Preauth (事前の入金承認)
- Escrow (エスクロー)
- NFT Offer (NFTの購入/売却オファー)
- NFT Page (NFTを格納するページ)
- Offer (取引オファー)
- Payment Channel (ペイメントチャネル)
- Signer List (マルチシグのアカウントリスト)
- Ticket (アカウントのシーケンス番号の確保)
- TrustLine (トークン保有(正式なオブジェクト名はRippleState))

オブジェクトそれぞれに対応するトランザクション(OfferCancelなど)を通じてオブジェクトを削除することで所有者準備金を取り戻すことができます。

### 特殊なケース

上記の所有者準備金の対象となるオブジェクトのうちTrustLineはXRP Ledgerにおいて特殊で強力な機能であるため、最初の2つのTrustLineオブジェクトには準備金を課さないようになっています。

厳密にはアカウントのオブジェクトの総数が2つ以下の場合、その内のTrustlineオブジェクトについては準備金が課されません。

例えば、

- 2つのTrustLineオブジェクトのみの場合、所有者準備金は0XRP
- OfferオブジェクトとTrustlineオブジェクトの2つのみの場合の所有者準備金は2XRP

となります。

アカウントのオブジェクト数が3以上となった場合は、準備金が課されていなかったTrustlineオブジェクトを含む全てのオブジェクトに対して準備金が課されるようになります。

## 手数料としての利用

アカウントの準備金はトランザクション手数料として使用することが可能です。
例えばアカウントがちょうど10XRPを保有しその全額が基本準備金である場合でも、トランザクション手数料としてのみXRPを使用するトランザクションは送信可能です。XRPを送信するPaymentトランザクションや、Offerの作成などの所有者準備金を増やすようなトランザクションは送信できません。

## 手数料投票

基本準備金と所有者準備金はそれぞれ固定された額ではなく、バリデータの投票により調整されます。
投票が有効化されるには **80%を超えるバリデータの賛成票** が必要となっています。

直近では2021年に基本準備金が20XRPから10XRPへ、所有者準備金が5XRPから2XRPへ調整されました。

現在の投票状況は次のサイトで確認できます。

https://xrpscan.com/validators

## まとめ

準備金はXRP Ledgerをスパムから守り、ノードが必要とする容量を抑え、長期的に健全に運用していくために必要な仕組みです。
これにより、トランザクション手数料としてXRPを多量に消費することなく、DEX取引やNFTの発行・取引などさまざまなトランザクションの実行を可能にします。

XRP Ledgerに興味がある方は開発者Discordチャンネルへ是非お越しください！
日本語チャンネルもありますので、英語が出来なくても大丈夫です！

https://discord.gg/aBH9MwcsbR
CDNとは？

## はじめに
以下の記事を読んでみて、「CDNとはなに？」という状態になったので調べてみました。

## CDNとは
> Content Delivery Network（コンテンツ デリバリー ネットワーク）を省略した言葉

要するに、クライアントとサーバーの間に挟まれた「中継の役割をするサーバー」のことらしい。

https://www.stream.co.jp/blog/blogpost-41362/

## CDNを使用するメリット
> ・ファイルを高速で配信できる。(国際配信の場合)
> ・安定したファイルの配信が継続できる。
> ・配信コストが削減できる

AWSについての本を読んだことがあるが、CDNと同じような仕組みを使用してサーバーを管理ていた記憶がある。

## CDNの仕組み
仕組みについては下記の2記事がとてもわかりやすかったので、そちらをざっと目を通してみるとすんなり頭に入ってくる。

https://qiita.com/sakashin10291029/items/2427ed57673afe6e286b

https://qiita.com/hiSirius/items/07cda3835f2521acbde2

## さいごに
CDNは駅伝。
Microsoft Azure: Apple Silicon から Python で SQLDatabase へ接続する

Apple Silicon から Python で Azure SQLDatabase へ接続する場合、 2023年現在、ちょっと面倒な手続きが必要なので簡単にまとめた。

## Environment

* OS: macOS Monterey Version 12.6
* Chip: Apple M1 Pro
* Python 3.10.9

## セットアップ手順

### Install unixodbc

```zsh
% brew install unixodbc
```

### Install ODBC Driver

Microsoft のページに書いてあるように ODBC をインストールする。

```zsh
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
% brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
% brew update
% HOMEBREW_ACCEPT_EULA=Y brew install msodbcsql18 mssql-tools18
```

(参考: [Install the Microsoft ODBC driver for SQL Server (macOS) - Microsoft ODBC 18](https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16#microsoft-odbc-18))

ini の設定もしておく。

```zsh
% sudo ln -s /usr/local/etc/odbcinst.ini /etc/odbcinst.ini
% sudo ln -s /usr/local/etc/odbc.ini /etc/odbc.ini
```

(参考: [Install the Microsoft ODBC driver for SQL Server (macOS) - Troubleshooting](https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16#troubleshooting))

### Install pyodbc

ここがやや面倒なところで、単純に `pip3 install pyodbc` とやっても `pyodbc` がインポートできずにプログラムが終了する。 そのときのエラーは記事の下の方に記載している。

```zsh
% pip3 install --no-cache-dir --no-binary :all: pyodbc
```

私の環境ではこれにより pyodbc 4.0.35 がインストールされた。
(2023-06-23 時点で、 最新のもの 4.0.39 だとうまくインストールできなかったというフィードバックがあった。)

## 接続テスト

```python
import pyodbc

server = 'tcp:xxxxx.database.windows.net'
database = 'xxxxx'
username = 'xxxxx'
password = 'xxxxx'

conn = pyodbc.connect(
    'DRIVER={ODBC Driver 18 for SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password)
cursor = conn.cursor()
cursor.execute("SELECT * FROM table")
for row in cursor:
    print(row)
conn.close()
```

## エラーの例

pyodbc をインポートできなかった場合は、下のようなエラーが出る。

```
Traceback (most recent call last):
  File "/Users/otsukakenji/tools/util.py", line 2, in <module>
    import pyodbc
ImportError: dlopen(/opt/homebrew/lib/python3.10/site-packages/pyodbc.cpython-310-darwin.so, 0x0002): symbol not found in flat namespace (_SQLAllocHandle)
```
AJaxとHTTPSとGithub Pagesの罠にハマった件

# はじめに

jQueryを使ってサーバに置かれてるディレクトリのファイル一覧を取得しようとしてハマったのですが、検索しても初心者向けみたいな役に立たないものしか出てこなくて、最終的に自力解決したのでメモを残しておきます。

# やろうとしたこと

下記のようなディレクトリ構成で、`index.html`にA,B,Cを並べてみせる。ファイルが増減したら自動追従させたいというのがミソ。

```
topdir
    |--index.html
    |--contents/
              |--A.html
              |--B.html
              |--C.html
              |--images/
                  :
```

# jQueryでやる

ざっくりこんな感じ。AJaxを使ってディレクトリリストのHTMLを拾い、そこからアンカー要素を引っこ抜いて追加しています。

```javascript
$(function() {
  $.ajax({
      url: "contents/",
      success: function(data) {
        $(data).find('a').attr('href', function(i, val) {
          if (val !== "images/") {
            $(body).append("<iframe src=\"contents/" + val + "\"></iframe>");
          }
        });
  }});
});
```
# ローカルマシンで試す

HTTPサーバを立ち上げて

```shell-session
$ python -m SimpleHTTPServer 8080
```
`localhost:8080`にWebブラウザでアクセス。

OKできました。

# Github Pagesに置いてみる

一式置いて、試してみました。

**真っ白。**

あれー?

# コンソールを開いてみる

エラーが出てました。

```
Mixed Content: The page at 'https://(省略)/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://(省略)/contents/'. This request has been blocked; the content must be served over HTTPS.
```

えっなんで? どこにも`http`って指定してないよ? Github PagesはHTTPSだから、相対URLだって`https://`のはずなのに。

検索しても「HTMLの中で`http://`って書いてるよね、`https://`に修正して。あるいは書かずに相対URLで」みたいなのしか出てきません。こっちは最初から相対URLでやってるんですけど。ぐぬぬ。

# いろいろ調べてわかった結果

1. Github Pagesには、自動ディレクトリリスティング機能がない
2. そのため https://(省略)/contents/ にアクセスしても404 Not Found
3. **Ajaxは、HTTPSで404だとHTTPに読み替えてアクセスしようとする**
4. Webブラウザ(Google Chrome)はHTTPSとHTTPの混成とみなしてエラーで止まる

ということでした。

# どう解決したか

とりあえず`contents/index.html`を置きました。

```html:contents/index.html
<html>
<body>
<ul>
<li><a href="A.html">A.html</a></li>
<li><a href="B.html">B.html</a></li>
<li><a href="C.html">C.html</a></li>
</ul>
</body>
</html>
```

サーバ側で自動生成できればいいのですが。

無事動きました。ローカルとGithub Pagesで記述を分けるようなこともなく、解決です。

# おわりに

Ajaxの「HTTPSがだめならHTTPで」という挙動、抑制する方法あったりしますか? ご存知の方いらっしゃいましたらご教示ください。何時間無駄にしたか、、、
Android Studioで、Name shadowedと警告されたら

Android Studioにて、変更をコミットしたら`Name shadowed: ...`と表示された。

```shell
Warning:(26, 94) Name shadowed: content
```

該当のコードは次のようなコードだった。

```kotlin
@Composable
fun ExampleComposable(
    ...
    background: @Composable (route: String?, content: @Composable () -> Unit) -> Unit = { _, content -> content() },
    content: @Composable (
      ...
    ) -> Unit,
) {
  ...
}
```

原因は、`ExampleComposable()`に渡される`content`という引数名と、もう一つの引数の`background()`の中で使われている`content`が同じ名前だったことが原因だった。

そもそも`Shadowed`とは、内側のスコープにある変数やシンボルが外側のスコープにある変数やシンボルを隠してしまうことを意味している。

この場合、`background()`の中で使われている`content`が外側のスコープにある`content`を隠してしまっているので、`Name shadowed`という警告が出ていたようだ。

なので、`background()`の中で使われている`content`を`backgroundContent`という名前に変更することで、警告が消えた。

```kotlin
@Composable
fun ExampleComposable(
    ...
    background: @Composable (route: String?, backgroundContent: @Composable () -> Unit) -> Unit = { _, backgroundContent -> backgroundContent() },
    content: @Composable (
      ...
    ) -> Unit,
) {
  ...
}
```
DynamoDBのPartiQLでSQLインジェクションを防ぐ

# はじめに

DynamoDBのPartiQL、みなさん使ってますか？とても便利ですよね！
便利ではありますが、SQLを使う以上は「SQLインジェクション」に気をつけなければいけません。

例えば普通のRDBに対してプログラミング言語からSQLを発行する際、
こんな風に書くとSQLインジェクションの危険性があるので、

```js:danger.js
await client.query(`INSERT INTO users(name, email) VALUES(${name}, ${email})`);
```
以下のようにParameterized Query（パラメータ化されたクエリ）を使いましょう
というのはセキュリティの定番ネタです。

```js:safety.js
await client.query('INSERT INTO users(name, email) VALUES($1, $2)', [name, email]);
```

参考: node-postgres(pg)の場合

https://node-postgres.com/features/queries#parameterized-query

DynamoDBのPartiQLでもParameterized Queryを使うべきなのですが、
RDBに比べて情報が少なめなので、簡単ですが日本語記事として書いておきます。

# やり方

悪い例。
ついこう書いてしまいそうですが、SQLインジェクションされる危険性があります！

```js:danger.js
await ddbClient.executeStatement({
  Statement: `
  INSERT INTO "example"
    value {
      'pk': 'user:01231',
      'sk': 'profile',
      'sk1': ${Date.now()},
      'name': 'Marco'
    }
`,
})
```


良い例。
`Statement`のクエリ内に`?`を書いておいて、
`Parameters`というプロパティで変数を渡せばOK！

```js:danger.js
await ddbClient.executeStatement({
  Statement: `
  INSERT INTO "example"
    value {
      'pk': ?,
      'sk': ?,
      'sk1': ?,
      'name': ?
    }
`,
  Parameters: [{ S: 'user:1234' }, { S: 'profile' }, { N: Date.now().toString() }, { S: 'Marco' }],
})
```

DynamoDB特有のAttributeValueというフォーマットで、
文字列なら`S`、数値なら`N`みたいに型情報を含める必要があります。

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html

# 参考サイト

この英語サイトのコードを一部そのまま使わせてもらいました。感謝！
他にもいろんな例が載ってるので、ぜひ読んでみてください。

https://adieuadieu.medium.com/how-to-use-partiql-with-dynamodb-in-node-js-ac2f6c8f856b

自分でQiita記事を書いたあとに改めて探したら、公式ドキュメントにもちゃんと載っていましたw

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/example_dynamodb_ExecuteStatement_section.html

ではみなさま、安全で素敵なDynamoDBライフを！
any/interface{}型のSliceを分割したい

# どんな状況？
たとえば以下のようなCreateRecords()という関数があるとして、その返り値は**なんらかの構造体Tを要素に持つSliceが実体**のanyです。gormのCreateにそのまま渡すことができ、実行することでレコードがインサートされるものとします。
```
func CreateRecords() any {
  (実装は省略)
}

c:=CreateRecords()
if r:=db.Create(c); r.Error!=nil {
  (エラー処理)
}
```
db(ここでは*gorm.DBのこと)はOpenでどのデータベースのドライバーを使うかによって挙動が変わる可能性があり、今回はsqliteを使ったところCreateRecords()が返す要素数が多すぎて1度にINSERTするクエリが発行できないといった問題が発生しました。  
cに含まれている要素数を絞って(*gorm.DB).Create(any)をコールすればよさそうなものの、CreateRecords()側の実装は変えたくありません(あるいはブラックボックスで変えようがないかもしれません)。加えてCreateRecords()がどんな構造体を要素に持つSliceを返すかは、実行するまでわかりません。
# 解答：reflectionを使う
すぐにピンと来るとは思いますが、やっぱりreflectionです。ただしもともとのcが**なんらかの構造体Tを要素に持つSliceが実体**のany([]T)であるということに注意する必要があります。
```
c:=CreateRecords()
if v:=reflect.ValueOf(c); len:=v.Len(); len>0 {
  for i:=0; ; i++ {
    // 例えば100レコードで分割
    begin:=i*100
    end:=(i+1)*100
    if end>=len {
      end=len
    }
    pv=v.Slice(begin,end).Interface()
    if r:=db.Create(pv); r.Error!=nil {
      log.Fatal("途中で処理とまったでー")  // エラーが起きたことだけ分かればヨシと言う雑な例
    }

    if end==len {
      break
    }
  }
}
```
`reflect.Value`に対して`Slice(n,m)`を呼ぶことで`someSlice[n:m]`と同等のオペレーションが実現出来ます。ここでの返り値はSliceではなくreflect.Valueになるため、最後に`Interface()`を呼んでany([]T)へと変換しています。  
# 注意
サンプルなので雑に書いてますが、分割して流す場合は途中で止まる可能性を考慮しましょう。今回の想定では途中で止まっても問題ない(そうなった場合はエラーを通知した上で、データを消して1から再実行しても大丈夫な用途でしか使わない)ことを前提にしています。  
途中で止まってしまったら困るような処理の場合は、それ用の対策をちゃんと入れましょう。
【Solidity】(tips)配列において指定の数字を削除する

配列において指定の数字を削除する方法を下記します。
solidityにでは、配列の削除に関してdeleteを使用すると0になるのみです。
なので、完全に数字を削除するためには、工夫が必要です。
具体的にはremove関数で実装しています。
remove関数の中身は、削除したい指定した番号を、次の番号に置き換え、popで最後の配列の数字を削除しています。
例えばremove関数に2を引数として渡した場合numbersの中身は、
[1,2,3,4,5,6]
→[1,2,4,5,6,6]　※2番目の数字以降を次の数字に置き換える
→[1,2,4,5,6]　※popで最後の数字を削除する

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Sample{
    uint[] public numbers = [1,2,3,4,5,6];

    function getNumbers()public view returns(uint[] memory){
        return numbers;
    }

    function getNumberLen()public view returns(uint){
        return numbers.length;
    }
    
    function deleteNumber(uint _index)public {
        delete numbers[_index];
    }

    //
    function remove(uint _index) public {
        require(_index < numbers.length, "over length");

        for (uint i = _index; i < numbers.length - 1; i++) {
            numbers[i] = numbers[i + 1];
        }
        numbers.pop();
    }
}

```
サーバ CPU をアップグレードする際のTIPS

自宅でサーバなどを動かしている場合、運用状況などに応じて CPU の載せ替え（スペックアップ、アップグレード）を検討することが往々にあると思います。

当然、サーバにデフォルトで載っている CPU と同一ソケットのモデルであることは大前提として、サーバ（ベンダ）のカタログオプションで公式にアップグレード可能な CPU モデルは動くであろうこと ... はよいのですが、そのほかのモデルについてはちゃんと動くのかハッキリわからないことが多々あります。

必ずしもカタログアップデート可能なモデルが自分の要望に合ったものとも限らないので、そのほかモデルが適合するか確認する術を備忘録として控えておきます。

## CPU-Upgrade を確認する
[CPU-Upgrade](https://www.cpu-upgrade.com/index.html) というサイトにて、アップグレードの可能性について確認することができます。

"Search for CPU" に現在使用している（あるいはサーバ標準搭載の）CPU モデルを入力し、CPU specifications ページを開くと、その CPU と同じソケットやコアを持つ CPU の一覧 および Upgrade
Chance（= アップグレードできる確率）が記載されたマトリクスが表示されます。

例えば [Xeon E5-1630 v4](https://www.cpu-upgrade.com/CPUs/Intel/Xeon/E5-1630_v4.html) のページを開くと Xeon E5-2690 v4 の Upgrade Chance は 100% になっているので、載せ替えても動く可能性が極めて高い、と判断できます。
＃逆に言えば、この数値が 0% に近い数値なら載せ替えは危険ということです

なお、"Upgrade Chance" は
> This number is calculated as a percentage of all motherboards, compatible with both original and upgrade CPUs

と説明されています。
つまり上記の例で言えば 、このサイトで有しているマザーボードの互換データでは Xeon E5-1630 v4 をサポートしているマザーボードはすべて Xeon E5-2690 v4 もサポートしている（なのであなたの手元のマザーボードも同様にサポートしているでしょう）、ということです。
公式的な可否ではなく、あくまで傾向であるという点に注意が必要です。



## 動作実績を調べる
「サーバモデル ＋ CPU モデル」などでググるのが初歩的ではありますが、[UserBenchmark](https://www.userbenchmark.com/) というサイトで調べる方法がおすすめです。
こちらのサイトにはサーバモデルごとに実際の動作環境とそのベンチマーク結果がアップロードされており、その数もかなり豊富。

ただし海外サイトなので、日本メーカー（NEC など）のサーバモデルはややサンプル数が少ない傾向があるので注意が必要です。
SORACOM Krypton を使った Azure IoT Hub のデバイスプロビジョニングを Python で書いてみた

# 作ったもの

SORACOM のセキュア・プロビジョニング・サービスの SORACOM Krypton が Azure IoT Hub をサポートするようになったので、azure-iot-sdk-python と組み合わせてみました。

https://github.com/nmikuni/soracom-krypton-azure-iot-example-python

## 使ってみた

今回は Raspberry Pi と SORACOM Onyx LTE USB ドングルを使いました。

1. [公式ドキュメント](https://users.soracom.io/ja-jp/guides/usb-dongles/soracom-onyx/raspberrypi/) にしたがって Raspberry Pi と SORACOM Onyx LTE USB ドングルをセットアップします
2. [公式ドキュメント](https://users.soracom.io/ja-jp/docs/krypton/azure-iot-hub/) にしたがって SORACOM Krypton や Azure IoT Hub、Azure IoT DPS をセットアップします
3. リポジトリをクローンします
4. Raspberry Pi に pip や azure-iot-sdk-python をインストールします
5. `python send_data_to_azure.py` を実行します
6. Azure 側は [Azure Cloud Shell でデータの到達を確認します](https://users.soracom.io/ja-jp/docs/krypton/azure-iot-hub/#mqtt-%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6-iot-hub-%e3%81%ab%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e9%80%81%e4%bf%a1%e3%81%99%e3%82%8b)

## 使ってみての感想

Azure や SORACOM の設定は一苦労なのですが、デバイス側はやることが少なく、かつ認証情報を持たせる必要がなくなるので良いと思いました。

これからもっと azure-iot-sdk-python でできることを試してみたいです。サンプルもたくさんありますし。

https://github.com/Azure/azure-iot-sdk-python/tree/main/samples

また Python の書き方についてはちょっと自信がないので、気になったところなどあれば指摘をもらえると嬉しいです。
AWS Hands-on for Beginners AWS Step Functions 入門 - ビジュアルツールを使ってローコードにワークフローを作成する：学習メモ

## はじめに

AWSハンズオン for Beginnersシリーズとして提供されている「[Step Functions 入門 - ビジュアルツールを使ってローコードにワークフローを作成する](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-StepFunctions-2022-reg-event.html?trk=aws_introduction_page)」を実施した際のメモです。[前回の記事](2023-02-20_AWS_stepfunctions_48176578c1195f21f91d.md)でもStep Functionsに関するハンズオンを記載しました。そこではStep Functionと**Lambdaと連携**したり、**エラーハンドリング**、**Mapステート**を使用してステートマシンの連続実行などを体験することができました。今回のハンズオンでは前回使用しなかった機能(**Choiceステート, Parallelステート, Waitステート, 入出力の受け渡し**)を使ってより実践的なアプリケーションを作成します。

なお、「Step Functionsとは何か」「使用するとどんなメリットがあるか」「ユースケースは何か」についての説明は[前回の記事](2023-02-20_AWS_stepfunctions_48176578c1195f21f91d.md)をご覧ください。

## アジェンダ

1. 今回のハンズオンのシナリオ/構成の紹介 + AWS Step Functions の基本
2. ステートマシーンの作成 + 「アクション」を使ってみる
3. Input の受け取り + Choice ステートを使ってみる
4. Parallel ステートで処理を並列に実行する
5. Output の調整 + DB（Amazon DynamoDB）の更新
6. Parallel ステートのもう一方の実装 - テキストを音声化する
7. ステートで「タスクが終わるまで待つ」を実装する
8. 音声ファイルの出力先情報を DynamoDB テーブルに格納する
9. リソースの削除 + まとめ + Next Action 案

## はまったところ

**2.ステートマシーンの作成+「アクション」を使ってみる**で、APIパラメータ作成時「**Parameters.Key.Key : Value is mandatory.**」というエラーダイアログが表示され、エラーの修正をするか、そのまま続行するか聞かれました。

https://twitter.com/ksatou34276097/status/1562099391275880451?s=20&t=uUbnL7lxE2IOAYzf6-hQAA

APIパラメータに指定したJsonはデフォルトで入力されていたものです。また、ハンズオンで入力するものに変更しても同様の現象が発生しました。原因はわかりませんでしたが、以下のツイート内容の通り、エラーを無視して続行できるため、気にしないようにしました。

https://twitter.com/ksatou34276097/status/1562100093138120705?s=20&t=uUbnL7lxE2IOAYzf6-hQAA

## メモ

### APIパラメータ可変項目の参照指定

入力Jsonのキーに対応する値をステートマシンのアクションで使用したい場合、APIパラメータの値に「**$.**」をつけ、入力Jsonに対応するパスを指定します。また、Jsonパスを指定する場合、キー名の後ろに「**.$**」をつける必要もあります。例えば、ステートの入力となるJsonが **{"ArticleID":"0001"}** で、DynamoDBのGetItemアクションで入力の **"0001"** を使用する場合、APIパラメータは以下のように記述します。

```json
{
	"TableName": "Article",
	"Key": {
		"ArticleID": {
			"S.$": "$.ArticleID"
		}
	}
}
```

## ステート間で情報を共有する

ステート間で情報を共有する機能があります。例えば、アクションが2つ連続しているステートマシンがあり、1つ目のアクションのステップ入力を2つ目のアクションで参照したい時に使用します。アクションのステップ入力となったJsonをステップ出力に含めることができます。（アクションで「出力」を選択し、**Combine original input with result**を選択。出力Jsonを内包するキー名を入力する）

## Waitステートについて

本ハンズオンではテキスト読み上げ(音声化)サービスであるAmazon Pollyを使用します。Pollyの音声化は**非同期**に行われるため、Pollyが入力テキストを音声ファイルに変換する処理が完了する前に、ステートマシンが終了してしまう可能性があります。本ハンズオンではこの問題への対応として**Waitステート**を使用しています。Pollyの処理は音声化リクエスト毎に管理されており、処理の状態をステータスで表しています。例えば、処理中であればscheduled、処理が完了したらcompletedなどです。**Waitステート**でこのステータスを監視し、completedでなければ、指定したステートを再実行させるという設定が簡単にできます。

## ハンズオンの感想

AWSサービスを複数、並列に実行して結果を取得するという少し複雑なアプリケーションをGUI上で簡単に作成することができました。APIパラメータのJsonの書き方やステート間の情報共有機能については慣れる必要がありますが、意外に楽にできたのは驚きました。[前回](2023-02-20_AWS_stepfunctions_48176578c1195f21f91d.md)と今回のハンズオンでStep Functionsの機能をほとんど体験することができましたが、Lambdaとの連携がまだしっくりきていません。これについては本ハンズオンで紹介されていた別のハンズオンで腹落ちさせようと思います。
Railsのparamsとストロングパラメータ

# この記事の目的
現在学習中のRailsについての理解とアウトプット、振り返り用
Railsのparamsとストロングパラメータについて記載しています。

## paramsとは
paramsとはRailsで送られてきた値を受け取るためのメソッドになります。
送られてくる情報(リクエストパラメータ)は主に、getのクエリパラメータとPostでformを使って送信されるデータの2つです。

基本的には下記の記載で値を受け取ることができます。

```
params[:カラム名]
```

## ストロングパラメータとは
Mass Assignment脆弱性の対策として、開発者が指定したキーを持つパラメーターのみを受け取れるように制限するもの。
簡単にいうとフォームから入力された情報を指定して、安全に受け取るための仕組みです。設定しておくことにより不正な情報を受け取ることを防ぎます。

#### Mass Assignment脆弱性とは
悪意あるユーザーにより、Webブラウザ上において手作業などでパラメータを書き換えられ、開発者の意図しないデータの登録・更新（例えば、管理者を識別するためのカラム内データの改竄など）が行われてしまう脆弱性です。

## なぜ使う,何のために使う必要があるのか
投稿フォームに入力された情報はparamsによって取得できるのですが、
その際、不正に投稿された内容がparamsに含まれているとその情報まで保存されてしまいます。

簡単にいうと意図しない（安全では無い）データの登録・更新を防いでくれる。

例えば下記のようにQuestionを作成できるフォームがあったとして`question[name]`の部分を`question[like]`に検証ツールで変更して、`Create Question`ボタンを押下しフォームを送ると本来は
```
"question"=>{"title"=>"タイトルです", "name"=>"99999", "content"=>"テキストです"}
```
と送られ"title", "name", "content"カラムが登録されるが、`question[like]`に変更されると
```
"question"=>{"title"=>"タイトルです", "like"=>"99999", "content"=>"テキストです"}
```
が送られ`like`カラムがある場合、意図しない`like`が登録されてしまう。
質問にお気に入りみたいなカラムで`like`があった場合、不正にお気に入りのカウントを追加できてしまう。
![strongparams.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/8956deb4-7317-5aa0-d4dc-aec591482250.png)

## どうやって防ぐか
メソッドにあらかじめ登録・更新を許可するカラム名を指定（ホワイトリスト形式）しておきます。
そうすることで、万が一、未許可のカラムデータが送られてきても、データの登録前に未許可であることを検出し、登録対象として無視することができます。

## ストロングパラメータ実装
- privateメソッド:配下に記述したメソッドは、クラス外からのアクセスができません。基本的に、クラス外からのアクセスをさせないようにprivateメソッド配下に書く。
- メソッド名:基本的には[ モデル名_params ]とする
- requireメソッド:params内の特定のキーに紐付く値だけを抽出する事ができる。引数には取り出したい値のキーを指定する
- permitメソッド:許可された値のみを取得することができる。引数には登録を許可する全てのカラム名を指定しておく必要

```questions_controller.rb
    def create
        # Questionモデルを初期化
        @question = Question.new(question_params)
        # QuestionモデルをDBへ保存
        @question.save
    end
    private
    def question_params
        # params.require(:キー(モデル名)).permit(:カラム名１,：カラム名２,・・・)
        params.require(:question).permit(:title, :name, :content)
    end
```

## ストロングパラメータまとめ
- ストロングパラメーター:データベースに保存するカラムを指定し、paramsで安全な情報を受け取らせる仕組みのこと。
- パラメーター:リクエストに含まれて外部から渡されるデータ、情報のこと。
- params:パラメーターをハッシュ構造で格納している箱のようなもの。
- require:params内のモデルに特定のキーに紐付く値のみを取り出すメソッド。
- permit:requireで取り出したキーの中から、さらに取得したいキーのみを指定するメソッド。
Hyper-V Server 2019でOffice 2010 Starterを動かす

Office 2010 Starterが動かねえ!!
→動いた
自己責任でどうぞ。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118263/056fe86d-a4bb-2464-4a30-0aaad375bbcf.png)
# 必要なもの
* Office 2010 Starterの日本語版インストーラ
http://c2r.microsoft.com/ConsumerC2R/ja-JP/14.0.4763.1000/SetupConsumerC2ROLW.exe
* バイナリエディタ
おすすめはBZ(サポート終了しているので危険かも)
* KB2598285(以下KBと表記)
https://www.catalog.update.microsoft.com/Home.aspx
# 作業
## パッチ
https://pmp-style.hatenablog.com/entry/OfficeStarterFree
ここのコメントに"かわ"さんが書かれているパッチを当てる
バイナリエディタの使い方は自分で調べてどうぞ。
## 更新プログラムのダウンロード
KBをcabから展開、mspファイルを保存
# インストール
うまく行けば何もなくインストールが終わるので、KBを適用。
※cabだからdismだろう!と思いインストールしようとしてコケました。
注意!
# 起動
何事もなくWord、Excelが起動しますと言いたいところだが、何かがエラーを吐いた。
→何故か動いた
Picture Manager?を起動して利用規約に同意するとWordが起動してしまった。
ついでにExcelの新規作成ウインドウも表示可能に。
何だったんだ...
追記:やはり時々クラッシュする。データ吹っ飛んでも知らないよ!

# おまけ
Office 2010 Starterの広告ブロッカーがあるらしい。
http://www.kluug.net/office-starter-ad-remover.php
`OfficeAdRemover.exe silent`とするとタスクトレイに何も出ないらしい。
スタートアップ登録かな...
自己責任で。
何故foreachを使ってはいけないか？

## Linqを使った方がミスが起きにくい

* 結論から言えば、foreachを使わずにLinqで代替すると、コードがより人間の言語に近くなり、仕様に基づいてコードを記述する際のミスが抑えられます。

* プログラミングを行う際、プログラマは意識せずに人間が考えた仕様を、マシンが理解出来るように翻訳してプログラムを記述しています。プログラム言語がより人間の言語に近づくことによって、この翻訳作業でのミスを減らすことが出来ます。

## ループ系ステートメントを使った時とLinqを使った時の違いを比べてみる

* 例えば、以下のような仕様があったとします。

```
価格のリストから一番高い価格をコンソールに表示する。
```

* ループ系のforeachステートメントを使った場合は、以下のようなコードになります。

```csharp
var priceList = new int { 100, 200, 300 };

var maxPrice = 0; 

foreach(var price in priceList)
{
    if (maxPrice < price)
    {
        maxPrice = price;
    }
}

Console.WriteLine(maxPrice);
```

* プログラマ歴の長い方は、こういったコードを何度も書いてきたのではないでしょうか？（実際に私も書いていました）

* これに対して、Linqを使った場合は以下の通りになります。

```csharp
var priceList = new int { 100, 200, 300 };

Console.WriteLine(priceList.Max());
```

* この記述の短さで全く同じ結果が得られるわけですから、直観的にLinqを使うメリットを感じることが出来るはずです。ただ、Linqを使うことには、それ以上の意味があります。

* 先ほど書いたコードをためしに「直訳」してみます。直訳した結果はコメントで右側にかいていきます。

```csharp
var priceList = new int[] { 100, 200, 300 };

var maxPrice = 0; // 変数：最大価格にゼロを代入します。

foreach(var price in priceList) // 価格リストの要素をひとつづつ取り出します。
{
    if (maxPrice < price) // 取り出した価格が変数：最大価格より大きい場合
    {
        maxPrice = price; // 変数：最大価格に取り出した価格の値を代入します。
    }
}

Console.WriteLine(maxPrice); // 変数：最大価格をコンソールに出力します。
```

* あらためてコードを「直訳」してみると、最初に定義された「価格のリストから一番高い価格をコンソールに表示する」という仕様をプログラマがプログラミング言語に「翻訳」していることが分かります。

* それではLinqを使ったコードを直訳してみましょう。

```csharp
var priceList = new int[] { 100, 200, 300 };

Console.WriteLine(priceList.Max()); // コンソールに「価格リストの中の最大の値」を出力します。

```

* どうでしょうか？コードの直訳が最初に定義した「価格のリストから一番高い価格をコンソールに表示する。」という仕様とほぼ一致しています。この書き方であれば、「仕様」を元にそのまま「コード」を記述すればよいだけなので、ミスをする可能性はほぼありません。

* これはコードを文法やステートメントレベルで「仕様」に近づけるアプローチであって、実際にはこれに加えて変数やクラス、メソッドの「ネーミングの的確さ」が必須になってきますが、ネーミングについてはそれだけで膨大な記述が必要になるため、ここでは触れません。

## コメントはどうなるか？という疑問について

* 「わざわざコード上で仕様を表現しなくても、コードに直接コメントを書けばよいのでは？」という意見もありますが、個人的にコメントは次善の策であって、本筋は今回紹介した「コードのそのもので仕様を表現出来る」方が望ましいと思っています。

* というのも、コメントに詳細な仕様を書き込んだときに何かのきっかけで仕様が変わった場合、常に「設計書」、「コメント」、「コード」の三か所をメンテナンスしなくてはならなくなるからです。

* シンプルに「メンテナンスする対象が増える≒部品点数が増える」と思っていただいてもいいと思います。工業製品においては同じ機能が得られるなら、部品点数が少ない方が優れていると考えますが、これはシステムにおいても同じと言えるでしょう。

* とはいえ、実際にはコードだけで表現出来ないこともあるので、その場合は自分も積極にコメントを書いています。しかし、その場合も可能な限りコードで仕様を表現出来るように考えた上で、なるべく簡素にコメントを書くことにしています。

## 結論

* 最後に結論です。

    * コードを「直訳」してその結果が「仕様」に近ければ近いほど、それだけバグが少なく堅牢なシステムに近づきます。

    * 具体的には、ループはなるべくLinqを使って記述します。そうすれば自然とそのコードは「仕様」に近づきます。

    * 「これならコメントは詳しく書かなくても大丈夫だな」と言えるよう、コーディング自体を工夫していきましょう（もちろんこれはすごく難易度が高いことですが）。

* システム開発は日進月歩。更に素晴らしいアプローチが生まれることを期待して、本稿を締めたいと思います。最後までお読みいただき感謝です。
macOSのディスプレイ解像度を細かく指定する

# 記事の概要

この記事はmacOS（13 Ventura）にて、ディスプレイの解像度を設定するTipsです。

# 環境設定のディスプレイ設定では5個しか選択肢がありません。

普通に環境設定のディスプレイ設定を見ると、このように5つのサイズの解像度しか選択できないように見えます。

![68cb83172199debc0a3f7ed66d7e772e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64861/aa49b119-5310-7399-d13f-432187c6d50f.png)

# ディスプレイの解像度を細かく設定する方法

Ctrlキーを押しながら解像度の設定あたり（ボタンをクリックしない）をクリックすると、メニューが表示され、「リストを表示」をクリックすると、より細かい解像度を設定できるリストが表示されます。

![c5d24906347fc77d03f6151a47c29544.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64861/a7fb3581-56ab-724d-7618-8f2ff802f083.gif)


![a29bf69d8958fc9eca831f1695a22f12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64861/58531302-e62f-0f5c-4145-1238691b5d11.png)

# 参考

https://support.apple.com/ja-jp/guide/mac-help/mchl86d72b76/mac
【React】Material-UIのText FieldでEnterキー押下時にイベント発火させる


Material-UIのText Fieldでフォームへの入力の途中でイベントが発火してしまうという問題があり、Enterキーを押したらイベントが発火するよう修正しました。


https://mui.com/material-ui/react-text-field/


## 元のコード
```js:
const [id, setId] = useState([])

const handleIdChange = (event) => {
  setId(event.target.value)
  // 他の処理
}

return (
  <>
  {/* 略 */}
  <TextField
      fullWidth
      label="ID"
      variant="outlined"
      onChange={handleIdChange}
  />
  {/* 略 */}
)
```

## Enterキーを押下でイベント発火するよう修正
```js:
const [id, setId] = useState([])

const handleIdChange = (event) => {
  if (event.key === 'Enter') {
    setId(event.target.value);
    // 他の処理
  }
}

return (
  <>
  {/* 略 */}
  <TextField
    fullWidth
    label="ID"
    variant="outlined"
    onKeyDown={handleIdChange}
  />
  {/* 略 */}
)
```
enum値の値(数値)を確認する方法

## やりたいこと
Goriraモデルにgorira_typeというカラムがある。
このgorira_typeのカラムはenum値が定義されていて、値が複数ある。
DBに保存される時は、基本的に数値で保存されるため、
その数値がどのenum値の文字に対応しているものなのかを知りたかった。

rails consoleで
```
Gorira.first.gorira_type
```
このようにすると、
```
> "Takeshi"
```
と返ってくる。

では、このTakeshiはDBに保存される際はどの数値になるのかを知りたい。

## カラム名_before_type_castを使用する
こんな感じでカラム名_before_type_castを使用しよう。
```
Gorira.first.gorira_type_before_type_cast
```
すると、
```
> 10
```
みたいな感じで返ってくる。DBには、10と保存されている。

がんばろう。
IoTシステムの全体像⑤ 〜データ分析〜

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# IoTシステムの全体像
IoTシステムでは次のような順でデータが流れていきます。
`①データ収集 -> ②データ通信 -> ③データ可視化 -> ④データ蓄積 -> ⑤データ分析 -> ⑥データ活用`
6つの記事に渡ってそれぞれのセグメントについてまとめていきますが、この記事では「⑤データ分析」について記述します。

# IoTにおけるデータ分析とは？
IoTでは、膨大な量のデータを取得しますが、そのデータの分析を行い、規則性や傾向を発見することで、その次の行動に繋げる必要があります。
以前は、人がデータ分析を行うことがほとんどでしたが、現在ではAIや機械学習を用いてデータ分析を行うことも増えてきています。また、[統計学](https://qiita.com/7_inai_/items/3e24c88450ee5af4fe86)の注目も年々高まってきており、日本の大学でも統計学を専門とした学部が増加しています。

# データ分析の手法
データ分析の手法は大別すると、統計学と機械学習に分けることができます。

### ①統計学
統計学は、収集したデータから平均値を求めたり、グラフ等を作成したりして、そのデータの傾向や特徴を数量的に把握する手法で、古くから使われてきた方法です。

### ②機械学習
機械学習は、収集したデータをコンピュータで解析することで、__データに潜むパターンやルールを学習する__ ための手法です。
機械学習には、教師あり学習と教師なし学習があり、それぞれ次のような特徴があります。
- 教師あり学習：最初に正解となるデータを与えることで、AIが正解データを導き出すための、__入力データごとの特徴や、データ分析を行う際のルール等を学習__ していきます。温度から電気料金を予測するような用途で使用されます。
- 教師なし学習：最初に正解となるデータを与えずに、__入力したデータからデータ構造やパターンを探し出す方法__ です。データの関連性を求めるような用途で使用されます。

# 終わりに
前述した通り、データ分析は取得したデータから相関性や規則性見つけるための手法です。見つけたルールを活かして現状分析をしたり、意思決定のサポートとして使用したりできるため、経営戦略においても非常に重要な役割を担っています。このような背景から、今後データサイエンティストの価値は益々高まるでしょう。

最後までお付き合いくださりありがとうございました。
ivdepとゆかいな仲間たち

## 情報源

Intelコンパイラの`#pragma ivdep`相当の指示句は他のコンパイラにもあることが多いですが、だいたい別名です。以下のOpenMPのドキュメントに様々なバリエーションの記載がありました。

[https://www.openmp.org/wp-content/uploads/OpenMP_SC20_Loop_Transformations.pdf](https://www.openmp.org/wp-content/uploads/OpenMP_SC20_Loop_Transformations.pdf)

## 内容

上記内容と、一部記載のないものも加えた一覧です。
```

Cray
#pragma [_CRI] ivdep

SGI/Open64
#pragma ivdep

HP
#pragma IVDEP

Intel (iccは有効、icxでも有効かは不安)
#pragma ivdep

PGI
#pragma ivdep

gcc
#pragma GCC ivdep

msvc
#pragma loop(ivdep)

clang
#pragma clang loop vectorize(enable)

NEC (nc++)
#pragma _NEC ivdep

```

## 感想

ベクトル化／SIMD化しようとすると、`ivdep`は必須。個人的には`ivdep`よりも`restrict`を使って個別に依存関係をコンパイラに伝えたい。とはいえ、`restrict`も対応状況がコンパイラ依存で、`__restrict`、`__restrict__`などのバリエーションがある。また、特に困るのは`std::vector`に対して`restrict`相当の明示をどうやるんだという問題があり、HPC等の速度が最重要の分野では、やっぱり生ポ最強なんじゃと思ってしまう。
新しいタブで開く方法

完全な備忘録です。

新しいタブで開くには
　


    <a href="〜〜" target="_blank" rel="noopener noreferrer">

　

のようにaタグの属性に「target="_blank"」をつけるんだったな。

のというのを調べて思い出したんですが。


　
なんや脆弱性があるとかで「rel="noopener noreferrer"」も付け加えた方が良いと。


　
そういえば聞いた気がする〜と忘れていました。（汗）
　
私みたいな初心者の方はご注意を。
VSCodeでPythonのユーザースニペット設定

VSCodeではユーザーがスニペットをファイル拡張子ごとに定義することができるが、
設定にけっこうハマったので、解消方法をメモする。

# 前提条件
- VSCode 1.75.1
- 拡張機能
    - Japanese Language Pack for Visual Studio Code v1.75.2023020809
    - Pylance v2023.2.30
    - Python v2023.2.0

# ユーザースニペットとは
事前に定義したキーワードからコードを補完してくれるVSCodeの機能。
↓競プロで頻出のPython一行複数入力受け取りを効率化できる。
![無題の動画 ‐ Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707277/5120f993-5f8d-7d76-a081-42b04bf2ca59.gif)

# やり方
（日本語拡張機能を入れている前提）
① ファイル＞ユーザー設定＞ユーザースニペットの構成 に進み、好きな言語のjsonファイルを開く。
![無題の動画 ‐ Clipchampで作成 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707277/8416b1e4-333e-5ae6-24ee-61c732e5ad99.gif)

② jsonファイルにスニペットを定義する。
- 一番外側の { } の内に"名前": {… , …, } の形で定義する。
- "prefix": スニペットを呼び出すキーワード。
- "body": 呼び出すスニペット。[ ] 内にコンマで並べると複数行にもできる。
- "description": スニペットの説明。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707277/55f2ed31-2d58-83e1-77c5-127ede5e1d80.png)

③ 設定ファイルの修正
setting.jsonの一番外側の { } の中に以下を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707277/3f30ff8c-d945-cea5-b043-1ed727256746.png)

- "[python]"はpythonファイルでのみ適用されるという意味。
- "editor.suggest.showSnippets": true スニペットを表示するか
- "editor.suggest.snippetSuggestions": "top" スニペットをサジェストのトップにする（ほかの補完機能も使っている場合）
- "python.languageServer": "Pylance" おまけ。Pylanceの機能を有効化する。

# まとめ
設定ファイルも修正しなければならないのが盲点だった。
ユーザースニペットでレッツ効率化！！
PanasonicPLC FPWINPro7 テクニック集

# FPWIN Pro7最新差分やドキュメント
Panasonic製PLC FPシリーズのツールソフトFPWIN Pro7の最新差分データは下記のリンクから取得できる。

ソフトウェア　Control FPWIN Pro7 ダウンロード
https://www3.panasonic.biz/ac/j/dl/software/index.jsp?series_cd=3359

バージョンアップはそこそこ頻繁に行われているようである。
オフラインソフトなのでアップデートは必須ではないが、バグ修正もあるので最新バージョンを使用した方がよいであろう。
上記同サイトより導入ガイドもダウンロードできる。

ソフトウェアに関するドキュメントはFPWIN Pro7起動後、ツールバーから起動できるヘルプが最も有用である。

# FPWIN Pro7虎の巻
FPWIN Pro7を使用する上で役立つテクニックや設定の技術資料とのこと。
なぜか上記のソフトウェアのダウンロードページとは違うFA技術サポートというページに掲載されている。



FA技術サポート - 設計時サポート FPWIN Pro7虎の巻
https://www3.panasonic.biz/ac/j/service/tech_support/fasys/guidebook_of_fpwinpro7/index.jsp

プログラム作成に行き詰ってから見るというよりは、事前に確認しておくとよい内容のようだ。
いくつかの内容はヘルプよりも詳細な内容が記載されている。
疑似的な参照型とするAdr_Of_Varに関する記事は必読である。
~~ヘルプやマニュアルに入れればよいのではないかとも考えられるが。~~

### 虎の巻 記事一覧
ショートカット
複数行のTab挿入(ST)
記述済みの変数を入れ替える(ST)
構文ペア検索機能(ST)
ボディから変数新規宣言(ST)
ショートカットキーによるプログラミング(LD)
シリアル／Ethernet通信
MEWTOCOL-COM マスタ命令 FP_WRITE_TO_SLAVE_AREA_OFFS
MEWTOCOL-COM マスタ命令 FP_WRITE_TO_SLAVE
汎用通信受信バッファ用のSTRING型の宣言 (FP7以外の機種)
汎用通信受信バッファ用のARRAY型の宣言 (FP7以外の機種)
STRING型変数のシリアル通信(送信の場合)・・・(FP7以外の機種の場合)
STRING型変数のシリアル通信(受信の場合)・・・(FP7以外の機種の場合)
STRING型変数のシリアル通信(送信の場合)・・・(FP7の場合)
STRING型変数のシリアル通信(受信の場合)・・・(FP7の場合)
STRING型に文字列終端コードを付加する
LD言語
Labelの使用例
コイル(出力)の後ろにプログラム可能
3項以上の四則演算(1)
3項以上の四則演算(2)
比較演算子を使用する場合の注意点
比較演算子で入力点数が3個以上の動作
LD言語の比較接点について
ST言語
ST言語ではF命令のオペランドに定数の演算が可能
ST言語における比較演算子の使い方
ST言語において出力の記述が必須でないオペランド
ST言語において記述が必須でないオペランド
SFC言語
同一信号の連続入力によるSFC工程移行
FUN／FB
"EN／ENO付き、なし"での動作の違い
"EN／ENOあり"の場合のファンクションブロック(FB)、ファンクション(FUN)出力状態
ファンクション(FUN)の出力
クラス VAR_IN_OUTの使い方
ファンクションブロック(FB)の初期値
出力結果を持たないファンクション(FUN)
ファンクション(FUN)の制限
<Return>の使用例
コンパイル
タイマ命令(ファンクションブロック(FB)使用による)コンパイル後の接点番号
TON(オンディレイタイマ)命令とTM命令の違い
保持型変数(VAR_RETAIN)のデータレジスタ割り付け先
PLCへのプログラムダウンロード時、保持型データをクリアしない方法
保持型変数の初期化
FPWIN Pro7の機能
POUヘッダ・ボディの分割表示
ホイールクリックによるタブのクローズ
ペインレイアウトの任意配置
ペインレイアウトの固定
ペインの表示方法
PCの時計を使用してのPLC時刻設定
システム変数 sysとSYSの違い
「.pce」と「.pro」とでファイルに保存される情報の違い
ライブラリを含む「.pce」を「.pro」で保存すると.sulが生成される
ライブラリ編集時のパスワード設定
SDカード運転ファイルの生成
使用メモリの確認
特殊データレジスタの確認
ユーザモニタにD&Dで変数を一括登録
ユニットメモリの変数宣言
ユーザモニタでの連続したデバイス番号の登録
STRING型宣言時の文字数初期値の変更
VAR_CONSTANTの自動宣言
項目を直前/直後に挿入
未使用変数削除
ファンクション(FUN)、ファンクションブロック(FB)内の使用命令確認方法
FP7 ユーザコネクション数の拡張方法
オートコンプリート機能
グローバル変数をcsvファイルにエクスポート
プログラムの記述
TIME型のデータの中身
TOFの強制停止
ユニットメモリのインデックスについて
グローバル変数の内部メモリとしての使い方
定数変数(VAR_CONSTANT)を使用したプログラム
割り込みプログラムの使用方法(FP7以外の場合)
割り込みプログラムの使用方法(FP7の場合)
数字の桁区切り方法
定数に2進数指定が可能
WORD型からBOOL型(16ビット)要素への変換
配列変数(ARRAY)の配列指定方法
F10(BKMV)拡張命令
変数の先頭アドレスを取得する必要のあるF命令使用方法
DWORD型変数の上位・下位WORDをWORD型変数へ転送する(1)
DWORD型変数の上位・下位WORDをWORD型変数へ転送する(2)
WORD型変数をDWORD型変数の上位・下位WORDへ転送する(1)
WORD型変数をDWORD型変数の上位・下位WORDへ転送する(2)
AdrDT_Of_Offsの使用例
AdrLast_Of_Var_Iの使用例
GetPointer の使用例
AreaOffs_ToVar の使用例
Var_ToAreaOffsの使用例
Size_Of_Varの使用例
AdrDT_Of_Offs32の使用例
FP7 I/O割付の取り込み
実アドレスを使用せずに入力リレーを取り込む
実アドレスを使用せずに出力リレーを指定する
Elem_OfArray1Dの使用例
Elem_OfArray2Dの使用例
Elem_OfArray3Dの使用例
配列変数のF命令への記述方法(1)
配列変数のF命令への記述方法(2)
重複したデータアクセス用に重複したエレメントを持つDUT
BOOL16_OVERLAPPING_DUTの使い方
STRING16_OVERLAPPING_DUTの使い方
STRING_TO_INTとSTRING_TO_STEPSARVER
四則演算結果のWORD型変数への格納
DUTの初期値を使用した応用事例
FPアドレスを割り付けたグローバル変数の挿入
特殊内部リレーをアドレスで挿入
BOOLの反転
DFI
TOFの強制停止
カンマ区切りの文字列を分割するFUN
requireとかimportとかdefault exportとかnamed exportとか

雰囲気で書いてたため調査

## require
CommonJsで策定されている仕様です。
CommonJsとは、主にNodeJs（ブラウザ外のJs）でのモジュールシステムの標準化に焦点を当てたプロジェクトとのこと。
たしかにフロントエンドのJsでrequireはあまり見たことないですね。

#### 使い方
二通りあります

### module.exports（default export）
・requireする側では任意の名前で読み込むことが可能
・module.exports自体は1ファイル内でいくつでも定義可能だが、最後のエントリが有効になる

```add.js
module.exports = (a, b) => a - b;
module.exports = (a, b) => a + b; // これが有効
```

```main.js
const add = require('add.js');
console.log(add(1, 2)); // → 3
```

### exports（named export）
　・requireする側に名前を強制することが可能
　・1ファイル内で別々の名称でexportsすれば複数定義可能
```calc.js
exports.add = (a, b) => a - b;
exports.devide = (a, b) => a / b;
```

```main.js
const calc = require('calc.js');
console.log(calc.add(1, 2)); // addという名前が強制される
console.log(calc.devide(10, 2)); // devideという名前が強制される
```
下記のように部分的にrequireすることも可能です。 

```main.js
const { add } = require('calc.js');
console.log(add(1, 2));

const { add: a } = require('calc.js'); // ちなみにこうすることでaという名前で読み込める
```

## import
ECMAScriptで策定されているESModuleという仕様です。
ECMAScriptとは、ブラウザで動くJavascript仕様の標準化プロジェクトです。
各ブラウザはECMAScriptの仕様を満たすようにJavascriptを実装します。
（あまり自信ないです。。。間違ってたらご指摘ください）

とはいえ、ESModule自体は最近のNodeJSではサポートされています。

### export default（default export）
　・CommonJsのmodule.exportに対応するもの
　・1ファイル内に1つしか定義できない
```add.js
export default (a, b) => a + b;
```

```main.js
import add from './add';
console.log(add(1, 2)); // → 3
```

下記のようにimportすることも可能です
```main.js
import * as add from './add';
console.log(add.default(1, 2)); // → 3
```

### export（named export）
　・CommonJsのexportsに対応するもの

```calc.js
export const add = (a, b) => a + b;
export const devide = (a, b) => a / b;
```
下記のように書くことも可能です。

```calc.js
const add = (a, b) => a + b;
const devide = (a, b) => a / b;

export { add, devide };
```

```main.js
import { add, devide } from './calc';

add(1, 2);
devide(10, 2);
```

下記のようにすることも可能です
```main.js
import * as calc from './calc';
calc.add(1, 2);

calc.devide(10, 2);
```

### CommonJs VS ESModule
NodeJsでESModuleがサポートされたので、もう全部ESModuleで良いのでは？と思ったのですが現時点ではどちらかに全寄せするのは難しそうです。
ちゃんと調べられてないのでまた別途まとめます。。。

### default export VS named export
これはnamed export一択では？と思ったけど界隈ではdefault export派もいるそう。。。
ここも別途調べてみます。


最後に、私のExpress（Typescript）はESModuleでしか書いてないなと思って確認したら、トランスパイル後のJSはCommonJSの形式になってました（なんと）
NodeJsプロジェクト全体にESModuleを適用するのもいろいろやらんといけないらしいです。
このへんもまた取り上げたいです。