OmniAICreator/Qiita-1.07M huggingface dataset:
ストアアプリではない方法でディストリビューションを導入

WSLでディストリビューションを導入するのに簡便な方法はストアアプリとしてインストールすることですが、デメリットは2つあります。

* 同じ名前のディストリビューションを複数入れられない
* ストアアプリの形で配布してないディストリビューションを入れられない

そこで今回の記事では「手で入れる」方法をまとめます。

最初は「ストア配布してないディストリビューションの導入に便利なツール wsldl」というタイトルで [wsldl](https://wsldl-pg.github.io/docs/) について書くつもりだったんですが、その後試してみたら、配布物のうちの１つであるLauncher.exeが、Windwos Defenderで弾かれるようになってました……仮に悪意のツールではないとしても、さすがに記事でお勧めしにくいので、方向転換しました。

# 目次

* [rootfsをダウンロードする](#rootfsをダウンロードする)
* [wsl.exe --importでインポートする](#インポートする)
* [レジストリを修正する（デフォルトユーザーの変更）](#レジストリを修正する)
* [起動する](#起動する)

# rootfsをダウンロードする

`/` にマウントしたいファイル一式をtarに固めたもの（または、それをgzip圧縮したもの）を入手します。

方法はいくつかありますし、最悪自分で頑張って作ることもできるのですが、なるべく手軽な方法を書きます。

## ディストリビューションのストアアプリから取り出す

[公式ドキュメントの「ディストリビューションのダウンロード」](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#downloading-distros)のリンクをたどると、インストーラーパッケージである .appx ファイルを入手できます。 .appx ファイルは実はZIPなので、.zip に名前を変更するなどして展開することができます。

たとえば、Ubuntu 2004のインストーラーパッケージ (Ubuntu_2004.2020.424.0_x64.appx) の中には install.tar.gz というファイルがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2079/15fa6229-ca9c-c04f-74a8-fce2067183db.png)

これが目的のファイルです。

## インストール済みのディストリビューションのファイル一式をエクスポートする

既にインストールしたディストリビューションを複製したいときなどは、コマンドラインで

```
> wsl.exe --export <ディストリビューション名> <出力するtarファイル名>
```

とすると、tarファイルが得られます。ディストリビューション名がわからないときは `wsl.exe -l` で表示してください。

## 公式に配布しているものを探す

* Alpine Linux... https://alpinelinux.org/downloads/ で「Minimal root filesystem」をダウンロードできます。
* Ubuntu... https://cloud-images.ubuntu.com/releases/ からバージョンを指定してたどっていくと、たとえば [ubuntu-20.04-server-cloudimg-amd64-wsl.rootfs.tar.gz](https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64-wsl.rootfs.tar.gz) のようなものがダウンロードできます。
* CentOS 8... https://cloud.centos.org/centos/8/ からたどっていくと、[CentOS-8-Container-8.1.1911-20200113.3-layer.x86_64.tar.xz](https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-Container-8.1.1911-20200113.3-layer.x86_64.tar.xz) がダウンロードできます。（ただし .xz ファイルは後でインポートするときに困るので、どうにか伸長して .tar 形式にしておいてください。）

## コミュニティ有志が再配布しているものを探す

記事先頭で触れたwsldlのサイトに行くと、[wsldlのインストーラーをセットして再配布しているディストリビューション](https://wsldl-pg.github.io/docs/Using-wsldl/)が見つかります。
これを使う場合はインストーラーもセットされているので、インストールと起動にはそっちを使えばいいという話ではありますが、ここはあえてrootfsだけ入手して、後の手順通りにやってみてください。

# インポートする

あとでかく

```
wsl.exe --import <ディストリビューション名として付けたい名前> <WSLのファイルシステムの置き場にするディレクトリのパス> <tarファイルまたはtar.gzファイルのパス>
```

# レジストリを修正する

あとでかく

`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{GUID}`

DWARD型の `DefaultUid` に値としてをLinux側のuidを設定（たとえば、10進数で1000/16進数だと3e8）

# 起動する

あとでかく

```
wsl.exe ~ -d <ディストリビューション名>
```

もしくは、wsldlで配布している `launchaer.exe`（Windows Defenderに弾かれた場合は例外指定をしないといけない） を `<ディストリビューション名>.exe` にリネームして、好きなところに置く
Progate jQuery 中級編道場コース　復習

html,css 側でクラスがなかったとしても、jQueryでのコードでクラスを持たせる（openクラスの処理）、この処理がイメージしにくく詰まり気味でした。その場での処理の為のクラスですが、こんな処理も出来るというのは頭に入れたいですね・・。
目標として作るものがあったとして、その解答への道のりは1つではないんだろうな、とふと感じました。
最効率としたコードの正解はあると思いますが。。
また、複雑すぎるコードで達成できたとしても、どこかで異常が起きてそうだったり、修正も大変でしょうから、最終的には無駄なく効率よくコードを書くのがベストなんでしょうね(*´꒳`*)
swagger-ui,swagger-editor環境構築(AWS/Docker)

## 前提条件
+ AWS EC2インスタンス作成ができている
+ EC2インスタンスにnginxインストール済

## EC2にDockerをインストール

EC2インスタンスにSSH接続後、下記コマンドを入力

```
sudo amazon-linux-extras install docker
```

## Docker起動

```
sudo systemctl start docker
```

## Docker起動確認

```
sudo systemctl status docker
```
![スクリーンショット 2020-12-01 12.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/465f2493-0cb9-83af-dc0d-eb310797d879.png)

**Active**になっていればOK

## swagger-editorのイメージをpull

```
sudo docker pull swaggerapi/swagger-editor
```

## swagger-uiのイメージをpull

```
sudo docker pull swaggerapi/swagger-ui
```

## swagger-editorを起動

```
sudo docker run -d -p 8000:8080 swaggerapi/swagger-editor
```

## swagger-uiを起動

```
sudo docker run -d -p 8001:8080 swaggerapi/swagger-ui
```

## コンテナ起動確認

```
sudo docker ps
```

![スクリーンショット 2020-12-01 12.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/9ed9e704-3314-8867-9658-21e987c9f55d.png)
**swagger-editor**と**swagger-ui**が表示されればOK

## nginx.confに追記

nginx.confを開く

```
sudo vim /etc/nginx/nginx.conf
```

下記内容をnginx.confに追記
**server{}**内に必ず追記するようにしてください。

```
        location /swagger-editor/docker/ {
          proxy_pass http://localhost:8000/;
          proxy_redirect off;
        }

        location /swagger-ui/docker/ {
          proxy_pass http://localhost:8001/;
          proxy_redirect off;
        }
```

## nginxを再起動or再読み込み
再起動

```
sudo systemctl restart nginx
```

再読み込み

```
sudo systemctl reload nginx
```
すでに、docker上で動かしているコンテナがswagger系以外にもあるなら、**再読み込み**がおすすめ
**再起動**して失敗してしまうと、正常に動いていた機能も含めて**全て利用不可になる**可能性があるので。

## URLにアクセスして、swagger-editorの表示を確認

```
http://(IPv4アドレス)/swagger-editor/docker/
```
下記のサイトが表示されればOK
![スクリーンショット 2020-11-30 22.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/d5d98ebd-3e73-e9b9-409e-a26d8e36630d.png)


## URLにアクセスして、swagger-uiの表示を確認

```
http://(IPv4アドレス)/swagger-ui/docker/
```

下記のサイトが表示されればOK
![スクリーンショット 2020-11-30 22.18.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/36a864b8-b260-13a4-8646-0ddb6bdeb9b9.png)

##自動起動設定(nginx,docker編)

```
sudo systemctl enable nginx
```

```
sudo systemctl enable docker
```

## 自動起動設定(dockerコンテナ編)
コンテナ単体の自動起動設定をすることもできます。
コンテナ起動後に、下記コマンドを入力してください。

```
sudo docker update --restart=always コンテナ名
```
自動起動設定を無効化する場合は

```
sudo docker update --restart=no コンテナ名
```

##最後に
以上が、AWS/EC2とDockerを使ったswagger-ui,swagger-editorの環境構築手順です。
不明点、質問等があればコメント欄にお願い致します。
リモートワークで再確認されたゲーム開発におけるミーティングの意義 - 充実したキックオフが開発を加速する

Happy Elements Advent Calendar 2020 3日目の記事です。

# 「あんさんぶるスターズ！！」とリモートワーク

「あんさんぶるスターズ！」は2020年3月15日に新章「あんさんぶるスターズ！！」となり、ゲームとしては「あんさんぶるスターズ！！Basic」「あんさんぶるスターズ！！Music」の2タイトル同時展開となりました。
また、Happy Elements株式会社カカリアスタジオは、2月ごろから部分的にリモートワーク、4月から6月の期間には原則としてリモートワークとなりました。
そのため、リリース直後の期間をプロジェクトとしてリモートワークで行うこととなりました。
それほどの混乱なく、リモートワークへの移行及びリモートワーク期間中の開発を行えたように感じております。

この投稿では、多くの企業における関心事の一つとなった「リモートワークにおけるエンジニアリング」についての一事例としてご紹介できればと思います。

# リモートワークにおけるエンジニアリング

リモートワークはコンテキストスイッチが発生しにくいため、個々人の作業においては、より集中しやすい環境だとも言えると思います。
その一方で、チームワークとして、同期的なコミュニケーションとしてのミーティングは欠かせません。
コンテキストスイッチや作業時間とミーティングはトレードオフにあり、それぞれのよい部分を活かすようなバランスが重要になってくるのではないかと思います。
リモートワークはそのことを再確認する機会となったように感じます。

# 充実したキックオフが開発を加速する

そうした中で、あるまとまりの開発単位で行うようなキックオフミーティングが、ゲーム開発においてはとりわけ重要だと再認識するようになりました。
キックオフミーティングは、チームワークにおいてゴールの認識を合わせ、そのためにどのような情報を受け渡しするかの認識を合わせるためのミーティングと言えるかと思います。
ゲーム開発ではチームメンバー全員にとって直感的とは限らない場合もあり、そのために同期的なコミュニケーションにより、それぞれの認識をすり合わせながら進める必要があります。
個々人の作業に入る前に「これでコンテキストスイッチなく、集中して作業できるな」として、安心してセパレートされるセットアップが、リモートワークにおいては重要なのではないかと思います。
カカリアスタジオでは、日常のコミュニケーションにチャットアプリケーションを使用しており、キックオフミーティング以降、それらに関する話題は主にチャットにて非同期のコミュニケーションで行うことになります。
言い換えると、キックオフミーティングでは、「後はチャットでテキストベースで非同期に認識をあわせていけばよさそう」という状況になるくらいが目安になると言えるかもしれません。

# ミーティングの棚卸し

リモートワークはミーティングの棚卸し（要不要の仕分け）の機会にもなったように思います。
ゲーム開発は流動的で必要なミーティングも変わっていき、逆に、当初必要だったミーティングがミーティングとしては不要になっていく場合もあるかと思います。
ミーティングの開催を終えるのは言い出しにくいかもしれないですが、「このミーティングはもう役割を終えたのではないでしょうか」と建設的に言い換えることで少し言いやすくなるかもしれません。
リモートワークに関わらず、ミーティングの棚卸しは定期的に行われたほうが良いかなと感じています。

# メンバー募集

Happy Elements株式会社 カカリアスタジオでは、
いっしょに【熱狂的に愛されるコンテンツ】をつくっていただけるメンバーを大募集中です！

もし弊社にご興味持っていただけましたら、是非一度
下記採用サイトをご覧ください。
[Happy Elements株式会社 採用特設サイト](https://recruit.happyelements.co.jp/)
第9回

\![Mac OS X-10.15.7](https://img.shields.io/badge/MacOSX-10.15.7-brightgreen) ![ruby-2.7.1p83](https://img.shields.io/badge/ruby-2.7.1p83-brightgreen) 
# assert_equal

イコールかどうかを判断するメソッド
# 色の付け方

    require 'colorize'
    puts '赤色で出力'.red
    puts 'シアンで出力'.cyan


# その他

他のコードで呼び出したときにいらない部分は

```ruby
if $PROGRAM_NAME == __FILE__
  assert_equal(1,1)
  assert_equal(1,2)
end
```

とすることで，呼び出さないようにする．

# コード
```ruby
require 'colorize'
def assert_equal expected, result
  p ['expected',expected]
  p ['result',result]
  if expected==result
    puts 'true'.cyan
  else
    puts 'false'.magenta
  end
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1,1)
  assert_equal(1,2)
end

```

------
 - **source** ~/grad_members_20f/members/Kenny0704/c9.org
C#でネスト化したJSONを出力する

# やりたいこと
何かしらから得たデータをC#上でJSONをネスト化して出力してみました。

# 環境や使用したライブラリ
- windows 10 64bit
- Visual Studio 2019
- .NET framework 4.7.2
- System.Text.Json

# 手順
## コンソールアプリケーションの作成
動作確認としてコンソールアプリを作成しました。
1.ファイル→新規作成→プロジェクト→コンソールアプリ（.NET Framework）とクリックして新しいプロジェクトつくります。

![image (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/a9f07aa7-b3b8-091b-1d73-b86a1b10689d.png)

2.ソリューションエクスプローラーから「参照」を右クリックで「NuGetパッケージの管理」をクリックします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/7648dcd6-c1f6-e153-2dad-5978a1381f1f.png)

3.「参照」から「text.json」を検索欄に入れてると、「System.Text.Json」がヒットします。そして、これをインストールします。
これで下準備は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/215e6d4e-fd39-3398-e061-0308bb6b38df.png)

## プログラム
プログラムは下記のようになります。
C#のDictionaryを入れ子にするイメージです。

```c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json;

namespace sample_json
{
    class Program
    {
        static void Main(string[] args)
        {
            // 例えば個人データを表すpersonのDictionaryを作成
            var person1 = new Dictionary<string, string>()
            {
                { "name"   ,"John"},
                { "age"   ,"12"},
                { "city"  ,"Tokyo"},
            };

            var person2 = new Dictionary<string, string>()
            {
                { "name"   ,"Ann"},
                { "age"   ,"13"},
                { "city"  ,"Kyoto"},
            };
            // groupは個人データをまとめるためのDictionary
            var group = new Dictionary<int, Dictionary<string, string>>();
            
            //groupに個人データpersonを追加する
            group.Add(1, person1);
            group.Add(2, person2);

            // Dictionaryをシリアライズ
            var jsonstr = JsonSerializer.Serialize(group);
            // コンソールに出力
            Console.WriteLine("{0}", jsonstr);
            Console.ReadKey();


        }
    }
}


```

## 結果
ネストされたJsonを出力することができました。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/5967a1da-e398-fee2-fb0f-4bdb4f302201.png)

# おわりに
Dictionaryを入れ子にして、System.Text.Jsonを使うことでネスト化されたJSONを出力することができました。
他にも良い方法があれば教えてください。

# 参考
[C#でJSONを扱う方法。System.Text.Jsonの使い方とは？](https://www.fenet.jp/dotnet/column/language/4763/)
Webの標準化と設計思想について

# はじめに
Web技術は日々進歩しています。
しかし、世界共通のルールがないまま開発者が独自に技術を拡張してしまうと、あらゆるものが正常に作動しないという事態が起きてしまいます。このようなことを回避するための**標準化**とWebがどのような思想のもとで設計されているかをまとめたいと思います。

# この記事のゴール

* **Webの標準化**とは何かを理解する
* **REST**と**セマンティックWeb**の言葉の意味を理解する

# 目次
[1.標準化とは何か](#1-標準化とは何か)
[2.Webの設計思想](#2-Webの設計思想)
[3.セマンティックWebとは何か](#３-セマンティックWebとは何か)
[4.まとめ](#４-まとめ)

## 1. 標準化とは何か
###1-1. 標準化の意味と経緯
お伝えした通り、Web技術は日々進歩し様々な機能拡張や新技術の開発が行われています。
例えば、Webという仕組みはもともと文書を公開・閲覧するだけの機能でしたが、ユーザーとのやり取りによる複雑な処理ができるようになりました。
(Webの用途については[過去に説明した記事](https://qiita.com/anago1030/items/0e2ab1c9af29615a3881#2-Web%E3%81%AE%E7%94%A8%E9%80%94)があるので参考にしてください)

また、HTMLもはじめは文書を表示するだけの機能でしたが、文字の色を変えたり、画像データを表示したり、音や映像データを扱えるようなっています。
HTMLはタグというマークで文章に意味を与えるマークアップ言語ですが、そのHTMLの表示スタイルをカスタムできる**CSS(Cascading Style Sheets)**やHTMLの親戚にあたる**XML(Extensible Markup Language)**、**XHTML(Extensible HyperText Markup Language)**など新しい技術が誕生しています。

こういった機能拡張を開発者が独自で行ってしまうと、どのWebブラウザでも同じようにWebページが表示されないといった事態が起きてしまいます。
そこで世界共通の規格をきめようということで**標準化**という作業が行われます。

###1-2. 標準化はどのように行われるのか
Webの標準化を中心になってすすめる団体が存在します。国家でいう政府のような存在です。
それが**W3C**というWebの生みの親である、ティム・バーナーズ=リー氏が創設した組織です。

この組織ではHTMLはもちろん前述したCSS、XML、XHTMLなどの標準化を行っています。
標準化したものは勧告というかたちで世界中に発表されていき、どのブラウザでもおなじようにWebページが表示されるという理想の状態を実現するため、現在はあらゆるWebサイトがW3Cの規格に則っています。

## 2. Webの設計思想
Webシステムは**RESTful**であることが理想であると言われます。
RESTfulとは**REST**という4つの原則にしたがって設計されたシステムのことです。
RESTの4つの原則は以下の通りです。

* **統一インターフェース**
 - 始めに定義された規格（例えば、HTTPで通信するといったこと）で情報をやりとりする

* **アドレス可能性**
 - すべての情報が一意（オンリーワンのものという意味）なURLで示される

* **接続性**
 - やり取りされる情報にはリンクを含めることができる

* **ステートレス性**
 - やり取りは一回毎に完結し、前のやり取りの結果に影響を受けない

以上がRESTの原則です。
このRESTの原則を遵守することによって円滑な情報のやり取りが実現するということです。

## 3. セマンティックWebとは何か
**セマンティックWebとは**、コンピューターが自立的に情報の意味を理解して、処理できるようになるWebの構想のことです。膨大な情報を効率よく処理するためにこのような構想が生まれました。
情報に関する情報を**メタデータ**と呼びます。メタデータがあることで情報の意味を人間だけでなく、コンピューターも理解できるようになります。

例えば、山田太郎という一つの情報があるとします。
この場合は、「山田」という情報は「名字」を表し、「太郎」という情報は名前を表します。
ここでいう、「名字」と「名前」がメタデータにあたります。

セマンティックWebはまだwebの世界全体にはまだ普及できていませんが、情報を検索するときの精度を上げたり、Webの世界から特定の種類の情報を素早く取得できるようになるなど、様々なメリットがあります。

## 4. まとめ

* **標準化**とはW3Cが推進する世界共通のWeb技術に関する規格である
* Webは**REST**というシンプルな原則よって設計されている
* **セマンティックWeb**とはコンピューターが自立的に情報の意味を理解して、処理できるようになるWebの構想のことである

以上です。最後まで読んでいただきありがとうございます！
お疲れさまでした。。

## 参考文献
この記事は以下の文献を参考にしました。

[Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3-ebook/dp/B06XNMMC9S/ref=sr_1_1?adgrpid=71142886531&dchild=1&gclid=Cj0KCQiAzZL-BRDnARIsAPCJs71wFbkb33aJsZIjZyTOiON6GkcyxyI-VQ_ydepIRo8ttZKmcabRnOIaAi5vEALw_wcB&hvadid=338577085874&hvdev=c&hvlocphy=1009332&hvnetw=g&hvqmt=e&hvrand=454281216908754680&hvtargid=kwd-334312951121&hydadcr=15818_11177340&jp-ad-ap=0&keywords=web%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC&qid=1606796055&s=books&sr=1-1&tag=googhydr-22)
第6回

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# 変数

rubyの変数は型宣言不要．

    name="bob"

引数にはARGV[]を用いる．

    #文字列
    num1=ARGV[0]
    #intにキャスト
    num1=ARGV[0].to_i


# メソッド

    def メソッド名(引数1,引数2)
      処理1
      処理2
    end

以下が例.

```ruby
def hello name
  puts "Hello #{name}"
end
name=ARGV[0]
hello(name)

```



------
 - **source** ~/grad_members_20f/members/Kenny0704/c6.org
俺が昔xymを送金した"alice"は今の"alice"と同一人物ではないのかもしれない

※ この記事で書かれている団体、サービス、会社等の名称は架空のものです。実在の人物や団体などとは関係ありません。

# TL;DR

- symbolについての話です
- namespaceとアドレスをリンクしておけばトランザクション発行時にアドレスをnamespaceで指定できる
- しかしnamespaceは所有者が変わり得るので昔のtxに記載された送り元、送り先のnamespaceが今現在の所有者と同じであるとは限らない
- namespaceによって指定されたアドレスが、その当時どのアドレスに結びついていたのかという情報は、トランザクションと一緒にブロックの中に保存されている。その名前を **レシート** という。
- レシートには名前解決情報(namespaceの変換情報)の他、ブロック報酬やモザイクの期限切れを知らせる情報など、暗に決定される情報を記録している。これがあるおかげで、過去の情報を調べるのにブロックを最初から順番に検証して当時のブロックチェーンの状態を復元する必要がない。

# namespaceは誰のものか、誰のもの"だった"のか

symbolにはnamespaceと呼ばれる仕組みがあり、手数料を支払えばsymbolというネットワーク内に自分だけのネームタグのようなものを得ることが出来る。これは自分が手放すまで他人は同じ名前のnamespaceを取得することは出来ない。

このネームタグはアドレスやモザイクに付けることができ、くっつけたもののIDの代わりに利用することが出来る。

アドレス（例えば`TDBYUUZIEU5HDUSRKCDFXQWYJ25ULC6EB7HEUTY`)や、モザイクID(例えば`5A7EC8C8FC195289`)は人間が覚えるには難しい。しかし、namespaceを使うことでそられにsymbolネットワーク上で使える名前を付けることが出来る。そしてそれらはnamespaceが付いたものの代わり(アドレスやモザイク)として利用できる。

これらはちょうど、IPアドレスとドメインの関係と同じようなものだ。

> 余談
> namespaceの有用性は単に可読性の話だけではない。例えばとあるサービス (仮に名前を `cryptoAdventure` とする) が `crypto_adventure` というnamespaceを取得したとする。そしてこのサービスは入金アドレスとして顧客にアドレスではなくて `crypto_adventure` に送金するようお願いしたとする。
> 
> ある日、サービス側が入金アドレスを資金管理の関係上変更したくなるとする、通常、アドレスを入金先として直接指定していたら入金アドレスの変更はなかなか出来ない。顧客に入金アドレスの変更をお願いするのはトラブルの元だ。しかし、ネームスペースによってアドレスに付けられた **エイリアス(要は別名)** を顧客に伝えておけば、入金アドレスの変更はネームスペースのリンク先の変更で済む。しかも、リンクの解除と再リンクはアグリゲートトランザクションを使うことで単一ブロック中に解決することが出来る。

ドメインのようにして使えるnamespaceだが、ドメイン同様、管理者が手放すと他の人が取得することが出来る。

これが何を意味するのかというと、 **同じnamespaceでも今のnamespace管理者と昔のnamespace管理者が異なることが起こり得る** ということを意味する。

例えば、1年前に送り先が `alice` のトランザクションがあったとする。そして、今、その `alice` というネームスペースは `TCBSK2HYE7LFMFJN5TRBQOJWXANN4SPPCC4RTEA` が所持していて、`TCBSK2HYE7LFMFJN5TRBQOJWXANN4SPPCC4RTEA` にリンクしていたとする。

この時、1年前に送り先が`alice`とあったトランザクションの送金先は、今`alice`にリンクしている`TCBSK2HYE7LFMFJN5TRBQOJWXANN4SPPCC4RTEA`だろうか?

結論から言うと"異なる可能性がある"(現時点での情報を信用してはいけない)。1年前のトランザクションなので、それまでの間にnamespace`alice`の管理者が変わった可能性もあるし、管理者が変わっていなかったとしてもリンク先のアドレスが変わっている可能性がある。

では、どうすれば1年前に送り先が`alice`とあったトランザクションの本当の送金先を調べることができるだろうか。

# 名前解決の記録はトランザクションと一緒にブロックに残っている

Webの場合、ドメインからIPアドレスを探すことを"名前解決"と呼ぶが、symbolではnamespaceによってつけたれたエイリアスからリンクされたアドレスを探すことをアドレス解決、エイリアスからリンクされたモザイクを探すことを"モザイク解決"と呼んでいる。

このアドレス、モザイク解決の結果は、 **レシート** と呼ばれる構造体に記録され、名前解決が必要なトランザクションと一緒にブロックに収められている。現時点での状態が信用できないものは、このレシートを確認することで信用できる情報を参照できる。
![20201201qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/3f625f16-b175-35c5-1d85-d4010ac407ba.png)

# 他にレシートになっているもの

https://docs.symbolplatform.com/ja/concepts/receipt.html

上記を確認すれば分かるが、ブロック生成の報酬や、期限切れしたLockHashTransactionの自動送金執行など、トランザクションとして発行されないブロックチェーン上の状態の変化が記録されている。

# レシートに類する機能が無い場合に過去の情報を調べようとするとどうなるか

symbolのようなアカウントベースのブロックチェーンでレシートに類する機能が無い場合に過去の情報を調べようとする場合、その当時のブロックチェーンの状態を復元する必要があるので、一番最初に戻ってひとつずつブロックを検証、データベースを構築していく必要がある。

特定ブロックごとにチェックポイントを設けて当時のデータベースの情報を丸々保管していたとしても、結局のところそこからブロックを辿らないといけなくなるなど、レシートに類する機能が無い場合は大変な仕事になることでしょう、
Bashスクリプトの絶対パスを取得する（シンボリックリンク対応）

Bashスクリプトの絶対パスを取得したい（正確にはその格納ディレクトリ）ということがあって、対応記事

[[bash] 実行スクリプトの絶対パスの取得](https://qiita.com/koara-local/items/2d67c0964188bba39e29)

を参考にしたのですが、私はシンボリックリンクを使っていたため、ディレクトリがうまく取得できませんでした。そこで、シンボリックリンク対応版を示します。

```bash:ディレクトリの絶対パス
SCRIPTDIR=$(cd $(dirname $(readlink -f $0));pwd)
```

なお、これはディレクトリのパスですから、スクリプト自身の絶対パスは

```bash:スクリプトのバス
SCRIPT=${SCRIPTDIR}/$(basename $0)
```

になります。
マルチスケールシミュレーション特論：第 11 回をまとめてみた

\![ruby-2.5.5p157](<https://img.shields.io/badge/ruby-2.5.5p157-brightgreen>) 


# はじめに

今週は chast 式 Ruby がついに最終回!! 前回の授業と同様にして、class 化について学習を行った


# class 化

サンプル用のプログラムを元に class についての学習を行っていく

class についての詳しい説明は<strong>[ここ](https://en.wikipedia.org/wiki/Class_%28computer_programming%29)</strong>を確認する


## サンプルプログラム

```ruby
 1  class Greeter
 2    def initialize
 3      @name = gets_name
 4      puts_hello
 5    end
 6  
 7    def puts_hello #salute
 8      puts "Hello #{@name}."
 9    end
10  
11    def gets_name
12      name = ARGV[0] || 'world'
13      return name.capitalize
14    end
15  end
16  
17  Greeter.new
```


## プログラム解説

class の中の関数はメソッドと呼ばれる物になる。本プログラムでは、

-   initialize()
-   puts\_hello()
-   gets\_name()

が相当する

Ruby では、class の外でメソッドを呼びだす為には、Greeter.new のように「class 名.メソッド名」のようにして扱う事ができる


# class の継承について

class には、親の class からメソッドなどをクラス変数などを継承する事ができる。サンプルプログラムを見ながら学習をしていく


## サンプルプログラム

```ruby
 1  # inherited class
 2  class Greeter < String
 3    def hello
 4      "Hello #{self}."
 5    end
 6  end
 7  
 8  # extend class
 9  class String
10    def hello
11      "Hello #{self}."
12    end
13  end
```


## プログラム解説

今回は String class が存在しているがこの class を Greeter に継承している。これによって、Greeter は String のメソッドを扱う事ができる


# 注意

プログラムを書く時に **初め** から class や継承などを意識してプログラムを書かなくていい


# emacs 小ネタ


## ダブルクォーテーション

授業中に文字列を作成しようとダブルクォーテーションを使う場面があったがダブルクォーテーションを初めから自分で閉じていたが、emacs には **色** で**文字列** を判別してくれる機能がある

普通はいきなりカッコやダブルクォーテーションを始めから閉じるのではなく**一つ一つ閉じていく** のが基本になる


# 参考文献

-   <https://en.wikipedia.org/wiki/Class_%28computer_programming%29>



------
 - **source** ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/class11.org
NetBSD-9.xで変更になった設定

今日から[NetBSD Advent Calendar 2020](https://qiita.com/advent-calendar/2020/netbsd)が始まりました。
微妙に参加者が少ないのが心配ですが、今年も気ままにマイペースでカレンダーを埋めて行こうかと思います。

## 今日のお話

今日はNetBSD-9.xで変更になった設定について気づいた範囲で紹介しようと思います。

NetBSDがリリースされる度に仮想マシンにインストールして生活環境として使う、ということを繰り返していますが、NetBSD-9.xでいくつか設定周りの変更が入っているようです。

## NetBSD-9.xでの変更点

 * DHCPクライアントの設定が `dhclient` から `dhcpcd` に変更された。
 * `sshd_config` で公開鍵認証のみに設定する場合、 `ChallengeResponseAuthentication no` も必要になった。
 * デフォルトのウインドウマネージャが `twm` から `ctwm` になった。

### DHCPクライアントの設定が `dhclient` から `dhcpcd` に変更された

(これはNetBSD-8.xからですが)DHCPクライアントの設定が `dhclient` から `dhcpcd` に変更されています。
とはいっても、単純に `s/dhclient/dhcpcd/` と置き換えれば良いだけなので、特に新しい設定方法を覚えなおす必要はありません。
具体的には以下のような設定を `/etc/rc.conf` に追記する形になります。

```sh
# NetBSD-7.xまでの設定手順。
#dhclient=YES
#dhclient_flags="wm0"

# NetBSD-8.x以降の設定手順。
dhcpcd=YES
dhcpcd_flags="wm0"
```

### `sshd_config` で公開鍵認証のみに設定する場合、 `ChallengeResponseAuthentication no` も必要になった。

NetBSD-8.xまでは公開鍵認証でのssh接続のみに絞る場合は、デフォルト値から以下の2項目を設定するだけでOKで、 `ChallengeResponseAuthentication yes` (デフォルト値)でも公開鍵認証のみが許可される挙動になっていました。

```
# パスワード認証を許可しない。
PasswordAuthentication no

# PAM(Pluggable Authentication Module)を使用しない。
UsePAM no
```

これに対し、NetBSD-9.xでは `ChallengeResponseAuthentication yes` のデフォルト値はそのままですが、この設定のままだとパスワード認証にフォールバックされる挙動に代わっています。
対応としては自明で、 `ChallengeResponseAuthentication no` に設定すればOKです。

```
# この設定でパスワード認証にフォールバックされなくなる。
ChallengeResponseAuthentication no
```

ちょっと気になったので、NetBSD-8.x/9.xのOpenSSHバージョンを確認してみると以下のようになっていました。
おそらくはOpenSSH-7.xからOpenSSH-8.xのメジャーバージョンアップで `ChallengeResponseAuthentication yes` の挙動が変更されているようです(これ以上は深く追えていない...)。

 * NetBSD-8.2
   * `OpenSSH_7.6 NetBSD_Secure_Shell-20171007, OpenSSL 1.0.2k  26 Jan 2017`
 * NetBSD-9.1
   * `OpenSSH_8.0 NetBSD_Secure_Shell-20190418-hpn13v14-lpk, OpenSSL 1.1.1g  21 Apr 2020`

### デフォルトのウインドウマネージャが `twm` から `ctwm` になった。

これは以下のブログ記事でも話題になっていのでご存知の方も多いでしょう。NetBSDでは長いあいだデフォルトのウインドウマネージャとして[twm](https://ja.wikipedia.org/wiki/Twm)が採用されていましたが、NetBSD-9.1から[ctwm](https://ja.wikipedia.org/wiki/CTWM)に切り替えられました。

 * [Default window manager switched to CTWM in NetBSD-current](https://blog.netbsd.org/tnf/entry/default_window_manager_switched_to)(2020/09/28)

Xを起動すると普通にCTWMが使用され、デフォルト設定のままでもかまわないのですが、右クリックでコンテキストメニューが表示されるのはイマイチな点です。VNCとかで接続している状態でVNCのウインドウにフォーカスを合わせるためにクリックしただけでメニュー表示、そして運悪く"Restart CTWM"を選択してしまうという事故(？)が起こりかねません。

この点については、CTWMの設定ファイルを修正することで対応しましょう。 `/etc/X11/ctwm/system.ctwmrc` を以下のように変更することで、左クリックによるメニュー表示を無効化できます。

```sh
$ cd /etc/X11/ctwm
$ diff -u system.ctwmrc.ORIG system.ctwmrc
--- system.ctwmrc.ORIG  2020-12-01 12:31:10.798860000 +0900
+++ system.ctwmrc       2020-12-01 12:31:37.726916000 +0900
@@ -282,7 +282,7 @@
 Button2 =      : icon                  : f.move
 Button3 =      : icon | iconmgr        : f.raiselower

-Button1 =      : root          : f.menu "NetBSD"
+#Button1 =     : root          : f.menu "NetBSD"
 Button2 =      : root          : f.menu "TwmAllWindows"
 Button3 =      : root          : f.menu "NetBSD"
```

## まとめ

NetBSD-9.xにおける設定周りで変化があった個所を気づいた範囲で紹介してみました。sshdまわりの挙動の差異には注意が必要そうですね。
久しぶりにNetBSDを使用してみようという人の助けになれば幸いです。
ルールを作ることで創造性を生み出す

[POLプロダクト部 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/pol) 1日目の記事です。

こんにちは、株式会社POLプロダクト部のミズノと申します。研究 x テック = LabTechという新しい領域にチャレンジしている会社に所属しています。
今年のアドベントカレンダーではエンジニア、デザイナ、プロダクトマネージャーが日々の取り組み、ノウハウ、ナレッジを投稿しますのでご期待ください！

1日目の記事ということで何を書こうかなと思ったのですが、先日社内で行ったフロントエンド設計MTGからの学びをシェアしたいと思います。

## 事の始まり
我々のフロントエンド開発においてはいくつかの課題を皆感じていました。
例えば、

- Reactを採用しているがRedux、Hooksをどのように共存させるか
- 複数のプロダクトで同じようなコンポーネント作ってる
- 新しく入ったメンバーのキャッチアップに時間がかかる

これ以外もたくさんあり、共通していたのは、
<b>何を作るのかより、どのように作るかというところに頭を悩ませてる</b>
自由がありすぎるとベストを探し始めてしまいます。これ自体は悪いことではないのですが終わりのがないので困りますよね。そこでフロントエンド開発における<b>社内ルール</b>を設けることにしました。

## ルール作り

具体的なルールは以下のようなものです。

- コンポーネントはAtomic Designで別リポジトリ管理する
- グローバルstateはReduxで管理するが、基本はhooksを使う。
- コンポーネントとデータの連携は必ずコンテナ経由で行う
- propsで値を渡すのはatomsのみに制限する
- それ以外はcontext経由で値を取得する。
- presentation、services、dataの３層構造でコードの置き場所を明確にする

ディレクトリ構造は以下をベースにしています。

```
app
 ┝ component
 │ ├ atoms
 │ ├ molecules
 │ ├ organisms
 │ ├ templates
 │ └ pages
 ┝ containers
 │ └ routing
 ┝ context
 ┝ redux
 │ ├ middleware
 │ └ modules
 ┝ services
 └ data
```
こんな感じで、皆でワイワイ話しながら、お互いの考えを話し合いました。自分が考えてもいないこともありとても良い学びの場となりました。これからも定期的に開催していく予定です。

## 設計とはルール作り

実は上のルール自体はそこまで重要ではないです。これを読んでいる皆さんの会社にそのまま当てはめてもうまくいかないこともあるでしょう。重要なことは

- ルールがあるとプロダクト作りやすく、集中できる。
- 制限されることでより良い設計を見つけることができた

という2点でした。RoRの設定より規約も同じですよね

身近なところでは、何かを考えるときに、まず叩き台を作ったりするとたくさんの意見が出ると思います。これも叩き台がある種のルールとして機能しているからだと思います。

僕は<b>設計の役割は、ルールを作ること</b>だと考えています。これはコードの設計、デザイナによるデザインも同じだと考えています。ルールがあることで窮屈になるのではなく、それがある事で考えやすく、作りやすく、創造性が発揮しやすいと建築家の隈研吾さんも仰っていました。

スタートアップにおけるエンジニアの役割は色々あるとおもいますが、POLではマーケットにフィットするプロダクトを素早く作ることを重視しています。ルールがあることで、クオリティ高く、素早くプロダクトが作れると考えています。すらすら書けてると気分も良いですよね。

## 最後に

この記事が皆さんの参考になり、より良い設計が発見されることを期待しています。その時はぜひシェアしていただけると嬉しいです。

POLではこんな感じで、より良いプロダクトを開発するために試行錯誤しています。
研究領域に興味があり面白そうだなと思っていただけたら、ぜひカジュアル面談してみませんか？　会社の良いところ悪いところ包み隠さずお伝えします１
エンジニアは積極採用中ですし、エンジニア以外のポジションもたくさんあります！

[エンジニア採用ページ](https://pol.co.jp/recruit/engineer)

明日はフロントエンドの鬼こと@ultrasevenstarさんが記事を書きます。ご期待ください！
Rails コードを書く場所

##目的
最近、業務でなんとなくメソッドを使用していたが
自作する機会も増えてきた
しかし、メソッドを記述する場所を迷ってしまうため
アウトプットして、記憶に定着させる

##しかるべきところにコードを書く
おなじみ、書籍 現場Rails 10-7 より抜粋
>Railsが標準的に用意しているコントローラー、モデル、ビュー、ヘルパー、
ルーティングといった代表的な場所について、(比較的)適切な場所を選ぶことが重要だと
いうことを指しています

##コントローラー
コントローラーの役割は、クライアント(ユーザー)から受け取ったリクエストを
適切にレスポンスを返すための窓口を担う

一般的に、
リクエストをもとにモデルのビジネスロジックを呼び出して
その結果をビューに引き渡す

ユーザーのニーズを反映していけばいくほど、入力される情報が
複雑になっていく

モデルから値をとりだしたり、事前処理を行う必要がでてくる

画面とロジックが入り混じり、複雑で肥大
いわゆる`fat controller`になりやすい

・ビジネスロジックを書いてはいけない

##モデル
・取得したオブジェクトに対して
何かを行っているコードが何行もあれば、モデルに記述するべき

・モデルを介してデータベースとのやり取りを行い、
データを取得したり新しいデータを格納する

・コントローラーからデータの追加や変更・削除の指示を受け実行

・モデルに寄せるのは、主に永続化に関わるものや、
単一モデルの操作で完結するビジネスロジックを優先的に寄せるイメージ

・基本は、ビジネスロジックを記述する

###ビジネスロジックとは
`データに対する処理などを行うプログラム処理`のこと

`テーブルとのやりとりに関するメソッドはモデルに置く`という意識が必要
コントローラーはあくまで、`モデルの機能を利用し処理を呼ぶ`
だけで、複雑な処理は組まない

##ビュー
こちらも、ビジネスロジックを含んではいけない

なぜなら、
・見せ方に対する変更が意図せず、
ビジネスロジック、またはプレゼンテーションロジックに影響を起こす可能性がある
・同じビジネスロジックが重複して存在するようになりやすい
ビジネスロジックを変更するときに、影響範囲が広く大変
・テストがビューを介してでしか、行えなくなる。
複数のビューで同じビジネスロジックがあったとしても、ビューの数だけテスト
しなくては、正しいことを保証ができないため

###プレゼンテーションロジックとは
入力のためのフォームのようにユーザーとコンピュータを繋ぐために
ビューに書かれたコードをプレゼンテーションロジックという

##ヘルパー
・ビューをよりシンプルに書くためのモジュール

・ビュー側で使うような見た目に関するものはヘルパーで実装する

・Viewでの共通する処理をメソッドとして定義し、簡単に使いまわせるようにした機能 

##参考記事、書籍
[現場Rails](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4-ebook/dp/B07JHQ9B5T/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1606794782&sr=8-1)
https://qiita.com/sumin/items/24689d0a5622f000a71f
https://qiita.com/kanekomasanori@github/items/daf93f95c77c629d070f
https://qiita.com/os1ma/items/25725edfe3c2af93d735
Laravelでschedule:runしたときのoutputがdockerで標準出力されない問題を解消

## はじめに（何が問題か）
以下のようなコマンドがあって、

```app/Console/Commands/Hello.php
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->output->writeLn('Hello !!');
        return 0;
    }
```

下記のように、スケジュール登録していたとして、

```app/Console/Kernel.php
    /**
     * Define the application's command schedule.
     *
     * @param Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('app:hello')->everyMinute();
    }
```

`artisan schedule:run`しても

```bash
$ docker-compose run --rm task-scheduler
Creating task-scheduler_run ... done
Running scheduled command: '/usr/local/bin/php' 'artisan' app:hello >> '/dev/null' 2>&1
```

`Hello !!`は、標準出力されないんですね。
これを解消したという記事になります。

## `appendOutputTo('/dev/stdout')`は効かない
`\Illuminate\Console\Scheduling\Event`には`appendOutputTo`というメソッドがあって、出力先を指定することができます。
指定しないと`/dev/null`になってしまいます。
とはいえ、結論として、`appendOutputTo('/dev/stdout')`は効きません。

```app/Console/Kernel.php
    /**
     * Define the application's command schedule.
     *
     * @param Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('app:hello')->appendOutputTo('/dev/stdout')->everyMinute();
    }
```

## どうやって解消したか
答えは、`stackoverflow`にありました。

https://stackoverflow.com/questions/46586916/how-can-i-redirect-output-to-stdout-with-laravel-scheduler-command/46767123

Dockerfileにて、

```Dockerfile
RUN ln -sf /proc/1/fd/1 /var/log/laravel-scheduler.log
```

とした上で、出力先を`/var/log/laravel-scheduler.log`とします。

```app/Console/Kernel.php
    /**
     * Define the application's command schedule.
     *
     * @param Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('app:hello')->appendOutputTo('/var/log/laravel-scheduler.log')->everyMinute();
    }
```

すると、`Hello !!`が標準出力されるようになります。
（Dockerコンテナのリビルドをお忘れなく）

```bash
$ docker-compose run --rm task-scheduler
Creating task-scheduler_run ... done
Running scheduled command: '/usr/local/bin/php' 'artisan' app:hello >> '/var/log/laravel-scheduler.log' 2>&1
Hello !!
```

## おわりに
`Laravel`に限った話ではないのかもしれませんが、とにかく何も出力されなくて困り果てていたので解決できて良かったです。
同じ状況で困っている方のお役に立てればと思います。

## 余談
世の中、アドベントカレンダーの季節ですが、普通に記事書いてしまいました :grinning:。。
まあ、今後も書きたいときに書いていきます。

ではでは。
Pythonで長い会議を見える化〜スペクトログラム描画の応用〜

先日の記事「[Pythonで音声ファイル（モノラル・ステレオ両対応）のスペクトログラム描画](https://qiita.com/toast-uz/items/3d446b2535f408a99878)」の応用として、長い会議を1枚の図で見える化してみました。

先日の記事をベースに、以下のような修正を加えました。

+ 2CHステレオ音声の平均をとって1CHにする
+ stft変換した結果をそのまま表示すると長い会議だと分かりにくくなるため、設定した時間間隔で区切る（半端な部分はゼロ埋めする）
+ 区切った要素をスペクトログラム描画し、縦並びにして表示する

2CHステレオの音声データは早々と潰していますが、最後の表示のところで、区切った分をCHとみなすことで、前回のコードを活かしています。

以下がコードです。

```Python
import numpy as np
import matplotlib.pyplot as plt
import soundfile as sf
from scipy import signal as sg

# 入力はwavファイルであること（mp3等は入力前にツールで変換する）
x, fs = sf.read('sample.wav', always_2d=True)
# 2CHの平均をとってモノラル化する
x = x.mean(axis=1)

# stft
nperseg = 256
noverlap = nperseg // 2
f, t, Zxx = sg.stft(x, fs=fs, nperseg=nperseg, noverlap=noverlap)
# 人間の声を分析するため7kHz以上の高音はカット
f = f[f < 7000]
Zxx = Zxx[:len(f)]
# interval単位に時間軸で区切った配列にする
interval = 300  # 5分
window = (interval * fs) // (nperseg - noverlap)
padding_size = window - Zxx.shape[1] % window
if padding_size != window:
    Zxx = np.append(Zxx, np.zeros((Zxx.shape[0], padding_size)), axis=1)
    t = np.linspace(0, Zxx.shape[1]/window*interval, Zxx.shape[1])
Zxx = np.reshape(Zxx.T, (-1, window, Zxx.shape[0])).transpose((0, 2, 1))
t = t[:window]

# スペクトログラムを描画するために相対デシベルを求める
dB = 20 * np.log10(np.abs(Zxx))
# スペクトログラムの描画
num_of_graph = dB.shape[0]
fig, ax = plt.subplots(num_of_graph)
if num_of_graph == 1:
    ax = (ax,)  # グラフ1つの時はaxがスカラーなので調整
for i in range(num_of_graph):
    ax[i].tick_params(labelleft=False)
    ax[i].set_ylabel(f'{interval*i//60}')  # 分で表示
    ax[i].pcolormesh(t, f, dB[i], shading='auto', cmap='jet')
    if i == 0:  # 最初のグラフだけ表題をつけて、全体の表題に見せる
        ax[i].set_title('Meeting spectrogram')
        ax[i].set_ylabel(f'{interval*i//60}(m)')
    if i == num_of_graph - 1:  # 最後のグラフだけx軸ラベルをつける
        ax[i].set_xlabel('Time(s)')
    else:
        ax[i].tick_params(labelbottom=False)
plt.show()
```

出力結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/9131b3e7-a422-ab3f-9450-6908cc1b2929.png)

会議全体の、会話している部分・静かな部分が、なんとなく分かるようになったと思います。ただし、短時間だけ静かな部分について、話者が切り替わっているのか、それとも同じ話者が間を置いているのか、といった区別は難しそうです。
英語版リーダブルコード(The Art of Readable Code)を読んで日本語訳で要点を殴り書きしてみた。

【最初に】:point_up:
英語版リーダブルコード(The Art of Readable Code)を読んで日本語訳で要点を殴り書きしてみた。

英語からの翻訳なのでやや口語的でない文章になりますが、
我慢して読んで頂けると幸いです。





【1】　 理解しやすいコード


コードは理解しやすくなければならない。
コードは他の人が最短期間で理解できるように書かなければならない。
コードは短くしたほうがいい。だけど「理解するまでにかかる時間」を短くするほうが大切



【2】　 名前に情報を詰め込む

•Choosing specific words
	明確な単語を選ぶこと。
	Get　→　FetchやDownload。
	
•Avoiding generic names (or knowing when to use them)
	「tmp」や「retval」の汎用的な名前を使わない。
	
tmp - その変数において一時的である事が最も重要な時のみに使用する事。

•Using concrete names instead of abstract names
	抽象的な名前ではなく、具体的な名前を使用。
	ServerCanStart()　→　CanListenOnPort()
	
•Attaching extra information to a name, by using a suffix or prefix
	接頭辞や接尾辞を追加の情報を名前に付ける。
	
•Deciding how long a name should be
	名前をどれ位長くするか決める事。
	
	
•Using name formatting to pack extra information
	大文字の使用、アンダースコアなどを使って意味のある方法で使う。
	「_」をクラスのメンバで使用して、ローカル変数と区別する。


短い名前は短い範囲ではOK。


(ex)
document　→　doc
string　 → str



【3】　 誤解しない名前

「誰かがこの名前で他の意味で誤解しないか？」を自分自身で精査せよ。

max_ or min_　を使う。

Naming Booleans
・is, has, can, or should can 　がベター。
・変数に否定の条項を入れない事。


【4】　 美学

•Use consistent layout, with patterns the reader can get used to.
•Make similar code look similar.
•Group related lines of code into blocks.

【5】　 コメントすべき事を知る

■書くべきでないもの

・コード自体から容易に連想出来る事。
・悪いコードを補足するコメント。それなら悪いコードを直そう。


■記録する必要がる考える


■読み手になって考えてみる。

・コードやコメントのどの部分が読む人に疑問になるか予想する。
・平均的な読者が予期しない驚くべき行動を文書化する。
・読み手がコード迷わないように、コードをブロック毎に要約する。


【6】　 Making Comments Precise and Compact

■コメントとコンパクトに

■“it” や “this” が複数のものを指す可能性がある代名詞を避ける

■実用的な関数のコードの正確な振る舞いをコメントせよ

■input/outputの例を用いて説明せよ

■自明の詳細よりもコードの高レベルでの意図を記載せよ

■多くの意味の言葉で簡潔にコメントせよ



【7】　 Making Control Flow Easy to Read

■ネストは浅くしよう。


【8】　 Breaking Down Giant Expressions


【9】　 Variables and Readability

・変数が多くなるほど、追跡が困難に

・変数のスコープが大きくなるほど、その追跡が困難に

・変数の値が変わるほど、現在値の追跡が困難に


【10】　 Extracting Unrelated Subproblems


【11】　 One Task at a Time

「一度にひとつのタスク」を行う

・動いているタスクをリストに上げる。
関数やクラスに分ける事も出来れば、1つの関数内での論理的な段落になる。



【12】　 Turning Thoughts into Code

おばあちゃんに説明出来なければ、完全に理解してるとは言えない。
(アルベルト・アインシュタイン)

・plain English(専門用語抜きの英語)で同僚に説明するように、 コードで説明せよ。

・その説明でキーワードやフレーズに注意を払おう。

・その説明に一致するようにコードを書こう。


【13】　 Writing Less Code

最も読みやすいコードはコードを全く書かない事である。

コードベースを出来るだけ小さくしておく事がベスト。

・複製コードは除いて、出来るだけ多くの汎用コードを作成する。

・使ってないコード、役立たずの機能を削除。


■ライブラリに慣れ親しもう

15分かけてライブラリの関数名、モジュール名を読んでみよう。
これはライブラリ全体を覚えるのではなくて、「これ見たことあるぞ！」
と次の機会に生かす事が出来るのである。


【14】　 Testing and Readability

■テストしにくいコードの特徴と、どういう問題を引き起こすか

| 特性  | テスト容易性の問題 | 設計の問題 |
|:-----------|------------:|:------------:|
| グローバル変数の使用| テスト毎にグローバル状態をリセットする必要がある。(そうしないと異なるテストでお互いにインターフェースしてしまう)| どの関数が影響するか理解しずらい。関数単体で考える事が出来ず、他に影響があれば全体を理解しなければならない。|
| 外部コンポーネント依存するコード| セットアップが難しく、テストが難しい。テストを避けるようになる。| 依存関係が失敗すると、システムが自体も失敗しやすくなる。変更による影響範囲を理解するのが難しい。クラスのリファクタが難しい。システムが失敗しやすくなり、リカバリの方法も難しい。|
| 非決定論的な振る舞いをするコード| テストは当てにならず、信頼出来ない。| プログラムは競合状態、非再現性のバグが発生しやすくなる。プログラムを推理しずらくなり、作成途中のバグは追うのも直すのも難しい。|





further reading
参考文献

Code Complete
第7回

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# if文

    if 式 then
      処理
    elsif 式 then
      処理
    else
      処理
    end

else ifではなくelsif.thenは省略可.


# case文

    case 対象オブジェクト
    when 値1 then
      値1と一致する時に行う処理
    when 値2 then
      値2と一致する時に行う処理
    else
      値1,値2以外の時に行う処理
    end

thenは省略可．

一致しているかの値は複数可．

    when 値1,値2 then
      処理
    when 値3,値4,値5 then
      処理
    end


# each文

    オブジェクト.each do |変数|
      処理1
      処理2
    end

具体的には以下

```ruby
range=5..10
range.each do |num|
  puts("num=",num)
end
```

for文使ったものが以下

    for num in 5..10 do
     puts("num=",num)
    end


# 例題

うるう年かどうか判断

```ruby
def leap?(year)
  if year%400==0
    p true
  elsif year%100==0
    p false
  elsif year%4==0
    p true
  else
    p false
  end
end

[2000,1900,2004,1999].each do |year|
  p year
  leap?(year)
end
```



------
 - **source** ~/grad_members_20f/members/Kenny0704/c7.org
[react-native]Modalの使い方

###目的
App.jsファイルのButtonを押した時、モーダル表示する。
コンポーネントは分ける。

###1 App.js
styleは任意

```
import React, { useState } from 'react';
import { StyleSheet, View, Button } from 'react-native';
import GoalInput from './components/GoalInput'; //パスと名前は任意

export default function App() {
  const [isAddMode, setIsAdd] = useState(false);
  return (
    <View>
      <Button title="Add New Goal" onPress={() => setIsAddMode(true)} />
      <GoalInput 
        visible={isAddMode}
      />
    </View>
  );
}
```

###2 GoalInput.js
styleは任意

要は全体を<Modal>でラップするだけでいい

animationTypeは下の三種類
slide ：下からのスライド
fade : フェードイン
none : アニメーションなし

```
import React, { useState } from 'react';
import { View, StyleSheet, Modal } from 'react-native';

const GoalInput = props => {
  return(
    <Modal visible={props.visible} animationType="slide">
      <View>
        Something
      </View>
    </Modal>
  );
};

```
【覚書】YouTube Data API で特定のチャンネルの動画情報を全取得

## 50 個まではこれでいける

```js
const API_KEY = "";

const getYouTube = async (api, query, cooldown = 3000) => {
  await new Promise((r) => setTimeout(r, cooldown));
  return await (
    await fetch(
      `https://www.googleapis.com/youtube/v3/${api}${Object.entries(
        query
      ).reduce((p, [k, v]) => `${p}&${k}=${v}`, `?key=${API_KEY}`)}`
    )
  ).json();
};

const getVideos = async (channelId, pageToken = "") => {
  const playlistId = (
    await getYouTube("channels", {
      part: "contentDetails",
      id: channelId,
    })
  ).items[0].contentDetails.relatedPlaylists.uploads;
  return await getYouTube("playlistItems", {
    part: "snippet",
    maxResults: 50,
    playlistId,
    pageToken,
  });
};

getVideos(
  // https://www.youtube.com/channel/{これ}
  "UCsLiV4WJfkTEHH0b9PmRklw"
).then(console.log);
```

チャンネル動画だけが入ったプレイリストを取得してきて、その動画を取得する。

サーバー負荷とかを考慮して、クールダウン時間を設定できるようにしてある。

動画数は一度のリクエストでは 50 個までなので、
本当に全部取りたいなら `nextPageToken` を使って適宜実装する必要がある。

## というわけで、全部とる

```js
const getAllVideos = async (channelId) => {
  let [all, token] = [[]];
  while (1) {
    const { items, nextPageToken } = await getVideos(channelId, token);
    all = [...all, ...items];
    if (!nextPageToken) break;
    token = nextPageToken;
  }
  return all;
};

getAllVideos(
  // https://www.youtube.com/channel/{これ}
  "UCkvvFbRyfvENnl_G8YHuriQ"
).then(console.log);
```

これで根こそぎ取ってくれる。


## 気づいたこと

どうも、チャンネル ID の prefix が`UC`になっている場合、
プレイリスト ID はチャンネル ID の prefix を`UU`にするだけでいいらしい。

[https://www.youtube.com/channel/**UCQbL0aAYEmzAbvgBn2PAy4A**](https://www.youtube.com/channel/UCQbL0aAYEmzAbvgBn2PAy4A)
　　　　　 ↓
U **C** QbL0aAYEmzAbvgBn2PAy4A
　　　　　 ↓
U **U** QbL0aAYEmzAbvgBn2PAy4A
　　　　　 ↓
[https://www.youtube.com/playlist?list=**UUQbL0aAYEmzAbvgBn2PAy4A**](https://www.youtube.com/playlist?list=UUQbL0aAYEmzAbvgBn2PAy4A)

だからこれでもいけちゃうっぽい

```js
const getVideos = async (channelId, pageToken = "") => {
  const playlistId = channelId.replace(/^UC/, "UU"); // <--
  return await getYouTube("playlistItems", {
    part: "snippet",
    maxResults: 50,
    playlistId,
    pageToken,
  });
};
```

こっちのほうがシンプルかもね。

## Node.js でデモコードを試す場合の注意点

Node.js では fetch が使えません。
なので、素直に axios や node-fetch を使うなり、deno を使うなりしてください。

面倒くさい人はこれを使えばとりあえず動くんじゃない（適当）

```js
const fetch = (url) =>
  new Promise((resolve, reject) => {
    const req = require("https").get(url, (res) => {
      let buffer = "";
      res.on("data", (chunk) => (buffer += chunk));
      res.on("end", () => resolve({ json: () => JSON.parse(buffer) }));
    });
    req.on("error", reject);
    req.end();
  });
```
Java containsメソッドと用途

#containsメソッドとは？
containsメソッドは特定の要素を含むかどうか判定するメソッドです。

###サンプルコード
標準入力で入力された要素が要素の何に含まれているかみます

入力例

```
Z
Kirishima
```

```Main.java
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();           //１行目の要素を取り出す
        String s = sc.next();           //２行目の要素をたりだす
        
        if (s.contains(a)) {            //変数sの要素の中にaの要素が含まれているかみます
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }
}
```
出力結果

```
NO
```
vscodeでssh接続できなくなってしまった時の対処法

#症状

```
a native exception occurred during launch (forkpty(3) failed.
```

というエラーが発生した。

# 対処法

まずは、vscodeで接続していたサーバーにターミナルからsshコマンドで接続する。
接続できたら、ホームディレクトリの、

```
.vscode/
.vscode-server/
```
を削除する。

上手く行かなかったら、

```
ps a
```
コマンドでvscode-serverのプロセスを見つけてkillする。
AWSで日本語版WindowsServerを作成する

インスタンス作成画面で、「コミュニティAMI」を選択し、検索ボックスに「Windows 20XX japanese」と入力します。
Amazonで用意されている日本語版AMIは17つもあるんですね。
![スクリーンショット 2020-12-01 12.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/f85d86e5-3418-b3b9-d41f-dcc199ab76a2.png)

その中には、「Full-Base」と「Full-SQL」がありまして・・・(慣れないと分かりづらい...)

Microsoft SQL Serverを使用しない場合は、「Full-Base」を選ぶと良いでしょう。
※毎回思いますが並び順は謎です...
ちなみに最後の日付はAMIの作成日時になります。新しいものを選んでおけば良いかなと。
![スクリーンショット 2020-12-01 12.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/e42d9542-82d6-0210-6bea-bd610a8fbff8.png)

「Full-SQL」を選ぶと、無料利用枠の「t2.micro」では利用できないので注意が必要です。
![スクリーンショット 2020-12-01 12.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/10a135e4-e5b2-e020-d54d-420cb3e5a6c5.png)

以上になります。
Qiitaのトレンド表示が改悪された

2020/11/30あたりにQiitaトップページのレイアウトが変更されました。

- トレンドにNewの表示が出なくなった。
- 訪問済リンクの色が変わらなくなった。

結果として、その記事を既に閲覧したかどうかが全く判別できない。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/3060b7af-3403-c0fd-f72d-d381b0f6717b.png)

なんで`:visited`入れてくれないの？？？

あとLGTMだけで1行取るのってわりと無駄な気がする。


# 解決策

Stylusとかに↓のCSSを突っ込めばいいです。

```css
.css-81mxb5 a:visited {
    color: #f00;
}
```

`css-81mxb5`とかは自動生成と思われるのでいつまでも使えるかは怪しいですが、idは`HomeArticleTrendFeed-react-component-433a141c-64f3-4ee8-bf53-e3dce809f355`とかなのでさらに役立ちそうにない。
誰かがもっとちゃんとしたセレクタを書いてくれるはず。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/fb0d709e-aa8a-21f8-dd63-b0d544ea6f5f.png)


※SS撮影のため履歴を全消しした
Rangeパーティションを削除する方法

パーティションしたテーブルを戻したい事はほとんどないような気がしますが、
たまたまやる機会があったので備忘録的な物として残しておきます。

まずは、普通に作ったパーティションを全て削除しようと思いました。
`ALTER TABLE table_name DROP PARTITION p201905, p201908,
     p201911, p202002, p202005, p202008, p202011, p202102, p202105, p202108, p202111;`

`Cannot remove all partitions, use DROP TABLE instead` というエラーが出て駄目でした。

解決方法
`ALTER TABLE table_name REMOVE PARTITIONING;`

件数に寄りますがかなり時間が掛かります。

```
create unique index unique_index_activities_id on activities (id) ;
ALTER TABLE table_name DROP PRIMARY KEY;
ALTER TABLE table_name ADD PRIMARY KEY (id) ;
DROP INDEX uniq_index_activities_id_and_created_at ON table_name
```

あとは、プライマリーキーを削除するために、一旦ユニークキーを作成して、プライマリーキーを削除して
IDで再度作り直して、Rangeパーティションのユニークインデックスキーを削除しました。
Java  数値 ⇔ 文字列変換 

#はじめに
学習用のメモになります。

#数値 ⇒ 文字列
```
String s = String.valueOf(i);
```

#文字列 ⇒ 数値
```
int i = Integer.parseInt(s);
```
Javaコーディング規約などでも推奨されています。

でもこんな方法でも変換はできます。

#数値 ⇒ 文字列
```
String s = "" + i; 
String s = new Integer(i).toString();
String s = Integer.toString(i);
```

#文字列 ⇒ 数値
```
int i = new Integer(s).intValue();
int i = Integer.valueOf(s).intValue();
```
PythonでStravaにloginしてGPXデータをゲットする

Stravaは誰でも使えるAPIを[公開](http://developers.strava.com/)してるけど、ドキュメントを読む限り自分のactivityのGPXデータをダウンロードする機能がないらしい。自分で作成したルートはできるみたい。API機能のstreamを利用することで、緯度経度、時間、心拍数などを個別に取得してGPXを再構築することは可能だが、めんどくさい。
代わりといっちゃなんだけど、Stravaにloginしている状態で自分のactivityのURLにexport_gpxをつけることでブラウザ上からGPXファイルをダウンロードすることができる。[こちらのリンク](https://support.strava.com/hc/ja/articles/216918437-%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8%E4%B8%80%E6%8B%AC%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88)にTCXの方法が乗っているが、GPXでもできた。
それをPythonでできたらいいじゃないという話。APIは使用しません。
# 方法
mechanizeというライブラリをpipでインストールし、以下のコードのemail, password, activity_idを好きなものに変えて、実行するとGPXファイルを保存する。

```python
import mechanize # pip等でインストールして下さい
br = mechanize.Browser()
response = br.open('https://strava.com/login')
br.select_form(nr=0)
br.form['email'] = 'youremail@email.com'
br.form['password'] = 'passwoooord'
response = br.submit()
activity_id = '12345678'
url = 'https://www.strava.com/activities/' + activity_id + '/export_gpx'
gpx = br.open(url)
gpx = gpx.read().decode('utf-8')
with open(activity_id + '.gpx', mode='w', encoding='utf-8') as f:
    f.write(gpx)
```

# 注意点
* APIには時間あたりのリクエスト制限があるけど、これはないので、まとめてやりたいときはある程度waitかけたほうがいいと思う。
* 当たり前だが自分のactivityのみ保存できる。有料会員なら他の人のデータも落とせるかもしれないが試してはいない。
* ほんとは標準ライブラリのrequestsでloginを試みたけどうまくいかなかった。やり方分かる人は教えてほしい。
* APIを使用してGPXファイルを取得する方法も分かる人は教えてほしい。


# 参考
https://stackoverrun.com/ja/q/8431259
http://developers.strava.com/docs/reference/
Linux, Mac (BSD系), Macにcoreutilsを入れた場合に対応するlsの色付け設定

# やりたいこと
LinuxでもMac(coreutils有り無し)でも同じ`.zshrc`を使って`ls`の色付け設定をする．

# `LS_COLORS`
- LinuxのGNU版`ls`コマンドの色設定は環境変数`LS_COLORS`で指定．
- MacのBSD版`ls`コマンドの色設定は環境変数`LSCOLORS`で指定できるが，設定方法が特殊で扱いづらい．
- LinuxとMacで同じ色設定にするには`coreutils`をインストールしてGNU版`ls`コマンドを使えるようにするのが楽．

Linuxでは`dircolors`というコマンドを実行すればいい感じに`LS_COLORS`を設定できる．Macで`coreutils`を使う場合は`gdircolors`というコマンド．

場合分けして`.zshrc`を書く．

``` zsh:.zshrc
# ---------- ファイル，ディレクトリの色設定
if type dircolors > /dev/null 2>&1; then
    eval "$(dircolors)"
elif type gdircolors > /dev/null 2>&1; then
    eval "$(gdircolors)"
fi
```


# `ls`のエイリアス
- LinuxのGNU版`ls`で色をつけるオプションは`ls --color=auto`．
- MacのBSD版`ls`で色をつけるオプションは`ls -G`．
- BSD版`ls`を使う場合はデフォルトの色設定をとりあえず使う．
- `coreutils`を入れた場合は`gls`を使う．


`.zshrc`に場合分けして記述．`darwin*`はMacOS．

``` zsh:.zshrc
case ${OSTYPE} in
  darwin*)
    alias ls='ls -G'
    ;;
  linux*)
    alias ls='ls --color=auto'
    ;;
esac
# ------ if coreutils
if type gls > /dev/null 2>&1; then
    alias ls='gls --color=auto'
fi
```



# 参考
Yonchu @yuyuchu3333: [LS_COLORSを設定しよう](https://qiita.com/yuyuchu3333/items/84fa4e051c3325098be3)
javaで日時文字列を複数フォーマットでパース

まず```DateTimeFormatter```を使用して複数フォーマットでパースするには、```ofPattern```にフォーマットを```[...][...]```のように指定する。

```java
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy-MM-dd HH:mm:ss][yyyy/MM/dd HH:mm:ss]");
    LocalDateTime p1 = LocalDateTime.parse("2020-10-27 01:01:10", formatter);
    LocalDateTime p2 = LocalDateTime.parse("2020/10/27 01:01:10", formatter);
```

また、Spring MVCでは```@DateTimeFormat```の```pattern```に同じようにして指定する。

```java
  @GetMapping("/sample-parse")
  public void timeformat(
      @RequestParam(name = "t1", required = false)
      @DateTimeFormat(pattern  = "[yyyy-MM-dd HH:mm:ss][yyyy/MM/dd HH:mm:ss]") LocalDateTime t1) {
    ...
```

参考: https://stackoverflow.com/questions/36188428/java-8-date-equivalent-to-jodas-datetimeformatterbuilder-with-multiple-parser-f
Cypress で apollo-client 等の fetch リクエストを wait する

# Cypress で Fetch リクエストを wait する

E2E テストスイートの [Cypress](https://www.cypress.io/) で、[Fetch API](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API) を利用したリクエストのレスポンスを `cy.wait()` するための設定を記載しています。 

## 何が問題？

Cypress でウェブページ上で行われる HTTP リクエストの完了まで、次のテスト処理の実行を待機する場合 `cy.wait()` を利用しますが、デフォルトでは XMLHttpRequest で行われるリクエストしか待機することができません (Cypress 5.x 系まで)。

しかしながら、最近は XMLHttpRequest ではなく、Fetch API を利用したリクエスト処理を実装しているウェブアプリケーションも多いかと思います。
GraphQL サーバーへのリクエストによく用いられる apollo-client も、query や mutation に Fetch を利用しており、そのままでは Cypress のテストケース内で GraphQL サーバーからのレスポンスを待って判定処理を行う、といったことができません。

以下では、Cypress の v4.9.0 - 5.x 系と、v6.0.0 以降それぞれの対応方法を説明します。

## Cypress v4.9.0 - v5.x 系

### 設定

```json:cypress.json
{
    "experimentalFetchPolyfill": true
}

```

`experimentalFetchPolyfill` を `cypress.json` で有効にすることで、Fetch を利用したリクエストをキャッチすることができるようになります。

### 利用方法 (v4.9.0 - v5.x)

```js:sample.spec.js
context('Fetch Test', () => {
    cy.server();
    // GraphQL
    cy.route('POST', '/graphql').as('graphql');
    // …
    it('wait fetch', () => {
        cy.visit('/');
        // …
        cy.get('[data-cy=new-button]').click();
        // Wait Fetch Response
        cy.wait('@graphql');
        // …
    });
    // …
});
```

## Cypress v6.x 系

Cypress 6.0.0 では上記の `experimentalFetchPolyfill` が廃止され、
`cy.server()` および `cy.route()` の代わりとなる `cy.intercept()` というメソッドが導入されました。

### 利用方法 (v6.x)

```js:sample.spec.js
context('Fetch Test', () => {
    // GraphQL
    cy.intercept('POST', '/graphql').as('graphql');
    // …
    it('wait fetch', () => {
        cy.visit('/');
        // …
        cy.get('[data-cy=new-button]').click();
        // Wait Fetch Response
        cy.wait('@graphql');
        // …
    });
    // …
});
```

`cy.intercept()` はブラウザのリクエスト処理に割り込める、高機能なメソッドとして用意されていますが、基本的には `cy.route()` の置き換えで動作できます。また、 `cy.server()` は不要となりました。

## おわり

上記のような設定・コードで無事、GraphQL の query や mutation のレスポンスが返ってきてから、以降のテストを進める、ということができるようになりました。
Vue.jsでv-forのリストがおかしくなった時に確認すること

## 結論

**v-forしている要素にkey属性をバインドしましょう。**
key属性として指定する値は重複しなければ何でもいいです。

```example-1.vue
<div v-for="item in items" :key="item.id">
  <!-- content -->
</div>
```

https://jp.vuejs.org/v2/guide/list.html#v-for-%E3%81%A7%E9%85%8D%E5%88%97%E3%81%AB%E8%A6%81%E7%B4%A0%E3%82%92%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B

## 想定事象

- li要素をv-forで展開している配列の要素の一部または全部を代入で置き換えたのに、画面上では反映されない。
- 検索結果のリスティングで、最終ページ→その他のページに画面を切り替えたとき、要素の数は変わっているのに中身が書き換わっていない。
- Vue DevToolsで確認すると、配列の値それ自体は期待通り更新されている。

## 原因と仕組み

Vueは v-for で描画される要素のリストについて、割り当てられたDOM要素の中身を書き換えるという戦略を取ります。

> Vue が v-for で描画された要素のリストを更新する際、標準では “その場でパッチを適用する” (in-place patch) 戦略が用いられます。データのアイテムの順序が変更された場合、アイテムの順序に合わせて DOM 要素を移動する代わりに、 Vue は各要素にその場でパッチを適用して、その特定のインデックスに何を描画するべきかを確実に反映します。これは Vue 1.x にあった機能の track-by="$index" に似たものです。

https://jp.vuejs.org/v2/guide/list.html#%E7%8A%B6%E6%85%8B%E3%81%AE%E7%B6%AD%E6%8C%81

しかし配列の要素を書き換えたり入れ替えたりされると、Vueは配列の要素の中身まで変化を追跡できません。

> この標準のモードは効率がいいです。しかしこれは、描画されたリストが子コンポーネントの状態や、一時的な DOM の状態に依存していないときにだけ適しています (例: フォームのインプットの値)。

こうした変化を追跡できるよう監視するためには、v-for している要素に key 属性を与えるのが一番手っ取り早いです。

> Vue が各ノードの識別情報を追跡できるヒントを与えるために、また、先ほど説明したような既存の要素の再利用と並び替えができるように、一意な key 属性を全てのアイテムに与える必要があります:

https://jp.vuejs.org/v2/guide/list.html#%E7%8A%B6%E6%85%8B%E3%81%AE%E7%B6%AD%E6%8C%81

ここのページでは「推奨される」と訳されていますが、スタイルガイドではより「使用してください」と強い表現で書かれています。

> 繰り返される DOM の内容が単純な場合や、性能向上のために標準の動作に意図的に頼る場合を除いて、可能なときはいつでも v-for に key 属性を与えることが推奨されます。

https://jp.vuejs.org/v2/guide/list.html#%E7%8A%B6%E6%85%8B%E3%81%AE%E7%B6%AD%E6%8C%81

> 常に v-for に対しては key を使用してください。

https://jp.vuejs.org/v2/style-guide/#%E3%82%AD%E3%83%BC%E4%BB%98%E3%81%8D-v-for-%E5%BF%85%E9%A0%88

ちなみにあなたは配列の更新を単純に代入によって行っていると思いますが、以下のメソッドを用いることでも変更を監視することができます。

- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()

> Vue は画面の更新もトリガするために、監視された配列の変更メソッドを抱合 (wrap) します。抱合されたメソッドは次のとおりです:

https://jp.vuejs.org/v2/guide/list.html#%E5%A4%89%E6%9B%B4%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89

## 余談

Reactなどで用いられているJSXでは map() メソッドなどで配列を展開しようとすると一意なkey属性を与えるようエラーが出るので、こうしたバグが未然に防がれているようです。