OmniAICreator/Qiita-1.07M huggingface dataset:
iOS Swift Google map SDK for iOS 　経路検索

# Google map SDK for iOS で経路検索

## Overview

Google map SDK for iOSを用いた経路検索の際に必要となる、Google が提供しているAPIを用いて、A地点からB地点までの経路を地図上に表示させます。

[Google map Direction API](https://developers.google.com/maps/documentation/directions/intro)

Swift で書かれた経路検索ライブラリー

[keisukeYamagishi/Direction](https://github.com/keisukeYamagishi/Direction)

このライブラリーを使って経路検索を試みてみます。

## Use it

***Via SSH***: 
SSHを使用しての取得方法

```bash
$ git clone git@github.com:keisukeYamagishi/Direction.git
```
***Via https***: 

Http SSLを用いての取得方法

```bash
$ git clone https://github.com/keisukeYamagishi/Direction.git
```
上記の方法でソースコードを取得してくると実際に動作するサンプルコードをみながら使えますので、非常に便利です。

## 簡単に始められます。

default map line width 0.6f
default map color blue

### 推奨される経路の線の色

A library that can convert recommended hexadecimal numbers to colors

[SHColor](https://cocoapods.org/pods/SHColor)

get route!!!!


### Cocoapodsを用いての取得方法

[CocoaPods Direction](https://cocoapods.org/pods/Direction) 

上記リンク先にcocoapods での使用方法が記載されております。

cocoapods が「ない場合はgemにて取得することができます。

下記を参考にしてください。

```bash
$ gem install cocoapods
$ vi ./Podfile
```

If you do not have the google map SDK for iOS

```ruby
target 'Target Name' do
  pod 'Direction'
  # google map SDK for iOS
  pod 'GoogleMaps'
  pod 'GooglePlaces'
end
```
Then, run the following command:

```bash
$ pod setup
$ pod install
```

### 引数

|params|result|type|
|:---|:----|:----|
|from| 経路検索開始位置の緯度経度|String or CLLocationCoordinate2D|
|to  | 経路検索終了位置の緯度経度|String or CLLocationCoordinate2D|
|alternative| 複数の経路を取得したい場合はこの引数をtrueにします。| Bool default false |
|mode|経路検索の種類|DirectionType walking driving bicycling|

### Sample Code

何も指定しない方法、取得できる経路は一つです。

```swift
let direction = Direction(from:"35.6775602107869,139.692658446729",to: "35.707848364433,139.701456092298",mode: .walking)
direction.directionCompletion(handler: { (route) in

    for route in route.routes {
        self.mapView.addDirection(path: (route?.overview_polyline?.points)!)
    }

}) { (error) in
    print (error)
}
```

alternative がtrueになっているので、複数の候補が表示されます。

```swift
let direction = Direction(from: "35.6775602107869,139.692658446729", to: "35.707848364433,139.701456092298", alternative: true, mode: .walking)
            
direction.directionCompletion(handler: { (route) in
　　　　for route in route.routes {
　　　　　　　　self.mapView.addDirection(path: (route?.overview_polyline?.points)!)
  }
}) { (error) in
　　　　print (error)
}
```
[iOS] ラベルのテキストを切り替える

```swift:switchText.swift
extension UILabel {
    /// テキストを切り替える。
    ///
    /// - Parameters:
    ///   - texts: 表示したいテキストを指定
    ///   - intervalSec: 最初のフェードインが始まるまでの間隔秒数
    ///   - fadeinSec: フェードインにかかる秒数
    ///   - fadeoutSec: フェードアウトにかかる秒数
    func switchLabel(texts: [String], intervalSec: TimeInterval, fadeinSec: TimeInterval, fadeoutSec: TimeInterval) {
        var vIntervalSec = intervalSec
        self.alpha = 0
        self.text = texts[0]
        texts.enumerated().forEach { index, text in
            DispatchQueue.main.asyncAfter(deadline: .now() + vIntervalSec, execute: {[weak self] in
                UIView.animate(
                    withDuration: fadeinSec,
                    animations: {
                        self?.alpha = 1
                    },
                    completion: { _ in
                        if texts.count - 1 > index {
                            UIView.animate(
                                withDuration: fadeoutSec,
                                animations: { self?.alpha = 0 },
                                completion: { _ in self?.text = texts[index + 1] })
                        }
                    }
                )
            })
            vIntervalSec = vIntervalSec + fadeinSec + fadeoutSec
        }
    }
}
```
【自分用メモ】よく忘れるSQL

よく忘れるSQLについて、自分用にメモ。
特にテーブル名の挿入位置をよく忘れる。

INSERT INTO 【テーブル名】 VALUES ('【値1】','【値2】','【値3】');

UPDATE 【テーブル名】 SET 【カラム名1】=【値1】,【カラム名2】=【値2】,【カラム名3】=【値3】;

ALTER TABLE 【テーブル名】 ADD 【追加カラム名】 【データ型】(【桁数】) NOT NULL AFTER 【既存カラム名】;

ALTER TABLE 【テーブル名】 DROP COLUMN 【削除カラム名】;


●UNIONとUNION ALL
UNION：重複行を含まない。
UNION ALL：重複行を含む。
SELECT句に指定するカラムの数が同じ、かつデータ型が同じor変換可能でなければならない。
Spacemacsで自動保存設定をする。

Spacemacs（emacs?）の標準のautosave関連の機能は「cacheとして保存する」という機能らしく、最近のエディタのように「自動でファイルを上書き保存する」というものではなかった。
すでに自動保存に毒されてしまっているので色々探した結果、`auto-save-buffers-enhanced`を使えば良いらしいとわかったので、早速導入してみた。

まずはパッケージをインストールしておく。

```lisp
(defun dotspacemacs/layers()
   dotspacemacs-additional-packages '(
                                      ;; 自動保存
                                      auto-save-buffers-enhanced
                                      )
)
```

次に、このパッケージの設定を作成する。

```lisp
(defun dotspacemacs/user-config ()
  ;; auto save buffers enhanced settings
  (require 'auto-save-buffers-enhanced)
  (setq auto-save-buffers-enhanced-interval 1)
  (setq auto-save-buffers-enhanced-quiet-save-p t)
  (auto-save-buffers-enhanced t)
  )
```

設定項目としては、

* auto-save-buffers-enhanced-interval: 自動保存間隔
* auto-save-buffers-enhanced-quiet-save-p: 自動保存時にメッセージを表示するか

を設定した。
他にも、自動保存の対象から除外するための設定などもある。

参考: 
* http://emacs.rubikitch.com/auto-save-buffers-enhanced/
* http://blog.livedoor.jp/tek_nishi/archives/9652783.html
JavaScriptが動かない時に確認すること

js初心者でわりと右も左もわからんよって人対象です。
また、前提として、jsの記述自体は正しいという前提です。

<h2>動かへんって時にまず確認すること</h2>

「js書いて組み込むだけやったんだけど、読み込まれへんわぁ...」

状況を確認するため、chromeのデベロッパーツールのconsoleを確認。

すると、エラーが出ていました。

<font color="Red">Uncaught ReferenceError: jQuery is not defined</font>

jQueryが定義されてないよって言われてますね。

ソースを確認して見ると、

```html
<html>
  <head></head>
  <body>
　　　　・・・・・・・
　　　　・・・・・・・
　　　　・・・・・・・
  <script>
     jQuery(function(){
          alert("Hello")
     });
  </script>
　　　　</body>
</html>
```

「何か足りない...はっ！！srcがねぇ！！」
いつもなんとなく使っているsrc、もちろん意味があります。

`jQueryを読み込む役割`を担っています。
jQueryを使いたいなら先に読み込みなさいということですね。


なので下記を追加しましょう。

 `<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>`


```html
<html>
  <head></head>
  <body>
　　　　・・・・・・・
　　　　・・・・・・・
　　　　・・・・・・・
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script>
     jQuery(function(){
          alert("Hello")
     });
  </script>
　　　　</body>
</html>
```

ここで気をつけるのはsrcの記述する位置です。

```html
  <script>
     jQuery(function(){
          alert("Hello")
     });
  </script>
```
jQueryを定義するよりも前に記述する必要があります。


```html
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script>
     jQuery(function(){
          alert("Hello")
     });
  </script>
```


そうしないと``` <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>```を

記述していても<font color="Red">Uncaught ReferenceError: jQuery is not defined</font>というエラーを吐きます。
srcも追加したのにエラー文一緒じゃん！！ってならないように注意して下さい。

<h2>src追加したけど動かへん時に確認すること</h2>

「srcも追加した。けどまだ動かへんなぁ...」

追加する位置も間違えていない。なのにまだエラーが出る人はURLを確認しましょう。

正しくjQueryを読み込めていない可能性があります。

ソースに追加しているURLをコピーしてブラウザで検索してみて下さい。

`/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license`

こんな感じの文字列から始まる画面が表示されます。
上記のような文字がブラウザに表示されていない場合はURLが間違っている可能性があリます。
確認してみましょう。

<h2>URLも正しいけど動かへんねんけど...</h2>

URLはブラウザで確認して正しいっぽい。

なのにjsが動かない時は再度URLを確認しましょう。

実はsrcで読み込んでいるURLと自分がjsを効かせたいサイトのURLは依存関係にあります。
(正確にはHTTPプロトコルの部分です)

https(保護された通信)から始まるサイトだとjQueryがブロックされ反映されません。

つまり、

サイトのURLが<font color="Red">http://~</font>で始まる場合

[src]
`http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js`　←　ok

`https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js` ←　ok


サイトのURLが<font color="Red">https://~</font>で始まる場合

[src]
`http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js` ←　no

`https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js` ←　ok


上記のhttpから始まるURL以外の書き方で
<font color="Red">//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js</font>というのもあります。
上記はサイトのURLがhttp or httpsのどちらでも動きます。

<h2>まとめ</h2>
確認すること
・srcの有無と位置
・srcのURLが正しいか否か
・srcのHTTPプロトコルはサイトに対応できているのか

以上を確認すると動くようになるかもですね。

<h2>参考サイト</h2>

[“https” だと jQuery が動かない時には](https://www.j-cool.co.jp/blog/?p=6548)
[【jQuery】プログラム動かない時に確認すること](http://mikaduki.info/webprogram/js/jquery/1192/)
Excelのセル値をファイルプロパティに設定できる件

ちょっとこれは役立つかどうかわからないのですが。
なのでどこにも寄稿できない内容なのですが、テクニックとしては面白いのでQiitaさんに投稿します。
VBAを使う人にはもしかしたら何かのケースで役立つかもしれない知識です。
普通、ファイルプロパティといえば、作成日とか作成者が自動で記録されますよね。
Microsoft Officeで作成するものって、独自にユーザー定義の名前でプロパティを作ることができるんです。
さらにExcelであれば、セルの値をプロパティ値に設定でできるんです。
# Excelのプロパティ操作
Excelのプロパティの操作は、ファイルタブで行います。
ファイルタブをクリックするとこんな風にプロパティを表示できます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/26833e3b-f338-b053-c8dd-438c5cba94a3.png" width=50%>
タイトルとかタグとか分類とかはここで入れることができます。
このプロパティのところをクリックすると詳細プロパティが出てきます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/5ba07fc0-dab2-378d-0873-43027ae8e0c2.png" width=50%>
詳細プロパティをクリックするとこんな画面に。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/2f0addaf-d42c-d83d-c373-d09616de53ec.png" width=50%>
この画面では、独自のプロパティ名を設定し、追加できます。
プロパティ名を入力するか、リストから選んで、種類を選んで値を入力し、追加ボタンをクリックすれば、その名前のプロパティに入力した値がセットされます。
# セルの値をプロパティにする
セルの入力値を独自に設定したプロパティの値とすることができます。
そのためにはセルに名前を付けなければなりません。
セルに名前を設定する方法は、
例えばセルA1に「評価対象者」という名前を設定するには、セルB5をクリックして、名前ボックスに「評価対象者」と入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/3556806a-904f-4c02-40e1-23c0e43ca2fa.png" width=50%>
でも、名前を設定するセルがB2からB5まであって一回一回の操作は面倒なので、A2からB5まで選択して、数式タブの選択範囲から作成をクリックします。
するとこんなのが出てくるので、左端列にチェックを入れてOKします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/a34fa96e-edc2-1647-a46d-21317919ce93.png" width=50%>
これで左のA列の入力値が名前となってB列のセルに名前が付きました。
あとは詳細プロパティで、内容にリンクのチェックを入れて、値をドロップダウンリストから選んでプロパティ名を入力して追加していきます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/e931275f-48cb-eedd-f325-72e7a1cdb172.png" width=50%>
次のようにセル内容を変更して
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/f6f3f23d-2350-c5e5-5c03-845b93e37096.png" width=50%>
詳細プロパティを見てみると
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/4692ab50-8d4d-1396-0ffa-4f3550d21eba.png" width=50%>
変わってますね。
結衣のかわいいは１０でもよかった気がします。
# このプロパティをどう使っていくか
というわけでここまではめっちゃすごい感じがするのですが、このユーザー設定のプロパティは、Windows標準の検索方法で検索できませんし、エクスプローラーでも見えません。
このあたりがおしいところで、せめてファイルの検索対象になってくれると嬉しかったりします。
Windowsの検索はExcelファイルの入力値でも検索してくれるので近いところまではできるのですが。
一つだけ読み出す方法があって、VBAでだと読み出せます。

```
ActiveWorkbook.CustomDocumentProperties("プロパティ名").Value
```
これで読み出せます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/c364ade6-4bc5-3596-e268-7d526a73d5f0.png" width=50%>
だから、例えば、セルの決まったところに値を入れられない時は、対象セルに名前を付けておいて、その名前を使ってファイル名を決定したり、いろいろな分岐をしたりというVBAが考えられるかもしれないです。
じゃあセルの名前を読み出すNameプロパティでもいいかもねって話になるかもしれません。
もしかしたら、VBA以外の言語ならセルの名前のNameプロパティは使えなくても、ファイルプロパティは使えるかもしれないからそんな時に使うのかなって思いました。
# まとめ
マイクロソフトさんには、
エクスプローラーの検索で独自のファイルプロパティでも検索できるようにしてほしい。
同じくエクスプローラーで独自のファイルプロパティを表示できるようにしてほしい。
筆者主観では、結衣のかわいさは１０。さとみの大人っぽさも１０。
# 一陸技まとめ

# 一陸技まとめ

## 無線工学B

### マックスウェルの方程式(波動方程式)

- 回転(rot) $ = \nabla \times $
- $ \nabla^2 $
- $ -j \omega \mu $
- $ \sigma + j \omega \epsilon $

### 微小ダイポールの放射抵抗

- $ R_r = 80 \times (\frac{\pi l}{\lambda})^2 $
- 放射電力 $P = I^2 R_r = 80 \times (\frac{\pi I l}{\lambda})^2$

### 絶対利得

- 等方性アンテナを基準とした電力の割合 $ G = \frac{P_Target}{P} $
- 絶対利得の比は実効面積の比 $ G = \frac{A_T（対象の実効面積）}{Ar（等方性アンテナの実行面積）}　　　　\therefore A_T = Ar \times G = \frac{\lambda^2}{4 \pi} \times G$

### 実行面積

- 等方性アンテナの実効面積: $ S = \frac{\lambda^2}{4 \pi} $
- 微小ダイポールの実効面積: $ S_s(A_r) = \frac{3 \lambda^2}{8 \pi} = \frac{\lambda^2}{4 \pi} \times \frac{3}{2} \therefore 微小ダイポールの絶対利得は \frac{3}{2} $

### 電力密度

- 空間の特性インピーダンス: $Z_0 = \frac{E}{H} = \sqrt{\frac{\mu_0}{\epsilon_0}} = 120 \pi$
    - 電界と磁界のエネルギー密度が同じことから $ \epsilon_0 E^2 = \mu_0 H^2$
- 電力密度: $ W = EH = \frac{E^2}{Z_0} = \frac{E^2}{120 \pi} $


### 受信機の電力

- 端子電圧: $ V = \frac{El}{2} $ E: 電界強度, l: 実行長
- 入力電力: $ P_m = \frac{V^2}{R} = (\frac{El}{2})^2 \times \frac{1}{R} = \frac{(El)^2}{4R} $
- $ P = \frac{(El)^2}{4R} = \frac{120 \pi \times W \times l^2}{4 \times 80 (\frac{\pi l}{\lambda})^2} = \frac{3 \lambda^2}{8 \pi} \times W = Ar \times W $  
  $ \because 放射抵抗 R = 80 \times (\frac{\pi l}{\lambda})^2, 電力密度より E^2 = 120 \pi \times W $

### フリスの伝達公式

- $ W_R = \frac{P_T \times G_T}{4 \pi d^2} $
- $ P_R = A_R \times W_R = \frac{A_R P_T G_T}{4 \pi d^2} = (\frac{\lambda^2}{4 \pi} \times G_R) \times (\frac{P_T \times G_T}{4 \pi d^2}) = (\frac{\lambda}{4 \pi d})^2 G_T G_R P_T $

### 自由空間伝搬損失

- 電力 $ P_d $ を放射している等方性アンテナから距離d[m]における電力密度 $ P_t $ は

$$ P_d = \frac{P_t}{4 \pi d^2} $$

- 等方性アンテナ実効面積は、$ S = \frac{\lambda^2}{4 \pi} $ なので受信電力は

$$ P_r = P_d S = \frac{P_t}{4 \pi d^2}\frac{\lambda^2}{4 \pi} = P_d \times (\frac{\lambda}{4 \pi d})^2 $$

- 放射された電力の $ (\frac{\lambda}{4 \pi d})^2 $ が受信側に届くので、その逆数を自由空間伝搬損失とする。

$$ (\frac{4 \pi d}{\lambda})^2 $$


### 自由空間電界強度

- $ E_0 = \frac{\sqrt{30GP}}{d} $
- 受信電界強度: $ E = E_0 \times S(回折係数) \times 2sin\frac{2 \pi h_1 h_0}{\lambda d_1} \times 2sin\frac{2 \pi h_2 h_0}{\lambda d_2}$
PythonでUTF-8のCSVファイルを読み込ませる@Windows




# はじめに

最近、Windows10で日本語を含んだCSVファイルをPythonで扱うことが多いけど `open`を使ってこのように

```python
csv_file = open("./japanese.csv")
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
```

こんな日本語を含んだCSVファイル（UTF-8）を読み込もうとすると、

```japanese.csv
あ,い,う,え,お
か,き,く,け,こ
```
このようなエラーが出てしまう。

```
UnicodeDecodeError: 'cp932' codec can't decode byte 0x82 in position 2: illegal
multibyte sequence
```

エラーが出るたびにググったり、PCの中の同じような処理をしている他のファイルを探すのが面倒なのでコピペ用コードを自分用に投稿します。

# 環境
- Windows 10
- Python 3.6.6


# コピペ用コード

```readCSV.py
import csv

csv_file = open("./japanese.csv", "r", encoding="utf_8", errors="", newline="" )
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

for l in f:
    print(l)
```

実行結果

```
> python read_csv.py
 ['あ', 'い', 'う', 'え', 'お']
 ['か', 'き', 'く', 'け', 'こ']
```

[WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話](https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e)
こちらの記事によると、

>どうやら、デフォルトの場合、文字のコーディングはUTF-8になるのですが、Windows環境を使用しているとデフォルトがcp932でコーディングされるようです。

ということなので、 `encoding="utf_8"`とちゃんと指定しなければいけないんですね。
余計なシートやVBマクロを作らずに、Excel シート名の一覧を抽出する

パラメータシートなどをExcelで作成する際、機能ごとにシートを分けますよね。
10、20とシートが増えるとシート名をコピーして目次を作るのも苦労してしまいます。
そんな自分への備忘としてシート名の一覧を簡単に取得できる方法を残します。

---
# Excel シート名の一覧抽出

(1)　Excel を開く
(2)　Alt + F11 キーを押して VB 画面を開く
(3)　Ctrl + G キーを押して"イミディエイト"ウィンドウを開く
(4)　イミディエイトウィンドウ内に下記のコマンドを貼り付けて、Enter キーを押す

```
For Each i In ThisWorkbook.Sheets: debug.print i.name : next i
```

(5)　"イミディエイト"ウィンドウ内にシート名の一覧が表示されるので好きなようにコピペする

---
以上です。
VSCodeからVimに乗り換えた話

### モチベーション
 - 最近ipadから自宅のPCにsshして作業することが増えてきた
    - 僕は[Termius](https://www.termius.com/)と[Lightning - USB カメラアダプタ](https://www.amazon.co.jp/Lightning-%E3%83%A9%E3%82%A4%E3%83%88%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%AB%E3%83%A1%E3%83%A9%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-%E9%AB%98%E9%80%9F%E3%81%AA%E5%86%99%E7%9C%9F%E3%81%A8%E3%83%93%E3%83%87%E3%82%AA%E8%BB%A2%E9%80%81-9-3%E4%BB%A5%E9%99%8D%E3%81%AB%E5%AF%BE%E5%BF%9C-%E5%84%AA%E3%82%8C%E3%81%9F%E4%BA%92%E6%8F%9B%E6%80%A7-%E9%9B%BB%E6%B5%81500mA%E4%BB%A5%E5%86%85%E3%81%AE%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E5%AF%BE%E5%BF%9C/dp/B07GNFX4NV/ref=pd_lpo_vtph_107_tr_t_2?_encoding=UTF8&psc=1&refRID=V2KCWQZSAWEF0KKKQDSP)を使ってキーボードで作業してます。
 - ssh上のコンソールで使えるエディタは強い
 - ノートPCならGUIのアプリ使えるけどipadとかでやろうとするとデスクトップ共有しなきゃいけなくて無駄に重い
 - これはVimmerになるしかない

### スペック
 - vimはこの前始めたばかり　参照：[vim + tmuxに入門した話](https://qiita.com/shoichi1023/items/6fc92968923f12abb56e)
 - dotfiles作ったのは初めて

### 要件定義
 - IDEっぽい感じにしたい
 - シンタックスハイライトでおしゃれに
 - 見た目はsublimeが好き
 - とりあえずVSCodeでできるスニペットまじ便利だから必須
 - まあ大体VSCodeにしたい

追記(2018/11/16)：対応する括弧をハイライトする際にカーソルを見失うことが多かったため、カーソル色を見やすく変更、カーソルの点滅を止めた。
また、初心者殺しの<C-s>(フリーズするやつ)のために<C-s>で保存できるように変更。

### 注意点
 - (.tmux.confの)clipboardの共有の設定がubuntuに依存しているのでその部分だけ各OS用に変更してください。
    - 参考の[IDEっぽいvim環境を構築する.vimrcを書いた](https://qiita.com/ysm001/items/8ae97cfdaae3f5fe79f4)とか見るといいかも
 - いわずもがなWindowsではパスの指定系全部書き換えです。

## dotfiles

[shoichi1023/dotfiles](https://github.com/shoichi1023/dotfiles)

### 結果得られたもの
 - ファイルツリー
 - vimでタブを増やした際のファイルツリーの共有
 - カラーテーマはsublime-monokai
 - シンタックスハイライト
 - 入力補完
 - スニペット
 - 構文チェック
 - mdプレビュー
 - indent可視化
 - AutoCloseTag
 - surround
 - 選択した範囲を移動(VScodeだとalt？)
 - ファイル名表示、行番号表示
 - コメントアウト切り替え

## KeyBind
### tmux

prefix : <C+t>

水平分割 : -
垂直分割 : \

ペイン移動
上 : k
下 : j
左 : l
右 : h

#
### vim

prefix : s

水平分割 : -
垂直分割 : \

ペイン移動
上 : k
下 : j
左 : l
右 : h

タブ幅
上 : K
下 : J
左 : L
右 : H

新規タブ : t
次のタブへ : n
前のタブへ : p 

:q : q
:w : w
:w : <C-s>
※.bashrc, .zeshrcに

```
stty stop undef
stty start undef
```
の記述が必要。

:wq : wq
:q! : Q

ファイルツリー : <Space+n>(prefixなし)

コードの展開 : <Space+k>(prefixなし)

Tagバーを表示 : <Space+t>(prefixなし)  

vで選択した文字列を任意の文字で囲う　:　S<任意の文字>(prefixなし)
囲われた文字列を別の文字で囲う　:　cs<任意の文字>(prefixなし)
囲われた文字列の囲いを外す　:　ds<今囲われている文字>(prefixなし)  
一単語を任意の文字で囲う　:　ysiw<任意の文字>(prefixなし)  

vで選択して移動 : \<C-(hjkl)>  (prefixなし) 
コメントアウト切り替え : \<C-_ > \<C-_>(prefixなし) 

### 参考
 [IDEっぽいvim環境を構築する.vimrcを書いた](https://qiita.com/ysm001/items/8ae97cfdaae3f5fe79f4)
 
 [Vimの便利な画面分割＆タブページと、それを更に便利にする方法](https://qiita.com/tekkoc/items/98adcadfa4bdc8b5a6ca)
 
 [Vimでタブ使ってる人におすすめのやつ](https://qiita.com/yaginuuu/items/d0a8d045035ab251c96c)
 

みなさんもよいVimライフを！！
Laravelで配列の必須バリデーション

Laravelで配列のバリデーションをかけるときに少し試行錯誤をしたので備忘録と、連想配列の記事はあるけど配列の記事はあんまり無いなーという印象だったので。

*バージョン*
- laravel/framework 5.5.43
- PHP 7.1

*リクエスト例*

```post.json
{
	    "id": 10
	    "select_id":[1,2,3],
	    "images":["bar","foo"],
}
```

### 値を確認する場合

値の型や形式を確認するときはシンプルに実装できる

```HogeRequest.php
public function rules()
    {
        return [
            'id' => 'required|integer',
            'select_id.*' => 'integer',
            'images.*' => 'string',
        ];
    }
```

### プロパティは必須かつ配列であり、配列の値の形式を確認したいとき

こちらは少し冗長になってしまうが、まずプロパティ自体にもかける必要がある。
例えば`'select_id.*' => 'required|integer',` だとrequiredが無視されるので注意。

```HogeRequest.php
public function rules()
    {
        return [
            'id' => 'required|integer',
            'select_id' => 'required|array',
            'select_id.*' => 'integer',
            'images' => 'required|array',
            'images.*' => 'string',
        ];
    }
```
歩く・ジャンプする アクションゲーの基礎的処理【Unity2D】

#アクションゲームの基礎
毎回過去プロジェクトを開くのが面倒なのでメモ。いろいろなところから引っ張ってきてる&ベストな書き方かわからんので自分用ということで……

##ジャンプとか移動とか
```c#:Player
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    Rigidbody2D rb;

    bool leftBool;
    bool rightBool;

    [SerializeField] float playerSpeed;
    [SerializeField] float playerFlap;

    public const int MAX_JUMP_COUNT = 1;    // ジャンプできる回数。
    int jumpCount = 0;
    bool isJump = false;


    void Start () {
        rb = GetComponent<Rigidbody2D>();
	}

    void Update() {
        leftBool = Input.GetKey(KeyCode.A);
        rightBool = Input.GetKey(KeyCode.D);
        if (jumpCount < MAX_JUMP_COUNT && Input.GetKey(KeyCode.Space)) isJump = true;
    }

    void FixedUpdate() {
        if (leftBool) transform.position += new Vector3(-playerSpeed, 0,0);
        if (rightBool)  transform.position += new Vector3(playerSpeed, 0,0);

        if (isJump) {
            // 速度をクリアして2回目のジャンプも1回目と同じ挙動にする。 
            rb.velocity = Vector3.zero;

            // ジャンプさせる。 
            rb.AddForce(Vector3.up * flap);
           // audioSource.PlayOneShot(jumpOto);

            // ジャンプ回数をカウント。 
            jumpCount++;

            // ジャンプを許可する。 
            isJump = false;
        }
    }

    void OnCollisionEnter2D(Collision2D other) {
        if (other.gameObject.tag == "Ground") {
            jumpCount = 0;
        }
    }
}
```

地面にはGroundのタグを付ける。

（逐次追記していきます）
【iPhoneXR,Xs,XsMaxの判別対応】Nativeコード内での判別方法（解像度での判別）

## はじめに
はい。相変わらずのiPhone X対応です。タイトル通りですが、今までXだった場合の判別は画面解像度で判別していましたが、新機種のXs,XR,XsMaxが続々登場ということで対応をすることに。。。
相も変わらず画面解像度での判別です。（他に便利な方法などございましたらコメントよろしくお願いいたします。）
Qiitaとかに記事があるかと探したのですが意外とないので寄稿しますー。

## 各端末解像度について
各端末の解像度は下記のサイトで確認及びシュミレータでの動作確認をしました。
https://www.dorapro.co.jp/engineerblog/?p=255

## 実行環境
Xs,XR,XsMaxをシュミレートする場合、Xcodeをbeta版に更新する必要があります。
https://developer.apple.com/jp/support/beta-software/

## ソースコード
``` objective-c:Device.m

#define ScreenHeight [UIScreen mainScreen].nativeBounds.size.height
#define ScreenWidth [UIScreen mainScreen].nativeBounds.size.width
#define ScreenScale [UIScreen mainScreen].scale
    
// iphoneX以上の端末を判別
+ (BOOL)isIphoneXOver {
    return (Device.isIphoneX || Device.isIphoneXs || Device.isIphoneXR || UIDevice.isIphoneXsMax);
}

+ (BOOL)isIphoneX {
    return [self checkIPhoneSize:1125.0 height:2436.0 scale:3.0];
}

+ (BOOL)isIphoneXs {
    return [self checkIPhoneSize:1125.0 height:2436.0 scale:3.0];
}

+ (BOOL)isIphoneXR {
    return [self checkIPhoneSize:828.0 height:1792.0 scale:2.0];
}

+ (BOOL)isIphoneXsMax {
    return [self checkIPhoneSize:1242.0 height:2688.0 scale:3.0];
}
    
+ (BOOL)checkIphoneSize:(CGFloat)width height:(CGFloat)height scale:(CGFloat)scale {
    static BOOL result = NO;
    if (@available(iOS 11.0, *)) {
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
            result = ((ScreenWidth == width && ScreenHeight == height) && ScreenScale == scale);
        }
    }
    return result;
}
```

[Gist](https://gist.github.com/yoshiki-0428/519e84ae9010f9fb11503a0b907a69cb)

iphoneX以上の場合の判別をしたかったので`isIphoneXOver`というメソッドを追加してX以上の端末の場合Trueが返るような実装にしています。各端末で判別がした場合は`isIphoneX~`以降のメソッドを使用してもらえればと思います。一つ注意する点があり、XとXsは画面解像度とScaleが一緒なので厳密にXとXsの判別ができていないので注意が必要です。（誰か判別方法知ってたらコメントオナシャス。。。）

## まとめ
これから先さらにノッチが付いたAppleの端末が登場するかと思いますが、その場合でも（Appleが判別方法を公開しない限り）こういった対応が必要かと思います。おそらく解像度での判別が一番コストが低く簡単な方法だと考えました。（逆に解像度以外での判別方法をご存知の方がいましたらコメント等よろしくお願いいたします。）
HTML+CSSで注意すること

#html+cssで注意すること
aタグやpタグにclassはふらないほうがよい。
→抽象化すると木構造の末端部分にはclassを指定しないことが多い。
→wordpressなどに組み込むときにバグがおこることが多いから。

じゃあどうすんの？？
→divなどでかこってあげて、そのdivにclassを指定。

こうではなく

```html:html
<a class="sampleClass">サンプル</a>

```

こうしたほうがいいよってこと

```html:html
<div class="sampleClass">
   <a>サンプル</a>
</div>

```
CentOS7にduplicityをインストール

EC2のCentOS7にバックアップソフトウェアのduplicityをインストールします。
duplicityの本家のページは[こちら](http://duplicity.nongnu.org/)

# 必要なパッケージ
READMEのREQUIREMENTSに書いてあります。
http://duplicity.nongnu.org/README

今回はソースからインストールするので

|パッケージ名|バージョン|
|---|---|
|python|2.6以上|
|librsync|0.9.6以上|
|GnuPG|指定なし|
|fasteners|0.14.1以上|
|python-urllib3|指定なし|
|python-dev|指定なし|
|librsync-dev|指定なし|
|intltool|指定なし|

これらが必須。
以下のパッケージはscp/sftpやftp、S3にアップロードするなど用途に応じてインストールします。

|パッケージ名|バージョン|用途|
|---|---|---|
|python-paramiko|指定なし|scp/sftp|
|python-pycryptopp||scp/sftp|
|lftp|3.7.15以上|ftp|
|boto|2.0以上|S3へのシングルププロセスアクセスまたはGCSアクセス|
|boto|2.1.1以上|S3へのマルチプロセスアクセス|
|boto|2.7.0以上|GlacierS3アクセス|

今回はS3を使う予定なのでbotoの2.7以上にしておけばよさそう。

# Install

## epel導入
必要なパッケージの中にはCentOSの基本パッケージにはないものがあるのでepelを導入します。

```
$  yum install epel-release
```

## 必要なパッケージのインストール
必要なパッケージをまるごとインストール。ソースファイルの入手のため`wget`もインストールしています。

```
$ yum install python librsync gnupg python-fasteners python-boto python-urllib3 python-devel librsync-devel intltool wget -y
```

## Duplicityのソースを取得、解凍、インストール
[本家duplicityページ](http://duplicity.nongnu.org/index.html)のMainPageのDownloadsの項目
>The current stable release is 0.7.18.2, released Oct 17, 2018.
>
>Tarball: duplicity-0.7.18.2.tar.gz
>

にダウンロードリンク([https://code.launchpad.net/duplicity/0.7-series/0.7.18.2/+download/duplicity-0.7.18.2.tar.gz](https://code.launchpad.net/duplicity/0.7-series/0.7.18.2/+download/duplicity-0.7.18.2.tar.gz))があります。
新しいバージョンがリリースされていればTarballのところのリンクから最新版のソースをダウンロードできます。

```
$ wget https://code.launchpad.net/duplicity/0.7-series/0.7.18.2/+download/duplicity-0.7.18.2.tar.gz
$ tar xvf duplicity-0.7.18.2.tar.gz
$ cd duplicity-0.7.18.2
$ python setup.py build
$ python setup.py install
$ duplicity --version
duplicity 0.7.18.2
```

インストール完了です。

## 参考
http://duplicity.nongnu.org/
https://www.mogumagu.com/wp/wordpress/archives/1858
EgretEngineで超簡単なゲームを作ってみよう(2) 物理エンジン エクステンションの導入

# 連載記事「EgretEngineで超簡単なゲームを作ってみよう」

[(1) プロジェクト作成＆ビルド] (https://qiita.com/motoyasu-yamada/items/584c46ea7e05601e96fa)
[(2) 物理エンジン エクステンションの導入](https://qiita.com/motoyasu-yamada/items/c5facea39b0102d7a365)
[(3) タップでの操作の実装](https://qiita.com/motoyasu-yamada/items/2ff3762015daccd4ebd3)
[(4) 障害物の実装と各種カプセル化](https://qiita.com/motoyasu-yamada/items/6963428cb3ba5ffc7a64)
[(5) 書き出し編](https://qiita.com/motoyasu-yamada/items/013909a29e65f1f4ec1d)

---
# (2) 物理エンジン エクステンションの導入
こちらの記事[EgretEngineで超簡単なゲームを作ってみよう (1) プロジェクト作成＆ビルド](https://qiita.com/motoyasu-yamada/items/584c46ea7e05601e96fa)で、新規プロジェクトを立ち上げました

今回は、ボールがバスケットのリムにあたった際に自然な動きをさせたいので、物理エンジンを使いたいと思っています。

Document(文档) > Egret extension library(Egret 扩展库) > P2 physical system library (P2物理系统库) にある
こちらのドキュメント[Make a jump game with p2(使用p2制作跳跃游戏) ](http://developer.egret.com/cn/github/egret-docs/extension/p2/p2/index.html)によるとp2というエンジンを使うようです

これのインストールの仕方がどこにもないのでメモをします

# エクステンションをダウンロードする
GitHubからEgretGameLibraryをダウンロードしてください
- https://github.com/egret-labs/egret-game-library にアクセスする
- 「Clone or Download」から「Download Zip」を選択してダウンロードする
- 解凍する

# エクステンションを配置する
- 解凍した中に physicsディレクトリがあります
- このディレクトリ内のlibsrcディレクトリをコピー
- プロジェクトのワークスペースディレクトリと同じ位置にペースト

こんな感じの構成になります
```
c:\workspace\basketballboy
c:\workspace\libsrc
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/c80860dd-176e-db2f-5bc1-9c7f3f490b19.png)

# egretPropertis.jsonを編集する

```diff:egretProperties.json
:
  "modules": [
    {
      "name": "egret"
    },
    {
      "name": "game"
    },
    {
      "name": "tween"
    },
    {
      "name": "assetsmanager"
    },
    {
      "name": "promise"
-    }
+    },
+    {
+      "name": "physics",
+      "path": "../libsrc"
+    }
```

# EgretWingを再起動する

再起動するとegretProperits.jsonが読み込まれモジュールがロードされるようです
以下のようにうまくいっているとlibs/modulesディレクトリにphysicsディレクトリができます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/45223e2c-c69c-68c7-dce2-501776ba3d59.png)
Qiitaで表を投稿しやすくするためにExcelの表にパイプを入れるマクロ

```vb
Sub パイプを入れる()

  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  maxCol = Cells(1, Columns.Count).End(xlToLeft).Column

  For i = 1 To maxRow
    For j = 1 To maxCol
      Cells(i, j) = "|" & Cells(i, j).Text
      If j = maxCol Then
        Cells(i, j) = Cells(i, j).Text & "|"
      End If
    Next j
  Next i
End Sub
```
テスト用途のSFTP/FTPS/FTPサーバーを単独で起動するdocker-compose.ymlの例

SFTP/FTPS/FTPで接続した先のファイルをバッチ処理するプログラムを開発したときに、テストのために用意した`docker-compose.yml`ファイルを共有します。

docker-compose-remote-file-system / GitHub
https://github.com/miyanaga/docker-compose-remote-file-system

`./remote`ディレクトリは、開発マシン単独でローカルファイルシステムとしても、SFTP/FTPS/FTPとしても操作することができます。

![貼り付けた画像_2018_10_25_11_27.png](https://qiita-image-store.s3.amazonaws.com/0/35178/5ac9996a-6ae3-1c1b-14d6-9ad81afe77bf.png)

例えばFTP越しのファイルに対する処理をテストするとき、この`docker-compose.yml`を使うと、以下の手順でテストを記述できます。

1. ローカルファイルとしてテストデータを用意
2. プログラムはFTP経由でそのファイルを処理
3. ローカルファイルとして結果を検証・クリーンナップ

以下の点で嬉しいというものです。

* 別途FTPサーバーを立てるより手間がかからず、テストファイルの扱いが楽で通信も速い
* モックを使うより実際の環境に近く、モックの準備やメンテも不要

# docker-compose.yml

鍵ファイルも必要なので、[GitHubのリポジトリ](https://github.com/miyanaga/docker-compose-remote-file-system)を参照ください。
使い方もREADMEに記載しました。

```yaml
version: "3"
services:
  sftp-without-key:
    image: atmoz/sftp
    volumes:
      - ./remote:/home/sftp-without-key/remote
    ports:
      - "10220:22"
    command: sftp-without-key:pass:1001
  sftp-with-rsa-key:
    image: atmoz/sftp
    volumes:
      - ./remote:/home/sftp-with-rsa-key/remote
      - ./ssh/id_rsa.pub:/home/sftp-with-rsa-key/.ssh/keys/id_rsa.pub:ro
    ports:
      - "10221:22"
    command: sftp-with-rsa-key::1001
  sftp-with-ed25519-key:
    image: atmoz/sftp
    volumes:
      - ./remote:/home/sftp-with-ed25519-key/remote
      - ./ssh/id_ed25519.pub:/home/sftp-with-ed25519-key/.ssh/keys/id_ed25519.pub:ro
    ports:
      - "10222:22"
    command: sftp-with-ed25519-key::1001
  ftp:
    image: wildscamp/vsftpd
    volumes:
      - ./remote:/home/virtual/ftp/remote
    environment:
      VSFTPD_USER_1: "ftp:pass:1001:"
      PASV_MIN_PORT: 30100
      PASV_MAX_PORT: 30109
    ports:
      - "10210:21"
      - "30100-30109:30100-30109"
  ftps:
    image: phpstorm/ftps
    volumes:
      - ./remote:/home/virtual/ftps/remote
    environment:
      VSFTPD_USER_1: "ftps:pass:1001:"
      PASV_MIN_PORT: 30110
      PASV_MAX_PORT: 30119
    ports:
      - "10211:21"
      - "30110-30119:30110-30119"
```
Zabbix3.0→zabbix4.0へアップデート

##前段
業務に使用しているZabbix(ver3.0.22)を4.0へアップデートすべく事前に複製環境でアップデート確認と動作確認を行う
環境：CentOS7

##バックアップ取得
本番環境から現在のZabbixバックアップを取得
(今回は全データ必要ではないので設定値だけバックアップすることにする)

`mysqldump -u root -p --single-transaction --hex-blob --ignore-table=zabbix.alerts --ignore-table=zabbix.history --ignore-table=zabbix.history_uint --ignore-table=zabbix.history_str --ignore-table=zabbix.history_text --ignore-table=zabbix.history_log --ignore-table=zabbix.trends_uint --ignore-table=zabbix.trends --ignore-table=zabbix.auditlog --ignore-table=zabbix.auditlog_details --ignore-table=zabbix.events zabbix | gzip > zabbix_configuration_only_backup_20181022_1249.sql.gz`

###説明
mysqldump -u root -p --single-transaction --hex-blob --ignore-table=[対象DB名].alerts --ignore-table=[対象DB名].history --ignore-table=zabbix.history_uint --ignore-table=[対象DB名].history_str --ignore-table=[対象DB名].history_text --ignore-table=[対象DB名].history_log --ignore-table=[対象DB名].trends_uint --ignore-table=[対象DB名].trends --ignore-table=[対象DB名].auditlog --ignore-table=[対象DB名].auditlog_details --ignore-table=[対象DB名].events [対象DB名]| gzip > [バックアップファイル名].sql.gz

取得したデータを複製環境へ移動しておく

##アップデート手順
1.リポジトリの更新
`yum install http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm`

2.キャッシュクリーン
`yum clean all`

3.入ってるやつの確認
`rpm -qa | grep zabbix`
こんな感じで出るはず

```
zabbix-web-japanese-3.0.22-1.el7.noarch
zabbix-release-4.0-1.el7.noarch
zabbix-web-mysql-3.0.22-1.el7.noarch
zabbix-agent-3.0.22-1.el7.x86_64
zabbix-server-mysql-3.0.22-1.el7.x86_64
zabbix-web-3.0.22-1.el7.noarch
zabbix-get-3.0.22-1.el7.x86_64
```


4.zabbixの停止
`systemctl stop zabbix-server`

5.アップデート
`yum update zabbix-server zabbix-get zabbix-web zabbix-web-japanese  zabbix-web-mysql`

6.起動

`systemctl restart httpd`
`systemctl start zabbix-server`

DBなんちゃらのエラーが出る場合はDBを再起動してみると幸せになれるかもしれない

##まとめ
アップデート自体はすんなりできてデータ移行も問題なさそうだけどダッシュボード上のアイテム数だけが2倍以上に増えてたのがわからない。テンプレートがふえた？数え方が変わった？

###参考m(_ _)m
https://www.sodo-shed.com/archives/11978
CSS3で、横から移動してくるアニメーション（jqueryでclassを付けるだけ）

```js
$('.page-bg').addClass('active');

$('.hero__img').delay(800).queue(function() {
  $(this).addClass('fadeInRight').dequeue();
});
```




```js
@keyframes fadeInRight {
  from {
    opacity: 0;
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
  }
  to {
    opacity: 1;
    -webkit-transform: none;
    transform: none;
  }
}
@-webkit-keyframes fadeInRight {
  from {
    opacity: 0;
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
  }
  to {
    opacity: 1;
    -webkit-transform: none;
    transform: none;
  }


.hero__img {
  opacity: 0;
}
.fadeInRight {
  -webkit-animation-name: fadeInRight;
  animation-name: fadeInRight;
  -webkit-animation-duration: 1s;
  animation-duration: 1s;
  -webkit-animation-fill-mode: both;
  animation-fill-mode: both;
}
```
強化学習ライブラリ一覧

強化学習用のライブラリを洗い出してみました．

#### [ChainerRL](https://github.com/chainer/chainerrl)

- ライブラリ: Chainer
- アルゴリズム: A3C, ACER, AL, DQN, DDPG, Double DQN, Double PAL, DPP, DQN, NSQ, PAL, PCL, PGT, PPO, REINFORCE, Residual DQN, SARSA, TRPO

#### [Open AI baselines](https://github.com/openai/baselines)

- ライブラリ: Tensorflow
- アルゴリズム: A2C, ACER, ACKTR, DDPG, DEEPQ, GAIL, HER, PPO, TRPO

#### [Coach](https://github.com/NervanaSystems/coach)

- ライブラリ: 
- アルゴリズム: DQN, Dueling DDQN, Bootstrapped DQN, QR-DQN, A3C, Clipped PPO, DDPG, NEC, HER, HAC, DFP

#### [Keras-RL](https://github.com/keras-rl/keras-rl/tree/master/rl/agents)

- ライブラリ: Keras
- アルゴリズム: DQN, Double DQN, DDPG, NAF, CEM, Dueling DQN, SARSA, A3C, PPO

#### [Dopamine](https://github.com/google/dopamine)

- ライブラリ: Tensorflow
- アルゴリズム: DQN, C51, Rainbow, IQN

#### [rllab](https://github.com/rll/rllab)

- ライブラリ: Theao & Tensorflow
- アルゴリズム: TRPO, CEM, DDPG

## References

- [What are some of the good Reinforcement Learning libraries ?](https://www.quora.com/What-are-some-of-the-good-Reinforcement-Learning-libraries), Quora.
- [強化学習で参考になったサイトまとめ](https://qiita.com/eve_yk/items/2ace6d4c1dad7e912df1), Qiita.
- [Awesome Reinforcement Learning](https://github.com/aikorea/awesome-rl), GitHub.
ビッグふりかえりの準備のしかた

ふりかえり(レトロスペクティブ)は定期的に、頻繁にやるのが効果的です。いっぽう、大きな区切り、プロジェクトが終わったときとか、期の切り替わりとかで、長期間を対象にしたおおきなふりかえりをやりたいときもあります。
ビッグふりかえりをやるときは、普段のふりかえりに加えて気をつけるべき点があります。また事前の準備をしておくとより効果的になります。そうした注意点を盛り込んで準備するやり方を紹介します。

# 1. 目的をハッキリさせる

一般にふりかえりの目的は改善ですが、__今回__やりたい__その__ふりかえりの目的は、もう少し具体的になるはずです。どういうタイミングのふりかえりなのか？ふりかえり対象の期間には、どんな特徴があったか？特に議論したい問題はあったのか？
またふりかえりは、次の一歩をよりよく踏み出すためにおこないます。次の一歩とはどんなものになりそうでしょうか。次の一歩に特に役立つ目的を設定しましょう。
目的や、(次で考える)テーマは、事前に関係者にも見てもらい、コメントやフィードバックを得ておきましょう。自分だけでは見落としている重要な問題点やテーマが見つかるかもしれません。また、参加者が心の準備をする役にも立ちます。

# 2. テーマを選ぶ(オプション)

ビッグふりかえりでは議論するテーマを事前に絞り込んでおくとうまくいく場合があります。対象範囲が大きく、人数も多いと話が発散しやすく、ファシリテーターの手に負えなくなるかもしれません。
いっぽう、テーマを狭めてしまうとふりかえりから得られる学びが限定されてしまうきらいもあります。テーマをどこまで絞るのか、どういう見せ方をするのか(事前に提示するのか、様子を見ながら誘導するのか、など)も検討しておくとよいでしょう。

# 3. 対象範囲を決める

ビッグふりかえりでは長い期間を対象にすることになります。そうすると、関係者も多くなるかもしれません。ビッグふりかえりで取り上げる期間と、参加してほしい関係者を決めましょう。
関係者が増えるとスケジュールや場所の調整も手間が増えます。その調整にかかる時間や手間も準備として見込んでおきます。また、ふりかえりの場に参加してもらうのが難しい人もいるかもしれません。そうした人からのインプットを事前に得るとか、あるいはリモートで参加してもらうなどの方法も検討します。

# 4. 日時と場所を調整する

参加者が定まったら、実施する日時と場所を決めます。ビッグふりかえりは普段使わない場所を利用すると、参加者の気分が切り替わり、また割り込みも発生しにくいというメリットもあります。泊まりがけの合宿形式にする手もあります。

# 5. ふりかえりの進行を設計する

長時間のふりかえりをアドリブだけで進めるのは困難です。また普段のふりかえりと同じ進め方では、扱いきれないかもしれません。人数が多ければグループ分けや共有方法なども工夫が要ります。あらかじめ、どんな進行にするか検討しておく必要があります。
ふりかえりの時間全体を45分～90分に分割し、1つの枠で1つのテーマを取り上げるように設計するとやりやすいです。1つの枠に『アジャイルレトロスペクティブズ』にある[5つのフェーズ](http://enk.hatenablog.com/entry/2014/08/14/234634)を入れ、小さな達成と成功を迎えられるようにします。
個々の枠では普段のふりかえりなどでも使っている、いろいろな手法の選択肢があります。キーワードだけ紹介します。

- [『アジャイルレトロスペクティブズ』](https://is.gd/Dhp9H5)
- KPT
- YWT
- ワールドカフェ
- [フレームゲーム](https://www.infoq.com/jp/articles/agile2008_game_design_workshop) グループグロープ、汎用ボードゲームなど
- [Envelope](http://www.thiagi.com/games/2016/11/26/envelopes-lecture)
- OST
- タイムライン
- チェックイン
- [Retromat](https://retromat.org/en/)にもたくさんの手法が紹介されています

規模ややることに応じて、ファシリテーターが何名必要になるかも決めておきます。外部からファシリテーターを呼ぶならその調整も必要です。

# 6. データを収集整理する

取り上げるテーマによっては、事前にデータを収集しておいて、参加者に提示できると効果的なものがあります。対象期間が長いとどうしても記憶が薄れたり、最近の出来事に意識が向きやすくなります。先に時間をかけてデータを集めておくと、参加者の記憶を喚起したり、立場によって見え方が違っていた状況を多面的に議論しやすくなります。

- 公式なイベント ―― タイムライン上に提示すると、時期について認識を合わせやすくなり、思い出しやすくなります
- ある出来事の時系列に沿った詳細な記録 ―― ビッグふりかえりで取り上げたい出来事や事件については、その経緯を客観的に把握できる範囲で記録を集めて提示しましょう。人によって認識が違っていることが明らかになることもあります
- 写真や記録、会話ログなど ―― どんなことをしていたか、どんな話をしていたか、情報としても役立ちますし、思い出すトリガーにもなります。まとめではなく、当時参加者が実際に目にしていたものをそのまま提示します

こうしたデータを集めておき、必要に応じてすぐ提示できるよう整理して準備しておきます。

# 7. 告知する

参加者が忘れたりしないよう、別の予定を入れてしまったりしないよう、告知をしましょう。ふりかえりの主催者として、「参加者が当然参加する」という態度を取らず「面白くてためになるイベントだからぜひ参加してほしい」というメッセージを発信しましょう。内容についてもあるていど触れておき、参加者が心の準備をしたり先に考えておいたりできるように配慮しましょう。メールなどのアナウンスだけでなく、重要な参加者には個別に話をして、なぜ参加してほしいのかよく納得してもらいましょう。
<spring:message>でパラメータを指定する方法

<spring:message>でパラメータを指定する方法

## 方法1:子要素で指定

```jsp
<spring:message code="messageKey">
    <spring:argument value="paramValue0"/>
    <spring:argument value="paramValue1"/>
</spring:message>
```

## 方法2:属性で指定
```jsp
<spring:message code="messageKey" arguments="paramValue0,paramValue1" />
```
WordPressでデータベースの内容を表示

- WordPressでデータベースの内容を表示します
- この記事の内容はWordPress 4.9.8での稼働を確認しています

#1. データベースの内容を確認します
- WordPressのデータベースにどんな内容が格納されているのか、phpMyAdminやadminerなどを使ってデータベースの項目名などについてざっと確認します

<img width="1024" alt="スクリーンショット 2018-10-25 10.02.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0c0fc211-508b-43f9-266d-a02b1bb590e3.png">
<img width="698" alt="スクリーンショット 2018-10-25 10.02.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/e9b72e62-9e81-12e1-97f0-30408d07d1dd.png">
<img width="959" alt="スクリーンショット 2018-10-25 10.44.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/8ca063c9-2b5d-af2b-681c-70c5970804d3.png">


#2. 投稿についての情報を表示させてみます
- 下記のようなコードを準備します

```php:データベースの投稿の情報を表示
<div class="row">
  <div class="col-sm-12 col-md-6">
    <div class="b1">
      <?php
        if ( current_user_can('administrator') || current_user_can('editor') || current_user_can('author') ):
          global $wpdb;
          $query = "SELECT * FROM $wpdb->posts ORDER BY ID LIMIT 40;";
          // $query = "SELECT * FROM $wpdb->users ORDER BY ID LIMIT 20;";
          $results = $wpdb->get_results($query);
          foreach($results as $row) {
            $id = $row->ID;
          }
          // echo "ユーザー名は：" . $results[4]->user_login . nl2br("\n") .
          // "ディスプレイ名は：" . $results[4]->display_name ;
          echo "タイトル：" . $results[37]->post_title . nl2br("\n") . "投稿日時：" . $results[37]->post_date;
        endif;
      ?>
    </div>
  </div>
  <div class="col-sm-12 col-md-6">
    <div class="b2">
      <?php
        echo "投稿抜粋：" . nl2br("\n")  . $results[37]->post_excerpt ;
        // echo "メールアドレスは：" . $results[4]->user_email ;
      ?>
    </div>
  </div>
</div>
```

#3. 結果を確認します
- ブラウザでアクセスし結果を確認します

<img width="847" alt="スクリーンショット 2018-10-25 10.45.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0a3af130-3470-414b-b9d0-9fe4e8f77253.png">

#4. ユーザーについての情報を表示させてみます

```php:データベースのユーザー情報を表示
<div class="row">
  <div class="col-sm-12 col-md-6">
    <div class="b1">
      <?php
        if ( current_user_can('administrator') || current_user_can('editor') || current_user_can('author') ):
          global $wpdb;
          // $query = "SELECT * FROM $wpdb->posts ORDER BY ID LIMIT 40;";
          $query = "SELECT * FROM $wpdb->users ORDER BY ID LIMIT 20;";
          $results = $wpdb->get_results($query);
          foreach($results as $row) {
            $id = $row->ID;
          }
          echo "ユーザー名は：" . $results[4]->user_login . nl2br("\n") .
          "ディスプレイ名は：" . $results[4]->display_name ;
          // echo "タイトル：" . $results[37]->post_title . nl2br("\n") . "投稿日時：" . $results[37]->post_date;
        endif;
      ?>
    </div>
  </div>
  <div class="col-sm-12 col-md-6">
    <div class="b2">
      <?php
        // echo "投稿抜粋：" . nl2br("\n")  . $results[37]->post_excerpt ;
        echo "メールアドレスは：" . $results[4]->user_email ;
      ?>
    </div>
  </div>
</div>
```

#5. 結果を確認します

<img width="847" alt="スクリーンショット 2018-10-25 10.45.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/1ba02abd-c6f3-a160-ad52-2edaa50ac273.png">
IMessengerインターフェイス（MVVM Light Toolkit リファレンス）

# IMessenger
## 概要

```csharp
public interface IMessenger
```

- メッセンジャーのインターフェイス。

##### 名前空間
- `GalaSoft.MvvmLight.Messaging`

#### アセンブリ
- GalaSoft.MvvmLight


## メソッド
### Register&lt;TMessage&gt;
<details><summary>Register&lt;TMessage&gt;</summary><div>

```csharp
public virtual void Register<TMessage>(object recipient, System.Action<TMessage> action, bool keepTargetAlive = false)
public virtual void Register<TMessage>(object recipient, object token, System.Action<TMessage> action, bool keepTargetAlive = false)
public virtual void Register<TMessage>(object recipient, bool receiveDerivedMessagesToo, System.Action<TMessage> action, bool keepTargetAlive = false)
public virtual void Register<TMessage>(object recipient, object token, bool receiveDerivedMessagesToo, System.Action<TMessage> action, bool keepTargetAlive = false)
```

##### 概要
- `TMessage`型のメッセージの受領者として、`recipent`を登録する。
- メッセージを受領したとき、`action`を実行する。`action`がクロージャーの場合、`keepTargetAlive`を`true`にすること。
- `token`を指定した場合、メッセージの受領者は、同じ`token`を指定したメッセージのみを受領する。
- `receiveDerivedMessagesToo`が`true`の場合、メッセージの受領者は、`TMessage`型の派生クラスのメッセージも受領する。`TMessage`型がインターフェイスの場合、`TMessage`を実装したクラスのメッセージを受領する。
</div></details>


### Send&lt;TMessage&gt;, Send&lt;TMessage, TTarget&gt;
<details><summary>Send&lt;TMessage&gt;, Send&lt;TMessage, TTarget&gt;</summary><div>

```csharp
public virtual void Send<TMessage>(TMessage message)
public virtual void Send<TMessage>(TMessage message, object token)
public virtual void Send<TMessage, TTarget>(TMessage message)
```

##### 概要
- `TMessage`型のメッセージを送る。
- `token`を指定した場合、同じ`token`を指定して登録した受領者のみ、このメッセージを受領する。
- `TTarget`を指定した場合、受領者の型が`TTarget`の場合のみ、このメッセージを受領する。
</div></details>


### Unregister, Unregister&lt;TMessage&gt;
<details><summary>Unregister, Unregister&lt;TMessage&gt;</summary><div>

```csharp
public virtual void Unregister(object recipient)
public virtual void Unregister<TMessage>(object recipient)
public virtual void Unregister<TMessage>(object recipient, object token)
public virtual void Unregister<TMessage>(object recipient, System.Action<TMessage> action)
public virtual void Unregister<TMessage>(object recipient, object token, System.Action<TMessage> action)
```

##### 概要
- `recipient`を、メッセージの受領者としての登録を解除する。
- `TMessage`を指定した場合、`TMessage`型のメッセージの受領についてのみ、登録を解除する。
- `token`を指定した場合、同じ`token`を指定したメッセージの受領についてのみ、登録を解除する。
- `action`を指定した場合、同じ`action`を指定したメッセージの受領についてのみ、登録を解除する。
</div></details>


## 参照
- [目次](https://qiita.com/h084/items/c5355fa734936c56ca50/)
- [Messenger](https://qiita.com/h084/items/4359bdfbd75b48755309)
Azure DevOps と VS でコンテナを CI/CD してみよう 

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure DevOps と VS でコンテナを CI/CD してみよう」で使われた資料のご案内です。</p>

- <strong>Azure DevOps と VS でコンテナを CI/CD してみよう</strong><br />
https://www.slideshare.net/secret/1NNf5NaAkhTP2I

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
MyBatisを使って日本語テーブルを突破する

全てMicrosoftで固められたシステムはかなりの確率で日本語テーブル、日本語カラムです。

日本語テーブルカラムはORMに乗りません。(´;ω;｀)
PHPやPython系だとSQL文とRecordSetレベルのライブラリーで見れるぐらいが限界です。

Javaは一番確実にDatabaseからデータを取ってこれる。
昔ながらのJDBCとRecordSetでちまちま書くのが嫌。
SQL文書いてもいい。
TableをClass化したい。

MyBatisかDomaあたりでなんとかならないかなぁ…。

## MyBatisならできるかも

[MyBatis による SQL マッピング](http://d.hatena.ne.jp/redcat_prog/20130402/1364891377)を発見した。
日本語カラムで日本語名テーブルなテーブルをCustomerクラス,Nameフィールドに結び付けている。
このMapper XMLファイルを使えば何とかなるかもしれない。

## 作ってみた

出来ました！！＼(^_^)／
できたSourceはGitHubに置いておきました。

https://github.com/arachan/MyBatisJPTable
Qiita API v2を利用してcurlで投稿してみた

## 概要

Qiita API v2を利用して記事を投稿するのに、ハマったのでメモ。


## アクセストークン

投稿するにはQiitaのアクセストークンが必要になります。

Qiitaにログインしているなら下記URLから登録ができます。

https://qiita.com/settings/tokens/new

スコープは「read_qiita」と「write_qiita」が必要になります。


## POSTで投稿する

ヘッダーで```Authorization``` と```Content-Type``` を渡して上げましょう。```[Qiitaのアクセストークン]``` は置き換えてください。

ハマりポイントは```tags``` の指定方法でしょうか。サイトからの投稿もタグ必須ですので、APIからの投稿でも必要になります。```versions``` は指定しなくても投稿できました。

```sh
> curl -v -X POST "https://qiita.com/api/v2/items" \
  -H "Authorization: Bearer [Qiitaのアクセストークン]" \
  -H "Content-Type: application/json" \
  -d "{\"body\": \"# テスト\",\"private\": true,\"title\": \"テスト\",\"tags\":[{\"name\": \"hoge\",\"versions\": []}]}"

{"rendered_body": (略)
```

JSONは整形すると、こんな感じです。パラメータの詳細は公式をご参考ください。

Qiita API v2ドキュメント - Qiita:Developer
https://qiita.com/api/v2/docs

```json
{
  "body": "# テスト",
  "private": true,
  "title": "テスト",
  "tags":[
    {
      "name": "hoge",
      "versions": []
    }
  ]
}
```

投稿に成功すると記事情報がJSON形式で返ってきます。
パラメータに間違いがあった場合はステータスコードが```500``` でエラーになります。```4xx``` でお知らせしてくれません。悲しい。
なので、```-i``` や```-v``` オプションを付けて、ステータスコードを確認しましょう。


## GETで記事を取得する

こちらはシンプルです。もしviewsが欲しい場合には、ヘッダーで```Authorization``` を渡す必要があります。(自分の記事に限る)

```sh
> curl -v "https://qiita.com/api/v2/items/[記事のID]" 
{"rendered_body": (略)
```

## PATCHで記事を更新する

記事を更新する場合は、```PATCH``` メソッドです。```PUT``` メソッドはありません。```title``` と```body``` が必須項目みたいで、```tags``` などは省略しても更新してくれます。

```sh
curl -v -X PATCH "https://qiita.com/api/v2/items/[記事のID]" \
  -H "Authorization: Bearer [Qiitaのアクセストークン]" \
  -H "Content-Type: application/json" \
  -d "{\"body\": \"# テスト2\",\"private\": true,\"title\": \"テスト2\"}"
```

## DELETEで記事を削除する

**ほんとに記事が削除されるので、お試しにはご注意ください。**

```sh
> curl -v -X DELETE "https://qiita.com/api/v2/items/[記事のID]" \
  -H "Authorization: Bearer [Qiitaのアクセストークン]" \

```

ポイント？としては削除後に、削除した記事にアクセスすると```500``` エラーになるってことでしょうか。なぜだろう？


## まとめ

間違ったパラメータ指定をした場合に、```500``` エラーでしか返ってこないので、ハマると大変な感じでした。


##　参考

Qiita API v2ドキュメント - Qiita:Developer
https://qiita.com/api/v2/docs

Qiita api v2の投稿ができない
https://teratail.com/questions/5212
Debian に Google Chrome をインストール

Anaconda の公式 Docker イメージ (Debian ベース[^anaconda-dockerfile]) に Google Chrome をインストールしようとしたところ、Ubuntu と同じやり方ではできずに手こずったのでメモ。

[^anaconda-dockerfile]: https://github.com/ContinuumIO/docker-images/blob/master/anaconda3/Dockerfile#L1

``` console
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo apt install ./google-chrome-stable_current_amd64.deb
```

<del>`dpkg -i` の時点では「依存パッケージが入ってない」と怒られるが、その後 `apt --fix-broken install` で依存パッケージがインストールされる。</del>
[追記] `apt install ./foobar.deb` で依存パッケージも含めてインストールできる、とご指摘いただいたので修正。

Google Chrome はブラウザなだけあって依存モジュールが多く、インストールにかなり時間がかかる。

## Dockerfile の例
Anaconda 3 ベースで、Python から Selenium + Chrome Driver を扱えるようにする Dockerfile はこんな感じで書ける。

``` Dockerfile:Dockerfile
FROM continuumio/anaconda3

RUN apt update \
  && apt install -y gnupg \
  && wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
  && wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
  && apt install -y ./google-chrome-stable_current_amd64.deb \
  && apt clean \
  && rm -rf /var/lib/apt/lists/ \
  && rm google-chrome-stable_current_amd64.deb

RUN pip install selenium chromedriver-binary~=$(/usr/bin/google-chrome --version | perl -pe 's/([^0-9]+)([0-9]+\.[0-9]+).+/$2/g')
```

- Docker コンテナ内で Google Chrome を起動する際は、ユーザが root だとそのままでは起動できないので `--no-sandbox` オプションを付ける必要がある。
- Google Chrome と chromedriver-binary はメジャーバージョンを合わせる必要があるので、chromedriver-binary をインストールする際にバージョン指定をしている。 [^chrome_version]

[^chrome_version]: [ChromeとPythonのchromedriver\-binaryのバージョンを合わせたい。 \- Qiita](https://qiita.com/akiko-pusu/items/86faca0cb9c877896c04)
php-master-changes 2018-10-24

今日は phpdbg まわりのファイル整理、php_plain_files_wrapper の非 const 化、interned strings buffer の初期化処理修正、.gitignore の大整理、テスト実行時の phpdbg での一部 phpt セクション対応の修正があった！

# 2018-10-24
## petk: Remove phpdbg parser files generated by bison
- https://github.com/php/php-src/commit/c0446d55a2ea2abaaee5f5461f68ad8054aea56f
- sapi/phpdbg のパーサジェネレータからの生成となるファイルをリポジトリから削除
- リリース時のソースコードパッケージには生成後のファイルも含まれている、処理系本体もこの形

## dstogov: Make php_plain_files_wrapper to be writable (workaround for swoole)
- https://github.com/php/php-src/commit/770fe51bfd8994c3df819cbf04b7d76824b55e5c
- [7.3~]
- php_plain_files_wrapper からの const 外し
- swoole で問題の出るケースがあるもよう（どの問題か見つけられず）

## dstogov: Fixed build in directory different from source
- https://github.com/php/php-src/commit/a4043831188989609260d633db65d2d28ce0afae
- sapi/phpdbg で、ソースコード中での[出力ファイル指定](https://www.gnu.org/software/bison/manual/html_node/Table-of-Symbols.html)を削除

## dstogov: Fixed reseting of interned strings buffer.
- https://github.com/php/php-src/commit/335fb94d547f0b2c121e573eff0d102ded586bab
- [7.3~]
- ext/opcache で、[interned strings buffer](http://blog.jpauli.tech/2015/09/18/php-string-management.html#interned-strings) のリクエスト開始時の初期化処理を修正

## petk: Normalize .gitignore
- https://github.com/php/php-src/commit/0b63544f25adc6517fc221ee925ff6f94b84d47d
- .gitignore の大整理
- 超コメントが付いてる
- パスを指定する箇所では先頭スラッシュをある方へ統一
- ディレクトリを指定する箇所では末尾スラッシュを付与

## petk: Fix run-tests.php for running phpdbg and certain test sections
- https://github.com/php/php-src/commit/220a2239a6c2cc76621d5b7d0584ab3b2797958e
- run-tests.php の一部 phpt セクションを phpdbg で実行できないのを修正
- `--EXTENSIONS--`、`--SKIPIF--`、`--CLEAN--` の箇所