OmniAICreator/Qiita-1.07M huggingface dataset:
Vimプラグイン初心者がスニペット機能を導入して、独自スニペットを追加できるまでの流れ


# 背景

競技プログラミングで遊んでると、使い回しが効くようなコードはスニペット機能を使って素早く挿入したくなった。
Vimプラグインはあまり使ったことがないため、インストール周りで少し手こずったのでメモ化。

# スニペットとは？

コード・スニペット。簡単に言うと定型構文を素早く挿入できる機能。
Vimでもプラグインを導入すればスニペット機能を利用できる。

この辺りを参照すると雰囲気がつかめると思う。
[VimでPHPの補完にスニペットを使ったら捗った件 - Qiita](http://qiita.com/tekkoc/items/8897cdf378305c4e547d)


# 導入手順

## プラグイン管理ツールの導入

[Shougo/neobundle.vim](https://github.com/Shougo/neobundle.vim)
Neobundleは、Vimプラグインを管理するためのプラグイン。

gitから落としてくる。

```bash:
mkdir -p ~/.vim/bundle
git clone git@github.com:Shougo/neobundle.vim.git ~/.vim/bundle/neobundle.vim
```

## スニペットプラグインの導入

[Shougo/neosnippet.vim](https://github.com/Shougo/neosnippet.vim)
NeoSnippetは、Vimでスニペット機能が使えるようになるプラグイン。

### NeoSnippetをインストール

NeoBundleを利用して、NeoSnippetを利用できるようにする。
まず、`.vimrc`に以下を追記。

```vim:.vimrc
" bundleで管理するディレクトリを指定
set runtimepath+=~/.vim/bundle/neobundle.vim/
 
call neobundle#begin(expand('~/.vim/bundle/'))
 
NeoBundleFetch 'Shougo/neobundle.vim'
 
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'Shougo/neosnippet'
NeoBundle 'Shougo/neosnippet-snippets'
 
call neobundle#end()
 
filetype plugin indent on
```

その後にvimを起動し、以下を実行。

```vim:
:NeoBundleInstall
```
そうすると、必要なプラグインがインストールされる。

この時点で、スニペットが利用できるようになった。

### スニペットを試してみる

スニペットは拡張子に合わせて設定されるので、利用したい拡張子のファイルを開いて試してみれば良い。

例えば、中身の無い`hoge.js`というファイルを作る。
`hoge.js`を開いて、「if」まで入力した状態がこれ。
![スクリーンショット 2015-02-10 16.22.07.png](https://qiita-image-store.s3.amazonaws.com/0/62874/c3cac38b-2385-e0c6-8942-9fc530b836f4.png "スクリーンショット 2015-02-10 16.22.07.png")

ここで「^K」(Control + K) を押すと、こうなる。
![スクリーンショット 2015-02-10 16.22.47.png](https://qiita-image-store.s3.amazonaws.com/0/62874/ff8562eb-ae1e-aec8-35ba-c2e8fc71c902.png "スクリーンショット 2015-02-10 16.22.47.png")


## 独自スニペットの設定

前述の設定までで、拡張子毎に基本的なスニペットは利用できるようになった。
ここから更に、自分でカスタマイズしたスニペットを利用する為の設定を行う。

### ディレクトリ設定

まず、独自スニペット用ディレクトリを指定する。
`.vimrc`に以下を追記。

```vim:.vimrc
let g:neosnippet#snippets_directory='~/.vim/bundle/neosnippet-snippets/snippets/'
```

そして、独自スニペットを適用したい拡張子のファイルをvimで開き、以下を実行する。

```vim:
:NeoSnippetEdit
```
そうすると、その拡張子に対する独自スニペットファイルが自動生成され、編集できるようになる。
(ちなみにディレクトリの設定をしないと、「snippet directory not found」といって怒られる。)

例えばJavascript用のスニペットを作成したかったら、`hoge.js`をvimで開いてから`:NeoSnippetEdit`を実行すると良い。


### スニペットの構文

各拡張子に対応するスニペットの定義ファイルが下記ディレクトリに入っているので、ここからコピペしてくるのが一番分かりやすいと思う。
`~/.vim/bundle/neosnippet-snippets/neosnippets/`

以下のページも参考になるかも。
[neosnippet.vim を活用しよう - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20131016/1381934670)

# 参考

VimでPHPの補完にスニペットを使ったら捗った件 - Qiita
http://qiita.com/tekkoc/items/8897cdf378305c4e547d 

Shougo/neobundle.vim
https://github.com/Shougo/neobundle.vim

Shougo/neosnippet.vim
https://github.com/Shougo/neosnippet.vim 

NeoBundleによるVimプラグイン管理とおすすめプラグイン - Catcher in the tech
http://catcher-in-the-tech.net/1063/

Vimのsnippetについてあまり知らなかったので設定してみたら便利過ぎてつらい - 僕のYak Shavingは終わらない
http://kazuph.hateblo.jp/entry/2012/11/28/105633 

Vimのneosnippetで自分用snippetファイルを追加したい - 300億円欲しい
http://gg-hogehoge.hatenablog.com/entry/2014/04/05/230043 

neosnippet.vim を活用しよう - C++でゲームプログラミング
http://d.hatena.ne.jp/osyo-manga/20131016/1381934670
Elixir言語で５の倍数と５のつく数字だけヒロミゴーする

## 経緯

完全に@kmagaiさんの[Go言語で５の倍数と５のつく数字だけヒロミゴーする](http://qiita.com/kmagai/items/d6091b6f7bdc721616fc)に乗っかりました。

Goではないですが、どんな言語でもヒロミゴーでエキゾチック・ジャパンなFizzBuzzして良いのでは？？？という思いです。

ルールは全く同じ。5がつく数字でExotic、5の倍数でJapan、両立したらExotic Japan。

## コード

```go.exs
defmodule ExoticJapan do
  def go!(num) when num > 0 do
    Enum.each 1..num, fn (i) ->
      IO.puts "#{i} " <> hiromi(exotic?(i), japan?(i))
    end
  end

  defp hiromi(true,   true), do: "Exotic Japan"
  defp hiromi(true,  false), do: "Exotic"
  defp hiromi(false,  true), do: "Japan"
  defp hiromi(false, false), do: ""

  defp exotic?(num), do: to_string(num) |> String.contains?("5")

  defp japan?(num), do: rem(num, 5) == 0
end

System.argv |> List.first |> String.to_integer |> ExoticJapan.go!
```

```
$ elixir go.exs 240000000
```

## 所感

`hiromi/2`が美しくない。もうちょっとどうにかならんかね。
【備忘録】Androidライブラリの探し方

[Android Arsenal](https://android-arsenal.com/)
ここでライブラリを探せる。

[jCenter](https://bintray.com/bintray/jcenter)
Mavenに登録されているライブラリの一覧（なのか？）。CPANみたいなイメージ？？
ここ登録されてれば、dependenciesで楽にパッケージ管理できる（っぽい）

*※備忘録なので、随時追記、修正予定*
*※Androidstudioでのライブラリの管理方法、jCenterへの登録方法も調べて追記する*

リンク

* build.gradle 関連
http://wasabeef.jp/android-gradle/
Swift1.2ではカリー化された関数でラベルを外せるようになった

Swiftでカリー化された関数を定義する時、Swift 1.1では以下のようにラベルを外せませんでした。

```swift
func add(a: Int)(b: Int) -> Int {
    return a + b
}

add(1)(b:2)
```

しかしSwift 1.2からは以下のようにラベルを消去できます。

```swift
func add(a: Int)(_ b: Int) -> Int {
    return a + b
}

add(1)(2)
```

非常にすっきりしました！
ラベルがあったほうが良いケースも少なからずあるかもしれませんが、
邪魔なラベルを外せて快適生活を送れそうです
VirtualBoxにCentOS7をインストールしてssh接続

## CentOSのダウンロード
[ここ](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7.0-1406-x86_64-DVD.iso)からISOイメージ[^1]をダウンロードする

## VirtualBoxで仮想マシン作成
新規(N)で仮想マシンを作成

1. 名前とオペレーティングシステム  
  - 名前(N): 適当
  - タイプ(T): Linux
  - バージョン(V): Red Hat (64 bit)
1. メモリーサイズ
  - 1024MB
1. ハードドライブ
  - 仮想ハードドライブを作成する(C)
  - ハードドライブのファイルタイプはVDIのまま
  - 物理ハードドライブにあるストレージは固定サイズ16GB 

## VirtualBoxでネットワーク設定
1. VirtualBoxの「環境設定」をクリック
 - 「ネットワーク」⇒「ホストオンリーネットワーク(H)」をクリック
 - voxnet0をダブルクリックするとIPv4アドレスがあるので控えておく
4. 仮想マシンを右クリックし設定(S)をクリック
 - ネットワークを押し「アダプター2」をクリック
     - ネットワークアダプターを有効化(E)にチェック
     - 割り当て(A): ホストオンリーアダプター
     - 名前(N): vboxnet0
 - ストレージというタブもあると思うのでそこをクリック
     - 「コントローラ:IDE」下のディスクアイコンが「空」なら最初にダウンロードしたISOイメージを読み込ませる

--------
## インストール準備
- 起動を押すとインストーラーが立ち上がりGUIでぽちぽち進めれます.
- 「ネットワークとホスト名」ではオンの状態に設定してください
- rootのパスワードとユーザの作成も設定
- インストール終わったら再起動

## ネットワークアダプタの設定
1. rootでログインしnmtuiコマンド[^2]でNetworkManager[^3]の設定をします
2. 「Edit a connection」を選択
3. 「enp0s3」(NAT)[^4]を選択
 - IPv6は無効に(Ignore)
 - 「Automatically connect」にチェック
 - 「OK」で戻る「enp0s8」(ホストオンリーアダプター)[^5]が出ていなければ一旦「Quit」で終了し下記でNetworkManagerを再起動し反映
 - ```systemctl restart NetworkManager```
7. nmtuiコマンドでNetworkManagerの設定
8. 「enp0s8」を選択
  - IPv6は無効に(Ignore)
  - 「Automatically connect」にチェック
  - IPv4は「Manual」にし右側にある「show」を選択
  - 「Addresses」に「VirtualBoxでネットワーク設定」で控えたIPv4アドレスを入れる
  - 最後の一桁(ホスト部)は下記の範囲内で使用されてないの指定
  - nnn.nnn.nn.2〜nnn.nnn.nn.254
 - 「OK」で戻り「Quit」で終了し下記でNetworkManagerを再起動し反映
 - ```systemctl restart NetworkManager```
9. ターミナルを起動し、下記で接続可能に
 - ```ssh root@nnn.nnn.nn.nnn```
 - 初めてサーバーに接続する時はサーバーから送られて来た公開鍵のフィンガープリント[^6]の値が表示されるyes/noの質問はそれが正当のものか確認
 - 無事接続し後は好きに構築します(＾o＾)/

[^1]: ディスクの中身を一つにまとめたファイル.CDやDVDと同じように扱える
[^2]: 対話的にネットワークの設定ができる.ifconfigの代わり.コマンドベースではnmcli. ipでネットワークデバイスの情報を表示
[^3]: CentOS7で推奨している.ネットワーク設定や管理に利用するツール
[^4]: 旧eth0
[^5]: 旧eth1
[^6]: 指紋の意味を持つ.改竄されてない事を証明するデータ.ssh-keygenコマンドに-lfオプションを付けると公開鍵のフィンガープリントをファイル指定して表示できる
[mailコマンド]Linuxからメールを送る


# 1. mailコマンドインストール
```sh
yum install -y mailx
```

- 必要なら`sudo`つける
- `-y`オプションは任意（付けなければ途中でyes/no選択。つけたら無条件yes）

# 2. 実際にメールを送る
送信例。

```
echo "本文" | mail -s "タイトル" -r from@example.com -c cc1@example.com -c cc2@example.com to1@example.com to2@example.com
```

- 本文は`echo "本文直書き"`もしくは`cat ファイル名`により指定
- `-s`オプション：タイトル指定
- `-r`オプション：送り主メールアドレス指定
- `-c`オプション：Ccで送るメールアドレス指定
  - Ccで複数人に送る場合　→　1件ずつ`-c`オプションで指定
- `-b`オプション：Bccで送るメールアドレス指定
  - Bccで複数人に送る場合　→　1件ずつ`-b`オプションで指定
- mailコマンドの最後の引数：送り先メールアドレス指定
  - 複数人にToで送る場合　→　半角スペース区切りでメールアドレス指定
WindowsでVirtualBox+Vagrantを使ってUbuntu14.04を動かしてRedmineをインストールしてみる。

# 参考

以下の参考サイトをほとんど引用させていただきましたので最初に載せさせていただきます。

* [Ubuntu 14.04にRedmineをインストールする手順 | 姫路のホームページ製作屋WILDWEST-SERVICE]
(http://www.wildwest-service.com/redmine_on_ubuntu1404/)
* [Windows 7マシンで、VirtualBox+Vagrantを使いUbuntu 14.04を動かす | 近藤嘉雪のプログラミング工房日誌]0
(http://blog.kondoyoshiyuki.com/2014/06/12/windows7-vagrant-ubuntu14-04/)



# VirsualBoxインストール

[VirtualBox本家サイト](https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box)からダウンロードしてインストーラを実行して、インストールを完了させてください。

# Vagrantインストール

[Vagrantサイト](http://www.vagrantup.com/downloads.html)からWindows版をインストールします。こちらもインストーラを実行してインストールします。

# OSイメージをインストール

OSイメージは[こちら](http://www.vagrantbox.es/)に公開されています。コマンドを利用してそれをインストールできます。

```
vagrant box add NAME URL
```
ubuntu14.04
```
vgrant box add ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/utopic/current/utopic-server-cloudimg-amd64-vagrant-disk1.box
```

# 仮想マシンを初期化、起動

仮想マシンの設定ファイルを置くために適当にディレクトリを作成します。そこに移動して以下のコマンドを実行します。これは先ほどNAMEに指定した名前と同じものです。

```
vagrant init ubuntu14.04
```

これでVagrantfileを作成できます。その後```vagrant up```すると仮想マシンを起動できます。

# vagrantfile

```
# config.vm.network "private_network", ip: "0.0.0.0"
```
のコメントアウトを外します。

```
vagrant halt
vagrant up
```

# SSH

vagrant upで起動したらsshして操作できます。ただWindowsだとSSHが入ってないので今回はTera Termを使いました。vagrantを起動するとHOSTやユーザ名などが表示されるのでそれを利用します。なお、パスワードはデフォルトではvagrantでした。

# Redmine環境構築

## apt-get更新

```
sudo apt-get update
```

## webサーバインストール

```
sudo apt-get install -y apache2 libapache2-mod-passenger
```

## DBインストール

```
sudo apt-get install -y mysql-server mysql-client
```

上記コマンドするとMysqlの設定画面がでるのでrootユーザのパスワードを設定します。

## Redmineインストール

```
 sudo apt-get install -y Redmine Redmine-mysql
```

Redmineてapt-getでインストールできるんですね^^;
インストールすると設定画面がでるので、いろいろ設定します。mysqlのパスワードとか。それをクリアするとインストール完了ぽいです。

## Apacheの設定

### Redmine用configfile
```
cd /etc/apache2/sites-available
sudo cp -iv 000-default.conf redmine.conf
```
でredmine.confの設定ファイルを編集します。2か所書き換えます。

```
<VirtualHost *:8000>
```

```
ServerAdmin webmaster@localhost
ServerName redmine
DocumentRoot /usr/share/redmine/public
```

### ports.confを編集

```
sudo vi /etc/apache2/ports.conf
```
１行編集
```
Listen 8000
```

### passenger.confを編集

```
sudo vi /etc/apache2/mods-available/passenger.conf
```
1行編集
```
PassenggerDefaultUser www-data
```

## Bundlerインストール

```
sudo gem install bundler
```

## Redmineに必要なGemをインストール

```
cd /usr/share/redmine/public
sudo chmod 777 /usr/share/redmine
bundler install --without development test rmagick postgresql sqlite
sudo chmod 755 /usr/share/redmine
```

## Redmine有効化

```
sudo a2ensite redmine
sudo service apache2 restart
```

これでOK！

アクセス！

http://0.0.0.0:8000/

![スクリーンショット_021115_042602_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/47886/5e78d733-39c5-776b-4ea6-50130a03581c.jpeg)
IntelXDK上でECONNREFUSEDエラーでEdisonを接続できない

今日ハマったので、ご報告までに。

EdisonをXDK上でつなぐために、接続しようとしたら、
「ECONNREFUSED」
となり接続できない現象が起こっていました。

これを回避するためには、
　Select a Device -> Add Manual Connection
を選択して、IPアドレスとポート以外の設定をする必要があります。

![スクリーンショット 2015-02-11 16.12.17.png](https://qiita-image-store.s3.amazonaws.com/0/13586/4d26377d-fd43-1527-364a-8732c8f133ad.png)

上の図のように、Use secure connection にチェックを入れて、
Edison の User Name と Password を登録します。

すると、接続が確立できます。

![スクリーンショット 2015-02-11 16.17.13.png](https://qiita-image-store.s3.amazonaws.com/0/13586/4c354dc2-1be9-3918-5034-f558b8f037af.png)

ご注意ください。
FactoryGirlとFakerを粗結合にする

FactoryGirlでテスト用のデータを作成する際には、Fakerを使うとダミーデータを投入するのに非常に便利です。

例えばこんな感じ

```user.rb
FactoryGirl.define do
  factory :user do
    email { Faker::Internet.email }
    name { Faker::Name.name }
  end
end
```

最初はこれで十分なのですが、データの数が多くなってくると、いろいろと面倒になってきます。

# なにが問題か

データがFakerに完全に依存してしまいます。追加の制約ができて、Fakerだけではそれを満たせない場合、全ての箇所について手動で書きなおす必要があります。

先ほどのコードでは、名前は英語のものが入りますが、日本語の名前にしたくなった場合、`Faker::Name.name`を使っている箇所をすべて`Faker::NameJA.name`に書きなおさなければなりません。

# 解決法

FactoryGirlのsequenceを使用して、Fakerをラップします。

```factories.rb
FactoryGirl.define do
  sequence :name { Faker::Name.name }
  sequence :email { Faker::Internet.email }
end
```

```user.rb
FactoryGirl.define
  factory :user do
    email { generate :email }
    name { generate :name }
  end
end
```

このように定義しておけばFactoriGirlとFakerが粗結合になり、Fakerが生成したデータを加工したり、Fakerから別のライブラリに乗り換える際にも、sequenceの部分を書き換えるだけでよくなります。

# 参考

- [gitlabhq/factories.rb at master · gitlabhq/gitlabhq](https://github.com/gitlabhq/gitlabhq/blob/master/spec/factories.rb)

- [RSpecにおけるFactoryGirlの使い方まとめ - Qiita](http://qiita.com/muran001/items/436fd07eba1db18ed622)
ArchlinuxにさくっとROS Indigoをインストールする

# やること

ArchlinuxにROS Indigoをインストールする。

Yaourtは導入済みってことでよろしくお願いします。

# 1.パッケージのインストール

```
yaourt -S ros-indigo-ros
yaourt -S ros-indigo-ros-comm
```

# 2.rosdepを初期化

```
sudo rosdep init
rosdep update
```

# 3.動作チェック

```
roscore
```
で、いつもどおりこんなメッセージが出ればOK

```
% roscore                                                        (git)-[master]
... logging to /home/makoto/.ros/log/70e792bc-b1bb-11e4-a6d5-0090feb70082/roslaunch-localhost-8000.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://192.168.179.3:35246/
ros_comm version 1.11.10


SUMMARY
========

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.10

NODES

auto-starting new master
process[master]: started with pid [8011]
ROS_MASTER_URI=http://192.168.179.3:11311/

setting /run_id to 70e792bc-b1bb-11e4-a6d5-0090feb70082
process[rosout-1]: started with pid [8024]
started core service [/rosout]
^C[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
```

# 備考

いちおうPython3で動かすようになってるはず

# 参考サイト
[ROS Wiki - indigo/Installaton/Arch](http://wiki.ros.org/indigo/Installation/Arch)
[Ros - ArchWiki]
(https://wiki.archlinux.org/index.php/Ros)
メモ: clojure-androidアプリ (2015/02)

http://clojure-android.info/#apps
公式にも書いてあったが、残しておく。

## ART/Lolipop対応
ソースがあるアプリもあるので、参考になる。

### 4Clojure
アプリ https://play.google.com/store/apps/details?id=org.bytopia.foreclojure
ソース https://github.com/alexander-yakushev/foreclojure-android

今メンテしてる人のアプリ

### Clojure REPL
アプリ https://play.google.com/store/apps/details?id=com.sattvik.clojure_repl

clojure-android始めた人のアプリ
http://www.deepbluelambda.org/programs/clojure-repl/

## ART/Lolipop未対応

### Figurehead (Clojure REPL)
アプリ https://play.google.com/store/apps/details?id=figurehead.ui
ソース https://github.com/pw4ever/tbnl


## ART/Lolipop対応のチュートリアル
2014年末に対応したばかりなので情報が少ない。

### Handson向けな Eventアプリ
https://github.com/alexander-yakushev/events/blob/master/tutorial.md
チュートリアルのリンクが元ブランチのままなので注意
ソース https://github.com/alexander-yakushev/events

## 参考：公式のチュートリアル
https://github.com/clojure-android/lein-droid/wiki/Tutorial

### ハマりどころ
leinのプロファイルでAndroidSDKの場所指定するときに:androidの前に:android-commonなど必要。
※lein-droidの設定が変わったらしいので注意。
https://github.com/clojure-android/lein-droid/wiki/Profiles#android-common

```clj:~/.lein/profiles.clj
{:user
 {:plugins [ [lein-droid "whatever-the-last-version-is"] ]}
 {:android-common {:android {:sdk-path "/home/user/path/to/android-sdk"
                             ;:target-sdk "15"
                            }}}}
```

## 参考文献
・公式サイト http://clojure-android.info/
・公式ブログ http://clojure-android.info/blog/
・googleグループ https://groups.google.com/forum/#!forum/clojure-android
・公式レポジトリ https://github.com/clojure-android
ソースコードの行末スペースをgitコマンドで取る

# ソースコードの行末スペース

気になる。
どうしよう。でもsedとかIDEの補助を得るようにお願いするのも面倒だよな、という場合、
**git stripspace**が使えるような気がする。

# git stripspace

git stripspaceにファイルを標準入力に与えてやると
行末スペースを削除する。

## before

```text:test.txt
hello world     

hoge
fuga       

moge    

  
```

テキストだとわかりづらいのかもしれんので、画像で。

![Screen Shot 2015-02-11 at 15.36.45.png](https://qiita-image-store.s3.amazonaws.com/0/3985/3c51b5a7-6580-dccc-c40e-5de4fd6f6057.png)

## after

git stripspace < test.txtを実行すると...

```text:test.txt
hello world

hoge
fuga

moge
```

![Screen Shot 2015-02-11 at 15.38.37.png](https://qiita-image-store.s3.amazonaws.com/0/3985/d649a073-9c75-43ac-3a88-d584c2c307c9.png)

# ファイルを上書き保存したい場合

git stripspaceは標準出力に変更内容を出す。
ファイルを上書きしたい場合、[moreutils](http://joeyh.name/code/moreutils/)にあるspongeを利用し、ファイルを上書きする。

## Mac OS Xの場合

homebrewを使えばmoreutilsをインストール可能

```
> brew install moreutils
```

## ファイルの行末スペースを削除しつつ保存

```
> git stripspace < test.txt | sponge test.txt
```

# で。

行末スペースを削除して欲しい人に実行してもらうようにお願いしよう。
ＰＨＰの勉強方法

ＰＨＰの勉強を始め、「良くわかるＰＨＰの教科書」を一通り終わらせました。
次に「パーフェクトＰＨＰ」を購入して読んでいるのですが、中々分からない部分が多く困っています。

皆さんはＰＨＰを勉強を始めたとき、どんな参考書や勉強方法で勉強されましたか？
参考にさせていただきたいので、教えてください。
pythonでsqliteにprotocol buffersを突っ込む

# ３行で
sqliteにprotocol buffersのシリアライズされたデータを突っ込みます。

1. sqliteに`blob`のカラムを作る
2. 突っ込むときは`buffer`で
3. 読み込むときは`str`で

（protobuf関係なくてただバイナリとして扱ってるだけですね）

# 例

```person.proto
message Person {
   optional string name = 1;
   optional int32 age = 2;
 }
```

```sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sqlite3
from person_pb2 import Person


if __name__ == '__main__':
    # データベースへの接続とデーブルの作成
    conn = sqlite3.connect(":memory:")
    c = conn.cursor()
    c.execute("create table people (person blob)")

    p = Person(name="John Doe", age=128)
    print p

    # 書き込み
    wb = buffer(p.SerializeToString())
    c.execute("insert into people values (?)", [wb])

    # 読み込み
    c.execute("select * from people")
    rb = c.fetchone()[0]
    q = Person()
    q.ParseFromString(str(rb))
    print q
```

## 結果
```
name: "John Doe"                                      
age: 128                                              
                                                      
name: "John Doe"                                      
age: 128
```

読み書きできました。
Go言語で５の倍数と５のつく数字だけヒロミゴーする

# 経緯
最近Goのプロジェクトに間接的に関わっている。

自分はほとんどGo書かないのだけれど、楽しそうだし、Goは非常にロックだと聞いているし入門することにした。

Goといえばやっぱりヒロミゴーなのは2億4千万人の間でコンセンサスがとれていると思うので、エキゾチック・ジャパンなFizzBuzzを書いた。

5がつく数字で「Exotic」、５の倍数で「Japan」、両立したら「Exotic Japan」するようになっている。

# こんな感じ

![Screenshot 2015-02-11 13.51.45.png](https://qiita-image-store.s3.amazonaws.com/0/48697/579d46e3-0917-b73f-a791-302a4919e1f2.png)

ヒロミゴー的なロックを求めるならばやっぱり2億5千万で行きましょう。

```
Enter integer: 250000000
```

# コード

コードはこんな感じになった。

``` hiromi.go
package main

import (
	"fmt"
	"strconv"
)

func main() {

	fmt.Print("Enter integer: ")
	var input int
	fmt.Scanf("%d", &input)

	for i := 1; i <= input; i++ {
		fizzbuzz(i)
	}
}

func isFiveIncluded(num int) bool {
	var strInt = strconv.Itoa(num)
	for k := 0; k < len([]rune(strInt)); k++ {
		if '5' == strInt[k] {
			return true
		}
	}
	return false
}

func fizzbuzz(i int) {
	exotic := "Exotic"
	japan := "Japan"

	if isFiveIncluded(i) && i%5 == 0 {
		fmt.Println(i, exotic+" "+japan)
	} else if isFiveIncluded(i) {
		fmt.Println(i, exotic)
	} else if i%5 == 0 {
		fmt.Println(i, japan)
	} else {
		fmt.Println(i)
	}
}
```

コードはGitHubにあるよ。
[kmagai/hiromigo-in-golang](https://github.com/kmagai/hiromigo-in-golang)
小さなお友だちの為の　MacOsXでBASIC #10 媒介変数を使ってアステロイド


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#媒介変数によるアステロイド曲線
媒介変数を用いると、アステロイド曲線は
x=r*cosθ
y=r*sinθ
となります。
プログラムとしては、以下のコード
教科書的にはpi/180なんだけど、ちょっと粗いのでpi/1800にして描画しています。

##10.BAS
```bas:10.BAS
10 SET WINDOW -8,8,-8,8
20 DRAW GRID
30 FOR t=0 TO 8*PI STEP PI/1800
40    LET r=8
50    PLOT LINES: r*(COS(t)^3) , r*(sin(t)^3)
60 NEXT t
70 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-11 14.17.43.png](https://qiita-image-store.s3.amazonaws.com/0/33317/83f4d987-213c-1725-d166-4358289f40c5.png "スクリーンショット 2015-02-11 14.17.43.png")
小さなお友だちの為の　MacOsXでBASIC #9 媒介変数を使ってインボリュート


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#媒介変数によるインボリュート曲線
媒介変数を用いると、インボリュート曲線は
x=a(cosθ+θsinθ)
y=a(sinθ−θcosθ)
となります。
プログラムとしては、以下のコード
教科書的にはpi/180なんだけど、ちょっと粗いのでpi/1800にして描画しています。

##09.BAS
```bas:09.BAS
10 SET WINDOW -8,8,-8,8
20 DRAW GRID
30 FOR t=0 TO 8*PI STEP PI/1800
40    LET r=0.3
50    PLOT LINES: r*(COS(t) + t * SIN(t)), r*(SIN(t) - t * COS(t))
60 NEXT t
70 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-11 13.58.47.png](https://qiita-image-store.s3.amazonaws.com/0/33317/cf4747cf-36d6-edf2-0eaf-8132c3d7f6d4.png "スクリーンショット 2015-02-11 13.58.47.png")
Windows環境でGitを高速化する

Windowsでmsysgit(Git Bash)を使っていてサイズの大きいリポジトリ（数GBとか）を使用していると

```shell-session
$ git status
```

```shell-session
$ git pull/fetch
```

などにすごく時間がかかる、ということがあります。
いろいろ調べて、ある程度は改善できたので、メモ。

## preloadindex 設定

[こちら](http://qiita.com/akihiroy/items/42ff4cd12cb8670920e7)を元に

```sh:preloadindex
$ git config --global core.preloadindex true
```

を設定すると、少し早くなりました。このオプションを指定すると、ファイル、インデックスの比較を並列実行してくれるようです。

### 2018-11-13追記

Git 2.1.0からこの設定はデフォルトで`true`になったようです。

[2.1.0.txt\RelNotes\Documentation - git.git - The core git plumbing](https://git.kernel.org/pub/scm/git/git.git/tree/Documentation/RelNotes/2.1.0.txt)

## fscache設定

[こちら](http://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/22208863#22208863)を元に

```fscache
$ git config --global core.fscache true
```

を設定すると、数十秒かかっていた ```git status``` が2~3秒くらいになりました :smile:

### 2018-11-13追記

Git for Windows 2.8ではこの設定は[デフォルトで有効](https://stackoverflow.com/a/24045966/8198583)になったようです。
他の方法でインストールした場合は未だ必要かもしれません。

---

# 参考

- http://stackoverflow.com/questions/4994772/ways-to-improve-git-status-performance
- http://stackoverflow.com/questions/3055506/git-is-very-very-slow
- http://stackoverflow.com/questions/3313908/git-is-really-slow-for-100-000-objects-any-fixes
- http://stackoverflow.com/questions/1183769/git-status-takes-a-long-time-to-complete
- http://stackoverflow.com/questions/3313908/git-is-really-slow-for-100-000-objects-any-fixes
- http://sourceforge.jp/magazine/09/03/16/0831212/2
- http://weble.org/2012/05/16/git-is-really-slow
- http://www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/chunked/ch07.html
- http://techracho.bpsinc.jp/baba/2012_05_22/5594
- http://qiita.com/akihiroy/items/42ff4cd12cb8670920e7
- https://gist.github.com/emanuelez/1758346
- http://comments.gmane.org/gmane.comp.version-control.git/189776
.
pacmanでパッケージをワイルドカードで抜き出す方法もどき

# なによこれ？
pacmanからインストール済みパッケージを検索して、`pacman -Rns`で一括削除できるように変形する。

# なんでまた。

1. Archで間違えて大量のパッケージ群をインストールしちゃった。
2. pacmanでワイルドカードって使えたっけ→×
3. ゴリゴリした。

# やったこと

```
pacman -Qs ros-indigo* | awk 'match($0, /ros-indigo/) {print substr($0, RSTART)}' | awk '{print ($1)}' | awk -F\n -v ORS=' ' '{print}'
```

これで、削除対象のパッケージが空白区切りで取り出せるはず（awkあんまり使ったこと無いから凄まじく汚い…）

もっといい方法あったら教えていただけると喜びます。
capybara-webkit 実行時のログをコンソールに出力させない

:stdout を nil にしてドライバーを再登録すれば良い

```ruby
Capybara.register_driver :webkit do |app|
    Capybara::Webkit::Driver.new(app, :stdout => nil)
end

Capybara.current_driver = :webkit_silent
Capybara.javascript_driver = :webkit_silent
```
Wordpressのローカル開発環境をVagrantでMacに構築する

Mac OS X Yosemite 10.10.1

## Homebrewを利用して、環境を構築する。
[MacにHomebrewをインストールする](http://qiita.com/_daisuke/items/d3b2477d15ed2611a058)

## homebrew-caskのインストール

```
brew install caskroom/cask/brew-cask
```

## VirtualboxとVagrantのインストール
```
brew cask install virtualbox
brew cask install vagrant
```

## vagrant-hostsupdaterのインストール
```
vagrant plugin install vagrant-hostsupdater
```

## VCCWのインストール
```
git clone https://github.com/vccw-team/vccw.git
cd vccw
vagrant up
```

## ブラウザで表示
http://wordpress.local

管理画面
http://wordpress.local/wp-admin/
id : admin
pass : admin

ファイルの中身
vccw/www/wordpres

## 参考
[Homebrew cask](http://caskroom.io/)
[VCCW](http://vccw.cc/)
Wordpressでサブディレクトリでマルチサイト化したけど色々大変だった件

# Wordpressでサブディレクトリでマルチサイト化したけど色々大変だった件

Wordpressでマルチサイト化する方法として、サブドメインで分ける方法とサブディレクトリで分ける方法ありますよね。
今回サブディレクトリする中で色々と大変だったのでメモします。
（ちなみに人に頼まれてサブディレクトリ化してますが、個人的にはサブドメインの方が好きです）

あと、基本的な事ですが**設定を変更する際には必ず、データベースとファイルの両方のバックアップをとりましょう！** 
バックアップの取り方が分からない人は[この記事](http://viral-community.com/wordpress/wordpress-backup-5336/)が参考になりますよ。

　
## トラブルその１：ネットワークインストール時にサブディレクトリの選択ができない

サブディレクトリ化しいく流れとして、`wp-config.php`を変更して、管理画面＞ツール＞ネットワーク設置を選択して、ネットワークをインストールするかと思いますが、その時に「サブドメインへのインストール」にこんな表示がでました。

![スクリーンショット 2015-02-11 12.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/57442/7116a0c2-50ad-ab5f-977c-2a80f2c5f595.png)

> 新規インストールではないため、Wordpressネットワーク内のサイトはサブドメインを使う必要があります。メインサイトをサブディレクトリにインストールしている場合、修正したパーマリンク構造を使う必要があり、現存リンクを壊してしまう可能性があります。

な、なんだって〜！（てんやわんや）
[この記事](https://ja.forums.wordpress.org/topic/4391)によると、Wordpressの仕様という事だそうです。

> 次の場合にはサブディレクトリ型インストールを選べません。
WordPressを設置してから1ヶ月以上経っている場合。既存のパーマリンク構造に問題が生じるため。（この問題は今後のバージョンで修正される見込みです。See Switching between subdomains and subfolders for more information.）

### 解決方法

という事でサブディレクトリ化するためには、1ヶ月以前の投稿を０にすればいいわけです。
ただ、管理画面から削除しただけではデータベースに残ったままになるので、phpMyAdminかなんかで直接SQLを実行します。

```sql
SELECT * FROM wp{prefix}_posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish'
```

ここで抽出されたレコードが1ヶ月前の投稿データです。
こやつらの`post_date`と`post_date_gmt`を変更します。（とりあえず本日の日付にしてます）


```sql
UPDATE wp{prefix}_posts SET post_date = DATE(NOW()), post_date_gmt = DATE(NOW()) WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish';
```

はい。これで問題なくサブディレクトリへのインストールが選択できるようになりました。

　
## トラブルその２：.htaccessでリダイレクトしているとサイトの新規追加ができない。

まぁ、無事にサブディレクトリがインストール出来て、平和が訪れたと思っていたわけですよ。
せっかくマルチサイト化したので、元気良くサイトを新規追加しようとしたらですね、以下の画面が出たとです。

![スクリーンショット 2015-02-11 12.47.09.png](https://qiita-image-store.s3.amazonaws.com/0/57442/a4305260-c783-8981-67a1-6cc0918440d2.png)

「本当に実行していいですか？」じゃねーよ。速やかに且つ安全に実行しなさいよ。
「もう一度お試しください」を押しても管理画面トップに戻るだけで、サイトが追加できない。ホント束の間の休息でしたよ。

### 解決方法

色々調査してたら、どうも`.htaccess`ファイルに原因があるっぽい。
`.htaccess`の中でホームにアクセスした際にURLに`www`を付け足すように、リダイレクト処理が入っていました。（通常はリダイレクト処理は入っていません。意図的に入れてあるものです）

```.htaccess
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_HOST} ^{サイトのURL}
RewriteRule ^(.*) http://www.{サイトのURL}/$1 [R=301,L]
</IfModule>
```

この処理を取り除き、さらにデータベースの`wp{prefix}_options`テーブル内の`siteurl`と`home`の値にも`www`が入ってたのでそれも取り除きます。

そうすると、問題なくサイトの新規追加が出来るようになりました。疲れました。

その代わり、リダイレクト処理を削除したので`http://www.~.jp`ではなく、`http://~.jp`にURLが変わってしまいますけど。というか、今はもうwwwっていらないよね。

という事で色々と奮闘した結果、問題なくサブディレクトリ化ができましたとさ。


ただ、リダイレクト処理が入っているとサイト新規追加時に正常動作しない原因だけ分かってないので、どなたかご存知でしたら教えてください。
Jersey 1.x系では、java8のラムダが使えない


以前自分のブログにも書いたのだけど、情報共有ということで、こちらにも再アップ。
タイトル通りで、Jersey 1.x系で、java8のラムダを使うと、例外が発生して動作しない。
Jerseyを2.x系にバージョンアップすると直ります。変なエラーが出まくって悩んでしまった。

[stackoverflowの質問](http://stackoverflow.com/questions/22917462/java-8-lambda-expression-within-rest-service-not-working)
小さなお友だちの為の　MacOsXでBASIC #8 媒介変数を使ってサイクロイド


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#媒介変数によるサイクロイド
媒介変数を用いると、サイクロイド曲線は
x=r*(tーsin(t))
y=r*(1-cos(t))
となります。
教科書的にはpi/180なんだけど、ちょっと粗いのでpi/1800にして描画しています。

##08.BAS
```bas:08.BAS
10 SET WINDOW -8,8,-8,8
20 DRAW GRID
30 FOR t=0 TO 2*pi STEP pi/180
40    LET r=1
50    PLOT LINES: r*(t-sin(t)), r*(1-r*cos(t))
60 NEXT t
70 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-11 12.09.53.png](https://qiita-image-store.s3.amazonaws.com/0/33317/b94efa25-4c04-9927-8a05-85fd7b464691.png "スクリーンショット 2015-02-11 12.09.53.png")
nodeデバッグコマンド


|コマンド名 | 説明|
|---------|--------|
|cont、c | 実行を再開する
|next、n | 次の命令を実行して一時停止する（ステップ実行）
|step、s | 次の関数の先頭で一時停止する（ステップイン）
|out、o | 実行中関数から抜けるまで実行して一時停止する（ステップアウト）
|pause | コードの実行を一時停止する
|setBreakpoint()、sb() | ブレークポイントを設定する
|clearBreakpoint()、cb() | ブレークポイントを解除する
|backtrace、bt | バックトレースを表示する
|list(number) | 次に実行する命令の前後のソースコードをnumber引数で指定した行数ずつ表示する
|watch(expr) | expr引数で指定した式をウォッチする
|unwatch(expr) | expr引数で指定した式のウォッチを解除する
|watcher | ウォッチしている式とその値を一覧表示する
|repl | replを開始する
|run | プログラムの実行を開始する
|restart | プログラムを先頭から再実行する
|kill | スクリプトの実行を強制終了（KILL）する
|scripts | ロードされているスクリプトを一覧表示する
|version | V8のバージョンを表示する
小さなお友だちの為の　MacOsXでBASIC #7 媒介変数を使って円を描画


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#媒介変数による円の描画
媒介変数を用いると、円は
x=r*cos(t)
y=r*sint(t)
となります。
後はr,ｔを与えれば描画できるのです。
教科書的にはpi/180なんだけど、ちょっと粗いのでpi/1800にして描画しています。

##07.BAS
```basic:07.BAS
10 SET WINDOW -8,8,-8,8
20 DRAW GRID
30 FOR t=0 TO 2*pi STEP pi/1800
40    LET r=8
50    PLOT LINES: r*COS(t), 0.3 * r*SIN(t)
60 NEXT t
70 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-11 11.47.17.png](https://qiita-image-store.s3.amazonaws.com/0/33317/eaca5e4a-5396-c9b4-6b7c-ea64382bb223.png "スクリーンショット 2015-02-11 11.47.17.png")
Windowsでsshコマンドを使う方法

#はじめに

windowsでChef+Vagrantを利用する上で、「ssh ホスト名」のような形で接続が出来るようにしたい。
sshコマンドを利用する場合、Cygwinのインストールが必要だと思っていたのですが、MSYSのmsys-opensshで実現可能なようなので、設定手順を備忘のために記載します。


#MSYSのインストール
インストールの手順は参考のサイトに詳しく書いてあります。
インストール後、PATHを通せばコマンドプロンプト等からsshコマンドが使えるようになります。

##手順
1. mingw-get-setup.exeをインストールする。
2. GUIの操作画面が出たらインストールしたいパッケージ(msys-openssl)のチェックボックスを選択し、メニューバーの[Insallation]≫[Apply Changes]を実施する。
3. インストールが完了したら、｢C:\MinGW\msys\1.0\bin｣をPATHを追加する。

## 参考
[MinGW - Minimalist GNU for Windows]
http://sourceforge.net/projects/mingw/?source=typ_redirect
[MinGWの手順]
http://heroween.hateblo.jp/entry/2014/06/06/203440

# .ssh/configの設定
Linuxでは悩まない.ssh/configを何処に置けばいいのか。
何処がmsys-opensshのホームディレクトリとして扱われるのか悩みました。

## 手順
1. 環境変数HOMEを指定する。
> HOME=C:\Users\mekagazira-m

2. コマンドプロンプトでVagrantfileの格納されているフォルダに移動して、以下のコマンドを実行する。
> vagrant ssh-config --host ホスト名(任意) >> %HOME%/.ssh/config

3. configファイルの確認
> cd %HOME%/.ssh
> type config
>　Host ホスト名
>　　HostName 127.0.0.1
>　　User vagrant
>　　Port 2222
>　　UserKnownHostsFile /dev/null
>　　StrictHostKeyChecking no
>　　PasswordAuthentication no
>　　IdentityFile C:/Users/mekagazira-m/.vagrant.d/insecure_private_key
>　　IdentitiesOnly yes
>　　LogLevel FATAL
4. sshでの接続確認をする。
> ssh ホスト名
Vagrant+CentOS7+Fabric+Docker

| 2015/03/21更新：ベースのBOXファイルを変更しました。

VagrantでCentOS7上のDockerを動かします。

# BOXファイル

CentOS7 64bitのBOXファイルをダウンロードします。
refs: http://packages.vstone.eu/vagrant-boxes/boxes/

バージョンとディスクサイズはこんな感じです。rubyとpuppetも入っています。

```
# uname -a
Linux centos7-64bit.vagrantup.com 3.10.0-123.4.2.el7.x86_64 #1 SMP Mon Jun 30 16:09:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)

# df
Filesystem                                         1K-blocks      Used Available Use% Mounted on
/dev/mapper/centos_centos7--64bit-root              40430856   1358876  36995104   4% /
```

起動します。

```
vagrant box add centos7 centos-7.x-64bit-puppet-3.x-vbox.4.3.14-1.box
vagrant init centos7
vagrant up
```

起動に失敗します。USBドライバで失敗しているようです。
Oracle VM VirtualBoxマネージャを起動し、対象の仮想マシンのUSBを無効にします。

# Vagrantfileを編集する

IPアドレスを設定します。（ご自由に）

```
  config.vm.network "private_network", ip: "192.168.33.10"
```

SMBを設定します。（CentOS7ではVirtualBoxの共有フォルダを使うのにトラブルのでSMBを使います）

```
  config.vm.synced_folder ".", "/vagrant_smb", type: "smb"
```

メモリを2Gにします。（ご自由に）

```
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "1"]
  end
```

必要ならproxyを設定します。vagrant-proxyconfプラグインを入れておきましょう。

```
  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http     = "http://xxxx/"
    config.proxy.https    = "http://xxxx/"
    config.proxy.no_proxy = "xxxx"
  end
```

# 初期設定

管理者として実行したGit Bashからvagrant upで起動して、vagrant sshやteratermでログインします。
(refs: http://qiita.com/yhiranoo/items/1000ad7972b101199f0f)

update & docker & fabric
> 以下をコピペします。

```
yum -y update
yum install -y docker
systemctl enable docker
systemctl start docker
yum -y install python-devel
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install fabric
```

サービスとして登録されているかどうかは、以下で見られます。

```
systemctl list-unit-files
```

## おまけ：JDK8 & maven & sphinx

```
rpm -ivh jdk-8u31-linux-x64.rpm
tar xvfz apache-maven-3.2.5-bin.tar.gz
mv apache-maven-3.2.5 /opt/
echo 'export M3_HOME=/opt/apache-maven-3.2.5
M3=$M3_HOME/bin
export PATH=$M3:$PATH
' >> ~/.bash_profile
source ~/.bash_profile
easy_install sphinx
```

# BOXファイルにする

作成した環境をbox化しておきます。
(refs: http://success.tracpath.com/blog/2013/12/18/vagrant%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0box%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E9%85%8D%E5%B8%83/)

```
vagrant halt
vagrant package --base `cat .vagrant/machines/default/virtualbox/id` --output centos7docker.box
```

# SMBのための設定

SMBを使っていると、コンソールが応答しない現象が発生することがあります。
それを防ぐために、以下を設定します。
それでも発生した場合には、vagrant reloadします。

管理者モードのGit Bashで以下を実行します。

```
net config server /autodisconnect:-1
```

イーサネットのネットワークドライバの詳細設定で、"Receive Side Scaling"を"Disabled"にします。
refs: http://helpful-info.mkstyle.net/etc/windows7-network.html
Rubyで半角スペースに正規表現がマッチしない

[参考: 半角スペースが消せない（Ruby）](http://an.fty.jp/archives/blog/77/)

HTMLから抽出した情報を加工するときなどに、半角スペースを削除したいが削除できないことがある。

多くの場合、`&nbsp;`の文字に正規表現がマッチしない

```rb
content.gsub(/(\xc2\xa0)+/, '')

# 通常の半角スペースも削除
content.gsub(/(\xc2\xa0|\s)+/, '')
```

他にも全角スペースや、特殊文字が含まれているケースもあるかもしれない
Rubyのバージョンによっても動きが違うケースがあるかもしれない

`ruby "\xc2\xa0"`でググると良い
jQueryStepsで対話型のUIを簡単に実装する



# やりたいこと

jQueryStepsを用いてページロードせずに非同期で進む、以下のようなウィザード形式のUIを実現する。

jQuerySteps
http://www.jquery-steps.com/

![kobito.1423620896.699851.png](https://qiita-image-store.s3.amazonaws.com/0/18614/92cef6b6-86d0-12e2-1991-72681d1d152c.png "kobito.1423620896.699851.png")


# 準備

## 必要なファイルをダウンロード
[こちらのページ](http://www.jquery-steps.com/GettingStarted)から[Download source]をクリック。

![スクリーンショット 2015-02-11 11.20.03.png](https://qiita-image-store.s3.amazonaws.com/0/18614/152235f2-6506-899a-70ed-cfd8251b4235.png "スクリーンショット 2015-02-11 11.20.03.png")


### 使うファイル

- jquery.steps.css
- normalize.css
- main.css
- jquery.steps.min.js

# 実装


## headで必要なファイルを読み込む


jQueryの本体も読み込む。

```html:index.html
	<link rel="stylesheet" href="/css/jquery.steps/jquery.steps.css"> 
	<link rel="stylesheet" href="/css/jquery.steps/normalize.css"> 
	<link rel="stylesheet" href="/css/jquery.steps/main.css"> 
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
	<script src="/js/libs/jquery.steps.min.js"></script>

```

## 対話型のHTMLの部分

```html:index.html
<div id="example-basic">
    <h3>質問１</h3>
    <section>
        <p>ほげほげほげ？</p>
        <textarea name="q1" id="" cols="30" rows="3"></textarea>
    </section>
    <h3>質問２</h3>
    <section>
        <p>ふがふがふが？</p>
        <textarea name="q2" id="" cols="30" rows="3"></textarea>
    </section>
    <h3>質問３</h3>
    <section>
        <p>ぴよぴよぴよ？</p>
        <textarea name="q3" id="" cols="30" rows="3"></textarea>
    </section>
</div>
```


## JavaScriptの部分

主にオプションを設定する。[オプション一覧はこちら](https://github.com/rstaib/jquery-steps/wiki/Settings)。

```javascript:index.html
	$("#example-basic").steps({
	    headerTag: "h3",
	    bodyTag: "section",
	    transitionEffect: "slideLeft",
	    autoFocus: true, 
	    titleTemplate: "#title#", 
	    labels: {
	    	next: "次へ", 
	    	previous: "戻る", 
	    	finish: "完了！"
	    }
	});
```


## ファイル全体

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>steps</title>
	<link rel="stylesheet" href="/css/jquery.steps/jquery.steps.css"> 
	<link rel="stylesheet" href="/css/jquery.steps/normalize.css"> 
	<link rel="stylesheet" href="/css/jquery.steps/main.css"> 
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
	<script src="/js/libs/jquery.steps.min.js"></script>
</head>
<body>
<div id="example-basic">
    <h3>質問１</h3>
    <section>
        <p>ほげほげほげ？</p>
        <textarea name="q1" id="" cols="30" rows="3"></textarea>
    </section>
    <h3>質問２</h3>
    <section>
        <p>ふがふがふが？</p>
        <textarea name="q2" id="" cols="30" rows="3"></textarea>
    </section>
    <h3>質問３</h3>
    <section>
        <p>ぴよぴよぴよ？</p>
        <textarea name="q3" id="" cols="30" rows="3"></textarea>
    </section>
</div>
    <script>
	$("#example-basic").steps({
	    headerTag: "h3",
	    bodyTag: "section",
	    transitionEffect: "slideLeft",
	    autoFocus: true, 
	    titleTemplate: "#title#", 
	    labels: {
	    	next: "次へ", 
	    	previous: "戻る", 
	    	finish: "完了！"
	    }
	});
    </script>
</body>
</html>
```

以上。
vcrでレコーディング時かカセットからの再生かを判断して処理を変える

[参考: How to check if VCR uses the cassette or is recording](https://groups.google.com/forum/#!topic/vcr-ruby/_xqQ2vFrq5w)

ユースケースとしては

- HTTP通信発生時(録画時)のみ処理を加える
  - 通信先への負荷を調整 (sleepする)
  - リクエストの内容を覗く (ログ出力)

方法はvcrのモンキーパッチか`before_record`フック

## 録画時の処理をモンキーパッチする

https://gist.github.com/myronmarston/1246883

この方法はHTTP通信発生時(録画時)のみ呼ばれる

まず、ファイルの置き場所に困るが、個人的にはspec配下にsupportというディレクトリを作りそこに置いている

spec_helper.rb, rails_helper.rb から読み込む

```rb:spec_helper.rb
Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f}
```

### sleep する

```rb:vcr_monkey_patch.rb
def VCR.record_http_interaction(interaction)
  super
  sleep 5
end
```

### リクエストの内容を覗く(ログ出力)

```rb:vcr_monkey_patch.rb
def VCR.record_http_interaction(interaction)
  super
  puts "#{interaction.request.to_hash}"
end
```

sleepして、URLをログする

```rb
def VCR.record_http_interaction(interaction)
  super
  unless interaction.request.uri =~ /localhost/ || interaction.request.uri =~ /127\.0\.0\.1/
    print "#{interaction.request.uri} "
    puts "Sleeping..."
    sleep 2
  end
end

```

留意点として、Selenium使用時に余計なログが出た
urlのパターンとしては`/hub/session/`や`__identity__`などがあった

それらのログを無視する場合は特定のパターンで`puts`をとばす

```rb
puts "..." unless interaction.request.to_hash["uri"] =~ %r{/session}

# OR
puts "..." unless ["/session", "/__identity__"].any?{|pattern| interaction.request.to_hash["uri"] =~ %r{#{pattern}} }
```

Example of log of Chrome

- `"uri"=>"http://127.0.0.1:9515/session/a5ac957aabc15a2114f2fefca3165258/element/...`
- `"uri"=>"http://127.0.0.1:9515/session"`
- `"uri"=>"http://127.0.0.1:49378/__identify__"`


## 録画時のフックを使う

https://gist.github.com/myronmarston/1246871

`VCR.config do |c|` -> `c.before_record do |i|`

## その他vcr関連TIPS

http://qiita.com/quattro_4/items/6d966d6d59eb7bb8ec08
【Laravel】make系コマンドで作成したクラスのインデントをスペースにする

追記：
@ytake さんがgulpを使った解決方法を書かれています。とても参考になります。
http://blog.comnect.jp.net/blog/120

-------------------------------------

Laravelのmakeコマンド便利ですよね。
コマンド１発でControllerでもCommandでもクラスのひな形を作ってくれます。

でも、出来上がったクラスを見てみるとインデントはタブなんですよね。
個人のプロダクトなら気にするほどの事じゃないんですが、仕事で使うとなるとコーディング規約という壁が立ちはだかるのでどうしてもスペースに統一したりする必要があります。

という事で以下の変更を加えてmakeコマンドで作られたクラスのインデントを半角スペース4つにしてみました。

```php
<?php namespace Illuminate\Console;

use Illuminate\Filesystem\Filesystem;
use Symfony\Component\Console\Input\InputArgument;

abstract class GeneratorCommand extends Command {

	・
	・
	・

	/**
	 * Build the class with the given name.
	 *
	 * @param  string  $name
	 * @return string
	 */
	protected function buildClass($name)
	{
		$stub = $this->files->get($this->getStub());

		// replaceIndent($stub)を追加
		return $this->replaceIndent($stub)->replaceNamespace($stub, $name)->replaceClass($stub, $name);
	}

	/**
	 * Replace the indend
	 * このメソッドは追加
	 *
	 * @return $this
	 */
	protected function replaceIndent(&$stub)
	{
		$stub = str_replace("\t", '    ', $stub);

		return $this;
	}

```

でもこれだとIlluminateのクラス書き換えちゃうから別環境でinstallした時に消えてしまう。
それに、ホントはコマンド叩く時にオプションで好きなインデントを指定出来るようにしたかった。
という事でこれはかなりその場しのぎ、あとで時間がある時にちゃんとしたの作ってみよう。。。
Ubuntu14.04にSublime Text3をインストール

# Sublime Text3をインストール
参考: [Ubuntu12.04にSublimeText2のインストールと日本語入力設定](http://qiita.com/kanpou_/items/bc739c1215fc222f17c8)

以下のコマンドを叩く

```
$ sudo add-apt-repository ppa:webupd8team/sublime-text-3
$ sudo apt-get update
$ sudo apt-get install sublime-text
```

## Sublime TextにPackageControlをインストール

ctrl+shift+@で表示されるコンソールから以下を入力する

```
import urllib.request,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
```

## Sublime Textの日本語入力化

### emacs-mozcをインストール
Mozcは既にインストール済でしたので、emacs-mozcのみインストール
```
$ sudo apt-get install -y emacs-mozc
```

### リポジトリを追加
ctrl+shift+pから「Package Controle: Add Repository」を選択する。
https://github.com/yasuyuky/SublimeMozcInput
を入力し、追加する。

ctrl+\で英語入力/日本語入力を切換え
Rubyのブロックつらい問題を解決する暗黙のブロックパラメータ

## Rubyのブロックつらい問題

Rubyで素直なコードを書くと、こういうことがよく起こります。

```rb
%w`foo bar baz`.map{|it| it.upcase }
#=> ["FOO", "BAR", "BAZ"]
```

それぞれの要素に対して`upcase`を適用する、ただそれだけのために`it`を2回も記述しなければなりません。Rubyはブロックを多用する言語なのでこの様なコードを書く機会が多く、やがてあなたは辟易するはずです。

上記の例では`map(&:upcase)`と書き直すことができますが、ブロックを使用しない方向に進んでしまうと、少しでも処理が複雑になると破綻してしまいます。詳しくは[ブロックなしRubyをやろうとすると関数型プログラ…うーんリストプロセッ、えーと感じ感じ](http://qiita.com/supermomonga/items/f22dbe021a8e79d55322)を参照してください。

Procを拡張しよう、ということでおもむろに[lambda_driver](https://github.com/yuroyoro/lambda_driver)をインストールするのも良いですが、今回はブロックそのもの（ブロックを取り扱うメソッドそのもの）を拡張する形でこれの解決を図りましょう。

参考になる例として、ClojureやScalaでは暗黙のパラメータ（プレースホルダ）を導入することでこの問題を上手く解決しています。

```map.rb
(1..10).map{|_| _ * 10}
#=> [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
```

```map.scala
1.to(10).map(_ * 10)
//=> scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
```

```map.clj
(map #(* % 10) (range 1 10))
;=> (10 20 30 40 50 60 70 80 90)
```

## やる

そこで、Rubyの`Array#map`、`Array#select`にも暗黙のブロックパラメータ（プレースホルダ）の仕組みを導入してみました。

```placeholder.rb
module PlaceHolder
  refine Array do
    prepend (
      Module.new do
        lambda {|*args, &block|
          if block && block.parameters.size == 0
            super() do |(*args)|
              Object.new.instance_eval do
                define_singleton_method(:_) { args[0] }
                args.size.times do |i|
                  define_singleton_method("_#{i + 1}") { args[i] }
                end
                instance_eval &block
              end
            end
          else
            super()
          end
        }.tap {|it|
          %i[ map select ].each do |method|
            define_method method, it
          end
        }
      end
    )
  end
end
```

それでは実際に使ってみましょう。

```sample.rb
using PlaceHolder

## map
p [1,2,3].map{_ * 10}
#=> [10, 20, 30]
p [[1,20],[2,30]].map{_1 + _2 + 100}
#=> [121, 132]
p [1,2,3].map
#=> #<Enumerator: [1, 2, 3]:map>
p [1,2,3].map{|m| m + 10}
#=> [11, 12, 13]

## select
p [1,2,3].select{ _ % 2 == 1 }
#=> [1, 3]
p [[1,20],[2,30]].select{ (_1 + _2) % 2 == 0 }
#=> [[2, 30]]
```

いいですね。`_`は常に1つ目のパラメータ、`_n`はn番目のパラメータを表します。もしブロックに明示的にパラメータを記述した場合やそもそもブロックが渡されなかった場合はプレースホルダを無効化しています。

## まとめ

便利
weak宣言するときに型指定をしない方法

##weak宣言
Block構文を使うとき、不測のメモリリーク(循環参照とか)を避けるために、基本的には `__weak AppDelegate *wself = self;`なんて宣言をした上で、Block内で self の代わりに wself を使うなんて事をよくやりますね。

この時、この一連の処理を他のクラスにコピーする際に、この AppDelegate 型を宣言しているのが、障壁になるわけです。例えば AppDelegate 内にあったこの宣言を、 ODViewController にコピーするとします。すると、以下のような書き換えが余儀なくされます。

```
__weak ODViewController *wself = self;  //AppDelegate -> ODViewController
```

この、書き換えが気に食わないのです。

なので、以下のように宣言しましょう。これで書き換えは不要です。

```
__weak typeof(self) *wself = self;
```

これで、クラス型から解放されます。

Xcode 4.4辺りから、この宣言が使えるようになってるはずです。

##もっと良い (?)方法
[libextobjc](https://github.com/jspahrsummers/libextobjc)というライブラリが存在します。これを採用できるなら、採用しても良いのかもです。

上記のような理由で __weak 宣言をする方法のもう1つの欠点は、 self を使う箇所で全て、 wself と書き換えが必要な点です。この書き換えすらをも不要にできるようです。

以下の例のように、`@weakify()`で weak リファレンスにしたい変数を宣言する、という方法です。

```
#import <libextobjc/EXTScope.h>
   :
   :
   :
- (void)sampleMethod {
    @weakify(self);
    dispatch_async(dispatch_get_main_queue(), ^{
        @strongify(self);
        self.view.hidden = NO;
    });
}
```
CakePHPでController, Model, Viewで階層を深くするための設定


# 概要
Controllerの数が増えてきて、何らかの区分でディレクトリを分けたい場合の設定を書きます。
# 実装

bootstrap.phpに以下の記述をすることで実現可能です。
例として以下のケースを想定したコードを記します。
ex ) admin用のcontrollerはadminディレクトリにまとめたい


```php:bootstrap.php
App::build(array(
    'Controller' => array(
        ROOT.DS.APP_DIR.DS.'Controller'.DS,
        ROOT.DS.APP_DIR.DS.'Controller'.DS.'Admin'.DS,
    )
));
```

これでControllerの階層を実現することができます。
これは同様にModel, Viewでも実現でき、すべてやるとしたら以下のようになります。

```php:bootstrap.php
App::build(array(
    'Controller' => array(
        ROOT.DS.APP_DIR.DS.'Controller'.DS,
        ROOT.DS.APP_DIR.DS.'Controller'.DS.'Admin'.DS,
    ),
    'Model' => array(
        ROOT.DS.APP_DIR.DS.'Model'.DS,
        ROOT.DS.APP_DIR.DS.'Model'.DS.'Admin'.DS,
    ),
    'View' => array(
        ROOT.DS.APP_DIR.DS.'View'.DS,
        ROOT.DS.APP_DIR.DS.'View'.DS.'Admin'.DS,
    ),
));
```

# 参考
* [【CakePHP】フォルダを分ける（階層を深くする）](http://cakephp.popotoo.com/other/337/)
iOSで下に引っ張って更新するやつの作り方


# 概要
Twitterなどでよく見かける引っ張って更新するやつの実装方法です。
実装には「UIRefreshControl」を使用します。

# 実装
ロジックとしては、UIRefleshControlインスタンスを作成し、UITableViewに対してaddSubViewをするだけです。
以下そのコードとなります。

```objc:RefleshControlSample.m
- (void)refleshControlSetting
{
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self
                       action:@selector(onRefresh:)
             forControlEvents:UIControlEventValueChanged];
    [self.tableView addSubview:refreshControl];
}

- (void)onRefresh:(UIRefreshControl *)refreshControl
{
    [refreshControl beginRefreshing];
    // ここの間に更新のロジックを書く
    [refreshControl endRefreshing];
}
```

# 参考
* [UIRefreshControlで引っ張って更新をする](http://qiita.com/myaaaaa_chan/items/fc3adb23d16171de5abe)
* [ios UIRefreshControlでテーブルを引っ張ってからの更新](http://youngforever.hatenablog.com/entry/2014/05/15/110628)
UITextFieldでキーボードを閉じる方法


# 概要
掲題の通りです。

# コード

```objc:TextViewKeyBoardSample.h
@interface PostSongShareViewController : AppViewController<UITextViewDelegate>
@property (weak, nonatomic) IBOutlet UITextView *captionTextView;
@end
```

```objc:TextViewKeyBoardSample.m
- (void)textFieldSetting
{
    self.textView.delegate = self;
    self.textView.returnKeyType = UIReturnKeyDone;
    [self.textView resignFirstResponder];
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
```

これでキーボードの改行ボタンが確定ボタンに変更され，タップするとキーボードが閉じます。

# 参考
* [ UITextView のキーボードを閉じる方法  ~ UIButtonなしのUIで画面を広く~ （改行 (Return)キーとView Touch (Tap) による）](http://blog.livedoor.jp/lol319intq2/archives/34208310.html)
UIPageControlとUIScrollViewを連動させる


# 概要
UIScrollViewをスクロールした際に、UIPageControlの該当箇所を選択させる仕組みをつくります。

# コード
デフォルトでコードに挿入されている部分は省くので自分で補ってください。
また、すでにScrollViewの設定が終わった状態の前提でコードを書いています。

## UIパーツの定義

```objc:ScrollAndSegmentedControlViewController.h 
@interface ProfileViewController : AppViewController<UIActionSheetDelegate, UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *userScrollView;
@property (weak, nonatomic) IBOutlet UIPageControl *userPageControl;

@end
```

## ロジックの実装

```objc:ScrollAndSegmentedControlViewController.m 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.userScrollView.delegate = self;
    [self.userPageControl addTarget:self
                             action:@selector(tappedPageControl:)
                   forControlEvents:UIControlEventValueChanged];
}

// UIScrollView delegate method
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat pageWidth = scrollView.frame.size.width;
    if ((NSInteger)fmod(scrollView.contentOffset.x , pageWidth) == 0) {
        // set current page at pageControl
        self.userPageControl.currentPage = scrollView.contentOffset.x / pageWidth;
    }
}

// when tapped pageControl
- (void)tappedPageControl:(id)sender
{
    CGRect frame = self.userScrollView.frame;
    frame.origin.x = frame.size.width * self.userPageControl.currentPage;
    [self.userScrollView scrollRectToVisible:frame animated:YES];
}
```