OmniAICreator/Qiita-1.07M huggingface dataset:
Xcode6 Storyboardサイズクラスにより使用するContstraintsを切り替えるには【メモ】

#Storyboardサイズクラスにより使用するContstraintsを切り替えるには

Xcode6.0から利用できるようになった、StoryBoardのサイズクラス（Size Class）を利用して、iPhoneの縦向き、横向きでConstraintsの値を切り替える方法を確認してみました。

##やりたいこと
以下のように、iPhone縦向き（ポートレート）と横向き（ランドスケープ）の状態により、一つの部品の位置設定（Constraints）を切り替えたい。

※異なるConstraintsを切り替えるのではなく、Constraintsの値だけを切り替える方法もあります。

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/9a169224-de50-3989-de06-8378692e0724.png)

##デフォルト画面の構成
Storyboardでサイズクラスを使ってデザインをする場合には、まずは基本のサイズクラスである**wAny,hAny**でレイアウトを構成します。

1.ImageViewの作成
　
![image](https://qiita-image-store.s3.amazonaws.com/0/59249/2c339f2d-34e3-9e6d-1c78-325bd9f453d9.png)
　

2.ImageViewに、Constraintsの設定

|![image](https://qiita-image-store.s3.amazonaws.com/0/59249/07a0f3a4-7a78-d6d9-987c-7d1b807c56dd.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/59249/9eb6500a-0031-f105-d298-d3d352d022c4.png)|

3.プレビュー結果
　
![image](https://qiita-image-store.s3.amazonaws.com/0/59249/7551e0ab-fbb3-6e40-aea7-265a1e51e84a.png)

##横向き（ランドスケープ）の時、特定のConstraintsを無効に設定

1.サイズクラスをiPhoneランドスケープに切り替える

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/8de4fa03-b7cd-ac7d-e212-f1ddd6526b5a.png)

2.無効にしたいConstraintsを選択し、サイズクラスを追加する

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/3ca6a88b-fd89-13a3-f973-7e76ac3c7a89.png)

3.現在切り替えているサイズクラス（iPhoneランドスケープ）の設定を追加

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/5dbbd5e0-0c80-5ade-6bff-50e2122e3e3f.png)

4.選択中のConstraintsに、サイズクラスごとの2つの設定が追加される

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/f93b9217-9340-af72-8fad-beef860fcb5e.png)

5.追加したランドスケープ用のConstraintsを無効にする

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/0f24d8f9-d879-f645-a350-9a0cc8014153.png)

##横向き（ランドスケープ）の時だけ使用するConstraintsを追加

1.現在のConstraintsの状態

|![image](https://qiita-image-store.s3.amazonaws.com/0/59249/3e732ce0-1a86-dbbb-60a5-42a74e0542a5.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/59249/0c9062b4-83c3-2292-2e53-f02fb83e502f.png)|

2.サイズクラスをiPhoneランドスケープに切り替えてから、ImageViewを移動し、Constraintsを設定

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/718facaf-8d9e-6695-ba7f-dda98deb4e58.png)


##画像を設定して、動作を確認

1.画面のプレビュー

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/9a169224-de50-3989-de06-8378692e0724.png)

2.縦画面のConstraintsの状態

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/f2975714-97e0-3eb4-72d5-424021a350d4.png)

3.横画面のConstraintsの状態

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/38e10bc1-4772-fbae-99e0-3bbe50089186.png)
GAMEBOY開発環境紹介

# まともに現存しているのは2つ？
* GBDK
* RGBDS

他にも環境の存在は確認してますが、リンク切れだったりユーザーみかけなかったり…
情報募集中です。

ちなみに上記2つはどちらも複数OSで動作可能です。

# GBDK(GameBoy Developers Kit)
* 公式：[GBDK - home](http://gbdk.sourceforge.net/)
* 2002年4月を最後に開発停止中
* **C言語 + インラインアセンブラ**

>The GameBoy Developer's Kit (GBDK), is a set of tools that enable to develop programs for the Nintendo GameBoy system, either in C or in assembly. 


ニコニコ大百科がよくまとまってました。
[GBDKとは (ジービーディーケーとは) [単語記事] - ニコニコ大百科](http://dic.nicovideo.jp/a/gbdk)

# RGBDS(Rednex GameBoy Development System)
* 公式：[JustinLloyd / RGBDS Gameboy Development System — Bitbucket](https://bitbucket.org/JustinLloyd/rgbds-gameboy-development-system)
* forkされたものが開発継続中：[bentley/rgbds](https://github.com/bentley/rgbds)

>rgbds-linux is a fork of the original RGBDS which aims to make the programs
more like other UNIX tools.

* **アセンブラ**

>RGBDS (Rednex Game Boy Development System) is a free assembler/linker package
for the Game Boy and Game Boy Color.

#余談
アセンブラ理解度0から始める入門書には[熱血！アセンブラ入門](http://www.shuwasystem.co.jp/products/7980html/4180.html)がオススメです。
bash入門

###補完

まず知っておきたい基本的な機能が補完です。
コマンドプロンプトでTabキーを押すことで、コマンド名やファイル名を補完することが出来ます。


```bash:補完
% ls
abc1  abc2  def
% cat a[Tab]
% cat abc

```

確定できる部分までが補完されました。ここからさらに2回Tabキーを叩くと候補が表示されます。

```:補完2

% cat abc[Tab][Tab]
abc1  abc2

```

###リダイレクト
コマンドの出力をファイルや別のコマンドに振り分ける (リダイレクション)
コマンドを実行したとき、その出力をファイルに書き込みたい場合は

```bash:リダイレクト

% command > file.txt

```

```bash:リダイレクト例

% ls *.sh > list.txt

```



とする。

###標準出力と標準エラー出力

(標準入力 : 0)
標準出力 : 1 ※画面に出力される
標準エラー出力 : 2　※画面に出力される

※0,1,2はファイルディスクリプタと呼ぶ

```bash:標準出力

% ls *.sh > list.txt
% cat ./list.txt
test.sh

```

※list.txt　には該当するファイル名が出力される

```bash:標準エラー出力

% ls *.txt > list.txt
% ls: cannot access *.txt: No such file or directory

```

※list.txt　には何も出力されない
CSSでデジタルっぽい数字の表現をする

この記事は[Frontrend Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/frontrend) 2日目の記事です。

# CSSでデジタルっぽい数字の表現をする

![digital-counter.png](https://qiita-image-store.s3.amazonaws.com/0/21225/6b13a0ef-44ab-ca67-6a3c-ba7e145a1dd9.png)

実際のサンプルとコードは[Codepen](http://codepen.io/hiloki/pen/azvZab)で確認できる。
（Google Chrome 39.0.2171.71 だけでしかまだ確認していない）

よくある`<div></div>`一個でシリーズとかでもなく、`<span></span>`でドット部分を用意し、`position:absolute`で配置し、点灯箇所を数字ごとに変えているだけ。上下のドットだけで構成しているような場合は、`<div></div>`一個でもつくれそうな気がしないでもないが、真ん中のタイプはちょっと苦しそうだったので、素直に`<span></span>`を並べてつくった。

## 真ん中のやつ

上下は特に難しいことはしていないが、真ん中のやつは、少しばかりどうつくるか悩んだ。コード全体は先ほどのCodepenのCSSペインにある、`.counter-digital`のあたりをみると良い。悩んだ割には単純で、擬似要素で配置した上で隣接する部分の隙間を空けるために、`transform:translate(n)`でずらす、みたいなことをやっている。

## currentColorはすばらしい

点灯時・非点灯時の色をうまく管理するために、`currentColor`を使っている。colorプロパティおよび`currentColor`については、「[ご存じですか、colorプロパティ](http://geckotang.github.io/presentation-color/)」のスライドがわかりやすいとおもう。
あとは、[CSSConf AUのSimuraiのプレゼンテーション](https://www.youtube.com/watch?v=jPOBVaomzLE)も見るのをおすすめする。

*追記*
currentColorについては[Keeping CSS short with currentColor](http://osvaldas.info/keeping-css-short-with-currentcolor)も良いかも。

今回使っているところの一部をピックアップすれば次のようなコード。

```
.counter--0 .counter__bit:nth-child(1) {
  color: #ffEE29; /* この色を */
}

.counter--digital .counter__bit:nth-child(2):before,
.counter--digital .counter__bit:nth-child(10):before,
.counter--digital .counter__bit:nth-child(18):before {
  top: 0;
  bottom: 0;
  right: 100%;
  border-right-color: currentColor; /* こっちにも */
}
```

もし`currentColor`を使わなければ、各所に`#ffEE29`を書くことになり、変更するときにはそれらを変えなければいけなくなる。上手く使えば純粋なCSSでも、本サンプルや、先ほど紹介したSimuraiのデモのようなものをつくるときに、ちょっと便利になる。
※ `currentColor`キーワードのブラウザの対応については調べきれていない...ので、詳しい人情報ください。

## でもまあHTMLもCSSもくっそ多い

CSSに関しては、そもそももうちょっと書き方工夫できそうだなーっていうのはあるのだけど、何よりもHTMLが多い。

なので、おまけとしてWeb Components化、もとい[Polymerを使って~~手抜き~~簡単なもの](http://codepen.io/hiloki/pen/vENxNe)を作った。

```
<d-counter counter="0" type="digital">0</d-counter>
<d-counter counter="1" type="digital">1</d-counter>
<d-counter counter="2" type="digital">2</d-counter>
<d-counter counter="3" type="digital">3</d-counter>
<d-counter counter="4" type="digital">4</d-counter>
<d-counter counter="5" type="digital">5</d-counter>
<d-counter counter="6" type="digital">6</d-counter>
<d-counter counter="7" type="digital">7</d-counter>
<d-counter counter="8" type="digital">8</d-counter>
<d-counter counter="9" type="digital">9</d-counter>
```

こういう感じのカスタム要素にして、大量の`<span></span>`は隠蔽してしまうとすっきり。

## まとめ

実用性がありそうな、そうでもないような、CSSネタでした。
cocos2d-xからObjective-C++を利用して、iOS標準のメールアプリを呼び出す。

#cocos2d-xからメールアプリを呼びたい
静的な関数でopenMailを実装します。また、Objective-C++に挑戦します。

##openMail関数のヘッダ
```cocos2d-x:Mail.h
#pragma once
#include <stdio.h>
#include <platform/CCApplicationProtocol.h>

class CC_DLL Mail : public cocos2d::ApplicationProtocol{
    
public:
    static void openMail(const char *adress,const char *subject = "",const char *body = "",const char *cc = "");
};
```
ヘッダはc++として書いているけどOKなのか疑問

##openMail関数の実装
```cocos2d-x:Mail.mm
void MyApplication::openMail(const char *adress,const char *subject,const char *body,const char *cc){
        
    NSString *adressNS = [[NSString alloc] initWithUTF8String:adress];
    NSString *subjectNS = [[NSString alloc] initWithUTF8String:subject];
    NSString *bodyNS = [[NSString alloc] initWithUTF8String:body];
    NSString *ccNS = [[NSString alloc] initWithUTF8String:cc];
     
    NSString*scheme = [NSString stringWithFormat:@"mailto:%@?cc=%@&subject=%@&body=%@",adressNS,ccNS,subjectNS,bodyNS];
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:scheme]];
    
}
```
Objective-Cがわからないので、NSStringをallocしてるのがちゃんと開放されるのかが心配・・・

##注意点
最初Xcode6.1のiOSのシュミレーターで試していたが、メールアプリが入っておらず、動かなくてハマった。実機では、ちゃんと動いた。
launchctl load で Operation not permitted（解決？）



tmux上でlaunchctl loadを実行すると以下のエラーが出ました。

```bash
 [~/Library/LaunchAgents]
$ launchctl load jp.blazeworks.test.plist
/Users/kiarina/Library/LaunchAgents/jp.blazeworks.test.plist: Operation not permitted
```

tmuxを使わなければ出ません。
理由はわかっていないが1日ハマってしまいました…
タイルの説明によく使う図（地理院タイル版）

http://smellman.hatenablog.com/entry/2014/11/29/041003 で公表されている、「タイルの説明に使うあの図」をアレンジして地理院タイル版にしてみた。homebrew で導入しただけの imagemagick で動く。

```ruby
for z in 0..2
  for x in 0...(2 ** z)
    for y in 0...(2 ** z)
      next if File.exist?("#{z}_#{x}_#{y}.png")
      `wget -O #{z}_#{x}_#{y}.png http://cyberjapandata.gsi.go.jp/xyz/std/#{z}/#{x}/#{y}.png`
    end
  end
end

for z in 0..2
  files = []
  for y in 0...(2 ** z)
    for x in 0...(2 ** z)
      `convert -font '/System/Library/Fonts/HelveticaNeue.dfont' -pointsize 48 -gravity center -annotate 0 "#{z}/#{x}/#{y}" #{z}_#{x}_#{y}.png with_txt_#{z}_#{x}_#{y}.png`
      files << "with_txt_#{z}_#{x}_#{y}.png"
    end
  end
  `montage #{files.join(' ')} -geometry +#{z+1}+#{z+1} conv_#{z}.png`
end
```
逆境を力に


本記事は、プログラミング未経験で入社してから今までの８ヶ月を振り返ってみた内容になっています。

##振り返ってみて

大きくわけて３つのことを強く感じていたなぁと思います。

* チームでやることは難しい...
* ペアプロしたいのに...
* いつのまにか...

##チームでやることは難しい...
僕は入社してすぐにプライドはずたずたになります。ITの知識が全くない状態で入社しました。
しかし入社した４日目にはスクラム手法での開発、ペアコーディング、チームレビュー。
何もわからないまま開発が進んでいく。
他の人にとっての当たり前が、僕にはそうではない。

「こんなこと教えなきゃいけないの」、「これじゃ全然進まないじゃん」と馬鹿にされていると思っていました。
こういう経験は初めてのことでとても悔しい思いをしました。

しかしこれを糧に絶対に見返えしてやるというモチベーションで必死に努力することができ、
すごく辛い思いはしましたが早いうちに、スクラムの手法で開発を経験をしたことは良い体験をさせてもらったなと思います。

##ペアプロしたいのに...
入社してから5ヶ月が経ち先輩社員の方とペアプロで作業することになりました。
ここでもまた僕は少し頭を抱えます。

会話を広げるために天気の話やくだらない話を投げかけても、「はい」か「そうですね」という答え。
ペアで取り組んでいるのに気がつくと別々に作業していて、会話がなく１日が終わる。
そんな日々が１ヶ月ほど続きました。
僕はまた落ち込み「僕のことを嫌いなんじゃないか」と思うようになりました。

しかし目をそむけるのではなく根気強くぶつかっていくと僕のことを嫌いなのではなく、
ものすごい集中力を発揮するため周りに意識がいきにくいだけということに気が付きました。

振り返ってみると仕事のことよりも相手と距離を縮めることを考えていた時間の方が長いような気がします。
今では、会話は増え、作業効率やノウハウの獲得ができるようになったと確信しています。
ペアプロをやっていく上で本当にコミュニケーションが大切だなと感じました。

##いつのまにか...
僕が今の会社に入社を決めたのは、「一流の人間はやる仕事を選ばず、どんな環境でも価値を発揮できる。
そんな価値ある人になりたい」と思ったからで、未経験のIT分野で働くことを決めました。

そう決意して入社したにもかかわらず、問題を絶対に解決しようという気持ちに欠けているということにふと気が付きました。
わからないことが当たり前という気持ちで「できなくてもしょうがない」という風に考えていたようです。特に不慣れな言語で実装する時に多いようです。

それからは「苦難や逆光を人よりも多く体験し成長するために、この会社に入社した」ということを思い返し、
変化や挑戦を欲張りに求めていこうと感じています。

##来年に向けて
来年は２つの力を特に高めていく

####プログラミング力
プログラミングを学び初めてJavaに触れる機会が多かったため、他の言語にかなり抵抗をもってしまっています。
なので、プログラミング言語をただの「ツール」として考えられるようになっていきたいなと思います。
####肯定的影響力
つい問題にぶち当たると、「できない」とか「難しい」、「こんなの無理だよ」という言葉で自分の限界を作ってしまいます。
「できない」という言葉は「どうしたらできる」であったり、
「難しい」という言葉は「これを乗り越えたらすごく成長できるな」などのプラスの言葉に変換して、
自分のモチベーションだけでなく自分の周りの人にもいい影響をあたえることを心がけていきたいですね。

####来年の目標
* 自社開催のプログラミングコンテストで優秀賞を年間で一番多く取る。
* 2ヶ月毎に１つプログラミング言語を学習
* 月に一度、ITカレンダーなどにも掲載されている外部のコミュニティに参加する

##まとめ
今回この記事を書いて思ったことは、

信念を持っていて本当によかったな。ということです。

苦痛や困難に出会った時に頼れるのは両親や友達でもなく、会社や会社の先輩、同僚でもなくやはり自分だと思います。
自分に信念がなければ会社をやめて得意な分野に転職していたかもしれません。

今以上に信念を強くもち会社はもちろん、日本や世界に貢献してけるような「志事」をしたいと思っています。


さて、明日は佐藤さんです。
同期の仲間であり、ライバル。いつも刺激をもらってる存在です。
佐藤さん、よろしくお願いします。
Jetson TK1 をセットアップしてみた

Maker Faire Tokyo 2014のNVIDIAブースで [Jetson TK1](http://www.nvidia.co.jp/object/jetson-tk1-embedded-dev-kit-jp.html) の即売が行われてて、ついうっかり買ってしまったので、いろいろ弄ってみることに。仕様をみる限りだと、OSはTK1用のカスタマイズ(L4T)がされているものの、ほぼデスクトップのUbuntu14らしいので、まずはssh経由でつないでガチャガチャといじれる環境を作ってみました。

![jetson.jpg](https://qiita-image-store.s3.amazonaws.com/0/44774/df25327f-4d31-bf11-82f5-5e426f7ee903.jpeg)

#設置

##入出力機器をつなぐ

USBとイーサネットポートがあるので、このままキーボード、マウスをつなぎ、ネットワークにつなぐことができます。ディスプレイ出力はHDMIなので、最近のならいいかもしれませんが、すこし古いディスプレイだとDVIやVGAへの変換が必要です。

これだけでちょっとした(32ビットだけど、GPUだけアンバランスに強力な)デスクトップLinux機になります。

##ネットワークの設定をする

ビルトインのイーサネットポートは最初はDHCPの設定になっています。sshでつないで作業できるようにするために、これを固定IPアドレスにします。/etc/network/interfaces を書き換えますが、直に書き換えずにシンボリックリンクでワンクッション入れることにします。

```
$ cd /etc/network 
$ sudo mv interfaces interfaces.default
$ cat interfaces.static
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.xxx.yyy
netmask 255.255.255.0
broadcast 192.168.xxx.255
gateway 192.168.xxx.zzz

$ ln -sf interfaces.static interfaces
$
```

デフォルトのネームサーバも設定しておきます。

```
$ sudo cat /etc/resolv.conf
# nameserver 127.0.1.1
nameserver 192.168.xxx.zzz
nameserver 8.8.8.8
nameserver 8.8.4.4
$
```

sshdは既に動いているので、設定にこだわりがなければ特に不要です。これでいつでもsshで入れるようになりました。

\# 自宅のネットワークにはリモートアクセス用にVPNを用意してるので、いつでも外から使えます:)

#(最低限の)開発環境を作る

##CUDAツールキットをインストール

Jetson TK1を使う以上CUDAはなければ、ということでCUDAツールキットをインストールします。

CUDAツールキットは、https://developer.nvidia.com/linux-tegra-rel-19 からダウンロードします。最新のCUDAツールキットは6.5ですが、JetsonのL4Tが古いR19なので、CUDAのツールキットもそれに対応したもの(CUDA 6.0 Toolkit for L4T Rel-19.2)を入手します。

```
$ sudo dpkg -i cuda-repo-l4t-r19.2_6.0-42_armhf.deb 
$ sudo apt-get update
$ sudo apt-get install cuda-toolkit-6-0
$ ls -l /usr/local/
lrwxrwxrwx  1 root root    8 Nov 25 14:48 cuda -> cuda-6.0
drwxr-xr-x 10 root root 4096 Nov 25 14:47 cuda-6.0
$ /usr/local/cuda/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Sat_Mar_15_02:05:29_PDT_2014
Cuda compilation tools, release 6.0, V6.0.1
$
```

##universalリポジトリを使えるようにする

CUDAのツールキットだけではたぶんどうにもならなくて、必要な開発ツールやライブラリが必要になると思います。というかすぐにそうなったので、必要なものをすぐインストールできるように、aptにUbuntuのuniversalリポジトリを加えておきます。

```
$ sudo add-apt-repository universe
$ sudo apt-get update
$
```

これで、だいたいの作業にとりかかるうえでのベース環境が整いました。

---

#L4Tが古い

既に書いているように、OS(L4T)が一世代古いです。アップグレードしたいと思いますが、Ubuntu14が動いている母艦が必要な模様。当方、MacしかないのだけどVMwareでいけるかなぁ...

アップグレード方法は同じくJetsonを衝動買いした、[tnayukiさんのノート](http://qiita.com/tnayuki/items/a9ceb7d219bea1c88c8b)が参考になりそう。
GoのAPIサーバで使っているライブラリの紹介


## 経緯
先日のGoConではGengoさんが自社のAPIサーバの概要を紹介してらっしゃったので、弊社もAPIサーバの構成の紹介をしていきたいと思います。第一回は利用しているライブラリの紹介をさせていただきます。

## ライブラリ一覧
ひとまず使ってるものを列挙させていただくと以下のようになっています。

- zenazn/goji
- guregu/null
- guregu/toki
- guregu/clock
- unrolled/render
- guregu/mogi
- go-redis/redis
- guregu/buildver
- y-matsuwitter/fluent-logger-golang

弊社エンジニアgregの自作ライブラリが多く使われてます。

## zenazn/goji
gojiはmartiniライクなサーバ用ライブラリです。
最近は日本でも人気になってきました。

gojiとmartiniの一番大きな違いを上げると`goji is not a magick.`という一文に尽きると思います。
reflectパッケージなどを使わずシンプルに書かれており、martiniの使いやすさと遜色なく、パフォーマンスも高いものとなっています。

https://github.com/zenazn/goji


## unrolled/render
MartiniのRenderを参考に実装されたHTTPのレスポンスを組み立ててくれるライブラリです。JSON, HTML, XMLあたりに対応している模様です。

https://github.com/unrolled/render

## go-redis/redis
Redisのライブラリです。`redigo`の方が有名かもしれませんが、個人的にはこちらの方が書き方が好きなのでこちらを利用しています。

https://github.com/go-redis/redis

## guregu/null, guregu/toki
こちらはsqlのnull値や時刻をJSONに変換する際に、null値や空文字、指定のフォーマットに変換する際に便利なライブラリです。

https://github.com/guregu/null
https://github.com/guregu/toki

## guregu/clock
こちらのclockは現在時刻を内部で使うような関数がある場合に、テストしやすいようmock化するものです。

https://github.com/guregu/clock

## guregu/mogi
こちらはSQLのスタブライブラリです。下記のように非常に直感的な書き方ができます。詳細は本人がそのうち紹介してくれると思うので、省きます。

```
mogi.Select("id", "name", "brewery", "pct").
	From("beer").
	Where("id", 1).
	StubCSV(`1,Yona Yona Ale,Yo-Ho Brewing,5.5`)
```

https://github.com/guregu/mogi

## guregu/buildver
アプリのバージョン番号を比較するためのユーティリティになります。
社内だと通常のストア用のバージョン番号では`1.1.1`のように3つ、iOSのビルド番号を`1.1.1.1`の用に4つの数字で表現するので、これらで正しくバージョン比較を行うために作成されています。

https://github.com/guregu/builver

## y-matsuwitter/fluent-logger-golang
Fluentロガーです。特に説明するものはありません。

## 最後に
振り返ってみると、思ったよりも使ってるライブラリは少なかったです。
よく勉強会でも話しているのですが、Goは標準ライブラリが充実しているため、それほど外部のライブラリに依存すること無く、割と規模の大きいサーバでも構築しやすいと言うのがよいとこだと思っています。
単にライブラリ紹介するだけだと面白みがないので、今後Go開発の社内のやり方などを共有させていただきます。
Scratchの保存先を変更する


[dkandalov/scratch](https://github.com/dkandalov/scratch)に書いてあったが、設定ファイル(scratch_config.xml)のパスが違っていたので備忘録として残す。

```
# PhpStorm7の場合
/Users/<user_name>/Library/Preferences/WebIde70/options/scratch_config.xml

# PhpStorm8の場合
/Users/<user_name>/Library/Preferences/WebIde80/options/scratch_config.xml
```

Scratchを`~/phpstrom_scratch`に保存したい場合は、以下のように書く。

```scratch_config.xml
<?xml version="1.0" encoding="UTF-8"?>
<application>
  <component name="ScratchConfig">
    <option name="defaultScratchMeaning" value="TOPMOST" />
    <option name="fullScratchNamesOrdered">
      <list>
        <option value=“scratch.txt" />
      </list>
    </option>
    <option name="lastOpenedScratch" value=“scratch.txt" />
    <option name="needMigration" value="false" />
    <!--追記-->
    <option name="scratchesFolderPath" value="$USER_HOME$/phpstorm_scratch/" />
  </component>
</application>
```

PhpStormを再起動すれば設定が反映されて、Scratchを新規作成すると先ほど設定したパスに保存される。
Ruby で VC++ 向けソースを生成する際に Unicode 文字を通す

* VC++ は BOM 付き UTF-8 ならば Unicode なソースを食える。（一般には、UTF-8 での BOM はナンセンスだがしようがない。）
* Ruby の文字列リテラルは、そのスクリプトが書いてあったファイルのエンコーディングの影響を受けるが、 Unicode エスケープを含むと UTF-8 になる。

ゆえに

      file = File.open(file_path, "w:utf-8")
      file.write("\uFEFF")

として出力を開始すればよい。

ネットを検索すると、magic comment でスクリプトエンコーディングを utf-8 にした上で "\xEF\xBB\xBF" を出力するものや、Array#pack, String#setbyte, String#force_encoding あたりを使う例が見つかるが、たぶんこれが簡単確実なはず。（古いバージョンでは違ったのかもしれませんが、そこまでは調べていません。）
moreボタンで続きを読む

<a href="http://gimmicklog.main.jp/jquery/67/" target="_blank">jQuery-もっと見るボタンで要素を表示する</a>

**jQuery**

>text$(function(){
    $('.content:not(.content:first-of-type)').css('display','none');//一番上の要素以外を非表示
    $('.more').nextAll('.more').css('display','none');//ボタンを非表示
    $('.more').on('click', function() {
        $(this).css('display','none');//押したボタンを非表示
        $(this).next('.content').slideDown('fast');
        $(this).nextAll('.more:first').css('display','block'); //次のボタンを表示
    });
});



**HTML**
>
	<div class="main">
			<div class="content">
			    <ul>
			        <li>トマト</li>
			        <li>キャベツ</li>
			        <li>もやし</li>
			    </ul>
			</div>
			<div class="more">もっと見る</div>
			 
>			<div class="content">
			    <ul>
			        <li>りんご</li>
			        <li>なし</li>
			        <li>みかん</li>
			    </ul>
			<!-- / .content --></div>
			    <div class="more">もっと見る</div>
			 
>			<div class="content">
			    <ul>
			        <li>さんま</li>
			        <li>さば</li>
			        <li>あじ</li>
			    </ul>
			<!-- / .content --></div>
			    <div class="more">もっと見る</div>
			 
>			<div class="content">
			    <ul>
			        <li>うし</li>
			        <li>とり</li>
			        <li>ぶた</li>
			    </ul>
			<!-- / .content --></div>
		</div>
Agit.vim に最近追加した機能とか紹介

この記事は [Vim Advent Calendar 2014](http://qiita.com/advent-calendar/2014/vim) の2日目の記事です。

僕が作成した Vim から Git のログを見るためのプラグイン、[Agit.vim](https://github.com/cohama/agit.vim) についてです。
Agit.vim の基本的なことについては以前の記事を参照ください。

[gitk クローンみたいな Vim プラグイン作った](http://qiita.com/c0hama/items/05fadf117c605aa8b592)

## ファイルモード
```vim
:AgitFile
```

と実行することにより Agit をファイルモードとして開くことができます。
ファイルモードではリポジトリ全体の履歴ではなく、ある特定のファイルのみの履歴と、その時のファイルの中身を表示します。

![shot1](http://i.gyazo.com/c876631801fd6a4b514c1ae2e37eb6b2.png)

また、`--file=path/to/file` というオプションで履歴を見たいファイルを指定することもできます。
これだけだとあまり意味はないのですが、後述する unite.vim との連携等 Agit を外部から呼び出したい場合には便利です。

## --dir オプション
```vim
:Agit --dir=path/to/dir
```
で指定したディレクトリを起点として Agit を起動することができるようになりました。
起点として、というのは指定したディレクトリが含まれるリポジトリ全体の履歴を見るということです。

これだけだと特に面白くはないのですが、unite.vim 等と連携するなどすればとても便利になります。
例えば、下記のようなコードを vimrc に書きます。

```vim
let agit_action = {}
function! agit_action.func(dir)
  if isdirectory(a:dir.word)
    let dir = fnamemodify(a:dir.word, ':p')
  else
    let dir = fnamemodify(a:dir.word, ':p:h')
  endif
  execute 'Agit --dir=' . dir
endfunction
call unite#custom#action('file,cdable', 'agit', agit_action)
```

こうすると、例えば `Unite file_mru` のあと (`a` を押してアクションの絞り込みを行い) `agit` というアクションを実行することができるようになります。

この場合 `agit` アクションは指定したファイル、ディレクトリを起点に Agit を起動します。

![unite-agit](http://i.gyazo.com/55b36a0b631126f7d0ec113c49e8c280.png)

(もしかしたらそのうちプラグイン化するかもしれない)


## &lt;C-g&gt; でコミットメッセージを echo エリアに出せるようになった
いちにぃさんが要望を出してくれました。
最初は diff エリアにもコミットメッセージ出ているし不要かなとも思ったんですが、ファイルモードではコミットメッセージが出るエリアはないので実装しました。

![c-g](http://i.gyazo.com/fdd5e984194c16b3864606fefe381756.png)


## 言い訳のような何か
いろいろ他のことも忙しくてこれくらいしか機能追加できてないんですが、将来的にはファイルだけじゃなくて Author とか日付とかで柔軟に絞り込んだり、diff を Vim の diff 機能を使って表示するとかも実装するつもりです。

実際ファイルモード実装するの簡単だろｗとか思ってたんですが、やってみるとかなりの部分で `if filemode` みたいなコードが出てきてしまってこれじゃアカンと思ってコード全体をリファクタリングしてから実装にとりかかりました。
(余談ですが gitv.vim はそういうコードになっています)

時間はかかったのですが、そのおかげで今後の拡張が少しやりやすくなったので今後はもう少し開発スピードを上げていきたいです。。。

明日は koron さんです。
[Swift]自分自身のインスタンスを返すときは"Self" を使うと便利。

戻り値でインスタンスを返すクラスメソッドを作る機会って、結構多いと思うんですが、Swiftでやるときの方法です。

参考サイト：
[objective c - How can I return instancetype in Swift - Stack Overflow](http://stackoverflow.com/questions/24180768/how-can-i-return-instancetype-in-swift)

## インスタンスを返すメソッドの戻り値に “Self" を使う

サンプルコードは下記です。クラスAがあり、 Aを継承してBとCを定義しています。Aに、インスタンスを取得するクラスメソッド instance() を定義し、戻り値をSelfとしています。

で、クラスBとCで instance()を呼ぶと、それぞれBのインスタンスとCのインスタンスを返してくれます。

```
class A {
    required init() {}

    func nameOfClass() -> String {
        return "Class A"
    }

    class func instance() -> Self {
        return self()
    }
}

class B: A {
    required init() {
        super.init()
    }

    override func nameOfClass() -> String {
        return "Class B"
    }
}

class C: A {
    required init() {
        super.init()
    }

    override func nameOfClass() -> String {
        return "Class C"
    }
}

let a = A.instance().nameOfClass() // "Class A"
let b = B.instance().nameOfClass() // "Class B"
let c = C.instance().nameOfClass() // "Class C"

```

## メリット

これの何が便利かと言うと、class Bとclass Cでわざわざinstance()を書かなくて良いところですね。例えば、以下の様なメソッドが不要になります。

```
// こういうのをいちいち書かなくて済む
extension B {
    class func instance() -> B {
        return self()
    }
}
```


### Objective-C の場合

Objective-Cでは “instancetype” で、これと同様のことができます。
Vaadin を動かしてみる

## 経緯

<blockquote class="twitter-tweet" lang="ja"><p>Spring MVC 圧勝とのこと。 / <a href="http://t.co/FIhhw50f8x">http://t.co/FIhhw50f8x</a></p>&mdash; hiroisojp (@hiroisojp) <a href="https://twitter.com/hiroisojp/status/539305065144909824">2014, 12月 1</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

を見て、[Java – Top 10 Java-based Web Frameworks for 2014-2015](http://vitalflux.com/java-top-10-java-based-web-development-frameworks-2014-2015/)にVaadingが入っている~~のにWicketが入ってなくてなんかユーザとして悔しい~~ので、ちょっと触ってみようかなと思った。

## Mavenプロジェクトの作成

[vaadinのdownload](https://vaadin.com/download)にmavenのプロジェクト作成コマンドが載っていたので、素直に実行する。

```bash
$ mvn archetype:generate \           
   -DarchetypeGroupId=com.vaadin \
   -DarchetypeArtifactId=vaadin-archetype-application \
   -DarchetypeVersion=7.3.5 \
   -Dpackaging=war
```

プロパティ情報を求められるので、入力。（version, packageはデフォルトのままにした）

```shell-session
Define value for property 'groupId': : com.exmaple
Define value for property 'artifactId': : vaadin-sample
Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  com.example: :
[INFO] Using property: theme = mytheme
Confirm properties configuration:
groupId: com.example
artifactId: vaadin-sample
version: 1.0-SNAPSHOT
package: com.example
theme: mytheme
 Y: : Y
```

無事にmavenプロジェクトが作成できたら、jettyで動かしてみる。

```bash
$ cd vaadin-sample
$ mvn jetty:run
```

無事に起動したら、http://localhost:8080/ にアクセス。

![vaadin01.png](https://qiita-image-store.s3.amazonaws.com/0/8064/f94ceca0-5fb9-69c3-e2a5-fc7857cc3b03.png)

動いてないじゃないすか！やだー！

[Failed to load the widgetset (after clean installation)](https://vaadin.com/forum#!/thread/2541089)

> mvn vaadin:update-widgetset install

を頼りに、上のコマンドを実行してからもう一度jettyで動作させる。

![vaadin02.png](https://qiita-image-store.s3.amazonaws.com/0/8064/19d31819-86e1-04c9-91ed-8d0a2e89468a.png)

今度は起動した。ボタンを押すとメッセージが増える。

## そのほか

（以下、さっと検索してみた上での所感なので、間違いがあるかもしれません）

Wicketはコンポーネント指向を取り入れて、HTMLテンプレートをサーバサイドのJava（だけ）で書き換えるイメージだけど、VaadinはJavaでHTML（つまりUI）をまるごと生成してしまおうっていうイメージなんだね。そういえば軽量フレームワークが流行り始めた頃に、WicketやClickと対比されてた気もする。

[IDEプラグインも充実してる](https://vaadin.com/eclipse)みたいなので、使い勝手がよければ開発はもちろん、やろうと思えば大学のソフトウェア作成体験学習みたいなものにも使えるかもしれない。

[あとClickListenerとかJava8で書けるっぽい](https://vaadin.com/blog/-/blogs/no-need-to-wait-java-8-it-s-great)のが素敵。

でも[atWare,「みなルミーナ」の中のお話(Vaadin)](http://www.atware.co.jp/2013/12/02/vaadin/)によれば、モバイル向けのサービスを作るためには$590/developerの[Vaadin TouchKit](https://vaadin.com/add-ons/touchkit)が必要だという情報を見てちょっと萎える。せめて1桁少なければ...

Wicketと同じように[体系的な入門ドキュメントは（英語だけど）公開されてる](https://vaadin.com/book)みたいだから、ちょっと追ってみようかな。
Ceph and GlusterFS Advent Calendar 2014 Opening

「Ceph」や「GlusterFS」の名前を聞いたことがありますか？ この2つは、ソフトウェアによる分散ストレージの仲間です。HadoopのHDFSやGoogle File Systemの仲間です。

HDFSとの違いはなんでしょうか？それは、CephもGlusterFSも「データの格納場所」としての使い方がメインであることです。HDFSはMapReduceの処理を効率よく行うために設計されていますが、CephとGlusterFSは、普通にマウントして、共有ファイルサーバーとして利用することを目的に設計・開発されました。

どちらも2000年代前半から開発に着手して、現在に至っています。

Cephは、途中で共有ファイルサーバーとしての使い方よりも、AWS S3のようなオブジェクトストレージや、EBSのようなブロックストレージへの対応を先に行いました。その結果、一つのストレージプールをオブジェクト、ブロック、ファイルの3つの使い方ができる非常に珍しいファイルサーバーとして発展を遂げました。

GlusterFSは、ファイルサーバーとして開発を中心に行われました。現在では標準のネイティブプロトコルを始め、NFS、CIFSといった多様なプロトコルで利用できるファイルサーバーとなりました。スナップショットも利用可能です。

このAdvent Calendarでは、このCephとGlusterFSの話題についてまとめていく... のですが、現在書き手が私のみです。ベストエフォートで展開されます。募集中です。
PHPからGroongaを利用する - GDeleteクラス

# GDeleteクラス

 [PHP bindings for  Groonga.](https://github.com/Yujiro3/proonga "PHP bindings for  Groonga.")


```php
GDelete {
  /* メソッド */
  public void __construct(GTable object)
  public void __destruct(void)
  public GDelete key(mixed values)
  public GDelete id(string value)
  public GDelete filter(string value)
  public GDelete exec(void)
}
```


## コンストラクタ　GDelete::__construct

クラスの生成

```php
$delete = new GDelete(gtable);
```

**引数**

| 名前        | 型            | 概要                |
|:-----------:|:-------------:|:-------------------:|
| object      |  GTable       | GTableオブジェクト  |


**戻り値**

なし


```php
$gdb = new Groonga('./db/test.db');

$talbe = $gdb->table('Users');

$delete = $talbe->delete();

print_r($delete);

```

**結果**


```php
GDelete Object
(
)
```





## 変数の設定　GDelete::＊＊＊(string value)


```php
$delete->key('bob')
       ->id('2')
       ->filter('name=Bob')
```

**引数**

| 名前        | 型            | 概要                |
|:-----------:|:-------------:|:-------------------:|
| value       |  string       | 設定値              |


**戻り値**

失敗した場合false
成功時GDeleteオブジェクト

```php
$gdb = new Groonga('./db/test.db');

/* delete --table Users --key alice */
$table = $gdb->table('Users');
$delete = $table->delete();
$delete->key('alice')
       ->exec();
```



## 実行　GDelete::exec

delete処理の実行

```php
$delete->exec();
```
**戻り値**

失敗した場合false
成功時GDeleteオブジェクト

```php
$gdb = new Groonga('./db/test.db');

/* delete --table Users --key alice */
$table = $gdb->table('Users');
$table->delete()->key('alice')->exec();
```

* * *

[PHPからGroongaを利用する-Groongaクラス](http://qiita.com/Yujiro3/items/cb03abcc71bbb2f883f7 "PHPからGroongaを利用する-Groongaクラス")
[PHPからGroongaを利用する-GCommandクラス](http://qiita.com/Yujiro3/items/aa751a66ce4fc37f4aea "PHPからGroongaを利用する-GCommandクラス")
[PHPからGroongaを利用する-GTableクラス](http://qiita.com/Yujiro3/items/1b5cea045621f67100bc "PHPからGroongaを利用する-GTableクラス")
[PHPからGroongaを利用する-GColumnクラス](http://qiita.com/Yujiro3/items/241e9f561be14927e6be "PHPからGroongaを利用する-GColumnクラス")
[PHPからGroongaを利用する-GLoadクラス](http://qiita.com/Yujiro3/items/3f876a277e410fb1b631 "PHPからGroongaを利用する-GLoadクラス")
[PHPからGroongaを利用する-GDeleteクラス](http://qiita.com/Yujiro3/items/45ee01c107f2fa17c6c3 "PHPからGroongaを利用する-GDeleteクラス")
[PHPからGroongaを利用する-GSelectクラス](http://qiita.com/Yujiro3/items/c59094e2c83970bf224f "PHPからGroongaを利用する-GSelectクラス")


[PHPからGroongaを利用する-PHPバインディング](http://qiita.com/Yujiro3/items/e5ea98139f3ee58d46f9)
SoundJS使ってiOSでBGMが鳴らなかった話

CreateJSでゲーム作ってたので、SoundJSで音を鳴らそうと思ったら鳴らなかったんです！

### やりたかったこと
1. ページを開きます
2. Canvasで動くゲームが起動します
3. BGMが鳴ります

PCとかChrome for Androidでは普通にOK。
でもSafari for iOSだとBGMが鳴らない。なぜなんだぜ？

### 音を鳴らす前に画面をタッチさせよう
こことかに（たぶん）書いてある
http://www.createjs.com/tutorials/Mobile%20Safe%20Approach/

つまり、ページを開いただけでいきなり爆音が鳴り響くページは作れないとのこと。
ユーザの操作（タッチとか）に紐づくイベントを起点にしないと音を流し始められないらしい。

### ぼくのとった方法
1. BGM再生予定リスト的な配列にSoundJSのインスタンスを突っ込む
2. JS内でbodyタグにtouchstartイベントを仕込む
3. touchstartイベントが発火したら予定リストの音を鳴らす

### もっと簡単だった方法
タイトル画面に「GAME START」のボタンをつける
vagrant-awsのアクセスキー管理


# はじめに
vagrant-awsは凄く便利ですが、Vagrantfileで`access_key_id`と`secret_access_key`を平文で設定するとGithubなどで公開できないので面倒です。アクセスキーは、AWS CLIやAWS SDKで共通化された、`~/.aws/credentials`に登録するので、ここから持ってくる方法を検討しました。

# 結果
AWS SDK for Rubyを使って簡単に実現できました。以下の通り、`AWS.config.credentials`を使えば、defaultのアクセスキーが取得できます。

```Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "dummy"

  config.vm.provider :aws do |aws, override|

    aws.access_key_id = AWS.config.credentials[:access_key_id]
    aws.secret_access_key = AWS.config.credentials[:secret_access_key]
    	
    aws.keypair_name = "vagrant"
    aws.ami = "ami-b66ed3de"
    aws.instance_type = "t2.micro"
    aws.security_groups = ['webserver']

    override.ssh.username = "ec2-user"
    override.ssh.private_key_path = "~/.aws/vagrant.pem"

  end
end
```


# 事前準備

VagrantfileからAWS SDK for Rubyを呼び出せる必要があります。通常のRubyだと、`gem install aws-sdk`でインストールしますが、Vagrantの場合はVagrantのpluginとしてインストールします。

```
$ vagrant plugin install aws-sdk

$ vagrant plugin list
aws-sdk (1.59.0)
vagrant-aws (0.5.0)
vagrant-login (1.0.1, system)
vagrant-omnibus (1.4.1)
vagrant-share (1.1.2, system)
```
Sencha Ext JS 5 のPhoneGapビルド

Sencha Advent Calendar 2014 2日目
http://www.adventar.org/calendars/490

## Ext JS 5 でハイブリッドアプリの作成

こんばんはxenophyの菅井です。  

これまでデスクトップ向けWEBアプリケーションのフレームワークだったExt JSですが
Ext JS 5からは新たにタブレットもサポートされるようになりました。  

今回はそんなExt JS 5とPhoneGapのリモートビルドを使って
タブレット向けにハイブリッドアプリのパッケージ化をやってみようと思います。

## 準備

準備として以下のインストールを行います。

#### Sencha Cmd
http://www.sencha.com/products/sencha-cmd/download

#### Sencha Ext JS 5（SDKのダウンロード）
http://www.sencha.com/products/extjs/

#### NodeJS
http://nodejs.org/

#### PhoneGap
http://phonegap.com/install/

## アプリケーションの新規作成

それぞれインストールができたらSencha CmdとSencha Ext JS 5のSDKを使用して
Ext JS 5のアプリケーションを新規作成します。

> % `sencha -sdk` ~/Library/Sencha/ext-5.0.1 `generate app` MyApp my-app

* SDKの場所：~/Library/Sencha/ext-5.0.1
* アプリケーション名：MyApp
* 作成ディレクトリ名：my-app

Sencha Cmdでローカルのサーバーを起動

> % `sencha web start`
> Sencha Cmd v5.0.3.324
> [INF] Mapping http://localhost:1841/ to ....
> [INF] ------------------------------------------------------------------
> [INF] Starting web server at : http://localhost:1841
> [INF] ------------------------------------------------------------------

URLをブラウザで表示してみてアプリケーションが正常に作成できていることを確認します。

![my-app](http://goo.gl/1QEwBp)

## PhoneGapビルド

アプリケーションが作成できたら本題のPhoneGapビルドを行います。

#### PhoneGap Buildアカウント作成

まずはリモートビルドを行う為に下記のサイトでPhoneGap Buildのアカウントを作成します。
https://build.phonegap.com/

いくつかアカウントのプランがありますが今回はfreeで問題ありません。

#### ビルド設定

次にアプリケーションを作成したディレクトリ直下にある`app.json`に対して下記のような設定を追加します。
今回の設定はPhoneGapのリモートビルドでAndroid向けにビルドします。
iOS向けにビルドしたい場合は別途「iOS デベロッパー証明書」が必要です。

    /**
     * ビルド設定
     */
    "builds": {
        "native": {
            "packager": "phonegap",
            "phonegap" : {
                "config": {
                    "platform": "android",
                    "remote": true,                    
                    "id": "com.xenophy.my-app",
                    "name": "MyApp"
                }
            }
        }
    },


ビルド設定を追加できたら`local.properties`というファイルを`app.json`と同じ階層に作成します。
内容は次のようにPhoneGap BuildアカウントのIDとパスワードを追記します。

```
phonegap.remote.username=myapp@hoge.com
phonegap.remote.password=hogehoge
```

#### ビルド実行

設定ができたら次のコマンドでPhoneGapのリモートビルドを行います。

> % `sencha app build android`

ターミナルにビルドのメッセージが流れていくので完了するまで少し待ちます。

完了したらPhoneGap BuildのAppsページに移動してビルドされているか確認します。
https://build.phonegap.com/apps

成功していればこのようにAppsの一覧の中に今回ビルドしたアプリケーションが表示されているはずです。
※ちなみにiOSが赤くなっているのは証明書が無いためビルドが失敗しているためです。

![apps](http://goo.gl/SO3Kwb)

ここまででPhoneGapのリモートビルドの流れは一通り完了となります。
この後はAndroidのアイコンをクリックするとapkファイルがダウンロードできるのでそれを実機にもっていくか
表示されているQRコードで実機に直接ダウンロードすればインストール出来るはずです。

## 最後に

今回はローカルの準備が少なくて済むPhoneGapのリモートビルドを使いましたが
個人的な肌感としては最近はCordovaのほうが多く目にする気がします。

次の機会があればCordovaとExt JSでも何かやってみたいと思います。
eclim についての個人的なメモ

vim から eclipse の機能を駆使できる至高のツール eclim についてのとりとめのないメモ。

## インストール方法

## ユースケース

### gradle と組み合わせて使う

build.gradle に書かれた依存性を eclim に解決させるためには、eclipse プラグインの eclipse タスクを使う。

<pre>
gradle eclipse
</pre>

のようにすると、eclipse が読む .classpath ファイルに build.gradle に書かれた依存性がずらずらと書き出される。
この状態でプロジェクト内のファイルを開くと、import 文で警告が出なくなっており、タグジャンプとかも行える。

プロジェクト直下になぜか pom.xml があって、そのまま :Mvn eclipse:eclipse をしてしまうと pom.xml をもとに
.classpath が書き換えられてしまうので、:Mvn eclipse:eclipse は行わないようにする。

あと、`gradle eclipse` したあとで build.gradle を書き換えて依存性を追加した場合、一度 :ProjectRefresh しないと
eclipse 側に依存性が反映されない。

参考:

* [Luciano Fiandesio - VIM configuration for happy Java coding](http://www.lucianofiandesio.com/vim-configuration-for-happy-java-coding)
* [Eclipse Project Management — eclim (eclipse + vim)](http://eclim.org/vim/core/project.html)
* [Eclipse Classpath Editing — eclim (eclipse + vim)](http://eclim.org/vim/java/classpath.html)

## コマンド

### :ProjectRefresh

### :ProjectCreate

プロジェクトを作る。-n は name ではなく nature なので何でもいいわけではなく java と入力することがあることに注意。

<pre>
:CreateProject /path/to/project -n java
</pre>

個人的には gradle の eclipse プラグインで .project と .classpath を書き出すことが多いのであまり使わないかも。

### :ProjectImport

既存のプロジェクトをインポートする。プロジェクト直下で gradle eclipse したあと、.project や .classpath が書き出された状態で vim を開き、下記のように実行するとプロジェクトをインポートすることができる。

<pre>
:ProjectImport .
</pre>

### :JavaConstructor

クラスの中で打つだけで、勝手にコンストラクタがソースに書きこまれる。便利。

### :JavaSearchContext

メソッドとかの上でこのコマンドを打つと、そのメソッドとかのソースが勝手に別ウィンドウで開かれる。便利。

### :JavaGetSet

## その他

* nerd tree と組み合わせると使用感はほぼ eclipse。vim を使っている意味がほとんどないのではないかという気分が味わえる
* docker から eclim 入りのイメージをビルドする方法についてあとで書く
* :ProjectGrep* 系のコマンド、便利そう

## 参考

* [Cheatsheet — eclim (eclipse + vim)](http://eclim.org/cheatsheet.html "Cheatsheet — eclim (eclipse + vim)")
基本的なSharedPreferencesの使い方



#　SharedPreferenceの基本

SharedPreferencesはアプリの設定データをデバイス内に保存するための仕組み。XML形式で保存されます。
（要するにAcitivityが破棄されてもCommitさえされていれば保存されている、ということ）
キー・バリュー形式で保存され、主にテキストや数値の保存を得意とします。
（Gsonを使うことで無理やり(?)オブジェクトなどのデータの保存も可能にすることができます。後半に解説）

基本的には　String int long float boolean を保存します。

## インスタンスの取得
まずはインスタンスを取得します。
取得には　Context#getSharedPreferences()メソッドを用います。


```java:sharedpreferences.java
SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE);
```

GetSharedPreferences("設定データの名前",ファイル操作のモード)

ファイル操作のモードは二つあります。
・Context.MODE_PRIVATE
・Context.MODE_MULTI_PROCESS

そのままの意味ですが「Context.MODE_PRIVATE」はそのアプリないでのみアクセス可能なデータの生成を、「Context.MODE_MULTI_PROCESS」は複数のプロセスが作ったデータに対してアクセスが可能な状態なデータを作ります。


###データの保存方法

```java:sharedpreferences.java
SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = data.edit();
editor.putInt("LevelSave", 1);
editor.apply();
```


今回の処理を上から順に説明します。
・インスタンスの取得をまず行う。（今回はContext.MODE_PRIVATEです。）
・SharedPreferences.Editorオブジェクトを取得。
　これらのオブジェクトには
　　・PutInt
　　・PutString 
　　　　　...etc
　などのメソッドを使ってデータの保存をすることができます。
　今回は"LevelSave"に１を保存しています。もちろん変数も使えます。
・そしてapply()します。これでデータを反映させています。


###　データの読み出し

```java:SharedPrefererences.java
SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE);
int Level = data.getInt("LevelSave",1 );
```

data.getInt("保存データの名前","何も入っていないとき初期化する値");


以上で基本的な動きは終わります。
PHPからGroongaを利用する - GLoadクラス

# GLoadクラス

 [PHP bindings for  Groonga.](https://github.com/Yujiro3/proonga "PHP bindings for  Groonga.")


```php
GLoad {
  /* メソッド */
  public void __construct(GTable object)
  public void __destruct(void)
  public GLoad values(mixed values)
  public GLoad table(string value)
  public GLoad columns(string value)
  public GLoad ifexists(string value)
  public GLoad inputType(string value)
  public GLoad each(string value)
  public GLoad exec(void)
}
```


## コンストラクタ　GLoad::__construct

クラスの生成

```php
$load = new GLoad(gtable);
```

**引数**

| 名前        | 型            | 概要                |
|:-----------:|:-------------:|:-------------------:|
| object      |  GTable       | GTableオブジェクト  |


**戻り値**

なし


```php
$gdb = new Groonga('./db/test.db');
$talbe = $gdb->table('Users');
$load = $talbe->load('[ { "_key": "alice", "name": "Alice" } ]');
print_r($load);
```

**結果**


```php
GLoad Object
(
)
```





## 変数の設定　GLoad::＊＊＊(string value)


```php
$load->values('[ { "_key": "alice", "name": "Alice" } ]')
     ->columns('_key')
     ->ifexists('true')
     ->inputType('JSON')
     ->each('?')
```

**引数**

| 名前        | 型            | 概要                |
|:-----------:|:-------------:|:-------------------:|
| value       |  string       | 設定値              |


**戻り値**

失敗した場合false
成功時GLoadオブジェクト

```php
$gdb = new Groonga('./db/test.db');

/* load --table Users [ { "_key": "alice", "name": "Alice" } ] */
$table = $gdb->table('Users');
$load = $table->load();
$load->values('[ { "_key": "alice", "name": "Alice" } ]')
     ->exec();
```



## 実行　GLoad::exec

load処理の実行

```php
$load->exec();
```
**戻り値**

失敗した場合false
成功時GLoadオブジェクト

```php
$gdb = new Groonga('./db/test.db');

/* load --table Users [ { "_key": "alice", "name": "Alice" } ] */
$table = $gdb->table('Users');
$load = $table->load();
$load->values('[ { "_key": "alice", "name": "Alice" } ]')
     ->exec();
```


* * *

[PHPからGroongaを利用する-Groongaクラス](http://qiita.com/Yujiro3/items/cb03abcc71bbb2f883f7 "PHPからGroongaを利用する-Groongaクラス")
[PHPからGroongaを利用する-GCommandクラス](http://qiita.com/Yujiro3/items/aa751a66ce4fc37f4aea "PHPからGroongaを利用する-GCommandクラス")
[PHPからGroongaを利用する-GTableクラス](http://qiita.com/Yujiro3/items/1b5cea045621f67100bc "PHPからGroongaを利用する-GTableクラス")
[PHPからGroongaを利用する-GColumnクラス](http://qiita.com/Yujiro3/items/241e9f561be14927e6be "PHPからGroongaを利用する-GColumnクラス")
[PHPからGroongaを利用する-GLoadクラス](http://qiita.com/Yujiro3/items/3f876a277e410fb1b631 "PHPからGroongaを利用する-GLoadクラス")
[PHPからGroongaを利用する-GDeleteクラス](http://qiita.com/Yujiro3/items/45ee01c107f2fa17c6c3 "PHPからGroongaを利用する-GDeleteクラス")
[PHPからGroongaを利用する-GSelectクラス](http://qiita.com/Yujiro3/items/c59094e2c83970bf224f "PHPからGroongaを利用する-GSelectクラス")


[PHPからGroongaを利用する-PHPバインディング](http://qiita.com/Yujiro3/items/e5ea98139f3ee58d46f9)
そもそもお金ってなに？ビットコインを勉強する前に。

人類が誕生したのがいつなのか正確にはわかりませんが、お金を使い始めたのは約５０００年前からと考えられています。

お金（通貨）が誕生する前は、基本的にそれぞれの家族（小集団）が食べ物を自給自足でその日暮らしをしていました。様々な専門職（大工、弁護士など）は発展しなかったのです。なぜなら自分の専門職でその日もし食べ物と交換が成立しなければとたんに生命の危機にさらされるからです。

お金（通貨）が誕生してから、専門職が発達し始め、貯蓄をして、時にはそれを集めて（資本の形成）大規模なプロジェクトが可能になり社会が大きく発展しました。お金をもらえば必要なものを必要な分だけ必要なときに交換したり、また少し多めに働き、困ったときや将来のために貯めておくことが可能になったからです。

数千年間のあいだ、私たちはいろんなものをお金（通貨）として試してきました。貝殻、香辛料、皮革、宝石、金銀、米、豆等とご存知政府が発行する紙のお金です。

試行錯誤の結果、良いお金の条件は大体以下のようになりました。

1. ポータブルであること。（羊を教会に寄付するために長旅に世話をしながら連れて行くのはたいへんだった。）
2. 耐久性があること。(米、豆等では腐ってしまうから。）
3. 分割可能であること。(おつりが必要だから。ダイヤモンドでは硬すぎるし、半分に割ってしまうと大幅に価値が変わる。）
4. 代換可能であること。(金銀であれば溶かせばだれのもまったく同じ。)
5. 偽物と区別できること。（紙幣もいろんな偽造対策してますね。金、銀はその手触り、色、比重等で区別しやすい。）
6. 貴重なものであること。(空気や水も必要不可欠だけどたくさんありすぎる。)
7. 相手に依存しないものであること。（証書などではなくそれそのもので完結するもの。Counter Party Riskがないもの。）

これまで上記すべてを満たし今日まで価値があるのは、この世に存在するいろいろな元素のなかで金と銀しかありません。（文部科学省監修の元素周期表参照）

http://stw.mext.go.jp/common/pdf/series/element/element_b8_2.pdf

尚、プラチナとパラジウムも貴金属の仲間ですがあまりにも生産量が少ないため実際に通貨として流通したことはありません。

このため日本語ではお金=GOLD, 世界約５０の言語ではお金＝SILVERと書くのです。例えばドイツ語ではGeld(Gold)、フランス語ではArgent(Silver)と書きます。

歴史的には中央政府の発行する紙のお金はすべて無価値になりました。なぜなら上記７つの良いお金の条件を満たして維持することができなかったからです。

ビットコインの開発者中本哲史氏は、中央政府（権力）は腐敗し、お金を増刷して価値を薄め人々を裏切ってきたと書いています。このため発行上限を設定し、中央権力に頼らない分散システムで解決をめざしました。2009年の2月11日の投稿に記載があります。

http://p2pfoundation.ning.com/forum/topics/bitcoin-open-source?id=2003008%3ATopic%3A9402&page=2#comments

ちなみに上記サイトの彼のProfileには誕生日は1975年4月5日と登録されてあり、4月5日(1933年）はアメリカで金保有禁止の大統領令(Executive Order 6102 signed by Franklin Roosevelt)が署名され、1975年はアメリカ国民が再び金を保有できることになった年なのです。(Pub.L. 93–373案が国会で採決)

https://en.wikipedia.org/wiki/Executive_Order_6102

Welcome to Bitcoin's rabbit hole!! ようこそビットコインの世界へ。

今回ビットコインは金、銀や現在の銀行システムにはできないインターネットでリアルタイムの超小額から超高額の送金を可能にしました。また銀行のインフラが整っていない発展途上国の人々もインターネットに接続さえできれば旧型の携帯電話でもグローバル経済に参加できます。

これにより少額のクラウドファンディングや、時間単位（分単位、秒単位）の資金の貸し借り等も世界中からできるようになってきました。また、お金（通貨）だけの用途ではなく、契約やデザイン等のあらゆるデータを記録することによりまったく新しいサービスが登場することになるでしょう。

現時点で金、銀にあってビットコインにないのは約５０００年の実績です。登場してまだ５年。何事にも始まりはあります。ビットコインで人類は新しい時代を切り開くことになるのでしょうか？

東京ビットコイン会議はビットコイン普及のボランティア団体で、毎週木曜日に誰でも参加できる集まりを開催しています。ぜひみんなと一緒に勉強しましょう。

http://www.meetup.com/Tokyo-Bitcoin-Meetup-Group/
東京ビットコイン会議　宍戸健
（２０１４年１２月２日オリジナル記事投稿）
baserJSの導入方法

コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## ダウンロード & インストール

### Webサイトからダウンロード

[baserJS Webサイト](http://baserproject.github.io/baserjs/) の **Download** ボタンからダウンロードできます。

### Githubからダウンロード

[baserproject/baserjs - Github](https://github.com/baserproject/baserjs) の **Download Zip** からダウンロードできます。

### Githubからクローン

```shell-session
$ git clone git@github.com:baserproject/baserjs.git
```

### bowerからインストール

```shell-session
$ bower install baserjs
```

## HTMLファイルへの読み込み

このライブラリはブラウザで動作するウェブページ用のJavaScriptライブラリです。

HTMLファイルに以下のように読み込んで使用します。[jQuery](http://jquery.com/)が必須になるので *baser.js* 本体よりも先に読み込む必要があります。

```html
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="baser.js"></script>
```

### 実行

グローバルに`baser`というオブジェクトが生成されます。こちらにほとんどのコンストラクタや関数が含まれますが、基本的にはjQueryオブジェクトのインスタンスメソッドから実行します。

例) YouTubeを埋め込む場合

```js
$(function () {
    $('.yt').bcYoutube();
});
```

```html
<div class="yt" data-id="YOUTUBE_ID" data-width="1920" data-height="1080"></div>
```

* * *

各機能については次回から。
Ruboty | ruboty-cron を利用して、Ruboty に始業・昼休み・終業を通知させる

# Ruboty | ruboty-cron を利用して、Ruboty に始業・昼休み・終業を通知させる

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
@r7kamura さん作の [ruboty-cron Plugin](https://github.com/r7kamura/ruboty-cron) を利用して、スケジューリングされたメッセージを登録します。

※ @r7kamura さん == Ruboty の作者さん

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### <i class="fa fa-cube" style="font-size:1em;"></i> インストール

~~~ruby:Gemfile
gem "ruboty-cron"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> 設定方法
* <i class="fa fa-plus-square" style="font-size:1em;"></i> メッセージ追加

~~~
@ruboty add job "<cron syntax>" <message>
~~~

* <i class="fa fa-trash-o" style="font-size:1em;"></i> メッセージを削除

~~~
@ruboty delete job <id>
~~~

* <i class="fa fa-eye" style="font-size:1em;"></i> メッセージ一覧の表示

~~~
@ruboty list jobs
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> 始業メッセージを設定

~~~
@ruboty add job "30 9 * * 1-5" "おはようございます。始業ですよ"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> 昼休み開始メッセージを設定

~~~
@ruboty add job "50 11 * * 1-5" "お昼休みです"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> 昼休み終了メッセージを設定

~~~
@ruboty add job "50 12 * * 1-5" "お昼休みが終わりました"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> 終業メッセージを設定

~~~
@ruboty add job "30 18 * * 1-5" "お疲れ様です。終業ですよ"
~~~

### <i class="fa fa-cube" style="font-size:1em;"></i> 登録メッセージの確認

~~~
@ruboty list jobs
~~~

### <i class="fa fa-camera-retro" style="font-size:1em;"></i> 画面キャプチャ

![ruboty_cron1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ff6c4671-3e7e-bc51-276d-dc2d069fd059.png)

### <i class="fa fa-cube" style="font-size:1em;"></i> 動作確認

~~~
# 10:33 に登録
@ruboty add job "34 10 * * 1-5" "cron test"
Job 5255 created
# 10:44 になった
"cron test"
@ruboty list jobs
@ruboty delete job 5255
Job 5255 deleted
~~~

![ruboty_cron2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/62f73688-6b94-e4ee-cbc2-20a8594729ac.png)

## <i class="fa fa-cube" style="font-size:1em;"></i> 関連
同等の機能を hubot スクリプトで作成した時の記事
[Hubot | 自作Script | hubot-cron を利用して Hubot に始業・昼休み・終業を通知させる](http://qiita.com/tbpgr/items/dff3b792444e3fe8f3af)

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
<i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-cron](https://github.com/r7kamura/ruboty-cron)
[Threejs]PointCloud(パーティクル)でコマアニメ

WebGL Advent Calender 2日目。
Flash大好きFlasherなボクですが、世間の流れにも乗らなければいけません。
恐る恐るthree.jsのパーティクルを触ってみました。

three.js(r69)でパーティクルを扱うにはPointCloudクラスを使うようです。

> [threejs example #webgl_particles_billboards](http://threejs.org/examples/#webgl_particles_billboards)

公式のexampleも豊富で色々あってみてるだけで楽しいのですが、パーティクルをコマアニメさせているサンプルはなかったようなので作ってみました。

![wheresflasher.jpg](https://qiita-image-store.s3.amazonaws.com/0/6541/60841427-862e-66d4-dba2-2a4d228834de.jpeg)

__[WHERE'S FLASHER? :DEMO](http://393.bz/threejs/wheresflasher.html "WHERE'S FLASHER?")__

* ウォーリーを探せ的なノリでFlasherを探し、クリックで捕まえてください。 だいたい想像通りのことがおきます。
* PCはChromeで観てください。（他ブラウザは確認してません）
* スマホにもなんとなく対応しました。iPhone6以上で観てください。Androidなんて知りません。
* three.jsのexample風に、htmlにscriptやらcssを書いてますが勢いで書いたのでcssが大分酷いです。

※ヌルヌルと動いてくれるコマアニメ素材はこちらをベースとさせて頂きました。

> [MMDで出力したモブ子さん動画をゲーム用のキャラ画像に変換](http://blawat2015.no-ip.com/~mieki256/diary/201309071.html)


----

### やったこと

まず、three.jsでspritesheetなコマアニメするにはこちらのサンプルが参考になりました。

> [Texture Animation (Three.js)](http://stemkoski.github.io/Three.js/Texture-Animation.html)

Textureのoffsetとrepeatプロパティを使うことで簡単にコマアニメできる仕組みがあるようです。



ただ、PoindCloudはPlaneやBoxといった一般的なPrimitiveなオブジェクトとは違いちょっと特殊なようでPointCloudMaterialというPoindCloud用のマテリアルが用意されていました。
ただ、PointCloudMaterialもTextureを渡すことで、任意の画像をパーティクルにすることができるので、同じようにTextureのoffsetとrepeatプロパティをゴニョゴニョすればいいかと思って試したところ、エラーとなり、うまくいきませんでした。

なので、PointCloudMaterialを諦め、ShaderMaterialを使用してます。
（PointCloudMaterialでもうまいことできる方法もあるのかもしれませんが。。)

PointCloudでShaderMaterialを使う際にはこちらの記事とサンプルが参考になりました。

> [Texture atlas offset/repeat works for meshes but is ignored for point system particles](http://stackoverflow.com/questions/25335967/texture-atlas-offset-repeat-works-for-meshes-but-is-ignored-for-point-system-par/25372202#25372202)
> [PointCloud with Custom, Dynamic Attribute](http://jsfiddle.net/8mrH7/3/)

上の習作を簡素にしたサンプルもアップしてあります。
具体的にどう書いてるのかはこちらの方がわかりやすいかもしれません。

* [簡素なサンプルのDEMO](http://393.bz/threejs/test.html)
* [簡素なサンプルのソース:gist](https://gist.github.com/sakusan393/82d75ca216f4486e4f40)

コマアニメを大量にうごかしてみるのはなかなか楽しいですね。
[おまけ](http://393.bz/threejs/titibinta.html)


----

そして、明日は __SUPER FLASHER__ の　@clockmaker 先生です！
ボクよりもっと__露出大__な展開を期待しています！！
【C】Edisonでラジコンサーボを動かす

表示ができたら，次は駆動だ．

# サーボモータの制御
## サーボモータとは
サーボモータとは，ミニ四駆で使われているような，電源を入れたら回りっぱなしのモータに角度を制御するユニットが付属していて，外部からの信号を入力して回転角度を任意に設定できるモータのことです．出力できる角度や角速度，トルクなどは，それぞれのモータによって異なります．
古典的なラジコンサーボモータは，回転角度をアナログな電圧で入力していたのですが，近年は，PWM（Pulse Width Modulation）信号と言う，周期的なパルス信号で入力する方式が一般的です．さらに最近は，角度をUARTやSPIで入力できるサーボモータも増えてきたのですが，今回は，一番対応しているサーボモータの種類が多い，PWMを使用する方式でやってみます．

## ラジコンサーボモータの制御信号
ラジコンサーボモータに角度を入力する信号は，厳密に規格が決まっているわけではないため，実は[メーカーごとに違います](http://berry.sakura.ne.jp/technics/servo_control_p3.html)．今回は，50[Hz]で1.5±0.5[ms]で制御するサーボモータを対象にします．
このラジコンサーボモータは，1.5[ms]の間 **H** ，18.5[ms]の間 **L** の信号を連続して受け取ったときに，可動角のちょうど中心の角度を保持します．1.0[ms]と2.0[ms]の信号を受け取ったときは，可動角の限界の角度を保持します．

# 回路
ラジコンサーボモータをEdisonから制御するときに，一番問題となるのが，信号の電圧レベルです．だいたいのラジコンサーボモータは，3.3[V]程度の電圧レベルでも十分，H信号とL信号を見分けてくれるのですが，Edisonの標準信号電圧レベルの1.8[V]だと，さすがにキツい．
そこで，電圧レベル変換ICを使用して，電圧レベルを変換します．
![レベル変換回路](https://pbs.twimg.com/media/B3xmMqSCMAAWfy9.png "レベル変換回路")
[74VHC125](https://www.fairchildsemi.com/datasheets/74/74VHC125.pdf)というレベル変換ICを利用します．このICは，1.5[V]の入力レベルでHと判断し，後段に変換後の電圧を出力します．上の図のように，125の2番ピンにEdisonからの信号(J18-7)を接続し，3番ピンをサーボモータの入力ピンに接続してください．1番ピンは，このICのEnable端子なので，GND(J19-3)につないでください，また，125に電源を供給するため，14番ピンには3.3\[V](J20-2)を，7番ピンにはGND(J19-3)をつないでください．

# プログラム
```c:servo.c
#include <stdio.h>
#include <mraa.h>

int main(int argc, char *argv[])
{
	mraa_init();

	mraa_pwm_context pwm;
	pwm = mraa_pwm_init(20);
	mraa_pwm_period_us(pwm, 20*1000);	// 20[ms]
	mraa_pwm_enable(pwm, 1);

	int i;
	const int STEP = 20;
	for(i=0;i<STEP;i++){
		mraa_pwm_write(pwm, 1.0/15.0+1.0/15.0/STEP*i);
		usleep(200*1000);	// 0.2[s]

		float out = mraa_pwm_read(pwm);
		fprintf(stdout, "PWM0 : %f\n", out);
	}

	mraa_pwm_enable(pwm, 0);

	mraa_deinit();

	return ret;
}
```

# 実験結果
<a href="http://webmshare.com/W5qEK" ><img src="http://s1.webmshare.com/t/W5qEK.jpg" title="Hosted by webmshare.com" /></a>
クリックすると，動画に飛びます．

# まとめ
+ ラジコンサーボモータはPWM信号でコントロールできる．
+ Edisonからサーボモータに信号を伝えるには，途中で電圧のレベル変換をする必要がある．
+ EdisonからのPWMは，MRAAライブラリから簡単にできる．
Goのデバッグに便利なpretty printライブラリ「pp」を作った

# 概要

![](http://i.gyazo.com/d3253ae839913b7239a7229caa4af551.png)

[k0kubun/pp](https://github.com/k0kubun/pp)という、pretty printライブラリを作った。
任意の型のオブジェクトを`pp.Print()`に渡すと色つきでpretty printしてくれるという非常にシンプルなもの。

# 作った背景

`fmt.Printf("%#v", ...)`等ではわかりづらい複雑なmapやstructをdebug printするときは、pretty printを使うと便利。既存のpretty printライブラリには、GitHubで人気なものだと[davecgh/go-spew](https://github.com/davecgh/go-spew)や[kr/pretty](https://github.com/kr/pretty)などがある。
いままではGoでデバッグのために複雑な構造をダンプするときこれらを使っていたのだが、必要以上に型の情報が書かれていたり、大きなものだと白黒なのでパッと見てわかりづらいなどの問題があった。

そこで、型やフィールドごとに別の色をつけることで視認性を高め、ビルトインの型情報は色にまかせて省略することで視認性を高くしたpretty printerを作った。
色はRubyで人気のREPLであるpryの真似をしている。

# 使い方

どんな型だろうととにかく`pp.Print()`を呼べば良い。全ての型に対応している。

```go
import "github.com/k0kubun/pp"

m := map[string]string{"foo": "bar", "hello": "world"}
pp.Print(m)
```

![](http://i.gyazo.com/0d08376ed2656257627f79626d5e0cde.png)

## API

fmtパッケージに似たAPIが用意されている。
http://godoc.org/github.com/k0kubun/pp

```go
pp.Print()
pp.Println()
pp.Sprint()
pp.Fprintf()
// ...
```

# デモ

mapやstructがネストしているような複雑な構造のダンプに向いている。

## Tweet

![](http://i.gyazo.com/a8adaeec965db943486e35083cf707f2.png)

## Favorite event

![](http://i.gyazo.com/1e88915b3a6a9129f69fb5d961c4f079.png)

## 追記: windows対応しました

mattnさんのコメントを受けてwindowsにも対応しました

![](http://i.gyazo.com/ab791997a980f1ab3ee2a01586efdce6.png)

機会があれば是非お試しください。