OmniAICreator/Qiita-1.07M huggingface dataset:
Hadoop + Ruby による母集団の全数調査 (2)

[昨日](http://qiita.com/ynakayama/items/014868218ea69c5614fb)に引き続き Hadoop と Ruby について書いていきます。

## Hadoop Streaming を使う

すでに説明した通り [Hadoop Streaming](http://hadoop.apache.org/docs/r1.2.1/streaming.html) を利用すると Ruby などのスクリプト言語で Hadoop を利用できます。

GitHub の以下の場所にサンプルとなるデータとソースコードを用意しました。
https://github.com/ynakayama/sandbox/tree/master/ruby/hadoop/streaming/example

これを元に、実際にどのように Hadoop Streaming のためのプログラミングをしていくかを説明していきましょう。

### 標準入出力を利用したテスト

上記のファイルの構成は以下のようになっています。

|ファイル|説明|
|:--|:--|
|test.json|検査対象のデータが格納されているファイル|
|lib/mapper.rb|Mapper のソースコード|
|lib/reducer.rb|Reducer のソースコード|

標準入出力を利用して次のようにパイプで処理を渡せば Hadoop で実行したときと同じ出力を得られます。

```bash
cat test.json | ruby lib/mapper.rb | sort | ruby lib/reducer.rb
```

ソースコードの内容は[前回](http://qiita.com/ynakayama/items/014868218ea69c5614fb)説明したものと同一です。

以下の出力が得られます。実際にはソースコードをもう少し工夫して先頭のキーが無い行を削除したほうが良いでしょう。

```bash
        0
012345ABCDEF    1
012345ABCDFF    2
012346ABCDEF    4
01236AABCDEF    3
```

結果が本当に正しいか grep と wc で検査してみます。

```bash
$ grep 012345ABCDEF test.json | wc -l
1
$ grep 012345ABCDFF test.json | wc -l
2
$ grep 01236AABCDEF test.json | wc -l
3
$ grep 012346ABCDEF test.json | wc -l
4
```

どうやら正しくカウントされているようですね。 Hadoop で実行することで、これらの処理が一部分散して実行されるというメリットを得られるわけです。

Hadoop Streaming では次のように実行します。

```bash
/usr/bin/hadoop \
  jar hadoop-streaming.jar \
  -D mapred.reduce.tasks=1 \
  -file lib/mapper.rb \
  -mapper mapper.rb \
  -file lib/reducer.rb \
  -reducer reducer.rb \
  -input s3n://bucket_name/XXX/test.json \
  -output out
```

非常に長いコマンドになってしまいました。

上記の例では /usr/bin/hadoop を利用して hadoop-streaming.jar を利用し Amazon S3 上の test.json を読み込み結果を HDFS 上の out というディレクトリに出力しています。

毎回このようなコマンドを入力するのは非常に煩雑です。そこで後述するフレームワークを利用します。

## Hadoop Streaming with Ruby

煩雑さを軽減するために作成したフレームワークが以下のものです。

Hadoop Streaming
https://github.com/ynakayama/hadoop-streaming

フレームワークと言ってもシェルスクリプトを薄くラップしただけのものに過ぎません。基本的な環境設定を config/env.conf ファイルでおこなえるようになっています。これは実際にはシェルスクリプトで使われる環境変数を定義するようになっています。

リポジトリの data/shakespeare/ の下にシェイクスピアの作品が用意されていますので確認してみてください。サンプルとして Mapper と Reducer にはこれらの平均単語長を調べるコードが書かれています。

単純に標準入出力のみを利用して実行するには script/simple とタイプします。すると log/result.log に計算結果が出力されます。

実際に Hadoop を利用するには Hadoop がインストールされたクライアントノードで bin/run & してください。

詳細は[ドキュメント](https://github.com/ynakayama/hadoop-streaming/tree/master/doc)を参照してください。

このフレームワークは実際には環境設定した内容をもとに上記のコマンドを発行しているシェルスクリプトにすぎません。これを使うメリットは次の通りです。

1) 面倒なコマンドを自前で発行しなくて良い

前述の通り Hadoop Streaming を利用するには長いコマンドを入力する必要がありますが、これらを環境設定ファイルなどから組み立ててくれるので利用者はそれを意識する必要がありません。

2) ジョブの開始時刻、終了時刻、正常終了などがログに出力される

ジョブログ (デフォルトでは log/job.log) にはジョブの開始終了時間、正常終了か否かが出力されます。正常終了の判断は HDFS の出力ディレクトリに _SUCCESS ファイルが生成されたか否かでおこなっています。

3) 結果がログに出力される

Hadoop Streaming では既定で HDFS に結果が出力されますがこれが log/result.log に落ちてきます。

複数の Reducer には今のところ対応していません。簡易なフレームワークなので適宜 pull request していただけばマージ致します。

## まとめ

Hadoop Streaming + Ruby でどのようにプログラミングをしていったらいいか、またそれらを簡単にするフレームワークについて紹介しました。
bashのちょっと便利なlogger

log4shまで使うのはちょっと大げさだけど

- 時刻、
- ログレベル
- ログレベルによる出力ファイル分割

程度のロギングの機能が欲しい時に使ってる。

`common_logger.sh`

~~~bash
#!/bin/bash

declare -r fd0_parent=$( LANG=C stat -Lc %d_%F_%i /proc/self/fd/0 )
log_impl_ () {

  [ "${LOG_INS}" = "" ] && return 0

  local dt=`date +'%Y-%m-%d %H:%M:%S'`
  local lvl=$1
  shift

  # 自分の入力ファイルを調べる
  local fd0=$( LANG=C stat -Lc %d_%F_%i /proc/self/fd/0 )

  #残りの引数をすべてログとして扱う
  local mes=""
  if [ $# -ne 0 ]; then
    mes="$* "
  fi

  local logfile=${LOG_INS}
  # 呼び出し元と自分の入力ファイルが同じなら引数のMSGだけを表示
  if [ "$fd0_parent" == "$fd0" ]; then
    printf "$dt %-5s $mes\n" [$lvl] >> ${logfile}
  else
    #  パイプの内容を出力
    local line
    IFS=''                  # read に先頭/末尾の空白も読ませる
    while read line; do
      if [ "$line" != "" ]; then
        printf "$dt %-5s $line\n" [$lvl] >> ${logfile}
      fi
    done
  fi
  return 0
}


#LOG処理定義 log levelを増やしたい場合は追加で記述
#echoの部分はわかりやすいから書いてるだけで消しても問題ない。
log() {       echo "$@" ; export LOG_INS=${COMMON_LOG:-"/var/log/log.log"} ; log_impl_ "INFO" "$@"; }
log_info () { echo "$@" ; export LOG_INS=${COMMON_LOG:-"/var/log/log.log"} ; log_impl_ "INFO" "$@"; }
log_debug() { echo "$@" ; export LOG_INS=${COMMON_LOG:-"/var/log/log.log"} ; log_impl_ "DEBUG" "$@"; }
log_err() {   echo "$@" ; export LOG_INS=${ERR_LOG:-"/var/log/err.log"}    ; log_impl_ "ERROR" "$@"; }
~~~

## 呼び出し

こんな感じに使う
`log-test.sh`

~~~bash
#!/bin/bash
. "./common_logger.sh"

log "info log."
log_debug "debug log."
echo "pipe log" | log
log_err "error log."
~~~

## 出力

`/var/log/log.log`

~~~
2014-05-13 17:33:25 [INFO] info log.
2014-05-13 17:33:25 [DEBUG] debug log.
2014-05-13 17:33:25 [INFO] pipe log
~~~

`/var/log/err.log`

~~~
2014-05-13 17:33:25 [ERROR] error log.
~~~
指定したDOMの子要素を移動させる

Vue.jsの実装の中で見かけたのですが、firstChildでwhileを回してappendChildすることで元の位置から削除されて移動させることが出来ます。
もとのコードではそのままdestにappendChildしてたけど要素が多い場合を考えるとDocumentFragmentに入れた方がいいかなとこんな感じになりました。

```js
var src = document.getElementById("src");
var dest = document.getElementById("dest");

var df = document.createDocumentFragment();
var e;
while (e = src.firstChild) {
  df.appendChild(e);
}
dest.appendChild(df);
```

```html
<div id="src">
    <p>hello</p>
    <div>world</div>
</div>
<hr />
<div id="dest"></div>
```

http://jsfiddle.net/koba04/jABjM/
MySQLで他のサーバーからの接続を許可する


最近、複数台のサーバーでシステムを構築しています。
MySQLには指定したHostからのみアクセス出来るようにする必要があったのでメモしておきます。

###構成はこんな感じで
`サーバーA(プログラム)`→`サーバーB(DB)`←`サーバーC(プログラム)`
サーバーA(44.***.***.***)とサーバーC(19.***.***.***)からのみサーバーBにアクセス出来るようにしたいです。
※44.***.***.***や19.***.***.***は任意のIPです

###アクセスを許可するMySQLの設定
####サーバーBでの作業です。

```MySQLにログインします
$ mysql -u n0bisuke -p
```

```
mysql> use mysql;
```

```許可しているホストとユーザーを確認
mysql> select user,host from mysql.user;
+----------+---------------+
| user     | host          |
+----------+---------------+
| n0bisuke | 44.***.***.***|
| n0bisuke | localhost     |
+----------+---------------+
2 rows in set (0.00 sec)
```
この時点でサーバーA(44.***.***.***)からサーバーBへの接続は許可されています。ここにサーバーC(19.***.***.***)からのアクセス許可をしてみます。

|DB接続情報 | 値 |
|:-----------|------------:|
|Host| 19.***.***.***
|User| n0bisuke
|database| my_database
|password| passwd

```
mysql> grant all privileges on my_database.* to n0bisuke@"19.***.***.***" identified by 'passwd' with grant option;
```



```許可しているホストとユーザーを再び確認
mysql> select user,host from mysql.user;
+----------+---------------+
| user     | host          |
+----------+---------------+
| n0bisuke | 19.***.***.***|
| n0bisuke | 44.***.***.***|
| n0bisuke | localhost     |
+----------+---------------+
3 rows in set (0.00 sec)
```

hostとuserが追加されていればOKです!

サーバーの構成って多くなると忘れがちになりますね汗
Windowsサーバのイベントログをリモートから見る

沢山あるwindowsサーバで１台ずつコンソールからイベントログを開いてチェックとか面倒臭い。
サーバ側にイベント通知を仕込めれば良いんだけど、色々あってサーバ側は触れない。
そんな時。

こんな感じのpowershellスクリプトを作って、

``` powershell
$SERVERS = "server", "another"
foreach ($SVR in $SERVERS) {
write-host ""
write-host $SVR
get-eventLog -ComputerName $SVR -LogName SYSTEM -Newest 10
}
```

こんな感じのバッチから呼び出す。

``` bat
powershell -executionpolicy remotesigned .\hoge.ps1
pause
```

powershellスクリプトはデフォルトだと実行できないようになってるから、バッチを噛ませて迂回している。
スクリプト実行端末のポリシーが変えられるなら、バッチを噛ませる必要はない。
Vagrantでshell-provisioningする時のshell環境に関するメモ

[Vagrant][1] の shell-provisioning で [rbenv][2] から [ruby][3] をインストールしようとしてハマったのでメモ。

以下のような rbenv.sh を作って、

``` bash
#!/bin/bash

sudo apt-get install -y libssl-dev libreadline-dev

# Install rbenv, ruby-build
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
cd ~/.rbenv
mkdir shims versions plugins
git clone https://github.com/sstephenson/ruby-build.git plugins/ruby-build
git clone https://github.com/sstephenson/rbenv-default-gems.git plugins/rbenv-default-gems
cd

# Setting rbenv path
cat << '__EOF__' > ~/.bashrc.d/rbenv.sh
export RBENV_ROOT="$HOME/.rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
__EOF__

# Setting default-gems
cat << '__EOF__' > ~/.rbenv/default-gems
rbenv-rehash
bundler
__EOF__
```

Vagarntfile ではこんな感じに指定する。

``` ruby
Vagrant.configure("2") do |config|
  config.vm.provision "shell", path: "rbenv.sh", privileged: false
end
```

これで rbenv は使えるようになる。

ここからさらに ruby をインストールしたいので、rbenv.sh に追加。

``` bash
# install ruby
rbenv install 2.1.1
rbenv global 2.1.1
```

rbenvコマンドが見つからない。

ssh で入ると普通に使えるんだけど、なぜか provisioning 時に PATH が設定出来てない。
これではどうか？

``` bash
# set environmental-variables
source ~/.bashrc.d/rbenv.sh

# install ruby
rbenv install 2.1.1
rbenv global 2.1.1
```

・・・同じくrbenvコマンドが見つからない。

原因は .bashrc。
デフォルトの .bashrc の先頭の方にはこういう記述がある。

``` bash
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
```

要するに、[Vagrant][1]が provisioning する時に使っている shell は non-interactive で、
non-interactive なアクセスの時には色々余計な事をしないように、ここ以降は読み込まれないようになっている。
だから PATH が設定さていなかったのだし、再度 source し直しても当然何も起こらない。

こうしたら動いた。

``` bash
# set interactive environmental-valiables
PS1='$ '
source ~/.bashrc

# Install ruby
rbenv install 2.1.1
rbenv global 2.1.1
```



--- 

[1]: http://www.vagrantup.com/ "Vagrant"
[2]: https://github.com/sstephenson/rbenv "rbenv"
[3]: https://www.ruby-lang.org/ "ruby"
feedlyのxmlをPythonで加工する。


要件：feedlyで購読してるブログを一覧表示（マークダウン記法）

RSSリーダーの[feedly](https://feedly.com)で購読しているRSSを取得。

XMLファイル形式でデータの中身は下記のようになっている。

```xml　feedly.opml.xml

<?xml version="1.0" encoding="UTF-8"?>

<opml version="1.0">
    <head>
        <title>xxxx subscriptions in feedly Cloud</title>
    </head>
    <body>
        <outline text="game" title="game">
            <outline type="rss" text="更新情報｜プレイステーション オフィシャルサイト" title="更新情報｜プレイステーション オフィシャルサイト" xmlUrl="http://www.jp.playstation.com/whatsnew/whatsnew.rdf" htmlUrl="http://www.jp.playstation.com/index.html"/>
        </outline>
    </body>
</opml>
```


Python2.5以上(ElementTreeが標準で入ってるので)

```xml_edit.py
#coding:utf-8

import xml.etree.ElementTree as ET
#xmlファイルの読み込み
tree = ET.parse('feedly.opml.xml')
root = tree.getroot()

#出力したいカテゴリ
category = 'Engineers Blog'
#findallに投げる検索対象
find_el = ".//outline[@text='%s']/outline[@type='rss']" % category

es = root.findall(find_el)
for e in es:
    #辞書型のデータが得られる。
    blog_data = e.attrib
    title = ""
    url = ""
    #データを取り出す。
    for key, value in blog_data.items():
        if key == 'title':
            title = value
        elif key == 'xmlUrl':
            url = value
    print "[%s](%s)" % (title, url)
```

```実行結果
[hoge](http://hoge/)
[fuga](http://fuga/)

```

Markdownで取得できたのでブログにも上げている。
https://www.karumado.com/2014/05/feedly.html
mailto:スキームの注意点(iOS)

iOSでは標準のメールアプリを開くURLスキームがあります。

```
mailto:mail@dom.com?subject=text&body=body
```
のアドレスをUIApplicationの共有インスタンスでopenURLすることでメールアプリが起動し、自動的に宛先、件名を補完します。
この際に、

```objc
NSString*subject = @"こんにちは！";
NSString*text = @"今度油揚げ食べましょう";
NSString*scheme = [NSString stringWithFormat:@"mailto:?subject=%@&body=%@",subject,text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:scheme]];
```

のようにしてしまいがちですが、これだと実はメールアプリは起動しません。
パラメータはUTF8エンコードする必要があります。

```objc
NSString*subject = 
[@"こんにちは！" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString*text = 
[@"今度油揚げ食べましょう" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString*scheme = [NSString stringWithFormat:@"mailto:?subject=%@&body=%@",subject,text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:scheme]];
```

これで正常にメールアプリが起動します。
ALMiniumでリポジトリへのアクセス時にLDAP認証を有効にする方法

[ALMinium][1] は プロジェクト管理ツール[Redmine][2] とその他便利なプラグインを一括してセットアップしてくれるインストーラである。
しかしLDAP認証を利用した場合、リポジトリへのアクセス時に適切に認証されない。

以下を追加する事により、リポジトリへのアクセス時にも適切に認証されるようになる。

対象環境は ubuntu12.04 server

``` bash
# LDAP認証に必要なPerlモジュールをインストール
sudo apt-get install -y libauthen-simple-ldap-perl

# インストールしたPerlモジュールをApacheに設定する
sudo sed -i -e "3i PerlLoadModule Authen::Simple::LDAP" /etc/apache2/sites-available/vcs

# Apacheを再起動して設定を有効化
sudo service apache2 restart
``` 

#### 参考

 * [redmineのアカウントでgitを使う方法 - Ogalog][3]

---- 

[1]: https://github.com/alminium/alminium "ALMinium"
[2]: http://redmine.jp/ "Redmine"
[3]: http://blog.ogatomo.com/blog/2013/01/10/how-to-use-git-by-account-of-redmine/ "ogalog"
MyBatis Generator で生成するコードにタイムスタンプを含めない

Git管理していると、タイムスタンプがあると邪魔なので生成させないようにする。
こんな感じ。

```xml:mybatorConfig
<generatorConfiguration>
  <classPathEntry location="${sql.driver.class.path}" />
  <context id="xxx" targetRuntime="MyBatis3" defaultModelType="flat">
    <plugin type="yyy" />
    <commentGenerator>
      <property name="suppressDate" value="true" />
    </commentGenerator>
    <!-- rest -->
  </context>
<generatorConfiguration>
```


`commentGenerator` のオプションは [ibatisの方](http://ibatis.apache.org/docs/tools/ibator/configreference/commentGenerator.html) にあった。
`commentGenerator`要素をどこに書けばよいかは、DTD (http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd) に書いてあった。
EclipseでAndroidアプリを実行して動作確認したいとき

## EclipseでAndroidアプリを修正したので動作確認したい

普通に「Run」で実行してもうんともすんともいわない。

「Run Configuration...」で実行するターゲットのターゲット環境を設定したものから「Run」しないといけない。

![RunAndroid.png](https://qiita-image-store.s3.amazonaws.com/0/5691/de1ade9b-89bf-d9a0-3630-74387485fb39.png)

普通にメニューから「Run As..」→「Android Application」を選んで実行して、何も起きない何も起きないと嘆いていた。。

## エミュレータが起動したのかさえもわからん・・

普通にコンソールに出てた・・orz

Window → Show View → Console

コンフィギュレーションターゲットに指定していたエミュレータに、アプリをインストールしてくれるみたい。
一度インストールしたアプリを見たければ、AVD Managerから立ち上げたエミュレータでも見れる。
スロークエリログは、ロック待ちの秒数はカウントしていない。



ということなので、
ロック待ちが多くてもスロークエリには上がってこないので、
プログラム側の処理が遅い原因がロックだった場合、
｢スロークエリ出てないしなー。｣と思っても判断できないから注意。

ロックが発生しているかしていないかは別途監視が必要。

一応、コマンドだと

```lang:mysql
SHOW OPEN TABLES;
```
とか使って

In_useの値を見るとよい。

N-1の数がロック待ち。(で、よいのかな。)

引用:http://dev.mysql.com/doc/refman/5.1/ja/slow-query-log.html

引用:http://dev.mysql.com/doc/refman/5.1-olh/ja/show-open-tables.html
Titanium Alloy WebView表示時に初期状態で表示されているキーボードを非表示にする


Titaniumを試してみているところで躓いたのでメモ。

Titanium SDK 3.2.3 の場合、WebViewを表示すると初期状態でキーボードが表示されていた。
これを非表示にする。

## メモ

* iPhoneエミュレータでは表示されていなかったが、Androidだと表示されていた。
* キーボードの左右移動ボタンで画面が左右にスクロールしていたので、PCでブラウザを使っている際のキーボードのような動きをするのかなと思った。
* Titanium SDKを 3.2.2.GA に落としてみたら表示されなくなった。

## 対策

これを追加

```js
webview.softKeyboardOnFocus = Ti.UI.Android.SOFT_KEYBOARD_HIDE_ON_FOCUS;
```

※コメントより、対策を教えて頂きました！

## 念のためソース

app/controllers/index.js

```javascript
var window  = Titanium.UI.createWindow({
	navBarHidden: true,
});

var webview = Ti.UI.createWebView({
	url: 'http://MyWebSite/',
	// width: Titanium.Platform.displayCaps.platformWidth,
	// height: Titanium.Platform.displayCaps.platformHeight,
	width: "100%",
	height: "100%",
	enableZoomControls: false,
	disableBounce: true
});

// コレを追加
webview.softKeyboardOnFocus = Ti.UI.Android.SOFT_KEYBOARD_HIDE_ON_FOCUS;

window.add(webview);
window.open();
```
Wget で Basic 認証を突破し、複数ドメインにまたがり、再帰的にコンテンツを取得する方法

wget --http-user=USER --http-password=PAWW -r -l 1 -Ajpg,png,gif,css,js, -H -Da.example.com,b.example.com http://a.example.com/hoge


参考: http://asklife.info/archives/2540
Javascriptで誕生日から現在の年齢を算出


どこかのサイトを見たんですが忘れてしまったのでメモ


```birthday.js

function calculateAge(birthday) {
	var  birth = birthday.split('/'); // birth[2]: year, birth[0]: month, birth[1]: day
	var _birth = parseInt("" + birth[2] + birth[0] + birth[1]);// 文字列型に明示変換後にparseInt
	var  today = new Date();
	var _today = parseInt("" + today.getFullYear() + affixZero(today.getMonth() + 1) + affixZero(today.getDate()));// 文字列型に明示変換後にparseInt
	return parseInt((_today - _birth) / 10000);
}

function affixZero(int) {
	if (int < 10) int = "0" + int;
	return "" + int;
}

var birthday = calculateAge('01/01/1989');
```

この月/日/年の形式はFacebook認証アプリを作成した際に認証をして値を受け取った際にこの形式だったので書いています。
VisualStudio Express 2013 for Windows Desktopでlog4cxx_0.10.0をビルドする

# はじめに
Visual Studio Express 2013 for Windows Desktopでlog4cxxのビルドにてこずったので、ビルド手順をメモしておきます。
Windows7 64bit(Sp1)とVS Express 2013 for Windows Desktopを使用して、Win32モードのlog4cxxのDLLをビルドしています。

※自分では試していませんが、ビルドエラーの原因がWin32限定のようなので、プラットフォームをx64にした場合は普通にビルドできるのかもしれません。

# 手順
基本的には http://qedatwork.blogspot.jp/2012/12/building-log4cxx-with-vs-2012-on.html の記事を参考にしています。

0. [log4cxx](http://logging.apache.org/log4cxx/download.html)と[aprとapr-util](http://apr.apache.org/download.cgi)のソースをDLします。
1. DLしたzipを同じフォルダに展開します。
2. 展開したフォルダのうち、apr-1.x.xとapr-util-1.x.xのフォルダを、それぞれapr及びapr-utilにリネームします。結果として、同じフォルダにapache-log4cxx-0.10.0、apr、apr-utilの３つのフォルダができるようにします。
3. apache-log4cxx-0.10.0/configure.batを実行します
4. apache-log4cxx-0.10.0/configure-aprutil.batを実行します
    * 中身を見ると分かりますが、APU_HAVE_APR_ICONVフラグとAPR_HAS_LDAPフラグの無効化がこれで実行されます。参考にしたリンク先のように、いちいちapu.hwやapr_ldap.hwを開いて編集しなくてもよいです。
5. apache-log4cxx-0.10.0/projects/log4cxx.dswをVS2013で開きます。
    * プロジェクトファイルのコンバートを実行する必要があります。
6. aprとapr-utilのプロパティを開き、[ライブラリアン]-[出力ファイル]の項目を、apr-1.lib、apr-util-1.libから、apr.lib、apr-util.libに変更してください。
    * やらなくても問題なさそうですが、ビルド時の警告が一つ消せます。
8. aprのプロパティを開き[構成プロパティ]-[全般]の[プラットフォームルールセット]の値を、Visual Studio 2013 -WindowsXP(v120_xp)に変更します。
    * 今回のキモです。VS2013ではInterlockedIncrementやそのお仲間を埋め込み命令で処理しようとしますが、VS2013のWin32ビルドでは、そこの定義で使用している#pragma指定がうまく動かないためにエラーになるようです。
    * 参考：https://groups.google.com/forum/#!topic/UniMRCP/Iybpn51UYnI 
7. apache-log4cxx-0.10.0/src/main/include/log4cxx/log4cxx.hを開きます。
9. ヘッダ内の以下の2箇所の行を書き換えます

```cpp
#if defined(_MSC_VER) && !defined(LOG4CXX_STATIC) && defined(LOG4CXX)
   // ↓以下の内容に置換する
#if defined(_MSC_VER) && _MSC_VER < 1700 && !defined(LOG4CXX_STATIC) && defined(LOG4CXX)
```
```cpp
#elif defined(_MSC_VER) && !defined(LOG4CXX_STATIC)
   // ↓以下の内容に置換する
#elif defined(_MSC_VER) && _MSC_VER < 1700 && !defined(LOG4CXX_STATIC)
```

以上で変更完了です。
後はビルドすればDLLができるはずです。
XAMPP1.8.3をいれたらDBが文字化けする

①まずはPHPをチェック
`vim /Applications/XAMPP/xamppfiles/etc/php.ini`
下記の「；」を削除して有効化
※そのまえにきちんと設定ファイルをphp.ini.distとして保存しておきましょう。後からわけわからず再インストールするはめになります。
`;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none
;mbstring.func_overload = 0
`
下記の値を変更
`mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
`

②つぎにmysqlをチェック
`vim /Applications/XAMPP/xamppfiles/etc/my.cnf`
※そのまえにきちんと設定ファイルをmy.cnf.distとして保存しておきましょう。後からわけわから
 [client]ブロックに下記の行を追加する
default-character-set=utf8
 
 [mysqld]ブロックに下記の行を追加する
character-set-server=utf8
skip-character-set-client-handshake

 [mysqldump]ブロックに下記の行を追加する
default-character-set=utf8

 [mysql]ブロックに下記の行を追加する
default-character-set=utf8


③気をつけるポイント
[重要] 既につくられてしまったDBは変更不可
（これにはまって、なおらないなおらない、、と思ってた。DBは作りなおす必要がある）
ダンプリストア時にAccess denied; you need (at least one of) the SUPER privilege(s) for this operation

リストア時に上記エラーが出た時に
ダンプファイルをエディタで開いて

```sql
/*!50013 DEFINER=
```

から始まるものがあれば、削除する。
DEFINERで定義されたユーザとリストアしようとしたユーザが異なるために起こるようです


ダンプファイルが巨大な場合、こんな感じ消してやると良いと思います(macのsedの例)。

```sh
sed -i -e 's/DEFINER=`.*`@`.*`//g' YOUR_DUMP_FILE.sql
```

確認。

```sh
cat YOUR_DUMP_FILE.sql | grep DEFINER
/*!50013  SQL SECURITY DEFINER */ # これはコメントだけなのでOKです :)
```
オーバーライドメソッドのjavadoc

```java
public interface A {
	/**
	 * foo する
	 */
	void foo();
}
public class B implements A {
	/**
	 * foo する
	 */
	@override
	public void foo() {
		//
	}
}
```

オーバーライドしたメソッドに同じことを書いていると、メンテが大変で、ミスのもとです。
これは、下記のように書けます。

```java
public interface A {
	/**
	 * foo する
	 */
	void foo();
}
public class B implements A {
	/**
	 * ${inheritDoc}
	 */
	public void foo() {
		//
	}
}
```

これで、javadoc コマンドで生成した時に自動的に親クラスの記述が入ります。
BEAR.sundayメモ#2 - 1フレームワーク1パッケージでインストールする


composerやphpのインストール、開発環境に関しては[前回](http://qiita.com/yamacraft/items/c6eca1e602754a55f8c6)の記事を参照してください。
何度も書きますが、/vagrant/以下で作成している理由は特にありません（ローカル内vagrantならvagrant sshしなくても簡単にファイルアクセスできる利点がありますが、単にリモート先で作ったvagrantなので特にそのメリットもないからです）。

[前回](http://qiita.com/yamacraft/items/c6eca1e602754a55f8c6)のBEAR.sundayのインストールは、1つのプロジェクト（フレームワーク）内で複数のアプリケーションを作る形になっていましたが、アプリケーションとフレームワークをセットにしてインストールすることもできます。

```
# 現在の階層にMy.Workフォルダを作ってその下にインストールされる
$ php composer.phar create-project bear/skeleton My.Work dev-develop
```

このような構成でインストールされます。

![スクリーンショット 2014-05-13 13.47.30.png](https://qiita-image-store.s3.amazonaws.com/0/4560/8b6d201c-bf08-ea75-2073-d24be8f5bc27.png "スクリーンショット 2014-05-13 13.47.30.png")

しかしこの状態では各種ライブラリがインストールされていない状態なので、composer installを実行しておきましょう。

ちなみに前回に補足で書いていますが、アクセス集中が理由でインストール中にgithubアカウントを求められることがありますが

```
$ php ../composer.phar install --prefer-source
```

とすることで、git関連のソースをgit clone形式でダウンロードするようになるので、上記のアカウントを求められることがなくなります。代わりにインストールに時間がかかるようになります。

インストールが完了すると、このような状態になります。

![スクリーンショット 2014-05-13 13.56.01.png](https://qiita-image-store.s3.amazonaws.com/0/4560/152246dc-297f-61e4-067d-4d855b5e2a00.png "スクリーンショット 2014-05-13 13.56.01.png")

前回利用していたbear.serverはvendor/bin/以下にあるので

```
# My.Work(/vagrant/My.Work/)以下で
$ vendor/bin/bear.server /vagrant/My.Work/
```

これでサーバ起動できるようになりました。

次回はappリソースの追加とPHPUnitを使ったテスト確認の予定です。
グラフィカルなEmacsに、フォントでアイコンを表現する (FontAwesome使用)


## Emacs上で部分的にフォントを表示したかっただけです。

![font-awesome.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/1b80e7e2-b955-c4b4-00a1-2f0fdb0e6bec.gif)

上がテキストプロパティで表現したもので、下はオーバーレイを`ov.el`を利用して使っています。

フォントは人気のある`Font Awesome`を使いました。
:link: http://fortawesome.github.io/Font-Awesome/
ダウンロードしてファイルをダブルクリックするなどしてあらかじめシステムにインストールしてください。

## コードサンプル (gist)
:link: https://gist.github.com/ShingoFukuyama/02f5032b43a447b3fbad
`font-awesome-list`に文字コードなどをリスト化してまとめています。
これを`ov.el`で一括表示したり、部分的なキーバインドを付加させることができます。

![font-awesome2.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/b5ea1249-2883-cdf5-25da-9395873b8429.gif)

## 応用編...
![font-awesome3.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/dd105bf6-77c4-4ae9-70b1-3fbd3bd3ce7f.gif)
PowerShellで日時をプロンプトに表示する

以前、[PowerShellのプロンプトを短縮する](http://qiita.com/Kuchitama/items/3bce1a0bb2da6c292401)という記事を書きましたが、今回は、さらにプロンプトに現在日時を表示します。

プロンプトに日時を表示することで、「あれ？このコマンドっていつ打ったんだっけ？」とか「しまった、作業の開始時間記録するの忘れた」などを履歴から取得することが出来るようになります。

# 現在日時の取得
現在日時は`Get-Date`コマンドで取得できます。
さらに、`-Format`で、任意の形式の文字列に変換可能です。

```ps1
> Get-Date
2014年5月13日 13:24:57

> Get-Date -Format "yyyy/MM/dd HH:mm"
2014/05/13 13:24
```

# プロンプトに表示

1.MyDocumentsにWindowsPowerShellフォルダを作成
2.作成したフォルダ内に以下のファイルを作成

```Microsft.PowerShell_profile.ps1
function global:prompt {
  $now = Get-Date -format "yyyy/MM/dd HH:mm"
  Write-Host($now + " ") -nonewline
  return "> "
}
```
3.以下の様に時刻が表示されます。
![2014-05-13_13h31_29.png](https://qiita-image-store.s3.amazonaws.com/0/646/c5c26d15-7370-3feb-d843-6dbe00e1927f.png)


## 参考
http://powershell.web.fc2.com/Html/Data/2010/09/18/0004.html
railsでリッチテキスト（wysiwyg）エディタを導入してみる


tinymce_rails(https://github.com/spohlenz/tinymce-rails) を入れようとして苦闘したけど諦めた。rails4に対応してない？

代わりにckeditorを試してみたらすんなり入った。

先にimagemagick入れておいて、

```
brew install imagemagick
```

```Gemfile
gem 'ckeditor'
gem 'carrierwave'
gem 'mini_magick'
```

```
bundle install
rails generate ckeditor:install --orm=active_record --backend=carrierwave
```

simple-form使っているのでviewにはこんな感じで記述

```
<%= f.input :description, :as => :ckeditor, :input_html => { :ckeditor => {:toolbar => 'Full'} } %>
```


画像アップロード機能付きでリッチテキストエディタ導入できた。

ただ、herokuにデプロイしてみると、assets以下のファイルのURLがプリコンパイルされたダイジェスト付きのものを参照していなくて動作せず、以下を参考にダイジェスト無しのものを作成してdeployしてみた。

http://weichienhung.github.io/blog/2013/09/09/rails-and-heroku/

動いた。
Gitbucketの導入からgit pushまで


## 要約
- Githubクローンの[Gitbucket](https://github.com/takezoe/gitbucket)の導入
- ssh経由でGitbucketを利用する流れ

## Gitbucketの導入
1. ダウンロード
	
	```Zsh
wget https://github.com/takezoe/gitbucket/releases/download/1.13/gitbucket.war
```

1. openjdkのインストール

	```Zsh
sudo yum install openjdk-7-jre
```

1. tomcatのインストール

	```Zsh
wget http://ftp.kddilabs.jp/infosystem/apache/tomcat/tomcat-7/v7.0.53/bin/apache-tomcat-7.0.53.tar.gz
tar zxvf apache-tomcat-7.0.53.tar.gz
```

1. tomcatでgitbucket.warを動かす

	```Zsh
cp gitbucket.war apache-tomcat-7.0.53/webapps/
cd apache-tomcat-7.0.53/
./bin/startup.sh
```

これで、http://example.com:8080/gitbucket にアクセスするとGitbucketのページが開くはずです。


## ssh経由でGitbucketを利用する流れ

初期状態だと、ユーザーは`root`、パスワードは`root`でログインできます。

1. ssh関係
	
	Gitbucketをssh経由で利用できるように設定します。
	
	![setting.png](https://qiita-image-store.s3.amazonaws.com/0/280/6248db39-e1a1-7b6c-6c56-bb17beea0bcf.png "setting".png")

	ここではポートを2020としておきます。
	`Base_URL`は各リポジトリへssh経由でアクセスする際のURLのベースとなります。
	`GITBUCKET_HOME`となっているのは、gitbucket.warを動かしているユーザーのホームディレクトリに置かれた`.gitbucket`ディレクトリに相当します。

1. ユーザーを作成します。

	![create_user.png](https://qiita-image-store.s3.amazonaws.com/0/280/b35dc2cc-f76a-1ab2-316b-f71d8cccf2ce.png "create_user.png")

	サインアウトして新たなユーザーでログインします。

1. sshキーの登録

	![register_ssh_key.png](https://qiita-image-store.s3.amazonaws.com/0/280/229fd3c0-ceb0-fac2-fbb3-5ffd70c4562b.png "register_ssh_key.png")


	```Zsh
ssh-keygen
```
	して作成した`~/.ssh/id_rsa.pub`の中身を登録します。
	タイトルは特になんでも大丈夫です。

1. リポジトリ作成
	
	右上の+ボタンからリポジトリを作成できます。
	
	作成したら、
	![ssh_url.png](https://qiita-image-store.s3.amazonaws.com/0/280/02159032-c32e-e404-eea7-a6b6d98363f2.png "ssh_url.png")

	このURLをコピーしておく
	- 今回、私の環境では`git-http-push`が失敗したのでssh経由としました


1. ローカルでの作業

	```Zsh
mkdir testdir
cd testdir
git init
echo "README" > README.md
git add .
git commit -m "first commit"
git remote add origin [URL]
git push origin master
```

--

少し躓くのは

- ssh経由を許すように設定すること、
- `BASE_URL`の設定

といったところだと思います。
そのDockerなにやんの、を調べるinpect

http://blog.docker.io/2014/05/docker-0-11-release-candidate-for-1-0/

```
> docker run -d --name redis crosbymichael/redis
```

これが何やるコンテナなのか、当然```redis-server```かなんかを実行するんだと思いますが、Dockerfileの中身的なのを見たいなぁと思いました。ちなみに```run -d```はdetachです。関係無いですが```docker -d```はデーモンモードです。

```
> docker inspect crosbymichael/redis
[{
    "id": "f36b976fc0d2b2754ebc18d10c96e820e571034b7e919bb56b2e3f3680ace856",
    "parent": "8279b4456b9660e2c121feacb25587cffe6c519e1336fd73b4ffe3bcb54300ea",
    "created": "2014-05-07T00:55:37.942624858Z",
    "container": "6d339f3ddeb8b1186ed7ce1c5f1a3e09796691337de030185609cac02b27c610",
    "container_config": {
        "Hostname": "baa8e009e3ac",
        "Domainname": "",
        "User": "",
        "Memory": 0,
        "MemorySwap": 0,
        "CpuShares": 0,
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "PortSpecs": null,
        "ExposedPorts": {
            "6379/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "HOME=/",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "/bin/sh",
            "-c",
            "#(nop) CMD [--bind 0.0.0.0 --save 900 1 --save 300 10 --save 60 10000]"
        ],
        "Image": "8279b4456b9660e2c121feacb25587cffe6c519e1336fd73b4ffe3bcb54300ea",
        "Volumes": null,
        "WorkingDir": "",
        "Entrypoint": [
            "redis-server"
        ],
        "NetworkDisabled": false,
        "OnBuild": []
    },
    "docker_version": "0.10.0",
    "config": {
        "Hostname": "baa8e009e3ac",
        "Domainname": "",
        "User": "",
        "Memory": 0,
        "MemorySwap": 0,
        "CpuShares": 0,
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "PortSpecs": null,
        "ExposedPorts": {
            "6379/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "HOME=/",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "--bind",
            "0.0.0.0",
            "--save",
            "900",
            "1",
            "--save",
            "300",
            "10",
            "--save",
            "60",
            "10000"
        ],
        "Image": "8279b4456b9660e2c121feacb25587cffe6c519e1336fd73b4ffe3bcb54300ea",
        "Volumes": null,
        "WorkingDir": "",
        "Entrypoint": [
            "redis-server"
        ],
        "NetworkDisabled": false,
        "OnBuild": []
    },
    "architecture": "amd64",
    "os": "linux",
    "Size": 0
}]
```

Entrypointに```redis-server```が設定されてます。やったね (参考: http://docs.docker.io/reference/builder/#entrypoint)
Pivotal TrackerをHipChatに通知する方法


社内チャットとして利用しているHipChatにPivotal Trackerの更新状況を通知したくて試行錯誤したので...

## HipChatのAPI Auth Tokensを取得する

TypeはNotificationで制作すればOK
Tokenを以下のURLの<token>と差し替え

```
https://api.hipchat.com/v1/webhooks/pivotaltracker/?auth_token=<token>&room_id=<room_id>
```

## HipChatのroom IDを確認する

HipChatのroom IDを確認して上記コードの<room_id>と差し替える

## Pivotal Trackerの設定

INTEGRATIONSの設定からActivity Web Hookの項目でバージョンはv3にする。このフォームに先のURLを記入して保存すれば通知がいくようになります。

参考）
[Pivotal Tracker Integration](http://help.hipchat.com/knowledgebase/articles/64449-pivotal-tracker-integration)
2つの配列が同じものかどうかチェックするPHP関数

PHPで、配列の内容が同じかどうかチェックしたい時に使う関数。
連想配列の階層が深くても可。

```php
<?php

function is_same_array($array1 = null, $array2 = null)
{
    if (empty($array1) && empty($array2)) {
        return true;
    } elseif(
        (empty($array1) && !empty($array2))
        || (!empty($array1) && empty($array2))
    ) {
        return false;
    } elseif(
        (is_array($array1) && !is_array($array2))
        || (!is_array($array1) && is_array($array2))
    ) {
        return false;
    }

    foreach($array1 as $key => $value) {
        if (is_array($value)) {
            if (!isset($array2[$key])) {
                return false;
            } elseif(!is_array($array2[$key])) {
                return false;
            } elseif (!is_same_array($value, $array2[$key])) {
                return false;
            }
        } elseif(!array_key_exists($key, $array2) || $array2[$key] !== $value) {
            return false;
        }
    }

    return true;
}
```

機能としては「ただ同じかどうか判断するだけ」（返り値は ```true``` か `false` のみ）なので、差分を返したりとかはナシ。  
参考にしたのが[こちらの関数](http://us3.php.net/manual/ja/function.array-diff-assoc.php#73972)で、こちらは差分を返してくれる模様。

パフォーマンスは悪そうだけど、配列の順番が違ってもチェックできるのがメリットかな・・・
Search Interfaceでハマった

メモ。

# onSearchRequested()呼んでも検索窓出ないんだけど？

string.xmlから参照してないので動かない。

```xml:searchable.xml
<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="ヒント"
    android:label="ラベル" />
```

`android:label=""`を定義していないので動かない。

```xml:searchable.xml
<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/hint"
 />
```

はいはい、バルスバルス。

# 参考
* [android search dialog not working](http://stackoverflow.com/questions/7077249/android-search-dialog-not-working)
* [Creating a Search Interface](https://developer.android.com/guide/topics/search/search-dialog.html)
Setting rotating backgrounds on Atom.io


前回のキマブロ： atom.ioのstyles.lessについて

It's kind of silly to write up an entry on this, but I thought this would be something fun to share.

I've been using atom.io now for about a week and I've wanted to shuffle around my backgrounds. Seeing as how LESS doesn't seem to provide the facilities for doing random select of array elements (without unsafe script handling), I decided to move this into my init script.

Let's get started.

# styles.less

Going by what my coworker told me, I decided to make `.editor` transparent. Doing that, my stylesheet gets very small:

```css
@transparent_pink: rgba(255, 192, 203, .5);
@semitransparent_yellow: rgba(255, 255, 0, .75);
@editor_background: rgba(20, 20, 0, .7); // もっと夏っぽく!!!

.editor {
  background: @editor_background;
}

.comment {
  color: @semitransparent_yellow;
}

.editor {
  .cursor {
    border-color: pink;
    border-width: 2px;
  }

  .selection .region {
    background: @transparent_pink;
  }
}
```

Yes, I did put that comment "夏っぽく" there because yellow-tinted pictures remind me of the yellow summer sunlight (though I believe the hue of the sunlight has more to do with the temperature, but I'm not sure).

# init.coffee

This is where all the heavy lifting gets done. Because I didn't want to deal with multiple files yet (because I haven't consolidated/updated my dotfiles in a while on GitHub), I wanted to keep everything in one file. Unfortunately, that means I have some formatting code and also just raw data in my script.

There's only a few bits relevant to this article, so I'll just show them in slices.

First, we need to set the update interval on our background:

```coffee
update_interval = 60 * 5
```

Then, we need a function for setting the background and backgroundSize style properties:

```coffee
setBackground = (image_url) ->
  pane = document.getElementsByClassName('pane')[0]
  pane.style.background = "url('{image_url}')"
                            .replace('{image_url}', image_url)
  pane.style.backgroundSize = "cover"
```

Populate a collection of images:

```coffee
images = []
images.push('https://farm4.staticflickr.com/3675/9164642229_9fd0560b31_o_d.jpg')
images.push('http://media-cache-ec0.pinimg.com/originals/39/8a/ff/398aff8e6dcea2befe58f09480857a4b.jpg')
[...]
```

A random select function for the image to be set:

```coffee
randomSelect = () ->
  index = Math.floor(Math.random() * images.length)
  setBackground(images[index])
```

Finally, the initialization of the first background and the intervals:

```coffee
randomSelect()

setInterval(randomSelect, (1000 * update_interval))
```

# Conclusion

できました！ Using this method, I was able to get a background image to rotate in my `.pane` every 5 minutes. 

![screenshot](http://media-cache-cd0.pinimg.com/originals/e2/26/63/e22663c83cb113c943eaf625ac5f68fd.jpg)

You can view/copy my config here: https://gist.github.com/kimagure/8c57fd492eec7c363abc
シェル関係の覚書

滅多に触らないため、忘れそうなので覚書。

##確認コマンド

デフォルトのシェル環境を確認

```sh
$ echo $SHELL
```

使用可能なシェルの一覧を確認

```sh
$ cat /etc/shells
```

##シェル比較表
シェル    |対話処理 |スクリプト処理|記述形式   |汎用性
:---------|:-------:|:------------:|:---------:|:-------:
Bourne    |不可     |良            |Bourne     |優
Korn      |良       |良            |Bourne     |良
POSIX     |良       |良            |Bourne     |不可
bash      |良       |良            |Bourne     |不可
C Shell   |良       |不可          |C Shell    |優
tcsh      |良       |不可          |C Shell    |不可
zsh       |良       |良            |Bourne     |不可
Perl      |不可     |良            |-          |良
『[入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界](http://www.amazon.co.jp/gp/product/4797321946/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4797321946&linkCode=as2&tag=goat10-22)』

##参考URL
* [シェルの比較](http://www2u.biglobe.ne.jp/~hsaka/docs/shell.html)
SpriteKit入門 -26-


今回は、画面上にデバッグメッセージを表示させてみます。
デバッグメッセージはゲームに関係ないので、updateメソッドで削除し、そのあとのアクション、物理シミュレーション処理は行わないようにします。
didSimulatePhysicsメソッドでデバッグメッセージを追加して、画面に表示します。

```objectivec:HelloScene.m
@interface HelloScene()
{
	SKNode *_world;
	SKNode *_camera;
}
@property BOOL contentCreated;
@property SKNode *debugOverlay;
@end

- (void)createSceneContents
{
	
	self.debugOverlay = [SKNode node];
	[self addChild:self.debugOverlay];
}

- (void) update:(NSTimeInterval)currentTime
{
	[self.debugOverlay removeFromParent];
	[self.debugOverlay removeAllChildren];
}

- (void) didSimulatePhysics
{
	[self centerOnNode:[self childNodeWithName:@"//camera"]];
	
	[self addChild:self.debugOverlay];
	SKLabelNode *debugMessage = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
	debugMessage.text = @"テストメッセージです。";
	debugMessage.position = CGPointMake(200, 200);
	[self.debugOverlay addChild:debugMessage];
}
```

![spritekit_26_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/d3f64224-f9cd-ec3b-7c1b-a7e7fbdbe8f7.png "spritekit_26_01.png")

今回はここまで。
ubuntu版GoogleChromeでメモリ解放ボタンを追加する方法

Windows版のchromeと少し方法が違う
以下のサイトに手順があります。
http://watnab.blogspot.jp/2011/11/linuxchrome.html

後は、Shift+EscでChromeのタスクマネージャーを開いて[Purge Memory]を押せばメモリ開放できます。
![タスク マネージャ - Google Chrome_022.png](https://qiita-image-store.s3.amazonaws.com/0/42913/df9dbaee-49d5-ddd4-5585-190747226748.png)
MySQLでよく使うコマンド一覧まとめ

## MySQLのユーザー一覧を確認

```
select host,user from mysql.user
``` 

##バージョン確認

```
mysqlにログインしてselect version()
```

## テーブルを作成
```
create table if not exists users(
user_id INT AUTO_INCREMENT,
password VARCHAR(30) NOT NULL,
name VARCHAR(140) NOT NULL,
regist_date TIMESTAMP NOT NULL,
PRIMARY KEY(user_id)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

##テーブル削除
```
drop table テーブル名
```

## データ検索
```
select * from tweets;
select * FROM tweets WHERE UID='nak';
select * FROM tweets WHERE MESSAGE LIKE 'he%';
```

##IN句
```
select cm.club_name from club_master as cm where club_id 
in(select uj.club_id from user_master as um inner join user_join_club as uj on um.user_id = uj.user_id)
```

##JOIN句
```
select um.name_kanji,cm.club_name from user_master as um
inner join user_join_club as uj on um.user_id = uj.user_id
inner join club_master as cm on uj.club_id = cm.club_id
```

##データ挿入
```
insert into tweets
('TID','UID','MESSAGE','DATEOFMSG')
values('1','nak','oraora','2012-10-22');
```
## データ更新
```
update tweets set
message='おらおら' where uid='nak';
```
## データ削除
```
delete from tweets where uid='wo2';

```
## テーブルを削除して、作り直す(キー番号もリセット)
```
truncate table テーブル名

```
## データベースのバックアップをとる
```
mysqldump -u root -p データベース名 > test.sql

特定のテーブルをダンプする
mysqldump -u root -p データベース名 テーブル名 > test.sql

```
## SQLを既存のデータベースにインポートする
```
mysql -u root -p データベース名 < test.sql

```
## 既存のテーブル名の変更
```
alter table テーブル名 rename as 新テーブル名

```
## 既存の列の構造(列名、型、制約)を変更
```
alter table テーブル名 change column 既存の列名 新しい列名 型名 制約

```
## テーブルの構造を表示 
```
describe テーブル名

```
## データベースと接続用ユーザーの作成
```
create database testdb;
grant all on testdb.* to root@localhost identified by 'hogehoge'; 

```
## データベースの削除
```
drop database 〜
[Groovy]Nullセーフ

# 概要
nullが混じったIntegerのリストから合計数を求めるサンプル。
個人的にはパターン４が好き。

```groovy
def list = [null, 1, 2, null, 3, 4, 5, null]

// パターン１
def globalCounter = 0
for(def i = 0; i < list.size(); i++) {
    if (list[i] != null) {
        globalCounter += list[i]
    }
}
assert 15 == globalCounter

// パターン２
assert 15 == list.inject(0) {x, y ->
    if (y != null) {
        x + y
    } else {
        x
    }
}

// パターン３
assert 15 == list.inject(0){x, y ->
    y != null ? x + y : x
}

// パターン４
assert 15 == list.findAll{it != null}.inject{x,y -> x+y}
```
Mac 上の Vagrant の Docker provider で rsync の代わりに NFS を使う

Docker をネイティブでサポートしていない Mac で Vagrant の Docker provider を使うと、boot2docker が VM として自動的に起動されて、それを仮想ホストマシンとしてコンテナが作られるようになってますね。

これだけでも面倒な仕組みになっているのだけれども、さらにローカルの開発マシンのフォルダーを仮想ホストマシンにマップしてビルドとかで使うようにするのに、rsync を使っていてコンテナ作成時にまるごとコピーが発生して、これもあまりよろしくない。

ので、NFS synced folder を使うようにパッチを当ててみようという試み。

https://github.com/YungSang/vagrant-docker-helper

追記： CoreOS を仮想ホストマシンに使うバージョン
https://github.com/YungSang/vagrant-docker-helper/tree/coreos

しかし、Docker provider が無かった時は、Docker provisioner をそのまま使っていたので、Docker provisioner の方が自分的にはわかりやすくて好きなんですけどね。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "yungsang/boot2docker"
  
  config.vm.network :private_network, ip: "192.168.33.10"
 
  config.vm.synced_folder "..", "/vagrant", type: "nfs"
 
  config.vm.network :forwarded_port, guest: 8080, host: 8080
 
  config.vm.provision :docker do |d|
    d.build_image "/vagrant/", args: "-t hello-docker"
    d.run "hello-docker", args: "-p 8080:80 -v /vagrant:/vagrant"
  end
end
```

https://github.com/YungSang/vagrant-docker-helper/blob/master/provisioner/Vagrantfile
Localizable.stringsでコンパイルエラーにはならないけど、正しく値を取得できないパターン


こんな間違いをする人は居ないと思うが…

## 一度文字列を記述した後に、コメントアウトの文字を#にしてコメントを書いた

```Localizable.strings

"fruits" = "フルーツ";

// 通常のコメント
"apple" = "りんご";

# 記法がおかしいコメント。コンパイルエラーにはならない。
"orange" = "オレンジ";
"banana" = "バナナ";

```
上記の例だと,#でコメントを書いてしまった後の値が全て取得できなくなっている。

```objective-c
NSLocalizedString(@"fruits", nil) -> フルーツ
NSLocalizedString(@"apple", nil) -> りんご
NSLocalizedString(@"orange", nil) -> orange
NSLocalizedString(@"banana", nil) -> banana
```


私は//ではなく、＃でコメントを記述してしまっていた。Markdownを書きたかったのだろうか。
Xcode上はそれっぽくコメントアウトのように扱われており、コンパイルエラーもおきなかったため、しばらくの間原因がわからなかった(T_T)
"fruits" = "フルーツ";を記述する前に#でコメントを書いたらコンパイルエラーになっていた。
KVM Ubuntu 14.04 仮想マシン最小インストールスクリプト

```bash:create_kvm_ubuntu1404.sh
#!/bin/bash

function main(){

    local NAME=$1

    if [ -z ${NAME} ]
    then
        echo $0 [NAME]
    else
        create_img ${NAME}
        create_kvm ${NAME}
    fi
}

function create_img(){

    local NAME=$1

    qemu-img create -f qcow2 /var/lib/libvirt/images/${NAME}.img 10GB
}

function create_kvm(){

    local NAME=$1

    virt-install \
    --connect qemu:///system \
    --name=${NAME} \
    --ram=512 \
    --disk path=/var/lib/libvirt/images/${NAME}.img,format=qcow2 \
    --vcpus=1 \
    --network bridge=br0 \
    --nographics \
    --accelerate \
    --hvm \
    --location=http://ftp.jaist.ac.jp/pub/Linux/ubuntu/dists/trusty/main/installer-amd64/ \
    --extra-args='console=tty0 console=ttyS0,115200n8 keymap=ja'

}

main ${@}
```
ディクショナリのkey error → key in dicionary で解決


key error が発生。ディクショナリに、存在しないキーでアクセスしようとしていたのが原因。

存在しないキーでアクセスしようとすると、key error が発生するので、

```python
if key in dictionary:
	dictionary[key] = "hoge"
```
もしくは

```python
if dictionary.haskey(key):
	dictionary[key] = "hoge"
```

というふうにしてエラーを防ぐ。
[RFC] homebrewで特定のformulaがインストールされているかどうかを調べるスクリプト

```sh
for formula in `brew list`
do
  if [ $formula = $1 ] ; then
    echo $1 is found!
    return 1
  fi
done
echo $1 is not found
return 0
```

`grep`や`sed`を用いるものも考えたのですが、これが一番平易でした。
「もっといい方法があるぜ」な方はコメントで教えてください。
node.jsでmd5計算するとき、hashオブジェクトは使い捨てる

md5sum計算したくなった。
ググると、[1番目](http://stackoverflow.com/questions/5878682/node-js-hash-string)と[2番目](http://blog.64p.org/entry/20111228/1325047940)に動くコードある。
2番目の方、ちゃんと使える。
ただ、1番目の方を参考に↓のコード書いたら、エラー出た。

```js
var md5hash = require('crypto').createHash('md5');
var md5hex = function(src){
  md5hash.update(src, 'binary');
  return md5hash.digest('hex');
};

// =>  TypeError: HashUpdate fail
```

ググったら、[hashオブジェクト再利用するなっていわれてた](https://github.com/joyent/node/issues/1415)。
以下引用。

>  @Shahor: you cannot reuse hash objects. Your example works when you change this snippet:
>
>      var userHash = hasher.update(socket.id).digest('base64');
>  to this:
>
>      var userHash = require('crypto').createHash('sha1').update(socket.id).digest('base64');


つまり最初のコードはこれでおｋ。（2番めの方のコードと同じ）

```js
var crypto = require('crypto');
var md5hex = function(src){
  var md5hash = crypto.createHash('md5');
  md5hash.update(src, 'binary');
  return md5hash.digest('hex');
};
```
VagrantでChef SoloのData Bagsの設定を行う


Vagrantfileの `config.vm.provision` にて。

```ruby:Vagrantfile
・・・省略・・・
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ['berks-cookbookcs']

    # cookbook内にあるData Bagsのディレクトリパス
    chef.data_bags_path = 'data_bags'
    # 暗号化するのであれば、共有鍵へのパスを指定
    chef.encrypted_data_bag_secret_key_path = 'encrypted_data_bag_secret'

    chef.json = {
    }

    chef.add_recipe 'hogehoge'
  end
・・・省略・・・
```

# 注意点
Chef SoloでData Bagsを使う場合は `chef-solo-search` のクックブックも入れておこう

```ruby:Berksfile
cookbook 'chef-solo-search'
```

# 設定の参考
- chef.data_bags_path: http://docs.vagrantup.com/v2/provisioning/chef_solo.html
- chef.encrypted_data_bag_secret_key_path: http://docs.vagrantup.com/v2/provisioning/chef_common.html
docker pull がうまくいかない時の Tips 2つ

症状
=====

docker pull が終わらない。
繋ぐ先が ``cdn-registry-1.docker.io`` (サンフラン？) なので、
混雑もあるだろうし、遠いからってのもあるだろうし。

対策1: ミラーを使う
=================

参考
-----

[Docker pull fails with unexpected EOF in archive](https://github.com/dotcloud/docker/issues/2461)

手順
-----

参考サイトの GavinYin さんが、親切にもミラー(と言っていいのか？)を公開してくれている。

``/etc/hosts`` に以下の行を追加

```shell:Shell
54.224.119.89 cdn-registry-1.docker.io
```

今のところ快適。ただしいつ使用不能になるかはわからない。



対策2: アメリカで pull する
==========================

参考
----

* [docker pull が遅いのをなんとかする](http://qiita.com/zakkied/items/af92cc76ace8c82b2c62)

手順
----

アメリカのマシンで pull して、ファイルを日本に持ってきて…という方法。

参考サイトに補足すると、``docker export`` は ``docker ps`` でリストできるコンテナのエクスポートであって、``docker images`` でリストできるイメージ群を固めるわけではない。なので、いろいろインストールした後ならともかく、起動直後のコンテナを export しても数ギガいくことはないと思われる。

```shell:Shell
# docker run -d -t --name="ubuntu-test" ubuntu /bin/sh
4a2dd52bf60a4174eeda314a2244361c7f76b76cb83fe5421ec165ea73a78651
# docker export ubuntu-test | gzip > dockerimg-exported.tar.gz
# ls -lh
total 77M
-rw-r--r-- 1 root root  77M May 12 17:34 dockerimg-exported.tar.gz
```

純粋に pull したのと同じ状態にしたいならば、save と load を使うのがよい。

```shell:Shell
# docker save ubuntu | gzip > dockerimg-saved.tar.gz
# ls -lh
total 376M
-rw-r--r-- 1 root root 376M May 12 17:33 dockerimg-saved.tar.gz
```

こちらはイメージの指定なので、コンテナを起動する必要もない。

別マシンにて：

```shell:Shell
# docker load < dockerimg-saved.tar.gz
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              13.10               5e019ab7bf6d        2 weeks ago         180 MB
ubuntu              saucy               5e019ab7bf6d        2 weeks ago         180 MB
ubuntu              precise             74fe38d11401        2 weeks ago         209.4 MB
ubuntu              12.04               74fe38d11401        2 weeks ago         209.4 MB
ubuntu              12.10               a7cf8ae4e998        2 weeks ago         171.2 MB
ubuntu              quantal             a7cf8ae4e998        2 weeks ago         171.2 MB
ubuntu              14.04               99ec81b80c55        2 weeks ago         266 MB
ubuntu              latest              99ec81b80c55        2 weeks ago         266 MB
ubuntu              trusty              99ec81b80c55        2 weeks ago         266 MB
ubuntu              13.04               316b678ddf48        2 weeks ago         169.4 MB
ubuntu              raring              316b678ddf48        2 weeks ago         169.4 MB
ubuntu              10.04               3db9c44f4520        2 weeks ago         183 MB
ubuntu              lucid               3db9c44f4520        2 weeks ago         183 MB
```
ghciでの関数定義

関数プログラミング入門の最初のコードでいきなり躓いたのでメモ。

ghciは一行ずつ処理するため、以下のような関数を作りたいときにちょっとはまりました。

```haskell:square.hs
square :: Int -> Int
square x = x * x
```

これを直接ghciで打とうとすると一行目のコードを打っておちますし、letをつけても二行目に辿りつけないのでやはりだめ。
で、どうやるかっていうので3パターンほど調べました。

## :set +m
ghciで複数行扱えるモードにしてしまうパターンです。

```shell
% ghci
Prelude> :set +m
Prelude> let square :: Int -> Int
Prelude| square x = x * x

<interactive>:5:1: parse error on input `square'
Prelude> let square :: Int -> Int
Prelude|  square x = x * x

<interactive>:7:2: parse error on input `square'
Prelude> let square :: Int -> Int
Prelude|     square x = x * x
Prelude|
Prelude> square 3768
14197824
```

注意点としては、定義する関数のインテントをあわせる必要があります。

## :{ :} で囲む
複数行モードにすると面倒なこともあるので、専用の囲むやつを使うという手があります。
こっちもインデントに注意。

```shell
% ghci
Prelude> :{
Prelude| let square :: Int -> Int
Prelude| square x = x * x
Prelude| :}

<interactive>:6:1: parse error on input `square'
Prelude> :{
Prelude| let square :: Int -> Int
Prelude|     square x = x * x
Prelude| :}
Prelude> square 3768
14197824
```

ちょっとカワイイ(何

## 複数行を一行にまとめる
; を使って複数行をまとめるという方法もあります。ワンライナーっぽさありますね。

```shell
% ghci
Prelude> let square :: Int -> Int; square x = x * x
Prelude> square 3678
13527684
```

とりあえずここらへん抑えればghci使って勉強していくのにはなんとかなりそう。
でも、ソースファイル書いた方が楽そうな気配もある...
Android のAPIレベルとバージョンコードを思い出す時のメモ

## 覚えられないのでメモにしておく

| バージョン | APIレベル | バージョンコード |
|:-----------|:-----------:|:------------|
| 4.4      |  19 |     KITKAT     |
| 4.3     |  18 |    JELLY_BEAN_MR2    |
| 4.2, 4.2.2       |  17 |     JELLY_BEAN_MR1     |
| 4.1, 4.1.1       |   16 |     JELLY_BEAN     |
| 4.0.3, 4.0.4       |  15 |     ICE_CREAM_SANDWICH_MR1     |
| 4.0, 4.0.1, 4.0.2       | 14 |     ICE_CREAM_SANDWICH     |
| 3.2       |  13 |  HONEYCOMB_MR2  |
| 3.1.x       |  12 |     HONEYCOMB_MR1     |
| 3.0.x       |   11 |     HONEYCOMB     |

## minSdkVersion の指定

### サポートのリソースをあまりさけないアプリ => 16

:star: 性能を要求されるような重い処理をするなら最新端末だけ対応するこの指定でも良いかな（国内）

### 少しサポートできる => 15

:exclamation:  2.3 系からのアップデートされた端末もあり（国内）、動作に癖があるので注意

### ユーザーをがっつり取りに行く => 好きにしてください

## あとがき

- グロースハッカー消えてー :angry:
【Mac】ターミナルからファイルをSublimeText2で開けるよう設定

# 設定方法 
SublimeTextを **subl** の入力で実行したい場合はターミナルで以下のコマンドを実行してください。

`sudo ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/bin/subl`

※ sublの部分は他のアプリケーションと被っていない任意の文字列で設定出来ます。
例) 
`sudo ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/bin/st`
などでもオッケーです。

# 設定確認
`subl -h`
でsublime textのhelpが表示出来たら成功です。

# 設定を削除する場合
間違って設定してしまった時などは
`rm subl`
を入力してください。
※ `rm subl/` のようにスラッシュをつけると削除できないので注意
メモ：Vagrant の NFS synced folder でいちいちパスワード聞いてこなくするやつ

https://github.com/mitchellh/vagrant/blob/master/contrib/sudoers/osx

```
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
```

を `$ sudo visudo` で追記。