OmniAICreator/Qiita-1.07M huggingface dataset:
SoftLayer APIプログラミングの参考サイト

随時更新

SoftLayer公式
- [SoftLayer API Overview | SoftLayer Development Network](http://sldn.softlayer.com/article/SoftLayer-API-Overview)
- [API Documentation — SoftLayer API Python Client 3.3.0 documentation](https://softlayer-api-python-client.readthedocs.org/en/latest/api/client/)
- [SoftLayer API Python Client 3.3.0 — SoftLayer API Python Client 3.3.0 documentation](http://softlayer-python.readthedocs.org/en/latest/index.html) 
- [Python | SoftLayer Development Network](http://sldn.softlayer.com/article/Python)
- [SoftLayer 3.3.1 : Python Package Index](https://pypi.python.org/pypi/SoftLayer)
- [AccountSoftLayer_Account | SoftLayer Development Network](http://sldn.softlayer.com/reference/services/SoftLayer_Account)  Servicesの検索
- [AccountSoftLayer_Account | SoftLayer Development Network](http://sldn.softlayer.com/reference/datatypes/SoftLayer_Account) Data Typesの検索
- [API Documentation — SoftLayer API Python Client 3.3.0 documentation](https://softlayer-api-python-client.readthedocs.org/en/latest/api/client/#managers) Managers
- [Command-Line Interface Developer Guide — SoftLayer API Python Client 3.3.0 documentation](https://softlayer-api-python-client.readthedocs.org/en/latest/dev/cli/) SL CLIを作るときはここを見る
- [REST | SoftLayer Development Network](http://sldn.softlayer.com/article/REST) RESTを使うとき
- [General Discussion - SoftLayer Customer Forums](https://forums.softlayer.com/forum/softlayer-developer-network/general-discussion) 開発者のフォーラム
- [Implementations - SoftLayer Customer Forums](https://forums.softlayer.com/forum/softlayer-developer-network/implementations) 開発者のフォーラム

GitHub
- [GitHub: SoftLayer](https://github.com/softlayer/)
- [GitHub: softlayer/softlayer-python](https://github.com/softlayer/softlayer-python)

Blogとかいろいろ
- [ShinobiLayer: SoftLayer API 次の一歩: データ型オブジェクト(1) - Qiita](http://qiita.com/testnin2/items/f04ca0cee9b2f0a8f830)
- [ShinobiLayer: SoftLayer API 次の一歩: データ型オブジェクト(2) - Qiita](http://qiita.com/testnin2/items/6be9b87571a99e01002a)
- [ShinobiLayer: SoftLayer API 次の一歩: データ型オブジェクト(3) - Qiita](http://qiita.com/testnin2/items/80b7808b1a69babcde65)
- [softlayer-api-ruby-client で Virtual Server を作成する #softlayer « CREATIONLINE, INC.](http://www.creationline.com/lab/4577) 
- [RubyからSoftLayerを操作する（その１） - Qiita](http://qiita.com/rina0521/items/d98e14de523da4397962)
- [Python - SoftLayerのDNSサービスをDDNS的に使う - Qiita](http://qiita.com/kwnarita/items/6bb20042c15ca80aeca2)
- [IBM SoftLayer API を使用して基本的なクラウド管理タスクを実装する](http://www.ibm.com/developerworks/jp/cloud/library/cl-softlayer-apis-overview-tasks/)
MongodbでSQLクエリ、Slamdata使ってみる。

#Slamdataとは？
"Application Intelligence for MongoDB"というキャッチフレーズの[Slamdata](http://slamdata.com/)。

mongodに対し、普通のSQL(*)でクエリかけられる、らしい。

(*) SlamSQL : Backward compatible with ANSI SQL

全体像、よくわからないが、今回はデータ解析用のクライアント環境を試す。


#実装は公開されている。

slamdata社のgithubにいろいろ公開されてます。
https://github.com/slamdata/

更新日も新しく、絶賛実装中、らしい。
[purescriptアドベントカレンダー](http://qiita.com/advent-calendar/2014/purescript)6日目の[xuweiさん曰く](http://d.hatena.ne.jp/xuwei/20141206/1417932821)、"Scala(z)のすごい人"、"Precog"、そして、"purescript"。

#Windowsにインストール。
githubからは、ちょっと怖い印象があるが、普通の商用(目指してる)ソフトとして、普通にwindows用インストーラーが用意されている。ということで、Setup。

![slam_data_setup.JPG](https://qiita-image-store.s3.amazonaws.com/0/16455/3e110af7-00e5-bd1a-e0af-f9e3c6abe5f5.jpeg)

- 実行してみると、一瞬やっぱ怖い、と思うかも・・・

#実行してみた。
まずは、mondodを立ちあげ、sample_popというコレクションを作成(適宜参考。[Spring Dataで始めるMongoDB その１MongoDBのインストールと基本操作](http://codezine.jp/article/detail/6982) 。windowsへのインストールは別途調べる。

> use sample
> db.sample_pop.insert({"key1":"value15", "pop":15})
> db.sample_pop.insert({"key1":"value115", "pop":115})
> db.sample_pop.insert({"key1":"value1115", "pop":1115})
> db.sample_pop.insert({"key1":"value11115", "pop":11115})

Slamdataからmongodに接続し、SQL書いてみる。
![run_slamdata.JPG](https://qiita-image-store.s3.amazonaws.com/0/16455/20dee484-58f1-d066-e9d6-b3c8ae7b0c2f.jpeg)

動いている。

#誰得？
- AltJSに興味がある人?（purescript実装の参考として?）。
- Mongodbにいろいろクエリかけたい人（Slamdata社曰く、モバイルアプリ界隈のデータ解析に使ってね、とのこと : [why-slamdata](http://slamdata.com/why-slamdata/)）。 


 ※以下にSQLクエリの例あり。実用的かどうかは未検証。

　　http://slamdata.com/documentation/
GeoJSONタイルのフォーマットの違い（TileLayer.GeoJSON vs Tangram）

TileLayer.GeoJSON が扱っている GeoJSON タイルは、FeatureCollection がそのまま格納されたものであるが、Tangram が扱う GeoJSON タイルの形式は、これとは異なる。前者を plain GeoJSON tile と呼び、後者を Mapzen/OSM.US-style GeoJSON tile と呼ぶことにする。

「Mapzen/OSM.US-style GeoJSON vector tiles」という書き方は、tamgram の src/tile_source.js が原典である。

```javascript
/**
 Mapzen/OSM.US-style GeoJSON vector tiles
 @class GeoJSONTileSource
*/
export class GeoJSONTileSource extends NetworkTileSource {

    constructor (source) {
        super(source);
        this.type = 'GeoJSONTileSource';
    }

    parseTile (tile, response) {
        tile.layers = JSON.parse(response);

        TileSource.projectTile(tile); // mercator projection
        TileSource.scaleTile(tile); // re-scale from meters to local tile coords
    }
}
```

plain GeoJSON tile
===
プレインな GeoJSON FeatureCollection がそのまま入っている。国土地理院ベクトルタイル提供実験のタイルがこれ。

サンプル： http://cyberjapandata.gsi.go.jp/xyz/experimental_fgd/18/233118/102883.geojson

Mapzen/OSM.US-style GeoJSON tile
===
サンプル： http://vector.dev.mapzen.com/osm/all/17/116556/51441.json

GeoJSON Feature Collection を、OSM レイヤ名をキーとする JavaScript Object にした形になっている。

仕様は https://github.com/mapzen/vector-datasource/wiki/Mapzen-Vector-Tile-Service に明示されている（Multiple layers in GeoJSON）。

```javascript
{
   "earth": {
      "type":"FeatureCollection",
      "features": [...],
      ...
   },
   "landuse": {
      "type":"FeatureCollection",
      "features": [...],
      ...
   }
}
```

多分、この方が描画順の整理など簡単なのだからだと思う。Mapzen の styles.yaml とかを見ていると、そのように思う。

間を取り持つには
===
間を取り持つのに、サーバサイドでダブルにデータを持つのも芸がない。Tangram に plain GeoJSON tile を扱うクラスを追加するのが正統な手段である。Service Worker の変な使い方として、インタラプトした後に変形するということが将来ありえるだろうか。

自分の作業場所
===
https://github.com/handygeospatial/tangram-playground
IntelliJ IDEAにScalaプラグインがインストールでつまったときの対処法


#前置き
macでscalaプラグインを入れようとしたけど、インストールボタンを押してもインストールに失敗したのを打開したときのお話。

まず公式サイトからIntelliJ IDEAをDLしてインストール。起動画面などからプラグインの設定に行き、自分のほしいプラグインを探してインストールする。（java6が入っていないと起動しないので、homebrewでjava6をインストール。詳しくは[ここ](http://qiita.com/hereticreader/items/79d9bddb77efaf2ca255)）

単純にこれだけの話のはずなのに、scalaプラグインがインストールに失敗し続けた。

#対処法

プラグインのダウンロードで失敗しているようなので、[scalaプラグインのページ](http://plugins.jetbrains.com/plugin/?id=1347)に行って手動でプラグインをダウンロード。
([こっち](https://confluence.jetbrains.com/display/SCA/Scala+plugin+EAP)のほうが新しいということですが、インストールが出来なかったので再度修正？？)

scala-intellij-x.x.x.zipみたいな名前でダウンロードされると思う。IntelliJ IDEAを起動し、プラグインのインストールを開く。下の方の**install plugin from disk...**ってところを押し、さっきダウンロードしたzipを選択してインストール。（解凍したものではない）

IDEを再起動して完了。Create New ProkectからScalaプロジェクトが作れるようになっているでしょう。
インストールが終わったらさっきのzipは消してしまっても大丈夫です。
撮影画面でデバイス回転を禁止するには

# はじめに
アプリからカメラ撮影画面を呼び出し撮影する際に
デバイスの回転を抑制したい場合があります。

継承での実現となりました。

# クラス作成
UIImagePickerControllerを継承したクラスを作成します。

```lang:XXXCameraViewController.h
#import <UIKit/UIKit.h>

@interface XXXCameraViewController : UIImagePickerController

@end
```

```lang:XXXCameraViewController.m
#import "XXXCameraViewController.h"

@interface XXXCameraViewController ()

@end

@implementation XXXCameraViewController

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

@end
```

# 使用する
```lang:使用するにはこんな形
#import "XXXCameraViewController.h"

    XXXCameraViewController *cameraViewController = [[XXXCameraViewController alloc] init];
    [cameraViewController setDelegate:self];
    [cameraViewController setSourceType:UIImagePickerControllerSourceTypeCamera];
    
    [self presentViewController:cameraViewController animated:YES completion:nil];
```

# おわりに
何かに参考になりましたら幸いです。

# 参考
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImagePickerController_Class/index.html
chef の recipe を単体実行する３つの方法

Berkshelf を使っていると、knife solo cook 実行時に berks install (git clone 相当) && berks vendor (どこかに cp) && rsync が走って遅い。

recipe の単体動作確認をしたいだけなのに、knife solo cook やっていると日が暮れるので、レシピを単体で動作確認できる方法を調べた。

# 1. chef-apply

chef に [chef-apply](https://docs.chef.io/ctl_chef_apply.html) というコマンドが同梱されている。
これを使うと recipe ファイルを指定して、そのレシピだけを実行できるようだ。

```
chef-apply {recipe_file}
```

便利！と思ったが、どうも色々機能が足りない。

1. -j JSON_ATTRIBS オプションがなく attributes 指定できない ([プルリク](https://github.com/opscode/chef/pull/2735)送った)
2. template 展開できない
3. cookbook_path 指定ができない (他の cookbook に依存している recipe の実行ができない)

この辺の機能が必要でないなら、chef 同梱なので手軽に使えそうではある。

# 2. sandwich

[sandwich](https://github.com/sometimesfood/sandwich) という gem がある。基本的には chef-apply とやっていることは同じなのだが、こちらは template 展開ができる。

```
sandwich {recipe_file}
```

attributes 指定のオプションに関しては、[プルリク](https://github.com/sometimesfood/sandwich/pull/12) を送って使えるようになった。why-run もできなかったのだが、[できるようになった](https://github.com/sometimesfood/sandwich/pull/13)。

ただ、こちらも cookbook_path 指定ができない。

FYI: どうも実装を読む限り、レシピをファイル名で指定できるようにするため、cookbook をチートしていたりするようだ。指定できるようにするのはちょっと困難かもしれない。

# 3. chef-solo

chef-solo でも実行できる（結局、戻って来た感)。

```
chef-solo -o {run_list}
```

レシピファイル名指定ではなくて、run_list 指定なので、`recipe[cookbook_name::recipe_name]` とか `recipe_name` のような書式指定になる。cf. [run_list 書式大全](http://qiita.com/sawanoboly/items/e954bd3a4e156944bbb1)。シェルのファイル名補完が利かなくてちょっといらっとするが、これでレシピを単体実行できる。

cookbook_path は [solo.rb](https://docs.chef.io/config_rb_solo.html) を作成して、

```ruby:solo.rb
cookbook_path %w(vendor/cookbooks ..).map {|path| File.expand_path(path) }
```

```
$ chef-solo -c solo.rb -o {run_list}
```

のようにして指定できるので berks install 先のディレクトリに合わせて指定すればよい。cf. [Chef - berks install 先のディレクトリを指定する](http://qiita.com/sonots/items/b091f19e6a32546744d1)

もちろん template 展開もできるし、-j JSON_ATTRIBS オプションもある。

run_list の補完は利かないが、一番紛れがないかもしれない。
PocketやEvernoteのクリップを機械学習してくれるMyndが便利

毎日ブラウザからスマホから大量にPocketにRead it Laterしています。ニュースキュレーションアプリの[Mynd](https://mynd.jp/)はそんなPocketやEvernoteのクリップを機械学習してくれ、自分好みのニュースを毎日配信してくれます。


## 機械学習が賢い

毎日配信されるMy朝刊を読んでいますが、かなり的確にPocketのクリップの記録から自分好みのニュースを配信してくれます。ちょっとした外部記憶装置と電脳化を体験できます。

## ミニマルなUI

ブラウザやスマホのアプリはとてもシンプルで、ニュース配信とPocketやEvernoteへの送信機能だけです。


## EvernoteはクリップしたURLだけ学習

Evernoteの場合、クリップのURLからクロールしてテキストマイニングしてくれます。自分で書いたノートのテキストは見ないので安心です。

## 関連記事と関連書籍

関連記事も優秀で、Pocketの記録の中から関連のありそうなクリップを掘り出してくれます。毎日大量にRead it Laterして忘れているクリップも多いので、関心の呼び起こしに便利です。

関連書籍はAmazonから関連がありそうな書籍を紹介してくれます。

## Android Wearアプリ

Mynd WatchというAndroid Wearアプリがあります。スワイプでRead it Laterもできます。今のところ配信されるニュースが機械学習の結果でないのが残念ですが、ちょっとした暇つぶしになります。
pathを使ったアニメーションで円のprogressViewを作ってみた


![iphonePlay_2015011401.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/ba4bb2df-a07a-2bb2-5635-94f36c654f0a.gif "iphonePlay_2015011401.gif")


ソースはgithubに上げておきました。

[CircleProgressViewSample](https://github.com/rnsm504/CircleProgressViewSample)

グラフをパイ型にするかドーナツ型にするかについては、CircleProgressViewのlineWidthというプロパティを０にすればパイ型、そうでないならドーナツ型になるようにしました。
後はトラックとプログレスの色、進捗の度合いをアニメーションするかどうかを選べるようにしておきました。


今回は参考になりそうなものを探していたら既に完成形みたいのが上がってたのでそれを元にpathアニメーション部分だけを抜き取ったような形で作ってみました。あくまで今回の目的はpathを使ったアニメーションを試す事だったので。


元ネタ
[DACircularProgress](https://github.com/danielamitay/DACircularProgress)

CALayerのサブクラス関係で調べたときに参考になったページ
[CALayerを使って独自のプロパティをアニメーションさせる](http://atsusy.blogspot.jp/2011/04/calayer.html)

補足ネタ

当初、CALayerのサブクラスをUIViewのサブクラスのinitメソッド内で呼び出して位置を指定したりしてたのですが、layerとviewの位置がずれるという現象が発生しました。どうもサブビューのframeの位置が決定するのはUIViewControllerのviewDidLayoutSubviewsが呼び出されたタイミングらしく、（つまりサブビューのinitメソッドはそれまでに呼び出されている）それまでにサブビュー内でframeをいじるのは良くないみたいです。


```
    override func viewDidLayoutSubviews() {
    }

```
Workflow plugin で Parameterized Trigger Build っぽいこと


# 結論

できることはできるけど、Parameterized Trigger Plugin のようにお手軽ではない。

# 環境

* Mac OS X Yosemite
* Jenkins v1.596

# ただのパラメータ付きビルド

パラメータ付きビルドは、↓のような感じでできました。

```
build job: 'job_name', parameters: [StringParameterValue('param_name', 'value')]
```

ドキュメントにはぱっと情報が見当たらず、テストコードでようやく使い方が分かりました...
https://github.com/jenkinsci/workflow-plugin/blob/master/aggregator/src/test/java/org/jenkinsci/plugins/workflow/steps/build/BuildTriggerStepTest.java#L146

# Workflowジョブに設定したパラメータを引き継いで子ジョブをビルドする

できなくはない...

```
current_env = this.getProperty("env"). getEnvironment()
current_build = Jenkins.instance.getItemByFullName(current_env['JOB_NAME']).getBuildByNumber(current_env['BUILD_NUMBER'].toInteger())
current_params = current_build.getActions(ParametersAction.class). parameters[0]

params = []

current_params.each {
  params.push(it.class.newInstance(it.name, it.value))
}

current_build = null
current_params = null

build job: 'job', parameters: params
```

ビルド中な自分自身のインスタンスを取得して、List<ParameterValue＞ を取ってくる。

* 01/20 修正
    * 変数をそのままにしておくと、java.io.NotSerializableException が発生するのでnull代入しました。

# 悩みの種

## さっくり実行時のParameterValueインスタンスを取得できない

`this.getProperty("env").getEnvironment()` で取得できる値に、ジョブのパラメータは含まれない。

例えば↓のようなものが入っている。

```
{BUILD_DISPLAY_NAME=#35, BUILD_ID=2015-01-15_01-00-35, BUILD_NUMBER=35, BUILD_TAG=jenkins-workflow-sample-35, CLASSPATH=, HUDSON_HOME=/Users/yasuhiroki/.jenkins, HUDSON_SERVER_COOKIE=6030517cc6d72944, JENKINS_HOME=/Users/yasuhiroki/.jenkins, JENKINS_SERVER_COOKIE=6030517cc6d72944, JOB_NAME=workflow-sample}
```

`this` は、`WorkflowScript`クラスを指していて、使えるメソッドは↓の通り。

```
[__$swapInit, equals, evaluate, getBinding, getClass, getMetaClass, getProperty, hashCode, invokeMethod, main, notify, notifyAll, print, printf, println, run, setBinding, setMetaClass, setProperty, toString, wait]
```

パラメータの値だけなら、パラメータ名がそのまま変数になっているのだけれど、String型では子ジョブに渡せない。

# とはいえ

一度、仕組みを作ってしまえば、Parameterized Trigger よりも自由にパラメータ付きビルドできそうですね。

# 補足

https://github.com/jenkinsci/workflow-plugin/blob/master/COMPATIBILITY.md

Parameterized Build Trigger Plugin そのものを、Workflow Pluginに対応させる予定があるようです。
急ぎでなければ待つか、置き換えできるように作っておくと良さそうです。

# 補足2 2015/10/04

どうやら 2015/09 に、Parameterized Build Trigger Plugin が、Workflow Pluginに対応していたようです。

https://issues.jenkins-ci.org/browse/JENKINS-26050
https://github.com/jenkinsci/workflow-plugin/commit/ad0ae293d06a22284930bf6bb4f7096b2f357771

どのように利用できるようになったのか試せていませんが...。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（５）弾を発射

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# 弾を撃てるようにする
キーが押されたら弾を発射する処理を作ってみます。

「**bearChara.coffee**」を開いて、インスタンスメソッド「**behavior**」を下記のように編集します。

```coffeescript
     behavior:->
         super()
         switch @_processnumber
             when 0
                 axes = PADAXES[0]
                 @x += axes[HORIZONTAL] * 4
                 @y += axes[VERTICAL] * 4
                 # 以下追加分
                 buttons = PADBUTTONS[0]
                 if (buttons[0])
                     addObject
                         image: 'bear'
                         motionObj: bullet
                         x: @x
                         y: @y
                         ys: -16
                         width: 32
                         height: 32
                         animlist: [
                             [100, [0, 1, 0, 2]]
                         ]
```

追加分を説明していきます。

```coffeescript
                 buttons = PADBUTTONS[0]
```
「**PADBUTTONS[0]**」は、最初に接続したゲームパッドのボタン、もしくはキーボードの情報が格納されています。

```coffeescript
                 if (buttons[0])
```
「**button[0]**」は、ゲームパッドのボタン0、もしくはキーボードの「z」か「スペースバー」が押されていたら「**true**」が格納されています。
もし押されていた場合、新しいスプライトを生成します。
「**bullet**」クラスで動作が定義されたスプライトを生成します。
メソッドの修正が終了しましたら、保存してコンパイルしてください。
次に、ゲームのトップディレクトリ（ディレクトリ「game01」直下）で、

$ **enforce derive bullet**

を実行して新規クラスファイルを生成します。
「**src**」ディレクトリに「**bullet.coffee**」が生成されているのを確認しましたらエディタで開き、「**behavior**」を下記のように修正します。

```coffeescript
    behavior:-> 
        super()
        switch @_processnumber
            when 0
                if (@y < 0)
                    removeObject(@)
```

キャラのy座標が0（画面上端）より小さくなった場合、自分自信（@）を削除する処理を追記しました。

修正が終了しましたら、保存してコンパイルしてください。
コンパイルが正常に終了しましたら、ブラウザをリロードしてみてください。
スペースバーを押すとクマが上に飛んで行くと思います。


[チュートリアル（４）](http://qiita.com/digitarhythm/items/2df821c91e2e0a33ab19) <--- ⬛︎ ---> [チュートリアル（６）](http://qiita.com/digitarhythm/items/33f53aa8c4de119b491a)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
第21章 Pseudokey Neat-Freak(疑似キー潔癖症)

## 目的: 欠番を詰める

| bug_id | status | product_name |
|:-----------|------------:|:------------:|
| 1 | OPEN | OPEN RoundFile |
| 2 | FIXED | ReConsider |
| 4 | OPEN | ReConsider |

- 番号が連番になっていない事を気にしない人もいる
- 一方、欠番を気にする人がいる
	- なんで bug_id 3 がないんだ
	- 欠番が生じた事の責任をとらされるんではないか
欠番があることの不安を解消するため、番号を埋めようとする ← アンチパターン

## アンチパターン: 隙間を埋める
欠けてる行を見つけたとき、それを埋めたいと考える

### 欠番を割り当てる
新しい行の挿入時に、欠番番号のうち最も小さいものを割り当てる方法

- 最も小さい欠番の値特定のために独自のクエリを利用しなければならない
- 
```
SELECT b1.bug_id + 1 AS max_bug_id
FROM Bugs b1
LEFT OUTER JOIN Bugs AS b2 ON b1.bug_id + 1 = b2.bug_id
WHERE b2.bug_id IS NULL
ORDER BY b1.bug_id LIMIT 1;
```

ばぐりそう。。。

- 複数の挿入が同時に実行された場合
duplicateしそう。。。

| bug_id | status | product_name |
|:-----------|------------:|:------------:|
| 1 | OPEN | OPEN RoundFile |
| 2 | FIXED | ReConsider |
| 4 | OPEN | ReConsider |
| 3 | NEW | Visual TurboBuilder |
※ bug_id 3 が新しいレコード

### 既存業に番号を振り直す
新しい行の挿入時に埋めていたら欠番がなくなるのに時間がかかる！
=> 既存行並び替えちゃえ

| bug_id | status | product_name |
|:-----------|------------:|:------------:|
| 1 | OPEN | OPEN RoundFile |
| 2 | FIXED | ReConsider |
| 3 | OPEN | ReConsider |
※ bug_id 4 を bug_id=3 に変更

- そもそも降り直しが大変
	- 欠番の特定
	- 欠けてる行が多かった場合の処理

- 外部キーとして参照されている場合、主キーが変更されると参照できなくなっちゃう

- 存在しない事に意味があるかもしれない
	- 削除されたデータ

### アンチパターンの見つけ方
- 「挿入をロールバックした後で自動生成された ID 値を再利用するにはどうすればいい？」
- 「bug_id の４番になにが起こったの」
- 「使用されていない最初のIDを取得するクエリはどうやって書いたらいい？」
- 「番号が足らなくなったらどうしよう」

### アンチパターンを用いてもよい場合
なし！ 疑似キー潔癖症だめ、絶対
- 疑似キーの値そのものが意味を持つべきでない
- 主キーが意味をもつのであれば、それは自然キーである可能性を疑うべき

### 解決策: 疑似キーの欠番は埋めない
主キーの値は一意で非NULL の値である必要gあある。
ルールはそれだけで連続する必要がない。
 
#### 行のナンバリング
- 疑似キーは単調増かする整数値なので行番号と同等に見える
	- しかし主キーは一意に特定するためのもの、行番号は結果セットの行の順序であり役割が違う
	- 主キーを行番号として利用してはいけない
- 行番号を使用する場合(Pagination などで行のサブセットを取得したい場合)には、単調増かで連続した真の行番号を使う必要がある
- Window function の ROW_NUMBER
- LIMIT, OFFSET

### GUID (UUID) の使用
128bit の擬似乱数
- 同じ機別子が生成される可能性がきわめて低いので、事実上一意な
	- 並列性がたかい
	- 値がランダムなので誰も順番がきにならない
	- インデックス効率がシーケンシャルな ID より劣る
	- GUID の格納には16バイト 一般的な整数は4バイトでディスク効率がわるい
	- 値がランダムなので生成された順番などを推測できない


### 最も重要な問題
「疑似キーの欠番をうめろ」という依頼がきたらどうやって断るのか
コミュニケーションの問題です

- 主キーを変更したいという要求にたいして、適切に説明し納得してもらう
	- 欠番はシステムに害はない、ロールバックや削除なので欠番ができるのは当然のことである
	- 欠番を探すのではなく、新しい番号を割り当てる事によって処理が高速、エラーが減る
	- 主キーの変更がどれだけリスクが大きくコストがかかるか見積もりを提示する
	- それでも主キーの変更が必要であれば、主キー自体に意味が発生しており自然キーなので、自然きオーをしようする

### まとめ
疑似キーは行を一意にとくていするもの
行番号とはちがいます！
vccwとVagrantでWordPressのローカル開発環境を作りました

vccwでWordPressのローカル開発環境を作るのが定番らしいのでやってみました。

# 環境
* Mac
* VirtualBox
* Vagrant

条件としてVagrantとVirtualBoxの環境が用意されているものとします。

# vccwのサイトを見る
あとはこのサイトの通りにやるだけです。
http://vccw.cc/

# vccwでWordpressのローカル環境を構築
vccw.gitをgit cloneします。

```bash:vccw.gitをクローン
git clone git@github.com:miya0001/vccw.git
```
次は、`vccw`というディレクトリができているので移動します。

## おまけ：ここでvccwというディレクトリ以外を指定したい場合は

```
git clone git@github.com:miya0001/vccw.git ディレクトリ名
```
上記のように指定するといいです。


## ディレクトリを移動
`Vagrantfile`というファイルが置いてあるディレクトリへ移動します。

```bash:vccwディレクトリに移動
cd vccw
```

## おまけ：設定ファイルの作成
site.ymlというファイルをコピーすると、起動するVagrantの設定を書くことができます。もしこの設定が不要なら、次の <a href="http://qiita.com/pugiemonn/items/043bf3a959cb8be69462#vagrant%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92">Vagrantの立ち上げ</a> まで進んでください。

```bash:site.ymlをコピー
cp provision/default.yml ./site.yml
```
色々設定できるので使うと便利かと思います。

```yaml:site.ymlを編集
hostname: pugiemonn.com

plugins:
  - dynamic-hostname
  - wp-total-hacks
  - tinymce-templates
  - wp-super-cache
  - online-lesson-booking

php_version: 5.6.9
```
なんと！PHPのバージョンから、最初にインストールするプラグインまで一括でインストールできるのです。これはすごいです。。


## Vagrantを立ち上げ
vagrantを立ち上げます。

```bash:Vagrant環境をスタート
vagrant up
```
めっちゃ遅いです。

Vagrantの開発環境にアクセスします。
http://192.168.33.10/

するとWordpressの画面が表示されています。これはすごい。

管理画面へは http://192.168.33.10/wp-login.php からアクセスします。

```bash:vccwで作ったWordPressのデフォルトユーザーとパスワード
Default user
Username: admin
Password: admin
```

## MySQLのrootパスワード
vccwのMySQLをrootで使いたいときにvccwのrootユーザーにはパスワードがかかっています。

```bash:vccwで作ったMySQLのrootユーザーとパスワード
Username: root
Password: wordpress
```
デフォルトで`wordpress`とパスワードがかかっているので、rootユーザでログインするときはこれを利用すると便利です。

# わからなかったところ
公式サイトだと  http://wordpress.local/ でWordPressが表示できると書いてありますが、ボクの環境だといけませんでした。/etc/hostsにかけってことなのかしら。なにがいけないんでしょ(☝ ՞ਊ ՞)

あとvccwはWordPressごとにVagrantをたちあげないといけないのでしょうか？そんなものかな？？

# 感想
WordPressの環境構築が簡単すぎてすごいです。

# おまけ：前に書いた昔からの環境構築手順
vccwを使わないVagrantのWordPress開発環境構築手順
http://qiita.com/pugiemonn/items/9e1bccf3344b74cea832
IoT/M2M向け周波数・通信規格まとめ

IoT/M2Mでは多種多様な周波数・通信規格が出てきてややこしいのでまとめてみた。

# 周波数
基本的にISMバンド（Industrial, Scientific and Medical Bandの略）が使われる。主に産業、科学、医療向け用途に割り当てられた周波数帯域で免許不要。 M2M/IoT では 2.4GHz と 920MHz が使用される。
※日本国内でも 2012/07/25 から 920MHz が使用できることになった。

## 2.4GHz
無線 LAN や電子レンジで使用される周波数帯。すでにかなり普及しているので、電波干渉に頭を悩ますことが多い。

## 920MHz
最近はサブギガ帯と言われることが多い。 2.4GHz に比べて電波干渉が少なく、回り込み特性があるため今後のメイン周波数と見られている。
ただし、 950MHz 帯を使用していた RFID が周波数移行したため、今後は電波干渉が発生しやすくなると思われる。


# IEEE 関連規格
OSI参照モデルの物理層またはデータリンク層にあたる部分を定義する。

## IEEE802.11
無線 LAN（WLAN）に関する標準規格。いわゆる Wi-Fi 。
802.11b/g/n が 2.4GHz 帯。 802.11n/ac が 5GHz 帯を使う。
OSI参照モデルの物理層にあたる部分を定義する。

## IEEE802.15
無線PAN（WPAN）に関する標準規格。 M2M/IoT での中心的な通信規格。

### IEEE802.15.1
Bluetooth のこと。 2.4GHz 帯を使う。

### IEEE802.15.4
Zigbee で使われる通信規格。 2.4GHz と 920MHz 帯を使う。
802.15.4 = Zigbee と勘違いされることが多いが、独自プロトコルも存在する。OSI参照モデルの物理層とデータリンク層にあたる部分を定義する。

### IEEE802.15.4g
Wi-SUN で使われる通信規格。 920MHz 帯を使う。
OSI参照モデルの物理層にあたる部分を定義する。

### IEEE802.15.4e
Wi-SUN で使われる通信規格。
OSI参照モデルのデータリンク層にあたる部分を定義する。


# 通信プロトコル

## Bluetooth
Bluetooth SIG が策定するプロトコル。最新バージョンは 4.2 。
バージョン 4.0 で省電力機能が特徴の BLE(Bluetooth Low Energy) を統合した。 iBeacon は BLE を使った技術。ビーコンと名乗る製品は何種類かあるが、ただの BLE 機器のことがあるので注意。
バージョン 4.2 で 6LoWPAN をサポートし、 IPv6 アドレスを持てるようになった。
このようにバージョン毎に機能追加し、通信速度も異なる。


## ECHONET Lite
エコーネットコンソーシアムが策定した通信プロトコル。
従来の ECHONET を作り直し、アプリケーション層のみを定義している。
下位層は特定していないが、事実上　Wi-SUN スタックが想定されている。


## EnOcean
ドイツにある同名の会社が開発したプロトコル。
最大の特徴は「エナジーハーベスト」と呼ばれるバッテリーレス技術。
周波数は 315MHz、928MHz （日本国内の場合）。


## IEEE1888(FIAP)
日本の東大グリーンICTプロジェクト発のBEMS・スマートグリッド向けプロトコル。
HTTP/XMLの通信方式を採用しており、フレームワークに近い規格。

 
## Wi-SUN
日本の情報通信研究機構(NICT)が中心となって開発されたプロトコル。
Wi-SUNスタックでは物理層に IEEE802.15.4g を、データリンク層に  IEEE802.15.4e を使用する。ネットワーク層には 6LowPAN を使用し、アプリケーション層に後述する ECHONET Lite を想定している。
通信速度は 200kbps 程度だが、 500m 近い到達距離やマルチホップ通信
が大きな特徴。

Wi-SUN Alliance が対応機器の相互接続性の試験や製品の認証を行う。
東京電力のスマートメーターとHEMSコントローラ間の通信（Bルート）に採用されている。

## Zigbee
ZigBee Alliance で策定するプロトコル。 Zigbee スタックではOSI参照モデルのネットワーク層以上にあたる部分を定義する。通信速度は 250kbps で、低消費電力である点とメッシュネットワークが大きな特長。

### Zigbee PRO
Zigbee の仕様で、 Zigbee 2007 のこと。現在 Zigbee といえば この仕様を指す。

### Zigbee Green Power
Zigbee 2012 で Zigbee PRO に追加された仕様。 EnOcean と同様にバッテリーレスが最大の特徴。

### Zigbee IP
IEEE802.15.4g および IEEE802.15.4e を採用し、 6LowPAN で IPv6 アドレスを持てるようにした Zigbee スタック。 ECHONET Lite の下位層として採用されることを想定している。


# Z-Wave
 Zensys 社と Z-Wave アライアンスによって策定された通信規格。日本では920MHz帯を使う。
海外ではメジャーらしいが、日本では2012年7月に使えるようになった。その時話題になったくらいなので、今後の普及は難しいと思われる。
node.jsインストールメモ for Mac（nvm使用）

<h2>パッケージ版のnode.jsをインストールしている場合、事前にアンインストール</h2>
<pre>
$ lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
$ sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
</pre>
<pre>
$ sudo rm -rf ~/.npm
</pre>

<h2>node.jsインストール（nvm使用）</h2>
（本例ではv0.11.xをインストール）
<pre>
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm install 0.11
$ node -v
v0.11.14
</pre>

<h2>ターミナル起動時にnvm/node.jsを自動的に有効化</h2>
`~/.bashrc`,`~/.profile`,`~/.zshrc`のいずれかに
nvm/node.js有効化コマンドを追加
<pre>
source ~/.nvm/nvm.sh
nvm use 0.11
</pre>
parallellaのCPU温度取得

parallellaは冷却をちゃんとしないと性能出ないし、最悪壊れちゃうらしい。
特に2014年7月10日以前の物はファンを使用してくれと[説明書](http://www.parallella.org/docs/parallella_manual.pdf)に書いてあった。

じゃ、温度はどうやって把握するのかというと、[専用のツール](https://github.com/parallella/parallella-utils)が公開されている。
xtempってのかそれ。

このツールはZynqコアの温度をグラフで表示してくれる。
しかしこのツールはGUIで使用するのが前提。
CUIで無理やり使おうとすると

```bash
ERROR: Unable to open X display
```
となってしまい動かん。
温度さえ把握出来れば良いというのなら、
親切な人が温度を計算した[スクリプト](https://gist.github.com/Idorobots/668e7c43bc1d8a2776a6)を公開している。

```bash
apt-get install -y bc
git clone https://gist.github.com/668e7c43bc1d8a2776a6.git
cd 668e7c43bc1d8a2776a6/
chmod 755 gistfile1.sh
./gistfile1.sh
Zynq Temp: 47.6 C / 117.6 F
```

特に重い処理させてないけど47.6℃。
それは高いのか、それともこんなもんなのか、分からん。
bufioのエラーハンドリングをチラ見。

Rob Pike先生の[Errors are values - The Go Blog](http://blog.golang.org/errors-are-values)を読んだら下記のようなコードが書いてありまして、

```go
scanner := bufio.NewScanner(input)
for scanner.Scan() {
    token := scanner.Text()
    // process token
}
if err := scanner.Err(); err != nil {
    // process the error
}
``` 

上の記事を読めばだいたい想像がつくのですが、実際どんな実装なのかと。
まず、Scanner構造体。

```go:bufio/scan.go
type Scanner struct {
	r            io.Reader // The reader provided by the client.
	split        SplitFunc // The function to split the tokens.
	maxTokenSize int       // Maximum size of a token; modified by tests.
	token        []byte    // Last token returned by split.
	buf          []byte    // Buffer used as argument to split.
	start        int       // First non-processed byte in buf.
	end          int       // End of data in buf.
	err          error     // Sticky error.
}
```

Err()で最初のエラーを取得できる。

```go:bufio/scan.go
// Err returns the first non-EOF error that was encountered by the Scanner.
func (s *Scanner) Err() error {
	if s.err == io.EOF {
		return nil
	}
	return s.err
}
```

setError(error)は下記。

```go:bufio/scan.go
// setErr records the first error encountered.
func (s *Scanner) setErr(err error) {
	if s.err == nil || s.err == io.EOF {
		s.err = err
	}
}
```

で、Scan()の中でs.setErr(error)でエラーをセット。

```go:bufio/scan.go
func (s *Scanner) Scan() bool {
	// Loop until we have a token.
	for {
		// See if we can get a token with what we already have.
		if s.end > s.start {
			advance, token, err := s.split(s.buf[s.start:s.end], s.err != nil)
			if err != nil {
				s.setErr(err)
				return false
			}
//中略
		// Is the buffer full? If so, resize.
		if s.end == len(s.buf) {
			if len(s.buf) >= s.maxTokenSize {
				s.setErr(ErrTooLong)
				return false
			}
//中略
		for loop := 0; ; {
			n, err := s.r.Read(s.buf[s.end:len(s.buf)])
			s.end += n
			if err != nil {
				s.setErr(err)
				break
			}
			if n > 0 {
				break
			}
			loop++
			if loop > maxConsecutiveEmptyReads {
				s.setErr(io.ErrNoProgress)
				break
			}
		}
// 以下略
```

なるほどなるほど。
使えそうなところがあったら使ってみよう。
iosやってる人が、android開発に着手してみた

iosアプリ作っているけど、android開発も初めて見たときのメモ
違いを主に書いていくつもりです。

* 環境

|||
|---|---|
| OS | MacOSX10.10 |
|IDE|Android Studio|
|Androidバージョン|5.0|


# 1実機インストールがめっちゃ楽だった
|||
|---|---|
|1|マックに、android Studioをインストール|
|2|実機の設定アプリで、デバッグモードにする|
|3|マックと実機をつなぐ|
|4|下記画像の緑横→を押す|
![スクリーンショット 2015-01-15 0.35.13.png](https://qiita-image-store.s3.amazonaws.com/0/24266/36a245de-cd99-fafb-221f-e7730960677b.png "スクリーンショット 2015-01-15 0.35.13.png")

上記をするだけ、実機で実行できます。iOSみたいに証明書がどうのこうということがなかった。

# 2IDEのメソッドコメントの方法が違った。
xcodeの場合、プラグインをいれることで、メソッドの上の行で、「///」とするとjavadoc風コメントを出すことができる
android studioの場合は、「/**」のあとにエンターキーを押す必要があった。

# 3 実行時のアプリとIDEのつながりが違った
xcodeの場合、runしてアプリ実行中は、xcodeとアプリはつながった状態になっている。そのため、端末とのケーブルを外すとアプリは落ち、xcodeがエラーを出す。運が悪いと、xcodeが固まる。
android studioの場合は、実行中にケーブルを抜いても大丈夫っぽい。あくまでapkファイルを送っているだけと聞いたことがある。apkをおくっているだけかは未検証。

# 4そのうち
VisualStudioのプロパティシートのメモ

最近プロパティシートの使い方を覚えたのでメモ

# プロパティシートとは
プロパティシートの役割としては、Visual Studioのプロジェクトの設定の共通部分を外に出すことが出来る機能。
作成した.propsファイルを使い回せるので便利

# 使い方
VisualStudioの「メニュー->表示」->「その他のウインドウ」->「プロパティマネージャ」を選択  
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/8a962100-b060-0940-bc7b-c697625c3d3c.png)

プロパティマネージャの対象のプロジェクトを「右クリック」新しい、プロジェクト　プロパティシートの追加を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/166f1f27-ad63-34fd-17a3-c7a0b1202dbb.png)
後は今まで通り設定すれば設定完了。
DebugとReleaseの両方に追加すれば、どちらも同じ設定を使うことが出来る
UILabelに画像を表示するためのカテゴリを書いてみた


## やりたかったこと
UILabelと画像を一緒に扱いたい時が多々あるので、そのためのカテゴリーを書いてみた。

## 内容
デフォルトではstringとimageを渡すと、先頭に画像がくるようにしてます。
画像の位置と文字の何番目に画像を入れるか、も指定できるように。

## 実装

NSMutableAttributedString+UIImage.h

```objc

@interface NSMutableAttributedString (UIImage)

- (instancetype)initWithString:(NSString *)string image:(UIImage *)image;

- (instancetype)initWithString:(NSString *)string image:(UIImage *)image atIndex:(NSUInteger)index;

- (instancetype)initWithString:(NSString *)string image:(UIImage *)image point:(CGPoint)point;

- (instancetype)initWithString:(NSString *)string
                         image:(UIImage *)image
                         point:(CGPoint)point
                       atIndex:(NSUInteger)index;
@end

```

NSMutableAttributedString+UIImage.m

```objc

#import "NSMutableAttributedString+UIImage.h"

@implementation NSMutableAttributedString (UIImage)

- (instancetype)initWithString:(NSString *)string image:(UIImage *)image {
    return [self initWithString:string image:image point:CGPointZero atIndex:0];
}

- (instancetype)initWithString:(NSString *)string image:(UIImage *)image atIndex:(NSUInteger)index {
    return [self initWithString:string image:image point:CGPointZero atIndex:index];
}

- (instancetype)initWithString:(NSString *)string image:(UIImage *)image point:(CGPoint)point {
    return [self initWithString:string image:image point:point atIndex:0];
}

- (instancetype)initWithString:(NSString *)string
                         image:(UIImage *)image
                         point:(CGPoint)point
                       atIndex:(NSUInteger)index {
    if (!string) {
        return nil;
    }
    self = [self initWithString:string];
    if (self) {
        NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
        textAttachment.image = image;
        textAttachment.bounds = CGRectMake(point.x, point.y, image.size.width, image.size.height);
        NSAttributedString *attributedString =
          [NSAttributedString attributedStringWithAttachment:textAttachment];
        [self insertAttributedString:attributedString atIndex:index];
    }
    return self;
}

@end
```

## 使用イメージ

```objc

- (void)viewDidLoad {
	self.contentLabel.attributedText = 
		[[NSMutableAttributedString alloc] initWithString:@"あいうえお" 
													image:[UIImage imageNamed:@"test"]
           		                                     point:CGPointMake(0, -2)];
	self.contentLabel.attributedText = 
		[[NSMutableAttributedString alloc] initWithString:@"あいうえお" 
													image:[UIImage imageNamed:@"test"]
           		                                    point:CGPointMake(0,-10)
												  atIndex:2];

}
```

## 参考
[UILabelに画像を表示する](http://qiita.com/nagisawks/items/ff8232e92a2e9525ab0b)
java.text.DecimalFormatの四捨五入が失敗するバグ

Javaで「小数第N位以下を四捨五入したい」「ある桁はゼロ埋めしたいけど、あとは桁があるときだけ表示したい」などなど、数値を文字列で表現したい場合には、 `java.text.DecimalFormat` を使うのが便利ですね。

今回はこのDecimalFormatで四捨五入が失敗するバグを見つけたので紹介します。

## 環境

```sh
$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
```

* OS: OS X Yosemite 10.10.1
* JDK: Oracle JDK 1.8 u25

## 現象

```java:Java8DecimalFormat.java
import java.text.DecimalFormat;
import java.math.RoundingMode;

class Java8DecimalFormat {
    public static void main(String[] args) {
        final DecimalFormat df = new DecimalFormat("0.##");
        df.setRoundingMode(RoundingMode.HALF_UP);

        String hoge = df.format(10.145);
        System.out.println(hoge); // 10.14

        String fuga = df.format(13.555);
        System.out.println(fuga); // 13.55
    }
}
```

四捨五入を期待して `RoundingMode.HALF_UP` を指定しているにもかかわらず、挙動としては切り捨てになってしまっています。

## 実際バグらしい

[[#JDK-8062013] DecimalFormat / rounding / HALF_UP - Java Bug System](https://bugs.openjdk.java.net/browse/JDK-8062013)

OpenJDKのバグトラッカーに同様の報告が上がっていました。ver1.8.0u20にも同様のバグがあったので、それなりに前に混入したバグなのかもしれませんね。

テストコードの処理系をJDK1.7からJDK1.8に切り替えた途端にいくつかのテストが通らなくなり、原因を色々探した結果がこれでした。さて、どうしたものか。。。

## 追記: 1/15 12:40

問題切り分けのために、他のパターンでも実験してみました。

### Java7環境

```java:jdk1.7.0_21
String hoge = df.format(10.145);
System.out.println(hoge); // 10.15

String fuga = df.format(13.555);
System.out.println(fuga); // 13.56
```

JDK1.7.0u21環境での実行結果です。期待した結果が出ています。

### Java8環境別バージョン

> 10.145 は 10.1449(以下略)という内部数値だったはず

コメント欄で上記のご意見をいただいたので、もう一桁加えてみました。

```java:jdk1.8.0_25
String hoge = df.format(10.1451);
System.out.println(hoge); // 10.15

String fuga = df.format(13.5551);
System.out.println(fuga); // 13.56
```

期待した結果が出ました。

### おまけ：Java8環境でバイナリ的に綺麗になるように

丸め誤差の問題であれば、バイナリ的に綺麗になる $2^{-3}=0.125$ を処理する分には問題が起きないはずですね。

```java:jdk1.8.0_25
String piyo = df.format(0.125);
System.out.println(piyo); // 0.13
```

期待した結果が出ました。

### まとめ

というわけで、古き良き浮動小数点の丸め誤差問題でした。

「java.text.DecimalFormatの四捨五入が切り捨てになるバグ」というタイトルで公開しましたが、実際には切り捨てではなく「丸め誤差で5が4扱いになってしまう」という現象でしたので、少しタイトルを変えました。
Proxy環境下でAWS SDK for Python(boto)を使う

AWSをいじるために、botoライブラリを使ってPythonスクリプトを作っていた時に、Proxy環境下で嵌ったのでメモしておく。
なお、ベストプラクティスにはならない、バッドノウハウに近いのでご注意ください。

#環境
・Linux(RHEL6.5)
・Python3.3.6
・AWS SDK for Python(boto2.34.0)
・HTTP Proxy環境下

#事象
Proxy経由だと、APIをCallする際に以下の様なエラーが出る。

```
# python3
>>> import boto.ec2
>>> conn = boto.ec2.connect_to_region(‘ap-northeast-1’)
>>> conn.get_only_instances(instance_ids=[‘i-0de8dc14’])
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/ec2/connection.py”, line 623, in get_only_instances
    next_token=next_token)
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/ec2/connection.py”, line 682, in get_all_reservations
    [(‘item’, Reservation)], verb=‘POST’)
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 1166, in get_list
    response = self.make_request(action, params, path, verb)
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 1112, in make_request
    return self._mexe(http_request)
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 913, in _mexe
    self.is_secure)
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 705, in get_http_connection
    return self.new_http_connection(host, port, is_secure)
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 747, in new_http_connection
    connection = self.proxy_ssl(host, is_secure and 443 or 80)
  File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 796, in proxy_ssl
    sock.sendall(“CONNECT %s HTTP/1.0\r\n” % host)
TypeError: ‘str’ does not support the buffer interface
```

#暫定対処
SSL通信が上手く通過出来てなかったように見えるので、
connectionを張る際に、`is_secure=False`を付けることで接続できた。
ただし、その設定値名の通り非SSL通信となりそうなので、利用シーンは気をつけたほうが良いかも。

```
>>> conn = boto.ec2.connect_to_region(‘ap-northeast-1’,is_secure=False)
>>> conn.get_only_instances(instance_ids=[‘i-0de8dc14’])
>>> [Instance:i-0de8dc14]
```

#botoのconfig
botoライブラリには実行時にいくつかの設定を読みこませられるそうです。

>
> - `/etc/boto.cfg` - for site-wide settings that all users on this machine > will use
> - `~/.boto` - for user-specific settings
> - `~/.aws/credentials` - for credentials shared between SDKs
>
> [Boto Config — boto v2.35.1](http://boto.readthedocs.org/en/latest/boto_config_tut.html)

Proxyに関しては、以下のように記述すれば良さそう。

```:~/.boto
[Boto]
proxy = myproxy.com
proxy_port = 8080
```

ですが、私の環境ではこれがなぜか上手く読み込めてなさそうだったので、暫定対処としてハードコーディングに至りました。
この辺り、ノウハウある方はぜひコメント頂ければと思います。
vagrant+virtualboxでapache+php開発環境構築



構築の流れをメモします。
vagrantとvirtualboxのインストールは割愛


webサーバにapache, プログラミグ言語がphpという環境を
centos6.5上に作成します

#1).Boxの取得

作業ディレクトリを用意

```
$ mkdir vagrant
$ cd vagrant
```

[Vagrantbox.es](http://www.vagrantbox.es) から好みのOSを選択して、boxに追加。今回は、「CentOS 6.5 x86_64」にしました。

```
$ vagrant box add centos65x86_64 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

...
Successfully added box 'centos65x86_64' with provider 'virtualbox'!
```

boxの確認。先ほどaddしたものが追加されている。

```
$ vagrant box list
centos65x86_64 (virtualbox)
```

#2).vagrantfileの作成
以下コマンドで初期化

```
$ mkdir centos65x86_64
$ cd centos65x86_64
$ vagrant init centos65x86_64
```

実行後「Vagrantfile」が作成される。ただ今回は、何も修正しないで利用します。

#3).vmの作成
以下コマンドで、VMを作成する

```
$ vagrant up
```

コマンド終了後、確認をする

```
$ vagrant status
```

#4).vmにログイン

sshによりログイン

```
$ vagrant ssh
$ cat /etc/redhat-release 
CentOS release 6.5 (Final)
```

#5).apache+phpのインストール
まずは、yum update

```
$ sudo yum update
```

続いて、apache+phpを。

```
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

$ sudo yum install --enablerepo=remi --enablerepo=remi-php55 php
```

phpのバージョン確認

```
$ php -v
PHP 5.5.20 (cli) (built: Dec 17 2014 15:09:12)
```

apache起動。iptablesは無効にしておきます。

```
$ sudo service httpd start
$ sudo chkconfig httpd on

$ sudo service iptables stop
$ sudo chkconfig iptables off
```

#6).vagrantfileの設定変更

ホストからvm内のapacheにアクセスできるように、Vagrantfileの以下の部分を修正する

```
config.vm.network :private_network, ip: "192.168.33.10"
```

設定変更を反映

```
$ vagrant reload
```

IPアドレス指定でブラウザからアクセス。
vm内でアクセスログを監視して確認

```
$ sudo tail -f /var/log/httpd/access_log
```

apacheのテストページが表示されればOK
AngularJSでPromiseを返す関数をモック化してテストする

Promiseを返す関数をモック化してテストするサンプルです。
Promiseがresolveやrejectされた後の処理は`scope.$digest()`が呼ばれないと実行されないため、
テストコード内のどこかのタイミングで`scope.$digest()`を呼んでやる必要があります。

```js:controller
angular.module("myApp", []).controller("hogeController", function ($scope, hogeService) {
    $scope.hoge = "";
    hogeService.deferredHoge().then(function (x) {
        $scope.hoge = x;
    });
});
```

```js:testcode
describe("Promise test sample", function () {

    var $rootScope;
    var $q;
    var $controller;

    beforeEach(function () {
        module("myApp")
    });

    beforeEach(inject(function (_$rootScope_, _$q_, _$controller_) {
        $rootScope = _$rootScope_;
        $q = _$q_;
        $controller = _$controller_;
    }));

    it("controller初期化時にdeferredHogeが呼び出され、結果が$scope.hogeに格納される", function () {

        // Promiseを返す関数をもつサービスのモック
        var hogeServiceMock = {
            deferredHoge: function () {
                var deferred = $q.defer();
                deferred.resolve("HOGE");
                return deferred.promise;
            }
        };

        var $scope = $rootScope.$new();
        $controller("hogeController", {
            $scope: $scope,
            hogeService: hogeServiceMock
        });

        // この時点ではまだ初期値のまま
        expect($scope.hoge).toBe("");

        $rootScope.$digest();

        // $digest呼び出し後にPromiseの値が格納される
        expect($scope.hoge).toBe("HOGE");
    });
});
```
PiTFTのインストールと設定

2.8インチのPiTFTを買ってみたのでインストール方法や設定なんかをいくつか残しておく。

[PiTFT - Assembled 320x240 2.8 TFT+Touchscreen for Raspberry Pi](http://www.adafruit.com/product/1601)

# インストール
インストールドキュメントはこちら。

[Easy Install | Adafruit PiTFT - 2.8&quot; Touchscreen Display for Raspberry Pi | Adafruit Learning System](https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install)

インストール方法は3種類ある。

1. PiTFTのセットアップ済みRaspbianをインストールする
2. インストールスクリプトを実行する
3. 手動でインストールする

3の手動インストールだと細かく設定できるみたいだけど、自分は2の方法で行った。

# 設定
PiTFTを色々いじってて試してみた設定。

## /usr/share/X11/xorg.conf.d/99-pitft.conf
インストール時に作成したファイル。

### 画面の出力先を変更する

    # "fb0"または"fb1"に設定する
    Option "fbdev" "/dev/fb0"

"fb0"でHDMIから出力して"fb1"でPiTFTに出力する。

## /etc/modprobe.d/adafruit.conf
デフォルトだと次のようになっている。

    options fbtft_device name=adafruitrt28 rotate=90 frequency=32000000

### 画面の回転
rotateの値を0,90,180,270にする。

### キャリブレーション
このページの"AutoMagic Calibration Script"を実施する。

[Touchscreen Install &amp; Calibrate | Adafruit PiTFT - 2.8&quot; Touchscreen Display for Raspberry Pi | Adafruit Learning System](https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/touchscreen-install-and-calibrate)

キャリブレーションを実行した後は再起動する。

### 60FPS
"frequency"の値を"62000000"に変更し、"fps=60"という設定を追加する。

# OpenGLについて
Raspberry PiはOpenGL ES2に対応してるけど、PiTFTではOpenGL表示はできなかった。

PiTFTはSPIで接続されているけど、SPIはCPUで制御されているのでGPUを使った描画ができないらしい。
試しにHDMI接続でOpenGL使ったウィンドウを表示してみたらできたけど、PiTFTではできなかった。

SPI接続の場合の話なのでPiTFTに限った話ではないけども。
Raspberry PiでHDMIから映像がでない時の対処方法

Raspberry PiでHDMI接続のディスプレイに映像がでなかったときに見つけた方法をメモしておく。


# /boot/config.txtの設定を変更する
どれか1つ、または組み合わせると表示されるかもしれない。

    # セーフモードで動作させる
    hdmi_safe=1
    
    # コンポジットではなく強制的にHDMIから出力する
    hdmi_force_hotplug=1
    
    # 信号強度を強くする
    config_hdmi_boost=4

# 参照
Raspberry Piの本家にドキュメントがあった。
上の設定の詳細や他の設定も書かれている。

[Raspberry Pi Documentation](http://www.raspberrypi.org/documentation/configuration/config-txt.md)
typescript-vimでコンパイラオプションを指定する

`g:typescript_compiler_options`でオプションを指定することができました。
私は次のように`.vimrc`に書いています。

```vim
let g:typescript_compiler_options = ' --module commonjs --target ES5 --noImplicitAny'
```

*(2015-01-20追記)*

[vvakamwe氏のTypeScript本](http://typescript.ninja/typescript-in-definitelyland/prepared-to-typescript.html)を参考に、オプションに`--noImplicitAny`も追加しました。
スクラッチパッド(Firefox)のトップレベルでのvarの挙動で気になったところ

まずは下記のHTMLをブラウザで開いてみてください

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>`var` test</title>
</head>
<body>
<script>
var A = "hoge";
B = "fuga";

document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");

delete this.A;
delete this.B;

document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");
document.close();
</script>
</body>
</html>
```

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

の記述の通り、トップレベルのコンテキストでの`var`により宣言された変数はグローバルオブジェクト(トップレベルにおいて`this`で参照でき、通常ブラウザでは`window`でも参照できる)の変更不可能(configurable: false)なプロパティとなり、`delete`を行っても何も変化はありません。[^1]

そのため、表示は以下の通りになります(Chrome 39, Firefox 34, IE 11で確認)

```
(this === window) = true, A = hoge, B = fuga
(this === window) = true, A = hoge, B = undefined
```

しかし、Firefox 34で空のドキュメントを開いている状態でスクラッチパッドを開き、

```js
var A = "hoge";
B = "fuga";

document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");

delete this.A;
delete this.B;

document.write("(this === window) = " + (this === window) + ", A = " + this.A + ", B = " + this.B + "<br>");
document.close();
```

を実行した場合は表示は以下の通りになります

```
(this === window) = true, A = hoge, B = fuga
(this === window) = true, A = undefined, B = undefined
```

このコンテキストでの`this.A`が変更不可能となっていません。そもそも`this.A`自体が作成されないのであれば

```js
(function() {
  // ここ
}).call(this);
```

の中身として実行されているとも解釈できるのですが、それとも異なるようです。
実際どうなのかは詳しく調べないとわからないと思うのですが、少なくともトップレベルとはこのような挙動の違いがあることは確かです。

[^1]: strictモード時は未宣言の変数への代入`B = "fuga";`および変更不可能なプロパティの削除`delete this.A;`が実行時エラーとなります。
Titanium で iOS 8 系シミュレータを日本語環境で起動する

Xcode 6 の iOS 8 系シミュレータはシミュレータ内で言語環境を日本語に設定しても反映されません。もちろんキーボードも日本語入力ができないし、```Ti.UI.Picker``` で type プロパティに ```Ti.UI.PICKER_TYPE_DATE``` を指定すると英語表記になってしまいます。

シミュレータ起動時に ```-AppleLanguages (Japanese)``` を渡してあげればよいのですが、Titanium の場合はビルドコマンドがよろしくやってくれるので、そのままだと渡すことができません。

Titanium CLI をちょっと改造すればよいかと思いますが、実は CLI にはビルドコマンドがありません。ビルドは SDK に依存するため、SDK 内部に存在しています。さらに、ビルドコマンド自体がシミュレータの操作を行うのではなく、```ioslib``` という npm が担当しています（正確には、さらにこの中に ```node-ios-device``` がいて、この npm がシミュレータを操作してくれます）。もちろん Titanium Studio な方でも内部的に CLI が使われているわけですから、今回の改造は問題なく適用されます。

というわけで、SDK に内包されているビルドコマンドが使っている、```ioslib``` へちょいと手を加えます（そもそも Titanium へプルリクエストすれば良いのでが、依存関係が複雑で、時間があれば JIRA へチケット切ろうかと思っております）。

対象となるファイルは以下の場所にありますので、テキストエディタで開いて編集してください。これを書いている時点では、Titanium SDK 3.5.0.GA になります。

```
~/Library/Application\ Support/Titanium/mobilesdk/osx/3.5.0.GA/node_modules/ioslib/lib/simulator.js
```

編集箇所は[ここ](https://github.com/appcelerator/ioslib/blob/master/lib/simulator.js#L217)になります。```cmd``` 配列の最後に日本語のオプションを追加してください。このブロックの下に 8 以前のシミュレータの記述がありますが、そちらには手を加えないでください。

```js
'cmd': [
    iossim,
    'launch',
    '<app path>',
    '--verbose',
    '--xcode-dir', xc.path,
    '--udid', sim.udid,
    '--args', '-AppleLanguages', '(Japanese)' // この行
]
```

保存したら早速ビルドしてみましょう。キーボードに日本語が出てきましたか？
連想配列中の重複したレコードを削除する

下記のようにDBから取ってきたデータを連想配列にして、重複したレコードを削除したいときってよくある。

```php
$stations = [ 
   ['id' => 1, 'name' => '恵比寿'],
   ['id' => 2, 'name' => '渋谷'],
   ['id' => 3, 'name' => '新宿'],
   ['id' => 4, 'name' => '恵比寿'],
];
```

ここから恵比寿を削除した3つの配列にするためのメモ。

```php
$tmp = [];
$uniqueStations = [];
foreach ($stations as $station){
   if (!in_array($station['name'], $tmp)) {
      $tmp[] = $station['name'];
      $uniqueStations[] = $station;
   }
}
```

メソッド化しておいても良いレベルかも。

```php

class Util {
   public static function getUniqueArray($array, $column)
   {   
      $tmp = []; 
      $uniqueArray = []; 
      foreach ($array as $value){
         if (!in_array($value[$column], $tmp)) {
            $tmp[] = $value[$column];
            $uniqueArray[] = $value;
         }   
      }   
      return $uniqueArray;    
   }   
}

$stations = Util::getUniqueArray($stations, 'name');
echo("<pre>");var_dump($stations);echo("<pre>");
```

結果がこちら。

```php

array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(9) "恵比寿"
  }
  [1]=>
  array(2) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(6) "渋谷"
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(6) "新宿"
  }
}
```
Node.js LoopBack on Docker - Part1: MongoDBのコンテナを作成

LoopBackはNode.jsのオープンソースのMBaaSです。開発元のStrongLoopはエンタープライズ向けにNode.jsのAPIプラットフォームを提供しています。この前[MBaaSのサービス](http://qiita.com/masato/items/a7e69cf83f4b6bf0faa7)を調べたところ、オープンソースのMBaaSもいくつかありました。LoopBackはMBaaSとしても一般的な機能をそなえていますが、[Express](http://expressjs.com/)でできた[Swagger 2.0](http://swagger.io/index.html)準拠のAPI開発用Node.jsフレームワークとなっています。モデルを定義するとREST APIを自動生成してくれるのが特徴です。クライアントSDKはAndroid, iOS, AngularJSがあります。特にAngularJS SDKはIsomorphicなのでサーバーとクライアントで同じモデルを共有できます。

## MongoDBコンテナの作成

LoopBackのバックエンドのデータストアとしてMongoDBを使うことにします。まずはLoopBackコンテナの作成の前に準備します。Docker Hub Registryで検索するとTrusted の[dockerfile/mongodb](https://registry.hub.docker.com/u/dockerfile/mongodb/)が良さそうです。

Dockerホストにボリュームのディレクトリを作成して、とりあえずSmallサイズのDockerコンテナを起動します。

``` bash
$ sudo mkdir -p /opt/mongo/db
$ docker run -d -p 27017:27017 \
  -v  /opt/mongo/db:/data/db \
  --name mongodb \
  dockerfile/mongodb \
  mongod --smallfiles
```

## mongoコマンド用コンテナ

mongoコマンドを実行するため、Dockerコンテナを起動します。MongoDBコンテナにlinkして動作確認をします。
Dockerを使うと開発用のMongoDBサーバーが簡単に用意できました。とてもお手軽です。

``` bash
$ docker run -it --rm \
  --link mongodb:mongodb \
  dockerfile/mongodb \
  bash -c 'mongo --host mongodb'
MongoDB shell version: 2.6.6
connecting to: mongodb:27017/test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
> show databases;
admin  (empty)
local  0.031GB
```
VBAのお勉強2



SheetsとWorksheetsって何が違うの？
http://officetanaka.net/excel/vba/beginner/09.htm

> 一般に、ワークシートのことをシートと呼ぶことが多いです。しかし、Excelにはいろいろなシートが存在します。
たとえばグラフシートです。

【Word VBA】VBAでページ数を取得する
http://blog.livedoor.jp/akf0/archives/51331928.html

> 1.BuiltInDocumentPropertiesを利用する。
　2.文書中の最後の文字があるページ番号を取得する。
　3.PanesオブジェクトのPages.Count()を利用する。
　4.Shell.Applicationを利用する。

ページってのはシートの中のページ区切りのことかな。

Pagesオブジェクト
http://blog.clayhouse.jp/article/23761019.html

リファレンスに書いてある例はわかりにくい。
シートに属するオブジェクトじゃなくてページ設定のプロパティだと。

キャストなどリファレンス的なモノ

http://www.geocities.jp/cbc_vbnet/function/mojireyu_function.html#val

辞書オブジェクトの事例

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html

macだと動かない辞書オブジェクト、、などいろいろ

http://members3.jcom.home.ne.jp/daruma_kyo/info/mac_vba.html

コレクションのキーの確認の関数

http://blog.livedoor.jp/midorityo/archives/51067902.html

フレームワーク

http://wiki.clockahead.com/index.php?cmd=read&page=Coding%2FVBA%2FFramework

プロージャでコレクションを返す方法

http://qiita.com/opengl-8080/items/5bd8ae7fe95f5c31dfc3


VBAじゃないけどエクセルの改行（MacOS）
http://gomokuankake.com/2013/11/12/4557/
テスト時にexceptions_appが使われない

# 前提

独自のエラーページを表示するなどの用途でexceptions_appを使用している。

# 現象

例えば次のようなコードを書いた時、ActiveRecord::RecordNotFoundが投げられるが、exceptions_appで処理していても無視される。

~~~
it 'should returns 404' do
  get hoge_path id: -1
  expect(response).to have_http_status(404)
end 
~~~

# 対策

~~~config/environments/test.rb
config.action_dispatch.show_exceptions = true
~~~

# 参考
[The Agile League | Rails 3.2 Custom Error Pages, the exceptions_app, and Testing with Capybara - The Agile League](http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/)