OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonに関するメモ

# コメントアウト
```Python:01_Commnet_Out_Test.py（サンプル）
#! /usr/bin/python
# coding: UTF-8

def Comment_Out_Test():
    #print("コメントアウト")
    print("1")

    '''
    print("コメントアウト")
    '''
    print("2")

#main function
if __name__ == "__main__":
    Comment_Out_Test()
```

# List操作
```Python:02_List_Test.py（サンプル）
#! /usr/bin/python
# coding: UTF-8

def List_Test():
    a = list(range(10))

    print("a = " + str(a))
    
    b = list(range(3,4))
    print("b = " + str(b))
    
    c = a+b
    print("c = " + str(c))
    
    e = c[1:5]
    print("e = " + str(e))
    
    f = e[:-1]
    print("f = " + str(f))
    
    g = f[::-1]
    print("g = " + str(g))
    
    h = g[-1]
    print("h = " + str(h))

    
#main function
if __name__ == "__main__":
    List_Test()
```

（実行結果）
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [3]
c = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3]
e = [1, 2, 3, 4]
f = [1, 2, 3]
g = [3, 2, 1]
h = 1

# 例外処理

```Python:04_try_exception.py（サンプル）
#! /usr/bin/python
# coding: UTF-8

import sys

def Try_Except():
    try:#エラーがおきるかもしれない処理
        file = open ('log.txt','a') 
        print("File opened")
        file.write("OK\n")
        print("OK")
    except Exception as e:     #エラーが起きた時
        print("Error:"+str(e))
    finally:    #エラーの有無に関わらず必ず実行
        file.close()
        print("File closed")
        
#main function
if __name__ == "__main__":
    Try_Except()
```
GitHub APIでPull Requestにコメントを付ける

今度はコメントを付けてみたくなったのでやってみた。

# 前提
GitHubで「Personal access tokens」からrepoに対して操作可能な[Tokenを取得](http://qiita.com/kz800/items/497ec70bff3e555dacd0)しておく。

##GitHub APIリファレンス
[Create a comment](https://developer.github.com/v3/issues/comments/#create-a-comment)

# 実行してみる
## Pull Requestにコメントを付ける
```
curl -X POST -H 'Content-Type:application/json' -d "{\"body\":\"GitHub APIからコメント投稿\"}" https://api.github.com/repos/kz800/hoge/issues/1/comments?access_token=xxxxx
```
コメント投稿に成功するとAPIリファレンスにある形式でレスポンスがあります。

## 結果を確認してみる
コメントを付けたPRを開きます。
https://github.com/kz800/hoge/pull/1

ばっちりコメントが付いているので投稿成功です。
![image](https://qiita-image-store.s3.amazonaws.com/0/120234/18d7171d-de98-2c0a-48aa-d10055509b0c.png)

このAPIはPRに対してコメントを付けるAPIでしたが、
特定のファイルの特定の行にインラインコメントを付けるAPIもあるようなので、
そのうち試したら追記することにしよう。
Unity NGUIでUISprite等のMaterialのパラメータを動的に変更する方法

# 動作環境
Unity5.5.0f3
NGUI 3.11.1
#マテリアルパラメータ動的変更の方法
NGUIのUISprite、UITexture等でカスタムシェーダーを利用し、Materialのパラメータを動的に変更したい事があり、その方法を見つけたので忘備録として書いておく。

UIWidgetクラスにはUIDrawCall.OnRenderCallback onRenderというデリゲートがあり、これがOnWillRenderObjectの際に実行される。デリゲートは以下のように定義されているので、この引数で渡ってくるMaterialのパラメータを変更すればよい。

public delegate void OnRenderCallback (Material mat);

コード例を以下に示します。

```Test.cs
public class Test : MonoBehaviour {
	void Awake()
	{
		var widget = GetComponent<UIWidget>();
		widget.onRender = SetMaterialParamCB;
	}

	void SetMaterialParamCB(Material mat)
	{
		mat.SetFloat("_xx",1.0f);
	}
}
```
qrank add hatebu link

```javascript
// ==UserScript==
// @name        qrank add hatebu link
// @namespace   khsk
// @description はてブ数にはてブへのリンクを追加する
// @include     http://qrank.wbsrv.net*
// @version     1
// @grant       none
// ==/UserScript==

const entries = document.querySelectorAll('.table-entries.table>tbody>tr');
const HATEBU = 'http://b.hatena.ne.jp/entry/'

const getEntryUrl = td => {
  const a = td.getElementsByTagName('a')[0];
  // 投稿者名が入ってないやん！
  return a.href;
};

const addHatebuLink = (td, url) => {
  url = url.replace(/http:\/\//, '');
  td.innerHTML = '<a href="' + HATEBU + url + '">' + td.innerHTML + '</a>'
};

Array.prototype.forEach.call(entries, entry => {
  const url = getEntryUrl(entry.children[1]);
  addHatebuLink(entry.children[3], url);
});
```
RewriteRuleでURLエンコードされたクエリ付きURLへリダイレクトするには

# やりたいこと
> /foo をリクエストされたら http://example.com/?q=%26 へリダイレクトしたい。

`%26` は `&` をURLエンコードしたものなので、 q の値として `&` という1文字を渡すというだけのURLです。


# %1, %2, … が後方参照用の変数と解釈される罠

まず最初は単純に以下のような `RewriteRule` を書くと思う。

```apache
RewriteRule ^/foo http://example.com/?q=%26 [R,L]
```

これは期待通りに動いてくれない。
実際に /foo にアクセスしてみると http://example.com/?q=6 というURLに飛ばされます。

何故か？ `RewriteRule` では直前の RewriteCond で正規表現を利用した際にマッチしたグループを `%1, %2, %3...` という形で後方参照できるという機能がある為です。

つまり `%2` の部分が後方参照用の変数と解釈されて、しかし直前で `RewriteCond` は使っていないので `%2` は空となっており、結果として `%26` の部分が `(空文字) + 6` つまり `6` になってしまったわけです。

後方参照用の変数と解釈されないためには `%` を全て `\%` に書きなおしてやれば、そのまま `%` という1文字として解釈してくれることになっています。

# 勝手にURLエンコードされる罠

後方参照の罠を抜けるために以下のように書き直しました。

```apache
RewriteRule ^/foo http://example.com/?q=\%26 [R,L]
```

しかしこれも期待通りに動いてくれません。
実際に /foo にアクセスしてみると http://example.com/?q=%2526 というURLに飛ばされます。

何故か？ `RewriteRule` ではリダイレクト先URLにクエリが付いていてかつその値にURLエンコードすべき文字が含まれていると勝手にURLエンコードしてくれるという（邪魔な）機能がある為です。

つまり `%` の部分がURLエンコードされた結果 `%25` に置換され、結果として `%26` は `%2526` になってしまったわけです。

この勝手にURLエンコードされる仕様を回避するには `NE` または `noescape` というフラグを付けてやればよい事になっています。

# 完成形

これでようやく期待通りのリダイレクトが出来ました。

```apache
RewriteRule ^/foo http://example.com/?q=\%26 [R,L,NE]
```

おわり。
ページ内リンクでスムーズスクロール

jqueryを読み込んで、下記コードを入れるだけ。

※こちらはjquery1系列のみ動作します

```scroll.js
$(function(){
   // #で始まるアンカーをクリックした場合に処理
   $('a[href^=#]').click(function() {
      // スクロールの速度
      var speed = 400; // ミリ秒
      // アンカーの値取得
      var href= $(this).attr("href");
      // 移動先を取得
      var target = $(href == "#" || href == "" ? 'html' : href);
      // 移動先を数値で取得
      var position = target.offset().top;
      // スムーススクロール
      $('body,html').animate({scrollTop:position}, speed, 'swing');
      return false;
   });
});
```

jquery2系列、3系列の場合は下記

```scroll.js
   // #にダブルクォーテーションが必要
   $('a[href^="#"]').click(function() {
      var speed = 400;
      var href= $(this).attr("href");
      var target = $(href == "#" || href == "" ? 'html' : href);
      var position = target.offset().top;
      $('body,html').animate({scrollTop:position}, speed, 'swing');
      return false;
   });
});
```
redis のキーを走査する

redis はシングルプロセスで動くので、
大量のキーを走査する目的で `keys *` とかやるとえらいことになるので、
代わりに [`scan`](https://redis.io/commands/scan) 族を使うとよさげ、っていう話。

カーソルは0からスタートして、再度0になると1順したことになるので、全件走査はこんな感じ。
必ず `count` で指定した件数が取れるわけでもないらしい。

他に set, hash, zset に対するscanもあって、使い方はだいたい同じ。

意外とググっても情報出てこないのでメモ。

# python

```py3
import redis

r = redis.StrictRedis()

cr = 0
acc = 0
while True:
    cr, keys = r.scan(cr, match="*", count=10000)
    acc += len(keys)
    print(cr, len(keys), acc)

    if cr == 0:
        break

print(r.dbsize())
```

```text:stdout
60736 10001 10001
90528 10000 20001
827920 10001 30002

...(中略)

832503 10000 870045
864591 10000 880045
858799 10001 890046
853023 10000 900046
100191 10000 910046
529855 10001 920047
0 8407 928454
928454
```

# redis-cli

だとこれで自動的に1件ずつscanしてくれる。

```
$ redis-cli --scan --pattern '*'
```

```text:MONITOR
1487148044.325432 [0 172.17.0.1:35426] "SCAN" "877248" "MATCH" "*"
1487148044.325922 [0 172.17.0.1:35426] "SCAN" "320192" "MATCH" "*"
1487148044.331590 [0 172.17.0.1:35426] "SCAN" "385728" "MATCH" "*"
1487148044.332199 [0 172.17.0.1:35426] "SCAN" "70336" "MATCH" "*"
1487148044.332777 [0 172.17.0.1:35426] "SCAN" "824000" "MATCH" "*"
1487148044.333387 [0 172.17.0.1:35426] "SCAN" "496320" "MATCH" "*"
1487148044.333901 [0 172.17.0.1:35426] "SCAN" "53952" "MATCH" "*"
1487148044.349686 [0 172.17.0.1:35426] "SCAN" "381632" "MATCH" "*"
...（略）
```

先頭から何件か欲しい場合はパイプで `head -n 1000` とかに流すとよい。
tailだと駄目だけど。


# こっちの方が詳しい

けどまぁいいか。もう書いちゃったし。

http://ceblog.mediba.jp/post/134946112586/redis%E3%81%AE%E5%A4%A7%E9%87%8F%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%81%BB%E3%81%BC%E5%85%A8%E3%81%A6export%E3%81%99%E3%82%8B
TFT LCD(ILI9341)+アナログセンサ (esp8266+ atmega)

esp8266+ MCU連携の作例となります。
2.4inch TFT +Analog Sensor のDeepSleep(省エネ)版
NTP時計,アナログ温度センサー値の表示、
センサー値のクラウド送信の機能としています
![IMGP6422.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/71d59f87-5acd-e13e-54e4-9b3d7aac369b.jpeg)

### Youtube
https://www.youtube.com/watch?v=2ROQrfc_fiU

### Parts
![ss-ILI9341.png](https://qiita-image-store.s3.amazonaws.com/0/159710/8d2d2a1c-856c-2164-47d0-e18a0fc8997a.png)

1) 2.4" 240x320 SPI TFT LCD Serial Port Module+3.3V Pbc Adapter SD ILI9341 
/ 9.5 USD
 Display area:36.72(W)X48.96(H)mm
 Resolution (dots): 240RGB*320Dots
 Driver IC: ILI9341
2) Sensor LM60BIZ / 100JPY

### Git
Adafruit　さんのライブラリ参考にしています。
https://github.com/adafruit/Adafruit_ILI9341

makeKuc-TFT-1:
https://github.com/kuc-arc-f/makeKuc-TFT-1


### Schematic
esp8266+arduino搭載基板で、
TFT 周辺のみです。
![ss-TFT-0215a1.png](https://qiita-image-store.s3.amazonaws.com/0/159710/bc7127a8-02f4-c39b-3b7a-57ebe6cfe193.png)


*1) ボード側の都合で
REST : D2
DC : D3
としていますが。
arduino で使用する場合は、
REST : D8
DC : D9  で良いと思います。

*2) adafruitのサンプル　(examples/graphicstest )
https://github.com/adafruit/Adafruit_ILI9341/tree/master/examples/graphicstest
が動作しなかった為、RESET結線を追加し、コンストラクタを修正しています。
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

*3) LED(#7)は、VCC(3V3)  結線する必要があります。
*) 配線数が多めで、時間かかりました。

###温度ログ

![ss-Sensor-0215a3.png](https://qiita-image-store.s3.amazonaws.com/0/159710/fbebd66f-24d9-0181-6266-223143252239.png)

### related:
http://www.instructables.com/id/Cheap-TFT-22-inch-Display-on-Arduino-ILI9340C-or-I/

http://ht-deko.com/arduino/tft_spi.html
***
### まとめ
画面のレイアウト/描画表示速度の調整　等は。別途検討したいと思います。
とりあえず機能の実装を優先し、完了できたレベルです。


***
Linux Tips

# ファイルディスクリプタ確認
* トリガーとなったエラーメッセージ

```
# dmesg
VFS: file-max limit 794264 reached
```
* /proc/${PID}/fd/*の行数を確認

```
# cat /proc/sys/fs/file-nr
2208    0       794264
↑過去最大　現在　上限
```
Realmでカスケードデリートしたいので自前でプロトコルを定義した

Realmはカスケードデリートができないので、自分で削除する必要がある。
自分はこうした、という話。

## 環境

- RealmSwift 2.4.1で確認しています。

## 参考モデル

- BrandとShopがある
- Brand 1:n Shop の関係
- Brandを削除する際はShopも削除されてほしい

```swift:Brand.swift
class Brand:Object {
    dynamic var id = ""
    dynamic var name = ""
    let meals = LinkingObjects(fromType: Shop.self, property: "group")
}
```

```swift:Shop.swift
class Shop:Object {
    dynamic var id = ""
    dynamic var name = ""
    dynamic var brand: Brand?
}
```

## とりあえず消す書き方

```swift
let realm = try! Realm()
let brand = try! Realm().objects(Brand.self).first

realm.begin()
realm.delete(brand.shops)
realm.delete(brand)
try! realm.commitWrite()
```

この、とりあえず消す書き方をしていると辛くなるときが来る。

### 辛くなる兆候

- 各所で*とりあえず消す書き方*をしている
- モデルが複雑になるときがきた
    - 子要素の子要素になるモデルが作られた

`とりあえずの箇所 * 子要素の数`だけ手間が増えてしまう。
プロジェクト内一括置換でまぁ対処できるけどdeleteの順序とかルール化しないと漏れが発生すると思う。

## プロトコルを定義して実装させる

```swift
protocol DeletableChildren {
    func deleteChildren(from realm:Realm)
}
```

```swift:Brand.swift
// 実装を加筆
extension Brand: DeletableChildren {
    func deleteChildren(from realm: Realm) {
        realm.delete(self.shops)
    }
}
```

### 実装後の消し方

一応。

```swift
let realm = try! Realm()
let brand = try! Realm().objects(Brand.self).first

realm.begin()
brand.deleteChildren(from: realm)
realm.delete(brand)
try! realm.commitWrite()
```

## 何が嬉しい

- 子要素が増えても編集箇所を1箇所で済ませられる
- モデルに子要素削除を実装したことで、削除しなきゃならない子要素を見逃しにくくなった

まぁ、変更箇所は少ない方が良いし、兆候に気づいたら先手打ちたくなるよね。

## 参考URL

2017-02-15現在、カスケードデリート審議中の模様。
https://github.com/realm/realm-cocoa/issues/1186
PHPで適当なパイプ検知

標準入力で何か渡されているかの判定。

真面目にやるとストリームで徐々に渡されたらどうするの、みたいなのも考えないと駄目。
すごい適当にやる場合の話。

```php
<?php
$stdin = fopen('php://stdin', 'r');
stream_set_blocking($stdin, false);
$in = stream_get_contents($stdin);

if ($in) {
  // なんか渡されたらしい
  echo $in;
  // ...
} else {
  // なにも渡されなかったらしい
  // ...
}
```

```bash
$ echo 123 | php tekito.php
```

* ノンブロッキングモードにしないと、何も渡ってきてないときに待ちが発生して進まなくなってしまう
* `STDIN` 定数は `php -a` など、状況によっては定義されていないので、諦めてfopenで作ったほうがinteropが上がる
TracerouteをPython3で実装

# PythonでTracerouteを実装するにはどうするのかと思って、適当に調べたら、python2のコードは見つかったけど、3にするときにちょっと面倒だったので、Qiitaに公開しておこうと思った。の巻

## 元のありがたいURL
 [PythonでUDPトレースルート（traceroute）～ネットワーク経路調査](http://d.hatena.ne.jp/addition/20130501/1367403754)

[参考にした Stack Overflow](http://stackoverflow.com/questions/13999393/python-socket-sendto)

### 条件
```
$ python --version
Python 3.5.2
```
が出てくる状態

### 環境
```
$ uname -a
Darwin Naokis-MacBook.local 16.4.0 Darwin Kernel Version 16.4.0: Thu Dec 22 22:53:21 PST 2016; root:xnu-3789.41.3~3/RELEASE_X86_64 x86_64
```

``` Traceroute_python3.py
#!/usr/bin/env python
import sys
import socket

def traceroute(dest_name, port, max_hops):
    dest_addr = socket.gethostbyname(dest_name)
    print("target ==> %s (%s)" % (dest_name, dest_addr))

    socket.setdefaulttimeout(10)
    icmp = socket.getprotobyname('icmp')
    udp = socket.getprotobyname('udp')
    ttl = 1

    while True:
        recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
        send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
        send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
        recv_socket.bind(("", port))
        send_socket.sendto(bytes(512), (dest_addr, port))
        curr_addr = None
        curr_name = None
        try:
            curr_name, curr_addr = recv_socket.recvfrom(512)
            curr_addr = curr_addr[0]
            try:
                curr_name = socket.gethostbyaddr(curr_addr)[0]
            except socket.error:
                curr_name = curr_addr
        except socket.error:
            pass
        finally:
            send_socket.close()
            recv_socket.close()

        if curr_addr is not None:
            curr_host = "%s (%s)" % (curr_name, curr_addr)
        else:
            curr_host = "*"
        print("%d  %s" % (ttl, curr_host))

        ttl += 1
        if curr_name == dest_name or curr_addr == dest_addr or ttl > max_hops:
            break

if __name__ == "__main__":
    traceroute(str(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]))

```
---

# 例

``` CommandLine.sh
$ sudo python Traceroute_python3.py 8.8.8.8 33434 30
$ sudo python Traceroute_python3.py google.com 32141 30
```
どうも、普通のtracerouteと混ざったりするので、その辺は改良の余地があるのかもしれない。
モーダルウィンドウから脱出時のイベント


[参考サイト](http://stackoverflow.com/questions/8363802/bind-a-function-to-twitter-bootstrap-modal-close)

[参考サイト２ - 表示するときのイベントもあり](http://algo13.net/bootstrap/modal.html)

```javascript
//1. When modal "hide" event starts

$('#myModal').on('hide.bs.modal', function () { 
    console.log('Fired at start of hide event!');
});  

//2. When modal "hide" event finished

$('#myModal').on('hidden.bs.modal', function () {
    console.log('Fired when hide event has finished!');
});
```
TreasureDataで一定以上の時間がかかっているjobをGASを使ってSlackに通知する

# 背景

弊社では複数のサービスでTreasureDataを利用しており、ユーザ数も100以上でエンジニアからデータサイエンティスト、ビジネスサイドの人間とさまざまです。

アドホックなクエリを投げた際に、 `TD_TIME_RANGE` の設定をし忘れて、リソースを大量に食ってしまい、他のクエリに影響を与えてしまうなんてことがよくあります。
もちろん、priorityを使って運用するようにしていますが、実際のサービスで利用しているクエリに影響することもあります。

そこで、一定以上の時間動いているクエリをAPI経由で取得し、それをSlackに通知するGoogleAppsScriptを書きました。
しきい値以上のクエリでも、単にS3などへの外部の書き出しに時間がかかっていることもあるので、リソース状況（Mapper,Reducerの数）も一緒に通知してみました。

# Google Apps Script

あまりきれいなものではないですが、動いているのでお許し下さい。
今回はHiveクエリだけを対象にしています。

```js

var THRESHOLD = 1800; // しきい値30分以上
var TDAPIKEY  = '(TreasureData APIKEY)';
var WEBHOOKURL = 'https://(Slack Webhook URL)';


function postSlack(message) {
  var payload = {
    "text" : message,
    "username" : "The Machine", // "Person of Interest"が好きなので
    "channel" : "#treasuredata_alert"
  };
  var params = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  };
  var response = UrlFetchApp.fetch(WEBHOOKURL, params);
}

function tdJobList() {
  var options = {
    "method": "GET",
    "contentType" : "application/json",
    "headers" : {
      "AUTHORIZATION" : "TD1 " + TDAPIKEY
    }
  };
  var response = UrlFetchApp.fetch('https://api.treasuredata.com/v3/job/list?status=running&from=0&to=99', options);
  return JSON.parse(response);
}

function tdJobDetail(jobid) {
  var options = {
    "method": "GET",
    "contentType" : "application/json",
    "headers" : {
      "AUTHORIZATION" : "TD1 " + TDAPIKEY
    }
  };
  var response = UrlFetchApp.fetch('https://api.treasuredata.com/v3/job/show/' + jobid, options);
  return JSON.parse(response);
}

function getCpuUsage(jobid) {
  var job = tdJobDetail(jobid);
  var logs = job.debug.stderr.split('\n');
  var cpuUsage = [];
  logs.forEach(function(line) {
    if(line.match(/^Hadoop job information for /)) {
      cpuUsage.push(line)
    }
  });
  return cpuUsage;
}

function createAlertMsg(userName, url, database, query, cpuUsage) {
  var msg =  THRESHOLD / 60 + '分以上実行されているクエリがあります！ :dizzy_face: \n';
  msg += 'User: ' + userName + '\n';
  msg += 'Database: ' + database + '\n';
  msg += 'Query: ' + query.split('\n')[0] + ' .....\n';
  msg += '<' + url + '>\n';
  msg += 'Resource Usage:\n';
  msg += '```\n' + cpuUsage.join('\n') + '\n```\n';
  
  return msg;
}

function parseDate(str) {
  return new Date(str.replace(/-/g, "/").replace("UTC", "+00:00"));
}

function checkTdJobs() {
  var now = new Date();
  var response = tdJobList();
  var jobs = response.jobs
  jobs.forEach(function(job) {
    if (job.type !== 'hive') return;
    var startAt = parseDate(job.start_at);
    var duration = (now - startAt) / 1000;
    if (duration > THRESHOLD) {
      var cpuUsage = getCpuUsage(job.job_id);
      postSlack(createAlertMsg(job.user_name, job.url, job.database, job.query, cpuUsage));
    }
  })
}
```

# 通知結果

こんな感じで通知されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/48307/fa956fac-1ea9-464b-01e4-3872e3618d8e.png)
[iOS]標準の UIAlertController で複数行入力する UITextView を利用する

# UITextField なら簡単

1行だけ入力する UITextField なら簡単にできる。

```swift
let alert = UIAlertController(title:"title", message:"message", preferredStyle: .alert)
alert.addTextField(configurationHandler: { textField in
    textField.placeholder = "placeholder"
    textField.clearButtonMode = .whileEditing
    textField.text = defaultText
})
```

# UITextView などの CustomView を入れたい場合

強引に入れる必要がある。
以下の例だと [SnapKit](https://github.com/SnapKit/SnapKit) を使っています、自力で Autolayout 書く人は変換してください。

```swift
// textView を表示するための高さの担保のため、dummy で改行を表示する
let message = "message" + "\n\n\n\n\n\n\n"
let alert = UIAlertController(title: "title", message: message, preferredStyle: .alert)

let textView = UITextView()
textView.text = defaultText
textView.layer.borderColor = UIColor.lightGray.cgColor
textView.layer.borderWidth = 0.5
textView.layer.cornerRadius = 6

// textView を追加して Constraints を追加
alert.view.addSubview(textView)
textView.snp.makeConstraints { make in
    make.top.equalTo(75)
    make.left.equalTo(10)
    make.right.equalTo(-10)
    make.bottom.equalTo(-60)
}

// 画面が開いたあとでないと textView にフォーカスが当たらないため、遅らせて実行する
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    textView.becomeFirstResponder()
}

let okAction: UIAlertAction = UIAlertAction(
    title: "OK",
    style: UIAlertActionStyle.default,
    handler: { _ in
        print(textView.text)
    }
)
alert.addAction(okAction)
```

かなりキワドイコードになっていますが、ポイントは以下です。

1. message に改行を大量に表示する
    * Alert の高さを担保するため
2. textView を `top: 75, left: 10, right: -10, bottom: -60` で表示
    * Alert のタイトルの下、ボタンの上の領域（改行を大量に入れた部分）にいい感じに textView を表示する
    * キワドイ: 今後アラートの形式が変わると崩れる
3. 遅延処理で textView にフォーカスを当てる
    * 愚直に `textView. becomeFirstResponder()` を書いてもダメで、画面描画後にフォーカスを当てる必要がある
    * キワドイ: 0.3 秒は複数端末で試してこれくらいという体感値、0.1 だと反応せず0.5だと遅い

# 結果

いい感じに表示されました :tada:

![スクリーンショット 2017-02-15 16.56.46.png](https://qiita-image-store.s3.amazonaws.com/0/5678/ea2561f3-c310-3331-3de1-b68e2f3330ba.png)

# おまけ: [sberrevoets/SDCAlertView](https://github.com/sberrevoets/SDCAlertView) 

[sberrevoets/SDCAlertView](https://github.com/sberrevoets/SDCAlertView) を contentView というので綺麗に書けるが、これだけのためにライブラリに依存したくないし使わなかった。
MindMup > color names > matplotlibのリストを参考に

```txt:動作環境
Windows 7 pro
Google Chrome バージョン 56.0.2924.87
```

ソフト設計や各種資料作成のために使用しているツール。
https://drive.mindmup.com/

<kbd>Shift</kbd> + <kbd>Space</kbd>でcolor nameによる色付けができるようだ。

問題はそのcolor nameのリストが公式のページのヘルプに見つからないこと。

色で検索したところ、matplotlib関連のcolor nameリストは見つかった。
http://stackoverflow.com/questions/22408237/named-colors-in-matplotlib

[使用例 (2017/02/15 17:30以降有効)](https://atlas.mindmup.com/yasokada/mindmup_color_names_170215/index.html)
上記のリストの名前で使えそう。
( `y`のように一部使えないcolor nameはある )。
[翻訳] How to run a good code review - programming

# はじめに

GTDツールのNozbeのテンプレートにコードレビュー方法があったので、意訳してみました。コードレビューをし始めたいけど、何をレビューしたら良いのかわからない人は、これに倣ってみてはどうでしょうか。

- [How to run a good code review - programming by Stanisław](https://nozbe.how/vphty)
- [nozbe.how](https://how.nozbe.com/)
    - nozbeを使っていたら、GTDとして取り込めるテンプレートがいくつも掲載されています。

# 経緯を読む

機能追加やリファクタリングの経緯を理解すること。
何も取っ掛かりがなければレビュイーに取っ掛かりを書いてもらって下さい。

参照例：

- Githubの Pull Requestなど
- 関連するタスクチケットなど

関連する事柄を読み、質問して下さい。

下記の質問をし、返答をもらって下さい。

- 前提条件は何ですか？
- 最終ゴールは何ですか？

# 技術的な解釈を読む

他の誰かがコードレビューをした後、その人の指摘が解決しているかどうかを注意深く確認します。

# 機能を使ってみる（１５分）

ユーザの立場になって１５分間だけ、アプリを操作してみてください。

- 実装された機能は動きましたか？
- 意図したとおりに動いて、正しい結果を得られましたか？
- 軽快に動きましたか（遅いデバイスでも）？

# 修正や実装について考える

自問する：もし自身が実装するとしたらどのように書くべきだろうか？　実際のコードを思い出して自身のアイデアと比較してください。誰のアイデアがより良かったですか？もし自身のアイデアが良いと思うのなら修正の提案をして下さい。

# コードを読む

修正による影響を見逃していないかコードを確認してください。例えば、テスト時に要確認とするような、難しい実装の箇所など。

# コードを自身のローカル環境でコンパイル／実行してみる

ローカル環境に`pull`し、リモートに`push`する前と同じようにテストして下さい。

## 細かく確認してください

（下記がそぐわないなら、実行環境差異、実行モード差異、オフライン、エラー処理、異常系対応、情報漏洩有無などを確認しましょう）

- [ ] 少なくとも２つ以上のブラウザで起動してください
- [ ] 必ず実機で起動してください
- [ ] プロダクション版と同じようにデベロップメント版を操作して下さい
- [ ] オフライン状態で起動してください
- [ ] 取得可能なエラーを全て発生させてください
- [ ] フォームに異常な値を入れて何が起こるか確認してください
- [ ] データ漏洩が起こっていないか確認して下さい

# フィードバックしてください

コードを読み進めていく上で、文体、アーキテクチャ、その他の意思決定を恐れないでください。丁寧なフィードバック、質問、解決策の提案を行って下さい。

このように：

- 何故このようにしたのですか？
- ココでソレした理由は何ですか？
- これは２つに分割できなかったんですか？
- これはドキュメント化するべきだと思います
- この部分は分かりにくいです
- より明確な名前は"foo"だと思います
- これを別の関数に抽出するにはどうすべきですか？
- ソレは他の既存のコードより一貫性があると思います

# コードをもう一度読む

自問に適した質問事項：

- **全部のコードは読みやすいですか？** いくつかの小さなコードを理解するのに５分以上時間が掛かる場合、コードリーディングを止め、それを書いた人に説明してもらって下さい。コードが小さくないと思ったら、説明しやすいようリファクタリングやコメントの補記を提案してください。
- **コーディング規約に則っていますか？** コーディング規約に沿ってコードをテスト出来るようにして下さい。
- **コードはリリース可能ですか？** 冗長或いは重複したコードはありませんか？ コメントアウトしたコードはありませんか？ デバッグ記述などは除去できていますか？
- **コードはテスト可能ですか？** 複数或いは暗黙の依存関係がなく、テストフレームワークは単独で実行クラスやメソッドにアクセスできること。
- **コードはセキュリティ標準に即していますか？** プライバシーを尊重していますか？

# 総感を書く

気がついた箇所の指摘が終わった後、欠点は改善されている筈です。実装と機能全体の印象を説明します。

- この修正案はどのような改善をするか？
- どのようにその影響を測定するか？
- 想定外の異常系はあるか？

# 出荷しろ！

Remember: 出荷するまでは実績は無い！

- 待つな
- どのジョブも完了していないことに気付いた場合、フィードバックして下さい。
- **マージ** テストがパスするか、それ以上問題が見つからなければ実施して下さい。
- 祝え
勝手に他のクラスのプライベートメンバ変数を操作する

C++で、他のクラスや提供されたライブラリ内のクラスのプライベートメンバを勝手に変更する方法。
テンプレート特殊化をクラス定義外から定義可能なことを利用する。

	#include "stdafx.h"
	#include <iostream>

	class A{};
	class Human {

	private:
		int height = 175;
		int weight = 60;

	public:

		template <class A>
		void printSize(A a){
			std::cout << height + weight << std::endl;
		}
	};

	// プライベートメンバをコピーするためのクラス.
	class MyHuman{
	public:
		int *height;
		int *weight;
	};
	MyHuman mh; // グローバルに宣言.


	// 外部からテンプレート特殊化を行うことでプライベートメンバを操作できる.
	class B{};
	template <>
	void Human::printSize(B b) {
		// 自分で作成したグローバルクラスに勝手にアドレスを代入してしまう.
		mh.height = &height;
		mh.weight = &weight;
	}

	int _tmain(int argc, char* argv[])
	{
		Human h;
		A a;
		B b;

		// まずは通常のメソッドを呼ぶ.
		h.printSize(a);

		// 勝手に特殊化したメソッドを呼び、プライベートメンバーをグローバルオブジェクトmhに密かにコピーする.
		h.printSize(b);

        // ここからはに煮るなり焼くなりmhの値を好きに操作できる。

		// ポインタ経由で操作する.
		*(mh.height) = 100;
		*(mh.weight) = 100;

		// 値が書き換わっていることを確認する.
		h.printSize(a);

		return 0;
	}

参考
[[闇夜のC++]](http://cpp.aquariuscode.com/)
OSやユーザーエージェントに頼らずにモバイル端末か調べる

初めまして。Qiita初投稿です。
今回はOSやユーザーエージェントに頼らずに端末がモバイルかどうかを調べる方法を見つけたので、解説していきたいと思います。
# はじめに
皆さんはスマートフォンなどのモバイル向けのサイトを作ったことはありますか？
なんとMarketing Research Campが、2016年12月に行った調査によるとスマートフォンの利用率が72.0%でノートPC(57.8%)を超えているそうです。
ですが、まだまだパソコンからの利用があるというのも事実です。
そこで必要になってくるのがモバイル、PCの振り分けです。
ですがユーザーエージェントなどで振り分けるとどうしてもマイナーなブラウザには対応できなかったりしてしまいます。
# 本題のコード
そこで今回は発想を変えてこんなコードを使ってみました。
`window.orientation`
このコードはもともと画面の回転の向きを取得するコードです。
ですが実はこのコード、ノートPCなどから実行するとundefinedが返ってきます。
![スクリーンショット 2017-02-15 16.24.09.png](https://qiita-image-store.s3.amazonaws.com/0/159114/6316ef6d-17cc-a354-ac6b-b8b70d30cbac.png)
このことを利用してモバイルかどうかを判定します。
注:Android2.2以前ではサポートされていません。
型判定には`typeof`を使用します。

```javascript:例
if((typeof window.orientation)=="undefined"){
alert("モバイル端末じゃないよ");
}else{
alert("モバイル端末だよ");
}
```

こんなに簡潔に書くことができます。
# まとめ
`(typeof window.orientation)=="undefined"`がtrueの時はPCなどで、falseの時はモバイル端末です。
どんどんご利用いただければ嬉しいです。
JavaScript の && 演算子の落とし穴

以下のコードを見てください。

```js
let foo = "foo";
if (foo) console.log("bar");  // => "bar"
foo = null;
if (foo) console.log("bar");  // => 出力なし

foo = "foo";
console.log(foo && foo.length === 3);  // => true
foo = null;
console.log(foo && foo.length === 3);  // => null
```

最後の行は `false` を期待していたのですが、`null` が表示されます。

## どういうことか

[論理演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators) より引用：

> しかし、&& および || 演算子は、実際には、指定された演算対象の一方を返します。ですから、それらの演算子が、真偽値ではない値とともに用いられた場合、真偽値ではない値を返す可能性があります。

なるほど。つまり、`null && null.length === 3` は、`null` が `false` とみなされて右側は評価されず、しかし実際には `false` ではなくその値自体を返すため `null` が返される、ということです。

## 期待通りに動かすには

以下のようにします。

```js
console.log(foo !== null && foo.length === 3);
```

## まとめ

`if (foo) {}` とか `foo && foo.length` とかは使わずに、比較演算子を用いて厳密に比較しましょう。falsy な値は `null` や `undefined` だけではなく、`""` や `NaN` なども 
当てはまります。特に `""` は比較演算子を用いて評価しないと予期せぬ動作になるケースが多そうです。
kivy導入編

あまりにも情報が見つからないので自力で頑張るkivy記事です。
社会人勤めにつき、Advent Calendarは使いません。
不定期更新です。

作業OSはこんな感じです。

Mac OS 10.12.3(2017年02月15日)

## インストールの事前準備

本家サイトを参考にインストールを行う。
事前準備として、下記の作業を行なっておく。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Pythonの最新バージョンをインストールする

Pythonの最新版をインストールします。

```
brew install python python3
```

## 本家よりkivyを持ってくる

本家サイト([kivy.org](https://kivy.org/#home))から[kivy](https://kivy.org/docs/installation/installation-osx.html)を持ってきます。

指示に従い、下記のコマンドをガシガシ叩く

```
brew install sdl2 sdl2_image sdl2_ttf sdl2_mixer gstreamer
pip install -I Cython==0.23
USE_OSX_FRAMEWORKS=0 pip install kivy
```

開発版ってことなのでいらないかもしれない部分

```
USE_OSX_FRAMEWORKS=0 pip install https://github.com/kivy/kivy/archive/master.zip
```

実行しちゃいましたけどね

## テスト実行

以下の通りkivyを実行してみました。

```
$ kivy
zsh: command not found: kivy
```

(＃＾ω＾)ﾋﾟｷﾋﾟｷ

下記を拡張子pyにして、保存します。

```
import kivy
kivy.require('1.0.6') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.label import Label


class MyApp(App):

    def build(self):
        return Label(text='Hello world')


if __name__ == '__main__':
    MyApp().run()
```

Terminalから下記のコマンドを叩きます。

```
python xxx.py
```

動作すれば完成です。

次回のテーマは、「CUIからじゃなくて、exeやappとして動作させたいバージョンを作るまでがお仕事だ！」です。
お楽しみに！（このテンションは今回限りの勢いで書いた内容です。）
MACにMAMPとcakePHPとphpstormのインストール

自分用メモ
macでmampを使い、cakephpブログチュートリアルを進めます。


MAMP
https://www.mamp.info/en/
cakephp　ダウンロードして解凍(名前をcakephpに変更)
https://cakephp.org/jp
phpstorm
https://www.jetbrains.com/phpstorm/
cakephpブログチュートリアル
https://book.cakephp.org/2.0/ja/tutorials-and-examples.html

```
$ /Applications/MAMP/htdocs/
```
ここにcakephpフォルダを移動

```
$ /Applications/MAMP/htdocs/cakephp/
```

これでMAMPでサーバ起動したら

```
http://localhost:8888/cakephp/
```
をURL入力でcakephpのページが開ける
データベースができていないのでphpMyAdminに移動して設定する

MAMPからphpMyAdminに行けない時はURLを入力

```
http://localhost:8888/phpMyAdmin/
```
#phpstorm
configure - plugins - BrowseRepositories で CakeStorm をインストール

openでcakephpのところを開いて編集。そのままだとctpにハイライトがつかないので
PHP filesに拡張子ctpを追加
Setting → Editor → File Types で PHP files に *.ctp を追加。
拡張子ctpのファイルがシンタックスハイライト等が有効になる。


#チュートリアルの記事追加の部分のコードをnotEmpty()じゃなくnotBlank()に

そのままチュートリアル進めてると新規投稿をするときにエラーがでます

```
Validation::notEmpty() is deprecated. Use Validation::notBlank() instead. 
```
Post.phpの中の'notEmpty'を'notBlank'に変えましょう

http://ja.stackoverflow.com/questions/17516/validationnotempty-is-deprecated-use-validationnotblank-instead-%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B
APIゲートウェイを一覧化したい(随時更新予定)

随時情報をまとめていきます。

#ベンダー系
##API Manager:Microsoft社提供
参考：https://azure.microsoft.com/ja-jp/services/api-management/

##Amazon API Gateway:Amazon社提供
参考：https://aws.amazon.com/jp/api-gateway/

##Oracle API Gateway:Oracle社提供
参考：http://www.oracle.com/technetwork/jp/middleware/id-mgmt/oeg-300773-ja.html
　　　http://www.slideshare.net/rbg14952/oracle-api-gateway-27932040

#OSS系
##KONG
参考：https://getkong.org/
※2017年1月に有償版を提供開始。
(参考：http://www.briscola.co.jp/media/press/press_20161207.html)

##Tyk Open Source API Gateway
参考：https://tyk.io/

以下、マイナー(ネットで簡単には情報が拾えないレベル)OSS API Gatewayがまとめられております。
https://developer.ntt.com/ja/blog/0494a750-fb94-48bc-b048-651395ed187f
[css]ある要素をfloatを使わず左右の両端に配置する方法

今回紹介するのはfloatを使わずに両端に要素を配置する方法です。

#今回やりたかったこと、躓いたとこ
今回やりたかったことは
![スクリーンショット 2017-02-15 16.10.24.png](https://qiita-image-store.s3.amazonaws.com/0/163415/bb0da213-3ccf-0bed-cf74-a544af34576a.png)
こんな感じに両端に要素を配置したかった。
floatでできるとは思ったのだが、今流行りのflexに触りたかったため
flexでやることにしたのだが、両端に配置するという記事が探し出せず、２時間くらい時間を無駄にしてしまった。

#解決策
flexのプロパティをいろいろみて考えていたのだが、
justify-content:space-between;
これでいけることに気がついた。
こいつはflexアイテムの横方向の整列を指定するプロパティで、space-betweenは中の要素を均等の間隔で整列させるらしい。。

#まとめ
この配置はよく使うのでメモということで残しとく。
起動中のJavaプロセスに設定されているオプションの確認

# 1. jps で java プロセスIDを確認

```shell-session
$ jps
25241 Jps
2506 xxxx.jar
```

# 2. jcmd コマンドで オプション確認

1.で確認したプロセスIDを指定

```shell-session
$ jcmd 2506 VM.flags
2506:
-XX:CICompilerCount=2 -XX:InitialHeapSize=16777216 -XX:MaxHeapSize=262144000 -XX:MaxNewSize=87359488 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=5570560 -XX:OldSize=11206656 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
```

↑バイトで出るので変換したりする

https://byte.yonelabo.com/

# 参考

http://etc9.hatenablog.com/entry/2016/05/11/012037
メモ: OpenSSLビルド

```rb:Dockerfile
FROM ubuntu:16.04

COPY openssl-1.1.0d.tar.gz . 
RUN tar xzf openssl-1.1.0d.tar.gz \ 
 && cd openssl* \ 
 && ./config --prefix=/usr/local shared -fPIC \ 
 && make -s \ 
 && make install \ 
 && checkinstall -y -D --pkgname=opt-openssl 
```
cssで文字列を省略したいとき

今回ながすぎるテキストを省略したいときに使ったcssを紹介したいと思います。

#目指すもの

![スクリーンショット 2017-02-15 15.32.55.png](https://qiita-image-store.s3.amazonaws.com/0/163415/e8d0cab6-83ea-1f07-15cb-d0be25e1ad7a.png)
このように最後に「・・・」を入れて省略したいと思った。

#解決策
書いたコードは以下です。
![スクリーンショット 2017-02-15 15.35.10.png](https://qiita-image-store.s3.amazonaws.com/0/163415/f43c91e7-b6fb-e713-dbb0-65b231c9f887.png)

まずpタグの親のdivに横幅を決めてあげます。
pには画像のように3つのプロパティを指定しました。
一つずつ説明させていただきます。

1.overflow:hidden;
このプロパティはボックスからはみ出たものをどうするか指定することがあります。
今回ははみ出た分を消したかったのでhidden(はみ出たものを表示しない)を指定しました。

2.text-overflow:elipsis;
このプロパティはテキストがはみ出た場合にどうするか指定できます。
elipsisを指定することでテキストがはみ出たところから「・・・」に変えてくれます。

3.white-space:nowrap;
このプロパティはソース中のスペース・タブ・改行の表示の仕方を指定できます。
nowrapは改行させないようにします。

#まとめ
以上になります。
結構基本的なことかもしれませんが、ぱっとでなかったのでメモとして残すことにしました。
PlantUMLをMac OS Xで使う

![PlantUML Preview - Creator 2017-02-15 15-12-30.png](https://qiita-image-store.s3.amazonaws.com/0/34573/004ba2a1-a8b3-df2d-b1fb-31d0faf01aea.png "PlantUML Preview - Creator 2017-02-15 15-12-30.png")

### PlantUMLとは？

PlantUMLは「ぷらんとうまる」と読み([^※1])、UMLのテキスト記述のフォーマット&画像化するツールのことです。

こんな感じのUML画像が、テキストから生成できます。
UMLモデリングとか、エクセルのワードシェイプでなんかやりたくないですよね！
テキストなので、git上で管理もできます。


[^※1]: 「ぷらんとうまる」ではなく、ほんとうは「ぷらんと・ゆーえむえる」と読むと思います。

### インストール
brewから出来ます。

```
brew install graphviz
brew install plantuml
```


完了です。





適当なエディタでUMLファイルを作ります。

```uml:architecture.uml
@startuml 

actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoWork
activate A
A -> B: Create Request
activate B
B -> C: DoWork
activate C
@enduml

```

これを・・・
↓↓↓こうして・・・↓↓↓

```terminal
$ plantuml architecture.uml
```

↓↓↓こうなる！！！↓↓↓

![architecture.uml - Creator 2017-02-15 15-17-09.png](https://qiita-image-store.s3.amazonaws.com/0/34573/16ea3d94-bc1c-c31d-37d2-4861296f9925.png "architecture.uml - Creator 2017-02-15 15-17-09.png")

やったー！ architecture.png てファイルで出力されました！
これでUMLモデリングができますね！


## 書き方

アクティビティ図とかシーケンス図とか色々書けます。
[このチートシートが一覧できてわかりやすい](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)です。

これで満足しないときは[公式の日本語化マニュアル(PDF)](http://translate.plantuml.com/ja/PlantUML_Language_Reference_Guide_JA.pdf) に全部載ってるので、詳細な機能も日本語でわかりますな！


## その他、PlantUMLを便利に見る方法

以下のあたりでライブプレビューとかができちゃいます。

- Chromeでは[表示中のテキストをUML画像にする拡張](https://chrome.google.com/webstore/detail/plantuml-viewer/legbfeljfbjgfifnkmpoajgpgejojooj?hl=ja)が。[使い方はこちらに](http://qiita.com/suzuki-hoge/items/648f5dbeeec5365666eb)。GitHub上でもこれで見れるね。
- エディタ系：
	- Atom
	- VSCode
	- Brackets
	- Notepad++
	- eclipse
	- Vim
	- LaTex
	- JetBrains IntelliJ IDEA
	- **Microsoft Word** まじでか！
- プロジェクト管理系：
	- AtlassianのConfluenceというWikiぽいやつでは、Wiki上でUML画像表示する[拡張があるみたい](https://marketplace.atlassian.com/plugins/de.griffel.confluence.plugins.plant-uml/server/overview)
	- [Redmineでも設定できるみたい](http://qiita.com/mima_ita/items/fd556aef74fe9252457d)
	- [tracにもある](https://trac-hacks.org/wiki/PlantUmlMacro)
	- SAPでも見えるぽい…ERPじゃん！
- フロントエンドな人には[gulpから画像を生成する方法](http://qiita.com/maxmellon/items/08c8162f3769ce71dbd3)もあるよ。
- slackに表示したい！？なんだってお前らはなんでもSlackにしたがるんだ！！ [あるぽいぞ！！！！](https://github.com/taichi/umlbot)


ほかにもherokuやapacheなんかでも使えます。
これで図が大量生産できる！

## スキン変更
見た目が茶色っていうか赤っていうかなので、スキン変更できます。

![PlantUML言語リファレンスガイド 2017-02-15 15-03-26.png](https://qiita-image-store.s3.amazonaws.com/0/34573/aa756aa7-f063-399c-e5a3-d912f57f2500.png "PlantUML言語リファレンスガイド 2017-02-15 15-03-26.png")


[詳しく書いてくれている人がいるから](http://yohshiy.blog.fc2.com/blog-entry-159.html) 好みの見た目にも変更できますね！


![PlantUML Preview - Creator 2017-02-15 15-12-30.png](https://qiita-image-store.s3.amazonaws.com/0/34573/004ba2a1-a8b3-df2d-b1fb-31d0faf01aea.png "PlantUML Preview - Creator 2017-02-15 15-12-30.png")

冒頭に貼ったように、私はピンクで手書き風にしてみました！
この設定は・・・

```
@startuml 
skinparam backgroundColor pink
skinparam handwritten true

actor User
/' 以下省略... '/
```
かんたんですねぇ！
[Swift] Finderなどで使用されるタグ/ラベルにアクセスする

[Finderなどで使用されるタグにアクセスする](http://qiita.com/masakihori/items/7761798b4610c9dc12eb)のSwift版です。

Swiftでは`NSURL`ではなく`URL`の利用が推奨されているようですが、現在のところタグをセットするには`NSURL`を使うしかありません。(Appleに変更する意思があるかどうかは不明です)
いちいち`NSURL`にキャストするのは面倒くさいので`URL`を拡張します。

```swift
extension URL {
    
    public var tagNames: [String]? {
        
        get {
            let values = try? resourceValues(forKeys: [.tagNamesKey])
            
            return values?.tagNames
        }
        
        set {
            
            do {
                
                let url = self as NSURL
                try url.setResourceValue(tagNames, forKey: .tagNamesKey)
                
            } catch {
                
                print("Can not set tagNames.")
            }
        }
    }
}
```

見ての通りですが取得に関しては`NSURL`だけでなく`URL`でも可能です。

文字列 "red"、 "orange" などを設定するとFinder上ではレッド、オレンジのタグ（ラベル）が付きます。

#### ラベルの設定

```swift
extension URL {
    
    public var labelNumber: Int? {
        
        get {
            
            let values = try? self.resourceValues(forKeys: [.labelNumberKey])
            
            return values?.labelNumber
        }
        
        set {
            
            do {
                
                let url = self as NSURL
                try url.setResourceValue(newValue, forKey: .labelNumberKey)
                
            } catch {
                
                print("Can not set labelNumber")
            }
        }
    }
}

```
macOS Sierra 10.12 仮想マシン作成

# 概要
macOS Sierra 10.12の仮想マシンを作成する手順を転記する。

# 作成手順
下記のURLを参照ください
##  VMwareの場合
http://www.wikigain.com/install-macos-sierra-10-12-vmware/
##  VirtualBoxの場合
http://www.wikigain.com/install-macos-sierra-10-12-virtualbox/

# 注意事項
1. VirtualBoxの場合、「Step #4」を実施する前にVirtualBoxマネージャーのWindowsを閉じてください。
2. MacOSアップデータ後に起動できない可能性があります。
Mac GAE/Go の VS Code開発環境セットアップメモ

SertさんのQiita記事「Centos7 GAE/Go の VS Code開発環境セットアップメモ」
http://qiita.com/Sert/items/9d667bea410f6ca6ba18
を参考にMac版を作成

#Google Cloud SDK のインストール
https://cloud.google.com/sdk/docs/quickstart-mac-os-x
#App Engine SDK for Go インストール
以下のドキュメント通りに行う
https://cloud.google.com/appengine/docs/go/download#go_mac
解凍した後できたgo_appengineというディレクトリをHomeディレクトリ直下にでもおいておく
次にハードリンクを作成する

```
cd go_appengine/goroot/bin/
ln goapp go
```

パスの設定を行う

```
echo 'export GOROOT=$HOME/go_appengine/goroot/' >> ~/.bashrc
echo 'export GOPATH=$HOME/go_appengine/gopath/' >> ~/.bashrc
echo 'export APPENGINE_DEV_APPSERVER=$HOME/go_appengine/dev_appserver.py' >> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin/' >> ~/.bashrc
```

端末を再起動するか、以下のコマンドを実行して設定ファイルの再読み込みを行う。

```
source ~/.bashrc
```

これでgoコマンドが使用可能となる

#Visual Studio Code のインストール
https://code.visualstudio.com/Download
インストールが完了すると自動的にダウンロードのディレクトリにVisual Studio Codeのアプリケーションが生成されるはず。
生成されたアプリケーションをアプリケーションディレクトリの直下にでもおいておく
#Delveをインストール
Golangのデバッガ
以下を実行

```
brew install go-delve/delve/delve
```

#VS CodeのGo Pluginをインストール
VS Codeを起動する。
左のアイコンリスト一番下の、「拡張機能」をクリック
検索窓に「Go」を入力
検索結果の説明文が「Rich Go language support ...」の方の「Go」プラグインをインストール
インストール後、「再度読み込む」をクリックしてVS Codeを再起動

#Golangのプロジェクト作成
任意の場所に、「Hello」ディレクトリを作成
VS Codeの「ディレクトリを開く」で作成した「Hello」ディレクトリを開く
左側の「HELLO」にマウスを合わせ、表示された新規ファイルアイコンをクリック
「main.go」を作成
`⌘＋,`キーを押すとsettings.jsonが開く
そこに

```
"go.gopath": "/Users/ryoheishioji/go_appengine/gopath/"
```

を書き込み保存してVScode内でのgopathを設定する。（ターミナル上で設定した$GOPATHはなぜか反映されないみたいです。。。）
次に上部に「The "golint" command is not available. ...」と表示されるので、「Install All」をクリック（もしインストールが失敗すればVScodeを再起動。最悪PCを再起動。）
インストールが終わったら準備完了

以下のコードを記述

```
package main
import "fmt" // 自動補完されるので記述しなくてもよい
func main() {
  fmt.Println("Hello Golang")
}
```

「Ctrl + s」で保存

アプリケーションの起動用設定ファイル「launch.json」が生成される

「fn + F5」を入力して、実行する
AWS SDK for Ruby V2 でニフティクラウド オブジェクトストレージの API を叩く

たまに触るとやり方忘れてるのでメモしておきます。

## 準備

Dockerfile 作成。

```
$ vi Dockerfile
```
```
FROM ruby:alpine
RUN gem install aws-sdk
CMD ruby /app.rb
```

スクリプト作成。

```
$ vi app.rb
```
```ruby
require "aws-sdk"

client = Aws::S3::Client.new(
  endpoint: ENV["S3_ENDPOINT"],
  signature_version: ENV["S3_SIGNATURE_VERSION"],
)

client.list_buckets.buckets.each do |bucket|
  p bucket
end
```

設定ファイル作成。
S3_SIGNATURE_VERSION に s3 を指定するのがポイント。
AWS_REGION はなんでもよい。

```
$ vi .env
```
```
AWS_REGION=jp-east-2
AWS_ACCESS_KEY_ID=<Your Access Key Id>
AWS_SECRET_ACCESS_KEY=<Your Secret Access Key>
S3_ENDPOINT=https://jp-east-2.os.cloud.nifty.com
S3_SIGNATURE_VERSION=s3
```

## 実行

docker イメージビルド。

```
$ docker build -t s3cmd-ncos .
Sending build context to Docker daemon 4.096 kB
Step 1/3 : FROM ruby:alpine
 ---> 48de60a8463d
Step 2/3 : RUN gem install aws-sdk
 ---> Using cache
 ---> a853fa28ebd6
Step 3/3 : CMD ruby /app.rb
 ---> Using cache
 ---> b035a2f39011
Successfully built b035a2f39011
```

コンテナ実行。

```
$ docker run --rm --env-file .env -v $(pwd)/app.rb:/app.rb s3cmd-ncos
#<struct Aws::S3::Types::Bucket name="bucketa", creation_date=2016-07-17 06:27:58 UTC>
#<struct Aws::S3::Types::Bucket name="bucketb", creation_date=2017-02-13 01:53:51 UTC>
#<struct Aws::S3::Types::Bucket name="bucketc", creation_date=2016-12-07 09:39:18 UTC>
```
Windows10でzipファイルの右クリックに「すべて展開」を復活

Pleiades NEONをWindows10に展開しようとしたら、
右クリックで「すべて展開」が無かった。

・原因
Lhaplusが邪魔してました。別にlhaplusが駄目な訳では無い

・対策
右クリックで「プロパティ」を出し、
「全般」タブ、の情報に「プログラム」を見つけます。
その右側の「変更」ボタンを押してやる。

すると、アプリの候補が現れるので、
そこで「エクスプローラー」を選んでやる

これで、解決です。
UWPをターゲットマシンにインストールする方法

Visual Studio2015で作成したUWPを他のパソコンにインストールするのに苦労したので、その手順を忘備録として残しておきます。
#手順
1. 作成したUWPのパッケージ化
2. コピーするフォルダ
3. 証明書のインポート
4. UWPのインストール

##作成したUWPのパッケージ化
[プロジェクト]メニューから[ストア]->[アプリ パッケージの作成]を選択![パッケージ化.png](https://qiita-image-store.s3.amazonaws.com/0/164944/e892caa8-cdc5-2075-d1dd-5fa6482e563a.png)

ストアに公開しないので、ここは[いいえ]を選択します。

![パッケージ化2.png](https://qiita-image-store.s3.amazonaws.com/0/164944/884faab0-df03-0d4f-80b3-ac82b0b0867d.png)

![パッケージ化3.png](https://qiita-image-store.s3.amazonaws.com/0/164944/61bc9fce-b262-42f1-fb0e-a711ffb700dd.png)

![パッケージ化4.png](https://qiita-image-store.s3.amazonaws.com/0/164944/d2fed0ef-aa6e-53e0-2695-6d0bec174647.png)

この後、テストをします。しなくても大丈夫だとは思いますが、テストを実行した場合のステップを記述しておきます。

![パッケージ化5.png](https://qiita-image-store.s3.amazonaws.com/0/164944/90380a8e-f03f-3cea-ab2e-96d7c72e2526.png)

![パッケージ化6.png](https://qiita-image-store.s3.amazonaws.com/0/164944/04606d53-062a-10d0-733d-d61bcf7cf745.png)

テスト終了時に「不合格」と表示されるかもしれませんが、アプリアイコンがデフォルトのためだったりするので、アプリの動作には関係ありません。

![パッケージ化7.png](https://qiita-image-store.s3.amazonaws.com/0/164944/28344ea1-b61e-8263-31cb-ce199b158324.png)

![パッケージ化9.png](https://qiita-image-store.s3.amazonaws.com/0/164944/a8876fd8-20c8-9959-6dd3-0193256aae2c.png)

##コピーするフォルダ
プロジェクトを作成したフォルダをたどると、AppPackagesとあります。この中に他のパソコンにコピーするべきフォルダが存在します。

![パッケージ化10.png](https://qiita-image-store.s3.amazonaws.com/0/164944/e27ad4b0-a074-d7b8-ccb0-7a61a03bd34b.png)

AppPackageフォルダの中に、作成したリビジョン毎のフォルダがあります。リビジョンはパッケージ化するたびに自動的に増加させてます。インストールしたいリビジョンのフォルダをUSB経由なりネットワーク経由なり、お好きな方法でターゲットマシンにコピーしてください。

![パッケージ化11.png](https://qiita-image-store.s3.amazonaws.com/0/164944/de5fd7a9-4084-890a-7bca-d7010e923fdd.png)

##証明書のインポート
コピーしたフォルダの中にある拡張子cerのファイルが証明書です。これをターゲットマシンにインポートしないと、UWPもインストールできません。

![パッケージ化12.png](https://qiita-image-store.s3.amazonaws.com/0/164944/9404df06-509b-e84c-ff02-50a94b78b2c3.png)

証明書をダブルクリックすると、インポートが開始されます。
[証明書のインストール]をクリックします。

![パッケージ化13.png](https://qiita-image-store.s3.amazonaws.com/0/164944/268dc6c8-7cd4-cace-0957-8e03821d8a77.png)

ローカル コンピュータを選択する必要があります。
![パッケージ化14.png](https://qiita-image-store.s3.amazonaws.com/0/164944/3cccc350-f8f6-8f15-f451-e4659db69f61.png)

[証明書をすべて次のストアに配置する]を選択して、[参照]ボタンをクリック。

![パッケージ化15.png](https://qiita-image-store.s3.amazonaws.com/0/164944/01fe99b6-f7a5-ce46-c83e-f01a5f2895be.png)

[信頼されたルート証明機関]を選択して、[OK]をクリック。

![パッケージ化16.png](https://qiita-image-store.s3.amazonaws.com/0/164944/0a3c4196-2249-c7fa-5254-6826baec8953.png)

![パッケージ化17.png](https://qiita-image-store.s3.amazonaws.com/0/164944/513b9692-5d28-9206-19e8-763c95171ade.png)

![パッケージ化18.png](https://qiita-image-store.s3.amazonaws.com/0/164944/c5daa730-6dad-9ce6-eaff-b838d8512209.png)

[完了]ボタンをクリックしたら証明書のインポートは完了です。

##UWPのインストール

拡張子.appxbundleのファイルをダブルクリックすると、インストールが始まります。

![パッケージ化19.png](https://qiita-image-store.s3.amazonaws.com/0/164944/b20ff483-6194-fb07-d905-8e8a27faacd5.png)

インストールが完了したら、このような画面が出ます。

![パッケージ化20.png](https://qiita-image-store.s3.amazonaws.com/0/164944/141df425-c85f-1b8d-ab0c-58153bfaa3c2.png)

#あとがき
初めてUWPを作って、他のパソコンでテストさせてみようと実行ファイルを叩いてみたところ、エラーが発生しました。いろいろ調べてやっとここまでたどり着きました。Windows10 Anniversary Updateがインストールされていれば、きっと大丈夫だと思います。
CakePHP3 で Bootstrap を使う


## 参考
- [プラグインのgithubページ](https://github.com/FriendsOfCake/bootstrap-ui)


## プラグインを使う理由
- bootstrapをそのまま入れると、ヘルパーの機能の一部を使うことができない

## インストール手順
1. bootstrapをダウンロード
1. 配置する
1. Bootstrap-UIをインストール
1. Bootstrap-UIを読み込む
  1. config/bootstrap.php
  1. src/View/AppView.php
1. 使う


## bootstrapをダウンロード
http://getbootstrap.com/getting-started/#download


## 配置
~~~
webroot
│
├─bootstrap
│  ├─css
│  ├─fonts
│  └─js
├─css
├─img
└─js
~~~


## Bootstrap-uiをインストール
~~~bash
$ composer require friendsofcake/bootstrap-ui
~~~


## Bootstrap-uiを読み込む
- config/bootstrap.php

~~~php
Plugin::load('BootstrapUI');
~~~

- src/View/AppView.php
  - `BootstrapUI\View\UIView`を継承するようにする
  - 初期化処理を呼ぶ

~~~php
namespace App\View;

// 追加
use BootstrapUI\View\UIView;

class AppView extends UIView // 修正
{

    /**
     * Initialization hook method.
     */
    public function initialize()
    {
        // 追加
        parent::initialize();

        // これを指定しなければ、「/vendor/friendsofcake/bootstrap-ui/src/Template/Layout/default.cpt」が使われる
        // 'default'指定ならcakePHPのテンプレートが使用される
        $this->layout = 'default';
    }
}
~~~

- src/Temlate/default.cpt
  - 以下を追加

~~~html
<!-- jQuery -->
<script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>

<!-- bootstrap framework -->
<?= $this->Html->css('/bootstrap/css/bootstrap.css') ?>
<?= $this->Html->script('/bootstrap/js/bootstrap.js') ?>
~~~


## 使う
[Bootstrap3 日本語リファレンス](http://bootstrap3.cyberlab.info/)
【Windows】実行時間の計測

# 概要
プログラムのある個所からある個所の実行までの実行時間を計測する。
# [方法１] timeGetTime()
ネットで調べる限り、精度は1ミリ秒程度らしい。
## ヘッダファイル
windows.hをインクルード。
## 外部ライブラリ
winmm.libをリンク必要あり。
#### リンク方法
■ VisualStudio(VC++)の統合開発環境で指定する
■ 自前でMakeファイルをゴリゴリ書く 
■ コードで書く
## 関数の戻り値
timeGetTime() は DWORD 型（32ビット整数）を返す。
単位はミリ秒。
## サンプルコード
```c
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "winmm.lib")

int main()
{
    // 開始時間
    DWORD s_tm = timeGetTime();
    
    /*************************/
    // 計測したい処理
    /*************************/
    
    // 終了時間
    DWORD e_tm = timeGetTime();
    
    // 実行時間
    DWORD = end - start;
    
    return 0;
}
技術書評「オブジェクト指向設計実践ガイド」

![9784774183619.jpg](https://qiita-image-store.s3.amazonaws.com/0/20307/4b523a79-c026-2a99-9dca-7ec1dbb26f65.jpeg)

「オブジェクト指向設計実践ガイド」 Sandi Metz　著，髙山泰基　訳

## 感想
- オススメ度 5/5
- ある程度railsで開発慣れてきたけど、設計で行き詰ることが多くなってきたときに読んだ
- その後の設計の指針になることが多く書いてあった
  - 「どのクラスになにをしてもらうかから設計を考える」とか

## メモ
#### 1章. オブジェクト指向設計
- 少しずつ形になるように実装していく(Agile的)
- ゴールは変更しやすいアプリケーション設計をすること

#### 2章. 単一責任のクラスを設計する
- **クラスは一文で説明できるように**

#### 3章. 依存関係を管理する
- hash.fetch使うと便利
- 疎結合なコードを書く(依存オブジェクトの注入)
- **自分よりも変更されないものに依存する**

#### 4章. 柔軟なインターフェースをつくる
- **設計方針: 「このメッセージを送る必要があるけど、だれが応答すべきか」という考え方**
- メッセージを送るためにオブジェクトは存在する
- メソッドは"どのように”よりも”なにを"

#### 5章. ダックタイピングでコストを削減する

#### 6章. 継承によって振る舞いを獲得する

#### 7章. モジュールでロールの振る舞いを共有する
- ロール(実装クラス)が RoleA.class, RoleB.class, RoleC.classがある場合、インターフェースとなるHogerable.moduleを実装して、各ロールにincludeさせてあげると、使うほうは使いやすい
- 抽象スーパークラス内のコードを使わないサブクラスはあってはいけない
- typeで分岐して処理が呼ばれるとか、classで分岐して処理が呼ばれる場合は、ロール実装を考える
- 継承する側でsuperを呼び出すのは避ける
  - Parent#hoge{ local_hoge()} として、Chile.#local_hogeを実装するほうがいい
- 改装構造を浅くする

#### 8章. コンポジションでオブジェクトを組み合わせる
- コンポジション
  - メリ: 構造的に独立する。見通しよくなる。
  - デメ: 明示的にメッセージ移譲をする必要がある(コスト)
- 継承
  - メリ: シームレスに移譲する。サブクラスの実装はやい。
  - デメ: 親クラスの変更コストが高い。親クラスが思ってないような使われ方される可能性あり。
- 迷ったときはコンポジション
  - 依存度を下げられるので
- is-a => 継承
  - is-a => …の一種  A, B, Cが子の場合。A+B+Cで親になる。
- behaves-like-a => Mixin
- has-a => コンポジション
  - has-a => …に含まれる　A, B, Cが子のの場合。A+B+Cより親のが大きい。

#### 9章. 費用対効果の高いテストを設計する
Windowsでメッセージダイジェストを表示する(certutil)


# certutilを使ったメッセージダイジェスト表示

Winodwsでメッセージダイジェストを表示する場合、以前はハッシュ関数ごと(MD5やSHA1)にフリーのツールをダウンロードしていたのですが、つい最近OS標準コマンドで表示できることを知りました...(遅い)。
以下にコマンド構文とコマンドを利用したバッチファイル作成例を記しておきます。
※今回試した環境はWin7です。

## コマンド構文
```
> cetutil -hashfile ファイルパス [HASH関数]
```

## コマンド使用例
```
C:\ > certutil -hashfile "Desktop\2017-01-11-raspbian-jessie.zip" SHA1
SHA1 ハッシュ (ファイル Desktop\2017-01-11-raspbian-jessie.zip):
43 c7 83 fe 91 9c 01 7d a4 f1 40 fc d3 08 64 ed fd 20 c9 95
CertUtil: -hashfile コマンドは正常に完了しました。
```

**※デフォルトはSHA1なので上記SHA1は省略できます。**

これを用いてバッチファイルを作成し、さらに右クリック時に表示される「送る」に登録しておくととても便利！！！(ということも今しがた知りました…(めっちゃ遅い)

## バッチファイルでの使用例(md5)
```bat:md5_digest.bat
@echo off
certutil -hashfile "%~1" MD5
pause
```
## バッチファイルでの使用例(sha1)
```bat:sha1_digest.bat
@echo off
certutil -hashfile "%~1"
pause
```

##右クリックの「送る」への追加

エクスプローラのファイルパス入力ボックスに「sendto」と入力すると、 「送る」へ追加できるフォルダが表示されます。 実際のパスはここです。

`C:\Users\osaki\AppData\Roaming\Microsoft\Windows\SendTo`

ここに上記のバッチファイルを配置すれば、特定のファイルのメッセージダイジェストを確認したいときに右クリックですぐに確認できます！

<img width="487" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/156018/7575a3a1-3c84-7223-5590-e687d967bf46.png">


参考サイト：
[Windowsのcertutilコマンドでメッセージダイジェストを表示する方法](http://d.hatena.ne.jp/EijiYoshida/20150526/1432625482)
bundle install した RuboCop を vim （や他のエディタ）で使う

# 最初に
この記事は vim で構文チェックを使えるようにする方法を書いたものではありません。
構文チェックの際にする RuboCop をグローバルにインストールしたものから、 bundler でインストールしたものへ変更する方法を書いたものです。

# プロジェクトの RuboCop が使用されない問題
Ruby を書いている人でエディタに RuboCop による構文チェックをさせている人は多くいるかと思います。
そして Gemfile で RuboCop を管理しているプロジェクトもあるかと思います。
そんな時に `bundle install --path vendor/bundle -j4` と vendor/bundle に RuboCop をインストールしても、エディタは認識してくれません。実際にエディタ内ではグローバルにインストールされている RuboCop を使ってしまいます。
RuboCop のバージョンが多少違っていても大きな問題になることはあまりないかもしれませんが、 Gemfile.lock で指定されているバージョンを使うほうが何かと気分はいいものです。

# 解決法
## bundle install のオプションを変更
そんな時に、エディタにプロジェクト指定の RuboCop を使わせる方法です。
まず、
`bundle install --path vendor/bundle -j4`
ではなく、
`bundle install --path vendor/bundle --binstubs vendor/bundle/bin -j4`
で bundle install しましょう。
これは実行ファイルを vendor/bundle/bin に用意するということです。

## direnv をインストール
そして direnv をインストールしましょう。
これは .envrc ファイルが置かれているディレクトリに入っている時だけ .envrc を元に環境変数をすり替えたりするものです。
ubuntu であれば、
`sudo apt-get install -y direnv`
でインストールすることができます。
その後、 ~/.bashrc の最後に `eval "$(direnv hook bash)"` と追記します。

## .envrc ファイル作成
インストール後、
`cd project_root_directory`
`direnv edit .`
とするとエディタが立ち上がります。
そして、
`PATH_add vendor/bundle/bin`
と書き込んで保存しましょう。 .envrc というファイル名で保存されます。
これで、 project_root_directory ディレクトリ内にいる間は環境変数 PATH に $PWD/vendor/bundle/bin が追加されるようになります。

## bundle exec なしで gem を使用可能に
この段階で `bundle exec` を前に追加しなくても `rubocop` と呼ぶだけで、 bundler によってインストールされた RuboCop が呼び出されるようになります。
`which rubocop` で確認できます。
project_root_directory から出ると、またグローバルの RuboCop が呼び出されるようになります。

## vim や emacs のような CUI エディタはこれで終わり
vim や emacs の場合は .envrc が置かれているプロジェクトルートディレクトリにいる状態で立ち上げれば、 bundler でインストールされた RuboCop を使うようになります。

## vscode や atom のような GUI エディタはもう一仕事
visual studio code では direnv という名のプラグインを使用すると、プロジェクトルートディレクトリに .envrc ファイルが存在すると読み込んでくれるようになります。
atom などでも同じようなプラグインがあるような気がします（ない可能性も）。