OmniAICreator/Qiita-1.07M huggingface dataset:
Rails4 - タイムゾーンとロケールを日本（語）に設定


application.rbに設定追加

表示時のタイムゾーンをJSTに変更
DB保存時のタイムゾーンをJSTに変更
ロケールを日本語に変更

```rb:application.rb
    # 表示時のタイムゾーンをJSTに変更
    config.time_zone = 'Tokyo'
    # DB保存時のタイムゾーンをJSTに変更
    config.active_record.default_timezone = :local

    # ロケールを日本語に変更
    config.i18n.default_locale = :ja
```
RailsでTwitter Bootstrapを使う


昨日やったRails4初期設定の後、Twitter Bootstrapの設定をちゃんとやらなかったら、地味にハマった・・

どうも幾つかGemが足りなかったらしい。。
ここらへん追加して、もう一度 bundle install する。

```Gemfile
# Bootstrap
gem 'less-rails'
gem 'therubyracer'
gem 'twitter-bootstrap-rails', '~> 2.2.8'
gem 'font-awesome-rails'
gem 'bootstrap-sass', '2.3.2.0'
```

### Hamlでrails generateされるように指定

```config/application.rb
config.generators do |g|
  g.template_engine :haml
end
```

### Bootstrapを使えるようにする

```cmd
$ bundle exec rails g bootstrap:install less
```

### Bootstrapのレイアウトを作る

application layout をレスポンシブ対応のレイアウトにする。

```cmd
$ bundle exec rails g bootstrap:layout application fluid
```

### scaffoldしたリソースにBootstrapを適用

```cmd
$ bundle exec rails g scaffold Post title:string content:text
$ bundle exec rake db:migrate
$ bundle exec rails g bootstrap:themed Posts -f
```
scaffoldしたviewを上書きさせるために-fをつける。
付けなくても一個ずつyで上書き確認でもOK

- - -
参考：[twitter-bootstrap-rails/README.md at master · seyhunak/twitter-bootstrap-rails](https://github.com/seyhunak/twitter-bootstrap-rails/blob/master/README.md)

やはり本家を見ないとダメですね・・・
botsを使ってみる

xcodeの継続的インテグレーションのbotsを使ってみました。
その際のメモ

## botsの特徴

* ユーザごとのアクセス制御もつけられる
* WEBでもXcodeでも結果の閲覧が可能
* CIをまわすタイミングをカスタマイズできる
* コード解析もしてくれる

## botsの作り方

作り方はここを見てね(xcode5でOSがMarvericksで、OS X サーバが必要です。)
https://developer.apple.com/library/mac/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/ConfigureBots/ConfigureBots.html#//apple_ref/doc/uid/TP40013292-CH9-SW1

ここからエラーが出てはまる

### 色々エラーが出た際にしたことを列挙

* テストターゲットの、Codeサインも変更しないとダメ
* projectsのcodesignも変更しないとダメっぽい
* http://tanakahiroki.com/?p=464
* https://blog.takezou.com/archives/1730
* 普通にprovisioning profilesをセットしてなかっただけかも
* OS Xサーバにprovisioning profilesを上げないとちゃんと動かない

```
No matching provisioning profile found: Your build settings specify a provisioning profile with the UUID “9F2F3156-6380-4A91-AFA5-A68BD5781949”, however, no such provisioning profile was found.
```

```
CodeSign error: code signing is required for product type ‘Application’ in SDK ‘iOS 7.0’
```

この２つに悩まされて、結構時間使った
以下で解決
* http://blog.redgreenrefactor.eu/post/70650375252/developer-diaries-fixing-provisioning-and-code-signing
* http://matt.vlasach.com/xcode-bots-hosted-git-repositories-and-automated-testflight-builds/
keychain部分がよくわからなかったけど、上記二つで解決

やったことはログインのところにある、distributionの証明書を、システムにコピーしました。


http://stackoverflow.com/questions/19197497/ios-7-0-no-codesigning-identities-found

しかしまだエラー

```
xcodebuild: error: Failed to build workspace kokuban20131005 with scheme kokuban20131005.
Reason: Xcode cannot run using the selected device.
```

実機にしろってこと？？

ていうかこれそもそも読んでなかった。。。
https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/200-Adopting_a_Continuous_Integration_Workflow/adopt_continuous_integration.html#//apple_ref/doc/uid/TP40013292-CH3-SW4

めっちゃ書いてありました。ごめんなさい

osxサーバに実機追加したらうまく行きました

http://matt.vlasach.com/xcode-bots-hosted-git-repositories-and-automated-testflight-builds/
と思ったけど違う。

テスト対象のデバイスをbotsの設定で選べる（作成時にも選べる）ので、そこでシミュレータも選択すればいい。

### シミュレータでやる場合

```
Error opening /var/teamsserver/Library/Logs/iOS Simulator/iOS Simulator.log
```

のエラーログをはくので、フォルダ作って取り急ぎ、777の権限で動いた
多分ダメだと思うので、ベストプラクティス教えてください

そうすればシミュレータも動く。ただ、相変わらず実機は動かず。。。

```
command /usr/bin/codesign failed with exit code 1
```
Chocolatey で grep ライクなコマンド ack をインストールする

Chocolatey 便利ですね。
便利なんですが cinst grep してもインストールしてくれなかったので絶望しました。

仕方ないので代替してくれる ack をインストールします。

```bat:
 cinst ack
```

依存関係にある StrawberryPerl もついでにインストールしてくれます。
が、そのままだと perl に PATH が通ってなくて怒られます。
C:\strawberry\perl\bin を追加してやれば使えます。
AWSでWebサイトを２ヶ月公開してみての所感


## 概要
AWS上で簡単なサイトを作って公開しています。
恥ずかしながら、レンタルサーバ以外で初めてちゃんとサイトを公開しました。
あとで思い出して恥ずかしい思いをするために、以下を書いておきます。
整理はされていませんが。

* サイトの構成
* 苦労した、してる所
* 嬉しかった所
* これからやりたいこと


以下は当サイトのコンテンツです。

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


* 「よく使うハンドサイン」ジェネレータ
http://betahikaru.com/handsign/

## 現在の構成

* ソースはBitbucketのプライベートリポジトリに保存。

> 読み取り専用ユーザのキーを本番サーバにおいて、```git clone origin master && ./deploy.sh```してる。
> リポジトリをそのままDocumentRootにすると.gitファイルとかのゴミが見えそうで嫌なので、シェルスクリプトで必要なファイルだけコピーしてる。

* 本番サーバと開発サーバに、EC2のAmazon Linuxを利用。

>ソースをどうMacとEC2でやり取りするか悩んでる。
> rsyncでいいでしょとは思うが、変更してコマンド実行するのが何かめんどくさい。
> 変更にフックして実行するとか、Grunt使えば実は出来る？
> 今は、一人しか使わないのをいい事に、とにかくcommit・push・pullすることでソースを転送している。
> 疎通とおらないソースをcommitというのが自分の中でかなり気持ち悪い。
 
* 他、[前書いた記事](http://qiita.com/betahikaru/items/22f301548c5470fdece8)から変化なし。
![AWS 20140415.png](https://pbs.twimg.com/media/BktjyWjCYAEHCf2.png)



## 苦労した、してる所

* 本番サーバからイメージを作ろうとしたら、OSが再起動しちゃった。

> （その頃は誰もアクセスしてなかったけど） サービス停止しちゃいました。当たり前ですが。
> あらかじめある程度環境構築したAMIを作っておき、そこからソースを取得してデプロイする。ロードバランサに新しいのを追加して、古いのを削除する。というところまでは来た。
> 固有の情報とか無いので、古いイメージは捨てちゃってます。

* httpdの設定を直接修正したりとかしたので、本番サーバと開発サーバの動きが何か違う。。

> これは未だにそうなってる。
> 一応chefでそれっぽい状態まで環境設定するサンプルは作れたんだけど、Bitbucketに接続するキーは最初のイメージにおいておくの？とか、（開発中機能だが）S3にアクセスするための情報はレポジトリに入れれないから、どのタイミングで入れるの？とかで、詰まって今放置中。
> [rebuild.fm/14/](http://rebuild.fm/14/)で言ってた３つの階層とかってこういう事なんだろうか。
> 結局ソースと同じリポジトリに設定ファイルを置いて、手でチマチマ設定反映するという原始的な状態。

* 自分が見てないときにちゃんとアクセス処理できてるかどうか分からない

> 性能テストはしていないです。
> EC2のt1.microインスタンスで、httpdで、Google Analyticsによると多くても毎時３０アクセス程度なので、余裕だと思いますが。

* Canvasのマルチブラウザ対応

> macとios7のChromeとSafariだけテストしとけば大丈夫だろー。と思ったら、
> Twitterから開いたらブラウザがSafari(in-app)になってタップしたら画像がダウンロードできなかったり、
> MacのFirefoxで（DataURL使ってる）画像タップしたらフリーズしたり、
> Google Analyticsみたら結構IEとかOperaとかいたりで、
> 大変だなーと思いました。

* 何らかのフレームワークを使いたいが、学習が追いつかない。

> 平日は１h程度。土日は疲れでぐったり。。。
なんとかしないと。

## 嬉しかった所

* gitが使える。

> 会社では使えないので。

* AWSが使える。

> 同上。

* [tig](http://qiita.com/yoshikazusawa/items/e7f6ab2c416ad37d9f90)の価値に気づけた。

> SourceTreeでよくね？と思っていたが、本番サーバ上で```git log```を見るのが凄く楽になった。

* ひとりでPull-Requestとかして遊べる。

> トピックブランチ->developブランチにプルリクみたいな。
> 自分で却下してみたりとか。

* [Gigazine](http://gigazine.net/news/20140407-handsign-generator/)でサイトが紹介された（驚愕）

> ページのすっごい下の方で紹介されただけなのに、アクセス数が急増（もとは０に近いから当たり前とはいえ）。
> 日本以外からのアクセスが増えた。
> 検索サイトからの流入がでてきた。
> Google検索4/14時点で、「よく使うハンドサイン ジェネレータ」の２番目、「動物はあなたのごはんじゃない ジェネレータ」の１番目になった。

* 自分の作ったサイトで作った画像がTwitterに流れてるのを見た。

> 数人ですが、嬉しいですね。
> rebuild.fmの各回で気に入った文言を「動物はあなたのごはんじゃない」ジェネレータで[画像化](http://betahikaru.com/posts/image/notfood_rebuildfm36.png)するのがマイブームです。
> まだ２回くらいしかやってないけど。

## これからやりたいこと

* サイトの利便性向上
 * マルチブラウザ対応（IEがなにげにアクセス多いため）
 * ネタ画像ジェネレータで生成したものを、S3に保存して、直接twitterに投稿出来るようにする。
 * ファイルアップロードに対応する。（現在画像URLを指定してもらってるので…）
* 開発、運用効率向上
 * ソース変更->動作確認（テスト）-> コミット->公開までの流れをスムースに。
 * EC2インスタンスの起動停止、LBSへの割当などを、AWSのAPIで自動化したい。AWS CLIでシェルスクリプト組めばとりあえずは行けそう。
* その他、山ほど。
  * ログ解析。
  * 環境構築自動化（Chef)
  * ローカルマシン上でVMあげてテスト（OSをAmazonLinuxからCentOSに切り替える。）
  * デザインをなんとかする。。
  * and more…

以上
カラム命名規則

もちろん全部が全部、英語の基本文法に合うわけではないのだけれども
開発チーム内でわかりやすいカラム名をつけるのが大事
定義そのままに難しい言葉を使ってみんながわからなくなるのはNG
チーム内参考備忘録

**日付**
DBに登録する、何かの行為が完了した時点の日付ということで、過去形で作成。
dateもdatetime型も前置詞はatにしておけばどちらも問題ない
例：
**created_at**
**updated_at**
**canceled_at**
**expired_at**
※ただしスケジュールの開始日時など、そのものの属性はstart_atと現在形を使うなど適宜変更
****
**存在・所有**
「何かをもっている」というboolean型のカラムを作成したいとき
booleanのgetterだと補完するとisAAA()となるので、その後ろについてもヘンじゃない
過去分詞(基本は過去形と似たようなもの、~ed)または形容詞を使う。現在分詞(~ing)も可だけどあまり使ってない
例：
**aaa_present** → isAaaPresent()
present:存在する

has_**　→　使いたいけどisHasAaa()　となるので使わない
exists_** → isExistsAaa()　もダメ
****
**可能**
「何かが可能」というboolean型のカラムを作成したいとき
例：
**aaa_enabled** → isAaaEnabled() 
enable：有効にする

**aaa_available** → isAaaAvailable() 
available：利用可能な

**aaa_accepted** → isAaaAccepted() 
accept：承認する

**aaa_allowed** → isAaaAllowed() 
allow：許す

**aaa_usable** → isAaaUsable() 

**aaa_canceled** → isAaaCanceled() 

**aaa_suspended** → isAaaSuspended() 

**aaa_capable** → isAAACapable() 
capable：可能な
Ruby スクリプトをDaemon化する簡単な方法


[[ruby]僕たちが待ち望んでいたRubyスクリプトをデーモン化する方法](http://d.hatena.ne.jp/rubikitch/20100109/daemon)

のまんま転記なのだけれど、わすれないように、メモ

ruby 1.9からは下記Methodが使える
これをスクリプトの先頭に加える

```ruby:foo.rb
Process.daemon
```

簡単に、Daemon or not を切り替えるために

```ruby:daemonize.rb
Process.daemon
```

と書いておいて、`require "daemnize"` とよびだせるようにしておくと、起動オプションで、切りかえ可能になる。

```
ruby -r daemonize foo.rb
```

や、この -r option で、処理を切り替えるやりかたは、いろいろ応用できそう。勉強になりました！
数式メモ:イデアル

#定義
$ Ring = (+, -, \times)を持つ集合 $ 
加、減、積を持つ集合を環と呼ぶ。

##部分環
部分集合でもこれらの演算で閉じればそれは部分環と呼ばれる。

##イデアル
$イデアル = その外部の元との積も吸収するような部分環$
部分環において、その元が部分環の外にいる元との積の結果、再びその部分環におさまる場合、この部分環をイデアルと呼ぶ。

イデアルをI、環をRとすると。$r\in R$として
$rI=I$
[一日一Vim](その1)Align

#Align
CSVやらTSVやらの整形に特化したプラグイン。

```
a,bb,ccc,dddd,
eeee,ffffff,ggggg,
hh,iii,jjjj,kk
```

こんな文書も `:Align ,` とすると

```
a    , bb     , ccc   , dddd , 
eeee , ffffff , ggggg , 
hh   , iii    , jjjj  , kk
```

こうなります。

[こちら](https://github.com/vim-scripts/Align "Align")のgithubを `NeoBundle.vim`でインストールするとすぐに使えて簡単です。

私はもっぱら Cucumber の テーブル整形とかに重宝しそうだなぁと思って入れました。
(まだ使ってませんが、きっといい感じだと思ってます)

#雑談

ここ二年くらいVimを使っていますが、基本動作もよくわからない状態が続いているので、ここらでちょっと基礎からやったほうがいいのかな？と思ってました。

んで、ふと、一日一個なにか新しいVimの知識を取り入れて、一年間続けたら、結構な知識量になってるんじゃないかなぁと。ただ続けるのもアレなので、記事でも書いてできるだけ三日坊主で終わらせないようにしたいなぁと思ってます。
[課金]Waiting for Review にならない[すぐ忘れる]


新規アプリをつくるときに、よく忘れるのでメモった

1. itunes connectでアプリを登録
2. 課金プロダクトも登録
3. つくるつくるつくる.....
4. submittedしたった

アプリのステータスはWaiting for Reviewになるけど、
課金プロダクトのステータスがWaiting for Reviewにならない

IAPページに

```
Your first In-App Purchase(s) must be submitted with a new app version. Select them from the In-App Purchases section of the Version Details page and then click Ready to Upload Binary.
```


<b>ああぁあああぁあああぁああああぁああぁあぁあぁぁぁぁああああああぁあああぁあああああ</b>


ステータスがPrepare for Upload（もしくは Developer Rejected）の時にしか、
Version Informationで有効にしたいIn-App Purchaseが選択可能なんだよね

(ﾉ∀`)ﾀﾊｰ
Your branch and ‘origin/master’ have diverged

リモートに2ブランチ(各々更新されている)、ローカルに1ブランチある状態で、
ローカルで新しくブランチを作成しようとしたときに出たエラー
リモートのブランチをローカルにマージさせるとエラーが解消した。
参考：
http://quartet-communications.com/info/technology/13184
GoでMongoDBを使う勉強(続報)

　以前に投稿したGoでMongoDBを使う方法に関してもう少し自分なりに改良を加え勉強してみました。使用したサンプルはいつものように
　　　　https://gist.github.com/border/3489566
を使用しました。
　こちらのサンプルはテストということなので基本的な使い方はすべてmainに書かれています。実際に運用する際はModule化する必要があるのでどのようにModule化すればよいかをテストしてみました。


```go:sanple.go
package main

import (
	"fmt"
	"labix.org/v2/mgo"
	"labix.org/v2/mgo/bson"
	"time"
)

type Person struct {
	ID        bson.ObjectId `bson:"_id,omitempty"`
	Name      string
	Phone     string
	Timestamp time.Time
}

var (
	IsDrop = true
)
```
ここまでは同じです。DBにアクセスするsession形成をmodule化してみます。

```go:sample.go
func CreateSession(dialURL string) (session *mgo.Session, err error) {
	newSession, err := mgo.Dial(dialURL)
	if err != nil {
		panic(err)
	}

	newSession.SetMode(mgo.Monotonic, true)

	// Drop Database
	if IsDrop {
		err = newSession.DB("test").DropDatabase()
		if err != nil {
			panic(err)
		}
	}

	return newSession, err
}
```

　このような感じです。私がはまったのはreturnでnewSessionとerrを返すところです。Go特有の記述ですね。
　引数としてdialURLを取ります。引数を使用しmgo.Dialでsessionを指定します。次にmainでこの関数を呼び出してみます。

```go:sample.go
unc main() {
	session, err := CreateSession("localhost")
    c := session.DB("test").C("people")

	// Index
	index := mgo.Index{
		Key:        []string{"name", "phone"},
		Unique:     true,
		DropDups:   true,
		Background: true,
		Sparse:     true,
	}

	err = c.EnsureIndex(index)
	if err != nil {
		panic(err)
	}
    person1 := &Person{Name: "Ale", Phone: "+55 53 1234 4321", Timestamp: time.Now()}
	person2 := &Person{Name: "Cla", Phone: "+66 33 1234 5678", Timestamp: time.Now()}
	person3 := &Person{Name: "Kazu", Phone: "+77 34 5078 2525", Timestamp: time.Now()}

　　 err = c.Insert(person1, person2)
	if err != nil {
		panic(err)
	}

	err = c.Insert(person3)
	if err != nil {
		panic(err)
	}
```
　という感じです。かわっているところは作成してCreateSessionで使用するsessionを形成します。person1,2,3のobjectを個別形成し、c.Insert(...)で導入していきます。実験のために分割してInsertしてみました。問題はないようです。
　これで基礎実験はできたので応用実験としてrevelに接続して実験してみます。
bmGlyphがGraphics2.0対応

と、FBのフォーラムで聞いたので、使ってみました。

フォントテクスチャを作ってくれるソフトです。
マルチバイト全部突っ込むのは現実的じゃない&
たしか前のバージョンではマルチバイトはうまくマップできなかったはず。
なので、スコア表示とか数値のカウンタ的な部分で使ってました。

http://www.bmglyph.com/corona-bitmap-font-with-graphics-2-0/
ここの下にサンプルコードがあるので、このなかの
bmf2.lua
bmf_utf8.lua
これを持って来て

```lua
local myfont = bmf2.loadFont( 'bmGlyphArial' )
local string = bmf2.newString(myfont, "bmGlyph and Corona")
```

こんな感じでOK。
が！
マルチバイト系の文字？では吐き出すluaファイルが壊れるっていうか、
kernings以降が欠けちゃう。
なのでエラーでちゃう。
とりあえず以下2行を吐き出されたluaに追記すればOK。

```lua
sheetData.kernings={}
return sheetData
```
カーニングが効かないことになるのかな…。

ただ、スコア表示レベルであれば、全然これで使えると思います。
MacでNet::SSH2をインストールする

###前提条件
+ Homebrewインストール済み
+ cpanmインストール済み

###libssh2のインストール
あらかじめlibssh2をインストールしておく。

```
% brew install libssh2
==> Downloading http://www.libssh2.org/download/libssh2-1.4.3.tar.gz
Already downloaded: /Library/Caches/Homebrew/libssh2-1.4.3.tar.gz
==> ./configure --prefix=/usr/local/Cellar/libssh2/1.4.3 --with-openssl --with-libz
==> make install
?  /usr/local/Cellar/libssh2/1.4.3: 177 files, 1.3M, built in 24 seconds
```

###Net::SSH2のインストール

```
% cpanm Net::SSH2  
--> Working on Net::SSH2
Fetching http://www.cpan.org/authors/id/R/RK/RKITOVER/Net-SSH2-0.53.tar.gz ... OK
Configuring Net-SSH2-0.53 ... OK
Building and testing Net-SSH2-0.53 ... OK
Successfully installed Net-SSH2-0.53
1 distribution installed

```
「第17回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://nabetani.sakura.ne.jp/hena/ord17scheherazade/
http://qiita.com/Nabetani/items/dabe8ec57e0313229552

10進数の数値を別の進数になおしたら、その数が回文数になることがある。
そうなる場合の基数を列挙せよ。
ちょっと考えただけで計算量が凄いことになりそうだが大丈夫だろうか。

```php
<?php

	class SCHEHERAZADE{
	
		/**
		* 回文基数
		* @param String 「17301」みたいな文字列
		* @return String 「5,38,100,218,236,5766,17300」みたいな文字列
		*/
		public function get($input){
			$input = (int)$input;
			$ret = [];
			
			// 2からinput-1進数
			for($i=2;$i<$input;$i++){
				// 進数表現を取得
				$arr = $this->baseConvert($input, $i);
				// 逆順と等しければ回文
				if($arr === array_reverse($arr)){
					$ret[] = $i;
				}
			}
			// 答えがなければ-
			return $ret ? implode(',', $ret) : '-';
		}
		
		/**
		* $base進数を求める
		* @param int 元の数
		* @param int 基数
		* @return array ex:数字が1001、基数が25のとき、[1, 15 ,1]
		*/
		function baseConvert($num, $base){
			$result = [];
			while($num > 0){
				$result[] = $num % $base;
				$num = floor($num / $base);
			}
			return $result;
		}
	}
	
	// 以下はテスト
	$test = [
		['17301', '5,38,100,218,236,5766,17300'],
		['2', '-'],
		['1', '-'],
		['3', '2'],
		['4', '3'],
		['5', '2,4'],
		['6', '5'],
		['10', '3,4,9'],
		['101', '10,100'],
		['1001', '10,25,76,90,142,1000'],
		['10001', '10,24,30,42,80,100,136,10000'],
		['1212', '22,100,201,302,403,605,1211'],
		['123412', '62,100,205,215,30852,61705,123411'],
		['5179', '5178'],
		['4919', '4918'],
		['5791', '5790'],
		['5498', '2748,5497'],
		['453', '150,452'],
		['134', '66,133'],
		['8489', '27,652,8488'],
		['1234', '22,616,1233'],
		['5497', '41,238,5496'],
		['4763', '19,35,432,4762'],
		['3974', '17,27,1986,3973'],
		['3521', '44,55,502,3520'],
		['5513', '20,38,53,148,5512'],
		['8042', '23,29,60,4020,8041'],
		['7442', '37,60,121,3720,7441'],
		['4857', '25,1618,4856'],
		['22843', '49,69,91,141,430,22842'],
		['194823', '84,121,21646,64940,194822'],
		['435697', '160,169,235,626,1822,435696'],
		['142', '3,7,70,141'],
		['886', '5,14,442,885'],
		['3102', '7,65,93,140,281,516,1033,1550,3101'],
		['17326', '11,28,99,105,8662,17325'],
		['32982', '13,72,238,477,716,1433,5496,10993,16490,32981'],
		['36', '5,8,11,17,35'],
		['37', '6,36'],
		['251', '8,250'],
		['252', '5,10,17,20,27,35,41,62,83,125,251'],
		['253', '12,14,22,252'],
		['6643', '2,3,9,81,90,510,948,6642'],
		['5040', '71,79,83,89,104,111,119,125,139,143,167,179,209,239,251,279,314,335,359,419,503,559,629,719,839,1007,1259,1679,2519,5039'],
		['9240', '23,38,62,104,109,119,131,139,153,164,167,209,219,230,263,279,307,329,384,419,439,461,615,659,769,839,923,1154,1319,1539,1847,2309,3079,4619,9239'],
	];

	$scheherazade = new SCHEHERAZADE();
	foreach($test as $key=>$data){
		$answer = $scheherazade->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

わりと大丈夫だった。
作成30分、実行0.2秒。
まあ高速化とかは何も考えてないけど充分でしょう。
Go言語のsliceについての個人的メモ


Go言語のsliceは、擬似的に書くと

```
type slice struct {
	head int,
	tail int,
    data []interface{}
}
```
のようになっていて、先頭と最後へのポインタと配列へのポインタを持っていて、```hoge[1:5]```のようにslice演算をするとheadとtailだけ書き換えて、データはそのまま。

また、```append```関数はdataのキャパシティを超えた場合にreallocのようなことをしてデータ容量を拡張する。

```
package main

import (
    "fmt"
)

var P = fmt.Println

func main() {
    a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    b := a[0:5]
    a[0] = 100
    c := append(b, 200) //aの６つ目のデータを上書き
    P("a", a) //a [100 2 3 4 5 200 7 8 9 10]
    P("b", b) //b [100 2 3 4 5]
    P("c", c) //c [100 2 3 4 5 200]

}
```

なので、map処理（同数のリストの写像）であれば、
元となるリストサイズの容量を先に確保しておく方がいいし、
filter処理であっても、期待する数が圧倒的に少ない場合でない限り、先にcapだけでも確保しておく方がよさそうだ。

flat_mapのように要素の数が増える場合は、期待値程度には容量を確保しておくのが良さそうだ。

```
func WithCap(N int) {
    slice := make([]string, 0, N)
    for i := 0; i < N; i++ {
        slice = append(slice, "hello")
    }
    fmt.Fprintln(os.Stderr, "with-cap", N, len(slice))
}

func WithoutCap(N int) {
    slice := make([]string, 0)
    for i := 0; i < N; i++ {
        slice = append(slice, "hello")
    }
    fmt.Fprintln(os.Stderr, "without-cap", N, len(slice))
}

func NoAppend(N int) {
    slice := make([]string, N)
    for i := 0; i < N; i++ {
        slice[i] = "hello"
    }
    fmt.Fprintln(os.Stderr, "no-append", N, len(slice))
}
```
このような関数を作って、ベンチマークをとると

```
BenchmarkWithCap	100000000	        18.4 ns/op
BenchmarkWithoutCap	50000000	        57.4 ns/op
BenchmarkNoAppend	100000000	        10.3 ns/op
}
```
このようになる。
容量は２倍２倍で確保しているようなので、
log2(N)程度の回数reallocのようなものが走る可能性がある。

```src/pkg/runtime/slice.c
static void
growslice1(SliceType *t, Slice x, intgo newcap, Slice *ret)
{
	intgo m;

	m = x.cap;
	
	// Using newcap directly for m+m < newcap handles
	// both the case where m == 0 and also the case where
	// m+m/4 wraps around, in which case the loop
	// below might never terminate.
	if(m+m < newcap)
		m = newcap;
	else {
		do {
			if(x.len < 1024)
				m += m;
			else
				m += m/4;
		} while(m < newcap);
	}
　　// allocして
	makeslice1(t, x.len, m, ret);
　　// コピー
	runtime·memmove(ret->array, x.array, ret->len * t->elem->size);
}
```
sliceの拡張は1024までは２倍２倍。
そこから先は、capの1/4ずつ増えるっぽい。

なので、このベンチマークの場合、indexアクセスの６倍、cap設定ありの３倍という時間がキャパシティ設定なしの場合はかかっている。

容量の自動拡張があった場合、
場合によっては要素コピーが走る。

ので、もととは違う結果になる。

```copy.go
func main() {
    a := make([]int, 0)
    b := append(a, 10, 20, 30)
    b[2] = 3
    //ここでキャパシティオーバー
    //コピーされてcができる。
    c := append(b, 40, 50, 60)
　　 //コピーされているので、cは書き変わるがbは書き変わらない
    c[2] = 1
    pslice(a)
    pslice(b)
    pslice(c)
}

func pslice(s []int) {
    fmt.Printf("%T len:%d cap:%d %s\n", s, len(s), cap(s), s)
}
```
jQueryを1.8系にアップデートしたときに　curCSS .... エラーがでる【解決済み】


curCSS .... エラーがでたときは、jQueryの読み込みの後に

```lang:css
<script type="text/javascript">
     jQuery.curCSS = jQuery.css;
</script>
```

を追加すると治る。
暫定的対処方法。

## 参考にしたサイト

[jQuery curCss Error – Quick Fix](http://www.wpworks.net/post/jquery-curcss-error-quick-fix/)
NCMBの配信端末情報の登録に使用するsenderIdの確認方法

**(2014/04/14時点）**

・【NCMBの配信端末情報の登録に使用するsenderIdの確認方法】
------------------------------------------------------------------

Androidアプリ開発でNIFTY Cloud mobile backend(ﾆﾌﾃｨﾓﾊﾞｲﾙﾊﾞｯｸｴﾝﾄﾞ：以下NCMB)を使用しプッシュ通知を行う場合、端末情報の登録を行う処理が必要になるが、その際に指定するsenderIdはGoogleDeveloperConsoleより確認できる。

```java

//以下、getRegistrationIdInBackground()の第一引数に指定するIDについて

final NCMBInstallation instllation = NCMBInstallation.getCurrentInstallation();
instllation.getRegistrationIdInBackground("senderId", new RegistrationCallback() {
    @Override
    public void done(NCMBException e) {
        if (e == null) {
            // 成功
            try {
                instllation.save();
            } catch (NCMBException le) {
                // サーバ側への保存エラー
            }
        } else {
            // エラー
        }
    }
});
NCMBPush.setDefaultPushCallback(this, MainActivity.class);
```


NCMBの開発者向けドキュメントでは項目「 **配信端末情報の登録** 」でsenderidにProjectNumberを指定するよう促しているため確認を行う。[参考：http://mb.cloud.nifty.com/doc/sdkguide/android/push.html](http://mb.cloud.nifty.com/doc/sdkguide/android/push.html#tocAnchor-1-1-2)



**■GoogleDeveloperConsoleでの確認方法は以下の通り**
==================================================================
以下よりGoogleDeveloperConsoleへログインする。
[参考：https://console.developers.google.com/](https://console.developers.google.com/)


任意のプロジェクトを指定する。
(プロジェクトがない場合にはCLEATE PROJECTを押下し作成する)
![無題2.jpg](https://qiita-image-store.s3.amazonaws.com/0/41775/a58a8552-aa20-dce7-d49f-d13971fc0209.jpeg)





------------------------------------------------------------------
ここで指定したプロジェクトのProjectNumberが確認できる。
※指定するべきなのはProjectIdではなくProjectNumberなので注意。
![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/41775/a1148e88-6536-45e0-5f5d-907173851b60.jpeg)

参考まで。
SyncAdapter の管理をうまいことまとめるやつを作った話

https://github.com/nohana/Eligor

`SyncAdapter`といえば、知る人ぞ知る機能な感じも有りますが、簡単に言うと AccountManager の Account に紐付いて、クラウドデータとの同期をバックグラウンドで自動的に実行してくれる仕組みです。
フレームワークが実行のタイミングを制御するので、アプリケーションを作る上では、呼び出しによって実行される手続きをテンプレートに沿って記述すれば良いことになります。

このあたりの詳しい話は、[こちら](https://github.com/mixi-inc/AndroidTraining/wiki/2.15.-ContentProvider-%E3%81%AE%E7%99%BA%E5%B1%95#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%90%8C%E6%9C%9F)にまとまったドキュメントが有ります。

SyncAdapter 自体は、アプリケーションが複数個保持することが出来るようになっています。
そして、SyncAdapter そのものを直接扱うことはほとんどありませんが、その管理は ContentResolver によって行われます。
この SyncAdapter の管理の、ContentResolver の static なメソッドを介して行う部分について、ラップしたオブジェクトを用いて透過的に取り扱えるようにしたのが、このライブラリになります。

## 初期化と登録

`Application`の拡張クラスで、初期化処理を行います。

```java

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Eligor.initialize(1000); // sync period is set by default as every 1sec

        Eligor.getInstance().registerPeriodicSyncManager(new PeriodicSyncManager(new Account("account_name", "account_type"), "authority")); // register manager
    }

    @Override
    public void onTerminate() {
        Eligor.destroy();
        super.onTerminate();
    }
}
```

オブジェクトの初期化は`Eligor#initialize(int)`で行います。
この後、アプリケーションが持つ SyncAdapter に関する情報を`Eligor#registerPeriodicSyncManager(IPeriodicSyncManager)`で登録します。

同期を実行する ContentProvider の Authority ごと Account を紐付ける形になります。

必要があれば、`Eligor#applyPeriod()`で同期間隔を登録し、システムに同期の開始を依頼します。

## その他の操作

手動で同期する場合は、`Eligor#requestSync()`を呼び出します。

```java

public class MyActivity extends Activity {
    private final Eligor mEligor = Eligor.getInstance(); // you may inject the instance by DI container using Provider.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_sample)
    }

    public void onSyncButtonClick(View view) {
        mEligor.requestSync(); // start provider sync manually
    }
}
```

SyncAdapter の操作に関するメソッドには、Authority 文字列を受け取るものとそうでないものが有ります。
Authority 文字列を受け取らないものは、`Eligor`に登録したすべての SyncAdapter に対して操作を実行します。
対して、Authority 文字列を受け取るものは、対応する SyncAdapter にのみ操作を実行するようになります。
rails_adminでenumな値は数字でなくlocaleの値を表示させたい

例えば性別で、DBのカラムに0, 1とかで入ってるけど、表示時に男性、女性などと表示させたい場合の方法。

本来なら`:enum`だけで良くない？って思ったけど、他にも記述する必要がありました。

## config
ja.ymlは以下だという前提。

```yaml:ja.yml
ja:
  gender:
    - '男性'
    - '女性'
```

`config/initializers/rails_admin.rb`を編集すると色々カスタマイズできます。

以下はあくまで例

```config/initializers/rails_admin.rb
RailsAdmin.config do |config|

  ＜略＞

  config.model 'User' do
    # いじらない項目についても書いておかないと省かれてしまうので列挙
    field :id
    field :email

    # :enumを書くことで新規作成時などにプルダウンで選択できて便利
    field :gender, :enum do
      # 表示用の設定
      # valueには表示項目の値が入ってくる(この場合は0 or 1)
      # nameにはfieldの名前が入ってくる(この場合はgemder)
      pretty_value do
        I18n.t(name)[value] if value
      end

      # csvなどでエクスポートするときの設定
      export_value do
        I18n.t(name)[value] if value
      end
      enum do
        I18n.t(name)
      end
    end

    # 今回のenumの話とは関係無けど誕生日と一緒に年齢を表示する方法
    field :birth_date do
      pretty_value do
        age = Time.now.year - value.year
        "#{value.strftime("%Y-%m-%d")} (#{age}才)"
      end
      export_value do
        age = Time.now.year - value.year
        "#{value.strftime("%Y-%m-%d")} (#{age}才)"
      end
    end
  end
end

```

もっとスマートな方法があったら教えて欲しいです。例えばja.ymlのどこかに書くだけでいいとか。。。

## 参考
https://github.com/sferik/rails_admin/wiki/Railsadmin-DSL#search_word=enum
https://github.com/sferik/rails_admin/wiki/Enumeration
Rubyで学ぶデザインパターン - Iterator


[Wantedlyエンジニア新人研修（設計）](http://qiita.com/awakia/items/72899343cebb7dd5ef57)の1回目

## チェックポイント

- ArrayはIteratorを使っているか？
- HashはIteratorを使っているか？
- 自分でIteratable(Enumerable)なクラスは書けるか？
- Rubyでインターフェースは存在しないがどう置き換えられているか？


```
#
#
#
#
#
#
#
#
#
#
#
#
# 自分で調べる時間確保のための余白
#
#
#
#
#
#
#
#
#
#
#
#
```

## 1. どういう時に使うか	

集合の要素を全走査したいとき。
Rubyで言えば `XXX.each` でループを回せる部分。

## 2. メリット (+デメリット)

**メリット**
個々の要素とその集合という概念を扱えるようになる。

**デメリット**
特になし。

## 3. このパターンを使わないとどうなるか

配列やDB的なidがあるものに関しては`for (int i = 0; i < x.size(); i++)`というような決まり文句で代替が効く。

文字列をKeyにした集合だと、そのkeyの配列などがない限り個々の要素にアクセスする方法がなくなってしまう。


## 4. Rubyではどう書くか

この本のAggregatorは実際のJavaでは[Iterable](http://docs.oracle.com/javase/jp/7/api/java/lang/Iterable.html)になっている。[Iterator](http://docs.oracle.com/javase/jp/7/api/java/util/Iterator.html)はそのまま。

これに対応するのが、[Enumerable](http://ruby-doc.org/core-2.1.1/Enumerable.html)と[Enumerator](http://ruby-doc.org/core-2.1.1/Enumerator.html)。

要素のクラスに[Enumerable](http://ruby-doc.org/core-2.1.1/Enumerable.html)をincludeした上で、`each`を`yield`を用いて実装する。

```ruby
def each
   # ...
   yield
   # ...
end
```

ちなみに、Enumerableは、更に、要素に対して順序付けをすることも出来るようになっている。
その場合は`<=>`という比較演算子を定義すれば良い。
これで`sort`ができるので小さい順に操作したり、`min`や`max`を取得することが出来る。

## 5. Ruby/Rails/Gemで実際に使われている場面

率直には、先ほどのEnumerable。
その他パターンを使っているのは、String, Array, Hash, RailsだとActiveRecordなど多岐にわたる。

## その他余談

### Rubyはインターフェースは存在しないがどう置き換えられているか


- 機能追加：モジュールとしてインクルードする(mixin)

これによりインターフェースの問題である実装を共有できなくコードの重複が生じる問題が解決できる。

- メソッドの実装の強制：テストを書くことで保証する

メソッドがあることだけ保証したくて実装はそのクラスによる場合は上のモジュールでは解決しない。ただそのメソッドが呼び出し可能であることを保証したいなら、TDDならテストを書けと言うのは、新しい考え方だけど納得できる。

### ArrayListの実装、LinkedListとの違い

ArrayListってListを巡るようにイテレートしてるの？？という話を聞かれたので、LinkedListとArrayListの違いを説明した。

ArrayListの実装は、ポインタで要素ごとを結ぶLinkedListとは違い、基本的にただの配列。予め、ある程度の大きさの配列を用意しておき、そこに要素を追加していく。予め用意された配列の大きさを超えるときはより大きい配列を作成しそこに今までの要素をコピーしてから追加する。

この時、サイズ増加を10,20,30,40というようにするとコピーのコストが無視できなくなるが、10,20,40,80というように指数的に増やしていけば、コピーのコストはO(1)になる。この違いは例えば1000個要素を追加するとき何回コピーが発生するかを考えればわかるはず。

この実装はオーバーヘッドがそんなにないためRubyの場合は配列といった時に既にこういう実装になっている。
Perlでミリ秒単位の時間計測を行う（Time::HiResを利用）

Perlでミリ秒以下の計測を行うためには [Time::HiRes](http://perldoc.jp/docs/modules/Time-HiRes-1.55/HiRes.pod) モジュールを利用します。

以下にサンプルを示します。

```pl
use strict;
use warnings;
use utf8;
use feature qw( say );
binmode(STDOUT, ":utf8");

use Time::HiRes qw( usleep gettimeofday tv_interval );

# 現在時刻を取得（[currentsec, currentmicrosec]の構造になっている）
my $t0 = [gettimeofday];

# 200 * 1000マイクロ秒 → 200ミリ秒のsleep
usleep(200 * 1000);

#  浮動小数点数で経過時間を取得（このサンプルだと0.20xxxx秒程）
my $elapsed = tv_interval($t0);

say int($elapsed * 1000), "ミリ秒";
```

お手軽にワンライナーで実験するなら次のようになります。

```bash
perl -MTime::HiRes=usleep,gettimeofday,tv_interval -E 'my $t0 = [gettimeofday]; usleep(200 * 1000); say int(tv_interval($t0) * 1000)'
```

特定の関数の実行時間を測りたいときはミリ秒の精度が欲しいため、筆者は上記の方法でよく計測しています。
.tブランチ作ったらproveがおかしくなった


proveでテストを実行する適当なPerlプロジェクトがあるとします．

```perl
$ prove -lr
t/lib/Hoge.t .. ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.02 cusr  0.01 csys =  0.07 CPU)
Result: PASS
```

ここに.tで終わるブランチなんかを作ってしまい‥

```
$ git checkout -b fugafuga.t
Switched to a new branch 'fugafuga.t'
```

```
$ prove -lr
./.git/logs/refs/heads/fugafuga.t .. Number found where operator expected at ./.git/logs/refs/heads/fugafuga.t line 1, near 

(途中略)

Execution of ./.git/refs/heads/fugafuga.t aborted due to compilation errors.
./.git/refs/heads/fugafuga.t ....... Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
./t/lib/Hoge.t ..................... ok

Test Summary Report
-------------------
./.git/logs/refs/heads/fugafuga.t (Wstat: 65280 Tests: 0 Failed: 0)
  Non-zero exit status: 255
  Parse errors: No plan found in TAP output
./.git/refs/heads/fugafuga.t     (Wstat: 65280 Tests: 0 Failed: 0)
  Non-zero exit status: 255
  Parse errors: No plan found in TAP output
Files=3, Tests=1,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.02 cusr  0.01 csys =  0.07 CPU)
Result: FAIL
```

ギャース!
proveさんが.git/logs/refs/heads/fugafuga.tをテストだと勘違いしてしまいテストが失敗する羽目に．
.gitなんて勝手に除外してくれてるものだと思い込んでいたのでかなり面食らってしまった．

```
$ prove -lr t/
t/lib/Hoge.t .. ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.02 cusr  0.01 csys =  0.07 CPU)
Result: PASS
```

ちゃんとDirectory指定してあげればいいんだけどめんどい．
git diff で特定のファイル、ディレクトリを除外したい

自動生成されたファイルなど、diff で無視したいケースはままあると思う。

diff(1) だと --exclude(-x) でそれができる。

トピックブランチで比較的大きな変更をしていて、特定ディレクトリ以下にしか差分がないことを確認したかったんだけど、git-diff にはそういったオプションが無いらしい。

調べてみると `filterdiff` がよさそうだった。git-diff 以外にも patch ファイルとかにも使えるしね。

# インストール

filterdiff は [patchutils](http://cyberelk.net/tim/software/patchutils/) に含まれる。
HomeBrew なら

```
brew install patchutils
```

ついでに colordiff も入れておく

```
brew install colordiff
```

# 使ってみた

```shell-session
git diff develop..master | filterdiff -p1 -x 'app/*'
```

-x で無視したいファイル/ディレクトリを指定している。gitignore みたいなワイルドカード指定もできる。

-p1 は PATH の頭を削るためのおまじない。a/, b/ を削っている。

```diff
diff --git a/.gitignore b/.gitignore
index 887682e..abfd4a4 100644
--- a/.gitignore
+++ b/.gitignore
```

# ちょっと味気ないよね

そのままだとハイライトされなくて寂しいので colordiff を組み合わせる:

```shell-session
git diff develop..master | filterdiff -p1 -x 'app/*' | colordiff
```

# less 通したいなぁ

流れてしまってスクロールさせるのめんどくさいよね。
そのまま less に渡すと白黒に戻ってしまうから -R オプションを渡す。
ついでに、-X で、git diff のようにページャを閉じても、最後の表示がコンソールに残るようになる。

```shell-session
git diff develop..master | filterdiff -p1 -x 'app/*' | colordiff | less -RX
```
[Xcode] PonyDebuggerを使って快適デバッグ


[PonyDebugger](https://github.com/square/PonyDebugger)というのを見つけました。
これ、導入したらとても捗りそう。

ざっくりとどんなものかと言うと、Google ChromeのDevToolsがiOSで使える、と考えると分かりやすいです。
Githubで掲載されている画像を見てもらうと分かると思います↓

![イメージ](https://github.com/square/PonyDebugger/raw/master/Documentation/Images/ViewHierarchyDebugging.png)

Viewがどういう状況にあるのかをDOMのように表示してくれます。
また、選択した要素をハイライトしてくれるので分かりやすいです。
（画像の右側の薄いブルーが乗ってるところ）

さらに便利機能として、出力されたHTMLにはviewの種類やクラス名などの他に`frame`も含まれています。
そして、なんとこれを編集すると実際にiOS側の状態もしっかりとアップデートされます。
なので細かい位置とかを調整するのにも使えそうです。



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

まず、サーバのインストールを行います。

```zsh
curl -sk https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | \
  python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger
```

ただ、自分の環境では途中で怒られました。その場合は以下のように手動でpipモジュールをインストールします。

```zsh
pip install -U -e git+https://github.com/square/PonyDebugger.git#egg=ponydebugger --allow-external pybonjour --allow-unverified pybonjour
```

（おそらく）devtoolsのupdateも必要なので、`ponyd`をインストールしたディレクトリに移動し、以下のコマンドでdevtoolsをupdateします。

```zsh
ponyd update-devtools
```

これらについては[こちらのissues](https://github.com/square/PonyDebugger/issues/100)を参考にしました。

##サーバの起動

無事、サーバとクライアントの準備が整ったら、サーバを起動し、iOS側からサーバに接続します。
サーバの起動は以下のようにします。

```zsh
ponyd serve --listen-interface=127.0.0.1
```

ちなみにIPアドレスを`0.0.0.0`にし、クライアントからの接続先をPCのものにすると実機でも同様のデバッグができるようです。

##クライアント側（Objective-C側）の準備 - デバッグ項目を有効化する

いくつか用意されているデバッグの機能は、明示的に有効化する必要があります。
また、有効化した上でいくつかの指定をする必要があります。
`#import <PonyDebugger/PonyDebugger.h>`でインポートして、以下のようにそれぞれ設定します。

###Viewの階層構造を確認する

HTMLのDOMのように、階層構造を表示します。
一緒に表示させるプロパティを指定して出力内容を変えることができます。

```objc
PDDebugger *debugger = [PDDebugger defaultInstance];

// 階層構造出力を有効化
[debugger enableViewHierarchyDebugging];
[debugger setDisplayViewAttributeKeyPaths:@[@"frame", @"hidden", @"alpha", @"opaque", @"backgroundColor"];
```

実際の出力は↓こんな感じ。
![スクリーンショット 2014-04-14 22.26.54.png](https://qiita-image-store.s3.amazonaws.com/0/5616/23e20765-60dc-6d32-d587-8d327b58976c.png "スクリーンショット 2014-04-14 22.26.54.png")


###CoreDataを確認する

PonyDebuggerは、CoreDataの状況を出力する機能も持っています。
今、どんなデータが保存されているのか、とても分かりやすく表示してくれます。

```objc
// CoreData Debuggingを有効化
[debugger enableCoreDataDebugging];

// 特定のManagedObjectContextをデバッガに登録
[debugger addManagedObjectContext:self.managedObjectContext withName:@"some name"];
```

たんに有効化しただけではダメで、最後の`addManagedObjectContext:withName:`メソッドを利用して、確認したいCoreDataのコンテキストを登録する必要があります。

実際の表示は↓こんな感じ。
![coredata-sample.png](https://qiita-image-store.s3.amazonaws.com/0/5616/d734dc8a-934b-88ff-41b9-09055f66e36a.png "coredata-sample.png")

###Remote Loggingでオブジェクトの詳細を出力する

Google Chromeのconsoleのように、指定したオブジェクトの詳細をログとして表示する機能があります。
PonyDebuggerのログに出力するには`PDLog`か`PDLogObjects`を利用します。

```objc
// テキストを出力
PDLog("Simple string log.");

// オブジェクトの詳細を出力
PDLogObjects(anyObject);
```

実際に出力された結果は↓こんな感じ。分かりやすい。
![スクリーンショット 2014-04-14 22.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/5616/caaacde8-0dc0-19f3-60a7-d44d8b4ac5f6.png "スクリーンショット 2014-04-14 22.10.43.png")


###Networkの状態を可視化する

これについては実際の動作が確認できませんでした。
sendSynchronousRequestを使っているからかもしれません。（デリゲートならうまくいくのかも）
確認できたら追記します。
『Team Geek』を読んだメモ

[Team Geek――Googleのギークたちはいかにしてチームを作るのか](https://www.oreilly.co.jp/books/9784873116303/)

読んだメモまとめた。半分目次みたいなもの。

## はじめに
- 人間は難しい
- 人間は断続的なバグの大きな塊だ

## 天才プログラマの神話
	完成してないものを見られたら、何かいわれるんじゃないかと本当に不安だ。
	細かいところまで見られて、馬鹿だと思われないだろうか
- 「早い段階で、高速に、何度も失敗せよ」
	- 高速なフィードバックループ
		- コードレベル
		- プロジェクトループ
- 車輪の再発明
- バス係数(チーム何人がバスに轢かれたらプロジェクトが破綻するか)
- 「アイデアを胸にしまい込む」問題
- ソフトフェア開発はチームスポーツである。

### 3本柱(HRT)
-  謙虚(Humility)
-  尊敬(Respect)
-  信頼(Trust)

#### あらゆる人間関係の衝突は、謙虚・尊敬・信頼の欠如によるものだ。

## 実践HRT
- エゴをなくす
- 建設的な批判と攻撃的な非難の違い
- 君は君の書いたコードでない
	- 相手に対する疑問ではなく自分の疑問として謙虚に聞く
- google社是「失敗は選択肢の一つ」
- 失敗の文章化(postmortem: 何を学んだか、何を変更するか)

## 素晴らしいチーム文化を作る
### ミッション・ステートメント
- 方向性
- スコープの制限

### MTGルール
- 必要な人だけを呼ぶ
- アジェンダを作ってMTG前に配布
- MTGのゴールを達成したら時間前でも終了
- MTGを順調に進める
- MTG開始時間を強制的に中断される時間の前に設定する

## 船にはキャプテンが必要
- 組立ラインの労働者交換とは違い、エンジニアは数ヶ月かけて新しいチームに追いつく
- 伝統的なマネージャーはどうやって仕事を完了されるか考える
- リーダーはなにができるかを考える。
- googleではTL(チームリード)とTLM（テクニカルチームリード）の２つの役割がある
- 管理したくなる衝動を抑える
- サーバンドリーダーシップ(執事や召使いのように奉仕すること)

### アンチパターン
- 自分の言いなりになる人を採用する
- パフォーマンスが低い人を無視する
	- ソフトフェア開発において人間を扱う部分が一番難しい
	- 最も難しいのは期待に応えない人をどうするか
	- 「願いは戦略ではない」
- 人間の問題を無視する
- 採用を妥協する
	- スティーブ・ジョブズ「Aランクの人はAランクをBランクの人はCランクの人を採用する」

### リーダーシップパターン
- エゴをなくす
	- チームを信頼する
	- 当事者意識と成功(失敗)の説明責任と最終責任を与える
	- ミスをした時に謝る
- 禅マスターになる
	- 自分の考えを伝えて平静を保つこと
	- 質問→彼が自分で問題解決できるように支援する
- 触媒になる
	- 合意形成
	- 適切な答えを知るよりも、適切な人を知るほうが価値がある
	- 安心感を与えてリスクを取れるようにする

- メンターになる(下記があればよい)
	- チームのプロセスとシステムの経験
	- 誰かに教える能力
	- 相手がどれだけ支援を必要しているかを把握する能力

## 有害な人に対処する
- 排除するのは有害な人ではなく、有害な振る舞い
- 他人の時間を尊重する
- 短期的なメリットのために文化を妥協する必要はない
- 無能で十分説明されることに悪意を見出すな
	- 人を善人と悪人でわけるのは単純
	- HRTに対する自分の期待を明確にすること

## 組織的操作の技法
### 理想
- 理想的なマネージャー
	- 責任の範囲を広げよう
	- リスクをとろう
	- 大人らしく振る舞おう
	- 質問しよう
	- マネージャーはエスパーではない

### 現実
	幸せの家庭は同じようなものだが、不幸な家庭にはそれぞれの不幸がある
- 悪いマネージャー
- オフィスの政治家 
- 悪い組織

### 組織を操作する
- 許可を求めるより寛容を求めるほうが簡単
- 道がないなら道を作る
	- アイディアはクレジットを考えなければうまくいく
- 悪い習慣はやめることはできない。良い習慣と置き換えなければならない
- 「攻撃的」な仕事と「防御的」な仕事
- 会社の組織の外側に「親切の経済」
	- 仕事や会社をやめても講座がゼロにならない
- 安全なポジションまで昇格する

### 忙しい人にお願いする方法
- 「3つの箇条書きと行動要請」
	- 問題を説明する(最大)3つの箇条書き
	- 1つだけの行動要請

## ユーザーも人間
###  一般認識を管理する
	多くの人は論理と感情を同じくらい使う
	ソフトフェアに対する感情的な知覚に配慮しなければならない

### ユーザーに集中すれば、他のことはすべてついてくる
- 言っていることを文字通り解釈するのではなく、何を意図しているか理解すること

### 信頼と喜びを作る
- 感情的に正が積み重なった結果の信頼
- 信頼は大事なリソース。残高に気を配る
	- 行動をするときは必ず残高への影響を考えよう
	- 短期的な利便性ではなく、長期的なイメージを大切に
- 喜びも大事な感情

### ユーザーのことを忘れない
- マーケティング
- ユーザビリティ
- 顧客サービス
xubuntu でホームディレクトリ以下の日本語ディレクトリ名を英語にする方法と、その副作用の後始末

# 事象

Ubuntu を日本語を選択してインストールすると、ホームディレクトリ以下に日本語で「デスクトップ」だの「ダウンロード」だの日本語のディレクトリができて鬱陶しい事この上ない。

# 解消法

以下のコマンドで出てくるダイアログの指示に従えば、英語に変更できる。

```shell-session
$ LANG=C xdg-user-dirs-gtk-update
```

ただし、すでにそれらのディレクトリを使用していると、英語のディレクトリは作られるが日本語ディレクトリも残ってしまうので、自分で始末する必要がある。
特に、「デスクトップ」はその特性上（常に「そこ」にあって使用中）なので、再起動してからでないと消せない（と思う）。

# 変更による問題

英語に変更した後、起動時に /usr/bin/blueman-applet がエラーを起こす。これは /home/user/.gconf/apps/blueman/transfer/%gconf.xml の中に "/home/user/公開" という記述が残っているから。
「公開」を「Public」に変更してあげれば、エラーは解消される。

## 2017-08-15 追記

いつのまにか（16.04 から？）blueman の管理方法が変わったようで、最近のバージョンでは上記のエラーは出なくなった（そもそもその設定ファイル自体がない）かわりに、"/home/user_name/ダウンロード" が見つからないとか言われるようになった。
gsettings (dconf) というシステムを使っているようで、そこの設定に "/home/user_name/ダウンロード" が残っているので修正してあげないといけない。管理用のコマンドラインツールが用意されているので以下のように正しいディレクトリ名に修正してあげればよい。（この設定ファイルはバイナリなので、テキストエディタで修正というわけにはいかない）

```shell-session
# user_name の部分は自分のユーザー名に置き換える
$ gsettings set org.blueman.transfer shared-path '/home/user_name/Downloads'
```

この節を追加する際に参考にしたもの → [UbuntuでBluemanがダウンロードディレクトリがないと言ってくる](http://blog.mwsoft.jp/article/175788130.html)
ありがとうございました。

## 2018-07-26 追記

もしかしたら、英語でインストールしてあとから日本語（とIM）を入れたほうが早いし環境も汚れないかもしれない。
ということに最近気づいた。
Ubuntuでsudoした時にPATHが引き継がれない時の対策

"/etc/environment"に書かれてるらしい
これ毎度毎度編集するより.bash_profileにこれ書いておくのが一番楽そう
aliasだからその他のオプション効かなくなるけど多分いらないだろ
必要になったらエスケープして呼び出せばいいし利便性考えるとこれでいいかな

.bash_profile

~~~bash
alias sudo='sudo env PATH=$PATH'
~~~
Perlで時刻計算を行う - Time::Piece 編 -

```pl:Piece.pl
#!/usr/bin/env perl

use strict;
use warnings;

use Time::Piece;
use Time::Seconds;

# Time::Pieceオブジェクトの取得
my $t;
$t = "2012-01-15"; # 入力パラメータとかで渡ってきたとする。
if ($t) {
	$t = Time::Piece->strptime($t, '%Y-%m-%d');
}
else {
	$t = localtime; # 渡ってこなければ現在時刻
}
# 日付や時刻の情報の表示
$t = $t->ymd;
print $t->ymd,"\n";
$t += ONE_MONTH; # 一ヶ月後
print $t->ymd,"\n";
```

>結果
2012-01-15
2012-02-14

>結果（localtimeが渡ったとき)
2014-04-14
2014-05-15


もっと良い方法があれば教えてください。

以上
コーディング規約を徹底するXcode + Uncrustifyでコード整形


チームでコーディング規約を徹底する方法としてXcodeに整形させる方法があると思うのでメモ。

## Uncrustifyを使う

Objective-Cのコード整形をするツールの一つとして[Uncrustify](http://uncrustify.sourceforge.net/)がある。Xcodeから実行するプラグインとして[BBUncrustifyPlugin](https://github.com/benoitsan/BBUncrustifyPlugin-Xcode)があるのでこちらから利用する。BBUncrustifyPlugin 2.0.2ではuncrustify 0.60が同梱されている。

## BBUncrustifyPlugin 2.0

### インストール

1. https://github.com/benoitsan/BBUncrustifyPlugin-Xcode/releases からダウンロード
1. ``UncrustifyPlugin.xcplugin`` を ``~/Library/Application Support/Developer/Shared/Xcode/Plug-ins`` にコピー
1. Xcodeを再起動

他の方法としてプロジェクトをcloneしてXcodeでビルドしてもインストールできる。``git pull`` + ビルドでアップデートもできるのでこっちのがいいかも。

プラグインが認識されればXcodeに **Edit > Format Code** メニューが追加される。このメニューからは整形範囲として

* **Format Selected Files** (選択したファイルの整形)
* **Format Active File** (アクティブなファイルの整形)
* **Format Selected Lines** (選択した行の整形)

の3つが実行できる。稀に意図した整形にならないことがあるので個人的にはエディタで選択した行の整形(Format Selected Lines)を使うことが多い。

![2014-03-27_1401.png](https://qiita-image-store.s3.amazonaws.com/0/2435/25c4997c-961a-6c7d-d9af-b312f9cc8555.png "2014-03-27_1401.png")

### Formatterの設定

BBUncrustifyPlugin 2.0ではClangFormatも追加されているのでFormatterとしてUncrustifyを設定しておく必要がある。

**Edit > Format Code > BBUncrustifyPlugin Preferences...** を選択してFormatterに **Uncrustify** を選択する。

![BBUncrustifyPlugin_Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/2435/5f8bdcac-3115-317c-4044-281f4114b7e0.png "BBUncrustifyPlugin_Preferences.png")

### キーボードショートカットキーを設定する

OS X 10.9で **Format Selected Lines** メニューのショートカットキーを設定する例。

**システム環境設定 > キーボード > ショートカットタブ > アプリケーション** から **+** ボタンを押す。

![keyboard.png](https://qiita-image-store.s3.amazonaws.com/0/2435/21161d9f-d4fb-8011-204c-a840c6e9bf27.png "keyboard.png")

|項目|内容|
|:--|:--|
|アプリケーション|Xcode|
|メニュータイトル|Format Selected Lines|
|キーボードショートカット|お好みで|

なんとなくAndroid Studio(IntellJ系)でReformat Codeのショートカットを **Cmd + Opt + L** に設定しているので揃えてる。

## Uncrustify.cfgの作成

``~/.uncrustify/uncrustify.cfg`` に整形ルールを作成する。

デフォルトの設定ファイルは [http://uncrustify.sourceforge.net/default.cfg](http://uncrustify.sourceforge.net/default.cfg)
からダウンロードできる。

日本語での説明としては以下の記事が参考になる。
[意識の高さからかコードフォーマッター設定を公開](http://qiita.com/ayakix/items/3f05da9541b8e130e39f)

プロジェクト毎に設定したい場合はプロジェクトディレクトリ(ソースファイルと同じディレクトリか親ディレクトリ)に ``uncrustify.cfg`` を配置する方法もあるが未確認。

自分の規約に沿って作ったファイルを参考までに以下に公開。(前に作ったのを ``uncrustify --update-config-with-doc`` で更新したものだけど作成途中だったような気もする)
https://gist.github.com/makotokw/9799874

チームではgistやリポジトリ管理したものを共有して各自が``~/.uncrustify/uncrustify.cfg`` に配置する。プロジェクト毎に作るのは面倒だがプロジェクトリポジトリに置いた方が良いのだろうか。良い運用方法があれば知りたい。

## その他

* BBUncrustifyPlugin以外から使いたい場合などuncrustifyはHomebrewからもインストールできる。

```
brew install uncrustify
```

> Usage Examples
cat foo.d | uncrustify -q -c my.cfg -l d
uncrustify -c my.cfg -f foo.d
uncrustify -c my.cfg -f foo.d -L0-2,20-23,51
uncrustify -c my.cfg -f foo.d -o foo.d
uncrustify -c my.cfg foo.d
uncrustify -c my.cfg --replace foo.d
uncrustify -c my.cfg --no-backup foo.d
uncrustify -c my.cfg --prefix=out -F files.txt

* ClangFormatも機会があれば調べてみたい。
MacでJavaの環境構築をする方法


Macには最初からJava（Apple）が入っている。
この記事では、標準で入ってるJava（Apple）とは別に新しいバージョンのJava（Oracle）を入れることを想定している。

# まず、最初から入ってるJavaのバージョンとパスを確認
ターミナル上で、

```terminal
$ java -version
```
(「$」はターミナル上でのコマンドを表しており、実際に入力するのは「java -version」)

によりバージョンを確認できる。標準では`バージョン1.6.0`が入っていた。2014年4月14日現在、`バージョン1.6.0`は古い。

同様にしてパスを確認すると、

```terminal
$ which java
```

によりパスを確認できる。パスは、

```
/System/Library/Java/JavaVirtualMachines
```

だった。

# JDKのインストール
そもそも、Javaをインストールするためには

* JDK
* JRE

のいずれかをインストールすることになる。
簡単にこの2つの説明をすると、JDKはJavaで開発するツールキット（開発者用）で、JREはJavaを実行する環境（実行者用）である。

エンジニアがJavaを開発用に使うならJDKを落とせば良い。
JDKはJREを内包してるので、JDKの方が広い用途で使える。

# パスの設定
Windowsだと手動でパスの設定をしなくてはいけなかったが、Macでは自動でパス設定される。

パッケージインストールする時に自動でやってくれるらしい。
パス自体は、`~/.bash_profile`に記述すればよいが、パスをたどるとシンボリックリンクとやらでJavaのありかをみてくれているみたい。

新しく入れたJava（Oracle）のありかは、

```
/Library/Java/JavaVirtualMachines
```
だった。

# まとめ
MacでJava開発環境を作るには、`JDK`を落とせばOK！
【参加メモ】第20回 JAWS-UG 東京勉強会

#初めに
2013年12月から暫く時間の開いた、JAUS-UG東京の勉強会に参加してきました。
今回のテーマは「いきなり宴会でLT大会！」。
リラックスした雰囲気の中、幅広い分野のお話を聞けました。
広くて綺麗な会場とソフトドリンクの提供頂いたSAPさん、東京支部の方々、そして講演者の方々に感謝です。

![IMG_20140411_185620.jpg](https://qiita-image-store.s3.amazonaws.com/0/39112/9a2b9655-775d-4e3a-826e-14649940fb25.jpeg)



#レポート
## AWSサービスアップデート
### ADSJ 荒木さん
http://www.slideshare.net/ar_maniacs/aws-update-jawstokyopublic

堀内さん、ダブルブッキングとの事で荒木さんが登壇。
発覚が当日のお昼でも、しっかりフェイルオーバ出来るのは流石です。

## Windows デバッグのお話
### ADSJ 吉松さん

AD周りで利用されるRPCのお話など。
デバッグコードの話まで聞けるとは予想外でした。

## VM Import / Export
### サーバーワークス宮澤さん
http://www.slideshare.net/KeiMiyazawa/introduction-vm-import-33444083

Windowsサーバの注意事項などについて。
コンソール取れないEC2ではやはりRDPが命綱。
Cygwinもお客様環境には簡単には入れられないし、
しかたなしでしょうか。。。

## Amazon WorkSpacesをつかってみた
### ADSJ げんたさん
http://www.slideshare.net/GentaWatanabe/amazon-workspaces

3月にパブリックベータが解放されたWorkSpacesのお話

## VPC Peeringの話し（仮）
### クラスメソッド望月さん
http://www.slideshare.net/masaomoc1015/vpcvpc-peering

詳細は
>JAWSUG Tokyo #20 でLTしてきた
http://dev.classmethod.jp/cloud/aws/jawsug-tokyo-vpcpeering/


## PythonでKinesis ～ ぱいきね！
### ALBERT 池内さん
http://www.slideshare.net/iktakahiro/pythonkinesis-in-20aws-user-group-japan-20140411

Kinesisを標準APIで叩くお話。
Amazon Kinesis Client Library の対応言語拡充、AWS CLIでハマった身としても期待したい所です。

## AWS Summit San Franciscoツアー参加ネタ
### NRI 内田さん、ISAO 広田さん

3/26にSF開催のAWSサミットツアー参加者の方によるお話。
沖縄方面の存在感が印象的でした。

## AWS で社内オンライン勉強会
### 春原さん
http://www.slideshare.net/suno88/suno88-jawsug-tokyo20

同業態の業界に在席していた身として、身につまされるお話。
JAWS-UG長野支部発足されるとの事で、上信越方面の活躍に期待です。

## AWS as code & test
### サーバーワークス 柳瀬さん
http://www.slideshare.net/serverworks/aws-as-codeandtest

EC2でプログラマブルに構築出来る様になったインフラ、
プログラマブルにテストしようというお話。

最近見たserverspecを活用されているヌーラボさんの情報
すごく勉強になったし、
地雷のノウハウ、コードで共有出来る意味は大きいと思うこの頃です。

> ヌーラボのインフラ運用最前線 〜イミュータブルを目指して〜 
http://nulab-inc.com/ja/blog/nulab/nulab-immutable-infrastructure_2/

## VirtualBoxのCentOS6.5をVMImportして、HVMなインスタンスを作る
### cloudpack 齊藤さん
http://www.slideshare.net/clpshinji/virtual-boxvm-import

この日2回目の、VM Import / Export のお話。

p2v、v2vを行わず再構築可能なシステムが理想だけど、
奇跡的なバランスで動いているサーバも多いのも事実。

c3世代のHVM対応もあるし、クリーンなAMIの持ち込み手段として、
Importは出来るようにする価値ありそう。
vCentor環境触れる間に試しておかないとです。


## JAWS-UG 東京 Summer Party!! 
### ADSJ 小島さん

飛び込みLT、一人目は小嶋さん。
7/18(金)のJAWS-UG 東京 Summer Party!! と、
その前座、7/17,18のAWS Summit Tokyo 2014のお知らせ。

受付開始の告知メール登録、登録してねとの事でした。
http://www.awssummittokyo.com/


## AWS上で動くWindows Server ライセンスのお話
### JAWS-UG 東京宴会部長 横田
クラウドベンダ経由で提供されるMSライセンス、SPLAのお話。

>Windows Server on AWSにCALは必要か確認した
http://dev.classmethod.jp/cloud/windows-server-on-aws-cal/

オンプレミスなWindowsサーバ環境をクラウド化する理由の一つとして、
SPLAによるCAL節約効果が謳えそうというお話。

ただ、リモートデスクトップサーバ用のライセンスなど例外はある模様。
現職でSPLAやVL少し齧った事もあるけど、複雑怪奇なMSのライセンス周り、商売広げるつもりあるなら、なんとかして欲しい所です。
失敗しない差分納品のためのメモ

納品ファイルを作るの苦手なのでめも。

# タイムスタンプで抽出

[Cowsee](http://utweb.jp/air/cowsee/)
”この時間以降”という風に更新時間を指定してファイルをリスト化、抽出してくれて便利。
抽出しやすいように、あらかじめ作業時間をメモするなりした方がいいかも。
作業時間がまとまってないと大変なので、やっぱりGitは必要かも。

# Git
SourceTree使いに何かいいのないかなと思ったらあった。
[Git初心者でも差分ファイルを一瞬で取り出すMac用SourceTreeスクリプト](https://www.eyemovic.com/blog_it/4747.php)


けど、カスタムアクション（コマンド登録）機能はMacにしかないっぽい...。


そんなわけで、コマンド打てばいいっぽい。まだ検証してないけど。
[GitやSvnなどの差分ファイル抽出決定版 - なんたらノート第三期ベータ](http://tanakahisateru.hatenablog.jp/entry/20111003/1317623104)



~~他、いい方法がないか模索中...~~

コメントで `git archive` と `git diff` の合わせ技を教えてもらい、
SourceTreeのターミナルでやってみたらすんなりいけました。わーい。

参考：[gitで差分ファイルを抽出する - Qiita](http://qiita.com/kaminaly/items/28f9cb4e680deb700833)


これを機にコマンド、もう少し覚えようと思います…
gitの差分をvimdiffで表示すると見やすい！


こんな感じで差分が表示されます。
左右に並ぶので比較しやすいです。
編集もできるので「あ、変なログが残っちゃってたわ」みたいなときササッと直せます。

![スクリーンショット 2014-04-14 19.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/29775/a1399a11-3b39-d6a9-ee3f-4f8f55cc48a4.png "スクリーンショット 2014-04-14 19.15.16.png")



##設定手順

###STEP1

.gitconfigに以下の設定を追加します。

```:.gitconfig
[diff]
  external = git_diff_wrapper
[pager]
  diff =
```

###STEP2
以下の様なgit_diff_wrapperというファイルを作成し、PATHの通っている場所に置きます。
私の場合```/usr/local/bin```に置きました。

```:git_diff_wrapper
#!/bin/sh
vimdiff "$2" "$5"
```

あとはいつも通りgit diffをすればOK！

※git_diff_wrapperに実行権限エラーがでたら```chmod a+x git_diff_wrapper```とかで実行権限を追加。
メモ for 俺

とりあえずコミット:
`$ git commit -am "$(date "+%F %T")"`

とりあえずタグ打ち:
`$ git tag tmp$(date +%m%d_%H%M)`

git のコミットグラフを視覚化:
`$ git log --graph --date-order --date=short --format="%Cgreen%h%Creset %ad %Cgreen%an%Creset %s %Cgreen%d%Creset" --branches --tags --remotes`

バックスラッシュが円マークになってしまうのを回避:
`$ git config core.pager 'sed -r '\''s/\\(\x1b[^ ]+ )/∖\1/g'\'' | less -+S'`

ビットマップの生バイナリを画像ファイルに変換:
`$ convert -size 1024x1024 -depth 16 -endian LSB GRAY:image.bin image.png`

```.screenrc
defencoding UTF-8 escape ^z^z hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w %=%h"
```
OS XでのGit環境セットアップ

あらまし
=======

OS Xで、新しくGit環境をセットアップする手順を解説する。

プラットフォームは以下のとおり

* OS X 10.8.5
* Xcode 5.1.1

以下の手順を行い、環境をセットアップする

1. OS Xの開発環境 Xcodeのインストール
2. Command Line Tools for Xcode のインストール
3. パッケージマネージャ Homebrew のインストール
4. git, bash-completion のインストール
5. git の基本設定

Xcodeのインストール
-----------------

1. App Storeを開く（Finder → アプリケーション → App Store）
2. Xcodeを検索する（右上の検索ボックスにXcodeと入力しreturn）
3. "無料"と表記されているところをクリックする
4. Apple IDの入力を求められるので、入力する
5. インストールが開始されるのでしばらく待つ
6. 表記がインストール済になったら終わり

Command Line Tools for Xcode のインストール
------------------------------

Xcodeだけでは、`/usr/bin/gcc`等がなく、後述のHomebrew等がうまく動かない。
これを提供するCommand Line Tools for Xcode をインストールする。

1. Xcodeを開く（Finder → アプリケーション → Xcode）
2. メニューバー → Xcode → Preferences を開く
3. Downloadsアイコンをクリックする
4. Components にある Command Line Tools をインストールする（右にある↓アイコンをクリック）
5. 管理者権限を求められるので、IDとパスワードを入力する

パッケージマネージャ Homebrew のインストール
----------------------------------------

最新バージョンのソフトウェアをインストールするために、 [Homebrew](http://brew.sh/index_ja.html) をインストールする。

1. ターミナルを開く（Finder → アプリケーション → ユーティリティ → コンソール）
2. 必要に応じて、プロキシのセットアップを行う
    * `export http_proxy=http://YOURHOST:YOURPORT`
    * `export https_proxy=http://YOURHOST:YOURPORT`
3. http://brew.sh/index_ja.html#install から、インストール用コマンドラインをコピペ、実行する
    * 2014/04/14現在は、 `ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"`
4. `brew doctor` で問題なくインストールできているか確認する
5. 問題なければ、 `brew update` でインデックスを更新する

git, bash-completion のインストール
---------------------------------

Homebrewで`git`と、これを操作するのに不可欠な`bash-completion`をインストールする。

1. ターミナルを開く（Finder → アプリケーション → ユーティリティ → コンソール）
2. 必要に応じて、プロキシのセットアップを行う
    * `export http_proxy=http://YOURHOST:YOURPORT`
    * `export https_proxy=http://YOURHOST:YOURPORT`
3. `brew install git`を実行する
4. `~/.bash_profile` に `export PATH=/usr/local/bin:$PATH`を追記する
    * Ex. `echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bash_profile` 
5. `brew install bash-completion`を実行する
6. `~/.bash_profile` に `source /usr/local/etc/bash_completion`を追記する
    * Ex. `echo 'source /usr/local/etc/bash_completion' >> ~/.bash_profile`

git の基本設定
-------------

git で作業をする前に、必要な設定を行う。

1. ユーザ名（githubのユーザ名等）を設定する
    * `git config --global user.name YOUR_USER_NAME`

2. メールアドレス（github等の登録メールアドレス等）を設定する
    * `git config --global user.email YOUR_MAIL_ADDRESS`

3. SSH鍵ペアを生成する
    * `ssh-keygen` で対話的に生成する
    * 基本的に、パスはデフォルトの`/Users/YOUR_USER_NAME/.ssh/id_rsa`で問題ない
    * パスフレーズは特別な理由がない限り、設定しておくこと

4. エディタを設定する
    * VIM の場合 `git config --global core.editor vim`
    * Sublime Text 2 の場合 `git config --global core.editor '/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl -n -w $1'`
    * OS X付属のテキストエディットを使う場合 `git config --global core.editor "open -e -n -W"`
        * コミットログ編集後は、`Cmd+q`で終了させてください。

参考
====

* Sublime Text 2 をGitのエディタに設定する方法
    * [Associating text editors with Git · GitHub Help](https://help.github.com/articles/associating-text-editors-with-git)
ランタイムライブラリについて

---
visualstudioのランタイムライブラリオプションに関するメモ。
lib名との対応など。

|オプション|利用ライブラリ|自動定義されるマクロ|
|:---|:---|:---|
|/MD|MSVCRT.lib (実行時にmsvcr90.dll使用)|_MT _DLL|
|/MDd|MSVCRTD.lib (実行時にmsvcr90d.dll使用)|_MT _DLL _DEBUG|
|/MT|LIBCMT.lib(静的リンク)|_MT|
|/MTd|LIBCMTD.lib(静的リンク)|_MT _DEBUG|

利用する全てのモジュールは同じランタイムライブラリオプションでコンパイルする必要がある。

CRT = C Run-Time