OmniAICreator/Qiita-1.07M huggingface dataset:
git submodule で $HOME からの相対パスを指定する方法


メモです。

git config 系の設定ファイルには基本的に環境変数は使えません。
[なんかサブシェルを呼び出す方法もあるらしい](http://stackoverflow.com/questions/11262010/shell-variable-expansion-in-git-config)ですが、
僕が必要な機能はタイトルにあるような機能だけで、
しかも結構簡単な解法を見つけたので書いておきます。

自分の場合、実験クラスタと自分の環境をdropboxで同期しています。
どちらも ~/Dropbox/repos にbare repo が詰まっているんですが、
それをsubmoduleにしたいときに困ります。主にユーザー名が違うからです。

ダメな例

```
[submodule "planner-scripts"]
	path = planner-scripts
	url = ~/Dropbox/repos/planner-scripts.git/
```

$HOMEも使えません。解法:

```
[submodule "planner-scripts"]
	path = planner-scripts
	url = localhost:Dropbox/repos/planner-scripts.git/
```

そのときのユーザ名で自らにログインするので,これでok.
Ubuntuでインターネットラジオを聞く/録音する

- streamtuner2
- streamripper
を使うのが簡単。

Ubuntu 14.04 のパッケージ管理からインストールできるStreamtuner2のバージョンでは、SHOUTcastのリストが空になったり挙動がおかしいので、
http://milki.include-once.org/streamtuner2/
からdebパッケージをダウンロードしてインストールする。
(2014/08/31現在、バージョンは2.1.3-1)

デフォルトでは再生ソフトが入っていないので、以下のコマンドでaudaciousという再生ソフトをインストール。
```
sudo apt-get install audacious
```

これでインターネットラジオを聞ける。


録音のために、以下のコマンドでstreamripperをインストール。
```
sudo apt-get install streamripper
```

デフォルトの設定のまま、Streamtuner2で[record]ボタンを押すと、ホームディレクトリ/ラジオ局/曲.mp3 のパスに保存されて、ホームディレクトリがとっ散らかってしまう。

ホームディレクトリ/radio/ラジオ局/曲.mp3 という配置で保存ると管理しやすいので、
1. ホームディレクトリにradioフォルダを作成
2. Streamtuner2の設定、PlayerタブのRecordingセクションのaudio/* の行を ``` xterm -e streamripper %srv -d ~/radio``` に修正
Goでintが32ビットか64ビットか調べる方法

Goではintのサイズはアーキテクチャによって異なり、32ビットか64ビットのどちらかということになっている。32ビットのx86では32ビットだし、x86-64では64ビットだ。ときどきビット演算などでintのサイズがどちらなのかを知りたいことがある。そういうときにはどうすればいいだろうか？

結論から先に言うと次の式を使うとintSizeはアーキテクチャに応じて32か64のどちらかになる。

```go
const intSize = 32 << (^uint(0) >> 63)
```

uintとintは最上位ビットが符号ビットとみなされるかどうかという違いがあるだけで、同じサイズであることが保証されている。uint(0)は型なしの定数0をuintに型変換しているので、その値は32ビットか64ビットのどちらかの符号なし整数0になる。^は単項演算子のXORなので、ビットが反転されて、^uint(0)は32ビットか64ビットのすべてのビットが1の値ということになる。これを63ビット右にシフトすると、32ビットの場合は全部シフトアウトされてしまって0だけが残る。64ビットの場合は最上位ビットだけが最下位ビットとして残って結果は1になる。

32 << 0は32だし、32 << 1は64だ。従ってintSizeは32か64になる。

というわけで上記の式では正しいアーキテクチャ依存の値が得られるのである。得られた値はコンパイル時に決まる定数（const）なので、これを使うパフォーマンス上のペナルティは定数32や64を直接書くのと変わらない。
luaのコルーチンでメニュー選択


メニュー選択って普通に組むと意外と面倒くさいんですよね。
キー入力待ち状態とカーソルの移動状態で処理を分けて、滑らかにカーソル移動させるために変数持たせて･･･とか。

こんなときこそコルーチンの出番だろうと思い、
luaのコルーチンを使って、簡易なメニュー選択画面作ってみました。


![スクリーンショット 2014-08-31 14.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/35069/ce0b6352-38f1-cdb1-72ca-77da7c14303f.png "スクリーンショット 2014-08-31 14.30.15.png")


~~~ lua
-- メニュー選択用コルーチン
c = coroutine.create(function() 
  function cursorY(idx)
    return 20 + (idx - 1) * 16
  end 
  menuIdx = 1
  repeat
    -- キー入力
    repeat
      inputed = false
      if love.keyboard.isDown("z")     then
        inputed = true
        for i=1,60 do
          selectedMenuItem = menu[menuIdx]
          coroutine.yield()
        end
        selectedMenuItem = ""
      end
      if love.keyboard.isDown("up")    then
        inputed = true
        menuIdx = menuIdx - 1
        if menuIdx < 1 then
          menuIdx = #menu
        end
      elseif love.keyboard.isDown("down")  then
        inputed = true
        menuIdx =  menuIdx + 1
        if menuIdx > #menu then
          menuIdx = 1
        end
      end
      coroutine.yield()
    until inputed
    -- カーソル移動
    repeat
      y = y + (cursorY(menuIdx) - y) * 0.2
      coroutine.yield()
    until math.abs(y - cursorY(menuIdx)) < 2
    y = cursorY(menuIdx)
  until false
end)

-- メニュー項目
menu = {"Start", "Continue", "Shutdown"}

function love.load()
  y                = 20
  selectedMenuItem = ""
end

function love.update()
  coroutine.resume(c)
end

function love.draw()
  love.graphics.setColor(122,255,255, 50)
  love.graphics.rectangle("fill", 20, y, 200, 16)
  love.graphics.setColor(255,255,255, 255)
  for idx, item in ipairs(menu) do
    love.graphics.print(item, 20, 22 + (idx - 1)* 16)
  end
  if selectedMenuItem ~= nil and selectedMenuItem ~= "" then
    love.graphics.print(selectedMenuItem, 20, 240, 0, 5, 5)
  end
end
~~~

通常ならifやswitchで処理を分けるところを、直線的に書けるのが嬉しいですね。

ちなみに、画面の表示用にゲームエンジンの[LÖVE](http://www.love2d.org/)を使用しています。
インストール方法は[永遠無窮の開発室様](http://eimu-dev.hatenablog.com/entry/2013/03/09/212404)で分かりやすく説明されています。
Goで多次元マップ（複数のキーからなるマップ）を実現したいときにはどうするか

Goのマップは内部的には1つのポインタのようなものである。ポインタの値そのものがnilのマップと、実体がメモリ上に割り当てられているがその中身が空のマップとは、似て非なるものである。nilマップを読もうとするとそれは空のマップのように振る舞うが、空のマップとは異なりnilマップには値をセットすることはできない。

```go
var m1 map[string]int      // m1はnilマップ
m2 := make(map[string]int) // m2は空のマップ
```

Goのマップでは、存在しないキーを参照したときには値のゼロ値（デフォルトの値）が返ってくることになっている。たとえば下のようなマップで存在しないキーを参照すると0が返ってくる。0はint型のゼロ値だ。

```go
m := make(map[string]int)  // キーがstring、値がintのマップ
i := m["nosuchkey"]        // iは0
```

マップのゼロ値はnilマップだ。だからマップのマップをアクセスしたとき、キーが存在しないと、nilマップが返ってくることになる。

```go
var m map[string]map[string]int

// vはmap[string]int型のnilマップ
v := m["foo"]

// wはmap[string]int型のnilマップにアクセスした結果
// （値のゼロ値 -- つまりこの場合int型の0）
w := m["foo"]["bar"]
```

さて、map[string]map[string]intは多次元マップだったわけだけど、値を読むぶんにはだいたい期待通りに動いていると言っていいと思う。しかし値をセットしようと思うとこの多次元マップは期待通りにはうまく動いてくれない。どうしてかというと、nilマップには（空のマップとは異なり）値をセットするすることができないからだ。

```go
var m map[string]map[string]int
// m["foo"]がnilなのでnilマップにセットできずパニックする
m["foo"]["bar"] = 42
```

この制限を回避するためにはかなり回りくどい書き方をしなければいけない。nilマップにセットしようとするとエラーになるわけだから、親のマップのキーが存在しているかどうかをまずチェックして、存在していなければ空のマップを割り当ててそれをそのキーにセットすればよい。とはいえどうみてもこの書き方は面倒だ。

```go
m := make(map[string]map[string]int)
if _, exist := m["foo"]; !exist {
    m["foo"] = make(map[string]int)
}
m["foo"]["bar"] = 42
```

ではどうすればいいかというと、多次元マップの代わりに1次元マップを使えばよい。複数のキーをまとめた構造体を作ってそれを1次元マップのキーにすることによって、実質的に多次元マップのようなものを単純なマップで実現することができる。コードで表すとこういうようになる。

```go
type key struct {
    k1, k2 string
}
m := make(map[key]int)
m[key{"foo", "bar"}] = 42
```

多次元マップのキーが1つの構造体に圧縮されて1次元になっているのがわかると思う。このテクニックを使うと多次元マップと同等の機能を簡単に実現することができる。
[HTML] アイコンフォントを利用する


## 概要 

アイコンフォントを利用すると、画像などを用意せずに色々なアイコンを表示することができる。
ここでは「[Font Awesome] (http://fortawesome.github.io/Font-Awesome/)」というアイコンをフォントを利用する手順を説明します。

## アイコンフォント用CSSを読み込む


アイコンフォントを利用するHTMLに下記の通りCSSを読み込むコードを追加する。


```html:アイコンフォント用CSSを読み込む
<link rel="stylesheet" type="text/css" href="http://netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.css">
```

これだけでアイコンフォントが利用することができるようになります。

## アイコンフォントを表示する

アイコンを表示したい箇所に以下のコードを追加します。
今回は例として、[フォルダ（開）](http://fortawesome.github.io/Font-Awesome/icon/folder-open/)のアイコンを表示します。

```html:フォルダ（開）アイコンを表示する
<i class="fa fa-folder-open"></i>
```

指定するクラス名一覧は[ここのページ](http://fortawesome.github.io/Font-Awesome/icons/)から確認できます。
Ubuntu 14.04 がUSBメモリからブートしない

```
ERROR:No Configuration file found
No DEFAULT or UI configuration directive found!
```
とエラーが出て起動しない場合。

USBメモリがFAT32でフォーマットされている場合は、FAT16でフォーマットしてから、起動ディスクを作成し直すとブートした。
( ※ lubuntuの「起動ディスクを作成」で、USBメモリをフォーマットすると、FAT32でフォーマットされる )

FAT16でフォーマットするのは、GPartedを使うとGUIで操作できるのでラク。

(その他、PAEの関係もあるみたい)
Xcode6.1でSwiftをHello Worldする方法



<br>
### １・Xcode6.1のインストール

以下のURLからXcode6.1のdmpをダウンロードします。

![スクリーンショット 2014-11-04 19.17.39.png](https://qiita-image-store.s3.amazonaws.com/0/15812/3af6ab1e-e1b7-6e15-48a2-8f44493692aa.png)


[Apple Developerサイト](https://developer.apple.com/jp/xcode/downloads/)



サイトに移動する時間がない方はこちらをクリックしてください。
こちらのリンクをクリックしますと自動ダウンロードされます。
[Xcode 6.1 を無料でダウンロード](https://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12#)

<br>

<b>「xcode_6.dmg」</b>というファイルがダウンロードされると思います。
このファイルをダブルクリックをして解凍、インストールを行ってください。

<b>xcode6 GMは容量が大きいため、電波環境が良い環境でのダウンロードをおすすめします。</b>


### ２・swiftのセットアップ

新規にプロジェクトを作成する際は今までのobjective-Cを起動する方法と

言語を指定する以外

は全く変わらずに行うことができました。

![qiita_2.png](https://qiita-image-store.s3.amazonaws.com/0/15812/cf8aa31d-04b0-b8e8-18b6-828f5a3d46d8.png)

![qiita_3.png](https://qiita-image-store.s3.amazonaws.com/0/15812/c703c473-1f58-6a17-3942-6d61965f68a8.png)

![qiita_4.png](https://qiita-image-store.s3.amazonaws.com/0/15812/e83c8c0f-69e7-474f-1343-5e4e1bdde78c.png)

![qiita_5.png](https://qiita-image-store.s3.amazonaws.com/0/15812/785678b8-e916-edb6-a4d7-f603621b40fd.png)
<br>

### ３・Swiftでhello world
そしてhello worldのために
「ViewController.swift」ファイル内の
override func viewDidLoad() メソッド内に

```shell-session
    println("Hello World");
```

を記述します。
すると、コンソール画面にHello worldと表示されます。

![qiita_6.png](https://qiita-image-store.s3.amazonaws.com/0/15812/bff3668d-b35b-66da-17e4-9c5a27c6777e.png)

<br>

### 余談ですが。。。

```shell-session
    NSLog("Hello World");
```

でも、問題なくコンソール画面に表示されます。
<br>
【妄想】RubyScriptをコンパイルする

Ruby2.0にはVMがついてるのでなんとかすればコンパイルしてexe化！みたいな事ができそうな気がしたので妄想tipsです。

```rb
RubyVM::InstructionSequence.compile_file('rubyソースファイル').to_a
```

でrubyソースファイルをコンパイルして命令列が取れます。
ただし、命令列はシンボルが並んでる配列なので更にマーシャリングが必要です。
せっかくなのでファイルのフルパスをキーとしたハッシュを作ってマーシャリング

```rb
Marshal.dump({
'c:/ruby/lib/hoge.rb' => 
  RubyVM::InstructionSequence.compile_file('c:/ruby/lib/hoge.rb').to_a
})
```

```ruby:bootstrap.rb
hashed_iseqs = Marsha.load('上の奴')
def require path
  RubyVM::InstructionSequence.load(hashed_iseqs['c:/ruby/lib'+path]).eval
end
hashed_iseqs['main'].eval
```

みたいな事やればコンパイルしたデータ(ファイル1個!)と
stub(適当実装ならruby.exeとbootstrap.rbとbatで)でrubyを持ってない人にでも配布できるんじゃ
っというただの妄想です。

実用化の為の問題点
・サーチパスを真面目に実装する必要がある
・どのデータを配布データに含めるかの調査
・最大の問題
 RubyVM::InstructionSequence.loadは現在使えない状態にある

```rb
require 'fiddle'

class RubyVM
  class InstructionSequence
    addr = Fiddle.dlopen(nil)['rb_iseq_load']
    fn   = Fiddle::Function.new(
             addr, [Fiddle::TYPE_VOIDP] * 3, Fiddle::TYPE_VOIDP)

    define_singleton_method(:load) do |dat, par=nil, opt=nil|
      fn.call(Fiddle.dlwrap(dat), par, opt).to_value
    end
  end
end
```
で使えるらしい
[バイトコードのローディング](http://d.hatena.ne.jp/mirichi/20140303/p1)

#で、これ何の意味があるの？
利点としてはruby.exe本体に全く手を入れなくても配布用パッケージを作れます
完全なexe化の為にはbootstrap部分を勝手に読み込むようにちょちょいっと細工してstub作らないといけませんが
iTermのVimの色を快適にした。（目に優しいデザイン）

SublimeをすててVimmerを目指す初心者です。

Vimmerを目指すからには、強制的にVimを使うので、ほぼVim画面を見て生活することになるのです。

ですので、その画面が自分の好みのデザイン（カラー）であることは、とても幸せなことなのです。

# 目に優しそうだから「hybrid」にします。

GitHubにあります。
https://github.com/w0ng/vim-hybrid


```zsh
git clone https://github.com/w0ng/vim-hybrid
```

適当にクローンしてきます。
その中にある`hybrid.vim`を`~/.vim/colors`に置きます。

あとは、.vimrcに以下のように書いたらokかと思ったのですが…。

```vim:.vimrc
colorscheme hybrid 
```

これでは効かず。。

GitHubのページに書いてあるのですが、iTerm2を使っている場合は、そっちに色の設定をしないとダメみたいです。

## iTerm2での色の設定

GitHub Gist
https://gist.github.com/luan/6362811

これを適当にとってきます。

そしたら、

iTerm -> Preferences -> Profiles -> Colors

と進みます。

「Load Presets…」

というボタンから、Importできますので、上のGitHubGistからとってきた「Hybrid.itermcolors」を設定します。

すると、Hybridを選択することができます。

![スクリーンショット 2014-08-31 12.02.09.png](https://qiita-image-store.s3.amazonaws.com/0/45822/0d536e6b-a070-bd63-dc9a-ae5490305cb6.png)

気を取り直して、以下のようにすれば完了。

```vim:.vimrc
let g:hybrid_use_iTerm_colors = 1
colorscheme hybrid
syntax on
```


# 行番号が主張してくるので、控えめにします。


デフォルト設定ですと、こんな感じ。（iTerm2の設定で、Transparency（透明度）調整しています。）


![スクリーンショット 2014-08-31 12.25.39.png](https://qiita-image-store.s3.amazonaws.com/0/45822/b8d30b28-dcc1-9fe9-1b3a-13519bb7af2c.png)


これでも充分目に優しい感じで良いのですが、行番号がちょっと僕としては主張強いなぁ、という印象なので、少し控えめにして頂いてかつ、カーソルのある行が分かりやすくなってくれると幸せです。

以下を追記しました。

```vim:.vimrc
" 行番号の色を設定
hi LineNr ctermbg=0 ctermfg=0
hi CursorLineNr ctermbg=4 ctermfg=0
set cursorline
hi clear CursorLine
```

※色は0〜7で指定できます。
vimで、`:highlight`と叩けば、現在のハイライト設定が確認できます。

そしてこんな感じになりました。

![スクリーンショット 2014-08-31 12.32.51.png](https://qiita-image-store.s3.amazonaws.com/0/45822/7d146772-bb24-26cc-efac-8752feff1563.png)


…まあ、どっちが見やすいかは、人それぞれ…好みがありますからね。
僕はいったんこれでイキます！

そろそろ.vimrcをGitHubで管理したいです。。




# 追記：Selection <- これ大事。

デフォルトの設定だと、ダブルクリックとかドラッグによって、テキストを選択した場合の、カラーデザインが、信じられないくらい見づらいです。

これを治したくて、結構時間かかりました。が、解決しました。


![スクリーンショット 2014-09-02 9.02.33.png](https://qiita-image-store.s3.amazonaws.com/0/45822/cf8c4559-1696-7dad-7a3f-ff13896100cc.png)


iTermのPreferencesの「Selection」と「Selected Text」をいじれば大丈夫でした。
デフォルトだと、「背景：黒、文字色：白」という考えられない配色となっております。
(˚¿˚)
Lightboxで画像のタイトルを改行したいときの変更箇所

==============================


モーダル・ダイアログを使って大きな画像を表示するのによく使われてる[Lightbox](https://github.com/lokesh/lightbox2)ですが、そのままだと写真の下のタイトルで改行できません。title="..."の中にbrタグを使ってしまうと、サムネイルにマウスをおいたときにbrタグがそのまま表示されてしまいます。ここではlightbox.jsの中で改行コードを<br>タグに置き換えるように書き換えます。

lightboxのバージョンは2.7.1です。

## lightbox.js
323-333行目：変更前

```JavaScript
      // Enable anchor clicks in the injected caption html.
      // Thanks Nate Wright for the fix. @https://github.com/NateWr
      // 
      if (typeof this.album[this.currentImageIndex].title !== 'undefined' && this.album[this.currentImageIndex].title !== "") {
        this.$lightbox.find('.lb-caption')
          .html(this.album[this.currentImageIndex].title)
          .fadeIn('fast')
          .find('a').on('click', function(event){
            location.href = $(this).attr('href');
          });
      }
```

323-333行目：変更後

```JavaScript
      // Enable anchor clicks in the injected caption html.
      // Thanks Nate Wright for the fix. @https://github.com/NateWr
      // 
      if (typeof this.album[this.currentImageIndex].title !== 'undefined' && this.album[this.currentImageIndex].title !== "") {
        this.$lightbox.find('.lb-caption')
          .html(this.album[this.currentImageIndex].title.replace(/\r\n/g, "<br>").replace(/(\n|\r)/g, "<br>"))
          .fadeIn('fast')
          .find('a').on('click', function(event){
            location.href = $(this).attr('href');
          });
      }
```

.htmlの部分が変更されています。改行コードが見つかると、それをbrタグに置き換えています。変更箇所はこの１行だけです。

## HTML

Lightboxでは画像のタイトルをtitle="..."、もしくはdata-title="..."で指定します。以下のように、HTMLファイル中で改行すればそれがそのまま反映されます。また空白行もそのまま反映されます。

```HTML
<a class="example-image-link" href="img/demopage/image-3.jpg" data-lightbox="example-set" data-title="Click the right half of the image

to move forward."><img class="example-image" src="img/demopage/thumb-3.jpg" alt=""/></a>

```

上のようにHTMLに書くと、

```
Click the right half of the image

to move forward.
```

のように表示されます。
SSH で Permission Denied となる傾向と対策

SSH ログインしたときに下記エラーが出る傾向と対策をまとめました。

```
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

## まずログを見る

クライアント側でこのエラーが出たら、サーバー側の `/var/log/secure` にエラーとなった原因が記録されます。最重要です。たとえば、

```/var/log/secure
Feb 26 23:58:39 server sshd[29619]: Authentication refused: bad ownership or modes for file /home/user/.ssh/authorized_keys
```

みたいに書いてあると、所有者とパーミッションなどに絞って原因を見ていくことになります。

よく原因となる確認ポイントを下記に書いていきます。

## 接続先に authorized_keys が設置されているか

公開鍵認証する場合、接続する側のマシンで公開鍵と秘密鍵のペアを作成し、公開鍵を接続ユーザのホームディレクトリ配下 `~/.ssh/authorized_keys` に設置する必要があります。

## パーミッションは適切か

公開鍵認証する場合、接続先のサーバで所有者とパーミッションが適切に設定されていることを確認します。

* /home/user/.ssh は 0700
* /home/user/.ssh/authorized_keys は 0600

にします。パーミッションに過不足があるとエラーになることがあります。

## ユーザ追加時の設定を確認する

あれいつもはこれ確認したらつながるのに、なんで今日はダメなんだ？　と思っていたら、ユーザ追加するときにログインシェルを設定していて、そのパスが存在していないのが原因でした。

具体的には、 Ansible で

```yaml
---
- name: useradd youcune
  user: name=youcune shell=/bin/zsh
```

とやっていました。この zsh のパスが存在しておらず失敗になっていたようです。死にたい。
raspbianのディスクトップをイケてる感じに変更

#概要
連休に作ったRasberry PiのOSを最近Raspbianに変えました。
理由は100均で買ったウェブカメラのドライバ(uvc)がPidoraでは動かなかったので・・・
あと、ディスクトップがRasberry PiのXはなんとなくダサくて、ウェブカメラの調子を見るのに適してないかなと個人的に思ったので、やりました！

#結果
結果的に見た目が以下のようになります。
![desktop.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/a589804f-9f5d-2d4f-c99a-c92fe398e50d.png)

#インストール
基本的には[RaspbianMate](http://www.raspbian.org/RaspbianMate)で紹介されている方法を取ります。
ただし、私の端末に問題があるのか起動が中途半端になります・・・。あと、VNCで接続する際にデフォルトがXのままなのが気に入らなかったのでその辺の変更を書きます。
（上の画像はまさにVNCでアクセスしているところです）

##手順

```bash
#OSのアップデートは済ましておいたほうが無難です
root# apt-get update
root# apt-get upgrade -y

#VIMを入れていたほうがいい感じです（Raspbianのviには手を焼きました・・・）
root# apt-get install vim

# -------MATEインストール開始
#リポジトリ追加
root# echo 'deb http://archive.raspbian.org/mate wheezy main' >> /etc/apt/sources.list

#インストール開始
root# apt-get update
root# apt-get install mate-core mate-desktop-environment

# -------MATEテスト起動
#見た目が変わりますが、途中でエラーが起きて止まります！（私だけかもしれません・・・なのでこれは特にしなくてもいいかも）
root# exec mate-session

#VNCとかでログインした際にMATEで見たいので、デフォルトのディスクトップをMATEに変更
root# update-alternatives --config x-session-manager
```
Sprite を階層的にしてみる

cocos2d-x v3 の Sprite クラス は Node クラスの派生クラスなので、addChild() により階層化することが出来るぞ。

> auto sprite = Sprite::create("hoge.png");
> addChild(sprite);
> auto child = Sprite::create("hoge2.png");
> sprite->addChild(child);

このように階層化しておくと、MoveBy などで親ノードを移動すると、子ノードもいっしょに移動してくれるぞ。
ただし、FadeOut で親ノードをフェイドアウトしても、子ノードもフェイドアウトはしてくれないようだ。

ちなみに、子ノードの座標系原点は親ノード左下点のようだ
WKWebViewでJavaScriptを読み込み前後に仕込むサンプル



WKWebViewをinit時にJavaScriptを設置します。設置したJavaScriptはページ読み込みのたびに実行されます。

`window.webkit.messageHandlers.yourKeyPath.postMessage("文字列/配列など");`
上記のJavaScriptを使うと、`userContentController:didReceiveScriptMessage:`が応答するので、yourKeyPath部分をもとに処理できます。

サンプルとして新規作成、"Single View Application"テンプレートから`ViewController.m`に以下を貼り付けると試せます。

結果としてデバッグエリアにUserAgentが表示されるはずです。

```objc
#import "ViewController.h"
#import <WebKit/WebKit.h>

@interface ViewController ()
<WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler>

@property (nonatomic, strong) WKWebView *webView;

@end

@implementation ViewController
            
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // JavaScript
    // didGetUserAgentの部分は後で使用する(任意のキャメルケース)
    NSString *getUserAgent
    = @"window.webkit.messageHandlers.didGetUserAgent.postMessage(window.navigator.userAgent);";
    
    // JavaScript挿入タイミング: ページの読み込み前かあとか
    // injectionTime: WKUserScriptInjectionTimeAtDocumentStart / WKUserScriptInjectionTimeAtDocumentEnd
    WKUserScript *getUserAgentScript
    = [[WKUserScript alloc] initWithSource:getUserAgent
                             injectionTime:WKUserScriptInjectionTimeAtDocumentStart
                          forMainFrameOnly:YES];
    
    WKUserContentController *userContentController = [[WKUserContentController alloc] init];
    [userContentController addUserScript:getUserAgentScript];
    [userContentController addScriptMessageHandler:self name:@"didGetUserAgent"];
    
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    configuration.userContentController = userContentController;
    
    _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
    _webView.UIDelegate = self;
    _webView.navigationDelegate = self;
    [self.view addSubview:_webView];
    
    NSString *urlString = @"http://www.yahoo.co.jp/";
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [_webView loadRequest:request];

}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    id body = message.body;
    NSString *keyPath = message.name;
    
    if ([body isKindOfClass:[NSString class]]) {
        if ([keyPath isEqualToString:@"didGetUserAgent"]) {
            NSLog(@"UserAgent: %@", body);
        }
    }
}


@end
```

こちらも設定しておくといいと思います。
[WKWebViewでwindow.webkit.messageHandlersが効かないサイトへの対処法](http://qiita.com/ShingoFukuyama/items/8cc10cd2a1c7a9df5ef1)
Inside appium for android(2)

# はじめに
前回の[Inside appium for android](http://qiita.com/unokun/items/4a15dc8cebdaef61b18c)は、ログを紹介しただけだったが、今回は、[appiumのドキュメント](http://appium.io/slate/en/master/?ruby#about-appium)を参考にappiumの内部構造について書く。

# Appium動作環境
アプリ動作環境(端末)とテスト実行環境から構成される。

## アプリ動作環境
端末は、``` $ adb devices ```で表示されるものであれば、実機、エミュレータのどちらでもOK。

### アプリ
開発したアプリ、プレインストールアプリどちらでもOK。
テストのための変更は不要。
これが、appiumのコンセプトになっている。

## テスト実行環境
テストを実行するPC。

### Appium(server)
Node.jsベースのHTTPサーバ。Appium(client)からの要求を端末上のアプリに仲介する。
iOS、AndroidともにSDKで提供されているツールを使ってアプリと通信する。
Androidはバージョンによって異なるツールを使う。
Instructionを使った通信には、[Selendroid](http://selendroid.io/)を使っている。

|OS|ツール|
|:--|:--|:--|
| iOS |  [UIAutomation](https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UsingtheAutomationInstrument/UsingtheAutomationInstrument.html)|
|Android | [UIAutomator](http://developer.android.com/tools/help/uiautomator/index.html) (4.2+)|
|| Instruction (2.3+)|

### Appuium(clinet)
テストを読み込み、Appium(server)に要求を実行する。
Appium(server)とSeleniumの[The webdriver wire protocol](https://code.google.com/p/selenium/wiki/JsonWireProtocol)で通信する。
各種言語のバインディングがある。
* ruby
* python
* java
* javascript
* php
* c#

![appium.png](https://qiita-image-store.s3.amazonaws.com/0/5247/a1de0d77-a3fe-1520-236d-5048bab898b5.png)

# 補足
## session
appiumとアプリ(端末)との通信は、sessionで管理されている。
テスト開始(WebDriver作成)時に作成したsessionを、終了(WebDriver破棄)時まで使う。

## Desired Capabilities
Appium用WebDriver(AppiumDriver)作成時、テスト対象について詳細な記述をする仕組み。
プラットフォーム、テスト対象アプリに関する記述を行う。
これは、Java言語でAndroid上でブラウザ(Chrome)を使ってテストする時の例。アプリの場合には、パッケージ名なども指定する。
```java
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName","Android Emulator");
    capabilities.setCapability("platformVersion", "4.4");
    capabilities.setCapability("platformName","Android");
    capabilities.setCapability("browserName", "chrome");
    driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"),       capabilities);
```

# おわりに
次は、appiumのドキュメントを日本語訳しようかな、それとも、コードリーディングしようかな。
DeviseのビューをHamlとしてカスタマイズする方法


以下の手順でDeviseのビューをカスタマイズする方法を示す。

1. カスタマイズ用ファイルを生成する
2. Hamlに変換する

## 動作環境

- Ruby on Rails 4.1.1
- Devise 3.3.0

## 1. カスタマイズ用ファイルを生成する

以下のコマンドでビューファイルを生成する。

```
$ rails g devise:views
```

## 2. Hamlに変換する

Deviseでは標準ではERBしかしていない。
一時期はHamlもサポートしていたようだが、[今後はサポートしない旨のissue](https://github.com/plataformatec/devise/issues/3005)もある。

以下、コマンドラインにてERB→Hamlに変換する方法。

### html2hamlのインストール

```
$ gem install html2haml
```

### ERB→Hamlに変換

```
$ for file in app/views/devise/**/*.erb; do html2haml -e $file ${file%erb}haml && rm $file; done
```

## 参考

- http://kitbc.s41.xrea.com/main/?use_devise
- https://github.com/plataformatec/devise/wiki/How-To:-Create-Haml-and-Slim-Views
とりあえず１からSwiftができる環境を整えようじゃないか！


機は熟した！（というか乗り遅れてる）
なんだか楽しそうと思いながらも指を咥えて傍から見ていたSwiftを、今こそ導入してやる！

同じように乗り遅れてる人の導入のキッカケにでもなれば。

## 予備知識:Swiftって今どういう状態なの？
* 誰でも無料でお試しできる(ただしAppleDevelopperの登録は必要)
* 現行のXcode5では使えず、Xcode6のベータ版で使える。
 * Xcode5とXcode6Beta版は共存可能
* Xcode6はまだBeta版なので、これで作ったアプリはまだAppStoreには提出できない。
 * iOS8が正式リリースされるタイミングで提出できるようになるらしい(2014年9月半ば？)

## AppleDeveloperに登録
Swiftが使えるXcode6Beta版を入手するには、AppleDeveloperに登録が必要（無料）。
ただし、実機でアプリの動作確認をしたり、AppStoreに提出したりするには、有料のiOS Developer Programへの登録が必要になる。

### AppleIDを作成
こちらから登録する。
https://appleid.apple.com/account?localang=ja_JP

![スクリーンショット 2014-08-30 23.50.45.png](https://qiita-image-store.s3.amazonaws.com/0/39565/107e6eed-e989-b70a-e299-5ea0f5ac4d85.png "スクリーンショット 2014-08-30 23.50.45.png")

入力したら確認メールが来るので、そこにあるリンクをクリックして登録完了！

### AppleIDをDeveloperとして登録
作成したAppleIDを使って、ここからサインイン。
https://developer.apple.com/register/index.action

![スクリーンショット 2014-08-30 23.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/39565/9cd2b1e5-07ba-dd99-0abb-b5ffbb41f960.png "スクリーンショット 2014-08-30 23.48.02.png")

いろいろ同意を求める画面が出てきたり、

![スクリーンショット 2014-08-30 23.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/39565/b6e09a1e-e9af-b435-c750-7975a30f4026.png "スクリーンショット 2014-08-30 23.48.18.png")

アンケート画面が出てきたりするけどがんばる。

![スクリーンショット 2014-08-30 23.48.36.png](https://qiita-image-store.s3.amazonaws.com/0/39565/ef9a4db9-3a46-2bca-b871-248c99a85b9d.png "スクリーンショット 2014-08-30 23.48.36.png")

## Xcode6-Beta版をインストールする

ここからdmgファイルをダウンロード（2014/8/30現在Beta6）。
2GBぐらいあるので結構時間かかる。
https://developer.apple.com/swift/resources/

![スクリーンショット 2014-08-30 23.59.08.png](https://qiita-image-store.s3.amazonaws.com/0/39565/c7c97238-0ef9-3ca5-068c-b55eb3b20c3e.png "スクリーンショット 2014-08-30 23.59.08.png")

そして入手したdmgファイルからインストール。
もちろん普通のdmgインストールと一緒。

## そして起動！
インストールが終わったら早速起動！
初回起動時やたら時間かかるけど気にしない。

起動前にまた同意画面が出てくる。
![スクリーンショット 2014-08-30 17.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/39565/c398527d-c5bc-aebc-668f-186bd860c178.png "スクリーンショット 2014-08-30 17.35.49.png")

同意すると、ついに初期画面が！
Xcode5に無かったplaygroundなるものが。
ここでお手軽に色々試せるらしいのでこれを選んでみる。

![スクリーンショット 2014-08-30 17.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/39565/0ef4dfe5-208d-4615-24d8-1a4db9e8ff02.png "スクリーンショット 2014-08-30 17.38.05.png")

適当に名前をつけて次に進むと、エディタが出現。
![スクリーンショット 2014-08-31 0.08.23.png](https://qiita-image-store.s3.amazonaws.com/0/39565/f79cb550-537b-5224-7104-042551d631a4.png "スクリーンショット 2014-08-31 0.08.23.png")

自分の環境だけかもしれないけど、最初に起動したとき、

```
Error running playground.
Unable to find suitable target device.
```

というエラーが出た。
メニューバー > Window > Device で、シミュレータが存在しなかったのでそれが原因っぽい。
Macを再起動したらうまいこといったので同じことになったひとはお試しを。

これから先はいろいろ記事がが出ているので、参考に。
http://dev.classmethod.jp/smartphone/iphone/learn-swift/
enumでNSUserDefaultsを便利に

##リテラルを使いたくない

Swiftのenumを使ってNSUserDefaultsを便利にする方法を思いつきました。 既出だったらごめんなさい。


```swift
enum MyUserDefaults: String {
    case Name = "Name"
    case Age = "Age"
    case Height = "Height"
    case Weight = "Weight"

    func set(value: AnyObject) {
        NSUserDefaults.standardUserDefaults().setObject(value, forKey: self.toRaw())
    }

    func get() -> AnyObject? {
        return NSUserDefaults.standardUserDefaults().objectForKey(self.toRaw())
    }
}
```

これで、値の設定と取得を以下のように行うことができます。

```swift
// 設定
MyUserDefaults.Name.set("田中太郎")
MyUserDefaults.Age.set(20)
MyUserDefaults.Height.set(171.65)
MyUserDefaults.Weight.set(65.63)

// 取得
if let name = MyUserDefaults.Name.get() as? String {
    name //田中太郎
}

if let age = MyUserDefaults.Age.get() as? Int {
    age //20
}
```

StringもIntegerもFloatもstructですが、AnyObjectに渡す時点でNSStringやNSNumberに暗黙的に変換されるようです。そのため、基本的にはどんな型でもsetObjectとobjectForKeyでうまくいくみたいです。

##AnyObjectを使いたくない
Stringしか使わない場合も結構あると思います。その時はStringに限定してしまうのもアリかもしれません。たいして変わりませんが…

```swift
func set(value: String) {
    NSUserDefaults.standardUserDefaults().setObject(value, forKey: self.toRaw())
}

func get() -> String? {
    return NSUserDefaults.standardUserDefaults().stringForKey(self.toRaw())
}
```

もちろん他の型で置き換えたり複数実装することも可能です。

##もっとリテラルを使いたくない
保存されるデータの可読性を無視するなら、こうすることもできます:

```swift
enum MyUserDefaults: Int {
	case Name, Age, Height, Weight

	func set(value: AnyObject) {
		NSUserDefaults.standardUserDefaults().setObject(value, forKey: String(self.toRaw()))
	}

	func get() -> AnyObject? {
		return NSUserDefaults.standardUserDefaults().objectForKey(String(self.toRaw()))
	}
}
```
そもそも保存されているデータを直接扱う機会もあんまり無いと思うのでこれでいいと思います。
一応、実際使用する際はキー被りを避けるためにPrefixとか付けたほうがいいんじゃないですかね。

##リテラルを使わなくてよい！
NSUserDefaults以外にも、NSFileManagerとかUITableViewCellとか、いろいろ活用できそうな気がします。
Swiftのenumは強力ですね。
ウェブ用バイナリベクトルデータの最近の動き

ウェブ用バイナリベクトルデータについて、フォーマットは Google Protocol Buffer に根ざした <strike>Mapnik</strike> Mapbox Vector Tiles（MVT）が多く検討されている感じがあるが、それが全てではない状況。

## メモ0: vector-tile-spec
Mapnik Vector Tiles の仕様は、https://github.com/mapbox/vector-tile-spec にある。更新は８月初旬でいったん落ち着いている。

## メモ1: Geobuf
タイル化されないデータを、座標をいじらずに MVT 類似の方式で保存する方式。https://github.com/mapbox/geobuf 。tmcw さんの単発作品かもしれない。これも更新は８月初旬でいったん落ち着いている。

## メモ2: Avecado
Mapnik 3.0 ベースの MVT コンバータ。８月末にMapQuestからリリース。https://github.com/MapQuest/avecado 内容もさることながら、MapQuest さんの MVT 周辺での動きが誰の目にも明らかになったことは興味深い。バイナリベクトルタイルに関しては、Mapboxさん, Mapzenさん, MapQuestさんあたりが活発な状況が見られる。

## TODO
三次元バイナリベクトルタイルについてまとめてみたい。Mapzen さんの http://vector-map.mapzen.com/ は有名であるが、高さ情報をデータのどのようにのせているか、確認しておく必要がる。基本的に2.5次元という感じである。CityGML陣営やCesiumで採用されている技術との関係はどうであるのか確認しておきたい。

## PS 2015-10-16
三次元ベクトルタイルについては、Cesium 3D Tiles が一つの大きな動きになってきている。
nvmでnode.jsをインストールする

* 2014/08/31現在のnode.jsの安定版のバージョン
    * Current Version: v0.10.31

![screenshot_2014-08-31_2.33.36.png](https://qiita-image-store.s3.amazonaws.com/0/49795/5421933f-1c75-58e5-f4a2-34bd67661924.png)

## Hombebrewでnvmをインストール

    brew install nvm

## nvmでnode.jsをインストール

    nvm install v0.10.31

## v0.10.31を利用する

    nvm use v0.10.31

### 以上

* 自分メモ...
Haml内でCoffeeScriptを書くことの是非

[Rails 4 で Haml を導入したらテンプレ内に Cooffee 書けて俺得だった件 - Qiita](http://qiita.com/hkusu/items/9e26b8a53a54137e4d5e)

上の記事でHaml内でcoffeescriptを書くやり方が書いてありました。

```hoge.html.haml
%a.hoge

:coffee
  $('.hoge').on 'click', ->
    window.location = #{hoge_path(@user)}
```

こう書くことで、Hamlの中にCoffeeScriptを書けて便利、という記事で、確かによく使います。
が、いくつか落とし穴もあるよー、っていうことに遭遇しているので、それをまとめてみました。

# HamlにCoffeeScriptを記述する利点

* 外部ファイルにするまでもない数行のスクリプト（ページ読み込み完了時に特定の`display: none;`を解除とか）を気軽に書ける。
* javascript内にrailsのControllerで作った変数やPathHelperメソッドを埋め込めこめる

# HamlにCoffeeScriptを記述する欠点

* `hoge.html.haml`のロードのたびに記述したCoffeeScriptがコンパイルされる
  * コンパイルのオーバーヘッドは大したことがない
  * しかしコンパイルに使われるライブラリ（主にTheRubyRacer）やその依存Gemのバグで謎のエラーに悩まされたり……
* 記述したスクリプトはminifyされない（大したデメリットじゃないですが）
* そもそもページの途中に`<script>`タグを埋め込むのは、HTMLのベストプラクティス的にあまりおすすめじゃない

# 結論

ほんとにHaml内にCoffeeScript記述する必要ある？って考える

* 数行の小さいスクリプト
* どうしてもRailsで作成した変数を埋め込みたい

... って時だけ使い、そうでない時は外部ファイルにする

また

* `:coffee`ではなく`:javascript`で記述する。後者の場合、`<script>`タグで囲む処理だけが走る（coffee->jsへのコンパイルがない）のでExecjsやTheRubyRacerのバグに引っかからない。
* `content_for`を使い、layout/application.htmlの最後で出力する

というのもおそらく有効だと思います。

```hoge.html.haml
.iroiro
  %p いろいろな記述

-content_for(:javascript) do
  :javascript
    // いろいろな処理
```

```view/layout/application.html.haml
!!!
%html
  %head
    %title ページ
  %body
    %section.main
      = yeild

    %section.note このページは○○によって作られたとかなどの情報

    -if content_for?(:javascript)
      = yield(:javascript)
```

# 参考

[cowboyd/therubyracer#176 - Github](https://github.com/cowboyd/therubyracer/issues/176)
「なんか``method `method_missing' called on terminated object`` ってエラーが起きたよ」
「あ、それRuby2にすれば治るよ」
「業務システムでアップグレードをすぐにするとか無理だよ…」
　というやりとり。


[cowboyd/therubyracer#270 - Github](https://github.com/cowboyd/therubyracer/issues/270)
「TheRubyRacerってスレッドセーフじゃなくね？」というIssue

# 追記

「Hamlにcoffee書く必要のあるときはどんな時か」というのに「どうしてもRailsで作成した変数を埋め込みたい」を書きましたが、
人から「単純にpath_helperを埋め込みたいだけとかなら、js.coffee.erb書くっていう手もあるよ」と教わりました。
この場合、アクセスのたびにコンパイルされるのか、それともprecompile時にjsファイルにされるのか良くわからないのですが（たぶん前者？）、これはありねーという感じ。
npm-scriptsについて

# npm-scriptsについて

npmは"scripts"というフィールドにshell scriptとエイリアスコマンドを指定できる。

```javascript
{
  "name": "myapp"
  "scripts": {
    "start":      "node app.js",
    "production": "NODE_ENV=production node app.js"
  }
}
```

キーは`npm start`のようにエイリアスとして利用できる名前となり、値にはshell scriptをワンラインで指定する。

キーは自由に指定できるが、中には既に予約されている名前があり、それらを含めて以下の4種類に分類できる。

### 意味付けだけがされたnpm-scripts

- **start**
    - appを起動するようなshell scriptのエイリアスとして用いる。
- **restart**
    - appを再起動させるためのshell scriptのエイリアスとして用いる。
- **stop**
    - appを停止させるためのshell scriptのエイリアスとして用いる。
- **test**
    - appをテストするようなshell scriptのエイリアスとして用いる。

### 他のnpmコマンドをフックする形で実行されるnpm-scripts

- **publish**
    - `npm publish`の後に実行される。
- **install**
    - `npm install`の後に実行される。
- **uninstall**
    - `npm uninstall`の前に実行される。
- **update**
    - `npm update`の後に実行される。
    
これ以外のnpmコマンドをフックするnpm-scriptsも設定可能で、`node_modules/.hooks/`以下になんやかんやするらしい。

### 予約された名前ではないnpm-scripts

上記以外のすべてのnpm-scripts(例 : 'production')は、`npm production`のようには実行できない。

予約された名前ではないnpm-scriptsは、`npm run-script`を用いて、下記のように実行する。

```
npm run-sctipt production
```

alias:

```
npm run production
```
    
### npm-scriptsの前後に実行されるnpm-scripts

下記に挙げるものを除くすべてのnpm-scriptsには、プレフィックスをつけることで、そのnpm-scriptsの前後に実行されるものがある。

- **pre**
    - そのnpm-scriptsの前に実行される。
    - 例 : `prestart`は、`start`の前に実行される。
- **post**
    - そのnpm-scriptsの後に実行される。
    - 例 : `prestart`は、`start`の後に実行される。

中でも、下記のものは実行タイミングが個別に指定されている。

- **prepublish**
    - `npm publish`の前に実行される。
- **preinstall**
    - `npm install`の前に実行される。
- **postuninstall**
    - `npm uninstall`の後に実行される。
- **preupdate**
    - `npm update`の前に実行される。
    
# npm-configについて

同様に、"config"というフィールドにappの設定を記述しておくことができる。

```javascript
{
  "name": "myapp"
  "scripts": {
    "start": "node app.js"
  },
  "config": {
    "port": "8080"
  }
}
```

ここで記述されたappの設定は、npm-scriptsで実行する時、環境変数に`npm_package_config_`というプレフィックスがついて設定される。

```javascript
http.createServer(function() {
  ;
}).listen(process.env.npm_package_config_port);
```

このnpm-configの記述は、npmコマンドを用いて行うこともできる。

```
npm config set myapp:port 80
```
EmmetでHTMLタグへテキストを挿入する方法

Emmetもしくはzen-codingを使用していて、HTMLにテキストを挿入する方法です。

# テキストを挿入
{}の内部に表示するテキストを入力して変換します。

```bash:h1タグを出力
h1{Hello World}
```
出力されるHTML

```html:テキスト挿入状態で出力されるHTML
<h1>Hello World</h1>
```

{}の中に例えば{}を入れると変換できます。

```
h1{{{hello}}}
```
プログラムからHTMLへ出力する場合に使えそうです。

```html:テキスト挿入状態で出力されるHTML
<h1>{{hello}}</h1>
```

# Emmet関連 
EmmetでHTMLタグに好きな属性をつける方法
http://qiita.com/pugiemonn/items/81841caf83434bae8fe6
Google Noto Sans Web Fonts来てます

遂に！
Google Noto SansがWeb Fontsに来たようです。

Google Fonts Early Accessより、いつの間にか発表されてました。

http://www.google.com/fonts/earlyaccess

宣伝になっちゃいますが、導入は以下のブログに書きました。
急いだので中身はありません。。。

http://fainder.info/font/launch-google-noto-font-japanese

ブログにもJetPackで強制CSS上書きで導入しましたが、なんとかなりそうなレベルの読み込みスピード。

遂に日本語Web Fontsの選択肢がひとつ増えました！

Apache Licenseで公開してくれるGoogleに感謝！
Qt Creator:カラースキームを追加する



環境
>Qt Creator 2.8.1
>OS X 10.9.4

# 設定ファイルの場所、追加方法

``` ~/.config/QtProject/qtcreator/styles ```

デフォルトのカラースキームはそのままはいじれず、コピーしてからいじれるようになる。
コピーした場合、`テーマ名.xml` の形でここへファイルが作成される様子。

自力でさくせいするとか、Githubとかに公開されてる.xmlをここへ置けば、設定画面のプルダウンリストに追加される様子。

# 例

参考（ほかにも色々ありそうだがひとまず最初に見つけて入れてみたもの）
* [qtcreator-solarized-syntax](https://github.com/artm/qtcreator-solarized-syntax)
* [Dusk and Monokai themes for Qt Creator](https://qt-project.org/forums/viewthread/45800)
* [Monokai](https://github.com/smokku/qtcreator-themes/blob/master/monokai.xml)

Solarized, Dusk, Monokaiなど追加してみた状態

![スクリーンショット 2014-08-30 23.50.21.png](https://qiita-image-store.s3.amazonaws.com/0/9039/0bc84293-cdbc-aa55-d7be-14953dcb5f30.png "スクリーンショット 2014-08-30 23.50.21.png")

[Monokai](https://github.com/smokku/qtcreator-themes/blob/master/monokai.xml) がいまのところしっくり来る。

![スクリーンショット 2014-09-02 1.41.22.png](https://qiita-image-store.s3.amazonaws.com/0/9039/6d13a45f-2e06-d531-5e74-a7a4ddcf6f02.png "スクリーンショット 2014-09-02 1.41.22.png")
SML で BMP ファイル書き出しの準備

#BMP テスト　

64ドット * 64ドットの灰色の四角形（test.bmp）を書き出します。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/44522/7e7b85e0-caa8-b5bb-91f3-ea46a9cad798.png)

色々適当に試したメモ帳。

```sml
fun file_header nx ny = 
  {bfType = "BM", bfSize = 14 + 40 + nx * ny * 3, bfReserved1 = 0, bfReserved2 = 0, bfOffBits = 14 + 40}

fun info_header nx ny =
  {biSize = 40, biWidth = nx , biHeight = ny, biPlanes = 1, biBitCount = 24, biCompression = 0, biSizeImage = nx * ny * 3, biXPelsPerMeter = 3780, biYpelsPerMeter = 3780, biClrUsed = 0, biClrImportant =0}

fun str_int2 i = 
  str (chr (i mod 256)) ^ str (chr (i div 256))  

fun str_int4 i = 
  str (chr (i mod 256)) ^ str (chr (i div 256 mod 256)) ^ str (chr (i div (256 * 256) mod 256)) ^ str (chr (i div (256 * 256 * 256) mod 256)) 


fun bin_file_header fh =
  #bfType fh ^ str_int4 (#bfSize fh) ^ str_int2 (#bfReserved1 fh) ^ str_int2 (#bfReserved2 fh) ^ str_int4 (#bfOffBits fh)

fun bin_info_header ih =
  str_int4 (#biSize ih) ^ str_int4 (#biWidth ih) ^ str_int4 (#biHeight ih) ^ str_int2 (#biPlanes ih) ^ str_int2 (#biBitCount ih) ^ str_int4 (#biCompression ih) ^ str_int4 (#biSizeImage ih) ^ str_int4 (#biXPelsPerMeter ih) ^ str_int4 (#biYpelsPerMeter ih)
^ str_int4 (#biClrUsed ih) ^ str_int4 (#biClrImportant ih)    



fun a_to_str' a n i res =
if i = n then res 
         else a_to_str' a n (i + 1) (res ^ (str (chr (Array.sub(a, i))))) 

fun a_to_str a =
  a_to_str' a (Array.length a) 0 ""


val a = Array.array(64 * 64 * 3, 127);
val f = TextIO.openOut("test.bmp");
val fh = file_header 64 64;
val ih = info_header 64 64;
val q1 = bin_file_header fh;
val q2 = bin_info_header ih;
val q3 = a_to_str a;
TextIO.output(f, q1 ^ q2 ^ q3);
TextIO.closeOut(f);
```
Xamarin Studio の iOSデザイナでは、Unwind Segue に Identifier が付けられないようです


* [Xamarin.iOSでの画面遷移で「戻る」を実現するには？（Storyboard、Unwind Segue使用） - Build Insider](http://www.buildinsider.net/mobile/xamarintips/0016)

に Unwind Segue について書きましたが、載せきれなかったことを補足します。

上記Tipsでは、Unwind Segueを作るのに、ボタンとExitを結んでますが、``PerformSegue``で Unwind Segue を使いたい場合もありましょう。

``PerformsSegue``に渡す Identifier はどこで付与するの？とあちこち探しましたが、どうも現在の Xamarin Studio（のiOSデザイナ）はまだ対応していないようです。というか、そもそもコントロールから引っ張るタイプのUnwind Segueしか作れないみたいです。

Xcode の Interface Builder では 

* [Technical Note TN2298: Using Unwind Segues](https://developer.apple.com/library/ios/technotes/tn2298/_index.html#//apple_ref/doc/uid/DTS40013591-CH1-TNTAG2-ADDING_AN_UNWIND_SEGUE_TO_A_STORYBOARD)

にあるように、「ViewControllerのアイコンをExitアイコンへControl+ドラッグ＆ドロップする」で、”Manual” Unwind Segue が作成できるのですが、Xamarin Studio では、それっぽい操作をしても反応がありません。

当然ながら、Xcode で作成した Segue は Xamarin Studio でも使えるので、Manual Unwind Segue の作成と Identifier の付与は Xcode で行って、Xamarin側で ``PerformSegue`` を呼び出せばいいと思います。
ElixirのComprehensions(内包表記)


## Comprehensions(内包表記)の使い方

ElixirのComprehensionsは

* Generators
* Filters
* Collectables

の3つで構成されている。

    > for n <- [1, 2, 3, 4], do: n * n
    [1, 4, 9, 16]

上記の場合、`n <- [1, 2, 3, 4]`が`Generators`になる。右辺に任意の`enumerable`を渡すことが可能。

例えば、

    > for n <- 1..4, do: n * n
    [1, 4, 9, 16]

とすることも出来る。
また、Generatorsはパターンマッチングもサポートしているので、

    > values = [good: 1, good: 2, bad: 3, good: 4]
    > for {:good, n} <- values, do: n * n
    [1, 4, 16]

のように書ける。
パターンマッチングではなく、Filtersを使って同等の事が出来る。

    > values = [good: 1, good: 2, bad: 3, good: 4]
    > for {key, n} <- values, key == :good, do: n * n
    [1, 4, 16]

    > require Integer
    > for n <- 1..4,Integer.is_odd(n), do: n * n
    [1, 9]

Filtersは、nilまたはfalseの値を除外対象とする。

    > require Integer
    > for n <- 1..4, nil, do: n * n
    []

以下の様に複数のGeneratorsを指定出来る。

    > for dir <- ['.'],
    >     file <- File.ls!(dir),
    >     path = Path.join(dir, file),
    >     File.regular?(path) do
    >   path
    > end
    ["./.gitignore", "./mix.exs", "./README.md"]

Bitstringも同様に扱える。

    > pixels = <<213, 45, 132, 64, 76, 32, 76, 0, 0, 234, 32, 15>>
    > for <<r::8, g::8, b::8 <- pixels>>, do: {r, g, b}
	[{213,45,132},{64,76,32},{76,0,0},{234,32,15}]

パターンマッチングもFilters使える。

    > for <<r::8, g::8, b::8 <- pixels>>, r==213, do: {r, g, b}
    [{213, 45, 132}]
    > for <<213::8, g::8, b::8 <- pixels>>, do: {213, g, b}
    [{213, 45, 132}]

## Intoの使い方

上記の、Comprehensions(内包表記)は、結果をリストとして返しているが、
`:into`を使用すと、異なるデータ構造にデータを登録する事が可能。

    > for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>
    "helloworld"

`:into`にはCollectable protocolを実装しているデータ構造であれば指定が可能。
`1.0.0-rc2`では、List / BitString / Map / HashDict / HashSet / IO(IO.Stream)が実装済

### List
    > box = [100,200]
    > for n <- [1,2,3,4,5], into: box, do: n + 1
    [100, 200, 2, 3, 4, 5, 6]

### BitString
    > for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>
    "helloworld"

### Map
    > for {key,value} <- [app: "elixir", version: "0.15.2-dev"],
    >     into: %{} do
    >   {key, value: value}
    > end
    %{app: [value: "elixir"], version: [value: "0.15.2-dev"]}

`%{}`は`Map.new`にも置き換え可能。

Mapは`Dictモジュール`に処理を委譲しているだけなので、`HashDict`/`HashSet`も同じように記述出来る。
`%{}`の部分が`HashDict.new`または`HashSet.new`になる。

### IO.Stream
    > stream = IO.stream(:stdio, :line)
    > for line <- stream, into: stream do
    >   String.upcase(line) <> "\n"
    > end

    > for x <- ~w{ cat dog }, into: IO.stream(:stdio,:line), do: "<<#{x}>>\n"


##参考

* [18 Comprehensions](http://elixir-lang.org/getting_started/18.html)
* [Programming Elixir](https://pragprog.com/book/elixir/programming-elixir)
Railsでデータベースに接続できなくてエラーがでる

vagrant環境で作っているRailsプロジェクトでHelloWorldしようとしたらエラーがでました。postgresqlを使用しています。

```
ActiveRecord::NoDatabaseError (FATAL:  role "vagrant" does not exist
Run `$ bin/rake db:create db:migrate` to create your database):
```

ボクの環境ではpostgresqlにはvagrantというユーザーはいません。なのでdatabase.ymlでuser_nameを指定しました。

```rb:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  username: user_name
  password:
```

エラーが出なくなりました。
Capistrano 3.x でデプロイ時にNew Relicにデプロイ情報を記録する


New Relicではデプロイを記録する仕組みがあります。

記録したデプロイ情報からどのデプロイからパフォーマンスがよく、わるくなったとかエラーが減った、増えたとかがわかって便利です。

## 試したバージョン

- `rails` - 4.0.9
- `newrelic_rpm` - 3.9.2.239


## Capistrano 3.x

`newrelic_rpm`ではCapistranoのrecipeが提供されているので連携は簡単で、`deploy.rb`に以下を追加するだけです

```ruby
after "deploy:updated", "newrelic:notice_deployment"
```

あとはデプロイするだけで以下のようなログと共にデプロイが記録されます

```log
DEBUG Retrieving changelog for New Relic Development details
DEBUG Uploading deployment to New Relic
Recorded deployment to 'Application Name' (2014-08-29 10:00:00 +0900)
```

※ `newrelic_rpm`のバージョンが3.9.1.239だとデプロイをアプリケーションサーバ側で記録する実装になってるので使えません（アプリケーション数分デプロイが記録されちゃう）

## Deployments dashboard

デプロイ後のパフォーマンスを確認するダッシュボードが提供されてます。

ログイン後、`Events` -> `Developments`で確認できます。

![Deployments_-_IRORI_Server_-_New_Relic 3.png](https://qiita-image-store.s3.amazonaws.com/0/4393/3728b571-415e-23bc-31b2-710455b46a16.png "Deployments_-_IRORI_Server_-_New_Relic 3.png")


## その他

[REST API](https://docs.newrelic.com/docs/apm/apis/new-relic-rest-api-v1/getting-started-new-relic-rest-api#deploy)が提供されているので提供されているライブラリ以外を利用しても記録はできます。

## Links

- [Recording deployments with the Ruby agent](https://docs.newrelic.com/docs/agents/ruby-agent/features/recording-deployments-ruby-agent)
- [Deployments dashboard](https://docs.newrelic.com/docs/apm/applications-menu/events/deployments-dashboard)

以上
Ruby | ライブドア天気情報「Weather Hacks」の結果を取得する

# Ruby | ライブドア天気情報「Weather Hacks」の結果を取得する

## 概要
ライブドア天気情報「Weather Hacks」の結果を取得します

## 仕様
東京の天気情報を取得します
http://weather.livedoor.com/forecast/webservice/json/v1?city=130010

## サンプルコード

~~~ruby
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse('http://weather.livedoor.com/forecast/webservice/json/v1?city=130010')
json = Net::HTTP.get(uri)
result = JSON.parse(json)
print result['title'], "\n"
print result['link'], "\n"
print "予報の発表日時:#{result['publicTime']}", "\n"
result['forecasts'].each do |forecast|
  print "--------------------"
  print "予報日:#{forecast['dateLabel']}", "\n"
  print "天気:#{forecast['telop']}", "\n"
  print "最低気温:#{forecast['temperature']['min']}", "\n"
  print "最高気温:#{forecast['temperature']['max']}", "\n"
end
~~~

## 出力

~~~
東京都 東京 の天気
http://weather.livedoor.com/area/forecast/130010
予報の発表日時:2014-08-30T17:00:00+0900
--------------------予報日:今日
天気:曇り
最低気温:
最高気温:
--------------------予報日:明日
天気:曇のち雨
最低気温:{"celsius"=>"21", "fahrenheit"=>"69.8"}
最高気温:{"celsius"=>"26", "fahrenheit"=>"78.8"}
--------------------予報日:明後日
天気:曇時々雨
最低気温:
最高気温:
~~~

## 参照
http://weather.livedoor.com/weather_hacks/
http://weather.livedoor.com/weather_hacks/webservice
バッチファイルを書いてSFTPサーバへのファイル配置を自動化する

`sftp`コマンドに`-b`オプションでコマンドが書いてあるファイルを渡してあげると、そのファイルに書かれたコマンドを順番に実行してくれる。

```bat:upload.bat
cd /
put README.md
```

```bash:Terminal
$ touch README.md
$ sftp -b upload.bat user@host
```

素直にFileZillaとか使った方が楽だったかなー、とも思ったけどちょっとしたバッチファイルを書いて、コマンドラインからオプションを付けてコマンドを叩いてあげれば自動化できることがわかったし、楽にできたのでよかった。
AngularJS学習ノート

> マスターのリポジトリはGitHubで、Code exampleも付属しています。
> 
> <https://github.com/higuma/angularjs-note>

AngularJS 学習ノート
========================================================================
> (2014-07-29 .. 2014-08-29)
> 
> AngularJSの学習開始から終了までの記録ノートです。Code example(Jade + CoffeeScript + Sassに書き換えたもの)は本リポジトリのsrc/ディレクトリにあります。生成ファイルはpublic/です(一部のファイルはローカルサーバからの立ち上げが必要)。


はじめに
------------------------------------------------------------------------
まずは勉強用のドキュメントを探す必要があるが、オフィシャルWebサイトのドキュメントが充実している場合はそれを読むのが一番だと思う。

> (少し前にTwitter Bootstrapを勉強した時もそうだったが)公式オンラインドキュメントが充実しているなら絶対それを読むべき。IT分野では紙の本のほぼ全てが半年で最新の内容ではなくなり、大部分は2-3年で役に立たなくなる。
> 
> > 数年前Ruby on Railsを学ぶ際に色々な本を試したがほとんど役に立たず、結局公式ドキュメント(Rails Guides)を最初から読み直した。当時「最初からそうすればよかったのに...」と後悔した覚えがある。

現在(学習開始時)の最新は1.3.0-beta.17(間もなく1.3が正式リリースされるはず)。これから学ぶのなら最初から1.3にした方が後々問題は少ないと思う。

> (後で追加)今すぐ製品に使うのなら1.2の最終安定版の方が間違いない(古いIEをサポートする場合は必須)。参考として1.3発表時のドキュメントを読む(方針確認用)。総合的に判断して今から始めるなら1.3とした。
> 
> <http://blog.angularjs.org/2013/12/angularjs-13-new-release-approaches.html>
> 
> * (この文章を見る限り)大きな仕様変更や新機能の追加はない
> * 主な目的は現行主流ブラウザでのパフォーマンス向上
>     * 古いブラウザ(特にIE8)のサポート打ち切り
>     * 初期バージョンの(もう使われていない)APIの廃止
> 
> また1.2と1.3の細かい相違点はDevelopers Guideの[Migrating from Previous Versions](https://docs.angularjs.org/guide/migration)を参照。

和訳がある(主要ドキュメントはほぼ全て)。一つ前の版(1.2)の訳だが原文と見比べてもまだ大きな変更はなく今でも十分役に立つ(tomofさんありがとう!)。

<http://js.studio-kingdom.com/angularjs>


Home
========================================================================
<https://angularjs.org/>

Downloadボタンをクリックすると(Twitter Bootstrapの)ポップアップモーダルビューが立ち上がるが、これを見る限りCDNを使った方がいいのでみんなそうしてねと言っている感じ(実際その方が効率はよいはず)。

> でもやはり勉強用にUncompressed版のソースを取り寄せておくとよい(解読用)。800kbもあるが半分以上はコメントで読みやすい。ソースは分からなくてもコメントに目を通すだけでよい勉強になる。

この後にThe Basics以下の簡単な解説があるが、最初は読んでも説明不足(と自分の知識不足の両方)で理解するのはまず無理。スキップしてDeveloper GuideのConceptual Overviewに進むといい。

> 半日掛けて途中まで(4割くらい?)読んだところで断念した(知識もないのに無理して読んでも時間の無駄)。予備知識がないとまず理解できない。


Tutorial
========================================================================
<https://docs.angularjs.org/tutorial>

ここの構成を見ると何だか [Ruby on Rails Tutorial](http://www.railstutorial.org/book) にそっくり(製作者は実際参考にしていると思う)。中身は読まなくてもどういうものかある程度察しは付く。以前Rails Tutorialを全部実習し終えて感じたのは次の2点。

* gitやテスト(RSpec)、デプロイ(Heroku)など周辺技術の習得にはよい
* だが肝心のRailsが説明不足(結局 [Ra
次世代mobile版データベース"Realm"を使ってみた


![スクリーンショット 2014-08-30 16.53.06.png](https://qiita-image-store.s3.amazonaws.com/0/5365/eec50c0e-48dc-6ecf-dd57-4e9e541dc3a1.png "スクリーンショット 2014-08-30 16.53.06.png")

1ヶ月以上前にHackerNewsで話題になっていた[Realm](http://realm.io/)というmobile用のDBを使ってみた。
使い方も含めて書いておく。

※今回はobjective-cで使ってますが、swiftでも勿論使えます！

##何故作ったか？

[紹介ページの要約](http://realm.io/news/introducing-realm/)を見てもらえれば詳しくは分かるが、mobileのDBって2000年にでたSQLite以降全然刷新されないよねっていう内容が書いてある。

確かに、mobileのあり方は昨今大幅に変わって来ているのにDB周りは出てないみたい。
自分はwebのアプリケーションを普段は作ってるので、こっち側はResis等のNOSQLが注目されていたり技術的な流れは結構起きてるのに、、、

確かにソシャゲー作ってる人がSQLiteは遅くてtextデータで保管して・・・みたいな話しを聞いた事がある。
まぁなんせ、時代の流れに適したDBを作りたいとの事ね。

![スクリーンショット 2014-08-30 17.00.29.png](https://qiita-image-store.s3.amazonaws.com/0/5365/a59a505a-2d98-9425-75ac-fdbcb8c9e199.png "スクリーンショット 2014-08-30 17.00.29.png")

##何が凄いの？

Yコン出身者が作ったらしいがとにかくSqliteより早いらしい。

![スクリーンショット 2014-08-30 16.56.45.png](https://qiita-image-store.s3.amazonaws.com/0/5365/469fd04e-c5c9-0e12-4d42-f10b2a19824b.png "スクリーンショット 2014-08-30 16.56.45.png")

確かにこれをみる限り結構なData量になるとパフォーマンスにかなりの差が見られるな・・。

しかも[Zynga](http://zynga.com/)は2012年から使ってるとの事で安全性もかなりのものだと主張されてる。

##料金は？

無料ですw　素晴らしい！
リリース直後は有料だった気がするけど、オープンソース化したのかな。

##インストール

基本的に[公式サイトのドキュメント](http://realm.io/docs/cocoa/0.84.0/)通りに進めていく。

###①ライブラリをインストール

Zipファイルでインストールするやり方と、cocoapodsでインストールする方法があるが、勿論cocoapodsで実施。

```Podfile
pod "Realm"
```

```
$ pod install
```

###②xcodeのpluginをインストール
これをインストールしておくと、Realmのmodel作成が簡単になる。
[Alcatraz](http://alcatraz.io/)というxcodeのパッケージマネージャーをインストールしているとすぐにインストールできる。

インストールしてない方は、ターミナルで下記を実施。

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

実施後、xcodeを再起動してください。

xcodeのメニューから
Window > Package Maneger をクリック。
RealmPluginで検索すると出てくるのでインストール。

![スクリーンショット 2014-08-30 17.21.44.png](https://qiita-image-store.s3.amazonaws.com/0/5365/66ae127d-b3a8-2335-b0c9-fde437701755.png "スクリーンショット 2014-08-30 17.21.44.png")


インストールすると、

File > New > File.. をクリックするとRealmがiosのエリアにあるかと思うので、それをクリックし名前を入力し作成。

##Databaseを定義

先程作ったファイルのヘッダーファイルにmodelのカラムを定義していく。
名前だけを保持したFriendテーブルを作ってみる。

```Friend.h
#import <Realm/Realm.h>

@interface Friend : RLMObject
@property NSString *name;
@end

// This protocol enables typed collections. i.e.:
// RLMArray<Friend>
RLM_ARRAY_TYPE(Friend)
```

```Friend.m
#import "Friend.h"
@implementation Friend
@end
```

```HogeAppDelegate.h
#import "HogeAppDelegate.h"
#import <Realm/Realm.h>
#import "Friend.h"

@implementation MBCAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    RLMRealm *realm = [RLMRealm defaultRealm];
	Friend *friend = [[Friend alloc] init];
    friend.name = @"moriyaman";
    [realm beginWriteTransaction];
    [realm addObject:friend];
	[realm commitWriteTransaction];
    
    return YES;
}

```

これでiphoneシュミレータ側のDocumentフォルダにdefault.realmというファイルでデータが生成されている。

ちなみにソースファイルにはデータの形成ロジックなどをexampleを見てみると書いていた。

その他[ドキュメント](http://realm.io/docs/cocoa/0.84.0)をみて見るとQueryの書き方なども載っている。
もう少し使い込んだら再度まとめて書いてみます。
配列を引数とする際の注意


Javascriptで配列を引数として関数やメソッドに渡す場合、
思わぬ挙動をすることがあるので注意が必要です。

わかりやすい例を示すと、例えばArrayオブジェクトのpushメソッドに対して配列を引数にして渡すとき

```
var list = [];
var innerList = ['foo', 'bar', 'baz']

list.push(innerList);

console.log(list); // output: [['foo','bar','baz']]

```

といった結果になってしまいます。つまり、上記のように配列にしてまとめて渡す時と、

```
list.push('foo', 'bar', 'baz');
```

のように引数ごとに分けて渡す場合では振る舞いが違うということです。

でも、上記のようにわざわざ配列の中身を分解して引数に渡すのは面倒なので、
そんなときはapplyメソッドを使うと便利です。

```
Array.prototype.push.apply(list, innerList);
```

これで、listを親オブジェクトとしつつ、innerListの配列要素を分解した形で処理してくれます。