OmniAICreator/Qiita-1.07M huggingface dataset:
Rails server(WEBrick)をデーモンぽく起動/停止/再起動するスクリプト作ったよ

以下のスクリプトを適当なファイル名で保存＆実行権限をつければOK
Rails4.0.2環境下で動作確認しましたが、多分だいたい大丈夫なはず。

```
#!/bin/sh
set -e
set -u

# アプリケーションのルートディレクトリを指定
APPLICATION_ROOT="/your/project/path"

# オプション設定
# 下記はデフォルトの値。変更したい場合は適宜編集
# ENVIRONMENT = test/development/production のいずれか。
PORT="3000"
BINDING_IP="0.0.0.0"
ENVIRONMENT="development"

start () {
  cd ${APPLICATION_ROOT}
  rails server --daemon --binding=${BINDING_IP} --port=${PORT} --environment=${ENVIRONMENT}
}

stop () {
  cat ${APPLICATION_ROOT}/tmp/pids/server.pid | xargs kill -9
}

restart () {
  stop
  start
}

status () {
  # プロセスを表示。起動していなければ表示なし
  # ちょっと手抜き実装。
  ps aux | grep "[r]ails server"
}

help () {
  echo "Usage: $0 {start|stop|restart|status|help}"
}

# 引数のサイズをチェック
# set -u と $1を併用するためのhack
# http://tech.lampetty.net/tech/index.php/archives/455
if [ $# -lt 1 ]; then
    help
    exit 1
fi

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  status)
    status
    ;;
  help)
    help
    ;;
  *)
    help
    exit 1
esac

exit $?
```

仮に"Rserver"というファイル名にしたのであれば、

```
$ ./Rserver # help表示
$ ./Rserver help # help表示
$ ./Rserver start # 起動
$ ./Rserver stop # 停止
$ ./Rserver restart # 再起動
$ ./Rserver status # (起動していれば)プロセス表示
```

webサーバが起動していない場合に停止コマンドを叩くと、関係ないプロセスを殺す可能性がある、
というバグが残っているので、ご利用は計画的に。そのうちなおします。
【Sinatra】オートリロードしてほしい

続編書いた → http://qiita.com/izumin5210/items/cbaa99231c031cec8b07


---

コード変更するたびに再起動は超面倒なので…
`Sinatra::Reloader`を使うといいらしい．

# つかいかた

## 導入

とりあえず`sinatra-contrib`を入れる．

```ruby:Gemfile
# 前略

gem 'sinatra'
gem 'sinatra-contrib'

# 後略
```

## 有効化

### Classic Application

`require 'sinatra/reloader'`するだけでOK．
開発環境だけでしか使わないなら`development?`で判定して読み込ませる．

```ruby:app.rb
# coding: utf-8
# くらしっくなやつ

require 'sinatra'
require 'sinatra/reloader' if development?

# 後略
```

### Modular Application

`require 'sinatra/reloader'`は同じ．
オートリロードさせたいクラス内で`register Sinatra::Reloader`すると有効化される．らしい．

```ruby:app.rb
# coding: utf-8
# もじゅらーなやつ

require "sinatra/base"
require "sinatra/reloader"

class App < Sinatra::Base
  configure :development do
    register Sinatra::Reloader
  end

  # 中略

end

# 後略
```

# 参考
- [Sinatra::Reloader (part of Sinatra::Contrib)](http://www.sinatrarb.com/contrib/reloader.html)
blencでPHPソースを暗号化(復号できない)

PHPはソースが平文です。
シェアウェアの[MovableType](http://www.movabletype.jp/)や、はてまた糞高い[SitePublis](http://www.sitepublis.net/)ですら、ソースさえ手に入れてしまえばどうとでもできてしまいます。

ということでソースを暗号化してしまいましょう。
[Blenc](http://www.php.net/manual/ja/book.blenc.php)というBLowfishライブラリを見つけましたが、日本語情報がマニュアルのコピペサイト以外一切ありません。
どうなってんだ。

[PECL](http://pecl.php.net/package/blenc)なのでLinuxであれば適当にpecl installとかしてください。
Windowsはdllが用意されているので拾ってきてphp.iniにextensionを書けばOKです。

```php
extension=php_blenc.dll
blenc.key_file = C:\xampp\blenc.key_file
```

blenc.key_fileは暗号化キーを保存する場所の設定です。
デフォルトは'/usr/local/etc/blenckeys'になっているので、Windowsでは変更必須です。
ini_set()で変更してもいいです。

```php
<?php
	// 暗号化するソース
	$source = file_get_contents('path/to/hoge.php');
	
	// 暗号化して書き込み。返り値は暗号化キー
	$key = blenc_encrypt($source, 'path/to/hoge.encrypt.php');
	
	// 暗号化キーも保存
	file_put_contents($ini_get('blenc.key_file'), $key, FILE_APPEND);
```

hoge.phpをBlowfishで暗号化した結果がhoge.encrypt.phpとして保存されました。
中を見てみると、全く読むことができない状態になっているのがわかります。

そしてこのhoge.encrypt.php、直接PHPファイルとして取り扱い可能です。

```
Fatal error: blenc_compile: Module php_blenc was expired. Please buy a new license key or disable the module. in Unknown on line 0
```

おうふ。

expiredってなんだよ。

Blencのソースを見てみる。

http://svn.php.net/viewvc/pecl/blenc/trunk/blenc.c?view=markup

```
	// エラーはここで発生
	if(BL_G(expired)) {
		zend_error(E_ERROR, "blenc_compile: Module php_blenc was expired. Please buy a new license key or disable the module.");
		return NULL;
	}
	
	// BL_Gはexpire_charと比較してる
	BL_G(expire_date) = pemalloc(sizeof(expire_char), TRUE);
	
	// expire_charはBLENC_PROTECT_EXPIRE
	char expire_char[] = BLENC_PROTECT_EXPIRE;
```

http://svn.php.net/viewvc/pecl/blenc/trunk/blenc_protect.h?view=markup
	

```
	// BLENC_PROTECT_EXPIREは2013年4月30日
	#define BLENC_PROTECT_EXPIRE "30-04-2013"
```

なんだこれ。

ということでソースからコンパイルできる人続きを頼んだ。
CakePHP1.3をComposer使って配置

誰も使わないとは思うけど、Composerの勉強を兼ねて、CakePHP1.3の初期構築するものを作ってみた  
https://github.com/atomita/composer-cakephp1  

後は、プラグインをvendorディレクトリに置いたままで扱えるようにする予定
slidifyでタイトルスライドに背景画像


とりあえず、Rmd ファイルに直に書き込んで、実現しておく

```html
<style>
.title-slide {
     background-image: url(assets/img/moemoe.png);
     background-repeat: no-repeat ;
     background-position: right center;
   }
</style>
```

あとframeworkをhtml5slidesと設定したらtheme指定を忘れない

```html
framework   : html5slides  
theme       : default
```

それからコードチャンクをそのまま表示しようとおもってタブやスペースを置いても効かなかった。

```html
    ```{r} `r ''`
```
とするか、あるいは以下のようにしたら実現できた。

```html
    `r ''````{r,fig.height=5} 
    plot(cars)
    ```
```


タブではダメで、行頭にスペース四つ置いて、チャンクの頭に`` `r ''` `` 置けば、slidify でも RStudio の R Presentation でも、コードチャンクをまんま表示させられるので良いんかな。
Mac OS X 開発環境構築メモ

# インストール

## 必須インストール

- X-code
- homebrew
  - http://brew.sh/

## 言語ごとの開発環境

- ruby
  - rbenvでインストールする。capistranoはどの言語でも使うのでいれておく。railsも。
- Java
  - OracleのJava SDK 1.7をいれてデフォルトにする。
  - gradleを利用するのでGVMでGroovyと一緒にインストールする。
- Scala
  - sbtと一緒にbrewでいれる。
- Python
  - brewで入れるとpipコマンドもはいります。
- PHP
  - 言語はMaveriksでは5.4系が入っているのでとりあえず放置。comporserだけプロジェクト共通で利用できるようにしておく。

## ツール

- Play framework
  - $HOME/libに配置して$HOME/bin/playからリンクする
- vim プラグイン
  - Javaは重いので入れない。
- eclipse
  - git, Android Development Tool, Vrapper, Subversion
- Android SDK


# インストール手順

## ruby

rbenv

```shell-session:command
brew install ruby-build
brew install rbenv
rbenv install 1.9.3-p484
rbenv install 2.0.0-p353
gem install capistrano --version "<3.0.0"
```

## Java

JavaはOracleの1.7をインストールする。Mavericksではインストールすればパスも自動設定されるようだ。インストール後JAVA_HOMEのexportを.bashrcに追記すればOK。

http://www.oracle.com/technetwork/jp/java/javase/downloads/index.html

Gradleを利用するためGVMをいれる。Groovyも小物スクリプトとか便利な場合がおおいのでバージョン管理できるように。

```shell-session:command
curl -s get.gvmtool.net | bash
gvm install groovy
gvm install gradle
```

## Scala

scalaとsbtはbrewでインストールしておきます。

```shell-session:command
brew install scala
brew install sbt
```

## Python

```shell-session:command
brew install python
```

## Play Framework

ホームフォルダのlibに入れてbin/playでシンボリックリンクを作成する。

```shell-session:command
mkdir ~/lib
cd lib
brew install wget
wget http://downloads.typesafe.com/play/2.2.1/play-2.2.1.zip
unzip play-2.2.1.zip
```

## vim

neobundleをいれてプラグイン管理をしやすくしておきます。
ついでに非同期処理できるvimprocだけいれておきます。

```shell-session:command
mkdir -p ~/.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
git clone https://github.com/Shougo/vimproc ~/.vim/bundle/vimproc
```

## eclipse

- vrapperを入れる
  - http://vrapper.sourceforge.net/home/
- Android
  - http://developer.android.com/sdk/installing/installing-adt.html
- git
  - 標準リポジトリからいれる

# PHP

composerを公式の通りにいれる。

```shell-session:command
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

## MySQL, MongoDB, memcached, Nginx

パッケージでいれないでbrewでいれる

```shell-session:command
brew install mysql
brew install MongoDB
brew install memcached
brew install nginx
```
homebrew で maven 2.2.1 を使うメモ

homebrew で maven 3.x を入れているが、2.2.1 を使いたい場合のメモ

```bash
$ brew unlink maven # すでに maven 3.x を入れてしまっている場合
$ brew tap homebrew/versions
$ brew install maven2
```

# SEE ALSO

http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula
JavaScriptでもジェネレーター関数


ジェネレーター関数は説明が難しいが、一言で言うと「値を小出しに返す関数(を作る関数)」。Pythonでは例えばこう使える。イタレータを作る関数と言っても良いかも。

```
def firstn(n):
    num = 0
    while num < n:
        yield num
        num += 1

gen = firstn(10)

print gen.next() # —> 0
print gen.next() # —> 1
print gen.next() # —> 2
…
print gen.next() # —> 11回目は StopIteration 例外が起きる
```

当然、forループやリスト内包表記でも使える。

```
for n in firstn(10):
    print n,
# —> 0 1 2 3 4 5 6 7 8 9

print [n for n in firstn(10)]
# -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

で、このジェネレータ関数をJavaScriptでも使えるようになるらしい。正式にはES6 (ECMAScript version 6)で規格化される予定だが、幾つかの実装は既にこの機能を取り入れ始めている。

Node.jsも次の安定版v0.12で正式採用すべく、v0.11でジェネレータが使えるようになっている。で、それを使ってみた。

まず上の例をJavaScriptで書きなおし。

```
firstn = function* (n) {
    var num = 0
    while (num < n) {
        yield num
        num += 1
	}
};

gen = firstn(10);

console.log(gen.next()); // —> { value: 0, done: false }
console.log(gen.next()); // —> { value: 1, done: false }
console.log(gen.next()); // —> { value: 2, done: false }
…
console.log(gen.next()); // —> 11回目は { value: undefined, done: true } が返る
```

Pythonと違うのは値が返るのではなく、valueとdoneという二つのattributeを持つobjectが返るということ。繰り返しが終わったときには例外を発生させるのではなく、doneがtrueになる。

なお実行時には `node —harmony` とする。”Harmony”はES6のコードネームらしい。

そしてこれもforループで使える

```
for (n of firstn(10)) {
	process.stdout.write(n + " ");
}
// —> 0 1 2 3 4 5 6 7 8 9 
```

ES6ではリスト内包表記も使えるようになるらしいのだが、現在の最新版 (0.11.9)では未サポート。残念。
対象のディレクトリがなかったら作成するシェルスクリプトワンライナー

```bash
dir=/path/to/dir; [ ! -e $dir ] && mkdir -p $dir
```

※エラー出力をただ握りつぶしたい場合は下記の書き方のほうがシンプルでした。

```bash
mkdir -p /path/to/dir 2>/dev/null
```
Google Spreadsheetで一度に複数行を追加する

本当はExcelみたいにコピーした行を別のブックやシートに挿入できると一番嬉しいのですが、それはできません。そこでコピーしたい行数をコピー先に追加して、そこにペーストするということをやっています。

が、1行ずつしか追加できなくてショートカットキーもないのでマウスでポチポチやっていました。が、追加したい場所の上または下で、追加したい行数分だけ選択してからポップアップメニューを開くと一気に追加できるということを知りました。追加されるのは空の行なので、選択する内容は関係なくて、選択した行数だけが意味を持ちます。

ドキュメントにも書かれていました。
[行や列を追加、削除する - ドライブ ヘルプ](https://support.google.com/drive/answer/44684?hl=ja)
【Objective-C】クリップボードにコピー


iphoneアプリでクリップボードにコピーさせる方法。


```obj-c
UIPasteboard *pb = [UIPasteboard generalPasteboard];
[pb setValue:@"文字列" forPasteboardType:@"public.utf8-plain-text"];
```


もちろん@"文字列"の部分を変数に変更することも可能。
Compiling mosquitto on Ubuntu 12.04LTS


This documentation describes how to install mosquitto (Open Source MQTT Broker) by compiling source code on Ubuntu.
Typically, you can install mosquitto by using package management *apt-get install mosquitto* command. 

## Preparation

Install gcc, make, g++, libssl-dev.

```
$ sudo apt-get install gcc make g++ libssl-dev
```

Create mosquitto user and group.

```
$ sudo groupadd mosquitto
$ sudo useradd -g mosuqitto mosquiotto
```


## Compile mosquitto

Download souce code from here. http://mosquitto.org/download/

Extract tar ball and change directory.

```
$ tar xvzf mosquitto-1.2.3.tar.gz
$ cd mosquitto-1.2.3
```

Complile mosquitto.

```
$ make
$ sudo make install
```

Here are default intall path.

| path     | files |
|-----------|------------|
| /usr/local/sbin       |        mosquiotto server     |
| /etc/mosquitto     |   configuration   |
| /usr/local/bin       |       utility command     |






Sample configuration file will be installed in /etc/mosquitto/mosquitto.conf.example. Change file name to be official.

```
$ mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
```

##Start mosquitto

Boot mosquitto by following command.

```
$ sudo -c mosquitto /usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
```

If you want to start mosquitto in background, please add *-d* option in order to start it as daemon.


## Upstart

Upstart is available on Ubuntu by default. Add mosquitto.conf to /etc/init/. 

```/etc/init/mosquitto.conf
description “Mosquitto MQTT broker”
author “Roger Light <roger@atchoo.org>”

start on net-device-up

respawn

exec /usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
```

Register the script.

```
$ sudo initctl reload-configuration
$ sudo initctl list | grep mosquitto
```

Please make sure mosquitto is registered.

You can start/stop mosquitto as follows:

```
$ sudo initctl (start|stop) mosquitto
```

If the configuration is registerd correctly, mosquitto will be started automecally as of next boot.
Unity4.3で__curOrientationが見つからないとかいうエラーが出る


## はじめに

Unity4.2 + Vuforiaで作成したプロジェクトを、Unity4.3に移行してビルドすると以下のようなエラーがでる。（Vuforiaが関係してるかどうかは未確認。）

```text:
Undefined symbols for architecture armv7: "__curOrientation", referenced from: -[UnityAppController application:didFinishLaunchingWithOptions:] in UnityAppController.o
```

これは、以下のサイトを見ると、__curOrientationがstaticで宣言されているせいで出るようだ。

http://answers.unity3d.com/questions/574600/unity-43-wont-build-in-xcode.html

## 解決策

前述のサイトによると、解決策は、

### その１（手動）

XCode上で、iPhone_View.mmファイルの中の

```objc:iPhone_View.mm
	static ScreenOrientation _curOrientation = orientationUnknown;
```

という行を、

```objc:iPhone_View.mm
	ScreenOrientation _curOrientation = orientationUnknown;
```

というようにstaticをはずせば良いようだ。

### その２（自動）

また、自動で変更する方法として、Unityプロジェクトの中の
 Assets/Editor/PostProcessBuildPlayer
というファイルの３６７行あたりの

```python:PostProcessBuildPlayer
     if line.strip()[0:40] == 'static ScreenOrientation _curOrientation':
```

という行を、

```python:PostProcessBuildPlayer
   if line.strip()[0:40] == 'static ScreenOrientation _curOrientation' or line.strip()[0:40] == 'static ScreenOrientation	_curOrientation':
```

に書き換えれば、後はビルドしたときに自動で変更してくれる。
（前述のサイトの変更後のソースをコピーすると、_curOrientationの前に、スペースが２つ入っているが、これはタブ１個の間違いのようです。）
github の go get が 404 を返す時

全然大したことではなかったんだけど、微妙にハマッた。

やりたいことは、自分の github にある以下の Go のライブラリを go get で取ろうとしただけ。

[https://github.com/jxck/swrap]

```shell-session
$ go get github.com/jxck/swrap
```

で、認証要求されて、あれ？ となり、正しく入れても 403 エラーが返ってきた。


結果から言うと、俺の github 上のリポジトリは正確には J が大文字だった。

[https://github.com/Jxck/swrap]

そんだけか！ と思いつつ、 j が小文字でもブラウザではアクセスできるし、
自分はずっと小文字でアクセスしてたからそこ意識してなかった。
しかも 404 にはならず 403 だから、認証がうまく通らないのかなんなのかと
色々勘ぐってて、結局一文字変えたら認証もなくすんなり通ったという話。

地味過ぎて同じことヒットしてる人も少ないので、もしいたらひっかるように書いておく。
Rendr入門スライド＠東京Node学園祭2013

いまさらですが、東京学園祭2013で「Rendr」についての講演をした時のスライドです。

<iframe src="http://www.slideshare.net/slideshow/embed_code/27589888" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/mshk/rendr" title="Rendr入門: サーバサイドで(も)動かす、Backbone.js" target="_blank">Rendr入門: サーバサイドで(も)動かす、Backbone.js</a> </strong> from <strong><a href="http://www.slideshare.net/mshk" target="_blank">Masahiko Tachizono</a></strong> </div>
現在使っているRubyにインストールしているgem群を他のRuby環境でも使えるようにインストールする方法


rbenvとかで複数のバージョンのRubyを使っているときや、新しいRubyがリリースされたとき、今まで使っていたRubyのgemを新しいRubyで一括インストールしたいなと前々から思っていたのですが、普段Rubyを使っていないのでやり方が分かりませんでした。

で、Ruby2.1.0がリリースされたおかげか、ネットサーフィンを見ていたらたまたま[そのやり方が書いてあるエントリ](http://sho.tdiary.net/20131226.html)を見つけたので、そこからほぼ引用でやり方書いてみます。

```
gem list --no-versions > /tmp/gemlist
rbenv global 2.1.0
gem install `cat /tmp/gemlist`
```

ポイントはgem listを--no-versionsオプション付けて実行するところですね。普段Ruby使ってないのでこのオプション知らなかったのですが、普段から--helpとか実行して役立ちそうなオプションをチェックしておけば良かったなって思いました。
Adobe MediaEncoderのプリセット一覧を取得する

指定可能な出力形式とプリセットの一覧をテキストファイルに書き出します。

```js:GetPresets.jsx
(function() {    var saveFile = File.saveDialog ("ファイル名を指定してください");    if (!saveFile) return;    if (!saveFile.open("w")) {        alert("このファイルには書けません");        return;    }    var eh = app.getEncoderHost();    var formats = eh.getFormatList();    for (var i = 0; i < formats.length; i++) {        var encoder = eh.createEncoderForFormat(formats[i]);        saveFile.writeln("Format: " + formats[i]);        var list = encoder.getPresetList();        for (var j = 0; j < list.length; j++) {            var preset = list[j].split("#");            saveFile.writeln("  " + preset[1] + " (" + preset[0] + ")");        }    }    alert ("書きました");})();
```

下記のような出力を得られます（QuickTimeを一部抜粋）。

```
Format: QuickTime  HD 720p 24, H.264, AAC 48 kHz (20bd3f54-109f-4818-9df7-8931298e5449)  HD 1080i 25, H.264, AAC 48 kHz (b6a1e533-04f8-47d4-ac59-f84f8a149ec2)  HD 1080i 29.97, H.264, AAC 48 kHz (18a7bc60-5c92-43da-9aff-d9c8b1eb6460)  NTSC DV 24p (4bba806c-9006-4154-ad19-d316837f2f6e)  NTSC DV Widescreen 24p (85610a25-ed84-4034-aeb7-b0f830abcd7b)  NTSC DV Widescreen (f92d92bc-1cb6-4d46-9678-a8b024cd600b)  NTSC DV (61f4720e-cfad-4242-a765-6488959ca2c8)  NTSC, H.264, AAC 48 kHz (701d7062-d27d-4730-b540-f4ca9d812831)  PAL DV Widescreen (4076425e-d2c3-4cf0-acc5-64836ca907f1)  PAL DV (c734efce-c42d-4691-9538-29b18bebfcf1)  PAL, H.264, AAC 48 kHz (1e6be43d-eb4d-4ae6-b8c6-b491c5025781)  b3c8ed19-ce27-4e41-b6cf-eb8604ce3378 (b3c8ed19-ce27-4e41-b6cf-eb8604ce3378)  1512e4ef-1409-426a-b85e-c847bfbb32e5 (1512e4ef-1409-426a-b85e-c847bfbb32e5)
```

括弧内は内部採番されているプリセットIDです。
[encoder].loadPresetメソッドの引数にするのは括弧の前の文字列です。
ユーザープリセットやシステムプリセットの一部にはHumanReadableな名前がつけられていないので，トライ＆エラーで特定することになると思います。
python swigで生成したユーザ定義型のメソッドを上書きする方法


swigでpython extensionを生成すると、Cで定義した構造体は自動的に以下のような```__repr__```が定義される。

```
<swig_mymodule.mytype; proxy of <Swig Object of type 'struct mytype *' at 0x7f6c74210a20> >
```

このままだとかっこ悪いのでなんとかしたいが、C側で(というかswigで)制御する方法はみつからなかった。

以下のように`%pythoncode`内で`setattr`してやればswigが生成するpython code内にその内容が出力されるので、import時に上書きされるようになる

```swig_mymodule.i
%pythoncode %{
import types

def __mytype_str(self):
    return "<Mytype(…)>”

setattr(mytype, '__str__', types.MethodType(__mytype_str, None, mytype))
%}
```
[2013年版] JQuery.Deferredでwait風メソッド

javascriptで実行待ちの場合、setTimeout使えばいいんですがいちいちコールバック関数として引き渡してやる必要があるのでたとえば2秒待った後に1秒待つ、といったように実装する際、コールバックがネストし、見ていてやるせないコードになります。
(そんな設計するのがそもそも悪いってのもあるかもしれませんが)
例えばこんな感じ。

```js
setTimeout(function(){
    // 2000ms 待った後に実行されるコールバック
    setTimeout(function(){
      // 1000ms 待った後に実行されるコールバック
      // その何秒後かにまた実行するコードを書くとさらにネストが下がっていく...
    },1000);
},2000);
```

ネストが2個とかそこらならまだ許容範囲かもしれませんが、
どうせならJQuery.Deferredを使ってネストをあまり下げないように書いてしまいましょう。

まずは以下のようなメソッドを定義しておきます。

```js
$.wait = function(msec) {
    // Deferredのインスタンスを作成
    var d = new $.Deferred;

    setTimeout(function(){
        // 指定時間経過後にresolveしてdeferredを解決する
        d.resolve(msec);
    }, msec);

    return d.promise();
};
```

見ての通り、別にむずかしいことはやってません。
引数のチェック等は必要であれば適宜入れておくといいと思います。

使い方は下記のような感じです。

```js
$.wait(2000)
  .done(function(){
      console.log("2000ミリ秒待ちました");
  });
```

doneでコールバックを登録することで指定した時間経過後に実行するメソッドを定義できます。
また最初にあげたような多段の場合ですが、こちらはthenで指定して中で再度waitをコールし、返ってきたdeferredをreturnしてやれば次のチェーンに引き渡せます。

具体的には以下のような感じです。

```js
$.wait(2000)
  .then(function(ms){
      console.log(ms + "ミリ秒待ちました");
      // 次のコールバックに渡すために新たなdeferredを返却
      return $.wait(1000); 
      // 次のコールバックも同様のやり方でつなげばいくらつないでもネストはこれ以上下がらない
  })
  .done(function(ms){
      console.log(ms + "ミリ秒待ちました");
  });
```

これでまず2000ms待ってから、コンソールに表示し、さらに1000ms待ってからコンソールに表示、といったような動きをします。
thenの中でwaitのdeferredをreturnというのを繰り返すことでネストを深くせずにチェーンを連続して書けます。
ちなみにwaitの中でresolveする時にwaitの引数をそのまま渡しているのでコールバックの中でそれを引数として受け取れます。

jQuery.deferredについて更に知りたい方は下記を参照ください。
https://www.null-engineer.ml/

# 非jQueryで実装する方法
https://qiita.com/ki-sato/items/6fad4333000825a12a19
ターミナルのコマンドを使って今月の平日の日付だけ取得したい

calコマンド知らなかったので教えてもらいました。

Macで試してます。

```shell-session
$ cal | awk -v ORS=' ' 'NR>=3{print $2, $3, $4, $5, $6}'
2 3 4 5 6 9 10 11 12 13 16 17 18 19 20 23 24 25 26 27 30 31
```

さすがに祝日は抜けないですが！これでいいかんじでした！
calコマンドは環境によって結構実装が変わるようなのでもし挙動が違ったらすいません。
Nginx で Basic 認証に LDAP を使う

nginx ([openresty](http://openresty.org/)) で Basic 認証に LDAP を使うためには [nginx-auth-ldap](https://github.com/kvspb/nginx-auth-ldap) を追加で組み込む必要があります。

clone した directory を configure の --add-module で指定して build します。

```bash
curl -O http://openresty.org/download/ngx_openresty-1.4.3.9.tar.gz
tar xvf ngx_openresty-1.4.3.9.tar.gz
git clone https://github.com/kvspb/nginx-auth-ldap.git
cd ngx_openresty-1.4.3.9
./configure \
  --prefix=/some/where/openresty-1.4.3.9 \
  --with-luajit \
  ... \
  --add-module=../nginx-auth-ldap
make
sudo make install
```

```nginx:nginx.conf
http {
    ldap_server ldap-sales-group {
        url ldap://ldap.example.com:1389/dc=example,dc=com?uid?sub?(objectClass=person);
        group_attribute uniqueMember;
        group_attribute_is_dn on;
        require group cn=Sales,ou=Groups,dc=example,dc=com;
    }
    ldap_server ldap-hr-group {
        url ldap://ldap.example.com:1389/dc=example,dc=com?uid?sub?(objectClass=person);
        group_attribute uniqueMember;
        group_attribute_is_dn on;
        require group cn=HR,ou=Groups,dc=example,dc=com;
    }
    ldap_server ldap-anyone {
        url ldap://ldap.example.com:1389/dc=example,dc=com?uid?sub?(objectClass=person);
        require valid_user;
    }
    server {
        listen 80;
        server_name localhost;
        location / {
            auth_ldap "test1"
            auth_ldap_servers ldap-anyone;
        }
        location /sales/ {
            auth_ldap "test2"
            auth_ldap_servers ldap-sales-group;
        }
        location /hr/ {
            auth_ldap "test3"
            auth_ldap_servers ldap-hr-group;
        }
    }
}
```

LDAP サーバーは [OpenDJ](http://opendj.forgerock.org/) で試しています。

- http://blog.1q77.com/2013/03/opendj-ldap-server-1/
- http://blog.1q77.com/2013/04/opendj-ldap-server-2/

ActiveDirectory の場合は `uid` ではなく `sAMAccountName` になります。
`binddn`, `binddn_password` も必要かもしれません。
Mac Chromeでの自動テスト環境構築

## はじめに
* Mac環境でのChromeを使った自動テスト環境構築方法をメモ

## 実行環境
* OS : Mac OS X 10.9
* Ruby : 1.9.3p392
* GoogleChrome : 31.0.1650.63
* selenium-webdriver : 2.38.0
* ChromeDriver : [chromedriver_win32.zip](http://chromedriver.storage.googleapis.com/2.8/chromedriver_win32.zip)

## 作業
* GoogleChromeをインストールし、パスが以下のようになっているか確認
 * "/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"
* ChromeDriverをインストール
 * [chromedriver_win32.zip](http://chromedriver.storage.googleapis.com/2.8/chromedriver_win32.zip)から取得する
 * ダウンロードしてきたディレクトリで以下を実行

```
$ unzip chromedriver_win32.zip
$ ls chromedriver # unzip後の確認
$ ln -s chromedriver /usr/local/bin/chromedriver #chromedriverのパスを通す
```

後はcucumber/capybaraなりで書いたコードを実行すればブラウザがふわっと立ち上がりテストが始まるという物語

## はまったところ
* 一番大切なのはこのはまったところなのですが、２点ほど
 * まず、Chromeは自動更新なので追従してChromeDriverも対応してあるやつに変えないといけない
 * 次に、MacのChromeDriverではoptionのprofileが使えないということ

### MacのChromeDriverではoptionのprofileが使えない件
* opts[:profile] = Selenium::WebDriver::Chrome::Profile.new のように書いていた
* LinuxのChromeでは使えていたので使えると思いきやMacでは・・・
 * 「unknown error: cannot parse capability: chromeOptions from unknown error: unrecognized chrome option: profile」といわれてるので書き方が変わったのだろう
 * 実行してみた限りでは削除してもいけたのでこれがないとだめっていうわけではないようだ

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
How to install Rails with Ruby 2.1.0

`gem install rails` したら

```
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    no such name (https://api.rubygems.org/quick/Marshal.4.8/atomic-1.1.8-java.gemspec.rz)
```

というエラーが出たので `atomic` を入れればイイですよ。というハナシ。

```shell-session
%  gem install atomic
%  gem install rails
```
Lisp Machine風xmodmap

Emacsを使うなら、Spaceキーの隣から順に、
Ctrl,Altが並んでほしい。

かつ、日本語の変換はWindowsキーに割り当てている。

```:.Xmodmap
! 133 is Windows key
keycode 133 = Zenkaku_Hankaku Kanji Zenkaku_Hankaku Kanji
! 修飾子マップ mod4 から Win キーのコードを削除
remove mod4 = Super_L
! 101 is katakana_hiragana key
keycode 101 = Alt_R Meta_R Alt_R Meta_R

remove Control = Control_L
remove Control = Control_R

keycode 102 = Control_L NoSymbol Control_L
keycode 100 = Control_R NoSymbol Control_R

add Control = Control_L
add Control = Control_R
```
nvmの一発インストール


Node.jsはhomebrewでインストールして使っていたが、開発版を並行して使いたくなったのでnvmを導入。

ちょっと探したが、コマンドライン一発でのインストールは無かったのでメモ。

```
curl https://raw.github.com/creationix/nvm/master/install.sh | sh
```

まぁ、[creationix/nvm](https://github.com/creationix/nvm)のReadmeに書かれているまんまなのだが。

Shell Scriptの中身を見ると判るように、GitHubのリポジトリをcloneして.(bash_)profileにnvm.shをsourceするコマンドを埋め込むだけ。

後は任意のバージョンをインストールし、

```
$ nvm install 0.10
   …
$ nvm install 0.11
   …
```
使うバージョンを指定するだけ。

```
$ nvm use 0.11
```

デフォルトを指定したければ、こんな感じ。

```
$nvm alias default 0.10
```

次にシェルを起動した時から、nodeが普通に使えるようになる。
Duck naming

# ダック・ネーミング

ほとんどの表記では、変数に糖衣構文があまりない。
もし、ドナルド・ダックを呼べば、それは来ることになる。
できれば、値のタイプは、そのキーから推論することができる。

例えば、JSONドキュメントで、これはドナルド

私の規約は・・・

Null
----

`...`で始まるキー。

    \A\.{3}

例：

* `...topside-player`
* `...result?`
* `...id#`

Array
-----

`[]`で終了しているキー。

    .*\[\]\z

例：

* `...coordinates[]`
* `articles[]`
* `棋[]`

Number
------

`#`で終了しているキー。

    \#\z

例：

* `id#`
* `article_id#`
* `...friends#`

Hash
----

`{}`で終了しているキー。

    .*\{\}\z

例：

* `last_move{}`
* `...SearchDocument{}`
* `params{}`

Boolean
-------

`?`で終了しているキー。

    \?\z

例：

* `...result?`
* `valid?`
* `following?`

String
------

他のパターン。

例：

* `...lang`
* `name`
* `title`

***

## 例

    {
      "created#": 1934,
      "name": "Donald Duck",
      "male?": true,
      "...location": null,
      "aliases[]": [
        "Duck Avenger",
        "Superduck",
        "Paperinik",
        "Captain Blue Fantonald"
      ]
    }
Unity2D+NGUIでゲーム作るよ！ その0

Unityをはじめて3ヶ月たったので習得時につまづいたところや思うところを色々書いていきます(｀・ω・´)

# 0.1 Unityでのゲームの考え方
Unityでゲームを作成する際、以下のように考えるとスムーズに習得できると思います
1.ゲームは複数のSceneで構成される
2.Sceneは複数のGameObjectで構成される
3.GameObjectは複数のComponentで構成される

--

1.ゲームは複数のSceneで構成される

Sceneとは「タイトル画面」「ステージ画面」「ゲームオーバー画面」のことです。
Unityではそれぞれを用途・機能によって独立した画面として扱います。
SceneはUnityでは「*.unity」という拡張子のファイルです。

↓これ
![スクリーンショット 2013-12-27 2.58.43.png](https://qiita-image-store.s3.amazonaws.com/0/19692/77c5e025-8c51-3110-4b40-13a6af49bb6b.png)
　
2.Sceneは複数のGameObjectで構成される

シューティングゲームを例に挙げるとGameObjectとは「自機」「敵機」「自機の出す弾」などです。
GameObjectは独立して移動したり衝突を検知したりすることができます。
Unityでは再利用可能/動的生成可能なGameObjectを「Prefab」と呼びます。
PrefabはUnityでは「*.prefab」という拡張子のファイルです。

↓これ
![スクリーンショット 2013-12-27 2.59.38.png](https://qiita-image-store.s3.amazonaws.com/0/19692/0fc71c30-cc93-750f-eef0-8ab08f0dbc16.png)

　
3.GameObjectはComponentで構成される

「オブジェクト」は以下の様な様々な機能で構成されます。
・座標の定義(Transform)
・画面への表示(Renderer)
・衝突の検出(Collider)
・音声再生(Audio)
etc..

Unityでは上記のような機能の一つ一つをComponentと呼びます。
GameObjectには複数のComponentを持たせることができます。
また、自分で記述したScript(Javascript,C#,Booで記述)をComponentとして扱うことができます。
(※いくつかのルールに従う必要があります。詳しくは後述)

↓これ
![スクリーンショット 2013-12-27 3.00.03.png](https://qiita-image-store.s3.amazonaws.com/0/19692/162f5c1c-9a6d-b3e3-8e8d-6ebb2c9130b4.png)
　
# 0.2 MonoBehavior

Unityでゲームをつくろうとし、Scriptを作成すると以下の様なファイルが作成されます。

```c#:NewBehaviourScript.cs
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
	void Start () {
	}

	void Update () {	
	}
}
```

これはMonoBehaviourを継承したクラスです。
MonoBehaviourを継承したScriptはComponentとしてGameObjectに追加できます。
MonoBehaviourはUnityのコアとなる多くの機能が定義されているので何度もリファレンス読んで理解するのがおすすめです。

https://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.html


そしてScriptをComponentとして扱うにはいくつかのUnity独自ルールがあります。
- コンストラクタを書いてはいけない
　(コンストラクタ動作が保証できないため。Awake()もしくはStart()で初期化処理をかく)
- class名とファイル名は同じにする
　(同じにしないとエラー)
- 調整や紐付けが必要なメンバ変数はserializefieldにし、Inspectorで編集可能にする

--
ざっくりはじめての人向け概要と用語説明おわり。
次回(その1)は実際にUnityでゲームの枠組み作成&2D画像表示をやってみるところ
年賀状の宛名をtex + lispで作る

いろいろと改変は必要だったけど(特に文字コード) べつにとくに大したことはなかった。
slurpのコードは借りてきた。

```cl
(ql:quickload :alexandria)
(ql:quickload :inferior-shell)
(ql:quickload :cl-csv)
(ql:quickload :osicat)
(in-package :cl-user)
(use-package :alexandria)
(use-package :inferior-shell)
(use-package :cl-csv)
(use-package :osicat) ;; 2 conflict

;; http://www.ymeme.com/slurping-a-file-common-lisp-83.html

(defun slurp (stream)
  (let ((seq (make-array (file-length stream)
                         :element-type 'character
                         :fill-pointer t)))
    (setf (fill-pointer seq) (read-sequence seq stream))
    seq))

(defun read-file-to-string (path)
  (with-input-from-file (s path)
    (slurp s)))

;; http://homepage2.nifty.com/domae/tex/atena.html
;; 古いので sjis + DOS改行コード
;; 
;; atena.sty --> dos2unix , nkf --in-place -J -w8
;; 

(defun take-tex ()
  (read-file-to-string "atena/2014.tex"))

(defun format-tex (data s)
  (format s (take-tex) data))

(format-tex '(("なかじま" "123-0348" "千葉東京ディズニーランド")
             ("なかじま2" "124-0348" "北海道札幌1-1-1-1-1-1-1"))
             t)

(defun %make-pdf (data)
  (with-open-file (s "atena/temp.tex"
                     :direction :output
                     :if-does-not-exist :create
                     :if-exists :supersede)
    (format-tex data s))
  (run/s `(progn (cd "atena")
                 (platex "temp.tex")
                 (dvipdfm "temp.dvi")
                 (mv "temp.pdf" "../2014-atena.pdf"))
         :show t))

(%make-pdf '(("なかじま" "123-0348" "千葉東京ディズニーランド")
             ("なかじま2" "124-0348" "北海道札幌1-1-1-1-1-1-1")))


(defun make-pdf (csv-path)
  (%make-pdf (csv-data csv-path)))

(defun csv-data (path)
  (with-input-from-file (s path)
    (read-csv s)))

(csv-data "addresses.csv")

;; なかやまきんに君,000-0000,札幌1-1-1-1-1-1

(make-pdf "addresses.csv")
```

以下 `2014.tex`

```tex
\documentclass{jarticle}
\usepackage[hagaki,nenga]{atena}
\usepackage{graphicx}

\begin{document}

%=======差出人設定================
\sasidasinin{浅井 政太郎}{000-0000}{東京都目黒区駒場3-8-1 東京大学駒場キャンパス}

%=======表書き開始==============
\begin{atena}

~:{
\personal{~a}{~a}{~a}
~}

\end{atena}
\end{document}
```
[まちがい]deffaceで定義するfaceの名前を-faceで終わらせるとエラー吐かずにハイライトがとまる

あ゛あ゛あ゛あ゛あ゛ああ゛゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛
あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛

```el
(defface extra-ws-face
  '((t (:background "hotpink" :foreground "black")))
  "Used in text-mode and friends for exactly one space after a period.")

(font-lock-add-keywords
 'lisp-mode
 '(("^\\s-+$" . extra-ws-face)))
```
これだと動きません。下だと動く。(ついでに他の設定も書いてます)

```el
(defface extra-ws
  '((t (:background "hotpink" :foreground "black")))
  "Used in text-mode and friends for exactly one space after a period.")
(font-lock-add-keywords
 'lisp-mode
 '(("\\<\\(FIXME\\|TODO\\)" 1 font-lock-warning-face t)
   ("^[^\n]\\{80\\}\\(.*\\)$" 1 font-lock-warning-face t)
   ("(\\(def\\w*\\)\\s +\\(\\_<\\w+\\_>\\)"
    (1 font-lock-keyword-face t)
    (2 font-lock-function-name-face t))
   ("^\\s-+$" . extra-ws)))
```

いやたしかに、マニュアルには「-faceで終わるのはredundantだからやめろ」とは[書いてある](http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Faces.html#Defining-Faces)んですけれどね、
でも、「そう書いたら動かなくなる」とはヒトコトも書いていないわけですよ。
どういうことよ。はあ。`*Messages*` バッファ見たら、

```
Error during redisplay: (void-variable extra-ws-face)
```
ということなので、たぶん内部で *-face という変数を使っているんでしょうね。
はあ。激おこプンプン丸でした。
MojoX::Renderer::Xslate VERSION0.07でループするバグ

要点としては、0.09にアップすれば直ります。

0.07はエラーになったらエラー表示のテンプレートを探しに行くんですが、
まぁ、そのエラー表示用のテンプレートも無くって、
そのエラーを表示しようとエラーテンプレートを探しに行くんですが…。
といったループですね。
0.09にアップすれば、そこでdieしてくれるので大丈夫っぽいです。

```pl:0.07
sub _render {
    my ($self, $renderer, $c, $output, $options) = @_;

    my $name = $c->stash->{'template_name'}
        || $renderer->template_name($options);
    my %params = (%{$c->stash}, c => $c);
    
    try {
        $$output = $self->xslate->render($name, \%params);
    }
    catch {
        my $err = $_;
        $c->app->log->error(qq(Template error in "$name": $err));
        $c->render_exception($err);
        $$output = '';
        return 0;
    };  
        
    return 1;
}  
```

```pl:0.09
sub _render {
    my ($self, $renderer, $c, $output, $options) = @_;

    my $name = $c->stash->{'template_name'}
        || $renderer->template_name($options);
    my %params = (%{$c->stash}, c => $c);

    local $@;
    if (defined(my $inline = $options->{inline})) {
        $$output = $self->xslate->render_string($inline, \%params);
    }
    else {
        $$output = $self->xslate->render($name, \%params);
    }
    die $@ if $@;

    return 1;
}
```
Promiseって同期処理にもありなんじゃねーかと思った話

パイプライン的に書けるので可読性が高い気がする。

```js
function world (hello) {
  return hello + ' world!';
}

function twice (x) {
  return x + x;
}

// これが
alert(twice(world('hello')));

// こうなる
Promise.resolve('hello')
.then(world)
.then(twice)
.then(alert);
```

とりあえずこうしておいて、なにか非同期的な処理もしたいなと思ったら`then`で繋げばいいので楽だと思うんですが。

---

ES6 Promisesについては以下を参照。
[JavaScript Promises: There and back again - HTML5 Rocks](http://www.html5rocks.com/en/tutorials/es6/promises/)
tmux のキーバインドを調べる方法

tmux のキーバインドに何が割り当てられているか気になることがあると思います

特にデフォルトで何が割り当てられているのかの情報などは man などにもあまり書かれていないですし，検索してもあまり出てきません

そこで使うのは `list-keys` です

`tmux list-keys` もしくは tmux 内ならいつものプレフィックスを押してから `:list-keys` を打ちます（タブで補完が効きます）

そうするとキーバインドの一覧が見れます

便利！！
iPhoneアプリに必要なアイコンを全サイズ生成するシェルスクリプト

いつも http://makeappicon.com/ を使ってるのですが
今確認したら落ちてる！！しょうがないのでshellで全サイズを
生成することにしました。

ImageMagickを使ってるのでまずインストール

```shell-session
$ brew install ImageMagick
```

終わったら以下の様にshellを準備する。ソースコードはこのシートで作成した（2016/12/19）。
https://docs.google.com/spreadsheets/d/1dvsHtMhuaIDkefISWH-aaAX7HJBbdQYcD_pEdps2_RA/edit#gid=0

```bash:resize.sh
#!/usr/bin/env bash
convert $1 -geometry 40x40 Icon-iPhone-Notification-20@2x.png
convert $1 -geometry 60x60 Icon-iPhone-Notification-20@3x.png
convert $1 -geometry 58x58 Icon-iPhone-Spotlight-Settings-29@2x.png
convert $1 -geometry 87x87 Icon-iPhone-Spotlight-Settings-29@3x.png
convert $1 -geometry 80x80 Icon-iPhone-Spotlight-40@2x.png
convert $1 -geometry 120x120 Icon-iPhone-Spotlight-40@3x.png
convert $1 -geometry 120x120 Icon-iPhone-App-60@2x.png
convert $1 -geometry 180x180 Icon-iPhone-App-60@3x.png
convert $1 -geometry 20x20 Icon-iPad-Notifications-20@1x.png
convert $1 -geometry 40x40 Icon-iPad-Notifications-20@2x.png
convert $1 -geometry 29x29 Icon-iPad-Settings-29@1x.png
convert $1 -geometry 58x58 Icon-iPad-Settings-29@2x.png
convert $1 -geometry 40x40 Icon-iPad-Spotlight-40@1x.png
convert $1 -geometry 80x80 Icon-iPad-Spotlight-40@2x.png
convert $1 -geometry 76x76 Icon-iPad-App-76@1x.png
convert $1 -geometry 152x152 Icon-iPad-App-76@2x.png
convert $1 -geometry 167x167 Icon-iPad-Pro-App-83.5@2x.png

convert $1 -geometry 512x512 iTunesArtwork.png
convert $1 -geometry 1024x1024 iTunesArtwork@2x.png
```

使い方は簡単で、1024より大きいアイコン画像のpathを付与してあげればいい

```shell-session
$ sh resize.sh /path/to/icon.png
```
実行した場所にサイズ変更されたアイコンが沢山できてるのでそれを使って下さい。

もし時間が経って足りないサイズ増えてたら教えてください。
修正します。

参考：http://hirooka.pro/?p=3287
Elixir 用 Vim 環境設定メモ

[vim-elixir](https://github.com/elixir-lang/vim-elixir) 使う。

NeoBundle を使ってインストールした。

```vim:.vimrc
NeoBundle 'elixir-lang/vim-elixir'
```

これで syntax highlight, indent とか捗る感じになった。これだけで済むならどうしてもっと早くにやっておかなかったのか。
CoreOSのtimezone設定

```bash:初期状態はUTC
# date
Thu Dec 26 15:16:18 UTC 2013
```

```bash:Asia/Tokyoにする。
# mkdir /var/lib/timezone/         
# ln -s /usr/share/zoneinfo/Asia/Tokyo /var/lib/timezone/localtime
# date
Fri Dec 27 00:17:10 JST 2013
```

と思ったが、最新版(296)だとこの方法は使えなかったので以下。

```bash:
$ echo "TZ='Asia/Tokyo'; export TZ" > ~/.profile
$ source ~/.profile
```

# それでもダメな環境の場合

```bash:
export TZ=JST-9
date
```
jekyllのmarkdownにカスタムタグを定義する


jekyllのmarkdownで独自の記法を定義して、特定のhtmlを出力したい。

# 処理概要
Jekyll::Converters::Markdown::***Parserクラスのconvertメソッドを拡張し、
convertをかける前に、特定の記法を変換する。

# pluginの作成
`_plugin/extendMd.rb`というファイルを作り、以下の様なコードを記述します。
※この例ではRedcarpetParserの拡張になっていますが、別のparserを使う場合はそのクラスを指定して下さい

```ruby
module Jekyll
  module Converters
    class Markdown
      class RedcarpetParser
        alias :old_convert :convert
        def convert(content)

          # ここにコンバート処理を記述

          old_convert(content)
        end
      end
    end
  end
end
```

# 変換処理ケース１: smallタグを出力したい
`--`(ハイフン2つ)をsmallタグとして出力。
`—-small text`→`<small>small text</small>` 

```ruby
def convert(content)

  # small word
  content.gsub! /(^|\s)(--\w+)/ do
    "#{$1}<small>#{$2}</span>"
  end

  old_convert(content)
end
```

# 変換処理ケース2:Twitterの埋め込みを出力したい
`[tweet:https://twitter.com/kt_Biz/status/414717821034041344]`  
という形式の記法の出力をTwitterの埋め込みとして表示する場合。

```ruby
def convert(content)

  # parse embed tweet
  content.gsub! /(\[tweet:https:\/\/twitter\.com\/\w+\/status\/[[:digit:]]+\])/ do
    "<blockquote class=\"twitter-tweet\" lang=\"en\"><a href=\"#{$1}\"></a></blockquote><script async src=\"//platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>"
  end

  old_convert(content)
end
```
カスタマイズしたい場合はこちらを参考 → [埋め込みツイート | Twitter Developers](https://dev.twitter.com/ja/docs/embedded-tweets)

---

という感じで、markdownに独自の記法を追加することができます。お試しあれ。
chrome拡張機能のpopup画面を閉じる方法

popup上のボタンを押したときに、何らかのページ（hoge.html）を開いてから自身（popup.html）を閉じる方法を調てみた。
（chrome バージョン 32.0.1700.68 beta-m で確認した）


```html:popup.html
<button id="btn">hoge.htmlを開いてこの画面を閉じる</button>
```

```js:popup.js
document.getElementById("btn").addEventListener("click", func, false);
```

popupの閉じ方は、ページ（hoge.html）を開くときの方法によって異なることがわかった。

# 特に何もしなくても自動で閉じる方法
hoge.htmlを開くときに、`window.open()`を使用すればよい。
`window.open()`を使うと、hoge.htmlを開いた後のpopupを閉じる処理を書かなくても自動で閉じた。

```js:func
function func() {
   window.open("hoge.html");
   // popupを閉じる処理は書かなくてよい
}
```

# 明示的に閉じる必要がある方法
hoge.htmlを開くときに`chrome.tabs.create()`を用いた場合は、popup画面を閉じるために、コールバック関数内で`window.close()`を実行する必要があった。

```js:func
function func() {
   chrome.tabs.create({url: "hoge.html"}, function() {
       window.close();  // popupを閉じる処理
   });
}
```
Conventionプラグインを使ったActionクラスの書き方

## Conventionプラグインを使ったActionクラスの書き方

Conventionプラグインを使うとActionクラスの定義はアノテーションで一括定義できます。
具体的には次のようになります。

```java
@Namespace("/")
@ParentPackage("json-default")
@InterceptorRefs({
    @InterceptorRef("jsonValidationWorkflowStack")
})
@Results({
    @Result(name = ActionSupport.SUCCESS,type = "dispatcher",location = "index.jsp"),
})
@ExceptionMappings({
    @ExceptionMapping(exception="java.lang.Exception" , result="exception")
})
public class SampleAction extends ActionSupport {
    @Action("")	
    public String sample() throws Exception {
        return SUCCESS;
    }
}
```

他にもアノテーションで定義できるものはありますが、一般的にはここに挙げているものだけで問題ありません。
なお、Validation定義はConventionプラグインには含まれていません。

ちなみに、さらにSpringプラグインとlombokを使って記載するとさらにアノテーションだらけになりますが、設定する内容は決まりきっていることが多いのでテンプレート化しやすいでしょう。

```java
@Namespace("/")
@ParentPackage("json-default")
@InterceptorRefs({
    @InterceptorRef("jsonValidationWorkflowStack")
})
@Results({
    @Result(name = ActionSupport.SUCCESS,type = "dispatcher",location = "index.jsp"),
})
@ExceptionMappings({
	@ExceptionMapping(exception="java.lang.Exception" , result="exception")
})
@Controller
@Scope("prototype")
public class SampleAction extends ActionSupport {
	@Action("")
	public String sample() throws Exception {
		return SUCCESS;
	}
	
	@Getter @Setter
	private String value;
	
	@Autowired
	private ValidatorService service;
}
```
進捗どうですか？

　やっはろー。これは、[iOS Advent Calendar 2013](http://qiita.com/advent-calendar/2013/ios)の23日目の記事です。進捗ダメです。

　進捗テロや進捗ハラスメントが声高々に叫ばれる昨今、ついに OS X/iOS にも進捗モデルが導入されました。名前を `NSProgress` と言います。

　機能はごく単純で、合計の値と現在の値を渡すと現在の進捗を返します。

```objc
const NSInteger totalCount = 100;
NSProgress* progress = [NSProgress progressWithTotalUnitCount:totalCount];

for (NSInteger count = 0; count < totalCount; ++count) {
    [progress setCompletedUnitCount:count];
    NSLog(@"%f", [progress fractionCompleted]); // 0.000000, 0.010000, 0.020000 ...
}
```

複数の進捗をまとめることもできます。

```objc
NSProgress* progressAll = [NSProgress progressWithTotalUnitCount:100];
        
// 子の進捗を `- becomeCurrentWithPendingUnitCount:` と `- resignCurrent` で括る
// 次の進捗に全体の70%を割り振る
[progressAll becomeCurrentWithPendingUnitCount:70];
NSProgress* progressA = [NSProgress progressWithTotalUnitCount:100];
[progressA setCompletedUnitCount:40]; // A の進捗40%です！
[progressAll resignCurrent];

// 次の進捗に全体の30%を割り振る        
[progressAll becomeCurrentWithPendingUnitCount:30];
NSProgress* progressB = [NSProgress progressWithTotalUnitCount:100];
[progressB setCompletedUnitCount:60]; // B の進捗60%です！
[progressAll resignCurrent];
        
NSLog(@"%f", [progressAll fractionCompleted]); // 全体の進捗46%です！
```

必要に応じてポーズ・キャンセルと、それぞれのハンドリングもできます。

```objc
NSProgress* progress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
[progress setPausingHandler:^{
    NSLog(@"No progress!");
}];
[progress setCancellationHandler:^{
    NSLog(@"There's no such thing.");
}];

[progress pause]; // No progress!
[progress cancel]; // There's no such thing.
```

出力の書式を変えられるらしいのですけれど、正直使わないような気がします。

```objc
NSProgress* progress = [NSProgress progressWithTotalUnitCount:100];
[progress setCompletedUnitCount:42];
        
NSLog(@"%@", [progress localizedDescription]); // 42% completed
NSLog(@"%@", [progress localizedAdditionalDescription]); // 42 of 100
        
[progress setKind:NSProgressKindFile];
[progress setUserInfoObject:NSProgressFileOperationKindDownloading forKey:NSProgressFileOperationKindKey];
NSLog(@"%@", [progress localizedDescription]); // Downloading files…
NSLog(@"%@", [progress localizedAdditionalDescription]); // 42 bytes of 100 bytes
        
[progress setUserInfoObject:NSProgressFileOperationKindDecompressingAfterDownloading forKey:NSProgressFileOperationKindKey];
NSLog(@"%@", [progress localizedDescription]); // Decompressing files…
        
[progress setUserInfoObject:NSProgressFileOperationKindReceiving forKey:NSProgressFileOperationKindKey];
NSLog(@"%@", [progress localizedDescription]); // Receiving files…
        
[progress setUserInfoObject:NSProgressFileOperationKindCopying forKey:NSProgressFileOperationKindKey];
NSLog(@"%@", [progress localizedDescription]); // Copying files…
```

　以上です。アプリケーションへの利用はもちろんのこと、ぼちぼちサードライブラリ（AFNetworking とか）にも取り入れられているそうです。

　思いの外書くことがなくて焦っています。進捗どうですか？

> [Foundation Release Notes for OS X v10.9 - Mac Developer Library](https://developer.apple.com/library/mac/releasenotes/Foundation/RN-Foundation/index.html)

> [NSProgress Class Reference - iOS Developer Library](https://developer.apple.com/library/iOS/documentation/Foundation/Reference/NSProgress_Class/Reference/Reference.html)
コマンドラインとwebサーバーでのPHPのバージョンとcakeshellの問題についての質問

どこに質問したらいいのか悩みつつ、ここで質問をさせてもらいます。

質問はタイトル通りなのですが、もう少し詳しい話を。

##事の発端
cakePHP2.4のshell機能を使いたい！

##開発環境

ローカルのPHP5.5.3

xserverと言うサービスのサーバーのPHP5.1.6

xserverのPHP5.5

の3つの環境が存在していました。

#質問、疑問点

問題の切り分けができていないので、何が原因かはわからないですが。

**cakeshellでPHPのバージョンを指定しながらコードを実行しても、指定通りのバージョンが指定されない？**


cakeshellの実行は、以下の形式で

```
/path/to/php /path/to/Console/cake.php 実行したいクラス 引数
```

この際、サーバーでは **PHP5.1.6** がwebサーバーでは動いていて、
コマンドラインからは **PHP5.5.0** を指定していました。

ただ、ローカルの **5.5.3** では動いているコマンドプログラムを、サーバーの **5.5.0** で指定して動かしていても、挙動が変化し、苦戦していました。

また、コマンドではなく、別のプログラムも挙動がおかしいのでサーバー側のPHPも **5.5.0** にバージョンを上げたところ挙動がローカルと大差のないものとなりました。


まとめると、

cakeshellを実行すると、 **PHP5.5.0** を指定したはずなのに、 **PHP5.1.6** で実行されていたみたい？ということです。

情報がうまくまとまっていないのですが、この問題についてご存じの方は、是非教えていただければ。
ImageMagick を標準パス以外にインストールしたら...

CentOS 5.x 標準の ImageMagick だと RMagick が build できないので
ソースから /usr/local/ImageMagick-6.8.7-10/ 以下にインストールしたところ

* RMagick はインストールできた
* でも require するとエラーになる

という事態に。RMagick が参照する ImageMagick のライブラリファイルのパスが
分からないから当たり前だけど、チョッとはまってしまった。

最終的には

```:/etc/ld.so.conf.d/ImageMagick-6.8.7-10.conf
/usr/local/ImageMagick-6.8.7-10/lib
```

というファイルを作成した後に sudo /sbin/ldconfig して事なきを得た。

めでたしめでたし。
Oculus 事始め


**Unity  4.3.1 で確認**

1. 空の Project を作成
2. Oculus SDK を DL https://developer.oculusvr.com/ （検証時 Oculus SDK v0.2.4）
3. 解凍後のフォルダ OculusUnityIntegration/OculusUnityIntegration.unitypackage をダブルクリックしてすべて import
4. Hierarchy にある MainCamera を削除
5. Projectフォルダ内の Prefabs/OVRPlayerController (ovrplayer.png) を Hierarchy におく
6. 落下しないように OVRPlayerController のインスペクタにある Gravity modifier を 0 にする

*Oculus SDK の構成*
![ovrplayer.png](https://qiita-image-store.s3.amazonaws.com/0/20773/db119f30-d162-e1d2-0e48-faa24615c37c.png "ovrplayer.png")
psych gem にはまった(redmine 2.4.1 が動かなかった)

```sh
$ sudo /usr/local/ruby200/bin/ruby script/rails server webrick -e production
/usr/local/ruby200/lib/ruby/2.0.0/i686-linux/psych.so: warning: already initialized constant Psych::Parser::ANY
/usr/local/ruby200/lib/ruby/2.0.0/i686-linux/psych.so: warning: already initialized constant Psych::Parser::UTF8
/usr/local/ruby200/lib/ruby/2.0.0/i686-linux/psych.so: warning: already initialized constant Psych::Parser::UTF16LE
/usr/local/ruby200/lib/ruby/2.0.0/i686-linux/psych.so: warning: already initialized constant Psych::Parser::UTF16BE
/usr/local/ruby200/lib/ruby/2.0.0/psych/syntax_error.rb:5:in `<module:Psych>': superclass mismatch for class SyntaxError (TypeError)
        from /usr/local/ruby200/lib/ruby/2.0.0/psych/syntax_error.rb:1:in `<top (required)>'
        from /usr/local/ruby200/lib/ruby/2.0.0/psych.rb:1:in `require'
        from /usr/local/ruby200/lib/ruby/2.0.0/psych.rb:1:in `<top (required)>'

```

というエラーが出て redmine 2.4.1 が動かなかった。
ググったら https://github.com/burke/zeus/issues/409 で似たようなお困りを
見つけたので、試しに psych 2.0.1 の gem をアンインストールしたら redmine が動いた orz。
notifyCommitでgitレポジトリのポーリングを効率化

バージョン管理にgitを使用している現場で、Jenkinsからのポーリングのアクセスの扱いで悩んでいる現場の話をちらほら聞きます。

筆者の現場でも毎分ポーリングするようにしていたらポーリングのsshのアクセスがハングアップしてビルドが走らなくなってしまうなどのトラブルがありました。push時にhookスクリプトでJenkinsのビルドをキックしてやればいいんですが、そうするとJenkins側でブランチの区別がつかなくなってしまいます。

このような状態をJenkinsのGit Pluguinの機能で解決することができます。

まず、JenkinsはSCM(git)をポーリングするようにしますが、スケジュールの設定のところは空欄にします。

![jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/9610/abd22d28-8b88-d7be-cf62-be7725f5bf04.png)

一方、git側はpushされたときに、

```
http://<jenkinsのurl>/git/notifyCommit?url=<gitレポジトリのURL>
```


にリクエストをとばすようにします。

![gitlab.png](https://qiita-image-store.s3.amazonaws.com/0/9610/3c796d95-b1eb-24fe-e77f-e3fe3136050c.png)

画像はgitlabの場合です。このURLにリクエストをとばすと、Jenkins側でgitのレポジトリに折り返して、ビルド対象のブランチが更新されていた場合は、Jenkinsがビルドを開始します。
RailsのGemを使ったEmailの判定

##Email-valodationの使用
Railsに備えられている様々なGemを使うことによってモデルに記述一行記述するだけでmodelに新しく作られる:emailの中身が正しいEmailかどうか判断してくれるGemがある

[Git](https://github.com/alexdunae/validates_email_format_of)
[stackoverflow](http://stackoverflow.com/questions/6567793/validate-email-format-only-if-not-blank-rails-3)

##使用方法
まずはgemの追加

```ruby:gem
gem 'email_validator'
```
次にbundleのインストールを実行して追加する

```bash:
$  bundle install
```
modelの中に以下の記述を加える 

```ruby:model
validates email: true
```
これだけで新しくmodelを作る際に:emailの中身が正しいemailでは無かった場合生成されなくなる


これを利用すればControllerでemailが正しく使われた場合と使われなかった場合で表現方法を変えることが出来る

```ruby:controller
def create
    @email = params[:email]
    @newmodel = EmployeeInvitation.new
    @newmodel.company_id = current_company
    @newmodel.email = @email
    if @newmodel.save              #ここでemailが正しくない場合はfalseになる
    EmployeeInvitationMailer.delay.new_invitation(@email, current_company)
    flash[:notice] = I18n.t("company.complete_invitaion")
    else
    flash[:notice] = "正しいEmailを入力してください"
    end
    redirect_to enterprise_users_path
  end
```
Xcodeで日本語が使えるようになったみたいなので試してみた結果（・ω・）

こちらの記事によると、Clangのバージョンアップにより、変数名に日本語を含むUnicodeが使えるようになったそうです。
> http://www.toyship.org/archives/1657


変数名ができるなら、クラス名やメソッド名もいけるんじゃね？ということで試してみたら出来ました。

ヘッダ

```objc
@interface ・ω・ : NSObject

typedef NSString *Σ・Д・;

+ (instancetype)・ω・初期化しちゃうよ・ω・;
- (Σ・Д・)・c_・;

@end
```

実装

```objc
@implementation ・ω・

+ (instancetype)・ω・初期化しちゃうよ・ω・
{
	return [[self alloc] init];
}

- (Σ・Д・)・c_・
{
	return @"(´・ω・`)ショボーン";
}

@end
```

使ってみる。
まるでふざけているように見えても立派なObjective-Cという。。

```objc
・ω・ *日本語インスタンスだよ = (・ω・*)[・ω・ ・ω・初期化しちゃうよ・ω・];
Σ・Д・ もじれつ = [日本語インスタンスだよ ・c_・];
NSLog(@"%@", もじれつ);
```

コンソール出力結果

```
2013-12-26 18:42:06.250 Test[6900:60b] (´・ω・`)ショボーン
```

----

補完が効かなかったり、メソッド一覧に出てこなかったり、使える文字が限られていたり、そして何より見栄え的に実用的かどうか。。
UIWebView内の表示サイズをiPhoneの画面サイズに合わせる


デフォルトの設定だとiPhoneに合った画面サイズで表示されない。

なので、WebViewのインスタンスに下記コードで設定してあげる。

```obj-c
'WebViewのインスタンス'.scalesPageToFit = YES;
```

もしくは、
storyboardで設定する場合は、
storyboardでUIWebViewを選択→show the attributes inspector→Scaling Scales Page To Fitのチェックマークを選択する。
sbtの使い方メモ



ScalatraでWebサーバーを立ち上げる:


```
container:start
```

Scalatraで立ち上げたウェブサイトをブラウザで開く:

```
browse
```

ファイルに変更があったら自動でコンパイルする:


```
~ ;copy-resources;aux-compile
```
Riak:バケツを空にする(すべてのキーを消す)ワンライナー


httpieやjqコマンドが要ります

```
URL=localhost:8098/buckets/バケツ名; http "$URL/keys?keys=true" | jq '.keys[]' | replace '"' '' | xargs -I__KEYNAME__ http -v DELETE "$URL/keys/__KEYNAME__"
```
toGMTString -> toUTCString

`Date.prototype.toGMTString`について調べていたら、いつの間にかdeprecatedになっていたようで。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toGMTString

これからは`Date.prototype.toUTCString`を使うと良いと。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString

```js:DevTools-Console
> +new Date
1388046049585
> (new Date(1388046049585)).toGMTString();
"Thu, 26 Dec 2013 08:20:49 GMT"
> (new Date(1388046049585)).toUTCString();
"Thu, 26 Dec 2013 08:20:49 GMT"
```

出力は変わってないみたいだけど。
FreeTDSとunixODBCを使ってSQL Server2000に繋ぐ上での問題

#SQL Server2000での不具合
FreeTDSのみや、FreeTDS+unixODBCでODBC接続する場合、
SQL Server2008R2と同じ方法で接続出来ます。
FreeTDSのfreetds.confの項目、tds version  =  7.1 に変更するだけです。
ただ、SQL Server2008R2に比べて以下の問題があります。

##FreeTDS
###PHP
データベース名、テーブル名が日本語だとデータを取得しない
###tsql
問題なく取得できる。

##FreeTDS+unixODBC
###PHP
テーブル名が日本語でもデータを取得することは可能であるが、
3万件以上のデータを保持している場合にはMemory Over Flowで落ちる
###isql
問題なく取得できる。

##PHP側のドライバーの問題？
正直原因はよく分かりません。
isqlやtsqlで問題が無いところを考えると、
PHPのODBCドライバーやPDO_DBLib等のドライバー側の問題だと思われます。