OmniAICreator/Qiita-1.07M huggingface dataset:
Swift用の通信ライブラリAlamofireでcookie付きの通信を行う

# Swift用の通信ライブラリAlamofireでcookie付きの通信を行う

## Alamofire=AFNetworkingのSwift版のようなものらしい

APIのテストアプリで、Swiftを使ってみようかと思いまして。調べたところ、Objective-Cの定番ライブラリAFNetworkingの作者さんがSwift版のライブラリを作成されているとか。

ただ、Cookie付きの通信については資料が少なく、かなり手間取ったのでメモっておきます。


## Alamofire.Request

Alamofire.Requestを取得するには、2通りの方法があるようです。

``` Swift
func request(URLRequest: URLRequestConvertible) -> Alamofire.Request
```

``` Swift
func request(method: Alamofire.Method, URLString: URLStringConvertible, parameters: [String : AnyObject]? = default, encoding: Alamofire.ParameterEncoding = default) -> Alamofire.Request
```

このうち、後者だと細かい設定が出来ないっぽい(?)んで、前者を使用します。

引数は1つだけで、URLRequestConvertible を継承したクラスを作って渡せばいいようです。Adapterパターン(だったかな?)ですね。

## URLRequestConvertible

URLRequestConvertibleは以下のprotocolです。

``` Swift
protocol URLRequestConvertible {
    var URLRequest: NSURLRequest { get }
}
```

サブクラス"MyRequest"を作成し、URLRequestのgetのところで、Cookie付きのNSURLRequestを返すように仕込んでおきます。


``` Swift
class MyRequest: URLRequestConvertible {

    let SERVER_ADDRESS = "http://www.example.com/"
    
    init() {
    }
    
    // URLRequestConvertible protocol
    var URLRequest: NSURLRequest {
        let url = NSURL.URLWithString(SERVER_ADDRESS)
        var request = NSMutableURLRequest(URL: url)

        request.HTTPMethod = "POST"
        
        // set cookie
        let properties = [NSHTTPCookieOriginURL: SERVER_ADDRESS,
            NSHTTPCookieName: "cookie_name",
            NSHTTPCookieValue: "cookie_value",
            NSHTTPCookiePath : "\\"]
        
        let cookie : NSHTTPCookie = NSHTTPCookie.cookieWithProperties(properties)!
        let cookies = [cookie]
        let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies)
        
        request.allHTTPHeaderFields = headers
        
        return request;
    }
}
```


呼び出し側はこのような感じで。


```Swift
Alamofire.request(MyRequest())
.responseJSON { (_, _, _, _) in
	/* do something... */
}
```

これで、Cookie付きの通信ができてるはずです...。


## 参考リンク
* [Alamofire/Alamofire](https://github.com/Alamofire/Alamofire)
* [iOS - AFNetworkingのSwift版とも言えるAlamofireを試してみた - Qiita](http://qiita.com/asakahara/items/2b01738419a03314d845)
* [Swift版AFNetworkingのAlamofireを使ってみよう！ | ワンダープラネットエンジニア Blog](http://wonderpla.net/blog/engineer/Swift_Alamofire/)
Intel EdisonでiBeaconを受信する（Node.js + bleacon）

Intel EdisonでiBeaconの信号を受信するためのメモ。
内容的には、参考にしたページ『[Intel EdisonをiBeacon化する． - 椎茸糞日記](http://shiitakeo.hatenablog.jp/entry/2014/11/04/021844)』を超えるものはありません。

# 環境

使用した環境は以下の通りです。

```
root# uname -a
Linux nayutaya-edison-001 3.10.17-poky-edison+ #1 SMP PREEMPT Tue Oct 14 15:19:49 CEST 2014 i686 GNU/Linux
root# cat /etc/version
edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
root# node -v
v0.10.32
root# npm -v
1.4.28
```

# Bluetoothを有効化する

Intel EdisonのBluetoothは出荷時状態では無効化されています。
『[Intel EdisonのBluetoothを有効化する - Qiita](http://qiita.com/yuyakato/items/b4ecd956a94b8132341c)』などを参考に、Bluetoothを有効化してください。

# bluezのヘッダファイルをインストールする

`bleacon`モジュールを利用するためには`bluetooth.h`が必要なため、`opkg`コマンドを用いて`bluez5-dev`パッケージをインストールします。

```
root# vi /etc/opkg/base-feeds.conf
root# cat /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

root# opkg update
root# opkg upgrade
root# opkg install bluez5-dev
```

# bleaconモジュールをインストールする

`npm`コマンドを用いて`bleacon`モジュールをインストールします。
執筆時点でのバージョンは`0.2.0`でした。

```
root# npm install bleacon
```

# iBeaconの信号を受信する

iBeaconの信号を受信し、コンソールに出力するためのスクリプトを準備します。

```js:beacon_discover.js
var Bleacon = require("bleacon");
Bleacon.startScanning();
Bleacon.on("discover", function(bleacon) {
  console.dir(bleacon);
});
```

スクリプトを実行すると、コンソールに情報が出力されます。なお、root権限が必要です。
（UUIDはマスクしています）

```
root# node beacon_discover.js
{ uuid: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  major: 1,
  minor: 1,
  measuredPower: -76,
  rssi: -70,
  accuracy: 0.7450788247551209,
  proximity: 'near' }
...
```

# 参考

- [Intel EdisonをiBeacon化する． - 椎茸糞日記](http://shiitakeo.hatenablog.jp/entry/2014/11/04/021844)
- [Intel EdisonのBluetoothを有効化する - Qiita](http://qiita.com/yuyakato/items/b4ecd956a94b8132341c)
- [Raspberry PiでiBeaconを受信する（Node.js + bleacon） - Qiita](http://qiita.com/yuyakato/items/739443960fac2668f4a3)
Elixir Sets #elixir

# Elixir Sets

## 概要
Elixir の Sets について

Elixir では [Set behavior](http://elixir-lang.org/docs/stable/elixir/Set.html) で
Set を扱います。

ここでは、 Set を実装した [HashSet](http://elixir-lang.org/docs/stable/elixir/HashSet.html) を例示します

## サンプル

~~~elixir
set1 = Enum.into 2..6, HashSet.new
IO.inspect set1

# delete(set, term)
# Set1 から 3 を除去
IO.inspect "delete(set, term)"
IO.inspect Set.delete set1, 3

# difference(set1, set2)
IO.inspect "difference(set1, set2)"
set2 = Enum.into 4..8, HashSet.new
# Set1 から Set2 を除去
IO.inspect Set.difference set1, set2

# disjoint?(set1, set2)
IO.inspect "disjoint?(set1, set2)"
# 共通項があるので false
IO.inspect Set.disjoint? set1, set2
set3 = Enum.into 7..10, HashSet.new
# 共通項がないので true
IO.inspect Set.disjoint? set1, set3

# equal?(set1, set2)
IO.inspect "equal?(set1, set2)"
set4 = Enum.into 7..10, HashSet.new
IO.inspect Set.equal? set1, set4
IO.inspect Set.equal? set3, set4

# intersection(set1, set2)
IO.inspect "intersection(set1, set2)"
# 共通項のみを抽出する
# 共通項あり
IO.inspect Set.intersection set1, set2
# 共通項なし
IO.inspect Set.intersection set1, set3

# member?(hashset, term)
IO.inspect "member?(hashset, term)"
IO.inspect Set.member? set1, 2
IO.inspect Set.member? set1, 7

# put(hashset, term)
IO.inspect "put(hashset, term)"
# 新規要素の追加
IO.inspect Set.put set1, 7
# 重複要素の追加をしても内容はそのまま
IO.inspect Set.put set1, 6

# size(hashset)
IO.inspect "size(hashset)"
IO.inspect Set.size set1
set5 = Enum.into 1..10, HashSet.new
IO.inspect Set.size set5

# subset?(set1, set2)
IO.inspect "subset?(set1, set2)"
# set1 が set2 に含まれていれば真
IO.inspect Set.subset? Enum.into(2..4, HashSet.new), Enum.into(2..5, HashSet.new)
# set1 が set2 に含まれていなければ偽
IO.inspect Set.subset? Enum.into(2..5, HashSet.new), Enum.into(2..4, HashSet.new)

# union(set1, set2)
IO.inspect "union(set1, set2)"
IO.inspect Set.union Enum.into(2..4, HashSet.new), Enum.into(4..8, HashSet.new)
~~~

## 出力

~~~
#HashSet<[2, 6, 3, 4, 5]>
"delete(set, term)"
#HashSet<[2, 6, 4, 5]>
"difference(set1, set2)"
#HashSet<[2, 3]>
"disjoint?(set1, set2)"
false
true
"equal?(set1, set2)"
false
true
"intersection(set1, set2)"
#HashSet<[6, 4, 5]>
#HashSet<[]>
"member?(hashset, term)"
true
false
"put(hashset, term)"
#HashSet<[7, 2, 6, 3, 4, 5]>
#HashSet<[2, 6, 3, 4, 5]>
"size(hashset)"
5
10
"subset?(set1, set2)"
true
false
"union(set1, set2)"
#HashSet<[7, 6, 2, 4, 3, 5, 8]>
~~~

## 参照
* [Set behavior](http://elixir-lang.org/docs/stable/elixir/Set.html)
* [HashSet](http://elixir-lang.org/docs/stable/elixir/HashSet.html)
Ruby(Rack)で1行静的コンテンツWebサーバーを作る

追記:コメントで教えていただいたがこちらの方がよりシンプルでよい。
```ruby -run -e httpd . -p 8080```

以下は、RackMiddlewareの単体実行例とでもお考えください。

---


何かしら静的コンテンツを確認するために、
ささっとwebサーバーを立ちあげたいときがある。

そのような場合、rubyならばワンライナーでサーバーを作成できる。
（ruby本体および、gemとして```rack```が入っていることが前提）

コマンドは以下。
```bash
$ ruby -rrack -e 'Rack::Handler.default.run Rack::Static.new(nil,urls:[""])'
```

実行パス以下のファイルを "http://localhost:8080/ファイル名"
で参照できる。

引数オプションは以下。

```
urls: サーバーで受け付けるURLパスの配列（必須）
root: ルートとなるファイルパスの文字列（例: "./public"）
index: パスがディレクトリのときデフォルトで表示されるファイル（例: "index.html"）
```
詳細は以下参照のこと。
http://www.rubydoc.info/github/rack/rack/Rack/Static

また、最初の例の```Rack::Static.new```の第一引数```nil```はデフォルトのRackアプリケーションを表すので、
```urls```に含まれていないパスを叩いたときに、```nil```にルーティングされてエラーになる。
その場合は```->e{[200,{},[""]}```を第一引数として与えること。

オプションを与えた場合の例は以下。

```
$ruby -rrack -e 'Rack::Handler.default.run \
Rack::Static.new( \
  ->e{[200, {}, [""]}, \
  urls: ["/pages", "/javascripts"], \
  root: "./public", \
  index: "index.html")
```

一行に収まらなくなってしまった…。
submitとローディング


情けないけど、地味にハマった。

フォームのsubmitと同時にローディングを出すとかよくあると思いますが。
例えば

```html
<form action="hoge.php">
<input type="text" />
<button type="submit">送信</button>
</form>
```

```javascript
var $submitBtn = $('button[type="submit"]');
$submitBtn.on('click',function(){
	$('body').append('<div class="loading"><img src="loading.gif" /></div>')
});
```

みたいにするとFirefoxあたりで画像が表示されない or gifアニメが動かないみたいなことになる。

なぜかフォームの送信が優先されて通信が途中で止まってしまうようです。

そこでclickをmousedownにしたりmouseupにしたりしてみるともはや送信すらされない。。。

そもそも先にローディングを出そうという発想がダメみたい。

で、気持ち悪いけどこうする。

```javascript
var $submitBtn = $('button[type="submit"]');
$submitBtn.on('click',function(){
	setTimeout(function(){
		$('body').append('<div class="loading"><img src="loading.gif" /></div>');
	},100);
});
```
送信の処理を先にしてから表示するようにほんの少しでいいのでずらす。

するとうまく画像も表示された。

jQueryなどでsubmitする場合も同様でsubmitが先。
Ruboty | Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen の REAMDE 内の Commands から Usage へのページ内リンクを追加 #ruboty

# Ruboty | Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen の REAMDE 内の Commands から Usage へのページ内リンクを追加 #ruboty
## 概要
Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen
の REAMDE 内の Commands から Usage へのページ内リンクを追加しました。

## Version
1.0.1

## 用途
Commands の一覧から個別のコマンドを参照したい場合に、
マウスホイールをせずにリンクから飛ぶことによって利便性を向上する。
特に、対象コマンドが多い場合に有効。

## 参照
詳細は、 GitHub を参照

* [ruboty-megen GitHub](https://github.com/tbpgr/ruboty-megen)
* [ruboty-megen RubyGems](http://rubygems.org/gems/ruboty-megen)
* [Ruboty | Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen を作成した #ruboty](http://qiita.com/tbpgr/items/33ccf5709cb553b2095f)
linux で ハイフン "-" から始まる名前のファイルが消す方法 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい 

何かがきっかけで

-okashii.ext

みたいなファイル :file_folder: ができたとき :sweat: 

$ rm -okashii.ext

では消せないので

$ rm ./-okashii.ext

$ rm -- -okashii.ext

とかで削除する :computer:
モジュールからインポートした識別子を再度エクスポートするには


インポートしたモジュールの識別子を再度エクスポートするには、 module 宣言の *ExportList* の中で、

```haskell             
module ModuleName
```

のように指定すればよい。
これは、例えば、自作プロジェクトにある、複数のモジュールの識別子を、ひとつのモジュールからまとめてインポートできるようにしたい、などという場合に便利。

## Example

```Reexport.hs
module Reexport (
  ToBeDefined(..)
, module Reexport.Foo
, module Reexport.Bar
) where

import Reexport.Foo
import Reexport.Bar

data ToBeDefined = ToBeDefined deriving (Show)
```

```Reexport/Foo.hs
module Reexport.Foo where

data Foo = Foo deriving (Show)

func1 :: String -> Foo
func1 = undefined
```

```Reexport/Bar.hs
module Reexport.Bar (
  Bar(..)
, func2
) where

data Bar = Bar deriving (Show)

func2 :: String -> Bar
func2 = undefined

func3 :: Double -> Bar
func3 = undefined
```

で、実際にこの *Reexport* モジュールをインポートしてみると、

```Main.hs
module Main where

import Reexport
```

```haskell 
-- $ ghci Main
-- GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help

ghci> :show imports
:module +*Main -- added automatically

ghci> ToBeDefined
ToBeDefined

ghci> :i func1
func1 :: String -> Foo  -- Defined at Reexport/Foo.hs:7:1

ghci> :i func2
func2 :: String -> Bar  -- Defined at Reexport/Bar.hs:7:1

-- func3 は Reexport.Bar の ExportList に含まれていないので再エクスポートされない
ghci> :i func3

Top level:
    Not in scope: ‘func3’
    Perhaps you meant one of these:
      ‘func2’ (imported from Reexport),
         ‘func1’ (imported from Reexport)
```
C#からHaskellの関数を呼ぶ

stackoverflowのリンク先そのまんまなんだけどひとつ詰まったのでメモ
http://stackoverflow.com/questions/16615641/calling-haskell-from-c-sharp

# 動作確認環境

- Windows 7 64 bit
- GHC 7.8.3
- Visual Studio Express 2013 for Windows Desktop

# Haskellコード

```haskell:Fibonacci.hs
{-# LANGUAGE ForeignFunctionInterface #-}

-- http://stackoverflow.com/questions/16615641/calling-haskell-from-c-sharp

module Fibonacci () where

import Data.Word
import Foreign.C.Types

fibs :: [Word32]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

fibonacci :: Word8 -> Word32
fibonacci n =
  if n > 47
    then 0
    else fibs !! (fromIntegral n)

c_fibonacci :: CUChar -> CUInt
c_fibonacci (CUChar n) = CUInt (fibonacci n)

foreign export ccall c_fibonacci :: CUChar -> CUInt
```

# Haskellコードのビルド

`ghc --make -shared Fibonacci.hs`
HSdll.dllができる

# C#コード

VisualStudioのコンソールアプリケーションプロジェクト

```csharp:Program.cs
using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    // http://stackoverflow.com/questions/16615641/calling-haskell-from-c-sharp
    public sealed class Fibonacci : IDisposable
    {
        [DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void hs_init(IntPtr argc, IntPtr argv);

        [DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void hs_exit();

        [DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern UInt32 c_fibonacci(byte i);

        public Fibonacci()
        {
            Console.WriteLine("Initialising DLL...");
            hs_init(IntPtr.Zero, IntPtr.Zero);
        }

        public void Dispose()
        {
            Console.WriteLine("Shutting down DLL...");
            hs_exit();
        }

        public UInt32 fibonacci(byte i)
        {
            Console.WriteLine(string.Format("Calling c_fibonacci({0})...", i));
            var result = c_fibonacci(i);
            Console.WriteLine(string.Format("Result = {0}", result));
            return result;
        }
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            using(var fib = new Fibonacci())
            {
                fib.fibonacci(10);
            }

            Console.ReadLine();
        }
    }
}
```
# C#コードのビルド

**プロジェクトのプロパティからプラットフォームターゲットをAny CPUからx64に変更してビルド**(使ってるOSに合わせる？)
Haskell関係なくてC#でDLLを扱う際の基本知識なんだろうけどここがわからず詰まった(ﾉ∀`)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/59312/bcba677a-01c2-f2b6-3ae4-59a02b240001.png)

# 実行

HSdll.dllをC#の.exeがあるフォルダにコピーして.exeを実行する

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/59312/b523052a-acb7-35f5-f3ce-89a5b1a10ab7.png)

成功ヽ(^。^)ノ

Haskellのみでなにか作るのはきついんだけどこの方法でUIをC#/WPFで作って、ロジックをHaskellで記述するものが作れそう。
RubyGems | 特定分野の人気 gem を探す #gem #ruby #github #bestgem

# RubyGems | 特定分野の人気 gem を探す #gem #ruby #github #bestgem
## 概要
特定分野の人気 gem を探す
ここでは、例として Ruboty 関連の gem を探します。

## BestGems で探す
* [BestGems](http://bestgems.org/) へアクセス
* ruboty で検索  
    http://bestgems.org/search?q=ruboty

![search_bestgem.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3b26832e-7cca-f1c9-e95b-5977f70d2449.png)

## GitHub で探す
RubyGems 公開されていない gem も含めて探したい場合など。

* GitHubへアクセス
* ruboty で検索
* Most stars で sort  
    https://github.com/search?o=desc&q=ruboty&s=stars&type=Repositories&utf8=%E2%9C%93

![search_github.png](https://qiita-image-store.s3.amazonaws.com/0/43480/51943a99-2415-e977-29f7-a27c9e3e8f5b.png)

※ GitHub の検索については gem に限った話ではない

## Qiita で探す
* Qiita へアクセス
* Qiita の検索欄で検索。ここでは仮に「 ruboty 」で検索
  ※ tag を検索したければ、 tag:ruboty で。
* デフォルトのソート順が rel になっているので、URLを直接編集して sort=stock にする  
    http://qiita.com/search?utf8=%E2%9C%93&sort=stock&q=ruboty

![search_qiita.png](https://qiita-image-store.s3.amazonaws.com/0/43480/68f521c0-a164-b685-9561-df87e61a46b3.png)

※ Qiita の検索については gem に限った話ではない

## 補足
Ruboty は Plugin 名の命名の慣習が ruboty-xxxx になっているので
この調べ方と相性がいい。

Itamae なども、

* itamae-plugin-resource-xxxx
* itamae-plugin-recipe-xxxx

などの規約があるので調べやすい。

このあたりは ググラビリティ の話もあるし、Pluginに命名の規約などを
作っておくと情報を収集する側にとって便利。
名前重要。

## ひとこと
Ruboty ポータルみたいのがあるといいかな、と思ったりしていたけど
上記の検索で十分な気がしてきた。

## 参照
* [BestGems](http://bestgems.org/)
* [GitHub](https://github.com)
Rails - モデルから特定のカラムのみ取得

## はじめに
モデルからデータを取得するとき、カラムを指定する方法のメモです。必要なカラムのみ取得することによって、効率化が図れます。


## やりかた
モデル.select(取得するカラム)

## 例
モデルUserからnameカラムのみ取得したい場合。

```app/controllers/users_controller.rb

class UsersController < ApplicationController
  def index
    @user = User.select("name")
  end
end
```

## 応用
ユーザー数を取得したい場合

`User.count`

ではなく、

`User.select("id").count`

とカラムを指定したほうが高効率。


以上です。間違い等ございましたらツッコんでくださいm(__)m

## 参考
[すごくありがちなRailsサイトの高速化 | D-Native](http://blog.degita.net/entry/2013/02/20/42)
[モデル(model) - Railsドキュメント](http://railsdoc.com/model)
【環境構築】VirtualBox + Vagrant + CoreOS + Docker環境の構築めも

## 環境構成
Mac上でvagrantを利用してCoreOSをVirtualBox上で稼働させてます。
CoreOSのdockerからコンテナ型仮想マシン(ubuntu)を動かしてみたメモです。
次回時間があればWindows版も投稿します。
MacとWindowsは構築過程が少し異なりますが、Macの方がもっと手軽く構築できます。

ざっくり言うとイメージはこんな感じです。

　ubuntu(コンテナ)
　-------------------
　　　docker
　-------------------
　　　CoreOS
　-------------------
　　 VirtualBox
　-------------------
　　Mac(Windows)

### 環境バージョン
・Mac 10.8.5
・VirtualBox >= 4.3.10
・Vagrant >= 1.6
※ProviderをVirtualBox以外にvmware_fusionもできます。


## 用語について
###VirtualBoxとは
http://ja.wikipedia.org/wiki/VirtualBox
・既存OSに他のOSを稼働させることが出来るプログラム

###Vagrantとは
http://www.atmarkit.co.jp/ait/articles/1307/22/news076.html
・Vagrantとは、違う環境に移行可能な開発環境を簡単に構築・管理し、配布することができる開発環境作成ツール。
・つまりネットワークやメモリやcpuなどを簡単に設定できるツール

###CoreOSとは
・サーバー向け軽量OS
・Docker Engineに特化した専用OS
・もっとも軽いLinux
・Ubuntu 14.04カーネルと同じなので安全!

### dockerとは
http://ja.wikipedia.org/wiki/Docker
・ソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアである。
・特殊なファイルシステムを利用してコンテナ型の仮想化を行う。

##早速構築してみましょう
### Mac
・homebrew-caskとは
homebrew-caskはMacのGUIアプリケーションをhomebrewで管理できるようになる拡張機能です。
brewは既にインストール済みを前提にしてます。

#### brew-caskインストール
```
$ brew install caskroom/cask/brew-cask
```

#### virtualboxとvagrantインストール
```
$ brew cask install virtualbox
$ brew cask install vagrant
```

#### gitからVagrantfileダウンロード
```
$ git clone https://github.com/coreos/coreos-vagrant/
$ cd coreos-vagrant
```
Vagrantfile通りにCoreOS仮想化します。

####仮想マシンを起動する
```
$ vagrant up
```

#### 仮想マシンにSSHで接続する
```
$ vagrant ssh
```

#### 仮想マシン確認
```
CoreOS (alpha)
core@core-01 ~ $ uname -a
Linux core-01 3.17.2+ #2 SMP Tue Nov 4 04:15:48 UTC 2014 x86_64 Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz GenuineIntel GNU/Linux
```

#### 最新ubuntuインストール
```
$ docker pull ubuntu:latest
```

#### ubuntu:latestイメージ確認
```
$ docker images
```

#### コンテナを起動し、ubuntuに入る
```
$ docker run -t -i ubuntu /bin/bash
```

#### コンテナマシン確認
```
root@bbc734cb8d06:/# uname -a
Linux bbc734cb8d06 3.17.2+ #2 SMP Tue Nov 4 04:15:48 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
```

#### 容量がすくないのでご注意
```
root@bbc734cb8d06:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        17G  268M   16G   2% /
tmpfs           500M     0  500M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sda9        17G  268M   16G   2% /etc/hosts
tmpfs           500M     0  500M   0% /proc/kcore
```
容量が少なくてコンテナからコミットしてイメージ化できなかった。(￣Д￣；；
容量増やし方も後日に投稿しますね。
Apache Module内で環境変数を取得する方法

SetEnvした環境変数は`r->subprocess_env` という変数に保存されています。

# 設定ファイルでSetEnvしたものをApache Module内から取得する

httpd.conf に下記のように書いて

```apache
SetEnv MY_NAME DQNEO

<Location "/mymodule">
 SetEnv MY_FRIEND pikachu
 SetHandler mymodule
</Location>
```

module内で

```c
char *myname = apr_table_get(r->subprocess_env, "MY_NAME");
char *myfriend = apr_table_get(r->subprocess_env, "MY_FRIEND");
```

で取得できます。

しかしこの方法で取得できるのは、あくまでSetEnvしたものだけです。

(なんでこうなってるのかわかりませんが、おそらくセキュリティ上の理由でしょうか...?)

# SetEnvじゃない環境変数を取得したい場合

## QUERY_STRINGなどを取得したい場合

事前に`ap_add_cgi_vars(r);`を呼びましょう。

```c
ap_add_cgi_vars(r);
char *query_string = apr_table_get(r->subprocess_env, "QUERY_STRING")
```

## PATHなどを取得したい場合

事前に`ap_add_common_vars(r);`を呼びましょう。

```c
ap_add_common_vars(r);
apr_table_get(r->subprocess_env, "PATH");
```

## 取得可能な環境変数を全部見たいとき

こうすれば全項目を走査して表示できます。

```c
const apr_array_header_t *arr_env = apr_table_elts(r->subprocess_env);
int i;
for (i = 0; i < arr_env->nelts; i++) {
    apr_table_entry_t *entry = (apr_table_entry_t *)(arr_env->elts + (arr_env->elt_size * i));
    ap_rprintf(r, "key=%s , value=%s\n", entry->key, entry->val);
}
```

# 参考

当初、環境変数を取得する方法が皆目わからず泣きそうになっていたら下記記事を見つけて答えにたどりつきました。

http://rhythm-prism.blogspot.jp/2012/10/capache-modulesubprocessenv.html
Homebrew emacsで--japaneseオプション復活させてみた！


Emacs 24.4が出たのが3週間くらい前。Homebrewでも早速対応されたのでupgradeしようとしたがなんと--japaneseオプションが削除されている！ どうやらinline patchが当たらなくなって抜かれてしまったみたい。

「どうせ誰かが対応するだろうな」と思い、少し待ったがなかなか来ない。で、ようやく今日見つけたのがこの記事。

- [HomebrewでEmacs 24.4+インラインパッチをインストールする](http://www.sevencredit.com/2014/11/07/669/)

よーし、と思ってよく見たら確かにHomebrewだけど`brew edit`で手元のformulaを変更するパターン。複数のマシンにインストールするのはちと面倒だ。

そこで本家のformulaをgistにコピー、それにこの変更を加えてみた。

https://gist.github.com/ksato9700/0b3c71adafc256ddf280

で、インストールするには

```console
$ brew install https://gist.githubusercontent.com/ksato9700/0b3c71adafc256ddf280/raw/f48ac50bf8d1a16aa63606b137cd29b8fb1d7414/emacs.rb --japanese --cocoa
```

必要に応じて他の--withオプションも追加。

丸一日使ってみて、今のところ安定して動いている。これで問題なければ本家にpull requestしてみるか(!?)
Swiftでシェルスクリプトを書く

swift コマンドが Yosemite から /usr/bin/swift に標準で入っていた。
~~(手元にXcodeが入っていない環境が無いのでXcode必須かも？)~~
(→ Yosemite をクリーンインストールしたところちゃんと入っていました！)

```
$ which swift
/usr/bin/swift
```

まずは --help で引数をチェック。

```
$ swift --help
OVERVIEW: Swift compiler

USAGE: swift [options] <inputs>

OPTIONS:
  -assert-config <value> Specify the assert_configuration replacement. Possible values are Debug, Release, Replacement.
  -D <value>             Specifies one or more build configuration options
  -framework <value>     Specifies a framework which should be linked against
  -F <value>             Add directory to framework search path
  -g                     Emit debug info
  -help                  Display available options
  -I <value>             Add directory to the import search path
  -j <n>                 Number of commands to execute in parallel
  -L <value>             Add directory to library link search path
  -l<value>              Specifies a library which should be linked against
  -module-cache-path <value>
                         Specifies the Clang module cache path
  -module-link-name <value>
                         Library to link against when using this module
  -module-name <value>   Name of the module to build
  -nostdimport           Don't search the standard library import path for modules
  -Onone                 Compile without any optimization
  -Ounchecked            Compile with optimizations and remove runtime safety checks
  -O                     Compile with optimizations
  -sdk <sdk>             Compile against <sdk>
  -target-cpu <value>    Generate code for a particular CPU variant
  -target <value>        Generate code for the given target
  -version               Print version information and exit
  -v                     Show commands to run and use verbose output
  -Xcc <arg>             Pass <arg> to the C/C++/Objective-C compiler
  -Xlinker <value>       Specifies an option which should be passed to the linker
```


引数なしでインタラクティブなREPL(Read Eval Print Loop)モードに入る。

```
$ swift
Welcome to Swift!  Type :help for assistance.
  1>
```
（終了時は Control+d か、:q を入力。）


ということはシェバングに書けばシェルスクリプトにもできるのかなーと思ったら案の定できた。
import Cocoa 書けば OS X コンポーネントも使える。

```
#!/usr/bin/swift

import Cocoa

let alert = NSAlert()
alert.messageText = "エラー!"
alert.addButtonWithTitle("無視")
alert.addButtonWithTitle("了解")
alert.runModal();

```
![スクリーンショット 2014-11-12 21.33.10.png](https://qiita-image-store.s3.amazonaws.com/0/6102/9ab434b5-fbc9-5adc-0216-c2db7602f94c.png)

* 参考  (Introduction to the Swift REPL)  
https://developer.apple.com/swift/blog/?id=18
WebPayのCheckoutHelperを呼び出してるページで user-scalable=no が効かない

## 現象

ページ中で以下のようなコードを書けばWebPayを簡単に使うことができますが、これを書くと
metaタグで`user-scalable=no`を指定しているスマートフォン対応ページでも拡大縮小出来てしまうという問題が起きました。

```html
<form action="/purchase" method="post">
  <script src="https://checkout.webpay.jp/v2/" class="webpay-button" data-key="your_key" data-lang="ja"></script>
</form>
```

## 原因

どうやら、https://checkout.webpay.jp/v2/ のスクリプトによって `width=device-width, initial-scale=1`のmetaタグが追加されてしまい、headタグで指定している方が効いていないらしい。

## 対処法

webpayのスクリプトを呼び出した直後にmetaタグで指定し直すことで拡大縮小できなくなります。後に指定したmetaタグの方が有効なんでしょうか。ものすごく行儀が悪い気がしますが…。

```html
<form action="/purchase" method="post">
  <script src="https://checkout.webpay.jp/v2/" class="webpay-button" data-key="your_key" data-lang="ja"></script>
  <meta name='viewport' content='initial-scale=1.0, user-scalable=no'>
</form>
```
MongoDBでドキュメントごとに配列の要素をカウントする (Aggregation Framework)

つい忘れてしまうAggregation Frameworkの使い方をメモっておく。

これからやること:
teamsコレクションのドキュメントごとに配列playersの要素をカウントする。


# テストデータの準備

テストデータ

```json
{
  "name": "grampus",
  "players": [
    "narazaki",
    "tulio",
    "tamada",
    "taguchi"
  ]
}
{
  "name": "fctokyo",
  "players": [
    "ohta",
    "muto"
  ]
}
```


テストデータをinsert

```js
> db.teams.insert({ name: "grampus", players: ["narazaki", "tulio", "tamada", "taguchi"] })
> db.teams.insert({ name: "fctokyo", players: ["ohta", "muto"] })
```

insert後

```js
> db.teams.find()
{ "_id" : ObjectId("54633eb04296e29135e2325d"), "name" : "grampus", "players" : [ "narazaki", "tulio", "tamada", "taguchi" ] }
{ "_id" : ObjectId("54633eb64296e29135e2325e"), "name" : "fctokyo", "players" : [ "ohta", "muto" ] }
```

# Aggregation Frameworkで集計する

```js
> db.teams.aggregate(
  { $project: { players: 1, name: 1 }},
  { $unwind: "$players" },
  { $group: { _id: "$name", count: { $sum: 1 }}}
)
```

* `$project` Aggregationに流す要素の指定
* `$unwind` 配列を各要素ごとのドキュメントに展開する
* `$group` グループ化
 * `$sum` はグループ内で `$unwind` で展開したドキュメントを数えている

集計結果

```js
{ "_id" : "fctokyo", "count" : 2 }
{ "_id" : "grampus", "count" : 4 }
```

# 参考にしたページ

http://docs.mongodb.org/manual/reference/operator/aggregation/
JavaScriptでBMI測定

これ作るのに何時間かかったかｗｗｗ
プログラミングって面白いね＾＾

```lang:BMI測定
<!DOCTYPE html>
<html>
<head>
<title>bmi測定</title>
<meta charset="UTF-8">
<script type="text/javascript">
<!--
function bmiCheck()
{
  var msg = '';

  if(form1.tall.value == ''){ //設定開始
    msg = '身長を入力してよ～。';
  }
    else if(form1.tall.value.match(/[^0-9.]+/)){
      msg = '身長は半角数字じゃないと入力できませんでぇ～。';
    }
      else if(form1.weight.value==''){
        msg = '体重もちゃんといれてよ～。逃がしまへんでぇ～！！';
      }
        else if(form1.weight.value.match(/[^0-9.]+/)){
          msg = '体重に文字入れてどないすんねん！！数字いれてよ！！';
        }

  if (msg != '') {
    alert(msg);
    return;
  }

  var bmi = form1.weight.value / (form1.tall.value*form1.tall.value);
//  alert(bmi);
  var result = '';
  
  if (bmi < 18.5) {
    result = 'やせてまんな～、筋トレしたらシュッとなりまっせ！！';
  }
    else if(bmi >=18.5 && bmi < 25){
      result = '標準やな～、筋トレしたらもっとシュッとなりまっせ！！';
    }
      else{
        result = '肥満やな・・・筋トレしてシュッとなろか！！';
      }

  document.write(result);

}
//-->

</script>
</head>
<body>

<form name="form1">
<p>身長（ｍ）<input type="text" name="tall" size="10" maxlength="4"></p>
<p>体重（㎏）<input type="text" name="weight" size="10" maxlength="5"></p>
<p><input type="button" value="ほなＢＭＩ判定いくで～！！" onclick="bmiCheck()"></p>
</body>
</html>
```
linuxでファイルを複数行を一行にする方法

1, trコマンドを利用する

```bash
~ koukou.chou.ts$ cat  test
1
2
3
4
5
6
7
8
9
10
~ koukou.chou.ts$ cat test | tr "\n" " ";echo
1 2 3 4 5 6 7 8 9 10 

```
2, awkコマンドを利用する

```bash
~ koukou.chou.ts$ awk '{if(NR%10){ORS=" "}else{ORS="\n"};print;}' test
1 2 3 4 5 6 7 8 9 10
```

3, perlスクリプトを利用

```bash
~ koukou.chou.ts$ perl -pe 's/\n/ /;' test && echo
1 2 3 4 5 6 7 8 9 10 
```

4, xargを利用

```bash
~ koukou.chou.ts$ cat test | xargs
1 2 3 4 5 6 7 8 9 10
```

5, vim のsedを利用

```bash
~ koukou.chou.ts$ vim test 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
~                                                                                                                                                    
~                                                                                                                                                    
~                                                                                                                                                    
                                                                                                                                                  :%s/\n/ /g
```



6, sedを利用する

```bash
~ koukou.chou.ts$ sed 'N;N;N;N;N;N;N;N;N;s/\n/ /g' test
1 2 3 4 5 6 7 8 9 10
~ koukou.chou.ts$ 
```
【備忘録】httpdのログを表示する

# ログディレクトリに移動する

```bash:console(Vagrant)
$ sudo cd /var/log/httpd/
sudo: cd: コマンドが見つかりません
$ sudo bash -c "cd ./httpd; ls"
access_log  error_log
```

#ログを確認する

```bash:console(Vagrant)
sudo tail /var/log/httpd/access_log
sudo tail /var/log/httpd/error_log
```
Cocos2d-JSでwebsocketがうまくいかない件


# 概要

なんかはまったのでメモ残しておきます

# Sample

```Javascript:app.js
var ws = new WebSocket("ws://127.0.0.1:8080");
        
ws.onopen = function(evt)
{
	ws.send("onopen");
};

ws.onmessage = function(evt)
{
	cc.log("onmessage: " + evt.data);
	ws.close();
};

ws.onerror = function(evt) {
	cc.log("onerror");
};

ws.onclose = function(evt) {
	cc.log("onclose");
	ws = null;
};
```

package.jsonを`"modules" : ["cocos2d","socketio"],`に修正

```Bash
$ cocos compile -p web -m release
$ cd publish/html5`
$ python -m SimpleHTTPServer 8000
```

ブラウザで見るとエラーになる。
`Uncaught TypeError: Cannot read property 'push' of undefined`
Google Closure Compilerがsocket.io.min.jsを破壊する模様。

# 壊れるならコピーするで回避してみた

`$ cp frameworks/cocos2d-html5/external/socketio/socket.io.min.js ./publish/html5/`
inde.htmlに`<script src="socket.io.min.js"></script>`を足して再度compile
※package.jsonは元に戻した

```Bash
$ cocos compile -p web -m release
$ cd publish/html5`
$ python -m SimpleHTTPServer 8000
```

# サーバーコード

```Javascript:webSocketServer.js 
var ws = require("websocket.io");
var server = ws.listen(8080,
  function () {
    console.log("ws start");
  }
);

server.on("connection",function(socket) {
  //console.log(socket);
  socket.on("message",
    function(data) {
      console.log("message " + data);
      server.clients.forEach(
        function(client) {
          client.send(data);
        });
    });
});
```
`$ node webSocketServer.js`
vagrantで2つの仮想サーバ間を通信しよう

# vagrantで2つの仮想サーバ間を通信しよう

## ローカル開発環境を整える

ローカルにvagrantとvirtualBoxをインストールする、もしくはアップデートする。
- 検証用環境（2014/10/31）
 - vagrant 1.6.5
 - virtualBox 4.3.18
※ADを使用している場合はADのアカウントだとvagrant、virtualBox共にインストールでこけてしまう。

### AD対策（インストール）

AD（ActiveDirectory）を入れている場合は、コンピュータのローカルユーザでログインする。
- ローカルユーザのパスワード等を忘れた時
1. コントロールパネル
2. ユーザアカウント
3. ユーザアカウントの管理
4. 追加、削除、パスワードのリセットを行う

ローカルユーザでログイン後にvagrant、virtualBoxのダウンロード、インストールを行う。

インストール後は再びADのアカウントに戻り作業する。

インストールもしくはアップデートが完了したら、次にvagrantの設定を行う。

### vagrantの設定

コマンドプロンプトを立ち上げえる。
※コマンドが打てればなんでも可
適当な場所（自分の作業する場所）に移動し、下記コマンドを実行。

- vagrantの初期化

```bash
$ vagrant init
```

- Boxイメージの追加

```bash
$ vagrant box add centos5.8 https://dl.dropbox.com/u/17738575/CentOS-5.8-x86_64.box
```

これは[ボックスイメージ一覧](http://www.vagrantbox.es/)から取得したイメージの名前を
centos5.8とし、それをvagrantに追加しているというコマンドである。
名前は自由に決めることができ、イメージも自由に変更可能である。
※今回はCentOS 5.8を使用

次にvagrant initでできたVagratfileの中身を編集する。

```Vagrantfile
config.vm.box = "centos5.8"
```

デフォルトだとbaseになっている部分を先ほど追加したboxイメージの名前に変更する。

```bash
$ vagrant up
```

うまく設定がされていたらこれでvirtualBox上に先ほど取得したイメージの仮想サーバが立ち上がります。

- sshでつなげてみる

```ターミナル
$ ssh 127.0.0.1:2222
```

ポートは作成されたvirtualBoxをみてください。
vagrantでは以下の設定でvirtualBoxのユーザが作成されます。

- ユーザ名：vagrant
- パスワード：vagrant

これでsshでサーバに入れれば成功です。

## 一つのboxから複数のvirtualBoxを制御する

構成ファイル（Vagrantfile）を編集します。

```Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "centos5.8"

  config.vm.define :web1 do | web1 |
    web1.vm.hostname = "web1"
    web1.vm.network :private_network, ip: "192.168.33.10"
  end

  config.vm.define :web2 do | web2 |
    web2.vm.hostname = "web2"
    web2.vm.network :private_network, ip: "192.168.33.20"
  end
```

これでhost名がweb1とhost名がweb2の二つのサーバがvagrant upで立ち上がります。
双方の通信をするためにvmのnetwork設定にIPアドレスを割り当てています。

- 確認

```bash
@web1$ ping 192.168.33.20

@web2$ ping 192.168.33.10
```

これでpingがかえってきたら成功です。
[参考サイト](http://qiita.com/sho7650/items/cf5a586713f0aec86dc0)
[Scala]PHPerのScala入門メモ（途中）

###変数宣言
val => 再代入不可
var => 普通の変数　※Scalaではなるべく使わない
***
###命名規則
原則は**キャメルケース**。
”_”は特別な意味を持つので使わない。
http://docs.scala-lang.org/style/naming-conventions.html
***
###関数を定義する

```php:PHPの場合
function add (x, y) {
    return x + y;
}
$this->add(1, 2);
```

```scala:Scalaの場合
def add (x: Int, y: Int): Int = {
    // return文は必要ない限り書かない
    x + y
}
add(1, 2)
```
***
###配列・リスト
どちらも同じ型を格納する

```php:PHPの場合
$stringArray = array("hoge", "one", "foo");
```

```scala:Scalaの場合
val stringArray = Array("hoge", "one", "foo")
```

```php:PHPの場合
// PHPにリストって概念ある・・・？
```

```scala:Scalaの場合
val integerList = List(1, 2, 3)
```
***
###制御文

####for文

```php:PHPの場合
$integerList = array(1, 2, 3);
foreach ($integerList as $int) {
    if (($int % 2)) { continue; }
    echo $int . PHP_EOL;
} //2
```

```scala:scalaの場合
object main extends App {
    val ary = Array(1, 2, 3)
    // ここでフィルタリングできる
    for (num <- ary if (num % 2 == 0))
        println(num)
}
```
Scalaはすぐにfor文内で処理する変数（ここではnum）がわかるのでよい。

######yield
計算結果を保持してくれる。どういう時にうれしいかはまだ不明。
**※追記:mpywさんありがとうございます**
http://php.net/manual/ja/language.generators.overview.php

```scala:scalaの場合
val ary = Array(1, 2, 3)
for (num <- ary)
    yield num * 2
```
***
####foreach文
Scalaの場合、foreachは制御構文として扱われない。
各クラスのメソッドとして扱われる。

```php:PHPの場合
$integerList = array(1, 2, 3);
foreach ($integerList as $int) {
    echo $int . PHP_EOL;
}
```

```scala:Scalaの場合
val integerList = Array(1, 2, 3)
integerList.foreach(println)
/* ちゃんと改行もしてくれる
1
2
3
*/
```
***
####switch文

```php:PHPの場合
switch ($string) {
	case "hoge":
		echo "hoge";
		break;
	case "foo":
		echo "foo";
		break;
	case "bar":
		echo "bar";
		break;
	default:
		echo "placeholder";
}
```

```scala:Scalaの場合
// switchに似たmatchがある.これはScalaっぽくない書き方。
string match {
    case "hoge" => println("hoge")
    case "foo" => println("foo")
    case "bar" => println("bar")
    case _ => println("placeholder")
}
```
***
###class
***
####trait
extendsでは静的な束縛をされる
withでは動的な束縛がされる

```php:PHPの場合
trait Access {
    function howTo() {
        echo "HowTo";
    }
}
class Company {
    use Access;
}
$access = new Company();
$access->howTo(); // HowTo
```

```scala:Scalaの場合(extends)
trait Access {
  def howTo() {
    println("HowTo")
  }
}
class Company extends Access {
  override def toString = "hoge"
}
val company = new Company
company.howTo() // HowTo
```
***
Raspberry PiでiBeaconを受信する（Node.js + bleacon）

Raspberry Pi（Model B+）でiBeaconの信号を受信するためのメモ。

# 環境

使用した環境は以下の通り。なお、インストールしているディストリビューションはRaspbianです。

```
pi$ uname -a
Linux raspberrypi 3.12.29+ #714 PREEMPT Wed Oct 1 23:11:38 BST 2014 armv6l GNU/Linux
pi$ cat /etc/debian_version
7.6
```

# Node.jsをインストールする

Node.jsをインストールします。
『[Raspberry PiにnodebrewでNode.jsをインストールする - Qiita](http://qiita.com/yuyakato/items/a1225154445520dc2db3)』などを参考にインストールしてください。

今回使用した環境は以下の通りです。

```
pi$ node -v
v0.10.28
pi$ npm -v
1.4.9
```

# bleaconをインストールする

Node.jsの`bleacon`パッケージをインストールします。予め`libbluetooth-dev`パッケージのインストールが必要です。
`bleacon`パッケージの執筆時点でのバージョンは0.2.0でした。

```
pi$ sudo apt-get update
pi$ sudo apt-get install libbluetooth-dev
pi$ npm install bleacon
```

# iBeaconの信号を受信する

iBeaconの信号を受信し、コンソールに出力するためのスクリプトを準備します。

```js:beacon_discover.js
var Bleacon = require("bleacon");
Bleacon.startScanning();
Bleacon.on("discover", function(bleacon) {
  console.dir(bleacon);
});
```

スクリプトを実行すると、コンソールに情報が出力されます。なお、root権限が必要です。
（UUIDはマスクしています）

```
root# node beacon_discover.js
{ uuid: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  major: 1,
  minor: 1,
  measuredPower: -76,
  rssi: -70,
  accuracy: 0.7450788247551209,
  proximity: 'near' }
...
```

Node.jsとbleaconパッケージを使うことで、とても簡単にiBeaconの信号を受信することができました。

# 参考

- [たった5行!最も簡単にiBeaconの電波を「受信」する方法 - Qiita](http://qiita.com/Morikuma_Works/items/c2899e548da1c5e2c28e)
- [Raspberry PiにnodebrewでNode.jsをインストールする - Qiita](http://qiita.com/yuyakato/items/a1225154445520dc2db3)
HttpURLConnection::getInputStream()で取得したInputStreamが空の場合について

Android 4.4.4 (Nexus5) で確認した現象で、
HttpURLConnection::getInputStream()で取得したInputStreamから
データを読み込もうとしたが、何も取得できなかった。
そのInputStreamのavailable()は0となっていた。
また、HttpURLConnectionのgetContentLength()は-1となっていた。

通信を行っているサーバーのほうではちゃんとデータを返しており、
返却するデータサイズを小さくしてみると、それは受信できた。
また、2.3端末で同じアプリを実行し、同じサーバーに接続すると問題なくデータを受信した。

原因はアプリや端末側ではなくサーバー側にあり、
サーバーでContent-Lengthヘッダを明示的に出力するようにしたところ、
データを取得することができるようになった。


要因も対応も複数あるかもしれない現象だが、一例として自分が踏んだものを残しておく。

※2014/11/25 追記

Android 5.0では、getContentLength()が正しく取得できてもavailable()は0になるよう。
なので、InputStreamからデータを取得する際には、available()は期待しないようにする。
Raspberry PiにnodebrewでNode.jsをインストールする

Raspberry Pi（Model B+）にnodebrewを使ってNode.jsの環境を構築するためのメモ。

# 環境

以下の環境で構築しました。なお、インストールしているディストリビューションはRaspbianです。

```
pi$ uname -a
Linux raspberrypi 3.12.29+ #714 PREEMPT Wed Oct 1 23:11:38 BST 2014 armv6l GNU/Linux
pi$ cat /etc/debian_version
7.6
```

# nodebrewをインストールする

[hokaccha/nodebrew](https://github.com/hokaccha/nodebrew)をインストールします。公式サイトの方法そのままです。

```
pi$ curl -L git.io/nodebrew | perl - setup
pi$ vi ~/.bashrc
# 環境変数PATHへの設定を追加する
pi$ tail ~/.bashrc
...
export PATH=$HOME/.nodebrew/current/bin:$PATH
pi$ source ~/.bashrc
```

# Node.jsをインストールする

Node.jsをバイナリからインストールします。
執筆時点での最新版はv0.10.33ですが、Raspberry Pi向け（arm-pi）のバイナリが用意されていないため、v0.10.28を使用します。

```
pi$ nodebrew install-binary 0.10.28
fetch: http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz
######################################################################## 100.0%
Install successful
pi$ nodebrew use 0.10.28
use v0.10.28
pi$ node -v
v0.10.28
pi$ npm -v
1.4.9
```

これだけでNode.jsの環境が構築できました。

# 参考

- [Raspberry PiとNode.jsで作る独立稼働モバイルサーバ | Think IT（シンクイット）](http://thinkit.co.jp/story/2013/08/22/4206)
- [Raspberry Piにnodejsをインストール - m_shige1979のささやかな抵抗と欲望の日々](http://m-shige1979.hatenablog.com/entry/2014/06/17/211645)
Google Play申請手順（2014年冬）

申請手順
=============

iOSほどではないがAndroidも定期的に手順やUIが変わるため、下記の情報は正確でない場合があるので、注意してください！

事前準備
----
apkファイルを用意しておく。

①アプリ情報を登録する
------------------------------
Google Play Developer Consoleから以下の情報を順番に入力していく。

https://play.google.com/apps/publish/

### 新しいアプリを追加
* デフォルトの言語：日本語
* タイトル：アプリ名

### 言語の追加と切り替え
日本語を選んだ場合は不要

### アイテムの詳細
* タイトル：アプリ名（30文字以内）
* 説明：アプリの説明文（4000文字）
* プロモーションテキスト：短めのアプリ説明文（任意）
* 最近の変更点：初回リリース時は不要

### 画像アセット

形式はJPEGかPNGファイル

* スクリーンショット：1辺320px以上の画像を2つ以上設定する（端末毎に設定可能）
* 高解像度アイコン：512*512px
* 宣伝用画像：1024*1024px（任意）
* プロモーション用画像：180*120px（任意）
* プロモーション動画：YouTubeのURL（任意）

### 分類
* アプリのタイプ：アプリケーションorゲーム
* カテゴリ：適切なカテゴリを選択する（ゲームの場合はさらにカテゴリあり）
* コンテンツレーティング：全ユーザー対象

### 連絡先情報
* ウェブサイト：サポートWebページ
* メールアドレス：サポート用のメールアドレス
* 電話番号：サポート用の電話番号（任意）

### プライバシーポリシー

* ポリシーへのリンク：なしでも構わない

**保存ボタンをクリックすると、この時点でストアの掲載情報が緑のマークとなっている！**

②apkファイルをアップロードする
------------------------------
APK>製品版で、製品版に最初のAPKをアップロードボタンをクリックする。
対象のapkをアップロードする。

**保存ボタンをクリックすると、この時点でapkが緑のマークとなっている！**


③価格と販売/配布地域を設定する
------------------------------

### 価格設定
* アプリの価格設定：無料
* デフォルトの価格：JPY
* 価格の自動換算：無料の場合は不要

### 配布する地域
* 配布する地域：日本を選択

### 同意事項
全ての同意事項を確認して、承諾する。

**保存ボタンをクリックすると、この時点で価格と販売/配布地域が緑のマークとなっている！**

④公開する
------------------------------
Consoleの右側に「公開の準備完了」と表示されるので、クリックし「このアプリを公開する」を選択すると、アプリの公開手続きが実行される。 

**2時間程度でGoogle Playストアでアクセスできるようになる！！** 

参考URL
-----
よく分かる！Android アプリのリリース手順のまとめ | アドカレ2013 : SP #20：
http://dev.classmethod.jp/smartphone/android/android-app-how-to-release/
ORMLiteでトランザクションを実相してみた。

AndroidのORMとしてはそこそこ有名なORMLiteですが、トランザクションの処理ではまったのでメモ。

トランザクションの処理はこちらのサイトを参考にさせてもらいました。
http://arti.jp.net/blog/archives/167/

Userというテーブルを作ろうと思って、UserModelをこんな感じで実装しました。
普段ならこれで十分なんですが…

``` UserModel.java
public class UserModel {

    private Context context;

    public UserModel(Context context) {
        this.context = context;
    }

    public void save(User user) throws SQLException {
        ORMDatabaseHelper helper = new ORMDatabaseHelper(context);
        try {
            Dao<User, Long> dao = helper.getDao(User.class);
            dao.createOrUpdate(user);
        } catch (SQLException sqle) {
            Log.e(TAG, sqle.getMessage(), sqle);
            throw sqle;
        } finally {
            helper.close();
        }
    }
}
```

こんな感じでトランザクションの処理を実相しました。
でも、これだとSQLExceptionが発生しちゃいます。
「Getting a writable database from helper ORMDatabaseHelper@44de02c0 failed"」とか言われました。
どうも、UserModelクラスの中でORMDatabaseHelperのインスタンスを新たに取得して使っている事が問題みたいでした。

``` HogeHogeModel.java

    /**
     * トランザクションを使った例
     */
    public void hogehogeTransaction() throws SQLException {
        final ORMDatabaseHelper helper = new ORMDatabaseHelper(context);

        try {
            TransactionManager.callInTransaction(
                    helper.getConnectionSource()
                    , new Callable<Void>() {
                        @Override
                        public Void call() throws Exception {
                            User user = new User();
                            userModel.save(user);
                            return null;
                        }
                    }
            );
        } catch (SQLException e) {
            throw e;
        }  finally {
            helper.close();
        }
    }
```

というわけで、こんな感じでORMDatabaseHelper のインスタンスを流用するようにしました。
これで正常に動作しました。

``` HogeHogeModel_修正後.java

    /**
     * トランザクションを使った例
     */
    public void hogehogeTransaction() throws SQLException {
        final ORMDatabaseHelper helper = new ORMDatabaseHelper(context);

        try {
            TransactionManager.callInTransaction(
                    helper.getConnectionSource()
                    , new Callable<Void>() {
                        @Override
                        public Void call() throws Exception {
                            User user = new User();
                            Dao<User, Long> dao = helper.getDao(User.class);
                            dao.createOrUpdate(user);
                            return null;
                        }
                    }
            );
        } catch (SQLException e) {
            throw e;
        }  finally {
            helper.close();
        }
    }
```

以上です。
SQLiteもORMLiteも難しいなあ…。
がんばって使いこなしてみます。
SwiftでYoutube検索【メモ】

#SwiftでYoutube検索【メモ】

Objective-C言語で書いていたYoutube検索処理をSwiftに置き換えてみました。Qiitaには要点だけ記載して、アプリの形にしたものはGithubに公開しています。

###[（Github:サンプルコード）](https://github.com/moonkids/MK_SimpleYoutubeSearch)

![スクリーンショット 2014-11-12 21.39.37.png](https://qiita-image-store.s3.amazonaws.com/0/59249/95f00797-69ca-4d5b-44c2-ca18ead5ea79.png)

Youtubeの検索では、**[【YouTube Data API v3】](https://developers.google.com/youtube/v3/getting-started?hl=ja)**を利用します。


##YoutubeのAPIについて

### API Key
Youtube検索で利用しているのは、**[【YouTube Data API v3】](https://developers.google.com/youtube/v3/getting-started?hl=ja)**です。リンク先に設定の手順などが記載されているので、登録と設定を行い、[Google Developer Console](https://console.developers.google.com/)でiOS用の ***API_Key*** を取得しておきます。

※この ***API Key*** をswiftのコード上で利用します。


### URLとパラメータ

Youtubeに対するリクスエストURL内に含めるパラメータで、検索の条件などを指定することができます。

**[Youtube Data API v3 - Searchパラメータ](https://developers.google.com/youtube/v3/docs/search/list?hl=ja#try-it)**

|パラメータ|意味|
|:-------|---:|
|&key=***API_Key***|事前に取得した***API Key***を指定します|
|&q=***検索文字***|検索したい文字列です|
|&part=snippet|サムネイルなどの詳細情報を結果のJSON文字列に含める|
|&maxResults=10|最大件数10件|
|&order=viewCount|再生回数の多い順に並べ替え|

今回使用するURLでは、上記の要素を指定しています。


##URLの準備（Swiftコード）

Youtube APIで決められているURLを構成します。URLには事前の設定で取得したAPI_Keyを含める必要があります。また、検索のキーワードなどに日本語を含めることを前提としてして文字列はURLエンコード処置を行っておきます。


```swift:ViewController.swift

let API_KEY:String = "xxxxxxxxxxxx" 

//SearchBarに入力されている文字列
println("search text=\(text)")

//URLエンコーディング（文字列エスケープ処理）
let searchWord:String! = text.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

//Youtubeに対して、検索をかけるURL文字列
let urlString:String = "https://www.googleapis.com/youtube/v3/search?key=\(API_KEY)&q=\(searchWord)&part=snippet&maxResults=10&order=viewCount"

//データを読み取るためのNSURL
let url:NSURL! = NSURL(string:urlString)

```







## JSONデータの取得

データの取得には、NSURLConnectionクラスを使用します。このクラスでURLに対してリクエストをする場合、同期、非同期の呼び出しが可能です。このコードでは**非同期**の呼び出しをしているので、結果が戻ってくるまでに時間がかかったとしても、iOSアプリの動作を妨げることがありません。

**※エラー処理については割愛**

```swift:ViewController.swift

let urlRequest:NSURLRequest = NSURLRequest(URL:url)

//URLに対してNSDataの結果を非同期で取得する
NSURLConnection.sendAsynchronousRequest(
    urlRequest,
    queue: NSOperationQueue.mainQueue(),
    completionHandler:{(response,jsonData,error) -> Void in
        
        //データが取得できた場合には、JSONを解析してNSDicrionaryに格納
        let dic:NSDictionary = NSJSONSerialization.JSONObjectWithData(
            jsonData!,
            options: NSJSONReadingOptions.AllowFragments,
            error: nil) as NSDictionary
        
        //結果のJSON文字列から必要な箇所だけを取得（itemsのキーだけを取り出す）
        let resultArray:NSArray = dic["items"] as NSArray
        println(resultArray)

        //取得したデータの表示
})
```


同期、非同期の切り替えには、使用するメソッドを切り替えます。

**※NSURLConnectionクラスの使用方法は、Objective-Cと引数の記法など変わっているので、注意が必要です。**

|メソッド名|用途|結果の取得方法|
|:-------|----|----------:|
|sendSynchronousRequest|同期呼び出し|戻り値がNSData?|
|sendAsynchronousRequest|非同期呼び出し|クロージャの引数にNSData!|


##課題

SwiftでJSON文字列からDictionary,Arrayへの配列変換に使える機能が見当たらないため、NSDictionary,NSArrayを利用してデータを保持しています。Swiftで便利な方法があればそちらに書き換える予定です。
Windows Movie Maker で作った xlmp ファイルから字幕だけを取り出す。

問題
---
Windows Movie Maker で作った字幕を順番に取り出して、
台本みたいなテキストファイルを作りたい。
Windows Movie Maker で生成される wlmp ファイルは XML ファイルなので読めるかとおもいきや、ファイル中のテキストは時間順に並んでいない。


解決策
-----
字幕ごとに extentID が順不同で振られていて、
最後に extentID が時間順にならんでいる。
そこで、字幕ごとにさきにオブジェクトを作っておいて、
最後の extentID のリストの順番で出力する。


コード
-----
ライセンスは MIT。

```py3
"""
Script Extractor from Windows Movie Maker XML file
This script takes wlmp (Windows Movie Maker file)
as an input, and extracts the text (TitleClip tag).

Author: mzmttks
License: MIT License
"""

import sys
import lxml.etree

try:
    ifile = sys.argv[1]
except:
    err = """ERROR: INPUT_FILE is not given
usage: wlmp2script.py INPUT_FILE
"""
    sys.stderr.writelines(err)
    sys.exit(1)

# open wlmp
with open(ifile) as handle:
    obj = lxml.etree.fromstring(" ".join(handle))

# extract subtitles
textsets = {}
for titleclip in obj.xpath("//TitleClip"):
    strs = u""
    for strset in titleclip.iterdescendants("BoundPropertyStringSet"):
        if strset.attrib["Name"]  != "string":
            continue
        strs = [s.attrib["Value"] for s
                in strset.iterchildren("BoundPropertyStringElement")
                if len(s.attrib["Value"]) > 0]
        strs = map(unicode, strs)
        strs = "\n".join(strs)
    textsets[titleclip.attrib["extentID"]] = unicode.encode(strs, "utf-8")
    
titles = [e.attrib["id"] for e in obj.xpath("//ExtentRef")]

# output subtitles
for title in titles:
    if title in textsets.keys() and len(textsets[title])>0:
        print textsets[title]
        print 
```
perl - 動的 use lib 実装


## 概要

動的な use lib 実装のためのテスト兼サンプルコード

参考URL:
 http://d.hatena.ne.jp/Eitel/20080416/p1

## ポイント

- 基本的には use lib の行で動的解釈が発生するようにすれば良い
    - eval とか stringification とか
- どうしてもパッケージグローバルな変数か関数が必要になる
    - 設定とか無名関数リファレンスとか

いくつかやり方が考えられるが、最終的には好み。

現実問題としては`FindBin`とか使った方が楽。→ ["@INC にみる Perl のやりかたがいっぱい - JPerl Advent Calendar 2010 Casual Track"](http://perl-users.jp/articles/advent-calendar/2010/casual/18)

## テストコード

ホストによって use lib するパスを変えるテスト

### 方法 - stringification

原理は参考 URL と同じ。

```perl
use strict;
use warnings;
use Data::Dumper;

use Sys::Hostname;

our %LIB_PATH;

BEGIN
{
	%LIB_PATH =  ( 'my_pc' => '/Users/hoge/example.com.git/lib'
					,'dev.local'	=> '/var/www/cgi-bin/lib'
					,'example.com'	=> '/usr/local/apache/cgi-bin/lib' );
}

use lib qq($LIB_PATH{hostname()});	# qq によって eval 的な stringification を発生させる

use MyModule;						# 動的 use lib で失敗していればここでコケてくれる

print Dumper({'MyModule' => \%MyModule::}); # 試しにスコープをダンプ
```

### 方法 - 無名関数リファレンス&クロージャで動的解釈を発生させる

```perl
# 〜〜略〜〜

our $LIB_PATH;

BEGIN
{
	my %libPath =  ( 	'my_pc' => '/Users/hoge/example.com.git/lib'
						,'dev.local'	=> '/var/www/cgi-bin/lib'
						,'example.com'	=> '/usr/local/apache/cgi-bin/lib' );
	
	$LIB_PATH = sub 
	{
		return $libPath{hostname()};
	} 
}

use lib $LIB_PATH->();

# 〜〜略〜〜
```

設定用のハッシュ定義を関数リファレンスの中に書くか外に書いてクロージャに格納するかは好み次第。


### 方法 - 無名関数じゃない sub はブロック内でもグローバルでござる

```perl
# 〜〜略〜〜

BEGIN
{
	my %libPath =  ( 	'my_pc' => '/Users/hoge/example.com.git/lib'
						,'dev.local'	=> '/var/www/cgi-bin/lib'
						,'example.com'	=> '/usr/local/apache/cgi-bin/lib' );
	
	sub _GET_LIB_PATH
	{
		return $libPath{hostname()};
	} 
}

use lib _GET_LIB_PATH();

# 〜〜略〜〜
```

通常`use`が解釈されるタイミングでは関数呼び出しは出来ないが、BEGIN 内で関数を定義する事によって呼び出せるようになる。

一見、パッケージグローバルなスコープを汚していないように見えるが、この`_GET_LIB_PATH`はパッケージグローバルな**関数**になるので注意。