OmniAICreator/Qiita-1.07M huggingface dataset:
バイナリファイルをシーケンスとして読む


バイナリファイルを開いて内容をシーケンスで扱う方法を考えます。

# Java標準ライブラリを使う

```clojure
(defn read-as-byte-buffer [filename]
   (with-open [fis (java.io.FileInputStream. filename)]
     (let [channel (.getChannel fis)
           byte-buf (java.nio.ByteBuffer/allocate (.size channel))] 
       (.read channel byte-buf)
       byte-buf)))
```

返り値は[java.nio.ByteBuffer](https://docs.oracle.com/javase/jp/8/api/java/nio/ByteBuffer.html)で返ってきます。あとは次のようにしてやればシーケンスとして扱える。

# シーケンスに変換

```clojure
(defn byte-buf->seq [byte-buf]
  (for [idx (range (.limit byte-buf))]
    (.get byte-buf idx)))
```

# 確認

なにか適当なファイルをこの方法で読んでみます。

```clojure
; echo "hello clojure" |gzip -c > hello.txt.gz
(def bb (read-as-byte-buffer "hello.txt.gz"))
(def bs (byte-buf->seq bb))
(take 10 bs)
;=> (31 -117 8 0 74 81 -59 85 0 3)
(map #(format "%02x " %) (take 16 bs))
;=> ("1f " "8b " "08 " "00 " "4a " "51 " "c5 " "55 " "00 " "03 " "cb " "48 " "cd " "c9 " "c9 " "57 ")
```

```bash
$ od -t x1 hello.txt.gz
0000000    1f  8b  08  00  4a  51  c5  55  00  03  cb  48  cd  c9  c9  57
...
```

どうやらちゃんと読めているみたいですね。


# 注意

Javaのbyte型は8ビットの **符号付き** 整数です。0〜255だと思ってるとハマるので注意。

# Java触りたくない！

[clojurewerkz/buffy](https://github.com/clojurewerkz/buffy) というライブラリがあります。 _Buffy The ByteBuffer Slayer_ という力強いスローガンが掲げられているので触ってみると良いんじゃないでしょうか。

READMEをざっと読むとバイナリフォーマットを定義してClojureオブジェクトに対応させてシリアライズ、など出来るようです。
私の用途ではそれほど複雑なフォーマットを必要としていないので上記コードで十分ですが、そのうち試してみるかも。


おわり。
【MySQL】２番目の主キーにauto_incrementしたい

そういえば、複数主キーの構成の時に２番目以降の主キーにauto_incrementしたいときってどうするんだっけー！？となってネットを調べたけど思うように当たらなかったので、残しておきます。

```
CREATE TABLE IF NOT EXISTS `mydb`.`table1` (
  `id` INT NOT NULL COMMENT '',
  `id2` INT NOT NULL AUTO_INCREMENT COMMENT '',
  PRIMARY KEY (`id2`, `id`)  COMMENT '')
ENGINE = InnoDB
```

idとid2の順番は変えたくないけど、id2にauto_incrementしたいという場合です。
例えば、
納品書がぺらっとあって、明細がずらーっと並ぶパターンです。

id：納品書番号
id2：明細番号

として、id2の明細番号を採番する場合です。
ただし、明細番号は納品書番号ごとに１から繰り返さなくてもいいから、一つの納品書番号で明細が複数持てればOKという感じです。

このとき、普通、

```
PRIMARY KEY (`id`, `id2`) 
```
と上から順に主キーを並べるけれど、

```
PRIMARY KEY (`id2`, `id`) 
```

とauto_incrementする主キーを最初に持って来ればOKです。

はー、スッキリ。
Swiftでプロトコル指向プログラミング

#プロトコルはクラスや構造体の根本的な定義を宣言するための機能です。#
そのためプロトコルだけでの実装はできません。プロトコルを宣言したらそれをクラスで適合させます。

```swift

import Foundation

//プロトコルを定義
protocol FooProtocol {
    var foo: String { get }
    func goo()
}
//クラスでプロトコルを適合
class test : FooProtocol{
    var foo = "bye!"
    func goo (){
    }
}

```
プロトコルを適合したクラス（又は構造体）はプロトコルに書いてあることを含んでいないと「Type "test" does not comform to protocol "FooProtocl" (クラスがプロトコルに適合していません)」というエラーがでます。

またプロトコルは拡張ができます。

```swift

import Foundation

protocol FooProtocol {
    var foo: String { get }
    func goo()
}

extension FooProtocol {
    func goo(red :Int, green :Int, blue :Int) -> String {
        return String(red, green, blue)
    } 
}

class test : FooProtocol{
    var foo = "bye!"
    func goo(){}
}

var aClass = test()

print(aClass.foo) //bye!

```
protocolでは直接メソッドを定義できないため（メソッド名と引数、戻り値の型だけ指定）、extension中で行う必要があります。

```swift
import Foundation


struct EqualCheck<T: SignedNumberType> {
    let aaa: T
    let bbb: T
}

extension EqualCheck: Equatable {}

func ==<T>(lhs: EqualCheck<T>, rhs: EqualCheck<T>) -> Bool {
    return lhs.aaa == rhs.aaa && lhs.bbb == rhs.bbb
}

let a = EqualCheck<Double>(aaa: 1.0, bbb: 2.0)
let b = EqualCheck<Double>(aaa: 1.0, bbb: 2.0)

a == b // true
a != b // false

```

Swift標準ライブラリにあるプロトコルEquatableを使った例です。
Equatableによりvalueの比較をする実装が求められます。

クラスで継承を行うよりもプロトコルの宣言を行い、それを使ってクラスや構造体を組み立てる方が実装に規則性がありクリーンになるかもしれません。

[WWDC2015](https://developer.apple.com/videos/wwdc/2015/?id=408)においてもプロトコル指向プログラミングの有用性が発表されていましたね。
sublime text3で日本語入力変換が機能しない場合の解消３ステップ

# 環境
- mac os x
- sublime text3
- google日本語入力

# 事象
mac OS X で sublime text3を使っていて、
日本語を入力したときに、変換候補がでてきますが、
その変換が選択できない。

# 対応
とりあえず、以下を行って解決はされました。
なお、設定される際は、ご自身の判断でお願いします。

1. メニュー SublimeText -> Preferences -> Key Bindings – Default
2. defaultを編集するのですが、コメントできない状態（書き込めない）ため、いったん、save as で以下に保存します。

```   
/Users/ユーザ名/Library/Application Support/Sublime Text 3/Packages/Default/Default (OSX).sublime-keymap
   * Defaultというフォルダがなかったので作成します。
```

3. 100行目付近の以下をコメントアウトする

```
	// { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
	// { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
	// 	"context":
	// 	[
	// 		{ "key": "setting.tab_completion", "operator": "equal", "operand": true },
	// 		{ "key": "preceding_text", "operator": "regex_match", "operand": ".*[^0-9]$", "match_all": true },
	// 	]
	// },
```

上記設定後、sublime text3 を終了(command + Q)させてから、再度sublime text3を開くと、tabキーで日本語変換が選択できるようになります。

good luck!
Vagrant+Movable Type+AWS S3を使って月額10円～でサイトを運用する　～サンドボックス編～

# 目次
* [導入編](http://qiita.com/histori/items/34174e4ff17731980ee5)
* サンドボックス編
* [コマンドラインから配信編](http://qiita.com/histori/items/981268f475044cc42561)

# 概要
MovableTypeのシステム設定や環境変数、テンプレートを変更したけど、イマイチだったりする時に元の状態に戻す方法

# 手順
## Vagrantのサンドボックスプラグインをインストールする
「MT」フォルダに移動する
`$ cd MT`
サンドボックス用のプラグインをインストールする
`$ vagrant plugin install sahara`
ちゃんとインストールされているか確認する
`$ vagrant plugin list`

## Movable Typeに変更を加える
サンドボックスモードに切り替える
`$ vagrant sandbox on`
仮想マシンを立ち上げる
`$ vagrant up`
サンドボックスの状態を確認する
`$ vagrant sanbox status`

Movable Typeに変更を加える

* 変更がいまいちだった場合→(1)元の状態に戻す
* 変更を気に入った場合　　→(2)変更を反映する

## (1)元の状態に戻す
`$ vagrant sandbox rollback`

## (2)変更を反映する
`$ vagrant sandbox commit`

## サンドボックスモードを終了する
`$ vagrant sandbox off`
仮想マシンをシャットダウンする
`$ vagrant halt`
ファイル同期にunison使ってみた

## 参考

* [Unison File Synchronizer - User Manual and Reference Guide](http://ftp.yz.yamagata-u.ac.jp/pub/Linux/momonga/6.0/Everything/SOURCES/unison-2.27.149-manual.html)

## 使い方

それぞれのPCにunisonをインストールしておく。

```bash:
sudo apt-get install -y unison
```

## 設定ファイル記述

```~/.unison/vimrc.prf
# コピー元ファイルのタイムスタンプも一緒にコピーする
times = true

# 新しいファイルを優先
prefer = newer

# ルート・ディレクトリの指定。同期の際に最上位となるディレクトリを設定する。
root = /home/User1/
root = ssh://server1//home/User1/

# 同期したいディレクトリやファイル名を指定する
path = .vimrc

# 無視するディレクトリやファイル名を指定する。
#ignore = Name .*~ 
```

## 実行

```bash:
unison vimrc -batch
```

/home/User1/.vimrc が同期されることを確認。

socketも使えるので任意のポートで待ち受けさせてもよい。
(sshが入っていない環境=windowsに便利)

## 確認が出た場合

* `?`でどういう選択肢があるか表示。
shift命令は引数を1つ削るので、既存スクリプトのフロントエンド作るのに便利

## サンプル

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

if [ $1 == "sub1" ];then
  shift
  ~/bin/sub1.sh $@
elif [ $1 == "sub2" ];then
  shift
  ~/bin/sub2.sh $@
else
  echo "\$1の指定が間違っています。"
  exit 1
fi
```

```bash:sub1.sh
echo $1 $2
```

```bash:sub2.sh
echo $1 $2
```

## 使い方

```bash:
$ ./toolbox.sh sub1 arg1 arg2
$ ./toolbox.sh sub2 arg1 arg2
```

shift命令は引数を一つ削る。
こうしておくと、sub1.sh、sub2.shを直接実行もできるし、
toolbox.shから上記のように実行もできる。
trap > c++ builder XE4, 10.2 Tokyo > TComboBoxのテキストがクリアされない問題

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

TComboBoxではまったのでメモ。

##現象
デザイン時(オブジェクトインスペクタ内の設定)

```
- ItemIndex = -1
- Text = L"ComboBox1"
- Items = "AAA,BBB,CCC"
```

この状態でフォームを開くとTComboBoxの表示は「ComboBox1」となっている。

その状態でコードにてItemIndex = -1を代入しても表示は「ComboBox1」のまま。

コードで一度ItemIndex = 0;とした後にItemIndex=-1とすると表示は「」（クリアされる）。

##はまった点
ItemIndex==-1なのに、表示はリスト内の別の文字列(Textの文字列)になっていた。
処理でItemIndex=-1を代入してもやはり同じだった。

##分かったこと
1. ItemIndex==-1の時、Textで指定された文字列が表示されている。
2. コードにてItemIndexに既存の設定値(-1)と同じ値を代入しても表示は変更されない(Textがクリアされない)。

##対処方法
ItemIndex==-1を初期値として使う場合、フォームデザインにてItemIndex=5; ItemIndex=-1とする。
こうするとTextがクリアされ、かつItemIndex==-1の設定が確実になる。
【AWS】半額で受験！ソリューションアーキテクト・プロフェッショナル



どうも、千葉です。

突然ですが、ソリューションアーキテクト・プロフェッショナルを半額で受験できます。
割引、安いですね。
色々制限はありますが、お得なのでタイミング合えば利用する手はないと思います。

# 半額になる条件
* アソシエートを取得していること
* アソシエート取得から１年経過すること

アソシエート取得してから１年立つと、メールでプロフェッショナルが半額になるバウチャーが送られてくるそうです。
アソシエート取得してからもう少しで１年立つ！というこ方は、こちらを利用したほうがかなりお得なので是非検討してみてください。

上記は2015年8月1日から、再認定制度が導入され、それに付随する？ものです。
話は変わりますが再認定は、オンライン（試験会場行かないで家でやる）でできそうですね。
今のところ再認定はアソシエートのみで、8100円で受験可能です。

# まとめ
アソシエイト取得してから２年立つ前に、更新しましょう！
または、プロフェッショナルを取得しましょう！
バウチャーを積極的に活用して安く済ませましょう！

参考：http://aws.amazon.com/jp/certification/recertification/
WebAudioAPIを使っているはずなのに、マナーモードで音が出る！？



## 起きている問題
WebAudioAPI が HTML Audio に比べて便利な点の１つに、
iPhoneのマナーモード時にちゃんと消音してくれる、というのがあります。

しかし、最近の iOS Safari もしくは WebAudioAPI の仕様変更により、
WebAudioAPIを使っていても、状況によってはマナーモードでも
音が鳴ってしまう事態が起きているようです。

SoundJS, boombox.js, howler.jsといったWebAudioAPIをサポートしている
有名ドコロのライブラリは、現状全てiPhoneのマナーモード時でも
音が鳴ってしまうようになっています。

これではユーザーフレンドリーな実装ができません。

## 原因究明・解決
ライブラリを使わずに生の WebAudioAPI を普通に再生する分には、マナーモード時に正しく消音されることを確認できたので、
ライブラリの中に何か原因があるようでした。

調査した結果、どうやら
**HTML Audio、もしくはHTML Videoをページ内で1つでも使用していた場合、
そのページでは WebAudioAPI の音がマナーモード時にも鳴ってしまう**
ということが判明しました。

上記のライブラリは、いずれも フォールバック用やcanPlayType等のメソッドを使うために、HTML Audio を生成していたので、
マナーモード時に音が鳴る問題が発生していたようです。

従って、ライブラリの内容を改変し、WebAudioAPI非サポート端末の場合のみ、
HTML Audioを生成する手順にすることで、マナーモード時に正しく消音するように
改良することができるはずです。
技術英語 > I'll give you a hand.

@ Start Trek Voyager > エピソード: Eye of the needle.

作業を始めようとしてキムに対してトレスが言った言葉。

> I'll give you a hand. (手伝ってあげる)

I'll help you. 
ばかりだと単調になりそうな時に使えばよさそう。

<hr>

giveに関連して思い出したのは

It doesn't hurt to give it a try.
[TS-7553](メモ) ntpclientのビルド (busybox向け)


## ntpclient
* Web site
http://doolittle.icarus.com/ntpclient/
* 今回使用したファイル
http://doolittle.icarus.com/ntpclient/ntpclient_2000_339.tar.gz
*  Makefileの変更点

```shell-session:Makefile
...
CC=/opt/ts7553/arm-uclibc-3.4.6/bin/arm-linux-gcc 
CFLAGS=-march=armv4 -Os -fPIC
LDFLAGS=-static

CFLAGS += -Wall -O
..
```
* ビルド後、strip 


CC=/opt/ts7553/arm-uclibc-3.4.6/bin/arm-linux-gcc
CFLAGS="'-march=armv4 -Os -fPIC"
LDFLAGS=-static
【Swift】UITextViewでキャレットの位置を現在の位置から任意数分移動させる

Swiftでのキャレット操作の記事が見つからなかったのでメモ

キャレット位置を現在の位置から指定分ずらすメソッドを拡張してみた。

```lang:UITextView+CaretExtension.swift
import UIKit

extension UITextView {
    
    /**
    現在のキャレットの位置をoffset分ずらす
    
    :param: offset Int ずらす量 
    
    :returns: bool 成功か失敗 
    */
    func changeCaret(offset:Int) -> Bool {

        // 全角文字を確定状態にする
        let nowText = self.text
        self.text = nowText

        if let range = self.selectedTextRange {
            let position = self.positionFromPosition(range.start, offset: offset)
            
            self.selectedTextRange = self.textRangeFromPosition(position, toPosition: position)
            
            return true
        }

        return false
    }
}
```

使い方

```lang:ViewController
// 4つ分前の位置にキャレットを持っていく
textView.changeCaret(-4)
```

boolで返す必要ないか？
PostgreSQLのUPSERT方式の簡易性能比較

# 結果
PostgreSQLの3つのUPSERT方式の簡易性能検証の結果は以下のとおり。

| 方式 | 100万件のUPSERT時間 | 説明 |
|-----|-------------------:|-----|
| INSERT失敗時UPDATE | 43.6 秒 | INSERTを試み、ユニーク制約違反で失敗時にはUPDATEを実行する関数を使ったUPSERT |
| UPDATE失敗時INSERT | 26.7 秒 | UPDATEを試み、更新件数が0件のときにはINSERTを実行する関数を使ったUPSERT |
| INSERT ON CONFLICT | 8.1 秒 | 9.5 からサポートされるINSERT ON CONFLICT構文によるUPSERT |

# 検証方法
* 端末上で以下を実行

```bash
# UPSERT対象テーブルのベースになる100万件のpgbench_accountsテーブルを作成
$ pgbench -i -s 10 --unlogged-table
```

* psqlで以下を実行

```plpgsql
-- psqlの時間計測機能を有効化
\timing on

-- 100万件のpgbench_acountsテーブルから50%のデータをランダムに削除
DELETE FROM pgbench_accounts WHERE aid IN
  (SELECT aid FROM pgbench_accounts TABLESAMPLE BERNOULLI(50));
VACUUM ANALYZE pgbench_accounts;

-- INSERT失敗時にUPDATEを実行するUPSERT関数を定義
CREATE OR REPLACE FUNCTION upd_if_ins_fails
  (myaid INT, mybid INT, myabalance INT, myfiller CHAR(84))
  RETURNS void AS $$
BEGIN
  INSERT INTO hoge
    VALUES (myaid, mybid, myabalance, myfiller);
EXCEPTION WHEN unique_violation THEN
  UPDATE hoge
    SET bid = mybid, abalance = myabalance, filler = myfiller
    WHERE aid = myaid;
END;
$$ LANGUAGE plpgsql;

-- 0件UPDATE時にINSERTを実行するUPSERT関数を定義
CREATE OR REPLACE FUNCTION ins_if_no_upd
  (myaid INT, mybid INT, myabalance INT, myfiller CHAR(84))
  RETURNS void AS $$
BEGIN
  UPDATE hoge
    SET bid = mybid, abalance = myabalance, filler = myfiller
    WHERE aid = myaid;
  IF FOUND THEN
    RETURN;
  END IF;
  INSERT INTO hoge
    VALUES (myaid, mybid, myabalance, myfiller);
END;
$$ LANGUAGE plpgsql;

-- UPSERT対象のテーブルhogeをpgbench_accountsからコピー作成
DROP TABLE hoge;
CREATE UNLOGGED TABLE hoge AS SELECT * FROM pgbench_accounts;
ALTER TABLE hoge ADD PRIMARY KEY (aid);

-- UPSERT検証をautovacuumやCHECKPOINTが邪魔しないようにする
VACUUM ANALYZE hoge;
CHECKPOINT;

-- 100万件UPSERTの時間計測その1
SELECT upd_if_ins_fails (num, 9, 99, 'UPSERT') FROM generate_series(1, 1000000) num;

-- 100万件UPSERTされたことを確認
SELECT count(*) FROM hoge WHERE bid = 9;

-- UPSERT対象のテーブルhogeをpgbench_accountsからコピー作成
DROP TABLE hoge;
CREATE UNLOGGED TABLE hoge AS SELECT * FROM pgbench_accounts;
ALTER TABLE hoge ADD PRIMARY KEY (aid);

-- UPSERT検証をautovacuumやCHECKPOINTが邪魔しないようにする
VACUUM ANALYZE hoge;
CHECKPOINT;

-- 100万件UPSERTの時間計測その2
SELECT ins_if_no_upd (num, 9, 99, 'UPSERT') FROM generate_series(1, 1000000) num;

-- 100万件UPSERTされたことを確認
SELECT count(*) FROM hoge WHERE bid = 9;

-- UPSERT対象のテーブルhogeをpgbench_accountsからコピー作成
DROP TABLE hoge;
CREATE UNLOGGED TABLE hoge AS SELECT * FROM pgbench_accounts;
ALTER TABLE hoge ADD PRIMARY KEY (aid);

-- UPSERT検証をautovacuumやCHECKPOINTが邪魔しないようにする
VACUUM ANALYZE hoge;
CHECKPOINT;

-- 100万件UPSERTの時間計測その3
INSERT INTO hoge SELECT num, 9, 99, 'UPSERT'
  FROM generate_series(1, 1000000) num
  ON CONFLICT (aid) DO UPDATE
  SET bid = EXCLUDED.bid,
          abalance = EXCLUDED.abalance,
          filler = EXCLUDED.filler;

-- 100万件UPSERTされたことを確認
SELECT count(*) FROM hoge WHERE bid = 9;
```
[WIP]Unity5 3D/2Dゲーム開発実践入門　作りながら覚えるスマートフォンゲーム開発


書籍を購入したので、気に入った点を適当にあげていく。

## タイトル
[Unity5 3D/2Dゲーム開発実践入門　作りながら覚えるスマートフォンゲーム開発](http://www.amazon.co.jp/gp/product/4883379671?ie=UTF8&camp=1207&creative=8411&creativeASIN=4883379671&linkCode=shr&tag=neira-22)

## ここが気に入った
* 紙質がよさげ
* 裏表紙にCONTENTSが書いてあって、見たい所に飛びやすくて好き
* C#で記述してあるのが素敵（C#の文法解説があるわけじゃないよ）
* 目次が章毎に色が異なりカコイイ
* 全ページカラー！


読みかけ
[MongoDB .NET Driver] Find & FindAsync sample

##Driver & Environment & Initialization & Mapping Class
請參考
[[MongoDB .NET Driver] Indexes.CreateOneAsync sample](http://qiita.com/SHUAI/items/f9479f2c1a09bbd7e36b)

##Single Filter
假設已知PersonId
查詢此Member資料寫法如下

```csharp
var filter = Builders<Member>.Filter.Eq<string>(m => m.PersonId, id);
var member = db.GetCollection<Member>(colName).Find(filter).FirstOrDefaultAsync().Result;
```

##Projection
同上範例
但是查詢結果只需要此Member的Phone資料寫法如下

```csharp
var filter = Builders<Member>.Filter.Eq<string>(m => m.PersonId, id);
// 預設會傳回_id欄位, 所以排除掉
var projection = Builders<Member>.Projection.Exclude(m => m.Id).Include(m => m.Phone);
var doc = db.GetCollection<Member>(colName).Find(filter).Project(projection).FirstOrDefaultAsync().Result;
var phone = BsonSerializer.Deserialize<string>(doc.Values.ElementAt(0).ToJson());
```

##Compose Filter
假設需要查詢某地區特定性別的Member們
每次批次取得5000筆
寫法如下

```csharp
var builder = Builders<Member>.Filter;
var filters = new List<FilterDefinition<Member>>();

filters.Add(builder.Eq(m => m.ZipCode, zipCode));
filters.Add(builder.Eq(m => m.Gender, gender));

IAsyncCursor<Member> cursor = db.GetCollection<Member>(colName).FindAsync(builder.And(filters), new FindOptions<Member>() { BatchSize = 5000 }).Result;

List<Member> members = new List<Member>();
while (cursor.MoveNextAsync().Result)
{
    members.AddRange(cursor.Current);
}
```
言語解析からネガ・ポジをとって、DBにおさめる（エクシング社言語解析API利用）

言語解析APIを利用して、DBに保存していけばユーザー分析に使えるのではないか？と思い作ってみた。

今回使う言語解析APIは[エクシング社](https://lr.capio.jp/services/webapis/)を活用、ネガポジくらいなら取れる。
DBには[ニフティクラウドmobilebackend](http://mb.cloud.nifty.com/)を活用
また、APIを叩く基盤として[monaca](https://ja.monaca.io/)を利用した.

やることは以下
・エクシング社　言語解析APIをJavaScriptで叩く
・上記の結果をニフティクラウドmobile backendに保存

以下コード

```html:index.html
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/styles.css">
    <script src="js/ncmb-latest.min.js"></script>
    <script src="js/cssua.min.js"></script>
    <script src="js/app.js"></script>
    
</head>
<body>
    <div data-role="page" id="list-page">
        <div data-role="header" data-position="fixed" data-theme="c">
            <h1>XING！</h1>
            <input id="search-button" type="button" value="Search" onclick="XINGApi()">
        </div>
        <div data-role="content">
            <ul data-role="listview" data-inset="true" id="x-list"></ul>
        </div>
    </div>
</body>
</html>
```

```js:app.js
var xhr = new XMLHttpRequest();
var current;
var YOUR_APP_KEY = "YOUR_APP_KEY";
var YOUR_CLIENT_KEY = "YOUR_CLIENT_KEY";

$(function(){
    //起動時にmobile backend APIキーを設定
    NCMB.initialize(YOUR_APP_KEY,YOUR_CLIENT_KEY);
});

function XINGApi(){
//エクシング言語解析API
var XINGApi =
   "https://lr.capio.jp/webapis/iminos/synana_k/1_1/";
//アクセスキー
  var XINGAccessKey =
   "XINGAccessKey";
  var sent = "ばかやろう"; 
  //クエリを作る
  var queri = XINGApi + "?acckey=" + XINGAccessKey + "&sent=" + sent;

  // XMLHttpRequest オブジェクトを作成
  xhr.open("GET",queri,false);
  //レスポンス処理の指定
  xhr.onreadystatechange = processResponse;
  //APIを叩く
  xhr.send();
  console.log("quit");

  return queri;
}

function processResponse() {
    console.log("xhr.readyState:" +xhr.readyState);
    if(xhr.readyState == 4) {
        if(xhr.status == 200 || xhr.status == 201) {
            // リクエストの処理
            var XING = JSON.parse(xhr.responseText);
             for(var i in XING.results){
                //文章がポジティブかネガティブかを判定
                var spn = JSON.stringify(XING.results[i].spn[0]);
                console.log("spn:" +spn);
                
                var SPNClass = NCMB.Object.extend("spn");
                var spnClass = new SPNClass();    
                spnClass.set("NUM", spn);
                spnClass.save(null, {
                    success: function(object) {// 保存完了後に実行される
                    },
                    error: function(object, error) {// エラー時に実行される
                    }
                });
                
                $("#x-list").append("<li>" + "<p><h3>" + spn + "</h3>"); 
                clickInput = "#" + clickInput ;
                $(clickInput).click({name : spnl},reserve);
                $("#x-list").append("</p>" );
                $("#x-list").append("</li>" );
                $("#x-list").listview('refresh');
             
            }
           
        } else {
            // エラー処理
           
        }
    }
}
```
リトライ処理をワンライナーで

リトライ処理を書く時、毎回、車輪を再発明してる気がしてきたので、そろそろリトライ処理をワンライナーでイディオム化してみました。

```c:retry.c
for(int i=0; do_something()!=0 && i++<n; sleep(1));
```

* 最大リトライ回数はn回。
* n回目のコマンド実行の直後はスリープせずにループを抜ける。

論理AND演算子（&&）の第1オペランドを評価した直後は副作用完了点とされるため、式`do_something()!=0`の評価による副作用が完了した後に`i++<n`が評価されるという順序は保証されます。
PHPからdg/twitter-phpで画像付きツイート


## 準備

- github から [gd/twitter-php](https://github.com/dg/twitter-php) をインストールする（この記事時点では released version 3.5）
- [Application Management](https://apps.twitter.com/) ページでアプリケーションを登録して、Keys and AccessToken を発行する

## ツイートする

```php:tweet.php
requre_once 'twitter.class.php';

// 各変数値設定はここでは省略してます
$twitter = new Twitter($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
$result = $twitter->send('I am fine today.');

var_dump($result);
```

send()でも第2引数でメディア付きツイートは対応されているが、statuses/update_with_media が deprecated なので、ここではテキストツイートのみのテストとする。

## 画像付きでツイートする

画像付きのツイートはまず [media/upload](https://dev.twitter.com/rest/reference/post/media/upload) を行いレスポンスから media_id を取得して [statuses/update](https://dev.twitter.com/rest/reference/post/statuses/update) する流れになる。

アップロードは1枚ずつ行う。

最大4枚まで画像指定が可能で、取得した media_id をカンマ区切りで media_ids パラメータに指定する。

---

以下、最低限の実装例であり、例外処理などは省いてあります。

```php:tweet_with_media.php
/**
 * Parameters には media または media_data が排他で指定必須
 * media の場合は RAW データ、media_data は base64_encode する
 */
$file = 'sample.png';
$media_data = base64_encode(file_get_contents($file));
// Parameters
$parameters = array('media_data' => $media_data);

/**
 * 画像アップロード
 * media/upload は upload.twitter.com がエンドポイントなので注意
 * additional_owners を指定することで最大100人まで複数のユーザでアップロードした画像を使用可能
 */
$result = $twitter->request(
	'https://upload.twitter.com/1.1/media/upload.json', // API
	'POST',
	$parameters
);

/**
 * アップロードした画像付きツイート
 * なお、都度アップロードでも構いませんが、同じ画像を何度も使う場合
 * media_id を保存して再利用したほうが良さそうです
 */
$parameters = array(
	'status' => 'I am fine today.',
	'media_ids' => $result->media_id // アップロードレスポンスから画像の media_id を指定
);    
$result=  $twitter->request('statuses/update', 'POST', $parameters);
```
sprayで特定ディレクトリを静的配信するときに書いたルーティング


`webapp`を公開する場合の例

```scala
val root = "webapp"
pathPrefix("") {
	pathEnd {
    	get {
			getFromFile(s"$root/index.html")
		}
	}
} ~ {
	getFromDirectory(root)
}
```

`/`をindex.htmlにわりあてるのが少しめんどくさい。
もっと楽にやる方法ないのかな。
Xcodeでx86アセンブリを書く


Xcode 6です。

## ファイル作成

新規プロジェクト作成でCommand Line Toolを選びます。

![Screenshot_8_7_15__11_35_PM.png](https://qiita-image-store.s3.amazonaws.com/0/5978/28518bd6-6e4b-ffaa-ca00-e98451432944.png "Screenshot_8_7_15__11_35_PM.png")

言語はCを選ぶ。

![Screenshot_8_7_15__11_37_PM.png](https://qiita-image-store.s3.amazonaws.com/0/5978/a8518ded-5fa8-1bd4-312e-930b67c6b6e3.png "Screenshot_8_7_15__11_37_PM.png")

main.cは消しちゃいます。

![Project_navigator_contextual_menu_and_main_c_and_NSDictionary_URLEncoding_swift.png](https://qiita-image-store.s3.amazonaws.com/0/5978/dc2dc198-cadc-44c3-ce23-a0dd5e0cc07c.png "Project_navigator_contextual_menu_and_main_c_and_NSDictionary_URLEncoding_swift.png")

新規ファイル作成から、

![Project_navigator_contextual_menu_and_ams-test_xcodeproj_and_NSDictionary_URLEncoding_swift.png](https://qiita-image-store.s3.amazonaws.com/0/5978/61d30a0c-24aa-fcca-a808-90aa65c731f8.png "Project_navigator_contextual_menu_and_ams-test_xcodeproj_and_NSDictionary_URLEncoding_swift.png")

Assembly Fileを選びます。

![ams-test_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/5978/0c5d6e3c-a089-6e65-ba4c-bfa9be7acebe.png "ams-test_xcodeproj.png")

こういうコードを書きます。

```
.global _main

.text
_main:
    movl    $1, %eax
    subl    $12, %esp
    int     $0x80
```

たぶん[gas](https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax)のAT&Tシンタックスというやつだと思います。（自信ない）

### Intelシンタックス

Intelシンタックスを使うには `.intel_syntax noprefix` をつけます。

```
.intel_syntax noprefix

.global _main

.text
_main:
    mov     eax, 1
    sub     esp, 12
    int     0x80
```

## ビルド

このままだと64bitでコンパイルされると思うので、32bitでコンパイルされるようにします。

![ams-test_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/5978/504f3882-22f4-9533-8dd1-9cda486eb6df.png "ams-test_xcodeproj.png")

ビルドしてできるファイルを `file` コマンドで見てみると、x86_64からi386に変わっているのがわかります。

```
% file ams-test: Mach-O 64-bit executable x86_64
% file ams-test: Mach-O executable i386
```

## デバッグ

ブレークポイントも置けます。

![main_s_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/5978/224585db-fdaf-4a8e-9c90-332dd884ce27.png "main_s_—_Edited.png")

デバッガーのパネルではAll Variables, Registers, Globals and Statisticsを選択しておくとレジスタの値が見られます。

![OtherViews_and_main_s_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/5978/5d215f04-202c-e2ca-ed4b-34145f799f01.png "OtherViews_and_main_s_—_Edited.png")

それから、Debug→Debug Workflow→Always Show Disassemblyにチェックを入れておくと、

![Debug_Workflow_and_Debug.png](https://qiita-image-store.s3.amazonaws.com/0/5978/9c6a037c-12ed-7f58-298c-1268eb672e01.png "Debug_Workflow_and_Debug.png")

ブレークポイントで止まるときにこういうのが出てきます。

![project_xcworkspace.png](https://qiita-image-store.s3.amazonaws.com/0/5978/672655e0-c404-de0a-4999-5581cf3f3547.png "project_xcworkspace.png")

ここはソースコードをintelシンタックスで書いたとしてもAT&Tシンタックスで表示されます。

また、そのすぐ下のView Memoryを選ぶとこういう画面が出てきます。

Addressというところに例えばespレジスタ周辺の値を入れると、スタックのメモリレイアウトが見られます。

![project_xcworkspace.png](https://qiita-image-store.s3.amazonaws.com/0/5978/6531f1c0-ab94-5f3d-754c-9bc1ee18d5c4.png "project_xcworkspace.png")
CakePHPのShellのUnitTestを簡単に行う方法

 
CakePHPにはShellと呼ばれるバッチ（CLI）プログラムを実装する仕組みがあります。

しかしShellクラスのテストは、標準入出力（php://stdin、php://stdout）、標準エラー（php://stderr）を使っていることが多く、テストは困難と言われています。
またWebでの事例も少なく、Lib配下にあるテストコードもモッククラスを多用して中々、簡単にテストできるものではありません。
 
そこで今回はモックなどをあまり使わず、最低限の設定と変更のみで、テストが可能になる方法を紹介します。
 
## 1. 標準入出力、標準エラーを任意のファイル入出力へ切り替え
 
Shellクラスではコンストラクタで標準入出力、標準エラーの設定を行うことが出来ます。
コンストラクタで未指定の場合は、PHPの標準入出力（php://stdin、php://stdout）、標準エラー（php://stderr）を使うことになります。
 そのため、コンストラクタで任意の出力先を指定したConsoleIntput、ConsoleOutputクラスのインスタンスを指定します。
 
 ```MockHogeHogeShell.php
$stdout = new ConsoleOutput("/var/tmp/test_stdout");
$stderr = new ConsoleOutput("/var/tmp/test_stderr");
$stdin = new ConsoleInput("/var/tmp/test_stdin");
$Shell = new AppShell($stdout, $stderr, $stdin);
 ```
 
上記の設定だけで標準入出力、標準エラーの内容の確認が簡易になる上に、テスト終了後、出力先のファイルを削除する事も可能です。
 

## 2. Shellクラスのerrorメソッド使用時はモックオブジェクトへ切り替え
 
Shellクラスのerrorメソッドの内部では_stopメソッドをコールしています。
この_stopメソッド内でexit関数を実行しています。
テスト途中でexit関数を実行すると、テストクラスの実行が終了し、継続したテストが行なえません。
そこでこのテスト対象のShellクラスを継承したMockクラスを作成し、_stopメソッドをオーバーライドして実装してください。
 
 ```MockHogeHogeShell.php
class MockHogeHogeShell extends HogeHogeShell {
    protected function _stop($status = 0) {
        // スーパークラスの処理をコールせず、必要な処理を実装
    }
}
 ```
 
上記の変更のみで、errorメソッド実行時もテストが途中で終了せず、継続してテストが可能になります。
PL/SQLとPL/pgSQLでの複数行を返す関数の例

整数型の id 列と文字列型の name 列を持つ hoge テーブルについて、引数の数値に id 列が一致する行をすべて返却する関数を作成します。

# PL/SQL
```sql
-- hoge テーブルの作成
CREATE TABLE hoge (id INTEGER, name VARCHAR2(64));
INSERT INTO hoge VALUES (1, 'one');
INSERT INTO hoge VALUES (1, 'first');
INSERT INTO hoge VALUES (2, 'two');
INSERT INTO hoge VALUES (3, 'three');
INSERT INTO hoge VALUES (4, 'four');

-- hoge テーブルのレコード型の作成
CREATE TYPE HogeRowType IS OBJECT (id INTEGER, name VARCHAR2(64));
/

-- hoge テーブルのレコード型を要素とするネストした表を作成
CREATE TYPE HogeRowArrayType IS TABLE OF HogeRowType;
/

-- 関数例その1 (ネストした表に結果を溜め込んで一度に返却)
CREATE OR REPLACE FUNCTION hogetbl (x INTEGER)
  RETURN HogeRowArrayType
IS
  ret HogeRowArrayType := HogeRowArrayType();
  i INTEGER;
BEGIN
  i := 1;
  FOR row IN (SELECT * FROM hoge WHERE id = x) LOOP
    ret.EXTEND;
    ret(i) := HogeRowType(row.id, row.name);
    i := i + 1;
  END LOOP;
  RETURN ret;
END;
/

-- 関数例その1を実行
SELECT * FROM TABLE(hogetbl(1));

-- 関数例その2 (PIPELINED で結果を少しずつ返却)
CREATE OR REPLACE FUNCTION hogetbl_pipelined (x INTEGER)
  RETURN HogeRowArrayType PIPELINED
IS
BEGIN
  FOR row IN (SELECT * FROM hoge WHERE id = x) LOOP
    PIPE ROW(HogeRowType(row.id, row.name));
  END LOOP;
END;
/

-- 関数例その2を実行
SELECT * FROM TABLE(hogetbl_pipelined(1));
```

# PL/pgSQL
```plpgsql
-- hoge テーブルの作成
CREATE TABLE hoge (id INTEGER, name VARCHAR(64));
INSERT INTO hoge VALUES (1, 'one');
INSERT INTO hoge VALUES (1, 'first');
INSERT INTO hoge VALUES (2, 'two');
INSERT INTO hoge VALUES (3, 'three');
INSERT INTO hoge VALUES (4, 'four');

-- 関数例その1 (RETURN QUERY で結果を返却)
CREATE OR REPLACE FUNCTION hogetbl (x INTEGER)
  RETURNS SETOF hoge AS $$
BEGIN
  RETURN QUERY SELECT * FROM hoge WHERE id = x;
  RETURN;
END;
$$ LANGUAGE plpgsql;

-- 関数例その1を実行
SELECT * FROM hogetbl(1);

-- hoge テーブルのレコード型の作成
CREATE TYPE HogeRowType AS (id INTEGER, name VARCHAR(64));

-- 関数例その2 (RETURN NEXT で結果を返却)
CREATE OR REPLACE FUNCTION hogetbl2 (x INTEGER)
  RETURNS SETOF HogeRowType AS $$
DECLARE
  row HogeRowType;
BEGIN
  FOR row IN (SELECT * FROM hoge WHERE id = x) LOOP
    RETURN NEXT row;
  END LOOP;
  RETURN;
END;
$$ LANGUAGE plpgsql;

-- 関数例その2を実行
SELECT * FROM hogetbl2(1);
```
iOSアプリデザイン覚書


# ModalViewControllerを使うべき箇所でpushViewControllerしてはいけない理由

* そのUINavigationContollerがUITabBarControllerの配下になるような変更が将来発生したときにとても困るから
* ModalView内で行う操作は、「それが終わるかユーザが明示的にアボートするまで、ユーザは絶対に他のことができない」ということを保証したいものなので、別の理由で画面遷移が発生してはいけない
Webページ上のテキストボックスとSublimeTextを同期するGhostTextプラグイン

　頻繁に使うのに入力しづらいWebページ上のテキストボックス、ありますよね。
　そんな不満を緩和してくれるのがSublimeText3の入力補助プラグイン”GhostText”です。
　Webページ上のテキストボックスにSublimeTextから入力ができてしまいます。

##環境
###利用可能なブラウザ
　Chrome　もしくは　FireFox
###OS
　WinでもMacでもLinuxでも大丈夫です。
###エディタ
　Sublimetext3で使えます。
　[Githubのページ](https://github.com/Cacodaimon/GhostText-for-SublimeText)によるとAtomエディタ用のプラグインも現在開発中のようです。

##準備
　以下、Chrome、Mac、SublimeText3での手順です。
　同じ手順でWindowsPCでもセットアップ可能です。

1. ブラウザにアドオンをインストールする
　お使いのブラウザにGhostTextのアドオンを入れましょう。
　[Chromeウェブストア](https://chrome.google.com/webstore/detail/ghosttext-for-chrome/godiecgffnchndlihlpaajjcplehddca?hl=ja)、もしくは[Add-on-For-FireFox](https://addons.mozilla.org/ja/firefox/addon/ghosttext-for-firefox/)から入手しましょう。
　Chromeの場合、画面右上にオバケアイコンが追加されると思います。![スクリーンショット 2015-08-07 21.47.25.png](https://qiita-image-store.s3.amazonaws.com/0/51303/1e00207d-d581-c8af-6ef4-3d7fb6550642.png)

2. SublimeTextにプラグインをインストールする
　おなじみPackageControllからGhostTextプラグインをインストールしましょう。
![スクリーンショット 2015-08-07 21.46.47.png](https://qiita-image-store.s3.amazonaws.com/0/51303/bf812b7a-0a7f-e23b-06ee-2b8a944c2093.png)


##使ってみる
　あらかじめSublimeTextは起動しておきます。
　入力するテキストボックスのあるWebページを開いて、ブラウザ右上のオバケアイコンをクリックしましょう。
　Qiitaの執筆画面でも利用可能です。

　入力可能なテキストボックスが一つしかない場合は自動的に選択されます。
　複数ある場合は「好きなのを選べ」と言われるのでどれかをクリックしましょう。

![スクリーンショット 2015-08-07 22.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/51303/9e947bba-d0c0-770f-f35d-484982b575eb.png)
　画面上部にこういうのが出てきたら連携成功です。

![スクリーンショット 2015-08-07 22.32.17.png](https://qiita-image-store.s3.amazonaws.com/0/51303/5fbc9a06-6605-e123-ff3f-5ab5746a2eb5.png)
　連携したテキストボックスは濃い青色で囲われます。

![スクリーンショット 2015-08-07 22.51.10.png](https://qiita-image-store.s3.amazonaws.com/0/51303/629741a8-f5dc-ebc7-9fe7-714302f4cc53.png)
　SublimeText側では連携したテキストボックスの内容が表示されます。

![スクリーンショット 2015-08-07 22.36.48.png](https://qiita-image-store.s3.amazonaws.com/0/51303/e9fc14db-0070-10b4-c1ee-fff2065b96a0.png)

　SublimeTextで文章を打つとテキストボックスと瞬時に同期されて行くのがわかると思います。

　以上で利用手順は完了です。簡単ですね。

***
　私は普段Redmineのチケットを記入する際に重宝しています。
　狭いテキストボックスに比較的長い文章を書く際には心強い味方になってくれるプラグインです。
NoSQLの調査まとめはじめ

# NoSQL製品調査
NoSQLとして以下の製品を調べてみました。
・Cassandra
・Oracle NoSQL Database

# 違い
違いとしては以下が大きいのではないかと思います。
・ACIDを保証しているかいなか

# 雑感
基本的には２つともKey-Value形式で高速書き込みと読み込みを実現していますが、アクセス方法としてはCQL3でSQLライクにアクセスできたりできなかったりとなっています。

Cassandraとしては、CQL3で軽量トランザクションをサポートしていますが、私として望んでいるAtomic性を担保していないことがわかりました。
軽量トランザクションとはIF文のようなものをつけて辻褄があわない場合にエラーを発生させず処理を継続できる仕組みと理解していますが、ロールバックであったりコミットであったりといった一位性を担保するものではないということがわかり残念です。

Oracle NoSQLの場合はACIDを担保してくれているようですが、同一シャードかつ取得処理が対象外となっており、実際に試してみないとわからないことではありますが、RDBのような強力なトランザクション機能とまではいかないような気配がします。
Oracle NoSQLの操作はSQLライクではなく、ドライバから提供されるクラスで取得、登録、変更、削除が表現されており、それらを利用する形態となっているようです。
あと、Oracle NoSQLサーバを立てようとしたところ、jarファイル形式のものを実行することで起動できるようですが、そのあたりが若干ひかかってしまいました。
Symbol 'cout' could not be resolvedが取れました

Eclipse 4.4.2でC/C++混在のプロジェクトを作成したところ、当たり前にインデクサに検索しておいて欲しいシンボルが以下のようなエラーになっていましたが、参考にさせていただいたサイトに書かれてあった方法でそのエラーがなくなりました。

```text:エディタ上でシンボルが見つからないというインデクサのエラー
Symbol 'cout' could not be resolved
```

##環境

* CentOS 6.6（ゲストOS）
* Eclipse 4.4.2
* CDT 8.6.0
* gcc 4.4.7

##インデクサのエラーを消す方法

1. プロジェクトのプロパティを開き、C/C++ Generalを開く
1. Preprocessor Include Paths, Macros, etc.ページを開く
1. Providersタブを開く
1. CDT GCC Built-in Compiler Settingを選択する
1. Language Settings Provider OptionsでUse global provider shared between projectsのチェックを外すと、Command to get compiler specs:が設定できるようになるので、```-std=c++11```を末尾に追加する。
1. OKを押してダイアログを終了し、Indexerのリビルド。

##参考

* [stackoverflow/Eclipse CDT: Symbol 'cout' could not be resolved](http://stackoverflow.com/questions/10803685/eclipse-cdt-symbol-cout-could-not-be-resolved)
UIScrollViewにおけるAutoLayoutについてまとめる

##はじめに
StoryboardでのUIScrollViewの設定を、AutoLayoutだけでやろうとすると、かなり混乱します。
色々やっているうちに理解出来てきたのでまとめます。

##UIScrollViewのパラメータについて
UIScrollViewには、表示するContentを管理するパラメータとして、

- contentOffset
- contentInset
- contentSize

の3つがあります。
contentOffsetは、どれぐらいスクロールしているか。
contentInsetは、余分にどれだけスクロールできるか。
contentSizeは、スクロールする中身のサイズ。
をそれぞれ表しています。

AutoLayoutによって、中身に応じたcontentSizeを自動的に決定することが出来ます。

##仕組み
**この記事では、UIScrollViewの中にある、contentSizeの大きさを持ったスクロールするViewのことを、contentViewと呼ぶことにします。**

混乱の元なのが、
「UIScrollViewの中に置いたViewの制約は、UIScrollViewからではなく、contentViewからの制約になり、それを元にcontentSizeが決定される」
ということです。

きったない絵で申し訳ないですが、以下をご覧ください。

![d.png](https://qiita-image-store.s3.amazonaws.com/0/44356/69221fc9-6278-5255-c300-980faa4e9860.png "d.png")

このような制約をつけた場合、contentSizeは、600x500になる、ということです。
つまり、見かけ上UIScrollViewに対してつけている制約は、contentViewに対してつけていることになっています。

見た目に惑わされず、制約はUIScrollViewと同じサイズのViewに対してつけているのではなく、contentViewに対してつけている、ということを意識すると混乱しなくなると思います。

##実践
とはいえ、このような仕組みを理解したとしても、常にcontentSizeを意識して制約をつけていくことはとても難しいです。
なので個人的には、UIScrollView直下にはUIViewを1つだけ配置して上下左右に0ptの制約をつける、という方法をオススメします。
そうすれば、あとはそのUIViewの高さと幅を決定すれば良い、という状態にすることが出来ます。

Xcodeではこんな感じ

![スクリーンショット 2017-07-26 9.51.15.png](https://qiita-image-store.s3.amazonaws.com/0/44356/0946d14e-778e-84d2-1453-cc0a8affd02f.png)

この状態から、UIViewに対して幅や高さの制約を追加したりサブビューを追加したりすると理解が深まると思います。

また、例えば横にのみスクロールしたい場合は、UIViewとUIScrollViewの間にEquals Heightsの制約をつければ良いです。

##ちなみに
contentOffsetやcontentInsetはAutoLayoutではどうにもなりません。
contentInsetはUser Defined Runtime Attributesで指定できます。
[こんなの](http://stackoverflow.com/questions/25195100/is-there-a-way-to-set-a-uitableviews-contentinset-through-storyboard)もありましたが、僕のXcodeにはありませんでした。
contentOffsetは、AutoLayout適用後のviewDidLayoutで設定すると良いと思います。

##参考
[リファレンス](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/)
[Qiita記事](http://qiita.com/hirobe/items/2baf629b7807b4c0d10f)
MonoGame入門Ⅰ

# 昔話

昔々あるところに、XNAと呼ばれるMicrosoftが開発した、マルチプラットフォームのゲーム開発用ライブラリがありました。マルチプラットフォームといっても、Unityの用にAndroidやiPhoneからWii Uまで幅広く対応するようなものではなく、XNAが対応しているのはXBox360, WindowsPhone, Windowsだけでした。

XNAは2D/3Dに両対応しており、よく出来たフレームワークでした。海外では比較的知名度は高かったようですが、日本国内では海外ほどの知名度はなく、一部の人々には人気があるという程度でした。さらに、2012年の末ごろからでしょうか、とある噂が流布するようになっていました。曰く、「XNAの開発が終わる」と。

そしてある日、[噂が現実のものとなったのでした](http://www.gamasutra.com/view/news/185894/Its_official_XNA_is_dead.php)。

かくして、XNAは天に召されたわけですが、路頭に迷ったXNA開発者を救う存在も生まれていました。それがMonoGameです。MonoGameは高い精度でXNAをコピーしており、XNAのコードがほぼそのまま動作します。MonoGameはXNAコピーとして生まれましたが、今やただのコピーではありません。MonoGameはWindowsやLinux, Android, PlayStation4など、XNAとは比べ物にならないほど多くのプラットフォームに対応しているのです。

さらに、海外ではMonoGameを使用したインディーズゲームが幾つか開発されています。現在は日本ではまだまだUnityやCocos2dのほうが人気がありますが、いつかMonoGameもそれらに並ぶことになるかもしれません。

# 開発環境の構築

NOTE: 現時点ではWindowsのみ解説しています。それ以外のOSを使用している方は、ドキュメントなどを参考にしてみてください。

## VisualStudio のインストール

[VisualStudioのダウンロードサイト](https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs)から、最新版のVisualStudioCommunityをダウンロード・インストールします。

インストールについては、インストーラに従ってください。オプションは初期設定で問題ありません。

![](https://i.gyazo.com/d839bf13979f417ef6e8763c19101262.png)

## MonoGameのインストール

[ダウンロードページ](http://www.monogame.net/downloads/)から、MonoGameのバージョンを選択します。通常は太字になっている最新安定版を選択すれば問題ありません(画像は執筆当時のものであり、今後バージョンは変わる可能性があります。

![](https://i.gyazo.com/54bf98362e789255ef2dd770985bf4fe.png)

各バージョンのページには、プラットフォームごとのインストーラへのリンクが有ります。今回はVisualStudioを選択します。

![](https://i.gyazo.com/e9d2dd55671e417177ed266d5341d0e4.png)

インストーラのダウンロードが完了したら、インストーラに従ってインストールを行います。オプションは初期設定で問題ありません。

## 最小のゲーム

## プロジェクトを作成する

VisualStudio を起動して、新しいプロジェクトを作成します。プロジェクトの名前は Game01 としていますが、もちろん別の名前を使用しても構いません。

![](https://i.gyazo.com/4c2b773d6396b9418f932b921620d859.png)

作成されたプロジェクトには、ゲームを動作させるのに必要な最小限のコードが用意されています。つまり、プロジェクトを作成しただけで、ゲームが出来てしまったということです！！

_F5_キーを押して、作成されたゲームを実行します。以下の様な青い画面が表示されれば成功です。VisualStudio にフォーカスを戻して、_Ctrl+F5_ でゲームを終了しましょう。

![](https://i.gyazo.com/3a59e55b7a27bd0b330e2f3a1235f41c.png)


# まとめ

今回は、開発環境の構築と、最小限のゲームの作成までを行いました。

[今回のコード](https://github.com/zakuro9715/MonoGameTutorial/tree/21f4ba4eb4d74869d79d1d37dc0c0d61299eddb9/Game01)

# References

- [MonoGame | Write Once, Play Everywhere](http://www.monogame.net)
overflow:scroll/auto; を指定した要素の中身を一番下までスクロールする

# 概要

LINEのようなUIで、発言のたびに自動的にスクロールを進めたい、という要件を満たします。

# 実装

`#target`の中にどんどん発言が増えていくというイメージです。
なお、前の投稿「[position:absolute; で top と bottom の両方を効かせる](http://qiita.com/noobar/items/b1b7a8861aa74c27b66e)」のコードを使っています。

```sample.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
  <style type="text/css">
  html,body {
    padding: 0;
    margin: 0;
    height: 100%;
    width: 100%;
  }

  header {
    position: absolute;
    top: 0;
    height: 20px;
    width: 100%;
    border: solid thin blue;
  }
  footer {
    position: absolute;
    bottom: 0;
    height: 30px;
    width: 100%;
    border: solid thin green;
  }

  #target {
    position: absolute;
    top: 20px;
    bottom: 30px;
    border: solid thin red;
    width: 100%;
    overflow: auto;
  }
  
  #target p {
    padding: 15px;
    margin: 10px;
    border: solid thin lightgreen;
    border-radius: 5px;
  }

  </style>
</head>
<body>
  <header>header</header>
  <div id="target">
  </div>
  <footer><button id="add">add</button></footer>
  
<script>
  var num = 0;
  $('#add').on('click', function() {
    $('#target').append('<p>' + (num++) + '</p>');
    
    // 一番下までスクロールする
    $('#target').animate({scrollTop: $('#target')[0].scrollHeight}, 'fast');
  });
</script>
</body>
</html>
```

CSSが長すぎますが、大事なのはscriptの最終行です。
Net::Amazon::S3 で secure オプションを有効にすると起きるエラーについて


perl で AWS S3 へアクセスするときに Net::Amazon::S3 というモジュールを使いました。
インターフェースもわかりやすいです。

`my $s3 = Net::Amazon::S3->new(...);` する際に secure => 1 という SSL 通信を使うためのオプションをセットすると通信時にエラーが起きてしまい悩んでいたのですが、解決したのでそのメモです。


## エラーと原因

Net::Amazon::S3 が内部で使っている LWP::UserAgent モジュール。
これが SSL 通信するときにデフォルトで使っている CA ファイルは Mozilla::CA::SSL_ca_file() というものらしいのですが、Mozilla::CA モジュールが新しすぎると 

> SSL3_GET_SERVER_CERTIFICATE:certificate verify failed LWP/Protocol/http.pm

のようなエラーになります。

## 解決方法

Mozilla::CA モジュールの'20141217'バージョン(現在の最新版)を使っていると上のようなエラーが起きるので、'20130114'バージョンまたはそれ以前のものを使うようにします。

2014年のバージョンからは 1024 bit な証明書ファイルがだいぶ削除されてしまったというのがことの原因のようです。

詳しくは参考サイトをどうぞ。

## 参考サイト

[PerlMonks: SSL Certificate Verification problem, using LWP::UserAgent by ManyHats](http://www.perlmonks.org/?node_id=1118455)
GitHubとGitHub Enterpriseを併用してる人のconfigの運用


## 問題

弊社GitHub Enterprise(以下GHE)を導入してるんですが、自分は(もちろん)GitHubと併用しています。

で、大体の人は`git config --global` で`user.name`と`user.email`をGitHubで使ってるアカウントにしてると思います。

この設定のまま作業してるとたまに困るのが、GHEに置いてるリポジトリなのに`user.name`と`user.email`をグローバルのもの使ってしまい、contributeとかにいくらコミットしてても全然自分の名前が乗ってこない問題があります。

これはリポジトリのローカルで以下のようなコマンド打っておくと上記の問題を解決できます。

```sh
$ git config --local user.name 'YOUR NAME'
$ git config --local user.email 'your@example.com'
```

これでめでたく、GHEのcontributeとかにはちゃんと自分の名前が出てきます。

で、まあ毎回これ打っても良いんですが、わりと自分の名前とかメールアドレスを入れるの面倒だったんで、Goの練習がてら設定ファイルから一発でこれらの設定するコマンド作りました。

https://github.com/Layzie/gitconfig-setter

## 使い方

まずは[インストール](https://github.com/Layzie/gitconfig-setter#install)してから、好きな場所に、`config.toml`ってファイル作ってください。

```toml
name = "YOUR NAME"
email = "your@example.com"
```

まあ見れば分かりますが、これが`git config --local`で設定される名前とメールアドレスです。ちなみに`config.toml`という名前は決めうちです。


次に

```sh
$ gitconfig-setter <設定したいリポジトリのパス> <config.tomlまでのパス(ファイル名はいらない)>
```

という風にコマンド打ってあげるとリポジトリのローカルに`config.toml`で設定した名前とメールアドレスを設定してくれます。

### 8/10追記

書き忘れてたけど、それぞれリポジトリと`config.toml`のパスを何も設定しない場合は、どちらもカレントディレクトリを見るようになっています。

## 最後に

どっちかというと、Goの習作って面が強いです。というか、これやるだけだったらシェルスクリプトで良いんじゃね?疑惑はあります。
position:absolute; で top と bottom の両方を効かせる

**2015年8月16日編集** 情報元に誤りがあったため修正しました

# 結論
`top`と`bottom`の両方を効かせたい要素のCSSを次のようにする
1. `height`を定義しない
2. `height:auto;`にする

# 詳細
https://developer.mozilla.org/en-US/docs/Web/CSS/bottom

>When both top and bottom are specified, and height is unspecified or either auto or 100%, both the top and bottom distances are respected. In all other situations, if height is constrained in any way, the top property takes precedence and the bottom property is ignored.

_訳：topとbottomの両方が定義されていて、なおかつheightが定義されていないか、heightがauto ~~または100%~~で定義されている場合、topとbottomの両方が採用される。上記に当てはまらない場合、heightが（auto ~~/100%~~以外で）定義されてされていたら、topが優先されbottomは無視される。_
（注：100%はMDN編集者の誤りのようです。）

つまり、次の例はbottomが無視されます。

```css:bottomは無視される
#main {
  top: 10px;
  bottom: 20px;
  height: 90%;
}
```

次の例は、topとbottomにあわせて#mainのheightが柔軟に変化します。

```css:topとbottomが有効
#main {
  top: 10px;
  bottom: 20px;
  /* height: auto; を明示的に書いても良い */
}
```

# 応用例
もともと、「\<header>と\<footer>を常に表示しつつ、隠れた部分をスクロールで見えるようにする」というのをやりたかったので、ついでにこのコードをメモしておきます。`#target`と\<header>\<footer>がかぶらず、かつ`#target`の中身がすべてスクロールで見えるようになっています。

```html:sample.html
<!DOCTYPE html>
<html>
<head>
  <title></title>
  
  <style type="text/css">
  html,body {
    padding: 0;
    margin: 0;
    height: 100%;
    width: 100%;
  }
  
  header {
    position: absolute;
    top: 0;
    height: 20px;
    width: 100%;
    border: solid thin blue;
  }
  footer {
    position: absolute;
    bottom: 0;
    height: 30px;
    width: 100%;
    border: solid thin green;
  }
  
  #target {
    position: absolute;
    top: 20px;
    bottom: 30px;
    border: solid thin red;
    width: 100%;
    overflow: auto;
  }
  
  </style>
  
</head>
<body>
  <header>header</header>
  <div id="target">
    <p>01</p>
    <p>02</p>
    <p>03</p>
    <p>04</p>
    <p>05</p>
    <p>06</p>
    <p>07</p>
    <p>08</p>
    <p>09</p>
    <p>10</p>
    <p>11</p>
    <p>12</p>
    <p>13</p>
    <p>14</p>
    <p>15</p>
    <p>16</p>
    <p>17</p>
    <p>18</p>
    <p>19</p>
    <p>20</p>
    <p>21</p>
    <p>22</p>
    <p>23</p>
    <p>24</p>
    <p>25</p>
    <p>26</p>
    <p>27</p>
    <p>28</p>
    <p>29</p>
    <p>30</p>
    <p>31</p>
    <p>32</p>
    <p>33</p>
    <p>34</p>
    <p>35</p>
    <p>36</p>
    <p>37</p>
    <p>38</p>
    <p>39</p>
    <p>40</p>
    <p>41</p>
    <p>42</p>
    <p>43</p>
    <p>44</p>
    <p>45</p>
    <p>46</p>
    <p>47</p>
    <p>48</p>
    <p>49</p>
    <p>50</p>
  </div>
  <footer>footer</footer>
</body>
</html>
```

~~この例で`#target`のheightを100%にすると、bottomが無視されているように見えます。翻訳ミスでしょうか･･･~~ 解決しました。kura07様、ありがとうございました。
Rubyデザインパターン 12日目 : DSL

Rubyデザインパターン学習のために、自分なりに読書の結果をまとめていくことに決めました。第12日目はDSLです。(http://www.amazon.co.jp/gp/product/4894712857/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4894712857&linkCode=as2&tag=morizyun00-22)

![スクリーンショット 2015-07-27 11.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/80075/d68a4010-c177-4ef5-2f2e-899a76c76cb6.png)


# **<i class="fa fa-pencil"></i>　12日目 DSL**

今回はDSLです。DSLというのは**ドメイン特化言語**と呼ばれます。

主に内部DSLについてまとめていきます。


<i class="fa fa-lightbulb-o"></i> 下記のような形でバックアップを取るためのDSLを作りたいとしましょう。

```backup.pr
#   README   #
Backup your textfile.

#   Usage    #
#   1. backup 'add_your_file_name'           #
#   2. backup_timestamp 'add_your_file_name' #

backup 'diary.txt'
backup_timestamp 'diary2.txt'
```

こういった形でバックアップの取れるDSLを書いてみましょう！
ちなみに今日のまとめは結構自力でコードを書いているので、つたない所が多いかもしれませんがご了承ください！

```rb

require 'fileutils'

class Backup
  def initialize(source)
    @backup_directory_path = 'backup'
    @source = source
    @backup_directory_full_path = File.expand_path(@backup_directory_path)
  end

  def backup
    FileUtils.mkdir_p @backup_directory_path
    FileUtils.cp(@source, @backup_directory_full_path)
  end

  def backup_timestamp
    FileUtils.mkdir_p @backup_directory_path
    file_name_timestamp = @source + fixed_timestamp
    FileUtils.copy(@source, file_name_timestamp)
    FileUtils.mv(file_name_timestamp, @backup_directory_path)
  end

  def fixed_timestamp
    Time.now.to_s.gsub('-', '').gsub(':', '').gsub(' ','').slice(0..13)
  end
end

def backup(dir)
  Backup.new(dir).backup
end

def backup_timestamp(dir)
  Backup.new(dir).backup_timestamp
end

eval(File.read('backup.txt'))
```

```rb:backup.txt
#   README   #
#   1. backup 'add_your_file_name'           #
#   2. backup_timestamp 'add_your_file_name' #

backup_timestamp 'diary2.txt'
```

実行時に`eval`を使っています。
メソッドをトップレベルにベタ書きしているので、また今度リファクタリングしてみようと思います！

バックアップをとりたい時は簡単で、`backup`か`backup_timestamp`の後にバックアップを取りたいファイル名を入れればこのDSLを使うことができます。

`eval`は読み込んだものすべてをRubyスクリプトとして実行できますので、こういった実行の方法が取れますね。

ちなみにバックアップを取るとこんな感じです。

![スクリーンショット 2015-08-07 20.46.21.png](https://qiita-image-store.s3.amazonaws.com/0/80075/834d17aa-905c-90a1-32e0-0a7962e0273d.png)





# **<i class="fa fa-star"></i>　まとめ**

DSLを書くと、ユーザーにとって非常に簡単な形で使えるプログラムが書けます。

ActiveRecord や Rake, Rspecなど様々な形で内部DSLを目にすることができます。

ただ、ちょっとしたタイプミスで動かなくなってしまう設計にしてしまったりすると(今回のもそうなのですが...)痛い目を見てしまうので、設計はちゃんとやりましょう！


<i class="fa fa-exclamation-triangle"></i> あと`eval`は用法用量を守ってお使いください！(デバッグとかもやりにくくなります




# 参照

http://gihyo.jp/admin/feature/01/dsl/0002
Rake タスクの作り方（引数を複数設定してみる）

## やったこと

* rake タスクをジェネレート
* 引数付きのrakeタスクを作成

*※ rakeタスクの作り方を毎回忘れるのでメモ！*

## rake タスクファイルをジェネレートする

```bash
$ rails g task task_name
```

`task_name`に任意の名前をつける。
今回はそのまま`task_name`をそのまま使用する。

`lib/task/`配下に以下のようなファイルが作成される。

```rb:task_name.rake
namespace :task_name do
end
```

## タスクの処理を追加してみる。（引数付き）

次にブロック内に実行する処理を追加する。

```rb:task_name.rake
namespace :task_name do
  desc "実行処理の説明"
  task :create, ['name'] => :environment do |task, args|
    p task
    p args
  end
end
```
### rake タスクの確認をする。

```bash
$ rake -vT

# 出力結果

...
rake task_name:create[name]          # 実行処理の説明
...

```

実行してみる

```bash
$ rake task_name:create[hoge]

# 出力結果

<Rake::Task task_name:create => [environment]>
{:name=>"hoge"}

```

### 複数の引数を与えたい場合。

```rb:task_name.rake
namespace :task_name do
  desc "実行処理の説明"
  task :create, ['name', 'description'] => :environment do |task, args|
    p task
    p args
  end
end
```

実行してみる

```bash
$ rake task_name:create[hoge,foo]

# 出力結果

<Rake::Task task_name:create => [environment]>
{:name=>"hoge", :description: => "foo"}

```

上記で確認できるように、引数は`Hash`で渡されるので、あとは以下のようにHashとして扱えばOK！
または、'args.name'のような形でも呼び出し可能。

```rb:task_name.rake
namespace :task_name do
  desc "実行処理の説明"
  task :create, ['name', 'description'] => :environment do |task, args|

    # どちらも同じ値を呼び出す。
    p args[:name]
    p args.name

  end
end
```
net/http、curbでのGET、POSTサンプル

毎回ググってるので備忘として。

## net/http

```rb
require 'net/http'

def get_nethttp(url)
  uri = URI.parse(url)
  response = Net::HTTP.start(uri.host, uri.port) {|http|
    http.get(uri.request_uri)
  }

  puts response.header
  puts response.body
end

def post_nethttp(url, payload) # payload は .to_json して渡す
  uri = URI.parse(url)
  response = Net::HTTP.start(uri.host, uri.port) {|http|
    http.post(uri.request_uri, payload)
  }

  puts response.header
  puts response.body
end
```

## curb

```rb
require 'curb'

def get_curb(url)
  curl = Curl::Easy.new(url)
  curl.http_get

  puts curl.header_str
  puts curl.body_str
end

def post_curb(url, payload) # payload は .to_json して渡す
  curl = Curl::Easy.new(url)
  curl.post_body = payload
  curl.http_post

  puts curl.header_str
  puts curl.body_str
end
```
SpringMVCのHandlerExceptionResolverの適用順


久しぶりに例外周りの設定を見ていたら、ResponseStatusアノテーション付けたときの挙動でちょっとハマりました。
知っている人にはなんてことない話ですが、こういうのよく忘れるタチなので自分用にメモしておきます。


## 自分がよく使っている例外ハンドリングの復習

### ExceptionHandlerアノテーション
Controller内にExceptionHandlerアノテーションを付与したメソッドを定義すると、
そのController内で指定の型の例外がthrowされた場合にハンドリングできる。

```java:@ExceptionHandlerを設定したメソッド
@ExceptionHandler(Exception.class)
public String handleException(final Exception e) {
    return "/hoge/error";
}

```

### HandlerExceptionResolver
これ実装したクラスを作成して

```java:HanlderExceptionResolverを実装したクラス
package jp.hoge.fuga.web.handler;

public class GlobalExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(final HttpServletRequest request,
            final HttpServletResponse response, final Object handler,
            final Exception e) {

        model.setViewName("/common/error");

        return model;
    }
}

```

設定しておくと

```servlet-context.xml
    <beans:bean class="jp.hoge.fuga.web.handler.GlobalExceptionHandler"/>

```

前段で処理されてないthrowされた例外がハンドリングできる。

と、この2つの方法については、あまり深いこと考えずに使っていたわけです。

### 例外クラス自体にResponseStatusアノテーションを設定している場合

今回ちょいハマりしたのですが、独自例外にこういう設定ができますよね。

```java:@ResponseStatusを設定した独自例外
package jp.hoge.fuga.exception;

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {

```

今まで使ったことなかったんですが、これをthrowして指定したレスポンスコード（上記の場合は404)で
アプリケーションから応答返したい、という場合に使ったりするようです。

こうした独自例外をController内でthrowした場合、

* 例外の型が合っていれば、ExceptionHandlerアノテーション付きのメソッドでハンドリングできる
* 型に関わらず、独自にHandlerExceptionResolverを実装して設定したクラスではハンドリングできない

という挙動になったので、はて？となったのです。

...で、ここでやっと気付くわけですよ、
「ああ、mvc:annotation-driven指定してるから、デフォルトのHandlerExceptionResolverが設定されているんだよね。
  それが作用してるんだよね」
と。

ただ、何がどういう順番で設定されているのかよく分かってなかったので、
デバッグがてら、デフォルトでどういった設定がされるのかを見てみました。
※ spring-webmvc-4.0.6.RELEASEで確認。

### Spring MVCのデフォルトのHandlerExceptionResolverの設定

例外発生時に呼び出されるのは、
`org.springframework.web.servlet.DispatcherServlet#processHandlerException`

ここで
`handlerExceptionResolvers`
というListを持っていて、この中にHandlerExceptionResolver達が格納されており、
先頭から順に判定してどれを適用するか決めています。

格納順(=適用判定がされる順)は以下の通りでした。

* org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver  
→ ExceptionHandlerアノテーション付きの処理の適用を判定するHandlerExceptionResolver
* org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver  
→ ResponseStatusアノテーションでステータスコードが設定されたものに適用するHandlerExceptionResolver
* org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver  
→ Springで定義されている例外に適用するHandlerExceptionResolver
* 独自にHandlerExceptionResolverを実装して設定したHandlerExceptionResolver

なるほど。
だからResponseStatusアノテーション付与した例外をthrowすると、独自HandlerExceptionResolverまでは到達しなかったんですね  
と理解ができました。

ドキュメントとかにも書いてあるのかもしれませんが、実際のソース見ると色々と納得感あるよね、と改めて思った次第です。