OmniAICreator/Qiita-1.07M huggingface dataset:
SpriteKit入門 -21-


今回はエフェクトを追加していきたいと思います。
SpriteKitにはテンプレートで8種類のエフェクトが用意されています。
まずは、テンプレートのエフェクトを追加してみましょう。

Xcodeのメニューから[File]->[New]->[File...]で、
Choose a template for your new file:ダイアログを開きます。
[iOS]->[Resource]->[SpriteKit Particle File]を選択します。

![spritekit_21_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/d1f5884b-98c9-f16d-5a25-592e3d871d50.png "spritekit_21_01.png")

Choose options for your new file:ダイアログで、Particle templateを選択します。

![spritekit_21_02.png](https://qiita-image-store.s3.amazonaws.com/0/30731/0895caaf-d0c3-dd91-c65e-3b49589f42f3.png "spritekit_21_02.png")

「Bokeh」テンプレート

![spritekit_21_03.png](https://qiita-image-store.s3.amazonaws.com/0/30731/bd8de13f-5fea-5ab1-8192-344bbc902cfb.png "spritekit_21_03.png")

「Fire」テンプレート

![spritekit_21_04.png](https://qiita-image-store.s3.amazonaws.com/0/30731/37b51825-840b-b710-8227-15bac8ba3908.png "spritekit_21_04.png")

「Fireflies」テンプレート

![spritekit_21_05.png](https://qiita-image-store.s3.amazonaws.com/0/30731/bee70d1a-a0be-2bd3-3eb3-5c5416cd2681.png "spritekit_21_05.png")

「Magic」テンプレート

![spritekit_21_06.png](https://qiita-image-store.s3.amazonaws.com/0/30731/3f3181e1-69cd-4c70-6d2d-bf509547c2a8.png "spritekit_21_06.png")

「Rain」テンプレート

![spritekit_21_07.png](https://qiita-image-store.s3.amazonaws.com/0/30731/d6de58e2-c001-7409-2827-aad9a6f5e986.png "spritekit_21_07.png")

「Smoke」テンプレート

![spritekit_21_08.png](https://qiita-image-store.s3.amazonaws.com/0/30731/3125bfe7-6bdb-1010-cf69-c32d4f7bc9a8.png "spritekit_21_08.png")

「Snow」テンプレート

![spritekit_21_09.png](https://qiita-image-store.s3.amazonaws.com/0/30731/92af2d0f-cfc9-1d61-649a-2a19f0b9ca30.png "spritekit_21_09.png")

「Spark」テンプレート

![spritekit_21_10.png](https://qiita-image-store.s3.amazonaws.com/0/30731/d4b2ac49-6594-db08-0db1-ed3947f5f9a2.png "spritekit_21_10.png")

今回はここまで。
node-usage を使う

node.js で cpu 使用率やメモリ使用率を知りたい場合に使うライブラリ

[github](https://github.com/arunoda/node-usage)
[npm](https://www.npmjs.org/package/usage)

下記のようにコードを書きます．


```js
usage.lookup(process.pid, function(err, result) {
    console.log('cpu: ' + result.cpu + ', memory: ' + result.memory);
});
```

実行結果

```
cpu: 2.8, memory: 40714240
cpu: 0.6, memory: 40931328
cpu: 0.3, memory: 40988672
cpu: 0.8, memory: 41058304
cpu: 0.3, memory: 43454464
cpu: 0.4, memory: 43454464
cpu: 0.9, memory: 43610112
```

## インストール


npm を使って入れられます．


```
$ npm install usage
```

ただし失敗する場合があるので自分の経験から下記を確認してみてください．

* node-gyp が使う gyp は node-gyp に同梱されているが，システム上に gyp が入ってる場合にそちらを使って失敗するのでアンインストールするなどなんとかする．(`which gyp` して `/usr/bin/X11/gyp` が出てくるなど)
* `/usr/bin/ld: cannot find crti.o: No such file or directory` というようなエラーが出る場合は LIBRARY_PATH に必要なディレクトリを追加する [参考](http://askubuntu.com/questions/251978/cannot-find-crti-o-no-such-file-or-directory) 
```
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
```
Vim実践的入門初級編

# vimライトユーザの俺が説明する実践vim初級編

* `対象者`: vim使い始めたけど、なんか使いづらくね？って人
* `期待される成果`: ソースを編集するときはvimに頼り始める。メモ帳もコレ一本

## ビジュアルモードについて

ビジュアルモードはいわゆる範囲選択です。
ビジュアルモードには次の３つの選択範囲があります。

* ビジュアルモード
* ラインモード
* ブロックモード

順を追って説明します。

> ビジュアルモード(通常選択), v
> hogehoge`hoge`
> `foofoofoo`
> `barbar`bar

> ラインモード(行選択), V
> `hogehogehoge`
> `foofoofoo`
> `barbarbar`

> ブロックモード(単形選択), C-v
> `hoge`hogehoge
> `foof`oofoo
> `barb`arbar

v,V,C-vはそれぞれ選択開始時の入力キーです。
C-はControlキーと他のキーの組み合わせということは[入門編](http://qiita.com/himinato/items/c97970ab34ff55ff3167)にて説明しました。

さて選択中にヤンク(コピー)や削除をするのはもっともらしい使い方ですが、ブロックモードには更に利用価値があります。
例えば上記したブロックモードの選択中に`I`を押すとインサートモードに移りますので、`frst`などと入力してノーマルモードに戻ると

> hogefrsthogehoge
> fooffrstoofoo
> barbfrstarbar

となるかと思います。
あとはブロックモード中に`>`でインデント下げなどもよく使用します。

慣れないうちはこの３種のビジュアルモードに頼りがちですが、熟練するにつれてブロックモード以外使う必要がなくなってきます。
といってもそれぞれに十分に利用価値があるのでがしがし利用していきましょう。

## vimrcについて

vimrcとはvimの設定ファイルのことです。
通常は ~/.vimrc に置いておきます。
vimrcを含めて.~のようなドットファイルをまとめて管理したい人は[dotfilesをgithubで管理](http://qiita.com/himinato/items/7f5461814e8ed8916870)をご覧ください。

さてこの設定ファイル、私はかなり小さくまとめているつもりですが333行もありました。
たかがエディタの設定に数百行も書くことあるのか！？と疑問になるでしょうが、あるんです。(しかも私はライトユーザです)
ということでオススメの設定を載せていきます。

```vim
" matchit {{{
" if や for などの文字にも%で移動できるようになる
source $VIMRUNTIME/macros/matchit.vim
let b:match_ignorecase = 1
" }}}

" usability {{{
" set t_Co=256は256色対応のターミナルソフトでのみ作用するので、Winのコマンドプロンプト使っている人などは ダブルコーテーションでコメントアウトしといて
set t_Co=256
" 色づけを on にする
syntax on
" カラースキーマを設定する。jellybeansは最初はないカラースキーマだが、次回説明するプラグインにて説明する。
"colorscheme jellybeans
" 今のところ好きなカラースキーマを使っていて大丈夫。
colorscheme desert
" ターミナルの右端で文字を折り返さない
set nowrap

" tempファイルを作らない。編集中に電源落ちまくるし、とかいう人はコメントアウトで
set noswapfile

" ハイライトサーチを有効にする。文字列検索は /word とか * ね
set hlsearch
" 大文字小文字を区別しない(検索時)
set ignorecase
" ただし大文字を含んでいた場合は大文字小文字を区別する(検索時)
set smartcase

" カーソル位置が右下に表示される
set ruler
" 行番号を付ける
set number
" タブ文字の表示 ^I で表示されるよ
set list
" コマンドライン補完が強力になる
set wildmenu
" コマンドを画面の最下部に表示する
set showcmd
" クリップボードを共有する(設定しないとvimとのコピペが面倒です)
set clipboard=unnamed

" 改行時にインデントを引き継いで改行する
set autoindent
" インデントにつかわれる空白の数
set shiftwidth=4
" <Tab>押下時の空白数
set softtabstop=4
" <Tab>押下時に<Tab>ではなく、ホワイトスペースを挿入する
set expandtab
" <Tab>が対応する空白の数
set tabstop=4

" インクリメント、デクリメントを16進数にする(0x0とかにしなければ10進数です。007をインクリメントすると010になるのはデフォルト設定が8進数のため)
set nf=hex
" マウス使えます
set mouse=a

" インサートモードの時に C-j でノーマルモードに戻る
imap <C-j> <esc>
" [ って打ったら [] って入力されてしかも括弧の中にいる(以下同様)
imap [ []<left>
imap ( ()<left>
imap { {}<left>

" ２回esc を押したら検索のハイライトをヤメる
nmap <Esc><Esc> :nohlsearch<CR><Esc>
" }}}
```

特に imap(インサートモード) とか nmap(ノーマルモード) のキーマッピングは使えます。
キーマッピングを記載することによって自分好みのショートカットが設定できるということですし。

imap < <>\<left\>
と記載しておけばどうなるかは予測できますよね。
ちなみに記法は
imap or nmap 入力キー 実行すること
になります。
:(コロン)のあとにコマンドを書くとコマンドを実行してくれたりします。
`<CR>`,`<Esc>`,`<Tab>`など、一部のキーは特殊な記法になっているので注意してください。

## 最後に
紹介したvimrcについてはgithubやネットを調べれば自分好みの設定が見つかると思うので、いろいろ調べてみるのがいいと思います。
次回はプラグインに入っていこうかと思います。
正直今回紹介していこうかと思いましたが、長くなりましたので次回に回します。
Ruby2.1.2でgem 'debugger'を動かす

何故か、Ruby2.1.2ではgem 'debugger'が動かなかったので、
[先行者](https://github.com/cldwalker/debugger/pull/126/commits)の知恵をお借りして、
インストールしてみた。

# インストール
```zsh
 $ git clone https://github.com/mekishizufu/debugger.git
 $ git checkout ca451a9bdf
 $ cd debugger
 $ gem build debugger.gemspec
 $ gem install debugger-1.6.6.gem
```

これで、
gem 'pry-byebug'
がインストールできるようになりました。。
HaxeでビルトインWEBサーバ

Haxeには簡易WEBサーバを建てる機能が備わっていて至れり尽くせり。
Haxeをインストールする時に`neko`も一緒にインストールしないと使えないけれども。

ドキュメントが少ないせいで、いつも忘れてしまってコマンド探しての手間が馬鹿にならないので公開メモとして残しとく。

```
nekotools server -p 2000 -h localhost
```


* `-p` ポートを指定、省略すると`2000`

* `-h` ホスト名を指定、省略すると`localhost`

* `-d` ドキュメントルートを指定、省略するとコマンドを実行したディレクトリがドキュメントルートになる

* `-rewrite` urlをindex.htmlにリライトする奴、詳しい使い方はよく分かっていない
PidoraでSDRする準備

この辺([Raspberry Piで航空機からの位置情報信号ADS-Bを受信](http://d.hatena.ne.jp/NeoCat/20140402/1396406442))を参考に
RTL USBドングルを使えるようにしてみた。

### パッケージ追加
ズボラして、`yum -y groupinstall "Development tools"`してたので、以下を追加

````:console
yum -y install cmake
yum -y install libusb
````
この状態でビルドしようとしたら、libusb-1.0ないよって怒られた。libusbじゃなく、libusb-devel入れないとダメだった。

`yum -y install libusb-devel`

### ビルド
ソース引っ張ってくる
`git clone git://git.osmocom.org/rtl-sdr.git`

後はビルドする。

````:console
cd rtl-sdr
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
````

###テストしてみる
`sudo rtl_test`
librtlsdr.soが見つからないと怒られます。
Fedora/CentOS系は、/usr/local/libがライブラリパスに含まれてないので、追加する必要があります。

/etc/ld.so.confに、`/usr/local/lib`を追加して

````:/etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
````

`sudo ldconfig`します。
つまり、`make install`したあとの`sudo ldconfig`は意味なかったとorz

気を取り直して、テスト

````:console
Found 1 device(s):
  0:  Generic, RTL2832U, SN: ******************
````

できました。

後は、`rtl_tcp -a 0.0.0.0`で動かせば他のマシンからRaspberry Piのポート1234へつないで利用することが出来ます。
Ubuntu 14.04 (64bit)でCanonのネットワークプリンタを使う

Canonのインクジェットプリンタ(PIXUS)をネットワークプリンタとして使うには、bjnpのcups-backendが必要ですので、以下の方法でインストールします

### 1. cups-backend-bjnp ###

```bash
$ sudo apt-get install cups-backend-bjnp
```

もしくはUbuntuソフトウェアセンターから`cups-backend-bjnp`で検索＆インストール

### 2. プリンタ追加 ###

その後、プリンタ設定画面を開き、追加を開始すると下記の通りネットワークプリンタの一覧に表示されます。

![Screenshot from 2014-05-10 18:54:28.png](https://qiita-image-store.s3.amazonaws.com/0/22754/66540634-93ed-56a2-c1e9-ce8d2c12c9ac.png)

選択すると`bjnp://...:8611`なURIが表示されるので、`進む`をクリックし、あとは普通に追加作業を行っていくだけです。

### ドライバについて ###

*Gutenprint*にかなりの数のドライバが入っているので、ドライバが見つからない、ということにはならないと思います。

### あとがき ###

WindowsXP/7に比べれば圧倒的に楽ですが、Windows8においては追加作業すら無く、OS進化の素晴らしさを感じます。
SpriteKit入門 -20-


SKShapeNodeクラスを使用して図形を描画してみます。

```objectivec:HelloScene.m
- (void)createSceneContents
{
    self.backgroundColor = [SKColor blackColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
	SKShapeNode *ball = [[SKShapeNode alloc] init];
	CGMutablePathRef myPath = CGPathCreateMutable();
	CGPathAddArc(myPath, NULL, 300, 300, 15, 0, M_PI*2, YES);
	ball.path = myPath;
	ball.lineWidth = 1.0;
	ball.fillColor = [SKColor blueColor];
	ball.strokeColor = [SKColor whiteColor];
	ball.glowWidth = 0.5;
	[self addChild:ball];
}
```
![spritekit_20_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/94079bd2-744c-1704-078c-57f3a4284a05.png "spritekit_20_01.png")

今回はここまで。
よくわからなくなる`window`or`Element`直下のfunction or property


##window.scrollBy(x,y)

指定量をスクロールする
##window.scroll(x,y)

scrollToと同じ。ページ左上を基準にして絶対値で所定の箇所までスクロールする

## window.outer[width,height]

メニューバー等も含めたブラウザ全体のサイズ
## window.inner[width,height]

表示領域のサイズ

## window.scroll[Y,X]

ページのスクロール量を表示。IE8以下がこのプロパティに対応していない為、
window.page[Y,X]Offsetがエイリアスとして存在する

## Element.scroll[Top,Left]

要素内でスクロールした量
## Element.scroll[Height,Width]

要素がスクロールできる状態の時にその表示領域のサイズを返す

## Element.offset[Width,Height]

要素のサイズwidth/height + border + padding + scrollbar

## Element.offset[Top, Left]

親要素からの距離を返す。Element.offsetParentで基準となる親を取得出来る

## Element.client[Width,Height]

要素のスクロールバーの以外のサイズの合計
要素がoverflow:hideen等で表示しきれてなかった場合は表示領域のサイズみ返す

## Element.scroll[Width,Height]

要素のスクロールバーの以外のサイズの合計
要素がoverflow:hidden等で表示してなかったとしても全体のサイズを返す

## Element.getBoundingClientRect()

返却されたオブジェクトは下記を保持

* width 要素の幅
* height 要素の高さ
* top 要素上部の、画面の表示領域上部からの距離
* left 要素左の、画面の表示領域左からの距離
* bottom 要素下部の、画面の表示領域上部からの距離
* right 要素右の、画面の表示領域左からの距離
Rでネットワーク分析。指定Twitterユーザーのフォロー関係を可視化する。

#出力結果
![RPlot.png](https://qiita-image-store.s3.amazonaws.com/0/38787/f923542b-5b6c-82cb-67d5-cb1f698100d4.png)

#概要
RでTwitterユーザー間のフォロー/フォロワー関係を調べる。
手始めに、指定ユーザーのフォローリストを取得しグラフ化する。

#作業
下記ページの作業を行った。
[ -> Mining Twitter with R - Tutorial 1: Building a corpus from Twitter data - YouTube](https://www.youtube.com/watch?v=mJVcANlkxU8)
　※英語注意。台詞は聞き取れなくてもOK。映像だけ見れば、何をやればいいかは分かる。

#コード
```r:twitnet.R
library(ROAuth)
library(twitteR)
library(igraph)


#【認証処理】

# 設定情報を取得
twit.consumerKey <- "<あなたのTwitter-API key>"
twit.consumerSecret <- "<あなたのTwitter-API secret>"

# 証明書を取得
setwd(tempdir())
cacert.name <- "cacert.pem"
download.file(url = "http://curl.haxx.se/ca/cacert.pem", destfile = cacert.name)
# OAuth認証
twit.cred<-OAuthFactory$new(consumerKey = twit.consumerKey,
                            consumerSecret = twit.consumerSecret,
                            requestURL = "https://api.twitter.com/oauth/request_token",
                            accessURL = "https://api.twitter.com/oauth/access_token",
                            authURL = "https://api.twitter.com/oauth/authorize")
# ※コマンド実行後、Web画面での認証を求められる。
#   Web画面に表示されるPIN番号をコンソールで入力する。
twit.cred$handshake(cainfo = cacert.name)

# Twitter認証
registerTwitterOAuth(twit.cred)


#【本処理】

# 対象ユーザーの情報を取得
user <- getUser("nezuq", cainfo = cacert.name)
# 対象ユーザーのフォロー対象者の情報を取得
friends <- user$getFriends(cainfo = cacert.name)
friends.df <- twListToDF(friends)
friends.n <- nrow(friends)
users <- c(user, friends)
users.df <- twListToDF(users)
users.n <- nrow(users.df)
# グラフデータを作成
g.data <- cbind(1,2:users.n)
g <- graph.edgelist(g.data)
# グラフを表示
V(g)$name <- users.df$screenName
plot(g, vertex.label = V(g)$name, vertex.size = 10, vertex.label.cex = 0.6, margin = -0.4)
```

#感想
申し訳ないが、TwitterのAPI key/API secretをWebでコピーする時に付いてくる半角スペースはNG。
そのせいで3時間くらい不要な調査を強いられたんだよなぁ。

#参考ページ
[ -> Mining Twitter with R - Tutorial 1: Building a corpus from Twitter data - YouTube](https://www.youtube.com/watch?v=mJVcANlkxU8)
[ -> R言語でTwitterを操作する : 実験ぶろぐ（仮）試供品](http://needtec.exblog.jp/20588155/)
[ -> Package ‘twitteR’](http://cran.r-project.org/web/packages/twitteR/twitteR.pdf)
[ -> ネットワーク分析をもうちょっと勉強 - でたぁっ 感動と失敗の備忘録](http://deta.hateblo.jp/entry/2013/05/01/053426)
symfony2.3でhasFlash()が使えなくなりflashBag.has()を使うようになった

2.2までの書き方
コントローラでflashメッセージをセットする：
$this->get('session')->setFlash('notice', '更新しました。');

twigテンプレートでflashメッセージが存在するかどうか確かめる:
{% if app.session.hasFlash('data') %}
    {# dataというflashがある場合の処理 #}
{% else %}
     {# dataというflashがない場合の処理 #}
{% endif %}

twigテンプレートでflashメッセージを表示：
{# hogeというflashを表示 #}
{{ app.session.flash('hoge') }}

2.3からの書き方
コントローラでflashメッセージをセットする：
$this->get('session')->getFlashBag()->set('notice', '更新しました。');

twigテンプレートでflashメッセージが存在するかどうか確かめる:
{% if app.session.flashBag.has('data') %}
     {# dataというflashがある場合の処理 #}
{% else %}
     {# dataというflashがない場合の処理 #}
{% endif %}

twigテンプレートでflashメッセージを表示：
{# hogeというflashを表示 #}
{% for flashMessage in app.session.flashBag.get('hoge') %}
     {{ flashMessage }}
{% endfor %}
railsのrenderの変態的な便利機能

Railsに慣れてる人にとっては通常のことなのかもしれませんが、自分には未だに変態的だと思えるRailsのRenderの機能

## 複数形のモデルの配列を渡すと勝手にループ

例えば `app/views/posts/show.html.erb`の中でコメントの一覧を表示したい時に普通だとこう書けます。

```erb:posts/show.html.erb
<% @comments.each do |comment| %>
  <%= render 'comments/comment', comment: comment %>
<% end %>
```

```/erb:comments/_comment.html.erb
<%= comment.name %>
<%= comment.content %>
```

普通ですね。

## Best Practice とかいうの

これをRails風に書くと

```erb:posts/show.html.erb
<%= render @comments %>
```

になります。`_comment.html.erb`は変更しなくてOKです。変態ですね。`render`さん仕事し過ぎじゃないっすか？
Middlemanでサイトを制作する


# Middlemanとは

# Middlemanのインストール方法

コマンドラインから以下を実行してインストールすることができる

```
gem install middleman
```

# コマンド

## middleman init

サイトを制作する

## middleman server

サーバーを起動する
http://0.0.0.0:4567/
をブラウザで開く

## middleman build

静的なHTMLファイルを生成する
NSTextFieldの入力値の検証


ソース: https://github.com/Nunocky/TextFieldValidation

#やりたいこと
ネットワーク設定でIPアドレスを入力させたいとか 140文字以内のテキストを入力させたいとかいうときに、それらの条件を満たさないことをどうやってユーザーに通知したら良いか?

ちなみにOSXのネットワーク設定のIPアドレス設定ではこんなアラートが出てテキストが "0.0.0.0"になる。

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/3847/ce839064-1343-2cfc-f9ef-27320e918c05.png "fig2.png")



##その1 NSTextFieldのnotificationを利用する
TextFieldValidationでは、NSTextFiledのdelegateに AppDelegateを指定している。
そしてAppDelegateに controlTextDidEndEditing: メソッドを実装し、その中でどのTextFieldから来た通知なのかを判定、適切な評価器を呼んで評価する。
この方法を使えば、NSTextFieldの中でEnterを押したりTabキーなんかでフォーカスを他のところに移動した時に評価が行われる。

```objectivec
-(void)controlTextDidEndEditing:(NSNotification *)notification
{
    NSTextField *tf = [notification object];
    NSString *identifier = [tf identifier];

    if ([identifier isEqualToString:@"ipaddress"]) {
        IPAddressTextValidator *validator = [[IPAddressTextValidator alloc] init];
        if (![validator validate:tf.stringValue]) {
            NSRunAlertPanel(@"error",
                            @"invalid format",
                            @"close",
                            nil,
                            nil);
        }
    }
.
.
.
```


##その2 文字列プロパティにbindする方法
TextFieldValidation2は入力をリアルタイムに見る方法。
AppDelegateに NSStringのプロパティを用意、NSTextFieldのvalueプロパティにそれぞれbindする。その際、オプション「Continuously Updates Value」を有効にする。これで文字を入力するたびにプロパティの setterが呼ばれるようになる。

![TextFieldValidation2.png](https://qiita-image-store.s3.amazonaws.com/0/3847/b38d99f4-e3f9-9c81-24d5-d1ebbf1d0de1.png "TextFieldValidation2.png")

あとはプロパティの setterの中でテキスト評価器による判定を行えば良い。不正だったら背景を赤くするとか、ツールチップに正しい値のサンプルを表示させるとか。

```objectivec:AppDelegate.m
-(void)setText0:(NSString *)text0
{
    if ([_text0 isEqualToString:text0])
        return;
    _text0 = [text0 copy];
    
    IPAddressTextValidator *validator = [[IPAddressTextValidator alloc] init];
    if (![validator validate:_text0]) {
        [_textField0 setBackgroundColor:[NSColor redColor]];
    }
    else {
        [_textField0 setBackgroundColor:[NSColor whiteColor]];
    }
}
```


###困っていること
TextFieldValidation2では不正な入力の際にTextFieldの背景を赤くするつもりなのだけど、編集中にsetBackgroundColorを行ってもエリアの上の部分がちょっと赤くなるだけで全体が赤くならない問題が。フォーカスを外すと全体が赤くなる。これどうすれば直せるんだろう。

#テキスト評価器について
サンプルではIPAddressTextValidatorと LessThan30TextValidatorの2つを作ってみた。この辺何か汎用的なクラスがあるんじゃないかって気がする。けどStackOverflowみても特にそれらしいクラスはないようだし、みんなどうしてるんだろう。
SoundCloud iOSアプリ開発 : スタートガイド

SoundCloudのAPIをつかったiOSアプリ開発の手順／ノウハウをまとめていくシリーズ。

まずは準備としてiOS SDKのインストールとビルドやパスやリンカーの設定から。

# はじめに

英語がスラスラ読める人は以下の元のページを参照した方が理解が深まります。
基本的に元のページと内容は一緒ですので。

参考：SoundCloud iOS SDK
http://developers.soundcloud.com/docs/api/ios-quickstart

# アプリ名登録

今回は特に必要ありませんが、ガイドラインの流れに沿って一応載せておきます。
後ほどOAuth認証をする為にいずれは設定が必要なので。

アプリ名は以下のページから登録します。
http://soundcloud.com/you/apps

上記のページにて、"Register a new application"をクリック
次のページで、アプリ名を入力して"Register"をクリック。
その次のページでは、"Website of your app"とか"Redirect URI for Authentication"
とかあるけど、後で編集可能なのでここはとりあえず空欄でよいです。

"Redirect URI for Authentication"には、OAuth認証の際のURLを決めて入力します。
`my-app://soundcloud/callback`とかでいいとおもいます

参考：HTTP API Guide -Authentication-
http://developers.soundcloud.com/docs#authentication

"Developer Policies"に同意するためのチェックだけをつけて、"Save app"をクリックで登録完了です。
アプリ名が気に入らなかったら後で登録しなおせばいいのでこのフェーズはさらっと流しちゃってください。

# SDKインストール & 各種設定

SoundCoudのクイックスタートガイドに沿って準備します

参考：Install SDK and Dependencies
http://developers.soundcloud.com/docs/api/ios-quickstart#installation

## サブモジュールのチェックアウト
まずは開発に必要なサブモジュールをチェックアウトしてきます。
ターミナルよりSDKをインストールするプロジェクトのディレクトリ下に移動して、以下のコマンドを実行します。
```
git submodule add git://github.com/soundcloud/CocoaSoundCloudAPI.git
git submodule add git://github.com/nxtbgthng/OAuth2Client.git
git submodule add git://github.com/nxtbgthng/JSONKit.git
git submodule add git://github.com/nxtbgthng/OHAttributedLabel.git
git submodule add git://github.com/soundcloud/CocoaSoundCloudUI.git
```
SoundCloud iOS SDK, OAuth, JSON, UIに関するサブモジュールがチェックアウトされます。


## サブモジュールをプロジェクトに追加
次にチェックアウトしたサブモジュールをアプリのプロジェクトに追加します。

Xcodeを開いて、プロジェクトファイルを右クリック->"Add Files to Project"より、
CocoaSoundCloudAPI, CocoaSoundCloudUI, JSONKit, OAuth2Client, OHAttributedLabelのそれぞれのプロジェクトファイルをインポートします。
チェックアウトしてきたサブモジュールのフォルダの下にプロジェクトファイルがあります、

## パスの追加
Project Navigatorより、"Build Settings"->"Header Search Paths"に`$PROJECT_DIR`を追加します。また、`$PROJECT_DIR`の設定を"non-recursive" -> "recursive"に変更します。

## 依存関係の追加
Project Navigatorより、"Build Phases"->"Target Dependencies"に
libSoundCloudUI, OAuth2Client, libJSONKit, OHAttributedLabel, SoundCloudAPIをそれぞれ追加

## ライブラリの追加
Project Navigatorより、"Build Phases"->"Link Binary with Libraries"に
・libJSONKit.a
・libOAuth2Client.a
・libOHAttributedLabel.a
・libSoundCloudAPI.a
・libSoundCloudUI.a
・AddressBook.framework
・AddressBookUI.framework
・CoreGraphics.framework
・CoreLocation.framework
・CoreText.framework
・QuartzCore.framework
・Security.framework
をそれぞれ追加

## リンカーの設定
Project Navigatorより、"Build Settings"->"Other Linker Flags"に`-all_load -ObjC`を追加。

## Bundleファイルの追加
チェックアウトしてきたサブモジュールCocoaSoundCloudUIの下にある"SoundCloud.bundle"をXcodeのプロジェクトにドラグ&ドロップします。
次にダイアログが出てくるので "Copy items into destination group's folder (if needed) "にチェッックをつけて"Finish"を選択。

# おわりに

以上、これでセットアップ完了です！
セットアップが完了したらアカウント認証編へ続きます（多分）。

何か抜け漏れや認識間違い等ありましたらご指摘頂けたらと思います。
余り動かないログをtail監視するときの小技

画面が常にログで埋まった状態をずっと見ていると、ログが増えた際にログが増えたことに気づかなくなり、時々ログのタイムスタンプを現在時刻と見比べてまだ動いてないな、みたいなことを定期的にしてしまう退屈な状況。

これを解決する簡単なアイデアとして時々`Enter`を入力して画面上にログの隙間を作っておく事がある。

すると今度はログが入った後にまた適当なタイミングで`Enter`をしないと、またわからなくなります。

そんな感じで時々Enterを押してたんだけど、これ勝手に空行開いてくれればいいんじゃね？てことでtailする前に以下を実行してみた。

```bash:
while :;do echo; sleep 30; done &
```

コレで時々勝手に画面上のログが空行で流れていってくれて快適に！
Couchbase.Lite.Net、Xamarin iOSとAndroid版暫定コンパイルしました

ドキュメントデータベースと言う事で超期待してるCouchbase-Liteを[Xamarinが移植し始めて](https://github.com/xamarin/couchbase-lite-net)から大分経ちますが、PCL化をゴールにしているせいか一向に進む様子がないので、カッとなってiOSとAndroidでコンパイルしてみました。
[こちら](https://github.com/tilemapjp/couchbase-lite-net)で公開してます。

Android版として、[SotoiGhost](https://github.com/SotoiGhost)さんの[実装](https://github.com/SotoiGhost/couchbase-lite-net/tree/android)があったので、iOS版も含めそちらに助けられたところ大です。
[iOS版はコンポーネントストアにある](https://components.xamarin.com/view/couchbase-lite/)し、そちらが安定してるし使った方がいいよ、とSotoiGhostさんにも勧められたのですが、

* 見てみるとNSDictionary…? NSDictionaryだと…？(Objective-Cラッパなので当たり前ですが)な感じでしたし
* しょせん個人的には業務に使う事はないので遊びに使えればOKでしたし、サーバとのレプリケーション周り等も個人的には今の所使う予定ないのでローカルが安定してれば十分ですし
* 大きめのプロジェクトを自力でコンパイル通す練習にも持って来いだったので

iOS版も準備してみました。
テストケースを徐々に追加していってますが、今追加してる範囲では問題なく通ってるみたいなので、ローカルで使う限りは多分ある程度は使えるんじゃないかと思います。

ド素人がコンパイルしたなんちゃってバイナリですが、Xamarin本体はこのソースツリーの延長線上をPCL化して共通のCouchbase-Lite APIとして提供する方針なのは間違いなさそうですし、とりあえず今のうちから非PCL版で遊んでおけば、本家が出てからもほぼ同じAPIで簡単に乗り換えられるんじゃないかと思います。

ツッコミ、パッチ、テスト大歓迎です！
Gitlab : charlock_holmesのインストールエラー

Gitlabインストール時にエラーに遭遇したのでメモ

**環境**
CentOS release 6.5 (Final)
GitLab 6.8.1
ruby 2.1.1

**下記を参考にインストール**
http://qiita.com/narumi888/items/da664ce0aca5373fd9aa

Gemsのインストール

```text
$ cd /home/git/gitlab
$ bundle install --deployment --without development test postgres
```

ここでエラー発生

```text
An error occurred while installing charlock_holmes (0.6.9.4), and Bundler cannot continue.
```


調べたらlibicu-develが入ってないとエラーになるらしいのでインストール

```text
$ sudo yum install libicu-devel
```

無事インストールできました。

参考
http://d.hatena.ne.jp/oraora7/20130908
Bootstrap の Form を Railsで使う

## 原因

「railsのフォームに`control-group`のclassとか色々つけるのめんどくせー。」と思いました。

## 対策

`gem 'bootstrap-form'`を`Gemfile`に追加して`$ bundle install`でOK.

あとは`<%= f.text_field :name %>と書くだけで全部よしなにやってくれる。

## 参考

https://github.com/bootstrap-ruby/rails-bootstrap-forms
phpenvの導入して複数バージョンのPHPを管理する


## phpenvとは

複数のバージョンのPHPを管理するツール。
Rubyで使われているrbenvを基にして作成されているようだ(ところどころ名残がある)。


## phpenvのインストール

以下のコマンドで、phpenvをインストール。

```shell
$ curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
$ git clone git://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
$ echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(phpenv init -)"' >> ~/.bashrc
$ exec $SHELL -l
```

完了すると、phpenvコマンドが使用できる。


## PHPのインストール

以下のコマンドで、PHPのバージョンが確認できる。

```shell
$ phpenv install -l
```

現状、バージョン番号が文字ソートになっているようで、
以下のような並びになっているので注意。

```
 5.5.1
 5.5.10
 5.5.11
 5.5.12
 5.5.2
```


例えば、5.5.12をインストールする場合は、
以下のようなコマンドで行う。

```shell
$ phpenv install 5.5.12
$ CFLAGS="-g" phpenv install 5.5.12 # コンパイラにオプションを渡す場合
```

コンパイル時のオプションは、以下のファイルに記載されている。

```
# デフォルトのオプション
$HOME/.phpenv/plugins/php-build/share/php-build/default_configure_options

# 各バージョンごとの設定
$HOME/.phpenv/plugins/php-build/share/php-build/definitions/5.5.12
```

オプションなどを変えたいときは、これらのファイルを編集する。

以下のような記述で、バージョンごとにオプションを変更できる。

```
# オプションを追加する
configure_option "--enable-pcntl"

# オプションを外す
configure_option -D "--with-mysqli"
```

configure_optionをファイルの一番下に記述したら、
反映されなかったことがあったので、
一番上に記述した方が良いかもしれない。


## バージョンを切り替える

以下のコマンドでインストールされているバージョンを確認することができる。

```shell
$ phpenv versions
* system (set by /home/uchiko/.phpenv/version)
  5.5.10
  5.5.11
  5.5.7
  5.5.8
```


以下のコマンドでバージョンを切り替えることができる。

```shell
$ phpenv global {version} # 全ディレクトリで使うバージョン
$ phpenv local {version} # カレントディレクトリのみで使うバージョン(.php-versionが作成される)
```


## Apacheとの連携

PHPをインストールするときに、
以下のconfigureオプションを追加する。

```
configure_option "--with-apxs2" "/usr/local/apache2/bin/apxs"
```

apxsへのパスは環境依存。以下のコマンドでパスがわかる。

```shell
$ which apxs
```

インストールされていなかったり、PATHが通っていなかったりすると、
のちに適用するパッチがうまく動作しないので、PATHは通す必要がある。


このオプションを追加してインストールすると、
libphp5.soが作成されるのだが、
Apacheのmodulesディレクトリに入れようとしてくるので、
パーミッションエラーが起こる。

この問題に対処するため、
PHPのMakefileで指定されているlibphp5.soの出力場所を、
書き換えるためのパッチをphp-buildに当てた。

```shell
$ wget https://gist.githubusercontent.com/memememomo/91f774b1e41b24f99e1e/raw/fe57f9936dae16c5ab186919c1611c8f6a4b1fbc/php-build.patch
$ patch -u $HOME/.phpenv/plugins/php-build/bin/php-build < php-build.patch
```

パッチは以下の記事で紹介されているものを基にしている。
http://tkuchiki.hatenablog.com/entry/2014/04/08/210022

このパッチを当てた後にPHPをインストールすると、
以下のディレクトリにlibphp5.soが出力される。

```
$HOME/.phpenv/versions/{version}/libexec/libphp5.so
```

あとは、modulesにシンボリックを張って、
httpd.confを編集して、Apacheを再起動するとPHPが有効になる。

```shell
$ sudo ln -s $HOME/.phpenv/versions/{version}/libexec/libphp5.so /usr/local/apache2/modules/
```

PHPの設定をしていない場合は、
以下の2行をhttpd.confの適切な場所に追記する。

```
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php
```

Apacheのリスタート。

```shell
$ sudo /usr/local/apache2/bin/apachectl restart
```

PHPが有効になる。

シンボリックリンクなどをうまく使えば、
Apacheで使うPHPの切り替えもスムーズにできる予感。


## 参考

phpenv+php-build環境の構築と運用
http://d.hatena.ne.jp/hnw/20120828

php-build が libphp5.so を上書きしないようにするパッチ
http://tkuchiki.hatenablog.com/entry/2014/04/08/210022
プロトコルで宣言されたプロパティを使う

ちょっと考えれば当たり前なのですが地味にハマったのでメモ

プロトコル宣言中に@propertyでプロパティを宣言することが出来ます。

```objc
@protocol MyPropertyProtocol <NSObject>

@property (nonatomic) NSString *myProperty;

@end
```

で、このプロトコルを利用して宣言したプロパティを利用しようとするとunrecognized selectorでクラッシュします。

```objc
self.myProperty = @"プロパティ";
```

なのでどうするかというと@synthesizeを使います。

```objc
@synthesize myProperty = _myProperty;
```
※オートシンセサイズに合わせてアンダースコア付きの変数にしています。(ikesyoさんありがとうございます。)

自分でアクセサメソッド実装したりしてめんどくさいことしてましたがこの1行で解決しました。
Modern ObjCで@synthesize書かなくても良くなったので存在を忘れかけてましたがまだ使いドコロがあったんですね。
twitter-bootstrapのtab機能でURLも変更する

`Bootstrap`のTab機能を使うと簡単にタブが実装できて便利なんですが、標準ではタブの切替でURLが変更されないので反映するようにしましょう。

## やり方

```coffeescript
$ ->
  hash = window.location.hash
  hash and $("ul.nav a[href=\"" + hash + "\"]").tab("show")
  $(".nav-tabs a").click (e) ->
    $(this).tab "show"
    scrollmem = $("body").scrollTop()
    window.location.hash = @hash
    $("html,body").scrollTop scrollmem
```

んで、あとはHTML内の`data-toggle="tab"`を抜いとかないとだめらしいです。
それからタブパネルも`class="tab-pane active"`な風にアクティブ化を忘れずに。

これでURLの後ろの `page#tab_name`なのがつくのでお気に入りしたり、URL送ったりが簡単にできるようになりました。
brewとrbenvを使ってRuby2.1.2を突っ込む

よく、[sora_hさんの記事](http://qiita.com/sora_h/items/9dd797f42e7bea674705)を参考にRubyを入れていたのですが、
readline問題などで最新のRubyでは落ちるので、
ここに最新版(2.1.2)のRubyを突っ込む方法を書いてみようと思います。

# 準備
Macにコンパイルに使うツールが入ってないので、

 - Xcodeから、Command Line Toolを入れるか、
 - [AppleのDownload page(要ログイン)](https://developer.apple.com/downloads/index.action) から入れてください

# brewのインストール
パッケージマネージャーの[homebrew](http://brew.sh)をインストールします。
本当は自分でパッケージを管理するのが良いですが、めんどくさいので、
brewに任せます。

```zsh
 $ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```

を実行し、homebrewをインストール

# opensslのインストール
```zsh
 $ brew install openssl
```

# readlineのインストール
6.3だとビルドに失敗するため、過去のフォーミュラの6.2.4を入れます

```zsh
 $ cd /usr/local
 $ git checkout 0181c8a Library/Formula/readline.rb
 $ brew install readline
```

# rbenvなどのインストール
```zsh
 $ brew install rbenv
 $ brew install ruby-build
 $ brew install rbenv-gemset
 $ brew install rbenv-gem-rehash
```

# rubyのインストール
```zsh
 # Rubyコンパイルを高速化
 $ export MAKEOPTS="-j8"
 $ CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.1.2
```

# バージョン変更
通常使用するRubyのバージョンを変更します。

```zsh
 $ rbenv global 2.1.2
```

# 確認

```zsh
 $ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
```

お疲れ様でした。
不備などありましたら、コメントまでどうぞ。
ネストされたモデル(親子関係を持つモデル)で、子を表示、編集するには

# 概要

- 親子関係を持つモデルで、親ビューから子を複数表示・編集方法。
- 親子関係を持つモデルのStrongParameterの定義方法。

今後調査したい事

- ビュー側で＋ボタンを押す度に動的に子の入力画面を増やしたり、ｰボタンで減らしたりする

# モデル

accepts_nested_attributes_forを利用することで、newやcreateするときに子のデータもまとめて設定できるようになります。

```rb

# アンケート（親)
# アンケートは質問(子）を複数持つ
class Enquate < ActiveRecord::Base
# attributes :id, :title, 
  has_many :questions
  accepts_nested_attributes_for :questions
end

# 質問（子) 
class Question < ActiveRecord::Base
# attributes :id, :content
 belongs_to :enquate
end
```

# コントローラ

has_manyでのオブジェクトの生成などはこちらも参考。
[Railsドキュメント model](http://railsdoc.com/model)
[Railsガイド ActiveRecord Associations](http://guides.rubyonrails.org/association_basics.html)

StrongParameterにて、Enquateの内容に加えQuestionsの属性も許可するようにします。
[ネストされたモデル（親子関係を持つモデル）でStrongParameterを利用する](http://qiita.com/hmu29/items/580b977834d4b3010454)



```rb
class EnquatesController < ApplicationController

  def new
    @enquate = Enquate.new
    # 入力用に空のオブジェクトを１つ生成します。
    @enquate.questions.build
  end

  def create
    @enquate = Enquate.new(enquate_params)
    #... 
  end

  def enuqate_params
    params.require(:enquate).permit(:title, questions_attributes: [:id, :content])
  end
end
```

# ビュー

form_for @enquate do |f| f.fields_for :questionsを利用します。

fields_forにaccepts_nested_fields_for指定のある属性名を指定すると、自動的に子分のフィールドを作成し、name属性をenquate[questions_attribute[0]][content]のように展開してくれます。

```rb
= form_for @enquate do |f|
  .field
    = f.label :title
    = f.text_field :title
  .questions
    = f.fields_for :questions do |q|
      .field
       # 例 <input id="enquate_questions_attributes_0_enquate_id" name="enquate[questions_attributes][0][enquate_id]" type="hidden" value="2" />
       = q.hidden_field :enquate_id
      .field
       = q.label :content
       # 例 <input id="enquate_questions_attributes_0_content" name="enquate[questions_attributes][0][content]" type="text" value="Test" />
       = q.text_field:
```

## 子要素のキーが複合キーの場合

※　もし子要素の主キーが複合キーで、composite_primary_keysを利用している場合、:idではなく、:a_id, :b_idなど複合キーを明示しないと動作しないっぽい。(gemをいじったりする必要がでてしまう??)

```rb
= q.hidden_field :id # 値は"[1070, 190]"のように複合キーの配列の文字列になるけど、composite_primary_keys内で"[1070,190]"と比較されてたりして、うまく動作しない。
= q.hidden_field :a_id
= q.hidden_field :b_id
```


## fields_forの参照元オブジェクトにアクセスするには
object属性を利用する.

```rb
= f.fields_for :questions do |q|
  = q.object.id
```

## fields_forの参照元オブジェクト(has_many時)のインデックスを取得するには
indexを利用する

```rb
= f.fields_for :questions do |q|
  = q.object.id
  = q.index
```

# 余談

- javascriptで、動的にQuestionの入力フィールドを増やしたい場合、HTMLのidやnameを知らずにrailsオブジェクトで行えるgemやメソッドってあるの？
- StrongParameter、ネストされたモデルの使い方、親子間のビューの使い方をざーっと眺めて、なんとなくRailsが使えるようになってきた気がする。
【Xcode】フラットUI好きな人におすすめのカラースキーム/テーマ

今回は、フラットカラー大好き、全てをフラットカラーに染めたい方に
おすすめのXcode用のテーマを紹介します。
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/a/alex23drum/20140510/20140510111906.png"  itemprop="image"></span></p>

##「flatland」

SublimeTextでもこの名前のテーマが有名ですが、Xcodeでもあります。
Solarizedとかも有名ですが、Solarized-darkとか見にくくないですか、、？  
こちらの「flatland」は見やすいし、おしゃれな色使いだし、めっちゃおすすめです！！

ダウンロードは[こちら](https://github.com/mduvall/flatland-xcode)から


**~導入方法~**

1. [こちら](https://github.com/mduvall/flatland-xcode)からテーマをダウンロード
2. 以下のパスに、DLしたカラーテーマファイル（Flatland.dvtcolortheme）を置きます。（FontAndColorThemesというディレクトリがない場合は、新規作成してください)  
`~/Library/Developer/Xcode/UserData/FontAndColorThemes`
3. Xcodeを再起動して、上のメニューバーのXcode>Preferencesをクリック
4. Fonts & Colorsタブ内で追加したテーマが一覧に出てくるので、flatlandを選択。
pipインストールで嵌った話

# 現象
・python distribute_setup.pyでeasy_installをインストールできない
・easy_install pipでpipをインストールできない

#解決までの流れ
pipをインストールするためにまずeasy_installを入れる必要がある。

http://python-distribute.org/distribute_setup.py
を右クリックでC直下に保存。

そして、コマンドプロンプトでC直下まで行き、python distribute_setup.py　でインストールできる、、、はずができない。

```py
Downloading　http://pypi.python.org/packages/source/d/distribute/distri9.tar.gz
Traceback (most recent call last):
File "distribute_setup.py", line 556, in <module>
sys.exit(main())
File "distribute_setup.py", line 552, in main
tarball = download_setuptools(download_base=options.download_base)
File "distribute_setup.py", line 215, in download_setuptools
dst = open(saveto, "wb")
OSError: [Errno 22] Invalid argument: 'C:\\distribute-0.6.49.tar.gz'
```

となってしまう。
だから、
https://pypi.python.org/packages/source/d/distribute/
まで飛んで、distribute-0.6.49.tar.gzをC直下にダウンロード。

もう一度python distribute_setup.pyを実行すると無事にインストール成功。

そして、easy_install pipを実行すればインストールできる、、、はずができない。

どうやらPATHが通ってないらしい。

SET PATH=%PATH%;C:\Python34\Scripts

で無事PATHが通り、pipのインストール成功。
【Android】Twitter、Facebook、Google+に簡単に共有する方法


Twitter、Facebook、Google+等に共有する場合、独自に実装しているアプリを多くみかけますが、暗黙的Intentを使うと簡単です。

Google PlayやYouTubeなどの公式アプリもこの暗黙的Intentを使用して共有機能を実装しているようです。


![device-2014-05-10-115304.png](https://qiita-image-store.s3.amazonaws.com/0/27793/e57c58e0-0f18-8d47-c8a9-0fe5f5a5b3a7.png "device-2014-05-10-115304.png")



```java:

try {
	Intent intent = new Intent();
	intent.setAction(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, "共有する文言");
    startActivity(Intent.createChooser(intent, "共有する"));
} catch (Exception e) {
}                


```



たったこれだけです。
Backbone.jsのEventテストでハマった話

## ハマったコード
下記のcoffeescriptのコードをjsTestDriverでテストします。なお私の場合Backbone.jsを使ってハマりましたが、基本的にはjQueryのonでも同じ結果になると思われます。

```coffee:eventsample.coffee
class @EventSample
  constructor: ->
    @func = null

    Backbone.on("test", => @.onTest())

  onTest: ->
    @func()
```

- イベント "test" が発生するとonTest()を実行するだけのクラスです。
- onTest()は@func()を実行します。しかし@funcは初期値はnullです。


テストコードは下記です。

```coffee:test.coffee
TestCase "Test1",
  setUp: ->
    @event = new EventSample()

  "test1": ->
    assertNull(@event.func)

TestCase "Test2",
  setUp: ->
    @event = new EventSample()
    @event.func = ->
      console.log "dummy"

  "test2": ->
    Backbone.trigger "test"
    assertNotNull(@event.func)
```

- Test1はクラスを初期化して、@funcがnullであることを確認するだけのテストです。
- Test2は@funcに適当に関数を設定して、イベント"test"を発行するテストです。@func()が実行されるはずです。

## どうハマったか
上記のテストを実行すると、Test2でなぜか@funcがnullで実行できないというエラーが発生します。
![test_coffee_-_BackboneEventSample_-____Develop_PhpstormProjects_BackboneEventSample_.png](https://qiita-image-store.s3.amazonaws.com/0/34579/9304f819-d835-c632-012d-150e9a50c866.png "test_coffee_-_BackboneEventSample_-____Develop_PhpstormProjects_BackboneEventSample_.png")

## 原因
Test2の実行時もTest1で生成した@eventのインスタンスが残っているのが原因。イベント"test"を発行すると、Test1, Test2両方の@eventのonTest()が実行される。Test1の@event.funcはnullなので当然関数としては実行できずエラーとなってしまう。

## 解決方法
下記のように、onで登録したイベントを解除する関数を追加する。

```coffee:eventsample.coffee
class @EventSample
  constructor: ->
    @func = null

    Backbone.on("test", => @.onTest())

  #追加
  unbindEvent: ->
    Backbone.off("test")

  onTest: ->
    @func()
```

テストでは、 **tearDownで登録したイベントを解除** します。

```coffee:test.coffee
TestCase "Test1",
  setUp: ->
    @event = new EventSample()

  tearDown: ->
    @event.unbindEvent()

  "test1": ->
    assertNull(@event.func)

TestCase "Test2",
  setUp: ->
    @event = new EventSample()
    @event.func = ->
      console.log "dummy"

  tearDown: ->
    @event.unbindEvent()

  "test2": ->
    Backbone.trigger "test"
    assertNotNull(@event.func)
```

下記のようにテストがOKになりました。
![test_coffee_-_BackboneEventSample_-____Develop_PhpstormProjects_BackboneEventSample_.png](https://qiita-image-store.s3.amazonaws.com/0/34579/a50f1712-793b-aa20-6562-9e3fa59b4f29.png "test_coffee_-_BackboneEventSample_-____Develop_PhpstormProjects_BackboneEventSample_.png")
brew --prefixでgem install nokogiri / rbenv install 2.1.2

いつも忘れる。

nokogiri

    gem install nokogiri -- --use-system-libraries

ruby

    RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)" rbenv install 2.1.2

brew --prefix べんり。readlineをこうして読み込まないと、irbで日本語入力できない
IDisposableなインスタンスをオブジェクト初期化子で初期化するとコード分析でCA2000を警告される

## CA2000とは

('ω')＜[CA2000: スコープが失われる前にオブジェクトを破棄します][L1]

コード分析の規則セットでは、```Microsoftのすべての規則```を選択した場合のみ有効になるようです。

## 問題

次のようなクラスを定義し、Mainメソッドで初期化してDisposeします。

```csharp
// MyClass
class MyClass : IDisposable
{
	public string Text { get; set; }
	public void Dispose( ) { return; }
}
```

```csharp
// Program クラス内
static void Main( string[ ] args )
{
	var value = new MyClass( )
	{
		Text = "",
	};
	value.Dispose( );
}
```

このコードに対する CA2000 のメッセージは次の通りです。

```
CA2000	スコープを失う前にオブジェクトを破棄	メソッド 'Program.Main(string[])' で、オブジェクト '<>g__initLocal0' が破棄されない例外パスがあります。オブジェクト '<>g__initLocal0' への参照がすべてスコープ外になる前に、このオブジェクトの System.IDisposable.Dispose を呼び出してください。	ConsoleApplication1	Program.cs	13
```

## 原因

```MyClass``` の```Text```プロパティで例外が発生する可能性が有ると判断されたためです。
オブジェクト初期化子では、プロパティへの設定が失敗すると参照が```value```に代入されないため、
```MyClass```のインスタンスを```Dispose```する手段が無くなってしまいます。 **usingも無視されます。**

詳しくは[オブジェクト初期化子の罠][L2]を参照して下さい。

## 対策

```IDisposable``` なインスタンスの初期化では、オブジェクト初期化子を使用しないようにします。

```csharp
// Program クラス内
static void Main( string[ ] args )
{
	var value = new MyClass( );
	try
	{
		value.Text = "";
	}
	finally
	{
		value.Dispose( );
	}
}
```

[//]: リンク一覧
[L1]: http://msdn.microsoft.com/ja-jp/library/ms182289(v=vs.120).aspx
[L2]: http://qiita.com/kuchikios/items/48209b5a614e5fa63d63
factory_girl_railsで生成したオブジェクトを破壊的メソッドで変更する場合の注意点

# factory_girl_railsで生成したオブジェクトを破壊的メソッドで変更する場合の注意点

factory_girl_railsを使ってテストデータを生成し、
そのデータを直接変更した場合にはまったので紹介しておきます。

**Factoryで生成したオブジェクトを破壊的メソッドを使って変更すると、
別のテストで再度生成する場合に、変更された値で生成されるということです。（つまりFactoryの型を破壊してしまうということ）**


具体的な例で説明します。
一つのテストデータを使って、一部分だけ変更したデータを複数作成したい場合があります。
例えば、レポートNoだけをインクリメントして10件登録するような場合を考えます。

ベースとなるテストデータは次の通り。

```rb:test/factories/reports.rb
FactoryGirl.define do
  factory :report_test1, class: :Report do
    report_no 'R00001'
    title 'report title'
    content 'report content'
  end
end
```

テストコードは次の通り。
（レポートNo確認用のログも含めています）
レポートを10件生成して一覧のテストを行い、
レポートを1件生成して表示のテスト行う場合です。

```rb:test/controller/reports_controller_test.rb
require 'test_helper'

describe ReportsController do
  describe "index" do
    before do
      report_no = FactoryGirl.build(:report_test1).report_no
      10.times do
        report = FactoryGirl.build(:report_test1)
        report.report_no = report_no.succ! #破壊的メソッドでインクリメント
        puts "[index]report no:#{report.report_no}"
        report.save
      end
    end
	
    it "10件のデータを取得できる" do
      get :index
      assert_equal 10, assigns(:reports).count
    end
  end

  describe "show" do
    before do
      report = FactoryGirl.create(:report_test1)
      puts "[show]report no:#{report.report_no}"
    end

    it "指定したレポートを取得できる" do
      get :show, id: 1

      assert_equal 'R00001', assigns(:report).report_no
    end

  end
end
```

結果は次の通りです。
showのテストで登録した1件のレポートNoが期待した値と異なっていました。
indexのテストで更新したレポートNoが残った形となっています。

```bash
$ bundle exec rake test
Run options: --seed 59117

# Running tests:

[index]report no:R00002
[index]report no:R00003
[index]report no:R00004
[index]report no:R00005
[index]report no:R00006
[index]report no:R00007
[index]report no:R00008
[index]report no:R00009
[index]report no:R00010
[index]report no:R00011
.[show]report no:R00011 // ここはR00001を期待していた
F

Finished tests in 0.097491s, 20.5147 tests/s, 20.5147 assertions/s.

  1) Failure:
ReportsController::show#test_0001_指定したレポートを取得できる [/Users/xxx/test_app/test/controllers/reports_controller_test.rb:29]:
Expected: "R00001"
  Actual: "R00011"
```

2 tests, 2 assertions, 1 failures, 0 errors, 0 skips

Factoryのベースとなるデータは使い回されていると考えると納得できます。

そうとわかれば対策は次の通りです。
最初のレポートNoを取得する部分を変更します。

```rb
report_no = FactoryGirl.build(:report_test1).report_no.dup
```

これで期待した結果となりました。

```bash
$ be rake test
Run options: --seed 21061

# Running tests:

[index]report no:R00002
[index]report no:R00003
[index]report no:R00004
[index]report no:R00005
[index]report no:R00006
[index]report no:R00007
[index]report no:R00008
[index]report no:R00009
[index]report no:R00010
[index]report no:R00011
.[show]report no:R00001
.

Finished tests in 0.089792s, 22.2737 tests/s, 22.2737 assertions/s.

2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
```
F#でPowerShellのカスタムコマンドレットを作ってみた

まずは参照設定。
System.Management.Automation.dll はGACから。
System.Configuration.Install はVisual Studio の参照マネージャのフレームワークにあるもの。

そしてこんなコードを書いてみた。

```fsharp
open System
open System.ComponentModel
open System.IO
open System.Management.Automation

type SpecifiedLinesData(data) =
    member val Data = Some(data) with get 

[<Cmdlet(VerbsCommon.Select, "SpecifiedLines", SupportsShouldProcess=true)>]
type SelectSpecifiedLinesCommand() =
    inherit PSCmdlet()

    let inputLines data file =
        match data with
        | Some(x) -> x
        | None ->
            use r = 
                if String.IsNullOrEmpty(file)
                then Console.In
                else new StreamReader(file) :> TextReader
            seq {
                while r.Peek()>= 0 do
                    yield r.ReadLine()
            }
            |> Seq.toList :> seq<string>

    let outputLines data file =
        use w = 
            if String.IsNullOrEmpty(file)
            then Console.Out
            else new StreamWriter(file) :> TextWriter
        
        for s : string in data do
            w.WriteLine(s)

    [<Parameter>]
    member val InFile = "" with get, set
    [<Parameter>]
    member val OutFile = "" with get, set
    [<Parameter(DontShow=true, ValueFromPipelineByPropertyName=true)>]
    member val Data = None with get, set
    [<Parameter(Mandatory=true)>]
    member val MaxLineLength = 0 with get, set

    override this.ProcessRecord() =
        let d =
            inputLines this.Data this.InFile
            |> Seq.filter (fun x -> x.Length <= this.MaxLineLength)
        
        outputLines d this.OutFile

        base.WriteObject(new SpecifiedLinesData(d))

[<RunInstaller(true)>]
type SelectSpecifiedLinesCmdlets() =
    inherit PSSnapIn()
    override val Name = "SelectSpecifiedLinesCmdlets" with get
    override val Vendor = "minfuk" with get
    override val Description = "Select SpecifiedLines Cmdlets" with get
```

クラスライブラリとしてビルドしてできた.dllをPowerShellに登録。
F#だからと言って特別に必要な手順もなく、普通に登録する手順(installutil の後にPowerShell上でAdd-PSSnapIn)でOKでした。 

で次のような sample.txt を作って、

```text:sample.txt
7aaaaaa
8bbbbbbb
2c
4ddd
9eeeeeeee
5ffff
3gg
6hhhhh
1
```

こんな感じで実行。

```text
Select-SpecifiedLines -InFile {sample.txtのフルパス} -MaxLineLength 7
```

すると結果は、

```text
7aaaaaa
2c
4ddd
5ffff
3gg
6hhhhh
1

Data
----
Some(Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers+mkSeq@550[System.String])
```

-MaxLineLength に指定した7文字以下の長さの行だけ抽出できた。

さらに次のようにパイプラインでつなげてみると、

```text
Select-SpecifiedLines -InFile {sample.txtのフルパス} -MaxLineLength 7 | Select-SpecifiedLines -MaxLineLength 4
```

結果は、

```text
7aaaaaa
2c
4ddd
5ffff
3gg
6hhhhh
1
2c
4ddd
3gg
1

Data
----
Some(Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers+mkSeq@550[System.String])
```

-MaxLineLength に指定した7文字以下の長さの行だけ抽出した後で、その次に-MaxLineLength に指定した4文字以下の長さの行だけ抽出できた。
ARMコンパイラの振る舞い

　本気で使う前にコンパイラの振る舞いというかクセを調べてます。

http://nora66.com/mbed/mbed-src.html#2014/05/10comp1

　constやらreadonlyやら、C/C++の言語仕様をちゃんと理解してないんで、知らないのは自分だけかも(^^;
HerokuのRailsアプリをクローンしてローカルで動作させるまでにやること（postgresqlの場合）

Railsの開発環境を構築したんだけど, 既存アプリをCloneして動かすのにどうすればいいのかわからない... というときのメモ

development環境のデータベースにpostgresqlを用いているHeroku上のRailsアプリをローカルで動作させます.

## 事前準備

### 必要なToolのインストール
とりあえずMac環境でHomebrewを使った方法を残しておきます.
とにかくRails環境と`postgresql`, `Heroku Toolblet`があればOK.

```
brew update
brew upgrade
brew install postgresql
brew install heroku-toolbelt
```

### Herokuアカウント取得
ここから[Herokuにサインイン](https://id.heroku.com/signup/www-header)

### Collaboratorとして登録してもらう
アプリのownerに自分のHerokuアカウントをCollaboratorとして登録してもらいます.
登録されていないアプリは`heroku git:clone`できません.
アプリ（例としてアプリ名を`HOGE`とします）のOwnerにさきほど登録したメールアドレスを伝えて

```
heroku sharing:add hoge@example.com --app HOGE
```

としてもらいます.


## アプリをclone & gemインストール

```bash:terminalで
# 作業DIRへ移動
cd ~/huga
# まずはログイン
heroku auth:login
# clone
heroku git:clone --app HOGE
```

とすれば`~/huga/HOGE/`にアプリの中身がやってきますので

```
cd ~/huga/HOGE
bundle install
```

としてCloneしたアプリが必要とするgemを入れます.

## postgresqlの設定

### データベース起動

```
# postgrsqlをバックグラウンドで起動
# ここでは~/.pgserver.logにログ出力させています
pg_ctl start -l ~/.pgserver.log
```

（終了する場合は`pg_ctl stop -s -m fast`です）


### データベース作成権限をもつユーザを登録
CloneしたアプリのDB設定に合わせてローカルのpostgresql環境を整えます.
設定は`config/database.yml`の`development:`以下に書かれています.

```~/huga/HOGE/config/config/database.yml
development:
  adapter: postgresql
  encoding: unicode
  pool: 5
  database: hogedb
  username: hogeac
  password: hogepass
  host: localhost
```

のような記述になっているかと思います.

`database.yml`にあるusernameをpostgresqlのユーザとして登録します.
ここで`-d`オプションを付けてデータベースの作成権限を与えることが必要になります.

```sh:terminalで
$ createuser -P -d hogeac
# ユーザ名が小文字のみで作成すると楽
# passwordとしてhogepassを入力
```

### 権限を確認するとき
`psql -l`でデータベースの一覧を確認できます.
初期状態では`postgres`, `template0`, `template1`といったデータベース名があるかと思います. どれでもいいので接続して（ここで例として`postgres`に接続します）

```
psql postgres
# postgresqlのコンソールが起動します
# ユーザを確認します
postgres=# \du
```

Role name | Attributes | Member of |
:---------|:-----------|:----------|
 fesinfo  | Create DB  | {} |


となってればOKです. Create DB権限がないと, `db:create`ができません.
コンソール終了は`\q`です.

## dbを作成

```
cd ~/huga/HOGE
rake db:create db:migrate
```

これで必要なdb（レコードなし）が構築されます.
全てのレコードをコピーする場合には[Herokuのデータベースをリストア](https://devcenter.heroku.com/articles/heroku-postgres-import-export)すればよいかと思います.

## 動作確認

```
rails server
# 別の端末を立ち上げて
open http://localhost:3000
```

## secret_tokenでエラーが出る場合

```~/hoge/config/
HOGE::Application.config.secret_token = ENV['SECRET_KEY_BASE'] || "sometoken"
```

みたいになっていたら, herokuの環境変数をsecret_tokenとして使っています.
このときは

```termnalで
export SECRET_KEY_BASE=`rake secret`
```

などで適切な環境変数を設定する必要があります.

##参考
* [Importing and Exporting Heroku Postgres Databases with PG Backups](https://devcenter.heroku.com/articles/heroku-postgres-import-export)
* [2013-01-19 15:26:14 +0900](http://journal.sooey.com/205)
SpriteKit入門 -19-


シーンの切り替え時に、アニメーションをさせるかどうかを制御できます。

SKTransitionクラスの

|プロパティ|説明|
|:---|:---|
|pausesOutgoingScene|YESなら、今のシーンのアニメーションを停止させる|
|pausesIncomingScene|YESなら、次のシーンのアニメーションを停止させる|

このようにシーンを切り替えると、pulseアクションはアニメーションありになり、次のシーンのアニメーションはなし（デフォルトYES）になります。

```objectivec:HelloScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	SKSpriteNode *spaceship = (SKSpriteNode *)[self childNodeWithName:@"spaceship"];
	if (spaceship != nil) {
		SKAction *action = [spaceship actionForKey:@"pulse"];
		if (action != nil) {
			[spaceship removeActionForKey:@"pulse"];
		}
		else {
			SKAction *fadeOut = [SKAction fadeOutWithDuration:1.0];
			SKAction *fadeIn = [SKAction fadeInWithDuration:1.0];
			SKAction *pulse = [SKAction sequence:@[fadeOut, fadeIn]];
			SKAction *pulseForever = [SKAction repeatActionForever:pulse];
			[spaceship runAction:pulseForever withKey:@"pulse"];
			SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:10.0];
			reveal.pausesOutgoingScene = NO;
			SKScene *spaceshipScene = [[SpaceshipScene alloc] initWithSize:self.size];
			[self.view presentScene:spaceshipScene transition:reveal];
		}
	}
}
```

今回はここまで。
Github で Permission denied (publickey).  と言われた時

##  Error

<pre>
$ git push -u origin master                                                                           
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
</pre>

## 解決策
GitHub の [ssh の設定] (https://github.com/settings/ssh) に公開 (~/.ssh/id_rsa.pub) を登録すればよい。
バッチファイルで、ネットワークドライブ上のパスをUNCパスへ変換

# ソース

**getunc.cmd :**

```bat
@echo off
if "%1" == "" exit /b 1
SETLOCAL
SET "D_=%~d1"
SET "P_=%~pnx1"
for /F "tokens=1,2,3" %%I in ('net use ^| findstr /I %D_%') do if "%%I" == "OK" (set "UNC=%%K" ) else ( set "UNC=%%J" )
if "%UNC%" == "" (
    echo %~dpnx1
) else (
    echo %UNC%%~pnx1
)
```

「net use」では、通常のネットワークドライブは１項目目が「OK」になるが、VMwareの共有フォルダーのように空白になる場合もあるので困ったものだ

# 使用例

```
[Z:Share]
$ net use
新しい接続は記憶されます。


ステータス  ローカル名 リモート名                ネットワーク名

-------------------------------------------------------------------------------
OK           Z:        \\127.0.0.1\c             Microsoft Windows Network
コマンドは正常に終了しました。

[Z:Share]
$ pwd
Z:\opt\Share
[Z:Share]
$ getunc .
\\127.0.0.1\c\opt\Share
```

# 他のバッチファイルから使う

```
$ type foo.cmd
@echo off
for /F %%I in ('getunc "%HOME%\BIN"') do set "BIN=%%I"
echo %BIN%
[Z:SkyDrive]
$ foo
\\Vboxsvr\c_drive\hymkor\SkyDrive\bin
```
複数のmodalを同時に閉じる方法



2つのmodalを同時に閉じたいとき、

```
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];
```

するとできました。一番深い階層のmodalを指定すると、その前のものは全て閉じることができるみたいです。
(http://stackoverflow.com/questions/8798491/dismissing-multiple-view-controllers-in-ios-5)


UIViewControllerのドキュメントにも書いてあります。
> If you present several view controllers in succession, thus building a stack of presented view controllers, calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion; any intermediate view controllers are simply removed from the stack. The top-most view is dismissed using its modal transition style, which may differ from the styles used by other view controllers lower in the stack.

(https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/dismissViewControllerAnimated:completion:)