OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】ransackで検索機能を実装

`ransack`というgemを使って、検索、ソートの機能を実装したのでまとめます。
手軽にできて良い感じでした。

##基本的な使い方
```rb:Gemfile
gem 'ransack'
```
```zsh:terminal
$ bundle install
```
```users_controller.rb
def index
  @q = User.ransack(params[:q])
  @users = @q.result(distinct: true)
end
```
```erb:index.html.erb
<!-- 検索フォーム -->
<%= search_form_for @q do |f| %>
  <%= f.label :name, "名前" %>
  <%= f.search_field :name_cont %>
  <%= f.label :email, "メールアドレス" %>
  <%= f.search_field :email_cont %>
  <%= f.submit "検索" %>
<% end %>

<!-- ユーザー一覧 -->
<table>
  <tr>
    <th>名前</th>
    <th>メールアドレス</th>
  </tr>
  <% users.each do |user| %>
  <tr>
    <td><%= user.name %></td>
    <td><%= user.email %></td>
  </tr>
  <% end %>
</table>
```

##ソート機能
```erb:index.html.erb
<!-- ユーザー一覧 -->
<table>
  <tr>
    <th><%= sort_link(@q, :name, "名前") %></th>
    <th><%= sort_link(@q, :email, "メールアドレス") %></th>
  </tr>
.
.
```

##検索条件を組み合わせる
ステータスがアクティブなユーザーの中から検索して、ページネーションをつける

```users_controller.rb
def index
  @q = User.ransack(params[:q])
  #後ろに自由に条件を追加できる
  @users = @q.result(distinct: true).where(status: 1).page(params[:page])
end
```

##様々な検索方法
検索フォームの中で`:name_cont`などと記載していた部分は、他にもいろんな指定ができます。

| 検索方法 | 意味(英語) | 意味 |
|:--|:--|:--|
| *_eq | equal | 等しい |
| *\_not_eq | not equal | 等しくない |
| *_lt | less than | より小さい |
| *_lteq | less than or equal | より小さい（等しいものも含む） |
| *_gt | grater than | より大きい |
| *_gteq | grater than or equal | より大きい（等しいものも含む） |
| *_cont | contains value | 部分一致（内容を含む） |

その他：[activerecord-hackery/ransack: Object-based searching.](https://github.com/activerecord-hackery/ransack#search-matchers)

##参考
- [Rubyon Rails で検索機能を作ろう（ransack）](https://qiita.com/nojinoji/items/e1b174220da8c81a1756)
GitLabのOperations機能にてローカルk8s連携ができない場合の対処法

# はじめに

GitLabにはOperationsというk8s連携機能がある。
ローカルネットワーク環境内にk8sを持っていたとして、そことGitLabを連携させようとすると、エラーがでてブロックされる。
その場合の対処法。

※この記事ではk8s連携で何ができるの？とか、どうやって連携させるの？みたいな話には言及しません。ごめんなさい。
※連携設定については、[公式ドキュメント](https://docs.gitlab.com/ee/user/project/clusters/add_remove_clusters.html#add-existing-cluster)に非常によくまとまっているので、こちらを参考にしてください。

# 環境

* GitLab-CE 12.8.1
* Kubernetes v1.16.2
* OpenShift v4.3.3

# 事象

Operations > Add existing clusterと進み、各パラメータを埋め、Add Kubernetes clusterを実行すると、
API URLにて、`is blocked: Requests to the local network are not allowed`と表示されてしまう。先に進めない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80163/e82ee9ad-f970-950e-6b5e-d68d5f58b2c3.png)


# 原因

エラーメッセージを読んで字の如し。

# 対処法

非常に簡単。Admin権限アカウント(root)でしか触れないAdmin Areaの設定変更にて回避可能。

1. Admin権限アカウントでログイン
1. トップバー左側に表示されている`Admin Area`ページへ移動(スパナマークのやつ)
1. Settings > Network へ移動
1. `Outbound requests`にて以下どちらかの対応をとる。
	* `Allow requests to the local network from web hooks and services`を有効化
	* `Whitelist to allow requests to the local network from hooks and services`内にローカルk8sのAPI URLを追記。
1. save changesで保存


# 参考

本当に助かりました。ありがとうございました。

* [https://gitlab.com/gitlab-org/gitlab/issues/12300](https://gitlab.com/gitlab-org/gitlab/issues/12300)
govcを使用してVM作成

govcの使用メモ

## 既存ハードディスクから仮想マシンを生成する手順
- datastore上にフォルダを作成する。

```bash
govc datastore.mkdir -ds=<datastore-name> <folder-name>
```

- 作成したフォルダにvmdkファイルをアップロードする。

```bash
govc datastore.upload -ds=<datastore-name> <source-file-path(vmdk-file)> <folder-name>/<vmdk-file-name>
[09-03-20 01:55:16] Uploading... OK
```

- アップロードしたvmdkを既存ハードディスクとして、仮想マシンを生成する。

```bash
govc vm.create -ds=<datastore-name> -pool=<resource-pool-name> -disk=<disk-path> -disk-datastore=<disk-datastore-name> -net=<network-name> -net.adapter=vmxnet3 -on=false -link=false <vm-name>
```

既存ハードディスクから仮想マシンを生成する際は`-link=false`のオプションが必要となる。これを知らずにだいぶはまった。。
MacOSでgcloudコマンドがlibssl.1.0.0.dylibがロードできなくて失敗する問題の対応方法

MacOS上のgcloudコマンドが、あるときから以下のエラーを出して動かなくなってしまった。

エラー

```

ERROR: gcloud failed to load: dlopen(/Users/xxx/.pyenv/versions/3.7.2/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
```

どうやらOpenSSLのバージョンが1.0から1.1にあがり、ライブラリの名前が変わってしまったようだ。

以下のコマンドでOpenSSLのバージョンを下げて対応した。

```
brew switch openssl 1.0.2s
```
開発現場1年生 |1年間でGitで失敗したこれだけのこと

ウェブに限らず、今の時代はどの開発現場でもバージョン管理や共同開発のためにGitが導入されています。
Gitは、触ったことない人にとっては非常に未知のもので、慣れるまでに少し時間がかかります。

以前

[Gitの知識ゼロで現場に放り込まれた時は最低これだけおさえておけ！](https://qiita.com/Yuna0610/items/193ce13f830bd8a3aa73)

という記事を上げさせていただきました。
確かにこの記事にある知識だけで、開発の仕事は最低限のレベルで完結しますが、実を言うとそれだけでは不十分です。

ここでは、次のステップ…よりも半歩前、前回の記事が第一段階ならば、1.5段階目に知っておくべきことを、私が1年間でやった失敗から学び取っていただけたらと思います。

#何も考えずに「git add .」をやってソースをデグレさせた
「git add .」を打ち込むと、ディレクトリ内のファイル全てをステージングエリアに上げることになります。
そうしますと、共同開発を行っているコンテンツでしたら、自分が最後にリモートリポジトリからプルした後に誰かがプッシュした場合、デグレしたものをプッシュすることになります。
自分一人で開発を進めるコンテンツならそれでもいいのですが複数人がいじっているコンテンツの場合、絶対にどこかでこのトラブルは発生させてしまいます（私の場合、最初は一人で進めていくシンプルなコンテンツだったため、この問題を起こしたのは配属半年以上たってからでした）。

・git addは基本的に編集したファイルを選択「git add something.js」のように。
・git diffというコマンドを使って、編集した覚えのない場所に差分がないかチェック

しておけば事故を防ぐことが出来ます。


#大量にデータファイルや画像をコミットした
「.gitignore」で管理対象外にするファイルを記録するのは基本ですが、最初は何を管理対象外にするのかという判断がつかなかったため、膨大なファイルをコミットし続けてしまっていました。
そのおかげでリポジトリがサーバの容量を圧迫するまでに至りました。
「何を対象外にすればいいのか聞けよ」と言われたらそれまでですが、Gitにかぎらず、右も左も分からなかった中色々先輩方に尋ねていたのでそこまで及ばなかったということです。


・画像やデータなどはコミットしなくてもいい
・他人の「.gitignore」を見れば大体乗せているものは共通しているはず




また、思い出したら編集します。
Perforce Helix Coreで作業後にタスクストリームを作ってサブミットしたい

#タスクストリームとは
[公式マニュアル](https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4guide/Content/P4Guide/streams.types.task.html)

Perforceのストリームで最小限の関連するファイルのメタデータだけ保存するため軽量らしい。

Gitのブランチを作る感覚で作業後にタスクストリームを作ろうとしたらできなかった上に結構時間がかかってしまった。

#結論
~~先にタスクストリームを作っておいてから作業しましょう。~~

変更をShelveしておき、タスクストリームを作ってから
Branch Mappingを作成してからUnshelveすればよい。

https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r14.3/manuals/p4v/branches.mapping.html

jam_projストリームで作業した後にタスクストリームjam_r2.0にサブミットしたい場合は
一度Shelveしたあとに、Branch Mappingを作成してViewの欄に以下のように書く。

``//depot/jam_proj/... //depot/jam_r2.0/...``

その後jam_r2.0ストリームに移動しBranch Mappingを利用してUnshelveする。

#背景
Perforceのタスクストリームの機能を知らず、とりあえずメインストリームでプロトタイプの機能開発をしていた。
作業がひと段落したところでサブミットしたかったが、実験用コードなのでメインストリームにはサブミットしたくなかった。そしてこのタイミングでタスクストリームという機能を知った。

#英語圏にも同様のことで詰まってた人がいた
スレッドの#5
https://forums.perforce.com/index.php?/topic/3043-unshelving-to-another-stream/

#やってダメだったこと
* 親ストリームで作ったPending listから子のタスクストリームにサブミットしようとした
* 親ストリームでShelveしてからストリームを切り替え、Unshelveする

どちらもに ```file(s) not mapped in stream``` というエラーでサブミット/Unshelveできず

#なぜできなかったか(仮説)
親ストリームで作ったShelveを子ストリームで取得、はできそう
[参考リンク](https://www.perforce.com/blog/vcs/unshelving-another-stream)

マニュアルを読む限りはタスクストリームはストリームを作った後に作業したファイルのみ変更を記録(mapping)していると思われるので
親ストリームでのファイル変更を適用しようとすると存在しないと言われている?

Perforceに詳しい人がいたら実際のところどうなのか聞きたいです。

#結局どうしたか
* 変更したファイルを別の場所にコピーし、チェンジリストをすべてRevertしてからストリームを切り替えた。
* その後変更したファイルをチェックアウトして上書きしてサブミットした
DataRobot API 使いメモ

# DataRobot API 使いメモ
googleしても情報がないので、自力で試す。
## 前提条件
- pipバージョン20以上
- Windows環境

## APIインストール

```
$ pip install -U datarobot_batch_scoring
```
## 実行コマンド
```
$ batch_scoring_deployment_aware --host=<host> --user=<user> <deployment_id> <dataset_filepath> --datarobot_key=<datarobot_key> {--password=<pwd> | --api_token=<api_token>}
```
**パラメータ**
1. host
2. user
3. deployment_id
4. datarobot_key
5. api_token

dataset_filepath : 対象ファイルパス
out : 予測結果出力先

**サンプル**

```
$ batch_scoring_deployment_aware --host=https://hoge.datarobot.com --user="hoge@hoge.co.jp" xx123456hoge C:\Users\hoge\hoge.csv --datarobot_key="hogehogehoge1234" --api_token="hogehoge1234"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384642/dc14ad7c-7d7c-0797-a8de-7db357b4dc66.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384642/d1c07949-499e-d4c5-4228-29ccfbfb73a5.png)

## Linux環境
- batch_scoring.ini作成
- $HOME/に配置
- batchscoringコマンド実行

```
$ batchscoring
```
## 参考サイト
[datarobot/batch-scoring](https://github.com/datarobot/batch-scoring)
[Android]初回にEditTextにフォーカスを当てる


## 目的
アプリを開いたときや、特定のページに遷移した時に画面内のEditTextにフォーカスを当ててキーボードを表示させておく方法

## 内容
ここでXMLファイルのEditTextのタグを拡張して`requestFocus`タグを内部に追加します

```activity_second.xml
<EditText
     android:id="@+id/editText"
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:hint="ここに入力してね"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent" >
   <requestFocus/>
</EditText>
```

こうすることで読み込み時にフォーカスをEditTextに当てることができます
ローカル環境にSentryを立ち上げる

## 概要
[Sentry On-Premise](https://github.com/getsentry/onpremise) がdocker-composeを導入してくれたおかげで、セットアップがだいぶラクになっていた。
楽すぎて書くまでもないくらいなのだけれども、立ち上げるまでをメモしておく。

## 手順

### 0. 前提
- Dockerのメモリが **2400MB** 以上必要
- Dockerの初期設定だとこれに引っかかってうまく起動できない場合があるので、割り当てメモリをチェックしておく
- Docker Desktopの場合、 **[Settings] -> [Advanced] -> [Memory]** の順で確認可能
- 少し多めに割り当てておくのがオススメ。2000MB前後になっている場合、3000MBにするとか

### 1. [Sentry On-Premise](https://github.com/getsentry/onpremise) をダウンロードする
- Git管理するほどのものじゃないのでzipダウンロードで良いと思います。

### 2. configファイルを更新する
- 追加設定が必要な場合のみ。 **この手順は省略しても起動させられる。**
- [onpremise/sentry](https://github.com/getsentry/onpremise/tree/master/sentry) の中にある下記ファイルをコピーして `examle` を削除することで、設定を上書きできる
  - `config.example.yml`
      - GitHub連携、通知メールサーバー変更、ファイルストレージ変更など
  - `requirements.example.yml`
      - 追加プラグインライブラリを導入する場合はここ
  - `sentry.conf.example.yml`
      - DB・Redis・Cache設定など


### 3. `install.sh` を起動する
- すべての面倒くさい手順をこの `install.sh` がやってくれるようになりました
    - ただ時間はかかる…
- このスクリプトのログは `/onpremise-master` 直下に吐き出される
  - スクリプトが終了し、かつ、ログの末尾に↓が表示された場合、正常に準備が完了している

```
----------------
You're all done! Run the following command to get Sentry running:

  docker-compose up -d
```

#### トラブルシューティング
- Dockerの割り当てメモリが足りない場合は↓のログとともにFAILするので、0の手順を再確認すること

```
Checking minimum requirements...
FAIL: Expected minimum RAM available to Docker to be 2400 MB but found 1980 MB
```

### 4. `docker-compose up -d` 実行
- ルートディレクトリで `up` を実行する
- ブラウザから見られるようになるまでに少し時間が必要になる。3分くらい待つと :ok_woman: 

### 5. ブラウザで `localhost:9000` にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189424/7be1d885-2b00-082c-52d8-f18c4cbd6438.png)

- 正常に見られれば :tada:
- この後のプロジェクト設定などは他記事をご参照ください
検定とは？

初めて検定を学ぶので、諸学者向けに記事にしようと思う

#検定とは
**統計的仮説検定**は確率をもとに結論を導く方法！
**検定**は「**①最初に仮説を立て**、**②実際に起こった結果を確率的**に検証し、**③結論を導く**」という手順で行う。結論を導くには**「背理法」**を用いる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/4878eacd-e078-193c-cb05-78b6993b8111.png)


#3つのステップ
##1.仮説を立てる
検定を行うにあたっては、まず**「仮説」**を立てる。ここでは**「渡された2枚のコインは普通のコインである」**とします。この仮説に矛盾が生じた場合、普通のコインではないと結論付けられる。


**帰無仮説**…統計的仮説検定の際にとりあえず立てる仮説のことで、対立仮説の方が重要であることが多い。**記号「H₀」**として表されることが多い。
ex)**H₀:「渡されたのは普通のコインである」**

**対立仮説**…統計的仮説検定において、帰無仮説が棄却されたときに採択される仮説のこと。帰無仮説に対応して**記号「H₁」**と表されることが多い。
ex)**H₁:「渡されたのは不正なコインである」**

##2.仮説を検定するための「確率」を求める
渡されたコインが**普通のコイン**であった場合、**「2枚とも裏」が2回起こる確率**は次のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/3b6ede68-d065-a78a-a579-ed9747aa4695.png)

**P値**…帰無仮説が正しいとした仮定とき、観測した事象よりも極端なことが起こる確率のこと。
ex)コインの問題では、**P値=6.25%**

##3.判断基準を元に結論を導く
結論を確定させるために**「“滅多に起こらない”と判断する確率の基準」**を設定する。例えば**この基準を「10%」と設定**すると、10%以下の確率で起こる事象については「滅多にないこと」であるため、「仮説が間違っている」と判断される。逆に、10%以上の確率で起こる事象については、「滅多にないことではない＝許容できる範囲」となるため、「仮説が間違っているとは言えない」と判断される。

この問題では、**仮説を「渡されたコインは普通のコインである」**とし、**観測した事象が起こる確率は6.25%**だった。6.25%は判断基準10%より小さいため**「渡されたコインは普通のコインであるとは考えられない」という結論**を導くことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/869fc8e0-dcad-b9f3-ddcf-605185c93a85.png)

***有意水準***…帰無仮説を棄却するための基準となる確率。この数値は検定を行う前に決めておく必要がある。危険率と呼ばれることもある。
**α（アルファ）**で表され、**5%（0.05）や1%（0.01）**といった値がよく使われる。
言い換えると、「極めて珍しいことが起こった」あるいは「何かしら意味があることである**（＝”有意である”）」**ということを表す。
ex)コインの問題では、**「“滅多にない”と判断する確率の基準」**が**この有意水準**。

しかし、P値が5%以下となったとしても本当に偶然まれな事象が起こった場合もあるので、有意水準αは「本当は帰無仮説H₀が正しいのに、誤ってを棄却してしまう確率」とも言える。この**「本当は帰無仮説H₀が正しいのに、誤ってを棄却してしまうこと」**を**「第1種の過誤」**といい、は「第1種の過誤を犯す確率」とも呼ばれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/04761dcd-17c6-092b-a97e-906c8bc2eb73.png)

**検出力**…有意水準αと対するもの！検出力は1-βで表されるもので、**「帰無仮説H₀が正しくないときに、正しくを棄却する確率」**のこと。このβは**「第2種の過誤の確率」**を表しす。第2種の過誤の確率とは**「対立仮説H₁が正しいときに、誤って帰無仮説H₀を棄却しない確率」**のこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/833c4032-2611-1547-2088-109c07056503.png)


**棄却**…仮説を捨てること。P値が有意水準よりも小さい時は、帰無仮説を捨て対立仮説を採択します。すなわち、対立仮説が正しいと結論付けられます。コインの問題では、基準である「10％」と観測した事象の起こる確率「6.25％」を比べた結果、「6.25％」が「10%」より小さいことが分かりました。このとき、帰無仮説「渡されたコインは普通のものである」を「棄却」し、対立仮説「渡されたのは不正なコインである」を採択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/3d5b3c4b-f37b-bbf6-b43b-898010724002.png)

#注意
##結論
導かれた結論は**「絶対に正しい」と考えることはできない！**
なぜなら、「滅多にないことである」と結論付けられたとしても、6.25%という確率は「仮説が正しくても、16回に1回は起こってもおかしくない」出来事であるとも考えられるからだ。

##判断基準
**「滅多にない」とする基準**は**先に**決めておかなくてはならない!
なぜなら、6.25%という確率を知った後で「滅多にない」基準を設定すると、例えば次のような**恣意的な誘導**ができるからだ。すなわち、後出しじゃんけんのように**自由に結論を変えること**ができるからだ。

##P値　＞　有意水準
P値が有意水準よりも大きい時は、**帰無仮説は棄却されない。**これは**帰無仮説が正しいと結論づけて良いということを意味しない。**検定で用いられる方法は**「背理法」**なので、「帰無仮説が棄却されない」ことは「帰無仮説が正しいと結論づけて良い」ということにはならない。この場合、「対立仮説が正しいと結論づけることはできない」ということしか言えない。
コロナウイルスの感染者数をmatplotlibで可視化してみる

**Warning! この記事は特に「データをグラフにしてみた」以上の情報を含みません。**

# データの出所
John Hopkins大学のCenter for Systems Science and Engineeringがまとめてくれている、各国の感染者数などの人数をcsvにしてまとめたもの。
https://github.com/CSSEGISandData/COVID-19

# matplotlibで可視化する
```python
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#pandasでCSVデータ読む。
data = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv')
confirmed = [0] * (len(data.columns) - 4)
days_from_22_Jan_20 = np.arange(0, len(data.columns) - 4, 1)

#データを加工する
for i in range(0, len(data), 1):
	if (data.iloc[i][1] == "Japan"):
		print(str(data.iloc[i][0]) + " of " + data.iloc[i][1])
		for day in range(4, len(data.columns), 1):
			confirmed[day - 4] += data.iloc[i][day]
print(days_from_22_Jan_20)
print(confirmed)

#matplotlibに流し込む
fig = plt.figure(1, figsize=(1.6180 * 4, 4))
axes = fig.add_subplot(111)
axes.set_xlabel("days from 22, Jan, 2020")
axes.set_ylabel("Comfirmed (JP)")
plt.grid()
axes.plot(days_from_22_Jan_20, confirmed, "o-", color="orange")
plt.show()
```

# 出てくるもの
こんなの(2020年3月10日現在)。
<img width="638" alt="絵" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44457/390cbeca-6868-f7cc-a18c-e2dd616318b4.png">

# で？
横軸25-40程度は線形で伸びている様な気がするんだが、41-あたりからちょっと違う線に乗ったように見える。
これが傾きが大きくなった直線なのか、ロジスティックなのかはちょっとまだわかんない。
そもそも何故上がったのやら。
((こいつ「データをグラフにしてみた」以上の情報を含まないとか書いておきながらやっぱりデータ見て考えはじめましたよやっぱり好きなんすねぇ！))

# 来るかもしれないコメント
- 他の国のデータみたい　→　11行目のJapanをUSとかMainland Chinaとかにして、どうぞ。
- グラフの見た目がダサいんだが？　→　自分で奇麗にして、どうぞ。
- 横軸日時にして　→　日本銀行券で3000円くらいくれればやります！
検索時刻帯を変更する

Splunkのindexの中の時間はepochtime。
ユーザの時刻帯に応じて表示や検索期間が決まる。

Splunkを世界的に使っているところだとユーザの時刻帯はバラバラということもある（らしい）
個人的には専用のAppとユーザ、ダッシュボードを作って時刻帯を統一すればいいと思うのだけど、そうもいかない人向けのクエリー

[UTCが欲しい](https://qiita.com/toshikawa/items/f649abe37aa717e08663)とネタが被っているといえば被っている。

#SPL
```java:tz_change.spl
| makeresults 
| addinfo 
| eval local_tz=strftime(_time,"%:::z") 
| eval tz_EST="-5"
| eval time_arg=if(tz_EST - local_tz < 0 , "@d".(tz_EST - local_tz)."h","@d+".printf("%2d",tz_EST - local_tz)."h")
| eval local_earliest=round(relative_time(info_min_time,"@d"))
| eval earliest=round(relative_time(info_min_time,time_arg))
| fields - _* info*
| foreach *earliest [ eval human_readable_<<FIELD>> = strftime('<<FIELD>>' , "%FT%T")]
```
過去24時間の検索を東部標準時間(EST)の00:00からに合わせている。

| earliest | human_readable_earliest | human_readable_local_earliest | local_earliest | local_tz | time_arg | tz_EST |
|--:|:--|:--|--:|--:|:--|--:|
| 1583629200 | 2020-03-08T10:00:00 | 2020-03-09T00:00:00 | 1583679600 | +09 | @d-14h | -5 |

#使用方法
```java:usage.spl
index=main sourcetype=foo search_word [ makeresults
....
| fields earliest
| format "" "" "" "" "" ""]
```

#解説
- `addinfo`で_time picker_の`earliest`と`latest`の値を取り出している。
- `%:::z`で時刻帯を２桁の数字で取り出す。
cf. [Date and time format variables] (https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Commontimeformatvariables)
- `relative_time`の引数を`eval`で作成
- `printf()`を使用しているのは`+００（UTC)`の時にうまく動かすため。
- _EST_(東部標準時 (Eastern Time Zone))なのは元ネタがこれなので。
- `format`で_earliest_をそのままの形でメインサーチに渡している。

#まとめ
`addinfo`の時間もユーザの時刻帯に引っ張られるので、一方のログがUTCで他のログがJSTとかだとログに書いてある時間と検索期間、*_time*の値が違うので戸惑う時がある。
ユーザの時刻帯に関わらずいっそUTCで検索してやるってのをクエリーでやる場合はこんな形でやるといいと思います　:sweat:その場面てあるのかな
Githubからのgit cloneでパスワードが聞かれず失敗する(Windows 10)

#問題点
Github上の自分のプライベートリポジトリから```git clone```する際に、

```
$ git clone https://github.com/user_name/repos_name.git
Cloning into 'repos_name'...
remote: Repository not found.
fatal: repository 'https://github.com/user_name/repos_name.git/' not found
```
あるいは

```
$ git clone https://user_name@github.com/user_name/repos_name.git
Cloning into 'repos_name'...
remote: Repository not found.
fatal: repository 'https://github.com/user_name/repos_name.git/' not found
```
のようにパスワード入力を求められずに失敗する。

#環境
OS:Windows 10
Git Bash: ver 2.25.1

#解決策 1

```
git clone https://user_name:password@github.com/user_name/repos_name.git
```
の様な形でGithubのユーザー名とパスワードをURLに含める。
しかし、これだとパスワードが********のように伏字にならず、丸見えになってしまう。

#解決策 2
先ほどの:passwordを消して

```
git clone https://user_name@github.com/user_name/repos_name.git
```
とすることで、パスワード入力を求められる、、、らしいが、私の環境ではこれも同様の出力で失敗した。
#解決策 3
試しにpasswordを未入力にして

```
git clone https://user_name:@github.com/user_name/repos_name.git
```
とした。すると、

```
$ git clone https://user_name:@github.com/user_name/repos_name.git
Cloning into 'repos_name'...
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/user_name/repos_name.git/'
```
と出て認証失敗。
しかし、続けて

```
git clone https://user_name@github.com/user_name/repos_name.git
```
を叩くと、今度は無事パスワードを要求された。
その後のcloneはuser_nameもpasswordも要らず、

```
git clone https://github.com/user_name/repos_name.git
```
でダウンロードが始まった。
gitわからん_(:3」[＿]

#追記
コメントより、Windows資格情報マネージャー
`コントロール パネル>ユーザーアカウント>資格情報マネージャー`
から資格情報 git:https\://github.com の編集、削除によってこの問題に対応できることを教えていただきました。

また、

```
$ git clone https://user_name:@github.com/user_name/repos_name.git
```
によって資格情報の削除が起こっていたことを確認済みです。
　削除後にGithubアカウントにログインすると新たに資格情報が登録されます。ユーザー名やパスワードの変更を行わない限り、今後はその情報を使って自動的に認証が行われるため、`git clone` 時のユーザー名やパスワードの入力は不要になります。
突然「シングルサインオン（ＳＳＯ）を検討して」と言われたら－第３回

# はじめに

### 前回までのあらすじ

本記事シリーズでは、SE様のようにシングルサインオン(SSO)を導入なさる側の皆様を意識し、
SSOのベース知識を得るための情報源となるべく執筆していきたいと思います。
もし記事をお読みくださったら、ベンダ候補として弊社も加えていただけますと嬉しいです。

* [第１回](/hoshino_osstech/items/9a59bfd7b5722a8c3d33)
    * 本シングルサインオン解説シリーズの位置づけ
    * なぜシングルサインオン化すべきか
* [第２回](/hoshino_osstech/items/cc735c065dfaf39fcffd)
    * シングルサインオン化のための大まかな要件定義

### 今回のお題

今回は、シングルサインオンの仕組みの代表的な例、について書いていきたいと思います。


# シングルサインオンの仕組みの代表的な例

### なぜ理解しておくべきか

本記事シリーズの[第１回](/hoshino_osstech/items/9a59bfd7b5722a8c3d33)から、「シングルサインオン化のためには、SSOサーバを導入し、
各アプリがSSOサーバと認証連携することで実現する」という形の図を出していました。
以下は、[第１回](/hoshino_osstech/items/9a59bfd7b5722a8c3d33)の図の再掲です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316192/12a35666-d663-8965-3471-c8efae4cdde6.png" width=70%>

ただ、一言で「認証連携」と書いてきましたが、どのような仕組みで実現されているのでしょうか。
この全体的な仕組みを知らないままですと、SSOサーバのベンダとの会話の効率や、
個別技術要素の理解の効率が悪くなってしまったりするかもしれません。

そこで今回は、シングルサインオン実現のための仕組みについて、代表的な例を記していきたいと思います。
（実際はいくつかの仕組みがありますが、１つ代表的な例を知っておくことで、他の仕組みも理解しやすくなると思います。）


### シングルサインオンの仕組みの代表的な例

シングルサインオンの仕組みの代表的な例について、以下の簡易シーケンス図にて記していきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316192/9104accc-6a93-e005-8c27-a3ec5bddd813.png" width=90%>

 [1] ユーザがWebアプリＡを使うため、ブラウザを用いてアプリＡのURLでアクセスします。

 [2] アプリＡは、ブラウザから送付されてきたCookieなどからアプリＡとしての認証状態をチェックし、まだ認証済みでなければSSOサーバへリダイレクトします。
（リダイレクトではなく、同等の「自動POSTするコンテンツ」を返すこともあります。）

 [3] SSOサーバは、ブラウザから送付されてきたからCookieなどからSSOサーバとしての認証状態をチェックし、まだ認証済みでなければ認証画面を返します。
（ここではID/PWの入力画面の例を出しましたが、ここはワンタイムパスワードなどの多要素認証、FIDO2/WebAuthnによるパスワードレス認証など、様々な方法があります。）

 [4] ユーザが認証情報（ID/PWなど）を入力し、その認証情報がSSOサーバにPOSTされます。

 [5] SSOサーバは該当ユーザの認証処理を終え、認証済みであるという情報を載せた上でアプリＡへリダイレクトします。
（実際は、リダイレクトではなく、同等の「自動POSTするコンテンツ」を返すことが多いです。）

 [6] アプリＡは「SSOサーバがそのユーザで認証済みというならウチとしてもＯＫ」ということで該当ユーザ認証処理を終え、アプリＡの画面を返します。


<b>※※※ 大まかな流れとしてはこのようにシンプルです。これだけ見ると「凄く簡単だから全部1から自前で開発してしまおう！」と考えてしまうかもしれませんが、実際のところは不正を防ぐための様々な対応や細かな動作パターンへの対応といったことが必要であり、セキュリティ面やコスト面で相当大変です。このため、自前で1から開発することはお勧めしません。各種製品やライブラリを利用しましょう。 ※※※</b>


### ざっくり要点を纏めると

上記「シングルサインオンの仕組みの代表的な例」の内容のうち、さらにざっくり要点を纏めるとこんな感じです。

 * アプリは、SSOサーバに認証処理を委託する。
 * SSOサーバは、既に認証済みであったなら認証処理をすっとばす。（＝シングルサインオン）
 * SSOサーバは、認証済み情報を添えてアプリに戻す。
 * ユーザからすれば、最初のアプリ利用時に認証入力するだけで、あとは自動で動いてくれる。



# おわりに

今回は、以下のことを記しました。
・シングルサインオンの仕組みの代表的な例

この代表的な例は、認証連携に関する標準仕様の１つである「SAML 2.0」において、
最もよく使われている基本的なフローです。
この基本的な形をまず理解しておくことで、他の形も理解しやすくなると思います。

次回以降は、認証方法や認証連携方法に関して、種類や選択方針など記していこうかなと思います。
（変更の可能性もあります。）
GitLab CI/CD Schedulesでn分毎実行ができない件の対処法

# はじめに

GitLab使っていますか？私は大好きです。
GitLab CI/CD使っていますか？私は大好きです。

GitLab CI/CD SchedulesはcronライクにPipelineを定期実行できる便利な機能。
ただし、デフォ設定では`毎時15分毎に実行`というように設定しても効かない。毎時実行になってしまう。
つまり、15分毎実行にさせたくて`*/15 * * * *`と設定しても反映されない。
この問題への対処法。

# 環境

* GitLab-CE 12.8.1
* RHEL 7.5

※yum経由でインストール

# 原因

実は公式ドキュメントに完璧に書かれている。ちゃんと読もう(自分自身への戒め)。

* [Pipeline schedules](https://docs.gitlab.com/ce/ci/pipelines/schedules.html#advanced-configuration)

> The pipelines won’t be executed exactly on schedule because schedules are handled by Sidekiq, which runs according to its interval.
> For example, only two pipelines will be created per day if:
> ・You set a schedule to create a pipeline every minute (* * * * *).
> ・The Sidekiq worker runs on 00:00 and 12:00 every day (0 */12 * * *).
> 
> To change the Sidekiq worker’s frequency:
> 
> 1. Edit the gitlab_rails['pipeline_schedule_worker_cron'] value in your instance’s gitlab.rb file.
> 2. Reconfigure GitLab for the changes to take effect.

# 対処方法

[Pipeline schedules](https://docs.gitlab.com/ce/ci/pipelines/schedules.html#advanced-configuration)の通り、コンフィグをイジって適用させるだけ。

> 1. Edit the gitlab_rails['pipeline_schedule_worker_cron'] value in your instance’s gitlab.rb file.
> 2. Reconfigure GitLab for the changes to take effect.


## コンフィグ変更

yumでインストールしたgitlab-ceの場合は、`/etc/gitlab/gitlab.rb`が対象のコンフィグファイル。
他のインストール方法では違うパスになっているかもしれないので適宜読み替えて欲しい。


```/etc/gitlab/gitlab.rb
  94 # gitlab_rails['pipeline_schedule_worker_cron'] = "41 * * * *"
```

↑のコメントを削除し有効化させ、毎分実行状態に書き換える。

```/etc/gitlab/gitlab.rb
  94 gitlab_rails['pipeline_schedule_worker_cron'] = "* * * * *"
```

## 適用

```console
$ gitlab-ctl reconfigure
```

これだけで問題なく適用できるが、心配ならGitLab丸ごと再起動させても良い。

```console
$ gitlab-ctl restart
```

# 確認

新規にScheduleを作るか、既存Scheduleを編集 -> 保存すれば正しい間隔での実行に書き換わる。
C言語　「NULL」、「'\0'」、「0」の比較

実行環境によって値が変わることはあると思うのであくまで参考まで
NULLは「(void*)0」なので、値を出力すること自体、良くないことですが、やってみています。

```c
#include<stdio.h>

int main (void) {
    printf("数字\n");
    printf("%d\n", NULL);
    printf("%d\n", '\0');
    printf("%d\n", 0);

    printf("アドレス\n");
    printf("%p\n", NULL);
    printf("%p\n", '\0');
    printf("%p\n", 0);

    printf("メモリ\n");
    printf("%lu\n", sizeof(NULL));
    printf("%lu\n", sizeof('\0'));
    printf("%lu\n", sizeof(0));

    return 0;
}
```

```terminal
数字
0
0
0
アドレス
0x0
0x0
0x0
メモリ
8
4
4
```
【GCP】gsutil コマンドで GCS を操作するときによく使うやつ

お金に注意して使っていきたい。

## バケットの一覧を見る

```sh
gsutil ls -p プロジェクトID
```

## 特定のバケットの合計サイズを確認する

```
gsutil du -s gs://バケット名
```

## 全てのバケットの各々の合計サイズを確認する

```sh
gsutil du -s $(gsutil ls -p プロジェクトID)
```

## 出力バイト数をヒューマンリーダブルにする

`-h` を追加

```sh
gsutil du -hs $(gsutil ls -p プロジェクトID)
```

## 全てのバケットの合計サイズも出力する

`-c` を追加

```sh
gsutil du -chs $(gsutil ls -p プロジェクトID)
```

## 特定のバケットの特定のフォルダ以下の合計サイズを出力する

ワイルドカードを使う

```sh
gsutil du -hs gs://バケット名/フォルダ名/*
```

## 特定のバケットの特定のフォルダ配下を全て削除する

`-m` を付ける (multi-threaded/multi-processing)

```sh
gsutil -m rm -r gs://バケット名/フォルダ名
```
[SQLServer]複数カラムの重複レコード抽出

## 重複レコードのみ抽出

|  No | 性別 | 地区 |
| ---- | ---- | ---- |
| 1 | man | Tokyo |
| 2 | man | Osaka |
| 3 | man | Tokyo |
| 4 | woman | Tokyo |
| 5 | woman | Osaka |

というテーブルがあったとして
性別と地区が重複しているレコード(No1,3)のみ抜き出したい場合のSQLは

```sql:GroupByquery
select 性別 ,地区 from testTBL
group by 性別 ,地区
having count(性別) >1 and count(地区)>1
```
| 性別 | 地区 |
| ---- | ---- |
| man | Tokyo |
| man | Tokyo |
となる

## 重複レコードの全カラム表示
Noも知りたいのでサブクエリにして実行する

```sql:Complete(MySQL)
select * from testTBL
where (性別 ,地区) in (
    select 性別 ,地区 from testTBL
    group by 性別 ,地区
    having count(性別) >1 and count(地区)>1 
)
メッセージ 4145、レベル 15、状態 1、行 28
条件が必要なコンテキストに対し、',' 付近でブール型以外の式が指定されました。
```

MySQLではできるのに...
しょうがないのでEXISTSを使用する

```sql:Miss
select * from testTBL
where EXISTS (
    select 性別 ,地区 from testTBL
    group by 性別 ,地区
    having count(性別) >1 and count(地区)>1
 )
```
|  No | 性別 | 地区 |
| ---- | ---- | ---- |
| 1 | man | Tokyo |
| 2 | man | Osaka |
| 3 | man | Tokyo |
| 4 | woman | Tokyo |
| 5 | woman | Osaka |
**は？**
調べたらテーブル同士の紐づきがないため、
該当レコードを持つtestTBLの全レコードが表示されてしまっていた

```sql:Complete
select * from testTBL AS a
where EXISTS (
    select 性別 ,地区 from testTBL AS b
    a.性別 = b.性別
    a.地区 = b.地区
    group by 性別 ,地区
    having count(性別) >1 and count(地区)>1
 )
```
| No | 性別 | 地区 |
| ---- | ---- | ---- |
| 1 | man | Tokyo |
| 3 | man | Tokyo |

## 意地でもEXISTSもJOINもしたくない人向け

```sql:Complete(Gorioshi)
select * from testTBL 
where 性別 in (
    select 性別 from testTBL 
    group by 性別 ,地区
    having count(性別) >1 and count(地区)>1
)
and 地区 in (
    select 地区 from testTBL 
    group by 性別 ,地区
    having count(性別) >1 and count(地区)>1
)
```
文字列同士なら結合して一つのカラムとして扱うほうが楽かも

## 参考
・[MySQL 複数のコラムをGROUP BYして条件にしたレコードを取得したい](https://chaika.hatenablog.com/entry/2019/02/20/083000)
・[TECHSCORE：SQL 7章　サブクエリ](https://www.techscore.com/tech/sql/SQL7/07_02.html/)
初心者が説明するHTTPステータスの調べ方

## HTTPステータス(HTTPステータスコード)って？
HTTPにおいて、Webサーバからのレスポンスの意味を表現する3桁の数字からなるコードです。([ウィキペディア](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)から引用)
ちゃんと3桁の数字に意味があるので、大まかに理解しておくといいと思います!
コード書いたのに、Webブラウザ上に表示されないなって思ったときはHTTPステータスやChromeの、デベロッパーツールのコンソール確認するといいと思います。(私的に:smile:)

## どうやって調べるの？？
1. Chromeのデベロッパーツール(検証)を開きます(macの場合 ```⌘+opt+i```)(windowsの場合)
2. デベロッパーの項目に```Network```という項目があります。そこに切り替えます。
3. Webブラウザをリロードします。
4. リロードすると、赤い欄が出てきます。それが主にエラーの原因となり得るものです。(そうではない場合もあります。)![サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416392/4f708677-738d-c88f-2baa-ed97606ea3bf.png)
5. 赤い欄になっているところをクリックして、ステータスを確認しましょう！![404エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416392/ce12b9a7-1504-d38e-e1f9-759144ff7f55.png)
6. ステータスコードの内容を調べます！
7. エラー直せば、完璧:sparkles:

## ステータスコードの種類(大まかに)

| ステータスコード  |意味  |
|--- |---|
|100番台   |リクエストに対し、処理が継続されている  |
|200番台  |リクエストが正しく受理された |
|300番台  |リクエストを達成するために、追加の処理が必要と返信している状態。 |
|400番台  |リクエストが正しく処理できない状態。 |
|500番台  |サーバーに問題があり、エラーとなる。 |

404エラーとか、WordPress使ってる人だと、504エラーとか、見たことある人多いかなって思います。よく出てくるエラーの意味は知っておくと少し便利かもしれません！！

## さいごに
初心者が説明したので、ちょっとわかり辛い部分あるかもしれません。間違えてる部分などありましたら、コメントにて教えてくれるととても有り難いです。
Tecpitの教材「【Go】技術ブログサイトを自作してみよう！」を試してみました / TechCommit企画

[テックコミット](https://www.tech-commit.jp/)さんのお年玉企画で[Tecpit](https://www.techpit.jp/)さんの「【Go】技術ブログサイトを自作してみよう！」を試してみましたので、情報をまとめて見ました！

### 自分の知識
GoはTour of Goを一度なぞった程度

### 完成物

https://damp-journey-45035.herokuapp.com/

### 教材の概要

マークダウンに対応した、記事投稿システムです

### この教材で学べる知識
- echoでサーバーたてる
- Modulesでモジュール管理
- pongo2
- sqlx
- goose(マイグレーションツール)
- freshでホットリロード
- basic認証のかけ方
- 多対多のリレーション
- herokuデプロイ

### ※Goの文法自体の説明はありません！
教材の注意書きにもありますが、Goの文法自体の説明はありません！
そこらは抑えている前提で話が進みます

### 感想
Goの文法はわかったけど、実際どうやって組み立てていくの？って人にはかなりいい感じの教材だと思いました。
またコードの随所に何をやっているのかという説明が記載されているのもとても分かりやすかったです。
難点をあげるとすれば、HTML、CSS、JavaScriptのパートが多かった気がします。。。プロダクトの性質上仕方ないのですが。
とはいえ、Go楽しかった！

教材をありがとうございます
TechCommitさん
Tecpitさん
Docker Hub pushメモ

- [Docker Hub](https://hub.docker.com/)
  - [Docker Hub Quickstart | Docker Documentation](https://docs.docker.com/docker-hub/)

`docker pull`ないし`docker build`（`docker-compose build`）で引っ張ってくる/構築するビルド済みコンテナ（コンテナイメージ）のホスティングハブ。ビルド時間をダウンロード時間に変えられる（階層別キャッシュあり）。プロジェクトがコンパクト＆ポータブルになる。

- アカウントを作成（初回のみ）
  - https://hub.docker.com/signup
- 新規リポジトリを作成（USERNAME/IMAGE_NAME）
  - https://hub.docker.com/repositories
- タグ名を指定してビルド（`-t`, `--tag`）
  - `docker build --tag USERNAME/IMAGE_NAME .` 
- Docker Hubにログイン（初回のみ）
  - `docker login`
- Docker Hubにアップロード（push）
  - `docker push USERNAME/IMAGE_NAME`
- 確認
  - `docker pull USERNAME/IMAGE_NAME`
  - `Dockerfile`で`FROM USERNAME/IMAGE_NAME`
  - `docker-compose.yml`で`image: USERNAME/IMAGE_NAME`

相当な容量食うだろうに無料しゅごい...（無料の場合プライベートは1リポジトリのみ、[料金体系](https://hub.docker.com/billing/plan)）。

### 参考
- [Dockerhubへの初プッシュ - Qiita](https://qiita.com/moru3/items/32931813db81d891effb)
- [docker login での Sign in について - Qiita](https://qiita.com/tearoom6/items/b14913161250b2b30d0f)
WSL（openSUSE）にNode.jsをインストールする

# はじめに
せっかくの春休み中なので勉強を兼ねて新しいことに挑戦したいと思い、Electornを触ってみることにしました。
今回は前準備として、WSLにNode.jsとnpmをインストールしました。

2020/3/10:追記
WebStormとWSL使ってやろうとしてたんですが現状動かせそうにないです・・・。
素直にWindowsにNode.jsインストールしてやったほうが確実な気がします。

# 開発環境
- Windows 10 Pro 1909
- WSL(openSUSE-Leap-15-1)

# Node.jsのインストール
WSLを起動し、リポジトリにあるnodejsのバージョンを調べます。

```
$ sudo zypper se nodejs
Loading repository data...
Reading installed packages...

S | Name                    | Summary                                          | Type
--+-------------------------+--------------------------------------------------+-----------
  | nodejs-common           | Common files for the NodeJS ecosystem            | package
  | nodejs-emojione         | A set of emojis designed for the web             | package
  | nodejs-emojione-awesome | Emojione templates                               | package
  | nodejs-emojione-demo    | EmojiOne Demos                                   | package
  | nodejs-emojione-meteor  | EmojiOne utility for Meteor                      | package
  | nodejs-emojione-python  | EmojiOne utility for Python                      | package
  | nodejs-emojione-swift   | EmojiOne utility for swift                       | package
  | nodejs-packaging        | Node.js Dependency generators for openSUSE       | package
  | nodejs-underscore       | A utility belt library for JavaScript            | package
  | nodejs10                | Evented I/O for V8 JavaScript                    | package
  | nodejs10                | Evented I/O for V8 JavaScript                    | srcpackage
  | nodejs10-devel          | Files needed for development of NodeJS platforms | package
  | nodejs10-docs           | Node.js API documentation                        | package
  | nodejs8                 | Evented I/O for V8 JavaScript                    | package
  | nodejs8                 | Evented I/O for V8 JavaScript                    | srcpackage
  | nodejs8-devel           | Files needed for development of NodeJS platforms | package
  | nodejs8-docs            | Node.js API documentation                        | package
```

```
$ sudo zypper info nodejs10
Loading repository data...
Reading installed packages...


Information for package nodejs10:
---------------------------------
Repository     : leap-15.1-update
Name           : nodejs10
Version        : 10.16.3-lp151.2.6.1
Arch           : x86_64
Vendor         : openSUSE
Installed Size : 23.6 MiB
Installed      : No
Status         : not installed
Source package : nodejs10-10.16.3-lp151.2.6.1.src
Summary        : Evented I/O for V8 JavaScript
Description    :
    Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js
    uses an event-driven, non-blocking I/O model. Node.js has a package ecosystem
    provided by npm.
```

v10.16.3が最新のようなので、今回は`nodejs10`をインストールします。
同時に`npm10`もインストールします。

```
$ sudo zypper in nodejs10 npm10
```

インストールが終わったらバージョン確認をします。

```
$ node -v
v10.16.3
```

```
$ npm -v
6.9.0
```

無事インストールできていることが確認できました。

今回は以上になります。
~~次は実際にElectronを動かしてみるところまでやってみたいと思います。~~
プライベートサブネットのEC2からCloudwatchへログを飛ばす

## やりたいこと
プライベートサブネットにおいたEC2から、Cloudwatchへログを飛ばしたい
※Cloudwatch agentをEC2にインストールしている前提で。

## 普通にできそうじゃない…？
Cloudwatch agentからCloudwatchに飛ばすとなると、1回外へ出ていこうとする。
プライベートサブネットは外へ出る足がないので、サブネットの中で糞詰まってしまう。


## やりかた
* 前提：Cloudwatchに、飛ばしたいログを受けとるためのロググループを作成済みであること

-  セキュリティグループを作成する
- EC2をsourceとした443のinbound通信を受けられるルールを作成する

- VPCエンドポイントを作成する

### VPC → エンドポイントを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/9809b100-8e31-90b0-77ca-a95393d15a7c.png)

### エンドポイントの作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/c8ef9f7b-9c2f-2b59-27fa-417dde885116.png)

### どのサービス用のエンドポイントであるかを指定する  
  
Cloudwach Logs用なので、com.amazonaws.リージョン名.logsを選択する
logsで検索すれば出てくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/27a5b865-9d0a-e0d6-0fa8-d48fb4c65d0c.png)

### 検索して出てきたエンドポイントを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/b2aa1be6-976a-85a0-e912-d2124de754cc.png)

### すると、VPC、サブネット、セキュリティグループ等々が選択できるようになる
VPCとサブネットの選択
ログを飛ばしたいEC2が存在するVPCを選択する。サブネットも同様。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/80942af8-b2ce-96f1-af75-9927a867ad47.png)
    
    
### セキュリティグループの選択  
##### 1番で作成したセキュリティグループを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/b02e18ac-8901-06eb-9c1d-73c1304d3109.png)


### file_config.jsonに"endpoint_override"を追記する
AWSのリファレンスによるとこんな設定が必要とのこと。   

[CloudWatch エージェント設定ファイルを手動で作成または編集する](  
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html#CloudWatch-Agent-Configuration-File-Logssection)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/a8d57b66-47e7-0dd2-e148-e73b20ddeb98.png)  

#####  ちょっと何言ってるがよくわからないが、この赤枠の値をfile_config.jsonに書けばOK  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/f0f937ac-64f0-6ea3-97ff-f91a8c1e7f7b.png)

##### file_config.jsonはコチラ↓

```
/etc/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.d
```
  
最後に、Cloudwatchで飛ばしたかったログが飛んできてるか確認する。
普通にCloudwatch見るだけなので省略。

以上
GASのカスタムメニュー

こうしておくと間違いないかな、という備忘
メニューを作成する手段は２通り。
サブメニューを作りたい場合は１−１の方法、
途中で更新する場合は１−２の方法という微妙な仕様。

#1.メニュー、２つの追加方法
[メニュークラス](https://developers.google.com/apps-script/reference/base/menu)
メニュークラスには追加系のメソッドしかない

```javascript
  let menu = SpreadsheetApp.getUI().createMenu('My Menu');
  menu.addItem('Menu Item','myFunc');
  menu.addSeparator();

  let subMenu = SpreadsheetApp.getUI().createMenu('My Sub Menu');
  menu.addSubMenu(subMenu);

  menu.addToUi();

```
addItemでメニューアイテムの追加、
addSeparatorでセパレータ、
addSubMenuでメニューオブジェクトをサブメニューとして追加できる。
最後にaddToUiでUIに追加。この一連をOnOpenなどでよんであげる

##1-1.[UIクラス](https://developers.google.com/apps-script/reference/base/ui)から作成

上記のサンプルソースのように追加する。作る以外は考慮されてないっぽい。


##1-2.[スプレットシートクラス](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet)から作成

Spreadsheetクラスには、
addMenu
removeMenu
updateMenu
があり、なにかのイベントの際に作成、削除、更新が可能。

```javascript
function createMyMenu()
{
  let menuItem = [];
  menuItem.push({name:'Menu Item',functionName:'MyFunc'});
  menuItem.push(null);
  menuItem.push({name:'Menu Item-2',functionName:'MyFunc2'});
  SpreadsheetApp.getActiveSpreadsheet().addMenu('My Menu',menuItem);
  
}

function updateMyMenu()
{
  let menuItem = [];
  menuItem.push({name:'Menu Item',functionName:'MyFunc-New'});
  SpreadsheetApp.getActiveSpreadsheet().updateMenu('My Menu',menuItem);
}
function removeMyMenu()
{
  SpreadsheetApp.getActiveSpreadsheet().removeMenu('My Menu');
}
```

逆にサブメニューはつくれそうにない。

#2.呼び出しの関数について
只の関数は可能
クラスのスタティックメソッドは可能
グローバル変数にいれたクラスオブジェクトのメソッドは可能

というわけで、私の使い方としては以下とした。

```javascript
function onOpen(e)
{
  let menuItem = [];
  menuItem.push({name:'my doSome',functionName :'MyFunc'});
  SpreadsheetApp.getActiveSpreadsheet().addMenu('My Menu',menuItem);
}

function MyFunc()
{
  let myClassObj = new MyClass();
  myClassObj.doSomething();
}

```


#3.現状の対応

私自身はサブメニューより、状況に応じたメニューにしたかったので１−２の実装をすることにした。
スプレットシート以外のクラスには上記メソッドないんだけど、作らないor作れない、のかな？
それぞれ今後調べる機会があれば。
framebufferへの描画

FreeBSDのframebufferへの描画について、以下のページに情報がありました。

https://teratail.com/questions/35242?sip=n0070000_019

http://freebsd.1045724.x6.nabble.com/Writing-to-dev-fb0-td6335760.html

下のベージにあるgonzoさんのメールのコードを試してみました。

![写真（2020-03-10 13.50）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/edf36200-590c-950e-4f35-1c2ad9c51bec.jpeg)

WARNINGのことも書かれていますが、理解できてません。

cairoでも書いてみました。

```c
/*
 * original code is fbutils.c
 *
 * Utility routines for framebuffer interaction
 *
 * Copyright 2002 Russell King and Doug Lowder
 *
 * This file is placed under the GPL.  Please see the
 * file COPYING for details.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/time.h>

#include <sys/consio.h>
#include <sys/fbio.h>

#include <cairo/cairo.h>

static int fbsize;
static unsigned char *fbuffer;
static unsigned char **line_addr;
static int fb_fd=0;
uint32_t xres, yres;
int line_length;

static char *defaultfbdevice = "/dev/fb0";

int open_framebuffer(void)
{
	int y;
	unsigned addr;
	struct fbtype fb;

	fb_fd = open(defaultfbdevice, O_RDWR);
	if (fb_fd == -1) {
		perror("open fbdevice");
		return -1;
	}


	if (ioctl(fb_fd, FBIOGTYPE, &fb) != 0) {
		perror("ioctl(FBIOGTYPE)");
		return -1;
	}

	if (ioctl(fb_fd, FBIO_GETLINEWIDTH, &line_length) != 0) {
		perror("ioctl(FBIO_GETLINEWIDTH)");
		return -1;
	}

	xres = fb.fb_width;
	yres = fb.fb_height;

	int pagemask = getpagesize() - 1;
	fbsize = ((int) line_length*yres + pagemask) & ~pagemask;

	fbuffer = (unsigned char *)mmap(0, fbsize, PROT_READ | PROT_WRITE,
	    MAP_SHARED, fb_fd, 0);
	if (fbuffer == (unsigned char *)-1) {
		perror("mmap framebuffer");
		close(fb_fd);
		return -1;
	}

	return 0;
}

void close_framebuffer(void *device)
{
	munmap(fbuffer, fbsize);
	close(fb_fd);
}

int main()
{
	cairo_t* cr;
	cairo_surface_t *surface;

	open_framebuffer();

	surface = cairo_image_surface_create_for_data (fbuffer,
	    CAIRO_FORMAT_ARGB32, xres, yres, line_length); 

	cairo_surface_set_user_data(surface, NULL, NULL,
	    &close_framebuffer);

	cr = cairo_create (surface);
	cairo_set_line_width(cr, 3);
	cairo_set_source_rgb(cr, 1.0, 0, 0);
	cairo_move_to (cr, 500, 500);
	cairo_line_to (cr, 600, 600);
	cairo_stroke (cr);

	cairo_destroy(cr);
	cairo_surface_destroy(surface);


	return 0;
}
```

![写真（2020-03-11 8.27） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f2286dec-d311-99ce-3aaf-7108ac9f1108.jpeg)

[mruby_cairo](https://github.com/yamori813/mruby-cairo)にもサポート入れてみました。

```
c = Cairo.new
c.set_source_rgb(1, 0, 0)
c.move_to(0, 0)
c.line_to(100, 100)
c.stroke()
```

![写真（2020-03-11 10.56）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/430b90b4-2a1a-841a-5223-d34005352a1a.jpeg)

framebufferにコンソールのログが出ないようにするには以下のようにする。

```
# conscontrol delete ttyv0
Configured: ttyu0
 Available: ttyu0,ttyv0
    Muting: off
```

起動時のものは消せないが、起動後のものは出なくなる。
メインシーンに戻ったとき再び当たり判定が機能してしまう

Unity3カ月の初心者です。
2DのRPG風クイズを作っています。
メインのフィールド上にキャラクターが複数人散らばって立っていて、
playerが相手（キャラクター）に当たったらその都度クイズシーンに変わり、クイズを解いて、ボタンを押すとメインのフィールドに戻ってくる。それを繰り返すゲームです。
メインに戻った時のplayerの位置や増殖？等はシングルトンなどなんとかできたのでが、メインのシーンに戻った時、playerと相手（キャラクター）の当たり判定が再び機能し、すぐ、ゲームシーンへ遷移してしまいます。

キャラィターのOnCollisionEnter2Dをstay,Exit,に変えたり、
別途GetComponent<BoxCollider2D>().enabled = false;でシーン変換時にコライダを破棄させたり、その他Webで検索したことはいろいろ試したのですが、一向に進めません。

プラグラムも全くの素人でWebと本のみで作り出しました。
質問の文が分かりにくかったらごめんなさい。
この質問部分は何日調べても今の自分のレベルでは進展しないので、どなたか助けていただけないでしょうか？
素人の稚拙な文また内容で申し訳ありませんが、
どうぞよろしくお願い致します。
文字列の日付を整えて文字列で表示する実例(android kotlin)

文字列を日付型に変換したり、日付型を文字列に変換するやり方はたくさん出てきます。

が、実例が出てこなかったのでまとめておきます。

流れとしては
①string型をparseしてdate型に変換
②date型を、整えたい形のstring型に変換

実例を見た方がわかりやすいかと思います

```kotlin
val dateStr = "2020-01-02 03:04:05"
// dateStrの形式に""ぴったり""合わせてください↓
val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val convertedDate = sdf.parse(dateStr)

val sdf2 = SimpleDateFormat("年はyyyyで、月はMMで、日はddのHH時mm分、ss秒")
val resultStr = sdf2.format(convertedDate)
```

resultStrには
「年は2020で、月は01で、日は02の03時04分、05秒」と出力されます。

あと、sdf.parseをするときに注意なのが、例えばssは要らないとして
"yyyy-MM-dd HH:mm"なんて書いたらエラーになります。
自動でAndroidのライブラリアップデートのプルリクエストを送る紹介 (Releases Hub Gradle Plugin + GitHub Actions + buildSrc Kotlin)

# 概要

Releases Hub Gradle PluginでKotlin DSLで依存関係を管理していれば自動でライブラリアップデートのプルリクエストを送る事ができます。

https://github.com/DroidKaigi/conference-app-2020/compare/1f02da06718f3281a1665c2430c1afcec943593f...cf13547
この変更だけでGitHub Actionsがこういう感じのプルリクエストを送ってくれるようになります。かなり手軽に導入できます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/71194d22-cadd-01bb-4190-c6cf41512f8e.png)

https://plugin.releaseshub.com/ にPrivacy Policyなどありますのので、一読してください。

## Tips

* ./gradlew listDependenciesで事前にバージョン一覧とか取得できます。

* $versionみたいな書き方を使っているとダメみたいです。

```kotlin
object Dep {
    object GradlePlugin {
        val android = "com.android.tools.build:gradle:3.6.0-rc03"
        val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:${Kotlin.version}"
        val kotlinSerialization = "org.jetbrains.kotlin:kotlin-serialization:${Kotlin.version}"
```

↓

```kotlin
object Dep {
    object GradlePlugin {
        val android = "com.android.tools.build:gradle:3.6.0-rc03"
        val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
        val kotlinSerialization = "org.jetbrains.kotlin:kotlin-serialization:1.3.61"
```
Docker on Linux でホストPCのホスト名を取得する

ブリッジネットワーク使用時、Windows, Macでは、コンテナ内から`host.docker.internal`が解決でき、それでホストPCと繋げられるそうです。

が、なぜかLinuxでは、20200310現在、その機能がありません。[そのうちできるようになりそうな気配](https://github.com/docker/for-linux/issues/264)はありますが・・・。

それまでは、[この方法](https://github.com/docker/for-linux/issues/264#issuecomment-565849448)で、コンテナ立ち上げ時にホストIPを渡せば良いみたいです。

```
docker run -it --add-host=host.docker.internal:$(ip route | grep docker0 | awk '{print $9}') debian bash
```
Veturを入れてるのにコード補完が効かない

〜ときは設定を見直そう！

### vlsを導入
Vue Language Serverを入れましょう

```zsh
npm i -g vls
```

### Extensionsの設定

Visual Studio CodeのExtensionsからVeturの設定を開く
<img width="452" alt="スクリーンショット 2020-03-10 12.02.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/3558b581-4dac-b39a-0651-e029c388c420.png">

導入したvlsのパスを設定
<img width="830" alt="スクリーンショット 2020-03-10 12.05.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/1810ff4a-b31f-db8a-a4ea-8cea98959ded.png">

テンプレート補完にチェックを入れる
<img width="639" alt="スクリーンショット 2020-03-10 12.06.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/63690e52-8cb5-1e61-cc81-c910717da584.png">

これで`<template>`内部の変数やコンポーネントでコードジャンプ補完が効くはず！
SFCに色がついただけで満足している方は要チェック！
ちなみに読み方はビーターらしい
KerasでRAdamを使用する。

#はじめに

以下の記事でAdamの改良版のRAdamという最適化アルゴリズムがあるとのことなので、
Kerasで使用する方法について調べてみました。

https://qiita.com/omiita/items/d24568a835da6911b01e

#RAdamのインストール
上記の記事で紹介されているもの以外にも
「keras rectified adam」や「keras radam」等で検索すると、いくつかでてきますが、
pipでインストールできるこれを使ってみました。
下記サイトの内容そのままですが、

```
pip install keras-rectified-adam
```
でインストールできます。

https://pypi.org/project/keras-rectified-adam/

#使い方
「from keras_radam import RAdam」でインポートしてから
モデルをcompileする際に「optimizer=Adam(lr=～)」とかやってた箇所を「optimizer=RAdam()」に変えればよいようです。


```Python
#（例）
from keras_radam import RAdam
…
model.compile(loss='categorical_crossentropy', optimizer=RAdam(), metrics=['accuracy'])
```

#最後に
学習率の設定について考慮しなくて済むのが利点として大きいと感じました。
基本情報技術者試験の勉強　第21週(3/9週)

## 目標と結果
### 目標
・表計算の復習、理解を深める
・アルゴリズムの流れをつかむ
### 結果
・表計算をほぼ間違えずに解けるようになった
・アルゴリズムの基礎？簡単な問題についてはゆっくりだが解けるようになった
## 振り返り
### keep
・毎日継続すること
・時間があったらできるだけ長い時間復習などの勉強時間にあてていること
### problem
・勉強する時間がなかったら何もしないこと。1日何もやらない日を作らない。
### try
・ゆっくりでもアルゴリズムの過去の試験問題を解けるようにする
僕のPySide(Python)

自分用のまとめ
随時更新
自分が使った、調べたコマンドを記載
**自分がわかればいいからところどころ用語が間違ってるかも**

！見方

```python
#コマンド
    #引数のオプションの説明
```




###モジュール読み込み

```python
import Pyside
```

####スクリーンサイズの取得
Coffee LakeにOpenCoreでmacOSをinstallする

Coffee Lake搭載の自作PCにmacOS 10.15.3 Catalinaをinstallする。
現在稼働しているmacOSでの作業を前提としている。

# 参考にしたガイド
- https://khronokernel-2.gitbook.io/opencore-vanilla-desktop-guide/
　ここの手順に従う。
- https://bootmacos.com/entry/2019/08/10/002814 メモリ領域確保の問題でとても参考になった

#Hardware
graphicボードなし。CPU内臓のIntel UHD Graphics 630を使う。
- CPU : Core i7-8700 3.2GHz (第8世代 Coffee Lake)
- MB : GIGABYTE H370 HD3 BIOS F14
- Memory : DDR4-2666MHz 8GB x2 
- SSD : Samsung SSD 250GB 850EVO

#Software
https://qiita.com/blueknight611jp/items/9f2bc56ac02f9cf39ae0
で集めたもの加えて
- OpenCoreShell : https://github.com/acidanthera/OpenCoreShell/releases

# USB installerを作成
# EFIフォルダをコピー
ここらはHaswellと同様なので省略。

# AMLファイル
OpenCore-0.5.6-DEBUG/Docs/AcpiSamplesのdslファイルのうち、Coffee Lakeでは以下の4つが必要
SSDT-PLUG 、SSDT-EC-USBX、SSDT-AWAC, SSDT-PMC
コンパイルしてACPIフォルダへ入れる。

# Tools
先に入手しておいたOpenCoreShell-1.0.4-DEBUG.zipを展開し、Shell.efiをOC/Toolsフォルダに入れる。

# Drivers
Haswellと同様なので省略。

#Kextsを集める
ここも同様なので省略。
 H370-HD3のイーサネットカードはIntel I219V7なのでIntelMausiEthernetを入れる。集めたkextsを /Volume/EFI/EFI/OC/Kextsにコピーする 

# GenSIMBIOS
モデルはiMac18,1を指定する。


# ProperTreeでOCのsnapshotをとる
省略

# ProperTreeでconfig.plistを編集
- OpenCore Sanity Checker : https://opencore.slowgeek.com/
- Coffee Lake OC 0.5.6 を選んで、config.plistをDrag&Drop 
- チェックされた項目を修正するのが早そう。

# Intel UHD Graphics 630

起動後に画面がblack outしてしまうのは、DevicePropertiesでの設定の問題。PciRoot(0x0)/Pci(0x2,0x0)で

- AAPL,ig-platform-id : 07009B3E
- framebuffer-patch-enable Data 01000000 と行を追加
- framebuffer-con0-enable Data 01000000 と行を追加
- framebuffer-con1-enable Data 01000000 と行を追加
- framebuffer-con2-enable Data 01000000 と行を追加

https://khronokernel-2.gitbook.io/opencore-vanilla-desktop-guide/extras/gpu-patches#iGPU-BusID-Patching
を参考に

- framebuffer-con0-alldata Data 01000900 00040000 C7030000
- framebuffer-con1-alldata Data 02000A00 00040000 C7030000
- framebuffer-con2-alldata Data 03040800 00080000 C7030000
と設定。

HDMIの出力はcon2のport04だったのだが、con1の01~06、con2の01~06、con3の01からと試してrebootを繰り返していたので大変だった。

# Couldn't allocate runtime area errors
これはMB次第だが、kernel読み込み時にメモリ領域確保ができない状況。
https://khronokernel-2.gitbook.io/opencore-vanilla-desktop-guide/extras/kalsr-fix
を参考にする。
先に準備したOpenCoreのShell.efiを利用して、メモリマップを調べる。
USBメモリで起動してOpenCoreのメニューが表示されたら、Shellを選択。
fs0:と入力して USBメモリに移動。dirでディレクトリ確認。memmap > memmap.txtとしてメモリマップを作成。USBメモリのEFIからmemmap.txtを入手する。
Kernelの展開には0x11c01ページ(約300MB)の領域が必要となるので
memmap.txtを確認して、
Available  0000000000100000-00000000180C4FFF 0000000000017FC5 
と0x100000番地以降に十分なスペースがあるのであれば、
boot-argに slide+0 (これで0x100000から展開される）を追加すれば良い。
【Nuxt.js】Universalモードで「window is not defined」エラーが出たときの対処法

Nuxt.jsに外部プラグインを追加したときに下記のようなエラーがでました。

```
ReferenceError: window is not defined　<hogehoge>
```

# Universal(SSR)モードのエラー
Universal(SSR)モードのときはJavascriptの命令文「document」や「window」はエラーになってしますようです。

インストールしたプラグインがサーバーサイドで動いているようでした。

Nuxtがサーバー側でレタリングする際に、クライアント(ブラウザ)は存在しませんので「document」や「window」はサーバー側ではエラーをおこすようです。

フーム、じゃあクライアント側で設定されていないプラグインは使えないじゃかと思ったのですが、きちんと対処法がありました。

# フロントで動くように記述
`<client-only>`を記述することによりこのエラーを回避することができました。
[API: <client-only> コンポーネント](https://ja.nuxtjs.org/api/components-client-only/)

```
<client-only>
  <hogehoge>Foo Bar</hogehoge>
</<client-only>
```

※Nuxt のバージョンがv2.9.0未満の場合、`<client-only>`のかわりに`<no-ssr>`を使用してください。
Bootstrap リリース履歴

> Bootstrap · The most popular HTML, CSS, and JS library in the world.

https://getbootstrap.com/

v.4

https://github.com/twbs/bootstrap/releases

|Version|Release|
|---|---|
|4.4.1|2019-11-28|
|4.4.0|2019-11-27|
|4.3.1|2019-02-14|
|4.3.1|2019-02-12|
|4.2.1|2018-12-22|
|4.1.3|2018-07-25|
|4.1.2|2018-07-13|
|4.1.1|2018-05-01|
|4.1.0|2018-04-10|
|4.1.0|2018-01-19|
|4.00alpha|

v.3

|Version|Release|
|---|---|
|3.4.1|2019-02-14|
|3.4.0|2018-12-14|
|3.3.7|2016-07-26|
|3.3.6|2015-11-15|
|3.3.5|2015/06/15|
|3.3.4|2015/03/16|
|3.3.2|2015/01/20|
|3.3.1|2014/11/13|
|3.3.0|2014/10/30|
|3.2.0|2014/06/27|
|3.1.1|2014/02/14|
|3.1.0|2014/01/31|
|3.0.3|2013/12/06|
|3.0.2|2013/11/06|
|3.0.1|2013/10/31|
|3.0.0|2013/08/30|

v.2

|Version|Release|
|---|---|
|2.32|2013/05/17|
|2.31|2013/03/01|
|2.30|2013/02/08|
|2.22|2012/12/09|
|2.21|2012/10/31|
|2.2.0|2012/10/30|
|2.1.1|2012/09/05|
|2.1.0|2012/08/21|
|2.0.4|2012/06/02|
|2.0.3|2012/04/25|
|2.0.2|2012/03/13|
|2.0.1|2012/02/17|
|2.0.0|2012/02/01|

v.1

|Version|Release|
|---|---|
|1.4.0|2011/11/04|
|1.3.0|2011/09/17|
|1.2.0|2011/09/03|
|1.1.1|2011/08/27|
|1.1.0|2011/08/23|
|1.0.0|2011/08/19|
docker の コンソールが固まる。フリーズ・停止して動かない。それ Control + S のせいなら Control + Q で解除できない？ ( #Mac #Docker )

よく固まるなーーと思って、毎回しかたなくウィンドウを閉じてたら、どうやら端末ロック機能のせいだったぽい。

キーを入力しても何も起きなくなる

![image](https://user-images.githubusercontent.com/13635059/76179684-10861980-61ff-11ea-89c5-6defc088c95b.png)

Control+Q を押した瞬間、入力が解除される

![image](https://user-images.githubusercontent.com/13635059/76179686-11b74680-61ff-11ea-92bd-3d170e043632.png)

環境: Mac + Docker


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3013








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->