OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby + Yahoo!リバースジオコーダAPI で緯度経度から住所情報を取得する

Ruby と YOLP Yahoo!リバースジオコーダAPI で緯度経度から住所情報を取得するサンプルコード。

## ソースコード

```ruby
require 'json'
require 'open-uri'
require 'pp'

def reverse_geocoder(lat, lng, yjdn_app_id)

  # YOLP(地図):Yahoo!リバースジオコーダAPI - Yahoo!デベロッパーネットワーク
  # http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/reversegeocoder.html
  base_url = 'https://map.yahooapis.jp/geoapi/V1/reverseGeoCoder'
  params = {
    'appid' => yjdn_app_id,
    'lat' => lat,
    'lon' => lng,
    'output' => 'json',
  }
  url = base_url + '?' + URI.encode_www_form(params)
  puts 'Reverse Geocoder URL: ' + url

  json = open(url).read

  data = JSON.parse(json)
  puts JSON.pretty_generate(data)

  feature = data['Feature'][0]

  codes = {}
  kana = ''
  feature['Property']['AddressElement'].each do |e|
    codes[e['Level']] = e['Code']
    kana = kana + e['Kana']
  end

  {
    'address' => feature['Property']['Address'],
    'kana' => kana,
    'pref_code' => codes['prefecture'],
    'city_code' => codes['city'],
  }
end

# Yahoo!デベロッパーネットワークのアプリケーションIDを指定
yjdn_app_id = '<YOUR APPID>'

# 緯度経度を指定
lat = 35.168068
lng = 136.855273

pp reverse_geocoder(lat, lng, yjdn_app_id)
```

## 実行結果

```
Reverse Geocoder URL: https://map.yahooapis.jp/geoapi/V1/reverseGeoCoder?appid=<YOUR APPID>&lat=35.168068&lon=136.855273&output=json
{
  "ResultInfo": {
    "Count": 1,
    "Total": 1,
    "Start": 1,
    "Latency": 0.0042788982391357,
    "Status": 200,
    "Description": "指定の地点の住所情報を取得する機能を提供します。",
    "Copyright": "Copyright (C) 2017 Yahoo Japan Corporation. All Rights Reserved.",
    "CompressType": ""
  },
  "Feature": [
    {
      "Property": {
        "Country": {
          "Code": "JP",
          "Name": "日本"
        },
        "Address": "愛知県名古屋市中村区太閤通９丁目",
        "AddressElement": [
          {
            "Name": "愛知県",
            "Kana": "あいちけん",
            "Level": "prefecture",
            "Code": "23"
          },
          {
            "Name": "名古屋市中村区",
            "Kana": "なごやしなかむらく",
            "Level": "city",
            "Code": "23105"
          },
          {
            "Name": "太閤通",
            "Kana": "たいこうとおり",
            "Level": "oaza"
          },
          {
            "Name": "９丁目",
            "Kana": "９ちょうめ",
            "Level": "aza"
          }
        ]
      },
      "Geometry": {
        "Type": "point",
        "Coordinates": "136.855273,35.168068"
      }
    }
  ]
}
{"address"=>"愛知県名古屋市中村区太閤通９丁目",
 "kana"=>"あいちけんなごやしなかむらくたいこうとおり９ちょうめ",
 "pref_code"=>"23",
 "city_code"=>"23105"}
```

## 参考資料
- [YOLP\(地図\):Yahoo\!リバースジオコーダAPI \- Yahoo\!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/reversegeocoder.html)
- [Ruby \+ Yahoo\!ジオコーダAPI で住所文字列から緯度経度や住所情報を取得する \- Qiita](https://qiita.com/niwasawa/items/6847da9f3a2c9a497119)
vagrant up時にsshポートフォワードが衝突して起動しない場合の対処

Vagrant で複数のプロジェクトの仮想マシンを同時に立ち上げようとしたとき、SSHのフォワードポートがすでに埋まってると言われて、同時起動しなくなることがあります。

> Vagrant cannot forward the specified ports on this VM, since they would collide with some other application that is already listening on these ports. The forwarded port to 2222 is already in use on the host machine.
>   :

基本、Vagrant は 2222 が埋まっていれば 2200 などの代替ポートを使おうとします。しかし `vagrant suspend` していたものを再稼働させたときだけは、SSHへのフォワードポートの衝突を自動解決しません。

エラーメッセージの最後にこうあります

> Sometimes, Vagrant will attempt to auto-correct this for you. In this case, Vagrant was unable to. This is usually because the guest machine is in a state which doesn't allow modifying port forwarding. You could try 'vagrant reload' (equivalent of running a halt followed by an up) so vagrant can attempt to auto-correct this upon booting. Be warned that any unsaved work might be lost.


`vagrant reload` して、ゲストをきっちり再起動させると、自動的に衝突が解消されます。

```
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
```

`Fixed port collision` とありますね。2222 が使えなかったので 2200 になりました。以後、2つのマシンで `vagrant suspend` と `vagrant up` のみを繰り返しているうちは、このマシンはずっと 2200 を使い、別のマシンは 2222 を使い続けます。

もし、慌てて別のポート番号を設定しようと Vagrantfile で固定ポートを指定すると、いよいよこいつが衝突したときは、解消方法がなくなって詰みます。

```
config.vm.network :forwarded_port, guest: 22, host: 1234
# こういうことはしなくていい
```
VBAでファイルの日付を変更する VBA With Powershell　change File time stamp

##単純なアウトライン
今回のVBAはファイルの日付を取得し、パワーシェルに入れて変更するというものです。
このため
作成日付、更新日付、最終アクセス日
を変更することができます。
パワーシェルを使うことで、簡単に変更ができます。
今回のはいくつか参照設定が必要ですが、あえて書きません。
なのでこれをコピペしたら動くようにはなっていません。
仮に動かしても、ファイルの作成日時等を取得してそのままもとのファイルに設定するため何も起きません。


```vb:testtimestamp.VBA
Sub testtimestamp()
' For Microsoft Office VBA
' Need Some Reference Setting
' Picuture folderの DSC03292.JPGの作成日時、更新日時、最終アクセス日時を取得し、再びその日付をこのファイルに設定します
' つまり何も起きませんが、ここから他のファイルに設定していくなどのコードに変えていくようになっています。
Const strFile As String = "DSC03292.JPG"
Dim CrDt As Date, MdDt As Date, AcDt As Date
Dim strPath As String
Dim wshr As New IWshRuntimeLibrary.WshShell
Dim FSOR As New FileSystemObject, ret
Dim Attr As Long
Dim Msg As String
strPath = wshr.ExpandEnvironmentStrings("%Userprofile%") & "\Pictures\"
Dim ofile As File
Set ofile = FSOR.GetFile(strPath & strFile)
Dim sCMD As String
CrDt = ofile.DateCreated
MdDt = ofile.DateLastModified
AcDt = ofile.DateLastAccessed

sCMD = "Powershell -command ""Set-executionpolicy remotesigned -scope process -force;[void] [Reflection.Assembly]::LoadWithPartialName(""""""System.Windows.Forms"""""");Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.Clipboard]::Clear();$sFile=""" & _
"'" & strPath & strFile & "'" & """" & _
";$mddt=get-date " & "'" & MdDt & _
"'" & ";$Crdt= get-date " & "'" & CrDt & "'" & _
";$ACDT=get-date " & "'" & AcDt & "'" & _
";set-Itemproperty $sfile -name Creationtime -value $crdt;set-Itemproperty $sfile -name LastWriteTime -value $acdt;set-Itemproperty $sfile -name LastAccessTime -value $acdt;"""
wshr.Run sCMD, 0, True
End Sub
```

# 必要性
第一の理由はセキュリティの関係でいえませんが、仕様です。
第二の理由は、Powershellへの送り込みが非常に`char(34)`を多用するのでエラー訂正が大変です。
このため、稼働するサンプルが必要になります。
第三の理由は、更新日時以外はVBAでは基本的に変えるのが困難だからです。
できるサンプルは一つだけで、極めて膨大です。それに比べるとウィルスとして誤検知されることがある程度以外欠点がありません。

## RunのWaitは信用できない
また、ExecではなくRunで稼働させるので、返り値がありません。Waitは大量のファイルの場合、効いていないと思えるときがあります。
その場合はSleepなどを使います。

## 撮影日付はWIAを使う
ここでは紹介しませんが、WIA(Windows Image Aquationwo)を参照設定して使う方法がシンプルでしょう。
jQueryを用いてHTMLを操作する方法

# jQueryでHTMLを操作するシーン
HTMLを編集できるのであれば、わざわざjQueryを用いる必要はないですが、
下記のような場合には、jQueryを利用してHTMLの編集が必要になるかと思います。

* ユーザーの操作に応じて、HTMLの内容を変えたいとき
* ABテストを行う際に、元のファイルはいじらずに外部ファイル(jQuery)を利用する場合
* HTMLの編集権限がないが、HTMLを編集したいとき



# HTMLを操作できるjQoery記述
## 要素の追加
### 指定したセレクタにクラスを追加

```html:qiita.rb
$('セレクタ').addClass('クラス名');

<!-- 利用例 -->
$('.sample').addClass('example');
```

### セレクト内を指定したhtmlに差替え

```html:qiita.rb
$('セレクタ').html('エレメント');

<!-- 利用例 -->
$('.sample').html('<p>sample</p>');
```

### 指定したセレクタの前にエレメントを追加

```html:qiita.rb
$('セレクタ').before('エレメント');

<!-- 利用例 -->
$('.sample').before('<p>sample</p>');
```

### 指定したエレメントをセレクトの前に追加(beforeと同じ動作)

```html:qiita.rb
$('エレメント').insertBefore('セレクタ');

<!-- 利用例 -->
$('<p>sample</p>').insertBefore('.sample');
```

### 指定したセレクタ内の一番前にエレメントを追加

```html:qiita.rb
$('セレクタ').prepend('エレメント');

<!-- 利用例 -->
$('.sample').prepend('<p>sample</p>');
```

### 指定したエレメントをセレクタ内の一番前に追加

```html:qiita.rb
$('エレメント').prependTo('セレクタ');

<!-- 利用例 -->
$('<p>sample</p>').prependTo('.sample');
```

### 指定したセレクタの後にエレメントを追加

```html:qiita.rb
$('セレクタ').after('エレメント');

<!-- 利用例 -->
$('.sample').after('<p>sample</p>');
```

### 指定したエレメントをセレクトの後に追加(afterと同じ動作)

```html:qiita.rb
$('エレメント').insertAfter('セレクタ');

<!-- 利用例 -->
$('<p>sample</p>').insertAfter('.sample');
```

### 指定したセレクタ内の一番後ろにエレメントを追加

```html:qiita.rb
$('セレクタ').append('エレメント');

<!-- 利用例 -->
$('.sample').append('<p>sample</p>');
```

### 指定したエレメントをセレクタ内の一番後ろに追加

```html:qiita.rb
$('エレメント').appendTo('セレクタ');

<!-- 利用例 -->
$('<p>sample</p>').appendTo('.sample');
```

### マッチしたエレメントを更にエレメントで囲む

```html:qiita.rb
$('セレクタ').wrap('エレメント');

<!-- 利用例 -->
$('li').wrap('<ul></ul>');
```

### マッチしたエレメントをまとめて新しいエレメントで囲む

```html:qiita.rb
$('セレクタ').wrapAll('エレメント');

<!-- 利用例 -->
$('ul').wrapAll('<div></div>');

### マッチしたエレメントの内側をエレメントで囲む

```html:qiita.rb
$('セレクタ').wrapInner('エレメント');

<!-- 利用例 -->
$('li').wrapInner('<ul></ul>');


## 要素の入替
### 特定セレクタの値を任意のものに差し替える

```html:qiita.rb
$('セレクタ').attr({
  'プロパティ': '値'
});

<!-- 利用例 -->
$('#sample').attr({
  'id': 'sample--onather',
  'src': 'xxx.html'
});
```

### 指定したセレクタのクラスのオン・オフを切替

```html:qiita.rb
$('セレクタ').toggleClass('クラス名');

<!-- 利用例 -->
$("p").click(function () {
  $(this).toggleClass("sample");
});
```

### 指定したセレクタのエレメントを差し替え

```html:qiita.rb
$('セレクタ').replaceWith('エレメント');
$('エレメント').replaceAll('セレクタ');

<!-- 利用例 -->
$('#sample').replaceWith('<p>sample</p>');
$('<p>sample</p>').replaceAll('#sample');
```


## 要素の削除
### 特定セレクタの値を削除

```html:qiita.rb
$('セレクタ').removeAttr({
  'プロパティ': '値'
});

<!-- 利用例 -->
$('#sample').removeAttr({
  'src': 'xxx.html'
});
```

### 指定したセレクタのクラスを削除

```html:qiita.rb
$('セレクタ').removeClass('クラス名');

<!-- 利用例 -->
$('#sample').removeClass('example');
```

### マッチしたエレメントを削除

```html:qiita.rb
$('セレクタ').remove();

<!-- 利用例 -->
$('#sample').remove();
```

### 指定したセレクトの子要素を削除

```html:qiita.rb
$('セレクタ').empty();

<!-- 利用例 -->
$('#sample').empty();
```

### 指定したセレクトの親要素を削除

```html:qiita.rb
$('セレクタ').unwrap();

<!-- 利用例 -->
$('#sample').unwrap();
```
jQueryで条件分岐する方法

# 記述方法
## if文

```JavaScript:qiita.rb
$(function(){
	if(条件1){
		//条件1にあった時の処理内容
	} else if(条件2){
		//条件1にあわなくて、条件2があった時の処理内容
	} else {
		//条件1と条件2がともにあわなかった時の処理内容
	}
});
```

## Switc文

```JavaScript:qiita.rb
$(function(){
	switch(条件){
		case 選択肢1 : 選択肢1だった時の処理; break;
		case 選択肢2 : 選択肢2だった時の処理; break;
		case 選択肢3 : 選択肢3だった時の処理; break;
		case 選択肢4 : 選択肢4だった時の処理; break;
		default : いずれにも当てはまらなかった時の処理;
	}
});
```

# 条件分岐使用例

```JavaScript:qiita.rb
$(function(){
	if($('#sample').length){
		/*id、sampleが存在していた場合の処理内容を記述*/
	} else if($('#sample').css('display') != 'none'){
		/*id、sampleのCSSが"display:none"以外の場合の処理内容を記述*/
	} else {
		/*上記条件にあわなかった時の処理内容を記述*/
	}
});
```
時間で処理する内容を変更する方法

# タイマー処理方法

* setTimeout：指定した時間の経過後に処理を繰り返し実行
* setInterval：指定した時間の経過後に処理を一度だけ実行


# 記述方法
## 指定した時間の経過後に処理を一度だけ実行

```JavaScript:qiita.rb
setTimeout(function(){}, 時間指定)
```

※繰り返し処理の関数の中で利用すれば、繰り返しも可

```JavaScript:qiita.rb
/* サンプル */
// 1秒(1000ミリ秒)後に処理を実行
$(function(){
    setTimeout(function(){
        /*ここに処理を記載*/
    },1000);
});
```

## 指定した時間の経過後に処理を繰り返し実行

```JavaScript:qiita.rb
setInterval(function(){}, 時間指定)
```

```JavaScript:qiita.rb
/* サンプル */
//1秒(1000ミリ秒)後に処理を実行
$(function(){
    setInterval(function(){
        /*ここに処理を記載*/
    },1000);
});
```


# 繰り返し処理における「setTimeout」と「setInterval」の違い

* setTimeout：処理開始時点から指定した時間の経過後に処理を繰り返す
* setInterval：処理終了時点から指定した時間の経過後に処理を繰り返す
AnimateCC（2017.1）のHTML5 Canvas書き出しを使用して気づいたこと

久々に**AnimateCC**（旧Flash）を使う機会があったので気づいたことを書いてみます。CreateJSやAnimateCCのアニメーション機能についてや古いFlash時代の情報がネットにあるけど、AnimateCCのHTML5 Canvas書き出しについて書かれている情報は少ないのではないかと思うので。

**AnimateCC**（2017.1）のHTML書き出しの種類には

* **HTML5 Canvas書き出し**
* WebGL書き出し

がある。WebGL書き出しはプレビュー版なので
実際に仕事で使用できるのは**HTML5 Canvas書き出し**のみ

* シェイプ画像はJSファイルに埋め込み出力※1 され、ビットマップ画像はスプライトシートにまとめられPNG出力※2される。
	* ※1 **レンダリング->ビットマップとしてキャッシュ** に設定されたシェイプ含む
	* ※2 個々のPNGとして出力する設定も可能	
* 出力されるPNGの種類（8・24・32bit）を選べるが、32bit書き出しにて、pngminなどで圧縮したほうが実用的
* CreateJSはJavaScriptの各モジュール機能には非対応
	* 普通にscriptタグで読み込む
	* シェイプ画像が埋め込まれたJSファイルは重いので`async`属性をつけて非同期読み込み完了チェック
	* 今後モジュール対応予定あり https://github.com/CreateJS/EaselJS/issues/713
* タイムラインアニメーションをシェイプ画像で作成した場合、フレーム毎にムービークリップシンボル変換、
**レンダリング -> ビットマップとしてキャッシュ**
にチェックする。
	* **ビットマップとしてキャッシュ**は、対象要素をCanvas内Canvasに置き換えることで、再描画の対象からはずれパフォーマンスが向上する。
	* EaselJSのDisplayObject.cache()と同機能
* シェイプ画像を**ビットマップに変換**は画像がボケて汚くなる
	* ビットマップ画像を使う場合は大きめの画像を使う
* タイムラインのアクションを使って`stop()`や`gotoAndStop()`など使う場合`this`をつけて`this.stop()`のようにする
* `createjs.Ticker.timingMode = createjs.Ticker.RAF_SYNCHED`
を使ったほうがよい。
	* `requestAnimationFrame`ベースの更新処理になる。
* `DisplayObject.cursor`にCSSのcursorプロパティを入れることでブラウザのカーソルを変えられる。
	* `-webkit-grab`などベンダープリフィックスもCSSと同じに指定する
* GIFアニメーション書き出し機能がリニューアルされて良い感じ
* stats.jsを使おう。ブックマークレットもある https://github.com/mrdoob/stats.js/
* 関連 https://blogs.adobe.com/creativestation/web-animate-cc-2017-new-features
Xamarin.Android では Java の ArrayList<T> は JavaList<T> だった

Google Maps Android API の Xamarin.Android 向け Binding ライブラリを使っていたときの話です。


[ポリゴンに穴を空けたい](https://developers.google.com/android/reference/com/google/android/gms/maps/model/Polygon.html?hl=ja#setHoles(java.util.List<? extends java.util.List<com.google.android.gms.maps.model.LatLng>>)) と思って、``Polygon.Holes`` を使おうとしました。
``Polygon.Holes.Add`` の引数は ``IList<LatLng>`` です。

おっけ、.NET の ``System.Collections.Generic.List<LatLng>`` 使うンゴ。

エラー！

```
Java.Lang.RuntimeException: Parcel: unable to marshal value System.Collections.Generic.List`1[Android.Gms.Maps.Model.LatLng]
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/0a4ab
```

あー知ってる知ってる。``Java.Lang.Object`` を継承したクラスでないとダメなやつでしょ？

えーと、``IList<T>``を実装してて ``Java.Lang.Object`` から派生してる ”Java の” リストはどれだ？

* ``ArrayList`` : Generic じゃない
* ``LinkedList<T>`` : ``IList<T>`` を実装してない

つか、Java の ``ArrayList<T>`` はどこだ？

うーんうーんと探し回っていたら、見つけました。

* [JavaList<T> Class - Xamarin](https://developer.xamarin.com/api/type/Android.Runtime.JavaList%3CT%3E/)

``Android.Runtime.JavaList<T>``!!
Java の ``ArrayList<T>`` は、Xamarin.Android では、 ``JavaList<T>`` にマップされています、気をつけて！

ちなみに [Xamarin.Forms.GoogleMaps](https://github.com/amay077/Xamarin.Forms.GoogleMaps/)は、もうすぐポリゴンの「穴」に対応します。
Javaで関数型にトライ！①

# 1．はじめに

　java8から関数型インターフェースが提供されるようになりましたが、みなさんのプロダクトではどの程度利用しているでしょうか？
　既に動いているプロダクトの場合、移行が難しい場合も多々あるかと思いますが、実際にプロダクトで利用してみてメリットが多いと感じたので、今回は実際に元の（関数型インターフェースを利用していない）サンプルコードを関数型インターフェースを利用して書き換えてみます。

※本稿ではライブラリJava8 + EclipseCollectionsを使用しています。(下記参照)
[EclipseCollections(旧GS Collections)の使い方](http://qiita.com/kohei789/items/a3ab9bebd182295920da)

# 2． 類似画像判定メソッドで関数型I/F実践
### 2．1 処理フロー

　下記は例として挙げる類似画像判定メソッドの処理フローになります。
　相違点としてemptyを記載しているとことですが、関数型I/Fを使用しない場合はnullを、使用する場合はOptional.emptyを返却します。

```title:類似画像判定メソッド処理フロー
　　画像ハッシュ値でDBから画像を検索
      _____________↓____________
      ↓ある                    ↓なし
   画像データを返却             ↓
                     画像の付加情報から候補を検索
                     ↓ある                 　↓なし
                     ↓                      ↓
　　　　　　    類似画像を検索           　    ↓
             ________↓_____                空返却
             ↓ある         ↓なし
             ↓            ↓
 類似画像データを返却      空返却

```


### 2．2 関数型I/Fを使用しない場合

　では上記のフローを関数型I/Fを使用しないで実装してみましょう。下記はコード例です。


```title:関数型I/F未使用
    /**
     * @param imageHash 画像hash値
     * @param addInfo 画像付加情報
     * @return 
     */
    public SimilarImageDto getImage(String imageHash, AddInfo addInfo) {
        //完全一致で検索
        val image = imageRepository.get(imageHash) 

        //存在したらDtoを生成し返却
        if ( image != null ) {
             return SimilarImageDto.create(image);

        //存在しない場合の処理
        } else {
            //付加情報から候補画像を検索
            List<ImageInfo> imgInfoList = imageInfoRepository.find(addInfo);
            //候補から類似判定。存在しない場合nullが返却される。
            if (CollectionUtils.isEmpty(imgInfoList) ) {
                return null;
            }

            for (ImageInfo imgInfo : imgInfoList) {

                //類似画像が存在したらDtoを生成して返却
                if( isSimilar(imgInfo) ){
                    return SimilarImageDto.create(imgInfo);
                }       
            }
            return null;
        }
    }

   //類似画像判定関数
   private boolean isSimilar(ImageInfo imgInfo) = {
       // 類似画像検索処理実施　
        return isSimilar;
    };

```


### 2．3 関数型I/Fを使用しない場合

　では上記のフローを関数型I/Fを使用して実装してみましょう。下記はコード例です。

```title:関数型I/F使用
    /**
     * @param imgHash 画像hash値
     * @param addInfo 画像付加情報
     * @return 
     */
    public Optional<SimilarImageDto> getImageOpt(String imgHash, AddInfo addInfo) {
        return imageRepository //
          .getOpt(imgHash) //完全一致で検索
          .map(img -> SimilarImageDto.create(img) )//存在したらDtoを生成し返却
          .orElseGet(() -> { //存在しない場合の処理
              return imageInfoRepository.find(addInfo) //付加情報から候補画像を検索
                 .detectOptional( imgInfo -> predicateSimilar.test(imgInfo) )// 候補から類似判定。存在しない場合Optional.emptyが返却される。
                 .map( imgInfo -> SimilarImageDto.create(imgInfo) );//類似画像が存在したらDtoを生成して返却
          });
    }

   //類似画像判定関数
   private Predicate<ImageInfo> predicateSimilar = imgInfo -> {
       // 類似画像検索処理実施　
        return isSimilar;
    };
```

# 3． 関数型I/Fを利用してみて
　
　いかがでしたでしょう？
　今回はシンプルなフローでしたが、より複雑になっていくと関数型I/Fを利用しない場合との差異がより顕著になります。
　コード量が短くなることもメリットなんですが、実際に導入してみて感じることは、nullチェックが不要になる、関数を利用することで副作用が減る、スコープが自然と小さくなる、またそれによりテストが簡潔になるなどをメリットとして感じます。
Asterisk と MySQL で始める迷惑電話対策

# はじめに
「**Web 画面のボタンを押すだけで迷惑電話をブロックできるよ！**」
…という目論見でやった話です。Asterisk には「BLACKLIST」という関数があるみたいですがコンソールで操作するしかない感じ[^blacklist]だったので「じゃあ実際にやってみっか！ｗ」という~~軽いノリで~~やりました。
~~SQL 文は結構雑なのでご了承ください。
Web UI の話などは一切しません。が、PHP でゴリゴリやってるということだけポロッと口を滑らせておきます。
「こうすればイケるんじゃない?」という読み物な感じでご覧ください。~~

なお、

* すでに ODBC 経由で CDR をやってる方は「Make TABLE」まで
* 設定だけ見たいんだけどという方は「Asterisk function」まで

それぞれかっ飛ばしてご覧ください。

# スペック
* FreeBSD(10.3-RELEASE / amd64)
* Asterisk(13.0 / by ports)
* MySQL(5.6 / by ports)

# 設定
## MySQL DATABASE
```sql:create_db.sql
CREATE DATABASE **使うデータベース名**;
```

## Asterisk ODBC[^odbc]
```bash:odbcinst.ini
[**ドライバ名**]
Description = ODBC for MySQL
Driver      = /usr/local/lib/libmyodbc5a.so
Setup       = /usr/local/lib/libodbcmyS.so
FileUsage   = 1
CharSet     = utf8
```
```bash:console
# odbcinst -q -d
[**ドライバ名**]
```

```bash:odbc.ini
[**DSN**]
Description = MySQL connection to 'asterisk' database
Driver      = **ドライバ名**
Database    = **使うデータベース名**
Server      = localhost
Port        = 3306
Socket      = /tmp/mysql.sock
Charset     = utf8
```
```bash:console
# isql -v **DSN** **DB ユーザー ID** **DB パスワード**
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> quit
# 
```

## Make TABLE
```sql:create_table.sql
CREATE TABLE IF NOT EXISTS **使うテーブル名**(
  id int(11) NOT NULL AUTO_INCREMENT,
  number varchar(20) NOT NULL,
  ban tinyint(1) NOT NULL DEFAULT '0'
);
```

## Asterisk function[^func_odbc]
```bash:func_odbc.conf
[CHECKBL]
dsn      = **DSN**
readsql  = SELECT COUNT(*) FROM **使うテーブル名** WHERE ban = '1' AND number='${SQL_ESC(${ARG1})}'
synopsis = Check if a caller is in the blacklist table
```

## Asterisk extentions example
```bash:extentions.conf
exten => 0.,n,GotoIf(${ODBC_CHECKBL(${CALLERID(num)})}?**実行するコンテキスト**,1)
```

# 参考リンク/注釈
[^blacklist]: [Asteriskで迷惑電話対策 | 道具眼日誌：古田-私的記録](http://do-gugan.com/~furuta/archives/2011/01/asterisk_2.html)
[^odbc]: [Asterisk 11 - VOIP-Info.jp Wiki](http://www.voip-info.jp/index.php/Asterisk_11_ODBC)
[^func_odbc]: [Asterisk func func_odbc - voip-info.org](https://www.voip-info.org/wiki/view/Asterisk+func+func_odbc)
Python3.6のEnumに自動で値を付けるautoを試す

# CやVBAのEnum
CやVBAのEnumでは、各メンバの値は指定してもしなくてもよく、指定しない場合は一つ前のメンバの数値+1になります。先頭のメンバは値を指定しないと0になります。

個人的には、VBAでCSVなどの入力ファイルを扱うときに、ファイルのフィールドを識別するためにEnum型が便利なのでよく使っていたりします。例えば次のような感じです。

```
Public Enum FieldID

     OrderNo = 1
     CustomerNo
     PurchaseDate
     ProductID = 10
     Price
     Units
     Amount

End Enum
```

この例のように、要素の数が少ない場合はありがたみが分からないかもしれませんが、数十列もあるファイルのフィールドを定義してる場合、列の追加や削除があってもすべてのメンバに番号の振りなおす必要がないので便利です。

Python3.6ではEnum型に自動で値をつける機能が追加されたので、同じようにできるのか試してみました。

## PythonのEnum

Pythonには、バージョン3.4でEnumクラスが標準ライブラリに追加されました。PythonのEnumについては、[こちら](http://qiita.com/methane/items/8612bdefd8fa4238cc44)の記事でよくまとめられてます。

[Enumライブラリのドキュメント](https://docs.python.org/3/library/enum.html)にあるように、Python3.6ではEnumに自動的に値を付けるための、`=auto()`という表現が追加されました。(実際には`auto`はクラスで、そのコンストラクタを呼んでいます。)

先程のVBAのコードと同じことを試してみました。

```py
from enum import IntEnum, auto

class Field(IntEnum):

   OrderNo = 1
   CustomerNo = auto()
   PurchaseDate = auto()
   ProductID = 10
   Price = auto()
   Units = auto()
   Amount = auto()

for elm in Field:
   print(elm, int(elm))
```

実行結果は、

```pycon
Field.OrderNo 1
Field.CustomerNo 2
Field.PurchaseDate 3
Field.ProductID 10
Field.Price 11
Field.Units 12
Field.Amount 13
```

となり、`auto()`と記述する必要はありますが、CやVBAのように自動でインクリメントするようです。ただ、最初のメンバを`=auto()`とすると、0ではなく1になります。

ただし、ライブラリのドキュメントに注意書きがあり、このインクリメントは実装依存とのことです。この振る舞いを恒久的にするには、自分で`auto()`の挙動を定義する必要があります。

`auto()`の返す値は、`_generate_next_value_`メソッドでカスタマイズ可能なので、`IntEnum`を継承したクラス`AutoIntoEnum`を作成して、`_generate_next_value_`を自分で定義しておきます。

```py
from enum import IntEnum, auto

class AutoIntEnum(IntEnum):

    def _generate_next_value_(name, start, count, last_values):
        for last_value in reversed(last_values):
            try:
                return last_value + 1
            except TypeError:
                pass
        else:
            return start

class Field(AutoIntEnum):

    OrderNo = auto()
    CustomerNo = auto()
    PurchaseDate = auto()
    ProductID = 10
    Price = auto()
    Units = auto()
    Amount = auto()

for elm in Field:
    print(elm, int(elm))
```
これで`_generate_next_value_`の実装が変わってもOKです。
`_generate_next_value_`の中身は、[Enumクラスのコード](https://github.com/python/cpython/blob/master/Lib/enum.py)からそのままコピペしました。
YQLを使ったGoogle +1のシェア数が取得できないとき

Google +1のシェア数を取得するサンプルコードやjQueryのプラグインでYQLを使ったものがよく紹介されていますが、2017年2月現在ではうまく動かなくなっているものがあります。

* 動かない例  
http://query.yahooapis.com/v1/public/yql?q=SELECT%20content%20FROM%20data%2eheaders%20WHERE%20url%3d%27https%3a%2f%2fplusone%2egoogle%2ecom%2f_%2f%2b1%2ffastbutton%3fhl%3dja%26url%3dhttp%3a%2f%2fqiita%2ecom%27&env=http%3a%2f%2fdatatables%2eorg%2falltables%2eenv

```xml
<error yahoo:lang="en-US"><description>No definition found for Table data.headers</description></error>
```

``env``が``http://datatables.org/alltables.env``になっている場合は、``env``を以下のように変更するとよいです。

```bash
store://datatables.org/alltableswithkeys
```

* 動く例  
http://query.yahooapis.com/v1/public/yql?q=SELECT%20content%20FROM%20data%2eheaders%20WHERE%20url%3d%27https%3a%2f%2fplusone%2egoogle%2ecom%2f_%2f%2b1%2ffastbutton%3fhl%3dja%26url%3dhttp%3a%2f%2fqiita%2ecom%27&env=store%3a%2f%2fdatatables%2eorg%2falltableswithkeys

# 参考
http://qiita.com/ktty1220/items/d1df9c66ca2663af03c7
monologさえめんどくさいけどPHPでログを出力したい場合のメモ


PHPでログを取る方法はいくつかあります。[monolog](http://qiita.com/zaburo/items/eacde522d36172d6d910)とかが一般的でしょうか。

が、それすらもめんどくさい場合にとりあえずログを出力する方法。まあ、何の事はない、file_put_contents()で出力するだけ。

```php
<?php
	
	echo tlog("foo","hoge");
	
	//一応関数にしておく
	function tlog($str,$path="tlog.log"){

		//日付を追加
		$row = date('Y-m-d H:i:s') . " ";
		//改行追加
		$row .= $str . "\n";
		//追記・排他で書き込み
		file_put_contents($path, $row, FILE_APPEND | LOCK_EX);

		return $row;
	}
```
EurekaのSwift 2.3対応の最終バージョンの指定の仕方

フォームを早く作るためのOSS、Eurekaがある。
EurekaのSwift 2.3サポートの最終バージョンは Eureka 1.7である。
これを利用するためにはSwift2.3ブランチから導入する。
Podfileの指定の仕方は次の通り。

`pod 'Eureka' , :git => 'https://github.com/xmartlabs/Eureka', :branch => ‘swift2.3’`

ブランチを指定せずに単純に1.7をインストールしようとすると、Swift 3用のソースコードが適用されてしまうのでご注意。
開発用証明書(CER)を作成


「[証明書署名要求(CSR)を作成](http://qiita.com/takuyaWt/items/50f3a1e549cca987d003)」の記事で、
作成したCSRをもとに、開発用証明書をここでは作成しましょう。

# Apple Developer Centerにアクセス
まずは、[Apple Developer Center](https://developer.apple.com/account/ios/certificate/)にアクセスして、ログイン。

![スクリーンショット 2016-09-01 18.54.25.png](https://qiita-image-store.s3.amazonaws.com/0/110085/b4113274-f1d9-2054-277a-f4da2a464ddd.png)

#Certificates
開発用証明書(CER)のトップページです、まだ一つも　証明書を作成していない場合に、
下の画面が表示されます。

![スクリーンショット 2016-09-01 18.55.31.png](https://qiita-image-store.s3.amazonaws.com/0/110085/cdfd4471-0703-cb91-8bf9-6e01c607444b.png)

#タイプを選択
作成する証明書の種類を決めます。
ここでは、開発用のものを作成するので、「iOS App Development」を選択してください。

![スクリーンショット 2016-09-01 18.56.10.png](https://qiita-image-store.s3.amazonaws.com/0/110085/37f78ee2-676c-788a-939b-ba9794a5bf92.png)

#証明書署名要求(CSR)についての説明ページ
このページは、CSRについての説明のみなので、「Continue」をクリックして次に行きましょう。

![スクリーンショット 2016-09-01 18.56.19.png](https://qiita-image-store.s3.amazonaws.com/0/110085/d673e973-d1ae-4029-6bd9-4a11721317e2.png)

#証明書署名要求(CSR)をアップロード
「[証明書署名要求(CSR)を作成](http://qiita.com/takuyaWt/items/50f3a1e549cca987d003)」の記事で作成したCSRファイルを選択しましょう。

![スクリーンショット 2016-09-01 18.57.12.png](https://qiita-image-store.s3.amazonaws.com/0/110085/f451a697-0c2c-043a-5fe2-9a56981f5a65.png)

#証明書(CER)をダウンロード
 これで、ダウンロードのボタンをクリックすると、証明書を取得できます。

![スクリーンショット 2016-09-01 18.57.26.png](https://qiita-image-store.s3.amazonaws.com/0/110085/0f22aebf-5748-67ca-22dd-9c9553fdbc57.png)
Cognos テキストボックスのプロンプトにデフォルト値として「現在時刻」「10日前日時」を埋め込む

Cognos BIのレポートでプロンプトページを作成し、開始日時と完了日時を以下のようにテキストボックスのプロンプトで指定したい場合に、デフォルト値として、10日前の時刻と現在時刻を入れておくJavaScriptのサンプルです。

##イメージ
この様なプロンプトページに、開始日時のテキストボックスプロンプト、完了日時のテキストボックスプロンプトを置いています。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9cfb86c0-5a49-a4a2-eacc-e7645fe08452.png)

レポートを実行すると、この様に開始日時には10日前の現在時刻、完了日時には現在時刻がデフォルト値として埋め込まれるイメージです。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7cf09422-462f-5e9e-7123-9fe9ab5ce8ad.png)


##実装
前提として、開始日時のプロンプトには「FDT」、完了日時のプロンプトには「TDT」という名前をプロパティから付与しています。

HTMLアイテムに以下のJavaScriptコードを記載します。

```html
<script language="javascript">

var f = (typeof getFormWarpRequest == "function" ? getFormWarpRequest() : document.forms["formWarpRequest"]);
var curtime = new Date();

//開始日時に10日前時刻を挿入
f._textEditBoxFDT.value = creDT(new Date(curtime - 10*24*60*60*1000 ));

//終了日時に現在時刻を挿入
f._textEditBoxTDT.value = creDT(new Date(curtime));

//日時のフォーマット変換
function creDT(crdt)
{
//[YYYY-MM-DD]で年月日作成
    var strDate = [crdt.getFullYear(),padding(crdt.getMonth()+1,2),padding(crdt.getDate(),2)].join("-");
//時分秒を追加
    strDate = strDate + " " + padding(crdt.getHours(),2) + ":" + padding(crdt.getMinutes(),2) + ":" + padding(crdt.getSeconds(),2);
    return strDate;
}

//桁合わせで0付与
function padding(src,fullbit)
{
    src = src.toString();
    for(i=0;i<fullbit-src.length;i++)
    {
        src = '0' + src;
    }
    return src;
}

</script> 
```
Windows10 仮想デスクトップ設定周り 個人メモ

何ができて何ができないのか調べたmemo書き

## 仮想デスクトップの確認 とか 追加とか削除とか
* windows + Tab
* タスクバー上のアイコン

## 仮想デスクトップの移動
ctrl + windows + ← or →

## 画面回転の停止
* ↑のショートカットーキーで誤って画面ぐるぐるするショートカットと打ち間違えることがある。
* デスクトップで右クリック → グラフィックオプション → ホットキー → 無効
* オマケ：画面ぐるぐる：ctrl + ALT + ← or → (Alt と win キーが近い)

## デスクトップごとに壁紙を変更する
* できない(´・ω・｀)

* 以下フリーソフトでできるらしいが、自PCでは何故か動かず
	* フリーソフト：[VirtualDesktopManager](http://forest.watch.impress.co.jp/docs/review/752577.html)

## ショートカットキーで起動中のアプリを移動する
できない(´・ω・｀)

## 左右じゃなくて上下左右とかにしたい
できない(´・ω・｀)

## 起動中のアプリを別の仮想デスクトップのタスクバーでも表示する
スタート → 設定 → マルチタスク

## Alt + Tab で 別の仮想デスクトップで起動してるものも表示する
スタート → 設定 → マルチタスク

## デスクトップ上のアイコンを共通表示させない
できないみたい

## マウス操作で仮想デスクトップ簡単に切り替えたい
フリーソフト：[コーナートピック](http://edutainment-fun.com/hidemaru/microsoft/windows10%E3%81%AE%E4%BB%AE%E6%83%B3%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%92%E3%83%9E%E3%82%A6%E3%82%B9%E3%81%A0%E3%81%91%E3%81%A7%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B_2620.html)

## 循環切り替えしたい
* 以下フリーソフトでできるらしいが、自PCでは何故か動かず
	* フリーソフト：[VirtualDesktopManager](http://forest.watch.impress.co.jp/docs/review/752577.html)
## 番号付与したい
同上

---

終わり
kiviのビルドと実行に関する調査


[前回、ビルド出来た！](http://qiita.com/akashima/items/b2450d1f9b42d1d893e0)と思っていた。
しかし、ビルドができていただけで動くアプリになっていませんでした。

そこで色々調査して回ったので、まとめておこうと思います。

# 調査結果などからわかったこと

本当の意味でのマルチプラットフォームじゃない、ということがわかりました。
Mac一つあれば、WindowsもMacもLinuxも使えるアプリが作れる、と思い込んでいました。

実際は、ライブラリの不足などで各開発環境毎に違ってくるようです。

以下にその例を書き残していきます。

## そもそもの開発環境

開発環境はこんな感じになります。

```
$ python
Python 2.7.13 (default, Dec 18 2016, 07:03:39)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import kivy
[INFO   ] [Logger      ] Record log in /Users/xxxxxxxx/.kivy/logs/kivy_17-02-16_10.txt
[INFO   ] [Kivy        ] v1.9.2.dev0, git-Unknown, 20170210
[INFO   ] [Python      ] v2.7.13 (default, Dec 18 2016, 07:03:39)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
```

MacをベースにWindows10 Pro, CentOS7を全部会社のマシン上にインストール。

### Macの場合

冒頭に記述した通り、app拡張子のファイルは生成できました。
しかし、起動してみると何も起こらないので、不思議に思い、何がおきてるのだろうと、直接起動してみた。

```
$ ./dist/xxxx.app/Contents/MacOS/xxxx
 ImportError: No module named importlib
Failed to execute script main
```

これが最後に出力されました。
原因を色々調べていたのですが、実際は、先頭行にimportが必要なだけだったようですが、これって環境依存だったりするのでしょうか？
(Macだけだったらイヤだな、の意味です）

```
import importlib
```

なお、先頭行に追加するまでに、以下のこともやってみました。（一応）

```
$ pip install -U pyobjc-core pyobjc importlib
```

深い意味はないです。
import importlibさえ記述できていれば起動できますので、意味がないです。
でも、ビルドエラーが出てるところがあるので、実行しておく方が良いのかもしれません。

### Windowsの場合

Macでビルドはできます。
でも、Windowsにビルドしたexeファイルを持っていくと起動しません。
どうやらwindowsはwindowsでビルドせよ、とのことです。
ということは、Linux環境に配布したければ、Linuxでコンパイルしろってことになるんですよね…。
AndroidやiOSはさすがにMacでもビルドできるので良いのですが、MacでWindowsを動かすWine入れたら動いたりするのかな？とちょっと悩ましい部分です。
もしくはビルド用に仮想マシンを構築するか…。（これが一番手っ取り早いけど、高くもつく）

確かにビルドログの中に、win32comがねーよってのはちょっと見かけてましたけど、まさかマルチプラットフォームできないのはちょっと残念です。

そして、Mac用にwin32comは用意されてないの？と、調べた結果が、[コレ](http://stackoverflow.com/questions/9233461/pywin32-com-objects-on-mac)でした。

```
COM is Windows only.
```

おうふ…。
なので、当セッションの最初の方のWine入れるか？とちょっと悩んだのですが、Wineが好きじゃない（問題発言）

と言うことで、次回のテーマは必然的にWindowsによるpythonの開発環境構築にします。

### Linuxの場合

LinuxもWindowsと同様でその環境でビルドしなきゃならないっぽいです。
MacでビルドしたファイルをLinuxに持っていき、下記の通り権限を持たせて見ましたが、実行されませんでした。

```
chmod a+x
```

そりゃkernel違えば動かないかもしれませんけど、マルチビルドしようと思ったら、各環境がないとビルドできないのか…
幸いWindows以外はビルドするだけならCUI環境が用意できるので良いです。

それでも動作確認は必要なので、GUIは必要なのかなぁ。

## 結論

各プラットフォームでpythonとkiviをインストールした環境を用意しましょう。
そして、ビルドは各々のプラットフォームで行いましょう。

次回は「Windows用環境構築、Cent OS用環境構築をそれぞれ作ってみた」です。
Shell流せば…とか淡い考え持ってたらWindowsで動かないことに気づいた、時代はAnsibleなのか！？（でも、VM上のマシンにAnsibleを流すにはどうすれば！？）
数値→文字変換速度最速王決定戦 in PHP7

数値を文字に変換するときにふと気になったのでやってみた。
気になったら業務時間中でも気にせず実験します。
だってエンジニアだもの。

# 候補
1. キャストするよ
1. strvalするよ
1. 空文字結合するよ

言語問わずよくある子たちですね！

# 環境
```
CentOS Linux release 7.3.1611 (Core)
PHP 7.0.15 (cli) (built: Jan 17 2017 17:10:58) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
```
よくあるLAMP環境です！

# 結論
１位 227 nsec/1process キャストするよ
２位 264 nsec/1process strvalするよ
３位 378 nsec/1process 空文字結合するよ

せっかちなので結論から行くスタイル。
1億回の処理時間から平均を算出。
キャストが最速。空文字結合は1.5倍程度かかる。

## 結果詳細
![image](https://qiita-image-store.s3.amazonaws.com/0/107279/b8102acd-c85c-d741-b2ff-5fdd9dfc13d9.png)
10万回を越えたあたりから平均値が安定しだしました。

# テストコード
自機でやってみたい人はどうぞ。

```php
<?php
// 時間計測が得意なフレンズ
function calc_time($target_func, $count)
{
  $begin = microtime(true);

  $target_func($count);

  $end = microtime(true);
  return $end-$begin;
}

// strvalが得意なフレンズ
function loop_strval($count = 10000)
{
  $i = 123456789;
  for ($i=0; $i < $count; $i++) {
    $val = strval($i);
  }
}

// 空文字結合が得意なフレンズ
function loop_addstr($count = 10000)
{
  $i = 123456789;
  for ($i=0; $i < $count; $i++) {
    $val = ''.$i;
  }
}

// キャストが得意なフレンズ
function loop_convstr($count = 10000)
{
  $i = 123456789;
  for ($i=0; $i < $count; $i++) {
    $val = (string)$i;
  }
}

// 挑戦者たち
$entries = [
  'loop_strval',
  'loop_addstr',
  'loop_convstr',
];

// カンマ区切りでとりあえず出力（適当）
for ($i=0; $i < 9; $i++) {
  $count = 10 ** $i;
  echo "{$count},";
  foreach ($entries as $entry) {
    $result = calc_time($entry, $count);
    $average = $result / $count;
    echo "{$result},";
  }
  echo "\n";
}
```
[Swift] 三角形のボタンを作る

## 概要
一般的なUIButtonで作成される四角いボタンになりますが、
UIButtonを利用して、三角形のボタンを作成する方法をご紹介します。
<img width="150" alt="end.png" src="https://qiita-image-store.s3.amazonaws.com/0/165931/4c1d105c-1115-e2b9-74c6-dfc34c2bffff.png">

## UIButtonを継承したクラスを作成
UIButtonを継承して専用のクラスを作成します。

```swift:triangleButton.swift
class TriangleButton: UIButton {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        drawTriangle()
    }

    private func drawTriangle() {
        let path = createTrianglePath()

        let mask = CAShapeLayer()
        mask.path = path.cgPath

        self.layer.masksToBounds = true
        self.layer.mask = mask

        let borderShape = CAShapeLayer()
        borderShape.path = path.cgPath
        borderShape.lineWidth = 4.0
        borderShape.strokeColor = UIColor.red.cgColor
        borderShape.fillColor = UIColor.clear.cgColor
        self.layer.insertSublayer(borderShape, at: 0)
    }

    private func createTrianglePath() -> UIBezierPath {
        let rect = self.frame
        let path = UIBezierPath()
        path.move(to: CGPoint(x:rect.width, y:0))
        path.addLine(to: CGPoint(x:rect.width, y:rect.height))
        path.addLine(to: CGPoint(x:0, y:rect.height))
        path.close()
        return path
    }
}
```

上記コードをstoryboard上でUIButtonのClassに指定して実行する事で三角形のボタンを表示する事ができます。
なお、UIButtonのテキストやボタン画像などを、三角形の中央に配置するためには、StroyboardのInset要素を利用することでボタンの中央に表示する事ができるようになります。

## ボタンのタッチ反応領域を設定する
ただし、上記のコードだけでは三角形の透過部分(上図画像のボタン左上部)がタッチに反応する状態のままです。

```swift
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if !createTrianglePath().contains(point) {
        // タッチ領域外
        return nil
    } else {
        return super.hitTest(point, with: event)
    }
}
```
上記のようにhitTestを利用して適切に反応領域を設定することで、ボタンとして表示されている箇所だけに反応するボタンを作成する事ができます。
技術書評「入門Ansible」

![51Ef9h7qfpL._SY346_.jpg](https://qiita-image-store.s3.amazonaws.com/0/20307/4b455cf1-2479-b2dc-84ff-a481f29098b8.jpeg)

「入門Ansible」 若山史郎

## 感想
- オススメ度 4/5
- Ansibleチュートリアルでちょこっと触って実際業務で使おうと思ったときに詰まることが多くなって買った
- 公式docsは英語しかないので、読むのが辛い人おすすめ
- ページ少ないし、サクッと体系的にansible眺められるのがいい
- これ一通り読んだあとなら、英語の公式Docもつらくない
- Best Practiceについてはあまり記載がないので、公式Docsや、Qiita上の記事を参考にしたほうがいい

## メモ
#### はじめに

#### Ansibleを使ってみよう

- inventoryに変数指定できる

```
some.hosts ansible_ssh_user=suzuki ansible_ssh_private_key_file=.ssh/hoge.pem
```

- groupにまとめて変数指定できる

```
[web]
hoge.com
fuga.com

[web:vars]
ansible_ssh_port=2222
```

- 入れ子設定できる

```
[apps:children]
group_1
group_2

[group_1]
hoge.com
[group_2]
fuga.com
```
#### playbookを使ってみよう
- handler と notifyが便利

#### 複雑なplaybookを作ってみよう
- 出力を保存して後で使う register
- 失敗しても無視する ignore_errors

#### 大規模なplaybookを構築してみよう
- group_vars: グループごとの変数設定
- host_vars: hostごとの変数設定
- roles/common/defaults/main.yml でroleのデフォルトの変数設定
- playbookのvars_fileで変数設定ファイル指定できる
- playbookにvars項目で変数指定できる
- ansible-playbookコマンドの--extra-vars="hoge=value"でコマンドから変数指定できる

#### コマンドラインオプションを使ってみよう
- `--private-key=key` で秘密鍵指定
- `--limit` で対象host制限
- `--check` でドライラン
- `--tag` でタスク制限

#### 変数ファイルの暗号化 - ansible-vault

#### 公開されているroleを使ってみよう - Ansible Galaxy

#### よくあるご質問
#### おわりに
cUrlメモ

#動機
http://blog.mach3.jp/2010/12/21/use-curl-for-filegetcontents.html
パフォーマンスアップ！
http://www.psi-net.co.jp/blog/?p=1123
タイムアウトを正確に設定する！


#GET
変更前
```
$url = 'https://api.cognitive.microsoft.com/＜サービス＞';
$header = 'Ocp-Apim-Subscription-Key: ' . $subscriptionKey;
$context = stream_context_create(array(
  'http' => array(
  'request_fulluri' => true,
  'header'  => $header,
  'timeout' => 1
  )
));
$response = file_get_contents($url, 0, $context);
```
変更後
```
$url = 'https://api.cognitive.microsoft.com/＜サービス＞';
$header = 'Ocp-Apim-Subscription-Key: ' . $subscriptionKey;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
$response = curl_exec($ch);
curl_close($ch);
```
ポイントは・・・Azureの管理画面での平均レスポンスタイムが400msだから1秒でいいかと設定したらタイムアウト発生しまくりで2秒が必須だったというあたりくらい。
最初認証OKなのにデータが返って無くて戸惑いました。
年末以降サーバーエラーとか遅延時間が増えたりとか６０秒以上反応返ってこないとか不安定なんですよね・・・（今回の変更のトリガー）
高々数KBのデータ受信に１秒以上かかるというのはAzureサービスの回線が細いのかな？


#POST
変更前
```
        $postdata = array(
           'hoge' => $hoge,
           'moge' => $moge
        );
        $postjson = json_encode($postdata);
        $header = array(
          "Content-Type: application/x-www-form-urlencoded",
          "Content-Length: ".strlen($postjson)+5
        );
        $postoption = array('http' => array(
           'method' => 'POST',
           'header' => implode("\r\n", $header),
           'content' => "json=".$postjson,
           'timeout' => 1
        ));
        $posturl = "http://localhost:123456/td.agent_log";
        $postrlt = file_get_contents($posturl, false, stream_context_create($postoption));
```
変更後
```
        $postdata = array(
           'hoge' => $hoge,
           'moge' => $moge
        );
        $postjson = json_encode($postdata);
        $posturl = "http://localhost:123456/td.agent_log";
        $ch = curl_init($posturl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.$postjson);
        curl_setopt($ch, CURLOPT_TIMEOUT, 1);
        $postrlt = curl_exec($ch);
        curl_close($ch);
```
一般的にはCURLOPT_POSTFIELDSには$postdataなのだろうけど、
td-agentのhttpが受取りの場合curlだと
curl -XPOST localhost:123456:/td.agent_log -d 'json={hoge:a, moge:b'}'
のように最初にフォーマットが付くので一般的にはしなくて良い変換とかが入っている。
接続エラーが発生することもあるのでhttpじゃなくてunix_socket使うほうがBetter。

#注意
curlをhttps接続で使う時は
putenv("NSS_SDB_USE_CACHE=yes");
をphpの頭等に加えること。
buffer/cacheが増加してメモリー使用量の監視アラートとかが飛んできます。
空きが少なくなると開放されるので動作自体には影響無さそうです。
参考：　http://qiita.com/bezeklik/items/7e1ac9e5da39261be7bd
glide使っててハマった時

# 状況

GAE/GoのProjectにglideを採用した後にginを追加した時

# 原因

ginと他libraryのprotobufのバージョンが違うから（恐らくginの依存管理で別のバージョンが打たれている）、
以下のようなログが出る。

```
[ERROR]	This error means the referenced package was not found.
[ERROR]	Missing file or directory errors usually occur when multiple packages
[ERROR]	share a common dependency and the first reference encountered by the scanner
[ERROR]	sets the version to one that does not contain a subpackage needed required
[ERROR]	by another package that uses the shared dependency. Try setting a
[ERROR]	version in your glide.yaml that works for all packages that share this
[ERROR]	dependency.
```

# 対処

とりあえず、最新のコミットIDをversionに記載する感じで・・
docker で全自動 Let's encrypt

https-portal があまり知られてないようなので紹介記事だけ書いとく。
https://github.com/SteveLTN/https-portal

あなたがすでにhttpで動作するサービスのdockerコンテナを持ってるなら、こいつを docker-compose に加えるだけで https 対応は完了。

え？

**加えるだけで完了。**

まじです。

# https-portal は何をするものか
基本的には https のリクエストを受け取り、他のコンテナの http へ転送するリバースプロキシとして動作する nginx である。
ところで https を提供するには証明書の取得、設定などが必要だが、こいつはそれを全自動でやってくれる。

え？

**証明書の取得、設定を全自動でやってくれる。**

まじです。

期間延長も自動でやってくれるらしい。

まあとにかく便利なので、 Let's encrypt したい人は使わない手はないですね。

# 設定方法
冒頭のURL見れば全部書いてあるので改めて書くこと何もないのだけど、 [Quick Start](https://github.com/SteveLTN/https-portal#quick-start) のとこだけコピペしてざっくり解説しておくと、

```yaml
https-portal:
  image: steveltn/https-portal:1
  ports:
    - '80:80'
    - '443:443'
  links:
    - wordpress
  restart: always
  environment:
    DOMAINS: 'wordpress.example.com -> http://wordpress'
    # STAGE: 'production'
    # FORCE_RENEW: 'true'

wordpress:
  image: wordpress
  links:
    - db:mysql

db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: '<a secure password>'
```
という感じ。 wordpress と db のとこは、おのおの公開したいwebサービスの設定と置き換わる。ポイントとなるのは https-portal.environment のあたり。

```yaml
    DOMAINS: 'wordpress.example.com -> http://wordpress'
```
左側が実際に公開したいドメイン名。 (当たり前だけどドメインは事前に取得しておく必要があり、 Let's encrypt が所有権を確認するためにはあらかじめDNSを設定しておく必要がある)
-> の右側は docker のコンテナ名。https-portal が受け取ったリクエストをこのURLへリダイレクトし、レスポンスをまたsslにして返却してくれるという感じ。

    # STAGE: 'production'
これコメントアウトしておくと、Let's encrypt せずに、オレオレ証明書を用いたhttps プロキシとして動作してくれるのでまずはこれでローカル環境などで動作確認をする。うまくhttps通信ができることを確認できたら、コメントを外してパブリックな環境にデプロイし、DNSを向けると、自動的に証明書を取得、設定してくれる。
0 ～ 65535.65535.65535.65535 までのバージョン表記を正規表現+αで調べたい

正規表現で範囲は向いていない。

# <i class="fa fa-cubes"></i> 要件

* 最大4ブロックの整数値によるバージョン表現をチェックしたい。
* 各ブロックは`.`で区切られる
* 1ブロックの値は`0`から`65535`まで
* 0以外の数値の先頭に0をつけてはいけない(ex:`0123`)
* ブロック数は任意である
* ただし、末尾は`.`で終わってはいけない

# <i class="fa fa-code"></i> コード

```js

var testcases = {
  ''                        : false,
  'test'                    : false,
  '0'                       : true,
  '1'                       : true,
  '1.0'                     : true,
  '1.0.0'                   : true,
  '1.0.0'                   : true,
  '1.0.0.0'                 : true,
  '1.0.0.0.'                : false,
  '1.0.0.0.0'               : false,
  '1.0.0.0.'                : false,
  '1..0.0.0'                : false,
  '01.2.3.4'                : false,
  '65535.65535.65535.65535' : true,
  '65536.65535.65535.65535' : false,
  '65535.65536.65535.65535' : false,
  '65535.65535.65536.65535' : false,
  '65535.65535.65535.65536' : false,
};


function tester(input) {
  if (!input.match(/^([1-9]\d{0,4}|0)(\.(([1-9]\d{0,4})|0)){0,3}$/)) {
    return false;
  }
  
  return input.split('.').every((value, index, array) => {
    return (Number(value) <= 65535);
  })
  
}

for (input in testcases) {
  console.log((tester(input) == testcases[input]));
}
```

先頭0の排除と0の両立がわからないのでかんたんな繰り返しと`|0`で逃げ。
65535の範囲も難しいので正規表現以外でキャストチェック。ここに穴があるかも。

# <i class="fa fa-book"></i> 参考…でもない

* [0から任意の数までにマッチする正規表現パターンを吐くスクリプト | たっぷす庵]  
難しい…


***

もっといいのがあれば

[0から任意の数までにマッチする正規表現パターンを吐くスクリプト | たっぷす庵]:https://stuncloud.wordpress.com/2010/09/24/0%E3%81%8B%E3%82%89%E4%BB%BB%E6%84%8F%E3%81%AE%E6%95%B0%E3%81%BE%E3%81%A7%E3%81%AB%E3%83%9E%E3%83%83%E3%83%81%E3%81%99%E3%82%8B%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/
MOON BLOCKでゲームを作ってみた。（一部scratchありandJavaSprict）

moon blockおもろ！！
1.http://moonblock.jp/#s/5889a8ad657e71485416621
2.http://moonblock.jp/#s/5892e893b35fe1486022803
3.http://moonblock.jp/#s/5892f3912c9c91486025617
4.http://moonblock.jp/#s/589837e9e627f1486370793
3を更新
3.(更新版)http://moonblock.jp/#s/58a55d66352611487232358
5.http://moonblock.jp/#s/58a5607a6c1481487233146
6.http://moonblock.jp/#s/58a567c8c85da1487235016
(よかったら遊んでください。)
https://scratch.mit.edu/projects/140748577/
更新します！！
爆走：
OSXでpip install dlibにハマったら

# 対象

* xbuildやpyenv等でpythonをインストールしてる
* dlibのインストールがフェイルする

# 再現

まずは↓のエントリー等を参考に依存ライブラリを入れておく。

http://qiita.com/naoyu822/items/7cce2f2dbad24931cc87

そのあとでdlibを入れる。
上記ではtarballを落としてきているが

```
pip install dlib
```

でもよい。

その際に最後に"libpython3.5.dylibがない"等のエラーが表示されてビルドがフェイルする。
所定のlibディレクトリ内をみるとlibpython3.5.dylibはなく、libpython3.5m.aがある。

# 解決

cpythonのビルドでは"--enable-framework"をつけるとOSXのFrameworkとしてビルドされるらしい。
そうするとdylibがlib以下に吐かれるようになる。

* xbuild

```
env PYTHON_CONFIGURE_OPTS="--enable-framework" xbuild/python-install 3.5.0 ~/local/python/3.5.0
```

* pyenv

```
env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.5.0
```

のようにするとdylibが吐かれる。
その後で再度```pip install dlib```するとインストールできる。
「JSON.swift」JSON取り扱いライブラリ、シンブルで便利

SwiftyJSON.swiftのファイルの長さに驚いたので、自分で作ってみました。

#### [JSON](https://github.com/Arczzir/JSON) ←ここ

```swift
let json = JSON(data: someData)

let json = JSON(object)
```

#### Subscript

```swift
// [JSON]?
let users = json["users"]

// JSON?
let user = users?[0]

// String?
let name = user?["name"]

// NSNumber?
let age = user?["age"].number

// Bool?
let bool = user?["married"].bool

// one liner
let name = json["users"]?[0]?["name"]?.string


// for in
if let users = json["users"].array {
    for user: JSON? in users {

    }
}

if let user = json["users"]?[0].dictionary {
    for (key, value) in user {

    }
}


// String
json.prettyPrinted()
```
Python3.4以降のrequests対応

# Python3.4以降において,requestsをpip3等でインスールする際のエラー対応

めっちゃ困ったこと.

```python:example.py
import requests
# ...
```

みたいなプログラムを作りたいときに,
<img width="481" alt="スクリーンショット 2017-02-16 16.55.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/123597/67d1f9ab-fae1-0c45-fcf5-f1d258d2537b.png">
実行したら、こんなエラーが出てしまった...

`No module named ...` であるから,いつものように

```
sudo pip3 install requests
```
したのだが...
<img width="687" alt="スクリーンショット 2017-02-16 16.56.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/123597/ec9bc911-cf3a-13c2-ff5f-8b419fc1357b.png">
またまたエラー...

なんか,これは3.4以降とubuntuとのバグらしい.

ちょっと調べてみると...

```
sudo apt-get install python3-requests
```

で解決されそう.  

<img width="626" alt="スクリーンショット 2017-02-16 17.01.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/123597/2c915647-4cd2-fd01-b8c9-201163abced8.png">

今度は,うまく解決できたみたい.

♪───Ｏ（≧∇≦）Ｏ────♪


## 参考
[how to install 'requests' module for 'python3'](http://askubuntu.com/questions/504068/how-to-install-requests-module-for-python3)
routeに共通の変数をつける

routeに共通の変数をつけるやり方を調べました。

# 環境

Ruby 2.3
Ruby on Rails 4.2

# やり方

```ruby:routes.rb
scope '(:key)' do
  resources :users
end
```

カッコをつけないと失敗します。

```:terminal

$ rake routes

=> 

user_index GET        (/:key)/users(.:format)           users#index
           POST       (/:key)/users(.:format)           users#create
  new_user GET        (/:key)/users/new(.:format)       users#new
 edit_user GET        (/:key)/users/:id/edit(.:format)  users#edit
      user GET        (/:key)/users/:id(.:format)       users#show
           PATCH      (/:key)/users/:id(.:format)       users#update
           PUT        (/:key)/users/:id(.:format)       users#update
           DELETE     (/:key)/users/:id(.:format)       users#destroy


```
AWS ALBでnginxのヘルスチェックを設定する

ヘルスチェックで普通はempty_gifを使って、1x1pxの透明gif返しますが、これでも多少の通信が発生してしまうので

* １ｘ１ｐxの透明gifの場合

```nginx.conf
    location /health {
        access_log off;
        empty_gif;
        break;
    }
```

HTTPステータス 204　no contentを使ってhttpのbodyを返さないようにする

* HTTPステータス 204の場合

```nginx.conf
    location /health {
        access_log off;
        return 204;
        break;
    }
```

但し、AWSのALBの設定でターゲットグループ＞ヘルスチェック＞成功コードを 『*204*』 に設定する必要があります。

これは、googleさんが、広告のトラッキングでjavascriptでimgタグを作ってトラッキングしている部分で、普通は1x1pxの透明gifを返しているところをHTTPステータス 204で返していたのを見て真似してみました。
gvmでGoインストール


MacにGoを入れた時のメモです。

## 環境
MacOS 10.12.3


## gvmインストール

goのバージョン管理用に[gvm](https://github.com/moovweb/gvm)をインストール

```
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```

スクリプトを実行して環境変数を設定

```
$ source ~/.gvm/scripts/gvm
```

ログイン時にも実行するように~/.bash_profileにも記載する

```~/.bash_profile
[[ -s ~/.gvm/scripts/gvm ]] && . ~/.gvm/scripts/gvm
```

## バージョンを確認

go1.7.5が最新の安定版のようなのでgo1.7.5をインストールする

```
$ gvm listall

gvm gos (available)

   go1
   go1.0.1
   go1.0.2
   go1.0.3
   go1.1
   go1.1.1
   go1.1.2
   go1.1rc2
   go1.1rc3
   go1.2
   go1.2.1
   go1.2.2
   go1.2rc2
   go1.2rc3
   go1.2rc4
   go1.2rc5
   go1.3
   go1.3.1
   go1.3.2
   go1.3.3
   go1.3beta1
   go1.3beta2
   go1.3rc1
   go1.3rc2
   go1.4
   go1.4.1
   go1.4.2
   go1.4.3
   go1.4beta1
   go1.4rc1
   go1.4rc2
   go1.5
   go1.5.1
   go1.5.2
   go1.5.3
   go1.5.4
   go1.5beta1
   go1.5beta2
   go1.5beta3
   go1.5rc1
   go1.6
   go1.6.1
   go1.6.2
   go1.6.3
   go1.6.4
   go1.6beta1
   go1.6beta2
   go1.6rc1
   go1.6rc2
   go1.7
   go1.7.1
   go1.7.2
   go1.7.3
   go1.7.4
   go1.7.5
   go1.7beta1
   go1.7beta2
   go1.7rc1
   go1.7rc2
   go1.7rc3
   go1.7rc4
   go1.7rc5
   go1.7rc6
   go1.8beta1
   go1.8beta2
   go1.8rc1
   go1.8rc2
   go1.8rc3
   release.r56
   release.r57
   release.r57.1
   release.r57.2
   release.r58
   release.r58.1
   release.r58.2
   release.r59
   release.r60
   release.r60.1
   release.r60.2
   release.r60.3
```

## go1.4をインストール

go1.7.5をインストールしようとするとgo1.4が必要との事なのでインストール

```
$ git clone -b release-branch.go1.4 https://go.googlesource.com/go $HOME/go1.4
$ cd $HOME/go1.4/src
$ ./make.bash
```

## go1.7.5をインストール

```
$ gvm install go1.7.5
```

go1.7.5をデフォルトで使うように設定

```
$ gvm use go1.7.5 --default
```

バージョン確認

```
$ go version
go version go1.7.5 darwin/amd64
```