OmniAICreator/Qiita-1.07M huggingface dataset:
PackerでArchLinuxのbox作った

* [my-packer-template-files / archlinux](https://github.com/tukiyo/my-packer-template-files/tree/master/archlinux)

# 使い方

```bash:
git clone https://github.com/tukiyo/my-packer-template-files.git
cd my-packer-template-files/archlinux
sh iso_download.sh
packer build archlinux-x86_64.json
```

* archlinux-x86_64.box が作成されます。

```bash:
vagrant box add base archlinux-*box
```

最新版のvagrantは以下からダウンロード
http://www.vagrantup.com/downloads.html

# ビルド済みbox

* [archlinux-x86_64.box](https://www.dropbox.com/s/slg946fk72ga1ne/archlinux-x86_64.box?dl=0)
Android で lombokを使う際に少しだけ楽になる方法

lombok.config という便利なものを最近知りました

なのでまあ「lombok.config」に `lombok.anyConstructor.suppressConstructorProperties = true` って書いとけっつー話しです

### Androidでこいつはコンパイル通らない

```java
@Value
public class Sample {
  private String hoge;
  private String fuga;
}
```

よくこんなコード書くと思いますが、Androidではコンパイル通りません

```
@Value
^
symbol:   class ConstructorProperties
location: package java.beans
          /home/daneko/Dropbox/projects/android/sample/app/src/main/java/com/example/sample/Sample.java:7: error: cannot find symbol
@Value
^
symbol:   class ConstructorProperties
location: package java.beans
          1 error
          :app:compileDebugJava FAILED

```

エラーの通り`java.beans.ConstructorProperties`が無いからです。残念。

### こうするとコンパイル通る

```java
@Value
@AllArgsConstructor(suppressConstructorProperties = true)
public class Sample {
    private String hoge;
    private String fuga;
}
```

[ここ](http://projectlombok.org/features/Constructor.html)とかに記載されているとおりですね

とは言うものの… ConstructorProperties 使うもの全てにいちいちこのアノテーション書くのだるいですね

そんなどこまでも怠惰な僕らのために、lombok神は1.14から（だよね）[このようなもの](http://projectlombok.org/features/configuration.html)を用意してくれていました

### 結論

project rootに
```lombok.anyConstructor.suppressConstructorProperties = true
```
って書いた `lombok.config`つーファイル置いとけば `suppressConstructorProperties = true` って書かなくて済む

### 注意

なお intellij idea の lombok plugin は lombok.configに対応していません
どうやら作業自体は進んでいるっぽいので正座して待ちましょう

まー、 `lombok.anyConstructor.suppressConstructorProperties` だけなら対応しててもしてなくても関係ないですけど
DockerでPentahoを動かしてみる

OSSのBIツール Pentaho のイメージが [Docker Hubにあった](https://registry.hub.docker.com/u/wmarinho/pentaho-biserver/) ので動かしてみた。

[こちら](https://github.com/wmarinho/docker-pentaho)の手順をベースにセットアップする。Dockerが起動している状態で、下のようにPentahoイメージをダウンロードし起動する。

```shell-session
$ docker run --name pentaho -d -p 8080:8080 wmarinho/pentaho-biserver:5.1-TRUNK
```

Mac OS上VitualBoxでboot2dockerしている場合、Macからポート8080にアクセスできるようにしておく。

```shell-session
$ VBoxManage controlvm "boot2docker-vm" natpf1 "ssh to android-sbt,tcp,127.0.0.1,8080,,8080"
```

localhost:8080 にアクセスし、"Login as an Evaluator"というドロップダウンをクリックするとテスト用のログインアカウント情報が表示される。
アカウント情報の一つ `Admin` でログインし、画面中央下の方にある"Check samples"をたどるといくつか例をみることができた。

例えば Public/Steel Wheels/Dashboards/Home Dashboard という画面をみると、簡単なドリルダウンができるレポートが表示された。

左上のビュー切り替えから"Home"や"Opened"などのビューに切り替えられる。
開いているレポート一覧は"Opened"ビューから確認でき、このビューのレポート毎のタブの右クリックメニュー「ディープリンクを作成」を選ぶと、他の人に共有するためのURLを表示することができた。

---
Reference:
- http://forums.pentaho.com/showthread.php?165218-Pentaho-Rapid-Deployment-with-Docker
ブラウザで大きな画像の描画をキャッシュするプリレンダリング


巨大な画像をスムーズに表示する素敵なバッドノウハウの共有です。

大きい画像を事前にプリロードしておくことは普通にやっていると思いますが、大きい画像ってのは描画コストも当然に大きいです。DOMに配置してから、ほんのわずかですがタイムラグが発生します。すばやく画像を切り替えるような演出だとチラついたりしちゃって興ざめですね。そういった時に有効なのがプリレンダリングです。

ブラウザにそんなものあるのかっていうと、たぶんないです。勝手にそう呼んでるだけで、ようするに事前に画像を描画させてキャッシュしておこうということです。

![pre-render.png](https://qiita-image-store.s3.amazonaws.com/0/20773/668d74bc-06d3-6dbe-a1e9-8d64634636d3.png "pre-render.png")
_体型は変わりません_

デモ
-------------------
ごく普通にプリロードのみ実装したものから。

### プリレンダリングなし
http://nenji.ru/_/prerender/pre-load.html

さっそうとモデルウォークしてるミクさんがいますね。さすが40コマ、ぬるぬるです。
ちなみに画像サイズは 450×450 なので、高さ 18450px の画像てことになりますね。おそろしい。

リンク先の walk ボタンを押下すると run アニメーションに切り替わるのですが、切り替わる瞬間にチラつく環境がほとんどだと思います。

![none-prerender.png](https://qiita-image-store.s3.amazonaws.com/0/20773/18ab8437-3587-bf7b-557e-dcd150ab927c.png "none-prerender.png")

たとえプリロードしていても、これだけ大きな画像だと描画に時間がかかります。
すばやく表示を切り替えなければならないアクションゲームならば、かなり致命的なラグだということが分かってもらえるかと思います。

### プリレンダリングあり
http://nenji.ru/_/prerender/pre-prerender.html

プリレンダリング済みのコマアニメです。

![run-walk.png](https://qiita-image-store.s3.amazonaws.com/0/20773/174d1d89-6054-b5a5-15e2-384a1581eb72.png "run-walk.png")

おそらくこちらは切り替えの瞬間にチラつきはなかったと思います。
なにをやっているのか簡単に解説します。


仕組み
-------------------
プリレンダリングとかいって大げさな感じですが仕組みは簡単です。
画像をDOMに追加し、画面上に表示させて再生させればいいのです。
とはいえ、プリレンダリング自体がまる見えでいい場合ってのはほぼないですよね。
これを隠そうとすると意外に大変なんです。

display:none してしまうと、そもそもレンダリングされません。
visible:hidden も、opacity:0 もやはりだめです。
position:absolute で画面外にすっ飛ばしても同様です。

ブラウザの仕組みまでは理解してないので確証ないですが、実際に画面上に存在していないと画像が描画されないのでしょうね。


z-index で隠す
-------------------
有効なのは、z-index でなにかのレイヤーの裏側に配置した場合です。
よくやる方法としては、背景を表示している最深部のレイヤーの裏側に隠しておきます。

![layer.png](https://qiita-image-store.s3.amazonaws.com/0/20773/3a45d6e1-cfe1-98e3-5a1e-b7b34ebbcbbb.png "layer.png")


見えないように配置しながら、コマアニメをしっかり表示してキャッシュさせるのです。
では、この表示しきった状態をどうやって知るのかというと、残念ながらまっとうな方法はありません。

画像描画完了イベントなんて存在しませんが、そうはいってもどうにかして検知しないといけないです。
そこでまた、まったくおすすめしないバッドノウハウを紹介します。


画像描画完了イベントなんて存在しない
-------------------
大きな画像を描画している間は、FPSが非常におちます。CPUに負荷がかかるんでしょうね。
CPU負荷があがると、JSのタイマーも影響をうけます。
このタイマーの間隔を、タイムスタンプで比較して、CPU負荷さがったかなーって判断します。

さきほどの[ミクさんのコマアニメ](http://nenji.ru/_/prerender/pre-prerender.html)のやつで console.log を開いてください。
出力されている数字は、タイマーループ間の時間（ms）です。
画像を裏側でレンダリングさせている間は、FPSが大きく落ちてますね。
これを目標とするFPSに落ち着いたら、描画完了とみなしています。

![console-log.png](https://qiita-image-store.s3.amazonaws.com/0/20773/f31525e9-ba33-b73d-b98c-5c7442c72845.png "console-log.png")


バッドノウハウですねー。
まったく保証できない方法です。
でもどうにかこの方法で切り抜けています。
まっとうな代替手段あるなら、こんな方法はかなぐり捨てたいです。

それでは以上、よろしくお願いします。
spring付きのrspec実行が、cannot load such fileエラーで落ちる場合の対処法

springと一緒に

`$ bundle exec spring rspec`

としてrspecを実行していて、たとえば

* configファイルを追加したり
* lib/tasksにバッチ処理を初めて追加したり

（他にも様々なケースがあるが）した場合、

```
$ bundle exec spring rspec
Warning: You're using Rubygems 2.0.14 with Spring. Upgrade to at least Rubygems 2.1.0 and run `gem pristine --all` for better startup performance.
/home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:245:in `load': cannot load such file -- /home/myuser/rails_app/myapp/config/environments/spec (LoadError)
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:245:in `block in load'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:236:in `load_dependency'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:245:in `load'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/lib/rspec/core/configuration.rb:1105:in `block in load_spec_files'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/lib/rspec/core/configuration.rb:1105:in `each'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/lib/rspec/core/configuration.rb:1105:in `load_spec_files'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/lib/rspec/core/runner.rb:96:in `setup'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/lib/rspec/core/runner.rb:84:in `run'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/lib/rspec/core/runner.rb:69:in `run'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/lib/rspec/core/runner.rb:37:in `invoke'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/rspec-core-3.1.2/exe/rspec:4:in `<top (required)>'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:245:in `load'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:245:in `block in load'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:236:in `load_dependency'
from /home/myuser/rails_app/myapp/vendor/bundler/ruby/2.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:245:in `load'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from -e:1:in `<main>'
```

こんな感じで、specのLoadErrorとなることがある。

こうした場合、

```
$ spring stop
Warning: You're using Rubygems 2.0.14 with Spring. Upgrade to at least Rubygems 2.1.0 and run `gem pristine --all` for better startup performance.
Spring stopped.
```

として、springを一時停止し、再度

`$ bundle exec spring rspec`

することで解消する。
Githubでプロジェクトをまるっと別のアカウントに移す


スタートアップでサービス開発してたりすると、最初個人の有料プラン範囲内で開始してしまって、後々法人に切り替えたい時にissueとかプルリクとかそっくりそのまま移したいんだけどどうすりゃいいの？ってちょっと悩んだ。プロジェクトごとまるっと権限移すみたいなのができるみたいですね。便利。

1.移動したいリポジトリのSetting画面を開く

![スクリーンショット 2014-09-28 16.24.06.png](https://qiita-image-store.s3.amazonaws.com/0/8463/269bf69f-eb1e-6e7d-5a0a-a770d703b319.png "スクリーンショット 2014-09-28 16.24.06.png")

2.Transferボタンをクリック

![スクリーンショット 2014-09-28 16.24.23.png](https://qiita-image-store.s3.amazonaws.com/0/8463/49fe44f8-47ba-621e-118c-14ace7fcf228.png "スクリーンショット 2014-09-28 16.24.23.png")

3.ここでリポジトリ名と、移植したいアカウント名を入力したらリポジトリをそのまま移すことが可能になります。簡単！
django-swiftbrowserを使ってみる

**[vagrant-swift-all-in-oneを使ってみる](http://qiita.com/tominaga443/items/b47fb522eca33b35e268)の続きです**

***

### django-swiftbrowser

[vagrant-swift-all-in-oneを使ってみる](http://qiita.com/tominaga443/items/b47fb522eca33b35e268)でSwiftサーバを構築しましたが、GUIもサーバ側で用意したいものです。OpenStackのダッシュボード・サービス([Horizon](https://wiki.openstack.org/wiki/Horizon))と認証サービス([Keystone](https://wiki.openstack.org/wiki/Keystone))を利用しても良いのですが、Swiftを使うためだけに導入するのは非常に手間です。そこで、Swift用の簡易GUIである[django-swiftbrowser](https://github.com/cschwede/django-swiftbrowser)を利用してみます。

```bash
# リポジトリを取得
git clone git://github.com/cschwede/django-swiftbrowser.git
# インストール
cd django-swiftbrowser
sudo python setup.py install
```

### swiftbrowserの設定

適当なプロジェクトを作成します。

```bash
django-admin.py startproject myproj
cd myproj
cp ~/django-swiftbrowser/example/settings.py myproj/settings.py
```

`myproj/settings.py`を修正します。

```py:myproj/settings.py
# Swiftの認証URLをSwiftサーバの固定IPに変更
SWIFT_AUTH_URL = 'http://192.168.0.1:8080/auth/v1.0'
SWIFT_AUTH_VERSION = 1 # 2 for keystone
STORAGE_URL = 'http://192.168.0.1:8080/v1/'
BASE_URL = 'http://192.168.0.1'
SWAUTH_URL = 'http://192.168.0.1:8080/auth/v2'
STATIC_DIR = '/var/www/myproj/static'

# タイムゾーンと言語をベルリンから日本に修正
- TIME_ZONE = 'Europe/Berlin'
- LANGUAGE_CODE = 'de-de'
+ TIME_ZONE = 'Asia/Tokyo'
+ LANGUAGE_CODE = 'ja-jp'

# ALLOWED_HOSTSにSwiftサーバの固定IPを追加
ALLOWED_HOSTS = ['127.0.0.1', '192.168.0.1', 'insert_your_hostname_here']
```

`myproj/urls.py`にURLの設定を追記します。

```py:myproj/urls.py
  from django.conf.urls import patterns, include, url
  from django.contrib import admin
+ import swiftbrowser.urls

  urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
+   url(r'^', include(swiftbrowser.urls)),
)
```

静的ファイルをコピーします。

```bash
sudo python manage.py collectstatic
（既存ファイルを上書きしてもいいかと聞かれるので'yes'を入力します）
```

### swiftbrowserの起動とログイン

Swiftbrowserを起動します。

```bash
python manage.py runserver 192.168.0.1:8000 --insecure &
```

問題なく起動できていれば、ブラウザからhttp://192.168.0.1:8000/login/ にアクセスするとログイン画面が表示されます。testユーザでログインするには、ユーザ名：test:tester 、パスワード：testing を入力します。

これでブラウザからSwiftを利用できるようになりました。

### ※うまくいかなかったところ

ファイルのアップロード時にUnauthorizedとなってしまいます。
原因が分かったら修正します。
Gitのタグ関連コマンド

たまにしか使わないせいか、なかなか覚えられないのでまとめておきます。

◆タグを作成する
`git tag -a <タグ名> -m '<コメント>'`

◆過去の状態にタグを作成する
`git tag -a <タグ名> -m '<コメント>' <コミットのハッシュ>`

◆タグをpushする
`git push origin <タグ名>`

◆タグの削除
`git tag -d <タグ名>`

◆タグの検索(例：ABCで始まるタグを検索)
`git tag -l "ABC*"`

◆タグをチェックアウト
`git checkout -b <ブランチ名> <タグ名>`
CentOS6.5にCouchDBをインストール


# はじめに
CentOS 6.5に、epelレポジトリからCouchDBをインストールします。
ただし、最新版のCouchDBが1.6.1なのに対してepelからインストールされるのは1.0.4と非常に古いです。

最新版をインストールするには、依存パッケージをインストールしてソースからビルドすることになります。


[公式のインストール手順](http://docs.couchdb.org/en/latest/install/unix.html)には依存パッケージのことしか書いてありませんでした。
[Community installation guide](http://wiki.apache.org/couchdb/Installation)の方に、CentOS 5のインストール方法があるのでそちらを参考にします。
（っていってもepel追加してyum installするだけ）

http://wiki.apache.org/couchdb/Installing_on_RHEL5


# 手順

## epelレポジトリインストール
```bash
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

## CouchDBインストール
```bash
$ sudo yum install -y couchdb
```

CouchDBはerlangで書かれているので、erlangやその他もろもろが一緒にインストールされます。

## 設定ファイル編集
初期の状態だと127.0.0.1にバインドされてしまいます。
0.0.0.0でバインドされるように、設定ファイルを編集します。
設定ファイルは`/etc/couchdb/local.ini`です。

```:/etc/couchdb/local.ini
...

[httpd]
;port = 5984
;bind_address = 127.0.0.1
bind_address = 0.0.0.0
; Uncomment next line to trigger basic-auth popup on unauthorized requests.
;WWW-Authenticate = Basic realm="administrator"

...
```

## 起動
起動します。

```bash
$ sudo service couchdb start
```

## 確認
CouchDBにはFutonというWebUIが付属しているので、そちらにアクセスしてみます。
`http://<HOST>:5984/_utils/`にアクセスします。

![スクリーンショット 2014-09-28 15.43.45.png](https://qiita-image-store.s3.amazonaws.com/0/43208/bc7ee657-be83-d140-dc0c-5d60eade3c60.png "スクリーンショット 2014-09-28 15.43.45.png")

こんな感じの画面が出たら成功です！
データベースの作成やドキュメントの編集ができます。

## おわりに
WebUIが標準でついてるのは面白いですね。
ロゴの人はただでさえソファでだらけの境地みたいなカッコしてるのに、布団まで引っ張りだしてまだだらけるつもりなんですね。
今見ている最新のコミットIDなどをコンパイル時に埋め込む


下のようなスクリプトをmakeファイルのどこかに書く:

```make
GIT_COMMIT_INFO := $(shell git log -1 | sed -e '1,2s/$$/\\n/;4,$$d' | tr -d '\n')
GIT_COMMIT_ID := $(shell git log -1 | sed -n '1,1p')
GIT_COMMIT_DATE := $(shell git log -1 | sed -n '3,3p')
CPPFLAGS += -DGIT_COMMIT_ID="$(GIT_COMMIT_ID)" -DGIT_COMMIT_DATE="$(GIT_COMMIT_DATE)"
```

まぁちょっと，余計なものも混ざってるけど…
プログラムのソースコードの方では，コマンドラインオプションで定義している文字列を使ったコードを書いておく．

作成したいのはプログラムで，その挙動がどの時点のものでビルドされたかどうかに興味があるので，こんな感じでよいと思う．

## 追記

コメントで示されているように，`git log`の`--format`オプションで整形するとsedを使う必要が無くなる．
@ngyuki さんありがとうございます．
Xcode6で動かないプラグインを対応させる

# Xcode6にアップデートしてからプラグインが使えない！

プラグインの作者がアップデートしてくれるまで使えないのか...と思ってダメ元で探していた時
プラグインのinfo.plistにxcodeのUUIDを追加すればいいという情報をゲット
以下の作業をする前にXcodeは念のため終了しておきましょう。

## Xcode6.0.1のUUIDはなんだ？

C4A681B0-4A26-480E-93EC-1218098B9AA0
がXcode6.0.1のUUIDです。どうやって調べるのか探していた所、uuid自体を発見した。

## どこへ追加すればいいの？

今回はUncrustifyPlugin.xcpluginを使えるようにしたかったので、これを例にあげます。
UncrustifyPlugin.xcplugin：コードフォーマットを行うプラグイン

```
/Users/ユーザ名/Library/Application Support/Developer/Shared/Xcode/Plug-ins/UncrustifyPlugin.xcplugin/Contents/Info.plist
```

を適当なテキストエディタで編集する。

```
<key>DVTPlugInCompatibilityUUIDs</key>
```

を検索して、すぐ下の \<array> にUUIDを追加する。
こんな感じ

```
<array>
  // プラグインが対応しているXcodeのUUIDが並んでいる
  <string>C4A681B0-4A26-480E-93EC-1218098B9AA0</string> //この行を追加する
</array>
```

## Xcodeを再起動

これでプラグインが使用できるようになったはずです。
もしかしたら、Xcodeの仕様変更などでバージョンの互換性がない場合は使えない可能性もあると思います。
nyagosのPROMPTでもnyaosの$Wn的なことがしたい

何言ってるか分からない?
====================
**nyagos**とはzetamattaさんが開発中のWindowsで動作するGo製のシェルです。
僕自身は現在は旧バージョンであるnyaosを使用しているのですが、乗り換えも視野に入りつつある状況です。

さて、nyaosのPROMPTでは**$W*****n***(***n***は整数)という特殊文字が使用できます。
これは「カレントディレクトリの最下層***n***個を表示する」というもので
カレントディレクトリが`C:\foo\bar\hoge\fuga\moge`で$W2の場合、
プロンプトの表示は`C:...\fuga\moge`となります。素敵ですね。

しかしながら、nyagosでは(まだ?)実装されていませんので代替案を考えてみました。

代替案
=====
手順は以下です。

0. `cdコマンド`を差し換える
1. ディレクトリ移動後にカレントディレクトリを取得しLuaで整形
2. 環境変数PROMPTを設定する

1.の部分を変更すればVimのタブに表示されるような
`C:\f\b\h\f\moge`と各ディレクトリの先頭文字だけ表示することも可能でしょう。

コード
-----
通常のドライブ、HOMEディレクトリ、UNCパスの場合で条件分けたらスパゲッティになってきました…が、まぁこんな感じです。

```lua:nyagos.lua
alias{
    _cd='cd', -- cdコマンドの再帰呼び出しを回避
    cd=function(args)
        if #args == 0 then
            nyagos.exec('_cd ~')
        else
            r, err = nyagos.exec('_cd "' .. args[1] .. '"')
            if (err ~= nil) then
                print(err)
            end
        end
        nyagos.setenv('PROMPT', makePrompt())
    end
}

function makePrompt()
    return '$e[36;40;1m' .. getCompressedPath(3):gsub('\\', '/') .. '>' .. '$e[37;1m'
end

-- num:表示する階層数
function getCompressedPath(num)
    local path = chomp(nyagos.eval('pwd'))
    local buff = path

    local drive = nil

    -- HOME以下の場合
    local home = nyagos.getenv('USERPROFILE')
    if (path:match(home))then
        drive = '~'
        path = path:gsub(home, '~')
        buff = path
    end
    -- 通常のドライブ
    if drive == nil then
        drive = buff:match('(%w+:)\\')
        buff = buff:gsub('%w+:\\', '')
    end
    -- UNCパス
    if drive == nil then
        drive = buff:match('(\\\\.-)\\')
        buff = buff:gsub('\\\\.-\\', '')
    end

    local tbl = split(buff, "[\\/]")
    if #tbl > num then
        buff = "/..."
        for i = #tbl - (num - 1), #tbl do
            buff = buff .. '/' .. tbl[i]
        end
            path = drive .. buff
    end

    return path
end

-- code from 'http://lua-users.org/wiki/SplitJoin'
function split(str, pat)
    local t = {}  -- NOTE: use {n = 0} in Lua-5.0
    local fpat = "(.-)" .. pat
    local last_end = 1
    local s, e, cap = str:find(fpat, 1)
    while s do
        if s ~= 1 or cap ~= "" then
            table.insert(t,cap)
        end
        last_end = e+1
        s, e, cap = str:find(fpat, last_end)
    end
    if last_end <= #str then
        cap = str:sub(last_end)
        table.insert(t, cap)
    end
    return t
end

function chomp(src)
    return string.gsub(src, "[\r\n]+$", "")
end
```
CentOS7 minimalインストール後、自動作成の/homeを削除して/(ルート)に統合

CentOSでテキストモードでインストールした時、パーティションが勝手に切られて/(ルート)が50Gで、それ以外はhomeに振られてしまう。これを後から変更する。ちなみに、GUIモードではインストール時に設定できる。

流れは以下の通り。インストール直後で、userを作る前に実行することが望ましい。

> 1.homeディレクトリをアンマウント
> 2.論理ボリュームを削除
> 3.論理ボリュームサイズを拡張する
> 4.起動ファイルシステム設定を変更
> 5.再起動
> 6.LVファイルシステムサイズ拡大(LVサイズに合わせる)

```lang:bash
# umount -l /home
# lvremove -f /dev/centos/home
# lvextend -l +100%FREE /dev/mapper/centos-root
```

```lang:bash
# vi /etc/fstab
```
* 右記をコメントに。 #/dev/mapper/centos-home /home 

```lang:bash
# reboot
# xfs_growfs /
```
* CentOS7からデフォルトのファイルシステムはxfs。
* CentOS6とかはresize2fsを使ってた。
vagrant-swift-all-in-oneを使ってみる

某所でのLTネタとして、[OpenStack Swift](https://wiki.openstack.org/wiki/Swift)を使って即席クラウドストレージを作ってみました。[VirtualBox](https://www.virtualbox.org/)と[Vagrant](http://www.vagrantup.com/)を使って、同一LAN内からアクセス可能なSwiftサーバを用意します。環境はWindows7です。

## Swift-All-In-One
[SwiftStack](https://www.swiftstack.com/)が公開している vagrant-swift-all-in-one を利用して、Swiftサーバを構築します。

https://github.com/swiftstack/vagrant-swift-all-in-one
上記のリポジトリをZipでダウンロードして、適当なフォルダに解凍します。

Swiftサーバ用の固定IPとブリッジ接続の設定を`Vagrantfile`に追加しておきます。

```:Vagrantfile
Vagrant.configure("2") do |config|
+ config.vm.network :public_network, ip: "192.168.0.1", netmask: "255.255.255.0", gateway: "192.168.0.254", bridge:"eth0"
end
```

コマンドプロンプトから解凍したフォルダへ移動してVMを起動します。

```bash
cd vagrant-swift-all-in-one
vagrant up
```

VM起動後、Chefが実行されてSwiftを自動的にインストールしてくれます。

### 起動後の確認

インストールが終了したら、ユーザ名：vagrant、パスワード：vagrantで127.0.0.1:2222にSSH接続し、適当なファイルをアップロード／ダウンロードして、Swiftが動作していることを確認します。

```bash
echo "awesome" > test
swift upload test test
swift download test test -o -
```

[CloudBerry](http://www.cloudberrylab.com/free-openstack-storage-explorer.aspx)や[Cyberduck](http://cyberduck.io/)といったクライアントを利用すればGUIでSwiftにアクセスできます。
testユーザでアクセスする場合の認証情報は以下を利用します。

* UserName: test:tester
* Password: testing
* AuthURL: http://192.168.0.1:8080/auth/v1.0

***

続き→[django-swiftbrowserを使ってみる](http://qiita.com/tominaga443/items/c832518b9af35f23c962)
TitaniumのListViewにAndroid対応のPullViewがなかったので作ってみた


PullViewというのはテーブルを下に引っ張って更新してるよというのが表示されるアレですね。
やっぱり更新処理は今どきPullView使わないとねっと思っていたのですが、
TitaniumのListViewにはAndroidではpullViewが使えないです。
今のところiOSオンリーです。

幾つかWidgetもあったのですが、今回は自分で作ってみました。
サンプルということでListViewにはQiitaから取得したjsonデータを表示しています。QiitaのAPIは認証なしで使えて便利ですね。

ソースはこちらになります。
https://github.com/ganezasan/Alloy-PullToRefresh-Android

### Android版
![android.gif](http://bl.ocks.org/ganezasan/raw/0a3b16e12ec6d2582804/qiita_listview_android.gif)

### iPhone版
一応iPhone版も動くように書きました。
![ios.gif](http://bl.ocks.org/ganezasan/raw/0a3b16e12ec6d2582804/qiita_listview_ios.gif)

## PullViewが使えるWidget

### Alloy-PullToRefresh
こちらなかなか良さそうなので、今度使ってみたいです。
iOS・Android両方で使えます。

![ios.gif](https://github.com/jolicode/Alloy-PullToRefresh/raw/master/docs/ios.gif)

### Alloy Pull to Refresh Widget 
こっちはTableViewのWigetになります。
Future workでListViewと書かれてるので、いつか対応してくれるはずです。

![ios.gif](https://camo.githubusercontent.com/7af901469a9a7cec6a2bac1bbc2a1d7ff5a153f6/68747470733a2f2f7261772e6769746875622e636f6d2f466f6b6b655a422f6e6c2e666f6b6b657a622e70756c6c546f526566726573682f6d61737465722f646f63732f7570646174696e672e706e67)

##　どうやって作るか
pull、pullendイベントはAndroidでは取得できないため、touchmoveとtouchendを使ってpull、pullendっぽいことをやります。

1. listviewのscroll・touchstartイベントを取得するのを諦める
※こちらlistviewのtouchstratは取得できないのですが、その親Viewからは取得できます。

2. touchmoveイベントで最初に触った開始点を決める

3. touchmoveイベント２回目以降でY軸が下に動いた分、親Viewを下にずらす

4. touchendで閾値を超えていた場合に、更新処理をする

##　touchmove部分

``` JavaScript
var scrollableView_top = 50; //scrollableViewのデフォルトの高さ
var y = 0; //現在のscrollableViewの高さ

//スクロールした分scrollableViewの位置をずらす
$.scrollableView.addEventListener('touchmove', function(e)
{
  //yが0以外の場合は２回目以降のtouchmoveイベント
  //scrollableViewのデフォルトの高さよりも下に触った位置が下か
  //前回触った位置よりも下なのかをチェック
  if(y != 0 && Number(e.y) > scrollableView_top &&  Number(y) <= Number(e.y)){
    var top = 0;
    top = (Number(e.y) - Number(y))*0.1+scrollableView_top;
    Ti.API.info("top:"+String(top));
    $.scrollableView.setTop(top);

  //開始点を記録
  }else if(Number(e.y) > scrollableView_top && Number(e.y) <300+scrollableView_top){
    y = e.y;
  }
});

```

##　touchend部分

``` JavaScript

//PullView処理　Android
//スクロールが終了した際の高さが閾値以上だった場合に更新ｓｙ
$.scrollableView.addEventListener('touchend', function(e)
{
  //現在のscrollableViewの高さを初期化
  y = 0;
  var value = 'touchend fired x ' + e.x + ' y ' + e.y;
  Ti.API.info(value);
  var top = $.scrollableView.getTop();

  //現在のscrollableViewの高さが閾値より高い場合は更新処理
  if(top > 100 && Titanium.Network.online){
    infoUpdate("update");

  //それ以外の場合は何もしないで、元の位置に戻す
  }else{
    $.scrollableView.animate({top: scrollableView_top+"dp", duration: 100});
  }
});

```

## まとめ

作ってみると簡単だったので、いろいろカスタマイズできると思います。
ソースはこちらになりますのでよかったら使ってみてください。
https://github.com/ganezasan/Alloy-PullToRefresh-Android

こちらの内容はつい先日Titaniumもくもく勉強会２１回でもお話した内容です。
そのときのスライドはこちら
<a href="http://www.slideshare.net/takayukiito739/titanium22">
![titanium21titanium](http://image.slidesharecdn.com/titanium22-140925071352-phpapp01/95/titanium21titanium-1-638.jpg?cb=1411647317)
</a>

AndroidのPullViewのサンプルは以外と少ないので、
まだまだListViewが使われてないのかな〜と思いました。

早くTitanium側でAndroidでもpullViewが使えるようになればいいな〜と思ってます。
Openstack+Ceph設定ガイド

オープンクラウド実証実験タスクフォース(OCDET)ストレージ基盤WGで作成した「Openstack+Ceph設定ガイド」を公開しました。
Openstack/Icehouse+Ceph/Firefly版です。
http://www.slideshare.net/sfunai/openstackceph-39609805
複数の画像をResourcesフォルダから読み込んで表示する

ローカルから画像を読み込んで表示する方法を記載しました。
特に難しい事ではないですけども（汗）

![スクリーンショット 2014-09-28 21.12.56.png](https://qiita-image-store.s3.amazonaws.com/0/38279/fbfe137b-1696-69fa-1237-0133bfadd56a.png)

```csharp

using UnityEngine;
using System.Collections;

public class ResourcesTextureLoaders : MonoBehaviour {
    
    public GameObject _prefab;
    public Material _material;
    GameObject[,,] _instance = new GameObject[2,2, 3];
    
    private int num = 0;
    
    void Start ()
    {
        for (int z=0; z<2; z++)
        {
            for (int j = 0; j < 2; j++)
            {
                for (int i = 0; i < 3; i++)
                {
                    num += 1;
                    
                    _instance [z,j, i] = Instantiate(Resources.Load("LoadPrefab")) as GameObject;
                    _instance [z,j, i].renderer.material.mainTexture = Resources.Load("p" + num) as Texture2D;
                    _instance [z,j, i].transform.localPosition = new Vector3(i * 80 - 80, j * 80 - 40f, z*80);
                    _instance [z,j, i].transform.rotation = Quaternion.Euler(90, 180, 0);
                    _instance [z,j, i].transform.localScale = new Vector3(5, 5, 7);
                }
            }  
        }
    }   
}

```
※位置や回転やスケールは適当な感じで合わせる為に入れています。

Assets>Resourceフォルダから画像を読み込んでます。

![スクリーンショット 2014-09-28 21.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/38279/b65397fa-2ca4-4ee4-9ec3-38cb5a55208a.png)
Ceph/GlusterFS/XtreemFSの検証報告

少し古いですが、2013年度経産省採択事業「自律型ハイブリッドクラウドプラットフォーム技術開発プロジェクト」における、分散ファイルシステム技術検証サブプロジェクトのために、共有ファイルサーバの分散レプリケーション技術と障害リカバリについて検証を行った報告書です。Ceph/GlusterFS/XtreemFSの比較検証を行いました。
https://s3-ap-northeast-1.amazonaws.com/cloudconductorwpupdate/whitepaper/%E5%88%86%E6%95%A3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AEWAN%E8%B6%8A%E3%81%88%E5%90%8C%E6%9C%9F%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%A4%9C%E8%A8%BC.pdf
msysgit でどうしても日本語文字化けが治らなかった際の対処

Gitで日本語コメントを書いたら、文字化けしてしまった。

[Qiita - msysgit で日本語を使いたい](http://qiita.com/kumazo@github/items/2169e1ee7be278f82b94)を参考に
設定してみたが、コミットログの文字化けだけがやはり治らず....

どうしたものかと、やってみた試行錯誤をまとめておきます。
(注：ものすごいイージーミスでした)

## 追記(2014-10-10)
元記事の kumazo さんからの指摘で、確認してみたところ、_vimrcではなく、.vimrcでも動作しました.
お好みの方でどうぞ.

## 環境
* Windows7 + msysgit(git1.9.4)
* コミットログは、msysgit内蔵のVimで編集したい
* gitbash上では、文字コードをすべてUTF-8で扱いたかったので、以下の設定を.bashrcもしくは.bash_profileに設定

```.bash:.bash_profile
export LANG=ja.UTF-8
```

## 何故か.vimrcの設定が反映されない
### .vimrcの作成
参考サイトには以下のようにある.
>これらをまとめて $HOME/.vimrc に保存しておく。
>
>```vim:.vimrc
>set encoding=cp932
>set termencoding=cp932
>set fileencoding=utf-8
>set fileencodings=cp932,utf-8
>```


で、この設定を $HOME(WindowsではC:\\Users\\***\\)に保存して試したが、
なにやらうまく反映されていないっぽい.

```bash:
$ vim
```
```vim
:set fenc
fileencoding=
```
設定してるはずなのに、空だと...?

### .vimrc、認識されている？
そこで見つけたページがこちら.
[Stackoverflow - Where is vimrc or vim profile for github's mingw32 shell on a Windows machine?]
(http://stackoverflow.com/questions/15651286/where-is-vimrc-or-vim-profile-for-githubs-mingw32-shell-on-a-windows-machine) 

さっそく、自分のvimrcがgitbashに正しく認識されているか確認したところ...

```bash:
$ vim --version | grep vimrc
   system vimrc file: "$VIM\vimrc"
     user vimrc file: "$HOME\_vimrc"
 2nd user vimrc file: "$HOME\vimfiles\vimrc"
 3rd user vimrc file: "$VIM\_vimrc"
```
~**.vimrc じゃなくて _vimrcじゃないか** というイージーミス発見.~
~早速ファイル名変更.~

自分はは、_vimrcと変更しましたが、 .vimrc でも問題なく動きました.
詳細はコメント欄参考.

最大の敗因は以下に続く.

### vimrcのエラー
ファイル名変更した上で、反映されているか確認したが、
あいも変わらず fileencodingが空.

なんでだろうなぁ と眺めていたところ、
vimの起動時にエラーメッセージが一瞬表示されたような気がしたので確認.

```bash:
$vim 2>vim_log; cat vim_log
Error detected while processing c:\Users\****\_vimrc:
line    3:
E474: Invalid argument: encoding      =
line    4:
E518: Unknown option: cp932
line    5:
E518: Unknown option: utf-8
line    6:
E518: Unknown option: utf-8,cp932
Press ENTER or type command to continue
```
えっ？

```bash:
$ cat ~/_vimrc
set number

set encoding      = utf-8
set termencoding  = cp932
set fileencoding  = utf-8
set fileencodings = utf-8,cp932
```
**こんなアホみたいなエラー出ていれば、vimrcが反映されるはずないだろ！**

というわけで、以下のように、=で揃えていた部分を削除して、保存しなおした.

```bash:
$ cat ~/_vimrc
set number

set encoding=utf-8
set termencoding=cp932
set fileencoding=utf-8
set fileencodings=utf-8,cp932
```

無事fencが反映され、コミットログを保存しても、文字化けしなくなりました.

## まとめ
### 原因
Vimの設定ミスが原因で、コミットログがShift-JISで保存されていましたというオチ.
その設定ミスが、本筋と関係ないところで起きていたイージーミスだという残念っぷり.

* msysgit内蔵のvimが求める環境設定は .vimrc ではなく、 _vimrc
* とはいえ、.vimrcでも動いたので、勝手に変換してくれてるのかもしれません
* vimrcを綺麗に整形しようとするな！

### 悟り
**何事でも「うまくいかないな」と思ったら、上流の原因から当たること.**
今回の場合、gitのコミットログが怪しいと分かった時点で、
エディタの設定から見直すのが近道だった.
SVProgressHUD & AFNetworking(AFHTTPSessionManager)でキャンセル処理を実装する

大きなデータのダウンロードなどは通信に時間がかかるので、ユーザの希望でその通信をキャンセルできるようにしたい。
HUD(Head Up Display)として`SVProgressHUD`を使っていることを前提としてメモしておく。
http://kevsaidwhat.blogspot.jp/2013/06/cancel-svprogresshud-process-by-tapping.html

##仕様
ユーザの希望をどのようにアプリが受け取るか、ということについては

* ユーザがHUDをタップしたとき

とした。ユーザがHUDをタップすると、実行中のHTTP通信がキャンセルされて、HUDが消える。

`SVProgressHUD`はタッチイベントを受け取ると、`SVProgressHUDDidReceiveTouchEventNotification`通知を通知センターに送っているのでこれを利用する。

##HUD表示時
キャンセル処理の実装クラスが通知を受け取れるように、オブザーバとして登録する。

```objectivec
- (void)someTask
{
    //通信のトリガーとなる処理を実装する
	//...
    
    //HUDを表示させる前に、通知センターへオブザーバとして登録する
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hudTapped:) name:SVProgressHUDDidReceiveTouchEventNotification object:nil];
    [SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeBlack];
}
```


##キャンセル通知受信時
HUDがタップされると`hudTapped:`が呼び出されるので、ここにキャンセルのための処理とHUDを消すための処理を実装する。キャンセル処理ができたらオブザーバ登録を解除する。

```objectivec
- (void)hudTapped:(NSNotification *)notification
{    
    //コネクタにキャンセルを依頼する
    [self.connector cancelHTTPTask]; //この実装では、HTTP通信のタスクは`connector`オブジェクトに一任している
    
    [[NSNotificationCenter defaultCenter] removeObserver:self name:SVProgressHUDDidReceiveTouchEventNotification object:nil];
    [SVProgressHUD dismiss];
}
```

ところで`cancelHTTPTask`の実装では、`AFHTTPSessionManager`のサブクラスのインスタンスを使って`invalidateSessionCancelingTasks:`を呼び出している。このメソッドが、AFNetworking(AFHTTPSessionManager)を使う際の通信タスクのキャンセル処理の本体となる。

## 注意点
キャンセル通知受信時に行っているオブザーバの解除は、HTTP通信が終了した際のブロック処理またはデリゲートにも実装しておく。
AndroidのSQLiteの面倒臭いを簡単にする(3)

[AndroidのSQLiteの面倒臭いを簡単にする(2)](http://qiita.com/cattaka/items/e8d42f8d7388daf82cd2)
に引き続いて、CatHandsGendroidの簡単な使い方をご紹介します。今回はSQLからモデルクラスへのマッピング編です。

* [サンプルアプリ](https://github.com/cattaka/FastCheckList) https://github.com/cattaka/FastCheckList

## SQLからモデルクラスへマッピング
SQLiteDatabaseを使っていると、ときどきgroup byや集約関数を使いたくなります。
一応、標準APIでもサポートしていてメソッドもありますが、いまいち使い勝手が悪いです。
どこかでSQLを定義しておいて、メソッドを叩けばそのSQLが実行され、
モデルクラスのインスタンスが返ってくる、そういったのが欲しいものです。
なので、CatHandsGendroidにその機能を追加しました。
使い方は次のとおりです。

### 使い方：モデルクラスへの設定
モデルクラスのアノテーションの@DataModelにquery属性を追加します。
属性の内容はコロン(:)で名前をSQLを区切って、<名前>:<クエリー>とします。
注意点としてはSELECT文のカラム名は必ずAS句などを用いてマッピングするカラム名と一致させてください。
検索条件などに使用するプレースホルダー(?)も利用可能です。

```java
@DataModel(
    find={"id","entryId:sort+"},
    query={"MaxSort:select max(sort) as sort from checkListItem where entryId=?"}  // <-実行したいクエリー
    )
public class CheckListItem {
    @DataModelAttrs(primaryKey=true)
    private Long id;
    private Long entryId;
    private Long sort;
    private String label;
    /* GetterとSetterは省略 */
}
```

この例からは次のようなコードがAPTによって自動生成されます。
戻り値がカーソルになっているものと、モデルクラスのリストになったものの２つになります。

```java
    public static java.util.List<CheckListItem> findByMaxSort(SQLiteDatabase db, String arg0) {
        Cursor cursor = findCursorByMaxSort(db, arg0);
        java.util.List<CheckListItem> result = new java.util.ArrayList<CheckListItem>();
        while (cursor.moveToNext()) {
            CheckListItem model = new CheckListItem();

            model.setSort(ACCESSOR_SORT.readFromCursor(cursor,0));
            result.add(model);
        }
        cursor.close();
        return result;
    }
    public static Cursor findCursorByMaxSort(SQLiteDatabase db, String arg0) {
        String[] selectionArgs = new String[]{
            arg0,
        };
        return db.rawQuery("select max(sort) as sort from checkListItem where entryId=?", selectionArgs);
    }
```

これらのメソッドはstaticメソッドになっていますので、使用するときは次のようにシンプルに書けます。

```java
        List<CheckListEntry> entries = CheckListEntryCatHands.findByMaxSortNo(db);
```

## まとめ
Androidに限らずWeb系のアプリケーションでもそうですが、
データベースへのアクセス周りの処理は定型的でありながら手で書くのは面倒臭いです。
今回のようなSQLからモデルクラスへのマッピングはプログラムを書いている本人にはわかっているのに、
それを指定するパラダイムが無いので結局手でマッピングすることになることが多いです。
なのでこの手の処理はツールで機械的に生成できるなら生成し、
人の手による手間やヒューマンエラーによる不具合を避けられるように、
ツールに任せて楽ができるようにしましょう。
「Path for project must have only one segment.」というエラーの解決法

表題のエラーはRun→Run configurations...を選ぶと出てくるダイアログでAndroid Applicationに複数のアプリが登録されている時にその中からアプリを選んだ時に右側に出てくるAndroidタブの中にあるProjectが空欄なのが原因。

欄の右のBrowseボタンを押して選べばおｋ。

なお、Android以外の場合はやったことないし知らないけどAndroid以外のプロジェクトでもそうなる可能性は多々ある。
Hexフィールド

![20140928-110138-097.png](https://qiita-image-store.s3.amazonaws.com/0/54532/3a9fa858-6236-23fc-e7b3-1b93f5033495.png)
![20140928-120540-381.png](https://qiita-image-store.s3.amazonaws.com/0/54532/6dab42c8-4e07-f158-2c90-65ff7e283ab1.png)
![20140928-110111-397.png](https://qiita-image-store.s3.amazonaws.com/0/54532/54c63d90-31df-ebaa-743f-f144a3d4ce4d.png)
![20140928-110146-063.png](https://qiita-image-store.s3.amazonaws.com/0/54532/6d76690b-dcea-5c16-09e0-49313a7411ea.png)

```cpp:Siv3DApp.cpp
# include <Siv3D.hpp>

void Main()
{
  unsigned int mapwidth, mapheight ;
  double cellsize ;
  double cellint ;
  double padding ;

  GUI gui(GUISkin::Default()) ;
  gui.addSlider(L"Height", { 1, 100, 10}) ;

  while (System::Update()) {
    mapheight = gui.slider(L"Height").value ;
    cellsize  = Window::Height() / (0.5 + 1.5 * mapheight) ;
    cellint   = cellsize * sqrt(3) ;
    mapwidth  = (Window::Width() - 0.5 * cellint) / cellint ;
    padding   = (Window::Width() - (cellint * (0.5 + mapwidth + 0.5 * (mapheight == 1)))) / 2 ;

    Polygon hexcell = Geometry::CreateNgon(6, cellsize, 0, {0, 0}) ;
    Vec2 hexpos ;

    for (unsigned int y = 0; y < mapheight; ++y) for (unsigned int x = 0; x < mapwidth; ++x) {
      hexpos = {cellint * (x + 0.5 * (y%2 == 0) + 0.5) + padding, cellsize * (1.5 * y + 1)} ;
      (hexcell + hexpos).draw(Palette::Orange) ;
      (hexcell + hexpos).drawFrame(2.0, Palette::Red) ;
    }
  }
}
```
PostgreSQLのgemをビルドする


https://bitbucket.org/ged/ruby-pg
が本流っぽいけど慣れてるGithubから

#拡張モジュールを作る
```
git co https://github.com/ged/ruby-pg.git
cd ruby-pg
bundle install
rake
```

`Errno::ENOENT: No such file or directory - hg`

って言われる。mercurialが足りないようなので、
`brew search mercurial`して再度`rake`。
テストが走っていくらか失敗してる気もしたけど取り敢えず無視。

#gemを作る
`rake gem`すると
`Errno::ENOENT: No such file or directory @ rb_sysopen - ~/.gem/gem-private_key.pem
`
って出る。サインが足りないようなので
`rake generate_key`を実行。

やっと準備が整って`rake gem`で完成。
GitHubのmasterブランチを削除して、masterを置き換えた (^o^;)

GitHub においてある master ブランチを削除して、別のブランチを master として置き換えました :cold_sweat: 。

# コミットログを修正する
ローカルのmasterブランチ最新にします。

```bash:masterを最新にする
git pull origin master
```
GitHub で fork しておくなり、ローカルに master のバックアップをとっておきます。

最新のコミットを消したい場合なので `git reset` でコミットを巻き戻します。

```
git reset --hard HEAD^
```
# masterブランチを削除する
GitHubのmasterを削除します。

```
git push origin :master
```
しかし、エラーが発生しました。

```
git push origin :master
remote: error: refusing to delete the current branch: refs/heads/master
To git@github.com:pugiemonn/pugiemonn.com.git
 ! [remote rejected] master (deletion of the current branch prohibited)
error: failed to push some refs to 'git@github.com:pugiemonn/pugiemonn.com.git'
```
上記のようにエラーが生じます。これは、GitHub で default のブランチが master になっていると削除できないようです。

default のブランチは GitHub の画面から変更することができます。「**Settings**」から **Default branch** 項目を変更します。

![github-defualt-branch.png](https://qiita-image-store.s3.amazonaws.com/0/1624/1c520cf7-4d1e-b2e3-75a5-b33cb358ca26.png)
上記のようなセレクトメニューをmaster以外にします。

masterブランチを削除します。

```
git push origin :master
To git@github.com:pugiemonn/pugiemonn.com.git
 - [deleted]         master
```
GitHub にアクセスすると master ブランチが削除されています。

ちなみに

コマンドを使用しない場合、ブランチは以下のように GitHub の画面からも削除できます。
![delete-master-branch.png](https://qiita-image-store.s3.amazonaws.com/0/1624/a9d641d4-2622-204b-211e-1c1cca8fe8f6.png)


# 新しい master ブランチを push する

ローカルの masterをGitHub へ push します。

```
git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:pugiemonn/pugiemonn.com.git
 * [new branch]      master -> master
```

再び、GitHub の「**Settings**」から **Default branch** 項目を master に変更します。
![select-master-branch.png](https://qiita-image-store.s3.amazonaws.com/0/1624/8921e2cc-20f4-15d1-2306-43e469957ef2.png)

# masterブランチを消すとプルリクエストがクローズされる
masterブランチを削除すると、masterに対してリクエストされていたプルリクエストがすべてクローズされています。

最初プルリクエストが全部消えた？！と勘違いしました :sweat_smile: 。

閉じられたブランチを確認する場合は、GitHub の「**Pull requests**」から **Closed** 項目を選択します。
![closed-branch.png](https://qiita-image-store.s3.amazonaws.com/0/1624/4dcbe819-aeb0-6366-8f22-b9288f3c0126.png)

上図は#23が閉じられたプルリクエストです。

複数のブランチが閉じられて、GitHub の画面からすぐ見つからない場合は、**Recently updated**でソートすると最近クローズされたブランチがすぐ見つかります。

![Recently-updated-branches.png](https://qiita-image-store.s3.amazonaws.com/0/1624/82e34ff3-ca28-94f1-c6cb-5403da5c414b.png)

閉じられたプルリクエストをオープンにするには、クローズされたブランチを選択した上で、**Mark as** から **Open** を選択します。 
![open-closed-branches.png](https://qiita-image-store.s3.amazonaws.com/0/1624/6b48c3fc-005d-30e4-8d03-b7a75b32dac2.png)

master削除前にオープンされていたプルリクエストを、再びオープンにすることができます。

# 感想
GitHub の master ブランチを削除しました :scream: 。

プルリクエストが全部クローズされたのには最初驚きました。ブランチが消えるので当然かもですね。

master を削除するのは本来好ましくなく、プルリクエストベースの開発などにして master を削除しないで済むような運用をするのが望ましいそうです。
TwilioのDial動詞のactionを使うと通話のステータスを取得可能です。

Dial動詞の「action」を利用すれば通話終了直後、コールのステータスが取得可能です。
動きとしては<Dial>動詞に「action」に「action URL」を指定します。
Twilioは「action URL」に設定されているURLにステータスを渡します。

まず、ソースコードを見てみたいと思います。
このコードはTwilioの<Dial>動詞を使って指定の電話番号に発信を行うコードです。
Dialに「action URL」が設定されている場合、コール終了後、ステータスを指定されているURLに渡します。

```xml:dial-verb-test.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial callerId="+8150xxxxxxxx" timeout="10" action="twilio-dial-status.php">+8180xxxxxxxx</Dial>
</Response>
```

上の「dial-verb-test.xml」から発信された通話のステータスはこのように取得することが可能です。

```php:twilio-dial-status.php
<?php
  header("content-type: text/xml");
 
  $tel_from = $_POST['From'];
  $tel_to = $_POST['To'];
  $call_status = $_POST['CallStatus'];
  $dialCallStatus = $_POST['DialCallStatus'];
?>
<Response>
  <Say language="ja-jp">コールステータスは<?php echo $dialCallStatus; ?>です。</Say>
</Response>
```

<h3>終わりに</h3>
通話ステータス取得は、発信先の状態を取得する事が可能ですので、留守番などの判断でよく使われています。

Dial 動詞に関する情報は下記のリンクをご覧ください。
[・Twilio 音声通話](https://jp.twilio.com/docs/api/twiml/dial)
「DialCallStatus」から取得可能なステータスは下記のリンクをご覧ください。
[・DialCallStatus値](https://jp.twilio.com/docs/api/twiml/dial#attributes-action-dial-call-status-values)
URLの画像やページが存在するかシェル上で確認

`curl -v`のerror出力をリダイレクトして標準出力に吐き出せば良い。
http://d.hatena.ne.jp/Climber/20100707/1278493780
http://www.adminweb.jp/command/redirect/index3.html

![Screenshot from 2014-09-28 11:26:39.png](https://qiita-image-store.s3.amazonaws.com/0/53766/a7557e34-ebd4-8027-d374-2e72417a335d.png)

```
 curl -v http://qiita.com/jamejammy/items/671a14ae2834c045fe27 2>&1 1>/dev/null | awk '{if($2~"HTTP") print}'
```
< HTTP/1.1 200 OK


```
 curl -v http://qiita.com/jamejammy/items/671a14ae2834c045fe26 2>&1 1>/dev/null | awk '{if($2~"HTTP") print}'
```
< HTTP/1.1 404 Not Found

---
番号だけで良いならば
![Screenshot from 2014-09-28 11:29:12.png](https://qiita-image-store.s3.amazonaws.com/0/53766/4faf7464-b9b4-0a04-d302-ea7b16e84876.png)

```
 curl -v http://qiita.com/jamejammy/items/671a14ae2834c045fe27 2>&1 1>/dev/null | awk '{if($2~"HTTP") print $3}'
```
200


```
 curl -v http://qiita.com/jamejammy/items/671a14ae2834c045fe26 2>&1 1>/dev/null | awk '{if($2~"HTTP") print $3}'
```
404
TengでDBを操作する２

良いタイトルが思いつかなかったので。
Teng::Schema::Loader部分をモジュール化しているサンプルが
見つからなかったので書いてみる。
githubのソース検索まじ便利。

テーブル構造その他は[teng-handbook/050-basic.mkdn](https://github.com/tokuhirom/teng-handbook/blob/master/ja/050-basic.mkdn)を参考にした。

今回は使ってないけれどSQLiteで外部キー制約(FOREIGN KEY)をSQLiteで使うには`PRAGMA foreign_keys = ON;`を設定する必要がある。[SQLiteで外部キー制約を使えるようにする - ..たれろぐ..](http://d.hatena.ne.jp/naga_sawa/20101219/1292774083)

## DBの作成

```bash
$ sqlite3 test.db
sqlite>CREATE TABLE user (
    id     INTEGER PRIMARY KEY AUTOINCREMENT,
    name   TEXT NOT NULL
);
CREATE TABLE bookmark (
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    url     TEXT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user(id)
);
sqlite>.schema
CREATE TABLE user (
    id     INTEGER PRIMARY KEY AUTOINCREMENT,
    name   TEXT NOT NULL
);
CREATE TABLE bookmark (
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    url     TEXT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user(id)
);
sqlite>insert into user (name) values ("ghost");
sqlite>.quit
```

## こんな風に使う

```pl:test.pl
{
  package Neko;
  use strict;
  use warnings;
  use DBI;
  use Teng;
  use Teng::Schema::Loader;

  sub new
  {
    my ($class, $dsn) = @_;
    unless ($dsn) {
      $dsn = 'dbi:SQLite:dbname=:memory:';
    }
    my $dbh = DBI->connect($dsn) or die;
    my $teng = Teng::Schema::Loader->load(
      dbh => $dbh,
      namespace => "My::DB",
    );
    my %opt = (teng => $teng);
    return bless \%opt, $class;
  }

  sub teng
  {
    my ($class) = @_;
    return $class->{teng};
  }
1;
}

package main;
use strict;
use warnings;

my $db = Neko->new("dbi:SQLite:dbname=test.db");
my $row = $db->teng->single("user", { id => 1 });
print $row->name; # ghost
```
tmlib.jsで音を鳴らしてみる

tmlib.jsにて
画像が表示できたので次は音を鳴らします。

ちなみにtmlib.jsは
画像は（png,gif,jpg）、音声ファイルは(wav,mp3,ogg,m4a)
をサポートしているみたいです。



```js:test.html

<script src="tmlib.min.js"></script>
<script>

/**
 * スクリーンサイズ
 */
var SCREEN_WIDTH  = 960;
var SCREEN_HEIGHT = 640;
var SCREEN_CENTER_X  = SCREEN_WIDTH/2;
var SCREEN_CENTER_Y = SCREEN_HEIGHT/2;

tm.main(function() {
    // アプリケーション作成
    var app = tm.app.CanvasApp("#world");
    app.resize(SCREEN_WIDTH, SCREEN_HEIGHT); // 画面サイズに合わせる
    app.fitWindow(); // リサイズ対応
    app.background = "rgb(0, 0, 0)"; // 背景色をセット

    // シーンの切り替え
    app.replaceScene(GameScene());
    
    // tmlibの実行
    app.run();
});
    

tm.define("GameScene", {
    superClass : "tm.app.Scene",

    // シーン初期化処理
    init : function() {
        this.superInit();

        // BGM再生
        tm.sound.SoundManager.add("bgm", "bgm.mp3", 8);
        this.bgm = tm.sound.SoundManager.get("bgm");
        this.bgm.volume = 1.0;
        this.bgm.loop = true;
        this.bgm.play();
            
    },

    // シーン更新処理
    update: function (app) {
        //if(this.bgm.isPlay)
        //    this.bgm.stop();
    },
});
           
</script>
<canvas id="world"></canvas>

```

音ファイルのリソースの読み込みは
tm.sound.SoundManagerで行うようです

```
        // BGM再生
        tm.sound.SoundManager.add(アセット名, 音ファイル名, キャッシュ数);
```

音リソースの取得はtm.sound.SoundManagerで行います

```
        this.bgm = tm.sound.SoundManager.get(アセット名);
```

再生はplayメソッドを呼ぶだけです

```
this.bgm.volume = 0.0〜1.0;
this.bgm.loop = true or false;
this.bgm.play();
```

停止はstopメソッドを呼びます

```
if(this.bgm.loaded)
     this.bgm.stop();
```

tm.asset.Loaderで音リソースを読み込んでやろうとしたのですが、うまく行きませんでした。
どうやらtmlib.jsには
tm.sound.Soundとtm.sound.WebAudio
の２つがあり、
tm.asset.Loaderで読み込みしようとすると
tm.sound.WebAudioで読み込みしようしていて
ローカルで音リソース読み込みしようとするとXHRでリソース取得しているため、
ブラウザのCross Originの制約に引っかかるみたいです

tm.sound.SoundManager.addのほうは
tm.sound.Soundクラスを生成しています。
CentOSのbashをupdateをしました

CentOSのbashをyumコマンドでアップデートしました。

# インストールされたbashのバージョンを確認

```
yum list installed | grep bash
```

# bashをupdate
bashをupdateします。

```
yum clean all
yum -y update bash
```
再びインストールされたbashのバージョンを確認します。

```
yum list installed | grep bash
```

# 最近話題だったbashの脆弱性について
redhatのページで確認できます。
https://access.redhat.com/articles/1200223
PythonでiterableをN個づつに分割する関数

iterableをN個づつに分割してジェネレータにして返します。

コメントで教えていただいたリンクを参考に改良しました。3行まで短くなり無限リストも扱えてウハウハです。
[pythonでイテレータをチャンクに分割する](http://qiita.com/norami_dream/items/6f350cf3a72d0f3e685b)

```py3:
import itertools
def splitparN(iterable, N=3):
    for i, item in itertools.groupby(enumerate(iterable), lambda x: x[0] // N):
        yield (x[1] for x in item)


for x in splitparN(range(12)):
    print(tuple(x))
"""
出力：
(0, 1, 2)
(3, 4, 5)
(6, 7, 8)
(9, 10, 11)
"""

eternal =　libs.splitparN(itertools.cycle("hoge"))
print([tuple(next(eternal)) for x in range(4)])
#出力： [('h', 'o', 'g'), ('e', 'h', 'o'), ('g', 'e', 'h'), ('o', 'g', 'e')]

#itertools.chainで元に戻せます
print(tuple(itertools.chain.from_iterable(splitparN(range(12)))))
#出力： (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
```
Rails select内のoptionタグにclassを指定する

自分向けのメモ

```slim
= f.select :item, Item.all.map { |obj| [obj.name, obj.id, {class: "parent_#{obj.parent_id}"} ] }
```

生成されるHTML例

```html
<select ...>
 <option value="item_id" class="parent_id">item_name</otpion>
</select>
```

----
参考
http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_for_select

http://stackoverflow.com/questions/5783350/adding-a-class-to-option-elements-using-the-rails-3-form-helpers
PIPESTATUSさようなら

# Bash使いたくないけどPIPESTATUSどうしよう……

そんなアナタに耳よりな話。POSIXの範囲、つまりどのUNIXシェルでも同等のことができるというお話です。

元ネタは[コチラ](http://www.unix.com/302268337-post4.html)ですが、ここで例示されているコードでは、繋ぎたいコマンドが増えるとやがて動かなくなるので修正版を公開します。

# 1)次のシェル関数を定義

まずは、PIPESTATUSのように、全ての戻り値を集めたいコマンドパイプ列を書こうとしているシェルスクリプトの冒頭に次のシェル関数を追記します。

```sh:シェル関数runの修正版
run() {
  local a j k l com # ←ここはPOSIX範囲外なんだけど……
  j=1
  while eval "\${pipestatus_$j+:} false"; do
    unset pipestatus_$j
    j=$(($j+1))
  done
  j=1 com= k=1 l=
  for a; do
    if [ "x$a" = 'x|' ]; then
      com="$com { $l "'3>&-
                  echo "pipestatus_'$j'=$?" >&3
                } 4>&- |'
      j=$(($j+1)) l=
    else
      l="$l \"\${$k}\"" # ←修正箇所はここ
    fi
    k=$(($k+1))
  done
  com="$com $l"' 3>&- >&4 4>&-
             echo "pipestatus_'$j'=$?"'
  exec 4>&1
  eval "$(exec 3>&1; eval "$com")"
  exec 4>&-
  j=1
  while eval "\${pipestatus_$j+:} false"; do
    eval "[ \$pipestatus_$j -eq 0 ]" || return 1
    j=$(($j+1))
  done
  return 0
}
```

## オリジナルからの修正点

公開されていたソースコードから修正した箇所にコメントを入れておきました。

肝心なのは2つ目のコメントをつけた箇所です。ブレース“`{}`”を追加しないと10番目(`$10`)以降の引数を取得できないという問題です。

1つ目のコメントは、関数内でのみ使っている変数をローカル変数として閉じ込め、外部で同名の変数を使っていても衝突しないようにするためのものです。**これはPOSIXでは定義されていない**のですが、今時の大抵のシェルには実装されているので付けておきました。厳密にPOSIXへ準拠させる場合は外してください。

# 2)使ってみる

試しに使ってみましょう。

上記のシェル関数を冒頭に書いた次のシェルスクリプトを用意します。

```sh:pipestatus_test.sh
#! /bin/sh

# 上記のシェル関数を記述
run() {
  :
}

# PIPESTATUSと同様に、実行しながら全コマンドの戻り値を集める
run                              \
printf 1                      \| \
awk '{print $1+1}END{exit 2}' \| \
cat                           \| \
awk '{print $1+1}END{exit 4}' \| \
cat

# 戻り値が集められたかどうか確認する
set | grep ^pipestatus
```

まず、このシェル関数の使い方ですが。注意すべきことは3つ。

1. パイプで繋ぐ一連のコマンド列の先頭にキーワード“`run`”をつける。
2. コマンドを繋ぐパイプ記号“`|`”はエスケープする。
3. 可読性のために改行を入れたい場合は、行末にバックスラッシュ“`\`”を付けることによって行う。

これは、実行させたいコマンド文字列をシェルに直接解釈させるのではなく、一旦シェル関数に渡して、実際のコマンド文字列を動的に生成させる仕組みになっているからです。

さてそれでは実行してみましょう。上記コードのシナリオですが、途中に2個のAWKがあり、それらを通るたびに、数字が+1されます。初期値は`printf`により1にしていますので、最後は3が出てくるはずです。ただし、これらのAWKは0でない戻り値を返すようにしてあります。**一連の戻り値は“pipestatus_*n*”（*n*はコマンドの出現順に基づく番号）に各々格納**されますが、本当にそうなっているか`set`コマンドで最後に確かめる、というわけです。

```sh:こういう結果になるはずですが……
$ chmod +x pipestatus_test.sh # 実行フラグを付けて……
$ ./pipestatus_test.sh        # いざ実行!
3
pipestatus_1=0
pipestatus_2=2
pipestatus_3=0
pipestatus_4=4
pipestatus_5=0
$ 
```

うまくいきましたか?
例外オブジェクトはシリアライズ可能か？

# 前提(予備知識)

まず基本的なことから。

- `Closure` はシリアライズ出来ない。
- スタックトレースは `trace` プロパティに保持される。

`trace` プロパティ配列の各要素は以下のようなキーを持つ連想配列からなる。 `file` と `line` はクロージャ呼び出しに関しては未定義になる。

- `file` (ファイル)
- `line` (行)
- `function` (関数/メソッド/クロージャ)
- `args` (引数)

# 検証

## 変数に代入して呼び出す

```php:コード
<?php
session_start();
try {
    $func = function () { throw new \Exception; };
    $func();
} catch (\Exception $e) {
    var_dump($e->getTrace());
    $_SESSION['exceptions'][] = $e;
}
```

```text:結果
array(1) {
  [0]=>
  array(4) {
    ["file"]=>
    string(12) "test.php"
    ["line"]=>
    int(5)
    ["function"]=>
    string(9) "{closure}"
    ["args"]=>
    array(0) {
    }
  }
}
```

## `call_user_func` 関数で呼び出す

```php:コード
session_start();
try {
    call_user_func(function () { throw new \Exception; });
} catch (\Exception $e) {
    var_dump($e->getTrace());
    $_SESSION['exceptions'][] = $e;
}
```

```text:実行結果
array(2) {
  [0]=>
  array(2) {
    ["function"]=>
    string(9) "{closure}"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(38) "test.php"
    ["line"]=>
    int(4)
    ["function"]=>
    string(14) "call_user_func"
    ["args"]=>
    array(1) {
      [0]=>
      object(Closure)#1 (0) {
      }
    }
  }
}

Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed' in [no active file]:0
Stack trace:
#0 {main}
  thrown in [no active file] on line 0
```

# 結果

- `function` がクロージャであっても、 **"{closure}"** という文字列になるので問題なくシリアライズ出来る。
- `args` の要素にクロージャが含まれていると、オブジェクトのままなのでシリアライズ出来なくなる。

# 対策

安全にセッションに格納したいときはスタックトレースを全部潰してしまえば問題ない。

**追記: 2023-07-15 更新**
**親クラスを全て辿るようにしました**

```php:スタックトレースを強制的に空配列にする関数
<?php
function clear_trace_recursive(Throwable $e): void
{
    do {
        $r = new ReflectionClass($e);
        do {
            if ($r->hasProperty('trace')) {
                $r->getProperty('trace')->setValue($e, []);
            }
        } while ($r = $r->getParentClass());
    } while ($e = $e->getPrevious());
}
```
Vagrantからsshが失敗するため、MacのVagrantへssh-addして鍵を渡す

# Vagrantからsshが失敗
MacにあるVagrantからsshコマンドを実行したらサーバに入れない現象が生じました。この記事の例ではCapistranoのcapコマンド経由でのsshの失敗を掲載しています。

```bash:capコマンドが失敗1
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
cap aborted!
Net::SSH::Disconnect: connection closed by remote host
```
あるいは

```bash:capコマンドが失敗２
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing on host hogehoge: getaddrinfo: Name or service not known
```
Macからsshするとサーバーへログインできるものの、MacのVagrantからsshをするとサーバーへログインできない状況です。

# Macの秘密鍵登録を確認
Mac側で秘密鍵が登録されているかを確認します。

```bash:秘密鍵を確認
ssh-add -l
The agent has no identities.
```

どうやら何も無いみたいです。

# Macへ秘密鍵を登録
ssh-addで秘密鍵を登録します。

```bash:秘密鍵を登録
ssh-add
```
鍵が登録されたはずなので確認します。

```bash:秘密鍵を確認
ssh-add -l
2048 69:c3:xx:xx:de:a4:5b:1f:xx:ho:ge:xx:xx:xx:xx:xx /Users/hogehoge/.ssh/id_rsa (RSA)
```

# Vagrantからsshが成功
Vagrantからsshを実行したところ接続が成功しました。