OmniAICreator/Qiita-1.07M huggingface dataset:
日付処理


IE8以前は "2013-05-07T17:33:56+09:00" こういうの解釈できない。
Dateオブジェクトは扱いにくい。

```javascript:a.js
function date_format(ds) {
  date = new Date(ds);
  if (isNaN(date)){
    ds = ds.replace('T', ' '); // 'T' を半角スペースで置換
    ds = ds.replace('.000Z', ''); // '.000Z' を削除 
    ds = ds.replace(/-/g, '/'); // 全ての '-' を '/' で置換 
    ds = ds.replace(/\+.*/g, ' '); // 全ての '-' を '/' で置換
    date = new Date(ds);
  }
  if (!date) return '';
  return '' + date.getFullYear() + '年' + ('00' + (date.getMonth() + 1)).slice(-2) + '月' + ('00' + date.getDate()).slice(-2) + '>日';
}

date_format("2013-05-07T17:33:56+09:00"); // 2013年5月7日
```
Rails3.2 Asset Pipelineが詰まった時の事例集


## productionで、** isn't precompiled

このエラーを見かけたら、

``` log/production.log
ActionView::Template::Error (application.css isn't precompiled):
```

まずは precompile してみる。**再起動**を忘れずに！

    $ rake assets:precompile
    $ touch tmp/restar.txt

## precompile 面倒くさい...

または、それでもやっぱり ** isn't precompiled になる場合。最適化の恩恵受けられないけど、仕方なくアセットを随時生成するという手も。

```ruby:config/environments/production.rb
- config.assets.compile = false
+ config.assets.compile = true
```

false だと、コンパイル済みファイルが見つからない場合にエラーになります。true にすると自動的に生成してくれます。

もちろんその分遅くなります。

## application.jsに書いた関数が反映されない？

コンパイルされたjsのコード内にはapplication.js内のコードが書かれているにも関わらず、実行されない。

原因はちゃんと調べてませんが、別のファイル(hoge.jsなど)に書いてrequireするようにしたらOK。

application.jsのコメントにも書いてますが、application.jsにはコード書かない方が良いみたいです。



## vendor/assets や lib/assets が読み込まれない

application.js で require してないかも

???

libのファイルは普通に読めるけど
vendorのファイルは require すらされない。
？？？？


ベンダーライブラリは

``` ruby:config/environments/production.rb
config.assets.precompile += %w( some_lib.js )
```

config.assets.precompile += %w( *.js )」って書ける？


## developmentで、jsが二重に読み込まれる

`rm -rf public/assets/*`

消して、再起動したらOKだった気がする。

http://d.hatena.ne.jp/inouetakuya/20120630/1341055121

## developmentで、public配下のファイルが "no route matches" になる

serve_static_assets を false にしてしまったからかも。

``` ruby:config/environments/development.rb 
# Disable Rails's static asset server (Apache or nginx will already do this)
serve_static_assets = false
```

コメントに書いてある通り Apache か nginx なら false にすべき。そうでないなら既定の true にすべきだろう。


## asset pipelineのログを黙らせる

http://blog.yabasoft.biz/archives/3905

rails3.2の場合

``` ruby:config/initializers/quiet_assets.rb
Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end
```
socket.io


## socket.io-client


``` javascript:event.js
listeners(name)
removeAllListeners()
removeListener(name, fn)
addListener(name, fn) = on(name, fn)
once(name, fn)
emit()
```


## Room

https://github.com/LearnBoost/socket.io/wiki/Rooms

Roomsを使えばクライアントを切り分けることができる。

server側でjoin/leave

``` javascript:
socket.join('room')
socket.leave('room')
```

disconnect中にleaveする必要はない。自動的に発生して、空のルームは自動的に消滅する。

emitするには２通りの方法がある。`broadcast` か `in`
broadcastするとemitを行ったソケット以外の、指定のルームに属するクライアントに送る。

``` javascript:
socket.broadcast.to('room').emit('event_name', data)
```

ルームを指定しなかったら、emitしたソケット以外の全クライアントに送る

``` javascript:
socket.broadcast.emit('event_name', data)
```

指定のルームに属するクライアントに送る

``` javascript:
io.sockets.in('room').emit('event_name', data)
```
    
全クライアントに送る

``` javascript:
io.sockets.emit('event_name', data)
```

指定のネームスペースとルームにイベントを送る

``` javascript:
io.of('namespace').in('room').emit('event_name', data)
```

全てのルームを取得

``` javascript:
io.sockets.manager.rooms
```

room name は 先頭に / 文字が付く。内部的に使われるだけなのでjoin/leaveで使う必要はない

ルームに属するクライアントの一覧

``` javascript:
io.sockets.clients('room')
```

ルームに属するクライアントの一覧、ネームスペースも指定する場合

``` javascript:
io.of('namespace').clients('room')
```

あるクライアントが属するルーム一覧

``` javascript:
io.sockets.manager.roomClients[socket.id]
```
Railsメモ


3.2.x系を使用してます。

# View

### named helperでクエリストリング追加

```
hoge_path(@resource, :unko => 'deru')
# => /hoge?unko=deru
```

### 単数形リソースでform_forした場合に undefined_method

```ruby:routes.rb
resource :user
```
このように単数形リソースにした場合、

```
form_for @user do |f|
```
そのままform_forするとエラー。

> undefined_method 'user_path'

かといって `resource :users` とするのも何か悔しい。


```
form_for @user, :url => user_path do |f|
```

で解決。

http://stackoverflow.com/questions/3736759/ruby-on-rails-singular-resource-and-form-for
https://github.com/rails/rails/issues/1769#issuecomment-9556381

# Controller

### add_to_base は :base になりました

``` ruby:
errors.add :base, "message"
```

### レイアウトを変更する

``` ruby:
def HogeController < ApplicationController
  # fugaアクションだけにする場合
  layout "no_menu", :only => :fuga
end
```

### 例外を補足してエラー用アクションへ

``` ruby:
def HogeController < ApplicationController
  rescue_from ActiveRecord::RecordNotFound, :with => :error_404
  def error_404
    render :template => '/pages/error_404', :status => 404
  end
end
```

### 全リンクにlocale情報をセットする

``` ruby:
class ApplicationController < ActionController::Base
  def default_url_options(options={})
    # jaの場合は省略
    unless I18n.locale == :ja
      return { :locale => I18n.locale }
    end
    options
  end
  # 既定のロケールをセット
  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end
end
```

参考: http://morizyun.github.io/blog/i18n-english-rails-ruby-many-languages/

### basic認証

```
http_basic_authenticate_with :name => "admin", :password => "abcdefg"
```


# Mailer


### メールを送信する

``` ruby:app/mailer/user_mailer.rb
class UserMailer < ActionMailer::Base
  default from: "from@example.com", bcc: "bcc@example.com", to: "to@example.com"
  
  def registration(user)
    @user = user
    mail(:to => @user.email, :subject => "Registration")
  end
  
end
```

``` ruby:controller
UserMailer.registration(user).deliver
```

### helperをmailerでも

``` ruby:
class FooBarMailer < ActionMailer::Base
  helper  :hoge, :application
end
```


# その他

## developmentでも環境によって設定を変えたい

やりかたは色々あると思いますが、作業者ごとのサーバーで分けたかったので`ENV["HOME"]`で分岐することにしました。

```ruby:config/environments/development.rb
if ENV["HOME"].match(/akkunchoi/)
  config.action_mailer.perform_deliveries = false
  config.action_mailer.default_url_options = { :host => 'hoge.dev' }
  config.action_mailer.raise_delivery_errors = true
else
  config.action_mailer.perform_deliveries = true
  config.action_mailer.default_url_options = { :host => 'example.jp' }
  config.action_mailer.raise_delivery_errors = true
end
```

## 属性名を読みやすい形に変換

``` ruby:
Person.human_attribute_name("first_name") # => "First name"
```
顔をリアルタイムにトラッキングする


**カメラに映っている人間の顔をリアルタイムにトラッキング** してくれる openFrameworks のアドオン、 **ofxFaceTracker** を試してみました。


##導入

※MacOSXでの使用が前提です。

###1. ofxCv を入手

ofxFaceTracker を使用するには **ofxCv というアドオンも必要** になります。[ここ](https://github.com/kylemcdonald/ofxCv) からダウンロード or clone します。

```
cd openFrameworks/addons/
git clone https://github.com/kylemcdonald/ofxCv.git
```


###2. ofxFaceTracker を入手

[ここ](https://github.com/kylemcdonald/ofxFaceTracker) からダウンロード or clone します。

```
cd openFrameworks/addons/
git clone https://github.com/kylemcdonald/ofxFaceTracker.git
```

##新規プロジェクト作成（oF 0.9.0 で確認）

###1. アドオン追加

projectGenerator で新規プロジェクトを作成する際、次の3つのアドオンを追加します。

- ofxOpenCv
  - ofxCv で `#include "opencv2/opencv.hpp"` しているため
- ofxCv
- ofxFaceTracker

###2. モデルデータ追加

ofxFaceTracker の libs/FaceTracker 配下にある、 **model フォルダをプロジェクトの bin/data フォルダ（なければ作成する）にコピー** します。

###3. include

2つのアドオンのヘッダを include

```
#include "ofxCv.h"
#include "ofxFaceTracker.h"
```

###4. ビルドエラー修正

ofxFaceTracker.cpp でビルドエラーが出るため、

```
#include "ofGraphics.h"
```

が必要でした。（oF 0.9.0, Xcode 7.2）

##サンプルを試してみる

※上記と同様に各サンプルプロジェクトにもモデルデータを配備する必要があります。


###example-extraction

<img src="http://f.cl.ly/items/163O0f3Q2T0a0X173s06/extraction.jpg" width="400">

目と口がどうにかなるサンプルのようです。


##example-advanced

<img src="http://f.cl.ly/items/2Y1Y0D0w3u240i010Q3b/advanced3.jpg" width="400">

トラッキングした顔のメッシュを取得（`ofxFaceTracker::getObjectMesh`）し、ワイヤーフレームを描画（`ofMesh::drawWireframe`）するサンプル。
debian-goodies

Debian でパッケージ群を扱う小粋なソフトウェアとして debian-goodies を紹介します。
試していませんが、多分 Ubuntu や Mint でも使えると思います。

つづきはこちらで
[debian-goodies](http://uwabami.junkhub.org/log/20131204.html#p01)
[PHP] 配列に対する +演算子 と array_merge の比較 （小ネタ）

## テストコード

```php:test.php
<?php
$a = array(
    'a' => 'apple',
    'b' => 'bear',
    'c' => 'coffee',
);

$b = array(
    'a' => 'ant',
    'b' => 'bug',
    'd' => 'deep',
);

echo "\$a + \$b\n";
$c = $a + $b;
print_r($c);

echo "array_merge(\$a, \$b)\n";
$c = array_merge($a, $b);
print_r($c);

echo "\$b + \$a\n";
$c = $b + $a;
print_r($c);

echo "array_merge(\$b, \$a)\n";
$c = array_merge($b, $a);
print_r($c);
```

## 結果

```shell:result
$a + $b
Array
(
    [a] => apple
    [b] => bear
    [c] => coffee
    [d] => deep
)

array_merge($a, $b)
Array
(
    [a] => ant
    [b] => bug
    [c] => coffee
    [d] => deep
)

$b + $a
Array
(
    [a] => ant
    [b] => bug
    [d] => deep
    [c] => coffee
)

array_merge($b, $a)
Array
(
    [a] => apple
    [b] => bear
    [d] => deep
    [c] => coffee
)
```

## まとめ

\+ 演算子は、同一キーに対し、上書きしない。
array_merge は同一キーに対し、上書きする。

## 参考
[配列演算子](http://php.net/manual/ja/language.operators.array.php)
[array_merge](http://li1.php.net/manual/ja/function.array-merge.php)
AWSクレジットの引き換えエラーメッセージまとめ

普通はAWSクレジットを使う機会ってそんなに無いとは思うんだけど、AWSクレジットの引き換え可否って結構色んな条件があるので気をつけましょう。ここでは僕が見たことがあるエラーメッセージについてメモしておきます。

# クーポンコードが間違っている
```text
We were unable to redeem the credit you entered. Please check the code and try again.
```

適当なコードを入れたらエラーになります。当然ですねｗ


# クーポンコードは既に引き換え済み
```text
Attempting to redeem a promotion code that has already been redeemed : XXXXXXXXXXXXXXX
```

既に引き換え済みのコードを入れると表示されるエラーです。これも当然ですねｗ


# 1アカウントに適用できる上限回数エラー
```text
The account 123456789012 exceeds the limit of 1 for for the maximum number of codes currently redeemed per account.
```

これは普通の人は見る機会が少ないエラーかもです。

例えば、WEBフォームからアンケート登録するだけで$100のAWSクレジットが貰えるキャンペーンなどがあったとしましょう。こういうのがあると複数メアドを使って大量のクレジットコードを取得してウマーとか考えるもんですが、大抵このようなキャンペーンで発行されたコードには1アカウントに1回しか適用出来ないという制限がかかっており、有効な2つ目のコードを引き換えようとすると上記エラーを目にすることになります。もちろんその2つ目のコードは他のアカウントに対しては適用可能なんですが。

この設定は１なコードが多いですがたまにアカウント毎に3つまで適用可能なコードとかもあるようです。

ちなみにコードを配布している主催者が説明などしてくれない限りはそのコードが１アカウントに何回適用できるかどうかは引き換えを実行してみないと分かりません。とにかくAWSコードは交換してみるまでそのコードに関する情報は何も分からないのです。


# 引き換え期限切れ
```text
Attempting to redeem a promotion code that has been deleted :  XXXXXXXXXXXXXXX
```

AWSクレジットには使用期限の他に、引き換え期限が設定されていることがあるようです。

例えば 2013/08/01 に発行されたコードで、引替すると 2013/10/30 の有効期限が設定されたクレジットが貰えるとします。これの引き換えをさっさとせずに10月に入ってから入力したら、月末まで有効なクレジットのはずなのに、実は引き換え期限が2013/09/30に設定されていたために引き換え自体が出来ませんでした！ということが起こります。そういうときに上記エラーを見ることになります。非常に残念な状態です…。

例によって実際に引き換えエラーが出るまでそんな期限が設定されているとはわからないし、引き換え成功した場合もやはりそんな情報は教えてもらえません。とにかく貰ったコードはさっさと適用するに限る！ということですね。
?>は書かない

```php
<?php

     $hello = "Hello World!\n";
     echo $hello;

?>
```

と書いていたところ、

```php
?>
```

以降に改行が2個以上入っていた場合、htmlと解釈してしまうらしい。

```php
<?php

     $hello = "Hello World!\n";
     echo $hello;

?>
\n
\n
```

なので、

```php
?>
```

は書かないようにするのがよいそうな

```php
<?php

     $hello = "Hello World!\n";
     echo $hello;

```

おわり
Node.jsでOpenGLやOpenCLを動かす

# [node-webcl](https://github.com/Motorola-Mobility/node-webcl)を入れると出来る

## Unix系なOSだと割と楽にインストールできる

Linux、OSXはnpm install node-webclで行けるかも

## 手元のMarvericksなMacBook Proでは
/usr/local/includeや/usr/local/lib配下をコンパイルやリンク時に見てくれないので、

```bash
CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib npm install node-webcl
```

## Windowsな場合
VS2013だと

```bash
npm install -g node-gyp
```

で、npm付属ではなく、最新のnode-gypでビルドしないと駄目。

###　node-webclが依存するDLL等の用意
node-webclのReadMe.mdの通り、依存するライブラリを準備しておく。

GLFWは2.7系を入れると良い気がする。

### 64ビット
node-webclのdevice.ccで動的に配列を宣言している箇所を直せば、
あとは行けると思おう。

### 32ビットな環境

64ビット同様device.ccの変更に加え、関数ポインタのキャストで呼び出し規約を
コンパイラが納得する形にそろえる必要がある。

さらに、node-webcl,node-webgl,node-glfwのbindingが64ビットなライブラリを
指定しているので、これを32ビットなライブラリを参照するように書き換える。

# node-webcl入れると

なんとかインストール出来たら、node-webcl配下のnode_modulesにnode-webglも
出来ているので、WebGLをnode.jsで動かせる。

GLFWも入れることになるので、3DなGUIアプリがJavaScriptで書けるようになる。


# 関連記事
- [ASUA T100TA-DK32GでNode.jsでOpenCL出来た！](http://kjunichi.cocolog-nifty.com/misc/2013/12/asua-t100ta-dk3.html)
- [[soloved]Mavericksでnode-webclがビルドできた](http://kjunichi.cocolog-nifty.com/misc/2013/10/solovedmaverick.html)
- [FirefoxでWebGLではなく、WebCLを動かした](http://kjunichi.cocolog-nifty.com/misc/2014/05/firefoxwebglweb.html)
EC2 にて bundler を実行すると ENOMEM となり失敗する

t1.micro で bundler を実行すると ENOMEM となり、失敗してしまう場合の対処法です。

t1.micro にはデフォルトでは SWAP 領域が確保されていないので、
生成してあげると良いです。

方法は[こちら](http://oh-sky.hatenablog.com/entry/2013/05/18/104416)に詳しいです。
AWS CLIの --query オプションが便利。

結構前から `--query` オプションが増えてたのは気づいてたんだが `jq` で困ってなかったので使い方調べてなかったんだけどこれ便利だね！ついでに `--output` も。


今まで↓こんな風にしていたことが

```bash:
aws ec2 describe-images --owner self | jq ".Images[].ImageId" -r
```

jq とか無しで↓こんな風に書けるようになった。

```bash:
aws ec2 describe-images --owner self --query "Images[*].ImageId" --output text
```

あれ？比べてみると長くなってるねｗ でもawsコマンド単体で完結できる点がとてもよい。
openFrameworks for iOS のサンプル一覧

openFrameworks（以下 oF）には大量のサンプルプロジェクトが同梱されています。「UIKitのビューと oF のビューを一緒に使いたいけどどうやるんだろう」みたいなときにそういうサンプルがあるのがわかってると話がはやいので、ここにサンプルの一覧をまとめていこうと思います。

実行時のスクリーンショットと、ソースで **どういった処理が実装がされているか** （何の機能のサンプルなのか）も書いていきます。

（※随時更新していきます。ストックしておくと、更新通知が飛んでくるので便利です。）

##PrimitivesExample

（v0.9.8）

![IMG_1673.PNG](https://qiita-image-store.s3.amazonaws.com/0/3180/91c418ba-a9b3-3202-1791-ba18ee5c7e3e.png)

`ofSpherePrimitive` や `ofCylinderPrimitive` といったクラスを使って3D図形を描画するサンプル。

##CoreLocationExample

##ImagePickerExample

##KeyboardExample

##MapKitExample

##TouchAndAccelExample

##advancedEventsExample

##advancedGraphics

##assimpExample

##audioInputExample

##audioOutputExample

##dirListExample

##emptyExample

##eventsExample

##fontShapesExample

##fontsExample

##graphicsExample

##iPhoneGuiExample

##imageLoaderExample

##iosCustomSizeExample

##iosES2ShaderExample

##iosExternalDisplayExample

##iosNativeExample

##iosOrientationExample

##moviePlayerExample

##ofxGuiExample

ビルドして実行すると、nibをロードするあたりでクラッシュするため、プロジェクトにいくつかの修正が必要。

- MyGuiView.xib の File's Owner の Custom Class が "MyMusicView" となっているので、"MyGuiView" に直す
- **MyGuiView.xibを、Copy Bundle Resourcesに追加する**

![](http://f.cl.ly/items/2S07400a1G2S3k0S251t/gui_.png)

UIKit の UISwitch と UISlider で、 oF によって描画されている図形が変化します。

**UIKit と oF を同居させる** 貴重なサンプル。

##opencvExample

アドオン ofxOpenCv を使ったサンプル。

- 動画を再生（`ofVideoPlayer::play`）しつつ、
- 背景（動画再生開始時のフレームを背景とする。以後、タップするとその瞬間のフレームを背景とする）を差し引き（`ofxCvGrayscaleImage::absDiff`）、
- 指の輪郭を検出する（`ofxCvContourFinder::findContours`）

サンプルです。

![](http://f.cl.ly/items/1s2O1k45421h2I0X0J2u/cvExample_.png)

##opencvFaceExample

##oscReceiverExample

<img src="http://f.cl.ly/items/0m1R1J1J3p3r133n0t0n/IMG_8929_r1_c1.jpg" width="400">

##oscSenderExample

<img src="http://f.cl.ly/items/0I2C1e0m28390O0l3X3v/IMG_7972_r1_c1.jpg" width="400">

タッチの情報をReceiver側に送る。

##polygonExample

##soundPlayerExample

##textureExample

##vboExample

ofVbo を使用するサンプル。

![](http://f.cl.ly/items/1n2j3q1e2U082K160r0M/vbo_.png)

VBOというのは Vertex Buffer Object の略で、『頂点データを格納するGPU側のメモリに置かれたバッファ』とのこと。

参考：<a href="http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?OpenGL%20-%20VBO" >OpenGL - VBO - PukiWiki for PBCG Lab</a>

##videoGrabberExample

ofVideoGrabber を使用して、 **iPhoneのカメラからの入力（動画）をリアルタイム処理** するサンプル。

![](http://f.cl.ly/items/1s3d3X1W1l26173Q130B/videograbber.jpg)


##xmlSettingsExample


##ビルドエラー修正メモ

- oF v0.9.8 / Xcode 8.3 にて "library not found for -lcrt1.3.1.o" というエラー

→ プロジェクトのTarget iOSバージョンを上げる （[参考](http://stackoverflow.com/questions/39632155/ld-library-not-found-for-lcrt1-3-1-o-error-while-running-app-in-device-with-xc)）
改行を含む文字列を配列へ


```php:対象文字列
$str = "a
b

c

d
e
"
```

って感じの文字列を

```:処理結果
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}
```

に変換するコード

```php:コード
// 改行コード \r、\n、\r\n の3種を区別せず配列化
$arr = preg_split("/\R/", $str);
// 各要素の空白除去
array_walk_recursive($arr, 'trim');
// 文字列長が0の要素を除去
$arr = array_filter($arr, 'strlen');
// インデックスを振り直す
$arr = array_merge($arr);
```
データコンペ用ディレクトリ

## ワークステーションの扱い方
### ユーザー名及びパスワード
* 両方共 `kmlab`

### 使用方法
#### sshの場合
`ssh kmlab@192.168.10.120`
でログインしてください。
#### Teamviewerの場合
パートナーIDに`581 106 952`もしくは`192.168.10.120`と入力して接続してください。

尚、sshの場合は基本的に複数人がログインしても同時に作業可能。

### ディレクトリ構造について
データコンペ用のファイル類は`/home/kmlab/compe/H25_COMPE`に入っています。
それ以外のディレクトリは星野くんのCUDAで使用していたりするので要注意。

### 必要なデータの取り出し方
ターミナルから`python`を起動して、

```pyhon
import csv
path= '/home/kmlab/compe/H25_COMPE'
item = csv.reader(open(path + '/Gakusyu/EC_03_ITEM.csv','rb'))
list =[]
for line in item:
  list.append(line) #listオブジェクトに行ごとのデータを代入
#取りたいデータを指定してオブジェクトに代入(商品IDを取得)
item_ID
for i in range(len(list))
  item_ID.append(list[i][2])
#顧客IDの取得
cust = csv.reader(open(path + '/Gakusyu/EC_01_CUST.csv','rb'))
cust_ID =[]
for line in cust:
  cust_ID.append(line[0])

```

出力するときはprint文をぶち込んでシェルでリダイレクトするのがベストかと、、、。
IntelliJ IDEA 13がリリースされました！

#とうとうIntelliJ IDEA 13がリリースされました！

IntelliJ IDEA 13の新機能につきましては、日本語の記事ですと、[IntelliJ IDEA 13の新機能](http://samuraism.com/wp-content/uploads/2013/12/idea13.html)が詳しいです。

私が個人的に気になっているのは、下記の点です

1. プレゼンテーションモード (意外とよく使う)
2. Java EE 7対応 (特にJAX-RS 2.0対応)
3. Web開発の機能追加改善 (特にKarma, Emmet, RESTクライアントあたり)
4. バージョンコントロール周り (フィーチャーブランチ機能が気になる)
5. データベース周り(ビューの改善やjoin条件の補完は凄く嬉しい)

とりあえずインストールしてみましたが、全般的にUIの改善で、12と比べて画面を広く使うことが出来ます。
いくつかのプラグインはまだ13に対応しておらず、特にPythonプラグインが動かないのがちょっと残念ですが、すぐに対応してもらえるでしょう。逆にプラグインに依存しまくっている方は、急いで13に上げないほうがよいかと思います。

ちなみにコレがデータベースのビュー改善。where句が直接書けるし、結果のソートも多段ソートが可能になりました。12のときのダイアログは使いにくかったので、これは非常にいい改善だと思っています。

![スクリーンショット_120413_022547_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/47605d78-def1-9dbf-bd33-4c9d051f616e.jpeg)


#購入について

IntelliJ IDEAの購入は正規日本代理店の[サムライズム](http://samuraism.com/products/jetbrains/intellij-idea)での購入が、本家での購入と比べても若干お得です。ドル建てですと、本家よりもサムライズムの方が1ドルお安いそうです。
また、もう少し細かい話をしますと、今日(2013/12/04)現在、三菱東京UFJ銀行の口座をお持ちの方であれば、円建て＆手数料不要で、一番お安く買うことが出来ます。サムライズムでの為替レートは1ドル=100円なのですが、今日現在1ドル=102.62円ですので、PayPalでのドル建て購入と比較して、1万円あたり262円の差がでてきます。円建てでも銀行振込手数料がかかる場合は、どちらが安くなるかを検討して適切な方を選ぶのが良いかと思います。

#チーム導入について

[IntelliJ IDEA Advent Calendar 2013の2日目](http://qiita.com/todogzm/items/e4332f15c3ec8d137289)にも書かせていただいたのですが、私は個人の他、チームでもIntelliJ IDEAを使っています。そこで気になるのは、チームとしても、13に上げるかどうか？という点です。
今のところ、残念ながら私のチームでは早々に13に上げることはないだろうと考えています。13の機能で恩恵を受ける部分が、かなり限定的であるためです。チームの開発ももう少しJava EE寄りであれば、迷わず13に移行したと思いますが、今はそうではないのです…。

…などとネガティブなことを書いておきながら、私自身は早速13へのアップグレードライセンスを購入し、せっせとステマ活動に勤しむことを決意したのでした。

#追記
以下、実際に触ってみた雑感です。

* IntelliJ内ターミナル機能は便利だと思ったけれど、ターミナル側のシェルのキーバインドとIntelliJ IDEAのキーバインドが衝突しまくって使いづらいです
* フォルダへのナビゲーションが地味に便利
3分で作る Windows Eclipse C/C++ 開発環境

Eclipse CDT環境はWindowsのC/C++ソースコードリーディング・編集環境として優秀だと思うので共有。
ビルドは、別途Visual C++でプロジェクトがあるというのを想定している。
ビルドはできないけど、コードの補完とかコード間の参照とかはできる感じ。

## 必要なもの

 * Eclipse CDT (32bit)
 * MinGW (32bit)
 * CMake 

別に32bitじゃなくてもいいけど、MinGWと合わせること。
バージョンは最近のならなんでもいいはず。

## CMake 

ソースコードのあるディレクトリに以下の内容をコピーして CMakeLists.txt を作る。

```
Project(MyProject)

cmake_minimum_required(VERSION 2.8)

 # あれば　include_directories ()

file (GLOB SRCS */*.cpp)

add_executable (a.exe ${SRCS}) 
```

CMake （cmake-gui）を実行して、
source code と build the binaries の箇所をソースコードのあるディレクトリを指定、
Configure で「Eclipse CDT MinGW 」 を選択、Generate。
でEclipse CDT用の設定ファイルができる。

## Eclipse CDT
Eclipse を立ちあげて、File → Import → Existing Code as Makefile Project。
Code Locationでさっきのソースコードのあるディレクトリを指定、
これでProject Nameも自動で埋まる。
注意するのは、Toolchain のとこで MinGW GCC を指定すること。
で、FInishで環境構築終わり。

## インクルードディレクトリは？
gcc のオプションでいうところの -I の設定は、
プロジェクト でプロパティ→C/C++ Build → GCC C++ Compiler → Includes でディレクトリを追加できる。
Rails 4.0.2 [deprecated] I18n.enforce_available_locales〜


### deprecatedメッセージ

```
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
```

### 参考リンク

* [Rails 4.0.2のi18nで出るようになったdeprecated警告の対策方法 - @znz blog](http://blog.n-z.jp/blog/2013-12-04-rails-i18n-deprecated-warning.html)
* [deprecated - Rails 4.0.2 I18n validation deprecation warning - Stack Overflow](http://stackoverflow.com/questions/20361428/rails-4-0-2-i18n-validation-deprecation-warning)
* [Add I18n.locale_available? and enforce available locales · 3b6e56e · svenfuchs/i18n](https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c)

### 対処

```rb:config/application.rb
    I18n.enforce_available_locales = true
```
Pythonでキューイング処理

キューとは最初に入れたものを最初にだすものである。(=first in firstout)
pythonで実現します。

```py
# -*- coding: utf-8 -*-

class Queue(object):

    def __init__(self):
        self.queue_list = []

    def enqueue(self, value):
        self.queue_list.append(value)

    def dequeue(self):
        try:
            # 先頭をとりだす
            value = self.queue_list.pop(0)
        except IndexError:
            value = None

        return value

if __name__ == '__main__':
    queue = Queue()

    queue.enqueue("a")
    queue.enqueue("b")
    queue.enqueue("c")

    print queue.dequeue()
    print queue.dequeue()
    print queue.dequeue()
    print queue.dequeue()
```

実行結果
% python queue.py
a
b
c
None
Qiita Advent Calendar 2013 の opml ファイル作った

====================================

[Advent Calendarの投稿がRSSリーダーで見られるようになりました。 - The Official Qiita Blog](http://blog.qiita.com/post/68868305813/adventcalendar-rss) とのことだったので、Feedly で見る為に opml ファイル作ってみました。

* [qiita-adventcalendar-2013.opml](https://dl.dropboxusercontent.com/u/103573/qiita-adventcalendar-2013.opml)

これを保存して、Feedly の Organize から Import OPML でアップロードすれば登録されるはず。

便利。

#### 追記

どうせなので Adventar のも opml 作った。

* [adventar-2013.opml](https://dl.dropboxusercontent.com/u/103573/adventar-2013.opml)
【Mac】フォルダ内のファイルの文字コードを一括変換する

##nkfのインストール

Macにnkfがインストールされていない場合は、下記をまず実行する。

1.  http://sourceforge.jp/projects/nkf/ から最新のダウンロードファイルをDLする。(2013/12/4時点で2.1.3)

2. 以下のコマンドを叩く

```
#もし/usr/local/srcが無い場合は作る
mv nkf-2.1.3.tar.gz /usr/local/src/
cd /usr/local/src/
sudo tar xvzf nkf-2.1.3.tar.gz
cd nkf-2.1.3
#makeがインストールされていない場合はXcodeのCommand Line Toolをインストール
sudo make
sudo make perl
sudo cp nkf /usr/local/bin/
cd NKF.mod
sudo perl Makefile.PL
sudo make
sudo make test
sudo make install
nkf --help
```

##nkfコマンドで文字コード変更


```
#カレントディレクトリのファイル全てをSJISに変換
 nkf -s --overwrite ./*

```

+ -s：SJIS
+ -e：EUC
+ -w：UTF8

です。
##参考
nkf インストール - El mar verde( http://d.hatena.ne.jp/elmarverde/20101108/p1 )
Brewで入れたMeCabでMeCab-rubyが動かない問題

## この記事は間違っている可能性が高いです
`brew update`
をすれば自動的にMeCabのVersionが最新(0.996)のDL先とSHA1が設定されるようです。
TimeMachineのバックアップにさかのぼって環境を見ることができたらどうなっていたか見てみたいのですが、おそらく`brwe update`していなかっただけですね。失礼しました。


homebrewで導入したMeCabで、MeCab-rubyを導入したところうまく動かないので、原因なんだろうと思ってましたが簡単でした。

```bash
brew edit MeCab
```

これで見ると、MeCabのダウンロード先が0.98になっていることが確認できます。
これを0.996VerのURLに変更します。
また、MD5の値がおかしいとこのままでは怒られるので、SHA1の値を設定します。
以下のようにし、`brew install MeCab` を叩き、公式のページからMeCab-rubyをDL、Compile、配置すればオッケーです。
MeCab-rubyについてはもう色々と情報があるので省きます:)

```ruby:MeCab.rb
require 'formula'

class Mecab < Formula
  #url 'http://downloads.sourceforge.net/project/mecab/mecab/0.98/mecab-0.98.tar.gz'
  url 'https://mecab.googlecode.com/files/mecab-0.996.tar.gz'
  homepage 'http://mecab.sourceforge.net/'
  sha1 '15baca0983a61c1a49cffd4a919463a0a39ef127'

  def install
    system "./configure", "--disable-debug", "--disable-dependency-tracking", "--prefix=#{prefix}","--enable-utf8-only" #ほぼ必要ないオプションだが--enable-utf8-onlyをつけている。
    system "make install"
  end
end
```

OSX:Mavericks
ブラウザに配置したボタンからツイートだけできるシンプルなコード片

本当に超シンプルで、ボタンを押してツイートするだけの用途です。

事前に書きたいことをメモしたい時もあるので、textarea をボタン下に配置しています。

`data-text="xxx"` でボタン押下後のデフォルトメッセージを設定しておけます。

`data-hashtag="xxx"` で同じくボタン押下後のデフォルトハッシュタグを設定しておけます。

```tweet_button.html
<!DOCTYPE html>
<html>
<head>
<title>tweet_button</title>
</head>
<body>
<a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-text="write here" data-hashtags="now_working">tweet</a>
<br><textarea cols=40 rows=5></textarea>
<script>
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");
</script>
</body>
</html>
```

意志の弱い自分は、集中を持続したい仕事中とかに、今はタイムラインは見ないけどメモ用途の tweet だけしておきたい。という願望があって、画面隅にこれをちっさく置いて使っていたりします。
gitサブモジュールのHookをどこに置けばいいか

サブモジュールのディレクトリに入って以下のコマンドを実行する。

```
git rev-parse --git-dir
```

以下の様なパスが表示される。

```
/home/me/work/repos/my-pj/.git/modules/us-common
```

このパスが、サブモジュールにおける.gitディレクトリのようなもので、中にhookディレクトリがある。

サブモジュールに適用したいhookはその中に置けばいい。
Fuelphp の最新版での戸惑い

### Fuelとゴリラの邂逅
*****

最近Fuelphpを眺めていることが多い。
その中で、もうすでにインストール方法とかは超出回っているので割愛。

気になったらとりあえず触ってみるのが主義の為、Officialを読みながら将棋のようにポチポチしている。
(ニュアンスがつかめるまでは書籍は購入しない主義)

そして、よく躓く。（マニュアル見ないからだよ）

そこでとりわけ？ってなったものを備忘録として残しておく。

### 環境
*****

* OS: CentOS6.3
* php: 5.3.3
* mysql:  5.1.69
* Fuel : 1.7.1 (ちょっと前は1.3)

### Pagination
*****

例えば1.3で

```
Pagination::$offset
```

って書いていたのが、超エラーになる。
超切ない。
内容は

```
FuelPHP Access to undeclared static property: Fuel\core\Pagination::$offset
FuelPHP Access to undeclared static property: Fuel\core\Pagination::$per_page
```

うん値が読み取れてないね。
ゴリラの目にも涙。

で、結局、Fuelphp 1.4以降の値の当て込みを変更しないとgetできない。

```
Pagination::get('offset');
```

でとれて幸せになった。



### find()
*****

データを抽出するのにfind()ってのを使ってたんですよ。
その時に

```
Model_example::find()->where('hoge',$hoge);
```

って書いて取得してたんだけど最新版に入れ替えたらエラーになった。
逆に笑えてきた。(周りは笑ってなかったけどね！ごめんなさい)

エラー内容は

```
 $data['str']=Model_example::find()->where ....(PATHだから省略)
```

をを…オブジェクトに関連付けられていないメンバー関数だぜこの〇〇が！
って怒られた。


結局[fuelphp.jp](http://fuelphp.jp/docs/1.6/packages/orm/crud.html)では

> (意訳です) find()メソッドをプロパティなしで使うとエラーになんで！
今それを使っても Orm/Query オブジェクトが返ってデータが取れる仕様にはなってるけど将来変更されるかもしれんねんで！
せやからこのメソッド自体は推奨せんよ！
それと同じ効果を期待するようであればquery()メソッドを利用するんやで！

ってこと。
ゴリラは森に帰れって言われてる気がした。

```
Model_example::query()->where('hoge',$hoge);
```
でデータを取ることに。

### まとめ
*****

他にもいろいろ？？って思ったこともあるけど私はげんきです。

良い書籍などありましたらお教え下さい。
(最初からやry)

最新バージョンで勉強し始める場合は気をつけてね！(俺だｗ)
Markdown／シンタックスハイライト導入 - redcarpet／coderay


### 参考リンク

* [vmg/redcarpet](https://github.com/vmg/redcarpet)
* [rubychan/coderay](https://github.com/rubychan/coderay)
* [Markdownの表示を行う【Rails】 « Kntmrkm.new()](http://kntmrkm.ap01.aws.af.cm/ict/rails/markdown%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%82%92%E8%A1%8C%E3%81%86%E3%80%90rails%E3%80%91/)
* [Redcarpet のシンタックスハイライトに CodeRay を使う - すぱぶろ](http://superbrothers.hatenablog.com/entry/20120129/1327840871)

----

Gemfile

```rb
# Markdown & Syntax Highlight
gem 'redcarpet'
gem 'coderay'
```

```
bundle install
```

app/helpers/application_helper.rb

```rb
module ApplicationHelper
  class HTMLwithCoderay < Redcarpet::Render::HTML
    def block_code(code, language)
      case language.to_s
      when 'rb'
        lang = 'ruby'
      when 'yml'
        lang = 'yaml'
      when ''
        # 空欄のままだと「Invalid id given:」エラー
        lang = 'md'
      else
        lang = language
      end

      CodeRay.scan(code, lang).div
    end
  end

  def markdown(text)
    html_render = HTMLwithCoderay.new(filter_html: true, hard_wrap: true)
    options = {
      autolink: true,
      space_after_headers: true,
      fenced_code_blocks: true,
    }
    markdown    = Redcarpet::Markdown.new(html_render, options)
    markdown.render(text)
  end
end
```

app/views/posts/show.html.haml

```haml
= markdown(@post.body).html_safe
```
Heroku複数アカウント設定 - heroku-accounts

### 参考リンク

* [ddollar/heroku-accounts](https://github.com/ddollar/heroku-accounts)
* [Managing multiple Heroku accounts - pote.to](http://www.pote.to/blog/2012/09/02/managing-multiple-heroku-accounts/)
* [herokuコマンドで複数アカウントを使いわける - Sooey](http://journal.sooey.com/162)

----

### プラグインインストール

```
heroku plugins:install git://github.com/ddollar/heroku-accounts.git
----------
Installing heroku-accounts... done
----------
```

### Herokuアカウント登録

* firstアカウント

```
heroku accounts:add first
```

↑or↓

* 必要な設定、記述の追加、keyの生成などを自動で行う

```
heroku accounts:add first --auto
```

* secondアカウント

```
heroku accounts:add second
```

↑or↓

```
heroku accounts:add second --auto
```

### Herokuアカウント切り替え

* アカウント切り替え

```
# in project root
heroku accounts:set second
```

* アカウント表示

```
heroku accounts
----------
second
first
----------
```

### Herokuアカウント設定削除

```
heroku accounts:remove first
```

### デフォルト設定

```
heroku accounts:default first
```

```
heroku accounts
----------
second
* first
----------
```

----

### HerokuへのPush時にエラーが出たら

[Managing multiple Heroku accounts - pote.to](http://www.pote.to/blog/2012/09/02/managing-multiple-heroku-accounts/)

* エラーメッセージ

```
 !  Your account xxxxxxxxxx@gmail.com does not have access to xxxxx.
 !  
 !  SSH Key Fingerprint: 47:95:51:c4:28:3f:6f:32:7b:e9:fb:27:83:db:de:5f

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

* If you already have a pre-existing SSH key with your Heroku account, you’ll see an error message like this:

```
 !  Your key with fingerprint xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx is not authorized to access application-name.

fatal: The remote end hung up unexpectedly
```

* This error happens because your project is no longer using your old SSH key. Let’s remove the old SSH key from Heroku and upload a new one:

```
heroku keys:clear
# Clears all existing keys (do this if you only have one key, otherwise use $ heroku keys:remove key)

heroku keys:add ~/.ssh/identity.heroku.second.pub
# Uploads your new personal SSH key

heroku accounts:set second
# Sets the account again
```

That’s it! Heroku Accounts is easy to setup and well worth the effort if you use Heroku frequently.

* HerokuへPush

```
git push heroku master
```
MACにNetBeansでAndroid環境を作る


環境構築メモ

* [ツール]-[プラグイン]でプラグイン画面を起動
* [設定]で[追加]を選択
名前にAndroid(なんでもいい?) URLに http://nbandroid.org/release72/updates/updates.xml を入れて[OK]

![プラグイン](https://qiita-image-store.s3.amazonaws.com/0/27566/c91dc5a8-c2c7-e47e-6995-b43ea797133c.png "プラグイン")

* [使用可能なプラグイン]より、Androidを選択してインストール

![プラグイン](https://qiita-image-store.s3.amazonaws.com/0/27566/059a1632-105d-0961-8b31-e9ce59404fcd.png "プラグイン")

* [http://developer.android.com/sdk/index.html](http://developer.android.com/sdk/index.html) ここからSDKをダウンロード。Eclipseはいらないので、下の方にある、[USE AN EXISTING IDE] のところからダウンロードする。

* ダウンロードしたSDKを適当なフォルダに入れる

* [NetBeans]-[Preferences...]から[Android]タブを選択し、[SDK Location]にSDKのフォルダを選択する。

![オプション](https://qiita-image-store.s3.amazonaws.com/0/27566/53e4f2cb-67db-130e-1211-769110860030.png "オプション")

* [ツール]-[Android SDK Manager]を選択

* お好みのプラットフォームなどをインストール

* NetBeansを再起動する

とりあえずはここまでかな。

参考サイト
[NetBeansでAndroid開発環境を構築する](http://mini-tips.com/2013/06/01/476.html)
nginx reverse proxy 検証環境

```shell-session
brew install nginx
```

通常は `nginx start`, `nginx stop` で daemon を起動/停止すると思うのですが、デバッグ用途だとそれは鬱陶しいので、 foreground で起動して `C-c` で終了

```shell-session
sudo nginx -g "daemon off; master_process off;"
```

そのままだとログが出力されないので、

```nginx:/usr/local/etc/nginx/nginx.conf
error_log /dev/stderr;
http {
  access_log /dev/stdout;
}
```

オレオレ証明書

```shell-session
mkdir /usr/local/etc/nginx/ssl && cd $_
openssl genrsa -des3 -out server.key 1024 # あとで削除するのでパスフレーズは適当
openssl req -new -key server.key -out server.csr # テスト目的なので設定はデフォルトでOK
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key # 鍵のパスフレーズを削除
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
```

reverse proxy 設定の例

```nginx:/usr/local/etc/nginx/nginx.conf
    server {
        listen 80;
        listen 443 ssl;
        server_name hoge.example.com;
        location / {
            proxy_pass https://localhost:3000/;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        ssl on;
        ssl_certificate /usr/local/etc/nginx/ssl/server.crt;
        ssl_certificate_key /usr/local/etc/nginx/ssl/server.key;
    }
```

```:/etc/hosts
127.0.0.1        hoge.example.com
```

## 参考リソース
- [How To Create a SSL Certificate on nginx for Ubuntu 12.04 | DigitalOcean](  https://www.digitalocean.com/community/articles/how-to-create-a-ssl-certificate-on-nginx-for-ubuntu-12-04)
- [Configuring HTTPS servers - nginx](http://nginx.org/en/docs/http/configuring_https_servers.html#single_http_https_server)
grepで指定行数スキップする

grepは指定バイト数スキップのオプション(-b, --byte-offset)は有るけど、指定行数スキップするオプションはない。
判り切っているヘッダを除外してgrepしたい場合など、以下の様に、tailを組み合わせて処理します。

tail -n +10 foo.txt | grep "bar"

tailの-nオプションは、tailい表示する行数を指定するオプションですが、「+10」の様に指定すると10行目以降を表示するという指定になります。

``` shell:実行例
user@hostname ~
$ cat testdata.txt
1, 0
2, 2
3, 4
4, 6
5, 8
6, 0
7, 2
8, 4
9, 6
10, 8
11, 0
12, 2
13, 4
14, 6
15, 8
16, 0
17, 2
18, 4
19, 6
20, 8
21, 0
22, 2
23, 4
24, 6
25, 8

user@hostname ~
$ grep ", 8" testdata.txt
5, 8
10, 8
15, 8
20, 8
25, 8

user@hostname ~
$ tail -n +10 testdata.txt | grep ", 8"
10, 8
15, 8
20, 8
25, 8

user@hostname ~
$
```
GPSって実際どれほどの精度なのか試してみた


たまたまGPSを使う要件がありまして、
GPSがどこまでいけるのか検証してみました。  

結論からいうと、かなりよい。

モジュールはスパークファンから購入した
[Adafruit Ultimate 66チャンネル10Hz GPSモジュール Version 3](http://www.switch-science.com/catalog/1085/)

[このライブラリ](https://github.com/adafruit/Adafruit-GPS-Library)の通りに5Vと、TX/RXをつなぐだけ。

![IMG_0313.jpg](https://qiita-image-store.s3.amazonaws.com/0/14330/148c3a68-0f39-10f0-c615-224cd69b094f.jpeg "IMG_0313.jpg")

ArduinoのSerial MonitorでそのままGPSのログが確認できるようになりますが、
一点だいじな事…  
**屋内では使えません。**  
Macと、この怪しげなArduinoむき出しのブレッドボードをもって近所の公園へ出掛けました。
僕が警官なら間違いなく職質します。


↓横浜海辺の公園を、不審者まがいに歩いたログ
[GPS LOG](http://asus4.github.io/misc/20131121/gpslog.html)

↓高度情報はこちら
![height_walk_10fps.png](https://qiita-image-store.s3.amazonaws.com/0/14330/3043e520-2bcf-7598-7172-2300050aa31b.png "height_walk_10fps.png")

絶対値のoffsetは2m程東へずれていますが、
相対値の移動はかなり正確だという印象。
車載GPSで次の角を曲がってくださいって言っているんだから当たり前か。自分でやるとえらく感動する。

シリアル通信でこんな感じのフォーマットが流れてくる。(横浜の公園だけどちょっとだけ伏せ字)

	$GPGGA,094022.200,35XX.XXXX,N,139XX.XXXX,E,2,11,0.78,-10.4,M,39.5,M,0000,0000*79
	$GPRMC,094022.200,A,35XX.XXXX,N,139XX.XXXX,E,0.08,311.14,201113,,,D*6B

これは[NMEAフォーマット](http://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html)というものらしい。パーサーも上述のgithubにあるので、ありがたい。
速度方向も結構な精度が出ていた。

ちなみに、GPSログの解析は、
[http://www.gpsvisualizer.com/](http://www.gpsvisualizer.com/)
このサイトを利用。
生のNMEAログファイルをいれるだけで、googlemapでみれるし、png,jpg,svg,さらにgoogleearth用のkmlフォーマットにも変換してくれる。
なんて素敵なサービス。（サクラではありません。ほんとうに素敵です。）
Mojoliciousのテンプレートでレイアウトを自在に操る

**テンプレートのレイアウトの話** 。例えば…

* デフォルトは2カラムで右側にサイドバー
* でも `about` ページとかは1カラムにしたい

っていう要望よくあると思うんですよ。でMojoliciousの `Mojolicious::Plugin::DefaultHelpers` の中からヘルパーメソッドをいくつかチョイスして使えば実現可能です。ただ、ついつい分かりやすい `layout` と `include` メソッドだけを使ってこねくり回す感じでいわば強引に上記の1カラムと2カラムの切り替えを僕は以前やっていました。すると include するためのパーツをいくつも切り分けなくてはいけなくてちょっと管理が煩雑になるので最近使ってる手法を紹介します。

`content` メソッドと `extends` メソッドを使います。アプリの本体はMojolicious::Liteでこのように短く書いてみます。

```perl
#!/usr/bin/env perl
use Mojolicious::Lite;

get '/' => sub { shift->render('index') };
get '/about' => sub { shift->render('about') };

app->start;
```

`/` にアクセスされたらデフォルトの2カラム、`/about` にアクセスが来たら1カラムで表示してみましょう。

まず、2カラムでも1カラムでも共通で使う **外枠** のラッパーを定義します。

```html
@@ layouts/wrapper.html.ep
<!DOCTYPE html>
<html>
  <head><title>Hello Mojolicious</title></head>
  <body>
% content container => begin
    <%= content %>
% end
%= content 'container'
  </body>
</html>
```

`content` メソッドの中で一度「container」という名前でこれからつくる `/layouts/default` と `/layout/one_column` の内容を読み込ませてすぐさま表示しています。次にデフォルトの2カラム、そして1カラムのテンプレートを書きます。

```html
@@ layouts/default.html.ep
% extends 'layouts/wrapper';
% content container => begin
<div><%= content %></div>
<div id="sidebar">sidebar</div>
% end
%= content 'container'

@@ layouts/one_column.html.ep
% extends 'layouts/wrapper';
% content container => begin
<div><%= content %></div>
% end
%= content 'container'
```

`extends` メソッドで例の `layouts/wrapper` を呼び出して「container」という名前でテンプレートの実態を渡しています。これで

* 一番外側がlayouts/wrapper
* 中身はそれぞれlayouts/default, layouts/one_columnで実装

することが叶えられるのです。最後に、個別のテンプレート、つまりコントローラから呼び出されるモノについて書きましょう。ここは特に意識することなく `layout` メソッドで `default` もしくは `one_column` を指定するだけです！

```html
@@ index.html.ep
% layout 'default';
2 cloumns!!

@@ about.html.ep
% layout 'one_column';
1 cloumn!!
```

ちょいラッパーとその中身をつくる仕掛けが複雑ですが、一度定義してしまえば、個別のテンプレートは `layout` メソッドで切り替えるだけでよいのでこれはなかなか良いですね。他にテンプレートの応用の仕方がありましたら本Advent Calendarにて記事を書いてくれると嬉しいっす！
ライセンス表記に注意しよう(自戒の念を込めて)

昨日の記事に頂いたご指摘をネタに書いてしまいました。

例によって続きは<a href="http://d.hatena.ne.jp/k-side/20131204">はてなダイアリー えぢた2.1</a>をご覧ください。
JSONファイルの管理をちょっとだけ楽にしてくれるgrunt-sync-versionを紹介するよ

# はじめに

この投稿はGrunt Plugins Advent Calendar 2013の8日目の記事です。
http://qiita.com/advent-calendar/2013/grunt-plugins/

# grunt-sync-versionとは


JSONファイルのバージョンの更新し忘れを防ぐだけの簡単なプラグインです。

- http://github.com/1000ch/grunt-sync-version
- https://npmjs.org/package/grunt-sync-version

普段の開発でもversionを記述するファイルは`package.json`の他に、
`bower.json`とか、ChromeExtensionをたまに開発するときは`manifest.json`と色々あり、
たまにversionを更新し忘れてpushとかpublishしてしまうときがあった。ので作りました。

# 使い方

`package.json`があるプロジェクトルートに移動して、
`grunt-sync-version`をインストール。

```shell-session
$ cd ./path/to/your/project
$ npm install grunt-sync-version --save-dev
```

既にあると思うので`gruntfile.js`に以下のように記述する。

```js
module.exports = function (grunt) {
  grunt.initConfig({
    version: {
      options: {
        base: 'package.json'
      },
      files: ['bower.json']
    }
  });
  grunt.loadNpmTasks('grunt-sync-version');
  grunt.registerTask('default', 'version');
};
```

`base`に指定されたJSONファイルの`version`を同期元とし、
`files`に指定されたJSONファイルを同期先とします。

`options`に記述してある`base`については省略すると、
`package.json`のバージョンを取得するようになってるので、基本は省略で良いかもしれません。

```js
module.exports = function (grunt) {
  grunt.initConfig({
    version: {
      files: ['target1.json', 'target2.json']
    }
  });
  grunt.loadNpmTasks('grunt-sync-version');
  grunt.registerTask('default', 'version');
};
```

これで、`package.json`のバージョンを元に、`target1.json`と`target2.json`を更新します。
`files`には同期対象のjsonファイルを指定しますが、単一ファイルでも、glob指定でもOKです。

## まとめ

そもそもJSONファイルが乱立してしまう昨今の開発事情も微妙なところはあるんですけどね…。
JSONファイルのバージョン更新し忘れがちな方は是非どうぞ！
PHP: メモリリークのデバッグ、肥大化するオブジェクトを探す

#PHP: メモリリークのデバッグ、肥大化するオブジェクトを探す

**memory_get_usage()をデバッグプリントして、メモリ使用量が増えている箇所を特定する**

```php
print sprintf("MEMORY USAGE %0.2fMB",round(memory_get_usage() / 1024 /1024,2);
```

**肥大化してそうなオブジェクトをファイルにダンプ**

```php
// objectをファイルにダンプ
file_put_contents(
    '/tmp/debug_object_' . time() . '.txt',
    print_r($object, TRUE)
);

// $objectを操作する処理をして・・・

// またobjectをファイルにダンプ
file_put_contents(
    '/tmp/debug_object_' . time() . '.txt',
    print_r($object, TRUE)
);
```

※処理が早くファイル名を分けるのにtime()で不十分なときにはmicrotime()を使うか、sleep()を挟む


**ダンプファイルのリストでファイルサイズが大きくなっていないか確認**

```bash
ls -l /tmp/debug_object_*
```


**ファイルサイズが大きくなっていたらどの要素が変わっているかdiffで確認**

```bash
diff /tmp/debug_object_1386117835.txt /tmp/debug_object_1386117837.txt 
```
AWS EC2でSSL対応のTomcat7を443番ポートで動かす

Amazon Linux AMIで，SSL対応のTomcat7を443番ポートで動くよう設定したときの備忘録．

インストール

````
$ sudo yum install tomcat7
````

自己署名の鍵を作成．CN値はPublic DNSなどを設定する．

````
$ sudo keytool -genkey -alias tomcat -keyalg RSA
$ sudo mv /root/.keystore /etc/tomcat7/keystore
````

設定ファイルを修正．

```
$ sudo cp -p /etc/tomcat7/server.xml /etc/tomcat7/server.xml.orig
$ sudo vim /etc/tomcat7/server.xml
```
```diff
$ diff -u /etc/tomcat7/server.xml.orig /etc/tomcat7/server.xml
--- /usr/share/tomcat7/conf/server.xml.orig	2013-09-18 09:28:48.000000000 +0900
+++ /usr/share/tomcat7/conf/server.xml	2013-12-03 16:42:44.133504498 +0900
@@ -81,11 +81,10 @@
          This connector uses the JSSE configuration, when using APR, the
          connector should be using the OpenSSL style configuration
          described in the APR documentation -->
-    <!--
     <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true"
+               keystoreFile="/etc/tomcat7/keystore" keystorePass="changeit" keyAlias="tomcat"
                clientAuth="false" sslProtocol="TLS" />
-    -->

     <!-- Define an AJP 1.3 Connector on port 8009 -->
     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
```

サービス起動

```
$ sudo service tomcat7 start
```

簡単な動作確認．

```
$ curl -X GET https://localhost:8443
curl: (60) Issuer certificate is invalid.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
```

システム起動時にTomcatも起動

```
$ sudo chkconfig tomcat7 on
```

443番ポートへの通信を8443番ポートへ転送するように設定し，設定ファイルを出力．

```
$ sudo /sbin/iptables -t nat -A PREROUTING -j REDIRECT -p tcp --destination-port 443 --to-ports 8443
$ sudo service iptables save
```
なんでも開ける grunt-open について紹介するよ

<a href="http://www.gdefon.com/moods/482148-Mood_key_pink..html">![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/27401/aee5d962-5984-de8d-34d1-40d02c6f4c4f.jpeg)</a>

© 2011 www.GdeFon.com
via. http://www.gdefon.com/moods/482148-Mood_key_pink..html 


# grunt-open

[grunt-open](https://github.com/jsoverson/grunt-open)
その名の通り、grunt 実行時に open します。そう、ブラウザでもファイルでも。

それだけ?と言う機能ですが意外と重宝しています。 
Yeoman の Webapp generatorで梱包されていて知りました。

以降、自分のプロジェクトではかならず導入するようにしています。

# How to use

## インストール
```
npm install --save-dev grunt-open 
```

## 設定
```
grunt.initConfig({
  open : {
    dev : {
      path: 'http://127.0.0.1:8888/src',
      app: 'Google Chrome'
    },
    build : {
      path : 'http://google.com/',
      app: 'Firefox'
    },
    file : {
      path : '/etc/hosts'
    }
  }
})

grunt.loadNpmTasks('grunt-open'); 
```

(via.) https://github.com/jsoverson/grunt-open#gruntfile-configuration 


サンプルではdevやbuild、file等設定していますが、シンプルな機能なのでオプションも少ないです。

``path``項目は必須で、開きたいURLもしくはファイルパスを設定します。

例えば ``http://127.0.0.1:8888/src`` や ``'/etc/hosts`` などですね。

``app``項目は任意です。なければデフォルト設定のブラウザ/テキストエディッタ等が開きます

- URLを設定する場合、使用するブラウザを設定。
- Fileパスを設定する場合、使用するエディッタを設定。

``grunt open:dev`` ``grunt open:file`` 
などで実行できます。
 

Chromeなら ``app: 'Google Chrome’ `` 、Chrome Canaryなら  ``app: 'Google Chrome Canary’ ``です。

IEなら･･･

果たして なんでも開ける ``grunt-open`` で開くことは出来るのでしょうか?


余談ですが、以前開催した grunt のもくもく会で grunt-open 実行したら boot camp上 のWindowsのChromeが開いたっていう話を聞いたのですが 回避出来たのでしょうか?

grunt コマンドを実行する度に開くので、一度開いていたらもう開かないなどの設定が出来ると更に良いのですが。
まぁ難しいですかね。

以上です。
openFrameworks for iOS ことはじめ

openFrameworks （以下oF）を iOS アプリで使用してみます。

とりあえず、ボタン、ラベル、ログ出力あたりができれば色々と試しやすくなる（と思ってる）ので、そこまでやります。

あと、oF といえばアドオン、みたいな雰囲気があるので、どこかから拾ってきたアドオンを追加する方法も。

（2015.12.18 追記）oF 0.9.0, Xcode 7.2, iOS 9.2 で試して更新しました。

##導入（v0.9.0）

1. oF 公式サイトの [download](http://www.openframeworks.cc/download/) ページから iOS 用のをダウンロード
2. of_v0.9.0_ios_release.zip を解凍する
3. examples/ios/emptyExample にあるプロジェクトを開く
4. ビルド

これで何も処理が書かれていない空白のアプリが実機で動作します。

##新規プロジェクト作成

###emptyExample を利用

[openFrameworks入門](http://yoppa.org/iphone10/1120.html) では、emptyExample をリネームして新規プロジェクトとして使う方法が紹介されています。

これでもOKですが、Xcode のプロジェクト名等も直す必要があります。

###projectGenerator を利用

コメント欄で教えていただきました。

> projectGeneratorっていうソフトウェアが付いてるので、それを使うという方法もあるです。OF_ROOT/projectGenerator/projectGenerator.appにあります。

ちゃんと iOS 用のが、`projectGenerator-ios/projectGenerator.app` にありました。GUIに従って新規プロジェクトを作成できます。


##ログ出力

C++なので普通にprintfとか、

````
printf("Hello World!\n");
````

> Hello World!

あと `std::cout` とか。

iOSのプロジェクトなので、NSLogも使えました。

````
NSLog(@"Hello World!");
````

> 2013-12-04 10:23:23.551 emptyExample[1511:70b] Hello World!

（printfプラス、日時がついてくる）

[ofLog](http://www.openframeworks.cc/documentation/utils/ofLog.html) というクラスもあるようなのですが、それはまた別途。


##ラベル（文字列表示）

###Bitmapフォントを描画する

`ofDrawBitmapString` を使用して文字列をビットマップとして描画できます。第2,3引数は描画するx, y座標。

````
void testApp::draw(){

	ofDrawBitmapString("Hello world!", 100, 100);
}
````

文字色は、 `ofSetColor` でRGBで指定します。

````
void testApp::draw(){

    ofSetColor(0, 0, 0);
	ofDrawBitmapString("Hello world!", 100, 100);
}
````

###TrueTypeフォントを描画する

利用したいフォントファイル（.ttf）を、プロジェクト配下の bin/data フォルダに入れておきます。

ヘッダでメンバ変数を宣言し、

````
ofTrueTypeFont font;
````

フォントを読み込みます。第２引数は **フォントサイズ** 。

````
font.loadFont("xxxx.ttf", 30);
````

あとは `drawString` メソッドで描画。

````
font.drawString("Hello world!", 100, 100);
````


##ボタン

ググってみたり、入門書をパラパラみてみた感じだと、oFには標準ではボタンクラスみたいなのが用意されてないようでした。

`touchDown` とか `touchUp` といったタッチイベントのハンドラと、あとは図形描画や文字列描画でよしなにやってくれということなのでしょう。

[ofxControlPanel](https://github.com/ofTheo/ofxControlPanel) とか、GUI系のアドオンがいくつかありそうなので、また別途調べてみます。


##アドオンを使用する

1. アドオンのフォルダごと、addons フォルダに入れる
2. アドオンをプロジェクトに追加する
3. 依存アドオン（あれば）も同様にプロジェクトに追加する
4. ヘッダを `#include` する

ちなみに Addon を探すには、 [ofxAddons](http://ofxaddons.com/) というサイトが良さそう。


##その他基本事項

- 画面左上隅が座標原点 (0, 0) となる（UIKitと同様）
- `draw` ごとに画面全体が再描画される。
  - つまりずっと表示しておくには `draw` メソッド内で描画命令を呼び続けないといけない
  - 逆に、消去命令とかはない
コードフォーマットを使いこなす


PhpStormではコードフォーマットの設定を細かくカスタマイズ出来ます。

## コードフォーマットの設定

- [Preferences] - [Code Style] - [PHP]
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/20074/8a172b6f-ed93-8be3-f131-128245c03ba3.png "Preferences.png")

- インデントをタブにするか
- =の前後にスペースは入れるか
- ( $hoge )のようにスペースを入れるか
- 中括弧は次の行にするか

などなど、かなり細かい設定がここで出来ます。
チェックボックス形式で選択して、選択された内容が即時右のエディタ風のエリアで反映されるので非常に分かりやすいです。また、右のエディタ風のエリアは編集可能なので、自分が試したいコードをここに入れて確認することもできます。これも地味に便利。

また、右上の[Set from...]から、他の言語の設定を読み込んだり、Symfony2など定義されているフレームワークの設定や、PSR1/PSR2準拠の設定を読み込んだり出来ます。

## コードフォーマットの適応

上で設定した内容は自動的に適応されません。
コードフォーマットを実行したいファイルを開いて

- Reformat Code(Win: Ctrl+Alt+L / Mac: Ctrl+Option+L)

のコマンドを実行することで適応されます。

Reformat Codeを実行すると以下のようなダイアログが出ます。
(ダイアログが出ない場合は[Preference] - [IDE Settings] - [Editor] - [Formatting] - [Show "Reformat Code" dialog]のチェックを入れると出るようになります)

![Reformat_Code_と_KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/61c6bd5f-098c-9cb9-d7e1-4a04dec161f5.png "Reformat_Code_と_KeywordFetchShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")

そのまま実行すると開いているファイルの全体に、[All files in directory]を選択するとディレクトリ配下のコードを全てフォーマット出来たりします。

エディタ内でコードを選択した状態でReformat Codeを実行すれば選択箇所のみにフォーマットを適応、
ダイアログの[Only VCS changed text]にチェックを入れるとファイル内の未コミットの編集箇所のみフォーマット適応したりも出来ます。
既存の箇所に影響させずに任意の箇所のみフォーマットかけ直したい場合はこちらを使うと良いです。

コードフォーマットは設定が細かく出来る分、設定項目が多すぎてうんざりっていう人も多いと思います。
が、一度設定してしまえば変更することはあまりないですし、コーディングの強い味方となってくれますのでぜひとも使いこなしたい機能です。

明日の5日目も私です。お楽しみに！
REST API for Apache JIRA

# REST API for Apache JIRA

タイトルがREST APIだけど、[WebHDFS](http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-hdfs/WebHDFS.html)の話でも、[YARNのREST API](http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/WebServicesIntro.html)の話でもありません。Apache JIRAの話です。つまり、この話はHadoop以外でもJIRAを利用しているプロジェクトなら適用可能です！

例えば、ブラウザから目的のチケットを検索したいときは、普通は[こんな感じ](https://issues.apache.org/jira/browse/HADOOP-10139?jql=project%20%3D%20HADOOP%20AND%20resolution%20%3D%20Unresolved%20AND%20assignee%20in%20(ajisakaa))に見えます。

さらに、別の形式に変換して取り出すことができます。なんと、XML、Word、Excelなどが対応しています。これらの形式のファイルを取得するためには、ブラウザからExportのボタンを押せばオッケーです。

* Excel形式すげー！って思ってファイルを取得したことがあるのですが、個人的には画像が埋め込まれまくってて微妙です。
* 正直言って、CSVのほうが嬉しい。

けれども、JIRA上の統計情報(誰が何件パッチを書いたとか)を分析したいぞ、などといった(偏った)理由がある場合はJSONで取れたほうが使い勝手が良くて便利です。(個人的には)

ExcelがあってJSONが無いわけはないだろう、と思って探したら、やっぱりありました。[こんなURL](https://issues.apache.org/jira/rest/api/2/search?jql=project%20%3D%20HADOOP%20AND%20resolution%20%3D%20Unresolved%20AND%20assignee%20in%20(ajisakaa))を叩くとJSONでデータが取れます。このクエリでは10数件しかないですが、標準では1件目から50件目までデータが取れます。

* それ以上データが欲しい場合

 * URLの末尾に&startAt=50をつければ、51件目から100件目までのデータが取れます。

* 最大50件じゃなくて、もっと沢山のデータを一気に取得したい

 * URLの末尾に&maxResults=100をつければ、100件取れます。([サーバに負担をかけないため](https://issues.apache.org/jira/browse/INFRA-6181)、100件で制限されています)

あとは煮るなり焼くなり好きにするとよいでしょう。

他にもREST APIから[チケットを投稿](https://developer.atlassian.com/display/JIRADEV/JIRA+REST+APIs)できたりもしますが、普通にブラウザからやったほうがいいと思います。
PhpStorm EAPを使ってみる

### EAPとは
Early Access Programの略称。開発中のため公開されていない製品や技術などを、顧客企業や希望者に提供して使用してもらう制度のことである。(Weblioより)

ということです。PhpStormのEAPを使うにはライセンスを持ってなくても参加できます。（もちろん1ヶ月の制限はあります）
公開はこちらでされています。
[PhpStorm Early Access Program](http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Early+Access+Program)

開発中の製品なので、不具合なども多かったりしますが、次期バージョンで入る機能を先駆けて触ることもできて面白いです。

開発のロードマップはこちら
[PhpStorm Development Roadmap](http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Development+Roadmap)

開発ブログはこちら。EAPでの新機能などこちらで紹介されています。
[JetBrains PhpStorm Blog](http://blog.jetbrains.com/phpstorm/)

4日目も私です。お楽しみに！