OmniAICreator/Qiita-1.07M huggingface dataset:
Parseからプッシュ通知された時のNotification Icon(ﾉｰﾃｨﾌｨｹｰｼｮﾝｱｲｺﾝ)の変更方法

**（2014/04/23時点）**

ParseからAndroidアプリへプッシュ通知された時のNotification Icon(ﾉｰﾃｨﾌｨｹｰｼｮﾝｱｲｺﾝ)の変更方法
--------------------------------------------------------------------

Parseからプッシュ通知された時に画面左上に表示されるアイコンを変更する方法をメモ。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/41775/36a9b613-91b1-6d7f-1a88-08b97400539f.png)
※デフォルトではメニューに表示されるアイコンと同じモノが表示されている。公式では白黒の画像が推奨されているため出来れば変更しておきたい。

[参考：http://developer.android.com/design/style/iconography.html#notification](http://developer.android.com/design/style/iconography.html#notification)
↑[Notification Icons]項目を参照。


方法は至って簡単でjavaプログラムにちょろっと修正を加えるだけ。

**■Notification Iconの変更方法**
=====================================================================

メインクラス(Activity)のonCreate()に既に記載されている以下の内容を変更するだけ。
　⇒javaソースは[ココ](http://qiita.com/t-ohtake/items/779be9b4e53d78375497#2-6)を参考

・PushService.setDefaultPushCallback()の第三引数に画像の指定を追記する

【変更前】

```java
PushService.setDefaultPushCallback(this, MainActivity.class);
```

【変更後】

```java
PushService.setDefaultPushCallback(this, MainActivity.class,R.drawable.push);
```

これで、変更完了。

※ただし、Parseではバグ？っぽい動作をしており１回めの通知では変更されず、２回めの通知以降に上記で指定した画像に変更される。

（2014年5月7日追記）
上記の※部分の内容は最新のjarでは修正されている模様。


参考まで。

【関連】
[・AndroidでParse.comからプッシュ通知をする方法(Parse.com作業編) ](http://qiita.com/t-ohtake/items/ea06738ba5a530bf378a)
[・AndroidでParse.comからプッシュ通知をする方法(eclipse作業編)](http://qiita.com/t-ohtake/items/779be9b4e53d78375497)
[・Parseからプッシュ通知でAndroidアプリにjsonデータを送る](http://qiita.com/t-ohtake/items/b7a472cd1629266a4544)

---
[簡単家計簿 Androidアプリ](https://play.google.com/store/apps/details?id=jp.example.keepingbook.app&hl=ja)
Rails+WEBrickでページアクセスが遅くなる点の改善

# Rails+WEBrickでページアクセスが遅くなる点の改善

RailsでWEBrickを使ってdebugしていると、毎ページごとにjsやcssを取得するようになり表示が遅くなります。

どうやらキャッシュミスヒットが発生し、毎回取得しにいっているようです。

そんなときは`Ctrl+F5`でキャッシュをクリアすると、キャッシュが最新となりアクセスが早くなります。

たったこれだけですが、開発効率がアップしました。
Railsでタグをエスケープしつつ、改行を含む複数行のTextを表示したい

# Railsでタグをエスケープしつつ、改行を含む複数行のTextを表示したい

改行文字を`<br>`タグに変換できれば良いのですが、
最初は次のように書きました。

```html+erb
<%= simple_format(text) %>
```

これで改行されるようになったのですが、
`<b>text</b>`のようにタグを含むテキストを入力すると`text`が太字で表示されてしまいました。

そこで次のように書き換えました。

```html+erb
<%= sanitize(simple_format(text), :tags => %w(p br)) %>
```

これで`text`が太字ではなくなりましたが、まだ`<b>``</b>`が表示されません。

そこで最終的に次のヘルパーを作って表示させました。

```rb
def br(str) 
  html_escape(str).gsub(/\r\n|\r|\n/, "<br />").html_safe 
end
```

`html_escape`で入力文字を全てエスケープし、改行を`<br>`タグに変換し、変換した`<br>`がエスケープされないようにしてます。

追記：

と書きましたが、@github0013@githubさんから次の方法で変換できることを教えてもらいました。ありがとうございます！

```rb
simple_format(h(text))
```
Double-Checked Lockingによる同期処理

## オブジェクトが存在しない場合のみ生成したい
ここ数日で実装したBTKInjectorにおいて、インスタンス変数をnilで初期化し、初回アクセス時にオブジェクトを割り当てる必要がでてきました。

すごく単純に書くとこんな感じ。

```objc
- (id)get
{
    if(_obj == nil){
        _obj = [self getImpl];
    }
    return _obj;
}
```

## マルチスレッド対応
ロックなしだとマルチスレッドで適切に動作しないので、 @synchronizedを使って同期処理を追加します。

```objc
- (id)get
{
    @synchronized(self){
       if(_obj == nil){
           _obj = [self getImpl];
       }
       return _obj;
    }
}
```

完。。。

ではないですね、今回はDIのProvider実装なので、毎回ロックを取得するのは好ましくありません。

## Double-Checked Locking
そこで有名なDouble-Checked Locking。同期処理をする前に一度変数をチェックすることで、初回以外はロックが必要なくなります。

```objc:NG!!
- (id)get
{
    if(_obj == nil){
        @synchronized(self){
            if(_obj == nil){
                id obj = [self getImpl];
                _obj = obj;
            }
        }
    }
    return _obj;
}
```

これでOK。。。

でもないんですよね。そこまで含めて有名だと思います。プログラムは、書かれた順番で実行されるとは限りません。

1. コンパイラによる最適化
2. CPUによる最適化

という二つの要素により、_objにオブジェクトが設定されているにも関わらず、そのオブジェクトの初期化が完了していない可能性があります。

対策として下記の二つが必要です。
1. volatile宣言で、コンパイラによるメモリアクセス最適化を抑制
2. OSMemoryBarrierで、CPUがメモリを逐次処理するように強制

というわけで、正しくはこちら。

```objc
@implementation BTKInjectorProviderBase{
    id volatile _obj;
}

- (id)get
{
    if(_obj == nil){
        @synchronized(self){
            if(_obj == nil){
                id obj = [self getImpl];
                OSMemoryBarrier();
                _obj = obj;
            }
        }
    }
    OSMemoryBarrier();
    return _obj;
}
```
OSMemoryBarrierのコストは発生しますが、synchronizeするのに比べればはるかに小さいと思います。検証はしてないですが。

## dispatch_onceは使えないのか？
Singletonを作る場合であれば、GCDのdispatch_onceを使うことができます。しかし、dispatch_once_tはかならずglobalもしくはstaticなスコープに置く必要があるため、今回のケースでは使用できません。

https://developer.apple.com/library/mac/documentation/performance/reference/gcd_libdispatch_ref/Reference/reference.html#//apple_ref/c/func/dispatch_once

```text
The predicate must point to a variable stored in global or static scope. The result of using a predicate with automatic or dynamic storage (including Objective-C instance variables) is undefined.
```


## 最終的なコード
[BTKInjectorProviderBase.m](https://github.com/tomohisaota/BTKInjector/blob/develop/Classes/impl/BTKInjectorProviderBase.m)
webkit-boxのまとめ

float使ったサイト多いですが、webkit-boxが便利なのでまとめ

#概要
要はコンテンツを横並びにできます。

#書き方

``` sample.html
<div style='display:-webkit-box'>
  <div>A</div>
  <div>B</div>
</div>
```
これで横並びになる。

#位置の揃え方
1.縦
  -webkit-box-align

2横
  -webkit-box-pack

3.指定できる値
  1.start 
     横なら左詰め、縦なら上詰め
  2.center
     横、縦とも、中央
  3.end
     横　右寄せ
     縦  下寄せ
  4.just
    均等割

例

``` sample.html
 <div style='display:-webkit-box;-webkit-box-pack:center'>
  <div>A</div>
  <div>B</div>
</div>
````
cocos2dxの中国の公式フォーラムで日本語で質問したら日本語で帰ってきた

しかも、開発元chukong technologyのサポートの方が日本語と英語の翻訳付きで返してくれます。
https://www.facebook.com/cocos2dxjapan/posts/593484610747074?notif_t=like

日本語で返してくれるのも嬉しいのですが、オープンソースコミュニティにとっては、
情報が一箇所に集まっていつでも検索できるようストックされる効果が大きいと思います。

githubはオープンです。
githubにおいてあるcocos-2dxはもちろんオープンソースです。

しかしcocos2dx.jpなどのコミュニティは基本的にクローズドなコミュニティです。

ですから、オープンソースなのになかなか日本の情報が外に出てきませんでした。
なのでオープンソースのcocos2dxをオープンに語り合う非営利のfacebookユーザーコミュニティを作りました。
転職アンケートを迫るようなことはしません。

「いいね」をしていただくと、最新情報が受け取れます。まだコンテンツはほとんどありませんが。気軽に書き込んで頂ければ気軽な仲間が返答してくれるでしょう。
https://www.facebook.com/cocos2dxjapan
LightTableで固定インデントを提供するプラグインを作成する

Binding formを伴う自作のマクロを使うときなどに、固定のインデント（スペース2個）にしたいのに引数の位置までインデントされてしまうことがあります。

どういうことかというと、こうなって欲しいのに

```clj
(auto-close [r (io/reader f)]
  (let [x 1] ...
```

下のようになってしまうということです。

```clj
(auto-close [r (io/reader f)]
            (let [x 1] ...
```

上の例の位置までのインデントを簡単にできるように、プラグインを作ってみます。

```
lein new lt-plugin another-indent
```

でプラグインの雛形を作って、以下のコードを作れば完成です。
User keymapに` "ctrl-j" [:set-another-indent-fixed]`などを追記して実行できます。
カーソルがある行の1つ上の行と比較して、現在の行のインデントを固定で1つ増やした位置に設定します。

```clj:another_indent.cljs
(ns lt.plugins.another-indent
  (:require [clojure.string :as s]
            [lt.objs.editor :as editor]
            [lt.objs.editor.pool :as pool]
            [lt.objs.command :as cmd])
  (:require-macros [lt.macros :refer [behavior]]))

;; 指定した行（文字列）のインデント数（スペース換算）を返す
(defn indent [line tab-size]
  (let [size (- (count line) (count (s/triml line)))]
    (->> (filter #{\tab} (subs line 0 size))
         count
         (* (dec tab-size))
         (+ size))))

;; 上行と現在行を比較して、現在行に設定するインデント増減数を返す
(defn indent-diff [cm upLine curLine]
  (let [tab (editor/option cm :tabSize)
        up (indent upLine tab)
        cur (indent curLine tab)]
    (if (editor/option cm :indentWithTabs)
      (+ tab (- up cur))
      (+ (editor/option cm :indentUnit) (- up cur)))))

;; カーソルがある行のインデントを設定する
(defn set-indent []
  (let [cm (editor/->cm-ed (pool/last-active))
        cursor (.getCursor cm)
        line (.-line cursor)
        curLine (editor/line cm line)
        upLine (editor/line cm (dec line))]
    (when (pos? (count (s/triml (or upLine ""))))
      (editor/indent-line cm line (indent-diff cm upLine curLine)))))

(cmd/command {:command :set-another-indent-fixed
              :desc "Another Indent: set fixed indent"
              :exec set-indent})

```

GitHubにも置いています。
https://github.com/kurogelee/lighttable-plugin-another-indent/

* lt.objs.editorの関数メモ  
`(editor/option ... )`でエディタのオプション設定値を取得できる。  
`(editor/line ... )`で指定した行の文字列が取得できる。  
`(editor/indent-line ... )`で指定した行のインデントを設定できる。  

日本語の情報がほとんどないのがつらいところですね・・・
Microsoft TrueType Core Fonts(msttcorefonts) Install(CentOS)


# Goal

```
* サーバとしてコンピュータを使う場合フォントを意識することはほとんどないけど、pdfや画像を動的に生成する必要があり、フォントが必要になった
* 今回は特にarialを使いたかっただけだけど（ttfを落としてきてfc-cacheコマンド打てば、こんなめんどうな手順をふまなくてもいいはず）、せっかくなのでコアなフォントを一式installした

(install成功して追加されるフォント)
tree /usr/share/fonts/msttcorefonts/
/usr/share/fonts/msttcorefonts/
|-- andalemo.ttf
|-- arial.ttf
|-- arialbd.ttf
|-- arialbi.ttf
|-- ariali.ttf
|-- ariblk.ttf
|-- comic.ttf
|-- comicbd.ttf
|-- cour.ttf
|-- courbd.ttf
|-- courbi.ttf
|-- couri.ttf
|-- fonts.dir
|-- georgia.ttf
|-- georgiab.ttf
|-- georgiai.ttf
|-- georgiaz.ttf
|-- impact.ttf
|-- tahoma.ttf
|-- times.ttf
|-- timesbd.ttf
|-- timesbi.ttf
|-- timesi.ttf
|-- trebuc.ttf
|-- trebucbd.ttf
|-- trebucbi.ttf
|-- trebucit.ttf
|-- verdana.ttf
|-- verdanab.ttf
|-- verdanai.ttf
|-- verdanaz.ttf
`-- webdings.ttf
```

# Server Info

```
$ uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
```

# Milestone

```
* 依存パッケージをあらかじめinstall
* rpmbuildのためのspecファイルをダウンロード
* rpmbuildしてmsttcorefontsのrpmを取得
* rpmコマンドでインストール
* フォントが登録されている
```

# Manual

```
## root user
cd /usr/local/src
pwd
```

## Install Dependent Packages

```bash
yum install ttmkfdir cabextract rpm-build
  # このうち、自分の環境ではcabextractがyumインストールできなかったので
  # インターネットから探してきてrpmでインストール

## 
## -------------------------------
## cabextractをyum installできない場合
## -------------------------------
## Redhat6かつ64bit環境のパッケージをinternetから探す
## cabextractはwindowsで使われる圧縮フォーマットcabの展開ツールらしい
## 
wget "ftp://ftp.univie.ac.at/systems/linux/dag/redhat/el6/en/x86_64/dag/RPMS/cabextract-1.4-1.el6.rf.x86_64.rpm"
rpm -ivh cabextract-1.4-1.el6.rf.x86_64.rpm
which cabextract
  # コマンドパスが通ったことを確認

## 
## ------------------------------
## chkfontpathをinstallするためにatrpms-repoを登録
## ------------------------------
## http://dl.atrpms.net/all/
## このURLから探す
## 
wget "http://dl.atrpms.net/all/atrpms-repo-6-7.el6.x86_64.rpm"
rpm -ivh atrpms-repo-6-7.el6.x86_64.rpm
yum install chkfontpath

```

## Download a spec file / Create the rpm package / Install

```bash
## 
## -------------------
## specのdownload
## -------------------
## http://corefonts.sourceforge.net/
## このURLから最新を探す（最新を使ったほうがいい）
## 
wget "http://corefonts.sourceforge.net/msttcorefonts-2.5-1.spec"

##
## ------------------------------
## rpmbuild
## ------------------------------
## 

rpmbuild -bb msttcorefonts-2.5-1.spec
ls -l /root/rpmbuild/RPMS/noarch/msttcorefonts-2.5-1.noarch.rpm
  # build完了するとhomeディレクトリ以下の上記パスにパッケージが格納される

##
## ------------------------------
## Install
## ------------------------------
## 

rpm -ivh /root/rpmbuild/RPMS/noarch/msttcorefonts-2.5-1.noarch.rpm
ls -l /usr/share/fonts/msttcorefonts/
  # fontフォルダにコアフォントが追加されていることを確認
fc-list | grep Arial
  # 想定のフォントが利用可能になっていることを確認
```

# References

* http://corefonts.sourceforge.net/
chai のエラーメッセージの情報を増やす

chai でオブジェクトをまるっと比較するのに deep.equal を使っています。もっと細かく assertion 書いた方がいいよというのはわかりますが、便利なので・・・。

```js
expect(obj).to.be.deep.equal({ foo: 1, bar: 2, baz: 3 });
```

このとき、比較しているオブジェクトがもう少し複雑だと、失敗したときのメッセージが以下のように簡略化されてしまいます。

```
Failures:

  1) Something doSomething
     Failure/Error: expected { Object (foo, bar, ...) } to be like { Object (foo, bar, ...) }
```

これじゃあ何が違うのかわからない！

調べてみたところ、chai の仕様でした。inspect してみて、文字数が閾値未満だとそのまま表示し、閾値以上だと簡易表示にしてしまうのです。

chai 1.9.1 より前では、この閾値が固定で 40 だったのですが、[1.9.1 から設定できるようになりました](https://github.com/chaijs/chai/blob/master/ReleaseNotes.md#configtruncatethreshold-new)。

```js
// 閾値を変更
chai.config.truncateThreshold = 100;

// 閾値を無効化
chai.config.truncateThreshold = 0;
```

異常に気づくための情報は常に多い方がいいと思い、無効化しています。

これで TDD がしやすくなりました。
Nginx で Rails の assets (css, js) にアクセスできない（403 forbidden が返る）

# はじめに

Rails を勉強中に遭遇したトラブルを共有します。

環境はインフラは、Amazon Web Services (AWS) の EC2 をつかっており、ミドルウェアの構成は、

* Nginx
* Unicorn 
* Rails4

という標準的な構成です。

# development では動くのに、production では動かない

Rails4 のデフォルトの設定ですが、assets pipeline という仕組みがあり、development 環境だと、`*.scss` や `*.coffee` は **動的に** それぞれ `*.css`、`*.js` にコンパイルされますが、production 環境だと動的にコンパイルされない設定になっています。パフォーマンスに関わるからでしょう。

その設定は以下のファイルに記述されています。

```ruby:confit/environments/production.rb
  # Do not fallback to assets pipeline if a precompiled asset is missed.↵
  config.assets.compile = false
```

`true` にすれば動的にコンパイル処理されますが、このままの設定だとブラウザから `*.css` や `*.js` が存在しないため、画面が正しく表示されないということになります。

つまり明示的に事前にコンパイルする処理が必要になります。以下のコマンドです。

```shell-session
[ec2-user@ip-172-31-XX-XX ]$ bundle exec rake assets:precompile
```

assets フォルダをのぞくと、以下のようにファイルが生成されています。
ちなみに、AWS の EC2 のデフォルトユーザ(`ec2-user`)で操作しています。

```shell-session
[ec2-user@ip-172-31-XX-XX ]$ ls public/assets/
application-76ac9a7ed8a05f788622d3fe675b9102.js     application-7f4b68e9fcf9a838875e83826b286ad3.css     bootstrap
application-76ac9a7ed8a05f788622d3fe675b9102.js.gz  application-7f4b68e9fcf9a838875e83826b286ad3.css.gz  manifest-8e0f1c0f6279be01674f398420ac273c.json
```

こんな複雑なファイル名ですが、assets pipeline の仕組みで `application.html.erb` が動的にこれらのファイルを示すようになっています。

よし、これでOKと思ったら・・・。

# assets (css, js) にアクセスできない（403 forbidden）

まず `403 forbidden` の前に、nginx 経由で assets フォルダにアクセスしようとする場合は、`nginx.conf` に明示的にその設定をする必要があります。

```nginx
    server {
        listen       80;
        server_name  localhost;
        #root         /usr/share/nginx/html;
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;

        location ~ ^/assets/ {
            root   /home/ec2-user/rails_app/public; # 明示的にこれを追加
        }

        location / {
                proxy_pass http://app;

        }
:
:
```


これでブラウザからアクセスができます。

しかし私の場合、どうやら `403 forbidden` が返っているようでした。
これはアクセスはできているが、許可されていないということになります。

色々調べた結果、`ec2-user` のホームディレクトリのパーミッションが `rwx------` つまり `700` であることがわかりました。`nginx ユーザ` からアクセスできなかったことになります。
そこで、Others に実行権限を与えました。  
  
```shell-session
[ec2-user@ip-172-31-XX-XX ]# chmod 701 /home/ec2-user
```

をして無事解決しました。
VirtualBoxのCentOSで画面幅最大で表示する

## VirtualBoxの仮想マシン（CentOS6.x）で画面の最大化を行う際に画面幅最大にならない解決方法
- VirtualBoxのバージョンを以下のバージョンにする

> 4.2.4 r81684

- ホストOSの再起動
- VirtualBoxのメニューにある「デバイス」から「Guest Additions」をインストールする
- 仮想マシンの再起動
AngularJSアプリケーション開発の為のChrome拡張


O'Reilly本にも載ってたのですが「Batarang」ていうのがあります。

### ① Chromeブラウザで Web Store から追加

![スクリーンショット 2014-04-23 18.40.02.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c2b9401f-dcf3-0d13-b6ca-0527bfc87f4e.png "スクリーンショット 2014-04-23 18.40.02.png")

### ② Chromeの設定で有効化

- 自分の場合は初めから有効になってた

![スクリーンショット 2014-04-23 18.41.19.png](https://qiita-image-store.s3.amazonaws.com/0/35733/f8be1534-7283-305c-0faa-bc6198e72f54.png "スクリーンショット 2014-04-23 18.41.19.png")

### ③ Chromeのディベッパーツールに「AngularJS」タブが追加される

- 更に「Enable」をチェック

![スクリーンショット 2014-04-23 19.13.36.png](https://qiita-image-store.s3.amazonaws.com/0/35733/8d97e565-1f3d-bcfe-7334-67cb8b075ecd.png "スクリーンショット 2014-04-23 19.13.36.png")

依存とかスコープの範囲が色々みれて便利ぽい。
【解決】Chromeでフォントサイズ大きい＋太字だと、text-decoration: underline;が残る

Chromeでフォントサイズ大きい＋太字だと、text-decoration: underline;っぽい何かが残る。
18pxから起きるようです。

デモ：
http://jsdo.it/Ituki/l3RJ

#2014.12.18追記
久々にこのデモを見てみたら、解決していました。
ブラウザのバグだったのでしょうか・・・
Remをまとめておきます

スマフォサイト作るときに、パーセント(%)指定が面倒な時なので、Remを使う方法をまとめる。

#概要
Remとは、htmlたぐに定義した「フォントサイズ」を1remとするプロパティ値。

``` sample.html 
  <html style='font-size:100px'>
```

の場合、1rem =100pxになる。

``` sample.html 
  <div style='width:1rem'></div>
``` 
は 

``` sample.html
   <div style='width:100px'></div>
``` 
と同じ意味。
何がうれしいかというと、入れ子になったノードの中でも、**必ず**絶対値**を返す

```sample.html
  <div id='parent'>
     <div id='child'></div>
  </div>
```
child内でのパーセンテージは、parentに対する相対値になる、emも同様。
remはhtmlタグに対しての絶対値なので、parentとchildで同じ値を設定できる。

#使い方
1.画面幅を6.4rem決めうちしてレイアウトを作る。
   remは「width」意外にも、padding margin 何でも使える

2.JavaScriptで画面ロード時にremを仕込む

``` sample.js
window.addEventListener('load',function()
{
   var rem = window.screen.width/640*100;
   document.getElementById('html').style.fontSize = rem +'px';
});
``` 
3.これで、画面幅に応じていい感じに、拡大縮小するようになる。
  最初に画面がちらつくのがいやなので、bodyタグを最初display:none
  にしておいて、onload時で表示するとちらつかなくなります。

**注)onloadで変えてるので、途中で画面幅変えても追従しません**
**注)PCだとあれなレイアウトになります。**
Google MapsのAPIたち

# はじめに
頭の整理のためのメモです。

以下のサイトを参考にしています。

[Google API Expertが解説する Google Maps APIプログラミングガイド - 勝又 雅史, 古籏 一浩, 石丸 健太郎, 安藤 幸央]
(http://books.google.co.jp/books?id=f8SFFrEoxcIC&printsec=frontcover&hl=ja&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false)
Googleブックスで1章が読めます。わかりやすいので最初に読むのがお勧め。

[デベロッパー向け Google マップ資料 — Google Developers](https://developers.google.com/maps/documentation/?hl=ja)
最新情報はこちらで。

# Google Maps API
現在6つのAPIがあります。

## [Maps JavaScript API](https://developers.google.com/maps/documentation/javascript/?hl=ja)
JavaScriptを使ってGoogleマップをWebページに埋め込むことができます。
スマートフォン（Andorid,iPhone）でも動作します。
緯度・経度、ズームレベルを指定して地図を表示します。
拡大縮小、ストリートビュー、航空写真の表示などが可能な地図を埋め込むことができます。

## [Maps Image API](https://developers.google.com/maps/documentation/imageapis/?hl=ja)
JavaScriptを使わずにマップ画像やストリートビュー画像をWebページに埋め込むことができます。imgタグにパラメータを含むURLを指定します。
フィーチャーフォンなどJavaScriptが動作しない環境で使用できます。
静的なマップ画像を扱うのはStatic Maps API、ストリートビュー画像を扱うのはStreet View Image APIです。

## [ウエブサービス](https://developers.google.com/maps/documentation/webservices/?hl=ja)

URLリクエストで以下を取得できます。レスポンスはXMLやJSONで返却されます。

* ルート検索(Directions API)
* 複数の地点間の移動距離や所要時間を計算(Distance Matrix API)
* 高度データ、水深データの取得(Elevation API)
* 住所←→緯度・経度の変換(Geocoding API)

## [Places API](https://developers.google.com/places/?hl=ja)
ウエブサービスのひとつだが、機能が多いので別建てで紹介されている。

* プレイス（店舗や施設など）の検索
* 口コミ等の詳細情報取得
* 自分のデータをプレイス情報として地図に表示

など

## [Google Earth API](https://developers.google.com/earth/?hl=ja)

プラグインのインストールが必要。
RubyでXMLを解析する


rubyでXMLを解析する簡単なスクリプト

```
require 'rexml/document'

xml = <<EOM
<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item id="123">AAA</item>
  <item id="234">BBB</item>
  <item id="345">CCC</item>
  <obj>
    <no>1</no> 
    <name>abc</name>
  </obj>
  <obj>
    <no>2</no> 
    <name>bcd</name>
  </obj>
</items>
EOM

doc = REXML::Document.new(xml)

#AAA
puts element.elements['items/item'].text

#AAA BBB CCC
doc.elements.each('items/item') do |element|
  puts element.text
end

#1 abc 2 bcd
doc.elements.each('items/obj') do |element|
  puts element.elements['no'].text
  puts element.elements['name'].text
end

```
Provisional Profileの追加と削除

testFlight等で頻繁にProvisional Profileを削除したり追加したりすることがあったので書かせてもらいます。
Provisional Profileって、追加すると同じidentiferでも上書きされずに残ってしまうんです。
で、Projectの中だと重複して表示されないものの、iTunesConnectへの提出とかの際に見ると２つ表示されて、しかもそのメンバーを確認出来ないのでどっちが新しいか分からなくなってしまうのです。

と、いうわけで解決策は全部消して必要なのだけ追加するです。

Finder→フォルダへ移動
~/Library/MobileDevice/Provisioning Profiles/

全部削除

iOS dev centerから必要なのだけ追加
spree tutorial bug

以下のチュートリアルに従って `bundle exec rake test_app` を実行すると、`uninitialized constant Spree::HomeController` というエラーが発生します。
http://dev.yukashikado.co.jp/post/55659922874/spree-2-2

回避するには、`spree_simple_sales.gemspec` の `Gem::Specification.new do` に以下の行を追加すればオッケーです。

```rb:spree_simple_sales.gemspec
s.add_dependency 'spree_frontend'
```

以下を参考にしました。
https://github.com/spree/spree/issues/4470
https://github.com/muhammedabuali/spree_simple_store
NumPy で回帰分析をする

回帰分析については以前にも[線形回帰の話題](http://qiita.com/ynakayama/items/d6e8513791b43f18d28b)で触れました。

## NumPy で回帰分析

では実際にコードを書いて回帰分析をおこなってみます。 [np.polyfit](http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html) や [np.polyval](http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html#numpy.polyval) を利用すると n 次式で 2 変数の回帰分析をおこなえます。

詳細は上記のリンクからドキュメントを参照したほうが良いのですが、次の通りとなります。

* np.polyfit(x, y, n) : n 次式で 2 変数の回帰分析
* np.polyval(p, t) : p で表される多項式に t を代入し値を計算

```py3
import numpy as np
import matplotlib.pyplot as plt

x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
z = np.polyfit(x, y, 3)

p = np.poly1d(z)
p30 = np.poly1d(np.polyfit(x, y, 30))
xp = np.linspace(-2, 6, 100)

plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '*')
plt.ylim(-2,2)
plt.show()
plt.savefig('image.png')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/6c64f09a-864d-785d-2d77-289bb1edd98f.png)

このとき
1 次式の場合は p[0]: 傾き、 p[1]: 切片となります。
N 次式なら p[0]*t**(N-1) + p[1]*t**(N-2) + ... + p[N-2]*t + p[N-1] です。

最小二乗法についても[以前に触れました](http://qiita.com/ynakayama/items/5732f0631c860d4b5d8b)が、データ列 {(x_1, y_1), (x_2, y_2), ... (x_n, y_n)} に対して残差平方和を最小とするモデルを決定します。このとき観測値の誤差分布の分散が一定であると仮定します。

## 重回帰分析

独立変数 m 個のモデルでの回帰分析が[重回帰分析](http://ja.wikipedia.org/wiki/%E9%87%8D%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90)です。

```math
z = ax + by + c
```
という式を求めたいとします。

```py3
x = [9.83, -9.97, -3.91, -3.94, -13.67, -14.04, 4.81, 7.65, 5.50, -3.34]
y = [-5.50, -13.53, -1.23, 6.07, 1.94, 2.79, -5.43, 15.57, 7.26, 1.34]
z = [635.99, 163.78, 86.94, 245.35, 1132.88, 1239.55, 214.01, 67.94, -1.48, 104.18]

import numpy as np
from scipy import linalg as LA

N = len(x)
G = np.array([x, y, np.ones(N)]).T
result = LA.solve(G.T.dot(G), G.T.dot(z))

print(result)
```

これにより
[ -30.02043308    3.55275314  322.33397214]
が求まりますから

```math
z = -30.0x + 3.55y + 322
```

という方程式が求まり、これが解となります。

## 参考

2013年 プログラマの為の数学勉強会 資料 
http://nineties.github.io/math-seminar/
BitTorrent SyncをUbuntuで使うときの便利なインジケーターアプレット "btsyncindicator"

ファイル同期は[BitTorrent Sync](http://www.bittorrent.com/intl/ja/sync)派です。

OSXやWindowsには起動や動作状況、設定画面へのアクセスが簡単にできるインジケーターアプレットが標準搭載されているのに、Linuxには無くて若干凹んでおりましたが、なんとありました。

[marxjohnson/btsyncindicator - GitHub](https://github.com/marxjohnson/btsyncindicator)

BitTorrentSyncも同梱されています

## セットアップ ##

```bash:INSTALL
$ sudo add-apt-repository ppa:tuxpoldo/btsync
$ sudo apt-get update
$ sudo apt-get install btsync-user
```

このあと、ログアウト/ログインで自動的に起動します
Terminalから起動する場合は`/usr/bin/btsync start`です

### トラブルシュート ###

#### `Communication Error 401` ####

コマンドラインから起動した場合は`WARNING:root:Communication Error caught, displaying error message`というエラーが出ます

対策: Web管理画面から認証設定でパスワードを空にしてください。

理由: btsyncindicatorはWeb管理画面をスクレイピングしてステータスを取っているためです

ちなみに、btsyncindicatorが起動するbtsyncのWeb管理画面は`http://localhost:9999`と、標準のポート(8888)とは違いますので注意が必要です。

#### Get Full Access Secret / Get Read Only Secret をクリックしても何も起こらないお！ ####

何も起こらないように見えますが、クリップボードにSecret keyがコピーされてます。

## あとがき ##

最近、後ろ向きネタが多かったので、こういうこともやってますよ的なエントリーを書いてみました。
Sublime Text 3, Rubocop で "Invalid byte sequence in us-ascii"

Sublime Text 3 の [Rubocop](https://github.com/pderichs/sublime_rubocop) プラグインでマルチバイトなコードを読ませると下記のようなエラーが出る問題。


```shell-session
Inspecting 1 file
F

Offenses:

special.rake:1:1: F: Invalid byte sequence in us-ascii.

1 file inspected, 1 offense detected
[Finished in 0.5s with exit code 1]
[cmd: ['/Users/mukoyama/.rbenv/bin/rbenv exec rubocop  /Users/mukoyama/Documents/workspace/project/lib/tasks/special.rake']]
[dir: /Users/mukoyama/Documents/workspace/project/lib/tasks]
[path: /usr/bin:/bin:/usr/sbin:/sbin]
```

検索してもヒットしなかったので、一応書き残す。
単純に環境変数 LANG を読み込まないためという問題の様なので

```json
{
  "rubocop_command": "LANG=ja_JP.UTF-8 /Users/mukoyama/.rbenv/bin/rbenv exec rubocop"
}
```

上記の様な設定を `RuboCop.sublime-settings` に書いて上げれば動く。
でも、コレが答えじゃない気がする・・・。

そもそも path の値がシステムデフォルトのみっぽい。
BEAR.sundayメモ#1 - vagrant（DigitalOcean）＋Ubuntu13.10＋PHP5.5.3でBEAR.sundayのインストール


（2014/5/13追記）以下はUbuntu13.10ですが、Ubuntu14.04 x64でも動作しました。今後記事を書く場合はUbuntu14.04 x64で行います。

先日（というか前日）、BEAR.sundayのインストールからアプリケーションの作成と確認までの勉強会に参加したので、そこで使ったVagrant＋打ち込んだコマンドのメモを掲載します。

```Vagrant
agrant.configure('2') do |config|
  config.vm.hostname              = 'root'

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = '~/.ssh/id_rsa'
    provider.ssh_key_name         = 'xxx'
    override.vm.box               = 'digital_ocean'
    override.vm.box_url           = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
    provider.client_id            = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    provider.api_key              = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    provider.image                = 'Ubuntu 13.10 x64'
    provider.region               = 'Singapore 1'
    provider.size                 = '512MB'
    provider.ca_path              = '/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt'
  end
end
```

上記設定はメモリ512MBですが、開発時はいろいろとフロント上でツールを走らせたりするので、1GBか2GBでやったほうがいいかと思います。

以下はvagrant sshしてからのコマンド。なお、作業関係は全て/vagrant/以下でやっていますが、特に理由はありません。

```
# vagrant upしたときに、グローバルIPが返ってくるのでメモしておく
# [default] Assigned IP address: xxx.xxx.xxx.xxx <- これ

# 必要なパッケージのインストール
apt-get update
apt-get install -y git php5 php5-json php5-cli php5-curl

# composerのインストール（/vagrant/以下に配置）
curl -sS https://getcomposer.org/installer | php -- --install-dir=/vagrant

# BEAR.sundayのインストール（プロジェクトの作成）
# たまに一部のパッケージをgithubから引っ張る際に、githubのid/pwを求められることがある
cd /vagrant/
php /vagrant/composer.phar create-project bear/package bear --dev

# （2014/05/13追記）上のコマンドですが、実際は下のコマンドの方がオススメです。こちらは随時最新のバージョンでプロジェクトが作られます
php /vagrant/composer.phar create-project bear/package bear dev-develop

# ここまでいけば作成完了
#  Required
# [OK] PHP: 5.5.3-1ubuntu2.3
# [OK] Vendor install
# # Optional
# [NG] APC:
# # Develop
# [NG] Xdebug:
# [NG] PDO-Sqlite:
# [NG] xhprof:
#
# BEAR.Sunday env check: [OK]

# ためしにDemo.SandBoxを起動
cd /vagrant/bear
bin/bear.server apps/Demo.Sandbox/

# さきほどメモしたIPの:8080にアクセスするとSandBoxが見える
# http://xxx.xxx.xxx.xxx:8080
# ちなみにbin/bear.server自体は[php -S 0.0.0.0:8080]を実行しているだけ

# アプリケーションの新規作成
cd /vagrant/bear/apps
php /vagrant/composer.phar create-project bear/skeleton My.Work

# 最後に聞かれる質問は、git cloneされたモジュール等の「元の.gitや.svnを消しますか？」という質問なので、お好きに
# 作成が完了すると、apps/内にMy.Work/が出来上がる

# 作成したアプリケーションを動かしてみる
cd /vagrant/bear/
bin/bear.server My.Work/
# さきほどのSandBoxとは違うアプリケーションが立ち上がっているのが見える
```

とりあえずここまで。

あと上記のインストール手順でやった場合、composerでphpunitが落ちている＋新規作成したアプリにテストのひな形が作られているので、

```
# apps/My.Work以下で
../../vendor/bin/phpunit
```

と打ち込めば、テストもこの時点から実行できます。これは便利。
【エクセル】複数列の重複行削除

条件が一列の場合はフィルタを使用できるが、複数列の場合はどうするか？

##excelの機能を使用した方法
1.重複削除したい範囲を選択して、[データ]タブ-[詳細設定]

2.「フィルタオプションの設定」
抽出先：選択範囲内
「重複するレコードは無視する」にチェックを入れる。

これで重複列を削除できる。

##関数を使用した方法
A列とB列で重複行を削除したい場合、A列とB列を結合し、それが複数の場合、重複とみなす。

下記をコピペして使う。重複して2行以上ある列の2行目以降には、D列に"重複"と表示されるので、そこを除外すれば、重複除外となる。

```excel
　　　C　　　　　　　　　　　　D
=CONCATENATE(A2,B2)　　　=IF(COUNTIF($C$2:C2,C2)>1,"重複","")
```

ちなみに、COUNTIF(範囲A,セル)は、範囲内にセルの値がいくつあるかカウントする関数。
Windowsでのgrunt環境構築

Web開発周りの様々な作業を自動化してくれるという、とってもキュンキュンしてしまうgruntをWindowsにて環境構築した際のメモ。
gruntが行えるタスクの一例としては、

・構文チェック
・ファイル結合（複数のjsファイルを単一ファイルにするなど）
・メタ言語コンパイル（CSSプリプロセッサやCofeeScript・TypeScriptなど）
・ファイル最適化
・Backbone.jsやAngularJSで利用するtemplateの外部ファイル化

etc...
#nodistのインストール
gruntはnode.jsをベースとして動作しているため、まずnode.jsの環境構築が必要となる。
今回はnode.jsのバージョン管理が行えるWindows用ツール、nodistを使って環境構築を行う。

##ダウンロード
GitHubからzip形式でのダウンロード、もしくは`git clone`にて取得。
https://github.com/marcelklehr/nodist

任意の場所に配置する。
今回はCドライブ直下に配置。


```
C:\nodist
```

##環境変数の設定
nodistフォルダへのパスを通す。
まずは新規にシステム環境変数を作成。

>変数名 `NODIST_HOME`
>変数値 `C:\nodist`

さらに、既存のシステム環境変数`Path`の値に、以下を追加。
既に入力されている値の最後に`;`がない場合、必ず`;`を入れてから追記すること。

>追加する変数値 `%NODIST_HOME%\bin;`

##インストール後の確認
コマンドプロンプトを開き、`nodist -v`を叩いてバージョン名が表示されれば、nodistのインストールは問題なく終了している。

```:cmd.exe
>nodist -v
0.4.8
```

#node.jsのインストール
次に、nodistを使ってnode.jsのインストール作業を行ってゆく。
コマンドプロンプトにて、```nodist upate```を実行。

ずらずらと表示されるのでお茶を飲みながら待つ。

終了したら`node -v`コマンドでインストールされたか確認。

```:cmd.exe
>node -v
v0.10.24
```

#gruntのインストール
いよいよ本命のGruntのインストール作業である。
node.jsと一緒に入ってきた、`npm`コマンドを使ってgruntをインストールする。
ここでインストールするパッケージはgrunt本体の`grunt`ではなく`grunt-cli`(grunt command line interface)である点に注意すること。
`grunt-cli`は、任意のディレクトリにインストールされた`grunt`を実行するために必要なパッケージである。

※grunt本体は後ほど、作業対象のディレクトリにインストールする。

```:cmd.exe
>npm install -g grunt-cli
```

※`-g`オプションはグローバル化（どこでもコマンドが叩けるようにする）

##作業ディレクトリへの移動と、package.jsonの作成
`cd`コマンドを使い、任意の作業対象ディレクトリへ移動する。
移動が完了したら、`npm init`コマンドを実行し、`package.json`ファイルを生成する。

いくつか入力が要求されるが、ここで入力できるものは動作に必ず必要なものではないので、Enterで飛ばしても構わない。

##作業ディレクトリへgrunt本体インストール
grunt本体をインストールする。

```:cmd.exe
npm install grunt -save-dev
```

※`-save-dev` installしたパッケージの情報を、package.jsonへ自動追記する。

以上で対象の作業ディレクトリでのgruntの実行が可能となったので、めくるめく楽しいgrunt人生が送れる。
gruntで使用するいくつかのプラグインについては別項で解説予定。

#補足：Gruntfile.jsのひな形
```js:Gruntfile.js
module.exports = function (grunt) {
	var pkg = grunt.file.readJSON('package.json');
	grunt.initConfig({
            // タスクの設定を記述
	});
    // プラグインのロードやタスクの登録
};
```

突っ込みどころ、盛大に間違っている部分等ありましたら是非ご指摘ください。
VirtualBox にて E_FAIL (0x80004005) のエラーが出て VM が起動しない場合の対処

VirtualBox の VM を立ち上げようとして

> cannot access the kernel driver

などのメッセージが表示されたり、

> E_FAIL (0x80004005)

などのエラーコードが表示された場合の対処法です。

# 結論

深いことを考えずに、VirtualBox を再インストールする。

# 補足

厳密にはケースバイケースなのかもしれないけど、VirtualBox を最新版にアップデートする際に ``VirtualBox Interface`` のプロセスが立ち上がりっぱなしで、インストーラにて Ignore ボダンを押して無理矢理インストール作業を進めようとするとこの状態になることがあるっぽい。
線分の交点を求める

参考 : http://okwave.jp/qa/q2186446.html

こんなんで合ってるかしら。一応期待した動きはしている

```objc
/*
  L1sとL1eを結ぶ線分、 L2sとL2eを結ぶ線分の交点を求める。
  交差する場合 ptに交点がセットされ、 YESが返る
  交差しない場合 NOが返る。 ptは変化しない
*/
BOOL LineIntersect(NSPoint L1s, NSPoint L1e, NSPoint L2s, NSPoint L2e, NSPoint *pt)
{
    // L1, L2が点の時は交差しないと判断
    if (L1s.x == L1e.x && L1s.y == L1e.y)
        return NO;

    if (L2s.x == L2e.x && L2s.y == L2e.y)
        return NO;

    NSPoint v1 = NSMakePoint(L1s.x - L2s.x, L1s.y - L2s.y);
    NSPoint vA = NSMakePoint(L1e.x - L1s.x, L1e.y - L1s.y);
    NSPoint vB = NSMakePoint(L2e.x - L2s.x, L2e.y - L2s.y);
    
    // 外積
    CGFloat fDeno = vA.x * vB.y - vA.y * vB.x;
    
    // 並行 (外積0)なら交差しないと判断
    if (fDeno == 0)
        return NO;

    CGFloat t = (v1.y * vB.x - v1.x * vB.y) / fDeno;
    CGFloat s = (v1.y * vA.x - v1.x * vA.y) / fDeno;

    if (t < 0 || 1 < t || s < 0 || 1 < s)
        return NO;
    
    pt->x = vA.x * t + L1s.x;
    pt->y = vA.y * t + L1s.y;
    return YES;
}
```
Ubuntu 14.04にrbenvでruby2.1.1入れようとして怒られた

# 何が起きたの？
Ubuntu14.04でrbenv使ってRuby2.1.1入れようとしたら怒られた、としか表現できないんですけど。

```bash
$ rbenv install 2.1.1
Downloading yaml-0.1.6.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/5fe00cda18ca5daeb43762b80c38e06e
Installing yaml-0.1.6...
Installed yaml-0.1.6 to /home/agen/.rbenv/versions/2.1.1

Downloading ruby-2.1.1.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/e57fdbb8ed56e70c43f39c79da1654b2
Installing ruby-2.1.1...

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20140423151322.1329
Results logged to /tmp/ruby-build.20140423151322.1329.log

Last 10 log lines:
compiling ossl_rand.c
compiling ossl_x509crl.c
compiling ossl_ns_spki.c
compiling ossl_digest.c
compiling ossl_pkey_rsa.c
installing default openssl libraries
linking shared-object openssl.so
make[2]: ディレクトリ `/tmp/ruby-build.20140423151322.1329/ruby-2.1.1/ext/openssl' から出ます
make[1]: ディレクトリ `/tmp/ruby-build.20140423151322.1329/ruby-2.1.1' から出ます
make: *** [build-ext] エラー 2
```

# どうするの？
[Build failure on 2.x and solution (related to readline) #526](https://github.com/sstephenson/ruby-build/issues/526)
[rbenv fails to install 2.1.0 on ubuntu 14.04 #528](https://github.com/sstephenson/ruby-build/issues/528)

調べたらそれっぽそうなissueがあったので、[この通り](https://github.com/sstephenson/ruby-build/issues/526#issuecomment-37933242)にやってみた。

```bash
$ curl -fsSL https://gist.github.com/mislav/a18b9d7f0dc5b9efc162.txt | rbenv install --patch 2.1.1
Downloading yaml-0.1.6.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/5fe00cda18ca5daeb43762b80c38e06e
Installing yaml-0.1.6...
Installed yaml-0.1.6 to /home/agen/.rbenv/versions/2.1.1

Downloading ruby-2.1.1.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/e57fdbb8ed56e70c43f39c79da1654b2
Installing ruby-2.1.1...
patching file ext/readline/readline.c
patching file ext/readline/extconf.rb
patching file ext/readline/extconf.rb
Installed ruby-2.1.1 to /home/agen/.rbenv/versions/2.1.1
$ rbenv global 2.1.1
$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
```

とりあえずこれでおｋ？
VoltDBを使ってみる

#そもそもvoltDBってなんぞや
書籍での利用方法紹介や2010年頃に話題にもなったので、知ってる方も多いのではないかと思いますが、
新世代のdatabaseと言われる様な分類で、
PostgreSQLに携わった方の設計によるデータベースで
インメモリにデータを保存し、SQL文をそのまま使う事で、
NoSQLとRDBMSのいいとこ取りの様なデータベースです。

かといって全てのSQLがサポートされている訳ではありません
[サポートされているSQLはこちら](http://voltdb.com/docs/UsingVoltDB/AppxSQL.php)

また、javaで作られたストアドプロシージャを利用するのも特徴の一つになっています。
これらを利用してトランザクションをサポートしたり、SQL文を利用しながらも、
NoSQL並みのパフォーマンスとRDBMSの良さを実現しています。

ただ欠点が無い訳では無く、普通のRDBMSと同じ利用方法では利点があまりないので、
色々いじりながら使った方が良さそうです(まさに今そんな感じです)
DBエンジニアが担当するというよりは、
エンジニアがjavaを書きながら、ガツガツ使いながらいく方が良いのではないかと思います。
クライアントは各言語に提供されてマス

**なぜ今voltDBなのかというと完全に趣味ですが、今後利用する場面は多くなるのではないでしょうか**
導入がNoSQLと同様に簡単なので手軽に試してみる事が出来ます。
今回は至ってベーシックにMySQL等と同等程度にコンパイルしてSQLを発行するのをメモがてら紹介です。

#入手する
とりあえずコミュニティエディションを入手します
[VoltDB GitHub](https://github.com/VoltDB/voltdb/)

```bash
git clone https://github.com/VoltDB/voltdb.git
cd voltdb
ant
```

完了したら、examplesの中にサンプルで動かせるものがあるので、
それをドキュメントサイトを見ながら動かしてみるといいかもしれません。
今回はライトにMySQL等と同じ様な動作をさせるので、触れません

[サポートされているDDLはこちら](http://voltdb.com/docs/UsingVoltDB/AppxDDL.php)

#動かしてみる
普通のRDBMSと同様にCREATEします。

```sql:users.sql
CREATE TABLE users (
   user_id INTEGER UNIQUE NOT NULL,
   user_name VARCHAR(40) NOT NULL,
   created_at TIMESTAMP NOT NULL
);
```
オートインクリメントはサポートされていない為、ストアドプロシージャで実装する事になります。
こんな感じであまり変わらないと思いますがsqlを作ります。
sqlファイルをコンパイルします

```bash:compile
voltdb compile users.sql
```
このまま実行すると、データベースをcreateするときにデフォルトのcatalog.jarとなります。
任意の名前にしたい場合は下記の様にします

```bash:compile
voltdb compile -o users.jar users.sql
```

コンパイルすると色々ファイルが出来ていると思います
出来上がったjarを使ってvoltdbを起動させます。

```bash:create
/voltdb create users.jar
```

デフォルトで8080を使用して起動します。
localhost:8080で何か色々見えると思います。
sqlcmdで操作します。

```bash:select
sqlcmd
SQL Command :: localhost:21212
1>SELECT * FROM USERS;
USER_ID  USER_NAME  CREATED_AT 
-------- ---------- -----------
```

```bash:insert
insert into users values (1, 'voltdb', NOW);
```

```bash:update
UPDATE users SET user_name = 'VoltDB' WHERE user_id = 1;
```

ほぼそのまま使用する事が出来ます。
他にもjsonによるAPIを実装したりと色々な機能が提供されています。
エクリプス等で作り込んでいくと、なかなか面白い使い方ができるのではないと思います。
次回は何か色々いじってみる編です
MacOS X でJava開発のトラブル


MacでJava開発してるとチョイチョイ、Mac固有の問題が起きる.
とりあえずその辺をまとめてみました.

## UnknownHostExceptionがスローされる

`InetAddress.getLocalHost()`を使用している箇所で以下のような例外が発生する場合がある.

> java.net.UnknownHostException: MYMAC: MYMAC: nodename nor servname provided, or not known


### 解決方法

`/etc/hosts`に名前解決をさせれば例外が解消される.
上記の内容の場合`MYMAC`を`/etc/hosts`に名前解決をさせればOK.

```
127.0.0.1 localhost MYMAC
```

## 標準入出力が文字化ける

何もしていないとJava 1.6までは標準入出力で文字化けます

### 解決方法

Javaのオプションを指定してあげるととりあえず直ります.
Java 1.7以降はこの方法を取らなくても問題なく扱えると思います.

```bash
export _JAVA_OPTIONS='-Dfile.encoding=UTF-8'
```

## 環境変数JAVA_HOME見つからない

Mavenの実行に環境変数`JAVA_HOME`見つからないことがありました.

> Warning: JAVA_HOME environment variable is not set.

### 解決方法

以下のように`java_home`コマンドを実行した結果を環境変数`JAVA_HOME`に設定することで、
今後バージョンアップしても対応できます.

```bash
[[ -e $(/usr/libexec/java_home) ]] && export JAVA_HOME=$(/usr/libexec/java_home)
```

## Mavenで無効なVMバージョンって怒られる

Mavenの実行に以下のメッセージで怒られる場合があります

> 1.7 は無効な VM バージョンです。

### 解決方法

`JAVA_HOME`で指定されているJava VMのバージョンが古い可能性があります.
Java VMをインストールするか`JAVA_HOME`に正しいバージョンのVMを指定してください.
Intent に Enum を詰めて、取り出す


```java:enum
public enum MyTypes {
	One,
	Two,
	Three
}
```


```java:put
intent.putExtra("hoge",MyType.Two);
```

```java:get
MyTypes t = (MyTypes)intent.getSerializableExtra("hoge");
```

取り出すのは ``getSerializableExtra`` であることに注意。

なんか int に変換されそうじゃん、と思って ``getIntExtra`` を使うと取り出せない。
Rails4でgoogle-maps-for-railsを使ったら何故かAndroidのWebViewでマーカーが表示されなかった


[Rails4でGoogleMapを表示させる](http://qiita.com/jacoyutorius/items/a107ff6c93529b6b393e)

さっそくやってみると何故かAndroidでだけマーカーが見えない。
処理が途中で止まってる感じ。
サーバは　Apache + passenger。

## idからアンダーバーを取ったら動いた

``` html
<div id="shelter_map" style="width:100%; height:400px;"></div>
```
idのアンダーバーを取ったら動くようになったようだが...

はて？
ちょ〜、簡単にJavascriptを使ってURLをパースする。


document.createElementでaオブジェクトを作ってそのオブジェクトのプロパティを使う！

```javascript:uri.js
var parser = document.createElement('a');
parser.href = "http://hogehoge:8080/pathname/?search=test#hash";
 
parser.protocol; // => "http:"
parser.hostname; // => "hogehoge"
parser.port;     // => "8080"
parser.pathname; // => "/pathname/"
parser.search;   // => "?search=test"
parser.hash;     // => "#hash"
parser.host;     // => "hogehoge:8080"
```
Padrinoでファイルをダウンロードさせる

Padrinoで作ったウェブアプリケーションでCSVファイルをダウンロードさせようとした。Ruby on Railsだと以下のような感じでできる。

```Ruby
data=[[1, 2, 3], [4, 5, 6]]
csv=data.map{|x| x.join(",")}.join("\n")
send_data(csv,
          disposition: "attachment",
          type: "application/octet-stream",
          filename: "foo.csv")
end
```
しかし、padrinoの同名のヘルパメソッドsend_dataはobsoleteされてしまったようだ。どのようなものであったかは知らないけれども。
調べてみたところ、sinatraのヘルパメソッドを使って以下のようにすると実現できることが判った。

```Ruby
data=[[1, 2, 3], [4, 5, 6]]
csv=data.map{|x| join(",")}.join("\n").encode("Shift_JIS")
content_type "application/octet-stream"
attachment "bar.csv"
response.write csv
```
ExcelをインストールしたWindowsからこのコードを含むURIにアクセスすると、Excelで直接開くこともできる。
ProxSMTPによる"超"単機能コンテンツフィルタの実装

SMTPメールを出力するサーバからメールを受け取り、「本文中にAaaとBbbという文字があればrelay、でなければreject」を実装する必要が出てきた

ただし、以下の条件がある

1. SMTPメールを出力するサーバへのログインはできない


結論:
-----

ProxSMTP(+スクリプト)を搭載したサーバを別途用意、そこにSMTPメールを中継させて判定を行うようにした

```bash
$ sudo apt-get -y install proxsmtp
$ sudo service postfix stop
$ sudo update-rc.d -f postfix remove
```

※Postfixが入るのはご愛嬌

```/etc/proxsmtp/proxsmtpd.conf
Listen: 0.0.0.0:25
OutAddress: upper-mx.example.local:25
FilterCommand: /opt/bin/filter.rb
```

```ruby:/opt/bin/filter.rb
#!/usr/bin/env ruby

require "mail"

module Postfix
  module Filter
    def self.run(input)
      mail = Mail.new(input)
      return true if (mail.body =~ /Aaa/ and mail.body =~ /Bbb/)
      false
    end
  end
end

if __FILE__ == $0
  if Postfix::Filter.run(msg = STDIN.read)
    STDOUT.puts msg
    exit 0
  else
    STDERR.puts "550 Content Rejected: could not relay."
    exit 255
  end
end
```


今回得られた知見:
-----------------

一般的なSMTPサーバというものは「原則relay」(= default allow)に則って設計/実装されている。
よって「特定条件のみrelay」 (= default reject)を実現するのが、極めて大変。

postfix / exim4 / sendmail / Courier-MTA について、default rejectが可能なのか調査した。

### Postfix ###

#### ビルトインヘッダ・本体検査(header_checks / body_checks)による検査 ####

```/etc/postfix/body_checks
# passという文字がbodyに見つかったらDUNNO(=OK)、そうでない場合はREJECTとしたい
/pass/ DUNNO
/.*/ REJECT
```

ルータ等のfilterを書いている人なら「これでOKじゃね？」と思うが、残念。
header_checks/body_checksでは、DUNNO(OK)で判定が止まらないため、REJECT行まで行ってしまう。(バグではなく仕様)

#### 単純なcontent_filterによる検査 ####

シェルスクリプト等へSTDIN/STDOUTを使ったフィルタ実装は、`content_filter`に来た時点で既にqueueに入っているため、スクリプト内ではdeferもしくはbounceのみ選択可能。rejectはできない。


#### 高度なcontent_filterによる検査 ####

inetもしくはunix domainソケットを使った、他プロセスと通信してcontent_filterする場合は、単純な場合と違い、他プロセスの結果に応じてrejectを発生させる事は可能。

※ただし、今回の用途で考えると、このためだけに2つもプロセスを起動するのはシステムがデカすぎるため、不採用としました


### exim4 ###

`system_filter`で実装可能...と思われましたが、設定ファイルがデカすぎ＆わかりづらく、system_filterを適用できませんでした。

たぶんこれで行けると思うんですけど。

```/etc/exim4/system.filter
# Exim filter
if $message_body contains "Aaa" and $message_body contains "Bbb"
then
  seen finish
else
  fail "cannot relay."
endif
```

※一行目に`# Exim filter`って書かなきゃいけないところが、もうダメ。むり。

### sendmail / Courier-MTA ###

もう、力つきて、調べてない。


あとがき
--------

もう、こんな仕事、やりたくない。。。
Qiitaの中でProxSMTPネタって、Qiitaの中では初じゃないでしょうか？
Unityはじめました

プログラミングほぼ初心者の私が今日からUnityでのゲーム開発を学び始めました．
環境はMacbookAir，Unity４？（Free版）です．

とりあえずチュートリアルのブロック崩しを作っていたのですが，
ボールがブロックに衝突した際，跳ね返らずに失速してしまいます．

どういうことなんでしょうか...

早くもチュートリアルで躓き先行きが不安ですが，
頑張って行きたいと思います！笑
shenzhenを使って超簡単ipaファイル作成


![shenzhen-banner.png](https://qiita-image-store.s3.amazonaws.com/0/8748/1a6e61f5-b430-a0da-c69f-7ad31cbc11c5.png "shenzhen-banner.png")

先日、[Rettyさんで行われた勉強会でも話した](http://www.slideshare.net/kkinukawa/plannahdeploy-gate-33070668)のですが、最近ipaファイルを作成するときは[shenzhen](https://github.com/nomad/shenzhen)を使っています。
これを使うと、コマンドラインから一発でipaファイルが作成できるので非常に簡単便利。
DeployGateを組み合わせて使っています。

#インストール方法

```zsh
$ gem install shenzhen
```

#使い方
Xcodeのプロジェクト直下で

```zsh
$ ipa build
```

これでhoge.ipaファイルが作成されます。
あとはDeployGateで配信すればOK。
JScriptでDOM(XML)操作


## はじめに

かつては、テキストの汎用フォーマットといえばXMLでしたが
最近はJSONで良いのでは、という所が多くなってきている気がします。

忘れない為のサンプルコードです。

## 構文解析

「Msxml2.DOMDocument」オブジェクトから、`load`又は`loadXML`メソッドでDOM化出来ます。

ノードの取り方は、XPath形式`selectSingleNode`や、タグ名`getElementsByTagName`などで取得出来ます。

```js
// XML
var xml = "<?xml version='1.0'?>\r\n"
        + "<root>\r\n"
        + "    <aaa attr='rtta'>111</aaa>\r\n"
        + "    <bbb>\r\n"
        + "        <ccc>222</ccc>\r\n"
        + "    </bbb>\r\n"
        + "    <bbb>\r\n"
        + "        <ccc>333</ccc>\r\n"
        + "    </bbb>\r\n"
        + "</root>\r\n";

// DOMオブジェクト生成
var dom = new ActiveXObject("Msxml2.DOMDocument");
// 同期化
dom.async = false;
// パース
dom.loadXML(xml);
// ファイルの場合
// dom.load(path);
// 結果判定
if (dom.parseError.errorCode == 0) {
    // XML出力
    WScript.Echo(dom.xml);

    // aaaタグ取得
    var aaa = dom.selectSingleNode("//root/aaa");
    // 属性値取得
    WScript.Echo(aaa.getAttribute("attr"));

    // ルート取得
    var root = dom.documentElement;
    // タグ名がbbbのエレメント取得
    var elements = root.getElementsByTagName("bbb");
    // エレメント数分ループ
    for (var i = 0; i < elements.length; i++) {
        // エレメント取得
        var element = elements[i];
        // 子取得
        var child = element.firstChild;
        // このタグ名とテキスト表示
        WScript.Echo(child.nodeName + ":" + child.text);
    }
} else {
    // パース失敗の場合
    WScript.Echo("parseError:" + dom.parseError.errorCode);
}
```

## 生成

「Msxml2.DOMDocument」オブジェクトから、XML宣言`createProcessingInstruction`やノード`createElement`を生成し階層のとおりに、追加`appendChild`していきます。

```js
// DOMオブジェクト生成
var dom = new ActiveXObject("Msxml2.DOMDocument");
// XML宣言部分生成
var head = dom.createProcessingInstruction("xml", "version='1.0'");
// XML宣言部分設定
dom.appendChild(head);

// ルート生成
var root = dom.createElement("root");

// aaaタグ生成
var aaa = dom.createElement("aaa");
// aaaタグ属性設定
aaa.setAttribute("attr", "rtta");
// aaaタグテキスト設定
aaa.text = "111";
// aaaタグをルートに追加
root.appendChild(aaa);

// アイテム数分ループ
var items = ["222", "333"];
for (var i = 0; i < items.length; i++) {
    // bbbタグ生成
    var bbb = dom.createElement("bbb");
    // cccタグ生成
    var ccc = dom.createElement("ccc");
    // cccタグテキスト設定
    ccc.text = items[i];
    // bbbタグにcccタグを追加
    bbb.appendChild(ccc);
    // bbbタグをルートに追加
    root.appendChild(bbb);
}

// DOMにrootを追加
dom.appendChild(root);
```
[CakePHP 2.x] 一時的な作業用ディレクトリ作成・削除

cakeで作業用のディレクトリを一時的に用意するスクリプトを書いたので、
その際の一時ディレクトリ作成・削除の部分をメモ。

基本的に以下の使い方になります

```php
App::uses('Folder', 'Utility'); 

$dir = new Folder();
$dir->create("/tmp/hoge"); // /tmp/hogeディレクトリを作成

```

次に削除

```php

$dir = new Folder("/tmp/hoge");
$dir->delete();

```

これを使うと↓の様な感じでかけます。

```php
<?php
App::uses('Folder', 'Utility'); 

class Hoge extends Fuga {

const EDIT_PNG = '/png';

    public function createWorkingDirectoy() {
        // "/tmp/{現在の時間}"というディレクトリをパーミッション777で作ります

        // オブジェクト作成
        $dir = new Folder(DS . 'tmp' . DS . time(), true, 0777);

        // 作業ディレクトリルートパス
        $workingDirectoryRootPath = $folder->pwd();

        // 作業ディレクトリ作成
        if (!$folder->create($workingDirectoryRootPath . self::EDIT_PNG)) { # ディレクトリを作成("/tmp/{現在の時間}/png"が出来ます)
            $dir->delete(); # 作成に失敗した場合は削除
            return false;
        }

        return "hoge";
    }
```

次にディレクトリの削除です。
引数で渡されたディレクトリ以下を再帰的に削除していきます。

```php
    private function __rrmdir($dir) { # Recursive Remove DIRectoryって感じで'rrmdir'です
        foreach (glob($dir . '/*') as $file) {
            if (is_dir($file)) {
                $this->__rrmdir($file);
            } else {
                unlink($file);
            }
        }
        rmdir($dir);
    }
```

ただ、rmdirの使用は推奨されていないので、rmdirのところは以下を使った方がいいのかもしれません。

```php
App::uses('File', 'Utility');

$file = new File($dir);   //インスタンスの作成
$file->delete();
```
rbenvで1.8.7をインストールする際のエラーの対処法

ちょっと訳あってどうしても1.8.7をインストールする必要があったんですが
centOS6.5でopensslをアップデートしてから(？)rbenvで1.8.7のインストールが失敗するようになりました。
どうもrbenvのバグではなくRubyのopenssl拡張のバグらしい。
ということでrbenvの作者のsstephensonは以下のようにパッチ当ててインストールしたらええがなとGitHubでおっしゃってます。

```bash
$ curl -fsSL https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/41808/diff?format=diff | filterdiff -x ChangeLog | rbenv install --patch 2.0.0-p247
```
2.0.0-p247 (and lower) と書いてあったのでlowerっつーことは1.8.7でもこのパッチ当てていいのかなと思い試してみたところ

```bash
$ curl -fsSL https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/41808/diff?format=diff | filterdiff -x ChangeLog | rbenv install --patch 1.8.7-p375

Installing ruby-1.8.7-p375...
patching file ext/openssl/ossl_pkey_ec.c
Hunk #1 succeeded at 757 (offset -5 lines).
Hunk #2 succeeded at 813 with fuzz 2 (offset -6 lines).
can't find file to patch at input line 33
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|Index: test/openssl/test_pkey_ec.rb
|===================================================================
|--- test/openssl/test_pkey_ec.rb   (revision 41807)
|+++ test/openssl/test_pkey_ec.rb   (revision 41808)
--------------------------
File to patch:
```

あかんわ、うまくいかね（＾ω＾；）
test/openssl/test_pkey_ec.rbが見つからないってこと？
とにかくパスを求められてしまい何を入力してもだめ。

そもそも1.8.7にtest/openssl/test_pkey_ec.rbなんてないんじゃないか？と思って
-x test/openssl/test_pkey_ec.rb を付けて無視してみたところ

```bash
$ curl -fsSL https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/41808/diff?format=diff | filterdiff -x ChangeLog -x test/openssl/test_pkey_ec.rb | rbenv install --patch 1.8.7-p375

Checking out http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7...
Installing ruby-1.8.7-p375...
patching file ext/openssl/ossl_pkey_ec.c
Hunk #1 succeeded at 757 (offset -5 lines).
Hunk #2 succeeded at 813 with fuzz 2 (offset -6 lines).
Installed ruby-1.8.7-p375 to /usr/local/rbenv_data/versions/1.8.7-p375

Downloading rubygems-1.6.2.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/0c95a9869914ba1a45bf71d3b8048420
Installing rubygems-1.6.2...
Installed rubygems-1.6.2 to /usr/local/rbenv_data/versions/1.8.7-p375

$ rbenv versions
  1.8.7-p375
  2.0.0-p451
* 2.1.1 (set by /usr/local/rbenv_data/version)
```

うまくいったみたい
（＾ω＾；）おかえり1.8.7
rbenv作者のヒゲ男爵はマジ神。
デザインデータがPhotoshopで来たとき用のメモ。

たまにPhotoshopデータがきて、その度にあれどうやるんだったけ状態なのでメモ。

#WEB用の初期設定

## 単位をpxに変更
「編集」 → 「環境設定」→「単位」
単位のところを　定規、文字それぞれpxに設定

## グリッドもpx単位に変更
「編集」 → 「環境設定」→「ガイド・グリッド・スライス」
グリッド線をpxに変更

## 選択
選択ツールを選び、
・自由選択にチェック...レイヤー選択しなくても、カンバス上の図形が動かせる
・レイヤーに設定、...レイヤーごとに選択できる
・バウンティングボックスを表示...何が選択されているかわかる

## 長方形で端っこをぼけないようにする
長方形ツールを選択、上部メニューの▼からピクセルにスナップを選択
（CS6だとエッジを整列）

#スライス関連

##レイヤーに基づく新規スライス

レイヤーを選択 → Alt + L → B
（メニューだと、「レイヤー」→「レイヤーに基づく新規スライス」を選択）
※CCの場合はショートカットが割り当てられてないので適宜追加


##画像名をつける
スライス選択ツールで、書き出したいスライスに対してダブルクリック
連番とかでリネームしたい場合はBridgeとか使うのが妥当かも。


##書き出し
Alt + Shift + Ctrl + S 
（メニューだと、「ファイル → 「Webおよびデバイス用に保存」）から
書き出したいスライスをShiftを押しながら複数選択し（選択すると線が茶色になる）、
画像形式や画質を決めて保存。

設 定  ：初期設定だと勝手にimagesフォルダを作ってそこに保存するので、
設定をその他にして、「画像をフォルダーに保存」のチェックをはずす。

スライス：選択したスライス　になっているか確認。
CSSで八角形の表現をする

[CSS Shapes](http://dev.w3.org/csswg/css-shapes/)の話とかじゃないのであしからず。

![cssoctagon.png](https://qiita-image-store.s3.amazonaws.com/0/21225/bfafb431-1a9a-33d2-c276-3ab46305b46a.png)

## CSS

仕組みはけっこう単純。

擬似要素に角の役割をしてもらう。

```css
.octagon {
  position: relative;
}
.octagon:before, .octagon:after {
  display: block;
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  border: 20px solid transparent;
}
.octagon:before {
  bottom: 100%;
  border-bottom-color: inherit;
}
.octagon:after {
  top: 100%;
  border-top-color: inherit;
}

.octagon-color {
  background-color: #DDAAAA;
  border-color: #DDAAAA;
}
```

ポイントと注意点は、

- `:before`と`:after`の擬似要素を`position`で配置する
- 擬似要素の`border`で台形をつくる
- `position`でボックスの外側に配置しているので、実際に配置されるときには、前後の要素との余白の取り方などに注意
- `box-shadow`とかで影をつけるのは辛い。

## Codepen

http://codepen.io/hiloki/pen/kDahJ
mac rbenv でirb日本語が化ける問題こんなかんじで解決しました

#現象
mac homebrew でrbenvでruby環境作ったら、irbやpry上で日本語を入力すると化けてしまう。

#参考
brewで特定の古いバージョンのものをインストールする - Qiita http://qiita.com/quattro_4/items/01c3d921804b8d28cf18

rbenvとruby-buildでRuby環境を最新に保つ https://gist.github.com/mochiz/4736183

#大体のやったこと
```Bash:
# rbenvや依存パッケージの導入
brew install rbenv ruby-build openssl

# readline6.2.4インストール
cd /usr/local/
brew versions readline
git co 0181c8a(←6.2.4のやつ) /usr/local/Library/Formula/readline.rb
brew install readline

# 好きなバージョンのrubyの導入
brew link readline --force
RUBY_CONFIGURE_OPTS="--enable-shared --with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)"  rbenv  install 2.1.0
brew unlink readline
```