OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10で障害の原因調査の為に起動とシャットダウンの時刻をWindowsログから取る

# 概要

Windows10のPCが原因不明で突然シャットダウンしてしまう。
原因切り分けのために、 **いつ起きたのか** をまず知りたい。

そんな時。

この記事では **Windowsログなんて全然使ったことないよー** な状態向けに **Windowsログはここクリックすれば見れるよ** なことも記載。

# Windowsログで起動とシャットダウンの時刻確認

Windowsマーク右クリック ⇒ イベントビューアー 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/43b9c061-0fc2-95cc-f524-616315f00fc4.png)

Windowsログ ⇒ システム 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e949886d-9aa7-bf6f-3fb7-000929aed59a.png)

右側の『現在のログをフィルター』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a4b3dad7-621c-9368-192a-b1a549fa7052.png)


```6005,6006,6008,7001,7002``` でイベントIDをフィルター。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/37dd7bdb-3a6f-8e30-fecd-522281c042a5.png)

| イベントID  | 説明 |
|---|---|
| 6005 | 起動（完全シャットダウン設定時） |
| 6006 | シャットダウン（完全シャットダウン設定時） |
| 6008 | 異常終了 |
| 7001 | 起動（高速スタートアップ設定時）<br/>厳密にはログオン |
| 7002 | シャットダウン（高速スタートアップ設定時）<br/>厳密にはログオフ |

イベントIDはコンマ区切りだけでなく、 ```6005-6006``` のように範囲指定も可。

# Windowsログのフィルター結果例

この時刻に何かあったのか？とあたりをつけることができる。
また、起動とシャットダウンに絞り込むことで **発生の頻度（一定間隔で起きているのか、特定の時刻に発生しているのか）** なども確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e522be50-267f-9c0a-150b-32b7fc0274d8.png)

# 完全シャットダウンとは

下記のように『高速スタートアップを有効にする（推奨）』のチェックが外れている = 完全シャットダウン設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fb01b97e-b37c-80e6-f42e-d36be738b577.png)

# 参考サイトさん

https://pentan.net/win10-kidou-jikoku/

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.2130
Datatableの明細行をLINQで集計する例

## 概要
発注伝票データの明細行に対して、伝票番号単位の金額集計をセットする処理を行う機会があったのでやってみた。

```vb:VB.NET
Dim totalGenka As Decimal = 0
Dim totalBaika As Decimal = 0

'dtには伝票明細データが格納されているとする

Dim dv As DataView
dv = New DataView(dt)

'伝票番号でマージする
Dim dtDen As DataTable = dv.ToTable(True, "伝票番号")
dv.Dispose()

'伝票番号分ループする
For i As Integer = 0 To dtDen.Rows.Count - 1

    '伝票単位の原価金額合計,売価金額合計を集計する
    totalGenka = 0
    totalBaika = 0

    'LINQを使う
    Dim lpCnt As Integer = i
    Dim query = From dr In dt.AsEnumerable
                Where dr("伝票番号") = dtDen.Rows(lpCnt).Item("伝票番号")
                Select dr

    '出荷数に対する合計を取得
    totalGenka = query.Sum(Function(dr) dr("原価金額") * dr("出荷数"))
    totalBaika = query.Sum(Function(dr) dr("売価金額") * dr("出荷数"))

    '明細行分ループする
    For m As Integer = 0 To dtMeisai.Rows.Count - 1
        '伝票明細の加工処理
    Next

Next
```
Oracle VM VirtualBoxでUbuntuをマニュアルインストールする手順

株式会社船井総研デジタルのよもぎたです。

Oracle VM VirtualBoxでUbuntu Desktopをマニュアルインストールする方法を説明いたします。なお、たまたまUbuntuで試しましたが、Windowsや他のLinuxディストリビューションでも同様と思われます。

# この記事の背景

社内の研修仲間がVirtualBoxにUbuntuをインストールしたものの、キーボードレイアウトが英語（US）キーボードになって困りました。インストールした後の対処ではなくて、インストール時に日本語を選べたはずだよね、ということで調べて分かった対処方法をまとめます。

社内情報共有の要素が強いですが、一般的なツールとディストリビューションで起こったことなので、外部の方にも参考になるかもと思いQiitaに投稿させていただきます。

なおVirtualBoxは7.0を使用いたしました。

# 対処方法

仮想マシンを新規作成する際のメニューで、次のスクリーンショットのように *"Skip Unattended Installation"* にチェックを入れます。赤枠で囲った範囲の左上のチェックボックスです。

![virtualbox-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/e24d9b55-3f7f-d5db-dcd7-120cb7662e2f.jpeg)

デフォルトだと次のスクリーンショットのようにチェックが外れており、*Unattended Installation* が有効になっています。インストール中に設定するユーザー名やパスワードなど一部の項目を入力してインストールをお任せできるものの、そもそも日本語環境を選択できず、デスクトップ環境は英語、キーボードレイアウトもUSでインストールされてしまいます。

![virtualbox-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/64f56bf8-6a0f-7372-ffac-6cc18d780744.jpeg)

なお、 *"Skip Unattended Installation"* にチェックを入れて仮想マシンを作成した場合、仮想マシンが電源オフの状態で作成されるので、Oracle VM VirtualBoxマネージャーから手で起動させる必要があります。

簡単ですが以上です。引き続きよろしくお願いいたします。
ストリームをパラメータで制御する(SPSS Modeler データ加工逆引き9-3)

# ストリームをパラメータで制御する

![スクリーンショット 2022-10-03 10.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/586ab07c-f994-5a9e-0789-37b32a174a76.png)

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

・CADSなどのバッチ実行時に特定の期間やエリアに絞り込むパラメータ制御


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

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

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

![スクリーンショット 2022-10-03 10.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/db496d07-4e9c-ec23-42cc-074ee0a7855e.png)
＊逆引き9-01Aで利用したスーパーノードを含むストリームです。

メニューからストリームのパラメータを登録します。
![スクリーンショット 2022-10-03 10.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/01c4ff7e-a3fd-c4df-0747-ea250952ad6b.png)

以下のようにパラーメーターを定義します。
![スクリーンショット 2022-10-03 10.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a1a56565-947b-8a70-7a02-4ee569027455.png)

a.利用するデータは以下の通りです。
![スクリーンショット 2022-09-30 21.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3616f259-f516-0b6b-0be9-c263e913f8ac.png)

b.[条件抽出]ノードを編集します。定義済みの年月のパラメータを以下の要領で呼び出します。
![スクリーンショット 2022-09-30 21.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c649e918-f108-7511-d727-4b76cdbd0c67.png)

c.[条件抽出]ノードを編集します。定義済みのカテゴリのパラメータを以下の要領で呼び出します。
![スクリーンショット 2022-09-30 21.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a36a61c8-0a8c-7c44-348e-feddb8311dcc.png)

赤枠の全実行（左）または部分実行（右）を押して[テーブル]を実行します。
![スクリーンショット 2022-10-03 10.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e2bea759-a801-3b34-7c6e-b43d6f10f2b8.png)

プロンプタが起動します。
![スクリーンショット 2022-10-03 10.59.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2f1edcb5-856b-e19c-b715-26c22854b280.png)

[OK]を押すと年月とカテゴリが絞り込めています。
![スクリーンショット 2022-09-30 21.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e620b414-0043-d5f1-fd42-f55089550272.png)

#### 注意事項

抽出のルーチンとしてチームで共有するにはスーパーノードバラメータ（逆引き9-2）が便利です。

## 4.参考情報

#### スーパーノードを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-20/

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【Java】拡張for文を入れ子的に2度使用する際の挙動を調べました。

　paizaラーニングで2、3日前からJava入門編を始めた完全初心者が書いておりますゆえ、お手柔らかにお願いします。
<h3>なぜ書こうと思ったか</h3>
　Java入門編:5の2次元配列を学習していたところ、いきなり拡張for文を2回使う手法がさらっと出てきてびっくりしたからです。

<br>
<h3>コード内でやること</h3>
<br>①teamsと名付けた二次元配列に、それぞれ{a,b,c}、{d,e,f}、{g,h,i}を入れ、
<br>②拡張for文を使って、それらの中身を全部printlnにて出力するということをします。
<br>③その際に、拡張for文の中で、配列がどこからどれだけ取り出され、どう動くのかを出力結果を解釈して、知ろうと思います。

~~~Java:拡張for文
public class Main {
    public static void main(String[] args) {

        //2次元配列に中身を入れる
        String[][] teams = {{"a","b","c"},{"d","e","f"},{"g","h","i"}};

    for(String[] teams1 : teams){
        
        //1周目でaから最後のiまでが読み込まれるかの確認
        System.out.println("長さは" + teams1.length);
        
        System.out.println(teams1[0] + teams1[1] + teams1[2]);
        System.out.println("一回目ループ終わり");
        /*ここまでで出力された結果が「長さ3、abc」だったので、
        実際は、1つ目の{}の要素のみが読み込まれることが分かりました。*/
        
        for(String teams2 : teams1){
            System.out.println(teams2);;
            System.out.println("二回目ループ終わり");
        /*以上の、拡張forの中の拡張forでは、teams1={a,b,c}という1次元配列(?)を
        一回ずつ取り出し、Stringに変えることが分かりました。
        a,b,cが同時に出力されると思っていましたが、そうではなく
        一回ずつ出力される状態が3回、つまりteams1の配列の中身の多さ分
        繰り返されることが分かりました。*/
            
        }
        //System.out.println("二回目ループ抜け");
        System.out.println("＝＝＝＝＝＝＝＝＝");
    }
~~~
<h3>出力結果</h3>
内容は以上なのですが、一応出力結果も書いておきます。

```長さは3
ループ開始
abc
一回目ループ終わり
a
二回目ループ終わり
b
二回目ループ終わり
c
二回目ループ終わり
＝＝＝＝＝＝＝＝＝
長さは3
ループ開始
def
一回目ループ終わり
d
二回目ループ終わり
e
二回目ループ終わり
f
二回目ループ終わり
＝＝＝＝＝＝＝＝＝
長さは3
ループ開始
ghi
一回目ループ終わり
g
二回目ループ終わり
h
二回目ループ終わり
i
二回目ループ終わり
＝＝＝＝＝＝＝＝＝
```
以上です。ご拝読ありがとうございました！

参考サイト
"Java入門編5: 2次元配列を理解しよう".paizaラーニング.https://paiza.jp/works/java/primer(2022年10月17日閲覧)
【NewRelic】閾値を超えた時のアラート作成 (+ Slack通知)

## やりたいこと
NewRelicで特定のメトリクスに対してアラートを発令させる閾値を設定し、アラート状態になったらSlackで通知させる。

## 前提
- アラート作成対象のメトリクスのダッシュボードはすでに作成されている

- 今回例として使用するメトリクスは「アプリケーションに対する1分間あたりのHTTPリクエスト数」とする。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/26cb03b8-cd5c-0796-ba1c-8708bea7702e.png)


## アラート概要

アラートを設定するにあたって、ポリシー・コンディション・インシデントの三つの概念を理解しておく。

### ポリシー
複数のコンディションをグループ化したもの　　

### コンディション
アラート状態にする条件・閾値の設定。(例: 5分間に1回エラーが出たらアラート出す)

参考: [条件の作成（NewRelic 公式）](https://docs.newrelic.com/jp/docs/alerts-applied-intelligence/new-relic-alerts/alert-conditions/create-alert-conditions/)

### インシデント
設定したコンディションの閾値を超えると発生する




## イシューの設定について

イシューとは
> イシューは、1つ以上のインシデントの集合です。  

イシューが作成されるタイミングは以下の三つから設定できる。

- ポリシーごとに1つのイシュー  
- コンディションごとに1つのイシュー  
- インシデントごとに1つのイシュー  
　　
    
  
  イシューが作成されるたびにSlackに通知を送信するなどの設定が可能。



## アラート設定の手順

### 1. ダッシュボードの3点リーダからCreate alert conditionを選択  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/59eec55e-5c62-0388-c1b7-a6694970ec8d.png)

ここからコンディションの作成が行える
### 2.  Set your condition threshold で閾値を設定する

閾値の設定タイプにはStaticとAnomalyの２種類がある。

- Static
    - CPU使用率が８０％を超えた時など、設定した閾値を超えた際にアラートを出すことができる
- Anomaly
    - コンテナのタスク数が増減した時など、一定を保っていた数値が変化した際にアラートを出すことができる。


今回はStaticタイプを選択してアラートを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/3f0707c9-08e7-40dc-ea9d-8b206e48e8fc.png)


今回は1分間に5回HTTPリクエストが来たら警告状態、10回以上きたらアラート状態になる設定にする。


### 3. ポリシー / イシューの設定をする
作成したコンディションにポリシーを紐付ける or 新規に作成する  
また、ポリシー・コンディション・インシデントごとにイシューを作成する設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/f6c22b77-5bae-f84b-f952-72d5b5b3c952.png)
![スクリーンショット 2022-09-27 17.55.21.png](https://image.docbase.io/uploads/47368707-6e15-47dc-95fe-bc93644edff4.png =WxH)



### 4. Save Conditionをクリックし、保存


### 5. 作成したConditionの確認

メニューのAlert & AI > Alert Conditionsから作成したConditionを確認できる


### 6. 通知設定の作成

任意のConditionを選択した後、Nortification settings > Create Workflowから通知設定を作成する. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/a09e63cf-3b28-3990-0c8f-f3b69692f599.png)

Slackチャンネルへの通知のほか、メールでの通知などの設定もできる。

（注: Slackで通知できるのはパブリックチャンネルのみ。）

アラートの設定ができると、閾値を超えた時にSlackへ通知が来るのが確認できる。

![スクリーンショット 2022-10-17 7.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/0af03c4d-3482-0b96-f62b-81acf22f5afd.png)



## 参考
[条件の作成（NewRelic 公式）](https://docs.newrelic.com/jp/docs/alerts-applied-intelligence/new-relic-alerts/alert-conditions/create-alert-conditions/)

[イシューが作成されるタイミングを決定する（NewRelic 公式）](https://docs.newrelic.com/jp/docs/alerts-applied-intelligence/new-relic-alerts/alert-policies/specify-when-alerts-create-incidents/)
CH340Kのドライバーをインストールする。(LPC812関連)


目的
とくにこまってないけど
CH340Kのドライバーを入れてみた




WCH


http://www.wch-ic.com/




1. WHCのホームページに移動する。

2. Productsを選択する。

3. USBを選択する。

4. CH340を選択する。

5. Downloadを選択する。

6. CH341SER.ZIPを選択する。

7. 展開する。

8. SETUP.EXEを実行する。

9. INSTALLを実行する。

10. デバイスマネージャーを開く

11. USB-SERIAL CH340K(COM4)を開く

12. 3.7.2022.1になっていたら完了

13. テラタームで確認

14. FlasMagicで確認


![o_cop130.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/89f1a3f3-b375-e562-228b-a0f977505d18.jpeg)


![o_cop131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0423114b-448c-46d5-d66a-ae5ae9658674.jpeg)


![o_cop132.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d849d7a3-12a9-f7a3-4b1f-1d387376b94a.jpeg)


![o_cop133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b45ad83f-6681-af4f-3efc-d0fe8e05a797.jpeg)


![o_cop134.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0dcd74e5-2d56-bb2b-e91f-9b34ef1f2441.jpeg)


![o_cop135.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/819a1641-b750-b58f-001f-cebefca52a74.jpeg)


![o_cop136.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/623eec96-dbfa-7b98-eb6c-7cde209047e1.jpeg)


![o_cop137.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/46dca058-f443-c025-4db4-a955227ffb5c.jpeg)


![o_cop138.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b48f1e7e-cbe2-14d5-0251-d47b4c551847.jpeg)


![o_cop139.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f6c401a9-b8bc-e998-77cb-6e9fd0eaee85.jpeg)


![o_cop140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ba1aee2d-eb99-48d1-8e34-eb866b5b309a.jpeg)
お家サーバー その8

# 概要
お家サーバーやってみる。
wordpressやってみた。
画像投稿でエラー発生。

# エラーの内容。
ディレクトリ wp-content/uploads/2022/10 を作成できません。この親ディレクトリのアクセス権はサーバーによる書き込みを許可していますか ?


# 対処

sudo chown -R www-data /var/www/html/wordpress


以上。
settings.pyの機密情報をGitHubで公開しない方法【Djangoでアプリ開発】

# 概要
アプリ開発しつつ今後デプロイすることを考えGitHubにデータをプッシュしていた時にふと、

「あれ、これデータベースの情報（ユーザ名やパスワードを記載していた）とか秘密鍵とか、見えちゃダメでは？でもsetting.pyってデプロイ時にはGitHubにプッシュするものでは？ん？(。´・ω・)」


となったため、調べた結果を備忘録として残します。

# 実施する事
* **local_settings.py**を作成し、その中に公開したくない情報を記載
(例)
```example
SECRET_KEY = `秘密鍵`
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'プロジェクトで使用するデータベース名`
        'USER': `MySQLのユーザー名`
        'PASSWORD': `MySQLのパスワード`,
    }
}
```
* settings.pyに下記のコードを追加
```import
try:
    from .local_settings import *
except ImportError:
    pass
```
* .gitignoreに**local_settings.py**を追加。（その他の.gitignoreに記載すべき情報はhttps://www.toptal.com/developers/gitignore を用いると簡単に作成できます。）

# 参考サイト

https://qiita.com/yuki_w6/items/d6ac568a5598c822c7e8
AWS　マネジメントコンソールとCLI

# 前提条件
この記事は、最初の一歩用となっております。
わかりやすくするため、説明不足な点がありますので、
詳しくは、他の記事を参照してください。

# マネジメントコンソールとCLI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883811/90b037dd-ab9b-f0c6-f1d0-cc51c6bece43.png)
ExcelVBAでカラーダイアログを使用する

<p>
自分用備忘録として。
<br>
ダイアログのOKボタンを押すと「true」が返されるため、色を選択した場合の処理はif文の中に記載するのがポイント。そうしないと、キャンセルボタンを押したときとRGB(0,0,0)を選択したときの戻り値がどちらも「0」になる。
</P>

    Sub ColorSelect()

        Dim COLOR As Long '戻り値。RGB値が10進数で返される
        Dim R As Integer
        Dim G As Integer
        Dim B As Integer

        'Showの引数→(Index,Red,Green,Brue)
        If Application.Dialogs(xlDialogEditColor).Show(1, 255, 50, 100) = True Then
            COLOR = ActiveWorkbook.Colors(1)

            '10進数で返された値を16進数に変換→2文字ずつ抽出→16進数を10進数に再変換
            R = WorksheetFunction.Hex2Dec(Right(Hex(COLOR), 2))
            G = WorksheetFunction.Hex2Dec(Mid(Hex(COLOR), 3, 2))
            B = WorksheetFunction.Hex2Dec(Left(Hex(COLOR), 2))

            MsgBox R & "," & G & "," & B

        End If

    End Sub

<h2>実行結果</h2>
実行すると引数で指定した色が選択された状態でカラーダイアログが表示される。

![ColorDialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646700/44d52795-d761-63f8-92ee-0b106246fdc5.png)

OKボタンを押すと設定した値のRGB値が返される。
![ColorDialog2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646700/db4d057b-0c1f-5949-e738-a7c143e5301c.png)



参考：
https://kosapi.com/post-900/
https://vba-corner.livejournal.com/1691.html
2022/10/17主にITとかセキュリティの記事

パスワードに『,』、流出時の被害確率が下がる可能性も(10/15)
https://www.zaikei.co.jp/article/20221015/693394.html

千歳市雇用情報ポータルサイトが不正アクセス被害、不審メールや情報流出(10/14)
https://cybersecurity-jp.com/news/73143

短信：国内ランサムウェア被害１１４件　上半期、前年同期比８割増(10/15)
https://www.watakyu.jp/archives/12121

220万人の個人情報流出　ネット通販「マイディール」(10/15)
https://nichigopress.jp/news-item/47892/

【独自】北朝鮮ハッカー集団「ラザルス」、日本企業攻撃　100億円近くの暗号資産盗む(10/15)
https://news.tv-asahi.co.jp/news_society/articles/000271996.html

契約書も「サイバー防衛」　免責や賠償上限定め紛争予防(10/15)
https://www.nikkei.com/article/DGXZQOUC227RQ0S2A920C2000000/

約200個の悪意のあるNPMパッケージ配布したサイバー犯罪グループ「LofyGang」に注意(10/15)
https://news.mynavi.jp/techplus/article/20221015-2477405/

インシデントレスポンスの実態明らかに、約 7 割が同時に 2 つ以上のインシデントに対応(10/15)
https://scan.netsecurity.ne.jp/article/2022/10/15/48339.html

イオン銀行、一部ATMでサービス障害　勘定系システム更新後に(10/15)
https://www.zaikei.co.jp/article/20221015/693395.html

Veeam、LIVE配信オンラインセミナー「ランサムウェアからの復旧 2022」10月27日16時より開催(10/14)
https://ascii.jp/elem/000/004/109/4109047/?rss

どんな犯罪者にも扱いやすいフィッシング・アズ・ア・サービス「Caffeine」(10/15)
https://news.mynavi.jp/techplus/article/20221015-2479375/

iOS 16で一部のApple製アプリが勝手にVPN接続を回避して通信がダダ漏れになっていることが判明(10/13)
https://gigazine.net/news/20221013-apple-apps-ios-16-bypass-vpn/

高額取引されるイーサリアム・ネーム・サービス（ENS）とは　歴代トップセールスや利用用途を徹底解説(10/16)
https://coinpost.jp/?p=397097

イーサリアムが直面する健全性と検閲耐性の葛藤、リレイヤーの偏重(10/15)
https://coinpost.jp/?p=397282
【超簡単】Rails 日ごとに投稿をまとめ詳細ページに表示する

#  はじめに
日ごとに投稿を1つのリンクにまとめ、その遷移先にその日の投稿がまとまったページを作成する方法を伝授します！
コピペだけで実装できます！
(※実装しているものと若干合わせる必要はあると思います🙏)

## コントローラー

```ruby:posts_controller.rb

class TweetsController < ApplicationController
  def index
    @tweet = Tweet.new
    @days = Tweet.group("date(created_at)")
  end

  def create
    tweet = Tweet.new(tweet_params)
    if tweet.save
      redirect_to :action => "index"
    else
      redirect_to :action => "index"
    end
  end

  def show
    @date = params[:date]
    @tweets = Tweet.where("created_at LIKE ? ",'%' + params[:date] + '%')
  end

  private
  def tweet_params
    params.require(:tweet).permit(:body)
  end

end

```

## ルート


```ruby:routes.rb
  root "tweets#index"
  post 'tweets' => 'tweets#create'
  get 'tweets/:date' => 'tweets#show',as: 'tweet'
```

## ビュー
```erb:index.html.erb
<h1>投稿する</h1>
<%= form_for @tweet do |f| %>
  <div class="field">
    <%= f.label :body %>
    <%= f.text_field :body, :size => 140 %>
  </div>
  <%= f.submit "Tweetする" %>
<% end %>

<h1>日付一覧</h1>
<div class="tweets-container">
  <% @days.each do |t| %>
      <a  href="/tweets/<%= t.created_at.to_date %>"><%= t.created_at.to_date %></a><br>
  <% end %>
</div>
```

```erb:show.html.erb

<h1><%= @date %>の投稿</h1>

<% @tweets.each do |t| %>
  <div class="tweet">
    <%= t.body %>
  </div>
<% end %>

```




##  最後に
いかがでしたでしょうか？
解説は余力があれば追記していこうと思います！
そのほか何かありましたら気軽になんでもコメントいただければと思います！
プロバイダにLibvirt (KVM) を使って、Ubuntu20.04のVMをVagrantで立てる

# プロバイダに Libvirt を使って、Ubuntu20.04のVMをVagrantで立てる
- Vagrant を使って Ubuntu の VM を立ち上げる時に少し詰まったので、忘備録として残しておきます。
- [CentOS 7 の Box](https://app.vagrantup.com/centos/boxes/7)では、ネットワーク設定を変更せずにデフォルトのままで yum コマンドが使えました。
- 追記：別の環境では問題なく名前解決できました。

## VMの起動まで
- 手順は[公式ページ](https://learn.hashicorp.com/tutorials/vagrant/getting-started-install?in=vagrant/getting-started)を参考にしました。
```
sudo apt install vagrant vagrant-libvert
mkdir vagrant_ubuntu
cd vagrant_ubuntu
```
- VM を立ち上げて SSH 接続します。Box は[こちら](https://app.vagrantup.com/generic/boxes/ubuntu2004)を使いました。
```
vagrant init generic/ubuntu2004
vagrant up --provider=libvirt
vagrant ssh
```
## 名前解決
- `/etc/netplan/`配下の yaml ファイルのネームサーバを `8.8.8.8` にします (私の環境では、デフォルトのネームサーバで名前解決ができませんでした)。
```
sudo vim /etc/netplan/01-netcfg.yaml
```
```/etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
      nameservers:
        addresses:
        - 8.8.8.8
```
- ネットワーク設定を適用します。
```
sudo netplan apply
```
useEffectを自分流に簡潔にまとめてみる

`useEffect`について調べてみると結構面白かったので、`useEffect`についての記事を書いていきます。

## useEffectのエフェクトって？
そもそもエフェクトとは何なのでしょうか？エフェクトとは、**副作用**のことを指すのです。
副作用とは、**実行されている関数の範囲外の何かに影響を与えるもの**です。
例としては、バックエンドサーバーからAPIを呼び出したり、`setTimeout`関数などのどんな値が返ってくるか分からない関数を呼び出すことが挙げられます。

しかし、このような関数と、どんな値が返ってくるか予め分かっている関数（純粋関数）と一緒に使うと、思わぬ処理をしてしまう可能性があります。
できれば、副作用は純粋関数のレンダリング後にやった方がいいですよね。
そこで必要になってくるのが`useEffect`なんです。
`useEffect`は、外界と対話するためのツールでありながら、それが含まれるコンポーネントのレンダリングやパフォーマンスには影響を与えないんです。

## useEffectの使い方
`useEffect`の使い方は、以下のように使います。
```
import { useEffect } from 'react'

function GetPostTitle({ title }){
    useEffect(() => {
        document.title = title;
    }, [title]);

    return <h1>{title}</h1>
```
今回の例で言えば、スコープ外の値である`title`によってブログのタイトルをブラウザのタブのタイトルにするコードです。
手順としては、
1\.`useEffect`をインポートする
2\.関数と配列の２つの引数を渡す

1は説明はいらないでしょう。
2の関数と配列の２つの引数を渡す、ということに関してですが、どんな配列を渡せばいいのでしょうか？
それは、依存関係配列と呼ばれるものです。
今回で言えば、スコープ外の値である`title`という値を変更しているため、この`title`という値に依存関係が発生します。そのため、`title`という値が第二引数として格納されます。
この配列で行われていることは、値がレンダリングされたときに値が変わっているかどうかを確認することです。変更されている場合は、`useEffect`関数が実行されます。

もし第二引数が空配列だとしたら、`useEffect`は初回レンダー後のみ呼び出されることになります。

## 今後の展望
今後の展望としては、[こちら](https://zenn.dev/fujiyama/articles/c26acc641c4e30)の記事を読んで、さらなる`useEffect`について調べていこうと思います。

【参考記事】

https://www.freecodecamp.org/news/react-useeffect-absolute-beginners/

https://beta.reactjs.org/apis/react/useEffect#useeffect
Swiper　リサイズしないと動作しない　解決策


Swiper　リサイズしないと動作しない　解決策
この記事はswiper バージョン４以下の書き方です。

全ては以下のリンクに書いてあります。
日本語で検索すると、あまり記事が出てこなかったのでここにリンクを貼らせていただきます。
https://stackoverflow.com/questions/43770106/swiper-slider-not-working-unless-page-is-resized

以下のように検索すると、解決策がたくさん出てきます。
”swiper not working until resize”

以下の１〜３のどれかを試してみると良いようです。
（筆者は、３で解決できました。）

以下は、参考リンクの内容をもとに、自分なりに説明を加えたものです、
https://stackoverflow.com/questions/43770106/swiper-slider-not-working-unless-page-is-resized



簡潔に解決方法
１スライダーを初期化する
```
var hensu = new Swiper('.hensu', {
//////初期化コードをかく

})
```

２スライダーを更新する
```
hensu.update();
```
３オブザーバーパラメータを有効にする
※以下を、ファイル内の、全ての初期化コードのまとまりに設定する必要がある。
　一つの初期化コードに設定下のみだと、解決しないです。

```
var hensu = new Swiper('.hensu', {
//////初期化コード
loop: true,
autoplay: 5000,
,,,,
 /////以下の二つのラインを追加する//////
observer: true,
observeParents: true,

})

※複数の初期化コードがある場合、全ての初期化コードのまとまりごとに、二行のラインを追加する必要あり。

var hensu2 = new Swiper('.hensu2', {
//////初期化コード
loop: true,
autoplay: 5000,
,,,,
 /////全ての初期化コードのまとまりに以下の二つのラインを追加する//////
observer: true,
observeParents: true,

})
       
```


参考になれば幸いです。＾＾



解決策の参考です。
[Swiper slider not working unless page is resized]
https://stackoverflow.com/questions/43770106/swiper-slider-not-working-unless-page-is-resized

[Swiper not working until I resize browser window #2928]
https://github.com/nolimits4web/swiper/issues/2928

[スライダープラグイン Swiper の使い方]
https://www.webdesignleaves.com/pr/plugins/swiper_js.html
AppleScriptの第一歩（ミュージックの特定プレイリストを再生して再生中の曲にフォーカス）

# 概要

Macで処理を自動化したい。
でもシェルスクリプトで操作するのはなかなか難しい場面がある。
そこでAppleScriptを使う。

この記事では **AppleScriptをまだ1回も自作したことが無い** 状態向けに、**初歩的なAppleScriptの作り方** から記載。

# やり方（ミュージックの起動まで）

アプリケーション ⇒ ユーティリティ ⇒ スクリプトエディタ 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3caeca32-9b26-fbd0-a79c-77ededf343a8.png)

環境設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/582ad829-0edc-d467-1789-bc76f4a81319.png)

編集中 ⇒ フォーマット 文字列中のタブや改行をエスケープ にチェック入れる。
（これの設定は必須ではないが、設定しておくのおススメ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/78ab87c3-ec7e-f1fa-488e-e14cd43e1070.png)

```applescript:ミュージックを起動するだけの超簡単なAppleScript
-- コメント書く時はこう！
tell application "Music"
    activate
end tell
```

トンカチマークでコンパイルできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/60e0e716-bf87-2788-7a1d-57f9bba8ba46.png)

ファイル ⇒ 保存 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fc8bdcb1-add2-96e4-8c1a-36b180dd195a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/887b5a26-20e6-8ec0-f76a-f8b21a389013.png)

再生ボタンでスクリプト実行（動作確認）できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c9a45e86-9fc0-5e20-5806-3f427d0cd2d9.png)

動作が想定通りなら **開くだけでスクリプトの内容が実行されるもの** を作ろう。
（いわゆるバッチファイル的なもの）

ファイル ⇒ 書き出す 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3c4b052c-3c49-6828-301d-1affa073fbd7.png)

ファイルフォーマットは『アプリケーション』 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/33464197-3ec3-04dd-5375-f0ea41120aa5.png)

↓こんなものが出来上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e6d5c028-633b-2f84-61c5-45b2f499577d.png)

この『tester_app』をダブルクリックで開くだけでAppleScriptの内容が実行される。

# スクリプトエディタでkeystroke動作確認できるように設定

下記の設定は必須ではない。
でもこれをやっておくとスクリプトエディタでkeystroke（キー入力）の動作確認できるので楽。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/633517e9-ffc6-a0ce-33ea-5fe3a23fa86a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/39809d94-e100-0fb0-a5a4-394af9885efe.png)

# やり方（特定プレイリストの再生と再生中の曲にフォーカス）

```applescript
-- ミュージックを起動して、指定した名前のプレイリスト再生
tell application "Music"
    activate
    play playlist "ななひら"
end tell

-- コントロールの『現在の曲に移動』
tell application "System Events"
    keystroke "l" using command down
end tell
```

```tell application "System Events"```　以下では下記をやっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7c3b00b9-175e-a30e-b1a9-233490891d08.png)

別にやらなくてもミュージックの再生には問題はない。

でもやらないと下記のようになってしまう。
曲は再生されるが、再生している曲（プレイリスト）にフォーカスせず、 **ミュージックを閉じた時の状態** のまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3d4333e6-caf7-8a7d-8fe7-5dcb0a3a5b85.png)

スクリプトで『現在の曲に移動』のキー入力をすることで下記のように、 **再生してる曲（プレイリスト）にフォーカス** される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7df90258-de62-8a74-d8ce-1119c3235753.png)

# バージョン

macOS Monterey 12.6
Component definition is missing display nameとeslintに怒られたときの対処


Next.jsを使った個人開発を進めている際に、新しいコンポーネントを作ろうとしていたところ、**Component definition is missing display name**と怒られてしまった。

後述の「素直にコンポーネントにdisplay nameをつけてあげる」という解決策は他に記事として既存であったが、eslint側でまとめてルールを変えたいときの解決方法が見つからなかったので解決策1に記した。

# 解決策1　eslintの設定を変更する
```.eslintrc.js
...
rules:{
    ...
    'react/display-name': 'off'
}
...
```
と追記してやる。テキストエディタを再起動すると、エラー解消。

# 解決策2　素直にコンポーネントにdisplay nameをつけてあげる
以下の記事にて当方法による指針が示されていたので、リンクをこちらに。

https://qiita.com/acro5piano/items/1cffa8c6b52a36e6bb73

# その他参考
https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/function-component-definition.md
[JavaScript]デフォルト引数で引数を省略できるらしい

はじめに
--
記述した関数の使う場面によって引数を省略できたりしないのかなと思い調べていたら、デフォルト引数という存在を知りました。
調べた内容を備忘録にまとめます。

デフォルト引数の設定の仕方
--
デフォルト引数は、下記の様に引数を記述する際にデフォルト値を"="に続いて記述をすることで指定することができます。

~~~js
const ~ = ("引数1", "引数2" = "デフォルト値") => {
  "処理"
}
~~~

使用例
--
例として、引数に名前と挨拶を入れる関数を作りました。
下記の様にデフォルト値を設定すれば、引数を設定しなければ日本語の挨拶で、
それ以外の国の挨拶をしたい場合は"greet"の引数に別途表示させたい文言を入れる、というような形で記述することができます。

greetingメソッドを使用する状況が「ほとんど日本語の挨拶で時々別の国の挨拶を表示させたい」、等だと記述量が減って便利ですね。

~~~js
const greeting = (name,greet = "こんにちは") => {
  return[name,greet]
}

console.log(greeting("太郎"))
// =>["太郎", "こんにちは"]
console.log(greeting("二郎"))
// => ["二郎", "こんにちは"]
console.log(greeting("三郎"))
// => ["三郎", "こんにちは"]
console.log(greeting("Jhon","Helllo"))
// => ["Jhon", "Helllo"]
console.log(greeting("chang","Ni Hao"))
// => ["chang", "Ni Hao"]
~~~

注意点
--
また、一つ目にデフォルト引数を設定し、二つ目にデフォルト値が存在しない引数を設定すると、デフォルト引数が二つ目の引数の値に上書きされてしまうので注意が必要です。

例えばgreetingメソッドがnameの引数にデフォルト値を設定し、greetの引数にはデフォルト値がない場合は下記の様に動作します。

~~~js
const greeting = (name = "太郎",greet) => {
  return[name,greet]
}

console.log(greeting("こんにちは"))
// =>["こんにちは", undefined]が返ってくる
// =>["こんにちは", "太郎"]とはならない！！
~~~

※10/19 追記
@8348ee さんからご指摘を頂いた内容を追加しました！

>初期値が指定されている引数の位置が分かっているのであれば、その引数にundefinedが当たるようにすれば良いです。

上記のご指摘頂いた内容の通り、引数にundefinedを追加してあげることで上書きが防げるとのことです！！
~~~js
const greeting = (name = "太郎",greet) => {
  return[name,greet]
}

console.log(greeting(undefined, "こんにちは"))
// ['太郎', 'こんにちは']
//　　["こんにちは", undefined]とはならない！！
~~~

参考
--
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Default_parameters
システムのパフォーマンスを計測できるコマンド

●リソースを測定することで、システムのパフォーマンスを計測できるコマンド

測定対象
■CPU
・システム全体としてのCPU使用率を表示するコマンド
top(htop)、vmstat、iostat,mpstat [-P　番号またはALL]、sar -u|-P 番号またはALL

・プロセス毎のCPU使用率の表示するコマンド
top(htop),ps u[ax]
※topはデフォルトでCPU使用率の高い順に表示

・負荷平均の表示
top(htop)

■物理メモリ
・システム位全体としての物理メモリの使用状況の表示
top(htop),free,vmstat,sar -r

・プロセス毎の物理メモリ使用率の表示
top(htop),ps u[ax]

■スワップ領域
・スワップ領域の使用状況の表示
top(htop),free,vmstat,sar -S、swapon -s

・スワップイン・アウトの状況表示
vmstat

■ディスクI/O
iostat、iotop,vmstat,sar -b

■ネットワークI/O
iptraf,iftop,netstat -i|-s,sar -n DEV|EDEV,ss

※iftopをオプション無しで実行するとncurses（テキストユーザインタフェース（TUI）を扱うライブラリ）を使用した画面表示になる。
-tオプションを付けて実行すると、ncursesを使用しないテキストベースの表示

■プロセスのPID
ps [uax],top,lsof


●sysstatユーティリティ
システムの状態を監視するためのツールを提供。代表的なコマンドとしてsarやiostatコマンド。sysstatユーティリティには、ネットワークを介して利用するNFSやCIFSへの入出力状況を表示するための、nfsiostatコマンドやcifsiostatコマンドが含まれています。

・NFS(Network File System)はLinuxを含むUNIX系OSで利用されている、ネットワークファイル共有の機能。NFSサーバが公開した(エクスポートした)ディレクトリを、NFSクライアントがローカルファイルシステムにマウントして利用。

・CIFS(Common Internet File System)は、SMB(Server Message Block)を拡張したプロトコルで、Windows系OSにおいてファイル共有やプリンタ共有などを可能にするMicrosoft独自のプロトコル。LinuxではCIFSによるネットワーク共有を利用することができ、NFSと同じくローカルファイルシステムにマウントして利用。
アロー関数②

通常の関数

```javascript

function namefunc(aro1) {
    console.log(aro1);

}

```

アロー関数
```javascript
const arrowfunc(aro2) {
    console.log(aro2);
}

```

ワンラインのアロー関数
```javascript

const arrow_func(aro3) => console.log(aro3)
}

```

関数実行
```javascript

namefunc('通常の関数');
arrowfunc('アロー関数');
arrow_func('1行のアロー関数　');

```

```javascript

const users = {
    hoge: "yamatetsu";
}

const getUsername = (userId) => users[userId];

const username = getUsername('hoge')
console.log(username)

```
$stmt = $pdo->queryと$stmt = $pdo->prepareの違いについて

queryとprepareについて勉強したため、

皆さんに共有する。


$stmt = $pdo->queryは一番簡単な方法
$stmt = $pdo->prepareは「　query　」に手間をかけてバリデーションをして手間を行う方法。



queryを使う場合
```php
 try {
    // データを取得するSQL
    //tasksテーブルのid,titleの取得の準備し、表示させる。
    $stmt = $pdo->query("SELECT id, title FROM tasks");

    全ての行をまとめて取り出し、「$titless」に格納する
    $titless = $stmt->fetchAll(PDO::FETCH_ASSOC); 

  } catch(PDOException $e) {
    // エラーメッセージを出力
    echo $e->getMessage();
  } finally {

    // データベースの接続解除
    $pdo = null;
  }

```

確認する
prepare使う場合
```php
  try {
    // データを取得するSQL
    //tasksテーブルに入っているidを：id,titleを：titleに格納する
    $stmt = $pdo->prepare("SELECT id=:id, title=:title FROM tasks");


    ※※ーー上記「id=:id　」の「:id」を下記の「:id」に入り、 「$id」に格納する。ーー※※


    //上記で格納した:idを$id :titleを$titleにバインドパラムする
    $stmt->bindParam(':id'   , $id,    PDO::PARAM_INT);
    $stmt->bindParam(':title'   , $title,    PDO::PARAM_STR);

    //sqlを実行し、$resに格納する。
    $res = $stmt->execute();


    //title全てを抽出し、＄titlessに入れる
    $titless = $stmt->fetchAll(PDO::FETCH_ASSOC);  

    } catch(PDOException $e) {
    // エラーメッセージを出力
        echo $e->getMessage();
    } finally {
    // データベースの接続解除
    $pdo = null;
    }

```
で実施する。
日経平均株価のチャート分析用グラフ作成

# 一目均衡表
- 日本発祥のテクニカル指標のひとつ

## 1. import
```py
import pandas as pd
from pandas_datareader import data
import matplotlib.pyplot as plt
%matplotlib inline
import mplfinance as mpf
import warnings
warnings.simplefilter('ignore')
```

## 2. 日経平均株価のデータを取得
```py
start_date = '2022-01-01'
end_date = '2022-10-15'

df = data.DataReader('^N225', 'yahoo', start_date, end_date)
date = df.index

df.head()
```

![スクリーンショット 2022-10-16 20.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689074/42b9079d-7676-4166-ee5b-3453cb81dc5a.png)


|用語  |意味  |
|---|---|
|High  |高値  |
|Low  |安値  |
|Open  |始値  |
|Close  |終値  |
|Volume  |出来高（株取引された量）  |
|Adj Close  |調整後の終値  |

## 3. 基準線のデータを作成

```py
high = df['High']
low = df['Low']

# 過去26日間の最高値を計算
max26 = high.rolling(window=26).max()
# 過去26日間の最安値を計算
min26 = low.rolling(window=26).min()

# 基準線のカラムを追加
df['basic_line'] = (max26 + min26) / 2
```

## 4. 転換線のデータを作成

```py
# 転換線は過去9日間の最高値と最安値の平均を結んだ線
high9 = high.rolling(window=9).max()
low9 = low.rolling(window=9).min()

df['turn_line'] = (high9 + low9) / 2
```

## 5. 「雲」に必要なデータの作成

```py
# 基準線と転換線の平均で先行スパン1を作成
df['span1'] = (df['basic_line'] + df['turn_line']) / 2

# 52日間の最高値と最安値の平均で先行スパン2を作成
high52 = high.rolling(window=52).max()
low52 = low.rolling(window=52).min()
df['span2'] = (high52 + low52) / 2
```

## 6. 当日を含めた26日間遅らせたデータの遅行線を作成

```py
# shiftメソッドで日付をずらす
df['slow_line'] = df['Adj Close'].shift(-25)
```

## 7. グラフを作成

```py
plt.figure(figsize=(16, 6))
plt.plot(df['basic_line'], label='basic')
plt.plot(df['turn_line'], label='turn')
# 作成した二つのスパン(塗りつぶされた領域を「雲」と呼ぶ)
plt.fill_between(date, df['span1'], df['span2'], facecolor='gray', alpha=0.5, label='span')
plt.plot(df['slow_line'], label='slow')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.show()
```

![スクリーンショット 2022-10-16 20.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689074/e283f9fb-32eb-cdc6-eb8d-0f0e969f553a.png)

## 7. ローソク足を追加してグラフを作成する場合

```py
lines = [
    mpf.make_addplot(df['basic_line']), # 基準線
    mpf.make_addplot(df['turn_line']),  # 転換線
    mpf.make_addplot(df['slow_line'])   # 遅行線
]

labels = ['basic', 'turn', 'slow', 'span']

fig, ax = mpf.plot(df, type='candle', figsize=(16, 6), style='classic', xrotation=0, addplot=lines, returnfig=True,
                  fill_between=dict(y1=df['span1'].values, y2=df['span2'].values, alpha=0.5, color='gray'))

# 画像として保存する場合
# fig, ax = mpf.plot(df, type='candle', figsize=(16, 6), style='classic', xrotation=0, addplot=lines, returnfig=True,
#                   fill_between=dict(y1=df['span1'].values, y2=df['span2'].values, alpha=0.5, color='gray'), savefig='一目均衡表.png')

# 凡例を表示
ax[0].legend(labels)
plt.show()
```

![スクリーンショット 2022-10-16 20.18.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689074/85e71a9c-ee2a-4849-1e75-f90f354e71a8.png)


# 関連

- [日経平均株価/個別銘柄の移動平均と出来高を可視化](https://qiita.com/rexid/items/4148e29300f47966066e)
- [日経平均株価のテクニカル分析用データ作成](https://qiita.com/rexid/items/4c390b3c5a769a26dc88)
[Unity]TextMeshProで日本語を表示する

# 概要
UnityのTextMeshProは、日本語を使うための準備が面倒臭くてあまり触らない方も多いと思います（自分もその一人です）
今回はタイトル文字など、使う場所を限定すれば有効に使えるのでは？というコンセプトで記事を書いてみました。
# 本文
## TextMeshProのテキストを表示する
Hierarchyで右クリックをして表示されるメニューからText - TextMeshProを選びます。
![スクリーンショット 2022-10-16 22.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c33df4a7-3503-0a12-d4af-62186faa5a1f.png)
ポップアップが表示されるのでImport TMP Essentialsを押してください。
![スクリーンショット 2022-10-16 22.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/47d9db7c-5947-9c2d-f660-d43aba88331f.png)
そして、早速Textに文字を入力してみますが
![スクリーンショット 2022-10-16 22.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3cc7166a-82c7-fa99-a668-2575eeb5d68d.png)
Scene画面には文字化けして表示されます。英字はフォントがあるので表示されますが、TextMeshProで使える日本語フォントが登録されていないのが原因です。
![スクリーンショット 2022-10-16 22.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/8c261111-d7c3-07e0-7c22-4b3d0b967bba.png)
## TextMeshProで使うための日本語フォントを用意する
ということで日本語フォントファイルを用意します。今回は商用利用可能な「自家製 Rounded M+」を使わせていただきました。
http://jikasei.me/font/rounded-mplus/about.html
ZIP形式でダウンロードできますがファイルごとにフォントの見た目が違います。Fontsフォルダを作成して、その中に「rounded-mplus-2p-medium.ttf」をドラッグアンドドロップします。
![スクリーンショット 2022-10-16 23.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/81ff978f-0894-5102-8530-b7a69380608d.png)
次にフォントファイルをTextMeshProで使える形式へ変換します。
Window > TextMeshPro > Font Asset Creator
![スクリーンショット 2022-10-16 23.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/44ff9041-5095-5ffc-18a4-a36eeaf38656.png)
Source Font Fileに今回追加したFontファイルを指定します。
CustomCharacterListに使用する「文字」を指定します。日本語フォント全てを変換することもできますがファイルサイズが大きくなってしまうので、今回は使う文字だけを指定して変換するようにしました。
入力が終わったらGenerate Font Atlasを押すと変換処理が行われます。その後、Saveボタンを押します。
![スクリーンショット 2022-10-16 23.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f72db546-1c65-4c3c-0d71-45e9f8dbd1e3.png)
TextMeshPro用フォントが追加されました。
![スクリーンショット 2022-10-16 23.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0483112b-1f0a-54b0-3385-849b79702212.png)
TextMeshProのFont AssetにTextMeshPro用フォントを指定すると
![スクリーンショット 2022-10-16 23.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ea8ba8e4-cdfe-8281-c618-ff12b6d2bc0d.png)
文字化けがなくなりました:sunny:
![スクリーンショット 2022-10-16 23.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/32d1c425-9311-7245-388e-8ddd56a07f02.png)


# 補足
使いたい文字が増えるたびにこの手順をするのは大変だと思います。とはいえ、ふちどり文字など文字の見栄えを良くしたい時TextMeshProはすごく便利です。
ゲームタイトル、UIのタイトルなどピンポイントでだけ使うと良さそうです。
# 常用漢字の登録
PCゲーム等なら常用漢字全てを登録してバンバン使っていくのも良いですね。
常用漢字を登録する場合の手順は、先人の方々がたくさん記事を書いているのでそちらを参考にしてください。
設定は例えばこんな感じにして常用漢字を登録すると上手くいくと思います。
![スクリーンショット 2022-10-17 0.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/2418e0aa-e061-914d-d496-498a570a4abf.png)
# 登録されている文字を確認したい時は
出力されたアセットファイル（〜.asset）を選択してInspectorからCharacterTableを開くと登録されている文字の一覧を見ることができます。
# 登録文字を追加したい時は
Custom Character Listに増やしたい文字を追加してSaveの時上書き保存すれば更新できます（大切なデータの場合はバックアップをとっておいてから操作するのが安全です）
Rustで多段Step関数

# 概要

xがx0を超えてx1以下の時にy=y0となるような計算はよく目にします。例えば宅配では商品のサイズによって料金が何段階かになっており、モバイル通信料にも従量課金プランがあって1GBまでは600円、3GBまでは1000円、10GBまでは1500円、それ以降は2000円というような計算があります。今回はこういった計算を扱うデータ構造をRustで作ってみました。

# データ構造

```rust
pub struct ThresholdDict<K, V> {
    keys: Vec<K>,
    values: Vec<V>,
    default_value: V,
}
```

`keys` は上の説明でいうとxであり、`values`がyです。`keys[i] < x <= keys[i+1]`の時に`y = values[i]` になります。そして`x`が`keys`の最後の要素よりも大きい場合は`default_value`がyの結果になります。keysは小さい順に、valuesもそれに対応してソートされている必要がありますので以下のようにコンストラクタを実装します。

```rust
impl<K: PartialOrd, V> ThresholdDict<K, V> {
    /// default constructor
    pub fn new(mut kv: Vec<(K, V)>, default_value: V) -> Self {
        kv.sort_by(|lhs, rhs| lhs.0.partial_cmp(&rhs.0).unwrap());
        let mut keys = vec![];
        let mut values = vec![];
        for (k, v) in kv {
            keys.push(k);
            values.push(v);
        }
        Self {
            keys,
            values,
            default_value,
        }
    }
}
```

# 問い合わせアルゴリズム

単純に線形探索をしてもいいのですが、データが多い時には二分探索が$O(logN)$で高速になります。Rustの`Vec`には`partition_point`というメソッドがあり、ある値以下の最大の点を探すことができますのでこれを使用します。

```rust
impl<K: PartialOrd, V> ThresholdDict<K, V> {
    pub fn query(&self, key: &K) -> &V {
        if self.keys.is_empty() {
            return &self.default_value;
        }
        
        let i = self.keys.partition_point(|x| x < key);
        if i == self.keys.len() {
            return &self.default_value;
        }
        self.values.get(i).unwrap()
    }
}
```

試しに使用してみます。

```rust
let dict = ThresholdDict::new(vec![(10, 100), (20, 150), (50, 300)], 500);

assert_eq!(dict.query(&0), &100);
assert_eq!(dict.query(&10), &100);
assert_eq!(dict.query(&15), &150);
assert_eq!(dict.query(&50), &300);
assert_eq!(dict.query(&60), &500);
```

# まとめ

`Vec`の機能を利用することでとても簡単に実装することができました。成果物はGitHubとcrates.ioに公開してあります。公開しているものは実際には`keys`の長さに閾値を設けて線形探索と二分探索を切り替えられるようにしてあります。

https://github.com/lucidfrontier45/threshold_dict
https://crates.io/crates/threshold-dict
無駄な useState + useEffect はuseMemoに。


# まえがき

`useState` + `useEffect` が使われているところを、 `useMemo` で簡易的に書ける場合はその方がシンプルで良いかなと思い記事にしてみました。
初歩的な話ではありますが、React初心者へのちょっとした手助けになれればいいな〜というアウトプット記事です(^^)

#
今回は、**今月がユーザーの誕生月かどうかを判断する場合** を例として書いてみます。


これを `useState` + `useEffect`で書くと下記のようなコードになります。

```javascript
  const [isBirthMonth, setIsBirthMonth] = useState<boolean>(false)

  useEffect(() => {
    setIsBirthMonth(getMonth(user.birthday) === getMonth(new Date()))
  }, [user.birthday])
```

`useState`で`isBirthMonth`を定義し、`useEffect`内で値をセットしてあげるという感じです。

これを`useMemo`で書く場合は下記のように表せます。


```javascript
  const isBirthMonth: boolean = useMemo(
    () => getMonth(user.birthday) === getMonth(new Date()),
    [user.birthday]
  )
```

この方がコード量が減ってシンプルですよね！

セット関数 `setIsBirthMonth` が他でも使われている場合は `useState` で定義するべきだと思いますが、**今回のように `useEffect` 内で一度しか使われていない場合は**、無理に`useState`でセット関数を定義せずに、`useMemo`で書くのもありかなと思いました！

イメージ的には、`useState + useEffect = useMemo`という感覚ですが、
レンダーの回数などパフォーマンスの面で見ると厳密には違うのでその変は[こちらの記事](https://stackoverflow.com/questions/56028913/usememo-vs-useeffect-usestate)をどうぞ！
Javascript始めます

# はじめに

本題の通り、Javascriptを5年ぶりくらいに始めます。
きっかけは、とあるIT企業のコーディングテストでJavascriptの実装問題が出されて、何も太刀打ちできなかったのがマジで悔しかったからです。


# 今後
miniforge以来、Qiita更新してこなかったんですけれど、勉強経過・アウトプットを兼ねてこちらで更新していければと思います。
【python】画像を任意の横軸で分割


```python
import numpy as np
import cv2

def onMouse(event, x, y, flag, wname):
    global cnt
    global img
    
    if event == cv2.EVENT_MOUSEMOVE:  # when mouse move, draw line
        img2 = np.copy(img)
        h, w = img2.shape[0], img2.shape[1]
        # cv2.line(img2, (x, 0), (x, h - 1), (255, 0, 0), thickness=2) # vertical line
        cv2.line(img2, (0, y), (w - 1, y), (255, 0, 0), thickness=2) # horizontal line
        cv2.imshow(wname, img2)

    if event == cv2.EVENT_LBUTTONDOWN:  # when left click, get (x, y) and split image
        print(x, y)

        # split image
        cv2.imwrite('split_pic/split_' + '{:03d}'.format(cnt) + '.jpg', img[:y, :, :])
        cnt += 1

        # update image
        img = np.copy(img[y:, :, :])
        cv2.imshow(wname, img)

if __name__ == '__main__':
    # global parameter
    cnt = 0
    img = cv2.imread('sample.png')

    wname = 'MouseEvent'
    cv2.namedWindow(wname)
    cv2.setMouseCallback(wname, onMouse, wname)
    cv2.imshow(wname, img)
    cv2.waitKey()
    cv2.destroyAllWindows()

```

> 参考
[【python-openCV】画像を縦、横方向に指定数で等分割する方法！ - ヒガサラblog]([https://www.higashisalary.com/entry/python-split\_pic)
[Pythonで画像の座標を取得する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン](https://magazine.techacademy.jp/magazine/51035#ta-toc-2)
[python — Python OpenCV CV2のimshow（）ウィンドウを更新する方法](https://www.web-dev-qa-db-ja.com/ja/python/python-opencv-cv2%E3%81%AEimshow%EF%BC%88%EF%BC%89%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1050769829/)
[python — opencvのwaitKey（）関数に他のキーを使用する](https://www.web-dev-qa-db-ja.com/ja/python/opencv%E3%81%AEwaitkey%EF%BC%88%EF%BC%89%E9%96%A2%E6%95%B0%E3%81%AB%E4%BB%96%E3%81%AE%E3%82%AD%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B/1071765657/)
[OpenCVを使ってマウスイベント（手動）でテニスコート領域を選択できるようにする - Qiita](https://qiita.com/otakoma/items/04e525ac74b7191dffe6)
[Python, OpenCVで図形描画（線、長方形、円、矢印、文字など） | note.nkmk.me](https://note.nkmk.me/python-opencv-draw-function/)
[Python, formatで書式変換（0埋め、指数表記、16進数など） | note.nkmk.me](https://note.nkmk.me/python-format-zero-hex/)
Artificial intelligence, ボッシュ自動車handbook 11版(16)p.248

Artificial intelligence,  ボッシュ自動車handbook 11版(16)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

ハンドブック 日本語【第3版】

https://www.amazon.co.jp/dp/4990476816/ita.com/kaizen_nagoya/items/57c799ff544c96efdea9
 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

# Artificial intelligence
p.248
## Introduction to AI
### History of AI
### Significant milestones
### Significant applications
## Machine learning
### Example
### Leaning strategies
### Important algorithms
## Representation of Information
## Planning
### Significance of planning
### inteligence
## IT security of AI system
### Comparison of an AI system with a classic program
### Manipulation possibilities
# Reference

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221016

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
学習プリントのカテゴリごとにスクレイピングするの、配列でループしてちょっと便利にした

# 前回やったこと
https://qiita.com/nana_nana/items/4d73092787accb4d3387


# 簡素な改修
このままだと、ほしいページ配下のデータしか取得できない。

# ほしいページを配列に入れてループしよう
少し作り変える

# 改修前
```
pageName = "kasa-kurabe"
url = "https://print-kids.net/print/sansuu/" + pageName + "/"
```


# 改修後

```
pageNames = {"ikimono-card","okashi-card","douro-hyoushiki-card","tenki-kion-fukusou","hyoujou-kimochi","hyousyoujou"}

for pageName in pageNames:
    url = "https://print-kids.net/print/other/" + pageName + "/"
```

# 結果
複数のカテゴリを一挙にスクレイピングできるようになった。

配列に入れる情報もスクレイピングしたらいいじゃんと思ったが、ほしくないデータも大量に受け取るのもてにあまるので、一旦はこれは個人利用の最適解と認識し、プリントスクレイピング改修はほしいラインに届いたことにする。
【Rails】onclick属性を指定してもJSの関数が使えない

# やりたいこと
ビューファイルに直接書いたJavaScriptをapp/javascript/packs/application.jsファイルに移行したい。

```slim:app/views/**s/**.html.slim
javascript:
  function hoge(target) {
    〜処理〜
  }

input type="button" value="hoge" onclick="hoge(this)"
```

# 上手くいかない
JavaScript部分をそのまま切り取ってapp/javascript/packs/application.jsファイルに移行すると今まで動いていたのに、動かなくなってしまう。

# [teratail](https://teratail.com/questions/343393)で解決法を発見
> 記述したjavascriptが関数でラッピングされてる可能性があるので、HTML側から呼び出せないのかもしれません。
関数をonclickで呼び出したいならglobal領域に突っ込んであげると上手くいくかもしれません。

とのこと。

# 解決
以下のように書いてあげるとビューファイルに直接書いたときと同じ動きをしてくれる。
```js:app/javascript/packs/application.js
window.hoge = function (target) {
  〜処理〜
}
```

# 参考
- [【teratail】Rails6 onclickでJSの関数がなぜ呼び出せないのかがわかりません](https://teratail.com/questions/343393)
AgriTech [X-Techの派生分野②]

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

本記事では、X-Techの派生分野②としてAgriTechについてまとめます。
X-Techについては[こちらのリンク](https://qiita.com/7_inai_/items/126f512fa47823237500)からご確認ください。

# AgriTechとは
AgriTech(アグリテック)とは`Agriculture(農業)とTechnology(技術)を組み合わせた造語で、農業と情報技術を掛け合わせた領域`を指します。
日本では農林水産省が推し進める __スマート農業__ がこのAgriTechと同じ位置付けにあります。

# AgriTechの事例
### ■農業の効率化
- 機械学習で収穫可能かを判別し、収穫可能な食物のみを収穫する
- ドローンで自動植林、農薬の自動散布
- スマホアプリで食物の栄養状態の確認
### ■都市型農業の推進
地方から若者が離れていることを受けて、都市で農業を行う都市型農業が注目されています。
小さい土地で作物を作れる上に、わずかな輸送費で多くの人に届けられることもあって非常に注目されている都市型農業には、以下のようなテクノロジーが使われています。
- 温度センサーで水分や湿度を検知し、自動で調整
- IoTデバイスで、家畜の機微な変化を素早く察知
- 収穫作業の自動化
### ■農業の働き方改革
多くの企業では働き方改革のために業務効率化及び業務改善に取り組んでいますが、団体ではなく個人で仕事をすることが多い農家の方は、作業の分担ができないために休みたい時に休めない状態が続くこともよくあります。そこでIT技術を取り入れ、作業負荷を減らすことで働き方の改善につなげることができます。
- トラクターなどの農機具を自動化
- 作物の様子をリモートで観察
- 農作業をロボットに転換

# AgriTechを推進するための技術
### ①[IoT](https://qiita.com/7_inai_/items/f2a56498b70b39befa0b)
生産物や農機具にセンサーをつけることで、農作物に対するデータをリアルタイムかつリモートで取得し、今後の作業に活用することができます。
### ②農業用ドローン
上空から、種まきや肥料散布を行うことで、手作業よりもより効率的に農作業を行えます。
### ③[ブロックチェーン](https://qiita.com/7_inai_/items/2ea53163ae5ec3df9cfe)
ブロックチェーンによって複雑化したサプライチェーンを一元的に管理することで、トレーサビリティを改善することができます。それにより品質管理を容易に行うことができます。
→消費者から指摘があった際に、作物の流通経路がすぐわかる等。

# 終わりに
AgriTechで農作業は劇的に進化すると思いますが、比較的高齢者の方が多い農家の方々にとってはこれらのIT技術の導入は簡単は話ではないでしょう。そのため企業と農家の協力しあいながら、農業の改革を進めることが大切だと私は考えています。


最後までお付き合いくださりありがとうございました。
Bitbucket Cloud recently stopped supporting account passwords for Git authentication.

### ※環境はMacのSourcetreeを想定
[httpsのベーシック認証は廃止](https://bitbucket.org/blog/deprecating-atlassian-account-password-for-bitbucket-api-and-git-activity "Deprecating Atlassian account password for Bitbucket API and Git activity")になったのでsshで接続する。

ssh keyが無い場合はこちらを参考に
https://support.atlassian.com/ja/bitbucket-cloud/docs/set-up-an-ssh-key/#Set-up-SSH-on-macOS-Linux

公開鍵をBitbucketに登録
https://support.atlassian.com/ja/bitbucket-cloud/docs/set-up-an-ssh-key/#Step-3.-Add-the-public-key-to-your-Account-settings.1

Sourcetreeを起動し「環境設定」→「アカウント」→「追加」をタップし次のスクショを参考に入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730454/7b8940e0-8056-dd7b-be41-657b86479b5e.png)

#### アプリパスワードの使用を促されられるが・・・
廃止を伝えるページにはアプリパスワードの使用を促しているがうまく行かなかったのでssh接続を選択した。

#### 検索用
Sourcetree git 認証失敗 認証できない
Control engineering , ボッシュ自動車handbook 11版(15)p.242

Control engineering , ボッシュ自動車handbook 11版(15)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

# Control engineering 
p.242

## Terms and definitions 
### Closed loop control
### Open loop control
### Combination of open and closed loop control
### Cascade control

## Control-engineering transfer elements 
## Designing a control task 
### Control task
### System and block diagrams
### Controlled system
### Controller design
### Design criteria
## Adaptive controllers 
### Motivation
### Definition of adaptive control
### Open loop controlled adaptiations
### Adaptive with feedback
### Design notes

# Reference
[1] DIN 19226 Control technology, terms and designations
[2] W. Oppelt, Kieines Handbuch technischer Regelvorgange, 5th Edition Verlag Chemie GmbH, 1972


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9

ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9


自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221016

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.