OmniAICreator/Qiita-1.07M huggingface dataset:
TimeMapper動かせたけどよく判らん

のがじゅんさんの[TimeMapperを動かそうと四苦八苦中(動いてません)](http://www.nofuture.tv/diary/20140409.html#p01)を受けて。

こちらの環境はMac OS X Marveriks.

とりあえず、インストールまでやってみる。

Node.jsはMacはnpmまで入れてくれるインストーラがあるのでそちらから。

```shell-session
$ git clone https://github.com/okfn/timemapper
$ cd timemapper
$ sudo npm install . <= ここだけ、sudoしないとエラーで入らなかった。-gオプションつけてないのに…
$ git submodule init && git submodule update
$ cp settings.json.tmpl settings.json
$
$ node run.js
```

のがじゅんさんと同じエラーが…

lib/config.js見ろ、と書いてあるので見てみる。

```js:lib/config.js
nconf.defaults({
  "database": {
    // WARNING: for s3 this must *not* have a leading '/' and *should* have a
    // trailing slash
    "path": process.env.DB_PATH || "db",
    // s3 or fs
    "backend": "s3"
  }
  ...
```

どうもファイルシステム使うならfsにすれば良い模様。
setting.json変更。

```json:setting.json
{
  "database": {
    "host": "localhost"
    , "port": 9200
    , "name": "hypernotes"
    , "backend": "fs"
  }
  ...
```

実行。

```shell-session:エラー
path.existsSync is now called `fs.existsSync`.

fs.js:642
  return binding.mkdir(pathModule._makeLong(path),
                 ^
Error: ENOENT, no such file or directory 'db/anon'
    at Object.fs.mkdirSync (fs.js:642:18)
    at FSBackend.write (/Users/kokogiko/Projects/MapApp/timemapper/lib/dao.js:104:8)
    at Object.DomainObject.upsert (/Users/kokogiko/Projects/MapApp/timemapper/lib/dao.js:282:18)
    at Object.DomainObject.save (/Users/kokogiko/Projects/MapApp/timemapper/lib/dao.js:287:17)
    at /Users/kokogiko/Projects/MapApp/timemapper/lib/logic.js:70:11
    at /Users/kokogiko/Projects/MapApp/timemapper/lib/dao.js:270:7
    at /Users/kokogiko/Projects/MapApp/timemapper/lib/dao.js:82:7
    at fs.js:207:20
    at Object.oncomplete (fs.js:107:15)
```

なんやdb/anonとかってファイルがないと言われてる。
調査過程はしょって書くと、これはファイルじゃなくディレクトリで、その下にdb/anon/data.jsonというファイルを作りにいく模様。
なので、db/anonディレクトリを作ってやればOK。

```shell-session
$ mkdir db
$ mkdir db/anon
$ node run.js
path.existsSync is now called `fs.existsSync`.
Express server listening on port 3000 in mode development
```

なんかwarningsは出たけど動いた！

画面、画面。

![スクリーンショット 2014-04-12 12.32.43.png](https://qiita-image-store.s3.amazonaws.com/0/10108/fb841cce-4f9b-df2a-4d8b-daaf2225a3df.png)

うおう、ここからかい！

とりあえず使い方をマスターするのはまだ先っぽいけど、とりあえず動かせるようになったので、今回はここまで。
AndroidStudioでGradleのバージョンが古い（ unsupported version of Gradle）と言われた時の対処法


#### 執筆時点（2014/04/12）の環境、バージョン等

* AndroidStudio 0.5.4
* Gradle(Gradle wrapper) 1.11
* Gradleプラグイン 0.9.0

![スクリーンショット 2014-04-12 12.12.02.png](https://qiita-image-store.s3.amazonaws.com/0/40758/5aff73fe-a908-45eb-2413-3095f98014c4.png "スクリーンショット 2014-04-12 12.12.02.png")

AndroidStudioをバージョンアップした時などに、以下のようなエラーが表示されることがあります。

> Failed to refresh Gradle project 'sharoidbeta' The project is using an unsupported version of Gradle. Please use version 1.10. Please point to a supported Gradle version in the project's Gradle settings or in the project's Gradle wrapper (if applicable.) Fix Gradle wrapper and re-import project Gradle settings

`Fix Gradle wrapper and re-import project` をクリックしても何も起きない・・・。

## 1.build.gradleを編集

![スクリーンショット 2014-04-12 12.32.09.png](https://qiita-image-store.s3.amazonaws.com/0/40758/da021d0f-9b16-c985-ee27-c361c4c1d101.png "スクリーンショット 2014-04-12 12.32.09.png")

アプリのbuild.gradleでなく、projectルートディレクトリ/build.gradleです。

バージョンを上げます。
記述するバージョンはこの辺などを参考に。
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Requirements

```groovy:build.gradle
buildscript {
  dependencies {
	// バージョンを上げる。
    classpath 'com.android.tools.build:gradle:0.9.+'
  }
}
```

## 2.gradle-wrapper.propertiesの編集

![スクリーンショット 2014-04-12 12.33.27.png](https://qiita-image-store.s3.amazonaws.com/0/40758/4fbfae83-408d-80d0-0652-73143ebb4959.png "スクリーンショット 2014-04-12 12.33.27.png")

オフィシャルサイトにも載っていなくて忘れがちなのがこちら。
gradle-x.xx-all.zipのバージョンをあげます。

最新のバージョンは
http://services.gradle.org/distributions
にアクセスするとわかります。

```gradle-wrapper.properties
distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip
```


## 3.Sync Project with Gradle Filesを実行

`Tools > Android > Sync Project with Gradle Files` またはツールバーの`Sync Project with Gradle Files`アイコン![スクリーンショット 2014-04-08 0.03.29.png](https://qiita-image-store.s3.amazonaws.com/0/40758/1915049f-ffdb-b6c4-d369-08863aea97ff.png "スクリーンショット 2014-04-08 0.03.29.png")をクリック。

エラーが消えると思います。
Raspberry Pi + Ruby で GPIO

Raspberry Pi の上で、Ruby から GPIO をいじるのに、pi_piper を使おうと思ったら、依存関係の ffi gem がネイティブパッケージなのでコンパイルをしようとし始めます。コンパイル環境メンドクセなのでバイナリでどうにかする方法。

## debianパッケージでffiをインストール

ちょっとバージョンが古いけど、dpkgにバイナリがあるので apt-get でインストールします。

* rubyのバージョン確認

1.8 か 1.9 かでパスが変わるので確認。

```
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [arm-linux-eabihf]
```

この場合は 1.9 系ですね。
 
* パッケージのインストール
 
`$ sudo apt-get install ruby-ffi`

* gemに登録

パッケージでやってくれても良さそうなんだけど、手動です。

```
$ cd /var/lib/gems/1.9.1/specifications/
$ sudo ln -s /usr/share/rubygems-integration/1.9.1/specifications/ffi-1.0.11.gemspec .
```

1.8系はパスを読み替えてください。

* 登録されたか確認

```
$ gem list

*** LOCAL GEMS ***
 
ffi (1.0.11)
```

## pi_piper をインストール

これはそのまま。ただし、rdocとか言いだすとメンドウなので省略。

`$ sudo gem install pi_piper --no-rdoc --no-ri`

## あとはよしなに...

たとえば irb で使えます

```rb
# irb
irb(main):001:0> require 'pi_piper'
=> true
irb(main):002:0> pin_led = PiPiper::Pin.new :pin => 22, :direction => :out
=> #<PiPiper::Pin:0x20a9780 @pin=22, @direction=:out, @invert=false, @trigger=:both, @last_value=nil, @value=0>
irb(main):003:0> loop do
irb(main):004:1* pin_led.on
irb(main):005:1> sleep 1
irb(main):006:1> pin_led.off
irb(main):007:1> sleep 1
irb(main):008:1> end
```

```rb:chikachika.rb
# irb
require 'pi_piper'
pin_led = PiPiper::Pin.new :pin => 22, :direction => :out
loop do
  pin_led.on
  sleep 1
  pin_led.off
  sleep 1
end
```
電子書籍検索エンジンの Honyomi を作りました


![honyomi-01.jpg](https://github.com/ongaeshi/honyomi/raw/master/images/honyomi-01.png)

Ruby + Groonga で作った検索エンジンです。
所有する電子書籍をまとめて検索、閲覧、管理出来るコマンドラインとWebアプリが付いてきます。

[[詳しく]](http://ongaeshi.hatenablog.com/entry/honyomi-init)
CSV形式ファイルに列(Column)を追加するAWKスクリプト

**CSV形式ファイルに列(Column)を追加するAWKスクリプト**

```lang:add_column.awk
#!/bin/gawk -f
#./add_column.awk col=[num] val=[value] quot=[true] [filename] > [new filename]

BEGIN{
    FS=","
}
{
    split($0,cols,",");
    rec = ""
    for (i=0;i<length(cols);i++) {
        colno = (i+1)
        if(colno==col) {
            if(quot=="true") {
                rec = rec ",¥"" val "¥""
            } else {
                rec = rec "," val
            }
        }
        if (i==0) {
            rec = $ + colno
        } else {
            rec = rec "," $ + colno
        }
    }
    print rec
}
```

"う"と"く"の次の"と"を挿入してみる。

```lang:test.csv
あ,い,う,え,お
か,き,く,け,こ
```
[実行方法]
`./add_column.awk col=4 val=と quot=false test.csv > new_test.csv`

```lang:new_test.csv
あ,い,う,と,え,お
か,き,く,と,け,こ
```
UIStoryboardをサブクラスで置き換える

## 背景
UIStoryboardは下記のファクトリを使って生成します。

```objc
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil
```

今回はTyphoon FrameworkというDIコンテナを導入するにあたって、このファクトリで生成されるUIStoryboardをサブクラスで置き換える必要が出て来ました。

## ClassメソッドのSwizzling
UIStoryboardのクラスメソッドの入れ替えは、Objective Cのランタイム機能を使うと簡単にできます。

```objc
- (void)swizzleSample
{
    Method original,swizzled;
    original = class_getClassMethod([UIStoryboard class], @selector(storyboardWithName:bundle:));
    swizzled = class_getClassMethod([UIStoryboard class], @selector(ppStoryboardWithName:bundle:));
    method_exchangeImplementations(original, swizzled);
}
```

ただ、ここで問題になるのがサブクラス側でのファクトリ実装です。
今回組み込みたいサブクラスは下記のようにスーパークラスのファクトリメソッドを使用しています。というか、UIStoryboardの場合にはこうせざるを得ないです。

```objc:TyphoonStoryboard.h
+ (TyphoonStoryboard *)storyboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil
{
    return [super storyboardWithName:name bundle:storyboardBundleOrNil];
}
```

単純にファクトリメソッドを入れ替えると無限ループしてしまうため、下記のようにselfに格納されたクラスオブジェクトによって処理を分岐するようにします。

```objc
@implementation UIStoryboard (PPTyphoon)

+ (UIStoryboard *)ppStoryboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil
{
    if(self != [UIStoryboard class]){
        // Called by subclass. Use original implementation
        return [self ppStoryboardWithName:name bundle:storyboardBundleOrNil];
    }
    return [TyphoonStoryboard storyboardWithName:name
                                         factory:[TyphoonComponentFactory defaultFactory]
                                          bundle:storyboardBundleOrNil];
}

@end
```

これにより、下記のような順序で処理が実行され、無事に生成されるクラスをサブクラスで置き換えることができました。

1. UIStoryBoardのファクトリ呼び出し
2. UIStoryboardの独自ファクトリ(swizzled)-> TyphoonStoryboard呼び出し
3. TyphoonStoryboardのファクトリ -> super呼び出し
4. UIStoryboardの独自ファクトリ(swizzled) -> 本来の実装呼び出し
5. UIStoryboardの本来のファクトリ

Objective Cって ~~気持ち悪い~~ 面白いですね。

## Typhoonって何？
DIコンテナです。Typhoon Frameworkについてはまた別の機会に。
RStudio Shiny ホスティングサービス ShinyApps.io の使い方

> **追記**
> 現在ここに書かれているよりずいぶん使いやすくなっています。
> 下記記事参照：
> [RStudio から shinyapps.io に簡単にデプロイできるようになってた件](http://qiita.com/hoxo_m/items/141282a5d1ca0fc4f827)

RStudio が出してる Shiny のホスティングサービスが以前使っていたときとかなり変わっていたので使い方をメモします。

基本的に[ここ](https://github.com/rstudio/shinyapps/blob/master/guide/guide.md)に書いてあるとおりにやったらできました。

## アカウントの作成
まず、アカウントを作成します。以前のものを使っていた人でも、もう一度アカウントを作りなおす必要があるみたいです。

http://my.shinyapps.io/login

に行き、Google アカウントでログインします。

利用規約の承諾とアカウント名の登録を要求されます。
このとき入力したアカウント名が、URL の一部となるので注意が必要です。

## devtools, shinyapps パッケージ
`devtools` と `shinyapps` パッケージのインストールが必要です。`devtools` は最新のもの(1.4以降)を使って下さい。

```r
install.packages('devtools')
```

```r
devtools::install_github('rstudio/shinyapps')
```

## Shiny プロジェクトの作成

適当に Shiny のプロジェクトを作って下さい。RStudio で 

```
File -> New Project -> New Directory -> Shiny Web Application
```

とやれば簡単に Shiny アプリのひな形を作ることができるので、それをそのまま使うのでいいです。

## 認証
作った Shiny アプリをホスティングサービスにアップロードするのは、すべて RStudio 上でやります。
まずは、認証のためのトークンを生成します。
https://my.shinyapps.io/user/tokens
に移動して、右側の Actions と書いてある下の左側(ゴミ箱でない方)のボタンを押します。
![tokens.png](https://qiita-image-store.s3.amazonaws.com/0/2570/651ba82d-d7c3-e0d4-18a2-580ae3269ec7.png)

すると、認証用のコードがクリップボードにコピーされるので、それを R コンソールに貼り付けて実行します。
認証用のコードはだいたいこんな感じです。

```r
shinyapps::setAccountInfo(name="アカウント名", token="トークン", secret="シークレット")
```

これを実行すると、次のようなエラーが出る場合があります。

```
Error: /v1/users/current/ 403 - bad signature
```

このときは、

```r:Windowsの場合
Sys.setlocale(locale="English") # Windows
```

```r:Linux,Macの場合(未確認)
Sys.setlocale(locale="en_US.UTF-8")
```

を先に実行してやるとうまくいくはず。

## アップロード

アップロードは

```r
shinyapps::deployApp()
```

を実行すると始まります。（数分かかります）
![deploy.png](https://qiita-image-store.s3.amazonaws.com/0/2570/d8f2c5c2-3d24-cd0c-993d-c70f3baa2d7f.png)
アップロードが終わるとアプリがブラウザで立ち上がります。

アップロードしたアプリの一覧は
https://my.shinyapps.io/apps
で見れます。
今気付いたんですが、この一覧に削除ボタンがあるけど、押しても何も反応しないようです。
現状、アップロードしたアプリは消せないようです。
調べてないのでわかりませんが、アップロード上限とかあるかもしれないので注意して下さい。

以上です。それでは、良い Shiny ライフを！
kobitoのDBからqiita投稿をバックアップ

# バックアップ取得
sqliteに接続
```
sqlite3 ~/Library/Kobito/Kobito.db
```

sqliteに接続後

```
.output kobitobak.txt
select * from ZITEM;
.exit
```

# sqliteのコマンド


## テーブル一覧
.tables

## ZITEMのテーブル構造
.schema ZITEM

## 終了
.exit
インストール済みPCREのconfigureオプションが知りたい

# configureのオプション

いわゆる`./configure`、`make`、`make install`の手順で既にビルドされたプログラムがあって、それの`./configure`に指定したオプションを後から知りたいことがたまにある。例えばnginxなら`nginx -V`で確認可能だ。

```bash
$ nginx -V
nginx version: nginx/1.5.13
built by clang 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
TLS SNI support enabled
configure arguments: --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/body --http-proxy-temp-path=/var/lib/nginx/proxy --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --with-debug --with-http_gzip_static_module --with-http_spdy_module --with-http_ssl_module --with-http_stub_status_module --with-cc-opt=-Wno-deprecated-declarations --with-pcre=../pcre-8.34 --with-pcre-jit --with-cc-opt='-W -g -Wno-deprecated-declarations -Wno-unused-parameter' --add-module=../ngx_devel_kit --add-module=../echo-nginx-module --add-module=../ngx_info --add-module=../ngx_small_light --add-module=../lua-nginx-module
```

## PCREの場合

追記(2014/04/12)

PCREの作者から「`pcretest -C`使えば同じようなことできるよ」と連絡が来たので、これからはそっちを使うことにする。

```
$ pcretest -C
PCRE version 8.34 2013-12-15
Compiled with
  8-bit support
  UTF-8 support
  Unicode properties support
  Just-in-time compiler support: x86 64bit (little endian + unaligned)
  Newline sequence is LF
  \R matches all Unicode newlines
  Internal link size = 2
  POSIX malloc threshold = 10
  Parentheses nest limit = 250
  Default match limit = 10000000
  Default recursion depth limit = 10000000
  Match recursion uses stack
$
```
[[UIScreen mainScreen] bounds]で正しいスクリーンサイズが取得できない

iPhoneとiPad両方対応しようとしたときに発生しました。
4inch iPhone SimulatorでRunしても画面サイズが3.5inchになってしまい、`[[UIScreen mainScreen] bounds]`でも320×480が返って来てしまいます。

次のリンクによると、スクリーンサイズはlanunch imageに依存しているらしく、適切なサイズのlaunch imageを設定すると解決するそうです。

[ios - UIScreen MainScreen Bounds returning wrong size - Stack Overflow](http://stackoverflow.com/questions/21668497/uiscreen-mainscreen-bounds-returning-wrong-size)

> Apparently, iOS relies solely on the presence of a launch image in the resolution of an iPhone 5+ in order to let the app run in that resolution.

自分はiPad用のlaunch imageしかセットしておらず、iPhone用のものをセットしたところ直りました。
Mavericksにpostgresqlをインストールしてrailsアプリをherokuにデプロイするまでの手順


http://railstutorial.jp/

⬆️を写経しようとしたが結構違ってしまった

postgresインストール

brew remove postgresql 
brew install postgresql

initdb /usr/local/var/postgres -E utf8

postgres -D /usr/local/var/postgres

確認
psql -l

git設定

$ git config --global user.name "ユーザ名"
$ git config --global user.email メアド


railsアプリ作成

$ mkdir rails_projects
$ cd rails_projects/
$ rails new rails_tutrials -d postgresql


$ git init
$ git add .
$ git commit -m "Initialize repository"


$ git log

githubにログインしてリポジトリを作成する

$ git remote add origin git@github.com:ユーザ名/rails_tutrials.git


$ git push -u origin master


$ rake db:create

$ rake db:migrate

railsの起動を確認

$ rails s


heroku toolbeltをインストールする

https://toolbelt.heroku.com/


$ heroku login

$ cd ~/rails_projects/rails_tutrials

$ heroku create

$ ssh-keygen -t rsa
/home/ユーザ/.ssh/id_rsa_heroku

$ heroku keys:add ~/.ssh/id_rsa_heroku.pub

herokuに接続するための設定を追加

$vi ~/.ssh/config
Host heroku.com
 User git
 Hostname heroku.com
 IdentityFile /Users/user_name/.ssh/id_rsa_heroku

herokuデプロイ

$ git push heroku master

heroku停止

$ heroku ps:scale web=0
$ heroku ps:scale worker=0
【AngularJS】改行を有効にするフィルタ


AngularJSで文字列を表示するには`{{expression}}`もしくは`ng-bind`を利用する．
普段はこれだけで問題ないけど，出力結果に改行（`\n`）を含めたいときにどうするか．

例えば以下のように表示したい．

```
<!-- HTMLのソース -->
<p>{{iroha}}</p>
```

```
<!-- 出力結果 -->
いろはにほへと　ちりぬるを
わかよたれそ　　つねならむ
うゐのおくやま　けふこえて
あさきゆめみし　ゑひもせす
```



# filterをつくってみる

単純に`{{iroha}}`としてしまうと改行は反映されないので`{{iroha | newlines}}`というフィルタを考えてみる．
しかし，これでも改行は反映されない

```
<p>{{iroha | newlines}}</p>
```

```newlines.coffee
app = angular.module 'MyApp'

app.filter 'newlines', ($sce) ->
  (text) -> text.replace(/\n/g, '<br />') if text?
```

# `ng-bind-html`を利用する

サニタイズ済みのhtml要素をバインドするのに`ng-bind-html`を利用する．
ただし，AngularJS 1.2以降では **SCE（Strict Contextual Escaping）**がデフォルトで有効になっているためそのままでは表示されない．
（SECについては **[AngularJSのStrict Contextual Escapingって何だ？](http://qiita.com/zoetro/items/0b01fda20f8000e485cf)** という記事がわかりやすい）

>
> 要は、セキュリティ対策として、サニタイズされていないHTML要素や、信頼されていないページの要素を表示するのを防止するための機能です。
> <cite>[AngularJSのStrict Contextual Escapingって何だ？](http://qiita.com/zoetro/items/0b01fda20f8000e485cf)</cite>
>

html要素をバインドするには`$sce.trustAsHtml`を利用する．
改良版newlinesは以下．

```
<p ng-bind-html="iroha | noHTML | newlines"></p>
```

```newlines.coffee
app = angular.module 'MyApp'

app.filter 'noHTML', ->
  (text) -> text.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/&/, '&amp;') if text?

app.filter 'newlines', ($sce) ->
  (text) -> $sce.trustAsHtml(if text? then text.replace(/\n/g, '<br />') else '')
```
一応，安全のために`noHTML`というfilterを定義して元の文書をサニタイズしている．

# 参考

- [AngularJSのStrict Contextual Escapingって何だ？ - Qiita](http://qiita.com/zoetro/items/0b01fda20f8000e485cf)
- [AngularJSで改行を有効にするためのフィルタ（gist）](https://gist.github.com/izumin5210/11104465)
$length に NULL は渡せるか？

# **関数ラインナップ**

## **[array_slice](http://www.php.net/manual/ja/function.array-slice.php)**

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/25060/d98ae1f3-7000-e58a-aba6-d5efdaa29afe.png)

### **PHP5.2.4 以降**

- *$length* を省略すると無限大を指定したと見なされる。
- *$length* に `NULL` を渡すと無限大を指定したと見なされる。

### **PHP5.2.3 以前**

- *$length* を省略すると無限大を指定したと見なされる。
- *$length* に `NULL` を渡すと <ins>`0` を指定したと見なされる</ins>。

#### _$preserve_keys_ を指定したいときの対処法

```php:count関数を利用する
$array = array_slice($array, $offset, count($array), true);
```

## **[array_splice](http://www.php.net/manual/ja/function.array-splice.php)**

![ss (2014-04-12 at 07.20.51).png](https://qiita-image-store.s3.amazonaws.com/0/25060/26539ff5-2d9b-118c-ba62-be5642b4c2d3.png)

**※ `int $length = int`** は意味不明なのでたぶん **ドキュメンテーションバグ** です。暇な方にはPHP本家のほうにバグレポート出していただけると（ｒｙ

### **PHP全バージョン**

- *$length* を省略すると無限大を指定したと見なされる。
- *$length* に `NULL` を渡すと <ins>`0` を指定したと見なされる</ins>。

#### _$replacement_ を指定したいときの対処法

```php:count関数を利用する
array_splice($input, $offset, count($input), $replacement);
```

## **[mb_substr](http://www.php.net/manual/ja/function.mb-substr.php)**

![ss (2014-04-12 at 06.43.08).png](https://qiita-image-store.s3.amazonaws.com/0/25060/68e717a8-bfd1-3f82-2b23-b3ce3680cd46.png)

### **PHP5.4.8 以降**

- *$length* を省略すると無限大を指定したと見なされる。
- *$length* に `NULL` を渡すと無限大を指定したと見なされる。

### **PHP5.4.7 以前**

- *$length* を省略すると無限大を指定したと見なされる。
- *$length* に `NULL` を渡すと <ins>`0` を指定したと見なされる</ins>。

#### _$encoding_ を指定したいときの対処法

```php:mb_strlen関数を利用する
$str = mb_substr($str, $start, mb_strlen($str, 'UTF-8'), 'UTF-8');
```

```php:最初にmb_internal_encoding関数を実行して引数を省略する
mb_internal_encoding('UTF-8');
$str = mb_substr($str, $start);
```

```php:最初にini_set関数を実行して引数を省略する
ini_set('mbstring.internal_encoding', 'UTF-8');
$str = mb_substr($str, $start);
```

**備考: [mb_internal_encoding()とini_get()の結果が異なるのでPHPのソースを読んで理解してみた](http://kannokanno.hatenablog.com/entry/2013/05/29/225403)**


## **[substr](http://www.php.net/manual/ja/function.substr.php)**

![ss (2014-04-12 at 06.47.31).png](https://qiita-image-store.s3.amazonaws.com/0/25060/4eb075d6-1057-185a-ef65-0c98c7bb07b0.png)

### **PHP全バージョン**

- *$length* を省略すると無限大を指定したと見なされる。
- *$length* に `NULL` を渡すと <ins>`0` を指定したと見なされる</ins>。
テキストエディターのまとめ

|アプリケーション|プラットフォーム|値段|
|:-----------|:------------|:------------|	
|秀丸エディター	|Win	|4,200円/寄付	
|notepad++	|Win	|無償	
|Sublime Text	|Win/Mac/Linux	|$70/寄付	
|sakuraエディター	|Win	|無償
|Tera Pad	|Win	|無償
|EmEditor	|Win	|4,000〜12,000円
|StyleNote	|Win	|無償
|Mery	|Win	|無償
|Komodo Edit	|Win/Mac/Linux	|無償
|Coda2	|Mac	8,500円	
|mi	|Mac	|無償
|Cot Editor	|Mac	|無償
|Espresso	|Mac	|$75
|Jedit	|Mac	|2,800〜3,900円
|Edge Code	|Win/Mac	|無償
|Brackets	|Win/Mac	|無償
zshでpreztoを使う手順

[oh-my-zshを使っていて重いと感じている方、preztoはいかが？ - Qiita](http://qiita.com/kei_q/items/814ec412b3c28f580927)を読んだ。
今まで何度かzshに挑戦しようとするも、`ctrl-w`の挙動がbashと違うことが気に食わずにbashを使い続けた。

しかし使ってみると利点も多い気もしてきたので作業メモを残しておこう。

* ~/.ssh/configの中身を候補表示してくれる。
* scpでリモートのパスを入力しtabを押すとあたかもローカルのようにパス展開してくれる。

# preztoインストール

```bash:インストール
zsh
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
mkdir ~/.zsh.gomi
mv .zlogin .zlogout .zprofile .zshenv .zshrc ~/.zsh.gomi
```

```bash:初期設定のfileを設置
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

```diff:~/.zpreztorc
- zstyle ':prezto:module:prompt' theme 'sorin'
+ zstyle ':prezto:module:prompt' theme 'redhat'
```

# zshにデフォルトのshellを変更(mac)

最後の行に追記

```diff:/etc/shells
+ /usr/local/bin/zsh
```

```bash:変更実施
chsh -s /usr/local/bin/zsh
```

# .zshrc修正

## ctrl-x,ctrl-eで編集するエディタ変更

```diff:~/.zshrc
+ VISUAL=/usr/local/bin/vim
```

# [zshのプロンプトにGitのブランチ名を表示する - きたけーTechブログ](http://kitak.hatenablog.jp/entry/2013/05/25/103059)

```zsh:~/.zshgit
# VCSの情報を取得するzshの便利関数 vcs_infoを使う
autoload -Uz vcs_info

# 表示フォーマットの指定
# %b ブランチ情報
# %a アクション名(mergeなど)
zstyle ':vcs_info:*' formats '[%b]'
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd () {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}

# バージョン管理されているディレクトリにいれば表示，そうでなければ非表示
RPROMPT="%1(v|%F{green}%1v%f|)"
```

* [zsh の vcs_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する - Qiita](http://qiita.com/mollifier/items/8d5a627d773758dd8078)
Raspberry PiでMJPG-streamerを使う


## Webカメラの接続確認

```
$ lsusb
```

## MJPG-streamerのインストール

```
$ sudo apt-get update
$ sudo apt-get install -y subversion libjpeg-dev imagemagick
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
```

```
cd mjpg-streamer
./configure
make
sudo make install
```

## MJPG-streamerの起動スクリプト

### BASIC認証無効

```sh:ファイル名.sh
#!/bin/sh
PORT="8080" #ポート番号
SIZE="320x240" #画面サイズ
FRAMERATE="1" #フレームレート
export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer \
-i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y" \
-o "output_http.so -w /usr/local/www -p $PORT"
```

### BASIC認証有効

```sh:ファイル名.sh
#!/bin/sh
PORT="8080" #ポート番号
ID="xxx" #ID
PW="xxx" #パスワード
SIZE="320x240" #画面サイズ
FRAMERATE="1" #フレームレート
export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer \
-i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y" \
-o "output_http.so -w /usr/local/www -p $PORT -c $ID:$PW"
```

## 起動スクリプトのパーミッションを変更

```
$ chmod 755 ファイル名.sh
```
debug パッケージの使い方

メモ。


## 前提として

```shell-session
$ npm install debug --save
```

## ソース
```js
var debug = require('debug')('bar');
var debug2 = require('debug')('hoge');

console.log('foo');
debug('bar');
console.log('baz');
debug2('hoge');
```

## 実行の仕方と結果

### 通常
```shell-session
$ node example.js
foo
baz
```

### DEBUG変数を指定して実行
```shell-session
$ DEBUG=bar node example.js
foo
  bar bar +0ms
baz

$ DEBUG=hoge node example.js
foo
baz
  hoge hoge +0ms
```

### DEBUGを複数指定
```shell-session
$ DEBUG=bar,hoge node example.js
foo
  bar bar +0ms
baz
  hoge hoge +0ms
```

## npmjs.org
[debug](https://www.npmjs.org/package/debug)
libgit2のrubyバインディングruggedでファイル名が無視されるか判定する

# はじめに

あるファイル名がgitレポジトリで無視されるのかどうかを判定したいというニーズが仕事でありまして、libgit2のrubyバインディングruggedに[プルリクエスト](https://github.com/libgit2/rugged/pull/350)を送ったら早速マージされたので、使い方を紹介します。

サンプルコードは
https://github.com/hnakamur/rugged-path-ignored-example
に置いてあります。MITライセンスです。

# Ruggedについて

[Rugged](https://github.com/libgit2/rugged)は[libgit2](http://libgit2.github.com/)のRubyバインディングです。

[Ruby Toolboxのgit Toolsカテゴリ](https://www.ruby-toolbox.com/categories/git_Tools)を見ると、一番人気は[Grit](https://github.com/mojombo/grit)なのですが、GitHubのページには"**Grit is no longer maintained. Check out libgit2/rugged.**"と書かれています。

ちなみに、[Githug](https://github.com/gazler/githug)は"An interactive way to learn git."とのことでGitを使うためのライブラリではなく、Gitをインタラクティブに学習するための別用途のものです。[ruby-git](https://github.com/schacon/ruby-git)はgitコマンドを実行するラッパ形式のライブラリです。

# Gemfileでの指定方法

[Rugged](https://github.com/libgit2/rugged)に説明がありますが、以下のように指定します。

```Gemfile
gem 'rugged', git: 'git://github.com/libgit2/rugged.git', branch: 'development', submodules: true
```

submodules: trueの指定によってlibgit2をgithubから取得してコンパイルするようになっています。最初この指定を忘れていたら、homebrewで入れたlibgit2 0.20.0を使ってコンパイルエラーになってしまいました。

あとはbundleでruggedをインストールします。

```shell-session
bundle install --path vendor/bundle
```

# サンプルコード

例えば

```text:gitignore
.*
!.ht*
/vendor/*
```

のように指定した場合、

```ruby:test.rb
require 'rugged'

repo = Rugged::Repository.new '.'
puts repo.path_ignored?('.DS_Store') # true
puts repo.path_ignored?('.htaccess') # false
```

のようなソースコードを

```shell-session
bundle exec ruby test.rb
```

として実行すると、

```
true
false
```

のように出力されます。ファイルの実体が存在する必要はなくて、単に指定したファイル名が.gitignoreの設定に照らしあわせて無視されるかどうかを判定できるようになっています。Rugged::Repository#path_ignored?の実装は[libgit2のgit_ignore_path_is_ignored](http://libgit2.github.com/libgit2/#HEAD/group/ignore/git_ignore_path_is_ignored)を単に呼び出しているだけです。
Windows でのステータスライン用フォント

本記事は [Vim Advent Calendar 2013](http://atnd.org/events/45072) の 132 日目です。
131 日目は @keizo_bookman さんによる、[とあるvim宣教師の手記](http://keizobookman.hatenablog.com/entry/2014/04/10/193041) でした。

vim-airline 等ステータスライン系プラグインでは、フォントにパッチを当てることでステータスラインのデザインを更に良くする方法があります。
しかし Windows の定番フォント Consolas ではうまくパッチが当たらなかったり、そもそもパッチを当てるための環境 (fontforge) を用意するのが不便という事情がある為、別のアプローチでこれを行うというのが本記事の趣旨です。


パッチ用フォントの入手、インストール
==================================

まずはステータスライン表示用の文字のみが含まれた、パッチ用のフォントを入手します。これは powerline のリポジトリで配布されています。

<https://github.com/Lokaltog/powerline/blob/develop/font/PowerlineSymbols.otf?raw=true>

これを windows 用の truetype フォントに変換します。変換は Web サービスで行うのが手軽でしょう。調べればそれっぽいサービスがいくつか引っかかります。

<http://www.freefontconverter.com/>

作成した ttf フォントファイルをインストールします。

フォントリンク
==============

作成したパッチ用のフォントを、対象のフォントに fontlink させます。
例えば Consolas で行う場合、レジストリの
`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink`
に複数行文字列として新たに `Consolas` という値を追加し、以下の値を書き込みます。

```:Consolas

PowerlineSymbols.ttf

```

他に日本語フォント等リンクさせている場合、一番上にパッチ用のフォントを追加します。

```:Consolas

PowerlineSymbols.ttf
MEIRYO.TTC,Meiryo,128,85

```

ちなみにフォントリンクはリンクさせるフォントのサイズを調整することができます。ここで 85 となっている 4 つめの値を、128 を基準に小さくすれば リンクフォントが大きく、128 より大きくすればリンクフォントが小さくなります。3 つめの値も scaling factor に関係すると説明されているところが多いですが、これはおそらく font charset に関係する値のようなので日本語をリンクさせる場合は 128 を指定しておきます。

メリット・デメリット
====================

Windows ではフォントのエイリアスがうまく表示されず、Inconsolata や Ricty などの他 OS での定番フォントが汚くなりがちですが、この方法だと Windows に最適化されている Consolas を用いる為レンダリングが綺麗です。
また、レジストリを操作する必要はありますが、引き換えにフォントにパッチを当てる必要がありません。

デメリットというより制限事項ですが、追加されたフォントのシンボルと隣の文字が続いて表示されているような箇所では、若干の隙間があるようです。カラースキームによってはこの隙間が見えやすかったり見えにくいことがあります。但しパッチを当てたフォントについてもシンボルとフォントのバランスが取れていなかったり、同様に隙間が見えることもあるようです。

おまけ
======

少し前に、Vim を VS2013 でビルドする記事を書きました (宣伝)。

http://qiita.com/s_of_p/items/fe522eb6b1d48b8b3885

VAC の記事ではありませんが、よければチェックしてみてください。

以上 Vim Advent Calendar 2013 132 日目の記事でした、次回は現在未定です。

## 参考

http://www.natzworks.com/digital/2010/454.html
http://msdn.microsoft.com/en-us/library/cc194829.aspx
Mojoliciousアプリ全体のエラー処理をする


developmentモードでスクリプトエラーが起こった場合、
以下の様な画面が表示される。

![スクリーンショット 2014-04-11 18.51.22.png](https://qiita-image-store.s3.amazonaws.com/0/2278/b8007c0d-4287-ed3a-8f45-13cc2aa34710.png "スクリーンショット 2014-04-11 18.51.22.png")

Mojolicious側でアプリの全体的なエラーをキャッチして、
このようなエラー画面を表示させている。
内部では、around_dispatchというフックを使って処理している。

独自にアプリ全体のエラーをキャッチして、
何かしらの処理したい場合も *around_dispatch* を使う。

(強力なフックなので気軽に使うべきではないと、
ドキュメントで注意されているのでちょっとこわい)

例えば、アプリのエラーメッセージに、
「SYSTEM ERROR!!」というプレフィクスを付けたいとすると、
以下のような設定になる。

```perl:myapp.pl
app->hook(around_dispatch => sub {
    my ($next, $c) = @_;
    eval { $next->(); 1; };

	# アプリにエラーが起こった場合
    if ($@) {
        $c->app->log->fatal('SYSTEM ERROR!!: '.$@);
        die $@;
    }
});
```

これで、ログにエラーメッセージを出しつつ、
通常通りのエラー画面がブラウザに表示されるようになる。


## around_dispatchについて

デフォルトで *around_dispatch* で設定されている処理は以下のもの。

- エラー処理(Mojolicious::_exception)
- ディスパッチ処理(Mojolicious::dispatch)

前節の設定を行うと、この２つの処理の間に入ることになる。
つまり、

エラー処理
↓
独自エラー処理
↓
ディスパッチ処理

の順番で、実行されていく。
各処理中に「$next->()」を呼び出すことにより、
次の処理を実行する。

前節の設定で「$next->()」という記述があったが、
これは「ディスパッチ処理の実行」を意味していた。

また、Mojolicious::_exceptionの内容は以下のようになっている。

```perl:lib/Mojolicious.pm
sub _exception {
  my ($next, $c) = @_;
  local $SIG{__DIE__}
    = sub { ref $_[0] ? CORE::die($_[0]) : Mojo::Exception->throw(@_) };
  $c->render_exception($@) unless eval { $next->(); 1 };
}
```

_exceptionの中でも、「$next->()」が記述されている。
これは、前節で設定した処理を実行していることになる。

このように、「＄next->()」を呼び出すことによって、
連続的に次の処理を呼び出す形になっている。
「$next->()」をしなかった場合は、処理が止まってしまうので注意。

結構重要な処理がこのフックで呼ばれているので、
触らずに済むなら触らないようにしたい。
「レガシーコード改善ガイド」読書メモ（その２）

![PaperCamera2014-04-10-23-30-58_041014_113820_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/24511/a3d5de1d-51f0-b728-90c3-2744580b414a.jpeg)

「レガシーコード改善ガイド」という書籍を読み、自分の解釈した内容をメモしています。

[前回](http://qiita.com/kurukurupapa@github/items/ad167a5f54bbe5383ee2)は、コードを改善する考え方をまとめました。
今回は、実際のテストコードについて書きます。

書籍では、テストコードの書き方について、第2部、第3部で書かれていました。第2部は多くのページを割き、実際の開発現場における数々の実例を端的に説明していて、面白かったです。第3部は、第2部で色々説明していた内容を「手法」としてまとめ、リファレンス的に説明していました。

主に第3部の内容について、利用頻度が高そうな「手法」をメモしました。

#テストコードの書き方
##命名ルール
テストコードを書くときに作成する各種クラスについて、おすすめの命名ルールとして、次のようなルールが紹介されていました。実際にクラス作成する際に、迷うのも手間なので、こういうルールを覚えておくと便利ですね。

* テストクラス：XxxTest
* テスト用サブクラス：TestingXxx
* モッククラス：FakeYyy

※「Xxx」はテスト対象のクラス名です。「Yyy」はテスト対象クラスから呼ばれるクラスの名前です。

##手法一覧
テストコードを書くときに、しばしば問題となるのは、テスト対象クラスと、他のクラスとの依存関係です。依存関係を排除する手法が、24個紹介されていました。

各手法について、個人的な感覚になりますが、利用頻度を3段階で表し、どんな依存を解決する手法なのかまとめました。（利用頻度が低いと思う手法は、少々説明を省略しています。）

|No.|名前|頻度|解決する依存箇所|
|---|---|---|---|
|25.1|パラメータの適合|〇|引数（アプリケーション外クラス）|
|25.2|メソッドオブジェクトの取り出し|△|コンストラクタ/メソッド|
|25.3|定義の補完|×|（省略）※リンク切り替え。混乱を生む。|
|25.4|グローバル参照のカプセル化|△|グローバル変数|
|25.5|静的メソッドの公開|△|コンストラクタ|
|25.6|呼び出しの抽出とオーバーライド|〇|メソッド|
|25.7|Factory Method の抽出とオーバーライド|〇|コンストラクタ|
|25.8|getメソッドの抽出とオーバーライド|×|（省略）※C++特有|
|25.9|実装の抽出|×|（省略）※命名を妥協すれば不要|
|25.10|インターフェースの抽出|〇|引数（アプリケーション内クラス）|
|25.11|インスタンス委譲の導入|△|staticメソッド|
|25.12|静的setメソッドの導入|△|メソッド|
|25.13|リンクによる置き換え|×|（省略）※リンク切り替え。混乱を生む。|
|25.14|コンストラクタのパラメータ化|〇|コンストラクタ|
|25.15|メソッドのパラメータ化|〇|メソッド|
|25.16|パラメータのプリミティブ化|？|（省略）※理解できませんでした|
|25.17|メソッドと変数の引き上げ|×|（省略）※クラス設計を混乱させそう|
|25.18|依存関係の押し出し|×|（省略）※クラス設計を混乱させそう|
|25.19|関数ポインタによる関数の置き換え|×|（省略）※C/C++特有|
|25.20|getメソッドによるグローバル参照の置き換え|△|グローバル参照|
|25.21|サブクラス化とメソッドのオーバーライド|〇|コンストラクタ/メソッド|
|25.22|インスタンス変数の入れ替え|×|（省略）※C++特有|
|25.23|テンプレートによる再定義|×|（省略）※C++特有|
|25.24|テキストによる再定義|×|（省略）※Ruby特有|

##手法の使い処
上述の手法のうち、利用頻度が高い手法について、使い処を考えてみました。あまり細かくパターン分けしても、私には使いこなせないので、ざっくりと分けてあります。

1. テスト対象クラスのインスタンス生成が必要であるが、インスタンス生成が難しい場合（コンストラクタに依存あり）
 1. テスト対象のメソッドが、インスタンス変数に依存していない場合<br>→ **25.5 静的メソッドの公開**
 2. コンストラクタ引数に渡すインスタンスの生成が難しく、引数のクラスがアプリケーションの外部で定義されている場合<br>→ **25.1 パラメータの適合**
 3. コンストラクタ引数に渡すインスタンスの生成が難しく、引数のクラスがアプリケーション内で定義されている場合<br>→ **25.10 インターフェースの抽出**
 4. コンストラクタ内の処理において、他クラスのインスタンス生成部分が困難な場合<br>→ **25.14 コンストラクタのパラメータ化** または **25.7 Factory Methodの抽出とオーバーライド**<br>※この2つの使い分けがいまひとつ理解できませんでした。
 5. コンストラクタ内の処理において、一部処理が困難な場合<br>→ **25.6 呼び出しの抽出とオーバーライド**
1. テスト対象のメソッドを動作させるのが難しい場合（メソッドに依存あり）
 1. メソッド引数に渡すインスタンスの生成が難しく、引数のクラスがアプリケーションの外部で定義されている場合<br>→ **25.1 パラメータの適合**
 2. メソッド引数に渡すインスタンスの生成が難しく、引数のクラスがアプリケーション内で定義されている場合<br>→ **25.10 インターフェースの抽出**
 3. メソッド内の処理において、他クラスのインスタンス生成部分が困難な場合<br>→ **25.15 メソッドのパラメータ化** または **25.6 呼び出しの抽出とオーバーライド**<br>※この2つの使い分けがいまひとつ理解できませんでした。
 4. メソッド内の処理において、一部処理が困難な場合<br>→ **25.6 呼び出しの抽出とオーバーライド**

#おわり
書籍の内容で理解できなかった部分がありました。解釈が間違っている部分もあるかもしれません。それでも、自分のために、個人的な感覚で、まとめました。

あと、利用頻度の高い手法についてだけでも、具体的実装方法までまとめたかったのですが、またの機会にします。

読書メモは、これにて、終わりとします。
Test::Time を入れようと思って

# Test::Time を入れようと思って

* ```metacpan``` で使い方確認しようと思ったらよさげなモジュールを見つけた
 * [Test::MockDateTime](https://metacpan.org/pod/Test::MockDateTime)
* 下記は SYNOPSYS の引用

```
use Test::More;
use Test::MockDateTime;
use DateTime;
 
on '2013-01-02 03:04:05' => sub {
    # inside this block all calls to DateTime::now
    # will report a mocked date.
     
    my $now = DateTime->now;
    is $now->ymd, '2013-01-02', 'occured now';
};
 
done_testing;
```
* I/F分かりやすいのでこっちを入れようってなった
Jenkinsのバージョンアップからbacklogプラグインを使ってリポジトリを監視するまで


今回はJenkinsからbacklogのリポジトリを監視できるまでを行います。

## Jenkinsのバージョンアップ

念のため最新版にバージョンアップしておきます。バージョンアップは、jenkins.warをDLして、既存のファイルと置き換えるだけです。バージョンアップ後も設定等は特に変わりませんが、プラグインのアップデートが必要になる場合があります。

```
$ cd /tmp
$ wget http://updates.jenkins-ci.org/download/war/1.532.2/jenkins.war

# apt-getでインストールしたJenkinsのパスを調べる

$ dpkg -L jenkins
/.
/var
/var/log
/var/log/jenkins
/var/lib
/var/lib/jenkins
/usr
/usr/share
/usr/share/doc
/usr/share/doc/jenkins
/usr/share/doc/jenkins/README.Debian
/usr/share/doc/jenkins/copyright
/etc
/etc/init.d
/etc/init.d/jenkins
/etc/init
/etc/init/jenkins.conf
/etc/logrotate.d
/etc/logrotate.d/jenkins
/etc/default
/etc/default/jenkins
/usr/share/doc/jenkins/changelog.Debian.gz
/usr/share/doc/jenkins/NEWS.Debian.gz

# この中から探すのも面倒なので、ルートからfind

$ find / -name jenkins.war

/usr/share/jenkins/jenkins.war

# こんなろころにありました。
# shareっていうと共有ファイルを置くところらしいのですが。

# 後はバックアップをって上書きします。

$ cd /usr/share/jenkins/
$ sudo cp jenkins.war jenkins.1.509.2.war
$ sudo cp /tmp/jenkins.war jenkins.war

$ sudo service jenkins restart
```

## Gitのインストール

ubuntuサーバにgitをインストールします。

```
$ sudo apt-get install git

# Jenkinsにgitのパスを設定するのでwhichで確認します。

$ which git
/usr/bin/git
```

次に、Jenkinsのシステムの設定にGitの設定をします。

![kobito.1397226609.548179.png](https://qiita-image-store.s3.amazonaws.com/0/32701/fd395907-bf1a-0d6c-2202-a6c323142694.png "kobito.1397226609.548179.png")

※ここにGitの設定がなければ、Gitプラグインをインストールします。

## backlogプラグインの追加
 
プラグインの管理から利用可能なプラグインのタブを開き、フィルター；backlogで検索して、「Jenkins Backlog plugin」をインストール。

ジョブを新規作成してフリースタイル・プロジェクトのビルドを選択。

Backlogのアカウント設定とgitリポジトリの設定を行います。

![kobito.1397228425.557917.png](https://qiita-image-store.s3.amazonaws.com/0/32701/806b17ab-7fd1-78b0-5d75-b0d0b5186513.png "kobito.1397228425.557917.png")

![kobito.1397228505.966033.png](https://qiita-image-store.s3.amazonaws.com/0/32701/a8541152-32b6-4f96-dd35-e5b15dc9bb39.png "kobito.1397228505.966033.png")

設定できればGitのポーリングログに正常なログが記録されます。

![kobito.1397228652.604946.png](https://qiita-image-store.s3.amazonaws.com/0/32701/32653838-ca75-1efa-832c-84acb801bc3e.png "kobito.1397228652.604946.png")

以上です。

## 参考

- [jenkinsのアップデート！そして伝説へ…](http://arimo.hatenablog.com/entry/2013/01/08/140639)
- [Jenkins Backlog Pluginリリース！＆ Jenkinsのリポジトリブラウザについて](http://ikikko.hatenablog.com/entry/2012/09/08/112655)
ATOMエディタの初期設定(vim mode)


軽く使ってみたら意外と好きになれそうだったので、メモ的に残しておきます。
初期設定〜vimモードを入れてみます。

## 設定

### Atomをインストール
[Atom](https://atom.io/)

### atomのシェルコマンドのインストール
メニューよりAtom → Install Shell Commands

### vimプラグインのインストール
atomではなく、Macのターミナルより下記コマンドを実行します。
`apm install vim-mode`

### Atomの再起動

### escキー押下時に日本語入力をやめて英数入力にする
インサートモードを抜けたときに日本語入力のままだと発狂しかねないので。

[KeyRemap4MacBook](https://pqrs.org/macosx/keyremap4macbook/index.html.ja '')を使用します。
vimでも同じ設定をしていたので、`com.github.atom`を追加するだけでした。

1. Misc $ Uninstallタブを選択し、Open private.xmlを押下。
1. XMLの編集
1. Change Keyタブを選択し、ReloadXMLを押下。

設定例

```
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>iTERM2</appname>
    <equal>com.googlecode.iterm2</equal>
  </appdef>
  <appdef>
    <appname>MACVIM</appname>
    <equal>org.vim.MacVim</equal>
  </appdef>
  <appdef>
    <appname>ATOM</appname>
    <equal>com.github.atom</equal>
  </appdef>
  <list>
    <item>
      <name>Leave Insert Mode with EISUU (vim keybind apps)</name>
      <identifier>private.vim_keybind_apps_esc_with_eisuu</identifier>
      <only>iTERM2,TERMINAL,MACVIM,ATOM</only>
      <autogen>--KeyToKey-- KeyCode::ESCAPE, KeyCode::ESCAPE, KeyCode::JIS_EISUU</autogen>
      <autogen>--KeyToKey-- KeyCode::BRACKET_LEFT, VK_CONTROL, KeyCode::BRACKET_LEFT, VK_CONTROL, KeyCode::JIS_EISUU</autogen>
    </item>
  </list>
</root>
```

## Key Bind Resolver

便利だったので何となく紹介。

対応しているキーバインドをリアルタイムで表示してくれる機能です。
例えば`ctrl + w`まで打ったら、次にhを打つとこうなるよ！みたいな感じで表示してくれます。
慣れないうちは役に立ちそうです。(あと表示の仕方がおしゃれで好きです。)

### 使い方

`cmd + shift + p`でコマンド検索パネルみたいなのが表示できるのですが、そこで`keybindres`ぐらいまで打てば見つかります。


## 感想
意外とvimモードの使い心地は素直で、使いやすいです。

キーバインドはさすがにかなりカスタマイズしないと、vimみたいにはならなさそうですね。
Pry の簡易的なコマンドまとめ


[Pry](http://pryrepl.org/) の設定ファイルや、関連 Gem の簡易的なコマンドについてまとめます。

## .pryrc

```ruby:.pryrc
# Alias
Pry.config.commands.alias_command 'w', 'whereami'

# refs: https://github.com/pry/pry/wiki/FAQ#wiki-awesome_print
if defined? AwesomePrint
  begin
    require 'awesome_print'
    Pry.config.print = proc { |output, value| Pry::Helpers::BaseHelpers.stagger_output("=> #{value.ai}", output) }
    # Pry.config.print = proc { |output, value| output.puts value.ai } #ページングなし
  rescue LoadError => err
    puts "no awesome_print :("
    puts err
  end
end
```

## Pry

[pry/pry](https://github.com/pry/pry)

| 内容 | コマンド |
|:--|:--|
| ヘルプを確認する | `help` |
| オブジェクトに移動する | `cd [object]` |
| オブジェクトのメソッドや変数を確認する | `ls` |
| 現在のスコープのネスト状態を確認する | `nesting` |
| 現在のスコープ付近のソースコードを確認する | `whereami` or `w` (refs: .pryrc) |
| 直前のコマンドの実行結果を取得する | `_` |
| 直前に発生した例外情報を取得する | `_ex_` |
| 特定の履歴の入力値を取得する | `_in_[n]` |
| 特定の履歴の出力値を取得する | `_out_[n]` |
| 直前に表示したディレクトリパスを取得する | `_dir_` |
| 直前に表示したファイルパスを取得する | `_file_` |

## pry-doc

[banister/pry-doc](https://github.com/banister/pry-doc)

| 内容 | コマンド |
|:--|:--|
| 特定のオブジェクトのドキュメントを確認する | ? [object] |
| 特定のオブジェクトのソースコードを確認する | $ [object] |

## pry-rails

[rweng/pry-rails](https://github.com/rweng/pry-rails)

| 内容 | コマンド |
|:--|:--|
| ルーティングを確認する | show-routes |
| 特定のルーティングを確認する | show-routes --grep [pattern] |
| モデルを確認する | show-models |
| 特定のモデルを確認する | show-models --grep [pattern] |

## pry-stack_explorer

[pry/pry-stack_explorer](https://github.com/pry/pry-stack_explorer)

| 内容 | コマンド |
|:--|:--|
| 現在のスコープのスタックトレースを確認する | show-stack |
| 現在のスコープから直近5階層分のスタックトレースを確認する | show-stack -c |
| 呼び出し元のスコープに移動する | up |
| 参照元のスコープに移動する | down |
| 現在のスコープの詳細情報を確認する | frame |

## pry-byebug

[deivid-rodriguez/pry-byebug](https://github.com/deivid-rodriguez/pry-byebug)

| 内容 | コマンド |
|:--|:--|
| ステップインで先へ進める | step or s |
| ステップオーバーで先へ進める | next or n |
| 現在のスコープを抜ける | finish or f |
| デバッグを終了して処理を再開する | continue or c |
【Mac】ターミナルで使うコマンドのエイリアスを設定する

Macでごにょごにょしてたときにコマンドのエイリアスを
作ろうと思った時のメモ

ターミナル上でよく「ls -l」とかでファイルの確認とかをするのですが、
会社では、エイリアスで登録されているためよく打ち間違えてしまいます。
なので一緒にしておこうということで設定しました。

まず、自分のホームディレクトリにターミナルで移動し、
「.bashrc」というファイルを開きます。
```$ cd $HOME
$ cd vim .bashrc```
ファイルを開いたら、そこにエイリアスを定義します。

エイリアスの定義はこのように記述します。
```alias エイリアス名１='コマンド１'
alias エイリアス名２='コマンド２'
```

今回は「ll」というエイリアス名で「ls -l」を登録しました。
```alias ll='ls -l'```
エイリアスを定義したらファイルを保存し、「.bash_profile」というファイルを
編集します。
```$ cd $HOME
$ vim .bash_profile```

「.bash_profile」には下記の項目を追加し、保存します。
```source ~/.bashrc```

保存できたら下記コマンドを実行し、変更を反映します。
```$ source .bash_profile```

これで定義したエイリアスを使用できるようになります。
（再ログインでも反映されます）

Terminalが開かれると、
*~/.bash_profile と　/etc/profile　が開かれます
*その.bash_profile　に .bashrc　の読み込みを書いているため毎回読み込まれるということになります。


終わり
Rails 4.1 + gem 'bootstrap-sass' で発生するエラー対策

Rails 4.1 で gem 'bootstrap-sass' を使おうとしたらこんなエラーが。

```text
Asset depends on 'bootstrap/glyphicons-halflings-regular.eot' to generate properly but has not declared the dependency
Please add: `//= depend_on_asset "bootstrap/glyphicons-halflings-regular.eot"` to
```

Rails 4.1 から [sprockets_better_errors](https://github.com/schneems/sprockets_better_errors) という gem が追加されているのが原因のようです。
sprockets_better_errors は development モードでも assets precompile のエラーが検出できるようにするものらしいのですが、この影響でデフォルトでは `bootstrap-sass` が動きませんでした。

いろいろ調べた結果、以下の記述でこのエラーを回避することができました。

```ruby:Gemfile
gem 'bootstrap-sass'
```

```sass:app/assets/stylesheets/application.css.sass
//= depend_on_asset "bootstrap/glyphicons-halflings-regular.eot"
//= depend_on_asset "bootstrap/glyphicons-halflings-regular.svg"
//= depend_on_asset "bootstrap/glyphicons-halflings-regular.ttf"
//= depend_on_asset "bootstrap/glyphicons-halflings-regular.woff"

@import bootstrap
```

前述のエラーでお困りの方はお試しあれ。
[Deprecated] CocoaLumberjack の ddLogLevel のラッパーマクロを定義した

**追記：これは CocoaLumberjack バージョン 1.x（Objective-C 版）向けの記事です。既にバージョン 2.x および Swift が主流となっているため、この記事の内容は Deprecated（非推奨）としておきます。**

## CocoaLumberjack とは

> **CocoaLumberjack** is a fast & simple, yet powerful & flexible logging framework for Mac and iOS.

[CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack) は Cocoa 用のロギングフレームワークです。基本的な使い方については [iPhone - ログ出力ライブラリのCocoaLumberjackを使う - Qiita](http://qiita.com/yuch_i/items/b25ddb6ceb788777c83b) あたりを参照してください。

私は XcodeColors で色分けもしています。

[Xcodeのコンソール出力に色をつけて見やすくしよう〜XcodeColorsとCocoaLumberjack〜 ｜ Developers.IO](http://dev.classmethod.jp/smartphone/ios-console/)

## 定義したマクロ

`***-Prefix.pch` もしくはそれが `#import` しているヘッダー（つまり全ファイルから見えるヘッダー）に以下のマクロを定義します（`XXX` はベンダープレフィックス）。

```objectivec:XXXCommon.h
#ifdef DEBUG
#define XXXGlobalLogLevel LOG_LEVEL_VERBOSE
#else
#define XXXGlobalLogLevel LOG_LEVEL_INFO
#endif

#define XXXLogLevel(level) __attribute__((unused)) static const int LOG_LEVEL_DEF = (XXXGlobalLogLevel) < (level) ? (XXXGlobalLogLevel) : (level)
```

各 *.m ファイルの頭の方（`#import` 直後あたり）でログレベルの制御を以下のように書けます。

```objectivec:XXXObject.m
XXXLogLevel(LOG_LEVEL_DEBUG);
```

## コア部分抜粋

```objectivec:抜粋
__attribute__((unused)) static const int LOG_LEVEL_DEF =
    (XXXGlobalLogLevel) < (level) ? (XXXGlobalLogLevel) : (level);
```

`LOG_LEVEL_DEF` の実態はデフォルトでは `ddLogLevel` です。

## 得られる効果

* **字数削減**
  + Before: `static const int ddLogLevel = ...;`
  + After: `XXXLogLevel(...);`
* `__attribute__((unused))` の力により **Unused variable warning を抑止**
* `XXXGlobalLogLevel` により **グローバルにログのレベルを制御可能**
  + `XXXGlobalLogLevel` 以下のレベルのログは表示しない
  + 例えば `XXXGlobalLogLevel` を `LOG_LEVEL_OFF` にすれば全ログを一気に非表示にできる
  + *.m 側でより厳しい（quiet な）レベルが指定されていたらそっちを採用
  + ここでは `DEBUG` 定義の有無で `XXXGlobalLogLevel` の内容を変えている

## おまけ：NSObjCRuntime.h の MIN マクロ

最初 `MIN` マクロを使ってたんだけど **Statement expression not allowed at file scope** というエラーが出た。`MIN` マクロの定義を見るとこんなんなってた。

```objectivec:NSObjCRuntime.h
#define __NSX_PASTE__(A,B) A##B

#if !defined(MIN)
    #define __NSMIN_IMPL__(A,B,L) ({ __typeof__(A) __NSX_PASTE__(__a,L) = (A); __typeof__(B) __NSX_PASTE__(__b,L) = (B); (__NSX_PASTE__(__a,L) < __NSX_PASTE__(__b,L)) ? __NSX_PASTE__(__a,L) : __NSX_PASTE__(__b,L); })
    #define MIN(A,B) __NSMIN_IMPL__(A,B,__COUNTER__)
#endif
```

一度変数に代入することでマクロ引数に含まれる関数が多重実行されないようにしているっぽい。それが原因でファイルスコープで `MIN`, `MAX` が使えないようだ。
wp post branchesがcustom field suiteで作った値を引き継がない問題を強引に解決


custom field suiteが通常のカスタムフィールドを使用せず、独自UIを使用しているため、ブランチ作成時にカスタムフィールドの値が引き継がれない問題が起こっていた。
custom field suiteのAPIを使用してブランチに値をコピーして解決。


ブランチ作成時

```wp-post-branches.php_47行目前後
global $cfs;
$options = array('format' => 'raw');
$field_data = $cfs->get(false, $id, $options);
$post_data = array('ID' => $draft_id);
$cfs->save($field_data, $post_data);

// postmeta
// $keys = get_post_custom_keys( $id );
// $custom_field = array();
// foreach ( (array) $keys as $key ) {
// 	if ( preg_match( '/^_feedback_/', $key ) )
// 		continue;

// 	if ( preg_match( '/_wp_old_slug/', $key ) )
// 		continue;

// 	$key = apply_filters( 'wpbs_publish_to_draft_postmeta_filter', $key );

// 	$values = get_post_custom_values($key, $id );

// 	foreach ( $values as $value ) {
// 		add_post_meta( $draft_id, $key, $value );
// 	}
// }
```

記事公開時

```wp-post-branches.php_180行目前後
global $cfs;
$options = array('format' => 'raw');
$field_data = $cfs->get(false, $id, $options);
$post_data = array('ID' => $org_id);
$cfs->save($field_data, $post_data);


//postmeta
// $keys = get_post_custom_keys( $id );

// $custom_field = array();
// foreach ( (array) $keys as $key ) {
// 	if ( preg_match( '/^_feedback_/', $key ) )
// 		continue;

// 	if ( preg_match( '/_wpbs_pre_post_id/', $key ) )
// 		continue;

// 	if ( preg_match( '/_wp_old_slug/', $key ) )
// 		continue;
				
// 	$key = apply_filters( 'wpbs_draft_to_publish_postmeta_filter', $key );

// 	delete_post_meta( $org_id, $key );
// 	$values = get_post_custom_values($key, $id );
// 	foreach ( $values as $value ) {
// 		add_post_meta( $org_id, $key, $value );
// 	}
// }

```



custom field suite有効時のみの判別をしたい。
複数台のMacで実機iPhoneを動かす方法（1台目とか関係なく）

1アカウントで複数台のMacの実機テスト環境を作るのは、なかなかハマりがちです。


## 複数Mac台でのアカウント共有の仕組み

まず、複数Macで実機をテストする場合、必要なファイルは、

* 証明書ファイル(.p12)
* プロビジョニングプロファイル(.mobileprovision)

p12ファイルの作成方法は、ググれば一発で出てくるので割愛します。

### Macの登録
1台目のCSRファイル（CertificateSigningRequest.certSigningRequest）から作成したp12でないと、実機テストはできません。
そのp12ファイルをキーチェーンに保存し、Mac自身を登録します。

### iPhoneの登録
その後、開発に使うiPhoneにProvisioningProfileを保存することで、iPhoneを実機テスト機として登録することができます。

## 1台目のMacがわからない。p12もどこにいったか分からない。実機を動かせるMacだけはある。
こんな状況でも、ものすごく簡単に新たなMacに実機テスト環境を作り出すことができます。

では順を追って説明していきます。

*  Xcodeの環境設定を開く

下のように環境設定を開きます。

![スクリーンショット 2014-04-11 21.37.29.png](https://qiita-image-store.s3.amazonaws.com/0/16434/26927a21-40ce-211e-1436-2304f9608770.png)

AppleIDsを選択し、「ViewDetails...」を選択します。
（心配だったので、画面はいろいろマスクしてますｗ）

![スクリーンショット 2014-04-11 21.40.02.png](https://qiita-image-store.s3.amazonaws.com/0/16434/b15a68dc-786e-3951-755c-3228cee8ca71.png)


上のような画面がでてくるので開発の場合は、「iOS Development」を選択します。
Distributeでももちろんできます。

![スクリーンショット 2014-04-11 21.47.19.png](https://qiita-image-store.s3.amazonaws.com/0/16434/e8fcf7af-50e0-0602-e4b1-0d3e9cc2426a.png)

すると、「Export」が選択できるようになります。

![スクリーンショット 2014-04-11 21.40.55.png](https://qiita-image-store.s3.amazonaws.com/0/16434/0a7b96fc-1158-9192-01ca-579963b2edd7.png)

そうすると、p12ファイルがエクスポートできます！
パスワードは好きなものを設定することができます。

このp12ファイルを作成するマシンは、CSRファイルを作成した１台目のMacでなくてもできます。
もちろん、この作成したp12を他のマシンに移すと、そのMacでも実機開発ができるようになります。

実機テストはハマる場合がめちゃくちゃ多いですが、これで簡単に環境構築ができます。
ぜひお試しあれ。
C++/CLI: Visual Studio 2013 で Windows フォームアプリケーションを作る

## 1. ソリューションに「空のプロジェクト」を起こす

ソリューションのコンテキスト・メニュー: 追加/新しいプロジェクト から
Visual C++/CLR/空のCLRプロジェクト を選択する。
![fig01.png](https://qiita-image-store.s3.amazonaws.com/0/33424/1d9dc10c-d55a-a0e7-0ee1-5ef089d329e9.png)

## 2. Main-Form を追加する

生成されたプロジェクトのコンテキスト・メニュー: 追加/新しい項目 から
UI/Windows フォーム を選択する。
![fig02.png](https://qiita-image-store.s3.amazonaws.com/0/33424/f88eddab-b185-7e4b-aad0-4e68bb9fda05.png)

## 3. main() を追加する

生成されたプロジェクトのコンテキスト・メニュー: 追加/新しい項目 から
コード/C++ファイル(.cpp) を選択し、以下のコードを書く。
![fig03.png](https://qiita-image-store.s3.amazonaws.com/0/33424/a47621ec-e4aa-0ca6-ba94-2ce774b24059.png)

```cpp
#include "MyForm.h" // [2]で付けたForm名.h

using namespace System;
using namespace System::Windows::Forms;

[STAThreadAttribute]
int main(array<String^>^ args) {
  Application::EnableVisualStyles();
  Application::SetCompatibleTextRenderingDefault(false); 
  // gcnew [1]で付けたプロジェクト名::[2]で付けたForm名()
  Application::Run(gcnew MyApp::MyForm()); 
  return 0;
}
```

## 4. プロジェクト・プロパティを変更する

プロジェクト・プロパティ: 構成プロパティ/リンカー/システム/サブシステム
を Windows (/SUBSYSTEM:WINDOWS) にする。
![fig04.png](https://qiita-image-store.s3.amazonaws.com/0/33424/eed5ff2d-fe3b-9bd8-93e0-052ac2492b95.png)

プロジェクト・プロパティ: 構成プロパティ/リンカー/詳細設定/エントリポイント
を main にする。
![fig05.png](https://qiita-image-store.s3.amazonaws.com/0/33424/ce747a31-cecd-e3f3-7e56-d43d7d8875d6.png)
Fox ItのHeartbleed検査スクリプトが汎用パケット生成に便利そう

Fox Itというセキュリティ会社がOpenSSLの脆弱性に該当するか検査するために公開しているPythonスクリプトをチラリと見たのですが、WiresharkのBytes表示っぽい表記でびっくりしました。

左がWiresharkで、右がスクリプト。

![heartbleed.png](https://qiita-image-store.s3.amazonaws.com/0/33389/7371f3b4-3138-6fdd-4781-855528ac5af2.png)

一つ上のh2bin(x)という関数で空白と改行を除去してデコードしてるだけですが、面白い工夫。socketでプログラミングする人には常套手段だったりするのかな。
シェルスクリプトでヘルプメッセージをコメントに書いて表示する

ヒアドキュメントで十分かもしれませんが。

```sh:hoge.sh
#!/bin/bash

# Usage: hoge [options] [dir]
#
# Options:
#   -a         Are na option
#   -o val     Ore no option
#
# Arguments:
#   dir        Document Root

set -ue

function usage()
{
    sed -rn '/^# Usage/,${/^#/!q;s/^# ?//;p}' "$0"
    exit 1
}

# Usage Da Yo!
usage
```

```console
$ ./hoge.sh
Usage: hoge [options] [dir]

Options:
  -a         Are na option
  -o val     Ore no option

Arguments:
  dir        Document Root
```

sed のコマンドの部分を整形すると次のようになります。

```sh:hoge.sh
(snip)

    sed -rn '
        /^# Usage/,${
            /^#/ ! q
            s/^# ?//
            p
        }
    ' "$0"

(snip)
```

このコマンドは次のような意味です。

 - `/^# Usage/` にマッチする行から最終行まで
     - `/^#/` にマッチしない行が来たら終了
     - `/^# ?/` を *空文字* に置換
     - 表示する

次のように t コマンドで条件分岐させてもできます。この方が正規表現のマッチングの回数が減るかも。

```sh:hoge.sh
#!/bin/bash

# Usage: hoge [options] [dir]
#
# Options:
#   -a         Are na option
#   -o val     Ore no option
#
# Arguments:
#   dir        Document Root

set -ue

function usage()
{
    sed -rn '
        /^# Usage/,${
            s/^# ?//
            t p
            q
            :p p
        }
    ' "$0"
    exit 1
}

# Usage Da Yo!
usage
```

このコマンドは次のような意味です。

 - `/^# Usage/` にマッチする行から最終行まで
     - `/^# ?/` を *空文字* に置換
     - 置換が成功したらラベル p にジャンプ
     - 終了する
     - ラベル p
        - 表示する

---

**追記 2015/02/14**

Usage に自分自身の名前を自動的に入れる版。

```bash
#!/bin/bash

# Usage: $0 [options] [dir]
#
# Options:
#   -a         Are na option
#   -o val     Ore no option
#
# Arguments:
#   dir        Document Root

set -ue

function usage()
{
  sed -rn '/^# Usage/,${/^#/!q;s/^# ?//;p}' "$0" |
  sed -r "s/\\\$0/$(basename "$0")/"
  exit 1
}

# Usage Da Yo!
usage
```

もしくは。

```bash
#!/bin/bash

# Usage: $(basename "$0") [options] [dir]
#
# Options:
#   -a         Are na option
#   -o val     Ore no option
#
# Arguments:
#   dir        Document Root

set -ue

function usage()
{
  msg=$(sed -rn '/^# Usage/,${/^#/!q;s/^# ?//;p}' "$0")
  eval $'cat <<__END__\n'"$msg"$'\n__END__\n'
  exit 1
}

# Usage Da Yo!
usage
```