OmniAICreator/Qiita-1.07M huggingface dataset:
マンガでわかるStripe

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/82526d54-b110-68f1-20c6-f4bfafa192d9.png">
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/f76cb2ad-cc45-407a-35f8-ec7f1192aa9e.png">
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/72800a52-1876-eade-b67e-2fa3922d8916.png">
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/1fc5d7b3-a226-9d57-a73c-09c79553de8b.png">
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/fb605f33-5c91-926a-7dbc-2b73911649de.png">
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/6feaec10-da0a-d0e1-5418-fd8754c811f8.png">

## Stripeとは
[Stripe](https://stripe.com/jp)は決済代行サービスです。

通常決済機能はPCI DSSだったり不正検知だったり単なるWebサービスの機能より高いレベルが求められますが、Stripeを使うことでリスクを最小化できます。


## API、用語の種類について

Stripeの公式ドキュメントはよく書かれていますが、シンプルな名前を好むゆえに混同しやすかったり、歴史的経緯が省かれているので少し補足します。


| プロダクト名   | API                | (あえて冗長に名前をつけるなら)        | 説明                                      |
| -------- | ------------------ | ----------------------- | --------------------------------------- |
| Payment  | Charges API        | (SimplePayment API)       | 3Dセキュア未サポートの古いAPI                       |
| Payment  | Payment Intent API | (Payment API)             | 3Dセキュアに対応している新API                       |
| Checkout |                    | (Payment with Builtin UI) | Payment Intent APIのラッパー.  Stripeの画面で決済 |
| Element  |                    | (Payment with Custom UI)  | Checkoutより画面をカスタマイズしたい場合に使用             |

### Charges API
古いAPIです。Payment Intent APIへの移行が推奨されています。

日本語で"チャージする"というと電子マネーに貯める側に使うことが多いですが、Stripeの用語では支払う側に使います。

### Payment Intent API
新APIです。最近のWeb上の決済ではクレジットカードの番号とCVCを入力するだけでは不十分で3Dセキュアなど追加の認証が必要になり、Payment Intent APIはそのフローに対応しています。

欧州ではPSD2（欧州決済サービス指令第2版）の法規変更によりこのフローをサポートすることが必須になっています。

### Checkout
Stripe Paymentの上記APIを使うと柔軟性は得られるのですが、画面のほとんどを自前で用意する必要があります。

Stripe Checkoutでは金額やメタ情報を元に生成したセッションをurlに渡すことで、Stripe側が後は対応してくれます。素のAPIだとアプリもサポートしているのですが、CheckoutはWebのみ対応しています。

### Element
Checkoutよりはカスタマイズしたいという場合にはElementを使います。Reactが使えます。

## その他
Stripeは決済が完了すると設定したurlにイベントとして情報を返してくれます。
自分がStripeのAPIを呼ぶだけでなく、Stripeから返ってくるイベントを受け取る口も実装する必要があります。
Power Query: JSON OData - @で始まる Property に対するエスケープシーケンス（識別子へのエスケープシーケンス）

# 背景
API の結果取得する際に、@ 付きのデータでちょっと躓いたので備忘録

こんな感じのやつを、Power Query でどう取得したらいいか？って話
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/9da6c3a3-343c-4184-bee0-d6a6d4b5e7ae.png)

# 結論
分かってしまえば簡単で、「識別子」としてのエスケープシーケンスとして、quoted-identifier: を使うだけでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/1f206874-dfbb-d6f9-46da-870614195c47.png)

https://docs.microsoft.com/ja-jp/powerquery-m/m-spec-lexical-structure#identifiers

# 利用例
こんな感じ
> context = source[#"@odata.context"]
> count = source[#"@odata.count"]
> nextlink = source[#"@odata.nextLink"]


# あとがき
これを利用して、Teams の Messages を取得して、Reactions 解析をしたいな、と
Terroform 参考にしたサイト

### 全般

https://colabmix.co.jp/tech-blog/terraform-ec2/

### インストール

https://takelg.com/terraform_isntall_mac/

https://dev.classmethod.jp/articles/beginner-terraform-install-mac/

### 構文(シンタックス)

https://y-ohgi.com/introduction-terraform/handson/syntax/

### 仕組み（構成等図解）

https://qiita.com/anfangd/items/08cc332f7f47936c6ed6

### テンプレートファイルの作成

https://dev.classmethod.jp/articles/terraform-getting-started-with-aws/

https://qiita.com/anfangd/items/08cc332f7f47936c6ed6

https://takelg.com/aws_create_ec2_terraform/

### 変数

https://qiita.com/ringo/items/3af1735cd833fb80da75

### クレデンシャル情報

https://dev.classmethod.jp/articles/terraform-getting-started-with-aws/

https://www.se-from30.com/it/terraform-terraform-tfvars/

https://qiita.com/masaaania/items/0ed291b267032a7699ad

### スイッチロール形式でセキュアにする

https://blog.mmmcorp.co.jp/blog/2021/01/27/terraform_with_assume_role/

https://blog.serverworks.co.jp/2020/09/28/terraform-by-assumerole

### terraformでSSH接続

https://kenzo0107.hatenablog.com/entry/2017/03/27/215941

### クラウドで tfstate ファイルを管理する

https://takelg.com/terraform-tfstate_manage/

### 書籍

https://nextpublishing.jp/book/10983.html
bash test -n が常に true を返す場合の対処

小ネタです。

``test -n`` は文字列の長さが0 **より** 大きい場合に``true``を返します。

よって以下のコードは ``ZERO length`` を返すことが期待されます。

```bash
NO_STR=

if [ -n $NO_STR ]
then
    echo "NON ZERO length"
    return
fi
echo "ZERO length"
```

が結果としては、``NON ZERO length`` が出力されます。
なぜ？


答えはこちら

https://stackoverflow.com/questions/20437067/testing-against-n-option-in-bash-scripts-always-returns-true?noredirect=1&lq=1


結論としては、以下のようにダブルクォートで囲めばいいわけですな。


```sh
NO_STR=

if [ -n "$NO_STR" ]
then
    echo "NON ZERO length"
    return
fi
echo "ZERO length"
```


元のコードでは文字列が存在しない場合、 `` [ -n ]`` となり、これは常にtrueを返してしまうとのこと。
なるほどなー。
C# - AES128で1ブロックだけ暗号化する

# 概要

AES128で16byteのbyte配列を暗号化・復号するサンプルコードです。
※セキュアなコーディングとかは詳しくないので、正式なものに使うのに耐えれるかは保証できません。

# ソースコード

```cs:AES128Sample.cs

using System;
using System.IO;
using System.Security.Cryptography;

class AES128Sample
{
    [STAThread]
    static void Main(string[] args)
    {
        byte[] plain = new byte[]{0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};
        byte[] key   = new byte[]{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};

        byte[] cipher;
        cipher = Encrypt1BlockAes128(plain, key);
        DumpArray(cipher);
        DumpArray(Decrypt1BlockAes128(cipher, key));
    }

    static void DumpArray(byte[] a)
    {
        for ( int i=0; i<a.Length; i++ ) {
            Console.Write(a[i].ToString("X02"));
        }
        Console.WriteLine();
    }

    static byte[] Decrypt1BlockAes128(byte[] cipher, byte[] key)
    {
        return EncDec1BlockAes128(cipher, key, false);
    }
    
    static byte[] Encrypt1BlockAes128(byte[] plain, byte[] key)
    {
        return EncDec1BlockAes128(plain, key, true);
    }

    static byte[] EncDec1BlockAes128(byte[] a, byte[] key, bool isEncryptMode)
    {
        const int N = 16; // 128bit = 16bytes

        if ( a == null || key == null ) {
            throw new ArgumentNullException();
        }
        if ( a.Length != N || key.Length != N ) {
            throw new ArgumentException();
        }

        byte[] buf = new byte[N];

        //using (AesManaged aes = new AesManaged()) // obsoleted
        using (Aes aes = Aes.Create())
        {
            aes.BlockSize = N*8;
            aes.Key = key;
            aes.IV = new byte[N]; // all zero. refer to https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/arrays/single-dimensional-arrays
            aes.Mode = CipherMode.ECB;
            aes.Padding = PaddingMode.None;
            ICryptoTransform encryptorOrDecryptor;
            if ( isEncryptMode ) {
                encryptorOrDecryptor = aes.CreateEncryptor(aes.Key, aes.IV);
            }
            else {
                encryptorOrDecryptor = aes.CreateDecryptor(aes.Key, aes.IV);
            }

            using (var ms = new MemoryStream(a))
            using (var cs = new CryptoStream(ms, encryptorOrDecryptor, CryptoStreamMode.Read))
            {
                cs.Read(buf, 0, N);
            }
        }
        return buf;
    }
}

```

# 検算

Test Vector的なやつ

[FIPS-197](https://csrc.nist.gov/csrc/media/publications/fips/197/final/documents/fips-197.pdf) の C.1 AES-128 (Nk=4, Nr=10)


>
PLAINTEXT: 00112233445566778899aabbccddeeff
KEY: 000102030405060708090a0b0c0d0e0f
round[10].output 69c4e0d86a7b0430d8cdb78070b4c55a
  
# 参考サイト

- [MS Doc - AES class](https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.aes?view=net-6.0)
- [暗号利用モード - Wikipedia](https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89)
- [FIPS-197](https://csrc.nist.gov/csrc/media/publications/fips/197/final/documents/fips-197.pdf)
LOC（SLOC）とは

業務で品質管理の際に使われていた用語です。
意味がわからなかったのでメモとして残します。

##LOC（SLOC）とは
「Lines Of Code」（Source Lines Of Code）の略でその名の通りソースコードの行数です。
規模が大きくなると以下のように補助単位をつけて表現することもあります。

```tex
1KLOC（kilo-LOC）
MLCC(Mega-LOC）
```

## 参考文献
https://onl.la/AXg4Fpj

https://wa3.i-3-i.info/word19399.html
SSH 参考サイト

###SSH基本

https://qiita.com/tag1216/items/5d06bad7468f731f590e

https://blog.mothule.com/tools/ssh/tools-ssh-basic

###sshで公開鍵認証でログインする基本的な方法

https://qiita.com/mountcedar/items/43157ff1225c56500655

https://mironal-memo.blogspot.com/2012/07/ssh.html

###AWS EC2 でSSHログイン

https://qiita.com/aiandrox/items/98ad9b7551481d890916

###terraformででSSH接続

https://kenzo0107.hatenablog.com/entry/2017/03/27/215941

###SSH接続に関して各ディレクトリの権限

https://note.mokuzine.net/ssh-permission-denied/

###SSHの秘密鍵にパスフレーズを設定したか確認する方法とパスフレーズの変更・設定解除の方法

https://qiita.com/shukan0728/items/e654953c89aab6f847a4

###configファイルで設定を管理 

https://s10i.me/whitenote/post/42

https://tech-blog.rakus.co.jp/entry/20210512/ssh

###SSHにおけるフィンガープリントとは。ホスト認証とあわせて解説

https://rurukblog.com/post/ssh-fingerprint/
【Linux】S3環境でのllコマンドについて

Linuxを触る人は、llコマンドをこれでもかと使うと思います。
私もその一人です。
そもそもllコマンドは何ぞやという話ですが、以下コマンドの略です。

<BLOCKQUOTE><FONT COLOR=red>ls -l</FONT></BLOCKQUOTE>

ファイルの作成日やサイズなど様々な情報が箇条書きで見れますので
私用する人は多いと思います。

<BLOCKQUOTE>aws s3 <FONT COLOR=red>ll</FONT> s3://xxx/xxx/</BLOCKQUOTE>

S3環境で使用すると上記のようになりますが、残念なことにエラーとなります。
理由は簡単で、略コマンドが使用できないからです。
ですので、S3環境では下記のようになります。

<BLOCKQUOTE>aws s3 <FONT COLOR=red>ls</FONT> s3://xxx/xxx/</BLOCKQUOTE>

以上です。
macos monterey 12.2にアップデート後、勝手にスリープが解除される。

#1.環境
この記事ではmacos monterey 12.2 にインストールしたMacBook Proを使っています。またMX KEYS for MacをBluetoothで接続しています。
#2.困ったこと
アップデート後、macをスリープ状態にして画面を開いたままにしておくと、２０秒ほどで勝手にスリープ解除されてしまう。

#3.解決方法
MX KEYS for Macの電源を切ってスリープ状態にさせることで、勝手にスリープ解除されなくなりました。
pythonのリストでn番目に大きな値とそのindexを取得する

#はじめに
pythonでリストの最大値・最小値をとってくる方法は簡単です。
しかし、n番目の値やindexをとってくる方法は、調べても出てこなかったため高速に行えるものを書きました。
これはもともとdifflibライブラリ内にあったものを参考にしました。

#アルゴリズム
プログラムの順番としては、

1.  値とインデックスをセットにしたリストを作る
2.  高速化のためn番目までソートする
3.  ソートしたリストのn番目の中身を取得

です。
ソート時、n番目までしかソートしていないので、高速です。

#プログラム

```.py
from heapq import nlargest, nsmallest
lst = [5,2,6,2,7,5,9,5]
n = 3 #この値までソートする

result = [(value,i)for i,value in enumerate(lst)]
max_result = nlargest(n, result)
min_result = nsmallest(n, result)

print("{}番目に大きな値はindex{}の{}です".format(n, max_result[n-1][1], max_result[n-1][0]))
print("{}番目に小さな値はindex{}の{}です".format(n, min_result[n-1][1], min_result[n-1][0]))

#3番目に大きな値はindex2の6です
#3番目に小さな値はindex0の5です

```


#応用

元のリストの中身を関数で数値化し、その大きさでソートするなら、以下のように書き換えればいいです。
今回は文字の長さで並べ替えています。
タプルのリストを作る際に、len関数を使用しています。

```.py
from heapq import nlargest, nsmallest
lst = ["a", "sadfsd", "bas", "dg", "kgkgkg"]
n = 2 #この値までソートする

result = [(len(value),i,value)for i,value in enumerate(lst)]
max_result = nlargest(n, result)
min_result = nsmallest(n, result)

print("{}番目に大きな値はindex{}の{}です".format(n, max_result[n-1][1], max_result[n-1][2]))
print("{}番目に小さな値はindex{}の{}です".format(n, min_result[n-1][1], min_result[n-1][2]))

#2番目に大きな値はindex1のsadfsdです
#2番目に小さな値はindex3のdgです
```


#まとめ

pythonのリストでn番目に大きな値とインデックスを取得する方法を書きました。
プログラムを勉強し始めた人でもわかる内容ですが、いざ書いてみようと思うとなかなかめんどくさくて、ライブラリというものの恩恵を改めて実感しました。
ぜひアレンジして使用してください。
【Linux】【cp】ディレクトリの中身をコピーする方法

まだLinuxに慣れていない頃、作成した資源を1つずつコピーしていました。
流石に効率が悪いと思い、一気にコピーできないかと調べた結果ありましたので、備忘として残します。

<BLOCKQUOTE><FONT COLOR=red>cp</BLOCKQUOTE>

当たり前ですが、ベースはcpコマンドです。

<BLOCKQUOTE><FONT COLOR=red>-pR</FONT></BLOCKQUOTE>

cpコマンドに上記オプションを付けることにより
ディレクトリの中身をコピーすることができます。

<BLOCKQUOTE>cp <FONT COLOR=red>-pR</FONT> /xxx/test1 /xxx/test2</BLOCKQUOTE>

しかし、上記のようにするとディレクトリごとコピーされてしまうので
下記のようにすることで解決できます。

<BLOCKQUOTE>cp <FONT COLOR=red>-pR</FONT> /xxx/test1/<FONT COLOR=red>*</FONT> /xxx/test2</BLOCKQUOTE>

以上です。
嬉しくてBlender勉強してみた

#はじめに

以前、Qiitaの10周年記念イベントがありました。
このころ、Qiitaを始めたばかりで何気なくイベントに参加し投稿してみました。

:::note info
Qiita 10周年記念イベント - 10年後のために今勉強しておきたい技術
:::

https://qiita.com/official-events/12fc7bacec894d33a981

結果、10月ごろになんとQiitanがお家に来てくれたのです！
![IMG20220130175912.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/411fe5b8-1fb8-e191-971a-ffbce7d4cbad.jpeg)

かわいいキャラクターがお家に仲間入りして嬉しくって、
この嬉しさを何かで表現できないか！？
恩返しで何かできないか？って思いました。

#勉強してみた

何しようかって考えてたのですが、
そうだ！Blenderを使って3DのQiitanを作ってみようと思いつきました。

#成果
3ヶ月かけた成果がこれです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/CbeoG9iVJZY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#備忘録を含めた参考
せっかく覚えたので、忘れると困るので残しておきます。

#####オブジェクトと編集モードについて
オブジェクトモード・・・選択したオブジェクト（物）についての制御をするときに選択します。
場所を移動したり、全体的に大きくしたり、向きを変えたりなどなど。
編集モード・・・オブジェクトに対して、部分的に編集を行うときに選択します。
先を尖らせたり、一部分を伸ばしたりなどなど。

#####ショートカットキーについて

<font color="#aaf">作業しているときによく使っていたキーが以下になります</font>

| キー | 意味 | 動作 |
|:-:|:-|:-|
|E|Extention|延長|
|G|Grab|つかむ|
|M|Merge|結合|
|R|Rotate|回転|
|S|Scale|拡大縮小|
|X|ハサミ？|削除|
|Ctrl+B|Bevel|ベベルをつける|
|Ctrl+R|RoopCut|輪切り|
|Shift+C|Center|中心に戻る|
|Shift+D|Duplicate|複製|

動作の後、「X」「Y」「Z」を押すことにより、指定軸のみへ反映されます。
「Shift」を押しながら軸を押すと、”以外”になります。
※Shift+XだとX軸以外が対象となるので、Y＋Zへ動作対象となります。
MATLABでベクター系で書き出してほしいのにビットマップ系になってしまう問題．

卒研の学生さんが，
「`figure`を`epsc`で`saveas`してるのにビットマップで描画されるんですけど…」
とトラブっていたののシューティングに関与したので，共有のため記事を書きます．

## どういうときにトラブるのか

学生が使っていたのは `contourf` 関数でしたが，公式のサンプルプログラムに`saveas`で`svg`や`pdf`で書き出すときちんとベクター系になってくれます．

https://jp.mathworks.com/help/matlab/ref/contourf.html

学生さんにやってもらっていたのは$200\times 300$くらいの行列のデータで，そのまま出力するとトラブってしまいました．

 違いがあるとすればデータ形式やサイズです．**「ひょっとしてデータのサイズが関係あるのかな？」** と推測して，こんなコードを書いてみました．

```matlab
for k=1:40
    N=ceil(1.6^k)
    
    if N>1e6
        break;
    end
        
    X=randn(N,1);
    Y=randn(N,1);
    figure;
    plot(X,Y)
    
    saveas(gca,['sample_' num2str(N,'%07d')],'svg')
end
```

$N$点をランダムで発生させて`plot`して`svg`形式で保存します．データ点数が関係あるのでは？という予測です．

点数とファイルサイズの関係を図示してみました．$N$は上のコードに書いた値以外もたくさん試しています．
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/67145a88-2987-d0b2-d9b5-148097b4e64d.png)

$10^2$あたりまではほぼ一定(多分ファイル形式の固定部分)，それ以降$10^5$までは点数とともにファイルサイズが大きくなっていますが，$10^5$を超えるとファイルサイズが小さくなりました．ファイルを確認すると，$N>10^5$では`svg`で保存していますが中身はビットマップ(`png'かな？)になっています．拡大するとにじむ，

`saveas`が内部的にファイルサイズや処理のコストを考慮して判定しているのかな，と想像しますが公式サイトなどでは説明が見つけられませんでした．記述があったら教えてください．

## (追記)Figureのプロパティでレンダラを指定できました．

コメントをいただき`Figure`のオプションを確認したところ，レンダラを明示することができるようでした．

https://jp.mathworks.com/help/matlab/ref/matlab.ui.figure-properties.html

```matlab
    f=figure(1);
    f.RendererMode='manual';
    f.Renderer='painters';
```
上記コードでレンダラを明示したところ，どうやら大きな$N$に対してもベクター系で描画できるようです．

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/a4216870-8624-b004-814d-7217667a9ace.png)

「ようです」というのは，大きな$N$で作成した`svg`ファイルは開くのに非常に時間がかかり，すべてを確認できていないからです．保存時間も数分～数十分かかり，実用的ではありません．

公式の関数の出来栄えの良さに感心しております．
xargs + zipコマンドでディレクトリごとにzip化する


以下のようなディレクトリがあるとき、`photo/2021_01` ディレクトリを zip 化した `photo/2021_01.zip` を作りたい。

```
photo
├─ 2021_01
    ├─ photo1.png
    ├─ photo2.png
    ├─ ...
├─ 2021_02
├─ 2021_03
├─ ...
```

# コマンド

```bash
# photo のディレクトリで実行するとき
cd photo; ls | sed -e "s|/$||" | xargs -I{} zip -r {}.zip {}

# photo の1つ上のディレクトリで実行するとき
find photo -type d | grep "/" | xargs -I{} zip -r {}.zip {}
```

# 補足

## zip コマンド

```bash
$ zip -r 生成するzipファイル名 zip化するディレクトリ名
```

## xargs コマンド

`-I replstr` : 後ろのコマンドに含まれる replstr の文字列をパイプの出力から受け取った文字列に置換する。

```bash
$ echo "2021_01" | xargs -I{} zip -r {}.zip {}
=> zip -r 2021_01.zip 2021_01
```
【Power Apps】帳票作成アプリの開発は難しい

[Print()関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-print)とスクリーンテンプレートの「縦長で印刷」「横長で印刷」という組み合わせで一見帳票出力アプリを作成することはできそうに見えますが、結論としては「**実用的な帳票アプリをPower Appsのみで作成するのは現時点**（2021/12時点）**では難しい**」と思います。

理由は以下の2点のためです。
### ➊1ページで明細を表示しきれない場合、**改ページをするすべがないため**実用的でない。

:::note info
ただし限定的ではありますが以下のような回避方法はあります。
:::

https://qiita.com/Econoshift/items/118d471791ad55764200


###➋簡単な集計を行うのにも**コードが複雑化しやすい**ため。
コレクション機能を使ってグループ化してから更に集計列を出すためのコレクションを生成する必要があり、コードが複雑化しやすいです。
以下のコードは日付で絞った明細行を、見積番号ごと（⑴グループ化する）に見積原価を集計しています。
![Items.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/2359bef9-d054-6a64-cd43-72cebf5bfdc3.png)
【参考】[三島正裕のOffice365コラム「PowerAppsで売上ランキングを表示する。グルーピングをおぼえよう！」](https://www.si-jirei.jp/2019/03/29/powerapps%e3%82%b3%e3%83%a9%e3%83%a0-2/) 

コードが複雑化しやすいということはそれだけバグも生じやすくなります。

### その他注意
また、限定的に使用してみる場合でもPrint関数には以下の制限があるため注意が必要です。
>現在 Print 機能は、モバイル デバイスや SharePoint のカスタム フォーム上では動作しません。

https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-print#known-limitations
PHPファウンデーションの最新情報 2022年1月

先日[PHPファウンデーションが発足](https://qiita.com/rana_kualu/items/eaf97694f25a62f93a7e)しましたが、その後どうなったでしょうか。

以下は、2021年1月の経過報告、[The PHP Foundation Update, January 2022](https://opencollective.com/phpfoundation/updates/the-php-foundation-update)の日本語訳です。
著者のRoman Pronskiy( [Twitter](https://twitter.com/pronskiy) / [GitHub](https://github.com/pronskiy) / [Webサイト](https://pronskiy.com/) )はJetBrainsのえらい人です。

# The PHP Foundation Update, January 2022

`<?php echo 'Hello world!';`

2021年11月に、PHPファウンデーションが[正式に発足](https://blog.jetbrains.com/phpstorm/2021/11/the-php-foundation/)し、幸いなことにコミュニティから多大な支持を得ることができました。
この活動を支えてくださっている全ての方に感謝します。
我々は毎月活動を報告していく予定ですが、今回がその最初の記事となります。

## The first round of applications is now closed

スポンサード開発者枠の一次募集を締め切りました。

募集開始以降、多くの開発者から寄付の申し込みがありましたが、中にはぜひともスポンサード開発者になりたいという者も多数ありました。
現在、応募者の方々と詳細を検討していますが、正しく運用するためには適切な契約書類が必要になります。
JetBrainsの法務部とOpenCollectiveのスタッフが、必要な書類作成を手伝ってくれています。

1月中には準備を完了し、書類にサインを終える予定です。
その後、第一次スポンサード開発者のリストを発表します。

## How we're making decisions

いままでにミーティングを3回実施し、喫緊の課題について議論しました。
各会議と意思決定プロセスは全て[GitHub](https://github.com/thephpf)に収められています。
今のところ詳細は伏せていますが、タイミングが来たときには公開するつもりです。

今後数か月は隔週でミーティングを続け、ファウンデーションのガバナンス、ルール、規則などの作成に取り組んでいく予定です。

## Shout out to our sponsors

スポンサーの皆さまへの感謝。

PHPファウンデーションに寄付してくださった皆様、本当にありがとうございました。
設立当初からのスポンサーである[JetBrains](https://www.jetbrains.com/)・[Automattic](https://automattic.com/)・[Acquia](https://www.acquia.com/)・[Zend](https://www.zend.com/)・[Craft CMS](https://craftcms.com/)・[Laravel](https://laravel.com/)・[Symfony](https://symfony.com/)・[Tideways](https://tideways.com/)・[PrestaShop](https://www.prestashop.com/)・[Private Packagist](https://packagist.com/)に加え、さらに多くのスポンサーが参加してくれました。

10000ドル以上の支援をいただいた、以下の企業には特に感謝します。

・[RAKUS](https://www.rakus.co.jp/)
・[Livesport s.r.o.](https://www.livesport.eu/)
・[OP.GG](https://jp.op.gg/)
・[Polcode](https://polcode.com/)
・[Shopware](https://www.shopware.com/)
・[BASE, Inc.](https://binc.jp/)
・[Aternos GmbH](https://aternos.org/)
・[Digital Scholar](https://digitalscholar.org/)
・[Ardennes-étape](https://en.ardennes-etape.be/)

PHPファウンデーションは、みんなのものです。

本日の報告は以上です。
最新情報を得たいならば[@ThePHPF](https://twitter.com/thephpf)をフォローしてください。

💖🐘


# 感想

PHPファウンデーションは、これまで50万ドル近くを調達することに成功しました。
[青息吐息な](https://www.technologyreview.jp/s/263829/the-internet-runs-on-free-open-source-software-who-pays-to-fix-it/)[プロジェクト](https://www.itmedia.co.jp/news/articles/2201/11/news160.html)[も多い](https://qiita.com/rana_kualu/items/ddfb15b4a585918ee806)中、幸先の良いスタートを切れたようです。
これが今後も継続していければ、PHPはますます良いサイクルに入れるでしょう。
そして成功したモデルとして、他のOSSプロジェクトのフラグシップとなれるとよいですね。

逆に言うとたった5千万なんで、フルタイム開発者をほんの数人しか雇えないとも言えます。
GAFAあたりが全く参加してないのもアレですね。

本文で募集を締め切ったと言っているのは開発者であり、[通常の寄付についてはいつでも受け付けています](https://opencollective.com/phpfoundation#category-CONTRIBUTE)。
日頃お世話になっているあなたも、ぜひ参加してみてはいかがでしょうか。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/ca0b6594-ec9a-7c39-4dd0-494ff756ac8d.png)

私も参加しようと思ったのですが、何故かカードが拒否されるんですよね。
なんで。
わからん(限度額ではない)
在宅勤務の状況を上司にLINEで伝えるツールを作りたかった。

小売業の本社スタッフとして勤務しています。
コロナ禍の中で私の会社では在宅勤務が推奨される様になりました。
直接目で見て管理出来ないのでちゃんと業務しているか上司が一番気になる点と思います。
逆に部下からすると、少しメールの返信が遅いだけで疑われることも・・
そこで、在宅勤務の状況を上司にLINEで伝えるツールを作りたいと思いました。
#使用したツール

* Teachable Machine
* CodePen
* LINEmessagingAPI
* Node-red

#作成工程
##1.TeachableMachineを使って体の動きを学習させる
TeachableMachineを使って以下の5パターン学習させました。

1.業務開始します＝腕で丸を作る動き
2.離席します＝手のひらパーを前へ
3.戻りました＝親指を立てる
4.業務終了します＝大きなバツを作る
5.業務中です＝動きなし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/675bcab6-1ac7-bc72-fbf2-7397d712eb7f.png)
##2.CodePenでTeachableMachineで作成した情報を表示させるコードを作成
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="JjOGoOB" data-user="mdaisuke31612" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mdaisuke31612/pen/JjOGoOB">
  業務中の合図</a> by DAIN (<a href="https://codepen.io/mdaisuke31612">@mdaisuke31612</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
ここで画面上正しく表示されるか確認しました。
動きに反応して文字が表示されることが確認出来ました！
![IMG_1323.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/0a71dbf1-e1d4-f2ef-a164-a583286b29e9.gif)
##3.Node-redでフロー作成
サイトなどで調べながらフロー作成しそれぞれのノードを編集。
LINEの送信はLINEmessagingAPIからアクセストークン取得。
業務中の合図はLINEへ送信しない様にしたいと考えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/d94669bc-eb52-9659-9552-234c94719cdd.png)
##4.CodePenとNode-redの連携
ここでうまく連携出来なかった・・・
調べながらJSのコードを触るもアクションが送信されず、Node-redもデバックウインドウに何も表示されなかった。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="JjOGoOB" data-user="mdaisuke31612" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mdaisuke31612/pen/JjOGoOB">
  業務中の合図</a> by DAIN (<a href="https://codepen.io/mdaisuke31612">@mdaisuke31612</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
#感想
このツールがあれば在宅勤務中でも誰が業務中か、離席しているか、上司やチームメンバーと共有出来るのではないかと思い取り組みました。電話取り次ぎなども楽になると思いました。
しかし、今まで学習したことを繋げて１つの物を作成したいと思いましたが実現出来ませんでした。
ml5.jsから触ってみましたがうまくいかず、JSコードの書き方がわからないのが自分の課題と思いました。少しずつでも学んでいきたいと思います。修正方法わかれば教えていただけるとありがたいです。
外部攻撃からAWS環境を守れ！（アソシエイト試験対策）

SAAやSOAの試験勉強をしていて、こういう攻撃がきたときはこれ使う！
っていうセキュリティ系のサービスが紛らわしかったのでまとめておく。

試験対策なので問題ありきかつ、覚えやすいように体系的っぽい感じでかいていきます。

##概要図##
![スクリーンショット 2022-01-31 19.02.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/d7d32715-0f56-f135-84e7-7eff8cbdca58.jpeg)

##試験での対策##
**①SQLインジェクション、クロスサイトスクリプティング**
SQLインジェクション：入力フォームにSQL入れて実行させる
クロスサイトスクリプティング：リンクのURLに危険なURLを仕込む
考え方：どっちもアプリケショーンの階層から攻撃してくるので、この階層で守る
回答：**WAF（Web Application Firewall）**

**②DDos攻撃**
DDoS攻撃：大量データの送信
考え方：大量データだから防御的（シールド）なものが必要（こじつけ）
回答：**AWS Shield**

Shieldには「Standard」と「Advanced」があるのでその違いも。
・Standard：DDos（レイヤー３、４）防ぐ。無料。
・Advanced：上記に加えアプリケーション層（レイヤー７）での検知と保護が可能。有料。
そしてDDoS食らって料金がいきすぎたら払い戻しあり（神）

**③APIコール、ブルートフォース、マルウェア等**
APIコール：設定していないIPからAPIを読んでいる
ブルートフォース：パスワードの総攻撃（パスワードが仮に４桁なら0000〜9999まで順に全部うちこむ）
マルウェア：ウィルスとか。昔からよくあるやつ。
考え方：もうやられちゃってる系
回答：**GuardDuty**（Dutyは義務とか任務とかそんなイメージの単語らしいです）

感覚的にもっとあるかなと思ってましたが、よくきく攻撃に対するサービスは基本的にこの３つです。
もちろんセキュリティ的の基本としてIAM、EC2、VPC、Trail、Config、Inspecterなどがあります。

これで、この攻撃は〜ってのがきたときの対策はばっちりですね。
良いAWSスタディーライフを！！

以下参考にさせていただいたサイトです。感謝。

・DDos対策
https://www.stylez.co.jp/columns/ddos_prevention_in_aws/#DDoSAWS_Shield_Standard

・AWSセキュリティサービスまとめ
https://www.ragate.co.jp/blog/articles/10233#h2-3-h3-3

・Shield
https://zenn.dev/mn87/articles/255e9b9357ea3f

・GuardDuty
https://recipe.kc-cloud.jp/archives/11935

##AWS Network Firewall (2022/2/23 追記)##
**AWS Network Firewall**というものを見つたので、追記しておきます。

DPI（ディープパケットインスペクション）を実行したい、
とくればこれが回答になるようです。

Network FirewallはVPCのインターネットゲートウェイの手前に置かれる
イメージでパケットフィルタリングとかアクセス制御ができるようです。
2020年にできた新しめのサービスでした。

DPI：ネットワーク境界で行われるパケット検査手法のひとつ。
伝送するデータ本体の中身を検査する。

※参考
・DPI
https://e-words.jp/w/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9A%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.html

・AWS Network Firewallを分かりやすく解説してみる
https://blog.serverworks.co.jp/all-about-aws-network-firewall
recoverメソッドに感動した話（CakePHP2のTreeビヘイビアについて）

この記事では、CakePHP2のTreeビヘイビアに搭載されているrecoverメソッドの実装例とすごさを記述します。

# はじめに
世間的にはもう役目を終えつつあるCakePHP2ですが、最近実務で触る機会がありました。

Treeメソッドを使用したテーブルにレコードを追加するという業務をこなす中で、recoverメソッドに出会い感動しました。

もしかしてまだ使用したことがない人もいるかも、と思いましたので共有させていただきます。

# Treeビヘイビアって何？
データベースのテーブル内のレコードに対し、階層構造を作る仕組みです。

下記のような構造を同一テーブル内で実現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238817/74e99496-45cf-b374-8574-6fa04b1e688d.png)

詳細は公式ドキュメントを参照ください。
https://book.cakephp.org/2/ja/core-libraries/behaviors/tree.html

# recoverメソッドって何？ 何に感動したの？
recoverメソッドは、階層構造の座標指定を自動で調整してくれる仕組みです。

これを知らない時の私は、以下のようにモヤモヤを抱えていました。

- lftとrghtって、どうやって指定すればいいんだろう？
- もし階層をずらす場合、前レコードのlftとrghtを再計算しないといけないのだろうか？
- もしそうなら、非常にめんどくさい……。

**ご安心ください！**

recoverメソッドを使えば、lftとrghtの調整が１行で行えます。

当時の私は
**こんなに簡単に調整できるのか！！ CakePHP2やるやん！！**
と、感動しました。

（なおサポート切れの模様）

# どうやって使うの？

簡単です。

使用したい場所に下記の１行を追加してください。

```php
$this->モデル名->recover();
```

マイグレーションファイル内で使用する場合は、afterメソッド内から呼び出すと良いと思います。

```php
    public function after($direction) {

        App::import('Model','モデル名');
        $モデル名 = new モデル名();

        // recoverメソッド呼び出し！
        $モデル名->recover();

        return true;
    }
```

これだけ。

なんてシンプルで素敵な記述なんでしょう。

# 最後に
ドキュメントは隅々まで目を通すべきだな、と実感しました。

誰かのお役に立てれば幸いです。
Prism コードサンプル学習：19-NavigationParticipation

# Prism コードサンプル学習：19-NavigationParticipation

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/69d5f993b28d629db896>

## 19-NavigationParticipation

本サンプルは、ボタンを押下するとタブコントロールにタブアイテムが追加されるサンプルです。
ボタンを押下するごとにタブのビューのカウントがインクリメントされます。
以下のINavigationAware.OnNavigateToメソッドを実装することで、UIの追加および遷移時にカウントがインクリメントされる処理を実装されています。

```cs
using Prism.Mvvm;
using Prism.Regions;
namespace ModuleA.ViewModels
{
    public class ViewAViewModel : BindableBase, INavigationAware
    {
        private string _title = "ViewA";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private int _pageViews;
        public int PageViews
        {
            get { return _pageViews; }
            set { SetProperty(ref _pageViews, value); }
        }

        public ViewAViewModel()
        {
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            PageViews++;
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
        }
    }
}
```

ユーザーがビューを追加するために必要な処理はとくになく、過去の記事で見た通りにIRegionManager.RequestNavigateメソッドを用いること、そしてTabControlにRegionManagerを用いて名前を与えることです。
今回のサンプルの変化点としては、VMでINavigationAwareインターフェイスを実現しているため、[この処理](https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Wpf/Regions/RegionNavigationService.cs#L244)で[MvvmHelpers](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Common/MvvmHelpers.cs#L68)の処理が実行されている点が異なるところです。
実際にUI要素のDataContextからVMを取得し、実行されるということがわかります。

## おわりに

今回は、RegionManager.RequestNavigateメソッドを利用し、タブアイテムが増えていくサンプルを見ていきました。
ただ、大きな流れ（クラス間の関連やメソッド呼び出し）はあまり大きく変わってはいませんでしたが、INavigationAwareインターフェイスを実現することでビュー遷移後に処理が実行される仕組みを読み取ることができました。
次回、[20-NavigateToExistingViews](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/20-NavigateToExistingViews)について見ていこうと思います。
M5Stamp C3U をMicroPythonでＬチカしてみた

スイッチサイエンスで販売している、M5Stack社の[M5Stamp C3U](https://www.switch-science.com/catalog/7894/)にMicroPython(v1.18)を入れて、内蔵ＬＥＤを点灯(Ｌチカ)させた状況を紹介します。
　（ファームウェアは、MicroPythonホームページから.binファイルをダウンロードして使用した）

## 環境
Windows 10 (21H2)
M5Stamp C3U Mate

## ファームウェアのダウンロード
MicroPythonホームページ(https://micropython.org/ )のDOWNLOADから'ESP32-C3 with USB'のページに入り、Firmwareをダウンロードする。
　（私の場合'esp32c3-usb-20220117-v1.18.bin'をダウンロードした）

## ファームウェアの書込み
ダウンロードページにも記載がありますが、esptool.pyを使用して書き込みを行います。
　（esptoolが入ってない場合は、別途インストールが必要です）

WindowsパソコンとM5Stamp C3UをUSBケーブルで接続する時、M5Stamp C3Uのプログラマブル物理ボタンを押しながら接続するとダウンロードモードで起動し、Windows側でCOMデバイスとして認識される。

・チップの情報取得(flash_id)
　　　　COMx ： COMデバイス名(COM4等に置き換える)
```esptool.py.exe --chip esp32c3 --port COMx -b 460800 flash_id
```

・フラッシュの削除(erase_flash)
```esptool.py.exe --chip esp32c3 --port COMx -b 460800 erase_flash
```

・フラッシュの書き込み(write_flash)
```esptool.py --chip esp32c3 --port COMx --baud 460800 write_flash -z 0x0 esp32c3-usb-20220117-v1.18.bin
```

・書き込み確認
Tera Term等でCOMxに接続、シリアルポートのスピードを460800に設定して、M5Stamp C3Uのリセットボタンを押すと、MicroPythonの起動メッセージが表示される。

```
MicroPython v1.18 on 2022-01-17; ESP32C3 module with ESP32C3
Type "help()" for more information.
>>>
```

## Ｌチカ（その１ ← 失敗）
ATOM EchoでＬチカしたコードのGPIOピンを変更して実行すると、エラーが出てLED点灯しない。

```python
from machine import Pin
from neopixel import NeoPixel
pin = Pin(2, Pin.OUT)
np = NeoPixel(pin, 1)
np[0] = (128, 0, 0)
np.write()
```

Tera Term画面上に、以下のエラー表示がされる。

```
E (33842) rmt: rmt_set_gpio(530): RMT CHANNEL ERR
E (33842) rmt: rmt_config(686): set gpio for RMT driver failed
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "neopixel.py", line 1, in write
OSError: (-258, 'ESP_ERR_INVALID_ARG')
```

## Ｌチカ（その２ ← 成功）
MicroPythonドキュメントページでＲＭＴチャンネルについての記載を確認し、１行目と４行目を追加したら、カラーＬＥＤが赤色に点灯できた。

```python
import esp32
from machine import Pin
from neopixel import NeoPixel
esp32.RMT.bitstream_channel(0)
pin = Pin(2, Pin.OUT)
np = NeoPixel(pin, 1)
np[0] = (128, 0, 0)
np.write()
```

 ※考察：bitstream_channel()の初期値は３になっていたが、ESP32-C3のRMTは２チャンネルなので         'RMT CHANNEL ERR'が発生したのか？


## Ｌチカ（その３）
赤色に点灯だけでは、さみしいので色が変化するサンプルも作ってみた。

```python:main.py
import time
import esp32
from machine import Pin
from neopixel import NeoPixel

def main():
    esp32.RMT.bitstream_channel(0)    # ＲＭＴチャネルを設定
    pin = Pin(2, Pin.OUT)    # NeoPixel 駆動のための GPIO 2 を出力に設定
    np = NeoPixel(pin, 1)    # 1ピクセル用の NeoPixel ドライバーを GPIO 2 で作成

    # ＲＧＢ各値の合計が２５５になるように
    for n in range(0, 15):
        for cnt_r in range(0, 15):
            for cnt_g in range(0, 15 - cnt_r):
                cnt_b = 15 - cnt_r - cnt_g
                np[0] = (cnt_r * 16, cnt_g * 16, cnt_b * 16)
                np.write()
                time.sleep(0.1)
        time.sleep(1)

    np[0] = (0, 0, 0)       # 第１ピクセルを黒に設定
    np.write()              # 全ピクセルにデータ書込み

if __name__ == '__main__':
    main()
```

## 今後
M5Stamp C3Uに温度センサーを繋いで、連続的に温度変化を記録できるようにしたいと思っています。
UNIX系でのバイトオーダー（エンディアン）の調べ方

# バイトオーダーとは
2bytes以上のデータをメモリに格納する際の順番のこと。
割り当てられているメモリの後ろの方から格納していくのをリトルエンディアン、反対に頭の方から格納していくのをビッグエンディアンという。
どちらが採用されているかはCPUによって異なる（Intel系はリトルエンディアン）。

# 調べ方
```bash
> sysctl hw.byteorder
```
出力結果が'1234'ならリトルエンディアン、'4321'ならビッグエンディアン。

# 参考
https://atmarkit.itmedia.co.jp/icd/root/70/5784470.html
http://piyocast.com/as/archives/10591
AWS向け基礎知識その２

##1.はじめに
この記事ではSnowファミリーをはじめとしたAWSのサービスについて書いていきます。
##2.Snowファミリー
SnowファミリーはTB(テラバイト)を超えるような大量のデータをAWSストレージへ転送するサービスです。その転送は、AWSから貸し出される機器にデータを取り込み、その機器をAWSに返送するとデータが「Amazon S3」というストレージに保存されるという流れで行います。
Snowファミリーには以下の３つのサービスがあります。

・AWS Snowcone:デバイスが小さいのでIoTや持ち運びができます。１台につき80TB分のストレージとして利用でき、「AWS Datasync」を使用してオンラインで転送することも可能です。また、エッジコンピューティング荷も対応しています。

・AWS Snowball:ペタバイト規模の大量のデータを転送することができます。このサービスは2つのオプションがあります。

①Snowball Edge Storage Optimized:ローカルストレージや大量のデータを転送したいときに選択するオプションです。

②Snowball Edge Compute Optimized:エッジコンピューティング向けで、vCPUやメモリが潤沢に搭載されており、オフラインでも高度な処理を行いたいときに選択するオプションです。

・AWS Snowmobile:エクサバイト規模の大量のデータを転送することができます。そのため、デバイスのサイズも非常に大きく、14mのコンテナにストレージを搭載したトレーラーです。

##3.その他のAWSサービス(一例)
他にもAWSのサービスは様々なものがありますのでその中から3つ紹介します。

・Elastic Beanstalk:「S3」や「RDS」などのAWSのアプリケーションが動作するための環境を自動で構築することができるサービスです。

・OpsWorks:ChefやPuppetを使って設定をコード化し、「EC2インスタンス」や「EBS」などの管理を自動化します。

・CloudFormation:「JSON」や「YAML」でAWSリソースの設定を定義し、各AWSサービスの構築や設定を行います。
PHP forの多重ループ

繰り返し処理の際にforを使用していて処理が分かっていなかったため調べたときの備忘録です。


```
for($i = 0; $i < 3; $i++){
    for ($j = 1; $j < 4; $j++) {
        echo $i . $j . " ";
    }
}
//出力：01 02 03 11 12 13 21 22 23
```

####1.１番大きなfor分の処理が始まる。$i = 0
####2.中のfor分の処理が始まり、この処理が終わるまで表示が繰り返される。$j = 1から3まで
####3.2までが終わると1の$iに1が足され同じ処理が繰り返される。$i = 1

一番大きなfor文の中の処理が終わりきると一番大きなfor分が次の繰り返しに移るってことなんですが、わかりやすく書けなかったです。
語彙力もつけたいです。
divの4辺の内、どの辺からマウスが出たかを判定する


StackOverflowで発見し、いつか使いそうと思ったので備忘録。
https://stackoverflow.com/questions/44878011/detect-from-which-side-the-mouse-left-a-div

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="oNGygjp" data-user="yuki-yoshimura" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yuki-yoshimura/pen/oNGygjp">
  divのどの辺からマウスが出たかを調べる</a> by Yuki  (<a href="https://codepen.io/yuki-yoshimura">@yuki-yoshimura</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
小技：Microsoft Teamsのリンクのコピーでゲストユーザに配慮する

# そもそも
Teamsでファイルを共有しようとするときに`リンクのコピー`を多用するはずです。
ただ、Teamsを同じ会社のメンバで使っているときはあまりこのリンクの種類を気にしたことはないでしょう。
ですが`ゲストユーザ`を交えてプロジェクトのドキュメント共有とかしようとして、迂闊によく分からない権限のリンクを伝えると。

```
このリンクは社内ユーザーのみ使用できます
```

が表示されて開けない！　という苦情に似た叫びが届くはずです。

# 正しいゲストユーザへのコピーの権限とは？
同じTeamsのチーム内では、リンクを使わずとも普通にファイルの格納や閲覧をしているはずです。

そもそも、Teamsのリンク(正確には、SharePointのリンク）の種類には以下があります。

* リンクを知っているすべてのユーザ
* リンクを知っているあなたの組織のユーザ　←`コレがデフォルト`でコレになってる可能性大で`ダメなやつ`
* 既存アクセス権を持つユーザ　←`コレが正解`
* 特定のユーザ

なので日頃一緒に作業している外部ユーザ（ゲストユーザ）にリンクを共有するには、
`既存アクセス権を持つユーザ`
にするのが大正解なんですね。

#　デフォルトを「既存アクセス権を持つユーザ」に変えるには？
もちろん↑の事を知った上で毎回`既存アクセス権を持つユーザ`に変える作業すればいいんですが、
コレを知らないチームメンバの為におデフォルトを変えてあげましょう。

ココでアクセスが必要となるのが`SharePoint管理センター`です。

https://qiita.com/amatatsuk/items/cb6e08cf6d85c5945f5a

をご一読いただき`SharePoint管理センター`へ遷移しましょう。

# デフォルト設定を変更する
##STEP1
まず、表示された管理センターの左上メニューの中の`アクティブなサイト`を選択して、
一覧表示された目的のチームをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/eb451ba4-ae6c-7375-ce10-4dce1ea98e19.png)

サイト（対象チーム）を選択すると右にニョキッと管理項目が表示されます。
ここから`ポリシー`タブをクリックして`外部共有`にある`編集`をクリックしましょう。

##STEP2
次に表示された`共有`の中から`組織レベルの設定と同じ`のチェックボックスを外して、
`既存アクセス権を持つユーザ`に変更しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/ced6c0f2-8a2a-0e4b-1f1a-e5d356b5cb35.png)


##結果確認
Teamsに戻って（上手くいかないときは、ブラウザでTeamsを開く）と、デフォルトの設定が変更されているはずです。

#最後に
`2022/01/31`現在で・・・Win11に入れているTeamsの「リンクのコピー」が上手く動きません。
　→　代替え手段としてブラウザでTeams開くと使えるの謎
Next.js の静的 HTML ファイルのビルドとエクスポートの方法メモ

## Next.js のビルド・エクスポート方法

`package.json`ファイルに以下のスクリプトを追記する。

```json
"scripts": {
    // -o 出力先ディレクトリを指定
    "build": "next build && next export -o output", // ★追記
  },
```

以下のコマンドで実行する。

```bash
npm run build
```

## next/image を使用していると `next export` でエラーとなる

Next.js で利用を推奨されている`Image` (`next/image` パッケージ)を利用していると、`next export` 実行時にエラーとなり、静的 HTML が生成されない問題がある。

2021 年 12 月現在、Next.js を使用した静的 HTML ファイルを作成する場合、`Image`パッケージは `next export` ではサポートされていない。

`<Image/>`タグを使用して画像を表記している場合は `<img/>`タグを使用することで`next export` 実行時のエラーを回避できるため、本プロジェクトでは画像ファイル利用時には `<img/>`タグを利用するようにする。

## `<img/>`タグを利用した際の画像最適化

良い方法がないか調査中（★ いい方法があればコメントいただければと思います）。

### 検討したこと

以下の記事が参考になるかと思ったが、脆弱性(high)を含む npm パッケージが含まれており、`node_modules` が汚くなるかもしれないと思い保留中（2022 年 1 月調査時点）

- [Image optimization for static NextJS sites](https://blog.whereisthemouse.com/image-optimization-for-static-nextjs-sites)
Next.js(TypeScript)に TailwindCSS を導入する方法について

## 前提

ここでは、既存の Next.js（TypeScript）のプロジェクトに Tailwind CSS を導入する方法について記述する。

Next.js（TypeScript）の環境が用意できていない場合は、`npx create-next-app@latest --ts`コマンドで用意しておく。

## Tailwind CSS の導入

Tailwind CSS を導入するために必要な、以下 3 つのパッケージをインストールする

```bash
npm install -D tailwindcss postcss autoprefixer
```

## 設定ファイルの作成

Tailwind CSS に関する設定ファイル作成を、以下のコマンドを使用して行う。

```bash
npx tailwindcss init -p
```

実行すると、以下の 2 ファイルが作成される

- postcss.config.js
- tailwind.config.js

Tailwind CSS では `tailwind.config.js`内で設定を記述する。以下のようにして TeailWind CSS を適用するパスを指定する。

```js
module.exports = {
  content: ["./src/**/*.{js,ts,jsx,tsx}"], // 追記
  theme: {
    extend: {},
  },
  plugins: [],
};
```

最後に、`styles/globals.css`に Tailwind CSS の各レイヤーの`@tailwind`ディレクティブを追加する

```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

### styles/globals.css に @tailwind ディレクティブを入れたとき、VSCode 上で Warning が表示される場合

Windows10 の VSCode で Warning が表示される（？）様子。Tailwind CSS の自体は正常に動作するが。

気になる場合は、VSCode 拡張機能の [PostCSS Language Support](https://marketplace.visualstudio.com/items?itemName=csstools.postcss)を入れると Warning が消えるという報告があるので入れてみるといいかもしれない。

> 参考：[tailwindCSS で import されない。装飾の設定が反映されない問題の対処。 Win10 Next.js VSCode -- Qiita](https://qiita.com/masakinihirota/items/bd8c07aa54efad307588)

## 動作確認

一例として、以下の JSX を追記し、`npm run dev`で開発サーバ―を起動させて「Hello world!」の文字が太字かつ下線がひかれていれば、正常に動作している。

```JSX
export default function Home() {
  return (
    <h1 className="text-3xl font-bold underline">
      Hello world!
    </h1>
  )
}
```

## VSCode 用 Tailwind CSS 拡張機能

拡張機能 [Tailwind CSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss)をインストールすると、 Tailwind CSS の保管が効くようになる。

## 参考サイト

- [Installation: Tailwind CSS with Next.js -- TailwindCSS 公式サイト](https://tailwindcss.com/docs/guides/nextjs)
Next.js への Material-UI 5系の導入方法

## 導入方法

Material-UI 5 系の導入方法について、以下のコマンドを実行。

```bash
npm install @mui/material @mui/icons-material @emotion/react @emotion/styled
```

5 系からスタイリングシステムが変更されており、`emotion` か `styled-component`の導入が必要となり、ここでは `emotion`を採用した。

※ 使いにくいなどあれば、`styled-component`に適宜変更する。

## 参考サイト

- [Material-UI > Getting Started > Installation](https://mui.com/getting-started/installation/)
Linux環境（CentOS）における Next.js 12系のデバッグ実行エラーの解消方法

## エラー詳細

Windows10 環境で Next.js 12系をデバッグ実行できるが、Linux 環境（CentOS）において、デバッグ起動できない場合があるらしい。

原因は Rust ベースのコンパイラ SWC を使用してコンパイルするように変更したためだが、一部のシステム・アーキテクチャとの非互換があるため、エラーを起こす場合があるとのこと。

そのため、公式サイトにもあるが、以下の `.babelrc` ファイルをプロジェクトルートに格納することで、エラーは表示されなくなる。

```bash
{
  "presets": ["next/babel"]
}
```

## 参考サイト

[SWC Failed to Load -- 公式サイト](https://nextjs.org/docs/messages/failed-loading-swc)
pip-compileでAssertionErrorを回避する(2022-01-31時点での一時しのぎ)

# pip-compileでAssertionErrorを回避する(2022-01-31時点での一時しのぎ)

## 背景

kedro使っていて、`kedro build-reqs`でライブラリの依存関係を解決しようとするとエラーが出た。
結構ハマったのでメモ

`kedro build-reqs`は内部的に`pip compile`([pip-tools](https://github.com/jazzband/pip-tools))を使っているらしい。
調べてみると、pipのバグのようだった。

## 問題

2022-01-31現在、以下のように`pip-compile`しようとすると、`AssertionError`が発生する模様。

```
$ pip-compile src/requirements.in
```

既知のバグらしく、現在対応中とのこと
https://github.com/jazzband/pip-tools/pull/1559

## 解決策

pipのバージョンを21系にダウングレードすれば大丈夫

```
$ pip install pip==21.3.1
```
Dreamweaver ページ毎にbodyタグのIDを変えたい

Dreamweaver ページ毎にbodyタグのIDを変えたい


テンプレートで、<body id="bodyID">として、
「id」を選択した状態で、
「ツール」→「テンプレート」→「属性を編集可能にする」を選択
「チェックボックス」にチェック
属性にID、初期値にbodyIDの状態で「OK」をクリック
テンプレートを保存後、bodyのID名を変更したいhtmlを開き、
「修正」→「テンプレートプロパティ」で、任意のid名に変更
ココだけの話だけどF1-Scoreは少数ラベル評価指標ではない。

#先に結論

F1-Scoreは「少数ラベル評価」ではなく「Positiveサンプル評価」であり、positiveラベルが少数である時のみ、少数ラベルを評価できる。
negativeラベルが少数であるときや、positiveとnegativeのどちらが少数か不明な場合では期待する動きをしない可能性があるので気を付けましょう

#コードで見てみよう

```sample.py
from sklearn.metrics import f1_score, accuracy_score
import numpy as np

# 990件のnegativeと10件のpositive
y_true = np.zeros(1000)
y_true[:10] = 1
y_pred = np.zeros(1000)
y_pred[5:15] = 1

print(accuracy_score(y_true, y_pred))
# 0.99

print(f1_score(y_true, y_pred))
# 0.5

# 990件のpositiveと10件のnegative
y_true = np.ones(1000)
y_true[:10] = 0
y_pred = np.ones(1000)
y_pred[5:15] = 0

print(accuracy_score(y_true, y_pred))
# 0.99

print(f1_score(y_true, y_pred))
# 0.9949494949494949
```

見てわかる通り、positiveが多数ラベルの際にはF1はほぼAccuracyと同じ値になる。

#簡単な理由
F1スコアは以下の式で計算される。

```math
\begin{align}

F1 = \frac{2 \times Recall \times Precision}{Recall + Precision} \\
Recall = \frac{TP}{TP + FN} \\
Precision = \frac{TP}{TP + FP}
\end{align}

```

直観的に行くため、ここでTPやFNにどういった数字が入っているかを考える。

|  |pos(GT)|neg(GT)  |
|---|---|---|
|pos(予測) |TP  |FP  |
|neg(予測) |FN  |TN  |

ここで、positive >> negativeにおいてはおよそTP >> FN, FP > TNとなる。まずpos(GT)が圧倒的に大きいのでTP+FN(positiveサンプルの総量)が大きな値に。不均衡的にpositiveサンプルの多くはTPに。一部がFNになる。また、pos(予測)のうちでも多くがTPになるが、一部がFPになる。そうなると、RecallやPrecisionは


```math
Recall = \frac{1}{1 + \frac{FN}{TP}} , (TP >> FNとすると\frac{FN}{TP}⇒0.000に近くなるため) \\
=\frac{1}{1+0.000} = 0.999...
```

結局RecallやPrecisionはTPがどれだけできているかを見ているので、positiveサンプルがどれだけ正解できているかを見ているのであって、少数ラベルの出来具合をみているわけではないんですよね。
もちろん、positiveサンプルが少数の場合は、少数ラベルの評価指標にもなりえますが、そこをすっ飛ばしてとりあえずラベルの偏りがあるからF1scoreみたいにするのは良くないと思います。では
UITextViewに入力されている文字数をカウントする

TextViewに入力されている文字数のリアルタイムカウントを実装します。
文字列中の全ての空白や改行はカウントしません。


環境
---


* Xcode 13.2.1
* Swift 5.5.2


手順
---


StringProtocolを拡張します。

```Swift:Extension.swift
extension StringProtocol where Self: RangeReplaceableCollection {
  var removeWhitespacesAndNewlines: Self {
    filter { !$0.isNewline && !$0.isWhitespace}
  }
}
```


使用例
---


```Swift:ViewController.swift
extension ViewController: UITextViewDelegate {
  func textViewDidChange(_ textView: UITextView) {
    let textLength = textView.text.removeWhitespacesAndNewlines.count
    navigationTitle.text = "total： \(textLength)"
  }
}
```


終わりに
---

　
終わりです。
小技：Microsoft356管理センターとSharePoint管理センターのアクセス方法(URL)を知る

#そもそも
Teamsで外部メンバチームや社内向けチームの共有設定のデフォルトを変更しようとすると、根っこのSharePointの共有設定を変更しなければなりません。

しかし！　`SharePoint管理センターのURL`をGoogle先生で調べても出てきません。
それもそのはず、URLは各社ドメインで別々に設定されているからです。
　`https://{会社のドメイン}-admin.sharepoint.com/`
となっています。

#管理センターの構造
Microsoft356に関連する各種管理センターは、以下の構造になっています。
　親：Microsoft356管理センター
　子：SharePoint管理センター
　子：Teams管理センター
　子：Exchande管理センター
　子：他いろいろ

#肝心要のMicrosoft356管理センターへのアクセス方法を知ろう
Microsoft356には「管理センター」というのが存在していてココから一括して色んな設定やアカウントの権限が変更できたりします。
基本的なOffice365のURLは、
　`https://www.office.com/`
のログインからサインインしていけばたどり着けるハズです。

肝心の管理センターへのアクセスはズバリ！
ココです（左上メニューの中にある`管理`）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/e6e4c33a-a9bf-dc11-c8ad-3a813ef1c96e.png)

#SharePoint管理センターを探す
もうあとは簡単です！
Microsoft365管理センターの左メニューの「すべての表示」をクリックすると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/4a647034-17aa-01b8-2284-8ecea1780514.png)

ハイ・・・良く使われるであろう管理センターの一覧が出ました。
もちろん`すべての管理センター`をクリックすると全部の管理センターのページが表示されます。

#最後に
分かり難い！
[HTML/CSS] スプシの右クリックメニュー的なサムシングを作る備忘録


スプシの右クリックメニューに限らず、よくある階層的なヘッダーのサイトマップにも。

<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304114/5d9989e8-81f1-a3dc-1080-315293250155.png">

```html:index.html
<div>
	<ul>
		<li>
			<div class="li-txt">1層目 - A</div>
		</li>
		<li>
			<div class="li-txt">1層目 - B</div>
			<ul>
				<li>
					<div class="li-txt">2層目 - A</div>
				</li>
				<li>
					<div class="li-txt">2層目 - B</div>
					<ul>
						<li>
							<div class="li-txt">3層目 - A</div>
						</li>
						<li>
							<div class="li-txt">3層目 - B</div>
						</li>
					</ul>
				</li>
			</ul>
		</li>
		<li>
			<div class="li-txt">1層目 - C</div>
		</li>
	</ul>
</div>
```

```css:index.css
ul {
  list-style:none;
  width: fit-content;
  padding: 0;
  margin: 0;
}
/* ul内の深い階層も含む全てulを非表示 */
ul ul {
  display: none;
}
/* liホバー時にそのli直下のul要素だけを表示 */
ul li:hover > ul {
  display: block;
  width: fit-content;
}
ul li {
  position: relative;
}
ul li:hover {
  background-color: #ededed;
}
/* ホバーしているliに対して、その下の階層のulが横並びになるようにする */
ul ul {
  position: absolute;
  left: 100%;
  top: 0;
}
.li-txt {
  padding: 5px 10px;
}
```
スーパーで買いたいタバコの「品揃えの有無」「何番に陳列しているか」を教えてくれる映像判断ツールを作成しようとしたが、失敗報告）

私はスーパーでレジ業務のオペレーション改善を行っていますが、
このようなエリアを見たことはありますか。
![section04-img[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/abc3fbcf-446f-766a-3509-6078b12ae40c.jpeg)
サービスカウンターでは、商品券やギフトカードなどの販売のほかにタバコの販売も行っています。タバコは店舗ごとに紙・加熱式・電子など含めて約200の品目を取り揃え、お客さまが欲しい銘柄の番号をパネルの裏にある在庫から取り出して販売します。

#お客さまも従業員も探すのに時間が掛かる
お客さまは取り揃えている品目の多さや似たようなパッケージも多いことで探す時間が数十秒~数分かかります。（従業員も番号が言われるまで作業が止まる。レジ待ちの原因にもなっている。）
従業員はお客さまが番号を言わずに「これと同じの」と携帯の画面や自分の買いたいタバコを見せて、どこに陳列しているのか探すのに時間が掛かったり、と双方が苦慮する時があります。

今回、品目を絞ってですがパッケージを写したら「品揃えがあるのか」「何番に陳列しているか」を教えてくれるツールを作成してみようと挑戦しました。


#使用した機能
・Teachable Machine
・CodePen
・Node-RED


#Teachable Machineで各パッケージを覚えさせる
まず、Teachable Machineでパッケージの画像を覚えさせます。
周りの協力を得て手に入れたパッケージ以外は今回はネットから探したものなので、画像サンプルが少ないのが反省でした。セロハンによる光の反射でサンプルが少ないと認識が不十分になるようです。
![Teachable Machineタバコ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/10737e90-eb1f-c7b3-4182-bb7437b055b9.png)

[Teachable Machineの様子（動画）](https://youtu.be/gPQ2jIISkVU)

#CodePenについて
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="eYeNWjY" data-user="m-morito" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/m-morito/pen/eYeNWjY">
  タバコを探すのラクにする</a> by m-morito (<a href="https://codepen.io/m-morito">@m-morito</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#Node-REDについて
Node-REDで取得したパッケージから品揃えの有無、何番に陳列かを参照します
##1.全体のフロー
![Node-Red全体.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/c1dd3595-6dfe-d522-3257-6a2595ca8771.png)

##2.項目ごと
①http in
：CodePenから画像判定結果を受信
メソッドを「POST」、URLを「/receiver」に
![Node-Red(htpin).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/2d2542e5-d777-3e92-15d3-384f1e44939d.png)

②function1
：送られた画像判定結果を変数に退避
```
msg.pen = msg.payload.label;

return msg;
```

③Googleスプレッドシート
：シートから銘柄と陳列番号の一覧を配列で取得
![Node-Red(GSheet).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/3593c7b5-53dd-b3f7-5c0b-c2184a98c7f5.png)

：スプレッドシートには銘柄と、次の列に陳列している「番号」「品揃えの有無」を作成しています。
![GSheet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/3ee8fa49-eaea-491a-88fa-1b7fe59b7189.png)


④function２
：判定結果によって違う乱数を発生させて、生成した数値でセリフ一覧の配列からメッセージを選ぶ

```
for (  var i = 0;  i < 10;  i++  ) {
 if (msg.item == msg.payload[i]){
     msg.payload = msg.payload[i + 1]
     break;
 }
}    
return msg;
```

⑤http respons
：CodePenにメッセージを送信する



#結果
まったく反応しませんでした。失敗です。
[CodePenの様子（動画）](https://)

#課題と今後
自分のやってみたいことに対し[Qiita記事(リンク有)](https://qiita.com/kensyu20210726/items/23ff9cda064e5dd73a2d)があったのでコードなど修正しながらチャレンジしてみましたが、1項目ずつ勉強して理解しながら再度チャレンジしていきます。
Vモデルについて勘違いしていたと思ったこと

# はじめに
Vモデル（V字モデル）について、勘違いしていたと思ったことを記録しておく。
ただし、ここに記録していることも勘違いの可能性もある。
最初に、勘違いを気づかせてくださったのは、小川清氏と白坂成功氏だったと記憶している。

# V字モデル
https://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB

Wikipediaでは以下のように説明されている。
> V字型に表される概念図の左側はシステムの仕様を記述していく流れを示している。右側はテストの流れを示す。

世の中のVモデルの図を見ると、左上から真ん中下に、真ん中下から右上に、矢印が記載されていることが多くあると感じている（統計的な確認は未実施）。

# 勘違いしていたこと
## 『Vモデルは順序を示している』
「Vモデルは、左上から真ん中下に、真ん中下から右上の順番に、開発を行うことを示している」と思っていた。
しかし、今はこれが勘違いだと思っている。

# 参考メモ
## 白坂成功氏の資料
参考文献[1]で、白坂成功氏が、以下のように述べている。
http://deos.or.jp/event/files/20140625_DEOS_001.pdf?fbclid=IwAR1Pd8LJGUwHTG4VPYIzLeyIQUbfsZ9Mc9M02hIO99hj6CLH30GwRpkHKjE
> Vモデルに関する間違い
> ・Vモデルは時系列的なプロセスを示している。

### 白坂成功氏の講演（2016年）を聞いた時の私のメモ
Vモデルに関する知見とは、関係ないものもあり。

* 受動的でなく能動的に説明する。
* 開発はボトムアップでもよい。説明はトップダウンでしかできない。
* 標準に従うと差がでない。優先性もでない。
* 要求は開発者が自分達で定義する。
* 製造だけでなく設計を計測して改善する。
* Vモデルの左と右の間に評価と解析の活動がある。

松尾谷徹さんの資料にブリコラージュという考え方があります。
http://www.jasst.jp/symposium/jasst15tokai/pdf/S1.pdf
> 仕様から均一なソフトはできない。創造的な作業では、人は試行錯誤しながら、ものを作る。

この原則からしても、白坂成功氏がおっしゃっていた「開発はボトムアップになる」は普通なのかなぁと思えてきます。すごく、納得感を得ました。

## @kaizen_nagoyaさんの記事
@kaizen_nagoyaさんの以下の記事からも、V字は順番を示していないと認識した。
https://qiita.com/kaizen_nagoya/items/1b679769470c3dfd3012
これ、すごくわかる。すごく、大切な考え方。V字は順番を示していない。何からやると効率的か作戦立てないといけない。

# CEST技術交流会（2019年）に参加したときの私のメモ
過去に、2019年のCEST技術交流会では、林健吾氏と以下の議論をさせていただいた。
http://www.ertl.jp/CEST/act2019.html
> 炎上している大きな要因、開発終盤での性能問題である。
全部の機能が入らないと最終的な性能（リソース、時間）はわからない。
開発終盤だから、大きな設計変更はせず、ごまかすことが大半。
設計変更をした場合は、デグレがよく起きる。
ごまかした場合は、イレギュラーなことをやっており、次の開発で、埋め込まれた設計制約や分かりにくいコードの地雷にはまる。
炎上を退けるためには、先行開発で早く性能の検証ができることが、ポイント。

## 私の経験則
実際の開発をしていても、以下のような場面があり、「順番でなくてもいいのでは？」と思っていた。

* 今回は、右上のテストから手を出したほうが効果的かも
* とりあえずプロト版のソフトを作っておきたい
* 設計の検証はこのフェーズでは見送り、次フェーズでやりたい

# 大切だと思うこと
## Vモデルの左と右を繋ぐ線
個人的な経験則では、Vモデルの左と右の活動を繋ぐ線は、重要だと思う。
何をもとに評価をするのかを明確にすることが重要だと思う。
そのときに、箱の粒度等は業務・プロジェクトによって変わる。

参考文献[4]で小椋俊秀氏が書かれている図「ウォーターフォール型開発のＶ字モデル」では、左と右を繋ぐ矢印しか書かれていない。
自分がVモデルの図を書くときには、同じように左と右を繋ぐ線のみを書こうと思う。

# 参考文献
[1]白坂成功，「システムズエンジニアリングとディペンダビリティ」
http://deos.or.jp/event/files/20140625_DEOS_001.pdf?fbclid=IwAR1Pd8LJGUwHTG4VPYIzLeyIQUbfsZ9Mc9M02hIO99hj6CLH30GwRpkHKjE

[2]松尾谷徹，「テストから観た実体のモデリングと実装構造の評価　～ 検証指向設計の実現に向けて ～」，JaSST'15 Tokai ，2015
http://www.jasst.jp/symposium/jasst15tokai/pdf/S1.pdf

[3]@kaizen_nagoya，「仮説・検証（9）TDD, Agile, Performance Testは関係があるか」，2019
https://qiita.com/kaizen_nagoya/items/1b679769470c3dfd3012

[4]小椋俊秀，「ウォーターフォールモデルの起源に関する考察 ウォーターフォールに関する誤解を解く」，商学討究 第64巻1号，2013
https://barrel.repo.nii.ac.jp/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=269&item_no=1&page_id=13&block_id=135

[5]室谷隆，「ソフトウェア開発の標準プロセス」，財団法人計算科学振興財団 ソフトウェア・エンジニアリングセミナー，2011
https://www.ipa.go.jp/files/000004771.pdf

# 参考記事
https://qiita.com/kaizen_nagoya/items/ae391b77fffb098b8fb4

https://note.com/unread2up/n/n1bbf33fed4d6


https://blog.sa2taka.com/post/waterfall-is-missing/