OmniAICreator/Qiita-1.07M huggingface dataset:
【WPF Prism】ExcelみたいにDataGridを抽出したかった

# はじめに

Microsoft Excel のように、テーブルの列をフィルタしたかった

https://github.com/t13801206/PrismExcel

##（完成イメージ）実際のエクセルのフィルタの様子

http://www4.synapse.ne.jp/yone/excel/excel_data_autofilter.html

## きっかけ

- Qiita の Q&A ? に同じ動機をもった方の質問が投稿されていた
- Prism とか ReactiveProperty とかつかえば、できそうな気がした

https://qiita.com/monamonamonapiii0425/questions/f315e5e13b903dc32e65

※ **結果として、けっこう時間かけた割には納得できたものはできなかった・・・**

## 諸条件

- .NET Core 3.1
- Windows 10

# 実際に動くもの

一見は百聞に如かず、なので、とりあえず動くものの様子（ＧＩＦ動画）

## テーブルのフィルタリング

![Animation3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/06ec7b4b-4177-81a4-a502-f5418c825d52.gif)

## フィルタリング候補自体のフィルタリング

![Animation4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/7c783f7b-9c5f-3f01-ad5e-171f4c26b602.gif)

# うまく解決できなかったところ

今後解消するかわからないけど、つまづいて今なお解決できていないところを書き残す

## `DataGrid`の列インデックスが取得できない

`DataGrid`には、列が３つ存在している
`DataGrid.Columns`プロパティは配列になっている
`DataGrid.Columns`の添え字`[0]`を開くと、`DisplayIndex`があり、たしかに`0`となっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/608b0f5d-b06f-1130-4c12-2c7a803dd02c.png)

ヘッダーの▼を押したときに、この`DisplayIndex`をダイアログに渡したいのだが、できなかった
`Datatemplate`から自分の列のインデックスがわからない

# 参考にさせていただいた記事など

## DataGrid のヘッダーをカスタマイズする関連

https://stackoverflow.com/questions/15175546/wpf-custom-datagrid-column-header

https://blog.okazuki.jp/entry/2014/08/25/164331

https://stackoverflow.com/questions/12179701/firing-a-relaycommand-from-a-button-inside-a-wpf-datagrid

## バインディング全般

https://www.sach.codes/c%23/wpf/mvvm/collectionview/filtering/2019/12/19/Filter-Data-Using-CollectionView.html

https://water2litter.net/rye/post/c_control_listbox_checkbox/

https://threeshark3.com/wpf-binding-source/

https://sourcechord.hatenablog.com/entry/2015/04/25/171907

# 有償コンポーネントなど

自分はつかったことないけど、会社名くらいは知っている

.NET の有償コンポーネントの一覧には、だいたいエクセルチックなコンポーネントも１つは含まれている

https://www.grapecity.com/componentone/wpf-ui-controls/flexgrid-wpf-data-grid

https://github.com/SyncfusionExamples/how-to-filter-the-wpf-datagrid-like-in-excel
【Ruby silver】三項演算子が入れ子になっていて難しかった話（三項演算子、論理演算子、和集合、積集合を使ったコード）

#以下のコード実行後の正しい表示結果を選べ。
```
a = [1, 2, 3, 5, 8]
b = [1, 3, 6, 7, 8]
c = false || true ? true && false ? a | b : a & b : b ;
p c
```
#解
```
=>[1, 3, 8]
```

#私の知っている三項演算子と様子が違う
頭の中にハテナが飛び散った。
つまづいた点として``「条件式A ? 条件式B ? 式C : 式D : 式E」``の構造になっていたこと。
通常のチェリー本等で見ていた三項演算子はこうだった。
``「条件式 A ? 式 B : 式 C」``
この式は2重構造になっていた。


###結論から言うとこの式はこうゆうことだった。

```ruby
if false || true #=>true
  if true && false #=>false
    a | b
  else
    a & b
  end
  b
end
```
①``if false || true`` #=>trueが返るので次のifに進む
②``if true && false`` #=>falseなので``else``に進んで答えは``a & b``=> ``[1, 3, 8]``
ifで考えて展開したらわかりやすいなと思いました。


##初め取り組んでいたこと

``c = (④false || true) ? (③true && false) ? (②a | b) : (①a & b) : b ;``
演算子の優先順位に則って番号を振る。①〜④の順に評価されるはず！
①[1, 3, 8]
②[1, 2, 3, 5, 8, 6, 7]
③false
④true
ここで式がどうなっているかわからず詰まってしまっていた。


###【補足】
問題文の中で；（セミコロン）で終了の合図を出しているけど、
特になくても問題ない。
Azure LogicAppsのHTTPコネクタでGraph APIを実行する

LogicAppsにでMicrosoft系のサービスを触りたい時に適当なコネクタがない場合、HTTPコネクタでGraph APIを実行したい場面がありました。
HTTPコネクタを使ってGraph APIを実行する際にトークンを取ってくる等、面倒くさい認証の前処理を無しで実行できたので紹介します。

### HTTPコネクタの認証オプション
HTTPコネクタの最下部に「Add new parameter」をクリックすると「認証」のオプションが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/f205973c-77bc-4288-9d17-3fc43d59ee05.png)

このオプションで「Active Directory OAuth」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/fb6ee503-9c5b-0c65-306a-4dec8439ce43.png)

Azure Active Directory（以下、AAD）で作成したアプリケーションの「テナントID」、「クライアントID」、資格情報はシークレットか証明書を選択できるのでお好きな方で、を設定して実行すればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/214d7d3d-f9a9-daa9-f475-a7f9d35b995e.png)

### 注意
AADのアプリケーションへの認可設定は「委任されたアクセス許可」ではなく、「アプリケーションの許可」である必要があります。
「委任されたアクセス許可」の場合は未検証ですが、HTTPアクションの一つ目で実行するユーザーのID/PASSをリクエストに含めたうえでトークンを取得し、取得したトークンを二つ目のHTTPアクション（実際にGraph APIを実行するアクション）のAuthorizationヘッダーに追加する必要がありそうです。
また、「アプリケーションの許可」をAADのアプリケーションに許可する場合は管理者の権限が必要です。

### 参考
https://www.starwindsoftware.com/blog/using-graph-api-with-azure-logic-apps
gitはじめの一歩。使い方コピペ。

## 1. どこかにディレクトリを作成
![スクリーンショット 2021-10-31 23.58.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/8d71ecc1-8189-4641-add8-a515e2ed1b53.png)


## 2. ディレクトリをVscodeにドラックアンドドロップ
![スクリーンショット 2021-10-31 23.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/ce5d7bf0-d249-3b8b-85fa-18c5a2875fa7.png)
 
## 3.ターミナルを開きgitを使い始める合図をする。
- (注意)ターミナルは同じディレクトリの階層にいることに注意してください。
```shell
ターミナルに入力
git init
```

![スクリーンショット 2021-11-01 0.02.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/f2f87266-2f8d-a611-92e4-3636a89ff7a0.png)


## 4.githubのサイトにて新しいリポジトリを作成(リポジトリ名はなんでも可)
- https://github.com/new

![スクリーンショット 2021-11-01 0.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/2b7c7448-9929-7dea-591c-a19f7fb60164.png)

## 5. urlをコピーする
sshだとトークンがなんとかでるのでhttpsの方でコピーしてください

![スクリーンショット 2021-11-01 0.07.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/5b22de00-feeb-8794-f71c-18c1b3096c56.png)

## 6. ローカルのターミナルに戻りさっきいたターミナルでいかコマンドを入れる

```shell

リモートの情報を登録
git remote add origin コピーしたURL

登録したものを確認する
git remote show origin main

```
![スクリーンショット 2021-11-01 0.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/58f06509-1dde-5294-fe60-34812d271f3b.png)


## 7. なんでもいいのでファイルを付け加えたり編集する。

![スクリーンショット 2021-11-01 0.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/1cb6e4a5-12c3-3b58-37e7-f5c07e369a1c.png)

## 8.以下コマンドを打ち込みリモートリポジトリを確認する

```

ステージング環境にあげる

.は全てのファイル
git add .

あげる内容を確定させる
git commit -m 'ここにコメントを書く'

pushする
git push origin main

```

![スクリーンショット 2021-11-01 0.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/ce725f5d-ed26-6f33-5163-69e1c879664d.png)

## 9.リモートリポジトリを確認

![スクリーンショット 2021-11-01 0.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/36a91553-56ea-895c-a4ed-4806ab36a349.png)
CodeIgniter4でシンプルなバッチ処理を作る

## はじめに
仕事場のCodeIgniter用のバッチが作れないか考えた。バッチ作ってよ！っていきなり言われると思い出せなかったりするよな

## 参考
https://qiita.com/YoshitakaOkada/items/7bdc4906725dab5adca6

## Let’s try it: Hello World!
https://codeigniter.com/user_guide/cli/cli.html?highlight=cli#let-s-try-it-hello-world

### いつものHomeコントローラに処理を作る

```php:app/Controllers/Home.php
<?php

namespace App\Controllers;

use App\Models\VocabularyBookModel;
use CodeIgniter\HTTP\ResponseInterface;

class Home extends BaseController
{
    /**
     * dev\ci4> php public/index.php home message
     * @param $to
     * @return void
     */
    public function message($to = 'World')
    {
        echo "Hello {$to}!" . PHP_EOL;
    }
}

```

### 実行
```powershell
dev\ci4> php public/index.php home message
  Hello World!
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/368799c3-0471-cf18-6fdf-3a83b09f78ab.png)
【422 Unprocessable Entity 】のバリデーションエラー、外部キー制約が原因でした。

コードを書いてテストを実行したら**「422 Unprocessable Entity」**というエラーが出ました。
ググってみたらバリデーションエラーみたいです。
そして、自分の場合は外部キー制約の書き方に問題がありました。

### 環境
- Ruby 2.6.3
- Ruby on Rails 6.0.1


#結果
:::note
modelの外部キー制約のチェックを任意にしてあげる。 
:::

#前提
利用者(User)が車を１台持っていたり**持っていなかったりする**状況でした。

```ruby
class User < ActiveRecord::Base
  has_one :car
end

class Car < ActiveRecord::Base
  belongs_to :user
  # ↑ここが違っていた。
end
```

この状況だとCarモデルに`user_id`がセットされていないとバリデーションエラーが発生します。
そのため、利用者が車を持っていない場合に422エラーが発生していました。

#解決
`optional: true`を追加して`user_id`の存在を任意にしてあげます。

```ruby
class Car < ActiveRecord::Base
  belongs_to :user, optional: true #<-追加
end
```
javascript演習　１１日目/３０日

覚えたこと


splice()とslice()の違い

・spliceメソッドを使うと元になった配列要素が変更されてしまう
　sliceメソッドは元の配列を変更しない
・slice()は文字列型のメソッド

```javascript
arr.slice([start[, end]])
splice(start, deleteCount)
```


配列の最後から一定数文字を取得して、
配列をつなげて、特定の文字が含まれてるかどうか調べる

```javascript
arr.splice(-secretCode.length -1  , pressed.length - secretCode.length);
if(arr.join('').includes(secretCode)){
}
```
Laravel 【入門】 withErrorsの使い方

# はじめに
withErrorsで処理失敗時のエラーメッセージを出力する例をいくつか挙げています。
withErrorsはエラーが発生したら、セッションにエラーメッセージをフラッシュデータとして保存し、エラー表示をさせる事ができます。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [例外処理のエラーハンドリング](#例外処理のエラーハンドリング)
2. [CRUD処理失敗時](#crud処理失敗時)
2. [バリデーション失敗時](#バリデーション失敗時)

<!-- 各チャプター -->
# 例外処理のエラーハンドリング

```
public function store(Request $request)
    {
        DB::beginTransaction();
        try {
            // 何らかのDB登録処理
            DB::commit();
        } catch (\Exception $e) {
            DB::rollback();
            return redirect()->back()->withErrors('エラーが発生しました');
        }
        return view('index');
    }
```

# CRUD処理失敗時

```
public function destroy(Post $post)
    {
        return $post->delete()
          ? redirect()->action([PostController::class, 'index'])->with('flash_message', '投稿の削除が成功しました。')
          : redirect()->action([PostController::class, 'index'])->withErrors('投稿の削除に失敗しました。');
    }
```

# バリデーション失敗時
```
public function post(Request $request)
    {
        $validator = $this->post_validator($request->all());
        if ($validator->fails()) {
　　　　　　　　　　　　　　　　　　　　　　　　　// バリデーション失敗時
            return redirect('index')
                ->withErrors($validator)
                ->withInput();
        } else {
            // バリデーション通過後の処理
        }
    }
```

```
protected function post_validator(array $data)
    {
        return Validator::make($data, [
            'content' => ['required']
        ]);
    }
```
Microsoft MPI(MS-MPI)の導入から実行まで

# はじめに
MS-MPIを使ってみたので、メモを残します。Visual Studioでなく、clangを使って、コマンドプロンプト（もしくはPowerShell)でコードをコンパイルする方法で利用します。
# 環境
- Windows 10 home x64
- clang++(7.0.1)
- emacs(26.2)

# MS_MPIのインストール

MS-MPIの[サイト](https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi)の[Downloads](https://www.microsoft.com/en-us/download/details.aspx?id=100593)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/0479e2aa-0643-8a5b-aea3-73725d33c174.png )


Downloadボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/ad20d9b7-e0b5-db15-a557-95cdd20bf4fc.png "ダウンロードファイル選択")

ダウンロードするファイル選択をする画面が出てきます。コードをコンパイルし、実行する必要があるので、MS-MPIとMS-MPI SDKどちらもダウンロードします。

それぞれのファイルをインストールします。インストールパスはデフォルトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/9ca5ee40-de9c-20d2-fcaa-597996480b12.png "MS-MPIインストールパス")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/f340de10-d81f-19b0-11a2-08e9a63777c6.png "MS-MPI SDKインストールパス")

# コンパイラ

clang++を利用してコマンドラインでコンパイルします。clang++を利用するため、[llvm](https://llvm.org/)をダウンロードし、インストールします。[llvm](https://llvm.org/)のほか[MSBuild tools](https://visualstudio.microsoft.com/ja/downloads/?q=build+tools)を入れておきます。clang++コマンドをコマンドプロンプトで実行するため、llvm/binのパスを通します。

```cmd
set PATH=%PATH%;"C:\Program Files\LLVM\bin"
```



# プログラムの作成

テストプログラムとして、ランク表示をするだけのプログラムを作成します。（参考：https://www.hpci-office.jp/materials/MPI-2017-03-23.pdf）

```C++:sample.cpp
#include <iostream>
#include <mpi.h>
using namespace std;
int main(int argc, char*argv[])
{
  int size, rank;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  cout << "Hello world I am "  << rank << " of " << size <<endl;
  MPI_Finalize();
  return 0;
}
```
# プログラムのコンパイル
include pathとlibrary pathを指定してコンパイルします。

```cmd
clang++ sample.cpp -I"C:\Program Files (x86)\Microsoft SDKs\MPI\Include" -L"C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" -lmsmpi
```
# 実行

```cmd
mpiexec -n 7 a.exe
```

で実行します。MS-MPIをインストールすると環境変数PATHに"C:\Program Files\Microsoft MPI\Bin\"が自動的に追加されますが、もし、`mpiexec`がないといわれたら下のようにフルパスで実行するか、環境変数PATHに"C:\Program Files\Microsoft MPI\Bin\"を追記します。

```cmd
"C:\Program Files\Microsoft MPI\Bin\mpiexec.exe" -n 7 a.exe
```
![mpi_run_only.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/2faf8fd0-7256-97ac-069c-2481419b8d47.png "実行画面")
自作のシェルスクリプトをコマンドとして実行できるようにする方法

今回は作成したシェルスクリプトをパスを指定しなくても起動できるようにする方法をいくつか掲載します。
作成したシェルスクリプトを実行する場合、実行時に`bash <スクリプト名>.sh`というふうに`bash`を指定するか、`<スクリプトへのパス/<スクリプト名>.sh`というふうにスクリプトへのパスを絶対パスか相対パスで指定する必要がありますが、ひと手間加えれば普通のコマンドのようにスクリプト名単体で呼び出しすることができるようになります。

#/usr/local/binへシンボリックリンクを追加する方法
簡単な方法としては、`/usr/local/bin`ディレクトリ内へシンボリックリンクを追加する方法です。
具体的な手順としては以下の通りです。

```
1.作成したスクリプトに実行権限を付与する
chmod 770 /home/USER/shell.sh #権限770は一例として
2./usr/local/binへシンボリックリンクを作成する
ln -s /home/USER/shell.sh /usr/local/bin/
```

これだけです。
あとは作成したスクリプトファイル名でシェルを呼び出せるか確認します。

参考サイト様：https://tsujitaku50.hatenablog.com/entry/2017/12/30/120046

#環境変数PATHにスクリプトへのパスを通す方法
こちらは、linuxがアクセスする各コマンドへのパスが格納されている環境変数`PATH`へ、対象スクリプトへのパスを追加する方法です。
こちらは1行で完結するので、上記よりもさらに簡単ですが、スクリプトを格納するパスの中が全て参照されるので、場所によってはセキュリティリスクが上がってしまうかもしれません。
コマンドは以下の通りです。

```
export PATH=$PATH:<スクリプトが格納されているパス>
#確認方法
echo $PATH #一番後ろに追加したパスが存在していればOK
```

たった１行で済むので簡単ですが、最大の問題としては再起動後に設定が消えてしまう事です。
これを防ぐには１つめに紹介した方法を使うか、次に紹介する方法を追加で実施する事です。

#~/.bash_profileにパスを追加する
上記で紹介したパスを永続化させる方法です。
viで`~/.bash_profile`を開き、上記`export PATH=$PATH:<スクリプトが格納されているパス>`を記載して保存します。
すでに`export PATH`が存在していれば、`:`区切りで後ろにパスを追記します。
そのままだと再起動後、または次のログイン時に適用されますが、~/.bash_profileファイルの編集後に以下のコマンドを実行すればすぐに適用されます。

```
source ~/.bash_profile
```


#スクリプト起動時のカレントディレクトリについて
余談ですが、パスを通した後にシェルスクリプトを実行した際に、そのスクリプトが配置されたディレクトリ以外で起動した場合、スクリプト実行中のカレントディレクトリはスクリプトファイルが配置された場所ではなく実行時のカレントディレクトリとなります。
どういう事かと言いますと、まず以下のようなスクリプトを`/home/USER`内へ配置したとします。

```
#!/bin/sh

pwd

exit 0
```

上記のスクリプトに実行権限とパスを通し、`/home/USER/dir`ディレクトリ内で実行したとします。
すると、実行結果は`/home/USER/dir`が返ってきます。
シェルスクリプトの仕様を知っている方であれば当然と思われるかもしれませんが、忘れてしまうと厄介な事になりそうなので、メモとして残しておきたいと思います。

以上となります。

今回で毎週投稿を初めてからおよそ1年となりますが、一旦毎週投稿としてはひと区切りとさせていただきます。
次回からは投稿したい内容が決まれば不定期に投稿していこうと思っています。
【Django】Exception Value: type object '' has no attribute '_meta'のエラー処理

#はじめに
Djangoプロジェクト開発の際にタイトルにあるエラーに遭遇しました．本日はこのエラーメッセージの対処法について自分なりに勉強した内容を記事にしております．

※「とりあえずエラーが解消できれば良い！」という方は，この記事の途中は読み飛ばして「[エラー処理方法](https://qiita.com/masaoguchi/items/6e989b1b1afb972583df#%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%A6%E7%90%86%E6%96%B9%E6%B3%95)」だけ読んで頂ければ解決できると思います．

#エラーの原因は？
このエラー文は**「モデルクラスに_meta属性があるはずなのに，どこにもない！」**と怒ってきています．
Djangoプロジェクト内で，モデルを参照することを前提として動いている機能を使う際に，そのモデルの参照が適切にできていないと，このように怒られるようです．

##_meta属性とは
_meta属性はDjango ORM(Object-relational mapping: オブジェクト関係マッピング)を中核を担うAPIです．Djangoプロジェクト内のモデル定義部分以外のシステムがモデルを参照する際に，参照したモデルのメタ情報も理解できるようになります．_meta属性のオプションは様々ありますが，今回の主題とは逸れるので，興味のある方は[ドキュメント](https://docs.djangoproject.com/ja/2.0/ref/models/options/)で詳細をご覧ください．


#エラー処理方法
Djangoプロジェクト内で下記の`model = Hogehoge`のようにモデル参照を行った際のhogehogeクラスが`models.Model`を継承していないことがこのパターンの原因であると考えられます．

```python:views.py
from django.views.generic import ListView
from .models import Hogehoge

class Example(ListView):
    template_name = 'example.html'
    model = Hogehoge # Hogehogeクラスをモデルとして参照する
```
上の例のようにモデルを参照する場合，Hogehogeクラスは当然モデルクラスである必要があります．

```python:models.py（誤）
# これは間違っている例です
class Hogehoge(): # model.Modelの継承を忘れてる
    field_a = ...
```

```python:models.py（正）
from django.db import models

class Hogehoge(models.Model): # model.Modelの継承をしっかりしてやる
    field_a = ...
```
※views.pyはあくまで例であり，formsなど他のシステムでも同じように`model = Hogehoge`と参照する部分では同じようにエラーが出ると思います．

このパターンは，私がやらかした凡ミスを基にしていますが，これとは別に[継承クラスの名前を間違えてしまった](https://www.generacodice.com/en/articolo/4768283/django-model-object-8220-has-no-attribute-meta-8221-in-class-based-view)方や[モデルクラスの定義はできていたが，そのクラスを通常のクラスとして再定義してしまった](https://stackoverflow.com/questions/35386669/attributeerror-type-object-team-has-no-attribute-meta)方もいました．


#最後に
今までは時間のなさを理由にして，発生したエラーに対して深く調べることはあまりありませんでした．しかし，その場で解決するだけではなくできるだけ調べるクセをつけるために今回の記事を書きました．
至らない部分が多いとは思いますが，「ここ違うよ！」と感じた方がいらっしゃれば是非ご指摘頂けますと幸いです．

※ご意見や疑問点などお待ちしております！

#参照
[Django: model object “has no attribute '_meta'” in class based view](https://www.generacodice.com/en/articolo/4768283/django-model-object-8220-has-no-attribute-meta-8221-in-class-based-view)
[AttributeError: type object 'Team' has no attribute '_meta'](https://stackoverflow.com/questions/35386669/attributeerror-type-object-team-has-no-attribute-meta)
[Model _meta API | Django documentation](https://docs.djangoproject.com/en/3.2/ref/models/meta/)
[Django データベース操作 についてのまとめ](https://qiita.com/okoppe8/items/66a8747cf179a538355b)
[オブジェクト関係マッピング - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%A2%E4%BF%82%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0)
[Model Meta Options | Django ドキュメント](https://docs.djangoproject.com/ja/2.0/ref/models/options/)
Contract-Driven Development / OpenAPI で加速する契約駆動開発

## はじめに
`OpenAPI`で仕様書を書いておくと、エコシステムによって色々開発を加速できるよということを記事にします。
具体的なコードなどは、[imunew/openapi-ecosystem](https://github.com/imunew/openapi-ecosystem)に置いときますので、参照ください。

## 定義ファイルの分割・ビルド
[Swagger-CLI](https://apitools.dev/swagger-cli/)の`bundle`コマンドを使うと複数の定義ファイルから一つの`OpenAPI`仕様書を作成することができます。
具体的には、[Swagger-CLI](https://apitools.dev/swagger-cli/)を利用します。
詳しいことは、以下の記事を参照ください。

- [OpenAPI ファイルを 分割 / 結合 する 方法](https://garafu.blogspot.com/2020/06/multi-file-openapi.html)

## `Swagger-UI`で仕様書をブラウザに表示する
`Swagger-UI`で仕様書をブラウザに表示することができます。
具体的には、[Swagger-UI](https://swagger.io/tools/swagger-ui/)を利用します。
詳しいことは、以下の記事を参照ください。

- [DockerでSwagger UIを起動してAPI仕様書をブラウザに表示する手順](https://qiita.com/aucfan-engineer/items/5532fcf69b4f4dcd1c41)
- [DockerでSwagger環境簡単構築！](https://qiita.com/A-Kira/items/3d17396c7cc98873e29d)

## APIクライアントの自動生成
`OpenAPI`仕様書にしたがって、APIクライアントを自動生成することができます。
具体的には、[OpenAPI Generator](https://openapi-generator.tech/)を利用します。
詳しいことは、以下の記事を参照ください。

- [OpenAPI Generator + TypeScript で始める自動生成の型に守られた豊かなクライアント生活](https://gift-tech.co.jp/articles/openapi-generator-typescript/)
- [openapi-generator-cli による TypeScript 型定義](https://zenn.dev/takepepe/articles/openapi-generator-cli-ts)

## APIのモックサーバーを起動
`OpenAPI`仕様書にしたがって、APIクライアントを自動生成することができます。
具体的には、[Prism](https://stoplight.io/open-source/prism/)を利用します。
詳しいことは、以下の記事を参照ください。

- [OpenAPI×Stoplight Prismでモックサーバーをたてる](https://gift-tech.co.jp/articles/mock-server-openapi-stoplight-prism/)
- [OpenAPIからモックサーバを建てられるPrismを実際のプロジェクトに導入してみた](https://future-architect.github.io/articles/20210410/)

## おわりに
業務委託で色々な現場を渡り歩いていますが、`OpenAPI`で仕様書を書いてあるプロジェクトは結構あるという実感があります。
が、今回紹介したようなツールを使っている現場は少ないように思います。
`OpenAPI`で仕様書を書いているだけでは、容易に実装と乖離してしまいますので、積極的に開発フローに組み込んでいくことが必要だと思います。
ぜひ、色々な現場で、[契約駆動開発](https://jamzz.hatenablog.com/entry/20100414/1271211134)を加速していってください。
ではでは。
Pythonで分数のリストを誤差なしでソートする

# はじめに
　AtCoder Beginner Contest 225 (ABC 225) の [E 問題][1] で、表題のことができずに詰んだので、勉強した結果をまとめます。

# 普通にソートするときの問題点
　分数のリストをソートしたいときは、普通は以下のように分数を少数に直し、小数のリストでソートしますよね。

```python
l = [5 / 7, 3 / 8, 1 / 2]
# l = [0.7142857142857143, 0.375, 0.5]

l = sorted(l)
# l = [0.375, 0.5, 0.7142857142857143]
```

　しかし、分母・分子の値が大きくなってくると誤差が出ることがあります。それが原因で、正しく順序がソートされないことがあるのです。誤差が出るパターンを1つ示します。

```python
>>> (10 ** 9 + 1) / 10 ** 9
1.000000001

>>> 10 ** 9 / (10 ** 9 - 1)
1.000000001
```

$(10^9 + 1) / 10^9$ と $10^9 / (10^9 - 1)$ は異なるにもかかわらず、小数で表すと等しくなってしまいます。
　これを避けるためには小数を登場させなければいいです。つまり、 $x_a / y_a$ という分数が $x_b / y_b$ という分数より小さいかどうかを調べるときは、$x_a / y_a < x_b / y_b$ の真偽を確かめるのではなく、 $x_a \times y_b < x_b \times y_a$ の真偽を確かめればよいです。

```python
>>> (10 ** 9 + 1) / 10 ** 9 == 10 ** 9 / (10 ** 9 - 1)
True
# 本当は等しくない

>>> (10 ** 9 + 1) * (10 ** 9 - 1) < 10 ** 9 * 10 ** 9
True
# 大小が正しく判定される
```

# 誤差なしでソートする方法
　組み込みの `sorted()` 関数の `key` 引数に `functools.cmp_to_key(cmp)` を渡してやることで、自前の `cmp()` 関数で定義した比較関数に従って、ソートすることができます。
　`cmp_to_key()` については [こちら][2] を参考にしました。

```python
from functools import cmp_to_key

def cmp(a, b):  # a = [x_a, y_a], b = [x_b / y_b]
    # 比較対象の分数 a と b が等しければ 0 を返す
    if a[0] * b[1] == b[0] * a[1]:
        return 0
    # a, bという順で並んでほしい条件のときは-1を返し、それ以外では1を返す
    return -1 if a[0] * b[1] < b[0] * a[1] else 1

l = [[5, 7], [3, 8], [1, 2]]  # リストの各要素は [分子, 分母] とする
l = sorted(l, key=cmp_to_key(cmp))
# l = [[3, 8], [1, 2], [5, 7]]
```

　最後までご覧いただきありがとうございます。

[1]:https://atcoder.jp/contests/abc225/tasks/abc225_e
[2]:https://qiita.com/norioc/items/cb533d009aa63453df40
python djangoフレームワークで最初にやること


## | 1.プロジェクトの作成 

``` bat
django-admin startproject {project_name}

```

## | 2.アプリケーションの作成

``` bat
python manage.py startapp {app_name}
```

## | 3. setttings.pyを編集

### | 3.1 作成したアプリケーションを追加

INSTALLED_APPS = []に次の値を入れる  
app_nameはアプリケーションの名前

``` python
'app_name.apps.App_nameConfig'
```

最初のアプリ名はふつう、二個目のアプリ名は先頭の文字を大文字に

### | 3.2. 日本語にする

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

***

djangoを独学しています。
備忘録のように書いています。
AWS Certified Solutions Architect - Professional を取得した

# 前回のお話
https://qiita.com/morio1101/items/078351c7d013e8ecdaa6

# はじめに

本記事は、将来再認定を受けるときの備忘録でもあります
本記事を見る時点で大体AWS認定試験のことや、Solutions Architect - Professional のことは大体理解されている前提で記事をまとめたいと思います

# 試験を受ける前の私のスペック

* AWS を使った業務経験は最低限はある
    * EC2 関連がメインであり、その他機能についてはほぼ知らないに等しい状態
* AWS認定試験は以下を取得
    * アソシエイト資格3種
    * スペシャリティ 試験3種
    * データアナリティクス
    * セキュリティ
    * ネットワーク
    * データベース
 
# 学習教材

* AWS 認定ソリューションアーキテクト - プロフェッショナル 試験特性から導き出した演習問題と詳細解説
* AWS WEB 問題集で学習しよう

※ 今回、模擬試験はやってません

# 学習期間

10/1 - 10/29
（前回取得してからしばらく資格取得に満足したのでお休みしてました）

# 学習方法

## 書籍学習(10/1-10/5)

「AWS 認定ソリューションアーキテクト - プロフェッショナル 試験特性から導き出した演習問題と詳細解説」を一通り流し読みしてました

模擬試験は紙ベースだと結構手間に感じて最終的には手付かず:sweat:

## AWS WEB 問題集で学習しよう(10/5 - 10/29)

合格記を見ていると #30-58 を何度も解けば合格圏内に入るということだったので3週ほど実施した

最終的には8～9割はなぜダメなのか、なぜこの選択肢なのかを考えた上で解けるぐらいになっていた（たまに抜けて間違えることもあったので詰めは甘い）

# 試験当日

電車で試験会場に移動中 #30 - のタイムトライアルをしていた

# 試験結果

過去受験した人の記事から3時間の時間が足りなくなるという話を聞いていたのでビクビクしていたが、1周が終わったタイミングで残り60分、見直し2周で残り時間15分を残す形で終了した

全75問に対しての感覚値

* 2択まで絞り込めた＋全く分からない問題：36問
* 自身がそれなりにある問題：39問

2択絞り込みについても、そこそこ自信があるものが半分ぐらいあり、全く分からなかった問題は8問ぐらいあった

75問の75%合格ラインとした場合、18問以下の誤答まで許される計算になるので勝率は半分よりは高いと思っていた


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/afb89b44-460d-631d-f262-25f912548fcc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/edf90503-e24f-dbd0-7121-5c4a40277acd.png)

結果の点数から見ると、試験を受けた時に感じた感覚通りの点数でした
珍しいのは800～900点を超えていないけど、コンピテンシーをすべて満たしていたこと

## 試験を受けて思ったこと

スペシャリティ関連の試験を受けていたこともあり試験の進め方に若干の慣れがあった
アソシエイトを受けた後、プロフェッショナルを受けると問題の長さに面を食らうと思う
範囲的に狭く深いスペシャリティの問題を解いて試験感覚を得るのは良い手段かもしれない

試験パターンに慣れたとして SAP の難しいと感じさせる要因の一つは試験範囲の広さ、浅く広い長文の問題が多いので、難しく感じやすく、試験が進むにつれて気持ちがダレやすいと感じた

# 最後に

AWS の認定試験残すところ DOP と MLS の二つとなった
機械学習は全くの未知の分野なので躊躇している部分がある
となると DOP を攻めるのが無難なのかな？
【Windows】フォルダ内の全ファイル数、特定の拡張子のファイル数を調べる方法

全ファイル、特定の拡張子のファイルを数える機会があり、どんな方法があるのか気になったので調べてみました。
他にも方法あると思いますが、とりあえず簡単に調べられる方法として。。

## エクスプローラを使用して数える
### フォルダのプロパティから数える
1. 対象のフォルダを右クリックで開く
1. プロパティを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/0295a22c-229a-b076-591d-91e98025495e.png" width="1000">

### 全選択して数える
1. 数えたいファイルがあるフォルダに移動
1. 「Ctrl + A」で全選択
1. エクスプローラ左下を確認
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/59265a58-69f4-70ec-f9a0-86c1b365284c.png" width="1000">


### 検索ウィンドウを使用して数える
1. 対象のフォルダの検索ウィンドウに「*」を入力
1. 左下の項目数を確認
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/0d450123-4ad5-e3e6-9980-446accb7e3f1.png" width="1000">
特定の拡張子を検索する場合は「*.txt」のように入力して、左下の項目数を確認。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/8326c5e4-8939-1561-0de5-0d8f944ef7c6.png" width="1000">


## コマンドプロンプトを使用して数える
1. コマンドプロンプトを起動して対象のフォルダに移動
1. 下記コマンドを実行

```
dir /A-D /S /B | find /c /v ""
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/8677cdfb-8af8-b2d4-188a-ed7c566297b7.png" width="1000">

特定の拡張子を検索する場合は下記コマンドを実行（下記はtxtファイルを検索する場合）。

```
dir /A-D /S /B *.txt | find /c /v ""
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/e95cb507-3a92-7800-d0e1-4b05f5a87be1.png" width="1000">

## 参考記事
- [Windows 10でフォルダ内に含まれる全てのファイル数をカウントする3つの方法](https://softantenna.com/wp/tips/windows-10-file-count/)
- [ファイル数をカウントする](https://commandprompt.noyokan.com/command/count.html)
Ubuntuでマイナポータルを使う方法

#Ubuntu端末でもマイナポータルを使いたい！
メインPCのUbuntuからIC Card Readerを使ってマイナポータルにログインするまで時間がかかったので備忘録です。

#環境
* OS:Ubuntu 21.10
* PC:lenovo ThinkPad X250
* IC Card Reader:I-O DATA USB-NFC3

#成功パターン
VirtualBoxでWindows10を動かして、IC Card Readerのドライバはゲスト側であてることに落ち着きました。VirtualBoxのバージョンは6.1.26_Ubuntu r145957で動作確認しています。

#VirtualBoxのインストール
VirtualBoxはメインパッケージだとUSB1.1しか対応していません。I-O DATA USB-NFC3はUSB2.0指定なので拡張パッケージのインストールが必要でした。

```
#メインパッケージインストール
$ sudo apt install virtualbox
#拡張パッケージインストール
$ sudo apt install virtualbox-ext-pack
```

#ユーザーのグループ追加
VertualBoxをインストールすると作成されるvboxusersにユーザーを追加しないと、VertualBoxからホストのUSBデバイスにアクセスできませんでした。

```
#グループに追加 USERNAMEに作業で使うユーザー名を入れる
$ sudo gpasswd -a USERNAME vboxusers
```

#Windows10のインストール
[Windows 10 のディスク イメージ (ISO ファイル) のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10ISO)からISOをダウンロードして仮想マシンの光学ドライブにアタッチ。インストール手順は物理マシンの場合と変わりませんが、Windows10ライセンスは個別に購入して当てないとライセンス違反になるので忘れずに。

#IC Card Readerのアタッチ
インストールが終わったら仮想マシンを一度落として、USBのパラメーターをUSB2.0(OHCI+EHCI)コントローラーに変更。ローカルで認識しているCiecle CIR215 PICC[0100]をデバイスフィルターに追加します。

|![Screenshot from 2021-10-31 22-39-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857499/c0acd077-9f45-d02a-24cf-0364cd8e3c4b.png)
|::|

#ドライバインストール
[USB-NFC3 サポートソフト](https://www.iodata.jp/lib/software/u/2229.htm)からWindows10用のドライバをダウンロードしてインストール。

#マイナポータル拡張機能のインストール
[マイナポータル](https://myna.go.jp/)のガイダンスに従いEdgeにChromeのマイナポータル拡張機能を追加。

#ログイン
IC Card Readerにマイナンバーカードを乗せてPINを入力するとマイナポータルのログインに成功します。保険証利用登録も無事に成功しました。

|![Screenshot from 2021-10-31 21-07-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857499/6b0fed25-540b-2b6e-8a52-d08f06bea036.png)
|::|

#失敗パターン1 Ubuntuからのアクセス
[動作環境について](https://img.myna.go.jp/html/dousakankyou.html)にある通り、LinuxどころかMacもサポートしてません。Ubuntuローカルからマイナポータルトップにアクセスすると、サポート対象外の表示になります。

|![Screenshot from 2021-10-31 22-41-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857499/87d445a3-36ee-7cf1-9674-2f11b2840feb.png)
|::|

#失敗パターン2 VMware Workstation Playerの利用
仮想マシンのUSB設定をUSB2.0にしてもIC Card Readerを認識してくれませんでした。

|![Screenshot from 2021-11-03 12-51-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857499/99dfdc0a-bf5e-3d68-8f4d-062b4ea91e6b.png)
|::|

細かい仕様は確認していませんが、ローカルでドライバがあたっていないデバイスはゲストにリダイレクトできなさそう。I-O DATA USB-NFC3のUbuntu用ドライバを探しましたが見つからなかったので、ゲスト側だけドライバを当てれば動作する仮想化ツールに乗り換えました。

#終わりに
マイナポータルの動作環境が限られているのは残念ですが、国の予算とセキュリティの問題を考えると、メジャーな環境に絞るという判断は妥当かもしれません。仮想マシン方式で動作はしましたが、セキュリティに関しては各自の判断でよろしくお願いします。

#参考サイト
* [VirtualBox – 仮想マシンにUSBメモリを認識・マウント](https://pc-karuma.net/virtualbox-mount-usb-flash-drive/)
* [UbuntuでVirtualBoxを使うときに必ずしておかなくてはならないこと](https://studio3104.hatenablog.com/entry/20121126/1353893999)
Jupyter labでKernelがないといわれた。

Anacondaを起動してJupyterlabを起動したらNo　Kernelとなったのでその原因とその修正方法をここに残します。
##経緯
AnacondaのPromptでJupyterlabを起動するとブラウザが立ち上がり表示されるまでは動くがNo kernelとなってプログラムが動かせない状態になった。原因がAnaconda Promptに表示されていた。

```
ImportError: cannot import name 'Template' from 'string'
```

##原因
フォルダの中にstring.pyというモジュール名を持ったPythonファイルを作成していたことだった。このファイルは予約された名前であったため、このファイルが参照され動かなくなっていた。

##修正方法
string.pyのファイル名をほかの名前にすればいい。
MongoDBの制限としきい値

MongoDBの制限事項について知りたく、マニュアルを参照しました。記述されていた内容を日本語訳とともに記述します。

**Reference > MongoDB Limits and Thresholds**
リファレンスマニュアル > MongoDBの制限としきい値
[Version 4.0](https://docs.mongodb.com/v4.0/reference/limits/) / [Version 4.2](https://docs.mongodb.com/v4.2/reference/limits) / [Version 4.4](https://docs.mongodb.com/v4.4/reference/limits) / [Version 5.0](https://docs.mongodb.com/v5.0/reference/limits)

**BSONドキュメント**
　最大のBSONドキュメントサイズは16MBです。
　最大サイズを超えるドキュメントを保存するために、MongoDBはGridFS APIを提供します。

**BSONドキュメントのネストの深さ**
　BSONドキュメントのネストの深さは100以下です。
Docker環境のJupyterのMatplotlibで日本語フォントを使用する

# 動機
タイトルがややこしい・・。最新の情報ではMatplotlibに日本語フォントがバンドルされているので、オプションを変更したら使えるよという記事などで試すも、うまく動作せず旧来の方法で普通にインストールすることにしました。
Exactryな記事がなかった気がするのでDockerコンテナで開発環境を整えていて、かつ簡単に解決したい方にお届けします。

**ご注意**
動作を確認したDockerイメージは`continuumio/anaconda3`なのでdebian系です。他のOSではフォントの格納場所の都合で動作しない可能性があります。報告いただくか、自分で試したら追記していきます。

# Dockerファイルへの追記内容
以下をDockerfileのどこかに記載してください。Matplotlibはご自身でインストールしている前提となります。

```Dockerfile
# フォントインストール
RUN wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip -O /tmp/fonts_noto.zip && \
    mkdir -p /usr/share/fonts &&\
    unzip /tmp/fonts_noto.zip -d /usr/share/fonts
```

# 使い方
参考までにJupyterでの使用例を紹介します。

```python
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Noto Sans JP'
plt.plot([1,2],label="ラベル")
plt.title("日本語が使えます")
plt.legend()
```
![Screen Shot 2021-10-31 at 22.28.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/90f485cd-8670-dea2-8c0f-73a0cf933dc8.png)
【Kong】Status API とは

##Kongについて
https://openstandia.jp/oss_info/kong/
詳細は省略

##Status APIとは
Kongの標準機能の一つ。
Admin APIのようにREST APIによって、KongのStatusを取得できる。
Kongのヘルスチェックにも利用可能。

##使用方法
###Status APIをオンにする
リファレンス
https://docs.konghq.com/gateway-oss/2.6.x/configuration/#status_listen

設定ファイル `kong.conf` を修正する。
`status_listen` をデフォルトの `off` から `0.0.0.0:8100` に変更する。

```http:/etc/kong/kong.conf
status_listen = 0.0.0.0:8100
```

###REST APIを実行する
リファレンス
https://docs.konghq.com/gateway-oss/2.5.x/admin-api/#health-routes

```http:リクエストURL
GET https://[ホスト]:8100/status
```

##補足
Status APIのポート(8100)で `/status` の実行ができますが、Admin APIのポート(8001)でも `/status` を実行できます。
Admin APIのポートは、GETリクエストだけでなく、POSTリクエストなども実行できます。
GETリクエストのみ実行できるポートとして、 Status APIのポートを開けて、利用するというのが、Status APIの目的になります。
そのため、Status APIのポートの開閉を問わず、Admin APIのポートで`/status`を実行すれば同じ結果が得られます。
JINS MEMEをTouchDesignerで使う

## これは何

2021年に発売されたJINS MEMEがLoggerアプリ(公式)でWebSocket通信できるので、TouchDesignerで値を受け取ってみました。

## 試した環境

* [JINS MEME](https://jinsmeme.com/) ファームウェアバージョン revision:1, minor:0, major:2
* iPhone 12pro iOS15
* [Loggerアプリ](https://apps.apple.com/jp/app/jins-meme-logger/id1537937129) version1.2.2.34
* Windows10pro 20H2
* TouchDesigner 2021.15240

## 準備

1. iPhoneとPCを同一ネットワークに繋ぐ
1. PCのローカルIPアドレスを調べておく 

### TouchDesigner

1. 空のTable DATを置く。OP名をreceiveTextとする。
1. Web Server DATを配置。任意のポート番号を指定する。
1. 上記DATのCallbacks DATを開き、Edit Contents(Ctrl+e)する。
1. onWebSocketReceiveText()で以下を入力。

```python:webserver1_callbacks
import json
def onWebSocketReceiveText(webServerDAT, client, data):
	jsonData = json.loads(data)
	t = op('receiveText')
	for key, val in jsonData.items():
		cell = t.cell(key, 1)
		if cell == None:
			t.appendRow([key, val])
		else:
			cell.val = val
	return
```

### Loggerアプリ

1. 「接続」タブでJINS MEMEと接続。
1. 「設定」タブでWebSocketクライアントを追加し、PCのIPアドレスと、Web Server DATで指定したポート番号を指定して、「追加」ボタン押下。

## データ取得開始

1. TouchDesignerのWeb Server DATのActiveをOnにになっていることを確認。
1. LoggerアプリのWebSocketクライアントを有効にする。成功することを確認。
1. Table DATにデータが流れてくる。
![スクリーンショット 2021-10-31 222309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69418/ce0bdba0-f2cc-5055-64f0-434d5be6e627.png)

## おわりに

名前からしてWeb Socket DATを使うもんだと思ってたけど使い方がよく分からないので、Web Server DATで済ませました。
これを使っていくつか作ってみました。

* [JINSBEAM | ProtoPedia](https://protopedia.net/prototype/2606)
* [JINSMEMEでカメラスイッチング | ProtoPedia](https://protopedia.net/prototype/2596)
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1031 ネットワーク インフラエンジニア

ping(1)
ピングやピンと呼ぶ。
・Echo Requestを送り、Echo Replyを受信することでIP通信できていると判断する。
・初めて通信する相手の時にはARPによる解決をおこなうことで１回失敗することがある。


tracerute
・traceroute(トレースルート）と呼ぶ。コマンドはメーカーや機種により異なる場合がある。
・意図的にTTL0で破棄されるように少ないTTLのパケットを送信し、ICMP Time Exceededを送信する機器のIPアドレスを調べる。
・送信時にIPが運ぶプロトコルはUDPやICMPが使われる。
【Rust】同名フィールドを持つ異なる型に変換する

## はじめに

以下のようなことをやりたいです。

```rs
mod A {
    #[derive(Default)]
    pub struct Foo {
        pub id: i64,
        pub name: String,
    }
}

mod B {
    pub struct Foo {
        pub id: i64,
        pub name: String,
    }
}

let a = A::Foo::default();
let b = B::Foo { id: 1, ..a };
assert_eq!(a, b);
```

上記の例でいうと、fooとbarが同じ型であれば問題なくコンパイルが通ります。  
しかしジェネリクスが使用されていたり、名前空間が異なると異なる型とみなされて実現できません。


調べてみるとRFCがありましたが`Further generalization`として提示されています。
（ジェネリクスについては1.58あたりで入りそうです）

https://github.com/rust-lang/rfcs/blob/master/text/2528-type-changing-struct-update-syntax.md


## 環境

``` sh
❯ rustc -V
rustc 1.55.0 (c8dfcfe04 2021-09-06)
```

## 成果

```rs
use type_change::From;

#[derive(Clone)]
struct Foo {
    id: i64,
    name: String,
}

#[derive(From)]
#[from(Foo)]
struct Bar {
    id: i64,
    name: String,
}

let foo = Foo { id: 1, name: "foo".to_string() };
let bar = Bar { name: "bar".to_string(), ..foo.clone().into() };
assert_eq!(foo.id, bar.id);
```

リポジトリはこちらです

https://github.com/k-fujino-kohei/type-change

タプル構造体や構造体のフィールドでも変換できます。

現状はすべてのフィールド名と型が一致しないと変換できないのですが、attributeを付けてフィールドごとに制御できたらもっと使いやすいと思います。


## 終わりに

マクロは初めて書いたのですが[syn](https://crates.io/crates/syn)と[quote](https://crates.io/crates/quote)のおかげで直感的にかなり書きやすいと思いました。

手続きマクロは別クレートを用意しなければならないのであまり気軽に書くことはなさそうですが、何でもできるので覚えておくと困ったときに役立つと思います。

## 参考

https://github.com/dtolnay/proc-macro-workshop
【Python】最大長が決まっているqueueが欲しい時は

Pythonでqueue構造を使うにはqueue.Queue()があります。
しかし、これはqueueの長さを一定までにして、それを超える場合には古いものから取り除かせたい場合にはあまり向いていません。
[リファレンス](https://docs.python.org/ja/3/library/queue.html)によると
queue.Queue()の引数で最大長が決められますが、queueがいっぱいの時は例外を送出し、
新規挿入はqueueが空くまでブロックするようです（待機させる）。
また、現在の要素数を得ようとしてもQueue.qsize()というメソッドはありますが、これは長さの近似値を返すのみです。
よって最大長を設けたい場合はかなり処理が面倒になります。

#ではどうするか
collections.deque()を使うと、すぐに今回ほしい形のqueueが得られます。

```python:dequeの例（最大サイズ3）
import collections
q = collections.deque([], 3)

for i in range(5):
    q.append(i)
    print(q)
```
上記のコードを実行すると以下のような出力が返ってきます。

```python:例の出力
deque([0], maxlen=3)
deque([0, 1], maxlen=3)
deque([0, 1, 2], maxlen=3)
deque([1, 2, 3], maxlen=3)
deque([2, 3, 4], maxlen=3)
```
最大サイズ3未満まではそのままデータが追加され、
サイズが3になったら先頭の古いデータが消えて、末尾に新しいデータが追加されます（FIFO）。

collections.deque([], 3)
でdequeを作成します。
一番目の引数が初期データ、二番目の引数が最大サイズとなっています。

データを末尾に追加する場合は
 q.append()

データを先頭に追加したい場合は
 q.appendleft()

末尾のデータをpopして取得したい場合は
 q.pop()

先頭のデータをpopして取得したい場合は
 q.popleft()

現在の要素数の取得は
 len(q)

となっています。
Googleスプレッドシートで複合ユニーク制約を実現する

## 概要
複合ユニーク制約を破っている行を条件付き書式で赤く表示する
やってることは，ソートして前後比較するだけ
単一カラムのケースは
https://qiita.com/kawaz/items/19fc4b21f7a8dae6082a
にあるが，複合の場合が見当たらなかったため，メモ

## 例
### 前提
このような表があったとして，

||A|B|
|---|---|---|
|1| 社員番号 | 資格 |
|2|A001|FE|
|3|A001|AP|
|4|A002|FE|
|5|A002|FE|
|6|A003|AP|

(A002, FE) が重複しているので，4行目と5行目に着色したい．

### 方法
まず，列A,Bを選択して，「データ」->「範囲を並び替え」 で，
(社員番号, 資格) の組でソートしておく

セル A2:B6 に条件付き書式を設定
カスタム数式で，

```
=OR(AND($A1=$A2, $B1=$B2), AND($A2=$A3, $B2=$B3))
```

複合ユニークにするカラム数が増えた場合，AND関数の中身を増やしていく
あとは，該当するものに目立つ色のスタイルをつけておけばよい

![スクリーンショット 2021-10-31 22.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286106/e80eaf70-c92f-1e70-51c9-df441c883ec5.png)

## 注意
ソートしないと機能しない
以上の数式は，ヘッダが存在することを前提にしているので，ヘッダがないと１行目の動作がおかしくなる
【学習記録⑮】Vue Routerを用いてURLごとに表示を切り替えてみる！

# はじめに
Vue.jsを最近勉強し始めたので学んだ文法などを備忘録としてメモしていこうと思います。
今回はVue Routerを用いてページごとに表示を切り替える方法について記載していきます。

## Vue Router
`Vue Router`はVue.jsにおいてルーティングを制御するためのライブラリです。

https://next.router.vuejs.org/

※現在僕の学習環境はVue.js 3のため、Vue Routerのバージョンは4で動作確認をしています。

## セッティング
まずはVue Routerをインストールします。

```console
npm install vue-router@4
```

https://next.router.vuejs.org/installation.html

## ルートファイルの設定
上記にて`vue-router`をインストール後、`router.js`などのファイルを作成し、以下のようにrouterの設定を行います。
インストールした`vue-router`から`createRouter`, `createWebHistory `をimportします。
`createRouter`メソッドがルーティング情報を生成し、`createWebHistory()`はhistoryモードを指しています。
historyモードに設定することでURLに'#'などが付かなくなります。
（createWebHashHistory()を設定するとURLに'#'が付きます。）

今回は`Morningページ`と`Afternoonページ`を用意しているのでそれぞれをroutesにセットします。

```js:router.js
import Morning from './views/Morning.vue';
import Afternoon from './views/Afternoon.vue';
import { createRouter, createWebHistory } from 'vue-router';

const router = createRouter({
    history: createWebHistory(),
    routes: [
        { path: '/', component: Morning },
        { path: '/afternoon', component: Afternoon }
    ]
});

export default router;
```

## Main.jsでの呼び出し
上記で設定したルーター情報をMain.jsで呼び出します。

```js:Main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';

createApp(App).use(router).mount('#app');
```

## ルート先それぞれのコンポーネント
今回は`Morningページ`と`Afternoonページ`を使用するので、それらのVueファイルを作成します。

```vue:Morning.vue
<template>
  <div>おはよう</div>
</template>
```

```vue:Afternoon.vue
<template>
  <div>こんにちは</div>
</template>
```

## 出力結果
`npm run serve`コマンドを実行し、結果を見てみます。

URLが`localhost:8080`のときは`Morningページ`が出力されていることが分かります。
![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/a87500e6-649e-2ce9-655d-3066d01314e0.png)

URLが`localhost:8080/afternoon`のときは`Afternoonページ`が出力されていることが分かります。
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/eb0e0a09-a574-0ee7-9094-f37170dc4a3a.png)

# おわりに
今回はVue Routerを利用してURLごとにページを切り替える方法を学びました。
次回は`router-link`タグを用いて画面からURLを切り替えていく方法についてまとめていこうと思います。
QiskitでGPUを使用して期待値を求めてみた！

# はじめに
QiskitでGPUを用いて高速に計算をしようというのがコンセプトです。
本記事で作成したコードは[GoogleColaboratory](https://github.com/Gnme18/Qiskit_QML/blob/main/Qiskit_GPU.ipynb)にあります。


#　下準備
## installの処理
install関係は以下のようになってます。

```
pip install qiskit==0.25.2
pip install qiskit-aer-gpu
```


## importの処理

```python
import numpy as np

import qiskit
from qiskit import QuantumRegister, QuantumCircuit, ClassicalRegister, Aer, execute
from qiskit.providers.aer import QasmSimulator, StatevectorSimulator
from qiskit.aqua.utils import tensorproduct
from qiskit.quantum_info.analysis import average_data
from qiskit.quantum_info import Statevector
from qiskit.quantum_info.operators import Operator, Pauli
```

## コード
回路の準備

```python
theta = [2.0 * np.pi * np.random.rand() for i in range(9)]
theta

qc = QuantumCircuit(2)

for j in range(4):
    for i in range(2):
        qc.ry(theta[i], i)
        qc.rz(theta[i], i)
    qc.cx(0, 1)
```

GPUによる回路の実行

```python
backend = StatevectorSimulator(precision='single', device='GPU')

results = execute(qc, backend=backend).result()
result_statevec = Statevector(results.get_statevector(qc))

print(result_statevec)
```

```
Statevector([ 0.26311904+0.56951183j,  0.0355426 +0.18207325j,
             -0.49505538+0.52376759j, -0.03841634+0.22610325j],
            dims=(2, 2))
```

Observable 作成

```python
pauli0 = Pauli(label='IZ')
pauli1 = Pauli(label='IZ')

obs_op = Operator(pauli0)
print(obs_op)
```

```
Operator([[ 1.+0.j,  0.+0.j,  0.+0.j,  0.+0.j],
          [ 0.+0.j, -1.+0.j,  0.+0.j,  0.+0.j],
          [ 0.+0.j,  0.+0.j,  1.+0.j,  0.+0.j],
          [ 0.+0.j,  0.+0.j,  0.+0.j, -1.+0.j]],
         input_dims=(2, 2), output_dims=(2, 2))
```

期待値計算

```
expectation = result_statevec.expectation_value(obs_op)
print(expectation)
```

```
(0.8259752337379496+0j)
```
JavaScriptのthisを理解する

## thisとは
**呼び出し元のオブジェクトへの参照を保持するキーワードのこと**

`this`の参照先は、[実行コンテキスト](https://qiita.com/cotton11aq/items/091c983e9034e22c145c)によって変わります。
実行コンテキストには「グローバルコンテキスト」や「関数コンテキスト」があり、今回は関数コンテキストにおける`this`について見ていきます。

関数コンテキストにおける`this`の場合は、呼ばれた関数ごとに参照先が変化します。

## consoleで「hello Taro」と表示する場合

```javascript
const person = {
  name: 'Taro',
  hello: function () {
    console.log('Hello ' + this.name);
  },
};
```

この場合、`this.name`の`this`は自身のオブジェクトの`person`を参照します。

## helloメソッドを呼び出してみる

```javascript
const person = {
  name: 'Taro',
  hello: function () {
    console.log('Hello ' + this.name);
  },
};

person.hello();
```

`person.hello()`とすることで、`person`オブジェクトの`hello`メソッドを呼び出すことができます。

###実行結果

```javascript
Hello Taro
```
`hello Taro`と出力されました。

`person`というオブジェクトのメソッドとして`hello`が呼ばれた場合、`hello`メソッドの中で呼び出される`this`は呼び出し元のオブジェクトである`person`を参照します。

## thisをpersonに変えて呼び出してみる

```javascript
const person = {
  name: 'Taro',
  hello: function () {
    console.log('Hello ' + person.name); // thisをpersonに変更
  },
};
person.hello();
```
###実行結果

```javascript
Hello Taro
```
同じように、`hello Taro`と出力されました。
これは、変数`person`が`hello`メソッドのレキシカルスコープになるためです。

ただ、メソッドの中でそのオブジェクトを取得したい場合は基本的に`this`を使います。

## まとめ

`person`というオブジェクトのメソッドとして`hello`が呼ばれた時には、`hello`メソッドの中で呼び出される`this`は呼び出し元のオブジェクトである`person`を参照します。

また、`person`というオブジェクトの中の`hello`メソッドは、メモリ空間のどこかに登録されている`function`のことを指しています。また、同じように`name`プロパティは、メモリ空間のどこかに登録されている`Tom`という値への参照を保持しています。

この状態で`person`の`hello`が呼ばれた場合、JavaScriptは`person`というオブジェクトを探しにいきます。そして、そのオブジェクトの中の`hello`というメソッドを実行することで、`Hello Tom`とコンソールに表示されます。

## 参考資料
https://www.udemy.com/course/javascript-essence/
xcodeでcommand + option + ◀︎(左キー)が便利だったのでメモ 

#今回の内容

* `command + option + ◀︎(左キー)`でコードを整理したら見やすくなったので、メモとして残して起きます。

#簡単解説

* 下の画像は、Realm関係のコードを書いた時のものです。

<img width="500" alt="DD6195C4-1EF8-4C12-986E-5186722122EE_1_105_c.jpeg"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/17ca9aae-ce47-fcac-1c74-da4fa299b70e.jpeg">

 1. 上の画像で説明をすると、キャレットを`関数名(){}`の`{`の右隣に置きます。
 
 2. その状態で　`command + option + ◀︎(左キー)`を使うと、キャレットから`関数名(){}`の`}`までのコードが見えなくなります。
 
 3. 隠したコードを表示する時は、`・・・`をクリックするか、 `command + option + ▶︎(左キー)`を使って再表示させます。

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
【Ruby silver】&, &&, |, ||演算子それぞれを使ったコードについて考える

次のコードを実行するとどうなりますか
-

```ruby
a = [1, 2, 5, 7, 8]
b = [1, 3, 6, 7, 9]
c =  nil || a & b | a && a | b
p c
```
演算子の優先順位とそれぞれの演算子について理解していないと解けない問題。

----


###積集合「＆」

重複している要素は取り除かれ、共通する要素を取り出す。

```ruby
a = [1, 2, 3]
b = [1, 3, 5]
a & b #=> [1, 3]
```

###＆＆演算子

&&は a と b がどちらも真のとき、最後に評価された b を出力する

```ruby
a && b #=> [1, 3, 5]
```

###和集合「｜」

重複している要素は取り除かれ、重複している要素をまとめて出力する。

```ruby
a = [1, 2, 3]
b = [1, 3, 5]
a | b #=> [1, 2, 3, 5]
```

###｜｜演算子

||は a と b がどちらかが真のとき、最初に評価された a を出力する

```ruby
a = [1, 2, 3]
b = [1, 3, 5]
a || b #=> [1, 2, 3]
```
a = nilの場合右辺の処理が行われる

```ruby
a || b #=> [1, 3, 5]
```

---


上記の知識を踏まえて考えてみる
-


```ruby
a = [1, 2, 5, 7, 8]
b = [1, 3, 6, 7, 9]
c =  nil || a & b | a && a | b
p c
```

####⑴優先順位を考える
演算子の優先順位

```
高い
&
|
&&
||
低い
```

####⑵優先順位の順番に処理を考える
- **1番初めに評価するもの【積集合（共通している要素を取り出す）】**
c =  nil || **a & b** | a && a | b
a & b の場合は共通する要素を取り出す=> ``[1, 7]``

- **2番目に評価するもの【和集合（重複している要素を全て取り出す）】**
c = nil || ①(**a & b | a**) && ②(**a | b**)
c =  nil || **[1, 7] | a** && **a | b**
①``[1, 7] | a`` => ``[1, 7] | [1, 2, 5, 7, 8]`` => ``[1, 7, 2, 5, 8]``
②``a|b`` => ``[1, 2, 5, 7, 8, 3, 6, 9]``

- **3番目に評価するもの【＆＆演算子】**
c = nil || **a & b | a && a | b**
 ``[1, 3, 7, 2, 5, 8]`` | ``[1, 2, 5, 7, 8, 3, 6, 9]``
どちらも真の場合最後に評価された値を返す => ``[1, 2, 5, 7, 8, 3, 6, 9]``

- **4番目に評価するもの【｜｜演算子】**
``nil || [1, 2, 5, 7, 8, 3, 6, 9]``
左辺がnilの場合は右辺の処理が行われる

#回答
```
[1, 2, 5, 7, 8, 3, 6, 9]
```

#感想
難しい！


参考資料：
<li>https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html</li>
【Markdown記法】基本的な埋め込み備忘録

## 概要
Qiita必須スキルで人権であるにも関わらず、Markdownが覚えられません。
とりあえずよく使いそうなものを記載。備忘録です。



## 見出し

```
# 見出し１
## 見出し２
### 見出し３
```

# 見出し１
## 見出し２
### 見出し３



## ソースコード

最後の「"」は表示用のため不要です。

```
```python:test.py
import cv2
cv2.imread("test.jpg")
```"
```

```python:test.py
import cv2
cv2.imread("test.jpg")
```

## リンク
```
[Qiita](https://qiita.com/)
```
[Qiita](https://qiita.com/)



## 文字関連

```
`こんにちは`
```

`こんにちは`


```
**こんばんは**
```

**こんばんは**


```
~~さようなら~~
```

~~さようなら~~



## 画像
```
![test](https://..../...png)
```
![test](https://user-images.githubusercontent.com/93382642/139573722-d2cb6256-447c-4237-8980-a57dc0ff1ca6.png)



## 色
```
<font color="Blue">青</font>
```

<font color="Blue">青</font>



## 表
```
|左|中|右|
|:------|:-------:|------:|
|テスラ|トヨタ|ベンツ|
```
|左|中|右|
|:------|:-------:|------:|
|テスラ|トヨタ|ベンツ|



## リスト
```
- その１
    - 昨日
    - 今日
- その２
    - 先週
    - 今週
```

- その１
    - 昨日
    - 今日
- その２
    - 先週
    - 今週



## 最後に
Markdown２日目の初心者が使いそうなコードをまとめました。
まだまだありそうなので、見つけ次第追記していきます。

こちら参考にさせていただきました。ありがとうございました。

https://qiita.com/toyokky/items/47a5a56c20ad99e1784c
コモディティ品で GPU 計算ノードを構築したときの障害の記録メモ(2.5 年目)

## 背景

2019 年コモディティ品で GPU 計算ノードを構築するメモ
https://qiita.com/syoyo/items/cffcd64aa09cdb042b5d

あたりで GPU 計算ノード(機械学習, レイトレ, マイニング)を構築している

2019 年からだいたい 2.5 年くらい連続稼働させていて(~10 nodes くらい), インシデントも多少たまってきたので記録です.


## GPU の障害

1~2 週間連続稼働させているとエラーも出やすくなります.

Linux(Ubuntu) + GPU エラーメッセージ集
https://qiita.com/syoyo/items/0707daed0295db6a3ffa

GPU fallen of the bus がよく出ます: 熱暴走なり, メモリエラーが原因が多い模様. 基本リブートすれば治る.

機械学習などで長期間回すときは GPU エラーでるのを見越して学習できるようにするとよいでしょう(=> どうするのがいいのか... はまだノウハウがたまっていない)

エラーが出ると software reboot(`/sbin/reboot`)できないことが多い(プロセスが defunct. 特に AMDGPU の場合は defunct になりやすい)ので, 
リモートで運用しているときなどはなにかしら物理リセットできる仕組みがあるとよいでしょう.

## 障害の記録

## HDD, SSD

計算キャッシュをローカルに置く必要がありますので各ノードあたり SSD は必須でついています. HDD は optional.

それなりに壊れやすいです(bad sector とかではなくて, 完全に認識しなくなる状態. HDD の場合は回転ができていないとか). SSD も HDD も 2 年で 10% くらい?(10 個かって 1 個が 2 年で壊れる感じ).

少なくとも SSD は計算キャッシュ用とブート用は分けておいたほうがいいかもしれません.

## CPU クーラー

完全に動かないという故障はないが, 簡易水冷だとファンの故障やガタツキはあり.

また, 簡易水冷の場合, 冷却液の蒸発という問題があるので, 持って 3~4 年というところでしょうか.

### x399 マザーボードの故障.

稼働期間: 2 年と半年
原因: 焦げたにおいとともに電源が入らなくなった(電源ボタンおしてもすぐ落ちる)

焦げくさいにおいがするのでなにかが焼けているが, ヒートシンクで覆われている部分で発生しているようでよくわからない
=> ヒートシンクなど取り払ったところ, 固体コンデンサ?が破裂していました.  


### x299 + Tesla P100

たまに落ちる.
電源あたり? 故障ではなく動作不安定の模様.

## ケースファン関連

安物は結構すぐ壊れます(もしくはがたついて音がひどくなる).
Noctua が安定していてかつ静音なので Noctua 推奨です(今のところ Noctua ファンは故障なし)

## CPU

故障はまだない

## GPU

故障自体はまだない.
ただ, 3080, 3090 でファン故障が出てきた.
(ものによっては 3 連ファン全部が故障)


## メモリ

今の所故障(memtest で fail)はない.

別途, 2012 年くらいから通常デスクトップ用で使っていたのは 1 件メモリエラー発生した.

## 電源

故障というのはないが, 相性なのか下にあるように総利用量の影響か, 750 ~ 850W あたりの安めの電源では, 不安定になるというのはありました.

Corsair とかの 1000W 以上使っていればだいたい問題はない感じです(実利用ワットはその 7~8 割(=800W くらい)に収まるくらいに)

家庭や小規模事務所用の環境(~60A)だと, コンセントあたり 1500W に抑えても, たくさん電力使うと電流?(電圧?)が不安定になりやすいようです. マンションやビルなどの集合施設だと, 隣人の電気使用量も影響あるっぽい感じです(だいたい 9 AM とか 16 PM あたりの通常生活組(家庭、オフィス含む)が電気を多く利用するタイミングで不調というのが何度かありました) 

それなりに質のよい電源を選んで使うのがよさそうでしょうか(GOLD 認証とかは電力効率なので質ではない: https://akiba-pc.watch.impress.co.jp/docs/sp/1154535.html) 

別途, デスクトップ用 Corsair SFX 電源でファンが異音を出すようになった障害がありました(=> RMA で交換対応)

## 現時点でのまとめ

* HDD 故障 x 2
* SSD 故障 x 2
* x399 マザーボード故障 x 1
* 簡易水冷ファン, ケースファン関連(ガタツキ、ファンが回らないなど) x 3
* 3080 GPU ファン 3 つ全部故障 x 1
AWS Cloud9上でJupyter labを開く方法

今回は、AWSの統合開発環境(IDE)Cloud9上でデータサイエンスをする上で開発効率が一気に上がるIDEのJupyter Labを立ち上げる方法を紹介します。

#この記事の流れ
① Cloud9にJupyterをインストール
② Jupyter labを立ち上げる
③ Jupyter labに入る

##①Cloud9にJupyterをインストール
今回使うCloud9はAmazon Linux2、Pythonはdefaultのversion 3.7.10をを使っています。
それでは、Cloud9上のTerminalでJupyter labをインストールしましょう。

```pip install jupyterlab
```

##②Jupyter labを立ち上げる
次にJupyter Labを立ち上げます。ここで、ローカル環境でよくやる

```jupyter lab```

というコマンドを書けばすぐに立ち上がってWebブラウザを開いてくれましたが、Cloud9ではそうなりません。
またJupyter Labのデフォルトポート番号は8888ですが、Cloud9上で実行しているアプリケーションをプレビューするには、ポートの設定を8080、8081、8082を指定している必要があります。

[AWS Cloud9統合開発環境 (IDE)で実行中のアプリケーションをプレビュー](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html)

コマンドを以下に変更して実行しましょう。

```jupyter lab --port 8080 --ip 0.0.0.0
```
すると以下のようにサーバーが立ち上がります。
![スクリーンショット 2021-10-31 20.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/ee3f4b00-b541-84a8-5113-defb571e1b51.png)

この下から２番目の
```token=8e{モザイク}
```のtoken=よりも後の部分をコピーしておきましょう。Jupyter Labに入るためのトークンです。

##③Jupyter labに入る
実行後、optionタブの[Preview] → [Preview Running Application]をクリックすると以下の🙁の画面に遷移します。

![スクリーンショット 2021-10-31 20.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/91749d93-3640-912f-2132-361bdf80d571.png)

赤丸をしてる部分をクリックすると、Jupyter Labのログインページに遷移します。


![スクリーンショット 2021-10-31 20.58.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/f24ab7cb-4e3b-0bfc-356f-e6aad8a7107b.png)

ここに先程のトークンを入力して、アクセス成功です！