OmniAICreator/Qiita-1.07M huggingface dataset:
Gradleを使ってAndroidプロジェクトにKotlinを導入する

Android StudioやIntelliJ IDEAではGradleベースのプロジェクトを簡単に作成できて捗りますね。
私自身はAndroidアプリの開発にGradleを積極的に使っているので、GradleにおけるKotlinの導入方法について紹介させていただきたいと思います。

関連記事: [KotlinでAndroidアプリをHello World!!](http://qiita.com/shoma2da/items/52567a7be21992c7abbf)

この記事の通りに設定がされていることが前提で解説を進めていきます。

--

「New Project→Application Module」ではなく「New Project→Gradle: Android Application」でAndroidプロジェクトを作成します。

「File→Project Structure...」を選択します。すると次のようなウィンドウが表示されます。

![スクリーンショット 2014-02-03 午後10.16.52.png](https://qiita-image-store.s3.amazonaws.com/0/15731/0820eeb4-3ef3-7923-3a03-60c07c095b73.png)

左の「Project Settings」から「Modules」を選び、モジュールとしてアプリ本体のモジュールを選択します（画像の例ではSample-Sampleモジュールを選択）。

![スクリーンショット 2014-02-03 午後10.20.33.png](https://qiita-image-store.s3.amazonaws.com/0/15731/318c5d8e-aecf-5791-42bd-72e66f4a7187.png)

`src/main`ディレクトリ直下に`kotlin`ディレクトリを作って「Sources」としてマークします（マークするとディレクトリのアイコンが青くなります）。

![スクリーンショット 2014-02-03 午後10.23.29.png](https://qiita-image-store.s3.amazonaws.com/0/15731/527e2938-54de-32c3-dafb-62cc7debee58.png)

「OK」ボタンをクリックしてウィンドウを閉じます。
先ほど作った`kotlin`ディレクトリの下に任意のKotlinソースファイルを作成します。
ファイルを作成すると次の画像のように右上に「Configure Kotlin」というタイトルのポップアップが表示されるので「as Kotlin (Android with Gradle) module」をクリックします。

![スクリーンショット 2014-02-03 午後10.25.36.png](https://qiita-image-store.s3.amazonaws.com/0/15731/23d4e02f-e1ca-b07e-dd50-83aa5164616b.png)

ダイアログが表示されるので「OK」をクリックします。
するとあら不思議！Kotlin導入に必要な記述が`build.gralde`に自動的に追加されます。
これでプロジェクトでKotlinが使えるようになります。
Powerlineを導入するときに詰まったとこ

イケてるシェルにしようとPowerlineを入れようとして詰まったところをメモ。

["powerlineとSourceCodeProで簡単につくれるキレイな開発環境" @ta9to](http://qiita.com/ta9to/items/4a8026fff7e177736060)

このエントリを参考にしてやってみたけどフォントにパッチをあてる所で詰まった。
`Powerline`のリポジトリから`fontpatcher.py`がremoveされてた。

コミットログを遡ってremoveされる前のやつを見つけた。

[powerline/font/](https://github.com/Lokaltog/powerline/tree/4a0b7e2950ea58e4c6141a30f2b6fedbec642a24/font)

ここから`fontpatcher-symbols.sfd`と`fontpatcher.py`をダウンロードしてフォルダに入れて実行したところパッチをあてれた。

あとは手順通り。

## もっと楽な方法あった

Powerlineでシェルの見た目を変えたいだけならgitだけで完結するやり方があったので別エントリでまとめようと思います。
3分くらいでサクッと入れられるはず。
WindowsにGitをインストールした後にやっておくべき設定

## alias 登録
```
git config --global alias.st status
git config --global alias.df diff
git config --global alias.dft "difftool --dir-diff"
git config --global alias.co checkout
git config --global alias.cm commit
git config --global alias.br branch
```

## 外部Diff/Mergeツール設定
Winmergeをインストール
  バックップフォルダを設定
  
  - c:\bakcup
  - c:\temp

Windows7、8環境では、.gitconfigはユーザディレクトリ直下に存在。

``` ~/.gitconfig
[merge]
	tool = winmerge
[mergetool "winmerge"]
	path = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\"
	cmd  = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\"
 [diff]
	tool = winmerge
	guitool = winmerge
[difftool "winmerge"]
	path = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\"
	cmd  = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" -e -ub -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\"
```

## Git Bash 外観の改善
- Console2をインストール
  1. Settings→TabsにGitを追加
  1. ShellはGitBashのパラメータママ
  1. Startup dir を作業ディレクトリにする
  1. Settings→ConsoleでGit用の色を見やすく変更
  1. Settings→Appearance→でフォント名をMSゴシックに変更
  1. View→ConsoleWindow→プロパティでフォントをMSゴシックに変更

- lsの文字化け対応
  `alias ls='ls --show-control-chars'`

- git コマンドでの日本語ファイル名文字化け(数値コードになる)対応
  `git config --global core.quotepath false`
Sublimeちゃんの設定系キーボードショートカット

こんにちは。yoshidaxです。

ぼくがよく使うSublimeちゃんの設定系キーボードショートカットを紹介します！！

## ユーザーセッテイングを開く

まずはSublimeちゃん自体の設定ファイルを開くショートカットです。

``⌘+,``

コマンドパレット(``⌘+SHIFT+P``)からも開けますがこっちは一発です。

ちなみにこのショートカットはMacアプリ共通の汎用的なショートカットなので他のアプリでもやってみましょう！！

## プラグインの深すぎる設定を開く

コマンドパレットに上がってこないプラグインの設定ってありますよね。

そういうのは``Sublime Text 2``-``Preferences``-``Package Settings``-``プラグイン名``-``なにかしらの設定``とかメニュー階層深すぎるんじゃい、こりゃ！！なところに設定があったりしてカスタマイズ意欲も減退してしまいます。

そういうときは

``⌘+SHIFT+/``でメニュー検索ボックスを開いてプラグイン名を入力して選択！！

幾分楽に選択できますね！！幾分。

ちなみにこのショートカットもMacアプリ共通の汎用的なショートカットでした！！

![02.png](https://qiita-image-store.s3.amazonaws.com/0/31639/6c598cf5-0c2e-f5cf-3034-28258cf11611.png)

## プラグインのREADMEファイルを開く

プラグインの格納場所なんていちいち覚えてないし覚えたくないので

``⌘+SHIFT+P``でコマンドパレットを開いて``pcl``で``Package Control: List Packages``を選択

![01.png](https://qiita-image-store.s3.amazonaws.com/0/31639/8d019cd2-49da-e34f-7dfe-d858755948d2.png)

リストアップされたプラグインをさらに選択します。

するとプラグインディレクトリを開いた状態でFinderが立ち上がりますね！！
幾分面倒くさくなくREADMEファイルにありつけました！！

ということで今日はここまで！！
Pro Gitを使ったGitハンズオン勉強会のTips#2

[前回のGit勉強会]に引き続き、１月２０日に北海道旭川市で２回目の[Pro Git]ハンズオンGit勉強会を開催しました。同じように[Pro Git]を使ったハンズオン勉強会を地方で（例えば[北見市]とか）計画されている方のために、勉強会Tipその他をメモしたいと思います。前回に引き続き、今回も予定通りに進みませんでした。

## 内容

- [前回の復習]
- [Chapter3 Gitのブランチ機能]

やはりというか、Gitは奥が深いので、２時間がアッという間に過ぎます。`git-branch`, `git-merge`, `git-rebase`について深く突っ込んで勉強する予定でしたが、`git-rebase`に関してはほとんど手が付けられませんでした。また、予定していた練習問題にも手が付けられませんでした。

### [前回の復習]

前回の宿題、`git add -p`について、少し時間を使って復習をしてみました。変更ある箇所の一部だけステージするって面倒な作業ですが、うまくコミットヒストリーを作るのに必要になります。
これについては動画を作ってみました。<http://www.youtube.com/watch?v=9T82aJCFiIQ>

### [Chapter3 Gitのブランチ機能]

#### [3.1 ブランチとは](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%81%AF)

このチャプターで`HEAD`の概念が明確になります。この辺りは、どんどん読み進めてしまいました。

#### [3.2 ブランチとマージの基本](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC)

わざとコンフリクトさせるようなヒストリを作って、実際に試してみた。僕の`git-merge`の理解が浅いため、コンフリクトすると思ったらしなかったりして、失敗したりもするアクシデントがありました...
マージの仕方や、`git-stash`の使い方などを実践していきました。

### 気付いた点・反省点

#### 百聞は一見に如かず

学生の参加者が、

> 僕、`git stash apply`と`git stash pop`の違いがわかりません！

と言ってきました。`git-stash`の実演をスクリーンに映してしていたのですが、彼だけ見ていなかったようです。単純な違いですし、ほかの全員は理解しているので、全員で一人ずつ説明を試みました。それぞれ違うアプローチで説明を試みました。しかし...

> `git stash apply`と`git stash pop`の違いが、まだ分かりません！

という答えが帰ってきました。これは、なかなか考え所だと感じました。ソフトウェアというのは抽象的で理解がなかなかできないものです。何故ならソフトウェアは目に直接見えないものなので、自分の頭で想像しなければならないからです。エンジニアはその難しい概念的なものを専門用語を使わずに、わかりやすく説明する能力が必要されていると思います。`apply`と`pop`の違いは簡単なものなので、理解できるように説明できなかったことには残念です。

ただし、これは抽象的な概念ではなく、かなり具体的に示せるものなので、たいした問題ではありませんでした。実際に`stash`されたキャッシュを`apply`した場合と、`pop`した場合それぞれ、もう一度実演しました。もちろん、彼はそれを見て瞬時に理解に到達しました。

```
GIT-STASH(1)                                     Git Manual                                     GIT-STASH(1)

NAME
       git-stash - Stash the changes in a dirty working directory away

SYNOPSIS
       git stash list [<options>]
       git stash show [<stash>]
       git stash drop [-q|--quiet] [<stash>]
       git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
       git stash branch <branchname> [<stash>]
       git stash [save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
                    [-u|--include-untracked] [-a|--all] [<message>]]
       git stash clear
       git stash create [<message>]
       git stash store [-m|--message <message>] [-q|--quiet] <commit>
```


## まとめ

今回は４人で勉強会をしたのですが、４人が最小限の人数かなと感じました。ということは地方でも４人、Gitハンズオンをしたい有志を見つければ勉強会開催が可能！

[前回のGit勉強会]: http://qiita.com/smagch@github/items/4e9cb00520ba78767e22
[Pro Git]: http://git-scm.com/book/ja
[北見市]: http://ohotech.info/
[前回の復習]: #fukusyu
[Chapter3 Gitのブランチ機能]: #chapter3
CanvasとPHPによるネタ画像ジェネレータ


## 概要
[@betahikaru](https://twitter.com/betahikaru)作っている「動物はあなたのごはんじゃない」ジェネレータの中身をメモします。

* 「動物はあなたのごはんじゃない」ジェネレータ
http://betahikaru.com/notfood/index.html

* 元ネタ
http://www.hopeforanimals.org/

* 参考（Togetter）
http://togetter.com/li/623016

## 機能
* 「動物はあなたのごはんじゃない」とか「Animals are not …」とかの文字列を変えた画像を作れる。
* ベースの色を変更できる。
* URLで差し込む画像を指定できる。
* 差し込む画像の位置を調整できる。
* 画像を保存できる。（右クリックorスマホなら長押し）

* 作成例
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/11662/91c34f6f-0213-8292-41f1-f85b2ded521b.png "ダウンロード.png")

## 動作環境
* Mac
  * Chrome 32.0.*
  * Safari 7.0.*
* iOS7
  * Chrome for Mobile (2014/2/5時点)
  * Moblie Safari
* Windows
  * 動作環境なくて未確認。Windows Server 2008 R2 の IE11 で、画像がCavnasに描画されていないことは分かっているが…。

## 処理内容
* ユーザが入力した文字列を、canvasに描画する。
* 指定URLの画像を単色化（適当）し、canvasに描画する。
* canvasの内容をimgタグに書き込み、右クリックで保存可能にする。
* おまけ：canvasの内容からDataUrlを生成し、DataUrlからファイルを生成する。

## 苦労した点
### 言語
いままで仕事以外でWebアプリ的なのを作ってこなかったので、色々素人に近い状態で大変だった。
RORの環境構築はつらいし、CakePHPとかも勉強してないので、素のPHPで実装したが、すごく面倒だった。

### 使い勝手
非常に悪いです。どうすれば使いやすいだろうか。

### セキュリティ？
Canvasに外部サイトの画像を取り込もうとしたら、cross-originなんちゃらのセキュリティエクセプションが発生した。
仕方ないので、PHPで一旦サーバ上にファイルをダウンロードする形式にした。
現在、ファイルを削除する手段がＳＳＨしかないので、攻撃しないでね☆

### 宣伝
あと、Twitterで自分のつぶやきにハッシュタグをつけても、ハッシュタグの検索結果一覧に出てこない。
なぜだろう。

## 野望
現在は画面上に表示したimgタグを右クリックなりで保存させる形にしているが、
AWSのS3に画像を保存するようにしたい。
※APサーバを冗長化できるように。
※鋭意作成中。
node.jsをnvmでChefる

単語を助動詞でつないだだけのタイトルですが、お察しの通り、node.jsを`nvm`でバージョン管理するレシピを書こうと思った訳です。昨日、`rbenv`のレシピを書いたので、その続き。同じ構成でまとめておきたいなと。
Cookbookは[Github](https://github.com/kenji0x02/chef-nvm)においております。

## リファレンス

1. [VagrantとChef SoloでNode.jsの開発環境を作る](http://kb1111.blogspot.jp/2013/07/vagrantchef-solonodejs.html)

ぐぐってみても、ほとんど見つからなかったんですが、こういう構成はあまりニーズがないのかな。。。「Chefでサーバ作って壊す」っていうのを繰り返すことを考えると、確かにバージョン管理の必要性ってあんまりないのかも、、、現場はどうなのか興味あるなー（素人なもので。。。）

## レシピ

今回はあまり苦労せずにできましたー
`rbenv`と同じく、システム全体に`nvm`をインストールする感じで、レシピの構成も`rbenv`に合わせました。

```rb
git "/usr/local/nvm" do
  repository "git://github.com/creationix/nvm.git"
  reference "master"
  action :sync
end

template "/etc/profile.d/nvm.sh" do
  source "nvm.sh.erb"
  mode 00644
end

# nvm listしたときにalias/ディレクトリがないとおこられるので、、
directory '/usr/local/nvm/alias' do
  action :create
end

bash "install nodejs" do
  code <<-EOC
    source /usr/local/nvm/nvm.sh
    nvm install #{node['nodejs']['version']}
  EOC
  # ここにnodeの本体がいる
  creates "/usr/local/nvm/#{node['nodejs']['version']}"
end
```    
## テンプレート

ノードで定義したバージョンを使うようにしました。
あと、いろいろメッセージがでるのでゴミ箱に捨てて受け流すようにしましたw

```rb
source /usr/local/nvm/nvm.sh
nvm use <%= node['nodejs']['version'] %> >/dev/null 2>&1
```


今までシェルで書いていたサーバ構築をシェフってるんですけど、まだまだたくさんあるな、、、
和布蕪とかどうすんの？？
AWS EC2ログイン用の秘密鍵を無くした

PCが故障した際に、秘密鍵を無くしたけどどうしよう。
って聞かれたので調べてみたメモ。

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html
>秘密キーをなくした場合は、新しいキーペアを作成し、インスタンスを起動して接続できるように必要があります。


要は

* 新しいKey Pairを作り
* 秘密鍵を無くしたEC2インスタンスのAMIを作って
* AMIからEC2インスタンスを作成する際に、新しいKey Pairを適用する

ということらしい。


動的なデータをEBSにちゃんと乗せる＆Scale outしておかないと、サービス断を伴いそうね。
鍵はちゃんと管理してバックアップも取りましょう。


では手順。


## 新しい鍵を作ろう
　　AWS Management Console -> EC2 -> NETWORK & SECURITY -> Key Pairs
　　
を開いて

　　Create Key Pairボタン

を押して鍵を作る

## 無くした鍵を使用しているEC2インスタンスのAMIを取得しよう
　　AWS Management Console -> EC2 -> INSTANCES -> INSTANCES

を開いて

　　対象のEC2インスタンスを右クリック -> Create Image 

を押してAMIを取得


## 取得したAMIから新しいEC2インスタンスを作成し、新しい鍵を紐付けよう
　　AWS Management Console -> EC2 -> INSTANCES -> INSTANCES

を開いて

　　対象のEC2インスタンスを右クリック -> Create Image 

を押してAMIを取得


## 取得したAMIから新しいEC2インスタンスを作成し、新しい鍵を紐付けよう
　　AWS Management Console -> IMAGES -> AMIs

を開いて

　　対象のAMIを右クリック -> Launch

を押してAMIからEC2インスタンスを作成
すると、EC2インスタンス作成ウィザードを通して、好きな鍵を紐付けることができます。


あとはうまーーいことS-inさせてあげましょう。
そして鍵を無くしたインスタンスはS-outして破棄しちゃいましょう。


以上、よろしくお願いいたします。
gitlabへのpush時に「does not appear to be a git repository」と表示されるときの対策


# 現象
gitlabへのpush時に以下のエラーが出てpushできない。
gitlabのバージョン：6-3-stable


```
$ git push -u origin master
fatal: 'username/test01.git' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
```

この時のoriginは以下のとおり。

```
git@gitlab.cadence:username/test01.git
```

以下のようにすればpushできるが、変なのでrepositoriesなしでもpushできるようにしたい。

```
git@gitlab.cadence:repositories/username/test01.git
```

# 原因
以下のサイトによればgitlabの設定前に公開鍵が~/.ssh/authorized_keysに設定されていると発生する。
確かに[AnsibleでGiltabを構築する](https://github.com/volanja/ansible-Gitlab)では公開鍵を登録していた。。

[gitlab public wiki - Could not read from remote repository](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Trouble-Shooting-Guide#wiki-could-not-read-from-remote-repository)


# 解決策
gitlab用の公開鍵・秘密鍵ペアを作成する。

* 公開鍵・秘密鍵を作成  
  
```bash
$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa): /Users/xxx/.ssh/id_rsa_gitlab
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/xxx/.ssh/id_rsa_gitlab.
Your public key has been saved in /Users/xxx/.ssh/id_rsa_gitlab.pub.
The key fingerprint is:
xxxx
The key's randomart image is:
xxxx
```
  
* gitlabへの公開鍵の登録  
Profile settings > SSH Keys > Add SSH Keysで登録する。

* ~/.ssh/configの編集
鍵を指定してアクセスするように~/.ssh/configを編集する。  

``` ~/.ssh/config
Host gitlab.cadence
  User git
  Port 22
  Hostname gitlab.cadence
  IdentityFile ~/.ssh/id_rsa_gitlab
```

* git設定ファイルの編集
リポジトリ毎などの設定に合わせて編集する。

```.git/config
[remote "origin"]
    url = git@gitlab.cadence:username/test01.git
    fetch = +refs/heads/*:refs/remotes/origin/*
```  
  もしくは以下のコマンドでOK(というかこっちの方がわかりやすい)

```bash
$ git remote add origin git@gitlab.cadence:username/test01.git
```

以上
[Android]【Win/Mac】Android実機でAndroidデバッグを行なう方法　SHL22

よく忘れるので、メモ。
今までWindowsユーザーで最近Macを仕入れたので、Mac版も調べてみた。

##まず実機の設定
「設定」→　「アプリケーション」→「開発」→「USBでバッグ」をON

##【Macの場合】
1.Android実機をUSBで接続。
2.ダイアログで「USBデバッグを許可しますか？」と聞かれるので、「OK」を選択。
3.Android実機の「設定」→「開発者向けオプション」を「ON」にする。

以上

あとはEclipseを立ち上げ、何かサンプルアプリを実行すると、
実機を認識して、デバッグ用端末の選択欄に出てくるので、選択して実行すればOK！

Winユーザーからすれば、衝撃の簡単さ・・・。


##【Winの場合】

1. ADB USBドライバのインストールする。
URL：https://sh-dev.sharp.co.jp/android/modules/driver/
SHARP共通 ADB USBドライバをダウンロード →　解凍　→　ドライブ（C）直下など、設置
　　

2. スマホをデータ通信できるUSBでPCと接続。
3. 端末をUSBデバッグモードに設定する。
4. デバイスマネージャーを開く
ほかのデバイスーAndroid ADB Interfaceをクリック。
「ドライバーソフトウェアの更新」にて
コンピュータを参照してドライバーソフトウェアを検索します。を選択。
ダウンロードしたドライブのフォルダを指定してあげる。

5.次へ進む

6.このドライバーソフトウェアをインストールしますを選択。

7.インストールできたら完了。

あとはMac同様、Eclipseを立ち上げ、何かサンプルアプリを実行すると、
実機を認識して、デバッグ用端末の選択欄に出てくるので、選択して実行すればOK！
OpenSSH 6.2を使って公開鍵認証もLDAPで行いたい。

公開鍵認証もLDAPで行いたい。LDAPを使うと各サーバの認証情報を一元管理できるけど、公開鍵認証を行ってる場合、公開鍵も一元管理できると便利だ。OpenSSHはLDAPに対応していないので、[OpenSSH-LPK](https://code.google.com/p/openssh-lpk/)というパッチを当てて対応する必要があるんだけど、OpenSSH 6.2からはパッチを当てなくても良くなったと聞いてやってみることにした。

## Wheezy-backportsからDebian WheezyにOpenSSH 6.4を入れる

Debian WheezyのOpenSSHは6.0なので、Wheezy-backportsからインストールする。

```
$ sudo echo "deb http://ftp.jp.debian.org/debian wheezy-backports main" >> /etc/apt/sources.list
$ sudo aptitude update
$ sudo aptitude install -t wheezy-backports openssh-server
```

## AuthorizedKeysCommandを使う

`AuthorizedKeysCommand`にコマンドを指定することで、コマンドの実行結果をOpenSSHに公開鍵として渡すことができる。設定は次の様な感じ。

```conf:/etc/ssh/sshd_config
AuthorizedKeysCommand /usr/lib/ssh-command/find_key.sh
AuthorizedKeysCommandUser root
```

`AuthorizedKeysCommand`に指定するコマンドのパスには制限があり、root以外が書き込み権限のあるディレクトリなどに置かれているとエラーになる。

## LDAPから公開鍵を取得する

`AuthorizedKeysCommand`を使ってLDAPサーバから鍵を取得する簡単なシェルスクリプトを書いた。sedだけでがんばろうとしたけどあきらめてRubyを使った。LDAPのパスワードはlibnss-ldap.secretに書いているものを使っている。

```bash:/usr/lib/ssh-command/find_key.sh
#!/bin/bash

uri=ldap://10.0.XXX.XXX/
binddn="cn=admin,dc=harukasan,dc=jp"
bindpw=$(cat /etc/libnss-ldap.secret)
base="dc=harukasan,dc=jp"
uid=$1

ldapsearch -LLL -H ${uri} -w "${bindpw}" -D "${binddn}" -b "${base}" "(& (objectClass=posixAccount) (uid=${uid}))" "sshPublicKey" | ruby -e 'puts STDIN.read.gsub(/\n /,"").match(/sshPublicKey: (.+)/).to_a[1]'
```

## まとめ

OpenSSH 6.2の`AuthorizedKeysCommand`を使うと簡単に公開鍵を他のプロダクトから扱えて便利だ。こんなことよりもLDAPにスキーマを追加する方が大変だったんだけど、疲れたのでまた別の機会にしたい。別にLDAPに限らずRDBだったり外部サービスだったりいろんなものをバックエンドに使えると思う。
Knockout.jsのHelloWorldテンプレート

最近Knockout.jsを学習しだしたのですが、スクリプトを書いてローカルブラウザで挙動を確認するためのテンプレートを用意したのでアップします。
下記の `index.html`(名前はなんでもいいけど) をローカルPCに保存して、お使いのブラウザへドラッグすれば動きます。
（外部サイトのJavaScriptライブラリを直接参照してるので、ネットに繋がってる必要はあります。）

```javascript:index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
    //ViewModel
    function TestViewModel(){
        self = this;
        self.sample = "こんにちは世界！";
    }
    ko.applyBindings(new TestViewModel());
});
</script>
</head>
<body>

<span data-bind="text:sample"></span>

</body>
</html>
```

※JQueryは `$(function() {` のところで必要です。本来はHTMLファイルの最後に `ko.applyBindings()` を書かないといけないのですが、`$(function() {` はページのロード後に実行されるので、ここに `ko.applyBindings()` を書けばすっきりとHTMLの head エリアにスクリプトを書けるようになります。

## おまけ：初心者の学習の参考になるサイト

http://learn.knockoutjs.com/
http://kojs.sukobuto.com
http://www.aoharu-b.com/cgi/sk/2012/10/javascriptknockoutjs.html
vagrant で Ubuntu 起動中に “stdin: is not tty” ってエラーが出たとき


vagrant を使用して Übuntu を立ち上げようとしたら、ログにタイトルのメッセージが表示された。
メッセージは表示されたけど、正常にサーバーは起動したので大丈夫っぽいんだけど、気になったので調べてみました。

調べたらすぐ出てきたんだけど、備忘録として書いておきます。
https://github.com/mitchellh/vagrant/issues/1673

メッセージ出ても問題ないみたいですね。

```  転載
Yeah this is a known "thing." It is not really a problem because it doesn't really cause a problem. Actually, the reason this error message even appears is due to a bug in Ubuntu not checking whether stdin is a TTY, and just assuming it is.
```
NavigationControllerをコードから利用するときのメモ


色々と前提や基礎がまだまだなので大変ですが、とりあえずNavigationControllerをコードから利用して、シンプルなTableViewとDetailViewみたいな構成で作りたいものが作れたのでそのメモ。

## 前のビューに戻る

別のViewControllerを使って遷移した際、そのViewControllerの制御から元のViewControllerに戻りたい場合、遷移先（destinationViewcontroller的な）で`dismissViewControllerAnimated:completion:`メソッドを呼ぶと、前のViewControllerの処理に戻ることができる。

```
[self dismissViewControllerAnimated:YES completion:nil];
```

## ナビゲーションバー周りの設定など
なにをどう設定したら、というのが結構分かりづらかったのでまとめメモ。

### iOS7のナビゲーションバーの背景色を変更する
navigationContoroller.navigationBarの背景を変えてもダメ。
iOS7では`barTintColor`を変更する必要がある。
（iOS7以前ではプロパティがなくてエラーになるので注意）

```objc:nav-bg-setting.m
// ナビゲーションバーの背景色を赤に設定
UINavigationBar.appearance.barTintColor = UIColor.redColor;
```

```objc:nav-text-setting.m
// ナビゲーションバー上の「戻る」ボタンなどの色を変更する
UINavigationBar.appearance.tintColor = UIColor.whiteColor;

// タイトルの色を変更する
UINavigationBar.appearance.titleTextAttributes = @{NSForegroundColorAttributeName: UIColor.whiteColor};


// 以下の方法でもいける
viewController.navigationController.navigationBar.barTintColor = UIColor.redColor;
viewController.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: UIColor.whiteColor};
```

## NavigationBarにボタンを設置する

最初勘違いしていたが、`navigationItem`に設定する項目は、親のUINavigationViewControllerのナビゲーションバーに項目を設定する、という意味。
どういうことかというと、以下のようにUINavigationControllerを生成して、それの`navigationItem`にボタンを設定しても表示されません。
なぜなら、親（があるなら）の`navigationItem`に設定しようとしているのであって、自分自身の`navigationBar`ではないからです。

```objc
UIViewController *aViewController = [[UIViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:aViewController];

// navigationControllerの`親の`navigationItemに設定しようとしている
navigationController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] init];
```
expressのバージョンの上げ方(npm)


調べても出てこなかったのでどうやるんだろーと思ってたら，express単体ではなくnpmコマンドで出来るみたいですね．

##プロジェクト内のパッケージ
```npmアップデート
$ npm update
```
しばらく待つと完了します．これ，色々なパッケージを最新にするみたいなのでexpressだけをアップデートしたい場合には

```
$ npm update express
```
にしましょう．

##グローバル設定
プロジェクト内に限らずパッケージを更新したい場合は `-g オプション`を付けましょう．

```
$ npm update -g
```
これで全てのパッケージがアップデートされます．


##確認

```expressのバージョンの調べ方
$ express --version
3.4.8
```
これで現時点での最新のものが入りました．
How to fix the problem that input source's not displaying Japanese, Chinese nor Keyboard Viewer

OSX 10.9 introduced new input source window, which belongs to keyboard preference, not language.
In that screen, you can add IME or keyboard layout via + button.
But, I met the issue: when I press + button, I see English etc but not Japanese nor Chinese.
After I investigated, it has found that `/System/Library/Input Methods` is not recognized at all.

After searching, I found this article: https://groups.google.com/forum/#!topic/chinesemac/YfVHvGA0WEA

So, **removing /System/Library/Caches/com.apple.IntlDataCache.*** (`sudo rm /System/Library/Caches/com.apple.IntlDataCache.*`) worked like the charm.

検索用：OSX 10.9 Mavericksにおいて、入力ソースの追加画面で、英語などは追加できるが、日本語や中国語はおろかキーボードビューアも一覧に出てこない
Yeoman で haml

`yo angular --coffee` してから、 [grunt-haml](https://github.com/concordusapps/grunt-haml) 使って haml 書けるようになるまで。

# つまり

こんな感じ
https://github.com/mtsmfm/angular_sample/commit/07d05ae26ef1d51580a52d2b933b03cbba6a79cb

# 手順

## 依存に grunt-haml を追加する

```
npm install grunt-haml --save-dev
```

## grunt-haml を使えるようにする

Gruntfile.js に次の行を追加 (`module.exports = function(grunt) {` の中)

```js
  grunt.loadNpmTasks('grunt-haml');
```

## 起動時に haml からコンパイルするようにする

Gruntfile.js に次の行を追加

```diff
     grunt.task.run([
       'clean:server',
+      'haml',
       'bower-install',
       'concurrent:server',
```

## haml の変換設定を書く

Gruntfile.js に次の行を追加 (grunt.initConfig の中)

```diff
+    haml: {
+      one: {
+        files: {
+          'app/views/main.html': 'app/views/main.haml',
+          'app/index.html': 'app/index.haml'
+        },
+        options: {
+          language: 'ruby'
+        }
+      },
+    },
+
```

## haml を変更監視対象にする

Gruntfile.js に次の行を追加 (grunt.initConfig の watch の中)

```diff
       },
+      haml: {
+        files: ['<%= yeoman.app %>/{,*/}*.haml'],
+        tasks: ['haml']
+      },
       livereload: {
```
[AOJ] 色々な言語で降順ソート

[AIZU ONLINE JUDGE](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp) という会津大学提供のプログラミング問題提出＆採点サイトを見つけて楽しくなったので、色々な言語で問題を解いてみることにした。

言語は C++, python, php, sqlite3, common lisp の5つを選択。
普段使っている言語は C++ で、その他の言語はネットなどで調べながら書いた。

今回は 0001 [List of Top 3 Hills](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0001&lang=jp) という問題。

## 問題

### List of Top 3 Hills

山の高さをメートル単位の整数で表した 10 個のデータがあります。その 10 個のデータを読み込んで、その中で、高い順から３つ出力して終了するプログラムを作成して下さい。 

### Input

> 山の高さ１（整数）　
> 山の高さ２（整数）　
>     .
>     .
> 山の高さ１０（整数）　

### Constraints

> 0 ≤ 山の高さ ≤ 10000 

### Output

> 最も高い山の高さ
> ２番目に高い山の高さ
> ３番目に高い山の高さ

### Sample Input

> 1819
> 2003
> 876
> 2840
> 1723
> 1673
> 3776
> 2848
> 1592
> 922

### Output for the Sample Input

> 3776
> 2848
> 2840

とりあえずサンプル入力に対して正しい答えを返すものを書く。
どの言語でもソートは標準で入っているので自分でアルゴリズム書く必要は無かった。

## 回答

### C++

```cpp

#include <iostream>
#include <set>
using namespace std;
 
int main() {
 
  typedef std::multiset<int> MySet;
  MySet heightSet;
 
  for(int i = 0; i < 10; ++i)
  {
    int val;
    cin >> val;
    // set に要素を挿入すると自動的にソートされる
    heightSet.insert(val);
  }
 
  // 大きい順にアクセスするために reverse_iterator を使う
  MySet::reverse_iterator rit = heightSet.rbegin();
  for(int i = 0; i < 3; ++i)
  {
    cout << *rit << endl;
    ++rit;
  }
  return 0;
}

```

STL の multiset コンテナを使うと要素挿入の際に自動ソートされるのでちょっとサボれる。

### python

```py

# 配列を作成
n = list()

for var in range(0, 10):
  # 標準入力から一行読み込み
  # int にキャスト
  n.append( int(raw_input()) )
  
# 配列を降順ソート
n.sort(reverse = True)
  
for var in range(0, 3):
  print n[var]

```

python だと短く書けるなと感動。


### PHP

```php

<?php
$hi = fopen('php://stdin', "r");
$ho = fopen('php://stdout', "w");

# 空の配列を作成
$arr = array();

# 標準入力からデータをセット
for($i = 0; $i < 10; $i++)
{
	fscanf($hi, "%d", $arr[]);
}

# 降順ソート
rsort($arr);

# 出力
for($i = 0; $i < 3; $i++)
{
	fwrite($ho, sprintf("%d\n", $arr[$i]));
}

fclose($ho);
fclose($hi);

```

変数に $ をつけるところを除けば c 言語に近い感覚。

### sqlite3

```sqlite3

-- テーブルの作成
create table tbl(height integer);

-- テキストファイルからデータを読み込む
.import data.txt tbl

-- 'tbl' から 'height' フィールドで降順ソートして 3 行読み込む
select * from tbl order by height desc limit 3;

```

sqlite3 で標準入力からレコードに情報を入れる方法が判らなかったのでファイルから読んでます。

### Common Lisp

```cl

;; 標準入力から n 回受け取ってリストに追加
(defun input (lst n)
	(cond
		((eq (length lst) n)
			lst
		)
		(t
			(input (append lst (list (read)) ) n )
		)
	)
)

;; リストの先頭 n 要素の部分配列を作成
(defun gettop (lst n)
	(if (or (= n 0) (null lst))
		nil
		(cons (car lst)
			(gettop (cdr lst) (- n 1))
		)
	)
)

(mapcar #'(lambda (x) (format t "~A~%" x))	; リストの要素を改行区切りで出力する
	(gettop
		(sort (input () 10) #'>)	; 標準入力からリストを作り降順ソートする
		3							; 先頭3つのリストを作成
	)
)

```

CommonLisp は手続き型に慣れた身からすると異質過ぎて凄い手間取った。
ls実行結果の最後を次のコマンドの引数として使うzshエイリアス

## 何をしたいか

特にログローテーションされている時によくやるコマンド。

```bash
$ ls -latr
-rw-r--r--   1 root apache    311 12月  4 05:20 2013 suexec.log-20131205
-rw-r--r--   1 root apache    232 12月 26 17:12 2013 suexec.log-20131227
(中略)
-rw-r--r--   1 root root      573  2月  3 05:32 2014 ssl_error_log
-rw-r--r--   1 root root     4227  2月  3 19:34 2014 error_log
-rw-r--r--   1 root root     7120  2月  3 19:34 2014 access_log
$ less access_log
```
とか、

```bash
$ ls -1
app.log-20140101.gz
app.log-20140102.gz
app.log-20140103.gz
(中略)
app.log-20140104.gz
app.log-20140105.gz
app.log-20140106.gz
$ zcat app.log-20140106.gz
```

何かと``ls``の結果の **最後の部分を次のコマンドの引数** にすることが多い。
**しかし特に後者の様な場合、入力補完があっても入力がめんどくさい。**
そこで楽に入力するためのzshグローバルエイリアスを書いてみた。
<br>

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


## 設定1 シンプルなカレントディレクトリの最新

``~/.zshrc``にでも追加。

```zsh
alias -g new1='${${(@f)"$(command ls -t)"}[1]}'
```

この場合、
``$ cat new1``とかすれば、 **new1の部分がカレントディレクトリの最新ファイル/ディレクトリに置き換わる。**
<br>


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


## 設定2 少しだけ汎用的にしたバージョン

設定1では、

* 先頭が「.」のファイル/ディレクトリが取れない。
* リストターゲットを絞れない。

そこで、もうちょっと改良。

* 前回の``ls``又は``ll``コマンドと **同じ引数でlsを実行し、その最後の出力** に置き換える。
* ``ls``のオプションは、``-a、-d、-c、-t、-r``が前回実行時にあれば、それを引き継ぐ。
* 実行結果から``.``と``..``は除く。

こうすると、 **『直前に実行したlsの最後の出力』** をそのまま次のコマンドに置き換えられる。
以下同様に``~/.zshrc``にでも追記。

```zsh
alias -g lsl1='$(__get_last_lsret)'
function __get_last_lsret(){
  local LSCMD CMD_PARTS RERUN CMD_ARGS RERUN_ARGS RES_LIST RES_LIST_L1
  for LSCMD in ${(@f)"$(fc -lnr -m "l[sl]*")"}
  do
    : ${(A)CMD_PARTS::=${(z)LSCMD}}
    if [[ ${CMD_PARTS[1]} == "ls" || ${CMD_PARTS[1]} == "ll" ]];then
      RERUN="command ls -1"
      shift CMD_PARTS
      for CMD_ARGS in ${CMD_PARTS[*]}
      do
        if [[ ${CMD_ARGS} == "-"* ]];then
          for OPT in c d t r a
          do
            if [[ ${CMD_ARGS} == *${OPT}* ]];then
              RERUN="${RERUN} -${OPT}"
            fi
          done
        else
          RERUN_ARGS="${RERUN_ARGS} ${CMD_ARGS}"
        fi
      done
      break
    fi
  done

  if [[ -n ${RERUN_ARGS-} ]];then
    RERUN="${RERUN} ${RERUN_ARGS}"
  fi
  RERUN="${RERUN} | grep -Ev '^(\.|\.\.)$'"
  : ${(A)RES_LIST::=${(@f)"$(zsh -l -c ${RERUN})"}}
  : ${(A)RES_LIST_L1::=${(z)${RES_LIST[${#RES_LIST[*]}]}}}
  echo ${RES_LIST_L1[${#RES_LIST_L1[*]}]}
}
```

この設定では、``lsl1``が前回ls実行時の最後の出力に置き換わる。

```bash
$ ll access_log*
-rw-r--r-- 1 root root   7120  2月  3 19:34 2014 access_log
-rw-r--r-- 1 root root  42989  1月 12 02:37 2014 access_log-20140112
-rw-r--r-- 1 root root 122341  1月 19 03:31 2014 access_log-20140119
-rw-r--r-- 1 root root  98802  1月 26 01:32 2014 access_log-20140126
-rw-r--r-- 1 root root  60190  2月  2 01:32 2014 access_log-20140202
$ less lsl1
(access_log-20140202が開かれる)
```

とか

```bash
$ ls -1tr
app.log-20140101
app.log-20140102
app.log-20140103
(中略)
app.log-20140104
app.log-20140105
app.log-20140106
$ vim -R lsl1
(app.log-20140106が開かれる)
```

あるいは日付がディレクトリになっているようなケースで

```bash
$ ls -1d 2014-01-*
2014-01-02/
2014-01-03/
2014-01-04/
2014-01-05/
$ cd lsl1
(2014-01-05に移動)
```

といったことが可能である。

## 出来ないこと

* 直前にカレントディレクトリ以外をlsしていると失敗する。
* ls -Rとかされると崩れる。
modern.IEのVMからホストで起動したgrunt-contrib-connectのサーバにアクセスする

多分、設定方法などを忘れると思うので書いておく。方法はこれ以外にもあるはずけど、一番楽だったので（これしか試してないが）これで良いのだ。

## ネットワークアダプタをブリッジにする

![network-setting.png](https://qiita-image-store.s3.amazonaws.com/0/5538/3738d808-4ddd-2b5b-9872-bb289ebb824b.png)

## Gruntfileにgrunt-contrib-connectの設定を書き加える

```coffeescript
module.exports = (grunt) ->

  grunt.initConfig
    connect:
      server:
        options:
          base: '.'
```

```diff
 module.exports = (grunt) ->
 
   grunt.initConfig
     connect:
       server:
         options:
           base: '.'
+          hostname: '*'
```

## ホストにアクセスする

`ifconfig`かシステム環境設定のネットワークか何かでIPを調べてVMのゲストOSからアクセスする。
図で見るgitでできること

# 目的
+ git でどんなことができるかをなんとなく感じてもらう
+ コマンドとか怖い人が「こんなことがやりたいんだけど」って質問できるようになると嬉しい
+ あと、最近周りでgit使ってみようかな！という人が増えてきたのでその人達のために！

## 図で見るgitでできること
1.指定したフォルダの状態を保存できる
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/18b0bc4f-52f4-5f45-4f17-e09658185213.jpeg)


2.フォルダの変更後の状態を保存できる
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/8d07d5be-0cec-3492-5176-4299c1b71cd7.jpeg)


3.状態間の差分の確認ができる
![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/78a2b142-c2cc-4af1-7a33-3e7f45199de8.jpeg)


4.なかったことにできる
![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/2941af24-9c25-1fd2-8803-0a296522f47c.jpeg)


5.もう一度変更後の状態を保存できる
![5.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/45612464-5747-5743-979d-a9956f5f8c89.jpeg)


6.変更後の状態を複数保存できる
![6.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/63863b0c-8297-ad00-35af-2ac8a9e6bd4b.jpeg)


7.その状態をまぜることができる
![7.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/3bde72c9-2f71-80b0-34b6-b08cc5da3ac6.jpeg)


7’.その状態をまぜることができる
![7-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/e4d6fb3d-033c-8263-cfd4-d9bfc94b7015.jpeg)


8.他の人がそれを丸ごとコピーできる
![8.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/e5587a4d-53b3-0a6f-ffd1-ad0517c8ee00.jpeg)


9.コピーにも変更点を保存できる
![9.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/7f746cba-99cb-c159-5b18-899ef67216c2.jpeg)


10.コピーの変更点をとりこめる
![10.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/c2acb246-1f88-a513-84a9-176261c55de3.jpeg)

# まとめ
+ gitは便利なのでみんな使うといいよ！
+ source tree とか、GUIでコミットのグラフを表示してから、「こんなことがやりたいんだけど」って周りの人にきけば、きっとだれかが助けてくれるはず。
はじめてC#の研修を受けてきづいたことのまとめ

**C#研修のメモ**

# 文法
## クラス内value という変数は予約語
Propertyをセットしたときに自動的に利用される
下記の例では

    hoge.Channel = 5 

## class生成
デフォルトコンストラクタなしでも生成時に引数に値を与えらえる

## 多重継承できない
基底クラスは多重継承できない
interfaceは多重継承できる

## 共有メンバ
静的メンバと同様。
staticをつけたもの。
constをつけても共有メンバとなる。
class自体にstaticがつくと、メソッドがすべてstaticである必要がある。

## is演算子
2項演算子で2つの型に互換性があるかどうかを判定する
クラスが同じかサブクラスだと制となる

## typeof演算子
型そのものを変数にするのに利用する


# delegate
プロトタイプ宣言をdelegate
C#ではdelegateという文法を導入して、シグナチャの一致しない関数が代入された場合にはコンパイルエラーする仕組みがある

    delegat void MyDelegate(sting ss);
    MyDelegate myfunc;

上記にて戻り値はvoid、引数はstring1つという情報である。
MyDelegateという型の定義となる
引数、戻り値をチェックする仕組みはdelegateである。
delegateと考えず、戻り値が何で引数が何か、と考えると理解しやすい。

# 拡張メソッド

    public static string ToZenkaku(this string str)
Stringクラスに対してメソッドを追加したいので、ToZenkakuとなる

# ラムダ式
型推論してくれるから型を書く必要がない
ラムダ式は明示的にreturnしなくても式単体であれば計算結果を戻してくれる
これを渡すことによって、外部から処理をカスタマイズできる

研修資料のP.106が分かりやすい
BeginInvokeの引数はDelegateである。
そこで、ラムダ式Actionを渡すことで、BeginInvokeの処理を制御できる。

##Merit
- 思考が中断されない
- ラムダ式の外部で宣言した変数をラムダ式内で参照できる

# LINQ
IEnumerableというインタフェースに対する操作を提供するもの
(IListSource)

LINQを使えば簡単に走査処理が記述できる

## Select句
複数プロパティを保持するデータをLINQで戻すとき、匿名クラスが生成され、
varを利用したコードしかかけなくなる。
しかし、プロパティへの参照とは問題なく行うことができる。
varが利用できるのはローカル変数のみ

##merit
-無駄なqueryをしない 研修資料p.55
-型推論してくれるから、簡単にオブジェクトの集まりを作成できる

#非同期処理

## Assync Completed
Assyncがついているメソッドは、それが終わったらCompletedがついている関数が
呼ばれる

- Assyncメソッドが用意されているオブジェクトは、それをそのまま使う
- 用意されていない場合は、BackGroundWorkerの仕組みを利用する
    RunworkerAssyncをcallすると、DoWorkが呼び出される

Threadクラスのコンストラクタを確認するとThreadStartデリゲートが必要とある。
この時点で構えてしまうが、ThreadStartデリゲートのHelpを確認するとvoid voidの deletegaと記載されている。

#　まとめ
- 今までC++位しかまともに実装したことがなかったが、C#の文法の拡張性や、インテリセンスの賢さにくらくらした。
- 研修の内容をまとめるの難しい。こういった形で残すことを意識して物事に取り組むとアウトプット変わってきそう。
git プロトコルのかわりに ssh で git レポジトリを clone したいとき

**ネタ元:** [githubでhttpsのURLを指定してもgitプロトコルやssh経由にする方法 - &#x40;znz blog](http://blog.n-z.jp/blog/2013-11-28-git-insteadof.html)

ssh プロトコルでアクセスできるけれど，git プロトコルで (外から) アクセスできない環境があるとします。
そのような環境のレポジトリ，ふつうに ssh プロトコルで clone すればいいんですが，submodule をつかっていていてその submodule のレポジトリ URL が git プロトコルだったりすると，外の環境では submodule update ができなくて困ったりします。

そんなときは， git の URL `insteadOf` 機能を使って URL を書き換えてやると，(内側での環境と同じように) clone できます。

やりたいことは，

* `git://git.example.org/project.git` という URL を
* `git@git.example.org:project.git` という URL に

書き換えたい。
(後者は SCP 形式ですが，git は `ssh://git@git.example.org/project.git` のような URL 形式も使うことができます。今回は SCP 形式で話をすすめます)

このとき，シェルから以下のようにして git の global config を設定します。

```shell-session
$ git config --global url.'git@git.example.org:'.insteadOf git://git.example.org/
```

置き換え後の `git@git.example.org:` の「`:`」を付与するのを忘れないようにしてください。
(この点では ssh URL 形式を使ったほうが，見た目はいいかもしれませんね)

このように実行することで， `~/.gitconfig` の内容に以下の内容が追加されます。

```ini
[url "git@git.example.org:"]
        insteadOf = git://git.example.org/
```

ポイントは

* URL 置換はプロトコル部分だけではなく，より長い部分を指定できる
    * だから今回のようにドメイン単位で置換対象を絞り込むことができる
        * `--global` 指定しても安心
        * より深く，プロジェクトパス単位で置換対象を絞り込むこともできる (はず)
    * 今回は同じサーバを指定しているが，違うサーバにむけることもできる (はず)
* 単純に置換するだけなので，もちろん逆に ssh URL を git URL に置換したり https:// に置換したりもできる 
* URL 置換は最長一致したものが使われるので，複数指定しても大丈夫
* push の際だけ置換をおこなう `pushInsteadOf` もある
    * ネタ元サイトや `git help config` を参照してください。
メールをメーラー上でスレッド表示する方法

# 背景
送った一連のメールをGmailなどのメーラーの上でスレッド表示したい

# 解法
スレッド化したいメールのヘッダーの `References` と `In-Reply-To` を全て同じものにする.

# 詳細

深追いしていないので `References` もしくは `In-Reply-To` の片方でいい可能性も高いです（おそらく `References` だけで :ok_woman: ）

Railsの場合だとこんな感じに書けます。同じ `item_id` のメールが `to@example.com` ユーザのメーラ上でひとまとまりにされます。

```rb:app/mailers/sample_mailer.rb
class SampleMailer < ActionMailer::Base
  def example(item_id)
    mail(
      :from => 'from@example.com',
      :to => 'to@example.com',
      :subject => 'sample subject',
      :references => "<#{item_id}@example.com>",
      :in_reply_to => "<#{item_id}@example.com>"
    )
  end
end
```

# 参考リンク

- [メールヘッダの一覧](http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/mail-header.html)
便利メソッド(util)系を Static Method としてまとめる

## 最後に追記あり

どの Struct にも属さない(コンテキストを持たない)便利関数をどこかにまとめる時。
サブディレクトリとして持って各ファイルで import してもいいんだけど、そこまでする必要は無いので、同じプロジェクト内の  util.go に書いていた。
ここに書いた関数は、プロジェクト内では共有される、いわゆるグローバルなアクセスができるので、どのファイルからもアクセスできる。こんな感じ。

```go
// util.go
func AddPrefix(header http.Header) http.Header {
  // snip
}

func RemovePrefix(header http.Header) http.Header {
  // snip
}
```

これらは struct に属していないため Godoc 上で最初にまとめて表示される。なぜなら Godoc ではどのファイルにあるかは表示されないから。

![Screen Shot 2014-02-03 at 7.29.49 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6452/54a7d33a-4596-5a91-4e2d-f36d5f19ebc2.png)

これだと、 ListenAndServe() とか Dial() みたいに、関数として定義するものがあると、 Util みたいにどうでもいいものと混ざって見づらいという問題がある。上の場合は HandleTLSConnection() は重要だけど、他はどうでもいい。

どうでもいいなら、関数名を小文字にすればいいのだが、ここから消えてほしくはないし、外部にも公開したい。

そこで、 util.go にあるものは「Util であること」を Godoc 上でわかりやすくしたい。
なので、あえて struct に属させてみる。
しかし、使うたびにいちいち new() するのも面倒なので、 util.go 上で new したものをグローバルに載せる。これで今までの関数呼び出しを頭に util.Xxx() とするだけで同じように使える。


```go
var util = Util{}

type Util struct{}

func (u Util) AddPrefix(header http.Header) http.Header {
  // snip
}

func (u Util) RemovePrefix(header http.Header) http.Header {
  // snip
}
```

Godoc はこうなる。いい感じ。

![Screen Shot 2014-02-03 at 7.30.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6452/11bfd99f-1f69-92c3-c004-44875de31691.png)


これでこのパッケージを import した側も package.util.Xxx() で呼べるはずだし、いいのかなぁと、いうのをやってるんだけどどうだろう。
ドキュメントを読んでない人は util を new() するかもしれないけど、そこはまあしょうがないかなぁ。


## 追記

### interface にしなかった理由

たまーに const とか var も持ちたくなることがあったからです(書いてなかったです、すいません)。関数だけなら interface にして方が確かにいいですね。

### サブパッケージにしなかった理由

サブパッケージにすると、 import が増えるのと、各ファイルで import が必要になるのと、 GoDoc 上では別のページになるからですね。今回のように数個の関数だけだとわざわざ掘るのも面倒だなと。
もし ioutil ほど大きければサブパッケージの方が良いのは確かです。
ちなみに crypto/util.go とかもあるので、サブパッケージの方が必ず Go っぽいのかは疑問の残るところ。
CentOS に Python2.7, Python3を入れたメモ

CentOS6.5の標準ではPython2.6が、CentOS7.2ではPython2.7が入っており色々と不都合があるので、新バージョンかつよく使うバージョンをインストールする。

なおインストール先は `/opt/local` とする。

**追記**

2020/01/10 追記：いい加減 Python3 を使いましょう。

## Developer Tools をインストール

```Shell
# yum groupinstall "Development tools"
# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
```

## Python 2.7, 3.6 install

まずダウンロードをしてきて、それらをインストールする。

```shell
curl -O https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
curl -O https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
tar zxf Python-3.6.6.tgz 
tar zxf Python-2.7.6.tgz 
```

Python2.7 のインストール

```shell
cd Python-2.7.6
./configure --prefix=/opt/local
make && make altinstall
```

Python3.6 のインストール

```shell
cd Python-3.6.6
./configure --prefix=/opt/local
make && make altinstall
```

## Easy_install をインストールさせる

(2015/07/19: distribute のリンク先変更。 Thanks @mtomoaki_96kg さん :+1: )

```shell
curl -O https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
tar xzf distribute-0.6.49.tar.gz
cd distribute-0.6.49
/opt/local/bin/python2.7 ./distribute_setup.py 
/opt/local/bin/python3.3 ./distribute_setup.py 
```

2015/07/19 追記：distribute/setuptools をインストールしなくてもPIPはインストールできるようになっていますので、このステップは省略しても問題無いです。というより、pipで`pip install distribute`とコマンドを実行すればインストールできます。

see: https://pypi.python.org/pypi/distribute/0.6.49

## PIP をインストール

(2014/09/27 追記)
(2015/04/22 raw.github.com から raw.githubusercontent.com へ変更)
(2015/07/19 githubから pypa のリンクへ変更 see: https://pip.pypa.io/en/latest/installing/#install-pip )

```shell
> curl -kL https://bootstrap.pypa.io/get-pip.py | /opt/local/bin/python2.7
> curl -kL https://bootstrap.pypa.io/get-pip.py | /opt/local/bin/python3.6
```

## VirtualEnv をインストールさせる

```shell
/opt/local/bin/pip2.7 install virtualenv
/opt/local/bin/pip3.6 install virtualenv 
```

thanks sahiruhaさん :+1: 

## 参考

- http://www.petitec.com/2013/04/centos6にpython2-7を入れる/
- http://toomuchdata.com/2012/06/25/how-to-install-python-2-7-3-on-centos-6-2/
- http://ymotongpoo.hatenablog.com/entry/2012/10/18/144352
- http://qiita.com/who_you_me/items/831d62f396e6d66dda66
- https://pip.pypa.io/en/latest/installing.html#install-pip

## 更新ログ

2018/10/04: PIP が推奨する Python のバージョン番号が、 >= 2.7.9, >= 3.4 であったので、3.3 と記述されている部分を 3.6 に変更。
最小限のParallel Coordinate Plotの作り方


d3.jsを使ってParallel Coordinate Plotを作る。

- http://bl.ocks.org/jasondavies/1341281 にサンプルがあるが、これをシンプルにしてプロットだけ表示するものを作成した。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <title>Parallel Coordinates</title>
    <style type="text/css">
svg {
  font: 10px sans-serif;
}

.foreground path {
  fill: none;
  stroke: steelblue;
  stroke-opacity: .7;
}

.axis line, .axis path {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}

.axis text {
  text-shadow: 0 1px 0 #fff;
}
    </style>
  </head>
  <body>
    <script type="text/javascript" src="http://mbostock.github.com/d3/d3.js?2.5.0"></script>
    <script type="text/javascript">

var m = [30, 10, 10, 10],
    w = 960 - m[1] - m[3],
    h = 500 - m[0] - m[2];

var svg = d3.select("body").append("svg:svg")
    .attr("width", w + m[1] + m[3])
    .attr("height", h + m[0] + m[2])
  .append("svg:g")
    .attr("transform", "translate(" + m[3] + "," + m[0] + ")");

d3.csv("cars.csv", function(cars) {

  // Extract the list of dimensions and create a scale for each.
  var dimensions = d3.keys(cars[0]).filter(function(d) { return d != "name" });
  // ["economy", "cylinders", ... ]

  var x = d3.scale.ordinal().rangePoints([0, w], 1).domain(dimensions);

  var y = {};
  dimensions.forEach(function (d) {
    var extent = d3.extent( cars, function(r) { return +r[d]; } );
    y[d] = d3.scale.linear().domain(extent).range([h, 0]);
  });

  // Returns the path for a given data point.
  function path(d) {
    // d is an object like {"economy": "21.1", "cylinders": 4, .... }
    var points = dimensions.map(function(p) {
      return [x(p), y[p](d[p])];  // y[p] is yScale
    });
    var l = d3.svg.line();
    return l(points);
  }

  // Add blue foreground lines for focus.
  var foreground = svg.append("svg:g")
      .attr("class", "foreground")
    .selectAll("path")
      .data(cars)
    .enter().append("svg:path")
      .attr("d", path);

  // Add a group element for each dimension.
  var g = svg.selectAll(".dimension")
      .data(dimensions)
    .enter().append("svg:g")
      .attr("class", "dimension")
      .attr("transform", function(d) { return "translate(" + x(d) + ")"; });

  // Add an axis and title.
  var axis = d3.svg.axis().orient("left");
  g.append("svg:g")
      .attr("class", "axis")
      .each(function(d) { d3.select(this).call(axis.scale(y[d])); }) // append axis to g
    .append("svg:text")
      .attr("text-anchor", "middle")
      .attr("y", -9)
      .text(String); // set text to the data values
});

    </script>
  </body>
</html>
```
UIImagePickerController使うときのエラー処理(というか気をつけること)


いつも忘れる


## 必要

- AssetsLibrary

## コード

### SourceTypeがUIImagePickerControllerSourceTypeCamera (カメラを使う)
```objectivec:camera
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
	UIImagePickerController *picker = [[UIImagePickerController alloc] init];
	picker.sourceType = UIImagePickerControllerSourceTypeCamera;
	[self presentViewController:picker animated:YES completion:nil];
} else {
	// Error:君のiPhoneカメラ使えないよ
}
```

### SourceTypeがUIImagePickerControllerSourceTypePhotoLibrary (ライブラリを使う)
```objectivec:library
// iOS6以上でプライバシーの項目が追加されている
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_5_1) {
	ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
	if (status == ALAuthorizationStatusRestricted || status == ALAuthorizationStatusDenied){
		// ペアレンタルコントロールで許可されてない or 許可が'いいえ'
		// Error:設定的にライブラリアクセス出来ないよ
	} else if (status == ALAuthorizationStatusAuthorized || status == ALAuthorizationStatusNotDetermined){
		// 許可 or まだ許可ダイアログ出たことない
		if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
			UIImagePickerController *picker = [[UIImagePickerController alloc] init];
			picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
			[self presentViewController:picker animated:YES completion:nil];
		} else {
			// Error:君のiPhoneライブラリ使えないよ
		}
	}
} else {
	if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
		UIImagePickerController *picker = [[UIImagePickerController alloc] init];
		picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
		[self presentViewController:picker animated:YES completion:nil];
	} else {
		// Error:君のiPhoneライブラリ使えないよ
	}
}
```

わかりやすさを優先して一部イケてないコードになっているので、適宜直して使ってください。

直にカメラにアクセスしたいときなどは、フロントカメラ持ってる？とか
フラッシュ使える？とかもっと色々確認事項多いです。

## まとめ

カレンダーとか位置情報とかも同じ感じでめんどくさい（はず）。
必要になったタイミングでまとめよう〜
CorePlotで円グラフを描画する


iOSで円グラフを描画する際、ライブラリは[CorePlot](https://github.com/core-plot/core-plot)一択だと思うのでそのメモ。

なぜCorePlotかというと、Githubでさくっと調べた感じ、他に円グラフを描画するために実用的なものはなさそうだったのと、円グラフ以外の描画も出来るのでこのライブラリの使い方を憶えるだけでいいから。

# クラス概要

CorePlotを使って円グラフを描画する際に、主に利用するクラスは次の通り。

- CPTGraphHostingView
 - グラフのコンテナの役割をするView
- CPTXYGraph
 - コンテナにグラフ描画するためのGraphのLayer。CPTGraphHostingViewにホストさせる。
- CPTPieChart
 - 円グラフを描画するためのLayer。CPTXYGraphにaddPlotする
- CPTMutableShadow
 - 影の設定を保持するインスタンス。CPTPieChartのshadowプロパティにセット

CPTXYGraphは軸や目盛りのLayer。
CPTPieChartはグラフの方式が円グラフなど表示用Layerになっている。

![スクリーンショット 2014-02-03 18.38.37.jpg](https://qiita-image-store.s3.amazonaws.com/0/16400/25779dee-3bb4-e9b7-cbff-d19ecd12ad8c.jpeg "スクリーンショット 2014-02-03 18.38.37.jpg")


クラス名で気づいたけど、海外では軸や目盛りなどをグラフと呼び、その中でデータを比較したり表現したりするデータそのものをチャートと呼び分けているのかもしれない。日本人が円グラフや棒グラフと言っているものはチャートであり、そのチャートの下に目盛りとしてグラフがあると。

今回の円グラフ（パイチャート）では縦横の目盛りが存在しないのでCPTXYGraphはほとんど設定がいらない。そのためCorePlotを理解する上で一番簡単かもしれない。

# 描画

## データのグラフ描画のためのデリゲート

UITableViewと同じで描画と管理のためにデータソースのデリゲートパターンを使う。

まずデータソースであるCPTPieChartDataSourceプロトコルはCPTPieChartインスタンスのdataSourceプロパティにdelegateを渡し、下記2つだけをまず実装する。

```objc
@protocol CPTPlotDataSource<NSObject>

//プロットのためのデータ数を返すように実装する。必須。
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot;

@optional

//描画するための値をNSNumberで返すように実装する。
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx;

@end
```

CPTPieChartを使っているので、円グラフ専用に下記のメソッドも実装する。

```objc
@protocol CPTPieChartDataSource<CPTPlotDataSource>
@optional
//1データ毎に表示をCPTFillというインスタンスで返すように実装する。
-(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx;

```

CorePlotによる円グラフでは描画したい領域をCPTFillインスタンスとして返す。これはUITableViewなどでUITableViewCellを返すようなものと思って構わない。

描画する領域は上記のdelegateでCorePlot側が自動で分割してくれるので気にしないでいい。

### CPTPieChartDelegateプロトコルのデリゲートについて

ViewControllerにCPTPieChartDelegateプロトコルを採用だけしているサンプルコードがネット上にあるが、これは円グラフが選択された時のイベントのデリゲートなので必要がない場合がほとんどじゃないかと思う。

# 設定

## 真ん中が空いた円グラフにする

pieInnerRadiusというプロパティを持っていて、これは円グラフを中心として真ん中の円の半径になる。


```objc
    //円グラフのインスタンスを生成
    CPTPieChart *pieChart = [[CPTPieChart alloc] init];
    //円グラフの半径を設定
    pieChart.pieRadius = 52.0;
	//内側の円形の半径
	pieChart.pieInnerRadius	= pieChart.pieRadius / 2.0;
```

# 完成

カレンダーと組み合わせるとライフログっぽくできる。

![円グラフ.jpg](https://qiita-image-store.s3.amazonaws.com/0/16400/8047bd01-3303-431a-364e-45e865a81e6e.jpeg "円グラフ.jpg")

実際の動作を確認したい人は「理想的な集中と休憩のサイクルを維持する為のタイマーアプリ。集中作業タイマー」をAppStoreでダウンロードしたら良いのではないかと思います。


集中作業タイマー
https://itunes.apple.com/jp/app/ji-zhong-zuo-yetaima/id547092863?mt=8
floatのformatで0埋めする


000.0としたかったら以下。

```ObjC
NSString* string = [NSString stringWithFormat:@"%05.1f", 0.0];
NSLog(@"string is %@", string);//=> string is 000.0
```

最初の`05`のところで全体の長さを決めているらしいです。
この場合は`.`も含めて５文字で治まるようにformatされました。
vim(windows編)からrubyの規約チェック

# rubocop の導入

ところが普通にインストールすると

```bat
gem install rubocop
```

以下のようなエラーとともにDevKitが必要だと言われるので素直に導入する。

```bat
Fetching: rainbow-2.0.0.gem (100%)
Fetching: ast-1.1.0.gem (100%)
Fetching: slop-3.4.7.gem (100%)
Fetching: parser-2.1.4.gem (100%)
Fetching: powerpack-0.0.9.gem (100%)
Fetching: json-1.8.1.gem (100%)
ERROR:  Error installing rubocop:
        The 'json' native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'
```

## Devkit インストール

1. `DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe`をダウンロード
1. フォルダを作って適当に展開
1. `ruby dk.rb init`を実行
1. 生成された`config.yml`の中身を確認
1. `ruby dk.rb install`を実行

## make

さらにmakeが入っていないと怒られるので、こちらも素直に導入する。

Make for Windows
http://gnuwin32.sourceforge.net/packages/make.htm
→ Complete package をインストール

## json

さらに権限がないよとまた怒られる。
だが、そもそも以下のフォルダがなかったので

```bat
Temporarily enhancing PATH to include DevKit...
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied - C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1/.gitignore
```

改めてjsonをインストールする。

```
gem install json
```

ここまでやって`rubocop`が想定通りインストールできた。

# vim へ組み込む

## syntasticの設定

すでに`syntastic`を使っていたため`syntastic`に設定する。

```.vimrc
let g:syntastic_mode_map = { 'mode': 'active' }
let g:syntastic_ruby_checkers = ['rubocop']
```

後はファイルを保存する度に、チェックしてくれるようになりました。

## 設定ファイル

必要に応じて`.rubocop.yml`で動作をカスタマイズする。

```.rubocop.yml
# Use only ascii symbols in comments.
AsciiComments:
  Enabled: false
```

# 参考

* [Rubocopをsyntasticを使ってVimから自動実行する - Qiita [キータ] ](http://qiita.com/yuku_t/items/0ac33cea18e10f14e185)
* [Ruby - Rubocopを使ってコーディングルールへの準拠チェックを自動化 - Qiita [キータ]](http://qiita.com/yaotti/items/4f69a145a22f9c8f8333)
RubyMotionからWebSocketを使う


サーバーとの連携アプリで更新された最新の状態を取得するのにバックグラウンドフェッチだと負荷もかかり、かっこ良くないので、サーバー側からプッシュできたら便利だな...と思いついたのでWebSocketをRubyMotionから使ってみる事にしました。

## サーバ側(nodejs)

今回は簡単にサーバーを作成するためにnodejsのwsというモジュールを使います。
[ws: a node.js websocket implementation](http://einaros.github.io/ws/)
s
すでにnodejsが入っていればnpmで簡単インストールです。
> npm install -g ws

インストールするとwscatというユーティリティがインストールされるので、これを使うと簡単にWebSocketの送受信テストが行えます。ポート8080にてサーバーモードで待ち受けを行います。
> wscat -l 8080

これで単純な送受信用サーバー完成

## クライアント側(iOS)

SocketRocketというframeworkを使います。CocoaPodsにあるので、インストールは簡単です。す〜いす〜い。
[SocketRocket Objective-C WebSocket Client](https://github.com/square/SocketRocket)

```RakeFile
# motion-cocoapdsインストール時
  app.pods do
    pod 'SocketRocket'
  end
```
> Rake pod:install

コード的にはSRWebSocketを生成するのと、delegateを作成します。

注：実際にはStoryboradでUIを作ってIBで連結しており、myMessageはUITextFieldに連結しています。また、ProMotionを使っているので、on_loadに初期化コードを書いています。

```
class MainScreen < PM::Screen
  extend IB

  outlet :myMessage, UITextField

  def on_load #ProMotion初期化
    url = NSURL.URLWithString("ws://127.0.0.1:8080")
    @socket = SRWebSocket.alloc.initWithURLRequest(NSURLRequest.requestWithURL(url))
    @socket.delegate = self
    @socket.open
  end

  def sendMessage #メッセージ送信
    p "Send: #{myMessage.text}"
    @socket.send(myMessage.text)
    myMessage.text = ""
  end

  def webSocketDidOpen(webSocket)
    p "Socket Open!"
  end

  def webSocket(webSocket, didReceiveMessage:message)
    p "Receive: #{message.description}" 
  end

  def webSocket(webSocket, didFailWithError:error)
    p "Error : #{error.description}"
  end

  def webSocket(webSocket, didCloseWithCode:code,reason:reason)
    p "Close"
  end

end
```

### 動作テスト

nodejsで作ったサーバー側で文字を入力するとクライアント側で受信します。また、文字列を送信するとサーバー側に送信されます。うまくいかない場合は待ち受けポートとかIPに注意してください。

これをうまく使ってプロトコルを決めて動作させれば、サーバー側からのプッシュに応じたリアルタイム動作ができると思います。ステキ。

### 拡張

サーバー接続状況のエラー表示等はNoticeViewを追加して表示させるとかっこよくできますよ、と自分メモ。

![notice.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/2d98fea7-1e9b-b4d8-ec9b-7f3c4efba12f.jpeg "notice.jpg")

```
notice = WBErrorNoticeView.errorNoticeInView(self.view,
  title:"Socket Error", message:"Check your network connection.")
notice.show
```

[NoticeView A TweetBot-like notice component for iOS.](https://github.com/tciuro/NoticeView)
XCTestのNSStringの比較でハマった


以下の様なソースコードを書いていたのですがどうしてもテスト通らず。（ものすごい簡略化してます）

```ObjC
XCTAssertEqual(@"hello", @"hello");
```

Javaの感覚でSame（同じ参照）ではなくEqual（同値）だからうまいことやってくれるだろうと思ったのですがダメでした。

**↓↓↓誤り↓↓↓**

Objective-Cの場合、`NSString`の同値判定は`isEqualToString`メソッドを使用しますよね。
これを使わないとダメでした。

```ObjC
XCTAssertTrue([@"hello" isEqualToString:@"hello"]);
```

**↑↑↑誤り↑↑↑**

コメントいただきました。ありがとうございますm(_ _)m
こちらが正しいようです。

```objc
XCTAssertEqualObjects(@"hello", @"hello");
```