OmniAICreator/Qiita-1.07M huggingface dataset:
WSLでRedisを試す

# 初めに
WSLのインストールは完了しているものとします。


# Redisのインストール
まずはWSL(自分はUbuntuを利用しました)を起動して、Redisをインストールします。

```shell:install-redis.sh
sudo apt install redis-server
```

インストールが完了したら、以下のコマンドでRedisのバージョンチェックをかねてインストールできているかチェックします。

```shell:check-version.sh
 redis-server --version
```

以下のような応答が返ってきます。バージョンが`6.0.6`であることがわかります。

```shell
Redis server v=6.0.6 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=61b016b2021ce107
```

# Redisを起動する

調べるとRedisがインストール後に起動されているような記事が多いのですが、WSLだけなのか、きちんと以下のコマンドで起動しないとCLIでの接続ができませんでした。（何か知っている方がいればコメントください）

```shell:start.sh
sudo service redis-server start
```

```shell
[sudo] password for UserName:
starting redis-server: redis-server.
```

これでRedisが起動できました。

ちなみに以下のコマンドでRedisが起動しているかチェックできるそうですが、これも`not booted`と表示されてしまい、起動できているかのチェックができませんでした。

```shell
sudo systemctl status redis-server.service
System has not been booted with systemd as init system (PID 1). Can't operate.
```


# Redisを試す
RedisのCLIが以下のコマンドで起動できます。

```shell:start-cli.sh
redis-cli
```

起動で来たら、以下のようにコマンドを実行してみます。

- pingを投げる→PONGと応答がある
- testというKeyにHello WorldというValueをセットする
- getコマンドでtestに割り当てられたKeyを取得する

```shell
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set test "Hello World"
OK
127.0.0.1:6379> get test
"Hello World"
```

まずはこんな感じでしょうか。ちなみに`info`コマンドでRedisの状態を確認でます。
他にも試してみたら追記していこうと思います。
情報セキュリティは主に三つの特性

応用情報技術者令和元年秋期 午前問40


JIS Q 27000:2019(情報セキュリティマネジメントシステム－用語)では，情報セキュリティは主に三つの特性を維持することとされている。それらのうちの二つは機密性と完全性である。残りの一つはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f8cb0ec2-7816-2292-95d6-082263782ec3.png)

**機密性** (Confidentiality)
許可された正規のユーザだけが情報にアクセスできる特性を示す。

**完全性** (Integrity)
情報が完全で、改ざん・破壊されていない特性を示す。

**可用性** (Availability)
システムが正常に稼働し続けることの度合い。ユーザが必要な時にシステムが利用可能である特性を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0e8d3d9a-0315-f34c-577c-abdb81e3a077.png)

From https://www.ap-siken.com/kakomon/24_haru/q42.html
[Git]基本操作一覧

# 概要
Git操作について、備忘録様に記します。

# 操作一覧
### リポジトリを作成する

```
git init
```

### ファイルやディレクトリをインデックスに保存

```
git add <ファイル名>
```
- -p オプション　ファイルの変更箇所の一部を保存
- -i オプション　インデックスに登録するファイルを対話的に検索　

### インデックスに追加したファイルをコミットする

```
git commit
```
- -a オプション　変更されたファイルを検出してインデックスに追加してコミット
- -m オプション　コミットメッセージを指定してコミット

### 変更されたファイルの一覧を表示

```
git status
```

### 変更されたファイルの差分を確認

```
git diff
```

### コミットログを確認

```
git log
```
- 特定のファイルをみたい場合はファイル名を指定

### ファイルやディレクトリ名を変更、移動

```
git mv <古いファイル名> <新しいファイル名>
```

### ファイルを削除

```
git rm <ファイル名>
```

### 管理対象ではないファイルの削除

```
git clean
```

### 手元で変更したインデックスに登録されていないファイルを元に戻す

```
git checkout -- <ファイル名>
```

### インデックスに登録したファイルを取り消す

```
git reset HEAD -- <ファイル名>
```

### 以前コミットしたファイルだけをインデックスに登録

```
git add -u
```
「pyplotで中学数学のグラフを書く(その２)」を参考にしました。

(オリジナルポスト)pyplotで中学数学のグラフを書く(その２)
https://qiita.com/mookouchi/items/5694d7e3c7b6a181f169
(参考)「【学生向け】二次関数　その１」を参考にしました（Wolfram|Alphaとonline sympyで実行しました）
https://qiita.com/mrrclb48z/items/7a613d82e207afad413b

##Wolfram|Alpha 日本語版で実行しました。
https://ja.wolframalpha.com/input/?i=y+%3D+2+*+x+%2Cy+%3D+3+*+x+%2B+10%2Cy+%3D+x+**+2%2Cy+%3D+sin%28x%29

##online sympyで実行しました。
制作中
AWS学習よりLPIC2の資格勉強を優先する理由

　
AWS上でLinuxを利用しているから。

~fin~

## まえがき

社会人として働いていると意識するのは、時間の使い方ですよね。
この資格"LPIC2"を取得するか、AWS学習を続けるかで迷って、LPICを選択した理由を書き綴ります。
~~(個人的な理由も混ざっているので温かい目でみてください。)~~

## 開発プラットフォームのトップである

IPAさんのデータ白書2018-2019([リンク](https://www.ipa.go.jp/files/000069381.pdf))によると、
開発プラットフォームとして一番選択されているのはLinuxです。
世の中の様々なクラウドサービスもlinux上で動いているという考えをすれば、汎用的で腐りません。
今後もいろいろなソフトウェア、サービスが開発され、linuxが利用されることでしょう。

## AWSのありがたみを知りたかった

「このサービスを利用することで〇〇することができます！」
って発表されたとき、

「すごい！画期的！便利！」（サービスを理解している）
「へー、何が嬉しいの？」（サービスを知っている）
「なにそれ？」（サービスをしらない）

上のうち、どのようなリアクションをすることが多いでしょうか？

自分は「なにそれ？」が一番多かったです。
今までの状態を知らないと、
そもそもXX機能がある、XX機能の課題として△△があったが、新サービスは〇〇できるため、課題を克服できる。
と順々に理解して、そこに満足感を覚え止まってしまいがちで、
この機能はどこであれを担保しているのかー？など一回りレベルが上がった疑問は
今までの状態を知っていないと考えつくのも難しかったですが、
LPICを勉強してクラウドのありがたみを改めて理解できました。

技術の歴史的な変遷、今ある技術、その技術でできることを抑えておくと、
よりクラウドサービスを活用できると思います。

（余談）LPIC2の内容はネットワーク、サーバ、サービスまわりで、
クラウドサービスを利用する上で避けて通れません。
自分は開発メインでインフラ担当ではないですが、
webサーバの設定などを改めて見直すことができました。

## 評価される成果がほしかった

ここらへんから個人的理由です。

実はAWSのSAAという資格も持っています（←タイトル詐欺疑惑）

背景を補足すると、自分はインフラもなにもしらんままAWS利用しはじめて、
流石にまずいなとおもったのがきっかけで勉強しました。
勉強を通して、サービス全体の考え方とその種類が知ることができました。

実務でAWSを利用する上では資格を取るメリットは薄いと思います。
必要な知識を必要なときに学んだ方が効率的です。
実務でも役に立つのは、資格ではなく、資格を取得するために勉強した内容です。

しかし経歴として残るのは資格です。資格に重きを置く企業もあります。
（コードテストなしで人を採用する企業さんもありますし。）
GAFAの響きいいですしね。なんかすごそう感。（資格詐欺もありますけど）
実務何年の経歴も育った環境に依存するので、アウトプットみないとわかりません。

実務だと最終的に〇〇しか使わないから覚える意味ないみたいな意見もあると思いますが、
選択肢を狭める意味もないかとも思います。
その代わり他の勉強をするような選択肢を取ることもできます。

自分のいる環境だと、資格取得の評価が高く、
AWS学習した！では評価が低かった、それだけです。
（AWS資格取得した！でも良かったんですけど、前章の理由よりLPICに。。）

## 資格更新期限が迫っていた

LPIC1をとったのが5年前でそろそろ期限切れるなぁ、、
と思ったのも大きな要因の１つです。
AWS資格も3年ですよね。サービスの更新頻度を理由に有効期限短くする正当性ですよ・・
資格ビジネスお上手（褒めてます。）

## LPIC2勉強詳細

資格勉強なにしたの？って方向けのコンテンツ↓↓

### わいスペック

- 基本情報、応用情報もってる。
- SI系の会社で企画・営業・開発・研究なんでもやってたらキャリアがどっか行ったマン。
- 社会人5年目。

### 利用した書籍・サービス

- Linux教科書 LPICレベル2 Version 4.5対応 | 翔泳社(いわゆる小豆本)

    kindle版購入したんですけど、コマンドまわりとか見にくいので、
    ping-tで覚えて、足りないところ補完する感じでした。

- ping-t 3ヶ月コース

    ping-tは自分の勉強できる時間と相談して、落ちたときのために1ヶ月余分に購入しました

### 勉強期間・勉強時間

2ヶ月。
LPIC 201、202それぞれ50時間ほど。
平日1-2時間、休日3-5時間。

### 勉強方法

1. 小豆本読む
2. ping-tで金になるまで問題やる
3. 再度小豆本読む
4. ping-t模擬試験or全問題60問を10回ほどやる
5. ↑9割超えている→次の日受験で申込

### 所感

- LPIC 202は小豆本ping-tだけだとかなり細かく頭に入れないと受かりません。
    - 別の本を追加購入することをおすすめします。
    - 自分は合格点ギリギリでした。
- 暗記パンほしい

## 最後に

まだまだ、IT関連で知らないことだらけで今後も勉強しなきゃなぁ・・と思ったり、
社会人としての勉強怠ってきたからそっちも勉強したいなぁ・・とも感じたり。

お読みいただき、ありがとうございました。
Downsubでダウンロードした字幕を正規表現を使って整形

##経緯と達成目標

海外の講演やコースを、字幕を出しながら見る時に、内容によっては映像は不要で、テキストだけ見れればいいと感じる時がある。
その時に、以下のサイトを使って字幕をダウンロードした。

[Downsub] Youtube字幕ダウンロードサイト
(https://downsub.com/)

英語の解説を同時進行で理解できるほど英語は得意ではない。
生成されたテキストをさらにgoogle翻訳やdeeplなど、翻訳サイトにかけて日本語訳して読むわけだが、Downsubの生成形の都合で、改行や動画中のタイミングが文章の区切りに関係なく差し込まれる。
そのまま翻訳するとそれらがネックになってかなり違和感のある訳文になる。

そこで、より翻訳時に解読しやすいよう、正規表現を用いて生成されたテキストの不要な情報をカットし、改行位置も正したい。
以下にその手順を記録する。

###環境
VS code 1.47.2


##手順


形式は、
**（正規表現検索）→ （置き換えテキスト）**
とする。

1. ^\d+ → ""  
2. :\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3} → ""    
3. ^\n → ""     
4. $\n → " "   
5. \. → .\n\n   

##それぞれの処理内容

1.文頭数字二文字を空文字（削除）
2.タイミングを削除
3.文頭改行削除
4.文末改行を削除、空白挿入
5.文字列.を検索、ピリオドの後を2行分改行


##まとめ

ダウンロードしたファイルに上記の処理をすることで、翻訳を通した時により読みやすい文章になる。
海外のYouTubeチャンネルなどで学習するときは活用して欲しい。
Google Drive内のファイルをPythonでダウンロードする方法

# Colaboratryなら簡単だがAWSやGCPだと意外と大変
Jupyter lab等で機械学習モデルを扱うとき，大きな学習済みモデルをGoogle driveから直接ダウンロードしたいといった状況がよくあると思います．
Google colaboratoryなら，Google driveと連携できるのでとても楽なのですが，AWSやGCP内のjupytrerでダウンロードしようとすると意外と大変です．
そこでgoogledrivedownloaderというpythonライブラリがおすすめです．便利ですが，意外と知られていないので今回記事を書きました．
pydriveというgoogle driveを扱うライブラリもありますが，単純にダウンロードするだけならこれがシンプルで楽に使えます．

# googledrivedownloader
googledrivedownloaderのGithubレポジトリは下記です．
https://github.com/ndrplz/google-drive-downloader

## インストール
インストールは次で簡単にできます．

```
pip install googledrivedownloader
```

## 使い方

例えば，Google drive内にmnistのzipファイルがあった場合は次のように簡単にダウンロードできます．
そのときのfile_idはGoogle driveでファイル共有をするときのURLに含まれているidです．外部からもアクセスできるようなアクセス権にする必要があります．
zipファイルなら展開までやってくれるので便利です．

```
from google_drive_downloader import GoogleDriveDownloader as gdd

gdd.download_file_from_google_drive(file_id='1iytA1n2z4go3uVCwE__vIKouTKyIDjEq',
                                    dest_path='./data/mnist.zip',
                                    unzip=True)
```

## 追記
フォルダごとダウンロードする方法も見つけました。

```
!cd Deep3DFaceReconstruction/network && wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1fPsvLKghlCK8rknb9GPiKwIq9HIqWWwV' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1fPsvLKghlCK8rknb9GPiKwIq9HIqWWwV" -O FaceReconModel.pb && rm -rf /tmp/cookies.txt
```
プロジェクトのディレクトリを汚さず、eslintコマンドで構文チェックする

### 1. Node.jsをインストール
- 省略

### 2. eslintをインストール、初期化
```
mkdir ＜任意のnpm用ディレクトリ＞
cd ＜任意のnpm用ディレクトリ＞
npm init
npm install eslint
```

### 3. eslintの設定（適当に）

```json:＜任意のnpm用ディレクトリ＞\.eslintrc.json
{
    "env": {
        "browser": true,
        "es2020": true
    },
    "parserOptions": {
        "ecmaVersion": 11
    },
    "rules": {
        "semi": [
            2,
            "always"
        ],
        "comma-dangle": [
            "error",
            "never"
        ]
    }
}
```


### 4. チェック実行

```
cd ＜任意のnpm用ディレクトリ＞
npx eslint -c ./.eslintrc.json ＜チェック対象ディレクトリ＞
```
Unchecked runtime.lastError: The message port closed before a response was received. というエラー解決方法

# Chromeブラウザで、謎のエラーが出現
パソコンを購入して間もない時に、Chromeブラウザ Consoleにて、
**Unchecked runtime.lastError: The message port closed before a response was received.**というエラーが現れた。

# 原因
Chromeの**Norton Safe Web**という拡張機能が **ON**
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/23ae9b76-4ab6-5651-736c-174f810fe2c6.png)

# 解決方法
Chromeの**Norton Safe Web**という拡張機能を **OFF**に設定
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/b1853cda-5303-0e94-f4d7-512cb2fefaa4.png)

結果Consoleはキレイな状態となった。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/95f59a8f-9cf9-f767-6b5b-5d0777768cd6.png)

**＊もしセキュリティソフトが原因でconsoleにエラーが表示されているんじゃないか疑ってみ、確認しよう。**
TerminalからVSCodeでプロジェクトを開くときによく使うオプション

## 何もなし

current directoryを新規windowで開く。

```sh
code .
```

## 現在開いているWindowを再利用する(-r --reuse-window)

Windowは再利用しますが、すでにVSCodeで開かれていたdirectoryは閉じられ新規にworkspaceが作られます。

```sh
code . -r
```

## 現在開いているWindowを利用しつつ、current directoryをworkspaceに追加する(-a --add)

Windowを再利用かつ、それまで開いていたworkspaceにcurrent directoryが追加されます。
複数のプロジェクトを同じwindowで見たいときに便利です。

```sh
code . -a
```

## その他のオプション

```sh
code -h
```

他のオプションはほとんど使ったことないですが…

## 参考

https://code.visualstudio.com/docs/editor/command-line
IQ Bot：作成済みのインスタンスに項目を追加する方法

IQ Botでは、インスタンスを作成するときに最初に項目を指定します。

それでは、インスタンスを作ってしまった後で項目を追加したくなったらどうすればよいのでしょうか？

この記事では、そんな場合の対応方法を説明します。

#作成済みインスタンスに項目を追加する方法

####Step１：「ラーニングインスタンス」タブから項目を追加したいインスタンスの名前をクリックします。

![00_タブ選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/a04103cf-313a-22d1-8f15-826eedf05d74.jpeg)

すると、インスタンスの詳細画面が開きます。

####Step２：インスタンスを編集します。
インスタンス詳細画面の右上に、インスタンスを編集するためのえんぴつマークがあるのでクリックします。
このえんぴつマーク、インスタンスがプロダクション状態（トグルがオレンジ）だと非活性になっているので、その場合はトグルをクリックしてステージング状態に戻した上でえんぴつマークをクリックします。
![02_えんぴつマーク.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/adecfaf8-6c76-69ec-a74c-8769c8837a16.jpeg)

####Step３：インスタンスの詳細画面から、項目追加用のセクションを展開します。
画面を開くと、項目追加用のセクションは最初はたたまれて表示されているので「どこ？！」と思うかもしれませんが、以下の赤枠で囲まれた部分をクリックしてあげると、セクションが展開されて項目追加用の欄が見えるようになります。
![01_展開.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/335c9a5e-a662-daa6-4dd1-031e4dc2fb4e.jpeg)

####Step４：項目を追加します。
フォームフィールド、テーブルフィールドそれぞれに追加したい項目を入力していきます。
（どちらか一方だけでもOKです）
入力のしかたは[新規作成](https://qiita.com/IQ_Bocchi/items/26c4a7065e4c8e64a427)のときと同じく、以下の要領です。
![05_入力のしかた.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/59feaca6-9c43-ad68-3678-54d34a46e21f.jpeg)

####Step５：保存します。
追加項目の入力が完了したら、画面右上の「保存」ボタンを押します。
![03_追加完了→保存.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/ea331d57-f202-fb9f-fddc-a13ef280c0e4.jpeg)

このような確認ダイアログがポップアップされるので、「はい、フィールドを追加して続行します」をクリック。
![99_保存の確認.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/119be06c-5a2d-7701-72b6-9231ceeaca70.jpeg)

####Step６：完了！

画面右上に「ラーニングインスタンスが正常に更新されました」というメッセージが出ます。
![99_保存完了.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/6233538e-9af8-b5f4-cade-67736d8d1717.jpeg)

以上で項目の追加は完了です！

#このあとは……

以上でIQ Botに対する項目の追加は完了しましたが、この追加された項目に対するマッピングの学習はまだ完了していません。
この画面の「Botの編集」ボタン、または「Bot」タブから、各グループのマッピング学習画面を開き、追加項目に対するマッピングを学習させましょう。
大学生が1週間でFlutterアプリを学んでリリースした過程(6日目)

こんにちはシオンです。


今日で6日目、残すところあと2日となりました。
計画通りに行けば、コードをかけるのは今日が最後の日です。現状としては5画面あるうちの2画面の画面構成まで、処理はひとつもかいていなく、また書き方もわからないため、進捗率としては5%...よくて8%ほどでしょうか。


やばいですね。でも期限はもう決まってしまっているのでやり切りましょう。途中までで終わらないよりも、終わらせる。今回は60点でもいいから終わらせることが大事なのです。


では、時間がないので（本当に！）やっていきます。

#目次
#####■実装する処理の確認
#####■画面遷移を学ぶ
#####■残りの画面を作って画面遷移のルートを繋ぐ
#####■まとめ


#■実装する処理の確認

昨日3画面の実装をしてFlutterでの画面の配置に関してはなんとなくわかってきました。
残り3画面は処理を実装するのと同時にプログラミングしていきます。
今回実装する残りの処理としては
**・画面遷移**
**・入力した文字を読み取って表示**
**・カウントアップ**
この3つです。


実装するためにはどうやって実装すればいいのかを知らなければいけないので、やり方を学んでいきましょう。


#■画面遷移を学ぶ

まず、画面遷移をするためには遷移元の画面と遷移先の画面が必要で、これを行き来することが画面遷移になります。
Flutterではこの画面のことを「ルート(route)」、ルート同士の行き来のことを「ナビゲーション 」というらしいです。
ルートはもう用意できているので、画面遷移を実装するためにはナビゲーションを学べば良さそうです。


見てみたところ、次の画面に行くためにはNavigator.push、前の画面に戻るためにはNavigator.popというメソッドを呼び出せば良いそうです。
つまり、画面遷移をしたいタイミングでボタンを押した時にこのメソッドを呼び出してあげれば完了ですね。
早速やってみます。


1画面目から
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/10ab19e6-68ce-0ec8-6dc6-d64061816a92.png)


2画面目へ
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/78141473-c721-d598-859f-ebf5d2c48265.png)


画像だと全く遷移してるからわからないですね。。
でもできています。しっかりと。
想像してください。
最初の画面で、愚痴を吐き出すボタンを押すと右にスライドして画面遷移し吐き出す画面に、そして左上の矢印をタップすると左にスライドして画面遷移しました。
ぜひ想像してください。（私には画面が遷移する瞬間をスクショで捉えるスキルも時間もありませんでした。）



これで画面遷移ができるようになりました！素直に嬉しいです。プログラミング楽しい笑


#■残りの画面を作って画面遷移のルートを繋ぐ

画面遷移ができたので、最後の画面まで作って一旦表示だけ実装してしまいましょう。



まず3画面目
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/6450884d-a8a7-45d4-dd47-4a776352ab3c.png)


次の画面へ
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/973b16d9-3c46-dd7e-36bc-454ecf51184b.png)

そしてラスト
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/fb447c67-e1c9-cd9d-e1ed-20547c1d2fc7.png)


これで全ての画面を移動することができるようになりました。よしよし。

あとは細かな機能の実装をしていきます。
実装する機能としては
**・2画面目でストレスLvを表示**
**・3画面目に2画面目で入力した愚痴タイトルを表示**
**・乗り越えた数のカウントと保存**
これを実装すれば晴れて完成です！




#■まとめ

なんとか見えてきましたね。ゴールが。
ただ、すみません。明日の朝がどうしても早いので今日はここまでにしておきます。

リリースはできなくても申請は絶対にします。
そして間に合わなかった理由をAppleとGoogleのせいにします。

明日ラストやり切りましょう！
Gemfileにデバッグツールpry-byebugを入れてもデバッグできない時の解決方法（回避）

# RubyOnRails学習のため、Docker、Gemfile使用
動作の確認をしたいため、
Gemfileに**pry-byebug**を導入

```ruby:Gemfile
    group :development do
        ...
        gem 'pry-byebug'
    end
```

コマンドにて、
`docker-compose build`
を実行、そのあと、
`docker-compose up -d`
`docker ps`
でデバッグするファイルを確認。
しかし、デバッグターゲットとなる **xxx_web_1** が表示されない。

# 解決方法（回避）
Gemfileに
**pry-byebug**を導入する代わりに、
**pry-rails**を導入する。

```ruby:Gemfile
    group :development do
        ...
        gem 'pry-rails'
    end
```

コマンドにて、
`docker-compose build`
`docker-compose up -d`
`docker ps`
**xxx_web_1** が表示されたため、
`docker-compose up`で一旦起動。そのあと、
`docker attach xxx_web_1`でデバッグターゲットを設定。

```ruby:コマンド
    web_1  |
    web_1  |      9: def create
    web_1  |  => 10:   binding.pry
    web_1  |     11: end
    web_1  |
```


# 余談
コードにbinding.pryを書いて実行したところ、
ブラウザーで
undefined method `pry' for #Binding:XXXXX
が表示された時も、
**pry-rails**を導入することで、解決できた。
Visual Studio開発環境構築メモ

# 1.コーディング関連

## 1-1.ソースの整形

### dotnet-format

**インストール**

1. スタートメニューから「Developer Command Prompt for VS 2019」を起動。
2. ソリューションフォルダに移動。
3. マニフェストファイルを作成するため、以下を入力する。「dotnet new tool-manifest」
4. 以下を入力し、インストールする。「dotnet tool install dotnet-format」

**実行**

「dotnet format」を入力し、実行する。

### CodeMaid 

### Code Alignment


#2.テスト関連

## 2-1.Nugetのおすすめライブラリ
ChainingAssertion
Moq

# 3.ビルド関連

## 3-1.構成マネージャ

# 4.プロジェクト

## 4-1. クラスライブラリ(.Net Framework)
Windows専用
「参照」がある。

## 4-2. クラスライブラリ(.Net Standard)
Android, iOS, Linux, macOS, WIndows
「参照」の代わりに「依存関係」がある。

## 4-3. クラスライブラリ(.Net Core)
Linux, macOS, Windows
「参照」の代わりに「依存関係」がある。
bundle install時のエラー

# 概要
Railsアプリケーションでgemをbundle installした際に発生したエラーと解消方法について記します。

# 環境
Ruby 2.6.5
Ruby on Rails 6.0.0

# 内容
エラー文

```ruby
An error occurred while installing pg (1.2.3), and Bundler cannot
continue.
Make sure that `gem install pg -v '1.2.3' --source 'https://rubygems.org/'`
succeeds before bundling.
```
と

```
Could not find gem 'pg (>= 0.18, < 2.0)' in any of the gem sources listed in your Gemfile.
```

といったエラーです。

# 解消方法

下記コマンドで解消しました。

```
brew install postgres
```

postgresSQLで引っかかっていたみたいです。
GulpのBrowserSyncとPHPのビルトインサーバを組み合わせる

## 要約

コーディングでBrowserSyncを使うときにPHPも使いたいけど、
さくっとビルトインサーバで実行するのに詰まったのでメモ。
要はBrowserSyncのproxyを使うのと、ビルトインサーバを0.0.0.0で実行したらいけた。

### ビルトインサーバの起動

localhost:8000でもいいかと思ったけどダメだった。
のでlocalhostじゃなくても参照できるよう起動。

```bash
# 先にビルトインサーバ起動。localhostだとproxyが効かない？（効かなかった）
php -S 0.0.0.0:8000
```

BrowserSyncの方はproxyでビルトインサーバを参照するだけ。

```gulpfile.js
// これでlocalhost:3000のリクエストはlocalhost:8000を参照する
browserSync: {
  proxy: 'localhost:8000'
}
```

その他、htmlファイルでPHPを実行したいのもあったので、細かく調整。
ApacheでいうところのAddTypeに相当する実行をするためにrouter.phpを用意して、

```router.php
// .htmlをPHPファイルとして実行する設定
// .htaccess の AddType application/x-httpd-php .html に相当
$path = $_SERVER["SCRIPT_FILENAME"];
if (preg_match("/\.html$/", $path)) {
    chdir(dirname($path));
    return require($path);
}

return false;
```

ビルトインサーバを下記で起動すればOK

```bash
php -S 0.0.0.0:8000 ./router.php
```

これでfor文とかで項目水増し()も楽チン♪（pugを覚える努力を惜しんだ)
【Laravel】Composerを使った環境構築

#Composerを使ってLaravelをローカル環境に構築する。
terminalでapplications/mamp/htdocsに移動する。
composerのcreate-projectコマンドを使ってLarabelをインストールする。

```terminal
composer create-project --prefer-dist laravel/laravel 【ディレクトリ名】
```
※【ディレクトリ名】の部分がフォルダの名前になる。
[Laravelのインストール](https://readouble.com/laravel/7.x/ja/installation.html)
バージョン
---
php:7.3.11
Laravel:7.21.0
[Rails]エラーメッセージの日本語化

# 概要
Railsアプリケーションのエラーメッセージを日本語化する手順を記します。
入植画面で未入力や不備があった場合に出力する下記の様なメッセージです。

<img width="317" alt="bcb5b66aaa2336c94683fe2b94ccc49d.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667535/e589d741-9e2e-1f71-6f8e-6527ad65c987.png">


# 環境
Ruby 2.6.
Ruby on Rails 6.0.0

# 手順
①config/application.rbに記述

```ruby
module Pictweet
 class Application < Rails::Application
   # Initialize configuration defaults for originally generated Rails version.
   config.load_defaults 6.0


   # 日本語の言語設定
   config.i18n.default_locale = :ja
　　# 省略
 end
end
```

②gemfileに記述

```ruby
gem ‘rails-i18n'
```
bundle install実行

※ここまででカラム名以外は日本語になっています。

③config/locales/devise.en.ymlに以下URLのコードをコピペする
https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml

※ここまででdeviseであらかじめ作成されるカラム（emai、password、password確認用）は日本語になっています。

④config/localesにja.yml作成

```ruby
ja:
 activerecord:
   attributes:
     user:
       nickname: ニックネーム
     tweet:
       text: テキスト
       image: 画像
```
この記述で、Nickname、Text、Imageが日本語に翻訳されます！
Vue.js: チェックボックスのイベントにはclickではなくchangeを使う

次のコードを使ってVue.jsのイベント処理を試します。

```vue
<template>
  <ul>
    <li v-for="(item, idx) in items" :key="idx">
      <label>
        <input type="checkbox" v-model="item.checked" @click="clicked(item)">
        {{item.name}}
      </label>
    </li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: 'foo', checked: true  },
        { name: 'bar', checked: false },
        { name: 'baz', checked: false }
      ]
    };
  },
  methods: {
    clicked(item) {
      console.log("clicked");
      console.log(item.checked);
    }
  }
}
</script>
```

チェックされていないチェックボックスをクリックすると、item.checkedはfalseとなります。あれ？チェックしたんだからtrueになるはずでは。

```text
clicked
false
```

Eventオブジェクトを使ってHTML要素を見てみます。

```
<input type="checkbox" v-model="item.checked" @click="clicked($event, item)">
```

```
clicked(event, item) {
  console.log("clicked");
  console.log(item.checked);
  console.log(event.target.checked);
}
```

チェックボックスはチェックされているけど、dataのオブジェクトにはまだ反映されていないようです。

```text
clicked
false
true
```

ならば、nextTickを使えば反映されるのでは、と思いきやfalseのままです。

```
clicked(item) {
  console.log("clicked");
  this.$nextTick(() => {
    console.log(item.checked);
  });
}
```

以上の挙動は、inputイベントを使っても同じです。正解は、clickでもinputでもなくchangeイベントを使うことでした。

```
<input type="checkbox" v-model="item.checked" @change="changed(item)">
```

```
changed(item) {
  console.log("changed");
  console.log(item.checked);
}
```

参考: [vue.js - Vuejs click event from checkbox? - Stack Overflow](https://stackoverflow.com/questions/50506235/vuejs-click-event-from-checkbox/50506564)
FirebaseHostingを使ってflutter-webのデプロイをする

#　やりたかったこと
ローカルでflutter-webのソースをデプロイする。

今回は既存アプリをflutter-webにする場合の手順。

## flutter側の設定

### channelの確認
flutter-webはbetaでしか使えないので、切り替える必要がある。

現在のchannelを確認するコマンドは以下の通り

```zsh
❯ flutter channel
Flutter channels:
  master
  dev
* beta
  stable
```

### channelをbetaに切り替える。
flutterの更新は早いので忘れずにしよう。

```zsh
flutter channel beta
flutter upgrade
flutter config --enable-web
```

### webに必要なファイルを生成する
webディレクトリの中に色々できる。

```zsh
flutter create .
```
### chromeで起動してみる
無事動作することを確認したら

```zsh
flutter run -d chrome
```

最後にweb用のファイルをビルドしよう。

```zsh
flutter build web
```

flutter側の準備はこれでおしまい。

## Firebase Hostingにアップロードするためにすること

```zsh
### ログインする
firebase login 
```
### 初期設定
自分の使うものを選択していけばいいが、気をつけるポイントは2点

#### sparkプランでCloud Functionsを使う
プラン変更しろと怒られるので、とりあえず入れるとかなら選択しないようにしよう
#### Deploy時のフォルダ指定
What do you want to use as your public directory?
デフォルトはpublicだけど、今回はbuild/web

```zsh
firebase init
```

### デプロイする
flutter build webでビルドした事を確認してから以下コマンドを実行。

```zsh
firebase deploy
```

おしまい。
【初心者】環境変数設定-dotenv-rails-

##環境変数とは
環境変数とは、Githubにアップロードすることができない情報を入れておく箱のようなものです。
これにより、アプリケーションに直接パスワードなどを記述しなくとも、
OSからデータを渡す事で、情報漏洩の心配なく、アプリを稼働させる事ができます。


##設定方法
#####gemのインストール
```ruby:Gemfile
gem 'dotenv-rails'
```
```
$ bundle install
```
#####.envファイル作成
Gemfileが置いてあるルートディレクトリに
.envファイルを作成

#####環境変数作成
```
KEY='*******' #使用したいキーやパスワードを
SECRET_KEY='*******'
```
呼び出す時は

```
ENV['KEY']
```
とすれば呼び出せます。

#####Git管理下から除外

```ruyb:.gitignore
/.env
```
これを忘れると情報が漏洩してしまうので忘れずに必ず設定してください。
[備忘録] バッカス・ナウア記法について小メモ(Python言語リファレンス内書式)

# はじめに
[Pythonのリファレンスマニュアル](https://docs.python.org/ja/3/reference/index.html)を読もうとしたとき、初めて``BNF文法記法``という概念に遭遇したので、今後のために小メモを残します。

記号の説明を表にまとめただけのものです。

# 本編

マニュアルの解説では、随所に下記のような書式のコードが登場します。

~~~c:for文の構文
for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]
~~~
([8.3. for 文 - 8. 複合文 (compound statement) — Python 3.8.4 ドキュメント](https://docs.python.org/ja/3/reference/compound_stmts.html#the-for-statement))

Pythonの言語リファレンスには上記のような記法のコードが掲載されています。
これは、[リファレンス内で説明](https://docs.python.org/ja/3/reference/introduction.html#notation)されているように、``BNF文法記法``や``バッカス・ナウア記法``などと呼ばれるものです。


定義、記法の背景は下記のリンクなどで参照できます。
　[バッカス・ナウア記法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AB%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%82%A2%E8%A8%98%E6%B3%95)
　[SYNTAX SUMMARY - Algol-60 BNF](https://web.archive.org/web/20060925132043/https://www.lrz-muenchen.de/~bernhard/Algol-BNF.html)
　[About BNF notation](http://cui.unige.ch/isi/bnf/AboutBNF.html)

"[]" を用いた書式などは、オリジナルの記法を拡張したものです。
Pythonの言語リファレンスでも同様に"[]"が書式に含まれています。

[Pythonのリファレンスマニュアルで説明](https://docs.python.org/ja/3/reference/introduction.html#notation)されている記号の用法を表にまとめます。

| 記号 | 読み |  説明 | 備考 |
|:----:|:----:|:----|:----|
| ::= | - | ＜左式＞は＜右式＞で定義 | - |
| ｜   | 垂直線 | 選択項目の列挙 <br> (左側セル:エスケープの都合で全角文字) | 演算子の優先度は最低 |
| *   | アスタリスク | 直前にくる要素のゼロ個以上の繰り返し | 演算子の結合範囲は可能な限り狭い |
| +   | プラス      | 直前にくる要素の一個以上の繰り返し | 演算子の結合範囲は可能な限り狭い |
| []  | 角括弧      | 字句がゼロ個か一個出現 <br>(要素がオプションである) | - |
| ()  | 丸括弧      | 字句のグループ化 | - |
| ""  | クオート    | リテラル文字列の表記 | - |
[Rails]Formオブジェクト使用時のエラーメッセージ日本語化

# 概要
RailsフリマアプリでFormオブジェクトを実装した部分のみ、日本語化がうまく行かなかったので、解消方法を記します。

# 前提
ja.ymlファイルの作成までは完了している。
Formオブジェクト以外のエラーメッセージについては日本語化ができている。

# 環境
- ruby 2/6/5
- Ruby on Rails 6.0.0

# 内容

`ja.yml`に日本語入力の記述をしても日本語にならない

config/locales/ja.yml

```ruby
ja:
    activerecord:
        attributes:
            user:
                nickname: ニックネーム

            item:
                text: テキスト
                image: 画像
                name: 商品名

            card_address:
                postal_code: 郵便番号
                city: 市区町村
                address: 番地
                phone_number: 電話番号
```

以下の内容に修正し解消しました。

```ruby
ja:
    activerecord:
        attributes:
            user:
                nickname: ニックネーム


            item:
                text: テキスト
                image: 画像
                name: 商品名

    activemodel:
        attributes:
            card_address:
                postal_code: 郵便番号
                city: 市区町村
                address: 番地
                phone_number: 電話番号
```

# 原因
formオブジェクトの記述を行なったforms/card_addressファイルは`ActiveModel`を継承しているファイルだった為、`activerecord:（2行目）`では反映されなかったみたいです。
Pythonのsplitについて、文系初心者にもわかるように説明してみる

Pythonでめっちゃよく使うsplitの処理ですが、初心者向けにさくっとわかる日本語の記事が意外にも見つからなかったので自分で書いてみます。

ちなみに筆者も文系卒のエンジニアです。

#splitとは？

splitは英語で「分割する」という意味で、その名のとおり、**文字列を分割にしてリストにします**。
「**文字列を分割にしてリストにする**」が宇宙語に見えた人も安心してください。ちゃんと説明します。

##文字列とは？
「文字列」はあまり難しく考えず、「言葉」や「文章」みたいなものと思ってください。
"バナナ"も文字列、"りんご"も文字列、"バナナを2つ、りんごを3つ買いました"も文字列です。

##リストって何？

リストとは何かというと、何かしらの情報を入れておくための番号つきのロッカーのようなイメージです。
![リスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/0c1c4a8d-d4a3-1a00-dcde-39fd895498ec.jpeg)
銭湯やスポーツジムに行くと、番号つきのロッカーが並んでいますよね？　あれです。

銭湯やスポーツジムのロッカーは、100番から始まっていたり1000番から始まっていたりしますが、**pythonのリストの場合は番号は必ず0番から始まります。**

##「文字列を分割してリストに入れる」ってどういうこと？

百聞は一見にしかず、ということで、文字列を分割してリストに入れる処理を、実際にpythonでやってみます。

```python:文字列を分割してリストに入れる例
word = "りんごとバナナといちごとみかん"  #←「word」という変数（箱）に入ったこの文字列を……
mylist = word.split("と")             #←「と」という文字のところで切り分けてmylistに入れてね、という意味
print(mylist)                         #←mylistの中身を見せてね、という意味
#すると、["りんご","バナナ","いちご","みかん"] と表示されます。
#         ↑この形が、pythonにおける「リスト」
```

上記の処理の結果得られるmylistの中身は、python的に表現すると`["りんご","バナナ","いちご","みかん"]`という形ですが、イメージは以下のような感じです。
![mylist.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4b0aad37-3587-c752-a8bc-543ac46d7028.jpeg)

「りんご」から「みかん」までが、番号つきのロッカーの中に入っていますね。

#splitした結果を使う

上記の例ではsplitした結果として、「りんご」から「みかん」までをmylistという名前のリスト＝番号つきロッカーに入れました。

この状態で、`リストの名前[番号]`と指定すると、リストの中身を取り出すことができます。

たとえばこんなかんじ。

```python:リストから値を取り出す方法
print(mylist[0])     # mylistの0番の中身を見せてね、という意味　→　「りんご」が表示される
print(mylist[1])     # mylistの1番の中身を見せてね、という意味　→　「バナナ」が表示される
print(mylist[2])     # mylistの2番の中身を見せてね、という意味　→　「いちご」が表示される
print(mylist[3])     # mylistの3番の中身を見せてね、という意味　→　「みかん」が表示される
```


また、pythonならではのおもしろい文法で、「最後から●番目」という指定のしかたもできます。
「最後から●番目」という指定をしたいときは、番号を表す[]の中にマイナスの数字を指定します。

```python:リストから値を取り出す方法（後ろから）
print(mylist[-1])     # mylistの最後から1番目（＝最後）の中身を見せてね、という意味　→　「みかん」が表示される
print(mylist[-2])     # mylistの最後から2番目の中身を見せてね、という意味　→　「いちご」が表示される
print(mylist[-3])     # mylistの最後から3番目の中身を見せてね、という意味　→　「バナナ」が表示される
print(mylist[-4])     # mylistの最後から4番目の中身を見せてね、という意味　→　「りんご」が表示される
```

#いかがでしたか？

splitの仕組みと、結果を取り出す方法について、イメージをつかんでいただけたでしょうか。

この内容が理解できていれば、例えば[口座情報から銀行名だけ・支店名だけを取り出す](https://qiita.com/IQ_Bocchi/items/127aa72bfaf2b2571190)処理でどうしてsplitが使われるのかも理解できると思います。
Railsのlink_toで二次元配列をcontroller側で受け取ると値が変わるので解決方法をメモ

###link_toで二次元配列をパラメータとして渡す時、値が変わってしまい困ったので解決方法をメモ

```index.html.erb
=>[["0", "0", "0"]
   ["0", "0", "0"]
   ["0", "0", "0"]],
```
link_toでこのような二重配列を
Controllerに渡してparams[:~]で受け取ろうとすると

```
=>[["0"], ["0"], ["0"]
   ["0"], ["0"], ["0"]
   ["0"], ["0"], ["0"]],
```
このように全て分割されて渡されるのでこれを直した方法をメモしておく

```
params[:~].flatten!
/多次元配列を一次元配列に直す
~.each_slice(3).to_a
/配列を引数の要素数で分割する
```
これでもとの二次元配列として操作できるようになった。

もしもっとベストな方法があればコメントいただけるとありがたいです。
Windows10 ユーザフォルダのドライブ指定 その2（インストール時/インストール後）

# はじめに

この記事はタイトルに「その2」とあるように、[前記事](https://qiita.com/nak435/items/8681dff8478fa6f9a2ed)からの派生である。
我が家に2012年より稼働しているWindowsのPCがある。必要なデータをバックアップしてからクリーンインストール、前記事の方法でユーザフォルダを**Dドライブ**に移すことにした。しかし、下記のエラーとなり上手くいかない。前記事でセットアップしたPCから同ファイルをコピーしてみたが、現象は同じ。
![IMG_4667.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b66dac2b-9ab5-a2c9-1665-341d067e06af.jpeg)
結局、この方法は諦めて、今回の「その2」の方法を選択した次第である。折角なので、この方法もここに記録しておく。

## 方法.1

次にトライしたのが、前記事で触れた「[**Relocating Users folder on an existing Windows installation**](https://www.tenforums.com/tutorials/1964-move-users-folder-location-windows-10-a.html#MethodTwo)」である。しかし、手持ちのWindows PEのUSBには、"x:\source\install.win"が無く、ここで説明されている手順通りに実施できないことが分かり断念（また、WinPEの作成にも時間を要しそうだったので）。

## 方法.2

こちらの「[**Move the Users folder in Windows 10, Windows 8 and Windows 7**](https://winaero.com/blog/move-the-users-folder-in-windows-10-windows-8-and-windows-7/)」にある、別ドライブへリンクを張る方法。普通にインストール後にジャンクションリンク（C:\Users **→** D:\Users）によって、実質の保存先を**Dドライブ**とする内容。しかし、再起動後、プロファイルが読み込めないというエラーとなり、Windowsにログインできない。
どうも最新のWindows10（今回はversion 2004）は、このリンク方式は使えないらしい。
（そもそもこのサイトの手順6で説明しているmklinkコマンドのオペランドがまるっきり逆なことに注意）


## 方法.3

他に手が無いかネットをググったところ「[**Windows 10でUsersフォルダを別ドライブへ移動する方法**](https://www.nuits.jp/entry/windows10-relocate-users)」を見つけた。しかも日本の方が書いた日本語のサイト。内容は前記事で書いたクリーンインストールの途中で打ったSysPrepコマンドを、一旦インストールが終わった後で打つ方法で、やること自体は丸っきり同じ。
最初のクリーンインストールでは**ダミーのローカルアカウントを指定する**ことと、**Wifi/LANに接続せず完全にスタンドアローンで設定する**こと。
前記事より、むしろこの方法の方がPC初心者にも分かり易い。

手順を示しておく。

### step.0 クリーンインストール

普通にクリーンインストールを完了させる。ただし、ここで指定するユーザー（アカウント）はローカルアカウントのダミーとする。（最終的にこのダミーアカウントは削除する）


### step.1 無人応答ファイルの作成〜SysPrepコマンドを打つ

前記事の「[3.3 無人応答ファイル（unattended answer file）の作成](https://qiita.com/nak435/items/8681dff8478fa6f9a2ed#33-無人応答ファイルunattended-answer-fileの作成)」から「[3.4 SysPrepコマンドを打つ](https://qiita.com/nak435/items/8681dff8478fa6f9a2ed#34-sysprepコマンドを打つ)」を実施。

### step.2 インストールの再開

SysPrepコマンドを投入すると、**Dドライブ**へのコピーが完了後にリブートされインストールが再開される。ここでは本来のユーザー（アカウント）を指定する。
一通りの設定作業が完了すれば、ユーザフォルダの**Dドライブ**移行は完了。

### step.3 ダミーアカウントを削除

Windowsにログイン後、先のダミーアカウントを削除する。
以上で作業は完了。



# 最後に

上記方法で、使い込んだWindows10のユーザフォルダも移すことができるが、**C:\Users**全体を**Dドライブ**にコピーする時間がかかるので覚悟が必要。（容量次第だが数時間かかる）
以上
rubyでドローポーカーを作ってみる～実装編4（山札）～

## 概要

[rubyでドローポーカーを作ってみる～準備編～](https://qiita.com/r12tkmt/items/56a60f2d69226b2bdcf2)
↓
[rubyでドローポーカーを作ってみる～test-unit準備編～](https://qiita.com/r12tkmt/items/48940d0e09a77d210bf2)
↓
[rubyでドローポーカーを作ってみる～実装編1（カード）～](https://qiita.com/r12tkmt/items/175aa66fd91995f13524)
↓
[rubyでドローポーカーを作ってみる～実装編2（役）～](https://qiita.com/r12tkmt/items/cd22e04eb102eabf03cd)
↓
[rubyでドローポーカーを作ってみる～実装編3（プレイヤー）～](https://qiita.com/r12tkmt/items/ae44086d9bf7d01e7572)
に続いて。

ソース: https://github.com/rytkmt/ruby_poker

## 山札の実装

はい、では今回も同じくまずは要件の整理からいきます。

- はじめは13 x 4のカードを全て使用して山札を作成する
  - カードの並び順はばらばら
- 手札交換を行って不要になったカードは回収する
- 山札から任意の枚数をドローする
  - ドローする枚数が足りなくなった場合、手札交換にて不要になったカードをまぜてシャッフルしてそこから引く

という感じですかね。

### プレイヤーの手札交換の修正

ここで気づいてしまいましたが、前回のプレイヤーの実装にて手札交換でただ手札のカードから削除するだけと実装してしまっていたため
捨てるカードを回収するように修正します・・

```diff:ruby_poker/player.rb
    def change(indexes:, new_cards:)
       raise(ArgumentError) unless indexes.size == new_cards.size
       raise(ArgumentError) unless indexes.all? { |i| (0..4).include?(i) }
-      indexes.sort.reverse_each { |i| @cards.delete_at(i) }
+      trushed = indexes.sort.reverse.each_with_object([]) { |i, trushed| trushed << @cards.delete_at(i) }
       @cards += new_cards
       @hand = Hand.new(cards: @cards)
+      trushed
     end
```

### 山札の作成

```ruby:ruby_poker/deck.rb
module RubyPoker
  class Deck
    def initialize
      @cards = init_cards
      @trushed = []
    end
  private

    def init_cards
      RubyPoker::SUITS.each_with_object([]) do |suit, cards|
        cards.concat(
          RubyPoker::NUMBERS.map { |number| Card.new(suit: suit, number: number) }
        )
      end.shuffle
    end
  end
end
```

始め、each_with_object内で`+=`を使って実装したのですが、よくよく考えるとこれは`+`で結合したものを`=`で変数代入してるので同一の変数に結合した別オブジェクトを格納しているだけで、破壊的な変更を行っているわけではないのでうまくいかなかったです。

破壊的にcardsを変更するために`concat`を使います。

### 手札交換によるカードの回収

プレイヤーの`#change`にて返ってきた不要カードを回収して保持しておくだけなので簡単です

```ruby:ruby_poker/deck.rb
    def trush(cards:)
      @trushed += cards
    end
```

### カードのドロー

> - 山札から任意の枚数をドローする
  - ドローする枚数が足りなくなった場合、手札交換にて不要になったカードをまぜてシャッフルしてそこから引く

```ruby/ruby_poker/deck.rb
    def draw(count:)
      merge_trushed if @cards.size < count
      raise(ArgumentError, "No cards.") if @cards.size < count
      @cards.shift(count)
    end

  private

    def merge_trushed
      @cards += @trushed
      @cards.shuffle!
      @trushed = []
    end
```

足りなくなるってプレイ人数の設定がイケてないだけな気がするので、そこは起こらない前提でエラーを吐くようにしました。

## 終わりに

山札もシンプルでしたね。
これで次こそゲーム進行回りの実装に入れるかな？と思います。

完成も近づいてきました。4連休で終わらせてしまいたいですし最後までやってしまいます。
探索的データ分析の第一歩に便利なpandas-profilingの導入と概要

# はじめに
機械学習のデータの前処理工程において、pandas等を用いて、いろいろとデータを眺めながら探索的データ分析をすると思いますが、データの可視化を1コマンドで簡単にやってくれるツール｢pandas-profiling｣というものがあるので、それを紹介します。

# 導入
```:ターミナル
$ pip install pandas-profiling
```
#ライブラリインポート
```python:
import pandas as pd
import pandas_profiling as pdp
```

#仕様
タイタニックのデータで試してみます。タイタニックがわからない人は｢kaggle タイタニック｣で調べて下さい。

```python:
dataframe = pd.read_csv('train.csv')
```
コマンドは1文のみです。

```python:
pdp.ProfileReport(dataframe)
```
出力結果は結構なボリュームなのでhtmlファイルに落とす方が見やすいです。

```python:
html = pdp.ProfileReport(dataframe)
html.to_file(output_file='dump.html')
```
#アウトプット
##Overview
データの概要を教えてくれます。列数（Number of variables）、行数（Number of observations）、欠損値数（Missing cells）、重複列（Duplicate rows）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/cb1932eb-890b-d563-2f1a-2f205a5d3ae5.png)

##Variables
各項目（列）毎のデータ概要を教えてくれます。年齢（Age）のアウトプット例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/bc27af7a-f907-d3b6-a1a5-32a60b97e0c4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/b7ae29d1-4019-92f1-406c-b144605ab5b4.png)

##Interactions
列と列の関係を教えてくれます。年齢と運賃のアウトプット例です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/e764adcd-c0dd-629e-719f-4f445408640a.png)

##Correlations
列と列との相関を教えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/7fab0d42-8bc0-bfd2-16ed-754483a52b51.png)

##Missing values
欠損値の情報を教えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/d62e80f0-8918-c948-49a7-ce99594479fc.png)

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
【Flutter】Routeがうまく動作しなかったのを解決！


ルーティングで 下記のように設定したにもかかわらず、

```dart

routes: <String, WidgetBuilder>{
  '/': (_) => new Home(),
  '/register': (_) => new Register(),
  '/list': (_) => new List(),
},
```

このコードで、なぜかページ遷移できませんでした。

```dart

Navigator.of(context).pushNamed("/record")
```

これの問題がわかって、解決したので、記事に残しておきます！

# 問題

問題は`MaterialApp`が2個あったことでした。

Mainのクラスはこうなっています

```dart

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override

  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      routes: <String, WidgetBuilder>{
        '/': (_) => new Home(),
        '/register': (_) => new Register(),
        '/list': (_) => new List(),
      },
    );
  }
}
```

で、肝心のListクラスはこうなっていました。


```dart

class List extends StatelessWidget {
 @override

  Widget build(BuildContext context) {
   return MaterialApp(
     debugShowCheckedModeBanner: false,
     home: Scaffold(
       appBar: Header(),
       drawer: CustomDrawer(),
       body: Container(
       .
       .
       .
       ),
       bottomNavigationBar: Footer()
     ),
   );
 }
}

```

見ての通りMaterialAppが2つあります。これが原因でした。


# 解決策

Listの方のMaterialAppを削除します

```
class List extends StatelessWidget {
  @override

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: Header(),
      drawer: CustomDrawer(),
      body: Container(
      .
      .
      .
      ),
      bottomNavigationBar: Footer()
    );
  }
}
```

これでルーティングが正常に動くようになります。
C# で Json を扱う

# はじめに
以前は `Newtonsoft.Json` を使っていたが、現在は `System.Core` の `3.0` 以降であれば `System.Text.Json` があるとの事。
[System.Text.Json 名前空間 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.text.json?view=netcore-3.0)

とりあえず実際に使った内容などの覚書のため、今後新たに知った事は追記して行く。

## 記事記載時の環境など
```
Microsoft Visual Studio Community 2019
Version 16.6.3

Windows Forms App(.NET Core)
```

`.NET Framework` での場合、NuGetパッケージからインストールする必要があるので `Json` なりで検索して `System.Text.Json` をインストールする。

# 基本
次のようなクラスがあったとする。

```C#
public class Hoge
{
    public int id { get; set; }
    public string name { get; set; }
}
```

Jsonの内容は次の通り。

```Json:hoge.json
{
    "id": 1,
    "name": "hoge"
}
```


## JSONデータをクラスに取り込む（デシリアライズ）
```C#
using System.Text.Json;

var json = File.ReadAllText(@"C:\hoge.json");
var hoge = JsonSerializer.Deserialize<Hoge>(json);
```

## クラスの内容をJSON文字列にする（シリアライズ）
```C#
using System.Text.Json;

var hoge = new Hoge();
hoge.id = 1;
hoge.name = "hoge";
var json = JsonSerializer.Serialize<Hoge>(hoge);
File.WriteAllText(@"C:\hoge.json", json);
```

# オプション指定について
必要に応じて組合せて使用する。

## enum を扱えるようにする（enum を文字列として扱う）
```C#
public enum HogeType
{
    HOGE,
    GEHO
}

public class Hoge
{
    public HogeType type { get; set; }
    public int id { get; set; }
    public string name { get; set; }
}
```
```C#
using System.Text.Json;
using System.Text.Json.Serialization;

var options = new JsonSerializerOptions();
options.Converters.Add(new JsonStringEnumConverter());

// デシリアライズ
var hoge = JsonSerializer.Deserialize<Hoge>(File.ReadAllText(@"C:\hoge.json"), options);

// シリアライズ
var json = JsonSerializer.Serialize<Hoge>(hoge, options);
File.WriteAllText(@"C:\hoge.json", json);
```
```json:オプション未指定時
{"type":0,"id":1,"name":"hoge"}
```
```json:オプション指定時
{"type":"HOGE","id":1,"name":"hoge"}
```


## 文字をエスケープしない
通常、シリアライズすると次のよう日本語などはエスケープされる。

```C#
var hoge = new Hoge();
hoge.type = HogeType.HOGE;
hoge.id = 1;
hoge.name = "ほげ";
var json = JsonSerializer.Serialize<Hoge>(hoge);
File.WriteAllText(@"C:\hoge.json", json);
```
```json:hoge.json
{"type":0,"id":1,"name":"\u307B\u3052"}
```

次のオプション指定を行う。

```C#
using System.Text.Json;
using System.Text.Encodings.Web;
using System.Text.Unicode;

var options = new JsonSerializerOptions();
options.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);

var json = JsonSerializer.Serialize<Hoge>(hoge, options);
File.WriteAllText(@"C:\hoge.json", json);

```
```json:hoge.json
{"type":0,"id":1,"name":"ほげ"}
```

## 結果をフォーマットする（インデントする）
```
options.WriteIndented = true;
```


# 参考にしたサイトなど
- [C# を使用して JSON をシリアル化および逆シリアル化する方法 - .NET | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-how-to)
LinuxのコマンドってなんでPATHを書かなくても実行できるんだ？

# はじめに
最近Linuxを触っている時に、`ls,cd,pwd`とかのコマンドってなんで実行ファイルまでのPATHを書かなくても実行できるんだと思ったのがこの記事を書くきっかけになりました。

# 目次
1. 環境変数
2. PATHを通す

# 1. 環境変数
PATHの話をする前にまずこの環境変数について触れなければなりません。
> 環境変数とは、OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。 プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために用いられる。(IT用語辞典 e-Words)

簡単に言えば、ユーザーごとに変数にある値を設定することができるし、コンピュータ全体にも設定することができるって感じです。

では、どのように環境変数を設定するかと言うと

```bash

$ NAME=Tanaka
$ export NAME
    # or
$ export NAME=Tanaka
```
このようにしてLinuxでは環境変数を設定することが出来ます。
しかし、この状態では永続的には環境変数を保存することが出来ません。なのでここで`~/.bash_profile`に環境変数を設定しなければいけません。

```bash
#.bash_profile

NAME='Tanaka'
export NAME
```

こうすることで、永続的に環境変数を設定することができます。
`soruce ~/.bash_profile`とすることで、ログアウトしてログインせずに反映させることだできる。

# 2. PATHを通す
さて、この記事の本題であるls,pwd,cdといったLinuxのコマンドがPATHを通さずに実行することが出来るかというと、環境変数にPATHを設定しているということです。

```bash

$ echo $PATH
# 現在の変数PATHに設定している状態が表示される
# 例)　/usr/bin:/usr/local/sbin など 
```
このPATHに対して設定することでls,cd,pwdなどがPATHを通さずに使用することが出来るのです。

```bash
# ~/bash_profile
PATH="$PATH:/usr/bin"
export PATH
```

# まとめ

普段何気なく使っていた`ls,cd,pwd,yum`などがPATHを通さずに使えた理由が環境変数のPTAHに通すことで使用出来ているのです。何かの実行ファイルをダウンロードしてきた時にPATHを通す処理何かはそういことです。

次回は、詳しく触れなかった`~/.bash_profile`や`source`コマンドについて記事を書いていきたいと思っています。

# 参考資料

https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015
【Nuxt.js】mixin実践編：Sass & mixinで簡単メディアクエリ

🎈 この記事はWP専用です
https://wp.me/pc9NHC-sl

# 前置き
Sass変数とmixinを使って
レスポンシブ 対応を簡単に管理していきます✨

スタイルを当てるごとに毎回
@media screen and (max-width: 480px)
などと書き足していくのは面倒ですよね？

これが@includeだけ書けばよくなります！
また、pxを変数化して共通化&変更が
とっっっても簡単になります💕

mixinについてはこちら
https://wp.me/pc9NHC-s6

Sassの導入方法、変数の使い方はこちら
https://wp.me/pc9NHC-sc

# 簡単な使い方
メディアクエリ をやる前に！
まずはSassとmixinを使った簡単な例をどうぞ🙋‍♀️

## 引数を$変数にする

変数名(変数に設定された値)を
引数で上書きできるやり方。

ただこれならmixin使わずとも
タグ別に普通の共通cssで指定しとけば良いです🙆‍♀️

今回はSassとmixinを簡単に
理解するためだけのサンプルです💡

<img width="745" alt="スクリーンショット-2020-07-14-10.30.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/6ea6e99a-3105-71d4-5dfd-f6d6dff7efef.png">

```nuxt.config.js
export default {
 styleResources: {
   scss: [
     '@/assets/scss/_mixin.scss',
   ]
 },
}
```

```mixin.scss
@mixin hoge($color: pink, $fSize: 32px) {
 color: $color;
 font-size: $fSize;
}
```

【index.vue】

デフォルトをred, 20pxでマージしています。
引数を渡さなければデフォルトが適応されます。

コンフリクトが起きた場合のマージ
https://wp.me/pc9NHC-s6

```index.vue
<template>
 <div class="page">
   <p>Hello Nuxt.js!</p>
 </div>
</template>

<script>
export default {
}
</script>

<style lang="scss" scoped>
 .page {
   padding: 20px;
   @include hoge(red, 20px)
 }
</style>
```

# メディアクエリ 
ではメディアクエリ をやっていきましょう！

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-sl
WPA2-PSK(WPA2 Pre-Shared Key)

応用情報技術者令和元年秋期 午前問39

無線LAN環境におけるWPA2-PSKの機能はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0f850b30-7205-b60d-537d-308a2af5dff5.png)


１、**WPA2-PSK**(WPA2 Pre-Shared Key)は、
無線LANの暗号化方式の規格であるWPA2のうち個人宅やスモールオフィスなどの比較的小規模なネットワークで使用されることを想定した**パーソナルモード**です。
このモードではアクセスポイントと端末間で事前に8文字から63文字から成るパスフレーズ(PSK:Pre-Shared Key)を共有しておき、そのパスフレーズとSSIDによって端末の認証を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fb064c94-4fc6-6ef8-7648-88c7c179f61f.png)

　・無線LANの規格IEEE 802.11の機能:無線LANではアクセスポイントと同じSSIDをもつ端末としか通信できない。
※SSID（＝アクセスポイント）

例え、我々は使っているPocketWifiのアクセスはWPA2-PSK+IEEE802.11nですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b75fcf33-8cab-f727-fff3-e8d22686b215.png)


２、認証にパスワードでなくIEEE802.1Xに準拠した認証サーバを使用する方式は「**WPA2 エンタープライズモード**」と呼ばれます。



参照：
https://www.ap-siken.com/kakomon/27_aki/q39.html

https://www.ap-siken.com/kakomon/29_haru/q42.html
ユーザーIDを指定して◯日前のセッション数が見たい

#実現したいこと

叶えたかったことは以下の通り。

- 特定のユーザーIDに絞り、セッション数が見たい
- 日付は常に「◯日前」と指定したい
    - 日次でクエリを更新してスプレッドシートに反映させる、という流れを作りたかったため
- 出力する日付は指定したフォーマットにしたい
    - 諸事情により。

# 作成したクエリ
```
SELECT
    user_id,
    FORMAT_DATE("%Y/%m/%d", CAST(CONCAT(SUBSTR(event_date, 1, 4), '-', SUBSTR(event_date, 5, 2), '-', SUBSTR(event_date, 7, 2) ) as DATE)) as event_date,
    count(distinct (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_number')) AS ga_session_count
FROM
    `テーブル名`
WHERE
    _TABLE_SUFFIX = FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 2 DAY))
    and user_id in ("10001, 10002, 10003......")
GROUP BY user_id, event_date
ORDER BY user_id;
```

#自分用 - 何がおこってるかメモ
```
SELECT
    -- ▼ まずはユーザーIDがほしい
    user_id,
    -- ▼ 日付の型を変換しないとFORMAT_DATEが使えないっぽい。「参照」に記載しているリンクから拝借。
    FORMAT_DATE("%Y/%m/%d", CAST(CONCAT(SUBSTR(event_date, 1, 4), '-', SUBSTR(event_date, 5, 2), '-', SUBSTR(event_date, 7, 2) ) as DATE)) as event_date,
    -- ▼ 「その日のセッションが何回あったか」をカウントするには ga_session_number を数えればよさそう
    count(distinct (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_number')) AS ga_session_count
FROM
    `テーブル名`
WHERE
    -- ▼ 欲しい日付は「◯日前」指定なので、CURRENT_DATE に対して「◯日前」という指定をしてみた。以下は「2日前」を指定。
    _TABLE_SUFFIX = FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 2 DAY))
    -- ▼ 欲しいユーザーの対象をここで絞る
    and user_id in ("10001, 10002, 10003......")
-- ▼ 同じユーザーIDと日付が出るので、重複する行はまとめる
GROUP BY user_id, event_date
ORDER BY user_id;
```

#参照
[BigQueryでstring型の文字列からdate型の日付に変換する方法](https://tabi-engine.com/bq_string2date)

---

BigQueryビギナーなので、間違ってたりもっと良いやり方があったりしたら教えてください🙌
【インジケーター】現物と無期限先物の乖離から加熱感を測ろう（bitMEX、binance、FTX）

#はじめに

こんにちは！[くりぷ(@CRYPTANNEWS)](https://twitter.com/CRYPTANNEWS)です。

ビットコインのトレードにおいて、大手デリバディブ取引所の加熱感は重要な指標となります。
そこで、bitMEX、Binance、FTXの現物（インデックス価格）と無期限先物価格の乖離を可視化しました。

0より上に乖離している時は、現物価格よりも無期限先物価格の方が高く、買いが加熱していることを示します。
0より下に乖離している時は、現物価格よりも無期限先物価格の方が低く、売りが加熱していることを示します。


※[Tradingview](https://jp.tradingview.com/gopro/?share_your_love=CRIPU)というWEBブラウザチャートツールでを利用したインジケータです。

＞＞[Tradingviewはこちら](https://jp.tradingview.com/gopro/?share_your_love=CRIPU)（無料プランで大丈夫です）
為替・株式・商品・仮想通貨など幅広い市場が用意されています。


#Kairi

![Kairi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615698/0ff82afb-d0df-863b-a70e-c75f38a54ed9.png)

##bitMEX

インデックス価格（XBT）と無期限先物価格の乖離です。

```//@version=3

study("MEX Kairi",precision=3)

FX = security("BITMEX:XBTUSD",period,close)
SPOT = security("BITMEX:XBT",period,close)

KAIRI = (FX - SPOT) / SPOT *100

plot(KAIRI,linewidth=1,style=area, color=#40e0d0,transp=20)
hline(0.1, title="Zero Line", linestyle=dotted, color=#d3d3d3)
hline(-0.1, title="Zero Line", linestyle=dotted, color=#d3d3d3)
```

##binance

binance現物価格（BTCUSDT）と無期限先物価格の乖離です。

```
//@version=3
study("binance Kairi",precision=3)

FX = security("BINANCE:BTCUSDTPERP",period,close)
SPOT = security("BINANCE:BTCUSDT",period,close)

KAIRI = (FX - SPOT) / SPOT *100

plot(KAIRI,linewidth=1, style=area, color=#ffd700,transp=20)
hline(0.1, title="Zero Line", linestyle=dotted, color=#d3d3d3)
hline(-0.1, title="Zero Line", linestyle=dotted, color=#d3d3d3)
```

##[FTX](https://ftx.com/#a=FeeDiscountLinkCode)

bitMEXのインデックス価格と無期限先物価格の乖離です。
FTXのインデックス価格との乖離ではないです。

```
//@version=3

study("FTX Kairi",precision=3)

FX = security("FTX:BTCPERP",period,close)
SPOT = security("BITMEX:XBT",period,close)

KAIRI = (FX - SPOT) / SPOT *100

plot(KAIRI,linewidth=1, style=area, color=#9acd32,transp=20)
hline(0.1, title="Zero Line", linestyle=dotted, color=#d3d3d3)
hline(-0.1, title="Zero Line", linestyle=dotted, color=#d3d3d3)
```


#Tradingviewに追加するには

コードをコピーして、tradingview下部の『pineエディタ』エリアにペーストしてください。
※pineスクリプトエリアに何か記載されている場合は、それを全て消去してからペーストをしてください。

「保存」をして「チャートに追加」をクリックしてください。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615698/ffa6724f-1cc3-6808-773e-f0dabee77261.png)


以上でインジケータが追加されます。
【Flutter】画面遷移で値を渡す

# はじめに
画面遷移の基本的な実装方法については、こちらの記事を書きました。
[【Flutter】画面遷移を実装する](https://qiita.com/tty_0/items/29500c70a67fd5d6d498)

# 実装
### 大まかな流れ
1. 遷移元から渡ってきた値を保持するための変数を宣言する
2. 画面遷移処理時に、遷移先に渡す値をセットする

## 1.遷移元から渡ってきた値を保持するための変数を宣言する
```dart
class SecondScreen extends StatelessWidget {
  // 遷移元から渡ってくる値を保持する変数
  final String text;

  SecondScreen({this.text});

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
```
**finalで宣言された変数は再代入不可。(型名は省力可能)**

## 2. 画面遷移処理時に、遷移先に渡す値をセットする
```dart
Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) {
      return SecondScreen(text: 'ここに渡す値を入れる');
    },
  ),                  
);
```

## サンプルコード
### 遷移元
```dart
class FirstScreen extends StatefulWidget {
  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  String text;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Padding(
        padding: EdgeInsets.all(30.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Padding(
              padding: EdgeInsets.only(top: 50, bottom: 10),
              child: TextField(
                onChanged: (value) {
                  setState(() {
                    // 入力した値をセット
                    text = value;
                  });
                },
              ),
            ),
            FlatButton(
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) {
                      // 次の画面に値を渡す
                      return SecondScreen(text: text);
                    },
                  ),
                );
              },
              color: Colors.blue,
              child: Text(
                '次の画面へ',
                style: TextStyle(color: Colors.white),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
```
### 遷移先
```dart
class SecondScreen extends StatelessWidget {
  final String text;

  SecondScreen({this.text});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(text),
            FlatButton(
              color: Colors.blue,
              child: Text(
                '戻る',
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        ),
      ),
    );
  }
}
```
こちらのサンプルコードをコピペしていただければ、動きを確認できます。