OmniAICreator/Qiita-1.07M huggingface dataset:
socketライブラリを使ってwebサーバーを作ってみる

[カヤックさんの新卒研修](http://tech.kayac.com/archive/2013training.html)を読んで `telnet` と `nc -l` を使ってwebサーバ/ブラウザごっこをやってみたのですが、1人でやってると役割の切り替えがダルくなってきたので、[本当の基礎からのwebアプリケーション入門](http://kmaebashi.com/programmer/webserver/index.html)を見ながらrubyで簡単なwebサーバを作ってみました。

参考
http://www.geekpage.jp/programming/ruby-network/
http://drascal.blog133.fc2.com/blog-entry-219.html

- v1 TCPクライアントからの接続を受け付けられるようにする

```tcp_server.rb
require "socket"

server = TCPServer.open(8001)

while true
  socket = server.accept

  while buffer = socket.gets
    p buffer
  end

  socket.close
end

server.close
```

<a href="http://gyazo.com/f5e3f47cf56ef771ef2cf08719fef8a3"><img src="http://embed.gyazo.com/f5e3f47cf56ef771ef2cf08719fef8a3.gif" /></a>

- v2 レスポンスを返すようにする、アクセス元の情報（peeraddr）を取得する

```tcp_server.rb
require "socket"

port = 8001
server = TCPServer.open(port)

while true
  socket = server.accept

  # IPSockt#peeraddr
  # 接続相手先ソケットの情報を表す配列を返す
  # [アドレスファミリ, port番号, ホストを表す文字列, IPアドレス]
  # アドレスファミリについて
  # http://www.geekpage.jp/programming/winsock/addressfamily.php
  p socket.peeraddr

  while buffer = socket.gets
    p buffer

    # response
    socket.puts "200"
  end

  socket.close
end

server.close
```

<a href="http://gyazo.com/d70cee66dfa325450a7fb4d141cfe1cc"><img src="http://embed.gyazo.com/d70cee66dfa325450a7fb4d141cfe1cc.gif" /></a>

- v3 マルチスレッド化して複数のクライアントからのレスポンスを返せるようにする

```tcp_server.rb
require "socket"

port = 8001
server = TCPServer.open(port)

while true
  Thread.start(server.accept) do |socket|
    p socket.peeraddr

    while buffer = socket.gets
      p buffer
      socket.puts "200"
    end

    socket.close
  end
end

server.close
```

<a href="http://gyazo.com/29b16f0d5b6f42d70c682353619376d4"><img src="http://embed.gyazo.com/29b16f0d5b6f42d70c682353619376d4.gif" /></a>

- v4 index.htmlを返す

```tcp_server.rb
require "socket"

port = 8001
server = TCPServer.open(port)

def read_html
  File.open("index.html") do |f|
    f.read
  end
end

while true
  Thread.start(server.accept) do |socket|
    p socket.peeraddr

    request = socket.gets
    p request

    if request.include? "GET"
      content = read_html
      socket.write <<-EOF
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: rserver
Connection: close

#{content}
      EOF
    end

    socket.close
  end
end

server.close
```

```index.html
<html>
  <head>
    <title>server</title>
  </head>
  <body>
    <h1>うごいてるよ！</h1>
  </body>
</html>
```

<a href="http://gyazo.com/bb6574096177664482b09f33af803fc5"><img src="http://embed.gyazo.com/bb6574096177664482b09f33af803fc5.gif" /></a>

- ブラウザから

![v5.png](https://qiita-image-store.s3.amazonaws.com/0/15187/e3d73723-485e-3509-537f-a9783bc873e2.png)
Androidの中の人になってみた？

この記事は、[Android Advent Calendar 2013 ](http://qiita.com/advent-calendar/2013/android "Android Advent Calendar 2013")の12月16日分の記事です。
  

前日は、[hotchemi](http://hotchemi.hateblo.jp/about "hotchemi") さんの[「バナーナイフの用法とその効能」](http://hotchemi.hateblo.jp/entry/2013/12/15/202857 "「バナーナイフの用法とその効能」")でした｡

- - -
さて、本アドベント・カレンダーも後半となりました。
15日間技術的なお話が続きましたが、本日は少し趣向を変えコードが出てこない記事をおおくりいたします。

ちなみに私が所属する日本Androidの会は、全国に30を超える支部があり支部長がいるのですが、唯一、Javaの読めない支部長が私です。

#####(｀・ω・´)ｷﾘｯ


#・中の人ってかっこいいよね！

「〇〇の中の人」、「△△の中の人」、人物を表現する時や自己紹介で使われる言い回しですが、ちょっとかっこよくてあこがれますよね！

私も中の人になってみようと考えたのですが、おしゃれなIT企業の求人情報を探してみても、、、


#　＝(￣□￣;)⇒　ｶﾞｰｰﾝ　　年齢制限　　　／(^o^)＼オワタ

いや待てよ、自分でがわを作ればいいじゃないか、
自分でAndroidを作って中に入ってしまえば、中の人になれるじゃないか・・・



#・another sky

発想の転換による勘違いは、こうしてはじまりました。


言わずと知れたAndroid（ドロイド君）ってこんな感じ

![Android](http://hd.wallpaperswide.com/thumbs/android_logo_2-t2.jpg "Android")
( by http://wallpaperswide.com/

図形的に簡単な構成なので各パーツを採寸してみることにした。
ぐーぐる先生でドロイド君を検索。

######（以下画像と文章の回り込みがうまくレイアウトできなかったのでパワポの画像を埋め込みます）

![A1](http://kolabjp.sakura.ne.jp/images/A1.png "A1")

![A2](http://kolabjp.sakura.ne.jp/images/A2.png "A2")

![A3](http://kolabjp.sakura.ne.jp/images/A3.png "A3")

さて、製作は続きます。

![A4](http://kolabjp.sakura.ne.jp/images/A4.png "A4")

完成してABCで、インテルドロイド君と記念撮影
![A5](http://kolabjp.sakura.ne.jp/images/A5.png "A5")

さてさて、このあと量産計画に移ります。。。
--------------------------------------------------------------------------
Creative Commons Attribution 3.0 by Google.
orgmodeで卒論を書いたときの話

これは「[TeX/LaTeX Advent Caleandar 2013](http://www.adventar.org/calendars/187)」の 16 日目の記事です．
-   15 日目は [_yyu_](http://qiita.com/_yyu_/items/6404656f822ce14db935) さん でした．
-   17 日目は abenori さん です．

本当は別のネタを書こうとしたが間に合わなかった．

# 概要

2年前にEmacsのorgmodeというものを用いて卒論を書いた時の話です．
大したネタではございません(LaTeX成分が少ないですがご容赦ください)

この記事に触発されてやりました．
<http://d.hatena.ne.jp/r_takaishi/20100209/>

長々と見たくないよと言う方はこちらが卒論をかきおわった時の感想です
<https://twitter.com/PowerPC7450/statuses/171863564049580032>

# orgmodeとは

orgmodeは一言で言い表すのが難しいのですが，アウトライナーやら文書管理等
に使えるEmacsのメジャーモードです．文書の作成にも使用でき，orgmodeで書
くことにより様々な形式(LaTeX,HTML,&#x2026;)に出力できます．文法としてはwiki
の文法に近いのでしょうか．

orgmodeのLaTeX出力の設定の仕方については今年のアドベントカレンダーで
kawabataさんが書いてらっしゃいます．
<http://qiita.com/kawabata@github/items/1b56ec8284942ff2646b>

# どのように書くのか

r_takaishiさんのプログをみれば大体対応できる．</sub>
基本的な部分についてはLaTeXに知識は不要となる．

基本的にはこのように構造的に書くことができる．

```
# LaTeXのクラス．これは事前にorg-latex-classes変数等を設定しておく必要があります．
#+LATEX_CLASS: mythesis
#+TITLE: ××××の利用と評価
#+AUTHOR: らてふ 太郎
#+DATE: 平成xx年yy月zz日
# 標準では足りないパッケージのインポート
#+LATEX_HEADER: \usepackage{subfigure}
# ...

#+LATEX:\frontmatter
#+LATEX:\begin{abstract}
...(概要)
#+LATEX:\end{abstract}

#+LATEX:\mainmatter
* はじめに
近年××××の利用が活発化してきており，云々...

* ××××
本章では，××××について説明を行なう．××××は○○○○と△△△△から構成される．

** ○○○○
....

** △△△△
....

```

画像の挿入は，

```
#+CAPTION: 画像のキャプション
#+LABEL: fig:imgs_label
#+ATTR_LATEX: placement=[b] scale=1.0
[[/images/image.eps]]
```

といった風に書くことができる．

ちなみにLaTeXを直書きする場合は，他の形式に出力する際に出力しないために，

```
#+LATEX: \hoge
```

とか，

```
#+BEGIN_LATEX
\def\hoge{}
\def\fuga{}
#+END_LATEX
```

とかやったりします．プリアンブルの場合は，

```
#+LATEX_HEADER: \usepackage{subfigure}
```

などとすることで対処します．

# LaTeXを直に書くことと比較して

## orgmodeを使う利点

-   凝ったものを書かなければ概ねLaTeXに触れること無く書ける
    -   LaTeXをあまり知らない場合は馴染みやすいかもしれない

-   節で内容の畳みこみができる
    -   個人的には割と便利な機能ではあると感じています
    -   LaTeX直書きでも(elispで)実現は出来そう？
    -   ファイル分割すればいいと言われればそれまでですが

## orgmodeを使う欠点

-   別パッケージで実現されたことを使用するとき等は結局LaTeX直書きになる
    -   例えばsubfigureパッケージを使う場合などはorgmode単体で対応することができないので結局LaTeXを直書きすることになる

# 結論

普通のこと(orgmodeの対応している範囲のこと)を書く分には特にLaTeXの意識
をすることなく執筆できる．また再利用がより簡単になるという利点もあります．

しかしながらLaTeXに精通している方々や，細かな制御をしたくなってしまう場
合などはorgmodeを使うことは結構回り道になってしまいそうです．

LaTeXに詳しく無い人の多い研究室ではこれで卒論を書くのはいかがでしょうか．

おっとLaTeXコードが一行も無いぞ....
screen初めの一歩

コマンド文字を入力　→　コマンド実行
という流れで使う。suで違うユーザになっていると上手くいかないらしいので
元のユーザでscreenしてからユーザを切り替える。コマンド文字のデフォルトはC-a

## コマンド例
- c
	新しいウインドウとシェルを生成
	
- "
	ウインドウ一覧と移動
	
- S
	画面の分割
	
- TAB
	分割したウインドの次のウインドウへ移動
	
- X
	現在のウインドウを閉じる
ゲーム制作10日目！

#今日のメニュー
・タイトルロゴ設置
・スタートボタン設置
・リスタートボタン設置
・キャラ画像差し替え
・キャラの向き実装

#タイトルロゴ設置&スタートボタン設置&リスタートボタン設置

タイトルロゴ、スタートボタン、リスタートボタンの設置はこれといった工夫はしていません。
いままでと同様にSpriteを使用して画面に出力しています。
クリックを検知するイベントをシーンではなく、Spriteに付加することで、
Sprite上のクリックを検知させることができます。
この方法を用いてSpriteをボタンのように扱います。

#キャラクターの表示について

キャラクターの表示を一新しました。
鳥のようなまりものような何かです。
最終版ではないと思いたいけど、画力的に向上の余地なし。

##向き
まず、rotation要素を使用して、キャラクターが進行方向を向くようにしました。
この機能は、playerBaseClassで定義しているため、
プレイヤーにもついてくるキャラにも適応されます。
今向いている向きについては、進行方向を計算するときに使用した変数angleが持っています。
回転について参考：[enchant.js - Sprite を回転させてみよう(rotation version)](http://jsdo.it/phi/tls5)

##色

キャラごとにランダムで色が変わるようにしました。
濃い色だと潰れてしまう、かわいくないなどの理由で明るい色にしました。

完成された画像の色を操作することはできないため、
色を替える本体部分のみSurfaceを使って描画することにします。
画像として用意するのは目や口などのパーツ部分だけです。
Surfaceによって描かれた本体の上に、目や口のパーツの画像をはりつけるイメージです。
Surfaceを用いた円の描き方について参考
[enchant.js - Surface に円を描画しよう](http://jsdo.it/phi/vf6b)
[ゲーム開発をENCHANT.JS（HTML5 + JAVASCRIPT）で！　【導入篇】　円を描く](http://materialize.jp/art/html5/1837/)

色をランダムに決定する方法には乱数を使用しました。
RGBそれぞれについて、乱数によって出力した数値に固定値200を加算し、値を決定します。
こうすることで、200を下回らない乱数が生成されます。つまり確実に一定よりも明るい色になります。
ただし、256以上にならないように注意します。
生成した乱数はtoString関数を使用して文字列にし、
文字列同士の加算によって、色の入力形式に合う形をつくります。

色について実現したコードが以下の感じ。

```js
var red=parseInt(Math.random()*56)+200;
var green=parseInt(Math.random()*56)+200;
var blue=parseInt(Math.random()*56)+200;
this.ballSurface.context.fillStyle="#"+red.toString(16)+green.toString(16)+blue.toString(16);
```

文字列操作関数の参考
[JavaScript 文字列操作](http://www.red.oit-net.jp/tatsuya/js/string.htm)

#今日の成果

[今日の成果に飛びます。](https://dl.dropboxusercontent.com/u/35809589/SnakeGame20131216/index.html)
全面青画面がスタート画面です。
画面をクリックすると、ゲームがスタートします。
ゲーム中では左右キーで曲がることができます。
とまることはできません。
(下ボタンで増殖します。)←廃止
緑色の丸がエサです。
エサを食べると内部的に値が蓄積され、
一定値を超えると増殖します。
大きいエサほど値が多く増加します。
増殖したからだは時間経過で見た目に変化が現れます。
変化が最終段階に達すると右下の掲示が1増加します。
しかくいキャラがマウスについてきます。ドラッグしている間に移動した位置に移動します。
自分の体および壁に衝突すると、全面緑色のゲームオーバー画面に飛びます。
ゲームオーバー画面で画面をクリックするとスタート画面に戻ります。

#明日の予定

急務→タイトル決定&タイトルロゴづくり

・リザルト画面の充実
これだけできればぼろぼろだけどなんとかひとつのゲームっぽく見えるようになるかなと思います。
最初の想定した機能は全然足りていませんが。。。
このままだとマウスについてくるオブジェクトがくびになってしまう…

その後の実装予定
とりあえずすぐできそうなもの。
・おなかのたまり具合ゲージ
・背景
・つぶやく機能
・右下のカウント改善
PHPのコード補完をサポートしてくれるプラグイン PHP Advanced AutoComplete


http://plugins.jetbrains.com/plugin/7276

## なにができるの

デフォルトのCode Completion(Ctrl+Space)を拡張してくれます。
特定のメソッド内でCompletionを実行すると、以下のスクリーンショットのような感じの補完をしてくれます。

利用頻度はあまり高くないですが、date()関数の引数は忘れがちなので、説明文付きでの補完は地味に嬉しい機能です。


![screenshot_14258.png](https://qiita-image-store.s3.amazonaws.com/0/20074/128685a0-f5ab-191f-89c8-880d03e01ea7.png "screenshot_14258.png")

![screenshot_14255.png](https://qiita-image-store.s3.amazonaws.com/0/20074/2f7506ae-d672-e2a2-65c6-5a03ff1eccf5.png "screenshot_14255.png")

![screenshot_14259.png](https://qiita-image-store.s3.amazonaws.com/0/20074/e977e210-54c0-fdea-dfe0-5a1aa7137f9f.png "screenshot_14259.png")

![screenshot_14254.png](https://qiita-image-store.s3.amazonaws.com/0/20074/8fe4a683-f42c-4cce-a542-56b72f26041a.png "screenshot_14254.png")
天気情報を取得する


天気情報を取得できるAPIはたくさんありますが、
今回は、<a href="http://openweathermap.org/" title="OpenWeatherMap - actual and forecast weather.">OpenWeatherMap - actual and forecast weather</a>という無料サービスを使って、天気情報をjsonで取得します。

##都市名で取得する

```php
http://api.openweathermap.org/data/2.5/weather?q="都市名","国"

//例
http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp
```

##緯度、経度で取得する
```php
http://api.openweathermap.org/data/2.5/weather?lat="緯度"&lon="経度"

//例
http://api.openweathermap.org/data/2.5/weather?lat=35&lon=140
```

###取得結果
```json
{
    "base": "cmc stations", 
    "clouds": {
        "all": 36
    }, 
    "cod": 200, 
    "coord": {
        "lat": 35.64, 
        "lon": 139.68
    }, 
    "dt": 1387204059, 
    "id": 1864381, 
    "main": {
        "humidity": 18, 
        "pressure": 1019, 
        "temp": 279.63, 
        "temp_max": 282.04, 
        "temp_min": 277.59
    }, 
    "name": "Denenchōfu", 
    "sys": {
        "country": "JP", 
        "message": 0.0086, 
        "sunrise": 1387143858, 
        "sunset": 1387178986
    }, 
    "weather": [
        {
            "description": "scattered clouds", 
            "icon": "03n", 
            "id": 802, 
            "main": "Clouds"
        }
    ], 
    "wind": {
        "deg": 306, 
        "gust": 4.63, 
        "speed": 4.11
    }
}
```


##取得できる値
| パラメータ|説明 | 
|:-----------|:-------------|
| temp     |        気温 |
| temp_min     |      最低気温 |
| temp_max      |        最高気温 |
| icon         |          天気アイコン |
| main      |       天気 |
| lat    |     緯度 |
| lon    |     経度 |
| pressure   |     気圧 |
| sea_level    |     海面 |
| humidity   |     湿度 |
| speed   |    風速 |
| name    |     都市名 |
|   country |     国名 |
|    sunrise |日の出時間|
|sunset| 日没時間|


##天気アイコン取得方法
```php
http://openweathermap.org/img/w/"iconの値".png
```

説明：<a href="http://openweathermap.org/wiki/API/Weather_Condition_Codes" title="API/Weather Condition Codes - OpenWeatherMap">API/Weather Condition Codes - OpenWeatherMap</a>


##その他
・天気の更新は10分単位
・対応は世界7万都市
・利用料無料
Coronaコネタ集

(1)
音楽を聞きながらゲームできるようにしてほしい、と言われて、よくやり方わからず無視してたのですが…
フォーラムに載ってました。
main.luaとかに以下のようにかいておく。

```lua
if audio.supportsSessionProperty == true then
    audio.setSessionProperty(audio.MixMode, audio.AmbientMixMode)
end

--起動時/復帰時に音楽が鳴っていたら止める。
local onSystem = function( event )
    if event.type == "applicationStart" or event.type == "applicationResume" then 
	if audio.supportsSessionProperty == true then   
            if not(audio.getSessionProperty(audio.OtherAudioIsPlaying) == 0) then
                audio.stop()
            end
	end
    end
end
Runtime:addEventListener( "system", onSystem )
```

で、音楽をならす関数などで、以下のように実装する

```lua
       local function playBgm()
            if audio.supportsSessionProperty == true then   
                 if not(audio.getSessionProperty(audio.OtherAudioIsPlaying) == 0) then
                    return false
                 end
	     end
             --ここに、BGMならす処理
        end
```

公式ドキュメントに載ってない気がするんですよね….。

(2)

```lua
system.setAccelerometerInterval(10)		
system.setGyroscopeInterval    (10)
```		

ジャイロとか加速度とか使わないなら、こうしておくと電池の持ちがよくなるらしい。
これは公式にも載ってる。
2行でWindowsにElixirをインストールするたった一つの冴えているようなやり方

Elixir AdventCalendar 16日目ってことになります。

うっかりElixirアドベントカレンダーなんてものに参加してしまったので記事を書いています、あらっきぃです。

Elixirがどういう言語なのかは僕の前後の方々が詳細に解説してくださっていると思うので、今回はシンプルにインストール方法でも解説したいと思います、Windowsでの。
というのも、Windows上でElixirを使う、っていう日本語の記事が調べても一つくらいしかヒットしない([ここ](http://yohshiy.blog.fc2.com/blog-entry-235.html))上に、そこで紹介されてるインストール方法がzipファイルをダウンロードして解凍してPathを通す、というどうもクールな方法ではないのです。
せっかくWindowsで、2行でElixirをインストールできる方法があるのに…。



##前置きはいいからさっさと教えろ！

はい、分かりましたよ、分かりました。
せっかちですね。

これがその2行です。

```bat
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
cinst elixir
```

かなり密度が高いので、ブラウザのサイズによっては5行くらいに見えるかもしれませんが、確かに2行です。

これをWindowsの`cmd.exe`やお気に入りのターミナルエミュレーターに貼りつけて実行してみてください。
2行ですが実行が終わるのにかなり時間がかかります。大体30～40分でしょうか？　実際にインストールしたのが一ヶ月くらい前なのでよく覚えてません。(TODO:一回アンインストールして調べる)

で、コマンドの実行が終わったら(TODO:終了時のスクリーンショットでも貼る)、今度は`iex`とでも打ち込んでみてください。すると、Elixirのインタラクティブシェルが起動するはずです。起動したらこんな風にでも打ってみてください。

```ex
Interactive Elixir (0.10.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> IO.puts "Hello, Elixir World!"
Hello, Elixir World!
:ok
iex(2)>
```

ハロワ完了！

##上のコマンドは何をやってるの？

さっきのコマンドは一体何をしているのでしょうか？
1つずつ(といっても全部2つですが)説明していきます。

まずは一行目。

```bat
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

コマンドの90%以上を占めるこれですが、その実態はChocolateyのインストールコマンドです。
この[公式サイト](http://chocolatey.org)のトップページに表示されているものですね。

###…Chocolateyってナンデスカ？

![chocolateyicon.gif](https://qiita-image-store.s3.amazonaws.com/0/11219/1478d233-1fa7-22f5-fab6-ab165f5a9e79.gif "Chocolatey Logo")

Chocolateyというのは、Windows用のパッケージマネージャーです。パッケージマネージャーというのは、Linuxでいうaptとかrpm、MacでいうHomebrewみたいなものですね。
要するに、パッケージの依存関係を自動的に解決しながらインストールすることができるツールです。
コマンドラインからWindowsのソフトがインストールできるんです。すごい。

コマンドの具体的な意味は……。インストールスクリプトを落としてきて、PowerShellでそれを実行して、Chocolateyをインストールしたフォルダをパスに加えてるって感じでしょう、多分。
あんまし深く考えても意味が無いような気がします。

で、次は2行目です。

```bat
cinst elixir
```

これはシンプルですね。
`cinst`というのは`choco install`のエイリアス(のようなもの)で、`choco`というのはChocolateyのコマンドです。
つまり、Chocolateyを使ってElixirをインストールしているわけです。

ちなみに、これでインストールした場合、そのコマンドプロンプト上ではパスが通った状態になっているのですが、一度ウインドウを消すと無くなってしまうので(確かChocolateyも)、あとでしっかりパスを通しておきましょう。

##雑感

これはElixirの記事ですか？
――いいえ、Chocolateyの記事にもなりそこねた何かです

そんな言葉が妙にしっくりきます。どういうことだ…。

ちなみに、上で散々Chocolateyを勧めてますが、ChocolateyでインストールできるElixirはv0.10.0で、Elixirの最新版はv0.12.0なので、結構古いです。特にElixirは活発なプロジェクトなので、できることなら最新版をおっかけられた方がいいような気もします。
(でさっき、「Chocolateyのパッケージ更新して」ってMLに投げたら、光の速さで「ここではChocolateyのパッケージはサポートしてないんだ。自分で頑張って(意訳)」と言われました。時間があったら自分で更新してみたいと思います)

[追記=20]
久し振りにChocolateyのサイトを覗いてたら、パッケージが定期的に更新されるようになっていました！　WindowsでElixirをインストールするなら、よっぽどのことがない限り、この方法が一番いいのではないかと思います。
[/追記]

本当は、Windows上のErlangは標準でwxが動くからGUIが(比較的)簡単に作れるよー、ってやりたかったはずなのですが時間の都合で無理だったので、こんな微妙なクオリティの記事になってしまいました。すみません。

明日は――さんです！　っていないしっ！

(Advent Calenderってこれでいいのかな？)
ビットボンバーマン(2013.3.1の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの16日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord8biboma/ にあります。

```hs
{-# LANGUAGE Rank2Types #-}
module Doukaku.Bomberman where
import qualified Data.Array.IArray as IArray
import Control.Lens (review, preview)
import Control.Lens.Prism (Prism')
import Data.Array.Unboxed (UArray)
import Numeric.Lens (hex, binary)

type Board = UArray (Int, Int) Bool

solve :: String -> String
solve input = trans binary hex . (++ "00") . map char $ [0..width * height - 1]
  where
    (ws, _:bs) = break (== '/') input
    wall = parse ws
    bomb = parse bs
    char pos = let (y, x) = divMod pos width
               in if isFired wall bomb (x, y) then '1' else '0'

width, height :: Int
(width, height) = (6, 5)

trans :: Prism' String Int -> Prism' String Int -> String -> String
trans from to = tail . maybe "" (review to) . preview from . ('1' :)

parse :: String -> Board
parse input' = IArray.listArray ((0, 0), (height - 1, width - 1)) (map toBool input)
  where
    input = trans hex binary input'
    toBool '0' = False
    toBool _   = True

isFired :: Board -> Board -> (Int, Int) -> Bool
isFired wall bomb (x, y) = or . map (existBomb wall bomb (x, y)) $
                                             [(1, 0), (-1, 0), (0, 1), (0, -1)]

existBomb :: Board -> Board -> (Int, Int) -> (Int, Int) -> Bool
existBomb wall bomb (x, y) (vx, vy)
  | x < 0 || width <= x || y < 0 || height <= y = False
  | bomb IArray.! (y, x) = True
  | wall IArray.! (y, x) = False
  | otherwise = existBomb wall bomb (x + vx, y + vy) (vx, vy)
```

爆弾から爆風を出したくなる問題ですが、逆に各マス目について爆風が来るかを判定するという戦略をとりました。
`isFired`関数で上下左右に爆弾があるかを探すだけです。その際、頻繁に`(x, y)`の要素を参照する必要があったので、
`[[Bool]]`ではなく`UArray (Int, Int) Bool`を使ってみました。


http://qiita.com/items/709d61dff282cff7a890 に他の方の回答もありますので、見ると参考になるでしょう。
DJangoメモ：はじめから（エラー画面設定編）


まずは404とか500とか、エラー番号についての認識がぼんやりしていたので簡単にググりました。
http://human-dust.kdn.gr.jp/doujin/net/errormsg.html
http://www.seohacks.net/blog/crawl_index/http_statuscode/

### 404エラー ###
名前のまんまだが、Http404というモジュールを使う。
チュートリアルでの記述は以下。

```py
from django.http import Http404
# ...
def detail(request, poll_id):
    try:  # ここのコードで・・・
        pobject = Poll.objects.get(pk=poll_id)  # pkって何だ？
    except Poll.DoesNotExist:  # こうなったら・・・・
        raise Http404  # 404エラーとして扱う
    return render_to_response('polls/detail.html', {'poll': pobject})  # 問題なければこっちに到達
```

また、こちらにも短縮形の書き方がある模様。その場合は、

```py
from django.shortcuts import render_to_response, get_object_or_404
# ...
def detail(request, poll_id):
    pobject = get_object_or_404(Poll, pk=poll_id)
    return render_to_response('polls/detail.html', {'poll': pobject})
```

という感じ。こちらはtry文を使わなくていいのか？
なお、前述のものも実はさりげなく前回出てきた[shortcuts](http://qiita.com/juniskw/items/8074835412c71093de19)を使用している。
個人的には仕組みをちゃんと理解するまで省略形を使いたくないので、あえて以下のように直してみた。

```py
from django.http import Http404
#…
def detail(request,poll_id):
	try:
		pobject = Poll.objects.get(pk=poll_id)
	except Poll.DoesNotExist:
		raise Http404
	temp = loader.get_template('polls/detail.html')
	contxt = Context({
		'poll':pobject
	})
	return HttpResponse(temp.render(contxt))
```

ちょっと長いけどやっぱりこちらのほうが流れをつかめる感じがする。

まあそれはいいとして、肝心のエラー画面のほうはわざわざ自分でテンプレートを作らなくてもDJangoが用意してくれたものがあるみたい。自分は今のところ特に自作する必要性を感じないのでスルーする。
もし作りたいのなら404.htmlというファイル名でテンプレートディレクトリに置けばいいらしい。 __ただし、設定の仕方は説明を読んでもよく分からなかった（URLConf内にhandler404という変数を定義？）。__

##### 確認の方法： #####

* setting.pyのDEBUGをFalseに（Trueだとトレースバックが優先される）

* 同じくALLOWED_HOSTSを設定（’.example.com’みたいに自分のドメインを入れるらしいが、何でもいいなら’*’でOK）

なお、500（サーバーエラー）の場合でもやることはさほど変わらない模様。

## 次はURLConfの単純化と分割をやります。 ##
PhpStorm内でtmuxを使う


PhpStorm7から導入されたTerminalですが、VimやEmacsが動くのは既に紹介しました。
今回はtmuxを動かしてみます。

tmuxってなに？という方はこちらが参考になると思います。

Macにtmuxを導入する
http://qiita.com/michiomochi@github/items/4bf8e34a91bbf3d9af20

インストールしてpathが通っていれば特に設定は必要ありません。
PhpStorm上でTerminal窓を立ちあげて以下のコマンドを入力するだけです。

```
$ tmux
```

![Router.php_-_candycane_-____www_candycane__と_NanapiConfig.php_-_nanapi_-____www_nanapi_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/c8acf386-0948-6a58-d86c-bbb51822942f.png "Router.php_-_candycane_-____www_candycane__と_NanapiConfig.php_-_nanapi_-____www_nanapi_.png")

こんな感じでtmuxが立ち上げられます。これでうっかりTerminalタブを消してしまっても安心です。

…ちなみに、Terminal内のキーバインドはPhpStorm上と完全にコンフリクトするので、実用レベルで運用を考えた場合は.tmux.confのカスタマイズが必須になります＼(^o^)／
ジャンプを使い分ける


PhpStormには大きく分けて3種類のGoto Fileのアクションがあります。
それぞれ微妙に役割が異なるので、それぞれの違いを把握しておき、細かく使い分けてやることで目的のファイルへの到達がスムーズになります。

種類は以下の通りです。

- File(Cmd+Ctrl+N)
- Class(Cmd+N)
- Symbol(Cmd+Ctrl+Shift+N)

## File

![app_…_routes.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/f077da3b-5670-3286-7b90-2f996d8fe7e6.png "app_…_routes.php_-_candycane_-____www_candycane_.png")


ファイル名を指定してジャンプ出来る機能です。
上段に完全一致 -> 前方一致のファイルが表示され、
後段で後方一致や部分一致のファイルが表示されます。

また、最後に[/]を付けることでディレクトリ名での検索や、
[hoge/fuga/hoge.php]ようにディレクトリ込での検索も出来ます。

ジャンプする先が以下のような場合にはGoto Fileを使ってやるとスムーズに飛べます。

- 開きたいファイルのファイル名がピンポイントで分かる or 部分的に分かる
- どのディレクトリにそのファイルがいるか分からないが、ディレクトリ名は分かる
- そのファイル内にクラスが存在しない(Viewファイルなど)
- 同一ファイル名のファイルが複数ある(ディレクトリ名込で絞り込み出来る状態)

## Class

![app_…_routes.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/a8aab693-1652-8b9b-9ff3-f777ceab1a1c.png "app_…_routes.php_-_candycane_-____www_candycane_.png")

上述のFileと似ていますが、こちらはクラス名を指定してジャンプする機能です。

上段に完全一致 -> 前方一致のファイルが表示され、
後段で後方一致や部分一致のファイルが表示されます。

クラスが定義されていないファイルには飛べません。

以下のような場合にはこのGoto Classを使ってやるとスムーズに飛べます。

- ピンポイントで飛びたいクラス名が分かる
- 飛びたいクラス名の文字列がカーソル下にある
- ファイル名とクラス名が異なっていて、クラス名が分かる場合(inner classなど)

## Symbol

![app_…_routes.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/37c315c2-ec65-9290-d770-67bdd79bf241.png "app_…_routes.php_-_candycane_-____www_candycane_.png")

こちらは若干毛色が違い、クラス名やメソッド名、定数やインスタンス変数、cssのclassやIDの定義先に飛びます。

使いどころがかなり難しいコマンドですが、以下の様な時に役に立ちます。

- 飛び先のファイル名やクラスは分からないが、なんとなく使っている定義している変数が分かる
- CSSクラス/ID指定での定義元一覧をサッと見たい

などなど…。正直言って僕自身も使いこなせていません＼(^o^)／

## おまけ
PhpStorm7.1からは上記に加えて[Search Everywhere]というジャンプコマンドが追加になります。

![CacheHelper.php_-_kihon_-____www_kihon_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/72350b5c-4ce7-14fa-8620-52a49f619d65.png "CacheHelper.php_-_kihon_-____www_kihon_.png")


これは上記3種類のJumpに加えてFind Action(Cmd+Shift+A)、Recent Files(Cmd+E)も加えたパワフルな機能です。

Find Actionを超える「とりあえずこれさえ覚えておけば大丈夫」というコマンドです。心強い限りです。
jadeifyをインストールしようとして苦戦したメモ（未解決）


* https://github.com/substack/node-jadeify

```bash
npm install jadeify
```

```
> jadeify@0.3.2 install /…/node_modules/jadeify
> node scripts/generate.js

path.existsSync is now called `fs.existsSync`.

/…/node_modules/jadeify/node_modules/browserify/lib/wrap.js:314
            throw new Error('Cannot find module ' + JSON.stringify(mfile)
                  ^
Error: Cannot find module "less" from directory "/…/node_modules/jadeify/node_modules/jade/lib"

…
npm ERR! weird error 8
npm ERR! not ok code 0
```

ローカルにLessを入れないといけないらしい。（`-g`だと駄目だった。）

```bash
npm install less
```

改めて。

```bash
npm install jadeify
```

```
> jadeify@0.3.2 install /…/node_modules/jadeify
> node scripts/generate.js

path.existsSync is now called `fs.existsSync`.
Expressions in require() statements:
    require("./tree/"+n)
Expressions in require() statements:
    require(module)

/…/node_modules/jadeify/node_modules/browserify/lib/wrap.js:301
            throw new Error('No wrapper for core module ' + mfile);
                  ^
Error: No wrapper for core module querystring
…
npm ERR! weird error 8
npm ERR! not ok code 0
```

`querystring`なるものが必要らしい。

```bash
npm install querystring
```

改めて。

```bash
npm install jadeify
```

```
> jadeify@0.3.2 install /…/node_modules/jadeify
> node scripts/generate.js

path.existsSync is now called `fs.existsSync`.
Expressions in require() statements:
    require("./tree/"+n)
Expressions in require() statements:
    require(module)

/…/node_modules/jadeify/node_modules/browserify/lib/wrap.js:301
            throw new Error('No wrapper for core module ' + mfile);
                  ^
Error: No wrapper for core module querystring
…
npm ERR! weird error 8
npm ERR! not ok code 0
```

変わってない……。

`-g`を付けても駄目だった。何だろうか。

`npm install --force`で入れてソースコードを見てみる。

```js:node_modules/jadeify/node_modules/browserify/lib/wrap.js
    var pkg = {};
    if (resolve.isCore(mfile)) {
        var file = path.resolve(__dirname, '../builtins/' + mfile + '.js');
        opts.target = opts.target || mfile;
        
        if (!path.existsSync(file)) {
            throw new Error('No wrapper for core module ' + mfile);
        }
    }
    else if (self.has(mfile, '/node_modules/' + mfile + '/index.js')
```

`builtins`の中身を確認。

```bash
ls node_modules/jadeify/node_modules/browserify/builtins/
```

```
assert.js  fs.js    https.js  path.js    tls.js  util.js
events.js  http.js  net.js    stream.js  url.js  vm.js
```

たしかに`querystring.js`はないなあ。

ここからどうしたら良いのかわからなかった。
ペアプロ/プレゼンに便利なプラグイン Presentation Assistant


http://plugins.jetbrains.com/plugin/7345

## なにができるの

PhpStorm上で実行したショートカットのデフォルトのショートカットが画面下に表示されます。
元々はプレゼンテーション用のプラグインですが、ペアプロの時に自分がどうやっているのか/他の人がどういう動きをしているのかを共有出来るので地味ですが面白いプラグインです。

![app_…_routes.php_-_candycane_-____www_candycane_-2.png](https://qiita-image-store.s3.amazonaws.com/222/20074/9fd8d78b-7f00-00fa-0238-a5e824e211e9.png "app_…_routes.php_-_candycane_-____www_candycane_-2.png")
Rubyのaws-sdkでuser-dataを取得する方法


> aws-sdk 1.30.0

```rb
#!/usr/bin/env ruby

require 'aws-sdk'

ec2 = AWS::EC2.new(
  :access_key_id     => AWS_KEY_ID,
  :secret_access_key => AWS_ACCESS_KEY,
  :region            => REGION,
  :ec2_endpoint      => ENDPOINT,
)

ec2.client.describe_instances.reservation_set.each do |instance|
  # get instance instance_id
  instance_id = instance[:instances_set][0][:instance_id]

  # get instance user_data
  ud = ec2.client.describe_instance_attribute({:instance_id => id, :attribute => 'userData'})
  p Base64.decode64(ud[:user_data][:value])
end
```

取り敢えずメモ。base64でエンコードされてるの忘れると渋いことになりそう。
処理中の関数に成り代わるSub関数

Perlで再帰処理のあるSub関数の名前を変えるときに、再帰部分も変更する手間を省きたい

# 再帰関数の中でその関数に成り代わるSub関数
```pl
sub current_function {
    my $function_name = (caller 1)[3];
    $function_name =~ s/.*:://;
    return @{[&$function_name(@_)]};
}
```

## 解説
<code> (caller 1)[3] </code>
callerは引数0で実行中の関数、1で呼び出し元の関数の情報を取得する
[3]はパッケージと関数名が "package::function" 形式で入っている

<code> $function_name =~ s/.*:://; </code>
パッケージ部分があれば消す

<code>@{[&$function_name(@_)]}</code>
関数名からの実行は変数配列ハッシュのように <code>&{'関数名'}</code> ではできないが、
上記のように無名配列リファレンスの要素とすると実行できる
国内で商用利用しているiBeaconを探してみる。

12/16にサンケイBizさんから、<a href="http://www.sankeibiz.jp/business/news/131216/prl1312161339049-n1.htm">『日本初！iBeaconで、顧客行動を見える化するO2Oシステムを日本写真印刷が開発開始』</a>っていう記事を発見した。

開発を開始している人なら、いっぱい居るような気がするのだが・・・・。
これは記者の人のセンスだと思い、そういえば、スマポが対応しているって話が９月頃あったようなと思ったので、探してみた。

<a href="http://www.smapo.jp/news/2013/09/24/105806.html">本日よりスマポにiOS7対応iBeacon機能を搭載。ポイントが貯まる店舗に近づくとリマインド</a>

商用で稼働しているiBeaconと出会いたいということで、

Android用の<a href="https://play.google.com/store/apps/details?id=youten.redo.ble.ibeacondetector&hl=ja">iBeacon Detector</a>をインストールしたNexus5を持って、ビックカメラ有楽町店に行ってみた！

スマポが反応するところに置いてあるのだろうと

チェックインのヒントに書かれているように３Fと４Fを彷徨うと、すまぽの垂れ幕があったので、まずは、すまぽのアプリで、チェックインができることを確認して、iBeacon Detectorを動かしてみると！

![IMG_0784.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/27a9a910-dd93-d796-8067-0613eb6db1aa.jpeg)
あれ？iBeaconが見つからない？？？？

ただ、BLEsmart◯◯っていうのは見つかる（もしかして、これか？）
（上位の２件は、身につけているFitbit ZipとNike Fuel Bandだったりします）

って感じです。iBeacon APIじゃ検出できないビーコンで、対応っていうものなのか？

商用ビーコンを探す日々は続きそうだ・・・・
debianの自作AMIでapt本体のupgradeがコケて困った話

このへん、日本語情報が全然見つからなかったので、備忘録を兼ねて公開メモに残す。

## 発生した事象

自作AMIで`apt-get upgrade`を行った際、以下のようなエラーにあたった。

```
Setting up apt (0.9.7.9+deb7u1) ... 
Extracting templates from packages: 100%
ERROR: Can't find the archive-keyring
Is the debian-archive-keyring package installed?
dpkg: error processing apt (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
apt
E: Sub-process /usr/bin/dpkg returned an error code (1) 
```

`debian-archive-keyring`がないよ？という話。

`/etc/apt/trusted.gpg`はちゃんとある。
以前これと同じオチで`*.gpg`ファイルがAMIのvolume作成時に削除される問題にあたっていて、volume作成時に`trusted.gpg`を削除対象から除外していたから。
具体的には`ec2-bundle-vol`に引数`-i`を指定するようにしていた。

```
% ec2-bundle-vol -i /etc/apt/trustdb.gpg,/etc/apt/trusted.gpg ....
```

だが、なぜか`apt`は`trustdb.gpg`があるのにコケる。。。
ひとまずその場は`debian-archive-keyring.deb`を直接ダウンロードしてきて、`dpkg -i`して事なきを得た。

## 問題は何だったか

`/usr/share/keyrings/*.gpg` が、同様にAMIのvolume生成時に消されていた事が原因。

`apt`のソースコードを追ったところ、`apt`自身のupgradeの際に、`apt.postinst`で`apt-key update`が走るようになっており、
その中で `/usr/share/keyrings/debian-archive-keyring.gpg`を参照していた。

平時は`trusted.gpg`しか参照されないので問題なかったが、`apt`自身のupgradeの時には上記の事情があり、エラーで止まってしまった。

## 対策

`/usr/share/keyrings/*.gpg`を、AMI volume 生成時に削除しないようにした。

要するに、`ec2-bundle-vol`の引数`-i`のリストに、`/usr/share/keyrings/*.gpg`も含めるようにした。

```
% ec2-bundle-vol -i /etc/apt/trustdb.gpg,/etc/apt/trusted.gpg,/usr/share/keyrings/*.gpg ....
```

## thanks for

@osm さんにkeyring周りの情報を教えてもらったおかげで、各gpgファイルの役割がはっきりわかって原因まで速攻で辿りつけました。
ありがとうございます(｀・ω・´)
歯抜けデータのチェック

# 連番のデータを持つテーブルを作る
```sql
/****** Object:  Table [dbo].[NUM]    Script Date: 2013/12/16 17:46:15 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[NUM](
	[NUM] [int] NULL
) ON [PRIMARY]

GO

begin
	DECLARE @num INT;

	set @num = 1

	while(@num <= 100)
	begin
		INSERT INTO NUM(NUM) VALUES(@num)
		set @num = @num+1
	end
end
```

# データを比較する
```sql
select distinct num FROM NUM
where num <= (
SELECT MAX([Seq])
  FROM [データ$]
  ) and 
num not in
(
SELECT [Seq]
  FROM [データ$]
  )
order by num

```
NSUUIDからNSStringへの変換

NSUUIDから文字列に変換する必要があったのでメモ。
E621E1F8-C36C-495A-93FC-0C247A3E6E5Fのような文字列が取得できる。

```objc:sample.m
// UUIDを取得
NSUUID *uuid = [NSUUID UUID]
// UUIDから文字列に変換
NSString *uuidString = [uuid UUIDString];
// UUIDから文字列に変換2
NSString *uuidString2 = uuid.UUIDString;
```
ファイルのアップロード数、最大サイズの設定


##php.iniで設定する

```/etc/php.ini

;スクリプトが確保できる最大メモリの指定
memory_limit = 128M

;POSTデータに許可される最大サイズ
;ファイルアップロードにも影響する
post_max_size = 8M

;アップロードされるファイルの最大サイズ
upload_max_filesize = 2M

;同時にアップロードできるファイルの最大数
max_file_uploads = 20

```
memory_limit > post_max_sizeの必要があります。

##参考
[php.ini ディレクティブに関する説明 ](http://php.net/manual/ja/ini.core.php)
サイズが大きすぎるファイルの内容をコマンドラインから置換する

```
パーセントを取る
sed "s/%//g" hoge.txt  > hoge.txt2

NULLを取る
sed "s/NULL//g" hoge.txt2 > hoge.txt3
sed "s/null//g" hoge.txt3 > hoge.txt4

一行目のdevice_tokenを取る
sed "s/device_token//g" hoge.txt4  > hoge.txt5

空行を取る
sed '/^ *$/d' hoge.txt5 > hoge.txt6
```

```
ワンライナーでやりたいとき(Mac)
gsed -e 's/null\|device_token\|\%//g' -e '/^ *$/d' hoge.txt > hoge.test.txt
```
↑ asahina_devさんに教えていただきました。
最近のGentoo Linuxでpython2.xを使いたいとき

`eselect python set` できなくて焦ったけど、

```zsh
[mazgi@Gentoo] $ eselect python list
Available Python interpreters:
  [1]   python2.7
  [2]   python3.3 *
[mazgi@Gentoo] $ eselect python set 1
!!! Error: Cannot remove symlinks
exiting
```
EPYTHONに指定すればいいらしい。

```zsh
[mazgi@Gentoo] $ EPYTHON=python2 python --version
Python 2.7.5
```
default_scopeを持つModelへのbelongs_toでunscopedにするconcern

`default_scope` を持つModelへの `belongs_to` では勝手に `default_scope` が使われるので自分で頑張ってオーバーライドする必要があります。

例えば公開・非公開設定を持つ `Article` とそれに紐づく `Comment` があるとします。

```rb:app/models/article.rb
class Article < ActiveRecord::Base
  default_scope -> { where(private: false) }  # private な記事を排除する
end
```

```rb:app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :article
end
```

このとき `Article` の `default_scope` が思わぬ形で影響する場合があります。

```rb
# 公開ArticleへのCommentからは問題なく辿れる
public_article = Article.create(private: false)
public_comment = Comment.create(article: public_article)

Comment.find(public_comment.id).article  #=> Article

# 非公開ArticleへのCommentからはたどることができない
private_article = Article.create(private: true)
private_comment = Comment.create(article: private_article)

comment = Comment.find(private_comment.id)
comment.article_id  #=> 2
comment.article  #=> nil
comment.article.to_sql  #=> ... WHERE items.private = 0 AND items.id = 2
```

これを回避するために `Comment#article` を上書きしたりします

```rb:app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :article

  def article
    Article.unscoped { super }
  end
end
```

で、複数のModelが `Article` に紐づくとこれを毎回書くのはカッコ悪いし、 `super` を使うのもなんか嫌だったので[こちらの記事](http://techracho.bpsinc.jp/baba/2011_11_28/4729)を参考に concern にしてみました。

```rb:app/models/concerns/unscoped_associations.rb
module UnscopedAssociations
  extend ActiveSupport::Concern

  module ClassMethods
    def belongs_to_with_unscoped(model, options = {})
      belongs_to_without_unscoped(model, options.reject { |k, v| k == :unscoped })
      if options[:unscoped]
        define_method "#{model}_with_unscoped" do
          model.to_s.camelize.constantize.unscoped do
            send("#{model}_without_unscoped")
          end
        end
        alias_method_chain model, :unscoped
      end
    end
  end

  included do
    class << self
      alias_method_chain :belongs_to, :unscoped
    end
  end
end
```

こんな感じで使います

```rb:app/models/comment.rb
class Comment < ActiveRecord::Base
  include UnscopedAssociations
  belongs_to :article, unscoped: true
end
```

便利

```rb
comment = Comment.find(private_comment.id)
comment.article  #=> Article
comment.article_without_unscoped  #=> nil
```

## 関連する記事

- http://stackoverflow.com/a/4893758
iTerm2 notes


## Panes

    # to create a new pane vertically
    cmd+d
    # to create a new pane horizontally
    cmd+shift+d
    # to delete a pane
    cmd+w
    # navigate among panes
    cmd+option+arrow
    cmd+] 
    cmd+[

## Tabs

    # to create a new tab
    cmd+t
    # to delete a tab
    cmd+w
    # navigate among tabs
    cmd+arrow
    cmd+number
Ubuntu 12.04 -> 13.10 多段アップグレードに際しibus-mozcでつまずいた

もうすぐ14.04が出るとのことで、準備として
母艦でないほうのPC(TPx60)にて13.10までアップグレードしてみた。

日本語入力がおかしい・・・。
よく知らなかったのだが、13.10でのiBus1.5への変更で一悶着あったらしい。
なんでもIMEとIMを統合したとのこと。
まあ、設定次第でどうにかなるだろうとたかをくくっていたものの、
結構めんどうくさかった。

まず、自分のセッティングは標準からはかなり外れている。
Macのように、スペースキーの両隣にあるキーで英数と日本語を切り替えている。
つまり、「無変換」と「変換」だ。

切り替えると言っても、スイッチのようにOn/Offするのではなく、
「無変換」を押すと確実に英数になり、「変換」を押すと確実に日本語になる。
無変換を何度押しても英数のまま。変換を何度押しても日本語のまま。
このセッティングだと、
日本語のつもりでダダダダと打ったのに英数だったので無駄だった、みたいなことが激減する。
また、emacsなどでコマンドを打つ前に英数を叩くクセ、あるいは
日本語入力を終わったあとに英数を叩くクセ、などがつく（いいことかどうかは知らない）。
これはプログラムでコメントをつけたりしている時には楽。
とにかく、「今日本語入力かどうか」を意識しなくてよくなる。

さて、これを新しい環境で実現したかったのだが、以下のような変更があり既存のセッティングが使えなかった。

+ http://blog.goo.ne.jp/ikunya/e/884b2d853459a7437dd59a85f87c668d
+ http://cpplover.blogspot.jp/2013/10/ibus-15_20.html

しかも、探した記事にあるようにはなっていない -- というか「使用する入力ソース」にmozcがない。
ん？しかし、アプレットのメニューにはmozcが表示されている。どういうことだよ・・・
とりあえずmozcをアンインストールしてみた。きっと再インストールすれば治るだろ・・・

![mozc-failure.png](https://qiita-image-store.s3.amazonaws.com/0/6090/a3b7f53b-ea46-fc73-a2d8-6663d9918b95.png)

アンインストールしても消えませんでした。しかもmozcアイコン表示されない（当然）。
なんかおかしい。これを消したいが、そもそも「使用する入力ソース」には表示されていない。
きっと設定ファイルがおかしい。手動で書き換えないと。

そうこうして設定を探すこと半日。
ibus 1.5 config file manually などのキーワードを検索。
結局試したのは gconf-editor と dconf。
どちらもwindowsでいうレジストリみたいなものである。

gconf-editor は、 ~/.gconf/ 以下に保存された設定ファイル群を設定するツール。ディレクトリに基づいて整理されており、項目それぞれがxmlファイルになっている。mozcやibusで検索して、見つかった一つを消してみるがダメ。

dconfは、~/.config/dconf/user に保存されたバイナリデータベースを操作するツール。
結論から言うと設定はここにあったのだが、検索機能が貧弱でつかいにくく、一度目は見落とした。
貧弱というのは、検索する範囲がDB全体ではなく、「今表示しているサブフォルダ以降」であること。

![dconf.png](https://qiita-image-store.s3.amazonaws.com/0/6090/254e11ab-576e-86d9-c70d-d0b53b59f8fd.png)

画像では既に消したあとだが、この「('ibus','Anthy')」などと一緒にmozcの設定が残っていたのだった。
うんまあ、めでたしめでたし。
AWS Elastic Beanstalkで作成されるリソース（EC2, RDSなど）をカスタマイズする方法

## はじめに
AWSで手元にあるアプリケーションを出来るだけ簡単にデプロイしたい場合、Elastic Beanstalkがお勧めです。自由は効きませんがHerokuの様にお手軽にデプロイ出来ます。ただHerokuの何倍ものデプロイ時間がかかるのでそのつもりで・・・。
ここではそんなElastic Beanstalkを少しカスタマイズしたい場合の方法やその考え方、見つけ方を書き記します。余りにも大きく変える場合はEC2やRDSを生のまま使ったりOpsWorks、CloudFormationもご検討下さい。

## 参考文献
基本的にはAWSのドキュメントが詳しいです。以下と

- [環境のカスタマイズと設定](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers.html)

そこから辿れる以下が基本になると思います。

- [EC2 インスタンス上のソフトウェアのカスタマイズ](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html)
- [環境リソースのカスタマイズ](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-resources.html)

他にもありますが、それはおいおい。

## AWS Elastic Beanstalkで作成されるリソース（EC2, RDSなど）をカスタマイズする方法
### 設定ファイルの保存場所
".ebextensions"というディレクトリをアプリのホームディレクトリに作成し、その下に拡張子".config"の設定ファイルを保存します。このファイルにカスタマイズ内容を記述します。
ファイルはいくつでもOKです。作成してぽいぽい突っ込んでいきましょう。なおファイルは名前順に適用されていきます。

### 例: EC2で自動的にgitをインストール
EB（Elastic Beanstalk）で作成されるEC2にはデフォルトでgitが入っていません。例えばこれだとRubyのGemfileでgithubを指定している場合、gitが使えずgithubからgemを取得出来ずデプロイに失敗してしまうことがあります。
このようにEC2をカスタマイズする方法は[EC2 インスタンス上のソフトウェアのカスタマイズ](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html)に文法が詳しく書いてあります。例も豊富で迷うことも少ないと思います。
例えばgitのインストールであれば以下の様にすることで可能です。

```yaml:.ebextensions/ruby.config
packages:
  yum:
    git: []
```

ただ冒頭のGemfileでgithubを指定している際に起こる問題に対処する場合は、もう少し工夫が必要です。いつも通りぐぐると設定ファイルが見つかるので、コピペしましょう。今回の場合は以下で上手くいきました。

- [Elastic Beanstalk - Rails Deploy using Github Gems](http://stackoverflow.com/questions/18494219/elastic-beanstalk-rails-deploy-using-github-gems)

### 例: RDSでParameter Groupを指定
EBで作成されるRDSではデフォルトのParameter Groupが使用されます。ただUTF-8対応にしたい場合などは自分で作成したParamete Gruopを適用させたRDSを作成したい場合があります。
この場合は[環境リソースのカスタマイズ](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-resources.html)に文法が書いてあります。ただちょっと例が少ないので、以下にこの場合の例を示します。

```yaml:.ebextensions/rds.config
Resources:
  AWSEBRDSDatabase:
    Properties:
      DBParameterGroupName: mysql55-utf8
```

ここではEBが作成するRDSに自分で作成したParameter Groupである"mysql55-utf8"を設定しています。[環境リソースのカスタマイズ](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-resources.html)にある冒頭の"構文"と末尾にある"AWS Elastic Beanstalk のリソース名"を組み合わせて記述しています。"DBParameterGroupName"といったプロパティ名はCloudFormationのドキュメントを参照して下さい。今回の場合であれば[AWS::RDS::DBInstance](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html)のページに"DBParameterGroupName"含む使用できるプロパティが記されています。
余談ですがこうやってParameter Groupでutf-8を指定してあげても自動作成されるデータベース（データベース名: ebdb）のcharacter_set_databaseはlatin1になってしまいます。（[RDSのDBパラメータグループはインスタンス起動後にしか反映されない？](http://blog.livedoor.jp/aloha_net/archives/27291673.html)などを参照）AWSのサポートによるとこれは現在の仕様らしいのですが、どうにかこうにかそれも自動でutf-8に修正できる方法があったら誰かテンプレ下さい〜。

## おわりに
いかがだったでしょうか？正直、立ち上げた後自分で一つ一つ設定した方が早いこともあるかと思います。でも出来る環境があるのならやってみたいと思うのがエンジニアだと思います。AWSのサポートに加入している方は自分で調べた上で分からなければ問い合わせてみるのも良いかもしれません。
JavaScript (jQuery) でカウントダウンタイマーを書く

```html:countdown_timer.html
<script type="text/javascript">
  $(function() {
    countDown();
  });
  function countDown() {
  var startDateTime = new Date();
  var endDateTime = new Date("January 01,2014 00:00:00");
  var left = endDateTime - startDateTime;
  var a_day = 24 * 60 * 60 * 1000;

// 期限から現在までの『残時間の日の部分』
  var d = Math.floor(left / a_day) 

// 期限から現在までの『残時間の時間の部分』
  var h = Math.floor((left % a_day) / (60 * 60 * 1000)) 

// 残時間を秒で割って残分数を出す。
// 残分数を60で割ることで、残時間の「時」の余りとして、『残時間の分の部分』を出す
  var m = Math.floor((left % a_day) / (60 * 1000)) % 60 

// 残時間をミリ秒で割って、残秒数を出す。
// 残秒数を60で割った余りとして、「秒」の余りとしての残「ミリ秒」を出す。
// 更にそれを60で割った余りとして、「分」で割った余りとしての『残時間の秒の部分』を出す
  var s = Math.floor((left % a_day) / 1000) % 60 % 60 

  $("#TimeLeft").text(d + '日' + h + '時間' + m + '分' + s + '秒');
    setTimeout('countDown()', 1000);
  }
</script>

<div class="Timer">
  <p>カウントダウン終了まで</p>
  <div id="TimeLeft"></div>
</div>
````

また [パシャログブログ](http://c-brains.jp/blog/wsg/10/09/22-145004.php) を見たところ、カウントダウンの目標時刻はサーバー側から取得するよりクライアント側で設定した方がいいとのこと。

▼参考
・[getTime();について](http://www.scollabo.com/banban/jsindex/sample/sample_084.html)
・[Date();について](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)

こういうものもあるようで、便利かも
・[jQuery CountDown](http://keith-wood.name/countdown.html)
jquery.cookie.jsの使い方とCOOKIEの寿命(保存期間)を秒・分・時間で指定する方法

jquery.cookie.jsを使うと、JavaScriptからクッキーの書き込み&取得が簡単に行えるようになるんだけど、何故かmax-ageが無く、expiresでしか有効期限の設定が出来ないため、最も短い期間でも１日となる。

秒・分・時で制御する場合はnew Date()からsetTime()でミリ秒指定しなければならなかったので、プラグインの基本的な使い方と一緒にメモっとく。


-プラグインはこちら-
[https://github.com/carhartl/jquery-cookie](https://github.com/carhartl/jquery-cookie)



```js:cookieplugintest.js

// 書き込み方
$.cookie('名前', '値');

// 読み込み方
$.cookie('名前');
$.cookie('ありえない名前');  // 存在しない場合は undefindedが返る

// 削除
$.removeCookie('名前');




// 有効期限の設定：日数指定
$.cookie('名前', '値', { expires: 7 }); // 寿命は7日

// 30秒
var date = new Date();
date.setTime( date.getTime() + ( 30 * 1000 ));
$.cookie( "hoge", "30 seconds", { expires: date });

// 18分
date = new Date();
date.setTime( date.getTime() + ( 18 * 60 * 1000 ));
$.cookie( "hoge", "18 minutes", { expires: date });

// 5時間
date = new Date();
date.setTime( date.getTime() + ( 5 * 60 * 60 * 1000 ));
$.cookie( "hoge", "5 hours", { expires: date });

// 7日
date = new Date();
$.cookie( "hoge", "7 days", { expires: 7 });




// 有効範囲：パス または ドメイン
$.cookie('名前', '値', { expires: 7, path: '/' }); // パス
$.cookie('名前', '値', { expires: 7, domain: 'example.com' }); // ドメイン




// セキュリティ：true または false。デフォはfales
$.cookie('名前', '値', { expires: 7, secure: true });

```



###jsonの自動パース機能が超便利！

```js:cookieplugintest.js
// jsonの自動パース：
$.cookie.json = true;

// オブジェクトにまとめてといてそのまま突っ込める
var jsonData = new Object();
jsonData.title = "タイトル";
jsonData.url = "exsample.com";
jsonData.description = "概要";
$.cookie("jsonData", jsonData);

```
Guavaでネストしたループのtransform


```java
for(Continent continent : continentList) 
{
    for(Country country : continent.getCountries())
    {
        for(City city : country.getCities())
        {
            //Do stuff with city objects
        }
    }
}
```

上記のようなネストしたループでLists.transformを使いたい場合は、

```java
FluentIterable.from(continentList)
    .transformAndConcat(Continent.getCountriesFunction())
    .transformAndConcat(Country.getCitiesFunction())
    . //filter //tranform //find //toList() //etc.
```
のように`transformAndConcat()`を使えば出来なくもないが、メンテしづらくなるためお勧め出来ないとのこと。  


[java - Guava iterators, and iterating over a list within a list object - Stack Overflow](http://stackoverflow.com/questions/14340481/guava-iterators-and-iterating-over-a-list-within-a-list-object)
gdbmをg++で使うときのバグらしきもの回避

gdbmをg++で使うとg++のバグらしきものを踏むっぽい。
無名名前空間なんて使ってないのに下みたいな言いがかりを付けられる。

```
db.h:12:7: エラー: ‘DB’ has a field ‘DB::db’ whose type uses the anonymous namespace [-Werror]
```

このdbってメンバはGDBM_FILE型で、GDBM_FILEは/usr/include/gdbm.hあたりで下のように定義されている。

```cpp
typedef struct {int dummy[10];} *GDBM_FILE;
```

で、GDBM_FILEの定義を例えば下のように変更して構造体に名前を付けてやれば回避できる。

```cpp
typedef struct _GDBM_FILE_ {int dummy[10];} *GDBM_FILE;
```

なぜか無名構造体を無名名前空間と混同しているようだ。
ちなみに「extern "C"」で囲っても無駄だった。
それにしても構造体のメンバではなく構造体自体が無名名前空間にあるとか文句を言われるってのが謎だなぁ。
Git grepを便利に使う-eオプションについて


## outline

- `git-grep`の話
- `-e`オプションの話
- `--and`オプションの話

## `git-grep`の話

UNIX系のOSを使ったことのある人ならみんな大好き`grep`コマンド。
その拡張が`git-grep`だ。

ふつうの`grep`だと、指定したディレクトリ以下のファイル『全て』を検索対象としてしまうため、膨大な時間がかかることがよくある。そして時間を持て余してネットサーフィンしたりコンビニに買い物に行ったりする。そして帰ってきて見るとファイルが見つからなかったりして、貴重な労働時間をムダにするのである。

### そこで`git-grep`ですよ

`git-grep`は、gitで管理しているリポジトリの範囲内で`grep`するコマンドだ。
何が違うかというと、

1. gitで管理しているリポジトリの中身「しか」検索できない
2. その分ふつうの`grep`と比べて圧倒的に速い

というところである。
もちろんふつうの`grep`も、ちゃんと用法用量を理解して正しくお使いになれば、素晴らしい成果を出してくれるツールだが、個人的にはgitを使って開発する御方々には、ぜひとも`git-grep`を使って、何も考えずに快適に`grep`してほしいと考えている。

この記事では`git-grep`そのものについては詳しくは書かない。というかそういうのは[Pro Git](http://git-scm.com/book)とか[manpage](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html)とかを読めばだいたい分かるので、そっちを参考にして欲しい。

## `-e`オプションの話

で、`git-grep`は`grep`でもあるから、当然正規表現による絞り込みができる。例えば、こんな感じ。

```shell-session
$ git grep -e ‘current_user’
```

`-e`オプションの引数に文字列を渡してやると、その文字列で引っ掛けてきてくれる。
めっちゃ便利である。
もちろんスペースとかも認識してくれるので、こんな書き方もできる。

```shell-session
$ git grep -e ‘def current_user’
```

よい。
しかし、この方法だと **”検索したい文字列をそのまま”** 渡さなきゃいけなくて、ちょっと不便。
正規表現だし、ちゃんとスペースとか無視したい文字列とかを上手いこと書いてやれば、期待通りの結果を返してくれるが、それをやるのはちょっと面倒くさいなぁ、ということもよくある。

なので、そんなプログラマーの三大美徳のひとつをこよなく愛する皆様には、`--and`オプションをおすすめしたい。

## `--and`オプションの話

使い方はこうである。

```shell-session
$ git grep -e def --and -e current_user
app/controllers/company_users_controller.rb:  def set_current_user
app/controllers/users/social_media_accounts_controller.rb:  def the_user_must_be_current_user
lib/authentication.rb:    def current_user
```

大変簡単である。

`--and`でつながっている正規表現オプションが全て適用されるので、とても使い勝手が良い。
マッチしないものは表示されないし（ANDなんだから当たり前か）、これなら無精で短気な人達でも満足できるはずである。

ちなみに今試してみたら、やっぱり`--or`も存在した。使いドコロが難しいが、ハマれば強力なツールとして使えると思われる。

```shell-session
$ git grep -e def --and -e required --or -e current_user
```

みたいな使い方も出来る。（超個人的にはここまで複雑な検索が必要なアプリは作ったことはないが、）自分のリポジトリで色々試して遊んでみて欲しい。

しかし、gitは掘れば掘るほど色々なコマンドやオプションが登場するから、面白いなぁ。
WindowsでOpenSSL::SSL::SSLError 


WindowsではOpenSSLが標準で入っていないのでHTTP通信でエラーになります。
OpenSSLを入れるのが本筋ですが、開発など一時的であれば、以下の記述で
SSL通信を無効に出来ます。

``` application.rb

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

```
【jQuery】指定した要素のみ、結果を反映させる。

こんにちは。
今日も.cssでjQueryです。

指定した要素の直下のみ
内容をを変更する方法メモ。

```html
<div id="target"> 
  <p>文章１</p> 
  <div id="subTarget"> 
    <p>文章２</p> 
  </div> 
</div>
```

ここで

```js
$(function() {
  $("#Target p").css("color", "red");
});
```
と書いた場合、subTagetにも結果が反映されてしまいます。

そこで以下を書きます。

```js
$(function() {
  $("#target > p").css("color", "red");
});
```

 ``` > ``` を利用して、要素を区切ると直下のもののみ反映される。
複数要素指定に加えて、メモでした。

それでは、これからも宜しくお願いいたします。
独自UIWindowの生成と解放

独自にUIWindowのサブクラスを定義して使う方法について。ARC前提。

# ウインドウ生成

まずウインドウのインスタンスを作る。サブクラス化するとカスタマイズしやすい。ウインドウレベルを設定すると、ステータスバーやアラートの上に表示する事も可能。
Cocoa Controls 界隈で見かける「ステータスバーの上に表示する系」のものはウインドウレベルを利用していることが多い。

```objc
- (id)initWithFrame:(CGRect)frame
{
	self = [super initWithFrame:frame];
	if (self)
	{
		// ウインドウレベルを設定したり
		self.windowLevel = UIWindowLevelAlert;
	}
	return self;
}
```

※サブクラス化は必須ではありません。

ウインドウを表示。

```objc
self.myWindow = [[MyWindow alloc] initWithFrame:CGRectMake(40, 40, 40, 40)];
[self.myWindow makeKeyAndVisible]; // これでウインドウを表示
```

この時点で、`[UIApplication sharedApplication].windows` に myWindow のインスタンスが含まれるようになる。

# ウインドウ解放

UIWindow には `-resignKeyWindow` メソッドが存在するが、これは直接実行してはだめなものらしい。
> resignKeyWindow
> Invoked automatically when the window resigns key window status; never invoke this method directly.

`self.myWindow` を nil にするとウインドウへの参照が無くなるので、ウインドウを破棄する事が出来る。

```objc
self.myWindow = nil;
```

次の RunLoop で `[UIApplication sharedApplication].windows` を見ると myWindow が破棄されている事が確認出来る。

# キーウインドウと UIScrollView

テーブルビュー等のスクロールビューがある画面でステータスバーをタップすると最上位まで自動スクロールしてくれる。どうやらこれはキーウインドウ内のビューに通知されるもののようで、独自ウインドウがキーウインドウになっていると元のウインドウのビューには通知されなくなる。

元のウインドウをキーウインドウに戻すには、`-makeKeyWindow` `-makeKeyAndVisible` のいずれかのメソッドを実行する。
apiでdevise認証を叩いてUnauthorizedな時に, redirectなhtmlじゃなくて401のjsonを返したい


ref: [How To: Redirect to a specific page when the user can not be authenticated · plataformatec/devise Wiki](https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated)

`Devise::FailureApp`を継承した`CustomFailure`を作成, respondメソッドを書き換えてcontent typeがapplication/jsonだったらjson返すようにした. コレ自体がRack appなのか, self.status = 401, という書き換え方で面白い. bodyはとりあえずという感じ.

```ruby:lib/custom_failure.rb
class CustomFailure < Devise::FailureApp
  def respond
    if http_auth?
      http_auth
    # ここのelsif句を追加
    elsif request.content_type == "application/json"
      self.status = 401
      self.content_type = "application/json"
      self.response_body = {success: false, error: "Unauthorized"}.to_json
    else
      redirect
    end
  end
end
```

あとlibの読み込み順を先にして,

```ruby:config/application.rb
config.autoload_paths += %W(#{config.root}/lib)
```

deviseの設定に加えればok

```ruby:config/initializers/devise.rb
  config.warden do |manager|
    manager.failure_app = CustomFailure
  end
```
郵便番号から住所を埋めてくれるJOSMプラグインを作った

本来ここにはJOSMプラグインの作り方を書く予定でしたが、
それはまた後日とさせて下さい。ごめんなさい。

12/14(土)の[OSMもくもく勉強会 in 鯖江](http://atnd.org/events/45963)の成果で、
郵便番号から住所を埋めるJOSMプラグインがひとまず完成しました。

ソースの公開及びプラグインの一般公開はもう少しかかりそうですが、簡単に使い方を紹介します。

1.まず、住所を入力したいオブジェクトを選択します。
![JOSM1.png](https://qiita-image-store.s3.amazonaws.com/0/28397/4ca9ab24-59b8-2dea-5a14-60a1c175462b.png)

2.addr:postcodeを埋めます。(画像ではハイフンなしになっていますが、ハイフン有でも大丈夫です。)
![JOSM2.png](https://qiita-image-store.s3.amazonaws.com/0/28397/de2346fa-3037-702b-422a-35d3a3dd7fa2.png)

3.[データ]-[郵便番号から住所入力]を選択します。
![JOSM3.png](https://qiita-image-store.s3.amazonaws.com/0/28397/6bb7aa21-79ea-3a49-1662-678faa3efd8b.png)

4.addr:country, addr:province, addr:city, addr:quarter, addr:fullが埋まりました！
![JOSM4.png](https://qiita-image-store.s3.amazonaws.com/0/28397/a63562e3-22f1-6ba3-0837-32fa95e8fda1.png)

[プラグインのWikiページも作りました。](https://wiki.openstreetmap.org/wiki/JA:JOSM/Plugins/JPPostalcode2Address)
使ってみたい方は直接連絡をいただければプラグインのjarファイルを送付します。

次回のOSMもくもく勉強会 in (北陸のどこか) ではnameからname:ja_rm, name:ja_kanaを生成するプラグインを作ります。

今後も日本に特化したプラグインやツールをどんどん作っていきます。

プログラミング、アイコンの作成やUIの検討、テスト...etc
手伝っていただける方は是非ご連絡下さい。

2014.01.23追記
ソース公開しました。
https://github.com/unotecjapan/JPPostalcode2Address/