OmniAICreator/Qiita-1.07M huggingface dataset:
GCP CloudMonioringのUptime ChecksとDatadogで可用性を可視化する

運用しているサービスの可用性を簡単に可視化できないものかと思っていた所、GCP CloudMonitoringのUptime ChecksとDatadogで簡単に可視化できそうだったのでそのメモになります。

## Uptime Checks

GCPのCloudMonitoringの機能の一つで、HTTP(HTTPS)・TCPのプロトコルに対し、下記で指定した宛先に一定時間ごとにリクエストを送ってステータスをチェックしてくれます。そこからアラート通知することも可能です。

* URL
* GCP Instance
* AWS Elastic Load Balancer
* GCP App Engine

GCPだけでなくて何にでも使えるのが嬉しい所、、、
HTTPヘッダも追加できます。

使用料金はなんと無料。(Basic Tierに含まれます)
https://cloud.google.com/stackdriver/pricing?hl=ja

チェック元のマシンのロケーションはなんと6通りもあり、要したレイテンシ時間も標準メトリクスとして取得できます。
(もちろんチェック元のマシンはGCP側でマネジメントされています)

<img width="883" alt="Uptime_Checks.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/fe3ee24d-255b-f58d-7fe9-dc558a5fea30.png">

一般公開していないサービスの場合、チェック元マシンのIPアドレスを許可する必要があります。
そのリストの取得方法は下記のドキュメントを参照。(UIやAPI経由で取得できます。)

https://cloud.google.com/monitoring/uptime-checks/#monitoring-uptime-check-list-ips-console

## Datadog

### GCPをIntegration

上記のUptime ChecksのメトリクスはDatadog側でGoogle PlatformをIntegrationすることで簡単に取得できるようになります。
Integrationすると、下記のメトリクスが取れるようになっていると思います。

* gcp.monitoring.uptime_check.check_passed
* gcp.monitoring.uptime_check.request_latency
* gcp.monitoring.uptime_check.content_mismatch

今回利用するのは一番上のcheck_passedになります。

メトリクスの詳細については下記参照。
https://cloud.google.com/monitoring/api/metrics

check_passedはチェックに成功するとBOOL型でTrueを返してくるとのこと。
と成功すると1, 失敗すると0を返すということで、ある期間のメトリクスの平均を取ればいいはず。

### グラフの作成

任意のダッシューボードでQuery Valueをドラッグ&ドロップします。
すると、グラフ作成のダイアログが開きます。

<img width="1039" alt="test___Datadog.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/dbeecb76-e3a0-695b-3a18-d59abf03af57.png">

それでは先ほどのメトリクスを元に設定項目を追加していきます。(図参照)

<img width="982" alt="test___Datadog.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/c71e8959-951e-7b4d-41f4-48a5c1a305ce.png">

ちなみに、ある値を下回ったら赤で、上回っていたら緑で表示するようにもできます。
(SLAで既に可用性の値を決めている場合に使えるのではないでしょうか。)
図では99.99を目標として99.985を閾値にしています。(四捨五入されるため)

<img width="983" alt="test___Datadog.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/32ada065-341e-cbd3-de45-f921c851f9a3.png">

ここまで入力したら、Doneボタンを押して保存して一つのグラフの完成です。
これを使うことで下記のようなDashboardの作成が可能です。

<img width="995" alt="test_khiraiwa___Datadog.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/20c737d1-b44c-5bfe-65cd-544353eff0df.png">
Androidでブロードキャストの処理を記述するときのフォーマット

```java:SendActivity.java
// 一行で記述する方法
Intent i = new Intent(※1);

// 二行に分割して記述する方法
Intent i = new Intent();
i.setAction(※1);
```
※1は、activity_receive.xmlの※1と合わせます。
※1は、「パッケージ名.action.適当な名前」とします。

```java:ReceiveActivity.java
public class ※2 extends BroadcastReceiver{
	public void onReceive(){
		// ここには受信時に実行する処理を記述します。
	}
}
```
※2は、activity_receive.xmlの※2と合わせます。

```java:activity_receive.xml
<receiver android:name=".※2">
	<intent-filter>
		<action android:name="※1">
	</intent-filter>
</receiver>
```
※2の前の「.」はゴミではありません。必要なドットです。
議論で迷った時、まず取りうる選択肢を列挙すると道が開けるという話

# はじめに
エンジニアとして働くなかで、色々な職種の方と議論をして意思決定をすることがあります。

そのなかで、

* 会議が紛糾してなかなか結論に辿りつかない時
* 他の人から仕様について相談をうけて、なかなか向こうの言いたいことが見えて来ず、議論が進まない
* 一人で案を考えていて、堂々巡りでになってしまう

なんてこと、ありますよね。

こういうケースで自分で心がけたり、人に「こういう風に案をまとめてきてください」というものがあるので、それをまとめます。

# 検討の3Step
## Step1.取りうる選択肢を列挙する
色々な論点が交差して混乱したとしても、最終的には何かのアクションに落とし込まないといけません。それならば最初から取り得る選択肢を並べましょう。多くの場合、選択肢は意外と多くないことに気づくでしょう。

有効な選択肢があまり思いつかない場合は、そもそもの設定している問題に無理があるのかもしれません。そこを疑ってみましょう。

選択肢が多すぎる場合は、問題のフォーカスする粒度が粗すぎる可能性があります。一度問題を分解することを考えましょう。

現実的な選択肢が幾つか並んだら、その時点で答えが自ずと出るかもしれません。おめでとうございます。

複数の選択肢で迷うことがあったら、Step2に進みましょう。

とにかく、迷ったら取りうる選択肢を並べるだけでも、現状の問題がどこにあるのか整理されます。まずはここから始めましょう。

## Step2.検討観点と検討結果を整理する

選択肢を複数並べたら、それぞれのメリット、デメリットを書き出しましょう。

メリットデメリット以外に、検討時に重要な項目は独立させましょう。(工数、リスクのように横串で検討しないといけないものなど)

これを書き出すと複数案を同じ軸できちんと比較できるようになります。

そうでない状況の例:<br>A案は機能上のメリットを話していて、B案は工数の話をしていて、のような状況では、比較をしようとしても同じ条件の比較でないので論理的な判断がしにくくなります。A案とB案ではどれほど機能に違いがあるのか、工数はどれほど変わるのか。また現在重みを置くのは機能なのか工数なのか、ということを踏まえて総合的に判断がしやすくなります。

## Step3.分析結果を踏まえた結論を出す

上記を踏まえて、現時点の判断結果を導きだします。明らかに特定の案がよさそうであれば決まりです。

特定の案を除外しても、残った案で判断がつかない場合は、なぜ判断がつかないのかを切り分けましょう。項目の重み付けに迷うのか、判断する材料が不足しているのかなどです。迷う場合は近くにいる人、特にその重み付けに責任を持つ人に相談しましょう。材料不足の場合は必要な情報を得るためにアクションを起こしましょう。


# 人に報告する時の順番
大体の意思決定は関係者の合意が必要となります。その場合は上述のStepの内容を以下の内容で話しましょう。

まず、Step0として背景や概要の頭出しをします。

Step1の選択肢一覧を概要レベルで話しましょう。この段階ではあまり詳細まで触れないほうが良いです。まずは全体感を伝えましょう。

次は詳細より先にStep3の分析結果を述べましょう。自分の中で結論が決まっているのか、迷っているので相談したいのかのスタンスを伝えることが重要です。相手も聞く前提が大きく変わります。

最後に、Step2の詳細を述べて、Step3に戻りましょう。

このプロセスのなかで寄り道をすることはあると思います。例えば、選択肢を並べた段階で「こういう案もあるよね」という話がでることもあるでしょう。

その場合はその案をその場で改めて検討するば良いと思います。準備したStepはあくまで思考の整理と、たたき台として捉えましょう。自分の時間で論点を整理したことにより、複数人で検証する時間を短縮し、時間を有効に使うことはできたはずです。

重要なのは「自分で考えたほうが効率が良いのか、相手と考えたほうがよいのか」を常に考えることです。その判断軸で、準備と相談のバランスを考えられるとよいと思います。

# まとめ
お気づきの方もいらっしゃるかと思いますが、議論で迷った時ときとは言っていますが、一般的な選択肢検討のテンプレだったりします。

ただ、議論の時にふと当てはめてみると効率的に話を進められるきっかけになるかもしれません。よろしければ、迷った時に思い返してみてください。

# 新人応援関連記事
[「悪い設計」の定義について考えたことはあるか](http://little-hands.hatenablog.com/entry/2017/10/10/005933)
[モデルとは"現実世界を正しく表現したもの"ではないという話](http://little-hands.hatenablog.com/entry/2017/10/16/000110)
Julia のインストール（brew & ソースビルド）とJupyter Notebookで使うまで in macOS

## brew を使ったインストール

macOSの場合brew caskを使えばかんたんにインストールできます。

https://github.com/Homebrew/homebrew-cask/blob/master/Casks/julia.rb

```
$ brew install --cask julia
```

## ソースからビルド
開発中のバージョンを使うにはこれがお勧めです。

https://github.com/JuliaLang/julia

```sh
$ git clone https://github.com/JuliaLang/julia.git
$ cd julia
$ git tag
```

tagを見て好きなバージョンを指定するか、開発中の最新バージョンであればそのまま master を使います。

```sh
$ git switch -d origin/v1.6.1
```

ビルドに非常に時間がかかるため、並列でやっていきます。
ジョブ数今回は2にしてありますが、マシンの $コア数$ が良いようです。

https://unix.stackexchange.com/questions/208568/how-to-determine-the-maximum-number-to-pass-to-make-j-option

```sh
$ system_profiler SPHardwareDataType | grep Cores
      Total Number of Cores: 2
$ make -j2
```

```sh
$ ./julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.7.0-DEV.597 (2021-02-23)
 _/ |\__'_|_|_|\__'_|  |  Commit 503c63b255 (0 days old master)
|__/                   |

```
おしゃれなAAが表示されればOK


## Jupyter Notebookで使えるようにする
*Jupyter Notebookがすでにインストールされているのが前提です。


Juliaのパスを通しておきましょう

```sh
$ echo 'export PATH=$PATH:/path/to/install/folder/bin' >> ~/.zshrc
$ exec $SHELL
```

IJuliaのパッケージをインストールするためにJuliaの
インタプリタを起動します。

```sh
$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.1 (2018-09-29)
 _/ |\__'_|_|_|\__'_|  |
|__/                   |

julia>
```

起動したら、`]`をタイプします。
するとプロンプトが下記のように切り替わります。

```jlcon
(v1.7) pkg>
```

IJuliaパッケージをインストール。

```jlcon
(v1.7) pkg> add IJulia
```

これでもうJupyterのカーネルに追加されています。

```sh
$ jupyter kernelspec list
Available kernels:
  julia-1.7    /Users/h-1749/Library/Jupyter/kernels/julia-1.7
  python3      /Users/h-1749/.pyenv/versions/3.9.1/share/jupyter/kernels/python3
$ jupyter notebook
```

正しくカーネル追加できていれば右上のNew(新規ファイル作成)のところに
`Julia {インストールしたバージョン}`がいるはずです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32147/cf87b255-9c00-feb3-a378-01653865ae56.png)


せっかくなのでちょこっとコードで動作確認してみましょう．

![4c85359a-12fc-4bdd-9a84-78e359ef5dc4.png](https://qiita-image-store.s3.amazonaws.com/0/32147/6882a68c-6f15-3bde-55f2-022637bf1a32.png)

いい感じです．
作業の効率化につながるお薦めツールの紹介（Windows）


身の回りの方々にお薦めしているツールです。自分の備忘も兼ねて。Windowsのみです。

# ファイル検索

- [FileSeeker](http://www.vector.co.jp/soft/winnt/util/se327185.html)
    - ファイル名とテキストから超高速で検索できるシンプルな検索ソフト
    - これをインストールしておくとファイル名さえ分かれば瞬時にアクセスできる

# 入力支援
- [Clipboard History](http://blank-note.sakura.ne.jp/topics/clipboard_history.html)
    - クリップボード履歴＆定型文ユーティリティー
- [PhraseExpress](http://www.vector.co.jp/soft/winnt/util/se511895.html)
    - 万能入力支援ソフト
    - あらゆるソフトでスニペットを利用できるようになる
    - メールなどの定型文から、コードまで幅広く活用できる
        - [【保存版】 あまり知られてない!?「PhraseExpress」8つの使い方!](https://yossense.com/phrase-express-example/)
- [テキペ](http://www.vector.co.jp/soft/win95/util/se273383.html)
    - コピー&貼り付けする時、罫線や文字の大きさ等の書式を解除して、テキスト化
- [Google 日本語入力](https://www.google.co.jp/ime/)
    - GoogleのIME
    - 日々のちょっとした効率化のためには単語登録を推奨
        - [仕事に役立つ！5つの単語登録の例 | シゴタノ！](https://cyblog.jp/17683)
        - [【保存版】単語登録はここまで使い倒せます! 17種類の実用アイデア集 | ヨッセンス](https://yossense.com/words_recommendation/)

# データ加工・分析

- [Microsoft Power BI Desktop](https://powerbi.microsoft.com/ja-jp/desktop/)
    - MicrosoftのBIツール、あまり知られていないがDesktop版は無料！
- [Microsoft Power Query for Excel](https://www.microsoft.com/ja-jp/download/details.aspx?id=39379)
    - Excel内で動作するETLツール。PowerBIの前処理に
- [PowerPivot in Microsoft Excel アドインを開始する](https://support.office.com/ja-jp/article/PowerPivot-in-Microsoft-Excel-%E3%82%A2%E3%83%89%E3%82%A4%E3%83%B3%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%99%E3%82%8B-a891a66d-36e3-43fc-81e8-fc4798f39ea8)
    - Office2013以前のバージョンでのPowerPivotの有効化手順
- [Excel で分析ツールを読み込む](https://support.office.com/ja-jp/article/Excel-%e3%81%a7%e5%88%86%e6%9e%90%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%aa%ad%e3%81%bf%e8%be%bc%e3%82%80-6a63e598-cd6d-42e3-9317-6b40ba1a66b4?ui=ja-JP&rs=ja-JP&ad=JP)
    - Excelの分析ツールアドオンの有効化手順
- [Excel CSV I/O](https://forest.watch.impress.co.jp/library/software/excelcsv/)
    - CSVファイルのインポート・エクスポート機能を強化するExcel用アドイン
    - 文字コードの変換や、CSVの”セパレートなど
    - Google AnalyticsやBigQueryで出力したUTF8のCSVを読み込む時に便利


# その他
- [XMind](http://jp.xmind.net/)
    - マインドマップ作成ソフト
Jupyter Themes を変更し，ツールバーが消えた時に出す方法

# Jupyter Themes を変更したらツールバーが消えて困ったので，忘れないように設定の備忘録
ツールバーとノート名を表示するために -N -T をつける．

```shell-session
# select theme onedork & toggle toolbar ON and notebook name ON
jt -t onedork -N -T
```
https://github.com/dunovank/jupyter-themes
LPIC101対策メモ -1章:基本コマンドとファイルの操作-

LPIC101試験勉強のメモです。
１章の基本コマンドとファイルの操作について学び、
出てきた用語やコマンドを簡単にまとめています。

## シェルが扱う変数

- シェル変数
  - set:シェル変数の確認
  - 現在実行中のシェルだけで有効
- 環境変数
  - env:環境変数の確認
  - シェルから実行したコマンドにも引き継がれる

declare:シェル内の変数と関数を確認

![無題](https://camo.qiitausercontent.com/c45335da18fa480f100981728a7f3d46ee5617cd/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35303639302f64306136353834642d343538642d306630362d366665342d6133623334653331343135652e706e67)

おまけ

- シェル変数PS1:コマンドプロンプト
- シェル変数PS2:2次プロンプト

## コマンド集

### less
- テキストファイルを開くときは、`less`コマンドを使うといい
- LESSは環境変数でいろんな設定ができる
- [あなたの知らない less の世界](https://qiita.com/delphinus/items/b04752bb5b64e6cc4ea9)

### manコマンドの参照
- /usr/share/man:ディストリビューションのパッケージをインストールした場合
- /usr/local/share/man:インターネットからダウンロードしてインストールした場合

### mkdir
- -p:中間ディレクトリを同時に作る

### mv
- -f:同名ファイルが存在していても、強制的に上書きする

### cp
- -R:コピー元にディレクトリ階層をそのままコピーする
- -p:所有者、タイムスタンプ、アクセス権などの情報もコピーする

### lsattr
- ファイルの属性を表示する
- パーミッション以外

### la -la
- パーミッションも見れる

### cpio
- tarのように複数のファイルやディレクトリを１つにまとめる

### dd
- コピーの入出力にデバイスを指定する
- `dd if-image.iso of=/dev/sdb`
- if:inputfile, of:output file, 

### more
- 1画面に収まりきらないファイルを制御する
- spaceボタンを押すと、次の画面へ。
- 最後まで行くと閉じる

### less
- moreに同じく
- 最後までいっても閉じない
- オンラインマニュアルと操作方法は同じ

### file
- fileの種類を確認する

### tac
- ファイルの内容を最後から出力する

### tee
- 標準湯力から読み込んだデータを標準出力とファイルの両方に出力する

### grep
- -v:パターンに一致しない行を表示
- -n:行番号を表示する
- -l:パターンと一致するファイル名を表示
- -i:大文字と小文字を区別しない

### head
- 任意の行数を指定して、その内容を表示する
- デフォルトは１０行

### tail
- テキストファイルの末尾部分を表示する
- -f:ファイルの最終部分を読み続ける

### tr
- 標準入力になんらかのフォーマットの変換して、標準出力に表示する
- -d:文字群1で合致した文字を削除する

### sed
- 単語単位の変換や削除に用いる
- s/パターン/置換文字列/
  - 各行の最初に一致するパターン
- s/パターン/置換文字列/g
  - ファイル全体に適応される

### cut
- 特定部分のみ取り出す
- -c:指定された位置の各文字だけを表示
- -f:指定された各フィールドだけを表示する
- -d:-fと一緒に用いる。フィールドの区切り文字を指定

### wc
- ファイル内のバイト数、単語数、行数を表示する
- -l:行数だけ出力
- -c:バイト数だけ出力する
- -w:単語数だけを出力する

### od
- ファイルの内容を８進数で表示するコマンド
- -d:10進数
- -x:16進数

### expand
- ファイル内にあるタブをスペースに変換する
- -i:行長のタブのみスペースへ変換する
- t:置き換える桁数をしているする

### unexpand
- ファイル内のスペースをタブに変換する

### fmt
- 決められた桁数で１行の幅を指定できる

### split
- ファイルを決まった大きさに分割する
- デフォルト：1000行ずつ分割し、ファイルへ出力

## ファイル記述子

### プロセスが生成された時に以下の番号が用意される

- 0:標準入力
- 1:標準出力
- 2:標準エラー

### 標準エラー出力だけをファイルに出力とかもできる

```bash
$ ls a b 2> error
a
$ ls
error a
$ cat error
ls: cannot access b: そのようなファイルやディレクトリはありません
```

### 省略記号

- `1>`は標準出力の切り替えだが、`>`のみは１番が使用される
- `>>` 追記して保存する
- `&>`は標準出力と標準エラー出力の両方
- `<`標準入力から取り込む

## コマンド連続実行

### |(パイプ)
- コマンドの処理結果（標準出力）を次のコマンドの標準入力に渡す

### ;
- 終了ステータスに関わらず次を実行する

### &&
- &&前の終了ステータスが０なら次を実行する（成功した時に、終了ステータスが０になる）

### ||
- 終了ステータスが０以外なら、コマンドを実行する

## <<(ヒアドキュメント)

- シェルスクリプトの中で利用される

```
$ cat <<eos
>
```

↑のようにコマンドの後ろに指定すると、文字列が現れるまでの内容を出力する

## /dev/nullファイル

- 特殊なデバイスファイル
- ここに書かれたものは全て消去される（常にEOF）

## OSの改行コード

- Linux
  - \n
- Windows
  - \r\n
Androidで処理を指定した時間間隔ごとに実行するコードのフォーマットを記載します。

#Androidアプリ開発の初心者の方がタイトル記載の処理をすぐにコーディングできるように記録として残しておきます。

```java:MainActivity.java
(Handler型の変数) = new Handler();
(Runnable型の変数) = new Runnable(){
	public void run(){
		// ここに繰り返し実行したい処理を記述します。
		// aaaaa;
		// bbbbb;
		// ccccc;
		
		// 自分自身をもう一度呼び出す前に、今の処理を実行しているスレッドを削除します。
		// その都度メインスレッドとは別スレッドを作成してそこで動くため、実行後はそのスレッドの削除します。
		(Handler型の変数).removeCallbacks(this);  // thisはRunnable型変数のことです。
		// 実行間隔で指定した時間待機した後にもう一度run()メソッド内の処理を行います。
		(Handler型の変数).postDelayed(this, 実行間隔);  // thisはRunnable型変数のことです。
	}
};
// run()メソッドの初回呼び出しを行います。
// 2回目以降のメソッド呼び出しは、run()メソッド内部のpostDelayedの部分で行います。
(Handler型の変数).post(Runnable型の変数);
```
Solarizedでmocha実行時にアウトプットが見にくい問題を解決する


[Solarized](http://ethanschoonover.com/solarized)という配色テーマが好きで，ターミナル，Vim，Xcode全部Solarizedにしています😆

なのですが，node.jsのテストフレームワークである[mocha](https://www.npmjs.com/package/mocha)を使うと，ターミナルのアウトプットに見えなく（とても見にくく）なる文字が発生します．

![mocha-invisible.png](https://qiita-image-store.s3.amazonaws.com/0/35592/4196f2b8-2d81-565a-0ce7-8ff016870b41.png "mocha-invisible.png")

これについて，以下のように原因を特定して修正のPRを送っている方がいましたが，マージはされていないようでした😢

* [mocha でテストを実行すると背景色によってはスタックトレースが見えない · Issue #29 · clear-code/statistics](https://github.com/clear-code/statistics/issues/29)
* [Print dim text with dim color without concrete color by piroor · Pull Request #2946 · mochajs/mocha](https://github.com/mochajs/mocha/pull/2946)
* [Unreadable text problem on some color scheme (especially Solarized Dark) · Issue #2945 · mochajs/mocha](https://github.com/mochajs/mocha/issues/2945)

そこで，上のPRの内容をローカルの環境に適用するワンライナーを作りました（`package.json`のあるディレクトリで実行します）．

```bash
$ sed -i '.bak' -E "/^exports.colors = {$/,/^};$/ s/(^ +['a-zA-Z0-9 ]+): 90/\1: 2/g" ./node_modules/mocha/lib/reporters/base.js
```

これを当てるとmochaの実行結果が次のようになります．

![mocha-visible.png](https://qiita-image-store.s3.amazonaws.com/0/35592/c3e9eeb0-7707-e198-4c6e-9135e9f933be.png "mocha-visible.png")

見えなかった文字が見えるようになりました！

今後公式にマージされるとうれしいんですけどね・・・．

## 環境

* macOS 10.12.6
* node v5.11
* mocha v4.0.1


## やっていることと注意点

* mochaの`lib/reporters/base.js`のファイル中`exports.colors`で定義されているカラーコードのうち，90のものを2に置き換えています
* 元の`base.js`は`base.js.bak`にバックアップされています
* パターンマッチしているだけなので，将来のmochaのバージョンではうまく置き換えられなくなる可能性はあります

## 参考
	
[Macの（BSD版）sed での上書き保存 - Qiita](https://qiita.com/catfist/items/1156ae0c7875f61417ee)
Laravelを使った開発での用語集

# 概要
プログラムを勉強していると分からない用語によく遭遇します。自分の備忘録を兼ねて、調べた用語をここにまとめます。

# 用語集
- 遅延読み込み
    - 実際にオブジェクトが必要とされたときに後から初期化を行うソフトウェアデザインパターンの一つ
    - サービス・プロバイダを使ってコマンド登録を行う場合は、deferをtrueにして遅延読み込みを行うようにする
    - https://gist.github.com/nazo/116f7ff2401d231c2619
コマンドプロンプトでDドライブに移動する

cdコマンドを使って以下のようにDドライブに移動しようとしてました。

```
C:\Users\ユーザー名>cd D:\temp

C:\Users\ユーザー名>
```

移動できない…
なぜ…と思って調べたら、Dドライブに移動するときはちょっと違うみたいでした。

↓↓↓

```
C:\Users\ユーザー名>D:

D:\>
```

移動できました。

別のやり方としては以下のようにすると移動できるらしいんですね。

>　Dドライブに移動する  
http://nemoplus.hateblo.jp/entry/20090130/1233321806

- dスイッチ

```
C:\Users\ユーザー名>cd /d D:

D:\>
```

- pushdコマンド

popdで元のフォルダに戻れるらしいです。便利～

```
C:\Users\ユーザー名>pushd D:\

D:\>

D:\>popd

C:\Users\ユーザー名>
```
【Rails】画面上のボタンをクリックしてファイルをDLさせる際の注意点

# はじめに
Railsで画面上のボタンをクリックしてファイルをダウンロードさせる機能を実装していた際に気がついたことがあるので備忘録として記録しておきます。

# 問題点

`send_file`, `send_data`を実行するアクションの呼び出しに`link_to`を利用すると、ブラウザ上でリンクをクリックした際にリクエストが2重に送信される。

# 解決方法

アクションの呼び出しに`link_to`ではなく`button_to`を利用する。

# 詳細

## ルーティング、コントローラ

`http://xxx.xxx.xxx.xxx/download`
にリクエストが来るとアプリ内で生成したファイルを渡す実装にしてました。

```ruby:routes.rb
get  'download'  => 'get#download'
```

```ruby:get_controller.rb
class GetController < ApplicationController

  def download
    send_data 'hogehoge',
              :filename => 'hoge.txt',
              :type => 'text/plain',
              :disposition => 'attachment'
  end

end
```

## 修正前

### ビュー

downloadアクションの呼び出しに`link_to`を利用して、CSS(bootstrap)で見た目をボタンにしてました。

```html+erb:xxx.html.erb
<%= link_to 'download', download_path, class: 'btn btn-info' %>
```

```html:生成されたHTML
<a class="btn btn-info" href="/download">download</a>
```

![button.png](https://qiita-image-store.s3.amazonaws.com/0/141934/27ca172c-969f-555b-a674-58689a68b2f6.png)

### ボタンクリック時の動作

ブラウザ上でボタンをクリックするとファイルがダウンロードされるため、正常に動作してるように見えますが、pumaのログを確認するとリクエストが2重に出力されてました。

```shell-session
Started GET "/download" for 127.0.0.1 at 2017-10-28 21:54:27 +0900
Processing by GetController#download as HTML
  Rendering text template
  Rendered text template (0.0ms)
Sent data hoge.txt (0.5ms)
Completed 200 OK in 1ms (Views: 0.3ms | ActiveRecord: 0.0ms)


Started GET "/download" for 127.0.0.1 at 2017-10-28 21:54:27 +0900
Processing by GetController#download as HTML
  Rendering text template
  Rendered text template (0.0ms)
Sent data hoge.txt (0.5ms)
Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.0ms)
```

## 修正後

### ビュー

アクションの呼び出しに`button_to`を利用するように修正しました。

```html+erb:xxx.html.erb
<%= button_to 'download', download_path, method: :get, class: 'btn btn-info' %>
```

```html:生成されたHTML
<form class="button_to" method="get" action="/download">
  <input class="btn btn-info" type="submit" value="download" />
</form>
```

![button.png](https://qiita-image-store.s3.amazonaws.com/0/141934/27ca172c-969f-555b-a674-58689a68b2f6.png)

### ボタンクリック時の動作

pumaのログを確認するとリクエストが1回だけ出力されるようになりました。

```
Started GET "/download" for 127.0.0.1 at 2017-10-28 22:02:23 +0900
Processing by GetController#download as HTML
  Rendering text template
  Rendered text template (0.0ms)
Sent data hoge.txt (0.7ms)
Completed 200 OK in 2ms (Views: 0.5ms | ActiveRecord: 0.0ms)
```
Riot Pug Sass Typescriptで楽にWebページ・アプリを開発 (概要編)

## 前提
bashが動く && 動かせる
node v8.+ が動く(nodebrew推奨)
nodeやnodebrewは[こちら](https://qiita.com/sinmetal/items/154e81823f386279b33c)の記事が非常に参考になります。

## 対象
1. 最近の開発環境に触れてみたい方
2. 直接FTPクライアントでサーバー側のファイルをいじってる方
3. ある程度Webの知識がついてきて、更に何かしたい方
4. タイトルの開発環境が欲しい方

## 概要
皆様、現状の開発環境に満足しておられますでしょうか。Webというものは派閥が多く、Angularだ、Reactだなんて言われているご時世ですが、そういったナウいものに手を出すには些か学習コストがかさむことが踏ん切りを邪魔してしまいがちです。

新しくて、便利なものを使っていきたいけど、難しいこと抜きでお願いしますって方は意外と多いのではありませんでしょうか？

そんな方々に朗報！！！！

1. タグのカッコや綴じタグの呪縛から開放してくれるPug
2. 同上をCSSに持ち込み、変数や関数、importが使えるSass
3. 学習コストが低く、簡潔な書き回しができ、タグを自作できるRiot
4. javascriptに型解決を与え、型からドキュメント生成できるTypeScript
5. ページ上で必要なモジュールを統合してくれるWebpack
6. コンパイル後のソースでエラーが起こっても安心SourceMap

以上の画期的かつ最新の開発環境がなんと！

1. プロジェクトフォルダ構築済み
2. ビルド設定構築済み

**以上の状態の開発環境がダウンロードしてコマンド一発で手に入ります！！**

実用に耐えれるかどうかは好みや私の技術レベルと相談ですが、新しい開発環境を *とりあえず試してみたい！！* って方にはちょうど良いと思います。

## 何が便利か？
長くなるため記事を分けます。
[こちら](https://qiita.com/narumi18wa/items/2aab618bce37ba82ae60)を御覧ください。

## リポジトリ
GitHub上に公開してあります。
https://github.com/narumi18wa/riot-pug-sass-ts-proj

MITとなっておりますが、このプロジェクトに帰属するものに限り、好き勝手してもらって構いません。
というのも、好みでやっているため、PRをマージする可能性が低いです。
この辺の開発があまり活発ではなく、自作するに至ったので・・・。

## 使い方
### 1. README.mdを軽く読んで下さい
ここに書くとバージョン違いが発生する可能性があるので、本物を読んで下さい。
[こちら](https://github.com/narumi18wa/riot-pug-sass-ts-proj/blob/master/README.md)です。そんなに長くならないように頑張ってます。

### 2. 書いてあるとおりです
プロジェクトリポジトリをzipでダウンロード、またはcloneし、 `./install.sh` を叩く

### 3. とりあえずビルドしてみよう
bashで `src/` (package.jsonがある場所) に入り、 `npm run build` します。
そうすると、プロジェクトルート直下に `dist/` が生成され、 `index.html` ができます。
ブラウザなどで確認すると、 `src/` がビルドされていることが確認できます。

### 4. 推奨開発環境
#### Atom
以下パッケージ
platform-ide-terminal
atom-ide-ui
ide-typescript
riot-tag
language-pug

### 5. 書き方のお作法など
長くなるため記事を分けます。
こちらを御覧ください。

### 6. ビルドの中身について
長くなるため記事を分けます。
こちらを御覧ください。
リストや配列を生成する際、すべての要素を特定の値で初期化したい


最近はC#に凝っています。LINQと`var`が最高すぎて、Javaにはもどれない(´・ω・｀)

__リストや配列を生成する際、すべての要素を特定の値で初期化したい__という場合、プログラミング言語の種類によっては専用のコンストラクタが用意されているものもありますが、C#では`Enumerable#Repaeat`を利用する方法がよさそうです。

```csharp
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var list = Enumerable.Repeat("a", 20).ToList();

        var str = "[" + string.Join(",", list) + "]";
        Console.WriteLine(str);
        // => [a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a]
    }
}
```

注意すべきは__第1引数の値が要素ごとに複製されない__ということです。`int`や`string`のようなimmutableなクラスでは問題ありませんが、この方法によりmutableなオブジェクトで配列やリストを初期化したいという場合には気を付ける必要があります。以下のサンプルコードでは、mutableなクラスのうち、もっとも代表的なもののひとつ`System.Collections.Generic.List`を例として、この方法が想定通り動作しないことを示しています。

```csharp
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        var matrix = Enumerable.Repeat(new List<string>() { "a", "a" }, 2).ToList();
        matrix[0][0] = "b";

        var str = matrix.Aggregate("", (sum, row) => sum + "[" + string.Join(",", row) + "]");
        Console.WriteLine(str);
        // 想定していた値: [b,a][a,a]
        // 実際の値: [b,a][b,a]
        // ===> new List<string>() { "a", "a" }が複製されていないことが確認できます。
    }
}
```

ちなみにこのサンプルコードを想定通りに機能させる場合は、以下のような初期化方法、つまり`Repeat`ではなく`Range`と`Select`を組み合わせる方法を採用すべきです。

```csharp
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        var matrix = Enumerable.Range(0, 2).Select((x) => new List<string>() { "a", "a" }).ToList();
        matrix[0][0] = "b";


        var str = matrix.Aggregate("", (sum, row) => sum + "[" + string.Join(",", row) + "]");
        Console.WriteLine(str);
        // 想定していた値 => [b,a][a,a]
        // 実際の値       => [b,a][a,a]
    }
}
```
[macOS][iOS]CloudKitを使った日記アプリで写真をどう扱うか

<p>日記アプリだが、投稿された写真をどこに保存するかが課題だ。CloudKitのDatabase storageの無料枠は100MB。だが、用途が異なり利用できないと決めつけていたAsset storegeが利用できることに気がついた。</p>

<p>アセットの利用は簡単だ。</p>

<pre><code>database.fetch(withRecordID: diaryRecordID, completionHandler: { (diaryRecord, error) in
    print(#function)
    if error != nil {
        print(error)
    }
    else {
        let asset = CKAsset(fileURL: fileUrl)
        diaryRecord!["photo"] = asset
        
        database.save(diaryRecord!, completionHandler: { (record, error) in
            if error != nil {
                print(error)
            }
            else {
                print(record)
            }
        })
    }
})
</code></pre>

<p>Assetフィールドにファイルを設定する。</p>

<p>レコードを保存するとファイルがアップロードされる。</p>

<p>Assetを操作するとダウンロードされる。</p>

<p>これで写真の投稿はなんとかなるのが分かったが、新たな課題が。無料枠を超えた場合、課金されるが、どうやら請求は開発者宛らしい。定額課金を考えないといけなさそうだが、利用制限の機能の実装が必要そうだ。iCloudの利用も検討することにする。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/KeepADiary">https://github.com/murakami/KeepADiary</a> - GitHub<br />

関連情報
<a href="https://www.slideshare.net/yukiomurakami/cloud-kit-81246308">CloudKitを使った日記アプリで写真をどう扱うか</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
ディレクトリ内ファイル差分

findで取得して、一応ソート。ディレクトリの文字列部分を削る。あとは、oldの方にしかないものを抽出

```
comm -13 <(find new/pdf -type f |sort| sed -e 's/new//g') <(find old/pdf -type f | sort | sed -e 's/old//g')
```
快眠ハーブティーの効果は本当にあるのか、ベイズ統計で調べてみた

# はじめに
「最近眠りが浅いような気がする」的なことを友人に相談したら、この前**「幸せに眠れるティー」**なるものをもらったのでその効果を検証してみました。Qiitaらしくはないかもしれませんが、まぁお付き合い下さい。
![s_P_20170926_001558.jpg](https://qiita-image-store.s3.amazonaws.com/0/176789/5951eef0-d95b-0c83-5e81-5263c0654999.jpeg)

# 実験手順
もらったティーバックは全部で８個あったので、ハーブティーを飲んだ時と飲まない時合計１６日間の睡眠を測定してその効果を検証しました。
![s_P_20171027_233536.jpg](https://qiita-image-store.s3.amazonaws.com/0/176789/216e2e3a-c6e0-0ece-71ea-0b3d12e9a2f2.jpeg)

睡眠の測定には[UP by Jawbone](https://jawbone.com/)（つい先日破産してしまったようですが）を使いました。これを寝る前に付けると睡眠時間、入眠までに要した時間、覚醒時間、目覚めた回数、深い眠りの時間、浅い眠りの時間を専用のアプリで返してくれます。覚醒時間というのは眠りに入ったものの中途覚醒状態と判定された時間です。今回検証したいのが「眠りが浅い」現状をハーブティーで改善できるか、なので睡眠効率を

```math
睡眠効率=\frac{睡眠時間ー覚醒時間}{睡眠時間}
```
と定義して、これがティーを飲んだ時と飲まない時で変化するかを見ていきます。
今回は対象期間を１６日で設定したのでアプリからのデータは手作業でcsvファイルに入力しました。
以前jawboneから詳細な睡眠データを取り出す[ツール](https://github.com/Hiroyuki1993/Jawbone-Detail)も開発したことがあったのですが、今回はマクロなデータをとりたかったのでこのような形にしました。

# 解析手順
２条件の比較なので普通にt検定してもいいのですが、自分の勉強も兼ねて今回はあえてベイズ統計で仮説を検証することにしました。使用したツールはpystanでモデルコードは以下のとおりです。

```stan
data {
    int<lower=0> n1;
    int<lower=0> n2;
    vector[n1] x;
    vector[n2] y;
}
parameters{
    real mu_x;
    real mu_y;
    real<lower=0> sigma_x;
    real<lower=0> sigma_y;
}
transformed parameters{

}
model {
    x ~ normal(mu_x, sigma_x);
    y ~ normal(mu_y, sigma_y);
}
generated quantities {
    real diff;
    real u;
    diff = mu_x - mu_y;
    u = diff > 0 ? 1:0;
}
```
具体的には各群に正規分布を仮定して平均を推定、その後、x>yという仮説を生成量uで評価しています。
モデルの構造は関西学院大学の清水先生の[「Stan超初心者入門」](https://www.slideshare.net/simizu706/stan-62042940)を参考にしました。

# 結果
まず最初にお詫びがあります。飲まない条件は８日間コンプリートしたのですが、飲む条件は８日間のうち３日間睡眠トラッカーを付け忘れてしまいました。なのでデータは全部で１３サンプル、しかも条件ごとにデータの偏りがあります。以下、ご注意下さい。
![df.png](https://qiita-image-store.s3.amazonaws.com/0/176789/e8a3bc74-bcbd-a6ce-f8dc-432fd7a76062.png)

まずは記述統計です。
**睡眠効率**
![slef.png](https://qiita-image-store.s3.amazonaws.com/0/176789/6a68e665-2030-6674-9cdf-5269c5ed50a8.png)
**深い睡眠の割合**
![deepsl.png](https://qiita-image-store.s3.amazonaws.com/0/176789/46aabf84-adaa-8590-1af0-358cb1b28d88.png)

次に睡眠効率についてstanモデルによる検定の結果です。![stan.png](https://qiita-image-store.s3.amazonaws.com/0/176789/76ddc398-015f-c48a-55f3-8c519df7e26b.png)

なんと幸せに眠れるハーブティーを飲んだ時のほうが飲まない時よりも睡眠効率が高い可能性が高いという結果が出ました（p<.01）。あまりにも結果がきれいなので調べた自分が一番驚いています。

# 感想
今回は単にベイズ統計の練習という意味合いでやってみたのですが、幸せに眠れるハーブティー、まじで効果があるかもしれないですね。興味のある方は試してみてはいかがでしょうか。
今回の分析に使ったコードは[Gist](https://gist.github.com/Hiroyuki1993/019a1e72e9e8e51e49ec5d4faab96b61)に公開しています。こちらもよければご覧ください。
AndroidのMenuをFragmentごとに変える方法

ActivityにTabLayoutを使って複数のFragmentを表示する場合ってありますよね。
[ディズニー待ち時間](https://play.google.com/store/apps/details?id=com.furusin.www.volunteer.disney.disneywaittime)でもそのように実装しています。

「このFragmentが見えているときはこのOptionMenuだけど、このFragmentのときはこのOptionMenuにしたい！」と思ったりもします。

そのような時の対処方法です。

# 普通にActivityでOptionMenuを作る方法

普通にActivityで書くとこうですね。

```java:MainActivity.java
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.option_menu, menu);//Menu Resource, Menu
        return true;
    }
```

何かの動作の時（例えば`onTabSelected`など）に[invalidateOptionsMenu](https://developer.android.com/reference/android/app/Activity.html#invalidateOptionsMenu())を呼んで再描画してもできますが、もっと簡単にできます

# FragmentごとにOptionMenuを変えたい場合
上記の`onCreateOptionsMenu()`をそれぞれのFragmentでやればOKです。

```java:FirstFragment.java
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.option_menu_first, menu);
    }
```

```java:SecondFragment.java
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.option_menu_second, menu);
    }
```

```xml:option_menu_first.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_first_a"
        android:title="@string/first_a"
        />
    <item
        android:id="@+id/menu_first_b"
        android:title="@string/first_b"/>
</menu>
```

```xml:option_menu_second.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_second_a"
        android:title="@string/second_a"
        />
    <item
        android:id="@+id/menu_second_b"
        android:title="@string/second_b"/>
</menu>
```

以上です
gem gretel をslimを使って、詰まったちまったエラー

# gem gretel とは
- パンくずを作成してくれる便利なgemです。

> パンくず: 利用者がサイト内で現在に位置を見失わないようにするためのナビゲーションのようなものです。
(例)
<img width="364" alt="スクリーンショット 2017-10-27 12.54.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/194863/302859a2-0d01-fe2e-e19f-f6beb93ecabc.png">

**今回導入方法などは割愛させていただきます。
下記記事などを参考に、進めてみてください！**

[Ruby on Rails – パンくずリストを簡単に作成できるgem gretel](https://miningoo.com/1378)
[Ruby on Railsでパンくずリストを表示するGem gretelの使い方メモ](https://www.virment.com/rails_gretel_for_breadcrumb/) 


# 今回起きた事象
下記ファイルでパンくずを読み込む。

```
application.html.slim内

= breadcrumbs

```

```
index.html.slim内

- breadcrumb :watasan_campaign
```

すると、要素が表示するようになってしまう.......

<img width="936" alt="スクリーンショット 2017-10-27 11.58.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/194863/1de9cf07-617b-e104-6c7f-1adffff76884.png">

# 原因

リンクをつなげている　**＞**　の文字にエスケープが行われている。


> エスケープ: HTML文の中では「<」「>」>「&」「"」といった文字は特別な意味を持つため、HTMLタグを含む文字列をそのまま出力してしまうと違う意味になってしまう。したがって、特別の意味を持つ文字が含まれる文字列を文字列として出力されたい時には、特別な意味を持つ文字をエスケープした上で出力する必要があります

したがって
安全な文字列であるとして、特殊な文字もそのまま出力させる。
つまりエスケープさせないように表示させる必要がある。

```
application.html.slim

== breadcrumbs

```
`==`を使って表示させること！！
slimのREADMEに書いてありました。
https://github.com/slim-template/slim#output-without-html-escaping-

# 参考
[gem lassebunk/gretel](https://github.com/slim-template/slim#output-without-html-escaping-)
[gem slim-template/slim](https://github.com/slim-template/slim#output-without-html-escaping-)
[Ruby on Rails – パンくずリストを簡単に作成できるgem gretel](https://miningoo.com/1378)
[Ruby on Railsでパンくずリストを表示するGem gretelの使い方メモ](https://www.virment.com/rails_gretel_for_breadcrumb/)
AWSのリソースのIDをちゃちゃっと持ってくるシェル

# こんばんは
神谷です。投稿は３回め。
ここまで初心者レベルの投稿ばかりしてきましたが、今回も初心者っぽいやつ。
まぁAWSのお仕事ってほぼaws cliとExcel VBAマクロで作業ですおね。
ほとんど自動化出来るお仕事なんですから、ほとんど自動化しちゃいましょう。

# インフラのお仕事でよくやる「IDのリスト化」
サブネット名/サブネットID
とか
セキュリティグループ名/セキュリティグループID
とかのリスト、よく作りますよね。僕なんかそういうの自動化でやらなきゃバカだと思うんですけど、周りの人、ほとんど根性でやってるんですよね。人力なんて遅いしミスるしいい事一つも無いよ。
という事で、パパっとシェルを作ってあげたので、公開してみます。
自分用には、もちょっと便利な機能とか付けてますが、作った人じゃないと判らない仕組みは公開しない方がいいっしょ。

## サブネットIDリスト化シェル
```
#!/bin/bash
sids=`aws ec2 describe-subnets --query 'Subnets[*].Tags[?Key==\`Name\`].Value' --output text`

for sid in ${sids[@]}; do
        echo ${sid} "   " `aws ec2 describe-subnets --filters Name=tag-value,Values=${sid} --query 'Subnets[*].SubnetId' --output text`
done
```
結果
```
SUBNETA sub-hogehoge1
SUBNETB sub-hogehoge2
```
## セキュリティグループIDリスト化シェル
```
#!/bin/bash
sgs=`aws ec2 describe-security-groups --query 'SecurityGroups[*].Tags[?Key==\`Name\`].Value' --output text`

for sg in ${sgs[@]}; do
        echo ${sg} "    " `aws ec2 describe-security-groups --filters Name=tag-value,Values=${sg} --query 'SecurityGroups[*].GroupId' --output text`
done
```
結果
```
SecurityGroupA sg-hogehoge1
SecurityGroupB sg-hogehoge2
SecurityGroupC sg-hogehoge3
```
## AMI-IDリスト化シェル
```
aws ec2 describe-images --owner (AWSアカウントID) --query 'Images[].[Name,ImageId]' --output text
```
……と。他にもリスト化すべき何かあるかもだけど、上のを真似て自分でちゃちゃっと作ってみて欲しい。
リクエストしてくれたら作ってもいい。責任は負わないけれど。
# 特定のリソースだけをリスト化しよう
特定のサブネット以外のサブネットIDは取りたくないとか、そういう事あります。
例えば、AWS上ではセキュリティグループ100個ぐらいあるんだけど、今回の仕事ではうち5個だけをドキュメント化します、とか。
まず、100個のうち、どれをドキュメント化するのかはエクセルで来るでしょう。それをテキストファイルに入れましょう。コピペでちゃちゃっとね。
subnetid-list.txt
```
subnetNameAWS01Web1　
subnetNameAWS02Web2　
subnetNameAWS04Web1　
subnetNameAWS10Web1　
subnetNameAWS11Web4　
```
な、すんげぇ紛らわしい。コレを１つ１つ手で指定して値を取得してコピペを繰り返すヤツは絶対に「間違えるヤツ」だ。パっと見て「自動化しなきゃダメな作業だな」って思いましょうよ。ねぇ。
実際、上のシェルをちょっと改造すれば、特定のリストだけをリスト化できます。
## サブネットIDリスト化シェル(特定のだけバージョン)
```
#!/bin/bash
sids=`cat subnetid-list.txt`

for sid in ${sids[@]}; do
        echo ${sid} "   " `aws ec2 describe-subnets --filters Name=tag-value,Values=${sid} --query 'Subnets[*].SubnetId' --output text`
done
```
結果
```
subnetNameAWS01Web1　sub-hogehoge1
subnetNameAWS02Web2　sub-hogehoge2
subnetNameAWS04Web1　sub-hogehoge3
subnetNameAWS10Web1　sub-hogehoge4
subnetNameAWS11Web4　sub-hogehoge5
```
# 最後に
上のシェル、改良すべき点はまだまだいっぱいあります。
凝りに凝りに凝りまくれます。いくらでも。最終的に、実行するだけで、仕様書に「値をコピー」するだけで全部ドキュメントできちゃうぐらい凝ったシェルも作れますよー、ええ。Rubyとかエクセル触れるので、PowerShell+Rubyとか使えば、シェル実行するだけで勝手にパラメータシート全部作っちゃうぐらい出来ます。
ただ、フツーはやりません。作った方が早いから。
サーバ200台以上分のパラメータシートを作れって言われたら、まぁ、プログラム作る方が楽だから、そういうの作っちゃうかもですね。
どっからどこまで自動化して、どっからどこまで根性でやるのか。まぁ、プログラム組む速さによりますね。
(自分は、多少、プログラムの方が時間かかりそうでも、正確性を期してシェル化する事が多いですが)
pacemaker+heartbeat環境においてVIPの役割ごとに対するMackerelの監視

# pacemaker+heartbeat環境においてVIPの役割ごとに対するMackerelの監視

## 前提
1.サーバが２台構成（サーバA、サーバB）でそれぞれが別の役割のVIPを保持している場合
2.サーバAはVIP：xxx.xxx.xxx.xxxが設定、サーバBはVIP：yyy.yyy.yyy.yyyが設定されている場合
3.MackerelでサーバA、Bで別々の監視をしたい場合
4.mackerel-agent.confを統一したい場合

## 手順
1.VIP値を取得する（参考）

```sh:get_vip.sh
VIP=`grep xxx-instance_attributes-ip /var/lib/heartbeat/crm/cib.xml |cut -d '"' -f6`
if [ -z "${VIP}" ]; then
        echo "0.0.0.0" # ip aで取得されないような文字列ならなんでも良いです
fi
echo ${VIP}
```

などとしてVIP値を取得するスクリプトなどを作成する。

上記の場合は下記のような設定内容を想定しています。

```xml:cib.xml
<nvpair id="xxx-instance_attributes-ip" name="ip" value="xxx.xxx.xxx.xxx"/>
<nvpair id="yyy-instance_attributes-ip" name="ip" value="yyy.yyy.yyy.yyy"/>
```

もっとスマートな方法はあると思います。


2.Mackerelの設定をする（サーバAのVIP：xxx.xxx.xxx.xxxを監視したい場合）

```conf:/etc/mackerel-agent.conf
include = "/etc/mackerel-agent/conf.d/*.conf"
```

```conf:/etc/mackerel-agent/conf.d/check_httpd.conf
[plugin.checks.check_httpd]
command = '(ip a | fgrep -q `get_vip.sh`; exit $(( $? ^ 1 )) ) || check-procs --pattern httpd'
```

上記はサーバAではhttpdプロセスが起動しており、サーバBではhttpdプロセスが起動していない場合に同一の設定で監視するための設定となります。
あくまでご参考までに。

以上です。
HashMapから値を取出すときの速度について

#速度について確認してみた
参考：https://qiita.com/kei2100/items/0ce97733c92fdcb9c5a9

HashMapから値をValueを取出す時に、これまでkeySet()を使ていたのですが、entrySet()を用いた方が速度が速いとの事なので確認してみました。

```java:java
import java.util.HashMap;
import java.util.Map.Entry;

public class HashmapentrySetAndkeySet {
	public static void main(String[] args) {

		HashMap<Integer,Integer> map = new HashMap<>();

		//Mapの作成
		for(int i=0; i<1000; i++){
			map.put(i,i);
		}

		//二通りで出力してみる
		//keySet()を用いる方法
		long start1 = System.currentTimeMillis();
		for(Integer key : map.keySet()){
			Integer value = map.get(key);
			//System.out.println(value);
		}
		long end1 = System.currentTimeMillis();
		System.out.println((end1-start1)+"ms");

		//entrySet()を用いる方法
		long start2 = System.currentTimeMillis();
		for(Entry<Integer, Integer> entry : map.entrySet()){
			Integer value = entry.getValue();
			//System.out.println(value);
		}
		long end2 = System.currentTimeMillis();
		System.out.println((end2-start2)+"ms");
	}
}

```

1000個のHashMapを代入するのにkeySet()を用いる方法とentrySet()を用いる方法では、私のPCだと、だいたいentrySet()を用いた方が1msほど早くなりました。
標準出力をしたりするとその差は広がりました。

難点としては、読みづらいことでしょうか。
今後こちらの方法でも書けるようにメモしておきます。
python3でslackbotの作成(その3:リプライ編)

#前回
[その2:python実行編](https://qiita.com/thimi0412/items/88b9a0750dfc4b0ae032)
前回の投稿から時間が空いてしまいました。人(￣ω￣;) ｽﾏﾇ
前回はbotがとりあえず返信できるところまで行いました。
今回は特定のワードで指定された文言を返すようにしましょう。

#ディレクトリの構成
slack_bot/
 ├─ plugins/     <font color="Red">NEW!</font>
 │   ├─ \_\_init\_\_.py
 │   ├─ bot_listen.py
 │   └─ bot_mention.py
 ├─ run.py
 └─ slackbot_settings.py

pluginsのフォルダに上記のように3つのファイルを作成しましょう。

\_\_init\_\_.pyはプラグインを読み込ませるだけなので**<font color="Red">空のファイルで大丈夫です。</font>**

#プラグインの追加
```python3:slackbot_setting.py
# -*- coding:utf-8 -*-

API_TOKEN = 'xxxxxxxxxxxxxxxxxxxxx'

default_reply = 'ナニイッテルカワワケワカラン'


PLUGINS = [
    'plugins',
]

```

slackbot_setting.pyにPLUGINSを追記しましょう

#メンションを送ってみる
```python3:bot_mention.py
from slackbot.bot import respond_to

@respond_to('こんにちは')
def hello(message):
    message.reply('どうもこんにちは！')

```
"こんにちは"というメンションが送られてきたら"どうもこんにちは！"と返信するようにになっています。非常に簡単ですね。

```
python3 run.py
```
くどいようですがrun.pyを実行している状態でメンションを送ってみましょう。
<img width="301" alt="スクリーンショット 2017-10-28 18.56.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/11c9a495-b69f-30c1-6520-67793bbee986.png">
botの名前が変わっているのは気にしないでください。∑d(･ω･*)

[リファレンス](https://github.com/lins05/slackbot)を見るとmessageには以下の関数があるようです。

| 関数名 | 内容 |
|:-:|:-:|
| message.reply()  | 引数をリプライ内容として返信  |
| message.send()  | 引数をチャンネルに発言  |
| message.react()  | 引数リアクションをコメントに行う  |

#今回はここまで
次回はチャンネルで発言した際、botが発言してくれる(message.send())を使って行きます。
なるべく早く次の記事に取り掛かります。ε≡≡ﾍ( ﾟДﾟ)ﾉ急げー！
InstrumentationTestでRxIdlerを使おうとしたがダメだった

導入しようとしたけどうまくいかなかった話です。

環境

```
'com.android.tools.build:gradle:3.0.0'
'com.android.support.test.espresso:espresso-core:3.0.1'
'com.android.support.test:runner:1.0.1'
'com.squareup.rx.idler:rx1-idler:0.9.0'
```

## RxIdler

[RxIdler](https://github.com/square/RxIdler)は、Espressoの`IdlingResource`を使って、RxJavaの`Scheduler`をいい感じに待ってくれるライブラリです。

`RxJavaPlugins`を利用することで、プロダクションコードに変更を加えずに導入ができます。

## 導入

`README`にある通り、`TestRunner`を自作します。

```kotlin
class MyTestRunner : AndroidJUnitRunner() {
    override fun onStart() {
        RxJavaPlugins.getInstance().registerSchedulersHook(RxIdler.hooks())
        super.onStart()
    }
}
```

これだけで良いはずが・・・
Pre-Lollipopでは、`NoClassDefFound`でテストが失敗しました。

## MultiDex対応

とりあえず、[Test multidex apps](https://developer.android.com/studio/build/multidex.html#testing)の通りやってみます。

だが、これでも変わらずだったので、[Declare classes required in the primary DEX file](https://developer.android.com/studio/build/multidex.html#keep)にある`multiDexKeepProguard`を使います。
これに記述したクラスは、最初に読み込まれるDEXに含まれるようになります。

```gradle:app/build.gradle
android {
    buildTypes {
        release {
            multiDexKeepProguard 'multidex-config.pro'
            ...
        }
    }
}
```

```:app/multidex-config.pro
-keep class rx.functions.Action0
-keep class rx.plugins.RxJavaPlugins
-keep class com.squareup.rx.idler.RxIdler
```

これで`NoClassDefFound`は発生しなくなりました。

## Issue

全体のテストを実施していたら、[このIssue](https://github.com/square/RxIdler/issues/6)を踏みました。

## まとめ

他にも

- [Proposal to add RxIdlingResource for Espresso testing](https://github.com/ReactiveX/RxAndroid/issues/149#issuecomment-306374271)の例を使う
- `AsyncTask`の`Executor`を使う
- `Scheduler`を自作する

とかやってみましたが、どれもうまくは行かなかった。

根本が間違ってる可能性もありますが、時間的に諦めることにしました。
VimGolf 解説 Space out the alphabet


https://www.vimgolf.com/



解説する問題はこれ: https://www.vimgolf.com/challenges/56fb2e75ccffcc0009026473
興味ある方は是非、下の解説を見ずに挑戦してみてください。


```:start
abcde
fghij
klmno
pqrst
uvwxyz
```

```:goal
a   b   c   d   e
f   g   h   i   j
k   l   m   n   o
p   q   r   s   t
u   v   w   x   y   z
```


---
以下解説

---



# 解答(現状最短解)
15 ストローク
```<:%s/./ &/g<CR>.ZZ```


# 解説
この15文字に詰まっているテクニックを解説する。

## `:%s/./ &/g`
`:s` [置換](http://vim-jp.org/vimdoc-ja/change.html#:substitute): `[range]s[ubstitute]/{pattern}/{string}/[flags] [count]`
* `%`: すべての行
* `.`: 任意の一文字
* `&`: ヒットした pattern 全部 `\0` と同じ
* `g`: 行内すべて

この時点

```:
a b c d e
f g h i j 
k l m n o
p q r s t
u v w x y z
```

## `<:%s`
`<{motion}` : {motion} 行を 'shiftwidth' 1個分左にずらす。
`<:%`: すべての行に command line mode 実行し、最後に対象行を 1個分左にずらす。

ここがポイントで <{motion} を使っているため**この後 command line mode の実行を single-repeat できる**。

## `.`
[single-repeat](http://vim-jp.org/vimdoc-ja/repeat.html#single-repeat) する。前述のとおり。

## `ZZ`
保存して終了。


# 終わり


他の問題を解説したものも紹介しておきます。
https://qiita.com/elzup/items/5b6992d21408ba35a3b4
GCP上でElasticsearchクラスタを作ろうとしたらはまる

<img width="367" alt="スクリーンショット_2017-10-28_19_24_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/97287/62e9f6a4-2db3-978f-80c8-89a934a94bea.png">

```
$ curl localhost:9200/_nodes/transport?pretty=1
```

何も考えずに立ち上げるとローカルループバックアドレスになってる。

https://cloud.google.com/compute/docs/vpc/advanced-vpc?hl=ja

「インスタンスは 255.255.255.255 のマスクを持つ IP で構成されているため、サブネットワークのゲートウェイ MAC アドレスにパケットを送信します。インスタンスは、場合によっては最初に ARP リクエストを実行し、ゲートウェイの MAC アドレスを解決する必要があります。」

と書いてある。

どうやらこれが原因でサブネット間でのクラスタリングができないっぽい。
グローバルIPを設定してあげるといける。
rails5 whenever で Error: unknown argument '--silent'.

# 問題
 - wheneverでrake taskのスケジューラを作ったら `Error: unknown argument '--silent'.` で動かなかった

# 調査
 - `bundle exec whenever` で生成結果をみるとrake taskオプションに `--silent` が付いていた。

# 対策
 - ここにある解決策でOK -> https://github.com/javan/whenever/issues/524

```rb
job_type :rake, 'cd :path && :environment_variable=:environment :bundle_command rake :task :output'

every 3.minutes do
  rake 'hoge_task'
end
```
コマンドプロンプトで使用したいポートの状態を確認する

あるポートを使用しようと思ったら既に使われている場面ってよくあると思います。tomcat起動しようとしたら8080が既に使われていたりとかね。

そういった時、使用したいポートは何に使われているのかを調べる方法をメモしておきます。

環境はWindows。コマンドプロンプトを使って行います。

# 1.　ポートの状態を調べる
まず使用したいポートがどのプロセスによって使用されているのかを知るために下記のコマンドを討ちます。ここでは例として8080を調べます。
`netstat -ano | find ":8080"` 

`netstat -ano` というコマンドと `find ":8080"` という2つのコマンドをパイプでつないで実行しています。
`netstat` はポートの使用状態を表示するコマンド。このコマンドだけでも使用状態は分かりますが、使用されている全てのポート状態が表示されるので、量が多く、欲しい情報を見つけるのも一苦労です。
そのため、二つ目の `find ":8080"` で一つ目のコマンドの結果から「:8080」を含むものだけを表示してくれます。

このコマンドでポート8080が使用されていれば、使用状態が表示されます。何も表示されなければそのポートは使用されていません。
表示されたら、一番右にプロセスID(PID)という項目が表示されてると思います。これを覚えておいてください。

# 2.　PIDからポートを使用しているプロセスを特定
PIDを知った後は続いて下記のコマンドを実行します。ここでは例として上記のコマンドで「12345」というプロセスIDが表示されていたとします。

`tasklist | find "12345"`

ここでも二つのコマンドをパイプでつなげています。

`tasklist` で動いているプロセスを表示。 `find "12345"` で「12345」を含むものだけを表示します。つなげる理由は1. と全く同じです。

これで表示されたものがポートを使用しているプロセスの正体になります。あとはそのプロセスを止めても問題があるか無いかを考えて下さい。
よく使うElasticSearchのクエリ（elasticdump）

ElasticSearchは、マニュアル（英語）がしっかりしてるので、そっちを参考にしてください。
マニュアル（本家）：https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html


## 環境

* CentOS 7.1
* ElasticSearch 5.6.2<br>
  ※ElasticSearch 6.xでは、curlに「 -H 'Content-Type: application/json'」を付ける必要があります。
* elasticdump 3.3.1<br>
  <strike>※2017.12.21現在、elasticdumpがElasticSearch 6.xに対応していません。<br>
  　ただ「 --headers='{"Content-Type": "application/json"}'」を付けることで一部の機能は使えます。</strike><br>
※2018.08.31現在、elasticdump 3.3.19では、ElasticSearch 6.xに対応されました。


## 目次

* [インデックス（マッピング）操作](https://qiita.com/nakazii-co-jp/items/0583ba7e90741939636a)
* [ドキュメント（レコード）操作](https://qiita.com/nakazii-co-jp/items/d8dca15e5eab6406ffdb)
* [データ取得](https://qiita.com/nakazii-co-jp/items/997a980f34bce5440628)
* [スナップショット](https://qiita.com/nakazii-co-jp/items/908b6a44e41f176abb8f)
* elasticdump（インポート／エクスポート）

## elasticdump（インポート／エクスポート）

elasticdumpを使うためには、別途elasticdumpをインストールする必要がある

### ■ インデックスをjsonファイルにエクスポートする
```bat:コマンド
elasticdump --input=http://localhost:9200/hoge_index --output=hoge_index.json
```

### ■ jsonファイルをインポートする
~~~bat:コマンド
elasticdump --input=hoge_index.json --output=http://localhost:9200/hoge_index
~~~


## 参考
 * http://otiai10.hatenablog.com/entry/2015/03/04/152842 (elasticdump)
よく使うElasticSearchのクエリ（スナップショット）

ElasticSearchは、マニュアル（英語）がしっかりしてるので、そっちを参考にしてください。
マニュアル（本家）：https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html


## 環境

* CentOS 7.1
* ElasticSearch 5.6.2<br>
  ※ElasticSearch 6.xでは、curlに「 -H 'Content-Type: application/json'」を付ける必要があります。


## 目次

* [インデックス（マッピング）操作](https://qiita.com/nakazii-co-jp/items/0583ba7e90741939636a)
* [ドキュメント（レコード）操作](https://qiita.com/nakazii-co-jp/items/d8dca15e5eab6406ffdb)
* [データ取得](https://qiita.com/nakazii-co-jp/items/997a980f34bce5440628)
* スナップショット
* [elasticdump（インポート／エクスポート）](https://qiita.com/nakazii-co-jp/items/3199433d685d0600c6d6)


## スナップショット

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html

snapshotを使う前に、事前準備を行ってください。
また、backupしたsnapshot自体をリストアするときも同様な手順が必要です。

### ■ 事前準備

#### １）snapshot用のディレクトリを作成
所有者と所有グループはelasticsearchユーザ、elasticsearchグループを指定する。

```bash:コマンド
sudo -s mkdir /var/www/backup/elasticsearch
sudo -s chown -R elasticsearch:elasticsearch /var/www/backup/elasticsearch
```

#### ２）elasticsearch.ymlにpath.repoを登録する
```bash:コマンド
sudo -s vi /etc/elasticsearch/elasticsearch.yml

      path.repo: ["/var/www/backup/elasticsearch"]

```

#### ３）elasticsearch再起動
※環境は、CentOS7。

```bash:コマンド
sudo -s systemctl restart elasticsearch
```

#### ４）Elasticsearchにリポジトリを登録
今回はサブディレクトリとしてsnapshot1を指定している。

```bash:elasticsearch
curl -XPUT 'http://localhost:9200/_snapshot/snapshot1' -d '{
    "type": "fs",
    "settings": {
        "location": "/var/www/backup/elasticsearch/snapshot1",
        "compress": true
    }
}'
```

### ■ snapshot作成
```bash:elasticsearch
curl -XPUT 'http://localhost:9200/_snapshot/snapshot1/snapshot-2017.10.27?wait_for_completion=true' -d '{
    "indices": "hoge_index",
    "ignore_unavailable": true,
    "include_global_state": false
}'
```

### ■ snapshotのリストア
```bash:elasticsearch
curl -XPOST 'http://localhost:9200/_snapshot/snapshot1/snapshot-2017.10.27/_restore?wait_for_completion=true' -d '{
    "indices": "hoge_index"
}'
```

### ■ snapshotリポジトリのリストを表示
```bash:elasticsearch
curl -XGET 'http://localhost:9200/_snapshot/'
```

### ■ snapshot1に登録されているsnapshotのリストを表示する
```bash:elasticsearch
curl -XGET 'http://localhost:9200/_snapshot/snapshot1/*'
```

### ■ snapshotの削除
```bash:elasticsearch
curl -XDELETE 'http://localhost:9200/_snapshot/snapshot1/snapshot-2017.10.27'
```

### ■ snapshotリポジトリの削除

snapshotリポジトリを削除する前に、snapshotを削除してからリポジトリを削除してください。

```bash:elasticsearch
curl -XDELETE 'http://localhost:9200/_snapshot/snapshot1'
```



## 参考
 * https://qiita.com/datake914/items/2313894c684a7cba992c (snapshotについて)
PHPのオフィシャルDockerイメージにredis exensionを追加する方法(debian版)

※ こちらの記事を大変参考にさせていただきました。  
[PHPのオフィシャルDockerイメージにredis exensionを追加する方法 \- Qiita](https://qiita.com/hirohero/items/f3abb8519e0fe609546e)

「公式イメージ」にdebianベースのものを用いた場合の、「こうやったらphpredis入ったよ」という記事です。
どこかでまた使うことがありそうなので、備忘録としてメモ。

```Dockerfile
FROM php:7.0-apache

RUN apt-get update && apt-get install -y --no-install-recommends libicu-dev git

WORKDIR /usr/src/php/ext
RUN git clone -b php7 --depth 1 https://github.com/Connehito/phpredis.git redis

RUN docker-php-ext-install redis
```
opensslをソースからインストールしようとしたら’e_os2.h  are the same file’でコケた


# 対処法
[コレ](https://groups.google.com/forum/#!topic/mailing.openssl.users/FNqpaBDu7K8)
日本語の検索結果がなかったので、書いておく。

# やろうとしたこ
apacheでHTTP/2を有効化するために、[この記事](https://blog.apar.jp/linux/3484/)を参考にしながら各種インストール作業。
opensslを含め、全体として以下のようなprefixで進めてたら罠があった。

以下、OpenSSLの例。OpenSSL以外にも、apache,apr,apr-util,およびphp7.2とMySQL8をインストールする予定。

・/usr/local/src配下にソースを持ってくる。
・/usr/lcoal/openssl/配下に、/usr/local/src/openssl-1.0.2l.tar.gzを展開
・/usr/local/openssl/openssl-1.0.2l配下でconfig,およびmake

```
# ./config --prefix=$(pwd) shared zlib
# make
# make test
# make install
```
・ln -s /usr/local/openssl/openssl-1.0.2 currentとして、/usr/local/openssl/current/を、最新のopensslのシムリンクにする。
※この先更新があった場合に、/usr/local/openssl/openssl-[バージョン]をmakeしなおして、シムリンクの張り直しで更新を実施できるのでは、ってうい考え。というかこういうやり方をどっか別のとこで見た。

# 起きた問題
make testまでは通ったが、make installで以下のエラー

```
cp: 'e_os2.h' and '/usr/local/openssl/openssl-1.0.2l/include/openssl/e_os2.h' are the same file
make: *** [install_sw] Error 1
```

# ぐぐった結果ヒットしたもの。
[コレ](https://groups.google.com/forum/#!topic/mailing.openssl.users/FNqpaBDu7K8)。
曰く、「do not use the same --prefix location as your source directory and it will be fine.」、
ソースディレクトリをそのまま --prefix に使っちゃダメよ、とのこと。

# いったんこうしてみた
```
# ./config --prefix=/usr/local/src/openssl/openssl shared zlib
```
/usr/local/src/openssl配下に、ソースディレクトリのopenssl-1.0.2lがあって、インストール先はopensslのまま。
で、うまくmake install通りました。ただこのディレクトリ構造はちょっとどうかと思うので、もうちょっとキレイにいくのがないか考えてみる。

# 備考

## 環境
OS:CentOS7の上に建てたCentOS7のDockerImage(CentOS Linux release 7.4.1708 (Core))
2017/10/27時点で最新のOpenSSL(openssl-1.0.2l)

なお、過去のバージョンのOpenSSLいくつか試したけど同様だった。
OpenSSLのインストールは __「ソースディレクトリをそのままprefixに使うな」__ ってことらしい。

## リンク
[OpenSSL](https://www.openssl.org/source/)
JSで多階層のJSONを扱う時の備忘録

### 経緯
　GAS使うことになった

``` JS
function test() {
  var testJson = '{"replyToken":"897aa08fd48247f5aa2aa99999999999", "source":{"type":"user", "userId":"U911cc758e62b359634cd299999999999"}, "type":"message", "message":{"id":"6906513233888", "text":"なまなまか", "type":"text"}, "timestamp":"1.50917625936E12"}';
  var response = JSON.parse(testJson);
  var source = response.source;
  var s_source     = JSON.stringify(source);
  var sourceArr     = JSON.parse(s_source);
  var userId        = source.userId;
  Logger.log(source);
  Logger.log(s_source);
  Logger.log(sourceArr);
  Logger.log(userId);

}

```
Gitのリモートリポジトリに任意の日時のコミットを作りたい

# 実現すること
Gitのリモートリポジトリに任意の日時のコミットを作ります。
Gitには、Commit Date, Author Dateがあるため、両方変更します。

# 手順
1. ローカルリポジトリにコミット  
  　
2. PCの時刻を変更  
    Commit Dateはammendした時刻になります。ammendする前にPCの時刻を変更しておきます。  
    　
3. ローカルリポジトリのコミットを任意の日時に変更  
    Author Dateの変更は"--date"オプションをつけて"--ammend"します。  
    　
4. ローカルリポジトリをリモートにプッシュ

※　Commit Date, Author Date共に変更する場合はPCの時刻変更だけでOKです。

# 動作確認環境
- macOS High Sierra
- git version 2.13.5

# 任意の日時に変更する方法

```
$ git commit --amend --date "Fri, 10 Nov 2017 14:33:41 +0900"
```

# 現在の日時に変更する方法

```
$ git commit --amend --date "`date -R`"
```

# リモートリポジトリの過去の履歴の書き換え方法

```
$ git rebase -i ＜変更したいコミットの１つ前のコミットID＞
```

修正したいコミットをpickからeditに変更

```
$ git commit --amend --date "`date -R`"
$ git rebase --continue
```

ローカルの履歴書き換え作業を必要回数繰り返す。

リモートのブランチを削除してからプッシュ。
チームメンバーには強制プルしてもらう。

```
$ git reset --hard origin/＜ブランチ名＞
```