OmniAICreator/Qiita-1.07M huggingface dataset:
IROS 2014 Kinect Challengeに優勝したRTAB-Mapを実行してみた

# RTAB-Map
RTAB-Map(Real-Time Appearance-Based Mapping)は、RGB-Dカメラを用いたSLAM(自己位置推定と地図生成を同時に行う技術)である。

# 特徴

 - bag-of-words approachによる閉ループ検出とグラフ最適化
 - SURFやSIFT特徴量を用いる
 - Kinect、Xtion、ステレオカメラなどでも動作する


# ソースコード
[ここ](http://introlab.github.io/rtabmap/)からソースコードをダウンロードしてRTABMap.exeがあるので実行。ROSでも動くらしい。


# 動作環境
- Windows8.1(RAM 8GB, 2 cores @ 2.1GHz)
- Kinect v1 (XBOX360)

# 実行結果

3次元再構築したマップはcloud.plyファイルで保存できるので、MeshLab等で開いてみる。
![snapshot00.png](https://qiita-image-store.s3.amazonaws.com/0/63863/9c8c978f-61db-b645-0c22-b68512c7b120.png)

![snapshot01.png](https://qiita-image-store.s3.amazonaws.com/0/63863/e5efc9d7-5383-7cd3-4476-e4ba12bb4c67.png)

Kinectのケーブルが届く限りの範囲で、結構いい感じに構築できた。
途中でオドメトリがわからなくなった時にも、少しカメラの位置を戻してあげると、そこから認識して、再度構築が始まる。

また過去に保存した地図データベースを読み込んでから実行すると、BoWで現在の位置を認識し、その位置から再度地図作成が可能である。
![150130220114787.png](https://qiita-image-store.s3.amazonaws.com/0/63863/e7e7150d-b3d1-42a6-e1ba-7c3f1a89a2a1.png)

# 参考文献
- [2014 Kinect Autonomous Mobile Robot Navigation Contest](http://www.iros2014.org/program/kinect-robot-navigation-contest)
[ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm' からの復旧

## それは突然やってきた

- 同僚がOSを再起動
- 普通に立ち上がってきたかのように見える
- 「クエリエラーなるんだけど？」

## そして吐き出された大量のログ

```
150130 23:00:31 [ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm'
150130 23:00:31 [ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm'
150130 23:00:31 [ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm'
150130 23:00:31 [ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm'
150130 23:00:31 [ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm'
150130 23:00:31 [ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm'
150130 23:00:31 [ERROR] /usr/libexec/mysqld: Incorrect information in file: './hoge/hoge.frm'
・
・
・
```

## ググる

- innodbの場合、ib_logfile* を再作成すると直るかもという情報を得る

## 止まらないmysqld

とりあえずstopしてみた。

```
/etc/init.d/mysqld stop
```

何も出ない。止まらない。

違うコマンド試したら止まった。

```
mysqladmin -u root -p shutdown
```

## 祈りながらib_logfile*再作成

```
mv ib_logfile0{,_old}
mv ib_logfile1{,_old}
/etc/init.d/mysqld start
```
- 直った！

## まとめ

- バックアップ大事
【iOS】TwitterKitで画像投稿

[Fabric](https://get.fabric.io)のTwitter KitのREST APIを使っての画像投稿の記事が見当たらなかったのでｃ⌒っﾟдﾟ)っφ　ﾒﾓﾒﾓ...

[ドキュメント](https://dev.twitter.com/twitter-kit/overview)はこちら。情報少なっ！

まずは各API用のNSURLRequestを返すclass作成
「statuses/update」と「media/upload」の２つのAPIを使います。

```swift:TwitterAPI.swift

import TwitterKit

class TwitterAPI: NSObject {
    
    /// メディアアップロード用URLRequest
    func uploadMediaAPIRequest(imageData: NSData) -> NSURLRequest? {
        
        let media = imageData.base64EncodedStringWithOptions(nil)
        
        let params = [
            "media" : media
        ]
        
        let apiPath = "https://upload.twitter.com/1.1/media/upload.json"
        
        return Twitter.sharedInstance().APIClient.URLRequestWithMethod("POST", URL: apiPath, parameters: params, error: nil)
    }
    
    /// 投稿用URLRequest
    func statusUpdateAPIRequest(status statusOrNil: String?, mediaIDString: String) -> NSURLRequest? {
        
        let getCommentString = {(commentOrNil: String?) -> String in
            let limitCount = 140
            if let comment = commentOrNil {
                if comment.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > limitCount {
                    let index: String.Index = advance(comment.startIndex, limitCount)
                    return comment.substringToIndex(index)
                }
                return comment
            }
            return ""
        }
        
        let params = [
            "status" : getCommentString(statusOrNil),
            "media_ids" : mediaIDString
        ]
        
        let apiPath = "https://api.twitter.com/1.1/statuses/update.json"
        
        return Twitter.sharedInstance().APIClient.URLRequestWithMethod("POST", URL: apiPath, parameters: params, error: nil)
    }
    
}
```

次に実行部分

```

let imageData = UIImageJPEGRepresentation(image, 0.9)!
        
let twitterAPI = TwitterAPI()

Twitter.sharedInstance().APIClient.sendTwitterRequest(twitterAPI.uploadMediaAPIRequest(imageData)!, completion: { (responce: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            
	if error != nil {
		// Errorハンドリング
    	return
    }
            
	let mediaId = {(data: NSData) -> String! in
		if let jsonObject = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil) as? [String : AnyObject] {
			return jsonObject["media_id_string"] as? String
		}
		return nil
	}
            
	Twitter.sharedInstance().APIClient.sendTwitterRequest(twitterAPI.statusUpdateAPIRequest(status: commentOrNil, mediaIDString: mediaId(data))!, completion: { (updateResponce: NSURLResponse!, updateData: NSData!, updateError: NSError!) -> Void in
                
		if updateError != nil {
			// Errorハンドリング
       		return
    	}
                
       	// 送信完了
	})
})
```

「media/upload」で画像を上げてから、返って来る「media_id_string」をくっつけて「statuses/update」でツイートするという流れ。

さすが純正。お手軽すぎるぜ！
（Base64 Encodeしてパラメータにぶっ込むだけ・・の箇所で半日悩んだんですけどね！）
[swift]デバッグ時に接続先を変更する(URLがころころ変わる場合)

デバッグ時にはテスト環境に接続したいというケースが多々あります。今回は特にImmutable Infrastructure環境下でテスト環境のURLがころころ変わる場合に使えるテスト/本番環境の切り替え方法です。

# 単純なケース
コード上でDebug or Releaseを切り替えるだけの単純な場合。
プロジェクトの[Build Settings] -> [Other Swift Flags]のDebugの欄にだけ`-D DBG`オプションを付ける。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/52054/b85f9ca8-28ef-bd36-9818-caf1f647281f.png)

上記で設定したFlagをコードから参照して接続先を変更する。

```swift

class func getURL() -> String {
    #if DBG
        return "https://test.hogehoge.com"
    #else
        return "https://hogehoge.com"
    #endif
}
```

# for Immutable Infrastructure
テスト環境がImmutable Infrastructureのケース。毎回環境を作り直すので、テストするたびにURLが変わっていたりする。例えばAWS Beanstalkだと`hogehoge-ランダム文字列.elasticbeanstalk.com`という感じのURLが割り当てられる。

URLが変わるたびにコード上のURLを書き換えると、git上に無駄なdiffが発生してしまうのでイケてない。これを解決する方法です。

まずはプロジェクトに接続先定義ファイルを作る。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/52054/be63a6f3-6692-49e0-a3a3-a153272bd434.png)

定義ファイルにはこんな感じで接続先URLを書く。本当はjsonとかで書いたほうがそれっぽいけど不要なのでシンプルに。

``` test-server.txt
https://hogehoge-hugahuga.elasticbeanstalk.com
```

ファイルを作ったら、gitignoreでそのファイルをgitの管理対象外にする。

```text:.gitignore
# 以下を追記
test-server.txt
```

これでどんな状態になっているかと言うと、XCodeのプロジェクト上では`test-server.txt`が存在するが、git環境には含まれていない状態になる。つまりこの環境をpush後、cloneした人の環境では`test-server.txt`が見つかりませんエラーが出る。

このままでは不親切なので、新しくcloneした人のためにスクリプトファイルを作ってgitの環境に入れて上げる。`pod install`とかもついでに実行してもらえばいい。

``` script/setup.sh
echo "https://hogehoge-hugahuga.elasticbeanstalk.com" > test-server.txt
pod install
```

gitignoreを書き換えているのでキャッシュを削除してpush。

```
git rm --cached .
git add -A
git commit -m "hogehoge"
```

開発者はcloneした後にセットアップスクリプトを実行する。

```
git clone [レポジトリ]
cd [レポジトリ]
./script/setup.sh
```

これで「URL定義ファイルがプロジェクトには含まれているがgitignoreされている状態」が作り出せる。あとはテスト環境のURLが変わるたびに`server-test.txt`の内容を書き換えて上げればいい。gitへの影響は一切ない。

あ、ファイルの内容はこんなかんじで読み込んでます。

```swift
class func getURL() -> String {
    #if DBG
        if let debugFilePath = NSBundle.mainBundle().pathForResource("test-server", ofType: "txt") as String? {
            let fileHandle = NSFileHandle(forReadingAtPath: debugFilePath)
            let urlString = NSString(data: fileHandle!.readDataToEndOfFile(), encoding: NSUTF8StringEncoding) as String
            // delete space character
            return urlString.stringByReplacingOccurrencesOfString("\\s", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
        }
        else {
            return "https://hogehoge-hugahuga.elasticbeanstalk.com"
        }
    #else
        return "https://hogehoge.com"
    #endif
}
```

もっとスマートな方法があれば教えて下さい！
Alfred WorkflowでbashからMacVimを起動すると分割した.vimrcがロードされない（解決済み）


## 事象
Alfred Workflowのbashスクリプトで以下のようにMacVimを起動した場合、分割して~/.vimrcから連鎖的に読み込ませていた設定ファイルが読み込まれない。

```bash
PATH="$PATH:/usr/local/bin/"
mvim ~/Documents/sample.sh
```

## 検証
Alfred Preferencesのデバッグモードで見ると、以下のようなエラーが発生している。

```
line   39:
E484: Can't open file $vim_conf/setting-init.vim
```

$vim_confは、~/.vimrc内で以下のように定義されている。

```.vimrc
let vim_conf = $HOME . '/.vim/conf'
source $vim_conf/setting-init.vim
" 以下略
```

~/.vimrcで、`source`部分の記述を以下のようにフルパスに変更するとロードされる。

```vim
source ~/.vim/conf/setting-init.vim
```

`:echo vim_conf`すると、ちゃんと/Users/catfist/.vim/confが表示されるのだが。

専用の設定ファイルを作り、`-u`オプションで読ませたる方法もあるが、ちょっとやってられない。

```bash
mvim -u ~/Documents/.mvimrc ~/Documents/sample.sh
```

## 設定ファイルの読み込み方法を変えたら解決

```.vimrc
" set runtimepath+=~/.vim/ " なくてもいけた
runtime! conf/*.vim
```

これだと、問題なく反映された。
watchでプロセスの自動再起動ワンライナー

## 概要
たまに落ちてしまうスクリプトを常に動かしておきたかったので、
起動状態を確認して起動していなかったら新しく起動するワンライナーを作りました。

## 実装
```bash
watch  -n 2 "if [ 1 -eq `ps | grep hoge.rb | wc -l` ] ; then ruby hoge.rb; fi"  
```
プロセスを確認して、特定の文字列が見つからなければコマンドを実行します。
## 使い方

```[プロセス名に含まれる文字]``` の部分は、プロセスの名前として判断のつくものに変更
```[実行したいコマンド]``` の部分は、実行したいコマンドに変更
```[再起動までの時間]``` の部分は、何秒ごとに監視するかの頻度の秒数に変更

```bash
watch  -n [再起動までの時間] "if [ 1 -eq `ps | grep [プロセス名に含まれる文字] | wc -l` ] ; then [実行したいコマンド]; fi"  
```
.htaccessによるリダイレクト | www、index.htmlありなし

WEBサイトの運用でたまに使います。
.htaccessに記載します。

####1.wwwありに統一する場合

RewriteEngine on
RewriteCond %{HTTP_HOST} ^seotemplate.biz
RewriteRule ^(.*)$ http://www.hoge.com/$1 [R=301,L]

####2.index.htmlなしに統一する場合

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://www.example.com/$1 [R=301,L]

<注意事項>
さくらのレンタルサーバでは
Options +FollowSymLinks
をいれると500エラーが出ます。
他のサーバーでは未確認。

→ さくらサーバをお使いの方で index.htmlなしに統一したい場合は、以下のコードを記載して下さい。

RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://www.example.com/$1 [R=301,L]
emacsからfind-file-at-pointで辞書をひく(mac)

macでは`dict://foo`で辞書が引けるらしい。
find-file-at-pointを使ってカーソル行のurlをブラウザで開くことができる。
これを使って、辞書を引けるようにするための設定。

```lisp
(require 'ffap)

;; dict-support
(setq ffap-url-regexp "\\(dict\\|file\\|ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\)://")

(global-set-key (kbd "C-c C-f") 'ffap)
```

ffap-url-regexpを書き換えればいい。
Alfred 2.6 でScript Filterによるインクリメンタルサーチが快適になった


## Script Filter

Alfred Workflowには、Script Filterという機能があります。これは、スクリプトによりWebサービスなどからデータを取得し、その結果をインクリメンタルサーチするものです。

例えば、Qiitaの記事を検索する[uetchy/alfred-qiita-workflow](https://github.com/uetchy/alfred-qiita-workflow)は日々活用させていただいています。

大変便利な機能なのですが、従来は**検索に時間がかかる**という欠点がありました。

Script Filterの仕組みは、以下のようになっています。

* スクリプトがXMLドキュメントデータを出力
* Alfredがレンダリングしてitem要素からインクリメンタルサーチ
* argパラメータを次のアクションに引き渡す

一文字入力するたびにこのプロセスが走るため、例えば、「test」と入力した結果を得るには、プロセスが4会終了するのを待つ必要がありました。

## Alfred2.6での変更
Alfred2.6では、Script Filterの検索を高速化するための、「Script Behaviour」オプションが導入されました。

![スクリーンショット](http://cl.ly/ZXG9/Monosnap_2015-01-30_21-26-44.png)

![スクリーンショット](http://cl.ly/ZXNE/Monosnap_2015-01-30_21-27-16.png)

これらの概要を挙げます。

### Queue Mode:
**Wait until previous script finishes**
従来の挙動です。プロセスの終了を待ってから、次のプロセスを開始します。

**Terminate previous script**
文字入力ごとに、プロセスを終了して次のプロセスを開始します。

### Queue Delay:
**Immediately after each character typed**
文字入力ごとにプロセスを開始します。

**Automatic delay ater last character typed**
文字入力の終了を待ってから、プロセスを開始します。

**Custom delay after last character typed**
最後の文字を入力してから、指定した時間が経過するのを待ってプロセスを開始します。

**Always run immediately for first typed arg character**
引数となるテキストの最初の一文字に限り、即時にプロセスを開始します。

## 検証
試しに、以下のようなScript Filterを作ってみます。

```bash
sleep 5
cat << EOB
<?xml version="1.0"?>
    <items>
        <item uid="tets" arg="test" valid="YES" >
            <title>pid=$$</title>
        </item>
    </items>
EOB
```

* 「Wait until previous script finishes」を選択した場合、文字入力の5＋α秒後にプロセスIDが増加します。（5×文字数ではない。なぜだろう？）
* 「Wait until previous script finishes」を選択した場合、文字入力のほぼ5秒後にプロセスIDが増加します。
* 「Immediately after each character typed」を選択した場合、文字数分プロセスIDが増加します。
* 「Automatic delay ater last character typed」「Custom delay after last character typed」を選択した場合、ワンフレーズと判断される回数分プロセスIDが増加します。
* 「Always run immediately for first typed arg character」をチェックした場合、2文字以上の入力は常に2回分プロセスIDを増加させます。

## 実感
特にWeb APIを利用するWorkflowにおいては、顕著な時間短縮が見られます。Workflow作者様におかれては、早期のバージョンアップをお勧めします。

これらのオプションは、既存のWorkflowにも設定できます。導入済みのWorkflowに設定してみてはいかがでしょうか。
AWSソリューションアーキテクト-アソシエイト受けてきた

AWSの認定資格であるAWSソリューションアーキテクト-アソシエイトを受けてきました。
他の方も書いてはいますが、紹介と勉強方法を書いておきます。

# AWSソリューションアーキテクトとは？ #
[AWSサイト](http://aws.amazon.com/jp/certification/?nc2=h_l2_tr)によれば
>AWS プラットフォームで稼働するアプリケーションの設計、デプロイ、管理に必要なスキルと技術知識を有する IT プロフェッショナルであることを証明します。

だそうです。まぁAWS触れまっせってことですね。
いくつかAWS関連は資格があって、

1.ソリューションアーキテクト
2.デベロッパー
3.アドミニストレータ

があります。
ソリューションアーキテクトは、プロフェッショナルレベルまであります。
きっと、後々マスターレベルまで出てきそうな感じですね。



# AWSトレーニング #
受験にあたり、AWSのトレーニングを受けさせていただきました。
[Architecting on AWS](http://aws.amazon.com/jp/training/course-descriptions/architect/)
$1800という高いトレーニングでしたが
やっぱり非常に勉強になります。受けさせてくれた会社に感謝です。
円安の今、ドル払いだと結構ダメージくらいますね。

上位トレーニングである[Architecting on AWS - Advanced Concepts](http://aws.amazon.com/jp/training/course-descriptions/architecting-advanced/)はどうやら日本では開催されていないみたいです。

# 勉強方法 #
私は普段はWEB系エンジニアでもないので、はじめはなかなか抵抗がありました。
EC2とかVPCとか。概念の理解が非常に辛い。
お金だってどうかかるかわからないので非常に怖い。

■勉強本
そこに来ました。救いの一手。

***[Amazon Web Services 基礎からのネットワーク&サーバー構築](http://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822262960)***

なにがよかったって、（購入当時、）コンソールのスクリーンショットが同じ！
これ結構重要です。AWSのコンソールはちょくちょく変わるので
古いものだと本の中にある画像と違うし、英語だしって結構なえます。
お金もどれだけとられているかわからないし。

ってことで、これをひと通り手順に沿って触ってみました。
この本のとおりに進めていくと環境が作れます。

**そう、もう怖くないAWS！**

■研修
次に、上で紹介している研修。
３日間のコースでした。
ひと通りのサービスが理解できます。
あーこんな製品はこうゆう使い方するのか、みたいな。
個人的にいいなーと思ったのは[セルフスペースラボ](http://aws.amazon.com/jp/training/self-paced-labs/)です。
壊しても大丈夫なAWS空間みたいな感じですが、普通に使えました。
やっぱり触らないとわからないことも結構あるんですよね。

**そう、もう怖くないAWS！**

#####■事例集####
[マイスターシリーズ](http://aws.amazon.com/jp/aws-jp-introduction/)ですね。
試験前２週間くらい毎朝、毎晩読み込んでました。あと、よくある質問シリーズ。
製品ごとに

マイスターシリーズ読む→よくある質問読む

をひたすらやった感じです。

#####■試験の感覚#####
を掴むのには以下を利用しました。
　1.日本語版のサンプル問題
　2.英語版のみの模擬試験

英語は得意ではないですが、私は模擬試験を受験しました。
問題のイメージをつかむのにちょうど良かったです。
時間間隔とか。この時は全然点数とれませんでしたが（笑）

受験後は「合格してよかった！」という気持ちとともに
「あーこんな部分理解できてなかったなー」って思いが生まれてました。
こんな気持ちにさせられる試験てすごい！！

**そう、もう怖くないAWS！**
Blenderの中のPythonでカレントディレクトリを知るには

# 背景

OSXでFinderから起動した場合、一体どこがカレントディレクトリなのか
気になり調べた。

# カレントディレクトリを知る

```py3
import os.path
print(os.path.abspath(os.path.dirname(".")))
```

dirnameのみだと、何も表示されない。
abspathを使うとフルパスで表示されるようになる。

# 関連投稿

- [OSXのBlenderでOpenCVを使う](http://qiita.com/kjunichi/items/814993f194d7c07b78bb)

# 関連記事

- [OSXのBlenderでctypesを試した](https://abrakatabura.hatenablog.com/entry/2015/01/31/091848)
- [BlenderでPython使って最速降下曲線を描いてみる](https://abrakatabura.hatenablog.com/entry/2016/05/26/070858)
- [Blender2.80betaにしたら、Pythonのスクリプトが動かなくなって対応した件](https://abrakatabura.hatenablog.com/entry/2018/12/13/210156)
ffmpegで音声をカット編集


ファイルの最初を抜き出す（最後をカット）
--

```bash
ffmpeg -i input_file.mp3 -t 3600 output_file.mp3
```

input_file.mp3の、0秒~3600秒までを抜き出してoutput_file.mp3というファイルに出力する


ファイルの途中を抜き出す（前後をカット）
---

```bash
ffmpeg -i input_file.mp3 -ss 60 -t 3540 output_file.mp3
```

最初に無音時間があって最初の1分だけ切り、録音開始から1時間したらその後はいらないというパターン

input_file.mp3の、60秒~3600秒までを抜き出してoutput_file.mp3というファイルに出力する


ファイルの最後を抜き出す（最初をカット）
---

input_file.mp3の、最初の60秒をカットして、それ以降は全部生かす場合。

この場合は、input_file.mp3の音声ファイルの長さを調べ、秒数に直し、そこから60引いて、出力するファイルの長さを計算する。

```bash
ffmpeg -i input_file.mp3
```

このようにコマンドを打つと、ファイルの情報が分かる。

```
ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers
（略）
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input_file.mp3':
  Metadata:
    major_brand     : M4A 
    minor_version   : 0
    compatible_brands: M4A mp42isom
    creation_time   : 2015-01-20 22:55:38
    iTunSMPB        :  00000000 00000840 00000000 0000000056F0E3C0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  Duration: 09:11:15.50, start: 0.000000, bitrate: 314 kb/s
    Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 313 kb/s (default)
    Metadata:
      creation_time   : 2015-01-20 22:55:38
      handler_name    : Core Media Audio
```

`Duration: 09:11:15.50`というのがファイルの長さ。
9時間11分15.50秒で終わっているということを表示してくれている。

Terminalを電卓のように気軽に使おうとすると、スペースなどをいれなければいけないのが面倒なので、計算にはbcコマンドを使用する。

計算が終了したらCtrl+Dでbcコマンドを終了することができる。

```bash
$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
9*3600+11*60+15.50-60
33015.50
```

仕上がりは33015.50秒になるみたい。

Ctrl+Dを押して計算を終了し、以下のコマンドでカット編集。

```bash
ffmpeg -i input_file.mp3 -ss 60 -t 33015.50 output_file.mp3
```


参考: [FFmpegによる動画エンコードの基本](http://blog.asial.co.jp/1315)
FloatingIPを割り当てる時のTips

### 想定する環境
ひと通り標準的な構成はできている
　・外部ネットワーク
　・ルータ
　・VM

### 以下の状態に陥った

割り当てたFloatingIPをそのまま使おうとしても、Horizon上で「ポートがありません」というメッセージしか出ずにポートを選べない状態になる。

### Tips
外部ネットワークに接続されているルータのポートが「ゲートウェイ」になっていないといけない。つまり、ルータと外部ネットワークを接続する際に、普通に接続するのではなく、Horizonであれば、ルータの設定画面から「ゲートウェイの設定」を押下することで接続しなければならない。
ゲートウェイを持つルータに接続しているVMでなければ、フローティングIPが割り当てられないということ。

### 参考
Unable to associate floating IPs - RDO https://openstack.redhat.com/forum/discussion/255/unable-to-associate-floating-ips/p1
Xcode6にコード整形プラグインを導入

## はじめに

最近の悩み
「`-(void)`にスペースを挟んだり挟まなかったりで安定しない」

ので、こちらを導入させていただきましたー
[BBUncrustifyPlugin-Xcode](https://github.com/benoitsan/BBUncrustifyPlugin-Xcode)

## インストール

おもむろに

```bash
curl -SL https://raw.githubusercontent.com/benoitsan/BBUncrustifyPlugin-Xcode/master/install.sh | sh
```

を叩いて、Xcodeを再起動するだけ


## 使用法

Xcodeのメニュー `Edit -> Format Code` から、必要なものを選ぶだけ

## おわりに

無事 `- (void)` になりました
めでたしめでたし
iOSの実機テストでwindowサイズが合わないときに試して欲しいこと


記事が見つからなくてだだハマったので共有します！

## 現象
わたしの場合、iPhone5で実機テストをしているのにiPhone4(4S?)のwindowサイズで表示されてしまうという現象が起きました。
![IMG_4919.PNG](https://qiita-image-store.s3.amazonaws.com/0/53303/70b3e4fd-cb78-e24f-84cc-575c4d47ddb7.png "IMG_4919.PNG")\
※AutoLayoutが崩れているのは置いといてくださいね 笑

実機で・・誤認識してる？？？そんなことあるのか？？


## 解決法

結論、「Launch Image Source」を設定すると直りました！

プロジェクト選択　→　General →　Launch Image SourceのUse Asset Catalogを選択
![MeetAirport.xcodeproj 2015-01-30 19-44-21.png](https://qiita-image-store.s3.amazonaws.com/0/53303/1092e3cc-33d0-7462-33fa-42443ed97b2c.png "MeetAirport.xcodeproj 2015-01-30 19-44-21.png")

Imageを選択　→　Migrate

こうなればOK
![MeetAirport.xcodeproj 2015-01-30 19-56-16.png](https://qiita-image-store.s3.amazonaws.com/0/53303/c5153f74-c8cd-2cdf-4cde-70e89217dd81.png "MeetAirport.xcodeproj 2015-01-30 19-56-16.png")

もう一度Buildしてみる

![IMG_4920.PNG](https://qiita-image-store.s3.amazonaws.com/0/53303/6e839def-4893-af93-f8d4-86dccbeb1b1f.png "IMG_4920.PNG")

なおったーーー！！！
素材写真変えてレイアウト直さなきゃな・・w


###ちなみに環境
・xcode6.1
・iPhone5 iOS7.1
fluentdとKibanaでRailsのログを簡単に可視化


昨年の秋から，学生プロジェクトで学内向けのRailsアプリを開発しています．
2月からオープンベータで公開されるので，それに向けてログの収集と可視化をしてみました．

環境は下記の通りです．

  - Ubuntu Server 14.04
  - Ruby 2.2.0 & Ruby on Rails 4.2.0
  - td-agent 0.10.58
  - Elasticsearch 1.4.1
  - Kibana 3.1.2

## fluentdのインストール

[fluentd](http://www.fluentd.org/)はOSSなログ収集ツールです．
Rubyで書かれているので，gemでpluginを追加したりします．

今回はRailsアプリを動かすサーバにtd-agentを入れました．
td-agentは，[Treasure Data](http://www.treasuredata.com/)がメンテナンスしているfluentdの安定板です．

[公式のマニュアル](http://docs.fluentd.org/ja/categories/installation)に従って，debパッケージをインストール．
スタートアップに登録して，Elasticsearch用のpluginをインストールします．
(libcurl4-openssh-devを入れないとcurl-configでエラーが出ました．)

```
$ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
$ sudo update-rc.d td-agent defaults
$ sudo apt-get install -y libcurl4-openssl-dev
$ sudo td-agent-gem install fluent-plugin-elasticsearch
```

td-agentの設定は以下のようにしました．
formatでは，ログのステータスコードと応答時間だけを取っています．
(非力なVMでElasticsearchを動かしているため，ログは最小限に．)

```apacheconf:/etc/td-agent/td-agent.conf
<source>
  type tail
  format /^I, \[(?<time>[^\.]+).+\]  INFO -- : Completed (?<status>[^ ]+) .+ in (?<benchmark>[^m]+)ms.*$/
  time_format %Y-%m-%dT%H:%M:%S
  path /path/to/app/log/production.log
  pos_file /tmp/app.log.pos
  tag app.rails.access
</source>

<match *.rails.*>
  type elasticsearch
  host 127.0.0.1
  port 9200
  type_name ruby-on-rails
  include_tag_key true
  tag_key @log_name
  logstash_format true
  logstash_prefix ruby-on-rails
  flush_interval 10s
</match>

```

## Elasticsearchの設定

Elasticsearchは既に[Sensu](http://sensuapp.org)のメトリクス収集に使っています．
追加で設定は必要ないのですが，一応マッピングだけ定義しておきます．

```sh:mapping.sh
curl -XPUT http://127.0.0.1:9200/_template/ruby-on-rails -d '{
  "template": "ruby-on-rails-*",
  "mappings": {
    "_default_": {
      "numeric_detection" : true,
      "properties": {
        "@timestamp": { "type":"date", "format":"dateOptionalTime" },
        "@log_name": {type: "string"},
        "status": {type: "integer"},
        "benchmark": {type: "integer"}
      }
    }
  }
}'
```

## Kibanaの設定

KibanaもSensuのメトリクス可視化のために導入済です．

今回は新しくRails用にダッシュボードを作りました．
コード量が多いので，Gistに上げています

  - [fluentdとKibanaでRailsのログを簡単に可視化](https://gist.github.com/hico-horiuchi/651e9ac5b6f30079d5e9)

![rails_fluentd_kibana.png](https://qiita-image-store.s3.amazonaws.com/0/58742/2c908a13-d1c6-c3b8-e3e2-b58ca1d47d84.png "rails_fluentd_kibana.png")

上のカラムがステータスコードの割合のヒストグラムとパイチャート．
下のカラムが応答時間のヒストグラムです．
シンプルですが，当面はこのくらいの情報量で十分かなと思っています．

## まとめ

fluentdとElasticsearch，Kibanaというオーソドックスな構成で可視化してみました．
一番大変だったのは，fluentdのformatを作るところでしょうか…．
このノウハウは他にも応用が効きそうなので，色々ログ収集と可視化をしてみたいですね．

また，今回は以下の記事を参考にしました．

  - [fluentd から elasticsearch の複数の logstash 形式 index にログを送る為のメモ  - ようへいの日々精進 XP](http://inokara.hateblo.jp/entry/2013/11/30/104023)
[xcode]アーカイブできない（no provisioning profiles with a valid signing identity）

Xcode6.1です。
提出しようと思ったのですが、Code Signing IdentityでDistributionが選べず。

結論だけかきますと、
・iOS Provisioning Profiles (Distribution)を再作成
→出来ず
・iOS Certificates (Production)を再作成
→できた！


誰かのお役に立てれば。
[Ruby chan gem] 数学ガールの秘密ノート第104回の縁取りの実装を格好良くした


数学ガールの秘密ノート第104回の縁取りについて適当に実装しましたが( http://qiita.com/cielavenir/items/2598ecd6d7edb9900cc1 )、フィルタ関数が受け取るものが画像全体であるという制限がありました。
これを、秘密ノートに書いてあるとおり、1行ずつ読ませるようにしたい。

ここで問題になるのが、filter_downです。これは行を1個読み飛ばす処理が必要となります。
RubyのEnumeratorは値を出力することしかできず、単純なFiberだと親と子の間に値を1個しか溜めておくことができません。
その点、Golangのchanは、値を複数溜めておくことが可能です。
chanの「<-」演算子はちょうど秘密ノートに書いてある「送信」「受信」の概念にピッタリあてはまるということもあります。
https://twitter.com/cielavenir/status/561054114960769024
https://twitter.com/hyuki/status/561054600145293312

Golangでごりごり書けたとして、関数型のようにきれいに書ける気がしないので、この機能をRuby上に実装し、chan gemとしてリリースすることにしました。
https://github.com/cielavenir/ruby-chan

これを用いると、数学ガールの秘密ノート第104回の縁取りはこのように格好良く実装できます。
まず最初に、echo/filter_right/filter_left/filter_up/filter_downフィルタに1行ずつデータを送ります。
続いて、全てのフィルタが準備出来ている間、「filter_right/filter_left/filter_up/filter_downから1行ずつ取ってきてビット積を取り、反転して、echoから1行取ってきたものとビット積を取る」処理を行います。

```mathgirls104_chan.rb
#!/usr/bin/ruby
require 'chan'

filter_right=Chan.new{|ch|
	loop{
		ch<<(ch.receive>>1)&0xffff
	}
}
filter_left=Chan.new{|ch|
	loop{
		ch<<(ch.receive<<1)&0xffff
	}
}
filter_up=Chan.new{|ch|
	ch<<0
	loop{
		ch<<ch.receive
	}
}
filter_down=Chan.new{|ch|
	ch.receive
	15.times{
		ch<<ch.receive
	}
	ch<<0
}
echo=Chan.new{|ch|
	loop{
		ch<<ch.receive
	}
}

puts Chan.new{|ch|
	list=[echo,filter_right,filter_left,filter_up,filter_down]
	loop{
		n=ch.receive.to_i(2)
		list.each{|ch|ch<<n}
		while list.all?(&:next?)
			ch<<'%016b'%[echo.receive&([filter_right,filter_left,filter_up,filter_down].map(&:receive).reduce(:&)^0xffff)]
		end
	}
}.gen_enum(DATA.to_enum).to_a

__END__
0000000000000000
0000000000000000
0011111111111100
0011111111111100
0011111111111100
0011100000000000
0011100000000000
0011111111100000
0011111111100000
0011111111100000
0011100000000000
0011100000000000
0011100000000000
0011100000000000
0000000000000000
0000000000000000
```
subversionレポジトリからgitレポジトリに移行する時のAuthorのマッピング

 1. マッピング用のテキストファイルを作成 

例えば、 ~/.svnauthors として、以下のような書式で記述する
```
SVNUSER = GITUSER <GIT MAIL ADDRESS>
gigatune = gigatune <gigatune@localhost.com>
jack = gitJack <jack@localhost.com>
```

 2. マッピングファイルを利用するよう、svn-gitを設定

以下のコマンドを実行
```
$ git config --global svn.authorsfile ~/.svnauthors```
```

 3. subversionレポジトリからgitレポジトリへ変換

通常どおり。

```
$ git svn clone -r 1:xxx svn://svn.host/path/to/repository /path/to/new/git
```

※ subversionのコミットの中に、authorsファイルにエントリーがないユーザーのコミットがある場合は変換が止まるので、適宜追加して変換をし直す。
AWS ElasticBeanstalk で Restart App Server と Rebuild Environmentすると何が起きるか


## 前提

この検証は下記の環境で実験しました。

* 64bit Amazon Linux 2014.03 v1.0.2 running PHP 5.5


## Restart App Server

### 結果

* apacheが再起動される（apacheログから確認）
* サーバーインスタンス自体は再起動しない。(サーバーのuptimeで確認)

### 実行ログ

```
2015-01-30 18:17:22 UTC+0900	 INFO restartAppServer is starting.
2015-01-30 18:17:31 UTC+0900	 INFO Restarted application server on all ec2 instances.
```


## Rebuild Environment

### 結果

* 下記が全部作りなおされた。
	* CloudWatch Alerm
	* EC2 Instance
	* Security Group
	* ELB
	* Auto Scaling group policy

* OptionSettings で設定した、document_rootとか、ELBSubnets とかはそのまま残ってた。
* アプリケーションももちろんzipからインスト−ルされたアプリ−ケーションが残ってた。


### 実行ログ

```
2015-01-30 18:37:19 UTC+0900	INFO	rebuildEnvironment is starting.
2015-01-30 18:37:29 UTC+0900	INFO	Deleted CloudWatch alarm named: awseb-e-xxxx
2015-01-30 18:37:29 UTC+0900	INFO	Deleted CloudWatch alarm named: awseb-e-xxxx
2015-01-30 18:37:32 UTC+0900	INFO	Deleted Auto Scaling group policy named: arn:aws:autoscaling:xxx
2015-01-30 18:37:32 UTC+0900	INFO	Deleted Auto Scaling group policy named: arn:aws:autoscaling:xxx
2015-01-30 18:37:34 UTC+0900	INFO	Waiting for EC2 instances to terminate. This may take a few minutes.
2015-01-30 18:39:57 UTC+0900	INFO	Deleted Auto Scaling group named: awseb-e-xxxx
2015-01-30 18:40:00 UTC+0900	INFO	Deleted Auto Scaling launch configuration named: awseb-e-xxxx
2015-01-30 18:40:01 UTC+0900	INFO	Deleted load balancer named: awseb-e-xxxx
2015-01-30 18:40:04 UTC+0900	INFO	Deleted security group named: sg-xxxx
2015-01-30 18:40:38 UTC+0900	INFO	Deleted security group named: sg-xxxx
2015-01-30 18:41:21 UTC+0900	INFO	Created security group named: sg-xxxx
2015-01-30 18:41:26 UTC+0900	INFO	Created load balancer named: awseb-e-xxxx
2015-01-30 18:41:41 UTC+0900	INFO	Created security group named: sg-xxxx
2015-01-30 18:41:45 UTC+0900	INFO	Created Auto Scaling launch configuration named: awseb-e-xxxx
2015-01-30 18:42:42 UTC+0900	INFO	Created Auto Scaling group named: awseb-xxxx
2015-01-30 18:42:42 UTC+0900	INFO	Waiting for EC2 instances to launch. This may take a few minutes.
2015-01-30 18:42:46 UTC+0900	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:xxxx
2015-01-30 18:42:46 UTC+0900	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:xxxx
2015-01-30 18:42:49 UTC+0900	INFO	Created CloudWatch alarm named: awseb-e-xxxx
2015-01-30 18:42:50 UTC+0900	INFO	Created CloudWatch alarm named: awseb-e-xxxx
2015-01-30 18:49:15 UTC+0900	INFO	Added EC2 instance 'i-xxxx' to Auto Scaling Group 'awseb-xxxx'.
2015-01-30 18:49:28 UTC+0900	INFO	Successfully rebuilt environment: xxxx```
```
cronメモ

**cron起動確認**
```service crond status
```

**cron起動**
```service crond start
```

**cron 実行結果確認**
```tail -f /var/log/cron
```

**設定値**
フィールド　　　　指定する値
分　　　　　　　　0～59
時　　　　　　　　0～23
日　　　　　　　　1～31
月　　　　　　　　1～12　もしくは jan～dec
曜日　　　　　　　0～7 （0と7は日曜日） もしくは sun～sat
実行ユーザ　　　　ユーザID
コマンド　　　　　有効なコマンド（shell,コマンドとか)

**cron実行時間がずれる**
JSTに手動で設定を変えているが、/var/log/cronに出てくる時間がずれているときはcron再起動
```service crond restart
```
これでもダメなときはOS再起動で直りました
実機でテストしたらApp installation failed. The application could not be verified. というエラーが出てしまった時

iPhoneをiOS 8.1.3にアップデートしたら、先日まで実機でRunできていたのに、以下のエラーメッセージが出て実機へのインストールが止まってしまい、テストができなくなってしまいました。
（シュミレーター上ではアプリを起動できる。）

App Installation Failed
The application could not be verified

![スクリーンショット 2015-01-30 19.17.09.png](https://qiita-image-store.s3.amazonaws.com/0/6688/8cf4b920-58ce-67ee-1ddb-975c9c70b08a.png)

解決はとても簡単です。
既にインストールされているアプリを消してからもう一度実行してみてください。
実機でテストできるようになるはずです。

参照元
http://stackoverflow.com/questions/28231338/ios-app-the-application-could-not-be-verified-only-on-one-device
[Grails]BootStrapに色々詰め込み過ぎるとコンパイル、実行できなくなる

特に他愛のない話なのですが、こんなエラーがあったのか。。。と衝撃を受けたのでメモとして。
開発段階で非常に重宝するBootStrap.groovy。

BootStrap.groovyは大体以下のようなコードになります。

```groovy:BootStrap.groovy
class BootStrap {
    def init = { servletContext ->
        environments {
            /**
             * ここに色々初期処理を書く
             */
        } 
    }
}
```

このenvironmentsクロージャの中に大体500行以上初期データの登録処理を書いていたら、grailsのcompileを実行した時に以下のようなエラーメッセージが表示されました。

```
| Error Compilation error: startup failed:
General error during class generation: Method code too large!

java.lang.RuntimeException: Method code too large!


...凄く長いStacktrace...

1 error
| Error Error running script compile: org.codehaus.groovy.grails.cli.ScriptExitException (Use --stacktrace to see the full trace)
```

エラーメッセージを見れば一目瞭然ですが、単純に一つのメソッドの中が長すぎる！って怒られているだけです。
実際の所そんなに長くないんだけど。。。と思うのですが、GroovyとかGrailsが裏で大量にコードを生成しているのかな？という感じです。

ちなみに、行数ではなくて実際のところはひとつのメソッドの中はコードの長さが64kbまでとJVM的に決まっているそうです。

[http://stackoverflow.com/questions/24256316/method-code-too-large-in-groovy-grails](http://stackoverflow.com/questions/24256316/method-code-too-large-in-groovy-grails)
[http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9.1](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9.1)

このエラーが発生した場合は、BootStrap.groovyの中にstaticメソッドを作ってその中に処理を書いて、メインのメソッド（クロージャ）の中ではそのstaticメソッドを呼び出すようにすればOKです。
シェルスクプリトで実際に使用した条件式

1.
>
if [ $# -ne 1 ]; then
　処理
else 
　処理
fi

$# : 引数の数
-ne : 等しくない

***→ if [$# -ne 1] 引数が1つでない場合***


2.
>
if [ -e $test_char ]; then
　処理
fi

-e [ファイル名] : ファイルが存在していたら
→　***if [ -e $test_char ]; then　($test_charが存在していたらif以下の処理)***
過去のマイグレーションファイルを元に新しいのを作るときに使うやっつけスクリプト

マイグレーションファイルを新しく作る際、よく既存のファイルからコピーする、という（恐らくあまりよくない）習慣があるため、コピーしてからコピー前のファイルに書かれたクラス名を書き換えるところまで自動化するスクリプトを書いてみました。

```rb
#!/bin/env ruby

$VERBOSE = true

=begin
# 使用例

cp-migration db/migrate/20150123456789_source_migration_file.rb destination_migration_file

# このスクリプトがやること

1. 第一引数で指定したマイグレーションファイルを、第二引数で指定した名前からマイグレーションファイル向けの名前に変換しつつコピー。
  上記の場合「db/migrate/20150123456789_destination_migration_file.rb」という名前でコピーする。
2. コピー後のファイルの「class SourceMigrationFile」と書かれた部分を「class DestinationMigrationFile」に置き換える。
=end

require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/time/conversions'

source_path = ARGV.shift
destination_name = ARGV.shift

destination_class_name = destination_name.camelcase
destination_path = "#{File.dirname(source_path)}/#{Time.now.to_formatted_s(:number)}_#{destination_name}.rb"

fail "#{destination_path} already exists!" if File.exist? destination_path

source_class_name = File.basename(source_path, '.rb').sub(/\d+_/, '').camelcase

destination_content = File.read(source_path).sub(/\bclass\s+#{source_class_name}\b/, "class #{destination_class_name}")

File.write(destination_path, destination_content)
```
マテリアルデザインについてのざっくりまとめ ～Components編その1～

[Material design](http://www.google.com/design/spec/material-design)のガイドをざっくり読んだのでざっくりまとめます。

[マテリアルデザインについてのざっくりまとめ ～Components編その2～](http://qiita.com/hishida/items/ca67dd190c20c0d9cb2d)
[マテリアルデザインについてのざっくりまとめ ～Components編その3～](http://qiita.com/hishida/items/7427de0f33bca2219078)
[マテリアルデザインについてのざっくりまとめ ～Components編その4～](http://qiita.com/hishida/items/fa1d9559c76d9030e341)

この記事では[Components](http://www.google.com/design/spec/components)の Bottom sheets ～ Dialogs についてまとめます。

# Bottom sheets
* 画面の下から出てくるシート。
* 3つ以上の説明不要なアクションを並べる場合に適している（これ以外はメニューやダイアログを検討すべき）
* 他のアプリに関連する動作に使用することも可能（例：共有・コピー、撮影など）

# Buttons
* Floating action button
    * その画面でのメインのアクションをするための丸いボタン。
* Raised button
    * 四角の枠に囲まれた一般的なボタン。
    * 文中など、Flat buttonにするとボタンであることがわかりにくい場合にはRaised buttonを使用すべき
* Flat button
    * 枠なしでテキストのみのボタン。
    * ダイアログやフッターなど、固定レイアウトではRaised buttonではなくFlat buttonを使用すべき

# Cards
* 異なる種類のものから構成されるもの、異なる種類のものを並べる場合、複数の操作を持つもの、変化しやすい値を表示する場合などに使用する。（同種のものを並べる場合はリストやグリッドでの表示でOK）

# Chips
* カレンダーや連絡先選択など、簡易な情報を表示する場合に使用する。

# Dialogs
* Alerts
    * 操作時に確認を求める場合などに使用する。
    * Yes/No などの選択肢ではなく、Delete/Cancel など、その後どのような動作をするかがわかるような文言にするのがよい。
    * タイトル付きAlertの場合は、タイトルで明示的な問いをすべき。（「Are you sure?」等はよくない）
* Simple menus
    * リスト内の項目の選択肢を表示して選択させる場合などに使用する。
    * Simple Dialogでも同じようなことができるが、Simple Menu のほうがユーザーの混乱が少ないので好まれる。
* Simple dialogs
    * 選択肢を表示する場合などに使用する。
    * 選択肢のリスト以外にボタンは持たない。
* Confirmation dialogs
    * 入力・選択に確認が必要な場合に使用する。
    * 確認して進むボタンと、明示的にキャンセルボタンを配置すべき。
* Full-screen dialogs
    * 複数の項目を設定する場合などに使用する。
    * 操作の確認には明示的に動作を表す文言（「Save」「Send」など）にすべき。
    * ダイアログ左上のアイコンが矢印（←）の場合はタップ時に保存され（この場合はSaveなどのボタンは不要）、×の場合は破棄されることを意味する。
AppleWatchアプリでコードから画面遷移する方法

AppleWatch向けアプリでセグエを使わずにコードからInterfaceを遷移させる方法．

#1.StoryBoardに遷移先のInterface Controllerを用意

![スクリーンショット 2015-01-30 17.47.13.png](https://qiita-image-store.s3.amazonaws.com/0/63516/dd79d29b-0186-e027-2432-94642c435f26.png)

分かりやすい様にLabelでinterface2と書いておく．

#2.用意したInterface ControllerのIdentiferを設定
![スクリーンショット 2015-01-30 17.48.20.png](https://qiita-image-store.s3.amazonaws.com/0/63516/844468da-6393-1838-530a-525a8b2d8cc6.png)
今回は「Interface2」とする．

#3.呼出したい所で
- pushの場合 
- 
```swift:InterfaceController.swift
pushControllerWithName("Interface ControllerのIdentifer", context: nil)
```
- modalの場合
-
```swift:InterfaceController.swift
presentControllerWithName("Interface ControllerのIdentifer", context: nil)
```

でセグエを使わず画面遷移可能．

#参考
https://developer.apple.com/library/prerelease/ios/documentation/WatchKit/Reference/WKInterfaceController_class/index.html

#コード
https://github.com/gladenjoy/changeInterface
【PHP】数値を位取り（上数）して返す関数

#はじめに

初心者が書いたコードですので、ご指摘やアドバイス等頂けると嬉しいです。

#やりたいこと

「10000、100000000、10000000000000」などの数値を「1万、1億、1兆」と位取りして返す関数をつくりたい。
※10000倍毎に位取りが変わるものを「上数」と呼ぶそうです。
参考：[命数法 - Wikipedia](http://ja.wikipedia.org/wiki/%E5%91%BD%E6%95%B0%E6%B3%95)

|数値|位|
|:--|:--|
|1|1|
|10|10|
|100|100|
|1,000|1000|
|10,000|1万|
|100,000|10万|
|1,000,000|100万|
|10,000,000|1000万|
|100,000,000|1億|
|1,000,000,000|10億|
|10,000,000,000|100億|
|100,000,000,000|1000億|
|1,000,000,000,000|1兆|
|10,000,000,000,000|10兆|
|100,000,000,000,000|100兆|
|1,000,000,000,000,000|1000兆|

#コード

ググりながら書いたコードです。
考えつくバリデーションをしております。

##最初に書いたコード

```php
<?php
header('Content-Type: text/html; charset=UTF-8');
/*
数値を位取り（上数）して返す関数
*/
function convert_number_unit($var) {

	//変数が定義されているかチェック
	if(isset($var)) {

		//半角に変換
		$var = mb_convert_kana($var,'n','UTF-8');

		//前後のスペースを削除
		$var = trim($var);

		//数値のみ抽出
		$var = preg_replace('/[^0-9]/', '', $var);

		//数字か数値文字列かチェック
		if(is_numeric($var)) {

			//文字数をカウント
			$count = mb_strlen($var,'UTF-8');

			//文字数がx個ならyで割って単位を付ける
			if($count <= 4) {
				echo $var;
			} elseif ($count <= 8) {
				echo $var / 10000 . '万';
			} elseif ($count <= 12) {
				echo $var / 100000000 . '億';
			} elseif ($count <= 16) {
				echo $var / 1000000000000 . '兆';
			} else {
				die('1000兆以内で入力してください');
			}

		} else {
			die('整数を入力してください');
		}

	} else {
		die('数字を入力してください');
	}

}

$hoge = '105240000あいえう,.、0000';
convert_number_unit($hoge);　//実行結果　1.0524兆
```

##書き直したコード

```php
<?php
header('Content-Type: text/html; charset=UTF-8');
/*
数値を単位に変換する関数
*/
function convert_number_unit($var) {

    //半角に変換
    $var = mb_convert_kana($var,'n','UTF-8');

    //数値のみ抽出
    $var = preg_replace('/[^0-9]/', '', $var);

    //数字か数値文字列かチェック
    if (!is_numeric($var)) {
        die('整数を入力してください');
    }

    //文字数をカウント
    $count = strlen($var);

    //文字数がx個ならyで割って単位を付ける
    if($count <= 4) {
        echo $var;
    } elseif ($count <= 8) {
        echo $var / 10000 . '万';
    } elseif ($count <= 12) {
        echo $var / 100000000 . '億';
    } elseif ($count <= 16) {
        echo $var / 1000000000000 . '兆';
    } else {
        die('1000兆以内で入力してください');
    }

}

$hoge = '105240000あいえう,.、0000';
convert_number_unit($hoge);
```
git でどすこいする方法

社内で、`git push` って相撲の突き出しみたいだよね、という話が出たので、そういうエイリアスを書けば良いじゃんと言う流れになった。


```bash
export remote='origin'
alias dosukoi='git push ${remote} `git rev-parse --abbrev-ref HEAD`'
```
↑のを、.bashrc に書いて

```bash
source ~/.bashrc
```
すると、

    $ dosukoi
    Counting objects: 3, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 324 bytes | 0 bytes/s, done.
    Total 3 (delta 2), reused 0 (delta 0)
    To git@hogehogehost:fuga/tsukareta.git
     * [new branch]      feature/hoge -> feature/hoge

どすこいできる！！！！
（なお、私自身は動作未検証です）

他のリモートホストにpushするときは、

```bash
export remote=nanika;dosukoi
```

どすこいできる！！！！
（なお、動作未検証です。あと、originに戻すときは、さきにexportしてね）

ノリだけで乗り切りたい。
突っ込み待ちです。
XML検証結果の「文字[children]を使用できません」

# 現象

web.xmlを検証したときに以下のエラーが出る。

```
cvc-complex-type.2.3: タイプのコンテンツ・タイプが要素のみであるため、要素'***'には文字[children]を使用できません。
```

「***」には要素名が入ります。自分の場合はlogin-configでした。

# 解決

全角スペースが入ってました。
一般に、テキストを置くべきでない場所にテキストがあるときにこのエラーが出るようです。

10分くらい悩みました  :tired_face:
ListDialogで条件分岐でボタンを切り替える場合

ListDialogで複数のボタンをつける場合は、ListDialogを使いますが１つ目のボタンは条件によってはつける…つけない、２つ目は…とやっていくとOnItemClickでwhichの値を足したり引いたりして忙しくなります。
そこで、条件によってボタンが激しく入れ替わる場合はArrayAdapterにボタンクラスを入れてAlertDialogで出してあげます。

```java

ArrayList<CommandObject> arrayList = new ArrayList<CommandObject>();
        arrayList.add(new CommandObject("動作A",Command.A));
        arrayList.add(new CommandObject("動作B",Command.B));
        arrayList.add(new CommandObject("動作C",Command.C));
        final AlertAdapter adapter = new AlertAdapter(getActivity(), android.R.layout.simple_list_item_1,(CommandObject[])arrayList.toArray(new CommandObject[0]));
        AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
        alert.setAdapter(adapter,new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                CommandObject object = adapter.getItem(which);
                action(object.getCommand());
            }
        });
        alert.show();
```

CommandObjectにはenumで定義したコマンドの管理変数、ボタン名を入れます。
それをArrayAdapterで管理させ、クリック時にクリックされた部分のCommandObjectからコマンドの管理変数を取得、実行させます。


```java
private void action(NFZCommand command){
        switch (command){
            case A:
                Log.d("debug","A");
                break;
            case B:
                Log.d("debug","B");
                break;
            case C:
                Log.d("debug","C");
                break;
            default:
                break;
        }
    }

```

こうすれば、ArrayListの順番によらずボタンを押した際の動作が保証されます。
【php】標準入力を使った競技プログラミングの問題をローカル環境で解く方法

環境
Eclipse Standard/SDK Version: Kepler Service Release 2
XAMPP 5.6.3-0
OSX Yosemite10.10
MacBook Pro(Retina, 13-inch, Mid2014)

#対象

* phpで競技プログラミングをやってみたいが、
* コマンドプロンプト、ターミナルには苦手意識があり、
* STDIN, 標準入力と言われてもよくわからない人



#与えられる標準入力
例として、yukicoderというサイトの問題文にはこのように書かれています。
問題全体はこちらにあります。
[yukicoder No.135 とりあえず1次元の問題](http://yukicoder.me/problems/135)
※全文掲載して良いかわからなかったので、リンクにしています。

```php:入力
N
X1 X2 … XN
```

```php:入力は全て整数で与えられる
・1≤N≤100000=10^5
・0≤Xi≤1000000=10^6,1≤i≤N
```

```php:入力例１
3
0 51 100
```

```php:入力例2
4
0 1 1 0
```

入力例に対する出力もあるので、それを参考に解いていきます。

#ローカル環境で確認しながら解く
###1.テキストファイルを作成
file.textを作成し、そこに上記の入力例をコピー。
###2.fopenでファイル読み込み
テキストファイルと同じ階層にあるphpファイルに以下を記入。

```php:phpファイル
$filename = "file.text";
$fh = fopen($filename, "r");
$stdinArr = array();

if ($fh) {
	while (!feof($fh)) {
		$stdinLine = fgets($fh);  //一行ごとに内容を取得
		$stdinArr[] = $stdinLine;　　　//配列に格納
	}
	fclose($fh);
}
```

###3.配列に格納された値を利用
　これで、`$stdinArr`に与えられた入力の行数分だけ内容が入ったので、これを使って問題を解いていきます。
　必要に応じてfile.textの中身を変更し、どんな入力値でも求める答えが出せているか確認します。

#参考サイト
競技プログラミングの練習サイト：[yukicoder](http://yukicoder.me/)
fscanf関数を使った例を掲載:
[[競技プログラミング][PHP][AtCoder]おとぎの国の高橋君](http://wada811.blogspot.com/2012/10/phpatcoder_28.html)
paizaの取得例：[値取得・出力サンプルコード](http://paiza.jp/guide/samplecode.html)
fopen関数を使った例を掲載：[ファイルの中身を1行ずつテキスト処理するには](http://hydrocul.github.io/wiki/programming_languages_diff/io/each-line.html)
[]()
[]()



#その他
##上記の問題の解答例と疑問点

```php:提出し、アクセプトされたコード
<php?
$num = trim(fgets(STDIN));
$points = trim(fgets(STDIN));

$arr1 = explode(" ", $points);	//半角スペース区切りの要素を格納
sort($arr1);	//昇順に並び替え
$arr2 = array_unique($arr1, SORT_NUMERIC);	//値の重複を削除
$arr2 = array_merge($arr2);		//重複してとびとびになったインデックスを振り直す

$arr3 = array();
if(count($arr2)  == 1){
	$ans = 0;
}else{
	for($i = 1; $i < count($arr2); $i++){
		$arr3[] = $arr2[$i] - $arr2[($i-1)];

	}
	$ans = min($arr3);
}
echo $ans;
```
ローカルで`echo`と`print_r`、`var_dump`を駆使しつつ、なんどもテキストファイルに様々な値を書いてみて、ようやくアクセプトされました。
一つ、疑問が残っています。
以下だとOKだったのですが、

```php:OK
$num = trim(fgets(STDIN));
$points = trim(fgets(STDIN));
```

これだと間違いとなってしまいました。

```php:NG
fscanf(STDIN, '%d', $num);	
fscanf(STDIN, '%s', $points);	
```

2行目の書き方に問題がありそうですが、原因がわかりません。
わかる方、教えていただけると嬉しいです。
また、yukicoderでは、他の方の解答例も見られるのですが、No.135に関して、まだphpで書かれたコードがありません。ぜひ、違う書き方、考え方でコードがかけたら教えて下さい。

##なぜこれが必要になったか。
　つい最近競技プログラミングというものを知り、競技アルゴリズム勉強会なるものに参加してみました。まるで数学の問題を解いているようで、久しぶりに数学的な頭をつかい、心地良い疲労感を得ることができました。
　そのときに、標準入力で与えられる数値を使わなくてはならなかったのですが、これがさっぱりわかりませんでした。ペアプログラミングであり、主催者にも質問できる環境だったため、「こう書けばいいよ」ということだけ教わり問題を解きました。
　家に帰って別の問題に挑戦しましたが、WA（Wrong Answer）の連続。そもそも、入力値を適切にとれていない可能性があります。そこで、簡単にローカル環境で（入力値）テストケースを変化させ、確認しながらコードをかける方法を考えました。

最後までお読み下さりありがとうございました。
MySQLでインデックスを貼っていない日付フィールド(created_atなど)を高速検索する方法

テーブルに行の作成日時フィールドを作成することがありますが、インデックスを貼っていない場合、日付検索に非常に時間がかかります。(Ruby on Railsなど)

このような場合、二分探索を行うことで高速に検索できます。
(日付に限らず、Primary Keyなどインデックスを貼ってある項目と同じ順序の項目で使えます)

MySQLの場合、以下のようにbsearch_create_at プロシージャを作成、利用できます。

https://paiza.io/projects/Lx9YQRynsffK38B9SU3vSg
(ブラウザ上で実行できます。)

[![スクリーンショット 2015-01-30 午後4.44.39.png](https://qiita-image-store.s3.amazonaws.com/0/9152/2a3dac6c-4877-88fd-9711-13d2f4cdc3ff.png)](https://paiza.io/projects/Lx9YQRynsffK38B9SU3vSg)
AWS Elastic BeanstalkでELBを使う時、Nginxでアクセス制限をかける



Ruby(Puma)を使う場合の話。SingleならSGでいいんだけど。


- 環境ごとに許可対象を管理したい。
- 許可対象の変更でアプリごとデプロイは嫌。
- 許可対象の追加削除は自動で適用してほしい。

サンプルのSinatraアプリはこちら。 [https://github.com/ZCloud-Firstserver/eb_nginxBrockRubyviaELB](https://github.com/ZCloud-Firstserver/eb_nginxBrockRubyviaELB)


## ELB x Nginx

周知のとおりELBは一般的なLBと同様に`X-Forwarded-For`にクライアントのIPを入れてきます。
なのでnginxにはこんな感じで設定しておけば接続元で`allow/deny`をつかえます。

```
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
allow xxx.xxx.xxx.xxx/32;
deny all;
```

## Hookに仕込む

環境ごとに値を変えたいので、`ALLOW_HOSTS`なる変数をEBに置いて、カンマ区切りで許可対象を与えられるようにします。
Ruby(Puma)環境のNginxは`/etc/nginx/conf.d/*.conf`を読むようになっているので、ポリシーはそこに設置しましょう。

`Configration`を変更したら適用してほしいので、Hookは`configdeploy::enact`にしてみます。アクセスポリシーファイルの生成とNginxのリロードを設置。
インスタンスの追加や環境のリビルド時やにも有効にするため、`postinit`にも同じものを置いときます。


```yaml:.ebextensions/01_nginx_access.config
---
files:
  "/opt/elasticbeanstalk/hooks/configdeploy/enact/10_nginx_access.rb":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env ruby

      require '/opt/elasticbeanstalk/support/get_envvars'
      require 'erb'

      envs = get_env_vars

      erb = ERB.new(DATA.read, nil, '-')
      File.open("/etc/nginx/conf.d/access.conf", "w") do |file|
        file.puts(erb.result(binding))
      end


      __END__
      set_real_ip_from 0.0.0.0/0;
      real_ip_header X-Forwarded-For;
      <% envs['ALLOW_HOSTS'].split(',').each do |host| -%>
      allow <%= host -%>;
      <% end if envs['ALLOW_HOSTS'] -%>
      deny all;
  "/opt/elasticbeanstalk/hooks/configdeploy/enact/11_nginx_reload.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash

      set -xe
      service nginx reload \|\| service nginx start
  "/opt/elasticbeanstalk/hooks/postinit/10_nginx_access.rb":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env ruby

      require '/opt/elasticbeanstalk/support/get_envvars'
      require 'erb'

      envs = get_env_vars

      erb = ERB.new(DATA.read, nil, '-')
      File.open("/etc/nginx/conf.d/access.conf", "w") do |file|
        file.puts(erb.result(binding))
      end


      __END__
      set_real_ip_from 0.0.0.0/0;
      real_ip_header X-Forwarded-For;
      <% envs['ALLOW_HOSTS'].split(',').each do |host| -%>
      allow <%= host -%>;
      <% end if envs['ALLOW_HOSTS'] -%>
      deny all;
  "/opt/elasticbeanstalk/hooks/postinit/11_nginx_reload.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash

      set -xe
      service nginx reload \|\| service nginx start
```

## eb setenvでアクセスポリシー操作


configdeployのフックが無事設置できれば、あとはWebからでも`eb`からでも、ALLOW_HOSTSを適当に変更すればOK.

```
$ eb setenv ALLOW_HOSTS="xxx.xx.xxx.xxx/32,xxx.xxx.xxx.xxx/28" -e YOUR_ENV_NAME
```

![allow_hosts.png](https://qiita-image-store.s3.amazonaws.com/0/7454/246b3c30-8313-e3ee-3fdd-a24be965e9b0.png "allow_hosts.png")

↑Configureに許可リスト。

↓ELB配下へのRubyアプリへのアクセス。

![nginx_403.png](https://qiita-image-store.s3.amazonaws.com/0/7454/2afc515d-82b7-d1d1-9736-2faaae952e08.png "nginx_403.png")
vimで開いているファイルをそのまま実行する。


```vim
:!ruby %
```

とか、コマンドを打つ事によって普段からrubyを書いている様に見せかけることが出来る。

コマンド打つのが面倒なので….vimrcに。

```vim
au FileType javascript map <F4>  :!node %<CR>
```

とか記述しておくと **F4** を押す度にjavascriptが実行される。

auはvimを開いた直後に実行してくださいっていうこと。
F4に`:!node %<CR>` がマッピングされる。
F4のところは自分の好きなショートカットに置き換えればいい。

##なんでもかんでも **F4** で実行。

```
au FileType vim map <F4>  :source %<CR>
au FileType perl map <F4>  :!perl %<CR>
au FileType javascript map <F4>  :!node %<CR>
au FileType ruby map <F4>  :!ruby %<CR>
au FileType sh map <F4>  :!sh %<CR>
```

開いているファイルを判別して実行してくれる。
Three.jsのshader, postprocessがうまく効いていないとき


postprocessを実行しているはずなのに、上手く効いていない場合 (かなり解像度が荒れてしまう時)は、
原因としてrendererが正しくsetSizeされていない可能性がある。
また、rendererをHTML上にappendする前にsetSizeをしておくのが吉。


canvasの場合もそうだけど、APIが思うような動作をしていないときはsize指定を疑うのがよさげ。
SVGで作成したショートアニメーション（５）

SVGで作成したループアニメーションです。
[9va-pi](http://www.d1.dion.ne.jp/~danjiro/9va/pijp.html)
という、Ubuntu/Linux Mint/Raspberry Pi 用のアニメーションソフトで出力しました。IE以外のブラウザで動きます。

<p data-height="487" data-theme-id="11538" data-slug-hash="MYoGWd" data-default-tab="result" data-user="danjiro" class='codepen'>See the Pen <a href='http://codepen.io/danjiro/pen/MYoGWd/'>Komori's SVG Animation "Island05"</a> by Danjiro Daiwa (<a href='http://codepen.io/danjiro'>@danjiro</a>) on <a href='http://codepen.io'>CodePen</a>.</p>
<script async src="//assets.codepen.io/assets/embed/ei.js"></script>
RubyからロケタッチのAPIを利用して住所を正規化する方法

漢字交じりの住所をある一定のルールで揃えたいときありますよね。
そんな時は、ロケタッチの住所正規化APIが便利です。

## APIの使い方

address引数の値を利用して、結果がJSONで返ります。

```
https://api.loctouch.com/v1/geo/address_normalize?address=[正規化処理したい住所]
```

| query                   | 入力データ                                   |
|-------------------------|----------------------------------------------|
| result.address          | 正規化後の住所                               |
| result.resion_id        | JSI X 0402 に定められた市区町村コード        |
| result.zip              | 郵便番号                                     |
| result.normalize.region | 都道府県、郡、市区町村                       |
| result.normalize.number | 住所の数字部分(一部の住所では数字以外も入る) |
| result.normalize.build  | ビル名部分                                   |
| is_error                | 正規化失敗した場合は 1 を返す                |

より詳しい情報はこちら
http://tou.ch/developer/api_all?uri=geo%2Faddress_normalize

## 実装サンプル

今回は手軽に使えるHTTPクライアント、[Faraday](https://github.com/lostisland/faraday)を使います。

```rb
require "faraday"
require "json"
require "pp"

address = "東京都渋谷区渋谷二丁目21番地-1"
res = Faraday.new(:url => "https://api.loctouch.com").get("/v1/geo/address_normalize", {address: address})
body = JSON.parse(res.body)
pp body
```

実行すると、このように結果を取得できます。

```js
$ ruby address_normalizer.rb
{"is_error"=>0,
 "query"=>"東京都渋谷区渋谷二丁目21番地-1",
 "code"=>200,
 "result"=>
  {"zip"=>"1500002",
   "region_id"=>"13113",
   "normalize"=>
    {"number"=>"2-21-1", "region"=>"東京都渋谷区", "town"=>"渋谷", "build"=>""},
   "address"=>"東京都渋谷区渋谷2-21-1"}}
```

便利ですね！

## おまけ

次のように、curlコマンドとjqコマンドをセットで利用しても便利です。

```bash
$ curl -s "https://api.loctouch.com/v1/geo/address_normalize?address=東京都渋谷区渋谷二丁目21番地-1" | jq '.result'
{
  "zip": "1500002",
  "region_id": "13113",
  "normalize": {
    "number": "2-21-1",
    "region": "東京都渋谷区",
    "town": "渋谷",
    "build": ""
  },
  "address": "東京都渋谷区渋谷2-21-1"
}

$ curl -s "https://api.loctouch.com/v1/geo/address_normalize?address=東京都渋谷区渋谷二丁目21番地-1" | jq '.result.address'
"東京都渋谷区渋谷2-21-1"
```

## 併せて読みたい

* livedoor Techブログ : 住所正規化APIをロケタッチでリリースしたよ！<br>
http://blog.livedoor.jp/techblog/archives/67363033.html
チャットワークをMacのアプリとして動かしてみる

今回はChatworkをMacのアプリとして動かす方法をご紹介します。

アプリ化しておくと、

* ブラウザで常に開いておく必要が無い
* アプリの切り替えがショートカットだけで出来るのでマウスを使う必要が無くなる

のようなメリットがあるので便利です。

## Fluid
FluidはWebサイトのURLから、Webサービスをアプリ化してくれるサービスです。
Mac app Storeからだと有料ですが、Webサイトには無料版が提供されているので、そちらを利用します。

http://fluidapp.com/

## 

起動すると、以下の画面が表示されます。

![Fluid_と_新規作成_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/33823/494bf65d-1b96-a5ee-1b37-ce9b72adfa13.png)

それぞれ次の項目を入力したら、[Create]をクリックします。

```
WebサイトのURL: https://www.chatwork.com
アプリケーション名: Chatwork
Location: Applications
Icon: Use Website Favicon(デフォルトのまま)
```

すると、DockにChatworkのアイコンが表示されます。

![新規作成_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/33823/c65c242f-2815-381f-6a13-f1dc6a4e6a8e.png)

これを起動すると、ログイン画面が表示されるのでWeb版と同様の方法でログインしてください。

![チャットワーク_と_新規作成_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/33823/de0b0f69-7e4a-b060-c41e-39ac4ea5fd2d.png)

ログインすると、Web版のようにチャットワークを使うことが出来るようになります。

同じようにMac版のアプリが用意されていないWebサービスをアプリ化することが出来るようになるので、
ぜひ活用してみてください。