OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-C製プロジェクトにSwift製フレームワークを混ぜるときのエラーとその対策

これまでObjective-Cだけで作ってきたプロジェクトに、Swift製のフレームワークをimport&embedして実行すると、次のような実行時エラーが出てアボートすることがあります。

```
dyld: Library not loaded: @rpath/libswiftCore.dylib

  Referenced from: /private/var/mobile/Containers/Bundle/Application/A593E29F-12A5-4C42-A81E-E192AB7A99EB/foo.app/Frameworks/MySwiftFramework.framework/MySwiftClass

  Reason: image not found
```

このエラーは、Swift製フレームワークからSwiftの標準ライブラリを```dyld(3)```しようとしたものの、そういうファイルは無いからロードできなかったために発生しています。Swiftの標準ライブラリはアプリにバンドルされたものを使うので（将来は変わるかも）、アプリの設定によって、きちんとバンドルしてあげないといけないのです。

この場合、ターゲットのBuild Settingsにある**[Build Options]-[Embeedded Content Contains Swift Code]**が、きちんと```Yes```になっているかどうかをチェックします。そして、もし```No```になっていたら```Yes```に変更することで、解決するはずです。

![ビルド設定のEmbeedded Content Contains Swift Codeをチェック](https://qiita-image-store.s3.amazonaws.com/0/5210/85de6e03-e089-c9ef-b40e-76f16ce523d7.png)

きちんと```Yes```になっていれば、次図のようにアプリのバンドル内に一連のSwift用ライブラリも含まれ、無事に動くようになります。

![SwiftLibs.png](https://qiita-image-store.s3.amazonaws.com/0/5210/7dab5eea-0bab-bfe0-619d-ba6ed2031d4b.png)

この設定、**Objective-Cとしてプロジェクトを作成した場合はデフォルトでOFF**なので（当然と言えば当然ですが）、注意が必要です。
BigQuery で今月のテーブル名を TABLE_QUERY を使って取得する

BigQuery には [Table wildcard functions](https://cloud.google.com/bigquery/query-reference#tablewildcardfunctions) という関数があって、テーブルを日次、月次とかに分割している場合に重宝します。

例えば、

```
TABLE_DATE_RANGE(mydata.people, 
                    TIMESTAMP('2014-03-25'), 
                    TIMESTAMP('2014-03-27'))
```

こう書くと、

- mydata.people20140325
- mydata.people20140326
- mydata.people20140327

というテーブルが一気に取得できます。

しかし、これ日次でテーブルを分割している場合にしか使えなくて、そこまで行数が多くない場合、月次で分割しているテーブルがあって、その今月分のデータだけを引っ張ってきたい、という場合に使えないのです。

ということで、擬似的に `TABLE_MONTH_RANGE` 的なことができないか試しいたところ、以下の方法で取得することができました。

```
TABLE_QUERY(mydata,
  'REGEXP_MATCH(table_id, r"^people") AND
   table_id CONTAINS STRFTIME_UTC_USEC(NOW(), "%Y%m")'))
```

2015年1月だったら `mydata.people201501` というテーブル名にヒットします。

これでクエリを毎月書き換える作業から解放されます。
普通に Ruby とか Go のクライアントで動的にクエリを生成している場合は必要ないんですが、GAS から Spreadsheet に書いたクエリを実行する的なことをやる場合に便利です。

拙作ですが、GAS から BQ を呼んで定期レポートを作成するみたいなの例：
https://speakerdeck.com/hakobera/hazimetefalse-bq-gas
realpath をソースコードビルドする


# 概要
## これはなに？
- パスを絶対パスに変換するコマンド
- https://github.com/dtjm/realpath

## 目標
- realpath が実行できるようになる

## 実行環境
- CentOS-7.0
- [ソースコードビルドするための環境](http://qiita.com/boscoworks/items/0d442d446436f7d72183)

## 依存パッケージ
- なし

# 導入手順
## ソースコードをダウンロードする
```
wget http://github.com/dtjm/realpath/raw/master/realpath.c -P /usr/local/share/downloaded/
```

## コンパイルする
```
gcc -o /usr/local/src/realpath /usr/local/share/downloaded/realpath.c
```

## パーミッションを変更する
```
chmod 0755 /usr/local/src/realpath
```

## コマンドのシンボリックリンクを作成する
```
sudo ln -s /usr/local/src/realpath /usr/local/bin/realpath
```


# 削除手順
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/realpath.c
sudo rm -r /usr/local/src/realpath
sudo rm -r /usr/local/bin/realpath
```
1から始めるiOSチーム開発：iTunes Connectにメンバーを追加する


# iTunes Connectとは

App Store上の情報、契約や支払い関係を管理できます。
それだけだと開発者には必要ないように思えるかもしれませんが、XcodeからアプリをアップロードするにはiTunes Connectのアカウントが必要です。AdminもしくはTechnical権限で行えます。
ユーザの役割について詳しくは、[iTunes Connect デベロッパガイド](https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_Jpn/Appendices/Properties.html#//apple_ref/doc/uid/TP40014483-CH26-SW11)を参照してください。
ちなみに、iTunes Connect > アカウント情報 > 役割タブでわかりやすく表になっているほか、Apple公式「[アプリケーションの配布に関するガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/AppDistributionGuide.pdf)」の134ページにiTunes Connectにおける役割と責任が記載されています。

# 必要なもの

* Admin権限のアカウント
* 追加するメンバーのApple ID
* 20分〜30分

# メンバーの追加

[iTunes Connect](https://itunesconnect.apple.com/)の ユーザと役割を選択します。
招待するアカウントにはAdmin権限が必要です。

![01_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/09712964-356a-1a72-e44b-9af3cf6dfb6d.png "01_iTunes_Connect.png")
iTunes Connectユーザ一覧を開いたら、+ボタンでメンバーの招待をします。
![02_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/ceb09ebf-3ab3-f277-e1ff-66e571f9a00c.png "02_iTunes_Connect.png")

![03_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/1538a09d-fc23-aa35-e0c2-ecb13e7e2848.png "03_iTunes_Connect.png")

![04_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/a4919604-15d5-063f-fee6-d7e19ba31de6.png "04_iTunes_Connect.png")
Apple Developerに登録したApple IDを使うと警告が表示されますが、同じIDにした方が管理が楽になります。会社の個人アドレスは普通ひとつだけですし。

![05_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/56dc44e1-4e62-1dfb-9784-a97d9b9ba73a.png "05_iTunes_Connect.png")
開発者を追加したいのでTechnicalを選び、次を押します。

![06_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/7a31cd53-cd8f-3ba3-fc95-48668cd3eb41.png "06_iTunes_Connect.png")
開発者メンバーの場合、アプリに関するメールだけ受け取れば十分でしょう。
![07_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/f4428fcb-6db8-dcee-ba8e-94a3cd4aeab6.png "07_iTunes_Connect.png")

![08_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/17cfea42-ecf3-aec4-cd75-5a6008536541.png "08_iTunes_Connect.png")
保存すると入力したアドレス宛てに確認用のメールが送信されます。

# iTunes Connectメンバー追加の認証

![10_welcome_new_user.png](https://qiita-image-store.s3.amazonaws.com/0/15926/3ae2fec7-bd1f-1a61-3b93-ab100ddbffd0.png "10_welcome_new_user.png")
メールからiTunes Connectへサインインします。

![11_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/d34028c2-3eb7-783e-1eba-c2607ddcfa04.png "11_iTunes_Connect.png")

![12_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/1090c9a8-5e2c-2436-cdc0-793e6670932d.png "12_iTunes_Connect.png")

![13_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/793eca73-26da-28b3-c113-55ad7d42dfbc.png "13_iTunes_Connect.png")
ライセンスに同意するだけです。

![20_iTunes_Connect.png](https://qiita-image-store.s3.amazonaws.com/0/15926/91143755-8495-fdc2-ac72-4978d5500d25.png "20_iTunes_Connect.png")
ログインできました。これでアプリのアップロードやストア公開などが行えるようになります。
Cassandra link 


#nosql
##cassandra/modeling

https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/
http://www.slideshare.net/planetcassandra/cassandra-21172880
http://planetcassandra.org/blog/composite-keys-in-apache-cassandra/
http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/
http://www.datastax.com/documentation/cql/3.1/pdf/cql31.pdf
https://aphyr.com/posts/294-call-me-maybe-cassandra
http://www.datastax.com/documentation/cassandra/2.0/pdf/cassandra20.pdf
http://planetcassandra.org/blog/flite-breaking-down-the-cql-where-clause/

[J]http://www.atmarkit.co.jp/ait/articles/1103/25/news131.html
[J]http://www.ibm.com/developerworks/jp/opensource/library/os-apache-cassandra/
[J]http://www.sraoss.co.jp/event_seminar/2013/NoSQL-2013-06-21.pdf
[J]http://www.slideshare.net/yukim/cassandra-3885571?related=2
[J]http://www.slideshare.net/haketa/cassandra-cassandra-summit2014jpn?next_slideshow=1

##cql and thrift

http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows
http://www.datastax.com/dev/blog/thrift-to-cql3

##cql3
http://www.datastax.com/dev/blog/cql3_collections
http://www.datastax.com/dev/blog/cql3-for-cassandra-experts

#transaction/cap/acid
[J]http://www.infoq.com/jp/articles/cap-twelve-years-later-how-the-rules-have-changed
[J]http://dekokun.github.io/posts/2013-09-30.html
一般ユーザー権限しかないWindowsでVimを楽しく使う工夫

Windows7でユーザー権限しかない環境でVimを使う機会がありました。  
ちょっと工夫が必要だったので、やり方メモ。

権限的に自分のプロファイル下くらいにしか置けないので、以下の例では``C:\Users\hoge\tools\``の下に色々入れていくことにします。

## Gitを用意する

NeoBundleを使うならGitは欠かせません。
管理者権限がない関係で普通にインストールすることができないので、PortableGitを使います。

[github/msysgit](https://github.com/github/msysgit/tree/PortableGit) ※msysgitのブランチとしてPortableGitがいます。

GitHubからzipで取ってきて、適当な場所に展開しましょう。  
今回は``C:\Users\hoge\tools\msysgit\``に入れました。


## Vimを用意する

みんな大好き **香り屋Vim** を使います。

[Vim - KaoriYa](http://www.kaoriya.net/software/vim/)

ポータブル版とかそういうのはなくて、zip配布です。  
展開して``C:\Users\hoge\tools\vim\``に入れました。


### NeoBundleの導入

VimのプラグインをNeoBundleで管理しているので、入れます。

[Shougo/neobundle.vim](https://github.com/Shougo/neobundle.vim)

zipで取ってきて、``C:\Users\hoge\.vim\bundle\``の下に展開します。


### .vimrcを持ってくる

いつもは[過去記事](http://qiita.com/honeniq/items/e4b99cc54edf08884ab4)のようにdotfiles内のファイルにシンボリックリンクを張っているのですが、一般ユーザー権限だとこれができません。

少々不本意ですが、一時的な利用なのでファイルを直接置くことにします。

dotfilesをcloneしてきて、``.vim``ディレクトリと``.gvimrc``・``.vimrc``を``C:\Users\hoge\``直下に置きました。


## 起動バッチを書く

VimからGitを呼ぶために、環境変数PATHに追記する必要があります。が、管理者権限がないので「システムの詳細設定」が開けません。

少々力技ではありますが、環境変数を足してVimを立ち上げるバッチファイルを書きます。

~~~ bat
set PATH=\Users\hoge\tools\msysgit\bin\
C:\Users\hoge\tools\vim\gvim.exe
~~~

## ディレクトリ構造はこんな感じ

~~~
C:.
├─Users
│  ├─hoge
│  │  ├─.vim
│  │  │  └─bundle
│  │  │      └─neobundle.vim
│  │  ├─.gvimrc
│  │  ├─.vimrc
│  │  └─tools
│  │      ├─msysgit
│  │      │  └─bin
│  │      │      └─git.exe
│  │      └─vim
│  │          ├─gvim.exe
│  │          └─vim.exe
~~~

## 問題点

* gVimを開いてから閉じるまでずっとDOS窓が出っ放しになる。


以上！
フォーム関連のメソッド


###form_for/form_tag フォーム
form_for/form_tagメソッドは、いずれも<form>タグを生成するためのメソッド。
・form_forは特定のモデルオブジェクトを編集するのに特化したメソッド
基本的にはform_forを使用してモデルの編集を行う(form_tagでもできるが基本はこちら)

・form_tagはモデルに関連しない汎用的なフォームを生成するためのメソッド
例えば、検索キーワードや条件を入力するフォームは、一般的にモデルに関連づかないためform_tagを使用する



###leabel ラベル
###text_field テキストボックス
###password_field パスワード入力ボックス
###text_area テキストエリア
###file_field ファイル選択ボックス
###check_box チェックボックス
###radio_button ラジオボタン
###select 選択ボックス/リストボックス
###collection_select データベースの情報をもとに選択を生成する
###group_collection_select 選択ボックスの選択肢をグループ化する
###options_for_select 配列/ハッシュを生成する
###options_from_collection_for_select データベースから動的に生成する
###select_tag モデルと関連づかない選択ボックスを生成する
###hidden_field 隠しフィールド
###email_field メールアドレス入力ボックス
###number_field 数値入力ボックス
###range_field 範囲バー
###search_field 検索ボックス
###telephone_field 電話番号入力ボックス
###url_field URL入力ボックス
###color_field 色選択ボックス
###date_field 日付入力ボックス
###datetime_field 日付時刻入力ボックス
###datetime_field 日付時刻入力ボックス(ローカル)
###time_field 時刻入力ボックス
###month_field 月入力ボックス
###week_field 週入力ボックス
###submit サブミット
###fields_for form_for ブロック配下のサブフォーム
scala - 重複除去

~~distinctは遅いみたいです。~~ 嘘でしたすいません.. (xuwei_kさんありがとうございます)

```scala
class Bench {
  @Benchmark
  def set2seq(): Unit = (1 to 100).combinations(2).toList.flatten.toSet.toSeq

  @Benchmark
  def distinct(): Unit = (1 to 100).combinations(2).toList.flatten.distinct
}
```

```
[info] Benchmark           Mode  Samples    Score  Score error  Units
[info] f.Bench.set2seq    thrpt        3   90.893      495.577  ops/s
[info] f.Bench.distinct   thrpt        3  109.927       75.496  ops/s
```

正しくないやつ↓

```scala
@State(Scope.Thread)
class Bench {
  val list: Seq[Int] = (1 to 100).combinations(2).toList.flatten

  @Benchmark
  def set2seq(): Unit = list.toSet.toSeq

  @Benchmark
  def distinct(): Unit = list.distinct
}
```

```
[info] Benchmark            Mode  Samples      Score  Score error  Units
[info] f.Bench.distinct    thrpt        3  13111.451     3086.943  ops/s
[info] f.Bench.set2seq     thrpt        3   5717.012     4046.475  ops/s
```

benchmarkの問題っぽい。リストを作るタイミングの問題かな...
SwiftでUIAlertController(iOS8以降)とUIAlertView(iOS7以前)を使い分ける

Swiftでアラートを出す場合、ios7に対応するにはUIAlertViewを使う必要があります。
選択肢が２つ（キャンセル、OK）のアラートの場合について書きます。

まずUIAlertViewを使うのに、UIViewControllerにUIAlertViewDelegateを追加しておきましょう。（アラートの選択肢２つ以上の場合にUIAlertViewDelegateが必要です。）

```swift
class MainViewController: UIViewController, UIAlertViewDelegate {
    //以下省略
```

objc_getClassでUIAlertControllerクラスがあるかどうかチェックします。

```swift
    if objc_getClass("UIAlertController") != nil {
            //UIAlertController使用
            var ac = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert)
            
            let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) -> Void in
                println("Cancel button tapped.")
            }
            
            let okAction = UIAlertAction(title: "OK", style: .Default) { (action) -> Void in
                println("OK button tapped.")
            }
            
            ac.addAction(cancelAction)
            ac.addAction(okAction)
            
            presentViewController(ac, animated: true, completion: nil)
            
        } else {
            //UIAlertView使用
            var av = UIAlertView(title: "Title", message:"Message", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")
            av.show()
        }
```

UIAlertViewでボタンが押されたアクション用のメソッドも追加しておきましょう。

```swift
    func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
        if (buttonIndex == alertView.cancelButtonIndex) {
            //Canceled
        } else {
            //OK
        }
    }
```
複数のバージョンのGoを簡単に切り替える方法

1.3や1.4など、複数のバージョンのGoを切り替えてビルドしたいという状況は(たまに)あると思います。

そんなとき、gvmやgobrewなどバージョン管理ツールを試してみましたが上手く行きませんでした。

- gvmは~/.gvm配下に``$GOPATH``が持っていかれてしまい、もともとの$GOPATH配下のワーキングディレクトリのプロジェクトをビルドできない
- gobrewは1.2までしか対応していないようだった

やはり安易にサードパーティツール頼るのではなくGo単体でなんとかするのがGo wayかもしれない…。そこで、go単体でうまいこと複数goバージョンを切り替える方法を調べました。

# 方法

既に/usr/local/go あたりに普段使いのgoがインストールされている前提で、ビルド用に複数バージョンをインストールして切り替える、というユースケースで説明します。

# 手順1. 複数バージョンのGoをインストールする

何はなくともインストールです。
アーカイブからでもソースコードからでもいいですが、[Downloads - The Go Programming Language](https://golang.org/dl/) からgoをダウンロードしてきて別々のディレクトリにインストールします。Macのpkgインストーラではインストール先ディレクトリが指定できなかったのでダメです。

```
# ここではgoコンパイラのインストール先を$GOPATH/gobinとします。
cd $GOPATH/gobin

# go1.4.1をインストール(アーカイブインストールする場合)
wget https://storage.googleapis.com/golang/go1.4.1.darwin-amd64-osx10.8.tar.gz
mkdir go1.4.1 && tar -C go1.4.1 -xzf go1.4.1.darwin-amd64.tar.gz


# go1.3.3をインストール(ソースインストールする場合)
wget https://storage.googleapis.com/golang/go1.3.3.src.tar.gz
mkdir go1.3.3 && tar -C go1.3.3 -xzf go1.3.3.src.tar.gz
cd go1.3.3/go/src ; ./all.bash ;  cd ../../..
```
必要に応じてクロスコンパイルなども設定しておきましょう。
参考：[Go のクロスコンパイル環境構築 - Qiita](http://qiita.com/Jxck_/items/02185f51162e92759ebe)

# 手順2. ビルドに使うGoを使い分ける

以下のようにGOROOT環境設定つきでgobin以下にインストールしたgo buildを実行します。ポイントは `-a` フラグです。goのオブジェクトファイルはメジャーバージョン間で互換性がなく、go1.3でビルドする時に`$GOPATH/pkg`にgo1.4でビルドした.aファイルがあるとエラーになってしまうことがあります(必ずではない？)。`-a`フラグで強制再ビルドをさせる事でこれを避ける事ができます。バージョンを切り替えたあとのビルドエラーにはこれで対処しましょう。

```
# Go1.3.3でビルド
GOROOT=$GOPATH/gobin/go1.3.3/go/ $GOPATH/gobin/go1.3.3/go/bin/go build -a

# Go1.4でビルド
GOROOT=$GOPATH/gobin/go1.4.1/go/ $GOPATH/gobin/go1.4.1/go/bin/go build -a
```

あとはそれぞれのgoにaliasでも貼っておきましょう。

```
# .zshrcに追加
alias go1.3.3="GOROOT=$GOPATH/gobin/go1.3.3/go/ $GOPATH/gobin/go1.3.3/go/bin/go"
alias go1.4.1="GOROOT=$GOPATH/gobin/go1.4.1/go/ $GOPATH/gobin/go1.4.1/go/bin/go"
```

これで `go` `go1.3.3` `go1.4.1`を使い分ける事ができるようになりました。$GOPATHは共有しているので、ワーキングディレクトリが使えないという問題もありません。

```
$ go build
$ go1.3.3 build
$ go1.4.1 build
```

もっといい方法を知っている方はコメントで教えてください。こちらからは以上です。
[覚書] Webサイトから外部WebAPIへアクセスする方法(jQuery getJSON)

この記事は、学習した内容を残しておく為の個人的なメモですが、誤りを発見された場合はコメントしていただけると助かります。

*この記事に書かれているコードを実際に動かしたわけではないので、もしかすると誤りが含まれているかもしれませんのでご注意下さい。*

# 構成

FacebookやTwitterなどのJSONPに対応したWebAPIから情報を取得して、Webサイトに表示する。
アクセス方法は、JavaScript(今回はjQueryのgetJSONメソッド)。

ブラウザ -> Webサイト -> WebAPI

# アクセス方法

## 例

``` js
$.getJSON("http://hogehoge/api/?callback=?", data, function(data, textStatus, jqXHR){
  // 通信成功時に、ここが実行される。
});
```

注意すべき点は、`callback=?`を記述すること。
(jQueryが、コールバック関数の文字列に置き換えてくれる)

もし、WebAPI側の仕様で`callback`以外のパラメータ名で実行しなければならない時は、`callback`の箇所を書き換えるだけで良い(はず)。
(`callback=?` -> `jsonpCallback=?`)

getJSONから返されるjqXHRオブジェクトを使って、通信が、成功/失敗/完了した時の処理を実行することができる。

``` js
var jqxhr = $.getJSON("example.json", function() {
    console.log("success");
}).done(function() {
    console.log("second success");
}).fail(function() {
    console.log("error");
}).always(function() {
    console.log("complete");
});
```

## getJSONメソッドについて

GETによるリクエストで、JSON形式にエンコードされたデータをサーバから受け取る。

**返り値**

jqXHR：XMLHTTPRequestオブジェクトの上位集合

**パラメータ**

* 第一引数(String url)：リクエスト先のURL。
  * URLのパラメータには、”callback=?”を記述する必要がある。
  * jQueryが、“?”に”jsonp” + 現在時刻文字列の文字列に置き換えてクエリを送信し、内部でコールバック関数を実行してくれる(はず)。
* 第二引数(PlainObject data)オプション：サーバに送信するデータ(Plane ObjectまたはString)
  * Plane Object：new Object()、または「{ … }」の形式で生成されたオブジェクト
* 第三引数(Function success)オプション：通信が成功した場合に実行されるコールバック関数
  * 第一引数(PlainObject data)：JSONオブジェクト
  * 第二引数(String textStatus)：リクエスト結果を表す文字列
  * 第三引数(jqXHR jqXHR)：XMLHTTPRequestオブジェクトの上位集合

# キーワード

* Same-Origin Policy(同一生成元ポリシー、同一オリジンポリシー)
* クロスオリジン
* JSONP
* jQuery
* XMLHttpRequest
* getJSON
* Ajax

# 所感

もともと知っていた情報を整理・覚書する為にこの記事を書いたのだが、実際に整理してみると意外と理解していない事が多かった。

以下は、今後の課題。

FacebookやTwitterなどのサービスと連携したWebサイトを作る場合、今回の方法でその問題を回避することが出来ることが出来るが、Same-Origin Policyに反しているのではないか、と思っている。
(jQueryのAPIドキュメントにはSame-Origin Policyに従っている、と書かれている様なので単なる理解不足なのかもしれない。。。)
セキュリティ的な問題がないかどうか、またその対策方法について調査したい。

また、今後はサーバ側についても調査していきたい。

# 参照

jQuery.getJSON()で別ドメインのJSONPなデータを読み込む時の注意 - kanonjiの日記:
[http://d.hatena.ne.jp/kanonji/20100427/1272372721]

jQuery.getJSON() | jQuery API Documentation:
[http://api.jquery.com/jquery.getjson/]

Ajax通信 - hifive:
[http://www.htmlhifive.com/conts/web/view/study-room/ajax]

連載：jQuery逆引きリファレンス：第10回 jQuery 1.4編 (4/17) - ＠IT:
[http://www.atmarkit.co.jp/ait/articles/1008/27/news118_4.html]

以上
Atomで短形選択がしたい

# Atomで短形選択がしたい

Atomの公式パッケージにvim-modeというのがある

https://github.com/atom/vim-mode/

が

https://github.com/atom/vim-mode/issues/327


短形選択まだ実装されていないみたい. （2015.1.15現在）

頑張れ.

# atom-sublime-select

色々調べたがこれが一番でかいぽい

https://github.com/bigfive/atom-sublime-select


    $ apm install sublime-style-column-selection


`apm`などの使い方はこれを参照

[Atomとapmを本腰入れて使い始める](http://qiita.com/gogotanaka/items/63b5cf173feb7bc8f160)

Atomを再起動.

特に設定とかは要らない

`Alt`（Option）+ マウスを動かす => 短形選択！




[![Gyazo](http://i.gyazo.com/8e256e9054e675969e9b7827e5c17620.gif)](http://gyazo.com/8e256e9054e675969e9b7827e5c17620)
rails_bootstrap_navbarで楽にnavbarを書こう！

# navbar書くのは面倒臭い！

bootstrap3を使ってサイトを作るときって、navbarを使うこと多いと思うのですが、これが結構複雑で書きにくいなーって感じた事はありませんか？実はnavbarを書くためだけのgemがあるのです！それが、[bootstrap_nabvar](https://github.com/bootstrap-ruby/bootstrap-navbar)です。今回はrailsで使う用の[rails_bootstrap_navbar](https://github.com/bootstrap-ruby/rails-bootstrap-navbar)を紹介します。

## 導入方法

まずはGemfileに追加します。

```rb:Gemfile
gem 'rails_bootstrap_navbar'
```

そしてインストール。

```bash:railsプロジェクト内にて
bundle install
```

これで利用準備はできました。

## 使い方

使い方については、[Usage with Bootstrap 3.x](https://github.com/bootstrap-ruby/rails-bootstrap-navbar)を見てください。
というと元も子もないので、ちょっと説明します。

bootstrap_navbarは、navbarのhtmlを記述するためのDSLなので、ネストして書いていくことになります。
ただし、複雑なnavbarをbootstrap_navbarだけで作るのは難しいです。
あくまでシンプルなものだけになります。なので、いざというときは普通にhtmlを記述する必要はあります。

```slim:app/views/layouts/_navigation.html.slim
= navbar fixed: :top do
  = navbar_header brand: 'My Great App', brand_link: root_path
  = navbar_collapse do
    = navbar_group align: 'left' do
      = navbar_item 'メニュー1', '#'
      = navbar_item 'メニュー2', '#'
      = navbar_item 'メニュー3', '#'
      li = navbar_text 'ただのテキスト'
      li
        p.navbar-btn = link_to 'ボタン風リンク', '#', class: 'btn btn-default'
    = navbar_group align: 'right' do
      = navbar_dropdown '管理者' do
        = navbar_item 'マイページ', '#'
        = navbar_dropdown_devider
        = navbar_item 'ログアウト', '#', nil, {:'data-method' => 'delete'}
```
### navbar

navbar用のクラス付きのnavタグを生成します。オプションでバーを固定したり、レスポンシブ対応にできたりします。

### navbar_header

モバイルのときに表示されるトグルメニューをこれだけで作成することができます。
オプションでnavbar上のサイト名(ブランド名？)を記述することもできます。
brandがある場合、brand_urlを省略すると、デフォルトで '/' にリンクが貼られます。
ただし、画像ロゴを出すときは自動で中央揃えにするのは難しそうなので、素直にhtmlを書くか、navbarに最適化されたロゴを準備したほうがよさそうです。

### navbar_collapse

ロゴ以降の入れ物を準備します。

### navbar_group

メニュー用のulタグを生成します。

### navbar_item

メニュー用のliタグ付きのリンクを生成します。**link_toを使ってリンクを生成するわけではない**ので、オプションには注意が必要です。

```slim
= navbar_item 'ログアウト', '#', nil, {:'data-method' => 'delete'}
```

ログアウトの記述のところで、{:'data-method' => 'delete'}と書いているのはそのためです。

### navbar_text

navbar上でpタグを使ってちょうどいい位置にテキストを書いてくれます。
ただし、pタグしか生成しないため、navbar_group内で使うと、ulタグの子要素としてpタグができてしまうので注意が必要です。

```slim:slim
= navbar_collapse do
  = navbar_group align: 'left' do
    = navbar_item 'メニュー1', '#'
    li = navbar_text 'ただのテキスト'
```
こうすると、html的に綺麗かなと思います。

### navbar上でリンクのボタンを綺麗に表示する

buttonタグでボタンを綺麗に表示するのは簡単なのですが(navbar_buttonメソッドを使う)、aタグのボタンを作るのが難しかったのでTipsとして載せておきます。

```slim:slim
= navbar_collapse do
  = navbar_group align: 'left' do
    li
      p.navbar-btn = link_to 'ボタン風リンク', '#', class: 'btn btn-default'

```

コツは、p.navbar-btnでリンクを囲んでしまうことです。

## まだまだあります。

他にも、navbar内でフォームを作るためのメソッドも準備されているようです（試していません）。
さらに知りたい方は本家をご参照ください。

* [Usage with Bootstrap 3.x](https://github.com/bootstrap-ruby/rails-bootstrap-navbar)

## おまけ
ちなみに、[middleman_bootstrap_navbar](https://github.com/bootstrap-ruby/middleman-bootstrap-navbar)もあります！
rvmで管理しているrubyのバージョンを変更したい時

たまにしか使わずよく忘れるので、備忘録がてら。

# 手順 
1: インストール候補となるrubyのリストを最新にするためrvmをアップデートする

```shell-session
rvm get head
```

2: インストール出来るRubyのバージョンを確認する

```shell-session
rvm list known
```

3: インストール

```shell-session
rvm install ruby-2.0.0-p598
```

4: デフォルトのバージョンを変更

```shell-session
rvm --default use 2.0.0-p598
```

5: バージョン確認

```shell-session
$ ruby -v
```

etc: 今までのバージョンを削除したい場合

```shell-session
$ rvm remove ruby-1.9.3-p551
```
wineでOfficeを使うと`.lnk`ファイルが残る

wineでOffice(WordとかExcel)のファイルを開くと、`.lnk`ファイルが残ります。うざい。

対処
----

```
$ mkdir $WINEPREFIX/drive_c/$USER/Recent/
```

解説
----

Recentフォルダが無いから、だそうだ。

http://www.dreamincode.net/forums/topic/270373-microsoft-office-on-wine-lnk-files/page__view__findpost__p__2023441?s=601c43bc411befc851ab94f990e7398c
PHP関連の翻訳プロジェクトのまとめ

PHP関連の翻訳プロジェクトの存在を知ってもらい、参加したい人が参加方法を探せるようにまとめています。

ここにない、ご存じの翻訳プロジェクトがありましたら、お知らせください。

# PHPマニュアル

http://ml.php.gr.jp/ の「PHP-doc メーリングリスト」にて英語ドキュメントの日本語への翻訳が進められています。

* [PHP-doc メーリングリスト](http://ml.php.gr.jp/mailman/listinfo/php-doc)

# フレームワーク

## CodeIgniter

GitHubにてドキュメントの翻訳が進められています。

* <https://github.com/codeigniter-jp/user_guide_src_ja>

## FuelPHP

GitHubにてドキュメントの翻訳が進められています。

* https://github.com/NEKOGET/FuelPHP_docs_jp

## Phalcon

TransifexにてWebサイトとドキュメントの翻訳が進められています。

* [Phalconのドキュメント翻訳に関するまとめ（翻訳に参加する人は必ずお読みください）](http://qiita.com/kenjis/items/2fb2a4c8eb7974e72054)

## Aura

GitHubにてv2のドキュメントの翻訳が進められています。

* https://github.com/auraphp/auraphp.github.com/issues/52

## Symfony

GitHubにてドキュメントの翻訳が進められています。

* https://github.com/symfony-japan/symfony-docs-ja

## Yii

GitHubにてドキュメントの翻訳が進められています。

* https://github.com/yiijan/yii2-i18n-ja

# アプリケーション
 
## WordPress

* [WordPress 日本語版チーム資料](http://wpdocs.sourceforge.jp/WordPress_%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88%E3%83%81%E3%83%BC%E3%83%A0%E8%B3%87%E6%96%99)

## concrete5

* [募集： concrete5 ドキュメント翻訳者を募集します](http://concrete5-japan.org/news/translators-wanted/)
NetBeansでvim風の操作が出来るjViプラグインを使ってみる


ツール→プラグイン→使用可能なプラグイン→検索の部分にjViと入れて検索

こんな感じでインストール出来た。

と思ったら冷静に見ると

```
jVi for NB-7.0 Update Center
```
というプラグイン名だった。。。org


------

気を取り直して、

http://jvi.sourceforge.net/

こちらのサイトから、NetBeans用のjViをダウンロードする。

- `DOWNLOAD jVi for NetBeans`というリンクをクリック
- `Looking for the latest version? Download nbvi-1.5.3.zip (473.4 kB)`と表示されている箇所があるのでダウンロード
- `nbvi-1.5.3.zip`のファイルがダウンロードされるので解凍
- ツール→プラグイン→ダウンロード済の所をクリック
- プラグインの追加ボタンを押して解凍したフォルダを開き、`.nbm`の拡張子のものを全て選択（commandキーを押しながらクリックすると選択出来る）
- インストールすると再起動が促されるので再起動する


## 設定とか
Preferenceの画面に`jVi Config`が表示されるので、そこでいろいろ設定できる。
そこまで見てない。

## 所感
vimに慣れきった人にとってはあると嬉しい。。。

control + wでウィンドウ分割もサポートされているので素敵。

これからちょっとずつ使っていってみよう！

と思いつつ気がついたらvimを立ち上げている今日この頃ｗ

## thanks
- http://www.chin3.net/tech/php/840/
OpenCVとyaml-cppをCLionで動かしたかった

#環境
* Windows7
* Cygwin(64bit)
* CLion CL-140.569.17
* OpenCV 2.4.10
* yaml-cpp 0.5.1

#OpenCVのビルド
↓を参考にした
http://hvrl.ics.keio.ac.jp/kimura/opencv/opencv-2.4.10.html.ja
ffmpeg, VTKは使わないのでスキップ

```
apt-cyg install \
 unzip \
 cmake \
 gcc-g++ \
 make \
 patch \
 libIlmImf-devel \
 libjasper-devel \
 libjpeg-devel \
 libpng-devel \
 libtiff-devel \
 libhdf5-devel \
 libbz2-devel \
 zlib-devel
git clone https://github.com/Itseez/opencv.git
git checkout 2.4.10
wget http://hvrl.ics.keio.ac.jp/kimura/opencv/files/opencv-2.4.10-cygwin-patch-20141008.txt.gz
gunzip opencv-2.4.10-cygwin-patch-20141008.txt.gz
patch -p1 < opencv-2.4.10-cygwin-patch-20141008.txt
mkdir build
cd build
cmake \
 -D CMAKE_LEGACY_CYGWIN_WIN32=0 \
 -D CMAKE_BUILD_TYPE=RELEASE \
 -D BUILD_SHARED_LIBS=ON \
 ..
make
make install
```

#yaml-cppのビルド

```
apt-cyg install libboost-devel
wget https://yaml-cpp.googlecode.com/files/yaml-cpp-0.5.1.tar.gz
tar zxvf yaml-cpp-0.5.1.tar.gz
cd yaml-cpp-0.5.1
mkdir build
cd build
cmake ..
make
```
#PATHの設定
##Cygwin

```
export PATH=$PATH:/usr/local/opencv2.4.10/bin/:/cygdrive/c/cygwin64/bin/
```
##Windows
```
C:\cygwin64\bin
C:\cygwin64\usr\local\opencv2.4.10\bin
```
Pathに↑を追加

#サンプルコード

```txt:CMakeLists.txt
cmake_minimum_required(VERSION 2.8.4)
project(sample)

set(YAML_CPP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/lib/yaml-cpp-0.5.1)

find_package(OpenCV REQUIRED)
include_directories(${YAML_CPP_ROOT}/include)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES source/main.cpp)

add_executable(sample ${SOURCE_FILES})
target_link_libraries(sample
 ${OpenCV_LIBS}
 ${YAML_CPP_ROOT}/build/libyaml-cpp.a
)
```
```cpp:main.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <yaml-cpp/yaml.h>

int main() {
    YAML::Node config = YAML::LoadFile("config.yml");
    std::string filename = config["filename"].as<std::string>();
    cv::Mat image = cv::imread(filename);
    cv::imwrite("./output.bmp", image);
    return 0;
}
```
```yml:config.yml
filename: lenna.bmp
```
#メモ
ビルドはCLion上から可能
コマンドプロンプトとCygwin上からは実行できたが、CLion上から実行すると
```
ExecutionException: During startup program exited with code 0xc0000135.
```
上記エラーが出て実行できなかった
iPhoneのシステムサウンドを取得

# はじめに
iPhoneのシステムサウンドは以下のパスに存在します。
/System/Library/Audio/UISounds/

どうしてもこのシステムサウンドの内容を参照したい、という場合
このファイル群をDocumentsフォルダに保存し
iTunes経由で取り出すことでファイルを取得可能です。

シミュレータでは動作しません。
実機で実行してください。

# 処理

```lang:システムサウンドファイルをDocumentsに保存
    NSString *sysPath = @"/System/Library/Audio/UISounds/";
    NSString *savePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    
    NSArray *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:sysPath error:nil];

    for (NSString *fileName in fileNames) {
        NSData *data = [NSData dataWithContentsOfFile:[sysPath stringByAppendingPathComponent:fileName]];
        [data writeToFile:[savePath stringByAppendingPathComponent:fileName] atomically:NO];
    }
```

# おわりに
ファイルの著作権はAppleに存在すると思われます。
各自の責任でファイルを扱ってください。

何かに参考になりましたら幸いです。
Python2で競技プログラミングする時に知っておきたいtips


最近，プログラミング言語の練習がてら競技プログラミングを始めました．

言語としてPythonを使っているのですが，C++，Javaといった主流の言語に比べると，Pythonでの競技プログラミングは「邪道」だと捉えられている節があり，そこまで流行っていないのが現状です．

今回は，実用開発ではあまり使わないけれど，競技プログラミングでよく使うPythonの知識をまとめたいと思います．

### 注意点

* Pythonの基本文法については，必要があるもの以外解説しません．

* 他の言語で競技プログラミングをやったことがある人が対象です．

* この記事は現時点では未完成です．内容は随時追加・変更される可能性があります．

Pythonのバージョンは2.7.5(Python3では，入出力などの仕様が大きく異なります)．

### 変更履歴

* 記事を分割しました．(2015/4/22)
* Python2での記事であることを明記しました．（2018/9/10）

# 入力

競技プログラミングにおける入力形式はいろいろあるが，今回は標準入力から受け取るタイプについて紹介する．

[Python2で競技プログラミングする時に知っておきたいtips(入出力編)](http://qiita.com/lethe2211/items/6cbade2bc547649bc040)

# 制御構造

制御構造についてのtips．

[Python2で競技プログラミングする時に知っておきたいtips(制御構造編)](http://qiita.com/lethe2211/items/c5fe9b165b25dbbd12bf)


# データ構造

データ構造についてのtips．

[Python2で競技プログラミングする時に知っておきたいtips(データ構造編)](http://qiita.com/lethe2211/items/fe4e7870ef896ad750bb)

# 便利なライブラリ

競技プログラミングに使える便利ライブラリについてのtips．

[Python2で競技プログラミングする時に知っておきたいtips(便利なライブラリ編)](http://qiita.com/lethe2211/items/6f78ae202e96e52a8cb9)

# その他の言語仕様

[Python2で競技プログラミングする時に知っておきたいtips(その他の言語仕様編)](http://qiita.com/lethe2211/items/72a8c9dfab42e241a9da)

# 各種制限に対応するための知識

Pythonにおける計算時間，メモリ使用量，再帰深度などについてのお話．

[Python2で競技プログラミングする時に知っておきたい知識](http://qiita.com/lethe2211/items/38303f4120bfd963679a)
[JavaScript]文字列から関数を作る

JavaScriptには`Object.defineProperty`という任意の`Object`にプロパティを作成する関数が存在する。
これを使用すれば`getter`や`setter`を定義することができる。
以下のコードは`String.prototype`に`f`という`getter`を定義するコードである。

```js
Object.defineProperty(String.prototype, 'f', {
    get: function () {
        var body = this;
        return function () {
            var params = [];
            var args = [];
            for (var i = 0; i < arguments.length; i++) {
                params.push('$' + i);
                args.push('arguments[' + i + ']');
            }
            return eval('(function (' + params.join(',') + '){return ' + body + ';})(' + args.join(',') + ')');
        };
    }
});
```

上記のコードを実行すると任意の文字列から`f`にアクセスできるようになる。
この`f`は以下のように使用することができる。

```js
var square = "$0 * $0".f;  // 引き数を使う。$0で第一引数にアクセスできる
console.log(square(8));    // 64

var A = 10;
var addA = "$0 + A".f;    // 外部の変数を使用する。
console.log(addA(20));    // 30
A = 20;
console.log(addA(20));    // 40

var mul = "$0 * $1".f;    // 引き数を2つ使う。引き数は$0,$1,...でアクセスできる
console.log(mul(2, 3));   // 6
```
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（７）敵を出す

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# 敵を出す
敵を出して、ゲームとして見栄えが良くなるようにします。

まず、敵キャラのクラスファイルを生成します。
ゲームディレクトリ（game01直下）で、

$ **enforce derive enemy01**

と実行し、「**src**」ディレクトリに「**enemy01.coffee**」が生成されているのを確認してください。
監視スクリプトが実行されている場合は、生成と同時に自動的にコンパイルされます。
監視スクリプトは、ゲームディレクトリ（game01直下）で、

$ **enforce build -w**

です。
次に、「**enemy01.coffee**」を開き「**behavior**」メソッドを下記のように修正します。

```coffeescript
    behavior:->
        super()
        switch @_processnumber
            when 0
                @xs = 4 
                @nextjob()
            when 1
                if (@x > SCREEN_WIDTH)
                    @x = SCREEN_WIDTH
                    @xs *= -1
                else if (@x < 0)
                    @x = 0 
                    @xs *= -1
```
上から説明して行きます。
「**when 0**」で敵キャラの最初の移動量を設定しています。
「**@xs = 4**」なので、右へ4づつ移動しろと設定し「**@_processnumber**」をインクリメント（**@nextjob()**）しています。
「**when 1**」がメインループになります。
画面の右端か左端に達したらx座標の移動量をプラスマイナス逆にするという処理をし続けます。
次に、下記のインスタンスメソッドを追記してください。

```coffeescript
    burn:->
        enemyObj = addObject
            motionObj: enemy01
            type: SPRITE
            x: rand(SCREEN_WIDTH)
            y: rand(SCREEN_HEIGHT / 2)
            image: 'bear'
            width: 32
            height: 32
            animlist: [
                [50, [0, 1, 0, 2]]
            ]
        GLOBAL['enemy'] = enemyObj
        removeObject(@)
```
これは後で「**bullet.coffee**」に追記する処理から呼ばれます。
新しい敵キャラを生成し、敵キャラとして設定し、自分を削除します。
ここで重要な配列変数（オブジェクト）が出てきます。
「**GLOBAL**」です。
これはこのシステムが持つ唯一のユーザーグローバル変数です。
この配列にはすべてのクラスファイルからアクセスすることが出来るので、オブジェクトで共通に参照する必要のあるデータを格納します。
ここで、敵を「**bullet.coffee**」内から参照出来るように「**GLOBAL**」に設定します。

次に、「**enforceMain.coffee**」に下記のソースを追記してください。

```coffeescript
        enemyObj = addObject
            motionObj: enemy01
            type: SPRITE
            x: rand(SCREEN_WIDTH)
            y: rand(SCREEN_HEIGHT / 2)
            image: 'bear'
            width: 32
            height: 32
            animlist: [
                [50, [0, 1, 0, 2]] 
            ]   
        GLOBAL['enemy'] = enemyObj
```
ゲーム起動時に敵キャラを生成します。
ここでも、「**GLOBAL**」に敵キャラを設定しています。
動作を定義するクラスとして「**enemy01**」を指定しています。
最後に、「**bullet.coffee**」の「**behavior**」を下記のように修正します。

```coffeescript
    behavior:->
        super()
        switch @_processnumber
            when 0
                if (@y < 0)
                    removeObject(@)

                # 以下追記分
                enemy = GLOBAL['enemy']
                if (@isIntersect(enemy))
                    enemy.burn()
                    removeObject(@)
```
追記された部分で、敵キャラのオブジェクトを取り出し、「**@isIntersect(オブジェクト)**」で指定したスプライトとの当たり判定を取っています。

もし、敵キャラと当たっていたら、その敵キャラオブジェクトの「**burn**」メソッドを呼び、自分自信を削除しています。
すべての作業・修正が終わりましたら、保存してコンパイルしブラウザをリロードしてください。
敵キャラが左右に動き、弾に当たったら消えて新たな敵キャラが出てくれば正解です。


[チュートリアル（６）](http://qiita.com/digitarhythm/items/33f53aa8c4de119b491a) <--- ⬛︎ ---> [チュートリアル（８）](http://qiita.com/digitarhythm/items/aff4f6c8e1d353381e17)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
redis clusterの作り方

redis3.0.0 RC2がリリースされました。
redis3.0.0から新しく入るredis clusterについて簡単な作り方のメモです。
CentOS使って、１サーバで６台のredis clusterを作ります。
(ほぼ、チュートリアル<http://redis.io/topics/cluster-tutorial>を日本語にしただけです)

## 1. ディレクトリの用意
```shell-session:
$ mkdir ~/cluster-test
$ cd ~/cluster-test
$ mkdir 700{0,1,2,3,4,5}
```

## 2. 最小構成の設定ファイルを用意する

```shell-session:
$ cd 7000
$ emacs redis.conf
```
```lang:redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes 
```

上記の作業を7001~7005までportの設定値**だけ**を変えながら繰り返します。
※cluster-config-fileは変える必要はありません

## 3. 各サーバの起動
６台全てのサーバを起動します。

```shell-session:ターミナルA
$ redis-server 7000/redis.conf
```
```shell-session:ターミナルB
$ redis-server 7001/redis.conf
```
　　：
　　：

ターミナルを複数開きます。自分はemacsなので、画面分割してやりました。
初回起動時には、
`No cluster configuration found, I'm d9b3d1d86b5f5c928f882df6caddc0dbf6031347`
との表示が出て、クラスタの設定ファイル(nodes.conf)が作られます。
この`d9b3d1d86b5f5c928f882df6caddc0dbf6031347`が各サーバを識別する名前となります。
この時点では、1台✕6 がそれぞれ起動している状態です。

## 4.　クラスタリング
```shell-session
$ cd ~/redis/src/
$ redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001  127.0.0.1:7002 127.0.0.1:7003 127.0.01:7004 127.0.0.1:7005
:
Can I set the above configuration? (type 'yes' to accept): yes
:
```
クラスタリング完了です。

###注意点1
redis-trib.rbでサーバを指定するとき、**IPで指定する**ようにしてください。
以下のようにホスト名だと失敗します。
`redis-trib.rb create localhost:7000 localhost:7001 …`
→失敗する

###注意点2
redis-trib.rbを実行した時に、
`kernel_require.rb:55:in `require'    from ./redis-trib.rb:25`
みたいなのが出た時は、
1. rubyのバージョンが新しいか(1.9 or 2.0とか)
2. redisのgemをインストールしているか。→していない場合は`gem install redis`
を確認してください。

###動作確認
```shell-session
$ redis-cli -c -p 7000
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7004
OK
127.0.0.1:7004> get foo
"bar"
```
Pepperを工場出荷時の状態に戻す

Pepperの調子が悪くなった場合は、以下の手順でPepperを工場出荷時の状態に（Factory Reset）できる。

Pepperに保存してあるデータが全て削除されるので、必要なデータは適宜バックアップしておく。

この手順で、Pepperが破損しても筆者は一切の責任を負いませんので、自己責任で行ってください。


# 対応NAOバージョン
2.0.6.8


# SSHでPepperにログインする
ユーザー名：nao
IPアドレス：Pepperの電源ボタンを押すとIPアドレスを教えてくれる
パスワード：Pepperの初期設定時に設定したもの


# factory-reset.requestedファイルを作成する
以下のコマンドを実行する。この時パスワードを要求されるが、Pepperのrootのパスワードを入力する。デフォルトはroot
`su -c "touch /var/run/factory-reset.requested"`

以下のコマンドで正常にファイルが作成されたか確認できる。ファイルパスが表示されればファイルが作成されているが、"No such file or directory"の場合は作成に失敗している。
`ls -l /var/run/factory-reset.requested`


# Pepperをシャットダウン
電源ボタンを長押ししてPepperをシャットダウンさせる。この時、肩のLEDが赤色で点滅し、初期化が進行していることを示している。初期化には20分程度かかるので待つ。


# Pepperを起動
初期化が完了すると、肩のLEDが消灯するので、電源ボタンを押して起動させる。


# 初期設定
起動すると初回起動時の初期設定画面になるので、必要な設定を行う。
初めてのvimプラグイン追加（neobundle）

#neobundleのインストール
neobundleでプラグインを管理するのが最適。

```
mkdir -p ~/.vim/bundle
cd ~/.vim/bundle/

git clone https://github.com/Shougo/neobundle.vim.git neobundle.vim
```


#.vimrcを編集

```
set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
  call neobundle#begin(expand('~/.vim/bundle/'))
endif

NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/vimproc'

call neobundle#end()

filetype plugin indent on
```

#vimにて
以下のコマンドを実行し、.vimrcで定義したプラグインをインストールする。
`:NeoBundleInstall
`

#その他プラグインをインストール
以下のプラグインを入れると開発が楽になるかと。。。
Shougo/neosnippet
Shougo/neosnippet-snippets
scrooloose/syntastic.git
scrooloose/nerdtree

*PHPの辞書を事前に作成*
**参考URL http://tech.basicinc.jp/PHP/2013/06/17/vim-php/**
`php -r '$f=get_defined_functions();echo join("\n",$f["internal"]);'|sort > ~/.vim/dict/php.dict
`


#.vimrcの設定内容（最終）
以下、.vimrcの設定内容

```
set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
  call neobundle#begin(expand('~/.vim/bundle/'))
endif

NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/vimproc'
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'Shougo/neosnippet'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'scrooloose/syntastic.git'
NeoBundle 'scrooloose/nerdtree'

call neobundle#end()

filetype plugin indent on

"-------------------------------------------------
""" neocomplcache設定
"-------------------------------------------------
"""辞書ファイル
autocmd BufRead *.php\|*.ctp\|*.tpl :set dictionary=~/.vim/dict/php.dict filetype=php
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_smart_case = 1
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_manual_completion_start_length = 0
let g:neocomplcache_caching_percent_in_statusline = 1
let g:neocomplcache_enable_skip_completion = 1
let g:neocomplcache_skip_input_time = '0.5'

"-------------------------------------------------
""" neosnippet設定
"-------------------------------------------------
"" Plugin key-mappings.
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)
xmap <C-k>     <Plug>(neosnippet_expand_target)

" SuperTab like snippets behavior.
imap <expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)"
\: pumvisible() ? "\<C-n>" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)"
\: "\<TAB>"

" For snippet_complete marker.
if has('conceal')
  set conceallevel=2 concealcursor=i
endif
```
dockerを触ってdocker hubにpushまで


初めてdockerを触ってみていろいろつまったのでかるくまとめてみる・・・その１

### 最終的なゴール

+ centOS環境でサーバを構築

+ 構築した環境でgolangでAPIサーバ

### 環境

+ vagrantで用意した試し環境

##### pushまで...

```Dockerfile
FROM centos:7
# Installs
run yum install gcc -y
run yum install python-devel -y
run yum install wget -y

....etc
```

> いろいろ省略

+ docker buile -t [ネーム:タグ(1.0)] [コンテナの場所指定]

+ docker images

```
[vagrant@golang-vm ~]$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
yuua/centos_golang   latest              5ed4112633e8        4 days ago          818.5 MB
centos               latest              8efe422e6104        9 days ago          224 MB
centos               7                   8efe422e6104        9 days ago          224 MB
centos               centos7             8efe422e6104        9 days ago          224 MB
```

+ docker hubにリポジトリ作成

+ docker push yuua/centos_golang

#### 詰まったところ

最初にテキトーにやっていたので不要なdockerコンテナを作りすぎてしまいpushできなかった。
(まぁそりゃそうだよなー)

+ 停止しているコンテナを削除

```
docker rm `docker ps -a -q`
```

0.72以前ではコンテナが停止していれば ``` docker rmi ```で削除できたらしいができなくなったらしい

+ タグやらリポジトリがnoneのパターン

```
docker rmi $(docker images | awk '/^<none>/ { print $3 }')
```

> docker images を awdにわたして ^<none>にマッチしたものをimage idを出力して削除

これで消せたはず

#### その１感想

はじめてdockerにふれてコンテナを作成したが、よくわからない部分がかなりあるのでいろいろ調べようと思う。
Dockerコンテナを利用して、OS環境ごとアプリケーションを自動デプロイしてみた



どうも、アイアンマン好き千葉です。

今日は、OSごとアプリを自動的にデプロイする構成を作って見たので記事として残しておきます。
備忘録的意味合いが強いので、結構省略するかもしれません。

またブルーブリーンデプロイができない、１コンテデプロイしかできないので、柔軟性はとっても低いです。(もっと良いやり方ある！とかあれば、コメント頂けると嬉しいです。)

ただしGitHub、Docker、Jenkinsを知らない人は勉強にはなるのではないかと思います。

Dockerの初心者の方は、[こちら](http://qiita.com/iron-breaker/items/6b74fe9b0620b74d4281)をみるとライフサイクルがわかるのでなんとなくイメージが出来るようになるかも知れません。

# 構成図

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/33834/24ab3d87-5739-cb3d-1144-a7a7c56ebd84.png "名称未設定.png")

※今回は、Dockerコンテナ、JenkinsはAWS上で動作させてます

# GitHub環境の構築
環境の準備は[こちら](http://qiita.com/iron-breaker/items/6da9e0f1af0b4c2c1cfa)を参考に。

# GitHubとDockerHubの連携
GitHubとDockerHubを連携します。
※どちらも、アカウント作成している前提でお話します。

1. Add RepositoryからAutomated Buildを選択します。

![スクリーンショット 2015-01-16 0.38.37.png](https://qiita-image-store.s3.amazonaws.com/0/33834/b663f08a-9b28-9bd4-919e-76755428de28.png "スクリーンショット 2015-01-16 0.38.37.png")

2. GitHubを選択
![スクリーンショット 2015-01-16 0.42.16.png](https://qiita-image-store.s3.amazonaws.com/0/33834/c5505f7a-dec4-eb9d-c261-ca94bb9bde57.png "スクリーンショット 2015-01-16 0.42.16.png")

3. あとは、登録したいGitHubを設定

これで、GitHunにDocerfileをコミットすると、DockerHubで自動的にBuildが実行されます。

# Jenkinsの設定
1. EC2インスタンスを作成して、Jenkinsをインストールします。
2. Jenkinsにアクセスしてジョブを作成します。

ジョブは、以下のシェルを登録します。

```:bash
#!/bin/sh

sudo docker ps | grep [コンテナ名]
result=`echo $?`

if [ ${result} -eq 0 ] ; then
sudo docker stop [コンテナ名]
sudo docker rm [コンテナ名]
fi

sudo docker images | grep '[イメージ名]'
result=`echo $?`

if [ ${result} -eq 0 ] ; then
sudo docker rmi [イメージ名]
fi

sudo docker pull [イメージ名]:latest
sudo docker run -d  -p 80:80 --name [コンテナ名] [イメージ名]
```
3. Jenkinsでsudoが実行できるようににてsudoers実行を許可します。

4. Jenkinsでリモート実行できるように設定
jobのconfigureから、ビルドトリガの項目で、リモートからビルドを選択します。
そして、認証トークン名を入れます。
※確か、Jenkins上でユーザ作成やクレデンシャルの発行をしないとリモートからビルドの選択肢が表示されません

# DockerHubとJenkinsの連携

## DockerHubにwebhook設定
DockerHubでのBuildが成功したら、Jenkinsに設定しているJobを実行できるようにします。
やりかたは、DockerHunの先ほど作成したレポジトリを選択して、JenkinsのURLを設定します。

![スクリーンショット 2015-01-16 0.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/33834/b72fc9fd-b9cb-3142-4fd4-34ca0150f690.png "スクリーンショット 2015-01-16 0.46.41.png")

URLはこんな感じで設定しました。

http://[JenkinsIPアドレス]:8080/job/[ジョブ名]/build?token=[認証トークン]

# で、DockerfileをGitHubへプッシュ

因みに、今回私が作成したDockerfile

```
FROM centos:centos6
MAINTAINER XXXXX <xxxx@gmail.com>
RUN yum update -y
RUN rpm --import http://nginx.org/keys/nginx_signing.key
RUN yum install -y http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN yum install -y nginx
RUN yum install -y tar
ADD app.tar.gz /usr/share/nginx/html/
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
```
※app.tar.gzにhtml等を入れて、Dockerfileと同じ階層に配置しておきます
これで、アプリも含まれた形でイメージが作成されます。

プッシュします。

```
# git add .
# git commit -m "comment"
# git push origin master
```


すると、
* DockerHubでBuildが始まり
* Build完了後にWebhookのURLをリクエスト
* Jenkinsでジョブが実行される
* DockerHubから、イメージをダウンロードしてコンテナ起動

という流れで実行されます。

# まとめ
Dockerのポータビリティ性を使って、インフラをアプリ感覚でデプロイ出来ました。
今までの、ハード調達して、データセンター借りて.......

という時代は終わり、使いたいときに使って、使った分だけ料金を払う。
そして、インフラはアプリ感覚でデプロイ運用していく時代になっていく感じがしました。

アプリリリースの時間短縮、開発工数の削減、運用工数の削減になると感じました。
yumのBaseリポジトリを理研ミラーリポジトリに変更（CentOS 6）

Baseリポジトリが海外サイトとなる為、理研ミラーリポジトリに変更し、速度改善を図る。

mirrorlistをコメントアウトする。
`mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
`

次にbaseurlを追加する。
`baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
`


以下は設定内容（全文）

```
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
```
vimの基本的なコマンド（初級）

vimを使う上で、先ずは覚えたほうが良いコマンド

#編集モード
i：カーソル位置に追加
a：カーソルの次の位置からテキストを追加
A：行末に追加
o：カーソルの下の行が開き、挿入モード
R：1文字以上を置き換える

#削除
dw：カーソル位置から単語の末尾までを削除
daw : 単語単位で削除
d$：カーソル位置から行の末尾までを削除
dd：行全体を削除

#移動
0：行の先頭に移動
gg：先頭行に移動
G：ファイルの最下行に移動
数値 G：指定行に移動
%：対になる文字に移動（(,),[,],{, もしくは }）

b：左隣の単語の先頭へ飛ぶ（back-word）。
B：スペースで区切られた左隣の単語の先頭へ飛ぶ。

w：右隣の単語の先頭へ飛ぶ（word）。
W：スペースで区切られた右隣の単語の先頭へ飛ぶ。

e：単語の末尾へ飛ぶ。

H：画面最上行の左端へ飛ぶ。
M：画面中央行の左端へ飛ぶ。
L：画面最下行の左端へ飛ぶ。


(：現在の文の先頭に飛ぶ。
)：現在の文の文末に飛ぶ。

{：現在の段落の先頭に飛ぶ。
}：次の段落の先頭に飛ぶ。

[[：前の段落に移動。
]]：次の段落に移動。

#取り消し
u：前回の動作を取消
U：行全体の変更を取消

#変更
cw：カーソル位置から単語の終わりまでを変更
c$：カーソル位置から行の終わりまでを変更

#検索
/ 語句：前方に語句を検索
? 語句：後方に語句を検索
n：同じ方向の次の検索
N：逆方向の検索
CTRL-O：場所を前に移動
CTRL-I：場所を次に移動

#変換
Vu：現在の行の文字を小文字にする。
VU：現在の行の文字を大文字にする。

#置換
：s/old/new：現在行の最初の old を new に置換
:s/old/new/g：現在行の全ての old を new に置換
:#,#s/old/new/g： 2つの # 間で語句を置換
:%s/old/new/g：ファイルの中の全ての検索語句を置換
:%s/old/new/gc：'c' を加えると置換の度に確認

#コピー
yy：行コピー
yw：単語コピー

#ファイル管理
:e . ：ファイルエクスプローラを開く
:Sex ：ウインドウを分割してファイルエクスプローラを開く
gf：カーソル位置にある名前のファイルを開く。

#ウィンドウ
:new [{file}]：ウィンドウを横方向(上下)に分割し、新しくできたウィンドウで新ファイルの編集を開始する(new)
:vne [{file}]：ウィンドウを縦方向(左右)に分割し、新しくできたウィンドウで新ファイルの編集を開始する(vnew)

:sp [+{command}] [{file}]：ウィンドウを横方向(上下)に分割し、新しくできたウィンドウで{file}を開き、直後に{command}を実行する(split)
:vs [+{command}] [{file}]：ウィンドウを縦方向(左右)に分割し、新しくできたウィンドウで{file}を開き、直後に{command}を実行する(vsplit)

CTRL-W w：カーソルを次のウィンドウに移動する
CTRL-W h：カーソルを左のウィンドウに移動する
CTRL-W j：カーソルを下のウィンドウに移動する
CTRL-W k：カーソルを上のウィンドウに移動する
CTRL-W l：カーソルを右のウィンドウに移動する

#コード補完
C-n or C-p：補完
C-e：キャンセル

#コマンド補完
CTRL-D：コマンド一覧を表示
TAB：補完

#ビジュアルモード
v：

#複数行をコメントアウト
①ctrl + v ビジュアルモード
②カーソル行から移動して範囲を作る（反転する）
③I　大文字のi
④# 何か一文字。ここではコメントアウトするので#
⑤Esc

#設定
set 'ic' 'ignorecase' 検索時に大文字小文字の区別しない
set 'is' 'incsearch'  検索フレーズに部分マッチしている部分を表示する
set 'hls' 'hlsearch'  マッチするすべを強調表示する
※無効にする場合は"noic"とする。

#ヘルプ
:help：ヘルプ
CTRL-]   該当項目に移動
CTRL-t   前の位置に戻る

#インサートモード
<Backspace> ：テキスト削除
C - h ：テキスト削除
C - w ：テキスト削除
C - u ：テキスト削除
【Windows8.1】Cドライブの空き容量が少ない時の対策

仕事用の**Windows8.1 のCドライブの空き容量が少なくなってきた**ので対策を講じてみました。

lenovo の PC なのですが、あろうことにもCドライブが100GB 。

そいつにうっかり「**Visual Studio**」をインストールしてしまいました。

まだプロジェクト途中なので、できれば再インストールは避けたい。

パーティションで調整しようにもCドライブのパーティションの両サイドに「**回復パーティション**」なるものが陣取っておりそいつが弄れない。

空き容量 2GB ……。

Dドライブは 300GB 以上空いている。む〜〜〜ん。

まずはお約束の

##hiberfil.sys の無効化と pagefile.sys の移動
Windows8.1 では**hiberfil.sys** の無効化は非推奨なのですが、あとでまた有効にするとして一旦無効化。

面倒くさいのでコマンドプロンプトで、

```
powercfg.exe /hibernate off
```
また有効にする時は、

```
powercfg.exe /hibernate on
```
でおｋ。

次に **pagefile.sys**。

本当は削除してしまいたいのだが、メモリが貧弱なのでDドライブにお引っ越し。

しかし、Windows 8以降のインタフェースにはまだ慣れていない。

場所がわからないので、「**システム**」で検索して開く。
![win8.1_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/bf1c7dab-9cec-1877-4375-e51ef3ffd2cb.jpeg)
それから「**システムの詳細設定**」で「**詳細設定**」のタブを選択し、
![win8.1_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/cf98252b-6575-880b-4e15-3d919b4a40fa.jpeg)
それから「**システムの詳細設定**」で「**詳細設定**」のタブを選択し、
![win8.1_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/13b38f26-bac8-9abf-2779-dcddb1b53202.jpeg)
また「**詳細設定**」のタブを選択し、仮想メモリを「**変更**」。（深いよ…）
![win8.1_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/381280e3-d9db-87d3-e813-4114175d9a28.jpeg)
「**すべてのドライブのページング ファイル云々**」のチェックボックスを外し、Dドライブに「**システム管理サイズ**」で「**設定**」し、Cドライブは「**ページング ファイルなし**」に「**設定**」する。

あとは「**OK**」を連打しながら小窓を閉じていく。

これで10GB ほどに空き容量が増えた。

でもまだまだやばい。

次いでいきなり荒技。
##ユーザディレクトリの移動
*ここからは決して推奨いたしません。
お試しになる方は自己責任でお願いします。*

**シンボリックリンク**を使います。

下準備として「**ディスククリーンアップ**」しておきます。

ちなみに「**ディスククリーンアップ**」の所在地は、
「**コントロールパネル**」→「**システムとセキュリティ**」→「**管理ツール**」→「**ディスク領域の解放（もしくはディスククリーンアップ）**」です。

探すのに疲れました。

次にバックアップ用のユーザアカウントを作成して管理者権限を与えておきましょう。

「**PC設定**」→「**アカウント**」→「**その他のアカウント**」で、

「**アカウントを追加する**」を選びます。

「**このユーザのサインイン方法**」では、一番下の、

「**Microsoft アカウントを使わずにサインインする（お勧めしません）**」を迷わずクリック。
それでもしつこくMicrosoft アカウントを勧めてきますので、負けずに「**ローカルアカウント**」を選択します。

これでようやくアカウントの入力画面が出てアカウントが追加できます。

追加したアカウントは「**編集**」で「**アカウントの種類**」を「**管理者**」にします。

いよいよ、システムファイルの操作に入ります。

追加したアカウントでセーフモードで再起動します。

セーフモードで再起動するには、「**Shift キーを押しながら『再起動』**」です。

わかんねーよ。そんなの。

一旦普通に電源が切れるように見えますが、その後「**オプションの選択**」画面が現れます。
![win8.1_05.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/74952b0f-ffc1-1037-c1a8-8b04f52ce1c1.jpeg)
「**トラブルシューティング**」→「**詳細オプション**」→「**スタートアップ設定**」で「**再起動**」をクリックします。
![win8.1_06.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/2f0b1dbc-a5b5-e479-8703-0b4768058b89.jpeg)
「**6**」キーを押して「**セーフモードとコマンドプロンプト…**」で起動します。

再起動したら、新規に追加した管理者アカウントでサインインします。

私が大好きっぽい画面で起動します。

おもむろに

```
move "c:\Users\ユーザ名" "d:\お好みのディレクトリ\ユーザ名"
mklink /D "c:\Users\ユーザ名" "d:\お好みのディレクトリ\ユーザ名"
```
でファイルの移動とシンボリックリンクの作成をします。

**シンボリックリンクの引数の順序がLinux などとは逆**なので注意です。

```
shutdown -r -t 10
```
でドキドキしながら再起動して、元のアカウントでサインインします。

無事ログインできたらおめでとう。

これでCドライブにかなり余裕が出来ました。

本当にこれで問題ないのかはわかりません。
実はまだ検証中です。

（さて…、AppData フォルダがでかいな……。）

##2016-01-18 追加
ユーザディレクトリを移動したWindows8.1のPCをWindows10 にアップグレードしました。
とりあえず問題なく動いているようです。（きっと保証外だと思います）