OmniAICreator/Qiita-1.07M huggingface dataset:
再帰を教えてもらった話

**※だいたい実話です。師匠がた、ありがとうございました。**

# 35歳無職ワイ
ワイ「今日もやる事ないわ〜」

ガチャッ。

師匠（26歳）「就職活動は進んどるんか」

ワイ「！？」
ワイ「はい！**quiza**という、プログラミングのテストを受けてそのランクを元に企業からスカウトが来るサイトで頑張ってます〜！」
ワイ「（酒飲まん日はな）」

師匠「ほんまか。ああいったサイトで問題を解くなら**再帰**を使えるようにしておくとすんなり解けることがあるで」

ワイ「はあ、そうでっか」

師匠「**再帰**は知っとるか」

ワイ「**ワイがまた働き始めること**でっか」

師匠「それは**再起**や」

ワイ「はい」

師匠「**再帰**いうんは、関数の中でその関数自身を使うことや」
師匠「正しくは**再帰呼出し**やな」

ワイ「そんな事したら無限ループになりまへんか」
ワイ「自分自身に手紙を書いて、その中に・・・」

> 前へ一歩進め。
> そのあと、この手紙を初めから読み直せ。

ワイ「・・・って書いてあるようなもんやないですか」
ワイ「永遠に歩き続けなあきませんやん」

師匠「お前、意外と頭ええな」
師匠「せやから、終了条件を決めておかなあかん」

ワイ「はあ」

#試しにやってみる
師匠「ほな試しに**階乗**を求める関数を書いてみい」

ワイ「階乗・・・5×4×3×2×1みたいなやつですか」

師匠「せや。言語は**Ruby**でな」

```rb
def kaijo(n)
  #処理内容
end

puts kaijo(5)
```

師匠「こんな感じで使えるやつを書いてみるんや」

ワイ「ほなfor文でiを1ずつ増やすか減らすかしながら掛けていく感じですか」

師匠「それやと**再帰呼出し**をせえへんやろ」
師匠「**再帰**を使ってやってみるんや」

ワイ「ええと、kaijoっていう関数の中でkaijoを呼ぶと、そのkaijoの中でもkaijoが呼ばれるから・・・」
ワイ「アカン。**夢の中の夢の中の夢の中の**・・・みたいになって想像できまへん」

師匠「それが意外と簡単なんや」
師匠「5の階乗いうんは、**5**に対して**4の階乗**を掛ければ求まるんや」

ワイ「まあ、それが階乗ですから」

師匠「そしてその4の階乗いうんは、**4**に対して**3の階乗**を掛ければ求まるんや」

ワイ「はあ」

師匠「つまり階乗いうんは、**元の数字**に対して**（元の数字-1）の階乗**を掛けたもんなんや」
師匠「それが階乗の**定義**や」

ワイ「階乗を定義するのに**階乗**って言葉を使ってますやん」
ワイ「せやから、定義自体が**再帰**してますやんwww」

師匠「せや」

ワイ「えっ」

師匠「それが**再帰**のコツや！」
師匠「それをそのまま書くだけや」

```rb
def kaijo(n)
  return n * kaijo(n - 1)
end

puts kaijo(5)
```

師匠「基本はこれだけや」
師匠「5の階乗を求めるために、関数**kaijo**はさっきの定義どおり**5 * (4の階乗)**を返すんや」

ワイ「kaijoが完成してないのに、kaijoの中でkaijoを使うんでっか」

師匠「せや、自分自身を使う事でkaijoは完成するんや」
師匠「せやけど、さっきも言うた通り**終了条件**を決めておかんと**無限ループ**になってまう」
師匠「階乗の**終了条件**は何やと思う？」

ワイ「5×4×3×2×1やから、1が来た時が終了ポイントですわ」

師匠「そうや」
師匠「せやから、こうや」

```rb
def kaijo(n)
  if n == 1
    # nが1の時は、再帰せずそのまま1を返す
    return n
  end
  # それ以外は再帰呼出しをする
  return n * kaijo(n - 1)
end

puts kaijo(5)
```

ワイ「ちょっとスマホアプリの**どこでもRuby**で試してみますわ」
ワイ「どこでもRuby〜！」
ワイ「実行、と」

どこでもRuby「実行結果：120」

ワイ「ホンマや！合ってるわ！（知らんけど）」

# まとめ

師匠「まず5の階乗を求めるのに、4の階乗を求める」
師匠「その4の階乗を求めるのに、3の階乗を求める」
師匠「その3の階乗を求めるのに、2の階乗を求める」
師匠「その2の階乗を求めるのに、1の階乗を求める」
師匠「1の階乗は1って決まっとるからそのまま1を返す」

```rb
kaijo(5)
# ↓↓↓
5 * kaijo(4)
# ↓↓↓
5 * 4 * kaijo(3)
# ↓↓↓
5 * 4 * 3 * kaijo(2)
# ↓↓↓
5 * 4 * 3 * 2 * kaijo(1)
# ↓↓↓
5 * 4 * 3 * 2 * 1
```

師匠「こんな感じで、返す値の後ろのほうが段々と変身していく感じや」

ワイ「おお〜、再帰してますやん」

師匠「**再帰**を使うと一見複雑なゲームが一瞬で解けたりもするで」
師匠「なんてったって**定義をそのまま関数に書くだけ**やからな」
師匠「合計の数を変数に入れて覚えておく必要すらあらへん」

ワイ「ホンマや。変数使ってへん」

師匠「あとは終了条件をif文で書くだけや」
師匠「（ホンマはもう少し別のパターンもあるけどな）」

ワイ「分かりました！」
ワイ「なんか感動しましたわ」
ワイ「再帰ってカッコエエ・・・再帰ハンパないわ・・・」

師匠「ええからおまえも早く**再起**せぇや」
[UIPath] 文字列にエスケープ文字を入れる方法

## エスケープ文字を入れるときの文字列

パスにスペースが含まれる場合のコマンドを入力したいとき
xcopy /e C:\1. test01 C:\2.result01
↓
空白が含まれるバスのみを“”“ ”””で囲むことで""が文字列として認識される
“xcopy /e " & “”“C:\1. test01””” & " C:\2.result01"

#### 追記：
全てを囲むと上手く動作しなかった
“”“xcopy /e C:\1. test01 C:\2.result01”””
職場で使用した正規表現


#正規表現

```
\{\$FM\.M40\[[0-9]+\]\.quiztext\}
```


##^1 先頭が1のファイルを変換する(〇〇第一弾、〇〇第二弾などのように処理は、同じで違うテンプレートファイルを作成する時などに使用。)

```
^1 2
```


#$や.や[]や{などは、エスケープする(M40などのテーブル(本番運用中)を違うテーブル(同じ構成のテーブル)からとってくる時に使用)

```
<a href="./\?md=B110&amp;questioncode=\{\$FM\.M41\[[0-9]+\]\.questioncode\}">
```


#ifで」始まってifで終わるものを検索する

```
\{if(.|[\n])+\/if\}
```
ちょうどいい.vimrc

ガチの開発マシンではないけど、サーバ上でちょっとしたファイルをいじるときの、.vimrc の設定。 ちょっとしたファイルとは言うものの、ruby スクリプトをいじることはすごく多いという人向け。

```.vimrc
"WSLTTY向け設定
set term=screen-256color
"-----------------------------
" apperance
"-----------------------------
set title "タイトルをウィンドウ枠に表示
set number "行番号を表示する
set title "編集中のファイル名を表示（タブに表示される）
set showmatch "カッコ入力時に対応するカッコに一瞬フォーカスを映して強調
set smartindent "改行の時に、インデントに合わせて次の行の開始をオートインデントする
set expandtab "挿入モードでTabキーを押したら半角スペースが入力されるようにする
set tabstop=2 "インデントをスペース2つ分に設定"
set shiftwidth=2 "インデントを半角スペース2文字に指定
set nrformats= "vimで数を増減するときに10進数として扱う(右辺は空でOK)
set hlsearch "検索時に対象文字列をハイライトする
set incsearch "インクリメントサーチをON
set noundofile
set noswapfile
syntax enable
set background=dark
colorscheme hybrid

"-----------------------------
" search
"-----------------------------
set ignorecase "大文字/小文字の区別なく検索する
set smartcase "検索文字列に大文字が含まれている場合は区別して検索する
set wrapscan "検索時に最後まで行ったら最初に戻る

"-----------------------------
" other
"-----------------------------
set nobackup "vimのファイル保存時にバックアップファイル（*.*~というファイル名）を作成しない
```

~/.vim/colors/
の下にカラースキーマを置く。

https://github.com/w0ng/vim-hybrid
┗colors
　┗hybrid.vim (edited)
Pycharmとgithubを連携する方法


#引っかかった所
すでにgithubで先にディレクトリを作成してからだとうまく連携できなかったので
上記を実行してみたが、ファイル名がすでにあるということだったので
一度ディレクトリを削除してから、
githubのリポジトリ名と違うディレクトリ名にして、

```
echo "# chat_bot" >> README.md
1:git init
2:git add README.md
3:git commit -m "first commit"
4:git remote add origin https://github.com/cowcow168/chat_bot.git
5:git push -u origin master
```

#やった手順
- ##1:git initコマンドを実行してカレントディレクトリをGitリポジトリに変換
バージョン管理を行っていない既存のプロジェクトをGitリポジトリに変換する場合や、空の新規リポジトリを作成して初期化する場合に使用します。

- ##2:ファイルの作成/変更/削除をgitのインデックスに追加する（git add）
 インデックスとは、リポジトリにコミットする準備をするために変更内容を一時的に保存する場所。

- ##3:変更結果をローカルリポジトリにコミットする（git commit）
次に、インデックスに追加されたファイルをコミット。
コミットとは、ファイルやディレクトリの追加や変更をリポジトリに記録する操作のこと。

- ##4:リモートリポジトリの情報を追加
この情報は、先ほどGitHub上に表示された、リモートリポジトリのアドレス。

- ##5:ローカルリポジトリの変更をリモートリポジトリに反映させるために必要


pycharmのターミナルから実行
どうやら、README.mdも追加しないといけないみたいです

#結果
ローカルリポジトリとりモードリポジトリが紐づきました。

#参考にしたページ

>https://p--q.blogspot.jp/2014/03/git5pycharmgit.html

**pycharmとgithubに連携する所**
>http://nwpct1.hatenablog.com/entry/pycharm-development

**5で参考にしたページ**
>https://techacademy.jp/magazine/6235
【未解決】 EgretEngineでBitmapFontを利用しようとすると

#現象
手で書いたりEgretWingの自動生成で`default.res.json`にBitmapFontの記述をしても以下のエラーが出ます

## リソース記述
```ts:default.res.json
{
	:
	"resources": [
:
		{
			"name": "score_fnt",
			"type": "font",
			"url": "assets/score.fnt"
		}
	]
}
```
 
## エラー
> Failed to load resource: the server responded with a status of 404 (Not Found)
> TypeError: Cannot read property 'then' of undefined


#調査
## Egret Developer Communityから
https://bbs.egret.com/thread-47336-1-1.html

> [日] launch.jsonで、デバッグ、対応するポートが変更できます。ひとつづつ確かめてください
> [中] 在launch.json里面，看你是用哪个配置来调试的，改对应的port，随便加一减一试试
> [英] In launch.json, see which configuration you use to debug, change the corresponding port, just add one minus one try

## launch.jsonについて調べてみる
http://developer.egret.com/cn/github/egret-docs/Wing/chromeDebug/index.html

> EgretWing支持对JavaScript代码的调试在Chrome浏览器，或者支持Chome调试协议的程序。
> EgretWing supports debugging of JavaScript code in the Chrome browser, or a program that supports the Chome debugging protocol.

#トライ＆エラー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/391ab49a-f86f-f07b-422e-2cb2e842289c.png)

画面の左上の「Launch Wing Player」を「Launch Chrome」に切り替える

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/3391d185-de88-4739-aed7-b2ac5accbc41.png)


# 結果
> Failed to load resource: the server responded with a status of 404 (Not Found)
こっちは消えたけど

> TypeError: Cannot read property 'then' of undefined
こっちが消えない
CD の全トラックを、一つの MP3 ファイルにまとめる

```shell-session
$ cdparanoia 1- - | lame -V 4 - target.mp3 ; drutil eject
```

- `cdparanoia`: 1トラック目から最後まで、標準出力に書き出す
- `lame`: そこそこの品質で、標準入力から読み込み、target.mp3 に書き出す
- 終わったら eject する
(TypeScriptで書かれてWebpackでビルドされた) CloudFunctionsのエラー通知をわかりやすくしてみた

## やりたいこと

stack driver error reportのエラーの内容をもう少しわかりやすくしたい。

## やること

https://github.com/prisma/serverless-plugin-typescript#enabling-source-maps

ここを参考に node-sourcemap-supportを導入した。

https://firebase.google.com/docs/functions/typescript?hl=ja

ここを見ると、Firebaseでは index.js.map も一緒にdeployできると書いてあるが、cloud functions単体ではそういった記述を確認できなかったので、少し古いが上記のtopicに書かれていた通りの方法で実装した。serverless frameworkじゃなくても上手くいくか分からなかったがとりあえず試してみて、上手くいった。

## 具体的な変更内容

```moduleのinstall
npm install source-map-support
```

```src/index.ts
// この一行を追加
import "source-map-support/register";
```

```webpack.config.js
module.exports = {
  ...
  devtool: 'source-map', //<= これを追加
  ...
}
```

これだけ。

## 結果

stack driver error traceで見たエラーメッセージを比較する。

### before

```
ReferenceError: atob is not defined
at t.HistoryAppender (index.js:593)
at t.history_appender (index.js:424)
at (/worker/worker.js:756)
at <anonymous>
at process._tickDomainCallback (next_tick.js:228)
```

どこのコードで問題があったのか全くわからない。

### after

```
ReferenceError: atob is not defined
at parse (/srv/webpack:/node_modules/@google-cloud/bigquery/src/index.js:5)
at t.history_appender (index.ts:49)
at (/worker/worker.js:756)
at <anonymous>
at process._tickDomainCallback (next_tick.js:228)
```

index.ts: 49行目の処理に問題があることがわかるようになった。

## その他メモ

- どのくらい深い階層まで追えるのかまだ分かっていない
- build後のファイルサイズが大きくなっている訳ではない

```
// before
ls -alh index.js
-rw-r--r--  1 shuhei.morioka  staff   5.5M 11 12 21:24 index.js

// after
ls -alh index.js
-rw-r--r--  1 shuhei.morioka  staff   5.5M 11 12 21:15 index.js
```

他に良い方法をご存知の方いれば教えてください〜
STS(Eclipse)で新規プロジェクト作成時に407エラーが発生する

## はじめに
Eclipseの認証付きプロキシ設定をしても、Springスタータープロジェクト作成に失敗する。
![STS_error.png](https://qiita-image-store.s3.amazonaws.com/0/127161/c65a1b4a-d0fb-fbcc-dbda-1f305bd6ee41.png)

## 環境
- Spring Tool Suite 4
 - 4.0.1.RELEASE
- Java
 - jdk1.8.0_162

## 原因
Java 8 Update 111からHTTPS接続のトンネリングにBasic認証を使用できない設定がデフォルトになったため。

## 対応
STS格納先にあるSpringToolSuite4.iniファイルに以下を追記する。
`-Djdk.http.auth.tunneling.disabledSchemes=""`

## 結果
Springスタータープロジェクト作成ウィンドウを確認できた。
![STS_OK.png](https://qiita-image-store.s3.amazonaws.com/0/127161/87befee3-0c0e-28dd-8067-b9d5e145d84f.png)


## 参考
- [Cannot create “Spring Starter Project” with STS 3.9.4](https://stackoverflow.com/questions/52012649/cannot-create-spring-starter-project-with-sts-3-9-4)
- [JavaでHTTPSのサイトに認証付きプロキシ経由でアクセスしようとすると407エラー](https://qiita.com/kaakaa_hoe/items/d4fb11a3af035a287972)
[Rails初心者必見]Rails あるあるのエラーを解説

## TL;DR
Webアプリケーションを作成して行く段階でエラーが出るのはつきもの！
そのなかで、いかにエラーとしっかり向き合うかが重要かと個人的には思っております！

今回は、あるあるのエラーを何個か抜粋して解説していきます。

---
2020/04/19 編集点 ↓

[Loggerの使い方](https://qiita.com/gonzaemon111/items/a6d9f3ad0645037125c2#loggerの使い方20200419追記部分)を追記しました。

---

##エラー文

### undefined method 'id' for nil:NilClass

例えば、すごく簡素的な例ですが、

```ruby

def update
  @tweet = Tweet.find(params[:id])
  if @tweet.update(tweet_params)
    ...
end
```

みたいなコードがあったとしましょう！

このとき、`undefined method 'update' for nil:NilClass`とエラーが出たと仮定します！

この意味としては、`NilClass`の`nil`オブジェクトに対して、`update`メソッドは定義されていないよ！ってことです。

つまり、`@tweet`が`nil`になっているということです！

`find`メソッドは、見つからなかった場合に`nil`オブジェクトを返します。

そのため、このような簡素的なコードでは、エラーが起こりにくいかもしれませんが、
`Usecases`や`Services`などのようにディレクトリを分岐させていった時に直面するので、`find`メソッドを使った時は、`@tweet.present?`を書いてハンドリングすることをお勧めします。


### undefined local variable or method

これもあるあるで、エラー文で示された行に未定義の変数、もしくはメソッドがあると言うことですね！

よくあるのは、`"hello"`のようなString型のオブジェクトを返したかったにも関わらず、`hello`と変数もしくはメソッドにしてしまっていた、、、などがあると思います。

### RoutingError (No route matches [GET] "/tweets")

単に、URIにマッチするRoutingが存在していない！ということです。

しかし、これに関しては、たまに起こると思います！

特に`devise`で Userサインアップ、サインインのルーティングが存在している時に、usersコントローラを作成し、usersコントローラのルーティングをdeviseのルーティングの前に記述すると、`users/:id`のルーティングの時にエラーになるので気をつけましょう。


### ActiveRecord::NodatabaseError

データベースが存在しない時に出るエラーです。

```shell_session
$ bundle exec rails db:create # Rails ver5以降
$ bundle exec rake db:create  # Rails ver5以前
```
したら治ると思います！


### SyntaxError

単純に文法のミスです！
タイプミスをしていないかの確認、修正でいいと思います。

### ActionView::MissingTemplete

該当するViewが存在していないよ〜ってことですね！

コントローラに対するViewが存在するかを確認してください！
`render`などを用いると発生しやすいと思います。


### ArgumentError

そもそも、`Argument`は`引数`のことですので、
メソッドの引数の数などが正しいことを確認しましょう！

## 個人的に行なっている対策

1. `logger`を使う！(`Rails.logger.debug`というメソッドが使えます。) *1(下に追記があります)
2. `binding.pry`で止めて、メソッドの返り値を確認する。
3. `tail -f log/development.log`を入力し、ログを確認(RSpecの場合は`test.log`)
4. logに出力された、SQLを読む
5. どの部分のなんのエラーかを正確に見極める。

### Loggerの使い方(2020/04/19追記部分)

一般的な`TweetsController#create`を例に解説させていただきます。

```rb:app/controllers/tweets_controller.rb
class TweetsController < ApplicationController
  ...
  def create
    @tweet = tweet.new(tweet_params) # *1
    if @tweet.save
      flash[:success] = "ツイートを作成しました"
      redirect_to tweets_path
    else
      flash.now[:danger] = @tweet.errors.full_messages
      render :new
    end
  end
  ...
end
```

このときに「`*1`の`@tweet`の中身が知りたい！」なんてことがあると思います！
そんなときに以下の１行を追加すると、中身がわかると思います！

```rb:app/controllers/tweets_controller.rb
...
    @tweet = tweet.new(tweet_params) # *1
    Rails.logger.debug "@tweet : #{@tweet.inspect}" # この1行を追加
    if @tweet.save
...
```

`inspect`メソッドは、オブジェクトの中身を標準出力してくれるメソッドです。
これで`create`アクションが走ると、`development.log`に以下のように出力されると思います。

```text:logs/development.log
@tweet : #<Tweet id: nil, user_id: 1, content: "Qiitaの記事用のツイートです", image_data: "{
\"id\":\"1b73ccb4ded451d874761e038a5dfe73.png\",\"stor...", created_at: nil,updated_
at: nil, tweet_id: nil>
```

こうすることで、`@tweet.content`などの中身を知ることができます！

この`logger`メソッドは、サービス層でも利用可能なので、Rails開発するときにどんどん活用してみてください。

---

以上です。ありがとうございました！
map関数、無名関数lambdaしっかり理解！！！

#背景
今回はcsvファイルからデータを取得しリストに格納しようとした時に、
`lines = map(lambda v: v.replace('/',','), lines)`
このようなコードを使い「/」と「,」の変換を行いました。
よく使っているのですが正直、map関数、lambdaが何をしているのか良く分かっていない自分がいたので勉強した結果をアウトプットして頭に擦り込んでいきます！！

##map関数って？
map関数は配列、リストの全ての要素にアクセスできる関数です。
文法的には以下のような引数を用います。
`map(関数,リスト)`
ここでの関数とはリストに対して何かしらの動作を行う関数で出力はリストの全要素に対してこの関数をかけたものになります！！
##lambda
`lambda`とは無名関数のことです。`def`でよく関数を定義しますが、この`lambda`を使えば簡易的な関数は名前を定義せずに使用することができます。
`lambda 入力:出力`
このように書きます。
(何回も使う関数の場合は`def`で定義した方が良さそうです。。)

##例
具体例を見ていきます。
ex.)`map(lambda a:a+1,lines)`
これはリストであるlinesの要素一つ一つがaに代入されそのaに+1されることになります。

##まとめ
map関数、無名関数lambda、理解できましたか！！
have a good day!!
シェルスクリプトの関数をパイプで繋げられるようにする(注意点あり)

関数を引数渡しでもパイプ渡しでも同様に処理できるようにするのと、実装時にハマったことのメモ。

---
# 忙しい人向けの結論
以下のように実装すれば良い。

```to_upper.sh
#!/bin/bash
to_upper() {
    # パラメータの受け取り
    if [ -p /dev/stdin ]; then
        if [ "`echo $@`" == "" ]; then 
            __str=`cat -`
        else
            __str=$@
        fi
    else
        __str=$@
    fi

    # 処理
    echo "${__str}" | tr '[a-z]' '[A-Z]'
}

# 通常の呼び出し方(引数渡し)はもちろんOK
to_upper hoge

# パイプ渡しでもOK
echo hoge | to_upper
```

---
# パイプで渡せるようにする実装
ググった結果、パイプで渡されたときは標準入力 `cat -` を読み出せば良いとわかった。

```sample.sh
#!/bin/bash
to_upper() {
    # パラメータの受け取り
    if [ -p /dev/stdin ]; then
        __str=`cat -`
    else
        __str=$@
    fi

    # 処理
    echo "${__str}" | tr '[a-z]' '[A-Z]'
}
```

# ハマったこと
テキストファイルを `while read line` で読み、この関数を通したところ、引数渡しをすると最初の1行が処理されない問題が発覚。

```sample.sh
# テキストファイルを読み出し関数に通す
echo -e "txt1\ntxt2\ntxt3" | while read line
do
    to_upper $line
done
# 結果
# TXT2
# TXT3
```

## なぜ？
原因は未だに分からないのですが、関数を呼び出す側でパイプ処理が通されている状態で引数渡しをすると、 `/dev/stdin` が名前付きパイプとして認識され、それが関数側にも伝搬してしまっている模様。

```sample.sh
#!/bin/bash
to_upper() {
    if [ -p /dev/stdin ]; then
        echo stdin
    else
        echo args
    fi
}

##### 引数渡しで実装すると、呼び出し元側の影響を受ける
### case1
echo -e "txt1" | while read line
do
    to_upper $line
done
# 結果
# stdin (本当はargsと出て欲しい)

### case2
while read line
do
    to_upper $line
done < file.txt
# 結果
# args (想定通りargsと出る)


##### 元々パイプ渡し処理の場合は問題ない
### case3
echo -e "txt1" | while read line
do
    echo $line | to_upper
done
# 結果
# stdin (想定通りstdinと出る)

### case4
while read line
do
    echo $line | to_upper
done < file.txt
# 結果
# stdin (想定通りstdinと出る)
```

よって、前述Case1のような実装をすると、 `read line` で1行目を `while` 文に読み出され、関数内で `/dev/stdin` を名前付きパイプとして評価され、 `cat -` で残りの標準入力をすべて奪い取られた結果、2周目の `read line` のときには標準入力が空になっているので `while` ループを終了される、という挙動となっていた。

# どう実装すればよいか
前述Case1のとき、引数渡し `to_upper $line` で関数を呼び出すので、関数内の引数 `$@` に入ってるべき値(この場合 `txt1` という文字列)が入っている。
ということで、冒頭結論の実装例のように、 `/dev/stdin` を評価したあとに `$@` に値が入っているかどうかを評価するロジックにすればよい。

# 参考
[標準入力を受け取れるシェルスクリプト、関数の作成（パイプで繋げられるようにする） - Qiita](https://qiita.com/koara-local/items/7ad01e0692e36627ba2d)
[シェルスクリプトでパイプを判断する - Qiita](https://qiita.com/b4b4r07/items/77c589f21a99db8bb682)
laravelでemailの登録を取り除く

##①2014_10_12_000000_create_users_table.phpの「$table->string('email')->unique();」「$table->timestamp('email_verified_at')->nullable();」を消す
##②「php artisan migrate:fresh」からの「php artisan migrate:refresh」
##③register.blade.phpのemail入力欄を消す
##④RegisterController.phpの「protected function validator(array $data)」と「protected function create(array $data)」のところのemailのところを消す
##⑤登録画面に行ってnameとPasswordだけで登録してみる..
##⑥できた！！
SSL入れたらBASIC認証が2回出る

# はじめに
Chromeさんをはじめ、SSL対応を当たり前にする動きがあります。
そんな中、起きたできごと、対応した内容を残しておきます。

SSLの設置が終わり、本来の業務に戻った。
拙著：[SSLに対応する](https://qiita.com/AkihikoIkeda/items/969682726b0a9fc9553e)

後に、「何かBASIC認証2回出ちゃうんだけど」とツッコミが入る。
~~全部こっちにふらずに調べてよ部署違うんだし~~
調査して対応することになった。

# 起きていたこと

1. `http://mydomain.jp/basic/`(BASIC認証範囲)にアクセス
2. 当然のようにBASIC認証実施
3. 正しいIDとパスワードを入力
4. ページにアクセス！……って、HTTPじゃねーか！
5. `https://mydomain.jp/basic/`にリダイレクト
6. 当然のようにBASIC認証実施(1秒ぶり2回目)

という感じ。

# 調べたこと
[teratailで同じような問題にあたっている人がいた。](https://teratail.com/questions/135117)
`<IF></IF>`とかあるのか最近のApacheは便利だなぁ、とか思ってたら、バージョン2.4からだった。
問題のサーバに入っているのは`2.2`で、使えない。
じゃあバージョン上げちゃいますか、と思ったら許可は出ませんでした。~~なんでやねん~~

# 無理やり対応
やむを得ず、別の対策を練ることに。
簡単に言うと、`SSLRequireSSL`を利用して、HTTPで来たら403にし、そこからHTTPSへリダイレクトする。
順番に行くと、以下。

1. `http://mydomain.jp/basic/`(BASIC認証範囲)にアクセス
2. SSLRequireSSLがあるので、403エラー(BASIC認証**しない**)
3. ErrorDocumentで指定したPHPを実行
4. PHP内で`header("Location: https://mydomain.jp/basic/");`が実行されてリダイレクト
5. BASIC認証実施(1回目)

# htaccess

```apache
# httpでアクセスされたら403
SSLRequireSSL

# 403の飛び先を指定
ErrorDocument 403 /mydomain.php

# Basic認証
AuthType Basic
AuthName ""
AuthUserFile /html/www/htdocs/mydomain/basic/.htpasswd
require valid-user
<Files ~ "^https:*\.(pdf|html|php|jpg|jpeg|gif|png)$">
	Header set Pragma no-cache
	Header set Cache-Control no-cache
</Files>
```

# 結びに
一応外向きではないので、SEO的なことなどは考慮していない。個人情報を扱うわけでもないし、とりあえず目的は達している。
いるのだが、これで良いのだろうか。いや良くないのは確かなんだけど。なんかこう、モヤっとするというか。言いようのない気持ち悪さがある。
詳しくてお時間ある方にご意見頂ければ幸いです。
AWS CLIのS3でワイルドカードを使う方法

AWS CLIのS3ではワイルドカードが使えないと思っていましたが、実はオプションを駆使することで使えることがわかったのでメモ。

```bash

aws s3 cp --recursive \
  --exclude '*' \
  --include 'ワイルドカード入り検索文字列' \
  s3://bucket_name/path/ .
```

S3とかCloudFrontだとログファイルがディレクトリ掘らずに置かれてしまうのでこれでやると便利ですね。
SSLに対応する

# 前提
証明書は取得済み。以下の3ファイルを用意してあるものとする。

+ `/etc/httpd/conf/ssl.key/mydomain.jp/[SSLサーバ証明書ファイル]`
+ `SSLCertificateKeyFile /etc/httpd/conf/ssl.key/mydomain.jp/[SSLサーバ証明書用秘密鍵]`
+ `SSLCertificateChainFile /etc/httpd/conf/ssl.key/mydomain.jp/[CSPSSLの中間証明書ファイル]`

# 環境
CentOS 7.4
Apache 2.2.6

# ポート開放
HTTPSはポート443を使いますので、まずはその設定。

+ 恒久的な設定の反映
  - `firewall-cmd --zone=public --add-port=443/tcp --permanent`
+ リロード
  - `firewall-cmd -reload`
+ 設定の確認
  - `firewall-cmd --list-all`  

# Apacheのconfファイル
Apache側でもポート443について記載。
コマンド：`vi /etc/httpd/conf/httpd.conf`
記述内容：

```apache
NameVirtualHost *:80
NameVirtualHost *:443
```

## ドメインに対して
続いて、ドメインに対して「この証明書を使いまっせ」という設定。
※ドメイン名「mydomain.jp」を適宜読み替えてください。
コマンド：`vi /etc/httpd/vhost/mydomain.jp.conf`
記述内容：

```apache
<virtualHost *:80>
	ServerName mydomain.jp
	DocumentRoot /html/www/htdocs
	SSLEngine off
	<Directory /html/www/htdocs>
		Options -Indexes FollowSymLinks
		AllowOverride All
    </Directory>
</VirtualHost>

<VirtualHost *:443>
	ServerName mydomain.jp
	DocumentRoot /html/www/htdocs
	SSLEngine on
	SSLCertificateFile /etc/httpd/conf/ssl.key/mydomain.jp/[SSLサーバ証明書ファイル]
	SSLCertificateKeyFile /etc/httpd/conf/ssl.key/mydomain.jp/[SSLサーバ証明書用秘密鍵]
	SSLCertificateChainFile /etc/httpd/conf/ssl.key/mydomain.jp/[CSPSSLの中間証明書ファイル]
</VirtualHost>
```

# 証明書ファイルの権限設定
所有者をrootにしておく。

```
chmod 400 /etc/httpd/conf/ssl.key/mydomain.jp/[SSLサーバ証明書ファイル]
chmod 400 /etc/httpd/conf/ssl.key/mydomain.jp/[CSPSSLの中間証明書ファイル]
chown root:root /etc/httpd/conf/ssl.key/mydomain.jp/[SSLサーバ証明書ファイル]
chown root:root /etc/httpd/conf/ssl.key/mydomain.jp/[CSPSSLの中間証明書ファイル]
```

## httpからhttpsへリダイレクトさせる
httpでのアクセスは全部httpsにリダイレクトする
コマンド：`vi /html/www/htdocs/.htaccess`
記述内容：

```apache
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
```

# Apache再起動して確認
コマンド：`service httpd restart`
試しに`http://mydomain.jp/`にアクセスすると、`https://mydomain.jp/`になる。はず。
IM-FormaDesigner アプリケーション内のクライアントサイドJavaScriptを全文検索する

# 前提

3つの方法でクライアントサイドJavaScriptの入力が可能でメニューを開けないとコードが見れない
・汎用アイテム スクリプト
・汎用アイテム 「ボタン（イベント）」
・アクション設定 カスタムスクリプト

**どこにクライアントサイドJavaScriptが設定されているか分からない上に中身が一括検索できない！**
  
画面設計書出力を使うと1画面ずつは出力できるがだるいし、設計書出力機能がインストールされていない環境もある

# やりたいこと
IM-FormaDesigner内のクライアントサイドJavaScriptまとめて検索してしたい
FormaなのでIM-BISも対応

# やりかた
publicストレージに生jsonで入っているのでgrepすればok
formaの画面デザイン情報はpublicストレージにjsonファイルで格納されている
圧縮も暗号化もされていないので検索は自由にできる

場所は以下
> publicStorage/[テナントID]/forma/以下

データーソースなどもココにいるので影響調査でgrepする際に
このディレクトリを対象にすると良い

# 追記
こんなツールを作ったので、こちらでJSファイル全ダウンロードしてから検索すると良いです
**IM-FormaDesigner クライアントサイドスクリプト一括ダウンロードツール**
https://qiita.com/doriburu/items/626a851c89b13750d2fd
d-caseとテスト戦略について（書きかけ）

CHでテスト戦略を立てるのに利用している d-caseについて、Webページを改めて調べたら、最近手ごろな小冊子にまとめたらしいので、そのエッセンスを下にまとめます。

[はじめてのD-case](http://dimensions-japan.org/dcase/pdf/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AED-Case.pdf)

## D-caseとは？

安全性に関する国際規格おいての要求項目となっているセーフティーケースの記法の一つであるGSN(Goal Structuring Notiation)をシステムのディペンダビリティ(Dependability)に適用したもの。

Dependability caseを略して d-caseという

すなわち、システムの安全性などをトップゴールにおいて「どうすればいいのか」の議論するための書き方がもともと。

### ではシステムのディペンダビリティとは？

### ちなみにシステムとは？

## テスト戦略とD-case

### テスト戦略とは?

JSTQB用語集の定義によると、テストレベル（ユニットテスト、統合テスト、システムテストなどのテストのまとまり）とその内容を説明したもの。
すなわち、多くの開発現場では、どの役割の人が何を目的として開発物の検証を行うのかを定めるものになります

### 開発物とシステムのディペンダビリティ

多くの開発物で問題になってくるのは、ユニットテストではなく、システムテストをどこまでやるのか。ということです。ユニットテストは実装したものがその通りに動くのかの確認なので、「やる・やらない」の問題で解決することが多いかなと。
システムテストって「開発の影響範囲をすべてチェックする」というのが目的になります。とはいうものの、「影響範囲」「すべて」といったときに、それを断定できるのは、記載されたプログラムコードとそれが動く環境と外部要因のすべてを把握している、神がかった存在の人だけが可能ではないでしょうか？

ということで、開発物の依存性とその重要度を関係者で合意するというのが必要で、そのツールとしてディペンダビリティが可視化されるD-caseって議論をする際に有効ではないかと考えているわけです。

## 派生開発でのD-caseテンプレート

で、D-case協会のほうで提唱する派生開発のテンプレートというのが以下。

![image.png](https://image.docbase.io/uploads/13f2e82e-fdbe-479b-abc9-078ba5e5e66b.png =WxH)
jQueryでselect要素のoptionを非表示にする

##やりたいこと
#####select要素のoptionを条件により表示・非表示させたい
例えば、他にselect要素があり、そちらで選択された値に応じてもう1つの方のselect要素のoptionを表示・非表示させたいというケースなどです。
ちなみに、はじめはoptionにdisplay:noneとしようとしたのですが、IEなどではoptionにdisplay:noneができないことがわかり、別の方法で実装しました。
その実装方法の一例です。

##コード
```catsList.html
<select id="list">
  <option class="cats" value="blackcat">Black Cat</option>
  <option class="cats" value="whitecat">White Cat</option>
  <option class="cats" value="calicocat">Calico Cat</option>
  <option class="cats" value="americanshorthair">American Shorthair</option>
  <option class="cats" value="russianblue">Russian Blue</option>
  <option class="cats" value="abyssinian">Abyssinian</option>
  <option class="cats" value="siamese">Siamese</option>
</select>
```

```catsList.js
$('.cats').each(function(index) {
  const type = $(this).val();
  const wrap = $(this).parents().attr("class");
  //White Catを非表示
  if(type == "whitecat"){  
    //現在表示中の場合  
    if(wrap !== "wrap"){
      $(this).wrap("<span class='wrap'>");
    }
  }
  //Black Catを表示
  if(type == "blackcat"){
    //現在非表示中の場合
    if(wrap == "wrap"){
      $(this).unwrap();
    }
  }
});
```

上記のように`<option></option>`を`<span class='wrap'></span>`で囲うことで非表示にできます。
反対に、`<span class='wrap'></span>`を取り除くと表示されます。
なお、非表示中の場合は以下のhtmlになります。

```catsList.html
  <span class="wrap"><option class="cats" value="whitecat">White Cat</option></span>
```
C++でPythonのargparse風のものを実装した話

手っ取り早く使ってみたい・見てみたいと思っていただける方は [GitHub](https://github.com/SiLeader/argparse) をご覧ください。

# 動機
C++でコマンドライン引数を解析できるライブラリは探してみた限りいくつかありました。
ですが、Pythonのargparseのように扱えるライブラリは自分が探した範囲では見つかりませんでした(見つかる前に諦めていたのかも)。
そこで、作れる範囲で作れば良いではないかということで勉強も兼ねて作ってみた次第であります。

# 作ったもの
+ C++11以降の機能を使う
+ コマンドライン引数を解析
+ `-h`とか`--help`が来たらヘルプを表示して`exit(0)`
+ `store`と`store_true`、位置引数みたいなのをサポート
+ プログラム名、説明、エピローグをサポート
+ ヘルプの自動作成

# 例
GitHubのexample.cppのコピーです。

```c++:example.cpp
#include "argparse.hpp"


int main(int argc, char** argv) {
    argparse::ArgumentParser parser("test", "argparse test program", "Apache License 2.0");

    parser.addArgument({"--value", "--set-value"}, "set value");
    parser.addArgument({"--flag"}, "flag", argparse::ArgumentType::StoreTrue);
    parser.addArgument({"--value-default", "--value-with-default-value"}, "set value or use default value");

    parser.addArgument({"value1"}, "value1");
    parser.addArgument({"value2"}, "value2");

    auto args = parser.parseArgs(argc, argv);

    std::cout << std::boolalpha;
    std::cout << "value: " << args.get<std::string>("value") << std::endl;
    std::cout << "flag:  " << args.has("flag") << std::endl;
    std::cout << "value(default='abc'): " << args.safeGet<std::string>("value-default", "abc") << std::endl;

    std::cout << "value1: " << args.get<std::string>("value1")<<std::endl;
    std::cout << "value2: " << args.get<std::string>("value2")<<std::endl;
}
```

# 使い方
1. `argparse::ArgumentParser`のインスタンスを作成
2. `addArgument`関数を使い受け取れる引数を追加
3. `parseArgs`関数を使いコマンドライン引数をパース
4. `parseArgs`の返り値を受ける
5. ほしい引数を受け取る

## `addArgument`関数
`-`または`--`で始まる引数はキーワード引数として扱われます。
第二引数でヘルプで表示する説明を記述します。
第三引数で`StoreTrue`または`Store`を指定します。`StoreTrue`のときはフラグになります。デフォルトでは`Store`となっています。

## ほしい引数を受け取る(`Arguments`クラス)
コマンドライン引数を取得するときは指定した識別子から先頭の`-`または`--`を除いた名前を使います。
例えば`--version`を追加した場合取得には`version`を指定します。複数指定した場合、最初に指定したものが使用されます。

`has`関数を使うことでコマンドライン引数に使われたかがわかります。フラグの場合はこれを使います。
非テンプレート`get`関数を使うことでチェックと値の取得を同時に行えます。
テンプレート`get`関数は存在しない値を取得しようとすると例外が発生します。
`safeGet`関数はデフォルトの値を指定できます。

# おわりに
PythonとC++の違いで妥協した部分も多々ありますが、使っていただけると幸いです。
Slackのヘビロテチャンネル・分報を探しやすくて業務効率を2億倍上げよう。「区切り文字のあるチャンネル」は「キーワードごとの前方一致」で自由に検索できる。

# 例

たとえば `#times-yumainaura` というハイフン区切りのチャンネルがある時。

# 区切り文字は打たなくても検索できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0d4d841b-648a-73b9-2937-2eccbc60619d.png)


# 別の区切り文字でも検索できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/87e190af-08d9-9210-8ddb-37ec8fdc2f32.png)

# 区切りが逆順でも検索できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6e3ab54b-d336-c32a-a24d-de3b79e3d004.png)

# チャンネル名の一部を組み合わせるだけで検索できる

ゆってぃ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a685e133-04b0-9c27-2f32-8a958efe9434.png)

# こんなのでも

ゆてぃ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/efc6c81d-e5cd-0310-7d5e-5a711ca6ef10.png)

# こんなのでも。

治癒。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9196ecf5-556a-3b5e-4103-98e0dcb3ec30.png)

# これでも

わいてぃー。(人差し指を差し出す)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a23c800d-71f8-f0fb-ee17-ebadb856c295.png)


# 法則は「キーワードごとの前方一致」っぽい。

- `times` ( `t` `ti` `tim` とかがヒットする )
- `yumainaura` ( `y` `yu` `yum` とかがヒットする )

そして、それに対する「検索キーワード自体」はめちゃくちゃ自由に書ける。

# 前方一致せず、ヒットしないパターン

`yumainaura` の `y` を抜くと、前方一致しなくなってしまい、検索できない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/07d78e12-95c5-df0c-b733-0c8c0bb1c25e.png)


# クイックスイッチャーなめんな

業務効率の200億%はSlackのクイックスイッチャーがうまく使えるかどうかにかかっている。

# 問題を感じていたこと

- 自分の分報を探そうとするときに、自分へのDMがトップにヒットしてしまう。
- `times-` から探すと、他の人の分報もたくさんヒットしてしまう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1effb39b-0a7e-971c-3df5-801ba5743a4c.png)



# ヘヴィロテ・チャンネルが干渉しあっていた

- 「自分宛てのDM」はメモ用によく使う。
- 「自分の分報」もよく使う。

2つの「ヘビロテ・チャンネル」が干渉しあっていて、非常に使いづらい状態だった。

これがじわじわとボディブローのように、全業務の生産性や、自分自身のエネルギーを少しずつ削っていくのだ。そう何万回、何十万回と。

# 他の手段

- やむ終えない場合は、チャンネル名を変更するのが良いかも。
- [Slack でチャンネル名のエイリアスを作る方法 (チャンネルはリダイレクトされる) - Qiita](https://qiita.com/YumaInaura/items/fb5f6c8330f106b7a86a)

# iPhoneアプリの場合

2018/11/13 現在、チャンネル検索の仕様がいまいちで、柔軟じゃない。


# 環境

- MacApp








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
日能研の問題を解く(2018/11)

今日は。
電車に乗っていたら、[日能研の広告の問題](https://www.nichinoken.co.jp/shikakumaru/201811_sa)が算数だったので、Pythonで愚直に解いてみました。6!=720通りなので、人間にはしんどくてもコンピュータならいけそうですね。

```python
# coding: utf-8

import itertools
from functools import reduce

def f(a, b): return a*10 + b

def main():
	for m in itertools.permutations([1,2,3,4,5,6]):
		if all([reduce(f, m[:k]) % k == 0 for k in range(2,7)]):
			print(reduce(f, m))

main()
```

reduce便利でした。
VueRouter入門メモ

公式ドキュメント

https://router.vuejs.org/ja/

# ページの作成

nuxtの場合、pageフォルダ内に.vueファイルを置くだけでページを作成できます。

```
page/about/user.vue
```
で

```
/about/user 
```

にアクセスできます。

# ページ遷移のアニメーション設定

VueRouterで遷移時のアニメーションも設定できる。

# レイアウト

layoutsフォルダにはレイアウトの構成を設定できるファイルがおいてあります。デフォルトではlayouts/default.vueが置かれている。

```
export default {
  layout: 'mypage'
}
```

とpageのファイルに書くとlayouts/mypage.vueのレイアウトを使うことができます。

```layouts/default.vue
<template>
  <div>
    <nuxt/>
  </div>
</template>
```

のように<nuxt/>と記述することでそこにpageのファイルを出すことができます。より大枠で指定するためにはプロジェクトルートに app.htmlを配置します。

```app.html
<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
  <head>
    {{ HEAD }}
  </head>
  <body {{ BODY_ATTRS }}>
    {{ APP }}
  </body>
</html>
```

デフォルトはこうなっているので変更したい場合はapp.htmlを変更します。

# 動的なルーティング

https://router.vuejs.org/ja/guide/#html

## 静的なルーティングのほうが動的なルーティングよりも優先される

```
ドメイン/_id
```

よりも

```
ドメイン/rei
```

のほうが優先される。

## パラメーターの受け取り方

* Nuxt(Vue-Router)が判定しているルーティング名 ROUTE NAME(=$route.name)
* アクセスしているパス PATH(=$route.path)
* パスパラメータ PARAMS(=$route.params)

# リンクのさせ方

```
// 0. モジュールシステムを使っている場合 (例: vue-cli 経由で)、Vue と VueRouter をインポートし、`Vue.use(VueRouter)` を呼び出します。

// 1. ルートコンポーネントを定義します
// 他のファイルからインポートすることもできます
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }

// 2. ルートをいくつか定義します
// 各ルートは 1 つのコンポーネントとマッピングされる必要があります。
// このコンポーネントは実際の `Vue.extend()`、
// またはコンポーネントオプションのオブジェクトでも構いません。
// ネストされたルートに関しては後で説明します
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]
```

上記で設定したら下記のようにリンクさせることができる。

```
<router-link to="/foo">Go to Foo</router-link>
```
Git初心者Progateを終えてメモ

##Git初学メモ
私の中でのイメージ。

![gitイメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/91484/bc20e073-5fbc-0037-6f7b-48ad0ce7c799.jpeg)

####progateさんで学んだのは以下の通り。

①git add 「ファイル名」　ローカルリポジトリに「ファイル名」を追加する
②git commit -m 'Some messages'　コミットメッセージ付きで追加した内容を確定
③git push origin master　リモートリポジトリにローカルでコミットした内容をアップロード
④git pull origin master　リモートリポジトリからローカルにファイルをダウンロード

git status　addされていないファイル・その逆を確認できる。(文字色や文言で理解できる)
git diff　差分が出ているファイルの中身を確認できる
got log [-p]　コミット履歴を見る。[-p]で変更内容も見る。

初期設定したり、リモートリポジトリ作成したりしてた。。。

とりあえずメモです。
Julia のPlotsでエラー：could not load library "libGR.so"

Julia のPlotsを使っていて、今まで2度ほど「could not load library "libGR.so"」なるエラーに遭遇したことがあります。

その時の解決策を、3度目の遭遇に備えてメモっておきます。


```julia
ENV["GRDIR"]=""; Pkg.build("GR")
```

マシン環境にもよると思いますが、すごく時間がかかるときがあるので注意してください。速いときは数分、遅いときは1時間以上でした。
Python netCDF4でvariablesの有無を確認する方法

複数の、variables属性がバラバラのファイルを操作しなければならなかったので、
その時に使用したコードの一部をメモします。

netCDF サンプルデータ
https://www.unidata.ucar.edu/software/netcdf/examples/sresa1b_ncar_ccsm3-example.nc

<BR><BR>

1.NetCDFのvariables一覧を取得・表示する方法

```python:
import netCDF4
ncFILE='sresa1b_ncar_ccsm3-example.nc'
nc = netCDF4.Dataset(ncFILE,'r')
nc_var = nc.variables.keys()
print(nc_var)
```


結果

```python:
odict_keys(['area', 'lat', 'lat_bnds', 'lon', 'lon_bnds', 'msk_rgn', 'plev', 'pr', 'tas', 'time', 'time_bnds', 'ua'])
```

<BR><BR><BR><BR>

2.特定のキーを検索してなんらかの処理をする方法

```python:
import netCDF4
ncFILE='sresa1b_ncar_ccsm3-example.nc'
nc = netCDF4.Dataset(ncFILE,'r')
#list()で囲まないと、*1のエラーが出る。
nc_var = list(nc.variables.keys())


if 'tas' in nc_var:
   print(tas + ' is exists')
   #データが存在すれば、ここでなんらかの処理をする
else:
   print('no data')
```
<BR>
複数のキーを使用するときは'tas'の部分を変数にして、リストにしてループでもいいですね。

<BR><BR><BR>



参考サイト
http://www-mete.kugi.kyoto-u.ac.jp/matsuba/python/
https://note.nkmk.me/python-dict-in-values-items/
https://github.com/taehoonlee/tensornets/issues/1 (*1)
https://github.com/taehoonlee/tensornets/commit/985bcb5444f8b9cb3457f587568ee95ce25bc683
exuberant-ctagsじゃなくて、universal-ctagsをインストールしたい

## 何がしたいか
yumで`yum install ctags`とやると、**exuberant-ctags**がインストールされてしまうけど、
私は**universal-ctags**をインストールしたい

## よしやるぞ

自分でビルドしてインストールする

### クローンしてくる

```bash
git clone https://github.com/universal-ctags/ctags.git
```

### インストール
[こちら](https://github.com/universal-ctags/ctags/blob/master/docs/autotools.rst)に方法書いてあるのでこの通りいきます

```bash
# クローンしてきたやつのディレクトリに移動
cd ctags

# なんかしてる
./autogen.sh 

# インストールディレクトリが/usr/local/binになるように
./configure --prefix=/usr/local

# ビルド
make

# インストール
sudo make install
```

### バージョン確認
```bash
ctags --version
```

こんな感じで出力されればOKかな？

```bash
Universal Ctags 0.0.0(befcb88), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Nov 13 2018, 08:36:05
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory

```

### 後片付け

クローンしてきたディレクトリは丸ごと削除しておく

### 次は
以下を参考に、使っていきたい
[CtagsでVimにタグジャンプ機能を追加する - Qiita](https://qiita.com/aratana_tamutomo/items/59fb4c377863a385e032)

### 参考
[universal ctagsをビルドする - Qiita](https://qiita.com/k-takata/items/4fba75b66b2cff3a02c7)
[Xcode] 開発用Macの空き容量を増やすために試したこと

Xcodeを使っている開発用Macの空き容量を増やすために試したことのメモです。
以下のリンクを参考にさせていただいて、空き容量30GBから140GBまで増やすことができました。

単なるリンク集で、人のフンドシで相撲を取るようで恐縮ですが、何かのお役に立てば幸いです。

**環境**

macOS High Sierra 10.13.6
Xcode 10.1

**Time Machine のローカルスナップショット（最も可能性大）**

[【Tips】macOS High Sierraでファイルを削除しても空き容量が増えない問題に対処する](https://www.softantenna.com/wp/tips/macos-high-sierra-disable-local/)

**Xcodeの一時ファイル**

[[Xcode 8.2] 年末なので Xcode まわりの不要ファイルを一掃してみた](https://dev.classmethod.jp/smartphone/remove-xcode8-related-unnecessary-files/)

**その他、一般的なシューティング**

[ハードディスクの空き容量が極端に少なくなる場合の対処方法](https://discussionsjapan.apple.com/docs/DOC-1081)
ISTQB Certified Tester Advanced Level Syllabus Test Automation Engineer No.8

# 趣旨
ここでは、ISTQBにて提供されている"Test Automation Engineer" Syllabusを自分なりに解釈（そのままの翻訳もあり）したものである
そのため、実際の試験と相違がある場合もありますのでご注意
原本↓
https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html

# 8 Continuous Improvement

## 8.1 Options for Improving Test Automation
テスト自動化をテスト対象と同期続けるための保守タスクに加え、改善の機会もある。テスト自動化改善はさらに大きな効果、使いやすさ、可用性、テストアクティビティの改善になる。テスト自動化をどのように改善するかは、プロジェクトに付加されるメリットに影響する。
いろいろな分野の改善余地がある

### Scripting
scriptingでは、シンプル構造アプローチからデータドリブンに変化し、洗練されたキーワード駆動にする。現在のテスト自動化をupgradeするのに適切である。
スクリプトアプローチの変更だけではなく、改善はscriptingの実装にもフォーカスする
例）

- 自動化を統合するため、テストケース、ステップ、手順の重複を評価する。類似のテストケースは何回も実装しない。再利用を考慮したライブラリ化を検討する。これにより保守性が上がる。（キーワード駆動でよくある）
- エラー復旧性を持たせる。エラーが起きたとき、エラー状態から復旧し、次のステップのテストを実施させるようにする。
- ウェイト機構を考慮する。３パターン
    - ハードコードウェイトは多くの自動化の問題を引き起こしうる
    - 動的ウェイト　ポーリング等のような。適切なウェイトになるため、無駄なテスト実施時間になることはないが、タイムアウトを考慮しないと、問題があったとき、ずっと待たされる場合がある
    - イベント機構。これは上記２つより信頼性があるが、テストスクリプトはサブスクリプション機能をサポートする必要がある。
- テストウェアとソフトウェアとして扱う。テストウェアの開発・保守はソフトウェア開発と同じである。
- 既存scriptの改定、削除の評価。いくつかのscriptは問題があり、再設計が望ましい時がある


### Test Execution
テストに時間がとてもかかる場合

- 同時に別環境で実施を考慮する必要があるが、高価なシステムを扱っているような、ひとつしかテスト実施環境がないかもしれない。
- テストをいくつかに分割することを考慮する
- テスト自動化のカバレッジが重複しているかもしれないので、それを取り除く

### Verification
新しい検証機能を作る前に、検証方法の基準を適応する。これにより、再実装を割けることができるかもしれない。検証方法が似てる場合、パラメータ化が役立つかもしれない。

### Architecture
テスタビリティを改善するとき、アーキテクチャを変更する必要があるかもしれない。テスト対象、自動化両方で変更を考慮する必要がありうる。これにより大きな改善があるが、大きな変更が求められうる。例えば、テスト対象のAPIを変更したら、自動化もそれに合わせて改修が発生。これが後工程で起これば、改修コストは高くなる。自動化の検討時に考慮すべきである。

### Pre- and post-processing
標準的なセットアップ（事前設定）、解体（事後処理）を提供する。これにより、このステップの繰り返しの実装のタスクを抑え、保守コスト、新しい自動化実装時の労力を減らす

### Documentation
スクリプト、自動化マニュアル、レポート、ログに関するドキュメントを提供する

### TAS features
テスト自動化の付加機能、詳細なレポート、ログ、他のシステムへの統合などを追加する。必要に応じて追加する。

### TAS updates and upgrades
自動化の更新、アップグレードにより、新しい機能は有効になり、テストケースに利用される。リスクは更新により既存機能へネガティブ影響を起こすかもしれない。リリースする前に、新機能をテストする。

## 8.2 Planning the Implementation of Test Automation Improvement
既存の自動化テストの変更は注意深くプラン、調査が求められる。些細な変更でも全体に及ぼし、信頼性、パフォーマンスに影響しうる

### Identify changes in the test environment components
変更、改善個所を評価する。テスト自動化のパフォーマンスに影響する。テスト自動化の目的は、継続して効果的に走らせることである。変更は徐々に行うべきで、実施の中で影響を測定する。問題がないことが確認できれば、変更を完全に実装する。すべてのリグレッション実施は最後に行い、変更がテスト自動化に影響がないことを検証する。実行中にエラーが見つかるかもしれないが、根本原因を認識し、自動化の改善によるものではないかを確認する。

### Increase efficiency and effectiveness of core TAS function libraries
テスト自動化が成熟するにつれ、効果的にタスクを実施する新しい方法が見つかる。新しい方法はコアファンクションライブラリに組み込む必要がある

### Target multiple functions that act on the same control type for consolidation
テスト自動化で起きる大部分は、GUIへの問い合わせである。これは制御にかんする情報を提供する。この情報でテスト自動化がドロップダウンリストから選択し、フィールドにデータを入力、読み出し、等ができる。情報を引き出す制御をする。

### Refactor the TAA to accommodate changes in the SUT
テスト自動化は、テスト対象の変更に追従する必要がある。テスト対象が進展、成熟につれ、テストアーキテクチャも進展し、テスト対象をサポートすることを確保する。テスト対象の新しい機能が追加のスクリプトを必要としたとき、互換性コンポーネントが新しいテスト自動化を追従するために置かれる


### Naming conventions and standardization
自動化コードの命名規則は事前に定義した基準に沿う必要がある

### Evaluation of existing scripts for SUT revision/elimination
変更、改善プロセスは既存SCRIPTの評価、利用価値、継続価値を含む。例えば、あるテストが複雑で実行に時間がかかる場合、それをいくつかの小さなテストに分解することが、価値があり、効果的になる可能性がある。まれに実施するターゲティングテストは複雑性を排除し、よりよい透明性をもたらす
GoogleChrome – 現在のページのURL・タイトルからMarkDownリンクを生成・クリップボードにコピーしてくれる拡張。 

# Qiitaの記事作成・編集をもっと楽にしよう。

Qiitaに限らず。快適なMarkDownライフを送ろう。

# このGoogleChrome拡張がおすすめ

[Copy Title and Url as Markdown Style - Chrome ウェブストア](https://chrome.google.com/webstore/detail/copy-title-and-url-as-mar/fpmbiocnfbjpajgeaicmnjnnokmkehil/related?hl=ja)

# 昨日までの自分にさよなら

他の拡張を使っていたが、こいつに乗り換えた。

前はこいつを使っていた。

[Copy as Markdown - Chrome Web Store](https://chrome.google.com/webstore/detail/copy-as-markdown/fkeaekngjflipcockcnpobkpbbfbhmdn?hl=en)


# 新しい奴の良いところ。コピーしたらポップアップでお知らせしてくれる。

色がちょっとダサいが、ポップアップがないよりずっと良い。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9d5c05b3-5048-5e9d-d78f-32eee5f21819.png)

# 新しい奴の良いところ。ページ移動した後でもすぐに使える。

なぜか `Copy as Markdown` ではページ移動したあとに遅延のようなものがあり、コピーミスが膨大な量発声していた。


# ショートカット設定

デフォルトは `Control+Shift+C` 。


# オレオレショートカット

自分の環境では何かが干渉しているのか、動かないので、オレオレショートカット設定をする。 `Control+Shift+M` にする。M はマークダウンのMだ。

まあそもそも拡張機能が設定しているショートカット自体「オレオレ」だし、それを自分設定に書き換えたところで、事態は同じようなものだろう。たぶん。おそらく。


chrome://extensions/shortcuts

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/30a5ee44-3e42-8e9c-79e4-a573d2ff61ca.png)


[「オレオレ・キーバインド」はやめなさい。生産性の高いエンジニア・プログラマがデフォルトのショートカット設定を愛する理由。 - Qiita](https://qiita.com/YumaInaura/items/7e0391e04425033839b6)

# もう不幸な事故がもう起こらないように

以前使っていた拡張の影響で、

「他の人の記事のコメントで、まさにその記事自体に、リンクを張ってしまう」
「再帰的！」

そんな事案が発生していた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/57b76237-2645-4256-ad4b-2d95dd7f8e77.png)

[全ての開発者がQiitaへのアウトプットをやめるべき理由 - Qiita](https://qiita.com/qiitadaisuki/items/2160a390ce91283707a1#comment-fc330327d0ca297060ca)

# 環境

- Mac OS X High Sierra
- Google Chrome Version 70.0.3538.77 (Official Build) (64-bit)










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ユニークだけどランダムなプロフィール画像・アイコンジェネレーター。あのドット絵、インベーダーみたいな奴を作成するサービスは？

# 文字列をキーにして、ユニークなランダム画像を生成してくれるサービスがある。

[Identicon generator: generate your identicon avatar](http://identicon.net/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/680c646b-13ea-aa37-55a0-ac354d53bee9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9adbb227-a801-b79a-97d9-5bc1d513e229.png)

# Qiitaでもプロフィール画像・アイコンによく使われている

あの画像はそうだったんだ。


# あわせて読みたい？

- [Qiita Slack Twitter のUX UIデザイン比較 –「プロフィール画像を設定しないユーザー」のアイコン・画像は、ランダム生成して識別できるようにしよう。 - Qiita](https://qiita.com/YumaInaura/items/fd2a5558d247fcba89c6)
- [Qiitaのタイトルは「ググりやすさ」で決めなさい - Qiita](https://qiita.com/YumaInaura/items/09a6dfae85d8b4c4f2d8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Qiita とSlackのUX/UIデザイン–「プロフィール画像・アバターを設定しないユーザー」のアイコン・画像は、ランダム生成して識別できるようにしよう。(+Twitter GREEもちょっと比較)

# Qiita

コメント欄で、どなたが‥どなただ！？ どなただだ！

と思ったケースがあった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/022902fd-0e04-671e-84c0-45b43deaad84.png)

[全ての開発者がQiitaへのアウトプットをやめるべき理由 - Qiita](https://qiita.com/qiitadaisuki/items/2160a390ce91283707a1)



# Slack

プロフィール画像を設定していないと、ランダム生成された半ユニーク画像になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/2401d660-204e-25f1-eddb-27178d91e55b.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/bdb1f31b-2f49-d0c8-be6a-e5c85b15c859.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ed2e04f8-77a8-7464-1f7e-5a8f8c8f1b42.png)

# ランダムなアイコン作成機・ジェネレーター

たまに見かけるインベーダーゲームみたいな、ドット絵みたいな画像は何？

どうやら、文字列に応じてランダム画像を生成してくれるサービスがあるっぽい。


[Identicon generator: generate your identicon avatar](http://identicon.net/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/680c646b-13ea-aa37-55a0-ac354d53bee9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9adbb227-a801-b79a-97d9-5bc1d513e229.png)

# ユーザーアカウント名をキーにすれば、他ユーザーと絶対に画像が重複しない

またひとつ勉強になった。

# ただし、良いものが必ずしも良いとは限らない

ユーザー行動の世界においては。

- ランダム画像、半ユニークが付いたユーザーは、それを気に入って、自分でプロフィール画像を設定しなくなるかもしれない。むしろ愛着を感じるようになるかもしれない。たとえば最初はランダムに決めたパスワードでも、何度も打ち込んでいるうちに愛着が湧いてくるように。
- 「初期設定だと、ちょっと恥ずかしいよね」「きまりが悪いよね」という画像にしておくと、ユーザーは自分でプロフィール画像、アイコンを設定するようになるかもしれない。
  - Twitterではデフォルトアイコンが「鳥の卵」で、「鳥=Twibirdになりきれていない、ちょっと半熟」というニュアンスもあるし、周りからみた時の品も悪くないし、良いバランスだと思う。ランダム生成ではないけれど。
  - GREEのアバターがTシャツ姿なのは「恥ずかしさ」を煽って、アバター課金をしてもらうためだったように思う。

# 技術的なことについての記述

ないよ。

調べて分かったら追記したい。









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Parcelでlessのsourcemapを有効にしたい

現時点でParcelのサイト上でちゃんとしたドキュメントが無いので調べるのにかなり時間がかかった。。

### 見つけた Github Issue
https://github.com/parcel-bundler/parcel/issues/1879

やり方は2つ

0. `package.json`に`less`オブジェクトを定義してそこにコンフィグを記述
0. `.lessrc.js`ファイルを用意し、そこにコンフィグを記述


## `package.json`に`less`オブジェクトを定義してそこにコンフィグを記述

```json:package.json
  "less": {
    "sourceMap": { "sourceMapFileInline": true }
  },
```

## `.lessrc.js`ファイルを用意し、そこにコンフィグを記述

```javascript:.lessrc.js
module.exports = {
  sourceMap: { sourceMapFileInline: true }
};
```

多分他のオプションも指定できるし、プラグインの読み込みもここでできるっぽい。
ただ、上のissueを見る限りではうまく実行できないプラグインもある模様。

ところでLessって`rc`ファイルを使ったコンフィグの読み込みが無いので余計に時間がかかってしまった。
`package.json`でのコンフィグの読み込みって通常`less`のみを使う場合でも有効なのだろうか。
まだまだ勉強が足りませんな。。
【webpack】vue&type=style&index=0&lang=scss

# vue&type=style&index=0&lang=scss

## Error | エラー
Vue の single file component に `lang="sass"`　で style を書き込むと以下のエラーが出ることがある。

```bash
ERROR in ./src/App.vue?vue&type=style&index=0&lang=scss& (./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=style&index=0&lang=scss&) 13:3
Module parse failed: Unexpected token (13:3)
You may need an appropriate loader to handle this file type.
```

※ ./src/App.vue の部分はディレクトリ構造によります。


## Solution | 解決方法

`sass-loader` と `node-sass` をインストールし、_`webpack.config.js`_ に設定を記述する。

1. インストール

    ```bash
    # using npm
    npm install sass-loader@^10 node-sass@^6 --save-dev

    # using yarn
    yarn add sass-loader@^10 node-sass@^6 --dev
    ```

2. _webpack.config.js_ へ以下の記述を追加

    ```javascript
    module.exports = {
      module: {
        rules: [
          {
            test: /\.scss$/,
            use: ["style-loader", "css-loader", "sass-loader"]
          }
        ]
      },
    }
    ```

3. single file component サンプル

    ```vue
    <template>
      <div>
        <h1>Hello World!</h1>
      </div>
    </template>
    
    
    <script>
    </script>
    
    
    <style lang="scss">
    body {
      h1 {
        font-size: 18px;
      }
    }
    </style>
    ```


## Supplement | 補足

`<style lang="scss">` は、`<style lang="scss" scoped>`とすればdata属性が付与されたスコープされたスタイルとなる他、設定を追加すれば postcss なども利用可能です。
【wepbak】vue&type=style&index=0&lang=css

# vue&type=style&index=0&lang=css

## Error | エラー

Vue の single file component に style を書き込むと以下のエラーが出ることがある。

```bash
ERROR in ./src/App.vue?vue&type=style&index=0&lang=css& (./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=style&index=0&lang=css&) 14:3
Module parse failed: Unexpected token (14:3)
You may need an appropriate loader to handle this file type.
```
※ _./src/App.vue_ の部分はディレクトリ構造によります。


## Solution | 解決方法

`style-loader` と `css-loader` をインストールし、_webpack.config.js_ に設定を記述する。

1. インストール

    ```bash
    # using npm
    npm install style-loader css-loader --save-dev

    # using yarn
    yarn add style-loader css-loader --dev
    ```

2. _webpack.config.js_ へ以下の記述を追加

    ```javascript
    module.exports = {
      module: {
        rules: [
          {
            test: /\.css$/,
            use: ["style-loader", "css-loader"]
          }
        ]
      },
    }
    ```

3. single file component サンプル

    ```vue
    <template>
      <div>
        <h1>Hello World!</h1>
      </div>
    </template>
    
    
    <script>
    </script>
    
    
    <style>
    h1 {
      font-size: 18px;
    }
    </style>
    ```


## Supplement | 補足

`<style>` は、`<style scoped>`とすれば `data` 属性が付与されたスコープされたスタイルとなる他、設定を追加すれば scss なども利用可能です。
【webpack】[vue-loader] vue-template-compiler must be installed as a peer dependency, or a compatible compiler implementation must be passed via options.

# [vue-loader] vue-template-compiler must be installed as a peer dependency, or a compatible compiler implementation must be passed via options.

## Error | エラー

webpack で `vue-loader` を使い、single file component をコンパイルする際に以下のエラーが出ることがある。

```bash
[vue-loader] vue-template-compiler must be installed as a peer dependency, or a compatible compiler implementation must be passed via options.
```


## Solution | 解決方法

エラー文にも書いてある通り、`vue-template-compiler` をインストールすれば良い。

```bash
# using npm
npm install vue-template-compiler --save-dev

# using yarn
yarn add vue-template-compiler --dev
```


## Supplement | 補足

Vue の single file component は、
_.vue_ ファイル内に以下のように **template** (HTML), **script** (JavaScript), **style** (CSS) を記述することができる。

```vue
<template>
  <div>
    <h1>Hello World!</h1>
  </div>
</template>


<script>
</script>


<style>
</style>
```

---

更に以下のエラーが出たら

```bash
vue&type=style&index=0&lang=css
```

こちら　https://qiita.com/7110/items/b42748c1183a7069e7a4
【webpack】vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.

# vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.


## Error | エラー

webpack で `vue-loader` を使用する際に以下のエラーが出ることがある。

```bash
vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.
```


## Solution | 解決方法

_webpack.config.js_ の plugins に `VueLoaderPlugin` の記述を追加する必要がる。

```javascript
const { VueLoaderPlugin } = require("vue-loader");

module.exports = {
  plugins: [new VueLoaderPlugin()]
};
```


## Supplement | 補足

### `vue-loader` の使用方法

1. インストール

    ```bash
    # using npm
    npm install vue-loader --save-dev

    # using yarn
    yarn add vue-loader --dev
    ```

2. _webpack.config.js_ への記述

    ※ entry, outputなどは適宜記述ください。　

    ```javascript
    const { VueLoaderPlugin } = require("vue-loader");

    module.exports = {
      module: {
        rules: [
          {
            test: /\.vue$/,
            loader: "vue-loader"
          }
        ]
      },
      plugins: [new VueLoaderPlugin()]
    }
    ```
【Swift】 コードで画面遷移する基本的な方法

技術知識を蓄積するならQiitaじゃなくて、自分でWebサイト立ち上げてそこに書くべきだ！っていう話を見てものすごく共感していつかやりたいなあと思うけど、とりあえずはしばらくはQiitaが使いやすいので使う。

# メモ
画面遷移とか基本的なことなのかもしれないけれど自分は貧弱だし、ググってもsegue使うやつばかりだし、コード使ってると思ったら、なんか難しそうだしと結構時間取られたけど、結構単純な解があったのでメモっておく。

下記のようなコードを画面遷移させたいところで書けば、Segueで言うところのshowと同じ動きで画面遷移してくれる模様。

```swift
self.navigationController?.pushViewController(NextViewController(), animated: true)
```

# 参考
* https://teratail.com/questions/61775