OmniAICreator/Qiita-1.07M huggingface dataset:
java しか触ったことない新人と、golangのtutorial を学ぶ Exercise: Maps編

こちらが問題文

A Tour of Go
Exercise: Maps

WordCount 関数を実装してみましょう。文字列 s の “word” の数のmapを戻す必要があります。 wc.Test 関数は、引数に渡した関数に対しテストスイートを実行し、成功か失敗かを結果に表示します。

strings.Fields で、何かヒントを得ることができるはずです。

```
package main
import (
    "code.google.com/p/go-tour/wc"
)
func WordCount(s string) map[string]int {
    return map[string]int{"x": 1}
}

func main() {
    wc.Test(WordCount)
}
```


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

import に "fmt"を追加して Sの中身をみてみた。

```
import (
    "code.google.com/p/go-tour/wc"
    "fmt"
)
func WordCount(s string) map[string]int {
　　fmt.Println(s)
    return map[string]int{"x": 1}
}
```

....

output:
I am learning Go!
...

なるほど。 
Javaぽく考えると、string sをsplit として、mapにあるかを判定し、なければ追加、あればValueを更新でいけるかな。
書いたコードがこちら
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

```
func WordCount(s string) map[string]int {
    m := make(map[string]int)
    for _, s_token := range strings.Split(s, " "){
        v, ok := m[s_token]
        if ok {
        	m[s_token]++
        }else{
        	m[s_token] = 1
        }
    }
    return m
}
```

golangは range [array] ってやると、　index, element が返ってくるので
1個目のつかわないIndexは　_　で捨てて、中身だけ使ってます。 
map[key] は value, ok(keyの有無)が返ってくるので
もし、keyがあればvalueを+1して、なければ１を代入しています。

これでも動くんですが、これだとJavaでしかなく、Golangぽくないので、いろいろ調べてみたところ

なんと　map[key]++　これだけで、無ければ挿入、あればインクリメントしてくれるらしい
あと、Split(s, " ") = Fields.(s) らしいので変更した結果がこちら。

```
...
func WordCount(s string) map[string]int {
    m := make(map[string]int)
    for _, s_token := range strings.Fields(s){
   		m[s_token]++
    }
    return m
}
...
```

多少見やすくなったかな。
Pythonでsortedlist的なこと

簡単な方法としては **PriorityQueue** を使う方法か、二分探索をサポートするような **bisect** を使うと出来た。どうやって自分で比較関数を設定するのか（できるのか）、パフォーマンスはどうなのか、そのあたりをそのうち調べたい。

## bisect
```py
from bisect import insort
q = []
insort(q, 1)
insort(q, 10)
insort(q, 2)
insort(q, 5)
insort(q, 3)
print(q) # [1, 2, 3, 5, 10]
```

## PriorityQueue

```py
import Queue as Q
q = Q.PriorityQueue()
q.put(1)
q.put(10)
q.put(2)
q.put(5)
q.put(3)

# 1, 2, 3, 5, 10の順番で出力される
while q.qsize() > 0:
  print(q.get())
```
画面キャプチャを一時的に最前面で保持する「Kiritori」が便利

 画面キャプチャを一時的に最前面で保持する「Kiritori」が便利です



kiritoriを紹介してるサイト
http://bamka.info/3278/

app store
https://itunes.apple.com/jp/app/kiritori/id585126594?mt=12&ign-mpt=uo%3D4
Elixir Phoenixのデータベース操作モジュールEcto入門2

[前回](http://qiita.com/yoavlt/items/ffbda1f0397839c5db99)の続き。
今回はEcto.Repoの解説。

## データベース操作の抽象レイヤー
EctoのRepoはデータベースとのやりとりを抽象化している。
データベースがMySQLでも、PostgreSQLだろうとどんな形式で保存されていようと、Repoモジュールを通して操作することができる。

## データベース設定
データベースの設定は`config/prod.exs`、`config/dev.exs`や`config/test.exs`に記述する。それぞれ、本番、開発、テスト環境の設定。
デフォルトではPostgreSQLだが、他のデータベースを利用したい場合は、`mix.exs`の以下の部分のアダプターを変更して設定ファイルを変更すればいい。

```elixir:
 config :my_app, Repo,
   adapter: Ecto.Adapters.Postgres,
   database: "ecto_simple",
   username: "postgres",
   password: "postgres",
   hostname: "localhost
 ```

もっと短くこのように書くこともできる。

```elixir:
config :my_app, Repo,
  url: "ecto://postgres:postgres@localhost/ecto_simple
```


### 対応データベース

|データベース  |Dependency                |
|--------------|:-------------------------|
|PostgreSQL    |[postgrex][postgrex]      |
|MySQL         |[mariaex][mariaex]        |
|MSSQL         |[tds_ecto][tds_ecto]      |
|SQLite        |[sqlite_ecto][sqlite_ecto]|

[postgrex]: http://github.com/ericmj/postgrex
[mariaex]: http://github.com/xerions/mariaex
[tds_ecto]: https://github.com/livehelpnow/tds_ecto
[sqlite_ecto]: https://github.com/jazzyb/sqlite_ecto

## データベース操作

データベース操作は`insert`と`insert!`のように`!`が付くものと付かないものがあって何が違うのか疑問だった。
`!`が付くものは、失敗時に例外を投げる。

### insert

データベースにレコードを挿入する。
```elixir:
Repo.insert! user
```

### update, update_all
レコードを更新する。

#### updateクエリには4つのオペレーターがある
* `set` - フィールドの値を更新する。
* `inc` - フィールドの値をインクリメントする。
* `push` - フィールドに値を追加する。
* `pull` - フィールドから値を削除する。

```elixir:
Repo.update! %{post | title: "new title"}
Repo.update_all Post, set: [title: "title"]
```

### delete, delete_all
レコードを削除する。

```elixir:
Repo.delete! user
Repo.delete_all User
Repo.delete_all assoc(post, :messages)
```

### read
レコードの取得方法は複数ある。

#### get
primary_keyを指定して取得する。

```elixir:
Repo.get! User, 1
```

#### get_by
フィールドを指定して取得する。

```elixir:
Repo.get_by(ProgrammingLanguage, name: "Elixir")
```

#### all
複数のレコードを取得する。

```elixir:
query = from w in Weather,
    where: w.prcp <= 0.0 or is_nil(w.prcp),
    select: w
query |> Repo.all
```

#### one
一つだけレコードを取得する。

```elixir:
Repo.one(User)
```

#### preload
関連も一緒に取得してくる。preloadしなかった場合、NotLoadedになる。

```elixir:
post = Post |> Repo.get(1) |> Repo.preload(:messages)
post.messages // ちゃんと取得される
```
クエリパラメータの値を変数に設定するのにはまったこと

クエリパラメータの値を、\<aura:attribute />の変数に設定するやり方について、はまったので備忘録的に記入します

ネストされているコンポーネントでは、直接、変数には設定できないようです
ルートのコンポーネントに変数を作成して、引き継いでいくと設定できることを確認できました

値の引継ぎ処理が冗長になって見にくくなるのが問題に感じました
解決してすっきりしましたー
Rails Tutorial 3rd「12.3.3 - Subselects」をActive Recordでやる

Rails Tutorial 一番最後の最後
自分とフォローしてるユーザーの書き込みを出す画面を作るところ｡

1　Relationshipから現在のUserIDが含まれる行を検索
2　その行に含まれるフォロー先ユーザーのID(と自分のID?)を抽出
3　配列にしてMicropostから該当のユーザーIDがあるものを抽出

という操作｡

ハートルは

```rb:
  def feed
    following_ids = "SELECT followed_id FROM relationships
                     WHERE  follower_id = :user_id"
    Micropost.where("user_id IN (#{following_ids})
                     OR user_id = :user_id", user_id: id)
  end
```

としてるけど
これでもいいんじゃないかと

```rb:
  def feed
    feed_id_array = Relationship
                     .where(follower_id: self.id)
                     .pluck(:followed_id)
    feed_id_array << self.id
    Micropost.where(user_id: feed_id_array)
  end
```
[pluckを使って](http://api.rubyonrails.org/v4.0.3/classes/ActiveRecord/Calculations.html#method-i-pluck)IDだけ出てくるようにした｡IDを取るのは　current_user という別のところに定義したメソッドで今のユーザーオブジェクトを取ってきて

current_user.id

としないといかんのかと思ったら｡

 user_object.feed

って使うんだから self.id　でいいわな｡

ところでWhereの中にSQLを書いたほうがなんとなくActiveRecord使うより早そうに見えるんですがそこんとこどうなんでしょう｡SQLを使うとデータベース変えたら動かなくなる可能性が高いようだし､見た目がよろしくないから避けたいのだけど｡

やっとチュートリアル終わった・・・

#補足

ORをどうやってやるかわかんなかったのでが､

    feed_id_array << self.id

とかやってたけど
コメントで指摘されたSqueelを使うといいような感じ｡
[これによると](http://qiita.com/yusuke-matsuda/items/d36c61f639aa96b80acf)


    User.where { (name == 'hoge') | (name == 'fuga') }

とか出来ちゃうらしい｡
AWS 認定ソリューションアーキテクト – プロフェッショナルで不合格だった

[AWS 認定ソリューションアーキテクト – プロフェッショナル](http://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)を受験しました。
しかしながら56%のスコアで不合格でしたorz
([2017年1月にリベンジして合格しました](http://qiita.com/mechamogera/items/b9b658369918290d0889))

実施した勉強の内容はこちら

* サンプル問題をみる
* 模擬試験を受験（スコア40%で不合格orz）
* AWSトレーニング([Advanced Architecting on AWS](http://aws.amazon.com/jp/training/course-descriptions/advanced-architecting/))受講

所感

 * 試験は170分80問で集中力を保つのが大変、見直し時間はあまりなかったがとりあえず一通りしっかり目を通して回答する時間はあった
 * アソシエイトに比べてサービスが横断的になりより幅広いIT知識やAWSサービスの詳細な知識を求められる
 * アソシエイトの試験ではAWSトレーニングで学んだ内容がそのまま試験内容に出る感じだったが、プロフェッショナルでは試験の内容が広くトレーニングではカバーしきれない感じ(ただし、ベースとなる知識などは得られる)
 * 実際に試しにくいサービス(VPNやDirect Connectなど)や個人的に触ったことのないサービス（HSMやKinesisなど)の問題について弱かった
 * サンプル問題、模擬試験は必須で事前に解いておいた方が良い、わからなかったところを調べるだけでもかなり対策になる
 * しかし、模擬試験も本試験も答えがわからないので悶々とする

AWSトレーニングでは以下のような勉強方法を言われていましたがそんな感じかなと思います。

* 基本的にはアソシエイトと勉強の流れは変わらない
* 試験ガイドとサンプル問題を見る
* 模擬試験を受けてカバー範囲をみておく
* 前提となるIT知識を調べておく
* 新しいサービスには対応できていないのでベーシックな部分を確認しておく


ちなみに模擬試験は毎回同じ問題が順番違いで出るみたいです。
ショッピングAPIの商品検索で頻繁にBad Requestエラー

いつもショッピングAPIを利用させていただいております。
http://developer.yahoo.co.jp/webapi/shopping/shopping/v1/itemsearch.html

メンテナンスをされた2015年7月28日ごろから上記URLのショッピングAPIの商品検索で頻繁にBad Requestエラーが発生します。

必ずBad Requestとなるわけではなく、結構な頻度でBad Requestとなります。

1クエリー/秒を超えてもいないと思いますし、これまで問題が無かったリクエストでもBad Requestとなるため、何か問題が発生していないかご確認いただけませんでしょうか。

よろしくお願いいたします。
カレンダー

バッチファイルで書いた `cal` コマンドです。

だいぶむかしに書いたものですが、ちょっとだけ修正しました。

```bat:cal.bat
@echo off

set SELF=%~n0
set HELP=Usage: %SELF% MONTH YEAR

setlocal enabledelayedexpansion
  :: 値が数値か確認
  (echo %~1) | findstr /r "[^0-9]." > NUL && (
    >&2 echo %HELP%
    exit /b 1
  )
  (echo %~2) | findstr /r "[^0-9]." > NUL && (
    >&2 echo %HELP%
    exit /b 1
  )
  
  :: 位置パラメーターを取得
  set y=%~2
  set m=%~1
  
  :: 値が範囲内か確認
  if %m% lss  1 (
    >&2 echo %SELF%: illegal month value: use 1-12
    exit /b 1
  )
  if %m% gtr 12 (
    >&2 echo %SELF%: illegal month value: use 1-12
    exit /b 1
  )
  if %y% lss    1 (
    >&2 echo %SELF%: illegal year value: use 1-9999
    exit /b 1
  )
  if %y% gtr 9999 (
    >&2 echo %SELF%: illegal year value: use 1-9999
    exit /b 1
  )
  
  :: 指定された日の曜日を取得（月初の曜日）
  call :get_day_of_week %y% %m% 1
  set w=%ERRORLEVEL%
  
  :: 指定された月の日数を取得
  set i=1
  for %%i in (31 28 31 30 31 30 31 31 30 31 30 31) do (
    set d[!i!]=%%i
    set /a i+=1
  )
  set d=!d[%m%]!
  
  :: うるう年を考慮
  if %m% equ 2 (call :is_leap_year %y% || set /a d+=1)
  
  :: カレンダーを表示
  if %m% lss 10 (
    echo %y%/ %m%
  ) else (
    echo %y%/%m%
  )
  echo Su Mo Tu We Th Fr Sa
  set t=
  for /l %%i in (1,1,%w%) do (set t=!t!   )
  for /l %%d in (1,1,%d%) do (
    if %%d lss 10 (set t=!t! )
    set t=!t!%%d
    call :get_day_of_week %y% %m% %%d
    set n=!ERRORLEVEL!
    if !n! equ 6 (echo !t! & set t=) else (set t=!t! )
  )
  if not "%t%" == "" echo %t%
  echo.
  
  exit /b 0
endlocal
goto :EOF

:is_leap_year
setlocal
  set n=0
  
  set /a n=%1%%400
  if %n% equ 0 exit /b 1
  
  set /a n=%1%%100
  if %n% equ 0 exit /b 0
  
  set /a n=%1%%4
  if %n% equ 0 exit /b 1
  
  exit /b 0
endlocal
goto :EOF

:get_day_of_week
setlocal
  set y=%1
  set m=%2
  
  if %m% leq 2 (
    set /a y-=1
    set /a m+=12
  )
  
  :: ツェラーの公式
  set /a w=(5*%y%/4-%y%/100+%y%/400+(26*%m%+16)/10+%3)%%7
endlocal & exit /b %w%
goto :EOF
```

位置パラメーターの指定や実行結果は以下をご覧ください。

![cal.png](https://qiita-image-store.s3.amazonaws.com/0/29814/9a0f6c15-08b1-cd71-9f2d-7b063687ad3d.png)
Cython on Raspberry Pi

Pythonで開発しているプログラムをRaspberryPiのようにPCに比べて貧弱なCPUに移植する際には、遅さが目立ってしまう。

なるべく少ない労力で高速化できるかどうか、Cythonの状況を調べてみた。
(Scikit-learn, scikit-imageはCythonを用いて高速化をしている。それらが、RaspberryPiでも使えていることを考えると、Cythonの枠組みがRaspberryPiでも使えているはずだ。)

Cythonを使ってRaspberryPi上で高速化している事例は見つかった。
Cython自体のinstall方法はどうしているのか調査中だが、
sudo pip install cython
としているのが見つかった。

> Speed of Python, at least for doing raw IO, is quiet disappointing. By using Cython (for the whole program), speeds becomes acceptable.

ボトルネックになっていて書き換えをする価値が高い関数を特定して
・単体テストを書く、・Pythonをベースとして、pyxファイルへの書き換えで高速化する。
（あるいは、C/C++言語で記述して、Cythonでラップすることで高速化する。）
・単体テストが成功していることを確認する。
のがよさそうです。

NEON命令を使う前のC/C++のソースと
NEON命令を使ったC/C++のソースとを
書いてARMでの高速化をはかるのがよさそうです。


もちろんCython以前の部分で最適化できることを実施しておくことが重要です。
python2.7で気軽にrange()関数を使ってしまいがちです。
xrange()で置き換えられる部分を置き換えます。
イテレータやジェネレータを使って、巨大なリストを生成させずに処理することが効果的だったりしています。


###情報源
[1]:Raspberry, running Python
http://www.student.tue.nl/W/r.mientki/running_python.html

[2]:User’s Guide » Installation on Raspberry Pi
Install Cython from sources (debian package are outdated):
http://kivy.org/docs/installation/installation-rpi.html
【PHP】画像処理関連メモ


# [getimagesize](http://php.net/manual/ja/function.getimagesize.php)
画像の大きさを取得する

```php
$img = getimazesize('ファイル名');
$img[0] : 画像の幅
$img[1] : 画像の高さ
$img[2] : 画像形式定数
$img[3] : imgタグ用文字列(height="yyy" width="xxx")
```

# [exif_imagetype](http://php.net/manual/ja/function.exif-imagetype.php)
イメージの型を定義する
返り値は`getimagesize`のインデックス2の返り値と同じになる
画像のサイズが必要なければ高速なのでこちらを使う

## [画像形式定数](http://php.net/manual/ja/function.exif-imagetype.php#refsect1-function.exif-imagetype-constants)
|値|定数|
|:-:|:--|
|1|IMAGETYPE_GIF|
|2|IMAGETYPE_JPEG|
|3|IMAGETYPE_PNG|
|4|IMAGETYPE_SWF|
|5|IMAGETYPE_PSD|
|6|IMAGETYPE_BMP|
|7|IMAGETYPE_TIFF_II (intel byte order)|
|8|IMAGETYPE_TIFF_MM (motorola byte order)|
|9|IMAGETYPE_JPC|
|10|IMAGETYPE_JP2|
|11|IMAGETYPE_JPX|
|12|IMAGETYPE_JB2|
|13|IMAGETYPE_SWC|
|14|IMAGETYPE_IFF|
|15|IMAGETYPE_WBMP|
|16|IMAGETYPE_XBM|
|17|IMAGETYPE_ICO|


# [image_type_to_extention](http://php.net/manual/ja/function.image-type-to-extension.php)
画像形式からファイルの拡張子を取得する
第二引数をfalseにするとドット(.)なしの拡張子を返す

```php:getimazesize
//ファイル名から画像形式定数を取得
$img = getimazesize('ファイル名');

//画像形式定数から拡張子を取得
$type = image_type_to_extention($img[2]);
```

```php:exif_imagetype
$type = image_type_to_extention(exif_imagetype('ファイル名'));
```

```php:実際の返り値
$arr = array(IMAGETYPE_GIF,
IMAGETYPE_JPEG,
IMAGETYPE_PNG,
IMAGETYPE_SWF,
IMAGETYPE_PSD,
IMAGETYPE_BMP,
IMAGETYPE_TIFF_II,
IMAGETYPE_TIFF_MM,
IMAGETYPE_JPC,
IMAGETYPE_JP2,
IMAGETYPE_JPX,
IMAGETYPE_JB2,
IMAGETYPE_SWC,
IMAGETYPE_IFF,
IMAGETYPE_WBMP,
IMAGETYPE_XBM,
IMAGETYPE_ICO);

foreach ($arr as $value) {
    echo image_type_to_extension($value)."\t";
    echo image_type_to_extension($value,false)."\n";
}

/*
.gif	gif
.jpeg	jpeg
.png	png
.swf	swf
.psd	psd
.bmp	bmp
.tiff	tiff
.tiff	tiff
.jpc	jpc
.jp2	jp2
.jpx	jpx
.jb2	jb2
.swf	swf
.iff	iff
.bmp	bmp
.xbm	xbm
.ico	ico
*/
```
jQueryからAmazon API Gatewayを使用する

# 概要

AWSから新サービス [API Gateway](http://aws.amazon.com/jp/api-gateway/) がリリースされました。[Lambda](http://aws.amazon.com/jp/lambda/) (あるいは外部のHTTP) と連携させることで、他のAWSシステムやバックエンドシステムが提供する機能をREST APIとして公開することが可能となります。

Gateway APIを使った最も分かりやすい例は、下のフローのようにLamdaファンクション (Node.jsやJava) を介してバックエンドのDBからデータを取得したり更新する構成かと思います。

```
EC2 <-(HTTP)-> API Gateway <-> Lambda <-> DB (RDS, DynamoDB...)
```

ここでは手始めに、jQuery経由でAPI Gatewayをコールする方法について説明します。

※2015年8月1日時点、Gateway APIのTokyoリージョンは提供されていません。ただしリージョンブリッジが可能なため、Lambda以降のシステムをTokyoリージョンで構築することは可能です。

# 実装

jQuery側はいつも通り$.ajax()をコールするだけ。`url`にはAPI Gatewayから発行されたURLを指定します。

```
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
  (function() {
    var data = {
      'id': 'xxx'
    }

    $.ajax({
      type: 'POST',
      url: '{ENDPOINT_URL}',
      data: JSON.stringify(data),
      success: function(data) {
        console.log(data);
      }
    });
  })();
</script>
```

ただしこの状態でリクエストを送信すると、CORSの制限に引っかかり、API Gatewayから`No 'Access-Control-Allow-Origin' header is present on the requested resource.`といったエラーが返されます。

![error_response.png](https://qiita-image-store.s3.amazonaws.com/0/27454/6a298020-99d0-d49d-6632-de0e079a7052.png)

この問題を回避するには、API Gateway側でCORSを有効化する必要があります。
詳細は [Enable CORS for a Method in API Gateway](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html) に記載されてますが、基本的には対象リソースの"Method Response"、"Integration Response"を編集するだけです。

## Method Responseの設定
![method_response.png](https://qiita-image-store.s3.amazonaws.com/0/27454/fbc6a3aa-2777-29a5-27fd-4d081366a075.png)

## Integration Responseの設定
![integration_response.png](https://qiita-image-store.s3.amazonaws.com/0/27454/c783e8f8-4e92-ab63-63ee-1c50a936ca66.png)

"Integration Response"の"Mapping value"では、シングルクォートを値に含める必要がある点に注意して下さい。

最後に"Deploy API"を実行してデプロイすれば問題は解決します。

![success_response.png](https://qiita-image-store.s3.amazonaws.com/0/27454/19988adc-a0a4-b6c3-c26a-ec45871d8d99.png)

ここでは `console.log(data)` の結果として、API Gatewayのバックエンドで実行されているLambdaファンクションの戻り値が表示されています。
AltBeaconの実装方法＃Beacon情報の取得、他

#Beaconから取得できる情報
それでは[前回（AltBeaconの実装方法#領域監視）](http://qiita.com/a_nishimura/items/2974fd0956c9e00b6bec)の続きになります。
初期設定は前回に記述しているので、そちらも参考にして下さい。

AltBeaconでは領域監視だけでなく、Beaconから発信されているデータを取得することもできます。主なデータは以下の通りです。
【取得データ】
**・ビーコン名**
設定されたビーコン名
**・Macアドレス**
ビーコンに設定されているユニークなID（変更不可）
**・UUID値**
所属するグループを識別するための値で、一意のIDを設定する。
**・Major値**
ビーコンそのものを識別するID、Minor値とセットで一意のIDを設定する。
**・Minor値**
ビーコンそのものを識別するID、Major値とセットで一意のIDを設定する。
**・距離**
検出しているビーコンと端末との距離（メートル単位）
**・RSSI値**
検知したビーコンの電波強度。端末とビーコンの距離に関係し、一般的に電波強度が高いほどビーコンとの距離が近いことを表す。

他にも取得できるデータは存在しますが、省略します。


#Beaconのレンジング設定
それでは実装に入ります。
実装は[前回の続き](http://qiita.com/a_nishimura/items/2974fd0956c9e00b6bec)からになります。

前回は領域監視の設定まで実装しました。

```java
@Override
public void onBeaconServiceConnect() {
    mBeaconManager.setMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            // 領域への入場を検知
        }
 
        @Override
        public void didExitRegion(Region region) {
            // 領域からの退場を検知
        }
 
        @Override
        public void didDetermineStateForRegion(int i, Region region) {
            // 領域への入退場のステータス変化を検知
        }
    });
}
```

ビーコンの情報を取得するにはBeaconManagerからレンジングを行う必要があります。
例では領域に入場したタイミングでレンジングを開始します。

```java
Region mRegion = new Region("一意のユニークID", uuid, major, minor);
@Override
public void didEnterRegion(Region region) {
    // 領域への入場を検知
    // レンジングの開始
    mBeaconManager.startRangingBeaconsInRegion(mRegion);
}

@Override
public void didExitRegion(Region region) {
    // 領域からの退場を検知
    // レンジングの停止
    mBeaconManager.stopRangingBeaconsInRegion(mRegion);
}
```
※Regionに設定する引数は、任意のビーコンを識別するために使用します。
使用しない場合はnullを設定します。

#Beacon情報の取得
レンジングを開始したら通知を受け取る設定を行います。
通知はBeaconManager#setRangeNotifierで受け取り、引数にリスナーを設定します。

```java
mBeaconManager.setRangeNotifier(new RangeNotifier() {
    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
        // 検出したビーコンの情報を全部Logに書き出す
        for(Beacon beacon : beacons) {
                // ログの出力
                Log.d("Beacon", "UUID:" + beacon.getId1() + ", major:" + beacon.getId2()
                + ", minor:" + beacon.getId3() + ", Distance:" + beacon.getDistance()
                + ",RSSI" + beacon.getRssi());
        }
    }
});
```

検出したBeaconクラスの値から各種データを取得することができます。
※Beacon#getId1は"uuid"、getId2は"major"、getId3は"minor"です。

#まとめ
これでAndroidでもiBeaconと同等の機能を実装することができました。
出来ることは限られていますがBLEを使用したアプリケーションではかなり便利に使用することができると思います。
svnコミットのタイミングでJenkinsでビルドする



## curlでJobの起動を確認

参考: http://blog.kyanny.me/entry/2014/12/20/020700

上記のページを参考に以下のようにcurlでjenkinsのURLを叩く

```
$ curl -X POST -u user:api_token http://jenkins.example.com/JOB_NAME/build
```

Jenkins側でビルドが実行されたら疎通確認完了。

## svn サーバに post-commit フックスクリプトを仕込む

次に、svnサーバ側に post-commit フックスクリプトを仕込む。

```bash
$ cd path/to/repos/hook    #リポジトリの格納場所に移動
$ vi post-commit
```

post-commit の中身には以下のように記述

```post-commit
user={USER}
api_token={USER_API_TOKEN}
job={JOB_NAME}

curl -X POST -u $user:$api_token http://{JENKINS_HOST:PORT}/job/$job/build
```

{...} の部分は環境に応じて適宜置き換え

これで準備完了。

あとは、svn commit して Jenkins でビルドが実行されたらOK
ネストした Hash をまとめて初期化したい

# きっかけ

以下のようなコードをもっと手軽に書けないかなと思ったのが発端です。

```rb
hash = {}
hash[:yuno] = {}
hash[:yuno][:miyako] = {}
```

# 方法

@takeyuichi さんが素晴らしい書き方を教えて下さいました。感謝っ…！ 圧倒的感謝っ…！

```rb
hash = Hash.new { |h, k| h[k] = h.dup.clear }

hash[:yuno][:miyako] #=> {}
hash #=> { :yuno => { :miyako => {} } }
```

# 解説

これは Hash のデフォルト値を巧みに利用したテクニックだと思います。

例えば

```rb
hash = Hash.new({})
```

では、ローカル変数 `hash` のデフォルト値は `{}` になりますが、
そのデフォルト値の Hash のデフォルト値は特に指定されていないため `nil` となってしまいます。

```rb
hash = Hash.new({})

hash[:yuno] #=> {}
hash[:sae] #=> {}
hash[:yuno][:miyako] #=> nil
```

つまり、要件を満たすには
**「デフォルト値としてハッシュを返す」ハッシュをデフォルト値とする**
必要があるわけです (ややこしいですね…) 。

そこで Hash#dup が役立ちます。要は

```rb
hash = Hash.new { |h, k| h[k] = h.dup }

hash[:yuno][:miyako] #=> {}
hash #=> {:yuno=>{:miyako=>{}}}
```

のように **Hash である自分自身** をデフォルト値とすればよいのです。
(Hash#dup はデフォルト値も引き継ぎます。)
なるほど :eyes: からうろこ！！！

しかしこのままでは

```rb
hash = Hash.new { |h, k| h[k] = h.dup } 

hash[:yuno][:juniors] = ['乃莉', 'なずな']
hash[:yuno][:miyako] #=> { :juniors => ["乃莉", "なずな"] }
hash #=> { :yuno => { :juniors => ["乃莉", "なずな"], :miyako => { :juniors => ["乃莉", "なずな"] } } }
```

このようにデフォルト値が汚染されて (上書きされて) しまいます。
なので

```rb
hash = Hash.new { |h, k| h[k] = h.dup.clear }

hash[:yuno][:juniors] = ['乃莉', 'なずな']
hash[:yuno][:miyako] #=> {}
hash #=> { :yuno => { :juniors => ["乃莉", "なずな"], :miyako => {} } }
```

と dup のあとで clear を呼んでハッシュの中身をクリアすることで、
デフォルト値の汚染を防ぐことができます。
(Hash#clear はデフォルト値の設定はクリアしません。)

ちょっとした要件がきっかけで、非常に勉強になりました。 :smile: 

# おまけ

Hash のデフォルト値には注意すべきポイントもあります。
詳しくは [ハッシュの安全な扱い方 (デフォルト値とその落とし穴について)](http://qiita.com/QUANON/items/bcd3f0c877796b8be7e1) にまとめています。

# 参考

* [singleton method Hash.new](http://docs.ruby-lang.org/ja/2.2.0/method/Hash/s/new.html)
* [instance method Hash#clone](http://docs.ruby-lang.org/ja/2.2.0/method/Hash/i/dup.html)
* [instance method Hash#clear](http://docs.ruby-lang.org/ja/2.2.0/method/Hash/i/clear.html)
unity > [ExecuteInEditMode]

https://unity3d.com/learn/tutorials/modules/intermediate/scripting/attributes?playlist=17117

```
[ExecuteInEditMode]
public class ColorScript : MonoBehaviour
{
  void Start()
  {
    renderer.sharedMaterial.color = Color.red;
  }
}
```

<hr>
http://docs.unity3d.com/ja/current/ScriptReference/ExecuteInEditMode.html

> デフォルトでは、スクリプトコンポーネントは Play モードでのみ実行されます。 この属性を追加することで各々のスクリプトコンポーネントはエディターが Play モードでないときにコールバック関数が実行されます。

<hr>
[STEP UP！Next.](http://stepup-next.halfmoon.jp/blog/2013/12/28/%E3%80%90unity%E3%80%91executeineditmode%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E7%B7%A8%E9%9B%86%E4%B8%AD%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE/)

> Unityエディターでは、わざわざ再生ボタンを押さずともスクリプトを再生させることが出来ます。
...
> プログラムを変更した後は一度、Gameビューをクリックすると画面が更新される様になります。
unity > [Range(-100,100)] public int speed=0;

https://unity3d.com/learn/tutorials/modules/intermediate/scripting/attributes?playlist=17117

```
[Range(-100,100)]
public int speed = 0;
```

これでspeedの設定に対して(-100,100)の制限がかかる。

こういう書き方でもいい。

```
[Range(-100,100)] public int speed = 0;
```
[JavaScript] 連想配列のソート（並び替え）

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) １つのキーでソートする関数

```js:JavaScript
//--------------------------------------------
// Sort Object's Array by key
//   ary   : Array [{},{},{}...]
//   key   : string
//   order : string "asc"(default) or "desc"
//--------------------------------------------
function ObjArraySort(ary, key, order) {
    var reverse = 1;
    if(order && order.toLowerCase() == "desc") 
        reverse = -1;
    ary.sort(function(a, b) {
		if(a[key] < b[key])
            return -1 * reverse;
		else if(a[key] == b[key])
            return 0;
        else
            return 1 * reverse;
	});
}
```

⇒ デモは<a href="http://jsfiddle.net/0sgqL22s/2/" target="_blank">こちら</a>

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) ２つのキーでソートする関数

```js:JavaScript
//--------------------------------------------
// Sort Object's Array by key1, key2
//   ary    : Array [{},{},{}...]
//   key1   : string
//   order1 : string "asc"(default) or "desc"
//   key2   : string
//   order2 : string "asc"(default) or "desc"
//--------------------------------------------
function ObjArraySort2(ary, key1, order1, key2, order2) {
    var reverse1 = 1;
    var reverse2 = 1;
    if(order1 && order1.toLowerCase() == "desc") 
        reverse1 = -1;
    if(order2 && order2.toLowerCase() == "desc") 
        reverse2 = -1;
    
    ary.sort(function(a, b) {
        // Compare 1st key
		if(a[key1] < b[key1])
            return -1 * reverse1;
        else if(a[key1] > b[key1])
            return 1 * reverse1;
		else
        {
            // Compare 2nd key
            if(a[key2] < b[key2])
                return -1 * reverse2;
            else if(a[key2] > b[key2])
                return 1 * reverse2;
            else
                return 0;
        }
	});
}
```

⇒ デモは<a href="http://jsfiddle.net/0sgqL22s/4/" target="_blank">こちら</a>

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) 参考URL

連想配列のソートについてはすでに多くの記事がありますのでそちらも参考に。

JavaScript つい忘れてしまう配列のソート方法
http://qiita.com/PianoScoreJP/items/f0ff7345229871039672

Javascriptでオブジェクトの配列をKey/Valueでソートする関数
http://qiita.com/n0bisuke/items/f2dd06bfb0e4daa1e0d8

***

(･o･ゞ いじょー。
Pandoc依存症になる

様々なフォーマット形式に対応したドキュメント変換ツール、**[Pandoc](http://pandoc.org/)**がめちゃくちゃ使えるヤツなのでメモ

#Pandocのインストール
brewで簡単にインストールできる

```bash
$ brew install pandoc
```


#基本の使い方

Texファイル`input.tex`をマークダウン`output.md`へ変換する場合

```
$ pandoc -o output.md input.tex
```

`-o`はアウトプットファイルを指定する
だいたいは拡張子からフォーマットを自動的に取得してくれる
あえて設定したいときは、`f/-from`で入力フォーマットを、`-t/-to`で出力フォーマットを設定することができる


#Pandocにおけるマークダウン
基本的な使い方を含め、日本語ドキュメントがわりとしっかりしているので、使い方で困ることはあまりないと思う。
[Pandoc ユーザーズガイド 日本語版](http://sky-y.github.io/site-pandoc-jp/users-guide/)
RailsでDynamoDB APIを操作する

# 概要

Rails環境からDynamoDBのCRUDを行うサンプルアプリケーションを作成しました。説明するよりコードを見たほうが早いと思うのでサンプルソースを置いておきます。

* [GitHub: sandbox-dynamo_db](https://github.com/naomichi-y/sandbox-dynamo_db)
  * [sample_controller.rb](https://github.com/naomichi-y/sandbox-dynamo_db/blob/master/app/controllers/samples_controller.rb)
* [Module: Aws::DynamoDB](http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB.html)
Laravel Eloquentのjoin結合先は論理削除に留意する

LaravelのSoftDeletingTraitは非常に便利なのですが、
適用範囲はQueryBuilderを発行する基となるクラスです。

つまり、join/leftJoin/rightJoinで結合した先の論理削除条件は
自動ではセットされません。

そこで、例えばこんな感じになります。

```php
Product::where('products.type_id', 1)
    ->leftJoin('options', function ($join) {
        $join->on('products.id', '=', 'options.product_id')
            ->whereNull('options.deleted_at');
    })
    ->select('products.name as product_name', 'options.name as option_name')
    ->get();
```

基本的にはeager loadingすれば良いと思うのですが、
joinする場合は気を付けた方が良いですね。
Railsの情報を集めてくれるサイトを作る。


#　仕様
(x)1サイトはRubyの情報を集めてくれる＝スクレピングサイト
(おk)2基本的なことを書いたら、twitterbootstrapをRailsに入れる。

開発環境　Cloud9
使用言語　Ruby
フレームワーク Rails

# なんでそんなん欲しいの？？

学習したい意欲＝学欲があるのになんか楽しくなれるrubyサイトが無いから？？てか英語だと
訳せても、IT関連の基礎知識がないから結局わからん、言い回しが独特。
もしくは情報取得の自動化はかなり魅力的と感じるから。ただ現状スクレイピングサイトが乱立しないのは結局コピーライトの関係なのかなとも昨日から思う。迷惑かけない分には学びは大きいですが。


# 学習面

##デザインは基本bootstrapに任せる。

1 railsにtwiiter-bootstrap-railsの導入方法
URL
http://ruby-rails.hatenadiary.com/entry/20140801/1406818800

## Rubyの情報を集めてくれるスクレピング(nokogiri)を理解する。

gemを入れるだけで幸せになれる、

新たな疑問
Rubyの情報を取ってくる先とそのサイトの解析方法を知る。
相手サイトに負荷を与えない設定をする。(重要！！)



追記
作る際の手順
URL

http://ruby-rails.hatenadiary.com/entry/20140813/1407915718


7/31 
サイトのviewを作る(超簡単に)
modelにスクレピング先サイトのURLとTITLEを取得するコード(コピペ)する。
参考URL
http://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/


参考URL
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cad=rja&uact=8&ved=0CEQQFjAFahUKEwiFkp2UwITHAhWh26YKHb7GB4Q&url=https%3A%2F%2Fgithub.com%2FZIGExN%2Fruby-trailning%2Fwiki%2FWeb%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AC%25E3%2582%25A4%25E3%2583%2594%25E3%2583%25B3%25E3%2582%25B0%25E3%2582%2592%25E7%2594%25A8%25E3%2581%2584%25E3%2581%259F%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E6%25A4%259C%25E7%25B4%25A2%25E3%2582%25AF%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%25A9%25E6%25A7%258B%25E7%25AF%2589%25E5%2585%25A5%25E9%2596%2580&ei=XvW6VYXrFqG3mwW-jZ-gCA&usg=AFQjCNFmQU8qdLn_NAj4YbHLf6QTNbr-wQ&sig2=tSx5CemX_2VgCGtPqE9Jnw


viewに検索結果を表示できるようにする⇦イマココ

参考サイト
http://bugrammer.hateblo.jp/entry/2014/08/29/141926

8/1
codecademyでHTMLの基本を学ぶ(デザインにかまける)
ProgateのRails入門を並行して行う。

8/2-4
デザイン面ばかりに気をとられる。もういいや。
コードを書くべき。と同時にRubyの文法の学習+Railsの扱い方+スクレイピングする対象を見つける。解析する。を行う。
気づきとしてはネイバーまとめのサイト構造は基本綺麗だということ。
8/5
対象サイトコードの解析、楽しいRuby(Rubyの文法学習)、progate(railsの扱い方)
コードの解析
スクレイピングコードの理解と、nodelにスクレイピングの処理を書き、コントローラに投げて、ビューに表示することの一連のながれ。ここに関しては佐々木さんの指導によって基本は理解したかと？？。次に求められるのは、応用。

プロとペアプロ(僕はほとんどできないわけですが、)をすると非常に楽しい、気づきも多く、何よりコードを書くのをオンタイムでみれるが一番楽しい。

現状できないことと、やらなければならないことに対する必要な基礎をその場で理解できる。

8/6
Rails中級編。
Scaffoldしコードとの比較、そして変更。
Railsの初級編二回目終了、メソッドに変数を定義し、その変数に対していろいろなメソッドを定義することで、様々なことができる。
が例えば@note,@notesといった微妙な違いを理解して使うためには、対象のメソッドをすべて理解しておき、必要な時に思い出せる必要がある。
そこらへんがまだまだ、
8/7
Rails中級編、二回目、今回は前回ローカルに作ったGatebookをscaffoldのコードに近づけてみる。
工程としては初級>>中級>>初級のように理解を深めていく必要あり。


変更内容 
Ruby_searchにRSSの機能を実装。 
目的 Rubyの楽しくなれる情報が欲しい、なので、技術を使って簡単に欲しい情報が得られる状態にする。 
Google translator kitとかのURLを貼っておけば英語でも行ける感あり。

使用ライブラリ gem 
・'rss'とかのライブラリをrequireする(外部にあるライブラリを一回だけ読み込む) 
・gem 'feedzirra'を使う。

参考URL 
http://rakkyoo.net/?p=986 
http://xoyip.hatenablog.com/entry/2014/01/20/201703
Rubyでコンソール上で進捗を表示する（ときはputsじゃなくてprintって話）

http://ablogaboutcode.com/2012/04/16/overwriting-console-output-in-ruby/

地味に30秒くらいハマったので、メモ。

最初putsでやっていて、当然自動で改行されるのでキャリッジリターンする意味がなかった。

```rb
(1..10).each {|percent| print "\r#{percent*10}% complete";sleep(0.5)}
```

![gif](http://i.gyazo.com/175ef50f745e29e9bb4c2c56c38bcd62.gif)

こういうのよく見るので、カジュアルにできると便利。
dos prompt + Sublime text > 複数ファイルの名前変更

複数のファイルの名前を同じ規則で変更したい。

```txt:動作確認
Sublime Textが入った環境
```

例として
- file3141DDD.csv
を
- file2718DDD.csv
のようにファイル名の「3141」を「2718」に変換する。

<hr>

まずはDOSプロンプトで以下を実行する。

```
del tmp.txt
for /R %x in (*3141*) do echo %x %x >> tmp.txt
```

tmp.txtをSublime Textで開く。

```txt:tmp.txt(編集前)
D:\WORK\001\002\003\file3141DDDD.csv D:\WORK\001\002\003\file3141DDDD.csv 
D:\WORK\001\002\003\file3141EE.csv D:\WORK\001\002\003\file3141EE.csv 
...
```

1. 置換ですべての3141を2718に変換する
2. フォルダ部分(D:\WORK\001\002\003)をマルチ選択してすべて消す

この時点で以下となる。

```txt:tmp.txt(編集後1)
file2718DDDD.csv file2718DDDD.csv 
file2718EE.csv file2718EE.csv 
...
```

3. WinならShift+右ドラッグで左側の3141を矩形選択したうえで2718(元の数値)に書き戻す。
4. 同じく矩形選択した上で、左側に ren を付け足す

```txt:tmp.txt(編集後1)
ren file2718DDDD.csv file3141DDDD.csv 
ren file2718EE.csv file3141EE.csv 
...
```

ファイルをtmp.batとしてDOSプロンプトで実行すればファイル名変更が終了する。
「正規表現：悪い表現、いい表現、最良の表現」のRubyベンチマーク

POSTDに「正規表現：悪い表現、いい表現、最良の表現」という記事が上がっていたので、興味本位でRubyでベンチマークとってみた。

http://postd.cc/regexes-the-bad-the-better-and-the-best/

# スペック

      Model Name: Mac mini
      Model Identifier: Macmini5,1
      Processor Name: Intel Core i5
      Processor Speed: 2.3 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 3 MB
      Memory: 8 GB

```
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin13]
```

# コード

```rb:regexp.rb
#!/usr/bin/env ruby

require 'benchmark'

t = '2014-08-26 app[web.1]: 50.0.134.125 - - [26/Aug/2014 00:27:41] "GET / HTTP/1.1" 200 14 0.0005'

rp1 = Regexp.new('.* (.*)\[(.*)\]:.*') # 悪い正規表現
rp2 = Regexp.new('[12]\d{3}-[01]\d-[0-3]\d (.*)\[(.*)\]:.*') # いい正規表現
rp3 = Regexp.new('[12]\d{3}-[01]\d-[0-3]\d ([^ \[]*?)\[([^\]]*?)\]:.*') # 最良の正規表現

n = 1000000
Benchmark.bm 6 do |x|
  x.report('bad:') { n.times do rp1 =~ t end }
  x.report('better:') { n.times do rp2 =~ t end }
  x.report('best:') { n.times do rp3 =~ t end }
end

```

# 結果

```
             user     system      total        real
bad:    14.310000   0.020000  14.330000 ( 14.342206)
better:  4.590000   0.000000   4.590000 (  4.597231)
best:    1.890000   0.000000   1.890000 (  1.894905)
```

と、案の定最良の正規表現が一番速いという結果になった

# 結論

最良の正規表現を書こう
SH-06Eでrootを取らずにUSBテザリング

SH-06Eは一般的にはテザリング不可と言われているが、USBテザリングは可能なのでここに書いておく。手順自体は簡単で、asb shellで繋いで下のように設定すればいい。ただし、二行目は不要な可能性もあるので試してみてもいいだろう。念を押しときたい人は再起動してもいい。

```
settings put global tether_dun_apn IIJmio,iijmio.jp,,,mio@iij,iij,,,,,440,10,3,*
settings put global tether_dun_required 1
```

iijmioとかなっているところは使っているAPNの設定を参照して適宜書き換えてくれ。そのままの順番なので見ればわかるはずだ。

で、実際に使うときはUSBをつないでからUSBテザリングを設定すると...つながるはず。というか私はこれをまさにそのUSBテザリング回線で書いている。
elastica/cookbook-elasticsearchを使ってElasticsearch1.7.1のインストール

[elastic/cookbook-elasticsearch](https://github.com/elastic/cookbook-elasticsearch/blob/master/libraries/resource_configure.rb)

```rb
elasticsearch_install 'my_es_installation' do
  type              :package # type of install
  version           "1.7.1"
  package_url       "https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.deb"
  package_checksum  "5832808f2a4c77de5af225db11da00138d9ea07a17f7b9212f4d2aac5317169d"
  action            :install # could be :remove as well
end
```

`sha1`じゃなくて、`sha256`でchecksum作りましょうという話。

macの場合は

```shell-session
$ shasum -a 256 ~/Downloads/elasticsearch-1.7.1.deb
```
的な感じで生成しましょうという話。
Mac OS X でShpinx（Python製ドキュメンテーションビルダー）

Macで仕様書をまとめたかったのでShpinxを入れてみました。

## セットアップ

簡単にいきましょう
Pythonのeasy-installというライブラリを利用します。

```cl
$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
$ python ez_setup.py
```

`easy_install`でsphinxをインストールします。

```cl
$ easy_install sphinx
```

以上、簡単ですね。。。


こちらも合わせてどうぞ！
[Sphinx ドキュメントをGulpでwatchして自動更新するよ〜 - Qiita](http://qiita.com/madaran0805/items/0788391e144aef3acbe0)
[Android] shibuya.apk #2 資料まとめ


> **2015/08/03追記：**
> 資料はこちらにアップロードされているようなので、この投稿はもう無意味です..
> http://shibuya-apk.connpass.com/event/16640/presentation/

## 概要

> 日時：2015/7/30
> イベント概要：http://shibuya-apk.connpass.com/event/16640/

## 15分 発表枠

- [Android Wear & Android M 最新トピック](http://www.slideshare.net/kanbara/android-wear-android-m?ref=http://www.iplatform.org/blog/archives/2523) [@korodroid](https://twitter.com/korodroid)
- [Rxjavaとoptionalで関数型Androidしよう](http://www.slideshare.net/fumihikoshiroyama/rxjavaoptionalandroid) [@fushiroyama](https://twitter.com/fushiroyama)
- [Make it compatible](https://speakerdeck.com/keithyokoma/make-it-compatible) [@KeithYokoma](https://twitter.com/KeithYokoma)
- [Camera2](http://www.slideshare.net/hashimotohiroshi1981/camera2-51123098?ref=http://shibuya-apk.connpass.com/event/16640/presentation/) [@hi6484](https://twitter.com/hi6484)

## 5分 LT発表枠

- [3分で作れる夢のサービス](https://docs.google.com/presentation/d/1tCy5Bf8GFqjZqhsJEpAjA_aCEF4TIbDDfXnpmVzIhB0/edit) [@punchdrunker](https://twitter.com/punchdrunker)
- [Screenshots Test spoon + espresso](http://www.slideshare.net/shinobuokano7/screenshots-test-spoon-espresso) [@operandoOS](https://twitter.com/operandoOS)
- [Developing better debug_components](http://www.slideshare.net/tomoakiimai2/developing-better-debugcomponents) [@tomoaki_imai](https://twitter.com/tomoaki_imai)
- ~~[GooglePlay配信停止された時の心得](https://speakerdeck.com/konifar/googleplaypei-xin-ting-zhi-saretashi-falsexin-de)~~ [@konifar](https://twitter.com/konifar)

> [@wasabeef_jp](https://twitter.com/wasabeef_jp)さんのスライドは見つからず。
AnacondaでR (in Ubuntu 14.04)

# 動機

普段は機械学習はPythonばかりだが、ここ最近[みんなのR](http://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AER-%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%A8%E7%B5%B1%E8%A8%88%E8%A7%A3%E6%9E%90%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E6%95%99%E7%A7%91%E6%9B%B8-Jared-P-Lander/dp/4839955212)という本が話題でたまにはRの勉強もしようと思った。
みんなのRの原著である[R for Everyone](http://www.amazon.co.jp/381/dp/B00HFULELW/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)のKindle版を購入し[^1]、次にRの環境構築にとりかかるのであった。

あまりRには詳しくないがUbuntuの場合は`apt-get`で入れられる。以前はこれでやっていたが、その他のライブラリをインストールする際にレポジトリに無いものをRの`package.install`で入れようとするとたいていビルドが走るので嫌になる。そこでPythonでもいつもお世話になっている[Anaconda](https://store.continuum.io/cshop/anaconda/)が最近Rにも対応したのを思い出し[^2]、実際にやってみた。

[^1]: こっちの方が安い
[^2]: http://continuum.io/blog/preliminary-support-R-conda

# Rインストール

```bash
$ conda create -n R python=3
$ conda install -n R -c r r
```

これだけ。実行するときはこのconda環境を有効にするか、直接インストールされた`R`を叩けばいい。

ライブラリも`package.install`で入れる以外にAnacondaの[レポジトリ](https://binstar.org/r)を使用できる。

```bash
$ conda install -n R -c r r-ggplot2
```

# RStudioインストール

公式debファイルをインストールし、起動するもRが見つからないと怒られる。Linux版は`which R`の結果を使用するみたいなのでとりあえずcondaのRのリンクを`/usr/local/bin/R`に張ることで対処できた。
Azure Web AppsのOutbound IP address確認方法

# これは何？
アクセス元IP AddressをWhitelist形式で制限しているAPIやSaaSをWeb Appsから利用したい場合、
アクセス先のWhitelistに登録するIPを確認する方法。

# 確認方法
## Azure Management Portal(新ポータル)から確認する

新ポータル
https://portal.azure.com/

```
Browse > All resources > {IPを確認したいWeb Appsインスタンス名}　>　Settings　>　Properties
の
Outbound IP Addresses

- 日本語表記だとこんな感じ
参照 > すべてのリソース > {IPを確認したいWeb Appsインスタンス名} > 設定 > プロパティ
の
Outbound IP Addresses
```

## Azure CLIから確認する

```
azure resource show {resourceGroup} {name} {resourceType} {apiVersion}
ex. azure resource show Web-JapanWest nntsugu Microsoft.Web/sites 2015-04-01

で表示される
Property outboundIpAddresses
の値
```
パラメータの確認方法は下記参照

```
### resourceGroup

- Azure CLI
azure resource list の結果から探す

- Azure Resource Explorer で探す
https://resources.azure.com/


### name

Web Appsの名前そのまま。
ポータルのWeb Appsメニューに一覧が出ています。


### resourceType

Web Appsはこれ。
　　Microsoft.Web/sites


### apiVersion

Service Management Versioning
https://msdn.microsoft.com/en-us/library/azure/gg592580.aspx

上記から確認できます。
2015/07/31時点での最新版は 2015-04-01
```


# 注意点

メンテナンスにより変更になるケースがあるようです。
事前告知があるはず。

参考
https://social.msdn.microsoft.com/Forums/azure/en-US/fd53afb7-14b8-41ca-bfcb-305bdeea413e/maintenance-notice-upcoming-changes-to-increase-capacity-for-outbound-network-calls?forum=windowsazurewebsitespreview
Norikra上でマスタデータ等とJOINするのに使えるnorikra-udf-lookupを作った

ログをFluentdで集めて、Norikraで集計して、Kibanaで表示、ということをやっていたのですが、ログ上はidしか流れてこないので、Kibanaで表示するときに不便な状況でした。そこで、idを名前に変換する単純なKey-valueのTSVファイルを用意して、Norikra上で変換を行うためのUDF([norikra-udf-lookup](https://github.com/ogibayashi/norikra-udf-lookup))を書きました。

## インストール

Gemfileに以下を書いて`bundle install` するか、

```
gem 'norikra-udf-lookup'
```

手で`gem`コマンドでインストールします。

```
$ gem install norikra-udf-lookup
```

その後Norikraサーバを再起動します。(Norikra 1.3.0以降だとkill -HUPをNorikraプロセスに送ればいけるかも。自分はなぜかできなかったのですが。)

## UDFの使い方

まずNorikraサーバ上に、key-valueペアのTSVファイルを用意します。

```
% cat /tmp/lookuptest.tsv 
1       aaa
2       bbb
3       ccc
```

このTSVファイルを使ってkeyを値に変換するために、3つの文字列型引数を取る、lookup_tsvというUDFが用意されています。引数はTSVファイルのパス、入力フィールド、TSV内に値が見つからなかった時のデフォルト値、です。

こんな感じのクエリを登録して使います。

```
SELECT
  id, lookup_tsv('/tmp/lookuptest.tsv',id,'not found') as name, count(*) as cnt
FROM
  test_stream.win:time_batch(1 min)
GROUP by id
```

この状態で、イベントを流してみます。

```
% echo '{"id":"1"}' | norikra-client event send test_stream
% echo '{"id":"2"}' | norikra-client event send test_stream
% echo '{"id":"3"}' | norikra-client event send test_stream
% echo '{"id":"4"}' | norikra-client event send test_stream
```

すると、`lookup_tsv`関数に渡された`id`フィールドが変換されて出てきます。TSVに見つからなかった値は、第三引数に指定した文字列(ここでは"not found")に変換されます。

```
% norikra-client event sweep
{"time":"2015/07/28 12:13:24","query":"lookuptest","id":"3","cnt":1,"name":"ccc"}
{"time":"2015/07/28 12:13:24","query":"lookuptest","id":"2","cnt":1,"name":"bbb"}
{"time":"2015/07/28 12:13:24","query":"lookuptest","id":"1","cnt":1,"name":"aaa"}
{"time":"2015/07/28 12:13:24","query":"lookuptest","id":"4","cnt":1,"name":"not found"}
```

lookup_tsvの引数を`lookup_tsv("/path/to/tsv",id,id)`みたいにすれば、見つからなかった値はそのまま出力、になります。

TSVファイルの更新については、ファイルのタイムスタンプを1分ごとに見ていて、更新があったら再読み込みするようになっています。

## 最後に

と、言うことで初めてNorikraのUDFを書いてみました。NorikraのUDFは[norikra-udf-mock](https://github.com/norikra/norikra-udf-mock)を参考にして簡単に書くことができました。簡単な割に以外にサードパーティのUDFが無いのは、大体Norikra(Esper)の標準機能でなんとかなってしまうからなのかな。

あと、今回みたいにidを名前に変換して表示したい、という要件の場合画面側で変換できるなら、そっちの方が良い場合があるかも知れません。Kibanaの場合、多分今はできなくて、https://github.com/elastic/kibana/issues/4361 が実現するとできるようになるかな、と期待しています。
bufio.Scannerのend-of-line判断を変更してみる


テキストファイルから１行ずつ取得して処理したい場合、
bufio.Scanner を使いますね。

bufio.Scanner には、Splitというメソッドがあり、
行末の判断基準を変更することができるようです。

デフォルトでは、LF(\n)または、CRLF(\r\n)を見つけると行末(end-of-line)だと判断して、
１行分のデータを返してくれます。
（CRLFが除かれたデータを取得できます）

http://golang.org/pkg/bufio/#ScanLines

改行が CR(\r) だけの場合には、正しく動作してくれません。

ということで、Scannerがデフォルトで使用している ScanLines を元にして、
チョイ足しで、改行が CR(\r)だけの場合に対応してみました。

まずは、[type SplitFunc](http://golang.org/pkg/bufio/#SplitFunc) を実装する必要があります。
[bufio の ScanLines](http://golang.org/src/bufio/scan.go?s=9746:9824#L280) を基にして、
３ステップ追加しただけですが、、、


```go
func CustomScan(data []byte, atEOF bool) (advance int, token []byte, err error) {
	if atEOF && len(data) == 0 {
		return 0, nil, nil
	}
  	var i int
  	if i = bytes.IndexByte(data, '\n'); i >= 0 {
		// We have a full newline-terminated line.
		return i + 1, dropCR(data[0:i]), nil
	}
  	if i = bytes.IndexByte(data, '\r'); i >= 0 {
		// ここを追加した。（CR があったら、そこまでのデータを返そう）
		return i + 1, data[0:i], nil
	}
	// If we're at EOF, we have a final, non-terminated line. Return it.
	if atEOF {
		return len(data), dropCR(data), nil
	}
	// Request more data.
	return 0, nil, nil
}

// dropCR drops a terminal \r from the data.
func dropCR(data []byte) []byte {
	if len(data) > 0 && data[len(data)-1] == '\r' {
		return data[0 : len(data)-1]
	}
	return data
}
```

このようなコードを自分のプログラムに追加して、
Splitメソッドに渡します。

```go
func main() {
  var fp *os.File
  fp, _ = os.Open("./test.tsv")
  defer fp.Close()
  scanner := bufio.NewScanner(fp)
  scanner.Split(CustomScan)
  for scanner.Scan() {
  	// １行ずつ処理する
  	....
  }
}
```



それがどうした？って感じですが、
Atomエディタを使って、テキストファイルを作成したときに
改行が CR(\r) になってしまう現象に悩まされています。
Excel上のデータをコピーして、Atomにペースト（タブ区切り(TSV)の状態）すると発生します。
（解決策をご存知の方、教えてください。。。）

Atomエディタ側での解決策が見つからなかったので、bufioで何とかならんかとやってみた次第です。

もしかしたら、ReadString('\r') で対応してしまえばいいのかもしれませんが、
やっぱりCR,CRLFにも対応しておきたいし。

たいしたことはしていないですが、うまく動いたので良しです。
Scalaでクラスパス上のファイルを読み込む

たとえばアーティファクトに同梱されているファイルを読み込ませたい、という場合、かつ、ライブラリ増やすのもちょっとなあという場合、以下のように書く。

```scala
import scala.io.Source
Source.fromInputStream(getClass.getResourceAsStream("/__VERSION__"))
```

ファイルパスのあたまに **/** が必要。これがわからなくて悶絶してたけど、[Read property file under classpath using scala - Stack Overflow](http://stackoverflow.com/questions/15110315/read-property-file-under-classpath-using-scala#comment21289756_15110315)に答えが書いてあった。

[typesafehub/config · GitHub](https://github.com/typesafehub/config)使っていいなら、`classpath()`を使えばそれでよさそう。

これ、別にScalaに限った話でもないか。[クラスパス上のプロパティファイルの読み込み | ごった煮 - tips about programming and building a server](http://park1.wakwak.com/~ima/java_tips0008.html)
php5.1でjsonを利用、ネットワークで送信

## jsonを利用する準備

* pearの[Services_JSON-1.0.3.tgz](http://download.pear.php.net/package/Services_JSON-1.0.3.tgz)をダウンロードし解凍、 JSON.php を拝借。

* [shooblog : [PHP]PHP5.1でjson_encode()関数が使えない場合の対処](http://blog.livedoor.jp/shoooo1/archives/6064462.html)の記事にある通り以下準備。

```php:json_shoooo1.php
if (!function_exists('json_encode')) {
    require_once 'JSON.php';
    function json_encode($value) {
        $s = new Services_JSON();
        return $s->encodeUnsafe($value);
    }

    function json_decode($json, $assoc = false) {
        $s = new Services_JSON($assoc ? SERVICES_JSON_LOOSE_TYPE : 0);
        return $s->decode($json);
    }
}
```

これでjson_encode, json_decodeを利用できる。

## ネットワーク経由でjson送信

* @ngyukiさんの[PHP - 超やっつけでネットワーク経由で var_dump 的なことをする - Qiita](http://qiita.com/ngyuki/items/9bf1cb6d57022d01d4ac)

```php:trace.php
<?php
function trace($data, $server='localhost', $port='12345') {
    static $sock;
    if (isset($sock) === false) {
        $sock = fsockopen($server, $port);
    }
    if ($sock) {
        fwrite($sock, json_encode($data, JSON_UNESCAPED_UNICODE) . "\n");
    }
}
require_once("json_shoooo1.php"); //上で準備したjson使えるようにする君

trace(123);
trace(array('key' => 123));
trace("日本語");
```

```bash:待ち受け
$ nc -lk 12345
123
{"key":123}
"\u65e5\u672c\u8a9e"
```

* [PHP5.1で新規開発するよ！ - Qiita](http://qiita.com/rana_kualu/items/c16fb18948ce6f0a66af)
firefox便利addons

* [ublock](https://addons.mozilla.org/ja/firefox/addon/ublock/)
* [selenium-ide-2.9.0.xpi](http://release.seleniumhq.org/selenium-ide/2.9.0/selenium-ide-2.9.0.xpi)
* [stylish](https://addons.mozilla.org/ja/firefox/addon/stylish/)
* [WOT - インターネットの安全な閲覧](https://addons.mozilla.org/ja/firefox/addon/wot-safe-browsing-tool/?src=hp-dl-featured)
* [FireFTP](https://addons.mozilla.org/ja/firefox/addon/fireftp/?src=search)


## 選定中

* [FireBug](https://addons.mozilla.org/ja/firefox/addon/firebug/)
  * [FirePHP](https://addons.mozilla.org/ja/firefox/addon/firephp/)
* [FireSSH](https://addons.mozilla.org/ja/firefox/addon/firessh/developers)
* [Google Translator for Firefox](https://addons.mozilla.org/ja/firefox/addon/google-translator-for-firefox/?src=search)

## Firefox OS用

* [LINE | Firefox Marketplace](https://marketplace.firefox.com/app/line/)
coding > Opaqueポインタ


引用: C++のためのAPIデザイン by マーティン・レディ

> APIの前方互換性を保つための手法を以下に示す。
...
後で別の組込み型に切り替える可能性がある場合、組込み型を直接使う代わりにオペークポインタまたはtypedefを使うとよい。

<hr>
オペークポインタというのは初めて知った。

http://d.hatena.ne.jp/white_wheels/20110817/p3
> インターフェース上で未定義のデータ型をopaque data type(不透明型)と呼び、そのような型を指すポインタをOpaqueポインタと呼びます。例えばヘッダで定義されている以下のようなポインタのことを指します。

```
#ifndef IF_H
#define IF_H
typedef struct tag_mydata* mydata_t;
#endif
```

使用例についてはリンク先に詳しい。

<hr>
English > is changed to / has changed to

[エンジニアのための英語](http://www.englishforengineers.jp/post/125302037745/%E3%81%8A%E9%A1%8C%E4%BC%9A%E5%A0%B4%E3%81%8C%E5%A4%89%E6%9B%B4%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F)

- The venue is changed to ...
- The venue has changed to...

is changed to の場合、by the organizersなどの行為の主体者の記載が必要とのこと。

> - 文中に変化の原因についても言及するなら be + changed
> - 変わったということだけを伝えるならhave + changed 

そうかもしれないと思う一方、ふと思ったのは、受動態の時のby ...をなくせる場合もある。

例として
When I am given a chance, I would like to do ...
(機会が与えられたなら、xxxをしたい)
という言い方がある。

この時は、chanceをくれる主体者(by xxx)の記載はない。

[is + 受動態]の形にするのは二通りあるかもしれない
1. 行為の主体者を明確にしたい (The venue is changed by the organizer).
2. 行為の主体者が不明確である (When I am given a chance, ...)

「会場が変更されました」の場合は、「誰によって」という記載が重要ではないので"The venue has changed..."でいいのだと思う。
> 変わったということだけを伝えるならhave + changed
情報理論まとめ

## まとめ

- １つ確率変数(Random Variable)の事象(Event)に対して定義
    - 情報量(Information)

- １つの確率変数に対して定義
    - エントロピー(Entropy)

- 1つの確率変数の2つの分布(Distribution)に対して定義
    - クロスエントロピー(Cross Entropy)
    - 相対エントロピー(Relative Entropy)
    - Jensen Shannon Divergence
 
- 2つの確率変数のそれぞれの事象に対して定義
    - Pointwise Mutual Information

- 2つの確率変数に対して定義
    - 相互情報量(Mutual Information)
    - 条件つきエントロピー(Conditional Entropy)

## 離散確率変数の場合
* 情報量
    * 確率変数を$X$、事象$x\in X$の分布を$p(x)$とする
    * イベントが観測された時に得られる「びっくり量」
    * 確率が低いほど情報量は大きい

``` math
I(x)= -\log_2 p(x)
```
* エントロピー
    - どのくらいの不確定性を含むか？
    - 情報量の期待値
    - 「平均びっくり量」

```math
\begin{aligned}
H(X) &=-\sum_{x} p(x) \log_2 p(x) \\
&=\sum_{x} p(x) I(x)
\end{aligned}
```

* クロス（交差）エントロピー（Cross entropy)
    * $p(x)$, $q(x)$をそれぞれ$x\in X$の分布とする

``` math
H(p,q)=-\sum_{x} p(x) \log_2 q(x)
```

* 相対エントロピー（Relative entropy)
    * Kullback-Leibler Divergence
    * 情報利得(Information Gain)

``` math
\begin{aligned}
KL(p(x)||q(x)) &=\sum_{x} p(x) \log_2 \frac{p(x)}{q(x)} \\
&=-\sum_{x} p(x) \log_2 q(x) + \sum_{x} p(x) \log_2 p(x)  \\
&=H(p,q)-H(p)
\end{aligned}
```

* Jensen Shannon Divergence
    * KL Divergenceの対称バージョン
    * $m(x)=\frac{1}{2}\left( p(x)+q(x) \right)$として

``` math
JS(p(x)||q(x)) = \frac{1}{2} \left( KL(p||m) + KL(q||m)  \right)
```

* Pointwise Mutual Information
    * 確率変数を$X$, $Y$、その事象を$x$, $y$、周辺分布を$p(x)$, $p(y)$、結合分布を$p(x,y)$とする。

``` math
\begin{aligned}
PMI(x;y) &= \log_2 \frac{p(x,y)}{p(x)p(y)} \\
&= I(x) + I(y) - I(x,y)
\end{aligned}
```

* 条件付きエントロピー（Conditional Entropy）

``` math
\begin{aligned}
H(Y|X) &=\sum_{x} p(x) H(Y|X=x) \\
&= \sum_{x,y}p(x)\left(-\frac{p(x,y)}{p(x)} \log_2 \frac{p(x,y)}{p(x)} \right) \\
&= -\sum_{x,y}\left( p(x,y) \log_2 \frac{p(x,y)}{p(x)} \right)
\end{aligned}
```

* 相互情報量(Mutual Information)
    * 二つの確率変数がどのくらい情報を共有しているか。
    * 一つの確率変数を観測した時のもう片方の確率変数のエントロピーの減少量
    * PMIの期待値

``` math
\begin{aligned}
I(X;Y) &= KL(p(x,y)||p(x)q(y)) \\
&= \sum_x \sum_y p(x,y)\log_2 \frac{p(x,y)}{p(x)p(y)} \\
&= H(X) - H(X|Y) = H(Y) - H(Y|X)
\end{aligned}
```
compiler > LTCG / リンク時のコード生成 > コンパイル時でなく、リンク時に関数をインライン展開する機能

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

> Visual Studioには「リンク時のコード生成(LTCG)」という最適化の機能があります。これはコンパイル時ではなく、リンク時に関数をインライン展開する機能です。プログラム全体の関数が最適化の対象になりますので、別のファイルにある関数でもインライン化されます。

<hr>
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0474bj/CHDHIEGF.html

> リンク時コード生成（LTCG）を使用すると、リンク段階までコード生成を遅らせることで、クロスソースファイル最適化を実行できます。これにより、コードサイズを大幅に縮小できます。

<hr>
c++11 > データ変換 > 列挙型をstring型へ

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

C++11のunordered_mapクラスを利用した例

```cpp
enum class Week {
  Sunday,
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday
};

const std::unordered_map<Week,std::string> WeekToName = {
  {Week::Sunday, "Sun"},
  {Week::Monday, "Mon"},
  {Week::Tuesday, "Tue"},
  {Week::Wednesday, "Wed"},
  {Week::Thursday, "Thu"},
  {Week::Friday, "Fri"},
  {Week::Saturday, "Sat"}
};

std::string to_string(Week week) {
  assert(WeekToName.find(week) != WeekToName.end());
  return WeekToName.at(week);
}
```
関数を2種類に分類する > 実作業 / 関数呼び出し関数

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

```c:悪い例
void update(const GameTime& deltaTime){
  // 移動
  for (iter i = actors.begin(); i != actors.end(); ++i) {
    (*i)->move(deltaTime);
  }
  // 衝突判定
  collide();
}
```

移動という実作業と、collide()という関数呼び出しの作業が混ざっている。

```c:良い例
void update(const GameTime& deltaTime)
{
  move(deltaTime);
  collide();
}
```

update()では関数を呼び出すだけにしておく。


> 衝突判定が関数化されているのであれば、移動処理も関数化しないと不自然な印象を持ちます。これは、関数内のコードの抽象度が異なっているのが原因です。
...
> 関数内に何かの実作業が複数あると、コードは複雑になるだけでなく、関数の単体テストも難しくなります。