OmniAICreator/Qiita-1.07M huggingface dataset:
swiftでUIBarButtonItemが動かなくて激しくはまった件

Storyboardに張り付けたUIBarButtonItemが全く動かなくて焦った件をメモしておきます。

viewDidLoad内でこんなコードを書いて、

```swift:ViewController.swift
class ViewController: UIViewCOntroller {
	@IBOutlet weak var barButtonItem:UIBarButtonItem!
	
	override func viewDidLoad() {
		let helper = Helper()
		helper.set(button: barButtonItem)
	}
```

Helperはこんなコードになってる。

```swift:Helper.swift
public class Helper {
	public func set(button:UIBarButtonItem) {
		button.target = self
		button.action = #selector(buttonTouched)
	}
	
	@objc private func buttonTouched() {
		print("touched!!")
	}
}
```

で、ボタンを押してもウンともスンともいわないのだが、
結果的にhelperをインスタンス変数にすることで、正常に動いた。

```swift:ViewController.swift
class ViewController: UIViewController {
	@IBOutlet weak var barButtonItem:UIBarButtonItem!
	private var helper:Helper!
	
	override func viewDidLoad() {
		helper = Helper()
		helper.set(button: barButtonItem)
	}
}
```

helperがメモリから消え去って、buttonTouchedにアクセスできなくなったことが
原因として考えられるが、同じ実装でも大丈夫な場合もあって、発見がめちゃくちゃ遅れてしまった。
Senstickの使い方についてメモ書き

多機能センサーであるSenstickを弄って、気づいたこと、使い方についてメモ書き
https://www.facebook.com/UltraTinySensorBoardSenStick/

基本的な使い方については、Senstickを購入すると同封される「Senstickの使い方」のドキュメントを参照し、本記事は補助的に使うことを想定しています。

■目次
　　□検証環境
　　□セットアップ
　　□ロギング
　　□データ解析

■検証環境
・iPhone5s
・SenstickViewer:１．０．７
・Hardware revision:rev 2.0
・Firmware revision:rev 1.07
・Macbook Pro　※ログの取得に用いた

■セットアップ
①必要な機材や準備
・Senstick本体
・iPhone（iOS製品ならiPadなどでも可だと思われる）
・SenstickViewerをAppStoreからダウンロードする。
・iOS10.0以上へのバージョンアップ　※アプリがiOS10.0以上にのみ対応
・iTunesが入っているPC（USBコネクタあり）
・ライトニングUSBケーブル
・Senstickを入れる容器

②iPhoneとSenstickのペアリング
・iPhoneのBluetooth（以下BT）がONになっているか確認する。
・Senstickの電源がONになっているか確認する。
・SenstickViewerを起動する。
・画面を下にスワイプするとSenstickを選択できるようになる。
・Senstickをタップすると接続する。

③ファームウェアの更新
ファームウェアの更新がないかチェックする。（私の場合はあった）
・アプリ画面の右上のアイコンをタップする。
・ファームウェアの更新を選択して、更新を行う。
・アプリを終了（必要ないかも）。
・iPhoneのBTをOFF→ONする（BTのキャッシュをクリアする）
・②の操作を行い、ファームウェアの更新が成功しているか確認する。

■ロギング
①本測定前の確認
・Senstickが十分に充電されているか
・不要なログがあれば、必要に応じてSenstickのフォーマットを行う。
　（操作スイッチを5秒長押しし、赤点滅３回でフォーマットされる）
・iPhoneが十分に充電されているか（または電源に接続されているか）
・iPhoneの自動ロック設定を変更し、「なし」にする。
　（１度しか確認していないが、測定中にiPhoneがロックされてしばらくすると測定が中断されてしまった。特に、長時間測定する場合は、自動ロックを解除した方が良い。）

②ロギングの設定
・「Senstickの使い方」のFig.3.iOSアプリ画面（以下、アプリ画面）になっていることを確認する。
・使用するセンサーのみ、下部に緑色のバーが表示されていることを確認する。
　　(ログ停止中にセンサーのアイコンをタップするとON/OFFができる）
・使用するセンサーのデータ取得周期と測定レンジの設定を確認する。
　　（ログ停止中にセンサーアイコン右隣の部分をタップすると設定画面に遷移する。
　　　　データ取得周期は、ドラム式UIなので、上下にスワイプして設定する。
　　　　測定レンジの設定は、色々試したが"設定変更できなかった"。問い合わせする予定。）

③測定の開始と終了
・アプリ画面の「start」ボタンを押下すると測定開始。
・アプリ画面の「stop」ボタンを押下すると測定開始。

④ログファイルの作成
・アプリ画面の「Log#:」部分をタップするとログリスト画面に遷移する。
・取得したいログを選択するとログ読み出し画面に遷移する。
・上の行から順に左から右へログのグラフが流れていく。
・全ての行について、グラフが右へ流れ切るとログファイルの作成が完了する。
　（何時間にも渡ってログを記録すると、ログの読み出しに数分かかるので注意。
　　この場合、ログの読み出し中にアプリが固まることがあるので、その際は
　　アプリを再起動してやり直すこと。）

⑤ログファイルの削除
・「clear」ボタンを押下するか、操作ボタンを長押ししてフォーマットする。

⑥ログファイルのダウンロード
・iPhoneをPCに繋いで、iTunesを立ち上げる。
・iTunes画面の左上のデバイスのアイコンを選択し、更に設定＞Appを選択。
・画面をスクロールしてファイル転送メニューを表示する。
　　（「以下のAppでは、iPhoneとこのコンピュータとの間で書類を転送できます。」と表示されていると思う。）
・SenStickViewerを選択し、フォルダが表示されていることを確認する。
　　（0KBになっている場合は、ファイル作成に失敗しているので、
④ログファイルの作成 に遡ってやり直すこと。）
・フォルダごとPCに保存できる。
（ドラッグ＆ドロップでコピーできると思われる）

⑦ログファイルの見方
・フォルダ内に全センサーのファイルがそれぞれ作成されている。
　　（ファイル作成を中断した場合は、作成に成功したファイルだけ作成されている。また、ロギングを行ってないセンサーについては、0バイトで作成されている。）

■データ解析
①加速度(acceleration)データファイルについて
・4列のデータが作成される。
・左から、時間（秒）,x軸,y軸,z軸 になっている（と思われる）
・データ形式は「,」とタブが混在しているため、整形の際は考慮すること。
・加速度データにも関わらず、デフォルト値が「0」になっていないため、初めて見ると困惑する。
　（静止した状態でロギングしてもx,y,zそれぞれバラバラな値付近で変動しているデータが記録されていると思う。想定ではx,y,zそれぞれ0付近で変動すると思っていた。センサーの世界ではこれくらいは常識なのかもしれないが。。。なお、Senstickをフォーマットしても改善しなかった。問い合わせする予定。）

②角速度(gyro)データファイルについて
※解析中

③その他データファイルについて
※未使用



今のところ以上です。ご利用は自己責任でお願いします。

指摘があればご連絡ください。
なお、この場合はどうなるのか、こうしたい時はどうしたらいいのかといった疑問は、製造元にお問い合わせください。
SQLで固定行を動的に生成する(再帰With句)

昔調べた再帰Withのブログページがどこだったのかわからなくなったので解説をメモ

SQLで固定行を実現する場合、下記のように再帰With句で実現できる

#SQLで固定行(サンプル)
declare @count int = 100;

--再帰With句(with ～ as の間が再帰式)
with ROW_IDX(idx) as(
  select 1 --ここは再帰されない普通のSQL
  union all --Union allから上が非再帰項、下が再帰項となる
  select idx+1 
    from ROW_IDX 
   where idx+1 <= @Count --この条件の取得件数がが0になるまで再帰する
) 
--再帰With句を呼び出し
select ROW_IDX.idx
from ROW_IDX
order by ROW_IDX.idx
Keras で超簡単 Seq2Seq の学習をしてみる

# Seq2Seq とは
シーケンスのペアを大量に学習させることで、片方のシーケンスからもう一方を生成するモデルです。
実用例としては以下のようなものがあります。

- 翻訳: 英語 -> フランス語 のペアを学習。英語を入力するとフランス語に翻訳してくれる。
- 構文解析: 英語 -> 構文木　のペアを学習。英語を入力すると構文木を返してくれる。
- 会話bot： 問いかけ -> 返答 のペアを学習。「お腹減った」に対して「ご飯行こうぜ」などと返してくれる。

いろいろ夢の広がるモデルです。

LSTM を使った以下のような形をしたネットワークで、入力を内部表現に変換するエンコーダ部分（画像左半分）と内部表現から出力を得るデコーダ（画像右半分）で構成されます。
![basic_seq2seq.png](https://qiita-image-store.s3.amazonaws.com/0/61079/2b9121f4-b159-0fcd-d7c8-06d61ebb80de.png)
_引用元：[TensorFlow](https://www.tensorflow.org/tutorials/seq2seq/)_

# Seq2Seq を簡単に試したい！
Fariz Rahman さんが Keras での Seq2Seq ライブラリを公開しています。
https://github.com/farizrahman4u/seq2seq

このライブラリは単純な Seq2Seq のみならず以下のような拡張された Seq2Seq もとても簡単に使えるスグレモノに見えます。

- **Simple Seq2Seq**
- **Deep Seq2Seq**： Stacked LSTM を用いたもの
- **Peeky Seq2Seq**： エンコーダが出力するコンテキストベクトルを、デコーダーの各出力・隠れ層に流すバージョン・・のように見えますがちゃんと論文は読んでいません
- **Seq2seq model with attention**： 参考： [seq2seq で長い文の学習をうまくやるための Attention Mechanism について](http://qiita.com/halhorn/items/614f8fe1ec7663e04bea)


## 環境
以下の環境で実装を行いました。

- python3.5.2
- tensorflow1.0

基本的な環境については [p2 インスタンスへの TensorFlow 導入](http://qiita.com/halhorn/items/361008b19b4fcfd618d6) が参考になるかもしれません。

更に、 DeepLearning をするための高級フレームワークの Keras をインストールします。

```
pip3 install keras
```

Seq2Seq が依存している、 ReccurentShop をインストールします。
https://github.com/datalogai/recurrentshop

```
git clone https://www.github.com/datalogai/recurrentshop.git
cd recurrentshop
python setup.py install
```

後は、 Seq2Seq ライブラリのインストールをします。
https://github.com/farizrahman4u/seq2seq

```
pip3 install git+https://github.com/farizrahman4u/seq2seq.git
```

追加で必要な matplotlib を入れておきます。

```
pip3 install matplotlib
```

## 実装
ipython で適当に動かしながら作ったやつなので変数名がクソなのは許してください

```py3
from seq2seq.models import SimpleSeq2Seq
import numpy as np
import matplotlib.pylab as plt

# シンプルな Seq2Seq モデルを構築
model = SimpleSeq2Seq(input_dim=1, hidden_dim=10, output_length=8, output_dim=1)

# 学習の設定
model.compile(loss='mse', optimizer='rmsprop')

# データ作成
# 入力：1000パターンの位相を持つ一次元のサイン波
# 出力：各入力の逆位相のサイン波
a = np.random.random(1000)
x = np.array([np.sin([[p] for p in np.arange(0, 0.8, 0.1)] + aa) for aa in a])
y = -x

# 学習
model.fit(x, y, nb_epoch=5, batch_size=32)

# 未学習のデータでテスト
x_test = np.array([np.sin([[p] for p in np.arange(0, 0.8, 0.1)] + aa) for aa in np.arange(0, 1.0, 0.1)])
y_test = -x_test
print(model.evaluate(x_test, y_test, batch_size=32))

# 未学習のデータで生成
predicted = model.predict(x_test, batch_size=32)

plt.plot(np.arange(0, 0.8, 0.1), [xx[0] for xx in x_test[9]])
plt.plot(np.arange(0, 0.8, 0.1), [xx[0] for xx in predicted[9]])
plt.show()
```

## 結果
![image](https://qiita-image-store.s3.amazonaws.com/0/61079/f6a1b14e-eaef-18df-02a3-6fb8e2faaa84.png)
水色が入力、オレンジが学習済みモデルによる予測です。
本当は水色のグラフに -1 をかけたものが正解です、が、ちょっとずれてます。けど、雰囲気は学習してくれているみたいですね。

このように簡単に試せる環境があることはありがたいことです。（しかもとても少ないコード量で。）
【ECCUBE3】 デバックモード(index_dev.php) + ajax通信時 errorが返ってきたら。

```php:filename.php
<?php
// 使用可能メモリに制限を設けない
@ini_set('memory_limit', -1);
// 実行時間を無制限にする
set_time_limit(0);
```
試す価値あり。
【メモ】Hough Transformとは？

### 円認識
![01_.png](https://qiita-image-store.s3.amazonaws.com/0/134166/ce0374fb-c111-7550-778f-30823b52bb03.png)
![02_.png](https://qiita-image-store.s3.amazonaws.com/0/134166/7ae32b7d-918e-663f-2346-37f6ccd670ec.png)
![03_.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/2002f507-b32c-6018-a706-ba525489cca9.jpeg)

![04_.png](https://qiita-image-store.s3.amazonaws.com/0/134166/fa96e4a1-743d-6779-103f-82b43a0eb608.png)
![05_.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/e2834854-3040-1ac1-04a8-8cfde4580791.jpeg)


### おまけ
> How Hough Transform works : https://www.youtube.com/watch?v=4zHbI-fFIlI!
SSH Remote Port Forwarding


# 概要
SSHのリモートポートフォワーディングを利用することにより、
FWなどにより外部へしか通信できないネットワークに対して、FWを越えて通信することができます。

存在自体は知っていましたが、意外と便利でした。

# イメージ

フォワーディング前
![Before](https://qiita-image-store.s3.amazonaws.com/0/138821/2d8f0dd9-3626-9ee9-9d64-e26fc9368914.png)

フォワーディング後
![After](https://qiita-image-store.s3.amazonaws.com/0/138821/26e6db4f-c7ed-738e-a261-2d2f925af250.png)

# 前提
・経由サーバからユーザPCへssh接続できること

# 説明
[こちらの記事](http://qiita.com/mechamogera/items/b1bb9130273deb9426f5)を主に参考しました。

例えば、以下のようにした場合は「経由サーバへ」から「ユーザPC」へ
ssh接続をすると同時に、「ユーザPC」の「10080ポート」を「接続サーバ」の「80ポート」へフォワーディングすることなります。

従って、ユーザPCにおいて"http ://localhost:10080"にアクセスすることは、
すなわち"http ://[接続サーバ]:80"にアクセスしたことになります。

```bash
# 経由サーバから実行
$ ssh -R 10080:[接続サーバのIPアドレス]:80 [ユーザPCのIPアドレス]
```

これを応用すれば、ネットワーク的には少し遠いですが
更にユーザPC(Linux)にsocatを設定したりすることでユーザPC(Linux)を踏み台サーバとして利用できると思います。

例えば、上記の例だとユーザPCの10080ポートを80ポートとして提供することで、接続サーバの80ポートに対して通信させるといったようなことができます。

```bash
# ユーザPCで実行
$ socat tcp4-listen:80,reuseaddr,fork TCP:127.0.0.1:10080
```

上記のようにsocatを設定することで、更に他のPCからユーザPCのポート80にアクセスすることで、接続サーバの80へアクセスしているかのように見せることができます。

# 参考
・[sshポートフォワーディング](http://qiita.com/mechamogera/items/b1bb9130273deb9426f5)

・[Linux経由でリモートデスクトップ接続をフォワーディング](http://qiita.com/Daisuke-Otaka/items/b6140f94023510b7873a)
Homebrew のキャッシュが思いのほか大きかったのでクリーンアップした


Homebrew でソフトウェアをアップデートすると，アップデート前のファイルも残っていてそれが結構な大きさになっているらしい

## どうやるのか

キャッシュを消すコマンドを実行する

```
COMMANDS
       cleanup [--prune=days] [--dry-run] [-s] [formulae]
              For all installed or specific formulae, remove any older versions from the cellar. In addition,  old  down-
              loads from the Homebrew download-cache are deleted.

              If --prune=days is specified, remove all cache files older than days.

              If --dry-run or -n is passed, show what would be removed, but do not actually remove anything.

              If  -s is passed, scrubs the cache, removing downloads for even the latest versions of formulae. Note down-
              loads for any installed formulae will still not be deleted. If you want to delete those too: rm -rf  $(brew
              --cache)

```

## やってみる

```
$ brew cleanup
Removing: /usr/local/Cellar/boost/1.61.0... (12,259 files, 438.4M)
Removing: /usr/local/Cellar/boost/1.61.0_1... (12,259 files, 438.6M)
...
Removing: /Users/user/Library/Logs/Homebrew/webp... (6 files, 450.4K)
==> This operation has freed approximately 8.6G of disk space.
```

8.6 GB も空き容量が増えました．
【CakePHP】try~catchでPDOExceptionが受け取れなかった話

備忘録として。

ログインする際にもしもDBが止まっていたら、
という例外処理を作ろうとして、3時間くらい詰まりました。。。

認証はAuthコンポーネントを使って行いました。
##修正前
```php:LoginController.php
.
.
try{
    $user = $this->Auth->identify();
            
    if($user){
       $this->Auth->setUser($user);
       return $this->redirect(['controller' => 'hello');   
    }
} catch(PDOException $e) {
    $this->Flash->error('DBエラー');
}
.
.
```

例外処理に行かず500エラー...
Exceptionも試したけどダメだった...

なんでや！！！

##修正後
```php:LoginController.php
.
.
try{
    $user = $this->Auth->identify();
            
    if($user){
       $this->Auth->setUser($user);
       return $this->redirect(['controller' => 'hello');   
    }
} catch(\PDOException $e) {
    $this->Flash->error('DBエラー');
}
.
.
```

どこが変化したかわかりますかね？

```
} catch(\PDOException $e) {
```

この部分の PDOException の先頭にバックスラッシュをつけたら正常に動作するようになりました。
namespaceの問題(?)のようです。


参考・回答はこちら

CakePHP 3 - Catch Error
http://stackoverflow.com/questions/35311368/cakephp-3-catch-error
ECMAScript2015(ES6)でクラスチェックする方法

## 正しいサンプルコード(コメントより反映させて頂いた手法)
```javascript
class Animal {
  constructor() {
    this.age = 0
  }
}
```

上記のようなES6のクラスがあったとして、コード上でクラスチェックする方法は以下となる。

```javascript
function checkAnimal(animal) {
  if (!(animal instanceof Animal)) {
    console.log("これはAnimalではありません")
    return
  }
  console.log("これはAnimalです")
}
```

### 解説
`instanceof` 演算子を用いることで指定クラスのインスタンスであるかを得ることができる。

```javascript
インスタンス instanceof クラス
```

## 誤りのサンプルコード(投稿初期時に公開していた手法)

**この手法は同名のクラスである場合もtrueを返してしまうため使用厳禁**

```javascript
class Animal {
  constructor() {
    this.age = 0
  }
}
```

上記のようなES6のクラスがあったとして、コード上でクラスチェックする方法は以下となる。

```javascript
function checkAnimal(animal) {
  if (animal.constructor.name != Animal.name) {
    console.log("これはAnimalではありません")
    return
  }
  console.log("これはAnimalです")
}
```

### 解説
`クラス.name` でクラス名を取得できる
`インスタンス.constructor.name` でインスタンスのクラス名を取得できる
階乗のプログラム

入力した値で階乗を計算するプログラムを作りなさい (階乗とは、７の場合７×６×５×４×３×２×１のようになるものです)という問題がどうしても解けません。

BufferdReaderを使ったコードの書き方を教えて頂けませんか。
わかる方よろしくお願いいたします。
ドメイン配下に/BLOG/　を実現させるためのコンフィグ




###別サーバのコンテンツを配下階層でみせるためのコンフィグ
WordPressでのブログをドメイン内に存在させるために使っていました。

http://DOMAIN/AAAAAA/ でアクセスした時に
別サーバの http://XXX.DOMAIN/AAAAAA/
　のコンテンツを返却しつづけるためのapacheのconfig



```apache

  ProxyRequests Off
  ProxyPass /AAAAAA/ http://XXX.DOMAIN/AAAAAA/ smax=0 max=1 ttl=10 retry=3 timeout=10 connectiontimeout=10 keepalive=Off
  ProxyPassReverse /AAAAAA/ http://XXX.DOMAIN/AAAAAA/
  SetEnv proxy-initial-not-pooled 1

```
5コネクションまで増えていき、20を超えたら120秒でコネクションクローズさせていました。
try! Swift Tokyo 2017 ざっくりレポート (day2)

[try! Swift Tokyo 2017 ざっくりレポート (day1)](http://qiita.com/metal-president/items/1c16d87a7e5139fe7bcc)
の続き、try!Swift Tokyo 2017 二日目のレポートです。
ランチタイムまでの半日分となります。


# 2017-03-02 (day 2)
では2日目のレポートです。

## テスト可能なコードを書くということの２つの側面

[Brandon Williams さん](https://twitter.com/mbrandonw)
Kickstarter のエンジニアさんだそうです。

コードをよりテスト可能なものにしていくことが重要である。
経験が必要で、方法を知る必要もある。

テストすると潜在的なバグを見つけ、クラッシュを防げる。
テストできるコードを書くようにする。
テストをドキュメント化しているそうです。

### Testing Output
- テストは簡単
- Side Effects（副作用）
- 実行後の外部の影響(副作用)を知る必要がある
- 副作用をコードの境界付近に近づける必要がある

### Testing Input
- テストが難しい、新しい分野である
- Co-Effects (きょう作用？）
- DI を使う
- 一つのグローバル構造体に全て（シングルトン）持たせている
- 例として Environment構造体に　APIサーバー、Cookie、ユーザー、Date(プロトコル)、言語、ハンドル、reachability、scheduler(Reactive)、Userdefaults などをもたせている。
- プロトコルを入れてテスト可能なコードにRefactorする

### その他
- テスト駆動で開発している
- propertyベースのテストは行っていない


## 誰もが知りたいSequenceとCollectionのすべて

[Soroush Khanlou さん](https://twitter.com/khanlou)

Collectionを使う場合ほとんどはArrayを使用している、という前置きの後は、各種Collectionの具体的な実装についての解説でした。

- Sequence(一回しかイテレートできない、LinkedList)
- EachPair(グループ化する)
- Collection（なんどでもイテレートできる）
- BidirectionalCollection（逆戻りができる）
- RandomAccessCollection（素早くアクセスできる）
- RangeReplaceableCollection（塊を取れる）


## 様々な場面でSwiftを使う
[Yusuke Ito さん](https://twitter.com/novi_)

Serverside Swift についてのお話でした。日本語のセッションでした。

### Swift について
- Package Manager も公開されたのが良い
- Linux/ARM でも利用可能
- Raspberry Pi でも動く

### なぜServerside？
- Node.js や Python で実装しているものを 安全な Swift に置き換える。

### 実績1:Pythonで作られた Web Crawler をSwift に置き換えた
- Swift は LLVM ベース、Cライブラリをリンクできる
- gRPC : grpc/grpc-swift 最近出た

### 実績2:Swift for ARM and Raspberry Pi

### 使いたいライブラリがない場合
1. 自分で実装する
2. C言語のライブラリをWrapする
3. 移植する


## VRの革新と新たなユーザー体験
[Artis Birzins さん](https://twitter.com/artiebe)
[VR HUB TOKYO](https://www.meetup.com/ja-JP/vrhubtokyo/)

事例
- Retail : VR SHOPPING (Alibaba)
- 不動産(Real Estate) : 360度の写真を撮って公開 → iOSアプリで閲覧
- Carディーラー : ジャガー、ボルボ、アウディ、Honda, VW
- Sports : スケボ


## iOSにおけるDocument IndexingとApp Search
[Kateryna Gridina さん](https://twitter.com/gridNAka)

### AppSearch
- Spotlight or Safari から検索
- 6万アプリしか対応していない
- 3つのAPI

### CoreSpotlight API
 1. カタログのアイテムをindex化
 2. アイテムのArrayを作る
 3. spotlight で検索できる

有効期限の設定が可能(expoiratonDate)
複数のアイテムをグループ化してindex化できる
 
バックグランドで処理されるためクラッシュしても大丈夫

### Search Continuation
iOS10から Search Continuation 追加
1画面あたり10アイテム → アプリ内でさらに検索できる
 
バックグランド(beginBatch) に関するドキュメントがない
Batchを閉じてから次のbatchを始める（クラッシュする）
スレッド処理化も自分で適切に実装する
Real Device でテストしよう

### NSUserActivity
publicにすると
→ アプリがインストールされていなくても検索できる
private 
→ ユーザーに見えない


## スタートアップのSwift
[Mo Kudeki](https://twitter.com/kudeki)

iOSアプリ `Hey! VINA`
女性の友情を育むためのアプリ

### ローンチ直後
- 2weeks / 10万
- Parse を使っていたが 有料プランの最大 Notifications数/min を超えてしまった。

### アーリーアダプタじゃない人が使い始めた
- 「アプリが動かないだけど…」「クラッシュするんだけど…」 などのレポート
- slack + TestFlight でフィードバックを得る活動


### その他
- 最初に書いたコードの品質を高めるのは無駄 → 廃棄する時期がくる
- Parse がshutdown した...


2日目のレポートは以上です。
ThreadPoolTaskExecutor の挙動

ThreadPoolTaskExecutor (ThreadPoolExecutor) の挙動をいつも忘れるのでメモ。

* corePoolSize までは、スレッドを作成してタスクを割り当てる。
* corePoolSize を超えると queueCapacity までキューに追加。
* queueCapacity を超えると maxPoolSize までスレッドを追加しタスクを割り当てる。
* queueCapacity + maxPoolSize を超えると TaskRejectedException。
* corePoolSize を超えたアイドルスレッドは keepAliveSeconds 後にシャットダウンされる。
ZapierのTeamsプランを会社で契約して使ってみた

# はじめに

Zapierは複数のサービスを連携させて自分だけの処理を作れるサービス。
[<img width="200px" src="https://qiita-image-store.s3.amazonaws.com/0/19644/e062b77d-f312-c7c7-bc30-4b0ac72009dc.png">](https://zapier.com/)
Google スプレッドシートに更新があったらChatWorkに通知する とか。
よく似ているものとしては [IFTTT](https://ifttt.com/) が有名。

会社でZapierの有料プランの「Teams」を契約して使ってみた情報をフィードバックする。

# Zapierのプラン比較表

||Free|Starter|Professional|Professional Plus|Teams|
|:----|:---:|:---:|:---:|:---:|:---:|
|月額料金|$0|$25|$62.50|$156.30|$312.50 **※**|
|Zap上限|5|20|50|125|∞|
|Task上限|100|1,000|3,000|10,000|50,000 **※**|
|マルチステップZap|×|○|○|○|○|
|プレミアムApp|×|○|○|○|○|
|Paths|×|×|○|○|○|
|Autoreplay Tasks|×|×|○|○|○|
|Zap動作間隔|15分|15分|5分|5分|5分|

情報ソース: https://zapier.com/pricing/

※Teamsは実際にはTask上限がなく、50,000は**無料分**
50,000を超えた分は**従量課金**になってるのに注意！
https://zapier.com/teams/#team-accounts-landing-faqs

# Teamsとは

他のプランは個人利用を想定しているのに対して、
複数での利用を前提とした法人利用を想定しているプラン。

Teamsでは、*Organization*と*Member*の二つの概念があり、
まずは*Organization*のアカウントを作成し、支払いに使うクレジットカードを登録する。
登録後、*Organization*の設定画面からメールアドレスで*Member*をInviteする。
*Member*は有料プランの恩赦を受けてZapを自由に作成可能。

申し込みはここから: https://zapier.com/teams/

# 使ってみた感想

* OrganizationのアカウントからしかInvite出来ないと思ってたらMemberでもInviteできるから助かった
* マルチステップZapはすごい便利。必須。
  * Triggerで動く数が多すぎる時に絞り込む*Filter*や、文字のTrimやReplaceなどの*Action*は重要
* Zapの上限はあまり気にならないが、Taskの上限は組むZapによってはすぐ到達するかも。
* Zap Sharingにより、Zapや各サービスのアカウントが共有できる
    * [Announcing Shared Folders: Turning Automation into a Team Sport](https://zapier.com/blog/zapier-for-teams/)
* Autoreplay Taskは微妙
* プレミアムAppはまだ使ってないが、そのうち使うかもしれない。
  * 日頃使っているサービス(Slack, ChatWork, GMail)はそもそも普通に使える


# Q&A

## Zapってなんですか
1つの大きな処理の単位。*Trigger*と*Action*があり、
*Trigger*は「Gmailに新しいメールが来たら」とか、「Slackで特定条件のメッセージが来たら」などの処理の開始地点。
*Action*は「Slackの#generalにポストする」とか、「GMailつかってメールする」とか処理の最終地点。

## Taskってなんですか
Zapの中にあるActionが実際に動作した件数。
上限を超えるとそれ以降Zapは動作しなくなり、For Teamsでは従量課金の対象。

## Taskのカウント方法はどうなってますか
https://zapier.com/help/plans-pricing/#task より

* Actionが動作したら1タスクとしてカウント
* Triggerはタスクとしてカウントしない
* Filterは動作によってカウントが異なる
  * フィルタリングNGでせき止め(黄色)だったらカウントしない
  * フィルタリングOKでスルー(緑色)だったらカウントする
* フィルタリングNG以降にあるActionは動作しないのでカウントされない

## Task上限に到達したらどうなりますか
到達以降、Zapが動かなくなる。
上限は毎月の支払い日(Freeプランはアカウント作った日？)でリセットされる。
上位プランを勧めるメッセージがでるらしいけど、今Taskの上限全部いっしょじゃないかな・・・？

## Autoreplay Taskってなんすか
ActionがSaaS側のサービス障害とかでエラーになった場合に自動で再実行する機能。
障害メールをSlackのメッセージに流すような場合は重宝するかもしれないけど、
鮮度下がったものを再送されてもなぁ・・・という気もするので普通はいらないと思う

## 現在個人アカウントで使っているZapはTeamアカウントに移行できるか
移行可能。
<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/19644/5428c508-059c-49a1-fdd0-cbd3251e3e7b.png">
Inviteされた時や、設定画面から移行する設定が可能。
もちろん、Teamアカウントから個人アカウントに移すのもできるので安心。

## 現在、有料プランを契約してみんなで共有している。移行はできるか
可能。
ただ、個人アカウント有料プランの支払いとFor Teamsの支払いは別になっているので、
For Teamsを契約してからすぐに個人アカウントの有料プランをダウングレードしないとたぶんどっちも引き落とされる。

# 最後に

私はZapierの回し者ではないですが、
善意の業務改善でBOT作ってはみたけどソースコードとかの管理で悩んでる人達は
ZapierのTeamsを使うと幸せになると思います。
Excelで結合セルに値をコピー貼り付けしたいとき

結合されたセルに値を一括コピー貼り付けしようとすると、同じサイズの結合セルが必要だと言われて貼り付けできない。

が、なぜか数式で貼り付けたら貼り付けできた。
なぜ値貼り付けではできないのか・・・

![Excel数式コピー.png](https://qiita-image-store.s3.amazonaws.com/0/143913/bb4fa52e-829a-4148-229a-d306e443f1ef.png)
PythonからcoincheckのWebsocketAPIに接続する

# coincheckのWebSocketAPI

wss://ws-api.coincheck.com/

# 環境

Python 3.6.0 |Anaconda 4.3.0 (64-bit)

websocket-client (0.40.0)

入ってなければ `pip install websocket-client`

# 接続(取引履歴)

```py3
import json
from websocket import create_connection

ws = create_connection("wss://ws-api.coincheck.com/")

ws.send(json.dumps({
   "type": "subscribe",
   "channel": "btc_jpy-trades"
}))

while True:
	print (ws.recv())
```

# 接続(板)

```py3
import json
from websocket import create_connection

ws = create_connection("wss://ws-api.coincheck.com/")

ws.send(json.dumps({
   "type": "subscribe",
   "channel": "btc_jpy-orderbook"
}))

while True:
	print (ws.recv())

```

接続しても返ってこないなーと思っていたら取引が無かっただけでした()
SourceTree のユーザ情報に関する覚え書き


######リポジトリ一覧の右肩の歯車から設定するユーザID
→ リポジトリを作成する時に、使用するユーザ。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/73777/7344db3f-6c08-a716-4d78-a4b0c0a1857e.png "01.png")

***

###### いわゆる全体の環境設定から設定するユーザID
→ 各リポジトリで、コミットする時に使用するユーザ(のデフォルト)。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d6cbcd7a-3003-3a8a-ddda-e57d32fa7b93.png "02.png")

***

###### 各リポジトリで、右肩の歯車から設定するユーザID
→ 各リポジトリで、コミットする時に使用するユーザ。
デフォルトから変えたい時に個別に設定する。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/73777/5a6868f2-4339-20b7-598e-af99901cf0d7.png "03.png")



便利だけど、なかなかややこしいですね。
blade + vue で困る

# あらすじ

* blade と vue.js で記法が競合していて困った（困っている）
* 一応解決策はある
* もっとうまくどうにかしたい

という話です。

# mustache 競合問題

blade と vue.js ではどっちもデフォルトで `{{ 変数 }}` で変数を出力するようになっています。
そのため、blade 内で vue.js のテンプレートとして mustache を使いたい場合は`@{{ 変数 }}` という書き方をすることになります。

それはそれでいいんですが、サーバから渡された変数 `$foo = '{{ bar }}'` を blade 内で出力する時、同ページ内で vue.js を使っている場合は、以下のようなことが起きることが有ります。

```sample.blade.php
<p>{{ $foo }}</p>  -> {{ bar }} と表示されてほしい

↓ 変数が展開される

<p>{{ bar }}</p>

↓ vue.js が勘違いする

<p></p>  -> 該当する変数が vue.js のコンポーネントに存在せず、何も表示されない！
```

困りました。

# 対策1

vue.js ではこのテンプレートを変更できるようになっていて、例えば `{% 変数 %}` という風にもできます。これによって上記の問題をとりあえず避けることはできるんですが、根本的な解決にはなっていません。変数に変更後の記法が含まれていたら同じことが発生してしまいます。

# 対策2

ということで、今回は php (laravel) 内で echo のラッパー関数を作って、blade 内で `{{ $foo }}` と書いた時に、変数内の `{` `}` を全角に変換して vue.js が手を出さないようにするという方法を取りました。
……んですが、`{{ $foo }}` という書き方が出来ない場面が多々有り、そういう時は適宜 `my_echo($foo)` みたいなことをしなければならず……。

# 解決案

お待ちしています。
Djnagoメモ Content-Dispositionのfilenameに日本語をセットする

2020/2/7 追記
同僚から指摘があり、以下の修正をしました :bow: 

- filename=の値もurl encodeする

##目的
リクエストに対してファイルを日本語ファイル名（マルチバイト文字列を含むファイル名）でダウンロードしたい。Djangoに限らずWebアプリ全般に共通のことです。

## 環境
Django: 1.10.xx
Python: 3系

## Content-Diposition

httpでファイルをダウンロードするときはレスポンスのContent-Dispositionフィールドをセットする必要があります。ここでダウンロード時のファイル名や、すぐにダウンロードを実行するかなどを指定できます。

```httpレスポンス
Content-Type='application/pdf'
Content-Disposition: filename="hogehoge.pdf";
```

## DjangoのView
上記設定をDjangoのViewで行うとこのようになります。

肝は普通にファイル名をセットするのではなく、URLエンコーディングしたファイル名をセットしているというところです。
この設定でも行けるときは行ける気がしますが、ブラウザによっては文字化けします。

```view.py
from django.views.generic import View
import urllib.parse

class DownloadTestView(View):
    def get(self, request):
        test_filename = 'test.pdf'
        response = HttpResponse(status=200, content_type='application/pdf')
        """
        〜なんかPDF生成処理する〜
        """
        response['Content-Disposition'] = "filename='{}'".format(urllib.parse.quote(test_filename))
        return response
```

## 解決策
ブラウザによって挙動が違うということは、ブラウザによって処理を変えろということですね。
httpリクエストのUser-Agentフィールドを見ればアクセスしてきたブラウザ名が分かるので、ブラウザごとのif文をに職人が真心込めて…

というようなことをしなくても、Content-Dipositionのfilename*フィールドをセットすることで対応可能のようです。

参考: [ダウンロードファイル名、文字化けとの格闘](http://negiblog.hatenablog.com/entry/2015/06/19/%25e3%2583%2580%25e3%2582%25a6%25e3%2583%25b3%25e3%2583%25ad%25e3%2583%25bc%25e3%2583%2589%25e3%2583%2595%25e3%2582%25a1%25e3%2582%25a4%25e3%2583%25ab%25e5%2590%258d%25e3%2580%2581%25e6%2596%2587%25e5)

> Content-Disposition = filename="ファイル名"; filename*=UTF-8''URLエンコーディングされたファイル名;

これでなんとかなりそうです。

## 結論
最終的にDjangoのviewに落とし込むとこんな感じです。

```view.py
from django.views.generic import View
import urllib.parse

class DownloadTestView(View):
    def get(self, request):
        test_filename = 'test.pdf'
        quoted_filename = urllib.parse.quote(test_filename)

        # ついでに、RFC6266準拠しとく ("attachment" を追加)
        # https://tools.ietf.org/html/rfc6266#section-5
        response = HttpResponse(status=200, content_type='application/pdf')
        """
        〜なんかPDF生成処理する〜
        """
        response['Content-Disposition'] = "attachment;  filename='{}'; filename*=UTF-8''{}".format(quoted_filename, quoted_filename)
        return response
```
filename*にURLエンコードしたファイル名をセットすることで、各種ブラウザに対応できます。
Chrome、Firefox、Safariでは動作確認できました。
NativiferでTogglをアプリ化する手順

## 🎯ここでのゴール

Togglをアプリ化してタイムトラッキングを習慣化する。

## 🔀手順

### Nativifierをインストールする

```
brew install nativefier
```

### アプリを作成する

```
 nativefier --platform=darwin --arch=x64 https://toggl.com/app/timer
```

### 起動する

`Toggl-darwin-x64/Toggl.app` をダブルクリック!!

## 💚所感

* Nativifierが便利。
* [Nativefierでどんなウェブアプリも一撃Macアプリ化！ブラウザとアプリの用途を分けて仕事を効率化しよう](http://c16e.com/1511170923/)の情報が古いのとZipが消えさっているのは課題。
* 習慣化して自分の仕事状況を見える化したい。
Jupyter Notebookを単体テストやマニュアル作成ツールとして使う

Jupyter Notebook便利ですね、皆さん使ってますか？
コードの実装や確認にも便利なのですが、工夫をすれば単体テストやマニュアル制作まで出来てしまう優れものです。
この記事では、従来の使い方とは少し違う便利な使い方を紹介します。


# 単体テストに使う

Jupyterは結果を確認しながらコードを書けるので便利ですよね。
その確認作業をそのまま単体テストに使えるとしたら便利だと思いませんか？

[pytest-ipynb](https://pypi.python.org/pypi/pytest-ipynb)を使えばできます！

`pytest-ipynb`は、`pip`で簡単にインストールできます。

```
$ pip install pytest-ipynb
```

このモジュールは、テストライブラリ[py.test](http://pytest.org/latest-ja/)の拡張なので、py.testのインストールも必要です。

使い方は簡単でテストを入れているディレクトリに`test*.ipynb`の名前のNotebookを放り込むだけです。
あとはそのセルにテスト内容を以下のように書けばOKです。

```python:テスト例
''' mul test '''
a = 100 * 2
assert a == 200
```

マニュアルの機能一覧を意訳してみました。

- 'test*.ipynb'ファイルをディスカバリします
- Notebookの各セルが単体テストとして実行されます（assertを使うだけ）
- 各セルの最初の行のコメント(docstring)は、テスト名または関数名として扱われます。
- docstringに'fixture*'または'setup*'とすれば、それぞれの単体テストの前に実行されます
- docstringに'SKIPCI'と書けばTravis-CIでのテストはスキップされます（CI環境変数が定義されているかどうかを確認）
- IPython Notebookカーネルはテスト後にリスタートされます
- テスト時のワーキングフォルダは、.ipynbファイルのローカルです

訳に間違いがありましたら、ご指摘をお願いします。

あとは普通に`py.test -v`を実行するだけで、Notebookも含んだテストをしてくれます。


# Readme.mdに使う

GithubのReadme.mdにも使えます、実行結果を記載したい時などは手間が減って便利です。
私の作成したモジュール「Image4Layer」のGitHubも、JupyterからReadme.mdを生成しています。

https://github.com/pashango2/Image4Layer

JupyterのメニューからFile > Download as > Markdown(.md)と選択すれば、マークダウンのzipファイルが生成されます。

![メニュー_042.png](https://qiita-image-store.s3.amazonaws.com/0/140075/f81fadfb-6977-e3a1-12f1-653cf3495b33.png)

生成された.mdをリネームして微調整すれば完了です。
ただし画像などを生成した場合は、ルートディレクトリに画像を展開してしまうので修正が必要だと思います。


# Sphinxに使う
[「Sphinxを便利にして、みんなに使ってもらいたい」](http://qiita.com/pashango2/items/d1b379b699af85b529ce)という記事にも書きましたが、NotebookはSphinxにも追加することができます。
Sphinxの拡張に[nbsphinx](https://nbsphinx.readthedocs.io/en/0.2.12/)というものがあり、この拡張でJupyterノートブックを取り込むことができます。

インストールは`pip`で簡単に行えます。

```
pip install nbsphinx
```

Sphinxに取り込むと、以下のような表示になります。

![jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/140075/5f4be02d-2569-f626-155b-e9dc1c901aff.png)

Sphinxの詳細な設定は、以下の記事を参照してください。

[Sphinxのドキュメント作成を便利にする「sphinx-quickstart-plus」を作りました](http://qiita.com/pashango2/items/512e567b328058d4107a)
[Sphinxを便利にして、みんなに使ってもらいたい](http://qiita.com/pashango2/items/d1b379b699af85b529ce)

# 処理時間の計測に使う

基本的な事ですが、知らない方もいると思いますので記載しておきます。

`%timeit`コマンドでJupyterで関数の処理時間計測も計測してくれます。
しかも、処理時間のブレを考慮して適当な試行回数でベストな時間を計測してくれるので、自力で計測するよりも高品質な計測結果が取れます。
  
```
In [1]: %timeit l = [x ** 2 for x in range(1000)]
1000 loops, best of 3: 45 ms per loop
```

# まとめ

他の人のJupyter Notebook活用記事が読みたいです！
dns_get_recordを呼び出したときにエラーを吐く場合のとりあえずの対処法

dns_get_recordを呼び出した際に、以下のエラーが発生して処理が止まりました。
[こちらのバグレポート](https://bugs.php.net/bug.php?id=73149
)と同様のものです。

```
Warning Error: dns_get_record(): A temporary server error occurred.
```

ここで発生しているのはExceptionではなくエラーなので、dns_get_recordをtry-catchで括ってもキャッチすることはできません。

根本的な修正方法は、エラーハンドラーを正しく設定するなどだと思うのですが...
とりあえずこの箇所だけでもExceptionとしてキャッチすることで処理は継続できます。

```php
  // !!IMPORTANT!! https://bugs.php.net/bug.php?id=73149 の回避のために一時的にエラーハンドラを上書き                                                                                        
  set_error_handler(function($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
  });

  // DNSレコード取得
  try {
    $dnsRecord = dns_get_record($hostname);
  } catch (ErrorException $ee) {
    // 例外処理
  }

  // !!IMPORTANT!! エラーハンドラを元に戻す
  restore_error_handler();
```

set_error_handlerでエラーをErrorExceptionに変換し、処理が終わったらrestore_error_handlerで戻しています。
CentOS 7 / RHEL 7でNetworkManagerが有効な時のネットワーク設定の公式情報

# はじめに
他人のブログとかこことか読む前に、公式ドキュメントに当たろー。以下、ポインタ。

抜書は（し）ない。

# man
[nmcli-examples(7)](https://www.freebsd.org/cgi/man.cgi?query=nmcli-examples&manpath=CentOS+7.1)を読もー。以前さわったことがあれば、これ見たら、だいたい思い出すはず。

# 公式のドキュメント
[Red Hat Enterprise Linux 7 Networking Guide](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/pdf/Networking_Guide/Red_Hat_Enterprise_Linux-7-Networking_Guide-en-US.pdf)を読もー。初めてさわるとか、時間がちょっとある時は、こっち。丁寧で詳しい。

# なんでこれを書いたのか
自分が忘れやすい、以外の理由は、Google大明神のお告げでいただく、他人のノウハウのあれこれも、もちろんいいんだけど、公式ドキュメントを見つけやすく。（お告げの順番の上に来ないなら、Google大明神以外で、引っ掛けやすくしよう。）
Raspberry Pi / I2C > I2Cセンサからデータを読み取る (成功編) / link: Raspberry Pi で I2C の Repeated Start Condition を有効化

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
とあるI2Cセンサ
```

I2Cセンサの読取りを「手軽に」行おうとRaspberry Piを使い始めた。

その結果

- i2cdumpでSCL, SDAの波形を確認
   - アドレス範囲が広い場合: OK
   - アドレス範囲が狭い場合: NG
- i2cgetでSCL, SDAの波形を確認
   - NG
- RPi.GPIOにてpythonでコーディング
   - ACKの段階で応答がおかしい
   - RPiを使う意味があまりない (MSP430などのマイコンで良い)
   - RTOSがからんで、波形のタイミングも変わる
 
考えを変更した結果、以下ではうまく動いた。

https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=33334
のby edo1 » Fri Oct 30, 2015 4:49 pm
にあるコードを参考にしたら動いた。

あとは、この成功した状態でオシロにて波形を確認して、それと同等の波形を生成するコードをMSP430で実装するだけ。
問題はSDAのIN/OUTを切り替えるタイミングはオシロの波形からは分からない点。

なお、PythonでRPi.GPIOを使った後は、以下のコマンドを実行しないと最後のCコードは正常動作しなかった。

```
$ sudo modprobe -r i2c-bcm2708
$ sudo modprobe i2c-bcm2708
```

以下が実際に読み取った波形 (オレンジがSCL, 水色がSDA)。
![F0002TEK.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4aea4ae5-7983-71ee-4db5-8b8d6a705edf.png)

- 左カーソルの左側がstart condition。
- その後にslave address 0x28を送信 (7bit)。
- readビットである1を送信 (1bit)。
- 右カーソルからデータ読取 (1バイト目)。
  - 先頭2つはステータスビット(0x00なら正常)。

以下は1バイト目と2バイト目の波形。
![F0003TEK.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3b2b8158-bbbc-36a4-79a1-8eca2f2f0457.png)

SCLは100kHz。


圧力の単位換算
http://calc-site.com/units/pressure

### 教えていただいた事項

@fujiwarasoftservice さんの[コメント](http://qiita.com/7of9/items/0a3398ccf226733679b7/#comment-a3f2d55a4c412ea4592a)にてRepeated Start ConditionをRaspberry Piで行う方法を紹介いただきました。

情報感謝です。
PhpStormのコメントアウトショートカットキー

### ファイルのいずれかの行で以下のショートカットキー

#### //　行単位のコメントアウト
win : Ctrl + /
mac : Command + /

#### /**/ 　ブロック単位のコメントアウト
win : Ctrl + Shift + /
mac : Command + Shift + /
UILabel 角丸の枠線に対応する（IBDesignable/IBInspectableを活用）

数ヶ月前に、字間に対応したUILabelの実装について書きましたが、今回はそれの延長です。
http://qiita.com/sutchan/items/5fb089fabfefdd0e821c

今回は、角丸の枠線を持った、UILabelを実装します。

<img width="498" alt="スクリーンショット 2017-03-07 12.52.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/75329/766fbefa-378d-107e-6497-f53a496166de.png">


# 実装

まずは、UILabelを継承した独自クラスを実装します。（Extensionで実装できるかなと思ったけどだめだった）
なお、Swift 2.3の場合の実装です。他では試してません :bow: 

```swift
import UIKit
@IBDesignable
class BorderLabel: UILabel {
    @IBInspectable var borderColor: UIColor = UIColor.blackColor() {
        didSet{
            layer.borderColor = borderColor.CGColor
        }
    }
    
    @IBInspectable var borderWidth: CGFloat = 1.0 {
        didSet{
            layer.borderWidth = borderWidth
        }
    }
    
    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet{
            layer.cornerRadius = cornerRadius
        }
    }
}
```

今回は、ボーダーの色、幅、角丸を、Interface Builderから指定できるようにしました。
なお、IBInspectableで色を指定する場合、型はUIColorです。borderColorに色を代入する際には、CGColorにする必要があるので注意です。

# ボーダーを付けたいUILabelに、実装したクラスを指定

![スクリーンショット 2017-03-07 12.48.42.png](https://qiita-image-store.s3.amazonaws.com/0/75329/09e4c5eb-be0e-014e-434c-b7d205c4e80f.png)

# Attributes inspectorで各値が指定できる

![スクリーンショット 2017-03-07 12.38.22.png](https://qiita-image-store.s3.amazonaws.com/0/75329/fe2ac165-8326-c51a-96c6-f911407d4247.png)

完成！！

Interface Builderでも、指定した結果が確認できるから、実装しやすいですね！！
同じことをいくつかの環境に反映させるときに便利なコマンド

夜間にテンポラリファイルを削除するときに、本番環境とテスト環境のような複数あるけどほぼ同じ構造で同じことをしたいときにあると便利なコマンドです。

実際の処理を行うファイルです。同一階層の同一ファイル名で拡張子が「ini」となっているファイルをパラメータとして読込みます。

```bat:delete_file.bat
SET BASE_FOLDER=D:\DELETE_TARGET

rem -- 各環境情報の読込みを行い、該当ファイルを削除する
for /f "eol=' tokens=1" %%a in (%~dpn0.ini) do (
	echo.
	echo * %%a 環境のファイル削除
	del /q %BASE_FOLDER%\%%a\Server\Report\Output\*.xml
	del /q %BASE_FOLDER%\%%a\Server\Report\Output\*.rdf
	del /q %BASE_FOLDER%\%%a\Server\Report\Output\*.tmp
)
```


パラメータとなるファイルです。シングルコーテーションはコメントとなります。

```ini:delete_file.ini
'------------------------------------------------------------
'削除対象とする環境(フォルダ)名を列挙する
'------------------------------------------------------------
TEST1
TEST2
```

今回はファイル削除ですが、バックアップ等も同じ要領で使うことができます。
SSL申請

## CSR生成

```
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
```


<img width="675" alt="Screen Shot 2017-03-07 at 13.02.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/165810/fec348db-92e0-06dd-1e29-eda8d1c35cf3.png">

From: 入力詳細は[CSR詳細](http://www.ssl-concier.com/news/topics/230)

## インストール

事前に

```
sudo yum install mod_ssl
# if /etc/httpd/conf.d/ssl.conf not exists
```

```
# make back up
sudo cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.backup
```

ssl.confの設定

```
# tagの中を編集
<VirtualHost>
    SSLCertificateFile /etc/httpd/conf/ssl.crt/your_leaf_certificate.crt
    SSLCertificateKeyFile /etc/httpd/conf/ssl.key/your_domain_name.key
    SSLCACertificatePath /etc/httpd/conf/ssl.chain/your_intermediate_chain.crt
</VirtualHost>

# この行は外に記入
NameVirtualHost *:443

```

[SSL install outlink1](https://www.ssl2buy.com/wiki/install-ssl-certificate-on-apache-centos/)
[SSL install outlink2](https://cspssl.jp/support/apache/config-multi.php)

## HTTPSが繋がらない
iptablesをチェックして見ましょう
443/Httpsのアクセスを許可する必要がある
```
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT 
```
API Gateway => lambdaでxmlのpostを受け取る

## 背景

API Gateway x Lambda x DynamoDBで簡易的にデータを貯めるAPI環境があるとします。

IoTサービスで送信元が色んな形式でデータを送ってくる場合などに、
json形式でデータを送ってくれれば、特に問題ないのですが、デバイスに依存して
xmlなどでPOSTされてくると、API Gatewayでjsonに変換できないと怒られるので、メモ。

![スクリーンショット 2017-03-07 12.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/15074/87d15c3f-cfd7-0d4d-aeea-b73384b704e2.png)

API Gatewayの統合リクエストでテンプレートに下記を設定すると、
lambdaのeventにjsonが渡ってくる。

```
{
    "body" : $input.json('$')
}
```

あとはxmlから頑張って値を取得する。
【FileMaker】NumToJTextの落とし穴

FileMakerには、数字を扱うテキスト関数で"[NumToJText](https://www.filemaker.com/help/15/fmp/ja/index.html#page/FMP_Help%2Fnumtojtext.html%23)"という、数字を色々な形式に変換してくれるものがあります。

例えば、
セパレータなし
３桁ごとにカンマつけたい
全角にしたい
漢数字にしたい
など。

このとき、「数字」という部分に着目してくださいね。

例えば、"0012"を全角数字に置き換える場合、NumToJTextでは"００１２"にはなりません。

NumToJText( "0012" ; 0 ; 1 )

この場合は、"１２"と返されます。
数字を指定するからです。
でも、感覚的にはいくら数字とはいえ、"0012"と入れたから、"００１２"と返して欲しいじゃないですか。

なので、こういう時は、[RomanZenkaku](https://www.filemaker.com/help/15/fmp/ja/index.html#page/FMP_Help%2Fromanzenkaku.html%23)を使います。

RomanZenkaku( "0012" )

これだけです。
これで、"００１２"と返ってくれます。

これが一番役立つのは、郵便番号や住所を全角で表示するときなどではないでしょうか？

NumToJText( "123-0012" )
とすると、残念なことに、"123-12"と返ってきます。（ぜひやってみてね。ある意味面白いので）

RomanZenkaku( "123-0012" )
とすると、きちんと"１２３−００１２"と返ってきます。

NumToJTextのヘルプを見ると、「やった！全角できるんじゃん！」と思って安易に使うと、"0"落ちするので、使う場面をよーく考えてみてくださいね。
NumToJTextは、領収書の金額を漢数字で書くとか、マージフィールド表示で金額フィールドにカンマをつけたいなど「数字として取り扱いたいとき」の関数です。
郵便番号や住所に混在している数字を扱う時は、「テキストとして扱う」ので、RomanZenkakuを使ってくださいね。

これを理解していないと、ハマる時は、ハマります。
私も最初ハマりました。
bootstrap3 iscroll.js で 横スクロールするタブメニュー

しかもコピペでうごくやーん

```


    <style>


        #header,
        #footer {
            position: absolute;
            width: 100%;
        }


        #wrapper {
            position: absolute;
            height: 40px;
            z-index: 1;
            top: 30px;
            left: 0;
            width: 100%;
            overflow: hidden;
        }

        #main {
            position: absolute;
            z-index: 1;
            top: 70px;
            left: 0;
            width: 100%;
            overflow: hidden;
        }
        #wrapper ul {
            height: 100%; /* メニューの数に応じて 変更 */




        }

        #scroller {
            position: absolute;
            z-index: 1;
            width: 3000px;
            height: 20px;
        }
        #footer {
            bottom: 0;
        }

    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/iScroll/5.1.3/iscroll.js"></script>
    <script>
        var myScroll;

 window.onload = function() {
            myScroll = new IScroll('#wrapper', {
                scrollX: true,
                scrollY: false,
                mouseWheel: true,
                click: true
            });
        };
    </script>

<div id="header">
    ここにメニューを固定
</div>
<div id="wrapper">
    <ul id="scroller" class="nav nav-tabs">
        <li class="active"><a href="#home" data-toggle="tab">タブメニュー１</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#profile" data-toggle="tab">タブメニュー２</a></li>
        <li><a href="#last" data-toggle="tab">ラスト</a></li>



    </ul>
</div>

    <div id="main">
        <div class="tab-content">
            <div class="tab-pane active" id="home">

                PCの場合はマウスでスワイプできるやん<br>
                スマホの場合はフィンガーでスワイプできるやん<br>
                すてきやん<br>

            </div>
            <div class="tab-pane" id="profile">いいいいいいいいいい</div>
            <div class="tab-pane" id="last">ううううううううううう</div>
        </div>
    </div>

<div id="footer">
    これがフッター
</div>



```
数学的プログラミングのすすめ（初心者向け）

# 概要
元々「数学が得意な人向けのプログラミング入門」として書いていたものですが、内容が膨らみすぎたので、一部を削って改再編したものです。  
数学的な話はそれほど扱っていないので、言うほど数学的な内容ではないかも知れません。

# プログラミングに数学力が必要な理由
*「$ 1 \leqq a \leqq b $ のとき、$ a $ 年から $ b $ 年までの間に、うるう年はいくつありますか？」*

**うるう年**とは、以下のルールに基づいて決められる年のことです。

1. 西暦年が4で割り切れる年はうるう年。
2. ただし、西暦年が100で割り切れる年はうるう年ではない。
3. ただし、西暦年が400で割り切れる年はうるう年。

この質問を聞いたとき、数学力のなかった私は「一つずつ年を数え上げよう」と思いました。  
そこで下のようなプログラムコードを作って計算しようとしましたが、実行速度が遅すぎて使い物になりませんでした。

```OCaml
    (* written in OCaml *)
    (* URL: http://ocaml.jp/ *)
    let rec range a b =
        if a > b then []
        else a :: range (a+1) b;;
     
    let (a, b) = Scanf.scanf "%d %d\n" (fun a b -> (a, b)) in
    let years = range a b in
    let uruu = List.filter (fun x -> 
    						((x mod 4) == 0)
    						&& ((x mod 100) > 0)
    						|| ((x mod 400) == 0)) years in
    print_int (List.length uruu);
    print_newline()
```

パッと見て、多分何が書いてあるのかさっぱりわからないと思います。  
このコードの意味を理解する必要はありませんが、この方法だと**合計 $ b - a $ 回の計算が必要になる**事に注意してください。  
通常はこれでも良いのですが、扱う数字が大きい場合や組み込み機器の場合、計算に非常に時間がかかってしまいます。

この計算は、以下の方法でずっと速く行う事が出来ます。

```ruby
    # written in Ruby 2.x
    # URL:https://www.ruby-lang.org/ja/
    (a,b) = gets.chomp.split(" ").map {|n| n.to_i}
    
    a -= 1
    (auruu, buruu) = [a,b].map { |x| x / 4 - (x / 100).to_i + (x / 400).to_i }
     
    print (buruu - auruu).to_s, "\n"
```

このプログラムコードは上の物とは全くアプローチが違い、ある数式によりうるう年の数を導き出しています。  
3行目をご覧いただければ何となく分かるかもしれませんが、このコードは、以下の数式をもとに記述されています。

```math
f(x)=\frac{x}{4}-\left\lfloor \frac{x}{100}\right\rfloor+\left\lfloor \frac{x}{400}\right\rfloor
```

ここで、記号$ \lfloor \rfloor $はガウス記号(小数点以下切り捨て)をあらわします。  
この式を用いると、除算を利用して、 $ 1～x $ 年の間のうるう年の数を算出する事が出来ます。  
b-aこの年を全検索する方法に比べ、この計算式を使用すれば**たった一回の計算で**うるう年の数を算出する事が出来ます。  
たったこれだけのコードで、わかりやすく、しかも動作が速い処理が書けてしまうのです。
# 実装例：フィボナッチ数列
それでは、実際にプログラミング言語で数学関数を記述する例を紹介します。  
使用する言語はどれでも良いのですが、ここでは試しに、数学的な記法に近いとされている**関数型言語[Haskell](https://www.haskell.org)**を用いて、フィボナッチ数列を表す関数を記述してみます。  
フィボナッチ数列とは、下記の定義に基づく数列のことです。

```math
F_n=
\begin{cases}
0 &(n=0) \\
1 &(n=1) \\
F_{n-1}+F_{n-2} &(n \geq 2)
\end{cases}
```

この数式をHaskellの構文を用いて記述すると、以下のようになります。

```haskell
    fib :: Integer -> Integer
    fib n
        | n == 0    = 0
        | n == 1    = 1
        | n >= 2    = fib (n-1) + fib (n-2)
```

これはパターンマッチという構文で、`n`の値により結果を分岐させる動作を行います。 `=`が２つ連続しているのは右側の`=`と区別するためです。

5行目の後半に、関数名と同じ文字列が表れていることに注目してください。  
これは**再帰呼び出し**といい、「指定された引数を伴ってもう一度この関数を評価する」という動作をします。  
試しに`fib 3`を評価した場合、条件判断により`fib 2 + fib 1`が導出され、最終的な答えは`2`となります。  
このように、自分自身を呼び出す関数のことを**再帰関数**と呼びます。

再帰関数の仕組みは非常に強力です。  
以下のように、漸化式的な発想でアニメーションのような処理を作ることも出来ます（普通はしないけど･･･）[^1]。

```haskell
    update n x y = do
                   -- （描画処理など）
                   update (n+1) (x+vx) (y+vy)
                   where
                       r = n * pi/180.0
                       vx = sin r
                       vy = cos r
```

[^1]: （'21 11/25追記）実際にHaskellのコードを書くときは、このような再帰の構文を書かずにStateモナドを使った方が良いです。　この記述はあくまで例示だと思ってください。

# 最後に
今後は、ユークリッドの互除法などのアルゴリズムを中心に勉強していくと捗ると思います。  
プログラミングに数学力を生かせていないという方は、よければご参考にしてみてください。
不揃いな画像たちを中央下揃えに表示する

こんな感じです。

![0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/42231/abb79ef7-6d5f-c391-5312-2bdfc068909e.jpeg)

わかりやすくするために親要素の `li` に点線を指定しています。
商品画像を下揃えで表示したいときに使えると思います。
記述は下記です。

```
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>不揃いな画像たちを中央下揃えに表示する</title>
<style>
/* リストのスタイルや無駄な余白を消すために記述
---------------------------------- */
.abc li {
	margin:0;
	padding:0;
	list-style:none;
	float:left;
	border:1px dotted #666;
}

/* 中央下揃えに関するスタイル
---------------------------------- */
.abc li {
	width:180px; /* 表示する画像の最大横幅を指定 */
	height:170px; /* 表示する画像の最大縦幅を指定 */
	position:relative;
}
.abc img {
	position:absolute;
	left:0;
	right:0;
	bottom:0;
	margin:auto;
}
</style>
</head>
<body>

<ul class="abc">
	<li><img src="01.jpg" width="150" height="170" alt=""></li>
	<li><img src="02.jpg" width="150" height="120" alt=""></li>
	<li><img src="03.jpg" width="180" height="150" alt=""></li>
</ul>


</body>
</html>
```

親要素の `li` に画像の最大サイズを指定しないといけないのが、うーん...という感じです。

コメントの `display` バージョン、`flex` バージョンもお楽しみください。
「障碍者差別解消法」 施行に伴う努力義務の発生？

## 記事つらつら

施行そのものは 2016/4/1 

* [「障害者差別解消法」施行によってウェブ担当者が考えるべきこと](http://www.asobou.co.jp/blog/web/sabekai)
* [障害者差別解消法と、企業ウェブサイトの関連を調べてみた](http://aco-tokyo.com/journal/thinking/48/)
* [障害者差別解消法の三本柱](http://code.kzakza.com/2014/12/kaishoho_intro/)
* [JIS X 8341-3:2010とは](http://jis8341.net/what.html)
  * JIS X 8341-3 ＝ 高齢者・障害者等配慮設計指針－情報通信における機器、ソフトウェア及びサービス－第三部：ウェブコンテンツ
  * 最近では 2016年3月 に改正されている
  * [JIS X 8341-3:2016 解説](http://waic.jp/docs/jis2016/understanding/201604/)
* [簡易チェックシート用検証ツール](http://jis8341.net/check.html)

がんばって読み解く、、、
DateTimeの指定書式

# DateTimeの指定書式

## よくある書式指定
日付（DateTime）を文字列に変換することはよく行うと思います。
その時に出力する書式を指定するため、カスタム書式を利用しますね。
「日付は"/"で区切って、時刻は":"区切りで出力」という、よくある書式で出そうと思うと、このように書くことが多いと思います。

``` c#:
DateTime dt = new DateTime(2017, 1, 17, 8, 7, 4);
Console.WriteLine("日時は {0} です♪", dt.ToString("yyyy/MM/dd hh:mm:ss"));
```

さて、上記のコードでは出力される文字はなんでしょうか。
「日時は 2017/01/17 08:07:04 です♪」になりそうですが__そうなるとは限りません__

_ええっ、違うの？ダレカタスケテー_

## "/",":" もカスタム書式指定子
見落としがちですが、"/",":"もカスタム書式として定義されています。
（詳細は["/" カスタム書式指定子][link1]、[":" カスタム書式指定子][link2]を見てください）

[link1]:https://msdn.microsoft.com/ja-jp/library/8kb3ddd4(v=vs.110).aspx#dateSeparator
[link2]:https://msdn.microsoft.com/ja-jp/library/8kb3ddd4(v=vs.110).aspx#timeSeparator

要するに、"/",":" は日付、時刻の一般的な区切り文字を指定する書式であり、
"/",":"という固定の文字列を出力するわけではありません。

これはDateTimeのカルチャに依存します。
（日本のカルチャだと日付、時刻の区切り文字は「/」「:」で書式の文字と一致するため、勘違いしやすいですね）


## 日付、時刻の区切り文字を思ったように出力するには
そういう訳で、日付や時刻の区切り文字を厳密に指定したい場合の書き方です。
大きく２パターンあるので、好みに合わせて使ってください。

### 固定文字列として出力する
日付や時刻の区切り文字は固定なのだし、文字列でいいじゃん。という訳で日付、時刻を区切る場所に
固定の文字列として"/"、":"を設置する方法です。

```c#:Pattern1.cs
DateTime dt = new DateTime(2017, 1, 17, 8, 7, 4);
Console.WriteLine("日時は {0} です♪", dt.ToString("yyyy'/'MM'/'dd hh':'mm':'ss"));
```


### 区切り文字を指定する
フォーマット時に利用する日付、区切り文字を明示すればいいじゃん。という訳で明示的に日付、区切り文字を指定する方法です。

```c#:Pattern2.cs
System.Globalization.DateTimeFormatInfo dtf = new System.Globalization.DateTimeFormatInfo();
dtf.DateSeparator = "/";
dtf.TimeSeparator = ":";

DateTime dt = new DateTime(2017, 1, 17, 8, 7, 4);
Console.WriteLine("日時は {0} です♪", dt.ToString("yyyy/MM/dd hh:mm:ss"), dtf);
```

## まとめ
仕様書では明確に記載されていますが、ついつい見落としがちなDateTimeのカスタム書式についてでした。  
書式が少々違っても問題ない場合は気にする必要はありませんが、システム的に固定の書式でないと問題が起きる場合はきちんと明示するようにしましょう。:rice:
RDPのバージョン確認方法（Windows7）

# はじめに
RDPのバージョンの確認方法が少しだけとまどったので、確認方法をまとめます。
RDP8.0からUDPよりになり、速度等が改善したので変更したいと思い、現在のRDPのバージョンを調べました。　


# バージョン確認方法
## コマンドプロンプトによる確認方法
1.コマンドプロンプトを立ち上げます。
```Windowsキー + Rキー```→ ```cmdと入力```

2.下記コマンド実行(どちらかでOK)

```
REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v WDName
```

→```Microsoft RDP　7.1``` と出力

```
WMIC /NAMESPACE:\\root\cimv2\TerminalServices PATH WIN32_TSGeneralSetting GET TerminalName, TerminalProtocol
```

→```RDP-Tcp　Microsoft RDP 7.1``` と出力

# おわりに
RDP8.0の話は別記事で作成します。
3分でmatplotlibを日本語対応させる

# pythonのmatplotlibで日本語を扱う

+ Qiitaにもいくつかおんなじような記事あるんですが、なんか分かりにくかったので自分の為にまとめておく

+ 状況としては、macOS Sierra でmatplotlibのデフォルトのフォントが日本語対応しておらず、▫︎▫︎▫︎に(豆腐というらしい)　とりあえず、グラフに日本語が表示されてほしい！

## 手順

1. http://ipafont.ipa.go.jp/old/ipafont/download.html に行って、TTFファイルの4書体パックをダウンロード

2.

|font |name |family|
---|---|---|---|
|ipagp.ttf | IPAPGothic| [sans-serif]
|ipamp.ttf | IPAPMincho | [sans-serif]
|ipam.ttf | IPAMincho | [sans-serif]
|ipag.ttf | IPAGothic | [sans-serif]

な感じで対応しているみたい　(http://qiita.com/kshigeru/items/0cfc0778bab197687967 を参照)なので、

```python
plt.rcParams['font.family'] = 'IPAPGothic' #全体のフォントを設定
```

とする。ついでにグラフの大きさとか、縦軸、横軸のフォントサイズとかも設定しておこう：

```python
plt.rcParams["figure.figsize"] = [20, 12] # グラフのサイズを指定
plt.rcParams['font.size'] = 20 #フォントサイズを設定 default : 12
plt.rcParams['xtick.labelsize'] = 15 # 横軸のフォントサイズ
plt.rcParams['ytick.labelsize'] = 15 # 縦軸のフォントサイズ
```

----

３. 

~/.matplotlib/fontList.py3k.cacheがフォントのキャッシュファイルみたいなので、`rm -f ~/.matplotlib/fontList.py3k.cache`としたうえで、(Jupyter notebook上で)Runすると、


```python
%matplotlib inline
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'IPAPGothic' #全体のフォントを設定

plt.rcParams["figure.figsize"] = [20, 12]
plt.rcParams['font.size'] = 20 #フォントサイズを設定 default : 12
plt.rcParams['xtick.labelsize'] = 15 # 横軸のフォントサイズ
plt.rcParams['ytick.labelsize'] = 15

# test
df = DataFrame(np.arange(0, 12).reshape(6, -1), columns = ['始め','終わり'])
df.plot(kind = 'bar', x = '始め', y = '終わり').set(xlabel = '始め', ylabel = '終わり')
# plt.show()  # %matplotlib inlineを指定しているため、あってもなくても良い
```


![d.png](https://qiita-image-store.s3.amazonaws.com/0/133922/7d6e1666-7750-5792-8073-514f311a39eb.png)

じゃーん！
Xcode8以降でHardware IO Tools を使う方法は Additional Toolsをインストールすればいい

# 追記　2019/12/04

Additional Toolsが入らない時の対処法
https://discussionsjapan.apple.com/thread/110214366

# 元記事

「Xcode8以降でHardware IO Tools を使う方法は Additional Toolsをインストールすればいい」

<img width="731" alt="スクリーンショット 2017-03-07 11.56.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/70276/16ab7add-f0a7-ce37-2d64-90a8fed26daa.png">


上記以外の部分は下記を参考にしてください
http://dev.classmethod.jp/smartphone/iphone/network-link-conditioner/
SourceTreeで#で始まる番号の、GithubIssueとかRedmineへのリンクを貼る方法

題名通り。
ググって出てきた日本語のサイトの正規表現だと動かなかったので書く。

# この記事でやりたいこと

SourceTreeで、Commitの詳細が書いてあるPanelの中に書いてあるCommitMessageの `#` から始まるところをリンクにする。
そのリンクをクリックすると、GitHubIssueかRedmineのチケットを表示するようにする。

![スクリーンショット_2017-03-09_13_34_37.jpg](https://qiita-image-store.s3.amazonaws.com/0/93918/dd50309e-7dbe-05b1-b6b3-75263a551019.jpeg)
※画像は、[CakePHPDocsのGithubレポジトリ](https://github.com/cakephp/docs)のレポジトリを見ている場合です。

# 筆者設定とか
* 英語設定のSourceTree（日本語版でもOK）, Mac, 多分Windowsでもイケる。
* アイコンが表示されないようにしているけど、ボタンの場所とかは大して変わりません

# 設定場所

## 右上の「Settings」を押下

![1.png](https://qiita-image-store.s3.amazonaws.com/0/93918/25be0a8c-9d8c-1f42-69e3-4c1cd0a97754.png)

## 「Commit Text Replacements」の「Add」を押下
![2.png](https://qiita-image-store.s3.amazonaws.com/0/93918/4f786efe-fe6a-e488-e8cf-702a84da9486.png)

## 「Replacement Type:」を「Other」を選択

![3.png](https://qiita-image-store.s3.amazonaws.com/0/93918/dafb5659-d481-e51f-058f-5e0d976abf9d.png)


## これを設定

* `Regex Pattern` : `#(\d+)`
* `Replace With` : `<a href="http://(YOUR_HOST)/(YOUR_PATH)/issues/$1">#$1</a>`
* Githubであれば
    * `Replace With` : `<a href="https://github.com/(YOUR_ACCOUNT)/(YOUR_REPOSITORY)/issues/$1">#$1</a>`)

### 例: Githubなら

* `Regex Pattern` : `#(\d+)`
* `Replace With` : `<a href="https://github.com/ykeisuke/funny_proj/issues/$1">#$1</a>`

### 例: Redmineなら

* `Regex Pattern` : `#(\d+)`
* `Replace With` : `<a href="http://redmine:8080/funny_proj/issues/$1">#$1</a>`

### 実例: cakephp/doc なら


* `Regex Pattern` : `#(\d+)`
* `Replace With` : `<a href="<a href="https://github.com/cakephp/docs/issues/$1">#$1</a>">#$1</a>`


以上 φ('ᴗ'」)