OmniAICreator/Qiita-1.07M huggingface dataset:
mysql コマンド

ユーザーの作成
---

<pre>
 > GRANT ALL PRIVILEGES ON *.* TO user名@host名 IDENTIFIED BY 'password' WITH GRANT OPTION;
</pre>

#### 権限付与
<pre>
グローバルレベル:
GRANT 権限 ON *.* TO user;

データベースレベル:
GRANT 権限 ON db_name.* TO user;

テーブルレベル:
GRANT 権限 ON db_name.table_name TO user;

カラムレベル:
GRANT 権限 (カラム1, カラム2, ...) ON db_name.table_name TO user;
</pre>


ALL PRIVILEGES 全ての権限を与える
WITH GRANT OPTION 権限の書き換えを許可する

権限を書き換えたら、

<pre>
> flush privileges;
</pre>

#### 権限確認
<pre>
show grants for 'user'@'localhost';

現在接続しているユーザー
show grants;
show grants for current_user();
</pre>

ユーザーの確認
---

<pre>
> SELECT host,user FROM mysql.user;
</pre>

ユーザーの権限を確認、

<pre>
> SHOW GRANTS FOR user名;
</pre>

パスワードの変更
---

<pre>
>  SET PASSWORD FOR user名@"host名"=password('変更後のパスワード');
</pre>

ユーザーの削除
---

<pre>
> DELETE FROM mysql.user WHERE user='user名';
</pre>

まとめて確認
---

<pre>
mysql> select Host, User, Password from mysql.user;
</pre>

###参考 http://sasuke.main.jp/useri.html#2  

バックアップ、リストア
---

```
データベース指定バックアップ
# mysqldump -u root -p db_name > dumpfile.sql

データベース指定リストア
# mysql -u user -p  db_name < dumpfile.sql
```

※注意点：データベース指定なのか全体なのか

memo
---
show grants for 'hogehoge'@'localhost';
set password for 'hogehoge'@'localhost' = password('***');
grant all on (データベース名とか).* to 'hogehoge'@'localhost';
show databases;
USE (データベースの名前);
show tables;
SELECT User, Host FROM mysql.user;
drop user 'user'@'localhost';
Atom ShellでWebGLを動かしtmlib.jsを貼り付けてみた

# はじめに

最近コントリビューションが一定数に到達するとQiitaがツイートしてくれるので、自分が頑張ってみようと思った次第です。

## Atom Shellで実はWebGLがWindowsではこれまで動かなかった

Atom Shell公開後最初のアップデートでWebGL対応とアナウンスが
あったもののWindowsでは動かなかった。

- [WebGL doesn't work on Windows #324](https://github.com/atom/atom-shell/issues/324)

# Tmlib.jsでデスクトップアプリの夢が実現

<img src="http://gifzo.net/UsgXUK9JLb.gif" width="400">


WebGLにAtom Shellが対応したので、tmlib.jsで描画したCanvasをテクスチャーとして貼り付けてみた。

- [kjunichi/tmlibWebGL](https://github.com/kjunichi/tmlibWebGL)

# 動かし方

## 黒い画面の場合

```
git clone https://github.com/kjunichi/tmlibWebGL.git
atom ./tmlibWebGL
```
### OSXだと

```
~/Downloads/atom-shell-v0.12.5-darwin/Atom.app/Contents/MacOS/Atom ./tmlibWebGL
```

## 黒い画面じゃない場合

昭和生まれのアラフォーなのでごめんなさい。

# まとめ

Atom Shellを使えば、WebGLが使えて、[tmlib.js](https://github.com/phi-jp/tmlib.js/)も動かすことが出来るマルチプラットフォームなデスクトップアプリの
実現が出来そうだということでした。
【cocos2d-x】CCLabelTTFインスタンスをボタンにする


cocos2d-xではLabelを簡単にボタンにすることができます。
ここで作成したボタンには、タップした際にフォントが拡大する機能もデフォルトで備わっています。
ここではCCLabelTTFインスタンスを使用してボタンを作成します。

##流れ
①CCLabelTTFインスタンスを生成
②CCMenuItemLabelインスタンスを生成
③CCMenuインスタンスを生成
④画面に追加


##実装

```
//画面サイズを取得
CCSize winSize = CCDirector::sharedDirector() -> getWinSize();

//①CCLabelTTFインスタンスを生成
CCLabelTTF* label = CCLabelTTF::create("hoge", "arial", 24.0);

//②CCMenuItemLabelインスタンスを生成
CCMenuItemLabel* labelItem = CCMenuItemLabel::create(label, this, menu_selector(クラス名::タップされた際に呼び出す関数));
    
//表示する座標を設定。調整はお好みで。
labelItem -> setPosition(ccp(winSize.width * 0.9, winSize.height * 0.2));
    
//③CCMenuインスタンスを生成
CCMenu* menu = CCMenu::create(labelItem, NULL);

//labelItemの座標をすでに設定しているのでmenuは(0,0)に設定
menu -> setPosition(CCPointZero);

//④画面に追加
this -> addChild(menu);
```
@の罠


@ が付いたファイルは svn revert とかしても Skipped されてしまう。

そのようなファイルを revert するには 

```
svn revert 'hoge@'@HEAD
```

とする

参考: [svnでファイル名に@が含まれるファイルをrevert/rmする方法 - Dマイナー志向](http://d.hatena.ne.jp/tmatsuu/20100601/1275399818)
Re: PinterestのiOSアプリUIアニメーションを再現するまでの道のりを赤裸々に話します

[PinterestのiOSアプリUIアニメーションを再現するまでの道のりを赤裸々に話します | nanapi TechBlog](http://nanapi.co.jp/blog/2014/05/21/the-way-ios-app-user-interface-animation-pinterest/) より

> 最後に唯一わからなかったことがあるので記載させてください。Pinterestのブログに掲載されていたソースコードなんですが…
> 
>     return [[CBLPinViewTransition alloc] init];
> 
> の部分だけでどうやってあのアニメーションを表現しているのかがわかりませんでした。CBLPinViewTransitionの中身が想定できる人がいたらぜひ教えて欲しいです。

Pinterestの中の人ではないので、あくまでも想像ですが……。

`CBLPinViewTransition`というクラスは`UIViewControllerAnimatedTransitioning`というプロトコルを実装しているはずです。

`UIViewControllerAnimatedTransitioning`では

* `- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext`
* `- animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext`

というメソッドを実装する必要があります(→ [参考](https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewControllerAnimatedTransitioning_Protocol/Reference/Reference.html))。

前者は単純にアニメーション実行時間を返します。

後者は実際にアニメーションの実装を行う部分です。アニメーションが開始されるタイミングでこれが呼ばれます。

この時、`(id<UIViewControllerContextTransitioning>)transitionContext`という形で画面遷移のコンテキストが渡されるのですが、このコンテキストを通して、遷移元のビューコントローラならびに遷移先のビューコントローラのインスタンスにアクセスすることができます。

また、コンテキストにはコンテナビューという遷移アニメーションに利用されるビューがあり、アニメーションに一時的に必要なスナップショットをなどをこれに格納することができます。

基本的な流れとしては……

遷移元のビューコントローラからソースとなるコレクションビューのサイズと位置を取得して、遷移先のビューコントローラのビューのサイズにフィットするようにアニメーションするという形になるでしょうか。

かなりざっくりですが、

    - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
    {
      UIViewController *source = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
      UIViewController *destination = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
      
      UIView *container = [transitionContext containerView];
      UIView *snapshot = [source.view snapshotViewAfterScreenUpdates:NO];
      [container addSubview:snapshot];
      
      CGRect sourceRect = ... // 遷移元のサイズと位置を取得
      CGRect destRect = ... // 遷移元から遷移先のサイズと位置を割り出す
      
      [UIView animateWithDuration:[self transitionDuration:transitionContext]
                       animations:^{
                         // アニメーション処理
                       }
                       completion:^(BOOL finished){
                         [transitionContext completeTransition:YES]; // 遷移の終了を通知
                         // container に追加した subview は自動的に remove されるので、明示的なクリーンアップは基本的には必要ないはず
                       }];
    }

こんな感じでしょうか。

`destRect`を計算する際、`sourceRect`から遷移先のビューコントローラのビューサイズを相対的に割り出すのが少しトリッキーかもしれませんが、そうでもないかな。

ご参考になれば。
Chrome Devtoolsで描画パフォーマンスチェック


今までなかなか使いこなせてなかったChromeのTimeline周りを使って描画パフォーマンスチェックをする機会があったので、ちょっとメモ。

##そもそも描画パフォーマンスチェックとは
Webサイトやゲームを開いていて「なんか重いなー」と感じることが多々あると思いますが、その原因のひとつとして画面描画が重いことが挙げられます。スペックが低い端末で描画が重いサイトを見ると画面がカクカクしたり、ブラウザがクラッシュしたりします。

それを防ぐため、描画のパフォーマンスを監視して重い処理を改善していくことが必要になってくるわけです。

##Chrome DevtoolsのTimelineタブを使おう
Chrome DevtoolsをhtmlやCSSのチェックにしか使っていないという方は地味に多いと思いますが、Timlineというタブを使ってサイトの描画パフォーマンスを調べることができます。ちなみにスクリーンショットでは[Google Chrome Canary](http://www.google.co.jp/intl/ja/chrome/browser/canary.html)を使っています。

![スクリーンショット 2014-05-21 16.48.42.png](https://qiita-image-store.s3.amazonaws.com/0/7797/858e01b1-bc90-8ae3-8444-20f3d76c43c8.png "スクリーンショット 2014-05-21 16.48.42.png")

左上の丸アイコンをクリックすると記録が始まります。この状態でサイト内で色々操作します。その間に発生したjavascriptイベントや描画処理などが記録されていきます。
![スクリーンショット 2014-05-21 16.54.40.png](https://qiita-image-store.s3.amazonaws.com/0/7797/50e6b278-c736-2025-a2b9-85e33fab9abf.png "スクリーンショット 2014-05-21 16.54.40.png")

もう一度丸アイコンをクリックして記録を停止します。その横と下のエリアに記録されたイベントが時間軸と一緒に表示されます。
![スクリーンショット 2014-05-21 16.58.11.png](https://qiita-image-store.s3.amazonaws.com/0/7797/0cbc2bff-5587-a897-77ea-01613ef60724.png "スクリーンショット 2014-05-21 16.58.11.png")
紫と緑色のラベルが描画関連処理です。リクエスト直後の表示時だけでなく、画面スクロールやボタンホバーなどでも描画が走ります。処理が重いサイト、特にブラウザゲームなどは往々にして余計な描画処理が常に走っていて、それが全体のパフォーマンスを落とす原因になったりします。ここの記録をチェックして不必要な描画をさせないようにしましょう。

##描画発生箇所を画面上で見る
さらに便利情報。右上の歯車アイコンのとなり、>三みたいなアイコンをクリックしましょう。(このアイコンなんていうんだろう)

![スクリーンショット 2014-05-21 17.06.56.png](https://qiita-image-store.s3.amazonaws.com/0/7797/006945ba-3750-c5a7-df1b-b56d172f54f3.png "スクリーンショット 2014-05-21 17.06.56.png")

Renderingタブ内のShow paint rectanglesにチェックを入れます。これで再描画が走ったエリアをわかりやすく塗りつぶして表示してくれます。
![スクリーンショット 2014-05-21 17.09.53.png](https://qiita-image-store.s3.amazonaws.com/0/7797/17617cb4-7345-f9b2-1ed3-b8e66f997aa1.png "スクリーンショット 2014-05-21 17.09.53.png")
![スクリーンショット 2014-05-21 17.11.55（2）.png](https://qiita-image-store.s3.amazonaws.com/0/7797/fd8b1153-ff42-3833-c7e9-14899ee6fdd6.png "スクリーンショット 2014-05-21 17.11.55（2）.png")
この緑色の部分が再描画が走ったエリアです。一部だけしか変化がないのに余計な部分まで再描画が走ったりすることもあり、そこが余計な負荷となるのでチェックしていきましょう。

##おわり
あとは他にもGPUレイヤーを表示したり具体的なイベント名のチェックなど、便利な機能が盛りだくさんです。是非色々試してみましょう。
Homebrew で clang-format をインストール


https://github.com/Homebrew/homebrew/pull/27039

コアには入っていないので、`brew tap` でリポジトリを追加すると良い。

```
% brew tap tcr/tcr
% brew install clang-format
==> Downloading http://llvm.org/releases/3.4/clang+llvm-3.4-x86_64-apple-darwin10.9.tar.gz
...
% clang-format -help
OVERVIEW: A tool to format C/C++/Obj-C code.
...
```
logbackの設定をgroovyでやってみた。(logback.groovy)

## はじめに

脱XML

## 最低限やってみた

```groovy
import static ch.qos.logback.classic.Level.*

import java.nio.charset.Charset

import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.rolling.RollingFileAppender
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
import ch.qos.logback.core.status.OnConsoleStatusListener
import ch.qos.logback.classic.encoder.PatternLayoutEncoder

statusListener(OnConsoleStatusListener)
scan("10 minutes")

def defaultCharset = Charset.forName("UTF-8")
def defaultPattern = "%date [%highlight(%-5level)] [%thread] [%cyan(%logger{32})] - %message%n"
def defaultHistory = 365
def defaultFilename = "/var/log/hoge/hoge.log"

appender("CONSOLE", ConsoleAppender) {

  encoder(PatternLayoutEncoder) {
    charset = defaultCharset
    pattern = defaultPattern
  }

}

appender("FILE", RollingFileAppender) {

  fileName = defaultFilename

  encoder(PatternLayoutEncoder) {
    charset = defaultCharset
    pattern = defaultPattern
  }

  rollingPolicy(TimeBasedRollingPolicy) {
    maxHistory = defaultHistory
    fileNamePattern = "${defaultFilename}.%d{yyyy-MM-dd}.gz"
  }

}

root INFO, ["CONSOLE", "FILE"]
```

## 参考サイト

- [Chapter12: Groovy configuration](http://logback.qos.ch/manual/groovy.html)
- [Grassroots Groovy: Configure Logback with Groovy - Messages from mrhaki](http://mrhaki.blogspot.jp/2010/09/grassroots-groovy-configure-logback.html)
nginxをdebian6でキレイにエラー無しでコンパイルする方法まとめ

nginxをdebian6環境下でSPDY付きでキレイにコンパイルするまとめです。コピー・ペーストだけでもコンパイルできるかと思いますが、ある程度理解してからその手段に出て欲しいのと、最新版をしっかりと利用してください。下記バージョンは現時点での最新版となっています。

問題のあったopenssl heartbeatですがopenssl-1.0.1c.tar.gzでは問題はありません。

```yaml
# apt-get install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.7.0.tar.gz
# wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
# tar zxvf nginx-1.5.5.tar.gz
# tar zxvf openssl-1.0.1g.tar.gz
# cd nginx-1.5.5
# ./configure --with-openssl=/usr/local/src/openssl-1.0.1g  --with-http_ssl_module --with-http_spdy_module
# make
# make install
```

/usr/local/nginx にnginxのすべてがインストールされます。インストール場所を変えたい場合は–prefixなどをconfigureで変えてあげてください。

起動用スクリプトは下記の通り
※ nginx.conf などで pidファイルを /var/run/nginx.pid と設定してください。pidファイルを指定しないとnginx stopは動作しません。

```zsh:/etc/init.d/nginx
#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/nginx/sbin:/usr/local/nginx/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
        . /etc/default/nginx
fi

set -e

case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON || true
        echo "$NAME."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON || true
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
  reload)
      echo -n "Reloading $DESC configuration: "
      start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
          --exec $DAEMON || true
      echo "$NAME."
      ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
        exit 1
        ;;
esac
exit 0
```
Emacs 24.3 を Mac OSXでビルドしたときのメモ


# 概要
 - ソースからビルド(brew使ってない)
 - 日本語入力用 inline patchの適用
 - autoconfとautomakeの導入
 - 起動時のOSのセキュリティ設定

# 環境
 - Mac OS X 10.9.2

# 手順
1. ソースをダウンロード & 解凍
http://ftp.gnu.org/pub/gnu/emacs/

```
tar xvfz emacs-24.3.tar.gz
```

2. inline patchの適用

```
wget http://svn.sourceforge.jp/svnroot/macemacsjp/inline_patch/trunk/emacs-inline.patch
cd emacs-24.3
patch -p0 < ../emacs-inline.patch
```

3. autoconfとautomakeの導入
都合によりソースからビルド。
brew使ってる人はそっちがいいのでは。

```
curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz
tar -xzf autoconf-2.69.tar.gz 
cd autoconf-2.69
./configure && make && sudo make install
 
curl -OL http://ftpmirror.gnu.org/automake/automake-1.14.tar.gz
tar -xzf automake-1.14.tar.gz
cd automake-1.14
./configure && make && sudo make install
```

4. make/configure/make install三点セット
x不要, cocoaで使う用オプションでconfigure.	

```bash:
./configure --with-ns --without-x
make -j2 # -<CPUコア数>
sudo make install

```

5. 作成したパッケージをApplicationsに移動
` mv nextstep/Emacs.app /Applications/Emacs24.3.app`

6. 起動 & 失敗
-> 「ダウンロードしたアプリケーションの実行許可を Mac App Storeと確認済みの開発元からのアプリケーション」にしているので起動失敗。

7. セキュリティ設定
システム環境設定 > セキュリティとプライバシー > ダウンロードしたアプリケーションの実行許可
画面で、先ほど起動を止めたEmacsの起動許可をするかどうかの設定があるのでここでOKする。

8. 無事起動

# 補足 ターミナルから使う場合
OptionをMetaキーとして使うために以下の設定を行う

ターミナルの上部メニューから、
ターミナル -> 環境設定 -> "キーボード"タブ -> "メタキーとしてoption キーを使用" にチェックを入れる
# 参考文献
 - 日本語環境のMacにEmacsをインストールする方法 http://qiita.com/catatsuy/items/c3e4fe2e6c856c285880
 - Emacs 24をOS Xにインストールする http://piyopiyoducky.net/blog/2013/03/12/install-emacs-24-to-os-x/
 - Installing Autoconf, Automake & Libtool on Mac OSX Mountain Lion http://www.jattcode.com/installing-autoconf-automake-libtool-on-mac-osx-mountain-lion/ http://www.jattcode.com/installing-autoconf-automake-libtool-on-mac-osx-mountain-lion/
vagrantでCentOSマシンを構築する

# 準備
+ vagrantのインストール
+ virtualboxのインストール

[コチラ](http://qiita.com/kanuma1984/items/6f01207c467fe479bef1: "vagrant")の記事にインストールやvagrantの基本的な使い方が書いてあります。
よかったら参考にして下さい。


# CentOSのbox追加
今回はCentOS6.5を使用します。
box追加コマンドの書式は以下になります。

```text
vagrant box add "boxの名称" "boxのURL"
```
boxの名称については、任意の名称をつけられます。
OS名称、バージョンなどが入った管理しやすいものをオススメします。

それでは実際に追加します。

```bash
$ vagrant box add centos6.5-64 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box

```
結構時間かかるので筋トレでもして待って下さい。
完了したらboxが追加されたことを確認しておきます。

```bash
$ vagrant box list
centos6.5-64 (virtualbox)
```

と表示されればオッケーです。


# vagrant init
テストなので/tmp下にディレクトリ切って進めます。

```bash
$ mkdir /tmp/vagrant-centos
$ cd /tmp/vagrant-centos
```

先ほど追加した"centos6.5-64"を指定してVagrantfileを初期化します。

```bash
$ vagrant init centos6.5-64
$ ls
Vagrantfile
```

Vagrantfileが作られていれば完了です。

# Vagrantfileの編集
box名(centos6.5-64)を指定してinitするとどうなるかというと…

```text:Vagrantfile
  # ↓が指定したboxになってます。
  config.vm.box = "centos6.5-64"
```

"vagrant box add"でローカルに落としてあるので、
config.vm.box_urlの設定は不要となります。

他の設定に関しては[コチラ](http://qiita.com/kanuma1984/items/6f01207c467fe479bef1: "vagrant")の設定を使用します。
※config.vm.synced_folderだけ変更

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

Vagrant.configure("2") do |config|

  config.vm.box = "centos6.5-64"

  config.vm.network :forwarded_port, guest: 22, host:2222, id: "ssh"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network :private_network, ip: "192.168.33.10"                     
  # Shared folders
  config.vm.synced_folder "../vagrant-centos", "/vagrant-centos"

  # VM option
  config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--memory","1028"]
    v.customize ["modifyvm", :id, "--cpus","1"]
    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  end

end
```

# 起動
仮想環境を起動させます。
```bash
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Running 'pre-boot' VM customizations...
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] -- /vagrant-centos
```

無事起動できました。
"vagrant ssh"で接続できるか確認して完了です。


# おわり
試したいOS・バージョンが簡単に入れられるので便利！
複数行のコミットメッセージをターミナルから指定する


git commit -F- と、ヒアドキュメントを使います

### コミットする

```
$ git commit -F- <<EOM
> 任意のタイトルほげほげ
>
> ほげー
> ふがふがー
> EOM

```

### コミットログを確認する

```
$ git log
commit hoge123hoge123hoge123hoge123hoge123hoge123
Author: HogeUser
Date:   Wed May 21 16:08:01 2014 +0900

    任意のタイトルほげほげ

    ほげー
    ふがふがー

```
イベント駆動プログラミング


D氏がiPhoneについての記事を書いているので、便乗します！
今回はイベント駆動プログラミングについて説明していきます。

#イベント駆動とは
イベント駆動とは「イベント」と呼ばれるアプリや端末上で起きた出来事に対して処理を行うプログラムの実行形式のことです。
イベントがトリガーとなって、関数やメソッドが実行される、というイメージです。
javascriptでのプログラミングもobjective-Cでのプログラミングも、このイベント駆動の仕組みを理解するとプログラミングがしやすくなります。

#イベント駆動型プログラミングの難しさ
CやJavaで普通のプログラミングをする時は、基本はじめにmain関数が呼ばれ、上から順に実行されていきます。こういうプログラミングは、「どの関数がいつ実行されるか」ということをプログラマが決めることができます。
一方イベント駆動プログラムの場合は、「どの関数がいつ実行されるか」をきめることができるのは、そのプログラム書いた人だけではありません。この、「完全に実行順序を制御できない」ことがイベント駆動のプログラミングをする上での難しさになってきます。
![](http://www.ics.kagoshima-u.ac.jp/edu/ProgramingJava/Event/images/eventdriven.gif "Programming on Javaより")
http://www.ics.kagoshima-u.ac.jp/edu/ProgramingJava/Event/images/eventdriven.gif
イベント駆動はこんな図で表されます。（イベントループなどは現状分からなくてもOK）

##javascriptでのイベント
javascriptでイベントを発生させる可能性があるのは、いったい誰でしょうか。
まず最初に浮かぶのは、ユーザーです。
###ユーザーによるイベント
例えばHTMLで 

```html:
 <input type="button" onClick="yourFunction()">
```

   
と指定したボタンがあったとします。ユーザーがこのボタンをおすと、そのタイミングでyourFunction()関数が実行されます。

###ブラウザによるイベント

もう一つイベントを発生させる可能性があるものは、ブラウザです。javascriptプログラミングにおいて、

```js:
window.onload = function(){}
```

のように書かれているのを見たことがあることは多いと思います。
window.onloadはページの読み込みが完了した時に実行される処理です。ここに関数を登録することで、ページの読み込みが完了時にその関数が実行されます。ちなみに

```js:
function(){}
```

という関数は「無名関数」という関数定義の方法で、プログラム内で一度しか書くことのない関数はこのように書くことがあります。

##Objective-Cでのイベント

Objective-CでiPhoneアプリを開発する際も、同じようにイベント駆動型プログラミングをすることになります。

##ユーザーによるイベント

ユーザーによるイベントには、例えばボタンのタッチイベントがあります。
ストーリーボード上でボタンと.hファイルをTouch Up Insideなどでつなげると

```objc:
- (IBAction)buttonTouch:(id) sender;
```

のようなメソッドが作成されます。このメソッド内に書いた処理はユーザーがこのボタンを押すという「イベント」により発火されます。

##iPhoneによるイベント

iPhoneのiosにより発火されるイベントもあります。これを理解するには、iPhoneのライフサイクルを理解することが必要です。以下の図のようになっています。

![](http://www.aguuu.com/wp-content/2011/02/UIViewControllerlifecycle-300x225.png "iOSのUIViewControllerのライフサイクルを図にしてみた　より")
http://www.aguuu.com/wp-content/2011/02/UIViewControllerlifecycle-300x225.png

シングルビューアプリケーションを作成した際、ViewController.mのコード内に

```objc:
- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}
```

というコードが自動的に生成されています。NSLogなどで確認すると分かりますが、上の図に書いてあるようにこの関数は画面が表示される直前に呼ばれます。この関数内には、インスタンス変数の初期化などの処理や、最初に一度実行したい処理を書いていくことになります。

##おわりに
イベント駆動似ついては以上になります。少しでも分かってもらえたでしょうか？
もっと図や絵を入れて分かりやすい記事にしようと思ったのですが、ネット上に落ちてませんでした。_:(´ཀ`」 ∠):_
顔文字で代用しようかなヾ(＠＾∇＾＠)ノ
Capistrano3からVagrantで構築したゲストOSへファイルアップロード


## 環境

MacOS: 10.8.5
Vagrant: 1.5.3
VirtualBox: 4.3.10
GuestOS: CentOS6.3
Capistrano: 3.2

### ステージファイル

~/.ssh/configに設定したホスト名をcentosとする。

```ruby:dev.r
role :app, %w{vagrant@centos}
server 'centos', user: 'vagrant', roles: %w{app}
```

### デプロイスクリプト

例として、tarボールをアップロードし、デプロイする。

```ruby:deploy.rb
  task :upload do

    app = fetch(:application)
    release_path = fetch(:deploy_to)

    on roles(:app) do
      upload! "#{app}.tgz", "/tmp"
      execute "cd /tmp; tar zxf #{app}.tgz"
      sudo "mv -f /tmp/#{app} #{release_path}"
    end
  end

```
Gitのpost-receive（サーバーサイドフック）でpullして更新



```text:hooks/post-receive
#!/bin/sh
cd /path/to/dir
git pull origin master
touch tmp/restart.txt
```

更新されない

```text:hooks/post-receive
#!/bin/sh
cd /path/to/dir
git --git-dir=.git pull origin master
touch tmp/restart.txt
```

更新された

***
参考
http://stackoverflow.com/questions/19242401/git-hook-post-receive-with-git-pull-runs-well-via-command-line-but-returns-e
http://nullnote.com/web/git/git-auto-pull/
fluentd -> elasticsearchにlogstash形式でつっこむとき、indexを固定する方法

#問題点
fluentdからlogstash形式でelasticsearchに突っ込むとindexが毎日生成される。
>tarr_index.2014.05.21

apacheのログだとか、大量のものを毎日別indexに入れたいとかだったら、問題ないと思うが、特定のdirectoryの容量の増加傾向をトラッキングしたいみたいな感じで、一日一回`du -s`をしてjsonで出すみたいなのだと、毎日indexがわかれるのは辛い。
#やりたいこと
tarr_index.2014.05.21の日付部分をなくしたい。
#やり方
いろいろ調査しても、よくわからなかった。index_nameってやつつければいいのかなと思ったけど違った。

結局、ここに書いてあったやり方で、
[2014年1月12日 => logstash-2014.W02 ](http://y-ken.hatenablog.com/entry/fluentd-elasticsearch-kibana-index-partitioning)
`logstash_dateformat %Y`
これを付け加えて、一年間は同じindexを使うように設定した。
#Help me!
誰かtarr_index.2014.05.21 -> tarr_indexのやり方知ってたら教えて下さい。
さくらVPSにGitの中央リポジトリを置く(for Mac)

> ※
> この記事は以下の記事に書きなおしています。
> [CentOS - gitを使ったデプロイ方法 - Qiita](http://qiita.com/__mick/items/1f73fcb0d5dc7f5982f4)

## 概要

- Localで開発しているプロジェクトをGitで管理したい。バックアップも兼ねて。
- でもGitHubにリモートリポジトリ（中央リポジトリ）を置いちゃうと公開されるのでそれは無理
- DropBoxに置いてサーバーからPullしたらいいんじゃね？
- でもそれサーバーにDropBox入れないといけないのでめんどくさそう。
- つーか、本番環境にリモートリポジトリ置いたらいいんじゃね？

と言うわけで、本番環境のさくらVPSにGitのリモートリポジトリを置くことにしました。  
調べてみるとVPS側に「Gitサーバーを立てる」みたいな記事を見つけたんですが、そんなことしなくても実現可能だとわかりました。  
(それ以前にGitサーバーの意味が未だにわかりません)

## メリット
1. 本番環境に同期できる
2. 以前のバージョンに簡単に戻せる
3. 複数のPCで開発できる

### 1. 本番環境に同期できる
以前はrsyncを使って本番環境にプロジェクトをUpLoadしていましたが、
もちろんGit経由でも簡単にできます。  
LocalでCommit&Pushして、RemoteでPullするだけです。

### 2. 以前のバージョンに簡単に戻せる
Localでテストして万全の状態でRemoteに上げてバージョンアップしたつもりが、
本番環境ではうまく動かないなんてことがよくあります。  
そんな時もGitですから簡単に以前のバージョンに戻すことができます。

### 3. 複数のPCで開発できる
なんかもう当たり前のことばっかりで申し訳ないんですが、
git cloneすれば別のPCも開発に参加できます。

## やってみよう！(前準備)
Macはもともとターミナルから簡単にSSHでサーバーにログインできますが、
以下の設定をするともっと簡単になります。

~/.ssh/config というファイルを作ります。

```
host hoge
  HostName     ***.***.***.**
  Port         12345
  User         myname
  IdentityFile ~/.ssh/id_rsa
```

+ HostName :IPアドレス or ドメイン
+ Port :設定してある接続用のPort番号
+ User :ログインユーザー名
+ IdentityFile :ssh鍵の場所

以上の様に設定していると
`ssh hoge`
だけでログインできるようになります。
そして
`hoge:/home/hoge/`
という風にパスを指定することができます。

## やってみよう！
それでは本題です。

#### 1. まずLocalをGit initしておく

```
Git init MyProject
```

もしくはSourceTreeとかでGitリポジトリ作成（開発中のプロジェクトでもOK）

#### 2. VPSでgit init --bareする

```
cd /home/hoge/git
git init --bare MyProject.git
```
#### 3. Localでgit remote addする

```
git remote add server hoge:/home/hoge/git/MyProject.git
```

> 追記: 2015/02/28

すでにプロジェクトのremoteをgithub等にしている場合はoriginを追加して、複数のremoteに同時にpushすることができます。  
.git/configにurlを追加します。

```.git/config
[remote "origin"]
	fetch = +refs/heads/*:refs/remotes/origin/*
	url = git@bitbucket.org:myname/MyProject.git
	url = hoge:/home/hoge/git/MyProject.git

```
#### 4. LocalでCommit&Pushする。

(SourceTreeとかでテキトーにやっちゃってください)

#### 5. VPSの中央リポジトリからVPSの別の場所にgit cloneする。

```
cd /home/projects
mkdir MyProject
git clone /home/hoge/git/MyProject.git
```

上記が完了したらあとはLocalでガシガシ開発して  
**LocalでCommit&Push > VPSでPull**  
これだけでUpLoadできるようになります。

#### 6. remoteにpushしたら勝手にVPSでpullする

> 追記:　2015/02/28
コメント欄で教えていただきました。

VPSの中央リポジトリのpost-receiveに設定を書き込みます。  
cloneした方ではなく、bareの方です。(ここ注意）

```
vim /home/hoge/git/MyProject.git/hooks/post-receive
```

```post-receive
#!/bin/sh
cd /home/projects/MyProject
git --git-dir=.git pull origin master
```

ここまで設定したら、**LocalでCommit&Push**だけでアップロードできるようになります。

以上です。
MacでPDFのファイルサイズを縮小する

# 動機
Java Day Tokyo 2014の受講票をネットワークプリントサービスで印刷しようとしたら、ファイルサイズがでかくて撥ねられた悲しみから。

# 環境
- Mac OS X 10.9.2
- Preview 7.0

# 手順
1. PDFをPreviewで開く
2. Previewの上部メニューから ファイル > 書きだす
3. 保存ダイアログで以下を選択して保存
 - フォーマット: PDF
 - Quatrtzフィルタ: Reduce File Size

# 結果
6.7MB -> 539Kb
Rack::Timeout v0.0.4 を Rails 4 で使うと middleware stack に積まれない

master の HEAD ではなおっているのでそっちを使いましょう...

```rb
gem "rack-timeout", github: "kch/rack-timeout"
```

https://github.com/kch/rack-timeout/blob/v0.0.4/lib/rack-timeout.rb

```rb
require File.join(File.expand_path(File.dirname(__FILE__)), 'rack/timeout')

if defined? Rails
  case Rails::VERSION::MAJOR
  when 2; Rails.configuration.middleware.insert 0, Rack::Timeout
  when 3
    class Rack::Timeout::Railtie < Rails::Railtie
      initializer("rack-timeout.insert-rack-timeout") { |app| app.config.middleware.insert 0, Rack::Timeout }
    end
  end
end
```

https://github.com/kch/rack-timeout/blob/master/lib/rack-timeout.rb

```rb
# encoding: utf-8
require 'rack/timeout'
require 'rack/timeout/logger'

if defined?(Rails) && [3,4].include?(Rails::VERSION::MAJOR)
  class Rack::Timeout::Railtie < Rails::Railtie
    initializer('rack-timeout.prepend') { |app| app.config.middleware.insert 0, Rack::Timeout }
  end
end

Rack::Timeout::StateChangeLogger.register!
```
AngularJS　ng-repeatをネストする

* Object の key 名は、(key, value)で取得できる


```html:sample.html
<!DOCTYPE html>
<html ng-app>
<head>
  <meta charset="utf-8">
  <title>AngularJS　ng-repeatをネストする</title>
  <script src="http://code.angularjs.org/1.2.1/angular.min.js"></script>
  <script src="sample.js"></script>
</head>
<body>
<h1>AngularJS　ng-repeatをネストする</h1>
<div ng-controller="SampleCtrl">
  <div ng-repeat="item in data">
    <h2>{{item.name}}</h2>
    <div ng-repeat="(key, value) in item">
      <h3>{{key}}</h3>
      <p>{{value}}</p>
    </div>
  </div>
</div>
</body>
</html>
```


```js:sample.js
function SampleCtrl($http, $scope) {
  $scope.data = [
    {
      "name": "API NAME1",
      "synopsis": "SYNOPSIS1",
      "usage": "USAGE1",
      "param": "PARAM1"
    },
    {
      "name": "API NAME2",
      "synopsis": "SYNOPSIS2",
      "usage": "USAGE2",
      "param": "PARAM2"
    }
  ];
}
```
PythonのSimpleHTTPServerをアクセスログをトリガにして終了する

まずつまずいたのが、pythonのアクセスログ取得。

```bash
python -m SimpleHTTPServer > httpd.log
```

や

```bash
python -m SimpleHTTPServer 2>&1 > httpd.log
```

だとうまくいかないが、

```bash
python -m SimpleHTTPServer 2>&1 |tee httpd.log
```

だととれるらしい。

パイプを使用したので、$!ではpythonのPIDが取得できなくなってしまった。そこで
http://qiita.com/mattintosh4/items/35e184d890c4453a8da7
を参考にしながらjobsからPIDを取得した。

```bash
PYTHON_PID=`jobs -l|grep +|awk '{print $2}'`
```


最後に、ログに含まれる文字列から終了を判断したいので、
ログに特定の文字列が含まれないことを確認することにした。

```bash
while [ "`cat httpd.log|grep filename.html`" = ""]; do
sleep 1
done
```

全ソース

```bash
python -m SimpleHTTPServer 2>&1 |tee httpd.log
PYTHON_PID=`jobs -l|grep +|awk '{print $2}'`

while [ "`cat httpd.log|grep filename.html`" = ""]; do
sleep 1
done

kill $PYTHON_PID
```
【Excel】vlookup

いつも忘れるのでメモ。

##書式
```
=VLOOKUP（検索値，範囲， 列番号, 検索方法）
```

範囲内で、検索値(範囲の最も左)に対応する値(範囲の列番号)を返す。
検索方法は、trueだと値が存在しない場合に最大値を返す。falseだと値が存在しない場合に、#N/Aを返す。省略した場合は、trueとなる。

##例えば
こんな場合に、

|| A列 | B列 |
|:--|--------|--------------------------:|
|1| ノートPC  |  ①対応する単価を表示したい。  |  
|2| マウス    |  対応する単価を表示したい。    | 
|3| ノートPC |  対応する単価を表示したい。   |  

|| C列 | D列 |
|:--|--------|--------------------------:|
|1| ノートPC  |  50,000  |  
|2| マウス    |  1,000    | 
|3| ノートPC |  5,000   |  


「①対応する単価を表示したい」のところに、
=vlookup(A1,C1:D3,2)
と書くと、対応する単価が表示される。

##ちなみに
頭が0始まりだと、一方は文字で一方は数値になっていて、同じと判定されない。
xlsファイルをheadless環境でcsvに変更

Rubyの`Roo`を使うのが一番簡単そう。

```
$ gem install roo
$ irb -r roo
irb> s = Roo::Excel.new("myspreadsheet.xls")
irb> s.row 2
```

な感じで。読み込んだ時に大量に出力があるので`irb`上だとちょっと鬱陶しいけど実用上は問題ないでしょう。

## 参考

https://github.com/Empact/roo
【CakePHP】リリースタイミングでのブラウザキャッシュの回避方法

リリース時に、jsやcssがブラウザキャッシュに残り、変更が反映されない問題の対応方法。

##実現方法
jsやcssは?以降に書いたクエリストリングも含めて認識している。
そのため、リリースごとにクエリストリングを変更すれば、リリース直後にjsやcssを再読み込みして、その後はキャッシュされる。
ちなみに、クエリストリングは、?XXX=YYYの形であれば何でも良い。

```js:js
<script type="text/javascript" src="hoge.js?ver=852"></script>
```

```css:css
<link rel=stylesheet type="text/css" href="hoge.css?ver=852"/>
```

##CakePHPでの例

core.phpで設定できるAsset.timestampを有効にすることにより、ヘルパーで作成したjsやcssの読み込みに、最終更新日をクエリストリングとして付与してくれる。

```php
Configure::write('Asset.timestamp', 'force');
```

コメントアウト前のデフォルトでは、第二引数がtrueになっている。trueの場合はdebugレベルが0より大きい場合(つまりDevelopment Modeの場合)のみ有効になるが、forceを設定すると常に有効になります。

参考：[CakePHP2のcore.phpでAsset.timestampの設定を変更するとブラウザキャッシュを無効化することができる](http://tech.oga-ria.com/asset-timestamp-of-cakephp-is-useful/)
logrotateのファイル名に一意な値を入れたい

某社のアプリで、ログを分割して開きやすくしよう、というのをやっているんだけど、その際にlogrotateを利用している。
で、デフォルトだと以下の様な感じになる。

```
production.log
production.log.1
production.log.2
production.log.3
```

良い。良いんだけど、3とかまでいくと滅多に見ないし、圧縮したいよね、とか、1,2,3だといつのやつなのかいまいち判別付かない、とか、そういう運用面で困ったことがままある。
ので、これを良い感じにしてみようと思う。

# 圧縮する

`/etc/logrotate.d/app`みたいなファイルに、以下のオプションを入れる。

```
/var/www/app/shared/log/production.log {
  delaycompress
  compress
}
```

こうすると、

```
production.log
production.log.1
production.log.2.gz
production.log.3.gz
```

となる。あらべんり。

# 連番じゃなくて日付にする

```
/var/www/app/shared/log/production.log {
  delaycompress
  compress
  dateext
}
```

こうすると、

```
production.log
production.log.2014-05-21
production.log.2014-05-20.gz
production.log.2014-05-19.gz
```

となる。あらべんり。

# まとめ

古いファイルは消すか、Amazon Glacierに転送するのが良いと思います。
Homebrewのキャッシュ削除

Macのデイスク容量がカツカツのまま運用しておりついに/Libray 以下の整理まで手をつけだした時に /Library/Caches/Homebrew にインストールパッケージのアーカイブやらで数GB消費していることに気付いた。
これらは再ダウンロードできるものなので消して問題なさそう。

```
brew cleanup -s
```

のコマンドで消せる。
BubbleWrap::HTTP.getのブロック内にyield実行させようとしたらエラー

これと同じ問題だった。
http://d.hatena.ne.jp/hokaccha/20130725/1374760838

bubble-wrap-httpのソースを読むと、callで呼ぶようになってるのでたぶんこれが原因。
https://github.com/rubymotion/BubbleWrap-HTTP/blob/master/motion/http/query.rb#L397

じゃあどうするか。
取り敢えずは以下のようにデリゲート用メソッドを加える形で解決しました。

```rb
class SpotSearch
  attr_accessor :delegate

  def initialize(attributes = {})
  end

  def find(keyword)
    # ... urlとかpayloadとか色々指定済みということで ...
    BW::HTTP.get(url, payload: payload) do |response|
      @delegate.call(response) if @delegate
    end
  end
end

search = SpotSearch.new
search.delegate = Proc.new {|response|
  puts response # -> ちゃんと動く
}
search.find('銀座 カフェ')
```

最終的にはもっとスマートにメソッドを登録、呼び出しができればいいのだと思う。
色々ハマったけど、おかげでブロックとかProcとか少し理解できました。
Railsで複合キーを扱う(composite_primary_keys)

composite_primary_keysを利用する事で複合キーを扱えます。

参考：
[Railsで規約に沿わない古いデータを扱う](http://qiita.com/k-shogo/items/884498ad512c0e6eb303)
[rails 既存DBを使ってrailsしてみた。](http://hmu29.hatenablog.com/entry/2014/02/14/001513)

# インストール
```rb
#Gemfile
gem 'composite_primary_keys'
```

# モデル
```rb
class Company < ActiveRecord::Base
  self.primary_key = :company_id
  has_many :company_employes, foreign_key: :company_id
  # foreignキーも複合キーにする場合は、
  # has_many :company_employes, foreign_key: [:company_id, :employ_id]と配列で定義する
end
```
```rb
class Employ < ActiveRecord::Base
  self.primary_key = :employ_id
end
```
```rb
class CompanyEmploy < ActiveRecord::Base
 #ここで複合キーを利用する
 self.primary_keys = :company_id, :employ_id
end
```

# 利用例

```rb
# 複合キーをfindする例

company = Company.find(1)

# keyに[company_id, employ_id]を指定.
company.company_employes.find([1,35]) 
# SELECT * FROM CompanyEmploy WHERE CompanyEmploy.company_id = 1 AND CompanyEmploy.company_id AND CompanyEmploy.employ_id

company.company_employes.find(1) # NG
```

```rb
# 複合キーをwhereする例

company = Company.find(1)

# foregin_keyに指定しているcompany_idは、自動的にwhere句に含まれる.
company.company_employes.where("employ_id = ?", 35) 
# SELECT * FROM CompanyEmploy WHERE CompanyEmploy.company_id = 1 AND CompanyEmploy.employ_id
```
apkにテストのファイルを含めない


apkは普通のzipアーカイブなので誰でも解凍することができます。
本来含まれるはずのないテストに使っているデータが含まれてしまい、とてもよくないのでなんとかしたくなります。

```shell-session
% zipinfo build/apk/app-debug-unaligned.apk | grep androidTest
-rw----     2.0 fat      169 bl defN 20-May-14 19:07 androidTest/resources/fixtures/foo.json
-rw----     2.0 fat      100 bl defN 20-May-14 19:07 androidTest/resources/fixtures/bar.json
-rw----     2.0 fat      655 bl defN 20-May-14 19:07 androidTest/resources/fixtures/baz.json
-rw----     2.0 fat      144 bl defN 20-May-14 19:07 androidTest/resources/fixtures/foobar.json
```


Eclipse(Ant)の時とAndroid Studio(Gradle)のプロジェクトでは、ディレクトリ構成が大きく変わりました。このプロジェクトではRobolectricを使っていて、gradle-android-test-plugin 0.10.0ではテストコードのディレクトリをsrc/androidTestかsrc/testにしなければ動かないという仕様があります。
そのため、Ant時代から引き継いだsrcディレクトリの下にアプリのコードとテストのコードを入れなければならないという制約があります。

Gradleで

```groovy:build.gradle
aaptOptions {
	ignoreAssetsPattern '<dir>foo'
}
```

と書くとディレクトリ``foo``が除外されるはずなのですが、これを書いている時点で最新のGradle Android plugin 0.10.2では除外されませんでした…

```shell-session
% /Users/itochan/local/android-sdks/build-tools/19.0.3/aapt 
(中略)
   --ignore-assets
       Assets to be ignored. Default pattern is:
       !.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~
```

ここではデフォルトで \<dir\>_* が除外されるということに着目し、ディレクトリ名をアンダースコアで始めるようにします。

```shell-session
% tree src
src
├── androidTest
│   ├── java
│   │   └── jp
│   │       └── itochan
│   │           └── android
│   │               └── test
│   │                   └── foo
│   │                       └── FooTest.java
│   └── resources
│       └── _fixtures
│           ├── foo.json
│           ├── bar.json
│           ├── baz.json
│           └── foobar.json
├── jp
...
% ./gradlew assembleDebug
% zipinfo build/apk/app-debug-unaligned.apk | grep androidTest
```

これでapkに含まれることはなくなりました。
oprofileメモ


oprofileについてのメモ（随時加筆予定）

# Ubuntu での実行

参考: http://smackerelofopinion.blogspot.jp/2013/05/getting-started-with-oprofile-on-ubuntu.html

## インストール

```bash:
$ sudo apt-get install oprofile
```

### vmlinuxのインストール

oprofileを実行するにはvmlinuxを指定する必要があるが、Ubuntuには標準で用意されていないため、別途インストールする必要がある。

```bash:
$ echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ddebs.list  
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01  
$ sudo apt-get update  
$ sudo apt-get install linux-image-$(uname -r)-dbgsym  
```

容量が大きいのでインストールに時間がかかる。（自分の環境では2時間ほど）

## 前準備

oprofileにvmlinuxのありかを教える。

```bash
$ sudo opcontrol --vmlinux=/usr/lib/debug/boot/vmlinux-$(uname -r)
```

設定は`/root/.oprofile/daemonrc`に書き込まれるため次回からは指定不要。

デーモン`oprofiled`を起動する。

```bash:
$ sudo opcontrol --init
$ sudo opcontrol --start
```

start時に以下のエラーが出ることがある。

```bash:
$ sudo opcontrol --start
Cannot find event CPU_CLK_UNHALTED
Using default event: CPU_CLK_UNHALTED:100000:0:1:1
Cannot find event CPU_CLK_UNHALTED
```

上記のように出て`oprofiled`が起動できない時は以下を行う。

```bash:
$ sudo opcontrol --deinit 
$ sudo modprobe -r oprofile
$ sudo modprobe oprofile timer=1
```

## プロファイル実行

例えばQt5のexampleにあるopenglwindowをプロファイルしてみる

```bash:
$ sudo opcontrol --start
$ /usr/local/examples/gui/openglwindow
$ sudo opcontrol --dump
```

再度プロファイルするときはstartの代わりにresetをすれば良い。

```bash:
$ sudo opcontrol --reset
```

## プロファイル結果参照

プロファイル結果の参照には`opreport`を使用。

`opreport`にはいろいろなオプションがある。
例えばコールグラフを見る場合は以下のとおり。

```bash:
$ opreport -c
```

## 終了

`oprofiled`の終了はshutdownでおこなう。

```bash:
$ sudo opcontrol --shutdown
```
【iOS版】cocos2d-xのbuildを早くする手順


Rakefileを作る前にやっておくこと
----------------
0.cocos2d_libs.xcodeprojを開きBuildSettingの
<u>Architectures : 32bit-Intel
Build Active Architecture Only : NO</u>
と設定しておく。



Rakefileを使ってStaticLibraryを吐き出す
------
1.Rakefileを作成
[こちら](http://qiita.com/g-1/items/01f6c430326dfd125af9)(g-1さんの記事に飛びます)よりRakefileという名前でファイルを作成。PROJECT_PATHはこのRakefileを置く場所によって適宜変えてください。
※Rakefileは、cocos2d-xのcocosコマンドで作られたプロジェクト内のコピーされたcocos2dxライブラリプロジェクトフォルダのファイルの中においてください。

2.Rakefileが置かれているディレクトリまでターミナルで移動し、[rake lib]と実行。
※結構時間かかります

3.同ディレクトリに/tmp/iphoneosと/tmp/iphonesimulatorが作成され、そこにコンパイルされた.aのライブラリが作成されます。

4.生成されたバイナリを、[rake lipo]することで統合。

<font color="red"><h1>ライブラリが作成されれば、これを使い回すことでiOSのビルド（クリーンビルド)で膨大な時間を使うこともありません。</h1></font>

<h3>※作られるライブラリの大きさが膨大ですが、気にする必要はありません</h3>

cocos2d_libs.xcodeprojをプロジェクトから参照を外して、作成された.aをLinked Binaryに追加して使えばおっけーです。

<追記 : 5/22 iOS6系で動かないよーって場合は>
Rakeの実行を行う前にcocos2d_libs.xcodeprojのほうで、DeploymentTargetをすべて6.0としておけば対応可能です。

☆thx.g-1
Rails4に移行した時concerned_withで、はまったこと


以下のようにconcerned_withパターンを使用していていると

```ruby:model/hoge
class Foo < ActiveRecord::Base
	concerned_with :bar

	has_many :bars
end
```

Rails4.1で動かそうとすると、以下のエラーになるので、

```
RuntimeError: Circular dependency detected while autoloading constant Foo::Bar
```

user/bar.rb を user/bar_status.rbに改名し、以下のようにソースを修正したところ、エラーは解消した。

```ruby:model/hoge
class Foo < ActiveRecord::Base
	concerned_with :bar_status

	has_many :bars
end
```
【cocos2d-x】毎フレーム特定の関数を呼び出す


時間をカウントアップさせたい時など、
毎フレーム特定の関数を呼び出したい時はスケジュールを設定する。

##流れ

1,スケジュールをセット
2,スケジュールを解除


##スケジュールをセット
CCLayerのinit()などでスケジュールをセット
※ヘッダーで関数は定義しておいて下さい。今回はvoid型のeveryFrameMethodとします。

```
bool クラス名::init()
{
    if (!CCLayer::init()) {
        return false;
    }
    
    //フレーム毎にmesureGameTime関数を呼び出す
    this -> schedule(schedule_selector(クラス名::everyFrameMethod));
    
    return true;
}

void クラス名::everyFrameMethod
{
	//毎フレーム行ないたい処理
}


```

##スケジュールを解除

```
//スケジュールを解除したい場所で以下のコードを記入
this -> unschedule(schedule_selector(クラス名::everyFrameMethod));

```
CocoaPods でビルド設定を追加する

たとえば OSS によっては、デフォルトでログをはくようになっていて、それを止めたければ

```
#define XX_ENABLE_XXX_LOGGING 0
```

みたいな定義を pch ファイルに追加するとか、ビルド設定の [Preprocessor Macros] に同様の定義を追加するとかしてね、という仕様になっているケースがあります。


ところがこれを CocoaPods 経由でやろうとすると、pch ファイルも、ビルド設定が含まれている .xcodeproj パッケージも、

```
pod install
```

で Pods フォルダに自動生成されるものなので、あらかじめそれらを編集しておくということができません。


となると **pod install 後にビルド設定を追記する** 必要があるわけですが、CocoaPods にちゃんとそういうしくみが用意されています。


[post_install | CocoaPods Guides - Podfile Syntax Reference](http://guides.cocoapods.org/syntax/podfile.html#post_install)


たとえば上記の例で言うと、次のように Podfile に追記します。

```
post_install do |installer|

  POD_TARGET_NAME = "Pods-XXxxxx"

  # Search the build target
  classy_pods_target = installer.project.targets.find{ |target| target.name == POD_TARGET_NAME }
  unless classy_pods_target
    raise ::Pod::Informative, "Failed to find '" << POD_TARGET_NAME << "' target"
  end

  # Add the build setting
  classy_pods_target.build_configurations.each do |config|
    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'XX_ENABLE_XXX_LOGGING = 0'
  end

end
```

参考記事：

- [CocoaPodsで自動生成されたターゲットにPreprocessor Macroを定義する方法](http://odoruinu.net/blog/2014/01/01/how-to-define-preprocessor-macro-in-podfile-for-cocoapods/)
私家版MVCべからず集

しばらく個人で開発してるが、将来的に誰かと共同開発したり、未来の自分と意識合わせするため、今のところのポリシーを書き残しておく。（当然ながら、後で書き足す）

あまり有名なフレームワークを使ったことないんだが、一般的な認識とズレてるかなぁ。

# Model

* DBにアクセスしていいのはModelだけ。
* 他のデータとの整合性など最終確認はModelで。
* テストファーストで書く
* ここでprintとか絶対NG
* ここでWebサーバ由来の情報（SESSIONなど）があったら、何か間違ってる

# View

* ここでDBにアクセスしてたら何か間違ってる
* ここでIF文とかあったら、Controller側ですべきか検討する

# Controller

* ここでDBにアクセスしてたら何か間違ってる
* ここでバリデーションとかしてたら、何か間違ってる
PythonのbottleでBASIC認証

bottle.auth_basicをデコレータとして使うとBASIC認証をかけられる。
v0.12以上が必要。

```python:hello.py
# -*- coding: utf-8 -*-
import bottle


# BASIC認証のユーザ名とパスワード
USERNAME = "user"
PASSWORD = "pass"


def check(username, password):
    u"""
    BASIC認証のユーザ名とパスワードをチェック
    @bottle.auth_basic(check)で適用
    """
    return username == USERNAME and password == PASSWORD


@bottle.route("/hello")
@bottle.auth_basic(check)
def hello():
    return "hello"
    

if __name__ == '__main__':
    bottle.run(host='localhost', port=8080, debug=True)
```

実行

```shell-session
$ python hello.py
```
GruntでJade使う場合にbodyclassをつける方法


そもそもbodyclassがどうなのって話はおいといて、何だかんだで便利よね、bodyclass。

でもjadeって「このdiv以下をごにょごにょする」のはblock使えば楽なんだけどbodyみたいなかなり上の方をごにょごにょするのは面倒だなぁな印象があって今までそういうのはできないもんだと思うようにしてた。してたんだけどやっぱりできた、jadeすげー。


## 変数用のblockを定義
各ページで使用する変数だけを記述するためのblockを用意して、使いたいページのjadeファイルにだけblockを記述すれば良い。超簡単じゃん。

````jade
## _layout.jade

//- 各ページ毎に設定する変数ブロック
block vars
  -var bodyclass = "default";

doctype html
html
  head
    meta(charset='UTF-8')
〜
  body(class="#{bodyblass}")

## index.jade

block vars
  -var bodyclass = "top";
````


これでカンペキ。Jadeはblockを上手く使うのがポイントだなーと思いました、まる。
Surface Pro 3がでかくて軽いぞってんでMacBook Airとかと比べてみた

製品|重量(g)|画面(in)|解像度(px)
----|------:|---------------:|---------:
Xperia Z2 Tablet| 426|10.1|1,920 × 1,200
iPad Air (Wi-Fi)|469|9.7|2,048 x 1,536
Nexus 10|603|10.1|2,560 x 1,600
iPad (Wi-Fi)|652|9.7|2,048 x 1,536
**Surface Pro 3** (※)|798|12.0|2,160 x 1,440
Surface Pro 2 (※)|908|10.6|1,920 x 1,080
MacBook Air|1,080|11.6|1,366 x 768
MacBook Air|1,350|13.3|1,440 x 900
MacBook Pro|1,570|13.3|2,560 x 1,600

※Touch Cover 2 (190g)等なし

* [仕様 | Xperia（TM） Z2 Tablet | Xperia(TM) Tablet | ソニー](http://www.sony.jp/tablet/products/Z2/specification.html)
* [Apple - iPad - iPadのモデルを比較する。](https://www.apple.com/jp/ipad/compare/)
* [Apple - MacBook Air - 技術仕様](https://www.apple.com/jp/macbook-air/specs.html)
* [Apple - ノートパソコン - MacBook Pro Retinaディスプレイモデル - 技術仕様](https://www.apple.com/jp/macbook-pro/specs-retina/)
* [Microsoft Surface Pro 2 仕様 | Surface Pro 2 スペック](http://www.microsoft.com/surface/ja-jp/support/surface-pro-2-specs)
* [タッチ カバー 2 - Microsoft Store Japan オンライン ストア](http://www.microsoftstore.com/store/msjp/ja_JP/pdp/%E3%82%BF%E3%83%83%E3%83%81-%E3%82%AB%E3%83%90%E3%83%BC-2/productID.289216300)
* [ / マイクロソフト Surface Pro 3 と現行Surface Pro 2比較、変更点まとめ - Engadget Japanese](http://japanese.engadget.com/2014/05/20/surface-pro-3-surface-pro-2/)
【cocos2d-x】どのCCSpriteがタッチされたか判断する


##流れ
1,CCSpriteにTagをセット
2,ccTouchEnded関数にてタッチイベントを適切に処理する

##CCSpriteにTagをセット

```
int hoge = HOGE_NUMBER;

CCSprite* pCard = CCSprite::create("画像名");
pCard -> setTag(hoge);
```

##ccTouchEnded関数にてタッチイベントを適切に処理する
①ccTouchBegan、ccTouchEnded関数ともにヘッダーで定義
②ccTouchEndedに処理を追加


```
bool クラス名::ccTouchBegan(CCTouch* pTouch, CCEvent *pEvent)
{
    return true;
}
```
```

void クラス名::ccTouchEnded(CCTouch* pTouch, CCEvent *pEvent)
{
	int hogeTagNumber = HOGE_TAG_NUMBER
	
    //タッチポイントを取得（convertToGLにてOpenGLの座標に変換）
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCPoint touchPoint = pDirector -> convertToGL(pTouch -> getLocationInView());
    
    //タグのインスタンスを取得
    CCNode* pHoge = this -> getChildByTag(hogeTagNumber);
    
    if (!pHoge) {
	//pHogeインスタンスが取得できなかった場合は処理を抜ける
        return;
    }
    
	//pHogeのサイズを取得する
    CCRect hogeRect = pHoge -> boundingBox();
    
    if (hogeRect.containsPoint(touchPoint)) {
    	//タッチポイントがhogeRectの範囲内    
       //以下にそれぞれの処理を追加する
        
    }
}

```
カテゴリでダックタイピング

## 概要
プロトコルを定義し、それをカテゴリとして実装することで既存のクラスをダックタイピング的にプロトコルに対応させることができます。

あくまでもダックタイピングなので、conformsToProtocolで確認すると結果はNOになります。

## サンプル
NSObjectを、BTKDuckというプロトコルで扱えるようにしてみました。

カテゴリのインタフェイス自体を実装ファイルに書いているので、カテゴリを使うためには明示的なプロトコル表記が必要になります。さっき思いついたテクニックなんですが、メソッドの名前空間を汚染しないですむので便利かも。

```objc:NSObject+BTKDuckTypingSample.h
#import <Foundation/Foundation.h>

@protocol BTKDuck <NSObject>

- (void) btk_walk;

@end

```

```objc:NSObject+BTKDuckTypingSample.m
#import "NSObject+BTKDuckTypingSample.h"

@interface NSObject (BTKDuckTypingSample)

- (void) btk_walk;

@end

@implementation NSObject (BTKDuckTypingSample)

- (void) btk_walk
{
    NSLog(@"%@ is walking",NSStringFromClass(self.class));
}

@end
```

## 実行結果
```objc 
    for(id<BTKDuck> duck in @[[NSObject new],[NSArray new],[UIView new]]){
        [duck btk_walk];
    }
```

```text
NSObject is walking
__NSArrayI is walking
UIView is walking
```
Rubyでnullや数値だけからなるjsonをパースする方法


Rubyで標準ライブラリを用いてjsonをパースする際、`null`や`数値`だけをパースすると例外が投げられます

```zsh
pry(main)> require 'json'
=> true

pry(main)> JSON.parse('null')
JSON::ParserError: 757: unexpected token at 'null'
from ~/.rbenv/versions/2.1.1/lib/ruby/2.1.0/json/common.rb:155:in `parse`

pry(main)> JSON.parse('33')
JSON::ParserError: 757: unexpected token at '33'
from ~/.rbenv/versions/2.1.1/lib/ruby/2.1.0/json/common.rb:155:in `parse`
```

もはやjsonじゃ無い気もするので自然な挙動ではありますが、`quirks_mode`というオプションを`true`に設定してやると良い感じに変換してくれる様です。

```zsh
pry(main)> JSON.parse('null', quirks_mode: true)
=> nil

pry(main)> JSON.parse('33', quirks_mode: true)
=> 33
```

参考
https://github.com/flori/json/issues/131
http://stackoverflow.com/questions/3552328/nil-to-json-cannot-be-parsed-back-to-nil
Ubuntu 14.04 のGrubでEnterを押さないとOSが起動しない問題対応

```diff:/etc/default/grub
  GRUB_DEFAULT=0
- GRUB_HIDDEN_TIMEOUT=0
+ GRUB_HIDDEN_TIMEOUT=1
  GRUB_HIDDEN_TIMEOUT_QUIET=true
- GRUB_TIMEOUT=3
+ GRUB_TIMEOUT=10
  GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
  GRUB_CMDLINE_LINUX=""
```

なぜかEnterを押さないと先に進まなかったので以下実施

```bash:grubの設定を更新
$ sudo update-grub2
```
Mojoliciousのプラグインを作る



# 動作確認できる環境を作る


とりあえず動作を確認できる環境を作る。
アプリディレクトリにPluginディレクトリを追加。

```shell
$ mkdir -p lib/Mojolicious/Plugin
```

libにパスが通っていれば、
app->pluginで普通に読み込まれるようになる。


# プラグインのプログラムを書く

プラグインのプログラムは、以下の形式に従うようにする。

- モジュールの名前を"Mojolicious::Plugin::*"にする
- Mojolicious::Pluginを継承する
- registerメソッドを定義する

以下の様なプログラムになる。

```perl:lib/Mojolicious/Plugin/Example.pm
package Mojolicious::Plugin::Example;
use Mojo::Base 'Mojolicious::Plugin';

sub register {
    my ($self, $app, $conf) = @_;

}

1;
```

registerメソッドに処理を書いていく。
helper機能でControllerに新しいメソッドを追加したり、
フック機能で入力や出力のフィルタ処理を追加したりする感じになる。


# 例: Controllerに新しいメソッドを追加する

helper機能を使うと、Controllerに新しいメソッドを追加することができる。
例えば、PHPのnl2brのようなメソッドを追加するプラグインは以下のようになる。

```lib/Mojolicious/Plugin/Nl2br.pm
package Mojolicious::Plugin::Nl2br;
use Mojo::Base 'Mojolicious::Plugin';

sub register {
    my ($self, $app, $conf) = @_;

    $app->helper('nl2br' => sub {
        my ($c, $text) = @_;
        $text =~ s/(\r\n|\n\r|\n|\r)/<br\/>$1/g;
        return $text;
    });
}

1;
```


これを読み込むと、Controllerにnl2brメソッドが生える。
テンプレート内では、appでControllerにアクセスできるようになっているので、
app->nl2br($txt)という感じで使用することができるようになる。

```myapp.pl
use Mojolicious::Lite;
use lib 'lib';

plugin 'Nl2br';

get '/' => sub {
    my $self = shift;

    $self->stash->{txt} = "テスト1\nテスト2\nテスト3\n";
    # ここでも使える $self->nl2br("テスト1\nテスト2\nテスト3\n");

    $self->render();
} => 'index';

app->start;
__DATA__

@@ index.html.ep
<html>
<head><title>テスト</title></head>
<body>
<%== app->nl2br($txt) %>
</body>
</html>
```


# その他

## プラグインを読み込む名前空間を追加

自社やアプリ特有のプラグインを作る場合は、
名前空間を"Mojolicious::Plugin"以外にしたいことがあるかもしれない。

以下の設定で、プラグインを読み込む名前空間を追加することができる。

```perl:myapp.pl
push @{app->plugins->namespaces}, 'MyApp::Plugin';
```

## お手本プラグイン

標準で入っているプラグインのプログラムを読めば、
どのような機能が作れるか、どのように実装するのかが分かる。
https://metacpan.org/pod/Mojolicious::Plugins#PLUGINS

CPANでMojolicious::Pluginを検索すれば、
他の人が作ったプラグインも見れる。
https://metacpan.org/search?q=Mojolicious%3A%3APlugin

## モジュールの形で開発する

Minilaを用いて開発する。
http://blog.64p.org/entry/2013/05/14/080423
poderosa使うとき、これだけはやっておくこと

Windows機からコンソール接続するときにお世話になっておりますpoderosa。

PC入れ替えに伴い、再インストールしたので設定の備忘録として記載します。
といっても、設定したのは2点だけ。

### 1.選択範囲を自動的にコピー
マウスで選択した範囲を自動的にクリップボードにコピーします。
毎回、右クリックでメニューを開いたり、Alt+Cするとかってかなりストレスなんですよね…

~~~
ツール ＞ 操作 ＞ マウス ＞ マウスで選択したら自動的にコピー
~~~


### 2.ターミナルの色設定
やっぱり黒背景だよね。

~~~
ツール ＞ オプション ＞ 表示
~~~

背景色を黒に、文字色を白に。
色指定エスケープシーケンスも青とか見にくすぎるので適当に変更。

これだけ！
[Android] 背景に画像を繰り返し表示する


# 0.手順

1.繰り返し表示する元画像を配置する
2.繰り返し画像をコードで生成する
3.生成した画像を背景に指定する

# 1.繰り返し表示する元画像を配置する

繰り返し表示したい画像を`res/drawable`や`res/drawable-xxx`に配置する。
今回の例では、アイコンファイルである`ic_launcher.png`を用いる。


# 2.繰り返し画像をコードで生成する

繰り返し画像は、XMLファイルから生成することが出来る。
`res/drawable`配下に`pattern.xml`を作成し、以下のコードを記述する。
(作成するファイル名は任意である)

```xml:res/drawable/pattern.xml
<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_launcher"
    android:tileMode="repeat" />
```


要点は以下の通りである。

* ルートタグは`<bitmap>`である
* `<bitmap>`タグの属性の`android:src`に元画像を指定する
* `<bitmap>`タグの属性の`android:tileMode`に`repeat`を指定する


# 3.生成した画像を背景に指定する

レイアウトXMLの背景に生成した繰り返し画像を指定する。
背景の指定は`android:background`属性で行う。


```xml:res/layout/activity_main.xml
<LinearLayout
	...
    android:background="@drawable/pattern"
	...
	>

	...

</LinearLayout>
```
The bundle is invalid. New apps and updates submitted to the App Store must be built with public ってXCodeでアプリ申請のとき出た件


##問題
XCodeからアプリのアップデートのための申請を

archive > validate

から実行しようとしたところ、

```
The bundle is invalid. New apps and updates submitted to the App Store must be built with public
```

というエラーがでる。


##解決方法

XCodeを最新版にするだけ！

最新版でビルドされてないとダメらしい。
AppStoreからXCodeをアップデートすればOK。
Unity メモ


随時追加する


NGUIの描画順について

* [ゲームは初心者にやさしく: NGUI 描画順について](http://gamesonytablet.blogspot.jp/2012/10/ngui.html)

シーンの分割やシーンロードの高速化・NGUIでの描画順に関する注意などのノウハウいっぱいなので、何度も見直したい。

* [「もののけ大戦“陣”」製作事例](http://www.slideshare.net/RyoheiTokimura/ss-14048278)

シーン分割して複数人で開発する場合に便利なエディタ拡張について

* [Unityプロジェクトを複数人で共同開発する方法の一案 - Radium Software](http://radiumsoftware.tumblr.com/post/6412707889)
* [keijiro/unity-splitscene](https://github.com/keijiro/unity-splitscene)


Unityのパーティクルシステムについての丁寧な解説

* [その１ Unityのパーティクル「Shuriken」](http://marupeke296.com/UNI_PT_No1_Shuriken.html)