OmniAICreator/Qiita-1.07M huggingface dataset:
ブロックチェーンエンジニアの第一歩、初めてのSolidity(環境構築なし)

# はじめに

今回はブロックチェーンエンジニアにのはじめの一歩として、環境構築なしでSolidityでプログラミングをする開発体験をご紹介します。

Solidityは、スマートコントラクト(Ethereumにおけるブロックチェーン上で動作するプログラム)を開発するプログラミング言語です。
言語の特徴としては静的言語でC++やPython、JavaScriptを参考に作られています([公式ドキュメント](https://solidity-jp.readthedocs.io/ja/latest/)より引用)。

記事執筆時点(2022/05/25)での最新バージョンが0.8.14と、まだまだ発展途上なプログラミング言語ですが、スマートコントラクトを開発する上での主要言語となるため、この記事をきっかけに少しでも知ってもらえたらと思います。

# 今回の開発に必要な環境

本記事の開発では、ブラウザ上で動作する[Remix IDE](https://remix.ethereum.org/)を使用します。
ブラウザ上で動くIDEを使用するため、特別な開発環境構築の手間はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175966/45812ea9-4ddc-8d11-35c2-3ac146bed523.png)


# Solidityを書いてみる

実際にRemix IDEを使ってSolidityで簡単なスマートコントラクトを開発してみます。

## Hello, World!
まずは、Solidityを使ってHello, World!を表示してみましょう。
既存で作られているcontractsフォルダ配下にhelloWorld.solを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175966/82a58136-4697-9832-a33d-21e871c81d46.png)

作ったファイルに、下のような形でコードを書くことで簡単に変数や関数を書くことができます。

``` solidity:HelloWorld.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.7.0 <0.9.0;


contract HelloWorld {
    string greet = "Hello, World!";
    
    function helloWorld() public view returns(string memory){
        return greet;
    }
}
```

書いたコードは下図左タブの赤線が引いている場所を選択し、コンパイラなどの基本設定をすることでコンパイルができます。
コンパイルが成功すると、下図の左タブのように緑のチェックマークが付きます。
コンパイルできない場合はエラーが表示されるので、エラーの表示をもとに、記述したコードにミスが無いか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175966/7220598a-3f8f-ad43-078e-7a1be8bcf562.png)

コンパイル後、次は下図の左タブに移動し、実際にコンパイルしたコントラクトをデプロイしてみます。
デプロイが成功するとDeployed Contractsの下に、対象のコントラクトがデプロイされていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175966/6913bebc-b848-2e02-b34f-4fdef4f7a635.png)

デプロイされたコントラクトを開き、先程作った関数に対応しているhelloWorldのボタンを押下すると、関数の返り値としてstring型のHello, World!が返却されたことが確認できます(GUIベースでコントラクトの検証ができるのも便利です)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175966/95901050-65a9-54d6-95f6-22465136f78f.png)


このように、Remix IDEを使って簡単にSolidityでHello, Worldを表示することに成功しました。

## もう少しスマートコントラクトらしさを体感する。

もう少し深くSolidityに学びたい場合、[CryptoZombies](https://cryptozombies.io/jp/)に触れてみるのがおすすめです。ステップを踏みながらスマートコントラクトの開発について理解を深めることができます。

# さいごに

今回は誰もがブロックチェーンエンジニアになる第一歩として、環境構築なしでスマートコントラクトを開発する方法をご紹介しました。
ブロックチェーン技術は敷居が高いと思われがちですが、このように開発経験があれば気軽に関心を持てる部分もあります。
この記事をきっかけにブロックチェーンの技術に関して、少しでも関心を持ってくれれば幸いです。
最後まで読んだいただき、ありがとうございました。

# 参考
- [Solidity公式ドキュメント](https://solidity-jp.readthedocs.io/ja/latest/)
- [Solidity(GitHub)](https://github.com/ethereum/solidity)
【3日で合格】AWSソリューションアーキテクト アソシエイト

初受験でAWS SAAを3日で合格したので記録に残します

# スコア：767点
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197418/2db16f14-ce0d-e94c-2d45-df65132f77c9.png)
※終了30分前に全部解き終わりました

# 試験対策
* 勉強期間：3日
* 勉強時間：7時間
* 教材：koiwaclubのSAA問題を900問解く
    * 弱点をあぶり出すために不正解の学習に注力するため問題を早く解いていきました
    * 4時間問題を解いて模擬試験で620点（不合格ライン）
    * 間違った問題は公式ドキュメントで学習するをひたすら繰り返す
* 苦手な箇所はEvernoteにメモって後で復習
* 反省点：koiwaの＃1～90までを解いたのですが#80~解いたほうがより対策になると後で知りました

# 受験者はこういう人
* CLF取得済み
* SIer インフラのプロジェクトマネージャー
* AWS実務経験は無し（提案を3回したことはある）
* AWS歴：4年独学
* AWSハンズオンは70個くらいやりました
* 毎日の勉強時間：1,2時間（AWSを軸にしたITなど）
* 記憶力は並以下だと思います

# 不合格だと思ったけど合格した
受験するまでは落ちると思っていました


3日で受験は無謀だったのとkoiwaの手応えから合格しないと思っていました
まぁ不合格は不合格でネタにしようかなと思っていましたが・・

ただ会場で本試験の問題を解いていくうちに「受かりそうな気がする」という手応えが出てきました
理由は集中力が上がったこと、koiwaではインスタント的に問題を解いていたこと
あとは運もあったかかなと思いました


# 試験当日への臨み方
* 試験直前
    * 試験会場に余裕を持って到着
    * 受験開始時間まで30分ほどkoiwaを解く
    * 事前にまとめた苦手箇所をEvernoteのメモで復習
* 試験中
    * 問題はしっかり読む
    * 不安な箇所は後で確認する（これで2,3問は正解になった気がする）
    

# 3日で受かった理由を自分なりに分析
* 毎日AWSを軸にITの勉強をしている
* AWSアップデートの確認（最低でも週に一度）
* ブラックベルトや公式ドキュメントを読む
* JAWS-UGでの登壇＆参加
* 社内でのAWS勉強会主催
* AWS関連の書籍や教材の制作に関わる
* 毎日コツコツ積み上げて何度も繰り返して覚える

# 最後に
知識や技術の足元を時間をかけて固めたおかげだなと思いました
逆に言えばもっと早く受けてもよかったのかなと感じましたが
いずれにせよ毎日勉強して繰り返すのは大切だと実感しました
Specification of Ethernet Interface, No.417, AUTOSAR R21-11(174) CP

Specification of Ethernet Interface, No.417, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/classic/21-11/AUTOSAR_SWS_EthernetInterface.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|:--|
|CBR| Channel Busy Ratio
|CIT |Channel Idle Time
|Eth|Ethernet Controller Driver (AUTOSAR BSW module)
|EthIf| Ethernet Interface (AUTOSAR BSW module)
|EthSM |Ethernet State Manager (AUTOSAR BSW module)
|EthTrcv |Ethernet Transceiver Driver (AUTOSAR BSW module)
|IP |Internet Protocol
|MCG |Module Configuration Generator
|MII |Media Independent Interface (standardized Interface provided by
|Ethernet| controllers to access Ethernet transceivers)
|RSSI| Received Signal Strength Indicator
|TCP| Transmission Control Protocol
|TCP/IP Stack| Ethernet communication stack
|VLAN|Virtual Local Area Network
|WEth |Wireless Ethernet Driver
|WEthTrcv |Wireless Ethernet Transceiver Driver
|OA TC10| Open Alliance TC10 Specification (see [25])

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] Requirements on Ethernet Support in AUTOSAR
AUTOSAR_SRS_Ethernet.pdf
[5] Specification of Ethernet Driver
AUTOSAR_SWS_EthernetDriver.pdf
[6] Specification of Ethernet State Manager
AUTOSAR_SWS_EthernetStateManager.pdf
[7] Specification of Ethernet Transceiver Driver
AUTOSAR_SWS_EthernetTransceiver.pdf
[8] Specification of TCP/IP
AUTOSAR_SWS_TcpIp.pdf
[9] Specification of PDU Router
AUTOSAR_SWS_PDURouter.pdf
[10] BSW Scheduler Specification
AUTOSAR_SWS_Scheduler.pdf
[11] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[12] Specification of Memory Mapping
AUTOSAR_SWS_MemoryMapping.pdf
[13] Specification of Standard Types
AUTOSAR_SWS_StandardTypes.pdf
[14] Specification of Default Error Tracer
AUTOSAR_SWS_DefaulttErrorTracer.pdf
[15] Specification of Diagnostics Event Manager
AUTOSAR_SWS_DiagnosticEventManager
Specification of Ethernet Interface
AUTOSAR CP R21-11
13 of 148 Document ID 417: AUTOSAR_SWS_EthernetInterface
[16] Specification of ECU State Manager
AUTOSAR_SWS_ECUStateManager.pdf
[17] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[18] AUTOSAR Specification of Global Time Synchronization over Ethernet
AUTOSAR_SWS_TimeSyncOverEthernet.pdf
[19] AUTOSAR Specification of Ethernet Switch Driver
AUTOSAR_SWS_EthernetSwitchDriver.pdf
[20] Wireless Ethernet Driver
AUTOSAR_SWS_WirelessEthernetDriver.pdf
[21] Wireless Ethernet Transceiver Driver
AUTOSAR_SWS_WirelessEthernetTransceiverDriver.pdf
[22] IEC 7498-1 The Basic Model, IEC Norm, 1994
[23] IEEE 802.3-2006
[24] IEEE 802.1Q-2011
[25] OPEN ALIANCE Sleep/Wake-up Specification Version 2.0 (Rel Feb 21, 2017),
http://www.opensig.org/Automotive-Ethernet-Specific
ノンビン塾～エンジニアとしての成長記録２～


## 前回の課題提出
### テーマ
　ご飯を食べにお店（マックor田舎の食堂）に行く。
　お店に入り料理が提供されて、お会計が終わって出るまでをシーケンス図で示そう。

### 回答
　身近なマクドナルドを選択。
　まず、登場人物（物）を書き出した後、
　「ドアまで歩く」動きから頭の中でイメージしながら、作成。
　もちろん、後から付け足したり、完成後に修正を加えたりした。
![4.21_ケニー課題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/2580d941-6819-3af3-2a29-3075cf62de7f.png)

### フィードバック
* 非同期処理を使っているところが良い。
* 実務では、作成前に考えるべき事は、どこまで必要かを確認（ヒアリング）する事。
→今回の課題を例にすると、
　・Aさんは一人なのか？複数人いるのか？
　・カウンター越しの店員に注文するのか？ディスプレイからセルフ注文するのか？　等
* 頭の中の整理に使える。これを普段の自分の仕事に置き換えてみる。
→サポートのエスカレーション等

## 今回の講義
【テーマ】
　フローチャートの書き方を覚える
　
　フローチャートとは、
　シーケンス図縦ラインの１個の内部の流れを示したチャート
　（現時点では、この理解で良い）

例）大将の寿司握り
　　→基本的な流れは以下の左図ようなものである

実践）以下の右図参照（左図に「分岐」を加えてみた）
![Untitled(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/d3f8a084-04b4-f5dd-c1c5-e8e900246cc9.png)

分岐を加える事で、より現実的な流れになったと思う。
StartからEndまで、どういう流れ・分岐を通過していくかが非常に読みやすい。
条件が色々と分かれている複雑なフローも表現しやすい。


### 次回ノンビン塾までの課題
　業務の何か一つをフローチャートで示す


## 感想

内部はどういう流れになっているのか、どういう分岐が必要なのか
をはっきりと示すことができる為、今回も非常に興味深く・面白い内容だった。

前回学んだシーケンス図と今回のフローチャートを作成できるようになると、
実際プログラムを書く際この流れをコーディングしていく事になると思うので経験を積んでいきたい。

また、実務でコードの修正ややり直しをしないようにする為には、
このシーケンス図・フローチャートの完成度が如何に大事かが理解できたし、腹落ちした。
【Rails】ページネーションGem「kaminari」を実装をした記録②（CSSやデザイン適用）



### 初めに

画像投稿アプリを作成している中で、投稿が増えてきたため実装しました。
その過程を備忘録として投稿いたします。

ページネーションGem「kaminari」の導入〜表示の方法は<a href="https://qiita.com/study_matome/items/7c25479e9ded4058a05e">前回の記事</a>でご紹介しています。

今回はデザインを適用させる過程等を記事にまとめました。

### HTML　・　CSSの適用

##### 完成図

![スクリーンショット 2022-05-25 12.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655769/d3641f38-d5ef-9ef8-3d32-c82150108285.png)

hoverで動きを出した動画

https://gyazo.com/ad3cf10a453b9cf1a76b3d08996cb127

---


ページネーションをつけたいビューに以下を追加して作成しました。
（＜　１２３　＞などの表示を変える方法は前回でご紹介しています。
＜　＞のデザインに関しては、こちらの記事で紹介しています）






```hlml.erb
  <div class="item__paginate">
      <%= paginate @items %>
  </div>
```
↑ 基本的には 「paginate @items」でページネーション自体は表示されますが、
hlml.erbでは、他のCSSとの兼ね合いを保つためにdiv classを追加しています。

```style.css
/* ページネーションの装飾 */

/* 自分で指定したdivタグ */
.item__paginate{
  width: 100%;
  margin: auto;
}

/* ページネーション全体 */
.pagination{
  text-align: center;
  display: flex;
  justify-content: center; 
}

/* ページネーションのspan */
.pagination span{
  text-align: center;
  width: 50px;
  font-size: 20px;
}

/* ページネーションのリンク文字（a） */
.pagination a{
  color: #818181;
  display: block;
  width: 100%;
  height: 100%;
  font-weight: bold;
  padding: 10px;
}

/* ページネーションの文字にカーソルを載せた時 */
.pagination a:hover{
  width: 50px;
  height: 50px;
  background-color: #84b8eb;
  color: #FFF;
  border-radius: 100%;
  padding: 10px;
}

/* 現在のページの数字についての表記 */
.current{
  font-weight: bold;
  color: #84b8eb;
  padding: 10px;
}

```

### 「次へ >」 や 「< 前へ」　を表現する記号の表示について



以下の記事を参考に「　Font Awesome　」を導入しました!

https://qiita.com/rio_threehouse/items/313824b90a31268b0074




## 実装時に試したこと


###### display: flex;　と　justify-content: center;をつけない場合はどうなるか？

こちらでの表記を消すと・・・
```
.pagination{
  display: flex;
  justify-content: center; 
}
```

![スクリーンショット 2022-05-25 11.46.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655769/bf6f6e96-882a-a42a-cab8-fdd5781d7a63.png)
 

ぎゅっと詰まった感じになりました。
２つの記述を入れることでバランス良くなることを感じました。

----

###### pagination:hoverをつけるとどうなるか

```
.pagination:hover{
  background-color: #4084ae;
}
```

https://gyazo.com/2f78d85ce6f353359ba70a27384ddd90

今回は文字自体に変化をつけたため使用しませんでしたが、
このように背景自体が変化しました。


----


## まとめ

今回はページネーションのCSS装飾をご紹介しました。

![スクリーンショット 2022-05-25 12.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655769/d3641f38-d5ef-9ef8-3d32-c82150108285.png)

hoverで動きを出した動画

https://gyazo.com/ad3cf10a453b9cf1a76b3d08996cb127




----


Gemの導入については以下の記事でご紹介していますので、
ご興味がある方はぜひご覧ください！

https://qiita.com/study_matome/items/7c25479e9ded4058a05e


初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

こちらの記事が誰かのお役に立てれば幸いです。
Vue3+Firebase(v9)の初期設定

# やりたいこと

VueからFirebase(Cloud Firestore)に接続しデータを取り出す、という単純な仕組みを実装しようとしました。

しかし、技術ブログのサンプルコードや公式ドキュメントのコードを使ったところ、行き詰まりました。

# 解決のポイント

先に解決のポイントを書いておくと、主に次の通りです。

- Firebase v9 に従ったコードにする
- await をasync内に書く
- Firebaseコンソールにて、ルールを変更

# 公式ドキュメントのコード

Firestore公式ドキュメントのコードは[こちら](https://firebase.google.com/docs/web/setup?authuser=0&%3Bhl=ja&hl=ja)です。

最近Firebaseをインストールした方は、SDKのバージョンが9（v9）以上のはずです。v8以前とは書き方が若干違うようです。

技術ブログで紹介されているコードの多くは、v8に準拠したものに思われます。

基本的には公式ドキュメントのコードを参考にしましょう。

```jsx
import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";

// TODO: Replace the following with your app's Firebase project configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
    // ...
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);

// Initialize Cloud Firestore and get a reference to the service
const db = getFirestore(app);
```

```jsx
import { collection, getDocs } from "firebase/firestore";

const querySnapshot = await getDocs(collection(db, "users"));
querySnapshot.forEach((doc) => {
  console.log(`${doc.id} => ${doc.data()}`);
});
```

# 変更した箇所

公式の通りに書いてもエラーが出ます。なので、何箇所か修正します。

```main.js
import { createApp } from 'vue'
import App from './App.vue'
import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";

const firebaseConfig = {
// 省略
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
export default db; //追加
createApp(App).mount('#app')
```

設定ファイルの書き方です。

export default db を追加しています。

DBから読み込むコンポーネントを、仮にShowSample.vue とします（下のコードでは .js に変えています）。

そこには次の様なコードを書きます。

```ShowSample.js
import db from "../main.js" //追加
import { collection, getDocs } from 'firebase/firestore'
```

設定ファイルでexport した dbをimportします。

methods に、次の functionを作ります。

```ShowSample.js
getData: async function() { // async 追加
          const querySnapshot = await getDocs(collection(db, "users"));
          querySnapshot.forEach((doc) => {
            console.log(`${doc.id} => ${doc.data()}`);
          });

      }
```

公式ドキュメントでは awaitだけですが、それではこんなエラーが出ます。

```jsx
Unexpected reserved word 'await'
```

対応策として、async を使い、その内部にawait を入れる形にします。

ここまで変えても、つぎのエラーがでます。

```jsx
FirebaseError: Missing or insufficient permissions
```

ここで、Firebaseコンソール→Firestore Database の「ルール」へ行き、アクセス設定をテストモードに変更します。

```jsx
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
```

本番環境へ移る時には、設定変更が必要です。

ひとまず、テスト環境ではFirestoreから読み込むことができました。

# 参考

[Vue.jsでのasync,awaitの書き方](https://qiita.com/NT1123/items/d1051d360e1b1f9174ab) 

[FirebaseとVue.jsでデータ登録取得機能を構築してみた](https://qiita.com/dayjournal/items/0be1e581981ae4afc338)
iOSの端末識別方法って...(・・?

## リセマラスッカ...
リセマラしようと思いました。(iPhone12)
アプリ消しました。
再インストールしました。

アプリキャラ<「お帰りなさい！！」

...？
（一部、事実と異なる表現をしています）

## なんか覚えられてるんですけど
アプリ開発については詳しくないので推測ですが
デバイスからデータ削除しているにも関わらず、あちらが私の情報を持っているということは
あちらのAPIで取得できる端末情報とゲームデータを紐づけているんじゃあないかと。
取得できる端末情報なんて限られるから変えられるもんは全部変えようとしました。

### ① Apple ID
サインアウトして別アカウントでアプリを再度インストールしましたがダメでした。

### ② MACアドレス
端末識別といえばって感じで思い当たった。
でもWifiと4Gで変わるよな...
切り替えても覚えられてるし...
###### 後で調べましたが、iOSいくつからか勝手に切り替わるようになっていました。すごい
よって違う。

### ③ IDFV
ここからちょっと調べて知った情報です。
Appleさんはアプリが取得できる端末情報をかなり限定させているらしいです。
現状、まともに取得できる情報はこちらと、もう一つらしいです。

で、このIDFVというのはインストールしているアプリの開発者が同じであれば同じ値を生成するらしく
じゃあ、削除しても同じ開発者のアプリだから同じ値が返って識別できているわけか。
と思いましたが、端末からその開発者のアプリをすべて消したら値も変わるそうです。
じゃあ違うか。

### ④ IDFA
さっきのと名前が似てますね。
広告での追跡専用の識別値らしいです。
よく出てくる「トラッキング許可しますか」を拒否するとこの値はデフォルト値か何かが返るようになっているそうです。
僕はすべて拒否しているのでこれも違います。


IMEIなんかはもともと知ってましたがAppleさんは取得できるようにしていないらしいです。

## 結論
なんで？（同じ問題で答えを求めて覗きに来た方スミマセン...）
Youtube DATA APIで再生リストへの追加をNode.jsから行うメモ


[こちら記事](https://blog.n-t.jp/post/tech/youtube-data-api-insert-playlistitems/) をもとにこんな感じでまとめてみました。

認証周りのコードを書いてないのであくまでも自分用メモです。

`YYYYYYYYY`に再生リストのID、`XXXXXXXXX`にYoutubeのVideoIdを入れれば動きます。

```js
'use strict';

require('dotenv').config();

const tokenAuth = require('../libs/tokenAuth'); //トークンの認証
const {google} = require('googleapis');


const main = async params => {
    const credentials = process.env.YOUTUBE_DS_CREDENTIALS;
    const token = process.env.YOUTUBE_POS_BACKUP_TOKEN;
    
    const auth = tokenAuth(credentials, token);
    const youtube = google.youtube({version: 'v3', auth});

    try {
        const params = {
            part: 'id,snippet,contentDetails',
            requestBody: {
              snippet: {
                playlistId: 'YYYYYYYYY',
                position: 0,
                resourceId: {
                  videoId: 'XXXXXXXXX',
                  kind: 'youtube#video',
                },
              },
            }
        }
        const res = await youtube.playlistItems.insert(params);
        console.log(res.data);

    } catch (error) {
        console.log('The API returned an error: ' + error);
    }
}

main();
```

positionの箇所で再生リストのどこにいれるか指定できそうですね。
【Java】Hello, World!を出力する

## はじめに

最近、Javaの勉強をはじめました。
とりあえず、`Hello, World!`出力をやったのでメモ。

## 環境構築

まず、環境構築から。

コンパイルと実行を行うために、コンパイラとインタプリタが必要とのこと。
JDKをインストールすればOKみたいなので、インストールしていきます。

### JDKのインストール

JDKにも色々あるそうですが、今回は`Java SE Development Kit`を利用しました。
下記よりダウンロードできます。
[Java SE Development Kit](https://www.oracle.com/java/technologies/downloads/)

dmgがダウンロードされるので、手順に沿ってインストールすれば完了です。

ちなみに今回の環境は下記の通り。
- java: version "18.0.1.1"
- macOS: 12.3.1 (21E258)

## ソースコードの作成

`Main.java`を作成して、下記のコードを記述します。

```java: Main.java
public class Main {
    public static void main(String[] args) { //メインメソッド 最初に動く
        System.out.println("Hello, World!");
    }
}
```
この時、`クラス名`と`ファイル名`を同じにする必要があるので注意。（今回は`Main`）

## コンパイル

ターミナルを開きます。
`cd`で先程作成したファイル（`Main.java`）が格納されているディレクトリに移動します。

```
$ cd /*ディレクトリのパス*/
```
移動できたら、下記のコマンドを実行してコンパイルします。

```
$ javac Main.java
```
コンパイルに成功すると、`Main.class`が生成されます。

## 実行

コンパイルに成功したら、続けて下記のコマンドで実行します。

```
$ java Main
```

### 実行結果
```
Hello, World!
```
`Hello, World!`が表示されれば成功です。

## さいごに
Java入門という事で`Hello, World!`の出力まで行いました。
今後もSwiftの傍ら、javaも勉強していくので、ちょっとずつ記事にしていきたいと思います。

## 参考書籍

https://sukkiri.jp/books/sukkiri_java3
WinからMacに移行して困ったこと（とその対策）

中年駆け出しPHPerのおぎです。
一昨年の秋に異業種から小さな受諾開発会社のWebプログラマに転職し、そこではWin機で開発を行っていました。
なんやかんやあり、この春から自社サービス会社の開発エンジニアに再度転職、それに伴い開発機がMacになったのでその移行に伴い困っった諸々をまと自分なりの対策をまとめてみようと思います。

## 変換キーどこ？！問題
長年Winユーザーだった身としてはキーボード右上の変換キーがないのでまず日本語が打てない...
確かに慣れればスペースのすぐ横で切り替えられるので早いっちゃ早いのですが、半角／全角キーでのトグルに慣れた民としてはなかなか戸惑いました。（今は大分慣れてきました）

### 対策：Karabiner-Elementsでキーバインドを変更する
ある程度は慣れるしかないのですがですが、自分の場合キーボードはWinのものをそのまま流用し、[Karabiner-Elements](https://karabiner-elements.pqrs.org/)を使用して無変換キーを英数キーに、変換キーをかなキーにそれぞれ割り当てています。
また、そのままだとMacのキー配列と違いすぎるので
- CapsLock => controlキー
- Ctrl => cmdキー
にバインドして、更にMacの方も
- CapsLock => cmdキー
とバインドしてWinのときの手癖をそのまま再現できるようにしています。

参考：
[macOSで半角/全角キーを使って入力切り替え](https://colo-ri.jp/develop/2019/01/macos-ej-ime.html)

## 複数の外部ディスプレイが使えない？！問題
元々Win環境の時はノートPCを少し浮かせてメインモニタの横にサブモニターとして配置、メインモニターとターミナルやチャット用のサブモニターをDisplayPortのデイジーチェーン接続で接続して３枚体制で作業をしていたのですが、MacはDisplayPortによるデイジーチェーン接続をサポートしていない...

Win↔UbuntuはTypeCのハブの差し替えだけで済んでいたのですが、Macは１つのポートから複数のモニターを取れないのでどうしても別途HDMIないしTypeCからモニターを取る必要があります。

### 対策：なし
こればかりはMacOSの仕様上仕方ない部分なのでお仕事用とプライベート用の環境を切り替えるコストがどうしても少し高めになってしまいました...（何かいい方法をご存じの方がいれば教えて頂きたい！）

ちなみに最近プライベート用にMacMiniを買ったのですが、M1はそもそも１枚までしか外部モニターを挿せないというところでintelモデルしか選べませんでした...

## ターミナルのショートカット問題
前職ではWSL2内に開発環境を構築してVSCodeのRemoteWSLで開発するようにしていたので、開発は
1. Win+1 でターミナルを起動
2. 開発用のディレクトリへ移動
3. `docker-compose up -d`でコンテナを起動
4. `code . `

の4ステップで開発が可能でした。
プライベートのPCは主にUbuntuだったのですが、こちらもWin+1をalt+ctrl+tに置き換えるだけで、同様でした。
が、**Macはターミナル起動のショートカットがデフォルトでは存在しない**んですよね...

### 対策：automatorを使用してショートカットを登録
ターミナルの起動は、デフォルトでショートカット用意してほしかったな？という気持ちですが下記を参考にショートカットを自前で登録しました。まぁめんどいっちゃめんどいですが、１回登録すればあとはいつも通り...

参考：[Terminalをショートカットで一発起動する【Mac】](https://tanisukestr.hatenablog.com/entry/2018/05/07/230857)

## Dockerデーモン起動めんどい問題
Ubuntuではdockerデーモンを起動するようにインストール時にコマンドを一発叩いて登録しておけば後は特に何も意識することなくターミナルを起動すると同時にdockerコマンドを叩けました。が、MacOSは当然Linuxではないのでどうしても仮想Linuxをおいた上でDockerを稼働させる必要があり、基本的にはDockerDesktopを使うことになるかと思います。

（WSL上のUbuntuも一応ハックは必要なものの、基本的には起動してしまえばネイティブと変わらない）
参考：[Automatically Docker Daemon Boot on Windows Subsystem Linux（WSLにおけるdockerデーモンの自動起動）](https://qiita.com/Ningensei848/items/75adeb29bb143633d60c)

### 対策：DockerDesktopをログイン時に起動する設定にしておく
これで一応解決はするんですが、ちょっと立ち上がりがもっさりしているんですよね...
そこだけどうにかなってほしい...他の何か入力している時にGUIが起動して中断するのが地味にストレス...
（Macにおけるベターなプラクティスがあれば教えて欲しいです）

まだまだ使いこなせていないMacですが、引き続き仲良く慣れるように頑張っていきたいと思います...
~~（WinとWSLの世界線に帰りたい...)~~
CORSハンズオン

2022/09/02追記: ハンズオンをPrivate Network Accessに対応しました。

# CORSハンズオン

CORSを理解するためのハンズオンを書きました。

![無題の図形描画 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480312/e224b16e-dce5-40d5-7e73-de8a70763f64.png)

https://github.com/zeek0x/cors-handson

サーバ側のコードもいじりながら学べるようになっています。
CORSについて概要は知っているけれど、きちんと理解をしていない人向けになっています。
（調べた限りでは）インターネット上に同様の資料（サーバ側もいじりながらCORSを学習する資料）がなかったのが書いた理由です。
数十分で終わると思うので気軽にやってみてください。
三菱電機ブレーカー型番

## 配線用ブレーカー
125AFまではNV**-CVFを購入する。NV**-CVシリーズもあるが、一回り大きくDINレール取付不可。
### NV32-CVF 2P 30A 30mA スプリングクランプ
- NV:漏電遮断　NF:漏電検知なし
- フレーム：32 63 125
- 遮断可能電流　C:2500A S:7500A事故しても数千A流れることはまずないのでＣ。キュービクルはＳ。 
- VF:現行機種 -CSや-CVは一回り大きくDINレール取付不可。
- 相線:2P,3P
- 定格電流[A]：5 10 15 20 30 40 50 60 75 100　フレームぴったり32,63,125の指定もできる
- 漏電感度電流[mA]:15 30 100 迷ったら30mAにする。100mAはメインブレーカー用
- 結線：スプリングクランプ,ねじ締め

## モーターブレーカー
### NV32-SV 25A
- NV:漏電遮断　NF:漏電検知なし
- フレーム：32 63 125 225
- SV:モーターブレーカー
- 定格電流[A]:4 5 7.1 8 10 12 16 25 32 40 45 63 71 90 100 125 150 175 200 225
- 相線:3Pのみなので指定なし
- 漏電感度電流[mA]:切り替えスイッチ式なので指定なし。
- ねじ締めのみなので指定なし。
直入れの場合、配線用ブレーカーであれば定格出力の7倍、モーターブレーカーは定格出力の4倍が目安。
11kwモーターは配線用ブレーカーなら75AT モーターブレーカーなら45AT
https://www.mitsubishielectric.co.jp/fa/products/lvd/lvsw/ex/select/scale/index.html
古い低効率のモーターは抵抗が大きく始動電流が比較的小さい。
## MDUブレーカー
250A以上はNF-Cクラスでもいい。価格が許すならMDUブレーカーを買う。
キュービクル用　NF***-ZEVMB　可変　埋込型　パネル表示本体取付　B/NET
制御盤メイン用　NV***-ZEVMB　可変　表面型　パネル表示本体取付　CC-link
### NF250-ZEVMB　可調整　表面型　パネル表示本体取付
- NF:漏電遮断なし　NV:漏電遮断あり
- フレーム　250AF 400AF 630AF
- 定格短絡遮断容量 漏電測定なしS:85,000A H:100,000A　漏電測定ありZ:85,000A とりあえずZにする。
- 定格電流　可調整(フレームの半分から)　250AFのみ固定もあるが基本は可調整にする。
- 接続　F:裏面型	B:表面型	FP:埋込型　制御盤はB、キュービクルはFPにする。
- 表示ユニット　パネル表示/内臓表示　パネルにする。
- 表示ユニット取付　本体取り付け/延長別置　本体にする。
- 通信規格　B/NET,CC-link,Modbus-RTU(内臓表示ユニット非対応)
制御盤はCC-linkでPLCと接続。キュービクルはB/NETにしてMES3-255Bと接続する。GOT2000しかないならModbus-RTU。
令和になってからRS485ベースのMODBUS-RTU通信モデルが発売された。シリアル通信も当分現役。

## 単相三線用
キュービクルは内線規程(JEAC8001-1995)に従い、中性線欠相保護付のものを選定する。
制御盤内はNV-CVFの2Pで。
### NF63-NCV 50AT

- 定格電流[A]：5 10 15 20 30 40 50 60 75 100 125 150 175 200 225 フレームぴったり32,63,125,250の指定もできる
- 相線:1φ3Wなので指定なし
- 漏電感度電流[mA]:切り替えスイッチ式で指定なし。
- ねじ締めなので指定なし。
NF250-NCまでがV、NF-400NCからW、NV-NCはW

### 計器用変流器
計器用変流器
CW-**L:丸窓, CW-**LP:角窓 角窓にする。

### 指示計器
ME-110SSR-B (力率計測有　漏電計測無　B/NET通信)

### B/NET親機
電力データ収集サーバー:MES3-255B
B/NET用24V電源:B-PS3A
J2S→J4-RJ020への置き換えはDC24電源も用意する

MR-J2SサーボアンプからMR-J4サーボアンプへの置き換えに際し、
SSCNETの変換ユニットを使えばPLCとSSCNET側と触らずに更新可能。
MR-J2S-200B　→ MR-J4-200B-RJ020 +　MR-J4-T20
フルクローズド制御(外部エンコーダーを使った走行切断など)不可。

### アンプのモード切替
購入時はJ2S互換モードになっている。
J2S互換モードからJ4やJ3モードへの切り替えはMR Mode Changeを使う。
GXworks導入時ついでに入れるか聞かれるソフト。
020でないJ4アンプも同じ手順でJ3モードにできる。J3の工程で故障があったら使う。
![MR_Mode_Change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141264/fd6421ca-9d51-d231-5df8-7872a1552c6f.png)

### CN3への接続
J2Sは内部24V電源を持っているが、J4のアンプは外部から供給が必要。
更新の際は24V電源を用意し、CN3のDICOMとDOCOMにつなごう。

##### ケーブル
長さが合えば上優先。
- MR-TBNATBL__M　　0.5又は1m
- DG4SV2CB__　　0.5又は1.0又は5.0m。末尾にHの対屈曲10mもある。
- MR-J2HBUS__M　古い型式だが買える。

##### CN3端子台
ブレーキ有無、フルクローズド制御用エンコーダー有無で決めてもいい。ぜんぶMR-TB26Aでもいい。
- MR-TB26A 全接点ある。
- DG2SV2TB　ブレーキ出力無、エンコーダー入力無。　2軸、3軸用は末尾に2,3をつける。
- DG2BK1TB　ブレーキリレー内臓。ブレーキ用6点端子台TE2を持つ。エンコーダ入力省略。

#### 単軸CN3
|  ピン  |  記号  | 単軸CN3接続 |
| ---- | ---- | ---- |
|  1  |  LG  | アナログコモン |
|  2  |  DI1  | 前進リミット |
|  3  |  DOCOM  | 24V |
|  4  |  MO1  | アナログ出力A |
|  5  |  DICOM  | 0V |
|  6  |  LA  | エンコーダA相 |
|  7  |  LB  | エンコーダV相 |
|  8  |  LZ  | エンコーダZ相 |
|  9  |  INP | インポジション |
|  10  |  DICOM  |　0V |
|  11  |  LG  | エンコーダーコモン |
|  12  |  DI2  | 後退リミット |
|  13  |  MBR  | 電磁ブレーキ |
|  14  |  MO2  | アナログ出力A |
|  15  |  ALM  | 故障出力 |
|  16  |  LAR  | エンコーダA相 |
|  17  |  LBR  | エンコーダB相 |
|  18  |  LZR  | エンコーダZ相 |
|  19  |  DI3  | 原点ドグ |
|  20  |  EM2  | 非常停止 |

|  記号  | TE2接続 |
| ---- | ---- |
|  24V  | 24V供給 |
|  0V  | 0V供給 |
|  B1  | ブレーキ24V側 |
|  B2  | ブレーキ0V側 |
|  EMG2  | 緊急停止24V側 |
|  EMG1  | 緊急停止0V側 |

最低限の構成は8端子。
DOCOM 24V
DICOM 0V
B1,B2(B2は0V)
EMG1とEMG2を短絡


#### 多軸CN3
|  ピン  |  記号  | 多軸CN3接続 |
| ---- | ---- | ---- |
|  1  |  LSP-C  | 前進リミット |
|  2  |  LSN-C  | 後退リミット |
|  3  |  LA-A  | A軸エンコーダA相 |
|  4  |  LB-A  | A軸エンコーダB相 |
|  5  |  LA-B  | B軸エンコーダA相 |
|  6  |  LB-B  | B軸エンコーダB相 |
|  7  |  LSP-A  | A軸前進リミット |
|  8  |  LSN-A  | A軸後退リミット |
|  9  |  DOG-A | A軸近点ドグ |
|  10  |  EM2  |　非常停止 |
|  11  |  CALM  | 故障出力 |
|  12  |  MBR-A  | A軸電磁ブレーキ |
|  13  |  MBR-C  | C軸電磁ブレーキ |
|  14  |  LG  | 制御コモン |
|  15  |  DOG-C  | 近点ドグ |
|  16  |  LAR-A  | A軸エンコーダA相 |
|  17  |  LBR-A  | A軸エンコーダB相 |
|  18  |  LAR-B  | B軸エンコーダA相 |
|  19  |  LBR-B  | B軸エンコーダB相 |
|  20  |  LSP-B  | B軸前進リミット |
|  21  |  LSN-B  | B軸後退リミット |
|  22  |  DOG-B  | B軸近点ドグ |
|  23  |  DICOM  | 24V |
|  24  |  CIMP  | 全軸インポジション |
|  25  |  MBR-B  | B軸電磁ブレーキ |
|  26  |  DOCOM  | 0V |

三菱電機SCの案内
[MR-J2Sリニューアル置換え手引き](https://www.melsc.co.jp/business/renewal/mrj2s/pdf/x903120701j.pdf)

アンプ、モーター対応表
[MR-J2シリーズを代替機種MR-J4シリーズに置き換える場合の注意事項](https://www.seec.com.tw/UpFiles/10/GoodsDownload_Files655575436061077370/MR-J2%E7%BD%AE%E6%8F%9B%E7%82%BAMR-J4%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85.pdf)

置き換えの手引きは364ページもある。
[MELSERVO-J2-Super/J2MシリーズからJ4シリーズへの置換えの手引き](http://dl.mitsubishielectric.co.jp/dl/fa/document/catalog/servo/l03092/l03092a.pdf)

https://www.mee.co.jp/sales/fa/meefan/product_information/products/manuals/sales_fa_meefan_50js-050008ja.pdf

https://www.mee.co.jp/sales/fa/meefan/product_information/products/manuals/sales_fa_meefan_50en-070163jc.pdf
順番がバラバラの2つのCSVファイルを比較する

順番が入れ替わってしまっている2つのCSVファイルを比較して、実質一致しているかどうか、違うならどこが違うかを手軽に知る方法です。

## 比較する方法

**PowerShellを使います。**

以下のいずれかを実行します。どちらも全く同じです。

```powershell
Compare-Object (Get-Content a.csv) (Get-Content a.csv)
# または
diff (cat a.csv) (cat b.csv)
```

順番を無視すれば一致している場合は、**何も表示されません。**

不一致がある場合は、その行の内容が表示されます。

## 例

CSVファイルの内容が以下であるとします。

```csv:a.csv
id,name
1,sato
2,suzuki
3,takahashi
4,tanaka
```

```csv:b.csv
id,name
2,suzuki
3,takahashi
1,sato
```

上述したコマンドで比較すると、以下の結果が表示されます。

```
InputObject SideIndicator
----------- -------------
4,tanaka    <=
```

これは、左のファイルにだけ `4,tanaka` という行があることを示しています。

## 備考

`Get-Content` の代わりに `Import-Csv` でもよいです。

```
PS > diff (import-csv a.csv) (import-csv b.csv)

InputObject          SideIndicator
-----------          -------------
@{id=4; name=tanaka} <=
```
DataTables を使うまでメモ

# 前提
- Rails に [DataTables](https://datatables.net/) を導入
    - 手軽に導入するため CDN を使う

# 導入
対象画面の View ファイルで DataTables を読み込む

```haml:app/views/test.html.haml
= stylesheet_link_tag 'https://cdn.datatables.net/1.11.5/css/jquery.dataTables.min.css'
= javascript_include_tag 'https://cdn.datatables.net/1.11.5/js/jquery.dataTables.min.js'

...

%table.table.table-bordered#datatables-use-id
  %thead
    %tr

...
```

application.js で全 JS ファイルを読み込んでいる（`//= require_tree .`）ので、対象画面でのみ DataTable を使うように設定する（そのままだと全 View で DataTable を使おうとして、読み込んでないのでエラーになる）
対象 View に対応する JS ファイルを用意する

```js:app/assets/javascripts/test.js
$(function () {
  var datatables_use_id = '#datatables-use-id'

  if ($(datatables_use_id).length > 0) {
    $(datatables_use_id).DataTable();
  }
});
```

# 設定
デフォルトでも十分使えるが、設定も色々と行える

- 手軽に設定を変更したい
    - https://agohack.com/datatables-options/
- 拡張やプラグイン使うと色々できそう
    - https://datatables.net/extensions/index
    - https://datatables.net/plug-ins/index
- 個人的には、検索フォームの設定が便利
    - https://datatables.net/examples/api/regex.html
        - 検索対象が、デフォルトだとテーブル全体だけど、カラム単位にできる
        - また、検索値に正規表現を使える
[初心者向け]Rubyを手っ取り早く解説

# 導入
## Rubyのインストール方法と実行方法
[Windows](https://prog-8.com/docs/ruby-env-win)
[Mac](https://www.sejuku.net/blog/3958)
M1Macの場合、homebrewをインストールする時は、[Rosetta 2環境におけるHomebrewのインストール](https://zenn.dev/_lambda314/articles/63b851221a7016#rosetta-2%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bhomebrew%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を使うと、M1Mac特有のエラーを回避できて楽です。

# 解説
## 表示
```ruby
puts "Hello World!"
```
`puts`の後に表示したい文字列を書くと、表示されます。
表示させるような文字は、基本的に、`"`で囲みます。
```ruby
puts "Hello World!" #=> Hello World!
```
`#`以降はコメントになります。ここに何を書いても、プログラムの実行には影響しません。
以下読みやすいように、`#=>`の後に、`puts`で何が表示されるのかを書くことにします。

[「puts、print、p」の違いについて【Ruby入門】](https://zenn.dev/nagan/articles/ae479d26e6d2b0)
[ppの使い方](https://qiita.com/scivola/items/b4851f3ebe43a0dba9c5)
## 計算
```ruby
puts 9 + 3 #=> 12
puts 9 - 3 #=> 6
puts 9 * 4 #=> 36
puts 9 / 4 #=> 2
puts 9 % 4 #=> 1
puts 3 ** 3 #=> 27
```
上から順に、「足し算、引き算、掛け算、割り算、余り、べき乗」です。
数字の計算ができます。（数字は`"`で囲みません。）
## 変数
```ruby
a = 3
puts a #=> 3
a = 5
puts a #=> 5
```
aに3を入れて、aを表示しています。
aのようなものを、「変数」といいます。
変数は箱のような役割をしていて、数字や文字などを入れられます。
左辺には変数を、右辺には代入したい値を書きます。
同じ変数に2回目以降の代入をすると、値は上書きされます。

## 配列
```ruby
a = [100, 150, 200]
puts a[0] #=> 100
puts a[1] #=> 150
puts a[2] #=> 200
```
値がリスト状になっているものを配列と呼びます。
`[100, 150, 200]`で配列を作り、aに配列を代入しています。
配列は0番目から始まります。
取り出し方は`a[i]`で、i番目の要素を取り出します。

## ハッシュ
ハッシュは配列に似ています。「i番目」を取り出す代わりに、「文字列」などで値を取り出すものです。
```ruby
a = {"a" => 1, "b" => 2, "c" =>, 3}
puts a["a"] #=> 1
puts a["b"] #=> 2
puts a["c"] #=> 3
```
## for文
```ruby
for a in [100, 150, 200]
  puts a #=> 100 #=> 150 #=> 200
end
```
for文を使うと、繰り返しをします。

```ruby
for (変数) in (配列)
  (ここに繰り返したい処理を書く)
end
```
というように使い、配列から1つずつ取り出して変数に入れ、繰り返しています。

## if文
```ruby
a = 5
if a > 3
  puts "aは3より大きい"
end
# => aは3より大きい
```
`if`の意味は「もし」です。
もしaが3より大きかったら、`if`文の中身を通ります。
そうでなければ、`if`文の中身は通りません。
今回の場合は、aに5が代入されているので、`if`文の中身は通ります。
```ruby
a = 0
if a > 3
  puts "aは3より大きい"
else
  puts "aは3より大きくない"
end
#=> aは3より大きくない
```
`if`とセットで覚えて欲しいのが、`else`です。
`else`の意味は「でなければ」です。
もし`a > 3`だったら、`if`文の中身を通ります。
そうでなければ、`else`文の中身を通ります。
今回の場合は、aに0が代入されているので、`else`文の中身を通ります。
`a > 3`などの条件ですが、以下の記号が使えます。
 記号 | 意味 
 ---- | ----
 a == b | aとbは同じ
 a != b | aとbは違う
 a > b	| aがbより大きい
 a >= b	| aはb以上
 a < b  | aがbより小さい
 a <= b	| aはb以下

 記号 | 意味 
 ---- | ----
 a && b   | aかつb
 a \|\| b | aまたはb
 !a       | aでない

 記号 | 意味 
 ---- | ----
 true  | 真
 false | 偽

```ruby
a =
  if 1 + 1 == 2
    "命題は真です"
  else
    "命題は偽です"
  end
puts a #=> 命題は真です
```
上記のように、if文は、if文の中の通った方の処理の結果を返します。
なので、aには`"命題は真です"`が入ります。
ちなみに、elseが書かれていなくて、if分の中を通らなかった場合、`nil`(空) が返ってきます。

[3項演算子、倒置if](https://koooza.net/post-673)
[case文](https://style.potepan.com/articles/16209.html)
## 関数
```ruby
def hoge
  puts 1 + 1
  puts 3 + 5
end

hoge #=> 2 #=> 8
```
関数は複数行をひとめとめにしていつでも何回でも呼び出せるようにします。
```ruby
def 関数名
  (ここにまとめたい処理を書く)
end
```
というように書きます。

# 以上のコードでできること

1から10までの中から、3の倍数であるものを出力する
```ruby
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  if i % 3 == 0
    puts i #=> 3 #=> 6 #>= 9
  end
end
```
[類題（FizzBuzz）](https://qiita.com/Fendo181/items/425293e8e638d7fd7cea)

# 終わりに
あとクラスが残ってますが、今回は触れません。
お読みいただきありがとうございました。
Specification of SOME/IP Transformer, No.660, AUTOSAR R21-11(173) CP

Specification of SOME/IP Transformer, No.660, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_SOMEIPTransformer.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|Client-Service-Instance-Entry|The configuration and required data of a service instance another ECU offers shall be called Client-Service-Instance-Entry at the ECU using this service (Client).
|Field |a field represents a status and thus has a valid value at all times on which getter, setter and notfier act upon.
|Finding a service instance |to send a SOME/IP-SD message in order to find a needed service instance.
|Getter| a Request/Response call that allows read access to a field.
|Method |a method, procedure, function, or subroutine that is called/invoked
|Notifier| sends out event message with a new value on change of the value of the field.
|Request| a message of the client to the server invoking a method
|Response |a message of the server to the client transporting results of a method invocation
|SD |Service Discovery (see[2])
|Service|a logical combination of zero or more methods, zero or more events, and zero or more fields (empty service is allowed, e.g. for announcing non-SOME/IP services in SOME/IP-SD)
|Service Instance| software implementation of the service interface, which can exist more than once in the vehicle and more than once on an ECU
|Service Interface| the formal specification of the service including its methods, events, and fields
|Setter| a Request/Response call that allows write access to a field.
|SOME/IP| Scalable service-Oriented MiddlewarE ov



## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Glossary. AUTOSAR_TR_Glossary
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
[2] Specification of Service Discovery
AUTOSAR_SWS_ServiceDiscovery
[3] General Specification of Transformers
AUTOSAR_ASWS_TransformerGeneral
[4] Specification of Socket Adaptor
AUTOSAR_SWS_SocketAdaptor
[5] Specification of RTE Software
AUTOSAR_SWS_RTE
[6] Requirements on AUTOSAR Features
AUTOSAR_RS_Features
[7] System Template
AUTOSAR_TPS_SystemTemplate
[8] Specification of Platform Types
AUTOSAR_SWS_PlatformTypes
[9] Software Component Template
AUTOSAR_TPS_SoftwareComponentTemplate
[10] Requirements on Transformer
AUTOSAR_SRS_Transformer
[11] UTF-8, a transformation format of ISO 10646
http://www.ietf.org/rfc/rfc3629.txt
[12] UTF-16, an encoding of ISO 10646
http://www.ietf.org/rfc/rfc2781.txt
[13] SOME/IP Protocol Specification
AUTOSAR_PRS_SOMEIPProtocol
[14] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral
[15] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral
scikits.audiolabのインストール


ハマったので自分用にメモ.

## scikits.audiolab

MATLAB ライクな記法で wav の読み書きが可能な Python モジュール.  
[scikits.audiolab · PyPI](https://pypi.org/project/scikits.audiolab)

## 環境

- OS: macOS Mojave 10.14.6
- Python: 2.7.17

以下は先にインストールしておく.

- Homebrew
- pip

## 手順

1. libsndfile と PySoundFile のインストール

scikits.audiolab は libsndfile のラッパーになっているので, libsndfile がないとインストールできません.

```Terminal
$ brew install libsndfile
$ pip install PySoundFile
```

1. scikits.audiolab のインストール

```
$ pip install scikits.audiolab
```

以上です 🙂

## 参考

[Python on Mac: scikits.audiolab のインストール - 意識の高い LISP マシン](https://sky-y.hatenablog.jp/entry/2013/11/15/183949/)
Specification on SOME/IP Transport Protocol, No.809, AUTOSAR R21-11(172) CP

Specification on SOME/IP Transport Protocol, No.809, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_SOMEIPTransportProtocol.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|:--|
|SOME/IP| Scalable service-Oriented MiddlewarE over IP

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Glossary, AUTOSAR_TR_Glossary
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
[2] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral
[4] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture
[5] Requirements on SOME/IP Protocol
AUTOSAR_RS_SOMEIPProtocol
[6] SOME/IP Protocol Specification
AUTOSAR_PRS_SOMEIPProtocol
[7] Specification of PDU Router
AUTOSAR_SWS_PDURouter
Requirements on TTCAN, No.441, AUTOSAR R21-11,(170) CP

Requirements on TTCAN, No.441, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SRS_TTCAN.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

no

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[2] Glossary, AUTOSAR_TR_Glossary
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
[3] Requirements on CAN
AUTOSAR_SRS_CAN
[4] ISO 11898-4:2004 - Road vehicles - Controller area network (CAN) - Part 4: Timetriggered communication
[5] Requirements on AUTOSAR Features
AUTOSAR_RS_Features
[6] Main Requirements
AUTOSAR_RS_Main
[7] Specification of TTCAN Driver
AUTOSAR_SWS_TTCANDriver
[8] Specification of TTCAN Interface
AUTOSAR_SWS_TTCANInterface
[9] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGenera
【Go】OpenAPI Generatorでコード生成時modelにCustom Struct Tagを出力する

## 概要
Goには、OpenAPIで定義したyamlをコード出力するツールがあります。概要については[OpenAPI GeneratorでGoのAPIサーバー/クライアントコードを自動生成する](https://qiita.com/saki-engineering/items/b20d8b6074c4da9664a5)の記事で、解説されています。
出力するコードにはmodelのstructも含まれるのですが、例えば[Ginでバリデーションを使ってみる](https://k01ken.hatenablog.com/entry/2021/07/14/234834)で紹介されているような、Custom Struct Tag（ginだと`binding`）を、出力したいという場合もあると思います。
今回は、OpenAPIでCustom Struct Tagを出力したい場合どうするかというのをメモ書きします。

## 対応方法
[goswaggerのCustom extensions](https://goswagger.io/use/models/schemas.html#custom-extensions)のドキュメントにある通り、yamlに`x-go-custom-tag`で、Custom Struct Tagを設定すれば出力してくれます。

## 設定サンプル

以下がyamlファイルに設定する、リクエストのmodelのサンプルです。

```yaml
SampleRequest:
  title: SampleRequest
  type: object
  properties:
    name:
      type: string
      x-go-custom-tag: binding:"required"
    email:
      type: string
      x-go-custom-tag: binding:"required,email"
  required:
    - name
    - email
```

以下のように、コードでbindingのStruct Tagが出力されます。
```go
type SampleRequest struct {
	Name string `json:"name" binding:"required"`
	Email string `json:"email" binding:"required,email"`
}

```
LaravelからVueへの値の受け渡しに関するメモ

LaravelからVueへの値の受け渡しの際にちょっと躓いたことが有ったのでメモ。

・blade内にコンポーネントタグを挿入する場合の例です。
・Vue側には受け渡したいプロパティが定義されている前提です。

環境
Laravel：6～9くらいまでなら基本同じだと思います。
vue：2


## 文字列以外の受け渡しには`@json`を使っておく

例えば真偽値を渡したいときに
`<component :example="{{ 1 + 1 === 2}}"></component>`
としてもtrueは渡せません。
`<component :example="@Json(1 + 1 === 1)"></component>`
上記のように`@json`を使えばtrueが渡せます。

下記サイト様は詳しく説明してくださってます。

https://blog.capilano-fw.com/?p=8367#_Vue

## `@json`を使うなら {{ }} は、いらない
当然ですが`@json`は`@if`などと同じディレクティブなので、 {{ }}で囲む必要はありません。

## コロンの有無は、静的か動的かの違い。
これはVueの仕様の話ですが一応。
例えば、
`<component :example="hello"></component>`
とした場合、エラーになります。
helloは静的な値なので、exampleの前のコロンを取って
`<component example="hello"></component>`
としてやればOKです。

ちなみに、当然と言えば当然ですが
`<component :example="{{$something}}"></component>`
上記のような形でLaravel（php）側の変数を入れる場合、
Laravel側から見れば$somethingは動的な値ですが、
vue側から見れば静的な値なので、この場合もコロンは要りません。
`<component example="{{$something}}"></component>`
としてやればOKです。


Vue公式

https://jp.vuejs.org/v2/guide/components-props.html#%E9%9D%99%E7%9A%84%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E5%8B%95%E7%9A%84%E3%81%AA%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97
Laravel Larastan のインストール

https://qiita.com/ucan-lab/items/8eab84e37421f907dea0

Larastanの解説をこの記事に移しました。

## Larastan

https://github.com/nunomaduro/larastan

Larastanは静的解析ツールPHPStanのLaravel用のラッパーライブラリです。

## 環境

- PHP: 8.1.5
- Laravel: 9.12.2
- Larastan: 2.1.6

## インストール

```shell-session
$ composer require nunomaduro/larastan --dev
```

設定ファイルを作成します。

```shell-session
$ touch phpstan.neon
```

```phpstan.neon
includes:
  - ./vendor/nunomaduro/larastan/extension.neon

parameters:
  paths:
    - app
  level: 6
```

## Larastan 実行

```shell-session
$ ./vendor/bin/phpstan analyse
```

## GitHub Actions

```.github/workflows/larastan.yml
name: Larastan

on:
  - pull_request

jobs:
  larastan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.1

      - name: Install Dependencies
        working-directory: ./src
        run: |
          composer install -q --no-ansi --no-interaction --no-scripts --prefer-dist

      - name: PHPStan Analyse
        working-directory: ./src
        run: ./vendor/bin/phpstan analyse
```

## 参考

https://blog.shin1x1.com/entry/getting-stated-with-phpstan

https://speakerdeck.com/hirak/php-static-analysis

https://qiita.com/shimabox/items/df03dde8bd6db4733231
PDFを閲覧＋αするクロム拡張の楽な作り方

# 連載一覧
- **[PDFを閲覧＋αするクロム拡張の楽な作り方](https://qiita.com/largetownsky/items/1cb016598824b7ea1b1e)**
  - クロム拡張でWeb上のPDFファイルを閲覧できる様になる
  - ただし、URLは謎形式で手入力する必要あり
- **[PDFを閲覧＋αするクロム拡張の楽な作り方②](https://qiita.com/largetownsky/items/fe854ea78960816538e5)**
  - 普通のURL入力やリンククリックのPDF閲覧に対応
  - 普通にPDFビューアとして使える様になる
- **[PDFを閲覧＋αするクロム拡張の楽な作り方③](https://qiita.com/largetownsky/items/e61624ba8be7e1d50fed)**
  - PDF閲覧に独自処理を追加

# 背景
Web上のPDFファイルの閲覧に機能追加するなら、以下の構成が一般的の様です。

- [PDF.jsライブラリ](https://mozilla.github.io/pdf.js/)を使う
- [UI関連イベントの処理を実装する](https://g-weblog.com/blog/4)
- 独自処理を追加する

この構成だと、UI関連イベント処理が面倒なので、以下の構成で楽にPDF上に独自処理を追加できる方法をまとめます。

- PDF.jsライブラリ付属のviewerにUI関連処理を丸投げする
- 独自処理を追加する

自作ツール

https://twitter.com/TownLarge/status/1529040999279824896

への機能追加の関係上、クロム拡張での実現方法を説明しますが、それ以外の環境にも簡単に流用できるでしょう。


# 最速でPDFファイルが見えるクロム拡張にする
## クロム拡張の設定
まず、クロム拡張を作っていく空のフォルダを適当に用意してください。そこに、以下の中身のmanifest.jsonファイルを追加します。
```
{
  "name": "PDF test",
  "version": "1.0.0",
  "manifest_version": 3,
  "description": "PDF viewer",
  "host_permissions": [
    "<all_urls>"
  ]
}
```
host_permissionsは、PDF.jsのビューアにWeb上のPDFを読み込ませるために必要です。これが無いと「Fail to fetch」のエラーが出て閲覧できません。

## PDF.jsのダウンロードと配置
[PDF.js](https://mozilla.github.io/pdf.js/getting_started/)から、Prebuilt版をダウンロードします。ダウンロードしたzipの解凍フォルダを、クロム拡張フォルダに配置してください。

- クロム拡張フォルダ
  - pdfjs-2.14.305-dist（※バージョン番号が違う場合、適宜読み替えてください）
    - webフォルダなど

という構成になっているはずです。

## PDF.jsの微修正
このままでもビューアは動くのですが、閲覧できるPDFに強い制約が掛けられており、Web上のPDFを読むとブロックされてしまいます。

![originError.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1747214/2118ae52-46f2-09e9-f1f8-c78a2d644762.png)

解除するには、以下の修正をします。

### 修正対象のファイルを探す
- クロム拡張フォルダ
  - pdfjs-2.14.305-dist
    - web
      - viewer.js

### 修正する
以下の処理をコメントアウトする。
![originErrorBypass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1747214/565344c4-a13f-b867-c8d7-d68c45f6b750.png)

本来この処理は、[下記の事態を防止するための措置](https://github.com/mozilla/pdf.js/pull/6916)ですので、このリスクがある場合、別途対処が必要です。

- 他ホストのPDF描画処理を不正に押し付けられる
- XSS脆弱性などと組み合わせて、任意のPDFをあたかもそのホストの正規の文章の様に見せかける

## クロム拡張を読み込む
### クロム拡張画面に行く
![ext1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1747214/92806fdf-ce2c-4410-edbb-59a0134a88bf.png)
### デベロッパーモードにして読み込む
※この設定変更により、Googleの審査を受けていない任意のクロム拡張を読み込める様になります。自作ならともかく、悪意のあるクロム拡張も読み込めてしまいますので、心配な方は試した後に解除してください。

![ext2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1747214/315a869d-820a-4649-7150-ec142d740ab2.png)
最後に出てきたダイアログで、クロム拡張フォルダを指定すると、以下の様に自作クロム拡張が登録されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1747214/93f6f55c-b9b8-406d-5870-9857798c4937.png)

ID部分は、人によって違います。後で使うので、メモ帳にでもコピーしておいてください。

## PDFを閲覧する
ここまで来たら、あとは表示するだけです。URLに
- chrome-extension://[クロム拡張ID]/pdfjs-2.14.305-dist/web/viewer.html?file=[PDFのURL]

と入力して、クロム拡張内のページにパラメタとしてURLを渡せばPDFを表示できます。上記のクロム拡張IDだと、
- chrome-extension://cgpanakihchdinnbpaddhfhajpgafeab/pdfjs-2.14.305-dist/web/viewer.html?file=https://www.ipa.go.jp/files/000017316.pdf

とかになります。PDF.js内のビューアに処理を丸投げしているので、ズームやページジャンプなども最初から使えます。

## 続く…
次回、PDFファイルのURLをクロム拡張内URLにリダイレクトすることで、普通にPDFビューアとして使える様に拡張します。
~~「WebRequestが無いならdeclarativeNetRequestを食べればいいじゃない」~~
PHPの設定について

## 自己紹介

はじめまして、日本システム開発株式会社の藤井といいます。
業務でPHPを触ることが多く、勉強してみようと思ってドキュメントを読み、役立ちそうな内容を記事にまとめています。
記事の内容は大体[php.net](https://www.php.net/manual/ja/)に書いてありますが、ドキュメントを読むのが面倒くさいと思った方は、
ぜひこの記事を役立ててください。

## 設定の確認

設定は、phpinfoメソッド([詳細](https://www.php.net/manual/ja/function.phpinfo.php))で確認できます。
phpinfoメソッドはWebサーバー上で実行された場合はHTMLを出力し、CLIで実行された場合はプレーンテキストを出力するため、今回はWebサーバーを起動して設定の確認を行います。

### 1. Webサーバーの起動

```php
php -S localhost:80
```

### 2. 実行ファイルの作成

まず、Webサーバーを起動したフォルダにindex.phpを作成します。  
次にindex.phpにphpinfoメソッドを記載します。

```php
<?php
phpinfo();
```

### 3. 設定の確認

ブラウザのURL欄に[http://localhost/]と入力し、設定を確認します。

## 設定ファイルについて

PHPの設定はphp.iniに記載します。  
xamppをインストールした場合は、デフォルトでは「C:\xampp\php\php.ini」に保存されています。  
「;」がコメント、区切り文字「=」のキーバリュー方式で設定を記載します。詳細は[ドキュメント](https://www.php.net/manual/ja/configuration.file.php)を確認してください。  

## 設定項目について

PHPの各設定項目にはモードが存在し、設定可能な場所が決まっています。
詳細は[ドキュメント](https://www.php.net/manual/ja/configuration.changes.modes.php)に記載されていますが、

|モード  | 設定可能な場所 |
|---    |---       |
| PHP_INI_USER   | ユーザスクリプト(ini_set)、Windowsレジストリ、.user.ini |
| PHP_INI_PERDIR | php.ini、.htaccess、httpd.conf、.user.ini |
| PHP_INI_SYSTEM | php.ini、httpd.conf |
| PHP_INI_ALL    | どこでも設定可能 |

となっています。

各設定項目は[ドキュメント](https://www.php.net/manual/ja/ini.list.php)に羅列されています。  
基本的な設定は[コア](https://www.php.net/manual/ja/ini.core.php)に記載されており、拡張モジュールの機能は[例)セッション](https://www.php.net/manual/ja/session.configuration.php)などの形式でまとめられています。
テスト65

```vb
Sub regex_Date()

'正規表現練習
Dim reg As Object
Dim matches As Variant

Set reg = CreateObject("VBScript.RegExp")

'正規表現の指定
With reg
'    文字列の中で「yyyy/mm/dd」を含む日付を抽出...〆(･ω･ )ﾒﾓﾒﾓ
    .Pattern = "(\d{4})/(\d{1,})/(\d{1,2})"   'パターンを指定
    .IgnoreCase = True       '大文字と小文字を区別する(False)、しない(True)
    .Global = True           '文字列全体を検索する(True)、しない(False)
End With


Application.ScreenUpdating = False

With ThisWorkbook.Sheets("日付テスト")

    Set matches = reg.Execute(.Cells(7, 3).Value)
    
    Debug.Print matches.Item(0)
    
End With

Application.ScreenUpdating = True
Set reg = Nothing

End Sub


'Sub test()
'
'Dim tmp As Variant
'Dim tmp_Null As Variant
'
'tmp_Null = Null
'
'With ThisWorkbook.Sheets("日付テスト")
'
'    tmp = ExNz(tmp_Null, "1")
'
'End With
'
'
'End Sub
'
'Function ExNz(ByVal tmp_Val As Variant, Optional tmp_Val2 As Variant = Empty) As Variant
'    ExNz = IIf(IsNull(tmp_Val), tmp_Val2, tmp_Val)
'End Function
PSIRT ってなに？

## 勉強前イメージ

[CSIRT](https://qiita.com/miyuki_samitani/items/4ef0413640d05d9c6f99) じゃなくて？

## 調査

### PSIRT とは

Product Security Incident Response Team の略で、ピーサートと読みます。
自社で開発する製品、またサービスのセキュリティレベルの向上やインシデント発生時に対応を行う組織のことを指します。

### PSIRTの業務内容

- 自社製品のセキュリティ面での安全管理・ユーザサポート
- 自社製品から脆弱性が発見された際の対応
- 脆弱性関連の情報収集

### CSIRTとの違い

主に以下に違いがあります。

- PSIRT : `自社製品` のサービスのセキュリティレベルの向上やインシデント発生時に対応を行うチーム
- [CSIRT](https://qiita.com/miyuki_samitani/items/4ef0413640d05d9c6f99) : `自組織` サービスのセキュリティレベルの向上やインシデント発生時に対応を行うチーム

## 勉強後イメージ

CSIRTは自組織だけど、PSIRTは自社製品ってことか。
自社製品をセキュリティレベルで守ったり、脆弱性が出たら改修の対応をしたりってことね。

## 参考

- [PSIRT（ピーサート）とは](https://www.ntt.com/bizon/glossary/e-p/psirt.html)
- [IoT時代に重要なPSIRTとは？CSIRTとの違いも解説](https://www.hitachi-solutions.co.jp/security/sp/column/iot/05.html)
GitHubPagesの内容をGitHubActionsを使って自動更新する

PythonでQiitaApiから自分の記事一覧を取得し、コードを自動生成できるようになりました。
今回はGitHub Actionsを用いて、

1. QiitaApiから記事一覧を取得し、コードを自動生成
2. コミット、プッシュ
3. GitHub Pagesにデプロイ

の一連の作業を毎日朝の３時に実行できるようにします。ということで以下のworkflowを作成しました。

```~/github/workflows/update_articles.yaml
name: GitHub Pages cron deploy

on:
  schedule:
    # 分 時 日 月 曜日 コマンド  UTC時間
    # 毎日日本時間3時に実行(設定時間の9時間後が日本時間になる)
    - cron: '0 18 * * *'
  workflow_dispatch:
jobs:
  update_articles:
    runs-on: ubuntu-latest 
    # Python3がプリインストールされており、バージョンも特に気にしないため、actions/setup-pythonは今回は使わない
    name: Update constants/articles.ts and marge
    steps:
      # デフォルトブランチをチェックアウトする
      - uses: actions/checkout@v3
      # pythonモジュールをGithub Actionsコンテナ内に復元する
      - name: Setup python modules
        run: pip3 install -r requirements.txt
      # QiitaApiから記事を取得し、コードを自動生成するスクリプトを実行
      - name: Generate articles.ts
        run: python3 -B scripts/articles_generator.py constants/articles.ts
      # コミットしてプッシュ
      - uses: EndBug/add-and-commit@v9
        with:
          message: 'Update constants/articles.ts'
  deploy:
    # 上のjobが終わってから実行（設定しない場合並列に実行される）
    needs: update_articles

    runs-on: ubuntu-latest
    name: Checkout, build, deploy
    steps:
      # jobごとにコンテナが異なるのでチェックアウトし直す
      - uses: actions/checkout@v3
      # yarn (またはyarn install)でパッケージを取得
      - name: Restore packages
        run: yarn
      # ビルド（中身は環境変数の指定とnuxt build）
      - name: Build
        run: yarn generate:gh-pages
      # Github Pagesのブランチ(gh-pages)へdistフォルダの中身をデプロイ
      - name: Deploy (puth dist dir to gh-pages branch)
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./dist
          publish_branch: gh-pages
```

## 結果

今日の3時ごろに実行されていたようなのでOKです

https://github.com/sYamaz/website-nuxt/actions/runs/2379795524
TOTP とは

## 勉強前イメージ

わからんが、多分セキュリティ系
なんのやつでこの文字を発見したのかが思い出せない

## 調査

### TOTP とは

Time-based One-Time Password の略で、
ワンタイムパスワードのうち、時刻に同期されるものです。
乱数を用いて生成されて30秒～1分程度で切り替わります。

OATH規格というのがあり、これがTOTPの共通規格として採用しており
OATH規格に対応すればトークンによる認証が導入できます。

### TOTPを利用したトークン

Google Authenticator というのが最近使われています。
また、マイクロソフトもMicrosoft Authenticatorを提供しています。

### HOTP もある？

HMAC-based One-Time Password の略でHOTPというワンタイムパスワードの方式で
サーバと連携してからの認証回数をかけ合わせてワンタイムパスワードを生成するものになります。
しかし、これはサーバとトークン側で回数のズレが発生しやすいためTOTPが現在は主流です。

## 勉強後イメージ

時間によって変わるから結構セキュア何じゃないかと思う。
前は時間が+9されて無くてずれてたからいつまで経っても認証できなかった

## 参考

- [2要素認証のTOTPとHOTP、どちらがより安全か？](https://blog.ohgaki.net/2fa-totp-hotp-which-is-safer)
- [SMS認証の仕組みと危険性、「TOTP」とは？　「所有物認証」のハナシ](https://www.itmedia.co.jp/news/articles/1904/08/news026_3.html)