OmniAICreator/Qiita-1.07M huggingface dataset:
EC2 EBSのsnapshotを取得する。[SDK for Java]

# はじめに
AWS SDK for Javaを使ってEBSのsnapshotを取得する手順を紹介します。

# AWS Management Console
１．左メニュー　ELASTIC BLOCK STORE　→　Volumesを選択
２．snapshotを取得したいボリュームを右クリックで選択
３．CreateSnapshotを選択
４．Name,Descriptionを適当に入力して「Create」を押下。
５．しばらくすると作成されます。


snapshotは高い信頼性のS3上にバックアップとして保管もされますし、ブート領域を含んでいる場合は、ここからAMIを作成し、EC2インスタンスを複製することが可能です。

# SDK for Java

ただsnapshotを作るのではなく、EC2のインスタンスIDをキーに対象のボリュームを特定してそのsnapshotをとってみます。

<pre><code class="java">
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.CreateSnapshotRequest;
import com.amazonaws.services.ec2.model.DescribeVolumesResult;
import com.amazonaws.services.ec2.model.Volume;
import com.amazonaws.services.ec2.model.VolumeAttachment;

public class Ec2EbsSnapshot {

	/**
	 * 第一引数で指定されたEC2のインスタンスIDに紐づくEBSのsnapshotを作成します。
	 * 
	 * @param args[0] ec2 instance id
	 */
	public static void main(String[] args) {

		String ec2InstanceId = args[0];
		if (args.length != 1 || ec2InstanceId == null
				|| "".equals(ec2InstanceId)) {
			throw new IllegalArgumentException("EC2 instance id is null.");
		}

		AWSCredentialsProvider provider = new ProfileCredentialsProvider("uzr");

		AmazonEC2 ec2_tokyo = Region.getRegion(Regions.AP_NORTHEAST_1)
				.createClient(AmazonEC2Client.class, provider,
						new ClientConfiguration());

		DescribeVolumesResult volumes = ec2_tokyo.describeVolumes();
		String volumeId = null;
		for (Volume volume : volumes.getVolumes()) {
			for (VolumeAttachment volumeAttatchment : volume.getAttachments()) {
				if (ec2InstanceId.equals(volumeAttatchment.getInstanceId())) {
					volumeId = volumeAttatchment.getVolumeId();
					System.out.println(ec2InstanceId + " : " + volumeId);
					break;
				}
			}
		}

		if (volumeId == null || "".equals(volumeId)) {
			System.out.println(ec2InstanceId + "に対応するvolumeIdが見つかりません。");
		} else {
			ec2_tokyo.createSnapshot(new CreateSnapshotRequest(volumeId,
					volumeId + " snapshot."));
			System.out.println("snapshotの作成を要求しました。");
		}
	}
}
</code></pre>
review-vol(1)について調べた

[review-vol(1)](https://github.com/kmuto/review/blob/master/bin%2Freview-vol)を使えばRe:VIEWで書いた原稿の量を概算できるとのことなので調べた。

これの実装は[ReVIEW::Book::Volume](https://github.com/kmuto/review/blob/master/lib%2Freview%2Fbook%2Fvolume.rb)のようだ。page()の定義は以下のようになっている。純粋にデータ量からページ数を概算しているようだ。

```rb
    def page
        (kbytes.to_f/@book.page_metric.page_per_kbyte).ceil
    end
```

page_per_kbyte()は[ReVIEW::Book::PageMetric](https://github.com/kmuto/review/blob/master/lib%2Freview%2Fbook%2Fpage_metric.rb)にあって、事前定義された値としてA5とB5がある。ここで注目したいのはpage_per_kbyte()だけなのでそれをみると、A5は1KBでB5は2KBとなっている。

```rb
module ReVIEW
  module Book
    class PageMetric
      def PageMetric.a5
        new(46, 80, 30, 74, 1)
      end

      def PageMetric.b5
        new(46, 80, 30, 74, 2)
      end

      def initialize(list_lines, list_columns, text_lines, text_columns, page_per_kbyte)
        @page_per_kbyte = page_per_kbyte

        # 他の初期化処理は省略
      end

      # アクセサなどの定義は省略
    end
  end
end
```

で、このPageMetricのデフォルト値は[ReVIEW::Configure](https://github.com/kmuto/review/blob/master/lib%2Freview%2Fconfigure.rb)にある。デフォルトはA5らしい。

```rb
        "page_metric"  => ReVIEW::Book::PageMetric.a5,
```

それではこのpage_metricを外部から設定するにはどうすればいいかを調べたのだけど、そもそもreview-volでは設定できないようだ。review-compileはコマンド自身が[config.ymlを読み込んでいる](https://github.com/kmuto/review/blob/master/bin%2Freview-compile#L69-L72)のに対し、review-volにそういうオプションはなさそうだからだ。

とりあえず今日はここまで。
Moment.jsで今日のはじまりと終わりの値を取得する方法

今朝Hubot用のScriptを書いてて

- MongoDBにイベント情報を格納してあるような状況
- HubotからそのMongoDBにアクセスしてイベント開始日が今日にマッチするものを抜き出したい

という状況で地味に今日のはじまりの値を手軽に取得する方法がわからずちょっとハマったので簡単にまとめます。


## JavaScriptで日付処理といえばMoment.js

日付処理を便利にするライブラリではMoment.jsが有名かと思い、自分も結構多用してるのでこれをベースに今日のはじまりの値を取得する方法を探すことにしました

タイムゾーンを日本のものにするために

```coffeescript
moment.locale('ja')
```

としてから作業進めてます。

### 今日のはじまりをどのように得るか？

最初に思いついたのは

1. moment()で現在日付時刻を取得
2. 上記で得られた値に対して、hour()、minute()、seconds()でそれぞれ0を与える

```coffeescript
current = moment() # Wed Nov 05 2014 08:02:53 GMT+0900 (JST)
beginningOfDay = current.hour(0).minute(0).seconds(0) # Wed Nov 05 2014 00:00:00 GMT+0900 (JST)
```

これでも意図した値は得られたのですが、このアプローチで、今日の終わりを得るには

1. moment()で現在日付時刻を取得
2. 上記で得られた値に対して、add(1, 'days')として明日の日付を得つつhour()、minute()、seconds()でそれぞれ0を与える
3. ２．で得た値に対して、add(-1, 'seconds')という感じでマイナス1秒する

という感じで、どう考えてもスマートじゃないし、きっと違う方法があるに違いないと思ってもう少し調べてみました。

### 他の言語やライブラリで今日のはじまりって手軽に取得できるのでは？

こういう処理ってきっとみんなが欲しい機能だろうし、他の言語、例えばRuby辺りでそれっぽいのがないのか調べてみることにしました。

英語で今日のはじまりっていうニュアンスの表現がちょっと思いつかなかったのですが[Get Time Object at Start of Day in a Particular Time Zone](http://stackoverflow.com/questions/7988717/get-time-object-at-start-of-day-in-a-particular-time-zone)で

```rb
date = Date.today

date.to_time.in_time_zone('America/New_York').beginning_of_day
```

というのがあって、

「なるほど、beginning_of_dayっていう言い方がされるのか」

ということに気づき、Momentjsのドキュメントを見たら

- [Start of Time](http://momentjs.com/docs/#/manipulating/start-of/)
- [End of Time](http://momentjs.com/docs/#/manipulating/end-of/)

というそのもののやつがありました(^_^;)

これを使うことで

```coffeescript
beginningOfDay = moment().startOf('day') # Wed Nov 05 2014 00:00:00 GMT+0900 (JST)
endOfDay = moment().endOf('day')         # Wed Nov 05 2014 23:59:59 GMT+0900 (JST)
```

という感じでスマートに意図した値が取得できるようになりました


## まとめ

- Momentjs使って処理書いててなんとなくスマートじゃないなぁと思ったらそこで諦めない
- JavaScriptに限定せず他の言語でどう実装されているのかググってみると意外とヒントになることが見つかる（かも）
gitでリモートブランチをローカルにチェックアウトしてくる

いつもどうやるんだっけ？ってなるので備忘録です。


### 1. リモートに上がってるブランチを確認します。

```
git branch -a

* master
  remotes/origin/master
  remotes/origin/test
```

この時に対象のブランチが見当たらなければ`git fetch`をして、最新版のブランチを持ってくる。

### 2. リモートブランチをローカルにチェックアウト

ここでは、リモートブランチの`origin/test`ブランチをローカルに`test`というブランチ名でチェックアウトすることにします。

```
git checkout -b test origin/test
```
GradleでプロジェクトごとにCopy.expandの引数を切り替える


# やりたいこと

Copy.expandは環境に応じてプロパティを変えるのに使うことが多いかと思いますが、今回はマルチプロジェクト構成でプロジェクトごとにプロパティを変える必要があったので用意しました。

ディレクトリ構成はこんな感じ。

├── build.gradle
├── proj-a
│   ├── build.gradle
│   └── properties
├── proj-b
│   ├── build.gradle
│   └── properties
├── properties
│   └── fileA
└── settings.gradle

# build scripts

```gradle:build.gradle
subprojects {
    task filterProperties (type: Copy) {
        afterEvaluate { project ->
            from('../properties')
            into('properties')
            expand(project.props)
        }
    }
}
```
rootのbuild.gradleでタスクを定義します。afterEvaluateを使うのが味噌でこれがないと、projectがrootを指します。


```gradle:proj-a/build.gradle
ext {
    props = [
        hoge: 'proj-a'
    ]
}
```

```gradle:proj-b/build.gradle
ext {
    props = [
        hoge: 'proj-b'
    ]
}
```

各々のプロジェクトのbuild.gradleでextを定義します。もちろんrootで全部定義することもできます。

# build結果

```properties:properties/fileA
hoge=${hoge}
```

```properties:proj-a/properties/fileA
hoge=proj-a
```
```properties:proj-b/properties/fileA
hoge=proj-b
```
CentOS6にサイボウズ Office 10デモ版をインストール


# サイボウズ Office 10の動作環境の注意

* 必要なミドルウェアのはapacheだけ。
  * cgiで動作します。
  * 64bitOSを使用している場合、`ld-linux.so.2`を別途インストールのこと。
  * CentOS7では提供されていないためインストールが出来ない。
* PATH情報が含まれるファイルは以下。
  * /var/www/cgi-bin/cbag/ag.ini
  * /var/local/cybozu/office/cbag/sched.ini

# インストール概要

```bash:Dockerfile
from centos:centos6

RUN \
  unlink /etc/localtime ;\
  ln -s /usr/share/zoneinfo/Japan /etc/localtime ;\
  localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 ;\
  echo "setup" ;\
  yum install -y tar wget httpd ld-linux.so.2 ;\
  cd /tmp ;\
  wget -q http://download.cybozu.co.jp/office10/cbof-10.2.0-linux-k0.bin ;\
  service httpd start ;\
  sh cbof-10.2.0-linux-k0.bin ;\
  rm -f cbof-10.2.0-linux-k0.bin ;\
  service httpd stop ;\
  yum clean all

EXPOSE 80
ENTRYPOINT service httpd start && tail -F /var/log/httpd/*log
```

これでインストールが出来るかと思ったが、

> sh cbof-10.2.0-linux-k0.bin

ここの入力待ちで先に進まないので手動で進めた。

# コミット -> tar化

```bash:
$ docker commit -a "tukiyo3 <tukiyo3@gmail.com>" 3672ce59e2e3 private/cybozu10
$ docker save -o cybozu10.tar private/cybozu10
```

* `http://server-ip/cgi-bin/cbag/ag.cgi`にアクセスしてログインできることを確認。
  * 初期ユーザのパスワードは空です。

# スマホから操作

* Cybozu ガルーンを使用する。
  * アクセスURLは `http://server-ip/cgi-bin/cbag/ag.cgi` を指定する。
  * サイボウズ側でのアクセスするための準備は以下の手順
    1. 右上の歯車アイコンをクリック -> システム設定 -> ユーザ -> 変更する -> ログイン名 と パスワード を設定。

# メールサーバ登録

* トップページ -> システム設定（基本）-> メールサーバーの登録 -> 追加する

# Basic認証対応

* サイボウズクナイは以下注意
  1. Basic認証なしでログインし設定を済ませる。
  2. Basic認証ありでログインし設定を済ませると、syncできなくなる。
  3. その場合はサイボウズクナイをアンインストールし再度インストールすればよい。


```bash:認証ファイルを作成
htpasswd -c /var/www/htpasswd user1
```

```apache:/etc/httpd/conf/httpd.conf
<Directory "/var/www/cgi-bin">
    ...
    AuthType Basic
    AuthName "Secret Zone"
    AuthUserFile /var/www/htpasswd
    Require user user1
    ...
</Directory>
```

```bash:
service httpd restart
```

# デスクトップ通知

* [サイボウズデスクトップ](http://products.cybozu.co.jp/office/ver10/product/3rd_party/#desktopdown)
  * Mac用もあるのは良い
  * デモ版では利用できません。
iOS8からUIViewControllerに追加されたshowViewController()とshowDetailViewController()について


親ViewControllre(UISplitViewControllerやUINavigationController)が持つ
子ViewControllerにて画面遷移、または画面表示を実行する場合、
わざわざ親ViewControllreを呼び出して、実行させていたが、
showViewController、showDetailViewControllerを使えば、
親ViewControllreを呼び出すことなく実行できる

## showViewController:sender:

* UISplitViewControllerの子ViewControllerの場合

	引数で渡すViewControllerがprimary側のViewControllerに置き換わる

* UINavigationControllerの子ViewControllerの場合

	引数で渡すViewControllerがPushで画面遷移する

* 親ViewControllerを持たないただのViewControllerの場合

	引数で渡すViewControllerがモーダルで表示される

## showDetailViewController:sender:

* UISplitViewControllerの子ViewControllerの場合

	* horizotal size classがregularの場合(分割表示)

		引数で渡すViewControllerがsecondary側のViewControllerに置き換わる

	* horizotal size classがcompactの場合(1画面表示)

		引数で渡すViewControllerがモーダルで表示される
		ただし、primary側がNavigationControllerの場合、pushで画面遷移する

* UINavigationControllerの子ViewControllerの場合

	メソッドなし。

* 親ViewControllerを持たないただのViewControllerの場合

	引数で渡すViewControllerがモーダルで表示される

## targetViewControllerForAction:sender:

親ViewController(UISplitViewControllerやUINavigationControllerなど)が指定したメソッドを実装しているか取得する。
ない場合、見つけるまで親をたどっていく。

showViewControllerやshowDetailViewControllerでは、
内部で、このメソッドが呼び出している。
```
> UISplitViewController
> ↑
> UINavigationController
> ↑
> UIHogeViewController


上記のようなツリーのコンテナ構造の場合、
UIHogeViewControllerでshowViewControllerを実行すると、
一つ親のUINavigationControllerのshowViewControllerがあるか
targetViewControllerForActionでチェックする。
UINavigationControllerには実装されているので、
UINavigationControllerのshowViewControllerが実行される。

しかし、showDetailViewControllerの場合、
UINavigationControllerには実装されていないので、
さらにもうひとつ上のUISplitViewControllerをチェックする。
UISplitViewControllerは実装されているので、そのshowDetailViewControllerが実行される。
stdio

```c

//==================================================
// char IO 
//==================================================

const char* str = "10%off";

printf(str);    // 'str' に %文字が入っているのでおかしくなる	 

printf("%s\n", str); // 問題なくなった。
puts(str); // こちらも問題ない。かわりに期待していない場合でも改行が出力される。
while( putc(*str++, stdout) ); // これで期待しない改行の出力はなくなった。

/* ただputcの第二引数に指定するファイルは、
 マクロとして定義されている場合、2回評価される可能性がある。*/

fputc(str, stdout); // こっちのほうが楽、副作用もない。
	
//---------------------------------------------------

#define LEN_MAX 80
char ch[LEN_MAX] = {0};

printf("%s", "what is your name? ");
gets(ch); // 読み取るサイズが固定されている保証がなければ危険。原則:つかわない。

/* 読み取るサイズに制限をつける */

int i=0;
// 最大で80文字 改行文字まで入力を促す。
for( ; ch[i-1] != '\n'; i = strlen(ch) ) {
	fgets(ch, LEN_MAX, stdin);
}

// 読み取るフィールド幅に制限
scanf("%79s", ch);

//====================================================
// フォーマットIO 
//====================================================
// 出力する文字数（精度）に制限
printf("%.*s\n", LEN_MAX, ch);

// スキャン集合で４桁の数字を読み取り。数字以外の読み取りがあると修復不能（？）
scanf("%4[0-9]s");

//====================================================
// ちょっと型指向
//====================================================
// 数値のみ読み取る
int n;
while( scanf("%d", &c) <= 0 ) n = getchar(); // ストリームを進める（強引？）

//---------------------------------------------------
// おとなしくsscanf()

char str[80] = {0};

fputs("? ", stdout);
scanf("%79s", str);

int i, n, c = 0;

// 読み取った文字列中に数字以外が含まれているか。
for(i = 0; i < strlen(str); ++i) {
	if(isdigit(str[i])) ++c;
}
if(c == strlen(str)) {
	sscanf(str, "%d", &n);
	printf("%d\n", n);
}
else {
	puts("not a number");
}
/* もっとまともな書き方がありそう(´・ω・`) */

```

備考：
・文字として扱える数値のは正の整数のみであることがC言語により決められている。
・プログラム開始時に stdout, stdin, stderr は自動的に開かれる（コンパイル・オプションによる）
・標準ライブラリを利用した入出力はバッファリングされる。
・データブロック単位のIOはまだやってない(´・ω・`)
Javascriptで食べ物を美味しそうに見せる（ほかほかオーバーレイ）

食べ物を美味しそうに見せる
ほかほかオーバーレイについての紹介

画像の上からゆげが出てくるので
なんでも美味しそうに見えます．

HTML5のcanvasを利用して，動くゆげを描きます．
ゆげは小さくなるほど速度を速くするとリアリティが高まります．

Javascriptで
オブジェクト指向的な書き方に挑戦し，
メインプログラムを50行で収める工夫をしています．


![hokahoka.png](https://qiita-image-store.s3.amazonaws.com/0/54559/19e3c046-0df6-5428-eb2b-d52bc0a9d44e.png)


サンプル：
http://www.yasuikeita.com/works/qiita/hokahokaoverlay/


```html:index.html
<!DOCTYPE html>
<html>
<head>
<title>おいしいたこ焼き屋</title>
<script type="text/javascript" src="HokahokaLib.js"></script>
<script type="text/javascript" src="Hokahoka.js"></script>
</head>
<body>
    <canvas id="okonomiyaki_canvas" width="200" height="200"></canvas>
</body>
</html>
```

```js:HokahokaLib.js
//--
// Graphics
// ref.http://www.saturn.dti.ne.jp/npaka/html5/GraphicsEx/index.html
//--


function Graphics(canvas) {
    this.canvas =canvas;
    this.context=canvas.getContext("2d");
    this.loadingCount=0;
}

Graphics.prototype.getLoadingCount=function() {
    return this.loadingCount;
}

Graphics.prototype.clearRect=function(x,y,w,h) {
    this.context.clearRect(x,y,w,h);
}

Graphics.prototype.loadImage=function(src) {
    this.loadingCount++;
    var image=new Image();
    var source=this;
    image.onload=function() {
        source.loadingCount--;
    }
    image.src=src;
    return image;
}

Graphics.prototype.drawImage=function(image,x,y) {
    this.context.drawImage(image,x,y);
}

Graphics.prototype.drawYuge=function(point,r) {

    var i;
    for(i=0;i<r;i+=2){
        this.context.fillStyle = "rgba(255,255,255,0.05)";
        this.context.beginPath();
        this.context.arc(point.x,point.y+i/3,i,0,Math.PI*2,true);
        this.context.fill();
    }
}

Graphics.prototype.getWidth=function() {
    return this.canvas.width;
}
Graphics.prototype.getHeight=function() {
    return this.canvas.height;
}


//--
// Point
//--


function Point(x,y){
  this.x = x;
  this.y = y;
  return this;
}
Point.prototype.add = function( point ){
  this.x += point.x;
  this.y += point.y;
}
```

```js:Hokahoka.js
var YUGE_NUM= 5;
var YUGE_SIZE = 20;

var g,image,i;

var pos = new Array(YUGE_NUM);
var vect = new Array(YUGE_NUM);

window.onload=function() {

    g=new Graphics($("okonomiyaki_canvas"));

	image=g.loadImage("okonomiyaki.jpg");

	//initialize
	for (i = 0; i < YUGE_NUM; i++) {
        pos[i] =  new Point(
        	Math.random()*g.getWidth(),
        	Math.random()*g.getHeight());
		vect[i] = new Point(0,0);
    }

    setInterval("motion()",50);
}

function motion() {
	
	if (g.getLoadingCount()>0) return;

	g.clearRect(0,0,g.getWidth(),g.getHeight());
	g.drawImage(image,0,0);
	
	for (i = 0; i < YUGE_NUM; i++) {

		g.drawYuge(pos,YUGE_SIZE);

    	pos[i].add(vect[i]);
		vect[i].add(new Point((1-Math.random()*2)*0.2,-0.1));

		if(pos[i].y<-YUGE_SIZE){
			pos[i] =  new Point(
        		Math.random()*g.getWidth(),
        		Math.random()*g.getHeight());
			vect[i] = new Point(0,-1);
		}
    }
}

function $(id) {
    return document.getElementById(id);
}



```
clojure.java.jdbcでデータベースに接続する

#clojure.java.jdbc とは
[clojure.java.jdbc](https://github.com/clojure/java.jdbc)は名前の通り、JDBCをclojureから使いやすくするためのライブラリです。
がんばってごりごり書かなければならないところを隠ぺいしてくれます。

# Install
leiningenを使用しているならば`:dependencies`に`[org.clojure/java.jdbc "0.3.6"]`追加するだけです。

``` clj:project.clj
(defproject sample-project "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.clojure/java.jdbc "0.3.6"]])
```

# Example
`require`して`db-spec`を書きます。
`db-spec`はコネクションを作成するためのものでいろいろな書き方ができます(後述)

```clj
(ns clojurejdbcsample.core
  (:require [clojure.java.jdbc :as sql]))

(def db-spec {:subprotocol "sqlite"
              :subname "target/test_db.sqlite"})
```

DMLのサンプル

```clj
(defn sample-dml []
  ;; 次のINSERT文と同じ意味合い
  ;; INSERT INTO languages VALUES
  ;; (1 ,"clojure"),
  ;; (2 ,"scala"),
  ;; (3 ,"ruby);
  (sql/insert! db-spec :languages nil
               [1 "clojure"]
               [2 "scala"]
               [3 "ruby"])

  ;; 次のDELETE文と同じ意味合い
  ;; DELETE FROM languages WHERE langid = 1;
  (sql/delete! db-spec :languages ["langid = ?" 1])

  ;; 次のUPDATE文と同じ意味合い
  ;; UPDATE languages SET
  ;; name = "RUBY"
  ;; WHERE langid = 3
  (sql/update! db-spec :languages {:name "RUBY"} ["langid = ?" 3])

  ;; SELECT結果はmapのvectorとして返る
  (sql/query db-spec
             ["SELECT * FROM languages WHERE langid = ?" 2])
  ;; => [{:langid 2 :name "scala"}]
  )
```

# db-specの書き方
以下が参考になります
http://clojure.github.io/java.jdbc/#clojure.java.jdbc/get-connection
https://github.com/clojure/java.jdbc/blob/master/src/test/clojure/clojure/java/test_jdbc.clj

# Oracleにつなぐ場合の注意点
OracleのJdbcドライバにはリポジトリがないため、ローカルのMavenリポジトリを作る、`:resource-path`に追加する実行時にクラスパスに追加する
等の対策が必要。
[Swift]xibファイルを呼び出す最も簡単な方法

# [Swift]xibファイルを呼び出す最も簡単な方法


最近、swiftを使い始めました。

色々と調べながら開発を進めているので、
調査の記録を残していければな、と思っています。
***

今回のテーマは、**「xibファイルを呼び出す」**です。

これだけ、の超単純な記事ですが、
ピンポイントな記事が無かったので紹介します。


下記の手順で進めます。
　　1. SampleView.xibファイルの作成
　　2. ViewController.swiftの編集


## 1. xibファイルの作成

新しいファイルを作成します。
> File > New > File

Viewを選びます。
> iOS > User Interface > View > Next

「SampleView.xib」と名前を付けて保存します。
> Save as「SampleView.xib」> Create

これで新しいファイルが作成されたので、
Labelを中央に配置してトップページと区別しておきましょう。



## 2. ViewController.swiftの編集

呼び出したいコントローラーに下記を追記して、
作成した「SampleView.xib」を呼び出します。

```swift
// nibNameにはxibファイル名が入る。
let view:UIView = UINib(nibName: "SampleView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as UIView

// 呼び出したコントローラーのviewに設定する
self.view.addSubView(view)
```

編集結果はこのようになります。

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.loadTemplate()
    }

    func loadTemplate(){
        let view:UIView = UINib(nibName: "SampleView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as UIView
        self.view.addSubView(view)
    }
}
```

***
はい。これだけです。

シンプルすぎる内容ですが、参考になれば幸いです。
未来の会議をIoT技術で作りたい

先日のハッカソンの結果は
残念ながら自分のチームは惨敗でした。。。。

http://japanese.engadget.com/2014/10/30/edison/

次は未来会議システムを作ってリトライしたいと思います。

####■作成中の未来会議

先ず、会議でどの様なものを作成するかを考えた結果、以下を作成することに！！

　・ジェスチャマウス
　　→　加速度センサーとbluetoothモジュールでウェアラブルデバイスとして
　　　 ジェスチャーマウスを実装。
　　　 これについてはプロト実装済み、ただ両面実装のプリント基盤を利用しても2.5cmの
　　　 壁が破れないのでarduinoやめてマイコンで再度実装する予定。。。
![IMG_0296.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/37421cf5-76a2-b3c4-2ed8-b3d1eb4bd3c5.jpeg)

![IMG_0298.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/a07c782e-3189-1e25-d3e5-4a3067ad382c.jpeg)

　
　・空中ディスプレイ
　　→ まだ、レーザ技術が市販されているレベルでは空中投影が実現できないので
　　　虫眼鏡と逆さまにした小型液晶を利用して超小型プロジェクターを作成。
　　　　http://www.aitendo.com/product/3119

　・音声解析
    WEB APIなどをマッシュアップして会議補助機能や議事めも解析など
　    https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=6
  　  http://www.metadata.co.jp/emotion-ma9.html
　　　
　・TV会議、音声会議システム
　　Node.jsでリアルタイムWEB会議は容易に実現可能なのでNodeが動くIntel Edisonに
　　直接実装。


ここまでは簡単に実装できるレベルなので、これ以外にもPUXの画像解析などもっともっと面白い機能を詰め込んで、以下のR2D2に実装して未来会議システムを作成します！！
http://www.amazon.co.jp/imp-IMP-101-R2D2-%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89/dp/B00JRNFIDU


実現するのにハードからソフトまでを実装するので、1.2mm間隔のハンダ付けや電子回路の電流計算や加速度センサーのxyz空間計算などの物理的なスキルから、サーバなどのインフラ構築、低級言語・高級言語プログミングのスキルまでが必要なのでやりがいあって楽しいので時間あるひとはトライしてみるのもいいかもしれません。
[Ruby] selenium-webdriver で HTML ソースに特定の文字列が含まれているかテストする

selenium-webdriver では page_source メソッドを使うと、アクセスしているページの HTML ソースを取得することができます。include マッチャーを使って期待した文字列が HTML ソース内に含まれているか確認します。下記は RSpec のテストコードです。

```sample_spec.rb
require 'selenium-webdriver'

describe "qiita.com" do
  before :all do 
    @webdriver = Selenium::WebDriver.for :firefox
  end
  it "includes expected text" do
    expected = "Qiitaは、プログラマのための技術情報共有サービスです。"
    @webdriver.navigate.to "http://qiita.com"
    expect(@webdriver.page_source).to include expected
  end
  after :all do
    @webdriver.quit
  end
end
```
node.jsで時間当たりのアクセス数に制限のあるWEBサイトに対してリクエスト数を制限する


## はじめに

動的なページやJSON APIを備えたWEBサーバーに対してリクエスト（スクレイピング）する場合
開発者は通常マナーとして１秒に一回という制限をつけます
しかし以下のような場合があります

* 動的なページで１０秒に一回しか重くてアクセスできない
* IPによるアクセス制限がかけられていて２秒に一回しか許可されない
* １時間1000回などカウンタを持つ場合

個別にif文を使ったりカウンターを設置して書くことはできますが一元管理されないので管理が大変になります

そこでlimit-request-promiseというモジュールを作りました。
(使い方はベースとなっているrequest-promiseの使い方そのままです)

## インストール

```
npm install limit-request-promise
```

## 使い方

```
var LimitRequestPromise = require('limit-request-promise');
var lp = new LimitRequestPromise(1,1); // すべてのサイトに対して一秒に一回許可する
// サイトごとに制限を登録する
lp.setup([
{
    host:'http://www.example.com',max:1000,sec:3600
},
{
    host:'http://www.osoihudosan.com',max:1,sec:10
},
{
    host:'http://www.jibunnohp.com',max:1,sec:0.1
},
{
    host:'http://www.yahoo.co.jp',max:1,sec:2
}
]);
lp.req('http://www.yahoo.co.jp/xxxx.html').then(console.log); // すぐに実行される
lp.req('http://www.yahoo.co.jp/yyyy.html').then(console.log); // ２秒後に実行される

lp.req({url:'http://www.example.com/xxxx.html'}).then(console.log); // すぐに実行される
lp.req({url:'http://www.example.com/yyyy.html'}).then(console.log); // すぐに実行される

lp.req('http://www.osoihudosan.com/search?name=hurui').then(console.log); // すぐに実行される
lp.req('http://www.osoihudosan.com/search?name=semai').then(console.log); // １０秒後に実行される
```

## コメント

１．node.jsでサイトをスクレイピングすると一度にparallelで取ってこれるので効率がよいですが
同じホスト名を持つサイトにはconcurrentにしたほうがトラブルが減るのでよいです

２．setupにいれる設定情報はJSONで管理すると管理しやすいです
Ruby - 配列から最頻出要素を取り出す問題

@KaitoMiyazaki から、配列から最頻出要素を取り出す問題を出されたので、
解いてみましたー

# 問題

```rb
[3, 2, 3, 4, 4, 4, 6]
```

以下のような配列があります。
この中から最頻出要素を取り出してください。
つまり```4```。

# 私の回答

```rb
ary = [3, 2, 3, 4, 4, 4, 6]
ary.uniq.sort_by{|x| ary.count x }.reverse[0]
```

（ ˘⊖˘）。o（これはRubyっぽくない）

```rb
ary = [3, 2, 3, 4, 4, 4, 6]
ary.uniq.sort{|x,y| ary.count(y) <=> ary.count(x) }[0]
```

こんな感じかなー

他にも思いついた回答あったらくださいー
【NOREN】アクションフィールドの値が空の場合の条件分岐


##説明

「IfStart,is」をexistに変えることで、
「このアクションフィールドの値が空ならこれを表示する」という条件分岐になる。


**<注意>**
全角・半角スペースが入っていた場合も、
条件は成り立たずaf_fugaは表示されない。


##NOREN
```
[[--IfStart,exist:af_hoge--]]
	[[--ThenStart--]]
		[[--ArtFieldValue,field:af_fuga--]]
	[[--ThenEnd--]]
[[--IfEnd--]]
```
Intel Edison から Tweet をポスト

IoT の醍醐味はなんといっても「ネットに繋がっている」事ではないでしょうか。
そのインターネットを生かした使い方として「なにかあったらツイートする」というのをやってみましょう。

# ツイートするプログラム
今回 Edison の中からツイートをするためのプログラムを GO言語で書きました。
GO を使った理由としては

1. クロスコンパイルが容易である
2. 実行バイナリを生成する
3. その実行バイナリがスタティックリンクのひとかたまりになっている
4. ネットワークに強い

というあたりです。
ネットワークプログラミングがやりやすくて、Linux や Windows、そして MaxOSX と安定した開発環境を得られて動作確認もその上で行えるというところにメリットを見いだしました。
Linux なり Windows なりの上で開発して完成したらクロスコンパイル、できた実行ファイルを scp で Edison に転送しようという魂胆です。

## ソースコード
実際に作ったコードはこちら。
起動時にコマンドライン引数に与えた文字列をツイートするという簡単なプログラム。
Twitter クライアントライブラリである anaconda を利用してさくっと作ってあります。

```go:iotTaslkPost
import (
	"os"
	"flag"
	"fmt"
	"github.com/ChimeraCoder/anaconda"
	"net/url"
)

func tweet(talk string) {
	anaconda.SetConsumerKey("your-consumer-key")
	anaconda.SetConsumerSecret("your-consumer-secret")
	api := anaconda.NewTwitterApi("your-access-token", "your-access-token-secret")
	v := url.Values{}
	tweet, err := api.PostTweet(talk, v)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Println("Tweet success: "+tweet.Text)
}

func main() {
	flag.Parse()
	if flag.NArg() != 1 {
		fmt.Println("Argument Error.")
		fmt.Println("  usage: iotTalkPost your-tweet")
		os.Exit(1)
	}

	tweet(flag.Arg(0))
}
```

## アクセスキー
Twitter API へのアクセスキー群は各人で取得し、ソースコードに埋め込んでください。


# ボタンを押したらツイートされる
上記のコマンドを実行すると Edison の内部からツイートが投稿されます。
GPIO に押しボタンを取り付けて、ボタンが押されたらツイートする ruby スクリプトを作って見ましょう。

## 押しボタンの配線
今回は GPIO15 に押しボタンスイッチをつけてボタンの入力を見ます。
プルアップ回路なので、解放で１押されたら０になる回路ですね。
![pullup_sw.PNG](https://qiita-image-store.s3.amazonaws.com/0/50737/9edf8b03-3642-b988-dc61-e083df463b25.png)


## スクリプト
ボタン監視とツイートコマンドの起動には Ruby を使いました。
書き捨てテストコード。

```ruby:push.rb
def gpio_in(port)
  number = port.to_s
  if !File.exist?("/sys/class/gpio/gpio#{number}") then
    open("/sys/class/gpio/export", "w") do |fp|
      fp << number
    end
  end
  open("/sys/class/gpio/gpio#{number}/direction", "w") do |fp|
    fp << 'in'
  end
end

def input(port)
  code = "1"
  open("/sys/class/gpio/gpio#{port}/value", "r") do |fp|
    fp.each do |line|
      code = line
      break
    end
  end
  return (code.to_i == 0)
end

# ---- main
gpio_in(15)

trig = false
while(1) do
  push = input(15)
  if (trig == false) && (push == true) then
    puts("Fire!")
    system("./iotTalkPost \"push! ボタンが押されたよっ！\"")
  end
  trig = push
  sleep(0.05)
end
```

sysfs の GPIO value をくるくる監視して、０から１になったらツイートする仕組みです。

# IoT ってなんでしょかね
これで Edison の中からツイートすることができるようになりました。
Edison で何かを監視して、都度ツイートしまくるとかに使うといくらか IoT っぽくはないでしょうかね。
[Unity] surface shaderでライティング


surface shaderでライティングを自前で行うには、`#pragma`で必要な関数名を指定するようです。

```cg:custom-lighting
#pragma surface surf BasicDiffuse

// 中略

// インライン関数でライティングを実装
inline float4 LightingBasicDiffuse(SurfaceOutput s, fixed3 lightDir, fixed atten) {
	float difLight = max(0, dot(s.Normal, lightDir));
	float4 col;
	col.rgb = s.Albedo * _LightColor0.rgb * (difLight * atten * 2);
	col.a   = s.Alpha;
	return col;
}
```

コードを見てもらうと分かりますが、`#pragma surface surf BasicDiffuse`の`BasicDiffuse`に`Lighting`を付与したインライン関数を実装することでライティングが行われます。

`inline float4 LightingBasicDiffuse(SurfaceOutput s, fixed3 lightDir, fixed atten) {...}`の部分ですね。

また、この引数を変えることでいくつかのライティングを行うことができるようです。

参考にした書籍（[Unity Shaders and Effects Cookbook [eBook]](https://www.packtpub.com/game-development/unity-shaders-and-effects-cookbook)）から引用させてもらうと、

**Forward rendering**

```cg:forward-rendering
half4 LightingName (SurfaceOutput s, half3 lightDir, half atten){}
```

>This function is used for forward rendering when the view direction is not needed.


**ViewDirectionあり**

```cg:with-view-direction
half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten){}
```

>This function is used in forward rendering when a view direction is needed.


**Deferred rendering**

```cg:deferred-rendering
half4 LightingName_PrePass (SurfaceOutput s, half4 light){}
```

>This function is used when you are using deferred rendering for your project.
node.jsでHTTP POSTのbodyをスキーマレスにMongoDBに格納

node.jsでMongoDBを扱うには [mongoose](http://muddy-dixon.appspot.com/ja/mongoosejs/) をつかうとすごく楽です。しかし、mongooseを使う際にはスキーマを定義しなければいけません。HTTP POSTのbody(JSON形式)のように何が飛んでくるか分からない場合にもスキーマレスにとりあえず突っ込んでおきたいというときには、Schema.Types.Mixed という型を指定してスキーマを作成すれば、何でも格納でき、JSONデータもそのまま格納できます。

環境

* OS: OS X 10.9.4 
* node.js: v0.10.32
* mongoose: v3.8.18
* MongoDB: v2.6.4

下準備：mongooseがなければ、npmでインストールできます。

```
$ npm install mongoose
```

ソース

```js:postreceive-mongo.js
var http = require('http');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var dataSchema = new Schema({ data: Schema.Types.Mixed});
var Data = mongoose.model('data', dataSchema);
mongoose.connect('mongodb://localhost/test');
 
http.createServer(function (req, res) {
  if(req.method=='POST') {
    var body = '';
    req.on('data', function (dat) {
      body +=dat;
    });
    req.on('end',function(){
      var doc = new Data({ data: JSON.parse(body) });
      doc.save(function(err){
        if(err) {
          console.log(err);
        } else {
          console.log(body);
        }
      });
      res.writeHead(200, {'Content-Type':'application/json; charset=utf-8'});
      res.end('{"result":"ok"}');
    });
  }
}).listen(1337, "localhost");
```


[node.js file which saves body of HTTP POST to Mong ...](https://gist.github.com/744c27c930aa1a13b536)


ただし、これだと "data" というキーの値としてJSONデータが格納されるため、階層が1段深くなってしまいます。それが嫌だという方は、mongo driverを使う方法もあるようです。

* [橋本商会 » mongooseにschema関係なくなんでも保存する](http://shokai.org/blog/archives/9187)
静的ライブラリの作り方

メモ書き。

基本的にこのサイトを参考にする
http://www.geocities.jp/neo_ku_ron/HP_NEW/PGTip/UN_StaticLibrary/UN_StaticLibrary.html

＊追記
・stdafx.hのインクルードは「プロジェクト」→「C++」→「詳細設定」→「必ず使用されるインクルードファイル」に記述して強制的に行わせる。

・ライブラリ作成と使用するアプリケーションの動作確認を同時に並列して作業したい。
そのために、運用アプリのソリューションにライブラリのプロジェクトを読み込む。
ソリューション→追加→既存のプロジェクトで「MyLib.vcxproj」を読み込む。

ソリューションに運用アプリプロジェクトとライブラリプロジェクトがある場合に
コンパイル対象を変えたいときがある。
そのときは、プロジェクト→スタートアッププロジェクトに設定で変更できる。
UIDynamicAnimatorを用いた重力と衝突のメモ



起動時にviewが画面下ギリギリでバウンドするアニメーション

```objective-c:ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIDynamicAnimatorDelegate>

// アニメーションするview
@property (nonatomic , strong) IBOutlet UIView *animationView;
@property (nonatomic , strong) UIDynamicAnimator *animator;

@end
```

```objective-c:ViewController.m
#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // self.viewを参照にしたアニメーションの生成
    self.animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    
    // animationViewに重力を設定
    UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:@[self.animationView]];
    // 1.0倍の重力
    gravityBeahvior.magnitude = 1.0;
    // アニメーションに重力を追加
    [self.animator addBehavior:gravityBeahvior];

    
    // 衝突の設定
    UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.animationView]];
    // 参照との境界で境界線を引く
    collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
    // アニメーションに衝突を追加
    [self.animator addBehavior:collisionBehavior];

}

@end
```
PlayJavaで関連性のあるModelの情報をJSON形式で返すとき

# 前提

1対多の関連性のあるモデル(テーブル)の情報を返す。

例）
* Memberモデル(多)
* Groupモデル

## Memberモデル側

```java:Member.java
(省略)

@ManyToOne
@JoinColumn(name = "group_id")
@JsonBackReference  // ←これ必要
public Group group

(省略)
```

## Groupモデル側

```java:Group.java
(省略)

@OneToMany(cascade = CascadeType.ALL, mappedBy = "group", orphanRemoval = true)
@JsonManagedReference  // ←これ必要
public List<Member> member = new ArrayList<Member>();

(省略)
```
MacでPySide + PyInstaller -> 空のqt.confを置く

MacでPySideを使ったPythonプログラムをexe化する時にはまったのでメモ。
Pythonは膨大なライブラリを駆使するスクリプト言語なので、コーディングが爆速になるメリットの一方で、他人にプログラムを渡す時には自分が書いたスクリプト(群)+Pythonインタプリタ本体+依存するライブラリをまとめて一つの実行形式(要はexe)にするという作業(freezeと言ったりする)が必須になります。

Pythonスクリプトをexe化するツール自体は世の中にいろいろあり、[PyInstaller](http://www.pyinstaller.org)は中でも一番シンプルで、githubからV2.1のtagあたりを拝借して、以下のように呼び出せばdist/hoge(.exe)が一瞬でできたりします。

```
python pyinstaller/pyinstaller.py --onefile hoge.py
```


# Qtを使うとはまる

さて、QtのPythonバインディングである[PyQt](http://www.riverbankcomputing.co.uk/software/pyqt/download)や[PySide](http://qt-project.org/wiki/PySide)を使ったスクリプト(群)をexe化する場合はだいたい一発では起動しません。今回Mac10.9でPySideを使ったスクリプトのexe化を試みたところ、pyinstaller.pyによるexe化自体は一発で通ったのですが、いざ実行しようとすると以下のようなエラーが笑えるほど出て、あっさり落ちる状態でした。要はMacにもともと入っているQtとどっちを読めばいいか分からなくなって困っているようです。


```
objc[20102]: Class QCocoaWindow is implemented in both /var/folders/qk/z4x58g2962q21q5570g2hj0c0000gn/T/_MEIftohUI/QtGui and /Library/Frameworks/QtGui.framework/Versions/4/QtGui. One of the two will be used. Which one is undefined.

On Mac OS X, you might be loading two sets of Qt binaries into the same process. Check that all plugins are compiled against the right Qt binaries. Export DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.
```

# touch dist/qt.conf
で、いろいろ情報を漁って最終的にたどり着いた回避方法がqt.confという空のファイルをexeの横に置くというただそれだけ。[こちら](http://stackoverflow.com/questions/11068486/class-abc-is-implemented-in-both-py2app-app-and-system-library-one-of-the-two-w)にあった情報なのですが、遭遇率が高い問題の割にはここ以外で見つけられませんでした。同じことではまることになる方のために記録です。
Elixir Functions Default Parameters

# Elixir Functions Default Parameters

## 概要
Elixir の Functions の Default Parameter について。

多言語で言うところのデフォルト値付きのオプショナル引数。

~~~
def hoge(args, opt1 \\ 2, opt2 \\ 'default') do
  # some logic
end
~~~

オプショナルの性質上、他の関数とのコンフリクトに注意が必要。
詳しくはサンプルコード参照。

## サンプル

~~~
defmodule Hoge do
  def hoge(args, opt1 \\ 2, opt2 \\ 'default') do
    [args, opt1, opt2]
  end
end

IO.inspect Hoge.hoge(1, 3, 'hoge')
IO.inspect Hoge.hoge(1, 3)
IO.inspect Hoge.hoge(1)

# コンパイルエラーになる
# ** (CompileError) iex:6: def hige/1 conflicts with defaults from def hige/2
# defmodule Hige do
#   def hige(args1, args2 \\ 99) do
#     [args1, args2]
#   end

#   def hige(args1, args2) when is_list(args1) do
#     args1
#   end
# end

# 空実装でコンパイルエラーを回避
defmodule Hige do
  def hige(args1, args2 \\ 99)

  def hige(args1, args2) when is_list(args1) do
    [args1, args2]
  end

  def hige(args1, args2) do
    [args1, args2]
  end
end

IO.inspect Hige.hige(1)
IO.inspect Hige.hige(1, 3)
IO.inspect Hige.hige([1, 2], 1)
~~~

* 出力

~~~
[1, 3, 'hoge']
[1, 3, 'default']
[1, 2, 'default']
[1, 99]
[1, 3]
[[1, 2], 1]
~~~
Microsoft Azure WebsiteでExpressを動かす


「Azure SDK for node.js」を使わずに、Visual Studio Online上だけの操作でExpress 4を動かしました。

node.js、Expressのことをよく分かっていないせいだと思いますが、いくつかハマったポイントがあるので、備忘録的に。

##1.Expressのエントリーポイント
Express 4では、作成したアプリのエントリーポイントがbin/wwwになっています。
Azureの細かい動きは把握していませんが、
http://willi.am/blog/2014/05/07/running-express-4-sites-on-azure/
によると、Azureは「package.json」の中にあるエントリーポイントを参照していないようです。
そのため、Azureが最初に探すファイルであるserver.jsに、Express 4のエントリーポイントである
bin/wwwをrequireするコードを記載することで、Expressが動きました。
server.jsのコードは、下記の通り1行だけです。

```javascript:server.js
//sample01フォルダでExpressアプリを作成した場合
require('./sample01/bin/www');
```


##2.server.jsの配置場所
server.jsはAzure Web Siteのホームディレクトリ「D:\home\site\wwwroot」に置きます。
server.jsからbin/wwwを参照してapp.jsに辿り着くイメージでしょうか。

##3.その他参考

・上記にも記載した[ここ](http://willi.am/blog/2014/05/07/running-express-4-sites-on-azure/)が大変参考になりました。ありがとうございました。
・Visual Studio OnlineのConsole上でExpressをインストールする時、今は「npm install express -g」ではなく、
「npm install express-generator -g」なので、ご注意を。公式ドキュメントを読んでいなくて、最初間違えた。。
・なんとなく動作確認時のpackage.jsonを晒しておきます。

```json:package.json
{
  "name": "sample01",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "express": "~4.9.0",
    "body-parser": "~1.8.1",
    "cookie-parser": "~1.3.3",
    "morgan": "~1.3.0",
    "serve-favicon": "~2.1.3",
    "debug": "~2.0.0",
    "jade": "~1.6.0"
  }
}
```


AzureでExpressを動かすのはちょっと一手間かかるようですが、とにかく動きました。
Web Viewで見切れないようにWebページを表示する

ニュースアプリを作成中に気になったのでメモ。Scales Page To Fitをチェックしていても表示が見きれることがある。
![スクリーンショット_2014_11_04_23_12.png](https://qiita-image-store.s3.amazonaws.com/0/58013/7077a65d-f5ba-0bad-b1bd-bf6dfcecde88.png)

この場合、WebViewの画面の制約を加えると上手く表示できた。
![Main_storyboard_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/58013/0a63cea1-a8e3-def9-f451-ffe4633855c0.png)
![スクリーンショット_2014_11_04_23_17.png](https://qiita-image-store.s3.amazonaws.com/0/58013/41e9a984-50dd-273d-d418-79d8ee663c6b.png)

基本だけどScales Page To Fitをチェックしてるのになぜ？ってちょっと詰まったのでメモ

ちなみに、初期設定だとInteractionのMultiple Touchはチェックが外れてる？のでチェックすればピンチイン、ピンチアウトもOK
フォントをインストールする

仕事で自作のセットアッププログラムの中から Windows にフォントをインストールする必要が出てきた。
最近はフォントフォルダにコピーするだけではダメで、レジストリに登録する必要があるみたい。とりあえず見よう見まねでレジストリに登録するようコードを書いてみたけど何故だか上手くいかず、結局、`Shell.Application` をOLEオートメーション（って今でも言うの？）で操作する方法で何とか解決できた。

以下はそのサンプル。

```csharp:sample.cs

var font_path = @"C:\PATH\TO\FONT.TTF";
if (File.Exists(font_path))
{
  Type instanceType = Type.GetTypeFromProgID("Shell.Application");
  dynamic shellApplicaition = Activator.CreateInstance(instanceType);
  dynamic folder = shellApplicaition.Namespace(Path.GetDirectoryName(font_path));
  dynamic folderItem = folder.ParseName(Path.GetFileName(font_path));
  folderItem.InvokeVerb("Install");
}
else
  MessageBox.Show("File not exist");
```
Ansible ～yumモジュール～

Ansible Documentationのyumモジュールの内容のメモです。


# Ansible Documentation

## 概要
yumパッケージマネージャによるパッケージやグループのインストール、アップグレード、削除、一覧表示を実行する。

## オプション
|頻度|パラメータ        |必須|デフォルト値|選択肢                          |説明                                                                                                               |
|:--:|:-----------------|:--:|:----------:|:------------------------------:|:------------------------------------------------------------------------------------------------------------------|
|    |conf_file         |no  |-           |-                               |対象ホストで /etc/yum.conf以外のファイルを使用する場合に指定する                                                   |
|    |disable_gpg_check |no  |no          |yes<br>no                          |パッケージの署名チェックを無効にする                                                                               |
|    |disablerepo       |no  |-           |-                               |無効にするリポジトリを指定する。複数の場合はカンマ区切りで記述する。                                               |
|    |enablerepo        |no  |-           |-                               |有効にするリポジトリを指定する。複数の場合はカンマ区切りで記述する。                                               |
|    |list              |no  |-           |-                               |?                                                                                                                  |
|※  |name              |yes |-           |-                               |パッケージ名を指定する。『state=latest』かつ『name=\*』を指定した場合は『yum -y update』を実行する。URLやローカルパスの指定も可能。|
|※  |state             |no  |present     |present <br> latest <br> absent |present:インストールされていること。<br> latest:最新に更新する。<br> absent:インストールされていない。<br> (※groupinstallの時はlatestだと動かないためpresentを指定すること)             |

## 例
```yaml:example.yml
- name: install the latest version of Apache
  yum: name=httpd state=latest

- name: remove the Apache package
  yum: name=httpd state=absent

- name: install the latest version of Apache from the testing repo
  yum: name=httpd enablerepo=testing state=present

- name: upgrade all packages
  yum: name=* state=latest

- name: install the nginx rpm from a remote repo
  yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present

- name: install nginx rpm from a local file
  yum: name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present

- name: install the 'Development tools' package group
  yum: name="@Development tools" state=present
```



# 参考
- Ansible Documentation  
http://docs.ansible.com/yum_module.html
superを使って継承/Include/Extendしたメソッドをオーバーライド


superは継承だけではなく、include, extendしたメソッドをオーバーライドした場合にも使えるということを知らなかったのでメモ。
ちなみにどのパターンもsuperを明示的に呼び出さなければ単なるメソッドの上書きになる。（PopCorn!!は出力されない）


```rb:super_include.rb
#!/usr/bin/env ruby

module Corn
  def pop
    puts 'PopCorn!!'
  end
end

class Caramel
  include Corn

  def pop
    super
    puts 'PopCaramelCorn!!'
  end

end

c = Caramel.new
c.pop
```

```
% ruby super_include.rb
PopCorn!!
PopCaramelCorn!!
```

```rb:super_extend.rb
#!/usr/bin/env ruby

module Corn
  def pop
    puts 'PopCorn!!'
  end
end

class Caramel
  extend Corn

  def self.pop
    super
    puts 'PopCaramelCorn!!'
  end

end

Caramel.pop
```

```
% ruby super_extend.rb
PopCorn!!
PopCaramelCorn!!
```

```rb:super_succeed.rb
#!/usr/bin/env ruby

class Corn
  def pop
    puts 'PopCorn!!'
  end
end

class Caramel < Corn
  def pop
    super
    puts 'PopCaramelCorn!!'
  end

end

c = Caramel.new
c.pop
```

```
% ruby super_succeed.rb
PopCorn!!
PopCaramelCorn!!
```

# 実行環境

```
% ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
```
CentOS5.4でEPELレポジトリからインストールする時に出たchecksumエラー

yumでEPELからパッケージインストールするときに以下のエラーが出た。

```lang:shellscript
$ yum repolist --enablerepo=epel
...略  [Errno -3] Error performing checksum

```

pythonのhashlibをインストールすると解決できた。

参考)
http://d.hatena.ne.jp/miau/20100404/1270384404
知らいない間にChrome DevToolsのエディタでSublimeでお馴染みなMultiple Selectionができるようになってたヨ

Sublimeと同じく`⌘+D`で出来るでー。

![2014-11-04 21_50_00.gif](https://qiita-image-store.s3.amazonaws.com/0/31639/22a635ce-9b24-ae8f-0f92-f7c9b6b95792.gif)
SPIについて(その2

SPIについて勉強を始めたばかりなので、その2

## プロセス改善サイクル
プロセス改善評価モデルと併用して使われる。
SPIのプロセスを始めるための基本的なフレームワークとなる

**種類**

* [シックス・シグマ](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%82%B7%E3%82%B0%E3%83%9E)
* [統計的工程管理](http://ja.wikipedia.org/wiki/%E7%B5%B1%E8%A8%88%E7%9A%84%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1)
* [PDCA](http://ja.wikipedia.org/wiki/PDCA%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB)
* [IDEAL](http://www.sei.cmu.edu/library/assets/idealmodel.pdf)
* [総合的品質マネジメント](http://ja.wikipedia.org/wiki/TQM)
* 総合的生産性マネジメント
* 総合的コスト・マネジメント
* 総合的ビジネス・マネジメント

## プロセス改善評価モデル
プロセス改善サイクルと併用して使われる
組織が改善に向けて、活用すべき分野を特定するための手助けとして組み込まれる

**種類**

* [ISO9001](https://www.jqa.jp/service_list/management/service/iso9001/)
* [TL9000](https://www.jqa.jp/service_list/management/service/tl9000/)
* BOOTSTRAP 
* TRILLIUM
* [マルコムボルドリッジ賞](http://www.jmrlsi.co.jp/mdb/yougo/my08/my0850.html)
* [SPICE](http://ja.wikipedia.org/wiki/ISO/IEC_15504)
* [能力成熟度モデル](http://ja.wikipedia.org/wiki/%E8%83%BD%E5%8A%9B%E6%88%90%E7%86%9F%E5%BA%A6%E3%83%A2%E3%83%87%E3%83%AB%E7%B5%B1%E5%90%88)
[Swiftメモ]PlaygroundでJSon使用

たのしいSwiftプログラミングを一通り読みました。
忘れる内にメモしよう！

```lang:MyPlayground.playground
// Playground - noun: a place where people can play

import Foundation
import XCPlayground

var urlString = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://rss.dailynews.yahoo.co.jp/fc/rss.xml&num=8"
var url = NSURL(string: urlString)!

var task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data,response,error in
    var dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
    var responseData = dict["responseData"] as NSDictionary
    var feed = responseData["feed"] as NSDictionary
    var entries = feed["entries"]as NSArray
    for entry in entries {
        println(entry["title"])
    }
})
task.resume()

XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)
```
```lang:出力結果
Optional(米中間選挙の投票開始 焦点は)
Optional(両親殺害 危険ドラッグ使用か)
Optional(犯罪者扱い 予算委で首相激高)
Optional(震災被災児 ぜんそく発症2倍)
Optional(映像 西日本を飛んだ「火球」)
Optional(韓国で日本代表狙う重戦車FW)
Optional(G相川獲りに一岡のトラウマ)
Optional(西川貴教「風」イメージ不満)
```
【メモ】invalid gem: package is corrupt, exception while verifying:~が出たので。


nokogiriをインストールしようとしてコケたので

- rvm 1.26.0
- ruby-2.1.4


```
$ gem install nokogiri
ERROR:  Error installing nokogiri:
	invalid gem: package is corrupt, exception while verifying: undefined method `size' for nil:NilClass (NoMethodError) in /Users/noriyo_tcp/.rvm/gems/ruby-2.1.4/cache/nokogiri-1.6.3.1.gem
```


参考記事：  
http://stackoverflow.com/questions/20888318/error-install-rubyracer-with-error-invalid-gem-package-is-corrupt

いったんcache以下を削除して入れ直せと。

```
$ rm /Users/noriyo_tcp/.rvm/gems/ruby-2.1.4/cache/nokogiri-1.6.3.1.gem
$ gem install nokogiri
```
AWKの連想配列に潜むワナ

# 読んでいるだけ、のつもりが……

> 連想配列の値を読んで、使っていない変数に代入する……。

一見無害のように見えますが、AWKの場合、連想配列の内容を書き換えてしまうことになります。

# 実例を見てみる

では、実際にコードを見てみましょう。

```bash:awk_test.sh
#! /bin/sh

awk '
BEGIN{
  split("", array);    # 連想配列を初期化(要素数0にする)
  print length(array); # 要素数は当然"0"と表示されますよね。

  print array["hoge"]; # だから"hoge"なんて要素を表示しようとしても当然空です。

  print length(array); # もう一度要素数を見てみましょう。
}'

# POSIXなAWK(配列に対するlength関数の無いAWK)をお使いの方は
# 下記の行を追記し、上記の"length"を全て"arlen"に書き換えてください。
function arlen(ar,i,l){for(i in ar){l++;}return l;}
```

さてこのコード、実行したらどうなると思いますか？最初の行に0が表示され、次の行は空行で、その次の行にまた0が表示されると思いますよね。ところが、そうはならないんです。

```bash:実行結果
$ ./awk_tesh.sh
0

1
$ 
```

なんと！要素を読んだだけで要素数が増えてしまいました。

# AWKの連想配列の仕様

実はAWKの連想配列には次のような仕様が存在します。

> AWKは、連想配列Aの中に存在しない要素"e"を読むと、その瞬間に中身が空の要素"e"が追加される。

というわけでお取扱いにはご注意を。
GitHubにSSH接続できるようにする方法

## 流れ
1. SSH認証の公開鍵と秘密鍵を作成
- Mac側（クライアント側）へのSSHキーの設定
- GitHubへの公開鍵の登録
- ローカルリポジトリの設定を変更する
- (おまけ)SourceTreeユーザーの方

## 1. SSH認証の公開鍵と秘密鍵を作成
```
$ cd ~/.ssh
$ ssh-keygen -t rsa -C test@example.com //←自分のメールアドレス
```

これによって鍵ができます
id_rsa : 秘密鍵
id_rsa.pub : 公開鍵

### 秘密鍵のパーミッションを強化する
```
$ chmod 600 id_rsa
```

## 2. Mac側（クライアント側）へのSSHキーの設定
鍵の管理を簡単にするために、~/.ssh/configに設定を追加します

```
$ vim ~/.ssh/config
```
末尾に以下を追加します

```
Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
```


## 3. GitHubへの公開鍵の登録
GitHubにブラウザでアクセス。左側メニューのSSH Keys → Add key を選択します。

以下のコマンドを実行して、Key項目に貼り付けます。

```
$ pbcopy < ~/.ssh/id_rsa.pub
```


項目を入力する。
Title: id_rsa.github.com.pub
Key: 上記コンソール実行後のクリップボードを貼り付け


最後にこれを実行して、確認します。

```
$ ssh -T git@github.com
```

## 4. ローカルリポジトリの設定を変更する
リポジトリの設定ファイルを開き、URLの項目をgit@...からはじまるSSH接続方式に変更します。以下参照。

```mysite/.git/config
×(NG) url = https://github.com/{アカウント名}/{リポジトリ名}.git
◯(OK) url = git@github.com:{アカウント名}/{リポジトリ名}.git
```

※SSH接続のURLはGitHubのサイト上のリポジトリのページの右下からも確認できます。
![スクリーンショット_0026-11-04_午後7_50_36.png](https://qiita-image-store.s3.amazonaws.com/0/18614/56097a26-6a6d-b084-5fe0-d37532ef04c6.png)



### SourceTreeユーザーの方
メニューから「リポジトリ > リポジトリ設定」を選択。

![スクリーンショット 0026-11-04 午後7.34.29.png](https://qiita-image-store.s3.amazonaws.com/0/18614/59dc9ae1-b33e-7028-233d-ce273bd50cd3.png)

パスの項目を選択し、編集をクリック。git@から始まるSSH接続方式に変更してOKをクリック。
![スクリーンショット_0026-11-04_午後7_34_40.png](https://qiita-image-store.s3.amazonaws.com/0/18614/34b4584b-5ee0-8a12-09a0-35d7a1fb84b8.png)



完了。
Gitローカル変更の無視をSourceTreeからも

設定ファイルがリポジトリに入っていて、開発環境で動かすときにはそのファイルが発効するので必要に応じて書き換えたいんだけどgitに（SourceTreeに）変更と認識されてしまいたくない、とかいう場面ってあります。

[既に git 管理しているファイルをあえて無視したい - Qiita](http://qiita.com/usamik26/items/56d0d3ba7a1300625f92)

この記事の通り、

* ローカル変更を無視する git update-index --assume-unchanged
* ローカルファイルをリポジトリ管理から切り離す git update-index --skip-worktree

というコマンドがGitには用意されています（前者と後者の違いは、リポジトリ側で変更があったときに実ファイルに反映されるかです。後者なら反映もされません）。
でも開発体制によってはわりと頻繁に使いそうなこの機能、SourceTreeに組み込んで右クリックからすぐ呼べるようにしてみましょう。

以下のカスタム操作の定義ファイルを、Windowsなら AppData\Local\Atlassian\SourceTree 以下の customactions.xml とマージしてください。

```xml:customactions.xml
<?xml version="1.0"?>
<ArrayOfCustomAction xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CustomAction>
    <Caption>ローカルで管理対象外に</Caption>
    <OpenInSeparateWindow>false</OpenInSeparateWindow>
    <ShowFullOutput>false</ShowFullOutput>
    <Target>git</Target>
    <Parameters>update-index --skip-worktree $FILE</Parameters>
  </CustomAction>
  <CustomAction>
    <Caption>管理対象に戻す</Caption>
    <OpenInSeparateWindow>false</OpenInSeparateWindow>
    <ShowFullOutput>false</ShowFullOutput>
    <Target>git</Target>
    <Parameters>update-index --no-skip-worktree $FILE</Parameters>
  </CustomAction>
  <CustomAction>
    <Caption>ローカル変更を無視</Caption>
    <OpenInSeparateWindow>false</OpenInSeparateWindow>
    <ShowFullOutput>false</ShowFullOutput>
    <Target>git</Target>
    <Parameters>update-index --assume-unchanged $FILE</Parameters>
  </CustomAction>
  <CustomAction>
    <Caption>ローカル変更の無視を解除</Caption>
    <OpenInSeparateWindow>false</OpenInSeparateWindow>
    <ShowFullOutput>false</ShowFullOutput>
    <Target>git</Target>
    <Parameters>update-index --no-assume-unchanged $FILE</Parameters>
  </CustomAction>
</ArrayOfCustomAction>
```
【CakePHP】自作コンポーネント

##使い方
app/Controller/Component配下にComponentクラスを継承したクラスを作成する。

```php
<?php

//読み込み忘れずに
App::uses('Component', 'Controller');

//クラス名にはComponentをつける
class FooComponent extends Component {

  public function bar($one,$two){
    return $one + $two;
  }
}
```

通常のComponent同様、コントローラーから使用できる。
$componentsに使用するコンポーネントを定義する。「$this->コンポーネント名->メソッド」で呼び出す。
（定義する際も、呼び出す際もクラス名からComponentを除いて記述する。）

```php
<?php
App::uses('AppController', 'Controller');

class HogesController extends AppController {
  public $components = ['Foo'];

  public function index(){
    $res = $this->Foo->bar(5,9);
  }
  
```

##各種のコールバック
initialize()もしくは、startup()でControllerを取得してアクセスすると便利。
RequestクラスやControllerのさまざまなメソッドが利用できる。

```php
class HogeComponent extends Component {

  public $controller;
  public $request;

  //beforeFileterの前に実行される
  public function initialize(Controller $controller){

  }

  //beforeFileterの後に実行される
  public function startup(Controller $controller){
    $this->controller = $controller;
    $this->request = $controller->request;
  }

  //beforeRenderの前に実行される
  public function beforeRender(Controller $controller){
    
  }

  //afterRenderの後に実行される
  public function shutdown(Controller $controller){
    
  }
}
```

##コンポーネントからモデルを使用する

```php
$HogeModel = ClassRegistry::init('HogeModel');
$data = $HogeModel->find('all');
```

##コンポーネント内で他のコンポーネントを使う
コントローラーと同じ方法でコンポーネントを使うことができる。
用意されているコンポーネントも自作コンポーネントも使える。

```php
public $components = array('Auth');

public function hoge() {
  $user = $this->Auth->user();
}
```

ただし、コンポーネント内から使われるコンポーネントのコールバック関数は実行されない。

参考：[コンポーネントの中で他のコンポーネントを使用する](http://book.cakephp.org/2.0/ja/controllers/components.html#id7)
boot2dockerの環境変数を一発で設定する

boot2dockerが新しくなって`DOCKER_HOST`だけではなく，`DOCKER_CERT_PATH`や`DOCKER_TLS_VERIFY`など設定するべき環境変数が増えた．

boot2dockerはこれらを一発で設定するコマンドを準備している．

```bash
$(boot2docker shellinit)
```

boot2dockerもまだまだ新しくなっているので，環境変数を`.zshrc`等に直接書くのではなく，このコマンドを書いておくのがよい．以下のように書いている．

```bash:.zshrc
if [ "`boot2docker status`" = "running" ]; then
    $(boot2docker shellinit)
fi
```