OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerでの環境構築に挑戦しよう！〜一歩進んだエンジニアになるために〜

# 今北産業
- 環境構築が自分でできるとしたいことがしやすくなる
- 環境構築にはDockerがおすすめ
- とにかく早くローカル開発環境が欲しいなら公開されているDockerFileを使おう

# 環境構築ができるようになると自分でサービスを作れるようになる
# 自前の環境構築をするにはDockerがおすすめ
# 環境構築を急ぐ人は公開されているDockerFileを使っちゃおう
iPhone Xで画面の下部にViewを固定で配置していたら謎の余白が産まれたので、頑張って自力で塗りつぶす

既存のアプリを普段のように改修していたんですが……
iPhone XでUITabBarControllerとかを使っていない画面を見てみると、
画面の最下部に固定しているviewの下に謎の余白が発生しているッ！？

正直、今更感あふれる対応ではあるんですが今後の対応を忘れないようにもメモ的に！
端末を横にして見た時のことは………う〜ん、ちょっと今回は未対応かも。

# 原因！
homeボタンがなくなったせいでしたッ！

今まではSafeAreaの最下部から高さXXのUIViewを配置してみたいな感じだったんですが、SafeAreaより更に下が誕生してしまったんですね……

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/9372aa89-4c03-276e-6f4b-c1bca00ce20a.png)

これはエミュレータのsafariなんで塗りつぶされていますが( ˘ω˘)

# 対策1
@ichimots さんがコメントでも指摘の通り、画面下部に固定しているviewのbottomをSuperView.bottomにする！
これが一番、簡単です……！
storyboardの設定を書き換えるだけでも出来てしまうのでお手軽！　マジおすすめッ！

# 対策2
SuperViewのbottomを前提にすると、今の構成だと下のバーとviewが急接近してしまうのが嫌だなぁというニッチな需要向け！
このプロパティを有効にすればOK！みたいな都合のいい解決策は見つかりませんでした:sob:
SafeArea以降の部分の高さを取得して、最下部に配置しているUIViewを弄るということも考えたんですが、それもちょっと嫌なので。

画面最下部のUIViewの下に同一の背景色のUIViewをもう1つ配置して、画面一番下まで伸ばす……という風にすれば他の端末でも影響なく対応できるのでは？　と思ったので、この方法で対応してみようと思います。

## 実装

```for_iphonex.swift
class BottomFillView: UIView {
    func add(_ baseVC: UIViewController, bottomView: UIView) {
        self.backgroundColor = bottomView.backgroundColor

        baseVC.view.addSubview(self)

        constrain(self, bottomView) { view, bottomView in
            view.top == bottomView.bottom
            view.trailing == view.superview!.trailing
            view.leading == view.superview!.leading
            view.bottom == view.superview!.bottom
        }
    }
}
```

という拡張UIViewを用意してみました。

```yobidashi.swift
override func viewDidLoad() {
    super.viewDidLoad()
    BottomFillView().addX(self, bottomView: bottomView)
}
```

こんな感じで呼んであげるとあら不思議、純白だった画面下部が同じ色で塗りつぶされているッ！

**と、ここまでやったんですが……storyboardだけで対策できる方法がッ！**

# 対策3

- 最下部のviewのbottomをSuperView.bottomにする
- 最下部のviewのtopをSafeArea.bottomと、 マイナスの設定したい高さで設定する

**どうしてこんな簡単なことに気づかなかったんだろう……**
**人から指摘を貰えるQiitaに感謝しかない:sob:**

# 感想
個人的にはhomeボタンがあった方が使いやすい……
いやこうした方が楽なんじゃないの？　みたいな指摘もあれば是非是非:blush:
GCEを端的に説明

## GCEとは？
**GCE（Google Compute Engine）とは、Googleが提供するクラウドサービスの内のIaaSです。**

## そもそも...
- クラウドサービスって？
  - クラウドサービスは、従来ローカルコンピュータで利用していたデータやソフトウェアを、ネットワーク経由で利用できるようにしたサービスです。Googleが提供しているクラウドサービスは　Google Cloud Platform（GCP）です。

- IaaSって？
  - IaaS（Infrastructure as a Service）はクラウドコンピューティングのうちの1つで、仮想化技術を利用してハードウェアリソース（CPU／メモリ／ストレージ）などのITインフラをインターネット経由で提供するサービスです。

## GCE概要

GCE（Google Compute Engine）はGoogleのデータセンターとネットワークで運用される仮想マシンをOSレイヤーまで管理し提供してくれるサービスです。
つまり、ハードウェアなどのメンテナンスやOSアップデート、パッチ当てなどをgoogle側で管理してくれるサービスです。

また、他クラウドサービス（AWS, Azure）のIaaSと違い
GCEはGoogle側のメンテナンスがあった場合、仮想マシンの再起動などを気にする必要はありません。
GCEにはライブマイグレーション機能が備わっていて、稼働したままメンテナンスが行われます。

- ライブマイグレーションとは
  - サーバ仮想化環境で動いている仮想マシンを、OSやアプリケーションを停止させることなく、丸ごと別の物理サーバへと移動させることです。 ライブマイグレーションを行うと、対象となる仮想マシンのメモリイメージが、そのままライブマイグレーション先の物理サーバへと移動します。

**参考：**

- [GCE](https://cloud.google.com/compute/)
- [クラウドサービス](http://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/service/13.html)
- [IaaS](https://ja.wikipedia.org/wiki/Infrastructure_as_a_Service)
- [ライブマイグレーション](https://www.nttpc.co.jp/yougo/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html)
Kubernetes勉強 その3（ReplicaSet）


引き続き「Kubernetes完全ガイド」読んでお勉強。

## Pod と ReplicaSet と Deployment

`Pod` はリソースの最小単位であり、`ReplicaSet` は `Pod` を管理するリソース。 `ReplicaSet` は `Pod` が停止すると自動的に再起動したりする。
`Deployment` は、 `Pod` に含まれるコンテナをバージョンアップする際に、古いコンテナを徐々に減らし、新しいコンテナを徐々に増やすなどの管理をする。

### ReplicaSet

* ReplicaSetは指定した数のPodを起動し、その数を維持し続けるリソース。
* Podがなんらかの理由で停止したら、ReplicaSetが再起動してくれる。

#### ReplicaSetの作成

`sample-replicaset.yml` というファイルを作って、ReplicaSetを定義する。

```yaml:sample-replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.12
          ports:
            - containerPort: 80
```

ReplicaSetを起動する。

```
$ kubectl apply -f sample-replicaset.yml 

replicaset.apps "sample-rs" created
```

状態を確認してみる。

```
$ kubectl get pods

NAME              READY     STATUS    RESTARTS   AGE
sample-rs-54hgh   1/1       Running   0          1m
sample-rs-nbntp   1/1       Running   0          1m
sample-rs-zfpsd   1/1       Running   0          1m
```

ここで、意図的にpodを停止してみる。上記のpodの中から、 `sample-rs-54hgh` だけを停止する。

```
$ kubectl delete pod sample-rs-54hgh

pod "sample-rs-54hgh" deleted
```

podが停止した。状態を確認する。

```
$ kubectl get pods

NAME              READY     STATUS        RESTARTS   AGE
sample-rs-54hgh   0/1       Terminating   0          2m
sample-rs-95p4r   1/1       Running       0          3s
sample-rs-nbntp   1/1       Running       0          2m
sample-rs-zfpsd   1/1       Running       0          2m
```

お、 `sample-rs-54hgh` のSTATUSがTerminatingになり、入れ替わるように `sample-rs-95p4r` が起動した。

少し時間をおいて再度状態確認。

```
$ kubectl get pods

NAME              READY     STATUS    RESTARTS   AGE
sample-rs-95p4r   1/1       Running   0          16s
sample-rs-nbntp   1/1       Running   0          2m
sample-rs-zfpsd   1/1       Running   0          2m
```

`sample-rs-54hgh` が完全に姿を消して、もとの3Pod状態に収束した。なるほど。

ReplicaSetを削除する。

```
$ kubectl delete -f sample-replicaset.yml 

replicaset.apps "sample-rs" deleted
```

今夜はここまで。
パッケージとリポジトリの違いとは？Linuxを初めて触るエンジニアが知るべき用語について

# 今北産業
- パッケージとは
- リポジトリとは
- パッケージとリポジトリの違いとは

# 前提
# パッケージって？
# リポジトリって？
# パッケージとリポジトリの違いって？
# まとめ
【vSphere HA】隔離アドレスにアクセスできないときの対処法②

#エラー概要
ESXiを1台追加で構築し、VCSA管理下のあるクラスタに入れ込んだら「隔離アドレスへアクセスできません」というエラーが発生した。

#環境
- VCSA6.0.0 ×1
- ESXi6.0.0 ×4
- クラスター ×2 (ESXiは2台ずつ収納されている）
- vDS使用
- クラスタ：HA有効

#原因
追加したESXiのデフォルトゲートウェイアドレスが存在していなかった。
デフォルトゲートウェイではないアドレスになっていた。

※隔離アドレスとは
ESXiが孤立状態になっていないか定期的にPingを飛ばして確認する宛先のこと。

#対処法
今回は既にVMware環境を客先に渡していたので、万が一HAの発動によって対象のESXi上へvMotionされないように影響を最小限に抑える方法でこの問題を解決した。

###【vSphere Web Clientの場合】
####①クラスタに追加したESXiをメンテナスモードに変更する
対象ESXiを右クリック→メンテナスモード
![pic1](http://drive.google.com/uc?export=view&id=1QLZ1DJvWWvXVUDhUFMgS9DkJ1QiwqwfS)

####②クラスタからESXiを外す
対象ESXiをクラスタ外（データセンター）にドロップすればクラスタから外せる。

####③ESXiのメンテナスモードを解除する
対象ESXiを右クリック→メンテナスモード→メンテナスモード解除

####④ESXiのデフォルトゲートウェイを変更する
対象ESXiをクリック→Configureタブ→Networking→TCP/IP configuration→Edit
![pic2](https://drive.google.com/uc?export=view&id=1QEyBJP0hj9lJHUCyMokD5x3hJy8I3CN8)

Routingクリック→DGW入力→OK
![pic](https://drive.google.com/uc?export=view&id=1Rq5Ae3uU3i74_ngHaqEyXaI2PXBdH-vR)

####⑤再度クラスタに組み込む
対象ESXiをクラスタに再度ドロップした後、エラーが消えていることが確認できればOK。

###【vSphere Clientの場合】
####①~③は上記と同様
####④ESXiのデフォルトゲートウェイを変更する
・対象ESXiクリック→Configureタブ→Software→DNS and Routing→Propatiesクリック
・RoutingタブからDGWを変更する
####⑤も上記と同様

#まとめ
この方法は結構めんどくさいので、安全を第一に考えた場合に使うと良い。
まだ顧客に環境を渡していないのであればメンテナスモードにしなくてもいいと思う。

以上です。
【TIC-80】架空のゲーム機のゲームをFantasyConsoleに移植する（その４）

「国盗りす」にはフィーバーモードなるものがあります。

- 光っているエリアに兵糧を落とし、全て埋めると次のエリアが光る
- 埋める際に一発で埋めるとフィーバーモードとなり全てのエリアが対象となる

![fever3.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/699ac178-0e75-3d1b-2ae8-bad752a3d917.gif)

こんな感じですね。

一つのエリアを光らせる場合は、該当位置の参照タイルIDを差し替えていました。
茶色のタイルから黄色のタイルに差し替えるイメージですね。

ただフィーバーモードで全てのタイルを差し替えるのは重いかなと思い（HHEM）、
パレットの色データを書き込むといいかなと考え「TIC-80 wiki」を覗いてみると
パレットの差し替え（というよりカラーインデックスの参照先のみ変更？）の
関数が紹介されているみたい。

おーこれを使えば一定間隔で、パレット差し替え ⇔ 元に戻す ということができるかな？

ただ、現在光っているかどうか？というフラグ？（状態？）はどのデータに持たすのが
妥当なんだろう。指定色はすべて差し替わるってことはフィールドではないような‥。

あ、色を変えるという操作（関数）に持たせればいいのかな、Luaはそれが楽にできる、
みたいな紹介を読んだ覚えが。

それっぽいコードを参考にしつつ実装
（ON-OFFのフラグのものがあるかなと探しましたが、調べ方が悪かったのか
カウンターのサンプルが大半でした）

```palette_toggle.lua
do
SEA_COL=13
LAND_COL=4
SHINE_COL=14
end
-- common function from TIC-80 wiki
function pal(c0,c1)
	if(c0==nil and c1==nil)then for i=0,15 do poke4(0x3FF0*2+i,i)end
	else poke4(0x3FF0*2+c0,c1)end
end

pal_toggle=function(offcol,oncol)
	local ofc,onc=offcol or LAND_COL,oncol or SHINE_COL
	local onflag=false
	local f
	f=function()
		onflag=not onflag
		if onflag then pal(ofc,onc)
		else pal() end
	end
	return f
end

function test()
	landshine=pal_toggle()
	seashine=pal_toggle(SEA_COL)
end

test()

function TIC()
	map()
	if btnp(0,1,30) then landshine() end
	if btnp(1,1,30) then seashine() end
end
```
![パレット２.png](https://qiita-image-store.s3.amazonaws.com/0/284455/a6f806c0-262d-d624-1739-db18f47a5e71.png)
![パレットテスト.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/7d57fece-cbbb-688c-02e1-34eec04691fd.gif)

だいたい想定通りですかね。
ただ pal() が全色リセットなので、両方ON時に一方を解除するともう片方も解除されますね。
‥‥、まいいか。
（ゲーム中は　landshine() のみ一定間隔で呼ぶ）

そういえば、エリアがつながっているか、の判定関数を再帰で呼び出すみたいなことを
する時にすでにチェック済か、という情報を記録する時も、関数に持たせた方が
自然に書けるのかな？
気がする‥けど気がするだけで実装方法は分からないので今後の課題とします。
yum？rpm？CentOSを扱う際に絶対理解しておきたいパッケージ管理のこと

# 今北産業
- パッケージ管理とは
- yumとrpmの違いとは
- リポジトリとは

# 前提
# パッケージ管理って？
# yumとrpmの違いって？
# remiとかepelとかのレポジトリって？
# まとめ
AWS  APIGatewayを設定する

AWS  APIGatewayを設定する方法について記載
（単純にアクセスするとLambda経由でJSONを返すものになります。）


###1.APIの作成

AWSコンソールのサービスから「API」を開いて「APIの作成」ボタンをクリック

API名を記載して「APIの作成」をクリック
（エンドポイントはとりあえず「リージョン」を設定）

###2.リソースの作成

作成したAPIを開いて、アクションから「リソースの作成」をクリック

リソース名を指定（エンドポイントURLの最後に/でつけられる名前になります。）して「リソースを作成」をクリック

###3.メソッドの作成

リソースのアクション >　メソッドを作成　をクリック

タブからGETを選択、右のチェックをクリック

統合タイプで「Lambda関数」を選択、
LambdaリージョンでLambda関数を作成しているリージョンを選択、
作成したLambda関数名を指定、「保存」をクリック
（Lambda関数は何かJSONを返すものを作成しておく。）

Lambda関数に権限を付与する画面が出るので「OK」をクリック

APIの一連の流れができるので、「テスト」をクリック
メソッドテストが開くので「テスト」クリックする。
想定しているJSONファイルが帰って来ればテストは成功

###4.ステージへデプロイ

左メニュー > リソース　> アクション > APIのデプロイを選択

デプロイされるステージに「新しいステージを」選択、ステージ名を入力して「デプロイ」をクリック
（初回に左メニュー > ステージから作成することができないっぽい？）

左メニュー > ステージ　を選択すると、作成したリソースが表示されている、GETをクリックするとエンドポイント（URL）が確認できる。
クリックしてJSONがかえって来れば正常。


###4.API Keyの追加

このままだとアクセスし放題なのでAPI Keyを追加する。

左メニュー > APIキー　　 > アクション　から「APIキーの作成」をクリック

名前を指定して、自動生成のままで、「保存」をクリック

APIキーが作成される、作成したキーをクリックすると、
情報が表示される。APIキーを確認するには中央「APIキー」横の「表示」をクリックする。

左メニュー > 使用量プラン　> 　「作成」ボタンをクリック

使用量プラン名を指定、スロットリングはアクセス数の制限を行うための数値を指定、「次へ」をクリック。（バースト5000とか、各自の状況に合わせてください）

「APIステージの追加」をクリックして、作成したAPI名、ステージ名を設定、
「次へ」をクリック

「APIキーを使用量プランに追加」をクリック、先ほど作成したAPIキー名を指定、横のチェックマークをクリック。

これで、APIキーが設定できたので、API側のAPIキーの設定を変更します。

左メニュー > API > から作成したAPIを選択

GETをクリックするとAPIのフローがヒュオジされるので、「メソッドリクエスト」をクリック

「API キーの必要性」をtrueに変更、横のチェックをクリック

アクションから「APIのデプロイ」をクリック、先ほど作ったステージにデプロイ

これで、APIキーを付与しないとアクセスできなくなります。


APIキー付きでアクセスできるか確認する際は、ターミナルから以下のように--headerにx-api-keyを付与して行なってください。


```
curl https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/ --header 'x-api-key:APIキー'
```


以上



参考

https://dev.classmethod.jp/cloud/apigateway-apikey-auth/
Homebrew で Python3, numpy, OpenCV3 を macOS 10.14 Mojave にインストール

Python3, numpy, OpenCV3 を macOS 10.14 Mojave へインストールした時のメモです。
特に詰まることもなく簡単にできると思います。

下記ページを参考にしました。
[Homebrewで Python3 OpenCV3をMacにインストール](https://qiita.com/irs/items/4748d4bd04649d046861)

# 環境

* macOS Mojave
* Homebrew
* Python3.6
* OpenCV3.4.3

# Homebrew のインストール

[Homebrew 公式サイト](https://brew.sh/index_ja)の記載通りにコマンド実行します。

```text:Homebrewインストール
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# Python3 のインストール

Homebrew で Python3 をインストールします。

```text:Python3インストール
brew install python3
```

#numpy のインストール

OpenCV3はnumpyを使用するようなのでインストールしておく。

```text:Python3インストール
pip3 install numpy
```

# OpenCV3 のインストール

pip3 で OpenCV3 をインストールします。

```text:opencv3インストール
brew install opencv3 --with-python3
```

# OpenCV3 の動作確認

最後に、 OpenCV が import できればインストール成功です。

```text:OpenCVをimportしてみる
$ Python3
>>> import cv2
```
Docker Composeについて雑に調べたメモ

Dockerは解ってるんだけど、複数コンテナを一つにまとめるってなんだっけ？？？となったので調べたメモです。

#  結論
公式ちゃんと読みましょう。
http://docs.docker.jp/compose/toc.html

# 読んだもの
- https://knowledge.sakura.ad.jp/16862/
- https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce
- https://qiita.com/gold-kou/items/44860fbda1a34a001fc1
- http://docs.docker.jp/compose/toc.html

# 起動順番を制御できる？
制御できる。ただし、DBが起動するまで待ってからWebを上げるみたいなのはできない。
ちゃんとリトライ処理やヘルスチェック実装しましょうって事ですね。

# さらなる疑問
Swarmクラスタってなんだっけ。
Kubernetesじゃダメなんだっけ？
　→KubernetesでOK！
公式もDocker Swarmではなく、Kubernetesの事書いてあればいいのに。
Windows10 スタートアップフォルダの出し方

* いつも忘れて調べるのでメモ

# その1

1. `Windowsキー` + `R`
1. `名前(O):` に `shell:startup`と入力
1. `Enter`

# その2

1. `Windowsキー` + `E`
1. アドレスバー(`F4`) に `shell:startup`と入力
1. `Enter`
Typescriptのお勉強2


# oclifを使ってコマンドラインのツールを作った

IDEはinttelij

会社のlambdaのコードもtypescriptにしたくなった

ググった
上位互換なので、拡張子を変えれば動く
intellijでtypescriptについての追加記述のおすすめはしてくれるっぽい

gmail add-onのclaspがtypescript対応しているとのこと
これを試してみるのもいいかもな

Google Apps ScriptsでTypescriptが超簡単に使えるようになった！ - アクトインディ開発者ブログ
https://tech.actindi.net/2018/09/10/083314

gmail-add-ons-samples/github at master · gsuitedevs/gmail-add-ons-samples
https://github.com/gsuitedevs/gmail-add-ons-samples/tree/master/github

gmail-add-ons-samples/meeting-assistant at master · gsuitedevs/gmail-add-ons-samples
https://github.com/gsuitedevs/gmail-add-ons-samples/tree/master/meeting-assistant

claspとTypeScriptの型定義で楽をする2018年のGoogle Apps Script開発 - mottox2 blog
https://mottox2.com/posts/160/

# claspを使ってみる（app scriptも調べる）

## 導入チュートリアル的に活用した

clasp が Typescript をサポートした！ - Qiita
https://qiita.com/HeRo/items/f2ce057c6b1456e896ad

	インストールの際にデプロイのusersettingのapiを有効化したりとかした（注記に記載あるな。）
	tsconfigとかtslintもちゃんとは理解できてないなあ。。

## 公式

clasp/README.md at master · google/clasp
https://github.com/google/clasp/blob/master/README.md#clone

	読まずに`logs`を実行してみて、project-id-xxxxxを見つけるまでちょっと戸惑った
	`push --watch`することを考えると`.claspignore`で有効ファイルをホワイトリストした方がいいかもな

## マニフェスト

Google Apps Scriptに追加されたマニフェストについて - Qiita
https://qiita.com/tanaike/items/b3538e7550555ebb51f5

	マニフェストもいろいろできるのね

Manifests  |  Apps Script  |  Google Developers
https://developers.google.com/apps-script/concepts/manifests

	exceptionLoggingでログの例外場所とか変更できるのね。今はNoneかデフォルトのスタックドライバーしかない。

GASライブラリによるマニフェストの活用について - Qiita
https://qiita.com/tanaike/items/6488f755f742c9031e73

## jsDoc

上位互換性はあるけど本来の書き方は違いがあるのね

JavaScript IntelliSense の JSDoc コメントを作成する
https://msdn.microsoft.com/ja-jp/library/mt162307.aspx
map内の即時関数をawait処理したい。(自分メモ)

map内の即時関数をawait処理したい。

map内は別のスコープになるので一つ外でasyncしてもawaitが掛からない。
Promise.allでawait

```javascript

async() => {
  const data = [1,2,3,4]
  try {
    const result = await Promise.all( 
      data.map(async(key) => {
        return await await_function(key)
    })
  } catch(e){
    //error
  }
```	

# ポイントは await Promise.all()

おまけ
Promise.all がオブジェクトを返す。

```JSX
const result = await Promise.all(data.map(...))
```

以下で変わっているわけでない。

```JSX
Promise.all(result)
```
renderメソッドで失敗したこと。ハッシュ、メソッドの理解不足。

Ruby on Rails　チュートリアルをやっていて、自分でrenderメソッドを使った際に失敗したことをまとめておきます。
renderメソッドの中身には特に触れません。

１．チュートリアルに書いてあったhelloメソッド
---

```ruby
def hello
  render html: "hello, world!!"  #renderメソッド
end
```

html: の記述から、「これはハッシュを引数にしているな。」
と予測。以下のように記述を変えてみる。

２．エラーがでる
---

```ruby
def hello
  render {html: "hello, world!!"}
end
```

ハッシュならこれでいけるだろう。と思ったけどエラー。

３．エラーがでる
---

```ruby
def hello
  render (html: "hello, world!!")
end
```

こっちならどうだ、と思い上記を試すも、エラー

４．成功
---

```ruby
def hello
  render ({html: "hello, world!!"})
end
```

５．成功　パターン２
---
（yusuke23さんの指摘により気づきましたありがとうございます。）

```ruby
def hello
  render(html: "hello, world!!")    #renderと(の間にスペースがあるとエラー
end
```

これで成功。
引数の最後がハッシュなら、{}を省略できる。
メソッドを記述する際に、()を省略できる。
~~{}を省略するなら、()も省略しないとエラーがでる。~~
追記：メソッド名と(の間にスペースがあるとエラーがでる。
ということが体感的にわかりました。
AWS上の全インスタンス情報を取得したい

マネジメントコンソールって全てのリージョン並べて見れないんですよね。。。 
私は何かと CLI が好きなので、CLI を使って確認する方法を考えることにしました。 
使うものは次の通りです。 

##用意するもの 
####・AmazonLinux 
####・AWS CLI（※AmazonLinuxはインストール済） 
####・GNU Parallel 

本当はね参照コマンド回せばいいだけなんです。
for とか while とかで
でも直列処理って意外とレスポンスに時間がかかるので、並列実行させたいと思いました。 

そこで、上記の Parallel コマンドを今回は使います。

使い方は簡単です。 

parallel <実行したいコマンド> ::: <同時実行する引数>  

例えば  

> parallel echo ::: boku shigepi . 
boku 
shigepi 
. 

ということで、以下実施してみた流れです。

##実施手順
###Parallel インストール
> yum -y install parallel 

ちなみに今はこれだけリージョンあるようです。

###リージョン情報取得
> REGIONNAME=$(aws ec2 describe-regions --query Regions[].RegionName --output text) 
> echo ${REGIONNAME}
ap-south-1 eu-west-3 eu-west-2 eu-west-1 ap-northeast-2 ap-northeast-1 sa-east-1 ca-central-1 
ap-southeast-1 ap-southeast-2 eu-central-1 us-east-1 us-east-2 us-west-1 us-west-2

###AWS CLI 並列実行
> time parallel aws ec2 describe-instances --query 'Reservations[].Instances[].¥
[Placement.AvailabilityZone,InstanceId]' --output text --region ::: ${REGIONNAME} 
ap-south-1b i-056xxxx 
ap-northeast-2a i-0c9xxxx 
ap-northeast-1a i-250xxxx 
ap-southeast-1b i-073xxxx 
ap-southeast-2a i-0e9xxxx 
eu-central-1b i-076xxxx 
us-east-1e i-0c8xxxx 
us-east-2b i-0aaxxxx
real　0m18.186s 　　user   0m5.985s 　　sys　 0m0.851s 

###直列での実行 

####for 
real　0m20.735s　　user   0m5.903s　　sys　 0m0.805s

####while 
real　0m20.290s　　user   0m5.906s　　sys　 0m0.834s 

##まとめ 
別のとこでやったら２倍近く違う結果も出ました。 
もっと数がある環境だと差がでるようです。 
ぜひお試しください。 

今回はこれくらいで失礼します。。。

#####参考 URL
コマンドを並列に実行するGNU parallelがとても便利
http://bicycle1885.hatenablog.com/entry/2014/08/10/143612
【baserCMS】アーカイブページでのページ数をタイトルに追加する。

##【SEO対策】 ページネーション毎に異なるページと認識させる

「新着情報」や「ブログ」などのアーカイブページで記事が多い際にページネーションを使うと思いますが、
2ページ目も3ページ目も同じタイトルではSEO的に全て同じページと認識されてしまい、正確なデータを取ることができません。

**そんな時に使えるのが今回のコードです。**

アーカイブの1ページ目は通常タイトルで2ページ目以降には「タイトル 2ページ目」とページ数を出力する為のタグです。

もちろんアーカイブページでなければ通常のタイトルを出してくれるオールインワンの優れモノです！
SEOへの意識の高い方で探してある方も多いかと思いますのでアップしておきます。

~~~php
<?php
$title       = '｜';
$description = '';
if ($this->Paginator->params()) {
	$params = $this->Paginator->params();
	if ($params['page'] > 1) {
		$title       = ' ' . $params['page'] . 'ページ目｜';
		$description = $params['page'] . 'ページ目｜';
	}
}
?>
<title><?php echo $this->BcBaser->getTitle($title , ['categoryTitleOn' => false]) ?></title>
<meta name="description" content="<?php echo $description . h(preg_replace('[\n|\r|\r\n|\t]', '', strip_tags($this->BcBaser->getDescription()))) ?>"/
~~~
Fakerを使ってみました！（使い方と実行例）


記事を移転させました。
[【投稿】Fakerを使ってみました！（使い方と実行例）](https://pick-up-tech.com/blog/faker%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81%EF%BC%88%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%A8%E5%AE%9F%E8%A1%8C%E4%BE%8B%EF%BC%89)

## 下記の図についても移転先の記事で詳しく記載しております。
![faker-db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267720/b4a29b70-3ae1-4989-3508-119229ad946c.png)
vimでコメントの色を一時的に変える簡単ハック

本番サーバなどで設定ファイルをvimで編集するときに、コメントの色が超絶見づらいため、コメントの色を変えたいことがよくある。vimを開いてる状態で下記1行を適用するだけの簡単ハック。

### グレー

```
: hi Comment ctermfg=gray
```

### ライトブルー

```
: hi Comment ctermfg=lightblue
```

これで本番サーバでも安心して編集ができる♪
SQLクライアントソフトにて、指定したアドレスとは異なったアドレスに繋ぎにいく。なぜですか？

基本的、根源的すぎて投稿するのが恥ずかしいのですが、
タイトルのような状況にて、大変困っています。

同一ＬＡＮ内のCentOSサーバー上のMariaDBに、SQLクライアントから接続しようと
すると、指定したアドレスとは異なるアドレスに接続しようとします。
この状態を苦心しています。

SQLクライアント「HeidiSQL」からサーバーにアクセスしようとしたところ、
サーバーのアドレス[2001:○○○::25]を指定しているにもかかわらず、
なぜか、[2001:○○○::df]にアクセスしようとします。

また、[192.168.10.200]を指定しているにも関わらず、
なぜか、[192.168.10.103]にアクセスしようとします。

最初は「HeidiSQL」に問題があると考えて、、別の同種ソフトdveaverを
試しました。
意外にも、なんと結果は変わりません。（誤ったアドレスまで変わらず）

同種のトラブルを体験された方に、対処策を教えていただく、お願いします。

![bandicam 2018-09-30 14-34-26-866.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/3449e4cd-9c8f-096d-2d85-997804aabba6.jpeg)
![bandicam 2018-09-30 14-36-21-022.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/80a2fbc8-c645-33bc-068c-f1d8a0ca2b77.jpeg)
![bandicam 2018-09-30 14-37-49-569.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/868990af-3d55-e541-1c2f-7df49e3cb6f7.jpeg)
![bandicam 2018-09-30 14-38-20-578.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/c60fd108-0a8a-16f1-8cd3-439cde289380.jpeg)
![bandicam 2018-10-03 18-05-20-159.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/aaa13581-7159-9bae-b8d0-dbfc2e49ba1d.jpeg)
![bandicam 2018-10-03 18-06-04-518.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/b36f4a38-2d5a-611b-05ec-a465bdd60169.jpeg)
![bandicam 2018-09-30 14-53-53-172.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/c223fce7-0299-5d9a-2b0a-63640e80a69a.jpeg)
![bandicam 2018-09-30 14-57-31-704.jpg](https://qiita-image-store.s3.amazonaws.com/0/46311/a06fa9be-203a-d36b-2dff-9d5c40316963.jpeg)
[Android] Android Xに乗り換え

こんにちは


# Android x?

1. https://developer.android.com/jetpack/androidx/

2. https://android-developers.googleblog.com/2018/05/hello-world-androidx.html によると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/ae9c25ca-0004-5853-3d0a-43bcfb312212.png)


基本`com.android.support.*`　 `android.support.*`　`android.arch.*` が SDK 28から`androidx.* `に変える。

# 簡単に変える。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/ae2db248-1028-70fd-47a0-b4f662821192.png)
DBのオプティマイザまとめ

#Q:オプティマイザとは？
SQLを元に具体的なデータの取得処理を生成する機能。各DBによって独自のオプティマイザが搭載されている。
(だた、DBオプティマイザの違いまで意識することは少ない。)
オプティマイザはその名の通り『最適化』を目的とし、現在のDBに対しSQLから最も最適なデータ取得処理を生成する。

#Q:SQLがデータ取得処理じゃないの？
SQLはどのテーブルからどのようにデータを取得するかを記述したものでDBからどのようにデータを取得するかは書いていない。

```sql
/* 社員コードは主キー */
SELECT * FROM 社員マスタ WHERE 社員コード = 'A1000'
```

このSQLの場合、下記のように様々な取得処理が考えられる。このときどのような取得処理を行うかはオプティマイザが決めて実行する。
１．上から順に1件1件見て行って社員コードが'A1000'のレコードを取得
２．下から順に1件1件見て行って社員コードが'A1000'のレコードを取得
３．社員マスタの社員コードインデックスに対し二分探索で'A1000'のレコードを探して取得

#Q:なんでオプティマイザがデータ取得処理を決めるの？
現在のDBの状況から最も動作速度が早くなる処理を毎回決定するため。
例えば上記の社員マスタにレコードが5件しかなかった場合、上記処理なら１．あるいは２．が早いと思われる。３．はインデックスを使うがレコード件数が少なすぎるため殆ど意味がなくアクセス処理の分遅くなる。

このようにテーブルの状態によって最適な取得処理が変わる。DBからのデータ取得処理は非常に重いため最適な処理を選ばないと致命的な性能劣化も起こりうる。
そのための最適化処理としてDBの状態から動的にデータ取得処理を生成するようになっている。

#Q:自分でデータ取得処理を決めることはできないの？
オプティマイザにどのようにデータ取得処理を生成するかを誘導することで可能。ただしデータ取得処理の生成自体はオプティマイザが行う。
オプティマイザは
・SQL
・統計情報
・ヒント句
上記をベースにデータ取得処理を決定する。そのため上記のいずれかの要素でデータ取得処理を指定すればデータ取得処理を指定できる。
ただし基本的に最も早いデータ取得処理を実行するため、自分でデータ取得処理を指定する必要はあまりない。
※SQLはそれ自体はデータ取得処理ではないが、書き方によってオプティマイザが生成するデータ取得処理に影響を与える。

#Q:オプティマイザがどのようなデータ取得処理を行うのか確認できる？

実行計画において確認ができる。ただし実行計画はSQLと違い統一規格はないため使用しているDBによって出力のされ方が全然違う。
ちゃんと読み解く場合は各DBごとの実行計画の読み方を勉強しないと読めない。
(SQLの実行が遅いのを改善したいのであればテーブルフルスキャンをしている所を探しその部分のSQLを書き換えるだけで大体改善する。)

#Q:とりあえずオプティマイザが最適なデータ取得処理を作るから任せとけばいいのね？
間違いではないが・・・実際はSQLの問題で最適なデータ取得処理になっていないことが多い。そのためSQLの作成時は実行計画をセットで確認するのが基本となる。

```sql
/* 
	取引テーブルのキー(普通こんなキーにはしないけど)
		取引先コード
		取引日
*/
/* 特定の取引先の最終取引の内容を取得する */
SELECT
	取引先名
	最終取引日
	取引内容
FROM 取引テーブル
INNER JOIN 
(
	SELECT 
		取引先コード
		MAX(取引日) AS 最終取引日
	FROM 取引テーブル
	GROUP BY 取引先コード
) 取引テーブル_最終取引日
ON 取引テーブル.取引先コード = 取引テーブル_最終取引日.取引先コード
AND 取引テーブル.取引日 = 取引テーブル_最終取引日.最終取引日
WHERE 取引テーブル.取引先コード = 'A1000'
```

上記SQLは指定した取引先の最終取引内容を取得するSQLであるが、INNER JOINのサブクエリで『全ての取引先の最終取引日』を取得している。
実行計画を確認すれば最終取引日の取得で取引テーブルにテーブルフルスキャンが掛かっている事が確認できるはず。
本来は指定した取引先の最終取引日のみでよい為、ここでSQLの間違いに気が付ける。

```sql
/* 例なので修正方法は適当 */
SELECT
	取引先名
	最終取引日
	取引内容
FROM 取引テーブル
INNER JOIN 
(
	SELECT 
		取引先コード
		MAX(取引日) AS 最終取引日
	FROM 取引テーブル
	WHERE 取引テーブル.取引先コード = 'A1000'
	GROUP BY 取引先コード
) 取引テーブル_最終取引日
ON 取引テーブル.取引先コード = 取引テーブル_最終取引日.取引先コード
AND 取引テーブル.取引日 = 取引テーブル_最終取引日.最終取引日
WHERE 取引テーブル.取引先コード = 'A1000'
```

これなら取引テーブルの取引先コードのインデックスを使用するためテーブルフルスキャンは掛からない。
オプティマイザは『SQLを元にデータ取得処理』を実行するので間違ったSQLの改善はできない。そのためSQLについては開発者が責任をもって作成する必要がある。

※最近のオプティマイザは賢いので、クソいSQLでも一番早いデータ取得処理を生成してくれる場合も多くなった。ただ複雑なSQLだとやっぱり遅いことも多いのでSQLを使うなら正しいSQLを作る知識は必要。

#Q:SQLは正しいのにテーブルフルスキャンされるのはなんでだ？
(本当にSQL正しい？)統計情報が古い可能性がある。
オプティマイザはデータ取得処理を作るとき、DBの状態がどうなっているかを統計情報から確認する。
例えば統計情報嬢はレコード数が数件だが実際のレコード数が1万件などの場合、インデックスにアクセスする時間を無駄と考えテーブルフルスキャンをオプティマイザが選ぶことがあり得る。
毎回実際のDB状態を確認しないのは状態確認が重い処理のため(データ取得処理自体より遅い)

回避策として、統計情報を更新するかヒント句を用いて使用するインデックスを強制的に指定する方法がある。
理想は統計情報更新が望ましいが統計情報更新は重い処理のため出来ない場合もあり一概には言えない。
R で日本語プログラミング

そういえば変数名や列名に日本語使えるよ、というだけの記事です。

僕は人間向けに作られた列名が日本語の Excel ファイルを R で読み込んでそのまま強行突破するので、自然とコードが日本語だらけになります。そういうコードを書くと引き継ぎのときプロジェクトメンバに嫌われます。

```r:わざわざ日本語で書いた例
library(tidyverse)

data(iris)
アヤメ <- iris

列名を変える <- rename
グループ化する <- group_by
集計する <- summarise
最小値を求める <- min
中央値を求める <- median
最大値を求める <- max

アヤメ %>%
列名を変える(
  がく片の長さ = Sepal.Length,
  がく片の幅 = Sepal.Width,
  花びらの長さ = Petal.Length,
  花びらの幅 = Petal.Width,
  種類 = Species
) %>% 
グループ化する(種類) %>% 
集計する(
  がく片の長さの最小値 = 最小値を求める(がく片の長さ),
  がく片の長さの中央値 = 中央値を求める(がく片の長さ),
  がく片の長さの最大値 = 最大値を求める(がく片の長さ)
)
```

```:実行結果
# A tibble: 3 x 4
  種類       がく片の長さの最小値 がく片の長さの中央値 がく片の長さの最大値
  <fct>                     <dbl>                <dbl>                <dbl>
1 setosa                      4.3                  5                    5.8
2 versicolor                  4.9                  5.9                  7  
3 virginica                   4.9                  6.5                  7.9
```

使えない文字もありますが、そういうときはバッククォート `` ` `` でくくれば動きます。これでデータフレームのヘッダが `種類　※目的変数` のような人にやさしい値になっていても大丈夫です。

```
> ★ <- 1
Error: unexpected input in "・
> `★` <- 1
> ★
Error: unexpected input in "・
> `★`
[1] 1
```
CloudWatch Log の filter-log-events が遅い時に describe-log-streams を併用して対応する方法

```
aws logs describe-log-streams --log-group-name "/aws/batch/job" --log-stream-name-prefix "AWS_BATCH_DEFINITION_HOGE/default"
```

で得た log-streams-names を↓で space 区切りで list して filter-log-events をする。
filter-log-events の --log-stream-name-prefix は大量に log-stream-names があると現実的な速度で動作しないので、このような手法が有効となる。

```
aws logs filter-log-events --log-group-name "/aws/batch/job" --log-stream-names "AWS_BATCH_DEFINITION_HOGE/default/UUID4" "AWS_BATCH_DEFINITION_HOGE/default/UUID4"
```
Apexのテストクラスでpage messageをテストしたいとき

Apexのテストクラスでpage messageをテストしたいときのやり方メモ

正しいメッセージが出力されているかどうか確認したいときとかに使うと良いかも

#### やり方1
```java
List<ApexPages.Message> messages = ApexPages.getMessages();
System.assertEquals(true, messages[0].getDetail().contains('hoge fuge'));
```

#### やり方2
```java
List<ApexPages.Message> messages = ApexPages.getMessages();
System.assertEquals('hoge fuge', messages[0].getDetail());
```

#### エラーメッセージかどうか確認したいとき
```java
List<ApexPages.Message> messages = ApexPages.getMessages();
System.assertEquals(ApexPages.Severity.ERROR, messages[0].getSeverity());
```
LTE-M概要


# LTE-Mとは

既存のLTE回線を活用したLPWA(省電力・広域通信を可能とする無線通信技術)の一つ。

LTE-Mは一時は、機械型通信を意味するeMTC(enhanced Machine Type Communication)とも呼ばれており、M2Mで使用されることを想定された通信技術である。
つまり、LTE-Mの「M」は「Machine」を意味する

通信事業者が既に保有しているLTEの基地局をそのまま利用できることから、携帯電話事業者が積極的に取り組んいる。

国内では2018年1月からKDDIがサービスの提供を開始し、2018年10月時点ではドコモ、ソフトバンク、ソラコム(KDDI子会社)もサービスを開始しており、大手3キャリアが足並みを揃える状態になっている。

https://businessnetwork.jp/Detail/tabid/65/artid/5775/Default.aspx

|提供企業|提供開始日|プラン名|月額基本料金|
|---|---|---|---|
|ドコモ|2018/10/1|IoTプラン|400円/月 (2年契約あり)|
|||IoTプランHS®|800円/月 (2年契約なし)|
||||600円/月 (2年契約あり)|
||||1,000円/月 (2年契約なし)|
|ソフトバンク|2018/4/26|IoT料金プラン(単体プランA)|100円/月|
|||IoT料金プラン(単体プランB)|150円/月|
|||IoT料金プラン(単体プランC)|200円/月|
|||IoT料金プラン(単体プランD)|300円/月|
|KDDI|2018/1/29|LPWA10|100円/月|
|||LPWA100|150円/月|
|||LPWA500|200円/月|
|||LPWA2000|300円/月|
|ソラコム|2018/9/26|plan-KM1|100 円/月|

※ 2018-09-26時点

LTE-Mはセルラー系(無線免許が必要な通信)に分類される。


![lte-m_cate.jpg](https://qiita-image-store.s3.amazonaws.com/0/105362/bc15729f-88b5-4933-cf2a-f63daf898c25.jpeg)


---

# LTE-Mのカテゴリーについて

3GPP(3Gに関連する仕様の標準化をするプロジェクト)では、
ユーザーが利用するLTE端末の性能指標について、
LTE-UE(LTE User Equipment)という名称で、分類化している。

LTE-UEにおいて、LTE-Mは、NB-IoTともにLPWA向けのカテゴリーに1つ「LTE CatM1」として分類され、
従来に比べ、低速だが、省電力化されている。

3GPPのRelease 14では、NB-IoTともに、次のバージョン(Cat.M2、Cat.NB2)の検討が
進められている。

Cat.M2は、より拡張されたMTC、feMTC（further enhancement MTC)とも呼ばれ、
省電力化と通信距離がさらに向上することが見込まれている。

||LTE Cat.1|LTE Cat.M1 (LTE-M)|LTE Cat.NB1 (NB-IoT)|
|---:|---|---|---|
|下り最大速度|10Mbps|300kbps|29kbps|
|上り最大速度|5Mbps|375kbps|63kbps|
|送信電力|23dBm|20または23dBm|20または23dBm|
|通信方式|全2重|全/半2重|半2重|
|モビリティ性能|移動体通信|移動体通信|定点通信|

※ 上記はNTTドコモの通信方式の場合のものである

---

# NB-IoTとの違い
 
NB-IoTとの違いの一つは、モビリティ性能で、利用するのに適しているケースがそれぞれ異なる。

* LTE-M

デバイスが移動するケースに適している。

※ 例 : ウェアラブル端末など

* NB-IoT

デバイスを固定するケースに適している

※ 例 : 下水設備や駐車場など

---

# LTE-Mの特徴

上述した通り、LTE-MとNB-IoTはセルラー系に分類される。
セルラー系はライセンスバンド(無線免許が必要な帯域)を利用するので、電波干渉が起きる可能性が低い。
また、既存のLTE回線を使用するので、速度も高速である。
一方で、ライセンスバンドのためか、通信料金は高く、消費電力も高い。

||LTE-M、NB-IoT|LoRaWAN、Sigfox|
|---:|---|---|
|電波干渉|低い|高い|
|通信速度|早い|遅い|
|通信料金|高い|低い|
|消費電力|多い|少ない|

---

# LTE-Mを構成する技術

## eDRX (Extended Discontinuous Reception) 

端末側で基地局との通信確認の間隔を引き伸ばすことで、端末の待機状態を長くし、消費電力を減らす技術。

LTE-Mでは上記を拡張したeDRX (拡張DRX) と利用することが可能で、間隔をさらに伸ばし、最大43分間、端末を待機状態にする。

![edrx.png](https://qiita-image-store.s3.amazonaws.com/0/105362/cd5be12a-a044-4c9a-5f89-01bd8830015e.png)


https://www.nttdocomo.co.jp/biz/special/iot/lpwa/


## PSM (Power Saving Mode) 

端末が待機中に行っている処理をほとんど停止して、
端末を電源OFFに近い状態 （省電力モード） に遷移させることで、電力消費を抑える技術。

省電力モード中は、データの受信はできないが、端末側からのデータの送信はいつでも可能。

### Repetition ( 繰り返し送信 )

同じデータを繰り返し、送信することで、通信距離(カバレッジ)を拡張させる技術。

通信距離が長く、一部しかデータを受信できないような場合に、
同じデータを繰り返し送信し、受信時にデータを合成させて、受信成功確率を上げる。

![rep.png](https://qiita-image-store.s3.amazonaws.com/0/105362/e3e12a86-23f2-9c68-2fd0-66b200db1cc1.png)

---


* [総務省 : eMTC及びNB-IoTの技術概要・共用検討資料](http://www.soumu.go.jp/main_content/000458171.pdf)

* [ソラコム社資料](https://www.slideshare.net/SORACOM/jawsug-lpwa)

* https://k-tai.watch.impress.co.jp/docs/news/1034435.html
anacondaからモジュール（open cv）の追加まで

# anacondaからモジュール（open cv）の追加まで
### はじめに
anacondaの導入から、モジュールの追加と保存先を調べるところまでをすぐに忘れるからメモついでに残しておく  
**windows**で実験しました。  
MacやLinuxの方法を記しておきますが、動くかわかりません…  
すみませんm(.  .)m

### もくじ  
[1.anacondaのダウンロード](#number1)    
[2.モジュール（open cv）のダウンロード](#number2)  
[3.モジュールの保存先を表示させる](#number3)  
[4.参考文献](#number4)
<br>
<br>
<br>
<div id="number1"></div>
## 1.anacondaのダウンロード  
**まず始めに確認しとくのをおすすめします**  

anacondaのインスートーラーを開いたら  
> Add Anaconda to my PATH environment variable  

の選択肢があると思いますが、  
ドMじゃないなら**絶対にチェック**を入れた方がいいです。  
<br>
<br>
保存先もデフォルトをおすすめします
**後で設定変えるのにググった時にサイトと違うと後悔します**
<br>
<br>  
あと、初心者の方は**python3.6 version**の方をインストールする方が絶対にいいです。  
Python2.7は2020年からサポートが切れるのでアプデも無ければ寿命も短いからです。

[インスートーラーはこちら](https://www.anaconda.com/download/#macos)
### 変態の方へ  
環境構築の設定からPathを設定するのですが、
僕みたいな素人には激ムズでした(´・ω・ ｀)  
http://ac-stegral.hateblo.jp/entry/2018/04/17/005218
<br>
<br>
<br>
<div id="number2"></div>
## 2.モジュール（open cv）のダウンロード
とりあえず環境構築します。[参考文献はこちら](https://qiita.com/py_iK/items/a865349fa8f0c663eb25)    
画像の場所をクリックしたらコマンド入力(https://firebasestorage.googleapis.com/v0/b/type-c1c71.appspot.com/o/M25LQi7gEaRsffaR%2FX2uqCI9ImpRkuzEt.jpg?alt=media&token=f4cf1dea-7766-44e3-b023-e3854160b8b6)

環境構築のお作法としては  

```python:

conda create -n [好きな名前] python=[バージョン] anaconda

```

が公式なので、

```python:

conda create -n test python=3.6.5 anaconda

```  

と打ちこんでおきましょう  
**Proceed([y]/n)?**は**y**です  
<br>
windowsユーザーの場合、

```python:

activate test

```

です。  
<br>
MacやLinuxユーザーの場合

```python:

source activate test

```

です。
<br>
<br>
<br>
次に**anaconda navigator**を用いてopencvのインストールです。
![M25LQi7gEaRsffaR/wRN2WLNmtVIsnhWb.jpg](https://firebasestorage.googleapis.com/v0/b/type-c1c71.appspot.com/o/M25LQi7gEaRsffaR%2FwRN2WLNmtVIsnhWb.jpg?alt=media&token=9f94c39f-eccf-45d2-bac1-c31152f0a5bb)
1.Environmentsを選択  
2.制作した環境（test）を選択  
3.選択を”Not installed”にする  
4.検索ボックスに”opencv”と入力  
5.opencvのチェックボックスを入れる  
6.apllyをクリック  
<br>
<br>
最後に（3）の選択肢のところでintalledなどを見たりする事でちゃんとインストールされてるのか確認してみてください  
<br>
<br>
<br>
<div id="number3"></div>
## 3.モジュールの保存先を表示させる  
[]の中を打ち込んでください

```python:

>[python]
  
>>>[import cv2]
>>>[cv.__file__]
(保存先のアドレスが表示される)

```

で表示されます  
<br>
<br>
これによって、drop boxにコピーをすればraspberryPIやiPhoneで流行りのpythonistaに**流用することができます。**
近々記事を書く予定なので乞うご期待！！！
<br>
<br>
<br>
<div id="number1"></div>
## 4.参考文献
http://ac-stegral.hateblo.jp/entry/2018/04/17/005218  

https://qiita.com/py_iK/items/a865349fa8f0c663eb25  

https://qiita.com/ajitama/items/c0166a9a0cd23292b711
Elasticsearch への問い合わせ (Node.js)

こちらで作成したデータに Node.js で問い合わせをします。
[Elasticsearch へのデータ投入](https://qiita.com/ekzemplaro/items/b6dda109ffe19b3c39c8)


```js:elastic_query.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	elastic_query.js
//
//						Mar/21/2022
//
// ---------------------------------------------------------------
'use strict'

import * as http from "http"

console.error ("*** 開始 ***")


const url = "http://localhost:9200/blog/_search?q=tags:apple,moon"

const options = {
  method: 'GET'
}

const req = http.request(url,options, res => {
	console.log(`statusCode: ${res.statusCode}`)

	res.on('data', dd => {
//	process.stdout.write(dd)
	const dict_aa = JSON.parse (dd)
	const llx = dict_aa['hits']['hits'].length
	console.error ("llx = " + llx)
//	console.log(dict_aa['hits']['hits'])

	for (var it =0; it< llx; it+=1)
		{
		console.log(dict_aa['hits']['hits'][it]['_id'])
		console.log(dict_aa['hits']['hits'][it]['_source'])
		console.log()
		}
	console.error ("*** 終了 ***")
	})
})

req.on('error', error => {
	console.error(error)
})

req.end()

// ---------------------------------------------------------------
```

```json:package.json
{
  "type": "module"
}
```

実行結果

```text
$ ./elastic_query.js
*** 開始 ***
statusCode: 200
llx = 2
t002
{
  name: '田中康夫',
  title: 'My Name Is Tanaka',
  content: 'I love cat',
  tags: [ 'Earth', 'Moon', 'Mars' ]
}

t003
{
  name: '渡辺五郎',
  title: 'My Name Is Watanabe',
  content: 'I love fish',
  tags: [ 'apple', 'orange', 'banana' ]
}

*** 終了 ***
```

次のバージョンで確認しました。

```text
$ node --version
v17.7.2
```
github にpushしてherokuにあげるまでの流れ

<h1>今回の目標</h1>
作成したアプリケーションをgithubにpushし、
さらにherokuにあげるとこまでやっていきたいと思います！
いつもherokuにあげるところでつまずくので、復習がてら整理してやっていこうと思います。

初心者なので
おめ、そこちげーよww
というところがあったらビシバシお願いしますっ！！

<h1>githubに新しいリポジトリを作成する</h1>
your repository　のページの New　ボタンから作成していきます。
作成すると表示される、SSHプロトコルURLをコピーしておきます。

 <h3>gitリポジトリの送り先SSHを登録する</h3>

```
$ git remote add origin コピーしたSSHプロトコルURL
```

以下のコマンドで確認できます

```
$ git remote -v
```

こうしておくことで、いちいちSSHプロトコルURLをコピーしてきて、はっつけて、、
という手間を省けます
<h1>commitからのpush</h1>

初回だけ、下記のコマンドでリポジトリの初期化を行います

```
$ git init
```

次にステージングへ移動させます

```
$ git add .
```

できているか下のコマンドで確認できます

```
$ git status
```

リポジトリにcommitします。
この時、必ず　'　'　のなかに　”何を行なったのか”　をなるべく<strong>具体的に</strong>書いておきます。

```
$ git commit -m 'message'
```

さっきSSHプロトコルURLを登録したので、以下のコマンドで指定したリポジトリにpush
することができます

```
$ git push origin master
```

これでgithubにあげることができました！
githubのページからちゃんとあがっているか確認してみましょう！


<h1>herokuにデプロイ</h1>
それではいよいよherokuにデプロイしていきます！（ドキドキ）

カレントディレクトリを確認して、新しくアプリを作成します。
herokuの無料版では４つまでしかアプリを作成できないので注意です！

```
$ heroku create
```

そしたらherokuにもpushします！

```
$ git push heroku master
```

ここで注意したいのは、自分が今いるアプリを確認すること。
２つ目以降だと、違うアプリにいるから無理！と怒られることが多々ありました。
以下のコマンドでアプリ名を確認してからpushする！

```
$ heroku info
```

以上！！！
anacondaからモジュール（open cv）の追加まで

# anacondaからモジュール（open cv）の追加まで
### はじめに
anacondaの導入から、モジュールの追加と保存先を調べるところまでをすぐに忘れるからメモついでに残しておく  
**windows**で実験しました。  
MacやLinuxの方法を記しておきますが、動くかわかりません…  
すみませんm(.  .)m

### もくじ  
[1.anacondaのダウンロード](#number1)    
[2.モジュール（open cv）のダウンロード](#number2)  
[3.モジュールの保存先を表示させる](#number3)  
[4.参考文献](#number4)
<br>
<br>
<br>
<div id="number1"></div>
## 1.anacondaのダウンロード  
**まず始めに確認しとくのをおすすめします**  

anacondaのインスートーラーを開いたら  
> Add Anaconda to my PATH environment variable  

の選択肢があると思いますが、  
ドMじゃないなら**絶対にチェック**を入れた方がいいです。  
<br>
<br>
保存先もデフォルトをおすすめします
**後で設定変えるのにググった時にサイトと違うと後悔します**
<br>
<br>  
あと、初心者の方は**python3.6 version**の方をインストールする方が絶対にいいです。  
Python2.7は2020年からサポートが切れるのでアプデも無ければ寿命も短いからです。

[インスートーラーはこちら](https://www.anaconda.com/download/#macos)
### 変態の方へ  
環境構築の設定からPathを設定するのですが、
僕みたいな素人には激ムズでした(´・ω・ ｀)  
http://ac-stegral.hateblo.jp/entry/2018/04/17/005218
<br>
<br>
<br>
<div id="number2"></div>
## 2.モジュール（open cv）のダウンロード
とりあえず環境構築します。[参考文献はこちら](https://qiita.com/py_iK/items/a865349fa8f0c663eb25)    
画像の場所をクリックしたらコマンド入力します。
  ![M25LQi7gEaRsffaR/X2uqCI9ImpRkuzEt.jpg](https://firebasestorage.googleapis.com/v0/b/type-c1c71.appspot.com/o/M25LQi7gEaRsffaR%2FX2uqCI9ImpRkuzEt.jpg?alt=media&token=f4cf1dea-7766-44e3-b023-e3854160b8b6)

環境構築のお作法としては  
```
conda create -n [好きな名前] python=[バージョン] anaconda
```
が公式なので、
```
conda create -n test python=3.6.5 anaconda
```  
と打ちこんでおきましょう  
**Proceed([y]/n)?**は**y**です  
<br>
windowsユーザーの場合、
```
activate cv2install
```
です。  
<br>
MacやLinuxユーザーの場合
```
source activate cv2install 
```
です。
<br>
<br>
<br>
次に**anaconda navigator**を用いてopencvのインストールです。
![M25LQi7gEaRsffaR/wRN2WLNmtVIsnhWb.jpg](https://firebasestorage.googleapis.com/v0/b/type-c1c71.appspot.com/o/M25LQi7gEaRsffaR%2FwRN2WLNmtVIsnhWb.jpg?alt=media&token=9f94c39f-eccf-45d2-bac1-c31152f0a5bb)
1.Environmentsを選択  
2.制作した環境（test）を選択  
3.選択を”Not installed”にする  
4.検索ボックスに”opencv”と入力  
5.opencvのチェックボックスを入れる  
6.apllyをクリック  
<br>
<br>
最後に（3）の選択肢のところでintalledなどを見たりする事でちゃんとインストールされてるのか確認してみてください  
<br>
<br>
<br>
<div id="number3"></div>
## 3.モジュールの保存先を表示させる  
[]の中を打ち込んでください
```  
>[python]
  
>>>[import cv2]
>>>[cv.__file__]
(保存先のアドレスが表示される)
```
で表示されます  
<br>
<br>
これによって、drop boxにコピーをすればraspberryPIやiPhoneで流行りのpythonistaに**流用することができます。**
近々記事を書く予定なので乞うご期待！！！
<br>
<br>
<br>
<div id="number1"></div>
## 4.参考文献
http://ac-stegral.hateblo.jp/entry/2018/04/17/005218  

https://qiita.com/py_iK/items/a865349fa8f0c663eb25  

https://qiita.com/ajitama/items/c0166a9a0cd23292b711
表示領域に入ったらフェードイン

##スクロールして表示領域に入ったら要素フェードインするメモ

・元の位置から下にずらず値、元に戻す値を連想配列に

```javascript
var balloon = { //動きの値を連想配列に
    'init' : {'position':'relative' , 'bottom':'-100px' , 'opacity':'0.1'},
    'move': {'bottom': '0', 'opacity': '1'}
}
```


・アニメーションの動きを連想配列に

```javascript
var animateOptions = { duration: 500, queue: true };
```

・要素が表示範囲内に入っているかを判定する関数

```javascript
function isScrolledIntoView(elem) {
    var docViewTop = $(window).scrollTop();
    var docViewHeight = $(window).height();

    var elemTop = $(elem).offset().top;

    return (docViewTop > elemTop - docViewHeight + docViewHeight/7);
}
```

・動きの処理

```javascript
//吹き出し要素の初期位置を移動
$(function(){

  //吹き出し要素の初期位置を移動
  //複数要素に足してなのでeach
  $('セレクター').each(function() {
      //要素のcssに連想配列の値を反映、元の位置からずらす
      $(this).css(balloon['init']);
  });

  $(window).on('scroll', function() {
      //複数要素に足してなのでeach
      $('セレクター').each(function() {
　　　　 //要素が表示領域に入っていれば下記を実行
        if (isScrolledIntoView(this)) {
          //アニメーションでもとの位置に戻す、アニメーションの値はanimateOptions配列
          //位置を戻す値のballoon['move']にアニメーションしていく
          $(this).animate(balloon['move'], animateOptions);
        }
      });
  });


});//$(function(){
```
at coder beginner 051

B

```
#include<iostream>
using namespace std;
int main() {
	int K, S;
	cin >> K >> S;
	int count = 0;
	for (int i = 0; i <= K; ++i) {
		for (int j = 0; j <= K; ++j) {
			if (S - i - j <= K&&S-i-j>=0)
				count++;
		}
	}
	cout << count << endl;
	return 0;
}
```
久しぶりに。リハビリ的な問題。

C
イルカは x 軸正方向を右、y 軸正方向を上とする 2 次元座標平面にいます。
イルカは現在点 (sx,sy) にいて、1 秒あたり上下左右に距離 1 だけ進むことができます。
このとき、移動前と移動後の x 座標、y 座標はともに整数でなければなりません。
イルカはここから sx<tx と sy<ty を満たす点 (tx,ty) に行き、その後点 (sx,sy) に戻り、また点 (tx,ty) に行き、その後点 (sx,sy) に戻ります。
このとき、イルカは点 (sx,sy) と点 (tx,ty) を除いて、途中で同じ座標を複数回通らないように移動しなければなりません。
このような条件を満たすイルカの最短経路を 1 つ求めてください。 

```
#include<iostream>
using namespace std;
int main() {
	int sx, sy, tx, ty;
	cin >> sx >> sy >> tx >> ty;
	for (int i = 0; i < ty - sy; ++i) {
		cout << 'U';
	}
	for (int i = 0; i < tx - sx; ++i) {
		cout << 'R';
	}
	for (int i = 0; i < ty - sy; ++i) {
		cout << 'D';
	}
	for (int i = 0; i < tx - sx; ++i) {
		cout << 'L';
	}
	cout << 'L';
	for (int i = 0; i <= ty - sy; ++i) {
		cout << 'U';
	}
	for (int i = 0; i <= tx - sx; ++i) {
		cout << 'R';
	}
	cout << 'D' << 'R';
	for (int i = 0; i <= ty - sy; ++i) {
		cout << 'D';
	}
	for (int i = 0; i <= tx - sx; ++i) {
		cout << 'L';
	}
	cout << 'U';
	return 0;
}
```
一度通ったマスは通れないとはどういうことか考えればすぐにとけるっぽい
wgetとgrepに関する覚書

# Unix系ダウンローダの主なソフトウェア：
- Wget：クローリング機能あり、複数一括ダウンロード、リンク辿る機能あり
- cURL：HTTPレスポンス表示、様々なHTTPリクエストを送信可能、API用途

# wgetの使用例
ex）
```
wget http://url/ -O filename.txt　#指定したファイル(filename.txt)に出力
```
```
wget http://url/ -q -O - #標準出力へ出力、且つ-qで進捗出力抑制
```
```
wget http://url/ -r #リンクを辿って再帰的にダウンロード
```

# grepを使って特定タグ一覧を得る
ex)
```
$ cat detail\?pk\=*|grep "h1 class=\"title\""
```
result)

      <h1 class="title">お知らせ</h1>
      <h1 class="title">【速報】について</h1>
      <h1 class="title">お知らせ</h1>
      <h1 class="title">お知らせ</h1>

# 特定文字列一覧をタグなど除いて抽出するためcutとsedを使う
ex)
```
$ cat detail\?pk\=*|grep "h1 class=\"title\""|cut -d ">" -f 2|sed 's/<...//g'
```
※sedでは"<"に続く任意の3文字を表現している
result)

    お知らせ
    【速報】について
    お知らせ
    お知らせ


# grepで文中に特定文字列を含むファイル名を得る
ex)
```
$ grep -l KSK detail\?pk\=*
```
result)

    detail?pk=72
LAPACK/BLAS の設定メモ （mac）

# 動作環境

macOS High Sierra 10.13.6
LAPACK 3.8.0
gcc 4.2.1
gfortran 8.2.0
make 3.81
cmake 3.12.2

# ダウンロード

以下のアドレスからダウンロードできる．
http://www.netlib.org/lapack/lapack-3.8.0.tar.gz

# ビルド

- 任意の場所に lapack-3.8.0 を解凍し，そのディレクトリへ移動する．

- make.inc.example の内容を make.inc へコピーする．

```
$ cp make.inc.example make.inc
```

- 以下のように make する．

```
$ make blaslib
$ make lapacklib
$ make cblaslib
$ make lapackelib
```

上記の操作で， librefblas.a， liblapack.a， libcblas.a， liblapacke.a の4つのファイルが得られる．

- 4つの静的ライブラリファイルを /usr/local/lib へコピーする．

```
$ sudo cp ./librefblas.a /usr/local/lib/libblas.a
$ sudo cp ./liblapack.a /usr/local/lib/liblapack.a
$ sudo cp ./libcblas.a /usr/local/lib/libcblas.a
$ sudo cp ./liblapacke.a /usr/local/lib/liblapacke.a
```

- include ファイルを /usr/local/include へコピーする．

```
$ sudo cp ./CBLAS/include/cblas*.h /usr/local/include/
$ sudo cp ./LAPACKE/include/lapacke*.h /usr/local/include/
```

# 動作確認

以下のサイトを参考にしたプログラムで動作確認した．

http://www.netlib.org/lapack/lapacke.html

```C:hoge.c
/* Calling CGEQRF and CUNGQR to compute Q without workspace querying */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <lapacke.h>
#include <cblas.h>

int main (int argc, const char * argv[])
{
   lapack_complex_float *a,*tau,*r,one,zero;
   lapack_int info,m,n,lda;
   int i,j;
   float err=0.0;
   m = 10;   n = 5;   lda = m;
   one = lapack_make_complex_float(1.0,0.0);
   zero= lapack_make_complex_float(0.0,0.0);
   a = calloc(m*n,sizeof(lapack_complex_float));
   r = calloc(n*n,sizeof(lapack_complex_float));
   tau = calloc(m,sizeof(lapack_complex_float));
   for(j=0;j<n;j++)
      for(i=0;i<m;i++)
         a[i+j*m] = lapack_make_complex_float(i+1,j+1);
   info = LAPACKE_cgeqrf(LAPACK_COL_MAJOR,m,n,a,lda,tau);
   info = LAPACKE_cungqr(LAPACK_COL_MAJOR,m,n,n,a,lda,tau);
   for(j=0;j<n;j++)
      for(i=0;i<n;i++)
         r[i+j*n]=(i==j)?-one:zero;
   cblas_cgemm(CblasColMajor,CblasConjTrans,CblasNoTrans,
               n,n,m,&one,a,lda,a,lda,&one,r,n );
   for(i=0;i<n;i++)
      for(j=0;j<n;j++)
         err=fmax(err,cabs(r[i+j*n]));
   printf("error=%e\n",err);
   free(tau);
   free(r);
   free(a);
   return(info);
}
```

結果は以下のようになった．

```
$ gcc -o hoge hoge.c -llapacke -lcblas -llapack -lblas -lm
$ ./hoge
error=2.384186e-07
```
【Windows10】システムフォント（游ゴシック）を別フォントに変更する

#どぅぅぅぅしても<font color="OrangeRed">游ゴシック</font>になじめなかったので、<font color="OrangeRed">游ゴシック</font>からおさらばすることにした。

**結果**
<font color="OrangeRed">游ゴシック</font> → メイリオに変更した例（gif）
<img src="https://qiita-image-store.s3.amazonaws.com/0/297590/763bdcca-f57b-1aca-b2f8-6553a0cede84.gif"/>

##はじめに
- 実施は自己責任でお願いします。
- <font color="OrangeRed">游ゴシック</font>を代替フォントに切り替えてしまうので、<font color="OrangeRed">游ゴシック</font>が使えなくなります。（アプリ等で「<font color="OrangeRed">游ゴシック</font>」を選択しても代替フォントになります）
- 検証環境（OS）  
エディション：Windows 10 Pro  
バージョン：1709  
OSビルド：16299.547

##<font color="OrangeRed">游ゴシック</font>の代替フォントを定義する
レジストリに以下値を追加する。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]
"Yu Gothic"="Meiryo UI"
"Yu Gothic Bold"="Meiryo UI Bold"
"Yu Gothic Light"="Meiryo UI"
"Yu Gothic Medium"="Meiryo UI"
"Yu Gothic Regular"="Meiryo UI"
"Yu Gothic UI"="Meiryo UI"
"Yu Gothic UI Light"="Meiryo UI"
"Yu Gothic UI Regular"="Meiryo UI"
"Yu Gothic UI Semibold"="Meiryo UI Bold"
"Yu Gothic UI Semilight"="Meiryo UI"
"游ゴシック"="Meiryo UI"
"游ゴシック Bold"="Meiryo UI Bold"
"游ゴシック Light"="Meiryo UI"
"游ゴシック Medium"="Meiryo UI"
"游ゴシック Regular"="Meiryo UI"
```

フォントはお好みで。ここでは「Meiryo UI」を使用しました。
*なお、regファイルは文字コードがUTF16LE（BOMあり）なので、regファイル化する際は要注意。*

#Windows Font Cache Serviceを無効化する
サービスの管理コンソールなどからWindows Font Cache Serviceを選択し、無効化する。
![FUCK.png](https://qiita-image-store.s3.amazonaws.com/0/297590/2b94b624-fcb8-14b2-a84c-7c58afb01711.png)

##<font color="OrangeRed">游ゴシック</font>フォントファイルを削除する
1. **管理者権限のある状態**でコマンドプロンプトを起動する。  
「管理者として実行」など。
1. フォントフォルダへ移動する。  
`cd %windir%\Fonts`
1. <font color="OrangeRed">游ゴシック</font>フォントファイルの所有者をAdministratorsに変更する。  
`takeown /F YuGoth*.ttc /A`
1. <font color="OrangeRed">游ゴシック</font>フォントファイルにAdministratorsのフルアクセス権を与える。  
`icacls YuGoth*.ttc /grant Administrators:F`
1. <font color="OrangeRed">游ゴシック</font>フォントファイルを消す！（のは怖いのでリネーム）  
`ren YuGoth*.ttc YuGoth*.ttc.1`  
*共有違反などで怒られる場合は、あらゆるアプリ（エクスプローラ、ブラウザなど）を終了させてから再実行するとよいかも。*

##フォントキャッシュファイルを削除する
1. **管理者権限のある状態**でコマンドプロンプトを起動する。（前章の続きでも可）  
「管理者として実行」など。
2. フォントキャッシュファイルを削除する。  
`del /S /Q %windir%\ServiceProfiles\LocalService\AppData\Local\*FontCache*.dat`  
`del %windir%\system32\FNTCACHE.DAT`

##Windowsを再起動する
うまくいけば<font color="OrangeRed">游ゴシック</font>からおさらばできているはずです。
TouchScriptとuGUIのInputFieldが変な挙動をしてダメ

初Unityタグです。

症状
------

Unityの標準のGUI(uGUI)のInputFieldを使い、TouchScriptのTouchManagerを追加してから以下の不具合が起きた。

- Windows上のUnity Editor(UnityPlayer?)上で動作させたとき、InputFieldに`s`等の一部のキーが入力できない
- AndroidでInputFieldをタップすると、キーボードと入力欄が表示された瞬間に閉じるため入力できない
    - （タッチしっぱなしだと表示されるので、もう1本の指で入力しようと思えばできる）

環境
------

- Unity 2017.4.10f1, 2017.1.2f1
- Android 8.1.0
- TouchScript 9.0


対応
-----

- `EventSystem`オブジェクトから標準の`Standalone Input Module`コンポーネントを削除する
- `EventSystem`オブジェクトにTouchScriptの`Touch Script Input Module`コンポーネントをアタッチする

ただ、Touch Script Input Moduleはドキュメントもなさそうなので、本当にこの対応で合っているかわからない。。


備考
------

症状は少し違う気がしたが、以下のissueから「Touch Script Input Module」という存在を知り、試したらとりあえず動いたので、面倒だしこれで良いかな、という感じ。

https://github.com/TouchScript/TouchScript/issues/286

Touch Script Input Moduleはドキュメントに無さそう。また、[TouchScriptInputModuleのコード](https://github.com/TouchScript/TouchScript/blob/master/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs#L229)をみると古いコードをコピペしてるように見える。大丈夫かな？（未検証）

差し替えたら操作周りを一通り見直したほうが良さそう。
Sourcetreeのカスタム操作で、masterブランチにマージ済みのブランチを削除する

# 意外と無かったので、Sourcetreeのカスタム操作に登録するバッチファイルを作りました。
```delete_merged_branches.bat
git checkout master
set mergedBranches=`git branch --merged`
setlocal EnableDelayedExpansion
for /F "usebackq delims=" %%g in (%mergedBranches%) do (
	echo "%%g" | findstr "master develop"
	if !errorlevel! equ 1 (
		git branch -d %%g
	)
)
```
## 使い方
1. 上記をコピーして、delete_merged_branches.batとして適当な場所に保存する
2. Sourcetree->ツール->オプション->カスタム操作で実行するスクリプトに、1で保存したdelete_merged_branches.batを指定する(メニュー表示名は、「masterブランチにマージ済みのブランチを削除する」などわかりやすいものを指定)
3. Sourcetree->操作->カスタム操作から、2で作成したカスタム操作を実行する
特定プロセスの物理メモリ量を可視化する一撃必殺ワンライナー　（AWS CloudWatch）

# EC2全体じゃなくて特定のプロセスのメモリ量、可視化したくないですか？
私はしたいです。

## サンプル
```cron:cron
*/5 * * * * mem=$(ps -C java -O rss | grep RlpMaintenance | gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');instance_id=$(curl -s -w '\n' http://169.254.169.254/latest/meta-data/instance-id);aws cloudwatch put-metric-data --namespace RlpMaintenance --metric-name RlpMaintenanceMemory --dimension InstanceId=$instance_id --value $mem --unit "Megabytes"
```

### 説明
ワンライナーを分割して説明します。

#### */5 * * * *
ただのcron式です。お好きにカスタマイズください。
このまま使うと5分間隔です。

#### mem=$(ps -C java -O rss | grep RlpMaintenance | gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');

memという変数を定義しています。
さらに細分化して説明します。

##### ps -C java -O rss
このサンプルではjavaプロセスを対象としています。
この部分だけ発行すると↓のような感じで、立ち上がっているjavaプロセスが全てでてきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/f29065b0-dc9f-8c6e-5dd6-ee7ff5fbcec0.png)

今回はRlpMaintenanceというプロセスの物理メモリを表示するサンプルとなっておりますので、
この結果を↓で一行にしています。
##### grep RlpMaintenance　

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/f77f0498-f886-aef1-3a82-44bd5d35cd29.png)

その後、このプロセスが複数立ち上がっていたときのため、↓で集計しています。
##### gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');　

echo $mem　を実行すると、RlpMaintenanceというプロセスの物理メモリを表示することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/7b9fd845-dc08-02ad-d2ad-48ec3de18a76.png)

#### instance_id=$(curl -s -w '\n' http://169.254.169.254/latest/meta-data/instance-id);
こちらは、稼働しているEC2のインスタンスIDを取得するコマンドになります。
一般的によく利用されてるものですね。

#### aws cloudwatch put-metric-data --namespace RlpMaintenance --metric-name RlpMaintenanceMemory --dimension InstanceId=$instance_id --value $mem --unit "Megabytes"
上記で定義した2つの変数を利用して、cloudwatchにput-metric-dataします。

### Cloudwatchでみてみると
こうなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/b2202e90-ce7c-c701-da40-3d81e211208a.png)

## 汎用化

```cron:cron
*/5 * * * * mem=$(ps -C <プロセス名> -O rss | grep <プロセスを特定する文字列> | gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');instance_id=$(curl -s -w '\n' http://169.254.169.254/latest/meta-data/instance-id);aws cloudwatch put-metric-data --namespace <カスタム名前空間名> --metric-name <メトリクス名> --dimension InstanceId=$instance_id --value $mem --unit "Megabytes"

```

<プロセス名> <プロセスを特定する文字列> <カスタム名前空間名> <メトリクス名>
をカスタマイズすれば、何にでも使えるかと思います。

※EC2にCloudwatchが利用できるロールをつける、
　かつAWS CLIが利用できることが前提です。