OmniAICreator/Qiita-1.07M huggingface dataset:
window.onerrorでエラー内容が取れない時の対応 

## window.onerrorについて

```js
window.onerror = function (msg, file, line, column, err) {
	/*
	msg: error message
	file: file path
	line: row number
	column: column number
	err: error object
	*/ 
	alert(msg + file + ':' + line);
};
```

window.onerrorに関数を設定しておくと、処理中catchされてないエラー、つまりUncaughtErrorの情報をここで取得することが出来ます。


## "Script error. line: 0"


```js
window.onerror = function (msg, file, line, column, err) {
	console.error(msg + file + ':' + line);
};

throw new Error('test');
```

この時、msgには"Uncaught Error test"が渡ることが期待されますが、何故か"Script error."が常に渡ってくる場合があります。コンソールのログには出力されますが、エラーログを送信するなどの処理を書いている場合、原因を特定できないため非常に困ります。

## 原因と対策
これはブラウザのSame-Origin Policyによるもので、別ドメインのjsファイルをロードした時に起こります。
解決するためにはCORSを適切に設定する必要があります


- Access-Control-Allow-Originをヘッダに設定

    サーバー側の設定でヘッダーに

    ```txt
    Access-Control-Allow-Origin: [許可するURI]
    ```

    を追加します。全てのアクセス元に対して許可する場合は`*`を指定します。

- crossorigin属性を設定

    クライアント側でscriptタグに以下のように`crossorigin`属性を追加します。

    ```html
    <script type="text/javascript" src="hoge.js" crossorigin="anonymous"></script>
    ```

## requirejsの対応
require.jsを利用してロードする場合、前述したような対応はとれません。
`require.load`をoverrideする方法もありますが、あまり選びたくない方法です。
そこで調べていると既にissueがあがっていました。

https://github.com/jrburke/requirejs/issues/687

`require.createNode`をoverrideして属性を追加できるようにしてくれたようです。

```js:元のコード
require.createNode = function (config, moduleName, url) {
	var node = config.xhtml ?
	document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
	document.createElement('script');

	node.type = config.scriptType || 'text/javascript';
	node.charset = 'utf-8';
	node.async = true;
	return node;
};
```

```js:crossorigin属性を追加
require.createNode = function (config, moduleName, url) {
	var node = config.xhtml ?
	document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
	document.createElement('script');

	node.type = config.scriptType || 'text/javascript';
	node.charset = 'utf-8';
	node.async = true;
	node.setAttribute('crossorigin', 'anonymous');
	return node;
};
```

これでrequirejsでロードする場合にも対応出来ました。
Vagrantfile内でdotenv経由で値を読み込めるようにする


複数のプロジェクトに関わっていると開発環境をローカルにいれておくとなんだかごちゃごちゃしてくるのでvagrantを使うようにしています。

RailsやDBなどがはいっている環境をリポジトリにいれておいて、そのリポジトリをcloneして、プロジェクトに関するファイルを.envで記述するようにしてきます。

例えば、Railsのプロジェクトであれば下記を使います。

https://github.com/hirotaka/rails4_box

GitHubからcloneしてきます。

```
$ git clone git@github.com:hirotaka/rails4_box.git project_name_box
```

.envにソースがあるディレクトリなどプロジェクト固有の内容を記述します。

```
$ berks vendor
$ vagrant up
```

この手順でできるように、Vagrantfileでdotenvを使えるようにしたっかたのですが、若干はまったので手順をまとめておきたいと思います。

まず、gemでdotenvをいれるのですが、vagrantの場合は組込のrubyを使うので`gem install`ではなく、`vagrant plugin install`をしていれる必要があります。

```bash
$ vagrant plugin install dotenv
Installing the 'dotenv' plugin. This can take a few minutes...
Waiting for cleanup before exiting...Waiting for cleanup before exiting...

Waiting for cleanup before exiting...Waiting for cleanup before exiting...Waiting for cleanup before exiting...


Waiting for cleanup before exiting...
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

An error occurred while installing nokogiri (1.6.4.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.4.1'` succeeds before bundling.
```

nokogiriでエラーが出てしまいました。

依存しているライブラリ類をいれます。


```bash
$ brew install libxml2 libxslt libiconv
$ brew link --force libxml2
$ brew link --force libxslt
```

環境変数を設定した上で、`vagrant plugin install`します。

```
$ export NOKOGIRI_USE_SYSTEM_LIBRARIES=true
$ vagrant plugin install nokogiri
$ vagrant plugin install dotenv
```
レシート情報取得時に UnauthorizedAccessException 


FileStream で直接開こうとするとタイトルの例外が発生するので、WWWクラスを使ってレシートデータを取得する。

```sample.cs
	IEnumerator GetReceiptDataFromUrl(string url, Action<byte[]> callback) {
		using(WWW www = new WWW(url)) {
			yield return null;
			while (!www.isDone) {
				yield return null;
			}
			
			byte[] data = www.bytes;
			Debug.Log ("receiptData : " + data.ToHexString());
			
			callback(data);
		}
	}
	

```

ちなみに、String.ToHexString() は以下のような拡張メソッド

```
public static class Extensions {
	public string ToHexString(this byte[] binary) {
		return BitConverter.ToString(binary).ToLower().Replace("-","");
	}
}
```
クリップボードにあるmarkdownな文章をRedmineのtextile方式に変換してクリップボードに保存する便利コマンド貼っておきますね


```
pbpaste | pandoc --to=textile | pbcopy
```

Kobito.app を使って自分の手元で markdown な文章を書いた後に、コピーしてクリップボードに文章を格納。
その後に、pandoc を通して textile 形式に変換。
その結果をクリップボードに格納。

あとは、redmine なり好きなところにペースト。

* [pandoc](http://sky-y.github.io/site-pandoc-jp/users-guide/) とは。
Titaniumアプリのリリースで引っかかったメモ（iOS）


TitaniumのアプリをAppleに申請に出そうとしたのですが、いろいろ変にひっかかったのでメモしときました。

環境は下記です。
TitaniumStudio: 3.4.1
Xcode: 6.1
OS X : 10.10.1(Yosemite)


# XcodeのOrganizerが開かない

まずArchiveを作成するところです。
Titanium Studioにてプロジェクトを選択してクリック
 -> Publish
 -> Distribute - Apple iTunes Store
 -> いろいろ設定してPublish

ってやっていくとArchiveが作成されてXcodeのOrganizerが開くはずなんですが
下記の画面が出てきました。

![スクリーンショット 2014-11-27 18.56.50.png](https://qiita-image-store.s3.amazonaws.com/0/8868/0e8bbeaa-fa64-4f0d-f432-1e001481cfe7.png "スクリーンショット 2014-11-27 18.56.50.png")

```
UI element scripting is not enabled. Check "Enable access for assistive devices"
```

って言われてるので「enable」したいんですが、どこにも「enable」にする場所がない・・・
調べてみると「System Preferences -> Security & Privacy -> Privacy -> Accessibility」ってとこにありました。
どうもMarveriksから場所が変わったっぽいですね。

ここの「下のアプリケーションにコンピュータの制御を許可。」にてTitaniumStudioにチェックを入ればOKでした。

![スクリーンショット_2014-11-27_18_59_52.png](https://qiita-image-store.s3.amazonaws.com/0/8868/41392a15-67a4-5189-3d38-ba18332132e6.png "スクリーンショット_2014-11-27_18_59_52.png")

# Rsync failed

上記が完了するとXcodeのOrganizer -> Archivesにモジュールができているはずなのでこれを「Submit」します。

すると下記の画面が、、、

![スクリーンショット 2014-11-27 18.45.12.png](https://qiita-image-store.s3.amazonaws.com/0/8868/c2ed6eae-b413-41e5-7ea4-181d762dbd46.png "スクリーンショット 2014-11-27 18.45.12.png")

これはよくわからんのですが「include app symbols for your application to receives symbolicated crash logs from Apple.」のチェックボックスを外してSubmitすればいけました。

![スクリーンショット_2014-11-27_19_37_43.png](https://qiita-image-store.s3.amazonaws.com/0/8868/87f16a63-ec12-13e5-e32d-4229e23efb10.png "スクリーンショット_2014-11-27_19_37_43.png")

# WARNING ITMS-9000: "Missing 64-bit support. xxx..."

最後に下記のようなWarningが出てきました。

![スクリーンショット 2014-11-27 18.49.52.png](https://qiita-image-store.s3.amazonaws.com/0/8868/e1a54919-bea2-04c5-8381-cf599a65687e.png "スクリーンショット 2014-11-27 18.49.52.png")


これは読んでそのまま「2015/2/1からApp Storeにアップロードするアプリは64-bitサポート＆iOS8 SDKでビルドされてなきゃダメだよ」というものなので今はそのままスルーで「Done」すればOK。

※昨日（2014/11/26）、TitaniumStudioの3.5.0 Alpha buildで「64-bit support is available」って出てたんで近々こちらでビルドしなければですね。

http://www.appcelerator.com/blog/2014/11/64-bit-support-for-ios-apps/

以上、めでたく申請に出せました！
【Ansible】Playbook実行の際に実行カレントパスを取得する方法

ansibleを実行している時に実行しているansibleディレクトリのカレントディレクトリを知りたい時ってあると思う。
[公式Docment](http://docs.ansible.com/playbooks_variables.html#information-discovered-from-systems-facts)にちっちゃく書かれていたのでメモ


## 環境

* macosx10.8(ホストOS)

## 参考にしたサイト

* [Ansible Docs Information discovered from systems: Facts](http://docs.ansible.com/playbooks_variables.html#information-discovered-from-systems-facts)
* [Ansible マジック変数の一覧と内容](http://qiita.com/h2suzuki/items/15609e0de4a2402803e9)


## 確認する方法

ansible_envを使用する


```yaml:/path/to/ansibleDir/roles/task/main.yml
- debug: var={{ansible_env.PWD}}
```

## 実行結果

```bash:/path/to/ansibleDir
ansible-playbook -i ansible/inventories/osx -c local ansible/site.yml
# TASK: [homebrew/cask/virtualbox | debug var={{ansible_env.PWD}}] #**************
#ok: [127.0.0.1] => {
#    "/path/to/ansibleDir/#ansible": "{{ /path/to/ansibleDir/ansible }}"
#}
```

メモメモ
GithubにSSH公開鍵を設定する

#生成方法

ターミナルを開き、以下のコマンドを打ちます。

```
ssh-keygen
```

#確認方法

次に、以下のコマンドを打ちます。

```
cat ~/.ssh/id_rsa.pub
```
以下のコマンドを打つと、Macのクリップボードに公開鍵をコピーしてくれるので便利です。

```
cat ~/.ssh/id_rsa.pub | pbcopy
```

#設定方法

- [Github](https://github.com)にアクセスして、右上にあるSettings（歯車のマーク）をクリックします
- 一覧の中にある SSH keys と書かれているところをクリックします
- Add SHH key をクリックします
- 適当な名前（端末名とか）をつけて、先ほどコピーした公開鍵を貼り付ければ完了です
docker で warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8) などといわれたら

docker に centos いれて起動したら

```
-bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
```

とか言われた場合

root にて、

```
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
```

とかするとよい。

>
どうも、 centos 6.6 からの現象のようです。
CSSだけで正方形を作る

# やりたいこと
- 固定値を使わない
- JavaScriptを使わない
- ウィンドウサイズやレイアウトが変わっても正方形を自動で維持する

# ブレイクスルー
- `padding-bottom`はy方向に影響するプロパティだが、そこで`%`指定するとx方向を基準にした描画が行われる

# Example
この赤い正方形をCSSだけで作る。

![Screen Shot 2014-11-27 at 19.33.33.png](https://qiita-image-store.s3.amazonaws.com/0/50510/234c8313-22e7-41a1-b231-7c2f49b153ab.png)

---

_index.jade_

```jade
doctype html
html
  head
    link(href="styles/main.css" rel="stylesheet")
  body
    .square-wrapper
      .spacer
      .content
```

_main.stylus_

```stylus
.square-wrapper
  position relative
  width 10%
  
.spacer
  width 100%
  padding-bottom 100%

.content
  position absolute
  top 0
  right 0
  bottom 0
  left 0
  background red
```

この場合、`.spacer`は`.square-wrapper`の幅と同じ高さが確保される。
そうすると`.square-wrapper`の高さも拡張されるため、結果として`.content`も正方形になる。

# 参考URL
[How can I create a perfectly square DIV where height is equal to viewport?](http://stackoverflow.com/a/18021146)
Sinatraでponyを使ってメールを送る

gmailから送信する場合は、[GitHub](https://github.com/benprew/pony)に書いてるとおりですが、それ以外の場合、:enable_starttls_auto、:openssl_verify_modeを追加しないとダメでした。

```lang:filename
    Pony.mail(
            :from => 'me@example.com',
            :to => 'you@example.com',
            :bcc => ['him@example.com', 'her@example.com'],
            :subject => "Hi!",
            :html_body => "Hello, world!",
            :via => :smtp,
            :via_options => { 
              :address             => '*****', 
              :port                 => '587', 
              :user_name            => 'user', 
              :password             => 'password', 
              :authentication       => :plain,
              :enable_starttls_auto => false,
              :openssl_verify_mode  => OpenSSL::SSL::VERIFY_NONE
            })
```
Cocos2d-x(js)における非同期処理の実装について

フライングで公開してしまったのですが、無事Advent Calendarのトップバッター役割を果たせてホッとしています。
今年はcocos2d-xにとっても激動の年でしたね。
2系でのお仕事も一段落ついたので、来年は3系で攻めたいと思います。

# はじめに
今回の記事の内容は基本的に2系での内容です。
3系では調査していないので、事情が多少違うかもしれませんが、参考になればと思います。

# 概要
cocos2d-x(js)において、WebView等を利用するために別アクティビティに遷移し、イベント内容をCocos側（C++,JavaScriptなど）で処理したいケースは多いと思います。
以前、Android GUIの処理に関しては次のような簡単なメモを記事【[cocos2d-xのtouchイベント内でtoastを表示したいとき](http://qiita.com/g-1/items/0323cd56a53029f1fa65)】にしたのですが、イベントリスナーを持つGUIの場合、そのイベント処理をGLThreadで行う必要があります。

その辺りについて解説したいと思います。

## Androidにおけるcocos2d-xのイベントについて
基本的にほとんどの処理がmainスレッドで行われるiOSと異なり、Androidではcocos2d-xの処理は基本的にGLThread上で行われます。
描画処理は元より、パネルのタッチイベントやゲームロジック(C++,JavaScript,Lua)もおおよそはこのスレッド上で実行されます。
そのため、Android GUIを利用する際には上記の記事で解説したようにHandlerクラスを使って、UIスレッド上で処理するように実装しなければいけません。

一方でこういったGUIからタップ等のイベントを受け取り、ゲームロジックへイベント通知する際にはどうすればよいのでしょうか？
Androidにおいてはゲームロジックの処理は全てGLThreadからコールされる必要があります。（内部で他のスレッドを利用するのはOK）
関数コールバックや非同期処理などのイベントリスナーはGLThread上で動作するよう実装しなければいけません。

なので、シーケンス的には次のようになります。
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/17287/90743103-031a-0a9d-15a5-29610261b4e8.png)

GLThreadからUIThreadに処理を渡すのは比較的容易なんですが、UIThreadからGLThreadに処理を渡すのは少々厄介です。
基本的に、Cocos2dxActivityあるいはそのサブクラスのActivityはシステムに常駐していると思いますので、Activityのインスタンスをどちらかに保持しておいて、そこからrunOnGLThreadをコールするのが簡単だと思います。
この辺り、非常に野暮ったいコードになるので３系ではもっとスマートにアクセスできるとよいのですが（未確認）

## サンプルコード
下記のようなUtilityメソッドを用意しておくと便利かと思います。

```java
 public static void runOnCocos2dxActivity(Runnable runnable) {
    sCocos2dxActivity.runOnGLThread(runnable);
  }
```

JNI経由のコールバックとしては次のような感じになるかと思います。

```java
hoge.runOnCocos2dxActivity(new Runnable() {
   public void run() {
     Callback.onSuccess();
   }
});
```

JNIはこんな定義かな

```c
extern "C"
{
  JNIEXPORT void JNICALL Java_jp_hoge_src_Callback_onSuccess(JNIEnv* env, jobject thiz);
}
```

実際はコールバック関数の格納コンテナや、C++インターフェースを考える必要がありますが、エッセンスだけ記載しておきます。

## cocos2d-jsでの注意
先ほどコールバックについて少し解説しましたが、cocos2d-x上では実はコールバック関数内でCocosAPIを使用しないのであれば普通に動作したりします。
しかし、cocos2d-jsにおいてはコールバック関数内のスクリプトのパースに失敗し、まったく動作せずにエラーメッセージだけが出力されます。
基本的にJavaScriptはSpiderMonkeyが動作しているGLThread上でしか動作しないので、コールバック関数も常にGLThread上で動くようにしておきてください。

# 終わりに
Qiitaでのアドベントカレンダーは初参加なので、正直書き方がよくわかってなくて、これでいいのかなー？
迷いがあるのですが、おかしなところがあればご容赦ください。
では、みなさま良い年越しを＾＾
LaravelでSet-Cookieの出力を止める

JSON APIを作った時とか、`Set-Cookie`ヘッダをレスポンスから消し去りたい場合は以下のようなフィルタを用意する。

```php
Route::filter('session.cookie.remove', function(){
    Config::set('session.driver', 'array');
});
```

このフィルタを指定してあげればOK。

```php
Route::group(
    [
        'before' => 'session.cookie.remove',
        'prefix' => 'v1'
    ]
    , function () {

    }
);
```

Ref: http://laravel.io/forum/03-28-2014-build-api-with-laravel-how-to-disable-cookie-output
ImageMagickとlibreofficeを使ったOffice->PDF->PNG変換について(コマンドライン編)

#概要
uploadされたoffice関連ファイルをWebでサムネイル表示するための事前調査としてImageMagickとlibreofficeをインストールしてその動作を調べてみました。

#ツールのインストール
```
>sudo yum -y install ImageMagick ImageMagick-devel libreoffice xorg-x11-server-Xvfb
```
私はvagrantでやったのですが、もの凄く時間がかかるので覚悟を！！

#フォントのインストール
日本語TrueTypeフォント「IPAフォント」と「IPAexフォント」をインストールします。  
これをやらないと、日本語が「□□□□」とかになります。  
[IPAexフォント・IPAフォントのダウンロード](http://ipafont.ipa.go.jp/index.html)  

上記サイトからあらかじめIPAfont00303.zipとIPAexfont00201.zipをダウンロードしておいてください。

```
>unzip IPAfont00303.zip
>sudo mkdir /usr/share/fonts/japanese
>sudo mkdir /usr/share/fonts/japanese/TrueType
>sudo mv IPAfont00303/*.ttf /usr/share/fonts/japanese/TrueType/

>unzip IPAexfont00201.zip
>sudo mv IPAexfont00201/*.ttf /usr/share/fonts/japanese/TrueType/
>sudo fc-cache -fv
```

※エラーがでたらmvをcpに変えて実行してみてください。

#DISPLAYの設定
サーバーなので通常DISPLAYは無いのですが、libreofficeはフレームバッファを使用します。ツールのインストールで仮想フレームバッファ X サーバ（xorg-x11-server-Xvfb）をインストールしているので、コマンドラインでlibreofficeを使用する前にDISPLAY変数と仮想フレームバッファ X サーバを起動しておきます。

```
>export DISPLAY=:1.0
>Xvfb :1 &
```
こんなエラーが表示されますが、

```
> Internal error:   Could not resolve keysym XF86AudioMicMute
Errors from xkbcomp are not fatal to the X server
```
今は気にしないことにします。（Audio関係のデバイスが存在しないためのエラーでこれからの検証する動作には関係ないので）
起動に失敗しているように見えますが、そのままENTERキーを押下してください。（コマンドは完了しています）

#OFFICE->PDF変換
```
>libreoffice --headless --convert-to pdf 変換元ファイル.rtf
```
例としてrtfを変換していますが、pptxでもxlsxでもかまいません。
出力ファイルは「変換元ファイル.pdf」として出力されます。
※ここでも「XF86AudioMicMute」が表示されますが今は気にしないでください、同様にそのままENTERキーを押下してください。（コマンドは完了しています）  
libreofficeの細かい使い方は

```
>libreoffice --help
```
などで確認してみましょう。

#PDF->PNG変換
```
>convert 変換元ファイル.pdf 出力ファイル名.png
```
これでPNGに変換できます。
JPEGなど他の形式にしたい場合は拡張子を変えてみてください。
これも細かい使い方は

```
>convert --help
```
などで確認してみましょう。

#おまけ（rmagickについて）
Railsでプロジェクトを作るのが面倒なので簡単に確認します。

```
>gem install rmagick
```
をあらかじめ実行しておきます。

変換対象となる適当なtest.xlsxと下記のtest.rbを用意します。

```lang:test.rb
require 'RMagick'

# test.xlsxをtest.pdfに変換する
list = open('| libreoffice --headless --convert-to pdf test.xlsx') {|msg| msg.gets}

# test.pdfの1ページ目だけをロード
img = Magick::ImageList.new("test.pdf" + '[0]')

#test.pngとして保存
img.write("test.png")
```

下記コマンドを実行します。

```
> ruby test.rb
```

test.pdfとtest.pngが出来ているのを確認しましょう。


#関連エントリ
[【Windows7】VirtualBox ＋ Vagrant ＋ Ruby + Rails4 開発環境の構築【mysql編】](http://qiita.com/Gin326M/items/73498bbb909a72ec6384)
[【Windows7】VirtualBox ＋ Vagrant ＋ Ruby + Rails4 開発環境の構築【RubyMine編】](http://qiita.com/Gin326M/items/4648c389a12a3e00e270)
[【Yosemite】Mac OSX 10.10 Yosemite に Ruby + Rails4 開発環境の構築【初心者必見】](http://qiita.com/keneo/items/0a58b188183b5100e3af)
[【Yosemite】Mac OSX 10.10 Yosemite にAMP環境の構築【初心者必見】【続編】](http://qiita.com/keneo/items/7e5851a066e0b276f4a9)

#筆者紹介
札幌圏でリモート開発、在宅勤務を中心としたシステム開発の会社を立ち上げました！
[ローラハウス](http://laurahouse.net/)
Capistrano 3 で、特定のディレクトリに変更があった際だけタスクを走らせる

例として、「アセットが変更した時だけプリコンパイルを走らせるハック」。

```ruby
Rake::Task['deploy:assets:precompile'].clear

# modified from https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/assets.rake#L55
task :'deploy:assets:precompile' do
  on release_roles(fetch(:assets_roles)) do
    releases = capture("ls #{deploy_to}/releases | wc -l").to_i
    prev = fetch(:previous_revision)
    curr = fetch(:current_revision)

    assets_changed = if !prev.nil? && !prev.empty?
      capture(
        "git --git-dir=#{repo_path} diff --numstat #{prev}..#{curr} -- vendor/assets/ app/assets/ | wc -l"
      ).to_i
    else
      1 # always judge changed if no previous release
    end

    if releases > 1 && assets_changed > 0
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "assets:precompile"
        end
      end
    else
      execute(:echo, "Skipping asset pre-compilation because there were no asset changes", "1>&2")
    end
  end
end
```

ポイントは

* `:current_revision` `:previous_revision` と言う値が取れる。 **しかし Capistrano 3.1 ではバグってる...（ブランチを指定すると正しい値が取れません）**
* gitリポジトリは `repo_path` と言うメソッドで取れる。ただし、 bare repository である。なので `git --git-dir=#{repo_path}` とかってやるといきなり色々操作できる。

この例では、 Rails 4.1 で対応されるので上げた方が良いですね。

その他の「XXXが変わった時だけ走らせたいタスク」がある際には有効かもしれぬ。
addr2lineを使ってスタックトレースから取得したアドレスをソースファイル名と行番号に変換する

[前書いた記事](http://qiita.com/nanashi/items/19e2c9558be00d310eaa) ではアドレスからソースコードを割り出すためにobjdumpを使っていましたが、
それではプログラムが大きいほど遅くなります。

今日はaddr2lineコマンドを紹介します。
ソースサンプルは前書いた記事にあるます。
実行結果

```
./a.out() [0x401768]
./a.out() [0x4017e9]
./a.out() [0x401804]
/lib64/libc.so.6(__libc_start_main+0xfd) [0x318441ed5d]
./a.out() [0x4012a9]
```

この実行結果からコースコードを割り出すには以下のコマンドを使います

```addr2line -e a.out -f -C -s 0x401768 0x4017e9 0x401804```

パラメータの意味
-e 実行ファイルの位置を指定、デフォルトはa.out
-f 関数の名前を表示する
-C c++のシンボル（関数の名前）を見やすくする
-s ファイル名のみを表示する（つけないと絶対パスを表示する）


実行結果

```
hogehoge()
1.cpp:52
hoge()
1.cpp:57
main
1.cpp:60
```

もし実行結果に??がありましたら、それはアドレスが違ってるか、それともコンパイルの時-gをつけていなかったかのどちらです。

このコマンドは一瞬で実行が終わります、これでデバッグの時はもっと捗りますね。

仕事で使う時デバッグ情報ありとなしのファイルを分けるコマンド

```
cp a.out a.out.debuginfo
strip a.out
```

gitのコミット番号もつけたいなら

```
cp a.out "a.out.debuginfo.`git log -n 1 --pretty=format:%H`"
strip a.out
~~~

そのあとa.outを公開して、バグレポートをもらったらa.out.debuginfoを使ってソースコードの位置を割り出せばおkです。

manページ
http://linuxjm.sourceforge.jp/html/GNU_binutils/man1/addr2line.1.html
SwiftでNSURLProtocolを使ってUIWebViewの広告をブロックする

UIWebViewにおけるAdBlockは[NSURLCacheを使った実装](http://www.icab.de/blog/2009/08/18/url-filtering-with-uiwebview-on-the-iphone/)が有名ですが、iOS8では動いてくれなかったのでNSURLProtocolを使って実装してみました。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 自前のクラスを登録する
        NSURLProtocol.registerClass(FilteredURLProtocol)
        
        let url = NSURL(string: "http://www.yahoo.co.jp")!
        let request = NSURLRequest(URL: url)
        webview.loadRequest(request)
    }
}
```

```swift:FilteredURLProtocol.swift
import UIKit

class FilteredURLProtocol: NSURLProtocol {
    
    override class func canInitWithRequest(request: NSURLRequest) -> Bool {
        let host = request.URL.host

        // ホスト名が広告配信元か否かを判定
        if host?.rangeOfString("ads") != nil {
            return true;
        }
        return false
    }

    override class func canonicalRequestForRequest (request: NSURLRequest) -> NSURLRequest {
        return request;
    }

    override func startLoading() {
        let response = NSURLResponse(URL: self.request.URL,
                                MIMEType: nil,
                   expectedContentLength: 0,
                        textEncodingName: nil)
        self.client?.URLProtocol(self,
            didReceiveResponse: response,
            cacheStoragePolicy: NSURLCacheStoragePolicy.NotAllowed)
        self.client?.URLProtocol(self, didLoadData: NSData(bytes: nil, length: 0))
        self.client?.URLProtocolDidFinishLoading(self)
    }
    
    override func stopLoading() {}
}
```

canInitWithRequestメソッドでホスト名を確認し、広告を配信するホスト名の場合はtrue、それ以外はfalseを返します。
trueの場合はstartLoadingメソッドが呼ばれ、独自の処理が実行されます。
この場合は、URL先のデータを読みに行かず、空のデータを読み込むようにしています。

結果は下図のようになります。
![スクリーンショット 2014-11-27 18.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/42150/4d0ad2ba-de21-aa29-0cee-f336c1933695.png) ![スクリーンショット 2014-11-27 18.22.29.png](https://qiita-image-store.s3.amazonaws.com/0/42150/3e019315-54fc-2c72-e0fa-5ce43c2defb4.png)

ちなみにWKWebViewでは動きません。
PHP5.4未満でheader_register_callbackを利用する


## 注意

PHP5.3系列は既に公式のサポートが打ち切られています。
この方法は正しく動作しますが、**PHP5.4未満の利用そのものが推奨されるものではありません**。
レンタルサーバの都合など、どうしてもPHP5.4以降のバージョンが利用できない場合に限り採用してください。

## header_register_callbackとは

[header_register_callback](http://php.net/manual/ja/function.header-register-callback.php)は、HTTPヘッダ送信直前に処理する内容を登録できる関数です。
利用例としては、例えばHTTPヘッダを別の値で上書きする場合などに利用できます。
私の投稿の"[PHPの仕様上、au端末のCookieでは有効期限が設定できない問題を回避する](http://qiita.com/sounisi5011/items/ef09da5812c3150fbc1a#%E3%82%B3%E3%83%BC%E3%83%89%E6%97%A7%E7%89%88)"でもこの関数が利用されています。
この関数の対応バージョンは

> (PHP 5 >= 5.4.0)

です。つまり、PHP 5.4.0以上のバージョンでのみ利用できます。

## PHP5.4未満で利用するためのコード

以下が、PHP5.4未満で`header_register_callback`関数を定義するコードです。
PHP5.2未満ではテストしていないため動作するか分かりませんが、PHP4.0.6以降のバージョンでは利用できるはずです。

```php
if(!function_exists('header_register_callback')){
	function header_register_callback($callback){
		if(!is_callable($callback)){
			return false;
		}
		$GLOBALS['@header_register_callback']=$callback;
		return true;
	}
	function __header_register_callback_shutdown_function(){
		$out = ob_get_contents();
		ob_end_clean();
		if(isset($GLOBALS['@header_register_callback'])){
			$GLOBALS['@header_register_callback']();
		}
		echo $out;
	}
	register_shutdown_function('__header_register_callback_shutdown_function');
	ob_start();
}
```

### PHP5.3以降はこれを推奨

なお、PHP5.3以降のバージョンの場合、[無名関数](http://php.net/manual/ja/functions.anonymous.php)が使えるので以下のコードも使えます。
無駄な関数を定義しなくて済むので、どちらかと言えばこちらを推奨します。

```php
if(!function_exists('header_register_callback')){
	function header_register_callback($callback){
		if(!is_callable($callback)){
			return false;
		}
		$GLOBALS['@header_register_callback']=$callback;
		return true;
	}
	register_shutdown_function(function(){
		$out = ob_get_clean();
		if(isset($GLOBALS['@header_register_callback'])){
			$GLOBALS['@header_register_callback']();
		}
		echo $out;
	});
	ob_start();
}
```

## 注訳

[出力制御関数](http://php.net/manual/ja/ref.outcontrol.php)の`ob_start`関数を利用している関係上、このコードは他の`ob_start`関数の実行前に記述することが求められます。
hubでGithubをちょっと便利に。

#事前準備

- [Homebrew](http://brew.sh/)のインストール
- [SSHキーの設定](http://qiita.com/ken0nek/items/224f8432a9d3b60ef9f2)

#hubのインストールと設定

##hubとは - https://github.com/github/hub

```
hub - git + hub = github
hub is a command-line wrapper for git that makes you better at GitHub.
```
つまり、Githubを便利にするツールです。入れるしかないです。

##インストール

```
brew install hub
```

##設定

.bash_profileや.zshrcに以下の一文を追加し、シェルを再起動してください。

```bash:bash,zsh
eval "$(hub alias -s)"
```

```:fish
eval (hub alias -s)
```
##確認

```
which git
-> git: aliased to hub
```
となれば、もうhubを使えるようになっています。

#hubの使い方

詳しい使い方はここか、
https://github.com/github/hub#commands

```
git help hub (or man hub)
```
で確認してください。

長いURLを入力しなくてもcloneできるようになったり、いろいろ省略できるようになります

#よく使うもの

##git create

以下のコマンドで、Githubにレポジトリを作成することができます

```
git create [NAME] [-p] [-d DESCRIPTION] [-h HOMEPAGE]
```

|   オプション   |             意味             |
|:--------------:|:----------------------------:|
|      NAME      |       レポジトリの名前       |
|       -p       | プライベートレポジトリにする |
| -d DESCRIPTION |    レポジトリの詳細を追加    |
| -h HOMEPAGE    | ホームページを追加           |

##git browse

以下のコマンドでリモートのGithubレポジトリをブラウザで開くことができます

```
git browse [-u] [[USER/]REPOSITORY] [SUBPAGE]
```
RubyのTime#utcは破壊的である

なんという罠。なぜビックリしないのか。

```rb
irb(main):001:0> t = Time.now
=> 2014-11-27 18:35:13 +0900
irb(main):002:0> t.utc
=> 2014-11-27 09:35:13 UTC
irb(main):003:0> t
=> 2014-11-27 09:35:13 UTC
```

回避するには、dupするか、getutc/getgmを使う。

```rb
irb(main):001:0> t = Time.now
=> 2014-11-27 18:35:48 +0900
irb(main):002:0> t.dup.utc
=> 2014-11-27 09:35:48 UTC
irb(main):003:0> t
=> 2014-11-27 18:35:48 +0900
```

gmtimeも同様。
golang の anaconda などを GAE 内で利用する時、ネットワークアクセスエラーとなる場合の対処

## 問題: 

Google App Engine 内にて、anaconda を用いて外部APIのフェッチなどを行う際、以下のエラーとなります。

```go
http.DefaultTransport and http.DefaultClient are not available in App Engine. See https://developers.google.com/appengine/docs/go/urlfetch/overview
```

App Engine のインフラでは、専用のフェッチする実装を使う必要があるようです。

## 解決 (http.Clientの場合)

参考: 
https://cloud.google.com/appengine/docs/go/urlfetch/

http.Client の Get などを普通に使う場合は

```go
import (
    "appengine"
    "appengine/urlfetch"
)

c := appengine.NewContext(r)
client := urlfetch.Client(c)
resp, err := client.Get("http://www.google.com/")
```

## 解決(外部ライブラリの場合)

でもって、外部ライブラリの場合はライブラリが使っている http.Client.Transport を appengine のものに差し替える必要があります。

tweetlib では以下の例がありますので、
https://robbycolvin.com/google-app-engine-http-default-transport/

コレを参考に

```go
api := anaconda.NewTwitterApi("-", "-")
c := appengine.NewContext(r)
api.HttpClient.Transport = &urlfetch.Transport{Context: c}
searchResult, _ := api.GetSearch("golang", nil)
```

として、Transport を差し替えればよさそうです。

ライブラリ側で、 Transport や http.Client が露出している必要があり、無理そうだったら Issue やプルリクを投げるのがよさそうです。
Mac OS X 上で clamd を動かす


ClamAV のパッケージを[Homebew](http://brew.sh/)を使ってインストールする。

```bash
% brew install clamav
```

ClamAV のプロセスを実行する前に、ウイルス定義のデータベースが必要になる、
`freashclam.conf` を `freshclam.conf.sample` からコピーして作成し、 ウィルス定義ファイル入手先を日本に設定する。

``` freshclam.conf
DatabaseMirror db.jp.clamav.net
```

`freshclam` を実行する。

```bash
% freshclam -v
```

すると、 ClamAV のウイルス定義データベースがダウンロードされる。
また、出力は以下のようになる。

```bash
Current working dir is /usr/local/Cellar/clamav/0.98.3/share/clamav
Max retries == 3
ClamAV update process started at Wed May 14 14:05:32 2014
Using IPv6 aware code
Querying current.cvd.clamav.net
TTL: 962
Software version from DNS: 0.98.3
main.cvd version from DNS: 55
main.cvd is up to date (version: 55, sigs: 2424225, f-level: 60, builder: neo)
daily.cvd version from DNS: 18979
daily.cld is up to date (version: 18979, sigs: 950655, f-level: 63, builder: neo)
bytecode.cvd version from DNS: 236
bytecode.cvd is up to date (version: 236, sigs: 43, f-level: 63, builder: dgoddard)
```

次に `clamd.conf` を作成する。
これも、先ほどと同様に `clamd.conf.sample` からコピーして作成すれば良い。
今回はローカルでのみ動作させるのを目的としているので、ファイルに以下の内容を追記する。

```
# /usr/local/etc/clamd.conf
TCPAddr 127.0.0.1
TCPSocket 9321
```

次に、ソケットディレクトリを用意する。

```bash
% mkdir /usr/local/var/run/clamav
```

ここまで設定すれば動作させることができる。

```bash
% clamd
```

これで clamd のプロセスが起動される。
MySQLで、特定のテーブルをTRUNCATEしちゃった時の復旧方法

ちょっとまえに同僚がやらかして、本番のうん百万行くらいあるテーブルをTRUNCATEしちゃった時の復旧方法書いときます。

気づいた時には消した後で、更に300件ほど新しくデータが入っている状態からのスタートでした。。。

復旧手順は以下のとおり


1. まず落ち着く
2. 本番メンテナンス
3. 現在入っている300件のデータをdump
3. 定期dumpデータからとりあえず過去分を復旧
4. binlogからやっちまう直前まで復旧
5. チェックしてオープン
6. 反省会


## ダンプデータからとりあえず過去分を復旧


このプロジェクトでは毎朝5時に定期メンテナンスがあり、その間にDB全体のデータをmysqldumpしていたので、とりあえずその日の朝5時までのデータを取得することにした。

ただ、このダンプデータは、特にオプションを指定せずmysqldumpを実行していたようで、スキーマ情報も取得していたので、とりあえず下記コマンドでINSERT文を抜き取ることにした。


    # dumpファイルからLOCKとついた文字列ごとにファイルを分割する
    csplit dump.sql /^LOCK/ {*}

    # 分割されたxx*のファイルから指定のテーブルへのINSERT文がどのファイルかを調べる
    egrep -rn 'INSERT INTO `テーブル名`' xx* | sed -e "s/[:].*//"

    less -S 見つけたファイル

    # INSERT文のみコピペでどっか退避させておく
    

## binlogからやっちまう直前まで復旧

次に朝5時からメンテナンス入れたところまでのSQLをbinlogから抜き取る。

どこかの天才が作ってくれていたperlコマンドを元になんとなく書き換えて、改行なども考慮して、特定のテーブルへ発行されたSQLのみを抜き取ることに成功。←おそらく・・・

    mysqlbinlog --start-datetime="その日の定期メンテ明けの時間" binログファイル | perl -e 'while(<>){ chomp; next if m!^#!; if ( m{/*!*/;$} ) { $p .= $_; print "$p\n"; $p="" } else { $p .= $_." "} }' | grep 指定テーブル名
    

当然その中には、やっちまった

    truncate テーブル名
    
もあるので、そのSQLの一つ前までのSQLを取得。


あとは、流す順番を間違えずに、

1. 朝五時までのSQL
2. やっちまう直前までのSQL
3. やっちまってからの300件のデータ


を入れてあげて、復旧完了。

ほかにいい方法あれば、ぜひ教えて下さい。
[Java] MapなどのContainsKeyなんかでの比較条件

忘れそうなので自分用のメモ。

MapのKeyにはStringをいれることが大半なんですが、自作のClassを指定することがあって、その際containsKeyが思うようにTrueに鳴ってくれませんでした。

結論としては、

```java:オーバーライド
hashCode()
equals()
```
の1つのメソッドをオーバーライドして、equals()がTrueを返すときは、hashCode()も同じものを返すようにするとよいです。

[Link](http://www.javaroad.jp/bbs/answer.jsp?q_id=20050223142332216)
cmd > /dev/null 2>&1」の話


cmdの出力を捨てたいときに使うんだと認識しているのですが、あんま意味がわかってないので順序追って考えてみた。

前提として
・/dev/nullへリダイレクトすることで出力を破棄している
・1は標準出力, 2は標準エラー出力の予約語的なもの

### 処理を追ってみる
コマンドを仮に 「ls > /dev/null 2>&1」とする。

１. lsの標準出力を/dev/nullにリダイレクトして破棄
２. 標準エラー出力2の出力を標準出力1に合わせる

実際考えてみると単純。

### 順番の話
でも前述した内容なら、順番適当でええんちゃうんと思って

```bash
 ls 2>&1 > /dev/null
```

でいいかと思ったんだけど普通にエラー出力でた。
どういうことかと思って調べてるとこんな記事が
http://sonic64.com/2004-03-28.html

リダイレクト処理は、左から右へファイルをオープン/クローズしながら処理が進むよう。
つまり上記のコマンドだと

・1の出力先 [screen] 2の出力先 [screen]

　　--- 2の出力先を1の出力先に変更 ---

・1の出力先 [screen] 2の出力先 [screen] 

　　--- 1の出力先を/dev/nullの出力先に変更 ---

・1の出力先 [/dev/null] 2の出力先 [screen] 

となるから、標準エラー出力はスクリーンにでてしまう。
Amazon CloudFront の障害に備えてフェイルオーバーを設定する

日本時間 2014/11/27 の AM9時〜AM11時頃まで、全世界的に Amazon CloudFront に障害がありました。

CDNとして CloudFront を利用しつつ、障害時にはフェイルオーバーする方法をまとめました。

## S3

> CloudFrontのOriginがS3でない場合は、この項の設定は関係ありません。

CloudFrontのOriginとしてS3を使う場合、以下のようにします。

- `file.example.jp` のような、使いたいドメイン名で S3バケット を作る
- Static Website Hosting を有効にしておく

ドメイン名のバケットで Static Website Hosting が有効になっていないと、後述の Route53 の Alias Target に設定できません。


## Health Check

Route53 の Health Checks を利用します。

- Specify Endpoint By: Domain Name
- Domain Name: 利用しているCloudFrontのドメイン名 ( `xxx.cloudfront.net` )
- Path: 何らかの、存在するパス

としておきます。

パスは存在するのであればよいので、`/index.html` でも `/robots.txt` でも、好きなものを設定しておきましょう。死活監視用なので、あまりファイルサイズが大きくないものが適切かと思われます。

定期的に、上記で設定された CloudFrontのパス にHTTPリクエストが飛んできて、死活監視されます。

## Route53

Route53 は Health Checks と連動して、DNSが返す内容を変えることができます。

例えば file.example.jp をCDNのドメイン名として使う場合、

Primary
- Name: `file.example.jp`
- Type: Aレコード
- Alias: Yes
- Alias Target: 利用しているCloudFront ( `xxx.cloudfront.net` )
- Routing Policy: Failover
- Failover Record Type: Primary
- Evaluate Target Health: No
- Associate with Health Check: Yes
- Health Check to Associate: 前項で設定した Health Check

Secondary
- Name: `file.example.jp`
- Type: Aレコード
- Alias: Yes
- Alias Target: 利用しているS3 ( `file.example.jp.s3-website-ap-northeast-1.amazonaws.com` )
- Routing Policy: Failover
- Failover Record Type: Secondary
- Evaluate Target Health: No
- Associate with Health Check: No

とします。

もし、OriginがS3でない場合は、Secondaryの内容を、Originに直接アクセスが行くようにIPなりELBなどを設定するだけです。

OriginがELBならば
- Alias: Yes
- Alias Target: Origin ELB ( `xxx.ap-northeast-1.elb.amazonaws.com.` )

別のレコードセット(ドメイン)ならば
- Alias: Yes
- Alias Target: Origin Recode Set ( `www.example.jp` )

IPアドレスならば
- Alias: No
- Value: xxx.xxx.xxx.xxx

## 使い方

前述の設定をしておくと、例として使ったドメイン名 `file.example.jp` にアクセスしたときに、CloudFront が生きている間は CloudFront にアクセスするように、Route53 によって名前解決されます。

CloudFront が死んで、Health Check で設定した閾値を超えた場合、Secondary の S3(あるいは設定したOrigin) にアクセスするように名前解決されるように変わります。

## 注意点

CloudFront が死んだ場合、そのアクセスはフェイルオーバー先に切り替わります。もしそれが大量のアクセスであればフェイルオーバー先にかなりの負荷がかかることになります。

必要に応じて、フェイルオーバー先に別の CDN を利用したり、ELBであれば Auto Scaling を設定するなりしたほうがよいでしょう。
型TがインタフェースIを実装しているか、の確認方法例

## 公式ドキュメントのFAQ
* [How can I guarantee my type satisfies an interface?](http://golang.org/doc/faq#guarantee_satisfies_interface)
    * `var _ I = T{}`ってコードを仕込んで __コンパイル時にエラーを確認する__ (`I`がインタフェース)
        * 例えば`T`の基礎型がsturctではなくstringなら `var _ I = T("")` こんな感じで
        * 実装漏れがあれば`T does not implement I`というコンパイルエラーで気付かせてくれる
    * __"Iってインタフェースを実装してますよ" という宣言目的のメソッド__ を定義＆実装して可視化する
        * 例えば`ImplementsI()`的な名前のメソッド
* 個人的には前者の方法だけで良い気がした。メソッド名頼りというのが心許ないというか。。。
* お試しGist : https://gist.github.com/goldeneggg/abd05091a5abfde0b572
[uGUI]Imageのalphaをまとめて変更したい

Imageのalphaを変更しても、子要素としてぶら下がっているImageのalphaは変更されません。

以前は子要素を検索してMaskableGraphicだったらalphaを親と同期するという処理が必要だったのですが、
現在はCanvasGroupというコンポーネントがあるのでそちらが使えます。

![SS2.png](https://qiita-image-store.s3.amazonaws.com/0/8904/516e6d62-921a-3e91-5990-138f3493512b.png)



↑のalphaを弄れば子要素をひっくるめてalphaを変えてくれます。
svnをgitに変換する実験

commit logも含めてsvn -> gitに移行する作業を確認します


## svnリポジトリの作成
* svnリポジトリの作成  

```
mkdir repos
svnadmin create repos
```

* リポジトリを初期化するためのプロジェクトの作成

```
mkdir project
cd project/
echo hogehoge > text.txt
```

* プロジェクトをリポジトリにimport（登録）する

```
cd ..
svn import -m "import test" project file:///Users/TakanoriMatsumoto/Dev/svn_test/repos/project
```


* importされたことを確認

```
svn list file:///Users/TakanoriMatsumoto/Dev/svn_test/repos/
```

* リポジトリから作業ディレクトリworkにチェックアウト

```
svn checkout file:///Users/TakanoriMatsumoto/Dev/svn_test/repos/project work
```

* 作業ディレクトリworkで作業する

```
cd work
echo fuga > text2.txt
svn add text2.txt 
```

* 作業をcommit & update

```
svn commit -m "Add file."
svn update
```

* commit logを確認

```
svn log
```

## svnからgitに変換
* svnからgitに移行するためのディレクトリを作成

```
mkdir git_svn_test
cd git_svn_test/
```

* svnリポジトリからgitリポジトリを作成

```
git svn clone file:///Users/TakanoriMatsumoto/Dev/svn_test/repos/project
```

* svnのlogがそのまま保存されていることを確認

```
git log
```
Gradle (+ Jetty + Jersey) を試してみた


忘れないうちにメモ

## はじめに

Gradleを試してみためも。

[Jetty+Jerseyを動かしてみる](http://qiita.com/megmogmog1965/items/0aebbe721f73247ca5f5) で作った maven project を Gradle で置き換えてみる。

## 参考にしたサイト

* [Gradleをmacにインストールした際のメモ]
* [GradleのProxy設定について]
* [Gradle 日本語ドキュメント]

## やってみたこと

### build.gradleを書く

以下のファイルを作ってルートに置く

```gradle:build.gradle
apply plugin: 'war'
apply plugin: 'jetty'

def javaVersion = 1.8
def defaultEncoding = 'UTF-8'

sourceCompatibility = javaVersion
targetCompatibility = javaVersion

repositories {
  mavenCentral()
}

dependencies {
  compile 'javax:javaee-api:7.0'
  compile 'org.glassfish.jersey.core:jersey-server:2.13'
  compile 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.13'
  compile 'org.eclipse.jetty:jetty-server:9.2.5.v20141112'
  compile 'org.eclipse.jetty:jetty-webapp:9.2.5.v20141112'
}

compileJava {
  options.encoding = defaultEncoding
}

jettyRun {
  httpPort = 8080
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.2'
}
```

### Gradle wrapperを作る

wrapperを作って、SCMにcommitしてしまえば、コードをPullしてきた他メンバーがいちいちGradleをInstallしなくて良くなる。

↓のコマンドを実行してwrapperを生成する。

```sh
$ gradle wrapper
```

↓のファイル (wrapper) が生成されるので、これらもSCMにcommitする

* gradlew
* gradlew.bat
* gradle/wrapper/
	* gradle-wrapper.jar
	* gradle-wrapper.properties

> 以降は "./gradlew" コマンドを使う。機能は "gradle" コマンドと全く同じです。

### ビルドする

↓のコマンド実行で、 "(Project root)/build/libs/" に.warファイルができる。

```sh
$ ./gradlew war
```

### Jetty上で動かしてみる

↓のコマンドだけで、Jettyが起動して、.warがデプロイされます。

```sh
$ ./gradlew jettyRun

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
> Building 75% > :jettyRun > Running at http://localhost:8080/JettyJersey
```

ブラウザで http://localhost:8080/JettyJersey/hello にアクセスすると、 "Hello !!" と表示されます。



[Gradleをmacにインストールした際のメモ]:http://qiita.com/ftsan/items/536a6a83135b8856600a
[GradleのProxy設定について]:http://qiita.com/hishida/items/9479fb64a016032c0938
[Gradle 日本語ドキュメント]:http://gradle.monochromeroad.com/docs/
[uGUI]実行中に表示順序を変える

Canvas内のUIパーツの表示順序はHierarchy内の表示順に準拠します。(zを弄ってもダメということ)
![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/8904/5971faef-f78e-5582-0569-4db795fcd53c.png)

実行順に表示順を変更する為には以下のように
SetSibilingを使用します。
` 
//表示Indexの指定
parts.transform.SetSiblingIndex(index);
//表示を最奥に
parts.transform.SetAsFirstSibling();
//表示を最前面に
parts.transform.SetAsLastSibling();
`

尚、上記はあくまで親の中での順序になります。
n行ごとに処理をするワンライナー


よくわからないので誰か教えてください。

一応、10行ごとに改行を入れるワンライナーはできたのですが、正直言ってダサすぎます。
ワンライナーを凄さを全然感じられないので誰かお願いします。

```Awk
cat result.txt | awk 'begin{i=0} {print $1}{i++} {if(i%10==0){print ""}}'
```

トリッキーなのを待ってます
継続タスクでのキャンセル処理

キャンセルするとキャンセル発生元のタスクは(何もしなければ)最後まで処理が行われ、それ以降の継続タスクは処理されない。

また、OperationCanceledExceptionがスロー・AggregateExceptionに集約される。キャンセル可能性があるタスクは呼び出しもとで補足・後処理すべし。


## 検証用コード

コンソールアプリケーションで動かしました。

```csharp
public static class ContinueWithExample3
{
    public static void Run()
    {
        var csource = new CancellationTokenSource();

        var task = Task.Factory.StartNew(() =>
        {
            Console.Write("入力：");
            var input = Console.ReadLine();

            if (input.ToLower() == "cancel")
            {
                csource.Cancel();
            }

            if (input.ToLower() == "error")
            {
                throw new Exception("何らかのエラー");
            }

            if (input.ToLower() == "error2")
            {
                throw new Exception("何らかのエラー2");
            }

        })
        .ContinueWith((t) =>
        {
            if (t.IsFaulted && t.Exception.Flatten().InnerExceptions.Any((e) => e.Message == "何らかのエラー2"))
            {
                Console.WriteLine("Task1でタスクの取り消しを行います。");
                csource.Cancel();
            }

            Console.WriteLine("Task1 Cancel:{0}", t.IsCanceled);
            Console.WriteLine("Task1 Faulted:{0}", t.IsFaulted);

        }, csource.Token)

        .ContinueWith((t) =>
        {
            Console.WriteLine("Task2 Cancel:{0}", t.IsCanceled);
            Console.WriteLine("Task2 Faulted:{0}", t.IsFaulted);
        }, csource.Token)

        .ContinueWith((t) =>
        {
            Console.WriteLine("Task3 Cancel:{0}", t.IsCanceled);
            Console.WriteLine("Task3 Faulted:{0}", t.IsFaulted);
        }, csource.Token);

        try
        {
            task.Wait();
        }
        catch (AggregateException exc)
        {
            foreach (var innnerExc in exc.InnerExceptions)
            {
                Console.WriteLine("エラー:{0} {1}",innnerExc.Message,innnerExc.GetType().FullName);
            }
        }
    }
}
```

## 実行結果

### 「cancel」入力

![cancel.png](https://qiita-image-store.s3.amazonaws.com/0/7736/a8f1f271-fe6a-dc1a-2cc7-288ed07ab2f8.png)

### 「error」入力

![error.png](https://qiita-image-store.s3.amazonaws.com/0/7736/1e4a55e7-14ef-e301-ddc9-85eb9ed93a86.png)

### 「error2」入力

![error2.png](https://qiita-image-store.s3.amazonaws.com/0/7736/706e2f98-365b-5030-da5e-5422ed1eef34.png)
[Rails 4.x] Rails アプリをWerckerを通してHerokuに上げる際に -bash: heroku: command not found とかなった場合の対応。 

# 基本的には（2014/11/27）

この記事のとおりにやれば問題ないのですが、一箇所だけ注意。

http://qiita.com/oh_rusty_nail/items/5a737fc4c8b784c7de50

[現行最新版ではheroku-toolbeltが入っていないらしい。](https://twitter.com/viktorbenei/status/456913389928054784)

のでこんなエラーが。

```rb
$ heroku run:detached rake db:migrate --app $APP_NAME
-bash: heroku: command not found
```

# 追記

解決策は公式にのっていて、[こんな感じ。](https://gist.github.com/flenter/bbcee41fe7e70752bc24)

```rb
deploy:
    steps:
        - heroku-deploy:
            install-toolbelt: true #ここ！
        - script:
            name: Migrate DB
            code: heroku run rake db:migrate --app $APP_NAME
        - script:
            name: Update assets
            code: heroku run rake add_static_assets --app $APP_NAME
```

![Screen Shot 2014-11-27 at 16.29.19.png](https://qiita-image-store.s3.amazonaws.com/0/18705/6de300ea-bc6f-55b1-bfb6-2c86b26a6268.png)


以上でした。
便利(そう)なgemで打線組んだった

一度組んでみたかっただけです。野球は分からないけど・・・
なるべくド定番のgemを外してチョイスしてみました。
ほとんどのプロジェクトで有用であろうgemなので、何も考えずにGemfileに追加すればいいと思います。まぁそれは冗談ですが。

1. (遊) did_you_mean
1. (中) hirb
1. (三) rails_best_practices
1. (一) Goldiloader
1. (二) brakeman
1. (左) Annotate (aka AnnotateModels)
1. (捕) rails_erd
1. (右) rack-mini-profiler
1. (投) ActiveHash

***
以下は各gemの概要説明ですが、打順では並んでおらず適当にカテゴライズして並べています。

## デバッグ系

### did_you_mean
高機能なIDEを使っていればさほど必要ないかもですが、メソッド名や変数名、クラス名が間違っていた時に正しい名称をサジェストしてくれます。
ただしサジェストしてくれるタイミングは実際にNameError等が発生したときです。

* [GitHub: yuki24/did_you_mean](https://github.com/yuki24/did_you_mean)

## ActiveRecord系

### hirb
rails console上でモデルインスタンスをいい感じに表示してくれます。
hirb-unicodeも併せてどうぞ。

* [GitHub: cldwalker/hirb](https://github.com/cldwalker/hirb)

### Goldiloader
人類の大敵、N+1問題に立ち向かうための武器。
大抵の場合はこのgemを入れるだけでいいんじゃないかと思います。
シビアな部分は別途、従来通りにeager_load, includes, preloadの指定が必要かとは思いますが。
あとこのgemも万能ではないです。制約がGithubのREADMEに記載されています。

* [GitHub: salsify/goldiloader](https://github.com/salsify/goldiloader)

### ActiveHash
詳細は下記ポストを見て頂ければいいと思います。私的には静的データ用というよりもちょっとしたプロトタイプを作ったりする場合に便利そうだと思いました。

* [【Rails】静的データのモデル化にactive_hash gemが便利・・！ - kotatu.org](http://kotatu.org/blog/2014/10/09/active-hash-gem/)
* [GitHub: zilkey/active_hash](https://github.com/zilkey/active_hash)

## ドキュメント系

### Annotate (aka AnnotateModels)
テーブル情報(カラム名,属性,NOT NULL制約など)を対応するModelクラスのファイルにコメントとして書き出してくれます。

* [GitHub: ctran/annotate_models](https://github.com/ctran/annotate_models)

### Rails ERD
ER図を作成してくれます。前述のannotate modelsが単体用途とすれば、こちらは俯瞰用途です。
使うには別途Graphvizが必要となり、若干面倒かもしれません。

* [GitHub: voormedia/rails-erd](https://github.com/voormedia/rails-erd)

## コード解析系

ちなみに [スタイルガイド](https://github.com/bbatsov/ruby-style-guide) に沿っているかをチェックしてくれる[RuboCop](https://github.com/bbatsov/rubocop)については、もうド定番になりつつあるかと思いましたので外しました。

### rack-mini-profiler
プロファイル結果をブラウザの左上に表示してくれます。
↓のRailsCastsのスクショを見ると分かりやすいです。

* [#368 MiniProfiler - RailsCasts](http://railscasts.com/episodes/368-miniprofiler?view=asciicast)
* [GitHub: MiniProfiler/rack-mini-profiler](https://github.com/MiniProfiler/rack-mini-profiler)

### rails_best_practices
Railsのベストプラクティスに沿っているかをチェックしてくれます。
チェック内容は [ここ](http://rails-bestpractices.com/) で、before/refactorが例示されているので分かりやすいです。

* [GitHub: railsbp/rails_best_practices](https://github.com/railsbp/rails_best_practices)

### Brakeman
コードを静的に解析し、セキュリティ上の脆弱性がないかをチェックしてくれます。

* [GitHub: presidentbeef/brakeman](https://github.com/presidentbeef/brakeman)
Apacheとnginxどちらを採用すべきかメリット・デメリット比較

Apacheよりnginxの方が早い、という話を聞きました。それぞれのメリット／デメリットや速度比較について調べた内容をまとめます。

# そもそもApacheとnginxは駆動方式が違う

* Apacheとnginxの大きな違いは駆動方式の違い。詳しくは下記サイトがわかりやすい。<br>
http://dream-web.info/2013/12/19/533/
* Apacheは、プロセス駆動アーキテクチャでマルチプロセス。これは、各リクエストをプロセスに割り当てて処理を行う。リクエストが大量に来た際、プロセスが同時に起動するのでオーバーヘッドが非常に大きくなるというデメリットがある。
* nginxは、イベント駆動アーキテクチャ、シングルスレッドモデル。
シングルスレッドでループ処理をまわし、キューに溜まったイベントを処理していく処理方式（イベントループ方式）（node.jsなどでも採用）。プロセス数はCPUコア数と基本的には同じに設定。
* イベントループ方式を採用することで、少量のプロセスだけで大量のリクエストを処理することが可能。「C10K問題（ハード性能的には問題ないが、クライアントの数が多くなるとサーバがパンクする場合がある。プロセス番号が足りなくなる。UNIX系OSだと最大32767。）」が解決される。
* 参考 http://www.slideshare.net/yujiotani16/nginx-16850347
http://www.slideshare.net/ttkzw/nginx-intro

# 駆動方式の違いが具体的にどのように影響するか

* nginxの方が、処理が軽く、大量のリクエストを処理するのに向いている。
* nginxの方が、設定ファイル（nginx.conf）がApacheと比較してもより直感的で柔軟に設定を行うことが可能。
* nginxは、CPUリソースがたくさん必要な処理には向いていない。処理時間が長くなる処理を実行した際、そこでプロセスがブロックされてしまい処理能力が落ちてしまう。

# 比較調査例

* 単純に考察するとApacheよりもnginxの方が1.47倍処理能力が高い結果<br>
引用元） http://webkaru.net/linux/nginx-apache/
* 同時10接続の20回アクセス条件であれば、圧倒的にApacheよりNGINXが優位。
Apacheが機能拡充を目指したのに対して、NGINXは大量処理、スピード重視を徹底的に追求<br>
引用元） http://d.hatena.ne.jp/omiyan/20101213/1292187680
* しかしながらApacheもマルチプロセッシングモジュール（event_mpm）の設定を正しくチューニングすることで、nginxに及ばないまでも、かなりのパフォーマンスを期待出来る<br>
引用元） http://blog.matsumoto-r.jp/?p=2996

# 考察

> 負荷が高くなく、早期セットアップが必要な場合は「Apache」
負荷が高く、スケーラビリティが要求される場合は「nginx」
静的ページに同時多数のアクセスが想定される場合は「nginx」
動的ページは処理内容やサーバスペックによるため現状では判断できない(要調査)
ある程度の同時アクセスが見込めない場合は「Apache」
同時アクセス数は小さく、単純にリクエスト数が多い場合は「Apache」
http://vitalify.jp/blog/2012/08/apache%E3%81%A8nginx%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E6%84%9F%E6%83%B3.html

※ http://www.slideshare.net/ttkzw/nginx-intro のサイトによると動的コンテンツはapacheの方が早いっぽい。
【Cocos2d-x 3.x】複数の画像を1枚のSpriteに合成する

cocos2d-x 3.x系で、複数の画像をまとめる記事がなかったので書きました。
2.xだと、Spriteのcreateは最初に１つすればよかったんですが
3.xだと、１番最後にしたvisitしか表示されなかったので、for文の中でSpriteの生成を行いました。

たくさんの画像を1つのSpriteとしてて合成して表示すると、描画処理の軽減しパフォーマンスの向上が期待できます。

```cpp
Size visibleSize = Director::getInstance()->getVisibleSize();
    
RenderTexture* tex = RenderTexture::create(visibleSize.width, visibleSize.height);
this->addChild(tex);
//texture焼き込み開始
tex->begin();

//たくさんSpriteを作る
for(int i = 0; i < 1000; i++) {
    Sprite* sprite = Sprite::create("image.png");
    //addChildしないnodeはretainすること
    sprite->retain();
    //visit前に、画面上の位置や大きさなど指定
    sprite->setPositionX(i);
    //visitすると、textureにSpriteが焼き込まれる
    sprite->visit();
}
//texture焼き込み完了
tex->end();
```
サイトに設置したツイートボタンから Twitter に投稿されたら、なにか処理を行う


サイトに設置したツイートボタンが押されて、ツイートの投稿まで完了したら、なにか処理を行う、というサンプルです。

Twitterのツイートボタンには、イベントを検知する仕組みが用意されていました。
↓こちら公式のドキュメント。
[Scripting: Events | Twitter Developers](https://dev.twitter.com/web/javascript/events)

---

コード。

```html
<a href="https://twitter.com/share" class="twitter-share-button">Tweet</a>

<script>
// ツイートボタン
window.twttr = (function (d,s,id) {
var t, js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;
js.src="https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });
}(document, "script", "twitter-wjs"));

// ツイート完了後のコールバック
function afterTweet(intent_event) {
	if (intent_event) {
		console.log('ツイート完了');
	};
}

// イベントにコールバックをバインド
twttr.ready(function (twttr) {
	twttr.events.bind('tweet', afterTweet);
});
</script>
```

1. ツイートボタン押される
2. ツイート用のウィンドウが開く
3. ユーザが実際にツイートを完了する (イベント発火)
4. バインドしておいたコールバック関数が実行される

という流れ。
CSS設計についての備忘録

# CSS設計の教科書を読んだ
読了。今まではCSSの書き方ばっかで、構成についてとかの本は少なかったけど比較的読みやすく良本だった。
読んでいて、これはメモらねばと思ったのをだらだらまとめた。

## 破綻しやすいCSS -HTMLの構造に依存-
生のセレクタに当てると、HTMLの構造が変わった時に辛い。
これ、例外もあるけどたまにやってしまってるので気をつけたい。

```html:駄目なパターン
<section>
  <h1>
    破綻しそう
  </h1>
</section>
```

```css:駄目なパターン
section h1 {
  font-size: 20px;
}
```
Classセレクタを使っていこうぞい。

```html:良いパターン
<section class="saikou">
  <h1 class="sikou-title">
    破綻しそう
  </h1>
</section>
```

```css:良いパターン
.sikou-title {
  font-size: 20px;
}
```

## コンポーネントについて
普段、SMACSSを利用してるけど、いまいちやり方が正しいのか不安だったのでその払拭に繋がった。

* base --default style
* layout --layout style (header, footer...)
* Module --almighty category
* State --javascript style
* Theme --change theme

### 接頭語

layoutには接頭語にl-を付ける。
moduleには接頭語にm-を付ける。
stateには接頭語にis-を付ける。

### 意図

* クラス名の重複に寄る競合と汚染を減らすように書く。
* クラス名を見て、どのコンポーネントの拡張かが分かるように書く。
* セレクタの詳細度を減らす。

### 他の開発者とのやりとり

開発においては、多分個人の判断でこれがないとCSS書きたくないとかは通用しないのでお互いに
相談したほうが良さそう。(どういう設計、どんなコンポーネントを参考にするか)
あと、引き継ぎのためにもドキュメントは必ず用意しといた方が良い。
最近、BEMっぽいCSSを引き継いだけどドキュメント無くて割と辛かった思い出がある。

## どうやって設計するか

### 最適化を意識しすぎない
全ての場面で再利用できるようなコンポーネントを作るのは不可能と考える。
それと、初期段階から無理に最適化しようとしない。

## DRY:Don't Repeat Yourself
DRYの精神に従って、同じ実装を三回しようとしたら一旦書くのを辞めてコードを見直す。
THE リファクタリングチャンス。

## SOLID CSS

* single Responsibility Principle --単一責任
* Open / Closed Pricciple --開放/閉鎖

### 単一責任の原則
1つのオブジェクトは1つの責任だけ持つべき。
一つのclassに見た目の装飾や、位置の装飾が重なりすぎるのはあまり良くない。
軽い気持ちで分離してみる。

### 開放/ 閉鎖の原則
1つのコンポーネントにスタイルを当てすぎない。
過剰に制御し過ぎることで、結果再利用が不可能になったり新たに書く必要がある。
最低限のスタイルを付与するのを意識する。

## 運用に必要なルール

### コメントを付ける
コンポーネントの説明だったり、マークアップ例だったり。
コメントが冗長的にならないように気をつける。

### ドキュメント / スタイルガイドを作る。

色んな会社のコーディングルールとか見て、君だけの最強のドキュメントを作ろう。

スタイルガイドは
* styledecco
* kalei
* KSS

らへんがメジャー。
実際にkalei採用してみたけど良い感じだった。
パイプラインツールwalterをCircleCIに入れて動かす



walterはこちら。 [シンプルなパイプラインツールwalterを少しだけ試してみた - Qiita](http://qiita.com/sawanoboly/items/0b2afedd7949cd045e82 "シンプルなパイプラインツールwalterを少しだけ試してみた - Qiita")

## testやdeploymentにwalterだけ書けばいいようにできるかな

CircleCIヘルプののcustom softwareを参考に。

[Install custom software - CircleCI](https://circleci.com/docs/installing-custom-software "Install custom software - CircleCI")

全容はこちら。

https://github.com/OpsRockin/the_walter_visits_with_circleci


## circle.yml

インストールしたらキャッシュしよう。

```circle.yml 
---
dependencies:
  pre:
    - bash ./ci/install-walter-0.1.0.sh
  cache_directories:
    - "~/walter"
test:
  override:
    - walter
```

## dependencies-preの中身

`~/bin/`にリンクを張ればパスが通るのでそうしてみた。

``` ci/install-walter-0.1.0.sh 
set -x
set -e
W_VERS=0.1.0
W_DIR=walter_linux_amd64

mkdir -p ~/walter/${W_VERS}

if [ ! -e ~/walter/${W_VERS}/${W_DIR}/walter ]; then
  wget https://github.com/walter-cd/walter/releases/download/v${W_VERS}/walter_linux_amd64.tar.gz
  tar xvzf walter_linux_amd64.tar.gz -C ~/walter/${W_VERS}
fi

sudo ln -sf ${HOME}/walter/${W_VERS}/${W_DIR}/walter ${HOME}/bin/walter
```

## walter動くかな

動いた。Golangめ。

![OpsRockin_the_walter_visits_with_circleci__7_-_CircleCI.png](https://qiita-image-store.s3.amazonaws.com/0/7454/d0953112-2b62-8eec-dfa3-8f29670fc760.png "OpsRockin_the_walter_visits_with_circleci__7_-_CircleCI.png")

今のところShellを並べるのと使い勝手や取り回しやすさは変わらないけど、少しだけおしゃれだ。