OmniAICreator/Qiita-1.07M huggingface dataset:
ExpoのDevelopment Modeで動作していたTypeORMのクエリが、Production Mode又はビルド後に正常に動作しなくなった。


少しハマりましたが、解決したので備忘録として解決方法を書いておきます。


##開発環境＋バージョン情報
Expo: SDK40
expo-cli: 4.0.17
TypeORM: 0.2.28
(expo-sqliteをドライバーに設定)


##概要
**原因**
Development Mode時とProduction Mode時では、暗黙的に割り振られるエイリアスが異なるため、テーブルを正常に参照できなくなっていた。

**解決方法**
createQueryBuilderを利用する際は、エイリアス名を明確に設定しましょう。

##問題の背景

日付（date）と日記の本文（report）のカラムを持つ日記（diary）エンティティーを定義し、

```TypeScript:diary.ts
import { PrimaryColumn, Entity, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';

@Entity('diary')
export class Diary {
  @PrimaryColumn('integer')
  date: number;
  
  @Column('text')
  report: string;

  constructor(date: number, report:string) {
    this.date = date;
    this.report = report;
  }
}
```

BETWEEN句で指定した、日付間の日記を取得するクエリを定義していました。


```TypeScript:getDiary.ts
import { getRepository } from 'typeorm';
import { Diary } from './entities/diary';

const dateFrom = 20201201;
const dateTo = 20210101;

const diaryRepository = getRepository(Diary);
   .createQueryBuilder()
   .where('diary.dateData BETWEEN :dateFrom AND :dateTo', {
      dateFrom,
      dateTo,
   })
   .getMany();
```

この定義で生成されるSQLはDevelopment Mode時は下記のような感じ

```SQL:develop.sql
select
 diary.date
,diary.report
from
 diary diary
where
 diary.diary between 20201201 and 20210101
```

しかしProduction Modeでは、ビルド時のサイズ縮小化によりDevelopment Mode時とは異なるエイリアス名が指定されており、案の定クエリは正常に動きません。

```SQL:production.sql
select
 diary.date
,diary.report
from
 diary d 　<- ここのエイリアス名がdに省略されている！
where
 diary.diary between 20201201 and 20210101
```

そこでcreateQueryBuilderにエイリアス名を明確に指定することで解決しました。

```TypeScript:getDiary.ts
import { getRepository } from 'typeorm';
import { Diary } from './entities/diary';

const dateFrom = 20201201;
const dateTo = 20210101;

const diaryRepository = getRepository(Diary);
   .createQueryBuilder('diary')　// エイリアス名を明確に指定
   .where('diary.dateData BETWEEN :dateFrom AND :dateTo', {
      dateFrom,
      dateTo,
   })
   .getMany();
```

##後書き

パフォーマンスの検証を後回しにしていたため、Development Mode→apkファイルのビルドを行ってしまい、インストールしたアプリが動かず少し焦りました。
何事も抜け漏れのない動作確認が必要だと感じた課題でした。
Qiitaに動画を埋め込む方法。Macデスクトップで動画作成後GIF化するまでの手順詳細

Qiitaでたまに見かける記事内に動画を埋め込む（アップロードする）方法について。（macのみ）


![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/f1186ca6-410e-01d7-6ed8-8185b51de2e2.gif)


手順は大きく２つ。
1. 動画の作成
2. GIFファイルに変換



##動画の作成
###1. 動画ツールの起動

`command + shift + 5`をクリック。

動画および画面キャプチャツールが起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/86a81e1c-2fe3-846f-ca65-3953e455f832.png)



<br>
###2. 撮影範囲を選択
以下アイコンをクリックし、画面上で選択範囲を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/d236e532-5413-c9c8-1575-c59c1d949ef1.png)

↓　撮影したい範囲を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/25036a96-219c-b320-1195-2920dbee2779.png)


<br>
###3. 収録開始
収録ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/134c2d2c-f746-c21f-0c0c-6da219207a8e.png)

以上で収録開始。かなり簡単。


<br>
###4. 収録の停止
収録の停止

`command + control + esc`

または、デスクトップ右上に表示されるストップボタン、および、タッチバーからも可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/dece9232-9ef2-90ac-99f1-37693087d6e1.png)

タッチバーが圧倒的にかんたん。


<br>
###5. 収録した動画を編集
収録を停止すると画面右下にサムネイルが表示されるのでこれをクリック。（数秒間のみ表示）

クリックすると編集ツールが起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/323e9fd9-167a-1bc0-b89c-f15e4a5c1dd7.png)


**▼クリックする前に消えてしまった場合**
表示が消えてしまった場合は保存された画像を右クリックすれば、オプションから画像ツールを起動できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/24d545bc-bcf4-95cf-73d2-4a9d6ff9c97d.png)

**トリム**を選択する。


必要に応じて、黄色い枠をドラッグして開始と終了時間をトリムする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/5248fe8c-8e0b-d67c-0e34-1adfd72c8452.png)


以上で画像の作成が完了。



<br>
##GIFファイルに変換
作成した動画は.movなので、これをGIF動画に変換する。

###1. Appのインストール
PicGIF LITEというツールが操作が簡単でわかりやすい。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/67b1bae7-dd5e-b547-bd32-7400c2f04f45.png)


###2. 動画を編集
Appを開いてビデオの追加を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/595f21a3-2bea-6383-e70e-7202815d227a.png)


動画が自動再生されるので、右下の「読み込み」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/08c12a45-4a2a-13b3-5a91-a1a3860042ca.png)


フレーム数を選択する。
フレーム数が大きいと速度が早く、少ないと遅くなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/0474342e-04e2-bf2d-0f3a-6fa6977dac91.png)


再生して速度を確認。問題なければ「GIFの作成」をクリック。
保存先と名前を指定するだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/20e189a1-7873-fb1d-cb5b-1a2953cecaa6.png)

数秒あれば変換が完了する。


###3. 動画のアップロード
保存した動画をQiitaの編集記事にドラッグドロップすれば完了。

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/51b1f2b2-1223-9f8a-bcde-bc9de487b910.gif)


>※注意
コピペすると画像として読み込まれてしまうため、ドラッグ＆ドロップすること。
RSGT2021 セッションメモ～プロダクトを強化する探索的テスト戦略～

RSGT(https://2021.scrumgatheringtokyo.org)
で自身が参加したセッションのメモ&ふりかえりです。
ふりかえりの手法は、びばさんが配信しているPodcastである、ふりかえりAM ep.4(カンファレンス用のふりかえりをする例)で紹介されていたFun Done Learnを参考にしています。

# 概要

- Noriyuki Nemotoさん
- Day2(1/7) 13:25～13:45
- スクラム/アジャイル開発でプロダクトの品質はうまく担保できていますか？
要求をシンプルにしたり、テストの自動化に取り組んだり、テスト設計をしたり。もちろん品質を担保するには色々なアプローチがありますが、今回は探索的テストの使い方に焦点を当ててお話をしたいと思います。
具体的にはST：スクリプトテスト（テスト仕様書に沿ったテスト）とET：探索的テストの使い分けのパターンを紹介します。探索的テストはコストが少ない割にバグの発見率がいいんです！！
ST->ETシリアル
ST/ET パラレル①
ST/ET パラレル②
ET-> STシリアル
ET->ST->STシリアル
ST&ET STチャーター
品質が悪くて手戻りが多いチームにお勧めします。
自動テストに探索的テストを加えて、安心してスプリントを進めていきましょう。
最後に…探索的テストってテストのアジャイルなアプローチなんですよ！！
# 気になった内容メモ

- スクリプトテストとは、テスト仕様書やテスト設計をして、その内容にしたがってテストするもの。バグがないことを調べるもの。
- 思いつくくままにテストするのは探索的テストでない(アドホックテスト)
- 過去の経験やエラーの経験**だけ**からテストするのは探索的テストではない(アドホックテスト)
- 探索的テストとは、直近の実験から得た気付きを次の実験へと確認するもの by Erisabeth Hendrickson
  - 対話を通してテスト
  - 医療で言うと、問診が探索的テスト。健康診断がスクリプトテスト。
  - バグを見つけるテスト
- 探索的テストを使うメリット
  - 短納期でバグを見つけられる
  - テストの重みづけを変えられる(怪しいと思った部分は重点的にテストできる)
  - 暗黙知の活用に有効
  - 動くソフトウェアを基にテストできる
- 世界的には84％のチームが探索的テストを利用している。スクリプトベーステストは60%弱
- 探索的テストはアジャイル開発との親和性が高い
  - 不確実性を減らす効果がある
  - 必要なテストを全て網羅するのは無理という前提
  - ソフトウェアを動かさずにテストするのは無理という前提
- 探索的テストのスタイル
  - フリースタイル
  - チャーター(探索的テストの道しるべ)を用意するスタイル
    - 一般的にはこの方法が多い
    - チャーターを用意=探索的テストではないので注意。
    - 現実のソフトウェアと対話するのが探索的テスト
    - 手順がないテスト(チャーターに記載されている以上に深い項目をテストしない)にならないように注意
  - タイムボックスで区切るスタイル(セッションベースドテスト)
- 探索的テストだけ、は有り得ない。
- 探索的テストとスクリプトテストの併用例
  - (ST -> ETシリアル) 最初にスクリプトテストを実施してシステムの弱点を見つけて、弱点に対して探索的テストする
    - 流用できるリグレッションテストケースや網羅的自動テストが存在する場合にやりやすい
  - (ET -> STシリアル) ST -> ETシリアルの逆
    - 時間の制約がある時やロジックが複雑な時におすすめ
  - ST/ETパラレル 探索的テストとスクリプトテストを別々の人が並列的にやる
    - 事前に探索したい部分が分かっていて、スキルが違う人がいる場合におすすめ
  - (ET -> ST -> ETシリアル①) 最初に探索的テストをして学習を深める。その後スクリプトテストをして、探索的テストを最後に実施する。
    - システムについて理解が浅い場合におすすめ
  - (ET -> ST -> ETシリアル②) 最初の探索的テストをスモークテストとして実施する
    - 大きな問題(モジュールの結合がうまくいかなくてそもそもシステムが動かない...)がないことを早い段階で見つけるために実施
  - (ST&ET STチャーター) スクリプトテストの仕様書をチャーターとしても流用する
    - ハイブリッドでテストできる人はおすすめ(ハイブリッドでテストできない人だと、探索的テストを深くやりすぎるとテストが終わらない...)
  - 探索的テストの使い方によって、テストの4象限における象限が変わるので注意

# 楽しかったこと

- スクフェス札幌の楽しかった記憶が少し蘇った。
- 根本さんの落ち着いた語り
- Janetさんの講演の後に聞いたので楽しかった。

# やったこと

- アウトプットを意識しながら話を聞いた
- 実際に現場で使っている探索的テストのチャーターを見ながら講演を聞いた

# 学び

- 探索的テストの探索たる所以が理解できた。
- スクリプトテストという言葉の理解
- テスト戦略の使い分け
- 一言で探索的テストと表現してテスト戦略を決めるのは危険ということが分かった。テストの4象限を活用しながら、どういう目的で探索的テストをするのか、プロダクトに応じて使い分けできると良さそう
Regional Scrum Gathering Tokyo 2021 Day 2 参加レポート「スクラムにおける「完成」とはなにか？」


# Regional Scrum Gathering Tokyo 2021 Day 2 「スクラムにおける「完成」とはなにか？」

202/01/07に開催されたRegional Scrum Gathering Tokyo 2021での発表です。
https://confengine.com/regional-scrum-gathering-tokyo-2021/proposal/14653

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人で参加して、その場で実況しつつ、記事も作っています。

# このセッションは
- スクラムガイドにでてくる「完成」ってなんなんだろう？
- 「完成」の定義っていつどうやって作って、守っていければいいんだろう？

というお話です。

# はじめに
スクラムガイド2020と、スクラムガイドで出てくるいくつかの言葉の定義の確認です。

## スクラムガイド2020の変更点は？
- 私事的な部分を削減
- ひとつのチームがひとつのプロダクトに集中
- プロダクトゴールの導入
- スプリントゴール、**完成の定義**、プロダクトゴールの居場所
- 自己組織化よりも自己管理

などなど、色々な変更点がありました。

## インクリメントとは
スクラムガイドのあちこちに登場するインクリメント。
過去に作ったインクリメントと今回のスプリントで作ったインクリメントの集合体のこと。
価値がなければいけない、完成の定義を満たさなければいけません。
そしてこのインクリメントが、プロダクトゴールの実現に寄与します。

## プロダクトとは
価値を提供する手段。プロダクト＝価値を運搬（交換）するもの。
私たちだとソフトウェアが中心になるけれど、プロダクト＝ソフトウェアというわけではありません。
ソフトウェアを動かしているインフラも、ソフトウェアのドキュメントもみんなプロダクト。

## プロダクトバックログには何が含まれる？

プロダクトの改善に必要なものの一覧のことです。

- ソフトウェアの顧客向けの部分
- 内部向けの部分
- 関係するインフラなど、ソフトウェア以外のもの
- 将来の価値を生み出すような検証や実験、学習など

つまりプロダクトバックログは、双発的かつ順番に並べられているものになります。


# 完成の定義とは
ここからは本題、スクラムの**完成**の定義に目を向けます。

## スクラムガイド2020を見てみる
完成の定義については、以下のような記述が。

> 完成の定義とは、プロダクトの品質基準を満たすインクリメントの状態を示した正式な記述で
ある。
> プロダクトバックログアイテムが完成の定義を満たしたときにインクリメントが誕生する。
> 完成の定義により、作業が完了してインクリメントの一部となったことが全員の共通認識とな
り、透明性が生み出される。プロダクトバックログアイテムが完成の定義を満たしていない場
合、リリースすることはできない。ましてやスプリントレビューで提示することもできない。
そうした場合、あとで検討できるようにプロダクトバックログに戻しておく。

んん？？
この内容だと、すべてのプロダクトバックログは完成の定義という共通理解によって検査しないと
インクリメントに変えられないように解釈できる...

## 完成の定義はどんなケースでもあてはまるもの？
ソフトウェア依存の完成の定義や、ドキュメント依存の完成の定義、完成の定義にも色々あるはず。
画一的な基準として完成の定義は用意できないのでは？

## じゃあどうすれば「完成」なの？
各領域（ソフトウェア、ソフトウェア以外、将来の価値創出、...、その他）ごとに完成の定義を用意すべき？
といっても、そんなに一気に完成の定義を決めることはできません。

ここでスクラムの基本に立ち返ってみると、「一気に各領域の完成を定義するより、チームとして**共通理解**を持つことこそが透明性を生むのでは？」という考察に。

# 「完成」の定義を決めて、守っていくには
## いつ、どうやって「完成」の定義を決める？
- 最初のスプリント1開始前に作るのが望ましい
    - 完成の定義がないとインクリメントにできず、PBIが宙ぶらりんになってしまいます。
    - だからこそ、スプリントの前に作成が必要。

- カイゼンのサイクルをまわして、完成の定義を手入れしていく
    - 新しい種類の領域があれば、随時更新していく必要があります。
    - どうなれば完成なの？という会話をスクラムチームでしていく中で、共通理解を持つことが大事。

- 会社として従うべき基準が決まっているなら、それをベースに
    - とはいえこれは議論の余地あり。
    - 会社基準はあれど、社内向け、社外向けなどプロダクトの種類にも依存しそうです。
    
- 足りない要素があるなら、それはチームで作っていけばよし！
- 組織の標準がないなら、それもまたチームで作っていけばよし！

## 完成の定義のレベル感は？
いつでもリリースできる状態が理想。ということは

- 最初からリリースできる品質を維持
- 出荷前にリリースできる品質と、現状の品質ギャップを埋められる

というレベル感が理想。

## 定義をどう守る？
ただその定義を紙に書いて周知しておけば、完成の定義が守れるわけではありません。

- 全員が完成の定義を共通理解することが大事。
- 誰でも見える形でその定義を文書化する。でも一方で全てを明文化・維持するのは難しいというのも事実。
- 自動化できるものは自動化して、意識しなくても守れる仕組み作りをするのは大事。
- とはいえ、レビューなど人間の力も必要。
- 単に定義を標準化したり、チェック項目で機械的にならないよう気を付ける必要がある。
- そしてその定義は、レトロなどをきっかけにカイゼンしていく。


# さいごに
プロダクトはというものは最後まで完成しないのです。
あくまで、スクラムの**完成**はスクラムの完成にすぎないのです。


# 感想
チームとして透明性高く動くために、完成の定義への共通理解を持つことが必要なんだなと改めて認識できました。
あまり定義を形式化・標準化してしまうとただ淡々と作業をこなすだけになってしまいそうなので、
ちゃんと人間の力を入れられる余地を残すことに注意したいです。

余談ですが、私自身昨年10月にオキザリスチームにjoinしてからスクラムガイドの旧バージョン（？）を読んだばかりで、実はスクラムガイド2020をまだ読めていなかったりします...
セッション前に読んでおけばよかったなあと反省しながらお話を聞いておりました。
【Ruby on Rails】「||=」←この代入演算子の使い方まとめ

#代入演算子
`代入演算子`とは、変数に対して何か値を代入する為の演算子です。
以下記事にわかりやすく解説してあるので、わからない方は読んでみてください。

https://wa3.i-3-i.info/word18049.html

`代入演算子`には以下のようなさまざまな種類が存在します。

|記号|意味|
|:-:|:-:|
|=|代入|
|+=|加算して代入|
|-=|減算して代入|
|*=|乗算して代入|
|/=|除算して代入|
|%=|乗余して代入|
|**=|累乗して代入|


#「||=」（or equal）の代入演算子
代入演算子の中に、`「||=」`このような代入演算子も存在します。

「=」と「||」が合体した演算子です。

`「=」`は代入を意味します。上でも記載したが代入演算子の一種です。

```terminal:
a = b
a に b を代入します。
```


続いて、`「||」`はどちらかの条件が成立すれば、trueを返すという演算子です。（ORを意味します。）
これは、**論理演算子**と呼ばれています。
if文と一緒に使うと以下のようになります。

```ruby:
if a || b #a または b がtrueでtrueであればtrueを返す。
 #a か b がtrueの場合
else
 #両方falseの場合
end
```

この2つの演算子が合体するとどのような挙動になるのか。

```terminal:
a ||= b
a がfalseもしくは未定義ならbを代入します。
また a = (a || b) と同じ意味に当たります。
```
というような挙動になります。
実際の例文を以下に記載します。

```ruby:
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end
```
変数`@current_user`が存在する場合、もともと存在する`@current_user`を返します。

変数`@current_user`が存在しない場合、`User.find_by(id: session[:user_id])`でユーザーを見つけ、そのまま`@current_user`という変数に代入します。


上記コードは、以下のように書き換えることも可能です。

```ruby:
  def current_user
    @current_user = @current_user || User.find_by(id: session[:user_id])
  end
```


#参考文献
Rails tutorial　第８章
https://railstutorial.jp/chapters/log_in_log_out?version=4.2#cha-log_in_log_out
deviseのlockableを使うときに意識しないといけないこと

## つまり

`config.unlock_strategy`を`:time`や`:none`にするときはよく考えて

## バージョン

* Rails 6.1.0
* devise 4.7.3

## lockableについて

deviseのlockableは、ログインに何回か失敗したらアカウントロックを行う、というもの。
注意すべきは、「ログインがロックされる」のではなく、「アカウントがロックされる」のだということ。
これは、アカウントロック中にアクセスしたログイン中セッションは、全て強制ログアウトされる動作になる。

これを利用して、次のようなイタズラをされると、結構困る。

1. ユーザAがdeviseを使ったwebサービスにログインしている
2. 他人がユーザAのメールアドレスでログインしようとするが連続で失敗して、ユーザAのアカウントロックされる
3. ユーザAがアカウントロック中にwebサービスにアクセスする
4. ログアウトされて、ユーザAはロック解除されるまでwebサービスが利用できなくなる

### 回避方法

同回避するか、3つほど考えた。

#### メールアドレスでアンロックできるようにする

deviseの設定に`unlock_strategy`という物があり、これには`:email`、`:time`, `:both`, `:none`が指定できる。

* `:email`
    * アンロックするリンクをメールで送信する
* `:time`
    * 指定時間が経過するまでロックされる
* `:both`
    * `:email`でアンロックするか、`:time`で自然にアンロックされるか両方
    * デフォルトはこれなので、比較的安心か。
* `:none`
    * アンロック方法は無い。アンロックにはDB直接いじるしかなさそう？

このうち、`:email`と`:both`の場合はロックされたアカウントの所有者が自分でロックを解除できるので、アカウントを使用できなくことに関する被害は少ない。
けど、`:time`の場合は、イタズラでロックされたユーザがいた場合に、時間経過で解除されるのを待たないといけない（`config.unlock_in`のデフォルトは1時間）ので、困ることも発生する。

#### ログインだけロックする

「アカウントロック」ではなく、「ログインをロック」にする場合。
難易度が非常に高いからおすすめしないのだけれど、`active_for_authentication?`をオーバーライドする方法がある。
めっちゃ単純なアプリでlockableのみを使っている場合は、次のようにしても良いかもしれない。

```ruby
  def active_for_authentication?
    true
  end
```

でも、confirmableとかも使っている場合は？ 他にも色々なアカウントのアクティベーションに関する仕様がある場合は？
安易に`active_for_authentication?`を`true`にしないようにしましょう、余計なセキュリティリスクが増えます。

#### deviseを使わない

例えば、deviseを避ける

### 終わりに

セキュリティに関する話なので、間違っているとまずい・・。
厳しいご指摘お待ちしております。
【PowerShell】Get-Contentで読んでforeachでWrite-Outputするときに文字化けする対策

#環境
確認したのは以下の環境。
・Windows10
・PowerShell v5.1

#やりたいこと
テキストファイルの内容を読み込んで、そのままテキストファイルに書き出し。（という簡単な場合を考える）

#問題点
`foreach($line Get-Content <filename>)`の形で読み込んで、`Write-Out`すると（ここが`Write-Host`でも同様）文字化けする。（たとえば、元ファイルの文字コードがUTF-8の場合になる）

#解決策
`Get-Content`に、オプションで`-Encoding <文字コード>`を付けてやる。

#例（元ファイルがUTF-8の場合）
以下で文字化け回避。

```
foreach($line Get-Content -Encoding UTF8 <filename>) {
  Write-Out $line | Out-File <output filename>
}
```
tfswitchをmacにインストールする

[tfswitchをlinuxにインストールする](https://qiita.com/horit/items/8ca232015f08cef90815)
この記事のmac版。

# tfswitchとは？
公式：https://warrensbox.github.io/terraform-switcher/

日本語資料が少ないようなので、改めて使い勝手を記載しようと思います。

使いたいバージョンを選ぶだけ！！

```
$ tfswitch
Use the arrow keys to navigate: ↓ ↑ → ← 
? Select Terraform version: 
  ▸ 0.14.4 *recent
    0.14.3
    0.14.2
    0.14.1
↓   0.14.0
```

インストール済みのバージョンは `*recent` って記載されます。
インストールされてないバージョンも選択するだけで、自動でインストールされて使えるようになります。
新しいバージョンもリリースされると勝手に選択肢に追加されてます。

以上！簡単！

その他の使い方はした事ありませんが、公式サイトに載ってました。
https://tfswitch.warrensbox.com/Quick-Start/

# インストール
公式：https://tfswitch.warrensbox.com/Install/#homebrew

macOS Mojaveで試しました。

```
$ brew install warrensbox/tap/tfswitch
（省略）

$ terraform --version
bash: /usr/local/bin/terraform: No such file or directory
（初回、なにもバージョン指定していない状態だとエラーになる）

$ tfswitch
✔ 0.14.0
Downloading https://releases.hashicorp.com/terraform/0.14.0/terraform_0.14.0_darwin_amd64.zip to terraform_0.14.0_darwin_amd64.zip
Downloading ...
34386076 bytes downloaded.
Switched terraform to version "0.14.0"
$ terraform --version
Terraform v0.14.0

Your version of Terraform is out of date! The latest version
is 0.14.4. You can update by downloading from https://www.terraform.io/downloads.html
$ tfswitch
✔ 0.14.4
Downloading https://releases.hashicorp.com/terraform/0.14.4/terraform_0.14.4_darwin_amd64.zip to terraform_0.14.4_darwin_amd64.zip
Downloading ...
34312707 bytes downloaded.
Switched terraform to version "0.14.4"
$ terraform --version
Terraform v0.14.4
```

# トラブルシューティング
tfswitchのインストール前にterraformをインストールしちゃってると、`brew unlink`を促されました。
アンインストールしちゃってもいいと思います。

公式のトラブルシューティングはこちら：https://tfswitch.warrensbox.com/Troubleshoot/
【初心者向け】Visual Studio Code への Prettier 導入について

Prettier は、JavaScript、TypeScript、CSS、HTML などのコードフォーマッタでソースコードの自動整形をすることができるソフトウェアです。

これを Visual Studio Code (VS Code) に組み込む際に色々なサイトを参考にさせて頂きましたが、 VS Code のプラグインだけインストールすれば良いのか npm module をインストールする必要があるのか非常に分かりにくかったため、ここに覚え書きしておきます。

導入方法についてはこちら → [Visual Studio Code へ ESLint と Prettier を導入する](https://qiita.com/genbu-jp/items/a48bcb9df209b71c2de3)

## 結論
結論からいうと、

- コードエディタとして VS Code のみを利用する場合は、npm module のインストールは不要
- 他のエディタを使用する場合は、npm で prettier をインストールしてコマンドラインから prettier を実行する必要がある
- つまり、プロジェクトなどで開発者が別々のエディタを使用している場合は npm module を導入する必要がある

## Prettier - Code formatter

VS Code の Prettier プラグインはこちら。

| 名称 | plugin id |
|:--|:--|
| Prettier - Code formatter | [esbenp.prettier-vscode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) |

- このプラグインは prettier 本体がバンドルされており、インストールするだけでコードフォーマッティングができる。
- デフォルトでは、プロジェクトの`package.json`[^1]に`prettier`が含まれている場合は、ローカルインストールされた npm module の prettier を優先して使用する。
- ただし、ローカルインストールされた npm module の prettier がない場合は、プラグインにバンドルされた prettier を使用する。
- ローカルインストールされた npm module がない場合、かつ VS Code設定 (settings.json) の`prettier.resolveGlobalModules`が`true`になっている場合は、グローバルインストールされた npm module の prettier を使用する。
- ただし、上記と同様にグローバルインストールされた npm module の prettier がない場合は、プラグインにバンドルされた prettier を使用する。

## 参考サイト
[Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)

[^1]: ローカルインストールの npm module が記載されたファイル
RSGT2021 セッションメモ～スクラムをスケールするとはどういうことか？～

RSGT(https://2021.scrumgatheringtokyo.org)
で自身が参加したセッションのメモ&ふりかえりです。
ふりかえりの手法は、びばさんが配信しているPodcastである、ふりかえりAM ep.4(カンファレンス用のふりかえりをする例)で紹介されていたFun Done Learnを参考にしています。
# 概要

- ryuzeeさん

- Day2(13:00-13:20)

- スクラムガイドには「完成」という単語が36回、「完成の定義」が12回登場します（弊社調べ）。ほかの代表的な単語を調べてみると、スプリントバックログは16回、スプリントレトロスペクティブは12回です。
  つまり、スクラムにおいて「完成」は非常に重要な意味を持つことは明らかです。

  しかし、「完成」に対する認識がスクラムチームのなかで違ったり、組織での品質の基準をまったく考慮せずに開発を進めていった結果、リリース直前に品質上の大きな問題が起こったといった話もよく聞きます。

  ネット上の記事を調べても、「完成」が重要な意味を持つ割に「完成」とは何なのか、どのように「完成」を定義し、どうやって「それを守っていくのか」というノウハウはあまり出回っていません（と認識しています。プロダクトバックログの話なんかは山のように見かけるんですが）。

  そこで、本セッションでは、「完成の定義」をできる限り深堀りし、今後みなさまが「完成」を守っていく上でのヒントを共有します。

# 気になった内容メモ

- スクラムガイドを踏まえて完成の定義について考えていくセッション
- スクラムガイドのアップデートに伴い、インクリメントに対するコミットメントとして、完成の定義(DOD)が必須になった。
- インクリメントって誤解を招きやすい単語
  - 過去に作ったインクリメントと今回のスプリントで作ったインクリメントの集合体
  - **プロダクト**ゴールの実現に寄与する
- プロダクトとは、価値を提供する手段であり、価値を運搬or交換するもの
- プロダクトはソフトウェアと言い切るのは無理がある。価値を運搬/提供するものだから、営業とかも入るはず。
- つまり、プロダクトバックログには、インフラ整備や将来に向けた実験も入る可能性がある。要するに、価値があればプロダクトバックログには何でも入る可能性ある。
  - 大まかに分けると、顧客向け/内部向け/ソフトウェア以外/将来の価値創出/その他
- スクラムガイド2020によれば、すべてのプロダクトバックログは、完成の定義という検査を経て、インクリメントに変遷する。
  - これを踏まえると、完成の定義とはどんなものだと言えるか？
  - プロダクトをソフトウェアとして考えるとおかしな完成の定義になる...
    - 例) 単体テストが全部パスしてall greenになっていることって、将来の価値創出に繋がってない...
  - てことは、顧客向け/内部向け/ソフトウェア以外/将来の価値創出/その他それぞれに完成の定義が必要？？？
  - そんなことはない。正式な記述を顧客向け/内部向け/ソフトウェア以外/将来の価値創出/その他それぞれに記述するのはコストもかかるし、本当に正確なものかも分からない。
  - 正式な記述よりも共通理解が大切。
- 完成の定義はスプリント1の前に作るべき。でも、継続的手入れは必要(例えば、いつもPBIに記述するような受入基準は完成の定義になる必要がある)
  - 正式な記述という考え方がミスリードを生むリスクがあるので注意。
- 組織標準の開発基準はryuzeeさん的には議論の余地が大いにあると思う
  - POCなのかどうかとか、どれ位の性能や信頼性が求められるのか...はプロダクトによって違う
- 結局完成の定義は、チームで共通理解することが一番大切
  - 全員が完成の定義を理解しなきゃいけない。文書で書いてそれを守ればOKではない。
  - チームが意識せずに守れる仕組みにしなきゃだめ(NG : チェックリスト)
  - 継続的にメンテナンスしないとダメ
  - 文書化は大切だが、チームで共通理解するのはもっと大事

# 楽しかったこと

- 初めてryuzeeさんの講演を聞いた！めちゃくちゃ聞きやすい。
- 一番大事な話の内容w(プロダクトマネジメントの宣伝でした！)
- 抜群に説明が分かりやすい。

# やったこと

- アウトプットを意識しながら話を聞いた
- プロダクトマネジメントを購入した

# 学び

- DODなど、正解がないようなものは全てチームで共通理解をすることが大切
- チェックリストは自身の現場でたくさん導入しているが、意識づけはできていないしメンテナンスもされていないので、見直ししたい
- DODも文書としてはあるが、チーム全員がどういう解釈をしていて、どれ位重きを置いているかは分からない。一度チームで共通理解をする場を設けないと有効に機能しない。
WSL2でgitlab-runnerを実行する

## はじめに

[ローカルマシンにGitLab Runnerを導入してGitLabでCI/CDする方法](https://qiita.com/kabik/items/10d152e0183a1cf55d23) でGitLabのCI環境をローカルに立てる方法を記事にしたが、`.gitlab-ci.yml`を変更する際、テストのために何回もコミットするのは美しくないと思ったのでgitlab-runnerをローカルで実行できるようにした。今回はその時のメモ。


## 環境

WSLのバージョン

```shell
> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop-data    Running         2
  Ubuntu-18.04           Running         1
  docker-desktop         Running         2
```



## WSLにgitlab-runnerをインストールする

下記を実行する

```shell
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install gitlab-runner
```


インストールできたか確認

```shell
$ gitlab-runner -v
Version:      13.7.0
Git revision: 943fc252
Git branch:   13-7-stable
GO version:   go1.13.8
Built:        2020-12-21T13:47:06+0000
OS/Arch:      linux/amd64
```

## gitlab-runnerを実行

### `.gitlab-ci.yml` のあるディレクトリに移動

```shell
cd {your_directory}
```

### ジョブ実行

```shell
gitlab-runner exec docker {job_name}
```


## 参考
* https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2773
* https://qiita.com/itTkm/items/a88cb933d789398f653d


## おわりに

これで `.gitlab-ci.yml` 自体のテストがしやすくなった。

みなさま良きCIライフをお送りください。
「bundle exec rubocop -a」を使って失敗したお話


■状況
staffマイグレーションの簡単な修正を行う
コンフリクトが起きる
ローカルのmainブランチを最新にする
git merge メインブランチを行い、コンフリクトを解消する
「bundle exec rubocop」でいくつかエラーが出たため、「bundle exec rubocop -a」を実行
「bundle exec rubocop」を行うが、以下のエラーだけ解消されない

```:コンソール
# bundle exec rubocop

app/models/user.rb:47:3: C: Rails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.
  validates :email, presence: true, length: { maximum: 70 }, ...
```

しかし、このファイルは今回自分は触っていないため、原因が分からず。

結果、以下の方法で検証・解決しました。

・念のためメインブランチをテスト実行→エラー0件
・そのため、「bundle exec rubocop -a」が何かしているのではないかと予測
・確認した結果、rubocopの警告を無視する記述(コメント)が自動的に削除されている事が判明

削除された記述を戻し、エラーは0件となりました！

rubocopの警告を無視する記述に関しては
以下が参考になるかと思います。(古いかも？)

https://qiita.com/tbpgr/items/a9000c5c6fa92a46c206
ササっと解決！！firebaseのhostingで変更内容が反映されない時の対処法

皆さんこんにちは！

ここで質問なのですが、皆さんはフロントの部分を実際の環境でテストする際に何のアプリケーションを使っていますか？

色々あるとは思うのですが、多くの人はNetlify、firebaseなどを使うことが多いと思います。（主観）

今回は、その中でもfirebaseのHostingについて書いていこうと思います！

先日、いつものように``firebase deploy``をコマンドで入力し、実際の環境ではどのように動くのか試してみたところ、deploy自体にエラーは無いものの変更内容が反映されない。。。

こりゃ、困った。

色々調べてみたところ、firebaseに限らずどうやらエラーが無く正常に動作している場合の多くは、**キャッシュ**が原因らしい。

なので、``firebase.json``にキャッシュを消去する設定を加えてあげることで解決できるらしい。

以下のように、``headers``にキャッシュの設定を加えたら変更内容が反映されました！

```firebase.json
{
    "hosting": {
        "public": "dist",
        "ignore": [
          "firebase.json",
          "**/.*",
          "**/node_modules/**"
        ],
        "rewrites": [ {
            "source": "**",
            "destination": "/index.html"
          } ],
        "headers": [{ 
            "source" : "**", 
            "headers" : [{ 
              "key" : "Cache-Control", 
              "value" : "max-age=300" 
          }] 
        }] 
      }
}
```

``max-age``の説明についてはfirebaseの[ドキュメント](https://firebase.google.com/docs/hosting/manage-cache?hl=ja#set_cache-control)を参照してください。

これで変更内容が反映されると思います！

以上、「ササっと解決！！firebaseのhostingで変更内容が反映されない時の対処法」でした！！！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
第2回オンラインMATLAB講習会　開催レポート

![201229図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/4fa1a0b4-7dbb-ec45-de4b-d97bd5414b70.png)

昨年末、12/28(月)に第二回目の学内生向けのオンラインMATLAB講習会を開催しました。
今回もそのレポートをまとめておきます。

第一回の記事は[こちら](https://qiita.com/UT_MATLAB_Amb/items/c210bbacf4a0809a8d79)。
**　**

#自己紹介
東大学内でMATLABの学生アンバサダーをやっている院生です。
学内生向けにMATLABを使ったり勉強したりする際のサポートを行っています。
具体的には今回のような講習会を開いたり、Google Form使ってMATLAB相談室を開いたりしています。

　**MATLAB相談室**　https://forms.gle/WThbu6QQb89zT3597

SNSもやっています。

　**Twitter**　　@UT_MATLAB_Amb 
　**Facebook**　[@UTokyoMATLAB.Amb](https://www.facebook.com/UTokyoMATLAB.Amb/)

最近はWebページを開設しました。
　**Webページ**　https://sites.google.com/view/ut-matlab-amb/

今回の講習会の準備では東大の教養教育高度化機構やシステム本部の先生方に加えて、MathWorksの方、また告知の際には教養・総合文化の事務の方々にお世話になりました。ありがとうございます。

**　**
#講習会概要

今回は基本的に前回と同じで、対象は「今までMATLABを触ったことがない人」でした。

前回は早めに告知を出した結果、申し込みが殺到して早めに締め切ってしまったという経緯があり、その反省を踏まえて今回は教養学部のHPにお知らせを出してもらったのが開催1週間前、それでも年末の開催にも関わらず30件以上の申し込みをいただきました。ありがとうございます。

　
今回もZoomで開催し、前回よりちょっと短めで約2時間半行いました。

実際の参加者は20名強で7割は理系。今回も理系が多めでした。
学年で見ると修士の方が多めな印象、院生には年末も関係ないですからね……。
教養学部・総合文化のWebサイトの「お知らせ」を見たって方とSNS経由が半々くらい。あのSNS見てくれてる学生ちゃんといたんだ……（驚愕）。

**これを機にフォロワー増えてくれると嬉しいんですけどね！**

実際にやったのはMATLABが出しているオンライン学習コース「MATLAB入門」という2時間の自習用コースで、これを説明しながら進めていきました。
**　**

#やってみて
第二回ということで運営サイドもスムーズに進められたと思っています。
時間は前回よりも短かったですが、進度は前回よりも順調でした。質問がやや少なめだったのかも？
![2020-12-28 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/96d320f2-cb4e-3232-c467-677142fbea17.png)
講習会の様子。説明をする美少女と猫。

**　**
**振り返りアンケートから抜粋した「参加者の声」**
>一人では中々やる気も技術もなかったのですが、この講習会をきっかけにしてMATLABを使ってみようと思います。ありがとうございました。

　そうなんですよね、一人だとやる気が出ない。マジで。

>グラフを簡単作ることができて驚いた。pythonとmatlabとをそれぞれのいいとこ取りをしていきたい。

　MATLABのグラフ作成優秀ですよねー。pythonも便利、わかる。

>他のMATLABコースについてもこのような講習会を開いてもらえると助かります。

　前向きに検討します！
**　**
**　**　
いただいた感想を見て見ても、やっぱり「MATLABを触り始めるきっかけ」として講習会は結構いいのかな、と感じています。今後も定期的にやっていければと思います。

参加してくださった方はこれをきっかけにして、ぜひ他の学習コースをやったり自分でMATLABを色々触ったりして遊んでもらえればうれしいなと思っています。

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/8889dd4b-8df6-368c-6646-2bec66f70251.png)
色んな学習コースがあるので見てみてください。

**　**
#おわりに
年末開催決めた時は「人来なかったらどうしよう……年末とかみんなやりたくないよな……でも私は暇なんだよな……」とかいろいろ考えてたんですが、ちゃんと人集まってくれてありがたい限りです。

そろそろ期末試験なり卒論なりの時期だと思うのでみなさん頑張ってください。
私もこれからレポートを書きます。~~これ書いてる場合じゃない。~~

![Em6d6H3VkAARVAi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/99d5f35d-9a1e-a54c-14f2-0cf260cf91a0.jpeg)
今回も参加するとこんな感じのグッズがもらえました。
グッズの中身は時々変わります。
RとJMPの分位点

RとJMPを行ったり来たりしてデータを解析してるんですが、Rで0.5%と99.5%の分位点を出した時にあれ？ってなったのでメモ。
データはみんな大好き`iris`ちゃんを使いました。
JMPにも同じサンプルデータが入ってるんですね。ずっと使ってるのに知らなかった〜
参考：[あやめの測定値を検討する](https://www.jmp.com/support/help/ja/14-2/eg-parallel-8.shtml)

# 動作環境 （2021/01/08 追記）
- macOS Catalina 10.15.7
- R version 4.0.2 (2020-06-22)
- R Studio Version 1.3.1093
- JMP® Pro 15.0.0

# 【JMP】一変量の分布
iris.jmpのデータを開いたら、シンプルに一変量の分布で`がくの長さ`の分位点を出してみます。
![スクリーンショット 2021-01-07 0.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005648/a850328e-dba5-a7f1-1aa3-7011a04031c4.png)
0.5%が4.3、99.5%が7.9でした。

# 【R】stats::quantile()
深く考えず、irisを読み込んでquantile()で0.5%と99.5%の分位点を出します

```r:quantile
data("iris")
iris$Sepal.Length %>% quantile(c(0.005, 0.995))

> iris$Sepal.Length %>% quantile(c(0.005, 0.995))
  0.5%  99.5% 
4.3745 7.7510 
```

おや…？
どゆことやねん！とおもって`?quantile`で確認。
どうやら分位点は求め方がいくつかあるようですね。ここで`type =`を指定しないといけないのか…と気づく。

>分位点の説明は[藤本先生のHP](http://kj01.kgu.mydns.jp/fujimoto/tips/qptile.html)がめちゃくちゃ参考になりました。

# とりあえず全部のtypeを出してみた
[Wikipedia](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample)をみてもJMPがどれに該当するかよくわからなかったので、とりあえず全typeで結果を出してみることにしました。

```r:type1から9を試す
x <- iris$Sepal.Length
results <- list()
for(i in 1:9){
  results[[i]] <- quantile(x, c(0.005, 0.995), type = i)
}
bind_rows(lapply(results, as.data.frame.list))

> bind_rows(lapply(results, as.data.frame.list))
     X0.5.  X99.5.
1 4.300000 7.90000
2 4.300000 7.90000
3 4.300000 7.70000
4 4.300000 7.75000
5 4.325000 7.85000
6 4.300000 7.90000
7 4.374500 7.75100
8 4.308500 7.88300
9 4.312625 7.87475
```

どうやらデフォルトは`type = 7`みたいですね。
そして、JMPで出した分位点と同じ値になったのは`type = 1, 2, 6`でした。
試しに0.25%と97.5%の値も確認しましたが、こちらも同じ。
というわけで、xを`iris$Sepal.Width`に変えてみます。0.05%、0.25%、97.5%、99.5%の値も見てみることにします。

```r:x=Sepal.Width
x <- iris$Sepal.Width
results2 <- list()
for (i in 1:9) {
  results2[[i]] <- quantile(x, c(0.005, 0.025, 0.975, 0.995), type = i)
}
bind_rows(lapply(results2, as.data.frame.list))

> bind_rows(lapply(results2, as.data.frame.list))
    X0.5.    X2.5.   X97.5.  X99.5.
1 2.00000 2.200000 4.000000 4.40000
2 2.00000 2.200000 4.000000 4.40000
3 2.00000 2.200000 3.900000 4.20000
4 2.00000 2.200000 3.925000 4.25000
5 2.05000 2.225000 3.975000 4.35000
6 2.00000 2.200000 4.022500 4.40000
7 2.14900 2.272500 3.927500 4.25100
8 2.01700 2.209167 3.990833 4.38300
9 2.02525 2.213125 3.986875 4.37475
```

`type = 1,2`と`type = 6`で異なる値になりました！
JMPでも`がくの幅`の分位点を出してみます。
![スクリーンショット 2021-01-07 12.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005648/44520771-ed5f-6102-2582-b73310e15f16.png)
`type = 6`と同じ値になってますね。

# 結論
どうやらJMPでの分位点の求め方はRのtype = 6に該当するようです。
大量の .csv.gz を解凍して Shift_JIS (CP932) に変換するワンライナー

たぶん誰も役に立たないワンライナー。

文字コードが UTF-8 な CSV を gzip 圧縮したファイルが大量にあって、これを解凍しつつ Excel で開けるように Shift_JIS に変換したい。

``` sh
find . -name '*.csv.gz' -exec bash -c 'a=$(echo "$0" | sed -r "s/\.gz$//"); gzcat $0 | nkf -x -s --cp932 > $a; rm -f $0' {} \;
```

- Mac だと `zcat` じゃなくて `gzcat` を使うというのにハマってしまった [^zcat] (Linux の人は `zcat` を使って欲しい)
- `find -exec` で `xargs` みたいなことができるとは知らなかった、これは便利
- `nkf` で `-x` オプションを付けないと半角カナが全角カナに変換されてしまう

[^zcat]: https://qiita.com/goyachanpuru/items/1efcb0a45266e81aac0e
SQLの超基本メモ


（あまり馴染んでいないのでどこか間違えているかもしれない。随時追加。）

## ログイン・ログアウト

```sql
ssh xxxxxx@www.ooooo       /*サーバーにログイン*/
mysql -u Database_Name -p  /*SQLにログイン*/
quit                       /*SQLからログアウト*/
exit                       /*サーバーからログアウト*/
```

## データベース操作

```sql
create database Database_Name;    /*データベースの作成*/
show databases;                   /*データベースの一覧表示*/
use Database_Name;                /*データベースの使用*/
drop database Database_Name;      /*データベースの削除*/
```

## テーブル操作(`use`宣言したデータベース内での操作)

```sql
create table Table_Name (
	Column1_Name int,
	Column2_Name char(1), 
	Column3_Name text
);								/*データベース内にテーブルを作成*/
show tables;                    /*テーブルの一覧表示*/
show columns from Table_Name;   /*テーブルの列の型表示*/
select * from Table_Name;       /*テーブル内の全データを選択・表示(詳述は下)*/
drop table Table_Name;			/*テーブルの削除*/
```

## データ操作
```sql
insert into Table_Name values (1,'A', 'Apple');		/*テーブルにデータを追加*/

select * from Table_Name;         					/*テーブル内の全データを選択・表示*/
select Column1_Name, Column2_Name from Table_Name; 	/*列を指定してデータを選択・表示*/
select * from Table_Name where Column1_Name=1;	   	/*条件式を満たす行を指定してデータを選択・表示*/

update Table_Name set Column3_Name='Astronaut' where Column2_Name='A'; /*(selectした範囲内で)データを更新*/
delete from Table_Name where Column1_Name=1;		/*(selectした範囲内で)条件式を満たすデータを削除*/

/*こういうこともできる*/
select Table1.Column3, Table2.Column3 from Table1, Table2
select * from Table1, Table2 
    where Table1.Column1=Table2.Column2 and Table1.Column2=Table2.Column2
```

## その他

### つまづいた所メモ

基本はデータベース>テーブル>データの入れ子。

SQLのデータベース名やテーブル名にしばしばつけられている引用符は`''`ではなく``` `` ```だが、そもそもあってもなくてもsyntax errorにはならないから個人的には書かない。一方で、`insert`文にあるように、文字列型の`''`は当然必要。

SQLは`select`以外の方法でデータの中身を見る方法がない(?)か、あまりポピュラーじゃない。
「取得」とか「抽出」という言葉を使うよりも、直訳した「選択」を使った方が語弊がない。
たまに間違えると``` `> ```とか``` -> ```とかになって文から出られなくなる時がある。最悪Control+CでAbortできるが、あまり起こさないように注意。;で終える。

joinを使えばデータの結合がより簡単になるらしい。

### SQLの型の例

|型名|使用例|
|:-:|:-:|
|固定長文字列型|`char(5)`|
|可変長文字列型(()内は最大文字数)|`varchar(7)`|
|可変長文字列型|`text`|
|整数型|`int`, `bigint`|
|浮動小数点型(概数型)|`real`, `float`, `double`|
|固定小数点型(真数型)|`decimal(5,2)`,`numeric(3,4)`|

※`varchar`型に文字数オーバーの`insert`をすると、Warningが出るだけで文字列の頭だけ入ってしまう。
※`decimal`型と`numeric`型は全く同じ。小数を代入する際は`(精度(全部の桁数),スケール（小数点以下桁数）)`を書かなければならない。スケールのデフォルトが0桁なため。
Dockerとは何？　どういう用途で使われる？

#はじめに

プログラミングを学習していると、Dockerってよく聞きます。

就活するうえでDockerは必須スキルみたいで。何ができるのかを勉強しながら少しずつアウトプットできたらと思います。


#Dockerとは何か
- コンテナ型仮想環境を作成、実行、管理するためのプラットフォーム
- Dockerのソフトウェアを使って素早くコンテナ起動し、様々なアプリケーションを実行することができる
- 異なる環境(PCやサーバ)で簡単に同じ仮想環境を再現できる
- Dockerのソフトウェア自体はGo言語で書かれている


・コンテナとは一種の仮想環境のことです。PCやサーバー上にコンテナを作成して、そのコンテナの中でプログラムを実行することができます。
###例えば

Pythonのアプリケーションを実行したい場合は、Pythonがインストールされたコンテナを使えば即座にPythonアプリケーションを実行して動作を確認することができる。
このように用途に合わせたコンテナを起動することで様々なアプリケーションを素早く実行できるのがコンテナ型仮想環境の特徴です。

また異なるPCやサーバで同じ環境を再現したい場合、dockerの設定ファイルを共有することで簡単に同様の環境を構築することができます。
これは開発チームのメンバー間で同じ環境を用意する際に重宝されます。

あとdockerのソフトウェア自体はGo言語で書かれています。普段はそれほど気にすることでもないのかもしれませんが、dockerコマンドの出力形式を指定する場合にGoテンプレートの書式を使用するなど多少Go言語に慣れておくと使いやすい面もあるのかなと思います。

#Dockerはどういう用途で使われる？
- アプリケーション開発環境
- 検証環境、本番環境
- Webサーバ、データベースサーバなどの構築
- 各種プログラミング言語の実行環境
- その他様々なミドルウェアの環境構築

###アプリケーション開発環境
プリケーション開発環境は開発者個人個人のPCで開発中のアプリケーションを動かす時に使われるケースです。
Webアプリケーションのプロジェクトでは、ほとんどの企業で使われているのではないかと思うほど普及しています。まずプロジェクトに入った時に自分のPCにdockerで開発環境を構築するというケースがかなり多いので、開発者の方は基本的な使い方を習得しなければいけないと思います。
###検証環境、本番環境
検証環境、本番環境は各開発者が作成したアプリケーションをサーバで動かす際もdockerが使われるということです。
アプリケーション開発では開発者のPCに開発環境を用意してアプリケーションを開発します。
アプリケーションが出来上がったらそれをdockerイメージという形で環境とアプリを一つの塊にまとめます。それをdockerリポジトリと呼ばれるイメージを管理するサーバにアップロードします。
そのイメージをほかのサーバでダウンロードしてイメージからコンテナを起動することで基本的には開発したときと同じ環境をサーバ上でも立ち上げることができます。
dockerではこの開発からサーバで稼働するまでの流れを素早く行えることが一つのメリットとなっています。
検証サーバとは一般的に本番リリース前に本番同等の環境で動作確認をするためのサーバで、本番サーバとは実際にユーザーからのアクセスがあるサーバを言います。
一般的なwebアプリケーション開発では、このように開発PCで開発し、できあがったものを検証サーバで動作確認して、問題がなかったら本番サーバにリリースするといった一連の流れを繰り返すことで開発が進むみたいです。
###Webサーバ、データベースサーバなどの構築

Webサーバにはnginx,Apache。データベースサーバにはMySQL,PostgreSQLなど一般的によく使われるものもdockerを使うことで簡単に立ち上げることができます。これらのサーバをコンテナとして作成するために公式に公開されているdockerイメージがあり、このイメージを使うことで簡単にサーバ用途のコンテナを立ち上げることができます。
###- 各種プログラミング言語の実行環境.その他様々なミドルウェアの環境構築
プログラミング言語の実行環境やその他のミドルウェアも同様にdockerイメージが幅広く公開されているので、これらのイメージを使えば様々なコンテナを立ち上げるのが可能になります。
どのようなイメージが公開されているかは、主にdocker hubと言われる、dockerで運営されているサイトで確認することができます


#おわりに
ざっくり説明でした。
Dockerについては、これからどんどん勉強して記事を載せていこうと思います。

間違っている説明がありましたら、コメントで指摘してくださると幸いです。
ElectronでGeoPackageを使う

# GeoPackageとは
界隈では長らくデファクトスタンダードのフォーマットであった`ESRI Shapefile`を駆逐する可能性を秘めた新世代フォーマット。
OSSの代表的なGISソフトウェアであるQGISでは3系バージョンから標準サポートされている。
その他GDAL、GeoToolsなど標準ライブラリなどもサポート済み。

## Shapefileの何が嫌か
### 1レイヤーを格納するのにファイルが多い
最低でも3つ、場合によってはそれ以上のファイルが必要となり、レイヤー数が増えると煩雑に…
以下ESRIのサイトより引用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44921/8265a0a3-21d8-bbf0-e80a-a9fb888834b8.png)

### ファイルサイズ、属性名のサイズの制限がきつい
ファイルサイズが2GBまでとか、属性名が日本語だと5文字までとか前時代的。
イマドキこんなサイズ制限に悩まされるなんて嫌だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44921/5071b673-0e76-4500-9095-e335e0f03ec6.png)

## GeoPackageの良さ
* 複数のレイヤーを1つのファイルにまとめられる
    * ポータビリティに優れる
* サイズ制限が実質ない
    * あるけどその上限に引っかかる前に他の要因がハードルになるレベルだと思う
* 実体がSQLite

# Electronとは
ざっくり言えばWebの技術を用いてクロスプラットフォームアプリケーションを構築できるフレームワーク。
開発者であればVS Code、SlackなどElectronで作られたアプリを使うケースも増えていると思う。

# Electron with GeoPackage
ジオ系アプリの開発をしていると、オフライン環境でもデータを閲覧したい、編集したいという要件が出てくることがある。
その場合、インターネット接続が必須となるWebアプリケーションでは要件が満たせない。
単純な閲覧、編集ならQGISで良いのだけど、そこにビジネスロジックが絡んでくると途端にハードルが上がってしまう。

そこで開発が（自分がWebエンジニアなので）比較的容易であり、Webアプリもネイティブアプリも（ほぼ）同じコードベースで実現でき、ポータビリティにも優れるであろうこの組み合わせに興味が湧いたので試してみた。

## 結果
![geopackage640.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44921/3119f87a-78cc-2b6d-0564-45a3ebb719a5.gif)
データには国土数値情報から東京都のバス停をダウンロードし、GeoPackage化したものを使用している。

[ソースコードはこちら](https://github.com/chaki1019/electron-ol-geopackage)

## 今後
現段階ではGeoPackageをロードして表示しだけなので基本的なユースケースを実装して試してみたい。

* 複数レイヤーの対応
    * レイヤースイッチャーを用意する
    * レイヤー順序を入れ替える
* 属性表示
    * 地物をクリックして属性表示
* 検索
    * 対象地物を属性で検索
* 空間演算 & 検索
    * 任意地点から半径1km以内の〇〇を探す、みたいなことをやってみたい
        * SpatiaLiteのエクステンションを入れればいけそう
C++ builder 10.2 Tokyo > IDE **bug** > プロジェクトファイルが壊れる > USEFORMの中身がフォーム名でなくコンポーネント名に置き換わっている

```txt:動作環境
Windows 10 Pro
RAD Studio 10.2 Tokyo Update 3
```


### ビルド時のエラー

![コメント 2021-01-07 122446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/71b5e958-fc79-9627-9b1b-8cf2a655b788.png)


プロジェクトのcppファイルの`USEFORM("Unit1.cpp", Edit1);`でエラーになる。

```cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Edit1);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
	try
	{
		Application->Initialize();
		Application->MainFormOnTaskBar = true;
		Application->CreateForm(__classid(TForm1), &Form1);
		Application->Run();
	}
	catch (Exception &exception)
	{
		Application->ShowException(&exception);
	}
	catch (...)
	{
		try
		{
			throw Exception("");
		}
		catch (Exception &exception)
		{
			Application->ShowException(&exception);
		}
	}
	return 0;
}
//---------------------------------------------------------------------------
```

### IDEの不具合?

上記は本来は以下が正しい。

```
USEFORM("Unit1.cpp", Form1);
```

どうも、IDEの不具合により、フォーム名ではなくコンポーネント名に置き換わってしまったようだ。
こんな不具合C++ Builderをずっと使っていて初めて見た。
Typoraから文章コピペしたときにちゃんと反映されるかテスト

# 見出し1

## 中見出し

### 小見出し

#### h4

##### h5

##### h6

**太字**

```sql
--コードを記載するよ
select * from v$session
```

```python
#コードを記載するよ
print("helloword")
/*
pythonなんて学生以来書いていないから、間違ってそうで怖いよ
確かCの書き方でだいたい何とかなったはず
*/
```

<u>あんだーばー</u>
``` <u>あんだーばー</u>```
って書いたんだけどダメっぽい。残念…

[いつもお世話になってるMicrosoft神のリンクだよ。](https://blogs.windows.com/japan/author/xueli/)

基本的にこれが正常に出るのであればTyporaで書いてコピペ投稿でいいんじゃないかな。

md形式がめんどくさい宮家としては、Typoraは**<u>神ツール</u>**だよ。
devise gem気づきメモ: リダイレクトの仕様

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

アプリ開発で、トップページを作成する前にdeviseを用いてユーザー管理機能を実装していたところ、分かっているようで分かっていなかったdeviseのリダイレクトの仕様に気づいたので記録として残します。

## deviseの仕様に気づいたきっかけ
トップページを作成する前に、deviseで新規登録機能を実装し、ローカル環境(localhost:3000)で動作確認をしたところ、新規登録後にRailsのお馴染みのトップページにリダイレクトしたことです。
![スクリーンショット 2021-01-07 21.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849306/17ccb8fa-9f54-368c-72b3-28d4db4657ce.png)


## 新規登録の処理後はルートパスにリダイレクトする

新規登録機能（コントローラ:devise/registration#create）の処理後は、ルートパス（root_path）にリダイレクトされます。

`route.rb`でルートパス（root_path）を設定していなかった場合、先程のRailsのお馴染みのトップページが表示されることになります。

## ログアウトの処理後はログイン画面にリダイレクトする

ログアウト機能（コントローラ：devise/sessions#destroy）の処理後は、ログイン画面（コントローラ：devise/sessions#new）にリダイレクトされます。

先述の新規登録→ルートパスへのリダイレクトに気づいて、「じゃあ、ログアウト後はどこにリダイレクトされるんだろう？」と思って確認したところ、ログイン画面にリダイレクトされることが分かりました。
pipで依存関係を含めてまとめてアップグレードする

# はじめに
多数の(相互)依存ライブラリから構成されているPythonライブラリで、一つだけアップグレードしてしまうとライブラリ間でバージョンが異なってうまく動かなくなってしまう場合があります。
そのため、依存関係も含めて一気にアップグレードしたい場合があります。

# 方法
依存ライブラリも含めて一気にアップグレードする方法

```shell
pip install --upgrade --upgrade-strategy eager <パッケージ名>
```

※逆に必要でない限り依存ライブラリをアップグレードしたくない場合は

```shell
pip install --upgrade --upgrade-strategy only-if-needed <パッケージ名>
```

とします。

# 参考
https://docs.microsoft.com/ja-jp/python/api/overview/azure/ml/install?view=azure-ml-py
https://www.it-swarm-ja.tech/ja/python/pip%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%9B%E3%81%9A%E3%81%AB%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F/969608431/
【Mono Depth】SFMLearner

<h1>Unsupervised Learning of Depth and Ego-Motion from Video</h1>


<h1>アルゴリズム</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5bbf4526-71d1-59f9-5490-2b9022682c02.png)

Depth CNN => 1枚の入力でDepth Mapを推定
Pose  CNN => 2枚の入力で6次元の姿勢の変化を推定

<h2>Depth Net</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/cf7340c3-8fb0-9466-6354-55beaa91492d.png)
1枚の画像を入力にEncoder-DecoderのシンプルなネットワークでDepth Mapを推定する。

<h2>Pose Net</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/7c1846b5-0731-6613-dd88-f1b576f6bebe.png)
6次元の姿勢をEncodeで推定し、Decoderでmaskを推定する


<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/68e146ac-e0d5-4b5d-3129-1d343748bcf4.png)
少なくともDepthが推定出来る

<h1>結論</h1>
・PoseとDepthを組み合わせる事で、今回のframeと前回のframeを使う事で、UnsperviseでTraining出来る。

<h1>参考文献</h1>
Unsupervised Learning of Depth and Ego-Motion from Video
https://people.eecs.berkeley.edu/~tinghuiz/projects/SfMLearner/cvpr17_sfm_final.pdf
モバイルアプリ開発における組み込みNoSQL覚書（MongoDB Realm, Couchbase Lite等）

# はじめに

本記事では、モバイルアプリ開発に利用可能な組み込みNoSQLの選択肢について、整理する。

## 組み込みNoSQLデータベース

### MongoDB Realm
[Realm](https://realm.io/)

Swift開発などで多くの利用者を持つ（誤解のないようにいえば、Androidや.Netもサポートしている）。日本語のモバイルアプリ開発入門書でも扱われている。
2019年にMongoDB社により、買収された。

### Couchbase Lite

[Couchbase Lite](https://www.couchbase.com/products/lite)

iOS、Android、.NET（UWP, Xamarin）をサポート。言語として、Swift、Objective-C、Java(デスクトップ、サーバーでも利用可)、C#をサポート。

NoSQLデータベースを提供するCouchbase社の製品カテゴリーCouchbase Mobileの一部であるが、コミュニティ版としても公開されている。

### Kodein DB

[Kodein-DB](https://docs.kodein.org/kodein-db)

KodeinフレームワークにおけるNoSQLデータベース。
Kodeinといった場合、Kodein-DIというDI(dependency injection)コンテナとしての認知が主、といって良いだろう。


### UnQLite

[UnQLite](https://unqlite.org/)

>UnQLite is a document store database similar to MongoDB, Redis, CouchDB etc. as well a standard Key/Value store similar to BerkeleyDB, LevelDB, etc.

### LiteDB

[LiteDB](https://www.litedb.org/)
.Net用の「MongoDB-like」データベース

### iBoxDB

[iBoxDB](https://www.iboxdb.com/)

「Fast ACID Table Style Document NoSQL Database」を謳っている。

## 概観

上記紹介したうち、iBoxDB以外は、ドキュメントストアとしてJSON形式のデータを扱っている。
モバイルアプリの開発においては、アプリケーションが必要とするデータ構造（ドメインオブジェクト）とテーブル構造との間のギャップをORM(Object Relational Mapping)技術を使って埋めることは、いかにも冗長であり、SQLiteのような関係データベース以外の選択肢としては、事実上JSONデータベースがスタンダードといって良さそうだ。
【Vagrant】VirtualBox仮想マシンをWindows上に構築

##目標
Vagrantを利用して、VirtualBox仮想マシンをWindows上に構築する。

##Vagrantとは
仮想マシンの作成やセットアップ、管理、共有を簡単にするための便利な機能を提供するオープンソースのツールです（例えば、`vagrant up`というコマンドを実行するだけで、仮想マシンの構築及び各種設定作業を自動で実行することが可能になります。）。
Vagrantを使用することで、同一の仮想環境をいつでも簡単に再構築することが可能です。
Vagrantでは**Vagrantfile**という環境構築用の設定ファイルを作成し、仮想マシン起動時に特定コマンドやスクリプトを自動実行することが可能です。この機能は「**プロビジョニング機能**」と呼ばれています。
Vagrant自体は仮想化ソフトウェアではないため、他の仮想化ソフトウェアと組み合わせて使用する必要があります。

※[徹底攻略 LPIC Level3 304 教科書+問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-LPIC-Level3-304-Version/dp/4844380540)より一部編集して抜粋

##前提
Vagrant及びVirtualBoxがインストール済みであること（※１）（※２）

※１ インストールは以下のサイトから実施可能です（Windows64ビット用です）。
Vagrant
https://www.vagrantup.com/downloads.html
VirtualBox
https://www.virtualbox.org/wiki/Downloads

※２ Vagrantのインストール確認はcmdから`vagrant -v`で確認可能です。

```
C:\Users\ryosu>vagrant -v
Vagrant 2.2.14
```

##利用環境
OS:　**Windows10（64ビット）**

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [Vagrantfileの作成](#1vagrantfileの作成) |
| 2 | [Vagrantfileの編集](#2vagrantfileの編集)|
| 3 | [仮想マシンの作成](#3仮想マシンの作成)|

##手順
###1.Vagrantfileの作成
コマンドプロンプトからの作業となります。

**①Vagrant専用フォルダ（作業フォルダ）の作成**

```
mkdir c:\Vagranttest
cd c:\Vagranttest
```

**②Boxの検索**
**Box**（Vagrantで使用する仮想マシンイメージファイル）を[Discover Vagrant Boxes](https://app.vagrantup.com/boxes/search)から検索します。

本記事ではCentOS7のBoxを利用します。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/b41bbb3a-64c1-2e43-b5f5-e22fa5646d96.png)

CentOS7のBoxを一覧からクリックすると詳細ページに遷移するので、そこから更に`New`というタブをクリックします。
するとそのBoxを利用したVagrantfileの記述例、及び仮想マシン作成コマンドが確認可能です。

Vagrantfileの記述例
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/6e460c57-ca1a-58f7-e0e2-a28d76ab0265.png)

仮想マシン作成コマンド
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/22582cd8-6820-11a7-aa6e-396c0210eb8f.png)


**③Vgrantfileの作成**
手順②で確認した`vagrant init`コマンドを利用して**Vagrantfile**、及びその他必要ファイルを作業フォルダ上に作成します。

```
vagrant init centos/7
```

###2.Vagrantfileの編集
必要な部分のみを抜粋します。
CentOS7のBoxを利用し、IPアドレスが192.168.33.10である仮想マシンを構築するという処理内容を記述します。

```:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

###3.仮想マシンの作成
`vagrant up`コマンド（※）を実行し仮想マシンの作成を行います。

※`-provider`オプションを利用して利用する仮想化ソフトの選択可能、VagrantではデフォルトでVirtualBoxを利用する設定としているため今回は省略可能

```
vagrant up
```

`vagrant status`コマンドで仮想マシンの状態を確認しdefaultの仮想マシンの状態がrunningであればOKです。

```
c:\Vagranttest>vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```

##参考記事
[Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する](https://qiita.com/ozawan/items/160728f7c6b10c73b97e)

##続き
Vagrantで仮想マシン作成とAnsibleによる簡単なプロビジョニング（Apacheインストール及び起動）を自動化してみました。
[【Vagrant】VirtualBox仮想マシンの構築、及びAnsibleによるプロビジョニング（Apacheインストール）を自動化](https://qiita.com/OPySPGcLYpJE0Tc/items/02c0324608607432483a)
分かりにくい nonlocal

多分、使わない nonlocal だけど

Python 3.9.1 のドキュメント
　　9.2.1. スコープと名前空間の例

が読みにくかったので、自分なりに解釈したコメントを追加。

```python
def scope_test():
    def do_local():
        spam = "local spam"
            # do_local の spam に代入
            #   何処からも参照されないので無意味な処理
            #   動作説明には必要

    def do_nonlocal():
        nonlocal spam
            # do_nonlocal には spam が無い、と宣言
            #   外側にある関数 (scope_test) の spam を使う
            #   global の spam は使わない
        spam = "nonlocal spam"

    def do_global():
        global spam
            # global の spam を使う、と宣言
        spam = "global spam"

    # 以下の "spam" は scope_test のもの
    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

# 以下の "spam" は global のもの
scope_test()
print("In global scope:", spam)
```

こんな感じかな。 global と nonlocal は参照範囲が排他になっている。
Git-it（Git/GitHub学習アプリケーション）のインストール手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621370/bd8158b5-f23c-48b7-8371-d21ff42cee17.png)



Git、GitHubを学習する際にお世話になったこちらのアプリケーション。

下記のサイトより、インストールが可能となっていますが、
今回は、[CLI](https://e-words.jp/w/CLI.html)からの方法でインストールする手順を書きたいと思います。  
初学者あるあるなのかは分かりませんが…、
どうもまだCLI操作がうまくいかず、インストールにだいぶ時間を取られてしまいました…。

素直にzipファイルからインストールすればいいだけなのですが、
ターミナルを起ち上げ、「バシッ」とコマンドを決めインストールする姿に憧れ、トライしてみました。

そんな僕と同じような**CLIビギナー**に、こちらの情報がお役に立てば幸いです。


 <br>

# インストール先はこちら

git-it-electron（CLIはこちらから）
https://github.com/jlord/git-it-electron

git-it-electron(zipファイルはこちらから)
https://github.com/jlord/git-it-electron/releases/tag/3.1.0


# インストール手順
**環境**
- OS：macOS Big Sur
- ブラウザ：Google Chrome
Windows、Linuxでも利用可能のようです。


### 1. ターミナルを起動させる。
まず、お使いのターミナルを起動させホームディレクトリへ移動してください。

### 2. git cloneする。
上記のURLにアクセスし、下記のHTTPSを選択しコピーする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621370/e09c7882-6112-52ba-c203-29a8654b1434.png)


コピーしたHTTPSを、引数へ指定するため以下のように記述します。

```
$ git clone https://github.com/jlord/git-it-electron.git
```
これでインストールは完了です。


### 3. 中身を確認する。
以下のディレクトリが作成されています。

```
$ ls
git-it-electron
```

### 4. git-it-electronへ移動する。

```
$ cd git-it-electron
```

### 5. npmをインストールする。
で、ここからが私が詰まったポイントです。  
アプリケーションは無事にインストールされたようですが、どうやって起動するのか？
ここでだいぶ悩みました…。  
GUI上のFinderからディレクトリ内を確認し起動できるアプリケーションを探したのですが見つからず…(zipファイルでインストールした場合はアイコンが出現します）  

色々と調べた結果、**Node.js**が必要とのことでした。

**Node.js**とはサーバサイド側で動くJavaScriptで、新たにnpm（Node Package Managerの略）をインストールする必要がある。とのことでした。

> [Node\.js](https://nodejs.org/ja/)　とは  
Node Package Manager の略。
JavaScript 系のパッケージを管理するツール。
必要とするパッケージをインストールする際、依存するパッケージもまとめてインストールしてくれる。
ライセンスは Artistic License。GPL に似ているが、改造版を再配布する際に名称変更が必要な点が異なる。
npm パッケージを集めたリポジトリ (npmjs.com) が運営され、40万ものパッケージが登録されている。　*引用：[npm入門 \- とほほのWWW入門](http://www.tohoho-web.com/ex/npm.html)*


以下のコマンドを入力しNode.jpをインストールします。


```
$ npm install
```

インストールされているか確認する方法。

```
$ npm -v
6.14.4
```

### 6. npmを使い、アプリケーションを起動させる。
ここまで来たら後は起動させるだけです。
以下のコマンドを入力。

```
$ npm start
```

成功した場合、以下の画面と共にアプリケーションが起動します！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621370/ecc8b648-16a3-eb9c-1c82-5dbb5ffc9fcc.png)


終了したい場合は、`ctrl + C`

<br>

あとは、手順に沿ってGit/GitHubの学習を進めることができます。

アプリケーションの内容ですが、
Git、GitHubの基本について、手順を追って手を動かしながら学ぶことができ、最後はプルリクエストを実際行うところまで学習できます。

Git、GitHubを始めたばかりの人から、しばらく触ってないなーと復習したい人まで、早い人だと1時間、平均3〜4時間程度で学べるそうです。（僕はだいぶかかりましたが…）

気になった方は、ぜひ一度チャレンジしてみてください！
Qiskitのqasm simulatorで回路の途中の状態ベクトルをメモる(snapshot)

# 回路の途中の状態ベクトルをメモる

qiskitでは、回路実行時にstatevctor simulatorを使うと、状態ベクトルを簡単に取り出すことができます。
しかし実機動作（サンプリング）を考えると、qasm simulatorを使いたいことも多いです。
この場合、サンプリングは出来ますが、状態ベクトルがわからないです。デバッグがめんどくさい。

使い分ければいいじゃないか、という話なのですが、 
- qasm simulatorは回路の最後にmeasureが必須
- statevctor simulatorは回路の最後にmeasureがあると射影測定後の状態ベクトルしか得られない

ということで、いまいちやりづらいです。
そこで、qasm simulatorで回路の途中の状態ベクトルを取り出す方法を記載します。
この方法はシミュレーター限定ですが、statevector simulatorに限らず、qasm simulatorでも使えます。

# snapshot

回路の任意の位置で　snapshot という操作を入れます。（ゲートのような感覚です）
`circuit.snapshot('my_sv',snapshot_type='statevector') # get a snapshot of present statevector`
snapshotはいくつでも入れられます。

ここで、回路の最後に measure　を入れても構いません。
（途中で入れると、当然そこで射影測定により状態ベクトルが変わりますので気をつけてください）

次に、回路を実行します。
`results = execute(circuit, backend, shots=1).result()`

結果の変数resultsの中身に、以下の呪文でアクセスします。
`statevec = results.data()['snapshots']['statevector']['my_sv'][k] # 2^nqubits complex vector |ψ>`
ここで、kはsnapshotを複数とった場合に何番目を取り出すかを意味します。

出力結果は複素ベクトル（状態ベクトル）になっていますので、期待値計算は簡単です。
`expectation = np.real(np.vdot(statevec,np.dot(obs_mat,statevec))) # Real[<ψ|O|ψ>]`
obs_matはオブザーバブルの行列表現です。

当然、measureを入れておいてqasm simuator で実行すれば、サンプリングと状態ベクトルが同時に取れます。

出力イメージ。ヒストグラムと、状態ベクトルのオブザーバブル期待値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/18362e00-8ea8-ebef-df49-ab4b80ed71bb.png)


なお、逆にstate vector simulatorでサンプリングをすることは簡単です。
Statevecotr のクラスに　sample_counts　というメソッドがあるようです。