OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftで国名コードの変換

iOSで国名コードの数値から国名を取得する方法のメモ。


## NSLocaleに含まれる国名コード一覧
[ISO 3166-1](http://en.wikipedia.org/wiki/ISO_3166-1)の一覧はiOSのNSLocaleでも取得できるのだが、こちらは"JP"のようなAlpha-2 codeのArrayのみが用意されている。

``` Swift
NSLocale.ISOCountryCodes() // ["AD", "AE", "AF", "AG", "AI",...]
```


## 数値コードから国名への変換
数値コードからのAlpha-2やShort Nameを取得できるテーブルがなかったので、独自に変数に定義しておくことにした。

サンプルとしては以下のようなコードになる。Dictionaryの全文は長くなるので省略。

``` Swift
// Sample ISO 3166-1 Dictionary
let ISOCountryCodes = [250: "FR"]

// Sample input value
let countryNumericCode = 250

// Convert to country name
let countryCode = ISOCountryCodes[countryNumericCode]
let countryName = NSLocale.currentLocale().displayNameForKey(NSLocaleCountryCode, value: countryCode) // "France"
```

バリューに国名を定義せずに一度"JP"のような表記を経由しているのは、多言語対応のため。
currentLocaleを使うことで、デバイスの設定に合わせた表記で国名を取得できる。
gnuplotでワイルドカードを使用する方法


以下のようにスクリプトを作りloadすることで擬似ワイルドカードを利用できる。

## 例：data*.datをまとめてプロットしたい
```gnuplot:renbann.plot
list = system("ls data*.dat")
plot for [i=1:words(list)] word(list, i) title word (list, i)
```

##解説

- system("シェルで実行したいこと")でシェルの結果を受け取れる
- guplot上でlist =  “文字列1 文字列2 文字列3”は配列扱い
- word(list , i)でアクセスすることが可能
- words(list)で配列の長さがわかる
- plot for[i=最初:最後:インクリメント]  でループ内容を重ねてプロットという構文になっている。
bashで変数を宣言する


## はじめに

bashのビルトインコマンドのdeclareを使って変数を宣言する方法を記述します。

変数の型を指定したり、デバッグで使用できたり。
大文字、小文字を変換するなど、変わった機能もあります。

## 環境

* Amazon Linux AMI release 2014.03
* bash 4.1.2

## 変数を宣言する

* 変数を数値として宣言する

iオプションを使用します。

```bash
declare -i num=1+2
str=1+2

echo $num # => 3
echo $str # => 1+2
```

* 変数を配列として宣言する

aオプションを使用します。

```bash
declare -a array=( Java Ruby Python )

echo ${array[0]} # => Java

echo ${#array[*]} #=> 3(配列の要素数)

for e in ${array[*]}
do
  echo $e # => Java, Ruby, Pythonの順に出力
done

for i in ${!array{*}}
do
  echo ${array[i]} # => Java, Ruby, Pythonの順位出力
done

```

* 変数を連想配列として宣言する

Aオプションを使用します。

```bash
declare -A hash=([Jack]=11 [Queen]=12 [King]=13)

echo ${hash['King']} # => 13

for v in ${hash[*]}
do
  echo $v # => Jack, Queen, King(順序は任意)
done

for k in ${!hash[*]}
do
  echo "$k:${hash[$k]}" # => Jack:11, Queen:12, King:13(順序は任意)
done
```

* 読み込み専用の変数とする

rオプションを指定します。

```bash
declare -r ro_var='readonly variable'

echo $ro_var # => readonly variable

ro_var='writable?' # => エラーになる
```

* 環境変数としてエクスポートする

xオプションを使用します。

```bash
declare -x env_var='environmental variables'
export -p | grep env_var # => export env_var="environmental variables"

export -p | grep TZ # => (出力なし)
date # => Wed Sep  3 15:14:37 UTC 2014

declare -x TZ='Asia/Tokyo'
export -p | grep TZ # => export TZ="Asia/Tokyo"
date # => Thu Sep  4 00:14:37 JST 2014
```

* 変数の内容を出力する

pオプションを使用します。

```bash
declare -i num=1+2
declare -a array=(Java Ruby Python)
declare -A hash=([Jack]=11 [Queen]=12 [King]=13)
var='Hello, World!'

declare -p num # => declare -i num="3"
declare -p array # => declare -a array='([0]="Java" [1]="Ruby" [2]="Python")'
declare -p hash # => declare -A hash='([Jack]="11" [King]="13" [Queen]="12" )'
declare -p var # => declare -- var="Hello, World!"
```

* 変数を大文字へ変換する

uオプションを使用します。

```bash
declare -u upper_var='hello, world!'
echo $upper_var # => HELLO, WORLD!
```

* 変数を小文字へ変換する

```bash
declare -l lower_var='HELLO, WORLD!'
echo $lower_var # => hello, world!
```

## 参考

* [6. シェルスクリプトの作り方（7/8）](http://merry.whitesnow.jp/SEMICMD/SECTION6/section6_7.html)

* [たぶん使わないであろうBashのデバッグ方法](http://dharry.hatenablog.com/entry/20111108/1320690055)

* [Bash Reference Manual](http://www.gnu.org/software/bash/manual/bashref.html)
Xcode 6 Beta 7での変更点への対応

Xcode6 Beta6でコンパイルできていたコードが、Beta7ではコンパイルできなくなったので対応したメモ。
今回のアップデートでは、一部の関数定義の引数に書かれていた"!"がなくなり、戻り値がOptional型になったものがあるようだ。

## メンバ変数の型変更への対応
例えばStoryboardにあるViewに関連付けされたControllerでstoryboard変数にアクセスすると、Optional型が返ってくるようになった。

```
self.storyboard
```

という風にアクセスしていた変数に対して、例えば

```
self.storyboard!
```

のような形でアンラップして対応した。


## 関数の引数の型変更への対応
前項とほぼ同じだが、一部の関数で引数が変更されている。少しはまったのが**UITableViewとUICollectionViewのDataSourceプロトコルの変更**。各種DataSourceプロトコルで関数の引数に書かれていた"!"マークがなくなった。こちらはプロトコルの関数定義に合わせることで対応。
この変更により、独自に定義しているDataSourceクラスでは"does not conform to protocol"エラーが発生していた。
他にもsegue周りでもoverrideしていた関数の引数が変わっている箇所が見受けられた。


## ブロックを引数にとる場合にnilを渡せなくなった箇所への対応
ひとまず空ブロック"{}"を渡して対応。
ブロックを引数にとる全ての関数で変更されたのかは確認していない。


---


必要な箇所に"!"または"?"を付けるか外せばコンパイルは通ったが、箇所によってはアンラップの仕方を考えた方がよいかもしれない。
WebWorkersで巨大データ転送の不思議

Web Workersで、worker間でデータをやりとりする際、普通はpostMessageにオブジェクトを渡すだけでことが足りる.

```js:Simple.js
array = new Uint8Array(1000 * 1000 * 256);
// ★
worker.postMessage({
  array: array
});
```

しかし、WebWorkersの`postMessage`は参照ではなく、データの実体をコピーして飛ばすため、`array`のサイズがデカくなってくると、workers間のデータ転送のオーバヘッドが馬鹿にならない.
重たい処理をUIから分離するためにWebWorkersを活躍させたい時に困ってしまう.

そこで、登場するのがpostMessageの第2引数.
ここにTransferableなオブジェクト(`Uint8Array`や`Float32Array`がもつ`ArrayBuffer`はTransferable実装)を喰わせると、データ実体ではなく、データの参照が送信されるため、転送オーバヘッドは限りなく小さくなる.

```js:Tranferable_1.js
array = new Uint8Array(1000 * 1000 * 256);
// ★
worker.postMessage({
  array: array
}, [array.buffer]);
```

ただ、この方法で問題なのは、一旦送信してしまうと、送信元のworkerでは`array`を扱えなくなる、という点[^shared_array].
送信元workerで、送信後は`array`に対して、値の参照も更新も許されなくなり、`delete array`されているのと大差ない状態になってしまう.

[^shared_array]: 2017.09.27追記: [Shared Array Buffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer) が利用可能になれば解決する問題ではある

そこで、送信前に`Uint8Array`のコピー、`array2`を作成し、こいつのTranferableデータを送信してみる.

```js:Transferable_2.js
array = new Uint8Array(1000 * 1000 * 256);
// ★
array2 = new Uint8Array(array);
worker.postMessage({
  array: array2
}, [array2.buffer]);
```

確かに元々の`array`を送信している訳ではないので、`postMessage`後も`array`を送信元workerで触ることは出来る.
もちろん僕も最初は「それって第2引数無で送信していたパターン(冒頭のSimple.js)と大差ないんじゃね？」と考えていた.

そこで、上記3パターンで、`//★`の箇所から、送信先の`worker.onmessage`のリスナに到達するまでの時間を計測してみた([jsfiddle](http://jsfiddle.net/Quramy/43xtunhz/embedded/result/)に動作コードをおいておく).

256MBのデータをChromeで試した結果、下記となった.

+ Simple：500msec程度
+ Transferable_1: 70msec程度
+ Transferable_2: 180msec程度

Transferable_1が最も速いのは当然なのだが、SimpleとTransferable_2に明らかに差がでている.
Firefoxでも試したが、数値は異なるものの傾向は傾向はChromeの場合と変わらなかった.

正直、何故なのかはサッパリ判らないのだが、どっかで使えるかもしれないので残しておく.
muttで本文の文字化け対策

今まで機種依存文字が入っている場合、`| nkf -w`で確認していたがさすがに辛いので探してみた。

# 設定

```bash:.muttrc
auto_view text/plain
```

```bash:.mailcap
text/plain; nkf -w; copiousoutput
```

# 動作確認

```bash:
mutt
```

いけた！
Command Line で使用しているツールまとめ vol.9


##iftop

ネットワーク接続を監視する。

```bash:
$ pacman -S iftop
```

##htop

topコマンドを操作しやすくしたインターフェイスを提供します。cpu監視など。

```bash:
$ pacman -S htop
```

##slabtop

メモリ使用率を表示します。

```bash:
$ pacman -S procps
```

参考:https://gist.github.com/iZRIdJJ53S/6916239

##AIDE

侵入検知システムです。簡易な設定スクリプトがあるので、それを使用してみては。

```bash:
$ pacman -S aide
```

```bash:
$ sudo aide -D

$ aide -i

$ aide -u
```

cronで定期に通知する。

```bash:
#!/bin/bash -e

# these should be the same as what's defined in /etc/aide.conf
database=/var/lib/aide/aide.db.gz
database_out=/var/lib/aide/aide.db.new.gz

if [ ! -f "$database" ]; then
        echo "$database not found" >&2
        exit 1
fi

aide -u || true

mv $database $database.back
mv $database_out $database
```

参考:https://wiki.archlinux.org/index.php/AIDE

##chkrootkit

マルウェア検出。

```bash:
yaourt -S chkrootkit
```

参考:
http://centossrv.com/chkrootkit.shtml
http://www.gentoo.org/doc/ja/security/security-handbook.xml?part=1&chap=13

##FluidSynth

リアルタイムソフトウェアシンセサイザー。作曲の時に使います。

```bash:
pacman -S fluidsynth
```

> 簡単に fluidsynth を使って MIDI ファイルを再生することができます:

```bash:
$ fluidsynth -a alsa -m alsa_seq -l -i /usr/share/soundfonts/fluidr3/FluidR3GM.SF2 example.midi
```

参考:https://wiki.archlinux.org/index.php/FluidSynth

##sox

> SoX は広く利用されているほとんどの形式の音声ファイルの読み取りと書き出し, およびオプションでそれらにエフェクトを適用することができる

```bash:
$ pacman -S sox
```


参考:
http://www.hcn.zaq.ne.jp/___/unix/sox-ja.html
http://superuser.com/questions/627608/how-to-extract-vocals-from-music-using-a-command-line-software
Swift - Xcode 6 Beta 7 における変更点

私がYAPC疲れ(?)で寝込んでいる間に出たようですね[Xcode6 Beta7]。やはり[前回]: から二週間感覚で。9日にはいろいろ発表もあるようなので、Betaはこれが最後かな…

[Xcode6 Beta7]: https://developer.apple.com/swift/resources/
[前回]: http://qiita.com/dankogai/items/9058a8d4209cf59580db

といっても今回はとても少ないです。事実上たった一つで、それも以前の変更から自然と導かれる結論ですから。

## Optional型に関するさらなる改良

これは前回に引き続きなので省略

## `Characters`と`+`演算子

`Character`は`+`で連結できなくなりました。連結する場合は`String(c1) + String(c2)`などとしてください。

今回ははじめて更新してからこれを書いたのですが、私がgithubに上げている主なswiftプロジェクトはほとんど無変更で動きました。一月前ぐらいが嘘のようです…

Dan.the.Swift.Newbie
Cakephp2.4.10でオリジナルのExceptionRendererとException

http://be-hase.com/php/497/
を参考に、ApiExceptionとAppExceptionRendererを自作して、
app/Lib/Error/に配置したところ、

App::import('Lib', 'Error/ApiException');
App::import('Lib', 'Error/AppExceptionRenderer');

では「Error: Class 'ApiException' not found」になってしまった。


api/lib/Cake/Error/ErrorHandler.php
を参考に

App::uses('AppExceptionRenderer', 'Error');
App::uses('ApiException', 'Error');

に直したらうまく行ったけど・・・
同じバージョンのcakephpで同じディレクトリ配置で、importでうまく行ったのだけどなぁ。
うーん。

？？？
[C++11] ref-qualifierとメンバ関数とthis

C++11ではクラスのメンバ関数をref-qualifier修飾できる。
メンバ関数に対するref-qualifierは、メンバ関数の暗黙のパラメタ(*thisに対応する)に対するref-qualifierとなる。
ただし、メンバ関数がref-qualifier修飾されていない場合、暗黙のパラメタはlvalue-reference修飾される。(N3337 13.3.1 第4段落)

```cpp
struct foo
{
  void f() &; //1
  void f() &&; //2
};

foo a;
a.f(); //1が呼ばれる
foo().f(); //2が呼ばれる
```

この機能はmoveセマンティクスをより多くのシーンで使うために導入された。
ところで、この規格の元でC++11のオーバーロード解決の仕組みを用いると、既存のコードが動かなくなる。
なぜなら、lvalue-referenceはrvalueを束縛できないからだ。
すなわち

```cpp
struct foo
{
  void f() &;
};

foo().f(); //rvalueはlvalue-referenceで束縛できない

struct hoge
{
 void f() const&;
}; 

hoge().f(); //const-lvalue-referenceならばできる。
```

この規格の変更はあまりにも多くの既存のコードを破壊するので、次の例外が追加された。

ref-qualifier修飾されていないメンバ関数のオーバーロード解決においてのみ、const修飾されていなくても、rvalueを暗黙のlvalue-referenceパラメタに束縛できる。(N3337 13.3.1 第5段落)

```cpp
struct foo
{
 void f() &;
};

foo().f() ; //今やちゃんとfoo::fが呼ばれる。
```

ところで、アルティメットメタプログラマー諸兄ならば、&と&&が違うだけの似たようなコードを２つ書くよりも、メタプログラミングによるスリム化を好むだろう。

ところが、恐らくそれはできない。
なぜならば、呼び出し元のクラスオブジェクトについての情報はthisを通しとのみ入ってくるが、*thisは常にlvalueである。従って、decltypeを使って、ref-qualifierを引っ張りだす事はできない。

悲しい。

もし、ref-qualifier修飾されていないメンバ関数内で呼び出し元のクラスオブジェクトの型を取得する方法を知っている人がいたら教えてほしい。

追記:なぜか括弧が消えていたので直した。
Play Framework-routes設定


routes設定が軽く調べた内容のメモ
Play Frameworkのルータ設定は以下のファイルで行っている


```
/path/to/project/config/routes
```

```
play new [プロジェクト名]
```

コマンドでアプリを生成するとroutesは以下のようになっている

```routes
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET     /                           controllers.Application.index

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)

```

上記設定からわかるようにroutesファイルの設定方法は以下の形式になっているらしい

```
[METHOD] [PATH] [CONTROLLER-ACTION]
```


より詳細は以下を読む
>
https://www.playframework.com/documentation/2.1.1/ScalaRouting
http://blog.livedoor.jp/tattyamm/archives/4116069.html
http://www.atmarkit.co.jp/ait/articles/1302/21/news016.html
http://netmark.jp/2012/12/play-framework-routing.html
http://playframework.blog.fc2.com/blog-entry-6.html
Scala + PlayFramework(主にmacで)

## 環境構築

### Scala

http://qiita.com/shoma2da/items/b131c53ffa958c9386f7

これでScalaが動くところまで試せる

### Play Framework

http://seratch.hatenablog.jp/entry/20120410/1334074688
http://seratch.hatenablog.jp/entry/20120118/1326888522

macなら

```
brew install play
```

したあとにプロジェクトを作りたいディレクトリで

```
play new [プロジェクト名]

What is the application name? 
> [プロジェクト名]
```

で行ける


### エディタ
IntelliJ IDEA
http://www.jetbrains.com/idea/

有償版もあるがJava Scalaで無料で利用できるCommunity Editionがあるのでこれがおすすめ

IntelliJ IDEA + Scala + Play Framwork環境構築
http://d.hatena.ne.jp/absj31/20130119/1358590311
http://www.playframework-ja.org/documentation/2.1.5/IDE


ここに書いてあることをやればローカルでのplayの起動+IntelliJ IDEAを使用したデバッグまでの環境構築が完了


一応コマンドをまとめると
IntelliJ IDEAでPlayを利用するためのJavaのパッケージ？を/path/to/project/.idea/に生成するコマンドは

```
play

[プロジェクト名] $ idea with-sources=yes
```

を行う



IntelliJ IDEAのデバッグコンソールを利用できるようにするにはIntelliJ IDEAで
>
Run/Debug Configurations の設定ダイアログを開き、Run -> Edit Configurations をクリックします
Remote 設定を追加し、Remote を選択します
以下の内容を設定します。
名前を設定する
Transport: Socket を設定する
Debugger mode: Attach を設定する
Host: localhost を設定する
Port: 9999 を設定する
インポートしたモジュールを選択する
Apply をクリックし、ダイアログをクローズします

を設定してから

```
play debug

[プロジェクト名] $ run
```

でplayを起動してからIntelliJ IDEAでブレークポイントを設定して
http://localhost:9000
を開くとブラウザでページ読み込みが完了しないで設定した部分のブレークポイントでページが止まる
レスポンシブHTMLをJS使って楽にコーディングしたかった。


## やりたかったこと
HTMLの文章構造を残しつつ
画像を多用するレスポンシブで
記述をなるべく少なく.data()を使ってうまいことできないか画策してた。

普段指定しているimgタグの属性って
width, height, alt（, class, id）くらいだから
生成されるようにしてみた。



```html:test.html

<!-- ターゲットのHTML -->
<a class="img-text" data-file="ファイルパス" data-class="hoge-class">ここがaltになるよ</a>
<h1 class="img-text" data-file="ファイルパス">ここがaltになるよ</h1>


<!-- 生成するHTML -->
<a class="img-text" data-file="ファイルパス" data-class="hoge-class">
<img src="ファイルパス" alt="ここがaltになるよ" width="10" height="10" class="hoge-class">
</a>
<h1 class="img-text" data-file="ファイルパス">
<img src="ファイルパス" alt="ここがaltになるよ" width="10" height="10" class="hoge-class">
</h1>

```

```javascript:test.js

// デバイスに合わせた画像のセット
pageObj.Responsive.setImage = function(aElmName)
{

    var type = pageObj.type + '/';

    var dom = $(aElmName);


    dom.each(function() {
        var that = $(this);
        var param = {
            alt   : that.text(),
            path  : 'images/' + type + that.data('file')
        };


        var imgTag = $('<img>');
        imgTag
            .load(function(){
                // スマホの時はサイズを半分にする
                if (type === 'sp/') {
                    this.width  = parseInt(this.width / 2, 10);
                    this.height = parseInt(this.height / 2, 10);
                }
                that.html(this);
            })
            .attr('src',    param.path )
            .attr('alt',    param.alt )
            .attr('width',  param.width )
            .attr('height', param.height );


        // クラス追加処理
        var className = that.data('class');

        if (typeof className !== "undefined" &&
            className !== '') {
            imgTag.addClass(className);

        }
    });
};

pageObj.type = 'pc';

// 呼び出し
pageObj.Responsive.setImage('.img-text');

```
```bash:directory
images/pc/hoge.jpg
images/sp/hoge.jpg
```


## そもそもで
レスポンシブってコレでよかったんだっけ感。
youtube-dlでYouTube動画をダウンロードする方法

# 1. はじめに

ここに記載されているのは、【2014.09.04 現在】の情報です。
記載されている内容を実行して問題が起きても責任はもてないのでご了承ください。

2015.02.22よりバージョン変更によってこの記事の方法では使えなくなりました。
「[【2015.02.22】youtube-dlが更新され以前のバージョンで使えなくなった件](http://qiita.com/fantm21/items/38b38f07dfac2af00bfe)」を参考にしてください。
# 2. youtube-dlのDLとインストール

[youtube-dlのダウンロードページ](http://rg3.github.io/youtube-dl/download.html)

## 手順1 DL

UNIX系(Linux,OS Xなど)は以下のコマンドをターミナルで実行するとyoutube-dlをダウンロードできます。

```
$ sudo curl https://yt-dl.org/downloads/2014.09.01.2/youtube-dl -o /usr/local/bin/youtube-dl
$ sudo chmod a+x /usr/local/bin/youtube-dl
```

もしcurlを入れていない場合は、wgetからもできるらしいです。

```
$ sudo wget https://yt-dl.org/downloads/2014.09.01.2/youtube-dl -O /usr/local/bin/youtube-dl
$ sudo chmod a+x /usr/local/bin/youtube-dl
```

## 手順2 インストール

pipを使えるようにしている人は次のコマンドをターミナルで実行するとyoutube-dlをインストールできます。

```
$ sudo pip install --upgrade youtube_dl
```

pipを入れていない人で、Homebrewを入れている方は以下のコマンドをターミナルで実行していただけるとインストールできるらしいです。

```
$ brew install youtube-dl
```

# 3.YouTube動画のダウンロード方法

youtube-dlをインストールするところまで終わりましたら以下の方法で動画をダウンロードすることができます。

```
$ youtube-dl (動画のURL)
```

 (動画のURL)にダウンロードしたい動画のURLを入れて実行していただければダウンロードが始まります。
「テキストボックスのフォーカス時に選択状態にする」を少しだけクロスブラウザ対応した

以下のコードでinputタグをフォーカス時に選択状態になるようにしたら、
SafariとかAndroidブラウザとかで動かなかった。

```html:HTML
<input id="test"></input>
```


```js:JS
var input = document.getElementId("test");
input.onfocus = focusInput;

function focusInput(e) {
	if (e) {
		var target = e.target;
		target.select();
	}
}
```

というわけで以下のコードに変更



```js:JS
var input = document.getElementId("test");
input.onfocus = focusInput;

function focusInput(e) {
	if (e) {
		(function(e){
        setTimeout( function() {setFocus(e);});
	})(e);
	}
}

function setFocus(e) {
	if (e) {
		var targetTag = e.target;
		targetTag.focus();
		//とりあえず全選択、選択範囲指定したいときはbgnとendを適宜指定
		var num = targetTag.value.length;
		var bgn = 0;
		var end = num;
		if(typeof(targetTag.selectionStart) != "undefined"){
			targetTag.selectionStart = bgn;
			targetTag.selectionEnd = end;
		} else if(document.selection) {
			var range = targetTag.createTextRange();
			range.collapse();
			range.moveEnd( "character", bgn );
			range.moveStart( "character", end );
			range.select();
		}	
	}
}
```

FireFox,Chrome,Safari,IE9,IE11,Android標準ブラウザ,Mobile Safari(iOS7)ではとりあえず動きました。
その他

##ミスらないためのほにゃらら Tips
こんなもん既出だろとかどっかのパクリだろと言われても、そうだとしか言えないので言うだけ無駄。
自分がやっていることなので一般的か知らん。
しかしMarkdownが打ちにくい。
なんか言語と関係ないことばっかりだから分離することにした。

####壊れるようにコードを書く
壊れるとは、ミスったらコンパイルエラー、その他エラー、例外などですぐ止まるように書くことである。
コピーしたとき間違ってキーを触り、変な所にペーストして気付かないことが結構ある。エラーが出てくれればいいが、それを通ってしまうと潜在バグになる。
コピペはファイルコピーならマシだが、出来るだけ自前で打った方がバグ率が下がると思う。タイポしてもコンパイラが怒るだけで実害は無い。コピペミスは実害に直結するから危険である。
綱渡りのようなコードを書いて、ミスったら単純に動作しないようにしてもよい。

####直感と一致させる
コードの見た目で正しい、正しくないが分かるように書く。得てして糞コードと呼ばれるものは難読化されており、熟読しても意味が分からないことがある。そして見た目通り正しく動作しないのである。
処理を分割して見た目の直感で正しいと思える書き方をすべきである。

####自己完結する
入力チェック出力チェックは他がやるから不要なんてことはない。誰も信じてはいけない。モジュールが自分だけで確実に動くように、確実に動かないように実装する。個々が動いている事が保証できればそれ以外の不具合に集中できる。

####結合度を下げる
一番悪いのは変数共有の内容結合である。そんなことをしているといつまでもバグが取れないし、修正の影響範囲も拡大して収集が付かない。悪くても関数の引数で渡すような処理にする。
グローバル変数よりも最悪な、変数の使いまわしは地獄を見るのでやめた方がいい。スコープを切って影響を小さくした方が精神衛生的に推奨される。
C系統の言語は意味もなく波括弧で括ることができるのでスコープ分割可能である。

####つづく
思いついたら更に追記してゆく。
brew コマンド（複数）をまとめてスクリプト化

こんにちは。
homebrew で動かすことが多い brew コマンド（複数）はまとめてスクリプト化。

```ruby
#!/usr/bin/ruby
require 'yaml'

brewcmds_yml = <<EOS
- "brew list --versions \| awk '{printf(\\"%-18s %s\\\\n\\",$1,$NF)}'"
- "brew cask list \| cut -d' ' -f1 \| xargs -I % bash -c \\"echo -n %' '; ls -C /opt/homebrew-cask/Caskroom/%\\" \| awk '{printf(\\"%-18s\\",$1);$1=\\"\\";print}'"
- "brew --config"
- "brew tap"
- "brew update"
- "brew doctor"
- "brew outdated"
EOS

for brewcmd in YAML.load(brewcmds_yml)
    puts "% " + brewcmd.gsub(/\|.*/, "")
    puts `#{brewcmd + " 2>&1"}` # for sh/bash
end

brewcmd = "brew outdated"
brew_outdated = `#{brewcmd + " 2>&1"}`.gsub(/\n/, " ") # for sh/bash
puts "% " + brewcmd
puts `brew info #{brew_outdated}` unless brew_outdated.empty?

exit(0)
```
- [brew cask list ＋バージョン表示](http://qiita.com/kkdd/items/a4e75e95d0445499e3c6) も加えてあります。
RDBで継承っぽいテーブル設計をするべきか否か


DB設計をしていて継承っぽいテーブル設計にした方がスマートに実装出来そうな気がしたので、
継承した時のそうでない場合のメリットデメリットを考えてみた。

例) ソシャゲでありがちな課金アイテムとログインなどで獲得できる通常アイテム

普通に設計するならばcharge_items と normal_items テーブルがあります。
ただログインボーナス(1日目にこのアイテムあげる)みたいなテーブルを作ろうとした場合に
ログインボーナステーブルには、charge_item_id と normal_item_id を持たなければならなくて、
課金アイテムだけプレゼントする場合はnormal_item_idが0として登録される。

なんか気持ち悪い…もし、特別なアイテムが増えた場合にテーブルが増える可能性があり、
その場合にテーブル追加に加えて,ログインボーナステーブルにレコードを追加しなければならない。
ソースコードも大幅に変更する可能性が出てくる。

![スクリーンショット 2014-09-23 23.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/35451/8391de81-3d5a-9edc-2441-402d23d7d29f.png "スクリーンショット 2014-09-23 23.28.52.png")

そんな時に継承っぽい設計にしたらどうだろうか。
charge_itemsとnormal_itemsにitem_masterへのリレーションがあり、login_bonusesには
item_master_idが紐づけられている。

![スクリーンショット 2014-09-23 23.35.13.png](https://qiita-image-store.s3.amazonaws.com/0/35451/4d4ea44c-7f45-92b2-cb0e-7f91b2a9ed52.png "スクリーンショット 2014-09-23 23.35.13.png")

なんか良い感じな気がする。
もし特別なアイテムが増えたとしてもテーブルを増やすだけで、他のテーブルには影響しなさそうだ。

ここいらでメリットデメリットを考えてみました。

## 前者

### メリット
1. itemテーブルにレコードを追加する時は追加テーブルだけで意識すれば良い
2. 参照時も同じく一つのテーブルで完結する

### デメリット
1. 先述したようなテーブル構成だとDBに縛られた運用しか出来なくなる可能性がある
2. id列に0が入るってなんかきもい…

## 後者

### メリット
1. テーブル追加時に影響が少ない
2. なんとなくきれい

### デメリット
1. charge_itemsテーブルにレコード追加するときはmaster_itemsにもレコードを追加しなければならない
2. 外部キーにindexを張るとしたらレコード追加時のコストが増加する

## 結論
参照が多い場合は後者、追加更新が頻繁にあるようなシステムであれば前者を適用するのが良いんですかね〜。
この辺のベストプラクティスみたいなのご存知の方いらっしゃいましたらご教示ください。


## 追記
railsであればポリモーフィックという継承ちっくな実装を提供しているということでこれを使えば良さげですね。
http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/11/04/173742
CDIコンテナにSeasar2のコンポーネントを移す（その１）

## Java EE の CDI

Java EE 7 が登場してから JAX-RS や CDI (Contexts and Dependency Injection) など、便利なモノが用意されていますね。

JAX-RSはアノテーションによるコーディングが基本となっており、共通コンポーネントなどはCDIの@Injectで依存性を注入したり、その際にAOPで横断的な処理を追加できます。

## S2コンテナのDI

ただ、Seasar2 の S2Container を利用して開発をしている方は、CDIを使おうとすると、
DIコンテナが2重管理となってしまい、なんだかコードが複雑化してきます。

では、DBアクセスにはS2JDBCを利用して、プレゼンテーション層にはJAX-RSを利用したい場合にどうするか。

## JAX-RSとS2JDBCを組み合わせたい

例えば、JAX-RSのライブラリとして、Jerseyを利用した場合、SAStrutsでいうところのActionクラスは、Jerseyサーブレットによって生成されます。

SAStruts + S2JDBC の場合は、アクションの中に、@Bindingというアノテーションを書いておけば、ServiceクラスをDIする事ができました。

```java:
@Binding
protected CustomerService customerService;
```

しかし、Jerseyを利用した場合には、S2コンテナを通じてプレゼンテーション層のActionに相当するクラスが生成されないため、上記ではDIする事ができません。

そのため、やるとすれば下記のようなやりかたになります。

```java:
@Path("{id}")
public Customer getCustomer(@PathParam("id") String id) {
    CustomerService customerService = SingletonS2Container.getComponent(CustomerService.class);
    return customerService.findById(id);
}
```

## S2JDBCのコンポーネントをCDIに移す

もし、JAX-RSと相性の良いCDIを利用することができたら下記のように修正できます。

```java:
@Inject
private CustomerService customerService;

@Path("{id}")
public Customer getCustomer(@PathParam("id") String id) {
    return customerService.findById(id);
}
```

このようにすることでDIが一本化されます。

## CDIの初期化

やり方はJerseyの場合だと、ざっくり下記になります。

1. S2Containerを初期化する
2. JAX-RSを初期化する
3. ResourceConfigの中で、S2ContainerのComponentDefを全て取り出す
4. 取り出したComponentDefの内容をhk2のServiceLocatorに登録する

## 具体的なやり方

[CDIコンテナにSeasar2のコンポーネントを移す (その２)](http://qiita.com/hirokapi/items/c8c105015bb2a7a69e1f)

<del>
時間が無くなってきたので詳細また今度。。<br />
スミマセン。。
</del>
iOS UIWebViewでrequest http header をカスタムする方法


## 結論
UIWebViewでUser-Agentを変更する
http://takemasa5.tumblr.com/post/3172884263/uiwebview-user-agent

ここに書いてあるとおりの方法でよかった

1. UIWebViewControllerのサブクラスを作る MyWebViewControllerとする
2. MyWebViewController.hでUIWebViewDelegateプロトコルを宣言する
2. storybordから1.のクラスを画面のContorllerに指定する
3. storybordからwebViewのdelegateに1.で作ったクラスを指定する
4. MyWebViewController.m で、保管は出ないが気にせずに以下を実装する

```objective-c
-(NSURLRequest*) uiWebView:(id)webView 
				  resource:(id)identifier 
		   willSendRequest:(NSURLRequest *)request 
		  redirectResponse:(NSURLResponse *)redirectResponse 
			fromDataSource:(id)dataSource
{
	NSMutableURLRequest *req = (NSMutableURLRequest*)request;
	[req setValue:@"ヘッダーの値" forHTTPHeaderField:@"ヘッダーのキー"];

	return req;
}

```

隠しDelegateとか言われてもわからんよね！！！！

## 駄目だった方法
iphone - Specifying HTTP referer in embedded UIWebView - Stack Overflow http://stackoverflow.com/questions/7913305/specifying-http-referer-in-embedded-uiwebview

これは、無限ループ制御がめんどくさいし、何故かPOSTメソッドの時にGETメソッドになってしまう（参考URLのコードのそれっぽい部分を消しても！）

## 参考
眠いめも: webView:shouldStartLoadWithRequest:navigationType:でloadRequestするとPOSTがGETになる http://blog.fspm.jp/2013/01/webviewshouldstartloadwithrequestnaviga.html
NSDataのbase64エンコードがiOS SDKで出来る？！

なんだと、base64エンコードするのに外部ライブラリが要らない？！

```objc:外部ライブラリを使わずにbase64エンコードとデコード
NSString* deviceTokenBase64 = [deviceToken base64Encoding];
NSData* deviceTokenData = [[NSData alloc] initWithBase64Encoding:deviceTokenBase64];
```

iOS8も出たし、iOS6.0はもう対応しなくていいことにしてこれを使い続けたい・・・。
（iOS6.0では使えないそうです）
Xcode6で簡単テーマ変更（Alcatrazプラグイン）

どうしてもエディタのテーマを[monokai]にしたくて・・・。
探したら、えらい簡単に設定できましたので、皆さんもお試しあれ。

環境は、出たばかりのXcode6です。

# 1. Alcatrazのインストール

Xcodeにプラグインを追加しようとすると、これまでは「目的のプラグインをダウンロードして、ビルドして、~/Library/Application Support/Developer/Shared/…に入れて、…」なんてやっていましたが、Alcatrazはそんな面倒な作業をすべてやってくれます。

http://alcatraz.io/

インストール方法はとても簡単。公式サイトの言うとおり、ターミナルに1行コピペして実行するだけ。

```
$ curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh
```

インストール終了。

# 2. テーマ[monokai]のインストール

Xcodeを再起動すると、メニューに

```
Window > Package Manager
```
が追加されていますのでポチリ。

Package Managerウィンドウの左から3番目の扇子みたいなアイコンが「カラースキーム」です。

[monokai]を発見したら、左の扇子みたいなアイコンをクリックすると、即座にインストールされます。
※プレビューで確認したい場合は、右側の目のアイコンでプレビューが開きます。

インストール終了。

# 3. テーマの適用

念のためXcodeを再起動し、メニューの

```
Xcode > Preferences
```

さらに、

```
Font & Colors
```

のタブを見ると[monokai]があるので適用して、
めでたし、めでたし♪

お疲れ様でした♪
【Ruby on Rails】テーブルのレコード数を取得する - Model

Railsで**テーブルのレコード数**を取得したいとなった場合の話。

例えば、以下のようなUser Modelがあったとして

```rb
class User < ActiveRecord::Base
end
```

以下のように**countメソッド**を使えば、レコード数が取得できる。

```rb
User.count
```

SQL的には、以下のようなことが多分行われている、はず！

```sql
SELECT count(*) AS count_all FROM users

```

んで、やりたかったことはテーブルからランダムに1レコード取得したいみたいなこと。
その時に、レコード数の範囲で乱数を生成したかったので、countメソッドを使った。

```rb
User.find_by_id(rand(User.count) + 1) 
```


以下のページでも、色々書かれているので参考程度に。

####[【Rails】sizeとcountとlengthについて](http://d.hatena.ne.jp/masterpiyo/20111013/1318532274)

なんかもっといい方法ありそうな気もするけど、とりあえず動いてる！
./configure,makeの流れを作るアレ


![autotools-process.png](https://qiita-image-store.s3.amazonaws.com/0/6664/ab459115-3ca7-ddf3-2886-d52cba9f8d82.png "autotools-process.png")
[Using Autotools - Gnome Developer](https://developer.gnome.org/anjuta-build-tutorial/stable/create-autotools.html.en)より


C/C++でのちょっと大きい構成でのMakefileのコンパイル記述法めんどくさいですよね。
それを、簡単にかつ環境に合わせて生成してくれるAutoMake/Autotoolsというのツール群あるのですが、それもさらに複雑でめんどくさいです。

Automake以外にも[CMake](http://www.cmake.org/)や[waf](https://code.google.com/p/waf/)と言ったもう少し簡単なツールもあるのですが、どれもそこまで簡単ではないし、世の中の既にAutoMakeで作られているプロジェクトを改変する場合は避けて通れないので、これについてメモ程度に解説を残しておこうかなと思います。自分も毎度調べていて疲れてきたので。

ここでは、以下の2つの実際にあるであろうシチュエーションにわけて説明します。

1. 自分でも結構手の込んだC/C++のプロジェクトを作ろうと思った時
2. 他人の作ったプロジェクトで`./configure`がコケてしまう時


## 1. 自分で作る時

まず、重要な入力と出力を確認しておきましょう。ソースコード以外に、必要なのはMakefile.amというMakefileよりも簡単な定義文だけです。

そこから`./configure`が出来るようにするために、`configure`ファイル自身の生成、それがMakefileを作成する時に用いる`Makefile.in`と`config.h.in`を作成するのが目的です。これら以外のものは全て中間生成物です。

まとめると以下のようになります。

### 入力：

- ソースコード(`hello.h`, `hello.cc`, `main.cc`)
- `Makefile.am`

```Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello.cc hello.h main.cc
```

### 出力

- `configure`
- `./configure`が参照する`Makefile.in`と`config.h.in`

### 作成のフロー

作成のフローを解説しているサイトはたくさんあるので、自分は1工程ごとにcommitしたgitリポジトリを作ってみました。これのcommit履歴とREADMEを参照してください。

https://github.com/awakia/automake

使うコマンドの順番としては以下の順で、間にところどころ書き換えや名前の置換えが入ります。

- autoscan
- autoheader
- aclocal
- automake
- autoconf
- ./configure
- make


細かい解説はREADMEにREFERENCEと書かれているドキュメントを読むのがいい気がします。僕は実際にこれらの解説を読んでこのコミット群を作りました。

上のGnome Developerの図では、configure.acは自分で用意することになってますが、autoscanを使うと自動生成できます。
autoheaderで`config.h.in`を作成する部分も書かれてませんね。

## 2. 他人のconfigureを修正する時

上記の事がわかっていると、`./configure`がうまく行かなかった場合、以下の3つの事ができるようになります。

1. configureを修正する。
2. configure.ac(昔はconfigure.in)を必要なら修正して、autoheader(大抵automakeからでOK)からやり直す。
3. Makefile.amを必要なら修正して、autoscanからやり直す。

3.の方に行けば行くほど直すべきファイルの行数が少ないので直しやすくなるはずです。
D言語でOpenCLを使えるようにする準備をした

リポジトリは https://github.com/YusukeSuzuki/opencl.d に置いた。

動機と感想
=============

個人的に使用するネイティブオブジェクトを出力するコンパイル言語はD言語に軸足を移そうと考えている。現在D言語のライブラリはC/C++ほどは数がなく充実したCライブラリを有効活用する意味でもCのライブラリを利用する手法を身につける必要があった。

個人的に興味があり、またdubで提供されていないOpenCLをD言語で利用する練習台にした。

OpenCLのC APIはプリミティブな関数の集合であるため実際の利用にはさらに高級なフレームワークを組む必要があるが一旦は使えるようになった。

D言語の場合、整数型のバイト数が言語により規定されているので型周りの書き換えは楽だった。

またOpenCL C APIはほとんどの構造体の実装を隠蔽しているため構造体のアライメントをそろえる部分の悩みは発生しなかった。

出来上がったD言語のモジュールを利用するには配列のポインタの仕様などCとは異なる部分で書き方を考える必要があった。このあたりは高級なフレームワークでラップしてしまった方が良いと思う。

参考資料
=============

概ね [C の .h ファイルから D のモジュールへの変換](http://www.kmonos.net/alang/d/htomodule.html) に記述されている通りの手順で動作させることができた。 

作業
=============

* dubプロジェクトを作る
* dub.json に「"target" : "library"」、「"libs" : ["OpenCL"]」を記述
* source/ に cl.d を作って CL/cl.h をひたすらD言語の記述に書き換えていく。

迷ったところ
=============

* 関数ポインタを渡すAPIの引数は function で記述すること。

できてない・わかっていないところ
=======================================

* Windows向けにはAPIに \_\_stdcall を付さなければならない。cl.h ではマクロで対応しているがD言語にはマクロがないため同一ソースファイルで切り替えることができていない。\_\_stdcall を付すには(Windows)の記述をすればよいが同一ソースファイルで想定する全環境に対応するにはどうすればよいか。 → extern(System) で対応できた。本記事のコメントを参照。
* dubで利用できるようにしたい。ローカルリポジトリに登録する方法を身につけないといけない。
* ライセンスをどうしようか。
rspec3でredirect_to request.refererをテストする

request.refererをスタブ化して、redirect_toメソッドを使う。

```rb
def signout
  # do something
  redirect_to request.referer
end
```

```rb
  describe '#signout' do
    subject { get :signout }
    before { allow(request).to receive(:referer).and_return('/test') }

    it { is_expected.to redirect_to('/test') }
  end
```
日本語OCRライブラリNHocrを利用してみる


[NHocr](http://sourceforge.jp/projects/nhocr/)は日本語用OCR(光学文字認識)用ライブラリ。

割と世界的に有名な[tesseract-ocr](https://code.google.com/p/tesseract-ocr/)より日本語の性能は良いということで使ってみることにした。
ちなみに、どちらもライセンスはApache License V2.0。

性能を評価してくれているブログ( http://g86.dbcls.jp/~yag/wordpress/archives/1351 )を見つけたのだけれど、これにインストールできなかったとかいてあるとおり、すんなりとはインストールできなかったのでインストールの仕方を書いておく。

## ./configureでのfailの解決

```bash
$ configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... ./install-sh -c -d
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/Users/aikawa/Downloads/nhocr-0.22':
configure: error: C compiler cannot create executables
See `config.log' for more details
```

config.logをみてみる。

```config.log
...
configure:2898: checking whether the C compiler works
configure:2920: gcc -O3 --unroll-loops  -DDICDIR=\"${datarootdir}\"  conftest.c  >&5
clang: error: unsupported option '--unroll-loops'
configure:2924: $? = 1
configure:2962: result: no
...
```

となっているので、`configure`ファイルから`--unroll-loops`フラグを全て削除。

```diff:configure
+ test "x$CFLAGS" = "x" && CFLAGS="-O3"
+ test "x$CXXFLAGS" = "x" && CXXFLAGS="-O3"
- test "x$CFLAGS" = "x" && CFLAGS="-O3 --unroll-loops"
- test "x$CXXFLAGS" = "x" && CXXFLAGS="-O3 --unroll-loops"
```


## makeでのfailの解決

```bash
$ make
...
In file included from makechar.cpp:18:
/usr/local/include/ft2build.h:56:10: fatal error: 'freetype/config/ftheader.h' file not found
#include <freetype/config/ftheader.h>
         ^
1 error generated.
...
```

となる。

```bash
sudo ln -s /usr/local/include/freetype2/freetype /usr/include/freetype
```

としてあげれば良い。

## テスト

まずはテスト用画像の作成。とりあえず、この投稿をスクリーンショットでとったものを利用してみた。
> ![nhocr.png](https://qiita-image-store.s3.amazonaws.com/0/6664/d343a886-1d41-dacf-f49b-300fd5dd1d6d.png "nhocr.png")
nhocr.png


入力の形式はPBM/PGM/PPMのどれかということなので、convertを使ってpngから変換。

```bash
convert nhocr.png nhocr.pgm
```

性能テスト

```bash
$ NHOCR_DICDIR=dic nhocr/nhocr -block -o - nhocr.pgm
日ホ語OERライブラリHHOErを利用レてみる
H世ffは日本語用OEft光学丈宇認諦ユ用ライ7ラリ。
割と世界的に有括な±壁事Et%上\エ【よp日本語の性能は良いということ7使ってみ舌ことにした。
写なみに、 ヒ葦ちもライセンスはA叩Ch巳 LtC巳Ti3E V10。
性龍左綱して<れている7口7仁 リ上tyノ屯革fjd典\ij上<\gg/世M町阜\坤pfjye\ユ華ユ ユ左見っけたのだけれど、 これ
にインユト‐ル7葦なかコたとかいT講6と持p、 すん#pとはインユト一ル7葦堪か7たの7インユト一ルの仕方を\いて措<。
```

うーん、まずまず・・・？
bigquery-analytics-reading #3 a2chub



# Query Caching

チャプター７で紹介した”Running Queries”で紹介したとおりに、BigQueryでは様々な結果が再利用されるように自動キャッシュが使用可能になっている。再度Queryを実行した場合には、すでに結果が出ている場合に透過的に結果を利用するのでとても便利な機能である。アプリ開発者は、別な方の手で素晴らしいユースケースを知っている。（は？ナニコレ）アプリケーションは余計なコストを掛けずに、フレッシュな情報と引き換えに情報をゲットできる。直接キャッシュをマネージメントすることでより積極的にコストを節約することが出来る。様々なwarehousingシステムは、セパレートキャッシュシステムを用いている、例えばMemocachedなどである。Queryエンジンへの読み込みを減らすかフロントエンドのオペレーションレイテンシが増える。Bigqueryでは、一般的に予備調査を行い分散キャッシュを行わないようになっている。Queryが実行されるときに結果を名前の被らない新しいテーブルに保管する。アプリーケーションでの別のパーツがQueryを実行した際に名前の違うテーブルをそれぞれ返すようにする。どうやって動いているのかは、次の章で説明する。


# Result Caching
どうやってqueryの結果に使いやすい名前をつけているのか理解するためにラスト6時間のAndroidのアクティブトップ100のランキングを生成するやり方を参考にする。なにかのリーダーボードのアプリのようなものに利用できるアレだ。例えばコレを使えばなにかのWebアプリでのナビゲーションエレメントのリーダーボードの作成などに役立つ気がするよ。
はじめに表示させる情報を適切に切り出す

```:bigquery
SELECT
  running.name AppName,
  AVG(running.memory.total) MemUsage,
  COUNT(running.name) Running
FROM
  (TIMEsTANP_TO_SEC(CURRENT_TIMESTAMP()) -
   TIMESTAMP_TO_SEC(ts)) < 60 * 60 * 6
GROUP BY 1
ORDER BY 3 DESC
LIMIT 100;
```
このシンプルなアプリケーションは6時間のwindowの情報をqueryする。このQueryはキャッシュ化出来ない何故ならば __CURRENT_TIMESTAMP__を使用している為。また、ソーステーブルにも継続的なアップデートがかかっている為である。このQueryにはソースの量に見合ったコストがかかる（多分結構な額になる、もし、このテーブルに頻繁にアクセスするようなアプリケーションを作ったならね。）

もしもっとリーズナブルにしたければ1時間は同じデータを表示させて
Raspberry PiでWiFi接続

Raspberry PiにUSB WiFiアダプタをつけた。
少しハマったのでメモ。

Raspberry Piの起動時にWiFiにつながって欲しかった。
WiFiの設定は、
/etc/wpa_supplicant/wpa_supplicant.confと
/etc/network/interfaces
で行うみたいだが、3時間くらい試行錯誤したのだけどうまく接続することができなかった。
面倒になったので、GUIからWiFiの設定を行うことにした。
マウスがないのでvnc入れてmacからリモートデスクトップでアクセスする。

```console
$ sudo apt-get update
$ sudo apt-get install tightvncserver
$ tightvncserver

You will require a password to access your desktops.

Password:
Warning: password truncated to the length of 8.
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Warning: password truncated to the length of 8.
Verify:
xauth:  file /home/pi/.Xauthority does not exist

New 'X' desktop is raspberrypi:1

Creating default startup script /home/pi/.vnc/xstartup
Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/raspberrypi:1.log
```

vnc接続用のパスワードを聞かれるので設定する。
macからはfinderでリモートデスクトップ接続できる。
finderを開いてcmd+K
vnc://xx.xx.xx.xx:5901
xxはRaspberry PiのIPアドレス。
![スクリーンショット 2014-09-23 22.14.02.png](https://qiita-image-store.s3.amazonaws.com/0/8748/2107220c-af0f-b838-56ea-cbfcaba33f74.png)

こんな感じで接続される。
デスクトップにあるWiFi Configというアイコンをダブルクリックすると、設定ツールが開く。
Adapterにwlan0が表示されていればUSB WiFiアダプタが認識されている。
Scanをクリックしてアクセスポイントをスキャンし、接続する。
これでWiFiの設定が完了する。
/etc/wpa_supplicant/wpa_supplicant.confと
/etc/network/interfaces
はこんな感じになっていた。

```zsh:/etc/network/interfaces
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
```

```zsh:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="SSID"
        psk="password"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}
```

これでRaspberry Piには電源をつないでおくだけでリモートから開発することができる。
マウス、キーボードがいらないから便利。
Flaskでloggingの設定を外部ファイルから読み込む


Flaskで普通にloggingをする場合、[Flask logging example](https://gist.github.com/ibeex/3257877)のように、

```py:app.py
app = Flask(__name__)
app.logger.debug("test message")
```

のようにすれば簡単に出来る。
しかし、`logging`の外部ファイルから設定を読み込む`fileConfig`

```py:fileConfig
import logging.config
logging.config.fileConfig("config.ini")
```

や`dictConfig`が使えない

```py:dictConfig
import logging.config
import yaml
logging.config.dictConfig(yaml.load(open("config.yaml").read()))
```

やると当然`AttributeError`となる。

```python
app.logger.fileConfig('./config.ini')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-29-70995f52c865> in <module>()
----> 1 app.logger.fileConfig('./config.ini')

AttributeError: 'DebugLogger' object has no attribute 'fileConfig'
```

そのため、`app.logger.addHandler`でコードでいちいち書かないとだめっぽく感じる。


### しかし、`app.logger`は`logging`をラップしただけなので、`app.run()`する前に`logging.config.fileConfig()`を呼べば設定は反映される。

## 設定ファイル

基本的にはやはり[ドキュメント](http://docs.python.jp/3.4/library/logging.config.html)を参照する
yamlの書き方は、`handlers`に使用する`class`(この場合は`logging.StreamHandler`と`logging.TimedRotatingFileHandler`)のコンストラクタのキーワード引数に対応させれば良い。

### 個人用テンプレ

iniよりyamlの方が好きなのでyamlを使う

```yaml:config.yaml
version: 1

formatters:
  customFormatter:
    format: '[%(asctime)s]%(levelname)s - %(filename)s#%(funcName)s:%(lineno)d: %(message)s'
    datefmt: '%Y/%m/%d %H:%M:%S'

loggers:
  file:
    handlers: [fileRotatingHandler]
    level: DEBUG
    qualname: file
    propagate: no

  console:
    handlers: [consoleHandler]
    level: DEBUG
    qualname: console
    propagate: no

handlers:
  fileRotatingHandler:
    formatter: customFormatter
    class: logging.handlers.TimedRotatingFileHandler
    level: DEBUG
    filename: log/debug.log
    encoding: utf8
    when: 'D'
    interval: 1
    backupCount: 14

  consoleHandler:
    class: logging.StreamHandler
    level: DEBUG
    formatter: customFormatter
    stream: ext://sys.stdout

root:
  level: DEBUG
  handlers: [fileRotatingHandler,consoleHandler]
```

最後の`root`を忘れるとうまく動かない
これに気付かずはまってしまった
RubymineでVagrantのリモートgemを使う方法


## アジェンダ
なぜかスムーズに行かなかったRubymineとVagrantのセットアップ
なので、メモとして残しておく

## Vagrantのセットアップ

### Box
自分で作成したものを使用。

GitHub
[fainder / vagrant-rails-starter](https://github.com/fainder/vagrant-rails-starter)

Vagrant Cloud
`fainder / ubuntu-rails-starter`

vagrant upすると以下の内容でubuntuがセットアップされる

- Ubuntu 14.04
- Ruby 2.1.3
 - rbenv 0.4.0
 - ruby_build 20140919
 - rbenv-rehash
 - rbenv-gemset
- Nodejs 0.10.32
- Postgrsql 9.3.5
- MySQL 14.14
- Redis Server 2.8.15
- Vim 7.4.52
- Zsh 5.0.2
 - Oh-my-zsh or Prezto

ZshとPreztoをセットアップして、autocdを効かせたので捗る。

ここではRubymineの方のセットアップのために、予めbundleでgemをインストールしてみる。

`vagrant ssh`し、`cd /app/Project/`で、`bundle install`

```ruby:Gemfile
source 'https://rubygems.org'

gem 'rails'
```

railsがセットアップされることとする。

## Rubymine
まずはProjectを作成せずにフォルダを開く。

![rubymine-01.png](https://qiita-image-store.s3.amazonaws.com/0/36099/be9163e7-8665-cb63-d343-6af946ac15f1.png "rubymine-01.png")

![rubymine-02.png](https://qiita-image-store.s3.amazonaws.com/0/36099/017f8863-032f-d387-5402-793d44a61aef.png "rubymine-02.png")


`Cmd + ,`でPreferencesを開く。
Deploymentsを開き、以下を修正する。
### Deployments
#### Connections

| 項目 | 内容 |
| --- | ---- |
| Type | SFTP |
| SFTP host | 127.0.0.1 |
| Port | vagrant ssh-configによる |
| User name | vagrant |
| Auth type | Key pair (OpenSSH) | ローカルのinsecure_private_keyを選択 |


![rubymine-03.png](https://qiita-image-store.s3.amazonaws.com/0/36099/ffa1d6cf-2d51-359a-a845-0aee2250e8a0.png "rubymine-03.png")

#### Mappings

ローカルのプロジェクトディレクトリとリモートのプロジェクトディレクトリをマッピングする。
![rubymine-04.png](https://qiita-image-store.s3.amazonaws.com/0/36099/a2c78227-6913-7a8e-a6ba-0683242ad82f.png "rubymine-04.png")

### Ruby SDK and Gems
+を押し、New Remote...を選択
![rubymine-05.png](https://qiita-image-store.s3.amazonaws.com/0/36099/04f0b8bc-40bc-2873-3aa6-2f8b0553345e.png "rubymine-05.png")

`Fill from deployment server settings`で読み込み。
Ruby interpreter pathを
`~/.rbenv/version/**/bin/ruby`
にすることが重要。
`shims`ではgemが読み込まれない。

OKを押すと、ローカルのRubymineキャッシュにGemがコピーされ、正常に動く。

## はまった
リモートにrbenvを使っていたので、rbenv仮想(?)のshimsの方のパスを選んでいてはまった。
元となるversionsの方を選ぶと、正常にRubymineが動いてくれた。
VineのURLからサムネイルを取得する

取得自体はページをスクレイピングすることで行う。

流れは

1. URLからDOMを引っ張ってくる
2. metaタグからサムネイルのURLを抽出する

というふうになる。
Javaでやろうと思うとコードは以下の様な感じ。
（HTTP通信には[OkHttp](http://square.github.io/okhttp/)を使用）


```java

public class VineScraping
    private static final String REGEXP_THUMBNAIL = "property=\"og:image\" content=\"(.*?)\"";
    private static final Pattern PATTERN_THUMBNAIL = Pattern.compile(REGEXP_THUMBNAIL);

    public static void main(String[] args) {
        String url = "好きなURLを入れてね";
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        OkHttpClient client = new OkHttpClient();

        Response response = client.newCall(request).execute();
        String body = response.body().string();

        Matcher thumbnailMatcher = PATTERN_THUMBNAIL.matcher(body);
        Matcher movieMatcher = PATTERN_MOVIE.matcher(body);

        if (thumbnailMatcher.find()) {
            String thumbnailUrl = thumbnailMatcher.group(1);
            System.out.print(thumbnailUrl);
        }
    }
}
```

### 参考

- [Pulling Vine Videos Through Twitter’s API with PHP & jQuery](http://blog.templatemonster.com/2014/04/16/pulling-vine-videos-through-twitters-api-php-jquery/)
- [PHP FUNCTION: GET VINE APP VIDEO THUMBNAIL](https://halgatewood.com/php-get-vine-app-video-thumbnail/)
Expose Docker's TCP ports on systemd-based distributions

Originally posted in http://aespinosa.github.io/blog/2014-09-23-expose-docker-tcp.html

Useful when spawning Fedora, Centos 7, ArchLinux or CoreOS-based Docker hosts
for development on a Mac.

```
[vagrant@docker ~]$ cat /etc/systemd/system/docker.socket.d/10-tcp.conf 
[Socket]
ListenStream=5555
[vagrant@docker ~]$ 
```

Now on your OSX machine, you can use docker via "docker -H ip-of-vm:5555".

## References
  * <https://wiki.archlinux.org/index.php/systemd#Editing_provided_unit_files>
  * <https://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F>
DynamoDB Import/Export メモ


DynamoDBの Import/Export で使うファイル形式がちょっと特殊なのでメモしておきます。

## ドキュメント

http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-importexport-ddb-pipelinejson-verifydata2.html


## フォーマットメモ

* データは下記のようなテキストフォーマット。

```
カラム名<ETX>{タイプ: 値}<STX>カラム名<ETX>{タイプ:値} ...
```

* カラム名と値の間に ETX という制御文字が入り、カラム間にSTX という制御文字が入る。（上記の <, > は含まず）
* 1行の区切りは 改行（LF）
* Importの際は、ファイル名をテーブル名にする。
* タイプ：値の部分は JSONエンコードしておくこと。
* タイプの部分には、Stringの場合s, Numberの場合n のような文字列を入れる。小文字じゃないとだめ。


例

```
name<ETX>{s:yamada}<STX>age<ETX>{n:21}
name<ETX>{s:sato}<STX>age<ETX>{n:46}
```


ETX と ETX はPHPで生成すると下記のような感じ。

```
<?php

$etx = chr(3);
$stx = chr(2);

```

## 参考

制御文字(ETX, STX)参考：
http://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97


実装例

https://github.com/inouet/kettle/blob/master/src/kettle.php

ORM#toImportFormat
Dartで作成したChromeアプリ を、Chromeウェブストア に登録してみた

DartでChromeアプリを作成し、Chrome Store へアップデートしてみました。いくつか、躓いた部分がありましたので、レポートする事にしました。

### ○Javascript 化した、Chromeアプリが動作しない問題

Dartで作成している段階では、普通に動作していました。しかし、javascriptに変換後はうまく動作しません。
Chromeアプリとしてではなく、ブラウザー上で動作させると、想定した通りに動作するみたいなので、変換に失敗している訳ではなさげ。


[アプリの内容]
以下のようなアプリです。

* UIは、Dart Web toolkit を使用(
http://akserg.github.io/dart_web_toolkit_showcase/build/index.html )
* TCP/UDPを使用
* UPnpを利用して、PortMapする


#### xx.dart.jsを使用しないで、xx.dart.precompiled.jsを使用
解決方法は簡単で、生成されたJavaScript版のアプリは、「
xx.dart.js」へリンクしている部分を「xx.dart.precompiled.js」に変えると良いみたいです。
※ CPS関連のエラーがでていたのですが、理由は深くは追っていません。

[具体的には]
今回作成したアプリは、

```lang:生成されJavascript
|_web
| |_app.css
| |_app.dart
| |_app.dart.js
| |_app.dart.js.map
| |_app.dart.precompiled.js
| |_app.html
| |_background.js
| |_dart_icon.png
| |_mainview.dart
| |_manifest.json
```

となっていたのですが、この、app.htmlの中の、「app.dart.js」を、「app.dart.precompiled.js」に変更する事で動作するようになりました。


### ○Chrome ストアへ登録で必要なこと/もの

以下が詳しいです。
http://www.ibm.com/developerworks/jp/opensource/library/os-extendchrome/

#### Chrome ストアにデベロッパー登録
開発者登録をしましょう。500円かかります。
https://chrome.google.com/webstore/developer/dashboard

#### ZIPで固めてパッケージ化する
Chrome用のアプリなので、CRXファイルに固めるのではと推測される方もいるでしょう。しかし、Chromeストアにアップするためには、Javascriptに変換したものを、ZIPで圧縮します。


```lang:生成されJavascript
|_build
| |_web
| | |_ xxx
```
のwebフォルダー配下を、zipで圧縮します。

```text:圧縮ファイルの中身
unzip -l web.zip とすると、
web/xxx
web/package/xx
..
```

となる感じです。
#### 画像を用意する
##### アイコンを用意する(must)
今回、128x128のアイコンを用意しました。

##### スクリーンショットを用意する(must)
今回は、640x400のスクリーンショットを一枚用意しました。

##### プロモーションタイル(must)
今回は、440x280の画像を用意しました。


### ○補足

* Google playと比較すると、かなり早く反映されます。
 登録時に、数分で反映されます。とか、最大60分で反映されます。とか通知をうけるのですが、それよりも短い時間で反映された気がします。
* 今回登録したアプリのソースはここ ( https://github.com/kyorohiro/HetimaPortMap )
* 登録したアプリはここ ( https://chrome.google.com/webstore/detail/hetimaportmap/naifildeohmcocnmibaampijofhcohif )
* アイコン作成に使用したアプリはここ ( https://itunes.apple.com/jp/app/art-text-2-lite/id425147621 )
CLOCK_REALTIMEとCLOCK_MONOTONIC

systemdにはdual_timestampという構造体がある。

```c:src/shared/time-util.h
typedef struct dual_timestamp {
        usec_t realtime;
        usec_t monotonic;
} dual_timestamp;
```

realtimeとmonotonicという2種類の時刻を同時に保持するためのものである。Linuxにはこの2種類の時刻があることは知っていたが、違いを把握していなかったので調べてみた。

Linux(というかPOSIX)では、clock_gettime(2)システムコールで経過時間を測るための時刻を得ることができる。上記二つの時刻は、それぞれ`CLOCK_REALTIME`と`CLOCK_MONOTONIC`フラグを指定することで取得できる。[Man page of CLOCK_GETTIME](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/clock_gettime.2.html)や[Difference between CLOCK_REALTIME and CLOCK_MONOTONIC? - Stack Overflow](http://stackoverflow.com/questions/3523442/difference-between-clock-realtime-and-clock-monotonic) の説明によると、それぞれの時刻には以下の違いがあるようだ。

- CLOCK_REALTIME
  - NTP等によってシステムの現在時刻が変更されると、clock_gettimeも大きく変化することがある(時刻が戻る可能性がある)
  - なので、ベンチマーク等で経過時間を測りたいときには向かない
- CLOCK_MONOTONIC
  - 時刻はかならず単調増加する
  - システムの時刻変更の影響を受けるが、大きく変化することはないし、時間が戻ったりもしない

Linuxでは、それ以外にも`CLOCK_MONOTONIC_RAW`という時刻が取得可能で、こちらはNTP等の時刻変更の影響を全く受けないらしい。では、こちらの方が経過時間の計測に向いているかというと、(上記Stack Overflowのコメントによると)そうでもないらしい。なぜそうなのかはまだ理解していないので、またいずれ調査するかもしれない。
Goで見かける構造体パターン

よく見かける構造体の使い方のざっくりメモ。
名前はまったく思いつかなかったので、ケース別に。
Goroutineを使わないもの縛り。

## コンストラクタの設定をする

http://play.golang.org/p/kE-Jnd1-2b

```go
type Foo struct {
  Param Param
}

type Param struct {
  Name string
}

// コンストラクタ
func NewFoo(name string) *Foo {
  p := Param{name}
  return &Foo{p}
}

func main() {
  f := NewFoo("Hello")
  fmt.Println(f.Param.Name) // "Hello"
}
```

Goにはコンストラクタがないので、`New`を接頭語にした関数を用意して
そこに初期値を設定出来るようにする。

## エラー出力を整形する

http://play.golang.org/p/xuFvcvkA8R

```go
type Foo struct {
	Name string
}

func (f Foo) Error() string {
	return fmt.Sprintf("Error: Foo's %s error message.", f.Name)
}

func main() {
	f := Foo{"Special"}
	panic(f) // panic: Error: Foo's Special error message.
}
```

errorにはinterfaceが定義されている。

```go
type error interface {
    Error() string
}
```

`func Error() string`を実装すれば、どの構造体を`panic`などで表示されるフォーマットを定義することが出来る。

## 基本型にメソッドを追加する

http://play.golang.org/p/URwsnne6lM

```go
type num int

func (n *num) IsEven() bool {
	return (*n % 2) == 0
}

func main() {
	var n num
	for n = 1; n < 10; n++ {
		fmt.Println(n, ":", n.IsEven())
	}
}
```

基本型にメソッドを追加して、普段は通常の型と同じ使い方をしながら
一部の処理でメソッドを呼び出すようにする。

## テンプレートからファイルを作成して実行する

(ここの主旨とズレるけれど)

http://play.golang.org/p/paI3ZPzRel
(Playgroundでは動かない)

```go
package main

import (
  "fmt"
  "io/ioutil"
  "os"
  "os/exec"
  "path/filepath"
  "text/template"
)

type Params struct {
  Message string
}

func main() {
  dir, _ := ioutil.TempDir("", "foo")
  defer os.RemoveAll(dir)

  m := Params{"Hello World"}

  path := filepath.Join(dir, "main.go")
  f, ) := os.Create(path)
  if err != nil {
    panic(err)
  }
  defer f.Close()

  err = tpl.Execute(f, m)
  if err != nil {
    panic(err)
  }

  cmd := exec.Command("go", "run", path)
  cmd.Stdout = os.Stdout
  cmd.Stderr = os.Stderr
  if err = cmd.Run(); err != nil { // "Hello World"
    fmt.Errorf("`go run` failed: ", err)
  }
}

var tpl = template.Must(template.New("foo.tmpl").Parse(`
package main

import "fmt"

func main() {
  fmt.Println("{{ .Message }}")
}
`))
```

revelやgooseなどで使われている。
一旦Configの値をソースコードとしてファイルに書き出してからそれを実行。
これがベストプラクティスなのかはよくわかりません。

# 参考

* [Error handling and Go](http://blog.golang.org/error-handling-and-go)
PromotionのWebScreenでページ読み込み前の背景色を変更


### やりたいこと
PromotionのWebScreenでページロードが完了するまでの間、背景が白いままだと、処理がうまくいっていないように見えてしまうため、背景色を変更したい。

### 解決方法
on_initメソッドをオーバーライドして、webviewのbackgroundColor、opaqueを設定する。

```ruby
  def on_init
    super
    self.webview.backgroundColor = UIColor.redColor
    self.webview.opaque = false
  end
```

* on_loadメソッド内でwebview.backgroundColorを設定しようとしても、webview(UIWebViewのインスタンス)が生成されていないため設定ができなかった。このあたりはあらためてPromotionのコードを追ってみたいと思います。
JSONな配列を、指定の項目でソートをかける、PHPとRuby比較


よくあるんだか、ないんだか分からないけど、連想配列とかで特定の値を元にソートをかけたい時がありますよと。そんな時、PHPとRubyだとどんな書き方の違いになるのか比較してみた。ちなみに、普通の配列じゃなくてJSONからやっているのは、特に意味はない。

例えば、こんな感じのJSONがあったとして、idの値で降順にソートしたい…。なにがなんでもしたい。という場合。特に外部ライブラリなど使わず普通に言語の機能として書ける方法。

```javascript:json
[
	{
		"id": 1,
		"title": "title1"
	},
	{
		"id": 3,
		"title": "title3"
	},
	{
		"id": 2,
		"title": "title2"
	}
]
```

# PHPでソート

PHP5.3以降であればクロージャが使えるので、usortが少しは楽に書くことが出来る。でも、usortは破壊的メソッドなので、使い勝手が悪い瞬間があるな…。

```php:php
<?php
	$jsonStr = <<<EOM
[
	{
		"id": 1,
		"title": "title1"
	},
	{
		"id": 3,
		"title": "title3"
	},
	{
		"id": 2,
		"title": "title2"
	}
]
EOM;

	$json = json_decode($jsonStr);
	
	// idの値、降順でソート
	usort($json, function ($a, $b) {
		if ($a->id == $b->id) return 0;
		return ($a->id > $b->id) ? -1 : 1;
	});
	
	var_dump($json);
```

```php:php結果
array(3) {
  [0]=>
  object(stdClass)#2 (2) {
    ["id"]=>
    int(3)
    ["title"]=>
    string(6) "title3"
  }
  [1]=>
  object(stdClass)#3 (2) {
    ["id"]=>
    int(2)
    ["title"]=>
    string(6) "title2"
  }
  [2]=>
  object(stdClass)#1 (2) {
    ["id"]=>
    int(1)
    ["title"]=>
    string(6) "title1"
  }
}
```

# Rubyでソート

Rubyは、sort_byでブロック使ってソートが可能。記述量も少ない。わりと覚えやすいと思う。

```ruby:Ruby
require 'json'

jsonStr = <<"EOM"
[
	{
		"id": 1,
		"title": "title1"
	},
	{
		"id": 3,
		"title": "title3"
	},
	{
		"id": 2,
		"title": "title2"
	}
]
EOM

json = JSON.parse(jsonStr)

# idの値、降順でソート
p json.sort_by { |hash| -hash['id'].to_i }

# idの値、昇順でソート
p json.sort_by { |hash| hash['id'].to_i }

```

```ruby:Ruby結果
[{"id"=>3, "title"=>"title3"}, {"id"=>2, "title"=>"title2"}, {"id"=>1, "title"=>"title1"}]
[{"id"=>1, "title"=>"title1"}, {"id"=>2, "title"=>"title2"}, {"id"=>3, "title"=>"title3"}]
```
セーブデータの横にセーブ時刻を出したい

# やりたいこと
* セーブ機能を作った
* どれが新しいセーブかわからない
* だからセーブの保存時刻を出して分かりやすくする

# セーブの方式
* ローカルにファイルを書き出す

# やったこと
```rb
File.mtime(file_path)
```
* これだけ。
* mtime はrubyの最終更新時刻を表示するメソッド
* めちゃ便利