OmniAICreator/Qiita-1.07M huggingface dataset:
クラウドIDEのススメ

![Sketch 492021 914 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293052/31b23da3-6f60-c650-1c78-55b788a0f24b.png)

#何が良いの

統合開発環境のセットアップもできないなんて草生えますね

はい、私も最初そうでした
インストールするだけじゃん、なんでわざわざオンラインでやんのよ？
って思ってました

いや奥さん、これが意外と良いんですよ

##なぜわざわざブラウザからやるのか

特徴を並べるとこんな感じ

1.まんまVSCode
2.ブラウザさえあればiPadだろうとChromebookだろうとスマホだろうとラズパイだろうと……ディスプレイとネットワークとキーボードがあれば動く
3.GitHub連携できる（もうGitHubの管理アプリに数千円払わなくて良いんですよ！！
4.サーバーに処理任せてるので意外と軽い
5.だいたい無料

安い・軽い・早い！
牛丼屋かお前は、って感じ

iPadからC#プロジェクトをビルドできるの体験するとドン引きしますよ
私はした

#使い方

一番のおすすめはGoogleのCloud Shell
[**ココ**](https://cloud.google.com/shell?hl=ja)に行って

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293052/8e60294c-e7fc-6412-4f34-14ddd29fff8f.png)

右上の**コンソール**を開く

さらに右上の**Cloud Shellをアクティブにする**をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293052/0c4d0859-61e5-2666-e2c0-62ebcd57107e.png)

下の方に生えてきたCloud Shellの
さらに右側**新しいウィンドウで開く**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293052/cba9749a-15d3-7acc-f6f0-9eef138db8e3.png)

最後に**エディタを開く**を押せば……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293052/5de1d71c-327a-eb3f-209e-e26a57b45d81.png)

動いた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293052/4b4e3689-8df8-2705-38f7-1c91f096708c.png)

#しばらく使った感想

iPadからC#をビルドできるのが最高にヤバい
プライベートGitリポジトリ完備なのも素敵
デフォルトでJupyterNotebookまで使える、変態かよって感じ

欠点は、拡張機能ないのん？
日本語表記ないのん？
GitHub連携どこ？
プロジェクトファイルの管理煩雑なのでは？
みたいなところ
あと、ハイスペPC持ってるなら、素直にDockerで仮想環境組んで、VSCode弄った方がパフォーマンスは確実に高い

ただ、Web系フロントエンド弄くり回すには最高にお手軽なので好き


GitHub派の方は、Gitpodを使えばいいと思う（CodeSpaceはよ）
Gitpodを駆使するにはDockerをマスターしないといけないみたいなので
私には敷居が高すぎました
未だにC#プロジェクトをビルドできる気がしない

そんな感じ
そりゃあFacebookもWebIDEでリモート開発をデフォルトにするわって納得しました
データ型種類と　変数のルールについて

#データ型の5種類について#

1 整数(int型)
　　少数を含まないデータ型の種類のこと

2 小数点(flout,double型）
　 少数を含むデータ型のこと

3 文字型(char型)
 　1文字を扱うためのデータ型のことシングルクオーテーションでくくるらしい...

4 文字列型(String型)
　文字列を扱うためのデータ型　例（"konnitiwa"）

5 論理型(boolean型)
　判定結果をtrue,falseで返してくれる便利なもの

#型の違い#

String型以外は基本データ型と言われ、
仲間外れにString型が存在します。

一つだけデータの型が違うので間違えないようにしましょう。

#間違いやすいエラー#

変数に値を代入する際に一番大事なルール

**①　型名　変数名　=  値;**

特に、型名とコロンをつけ忘れてエラーにつながってしまうケースが多発するので注意してコードを書きましょう!!

また、変数設定の際に初期化も行ってくれますのでいちいち0を代入する手間もないわけです

②　**データ型指定は一度きり**

        package jp.co.f1.superintro.ch06;

        public class quiit {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		int num = 12;
		float num = 13;
		System.out.print(num);
	}


このコードの結果が

```
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	重複ローカル変数 num
at jp.co.f1.superintro.ch06.quiit.main(quiit.java:8)
```

となってしまいます。結論一つの変数には一度データ型を指定したらあとは値を代入するだけでOKです
モバイルアプリのリスクTop10「OWASP Mobile Top 10」（2016年版）

## はじめに

OWASPが公開しているモバイルアプリのリスクTop10を紹介します。

英語が読める方は以下の公式ページを直接見るのがいいと思います。

https://owasp.org/www-project-mobile-top-10/

内容はGitHubで管理されているようです。

https://github.com/OWASP/www-project-mobile-top-10/blob/master/index.md

## 注意

2016年版が最新のため、現在では古くなっている可能性があります。

## 「OWASP」とは？

「Open Web Application Security Project」の略で、Webアプリをはじめとするセキュリティ環境の現状や、セキュアなアプリ開発を促進する技術やプロセスに関する情報共有と普及を目的としたOSSコミュニティです。

## OWASP Mobile Top 10

OWASP Mobile Top 10を順に紹介します。

### M1: Improper Platform Usage（プラットフォームの不適切な使用）

https://owasp.org/www-project-mobile-top-10/2016-risks/m1-improper-platform-usage

TBD

### M2: Insecure Data Storage（安全でないデータストレージ）

https://owasp.org/www-project-mobile-top-10/2016-risks/m2-insecure-data-storage

TBD

### M3: Insecure Communication（安全でない通信）

https://owasp.org/www-project-mobile-top-10/2016-risks/m3-insecure-communication

TBD

### M4: Insecure Authentication（安全でない認証）

https://owasp.org/www-project-mobile-top-10/2016-risks/m4-insecure-authentication

TBD

### M5: Insufficient Cryptography（不十分な暗号化）

https://owasp.org/www-project-mobile-top-10/2016-risks/m5-insufficient-cryptography

TBD

### M6: Insecure Authorization（安全でない認可）

https://owasp.org/www-project-mobile-top-10/2016-risks/m6-insecure-authorization

TBD

### M7: Client Code Quality（クライアントコードの品質）

https://owasp.org/www-project-mobile-top-10/2016-risks/m7-client-code-quality

TBD

### M8: Code Tampering（コードの改ざん）

https://owasp.org/www-project-mobile-top-10/2016-risks/m8-code-tampering

TBD

### M9: Reverse Engineering（リバースエンジニアリング）

https://owasp.org/www-project-mobile-top-10/2016-risks/m9-reverse-engineering

TBD

### M10: Extraneous Functionality（外部機能）

https://owasp.org/www-project-mobile-top-10/2016-risks/m10-extraneous-functionality

TBD

## おわりに

TBD

## 参考リンク

- [OWASP Japan Local Chapter Meetup | OWASP Foundation](https://owasp.org/www-chapter-japan/)
FactoryBotの[KeyError:Factory not registered: "user"]のエラー解決。

KeyError:
        Factory not registered: "user"

が出たので検索して調べた結果、factoriesディレクトリのusers.rbが関連してるような投稿を発見。

早速その中身を見に行こうとしたら...ファイルがなぜか存在しないことが判明！手動で作成し、中身を記述することに。


FactoryBot.define do
  factory :user do
    email                         {Faker::Internet.free_email}
    password = '1a' + Faker::Internet.password
    password { password }
    password_confirmation { password }
     nickname                        {'yyy'}
     last_name                       {'かな'}
     first_name                    {'かな'}  
     last_name_kana          {'カナ'}        
     first_name_kana           {'カナ'}      
     birth_info    {'1999-12-21'}
  end
end

無事解決しました。
動的ページとその仕組み

## 動的ページとは
Webページには静的ページと動的ページが存在する。前者は製作者が変更しない限り内容は変わらない、初期のWebによくあるページだった。しかし、Webの発展とともに、閲覧者の状態や要求に応じて内容を変化させる後者が生み出された。
例えば、Googleのような検索サイトは、ユーザーからWebブラウザを通して送られるデータを受け取り、Webサーバーが検索処理を実行する。その後、検索結果を表示するHTMLファイルをWebサーバーが作成し、Webブラウザに送信する。この結果は毎回最新のものに置き換わることから動的と言える。
## 動的ページの仕組み
WebサーバーがWebブラウザからの要求に応じてプログラムを起動させるための仕組みを**CGI**（Common Gateway Interface）と呼ぶ。
WebブラウザからCGIが用意されたURLにアクセスすると、受信WebサーバーではCGIによってプログラムが起動する。プログラムは送られてきたデータやWebサーバーが持つデータなどからHTMLファイルを生成し、WebサーバーからWebブラウザに送る。
これにより、Webサーバーから同じ要求があっても、Webサーバーからは毎回異なったコンテンツを送ることができる。
## サーバーサイド・スクリプト
CGIから呼び出されるプログラムはサーバーサイド・スクリプトと呼ばれる。
どのようなプログラミング言語でも問題ないが、一般的には文字列の扱いに長けたスクリプト言語（Ruby,Python,JavaScriptなど）で記述される。
##  クライアントサイト・スクリプト
サーバーサイド・スクリプトに対し、あらかじめHTMLに埋め込まれ、Webブラウザによって読み込まれる際に実行されるクライアントサイド・スクリプト（JavaScriptが主）がある。
### スクリプト言語とは
本格的な実行環境や翻訳（コンピュータが理解できるようにする作業、コンパイル）を意識せずにすむ言語。自然語に近い記述で、実行しやすく、コーディングの負担が少ない。
対照的なものとして、コンパイラ言語がある。コンパイル作業や本格的な実行環境が必要だが処理は早いので、大量の処理を行う場合に向いている。
# 参考
[イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/gp/product/B06XNMMC9S/ref=ppx_yo_dt_b_d_asin_title_o05?ie=UTF8&psc=1)
Learn Python In Seminars〜基本的なファイル操作〜

## 読込

./test.txt

```
2021-04
0  10
1  20
3  30
4  40
5  50
```

index.py

```
fileName = "./test.txt"

"""
mode=rは読み出し専用
https://docs.python.org/ja/3/tutorial/inputoutput.html
"""
f = open(fileName, mode="r", encoding="utf-8")

for i in f
    print(i)
```

↓ 出力結果

```
2021-04

0  10

1  20

3  30

4  40

5  50
```

### 改行を除去

スペースなどが改行として扱われてしまう

```
for i in f
    s = i.strip()
    print(s)
```

↓ 出力結果

```
2021-04
0  10
1  20
3  30
4  40
5  50
```

### タイトルと先頭の数字を削除

```
for i, o in enumerate(f);
    s = o.strip()
    if i > 0:
       s2 = s.split("\t")
       """
       ex.split後
       [0, 10]
       s2[0]→0、s2[1]→10
       """
       print(s2[1])
```

↓ 出力結果

```
10
20
30
40
50
```

## 出力

index.py

```
fileName = "./output.txt"
f = open(fileName, mode="w", encoding="utf-8")

for i in range(5):
    f.write(str(i) + "\n")

"""
closeをしないと更新されない
"""
f.close
```
↓ 実行

./output.txt

```
0
1
2
3
4
5
```

## with

**with**を利用することで**close**を省略可能

```
with open("./test.txt", mode="r", encoding="utf-8") as f:
    for i in f:
        print(i)
```

## 参考

https://docs.python.org/ja/3/tutorial/inputoutput.html#reading-and-writing-files

<br>
他にも「[Learn Python In Seminar](https://qiita.com/k8m/items/4952894a80c1833e5501)」のシリーズとして書いているので、よければご覧ください！
Linuxに一切触れずにRailsチュートリアルをやるとどうなるか

#はじめに
僕は勝俣健太さんがある動画で言っていた、Railsの学習手順をある程度参考にしながら学習を進めていました。
ある程度というのは、Macを買う前にできるだけ進めようという前提のもと、
Linux標準教科書とキタミ式基本情報技術者、Gitを飛ばして学習をしているという感じです。
（基本情報技術者に関しては、触れないでください。。。やり終わるまでに他が終わってしまったんです。。。）

#結果
まず、1章でcloud9上で環境構築を行うのですが、
・そもそもどこに入力するの？？？
・コマンドラインってなに？？？
・あれ？Progateのコードはさかのぼって消せたのに、消せないぞ？？？あるぇ？？？


という、ありえないレベルの躓き方をしました。
急いでProgateのコマンドラインを1周して、なんとなくの雰囲気はつかめたものの
ポートフォリオ作成の段階で無駄な時間を生み出してしまいそうなので。Linux標準教科書には触れようと思います。

#今後は
資金の都合上、Macの購入が5月以降になってしまうので、Linux標準教科書に手をつけるのはまだ先になってしまいそうです。
とりあえず、ProgateのRailsを1周して、力を蓄えようと思います。

#最後に
とりあえずProgateで言語の基礎はやったし、Railsチュートリアルやっちゃう？？
みたいに思っている人の参考になればいいと思います。
少なくともコマンドラインの基礎は触れるのが吉だと思うので、そちらを触れてからやってみてください。
ThinkPadには緊急用リセットホールが存在し、爪楊枝がジャストフィットします

# 背景

タイトルバレですが、検索用に。。。

WindowsUpdate実施後、ThinkPadの電源ボタンとESCキーが白く点灯したままで、電源ボタンを長押ししても停止も起動もしない状態になった。

会社のIT系のヘルプデスクは英語で、自分、英語しゃべれないんだけど・・・と英語でのレポーティングの恐怖を感じつつ、半泣きで調査開始

# ThinkPadには緊急用リセットホールが存在する

ググると以下のドキュメントにすぐにたどり着きました。

[バッテリ内蔵タイプのThinkPad製品で、フリーズや電源が入らない症状の対処方法](https://support.lenovo.com/jp/ja/solutions/ht104894)

確かに、穴が開いているし、これがリセットホールなのかー

![リセットホール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47987/6d18b7f4-7628-e88c-67ec-ec2e95491eb0.jpeg)

あとは、リセットホールを押下するだけになのですか、ここからが長かったです。

# 試したもの

![ドライバーなど.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47987/234756d0-6017-1d3a-534d-31684dc916a9.jpeg)

まずはドライバーとかが入っている工具箱を開き、先っぽが細いものでひたすら押下しました。

1. ドライバー類
1. 黒いL字の何か
1. 針金っぽい何か
1. ボールペン類 

家中のボールペンでひたすら押してみますが、どれも反応しない。。。
英語で報告しないといけないという絶望を感じつつ、ひたすら一心不乱に家中を探し回りました。

これは、なんかすこしずつ削って試すしかないのではないかと考え、
加工しやすい何か。。。 と思考を巡らせてみると、爪楊枝があるじゃないかと気づきました。
ダッシュでキッチンに向かい、爪楊枝を確保して仕事部屋に向かい、ホールに指すとジャストフィットしました。

そして、ThinkPadの電源ボタンを押下すると、無事にWindowsが起動し、ログインできました。
無事に英語のレポーティングの恐怖から解放された瞬間でした。

# 感想

Lenovoさんがこの記事を見てくれたら、ペン先等で押下できるように改善頂けると嬉しいです。

# コメントで頂いたもの

家庭にありそうなもの大募集です!! 

1. SIMピン ・・・　動作確認済み
1. ゼムクリップ　・・・　自宅には存在せず、未検証
1. MOドライブのイジェクトピン ・・・ MOドライブはすごく懐かしいけど、誤家庭にしか・・・
全てのブランチを最新コミットと共に表示

#概要
GitHubのブランチを最新コミットのコメントと共に表示する方法をメモします。

#用途
ターミナルからリポジトリ全体を把握したい時に使っています。

#方法

下記コマンドを実行

    git branch -vv
活性化関数について

# はじめに
Deeplearningでは，活性化関数というものが用いられます．基本的な活性化関数（Tanh, Sigmoid, Relu）の特徴，及びそれら関数のpythonコードをメモしました．

# Tanh
出力は、-1.0 ~ 1.0の間。

$$
o = \tanh (i) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}
$$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/4abffe8d-4ff0-2aa0-cf98-004f62bf32ae.png)


# Sigmoid
出力は、0.0 ~ 1.0の間（確率）。

$$
o = sigmoid (i) = \frac{1}{1 + e^{-x}}
$$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/bdde224e-9435-1346-3fe7-d6a3ffc72c62.png)


# Relu(Rectified Linear Unit)
入力 < 0の時、出力 = 0
入力 > 0の時、出力 = 入力

Reluは画像データと相性が良い。
画像データはuint（負がない）なので、画像を処理してマイナスになったものは「ノイズ」とみなして切り捨てる（=0にする）。

$$
o = max(0, i)
$$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/b4ab70ee-8002-c8f0-6638-716230045b9a.png)

# pythonコード

```python
import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def tanh(x):
    return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))

def relu(x):
    return np.maximum(0, x) 
```

# 補足
一つのモデルの中で、relu, sigmoid, tanhなどを混在して使う場合あり。
PowerShellの処理結果を実行ログとして残したい

PowerShellでまとまった処理を実行する場合、実行ログを残したいことがある。そんなときに便利なのが、「start-transcript」〜「stop-transcript」。この間に記述されたPowerShellのコマンドレットの実行結果（標準出力）がログファイルとして出力される。

```powershell
start-transcript;

#処理を記述

stop-transcript;
```

ファイル名や出力先の指定、ファイルの上書き可否などもオプションで設定できる。

オプションを指定しなかった場合はユーザーのドキュメントフォルダに「PowerShell_transcript.ハッシュ値とタイムスタンプ.log」といった名前でログが出力される。

出力されるログファイルを確認すると、実行したタイムスタンプやユーザーも記録されており、これ一本で随分といい感じのログ出力処理が完成する。

##注意点

結果が出力されるのはあくまで「PowerShellコマンドレット」の「結果」だけという点に注意してほしい。

実際のログでは「何の処理を実行したか」や、「DOSコマンドや.NETオブジェクトの処理結果」も記録したいと思うので、下記実装例を足がかりにしてもらえたら良い。

```powershell
start-transcript;

#標準出力だけでは何の処理結果か読み取れないため、このようにコメントも出力するとわかりやすい
Write-Output "フォルダ作成 start..." | Out-Default;

#New-Itemコマンドレットでフォルダを作成した結果は自動で出力される
New-Item .\hoge

#DOSコマンドなどを実行する際はOut-Defaultで明示的に結果を出力する必要がある
#この場合はすでNew-Itemでhogeフォルダを作成済なのでエラーが出力される
mkdir .\hoge | Out-Default;

#.NETオブジェクトの処理結果も同様にOut-Defaultが必要となる
$hogeObject = New-Object System.Hoge;
$hogeObject.Value = "ほげほげ";
Write-Output $hogeObject.Value | Out-Default;

stop-transcript;
```

これはあくまでサンプルです。
あとはそれぞれの用途に応じて効率的に記述してください。
[Ubuntu 20.04] logwatchでswatch IDSの状況を報告する

　<a href="https://qiita.com/yukisku/items/d5c3ddf937cc52839445">前回までの記事</a>で構築したswatch IDSの仕事ぶりをlogwatchで報告するスクリプト。

# Logファイル場所の指定

```bash
vi /etc/logwatch/conf/logfiles/swatch.conf
```

```:/etc/logwatch/conf/logfiles/swatch.conf
#################################################
# Swatch Monitering Daemon configure file for logwatch.
# This file specify a log file of the /var/log/ directory.
#################################################
LogFile = ./swatch/swatch.log
LogFile = ./swatch/swatch.log.1
```

# レポートのタイトルを設定

```bash
vi /etc/logwatch/conf/services/swatch.conf
```

```:/etc/logwatch/conf/services/swatch.conf
#########################################################
# Swatch Monitering Daemon configure file for logwatch
#########################################################
# The title of report.
Title = "Swatch Monitering IDS"
# Which logfile group.
LogFile = swatch
```

# 統計データ抽出スクリプトを書く

```bash
vi /etc/logwatch/scripts/services/swatch
```

```perl:/etc/logwatch/scripts/services/swatch
#!usr/bin/perl

$cnt = 0;
$spcval = 0;
@arraypre = ();
@arraypost = ();
$Sttcnt = 0;
$Shtdcnt = 0;


# Get a string of date.
$myTimes = time - 24 * 3600;
@watchdate = localtime($myTimes);
$mday = $watchdate[3];
$month = $watchdate[4];
@monthly =
 ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
if($mday<10){
  $targetdate = "$monthly[$month]"."  $mday";
  $spcval = 1;
}else{
  $targetdate = "$monthly[$month]"." $mday";
}

while (<>) {
  $logdate = substr($_,4,6);
  if ($logdate =~ $targetdate) {
    if (/locked/){
      @arraypre = split(/ /, $_);
      $targetIP = sprintf("%-15s", "$arraypre[6 + $spcval]");
      if(!$cnt){$targetIP = " $targetIP";}
      @arraypost = (@arraypost, "   $targetIP : $arraypre[8 + $spcval] $arraypre[10 + $spcval] $arraypre[11 + $spcval] $arraypre[12 + $spcval]");
      $cnt++;
    }

    if (/Shutting down/) {
            $Shtdcnt++;
    }

    if (/has started/) {
            $Sttcnt++;
    }
  }
}

if ($cnt) {
  print "The following $cnt IP(s) has been resistered\.\n";
  print "@arraypost\n";
} else {
  print "   No newly resistered IP(s)\.\n";
}

if ($Shtdcnt) {
  print "\n   Daemon shut down $Shtdcnt time(s)\.\n";
}

if ($Sttcnt) {
  print "\n   Daemon started $Sttcnt time(s)\.\n";
}
```

以上。
クラスの依存関係を明確にする

某参考書を読んでいて参考になった箇所があったのでメモ。(記載のソースは自作のもの）

例えば、以下のようなコードでは、FruitクラスはAppleクラスが存在することを知っている(依存している)。
かつ、それが「Fruitクラスのfruit_nameメソッドの中」という深い場所で発生してしまっているので、一見して気づきにくい。

```ruby
class Fruit
  def fruit_name
    Apple.new.name
  end
end

class Apple
  def name
    puts "Apple"
  end
end

Fruit.new.fruit_name
```

これだと一見依存を見つけにくいので、以下のようにすると明らかにしやすい。

```ruby
class Fruit
  def fruit_name
    apple.name
  end

  def apple
    Apple.new
  end
end

class Apple
  def name
    puts "Apple"
  end
end

Fruit.new.fruit_name
```

あるいは以下のようにinitializeで定義してもいい

```ruby
class Fruit
  attr_reader :apple
  def initialize
    @apple = Apple.new
  end

  def fruit_name
    apple.name
  end
end

class Apple
  def name
    puts "Apple"
  end
end

Fruit.new.fruit_name
```

そもそもFruitがAppleを知っているのが良くないみたいだが、そこについてはこれから勉強...
特定のOUからのイベントを受け取るEvent busのポリシーを書く

## はじめに

AWS ConfigなどをOU（Organization Unit）以下にデプロイし、通知をChatbotで設定する際、Event busにOU内の他のアカウントからのイベントを受け取るポリシーを書く必要があります。
（そうしないとすべてのアカウントでChatbotを設定しないといけないため）

下図のようなイメージです。

![archi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187545/a7983cfa-8c08-f341-4ec9-f502902c63a7.png)

OUが追加された時にポリシーを書き変えるのは骨なのでなんとかしたいです。


## 結論
Event busのポリシーの `Condition` を次のようにすればいけます。

`o-1122334455` は Organization ID、`ou-1`, `ou-2` はOUのIDです。

```json
"Condition":{
	"ForAnyValue:StringLike":{
		"aws:PrincipalOrgPaths":[
		  "o-1122334455/*/ou-1/",
		  "o-1122334455/*/ou-2/"
		]
	}
}
```
参考1 より


## 余談1

参考1 によると、

* Organization ID はユニーク
* Root ID はユニークじゃない（Organization内ではユニーク）
* OU ID はユニークじゃない（Organization内ではユニーク）

らしいです。

なのでOUを一意に指定したい時は Organization ID と OU ID の両方が必要になります。


## 余談2

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/CloudWatchEvents-CrossAccountEventDelivery.html

最初この資料を見てできないと思ってましたがなんとか参考1の情報を見つけました。自分を褒めたいです。


## 参考
1. https://aws.amazon.com/jp/blogs/security/iam-share-aws-resources-groups-aws-accounts-aws-organizations/


## 終わりに
バケットポリシー、IAMポリシーなどのポリシー系はこの書き方が使える（らしい）のでOUが設定されている環境ではガンガン使っていきましょう！

### 検証済み
* バケットポリシー
* Event busポリシー

（他は未検証）
.ssh/config の host 記述は大文字と小文字を判別

ssh のよく使う（よく忘れよる）スイッチ類を書き留めておく設定ファイルがあって、その中で接続先に特化した設定を書くのじゃが、そこで嵌った💦

##なんと、ホスト名が大文字と小文字を区別しよって解釈されちょった

```text:config
host *.freebsd.org
```

当初はこの記述しか書いとらんので、
ssh *.freebsd.org で接続は問題なく設定が解釈されちょったのじゃが、
ssh *.FreeBSD.org としよったら無視された。

で、結局解決方法はアドホック的な解決方法じゃが、双方記述する事で回避可能じゃが、なんじゃかしっくりこん。

そもそも host 項目が、接続先ではなくて、タイトル見たいな位置づけなんじゃね。
じゃけ完全一致になっちょるのじゃろな。

経緯は知らんけど✌
【 Kotlin 】nullの扱い方について

##はじめに

Android Studioの補完機能のおかげでnullの扱いについて曖昧な理解になってしまっていたので、理解している範囲でまとめました。

##null安全とは

Kotlinは、JetBrain社がJavaに代わり、より簡潔に書くことを目的として作られたJVM(Java仮想マシン)上で動作する静的型付き言語です。
静的型付き言語はコンパイル時に型チェックが行われるため、実行時に型が原因でのエラーは起きないという特徴を持ちます。JavaやKotlinもこれにあたり、「型安全」な言語とも言います。

同様に、「null安全」な言語はコンパイル時に変数がnull許容型(Nullable)かnull非許容型(Non-Null)かチェックされるため、実行時にnullによるエラーは起きません(基本的にnull非許容型が原則)。
Kotlinはこの性質を持ちますが、Javaにはありません。


##null非許容型(Non-Null)の特徴

**宣言と代入**

```php
var a : String = "hello!!"
a = "apple" // ok
a = null // Error
```
String型の変数aを変更可能なように宣言したとします。
appleを代入することは可能ですが、原則nullの代入は許されないのでコンパイル時にエラーが起きます。

**参照**

```php
var a : String = "hello!!"
println(a.length) // ok
```
null許容型のメソッドやプロパティを参照する際はエラーなし。

##null許容型(Nullable)の特徴

**宣言と代入**

```php
var b : String? = "hello!!"
b = null // ok
```
変数bをnull許容型として宣言したい場合、型の後ろに?を付けるとnullの代入が可能になります。

**参照**

```php
var b : String? = "hello!!"
println(b.length) // Error
```
null許容型のメソッドやプロパティを参照するとコンパイルエラーが起きます。
null許容型はこのままでは参照することができないので、null許容型からnull非許容型に変えてあげる必要があります。

##null許容型からnull非許容型へ

**①nullチェック**

```php
var b : String? = "hello!!"
if( b != null ){
println(b.length)
} // 7
```
bがnullでなければ参照可能

**②スマートキャスト**

```php
var b : String? = "hello!!"
if( b is String ){
println(b.length)
} // 7
```
String?型からString型に型変換することで参照可能に

**③安全呼び出し**

```php
var b : String? = "hello!!"
println(b?.length) // 7

var b : String? = null
println(b?.length) // null

```
変数の後に?を付けることでnullでない場合は参照しnullであればnullが返ります。

**④エルビス演算子**

```php
var b : String? = "hello!!"
println(b?.length ?: 0) // 7

var b : String? = null
println(b?.length ?: 0) // 0
```
?:演算子をエルビス演算子といい、nullであれば演算子の右側を返し、nullでなければ演算子の左側を返します。(※bの後に安全呼び出しがないとエラーが起きます。)


**⑤!!演算子(※)**

```php
var b : String? = "hello!!"
println(b!!.length) // 7
```
null許容型をnull非許容型に無理やり変更する演算子ですが、bがnullであった場合NullPointerExceptionが発生するので非推奨です。
SQSのFIFOはFIFOに処理し終わることを保証する

# TL;DR
SQSのFIFOは、「メッセージの先頭から順番にconsumerにわたるよ」くらいの認識でいると痛い目にあう。

正確には

メッセージの先頭から順番に**consumerが処理し終わる**（諦めてDeadletterQueueに移動することも含む）

ことを保証している。

# ドキュメント

https://dev.classmethod.jp/articles/sqs-new-fifo/ をなんとなく読んでいて以下の記述が気になった。

> グループの先頭しかメッセージを取れませんので、100万件のメッセージが入っていても、グループが1つであれば、ワーカは2つ以上あっても意味がありません。例えば、メッセージの重複だけを排除したいだけで、順序は必要なく、高いスループットでワーカーによる処理を行いたい場合は、メッセージ毎にユニークなUUID等でグループIDを付ければOKです。

「ワーカは2つ以上あっても意味がありません」とは？
AWSの主張をみてみると、

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html

> Messages that belong to the same message group are always processed one by one, in a strict order relative to the message group (however, messages that belong to different message groups might be processed out of order).

とあり、`processed one by one`とある。
さらに、

> When messages that belong to a particular message group ID are invisible, no other consumer can process messages with the same message group ID.

とある。

つまり、「メッセージの先頭から順番にconsumerが処理し終わる」ことを保証していると理解した。

# 検証
とても簡単にできる。
前提として、

* FIFO
* DeadletterQueueが設定され、最大受信数10
* 可視性タイムアウト 1分

のキューを想定する。consumerがlong pollingでずっとメッセージをpollingしている状況を想定する。

Invalidなメッセージでconsumerがエラーをはいて処理をしない（キューから削除しない）メッセージAと正常なメッセージB/C/Dを用意する。

AWSのコンソール画面にて、

* 00:00にメッセージグループID`xxx`、メッセージ重複排除 ID`1`にてメッセージAを配信
* 直後に以下の順で配信
    * メッセージグループID`xxx`、メッセージ重複排除 ID`2`にてメッセージBを配信
    * メッセージグループID`xxx`、メッセージ重複排除 ID`3`にてメッセージCを配信
    * メッセージグループID`yyy`、メッセージ重複排除 ID`4`にてメッセージDを配信

メッセージ重複排除 IDは今回の検証では重複させたくないので全て異なる値にしている。

この場合、consumerはどのように処理をするのか想像してみよう！

正解は

* メッセージAは00:00,00:01,00:02,00:03,00:04,00:05,00:06,00:07,00:08,00:09と10回consumeしてどれもエラーを吐いておわる
* メッセージDは00:00にすぐに処理終了
* メッセージB  -> メッセージCの順に00:10に処理される。00:10まではconsumerからはメッセージは見えない。

ドキュメントを注意深く読めば予想通りの結果になるかと思う。

# 対策
メッセージグループIDを適切に設計しましょうにつきる。
ほとんどの場合でユーザーID(ユーザを特定するキー)を指定するか、乱数を指定してしまえば要件を満たせるのでは。

後者の場合はFIFOキューによってメッセージが重複して配信されないという恩恵のみうけることになる。前者の場合は「入金イベント」「出金イベント」の二つのイベントに対して、1ユーザに対しては順番が保証されているので期待する挙動となる。

一方、誤って「入金イベント」を意味する`UserCharged`みたいなイベント名をメッセージグループIDにしてしまうと、ある処理が詰まると全ての「入金イベント」が処理できなくなり地獄を見るだろう。
cronで実行したコマンドの出力内容をsyslogに転送する

# 概要
cronで実行したスクリプトやコマンドの出力内容をsyslogに転送する方法について記載します。
以下のOSで確認を行いました。

```
# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
```

# 設定方法
crondに-sオプションを指定します。
以下URLより抜粋
https://linux.die.net/man/8/crond

```
       -s     This option will direct Cron to send the job output to the
              system log using syslog(3).  This is useful if your system
              does not have sendmail(8), installed or if mail is
              disabled.
```

crondの起動オプションに-sを追加します。

```
# vi /etc/sysconfig/crond
CRONDARGS=-s
```

crondをsystemctlで再起動します。

```
# systemctl restart crond
```

# 動作確認

1分毎にdateコマンドを実行するcronジョブを追加します。

```
# 1分毎にdateコマンドを実行
*/1 * * * * date
```

ログを確認します。dateコマンドの実行結果が1分毎に出力されます。

```
# tail -f /var/log/cron
Apr  9 19:33:01 node1 CROND[1379]: (root) CMD (date)
Apr  9 19:33:01 node1 CROND[1376]: (root) CMDOUT (2021年  4月  9日 金曜日 19:33:01 JST)
```

# 補足

/var/log/cronにメッセージが出力されない場合は、
rsyslogの以下のような設定が有効になっているか確認します。

```
# vi /etc/rsyslog.conf

# Log cron stuff
cron.*                                                  /var/log/cron
```

/etc/sysconfig/crondに指定したオプションはcrondのサービスファイルから読み込まれます。

```
# vi /usr/lib/systemd/system/crond.service

[Service]
EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGS
```

# 参考にしたURL
https://man7.org/linux/man-pages/man8/cron.8.html

# おわりに
cronで実行したスクリプトのログをsyslogで管理したい場合に使っていきたいと思います。
バッチファイルで複数ファイルの拡張子（.zi_等）をリネームする(PPAP)

Y子です。
__[昨日思いついてしまった](https://qiita.com/koiwaiwaiko/items/f47e9cd25f61a82435d4 "バッチファイルで10個以上の引数を扱う")__ ので、 __[一昨日のアレ](https://qiita.com/koiwaiwaiko/items/119efa7a50b2f96d4045 "バッチファイルで拡張子「.zi_」「.zi」「.ex_」「.ex」をリネームする(PPAP)")__ をアレしてみます。
つまり…PPAPリネームバッチの、複数ファイル対応版です！

# 概要・用途
以下の通り、拡張子をリネームするバッチファイルです。
　「`.zi_`」「`.zi`」　→　「`.zip`」
　「`.ex_`」「`.ex`」　→　「`.exe`」
　それ以外　　　　　　 →　なにもしない
複数ファイルに対応しています。10個以上でも大丈夫！

# コード
```bat:rename_ppap_multifile.bat
@echo off

:label_top

rem 引数がない場合は最後に飛んで終了する
if "%~1"=="" (
  goto :label_bottom
)

rem 変更前のファイル名(フルパス)「C:\work dir\test.xxx」
set str_oldfile=%~1

rem ファイル名分割…拡張子なし「test」と、拡張子のみ「.xxx」
set str_old_fn=%~n1
set str_old_ex=%~x1

rem 与えられたファイルの拡張子が「.zi_」「.zi」「.ex_」「.ex」なら
if "%str_old_ex%"==".zi_" (
  call :renamefile "%str_oldfile%" "%str_old_fn%.zip"
) else if "%str_old_ex%"==".zi" (
  call :renamefile "%str_oldfile%" "%str_old_fn%.zip"
) else if "%str_old_ex%"==".ex_" (
  call :renamefile "%str_oldfile%" "%str_old_fn%.exe"
) else if "%str_old_ex%"==".ex" (
  call :renamefile "%str_oldfile%" "%str_old_fn%.exe"

rem 想定外のファイルなら
) else (
  echo なにもしませんでした（%str_oldfile%）
)

rem 引数をシフトし、最初に戻る
shift
goto :label_top

rem ====サブルーチン====
rem ファイル名変更サブルーチン
:renamefile
  set str_old=%~1
  set str_new=%~2

  ren "%str_old%" "%str_new%"
  echo ファイル名を「%str_new%」に変更しました
exit /b

:label_bottom
echo 処理を終了しました
pause
```

このバッチファイルに、`.txt` `.zi_` `.zi` `.ex_` `.ex`が混じった大量のファイルをドロップします！
__ｴｲﾔｯ!__

```bat
なにもしませんでした（C:\work dir\test01.txt）
なにもしませんでした（C:\work dir\test02.txt）
ファイル名を「test03.zip」に変更しました
なにもしませんでした（C:\work dir\test04.txt）
ファイル名を「test05.zip」に変更しました
なにもしませんでした（C:\work dir\test06.txt）
ファイル名を「test07.exe」に変更しました
なにもしませんでした（C:\work dir\test08.txt）
ファイル名を「test09.exe」に変更しました
なにもしませんでした（C:\work dir\test10.txt）
なにもしませんでした（C:\work dir\test11.txt）
なにもしませんでした（C:\work dir\test12.txt）
処理を終了しました
続行するには何かキーを押してください . . .
```

おおおお！これです！これがやりたかったんです！
リネームが必要なファイルはリネームし、処理不要なファイルはそのままです。

# おわりに
__PPAP__ がどんどん高機能になっていくぞ…どこまでやりましょうね、これ。
でも次は違うことしよっかな。

ではでは！
assign requires shapes of both tensors to matchの解決法

## 概要
以下のようなエラーが出た際の対処法

```
restoring from checkpoint failed. this is most likely due to a mismatch between 
the current graph and the graph from the checkpoint. please ensure that you have 
not altered the graph expected based on the checkpoint
```

## 内容
以下のようにtensoflow1系でのsavedmodelを二つ読み込む際に一度runしたモデルでもう一方もrunしてしまう

```python
with tf.Session() as sess:
    model = tf.saved_model.loader.load(sess, [tag_constants.SERVING], export_path1)
    sig = model_x.signature_def[signature_name]
    inp = sig_def.inputs[input].name
    out = sig_def.outputs[output].name
    output = sess.run(out,
                 feed_dict={inp: my_data})

with tf.Session() as sess:
    model = tf.saved_model.loader.load(sess, [tag_constants.SERVING], export_path2)
    sig = model_x.signature_def[signature_name]
    inp = sig_def.inputs[input].name
    out = sig_def.outputs[output].name
    output = sess.run(out,
                 feed_dict={inp: my_data})
```

## 解決法
Session()内にgraph=tf.Graph()を記載する

```python
with tf.Session(graph=tf.Graph()) as sess:
```
apex:commandLink で action を実行完了後に VF にリダイレクトさせる

めもです

## やりたいこと

ボタンクリックで非同期で Apex の処理を実行し、完了後に VF にリダイレクトしたい。
例：自前のリストビューで指定のレコードを削除するボタンをクリックし、処理が完了したら画面を再読み込みしたい。

## やりかた

```html
<apex:commandLink value="レコード削除" action="{! deleteRecord }">
    <apex:param name="foo" value="bar" assignTo="{! foobarVal }" />
</apex:commandLink>
```

```apex
public PageReference deleteRecord() {

    // レコード削除処理

    String routing = '/apex/MyVfPage';
    PageReference newView = new PageReference(routing);
    newView.setRedirect(true);
    return newView;
}
```

クエリ文字列が必要な場合は末尾に `/apex/MyVfPage?foo=bar` のように追加する。
SQLでSELECTの結果をINSERTする。

# やりたいこと
以下のようなテーブル設計で各Productに対して日ごとにレポートを作成する際、(各プロダクトのid,現在の日付)の組のレコードを、sales_reportsに作成したい。

![スクリーンショット 2021-04-09 18.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/14c2ec67-3227-8279-4922-b4a090e9e4ca.png)


# 解決策
`INSERT INTO sales_reports (product_id, date) SELECT id ,CURDATE() FROM products;`
のコマンド一発でできる。

# 例
![スクリーンショット 2021-04-09 19.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/8f47edc9-7eb8-37b5-83eb-47e9d47555fa.png)
![スクリーンショット 2021-04-09 19.02.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/ca701f70-f064-3afe-3d11-7e85640387ed.png)
このような状態で、
![スクリーンショット 2021-04-09 19.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/9b62418c-905d-e6d5-8628-96a8743469c7.png)
を実行すると、
![スクリーンショット 2021-04-09 19.03.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/4b0b4d24-dbc4-69c2-158b-e50f82e79d55.png)
このようになる。
Hitogataに自作モデルをインポートする際のマテリアル

Hitogataに自作モデルのFBXをインポートする際
「テクスチャが出ない！」「変な影が出る！」等
個人的に困った事と解決方法をまとめました。

##テクスチャが表示されない！
![Q1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1297851/35535dd6-d284-920b-e6f2-e0f5d182d9fc.png)

####◆モデルと同じ階層にテクスチャを置こう

####◆シェーダーを見直してみよう
・MAYAではLambert
・BlenderならプリンシパルBSDF
…等のシェーダーを設定するとHitogata上でテクスチャが表示されるようになりました

※MMDshaderはHitogataでは未対応のようです



##意図しない陰影が表示される！
![Q2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1297851/6657ec14-a85d-6005-63ee-9ddbac97c989.png)

####◆BlenderのWorldからAmbientColorを白に設定しよう
AmbientColorを白に設定すると陰影が消え
ディフューズテクスチャだけが表示された見た目になります

※詳細はHitogata公式「BlenderからFBXをエクスポートするとき」参照
https://sites.google.com/site/vhitogata/fbx

※最新のBlenderでは項目が見当たらなかったため「Ver.2.79」を再インストールしました

##意図した通りテクスチャが表示されました
![レイヤー 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1297851/f400195f-07f9-8db8-c908-610088095209.png)


情報提供者：**オオカナダモ**様（https://twitter.com/anacharis_）
Hitogataへ自作モデルをインポートする方法はこちらの記事をお手本にさせて頂きました

https://qiita.com/anacharis_/items/0b72a7dffc211419072e
iPhoneシミュレータのDeviceの場所

#iOSシミュレータのDeviceのデータについて

Xcode付属のiOSシミュレータで利用したデバイスのデータがどこにあるか、調べてみたのでメモとして残しておきます。

#デバイスの場所

デバッグ時に起動したデバイスのデータが以下の場所に配置されています。

```shell
~/Library/Developer/CoreSimulator/Devices/
```

![aaaaaa.tiff](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14604/53531ec6-6f48-a17c-c5c2-0aa50addd196.tiff)



#シミュレータのID

上記のフォルダ内に使用したデバイスのIDがフォルダ名となり各デバイスに関連するデータが保存されています。
Xcodeの Window → Devices and Simulators を開き、Simulatorsのタブを開くとシミュレーターのIDが確認できます。

![bbbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14604/588efa16-ac55-cfe2-8420-09bbb48fa6f0.png)




#シミュレータのID（コード）

シミュレータのIDをSwiftのコードで確認するには、以下で確認できます。
一緒にアプリケーションIDも確認できます。

```swift
let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(documentDirPath)
```

出力結果

```shell:出力結果（実例）
/Users/ユーザー名/Library/Developer/CoreSimulator/Devices/938756E4-6FCB-4B9A-A0DA-2A82C1481955/data/Containers/Data/Application/AFBBEAFE-6F63-43ED-A8A6-40A4C04B87D3/Documents
```

```shell:出力結果（シミュレータIDとアプリケーションID）
/Users/ユーザー名/Library/Developer/CoreSimulator/Devices/シミュレータID/data/Containers/Data/Application/アプリケーションID/Documents
```
メモリ、使い過ぎてない？ アルゴリズムの空間計算量とは(Space Complexity)

## 概要

パソコンが使えるメモリには限界があります。多くのパソコンで快適に動くプログラムを書くには空間計算量(Time Complexity)を意識する必要があります。

空間計算量とは、ある問題を解くためにパソコンが必要とするメモリのことです。通常はビッグオー記法を使って`O(1)`、`O(n)`などと表します。

空間計算量は小さいほど良いです。つまり空間計算量が`O(1)`のアルゴリズムは`O(n)`のアルゴリズムよりも優れている評価できます。しかしアルゴリズムを測る尺度として他にも時間計算量などがあり、空間計算量だけでアルゴリズムの全てを評価できるわけではありません。


## ビッグオー記法の簡単な説明

空間計算量においてビッグオー記法とは、入力が使うメモリの大きさ`n`に対して、パソコンが処理に必要とするメモリをざっくりと示すものです。パソコンが必要とするメモリが定数なら`O(1)`、入力に必要なメモリに比例する程度なら`O(n)`などと書きます。

## 空間計算量の種類

空間計算量には二種類あります。

- Auxiliary Space Complexity
- Total Space Complexity

Auxiliary Space Complexityとは、処理のために追加で必要になったメモリの空間計算量です。一方でTotal Space Complexityは「Auxiliary Space Complexity」と「入力に必要なメモリ」とを両方考慮したものです。

以下のバブルソートの例ではAuxiliary Space Complexityは`O(1)`であり、Total Space Complexityは`O(n)`です。

特に注意書きがない場合、Space ComplexityはAuxiliary Space Complexityの方を指している場合が多いです。

## バブルソートの空間計算量

### バブルソートとは

リスト内の数字を小さい順にならべるソートアルゴリズムの１つです。リストの最初の要素から始まり、隣り合った２つの要素を順に比較していき、もし小さい順に並んでいなかったらその２つの要素を入れ替えるということを繰り返します。

![Bubble-sort-example-300px.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227166/363d8db1-032f-c581-93e3-2cac6f1a1bf0.gif)
[https://en.wikipedia.org/wiki/Bubble_sort#/media/File:Bubble-sort-example-300px.gif](https://en.wikipedia.org/wiki/Bubble_sort#/media/File:Bubble-sort-example-300px.gif)

### バブルソートの空間計算量

バブルソートのAuxiliary Space Complexityは`O(1)`です。処理を実行するために追加で必要になるメモリは定数だからです。バブルソートでは２つ要素の比較、交換だけできればいいので、比較用の変数`left`, `right`や、交換のために一時的に使う変数`temp`を使うだけでこと足ります。

一方で入力に必要なメモリは`n`です。Auxiliary Space Complexityの`O(1)`と、入力に必要なメモリ`O(n)`の両方を考慮し、Total Space Complexityは`O(n)`と決まります。


## 他のアルゴリズムの空間計算量を調べるには？

Wikipediaにアルゴリズムの空間計算量(Space Complexity)が記載されています。

例として[バブルソートについて書かれたWikipediaの記事](https://en.wikipedia.org/wiki/Bubble_sort)をご覧ください。
Vue.jsの動的コンポーネントについて

# Vue.jsの動的コンポーネントについて


## 動的コンポーネント
componentタグを使い、表示させるコンポーネントを動的に変化させる


```vuejs
    <button @click="currentComponent = 'Home'">Home</button>
    <button @click="currentComponent = 'About'">About</button>
    <component :is="currentComponent"></component>

    export default{
      data(){
        currentComponent:'Home'
      }
     }
```

ボタンクリックでcurrentComponentプロパティの値を変化させている。
componentタグのis属性の値により、描画されるコンポーネントを切り替えている。（ここではcurrentComponentの値がHomeならHomeコンポーネント、AboutならAboutコンポーネントが表示されるイメージ）


## 注意すべき挙動
コンポーネントが切り替わる際は、毎回毎回コンポーネントがdestroyされている。
コンポーネントを切り替えてもデータを保持していたいときにはkeep-aliveタグを使用する。

```vuejs
    <keep-alive>
      <component :is="currentComponent"></component>
    </keep-alive>
```
上記のようにkeep-aliveタグでcomponentタグを囲むことでコンポーネントを切り替えてもデータを保持することができる。
これはdestoryサイクルが発生していないからデータを保持することができるのだが、「destoryedされた際に発生させたい処理」、「createdされた際に発生させたい処理」を記述したい場合はもちろんあるだろう。
実はkeep-aliveタグを使った際にはdeactivated、activatedというライフサイクルができ、destoryedとcreatedの代わりをしてくれる。
Wordpressプラグイン「Contact Form 7 Multi-Step Forms」で「戻る」ボタンが非表示になる不具合の解決法

ミナミ(@MinamiNakasato)です。

WordPressサイトで申し込みフォームを作成中に遭遇したエラーを共有します。

結論を言うとうっかりミスが原因でした！

##対象者
「contact form 7」と「Contact Form 7 Multi-Step Forms」の基本的な使い方が分かる人向けです。

##使用サーバー

①開発環境
②本番環境

①で開発し、挙動に問題なければ②にデプロイします。

(ほんとはステージング環境もあるけど説明に必要ないので省略)

##不具合が発生するまでの経緯

###【１：開発環境】

①開発環境のWordPress管理画面を開く。

②「contact form 7」 および 「contact form 7 multi-step Forms」を用いて問い合わせフォームを２つ作る。

####(1)申し込みフォームの末尾に以下を記述。

```
︙
略
︙

[submit "次へ"]

[multistep multistep-361 first_step "https://開発環境のトップドメイン/contact-confirm/"]
```

フォームに入力後「次へ」ボタンを押すと、入力内容の確認ページ(https://開発環境のトップドメイン/contact-confirm/)に飛べます。

※URLの「/contact-confirm/」の部分は人によって違います。

####(2)申し込み確認ページの末尾に以下を記述。

```
[previous "戻る"]
```

入力内容を確認し、「あ、間違いがある」と気付いたら「戻る」ボタンを押してフォームのページに戻れます。

③申し込みフォームに入力し、「次へ」ボタンを押す

④確認ページで「戻る」ボタンを押す

⑤フォーム画面に戻れることを確認

###【２：本番環境】

①「開発環境でうまく行ったから本番環境でも同じ事をやろうな」と言う

②開発環境の問い合わせフォームの内容をコピペし、本番環境にあらかじめ用意しておいた「問い合わせフォーム」と「確認ページ」に貼る。

問い合わせフォームには以下をコピペ。

```
[submit "次へ"]

[multistep multistep-361 first_step "http://開発環境のトップドメイン/contact-confirm/"]
```

確認ページには以下をコピペ。

```
[previous "戻る"]
```

③本番環境でフォームと確認ページの挙動を確認する。すると↓

##エラー発生

**<font color="red">④本番環境の確認ページに「戻る」ボタンが表示されない。</font>**

検証ツールで「戻る」ボタンを確認すると、、

開発環境の場合↓

```
<input type="button" value="戻る" class="〜〜">
```

本番環境の場合↓

```
<input type="button" value="戻る" class="〜〜" display:none;>
```


なんで本番環境では「戻る」ボタンが非表示(display: none;)なんや。

ググって、[この記事](https://wordpress.org/support/topic/previous-button-not-displaying/)で原因が分かった。同じエラー出てる人いた。

>
申し込みフォームの
>
[multistep multistep-361 first_step "<font color="red">URL</font>"]
>
の、URLが間違っとる。

とのこと。

ここが間違ってると「戻る」ボタンが非表示になるという、プラグインの仕様らしい。

確認しましたら、圧倒的な凡ミスでした！

本番環境なのに、開発環境用のURLまで丸コピして

```
[multistep multistep-361 first_step "https://開発環境のトップドメイン/contact-confirm/"]
```

を貼り付けたものだから、そりゃエラーが出るよ。

正しくは

```
[multistep multistep-361 first_step  "https://本番環境のトップドメイン/contact-confirm/"]
```

でした。

ズボラをしちゃいけないね。確認が大事。

一件落着！
【git diff】ファイル差分をみる方法と基本のオプション

ファイル別に差分が出力されて見やすいgit diffの基本的なコマンドです

## 見やすく

``` 
git diff --patience
```

## コミット間の差分をみる

```
git diff {{コミットID A}} {{コミットID B}}
```

## ファイルに出力

```
git diff > sample.text
```

## 差分のあるファイル名だけみる

```
git diff --name-only
```

## ブランチ間で比較する

```
git diff {{ブランチA}}..{{ブランチB}}
```

## 特定のファイルの差分をみる

```
git diff {{ファイルパス}}
```
ironSourceAPIを利用するため必要なベアラトークン発行と認証



# 概要

* 広告プラットフォームであるironSourceのAPIを利用して広告指標の値などを取得したい
* しかし公式マニュアルが簡素すぎるてわかりにくい為APIを使える認証の仕方を忘れないようメモ
* OAuth認証においてBearerTokenを利用した認証をする

# 詳細

## ベアラートークン発行

* ローカルのMacでトークン取得用ファイル作成
* 以下の画面からsecretkeyとrefreshTokenを取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/a49d7142-2ac0-5669-997c-f0c1e6e54d4b.png)

* bashの場合

```
$ curl -H GET 'https://platform.ironsrc.com/partners/publisher/auth' -H 'secretkey:23fe7fe********9cbed79' -H 'refreshToken:ef507c9*********886dee'
```

* phpの場合

```bearer_auth.php
<?php

$authURL = 'https://platform.ironsrc.com/partners/publisher/auth';
$authHeaders = array(
        'secretkey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',　←ここに書く
        'refreshToken:xxxxxxxxxxxxxxxxxxxxxxxxxxx',　←ここに書く
);

$curlClient = curl_init($authURL);
curl_setopt($curlClient, CURLOPT_HTTPHEADER, $authHeaders);
curl_setopt($curlClient, CURLOPT_RETURNTRANSFER, true);
$bearerTokenResponse = curl_exec($curlClient);
$bearerToken = str_replace('"','',$bearerTokenResponse);
curl_close($curlClient);

echo $bearerToken;

```

```
$ php bearer_auth.php
eyJ0eXAiOiJKV1Q*************vNItxjvkjsXY54
```

* 発行されたトークンは60分間有効

## ReportAPIを実行してみる

* curlコマンドのオプションにトークンをセット
* curlコマンドのオプションに取得対象アプリのappkeyをセット
* appkeyはMediation Managementから確認できる※以下画面参照
* jsonデータが取得できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/13127190-a71a-fa98-1dfc-ec093761b73e.png)


```
curl -H GET 'https://platform.ironsrc.com/partners/publisher/mediation/applications/v6/stats?startDate=2021-04-01&endDate=2021-04-02&appKey=xxxxxxxx&adSource=Facebook&metrics=revenue,impressions,eCPM&breakdown=adUnits' -H 'Authorization: Bearer eyJ0eXAiOiJKV1Q*************vNItxjvkjsXY54'
[{"adUnits":"Interstitial","date":"2021-04-01","data":[{"revenue":0.14,"impressions":13,"eCPM":10.77}]},{"adUnits":"Interstitial","date":"2021-04-02","data":[{"revenue":0.21,"impressions":4,"eCPM":52.5}]}]
16:54
```

## 参考

* 公式　https://developers.ironsrc.com/ironsource-mobile/air/authentication/#step-1
AWSで起動したインスタンスにSSH接続できない時の対処法

AWSを学習中のものです。
今回はAWSで起動したインスタンスにSSH(Secure Shell)によるログインを試みた際にエラーが起きたので、その対処法を記録として残します。

##エラーの内容

```:ターミナル
% ssh -i my-key.pem ec2-user@(IPアドレス)
Warning: Identity file my-key.pem not accessible: No such file or directory.
```

##解決策

###隠しフォルダである「cd.ssh」フォルダに移動

```:ターミナル
% cd .ssh
```

##フルパスに書き換えて接続コマンドを再実行

```:ターミナル
% ssh -i ~/Downloads/my-key.pem ec2-user@(IPアドレス)
```
今回はダウンロードディレクトリ内にmy-key.pemをおいています

これで接続できる！と思ったらまたもやWARNING!

```:ターミナル
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

##鍵ファイルのパーミッションの変更
鍵ファイルのパーミッションが他のユーザーも閲覧できる状態になっているため今回のメッセージが出たようです。
アクセスを変更するコマンドであるchmodコマンドを実行して、自分以外は読み込めないように変更します。

```:ターミナル
% chmod 400 ~/Downloads/my-key.pem
```

##SSH接続完了
```:ターミナル

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 2 packages available
Run "sudo yum update" to apply all updates.
```

SSHによりAWSインスタンスにログインできない場合は上記を試してみると良いかもしれないです。
AndroidのViewModel(LiveData)でハマったこと

#AndroidのViewModel(LiveData)でハマった
最近ViewModelを使い始めて（今までapplicationで保持か値渡しをしてた)でめっちゃくちゃハマって作業が進まない事が合ったのでメモ代わりに投稿してみました。
＊こんなの当たり前だよ。馬鹿だなぁって思うかもしれないけど、暖かい目でみてくれると嬉しいです

###何をしててハマったか
ViewModel(LiveData)を利用してFragmentAで作業Aを行いFragmentBで作業Aの結果を受け取り画面(View)を更新するようにしようとしていた。
しかし、初回にFragmentBに遷移したときは想定通りの動きをするが二回目以降FragmentBに遷移すると上手くViewが更新されない

###原因は
デバックで動きを確認してみるとどうやらLiveData.observe(LifecycleOwner,Observer<in T>)が意図しない動きをしていたようだった。
具体的にはFragmentBに二回目以降遷移するとLifecycleOwnerが破棄されていないようでOnCreateが走る前に
observeが呼ばれていたのが原因のようだった。

###解決方法
色々と調べているとgetViewLifecycleOwner()を使ってLifecycleOwnerを指定するとViewが破棄されると一緒に破棄されるみたいなので使ってみた。（少なくともFragmentで使うときは）
その結果onCreateが走る前にobserveが呼ばれる事がなくなりViewの更新処理も上手く動いた

----
###引用・参考元
[Android Architecture Componentsで犯しがちな5つの間違い【翻訳】](https://zenn.dev/d_forest/articles/05cb16c88f961c1fdfe3)
Azure Static Web Appsのアプリケーション構成はAzure Functionsと同一ではないらしい。

## AzureWebJobsStorage設定が追加できない
`Azure Static Web Apps`結構お手軽で便利そうなんだが、まだプレビューということもあり、いろんな情報少ない。
特にAPIの方はAzure Functionsと同じノリでいくとデバッグとかで痛い目にあった。

### アプリケーション構成（Static Web Apps）

![スクリーンショット 2021-04-09 18.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120789/9a3a06db-28b9-e0e0-ff3f-f1e47366b0f6.png)

このへんからAPIの環境変数が追加できる。
ところがAzure Functionsと同じようにストレージアカウントつけようとすると、「保存」したあとに何故か消える。
いろいろと調べるとこれに行き着いた。↓
https://github.com/Azure/static-web-apps/issues/80
https://github.com/FeedReaderOrg/FeedReader/commit/98bc37bc68bc20f69129358a3a4f7ee86bb02529

「AzureWebJobsStorage」などの文字列はブロックされているらしい。（なぜ？）
なのでStatic Web Appsの場合は「AzureStorage」にするみたい。
（Webからでエラーになってるのかと思いきや、当然CLIでも追加できなかった。）

これのせいでかなり時間使ってしまったんだぜ…
GPUの監視bot (Slackに通知)

# GPU 監視 bot

深層学習の計算を回してPCを放置していたらなぜか停止していたので、どこにいてもGPUを監視できるようにGPUの使用率をSlackに通知するbotを作成しました。

GPU監視にぜひご利用ください。

## Github

[ソースコード](https://github.com/outk/GPUmonitorbot)

## 環境

NVIDIA製のGPUに対応しているので、`nvidia-smi`を実行できるようにしておく必要があります。

## 使い方

`envexample`ファイルを参考にして同じ階層に`.env`ファイルを作成してください。

Slackの*webhook*については[**こちら**](https://gpumonitor.slack.com/apps)を参照してください。(所要時間１分未満)

あとは、`GPUmonitor.py`ファイルがあるところで`python GPUmonitor.py`を実行するだけです。

## Options

| Option | Description |
| ----------- | ----------- |
| `--interval` | interval時間を設定できます。デフォルトは10分です。 |

## 例

こんな感じで通知してくれます。
![スクリーンショット 2021-04-09 182103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458877/f8c4162f-6df0-4650-b7d8-0b0ebea9d148.png)


## 参考

[PythonからGPU使用率などの情報を取得する(nvidia-smiコマンド)](https://qiita.com/tomotaka_ito/items/1da001c98b46ecf28ec7)
pybind11 で C++ から Python オブジェクトの変数やメソッドにアクセスするメモ

## 背景

C++ 側で, ちょっとした Python クラス(自作, 標準ライブラリ, etc)のインスタンスにアクセスしたいときがある. C++ 側で毎回バインディングを書くほどのものではないもの.

## 方法

https://pybind11.readthedocs.io/en/stable/advanced/pycpp/object.html#accessing-python-libraries-from-c

モジュールもいけます.

基本は `py::object` で扱って `attr("attrname")` で変数, メソッドにアクセスして実現すればいけます!

```py

class MyClass:
  def __init__(self):
    self.index = 42

```

```c++

py::object o = ... ;　// MyClass なもの

py::print(o.attr("index"));
```
明示的に型が必要であれば cast を用います.

```c++
py::print(o.attr("index").cast<int>());
```

### hasattr

オブジェクトが, 指定するメソッドや変数を持っているかどうかは `pybind11::hasattr` で確認できます. 

```c++
py::print(pybind11::hasattr(o, "index"));

// NG: インスタンス側のメソッドとしては定義されていないので注意
o.hasattr("index");
```

#### contains

Python 側のクラスが `__contains__` を定義していれば, `o.contains(key)` が使えます.

### setattr 相当

`o.attr["name"] = ...`

でいけます.

## TODO

* [ ] 主にデータ構造を受け渡ししたい場合, あまりデータ構造が複雑でなければ, 一旦 dict(`py::dict`) にして C++ <-> Python でやりとりしたほうがよさそう
Vue.js devtools　タブバーVueが表示されない…。

## chromeの拡張機能vue.devtoolsを導入したが、vueのバーが表示されない…。


![スクリーンショット 2021-04-09 17.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204135/a38e937b-6768-6bad-5e32-0a0db9bbb4d2.png)


「拡張機能」→「詳細」→「ファイルの URL へのアクセスを許可する」をオンにしてもダメ…。


#解決
いろいろ調べていたら

```javascript:vue.js
Vue.config.devtools = true;

```

jsファイルの先頭にこれをいれたら無事表示されました＾＾
各種ソフトウェア・プラットフォームのサポート期間情報

#背景
- 各種EOS時期を調べる必要があった



#調査開始！
##VMware
https://lifecycle.vmware.com/#/


#Microsoft
https://docs.microsoft.com/ja-jp/lifecycle/


#Red Hat
https://access.redhat.com/ja/support/policy/updates/errata


#Oracle
https://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf

https://www.oracle.com/us/assets/lifetime-support-applications-069216.pdf

#Suse
https://www.suse.com/ja-jp/lifecycle/


#IBM
https://www-01.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/2/760/PWR11032/index.html&lang=ja&request_locale=ja

https://www.ibm.com/support/pages/aix-support-lifecycle-information
firebase-toolsをプロジェクトローカルにインストールしてアカウント情報も個別に持つ

Firebaseでブラウザコンソールの導きに従うと

![スクリーンショット 2021-04-09 15.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47823/ab8afd7d-5781-115b-6953-7b6fdb81bbfa.png)

初手でfirebase-toolsをグローバルインストールさせられそうになります。そんなのやだよプロジェクト毎に持ちたいし、Firebaseのアカウント情報も~/.configへまとめてじゃなく、プロジェクトディレクトリ毎の.config内へ個別に持ちたいよ、という時の手順メモ。

なお[npm](https://github.com/npm/cli#installation)と[direnv](https://github.com/direnv/direnv#basic-installation)は既に入っているものとし、対象のプロジェクトディレクトリで手順を開始するものとします。

## XDG_CONFIG_HOMEの設定

```shell:.envrc
dotenv
```

```shell:.env
XDG_CONFIG_HOME=.config
```

```shell:.gitignore
.env
```

プロジェクトディレクトリへ移動するとdirenvが自動的に.envを読んでXDG_CONFIG_HOMEを設定してくれます。.envを作らず.envrcで直接設定してもいいんですが、[Docker Composeからも読める.env](https://docs.docker.jp/compose/env-file.html)に環境変数設定を集約する事が私は多いです。

## パッケージのlocalインストール

```shell
npm init -y
npm install --save-dev firebase-tools
npx firebase -V
```

ところでnpxってリモートパッケージ実行の無効化オプションとかないんでしょうか。そのうちtypo狙いの悪意あるnpmパッケージとかを実行しそうで怖いですよね。私はfirebaseをなぜかfirebaesにtypoする事が多いので攻撃者の皆さんは狙わないよう伏してお願い申し上げます。

そういう場合は古式ゆかしくscriptsに書いてnpm run firebaseするのが良いんだと思います。

## FirebaseへCLIからのログイン

```shell
npx firebase login
```

CLIからのログイン後にプロジェクトディレクトリへ

```shell
jq .user .config/configstore/firebase-tools.json
```

のようなjsonが生成されていれば成功です。(userプロパティには現在ログイン状態のユーザー情報が格納される)

```shell
npx firebase projects:list
```

で現在のアカウントから見える既存のプロジェクトの一覧も確認しておきましょう。

```shell
npx firebase init
```

後はinitのウィザードに従って既存のプロジェクトの中から使用するプロジェクトを選択するなり、新しくFirebaseプロジェクトを作るなり、よしなに

ところで、本稿では選択していませんがコンテナで環境を隔離してしまうのも一つの選択肢です。

https://qiita.com/pannpers/items/244a7e3c18d8c8422e4f


## see also

https://kiririmode.hatenablog.jp/entry/20180404/1522843531

https://blog.p1ass.com/posts/direnv-dotenv/

https://firebase.google.com/docs/cli?hl=ja
GROMACSでCHARMM36mを使う

#はじめに
GROMACSのpdb2gmxではいくつか力場を選べるが、デフォルトではCHARMM36mは無い。
この記事では、GROMACSでCHARMM36mを使う方法を述べる。

#力場ファイルをダウンロードする

http://mackerell.umaryland.edu/~kenno/cgenff/download.php

から、
CHARMM36 Files for GROMACS
"charmm36-feb2021.ff.tgz"をダウンロードして解凍する

解凍したフォルダをpath_to_gromacs/share/gromacs/topに移動する





#pdb2gmxで処理

あとはpdb2gmxでpdbファイルを処理する

```
 gmx pdb2gmx -f 1AKI_clean.pdb -o 1AKI_processed.gro
```

力場の選択で

```
 1: AMBER03 protein, nucleic AMBER94 (Duan et al., J. Comp. Chem. 24, 1999-2012, 2003)
 2: AMBER94 force field (Cornell et al., JACS 117, 5179-5197, 1995)
 3: AMBER96 protein, nucleic AMBER94 (Kollman et al., Acc. Chem. Res. 29, 461-469, 1996)
 4: AMBER99 protein, nucleic AMBER94 (Wang et al., J. Comp. Chem. 21, 1049-1074, 2000)
 5: AMBER99SB protein, nucleic AMBER94 (Hornak et al., Proteins 65, 712-725, 2006)
 6: AMBER99SB-ILDN protein, nucleic AMBER94 (Lindorff-Larsen et al., Proteins 78, 1950-58, 2010)
 7: AMBERGS force field (Garcia & Sanbonmatsu, PNAS 99, 2782-2787, 2002)
 8: CHARMM27 all-atom force field (CHARM22 plus CMAP for proteins)
 9: CHARMM36 all-atom force field (July 2020)
10: GROMOS96 43a1 force field
11: GROMOS96 43a2 force field (improved alkane dihedrals)
12: GROMOS96 45a3 force field (Schuler JCC 2001 22 1205)
13: GROMOS96 53a5 force field (JCC 2004 vol 25 pag 1656)
14: GROMOS96 53a6 force field (JCC 2004 vol 25 pag 1656)
15: GROMOS96 54a7 force field (Eur. Biophys. J. (2011), 40,, 843-856, DOI: 10.1007/s00249-011-0700-9)
16: OPLS-AA/L all-atom force field (2001 aminoacid dihedrals)
```

CHARMM36が追加されている。
あとは通常どおり流せばよい。
水の力場はTIP3PがRecommendされていた

#mdpファイルの記述

https://manual.gromacs.org/documentation/2018/user-guide/force-fields.html

また、mdpファイル中の記述も下記が推奨されている

```
constraints = h-bonds
cutoff-scheme = Verlet
vdwtype = cutoff
vdw-modifier = force-switch
rlist = 1.2
rvdw = 1.2
rvdw-switch = 1.0
coulombtype = PME
rcoulomb = 1.2
DispCorr = no
```

#余談


なお、デフォルトはCHARMM36mになっていて、CHARMM36を使う場合は、mdpファイルに

```
define = -DUSE_OLD_C36
```

と記述する。
基本的にはCHARMM36mを使った方が良いらしい
テストコードの必要性

#【テストコードの必要性】

これまでの業務でテストコードを書くといったことはなかったですが、テストコードを書くことによるメリットが大きので、当たり前になっていると思う。
テストコードの重要性を理解してテストコードを書いていきたい。

##テストコードとは。

**プログラムが想定通りに動いてくれているかを確認できる**

既に用意されているテストフレームワークを使うことが標準。

##テストコードのメリットを整理

ソースコードの追加や改修による想定外のバグを防ぐことができる。
　→　チーム開発では、ソースコードが複雑になるのでバグの特定が容易でない。
　（実際の業務でも上記を経験済み。。）

バグの含まれたソースコードをリリースしてしまうリスクを大幅に下げられる。
　→　リリース後のエラー発覚によるデメリットがかなり大きい。

　※通常のプログラムの他に追加でテストコードを書く必要があるので、工数は増えるが、後々のバグ修正にかかったであろう工数を削減することができるので、やはりテストコードは書くべきとされている。
VS Code Jupyter のアウトプットを自動スクロールする

# はじめに
VS Code で Jupyter を使ってデータ分析する際に interactive window へのアウトプットを自動化した時の備忘録。
意外と「vscode auto scroll」などと調べてもやり方が出てこない

# やり方
1. `command + ,` で設定タブを開く
1. 設定タブ内の検索窓で「jupyter scroll」と検索
1. `Jupyter: Always Scroll On New Cell` にチェックを入れる

![スクリーンショット 2021-04-09 17.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124336/e33f0219-048f-8369-f997-87d240f15e27.png)

以上
Vuex_あるモジュールから別モジュールのAction,Mutationを操作する方法

Vuexは namespaced: true とすることで、複数のモジュールにファイルを分けて管理することができます。

あるモジュールから別のモジュールのstateを更新したい際、
別のモジュールのAction,Mutationを呼び出す必要があると思います。
(あるモジュールから直接、別モジュールのstateは変更できないように思います。もし間違っていたらすみません。)

#コード例
別モジュールのAction,Mutationを呼び出すには、下記のように書きます。

```javascript:A_module.js
//別モジュールのActionを呼び出す例
 dispatch("B_module/B_module_Action",payload,{root:true});

//別モジュールのMutationを呼び出す例
 context.commit("B_module/B_module_Mutation", payload, {root: true});
```

第１引数：呼び出したいモジュール名 / (別Action名 or 別Mutation名)
第２引数：呼び出し先に渡す値。
　　　　例：何も渡さない場合はNULL,DBからのレスポンスの場合はresponse.data　など。
第３引数：{root:true} ・・・ 別モジュールにアクセスしたい場合、必須の設定。


**ポイントは第３引数の{root:true}です。**
{root:true}を指定することで、"別モジュール名/別Action名 or 別Mutation名"で呼び出せるようになります。

ちなみに、第３引数を省略した場合は、現在のモジュール内から呼び出そうとします。



##終わりに
Vuex公式ガイドのモジュールのページには直接書いていなかったので、記事にしてみました。
公式ガイドの説明を下記のようにしてほしかった・・・

誰かの参考になりましたら幸いです。

[Vuex公式ガイド モジュール](https://vuex.vuejs.org/ja/guide/modules.html)

```javascript:A_module.js
//公式ガイドより抜粋

actions: {
        dispatch('someOtherAction') // -> 'foo/someOtherAction'
        dispatch('someOtherAction', null, { root: true }) // -> 'someOtherAction'
        //別モジュールから呼び出す場合
　　　　 dispatch('B/someOtherAction', null, { root: true }) // -> 'B/someOtherAction'

        commit('someMutation') // -> 'foo/someMutation'
        commit('someMutation', null, { root: true }) // -> 'someMutation'
       //別モジュールから呼び出す場合
        commit('B/someMutation', null, { root: true }) // -> 'B/someMutation'

    }
```

##参考
[【Vue】Vuexで他のモジュールのActionをDispatchする](https://hatolabo.com/programming/%E3%80%90vue%E3%80%91vuex%E3%81%A7%E4%BB%96%E3%81%AE%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AEaction%E3%82%92dispatch%E3%81%99%E3%82%8B)