OmniAICreator/Qiita-1.07M huggingface dataset:
swiftでspritekit

swiftのスプライトキットのサンプルになれば。
やってること
・イメージを取り込んで、物理特性を持たせる
・ボタンクリックでイメージをジャンプさせる

ほとんどobjective-cと変わらないですね。

    import SpriteKit
    
    class GameScene: SKScene {

        let Jump : CGFloat = 400.0
        let imageWidth : CGFloat = 30.0
        let FloarWidth : CGSize = CGSizeMake(500, 500)

        override func didMoveToView(view: SKView) {
            /* Setup your scene here */
            let iorin = SKSpriteNode(imageNamed:"minase-iori0020")

            iorin.xScale = 0.1
            iorin.yScale = 0.1
            iorin.position = CGPoint(x:CGRectGetMidX(self.frame),y:CGRectGetMidY(self.frame));
            iorin.name = "iori"

            let body = SKPhysicsBody(circleOfRadius:imageWidth)
            iorin.physicsBody = body

            self.addChild(iorin)

            let floor = SKSpriteNode(imageNamed:"minase-iori0020")
            floor.xScale = 0.3
            floor.yScale = 0.3
            floor.position = CGPoint(x:CGRectGetMidX(self.frame),y:CGRectGetMinY(self.frame));
            floor.name = "floor"

            let body2 = SKPhysicsBody(rectangleOfSize:FloarWidth)
            body2.affectedByGravity = false
            body2.dynamic = false
            body2.contactTestBitMask = 1
            floor.physicsBody = body2

            self.addChild(floor)
        }
    
        override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
            /* Called when a touch begins */
            self.childNodeWithName("iori").physicsBody.velocity.dy = Jump
        }

        override func update(currentTime: CFTimeInterval) {
            /* Called before each frame is rendered */
            self.childNodeWithName("floor").position =CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMinY(self.frame));
        }
    }
[Titanium Alloy] backgroundImageのiPhone3.5インチ、4インチ対応

Titanium、iOSアプリ初心者です。躓いたところの覚え書きです。

Windowの背景に画像を設定するにはbackgroundImageを指定するけど、
画面フルサイズの画像を背景にしたい場合、
3.5インチと4インチで画像サイズが違うのでどうするかってお話です。

##スプラッシュ画像では判別してくれるのに...
スプラッシュ画像は、`Default-568h@2x.png`というように「-568h@2x」が付いていると4インチRetina用の画像として判別されるから、WindowのbackgroundImageに使う画像も`hoge-568h@2x.png`を用意しとけばよさそう！...と思ったけどそれは判別されなかった...悲しい...

そこで、以下の方法を試してみました。

##用意するもの
`img_hoge.png`（3.5インチ用 320×480）
`img_hoge@2x.png`（3.5インチRetina用 640×960）
`img_hoge_568h.png`（4インチRetina用 640×1136）

4インチ用の画像に「@2x」を付けないのがみそです。
（@2xがついてなければファイル名はなんでもいいです）

##記述例
```xml:xml
<Alloy>
    <Window id="window">
    </Window>
</Alloy>
```

```css:tss
"#window": {
    backgroundImage: 'img_hoge.png'
}
```

```js:js
if( Ti.Platform.displayCaps.platformHeight == 568 ){
    $.window.backgroundImage = 'img_hoge_568h.png';
}
```

##結論
Ti.Platform.displayCaps.platformHeightが568のときimg_hoge_568h.pngをbackgroundImageにするって書けばうまくいきました。

何か間違ってたら遠慮なく教えて下さい。

おわり。
C言語学習日誌1 -Hello Worldまでをやってみる- 2014/6/11

#始めた動機
この前、静岡大学の准教授の方のお話を聞いたところ、当然のことながらプログラミングは自分で学んでおいたほうがいいらしい。授業でやるのは本当に最低限で、どちらにせよ自分でやらなければならない時期は来るのだとか。それならば、早め早めにやっておくに越したことは無かろうと思い、今回こんなことをやり始めた次第である。

#導入
とりあえず、http://www.atmarkit.co.jp/fcoding/articles/c/02/c02a.html 「Cプログラミングに必要な環境をそろえよう」
を参考にした。非常に丁寧な説明で、わかりやすい。検索して最初にこれにあたったのは幸運だったかも。

#実際にやってみる

![20140610_1.png](https://qiita-image-store.s3.amazonaws.com/0/46217/9db24029-a77c-6361-6b4a-ad56fc786529.png)

なにはともあれ、eclipse keplerなるものを落としてきて展開、起動してみた。

![20140610_2.png](https://qiita-image-store.s3.amazonaws.com/0/46217/980c6425-792a-23e4-f647-aba4985c4bf3.png)

プロジェクトを作成して……。正直言ってこの辺りの設定とか全然わからない。

![20140610_3.png](https://qiita-image-store.s3.amazonaws.com/0/46217/e8a1820f-e779-034d-a735-8e483f47f295.png)

ちょっと待ってなんかもう書かれてる。
道理で↑の説明ページに、コード？　について書かれてないなと思ったら……。ご丁寧に注釈まで入れてあるようで。

![20140610_4.png](https://qiita-image-store.s3.amazonaws.com/0/46217/ffffa76d-f68e-b4f7-5786-dae2d5afec15.png)

説明ページには「バイナリー」とか「debug」とかが「インクルード」と同じ層にあると書いてあったけど、こちらにはない。うむむ……説明とは違うバージョンだからか？　説明ページが書かれた当初はeclipse keplerではなくてeclipse galileoだったから、細かいところは違うのかもしれない……まだよくわからぬ。

![20140610_5.png](https://qiita-image-store.s3.amazonaws.com/0/46217/a7277513-64f8-4797-c466-644cfe2cae32.png)

と思って手順に従ってコンパイルして、実行したら全部出来たでござる。味気ない。

![20140610_6.png](https://qiita-image-store.s3.amazonaws.com/0/46217/7e6650fc-cdf8-ce9f-23e4-c333caafcfed.png)

説明サイトを見るに、どうもこんな感じの役割であるらしいことがわかった。関数というのはVBAをでも聞いたことがある気がしないでもない。
うーん、この main とか puts というのも、元々はもっと細かい何かで構成されているのか……どうやって？　まあそれはいつの日か万が一プログラミングが上達したらの話になるのかな。

#おわりに

とりあえず、説明サイトによれば、関数を使ってこんなことができるということが理解できればまずはいいらしいから、今回はこれで終わりにする。

この記事の書き方に四苦八苦してる間に、日付またいじゃったよ。画像も入れるから平行してやらないとだし……誰かうまいやり方知らないかなぁ。というより、これからこんなことしてる時間作れるかどうかも定かで無い。多分こんなアホみたいに細かく記せるのもこれっきりだと思う。

これからも精々頑張って行きたいと思いま～す。

誰か暖かく見守ってくれる人が居れば、珍しく長続きするかもしれない。
VirtualBoxに入れたLinuxの解像度をワイドに変更

VirtualBoxにLinux、今回はUbuntu14.04 LTS 64bitをインストールした。
OSセットアップ完了後にちゃんと「Guest Addition」をインストールした。
ちなみに、ホストOSはWindows7。


#解像度の変更

これで画面解像度を800x600から変更できる。
手っ取り早い方法は、通常のウィンドウサイズを変更すると同様の方法でVirtual Boxのウィンドウサイズを変更するとゲストOSの解像度も変更される。
でもサイズが中途半端で・・・その・・・きっちりしたサイズにしたいのよ。
んで、ゲストOS側の環境設定で解像度を変更する。
変更できるんだけど・・・4:3の画面比率しか選択肢がない。1280x960(4:3)までしかないorz
VRAM設定も問題なさそうなのに・・・

なので解像度の設定項目を自力で追加する方法をメモ。（以前も同じ現象に遭遇してたから需要ある？）
ターミナルを開いてコマンドを実行していく。


##現状の値を取得

まずは ``xrandr`` コマンドを実行して現状の解像度状況を取得する。

```bash
$ xrandr
Screen 0: minimum 64 x 64, current 1280 x 960, maximum 16384 x 16384
VBOX0 connected primary 1280x960+0+0 0mm x 0mm
    1280x960    60.0*+
    1024x798    60.0
    800x600     60.0
    640x480	    60.0
```

こんな感じで現在のモニタ毎の状況が取得できる。
Virtual Boxの画面設定ではシングルモニタ扱いにしているので「VBOX0」のディスプレイしか出てない。
ディスプレイを複数設定している場合は「VBOX1」とか項目が増えているはず。


##特定の解像度設定に必要な値を取得

今回は 1600x900の16:9の解像度を設定してみようと思う。
`` cvt 1600 900`` コマンドを実行して、目的の解像度設定に必要な値を取得する。各環境に合わせた値が取得できるから、下記の値とは違う結果が出てくるかもね。
この取得できた値は後で使用するぞ！

```bash
$ cvt 1600 900
#  1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
Modeline "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
```


##ディスプレイモードの作成

これで必要な情報は揃った！！ので希望する解像度の数値を設定しよう。
`` xrandr --newmode`` コマンドで ``cvt 1600 900`` 実行時に取得できた Modeline 以降の値をパラメータとしてそのまま渡してあげる。コピペが確実だね。

```bash
$ xrandr --newmode "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
```


##ディスプレイモードの追加

希望する解像度の数値設定は完了したので、これを対象のディスプレイで使用できるようにする。
``xrandr --addmonde`` コマンドに ``xrandr`` コマンドで得られたディスプレイ名称「VBOX0」と
``cvt`` コマンドで得られたモード名称「"1600x900_60.00"」を渡してあげる。

```bash
$ xrandr --addmode VBOX0 "1600x900_60.00"
```

これで解像度の選択項目が追加になった。
後は通常通りに解像度変更を行えばいい。
Ubuntuのシステム設定（歯車とスパナのアイコン）を開いてそこからディスプレイを選択。
目的のディスプレイの解像度選択に先ほどの解像度が選べるので選択すれば完了さ。
Boot2Docker for Mac OS Xインストールメモ

dockerのインストール手順が変わっていたので、メモを兼ねて手順を書きます。

# dockerダウンロード
[osx-installer](https://github.com/boot2docker/osx-installer/releases)からpdgファイルをダウンロードします。
_※2014-06-11時点では、バージョンが1.0.0でした。_

ダウンロードした「Boot2Docker-x.x.x.pkg」をクリックして実行します。
_※x.x.xはバージョン番号_

# dockerインストール
ウィザードにそって進めます。
![ウィザード画面](https://qiita-image-store.s3.amazonaws.com/0/29968/64bd17ac-ce7f-0057-059c-9a8c2a0a7c7e.png "スクリーンショット 2014-06-11 0.35.55.png")

Lanchpadを開いて、boot2dockerを実行します。
![dockerアイコン](https://qiita-image-store.s3.amazonaws.com/0/29968/5218f68c-3d8b-bb4f-b9a5-5c5fc8c45f81.png "スクリーンショット 2014-06-11 0.40.54.png")

```sh
$ boot2docker init
$ boot2docker start
$ export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2375
```

# dockerに接続

```sh
boot2docker ssh
```

![docker起動画面](https://qiita-image-store.s3.amazonaws.com/0/29968/6ec0cbf1-81c1-6020-8e25-1110d39e1181.png "スクリーンショット 2014-06-11 0.47.18.png")
外部キー制約と fixtures の共存

# 困ったこと

fixtures を使ってテストを書いているプロジェクトで、DB のテーブルに外部キー制約を設定したところ、 ActiveRecord::InvalidForeignKey が出てテストが実行出来なくなりました。

```migration.rb
class CreatePrefectures < ActiveRecord::Migration
  def change
    create_table :prefectures do |t|
      t.text :name

      t.timestamps
    end
  end
end

class CreatePatients < ActiveRecord::Migration
  def change
    create_table :patients do |t|
      t.text :name
      t.references :prefecture, index: true

      t.timestamps
    end

    add_foreign_key(:patients, :prefectures)
  end
end
```

```patients.yml
pat_1:
  name: hoge
  prefecture: tokyo
```

↑これを入れる時にエラー

```prefectures.yml
tokyo:
  name: 東京都
saitama:
  name: 埼玉県
```

# 原因

fixtures のファイルをデータベースに読み込む順番が単なる名前順なので、先に読み込もうとした fixture が未読み込みの fixture に依存している場合、外部キー制約に引っかかります。

# 解決策

## データ投入時だけ制約を外す

fixtures はラベルから一意の id を生成して利用するので、この方法で最終的には辻褄が合うような気がしますが、楽に自動化する方法が思いつきませんでした。

## 正しい順番で読み込む

やはりこれが王道だと思うわけです。
このためのモンキーパッチ（PostgreSQL 8.4 以上限定）を書きました。これを test_helper.rb かなんかに読み込ませてやれば、システムカタログから依存関係を抽出して、正しい順番で fixtures を読み込む事が出来るようになります。

```fixtures_with_constraint.rb
module ActiveRecord
  module TestFixtures
    module ClassMethods
      def fixtures(*fixture_set_names)
        fixture_set_names = sort_by_dependence(
          if fixture_set_names.first == :all
            Dir["#{fixture_path}/{**,*}/*.{yml}"].map{|f| f[(fixture_path.to_s.size + 1)..-5]}
          else
            fixture_set_names.flatten.map{|n| n.to_s}
          end
        )
 
        self.fixture_table_names |= fixture_set_names
 
        require_fixture_classes(fixture_set_names, self.config)
        setup_fixture_accessors(fixture_set_names)
      end
 
      private
      def sort_by_dependence(fixture_set_names)
        fixture_set_names.flat_map{|name| dependent_table_names(name)}.uniq
      end
 
      def dependent_table_names(fixture_set_name)
        sql = <<-SQL
               WITH RECURSIVE r AS (
             SELECT pc_1.oid AS p_id,
                    pc_1.relname AS parent,
                    pc_2.oid AS c_id,
                    pc_2.relname AS child
               FROM pg_class AS pc_1
               JOIN pg_constraint ON pc_1.oid = conrelid
               JOIN pg_class AS pc_2 ON pc_2.oid = confrelid
              WHERE pc_1.relname = ?
          UNION ALL
             SELECT pc_1.oid AS p_id,
                    pc_1.relname AS parent,
                    pc_2.oid AS c_id,
                    pc_2.relname AS child
               FROM pg_class AS pc_1
               JOIN pg_constraint ON pc_1.oid = conrelid
               JOIN pg_class AS pc_2 ON pc_2.oid = confrelid
               JOIN r ON r.c_id = pc_1.oid
                  )
             SELECT child
               FROM r
        SQL
 
        ActiveRecord::Base.connection.execute(
          ActiveRecord::Base.send(:sanitize_sql_array ,[sql, fixture_set_name])
        ).map{|h| h["child"]}.reverse.push(fixture_set_name).map(&:to_sym)
      end
    end
  end
end
```

#　課題

`self.use_transactional_fixtures = false` などとすると、Delete Fixtures が走って外部キー制約に引っかかってしまいます。use_transactional_fixtures を切るなら削除の順番も依存性に従って整列させてやらないとダメそうですが、どの辺を弄れば良いか、まだ分かりません。
UIPageViewController内のUITableViewやUICollectionViewのScrollsToTopsがうまく動かないメモ

#### 前提
`scrollView.scrollsToTop = YES`
とすることで、ユーザがステータスバーをタップした時にScrollView (UITableViewやUICollectionViewも含む)の先頭まで戻ることが出来る。

ただし、ひとつの画面の中に複数のScrollviewがあるとき、この設定は単に無視される。これはドキュメントにも明記されている "On iPhone, the scroll-to-top gesture has no effect if there is more than one scroll view on-screen that has scrollsToTop set to YES. (https://developer.apple.com/library/ios/documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/cl/UIScrollView )"

さらにもうひとつ落とし穴があって、UIPageViewControllerの中に複数のViewControllerがある場合、現在見えてないViewについても"more than one scroll view on-screen"という制約に引っかかってしまうようだ。
例えば横からスライドで出てくるメニューバー的なものを、UITableViewを使ってオレオレ実装したりするとはまりやすい。

複数のScrollViewが同時に存在するときは、適切にscrollsToTopプロパティを設定して、ひとつだけYESになるようにしなくてはいけない。
[Twitter] Twitter 用語

なんで書いたのか全く覚えてないですが
なんか下書きにあったので公開w

| word | en | Explanation | Example |
|:-----------:|:------------:|------------|------------|
| なう | now | 今を表す | デートなう |
| わず | was | 過去を表す | カラオケわず |
| うぃる | will | 未来を表す | ディズニーランドうぃる |
| だん | done | 済んだことを表す | 仕事だん |
Archiveでビルドが失敗する


Xcodeでstatic libraryを使ったアプリを作ってると、普通にビルドする時は通るのに、配布用にArchiveでビルドすると、`Lexical or Preprocessor Issue`と出て失敗することがあります。

ArchiveのときはSearchPathが異なるの原因のようです。

## 環境

- Xcode 5.1.1

## 構成

こんな感じで、workspace内にアプリとstatic libraryがあります。
アプリにstatic libraryをリンクしていて、ご覧の通りBuildが成功してます。

![Untitled2.png](https://qiita-image-store.s3.amazonaws.com/0/38151/b7a0ad84-3480-4ef9-6127-af34d99d55ac.png "Untitled2.png")

## 失敗

deviceを変えて、Archiveするとこのようにヘッダが見つからず失敗します。

![Untitled3.png](https://qiita-image-store.s3.amazonaws.com/0/38151/9ae1911a-067f-dbe6-4238-2d312613d517.png "Untitled3.png")

## 対策

`coolApp`のUser Header Search Pathsに
`$(PROJECT_DIR)/..`を`recursive`で追加してください。

![Untitled4.png](https://qiita-image-store.s3.amazonaws.com/0/38151/eda46bb5-1134-66ed-70bb-4392fdde4e45.png "Untitled4.png")
Tweepyを使ってTwitterからデータを取得


PythonでTwitterAPIを叩くにはTweepyが便利
[Tweepy公式](http://www.tweepy.org/)
[Github](https://github.com/tweepy/tweepy)

ほぼ全て（多分全部？）のAPIをサポートしてるから何でも叩ける。

Consumer keyやAccess tokenについては[ここ](http://webgaku.hateblo.jp/entry/2014/04/11/200523)が詳しいかも。

##例

あるユーザのフォロワーのIDを取ってくる

```api_test.py
import sys
import tweepy

consumer_key = sys.argv[1]
consumer_secret = sys.argv[2]
access_token = sys.argv[3]
access_token_secret = sys.argv[4]

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

print api.followers_ids('yamaguchiyuto')
```

```
$ python api_test.py [consumer key] [consumer secret] [access token] [access token secret]
[90429667, 202652239, 42027820, 19596021, 2195153192, 117687842, 2258629297, 1406786214, 16555745, 14842736, 66415991, 434223, 2346982724, 2333008268, 831055380, 93408266, 17268882, 162083740, 504019119, 228762898, 11722222, 229762645, 132796590, 5623272, 25038224, 1597143732, 110659688, 10121792, 404563048, 181644477, 314346343, 608353, 235254268, 433214780, 6164512, 591682167, 91910392, 44864602, 19161647, 189232458, 396851678, 383715259, 1290571964, 7229862, 337344406, 636211860, 143365117, 16271729, 138080138, 90562000, 377193688, 107033612, 1193350651, 552235322, 533047270, 626637703, 13602752, 1113534024, 513755822, 190063726, 869907272, 386865386, 68339158, 159665742, 901697208, 108157800, 159734839, 815082048, 44519653, 410733253, 847537580, 340900181, 18631141, 89664770, 94797531, 54506895, 147195422, 61168347, 11865812, 457499777, 146706476, 752402191, 753169801, 14488235, 91264606, 17571464, 5597892, 5605872, 426486052, 31390654, 74172008, 49980803, 63187556, 5530022, 97451914, 5528512, 144551657, 58169007, 456506958, 49631101, 178020965, 221644210, 560139598, 8123222, 96398492, 207086775, 186427246, 46570373, 460160272, 127436086, 540747882, 201246351, 291519868, 108860769, 166424351, 132092733, 393374629, 284485000, 136290282, 8424582, 166255351, 87977515, 52575494, 268667702, 135520819, 209969174, 498912433, 496731820, 17916105, 144728570, 344460636, 45550596, 17916220, 96698109, 45092094, 248132475, 214807446, 45122807, 8216412, 187127726, 174820685, 147995371, 108201390, 365348844, 226482519, 116358272, 60355627, 281121335, 56304040, 68645532, 252214105, 248993119, 370616354, 202617625, 5904392, 314036763, 454902363, 119320073, 169429386, 135457590, 265418637, 54505412, 9492602, 94223074, 211548465, 266770141, 137303807, 57221533, 5756062, 12263082, 395771001, 9074002, 140365856, 97645491, 114654723, 156286290, 8428752, 316154491, 222325990, 374043063, 134122371, 76690610, 121094836, 43491198, 135831308, 384080093, 90130178, 270844208, 20692391, 120722054, 64721692, 106022456, 17724558, 279072297, 213220347, 320642436, 57039741, 166399861, 187942923, 265305533, 185990526, 38007036]
```
Xamarin.Forms でどうにかしたい iOS と Android の違い


Xamarin.Forms で簡単な iOS/Android 両対応アプリを作ってみてて、悩ましい点がいくつか見つかってるので、挙げてみる。

## ~~不可視の扱い~~

~~Forms 側のパーツには ``IsVisible = true | false`` がある。
iOS は ``true | false`` なのでいいけど、Android の Visibility は、 ``Visible | Invisible | Gone`` の3つある。~~

~~Forms 側での ``IsVisible = false`` は、Android では ``Invisible`` に相当するみたい。つまり StackLayout とかで「不可視なパーツが **詰められない**」。 iOS の ``Visible = false`` は **詰められる** 模様。~~

``IsVisible = false`` は Android ではちゃんと ``Gone`` になってました、すいませんでした。

## 空文字の扱い

IsVisible と勘違いしてたのはこっちだった。

StackLayout に、Label を2つ積んで、上の Label を空文字にすると、iOSでは詰められるけど、Androidでは空白が空くみたい。こっちはちゃんと裏をとった(汗)

https://gist.github.com/amay077/cf0f4ca1aa14d54bac9a


## 画面回転時の再構築

Android だと、画面を回転させると ``onCreate`` からやり直しなのは常識。
Forms アプリを Android で動かして回転させると、なんと **RootPage まで戻って** しまう。なんじゃこりゃ。

## 回避方法

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/amay077">@amay077</a> あとAndroidの回転問題（バグです）はとりあえず ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation で回避するといいそうです（そりゃそうだ…）</p>&mdash; Atsushi Eno (@atsushieno) <a href="https://twitter.com/atsushieno/statuses/476645011602165760">2014, 6月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こんな感じっすね。

```csharp:MainActivity.cs
[Activity(MainLauncher = true, 
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation )]
public class MainActivity : AndroidActivity
{
```

## BACKキーの扱い

iOS なら ``NavigationPage.SetHasNavigationBar(page, false)`` としてしまえば、ナビゲーションバーが表示されなくなるので、前の画面に戻ることはできなくなるが、Android の BACKキーを無効にするにはどうしたら。。。

### 自己解決

``AndroidActivity`` のサブクラスで、``OnBackPressed`` を override して実装を潰してしまえばよい。けど画面毎に「戻る／戻れない／Confirm出す」とか細かい制御ができるのかは不明。

## デフォルトスタイル

iOS は白基調、Androidは黒基調なので、Forms側で ``TextColor = Color.Black`` などとすると、当たり前だが Android で見えない。
iOS はスタイル変えるのしんどいので、Android側の Theme を ``Theme.Holo.Light`` にしとく。

```csharp:MainActivity.cs
[Activity(Label = "MyApp",  
 MainLauncher = true, 
 Theme = "@android:style/Theme.Holo.Light")]
public class MainActivity : AndroidActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        /* 以下省略 */
```

## 起動時

Android 側の起動時に ActionBar の付いた空白画面が表示される時間が割とながくて気になる(Galaxy Nexus だけど)。Forms の画面をロードするのに時間がかかるのだろうか？
ActionBar だけでも消したくて Theme を ``Theme.Holo.Light.NoActionBar`` にしてみたら Page が表示されなくなった。。。

NoActionBar な Theme を使うと Activity.ActionBar が null になるんだけど、Xamarin.Forms がそれに対応してない気がした（スタックトレース見ると UpdateActionBar で NullReferenceException だし）ので、[Bugzilla](https://bugzilla.xamarin.com/buglist.cgi?product=Forms&component=Forms&resolution=---&list_id=92025) に登録してみた、初めて。どうなるやら。

## 文字の自動縮小

iOS の ``UITextField`` は ``adjustsFontSizeToFitWidth `` を設定するとパーツのサイズに合わせて文字サイズを自動拡縮してくれる機能があったけど、Forms の ``Label`` にはそんなものはありません。``PageRenderer`` を使って iOS 独自処理しないとダメ。

### 自己解決

やはり PageRenderer 使うとできた → [Xamarin.Forms の Label から iOS の UILabel を取り出す](http://qiita.com/amay077/items/8eaa595cc2fc88797b2f)

## iPhone と iPad

StackLayout や RelativeLayout でUIを書けば、相対的な位置関係は iPhone と同じものが iPad でも再現されるが、サイズをリテラルで指定するところは、特にインテグレーションしてくれるわけでないので、プラットフォーム毎に調整が必要。例えば文字サイズは、iPad では iPhone より大きな値にしないと残念な感じに。


他にも見つけたら書きます。
Sidekiq 3.0にするとQueueがいつまで経っても実行されない

最近定番となってるSidekiqですが、少し前にメジャーバージョンアップがありました。
いままで通りに設定して、workerを起動してもいつまで経ってもQueueが実行されないので調べたところ、どうやらinitializerにかいた設定をserver/clientの両方の記述する必要がありそうです。

```rb:config/initializer/sidekiq.rb
Sidekiq.configure_server do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'sidekiq' }
end

Sidekiq.configure_client do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'sidekiq' }
end

```
いままで他のTipsをみていると、configure_serverだけの記述が多いのですが、configure_clientも記述しないと動作しません。
2D用のLookAt関数を作った


### 概要
Unityの `transform.LookAt` メソッドは、任意のオブジェクトを指定するとその方向を向いてくれる便利なメソッドです。相手の方向に飛ぶ弾とかその他諸々活用する機会は多いです。

http://docs.unity3d.com/ScriptReference/Transform.LookAt.html

しかし、2Dゲームでこのメソッドを使うとちょっと不便です。

### 2DでLookAtを使った場合

![](http://i.gyazo.com/3821c847f4e2a3c230d45dc601eebc72.png) ![](http://i.gyazo.com/234f6bfa808d4daf0dbfef03e5966032.png)
例えば左側のキャラを右のCubeの方向に向かせたいとき(画像左)にLookAtを使うとペラッペラな感じになります(画像右)

LookAtメソッドはオブジェクトのZ軸を相手の方向に向かせるので、これは仕方ないです。
なので自分で作った方が良さそうです。
下記の感じでTransformを拡張するクラスを作りました

```csharp
using UnityEngine;
using System.Collections;

public static class TransformExtensions {
    /// <summary>
    /// 指定のオブジェクトの方向に回転する
    /// </summary>
    /// <param name="self">Self.</param>
    /// <param name="target">Target.</param>
    /// <param name="forward">正面方向</param>
	public static void LookAt2D(this Transform self, Transform target, Vector2 forward)
    {
        LookAt2D (self, target.position, forward);
    }

    public static void LookAt2D(this Transform self, Vector3 target, Vector2 forward)
    {
        var forwardDiff = GetForwardDiffPoint (forward);
        Vector3 direction = target - self.position;
        float angle = Mathf.Atan2(direction.y,direction.x) * Mathf.Rad2Deg;
        self.rotation = Quaternion.AngleAxis(angle - forwardDiff, Vector3.forward);
    }

    /// <summary>
    /// 正面の方向の差分を算出する
    /// </summary>
    /// <returns>The forward diff point.</returns>
    /// <param name="forward">Forward.</param>
    static private float GetForwardDiffPoint(Vector2 forward)
    {
        if (Equals (forward, Vector2.up)) return 90;
        if (Equals (forward, Vector2.right)) return 0;
        return 0;
    }
}
```

使い方

```csharp
if (Input.GetKeyDown (KeyCode.Y)) {
    transform.LookAt2D(enemy.transform,Vector2.up);
}
if (Input.GetKeyDown (KeyCode.X)) {
    transform.LookAt2D(enemy.transform,Vector2.right);
}
```

上の例で実行すると、Yを押すとオブジェクトのY軸が相手の方向を向いてくれて、
Xを押すとオブジェクトのX軸が向いてくれます。
![](http://i.gyazo.com/6a9cf529515cdc857e79d3706d503c4a.png) ![](http://i.gyazo.com/1d54f41b1cf08d16f9237d6b6881aa43.png)

3Dだと大体正面はZ軸だけど、2Dは上向きとか右向きとかあるのでお好みで。


でもUnity5辺りで普通に実装されそうだなあ・・。
BeagleBoneBlackをFreeBSD/ARMで動かしてみた

#はじめに
FreeBSD/ARMのイメージファイル作成を補助する[crochet-freebsd](https://github.com/kientzle/crochet-freebsd)を使って[BeagleBone Black](http://beagleboard.org/Products/BeagleBone+Black)向けのイメージファイルを作成した手順を書いておきます。
##用意するモノ
+ BeagleBone Black
+ microSDHCカード
+ USBシリアル変換ケーブル([FTDI USB・シリアル変換ケーブル（3.3V）](http://akizukidenshi.com/catalog/g/gM-05840/)など)
+ FreeBSDが動作する環境(VirtualBox、Hyper-Vなどの仮想環境も可)
+ MicroSDのイメージファイルが書き込める環境

イメージを作成した環境はFreeBSD 10.0p5/AMD64。
VirtualBox及びHyper-Vの仮想マシンに用意しました。
#crochet-freebsdの実行環境を準備
##クロス開発ツール(XDEV)を構築
ソースディレクトリ(/usr/src)に移動し、以下のようにクロスコンパイラとライブラリをビルドします。

```
# cd /usr/src
# make XDEV=arm XDEV_ARCH=armv6 xdev
```

##依存パッケージのインストール
ブートローダーのu-bootのビルド等に必要となるアプリケーションをパッケージからインストールします。

```
# pkg install gsed gcc gmake git
```

gccはgcc47というコマンド名でインストールされるので、gccで参照できるようにシンボリックリンクを張る。

```
# ln -s /usr/local/bin/gcc47 /usr/local/bin/gcc
```

##crochet-freebsdの取得
イメージ作成支援ツールのcrochet-freebsdをgithubのリポジトリからcloneします。

```
# git clone https://github.com/kientzle/crochet-freebsd.git
```

##作成するイメージの設定
crochet-freebsdの設定サンプルをコピーし、作成するイメージにあった設定に変更します。

```
# cd crochet-freebsd
# cp config.sh.sample config.sh
# vi config.sh
```

今回はとりあえず動作するイメージを作るので、デフォルトに対して以下の変更をします。

+ Beaglebone Blackをターゲットにする(board_setup BeagleBoneのコメント(#)を外す)
+ イメージサイズを4GBカードに合わせる(option ImageSize 3900mbのコメントを外す)
+ 初回ブート後にSDカードの容量に合わせてファイルシステムをリサイズする(option AutoSize
のコメントを外す)
+ 1GBスワップファイルを作成(option SwapFile 1024mbを追加)

#イメージファイルを作成
crochet-freebsdを実行してイメージファイルを作成します。

```
# ./crochet-freebsd -c config.sh
```

イメージの作成まで自動で実行されます。
Core i5のWindows 8.1 Pro　64bit + VirtualBox環境でも待ち時間は相当長い(4時間から6時間ぐらいかかります)のでゆっくりと落ち着いて待ちましょう。
ユーザーランドのビルド、カーネルのビルド、ブートローダ(uBoot)のビルド、イメージの作成の各段階ごとにログが出力されます。

#イメージファイルの書き込み
crochet-freebsdのディレクトリ以下に作成されたworkディレクトリにFreeBSD-BEAGLEBONE.imgという名前でイメージファイルが作成されます。
ddコマンドなどでMicroSDカードに書き込みます。
VirtualBoxからの書き込みでは約20分程かかります。
ここも焦らずに待ちましょう。

#起動の確認
書き込みが終わったMicroSDカードをBeagleBone BlackのSDカードスロットにセットします。
MicroSDカード近くのS2ボタンを押下しながら電源を接続します。

初期のrootパスワードはナシですのでユーザー名の入力のみでログインできます。
ここまで来れば基本的にタダのFreeBSDです。

#まとめ
以前、トライした時に比べてFreeBSDのARMサポートも良くなっていますしcrochet-freebsdもだいぶ整理されていて良くなっています。
USBストレージが安定しないなど使えるレベルでは無いと思いますが評価はイケルかと。
Rubyでじゃんけんプログラムを書いてみる


###1.プログラムの仕様

2人（自分とコンピュータ）で行うじゃんけんプログラム

###2.まずはアルゴリズムを考える

ざっとこんなところか

1.自分の手を出す(今回はコマンドライン引数で選択)
2.相手の手を出す(Randメソッドを使用)
3.勝敗の判定する
4.結果を表示する

ポイントは「3.勝敗の判定をする」である。
単純にプログラムを書くと以下のようになる。

```ruby:Janken.rb
	def judge(my,your)
		if my == "グー"
			if your == "グー" 
				puts "あいこです"
			elsif your == "チョキ"
				puts "あなたの勝ちです"
			elsif your == "パー"
				puts "あなたの負けです"
			end
			(以下略)
		end 
	end

```

しかしこれではかなり冗長なプログラムとなるので、少し工夫する。

###3.勝ち、負け、あいこの法則性を探る

何かじゃんけんの結果に法則性があれば、それを利用することで可読性の高いプログラムとなるはずである。

実は「グーを0」、「チョキを1」、「パーを2」と置き、自分の手から相手の手を引き算すると勝ちの場合は「-1 or 2」、負けの場合は「1 or -2」、あいこの場合は「0」となる。


|        |0(グー)|1(チョキ)|2(パー)|
|:-------|--:|---:|--:|
|0(グー)  |0|-1|-2|
|1(チョキ)|1|0|-1|
|2(パー)  |2|1|0|


上記のことを踏まえてプログラムにしてみると以下のようになる


```ruby:Janken.rb
	def judge(human,computer)
		puts "あなたの手は" + @hand[human] + "です。"
		puts "コンピュータの手は" + @hand[computer] + "です。"
		var = human - computer
		if var == -1 || var == 2
			puts "あなたの勝ちです"
		elsif var == 1 || var == -2
			puts "あなたの負けです"
		elsif var == 0
			puts "あいこです"
		end
	end
```


プログラムの全文は以下リンク先から

[Janken.rb](https://github.com/ya6maDev/RubyPractice/blob/master/Janken.rb)
Linux CUI環境でruby + selenium-webdriver

## 概要
javascript使って無いサイトほとんどないと思われるので、
seleniumをつかって解析するのが一番いいと思った。

## 検証環境
CentOS release 6.3

```:rubyバージョン
#  ruby --version
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
```

## Xvfb(仮想フレームバッファ)の準備

```:インストール
# yum -y install xorg-x11-server-Xvfb
# yum -y install firefox
```
```:~/.bash_profile
export DISPLAY=:1
```
```:起動
Xvfb :1 -screen 0 1024x768x24
```
## FireFoxの準備
```:インストール
# yum -y install firefox
```

## selenium-webdriverの準備
```:インストール
# gem install selenium-webdriver
```
## nokogiriの準備
```:インストール
# gem install nokogiri
```

## 使い方のお勉強
ためしに「ワールドカップ」で検索した結果のURLを一覧でだしてみる。

```:test.rb
# coding: utf-8
require 'rubygems'
require 'open-uri'
require 'selenium-webdriver'
require 'nokogiri'
require 'uri'

# 検索条件設定
search_word = "ワールドカップ"

# selenium設定
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://google.com"

# 検索結果取得
begin
  element = driver.find_element(:name, 'q')
  element.send_keys search_word
  element.submit
  #ここでスリープしないと結果がうまくとれなかった。
  sleep 5
rescue
  #なんか失敗したらとりあえずfirefox修了
  driver.quit
end

# 解析
html = driver.page_source
kaiseki_html = Nokogiri::HTML(html)
ranking_data =  kaiseki_html.css("div.rc").css("h3")

ranking_data.each do |site|
  pp site.css("a").attribute("href").value
end


driver.quit
```
```:実行
# ruby test.rb
"http://brazil2014.yahoo.co.jp/schedule/list"
"http://www.asahi.com/worldcup/schedule/"
"http://ja.wikipedia.org/wiki/FIFA%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E3%82%AB%E3%83%83%E3%83%97"
"http://www.tsp21.com/sports/soccer/wc2014/"
"http://members.jcom.home.ne.jp/wcup/"
"http://blog.livedoor.jp/kaikaihanno/archives/35456376.html"
"http://samuraiblue.jp/"
"http://www.soccer-king.jp/news/wc"
"http://matome.naver.jp/topic/1LvDt"
"http://jp.uefa.com/news/newsid=2033214.html"
```
AnsibleでVagrantのCentOSにミドルウェアを自動インストールする方法

Ansibleを使えば、chefよりも簡単に自動でサーバー作ったり、デプロイしたり色々出来るよ
と言われても、自分で試してみないといまいちピンとこない。

今回は事前にMacのローカルにVagrantでCentOSを用意しておき、
Ansibleを使って、Vagrantへミドルウェアをインストールする所までやってみました。

## Macにansibleをインストールする

ansibleをインストールする方法は、OSによって異なりますが
Macの場合はbrewでインストールするのが一番早いです。

```
$ brew update
$ brew install ansible
```

## SSHの設定をする

まずはホストOS(Mac)からゲストOS(CentOS)へ
Ansibleのコマンドを実行出来るようにSSHの設定をします

* Mac側の作業

```
vi ~/.ssh/config
```

以下を追記

```
Host [vagrantのIPアドレス]
IdentityFile ~/.vagrant.d/insecure_private_key
User vagrant
```

## hostsファイルを用意する

AnsibleではInventoryという概念があります。

一言でいえば、Ansibleで操作する対象のことですね。

Inventoryでは、以下のようにグループとホストを設定することが出来ます。

```
[Group名]
ホスト名
```

グループの中にグループを入れ子にするなんてことも出来ます。

```
[Group:children]
ホスト名
```

今回はシンプルに1つのグループと1つのホスト名を指定することにします。

デフォルトだと、/etc/ansible/hostsの中身を確認してしまうので
今回はカレントディレクトリにhostsというファイルを用意して読み込むようにします。

```
vi hosts
```

```
[servers]
192.168.x.x
```

このような内容のファイルを作成したものとします。

## VagrantのCentOSにpingを送ってみる

以下のコマンドは、

hostsファイルのserversグループのホストにpingを送るというコマンドです。

```
ansible -i hosts servers -m ping
```

-i は Inventoryファイルを任意に指定するオプション

hosts は Inventoryファイルの名前

servers は グループ名

-m は 任意のモジュールを指定するオプション

Ansibleには、モジュールという概念があり、

pingやyum,commandなど色々とあります。

これらを使って、実際の操作を行っていきます。

詳しくは公式サイトを見て下さい。
All Modules — Ansible Documentation 
http://docs.ansible.com/list_of_all_modules.html

## VagrantにNginxをインストールしてみる

さて、ここからが本番です。

前述した通り、Ansibleではモジュールを使って、
サーバーに対して色々と操作を行っていきます。

モジュールを実行する方法には、

* コマンドから直接実行する方法
* プレイブックを利用する方法

の2つがあります。

本格的にAnsibleを使う場合は、2番目のプレイブックを利用する必要があります。

プレイブックとは簡単にいえば、

「自分がAnsibleで実行したいタスクをまとめたもの」です。

これを実行することで、一発で開発環境を構築する！とかが出来ます。

とはいってもそこまでやるのは大変なので、
今回はCentOSにnginxをインストールするプレイブックを作ってみました。


```
---
- hosts: servers
  sudo: true
  user: vagrant
  tasks:
    - name: get nginx repo
      command: rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

    - name: install nginx
      yum: name=nginx state=latest

    - name: start nginx service
      service: name=nginx state=started
```

* Nginxのリポジトリを追加
* 最新版をyumでインストール
* インストールが完了したらNginxをスタート

この3つをhostsファイルのserversグループのホストに対して実行するというプレイブックです。

プレイブックは、**.yamlという形式で保存します。

なので今回はnginx.yamlというファイルにしました。

実行は以下のコマンドで出来ます。

```
ansible-playbook -i hosts nginx.yaml
```

無事完了すると、指定したVagrant上のCentOSにNginxがインストールされているはずです。

今回は以上です。

次回はもう一つ、非常に重要な概念であるRoleについて書こうと思います！
Google Maps APIでマーカをクリックしたときに、個別の内容のInfoWindowを表示したい。


## クロージャを利用する事で目的の動作を行えるみたい。
まずクロージャが何者かを知る必要があり、以下のサイトがすごいわかりやすかった。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Closures

## Googleのドキュメントを読み解く。
Googleのデベロッパーサイトに、ソースコード付きで記載があった。これも、読んでいてすごいわかりやすかった。
https://developers.google.com/maps/documentation/javascript/events?hl=ja#EventClosures

## せっかくなので
自作のサンプルコード（抜粋 & 簡略版）をあげておく。

```js
function plotMarker(markers){
    for(var idx=0; idx < marker.length; idx++){
        marker.setMap(map);
        onMarkerClick(marker, idx);
    }
}

function onMarkerClick(marker, idx){
    google.maps.event.addListener(
        marker
    ,   'click'
    ,   function(event){
            alert(idx);
        }
    );
}
```

これで10個マーカがあった場合、それぞれのマーカに対応するインデックス番号がアラート表示される。
iOS5でviewDidAppear:内でaddChildViewController:するとChildViewControllerのviewWillAppear:が呼ばれない

なにこれ……

```objc:AppDelegate.h
//
//  AppDelegate.m
//  SimpleNestedViewController

#import "AppDelegate.h"

@interface ChildViewController : UIViewController
@end

@implementation ChildViewController

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  
  NSLog(@"iOS5だとviewWillAppear:が呼ばれない");
}

@end

@interface ParentViewController : UIViewController
@end

@implementation ParentViewController

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];

  ChildViewController* childViewController = [ChildViewController new];
  [self addChildViewController:childViewController];
  [self.view addSubview:childViewController.view];
  [childViewController didMoveToParentViewController:self];
  
  dispatch_async(dispatch_get_main_queue(), ^{
    // ここに移動するとNSLog呼ばれる
  });
}

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  self.window.rootViewController = [ParentViewController new];
  [self.window makeKeyAndVisible];
  return YES;
}

@end
`````

(iOS SDK 7.1 / iOS 5.1.1 で確認)
Ruby | Kernelにdefメソッドを定義してみる

# Kernelにdefメソッドを定義してみる

特に意味はありませんが Kernel module に def メソッドを定義してみます。

## サンプルコード

~~~ruby
module Kernel
  def def(msg)
    "my def #{msg}"
  end
end

print send :def, 'args' # => 'my def args'

# 通常の def キーワードと判断されて使えない
# def 'hoge'
~~~

## 結果

* メソッドの定義は問題なくできる
* sendで呼び出せば問題なく動作する
* 直接呼び出そうとすると def キーワードと判断され end がないため syntax error が発生
ローカルで開発中のgemをリロードする


ローカルでgemを開発する時、それを利用するRailsアプリケーションと連動して動かしたい時、gem側の変更を再読み込みするのには`rails console`だと`reload!`が効かず再起動が必要になって時間がかかる。

それを解決する方法

## RequireReloader gem

[require_reloader](https://github.com/teohm/require_reloader)

gemを追加

```ruby:Gemfile
group :development do
  gem 'require_reloader'
```

```ruby:config/environments/development.rb
YourApp::Application.configure do
  ...
  RequireReloader.watch_local_gems!
end
```

以下、Railsコンソールで

`> reload!; MyGemModel.new`

依然`reload!`は必要

### Springを一時無効にする (Rails4.1以降など)

`require_reloader`を入れる前、最初はspringで少しはまった。
単純に`rails c`を再起動しても再読み込みされなかった。

```sh
# Springを一時的に無効にする
DISABLE_SPRING=1 rails c

# Spring関連コマンド
bin/spring status
bin/spring stop
```

`require_reloader`入れると、`DISABLE_SPRING`の有無関係なく動く。

StackOverflowでも色々な方法があったけど、今回の方法がすっきりしているように思ったのでこれにした。

`pry`とか`load`使うとかでも出来る方法は他にもありそう。
`reload!`もしたくない人は他の方法を考える必要がある。

関連：[BundlerでGemfileを変更せずにローカルの:pathのgemを使う](http://qiita.com/quattro_4/items/8ec707d527d64e109ee0)
GetFileInformationByHandleEx(FileIdBothDirectoryInfo) を利用したディレクトリ内ファイル列挙

GetFileInformationByHandleEx を FileIdBothDirectoryInfo を指定して呼んだ時の処理がなかなか無かったので書いてみた。

メリット
・ファイル列挙の手段としては FindFirst/NextFile よりも速いらしい。というか、FindFirst/NextFile の内部動作っすねー。
・親ディレクトリのファイルハンドルが必要。
・ファイルの属性などにかかわらず全ファイルが列挙される。

デメリット
・ファイルの属性などにかかわらず全ファイルが列挙される。
・ワイルドカードの処理がないので一つのファイルの情報を得たい場合にはFindFirst/NextFileのほうが楽。


```cpp
CAtlFile hFile;     //ディレクトリのファイルハンドル。
hFile.Create(strPath, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS);
//ディレクトリをファイルとして開く場合には FILE_FLAG_BACKUP_SEMANTICS が必要なことに注意。

//const int FILENAME_LENGTH_MAX = 255;
//BYTE data[sizeof(FILE_ID_BOTH_DIR_INFO) + sizeof(WCHAR) * FILENAME_LENGTH_MAX];
BYTE data[64 * 1024];
DWORD dwErr;
FILE_ID_BOTH_DIR_INFO *pfi = NULL;
for (; ;) {
    if (pfi == NULL || pfi->NextEntryOffset == 0) {
        SetLastError(ERROR_SUCCESS);

        memset(data, 0, sizeof(data));
        rc = GetFileInformationByHandleEx(hFile, FileIdBothDirectoryInfo, data, _countof(data));
        if (rc == FALSE) {
            break;
        }

        pfi = (FILE_ID_BOTH_DIR_INFO *)data;
    }
    else {
        pfi = (FILE_ID_BOTH_DIR_INFO *)(((BYTE *)pfi) + pfi->NextEntryOffset);
    }

    CStringW cFileName = CStringW(pfi->FileName, pfi->FileNameLength / sizeof(WCHAR));
    CStringW strChild = strPath + L"\\" + cFileName;
    
    //  ...
}

dwErr = GetLastError();

if (dwErr == (pfi == NULL ? ERROR_FILE_NOT_FOUND : ERROR_NO_MORE_FILES)) {
    //  まだファイルを一度も見つけられずにループを場合には ERROR_FILE_NOT_FOUND、
    //  ひとつ以上のファイルを見つけてループを抜けた場合には ERROR_NO_MORE_FILES、
    //  がエラー値として返るので、この場合はエラーではないとする。

    //  (ERROR_FILE_NOT_FOUND になることはありえない気がするけれど？) → 気にしない

    dwErr = ERROR_SUCCESS;
}
```

FileIdBothDirectoryInfo で GetFileInformationByHandleEx すると、渡されたメモリ領域に入るだけファイル情報が詰め込まれる。
詰め込まれる個数は列挙されるファイル名の長さによって不定。

一つもファイル情報を格納できないバッファを渡すとかしないよう、
バッファサイズは sizeof(FILE_ID_BOTH_DIR_INFO) + sizeof(WCHAR) * (FILENAME_LENGTH_MAX - 1) 以上確保したほうが良い。NTFS だと FILENAME_LENGTH_MAX=255。

同じファイルハンドルに対して、再び GetFileInformationByHandleEx(FileIdBothDirectoryInfo) すると、前回の続きのファイルが取得できる。

これを最初に戻したかったら、引数をFileIdBothDirectoryRestartInfo にして呼んでやる。
coffeescriptで遊ぶだけなら、もうjadeでいいじゃん


~~~jade
html
	head
	body
		h1 例えばCanvasだったらこうなる
		canvas#canvas-chan(
			width = 500
			height = 500
		)
		script
			:coffee
				canvas = document.getElementById "canvas-chan"
				c = canvas.getContext '2d'
				w = c.canvas.width
				h = c.canvas.height
				
				c.strokeText "hello world from jade", w / 2, h / 2
~~~

gruntでプリコンパイル環境作って気付いた。
coffeescriptインストールしてないと通らないらしい。

そもそも

~~~yahoo.jade
:coffee
	console.log "hello"
~~~

これが

~~~
(function() {
  console.log("hello");
})();
~~~

になる。実質coffeescriptファイルですね。
なので上のyahoo.jadeは

~~~index.jade
html
	head
	body
		script
			include yahoo
~~~

読み込めます。
MongoDBに画像を保存してnode.js(Express)とangularJSで表示する

画像をBASE64エンコードしてMongoDBに保存すれば、取り出してそのまま`<img>`タグにセットできるじゃん！！という横着な方法です。
BASE64エンコードするとバイナリよりサイズが大きくなるのでMongoDBの容量を節約したいときはやめましょう。

（画像はファイルシステムに保存して、パスなどをMongoDBに保存するのが王道なのかな？？）

# 流れ

1. クライアントから画像（BASE64エンコード済み文字列）をアップロード（例としてandroidから送る）
2. expressで受け取って、MongoDBに保存（Mongoose使用）
3. 取り出してangularJSでブラウザに表示

# 1. クライアントから画像をアップロード

node.jsやMongoDBで扱い易いのでJSONに入れて送ります。
例えばAndroidから送るのであれば、こんなメソッドを用意して、BitmapをBase64エンコードした文字列を取得して、JSONに詰めて送信。
送信するところは省略。[volleyなりなんなり使ってどうぞ。](http://techbooster.org/android/hacks/16474/)

↓この部分はJavaのソースコードなので注意。

```java:java
private String stringifyBitmap(Bitmap bitmap) {
        ByteArrayOutputStream byteArrayBitmapStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayBitmapStream);
        return Base64.encodeToString(byteArrayBitmapStream.toByteArray(), Base64.DEFAULT);
}
```

`http://<ホスト名>/book` にPOSTします。
JSONはこんな感じの想定。

```js:jsondata
{
  jsondata: {
    title: 'とある本',
    coverImage: <BASE64エンコード済みの文字列>
  }
}
```

# 2. expressで受け取って、MongoDBに保存（Mongoose使用）

## express

```js:web.js
app.post('/book', db.book.create); // POSTの処理
```

```js:model.js
// Bookスキーマを定義
var BookSchema = new mongoose.Schema({
    title  : String,
    coverImage : String
});

exports.Book = db.model('Book', BookSchema);

```

```js:db.js
// jsonからPOSTデータを取り出す。
var content = JSON.parse(req.body.jsondata);

// MongoDBにBookドキュメントを保存
exports.book.create = function(req, res) {
  Book.create(content, function (err, data) {
    if (err) throw new Error(err);
    res.send('{ result: "ok" }');
  });
};

```

# 3. 取り出してangularJSでブラウザに表示

## express

```js:web.js
app.get('/book', db.book.read); // GETの処理。要認証

```

```js:db.js
exports.book.read = function(req, res) {
  Book.find({ title: 'とある本' }, function(err, docs) {
    if (err) throw new Error(err);
    res.send(docs);
  });
};

```

## angularJS

```main.js
angular.module('angularApp').controller('MainCtrl', function ($scope, $http) {
  var url = '/book';

  $scope.book = [];
  $scope.getBook = function() {
    $http.get(url).success(function(data) {
      $scope.book = data;
    });
  };

  $scope.getBook();
});
```

`img`タグのsrc属性にdataスキームとしてそのままセット！！！

```html:main.html
<img src="data:image/gif;base64,{{book.coverImage}}"/>
````

最初にBASE64エンコードして以降、データを一切変換・加工してないところがポイント。
defuiとCrate(Hiccup)メモ

Light Tableのlt.macros/defuiの使い方メモ。
defuiマクロはHTMLのElementを生成する関数を定義するものです。

```clj:lt.macros.clj抜粋
(defmacro defui [sym params hiccup & events]
  `(defn ~sym ~params
     (let [e# (crate.core/html ~hiccup)]
       (doseq [[ev# func#] (partition 2 ~(vec events))]
         (lt.util.dom/on e# ev# func#))
       e#)))
```


### eventsの部分を使わないサンプル

defuiのparamsの部分では関数の引数を好きに定義できます。
defuiのhiccupの部分ではHTMLの要素を[Hiccup](https://github.com/weavejester/hiccup/)の書式で定義します。
実際には[Crate](https://github.com/ibdknox/crate)(A ClojureScript implementation of Hiccup)が使われています。

```clj:sample.cljs
(ns sample.core
  (:require [lt.util.dom :as dom])
  (:require-macros [lt.macros :refer [behavior defui]]))

(defui create-div [text]
  [:div [:div text]])

(.-innerHTML (create-div :sample))

(defui create-div2 [& [value]]
  [:div [:div {:style "color:red; margin: 5px"} value]])

(.-innerHTML (create-div2))
(.-innerHTML (create-div2 123))
```

innerHTMLの結果

```
"<div>:sample</div>"
"<div style=\"color:red; margin: 5px\"></div>"
"<div style=\"color:red; margin: 5px\">123</div>"
```

Hiccupの書式は[tag & body]または[tag attributes & body]です。
tagの部分はCSSセレクタのような書式でも書けます。[:div#email.selected.starred "..."]

### eventsの部分を使うサンプル

eventsのev#とfunc#はJavaScriptのaddEventListenerの引数となる「イベントの種類」と「EventListenerの関数」であればよいようです。


```clj:sample2.cljs
(defui create-div3 []
  [:button [:div#abc [:span.def 987]]]
  :click (fn [event] (println event)))

(.-outerHTML (create-div3))
```

outerHTMLの結果

```
"<button><div id=\"abc\"><span class=\"def\">987</span></div></button>"
```

defuiの中から呼ばれるlt.util.com/onは以下のとおり

```clj:lt.util.dom.cljs抜粋
(defn ->ev [ev]
  (str (name ev)))

(defn on [elem ev cb]
  (.addEventListener elem (->ev ev) cb))
```
Ruby ローカル開発中自動でテストが走る環境を構築する

# この記事について

めでたく業務でRubyを触る事になったので、Rubyに詳しい後輩さんに教わったローカル自動テスト環境準備手順をメモしてみる。

# 環境

* Mac OS X 10.8.5
* Ruby 2.1.1p76
* Bundler 1.6.2
* Growl 2.1.3

# 準備

サンプルコードをGitから取得し、ローカル環境を準備する。

```Bash:terminal
cd /LOCAL_DIR_PATH/
git clone git@github.com:hoge/fuga.git
cd fuga
bundle install --path vendor/bundle
```

これでRubyを動かす準備はOK。
とても簡単。すごいなRuby。

# GuardとGrowlと連携させる

Guardがファイルを変更したタイミングでテストを自動実行し、結果をGrowlで通知するように設定する。

## Gemfileの中身

GemfileにはRspec、Guard、Growlの連携をさせるために必要なGemを記述してあった。

```ruby:Gemfile
  gem 'rspec'
  gem 'guard'
  gem 'guard-rspec'
  gem 'growl'
```

## Growlのインストール〜設定

1. MacのAppStoreからGrowlをインストールする。
1. [こちら](http://growl.info/downloads)からGrowlNotifyをDLしてインストール

インストール後にGuardを起動するとGrowlが勝手に通知を受け取ってくれるのでGrowlの設定は以上。

## Guardの起動

Guardはすでに入っているので、以下のコマンドで動かすだけ。

```sh:terminal
bundle exec guard
```

## 確認

別にターミナルを上げて、サンプルファイルを編集し、保存。

<img src="https://qiita-image-store.s3.amazonaws.com/0/30607/52b2ae49-e32d-dbc9-2323-f6f571edef62.png" alt="RSpec_result.png" width="300px">



無事に動きました。
td-agentをhomebrewでインストールする

http://docs.fluentd.org/ja/articles/install-by-homebrew

だいたいここの手順でいけるが、ちょっとだけ手詰まりがあったのでメモ。

環境 : Mavericks

* `ruby-build` の `HEAD` が入ってた

```
==> RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local/Cellar/openssl/1.0.1f --with-readline-dir=/usr/local/Cellar/readline/6.2.4" /usr/local/Cellar/ruby-build/20140225/bin/ruby-
sh: /usr/local/Cellar/ruby-build/20140225/bin/ruby-build: No such file or directory
```

symlink張って解決。

```
% ln -s /usr/local/Cellar/ruby-build/HEAD /usr/local/Cellar/ruby-build/20140524
```

* `brew link` が失敗する

```
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using:
  brew link td-agent
```

`libyaml` がconflictしていた。`brew` の親切アドバイスどおりで解決。

```
% brew link td-agent
Linking /usr/local/Cellar/td-agent/1.1.17... 
Error: Could not symlink include/yaml.h
Target /usr/local/include/yaml.h
is a symlink belonging to libyaml. You can unlink it:
  brew unlink libyaml

To force the link and overwrite all conflicting files:
  brew link --overwrite td-agent

To list all files that would be deleted:
  brew link --overwrite --dry-run td-agent
% brew unlink libyaml
Unlinking /usr/local/Cellar/libyaml/0.1.6... 5 symlinks removed
% brew link --overwrite td-agent
Linking /usr/local/Cellar/td-agent/1.1.17... 38 symlinks created
```
VagrantでVM起動時に、追加ディスクを作成してアタッチ - VirtualBox Provider

<!-- permanent -->

VagrantでVMを作ってプロビジョニングをテストする際に、起動ディスク以外おｎディスクがアタッチされている状況を再現したい事もあります。
対象がPublic/PrivateなIaaSならEC2(EBS)だったり、CloudStack, OpenStackでも結構見られる状況かなと。

確認したのは`Vagrant 1.6.2`。


ざっとこんな感じで記述します。

```ruby:Vagrantfile
# -- snip --
    config.vm.define machine do |config|

      config.vm.provider :virtualbox do |vb|
        at_disk = 'tmp/name_of_file.vdi'
        unless File.exists?(at_disk)
          vb.customize ['createhd', '--filename', at_disk, '--size', 5 * 1024]
        end
        vb.customize ['storageattach', :id, '--storagectl', 'IDE Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', at_disk]
        end
      end

    end
# -- snip --
```

この記述で、次のような挙動になります。

- vagrant up時に仮想ディスクファイルを(作成して)アタッチ
- reset/reload時は内容残したままリブート
- vagrant destroy時に一緒に削除

デフォルトではdestroy時、一緒に消えることに注意です。


ついでに、`customize`についてはVBoxManageに渡すオプションを記述すればよいので、他のカスタマイズは`VBoxManage`本体のヘルプが参考になるはず。


例えば`storageattach`。

```
VBoxManage storageattach    <uuid|vmname>
                            --storagectl <name>
                            [--port <number>]
                            [--device <number>]
                            [--type dvddrive|hdd|fdd]
                            [--medium none|emptydrive|additions|
                                      <uuid|filename>|host:<drive>|iscsi]
                            [--mtype normal|writethrough|immutable|shareable|
                                     readonly|multiattach]
                            [--comment <text>]
                            [--setuuid <uuid>]
                            [--setparentuuid <uuid>]
                            [--passthrough on|off]
                            [--tempeject on|off]
                            [--nonrotational on|off]
                            [--discard on|off]
                            [--bandwidthgroup <name>]
                            [--forceunmount]
                            [--server <name>|<ip>]
                            [--target <target>]
                            [--tport <port>]
                            [--lun <lun>]
                            [--encodedlun <lun>]
                            [--username <username>]
                            [--password <password>]
                            [--initiator <initiator>]
                            [--intnet]

```
Dockerfileでincludeを使う

# Dockerfileにincludeを使う方法

## INCLUDE?

Dockerfileには定型文が続くので include 文があればまとまり単位で整理することが出来て良いのですが、現状ありません。
それに対する案として[GNU C PreProcessor](http://linuxjm.sourceforge.jp/html/GNU_gcc/man1/cpp.1.html)を使う方法が[こちらのコメント](https://github.com/dotcloud/docker/issues/735#issuecomment-37273719)にあったので、備忘録として。

## `Makefile`を作成

```mf
Dockerfile: Dockerfile.in *.docker
  cpp -P -o Dockerfile Dockerfile.in

build: Dockerfile
  sudo docker build --no-cache -t RepositoryName .
```

* 2行目と5行目の先頭はハードタブである必要がありますので注意。

## Dockerfile.in を作成

* これはどんなファイル名でもいいですが、Makefileに合わせる必要があります。
* 例えば以下のような感じで作成。

```
FROM debian:stable

MAINTAINER d6rkaiz

#include "env.docker"
#include "apt.docker"
#include "locale.docker"
#include "adduser.docker"
#include "sudo.docker"
#include "supervisor.docker"
#include "nginx.docker"
#include "cleanup.docker"

EXPOSE 80
CMD /usr/bin/supervisord
```

## *.docker作成

* 上記の例で言えば、env.dockerやnginx.dockerなどを区切りの良いところで作成していきます。
* 私は apt.docker を以下のような感じで作成しています。

```
ADD conf/apt/sources.list /etc/apt/
RUN apt-get update -qq
RUN apt-get upgrade -qqy
RUN apt-get install -qqy locales openssh-server ca-certificates wget sudo supervisor
```

## Dockerfile生成

```
$ make
```

とすれば`Dockerfile`が作成されます。同様にイメージのビルドも同時に行なうには

```
$ make build
```

とすることでイメージのビルドも同時に実行するようになります。

## 制限事項など

Dockerfile生成に [GNU C PreProcessor](http://linuxjm.sourceforge.jp/html/GNU_gcc/man1/cpp.1.html) を使っているので、以下のような制限があります。

* `//` はコメントとして解釈されるのでURLを記載する場合にはシングルクォートかダブルクォートで囲む必要があります。
* 翻って`#`はコメントと見なされません。`#include`, `#if`, `#define` 等以外の`cpp`で解釈できない文言を入れた場合にはエラーとなります。
MySQLでViewを使ってるDBの複製でエラーが出た

##やってた事

hoge1 ユーザーの hoge1_db を
hoge2 ユーザーの hoge2_db にコピーしたい。

phpMyAdminでhoge2ユーザーを作り、root権限でhoge1_db を hoge2_dbにコピーしようとしたら以下のエラー

```
#1356 - View 'hoge1_db.view_count' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
```

VIEWの権限がないみたいなエラー。

##CREATE VIEWを編集する

ダンプファイルを作成する

```
mysqldump -u hoge1 -p --databases hoge1_db > hoge.dump
```

hoge.dump内のCREATE VIEW しているSQLのDEFINERを編集

```
CREATE ALGORITHM=UNDEFINED DEFINER=`hoge1`@`%` SQL SECURITY DEFINER VIEW `view_count` AS ...

↓

CREATE ALGORITHM=UNDEFINED DEFINER=`hoge2`@`%` SQL SECURITY DEFINER VIEW `view_count` AS ...
```

リストア実行

```
mysql -u hoge2 -p hoge2_db < hoge.dump
```

##参考
http://dev.mysql.com/doc/refman/5.1/ja/create-view.html
shebangに自作スクリプト

# shebangに自作スクリプト

これみて「すげぇ」と思って試してみた。
http://qiita.com/ngyuki/items/8d2a4a203087221bfafd

## 実行可能なsqlファイル

たとえば

```bash:/tmp/exec_sql.sh
#!/bin/bash
cat $1 | tail +2 | mysql -N --batch
```

```bash:sample.sql
#!/usr/bin/env /tmp/exec_sql.sh
SHOW DATABASES;
```

とかやっとくと

```bash:bash
chmod +x /tmp/exec_sql.sh
chmod +x sample.sql
./sample.sql
```

でsqlが実行できたりする。
`sample.sql`のshebangを読み飛ばすのに`tail +2`しておくのが肝。

良く使う定型クエリをスニペットファイルに保存しておいて
１枚かませて実行権限付けとけば便利…なのか？
sidekiqにretryしてほしくないが、死亡には入って手動retry出来るようにしたい場合

sidekiqでは`retry: false`にしてしまうと死亡にタスクが入りません。

> Only jobs configured with 0 or greater retries will go to the Dead Job Queue.
https://github.com/mperham/sidekiq/wiki/Error-Handling#dead-job-queue

ということなので、`sidekiq_options retry: 0`にしましょう。
Xvfb+Firefoxで"Error: No running window found"となってハマりかけた話

#結論 man firefoxをちゃんと読もう

## Xvfb上でFirefoxから http://www.google.co.jp/ へアクセスしようとしたら"Error: No running window found"

```bash:
$ Xvfb :1 &
$ DISPLAY=:1 firefox -remote "openURL(http://www.google.co.jp/)" &
```

結果は”Error: No running window found”とエラーを吐いて、Firefoxはプロセス終了

```bash:
Error: No running window found
```

## 何がダメだったの？
Firefox の remote オプションで指定したコマンドは、実行中のFirefoxプロセス上で発行される。(後述のman firefoxを参照)
なので、Firefoxのプロセスを起動せずに、remoteオプションでコマンドを発行しようとしていたため、

実行中のFirefoxのウインドウがないよ！(Error: No running window found)

と怒られたわけです。


## 正しくはこうする

```bash:
$ Xvfb :1 &
$ DISPLAY=:1 firefox http://www.google.co.jp/ &

もしくは

$ Xvfb :1 &
$ DISPLAY=:1 firefox &
$ firefox -remote "openURL(http://www.google.co.jp/)"


もしくは

$ Xvfb :1 &
$ DISPLAY=:1 firefox -a firefox -remote "openURL(http://www.google.co.jp/)" &
```


## man firefoxにはこう書いてあった


```bash:man:firefoxより抜粋
       -remote command
              Execute command in an already running Firefox process.  For more info, see: http://www.mozilla.org/unix/remote.html

```

すでに動いているFirefoxのプロセス上でコマンドを実行します　って書いてある。
ちゃんと読もう　＞自分。