OmniAICreator/Qiita-1.07M huggingface dataset:
Python リストのメソッド 

リストのメソッドについて纏めました。
##L.append(x)

リストの末尾に要素を追加します。

```py3:例1
val = ['a','b','c','d','e']
val.append('f')
print(val)
['a', 'b', 'c', 'd', 'e', 'f'] #結果
```

```py3:例2
val = ['a','b','c','d','e']
val.append(['f','g'])
print(val)
['a', 'b', 'c', 'd', 'e', ['f', 'g']] #結果
```


##L.clear()

リスト中の全ての要素を削除します。

```py3:例
val = ['a','b','c','d','e']
val.clear()
print(val)
[] #結果
```

##L.count(x)

引数と一致する要素の数を取得します。

```py3:例
val = ['a', 'b', 'b', 'c', 'c', 'c']
print(val.count('c'))
3 #結果
```

##L.extend(x)

リストの末尾に引数に指定したリストを追加します。

```py3:例
val = ['a', 'b', 'c', 'd', 'e']
val.extend(['f','g'])
print(val)
['a', 'b', 'c', 'd', 'e', 'f', 'g'] #結果
```


##L.index(x, start, end)

第1引数と一致する要素のインデックスを取得します。
第2引数と第3引数を指定することで探索範囲を指定できます。
リストの中に該当する要素が見つからなかった場合はエラー(ValueError)が発生します。

```py3:例1
val = ['a','b','c','d','e']
print(val.index('e'))
4 #結果
```


```py3:例2
val = ['a','b','c','d','e']
print(val.index('d',1,5)) #インデックスが1から4の範囲を探索
3 #結果
```

```py3:例3
val = ['a','b','c','d','e']
print(val.index('f'))
ValueError: 'f' is not in list #結果
```


##L.insert(i, x)

第1引数に指定したインデックスに要素を挿入します。

```py3:例
val = ['a','b','c','d','e']
val.insert(2, 'ab')
print(val)
['a', 'b', 'ab', 'c', 'd', 'e'] #結果
```


##L.pop(i)

指定したインデックスの要素を削除して、要素を返します。
引数を指定しない場合、リストの末尾の要素を削除します。

```py3:例
val = ['a', 'b', 'c', 'd', 'e']
print(val.pop(1))
b #結果

print(val)
['a', 'c', 'd', 'e'] #結果

val.pop()
print(val)
['a', 'c', 'd'] #結果
```


##L.remove(x)

指定した要素を削除します。
リストの中に該当する要素が見つからなかった場合はエラー(ValueError)が発生します。

```py3:例
val = ['a','b','c','d','e']
val.remove('b')
print(val)
['a', 'c', 'd', 'e'] #結果 

val.remove('f')
ValueError: list.remove(x): x not in list #結果
```


##L.reverse()

リストの並び順を反転します。

```py3:例
val = ['a','b','c','d','e']
val.reverse()
print(val)
['e', 'd', 'c', 'b', 'a'] #結果
```

##L.sort(key, reverse)

リストの並び順をソートします。
何も指定しないと昇順、"reverse=True"とすると降順となります。

例3ではkeyパラメータを指定しています。
keyパラメータは要素の比較を行う前に呼び出される関数を指定することが出来ます。

```py3:例1
val1 = [5, 1, 4, 3, 2]
val1.sort()
print(val1)
[1, 2, 3, 4, 5] #結果 
```

```py3:例2
val1.sort(reverse=True)
print(val1)
[5, 4, 3, 2, 1] #結果
```

```py3:例3
val2 = [
[4, 1, 5, 3, 2],
[5, 4, 3, 2, 1],
[1, 2, 3, 4, 5]
]
val2.sort(key=lambda val2:val2[0]) #ラムダ式（無名関数）でval2[0][0]、val[1][0]、val[2][0]の値を比較してソートするようにしています。
print(val2)
[[1, 2, 3, 4, 5], [4, 1, 5, 3, 2], [5, 4, 3, 2, 1]] #結果
```
.screenrcにこれだけは設定しとけっていうオススメ設定

## はじめに
最近tmuxを常用してたのを辞めてscreenに戻ってきたので、その際にしたオススメな設定などを書き残しときます。

# .screenrc設定
## 文字コード
事故る前にとりあえず設定

```
defutf8 on
defencoding utf8
encoding utf8 utf8
```

## おせっかい系OFF
screen起動時のメッセージとエラー時に画面がフラッシュするVisualBellをoffに

```
startup_message off
vbell off
```

## エスケープキー変更
スクリーンを操作する際にはCtrl-aから始める事が多いけど、Ctrl-tに変えるというもの。
Ctrl-aはbash、zshなどを処理する上で『行頭に戻る』という基本的とも言えるキーバインドが設定されているので、これを避けて別のエスケープキーを設定します。
(何故tなのかについてはそういった設定している記事が多く、代替設定としては広く定着していると思うので)

```
escape ^Tt
```
tが嫌ならば、個人的には次点でbでしょうか...(tmuxに合わせて)


## スクロール改善

```
## スクロール行数
defscrollback 10000

## マウススクロール有効
termcapinfo xterm* ti@:te@
```
あと、macのterminal使ってるなら
<img width="666" alt="スクリーンショット 2017-10-27 23.11.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/582eed07-6ec5-8e01-ed5a-601816d121c4.png">
『代替スクリーンをスクロール』をチェック外すとトラックパッドのスクロールがそのまま反映されるようになります。

とは言え、スクロールでも表示がおかしいときもあるので、コピーモードは必ず利用できるように慣れておいたほうが良いです。

```
# デフォルトなら
Ctrl-a [

# エスケープキーをtにした場合
Ctrl-t [
```
.screenならコピーモードが最初からvimの操作体型に近いので、扱いやすいですよね？(by Vim使いの人)

## vimとかlessとかtigとかのバッファを終了時にちゃんと消す
screenを使わないときは消えてくれてたのに、screenを使った途端、vimなどを閉じても画面に残り続けて消えないのはこれが原因

```
altscreen on
```

## 見た目など改善
screenする前はオレンジだったのにscreenを通すと赤になるとかなら、screenが256色対応じゃないかも。

```
defbce on
term xterm-256color
```

但し、macに最初から入っているscreenは256色対応してないので入れ直す必要があるかも。
FYI: https://qiita.com/trapple/items/8ad1b0a7c4fa5b8341b0


# ステータスライン
タブっぽく見せる設定のアレ。
使える色が少ない中、自分が落ち着いた設定はコレ。
左にタブ、右にロードアベレージ(とは言え使ってみたところ、気休め程度のものレベルかなという感じ…)

```
hardstatus alwayslastline "%{= cd} %-w%{= wk} %n %t* %{-}%+w %= LoadAVG [%l] "

# LoadAverage要らない人はこっち
hardstatus alwayslastline "%{= cd} %-w%{= wk} %n %t* %{-}%+w"
```

<img width="799" alt="スクリーンショット 2017-10-27 23.40.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/e13718db-0081-5241-e50d-1a3da870deec.png">

※ 但し、シアンの色が使っているterminalだったり、iTermだったり、PuTTYだったりの設定で見え方が変わります。

ちなみに、ステータスライン上のタブの名前はエスケープキー(Ctrl-tとか)押してShift-Aで名前入力になるので、それでタブ名を固定できます。

```
# デフォルトでは
Ctrl-a A (a じゃなくて Shift-a ですよ)

# エスケープキーをtにした場合
Ctrl-t A
```

[2017/11/05追記]
選択中のタブの白っぽい背景が気に入らなくなってきたので、その後ターミナルのデフォルトの文字色と背景色が反映されるように変えました。

```
hardstatus alwayslastline "%{= cd} %-w%{= dd} %n %t* %{-}%+w %= LoadAVG [%l] "
```

<img width="415" alt="スクリーンショット 2017-11-05 21.22.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/21e1765b-3113-8572-7cfb-24c2fc674760.png">


# デフォルトシェル
マシンに設定されているデフォルトシェルでscreenが始められるように設定。
念のため設定。

```
shell $SHELL
```
## 最後に
とりあえずここまでの設定を反映した.screenrcをここに置いときます。

```
defutf8 on
defencoding utf8
encoding utf8 utf8

startup_message off
vbell off

# 色
# オレンジが赤になるとかならscreenが256色対応じゃないかも
# FYI: https://qiita.com/trapple/items/8ad1b0a7c4fa5b8341b0
# $ brew tap homebrew/dupes
# $ brew install screen
defbce on
term xterm-256color


# ステータスライン
hardstatus alwayslastline "%{= cd} %-w%{= wk} %n %t* %{-}%+w %= LoadAVG [%l] "

# エスケープキー
escape ^Tt

# マウススクロール
termcapinfo xterm* ti@:te@

# スクロール行数
defscrollback 10000

# vimとかlessとかtigとかのバッファを終了時に消す
altscreen on

# デフォルトシェル
shell $SHELL
```

とまぁ、ここまででもたぶん基本のレベルの域を脱していないので、後は各自で設定を加えて各々の.screenrcを育てて行くことをおすすめします。
Arduino IDEでESP32 BLEライブラリを導入

Mr. Neil Kolbanの”ESP32 BLE for Arduino”が2017/10/13に“Arduino core for the ESP32″にリンクされたという事をGitHubのissueで知ったので、最新版に更新しBLEのArduino IDEでの開発環境を導入してみた。
https://github.com/nkolban/esp32-snippets/issues/82
##2017/10/16時点の手順
1. まず、これまでライブラリマネジャーで”ESP32 BLE”で検索してインストールできたライブラリは“Arduino core for the ESP32″の最新版ではコンパイルが通らなかったので削除
2. GitHubから最新の“Arduino core for the ESP32″をダウンロード<br>
https://github.com/espressif/arduino-esp32
3. BLEライブラリはシンボリックリンクとなっており、ZIPでダウンロードしてもlibrary/BLEフォルダは空なので、GitHubのリンク先から改めてダウンロードし、解凍してlibrary/BLEフォルダにコピー<br>
https://github.com/nkolban/ESP32_BLE_Arduino/tree/98cd2290d036a4e27db061a76a512b526ef1cc14
4. あとは、以下の手順で“Arduino core for the ESP32″を上記でダウンロードしたものに入替
    1. Arduino インストールフォルダの hardware フォルダに、espressif フォルダを作成
espressif フォルダの中に esp32 フォルダを作成
    2. 上記で準備した”Arduino core for the ESP32″の中身を esp32 フォルダ内にコピー
    3. espressif\esp32\tools にある get.exe を管理者権限で実行しコマンドプロンプトが消えるまでじっと待つ
    4. Arduino IDEを立ち上げて”ツール”->”ボード”で”ESP32 Dev Module”を選択
    5.  [ファイル] -> [スケッチ例]に”ESP32 BLE Arduino”でexample Sketchが読み込める
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120903/2630d9e1-0b79-82d4-2c77-1920ae40b7c3.png)
Google GeocodingsのGem作った

Google Geocodings APIのラッパーのGemを作りました。

# Why
既存のgemはRailsに依存してるものや作られた時代が古くオプションも対応してないものが上位に上がってきており、シンプルに今のAPIに対応してるものがパッと出てこなかったので作ってみました。
後はgem作ってみたいと思っていた中で、事業の延長線上でシンプルでメンテコストがないものだったからです。

# gem
https://github.com/akichim21/google_geocodings

使い方は簡単で住所から緯度経度は

```ruby
client = GoogleGeocodings::Client.new(API_KEY)
client.geocode("1600 Amphitheatre Parkway, Mountain View, CA")
```


緯度経度から住所は

```ruby
client = GoogleGeocodings::Client.new(API_KEY)
client.reverse_geocode("37.4230474802915", "-122.0843128697085")
```
とすれば

types[], formatted_address, address_components[], postcode_localities[], geometry, partial_match, place_id
のアトリビュートを持つGeocodingクラスが返ってきます。

リクエスト、レスポンスともAPIの名称とほぼ同じです。
https://developers.google.com/maps/documentation/geocoding/intro
Xcode の地味で意外な機能


Xcode のファイルナビゲーターで、特定のファイルを「Option」キーと「Shift」キーを押しながらクリックすると、下記のようなポップアップが出る。

![スクリーンショット 2017-10-27 22.19.17.png](https://qiita-image-store.s3.amazonaws.com/0/98220/d9d5a341-0627-1ce6-a51e-cf531699228a.png)

"which is available in the project navigator"とか"the heads-up display (HUD)"とか呼ばれているらしい。  

上記の画像だと右側の＋記号をクリックすると「左側にタブを追加して開く」、左側のウィンドウに隠れている方の+記号をクリックすると選択したファイルを「新規ウィンドウで開く」という動作になる。

もしくはポップアップ内部にある小さなタブバーの＋ボタンをクリックしても新規タブで開くことができる。

iOSアプリの入門本では記載がなかったような気がするのであまり知られていない？　 



ファイルを開いてから新規タブに移動させたりとか、わざわざ別のウィンドウで開く手間が省ける、という地味で意外な機能。

ネタ元は「[Mastering macOS Programming](https://www.packtpub.com/application-development/mastering-macos-programming)」。

キーボードショートカットキーとかメタキーを押しつつクリック系の操作は覚えると結構便利なんだけどすぐ忘れてしまいがち。
FDPSでヘルツ接触する(かも)(書きかけ)

最近色々あって、何かこう、普段全く使わない脳味噌の部位をスパークさせているもんで、流石にストレスが溜まってきたのでちょっと解放もされてきたし、まぁ、久々にこんな事でも書いてみようかと思って書かんとするものなり。
で、本稿はある程度、DEMとかのイメージがついてる人向けの文章のつもりで、
その辺もよくわからん、という場合は前に書いた何か
https://qiita.com/NatsukiLab/items/476e00fea40b86ece31f
をご参照してくださいませ。

個別要素法
---
個別要素法(離散要素法)みたいに、(大雑把に)固体同士が衝突しあって動くような計算をしたい時に、2つの剛体球間の反発力をどう実装するか、というのは種々マナーがある、ような気がします。
何となく個人的にはヘルツ接触(Hertzian contact)みたいなのが好きなんだけれど、実は書いたことが無かったり。
なので、まぁ、せっかくなのでFDPSにでも載っけて書いてみようかなと思ったメモ書きです、はい。
(最近のQiitaってあまりプログラムしてない記事は消されるらしいけど、しばらく数式しか存在しないこの記事は平気かしら…)

用語
---
さて、まぁまずは話をする前に、用語の導入をしておくわけですが、なんでこんな事をいきなりしだすかというと、少なくとも僕にとっては紛らわしかったからです。
で、何はともあれ用語の導入を…

**弾性**(*elasticity*):何か**あらぬ事**が起きた時、それを解消しようとして働く力
**粘性**(*viscosity*):(↑で誘起された運動を)減衰させようと働く力

です。
ってどういうこっちゃ？まぁまぁ、慌てず慌てず。次で説明しますから。

DEMの基本
---
前と同じように、各粒子の質量を$m$、半径を$r$、位置座標ベクトルを$\vec{x}$、速度座標ベクトルを$\vec{v}$としておきます。
今回はそれに加えて、慣性モーメント$I$と角速度ベクトル$\vec{\omega}$を定義しておきます。
んで、基本的には粒子$i$にかかる力とトルクを$\vec{F}$、$\vec{T}$と定義しておくと、

```math
m_i \frac{\mathrm{d} \vec{v}_i}{\mathrm{d} t} = \sum_j \vec{F}_{ij}\\
I_i \frac{\mathrm{d} \vec{\omega}_i}{\mathrm{d} t} = \sum_j \vec{T}_{ij}\\
```
となるわけです。
で、$ij$粒子ペアに働く力とトルクが果たしてなんぞや、というのが今回のテーマ。

で、$\vec{F}$と$\vec{T}$が果たして何から成るかというと、
接触面に大して垂直に働き、接触を解決しようとする垂直抗力(normal force/torque)成分と、
接線方向に働く成分(tangential force/torque)からなると思う事にします。
なので、

```math
m_i \frac{\mathrm{d} \vec{v}_i}{\mathrm{d} t} = \sum_j (\vec{F}^\mathrm{n}_{ij} + \vec{F}^\mathrm{t}_{ij})\\
I_i \frac{\mathrm{d} \vec{\omega}_i}{\mathrm{d} t} = \sum_j (\vec{T}^\mathrm{n}_{ij} + \vec{T}^\mathrm{t}_{ij})\\
```
と書けます。
というわけで、右辺の4つの項がわかればまぁ問題なさ気。

normal force
---
前回と同じように貫通深度(penetration depth)を以下のように定義しましょ。

```math
d_{ij} = \max\left(r_i + r_j - |\vec{x}_j - \vec{x}_i|, 0 \right)
```
normal forceをどう実装するかですが、とりあえず**ペナルティ法**を考えます。
ペナルティ法とは、「何か**あらぬ事が**起きた時、それを解消しようとして働く力(ペナルティ)」を加えるという方法です。
似たような文面をちょっと前に見たような？
さて、それでどんな力を加えるわけですが、基本的には貫通深度(のべき)に比例して大きくなるようなものにしておけばよさそうです。
これは、粒子の重なりの部分にちょうどバネを差し込んで、縮んだ分押し戻すような感覚で働くので、比喩的にスプリングとか呼ばれます。
一方で、バネで跳ね返すだけだと、粒子が密集してきた時に、延々と粒子が振動しはじめるとか、そういう困った事もあるので、適当に「減衰させようと働く力」を突っ込んでダンプしておく事にします。
これは、単純には速度に比例して大きくなるような抵抗力を突っ込めばいいわけですが、比喩的にダッシュポットとか呼ばれたり無かったり。

さて、まぁともかくそういうわけで、若干天下り的に、

```math
\vec{F}^\mathrm{n}_{ij} = - \frac{4}{3} E_{ij} \sqrt{r_{ij}}d_{ij}^{2/3}\vec{n}_{ij} - c^\mathrm{n} \sqrt{6 m_{ij} E_{ij} \sqrt{r_{ij} d_{ij}}} \left[(\vec{v}_j - \vec{v}_i) \cdot \vec{n}_{ij}\right] \vec{n}_{ij}\\
\vec{n}_{ij} = \frac{\vec{r}_{j} - \vec{r}_{i}}{|\vec{r}_{j} - \vec{r}_{i}|}\\
r_{ij} = \frac{1}{\frac{1}{r_i} + \frac{1}{r_j}}\\
m_{ij} = \frac{1}{\frac{1}{m_i} + \frac{1}{m_j}}\\
E_{ij} = \frac{1}{\frac{1 - \nu^2_i}{E_i} + \frac{1 - \nu_j^2}{E_j}}
```
という事にしておきます。この力をヘルツ接触力と呼びます。
んで、いきなり$E$と$\nu$とかいう未定義の量が出てきたわけですが、これは一声、「硬さ的な量」であると申し上げておきます(正確にはヤング率とポアソン比)、詳しいことはまたのちほど(「のち」があるかわからないけど)。
んで、$c^\mathrm{n}$は、悲しいかな経験的なパラメタです。
大体$10^{-5}$程度だとかなんとか。

tangential force
---
これから書く…
Unity Colliderによる衝突判定

Unityでゲームを作っていて、物体同士の接触を検出したい、となったので
いろいろ調べて試行錯誤した結果をまとめてみる。

検出したい衝突は、

１．プレイヤーが放り投げたボールが地面(Terrain)に着地するとき
２．動的に生成されるブロックに敵キャラクターが接触したとき

#ColliderとRigidBodyの組み合わせ

物体同士の衝突を検出するには、ColliderとRigidBodyを組み合わせて使う。
用途に応じて最適な組み合わせを選ぶ必要があるらしい。
Unity公式マニュアルでは3種類の組み合わせが紹介されている。

ざっと特徴をまとめると、
###静的コライダー
RigidBodyは持たず、Colliderのみを持つゲームオブジェクト。
壁など動きがないオブジェクトに適用することが前提。
このゲームオブジェクトをゲーム中に移動したり、
有効・無効を切り替えるとパフォーマンスが低下する。
###RigidBodyコライダー
ColliderとRigidBodyを持ち、RigidBodyのisKinematicをオフにしたゲームオブジェクト。
物理演算によるシミュレートと衝突判定が必要な場合に最適。
###KinematicRigidBodyコライダー
ColliderとRigidBodyを持ち、RigidBodyのisKinematicをオンにしたゲームオブジェクト。
時々動かしたり有効・無効の切り替えが必要なオブジェクトに最適。　　
<br>
「１．プレイヤーが放り投げたボールが地面(Terrain)に着地するとき」の場合、
ボールは物理演算が必要なのでRigidBodyコライダーに、
地面は静的コライダーとしてTerrainColliderをアタッチしてうまくいった。

「２．動的に生成されるブロックに敵キャラクターが接触したとき」では、
Instantiateで生成するブロックのプレハブはゲーム中位置が動かず、
有効無効を切り替えたいのでKinematicRigidBodyコライダー。
敵キャラクターはCharacterControllerをつけてみたがうまく衝突が検出されない。

いろいろ試行錯誤した結果、
ブロックプレハブはKinematicRigidBodyコライダーでIsTriggerをオンにし、
OnTriggerEnter()で衝突を検出。
敵キャラはCharacterControllerとRigidBodyをつけ、
プレハブから複製されるブロックの名称末尾の「ブロック名（Clone）」の
（Clone）を削除することでうまくいった。
プレハブから生成されたオブジェクトはデフォルトで「プレハブ名（Clone）」となるが、
この（Clone）があるとなぜかうまく衝突が検出されなかった。
【PostgreSQL】内部結合の方法

##内部結合（２つのテーブルを結合）
###table1とtable2をidで結合し、table2のheightが 100 より大きいものだけをtable1からselectする

```sql:sql
select *
    from table1
    inner join table2 on table1.id = table2.id
where
    table2.height > 100;

```
##内部結合（３つのテーブルを結合）
###table1とtable2とtable3をidで結合しtable2のheightが50より大きく且つtable3のheightが100より大きいものだけをtable1からselectする

```sql:sql

select *
   from table1
   inner join table2 on table1.id = table2.id
   inner join table3 on table1.id = table3.id
where
   table2.height > 50
   and
   table3.height > 100

```
railsでuser情報をカラムに追加する方法


1.  viewsのusersのindex.html.slimに```th sortable （項目),(表示項目)```と記述する。
2. またtbodyに```td user.（項目）```と記述する。
3. 記述できる内容はschema.rbに記載されているuser情報のみである。
機械学習でビルの電力需要予測【RandomForest】

前回、SARIMAモデルを用いて電力量の予測を行ったが、うまくいかなかった（とはいえRMSE20kWh未満）。そもそも突発的に変動する（時刻に関係なく）受電電力量を時系列モデルで評価することがそもそも間違いだったのか？
そこで今回は、機械学習（RandomForest)を用いて電力量の予測ができないかを検証した。

#概要
- とあるビルから受電電力量データを受領
- 機械学習を用いて2日先までの48時間分のデータを予測
- RMSE（平均二乗誤差）を用いて予測精度を評価

#条件
- 受領データ
    - 10min毎に計測
    - 計測データは受電電力量のみ
    - 土日祝日を除外
- 目的変数
    - 受電電力量
- 説明変数
    - 遅れデータ(48次,49次,50次遅れ)
    - 曜日データ
    - 時刻データ


```py3:説明変数
LagDF = pd.DataFrame(index=ForecastDF.index)
#1次遅れデータ
LagDF['Lag'] = ForecastDF.shift(48)
LagDF['Lag2'] = ForecastDF.shift(49)
LagDF['Lag3'] = ForecastDF.shift(50)

#曜日データ生成
DateDF = pd.DataFrame()
DateDF['Weekday'] = ForecastDF.index.weekday
DateDF['Time'] = ForecastDF.index
DateDF.index = ForecastDF.index

trainx = pd.concat([LagDF,DateDF['Weekday']],axis=1)
```
追記：2017/11/06
アホなことしてました。
説明変数に曜日データと時刻データもたせたつもりになってましたけど、基本的にダミーデータとして別データにしなきゃ意味ないんですね。。。後日ダミーデータ作成した後に検証します。

受領データを3期間それぞれから1日選択し、適度な学習期間で検証を行った。

|期間名|学習期間|予測期間|
|:--|--:|--:|
|夏期|1Week|2day|
|冬期|1Week|2day|

#結果
検証結果としては、下記のようになっている。比較的良好な結果となったが、突発的に発生する外乱に対応ができていない。

|期間|RMSE[kWh]|
|:--:|--:|
|夏期|15.7|
|冬期|28.3|

## 夏期
![RandomForest00.jpg](https://qiita-image-store.s3.amazonaws.com/0/148213/428771fd-894a-be56-0de9-efa42366aa48.jpeg)

## 冬期
![RandomForest01.jpg](https://qiita-image-store.s3.amazonaws.com/0/148213/bf15de4c-a514-3fd9-520c-a8a50effabb5.jpeg)

#まとめ

- 現状では、使い物にならないが説明変数の選定で精度向上は期待できる。
- 10％程度のずれでは、シビアな管理はできない。これが限界であれば移動平均だけでよい気もする。
【iOS11】NavigationBarのlargeTitlesの文字をカスタマイズする


## はじめに
iOS 11 になって印象的な UI の変更といえば，
設定アプリやミュージックアプリなどのトップに表示される，
でかいフォントの `largeTitles` ですよね。もうお馴染みです。
Apple 純正アプリ以外で使っているアプリをほとんど見ないし，
実際の業務で使うことはあんまりないと思う？のですが，
個人制作のアプリで一部使ってみようと思って色々調べたので備忘録です。

![largeTitles_music.jpg](https://qiita-image-store.s3.amazonaws.com/0/88266/519fe441-4b7d-44b3-f743-294fc3067f93.jpeg "largeTitle_music.jpg")

最初は嫌いだったけど慣れたのか気にならなくなった。

## largeTitles を表示する

とりあえず表示するには，
iOS 11 以降であることが必要で下記のようなコードを書けばよいです。

```Swift:ViewController.swift
self.navigationItem.title = "Settings"

if #available(iOS 11.0, *) {
    // preferslargeTitles を true にする
    self.navigationController?.navigationBar.preferslargeTitles = true
    // .always / .never / .automatic から選ぶ
    self.navigationItem.largeTitlesDisplayMode = .always
} else {
    // iOS 11 未満で何かあれば
}
```

`preferslargeTitles` を設定するのは
`NavigationController` の Root 相当の画面だけでよく，
一度設定すると，push 遷移による遷移先の子画面は全て反映できます。
`true` だと `largeTitles` 適用で `false` だと iOS 10 までと同じです。

`largeTitlesDisplayMode` は 3 つ設定があり，
`.always`，`.automatic`，`.never` から選択します。
英語の意味通りでこの画面だけは設定しないといった場合は
子画面の `ViewController` などで `never` を設定します。

## largeTitles をカスタマイズしたい

アプリでは `NavigationBar` のタイトルは白でカスタムフォントを使っていて
下記のような感じでただ実装しただけだと統一感ない感じになりました。
フォント変えたい・フォントカラー変えたい・・・

![largeTextDefaults.gif](https://qiita-image-store.s3.amazonaws.com/0/88266/91945b12-9fe1-3ffe-c03d-5b621268a65c.gif "largeTextDefaults.gif")

### largeTitleTextAttributes を使う

`NavigationBar` のタイトルをカスタマイズしたように(`titleTextAttributes`) 
`largeTitleTextAttributes` というのがあってこれを使えばよいです。
今回は `AmericanTypewriter` の Bold フォントでフォントカラーは白にしました。

```Swift:ViewController.swift
self.navigationItem.title = "Settings"

if #available(iOS 11.0, *) {
    // preferslargeTitles を true にする
    self.navigationController?.navigationBar.preferslargeTitles = true
    // always / never / automatic から選ぶ
    self.navigationItem.largeTitleDisplayMode = .always
    
    // largeTitlesTextAttributes を使ってカスタマイズ
    self.navigationController?.navigationBar.largeTitleTextAttributes = 
    [NSAttributedStringKey.foregroundColor : UIColor.white,
     NSAttributedStringKey.font : UIFont(name: "AmericanTypewriter-Bold", size: 30)!]
     
} else {
    // iOS 11 未満で何かあれば
}
```

![largeText.gif](https://qiita-image-store.s3.amazonaws.com/0/88266/c1c0ec04-1aa3-df44-20b4-67f7d9e9f665.gif "largeText.gif")

ちゃんとフォントもフォントカラーも変わってくれました。

## おわりに
今回は，iOS 11 から使えるようになった，`largeTitles` の
基本的な実装とカスタマイズについて書きました。

まだまだ受注系の業務アプリだと使うことなさそうですが，
自社プロダクトであったり個人アプリの場合は，
アクセントとしてうまく使える場面があるかなと思います。

ご覧いただきありがとうございました！
こういうやり方もあるよとかこうした方が使いやすいなど
あれば教えていただけたら嬉しいです！！

## 参考

* [largeTitlesTextAttributes](https://developer.apple.com/documentation/uikit/uinavigationbar/2919946-largeTitlestextattributes)
Display#getRotation() の罠


Display#getRotation() は画面の向きによって、 0, 90, 180, 270度 の値が取得できますが、
画面の向き (角度) を取得するときに、端末によって0度の定義が異なっていることがわかりました。

ほとんどの端末では縦向きが0度ですが、
![IMG_3357.JPG](https://qiita-image-store.s3.amazonaws.com/0/95517/f2387b11-d7e6-7685-7113-58346822950e.jpeg "IMG_3357.JPG")

一部の端末では横向きが0度になることがありました。
![IMG_3356.JPG](https://qiita-image-store.s3.amazonaws.com/0/95517/2fd3c9e7-9426-b6d2-b44e-455df693d1d1.jpeg "IMG_3356.JPG")


getRotation の document を読んでみると、自然な向きを基準に画面の角度を返すとあります・・
> Returns the rotation of the screen from its "natural" orientation. The returned value may be Surface.ROTATION_0 (no rotation), Surface.ROTATION_90, Surface.ROTATION_180, or Surface.ROTATION_270. 

自然な向きって・・

# 解決策
今回、「自然な向き」を基準にした角度が返ってきては困る要件だったので、
`getResources().getConfiguration().orientation`
と一緒に向きと角度を判断するようにしました。

# 現象を確認した端末
現在この現象を確認できている端末は次のとおりです。

* Xperia Z4 Tablet

それっぽいのに、現象を確認できなかった端末は次のとおりです。

* Lenovo YT3-X90X (起動画面は横なのに・・)
railsガイドの「アプリケーションを設定する 3.12データベースを設定する」を読んで。

railsでデータベースへの接続は
1　環境変数ENV['DATABASE_URL']
または
2 config/database.yml
のどちらかで設定します。

基本的にconfig/database.ymlより、ENV['DATABASE_URL']が優先されます。
ENV['DATABASE_URL']の情報よりもdatabase.ymlの情報を優先する唯一の方法は、database.ymlで"url"サブキーを使用して明示的にURL接続を指定することです。

例えば

```
$ cat config/database.yml
development:
  url: sqlite3:NOT_my_database
 
$ echo $DATABASE_URL
postgresql://localhost/my_database
 
$ rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"sqlite3", "database"=>"NOT_my_database"}}
ENV['DATABASE_URL']の接続情報は無視されました。
```

config/database.ymlにはERBを記述できるので、database.yml内で明示的にENV['DATABASE_URL']
を使用するのが最善の方法です。
（おそらくherokuにデプロイする時良く見る）

```
production:
  url: <%= ENV['DATABASE_URL'] %>
```
変数名や関数名に困った時に役立つSlackbotを作った


## つくったもの
`codic "翻訳したい言葉"`をSlackで発言すると翻訳してくれるbotを
PythonのSlackbotライブラリとcodicAPIを使用して作成した。
![スクリーンショット 2017-10-22 18.26.32.png](https://qiita-image-store.s3.amazonaws.com/0/23369/0286f5af-12fe-bfcb-94cd-d0031d0e51a7.png "スクリーンショット 2017-10-22 18.26.32.png")


## Slackbotライブラリ

Slackbotライブラリの使い方は下記を参考にした。
[PythonのslackbotライブラリでSlackボットを作る](https://qiita.com/sukesuke/items/1ac92251def87357fdf6)
[PythonでSlackbotを作る(1)](http://blog.bitmeister.jp/?p=3892)

## codic
[codic](https://codic.jp)は、プログラマー・システムエンジニアのためのネーミングツール
![スクリーンショット 2017-10-22 18.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/23369/eaa82afa-3a8e-4333-88af-c5edb272362e.png "スクリーンショット 2017-10-22 18.03.27.png")

ユーザー登録をするとフリープランでも100/hリクエストを下限とする[APIが公開されている](https://codic.jp/docs/api)ので、こちらを利用する。
![スクリーンショット 2017-10-22 18.31.33.png](https://qiita-image-store.s3.amazonaws.com/0/23369/c9b65ecd-7590-76e0-72ce-02bf233fca51.png "スクリーンショット 2017-10-22 18.31.33.png")
またエディタやIDEの[プラグイン](https://codic.jp/plugins)も用意されている。
~~(わざわざbotに翻訳してもらわなくてもプラグインを利用すればいい)~~
![スクリーンショット 2017-10-22 18.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/23369/8d6a09a2-7fc0-bbd8-41e7-a7c20f59a8d1.png "スクリーンショット 2017-10-22 18.21.23.png")

## 実装
### codicのアクセストークンを取得する
ユーザー登録後、プロフィールからアクセストークンの取得ができる。
こちらのページからAPIのステータスも確認可能。
![token.png](https://qiita-image-store.s3.amazonaws.com/0/23369/fbcad810-0db4-51a3-05f1-555022313174.png "token.png")

### コード
```codic_translate.py
# -*- coding: utf-8 -*-
from slackbot.bot import listen_to
import requests

@listen_to(r'^codic\s+\S.*')
def codic_translate(message):
    text = message.body['text']
    temp, word = text.split(None, 1)
    codicURL = 'https://api.codic.jp/v1/engine/translate.json?text={}&casing=lower+underscore'.format(word)
    headers = {
    'Authorization': 'codicのアクセストークン',
    }
    r = requests.get(codicURL,headers=headers)
    codic_response = r.json()
    message.send('"' + word + '"をcodicで翻訳すると')
    message.send(codic_response[0]['translated_text'])
```

## "翻訳したい言葉"をSlackの発言から受け取る
```Python
listen_to(r'^codic\s+\S.*')
def codic_translate(message):
    text = message.body['text']
    temp, word = text.split(None, 1)
```

codic "翻訳したい言葉"という形式の発言があった場合に、
"翻訳したい言葉"を`word`に代入する
## codicAPIから翻訳を受け取る

```Python
    codicURL = 'https://api.codic.jp/v1/engine/translate.json?text={}&casing=lower+underscore'.format(word)
    headers = {
    'Authorization': 'codicのアクセストークン',
    }
    r = requests.get(codicURL,headers=headers)
```

codicAPIのtextとして`word`を投げると翻訳を受け取ることができる。
casingで`camel`,`pascal`,`lower underscore`,`upper underscore`, `hyphen`を選択することも可能

```Python
    codic_response = r.json()
    message.send('"' + word + '"をcodicで翻訳すると')
    message.send(codic_response[0]['translated_text'])
```
Slack上で翻訳を発言する。
CAPTCHAを突破するという論文およびソースコード

画像認識で CAPTCHA を突破するという人工知能ベンチャー Vicarious が雑誌 Science に発表した件です。

## 概要

日本語のニュース記事は http://www.itmedia.co.jp/news/articles/1710/27/news112.html がちゃんと解説しています。CAPTCHA を突破できるというのは無数に論文や研究があるのですが（だから CAPTCHA は無意味とも言われます）、Vicarious は Recursive Cortical Network (RCN) というモデルを作っており、この件が論文の主題です。ディープラーニング（畳み込みニューラルネットワーク）とは異なり、長所は少ないデータ量でも学習できるよと。確率モデル（生成モデル）です。CAPTCHA は無数にバリエーションが作られますが、それを少ないデータ量で学習させたかったようで、それで CAPTCHA を選んだみたいです。

## リンク集

- Scienceの論文
    - http://science.sciencemag.org/content/early/2017/10/26/science.aag2612.full 
    - これは概要だけで、詳細は Supplementary Materials に書かれています。
- 技術の詳細（Supplementary Materials）73ページ
    - http://science.sciencemag.org/content/sci/suppl/2017/10/25/science.aag2612.DC1/aag2612_George_SM.pdf 
- 企業側のブログ
    - https://www.vicarious.com/2017/10/26/common-sense-cortex-and-captcha/ 
    - Science と同じく概要です
- 実装されたソースコード
    - https://github.com/vicariousinc/science_rcn 
    - NumPy で CPU 用に実装されています。コードは短いです。
ubuntu17.10 (cifs-utils 6.7)からNASアクセス時にvers=1.0を付ける必要がでてくる

## 参考

* [mount - 16.04 CIFS "Host is down" but they are not - Ask Ubuntu](https://askubuntu.com/questions/915549/16-04-cifs-host-is-down-but-they-are-not)

> I had the same issue after a client update of the cifs-utils to 6.7-2. And basically the solution from josepcoves and user695658 worked for me. But only the value 1.0 for the mount option 'vers' worked for me. It seems like the default value for the param 'vers' is not 1.0 anymore.


## その他mountオプション

```sh:vers指定(1.0〜3.0まである様子)
mount -t cifs -o vers=1.0
```

```sh:詳細表示
# user名が表示されるのは便利
mount --verbose
```

```sh:ゲストとして接続
mount -t cifs -o guest
```

```sh:port
mount -t cifs -o port=445
```

```sh:netbios名で指定
mount -t cifs -o netbiosname=server1
```

```sh:mode指定
mount -o dir_mode=0777,file_mode=0777
```

```sh:スペース入れられる様子
mount -t cifs //Server-IP-Address/Share-Name \
 -o username=name, password=password /winmount/Share-Name
```

```sh:文字コード指定
mount -t cifs -o codepage=cp932,iocharset=utf8
```
[VB] プレミアムフライデー判定

```basic:LastFriday.vb
Module LastFriday

    Sub Main()
        Dim target As Date = Today
        Dim nextmonthdayone As Date = New Date(target.Year, target.Month, 1).AddMonths(1)
        If target.DayOfWeek = DayOfWeek.Friday AndAlso
            DateDiff(DateInterval.Day, target, nextmonthdayone) < 7 Then
            Console.WriteLine("PREMIUM FRIDAY")
        Else
            Console.WriteLine(target.DayOfWeek.ToString)
        End If
        Console.ReadLine()
    End Sub
End Module
```
feature ブランチを介さずに直接コミットされたログを抽出する

GitFlow でチーム開発している場合など、 master ブランチや develop ブランチに直接コミットすることは禁止するようなルールで運用されている現場は多いと思います。

次のコマンドでルールを無視して直接コミットされてしまっているログの一覧を確認できます。

```:masterに直接コミットされた一覧を抽出
git log --first-parent --no-merges master
```

```:developに直接コミットされた一覧を抽出
git log --first-parent --no-merges develop
```

## オプションの意味

### `--first-parent`

master や develop ブランチのコミットのみに限定 (≒ feature ブランチのコミットを除く)

### `--no-merges`

マージコミット以外に限定。 Pull Request によるマージコミットも除く。
Wio LTEで、mineo au SIMで使ってみる。

#Wio LTE Japan Version で、mineo au SIMで使ってみる。

##環境(2017/10/27)
MacBook 12(2017)
MacOS High Sierra(10.13)
Arduino IDE 1.8.5
Wio LTE Library v1.0.1
Wio LTE Japan Version (SORACOM CONSOLE経由で購入）　v1.0
mineo au MVNO 1 SIM(VoLTE専用)
mineo au 6 SIM(黒SIM)

##SIMの抜き方
SIMの差し方は[公式HP](https://github.com/SeeedJP/WioLTEforArduino/wiki/Hardware-ja) に載っていますが、抜き方が説明されていないので！
写真のように、引き出すことができます。
![IMG_6831.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/694665e1-43fa-e12a-9a4d-0ba364f91742.jpeg)

##開発環境インストール(MacOSXの場合)
(1)Arduino IDE 1.8.5を立ち上げる
(2)[Wio Tracker LTEボードの追加](https://github.com/SeeedJP/WioLTEforArduino/wiki/AddWioLTEBoard-ja)
(3)[Wio LTEライブラリの追加](https://github.com/SeeedJP/WioLTEforArduino/wiki/AddWioLTELibrary-ja)
(4)[libusbのインストール](https://github.com/SeeedJP/WioLTEforArduino/wiki/Installlibusb-ja)
(5)Wio LTEをBOOTボタン押しながらUSB接続もしくは、USB繋いでから、BOOTボタン押しながら、RSTボタンを押すでもOK（書き込みモード）

Arduino IDEで、書き込み際は、ポート番号を指定しなくて良い。
BOOTモードでは、見えない。
プログラム実行時には、USBシリアルポートとして見える仕組み

## 検証プログラム

```c:test.ino
#include <WioLTEforArduino.h>
#include <limits.h>

WioLTE Wio;

void setup() {
  // put your setup code here, to run once:
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(5000);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  delay(3000);

  if(Wio.Activate("mineo.jp", "mineo@k-opti.com", "mineo") == true)
  {
    SerialUSB.println("Activate is True");
  }
  else
  {
    SerialUSB.println("Activate is False");
  }
  
}

void loop() {
  char num[20];
  // put your main code here, to run repeatedly:
  SerialUSB.println("...");
  
  if(Wio.IsBusy() == false) {
    if(Wio.GetPhoneNumber(num,sizeof(num)) > 0) {
      SerialUSB.println(num);
    }
  }

  int rssi = Wio.GetReceivedSignalStrength();
  if (rssi == INT_MIN) {
    SerialUSB.println("### ERROR! ###");
    goto err;
  }

  SerialUSB.print("RSSI:");
  SerialUSB.print(rssi);
  SerialUSB.println("");

err:  
  delay(5000);
}
```

## 実行してみた
### 黒SIM(090-....)
![171027-0009.png](https://qiita-image-store.s3.amazonaws.com/0/33220/dac9a786-c0a2-67d1-a47a-190dc8778dd3.png)

### VoLTE SIM(070-....)
![171027-0007.png](https://qiita-image-store.s3.amazonaws.com/0/33220/636e9293-e393-944b-7480-041fb1423ec0.png)
Mac でターミナルでJavaのバージョンを direnv で切り替える方法

Mac で Java の開発をしており、（IDEではなく）ターミナルから mvn などのコマンドを実行しており、しかも direnv を愛用という人は、僕以外にも何人かいるはずです。

そんな人は、`.envrc` （`direnv edit .` で編集できる）で、以下のようにバージョン指定できると便利ですよね？

```bash
use java 8
```

以下の関数を `~/.direnvrc` に定義してください。

```bash
use_java() {
    if [ "$#" -ne 1 ]; then
    echo "usage: use java VERSION" >&2
    return 1
  fi
  local v
  v="$1"
  if [ "$v" -le "8" ]; then
    v="1.$v"
  fi
  export JAVA_HOME="$(/usr/libexec/java_home -v "$v")"
}
```

 - direnv は `use_xxx` 関数を `use xxx` の形で呼べる
 - Javaのバージョンを切り替えるには環境変数 `$JAVA_HOME` を定義すれば良い
 - Mac では `/usr/libexec/java_home` でインストールされた各JavaのHomeディレクトリを参照で

というのを実装しているだけです。
Atomで保存せずに閉じるとエラーになる


いろんなパッケージを入れながらAtom使っていて いつからか保存せずにタブを閉じようとしたときエラーになるようになった![20171027-180646.png](https://qiita-image-store.s3.amazonaws.com/0/180328/a626ec86-5f77-584c-d823-ffc2d63d3836.png)

この原因がしばらく分からなかったんだけど、今日時間ができたので調べて見た。
(画像はwin10だけど、Macでも起こってた)

# 原因
結果的には「save-session」っていうパッケージが問題だった。

save-session は保存されてないファイルがある状態でAtomを終了させたとき、次回起動で復元してくれるもの。
これを抜いてAtomを再起動すると治った。
多分バージョンの問題


# パッケージ全部抜いて1個1個調べた
パッケージを全部抜いて、
1個1個入れて、
保存してないタブを閉じる。

保存されてないタブに対してアクションしてエラーになるんだから なんとなく分かっても良かった気がするけど。

# 同じ症状が起きてる人が全然いなかった
ネットで調べても調べても同じ症状の人がおらず、半分あきらめてた。
save-session　使ってる人いなかったのかなと思っていろいろ試してたら、消した後でも保存してないファイル復元できた。
Atomがデフォでこの機能持つようになったのか、今入ってるパッケージが持ってるのか、
まあ、機能自体があるならいっか。

同じ症状で原因が違う人いたら、、、頑張って！

おしまい
zabbixアラート発生時にBacklog課題を自動起票する

##はじめに
Backlogは利用していますか？
見やすくてチームでの課題管理/チケット管理に便利ですよね。
無料枠でも1プロジェクト,100MB,10名まで利用できるので、ある程度使えます。

かたやzabbixのみではアラートにコメントがつけられる程度。
通常はアラート発生時の担当者決め、対応状況のシェア、クロージングをやりたいかと思うので、これでは不足かと。
つきましてはzabbixアラート発生時にBacklog課題を起票して、垂れ流しにしない状況を作ります。
そもそも対応不要のアラートは通知しないよう、きちんと設定すべきなんです。

※動作確認環境
CentOS Linux release 7.4.1708
Python 2.7.5
zabbix-server 3.0.12

##インストール/設定
###Backlog準備
既にBacklogスペース、プロジェクトはできているものとします。

####プロジェクトのID確認
プロジェクトオーナーの権限で、プロジェクト設定を開きます。
URLの最後に ?project.id=XXXX との表示があるはずです。これがプロジェクトIDです。

####アラーム用種別の作成
続いてプロジェクト設定→種別にてアラート用の種別を作成します。
![alert.png](https://qiita-image-store.s3.amazonaws.com/0/113912/d4ac661b-4ca5-7ab7-4c6f-dceadb7a7e3b.png)
作成後、アラートの種別を開いてください。URLに issueType.id=XXXXX とあるはずです。これが種別IDです。

####投稿用のユーザ、APIKey発行
zabbix投稿用のユーザを追加します。通知メールを受けたい携帯アドレス等が良いでしょう。
ユーザ名をzabbix、アイコンも登録するともっともらしくなります。
![user.png](https://qiita-image-store.s3.amazonaws.com/0/113912/4aee3c54-4f89-1df6-edd7-893ed8d7266b.png)
携帯アドレスへのメール通知は課題の「追加・更新」時、「自分が登録したのみ」、としておけば不要なメールを抑止することができるでしょう。通知を受けたい方は「すべての課題を受信」で。
![mail.png](https://qiita-image-store.s3.amazonaws.com/0/113912/54d8b884-cbf2-adea-0134-8403bffc32ba.png)
最後に投稿用ユーザにてAPIKeyを発行し控えておきます。

###サーバ設定
####モジュール準備
PythonのRequestsモジュールを用います。

```bash
# pip install requests
```

####Pythonスクリプト
以下のようなスクリプトを /usr/lib/zabbix/alertscripts/ 以下に置きます。
zabbixユーザをオーナにし実行権限を付与してください。

```python:alermpost.py
#!/bin/python
# coding: utf-8
import requests
import sys

def addissue(summary,description,serverity):
    url = "https://(space).backlog.com/api/v2/issues"
    payload={
        'apiKey'      : '(APIKey)',
        'projectId'   : '(プロジェクトID)',
        'issueTypeId' : '(種別ID)',
        'priorityId'  : serverity,
        'summary'     : summary,
        'description' : description,
    }
    r = requests.post(url, params=payload)
    print(r.text)

args = sys.argv
summary     = '【' + args[1] + '】' + args[2]
description = args[4]

if args[3] == 'Information':
    severity = 4
elif args[3] == 'Warning':
    severity = 4
elif args[3] == 'Average':
    severity = 3
else:
    severity = 2

addissue(summary, description, severity)
```
スクリプトにも書いてありますがBacklog課題の重要度について、仮に以下としました。
このあたりはお好みで

|zabbix Severity(深刻度)|Backlog課題重要度|
|:-------:|:--------:|
|(情報) Information|低 (4)|
|(警告) Warning|低 (4)|
|(軽度の障害) Average|中 (3)|
|(その他)|高 (2)|

### zabbix設定
新規にアクションを作成します。

- 実行内容のタイプ：リモートコマンド
- ターゲットリスト：現在のホスト
- 次で実行：Zabbixサーバ
- コマンド：以下の通り

```bash
/usr/lib/zabbix/alertscripts/alermpost.py "{TRIGGER.STATUS}" "{TRIGGER.NAME}" "{TRIGGER.SEVERITY}" "{HOST.NAME1} {ITEM.NAME1} {ITEM.KEY1} {ITEM.VALUE1}"
```
![action.png](https://qiita-image-store.s3.amazonaws.com/0/113912/2c5d6de6-2a96-6aaf-da5d-771e93b12db4.png)

## 動作
アラート発生時に課題が起票され、プロジェクトメンバーにメールが通知されました。
必要に応じて担当者を決めて障害復旧に当たったり、「対応しない」として「完了」するなり運用を決めてください。

![exec.png](https://qiita-image-store.s3.amazonaws.com/0/113912/bb71b627-ef63-2f3c-1f98-8429078e5fbb.png)

無事動作したらzabbixメール通知を止めてもいいかもですね。

##今後
かなり荒削りなので今後、以下のようなことをやりたいですね。

- 本文の内容を人間に解りやすい文章にする
- 大量アラートのスロットリング（親子課題として、まとめた課題を1つ作成できればベスト)
- アラートの内容によってカテゴリーを自動設定する

アラートの運用管理このような向きにはSlack等が良く用いられますが、Backlogもいいですよ。
One Liner Code to Stop and Remove all Docker Containers

One line of source code to stop / remove all <a href="https://mindmajix.com/docker-training">Docker</a> containers:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Visit this page for more info on<a href="https://qiita.com/mochizukikotaro/items/9cb09db35fd1668b9a27"> docker commands</a>
ProcessingとSwiftをWebSocketで直接繋いでみた

ProcessingとSwiftを繋ぎたいだけなのに、
わざわざSocket.IOでNode.jsを経由したりするのがなんだか気持ち悪かったので、
ProcessingのWebsocketsと、SwiftのWebSocket用ライブラリのStarscreamを使用して直接繋いでみました。

今回は、Processingをサーバ、Swiftをクライアントとして開発しました。
なお、諸事情によりSwift3で実装していますが、Swift4でもStarscreamは使用できるはずです。

# 注意
- 動作環境 : Swift3, Processing
- 使用ライブラリ
    - Processing... Websockets
    - Swift... Starscream
- ライブラリ管理ツール... CocoaPods
- 同じWiFiに繋いだ環境のみ使用可能

# 内容
プログラムを書く前にCocoaPodsでStarscreamをインストールしておきましょう。
[CocoaPods.org](https://cocoapods.org/)
[GitHub: daltoniam/Starscream](https://github.com/daltoniam/starscream)

余談ですが、
WebSocketとSocket.IOってプロトコルが違うみたいですね。
最初は一緒に使えるものだと思っていました。
[リアルタイム双方向通信について](http://www.osaka3t.com/socket/realtime.html)


さて、インストールが完了したらプログラムを書いていきましょう。

<img width="300" alt="processing_websockets_server.png" src="https://qiita-image-store.s3.amazonaws.com/0/157646/994cfaac-8b8e-26a9-1e42-0b1bd6c5a1fe.png">

```java:server.pde
import websockets.*;

WebsocketServer wsc;
PFont myFont;
String receivedText = "";
String sendingText = "";

void setup(){
  size(300, 150);
  wsc = new WebsocketServer(this, 5000, "/");
  myFont = createFont("MS Gothic", 20, true);
  fill(255);
}

void draw(){
  background(0);
  textAlign(CENTER);
  textFont(myFont);
  text("Received: " + receivedText, width/2, height/2);
  
  textAlign(CORNER);
  textSize(15);
  text("sending: " + sendingText, 0, height-10);
}

void keyPressed(){
  if(keyCode==ENTER) {
    wsc.sendMessage(sendingText);
    sendingText = "";
  } else {
    sendingText += str(key);
  }
}

void webSocketServerEvent(String msg){
  receivedText = msg;
  // ここに直接
  // text(msg, 100, 100);
  // などと書いても何も描画されなかったので注意
}
```

`webSocketServerEvent()`内で`text()`を使えないのは、
Processingの`draw()`に関係ない関数だからってことなんですかね？


SwiftはStoryBoardでUIを作成しています。

<img width="243" alt="swift_starscream_client.png" src="https://qiita-image-store.s3.amazonaws.com/0/157646/d0c1ccec-6853-0da4-054a-4f2fd67c46ca.png">

```swift:ViewController.swift
import UIKit
import Starscream


class ViewController: UIViewController {
  // pc上でテストするならlocalhostでok
  let socket = WebSocket(url: URL(string: "ws://localhost:5000")!)
  // iPhone上でテストするならプライベートipアドレスで記述
  // let socket = WebSocket(url: URL(string: "ws://192.168.x.x:5000")!)

  override func viewDidLoad() {
    super.viewDidLoad()
    
    socket.delegate = self as? WebSocketDelegate
    socket.connect()
    
    // 受信時に実行される
    socket.onText = {(text: String) in
      self.receivedMessage.text = "Received: \(text)"
      self.receivedMessage.textColor = UIColor.red
    }
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

  @IBOutlet weak var receivedMessage: UILabel!
  @IBOutlet weak var textField: UITextField!
  @IBOutlet func sendMessage(_ sender: UIButton) {
    // 送信内容が空だとエラーが発生するので回避
    if textField.text != "" {
      socket.write(string: textField.text!)
      textField.text = ""
    }
  }
}
```

以上で接続できるはずです。

今回は、Processingでは押されたキーを`sendingText`に追加することにしていますが、
日本語入力などをしたいのであれば、JavaのSwingを利用するといいと思います。
[processing3でAWT/swingを使う。](http://qiita.com/hotman78/items/7691d2cd7c8ee455c8c4)
[Python] プレミアムフライデー判定

今日はプレミアムフライデーですね。

```python
# -*- coding: utf-8 -*-

import datetime
import calendar

def get_premium_friday_list(year):
    pre_fri_list = []
    for month in range(1, 13):
        lastfri = max(week[calendar.FRIDAY] for week in calendar.monthcalendar(year, month))
        pre_fri = '{}-{}-{}'.format(year, month, lastfri)
        pre_fri_list.append(pre_fri)
    return pre_fri_list

def main():
    now = datetime.datetime.now()
    date = now.strftime('%Y-%m-%d')
    if date in get_premium_friday_list(now.year):
        # プレ金だったときのなにか

if __name__ == '__main__':
    main()
```
[terraform] [小ネタ] 配列の各要素の末尾に文字列を追加した配列を返す

terraform 0.12 以降は以下のように for が使えるのでこの記事の方法はいりません。

```tf
variable list_variables {
  type = "list"
  default = [ "var1", "var2", "var3" ]
}

locals {
  new_list = [for item in var.list_variables : "${item}_suffix"]
}
```

---

Rubyならこんなに簡単に書ける。

```ruby
list_variables = [ 'var1', 'var2', 'var3' ]
new_list = list_variables.map { |var| var + '_suffix' }
# p new_list
# [ 'var1_suffix', 'var2_suffix', 'var3_suffix' ]
```

terraformでやろうと頑張ってみて、こんな感じでできた。

```
variable list_variables {
  type = "list"
  default = [ "var1", "var2", "var3" ]
}

new_list = ["${split( ",", "${join("_suffix,", var.list_variables)}_suffix" )}"]

```

上の処理シーケンスを`Java`で実装するとこんな感じ。

```java
final List<String> listVariables = Arrays.asList("var1", "var2", "var3");
final String combinedVariables = listVariables
  .stream()
  .collect(Collectors.joining("_suffix,"))
  + "_suffix";
final String[] newVariables = combinedVariables.split(",");
```

実際にありそうな使い方としては、S3バケット名のリストがあるけど、その配下のオブジェクトに対して権限を付与したいときなど。

```
data aws_iam_policy_document "bucket_policy" {
  statement {
    actions = ["s3:GetObject", "s3:PutObject"]
    resources = ["${split( ",", "${join("/*,", var.bucket_names)}/*" )}"]
  }
}
```


もっといいやり方あったら教えてください。
Spring Data JPA において、@OneToMany に targetEntity = RelatedClass.class を指定した際の挙動について

#概要
先日何気なく Spring Data JPA のエンティティをリファクタリングしていた時にしくっていることを発見したので、その備忘録です。
こんなリレーションがあったとします。

<pre>
|---------------
|Company
|  id
|  employee_id
|---------------
    1
    |
    n
|------------
|Employee
|  id
|  name
|---------------

</pre>

```Company.java
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NoArgsConstructor
@Getter
@Embeddable
public abstract class Company {
    @Id
    private Integer id;

    @OneToMany(targetEntity = Employee.class, fetch = FetchType.EAGER)
    @PrimaryKeyJoinColumn
    protected Set<Employee> employees;
}
```

```Employee.java
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Getter
@NoArgsConstructor
public abstract class Employee {
    @Id
    private int id;

    @Column(name = "employee_id", insertable = false, updatable = false)
    private int employeeId;

    @ManyToOne
    private Company company;
}
```

これらのエンティティ (とその他雑多なエンティティ) に対して JPQL を実行したところ、下記のような SQL が実行されました。

```.sql

select
    distinct many columns...
from
        company company3_
    left outer join
        company_employees employees4_
    on  company3_.id = employees4_.company_id
    left outer join
        employee employee5_
    on  employees4_.employees_id = employee5_.id

```
どうやら、下記のように、JPA では、Company と Employee の関係が ManyToMany の関係があるものとして認識されているようでした。。


<pre>
|---------------
|Company
|  id
|  employee_id
|---------------
    1
    |
    n
|------------
|Company_Employees
|  company_id
|  employee_id
|---------------
    n
    |
    1
|------------
|Employee
|  id
|  name
|---------------
</pre>

#動作の要因について
Company の @OneToMany にて targetEntity 属性で関連を定義していたため、上記動作になったようです。
継承戦略を多用しているので、どうしてもそのような形になってしまうのかと考えていた (要因の一端ではある気がします) のですが、関連を通常の mappedBy に変更することで実行される SQL が変わりました。

```Company.java
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NoArgsConstructor
@Getter
@Embeddable
public abstract class Company {
    @Id
    private Integer id;

    @OneToMany(mappedBy = "company", fetch = FetchType.EAGER)
    @PrimaryKeyJoinColumn
    protected Set<Employee> employees;
}
```

```Employee.java
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Getter
@NoArgsConstructor
public abstract class Employee {
    @Id
    private int id;

    @Column(name = "employee_id", insertable = false, updatable = false)
    private int employeeId;

    @ManyToOne
    private Company company;
}
```
実行される SQL。

```.sql
select
    distinct many columns...
from
        company company3_
    left outer join
        employee employee5_
    on  company3_.id = employee5_.company_id
```
Amazon Simple Email Service の使い方

まず、送受信に使うメールアドレスを、SES Home の Email Addresses で登録します。
テストメールを送って Status を verified にします。
東京リージョンでは、SES は使えません。
私は、オレゴンリージョンを使いました。

![ses_oct2701.png](https://qiita-image-store.s3.amazonaws.com/0/179446/650a5c80-7266-1ac3-2ba6-e154f73b81d0.png)

送信のプログラムです。

```py3:ses_send.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	ses_send.py
#
#						Oct/27/2017
#
# --------------------------------------------------------------------
import boto3
import json
import sys
# --------------------------------------------------------------------
def send_email(to_email, reply, subject, body):
	sys.stderr.write("*** send_email *** start ***\n")
#
	client = boto3.client('ses', region_name='us-west-2')
#
	response = client.send_email(
		Source=reply,
		Destination={ 'ToAddresses': [ to_email, ] },
		Message={
			'Subject': {'Data': subject, },
			'Body': { 'Text': { 'Data': body, }, }
		},
		ReplyToAddresses=[ reply, ],
		ReturnPath=reply
		)
#
	sys.stderr.write("*** send_email *** end ***\n")
#
# --------------------------------------------------------------------
def ses_send_handler(event, context):
	sys.stderr.write("*** ses_send_handler *** start ***\n")
#
	to_email = event["to_email"]
	reply = event["reply"]
	title = event["title"]
	message = event["message"]
#
	sys.stderr.write("to_email = " + to_email + "\n")
	sys.stderr.write("title = " + title + "\n")
	sys.stderr.write("message = " + message + "\n")
#
	send_email(to_email,reply,title, message)
#
	sys.stderr.write("*** ses_send_handler *** end ***\n")
#
# --------------------------------------------------------------------
```

データは、 event.json に入れます。
次の例の場合、aaaa@example.com とbbbb@example.co.jp は登録しておく必要があります。

```json:event.json
{
	"to_email": "aaaa@example.com",
	"reply": "bbbb@example.co.jp",
	"title": "Good Evening PM 17:26",
	"message": "Hello Everybody\nこんにちは\nこれはevent.json\nPM 17:26\n"
}
```
実行コマンドです。

```bash
python-lambda-local -f ses_send_handler ses_send.py event.json
```
Xcode プロジェクトの project.pbxproj のシンタクスエラーを発見する

`project.pbxproj`をやんごとなき事情(react-native のバージョンアップとか…)でコンフリクト解消しながらpatchを当てた後、プロジェクトを開くと

> cannot be opened because the project file cannot be parsed

で syntax error で開けなくなったりする。diff みつつ、どこかが syntax エラーになってるはずだけど解らない…解らない…死ねる…。

そんなとき、xcodeprojer を使うと解決できる。

- https://github.com/mikr/xcodeprojer

を入れた後に lint を実行する。

```
$ xcodeprojer --lint FooBar.xcodeproj/project.pbxproj
File FooBar.xcodeproj/project.pbxproj, line 1061, column 18
                        name = Products;
                             ^
Error: parsing Xcode plist classically failed
```

おおお、ここかー。実際は前の行 `);` 抜けがあって syntax エラーになっていた。発見できてﾖｶｯﾀﾖｶｯﾀ.
SlackbotサービスGeekbotのコマンドの使い方解説する(2017/10/27時点)

日報システムとしてGeekbotを導入したあと、英語ドキュメントを読むのが面倒で何となく使っている人向けにコマンドの使い方をまとめました。

- コマンドの説明
- 状況別コマンド使用例

について書きます。

# コマンド一覧

コマンドは@geekbotに`help`を送ると確認することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86426/3d767895-9689-8a3f-70b5-7f737bfbb174.png)

# 通常コマンド
以下のコマンドはどのタイミングでも送ることができます。

## dashboard

geekbotの管理画面URLを返します。

## report

任意のタイミングでgeekbotに質問開始を要求することができます。

## engagement

**今までの累計回答数**をメンバー毎に確認できます。

## engagement today

**今日の回答数**をメンバー毎に確認できます。

## pause for (x) days

geekbotの**全ての質問**をx日間停止します。

## resume

停止していた質問を再開します。

# 質問中有効コマンド一覧
以下のコマンドはgeekbotからの質問中にのみ有効になります。

## nothing, none, nope, no, -

質問に対する回答をスキップすることができます。スキップした回答は表示されません。
<img width="759" alt="スクリーンショット_2017-10-27_16_44_57.png" src="https://qiita-image-store.s3.amazonaws.com/0/86426/d8f16371-7c18-777a-bfb6-a1703f7b75df.png">

<img width="528" alt="スクリーンショット_2017-10-27_16_42_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/86426/343f48fc-02a2-2e96-4a33-bc935b74b892.png">

## cancel

質問を中止します。

## pause for (x) days

geekbotの**現在の質問**をx日間停止します。

# 状況別コマンド使用例

## 3日間の休暇をとる時

```
自分> pause for 3 days

geekbot> All standups canceled.

自分> report

geekbot> 質問はないよ
↑3日間の質問がキャンセルされてます。
```

レポートを再開したい

```
自分> resume

geekbot> Standups resumed. Now let's get back to work

自分> report

geekbot> You can report to 2 standups End of work #daily_report and Start of work #daily_report
eg. report End of work #press_daily_report
↑質問が再開されます。
```

## 質問があったけどあとで回答したい時

```
geekbot> 今日は何をしましたか？

自分> cancel

geekbot> Standup canceled. Thanks

...（30分後)...

自分> report

geekbot> You can report to 2 standups End of work #daily_report and Start of work #daily_report
eg. report End of work #press_daily_report

質問の時間に待てない場合は、以下のようにして質問を要求します。
自分> report End of work #press_daily_report

geekbot> 今日は何をしましたか？
```
シェルスクリプトで実行時間の長いプログラムをタイムアウトさせて、処理を分ける方法

シェルスクリプトで、コマンドまたはプログラムをたくさん回す機会はよくあります。
その時に、プログラムのバグや、想定外のファイルのせいで膨大な時間がかかってしまうこともしばしばです。
そういうときは、処理時間が一定より長いモノに関してはスキップしたかったり、別の処理をさせたい時があります。
そんなときは、 `timeout` コマンドが便利です。
(Macの場合は gtimeout ってやつを使いました)
使い方は以下です。

```
timeout -sKILL [秒数] [実行するコマンド]
```

指定した秒数たってもコマンドが終了しない場合は、KILLシグナルが送られ、コマンドが強制終了されます。

加えて、タイムアウトしたとき、しなかったときで別の処理をシェルスクリプトが記述したい要望があります。

そんなときは、自分は以下のようにしました。

```
# timeoutコマンド実行 
timeout -sKILL 5 [実行したいコマンド・プログラム] 

# $? が 0 ならば正常終了、それ以外は異常終了                                                                                            
if [ $? != 0 ]; then 

  # タイムアウトしたときの処理
  echo "タイムアウト！！"

else

  # 正常終了したときの処理
  echo "正常終了"

fi
```

このスクリプトは、タイムアウトすれば「タイムアウト！！」と表示され、正常終了すれば、「正常終了」と出るだけのスクリプトです。
`$?`には直前のコマンドの終了ステータスが入るので、これを活用いたしました。

シェルスクリプト内に組み込めば、想定外のファイルやバグに対して時間短縮が可能なのではないでしょうか。
思いつきで作ったので、ベストな方法があれば教えていただきたいです！

【追記】
@tenmyo さんにご指摘いただいたものを反映しました！
ありがとうございました！！

タイムアウト
異常終了
場合分け
Java 8の日付/時刻APIのうち頻繁に使いそうなモノだけの簡潔なまとめ

Java 8の日付/時刻APIについて、実務的に使う頻度の高そうなモノだけを簡潔にまとめました。

# java.time.LocalDateクラス

[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html)

- 特徴
    - LocalDateはimmutable（Calenderはmutableだった）
    - Calenderでは月が0から始まっていたが、LocalDateは1から始まる
        - 月に0を渡すと存在しない日付なので実行時エラーになる
- インスタンス生成系の便利メソッド
    - now
    - of
    - parse

```java
LocalDate a = LocalDate.now();
System.out.println(a); // YYYY-MM-DD

LocalDate b = LocalDate.of(2017, 10, 17);
System.out.println(b); // 2017-10-17

LocalDate c = LocalDate.parse("2017-10-17");
System.out.println(c); // 2017-10-17
System.out.println(c.getYear()); // 2017
System.out.println(c.getMonthValue()); // 10
System.out.println(c.getDayOfMonth()); // 17
System.out.println(c.getDayOfWeek()); // "TUESDAY"
System.out.println(c.getDayOfWeek().getValue()); // 2

LocalDate d = c.plusDays(30);
System.out.println(c); // 2017-10-17 ※immutableなので元の値は変わらない
System.out.println(d); // 2017-11-16
```

# java.time.LocalTimeクラス

[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalTime.html)

- LocalTimeはimmutable
- 24時間で時間を扱い、午前／午後は区別しない

```java
LocalTime a = LocalTime.of(0, 1, 2);
System.out.println(a); // 00:01:02

LocalTime b = a.plusHours(12);
System.out.println(a); // 00:01:02 ※immutableなので元の値は変わらない
System.out.println(b); // 12:01:02
```

# java.time.LocalDateTimeクラス

[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html)

- 基本的な仕様はLocalDate / LocalTimeと同じ

# java.time.format.DateTimeFormatterクラス

[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeFormatter.html)

- LocalDate / LocalTime / LocalDateTime とも、`format`メソッドで使う
- DateTimeFormatterクラスに定義されている定数（フォーマッター）を引数にできる

| フォーマッター | 例 |
|:--|:--|
| BASIC_ISO_DATE | 20171017 |
| ISO_LOCAL_DATE | 2017-10-17 |
| ISO_LOCAL_TIME | 10:15:30 |

```java
LocalDateTime dateTime = LocalDateTime.of(2017, 10, 17, 10, 15, 30);
System.out.println(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); // 20171017
System.out.println(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2017-10-17
System.out.println(dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME)); // 10:15:30
```

# java.time.Durationクラス

[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/time/Duration.html)

- 日付の差、時刻の差を取得できる

```java
LocalDateTime start = LocalDateTime.of(2017, 10, 17, 0, 0);
LocalDateTime end = LocalDateTime.of(2017, 11, 17, 0, 0);
Duration d = Duration.between(start, end);
System.out.println(d.toDays()); // 31（日）
System.out.println(d.toHours()); // 744（時間）
```

**（参考＆注意）**
Java 8には**java.time.Periodクラス**という、期間を取得するためのAPIもあります。
ところが、このAPIは、期間を「○年と○ヶ月と○日」という形式で求めるモノです。
いわゆる「日数」を取得する目的で利用すると期待結果と異なるので、勘違いしないように注意しなければなりません。

```java
LocalDate start = LocalDate.of(2017, 10, 17);
LocalDate end = LocalDate.of(2017, 11, 17);
Period p = Period.between(start, end);
System.out.println(p.getMonths()); // 1ヶ月
System.out.println(p.getDays()); // 0日 （注）期待結果を「31日」と想定しているとバグる
```