OmniAICreator/Qiita-1.07M huggingface dataset:
[rlwrap] 任意のシェルコマンドを対話モード化する [作り直した]

似たようなタイトルの記事を書いてすまなんだ

# 今北産業

* これ作った↓
* ウンコードだったから作り直した
* `rlwrap`くん偉いぞ

![つくったやつ](https://i.gyazo.com/17456ab296c0ae2b9f3121c5be3e493c.gif)

# rlwrapってなんぞや

readline(ターミナルの標準入力的なやつ)をラップするやつ。
名前も r(ead)l(ine)wrap からきてると思う

readlineはアローキーを押したときの挙動がしょぼい。そういう悲しみを解消してくれるコマンド

rlwrapをつかわないとこうなる▼ (↑↓←→↑の順で押してます)

![悲しみ](https://i.gyazo.com/6ce15a33313e289b5e6846ccd5de4016.gif)

## rlwrapを使ってみる

`sqlplus`もその悲しみを背負ったコマンドらしいので、sqlplusに対して`rlwrap`が使われてるらしい(知らなかった)。

要するに、

```sh
$ rlwrap sqlplus
```

ってするらしい。`sqlplus`を使う人はだいたい`.zshrc`あたりに
`alias sqlplus="rlwrap sqlplus"`なんてしてるらしいよ

# 本題

前に書いた [これ](http://qiita.com/ahyahya/items/b11b5d2dc30193c9c864) http://qiita.com/ahyahya/items/b11b5d2dc30193c9c864
流石に実装がひどいなあと思ったから作り直した。

## 概要

任意のコマンドを対話モード化するためのコマンド`interact`

例えば、gitしか弄らない予定のターミナルタブを開いたとする。毎回「git」って打つのめんどいだけだし省略したい。これを使えば解決する

需要はほとんどないとおもう

## インストール

### mac

```sh
$ curl -sL https://raw.githubusercontent.com/ahyahya/interact/master/install.sh | bash
```

### linux

rlwrapをyumかなにかでインストールして、install.shをみながらやれば入ると思います。多分。がんばって

## 使い方

察してくれ

![つくったやつ](https://i.gyazo.com/17456ab296c0ae2b9f3121c5be3e493c.gif)

## なかみ

メインロジックはこれだけ▼

*_interact*

```sh
#!/bin/bash

cmd=$*
while true ; do
  echo -ne "\033[34m[ $cmd ] >> \033[00m"
  read args
  line=$cmd" "$args
  $line
done
```

前に比べるとだいぶコード短くなった。
これを呼びたいわけだけど`rlwrap`しないとだねってことで↓を用意

*interact*

```sh
#!/bin/bash

rlwrap _interact "$*"
```

やったぜ。
基線ベースの干渉計観測データからアンテナベースの特性を求める

# はじめに
電波干渉計の観測データであるビジビリティから、素子アンテナ毎の特性（遅延, 位相, 利得）などを求める方法を考察します。電波干渉計の較正に必要な処理で、精度と処理速度の両方を追求します。

# 一般定式化と記号
##観測方程式
観測されたビジビリティ${\cal \hat{V}}_k$は、素子アンテナ毎の複素ゲイン$G$と真のビジビリティ${\cal V}(u,v) $との間に以下のような関係を持ちます。

```math
{\cal \hat{V}}_k \sim G_j G^*_i {\cal V}(u,v) \tag{2.1}
```

ここで$k$は基線番号, $i, j$はアンテナ番号, $u, v$は基線の空間周波数（それぞれ東西方向成分と南北方向成分）, $*$は複素共役を表します。以下で$k$を$i, j$との対応は[canonical ordering](http://qiita.com/kamenoseiji/items/ed6fd86641d088da9fff)に従うものとして一般性を失いません。記号$\sim$は、左辺の量は右辺の量に加えてランダム誤差を含むという意味で、計測で得られる左辺の量を用いて最小二乗法で右辺の値を解くことを意図しています。

ビジビリティ${\cal V}(u,v)$は、空間周波数$u, v$に依存しますが、時間$t$や観測周波数$\nu$によらず一定であるとします。時間変動する天体では要注意ですが、観測時間が変動のタイムスケールより十分短ければ問題ありません。周波数依存性はスペクトル線の観測では問題になりますが、周波数分解能を十分細かくした分光観測をすれば、分光チャネル内では周波数の依存性を持たないとしてよいでしょう。周波数依存性は帯域通過特性の較正のところで後述することにします。

もし天体が点源とみなせるコンパクトな天体であれば、ビジビリティは空間周波数によらず一定になります。点源でない場合でも、惑星のように天体の構造が既知であれば${\cal V}(u,v)$は既知とできます。電波干渉計の較正は、ビジビリティ${\cal V}(u,v)$が既知の天体を観測したときに得られるビジビリティ${\cal \hat{V}}_k$を観測方程式に当てはめて、素子アンテナのゲイン$G$を解く処理です。

素子アンテナのゲイン$G$は複素数で、振幅$|G|$および位相$\phi$を使って$G = |G| \exp(2\pi i \phi)$と表せます。

#具体的な解法
遅延・位相・振幅・複素ゲインについて個別にページを設けて、解法を議論します。

1. [遅延を解く](http://qiita.com/kamenoseiji/items/782031a0ce8bbc1dc99c)
1. [位相を解く](http://qiita.com/kamenoseiji/items/fbb05d41f8ace40d099c)
1. [振幅を解く](http://qiita.com/kamenoseiji/items/d085698f04a07209270c)
1. [複素ゲインを解く](http://qiita.com/kamenoseiji/items/e0621a6a26ceecbbaac2)
Swiftで日記アプリを作ろう 〜その2 Realm導入編〜

[前回の記事はこちら](http://qiita.com/ryoegu/items/1e5d1b8cadbf0061f6a7)

前回、カレンダーを表示させてみました。
今度は、日付ごとに日記を入力できるようにしてみましょう。

# iPhone上のメモリに値を保存しておくための2つの方法
一度アプリを閉じても値が保存される仕組みがiPhoneには用意されています。

## 1. UserDefaultsを利用する
iOS フレームワークには、UserDefaultsが用意されていて、簡単に値を保存したり読み込んだりすることができます。

- メリット：簡単に利用できる
- デメリット：keyが増えすぎると管理しづらい


## 2. CoreDataを利用する
CoreDataという仕組みがあり、大きな値になるとCoreDataを利用したほうが便利です。

- メリット：値の数が大きくなっても管理しやすい
- デメリット：初めて使用するには学習コストが高い

## 3. Realmを利用する
型の管理も簡単で、どの値が入っているかもGUIで確認することができる。（Realm Browser）

- メリット：フレームワークが用意されているので、複雑な処理はフレームワーク側で行う
- デメリット：CocoaPodsをつかって導入しなければならず、導入が大変。

# Realmを導入してみよう
というわけで、今回はRealmを導入してみましょう。
今回は、XcodeプラグインやCocoaPodsを利用してなるべくコードを書かずにRealmを導入してみます。

## (STEP.1) Xcodeプラグイン Alcatrazの導入
[【Xcode 8対応版】Xcodeプラグイン Alcatrazを導入しよう](http://qiita.com/ryoegu/items/e181a7942e4135958a99)に詳しくまとまっていますので、このページを参考にしながらAlcatrazを導入してください。

## (STEP.2) Package ManagerからRealmPluginを導入
Window→Package Managerを起動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/30b87e69-83ec-0b19-c571-c5d844e8fd5d.png)

package Managerが表示されない場合は、Xcodeを再起動してみてください。

Package Managerからインストールするプラグインは**RealmPlugin**です。

Package Managerの検索窓で「Realm」と検索すれば出てきますので、インストールしておきましょう。
右側の「INSTALL」ボタンをクリックするとインストールがはじまります。

![image](https://qiita-image-store.s3.amazonaws.com/0/44105/031fdf21-c2e9-6f2d-71d1-5989f05a6bfa.png)

※Realm Browserというプラグインが便利だったのですが、現在はダウンロードはできるものの使用できなくなっているようです。

## (STEP.3) CocoaPodsをつかってRealmを導入
Podfileを編集して`RealmSwift`を導入します。

```ruby:Podfile
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'DiarySampler' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  pod 'JBDatePicker'

  #=== この行を追加 ===
  pod 'RealmSwift'
  #==================

  # Pods for DiarySampler

  target 'DiarySamplerTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'DiarySamplerUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

Podfileを保存したら忘れずに

```ruby:Terminal
pod install
```

も行っておきましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/ae639160-0ff0-ef3f-1968-e1ae22069743.png)

## (STEP.4)Xcodeを開き、Command+Bでビルド
ここでXcodeを開き、ビルドエラーが出ないかどうか再度確認しておきましょう。

Xcodeを開いたとき、以下のような画面が出た場合は「常に許可」を選択して進めます。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/c82b9efa-a70c-f2c2-8b43-feda75d62eb4.png)


## (STEP.5) 【追記】AlcatrazをXcode 8に導入すると動作が重くなる（場合がある）
STEP.1 で導入したAlcatrazですが、Xcode 8に導入すると動作が重くなりすぐ固まる場合があります。筆者のMacbook Pro 13インチ Retinaディスプレイモデル (Late 2016)では、すぐに固まりました。
今回はRealm Pluginを導入するためだけに使ったので、不要な場合は「Alcatraz」と「update_xcode_plugins」を削除しておきましょう。

```ruby:terminal
rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin
rm -rf ~/Library/Application\ Support/Alcatraz

update_xcode_plugins --restore
```

# 次回へ続く
次回は[Realm活用編](http://qiita.com/ryoegu/items/2249555be43dc7ed617a)！
SpringBootで開発中にパッケージ変更する場合の注意点（@ComponentScan）

## 趣旨
* [@ComponentScan](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html)を理解していなくて自分がハマった箇所のメモ。
    * ベースパッケージから変更/追加する際に注意すること。
        * プロトタイプ作成時に多く起こるのかな。
* 結論としては、@ComponentScan を定義したクラスと並列もしくは、上位にあるクラスはスキャンしないという話。

## 環境
* OS
    * Windows10 home (64bit)
* Spring Boot
    * 1.4.3
* Java
    * 1.8.0_111-b14

## 事象
### 例
* ベースパッケージ（規定となるパッケージ）
    * com.sample.product
* この下に、apiやdomain、serviceといったパッケージを作成し開発を行っていた。
* Applicationクラス（@ComponentScanもしくは、@SpringBootApplicationを定義したクラス）は、com.sample.productname直下に配置されている。
 
``` com.sample.product
com.sample.product
        ├─api
        ├─commons
        ├─dao
        ├─domain
        ├─service
        └ Application.java
```

* commonsパッケージに格納されているクラスは、将来的に他のproductでも利用中できる（プロジェクト自体も別管理）できるように、パッケージをproductから切り離すようにリファクタリングを行う。

``` com.sample
com.sample
  ├─commons
  └─product
        ├─api
        ├─dao
        ├─domain
        ├─service
        └ Application.java
```

* *__この時に、Application.javaは「com.sample.product」をベースパッケージとして動作するため、「com.sample.commons」配下のクラスを スキャン対象としない！！！__*
* これを理解していないと、クラスを発見できずにエラーとなる。
* ここで3時間はまりました。。。

### 対応方法
* クラスを移動（リファクタリング）する。

``` com.sample
com.sample
  ├─commons
  ├─product
  |     ├─api
  |     ├─dao
  |     ├─domain
  |     └─service
  └ Application.java
```

* @ComponentScanにスキャン対象のベースパッケージを設定する。
    * 例では@SpringBootApplicationを利用しています。

``` Application.java（修正前）
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

* 移動と同義

``` Application.java（修正後１）
@SpringBootApplication(scanBasePackages={"com.sample"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

* 対象のパッケージを追加する。

``` Application.java（修正後２）
@SpringBootApplication(scanBasePackages={"com.sample.commons", "com.sample.product"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

* クラスごと移動するのが楽だと思う。
* それで対応できない場合は、パッケージをする。
FlywayをSpringBootでお試ししてみた

# はじめに

JavaのDBマイグレーションとして有名なFlywayなのですが、触ったことなかった為正月休みを利用して導入してみました。
動作するまでに３時間と見積もっていましたが、実際は１５分ぐらいで終わりました。

# ひとまずのやりたいこと洗い出し

1. 自作アプリへのFlyway導入(Gradle使用)
1. Flywayを利用した初心者DBマイグレーション
1. まとめ(Qiita記事作成)

# Flyway導入

## SpringBoot + Gradleで動作しているWebApplicationへ導入してみる。

導入までに必要な手順は以下のみ、、、簡単！

1. build.gradleに必要事項を記入する
2. CretateTable文以下のSQLファイルを配置する。
3. Springbootを起動(IntelliJ IDEAから起動)

### build.gradleに必要事項を記入する。

```groovy:build.gradle
ext {
	// Flyway
	flywayVersion = "4.1.2" // 2017,0315最新
}
dependencies {
	// Flyway
	compile ("org.flywaydb:flyway-core:$flywayVersion")
}

plugins {
    id "org.flywaydb.flyway" version "4.1.2" // 2017,0315最新
}

flyway {
    user = '' // DBのユーザー名
    url = ''// DBのURL
}
```

### SQLファイルの配置

次にCretateTable文等のSQLファイルを以下に配備

・src/main/resources/db/migration/

配備するファイルのファイル名には命名規則があります。
また、CreateDatabase等は書けない模様
* そもそもDatabaseURLにDatabaseまで指定していたらそりゃできない

```sql:V1.0__Initial_Setup.sql
CREATE TABLE IF NOT EXISTS ANSWER_INFO_TBL (
  NO BIGINT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  TYPE TINYINT(1) NOT NULL,
  ANSWERKEY VARCHAR(81) UNIQUE NOT NULL,
  KEYHASH VARCHAR(64) UNIQUE NOT NULL ,
  CREATE_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=INNODB DEFAULT CHARSET=UTF8;

CREATE TABLE IF NOT EXISTS SCORE_INFO_TBL (
  NO BIGINT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  SCORE MEDIUMINT(7) UNSIGNED DEFAULT 0 NOT NULL,
  NAME VARCHAR(64) DEFAULT '' NOT NULL,
  MEMO VARCHAR(64) DEFAULT '' NOT NULL,
  UPDATE_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (NO)
          REFERENCES ANSWER_INFO_TBL(NO)
          ON DELETE CASCADE
) ENGINE=INNODB DEFAULT CHARSET=UTF8;

ALTER TABLE ANSWER_INFO_TBL ADD INDEX INDEX_ANSWERKEY(ANSWERKEY ASC);
ALTER TABLE ANSWER_INFO_TBL ADD INDEX INDEX_KEYHASH(KEYHASH ASC);
```

### Springbootを起動

IntelliJ IDEAからアプリを立ち上げる際に、自動でDBマイグレーションが行われる。
* 起動する前に既存のテーブルを__Drop__しないと動作したかよくわかりませんので、動作前に__Drop__しておく。

## Flywayを使ってなんとなく便利化する。

アプリを作っている最中ゴミデータを作成してしまったり、DBをリセットしたくなったりします。
ただし、綺麗なデータは残しておきたい、、、
→問題ない既存レコードを抽出して、DBリセット後自動でインサートさせる
→→Flywayにやらせる！

1. 既存レコードはMysqlWorkbenchにて取得(Export Resultsにてinsert文の形式でsqlファイルとして取得できる)
2. src/main/resources/db/migration/配下にインサート文のsqlファイルを配備

テーブルdrop後に上記条件でSpringbootを起動すると、テーブル作成とレコード作成を自動化してくれる。
sqlファイルもバージョン管理をしっかりしていれば環境構築のハードルが下がりそう！

## まとめ

すんなりと導入できてしまったので、今まで導入を躊躇していた自分の背中を押してあげたい気分です。
DBのリセットはしょっちゅうしていますので、sqlファイルの管理も怠らないように心がけます。
また、導入のみで未だ見ぬ便利機能が存在するかと思いますので機能発見次第追記していこうと思います。
また、__Flyway__の記事タグがあるみたいなのでフォローして見てもいいかと思います。

# おまけ

JPAのEntityにて、Date型からLocalDate型に変更した際、
以下のようなテクニックを使用しないといけないようです

```Java:WebApp.java
@SpringBootApplication
@Import(Domain.class)
@EntityScan(basePackageClasses = {WebApp.class, Jsr310JpaConverters.class})
@EnableScheduling
public class WebApp extends SpringBootServletInitializer {
	public static void main(String[] args) {
		new SpringApplicationBuilder(WebApp.class)
						.profiles("dev")
						.run(args);
	}
}
```

ミソなのは__Jsr310JpaConverters.class__をEntityScanの対象としていることです。
Python 2.7 Countdown

http://pythonclock.org

[PEP 373 -- Python 2.7 Release Schedule](https://www.python.org/dev/peps/pep-0373/)

> Being the last of the 2.x series, 2.7 will have an extended period of maintenance. The current plan is to support it for at least 10 years from the initial 2.7 release. This means there will be bugfix releases until 2020.

[PEP 404 -- Python 2.8 Un-release Schedule](https://www.python.org/dev/peps/pep-0404/)

> Rule number six: there is no official Python 2.8 release. There never will be an official Python 2.8 release. It is an ex-release. Python 2.7 is the end of the Python 2 line of development.
Raspberry Pi3 on Ubuntu Mate 16.04 で Amazon Dash を ただのIoTボタンとして使う

# Overview

ちまたで大流行のAmazon Dashボタンを、ただのボタンとして使う、を、Raspberry Pi3 on Ubuntu Mate 16.04 LTS上で行う、です。

おなじみのdash-buttonを使いますが、jsをいじらずに、mac addressや何をするかを記述できるように[nodejsを書いておきました](https://github.com/hidenorly/DashBtnLauncher)ので、自己責任で、お使いください^^; (Apache-2.0にしてあります)

# nodejsの更新

Ubuntuのnodejsは古いので更新が必要です。

```
$ sudo apt-get install -y nodejs npm
$ sudo npm cache clean
$ sudo npm install n -g
$ sudo n stable
$ sudo ln -sf /usr/local/bin/node /usr/bin/node
```

optionalですが、、、
```
$ sudo apt-get purge -y nodejs npm
```
して、nodejsと打たないと動かない(普通はnodeだけ)古いのは消してしまっても良いかも。


# dash-buttonのinstall

https://www.npmjs.com/package/dash-button
の通りです。

(source codeは、 https://github.com/ide/dash-button で公開されていますね)

```
$ mkdir ~/work/dash
$ cd ~/work/dash
$ npm init
$ sudo apt-get install libpcap-dev
$ npm install --save dash-button
```

特に、libpcap-devは、raspberry pi + ubuntu mateでは、必須のようです。
(私は、これでちょっとハマりました。)
(そうしないと、```556 error Failed at the pcap@2.0.0 install script 'node-gyp rebuild'.```と出て止まってしまいます。

# setup

```package.json

{
  "scripts": {
    "scan": "dash-button scan"
  }
}
```

上のように編集します。

```
$ sudo npm run scan
```

を実行して、その間に、Amazon Dash Buttonをsetupします。

 *！注意！* 　商品の選択をしてはいけません *！注意！* 

Amazon Dash Buttonのアプリを使ったsetupのシーケンスは、[tokio-takadaさんの記事](http://qiita.com/tokio-takeda/items/02bae474f8f20f35a02c) が詳しいです。

なお、
```
$ sudo npm run scan -- --interface en1
```
のようにして、en1 or wlan0のようにinterfaceを直接指定することができるそうです。


# dash buttonが押されたときに、外部コマンドを実行するscriptを作る

https://github.com/hidenorly/DashBtnLauncher
におきました。

```
$ git clone https://github.com/hidenorly/DashBtnLauncher.git
$ cd DashBtnLauncher
$ sudo npm install dash-button
```

して、途中までsetupしたAmazon Dash Buttonがあれば、

```
$ sudo node DashBtnLauncher.js -b XX:XX:XX:XX:XX:XX -e echo hoge
```

みたいにすると、mac addressを指定でき、また、任意のコマンドを指定できます。

というわけで、dash-buttonのtutorialにありがちなjsをいじって、、、とかは不要です。

Happy hacking!

# 追記

```apt-get dist-upgrade``` したら、hci0がdownのままになってしまいました。
とりあえず、workaroundで、

```/etc/rc.local
+hciconfig hci0 up
```

しています。。。
opencv_contrib のコードをWindows 7 Visual Studio 2013でビルドする

OpenCV3.2でopencv_contribをビルドした作業のメモ書き
動作環境 Windows7
使用したコンパイラ:Visual Studio Community 2013
CMake　3.2.1 を利用

**ExamplesとTutorialsの追加のビルドの仕方(Windowsの場合)**
OpenCVのビルドのしかたによっては、samplesのコードがビルドされていない場合もあるだろう。
その場合には次のようにしてCMakeLists.txtを利用してビルドできる
1. CMakeのGUI版で[Where is the source code:]に次のCMakeLists.txt のあるディレクトリを指定する。
opencv/sources/samples/CMakeLists.txt
をCMake使ってVisual　Studio　用の*.sln ファイル *.vcxprjファイルを生成する。
2. samples.sln をダブルクリックしてVisual Studioで開きます。
[build][build solution]で ビルドするとDebug もしくは Release のディレクトリに、cpp-example-とかcpp-tutorial-とか前についたファイル名で生成されます。
cpp-example-3calibration.exe
cpp-tutorial-AddingImages.exe
3. コマンドラインで実行します。
実行したときにDLLが見つからないというエラーを生じるときには、環境変数PATHにビルドしたバージョンのOpenCVのDLLのあるディレクトリを追加しておきます。
 そのサンプルプログラムの使い方が分からないときは、元のソースコードを読む。
 

**contribのコードをビルドする方法（Windows)**
 [opencv_contrib](https://github.com/opencv/opencv_contrib) のビルド方法は、Linuxについてはよく書かれている。WindowsでVisual Studioでビルドする方法については、以下の記事を見つけました。それを元に、自分のPCでの設定に合わせて、cmake -G "Visual Studio 12" を使うことで、opencv_contribのモジュールをビルドすることができました。（opencv_aruco320.dllが生成されているので、モジュールのビルドは成功している。)
sampleのコードをビルドするにはcmakeのコマンドライン引数に次のoptionを追加する。
-D BUILD_SAMPLES=ON


[OpenCV 3.0 を opencv_contrib を有効にして VS 2013 用にコンパイルする](http://nixeneko.hatenablog.com/entry/2015/09/25/082656)
cmake -G "Visual Studio 12" 
cmake -G "Visual Studio 12 Win64"　64bit版のコンパイラを用いている場合

```
cmake -G "Visual Studio 12" -D CMAKE_BUILD_TYPE=Release -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.0.0/modules ..
```

このようにしてビルドした後は、
例：
(opencv)/build/lib/Debug
(opencv)/build/lib/Release
に生成されたlibファイルが追加になります

DLLが生成されたディレクトリは環境変数PATHに追加します
例：
(opencv)/build/bin/Debug
(opencv)/build/bin/Release


opencv_contrib のアルファベット順の最初にあるArUcoには、こういった具合にドキュメントが書かれている。
[Tutorials for contrib modules](http://docs.opencv.org/3.2.0/d3/d81/tutorial_contrib_root.html)

[ArUco marker detection (aruco module)](http://docs.opencv.org/3.2.0/d9/d6d/tutorial_table_of_content_aruco.html)

[Detection of ArUco Markers](http://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html)



OpenCVのビルドは、CMakeで指定するオプションの範囲によって難易度が極端に変わります。
以下の記事は、自分がやろうとしていることの難易度を知ることができます。
qiita [OpenCV完全体コンパイル難易度ランキング](http://qiita.com/fukushima1981/items/fae7d40123bfdf426624)

参考情報
[Visual Studio 2013/2015によるOpenCV3.1のコンパイル](http://qiita.com/fukushima1981/items/961918db7835160cdde5#_reference-7aa9aa8a55c08ac2d9d8)
DB2 Client on Docker

DB2 初心者の私の、自分用おぼえがき小ネタ。
どなたかの二番煎じでないことを祈る。

（二番煎じだった場合、「おれ、docker で db2 client 動かす話を re:invent したぜ」とドヤ顔しておきます）

# 対象者
* 対向システムが DB2 で、自分 DB2 しらないんすけど繫げて select したりする必要がある。
* client インストールめんどっちい。
* "db2 client docker" とかググってもイマイチ。
* 「なんでもいいから db2 クライアントの docker イメージくれよ」

# 回答
* IBM 公式 [DB2 Express-C Docker イメージ](https://hub.docker.com/r/ibmcom/db2express-c/)　にクライアント入ってるので、これを使いましょう。

「リンク先見てね」で終了なのですが、それすら面倒な私のような人のために以下コピペ。

```
$ docker run -it -p 50000:50000 \
-e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept \
ibmcom/db2express-c:latest bash
```

DB2INST1_PASSWORD に db2inst1 ユーザのパスワードを設定すること。
"password" とかダメなパスワードだと怒られるので、ここだけはマジメに。

これで root ユーザの bash が動くので db2inst1 に su すれば db2 クライアントが使える。

```
$ su - db2inst1
```

あとは node とか database 登録してご自由に。

なんかスクリプトとか持っていきたいときは `/share` にマウントポイント用意してくれているそうなので

```
$ docker run -it -p 50000:50000 \
-e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept \
-v $(pwd):/share \
ibmcom/db2express-c:latest bash
```

これでよし。

ちなみにできるだけ着色せずに公式そのままを転記しましたが、サーバ立てるわけではないので `-p 50000:50000` は不要。
よって以下でよい。

```
$ docker run -it \
-e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept \
-v $(pwd):/share \
ibmcom/db2express-c:latest bash
```
Unity2D ～Scene遷移～

#Scene作成
今回は(Scene名)MainMenuからGameへ移動します。

File>New Scene
で新しいシーンが表示されます

Ctrl+Sで名前保存
Assetに追加されます


![ryhs.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/5976dc1d-e71a-d01e-0d76-5ea9e3ca44db.png)

開発上でのScene変更はAssetからダブルクリックで変わります。

#シーンを使えるように
File>BuildSetting
Add Open Scenesで自分のカレントシーンが追加されるので、Scene移動して登録していきましょう。
↓こんな感じで
![fhsrh.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/df90e8ae-fbcc-9d58-3a34-59248f7a6cb2.png)

↓さらにこう！
![gaaregergs.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/47e08c3e-3d20-18b3-5707-0885e3d37c4f.png)

これをしとかないとプロジェクトに反映されないぞ！

#Scene遷移スクリプト作成
C#スクリプト作成します。
名前は適当にGameControllerで

```csharp
//追加
using UnityEngine.SceneManagement; 

    public void toGameScene()
    {
        SceneManager.LoadScene("Game");
    }

```
こんな感じ

カッコの中にScene名入れたらおｋ！

あとはtoGameScene()を呼び出したらGameシーンへ移動します。


#(例)ボタン押して移動
さっき作ったスクリプトを適当なオブジェクトにつけます。
今回はCreate>Empty
名前を変えてGameControllerに
そしてスクリプト追加

↓こんなん
![eghs.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/907c7c76-65f2-e3bb-03c9-a888dc9cc4b0.png)

で

ボタン作ってー
On Clickにオブジェクト追加してー
No Functionを押してGameController>toGameSceneを選択して終わり！

![ywyg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/382c03ac-9f5f-3e1e-0142-21dcec5d556e.png)


あとはデバック開始、ボタンを押したらScene移動しますね！
Yコンビネータについて考えてみる

## Yコンビネータてなに

不動点コンビネータの一つです。

## 不動点コンビネータ？
関数に不動点が存在するとします。
その時不動点座標xにおいて関数fにたいして

```math
f(x) = x 
```

が成り立つといいます。
これを少し拡張して、引数を数値ではなく関数にして関数にたいして成り立つようなとき、関数gが不動点コンビネータなら

```math
f(g(f)) = g(f) 
```

が成り立つといいます。なんとなくわかったような気がします。つまり自分自身に対してコンビネータが入力値をそのまま出力していくので、評価していけば無限に実行できそうですよね。

## 何がいいの
不動点コンビネータが再帰関数としての特性をもつということです。実際に再帰的な処理を意識しなくても
条件を満たす関数を不動点コンビネータに投げ込むことで再帰処理をつくることができます。

この不動点コンビネータが再帰関数としての性質を持つことを簡単に証明してみましょう(Wikipedia参照)
ある関数a(x)が存在して、それが再帰関数ならば、定義のなかに自分自身が含まれるはずです。すなわち、

```math
a(x) = U(a,x)
```

のような定義になるはずですよね。ここでUを**カリー化**した関数Vを定義してみましょう

>カリー化とは、関数の引数を一つに減らすこと

```math

V(f)(x) = U(f,x)
```

とします。ここで、もし関数gが存在して、この関数Vに対して不動点コンビネータとして成り立つようなら

```math

V(g(V)) = g(V)
```
が成り立つはずなので、またg(V)もxの関数だから

```math
g(V)(x) = V(g(V))(x) = U(g(V),x)
```
今、さきほどのaの式と上の式を比較すると

```math
a=g(V)
```

の関係があるとわかります。したがって、この不動点コンビネータは再帰関数の特徴をもっていることがわかりますね。
RaspberryPiの人感センサーからSlack投稿

# はじめに
数年前から家庭内で運用している[RaspberryPi人感センサー](http://qiita.com/inaBowBow/items/8c565f42f307f1435f8d)について、かなり重宝していて
今やこれが無い生活は想像し難くなっている

特に不満なく運用していたが、最近Slackに興味が出てきたので、なんとか絡ませようと思索し
家庭内Slackを作ってRaspberryPiからのセンサー通知を投稿しようと考えた

# 環境
・RaspberryPi 3
　（[前回記事](http://qiita.com/inaBowBow/items/8c565f42f307f1435f8d)のセンサーが正常起動する環境が前提)

# Slack準備
1. チャンネル準備  
・適当なチャンネルを作成する
2. IncomingWebHooksインストール  
・Apps&Integrationsから"Incoming WebHooks"をインストール  
・IncomingWebHooksに対象チャンネルの設定(1.で準備したチャンネルを指定)  
・WebHookURL取得(センサー側で使用するのでメモっておく)

# センサー側スクリプト
前回作成したPythonスクリプトにSlack通知メソッドを１行加えるだけにしたかったので
以下クラスを作成して元から呼び出すようにした

```python:post.py
import requests
import json

def slackPost():
  url = 'https://hooks.slack.com/services/**************************'
  payload = {'channel':'#投稿チャンネル名','username':'投稿ユーザ名','text':'投稿内容'}
  response = requests.post(url,data=json.dumps(payload))
```
※1. requestsは事前にpip installしておく
※2. urlはSlack準備のIncomingWebHook設定で取得したWebHookURLをコピペ

あとは、呼び出し元スクリプトの適当なところに"post.slackPost()"を書けば完了

# 所感
検索したら関連情報が豊富であったため、思っていたより簡単にできたし作業量も少なかった
（ゆえにQiitaに投稿する意味もさほどない）
あと、今までは事前に準備したPCにしか通知できなかったが、Slackが使える端末であれば
スマホやタブレット、Macなどなんでも即時通知できてすごくいい
タイムラグも心配していたが全然気にならない
Slackすごい
（仕事でSlackが使えずmattermostを使っているため、情報量の違いを感じ少し悲しかった)
Unity2D ～Canvas設定のあれそれ～

#Canvasをcameraに合わせる
なんかCanvas作成したときにめっちゃでかくなるときありますよね
わかりやすくMainCameraと同じサイズにしましょう


Canvas作ってRenderModeをCameraにしてRenderCameranにMainCameraを設定します
↓こんな感じ
![gadsag.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/0d69bcd1-2972-56d2-5412-9575cca7b853.png)


#スマホ用に画面の解像度を可変に
解像度が違ったらCanvas内の文字サイズとかが想定と変わってきます。
多分一回やらかしたらわかると思います

CanvasのUIScaleModeを変更
Matchを縦持ちなら1 横持ちなら0にすると良さげ
↓こんな感じで
![gshsh.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/c38663fd-78ad-a1d0-6ee9-bee057bd0e2c.png)
AndroidでRatingBarを表示する


```xml:activity_main.xml
    <RatingBar
        android:id="@+id/rating"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:numStars="6"
        android:rating="4"
        android:stepSize="0.5"
        />
```


```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RatingBar rate = (RatingBar) findViewById(R.id.rating);
        rate.setOnRatingBarChangeListener(
            new RatingBar.OnRatingBarChangeListener(){
                public void onRatingChanged(
                        RatingBar ratingBar,
                        float rating,
                        boolean fromUser){
                    Toast.makeText(
                            MainActivity.this,
                            String.format("現在の評価は%f", rating),
                            Toast.LENGTH_SHORT).show();
                }
            }
        );
    }
    
}
```

![スクリーンショット 2017-01-02 22.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/39073/8fd92d57-dc3b-c8b4-1e6c-d6d9e87b3e2c.png "スクリーンショット 2017-01-02 22.10.33.png")
【Xcode 8対応版】Xcodeプラグイン Alcatrazを導入しよう

Xcode 8以降を使っている場合、Xcodeプラグイン「Alcatraz」のインストールが少し面倒になりました。
手順を追って説明します。

# 環境
- macOS Sierra 10.12.2
- Xcode 8.2.1

# Alcatrazを導入
[公式ページ](http://alcatraz.io/)に記載があるように、ターミナルを開き以下のコマンドを打ってAlcatrazを導入します。

```ruby:Terminal
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
```

通常ならばここでWindow→Package Manager... でパッケージマネージャが出るはずですが、Xcode 8以降の場合は出ません。

# update_xcode_plugins をインストール
そこで、[update_xcode_plugins](https://github.com/inket/update_xcode_plugins)を使います。
ターミナルで、

```
sudo gem install update_xcode_plugins
```

と入力。sudoをつけているのでパスワードが聞かれますので、パスワードも入力。（パスワードは表示されませんが入力されています。）

![image](https://qiita-image-store.s3.amazonaws.com/0/44105/9296e9ad-b6d1-fbfd-499f-e6e76f66fb92.png)

# update_xcode_plugins を実行
**Xcode 8以上を使っている場合は、この作業が必要です。**
ターミナルで、

```
update_xcode_plugins --unsign
```

を実行します。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/bbea3fa8-7085-c6f8-0a7a-acf737a3a60a.png)

途中で、インストールされているXcodeのバージョンを聞かれるので、最新版を選択してEnterをクリック。
最後に、`Finish!`と表示されれば完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/61a363a8-7cfe-d026-f43c-4faeaf646ebf.png)


# Xcodeを起動
通常通りXcodeを起動してみましょう。

<img width="532" alt="スクリーンショット 2017-01-02 21.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/44105/c629bee4-fd54-78d2-0caa-6920775c2768.png">

起動時に、Alcatrazをロードしますかと確認されるので、こちらは「Load Bundle」をクリックします。

無事にWindow→Package Managerが表示され、Package Managerウィンドウが表示されれば完了です！

![image](https://qiita-image-store.s3.amazonaws.com/0/44105/45803af7-9cb1-b6c9-a97b-d82cf05a09e2.png)


Package Manager画面
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/9b649525-0a17-5fd7-b737-eeae4da7094c.png)
AndroidでSpinner(listbox)を出す（動的に値を生成）



```xml:activity_main.xml
    <Spinner
        android:id="@+id/spn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
```


```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createSpinner();
    }

    private void createSpinner(){
        ArrayList<String> list = new ArrayList<>();
        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd", Locale.JAPAN);
        Calendar cal = Calendar.getInstance();

        for (int i = 0; i < 11; i++){
            cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) + 1);
            list.add(format.format(cal.getTime()));
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<>(
                this, android.R.layout.simple_spinner_dropdown_item, list
        );

        Spinner spn = (Spinner) findViewById(R.id.spn);
        spn.setAdapter(adapter);
    }
}
```
AndroidでSpinner(listbox)を出す（固定値）


android:spinnerModeは"dialog"か"dropdown"のどちらかを選べる

```xml:activity_main.xml
    <Spinner
        android:id="@+id/spn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/spn_items"
        android:prompt="@string/spn_prompt"
        android:spinnerMode="dialog"
        />
```

```xml:strings.xml
<resources>
    <string name="app_name">MyTest2</string>
    <string name="spn_prompt">MOSを選択して下さい</string>
    <string-array name="spn_items">
        <item>Windows</item>
        <item>Linux</item>
        <item>Mac</item>
    </string-array>
</resources>
```

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Spinner sp = (Spinner)findViewById(R.id.spn);
        sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id){
                Spinner sp = (Spinner) parent;
                Toast.makeText(MainActivity.this,
                        String.format("選択項目: %s", sp.getSelectedItem()),
                        Toast.LENGTH_SHORT).show();
            }

            public void onNothingSelected(AdapterView<?> parent){

            }
        });
    }
}
```
宇宙大航海時代のためのCDN選び

# 宇宙大航海時代のためのCDN選び

こんにちは。NASAのプロジェクトで月面勤務のジャバオペレータのジャバ（仮名）といいます。今日は、ついにやってきた宇宙大航海時代のためのコンテンツ・デリバリー・ネットワーク (CDN)の選び方を、原理を含めて説明していきます。

## CDNと宇宙大航海時代

CDNは、リソースを配布する際に、宇宙で地理的に分散して配置されたエッジと呼ばれるサーバーにリソースをキャッシュすることで、ユーザのそばのエッジからコンテンツを配信できるようになり、ユーザの待ち時間が短くなるシステムです。宇宙大航海時代より前では、地球の大陸やいくつかの島にサーバを配置していたにすぎなかったようです。地球は比較的小さい惑星ですので、往復遅延時間(RTT)は一番遠いところでも500 msを越えないくらいです。この状況では、CDNが存在しない場合でも、確かにちょっと待たされるものの、リソースが使えないといった状況にはなりませんでした。

宇宙大航海時代の到来とともに、この状況は大きく変わりました。地球の外で一番近いコロニーは月面コロニーですが、地球のオービティング・ルーターから30万 km の距離があります。これは、RTTでいうと2 秒を越えてしまう距離です。

RTTが長い弊害は何でしょうか。TCP通信では、コネクションを確立する際に3-way handshakeという方式がとられており、これはパケットの往復を待ってしまうのです。また、近年の外宇宙からの敵対的な勢力への対抗策として、暗号化通信が用いられるようになっています。SSL (TLS)の通信でもハンドシェイクが必要なため、結論として暗号化された接続が確立するまでRTTの数倍待たされるのが普通です。証明書の失効を確認するOCSPの通信がこの後にさらに行われるため、現在では必須ともなった暗号化通信を惑星間で行うことが非現実的になりつつあることがご理解頂けたでしょうか。

## 地球外でのインターネットルーティングの現状

現在、地球外のインターネットは、物理的には多数の中継衛星を介して行われています。中継衛星には古典的なルータが搭載されており、後の仕組みはインターネットが地を這っていた時代と大きく変わりません。つまり、ネットワークにAS番号が割り当てられ、BGPで経路制御を行っています。唯一変化したのは、AS番号が拡張され階層化された点ですが、これは本稿の内容から逸れるため、後日別な記事で説明したいと思います。

## CDNの課題

現在、CDNの2大巨頭はAkamaiとGooglezonです。Googlezonはご存知の通り、GoogleとAmazonが合併してできた会社で、今の段階ではCDNについては旧AmazonのCloudFront系のサービスとなっています。Akamaiは料金体系が謎で、営業の人間と話をしないと価格さえ分からないのが特徴で、一方のGooglezonは、有名な話ですが、もはや社員に人間は存在しないので、完全に一物一価の従量課金、情け容赦なしの請求書を発行してきます。どちらが適しているかはビジネス上・あるいは単に好みの問題かもしれません。どちらも、宇宙時代に対応したサービスを提供しています。

仕組みとしては両方とも共通で、先述した中継衛星のコロケーションスペースにキャッシュサーバーを置いています。ですので、ユーザーがリクエストを出した惑星の最寄りの中継衛星からリクエストが返される仕組みです。

地上だけの時代には、Pull形と呼ばれる形態のCDNが一般的でした。これは、ユーザからのリクエストが来た後、キャッシュに要求されたコンテンツが存在しなければ、オリジンにリクエストを投げて取得する、という形態を指した言葉です。しかし、宇宙時代ではこの形態には無理がありました。ユーザがスマートフォンでゲームを起動したら、新しいデータがあります、といわれ、そこから10 分以上待たされてからダウンロードが開始、という体験を望んでいなかった、ということです（どうしても光速の壁は厚いわけです）。そこで、現在では、Push形とPredict形の組み合わせでコンテンツをキャッシュするようになっています。

Push形は、オリジンでコンテンツの更新があると、各エッジに自動的にコンテンツを配信する形態です。これであれば、事実上ユーザがoriginまでのfull RTTを何回も待たされるということはなくなるわけです。ただし、この方式では、キャッシュに使われないデータが大量に入ってしまうという非効率な部分があります。そこで、現在はPredict形の技術を組み合わせるのが一般的になりました。

## Predict形CDN

Predict形の技術を一言で言ってしまうと、全宇宙の数時間後のステートをシミュレーションし、その時間に発生する確率の高いリクエストに答えるためのコンテンツを、必要なエッジに事前にPushする、という方式です。この技術が実用になったのは、量子計算機をプログラムすることができる技術の発達によるものです。記録によると量子計算機のアイデアは20世紀からあったようですが、これを人月計算のプロジェクトに組み込めるレベルにしたのは宇宙時代の少し前の話でした。

## 結論

選ぶも何も、宇宙で使えるCDNはAkamaiとGooglezonしかないので、好きな方を選べば良いのではないでしょうか。使っている技術はほとんど同じです。個人的には、Googlezonの方が好みではあります。
AndroidでSeeKBarを出す


```xml:activity_main.xml
    <SeekBar
        android:id="@+id/seek"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="300"
        android:progress="150"
        />
```

```java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SeekBar seek = (SeekBar)findViewById(R.id.seek);
        seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
            public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser){
                Toast.makeText(MainActivity.this,
                        String.format("現在地:%d", progress),
                        Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }
}

```

| メソッド| 実行されるタイミング |
|:-----------|:------------|
| onProgressChanged   |つまみを動かしている間|
| onStartTrackingTouch |つまみをタッチした時 |
| onStopTrackingTouch |つまみを離した時 |

![スクリーンショット 2017-01-02 20.50.21.png](https://qiita-image-store.s3.amazonaws.com/0/39073/35c459f7-f1e1-153d-5347-9be85d428872.png "スクリーンショット 2017-01-02 20.50.21.png")
ページ内リンクをスムーズに動くようにする(jQuery)

http://klutche.org/archives/536/

こんな感じ！

```
<script type="text/javascript">
$(function(){
	$('a[href^=#]').click(function(){
		var speed = 500;
		var href= $(this).attr("href");
		var target = $(href == "#" || href == "" ? 'html' : href);
		var position = target.offset().top;
		$("html, body").animate({scrollTop:position}, speed, "swing");
		return false;
	});
});
</script>
```
Android OS compile

# Overview

## 参考にしたURL
 - http://note.chiebukuro.yahoo.co.jp/detail/n185974
 - http://iishikawa.s371.xrea.com/note/android-compile
 - http://note.chiebukuro.yahoo.co.jp/detail/n185974

## repo
 - http://commondatastorage.googleapis.com/git-repo-downloads/repo

## manifest
 - https://android.googlesource.com/platform/manifest/


# 気になったリンク
 - http://mixi-inc.github.io/AndroidTraining/introductions/1.05.how-to-build-for-gradle.html
 - a
 -
TensorFlow Saverで保存する世代数を指定する方法 (元旦の悲劇)

## 経緯
2016年から2017年にかけて、年末年始の**長期**休暇が元旦のみとなってしまったフリーエンジニアの私。普通ならそんな職場は**ブラック**と呼ばれるのでしょうが、そこを笑顔でクリアしなければならないのがフリーランスの悲しいところ。

大晦日の夕方、TensorFlowを用いて開発したアプリケーション起動し、年越しDeepLearningを開始。学習の成果はTensorBoard用のログファイルとtf.train.SaverによるCheckpointファイルを使用して年明けに確認することにしました。

年が明けて2017年1月2日、人の気配が全くしないゴーストタウンになったかのような東京都心部のオフィスで仕事始めとなりましたが...

**Checkpointファイルが無い!!**
否、予定通りのディレクトリに保存されていますが予定よりも大幅に少ない!!

はい、その通りです。
ディフォルトではCheckpointファイルは5世代のみ保存されることを失念しておりました...

2017年は残念な仕事始めとなりました。

尚、悲劇(失態)が起こったのがたまたま元旦であっただけで、元旦特有の事象ではありません。

## TensorFlowのSave機能で保存する世代数を指定する方法

TensorFlowで学習済みモデルを保存する場合は下記のような実装になります。

```python:実装例1
saver = tf.train.Saver()

if step % 1000 == 0:
    saver.save(sess, 'my-model', global_step=step)
```
global_stepパラメータを指定することでCheckpointファイルに-xxxxのようなSuffixが付加され、上書きを防止するカラクリになっています。

```console:Checkpointファイルの出力例
[u01@tf0101 save]# ls -l
合計 5884
-rw-r--r-- 1 u01 u01 1200272  1月  2 20:01 my-model-1000.ckpt.data-00000-of-00001
-rw-r--r-- 1 u01 u01     280  1月  2 20:01 my-model-1000.ckpt.index
-rw-r--r-- 1 u01 u01 4816308  1月  2 20:01 my-model-1000.ckpt.meta
```

しかし、この実装では最大5世代しか保存されないため、6世代目が出力されたタイミングで1世代目が削除されてしまいます。

そこで下記のように保存する世代数を指定します。

```python:実装例2
saver = tf.train.Saver(max_to_keep=100)

if step % 1000 == 0:
    saver.save(sess, 'my-model', global_step=step)
```
tf.train.Saverに**max_to_keep**パラメータを設定することで保存する世代数を指定可能です。
## 世代数を指定せず無限に保存する方法
下記のいずれかの方法で世代管理されず無限に保存されます。

```python:実装例3
saver = tf.train.Saver(max_to_keep=0)
saver = tf.train.Saver(max_to_keep=None)
```
## 1世代だけ保存されれば良い場合

最も単純な実装はファイル名を固定してしまう方法ですね。

```python:実装例5
saver = tf.train.Saver()

if step % 1000 == 0:
    saver.save(sess, 'my-model')
```
ファイル名にStep数やIteration数などを含まず、global_stepパラメータも指定しなければファイル名が固定されるためCheckpointファイルは常に上書きされるため、1世代分しか残りません。

または**max_to_keep**=1を指定しても同様の結果になります。

```python:実装例6
saver = tf.train.Saver(max_to_keep=1)

if step % 1000 == 0:
    saver.save(sess, 'my-model', global_step=step)
```
この方式では最後のStep数がファイル名に含まれますが、最後のCheckpointファイル以外は削除されるため1世代しか残りません。

## その他

**max_to_keep**パラメータ以外に**keep_checkpoint_every_n_hours**パラメータも用意されています。
実際に試したことはありませんが、指定の時間が経過すると古いCheckpointファイルが削除されるようです。
AndroidでRadioButtonを出す


```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.joji.mytest2.MainActivity">

    <RadioGroup
        android:id="@+id/rgroup"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
    <RadioButton
        android:id="@+id/rg1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="windows"
        android:checked="true"
        />
    <RadioButton
        android:id="@+id/rg2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Linux"
        />
    <RadioButton
        android:id="@+id/rg3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mac"
        />
    </RadioGroup>

</RelativeLayout>
```

```java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Switch;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RadioGroup rgroup = (RadioGroup)findViewById(R.id.rgroup);
        rgroup.setOnCheckedChangeListener(
            new RadioGroup.OnCheckedChangeListener(){
                public void onCheckedChanged(RadioGroup group, int checkedId){
                    RadioButton radio = (RadioButton)group.findViewById(checkedId);
                    Toast.makeText(
                            MainActivity.this,
                            String.format("[%s]が選択されました", radio.getText()),
                            Toast.LENGTH_SHORT).show();
                };
            }
        );
    }
}
```
OpenIDの勉強(備忘録)

# OpenID Japan
 - http://openid-foundation-japan.github.io/


### OpenID Authentication 2.0
 - http://openid-foundation-japan.github.io/openid-authentication.html
 - http://openid-foundation-japan.github.io/rfc6749.ja.html
 - http://www.slideshare.net/matake/idit-2014


### JWT
 - http://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token-11.ja.html

###
 - http://qiita.com/TakahikoKawasaki/items/185d34814eb9f7ac7ef3
 - http://www.slideshare.net/tkudo/openid-connect-devlove
 - http://mnakajima18.hatenablog.com/entry/2016/05/04/205713

# OpenIDとOAuth
### protocol
 - http://christina04.hatenablog.com/entry/2015/01/26/194841
 - http://causeless.seesaa.net/article/372627135.html
 - http://www.atmarkit.co.jp/ait/articles/1209/27/news138.html
 - http://d.hatena.ne.jp/hsksnote/20110807/1312685462

### Authentication and Authorization
 - http://www.sakimura.org/2011/05/1087/

### OAuth / Facebook 
 - http://bang.hateblo.jp/entry/20101103/1288799126
 - http://qiita.com/ynunokawa/items/4c9147d2743d36e63832

### refresh_token
 - http://qiita.com/r7kamura/items/3e03471e02ea9ab5902a

### Problem
 - http://www.sakimura.org/2012/02/1487/
 - http://qiita.com/kozayupapa/items/d99b3a77ece0dbe9b7c8

# OpenID connect
### 第三回 Relying Party の実装例 ～passport～
 - https://www.ogis-ri.co.jp/otc/hiroba/technical/openid-connect/chap1.html
 - https://lists.forgerock.org/pipermail/openam/
 - https://github.com/k-tamura/openam-book-jp/blob/master/setup.md


### about Stateless Sessions
 - http://wadahiro.hatenablog.com/
 - http://www.slideshare.net/ForgeRock/customer-scale-stateless-sessions-and-managing-highvolume-digital-services


# Kerberos V5 状態コード
 - https://docs.oracle.com/cd/E19455-01/806-4504/6jdj2sbik/index.html
 - https://www.ipa.go.jp/security/rfc/RFC1510-00JA.html


# SAML
 - http://www.atmarkit.co.jp/ait/articles/0210/02/news002.html
 - http://blog.cybozu.io/entry/4224
 - https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-single-sign-on-protocol-reference
 - https://goodpic.com/mt/archives2/2008/01/openid_oauth.html
ElasticBeanstalkでデプロイしたサーバへのebssh(多段)

# 目的
ElasticBeanstalkによりデプロイされたサーバへ同NWにある踏台サーバを経由してローカルから多段ebsshを行う

# イメージ
![multistage-ssh.png](https://qiita-image-store.s3.amazonaws.com/0/58788/c3f5be64-906b-8df7-3832-2ee8740339a9.png)


# 方法
`~/.ssh/config`に踏台経由の設定を記述する

## 前提
* awsebcliの設定は完了している
* VPCのDNSサポートが有効になっている

### 確認

```bash

$ aws ec2 describe-vpc-attribute --vpc-id <VPCId> --attribute enableDnsSupport | jq '.EnableDnsSupport[]'
true
$ aws ec2 describe-vpc-attribute --vpc-id <VPCId> --attribute enableDnsHostnames | jq '.EnableDnsHostnames[]'
true
```

###　有効化設定

```bash
$ aws ec2 modify-vpc-attribute --vpc-id <VPCId> --enable-dns-support "{\"Value\":true}"
$ aws ec2 modify-vpc-attribute --vpc-id <VPCId> --enable-dns-hostnames "{\"Value\":true}"
```

# 設定

```~/.ssh/config
Host bastion
 Hostname ***.***.***.***
 User ec2-user
 IdentityFile ~/.ssh/******
 ForwardAgent yes
 ServerAliveInterval 300

Host *.ap-northeast-1.compute.internal
 User ec2-user
 IdentityFile ~/.ssh/******
 ProxyCommand ssh -W %h:%p bastion
```

# 接続
* `eb list`で接続対象の環境を確認する
<img width="446" alt="eblist.png" src="https://qiita-image-store.s3.amazonaws.com/0/58788/7432b78d-e30a-e647-0562-0e32fd6607a6.png">

* `eb ssh`で接続対象を選択する
<img width="1101" alt="ebssh.png" src="https://qiita-image-store.s3.amazonaws.com/0/58788/069fd5fa-47fb-6430-f1f9-0058f91aa56f.png">

# 考慮事項
`~/.ssh/config`は環境毎に作成できないので、複数のVPCにそれぞれの踏み台サーバが用意されている場合は上記方法では運用できない。環境毎にconfigを書き換える処理が必要な為、それぞれの踏み台からebsshするのがベター。

![multistage-ssh2.png](https://qiita-image-store.s3.amazonaws.com/0/58788/4daace76-b536-e134-faae-c47d8996616a.png)
WP-Social-Bookmarking-Lightのツイートボタンを押したときにテキストにブログ名を表示しました

WordPressのWP-Social-Bookmarking-LightからツTwitterのイートボタンを押しました。しかし、ブログのタイトルタグと同じテキストが挿入されないという不満がありました。

# タイトルタグと同じテキストが入らない
ツイートボタンをタップしてテキストを確認します。

<img width="536" alt="ツイートボタンを押したときのテキスト" src="https://qiita-image-store.s3.amazonaws.com/0/1624/db3f2c91-c314-cdab-50b9-40ea0697e211.png">

上図はツイートボタンを押したときに立ち上がるウィンドウのキャプチャです。

タイトルタグの本来のテキストは以下のように**記事名+ブログタイトル**のようになっています。

```html:titleタグの内容
<title>2017年のテーマ⭐️ - ぷぎえもんブログ</title>
```

ツイートボタンを押した際に、**記事名+ブログタイトル**のテキストである、『**2017年のテーマ⭐️ - ぷぎえもんブログ**』が挿入されてほしいのですが、**記事名**のみの『**2017年のテーマ⭐️**』が挿入されています。ぜひブログタイトルも表示されてほしいです。

# services.phpの該当箇所を修正
WP-Social-Bookmarking-Lightの設定を、管理画面から確認したところ、挿入されるテキストについて、記事名とブログタイトルを表示するような箇所を見つけられませんでした。

なので以下からソースを確認します。
https://github.com/utahta/WP-Social-Bookmarking-Light/blob/master/modules/services.php

ソースを見た感じ、titleにblognameを追加すれば良さそうです。

```diff:service.phpを編集
- $this->title = $title;

+ $this->title = $title . " - " . $this->blogname;
```
タイトルがブログ名と文字列結合をするように変更しました。

ちなみに、ツイートボタン部分のソースしかみていないのでほかのボタンを使用する場合の影響範囲はわかりません。

# ツイートボタンを確認
再度ツイートボタンをタップして確認します。
<img width="534" alt="スクリーンショット 2017-01-02 12.10.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/b0f394f4-26ea-5c54-6813-a49ae733825d.png">

以前は無かった、`- ぷぎえもんブログ`というブログ名がテキストに挿入されています。
目標通りできました。やったね(☝ ՞ਊ ՞)
とりあえずuGUIでピンチインピンチアウトによる拡大縮小をしたい

Unityでピンチピンチインピンチアウトをしたいんですよ。
スマホでは必須(?)の操作なので、自分用のScript欲しいですよね！ってことで、さっそく実装しました。

* こちらの記事を参考にさせて頂きました。ありがとうございます！！

    * [UnityのuGUIでピンチ動作によってオブジェクトの拡大縮小をさせるスクリプト(モバイル対応)](http://kohki.hatenablog.jp/entry/Unity-uGUI-Pinch-Scaling-forMobile)
    * [Unityでピンチイン・ピンチアウトを実装する](http://qiita.com/a_nishimura/items/c10a10e95f0ea1a27009)

```csharp:PinchinPinchOut.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class PinchinPinchOut : MonoBehaviour {
	
	private float scale;
	private float backDist = 0.0f;

    // デバッグ用テキスト（scaleサイズ確認用）
	public Text scaleText;

    // デフォルトサイズ
	private float defaultScale;

	void Start () {
        // 初期値取得
		RectTransform rt = this.GetComponent(typeof (RectTransform)) as RectTransform;
		defaultScale = rt.sizeDelta.x;
	}
	
	void Update () {
		
		// マルチタッチ判定
		if (Input.touchCount >= 2) {

            // タッチ開始時に初期値を取得
			RectTransform rt = this.GetComponent(typeof (RectTransform)) as RectTransform;
			defaultScale = rt.sizeDelta.x;

			// タッチしている２点を取得
			Touch touch1 = Input.GetTouch (0);
			Touch touch2 = Input.GetTouch (1);
			
			// 2点タッチ開始時の距離を記憶
			if (touch2.phase == TouchPhase.Began) {
				backDist = Vector2.Distance (touch1.position, touch2.position);
			} else if (touch1.phase == TouchPhase.Moved && touch2.phase == TouchPhase.Moved) {
				// タッチ位置の移動後、長さを再測し、前回の距離からの相対値を取る。
				float newDist = Vector2.Distance (touch1.position, touch2.position);
				scale = defaultScale + (newDist - backDist) / 100.0f;
				scaleText.text = "scalse = " + scale.ToString();
				
				// 相対値が変更した場合、オブジェクトに相対値を反映させる
				if(scale != 0) {
					UpdateScaling(scale);  
				}
			}
		}
	}
	
	/// 設定された拡大率に基づいてオブジェクトの大きさを更新する
	private void UpdateScaling(float argScale) {
		RectTransform rt = this.GetComponent(typeof (RectTransform)) as RectTransform;
		rt.sizeDelta = new Vector2 (argScale, argScale);
	}
}
```

# 所感
* ピンチインピンチアウトの上下限を設けて制御する部分に若干手間取りました。。。
* 本当は大きくなりすぎたり小さくなりすぎたりするのを制御すべきだが、今回は時間いっぱいにつき、実装せず。。。
* 汎用的コードを載せるのであれば、上記のデバッグ用テキストは不要なんですけど、自分用ということで、残させていただきました。
* 無駄に何回も取得しているような気もしていますが、これまた時間いっぱいということで、妥協。。。
* あと、複数オブジェクトにこのScriptをアタッチすると、ピンチインピンチアウトしたときにアタッチしたオブジェクトすべてが拡大縮小されてしまうので、どのオブジェクトを拡大縮小の対象にするかのフラグが必要。
PointCloudLibraryをインストールしてからとりあえずOBJファイルを描画してみるまで

PointCloudLibrary1.7.2をインストールして、
とりあえずVisualStudio2013でOBJファイルから点群を描画するまでをまとめます。

#PCL1.7.2のダウンロードとインストール#
1. [こちら](https://onedrive.live.com/?authkey=%21AMsh7Ed-oxMQPSE&id=EC9EBB2646FF189A%2149089&cid=EC9EBB2646FF189A)から"PCL-1.7.2-AllOne-msvc2013-win64(/win32).exe"と"PCL.props"をダウンロード
2. exeファイルを起動してPCLをインストール（特に設定する項目はありません）

これで通常ならCドライブに"PCL1.7.2"が追加されたはずです。

#プロジェクトの設定#
1. Visual C++/Win32 コンソールアプリケーションで新しいプロジェクトを作成（「空のプロジェクト」にチェック）
2. プロパティマネージャーから「既存のプロパティシートの追加」、PCL.propsを追加する
3. プロパティマネージャーから現状の"構成"・"プラットフォーム"に対応するフォルダを選択し、その中にあるPCL.propsを右クリックし、プロパティを開く（構成はReleaseの方が速度が断然速い）
4. 共通プロパティ/ユーザマクロから「マクロの追加」、名前を"PCL_ROOT"、値を"C:\Program Files\PCL 1.7.2"で設定

これであとはコードを書くだけです。

#OBJファイルを入力として点群を描画する#
今回記述したコードは以下の通り。
OBJファイルは適当に用意してください。

```cpp:main.cpp
// Cのmin,maxマクロを無効にする
#define NOMINMAX
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
#include <pcl\visualization\cloud_viewer.h>
#include <pcl\io\vtk_lib_io.h>

// objデータを取得
const char filename[] = "bunny.obj";

void main()
{
	try{
		// objファイルを読み込む
		pcl::PolygonMesh::Ptr mesh( new pcl::PolygonMesh() );
		pcl::PointCloud<pcl::PointXYZ>::Ptr obj_pcd( new pcl::PointCloud<pcl::PointXYZ>() );
		if ( pcl::io::loadPolygonFileOBJ( filename, *mesh ) != -1 ){
			pcl::fromPCLPointCloud2( mesh->cloud, *obj_pcd );
		}

		// ウィンドウの作成
		pcl::visualization::PCLVisualizer viewer( "Point Cloud Viewer" );

		// PointCloudを追加
		viewer.addPointCloud( obj_pcd );
		
		// ウィンドウが閉じていない間続く
		while ( !viewer.wasStopped() ) {
			// スクリーンを更新
			viewer.spinOnce();

			// ESCAPEキーが押されたら終了
			if ( GetKeyState( VK_ESCAPE ) < 0 ){
				break;
			}
		}
	}
	catch ( std::exception& ex ){
		std::cout << ex.what() << std::endl;
	}
}
```
**実行結果**
![2017-01-02.png](https://qiita-image-store.s3.amazonaws.com/0/48341/9116b3c8-13d7-987e-c0bc-c8ee162ebd63.png)

Github:https://github.com/leonarudo00/PCLsamples

#参考#
[KINECT for Windows SDKプログラミングKinect for Windows v2センサー対応版](https://www.amazon.co.jp/KINECT-Windows-SDK%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Kinect-v2%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E5%AF%BE%E5%BF%9C%E7%89%88/dp/4798043958%3FSubscriptionId%3DAKIAI7PTGND4GW7CLPOA%26tag%3Dunanancyowen-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798043958)
[聞きかじりメモ](http://13mzawa2.hateblo.jp/entry/2015/09/08/231426)
Bootstrap 4でブロック中央寄せ

## 環境

| 開発環境    | バージョン|
| :------------- | :------------- |
| ブラウザ     |  Chrome( 55.0.2883.87 m (64-bit))  |
|Bootstrap|  4 Alpha 5 |

## 結論

先に結論です。

```.html
<div class="mx-auto" style="width: 200px;">
  Centered element
</div>
```

これで実装できます

>
[Horizontal centering](https://v4-alpha.getbootstrap.com/utilities/spacing/#horizontal-centering)

## きっかけ

Bootstrapを使った中央寄せを実装しようとして、調べるとBootstrap3時の実装方法である以下のコードが沢山出て来ると思います。

```html
<div class="center-block">
  <div>ブロックの中央よせ</div>
</div>
```

>
[Bootstrapの使い方特設ページ - ブロック中央よせ -](http://shared-blog.kddi-web.com/bootstrap/block-center.html)
[中央揃え](http://qiita.com/ttaka66/items/073c2e2d555609856877)

しかし、Booystrap4では、`.center-block`クラスは排除され新しく、`.mx-auto`クラスが実装されるようになります。

[公式ドキュメント](https://v4-alpha.getbootstrap.com/migration/#utilities)を確認すると

>
- **Dropped .center-block for the new .mx-auto class.**

と書かれている通りに、今後Bootstrap4でブロック中央寄せを実装する際には`.center-block`ではなく`.mx-auto`で記述します。

## .mx-autoクラスとは?

公式では以下の様に説明しています。

>
Additionally, Bootstrap also includes an .mx-auto class for horizontally centering fixed-width block level content by setting the horizontal margins to auto.

>さらに、Bootstrapには、`margins`を`auto`に設定して固定幅ブロックレベルのコンテンツを水平方向に中央寄せにする`.mx-auto`クラスも含まれています。

という事なので、つまる所

```.html
<div class="mx-auto" style="width: 200px;">
  Centered element
</div>
```
上のコードはCSSで記述すると

```.css
.mx-auto {
  width: 200px;
  margin: 0 auto; 
}
```

を実装しているのだと考えられます。

>
参考資料
[Utilities Spacing](https://v4-alpha.getbootstrap.com/utilities/spacing/#content)