OmniAICreator/Qiita-1.07M huggingface dataset:
setupapi.libをC++Builder・64bitアプリでリンクする方法


QueryDosDeviceWなどのAPIを使って、特定のベンダIDとプロダクトIDをもつUSBがどのドライブに割り当てられているかの情報を取得する為に、いったんサンプルを作って、
```
 #pragma	comment(lib,"setupapi.lib") 
```
でsetupapi.libをリンクして色々すると上手く取れたので、いざアプリに作り込もうとすると、

```
[ilink64 エラー] Fatal: Unable to open file 'SETUPAPI.LIB'
```
と言われてしまってリンクできない。
色々調べまわって結論、C++Builderで64bitアプリを作成する際にリンクするのは*.libではなくて*.aだということを忘れていました。
サンプルは32bitで、本番アプリは64bitで作ってたんです。

なので、当たり前なんだけどリンク部分を
```
#pragma	comment(lib,"setupapi.a")
```
に変更すると上手くいきました。

こんなあほなことで時間を溶かす人は他にいないかもしれないですが、どなたかのお役にたてれば幸いです・・・

ちなみに解決に直接関係ないけど参考にしたサイトです。
ちゃんとsetupapi.aでリンクしてるのに上手くいかないという方はこちらのサイトを参考にするとヒントがあるかも。
http://www.cppfans.com/vcl/victorcomm/yb_comm_questions.asp
cscの作法 その292

# 概要
cscの作法、調べてみた。
Windows10のロック画面の画像をコピーしてみた。

# 参考にしたページ

https://qiita.com/ryotuxtuki/items/10b942f3b1a48482d055


# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc lock0.cs

```


以上。
タスクのスタックサイズをどう決める？

前回まで「組込ソフトウエア開発概説」として組込機器のソフトウエア＝ファームウエアの構成要素について一通り書いてきましたが、そちらでは書ききれなかったことや、後から思いついたことなどをときどきスポットでも書いていきます。

今回の話題は、<b>「タスクのスタックサイズをどう決める？」</b>です。

まず、ファームウエアを「iTRON OS + デバイスドライバ・ミドルウエア + 自社開発したアプリケーション」という王道とも言える構成とした場合、ファームウエアの中には「タスク」という一連の処理を繰り返し行うプログラムがたくさんあって、それらは並行して動きます。OSの回（https://qiita.com/Cente_mw/items/fadfd723ed8e8b81ce13 ）でも触れましたが、同時に複数の処理を並行実行させたいのであれば、iTRON OSのタスクを使った方がプログラムの見通しと切り分けが良くなります。

タスクについて、もう少し正確にはiTRON仕様書（https://www.tron.org/wp-content/themes/dp-magjam/pdf/specifications/ja/TEF024-S001-04.03.03_ja.pdf ）の第3章 3.1 (1)に以下のような説明があります。

>プログラムの並行実行の単位を「タスク」と呼ぶ．すなわち，一つのタスク中のプログラムは逐次的に実行されるのに対して，異なるタスクのプログラムは並行して実行が行われる．ただし，並行して実行が行われるというのは，アプリケーションから見た概念的な動作であり，実装上はカーネルの制御のもとで，それぞれのタスクが時分割で実行される．

つまり、並行処理は見た目のお話で、実際には「こっちのタスクをちょっと実行して、その状態や変数内容を一時的にメモリに記録して、次のタスクの状態や変数内容をメモリから読み出して前回止まったところから再開...」ということを繰り返しているわけです。OSなし環境だとこれに近いことを自分で実装することになるので実装難易度が高い、ということをご理解いただけるかと思います。

タスクについてここではこれ以上踏み込みませんが、ファームウエアエンジニアとしてはそれぞれのタスクの情報を一時的に保持するメモリ＝スタックのサイズをどうするかが迷いどころだったりします。組込機器向けCPUでは内蔵RAMも256Kbyteなど、それほど大きくありません。無駄な「余裕」は極力排して、将来の機能追加ができるような余裕を残しておきたいところです。ネットワーク通信機能を持った組込機器ではタスクが数十になるケースも多く、何も考えずに全タスクに8Kbyteのスタック割り当てなんてことをすると30タスクあったらそれだけで240Kbyteも使ってしまいます。

基本的には以下の合計に余裕を持たせた値にします。
<b>A</b> タスクプログラムおよびそこから呼び出す関数のオート変数サイズの合計
<b>B</b> OSがタスクで作業領域として使用するメモリサイズ
<b>C</b> 呼び出すiTRON OSのAPIで消費するメモリサイズのうち最大のもの
<b>D</b> 呼び出すデバイスドライバ・ミドルウエアのAPIで消費するメモリサイズのうち最大のもの

Aは自分で数えれば良いですが、B～Dはそれぞれのユーザマニュアルに記載があるはずです。特にない場合はそれほど大きく消費しない（感覚としては高々100byte程度）と考えて良いと思います。それで自社アプリケーションタスクのスタックサイズを例えば1024byteとした場合、それが本当に正しいのか確認しましょう。開発ツールによっては、スタック消費量を算出する機能がありますので探してみてください。

消費スタックサイズの計算方法の基本的な考えとしては、最初から各タスクのIDなどでスタック領域を埋めておき、一通り動作させたあとでスタック領域のどこまで別の値に変わったかを調べます。もちろん、偶然同じ値に上書きしたケースや、確保したがその動作では書き換えしなかったケースは検出できませんが、そういうレアケースは長期間運用テストなどであぶり出しましょう。

<h3>★Centeでは...</h3>
前回の記事でご紹介したシェルのコマンドの一つとして「tsk」を用意しています。上記の方法でスタックサイズと消費パーセンテージをタスクごとに一覧表示できますので、ファームウエアを実行させながらときどきtskコマンドでスタック消費度合いを確認することができます。

これほどまでに我々はスタックサイズにおびえているのですが、それはスタックオーバーフローによる症状が<b>「初見殺し」</b>と言えるほどいやらしいから、という理由も大きいです。<br>スタックオーバーフローになったらまず間違いなくファームウエアが「落ち」ます。プロテクトメモリではない組込環境では、スタックオーバーフローは隣のタスクのスタックを浸食することになりますので、全く関係のない隣のタスクの処理が不正になって落ちます。<br>落ちたという現象だけから追っても、あるタスクが突然内部変数が不正になって落ちたことしかわかりません。しかもその関係ないタスクをステップ実行させるなどするとスタックオーバーフローになるタイミングも変わって、やるたびに落ちる行が変わったり、しまいにはステップ実行では落ちなくなったりします。<br>「何かの処理を追加したら、わけのわからない落ち方をするようになった」という話を聞いたら、我々は真っ先にスタックオーバーフローを疑います。「どのタスクが落ちたか」よりも「その隣のタスクは何か」「そのタスクに処理を追加したか」を追うと、スタックオーバーフローを見つけられるかと思います。<br>ただ、タスクに処理は追加していないものの、呼び出すライブラリ関数をVer.Upしたらよりスタックを消費するようになったというケースもあるかもしれません。<br>結局、調査結果の倍くらいのスタックサイズにしておくと安心度は高くなりますが、一方で冒頭に書いた通り必要最小限に抑えたい要求も高く、面倒な問題の一つであることは確かです。


<h3>■今日の閑話</h3>
ファームウエアがなんらかの原因で無限ループに入ったり例外に飛んで通常動作しなくなることを指して、みなさんはなんと表現しますか？私は前述の通り「落ちる」派です。たぶん他にも「クラッシュ」「フリーズ」「死ぬ」などいろいろな呼び方があるでしょう。ミドルウエアサポートのお仕事をしているとお客様によって表現が違っていますが、まずは具体的にファームウエアのどこでどういう状態になっているかを確認していただくところから始まります。
<br>
<br>

Cente：
https://www.cente.jp/

お問合せはこちら：
https://www.cente.jp/otoiawase/
Pythonのf文字列の便利な使い方

f文字列の知らない使い方があったためメモ。

変数`x`の値を`x = 1`のように`変数名 = 変数の値`と出力したいときに、
```python
x = 1
print(f"x = {x}")
```
とやってもよいですが、<strong>Python 3.8以上</strong>では
```python
x = 1
print(f"{x = }")
```
とすると
```
x = 1
```
と出力されるようです。
クロス集計表を作成する2＊2_統計量(SPSS Modeler データ加工逆引き11-11)

# クロス集計表を作成する（2＊2_統計量の集計表）

![スクリーンショット 2023-02-08 10.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/510b3572-bf77-33bb-484e-526471cdd320.png)

## 1.想定される利用目的

・データ理解のための基礎統計量確認
・固定帳票の作成


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/cross_tabulation2_2s.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2023-01-23 10.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6e6b1a14-02c6-3d38-3f09-7462a640a2bc.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2023-02-08 10.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0787f599-aaaf-3e8c-9dd7-ad24884808b3.png)

b.　[フィールド作成]ノードを編集します。　[血液型]と[年代]を　[ >< ]で文字列結合します。　
![スクリーンショット 2023-01-23 10.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ebfc37da-4ec7-3b1d-8de1-64b5c5f193c2.png)

[プレビュー]します。
![スクリーンショット 2023-02-08 10.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/95da4123-8c0b-1026-5f22-668542aa4177.png)

c.[データ型]ノードで　[値の読み込み]ボタンを押して後続dのために合成変数の値を認識します。

d.[再構成]ノードを以下のように編集します。[合成変数]を[再構成フィールド]に移して[値フィールド]はブランクのまま[数値フラグを作成]を選択します。
![スクリーンショット 2023-02-08 10.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/23dd4809-2953-2894-3757-2c06f8d13be2.png)

[プレビュー]します。
![スクリーンショット 2023-02-08 10.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bfa2f8fc-6f7b-49e0-55bf-c5768decd340.png)

e.[レコード集計]ノードを以下のように編集します。
![スクリーンショット 2023-02-08 10.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/61519d16-d2f1-8bf7-cc10-66fae42b78a6.png)

f.[ソート]ノードで[年代]を[昇順]ソートします。

g.[フィルター]ノードで集計の過程で各フィールドに自動付与された[_Sum]を取り除きます。

h.[フィールド順序]ノードで適宜表示する列の順番を変更します。

[デーブル]ノードを実行します。
![スクリーンショット 2023-02-08 10.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f9b8c0ed-6590-37da-1929-a366342ca14e.png)

#### 注意事項

[再構成]ノードで列に展開するメンバーが表示されないときは前方でデータ型の[値の読み込み]を実行します。
Excelで表頭・表側を入れ子にすると表が見やすくなります。

## 4.参考情報

####  SPSS Statistics Custom Tablesと連携して多重クロス集計を作成する

https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-06/

####  カテゴリ値を列に展開してIDで集約　縦持ちを横持ちへ

https://qiita.com/416nishimaki/items/2519553c7cce0fc0b0e0

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Modalの共有ボリュームのパスについて

# はじめに
Modalを使っているときに共有ボリュームに入れたデータをコード上から利用しようとしたときに行き詰ったのでそのリファレンス
以下、パスの表現はLinux上で表現するものとする

# Secretsについて
起動前の環境変数等を設定できるやつ
設定しておくと、ローカルとリモートでパスの違いなどをほぞできる　（今回の記事のやつ）

# SharedVolume について

コード上で設定する下記のものについて、

```python
SHARED_VOLUME_NAME = 'sharedvolumename'
CACHE_PATH = '/cache'
shared_volumes={CACHE_PATH: modal.SharedVolume().persist(SHARED_VOLUME_NAME)}
```

ここでこのように設定した場合は、`CACHE_PATH` がルートディレクトリに設定されるため、相対パスを入力した場合はこれが最初につくようになる。そのため、

```
modal volume put [shared-volume-name] [localPath] [remote path]
```

でファイルを送信する場合、remote path に相対パスを入れると、`/cache/path...`になることに注意
また、リモートパスでパスの区切りは'/'で統一する。しない場合はパスが名前としてすべて同じ場所に保存される。

### 最重要
加えて、移動できたかどうかは以下のコマンドで確認することができるが、


```
modal volume ls [shared-volume-name] '/'
```

このように入力した場合は、一見`Linuxのルート`から表示していると思われるが、実際はCACHE_PATHで設定したパスをルートとして表示している。

# プログラム内からファイルにアクセス

プログラム内でファイルに絶対パスでアクセスする場合は、Linuxルートディレクトリから表記する必要がある。
そのため、最重要のところで指定したパスでアクセスしようとすると、ファイルが見つからない。
実際にアクセスするためには、`CACHE_PATH` + ファイルの場所となる。
ChatGPTを使ってみた

# はじめに
昨今、「ChatGPT」という文字をニュース・SNSで見る事が多くなり、いま最もアツい話題と言っても良いくらい世界中が注目しています。

この流れに乗らないわけにはいかないと思い、調べ始めたのがこの記事を書くきっかけになったのでした...

# ChatGPTとは
OpenAIがリリースしたAIテクノロジーを利用した自然言語処理ツールです。ユーザはChatGPTとチャット形式でやり取りするので、使い方はとてもシンプルです。
いま現在、誰でも無料で使用することができます。

下記、引用サイトにも書かれていましたが、ChatGPTは5日間でユーザ数が100万人を超えたというデータがあり、ますます興味が湧いたので実際に使ってみました。
(ちなみにですが、Instagramがユーザ数100万人を超えたのは75日間だそうです。)

https://kigyolog.com/article.php?id=1758

# 実際に使ってみた
試しにQiitaを使うメリットについて聞いてみました。
私よりしっかり回答できていてすごいです...
```
Qiitaを使うメリットは？
```
![Qiita記事画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163879/50fa53d2-fa5c-22d1-abe9-e6dfa5718790.png)

ChatGPTから素晴らしい回答が返ってきてなぜか悔しかったので、もう少し難しい要望をChatGPTにしてみます。
```
下記、要望をHTMLで実装してください。
・ある企業の公式HPのTOPページを作成してほしい。
・Webページのタイトルは、企業名である「株式会社ABC」を表示。
・TOPページの上部にはグローバルメニューである「企業情報」「ご提供サービス」を表示。
・TOPページの下部に「株式会社ABC」への問い合わせ情報であるMail「abc@abc.com」とTEL「012-345-6789」をリンクで表示。
```
![Qiita記事画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163879/687c0211-4206-08da-3f24-6fb84f7962a5.png)

もちろんコードが合っているかは検証する必要がありますが、ここまでコーディングしてくれるなんて驚きです...

# まとめ
ChatGPTは、まだ研究段階という事ですが、従来のチャットサービスと比べて、ユーザーが期待する回答が返ってくる確率が高いと感じました。

ChatGPTを使えば、新しいWebサイトなどを作成したいといったお客様がいた場合、要件を聞き、ChatGPTに大まかなデザインを伝えれば、簡単なモックのようなものを作成してくれるので、早いスピード感でお客様の要望に応えることができる可能性があるなと思いました。

ChatGPTがますます進化し、ググる時代の終焉がくるのか、引き続き注目したいと思います。
レイテンシーのp50とかp75とかp90とかってどういう意味？

## 経緯
自分が作ったAPIが遅い場合に先輩エンジニアから **「〇〇さんが作ったこのAPI、p90レイテンシーで上位に入ってるから見てみて」** とか言われたが**いや、「p90」ってなにぃぃ！！** となったので調べてみることにした。

DataDog等の性能測定ツールを見てみると「p50」とか「p99」とか書いてあるはず。

## 結論
**総アクセス数のxx%:レイテンシー(ms)**

つまりp90レイテンシーが300msの場合は
**総アクセス数の90%は300ms以下のレイテンシー**という意味になる。

## 参考
https://stackoverflow.com/questions/12808934/what-is-p99-latency
[Ruby on rails] formのセレクトボックスで表示する項目と保存するデータを分けたいんじゃ！！

# 目次
1.はじめに
2.完成コード
3.selectの使い方
4.最後に
5.参考文献

# はじめに
だんだんと暖かくなってきて嬉しいですね。
さて、以前業務の中でセレクトボックスを用いる開発に関わらせてもらう機会があり、そこでの学びをここに記したいと思います。

**セレクトボックスに表示する項目と保存するデータを分けたい。**

生きてればこんなこと三日に一回くらいありますよね。説明します。
railsの超基本だろバーカと思うかもしれませんが最近の気候と同様暖かく見守ってくださいね。

# 完成コード
先述した通り、やりたいことは以下のような感じ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842609/05becc71-bef6-132c-b2b2-9cf3d9ea4a1a.jpeg" width="400px">

「GIFT」を選択すればid=4、「クラスメイト」を選択すればid=7、というように保存したいという状況です。
早速ですが、完成コードはこんな感じ。
```
<%= form_with model: @hoge, url: hoges_path, do |f| %>
  <%= f.select :song_id, [['名もなき詩', 1], ['HANABI', 2], ['口が滑って', 3],・・・['ヒカリノアトリエ', 15]], { include_blank: true }, { class: "hoge" id="js-target-hoge"} %>
<% end %>
```
検証ツールで中身を見てみると、確かにvalueにidが登録されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842609/563f91d9-f514-5678-a5e1-e4aad36f4b62.png" width="600px">
※なお、form_withについては今回この記事では取り上げないこととします。下記サイトが特にわかりやすかったので参考までに。

https://pikawaka.com/rails/form_with

# selectの基本的な使い方
ということで、何となく察していることとは思いますが、selectの基本的な使い方は以下の通りです。
```
<%= f.select : 保存先のカラム名, [["選択肢１", "実際にDBに保存させる内容"], ["選択肢２", "実際にDBに保存させる内容"]], {オプション}, {HTMLオプション} %>
```
第一引数：
この「保存先のカラム名」については、form_withを用いる場合は任意のワードを設定できます。
**コントローラ側でどんな名前としてデータを受け取りたいか**という観点で命名しちゃってください。

第二引数：
ここでは、selectボックスに表示するデータ、保存するデータを設定します。
**配列**または**ハッシュ**で書いてあげてください。（上記のコードは配列です。）

第三引数：
ここでは、selectボックスのオプションを指定します。
以下の設定がよく使われるようです。気になる方は他も調べてみてください。
{ include_blank: true }　：　selectボックスの先頭に空の選択肢を表示する

第四引数：
ここでは、HTMLに関するオプションを設定します。
主にclassやidをここで指定するみたいです。
CSSやJavaScriptを当てたい時に使いたいですね。

# 最後に
初学者にとってはこういった、いかにも入門用技術書に書いてそうなことも実際の業務の中で触れると戸惑いますよね。わかります。
ともに頑張りましょう。あとミスチルは最高です。

# 参考文献
以下のサイトを参考に記事を書かせていただきました。

https://310nae.com/rails-selectbox/

https://qiita.com/kawakami_shotaro/items/11a677bf34136cb7686d
【Solidity】(tips)uintとintの上限下限値確認

intは符号付き整数、uintは符号なし整数ですが、その上限下限値確認方法を下記します。
型の上限値と下限値はtype(型).maxとtype(型).minで確認できます。
例えばint8とuint8の上限下限値を確認するには、下記のようになります。
int8の範囲は-128 〜 127 、uint8の範囲は0 〜 255なので、
maxUvalue：255、minUvalue:0、maxvalue:127、minvalue:-128

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

contract Sample {
 
    uint8 public maxUvalue = type(uint8).max;
    uint8 public minUvalue = type(uint8).min;
    int8 public maxvalue = type(int8).max;
    int8 public minvalue = type(int8).min;
     
}
```
TerraformでRDSを構築してみる

# はじめに
Terraformの勉強を始めたので備忘録を兼ねて行ったことを投稿しようと思います。
以下の３つの投稿内容を実施した上でRDSの構築を行なっています。
[TerraformをインストールしてTerraformでAWS上にEC2作ってみる](https://qiita.com/kakita-yzrh/items/1357a219b4a891a441ff)
[TerraformでIAMを設定してEC2にセッションマネージャー経由で接続してみる](https://qiita.com/kakita-yzrh/items/980f3209d587e7e349a6)
[Terraformでセキュリティグループを設定してEC2にhttp接続する](https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad)

# TerraformにRDSの定義を追加
### RDS接続用のセキュリティグループを定義する
今回、RDSへの接続はEC2から行います。
その為、RDSへの接続はEC2に付与されるセキュリティグループからのみ許可するようにします。
```terraform:securitygroup.tf
resource "aws_security_group" "test_rds" {
  name = "tf_test_rds"

  tags = {
    Name = "tf_test_rds"
  }
}

resource "aws_security_group_rule" "rds" {
  type                     = "ingress"
  from_port                = 3306
  to_port                  = 3306
  protocol                 = "tcp"
  source_security_group_id = aws_security_group.test.id
  security_group_id        = aws_security_group.test_rds.id
}
```
`source_security_group_id`に設定されたセキュリティグループIDのみ接続を許可
`aws_security_group.test.id`は以下で作成したセキュリティグループです
https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad#http%E6%8E%A5%E7%B6%9A%E7%94%A8%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E5%AE%9A%E7%BE%A9


### RDSインスタンスを定義する
RDSに関する情報を定義していきます。
```terraform:rds.tf
resource "aws_db_instance" "test" {
  allocated_storage       = 10
  engine                  = "mysql"
  engine_version          = "8.0.31"
  instance_class          = "db.t2.micro"
  storage_type            = "gp2"
  username                = "username"
  password                = "password"
  backup_retention_period = 0
  skip_final_snapshot     = true
  vpc_security_group_ids = [
    aws_security_group.test_rds.id
  ]
  tags = {
    Name = "tf_test"
  }
}
```
`vpc_security_group_ids`に定義したRDS接続用のセキュリティグループIDを設定

`password`は平文で設定するのは微妙ですが、今回はそのまま設定しています
パスワード生成用プロバイダーとSSM Parameter Storeを利用するとterraformのファイルには平文パスワードを定義せずに運用できるようですが、それはまた別の機会に

# Terraformで定義したセキュリティグループとRDSを作成
### Terraformのplan applyを実行
terraformのplan applyを実行して、AWS上にリソースを作成します。
```
terraform plan
terraform apply
```

# EC2に接続してRDSに接続する
### セッションマネージャーで作成したEC2に接続する
以下と同様にEC2に接続します。

https://qiita.com/kakita-yzrh/items/980f3209d587e7e349a6#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9Fec2%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B

### EC2にmysqlをインストール
```
sudo yum install mysql
```

### mysqlコマンドでRDSに接続する
```
mysql -u username -h RDSのエンドポイント -p
```
ユーザー、パスワードは`rds.tf`で設定したもの
ホストに設定するRDSのエンドポイントはAWSコンソールから確認

# 作成したリソースの削除
terraform　の destroyを実行して、AWS上のリソースを削除します。
```
terraform destroy
```

# さいごに
今回、`terraform destroy`した時にrdsの削除時にスナップショットを残す設定になっていたが`final_snapshot_identifier`を設定していなかった為、destroyでエラーになりました。
当たり前のことですがapplyできたものが正常にdestroyできるとは限らないことに練習の段階で気付けて良かったです。
化石エンジニアのリカレント教育、行きづまる→目標を立て直してQAを勉強してみる

 # 1.前提

長らくウォーターフォールでぬるま湯にたゆたっていた化石エンジニア・アンモナイトはある日、このままだと死ぬる（職業的に）と悟り、自分で自分にリカレント教育を始めた。
あまりにも知識が太古の記憶であったため、下記のような進化論を作成、少しずつ実行していった。

***

アンモナイトが考えた化石エンジニアの進化論： 

ふりだし：「アンモナイト＝太古の海中でたゆたってる化石エンジニア・Lv3」
　→アジャイル開始：Done!
　　→社外コミュニティ参加：Done!
　　　→スクラム経験：Done!
　　　　→CSM取得：Done!
　　　　　→常識（他社研修視聴）：Done!
　　　　　　→知識の深堀り＝Kaggle：in progress
　　　　　　　→知識の深堀り＝アプリ作成：To do
　　　　　　　　→あがり：陸上（肺呼吸）：人権を得る

***

しかし実務をしていないため、いったんDone！にした「常識」がてんで身についていなかった（あっさり忘れた）。
またKaggleを始めてみたものの、「次、どうしようか？」で立ち止まってしまう。果たして、実務でまったくPython触らないのに、Kaggleで進めるのだろうか？（←気づくのが遅い）
そこで、「なんらか役立つ知識の深堀り対象」を見直すことにした。

# 2.知識で勝負できるジャンルとは
「リスキル」「学び直し」とちまたでは言われているが、わたしのような怠け者が仕事をしながら簡単にできるわけがないのである。
簡単に習得できるスキルは単品勝負が難しいので、何かと組み合わせるとか、工夫が必要。
つまり、「そこそこ難易度があり」「第三者からも評価され」「市場価値を上げる」スキルが必要なのだ。

考えるに、いまからなんらかのプログラミング言語を自習のみで実践可能なまでに持っていくのは、熱しやすく冷めやすい性格的に無理があった。
また、化石（年代物）ということもあり、「家でやってました！」だけで人事にアピルのはキツイ。
実務経験がないのなら第三者にもわかりやすい成果物がないと（例：「一人で作ったアプリをストア公開しました！」「Kaggleでグランドマスターとりました！」「国際的な難易度の高い資格獲りました！」）評価されないのでは？

 **必要条件：今後の生存競争で役立つジャンル。できれば国際的な資格があるとよい**
 **十分条件：現場で役立つ（＝人権）。あと、え、英語ができるとよいな……。**

いままで下記の案A・案Bをやってみたが、挫折した。

　~~案A：1人でアプリをストア公開：~~
　作りたいアプリがあるので検討してみたが、いかんせん知識不足で完成させることができない
　ペアプロしたい

　~~案B：Kaggle：~~
　途方に暮れる

　案C：資格：
　……これ、か？


「現場」がヒントになりそうだ。
プロジェクトの流れや今までの経験から考えてみた。
特にアジャイルなクロスファンクショナルなチームだとどんな人が足りない？
「開発者はたぶん集まる」（いないとプロジェクトが始まらない）
「POはたぶん集まる」（いないとプロジェクトが始まらない）
「SMが少ない」（CSM、A-CSMは取得済）
「UIUXが少ない」
「QAが少ない（品質管理部門が別にあったり、自主的なテストやUATだけだったり）」
この「少ない」部分に入れればいいのでは？

# 3.検討結果＝QA

UIUX：
本を読んでみたが、相性が悪い。
相性が悪い理由：
不便を不便と感じない怠惰な性格のため、UIやUXにものすごく大きな穴でもない限り、「まぁいいか」で済ませてしまう。
わかりづらいなーと思っても、こういうものかーで終わる。
発明が一切できないタイプ。
※そもそもこの記事の読みにくさ・マークダウンのまずさを見れば、UIに対するセンスは「お察し」である。

<font color="Red">**QA：**</font>
本を読んで1日講座を受けてみた。おもしろかった。
設計段階で仕様を明確化できるのはすごくいい。
そしてコードを書かなくてもできるというところもすごくいい。

というわけで、「実務に役立ち」「相性がまだ悪いと判明していない」QAを学んでみることにしました。
わかっています、QAもすんごく深い領域だということは……。
付け焼刃や入門者・初心者がすぐに知識を使える人材になるジャンルではない。
ゆえに、最初の目標は「チームに貢献できるレベル」に設定。

 **このチームに合うテストプロセスってこうかな？と考えられるくらいになる。**
 **具体的にはJSTQBのファウンデーションレベルの知識がある。**

QA系の書籍を買い、「改めて、2023年はQAを学んでチームに貢献できるエンジニア（人権があるエンジニア）を目指すぜ！」となりました。

***

下記が修正後の進化論：

ふりだし：「アンモナイト＝太古の海中でたゆたってる化石エンジニア・Lv3」
　→アジャイル開始：Done!
　　　→スクラム経験：Done!
　　　　→CSM、A-CSM取得：Done!
　　　　　　→知識の深堀り＝QA：in progress
　　　　　　　→知識の深堀り＝JSTQBのファウンデーションを取得する：To do
　　　　　　　　→あがり：陸上（肺呼吸）：人権を得る

***

※この記事書いてる時点で2023年はすでに1/6が終わりつつある。というか、新年の抱負を2月の下旬に作ってるあたりで、この先についてはいろいろお察しください。
HTML・CSSで作成したサイトをGitHub Pagesを使って公開しよう！

# GitHub Pagesとは
サーバーや他のSaaSを利用せずに、無料でインターネット上へ公開できるツール。
ポートフォリオなどで作成したコードをインターネットへ公開したい場合、手間をかけることなく設定ができるためとても便利です！

# リポジトリの作成
はじめに、インターネット上へ公開するためのリポジトリを作成する。

![スクリーンショット 2023-02-20 8.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/e6548b8d-3329-06f1-2717-36dbc0f750a8.png)

HTML：index.html、CSS：cssフォルダをアップロードします。
![スクリーンショット 2023-02-20 9.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/8929fbc1-7a03-b73e-07b0-2ff70df14074.png)

index.html
```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>はじめてのGitHub Pages</title>
  <link rel="stylesheet" href="css/base.css">
</head>
<body>
  <h1 style="color: #aa0000;">はじめてのGitHub Pages①</h1>
  <h2>はじめてのGitHub Pages②</h2>
  <h3>はじめてのGitHub Pages③</h3>
</body>
</html>
```
css/base.css
```
h3 {
  color: #0000aa;
}
```

# インターネットへ公開するための設定手順
「Settings」の「Pages」をクリックする。
![スクリーンショット 2023-02-20 9.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/68521f19-fe98-69c9-bf1a-59811c7d72b3.png)

「main」ブランチを選択して、「Save」をクリックする。
他ブランチでも対応可能です！（mainブランチへマージする前に確認など）
![スクリーンショット 2023-02-20 9.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/3cc51c06-227d-86b7-441c-19771d770dd8.png)

設定が全て完了したため、ブラウザからアクセスして確認できます！
インターネットへの公開URLは *https://アカウント名.github.io/リポジトリ名* となります。
簡単に設定できるため、是非ポートフォリオや履歴書などで、有効活用してください！
![スクリーンショット 2023-02-20 9.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/a0554583-3bb8-9a69-c59d-84265abdaa1e.png)
ロボット実行前後の状況を「前処理/後処理ロボット」で定点観測してますか？

## はじめに

まれに発生するが原因の特定に至らない事象を、「再現待ち」という形でしばらく経過観測することがあります。

経過観測にあたっては次回こそ原因の特定につなげるための様々なモニタリングの仕組みを組み込んでおくことになります。

今回はモニタリングの一つの手段として、BizRobo!のスケジュール機能に用意されている「前処理/後処理ロボット」について紹介していきたいと思います。


## 前処理/後処理ロボットとは

スケジュール設定内に指定できるロボットで、ジョブ登録されたロボットが処理される前後に実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/cd3ea6fc-9f25-9254-e420-37bef48bb408.png)

指定できるロボットは「前処理」「後処理」ともに１つずつで、同一プロジェクト内に登録されているロボットをプルダウンから選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/5a1871cd-4190-5345-293e-69bb189a10a0.png)


:::note
前処理、後処理用のロボットはリポジトリ内に `Utilities` などのフォルダを作って配置しておくと、共通ユーティリティとして管理がしやすいです。
:::

スケジュール内では以下の単位で処理が連続して実行されます。「前処理」を含むスケジュールは前処理完了後にロボットのジョブが開始されるため、前処理の有無や長さによって実際のジョブ開始時刻が後ろにずれることになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/a35063b0-fe0e-7a8f-251f-200b6860784c.png)

前処理/後処理ロボットとジョブは「疎」の関係にあるため、前処理ロボットがエラーを出力して停止したとしても後続のジョブは影響を受けることなく実行されます。ジョブにエラーがあった場合の後処理ロボットの実行についても同様です。

## 定点観測における前処理/後処理ロボットの利用例

以下の観測と、基準に沿った是正

- ロボットが実行した時のファイルシステムの状態確認（特定フォルダ/ファイルの有無）
- ロボットが実行した時のプロセスの状態確認（特定プロセスの起動有無や状態）
- ロボットが実行した時のサーバリソースの状態確認（異常値有無）

ロボットがエラーを出力した時に原因がつかめず「どうやらサーバ上に生成される一時ファイルの有無がロボットの動作に影響を与えるようだ。」というような仮説が立った場合、ロボットがエラーとなる時とならないときで特定フォルダ内のファイルの状況（ロボットの外の環境）を比較することで、原因の特定や解決方法の発見につながることが期待できます。

このような場合にエラーとなるロボットの「前処理」としてスケジュールへ当該フォルダの状況をチェックしてログに出力する処理を入れておくことで、オンタイムに実データ（エビデンス）を取得することができます。

https://knowledge.bizrobo.com/hc/ja/articles/360062167111

## 前処理/後処理ロボット設定時の注視事項

注意事項ではなく、注視しておいた方がいいかなと思う点。
前処理/後処理ロボットは定常的な運用の中で使用するだけでなく、本件の様に経過観測として一時的にスケジュールに組み込むという使い方もあります。

時限的にスケジュールの設定を変えている場合は特に、コミットメッセージを設定することで「設定しっぱなしで忘れてしまった。あれ、これ何で前処理あるの？」という事態が防げると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/276e251c-e830-6650-653a-30f84af47c82.png)

https://qiita.com/ParakeetOnTheHead/items/e09ee4251627fff2160c

## まとめ

ロボットが稼働する環境の整備や後片付けなど業務フローに影響しない処理（マウンド整備のための「トンボがけ」と言っています）は極力ジョブの中に含めず「前処理」や「後処理」に切り出すことでロボットもシンプルになり、現場で作成するロボットの品質も上がりますね。

ジョブロボットが起動した後に、ロボットの処理として環境による場合分けをするのではなく、前処理の段階で常に同じ状態でロボットが動作できるようにトンボをかけておく方が運用も保守もシンプルになると思います。

前処理/後処理をうまく使うことで、ジョブとして実行するロボットをシンプルにできるといいですね。
Apple Silicon Mac上のLimaでx86_64版のUbuntu 22.04.1を走らせる方法

次のようにインストールします．

```zsh
brew install lima
```

x86_64版のUbuntu 22.04.1をインストールする場合は次のようなファイルを作ります．

```yaml:ubuntu2204-amd64.yaml
arch: "x86_64"
images:
- location: "https://cloud-images.ubuntu.com/releases/22.04/release-20221018/ubuntu-22.04-server-cloudimg-amd64.img"
  arch: "x86_64"
```

次のコマンドを実行します(かなり待ちます)．

```zsh
limactl start --tty=false ubuntu2204-amd64.yaml
```

`fail to download the image`と言われたら，上記 location がダウンしているか，新しいイメージに置き換わって古いイメージがなくなってしまったということです．その場合は，次のようにしてイメージを探します．

一般に下記を見ながらインストールするUbuntuのバージョンを探していきます．他のバージョンを入れる場合の応用になります．

https://github.com/lima-vm/lima/commits/master/examples/ubuntu.yaml

また，`limactl start ...`にて，`already exists`というようなエラーが出た場合には，次のようにしてコンテナのファイルを削除してから，`limactl start ...` を再実行します．

```zsh
rm -rf .lima/ubuntu2204-amd64
```

無事起動すると次のようなメッセージが出ると思います．

```
INFO[0237] READY. Run `limactl shell ubuntu2204-amd64` to open the shell.
```

そこで，表示されたコマンドを実行してみます．

```zsh
limactl shell ubuntu2204-amd64
```

すると次のようにUbuntuのシェルが立ち上がります．

```bash
username@lima-ubuntu2204-amd64:~$
```

ここでバージョンを確認してみましょう．

```bash
username@lima-ubuntu2204-amd64:~$ uname -a
Linux lima-ubuntu2204-amd64 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
username@lima-ubuntu2204-amd64:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.1 LTS
Release:	22.04
Codename:	jammy
```

Ubuntuを実行した後，抜けてMacのターミナルに戻るには `exit`とします．

```bash
username@lima-ubuntu2204-amd64:~$ exit
```

走らせているコンテナの一覧を出すには次のようにします．

```zsh
% limactl list                                   
NAME                STATUS     SSH                VMTYPE    ARCH      CPUS    MEMORY    DISK      DIR
ubuntu2204-amd64    Running    127.0.0.1:59387    qemu      x86_64    4       4GiB      100GiB    ~/.lima/ubuntu2204-amd64
```

コンテナを停止するには次のようにします．

```zsh
limactl stop ubuntu2204-amd64
```

その後，コンテナを削除するには次のようにします．

```zsh
limactl delete ubuntu2204-amd64
```
【DXレポート2.2】DX推進に必要な3つのアクション

# はじめに
巷で度々話題に挙がるDXレポートを読んでみました。
内容が小難しそうだったらリタイアしようかと思ったのですが…そこそこ理解できる内容だったので記事にしてご紹介します！

# DXレポートって？
**経済産業省**が設置した「**デジタル産業への変革に向けた研究会**」にて、協議されているDX推進についてのガイドラインや指標、課題点などがまとまったレポートが「**DXレポート**」です。
現在までに公開されているDXレポートは4つあります。
1.**DXレポート～ITシステム「2025年の崖」の克服とDXの本格的な展開～**
2.**DXレポート2**
3.**DXレポート2.1**
4.**DXレポート2.2**

# DXレポート2.2
今回紹介する「**DXレポート2.2**」では以下の内容が記載されています。
本記事では、具体的な3つのアクションの部分をご紹介します。

>**「デジタル産業への変革に向けた具体的な方向性やアクションを提示」
• 具体的には、企業に向けて以下3点のアクションを提示
✓ デジタルを、省力化・効率化ではなく、収益向上にこそ活用すべきであること
✓ DX推進にあたって、経営者はビジョンや戦略だけではなく、「行動指針」を示すこと
✓ 個社単独ではDXは困難であるため、経営者自らの「価値観」を外部へ発信し、同
じ価値観をもつ同志を集めて、互いに変革を推進する新たな関係を構築すること
• 上述を実現するための仕掛けとして、「デジタル産業宣言」を策定
• さらに、宣言の実効性を高めるうえで、デジタルガバナンス・コードへの組み込みを検討**

https://www.meti.go.jp/shingikai/mono_info_service/covid-19_dgc/pdf/002_05_00.pdf

## デジタルを、省力化・効率化ではなく、収益向上にこそ活用すべきであること
経産省はDX推進をしている規範的企業の調査結果を基に、DXを成功させるには「**既存ビジネスの効率化**」ではなく、「**新規デジタルビジネスの創出**」もしくは既存ビジネスでも「**デジタル技術の導入による既存ビジネスの付加価値向上**」が必要である、調査結果的にもその方向性で収益向上の達成が実現したと言っています。
しかし、現実には「既存ビジネスの効率化」中心の企業が多く、DX推進に対して経営資源を投入しても企業成長に反映されていかないところが多いです。
これをいかに「新規デジタルビジネス」に転換し、収益向上に繋げられるかが課題点として挙げられています。


## DX推進にあたって、経営者はビジョンや戦略だけではなく、「行動指針」を示すこと
「**デジタルで収益向上を達成した企業**」と「**既存ビジネスの効率化中心の企業**」をDX成熟度を比較し、それぞれの特徴などを分析したところ大きな違いがあったそうです。
DX推進において、収益向上を達成するためには"**変革は全社で一斉にトップダウン**"、"**新たな仕事のやり方、働き方に順応するために行動指針を示す**"ことが大事とのことで、変革アプローチとして参考にすべき！とのこと。
この**行動指針**というのが大きな鍵になりそうですよね。

![dxrepo_7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065056/8fdfec45-2653-7e02-5c98-e784a33d0b9a.png)
(DXレポート2.2抜粋)

## 個社単独ではDXは困難であるため、経営者自らの「価値観」を外部へ発信し、同じ価値観をもつ同志を集めて、互いに変革を推進する新たな関係を構築すること
>**既存産業の業界構造は、ユーザー企業は委託による「コストの削減」を、ベンダー企業は受託による「低リスク・長期安定ビジネスの享受」というWin-Winの関係にも見える。
しかし、両者はデジタル時代において必要な能力を獲得できず、デジタル競争を勝ち抜いていくことが困難な「低位安定」の関係に固定されてしまっている。**

上記はDXレポート2.1の引用ですが、DXレポート2.2ではこのような「**低位安定**」の関係から脱却し、**相互に変革を推進できる関係を構築していくこと**が大事であると主張しています。
そして、その関係構築にはDX推進に向けての「**行動指針の発信**」と「**相互に高めあえるような仕掛け**」が必要であるとのことですね。

![dxrepo_8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065056/9b090fa6-926d-5df7-9578-92093ac1c01a.png)
(DXレポート2.2抜粋)

# おわりに
DXレポート2.2によると「**新規デジタルビジネスによる収益向上**」、「**DX推進に向けて経営陣は行動指針を示す**」、「**低位安定を脱却し、高めあえる同志と関係構築する**」の3つのアクションが今後のDX推進には大事とのことでした。
DX推進と一言でいっても既存のデジタルビジネスからの脱却や業界構造上の課題などクリアすべき問題は多そうですね…
DXレポートはペーペーのエンジニアが読んでもそこそこ理解できる内容になっていますので、社内でDX推進！と叫ばれている会社に属している方は一度目を通してみるとよいかもしれませんね。
【クソアプリ】昼休み中にGitHubの拡張機能を作って業務効率化を図ってみた

# つくったもの
めちゃくちゃ単純です。
**GitHubで、上にマウススクロールした時にヘッダーナビゲーションが出現し、下にマウススクロールすると消えます。**
👇こんな感じです！！

**上にスクロール時**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838672/1fc9a2d0-ee65-7d22-63af-8cd838f25a19.png" width=800 />

下にスクロールすると元のGitHubのUIになります。


# なぜ作った？
ﾖﾜﾖﾜ系エンジニアの私はGitHubでコードレビューや設計書を眺めている時、リポジトリの移動やタブの複製をするために、一生懸命マウススクロールしてヘッダーナビゲーションに向かっています。
ショートカットキーでええやん！！と突っ込まれそうですが、ﾖﾜﾖﾜな私はマウスから手を離せないみたいです。
なのでちょっとマウススクロールするだけでヘッダーナビゲーションが出現する拡張機能をお昼休みに作ってみました。

👇ストアページ

https://chrome.google.com/webstore/detail/github-nav-fixed/ggmjncekkfmppfcghomdnakapjlknkeo?hl=ja&authuser=0

# ソースコード
めちゃくちゃ単純なので全文載せます。
好きにコピペして使ってください！

```typescript
let set_position = 0;
window.addEventListener("scroll", () => {
  const header: HTMLDivElement | null = document.querySelector(
    "#repository-container-header"
  );
  if (!header) return;
  if (window.scrollY > 166 && set_position > window.scrollY) {
    header.classList.remove("position-relative");
    header.style.position = "fixed";
    header.style.top = "0";
    header.style.zIndex = "10";
    header.style.width = "100%";
  } else {
    header.classList.add("position-relative");
    header.style.position = "";
    header.style.top = "";
    header.style.zIndex = "";
    header.style.width = "";
  }
  set_position = window.scrollY;
});
```
自分で拡張機能にするのが面倒くさい場合は以下からインストールして使っていただけたらと思います！



また、コード改善案等があればコメント等でご教授いただければ幸いです！！

# 終わりに
めちゃくちゃ単純な拡張機能ですが、使ってみると以外と便利でした。
気になった方は是非使ってみてください！
フィードバックも随時受け付けております！Githubにもソースコードを公開していますので、IssueやPull requestいただけると幸いです。

https://github.com/nojiritakeshi/Github-Nav-Fixed

👇ストアページ

https://chrome.google.com/webstore/detail/github-nav-fixed/ggmjncekkfmppfcghomdnakapjlknkeo?hl=ja&authuser=0

他にもNetFlixの拡張機能なども作っているので興味があったら使ってみてください！🥳

https://chrome.google.com/webstore/detail/make-more-mylist-in-netfl/bicnagkkmhehedgogcopdadkakldblfk
pythonからkintoneのREST APIを操作してできること一覧

# pythonからkintoneのREST APIを操作してできること一覧

kintone公式の[API一覧](https://cybozu.dev/ja/kintone/docs/rest-api/list/)についてできる限り全ての操作を記事にする予定です。

## レコード

|操作(kintone)|解説記事(qiita)|解説動画(youtube)|
|---|---|---|
|[1件のレコードを取得する](https://cybozu.dev/ja/kintone/docs/rest-api/records/get-record/)|[1件取得](https://qiita.com/guitar_ell_r/items/573e80d6b573278ac5b2)|'https://youtu.be/fBtCaLIn_Vw'|
|[1件のレコードを登録する](https://cybozu.dev/ja/kintone/docs/rest-api/records/add-record/)|[1件登録](https://qiita.com/guitar_ell_r/items/61ddb650d1d3eed87cbd)|'https://youtu.be/OoHvtmpp020'|
|[1件のレコードを更新する](https://cybozu.dev/ja/kintone/docs/rest-api/records/update-record/)|[1件更新](https://qiita.com/guitar_ell_r/items/7b123b8770b7f121e7e1)|'https://youtu.be/lZ5l0xDAH3U'|
|[（カーソル使用）複数のレコードを取得する](https://cybozu.dev/ja/kintone/docs/rest-api/records/update-record/)|鋭意作成中|鋭意作成中|

(*)複数のレコード取得はカーソルを使う方法をアップ予定です。

kintone公式の一覧と同じ順番で順次記事をアップしていく予定です。
顧客分析の手順 - 分析フォーマットの適用例: パターン検出分析 顧客行動パターンの類型化に基づく提案検討

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::


著者 山本 泰史 （やまもと やすし）


# 顧客分析の手順

## 第24回： 顧客行動パターンの類型化に基づく提案検討
パターン検出分析を利用した分析例。2つ目の分析例として「優良顧客の育成」をテーマとした分析例をご紹介します。シーケンシャルな顧客行動のパターンが理解できれば、次にクロスセルすべき商品やサービスの方向性としてその知識を活用することが可能となります。

### 分析の前提
今回の分析データの対象としては、旅客企業の移動先を顧客行動データとして想定しました。図35A がそのグリッドチャートとなります。対象となる顧客セグメントとしては、2008年に東京発の各都市行を利用した顧客群で、指標値としては顧客数を利用しています。したがって、福岡、北海道、大阪、名古屋の各都市を横軸に指定しており、縦軸には 2008年4-6月を基準として、3ヶ月ごとに前後2期間を分析対象としています。また、基準となる顧客行動として、東京から福岡へ移動した顧客を対象にしています。したがって、2008年4-6月に東京-福岡間を利用した顧客 63,022名が同一期間、もしくはその前後のそれぞれ 6ヶ月間でどちらに移動したかを捉えています。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/b0742fef-9bef-8bca-50a6-987814b8b7e1.png">


### 前後の顧客行動を把握
図35A をグラフで示したのが、図35B です。2008年4-6月期を基準に、-1 の期間が 3-6ヶ月前、-2 の期間が 6-9ヶ月前です。全体傾向としては、1月から 3月の期間で利用が大幅に落ち込んでいることが分かります。一方でそれ以外の期間に関してはコンスタントな利用が存在しています。ちなみに -2（2007年10-12月）と 2（2008年10-12月）の値は、ちょうど 1年後の同一顧客の行動を示しています(-2 と 2 の比較)。これを見ると若干の増加が見られますが、基本的な渡航先構成に変化が無いことがわかります。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/8593d1ea-3ef2-fb48-9c7b-149475ce9c2d.png">


そしてこの中で、名古屋、大阪への移動は需要に大きな変化が無いことが見て取れます。ビジネス用途（出張）で利用される顧客であれば、タイミングを問わず一定量、幾つかの都市へと移動されることが想定されるため、ビジネス用途でパターンの見受けられない顧客群も混じっていることが想定されます。

一方で大きな違いが見られるのは、北海道と福岡です。まず北海道に関してみると、2008年7-9月で多くの顧客が北海道に移動していますが、一方で他のタイミングでは極めて少ないです。4-6月期のゴールデンウィークで福岡、7-9月期の夏休み期間で北海道に移動したと考えると、国内観光旅行をされるセグメントかもしれません。一方で、福岡に 3ヶ月毎に行かれる方は一定数存在していますが、1-3月期と 7-9月期では減少しており、10-12月期では増加していることがわかります。したがって、端的には 6ヶ月に 1回、ゴールデンウィークと年末に、福岡に帰省する顧客が多く含まれているのかもしれません。1-3月期と 7-9月期で若干の量的違いが発生していることを考えると、夏休みに帰省される顧客が混じっていそうです。

### アプローチの方向性
ここからこの分析には、以下 3つの行動パターンに類型されるセグメントが混在していることが見て取れます。

１． ビジネス利用、福岡中心に、大都市に一定頻度で移動する顧客群

２． 旅行利用、春は福岡へ、夏は北海道へ

３． 帰省利用、3ヶ月毎に帰省、6ヶ月毎に帰省、6ヶ月毎＋夏休みに帰省

ビジネス出張の顧客に関しては、出張そのものが不定期であることから、マイレージ（ポイント）プログラムで利用頻度の維持／向上を狙います。旅行利用と想定される顧客群に関しては、関連するサービスをタイミングに応じてご案内することが考えられます。4-6月の福岡行き予約を促す案内、旅行会社等と提携したホテル、レンタカー等の追加サービス案内です。そしてこれと同様の案内を、今度は提案先を北海道に変え、7-9月期向けに案内します。また、これらの顧客が、福岡、北海道以外の需要があるのかも気になるところです。何シーズンもこの傾向ならゴールデンウィークや夏休みの予定が固定化していることが想定されますが、もしシーズンによって他の地域へ移動しているのであれば、シーズン毎に案内旅行先を変える、もしくはもっと幅広い旅行先を案内して、顧客に選択して頂いたほうが好まれるかもしれません（旅行先を吟味するのも旅行の楽しみの 1つですので）。

そして帰省利用の顧客に関しても、個別の帰省頻度を捉え、帰省タイミングと想定される前のタイミングで、予約を促すこととします。特にゴールデンウィークや夏休み、そして年末年始に関しては予約が埋まる前に案内をし、帰省顧客に関する需要を確実に押さえる必要があります。


#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
M1 MACにTerraformをインストール

Terraformを学ぶため、M1 MAC環境にインストールしました。
つまづいたエラーも含めつつ、まとめていきたいと思います。
初心者の方の参考になれば幸いです。

## 参考記事
[M1 MacにTerraform + tfenvをインストールする](https://zenn.dev/yumemi_inc/articles/72d187a3fabcfb)



## 環境
M1 MAC
macOS:Ventura(13.2.1)

<!-- ================================================= -->
tfenvをインストール
=
<!-- ================================================= -->

#### GitHubリポジトリクローン
````
cd ~
git clone https://github.com/tfutils/tfenv.git .tfenv
````

#### .zshrv追加
追加方法とパスの通し方はこちらの記事参照。
https://amateur-engineer.com/mac-path-zsh/
```
export PATH=$PATH:[パス]/.tfenv/bin
```

# tfenvインストール
````
$ brew install tfenv

$ tfenv --version
tfenv 3.0.0-18-g1ccfddb
`````

#### インストールできるバージョンを確認します。
`````
$ tfenv list-remote
`````

#### 今回は、1.3.8と1.3.9をインストールします。
````
$ tfenv install 1.3.8
$ tfenv install 1.3.9
````
#### インストール後、利用したいバージョンに切り替えます。
今回は1.3.9を設定します。
````
$ tfenv use 1.3.9
````
#### 1.3.9が使用できるかを確認します。
````
$ tfenv list
* 1.3.9 (set by /Users/local/.tfenv/version)
  1.3.8

````
これでtfenbのインストールは終了です。

※こちらのエラーが出た場合は、下記記事にて解決
「Version could not be resolved」
https://qiita.com/takkii1010/items/6910da995b6c21ac6b3a





<!-- ================================================= -->
Terraformをインストール
=
<!-- ================================================= -->

#### まず、全てのHomebrewパッケージのリポジトリであるHashiCorpをタップをインストール。

```
$ brew tap hashicorp/tap
````

#### 次に、Terraformをインストール。

````
$ brew install hashicorp/tap/terraform
````
※ここで「xcode-select: note: install requested for command line developer tools　xcode-select --install」が出てきたら、下記の記事を参照（xcode-select --installを実行するだけです※ちょっと時間かかります）
https://qiita.com/royroy/items/338362362de73a94fc0c


#### Terraformの最新バージョンに更新するために、Homebrewを更新。
`````
$ brew update
`````

#### 続いて、Updateコマンドを実行して、最新のTerraformバージョンをダウンロードして使用。
````
$ brew upgrade hashicorp/tap/terraform
````
#### インストールを確認
```
＄ which terraform
/opt/homebrew/bin/terraform

$ terraform --version
Terraform v1.3.9
on darwin_arm64
````

これでインストールは完了です！

# おまけ
terraformって打つのが面倒な方は、「tf」で使えるように設定できます。
※.zshrc用の説明です。

````
open ~/.zshrc
````
テキストエディタが開くので、下記内容を追記します。
```zsh:~/.zshrc
alias tf='terraform'
````
※下記エラーが出た場合は、「alias」が「Alias」になっている可能性あり
````
/usr/bin/Alias: line 4: alias: tf: not found
/usr/bin/Alias: line 4: alias: terraform: not found
````
変更を反映します。(PATHを通す)
````
$ source ~/.zshrc
````
使えるか確認します。

````
$ tf --version
Terraform v1.3.9
on darwin_arm64
````
使えているので、これでOKです！
他にも短縮したいコマンドはこのやり方で設定していけるようなので、
試していこうと思います。

# VSCodeのプラグインのインストール

今回はVSCodeを使用してTerraformを記述していくため、プラグインをインストールしておきます。
手順は画像の①②③です。
※③ではHashiCorp Terraformを選択してくださいね。

![スクリーンショット 2023-02-21 8.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/98d4abf6-b8d9-2ad0-4cda-02121e977bbf.png)

これでTerraformの準備は万端です。
お疲れ様でした。
SwiftUIのTextFieldのキーボードでreturnキーを選択するとキーボードを閉じる方法

SwiftUIのTextFieldのキーボードがデフォルトだと閉じれなくて困りました。
専用の閉じるボタンを用意するのも面倒で、かつUIが増えるし、改行が必要ないならreturnキーで閉じたい。

とりあえずこれでできたので、同じ悩みを抱えている方は
是非コピペして動かしてみて下さい。
```swift
struct ContentView: View {
    @State private var inputText = ""
    @FocusState private var textField: Bool

    var body: some View {
        VStack {
            TextField("何か入力してね♪",text: Binding<String>(get: {
                inputText
            }, set: { value in
                // キーボードのreturnキー押下したらキーボードを閉じる.
                if value.contains("\n"){
                    textField = false
                } else {
                    inputText = value
                }
                
            }),axis: .vertical)
            .focused($textField)
        }
    }
}
```
ログ調査方法についての備忘録①

ログ調査方法について調べてみた
いろいろな方法でログを調査する方法についてメモ書き
### リアルタイムに出力させるコマンド
```
コマンド：　tail -f ファイル名
例 
> tail -f /var/log/app/app.log

```

### ある特定の文字列を出力させるコマンド
```
コマンド：　cat ファイル名 | grep 文字列
例 
> cat /var/log/app/app.log | grep abc

※対象の文字列がある行を出力する

```

### ある特定の文字列をリアルタイムで出力させるコマンド
```
コマンド：　tail -f ファイル名 | grep 文字列
例 
> tail -f /var/log/app/app.log grep abc

```


## 備考
他にも調べれば、もっといい出力方法があるかも・・・
Qiita Daily Survey memo 2023.02.20

# Qiita Daily Survey memo 2023.02.20

Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。（2日ぶり）

## [ChatGPTを最強の学習ツールにする方法](https://qiita.com/tak001/items/7605f0be7b424118e5a5)

tak001 様が公開していただいた記事。

今流行の How To Use ChatGPT の記事になります。

前の記事でも記載しましたが、やはり今は「How To Use ChatGPT」が激アツですね！！

その中でも、学習にフォーカスした記事を共有していただいています。

私の知り合いで新卒で会社に入ったけど合わず、辞めてIT系に転職したいと勉強中の方がいますが、その方に速攻共有しました。

「体系的に学習するためにどうしたらいいの」という話から始まり、そこからの深掘りも丁寧にされていて、とても勉強になりました。

How To Use ChatGPT系の記事を結構読んでいますが、学習方法のスタンダートとして、この記事を参考にするで間違いなさそうな気がするレベルでとても良い記事だと思いました。

2023.02.20 07:00 断面の現在では14いいねですが、もっともっと伸びて良い記事だと思いました。

会社のプロジェクトでG検定合格に向けて勉強する予定になっているのですが、本記事を参考にToDoやスケジュールを組んだら面白そうだと思いました。

…コレ面白いな！「AIの言う通りに勉強したらG検定に合格できるか検証してみた。」か。伸びそう。

## [Microsoft 製品のロゴ・アイコン・画像 配布URL一覧 （Azure、Power Platform、M365など）](https://qiita.com/akihiro_suto/items/6987b9b3d0f82dca8ef9)

Akihiro Suto 様が公開してくださった記事。

お仕事あるあるの、「このアイコン欲しい」をまとめてくださった記事になります。

本記事では Microsoft 製品のアイコンをまとめてくださっています。

私もお仕事の関係上、お絵描きして偉い人や後輩やお客様にご説明する機会がたくさんたくさんあり、個人的にiconを持っています。

しかし、「あ、あれがない」が頻発するため、セットとして共有してくださっているのがとても助かります。

また、利用規約も併記してくださっているため、どのタイミングで使っていい/使ってはいけないが分かって助かります！

最近だと AWS 関係でお絵かきする機会が多いため、そちら関連も調べてみようと思いました。
知っておこう、データベースの機能・ロールフォワード

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースの機能ロールフォワードについて更に詳しく調べてみましょう！
![インスタスライド_202302024.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/82dfbc0b-de53-2994-7346-5f77f47c9f50.gif)

# ロールフォワードとは
データベースの異常時にデータの一貫性を保証するための機能

# ロールバックイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/f6aeaf73-0db4-1876-b754-4ce769e34377.png)

・トランザクション１ -- ログを利用してロールフォワード
・トランザクション２ -- ログを利用してロールフォワード
・トランザクション３ -- ログを利用してロールフォワード or トランザクション再実行

# ロールフォワードの種類
ロールフォワードには

データベースの障害によりデータ整合性のために自動的に行われるロールフォワードがある。

ロールバックと違ってプログラムでロールフォワードを実行する事は無い
従ってプログラムで意識する必要はない

# まとめ
ーロールフォワードは、
　データの一貫性を保証するための機能

ー処理を進めてデータを復旧する

ー自動的に行われるのに、プログラミングでは気にする必要がない

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Dev Containerでリモートリポジトリにプッシュできない時の対処法とは？

プロジェクトをVSCodeのDev Container拡張機能を使って開いている状態で、リモートリポジトリにプッシュしようとしたらエラーダイアログがでることがあります。

以下はダイアログに表示されている内容の一文です。

```shell
You don't have permissions to push to "takagimeow/remix-auth-jwt-cloudflare-workers" on GitHub. Would you like to create a fork and push to it instead?
```

https://github.com/takagimeow/remix-auth-jwt-cloudflare-workers

結論から言ってしまうと、ローカル環境側で使用されているGitHub用の秘密鍵が`ssh-add`を使って正しく登録されていない場合にこの問題が発生していました。

一度ローカル環境側と、Dev Container側で`ssh-add -l`を実行して、秘密鍵が登録されているかを確認します。

```shell
ssh-add -l
```

登録されていない場合は、ローカル環境側で`ssh-add`を使って秘密鍵を登録します。

```shell
ssh-add -K ~/.ssh/github_rsa
```

Dev Container側でリモートリポジトリにプッシュしてみて、エラーメッセージが出なくなれば完了です。
Coolmay PLC 使い方まとめ

# はじめに

Aliexpressで購入したCoolmayのPLCの使い方をまとめます．

- 対象機器
```
Model: QM3G-43FH-24MT
```
- coolmay サイト

http://www.coolmay.com/

- 商品URL


https://ja.aliexpress.com/item/32877028842.html?spm=a2g0o.order_list.order_list_main.10.21ef585aDwKwYw&gatewayAdapt=glo2jpn


![Screenshot from 2023-02-20 05-08-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/16f965fa-8839-4724-db01-ba67fbd1ab94.png)

# software

使用するソフトウェアの一覧です．

- Hmi

[Coolmay mviewhmiプログラミングソフトウェア](https://en.coolmay.com/Download-159.html?spm=a2g0o.detail.1000023.1.5c5bOQWYOQWYXd)

- Plc

Mitsubishi gx Developer 8.86または[Gx Works2](http://www.coolmay.com/Download-155-36-41.html?spm=a2g0o.detail.1000023.2.5c5bOQWYOQWYXd)

coolmayが提供しているplcソフトウェアのリンクに飛ぶと以下ソフトウェアを選択できました．
それぞれの使用用途は今の所分かっていません．

![Screenshot from 2023-02-20 05-12-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/44da1fe1-c1fd-523e-8c44-6223566f962a.png)

GXW2-E-1.77FについてはWindowsPCにダウンロードしてインストールしてみたのでできたことなど以下にまとめます．

# GXW2-E-1.77F

## install

- ダウンロードしたら`setup.exe`を実行し，インストールします．

- インストール時，認証コードを聞かれるのでメーカーに問い合わせます．(問い合わせ後，5日ほどで返信があって教えてくれました．)

- なぜか三菱の`GX Developer Version 8`もインストールされた．．．

## usage

- 動画

https://www.youtube.com/watch?v=nYWxXu9ovDU

![Screenshot from 2023-02-20 05-28-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/6b064d46-63b4-bc0f-6ab7-9a23fcaeb116.png)

24v,0vは右したの３pinにあるみたい.

24v,0vの２ピンに24vを入れるとディスプレイが写った.

usbでplcと記載のポートとwindows pcを接続して，デバイスマネージャーで確認した所，不明なデバイスと表示(ドライバのインストールが必要そう)

[ここから](https://en.coolmay.com/wap/Download-36-42.html
)ドライバのインストールができそう → `USB Drivers.zip`をダウンロードしてみる.展開してデイバスマネージャーから選択.→インストールされた．

三菱のデバイスとして認識された!

認識後一度GX Works2を再起動.

その後は動画を参考に青→アイコンを選択し`FX CPU`を選択．

![Screenshot from 2023-02-20 05-49-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/9edb49a8-f5bf-fd15-2fc5-6e690589bee4.png)

`SerialUSBアイコン`を選択→`USB`を選択．`Connection Test`アイコンをクリックし，`Successly`と表示されることを確認．OKアイコンで次に進む．

次に以下のようなウィンドウが表示される．`Target`すべてチェックを入れ，`Execute`をクリック．=> `device name is Empty`というエラー発生.

![Screenshot from 2023-02-20 05-55-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/f79e7bb1-5b5f-f9ed-435f-c4530e9ed71b.png)

`Device Memory`の`Detail`ボタンが赤くなっていたので開くと`Device Name`を入れるところがあった．`TEST`と入力．=>`Detail`ボタンが青になった!この状態で`Execute`ボタンを押すと書き込みができた!

IDEの`POU`>`Program`>`MAIN`を選択．

ピンの名前はINPUT`X`,OUTPUT`Y`が頭文字になっている．

![Screenshot from 2023-02-20 06-04-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/a0d53abe-fb99-9173-43b0-87d589217167.png)

以下のように`X0`を設置.→`Find completed, Find another program.`という警告がでた．．．

![Screenshot from 2023-02-20 06-07-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/a18331fe-d1af-f18c-4f9d-b62943d6a5bb.png)

MAINが`read only`になっている.右上の`鉛筆アイコン`をクリックで解除できる．

![Screenshot from 2023-02-20 06-31-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/3f8dab15-d20a-d82d-bd8b-075d1f71e39a.png)

書き込み時はPLCをRUNモードからSTOPモードにする必要があるみたい．モニターアイコンからRUN,STOPの切り替えが可能.
subprocessを使ってdiscord上からUbuntuPCの再起動

※初投稿です。文章力に自信はないですがよろしくお願いします。
Discord.pyとsubprocessを使用し、Discord上でUbuntu22.04.1が入っているPCの再起動をする方法を紹介します。
関係ない話ですが私はサーバーの再起動として使用しています。
# バージョンなど
```console
$ lsb_release -a
Description: Ubuntu 22.04.1 LTS

$ python3 --version
Python 3.10.6

$ pip show discord
Version: 2.1.0 
```
### 補足
今回はDiscordのスラッシュコマンドを使用します。また、`@bot.tree.command`を使用しています。

# スラッシュコマンドとは
スラッシュコマンドとはチャンネル、またはDM(ダイレクトメッセージ)で"/"から始まるコマンドを打つことでbotにコマンドを送信するものです。
![surassyucommand.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/5af1866e-d187-5236-acf3-c97aca45cfbf.png)

# 実装
※実装するときに友達の@Shichimi555に手伝ってもらいました。ありがとう。もう一度言います。**ありがとう！**

### 基本コード

:::note warn
注意
お使いの環境によっては正常に動作しない可能性があります。ご了承ください。
:::

```python:全体のコード
import discord
import subprocess
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='/',help_command=None,intents=intents)

@bot.tree.command(name="reboot",description="注意:このコマンドを使用するとPCを再起動します。")
async def restart(ctx):
    await ctx.response.send_message("再起動します。")
    subprocess.run(["reboot"])
bot.run('your_token')
```

### 簡単な説明

```python
@bot.tree.command(name="reboot",description="注意:このコマンドを使用するとPCを再起動します。")
```

`name=`のところは"/"の後に打ち込む文字を指します。ここでは`/reboot`と打ち込むことによってコマンドが実行されます。
`description=`のところはスラッシュコマンドの説明文の部分です。(下画像参照)
![description.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/5828ba5e-cde1-43da-f221-4213b144a88d.png)

```python
await ctx.response.send_message("再起動します。")
```
ここではコマンドの応答メッセージを送信します。たぶんメッセージ送らないと厄介なことになると思うので...

```python
bot.run('your_token')
```
`your_token`のところは自分のbotのtokenを貼り付けてください。
ここから確認できます。

https://discord.com/developers/applications

### 別パターン
もし1分後に再起動させる場合は
```python
import discord
import subprocess
import time
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='/',help_command=None,intents=intents)

@bot.tree.command(name="reboot",description="注意:このコマンドを使用するとPCを再起動します。")
async def restart(ctx):
    await ctx.response.send_message("1分後に再起動します。")
    time.sleep(60)
    subprocess.run(["reboot"])
bot.run('your_token')
```
となります。
```python
time.sleep(60)
```
これは60秒待つという意味です。

# 結果
![reboot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/27e0098f-e244-0ab7-aa51-35a4eb79644c.png)
無事再起動されました！眠い...(朝4時)

お読みいただきありがとうございました。皆さんも楽しいbotライフをお過ごしください(?)
# 参考
https://note.com/bardbot/n/n155ac6d30f94

https://monomonotech.jp/kurage/raspberrypi/subprocess.html
Java の ProcessBuilderに文字列を渡したらエラーを吐いた

# ProcessBuilder
　JavaにおけるProcessBuilderとは、外部コマンド(ざっくり言えばコマンドプロンプトで使えるコマンドすべて）をJavaから実行するためのパイプ。(超おおざっぱ)
# 書き方

```java
ProcessBuilder pb = new ProcessBuilder(ここに外部コマンドを入れる);
Process p;
try{
  p = pb.start();
  p.wairFor(); // 外部コマンドの実行が終わるまで待つ
}catch(IOException e){
  e.printStackTrace();
}
```
# 注意点　兼　メインテーマ
ProcessBuilderのインスタンスを生成する際には引数を渡さなくてはならない。
シェルで実行可能なコマンドなら何でも渡せる(ハズ)。
そしてこのコマンド(引数)の渡し方に注意しなくてはならない。
コンストラクタは文字列とリスト(String)の両方を受け取ることが出来るとしているが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403016/cf1ab555-eaf4-b9f4-2bd2-50616248eea0.png)
> (出典：https://docs.oracle.com/javase/jp/8/docs/api/java/lang/ProcessBuilder.html)

まあ、割と嘘である。

(ここからの動作例はUbuntu 20.04LTS におけるものです。)

ただの文字列だとプロセスに正しく受け取ってもらえないことがある。
例えば
`ProcessBuilder pb = new ProcessBuilder("wget google.com");`
のような書き方をしてみる。

そして実行すると
`エラー：そのようなファイルやディレクトリは存在しません`
と言われる。
本来ならGoogleのindex.htmlを取ってきてくれるはずなのだがエラーを吐く。

次にリストを引数にとってみる。
`ProcessBuilder pb = new ProcessBuilder("wget","google.com");`
すると…
`google.com (google.com) をDNSに問いあわせています...`
と出力され、この下にもずらずらと情報が出てきて、最終的に`index.html`を取得することが出来る。

文字列じゃいかんのか！

# どうしてリストじゃないとダメなの？
調査中

よーくコンストラクタの説明文を見比べてみると、文字列の方は「プロセス・ビルダーのコマンドを同じ順序で設定する簡易コンストラクタです。」と書いてある。
文字列からリストを作成してプロセスに渡しているらしいが、ここがうまくいっていないのだろう。(多分)

# 終わりに
　まさかここじゃないだろうなと思いこんだまま他の箇所に原因を見出そうとしていたので2時間ほど悩まされました。
思い込みは危険じゃ危険じゃ
【Express入門】静的ファイル(HTMLやCSSなど)の表示

## はじめに　
### 静的ファイルとは？
・フロントエンドのみで表示されたファイル（誰がいつサイトを訪れても同じ内容が表示がされる）
・html/css/JavaScpipt/imgなど

### ついでに動的ファイルとは？
・フロントエンドとバックエンドで呼び出されたファイル（見る人やタイミングによって表示内容が異なる）
・html/css/JavaScpipt/imgなど
#### 参考記事

https://www.e-infonet.jp/casestudy/column.html?itemid=271&dispmid=981

## 目的
・静的ファイルを表示する

## 実践
前提
・expressのインストール

1　ディレクトリ内にpublicフォルダを作成
2　publicフォルダ内に静的ファイルを作成
3　server.jsにてルーティングの処理
```server.js
const express = require("express");
const app = express();

// 静的ファイルの読み込み
app.use(express.static('public'));
```

## おわりに
記事にまとめると自然と脳が整理されていい感じ

#### 参考記事

https://expressjs.com/ja/starter/static-files.html

#### 参考動画

https://youtu.be/Zk7tpzaKv0U
Rustでアルゴリズム 〜Two Pointers〜

Two Pointers = 尺取り法だと思っていたけどどうも必ずしも一致しないよう。
英語でいうTwo Pointersは尺取り法よりももっと範囲が広いっぽい？

__下記はLeetCodeに掲載されている問題です。__

# 977. Squares of a Sorted Array

https://leetcode.com/problems/squares-of-a-sorted-array/description/

# Submission
```rust
impl Solution {
    pub fn sorted_squares(nums: Vec<i32>) -> Vec<i32> {

        let n = nums.len();
        let mut result = vec![0; n];
        let (mut left, mut right) = (0, n - 1);
        for i in (0..n).rev() {
            if nums[left].abs() > nums[right].abs() {
                result[i] = nums[left].pow(2);
                left += 1;
            } else {
                result[i] = nums[right].pow(2);
                right -= 1;
            }
        }
        return result;
    }
}
```

要はleftとrightで範囲を狭めていけばTwo Pointersということになるのだろうか？
ちなみにTwo Pointers使ってないけどこちらの方が実行速度は速かったです💦

```rust
impl Solution {
    pub fn sorted_squares(nums: Vec<i32>) -> Vec<i32> {
        let mut result: Vec<i32> = nums.iter().zip(nums.iter()).map(|(&a, &b)| a * b).collect();
        result.sort();

        return result;
    }
}
```

Rust初心者のため間違いなどあれば（優しく）ご指摘ください(*'▽'*)
嗚呼、Rustは難しいけど楽しい！
2023/2/20主にITとかセキュリティの記事

フィッシング被害を防げ！クレカ会社などにDMARC導入を要請(2/17)
https://zuuonline.com/archives/246509

消された「ルフィ」のスマホデータはどこまで復元できるか　捜査員が頼りにする“秘密兵器”(2/18)
https://news.yahoo.co.jp/articles/8482fdb9cbd517484b95c72cb351d9a7a56a8262?source=rss

ウイルス対策は必要？rootはなぜ無効？Ubuntuにおけるセキュリティのキホン(2/18)
https://news.yahoo.co.jp/articles/ae476954c1cdf7df5bb603a51589e97117a5e8b1?source=rss

「情シスもテレワークしたい！」　リモート環境で仮想セキュアルームをつくるには(2/17)
https://kn.itmedia.co.jp/kn/articles/2302/17/news046.html

「カネは何としても回収する」脅迫 [KWレポート SNS高額バイトのわな (5)](2/18)
https://www.afpbb.com/articles/-/3451930?cx_part=top_category&cx_position=3

「被害回復してやる」で近づく2次詐欺 [KWレポート SNS高額バイトのわな (8)(2/18)
https://www.afpbb.com/articles/-/3451937?cx_part=top_category&cx_position=5

Binanceがコンプライアンスの失敗を認めて現在米国の規制当局と協議中(2/17)
https://nextmoney.jp/?p=56788

北朝鮮関連とされるハッカー集団が盗んだ暗号資産 7億円超押収(2/18)
https://www3.nhk.or.jp/news/html/20230218/k10013984291000.html

経産相「信頼性に疑念」　大手電力の不正閲覧問題(2/17)
https://www.tokyo-np.co.jp/article/231691

中国の元従業員が半導体データを窃取、オランダＡＳＭＬ(2/18)
https://news.yahoo.co.jp/articles/210631071a5b22ddda183040b2ac3a0c0517fcf6?source=rss

中国、海外上場を厳格管理　欧米への情報流出防ぐ(2/17)
https://www.sankei.com/article/20230217-DHTXM5S73RIOHHHMXZWTC5QJAY/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E4%B8%AD%E5%9B%BD%E3%80%81%E6%B5%B7%E5%A4%96%E4%B8%8A%E5%A0%B4%E3%82%92%E5%8E%B3%E6%A0%BC%E7%AE%A1%E7%90%86%E3%80%80%E6%AC%A7%E7%B1%B3%E3%81%B8%E3%81%AE%E6%83%85%E5%A0%B1%E6%B5%81%E5%87%BA%E9%98%B2%E3%81%90

知らぬ間に自分の写真と動画が “性的商品”に…巨大プラットフォームが支える「地獄の構図」(2/18)
https://news.yahoo.co.jp/articles/6dbc64f5476402709347a0de3bc9e04c6514a004?source=rss

ＡＩ対話型検索「回答が失礼」　マイクロソフト、改良急ぐ(2/18)
https://373news.com/_news/compactnews.php?newsitemid=2023021801000397

対話型ＡＩ「あなたはバカ」　米ＭＳ、失礼な回答の改良急ぐ(2/18)
https://www.sankei.com/article/20230218-A77UEQIVAZPSNN362SLQRPLLJY/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E5%AF%BE%E8%A9%B1%E5%9E%8B%EF%BC%A1%EF%BC%A9%E3%80%8C%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AF%E3%83%90%E3%82%AB%E3%80%8D%E3%80%80%E7%B1%B3%EF%BC%AD%EF%BC%B3%E3%80%81%E5%A4%B1%E7%A4%BC%E3%81%AA%E5%9B%9E%E7%AD%94%E3%81%AE%E6%94%B9%E8%89%AF%E6%80%A5%E3%81%90

ＡＩ対話型検索「回答が失礼」(2/18)
https://www.minyu-net.com/newspack/KD2023021801000397.php

1月マルウェアランキング、Qbotが引き続きトップ(2/18)
https://news.mynavi.jp/techplus/article/20230218-2592854/