OmniAICreator/Qiita-1.07M huggingface dataset:
iBeaconの送受信制限について

今回は最近各所で話題になっているiBeaconの、デバイスにおける状態と動作制限についてまとめたいと思います。

更新：iOS7.1では変更点があります。詳細はこちらを参照してください。
[iOS7.1でのiBeaconが改善されまくった話](http://qiita.com/Morikuma_Works/items/25c4f6fe02a57dbec660)

#iBeaconの概念
iBeaconにはRangeとRegionという2つの概念がある。

* Range : iBeacon発信機からの距離などが計算できる程度の精度を持つ情報を取得できる (CoreBluetoothを使用: 様々な情報が得られます)

* Region : iBeacon発信機の電波が入ることを認識できる (CoreLocationを使用: エリアに入った、エリアから出た、の情報のみが得られます）(didEnterRegion, didExitRegion)

この2つがあるということが重要で、これがごっちゃに説明されている文献も多いかと思います。

#なぜこれほどまでに話題になっているか
自分が思うにO2O(Online to Offline)においてかなり強力なソリューションになりうるからだと思います。

#iBeaconの受信
##受信アプリがフォアグランドの場合
フォアグランドで動いているアプリでiBeaconを受信する場合、約1秒間隔で、Range、Regionを取得します。

##受信アプリがバックグラウンドの場合
受信アプリがバックグラウンドの場合、CoreBluetoothを使う、Rangeは、バックグラウンドでは使用できないため使用できません。
しかし、CoreLocationを使うRegionはバックグラウンドで使用できます。
つまり、エリアに入った、エリアから出た、はわかるということです。

もともとiOS6時代はCoreLocationも、バックグラウンドにいるアプリでは頻繁に通信できないという制約がありましたが、
iOS7でiBeaconが導入されたからか、それが緩和されています。
バックグラウンドでも、1秒間隔で受信することが可能です。
Regionを元に、PushやPassbookと連携した機能を起動することができます。しかし、処理に約10秒のラグが存在します。

##受信アプリがバックグラウンドで動いていて、デバイスがロックされている場合
デバイスがロックされている場合でも、Regionは使うことができます。
Regionから連携アプリを起動することが可能です。
ただし、あくまで受信アプリがバックグラウンドで動いている必要があります。

##いつまでバックグラウンドアプリとして動くのか？
通常のアプリは、バックグラウンド移行後、10分間ユーザがなんの操作も行わない場合、スリープに移行してしまいます。
今回、実験で10分以上バックグラウンドで起動して放置しましたが、ログ上ではスリープに移行した形跡がありませんでした。（25分間放置で実験）
よって、何も処理をしないと、何も知らないユーザは、ずっと電池を消費し続けることになります。(白抜きの位置情報使用アイコンは右上に出続けますが…）
iPhone4Sの場合、1日放置したところ50%の電池を消費しました。
iPhone5Sの場合だと、1日放置しても5%程度の減少でした。
実装で明示的にBLEの使用を停止するようなことをしたほうがレビューが荒れずに済むかもしれません。

#iBeaconの送信
##発信アプリがフォアグランドの場合
できます。充電アダプタにつないでおかないとすぐ電池がきれます。
##発信アプリがバックグラウンドの場合
できません。発信はCoreBluetoothで行いますが、CoreBluetoothはバックグラウンドでは使用できません。
##発信アプリがバックグラウンド動いていてデバイスがロックされている場合
できません。理由は同上です。

#まとめ
基本的にはRegionに入ったか、出たかをイベントにした所作はバックグラウンドでもできるが、発信にはかなりの制限があることがわかったと思います。

また、リファレンスにある仕様が、実際に測定してみると満足な結果が得られない場合も多々あり、
Regionだけを用いたアプリを作成する場合は、この精度や条件で大丈夫かどうかを一考したほうが良さそうです。
Serverspecの判定にサーバ内のコマンドの実行結果を使いたい

serverspecでirqbalanceというデーモンが起動しているかどうかのチェックをしたのですが、このデーモンはコア数が1の場合は起動しないとのこと。
これを管理しているchefはいろいろなサーバで使われる可能性があったので、とりあえずコア数1のときはテストしないという方針にしました。

サーバのコア数を取得したかったので、cpuinfoをコマンドで取得し、その実行結果をもとに判定するかどうかを決めています。
テストの中でサーバに対しコマンドを実行するにはbackend.run_commandを使います。

```rb
describe service('irqbalance') do
  cmd_result = backend.run_command("cat /proc/cpuinfo|grep -c processor")
  cpu_total = cmd_result[:stdout].to_i
  it { should be_enabled if cpu_total > 1 }
  it { should be_running if cpu_total > 1 }
end
```

コマンドの実行結果は下記のようなハッシュで返ってきました。

```rb
{:stdout=>"1\n", :stderr=>"", :exit_status=>0, :exit_signal=>nil}
```

サンプル中では出力結果を整数型にキャストして比較に使用しています。
状況に応じた柔軟なテストを書く参考になればと思います。
第34話: 二つのdocker

タイトルは全くイミフです

# Debian wheezy でdockerを使う

```
> lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 7.3 (wheezy)
Release:	7.3
Codename:	wheezy
```

今のところ公式のサポートはないので茨道ですが、徐々に茨道感が下がってきているようです。

やるべきことをざっと並べておきます。Ubuntuであればlxc-dockerが大体やってくれることを自分でやれ、ということになります。場合によってはパッケージを持ってくる方が楽かもしれない

* lxcは自分で入れろ？
* cgroupも自分で設定しろ？
* dockerデーモンを自分で立てろ？
* Go 1.2 入れておけ？
    * 1.0.2 ですと go install で止まるようです

＃ 言い換えると「Go言語で書かれ、配下にLXCという仮想化ソフトを用いるdockerというソフトを動かすため、言語処理系と外部のソフトや設定を調整しろ」という話になります。この線で調べていくと、逆に言うと不足が感じ取れるようになるかもしれません。

昔はカーネル周りでもう少しめんどかったらしいですが、このくらいでなんとかしてもらえる、感じ。

環境毎に異なるので頑張って調べて下さい、としか言えませぬ。

参考: https://coderwall.com/p/wpst1w

# そしてdocker兄が立ちふさがる

docker -d が起動して sudo なしでデーモンと更新できるところまでやって「やったー」と思い、
最後にUbuntu 13.10から奪ってきた /etc/init.d/docker をDebianに無理やりぶち込みこれで終わりと思いきや、

動かない。だんまり。startしてもプロセスがいない。

一体何故。

そこでstart-stop-daemonの--no-closeオプション(デーモン化した後でもログを元のターミナルに吐き出し続ける。デバッグ用)を使用してdaemonのログを無理やり覗き込みますと、

どう見ても「知らない」dockerのヘルプメッセージが出て止まっております。

なんだろうねこれ……

あーっ

```
> LANG=C apt-cache show docker
Package: docker
Version: 1.4-5
Installed-Size: 88
Maintainer: Ari Pollak <ari@debian.org>
Architecture: amd64
Depends: libc6 (>= 2.7-1), libglib2.0-0 (>= 2.12.0), libx11-6
Description-en: System tray for KDE3/GNOME2 docklet applications
 Docker is a docking application (WindowMaker dock app) which acts as a system
 tray for any desktop environment, allowing you to have a system tray without
 running the KDE/GNOME panel Docker was designed to work with Openbox 2, but it
 should work fine in any window manager.
Description-md5: 032a37ba6228c22cbca1c0b960030eaa
Tag: interface::x11, role::program, scope::utility, suite::gnome,
 suite::gnustep, suite::kde, uitoolkit::xlib, x11::applet,
 x11::application
Section: x11
Priority: optional
Filename: pool/main/d/docker/docker_1.4-5_amd64.deb
Size: 13572
MD5sum: 3b36feebe0bbcd5e91b581b39e2eb166
SHA1: 059419c87789b1eae264a7e71c9e1cbfef1cfc04
SHA256: 34f5f86bbd437741d7c8738d4d1d82fd2beb2b2fa4110c1f9a236f705e640f04
```

お前じゃない。```(sudo) apt-get remove docker...```

ついでにPATH指定がまるまる間違ってました。
/usr/local/bin/docker を指すようにして、動くようになりましたとさ。
そもそもこれが入っているということは以前わけもわからずapt-get install dockerしてるよね私、みたいな。

なおUbuntu 13.10で入れるのは「lxc-docker」です。実は(パッケージ名としては)dockerではない。

# まとめ

* 現時点では Debian (wheezy, 7.3) にdockerを導入するには自力でパッケージを構築するといった手間がある
* 生のdockerバイナリを持ってきて手動設定をすれば動作はするが、当然検証されていない
* Debianには"docker"というパッケージがあり、全く別の用途
* ぼんぼる。
* 1ヶ月も経てばこの記事の意味はなくなっているだろう
Kibana3 で filter 使おうとすると QueryParsingException が発生する

概要
========
Kibana3 上で filter を作成しようとするも、
`QueryParsingException ... [[field]]` のようなエラーが発生してしまう。

原因
========
ElasticSearch が生成されるクエリを認識できていないです。
ElasticSearch のバージョンが合っていないのかもしれません。

対応方法
========
0.9.x にアップデート/ダウングレードしてみてはいかがでしょうか。

参考: [CentOS - ElasticSearch を yum でインストールする - Qiita [キータ]](http://qiita.com/kakipo/items/5ccaab8581a3158dfcff)
Rspecでundefined method `proxy_for' for nil:NilClassが起きたら

久しぶりにRspecでテストを書いたらタイトルのエラーに遭遇した。
proxy周りなんて触ってないのになんで・・・？と思い調べたところ、とても初歩的なミスだった。

結論は以下の参考サイトに挙がっている通り。
``#it``や``#identify``ブロックの外で``#stub``や``#should_receive``を書いていたのが原因だった。

- https://github.com/Shopify/active_merchant/issues/746

書いたテストはこんな感じ。
``#describe``直下の``#stub``がまずい。

```rb
describe MyClass1 do
  before { @my_instance = MyClass1.new }

  describe "#my_method" do
    MyClass2.stub(:my_method).and_return(true)

    expect(@my_instance.my_method).to be_true
  end
end
```

実行するとこんなエラーが出る

```
$GEM_HOME/gems/rspec-mocks-2.14.4/lib/rspec/mocks.rb:26:in `proxy_for': undefined method `proxy_for' for nil:NilClass (NoMethodError)
        from $GEM_HOME/gems/rspec-mocks-2.14.4/lib/rspec/mocks.rb:51:in `allow_message'
        from $GEM_HOME/gems/rspec-mocks-2.14.4/lib/rspec/mocks/syntax.rb:19:in `stub_object'
        from $GEM_HOME/gems/rspec-mocks-2.14.4/lib/rspec/mocks/syntax.rb:40:in `stub'
```

コードの良し悪しは別として、こんな感じに直せばOK

```rb
describe MyClass1 do
  before { @my_instance = MyClass1.new }

  describe "#my_method" do
    it "should be success" do
      MyClass2.stub(:my_method).and_return(true)

      expect(@my_instance.my_method).to be_true
    end
  end
end
```
Javaのスレッドダンプ、ヒープダンプの取り方

JavaでFullGCが頻発したり、メモリリークしてたり、busyなスレッドに埋め尽くされそうになったとき、調査に必要なダンプを取得してから再起動することはよくあるでしょう。それらの取り方。

<a href="http://qiita.com/strsk/items/f8cbed179dd934b0a31d">Javaのスレッドダンプを取得する - Qiita [キータ]</a>
前にスレッドダンプだけ書いたけど、ヒープダンプもあったほうが良いのでまとめ

## JavaのプロセスID取得
```console
$ $JAVA_HOME/bin/jps -v
12345 Application -XX:OnOutOfMemoryError=/us…
67890 Bootstrap -Djava.util.logging.config.file=/us…
```
複数のプロセスが起動しているときは`-v`オプションで詳細を出したほうが良いけど、ひとつだけならオプションなしでOK
## スレッドダンプ取得
実行中のスレッドの状態を取得する（スタックトレース）

```console
$ $JAVA_HOME/bin/jstack -F 67890 > threaddump.txt
Attaching to process ID 67890, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
```
下記のようなエラーが出るときは`-F`をつけて強制出力する

```console
67890: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
```

## ヒープダンプ取得
ヒープに割り当てられたオブジェクト情報を取得する（メモリーマップ）
スレッドダンプはすぐ取れるが、ヒープダンプは割り当てているヒープサイズによっては数十分かかることもあるので注意

```console
# $JAVA_HOME/bin/jmap -F -dump:format=b,file=heapdump.map 67890
Attaching to process ID 67890, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
Dumping heap to heapdump.map ...
none
null_check
null_assert
range_check
class_check
array_check
intrinsic
bimorphic
unloaded
uninitialized
unreached
unhandled
constraint
div0_check
age
predicate
loop_limit_check
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Heap dump file created
```
同じく`-F`で強制射出！
PDOのよく判らなかった挙動

PDO

```php
    $sth->bindValue(':value', $this->value . "%" , \PDO::PARAM_STR);
```

=> 想定どおりに動作しない（前方一致にならず、無指定の"%"扱いっぽく検索される）

```php
    $search_val = $this->value . "%";
    $sth->bindValue(':value', $search_val , \PDO::PARAM_STR);
```

=> ちゃんと動く。

なんで？
RspecとFactoryGirlなどテストについて少し調べたメモ（リンクのみ）

RSpecでAPIのテストについて
http://blog.inouetakuya.info/entry/2013/10/27/200111

下記二つを見るとFactoryGirlの事がよくわかりそう
http://o.inchiki.jp/obbr/159
http://www.slideshare.net/suchi/factorygirl
IDE for Javascript

# PC Install

##### [WebStorm 7 — Everything you need, at your fingertips, without compromise](http://www.jetbrains.com/webstorm/whatsnew/)
- JSでの開発に特化。syntax hilightの対応が広い。
- 細かなツールが便利。debuggerとか、REST Clientとか。
- テスティングフレームワークのサポートが広い。jsTestDriver, Karma, mochaがサポート。Karma使うと、ファイル更新入るたびにテスト結果がGUI表示されて快適。istanbulもサポートしたらしい。
- nodeもサポート。
- 有料。

##### [IntelliJ IDEA — The Best Java and Polyglot IDE](http://www.jetbrains.com/idea/)
- WebStormの上位版。Java, Ruby, PythonもOK。
- 有料。けっこう高い。

###### [Aptana](http://www.aptana.com/)
- eclipseベース。
- 無料

# Cloud
###### [Cloud9 IDE | Your code anywhere, anytime](https://c9.io/)
- 本格的な統合開発環境。
- RailsやPHPでサーバサイドも一緒に開発して、そのまま公開できる。
- Herokuにも連携してたりで、そのままデプロイできたりする。
- WordPressも開発できるようになったらしい。
  - [クラウド最強エディタ「Cloud9」が、WordPressもブラウザのみでインスト・開発・公開が出来て無料！ | APPGIGA!!（アプギガ）](http://plus.appgiga.jp/masatolan/2014/01/23/50260/)

###### [jsdo.it - Share JavaScript, HTML5 and CSS](http://jsdo.it/)

###### [Create a new fiddle - JSFiddle](http://jsfiddle.net/)
- 本格的な開発環境ではない。
- コードサンプルを置いたり、スニペット置いたり。
- ブログに組み込んでサンプルコードを出せたりとか。書籍のサンプルコード置き場に使われたりもする。
Realm および プログラムで共通の Datasourceを利用する場合の server.xml

サンプル

```xml:server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server
	port="8105"
	shutdown="SHUTDOWN">

	<Listener
		SSLEngine="on"
		className="org.apache.catalina.core.AprLifecycleListener" />

	<Listener className="org.apache.catalina.core.JasperListener" />
	<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
	<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
	<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

	<GlobalNamingResources>
		<Resource
			auth="Container"
			name="jdbc/mysql-base2"
			type="javax.sql.DataSource"
			driverClassName="com.mysql.jdbc.Driver"
			username="base2"
			password="base2"
			url="jdbc:mysql://localhost/base2">
		</Resource>

	</GlobalNamingResources>
	.
	<Service name="Catalina">
		<Connector
			connectionTimeout="20000"
			port="8180"
			protocol="HTTP/1.1"
			redirectPort="8443" />
		<Engine
			defaultHost="localhost"
			name="Catalina">

			<!-- jdbc:mysql://localhost/base2 -->
			<Realm className="org.apache.catalina.realm.CombinedRealm">
				<Realm
					className="org.apache.catalina.realm.DataSourceRealm"
					dataSourceName="jdbc/mysql-base2"
					digest="MD5"
					userTable="tbuser"
					userNameCol="account"
					userCredCol="password"
					userRoleTable="tbuser"
					roleNameCol="role" />
				<Realm
					className="org.apache.catalina.realm.DataSourceRealm"
					dataSourceName="jdbc/mysql-base2"
					digest="MD5"
					userTable="tbuser"
					userNameCol="mailaddress"
					userCredCol="password"
					userRoleTable="tbuser"
					roleNameCol="role" />
			</Realm>

			<Host
				appBase="webapps"
				autoDeploy="true"
				name="localhost"
				unpackWARs="false">

				<Context
					docBase="struts2.app"
					path="/struts2.app"
					reloadable="true"
					source="org.eclipse.jst.j2ee.server:struts2.app">

					<ResourceLink
						name="jdbc/mysql-base2"
						global="jdbc/mysql-base2"
						type="javax.sql.DataSource" />
				</Context>
			</Host>
		</Engine>
	</Service>
</Server>
```
Rails3.2でバリデーションを動的に追加するとうまく動かない

Railsのフォームでは以下のような記述で簡単にバリデーションを追加することができます。

```rb
class ModelName < ActiveRecord::Base
  attr_accessible :attr
  validates :attr, presence: true
end
```

このバリデーションの部分は``ActiveModel::Validations``としてモジュールになっているので、永続化機構を持たない（DBにテーブルがない）場合でもバリデーションの機能のみ利用することができます。
僕はこれを利用してフォームとして利用することがよくあります。

```rb
class SomeForm
  extend ActiveModel::Naming
  include ActiveModel::Validations
  attr_accessor :attr
  validates :attr, presence: true
end
```

大抵の場合はこれでまったく問題ないのですが、フォームの項目が動的に変わる場合、バリデーションルールも動的に追加したいのですがそうするとうまく動かないという現象に遭遇しました。
（稀なケースだと思いますが、例えば管理画面で設問を設定する場合など。）

```rb
class DynamicForm
  extend ActiveModel::Naming
  include ActiveModel::Validations

  def initialize(attrs = [ :attr1, attr2 ])
    @attrs = {}

    attrs.each do |attr|
      instance_eval <<-DEFINE_GETTER_AND_SETTER_AND_PRESENCE_VALIDATOR
        class << self
          validates :#{attr}, presence: true # これが動かない！

          def #{attr}
            @attr[#{attr}]
          end

          def #{attr}=(value)
            @attr[#{attr}] = value
          end
        end
      DEFINE_GETTER_AND_SETTER_AND_PRESENCE_VALIDATOR
    end
  end
end
```

まだ解決できていないのですが備忘録として書きました。
余裕で来たらソースコード追ってみます。

- - -

Rails4では``ActiveModel::Model``を利用することができるようになったのでこれ使えば大丈夫なのかなぁ…
Cでmrubyコード実行時に発生したエラーの内容とバックトレースを取得



mrubyのコードをCで実行すると、エラーが発生することがありますが、`mrb_load_string`などで普通に実行しても、エラー内容やバックトレースは表示されません。
そこで、Cでエラー内容とバックトレースを取得する方法を調べてみました。

### どんなエラーが起こったのか表示されない!!

```c
mrb_load_string(mrb,
                "def foo\n"
                "  xxx(0)\n"
                "end\n"
                "foo");
```

### 欲しい情報

```markdown:エラー内容
foo.rb:1: undefined method 'xxx' for main (NoMethodError)
```

```markdown:バックトレース
foo.rb:2:in Object.foo
foo.rb:4
```

方法
--------

文字列を実行して、エラーとバックトレースを取得するコードはこのようになりました。

```c:コード例

#include <stdio.h>
#include <mruby.h>
#include <mruby/compile.h>
#include <mruby/string.h>
// extern "C" (C++の場合必要)
mrb_value mrb_get_backtrace(mrb_state *mrb, mrb_value self);

...

mrb_state *mrb = mrb_open();

// コンテキストを生成、ファイル名を設定
mrbc_context *context = mrbc_context_new(mrb);
mrbc_filename(mrb, context, "foo.rb");

// 一時オブジェクトがつくられるのでGC arenaを保存
int ai = mrb_gc_arena_save(mrb);

mrb_load_string_cxt(mrb,
                    "def foo\n"
                    "  xxx(0)\n"
                    "end\n"
                    "foo",
                    context);

mrb_value exc = mrb_obj_value(mrb->exc);

// エラー内容を取得
mrb_value backtrace = mrb_get_backtrace(mrb, exc);
puts(mrb_str_to_cstr(mrb, mrb_inspect(mrb, backtrace)));

// バックトレースを取得
mrb_value inspect = mrb_inspect(mrb, exc);
puts(mrb_str_to_cstr(mrb, inspect));

// 例外をクリア
mrb->exc = 0;

mrb_gc_arena_restore(mrb, ai);

mrbc_context_free(mrb, context);
mrb_close(mrb);

```

```markdown:出力
["foo.rb:2:in Object.foo", "foo.rb:4"]
foo.rb:1: undefined method 'xxx' for main (NoMethodError)
```

ポイント
--------

### コンテキストを用意する

文字列をロードする際は、`mrb_load_string_cxt`関数を使って、コンテキストを同時に渡す必要があります。
ファイル名は、`mrbc_filename`関数でコンテキストに設定します。

コンテキストを渡さないと、バックトレースが取得できません。


### 例外オブジェクト

例外オブジェクトは`mrb->exc`で参照できます。

### inspectでエラー内容を取得

例外オブジェクトをinspectすることで例のようなエラー文字列が取得できます。

### バックトレースの取得

`mrb_get_backtrace`が、例外オブジェクトからバックトレース（StringのArray）を取得する関数です。
ヘッダにはないので自分でプロトタイプ宣言を用意する必要があるようです。

### バックトレースは例外発生後すぐに取得する必要がある

バックトレースを取得する前にinspectを行う処理を書いたところ、
バックトレースが取得できなくなることに気がついたので、[issueを送ってみました](https://github.com/mruby/mruby/issues/1661)。

[Matz氏からすぐにご返事をいただき](https://github.com/mruby/mruby/issues/1661#issuecomment-32828190)、

* `mrb_get_backtrace`はmrb_stateからバックトレースを取得するため、他の処理を行ってしまうと
それが上書きされてしまう

* したがって、バックトレースは例外発生後すぐに取得する必要がある

とのことでした。

### 例外はクリアする

`mrb->exc`に0を設定することによって、例外をクリアする必要があります。
`mrb->exc`が残っていると、次にスクリプトを実行するときに失敗してしまいます。


### GC arena の save / restore

例外オブジェクト、処理中にCから生成したオブジェクトは、そのままでは GC arena に登録されて GC から保護されてしまい、いつまでも回収されません。

そこで、GC arena を save / restore して、GC の対象にさせる必要があります。

参考になったページ
--------

http://ktaobo.blogspot.jp/2013/09/mruby.html
Ghostのインストール方法(CentOS編)


Ghostはnode.js製のブログプラットフォームとして最近注目されています。
https://ghost.org/
http://docs.ghost.org/ja/

GhostをCentOS6.4にインストールしてみます。
まずはnode.jsのインストールから始めます。

```
$curl -O http://download-i2.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
$sudo rpm -ivh epel-release-6-8.noarch.rpm
$sudo yum install npm --enablerepo=epel
$node -v
$npm -v
```

バージョン番号が表示されれば成功です。
次にGhostの最新バージョンをインストール、起動します。

```
$curl -L https://ghost.org/zip/ghost-latest.zip -o ghost.zip
$unzip -uo ghost.zip -d ghost
$cd ghost
$npm install —production
$npm start
```

これでGhostの起動ができました。
http://127.0.0.1:2368
にアクセスして、ページが表示されていればOKです。
Windows8で使えなかったUC-SGTがVM上のLinuxでつかえたメモ

はじめに
-------
久しぶりにルータ(RTX1200)触ろうとして手持ちのElecomのUSBシリアルポート変換ケーブルの[UC-SGT](http://www2.elecom.co.jp/cable/usb/uc-s/gt/index.asp)(シリアル紛失)をWindows8で使おうとしたらドライバ入らず。
けどVMware Player上のLinuxでつかえたのでそのメモ。
あと、まだQiitaに似たような投稿がなかったので。

Windows8 64bit
--------------
とりあえずつなぐと不明なデバイスとなる。
シリアルの末尾わからないのでどのドライバかわからないけど、
どれ入れてもうまく認識されないみたい。
(署名とか面倒だったので試してない)


VMware player上のLinux
-------------------------
Windows8にVMware player入れて、その中にLinux入れる。
なんとなくCentOS6.5。

UC-SGTをつけてvmの画面で「接続(ホストから切断)」すると、

```
usb 2-2.1: new full speed USB device number 9 using uhci_hcd
usb 2-2.1: New USB device found, idVendor=056e, idProduct=5003
usb 2-2.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
usb 2-2.1: configuration #1 chosen from 1 choice
pl2303 2-2.1:1.0: pl2303 converter detected
usb 2-2.1: pl2303 converter now attached to ttyUSB0
```

として認識された。

あとはminicomいれて、デバイスを/dev/ttyUSB0にして通信速度を9600にしてルータの電源いれると
無事に文字列が表示されていじれるようになった。
bcの割り算の結果を小数にする

bcで普通に割り算すると整数で値が返る。
少数で値を返したいときは、 -l オプションか、scale=桁数 使う

```
[~]$echo  "3/2" | bc
1
[~]$echo  "3/2" | bc -l
1.50000000000000000000
[~]$echo  "scale=3; 3/2" | bc
1.500
```
Rails 4 でバリデータを自作する(custom validator)

Rails 4 でカスタムバリデータを作成する方法です。以下のページを参考にしています。

- [Custom Validators in Ruby on Rails 4 - Rails 4 recipes and know-how for developers](http://www.rails-dev.com/custom-validators-in-ruby-on-rails-4)

#### 1. app ディレクトリ内に validators というディレクトリを作成します

```bash
$ cd <RAILS_ROOT>
$ mkdir app/validators
```

#### 2. カスタムバリデータを作成し、app/validators ディレクトリに保存します

[Ruby on Rails Guides](http://guides.rubyonrails.org/active_record_validations.html#custom-validators) が参考になります。
今回は Email 用のバリデータ(EmailValidator)を作成します。

```rb:app/validators/email_validator.rb
class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end
```

#### 3. カスタムバリデータを有効にするため config/application.rb を修正します

config/application.rb の `config.autoload_paths` にカスタムバリデータを置いてあるディレクトリパスを追加すると、カスタムバリデータが必要な時に自動的に読み込まれるようになります。

```rb:config/application.rb
# ...
module Core
  class Application < Rails::Application
    # ...

    # add custom validators path
    config.autoload_paths += Dir["#{config.root}/app/validators"]

    # ...
 end
end
```

#### 4. バリデータを利用したい Model でカスタムバリデータを有効にします

```rb:app/models/user.rb
class User < ActiveRecord::Base
  # ...
  validates :email, email: true # <- カスタムバリデータ(EmailValidator)
  # ...
end
```

validates で `email: true` を指定することで、先ほど作成した EmailValidator の `validate_each` が呼ばれます。

### 参考 URL
- Active Record Validations — Ruby on Rails Guides
  http://guides.rubyonrails.org/active_record_validations.html#custom-validators
- Custom Validators in Ruby on Rails 4 - Rails 4 recipes and know-how for developers
  http://www.rails-dev.com/custom-validators-in-ruby-on-rails-4
Getting Started: Slim on Rails

# Memo
- Railsのテンプレートエンジンとしてerbの代わりに使われるのが普通？
- 単体で使うと、Javascriptの埋め込みは大変。完全に外出しして使うべきか。

# IDE Support
- RubyMineではデフォルトサポート。Structureも出る。
- WebStormでは、要プラグイン追加インストール。でも、ハイライト等のサポートは弱い。Structure出ない。

# Grunt Support
- grunt-slimでサポートされてる。

# Basics
- [マークアッパー的 Slim 入門21の手引き | e2esound.com業務日誌](http://www.e2esound.com/wp/2013/07/22/21_tips_to_use_slim_for_markup_engineer/)
- [速習テンプレートSlim(HTML作成編) - Qiita](http://qiita.com/yterajima/items/53fd0387279510ff082a)

# Tool
##### [HTML2slim](http://html2slim.herokuapp.com/)
- HTMLをslimに変換してくれる（※インデントが時々おかしい）

# On Rails
##### [[未知の技術探訪]第４回テンプレートエンジンSlimについて調べていじってみた | Fujitaiju Blog](http://fujitaiju.com/blog/technology/ruby/%E6%9C%AA%E7%9F%A5%E3%81%AE%E6%8A%80%E8%A1%93%E6%8E%A2%E8%A8%AA%E7%AC%AC%EF%BC%94%E5%9B%9E%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3slim%E3%81%AB/)
- [Rails4 + Slim + Backbone.jsでプリチーなブログシステムをつくってみる Vol.1 | srock.record](http://blog.srockstyle.com/programming/104/)
s3cmdでgzip圧縮されたファイルを標準出力に表示する


## gzip圧縮されたファイル
```
s3cmd get s3://${bucket_name}/logs/20140122_0.gz - | zcat
```

## 圧縮されていないファイル
```
s3cmd get s3://${bucket_name}/logs/20140122.txt -
```
画面再表示の度に処理を行う（AndroidのonResume）


とても簡単でした。
NotificationCenterに登録しておくだけです。

```ObjC
[[NotificationCenter defaultCenter]
	addObserver:self
	selector:@selector(someMethod)
	name:UIApplicationDidBecomeActiveNotification
	object:nil];
```

`removeObserver`するのも忘れないようにしましょう。
Rails + bootstrap


## 環境
* Rails 3.2.16
* ruby 1.9.3p484
* gem 1.8.23
* rake 10.1.1

## インストール手順
$ rails new bootstrap_test
$ cd bootstrap_test
$ rails g scaffold book title:string value:integer
$ rake db:migrate
$ vim Gemfile

```
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'less-rails'
  gem 'twitter-bootstrap-rails'
  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
end
```
$ bundle install
$ rails g bootstrap:install
$ rails g bootstrap:layout application fluid
$ rails s
Railsで絶対レコードあるのにUser.find(1)でActiveRecord::RecordNotFoundとなってしまう場合

```
Couldn't find User with id=1 [WHERE "user"."type" IN (0)]
```

のようなエラーで「なぜ指定していないtypeが条件に入っているの？」とハマってしまったのでメモ。typeは予約語でした。既存のDBに接続して使っていたので気づけませんでした。

[Rails - ActiveRecordで&quot;type&quot;という名前のカラムがあるとエラーが出る場合の対応 - Qiita [キータ]](http://qiita.com/ryonext/items/1a813639ab2a2a00058e) にあるように、

```rb:/app/models/user.rb
self.inheritance_column = :_type_disabled
```

を指定すれば治りました。ネーミングルールこわい……。
RailsでDKIM署名付きメールを送る


RailsでDKIM署名付きメールを送る方法です。迷惑メール対策のためにも対応したいですね。

参考：
https://my.spamexperts.com/kb/33/Generate-DKIM-certificate.html
https://github.com/jhawthorn/dkim

## 鍵を作成

### 公開鍵

```
 openssl genrsa -out example.com.key 1024
```

### 秘密鍵
```
  openssl rsa -in example.com.key -out rsa.public -pubout -outform PEM
```
秘密鍵はconfig直下に置いておきます。

## DNSレコードを設定
```
default._domainkey  TXT  "v=DKIM1; k=rsa; p=1行にまとめた公開鍵;"
```
頭につけたdefaultは何でもいいです。後で設定するselectorと合わせます。

## dkim gem
###gemをインストール

```
gem install dkim
```

### 設定ファイルを作成

```ruby:config/initializers/dkim.rb
Dkim::domain      = 'example.com'
Dkim::selector    = 'default'
Dkim::private_key = open('config/example.com.key').read
ActionMailer::Base.register_interceptor(Dkim::Interceptor)
```
ここのDKIM::selectorは上記で説明したように、DNSにて指定した文字列にあわせます。

## 確認
railsからgmailなどにメールを送ってみてソースを確認します。
下記のような文言が入っていれば大丈夫です。

```
Authentication-Results: mx.google.com;
  dkim=pass xxxxxx
```
【SQL腕試し問題！】締め切り日が近いイベントの一覧の取得するSQLを書いて下さい


## はじめに
先日、簡単そうに見えて意外と難しいSQLに遭遇したので、SQLの腕試し問題として出題してみます。
みなさん奮って答えを考えてみて下さい！！


## 要件
- イベントとスケジュールという二つのモデル(テーブル)がある。
- イベントは複数のスケジュールを持つことができる。
- スケジュールを一件も持たないイベントもある（スケジュール未定のイベント）。
- スケジュールには締め切り日が設定されている。
 - イベント単位で同じ締め切り日は複数存在しないものとする。
- 次のような条件でイベントとスケジュールの一覧を出したい。
 - システム日付以降に締め切り日がある、またはスケジュール未定のイベントのみを表示する。
 - スケジュールが複数あるイベントはシステム日付に最も近い締め切り日のスケジュールのみを表示する。
 - 締め切り日順に並び替える（締め切り日が近いほど上）。ただしスケジュール未定であれば一番下に表示する。
 - 締め切り日が同じであればイベントID順に並び替える（IDが小さいものほど上）。

## 例

### イベントテーブル
|id|name|
|:--|:--|
|1|Completed event|
|2|No schedule event|
|3|Continuing event|
|4|Future event 1|
|5|Future event 2|

### スケジュールテーブル
|id|event_id|due_date|
|:--|:--|:--|
|1|1|2014/01/23|
|2|3|2014/01/01|
|3|3|2014/02/01|
|4|3|2014/03/01|
|5|4|2014/01/24|
|6|4|2014/01/25|
|7|5|2014/01/24|

### 期待する出力結果(システム日付が 2014/01/24 の場合)
|event_id|name|schedule_id|due_date|
|:--|:--|:--|:--|
|4|Future event 1|5|2014/01/24|
|5|Future event 2|7|2014/01/24|
|3|Continuing event|3|2014/02/01|
|2|No schedule event| | |

## 制約等
- RDBMSはPostgreSQL 9.2.4とする(推奨)。
 - 解答例を比較しやすいようにRDBMSを固定しようと思いましたが、必須条件ではなく推奨条件とします。他のRDBMSを使ってもOKです。SQL方言やRDBMS固有の関数も自由に使って下さい。
- システム日付は便宜的に以下のSQLで取得できる値とする。

````sql
SELECT MAX(sysdate) FROM sysdate_dummy
````

## スキーマ作成用のSQL

````sql
CREATE TABLE events (
  id integer PRIMARY KEY
  ,name varchar(50)
);

INSERT INTO events VALUES (1,'Completed event');
INSERT INTO events VALUES (2,'No schedule event');
INSERT INTO events VALUES (3,'Continuing event');
INSERT INTO events VALUES (4,'Future event 1');
INSERT INTO events VALUES (5,'Future event 2');

CREATE TABLE schedules (
  id integer PRIMARY KEY
  ,event_id integer
  ,due_date date
);

INSERT INTO schedules VALUES (1,1,'2014/01/23');
INSERT INTO schedules VALUES (2,3,'2014/01/01');
INSERT INTO schedules VALUES (3,3,'2014/02/01');
INSERT INTO schedules VALUES (4,3,'2014/03/01');
INSERT INTO schedules VALUES (5,4,'2014/01/24');
INSERT INTO schedules VALUES (6,4,'2014/01/25');
INSERT INTO schedules VALUES (7,5,'2014/01/24');

CREATE TABLE sysdate_dummy (
  id integer PRIMARY KEY
  ,sysdate date
);

INSERT INTO sysdate_dummy VALUES (1,'2014/01/24');
````

## 解答方法
- 実行方法は自由ですが、[SQL Fiddle](http://sqlfiddle.com/)を使うとお手軽かもしれません。
- SQLができたら[gist](https://gist.github.com/)や[SQL Fiddle](http://sqlfiddle.com/)のURLをこの記事のコメントに	貼り付けて下さい。工夫した点やアピールポイントがあればご自由にどうぞ。

![Screen Shot 2014-01-24 at 5.58.31.png](https://qiita-image-store.s3.amazonaws.com/0/7465/35410a58-e980-e142-395c-eebbe666f18f.png "Screen Shot 2014-01-24 at 5.58.31.png")

## その他
- 優勝者には素敵な商品が・・・出ません。順位を付ける予定もありません。各自、自己満足の世界でSQLを作って下さい。
- この課題はとあるRailsの案件で必要になったSQLをベースとしています。Rails開発者の人はActiveRecordを使うならどうするか、というのを考えてみると良いかもしれません。

## 僕の解答例
僕はこんな感じで作ってみました。うーん、そこそこ複雑ですね～。
あ、自力で答えを考えたい人はまだ見ないで下さいね！！

- http://sqlfiddle.com/#!12/0bea5/2

SQLだけ見たい人はこちらをどうぞ。

- https://gist.github.com/JunichiIto/8588344

## 最後に
それではみなさん、Let's try!!
Python 3.4 から標準ライブラリに入る Enum 型が今からでも便利


今年3月にリリース予定の Python 3.4 から、 enum が追加されます。
([ドキュメント](http://docs.python.org/3.4/library/enum.html))

Python 2.4 から使えるバックポートが開発されており、 `pip install enum34` でインストールできます。

## enum が欲しい理由

今までも例えばこんな方法で定数を定義していました。

```python
class Spam:
    FOO = 1
    BAR = 2
    BAZ = 3
```

しかし、この方法には以下のような問題点があります。

* デバッグ時など、ただの整数値が表示され、意味が分かりにくい
* 値から名前を引く方法を自作しないといけない
* 列挙する方法も自作しないといけない

アドホックに解決したり、ライブラリがあったりしたんですが、これくらい標準ライブラリに欲しいですよね。で、標準ライブラリに入ったんだから、使いましょう。

## シンプルな使い方

`namedtuple` と同じく、最初に形名、次に名前の一覧のリスト、あるいは空白区切りの文字列を渡すと、勝手に1から順番に値が割り振られます。

できた型は、属性、呼び出し、添字の3種類の方法で、要素にアクセスできます。

```python
>>> import enum
>>> Foo = enum.Enum("Foo", "foo bar baz")
>>> Foo.foo
<Foo.foo: 1>
>>> Foo(1)
<Foo.foo: 1>
>>> Foo["foo"]
<Foo.foo: 1>
>>> isinstance(Foo.foo, Foo)
True
```

要素には name と value という属性があります。

```python
>>> Foo.foo.value
1
>>> Foo.foo.name
'foo'
```

要素自体はその値と区別されます。全ての要素はクラス生成と同時に1つだけ作られる singleton なので、 `==` ではなく `is` で比較できます。

```python
>>> Foo.foo == 1
False
>>> Foo.foo is Foo(1) is Foo["foo"]
True
>>> Foo.foo is Foo(1)
True
```

イテレートもできます。

```python
>>> for m in Foo:
...     print(m)
...
Foo.foo
Foo.bar
Foo.baz
```

## 任意の値を利用する

`Enum` を呼び出すのではなく継承したクラスを定義することで、1からの連番ではなく任意の値を要素に割り当てることができます。

```python
>>> class Bar(enum.Enum):
...     foo = 'x'
...     bar = 'y'
...     baz = 'z'
...
>>> Bar.foo
<Bar.foo: 'x'>
```

### Python 2 での制限

Python 2 では、クラスの要素の定義順を利用する方法が(基本的には)ありません。
for 文で列挙するときに定義順を維持したい場合は、 `__order__` という属性を定義しておきます。これは Python 2 対応のための、 enum34 による拡張であり、 Python 3.4 の enum モジュールでは何もしなくても定義順が保存されます。

```python
>>> class Bar(enum.Enum):
...     __order__ = 'foo bar baz'
...     foo = 'x'
...     bar = 'y'
...     baz = 'z'
...
>>> list(Bar)
[<Bar.foo: 'x'>, <Bar.bar: 'y'>, <Bar.baz: 'z'>]
```

## 要素を整数として扱う

要素が直接整数として振る舞うと便利なことありますよね。その場合は IntEnum を使えます。

```python
>>> class Foo(enum.IntEnum):
...     foo = 1
...     bar = 3
...     baz = 5
...
>>> Foo.foo == 1
True
>>> Foo.foo + 2
3
>>> Foo.foo < Foo.bar
True
```

実は、 IntEnum の定義はたったこれだけです。

```python
class IntEnum(int, Enum):
    """Enum where members are also (and must be) ints"""
```

このように、要素に持たせたい振る舞いを継承で持たせることができます。

```python
>>> class Bar(str, enum.Enum):
...     foo = 'x'
...     bar = 'y'
...
>>> Bar.foo + Bar.bar
'xy'
```

これは便利な半面、動的型付けの Python では、ある変数が持っているのが Enum の要素なのか、純粋な値型なのかわかりにくくなるという危険があります。節度を守って使いましょう。

## in について

IntEnum を使っても、整数値と Enum 型の間に直接 `in` を使ってその整数値に対応する Enum の値があるかどうかはわかりません。 `in` が使えるのはその Enum 型の要素だけです。

```python
>>> class Foo(enum.IntEnum):
...     foo = 3
...     bar = 7
...
>>> 3 in Foo
False
>>> Foo.foo in Foo
True
```

EnumMeta を継承してカスタマイズしたり、非公開APIを直接叩けばなんとでもなりますが、そんなお行儀の悪いことはしないで、普通に呼び出して例外でチェックしましょう。

呼び出しで値が見つからなかった時は `ValueError` が投げられます。
名前から要素を引くときは、同じように添字記号と `KeyError` を使うことができます。

```python
>>> Foo(2)
ValueError: 2 is not a valid Foo
>>> Foo['xyzzy']
KeyError: 'xyzzy'
```

ただし、公開 API として名前をキーに、要素を値にした辞書が `__members__` という名前で用意されているので、名前で引くときは `in` とか `.get()` とか普段の dict 操作も使えます。

```python
>>> Foo.__members__
{'foo': <Foo.foo: 3>, 'bar': <Foo.bar: 7>}
>>> Foo.__members__['foo']
<Foo.foo: 3>
>>> 'xyzzy' in Foo.__members__
False
```
JavaScriptで選択した要素を配列から削除する方法 AngularJS編

## 背景
JavaScriptにおけるMV*なフレームワークが色々出てくるが、往々にして、チュートリアルはToDoアプリであったりする。私も含めてだが、サンプル作成してるようなDeveloper連中なんて、本来そんなにToDo管理したがるようなタイプじゃないと思うのだけど、お前らどんだけToDo好きなんだ、と言いたい。

ただ、確かにToDoアプリは下記の要件を含むことになるので、HelloWorldの次には丁度良いのだろう。

- タスクの繰り返し表示(forEach的なもの)
- タスクの作成/表示/更新/削除(CRUD)

しかも1画面で完結するし、データ構造は簡単なので、MV*のうち、最も特色が出やすい*の説明をしやすいのだろう。

## 本題
背景が無駄に長くなった。

別にToDoアプリが多すぎることにケチ付けたい訳ではない。

作成したタスクの削除処理において、「配列から選択された要素をどうやって削除するか」という部分が面白いのだ。単純化すると、下記におけるremove関数の実装を作成しろ、と言っているのに等しいのだが、

```js
var task1 = {}, task2 = {}, task3={}, tasks = [task1, task2, task3];

function remove(arr, target){
  // remove(tasks, task2) の結果が[task1, task3]となるよう実装してください.
}
```

上記は(Ecma 5thでないブラウザまで含めて考えると)、実はあまり綺麗には書くことが出来ない。

Angularの場合はng-repeatディレクティブ中から$indexで要素番号が取得できるので、タスク削除は下記のようになる。

```html:
<div ng-controller="HogeCtrl">
	<ul ng-repeat="item in someList">
		<li class="task">{{item.name}}<button ng-click="remove($index)">remove</button></li>
	</ul>
</div>
```

```js:HogeCtrl.js
function HogeCtrl($scope){
	$scope.someList = [
		{name: 'foo'},
		{name: 'bar'}
	];

	$scope.remove = function(i){
		$scope.someList.splice(i, 1);
	};

}
```

ToDoのタスク削除を例に説明したが、上記のように「ng-repeatループ中で、$indexをコントローラの引数に渡すパターンは、よく出てくるので覚えておいて損はないはず。

## 参考・補足

- http://todomvc.com/ は色々なMVC派生フレームワークによるToDoアプリがあるので、コードの比較ができる.
- Ecma 5thであっても、Array.indexOfは線形探索なので、最初からindexが使える方が高速。
- jQueryだったら下記ですね。

```js:jQuery
$('li.task button').click(function(){
  $(this).parents('.task').remove();
});
```
pacman 4.1 からの VCS source な PKGBUILD の書き方

pacman 4.1 より前、VCS source な PKGBUILD は、リポジトリをチェックアウトしてそれを別のディレクトリにコピーしてからビルドするテンプレな処理を build 関数内に書いたり、pkgver に直接リビジョン番号や日付を設定したりしていた。
しかし、pacman 4.1 からは VCS source のサポートが強化され、PKGBUILD の推奨される書き方が変わった。

source に直接リポジトリの URL を書けるようになり、build 関数内でチェックアウトの処理を書くことは非推奨となった。source の書式は https://wiki.archlinux.org/index.php/VCS_PKGBUILD_Guidelines#VCS_sources に書いてある。VCS source を指定した場合、`makepkg -g` のとき md5sums には 'SKIP' と書かれる。

また、pkgver を設定する pkgver という関数を定義できるようになり、これを使うことが推奨されている。pkgver 関数は PKGBUILD を書く人が自由に定義できるが、どのような pkgver 関数を書くべきか VCS 毎のガイドラインが示されている https://wiki.archlinux.org/index.php/VCS_PKGBUILD_Guidelines#The_pkgver.28.29_function 。
mod_fcgid で UnicodeEncodeError を解決出来ない時の対処法

Djangoをmod_fcgidとApacheで動かしていて、

　　UnicodeEncodeError: 'ascii' codec can't encode characters

のエラーが出る時の対処法。


次の一行を、httpd.confに追加する必要がある。

　　FcgidInitialEnv LANG "ja_JP.UTF-8"


「ソース」
https://code.djangoproject.com/ticket/17686
"django wouldn't get the locale settings of my user. In fact the fcgi script wouldn't, even if my envvars script was properly configured."


とあるように、なぜかenvvarsなどで設定しても効果がない。。。
LC_ALLなど環境変数に"ja_JP.UTF-8"を設定してもダメだった。。


mod_wsgiでは問題がなかったのに。。。
この情報を見つけるのに、数時間も費やしてしまった。
【heroku】herokuに Redmineを立てる(2014/1/24版)【Redmine】


#重要な注意点

無料の範囲内でRedmineを立てようとしているそこのアナタ！
herokuの無料範囲のpostgresqlはレコード数に制限があります。
__10000行__までです。
もし、バッキバキに使いたおす予定でしたら、heroku上に立てるのは諦めましょう。
また、リリース（git push）の度にファイルも消えるのでその点もご注意。

#以下手順

基本的には以下の手順ですが、若干変わっているので、変わった部分を中心に
http://momoto.github.io/blog/2013/05/31/deploy-redmine-2-dot-3-1-on-heroku/

ふむふむと進めて、いざherokuへpush!となったところで、コケる。
エラーメッセージ的に、rubyのバージョンが違う模様。

以下のherokuでのrailsアプリのデプロイ方法を確認。
https://devcenter.heroku.com/articles/getting-started-with-rails3

[こんなこと](https://devcenter.heroku.com/articles/getting-started-with-rails3#specify-your-ruby-version)が書いてある。
heroku側の状況も変わるので、このドキュメントは要ブックマークですね。

```Gemfile
#末尾に以下を追加
ruby '2.0.0'
```

はぁ。なるほど。
これに伴い、ローカルのrubyのバージョンも上げる。

```shell
$ rbenv install 2.0.0-p0
$ rbenv local 2.0.0-p0
```

rubyのバージョンを変えることができたので、bundle installなどなど

```shell
$ bundle install
$ git add .
$ git commit -m "ruby version up"
$ git push heroku produciton:master
```

pushができたら、残りの手順

```shell
$ heroku run rake db:migrate
$ heroku run rake redmine:load_default_data
```

2つめのコマンドでは言語選択が出るので選ぶ
Jenkinsのプロジェクトを自動的に追加する方法

管理するコードリポジトリが増えてくると、リポジトリ追加の度にテスト用のJenkinsプロジェクトを追加するのが面倒くさくなってきます。

もし各リポジトリのテスト方法がほぼ同じで、違うのはリポジトリ名くらいだという場合は、
JenkisのJobcopyBuilderPlugin (https://wiki.jenkins-ci.org/display/JENKINS/Jobcopy+Builder+plugin) を使うと便利です。

上記ページやgithubのREADME.mdを見るとわかりますが、このプラグインを使うとジョブのビルド時に"ジョブのコピー"ができるようになります。
また、コピーしたジョブの設定(config.xml)を一部置換することができます。

これを利用すると、下記のようにすることで、リポジトリ毎に動的にbuild jobを追加して動かすことができるようになります。

1.テスト用ジョブのテンプレートとなるJenkinsプロジェクト(以下 template job)を用意する
2.ジョブ追加兼ジョブ起動用プロジェクト(以下 dispatcher job)を用意する
3.dispatcher jobは"ビルドのパラメータ化"を使って、外からリポジトリ名を渡せるようにしておく
4.dispatcher jobのビルド処理の中でtemplate jobのジョブをコピーする (以下 build job)
5.コピーしたbuild jobのリポジトリの設定を3で渡されるリポジトリ名に置換する
6.dispatcher jobのビルド処理（もしくは、ビルド後の処理）の中で、build jobを起動するようにする

dispater jobの起動時に渡されるリポジトリ名を使って、そのリポジトリ用のbuild jobを作成し、
そのままbuild jobを起動してくれるようになります。
台湾の地方議員活動記録ページをクローンしようとして失敗した話


結論: djangoの起動で失敗しました。

台湾の議員さんの活動を視覚化するアプリとして面白いものがあったので自分でも構築しようとして失敗しました。
今回はその記録。

## 構築対象
これ。
http://twly.herokuapp.com/
http://twly.herokuapp.com/about/


これは議員さんが

* どの法案に関与していて
* 賛成したか、反対したかがわかって
* 結果が一覧で見れる

という機能があります。

## システム
3つの仕組みにわかれています。

* crowler
議員さんの情報を収集して、Postgresに格納する仕組み。

https://github.com/g0v/twly_crawler

* file_handler
crowlerで集めたDB上のデータに対してクエリをかけて、json形式にまとめあげる仕組み。

https://github.com/thewayiam/twly_fileHandler

* voter-guide
Djangoフレームワークを使ってウェブページにまとめる仕組み。

見てみたら、この`voter-guide`にはサンプルデータが付属してるので、単体で動きそうだということがわかりました。今回の作業対象です。

https://github.com/g0v/twly-voter-guide

## 環境
Amazon EC2で、Ubuntu 12.04 LTSのインスタンスを立ち上げてテストしました。

## 手順
Ubuntuでの手順に従っています。

### 0.1 python pip easy_install postgresql をインストール

```
sudo apt-get install python-pip python-dev python-setuptools postgresql     
sudo easy_install virtualenv
```

easy_install にsudoが抜けてました。

### 0.2 データベースにパスワードをかける

```
sudo -u postgres psql -c "ALTER USER postgres with encrypted PASSWORD 'put_your_password_here';"
```

まぁ、そりゃそうだ、ってことでpostgresユーザにDBのパスワードつけました。

### git clone

```
sudo apt-get install git
git clone https://github.com/g0v/twly-voter-guide.git       
cd twly-voter-guide
```

Vanillaな環境だと当然git入ってないので、入れまし。

### virtualenvの指定

```
virtualenv --no-site-packages venv      
source venv/bin/activate        
pip install -r requirements.txt     
```

### サンプルデータの投入

```
sudo su -
su - postgres
cd /home/本来のゆーざあかうんと
createdb ly
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d ly local_db.dump
```

lyデータベースを作って、-U 指定いらないよね、と思いながら、に対してデータのインポート。
たぶん成功した。

### Djangoの起動(ここで失敗)
`local_settings.py`に対して文章を追加すればOKよー、と書かれてるんだけど、ここでよくわからない。

とりあえず`local_settings.py`に対して、指定されているコードを(パスワードなどを差し替えて)追加して、Djangoを起動させてみようとしてみた。

```
python manage.py runserver XX.XX.XX.XX
```

そうすると、`manage.py`の中で指定されている`ly.setting`が無いよー、というエラーが返ってきて、ここでタヒ。

どこでその生成をするのか、よくわかってない。

Djangoとかぜんぜんわかってないので、根本的になんか間違っている気は、する。
Mac に入れてるアプリ一覧


環境移行するときの為の備忘録。
あんまりカスタマイズしない方だったけど３０超えてた。

## カスタマイズ

1. XtraFinder : 標準Finderのタブよりこっちの方が好き。フォルダから Terminal を開けるのが地味に便利。
1. Sublime Text 2 : 常用テキストエディタ
1. CopyPath : Finder で選択したファイルのパスをクリップボードにコピる
1. ClipMenu : クリップボード履歴と定型文呼び出し
1. FreeMemory : メモリ解放してくれる系からテキトーに選んだ
1. Google IME : ATOK 買うお金がない

## ブログ書く時

1. Kobito : Qiita 投稿＆Markdown エディタとして
1. Skitch : スクショ撮り＆注釈入れに
1. ImageOptim : 画像圧縮
1. LICEcap : スクリーンをGIFアニメとして記録できる、便利

## クラウドストレージ

1. Dropbox : おなじみ
1. Bitcasa : 無制限Bytes/$10/Month プラン（既得権益♪）

Evernote、Google Drive、Skydrive は Web で十分。

## チャットとか電話とか

1. Skype : 主にお仕事連絡用
1. Line : 家族連絡用
1. Linphone : 050plus の発着信に使ってたけど最近使えなくなった(泣

## ブラウザ

1. Google Chrome : 常用
1. Firefox : 主にテスト用ですね

## プログラム開発のお仕事で使う

1. Xamarin Studio : Xamarin 推しですから
1. SourceTree : git/hg、SVN も git-svn でやってる
1. Brackets : Web開発はこれで
1. Eclipse : 仕方なく
1. Xcode : 仕方なく
1. astah community : UML 描くのに
1. MacWinZipper : 日本語が化けないZIP圧縮/解凍ツール

## その他

1. VMware Fusion : Windows 使う時はこれで
1. Sophos Anti-Virus : 一応のセキュリティ担保
1. Fitbit Connect : Fitbix Flex 買ったら付いてきた
1. Keynote : 買ったけど最近使ってないなあ
1. VLC : 定番
1. HandBrake : 定番
1. Cyberbuck : FTP とか S3 とか
1. radikoro : たまにラジオ聴いてる

Word や Excel は、VMware の Windows で使ってます。Office の Mac版使うよりストレス溜まりません。
多次元配列を関数に渡す

こんなタイトルだと、
そもそも C に多次元配列はないとか、
関数に配列は渡せないなどと怒られそうだな。ごめんなさい。

サイズ指定のない2次元配列を渡せるようにする。
3次元以上も同じようにできると思う。多分。おそらく。きっと。

### 上手くいった例
2次元配列の各要素(配列)の先頭アドレスを格納した配列を用意し、
その配列の先頭アドレスを関数に渡している

もっと簡単な方法があるのかな。

```c
#include <stdio.h>

void push(int **A);

int main(void){
    int A[3][3];
    int i,j;

    int *B[3];
    for (i=0;i<3;i++) B[i] = A[i];
    push(B);

    for (i=0;i<3;i++){
        for (j=0;j<3;j++) printf("%d ",A[i][j]);
        puts("");
    }   
    return 0;
}

void push(int **A){
    int i,j,k;
    for (i=0,k=0;i<3;i++){
        for (j=0;j<3;j++,k++) A[i][j] = k;
    }   
}
```

### 間違った例
次のコードはコンパイル時に警告が出て、実行すると Segmentation fault になる。

```c
#include <stdio.h>

void push(int **A);

int main(void){
    int A[3][3];
    int i,j;

    push(A); // 型が違う

    for (i=0;i<3;i++){
        for (j=0;j<3;j++) printf("%d ",A[i][j]);
        puts("");
    }   
    return 0;
}

void push(int **A){
    int i,j,k;
    for (i=0,k=0;i<3;i++){
        for (j=0;j<3;j++,k++) A[i][j] = k;
    }   
}
```

```
警告: 互換性のないポインタ型から 1 番目の ‘push’ の引数に渡しています
備考: expected ‘int **’ but argument is of type ‘int (*)[3]’
```

### 追記 C++ の場合
多次元配列をラップするクラスを定義してその参照を関数に渡すっていう方法がありそう。

```cpp:DoubleArray.h
class DoubleArray {
    // N*M の配列
    int N;
    int M;
    int *top; // 先頭の要素のポインタ
public:
    DoubleArray(int *p,int n,int m); 
    int *operator[](int i); 
    int getN();
    int getM();
};
```

```cpp:DoubleArray.cpp
#include "DoubleArray.h"

DoubleArray::DoubleArray(int *p,int n,int m){ 
    top = p;
    N = n;
    M = m;
}

int *DoubleArray::operator[](int i){ return top + M*i;}

int DoubleArray::getN(){ return N;} 

int DoubleArray::getM(){ return M;} 
```

```cpp:main.cpp
#include <iostream>

#include "DoubleArray.h"

using namespace std;

void push(DoubleArray &D);

int main(){
    int A[3][3];
    DoubleArray D(&A[0][0],3,3); // ここがちょっとかっこわるい
    push(D);

    for (int i=0;i<D.getN();i++){
        for (int j=0;j<D.getM();j++) cout << D[i][j] << ' ';
        cout << endl;
    }   

    return 0;
}

void push(DoubleArray &D){
    for (int i=0,k=0;i<D.getN();i++){
        for (int j=0;j<D.getM();j++,k++) D[i][j] = k;
    }   
}
```

### 追記(2)
[プログラミング言語 C の新機能](http://seclan.dll.jp/c99d/c99d04.htm#dt19990719)
にある可変長配列を使うことで解決した気がする。
こんなコードが許されるとは思わなんだ。

http://ideone.com/YSor1d

### 追記(3)
C++ では可変長配列がサポートされていないっぽい。。。 orz

[c++ Wikipedia](http://ja.wikipedia.org/wiki/C%2B%2B) より

```
C99では、可変長配列、複素数型の組み込み変数、指示初期化子、複合リテラルといった、
C++でサポートしていない数多くの新機能が追加された
```

http://ideone.com/at6bCw

可変長配列使おうとするとコンパイルエラーになった。
iTermでsshするときに、接続先に応じて背景色を変える方法

自分の場合は[これ](https://gist.github.com/thomd/956095)を利用させて頂いてます。
使い方は簡単で、どこでもいいから適当にリンク先のコードをファイルに書き出して置いておく。
例だと~/bin/ssh-host-color となっているので自分もそうしている。
特にPATHが通っている必要はない。
ポイントはコード中の

```bash
if [[ "$@" =~ thomd ]]; then
  set_term_bgcolor 40 0 0
elif [[ "$@" =~ git ]]; then
  set_term_bgcolor 0 40 0
fi
```

で、ifの中のthomdやgitに当たる箇所を変更する。
実際にsshコマンドの中に含まれている文字列を書いておくことで、それに反応してset_term_bgcolorが実行される。
set_term_bgcolorの後の数字はRGBに当たる数字になっているので、自分でお好みの色を指定すればよい。

配置したらパーミッションを実行可能にしておく。

```bash
$ sudo chmod 744 ~/bin/ssh-host-color 
```

次に、シェルの設定にエイリアスを追加。
自分の場合はzshなので、例えば.zshrcに

```zsh
alias ssh=~/bin/ssh-host-color
```

を追記しおく。

```bash
$ source .zshrc 
```

やiTermを再起動すれば、設定が反映される。
自分は、本番サーバーでは背景を赤っぽくしている。
ひと目で識別できるし、開きっぱなしにしているとソワソワするので良い。
指定のjsファイルにfingerprintsを付ける方法

http://it.sifr.me/ruby-on-rails-asset-pipeline/
を見ると詳しく載っている。
fingerprintsとはJSのキャッシュをうまく利用する為の
一意性を確保する為の仕組み。よく「?20120101」とかJSファイル読み込みの末尾に付けるようなもの。

production.rbに下記でtest.jsにfingerprintsがつく。
config.assets.precompile += %w( test.js )

scriptタグはこんな感じになるはず

```html
<script src="/assets/test-907fdc4e5e9e00d0f032e2feef246f6b.js"></script>
```
facebookの評判をチェックできるサイトを作りました

http://fb-checker.tanihiro.com/

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/3223/b5de5a28-51ba-2301-ee46-837eb9894464.png)

## どんなサイトか

URLを入力して、そのURLのいいね数の内訳（share, like, comment）の数を表示します。

なおかつ、facebook上で公開範囲が全体になっている投稿からURLをキーワードにして検索をし、投稿を表示します。

## 作ろうと思ったきっかけ

FQLでなにか面白い値取れないかと調べていたら、URLのいいね数の内訳が取ってこれたので、それを調べられるツールを作ろうと思い立ったのがきっかけです。

それだけでは面白くないので、SearchAPIも使って投稿を取得し、評判をチェックできるようにしちゃおうと。

学生時代以降全く触っていなかったFireWorksを使って、自分でデザインもしました。（久々すぎて全然使い方わからなくなっていた）

## まとめ

これを使えば、自分のサイトがFacebook上でどれだけ話題になっているかをほんのり知ることができるので、ぜひ使ってみてください。
mavenやantでEclipseのコンパイラーを使う


# mavenの場合
\<compilerId\>とplexus-compiler-eclipseがポイントになります。 
forceJavacCompilerUseなど相反するオプションを付けては駄目です。

```pom.xml
<build>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.1</version>
      <configuration>
        <compilerId>eclipse</compilerId>
        <verbose>true</verbose>
        <source>1.7</source>
        <target>1.7</target>
      </configuration>
      <dependencies>
        <dependency>
          <groupId>org.codehaus.plexus</groupId>
          <artifactId>plexus-compiler-eclipse</artifactId>
          <version>2.3</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>
```

以下のプロジェクトは、Eclipseコンパイラーではコンパイルエラーにはならず、javacではコンパイルエラーになるサンプルです。
https://github.com/ko2ic/spike-maven-with-eclipse-compiler

# antの場合
コンパイルタスクの前にJDTCompilerAdapterを指定する

```build.xml
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
```

JDTCompilerAdapterがあるjarは、以下のように探してます。

```grepEclipseCompiler.sh
#!/bin/sh
find . -name "*.jar" | while read jar
do
    count=$(jar tf $jar | grep jdtCompilerAdapter | wc -l)
    if [ $count -gt 0 ];then
        echo $jar
    fi
done
```
```
$ cd eclipse/plugins
$ sudo ./grepEclipseCompiler.sh
./org.eclipse.jdt.core.source_3.9.1.v20130905-0837.jar
./org.eclipse.jdt.core_3.9.1.v20130905-0837.jar
```
Google App Engineでデプロイ中に切断せざるを得なくなった後の問題を解消する方法


普段Google App Engineを使っている人には当然なのかもしれないけど、今回ハマったので、メモ代わりに投稿。ちなみに使っていたのはGoogle App Engine for Goです。

# デプロイ作業中に中断したとき

マシンが固まりそうだったので、「よろしくないな」と思いつつ、デプロイ作業を中断した結果の画面が以下。

```
$ goapp deploy -oauth

09:22 PM Application: takuan-osho; version: 1
09:22 PM Host: appengine.google.com
09:22 PM 
Starting update of app: takuan-osho, version: 1
09:22 PM Getting current resource limits.
09:22 PM Scanning files on local disk.
09:22 PM Cloning 14 static files.
09:22 PM Cloning 90 application files.
^Cgoapp: caught SIGINT, waiting for appcfg.py to shut down
09:22 PM Interrupted.
error while running appcfg.py: exit status 1
```

はい、中断されました。

# 再度アップロードし直そうとして失敗

で、もう一回デプロイし直そうとしたら、以下。

```
$ goapp deploy -oauth
09:22 PM Application: takuan-osho; version: 1
09:22 PM Host: appengine.google.com
09:22 PM 
Starting update of app: takuan-osho, version: 1
09:22 PM Getting current resource limits.
09:22 PM Scanning files on local disk.
Error 409: --- begin server output ---
Another transaction by user shimizu.taku is already in progress for app: s~takuan-osho, version: 1. That user can undo the transaction with "appcfg rollback".
--- end server output ---
error while running appcfg.py: exit status 1
```

`appcfg rollback`してやり直せ、タコ！というエラーが出たので、それに従いましょう。そう思い、やろうとしたら、`appcfg`なんて無いよー！という事態に。

# 実は単純なことだった

最初に書いていたように使っていたのはGoogle App Engine for Goなのですが、Google App Engine SDK for Goに含まれているのは`appcfg`じゃなくて`appcfg.py`でした。

なので以下のような使い方で同じように使えます。<directory>のところは`app.yaml`とかGoogle App Engineの設定ファイルが置いてあるディレクトリを指定すれば良いはずです。

`appcfg.py [options] rollback <directory> | <file>`

記憶が確かなら、`appcfg`なのはPythonの方のSDKで、Google App Engine SDK for Goの内部ではPython使っていてエラーメッセージがPythonの方と共通だから少し齟齬が発生していたのかな？と予想します。

で、以下のようにして無事ロールバックできて、デプロイもちゃんと出来るようになりました。

```
$ appcfg.py --oauth2 rollback .
09:22 PM Application: takuan-osho
09:22 PM Host: appengine.google.com
09:22 PM Rolling back the update.
```

めでたしめでたし。
【質問】XcodeのStatic Libraryでテストが実行できない


どなたか教えてください...

Static Libraryからframeworkを作成するため以下の資料をベースに作業しました。
http://www.value-ark.com/engineer/1273/

作業概要は以下です。
Xcodeは5.0.2です。

1. Aggregateターゲットを追加
2. Info.plistを追加
3. framework作成用のスクリプトを追加

以上の手順で無事frameworkの作成はできたのですが、デフォルトのターゲット（プロジェクト名と同じもの）で実行できていたユニットテストができなくなってしまいました。
（ユニットテストは``⌘U``で実行しています）

テスト実行時のエラーメッセージはこのようなものが出ます。

* 32bitシミュエレータの場合  

```Bash
ld: can't map file, errno=22 file '/Users/hoge/Library/Developer/Xcode/DerivedData/LibraryProject-czophcenhelclxaoytzvvoyrmrqg/Build/Products/Debug-iphonesimulator/' for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
* 64bitエミュレータの場合  

```Bash
ld: can't map file, errno=22 file '/Users/hoge/Library/Developer/Xcode/DerivedData/LibraryProject-czophcenhelclxaoytzvvoyrmrqg/Build/Products/Debug-iphonesimulator/' for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

シミュレータ向けアーキテクチャのビルドがうまくいってないのかな？？と思ってますがこの先に何をすれば良いのかがわかりません。

ビルド設定については以下のとおりです。
デフォルトから変えていないはずです。
![スクリーンショット 2014-01-23 23.08.19.png](https://qiita-image-store.s3.amazonaws.com/0/6061/13785e09-7818-20be-1e7d-2ea001e898c1.png "スクリーンショット 2014-01-23 23.08.19.png")

困ってます。どなたかユニットテストの実行方法を教えてください！
よろしくお願いします。
[Rails]「clipboardにコピーする」ボタンを超簡単に設置

## 概要

Githubでおなじみのアレですね。

![スクリーンショット_2014_01_23_14_11.png](https://qiita-image-store.s3.amazonaws.com/0/8790/076c4f80-bb27-ba26-a497-98cde4d670e2.png "スクリーンショット_2014_01_23_14_11.png")

これ。

zeroclipboard-railsというgemを使えば一発です。

zeroclipboard-rails
https://github.com/zeroclipboard/zeroclipboard-rails


## 導入手順

Gemfileに追記して、

```ruby:Gemfile
gem 'zeroclipboard-rails'
```

インストール。

```sh
$ bundle
```

application.jsに以下追記。

```assets/javascripts/application.js
//= require zeroclipboard

$(document).ready(function() {
  var clip = new ZeroClipboard($("#d_clip_button"))
});

```

あとはコピー領域（textarea）と、コピーボタン（button）を用意するだけ。

```html:erb
<div>
  <textarea id="fe_text" name="" rows="7" cols="100">コピー領域</textarea>
  <button class='my_clip_button' data-clipboard-target='fe_text' data-clipboard-text='Default clipboard text from attribute' id='d_clip_button'>
    <b>コピーする</b>
  </button>
</div>
```

超簡単！
[Rails] 各helperが全てのviewから読み込めてしまうのを禁止する


### Rails 3.1以上

1行追加するだけ。

```config/application.rb

module FooApp
  ~
  class Application < Rails::Application
    config.action_controller.include_all_helpers = false
  ~
  end
end

```

### Rails 3.1未満

1行削除するだけ。

```app/controllers/application_controller.rb
helper :all   # 削除する
```


## 参考
Why are all Rails helpers available to all views, all the time? Is there a way to disable this?
http://stackoverflow.com/questions/1179865/why-are-all-rails-helpers-available-to-all-views-all-the-time-is-there-a-way-t
GeoDjangoトラブルシュート


django.contrib.gisを使っていて不可解なエラーに何度か遭ったのでメモ。


# String or unicode input unrecognized as WKT EWKT, and HEXEWKB.

StringまたはUnicodeオブジェクトをPointやPolygon等のGEOSオブジェクトに変換する際、変換に失敗した場合に出るエラー。GeoJSONを利用している場合はオブジェクトの変換にGDALが必要となる。


# django.contrib.gis.geos.error.GEOSException: Could not parse version info string "3.4.2-CAPI-1.8.2 r3921"

DjangoとGEOSのバージョンがアンマッチしていると起きる（手元ではDjango 1.4 + GEOS 3.4.2の組み合わせで発生）。stackoverflowではdjangoにパッチを当てて回避する例が紹介されている。

* [GeoDjango GEOSException error](http://stackoverflow.com/questions/18643998/geodjango-eosexception-error)