OmniAICreator/Qiita-1.07M huggingface dataset:
spring + shoulda-matchersの設定

`spring rspec`でテストを回していて、`has_many`な関係のテストを

```rb
RSpec.describe User, type: :model do
 it{ is_expected.to have_many(:posts) }
end
```

てな感じで書けるなんて素敵！と思って[thoughtbot/shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers)を入れてみた。ら

```rb
Failures:

  1) User should have many :posts
     Failure/Error: it{ is_expected.to have_many(:posts) }
       expected #<User:0x007f6081732cb8> to respond to `has_many?`
     # ./spec/models/user_spec.rb:9:in `block (2 levels) in <top (required)>'
     # -e:1:in `<main>'
```

怒られた。

何で？と思って`rspec spec/`で走らせると、通る。
`spring rspec spec/`だと通らないのは何でだー！と思って調べたら

[shoulda-matchers not working with spring · Issue #486 · thoughtbot/shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers/issues/486#issuecomment-40456834)

に解決策が記されていました。

```rb:Gemfile
gem 'shoulda-matchers', require: false
```

```rb:rails_helper.rb
require 'shoulda-matchers'
```

と言う感じで読み込む必要があるようです。

[shoulda-matchers not working with spring · Issue #486 · thoughtbot/shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers/issues/486#issuecomment-40494296)
のコメントによれば`spring`が`spec_helper`や`Gemfile`を読み込んだ**後**に`rspec`を読み込むのが原因みたいですが、ドキュメントに書いてあるほうが良いよなー、とか**思ってたら[thoughtbot/shoulda-matchers at v2.8.0](https://github.com/thoughtbot/shoulda-matchers/tree/v2.8.0#shoulda-matchers---)に書いてあった**。

違うバージョンのドキュメントを読んでいたという話でした。
TSUBAMEでpython+caffeを使う場合のtips

先日TSUBAMEでcaffeを利用できるようにしてくれた方がいた。
(参考：
https://twitter.com/sacred_fox/status/605297481765691392
https://twitter.com/sacred_fox/status/605297652331212800
http://tsubame.gsic.titech.ac.jp/labs)

pythonで利用する場合、基本的には

```
~> source /usr/apps.sp3/nosupport/gsic/env/caffe-0.11.0.sh
```
としてからcaffeをimportすれば良い。

このスクリプトを使うと
/usr/apps.sp3/nosupport/gsic/python/2.7.7/bin/
に入っているpythonを実行するようになる。しかし、TSUBAMEに標準で入っているpythonのバージョンが古いなどの理由で標準のpythonの他にもpythonをインストールしていて、そちらを使いたい場合、このスクリプトを適当な場所にコピーし、以下のように一部コメントアウトして利用する。

```sh

# Caffe: 0.11.0
# CUDA: 6.5
# HDF: 1.8.11
# Python: 2.7.8
# Boost: 1.58.0

source /usr/apps.sp3/env/set_cuda-6.5.sh
source /usr/apps.sp3/nosupport/gsic/env/all/opencv-3.0.0-rc1.sh
source /usr/apps.sp3/nosupport/gsic/env/all/boost-1.58.0.sh
#source /usr/apps.sp3/nosupport/gsic/env/all/python-2.7.7.sh
export PATH=/usr/apps.sp3/nosupport/gsic/caffe/0.11.0/bin/:$PATH
export LD_LIBRARY_PATH=/usr/apps.sp3/nosupport/gsic/caffe/0.11.0/lib/:/usr/apps.sp3/nosupport/hdf5/1.8.11/lib/:$LD_LIBRARY_PATH
export PYTHONPATH=/usr/apps.sp3/nosupport/gsic/caffe/0.11.0/python/:$PYTHONPATH
export CPATH=/usr/apps.sp3/nosupport/gsic/caffe/0.11.0/include/:/usr/apps.sp3/cuda/6.5/include/:/usr/apps.sp3/isv/intel/xe2013.1.046/mkl/include/:/usr/apps.sp3/nosupport/hdf5/1.8.11/include/:$CPATH
export LIBRARY_PATH=/usr/apps.sp3/nosupport/gsic/caffe/0.11.0/lib/:/usr/apps.sp3/nosupport/hdf5/1.8.11/lib/:$LIBRARY_PATH
```

この場合は当然ながら自分のpythonの環境にcaffeの依存ライブラリを導入しておかないと動かない。
依存関係はcaffeの公式ページ( http://caffe.berkeleyvision.org/ )に書いてある通りで、多くはpipなどでインストールできる。
ただしpipではprotobufのみインストールできないので、公式からソースコードを落としてきて、インストールしたディレクトリで以下のようなコマンドを実行する必要がある。

```
~> ./configure
~> make
~> make install
~> cd python
~> python setup.py build
~> python setup.py test
~> python setup.py install
```
golangで無名structの入れ子

# golangで無名structの入れ子

試したやつ。
`go version go1.4 linux/amd64`

タグ付けもできる。
marshal / unmarshal に使えそう。

けど、初期化する方法がわからない。
ってうか、外から定義して初期化ってできなそう。

特に無名structの配列だと詰みそう。
外で同じ型定義してキャストしてやればたぶんいけるけど。

```go:main.go
package main

import (
	"bytes"
	"encoding/json"
	"encoding/xml"
	"fmt"
)

type Hoge struct {
	Datas []struct {
		SomeZ    int `json:"z" xml:"z"`
		AwesomeA struct {
			IntVal int    `json:"x" xml:"x"`
			StrVal string `json:"y" xml:"y,attr"`
		} `json:"a" xml:"a"`
	} `json:"datas" xml:"datas"`
}

var jsnstr = `
{
  "datas": [
    {
      "z": 123,
      "a": {
        "x": 456,
        "y": "bar"
      }
    },
    {
      "z": 234,
      "a": {
        "x": 567,
        "y": "foo"
      }
    }
  ]
}
`

var xmlstr = `
<Hoge>
  <datas>
    <z>123</z>
    <a y="bar">
      <x>456</x>
    </a>
  </datas>
  <datas>
    <z>234</z>
    <a y="foo">
      <x>567</x>
    </a>
  </datas>
</Hoge>
`

func main() {
	var d1, d2 Hoge

	dec := json.NewDecoder(bytes.NewBufferString(jsnstr))
	err := dec.Decode(&d1)
	fmt.Println(jsnstr)
	fmt.Printf("%+v %+v \n", d1, err)

	p := xml.NewDecoder(bytes.NewBufferString(xmlstr))
	err = p.Decode(&d2)
	fmt.Println(xmlstr)
	fmt.Printf("%+v %+v \n", d2, err)
}
```
Swift の Dictionary に map を実装する

Swift の Dictionary に map を実装してみた。
Ruby の Hash#map のイメージ。

```swift
extension Dictionary {
    
    func map<T>(transform: (Key, Value) -> T) -> [T] {
        return Swift.map(self, transform)
    }
}


var dict = [String: String]()
dict["hello"] = "world"

let array = dict.map { (k: String, v: String) -> String in
    return v
}

println(array)  // ["world"]
```
Swift の Array に each を実装する

Swift の Array に each を実装する方法、これでいいのかな？
配列の中身が `AnyObject` だった時も、受け取るブロックで型指定してたら、
キャストして渡すようにしたかったんだけど、Generics の使い方がいまいちかも。。

```swift
extension Array {
    
    func each(block: (T) -> ()) {
        for item in self {
            block(item)
        }
    }
    
    func each<U>(block: (U) -> ()) {
        for item in self {
            block(item as! U)
        }
    }
    
    func eachWithIndex(block: (T, Int) -> ()) {
        for (i, item) in enumerate(self) {
            block(item, i)
        }
    }
    
    func eachWithIndex<U>(block: (U, Int) -> ()) {
        for (i, item) in enumerate(self) {
            block(item as! U, i)
        }
    }
}

[1, 2, 3].each { (n: Int) in println(n) }
[1, 2, 3].each { println($0) }
[1, 2, 3].eachWithIndex { (n: Int, i: Int) in println("index \(i), n \(n)") }
[1, 2, 3].eachWithIndex { println("index \($1), n \($0)") }
```
WebViewベースモバイルアプリ用UIフレームワーク対応OS最新状況（2015/6/10確認）

WebViewベースモバイルアプリを開発する際の、フレームワーク選定時に役立ててください。

Ionic
---------------

http://ionicframework.com/


**確認したIonicのバージョン**
1.0.0 "uranium-unicorn"

**対応OS バージョン**
iOS 7+, and Android 4.1 and up

**バージョンに関する記述**
http://ionicframework.com/docs/overview/#browser-support


Onsen UI
----------------

http://ja.onsen.io/

**確認したOnsenUIのバージョン**
1.3.2

**対応OS バージョン**
Android4.0.2+ iOS7+ Google Chrome Safari

**バージョンに関する記述**
https://github.com/OnsenUI/OnsenUI


Famo.us
----------------

http://famous.org/

**確認したFamousのバージョン**
v0.5.2

**対応OS バージョン**
Chrome Firefox Safari IE11+（具体的なOSブラウザのバージョンなどは記述が見つけれらませんでした）

**バージョンに関する記述**
http://famous.org/learn/browser-and-device-support.html


フレームワークの特徴
=========

こちらを参考にしてください
http://qiita.com/meltest/items/e9628c54b8ca0e88c204
git svn で毎回パスワードを聞かれないようにするには


# 概要

git svn を使ってsvnを中央リポジトリとして使用していました。
この際svnにはsvn+sshで接続する必要があり、svnにアクセスする度にパスワードプロンプトが表示され、入力を要求されていました。

だんだん入力が面倒になってきたので、**svn側**の設定でパスワード省略方法を探していたのですが、みつからず結局ssh側の設定で回避できる事がわかりました。

# 環境

* MAC OSX 10.9.5
* git 1.8.5.2 (CUI)

svnのリポジトリには秘密鍵を使ってsshで接続できる事が前提です。

# 解決方法

sshの設定にsvnのリポジトリとなっているマシンへの秘密鍵を設定しました。

```bash
$ vi ~/.ssh/config
```
```text
Host 192.168.0.1
        HostName 192.168.0.1
        User svnuser
        IdentityFile ~/.ssh/svn_repository_key
```
※上記の"192.168.0.1"はsvnのリポジトリのあるマシン
toggle つくった

# Toggle つくった

[toggle](https://atom.io/packages/toggle)

テキストを `on` → `off` `true` → `false` を相互に一発で書き換える。
Vim だと以下のようなプラグインがあった(使ってなかったが)。

- [zef/vim-cycle](https://github.com/zef/vim-cycle)
- [AndrewRadev/switch.vim](https://github.com/AndrewRadev/switch.vim)
- [toggle.vim](http://www.vim.org/scripts/script.php?script_id=895)

※ switch.vim はかなり Advanced な事が出来るので、このカテゴリに収まりきらないが。

![gif](https://raw.githubusercontent.com/t9md/t9md/1c92b38b8e1e8c2fd592f3befcd673f896246271/img/atom-toggle.gif)

# 機能
- カーソル下(`toggle:here`)の word を次の word へ差し替え(Toggle)
- この時カーソル位置を動かす(`toggle:visit`)、動かさない(`toggle:there`)で、カレント行の word を差し替え
- ユーザーが単語グループのリストを設定可能
- カーソル位置の Grammar スコープを使用する(`gfm` の中の `coffeescript`等で便利).
- 特定スコープ限定と、デフォルト(`*`)の単語グループ
- `toggle:open-config`でユーザー設定を開き、保存時に自動ロード
- 複数カーソル(multiple cursor)で動作する
- デフォルトの単語グループ全体を無効に出来る
- デフォルトの単語グループの特定のスコープのみを無効に出来る

# コマンド
- `toggle:here`: カーソル下の word を差し替え
- `toggle:there`: カレント行で、カーソル位置を変えずに、word を差し替え
- `toggle:visit`: カレント行で、差し替え可能な word に移動して、差し替え
- `toggle:open-config`: 設定ファイルを開く

# Keymap

※ 個人的にはカーソルを移動しないで差し替える `toggle:there` がおすすめ。

**デフォルトのキーマップは無し**.

* ノーマル・ユーザー

```coffeescript
'atom-text-editor:not([mini])':
  'ctrl--': 'toggle:there'
```

* [vim-mode](https://atom.io/packages/vim-mode)

```coffeescript
'atom-text-editor.vim-mode.command-mode':
  '-': 'toggle:there'
```

# 設定例

```coffeescript
# '*' is wildcard scope, which is always searched finally.
'*': [
  ['yes'   , 'no']
  ['up'    , 'down']
  ['right' , 'left']
  ['true'  , 'false']
  ['high'  , 'low']
  ['column', 'row']
  ['and'   , 'or']
  ['not'   , '']
  ['on'    , 'off']
  ['in'    , 'out']
  ['one'   , 'two'   , 'three']
  ['bar'   , 'bar']
],
'source.coffee': [
  ['this', '@']
  ['is'  , 'isnt']
  ['if'  , 'unless']
]
```

# TODO
* [x] Support language specific keyword handling
* [x] Disable default words group by configuration.
* [x] Toggle without changing cursor position.
* [x] Highlight toggled word?
* [ ] Improve default words group.
-webkit-tap-highlight-color: rgba(0,0,0,0)してもハイライトが消えない問題


- -webkit-tap-highlight-color: rgba(0,0,0,0)してもハイライトが消えない箇所があった
- cursor:pointerが指定されてた
- ↑の後にwebkit-tap-highlight-colorを指定したら消えた
jQuery lazyloadプラグインが公式サイトから直接ダウンロードできずに困った

# 概要
- 昔は公式サイトに直接ダウンロードのリンクがあったから困らなかったけど、今はなぜか消えてしまっています(2015.06)
- http://www.appelsiini.net/projects/lazyload

# 解決策
- 作者のgithubにlazyloadのコードがあるので、そこからダウンロードしました
- https://github.com/tuupola/jquery_lazyload
- https://raw.githubusercontent.com/tuupola/jquery_lazyload/master/jquery.lazyload.min.js
MongoDBでConvertToCappedしてmaxがおかしな事になっても大丈夫らしい


http://docs.mongodb.org/manual/reference/command/convertToCapped/



とりあえずやってみる。

```
db.runCommand({"convertToCapped": "hoge", size: 100});

```


```
> db.hoge.stats()
{
	"ns" : "xxx.hoge",
	"count" : 1,
	"size" : 24,
	"avgObjSize" : 24,
	"storageSize" : 4096,
	"numExtents" : 1,
	"nindexes" : 1,
	"lastExtentSize" : 4096,
	"paddingFactor" : 1,
	"systemFlags" : 1,
	"userFlags" : 0,
	"totalIndexSize" : 8176,
	"indexSizes" : {
		"_id_" : 8176
	},
	"capped"l
	"max" : NumberLong("9223372036854775807"),
	"ok" : 1
}
```

`max: : NumberLong("9223372036854775807")`
ファッ！？

documentをよく読む。
http://docs.mongodb.org/manual/core/capped-collections/


```
Additionally, you may also specify a maximum number of documents for the collection using the max field as in the following document:
```

という事で size はbyte数、maxはドキュメントの数のようです。

```
db.runCommand({"convertToCapped": "hoge", size: 100, max: 100});

```

にしても max変化せず。

http://stackoverflow.com/questions/13293704/set-max-on-mongo-capped-collection


によるとcreateCollectionのときしか効かないようで…紛らわしいですmongoさん。

```
db.createCollection("hoge", {capped: true, size: 40960})
```

で以下のようにstorageSizeが指定したものになるので初期に指定sizeのStorage取っちゃってcapped:trueだと増えないんですね。


```
> db.hoge.stats()
{
	"ns" : "xxx.hoge",
	"count" : 0,
	"size" : 0,
	"storageSize" : 40960,
	"numExtents" : 1,
	"nindexes" : 1,
	"lastExtentSize" : 40960,
	"paddingFactor" : 1,
	"systemFlags" : 1,
	"userFlags" : 0,
	"totalIndexSize" : 8176,
	"indexSizes" : {
		"_id_" : 8176
	},
	"capped" : true,
	"max" : NumberLong("9223372036854775807"),
	"ok" : 1
}
```

### まとめ

- size指定したstorageを確保し、cappedされていればそれ以上増えない
- maxを指定してあればそのドキュメント数を上限とする。
- maxはcreateCollectionのに指定可能で後から付ける方法は無い

`convertToCapped`が内部的に使ってる `cloneCollectionAsCapped` ってまあcreateしてコピーしてるはずなのに、どうして中途半端に制限が存在するのか…
コピー時に上限に達したときの処理を作るのがめんどくさかったんでしょうか…書いててちょっと気持ちがわかりました。
iOS 9の新しいWebビュー: SFSafariViewController

# 【追記】SFSafariViewControllerが出た当初は本記事のようにほぼカスタマイズ性が無かったですが、元々のコンセプトはブレない範囲で少しずつカスタマイズ性が提供されています。

こちらなどご覧ください:
[What's New in Safari View Controller - WWDC 2017 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2017/225/)


---

以下、iOS 9 SDK時点での SFSafariViewController についてです。

[UIWebView](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/)・iOS 8で追加された[WKWebView](https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKWebView_Ref/)に加えて、iOS 9では`SFSafariViewController` というものが追加されました。  
手軽なAPIなので、今作っている[Player!](https://itunes.apple.com/jp/app/id897872395)にもちょちょいと組み込めそうです(　´･‿･｀)

※ 本記事は Apple による公開ドキュメントを元に構成しています

## SFSafariViewControllerとは何か

- アプリ内でWebビューを表示したい時に使える
	- UIWebView・WKWebViewと同様
- 最大の特長は、 **Safariとクッキーやその他データを共有できること**
	- ログイン状態とか引き継がれてとても便利(　´･‿･｀)
- APIがかなりシンプル
	- 特定のURLを渡して表示する以外はほぼ何も出来ない
	- 使うの簡単
- Safariとの大きな違いはタブ切り替えが無いことなど

## どういう時に使えそう？

- とりあえずシンプルにアプリ内でWebビューを出したい時
	- ナビゲーションボタン・シェアボタン・リロードボタンなどが標準で付く
	- UIWebView・WKWebViewはナビゲーション対応とかするとちょっと面倒
- ユーザーがSafariアプリへ移っちゃうのをなるべく防ぎたい時
	- Safariと同等でデータも共有されるので、Safariアプリへ飛びたくなる動機はほぼ無さそう
	- iOS 9向けには、`Safariで開く`の遷移先をこちらにしちゃっても良いかも(　´･‿･｀)
	- ただ、iOS 9ではSafariへの遷移が、PUSH遷移ぽくかつ左上にbackボタンも表示されるのでSafariへ遷移して離脱はこれまでより気にしなくて良いかも
- カスタムUIを組みたい時などには使えない？
	- フルスクリーン表示じゃ無くてContainer Viewとか使えば、Safariとのデータ共有と、カスタムUIの良いとこ取りも出来るかも？

> フルスクリーン表示じゃ無くてContainer Viewとか使えば、Safariとのデータ共有と、カスタムUIの良いとこ取りも出来るかも？

`viewDidLoad`ではめ込みたい部分に`addSubview`だけしてみたら真っ白でサイトが表示されずでしたが、少し細工するといけました(　´･‿･｀)

```swift
addChildViewController(webVC)
webVC.didMoveToParentViewController(self)
webContainerView.addSubview(webView)
```

<img width="375" alt="Simulator Screen Shot May 18, 2016, 11.55.01 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/19398/d5f093bf-3640-9a7b-54c1-200dad5c4279.png">
(下部のシェア部分がカスタムビュー)


### 参考資料

- [What's New in iOS iOS 9.0](https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html)
- [Hacking with Swift – What's new in iOS 9](http://www.hackingwithswift.com/ios9)
- [Introducing Safari View Controller | WWDC 2015 - Videos - Apple Developer](https://developer.apple.com/videos/wwdc/2015/?id=504)
goimportsで使ってるパッケージが消されてしまう場合

goimportsを使っていて、とあるライブラリのimportが勝手に消されてしまう現象に遭遇しました。goimportsは使ってないimportは消してくれるのですが、この場合はコード中で使ってるのに消されてしまう。

問題のコードはこんな感じ

```go:例
package mypackage

import (
    "fmt"
    "time"

    "github.com/deltam/some-library-go" // この行が消える
)

func Hoge() {
    return someLibrary.SomeFunc() // ここで使ってる
}

...
```

どうやら **プロジェクト名とパッケージ名が違う場合** は、goimportsは関係ないimport文だと判断するみたいです。

私はGo言語初心者なのですが、プロジェクト名とパッケージ名は同じにするのが作法（？）みたいですね。

とりあえず回避策。別名をつけとけばgoimportsでも使ってると判断して消さないでいてくれます。

```go
package mypackage

import (
    "fmt"
    "time"

    someLibrary "github.com/deltam/some-library-go" // パッケージ名と同じ別名をつける
)

func Hoge() {
    return somLibrary.SomeFunc() // ここで使ってる
}

...
```



おわり。
watchOS 2 で本当にウォッチ側で処理されているのか確認する

いよいよ待望のネイティブ動作する watchOS 2 が登場しました。で、さっそく試してみよう、と Xcode 7 で WatchKit App をつくってみると、以前と同じように Extension であることがわかります。きっとこの Extension に書いたコードがウォッチ側で実行されるということなんだろうとは理解してはいても、やはり本当にそうなっているのか確認したくなります。また、以前つくった WatchKit App は watchOS 2 ではネイティブ動作するのかどうなのか？とか。ドキュメントに書いてあることと挙動が違うこととかもごくたまにありますし。。

で、どっちで処理されてるのか確認する方法はないかなーと考えてみてひとつ思いついたのが **NSProcessInfo を利用**する方法。

```
print("\(NSProcessInfo().operatingSystemVersionString)")
```

このコードを iPhone で実行すると、

> Version 9.0 (Build 13A4254v)

と iOS のバージョンとビルド番号が出力されます。


これを WatchKit Extension のコード内で実行すると、

> Version 2.0 (Build 13S5254w)

と **watchOS のバージョンとビルド番号**が出力されます。

ということでこの処理はウォッチ側で実行されている、ということがわかります。


ちなみに NSProcessInfo は基本的にはプロセスに関する情報を取得するためのクラスですが、結構いろんな情報が見れます。`environment` とかでも何かしらウォッチ側かどうかの判断ができるかもしれません。

```
var environment: [String : String] { get }
var arguments: [String] { get }
var hostName: String { get }
var processName: String
var globallyUniqueString: String { get }
```
googleカレンダーにURLで簡単に登録


## googleカレンダーにURLで簡単に登録する

基本url

```
http://www.google.com/calendar/event?action=TEMPLATE
```

これにパラメーターをつなげていくとできる★

|| |
|-------|---------|
|text | タイトル|
| location |場所|
|details | 説明|
|dates |開始時間と終了時間|
|add|招待するメールアドレス|

参考にした記事に
actionとdatesパラメータは必須。となっているが
actionだけあればとりあえず動きました。

こんなかんじ
↓

```
http://www.google.com/calendar/event?action=TEMPLATE&text=※旅行&details=旅行にいきます。&dates=20151026T100000/20151026T180000
```


##### 参考

http://qiita.com/s-mori/items/24c128e0b0d841036dd8

http://kokonotsu.net/log/google%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%ABurl%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%8B%E3%82%89%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/

http://www.hougetsudou.com/wp/archives/506
【CSS】iPhoneでinput要素にCSSが効かない時の対処方法

# iPhoneでinput要素にCSSが効かない時
iPhoneの装飾をクリアにする為のCSS
-webkit-appearanceをnoneにしてあげることで問題解決ができる
inputのsubmitクリアにする場合は以下のCSSを追加

```
input[type="submit"]{
　　-webkit-appearance: none;
 　　border-radius: 0;
}
```

iPhone独自の装飾が不要であれば
下記のように書けば問題ないが
全体がクリアになるので判断する事

```
* {
   -webkit-appearance: none;
}
```
Golang の 数値型


メモ

[Goプログラミング言語仕様 - golang.jp](http://golang.jp/go_spec)

```
uint8       符号なし  8-ビット 整数 (0 to 255)
uint16      符号なし 16-ビット 整数 (0 to 65535)
uint32      符号なし 32-ビット 整数 (0 to 4294967295)
uint64      符号なし 64-ビット 整数 (0 to 18446744073709551615)

int8        符号あり  8-ビット 整数 (-128 to 127)
int16       符号あり 16-ビット 整数 (-32768 to 32767)
int32       符号あり 32-ビット 整数 (-2147483648 to 2147483647)
int64       符号あり 64-ビット 整数 (-9223372036854775808 to 9223372036854775807)

float32     IEEE-754 32-ビット 浮動小数値
float64     IEEE-754 64-ビット 浮動小数値

complex64   float32の実数部と虚数部を持つ複素数
complex128  float64の実数部と虚数部を持つ複素数

byte        uint8の別名(エイリアス)
rune        int32の別名(エイリアス)
```
LGTMを効率良く設置する方法

## 初めに
LGTM画像を探したり、URLを持ってきたりちょっと面倒。
そこで、お気に入りの画像を効率良く設置する方法をご紹介。

## 手順
1. [LGTM.in](http://lgtm.in/)にGitHubアカウントでログイン
2. 好きな画像に「My List」ボタンでお気に入り登録
3. LGTMの[Chrome拡張](https://chrome.google.com/webstore/detail/lgtm/fagoekogpjjhmdnmpgpnahioapbeaajp?hl=ja&gl=JP)をインストール
4. 拡張のオプションから、GitHubアカウント名を保存
5. MarkDownが使えるテキストボックス（GitHub、Qiita等）にフォーカスした状態で、拡張のボタンをクリック
6. 1,2秒後（若干タイムラグあり）、MarkDown形式で挿入される

## 補足
- My Listからランダムで選ばれる

## サンプル画像
[![LGTM](http://lgtm.in/p/kycNJ9leq)](http://lgtm.in/i/kycNJ9leq)
拡張メソッド（VB.Net）

#VB.NETでの拡張メソッドの書き方のメモ

System.Runtime.CompilerServices を インポートします。
Module で作成します。


また後で追記します。

```Extensions.vb
Imports System.Runtime.CompilerServices

Public Module HogeExtensions

    <Extension>
    Public Function IsNullOrEmpty(Byval value As String) As Boolean

        Return String.IsNullOrEmpty(value)

    End Function

    '' VB.Net を使用すると メール送信にSmtpClientを使用することが多いと思います。
    '' そのため、メールアドレスのチェックはMailAddressクラスで
    '' チェックすることをお勧めします。
    <Extension>
    Public Function IsMailAddress(Byval value As String) As Boolean

        If value.IsNullOrEmpty Then
            Return False
        Else
            Try
                Dim MailAddress As New System.Net.Mail.MailAddress(value)
                Return True
            Catch ex As FormatException
                Return False
            End Try
        End If
    End Function

End Module

```
使用方法

``` Main.vb
Sub Main

    If "hoge@example.com".IsMailAddress Then
        ' Trueの処理
    Else
        ' Falseの処理
    True

```
c#をMQTTゲートウェイにしました。

## 概要
「ohijs0.paas.jp-e1.cloudn-service.com/」のサンプルで
c#をMQTTゲートウェイにしました。

## 部品表
* Attiny85
* BMP085
* 基板
* ピン

##　完成品    
![](http://jsrun.it/assets/f/2/u/g/f2ugt "BMP085")       
![](http://jsrun.it/assets/u/Y/w/V/uYwVd "BMP085")       

##回路図
![](http://jsrun.it/assets/p/F/L/1/pFL1o "BMP085")

##プログラム
* attiny85
* [jsdo](http://jsdo.it/ohisama1/p2Ls "jsdoのページ") 
* グラフ表示
* [jsdo](http://jsdo.it/ohisama1/6cyF "jsdoのページ")  
   
##説明
* attiny85とbmp085の間は、i2cです。
* attiny85には、インタープリターを焼いてます。
* attiny85とc#の間は、usbシリアルです。
* c#から、sangoにpublishしています。    
* c#は、paho使っています。
* グラフは、paho使ってます。
* 下は、sangoのdashboardです。
![](http://jsrun.it/assets/f/6/n/1/f6n1m "BMP085")
androidをMQTTゲートウェイにしました。

## 概要
「ohijs0.paas.jp-e1.cloudn-service.com」のサンプルで
androidをMQTTゲートウェイにしました。
## 部品表
* Attiny85
* BMP085
* 基板
* ピン

## 完成品    
![graoh](http://jsrun.it/assets/u/Y/w/V/uYwVd)  
![android](http://jsrun.it/assets/w/w/f/9/wwf9w)
   
## 回路図
![bmp085](http://jsrun.it/assets/p/F/L/1/pFL1o)

## プログラム
* attiny85
* [jsdo](http://jsdo.it/ohisama1/p2Ls) 
* グラフ表示
* [jsdo](http://jsdo.it/ohisama1/6cyF)     

## 説明
* attiny85とbmp085の間は、i2cです。
* attiny85には、インタープリターを焼いてます。
* attiny85とandroidの間は、usbシリアルです。
* androidから、sangoにpublishしています。    
* androidは、paho使っています。
* グラフは、paho使ってます。
* 下は、sangoのdashboardです。
![](http://jsrun.it/assets/f/6/n/1/f6n1m "BMP085")
bottle超初歩入門

Pythonスクリプトを書くだけだとどうしてもモチベーション維持につながらない。
Pythonで書いたスクリプトをWebアプリケーションとして使いたい。
ブラウザで動いているのが見たいんだ！

といった場合にbottleはとても有効なフレームワークです。
最近bottle布教活動していますので、

１．イマイチ使い方が分からない。
２．何故かbottleが上手く使えない。

そういう方向け。
大体pipでインストールしようとして躓く場合が多いようなので解説します。

```
$ pip install bottle
```

これがそもそも大きな間違いです。仮想環境下でなければ当然これでは動きません。


bottleはたった1つの.pyファイルから成り立っています。
原則としてbottleはこれから作ろうとするPythonスクリプトのファイルと「同一階層」に
設置しなければなりません。

なので、bottle.pyをそのまま保存するのが簡単です。

https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py

このソースをbottle.pyとして保存します。
フォルダの階層としては、

```
myapp/ bottle.py
       index.py
```

のようになります。

ここまで出来たらindex.pyの中身を公式と同じように書いてみます。

```index.py
from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)

run(host='localhost', port=8080)
```

```
$ cd myapp
$ python index.py
```

http://localhost:8080/hello/world にアクセスして動いていればOK。


非常に薄いですが本にまとめました。
https://www.amazon.co.jp/dp/B01MQU38Y0


#追記　Flaskもいいぞ

ほとんどbottleと同じ感じでいけます。
http://qiita.com/Gen6/items/ff1d163acf0fa7687454


例によって本にまとめてます。
https://www.amazon.co.jp/dp/B0714D1VGP
Phoenix Framework docs/sessions読んだ。

[Phoenix Framework](http://www.phoenixframework.org/)の公式ドキュメントの[Sessions](http://www.phoenixframework.org/v0.13.1/docs/sessions)を簡単に訳しつつ補足

#Cookie
Phoenixはsession cookie storeをサポートしていて簡単に利用できる。
以下の設定をアプリケーションに追加すれば良い

```ex:
# my_app/config/prod.exs
use Mix.Config

config :phoenix, MyApp.Endpoint,
  ...
  secret_key_base: "..."

config :phoenix, MyApp.Router,
  session: [store: :cookie,
            key: "_your_app_key"]
```

##補足
ただ、`lib/app_name/endpoint.ex`に以下の記述がある。

```ex:
plug Plug.Session,
  store: :cookie,
  key: "_appname_key",
  signing_salt: "****"
```

prod.exsに追記しなくても、Using the session dataで掲載しているように、put_session, get_sessionをControllerで呼び出してやると動作する。
prod.exに追記する内容についてはまだ調べきれてない。

#ETS
PhoenixはErlang Term Storage(ETS)を用いてサーバサイドセッションをサポートする。
ETSを利用したセッションの設定には、ETS tableをアプリケーション実行時に作成するように以下の設定を追加する

```elixir:
# my_app/lib/my_app.ex
  def start(_type, _args) do
    :ets.new(:session, [:named_table, :public, read_concurrency: true])
      ...
```

ETSセッションをEndpointで利用するには以下の設定を加える

```elixir:
# my_app/lib/my_app/endpoint.ex
plug Plug.Session,
  store: :ets,
  table: :session,
    ...
```

##ETSについて
[28. Bears, ETS, Beets](http://www.ymotongpoo.com/works/lyse-ja/ja/28_ets.html)
インメモリデータベースなので、再起動したりすると揮発するし複数台のWebサーバで運用すると通信できなさそうなので、memcahed、MySQL、Redis辺りをsession storageとして利用したほうが良さそう。

* [plug-session-memcached](https://github.com/gutschilla/plug-session-memcached)
* https://hex.pm/packages/plug_session_memcached


#Using the session data
アプリケーションコントローラからsessionにアクセスする例

```elixir:
defmodule MyApp.PageController do
  use Phoenix.Controller

  def show(conn, _params) do
    conn = put_session(conn, :foo, "bar")
    foo = get_session(conn, :foo)

    text conn, foo
  end
end
```
ElixirでURLが有効なのかを判別する方法

[ElixirでURLが有効なのかを判別する方法](http://stackoverflow.com/questions/30696761/check-if-a-url-is-valid-in-elixir)

`URI`パッケージを使うと便利です。

```iex
iex(5)> URI.parse("https://account.idcfcloud.com/auth/login?service=https%3A%2F%2Fconsole.idcfcloud.com%2F%3Fcl%3Drn_lgin")
%URI{authority: "account.idcfcloud.com", fragment: nil,
 host: "account.idcfcloud.com", path: "/auth/login", port: 443,
 query: "service=https%3A%2F%2Fconsole.idcfcloud.com%2F%3Fcl%3Drn_lgin",
 scheme: "https", userinfo: nil}
```
要するに`host`の部分は`nil`であるかをチェックするといいです。

```
defmodule Validation do
  def validate_uri(str) do
    uri = URI.parse(str)
    case uri do
      %URI{host: nil} -> {:error, uri}
      uri -> {:ok, uri}
    end
  end
end
```

```iex
iex(1)> Validation.validate_uri("abc")
{:error,
 %URI{authority: nil, fragment: nil, host: nil, path: "abc", port: nil,
  query: nil, scheme: nil, userinfo: nil}}
iex(2)> Validation.validate_uri("http://google.com")
{:ok,
 %URI{authority: "google.com", fragment: nil, host: "google.com", path: nil,
  port: 80, query: nil, scheme: "http", userinfo: nil}}
```
技術英語 > catch on to > haven't caught on to the full value of information hiding and modularity

引用: Code Complete > Common Problem with Global Data

> If you use global variables indiscriminately or you feel that not being able to use them is restrictive, you probably haven't <font color=red>caught on to</font> the full value of information hiding and modularity.


http://eow.alc.co.jp/search?q=catch+on+to&ref=sa

>(意味など)を理解する
>(計画など)に気づく
Setup https proxy with vulcand

vulcand supports not only http but also https. This is the way to set up https proxy and use it as a insecure https proxy for a development environment.

Basic usage of vulcand is quite simple, see [Quick Start — Vulcand documentation 2.0 documentation](http://docs.vulcand.io/quickstart.html).

## Setup https proxy

To use https with vulcand, it needs to set `Host` configuration with a certificate and a key.

### Create seal key

First, we have to create seal key to secure our certificates and keys in etcd.

```
vctl secret new_key

# It can be exported to a file
vctl secret new_key --file path/to/file
```

We can run the command as a container like below:

```
docker run -it --rm -v /path/to/dir:/path/to/dir mailgun/vulcand:v0.8.0-beta.3 vctl secret new_key --file /path/to/dir/seal_key
```

### Add host configuration

**Currently there's a bug to set configuration as a json via etcd api ([docs](http://docs.vulcand.io/proxy.html#managing-certificates)).** We have to use `vctl` to add hosts configuration.
[trouble making https work · Issue #210 · mailgun/vulcand](https://github.com/mailgun/vulcand/issues/210)

```
vctl host upsert -name example.com --cert=/path/to/cert.pem --privateKey=/path/to/private.key
```

If vulcand runs as a container, do `exec` and then set host configuration with `vctl`:

```
/usr/bin/docker run -d --name vulcand \
  -p 443:443 -p 80:80 -p 8181:8181 -p 8182:8182 \
  -v /path/to:/path/to \
  mailgun/vulcand:v0.8.0-beta.3 \
  /go/bin/vulcand \
    -apiInterface="0.0.0.0" \
    -etcd="http://10.1.1.1:2379" \
    -port=80 \
    -sealKey=<sealKey>

# exec
/usr/bin/docker exec -it vulcand vctl host upsert -name example.com --cert=/path/to/cert.pem --privateKey=/path/to/private.key
```

### Create listener

```
etcdctl set /vulcand/listeners/ls1
'{
    "Id":"ls1",
    "Protocol":"https",
    "Address":{"Network":"tcp","Address":"0.0.0.0:443"}
}'
```

## Skip Verification of TLS

To configure insecure mode for a development environment, Set `InsecureSkipVerify` to `Settings` -> `TLS` of both of `Backend` and `Listener`.

### Listener

```
etcdctl set /vulcand/listeners/ls1
'{
    "Id":"ls1",
    "Protocol":"https",
    "Address":{"Network":"tcp","Address":"0.0.0.0:443"},
    "Settings":{
        "TLS":{
            "InsecureSkipVerify":true}
    }
}'
```

### Backend

```
etcdctl set /vulcand/backends/web/backend
'{"Id":"web","Type":"http",
      "Settings":{
         "TLS":{
             "InsecureSkipVerify":true}
      }
}'
```
誰でも無料でiPhoneの実機を使ってiOSアプリ開発する方法

WWDC 2015でiOS Developer Programに関する変更があり、
これまで年間11,800円の登録費用を払ってDeveloper Programに登録しなければできなかった、
iPhoneやiPadの実機を使った開発が可能になりました。

Xcode7 での無料の実機ビルドの方法についてまとめます。

![スクリーンショット 2015-06-09 20.20.22.png](https://qiita-image-store.s3.amazonaws.com/0/34488/11f8988f-63d0-03bc-c754-f2fe970693f8.png)

(本記事の内容は一般公開されている情報に基づいています。
beta版に関するスクリーンショットは使用していません。)

#必要なもの
・Mac
・Xcode7

#Xcode7のダウンロード
2015年6月現在、beta版のXcode7をダウンロードします。
https://developer.apple.com/xcode/downloads/
ファイルサイズが4Gありますので、PCの容量が足りない場合は不要なデータを削除して容量を確保してください。

![スクリーンショット 2015-06-09 20.34.58.png](https://qiita-image-store.s3.amazonaws.com/0/34488/27935115-a710-7889-4a75-5d1ebc9007f4.png)

#Xcodeの起動
インストールしたXcodeを起動して新しいプロジェクトを作成します。
「Create a new Xcode project」 を選択します。

※スクリーンショットはXcode6のものを使用して説明します。

![スクリーンショット 2015-06-09 20.40.42.png](https://qiita-image-store.s3.amazonaws.com/0/34488/1edb44f3-6ed8-a741-b1a8-c772d5ef38aa.png)

次にiOS - Applicationを選択します。
一番シンプルなSingle View Applicationを選択します。
基本的にはどれを選んでも構いません。最初に存在するファイルが違うだけです。
あとから自由に追加できます。

![スクリーンショット 2015-06-09 20.40.54.png](https://qiita-image-store.s3.amazonaws.com/0/34488/b0af7f46-8f26-ad08-8ebc-07b4d1e96a68.png)

アプリの名前は仮に「SampleFreeApp」とします。
ご自身の好きなアプリ名で作成してください。

![スクリーンショット 2015-06-09 20.41.37.png](https://qiita-image-store.s3.amazonaws.com/0/34488/56a00704-0137-5f54-6878-524ea58f75d0.png)


ファイルの保存先を選択する際に、画面末尾に存在するSource Controlはチェックを外したままで問題ありません。
開発になれてきたら「Git」で検索しましょう。

![スクリーンショット 2015-06-09 20.42.04.png](https://qiita-image-store.s3.amazonaws.com/0/34488/b2d0254c-9459-9f2e-0ad2-44590b5e11a9.png)

Createを押下した後に、開発用の画面が表示されます。
プログラムの変更は必要ありません。

（iOS8以下の端末を使われている場合）
使用するiPhoneのOSのバージョンがiOS9未満の場合、デフォルトの状態では実行時にエラーが発生します。
プロジェクトの「Deployment Target」を使用するiPhoneのOSのバージョン以下の数字に指定してください。
以下の画像を参考に値を変更してください。

![スクリーンショット 2015-06-17 23.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/34488/6890b2de-a5be-0d30-fb4f-ef35571bcc41.png)

ビルド対象から実機を選択します。
青いアイコンがシミュレーターで黒いアイコンが実機です。
PCにUSBで接続している端末が最上段に表示されます。
「iOS Device」となっている箇所が接続している端末名になっていれば大丈夫です。

![スクリーンショット 2015-06-09 20.43.21.png](https://qiita-image-store.s3.amazonaws.com/0/34488/ca941ca5-13bd-4e87-1f48-c72ab08a8942.png)

▶のボタンを押すと実機にアプリがインストールされ、自動的に起動します。
パスワード入力などを求められたら入力してください。

※エラーが発生したら「Fix Issuse」を選択してください。
自動的にXcodeが自動的に修正してくれます。

![スクリーンショット 2015-06-09 20.44.02.png](https://qiita-image-store.s3.amazonaws.com/0/34488/472b7dbe-1697-dea2-a687-8421bca4643a.png)


起動したアプリは真っ白な画面が表示されるはずです。
ファイルの変更を行っていないため、今はこの画面で正常です。

以上が実機でアプリを動かす方法でした。

Storyboardを変更してボタンを追加するなど、
いろいろと試してみてください。

#開発したアプリを配布したいとき
Xcode7から実機を使った開発は無料になりましたが、
AppStoreに公開して一般ユーザーにダウンロードしてもらうためには、
これまで通り開発者プログラムへの登録が必要です。

作ったアプリを多くの人に使ってもらうためにも開発者登録をしましょう。
https://developer.apple.com/program/renew/index.action

![AppleDeveloperProgram.png](https://qiita-image-store.s3.amazonaws.com/0/34488/5c670701-57a3-4d23-075d-370d56002aca.png)


#まとめ
新しくなったiOS Developer Program、あらため、Apple Developer Programにより、
無料で可能になった実機でのアプリの動かし方についてまとめました。

手軽にアプリ開発ができるようになったので、
もっと開発者が増えてアプリ開発が盛り上がると楽しそうですね。
geojsonio-cli を使って各種データを地理院タイルの上で確認する方法


![スクリーンショット 2015-06-09 16.09.12.png](https://qiita-image-store.s3.amazonaws.com/0/51814/85daee0c-923d-b2a9-036e-d3330477bc74.png "スクリーンショット 2015-06-09 16.09.12.png")


目的
===
ShapefileやKMLなどのフォーマットで提供されているデータを「地理院地図」や地理院タイルの上に、ウェブブラウザを使って重ね合わせる方法があまりよく知られていない。その方法を実例により示す。

準備
===
geojsonio-cli は Node で動作するプログラムなので、Windows であっても Node が動けば動作する。ここでは、OS X での準備について記述する。

```zsh
$ brew install nodebrew
$ vi ~/.bash_profile # export PATH=$HOME/.nodebrew/current/bin:$PATH を追記
$ source ~/.bash_profile 
$ nodebrew install stable
$ nodebrew list
$ nodebrew use v0.12.4
```

このようにすることで、安定版の node が使えるようになる。

次に、https://github.com/mapbox/geojson.io にあるとおり、geojsonio-cli と wellknown をインストールする。

```zsh
$ npm install -g geojsonio-cli
$ npm install -g wellknown
```

操作
===
```zsh
$ echo "Point(135 35)" | wellknown | geojsonio 
```
これで「日本へそ公園」のポイントデータが geojson.io で開く。

表示されているサイトの左上に並んでいる中の「Meta」から「Add map layer」を選ぶ。

![スクリーンショット 2015-06-09 16.23.30.png](https://qiita-image-store.s3.amazonaws.com/0/51814/037293ac-11d7-0ddc-30b8-b4a6263468a6.png "スクリーンショット 2015-06-09 16.23.30.png")

「Add map layer」をクリックするとダイアログが出てくる。Layer URL に「http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png 」を、Layer name に「地理院タイル（標準地図）」を入力することで、この記事の冒頭のスクリーンショットのように、地理院タイル（標準地図）が背景地図に敷かれた形にできる。

なお、この記事の冒頭のスクリーンショットでは、ポイントデータをクリックし marker-color, marker-size, marker-symbol の各属性を適当に調整している。

Shapefileの読み込み
=====
Shapefile など様々なデータについても、同様になんらかのツールで GeoJSON に変換することができれば、geojsonio に上げて確認することができる。

```zsh
$ npm install -g shp2json
```

ただし、Shift_JISでエンコードされた Shapefile を変換しようとすると、OS X では libiconv 周りのエラーが出てしまう。また、大きなファイルを変換しても、geojson.io に乗りきらない。
Unityをターミナルを叩かずに多重起動する拡張（Mac対象）

# Unityを多重起動する
Macのアプリって普通アイコンやランチャー叩いても多重起動できない。
それは問題ないがUnityで複数プロジェクトを同時起動できないのが問題だと思う。
（マックがそういう仕様である以上は一つのアプリのプロセスで複数プロジェクト開けるようになってて欲しいもんだ。）
Unityで例えばテストプロジェクトと本命プロジェクトを見比べながら作業したりとかよくあると思う。

で、ターミナル使って多重起動するにしても（我々エンジニ〜アは補完がキンキンに効いてる自慢のシェルを使ってるにしても）いちいち

```shell-session
/Applications/Unity/Unity.app/Contents/MacOS/Unity
```

って打つのも面倒だと思う。

# 導入

なのでUnity内から更にUnityを開く拡張作った。

```csharp:RunMoreUnity.cs
using System.Diagnostics;
using UnityEditor;

public class RunMoreUnity {

	#if UNITY_EDITOR_OSX

	[MenuItem("File/Start One More Unity")]
	private static void StartNewUnity() {
		var p = new ProcessStartInfo();
		p.FileName = "/Applications/Unity/Unity.app/Contents/MacOS/Unity";
		p.UseShellExecute = true;
		p.CreateNoWindow = true;
		Process.Start(p);
	}

	#endif
}
```

これをEditor以下に入れとけばメニューからプルダウンで起動できる。

![Main.unity - Vuforia AssetBundle Unit Test - PC, Mac & Linux Standalone 2015-06-10 05-37-40.jpg](https://qiita-image-store.s3.amazonaws.com/0/14940/40dab581-2421-b38f-7d54-da27075993cd.jpeg)

ショートカットを設定しなかったのはやんちゃな俺が連打してUnity100万個くらい起動して愛機が爆発するのを防ぐためである。

落ち着きのあるユーザーはコレ↓みて設定しても構わない。
http://docs.unity3d.com/ScriptReference/MenuItem.html

Macしか対応しなかったのは俺がMacユーザーだし面倒くさがりで面倒見も悪いからである。

# 番外編
それでもターミナルから開きたい 
カッコつけマン
 ターミネーターは
pipでpercolでも入れて

```shell-session:.zpercol
### search Mac Application
percol_application() {
	BUFFER=$(find /Applications ~/Applications -maxdepth 2 -regex '.*.app' | sed 's/ /\\ /g' | percol --query "$LBUFFER")
	CURSOR=$#BUFFER
	zle -R -c
}
zle -N percol_application
bindkey '^f' percol_application
```

こんな設定↑書いとけばこんな感じ↓で動いて他のアプリも多重起動しやすいだろ。
![2015-06-10 05_58_31.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/c5754bc8-daa5-5d91-680f-c469cdb57087.gif)
EditorWindow内のPopup Window上でマウスを右クリックしてコンテキストメニューを表示する

`EditorWindow`クラスの派生クラスで表示したウィンドウ上でマウスを右クリックすると`EventType.ContextClick`イベントが発生します。しかし、`GUI.Window()`を使って表示したPopup Window上でマウスを右クリックしても`EventType.ContextClick`イベントは発生しません。

Popup Window上では代わりに`EventType.MouseDown`イベントの発生と、マウスを右クリックしたかどうかで判定します。

```csharp
using UnityEditor;
using UnityEngine;

public class MyEditorWindow : EditorWindow
{
	[MenuItem("Window/MyEditorWindow")]
	static void ShowWindow()
	{
		GetWindow<MyEditorWindow>();
	}

	Rect rect = new Rect(10, 10, 100, 100);
	
	void OnGUI()
	{
		BeginWindows();
		rect = GUI.Window(1, rect, WindowCallback, "window");
		EndWindows();
		
		var ev = Event.current;
		if (ev.type == EventType.ContextClick)
		{
			// MyEditorWindowの背景でマウスを右クリックするとここに来る。 
			var menu = new GenericMenu();
			menu.AddItem(new GUIContent("MyEditorWindow.OnGUI()"), false, MenuClicked);
			menu.ShowAsContext();
			ev.Use();
		}
	}
	
	void WindowCallback(int id)
	{
		var ev = Event.current;
		if (ev.type == EventType.MouseDown && ev.button == 1)
		{
			// MyEditorWindow内のPopup Window上でマウスを右クリックするとここに来る。
			var menu = new GenericMenu();
			menu.AddItem(new GUIContent("MyEditorWindow.WindowCallback()"), false, MenuClicked);
			menu.ShowAsContext();
			ev.Use();
		}
	}

	void MenuClicked()
	{
	}
}
```

MyEditorWindowの背景でマウスを右クリックするとこのようになります:
![MyEditorWindowの背景でマウスを右クリックした時の様子](https://qiita-image-store.s3.amazonaws.com/0/2070/48360433-79b1-7d2a-ac34-c20c32307f22.png)

また、Popup Window上でマウスを右クリックするとこのようになります:
![Popup Window上でマウスを右クリックした時の様子](https://qiita-image-store.s3.amazonaws.com/0/2070/fb79da2d-3a1e-558a-3647-31c8403cb650.png)

### 参考
[Clickable GUI.Window - Unity Answers](http://answers.unity3d.com/questions/284621/clickable-guiwindow.html)
CoffeeScript で clamp関数

enchantJS でゲームを書いていて欲しくなったので作った
## コード

```coffeescript
class @ElzupUtils
  # 第2, 3引数によって定義される範囲に固定される第1引数の値を計算する
  @clamp = (val, max, min=0, padding=0) ->
    Math.max(Math.min(max - padding, val), min + padding)
```

## 使用例

```coffeescript
# 10 から 100 の間に
ElzupUtils.clamp(50, 100, 10)
# -> 50
ElzupUtils.clamp(200, 100, 10)
# -> 100
ElzupUtils.clamp(-20, 100, 10)
# -> 10

# 0 から 10 の間に
ElzupUtils.clamp(-20, 10)
# -> 0
ElzupUtils.clamp(20, 10)
# -> 10

# 5 (= 0 + 5) から 95 (= 100 - 5) の間に
ElzupUtils.clamp(0, 100, 0, 5)
# -> 5
ElzupUtils.clamp(100, 100, 0, 5)
# -> 95
```

## 作ってみて思ったこと
* 引数の順番は (val, min, max) のが良いか？ (デフォルトが0 の場合が多いためminを後ろにした)
* val は適切な命名か？
* デフォルト引数=演算子の両隣にスペースは必要か？(coffeelint にかけて見たらどちらでも通った)
UniRxについて書いた記事をまとめてみた

#概要

過去に自分が書いたUniRx（Rx含む）の記事を一覧にまとめてみました
皆様の参考になればいいなぁと思います。

記事を書いた当時と比べると現時点ではもっと良い実装方法がある記事もあったりするかも。

# UniRx入門シリーズ

 * [UniRx入門もくじ](http://qiita.com/toRisouP/items/00b8a5bb8e7b68e0686c#_reference-222cc98a4173c17567a2)

#過去に作ったスライド

* [未来のプログラミング技術をUnityで -UniRx-](http://www.slideshare.net/torisoup/unity-unirx)
* [はじめてのUniRx](http://www.slideshare.net/torisoup/uni-rx)

#逆引き

* [UniRx オペレータ逆引き](http://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f)

#Rxの基礎について

##Hot/Coldについて
* [HotとColdについて](http://qiita.com/toRisouP/items/f6088963037bfda658d3)
* [Hot変換はどういう時に必要なのか？](http://qiita.com/toRisouP/items/c955e36610134c05c860)
* [Multicastの使いドコロ](http://qiita.com/toRisouP/items/fb8034a8b1d8775de9a1)

Rxのややこしい性質の1つ、ObservableのHot/Coldについてまとめたものです。
UniRxを中核においた設計を行う場合はこの性質の理解は必須です。

##その他Rxの説明
* [Repeatとは何なのか?](http://qiita.com/toRisouP/items/59d10ddec2e89b86600c)
* [ストリームのメッセージ同士を比較する](http://qiita.com/toRisouP/items/f5cb995d811e6bcef293)

PaerWise/Buffer(2,1)で済むところをZipとSkip(1)で書く人が多い印象を受けます。

#UniRxの機能紹介

##Update()をUniRxで書き換える系
* [Update()をObservableに変換する方法](http://qiita.com/toRisouP/items/972b97367df12c3457d2)
* [ObserveEveryValueChangedでフレーム間での値の変動を監視する](http://qiita.com/toRisouP/items/d0d32cf674a00f3a8427)

UniRxを導入したらまず最初にやるべきであろうUpdate()の書き換え方についてまとめてみたものです。
まずは`UpdateAsObservable`と`ObserveEveryValueChanged`を使っておけばは良いかと思います。

##コルーチンと組み合わせてみた系
* [UniRxとコルーチン](http://qiita.com/toRisouP/items/dc369ff4232c5c127437)

UniRxとコルーチンは組み合わせることで真価を発揮すると過言ではありません。
コルーチンとの組み合わせ方はマスターしておくと良いかと思います。

##その他
* [連続したOnNextの最初しか流さないオペレータThrottleFirst](http://qiita.com/toRisouP/items/fe52e1582c14782af3ac)
* [AddToでSubscribeのDisposeをGameObjectに紐付ける](http://qiita.com/toRisouP/items/35b4d6255c1f9ecf27d1)
* [.NET 4.6時代のUnityでUniRx](https://qiita.com/toRisouP/items/596e42fac1b02f59f271)
* [【UniRx】 ReactiveCommand/AsyncReactiveCommandについて](https://qiita.com/toRisouP/items/c6fba9f01e6d15dabd79)
* [UniRxのObjectPoolを利用する](https://qiita.com/toRisouP/items/2a5fb86654525a4a8453)

AddToはよく使う機能なので覚えておくべきです。

#使用例のまとめ

##判定の改善
* [CharacterController IsGrounded の判定を改善する](http://qiita.com/toRisouP/items/9141f1bbc6f623db5fdd)

正直Raycastの方が安定します

* [マウスの長押しを判定する](http://qiita.com/toRisouP/items/4fec0e9716be4d415798)

コルーチンで書いたほうが複雑だけど後々拡張しやすいし良いかも（FRP全否定）

##PhotonCloudを使いやすくする
* [Photon CloudのRoomListの更新を監視する](http://qiita.com/toRisouP/items/228e42e6c65b0cbc349e)
* [PhotonCloudのログイン処理をUniRxで同期処理っぽく書く](http://qiita.com/toRisouP/items/584d5bc706e4b1dca3bb)
* [【PUN】PhotonCloudのコールバック処理をUniRxでスマートに書く「PhotonRx」](http://qiita.com/toRisouP/items/10d9112eda30a0ba9278)

PhotonRxはPhotonを使いやすくするための1つの解な気がします。

##その他実装例
* [同時に画面に写ったオブジェクトの数を数えてみる](http://qiita.com/toRisouP/items/83fd28b6d4a70a7ed1d2)
* [カウントダウンタイマーを作る](http://qiita.com/toRisouP/items/581ffc0ddce7090b275b)
* [AnimatorのTriggerをBoolを使って再現する](http://qiita.com/toRisouP/items/72c8950b53f79fadc4af)
* [StateMachineBehaviourでAnimatorを監視する](http://qiita.com/toRisouP/items/b6540b7f514d18b9a426)
* [スクリプトの処理の実行タイミングを操作する](http://qiita.com/toRisouP/items/e402b15b36a8f9097ee9)
* [FPSカウンタ](http://qiita.com/toRisouP/items/1d0682e7a35cdb04bc38)

「とりあえずやってみた」的な記事なのであまり鵜呑みにしないでください
CentOS7でPHP5.6をインストール（SCL対応）

remiを追加します（remi追加するとepelも一緒に入ります）

```bash
% yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

remiには `php` というパッケージと `php56` という2つのパッケージが存在します
`php`というパッケージをいれると、システムデフォルトの領域にインストールされます。
`php56`というパッケージでいれると、`/opt/remi`の環境化にインストールされます。

今回はSCL対応としてインストールを行うので、`php56`のパッケージでインストールします。
（この際 `scl-utils` が無ければ一緒にインストールされます）

```bash
% yum install --enablerepo=remi --enablerepo=remi-php56 php56
```
インストールすると、`/opt/remi/php56` にphp5.6がインストールされています。
また、その中にある、`/opt/remi/php56/enable` を読み込めば、インストールしたphp5.6へのパスが通るようになります。
もちろん、`scl enable php56 bash` でもphp5.6を使えるようになります。

```bash
% ls -al /opt/remi/php56/
total 16
dr-xr-xr-x  3 root root 4096 Jun  9 17:25 .
drwxr-xr-x  3 root root 4096 Jun  9 17:25 ..
-rw-r--r--  1 root root  242 Mar 26 08:26 enable
dr-xr-xr-x 17 root root 4096 Jun  9 17:25 root

% . /opt/remi/php56/enable
% php --version
PHP 5.6.9 (cli) (built: May 15 2015 09:01:38) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
```
Android StudioとGitHubの連携について(Windows)

#始めに
まず、Android StudioでGitHubと連携するには、

VCS　→　Import into Version Control　→　Share Project on GitHub

なのですが、"cannot run program "git.exe"..." とかいうエラーが出ます。

#原因
Android Studioを入れているPCにGitHubが入ってませんでした。そらエラー出ますね。
そこでGitHub for Windowsをインストールし、アカウント設定やglobal configをいじって再度チャレンジするも同じエラー。

#PATHの編集
どうやらgit.exeがある場所までパスを通さないといけないようです。
環境変数から、
`C:\Users\username\AppData\Local\GitHub\PortableGitなんちゃら\bin(←多分こんな感じ)`

これでようやくGitHubと連携できました。

#追記
　git.exeが必要なだけなので、インストールするのは別にGitHubのWindowsクライアントじゃなくても大丈夫でした。
　Git for Windows等をインストールした場合のパスは確認していないので、各自で探して下さい(投げやり)
MaterialDesignの文字サイズはAppCompatのstyleが使える

MaterialDesignガイドラインの[Style > Typography](http://www.google.com/design/spec/style/typography.html#typography-styles)には、基本の文字サイズが規定されています。

![Typography_-_Style_-_Google_design_guidelines_と_EnglishMasterClass.png](https://qiita-image-store.s3.amazonaws.com/0/15267/84f63392-f035-cec1-c7a4-61aac4cc1b76.png "Typography_-_Style_-_Google_design_guidelines_と_EnglishMasterClass.png")


このサイズに揃えるには `dimens.xml` に独自に定義してもいいんですが、実はAppCompatに用意されているのでそれを使えます。

# AppCompatの定義
values.xml の中に、`TextAppearance`から始まるstyleが用意されています。

```xml
<style name="TextAppearance.AppCompat.Body1" parent="Base.TextAppearance.AppCompat.Body1"/>
<style name="TextAppearance.AppCompat.Body2" parent="Base.TextAppearance.AppCompat.Body2"/>
<style name="TextAppearance.AppCompat.Button" parent="Base.TextAppearance.AppCompat.Button"/>
<style name="TextAppearance.AppCompat.Caption" parent="Base.TextAppearance.AppCompat.Caption"/>
<style name="TextAppearance.AppCompat.Display1" parent="Base.TextAppearance.AppCompat.Display1"/>
<!-- 略 -->
```

継承元のstyleの1つを見てみると、`textSize` と `textColor` が指定されています。
`textSize` は、ガイドラインそのままのサイズです。 `textColor` は、`textColorPrimary` や `textColorSecondary` など、Typographyに合わせた色が設定されています。

```xml
<style name="Base.TextAppearance.AppCompat.Body1">
    <item name="android:textSize">@dimen/abc_text_size_body_1_material</item>
    <item name="android:textColor">?android:textColorPrimary</item>
</style>
```


# 指定する時
`textAppearance` でstyleを指定すればよいです。
AndroidStudioは補完がイケてるので、`TextAppearance.AppCompat.` で補完すれば他にも色々出てきます。


```xml
  <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="Username"
      android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>
```


# おまけ
AppCompatの中には、MaterialDesignガイドラインで規定されているdpサイズ等はだいたい入ってます。
values.xmlの中をざっと見てみるといいかもしれません。

```xml
<dimen name="abc_text_size_body_1_material">14sp</dimen>
<dimen name="abc_text_size_body_2_material">14sp</dimen>
<dimen name="abc_text_size_button_material">14sp</dimen>
<dimen name="abc_text_size_caption_material">12sp</dimen>
<dimen name="abc_text_size_display_1_material">34sp</dimen>
<dimen name="abc_text_size_display_2_material">45sp</dimen>
<dimen name="abc_text_size_display_3_material">56sp</dimen>
<dimen name="abc_text_size_display_4_material">112sp</dimen>
<dimen name="abc_text_size_headline_material">24sp</dimen>
<dimen name="abc_text_size_large_material">22sp</dimen>
<dimen name="abc_text_size_medium_material">18sp</dimen>
<dimen name="abc_text_size_menu_material">16sp</dimen>
<dimen name="abc_text_size_small_material">14sp</dimen>
<dimen name="abc_text_size_subhead_material">16sp</dimen>
<dimen name="abc_text_size_subtitle_material_toolbar">16dp</dimen>
<dimen name="abc_text_size_title_material">20sp</dimen>
<dimen name="abc_text_size_title_material_toolbar">20dp</dimen>
```
DDNS(MyDNS)を定期的に更新


[ドメイン取得からDDNS設定まで](http://qiita.com/mizuki_takahashi/items/b0c5adebea48b9f2f7a6)の続きです。
↑の記事でドメイン取得後DDNS(MyDNS)の設定を行ったはいいが、
インターネットプロバイダーによっては頻繁にグローバルIPアドレスが変更されてしまいます。
グローバルIPアドレスが変更されてしまった場合は、
再びDDNSに設定を反映させる必要があります。

しかし、毎回DDNSの設定を手動反映させるのは面倒ですよね。。。

そこで、cronを使って定期的にDDNSの設定を反映させる方法を紹介します。

# DDNSに設定を反映させるためのスクリプト作成

スクリプトの中身はものすごいシンプル！
UserIdとPasswordを自分のものに変更してwgetで投げるだけでOK。
#### $ mydns_update.sh
    #!/bin/sh
    #
    # update ddns
    #
    
    # MyDNS
    wget -O - --http-user=hogehoge --http-password=fugafuga http://www.mydns.jp/login.html

# ↑で作成したスクリプトの動作確認

下記のようなスクリプト結果が得られ、MyDNSの「LOG INFO」を確認して更新されていることを確認。

    # ./mydns_update.sh
    --YYYY-MM-DD HH:MM:SS--  http://www.mydns.jp/login.html
    www.mydns.jp (www.mydns.jp) をDNSに問いあわせています... 199.180.255.198, 210.197.74.203, 103.11.143.116, ...
    www.mydns.jp (www.mydns.jp)|199.180.255.198|:80 に接続しています... 接続しました。
    HTTP による接続要求を送信しました、応答を待っています... 401 Authorization Required
    www.mydns.jp:80 への接続を再利用します。
    HTTP による接続要求を送信しました、応答を待っています... 200 OK
    長さ: 614 [text/html]
    `STDOUT' に保存中
    
     0% [                                                                                                        ] 0           --.-K/s              <html>
    <head>
    <title>Free Dynamic DNS (DDNS) for Home Server and VPS etc  | MyDNS.JP</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <LINK href="./site.css" rel=stylesheet type=text/css>
    
    </head>
    <BODY BGCOLOR="#FFFFFF"
          TEXT="#304040"
          leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"
    >
    Login and IP address notify OK.<BR>
    login_status = 1.<BR>
    <BR>
    <DT>MASTERID :</DT><DD>hogehoge</DD>
    <DT>REMOTE ADDRESS:</DT><DD>XXX.XXX.XXX.XXX</DD>
    <DT>ACCESS DAYTIME:</DT><DD>YYYY/MM/DD HH:MM</DD>
    <DT>SERVER ADDRESS:</DT><DD>XXX.XXX.XXX.XXX</DD>
    <BR>
    
    </body>
    </html>
    100%[=======================================================================================================>] 614         --.-K/s   時間 0s
    
    YYYY-MM-DD HH:MM:SS (63.5 MB/s) - stdout へ出力完了 [614/614]

# cronで定期的に更新されるようにする

cronで定期的に更新できるようにするとは言っても、
1日に何百回もリクエストするとアクセス制限をかけられてしまうらしい。
※私は1時間に1回動かしていますが、アクセス制限にひっかかっていないので24回/1日は大丈夫そうです。
以下にcronの設定を記載いたします。

    # mydnsの更新(1時間に1回)
    # スクリプトのパスは/root/mydns_update.shとした
    0 * * * * /root/mydns_update.sh >/dev/null 2>&1


これでグローバルIPが変わった場合でも1時間以内にDDNSに設定を反映させてくれるようになります。
もし、すぐに反映させたい場合はスクリプトを即時実行しましょう。
間もなく来るうるう秒を控えてやっておくべき事

北国のインフラエンジニアのkirksenchoです、初めましてこんばんは。

とうとう今月末に迫ってきたうるう秒挿入ですが、そろそろ対策しないとなりませんね。

3年前のうるう秒挿入時は、Linuxカーネルのバグが原因で、あちらこちらで問題が出ていたようです。

さくらクラウドさんでは、こんな情報が出されていましたが、番犬タイマーでカーネルパニックされたらインフラエンジニアもパニくりますね。
http://www.sakura.ad.jp/news/sakurainfo/newsentry.php?id=655

要はカーネルをバグフィックスされたバージョンにアップデートしておけば問題は出ないはずですが（デグレや新たなバグ作り込みが無い前提）、既に該当するカーネルバージョンのサーバが数百台も数千台もあって、カーネルアップデートの影響が大きすぎて無理！というケースも大規模クラウド全体を管理していたら、ありがちです。

そこで回避策として色々考えられますが、要はバグ持ちカーネルさんにLeap通知さえしなければ大丈夫というポイントを利用します。

大規模クラウドであれば、ntpdサーバも内部で立てていると思いますが、その上にバグの無いカーネルバージョンでもう一個ntpdサーバを立てて（以降、代理ntpdサーバと記載）、その代理ntpdサーバは下位ntpdサーバにleap通知をしないようにすればいいのです。

ただntpdだけを使用していると、それは難しいので、CentOS7から標準採用されているchronyを組み合わせます。
クラウド内の代理ntpdサーバ自体の時刻同期はchronyを使用して、NICTやPOOLやMFEED等に同期します。
この時にくれぐれも一時期話題となった福岡大学には同期しないようにする事を薦めます。

福岡大のNTPサーバがアクセス集中で悲鳴
http://www.itmedia.co.jp/news/articles/0501/21/news059.html
http://www.asyura2.com/0411/it07/msg/283.html

福岡大学NTPサーバの混雑解消にご協力を
http://srad.jp/story/05/01/21/0214236/

特にchronyは福岡大学のclock.nc.fukuoka-u.ac.jpやdrake.nc.fukuoka-u.ac.jpとは同期してくれませんでした。
clock.tl.fukuoka-u.ac.jpとは同期しましたが、無理に福岡大学のNTPDに同期する必要も無いでしょう。

話が逸れましたが、chronyにはport 0設定をconfに書きます。すると上位とは同期しますが、下位には時刻同期を提供しません。
そしてchronyは上位と同期するときは毎回空いてるポートを探して使ってくれるので、ntpdみたいにポート123を専有することもないです。
なので同時にntpdをポート123を使用して起動する事ができます。

ntpdはスタンドアロンモードで動作させますが、自分の時刻はchronyがちゃんと合わせてくれているので心配ありません。
ntpdのスタンドアロンモードは、２つくらいあります。

以下を設定すると、LOCALクロック参照固定モードになります。
```server 127.127.1.0```

LOCALクロック参照だとループ参照になって不安定になるという情報もありますが、その対策としてはOrphan Modeがあります。
```fudge  127.127.1.0 stratum 4```
```tos orphan 3```
設定には上記を書いて、serverの記載は全て消します。
するとntpdは、Orphan Modeで動き始めるので、下位のサーバから同期先としても機能するようになります。

この状態にすると、うるう秒通知をchronyは受け取ってカーネルに通知し、自分自身の時刻はうるう秒対応した状態で合わせますが、下位に時刻同期を提供しているntpdはうるう秒の事を全く知らずに普通にローカルクロックを参照して下位サーバに時刻を提供します。

うるう秒挿入が過ぎると、下位のNTPDサーバは1秒進んだ状態となりますが、ポーリングのタイミングが来た時点でズレに気づいてslewモードで合わせようと頑張り始めます。
でも1秒もずれていると、slewではなかなか追い付きませんので、ntpdの仕様として一定時間が過ぎると、stepモードに切り替わって、ガバっと時刻が合います。

その後、下位のNTPDサーバに同期していた子供サーバ達も、わらわらとズレに気づいてslew＋stepで時刻合わせを始めます。
末端にズレ修正が行き渡るまでは1時間ちょっとといったところでしょうか。

もちろん、この時間のズレと修正のされかたを、サーバ上で動いているシステムが許容できる必要があります。
ミリ秒単位で管理していて、一気に1ミリ秒でも時間が戻ったら破綻するようなシビアなシステムの場合は、-xを付けてslewモード完全固定にして、1秒あたり 0.5ミリ秒しか時間修正されない状況でじっくり時間をかけて1秒を巻き戻す必要があるでしょう。
その場合も下位のntpdサーバだけ、そのモードにしておけば、末端の子供サーバ達の設定はそのままで済みます。

以上、今月末に迫った、うるう秒対応について、まとめてみました。
何事もなく2015年7月1日午前9時0分(JST)が来ることを願ってやみません。