OmniAICreator/Qiita-1.07M huggingface dataset:
多要素認証トークンをプログラムで取得してみる

#多要素認証の方式について

AWSやGoogleの多要素認証（MFA)に使われるTOTPについて書く。

昨今普及してきたワンタイムトークン（OTP)。これはちゃんと規格化されていて、ライブラリもあるので生成は難しくない。OTPにはシークレットとカウンタ値から発行するHOTPと、シークレットと時間から計算するTOTPがある。たいていはTOTPで、HOTPはあまり見たことがないが、たぶんサーバー側と時計を合わせるのが難しいようなものの場合に使うのだろう（昔は多かったかもしれない）。ちなみにTOTPは内部的にはLinuxエポックからの経過秒数／発行間隔（30秒とか）の数値をカウント値としてHOTPに投げるものだ。

#つかってみる

是非はさておいて、AWSやGoogleの多要素認証のシークレットを取得すれば、それらの多要素認証のトークンを自分で発行することができる。AWSの場合はQRコードの下に折りたたみで隠して書いてある。Googleの方は確認してない。QRコードの場合はZXingなんかを使うと簡単にスクリーンショットからシークレットを取得することができる。

RubyならROTP、Pythonならpyotp、Node.jsではnotpというのがあるがだいたい似たようなものである。一点だけ気をつけるべきなのはBase32エンコードについてで、AWSやGoogleから供給されるものはBase32エンコードされている。ただ必ずそうなっているわけでもないらしくライブラリごとにbase32エンコードのまま受け入れるものや、エンコードとか考慮しないものとか、エンコードをオプションで指定するものなどがある。あと、nodeではthirty-twoっていうbase32のライブラリの0.0.1を使ってるものがいくつかあったけど、それはシークレットによっては正しく復号化できないで利用できない。ここにはまって数時間無駄にした。
0.0.2だと問題なくなっているので、以下のNode.jsのサンプルは0.0.2を利用する前提である。

#サンプル

```js
var qr = require('node-zxing')();
var notp = require('notp');
var base32 = require('thirty-two');
 
qr.decode("qr.png",function(err,out){
    var key = base32.decode(out.split(/=/)[1]);
    var token = notp.totp.gen(key);
    console.log(token);
});
```
スクリーンショットのQRコードからシークレットを取り出してトークンにすると上記のような感じになる。
ちなみにnode-zxingというのはZXingのnodeでのラッパーだけど、クラスパスの指定がコロンでハードコードされているのでWindowsでは動作しない。一応Pull requestを投げてみたけど、私の英語力とプロジェクトの放置されっぷりとかを見ると多分マージされないと思う。入れたあとに自分でWindowsならセミコロンにしたりすれば動く。一応私のフォークは以下である。

[sashimizakana/node-zxing at windows-classpath-fix](https://github.com/sashimizakana/node-zxing/tree/windows-classpath-fix)

#というわけで

次回はやる気があれば、これをRaspberry Piに入れて7セグに出力するMFAデバイスを手作りする。
（まとまったネタになれば自分のサイトの方に載せます）
CMake: 変数

## はじめに

みなさん、こんにちは。今回は、変数の基本構造について書いていきます。

## 変数の型

実は、CMakeの変数には型というものがありません。すべてが文字列として格納されます。これは、`1`などの数値も該当します。

## 変数の生成・代入

変数は、`set()`コマンドを用いて生成することができます。

```cmake
set(value 1) # 値が1の変数valueを生成
```

また、既存の変数への代入も`set()`コマンドを用います。

```cmake
set(value 1) # 値が1の変数valueを生成
set(value 2) # 既存の変数valueに値1を代入
```

## 変数の削除

変数の削除には、`unset()`コマンドを用います。

```cmake
set(value 1) # 変数valueを生成
unset(value) # 変数valueを削除
```

## 変数の値の参照

変数の値の参照は、`${variable-name}`という構文で行います。

```cmake
set(value 1)
message(${value}) # 1
```

存在しない変数を参照した場合は、空文字列が返されます。

```cmake
message("not_existing_value: '${not_existing_value}'") # not_existing_value: ''
```

変数の値の参照は、入れ子にすることもできます。

```cmake
set(value 1)
set(value_name value)
message(${${value_name}}) # 1
```

また、組み合わせることもできます

```cmake
set(value_10 1)
set(value_basename value)
set(value_no 10)
message(${${value_basename}_${value_no}}) # 1
```

## 変数名

変数名は、コマンド名と違って大文字・小文字を区別します。

```cmake
set(value 1)
set(Value 2)
set(VALUE 3)
message(${value}) # 1
message(${Value}) # 2
message(${VALUE}) # 3
```

また、ほぼすべての文字——おそらくコマンド引数に使用できる文字すべてが使えますが、英数字・ハイフン`-`・アンダースコア`_`のみを使用することが奨励されています。

なぜ使える文字が制限されているのでしょうか？ためしに、変数名を奨励外の文字を使って`value[1]`としてみましょう。

```cmake
set(value[1] 1) # OK
```

問題なく作成できました。次にこれを参照してみます。

```cmake
message(${value[1]}) # エラー
```

エラーになってしまいました。どうやら変数参照の構文には上記で示した奨励されている文字以外は使用できないようです。このような名前の変数を参照するためには、以下のように変数名を一度別の変数に代入してから行う必要があります。

```cmake
set(value[1] 1)
set(value_name value[1])
message(${${value_name}}) # 1
```

## おわりに

以上、CMakeの変数についてでした。奨励されている文字以外で変数を作成しても、警告がでないので気をつけたいところですね。

明日は、mrk_21 さんの『CMake: リスト』です。
.igoreに指定したディレクトリを別リポジトリで管理できる？

あるプロジェクトで、ドキュメントルートをgit管理してるんだけど、gruntのファイルとかは会社資産だから

客先には見せたくないけど、チームメンバーには共有したいので、.ignoreで除外してるのです。この除外したディレクトリを別リポジトリで管理って出来るもんなの？っていうか、試せばいいのか
MacのVagrantのCentOS6にDockerをインストールしてみた


今回はMacのVagrantのCentOS6にDockerをインストールしてみます

# CentOSにyumを使ったDockerのインストール
vagrant上で下記コマンドを実行します

```
[vagrant@localhost ~]$ rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
[vagrant@localhost ~]$ yum -y install docker-io
[vagrant@localhost ~]$ sudo /etc/init.d/docker start
```

# Docker コンテナ内のバージョン確認

コンテナ内のCentOSのバージョンは7なんですね。

```
[vagrant@localhost ~]$ sudo docker run centos cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core) 
```

# Docker コンテナ内でシェルを起動する
```
[vagrant@localhost ~]$ sudo docker run -i -t centos /bin/bash
[root@f09e39c3e51d /]#
```

次回はDockerのコンテナをいろいろ弄ってみたいと思います。
Webスクレイピングの法律周りの話をしよう！


[2020/09/09追記]
本記事の内容は著作権法改正より前に記載されたものです。
最新の情報をご確認下さい。
* [著作権法の一部を改正する法律（平成30年法律第30号）について | 文化庁](https://www.bunka.go.jp/seisaku/chosakuken/hokaisei/h30_hokaisei/)
* [令和2年通常国会 著作権法改正について | 文化庁](https://www.bunka.go.jp/seisaku/chosakuken/hokaisei/r02_hokaisei/)

上記に関連して、次の記事を記載致しました。
* [【2020年度版】個人用クローラーの開発手順とその注意点 - Qiita](https://qiita.com/nezuq/items/9e297d0e3468c24e8afa)

---

4日目になるまでに残り1時間なので、急ぎで書きます。
後、私は法律の専門家ではないので記事の正確性は保証できません。自己責任でお願いします。

#はじめに
Webスクレイピングの技術的な情報は多いのですが、法律に関する情報は数少ないです。
その為、技術的にできる事でも遠慮してしまい、インターネット上のデータを利用する事を避けてしまう人もいます。
特に[LibraHack事件](http://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6)以降、その傾向が強いです。
これは「[モノのインターネット（Internet of Things）](http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8E%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88)」のブームが加熱していく中で大きな障壁になると思います。
その結果、中国を代表とする海外勢にビジネスで負ける事になれば、日本はますます苦境に追いやられる事でしょう。
その為、「Webスクレイピングの法律周りの話をしよう！　その為に自分がまずは話してみよう！」というのがこの記事の趣旨です。

#Webスクレイピングの論点とその見解
「[Webスクレイピングの注意事項一覧](http://qiita.com/nezuq/items/c5e827e1827e7cb29011)」で、著作権法を考慮したWebスクレイピングのマナーを一覧にしてみたのですが、その時には判断に悩んでいた事がありました。その中である程度判断が付いた事があるのでご紹介します。

##情報解析目的の時の制約
Q.著作権法第47条の7の情報解析目的であっても、第47条の6のクローラー制約を守った方が良い？
A.法律的には守らなくても良さそうです。

←著作権法の第47条の6は検索サービスを提供する方を対象として作られたもので、情報解析を行う方を対象として作られたものではない。

##Webサイトの利用規約
Q.Webサイトの利用規約は守らなくてはいけない？
A.会員のみが見られるサイトの場合は利用規約を守る必要があるようです。

←著作権法第47条の7（情報解析のための複製）より、Webスクレイピングでデータを集めて分析し、結果を公開する事は自由に行えます。しかし、会員制サイト（ex.Twitter・Facebook）の場合は、会員となる為に利用規約に同意しているので、それを守る必要があるようです。ただし、対象の会員制サイトの会員でなく、サイトのページが会員以外でも見られる状態にあるならば、利用規約を守らなくても良いと判断できます。

##音声・映像の活用
Q.オープンなライセンスの音声・映像だけを収集する手段はある？
A.youtubeのフィルタ機能に「[クリエイティブ・コモンズ](https://www.youtube.com/results?search_query=cat&lclk=creativecommons&filters=creativecommons)」というものがあります。

←ダウンロード刑罰化の結果、音声・映像のダウンロードは難しくなっています。その為、音声・映像のWebスクレイピングを行うならば、オープンなライセンスのものだけをダウンロードする必要があります。「それって実際できるの？」と自分で疑問だったのですが、youtubeでは「[クリエイティブ・コモンズ・ライセンス](http://creativecommons.jp/licenses/)」のものを絞り込み検索できるようです。



以上
Windowsローカル環境で使う、elasticsearch-1.4.1 + kibana-4.0.0-BETA2.0  kibana Discover編 その２

#0. はじめに  
[前回](http://qiita.com/Aco-gt/items/ee60d2c9cf472d37825d)は、必須となるkibanaのインデックス登録とDiscoverのデータ範囲設定について説明しました。
今回は、Discoverで出来ることについてもう少し説明したいと思います。私は、kibana4からのユーザですが使ってるうちにこの行き届いたインターフェースに気付き、「え、こんなことも出来るの？」と感動しました。使ってみればすぐにわかる部分だとは思いますが、マニュアルみたいなものも見あたらなかったので、キャプチャーに簡単な説明を添えて投稿します。
#1. フィールド内容の表示
左ペイン下部にある「Popular fields」欄のフィールド名－右横の「add」ボタンをクリックするとそのフィールドが上部の「Selected Fields」に移り、右側にデータとしてフィールド内容が表示されるようになります。

![2014-12-03_212117.png](https://qiita-image-store.s3.amazonaws.com/0/60838/f7d5a497-0331-ef7c-7ea0-1d6f2c6cd921.png)  
#2. DiscoverからのVisualize
簡単なグラフならフィールド名をクリックした後に現れる「Visualize」ボタンを押すだけで作成可能です。「method」フィールドの値について棒グラフが作成されました。

![2014-12-03_212311.png](https://qiita-image-store.s3.amazonaws.com/0/60838/58af5895-1fe7-2072-ddd8-20fe82eb49da.png)  


![2014-12-03_212445.png](https://qiita-image-store.s3.amazonaws.com/0/60838/30f8bc2f-b227-8e51-5941-1e59732289f3.png)

#3. 虫めがねボタンで特定Valueの選択と除外が可能
再度、Discoverに戻り、虫めがねボタン（＋）を押すと特定データで絞り込みが可能です。ここではmethod: "GET"のみ選択します。
![2014-12-03_212547.png](https://qiita-image-store.s3.amazonaws.com/0/60838/91b0c0f8-f28f-8637-d432-efcbb316e5eb.png)  
method: "GET"のみ選択され左上部にはそのことを示す緑色のボタンが表示されます。ドキュメント数は46014 hitsです。
![2014-12-03_212646.png](https://qiita-image-store.s3.amazonaws.com/0/60838/55c166ac-bc2d-c581-d99a-c8355caf76f6.png)

「Remove」をクリックすれば選択は解除されます。
![2014-12-03_212828.png](https://qiita-image-store.s3.amazonaws.com/0/60838/0b83645e-be10-ca59-9b6a-ad997b0a10bb.png)

同様にmethod: "POST"のみ選択します。ドキュメント数は1622 hitsと表示されています。
![2014-12-03_213138.png](https://qiita-image-store.s3.amazonaws.com/0/60838/da40e529-bba7-7f94-9071-0a5ebecbb2ff.png)

今度は、虫めがねボタン（－）を押して特定データを除外します。"GET"と"POST"を除外します。除外の場合は赤いボタンが表示されます。結果として"HEAD"のみが選択されました。ドキュメント数は106 hitsと表示されています。左上の「Actions」ボタンは一括して設定したフィルターの状態を変更できます。色々クリックして確認してみてください。

![2014-12-03_213344.png](https://qiita-image-store.s3.amazonaws.com/0/60838/82c09318-3832-a6b7-6add-f74703ce5f19.png)

ログをダウンロードしたページhttp://ita.ee.lbl.gov/html/contrib/EPA-HTTP.html の「Measurement」項目にログのmethod数について記載があります。46,014 GET requests, 1,622 POST requests, 107 HEAD requests
HEADのみ一致しませんが、これは「Measurement」の表示の方が間違っています。URIに記載されている"HEAD"を間違ってカウントしたせいです。たぶんgrepか何かでカウントしたのではないかと思います。Key-Value型で処理しているelasticsearch + kibana はそんなミスが無いので安心して使えます。


![2014-12-01_224307.png](https://qiita-image-store.s3.amazonaws.com/0/60838/da348999-72f5-96b5-6567-375539a43361.png)

長くなったのでその３に続きます。
ScalaでClass型インスタンスを取得する

# Java
なんらかの型のインスタンスに対してgetClassしてClass型インスタンスを取得する例。

```java:java
Class<?> c = "j".getClass();
```

これはScalaでも同様に可能。

```scala:scala
val c = "j".getClass
```

一方、これはそのままではダメだった。

```java:java
Class<?> c = String.class;
```

```scala:scala
val c = String.class // error: identifier expected but 'class' found.
```

# Scala
上記に該当するものはこう書く。

```scala
val c = classOf[String]
```

## ジェネリクス型の場合
getClassについてはこれは先ほどと同様問題ない。

```scala
def foo[T](x: T) = x.getClass
```

一方classOfはダメだった。コンパイルエラー。

```scala
def foo[T] = classOf[T] // error: class type required but T found
```

こう書く。

```scala
import scala.reflect.ClassTag
def foo[T](implicit tag: ClassTag[T]) = tag.runtimeClass
```
Go言語でルーズにJSONを扱えるライブラリJasonが便利だった

GoでJSONを扱うとstructとかinterface{}で結構面倒だったしますが、jasonと言うライブラリを使うとかなりルーズに扱えて、ものぐさな私にはちょうど良かったです。

[Jason - JSON Library for Go](https://github.com/antonholmquist/jason)

基本的にはパーサーに特化しているようです。つまり読み込み専用。

単純なJSONだと

```go
package main

import (
	"github.com/antonholmquist/jason"
	"github.com/kr/pretty"
)

func main() {
	root, err := jason.NewFromString(`{ "hoge": "fuga" }`)
	if err != nil {
		panic(err)
	}

	pretty.Printf("%v", root.Get("hoge").String())
}
```

出力は

```
fuga
```

-----

もう少し複雑なJSONとして、お天気サービスのREST APIを叩いてみます。ネストしたノードの値も、簡単にとれました。

[お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報](http://weather.livedoor.com/weather_hacks/webservice)

```go
package main

import (
	"github.com/antonholmquist/jason"
	"github.com/kr/pretty"
	"net/http"
)

func main() {
	url := "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010"

	resp, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	root, err := jason.NewFromReader(resp.Body)
	if err != nil {
		panic(err)
	}

	// ネストした値を取得する
	pretty.Printf("%#v", root.Get("description", "text").String())
}
```

出力は以下。

```
" 日本付近は、冬型の気圧配置となっています。\n\n【関東甲信地方】\n 関東甲信地方はおおむね晴れていますが、長野県では雪や雨の降っている\n所があります。\n\n 3日は、日本付近は冬型の気圧配置で、関東甲信地方はおお むね晴れます\nが、長野県の山沿いでは、雪や雨の降る所があるでしょう。\n\n 4日は、日本の南に前線がのびて、その前線上に低気圧が発生する見込み\nです。関東甲信地方は曇りから次第に雨が降り出すでしょう。長野県や関東\n地方の山沿いでは雨や雪となる所もある見込みです。\n \n 関東近海では、3日はうねりを伴いしける見込みです。4日はうねりを伴\nいやや波が高い見込みです。船舶は高波に注意してください。\n\n【東京地方】\n 3日は、晴れでしょう。\n 4日は、曇りで昼過ぎから夕方は雨が降るでしょう。"
```
とても簡単でした。

最後のString()は、もちろんNumber()とかBoolean()とかArray()があります。
キーが存在するかを調べるときはHas()を使います。

開発中とかでちょっとJSONを扱うときには、なかなか良いのではないかと思います。
MavenでJDKを指定する

```lang:pom.xml
  <profiles>
    <profile>
      <id>profile_id_01</id>
      <activation>
        <jdk>1.7</jdk>
      </activation>
    </profile>
  </profiles>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
```

プロファイルとは環境に依存する設定をするためのもの。
activation：このプロファイルが有効になる条件
build：ビルド時の設定
maven-compiler-plugin：[maven-compiler-plugin](http://maven.apache.org/plugins/maven-compiler-plugin/)の詳細な説明
このプラグインでビルド時のJDKを設定できるみたい。
Espruinoで、ちょっとしたプログラムを書く

[前の投稿](http://qiita.com/rockymanobi/items/bbc9481d43cd4fc19d65)でEspruinoでとりあえずプログラムを書く事が出来たと思うので、今回は **Espruino以外の物理的なパーツは必要ない範囲で** ちょっとしたプログラムを書いてみます。

## WebIDEの使い方

WebIDEを起動して、Espruinoと接続するところまでもっていきます。
左側のエディタ部分にプログラムを書いて、真ん中の書き込みボタンを押すと、Espruinoにプログラムを書き込むことができます。書き込んだプログラムは即時実行されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/9efc8c4e-ce65-8f2f-d666-dcff47ca6505.png)

## プログラムを書いてみる

### LEDが点滅するプログラム

下記プログラムをエディタにタイプして、Espruinoに書き込むと、1秒間隔でLEDが点滅します。
`LED1#write`メソッドでLEDの状態を反転させる処理を、`setInterval`で１秒毎に実行しているイメージです。普通のJavaScriptという感じですね。

```js
var light = false;
// 1秒間隔で実行
setInterval(function(){
  // ON-OFFを反転
  light = !light;
  // LEDの状態を変更
  LED1.write( light );
}, 1000);

```

### プログラムを止める

プログラムを止めるには以下の方法があります。

1. `reset()`メソッドを実行する
2. ボード上のRSTボタンを押す
3. USBを抜く

基本的には`reset()`メソッドを実行します。

WebIDEの右側で`reset();`とタイプして実行すれば、点滅がとまります。このとき、WebIDEで書き込んだプログラムも消えてしまうので、再度実行するには再び書き込みボタンを押してEspruinoにプログラムを書き込みます。

別のプログラムを書き込む際にも、念のため`reset`を実行してから書き込むようにしましょう。(wifiを使っている場合等特に)

実行したプログラムによっては`reset();`が入力できなかったり、実行できなかったりすることがあります。そのときはボード上のRSTボタンを押せば、プログラムを強制的に止める事が出来ます。ただし、WebIDEとは`disconnect`されるので、再び接続してやる必要があります。

USBを抜くのもそこまで問題では無いので、わからなくなったら抜いてしまっても壊れる事は無いのではないかと思っています。

### ボタンを押したらLEDが光るプログラム

以下がボタンを押したらLEDが光り、もう一度押したらLEDが消えるプログラムです。
ポイントは **`setWatch`** メソッド。Espruinoへの入力ピンやボタン等の状態変化を監視する事ができます。使い方は`setWatch( コールバック, 監視したいピンorボタン, オプション)`といった具合です。今回はボタンを押すたびにLEDを点灯させたいので、オプションに`{repeat: true}`を指定しています。詳しくは[リファレンス](http://www.espruino.com/Reference#l__global_setWatch)を参照してください。

```js

var callback = function(){
  // BTN1の値によってLEDの点灯状態を変更
  LED1.write( BTN1.read() );
};

// BTN1の状態変化を監視
setWatch( callback , BTN1 , { repeat: true } );

```

## 次回予告

とりあえずWebIDEを使って短いプログラムを書くところまで来たので、次回あたりはEspruino以外のパーツを使った何かを書ければ良いなと思います。
オブジェクト指向入門のひとつかふたつくらい先

# Overview
覗いてみたら、そういう流れだったので参戦します！

# Recommendation
良書なので是非
![141203_224636.jpg](https://qiita-image-store.s3.amazonaws.com/0/41691/1ed84813-c43c-a94a-b5ec-b8414c0998b4.jpeg)
http://www.amazon.co.jp/gp/product/4621066048/

後日真面目な記事も書きたいが、クリスマスまでに書けるかな・・・
Memcachedを使う

# memcachedを使う

オリジナルサイト
[http://memcached.org/](http://memcached.org/)

## コンパイル

### configure

```shell-session:shell
    ./configure \
        --prefix=${PREFIX_DIR} \
        --libdir=${TARGETLIB_DIR} \
        --sysconfdir=/etc
```

### make手順

```shell-session:shell
$ make
# make install
```

## デーモン起動

### 起動例

```shell-session:shell
$ memcached -u nobody \
            -p 31385 \
            -U 31385 \
            -m 64 \
            -d -P /var/run/memcached.pid
```

`-vv` オプションを付けてデバッグメッセージを表示することもできる

### 説明

```shell-session:shell
$ memcached -u ${MEMCACHED_USER} \
            -p ${TCP_PORT} \
            -U ${UDP_PORT} \
            -m ${CACHE_SIZE} \
            -d -P ${PIDFILE}
```

※CACHE_SIZEはMB単位で指定する。指定されたサイズを超えてデータを登録しようとした場合は、一番古いデータから削除されて登録される

## 終了

プロセスに対してシグナルを送る

```shell-session:shell
$ pkill -TERM memcached
```

※ Memcachedを終了すると保存されたデータは全て削除される

# telnetでデーモンに接続

```shell-session:shell
$ telnet localhost ${PORT_NUMBER}
```

`PORT_NUMBER` を省略した場合は `11211` 番で接続する

## プロトコル

### 値を設定

```shell-session:memcached
set ${key} ${flags} ${exptime} ${bytes}
```

* key・・・・key
* flags・・・取りあえず 0
* exptime・・値の有効期限 0:無期限、Unix timeもしくは現在からの秒数
* bytes・・・データのバイト数

### 値を取得

```shell-session:memcached
get ${key}
```

### 有効期限を変更する

```shell-session:memcached
touch ${key} ${exptime}
```

# libmemcached

C言語プログラムからmemcachedにアクセスするには libmemcached を使うといい

オリジナルサイト
[http://libmemcached.org/libMemcached.html](http://libmemcached.org/libMemcached.html)

## コンパイル

configureには特にオプションはない。以下くらいで十分だろう

```shell-session:shell
$ ./configure \
      --prefix=${PREFIX_DIR} \
      --libdir=${TARGETLIB_DIR} \
      --sysconfdir=/etc
```

makeも特に考えることはない

```shell-session:shell
$ make
# make install
```
変数の名前と値を表示するメソッド


#はじめに

よくrubyを電卓代わりにしているんですが、計算結果を確認するために次のようなコードをしょっちゅう書きます。

```rb
length = 100.0
time = 5.0
speed = length / time

puts "speed = #{speed}"
```

この一番最後の行、`puts`のところ、変数名が2回出てきてRepeat yourself感がしてとても嫌です。変数名に意味をもたせているのだから、それをそのまま表示してくれればいいのにーと思います。
ちょっと電卓叩いて結果表示するだけの目的なのだから、もっとタイプ数減らして楽したいです。


なのでDon't repeat yourselfなメソッドを[書きました](https://github.com/diaphragm/ruby-print-variable)。ついでにgemにしました。

#インストール&使い方

```
$ gem install print_variable
```
でインストールできます。

こんな感じに使います。表示したい変数のSymbolを返すブロックを渡します。
Symbolの配列にすれば複数可です。その場合、一番長い変数名に合わせて変数名を左詰めで表示します。

```rb
require 'pv'

var = 1
var2, var_foo, v = 2, 3, 4

pv{:var}               #=> var = 1
pv{%i(var2 var_foo v)} #=> var2    = 2
                       #   var_foo = 3
                       #   v       = 4
```

#せつめい

変数とその値を表示するだけなんだから、変数のSymbolでも渡してやれば簡単にできる！そう思っていた時期がありました。

```rb:pv1.rb
def pv(symbol)
  puts "#{symbol} = #{eval(symbol.to_s)}"
end

var = 1
pv :var
#=> undefined local variable or method `var' for main:Object
```

pvメソッドのスコープの中ではvarが定義されていないので、エラーになりました。
つまり`eval(symbol.to_s)`は、メソッドを呼び出した場所のスコープで実行する必要があります。スコープの情報を渡すときに使うものといえば、そう`Kernel#binding`です。

```rb:pv2.rb
def pv(symbol, bind)
  puts "#{symbol} = #{bind.eval(symbol.to_s)}"
end

var = 1
pv :var, binding
#=> var = 1
```

期待通りに動きました。でもいちいちbindingとか渡してやるのはクソ面倒です。
なんかもっとこう、書きやすく出来ないものか考えました。

…そういえば、rubyのブロック付きメソッドを呼び出す時、ブロックのスコープは呼び出した場所になっていたような？

```rb:pv3.rb
def pv(symbol, &block)
  bind = block.binding
  puts "#{symbol} = #{bind.eval(symbol.to_s)}"
end

var = 1
pv(:var){}
#=> var = 1
```

期待通りです！タイプ数が少し減りました！黒魔術感が増しました！

もっと括弧を減らしていきましょう。

```rb:pv4.rb
def pv(&block)
	symbol = block.call
	bind = block.binding
  puts "#{symbol} = #{bind.eval(symbol.to_s)}"
end

var = 1
pv{:var}
#=> var = 1
```

だいぶ楽になったような気がします。

これに例外処理や、Symbolを複数渡せるように少し弄ったものがgemになっています。

----
print_variableと言いつつ、定数やメソッド名も表示できます。

```rb
CONST = 2
pv{:CONST} #=> CONST = 2
def mthd; 3 end
pv{:mthd} #=> mthd = 3
```

# おわりに
これ以上タイプ数減らす方法あったらコメントください。

----

(2014/12/05追記)
# binding_of_caller

@pasela さまに教えていただきました！ありがとうございます！
[binding_of_caller](https://github.com/banister/binding_of_caller)というgemを使うともっと簡単に出来ました。

```rb:pv5.rb
require 'binding_of_caller'

def pv(symbol)
  puts "#{symbol} = #{binding.of_caller(1).eval(symbol.to_s)}"
end

var = 1
pv :var
#=> var = 1
```

READMEを見ると

>Recommended for use only in debugging situations. Do not use this in production apps.
>
>Only works in MRI Ruby 1.9.2, 1.9.3, 2.0, 2.1 and RBX (Rubinius)

とかなんか怖いこと書いてありますけど気にしない(ﾟεﾟ)

怖いのが嫌な場合は、私の作ったgemを使ってくださるといいと思います。
gcc 4.9.2 をソースビルドする

# はじめに

gcc 4.9.2 が 10/30 にリリースされたので、ソースビルドしてみる。

変更点はこちら
https://gcc.gnu.org/gcc-4.9/changes.html

# 環境
Debian GNU/Linux 7

# ダウンロード
適当に近いミラーサイトから落としてくる
https://gcc.gnu.org/mirrors.html

# 必要なパッケージの準備
```
cd gcc-4.9.2
./contrib/download_prerequisites
```

# ビルド
公式のドキュメントによると、ビルドのディレクトリでやっているようなので 

```
cd ../
mkdir gcc-build
cd gcc-build
../gcc-4.9.2/configure
```

なんかおこられた

```
configure: error: I suspect your system does not have 32-bit developement libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.
```

とりあえず環境は64bitなので、 --disable-multilib をつけて再度行う

```
../gcc-4.9.2/configure --disable-multilib
```

通ったので、make する

```
make
```

make できたらインストールする
paco を使ってみる ( [参考URL](http://qiita.com/pasela/items/9c6cd7b9e477ed0501c8) )

```
sudo paco -lD "make install"
```

バージョンを確認して完了

```
$ gcc --version
gcc (GCC) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

# おわりに
コンパイルに死ぬほど時間がかかるので、ビルドを並列に行ったり(Nは自身の環境に合わせる)

```
make -jN
```

ビルドする言語を選択したりするといいかもしれない(C/C++だけビルドする例)

```
../gcc-4.9.2/configure --disable-multilib --enable-languages=c,c++
```
tmlib.js で Webフォント を使ってみるよ！

はじめに
====

せっかくゲームを作っているのに、ブラウザ上でのゲームの場合フォントが環境依存になりがち。
これは、JavaScript のライブラリである、tmlib.js でも同じだと思います。

なので端末のフォント制約に影響されない目的で、Webフォントがあるので、これをつかって、tmlib.js でのゲーム内でもちゃんとしたゲームにあったフォントを使うよー！

ってことで、やってみました。

他のやり方等があったらコメントよろしくお願いします。

CSSファイル
----

font family で指定するフォント名は、`@font-face` って言うCSSで設定するらしいです。
今覚えた…

```css:index.css
@font-face {
  font-family: 'Madoka Runes';
  src: url('../fonts/maqbsm.ttf') format('truetype');
}
```

ここで設定する `font-family` が実際に使用するときのフォント名になるみたい。

HTMLファイル
----

tmlib.js の html で、css を読み込む。

```html:index.html
<!DOCTYPE html>

<html>

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, user-scalable=no" />

  <title>tmlib.js:Madomagi Web Font sample</title>

  <link href="css/index.css" rel="stylesheet" type="text/css" />
  <script src="lib/develop/tmlib.js"></script>
  <script src="main.js"></script>
</head>

<body>
  <canvas id="world"></canvas>
</body>

</html>
```

これは、普通に link タグで読み込みっと…

スクリプト(CoffeeScript)
----

いつもどおり tmlib.js のテンプレートで

```coffeescript:main.js
# メイン処理(ページ読み込み後に実行される)
tm.main ->

  # アプリケーション作成
  app = tm.display.CanvasApp '#world'

  # リサイズ
  app.resize 640, 400

  # 自動フィット
  app.fitWindow()
  
  # APバックグラウンド
  app.background = 'rgba(150,150,150,1.0)'

  # 最初のシーンに切り替える
  app.replaceScene TestScene()

  # 実行
  app.run()
```

メインシーンは以下の通りです。

```coffeescript:TestScene.coffee
tm.define 'TestScene',

  superClass: 'tm.app.Scene'

  init: ->
    @superInit()

    labelName = 'mon mignon prêt-à-porter'

    # ラベルを描画する
    @fromJSON
      children:
        label_1:
          type: 'tm.display.Label'
          init: [labelName]
          fillStyle: 'rgba(0,0,0,1.0)'
          x: 640 / 2
          y: 200
        label_2:
          type: 'tm.display.Label'
          init: [labelName]
          fillStyle: 'rgba(0,0,0,1.0)'
          fontFamily: 'Madoka Runes'
          fontSize: 32
          x: 640 / 2
          y: 250
```

`tm.display.Label` の `fontFamily` にフォント名を指定すると、使用されるフォントが変わるんだけど、ここで `@font-face` で設定しておいたフォント名を指定する。

これで、どの端末でも同じフォントが表示されてゲームの雰囲気とかにあったフォントで表示が可能に！

いいね！（自分でしていくスタイル）

サンプル
----

[tmlib.js:Madomagi Web Font sample](https://static-ca462.firebaseapp.com/qiita/madomagi_webfont/)

![ss20141203a.png](https://qiita-image-store.s3.amazonaws.com/0/30417/456dcfd8-30a2-80b1-e185-263f5fbe9559.png)

こんな感じに表示されるはずです。


参考
----

- Webフォントについて
 - [HTML5&CSS3入門 第4回 @font-face（ウェブフォント）の利用](http://www.adobe.com/jp/devnet/dreamweaver/articles/html5pack_css3_part4.html)
 - [WebフォントのCSS指定2014年度版とこれまでの歩み](http://webcre8.jp/compare/webfont-fontface-syntax-2014.html)
 - [Webフォント(wikipedia)](http://ja.wikipedia.org/wiki/Webフォント)

- 使用フォント
 - [Deciphering the runes - Puella Magi Wiki](http://wiki.puella-magi.net/Deciphering_the_runes)
コマンドプロンプトで標準出力結果などをクリップボードにコピーするコマンド

もっと早く知りたかった！！！

##パイプを使って任意のコマンドが吐いた標準出力をコピー
```text:コマンドプロンプト
> clip /? | clip
```

```text:ペースト結果
CLIP

説明:
    コマンド ライン ツールの出力を Windows クリップボードにリダイレクトします。
    その出力されたテキストをほかのプログラムに貼り付けることができます。

パラメーター一覧:
    /?                  このヘルプを表示します。

例:
    DIR | CLIP          現在のディレクトリ一覧のコピーを Windows クリップボード
                        に貼り付けます。

    CLIP < README.TXT   readme.txt ファイルのテキストのコピーを Windows
                        クリップボードに貼り付けます。
```

##リダイレクトを使ってファイルの内容をクリップボードにコピー
```text:コマンドプロンプト
> echo hogeee > hoge.txt

> clip < hoge.txt
```

```text:ペースト結果
hogeee 
```
gulp.jsのコマンドライン引数で、環境別にminify条件を切り替える

フロントエンド開発効率化のため、この度初めてタスクランナーを使ってみました。
最近はGruntよりgulpの方が盛り上がってるようなのでgulpを選択。

javascriptの開発をしていると、minifyする時に開発／商用環境でホスト名だのIPアドレスだの定数をコンパイル時に動的に生成したい場合があると思いますが、gulp.jsのuglifyプラグインで割りと簡単に出来ました。

基本的な使い方はこの辺で
[はじめてのgulp](http://codezine.jp/article/detail/7992)

```bash
gulp compress --ENV production
```

のような形式で環境に合わせたコンパイルが出来るようになります。

###必要なnpmモジュール

* gulp //ご存知gruntの後継?タスクランナー
* gulp-uglify //難読化ツールuglify.jsのgulpプラグイン
* gulp-rename(任意) //gulpでファイルをリネームするプラグイン
* minimist //コマンドライン引数をparseするモジュール

### コード

JSON形式のコンフィグを用意します。
#### config.json
```js
{
    "development" : {
	    "host" : "dev.example.com"
    },

    "production" : {
	    "host" : "prod.example.com"
    }
}
```

#### target.js 

```js
 //圧縮したいファイル。このhostをコンパイル時に環境に応じて書き換えたいとする
 var host = __HOST__;
```

#### gulpfile.js

```js
'use strict'
var gulp = require('gulp'),
    uglify = require('gulp-uglify'),
    rename = require('gulp-rename'),
    minimist = require('minimist'),
    config = require('./config.json');

// minimistでコマンドライン引数をパース
var args = minimist(process.argv.slice(2)),
// 変数envに、CLI引数のENVに応じたconfig.jsonのオブジェクトを格納
    env = config[args.ENV];

// uglifyの引数に取るオブジェクト。compress.global_defsのプロパティに
// { 圧縮前ファイルの定数名 : 圧縮後のリテラル }　を指定。 
var compileCondition = {
    compress: {
        global_defs: {
            //ここでは、__HOST__をconfig.jsonのhostで書き換えます。
            __HOST__: env.host
        }
    }
};

function compress(condition) {
    gulp.src('./target.js')
        .pipe(uglify(condition))
        .pipe(rename('target.min.js'))
        .pipe(gulp.dest('./'));
}

gulp.task('compress', function() {
    compress(compileCondition);
});

// とりあえずdefaultも定義しておきます
gulp.task('default', ['compress']);
```

// この辺参考にしました。わかりやすかったです。
[GitHub / gulp Recipes](https://github.com/gulpjs/gulp/tree/master/docs/recipes)
BlenderとPythonのバージョンについて調べてみた

Blenderはスクリプト言語としてPythonを採用しています。（Blender自体は[C++](http://wiki.blender.org/index.php/Dev:Doc/Building_Blender)で記述されています）

この記事では、BlenderとPythonのバージョンに関することを書いてみます。

## バージョン調べ

BlenderのどのバージョンがPythonのどのバージョンに対応しているのか、いまいちわかりにくかったのでまとめてみました。Blender Ver2.5以降からPythonが同梱されています。

| Blender Ver | Python Ver | 同梱？ |
|:-----------|:------------|:------------:|
| 2.37a以前  |  Python2.3.5 |     No     |
| 2.43-2.40  |  Python2.4.2 |     No     |
| 2.44  |  Python2.5.1 |     No     |
| 2.45-2.47  |  Python2.5.2 |     No     |
| 2.48  |  Python2.5.4 |     No     |
| 2.49  |  Python2.6.2 |     No     |
| 2.5x  |  Python3.1 |     Yes    |
| 2.60-2.64  |  Python3.2 |     Yes    |
| 2.65-2.69  |  Python3.3 |     Yes    |
| 2.7x  |  Python3.4 |     Yes    |

確実にこれっていう公式ページが見つからなかったので、いろんな記事を参照して作成しました。間違っていたらすいません。

### 調査のため参考にした記事の引用
+ [blender.jp: 対応した Python のバージョン](http://blender.jp/modules/newbb/viewtopic.php?topic_id=991&forum=3)
> (注: 2.43-2.40は下記を使用)
> Python2.4.2
> (注: 2.37a以前などは下記を使用)
> Python2.3.5

+ [VRML97-Importer](http://www2.inf.fh-brs.de/~mgante2s/vrml97_importer.html)
> for Blender 2.44, Python 2.5.1 is necessary.

+ [Blender for Trainz Setup](http://www.yo.rim.or.jp/~keimei/VRM/Trainz/bsetup.html)
> 1.blender-2.48a-windows.exeを実行(インストール)して、blender-2.48a-windows.zipの中身をコピー。
> 2.python-2.5.4.msiを実行(インストール)。

+ [Blender Wiki: Extensions:JA/Py/Scripts](http://wiki.blender.org/index.php/Extensions:JA/Py/Scripts)
> Blender 2.49b は Python 2.6 系を利用

+ [Blender Wiki: コンソール・エディター・タイプ](http://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Extensions/Python/Console)
> Blender 2.5 は Python 3.1 を利用

+ [Blender 2.6 + Python 3.2 – we will involve the input equipment in own game](http://sysmagazine.com/posts/133434/)
> it is the version 2.60a which already contains Python 3.2.

+ [SprBlenderチュートリアル/インストール](http://springhead.info/wiki/index.php?SprBlender_tutorial_Install_ja)
> 2.65以降ではpython 3.3

+ [Blender Wiki: Dev:Doc/Building Blender/Linux/Troubleshooting](http://wiki.blender.org/index.php/Dev:Doc/Building_Blender/Linux/Troubleshooting)
> Blender 2.7x needs Python 3.4


## 古いバージョンは今も使ってるの？

Blenderは2.5から完全にインターフェースが変わっています。古いバージョンというのはメンテナンスされないので使わなくなるものなのですが、Blenderの場合2.4系から2.5系でドラスティックに変えすぎたため（Pythonのバージョンも変わっている）、2.4系の資産は2.5以降は一切使えなくなっています。

[Blender Wiki: Extensions:JA/Py/Scripts](http://wiki.blender.org/index.php/Extensions:JA/Py/Scripts)
> Blender 2.49b は Python 2.6 系を利用しています。この節では多くの優れたスクリプトとスクリプトを書く上での例が示されています。これらのスクリプトを Blender 2.5/2.6 で開くことは出来ません。しかし、これらのアルゴリズムは今でも非常に参考になります。

WEBでBlender情報を検索すると、2.4系の記事がわりと上位に来てしまうので、もう古い記事は不要なのではと思っていたのですが、現役で使っている事象を見つけてなるほどと思いました。

[Skyrim MOD作成Wiki Blender導入](http://www50.atwiki.jp/skyrim_mod/pages/47.html)
> モデリングがしやすい最新の2.7xと入出力用に2.49bを2つ揃えることにします。 
> スカイリムで使うプラグインの多くが2.49bまでしか対応していないので、旧バージョンの2.49bはほぼ必須です。

いまではBlender2.7xのみで使えるアドオンの開発が進んでいるみたいですが、少し前までは2.49bの資産を使う必要があったとのこと。過去資産の継承と新規開発のモチベーションの両立は難しい話ですね。
- sassはimport時にアンスコと.scssが省略できる  


```css
/* インポート */  
@import "_module.scss";  
  
/* _ を省略してインポート */  
@import "module.scss";  
  
/* _ と 拡張子を省略してインポート */  
@import "module";  
```
てかsassは`@import`でがっちゃんこできるんですね・・・  
タスクランナーでやるもんだと思ってた(,,꒪꒫꒪,,)ｗｗ
Sketch 3用プラグイン『StickyGrid』を作った

選択したシェイプのポイントをグリッドに吸い付かせるプラグインStickyGridをつくりました。

![](http://randompaper.co.s3.amazonaws.com/Sketch-StickyGrid/stickygrid.gif)

Vectorツールで軽くスケッチしてからこのプラグインを適用することで、簡単に幾何学的なオブジェクトを作ることが出来ます。

![Screen Shot 2015-12-16 at 02.29.15.png](https://qiita-image-store.s3.amazonaws.com/0/19622/7a96c09e-2ef9-3e52-ec8a-1fc7cc516c3d.png)

# インストール

[リリースページ](https://github.com/uetchy/Sketch-StickyGrid/releases/latest)からzipアーカイブをダウンロードし、__StickyGrid.sketchplugin__をダブルクリックしてインストールします。

もし、より_CLI-way_がお好みであれば、以下のコマンドをお試しください。

```zsh
cd "$HOME/Library/Application Support/com.bohemiancoding.sketch3/Plugins"
git clone https://github.com/uetchy/Sketch-StickyGrid.git StickyGrid
```

# 使い方

吸い付かせたいシェイプを1つ、または複数選択して__`ctrl` + `⌘` + `G`__を押すと、パスがグリッドの交差点に吸い付きます。
ショートカット以外にも、メニューから__Plugins > Sketch-StickyGrid > Snap to Grid__を選んでもOK。

シェイプはもちろん、グルーピングされたシェイプも、逆にシェイプポイントだけでも吸い付きます。

![](http://randompaper.co.s3.amazonaws.com/Sketch-StickyGrid/stickygrid_2.gif)

# プラグインの開発にあたって

## プラグインのデバッグ

デバッギングには[Sketch-DevTools](https://github.com/turbobabr/sketch-devtools)を使っていましたが、最新版のSketchでは使えなくなってしまいました。

その代わりにMac標準アプリの __Console.app__ を使う方法が公式デベロッパーサイトの記事 [Debugging - Sketch Developer](http://developer.sketchapp.com/code-examples/debugging/) で紹介されています。

スクリプト内で`log`関数を呼び出すと、Console.appにログが出力されます。

```js
log(context.document.gridSize);
```

## ドキュメントの情報源

ドキュメントは公式デベロッパーサイト [Sketch Developer](http://developer.sketchapp.com) があるものの、パス編集に関するドキュメントは全くありませんでした。
そこで、[class-dump](http://stevenygard.com/projects/class-dump/)を使い、Sketch.appのヘッダーファイルを抽出し、ひたすら__目grep__をしてシェイプ操作とグリッドに関するAPIを探し出し、プラグインの実装に役立てました。
また、先人によって公開されている数多のSketchプラグインのソースを見ることも、開発の助けになりました。

# 結論

苦行僧じみたSketchプラグインの開発には__class-dump__と__Console.app__が必携。
Gitでベアリポジトリにforce pushが出来ない場合

# 現象
間違えたcommitをリモートリポジトリのmasterにpushしてしまい、戻そうと思ったがなぜかforce pushでエラーになってしまった。

```
$ git reset --hard HEAD^
$ git push -f origin master
略
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '/hoge/foo/bar'
略
```

# 原因
リモートリポジトリ内のconfigファイルに以下の設定が入っていたため。

```
[receive]
    denyNonFastforwards = true
```

# 解決策
### 1.リモートリポジトリのconfigを以下のように編集する。

```
[receive]
    denyNonFastforwards = false
```

### 2.force pushする。

```
$ git push -f origin master
```

### 解決！

# まとめ
* ベアリポジトリの初期設定はファストフォワード以外を禁止しているため、歴史を戻すことが出来なかった。
* Gitは使い始めて間もないので実は常識だったりする？
* githubのリポジトリでは歴史を戻すfource pushが出来るため、nonFastforwardsの設定はfalseになっているのだろうか。
Yosemite で Afloat を使えるようにする


ウィンドウを常に前面固定にしたり、透明度を加える項目を各アプリケーションの「ウィンドウ」の設定に追加してくれる[Afloat](http://afloat.en.softonic.com/mac) を Yosemite でも使えるようにします。

まず既に Afloat をインストールしている場合はアンインストールしておきます。

[SIMBL](http://www.culater.net/software/SIMBL/SIMBL.php) より SIMBL をダウンロードしてインストールします。

SIMBL については下記リンクを参照。
[SIMBLとは - はてなキーワード](http://d.hatena.ne.jp/keyword/SIMBL)

Afloat を再インストール。

無事「ウィンドウ」に Afloat のメニューが表示されるようになりました。

![](http://gyazo.com/63f7d895765156e7a8deb801c601191b/raw)


参考：[MASTER YOUR WINDOWS WITH AFLOAT FOR MAC](http://www.chrisvanpatten.com/master-windows-afloat-mac)
heroku上でデプロイしたhubotをslack連携させる


今日のお題を使ってこれからCI環境を作りたいと思ってますので、今回は準備編ということでheroku上にhubotをデプロイしてslack連携までやってみます。

##github上にhubotリポジトリ作成
herokuで展開するのでローカルで以下のように作っていきます

```
$ npm install -g yo generator-hubot
$ mkdir ligzo
$ cd ligzo
$ yo hubot
#対話式の中で最後のadapterにslackと返答すると、Procfileに以下の記述が追記され、slack上で使うadapterの設定の記述もしてくれます。
web: bin/hubot -a slack -n ligzo
```

hubotを起動します

```
$ bin/hubot
#警告が出ましたが、動いています。
npm WARN package.json hubot-maps@0.0.0 No repository field.
Hubot> hubot ping
Hubot> PONG
```

githubに上げる前にローカルコミットしておきましょう

```
$ git init
$ git add .
$ git commit -m "Initial commit"
```

github上でリポジトリ作成
web上で作成します.
今回はligcoで作成しました。

先ほどのローカルのリポジトリにremoteaddします。

```
$ git remote add origin https://github.com/nakamura-daiki/ligco.git
$ git push -u origin master
```

公開鍵を登録しないといけませんでした。
web上でdeploykeyを登録しますが、その前にローカルで鍵を作成します。

```
$ ssh-keygen -t rsa
#鍵の名前を何でもいいので入力して作成します。
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/{作った鍵}
$ pbcopy < ~/.ssh/{作った鍵}.pub
```

web上で登録します.
![画像](http://i.gyazo.com/46edfd311fa402448cd3214fdd8ad9aa.png)
add Deploy keyからコピーしたキーを登録します。

再度pushします

```
$ git push -u origin master
```

とりあえず準備OKです。

##herokuにデプロイ

[https://toolbelt.heroku.com/](https://toolbelt.heroku.com/)ここからHeroku Toolbeltをダウンロードしてインストールします。
ローカルのターミナルで操作します。


```
$heroku login
#登録したメールアドレスとパスワードを入力します。
$heroku create ligzo-bot
# heroku上に鍵を登録します
$ heroku keys:add
#これでherokuにpushできます。
$ git push heroku master 
```

環境変数を登録します
herokuのwebコンソールからも編集できます。
環境変数の一覧はこちら[https://github.com/tinyspeck/hubot-slack](https://github.com/tinyspeck/hubot-slack)必要なのはこんなところでしょうか。

```
$ heroku config:add HUBOT_SLACK_TOKEN={}
$ heroku config:add HUBOT_SLACK_TEAM={}
$ heroku config:add HUBOT_SLACK_BOTNAME={}
$ heroku config:add HUBOT_SLACK_CHANNELS={}
$ heroku config:add HEROKU_URL={}
```

LIGのメンバーをherokuのリポジトリにcollaborator登録しておきます。
![画像](http://i.gyazo.com/86105028e28c524888c38a1d6ef57c18.png)

##slack連携
Configure Integrationsからhubotを選択して登録します。
ここで表示されるトークン等を上記のheroku configureで登録していきます。
herokuのwebコンソールで表示されているドメインをHubot URLに登録してSave Integrationします。
![画像](http://i.gyazo.com/5a608e043ca2b6985163aba5b6894e2d.png)


##呼んでみる
![画像](http://i.gyazo.com/7f82dec2b8ed09c78ae5c75131a22a58.png)
成功したみたいです。
SoftLayerで効率的に複数アカウントを使い分ける方法

このエントリは[2枚目 SoftLayer Advent Calendar 2014](http://qiita.com/advent-calendar/2014/softlayer2)の3日目のエントリです。

* * *

皆様、SoftLayerのアカウントをいくつ持っていますか？1つしかもっていないという方は少ないのではないでしょうか。例えばパートナー様であれば、お客様毎にアカウントをもっていると思いますし、ユーザーであれば、サブアカウントを複数作成し部署やプロジェクト毎に提供しているかもしれません。

アカウントを変えて作業するたびに、ログオフ、ログオンするのはとても面倒だと思います。そこで、Chromeのユーザー管理の機能を使って、それぞれユーザー毎に独立したセッションをもつ方法をお勧めします。

Ctrl+Shift+M（Mac: ⌘-shift-M）を押してみてください。下記のようにユーザーの切り替えることができます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/42406/08e01713-8f0a-c181-46bd-25afc8fd979b.png)

ユーザーの切り替えをクリック
![2.png](https://qiita-image-store.s3.amazonaws.com/0/42406/8fe08d58-66f5-b2e1-67e7-9dc359877a98.png)

これで、SoftLayerの管理ポータルにログオン、ログオフをすることなく、簡単にアカウントを使い分けることが可能です。

* * *
ご意見等あれば、[Facebook](http://facebook.com/kkitase) | [Twitter](http://twitter.com/kkitase) までお願いします。
rosのメジャーどころのgithubを全部watchする

@garaemonです。
ROSアドベントカレンダー二日目ということで、ROSの開発状況をwatchするtipsです。

ROSの開発は流行に乗っかって大部分がgithub上で行われています。


このへんがメジャーどころか
* [ros](https://github.com/ros) rosの基本的な機能
* [ros-perception](https://github.com/ros-perception) 認識関係
* [ros-planning](https://github.com/ros-planning) [moveit](https://moveit.ros.org)とか

たくさんあるので、開発を全て追いかけるのは難しいです。
そこで[jsk-github-watcher](https://jsk-github-watcher.herokuapp.com)を使えば
全部のgithubをwatchできます。

github APIを叩いて、organizationの全てのレポジトリをwatchします。
上の方は私の研究室関連のレポジトリですね。(もともと研究室向けに作った機能ですので)
![Screenshot from 2014-12-03 21:11:35.png](https://qiita-image-store.s3.amazonaws.com/0/6025/94df4649-e432-a088-73d7-e9bfef321d58.png)

ちなみに、一番のおすすめは[rosdistro](https://github.com/ros/rosdistro)です。だれがどんなライブラリを作っているかが結構わかりますね。
CoreOSのリーンスタートアップ感すごいなという話 - Rocketの開発スピード


12/1 CoreOSチームはBlogで衝撃的な発表をしてきた。

CoreOS is building a container runtime, Rocket
https://coreos.com/blog/rocket/


内容を要約すると、「Docker大きくなったしセキュリティ設計的に良くないとこあるから、CoreOSチームが1からより軽量なRocketというコンテナ作るぜ！」

ということらしい。

ちなみに、Dockerのサポートは今後も続けていくと明記されているので、一応CoreOS/Dockerと共に心中をする覚悟を決めていた人たち(自分たち)も安心して良さそう。

ちゃんとした内容を日本語で読みたければ、いまはTechCrunchの記事がいい気がする。
http://jp.techcrunch.com/2014/12/02/20141201coreos-calls-docker-fundamentally-flawed-launches-its-own-container-runtime/


実際にもう試せる状態になっていて、v0.1としてソースも公開されている。
https://github.com/coreos/rocket

で、ここからが本題。

自分は、このRocket自体が動くかじゃなく、何日間かけて開発したのかを見てみようと思った。

## 結果

2014/11/12にまともな実装は初めて実装されている事がわかる。
しかも、ちゃんとコミットしてるメインの人物は2人だけ(2人の間も結構差があるけど)
一番最初のコミットは2014/1/20だけど、これらは単純にどうやってContributeするかとライセンスに関する記述を書いているだけ。

### Contributionのグラフ
![graph-contributors.png](https://qiita-image-store.s3.amazonaws.com/0/6664/dc3ab33d-9086-23ca-14b5-8a5873feb464.png "graph-contributors.png")

### 12/3時点での1ヶ月のPulse
![pulse.png](https://qiita-image-store.s3.amazonaws.com/0/6664/680b3fb9-353d-80c1-8fba-dec2e04aaedc.png "pulse.png")

### 初期の頃のコミット
![initial-commits.png](https://qiita-image-store.s3.amazonaws.com/0/6664/63f8b221-a047-2412-aff1-707ce82abbb6.png "initial-commits.png")


22だけの成果をこれだけ大々的に発表して、注目を集めて、意見を聞きながらプロダクトを改善していく。
オープンソースの世界のリーンスタートアップの凄さを目の当たりにした気がした。
Canvas を使ってタイル画像を敷き詰める

## 概要

コード上で Canvas を使ってタイル画像を敷き詰める方法。
Surface ビューに drawable に保存してある背景タイルを敷き詰めたいときに、 xml からだとうまく動作しなかったため、この方法で描画した。

コード上で drawable のビットマップを取得するのには `BitmapFactory.decodeResource` を使用した。

## コード

```java
	/**
	 * タイル画像をキャンバス上に敷き詰める.
	 * @param canvas 描画用キャンバス.
	 * @param resource リソースオブジェクト.
	 * @param resourceId タイル画像のリソースID.
	 */
	public static void fillByTile(@NonNull Canvas canvas,
                                  @NonNull Resources resource,
                                  @DrawableRes int resourceId)
	{
		int canvasWidth = canvas.getWidth();
		int canvasHeight = canvas.getHeight();

		Bitmap tile = BitmapFactory.decodeResource(resource, resourceId);
		int tileWidth = tile.getWidth();
		int tileHeight = tile.getHeight();

		for (int y = 0; y < canvasHeight; y += tileHeight)
		{
			for (int x = 0; x < canvasWidth; x += tileWidth)
			{
				canvas.drawBitmap(tile, x, y, null);
			}
		}
	}
```
Clojureでログをspyする

Clojureのログ出力ライブラリtimbreに謎のspy関数があったのでご紹介
（tools.loggingにもあるようです）

```
[com.taoensso/timbre "3.3.1"]
```

以下のサンプルコードで

```sample.clj
(ns sample
  (:require [taoensso.timbre :as timbre]))
(timbre/refer-timbre)

(info "some" :sample 'message)

(spy (range 10))
(spy :info (map (fn [n] (Math/pow 2 n)) (range 10)))
```

以下のログが出力されます。

```
2014-12-03 20:41:17 +0900 hostname INFO [sample] - some :sample message
2014-12-03 20:41:18 +0900 hostname DEBUG [sample] - (range 10) (0 1 2 3 4 5 6 7 8 9)
2014-12-03 20:41:19 +0900 hostname INFO [sample] - (map (fn [n] (Math/pow 2 n)) (range 10)) (1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0)
```

対象のフォーム自体もログ出力してくれるわけですね。マクロの力は偉大なりといったところでしょうか
Racemi、SoftLayerオファリング活用のコツ

## この文章について
SoftLayer Advent Calendar 2014に投稿してます。
http://qiita.com/advent-calendar/2014/softlayer2
※他メンバーの技術情報もご参照にしてください。

サーバ移行を試験的に試そうとしている方に、Racemi、SoftLayerオファリングを有効に活用いただきたいと考え書いてみました。
2014年12月4日現在の情報ですので、お試しになるタイミングではご利用いただけない場合があります。
適宜読み替えてご活用ください。

## Racemiとは

　Racemiとはクラウドへのお引越しツールです。
　簡単にいうと・・・
　社内の物理サーバ/仮想サーバを、OS/ミドルウェア、各種設定を丸ごと
　クラウド（IaaS)へ移行することができます。
　SaaSで提供されているため、移行に必要なツールやストレージの準備が省け、作業の標準化も行えます。
　専用のWeb管理ポータルが提供されており、どこからでもシンプルに移行ができます。


## 各社オファリングについて

* **Racemiオファリング**

　ただ今Softlayerへの移行は、無料でご利用いただけます。
　仮想環境や物理サーバなど、移行元の制限はありません。
　　※**対応OSやバージョンの制限あり**

　![2.png](https://qiita-image-store.s3.amazonaws.com/0/59647/8246db3d-8ad7-33f3-305d-49e66663bf17.png)

　[RacemiOffering Link](http://www.racemi.com/ibm/)

* **SoftLayerオファリング**

　データーセンタ開設に伴う、オファリングを活用します。
　オファリングは**初回の請求**において、$500引きが適用されます。
　ということは・・・
　最大限に活用する場合は、初回オーダーに**オプションを不断に盛り込みましょう**。
　オーダー時は、必ず**月額課金**を選びましょう。



## Racemiデプロイ時は、ちょっと有償!?
　２つのオファリングを正しく理解して利用することがポイントです。
　Racemiの操作ごとにSoftLayerへ連携が行われます。
　以下のポイントで**ちょっと課金**されます。

　・Racemiによるキャプチャー時、ファイルはいObjectStorageに保存される。
　　この保管料金は従量課金の対象となる。

　・Racemiによるデプロイ時に、SoftLayerプロモーションコードの入力はできない。
　　Racemiからのデプロイしたインスタンスは時間貸しとなる。

　　これらを踏まえて、**移行費用を最小限に抑えるコツ**をまとめてみました。
　　また、もっと良いアイデアがあれば教えてください。


## 費用を抑えるコツ
* **キャプチャー（Racemi）**
　ディスクは、なるべくアンマウントしましょう。※1
　物理的、システム的、アプリケーション的に可能な場合に限る。


* **デプロイ（Racemi）**
　ウィザードの移行先のマシンスペックは比較的小さいスペックを選びましょう。
　（SoftLayerのオファリングが使えず、Racemiよりデプロイされるため）
　CPU、メモリの組み合わせを任意に選択できます。（下図）
　ディスクは移行元サイズにより、搭載サイズより大きいものが自動的に選ばれます。※1
　　　![3.png](https://qiita-image-store.s3.amazonaws.com/0/59647/d94887d9-d834-20e3-d819-f51e5ae88367.png)
* **移行後の操作（SoftLayer）**

　　課金メータが上がってますので、手際よく行いましょう(^^;
　　・デプロイのイスタンスへの接続
　　・移行後の稼働確認（最低限のアプリ確認事項などはリストしチェック）
　　・イメージ・オプションによりイメージ取得
　　・Racemiより移行した仮想インスタンスを削除
　　・イメージよりデプロイする**※ここでプロモーションコード入力（オファリング活用！）**


## 最後に

　オファリングを使うとはいえ、Racemiで移行の際には以下の費用が発生します。
　移行中に使ったオプションなど消し忘れると課金対象となります。
　ご利用後は必要に応じて後片付けしましょう。

　とは言えかなり、お安いですので･･･
　気にならない方は思う存分ご利用ください(^^;
　
　・ObjectStorage（Racemiポータルよりキャプチャーイメージの削除）
　・インスタンス&ポータブルディスク/時間
　・イメージ・オプション
16章 プアマンズ・サーチエンジン(貧者のサーチエンジン)

# 16.1 目的：全文検索を行う
FAQ Webサイトなどで、キーワードで全文検索を行いたい。

要件

* 検索語との一致度の高い記事を上位に表示
* 語形変化対応( crash, crashed, crashed, crashing)
* スケールすること

これをSQLで実現することは困難と伴う。これはそもそもSQL(とその背後にリレーショナル理論)の原則に、列の値のアトミック性があるためである。つまり、SQLは列の値全体での比較は得意だが、部分文字列の比較は非効率となる。

# 16.2 アンチパターン：パターンマッチング述語を使う

SQLのパターンマッチング述語を使おう。

* Like演算子

` SELECT * FROM Bugs WHERE description LIKE '%crash%'; `

* MySQLの正規表現述語

`SELECT * FROM Bugs WHERE description REGEXP 'crash';`

* 問題点
    * パフォーマンス低下
        * インデックスが使えず、テーブルスキャンが発生
    * 意図しないマッチの発生
        * `'%one%'`で`'%money%'`がヒットするなど
        * ただし単語境界をサポートするデータベースもある
            * MySQL: `SELECT * FROM Bugs WHERE description REGEXP '[[:<:]]one[[:>:]]'`
            * 正規表現のメタ文字`\b`(単語境界), `\B`(単語境界以外)
            * 日本語の場合どうする？

# 16.3 アンチパターンの見つけ方

* 「Like述語の2つのワイルドカードの間に変数を挿入する方法を知らない？」
* 「複数の語を含む文字列の正規表現はどうやって書ける？」
* 「特定の語を含まない文字列の正規表現はどうやって書ける？」
* 「ある語の語形のどれかを含む文字列の正規表現はどうやって書ける？」
* 「検索機能は、データベースのデータが増えると、許容できないほど遅くなるけど何故？」

# 16.4 アンチパターンを用いても良い場合

* 検索したいケースが単純である
* パフォーマンスが問題にならない場合

# 16.5 解決策: 適切なツールを使用する

解決策その１：そもそもSQLを用いない。専用の全文検索エンジンを用いる。

解説策その２：SQL標準に準拠しつつ、部分文字列マッチングより効率的な転置インデックスを用いる。

#16.5.1 ベンダ拡張

主要なデータベース製品では、全文検索というあり増えた要件に対して、独自の解決策を用意している。ただしベンダー間で互換性はない。

#16.5.2 MySQLのフルテキストインデックス

特徴

* MyISAM(MySQL3.23以降)
* InnoDB(MySQL5.6以降)
* CHAR, VARCHAR, TEXT型のみ
* 日本語の分かち書き非対応なので、使おうと思うと事前に分かち書きしてスペース区切りにしてからDBに格納する


```sql:フルテキストインデックスの定義
ALTER TABLE Bugs ADD FULLTEXT INDEX bugfts (summary, description);
```
```sql:問い合わせ
SELECT * FROM Bugs WHERE MATCH(summary, description) AGAINST ('crash');
```
```sql:問い合わせ(MySQL4.1以降)
SELECT * FROM Bugs WHERE MATCH(summary, description) AGAINST ('+crash -save' IN BOOLEAN MODE);
```

#16.5.4 Oracleでのテキストインデックス

単一のテキスト列用のインデックス、短いテキストに特化したインデックス、XMLドキュメントの検索に特化したインデックスなどがある

#16.5.4 Microsoft SQL Serverでの全文検索

フルテキストインデックスを作成後、`CONTAINS`述語でクエリ検索できる。

# 16.5.5 PostgreSQL

専用のデータ型`TSVECTOR`を用い、そのカラムに対して汎用転地インデックス(GIN)を作成する。その後テキスト検索演算子`@@`を使うことで全文検索ができる。

# 16.5.6　SQLite

SQLiteの拡張機能 FTSを用いることで利用可能である。

# 16.5.7 サードパーティーのサーチエンジン

データベース製品独自の機能に依存したくない場合は、SQLデータベースから独立して動作する検索エンジンが利用できる。

- Sphinx Serach
    - MySQLやPostgreSQLとうまく連携できる
    - インデックスの作成と検索が高速
    - 分散クエリもサポート
    - 更新頻度が低いデータに対して、高いスケーラビリティを出すことに向く
- Apache Lucene
    - 独自形式のインデックスを構築。データを更新すると、都度Luceneのインデックスの更新が必要


# 16.5.8 転置インデックスの自作

転置インデックスとは、検索対象になりえる全ての語のリストのことである。これを自作することで、SQLだけで完結した全文検索が実現できる。

ユーザーが検索するキーワード一覧を格納する`Keywords`テーブルと、多対多関係のための交差テーブル`BugsKeywords`を定義する。

```sql
CREATE TABLE Keywords (
  keyword_id SERIAL PRIMARY KEY,
  keyword    VARCHAR NOT NULL,
  UNIQUE KEY (keyword)
);

CREATE TABLE BugsKeywords (
  keyword_id INT NOT NULL,
  bug_id     INT NOT NULL,
  PRIMARY KEY (keyword_id, bug_id)
);
```

ユーザーが全文検索するときのフロー

1. キーワードを`Keywords`からSELECT
2. 存在していなかった場合
    * `Keywords`にINSERT
    * 新しいキーワードで、`Bugs`テーブルを全文検索
    * マッチした`Bugs`のレコードについて、交差テーブルにINSERT
3. 交差テーブルより、そのキーワードを含む`Bugs`をSELECT

特徴

- ユーザーが新規単語で検索する場合、全文検索が発生
    - あらかじめ全ての単語に対し、キーワードリストを用意しておけば回避可能
- 編集があった場合、交差テーブルの更新が必要
- `Keywords`テーブルに、ユーザーがそのキーワードを検索するたびに値が増える列を用意することで、どのキーワードへの需要が高いか分かる。
handlebarsのテンプレート内で、一階層上のデータにアクセスするには

handlebars内でのデータアクセスについて
* handlebars内で、jsonデータ階層を遡ってアクセスしたい

```json
response: {
	url: "http://www.hogehogeweiwei.com?weiwei=1&ponpon=2",
	datas: [
		0: {
			id: 0,
			title: "あああああ",
			hoges:[
				0:{hoge_id:0, comment: "hogehoge"},
				1:{hoge_id:1, comment: "hogehoge"},
				2:{hoge_id:2, comment: "hogehoge"},
			]
		},
		1: {
			id: 1,
			title: "いいいいい",
			hoges:[
				0:{hoge_id:0, comment: "hogehoge"},
				1:{hoge_id:1, comment: "hogehoge"},
				2:{hoge_id:2, comment: "hogehoge"},
			]
		},
		2: {
			id: 2,
			title: "ううううう",
			hoges:[
				0:{hoge_id:0, comment: "hogehoge"},
				1:{hoge_id:1, comment: "hogehoge"},
				2:{hoge_id:2, comment: "hogehoge"},
			]
		}
	]
```

このデータを下記テンプレートに突っ込む

```html
{{#each response.datas}}
<li data-item-id="{{id}}">
	<div>{{title}}</div>
	{{#each hoges}}
	<a href="{{../../url}}"> <!-- hogesまでネストしたところで２階層上のデータにアクセスしたい -->
		<li data-hoge-id="{{hoge_id}}">
			<div>{{comment}}</div>
		</li>
	</a>
	{{/each}}
</li>
{{/each}}
```

これだとダメ。
hogesをカレントにして２階層上に上がれない。
handlebarsの"../"はカレントデータの一階層上に行くわけではないらしい。
http://handlebarsjs.com/

```
The ../ path segment references the parent template scope, not one level up in the context. This is because block helpers can invoke a block with any context, so the notion of "one level up" isn't particularly meaningful except as a reference to the parent template scope.
```

上記テンプレートでresponse.urlにアクセスできなかったのは、responseでコンテキストが固定されてないから？
hogesからみて、
* １個上の階層：datas(eachでコンテキスト固定されてるから)
* ２個上の階層：？(コンテキスト固定されてない)

なので、こうしてやる必要がある

```html
{{#with response}} <!-- ここでコンテキスト固定する -->
{{#each datas}}
<li data-item-id="{{id}}">
	<div>{{title}}</div>
	{{#each hoges}}
	<a href="{{../../url}}">
		<li data-hoge-id="{{hoge_id}}">
			<div>{{comment}}</div>
		</li>
	</a>
	{{/each}}
</li>
{{/each}}
{{/with}}
```

これでいけました。
clockworkでRubyスクリプトを定期実行しよう

## clockworkを使う

定期実行といえば真っ先にcronが思い浮かびますが。
clockworkはcronを代替するGemです。
cronにくらべ読みやすく、windowsでも動作します。

インストールには、

```bash:
$ gem install clockwork
```

とすればOKです。

## 処理の記述

`every`の第一引数に頻度、第二引数にジョブ名を与えます。

基本的に、処理の内容は、`every`にブロックを渡すか、

```ruby:clock1.rb
require 'clockwork'
include Clockwork

every(10.minutes, 'kokoro') do
  puts "kokoro"
end

every(6.minutes, 'pyon') do
  puts "pyon"
end
```

handlerで捕まえて、case文で振り分けます。


```ruby:clock2.rb
require 'clockwork'
include Clockwork

# 動作
handler do |job|
  case job
  when "kokoro.job"
    puts "こころ"
  when "pyon.job"
    puts "ぴょん"
  end
end

#スケジューリング
every(10.seconds, 'kokoro.job')
every(6.seconds, 'pyon.job')
```

実行スケジュールは、
たとえば`every(1.week, 'myjob', :at => 'Monday 16:20')`のように、
読みやすい記法で細かく制御できます。[公式のGist](https://github.com/tomykaira/clockwork)を参考にしてください。

## 実行
clockworkの処理を記述したrbファイルを実行の際は、`$ ruby clock.rb`ではなく、

```bash:
$ clockwork clock.rb
```

と叩きます。
スケジュールされた通りに、`handler`のブロック内部が実行されるのが確認できるはずです。



## バックグラウンドで実行する（Linux, OS X）
上記のコマンドでは、端末を閉じるとclockworkのジョブが死んでしまいます。
閉じても動くように[nohupコマンド](http://www.codereading.com/nb/ignore-the-hangup-signal.html)と`&`を使います。

```bash:
$ nohup clockwork clock.rb &
```

とします。出力はnohup.outというテキストファイルに出てきます。

止めたいときには、

```bash:
$ ps -x | grep clock
$ kill [プロセスID]
```

を叩きます。

## コマンドを仕込む
スクリプトはシェルコマンド経由で呼び出すと乱暴で楽ちんです。
Rubyではバッククォートで囲まれた部分がシェルのコマンドとして処理され、出力が戻り値（文字列）となります。

```command.rb
`ruby -v` #=> "ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin12.0]"
```

## Dir.chdir

`clock.rb`が入っているディレクトリと、定期実行させたいスクリプトの入っているディレクトリはしばしば異なります。

そのため、[カレントディレクトリを変更するDir.chdir](http://blog.codebook-10000.com/entry/20140325/1395673232)を使うと良いと思います。

`Dir.chdir`は、引数でディレクトリのパスを指定しブロックを渡すと、ブロック内部を目的のディレクトリで処理したのち元のディレクトリに戻ってきます。

## まとめ
```ruby:clock.rb
require 'clockwork'
include Clockwork

every(5.minutes, 'hello.job') do
  Dir.chdir("./test/"){ puts `ruby hello.rb` }
end
```

これを`nohup clockwork clock.rb &`すればRubyスクリプトの定期実行です。
ライブラリ(google-play-services_lib)がインポートできない問題の対処

## ライブラリ・プロジェクトがインポートできない問題


Import Projectのチェックボックスがブラックアウトしていて、ライブラリプロジェクトがインポートできない問題

## 結論

workspace 直下にプロジェクトを置くとインポートできない


## 調べ方

プロジェクトをクリックして、[全てを選択] or [Select All] を選ぶと、上部に細かいエラー内容がでる

```
Cannot import google-play-services_lib because the project name is in use
```

同じプロジェクト名がある、ので削除する


## 試したこと

workspace/libproject/google-play-services_lib からインポートするとADT内の workspace/google-play-services_lib にコピーする模様

この辺でトラブル?

ADTのトップで google-play-services_lib を消すと、workspace/libproject/google-play-services_lib も消えます。


## 参考

[Android - Cannot import google-play-services_lib because the project name is in use - Stack Overflow](http://stackoverflow.com/questions/17525354/android-cannot-import-google-play-services-lib-because-the-project-name-is-in)