OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby] 配列の各要素を2連続させるイディオム


## 問題

こんな配列を、

````ruby
[1, 2, 3]
````

こうしたい。

````ruby
[1, 1, 2, 2, 3, 3]
````

どういう書き方があるんだろう？

・・・という話題が某所で挙がったので、いくつかイディオムを考えてみました。

## #map

よくあるアイデアは`map`を使う方法かもしれません。

````ruby
[1, 2, 3].map{|v| [v, v]}.flatten #=> [1, 1, 2, 2, 3, 3]
````

しかし、もっといいメソッドがあります。

## #flat_map

`map` + `flatten`するなら、その名もズバリ、`flat_map`というメソッドが使えます。

````ruby
[1, 2, 3].flat_map{|v| [v, v]} #=> [1, 1, 2, 2, 3, 3]
````

## #zip

しかし、個人的に一番好きなのは`zip`を使って宣言的に書く方法です。

````ruby
array = [1, 2, 3]
array.zip(array).flatten #=> [1, 1, 2, 2, 3, 3]
````

変数への格納と`flatten`をなくせるともっとカッコいいんですが。

## RSpecで確認する

ちゃんとテストも書いて確認しましょうね～。

````ruby
describe 'duplicate each item' do
  let(:array) { [1, 2, 3] }
  shared_examples 'duplicate each item' do
    it { should eq [1, 1, 2, 2, 3, 3] }
  end
  describe 'use map' do
    subject { array.map{|v| [v, v]}.flatten }
    it_behaves_like 'duplicate each item'
  end
  describe 'use flat_map' do
    subject { array.flat_map{|v| [v, v]} }
    it_behaves_like 'duplicate each item'
  end
  describe 'use zip' do
    subject { array.zip(array).flatten }
    it_behaves_like 'duplicate each item'
  end
end
````

## まとめ

他にもいろいろやり方はあると思いますが、上の3つぐらいが一番シンプルかな～と思います。
「もっと短くてクールなイディオムがあるぜ！」という方は、ぜひコメントをお願いします～。

## あわせて読みたい

- [[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか](http://qiita.com/jnchito/items/dedb3b889ab226933ccf)
- http://www.ruby-doc.org/core-2.1.1/Array.html
- http://www.ruby-doc.org/core-2.1.1/Enumerable.html
Heroku Scheduler で node.jsを利用している時に「/app/bin/node: bad interpreter: No such file or directory」

`#!/app/bin/node`でnodeにアクセスできていたはずなのだけど、どうやら変わったらしい。`#!/usr/bin/env node`にすると正常に動作した。

こちらとか参照
http://www.spacjer.com/blog/2014/02/10/defining-node-dot-js-task-for-heroku-scheduler/
curlでバーチャルホスト名を指定してwp-cronを実行する。


WordPressに限ったことではないが、curlでバーチャルドホスト"example1.com"にアクセスする方法を下記に示します。


```curlでアクセス
curl -H 'Host: example1.com' http://127.0.0.1/wp-cron.php?doing_wp_cron > /dev/null 2>&1
```

また、BASIC認証をかけている場合はこちら。


```Basic認証がかかっているサイトにアクセス
curl --user username:userpass -H 'Host: example1.com' http://127.0.0.1/wp-cron.php?doing_wp_cron > /dev/null 2>&1
```
Xcode5でCocoaPodsのインストール時に管理者権限に関して困ったこと＆解決法

## 1. セットアップ時
```shell-session
$ pod setup
```
CocoaPodsをgemからインストールして、初期セットアップをするコマンドを打つと、以下の様なエラーが発生しました。 
> [!] Oh no, an error occurred.

> Search for existing github issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=%28%2FUsers%2Fkousuke%2F.cocoapods%2Frepos%2Fmaster%2FCocoaPods-version.yml%29%3A+mapping+values+are+not+allowed+in+this+context+at+line+3+column+4&type=Issues

> If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new

> Don't forget to anonymize any private data!

githubページのissueを見ても似たようなエラーの相談が見つからなかったので色々ググってたら、setup時にリポジトリからソースをダウンロードしてくる時にエラーが起こる場合があるみたいです。

なので、setup時にダウンロードしたデータを消してもう一度管理者権限でsetupしたら上手く行きました。

```shell-session
$ sudo rm -rf ~/.cocoapods/repos/master
$ sudo pod setup
```

つまり、CocoaPodsのコマンドを使うときは **sudo** とセットにするのが無難ということですね。

## 2. Permission denied
projectを作成して、githubにpush出来て、podのインストールも完了できたので実行しようとしましたが、sudoでpod installしたのでPods-resources.shを実行する際にPermission Deniedされてしまいました。

調べてみると同じような問題がstackoverflowに上がっていました。

[stackoverflow](http://stackoverflow.com/questions/19687033/pods-resources-sh-permission-denied-in-ios-project)

どうやらPods-resources.shに実行権限を与えれば実行できるみたいです。下のコマンドを実行しました。

```shell-session
$ chmod a+x /Pods/Pods-resources.sh
```

再び実行すると、、、、やっぱり同じエラー吐かれてしまいます。
ぐぐっても最良の解決策が無いので、プロジェクト全てに実行権限を与えました。-Rオプションをつけて、プロジェクトフォルダに権限を与えればOKです。

```shell-session
$ chmod -R a+x /path/to/project/folder/
```

再度実行してみると、ちゃんと動きました！
SlickGridのfork版で固定行・固定列のスクロールのサンプルを発見

[mleibman/SlickGrid](https://github.com/mleibman/SlickGrid)のforkの1つ[JLynch7/SlickGrid](https://github.com/JLynch7/SlickGrid)で固定行・固定列のスクロールのサンプルを発見しました。
ただし、masterブランチには無くてgh-pagesブランチにだけ含まれていて、gitでタグを打たれていたりリリースされているわけではないので、ご注意ください。ご利用はいつもにも増してat your own riskで。

デモ: http://jlynch7.github.io/SlickGrid/examples/example-frozen-columns-and-rows.html
ソース: https://github.com/JLynch7/SlickGrid/blob/gh-pages/examples/example-frozen-columns-and-rows-spreadsheet.html

上4行、左2列が固定になっています。

スクロールは問題ないのですが、フィルタリングに何か文字列を入れるとマッチする場合でも全ての行が非表示になってしまいました。
地理院タイルとOpenStreetMapのデータを使ってthree.jsで立体地図を描画する

- [「新しい Google マップ」正式公開、地図大きく、精緻すぎる3D都市マップも -INTERNET Watch](http://internet.watch.impress.co.jp/docs/news/20140220_636083.html)
- [ViziCities Demo](http://vizicities.apps.rawk.es/)
- [地図サービスの王Googleマップをじわじわと追いかけるOpenStreetMap
](http://gigazine.net/news/20140303-openstreetmap/)
- [地理院地図３D](http://cyberjapandata.gsi.go.jp/3d/index.html)

↑の記事に触発されて書きました。乗るしかない、この(地理空間情報のオープンデータ化と、Web3D地図の普及という)ビッグウェーブに。

[デモ](http://jsdo.it/i09158knct/xmx2)

※注1 データの読み込み時間長めです
※注2 デスクトップ版のChrome、Firefox、Safariと、Android版のChrome、Firefox辺りは動くはず
※注3 CoffeeScript 1.7.1 で書いたんですが、jsdo.itがまだ1.7.1に対応してなかったので、自前でコンパイルしたjsコードを貼り付けて動かしてます。フォークしにくくてすみません。jsdo.itが1.7.1に対応したら直しておきます。coffee版のソースは[Gist](https://gist.github.com/i09158knct/9709636#file-source-coffee)にあります

内容的には、

- 国土地理院の地理院タイルAPIを利用して標高情報とテクスチャ画像を取得して、
- OpenStreetMapのOverpass APIを利用して建物、道路、自然物等の情報を取得して、
- three.jsを利用して3D化して表示してみた

という感じです。

以下、地理院タイルAPIとOverpass APIについて軽く書きます。


### [地理院タイルAPI](http://portal.cyberjapan.jp/help/development.html)

日本の適当な地域のタイル座標を指定するとその地域の標高データがcsvで取れたり、地図画像や航空写真がpngで取れたりするやつです。

[この記事](http://qiita.com/amay077/items/ef41e8feef3bafd15453)が参考になります。

タイル座標の算出は[この記事](https://developers.google.com/maps/documentation/javascript/examples/map-coordinates)を参考にしました。

[3D化デモ](http://jsdo.it/i09158knct/fgmD)

[ソースコード](https://gist.github.com/i09158knct/9709436)


### [Overpass API](http://wiki.openstreetmap.org/wiki/JA:Overpass_API)

OpenStreetMapに登録されている情報を取得できるAPIです。行政区画から建物や道路の情報、果てはベンチの位置まで、ありとあらゆるデータが取得できます。

どんな情報を取得できるかはOpenStreetMapのWikiの[このページ](http://wiki.openstreetmap.org/wiki/JA:Map_Features)にあります。

また[Overpass turbo](http://overpass-turbo.eu/)という便利なWebアプリでいろいろクエリを試すことができます。詳しくは[このページ](http://wiki.openstreetmap.org/wiki/JA:Overpass_turbo)をどうぞ。


[3D化デモ](http://jsdo.it/i09158knct/wJ7g)

[ソースコード](https://gist.github.com/i09158knct/9709568)

参考: [デモで利用しているデータ](http://overpass-turbo.eu/s/2QX)


### 終わりに

なんか投げやりですが以上です。

### 参考リンク

- [ViziCities development diary #1](http://rawkes.com/articles/vizicities-dev-diary-1)
- [ViziCities development diary #2](http://rawkes.com/articles/vizicities-dev-diary-2)
- [Bringing Cities to Life Using Big Data & WebGL](http://www.slideshare.net/robhawkes/bringing-cities-to-life-using-big-data-webgl)
- [2012 07 27_osm_project10](http://www.slideshare.net/TomG3X/2012-07-27osmproject10)
- [State of the Art Web Mapping with Open Source](http://www.slideshare.net/OReillyOSCON/state-of-the-art-web-mapping-with-open-source)
Python 3.4.0 の新機能 (1) - pathlib


すでにあちこちで書かれている気がするけど、Python 3.4.0が 3/16 にリリースされた。3.4シリーズの一発目。

最初のPython3 (3.0.0) が出たのが2008年の12月だから、もう５年以上も経っているのか。最後の2.xシリーズである2.7の最初のリリースも2010年7月なのでそこからも4年近くが経っている。

遅いとか安定していないとかライブラリが揃っていないとか色々理由があって2.7を使い続けていた。が、「人の振り見て我が振り直せ」という格言もあり、まずは自分が書くライブラリは両対応しようかと思い立った。

そこで3を使い始めているのだが、そうこうしているうちに3.4が出ちゃった。出たからには見ておかなければということで、まずは 3.3シリーズに対する変更点。

- PEP 428, a "pathlib" module providing object-oriented filesystem paths
- PEP 435, a standardized "enum" module
- PEP 436, a build enhancement that will help generate introspection information for builtins
- PEP 442, improved semantics for object finalization
- PEP 443, adding single-dispatch generic functions to the standard library
- PEP 445, a new C API for implementing custom memory allocators
- PEP 446, changing file descriptors to not be inherited by default in subprocesses
- PEP 450, a new "statistics" module
- PEP 451, standardizing module metadata for Python's module import system
- PEP 453, a bundled installer for the pip package manager
- PEP 454, a new "tracemalloc" module for tracing Python memory allocations
- PEP 456, a new hash algorithm for Python strings and binary data
- PEP 3154, a new and improved protocol for pickled objects
- PEP 3156, a new "asyncio" module, a new framework for asynchronous I/O

https://www.python.org/download/releases/3.4.0/ にはリンク付きでリストされているのでそちらを見た方が早いが、ドキュメントを読んだだけでは今ひとつピンと来ない。

ならば使ってみるのが一番だが、一度に全てはできない（そして読む方も疲れる）ので一つずつ使ってみることにする。

上から順で、今回は pathlib について。Pathlibは「ファイルシステムのパスを扱うオブジェクト指向なモジュール」というモノらしい。使ったことがなかったが pypiにもあがっていて、Python2,7, 3,2, 3.3でも pip installすれば使えるらしい。

ドキュメントの拾い読みで幾つか試してみる。まずはカレントディレクトリの下にあるディレクトリのリストを取得するコード。

```python
# Pathクラスをインポート
from pathlib import Path 

# 現ディレクトリを表すPathオブジェクトを生成
p = Path('.')

# for文でまわしてプリントアウト
for p in p.iterdir():
	if x.is_dir():
	    print (x)

# 後で使うためにlistで取得
dirlist = [x for x in p.iterdir() if x.is_dir()]
...

```

面白いのは除算演算子を使って階層アクセスできること。
例えば、次のようにできる。

```python
# Pathクラスをインポート
from pathlib import Path 

# 絶対パスを指定してPathオブジェクト生成
usr_local_path = Path('/usr/local')

# さらに下の階層のファイルを表すPathオブジェクト
python_path = usr_local_path  / 'bin' / 'python'

# Symbolic linkの場合は元ファイルのパスも得られる
python_real_path = python_path.resolve()
```


この他、Pathオブジェクトのメソッドとしてopen()はstat()などがあり、ファイル操作で出来ることはひと通り出来るようだ。

os.pathとの住み分けが気になるところだが、徐々にpathlibを使うようになっていくのかな。ちょっと時間切れなので試すのはまた今度。念のため、標準ドキュメント中のpathlibの説明は[ここ](http://docs.python.org/3.4/library/pathlib.html)。


そして残りの「3.4新規追加機能」も試していきたいのだが、このペースで書いていると終わる頃には次のリリースがでてしまっているかも（？）
MongoDBのfindの特殊な検索条件


ちょっとつまずいたのでメモ。
findで子要素を検索する場合は、キー名をクォーテーションで囲って文字列にして指定します。

## 子要素を検索条件にする

例えば、taskコレクションが以下のようなドキュメント構造だった場合に、日曜日が有効（1）になっているタスクを検索したい場合。

```json
{
  "schedule_time": "07:30",
  "schedule_week": {
    "sun": 1,
    "mon": 1,
    "tue": 1,
    "wed": 1,
    "thu": 1,
    "fri": 1,
    "sat": 1
  },
  "title": "すごいがんばるタスク"
}
```

```javascript
db.tasks.find({"schedule_week.sun": 1})		// OK
db.tasks.find({schedule_week.sun: 1})		// NG
```

## 子要素の配列の特定の位置を検索条件にする

例えば、taskコレクションが以下のようなドキュメント構造だった場合に、日曜日（配列は日から順）が有効（1）になっているタスクを検索したい場合。

```json
{
  "schedule_time": "08:00",
  "schedule_week": [
    1,
    1,
    1,
    1,
    1,
    1,
    1
  ],
  "title": "すごいがんばるタスク２"
}
```

```javascript
db.tasks.find({"schedule_week.0": 1})		// OK
db.tasks.find({schedule_week.0: 1})			// NG
db.tasks.find({"schedule_week[0]": 1})		// NG
db.tasks.find({schedule_week[0]: 1})		// NG
```
brew update の .git/FETCH_HEAD エラー対処法



## 結論

* バーミッション変える
* brew untap する


## エラー内容


```
% brew update
error: cannot open .git/FETCH_HEAD: Permission denied

Error: Failed to update tap: homebrew/dupes
error: cannot open .git/FETCH_HEAD: Permission denied

Error: Failed to update tap: josegonzalez/php
error: cannot open .git/FETCH_HEAD: Permission denied
```


## 対処

```
brew untap homebrew/dupes
brew untap josegonzalez/php
```

上記をやると、以下のエラーもなくなる

```
error: cannot open .git/FETCH_HEAD: Permission denied
```
【備忘録】新しいPCにセットアップするものまとめ

OSはWindows想定
会社などで禁止されてるものはあきらめてください。
思い出し次第追加

必ず入れる
----
###[Sleipnir 4/6](http://www.fenrir-inc.com/jp/sleipnir/ "Sleipnir")
基本となるタブブラウザ 4を愛用

###[7-zip](http://sevenzip.sourceforge.jp/ "7-zip")
最強圧縮展開ソフト

###[Avast!](http://www.avast.co.jp/ "Avast")
フリーのウィルス対策ソフト 他のが良ければそちらでも

###[FlashPlayer](http://www.adobe.com/go/JP-H-GET-FLASH "Adobe FlashPlayer")
フラッシュプレイヤー

###[Skype](http://www.skype.com/ja/ "Skype")
無料通話ソフト 以下略

###[DropBox](https://www.dropbox.com/install "DropBox")
クラウドに保存してくれる。

###[Unlocker](http://unlocker.softonic.jp/ "Unlocker")
このファイルはロックされています
を無視できるようにする

###[VLC Media Player](http://www.videolan.org/index.ja.html "VLC Media Player")
有名オープンソースメディアプレイヤー


必要に応じて入れる
----
###[Java](http://java.com/ja/download/ "Java")
たまに要求してくるので入れる。

###[IPメッセンジャー](http://ipmsg.org/)
LAN内のメッセージングに

###[Tween](https://sites.google.com/site/tweentwitterclient/ "Tween")
Twitterクライアント

テキストエディタ
----
###[Terapad](http://www5f.biglobe.ne.jp/~t-susumu/ "Terapad")
スタンダードで使いやすい

###[Sakura Editor](http://sakura-editor.sourceforge.net/download.html "サクラエディタ")
Grapなど高機能 カスタム性が高いのでマイナーなスクリプトに向く(自分で作る)

###[Vim](http://www.kaoriya.net/software/vim/ "Vim Kaoriya")
超有名テキストエディタ Path通しておくとコンソール上で編集できるので便利




開発環境
----
###[TortoiseSVN](http://tortoisesvn.net/ "ToirtoiseSVN")
バージョン管理ソフト サブバージョン

###[Git](http://git-scm.com/ "Git")
分散管理バージョン管理ソフト ギット

###[Visual C++2010 Express](http://www.visualstudio.com/downloads/download-visual-studio-vs "VisualC++")
VisualStudioあるならそっちのほうがいい

###[WinMerge](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html "WinMerge 日本語版")
マージツール たまに差分チェッカとしても使う TortoiseSVNと連携可能

###[Boost C++ Library](http://www.boost.org/ "Boost C++ Library")
C++拡張ライブラリ 有名なので説明略

###[DirectX SDK](http://www.microsoft.com/en-us/download/details.aspx?id=6812 "DirectX Software Development Kit")
DirectXいじるのに必要


バッチファイル
----
パスを通して置いておく

```bat:ls.bat
dir /w %*
```

```bat:history.bat
@doskey /history
```

```bat:quit.bat
exit
```

ネタ
----
###[TweetConsole](http://www.vector.co.jp/soft/win95/net/se483315.html "TweetConsole")
コマンドプロンプト上で動作するTwitterクライアント
設定書き換えで自分で作ったクライアントに偽装可能
下のバッチでどこからでもツイート可能にする+文字列出してそれっぽくしてみたりとかカスタマイズ用

```bat:tw.bat
@echo off
絶対パス\TweetConsole\twtcnsl.exe %1 %2 %3 %4 %5 %6 %7 %8 %9

```
放送時間変更通知してくれるChrome拡張の「アニメあんてな」に新番組通知機能を追加した！

前に追加できたら追加したいなーって言ってた新番組通知機能を追加した！

一回予約登録してしまえば放送終わるまで放置してれば録画してくれるけど、一回目を逃してしまうと致命的だよね。

今回追加した機能があれば何気なく眺めてるインターネットブラウザから新番組の存在に気付けるようになるので少し便利になる…はず。

# アニメあんてなって？
前にQiitaに記事書いてるのでここ参照
http://qiita.com/chuross/items/0d2f4f51be1e42d17135

# 今回変わったとこ
- デザインの一部変更
 - 新番組を表示する領域を確保するため、レイアウトを若干変更 
- タブ毎に通知数を表示
 - アイコンバッジに表示される数は２つを合わせた数
- 一部のコードリファクタ

# イメージ
![1.png](https://qiita-image-store.s3.amazonaws.com/0/20629/575807f0-f743-8cf0-e05c-069b34fa7004.png)

前回より黒色が減った感じ

# 使い方
前回の紹介記事を参照
http://qiita.com/chuross/items/0d2f4f51be1e42d17135

最新のcrxはここ【[ダウンロード](https://github.com/chuross/anime-antena-extension/blob/1.0.2/anime-antena.crx?raw=true)】

# 今後
- 一度通知が確認されたらカウントされないようにしたい。
 - 気が向いたらやる 
- 住んでる地域で絞り込み
 - 気が向いたらやる
pharファイルビルドツール「Box」


pharファイルビルドツール「Box」について、日本語の情報が見当たらなかったので書いてみた。


## Box
  [Box](http://box-project.org/)はpharファイルをビルドするためのツール。
  Goutteとか、[Doctrine Migrations](https://github.com/doctrine/migrations)とか、pharファイルでの提供をやめて、Boxを使ってユーザーにビルドさせるものが増えてきている（？）

Boxのインストールは簡単。

```
$ curl -s http://box-project.org/installer.php | php
```

composerからもインストールできるけど、公式サイトでpharとしてインストールするのをおすすめしてる。

  ビルドは、box.jsonのあるディレクトリで

```
$ php box.phar build
```

バージョン確認は

```
$ php box.phar --versions
```

ソフトウェアが新しいバージョンになったときは

```
$ php box.phar update
```

で、アップデートできる。

## まとめ
  Boxを使っていなくても、[Guzzle](https://github.com/guzzle/guzzle)はpharをスタブするスクリプトを用意するようにしたりしてる。
  少し前まではpharファイルとして提供されていたものが、ここ最近自分でビルドさせるようになってきてるなーと思う。

  なんでユーザーにpharをビルドさせるようになったのか調べてみたら、[Doctrine MigrationsのConversation](https://github.com/doctrine/migrations/pull/97)に、pharファイルを作るために **不要なスクリプトや、現時点で壊れているスクリプトを除くため**って書いてあった。
warpではじめる最小ウェブアプリケーション

warpでscottyとかyesodは使わず、最小な感じのウェブアプリケーションを作るメモ。
頭が混乱したときにはこういうところから追いかけなおしたい。

追記：warp3.0及びwai3.0に対応しました。

バージョンは以下。使用環境はWindows7。

# warp3.0

wai3.0になって、IFが少し変わりました。
とはいえ、コード的には、クライアントにレスポンスを返すメソッドを受け取ってそれを使うようになることだけの差になりました。

* ghc 7.6.3
* wai-3.0.0.2
* warp-3.0.0.3
* http-types-0.8.5

```haskell:simple_app.hs
{-# LANGUAGE OverloadedStrings #-}

import qualified Network.Wai as Wai
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.HTTP.Types.Status as Status

simpleApp :: Wai.Application
simpleApp req respond = do
    putStrLn . show . Wai.pathInfo $ req -- とりあえずリクエストのパスとか表示してみる。
    respond $ Wai.responseLBS Status.status200 [] "test"

main :: IO ()
main = do
    let port = 3000 -- とりあえずポート3000番で。
    let setting = Warp.setPort port Warp.defaultSettings
    putStrLn $ "start server port=" ++ show port
    Warp.runSettings setting simpleApp
```

# warp2.1

warpの2.1でポート設定のIFが変わったみたいです。

* ghc 7.6.3
* wai-2.1.0
* warp-2.1.3
* http-types-0.8.3

```haskell:simple_app.hs
{-# LANGUAGE OverloadedStrings #-}

import qualified Network.Wai as Wai
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.HTTP.Types.Status as Status

simpleApp :: Wai.Application
simpleApp req = do
    putStrLn . show . Wai.pathInfo $ req -- とりあえずリクエストのパスとか表示してみる。
    return $ Wai.responseLBS Status.status200 [] "test"

main :: IO ()
main = do
    let port = 3000 -- とりあえずポート3000番で。
    let setting = Warp.setPort port Warp.defaultSettings
    putStrLn $ "start server port=" ++ show port
    Warp.runSettings setting simpleApp
```

# warp2.0

* ghc 7.6.3
* wai-2.0.0
* warp-2.0.3.2
* http-types-0.8.3

```hs:simple_app.hs
{-# LANGUAGE OverloadedStrings #-}

import qualified Network.Wai as Wai
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.HTTP.Types.Status as Status

simpleApp :: Wai.Application
simpleApp req = do
    putStrLn . show . Wai.pathInfo $ req -- とりあえずリクエストのパスとか表示してみる。
    return $ Wai.responseLBS Status.status200 [] "test"

main :: IO ()
main = do
    let port = 3000 -- とりあえずポート3000番で。
    let setting = Warp.defaultSettings { Warp.settingsPort = port
                                       }
    putStrLn $ "start server port=" ++ show port
    Warp.runSettings setting simpleApp
```

# ビルドと実行

ビルドは以下で適当に。
`ghc -O2 -Wall simple_app.hs -o simple_app.exe`

実行。
`./simple_app.exe`

ためしにリクエストしてみる。
`wget --save-headers -O - -o - http://localhost:3000/path/of/test/`

応答。

```
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Jun 2014 16:41:54 GMT
Server: Warp/3.0.0.3

test
```

実行したコンソールの出力

```
start server port=3000
["path","of","test",""]
```

# 感想（warp3.0時点）

wai3.0でまたIFが変わったのでちょっとびっくりですね。
wai2.0よりちょっとわかりにくかい気はしますが、ResourceTとかがあるよりははるかにいいですね。

# 感想（warp2.0時点）

waiが2.0になる前はResourceTがうざかったけど、wai2.0のIFはすごくわかりやすくていいですね。
`type Application = Request -> IO Response`
「リクエストを受け取って副作用を与えて（与えなくても可）レスポンスを返すのが（ウェブ）アプリケーションだ！」という感じの定義がしっくりきます。

`Warp.runSettings setting simpleApp`ではなく`Warp.run port simpleApp`の方がよりコンパクトな感じだけど、大抵は`runSettings`しそうな気がするのでこれでいいかなと。
Rbenvを用いた複数バージョンRuby管理方法


# rbenvの導入とRubyのインストール

* rbenvの導入

```sh
# (Macの場合)
$ brew install rbenv
$ brew install ruby-build
$ brew install readline

```

gitから取って来たい場合はこちらでも可能

```sh
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ mkdir -p ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

* パスの設定

```sh
# ZSH用
$ vi ~/.zshrc
```

```.zshrc
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init - zsh)"
```


* rubyのインストール

```sh
# ほしいバージョンを確認
$ rbenv install -l
# インストール
$ rbenv install 2.1.1
# 変更があった場合のおまじない
$ rbenv rehash
# グローバル（標準）に使えるように設定
$ rbenv global 2.1.1
```

* bundlerのインストール

```sh
# これはグローバルのrubyに対して入れることになる
$ gem install bundler
$ rbenv rehash
```


# プロジェクト毎に使用するRubyを変える
 * 現在インストールされているrubyのバージョン確認

```sh
$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161)

$ gem -v
2.2.2

$ rbenv versions
  system
  1.9.3-rc1
  2.0.0-rc2
* 2.1.1
```

* 特定プロジェクトに移動しrubyのバージョンを指定

```sh
$ cd project1

# 変えたいバージョンを指定する
$ rbenv local 1.9.3-rc1
# おまじないは忘れずに
$ rbenv rehash

# 成功すると.ruby-versionファイルが生成される
$ cat .ruby-version
1.9.3-rc1

$ruby -v
ruby 1.9.3dev (2011-09-23 revision 33323)

$gem -v
1.8.0
```

# 特定プロジェクト毎にgemを管理する

system領域にgemを入れるとごちゃつくのでプロジェクト毎に管理できるようにします。

* bundlerでgemインストール先を指定する

```sh
# 特定のプロジェクトのみで有効になる
$ bunle install --path <指定フォルダ>
# 上記でインストールしたものは以下で実行
$ bundle exec <コマンド名>
```

なお--pathで指定した場合には、.bunle/configとして情報が残りますので、次回以降は--pathを指定する必要はなくなります。

* bundlerで開発環境、テスト環境、本番環境を管理する

Gemfileではグループを使って環境ごとのgem構成を使い分けることができます。

:production -> 本番環境
:development -> 開発環境
:test -> テスト環境

```sh
$ vi Gemfile
```

```Gemfile
group :production do
	gem 'capistrano'
end

group :development do
	gem 'less'
	gem 'rspec-rails'
end

group :test do
	gem 'rspec'
end

```

そして環境ごとに--without指定でインストールしたくないものを指定します。

```sh
# 本番環境（production)にインストールする場合
$ bundle install --without development test
# 開発環境（development）にインストールする場合
$ bundle install --without production test
# テスト環境（test）にインストールする場合
$ bundle install --without production development
```




* bundler管理のgemを削除する

bundlerで--path指定してgemインストールしている場合、
いらなくなったら上記フォルダごと削除すれば元にもどります。


# その他Tips

* gemインストールを早くする

デフォルトだとインストール時にドキュメント関係もインストールするので結構時間がかかります。

不要な場合は.gemrcでインストールしないように指定します。

```sh
$ vi ~/.gemrc
```

```~/.gemrc
gem : --no-ri --no-rdoc
```


* GitHubにあるgemを利用する

```sh
$ vi Gemfile
```

```Gemfile
gem "goo", :git => "https://github.com/bar/foo.git"
```
Stylus入門したときのまとめ


Sassと比べると日本語の情報が少ないと感じたので、Stylusを始めるときに、 **最低限これだけ知っておきたい** 書き方をまとめてみた。

## Stylusとは
[Stylus](http://learnboost.github.io/stylus/) は Node.js 製の CSS プリプロセッサ-。Express、Jade (Pug) と同じ人が開発してる。**Sass と Less より後発で、2つの良いとこ取り** をしていて、機能も豊富（らしい）。

インストールは npm から

```
$ npm install -g stylus
```

記述は SCSS 記法のように、CSS っぽい書き方と

```scss
.hoge {
  color: red;

  &:hover {
    color: blue;
  }
}
```

SASS 記法のように、インデントベースの記述もできる。`:` や `;` も省略可能。せっかくなのでこの記法で書いてみた。

````sass
.hoge
  color red

  &:hover
    color blue
```


  CSS っぽい書き方とインデントの書き方ができるが、拡張子は `.styl` のみで、記法を混在させることもできる。

## 変数と演算

変数に値を代入しておくことで、変数名で任意の場所から値を参照することができる。

```sass
base-color = #00a6fc

.title
  color base-color
```

`@` をつけると、直前のそのプロパティを参照することもできる。かっこ必要。
  
演算もできる。

```sass
.container
  width 100%

  .sidebar
    width (@width * 0.3)
```

## 条件分岐と繰り返し

### if / else 文

```sass
liquid = true

.hoge
  if liquid
    width 100%
  else
    width 960px
  ...

```

### for / in 文

```sass
array = 1 2 3 4

 for num in array
   .mg-{num * 5}
     margin num * 5px
```


  1行目が **配列の定義**。,（カンマ）区切ることもできる。また、 **変数の展開**は{}でできる。


## パーシャル
  Stylus でも Sassと同じように、ファイル名の前に `_` を付けることで、コンパイル後に CSS ファイルが生成されない。また、Sassと違って、 `@import` するときに_を省略することはできない。

```sass
@import '_setting'

.hoge
  ...
```

## ミックスイン
  ミックスインの定義と参照方法は以下の通り。

```sass
box-sizing(arg)
  -webkit-box-sizing arg
  -moz-box-sizing arg
  box-sizing arg

  .hoge
    box-sizing border-box
```


Sass のように、 `@mixin` とか `@include` とか付けなくてもいい。ミックスインを参照しているところを見ると、プロパティと同じように使えている（ **透過的mixin** ）。

Stylusでは、 **CSSと全く同じ記述方法で抽象化**することができる。

## 継承（extend）
  Stylus には、extend の機能もある。

```sass
.btn
  ...
  ...

.btn-blue
  @extend .btn
  background-color

```

  ちなみに、 `@extend` と `@extends` のどっちでもいい。

## Stylusを使ってみて

個人的に、Grunt や CoffeeScript、Jade、Yoeman、そして Stylus、フロント開発で使うツールをすべて npm で管理できるのはいいと思った。

Stylus は CSS と全く同じ記述で機能をラップできるので、`@import` するファイルだけ作っておけば、生の CSS しか書けない人でも使うことができる。Sass か Less がプリプロセッサのデファクトになっている感はあるけど、Stylus　という選択肢もありだと思う。

## 参考にしたサイト
  - [公式サイト](http://learnboost.github.io/stylus/)
  - [Stylus ドキュメント日本語訳](https://github.com/enja-oss/stylus)
  - [Stylusが目指すCSSプリプロセッサ](http://sssslide.com/speakerdeck.com/ahomu/stylusgamu-zhi-sucsspuripurosetusa)
PushMeBabyの使い方


PushMeBabyというMacOS上からiOS上のアプリにプッシュ通知を送信するツールの使い方を調べたので、ここに残しておきます。但し、記憶を遡って書いてるのでなんか間違ってるかも。あと私はiOS関連のことは殆ど知らないので、適当な事書いてるかもしれません。

# PushMeBabyの実行までの流れ

[1] コードをGithubから取得する

```
$git clone https://github.com/stefanhafeneger/PushMeBaby.git
```

[2] Xcodeを起動してPushMeBaby.xcodeprojを開く

- xcodeを起動
- File -> Open -> PushMeBaby.xcodeprojを選択

[3] Push通知に使う証明書をプロジェクトに追加する

- Project Navigatorの画面上でResourcesフォルダを右クリック
- Add Files to "PushMeBaby"
- Push通知に使う証明書を選択

[4] ApplicationDelegate.m fileの変更

certificate変数に代入する値を[3]で追加した証明書のファイル名に変更する。

```objectivec:ApplicationDelegate.m
        self.certificate = [[NSBundle mainBundle] 
            pathForResource:@"aps_developer_identity" ofType:@"cer"];
```

例えばhoge.certを追加してたら

```objectivec:ApplicationDelegate.m
        self.certificate = [[NSBundle mainBundle] 
            pathForResource:@"hoge" ofType:@"cer"];
```

というような感じ.

以下のdeviceTokenは書き換えなくても良いが、テストの度に入力するのが面倒なので直接コードに書くほうが楽。

```objectivec:ApplicationDelegate.m
        self.deviceToken = @"";
```

ちなみに８文字毎に空白を入れる必要がある。

```objectivec:ApplicationDelegate.m
        self.deviceToken = @"38c866dd bb323b39 ffa73487 5e157ee5 a85e0b7c e90d56e9 fe145bcc 6c2c594b";
```

[5] Command+RでPushMeBabyの実行

- ダイアログが出てくるので、Push通知したいデバイスのデバイストークンをテキストボックスに入力(8文字毎に空白を入力)
- Pushボタンを押すと、ダイアログのPayloadに書かれている内容の通知がアップルのサーバーを経由して指定したデバイスに届くはず

#参考

iOS Push Notification Debug App
https://github.com/stefanhafeneger/PushMeBaby

Programming Apple Push Notification Services
http://mobiforge.com/design-development/programming-apple-push-notification-services
Unicorn worker毎にRailsログを別ファイルに書き出す

Unicornで複数のRailsプロセスを動かしていると同じproduction.logにログが書きだされます。その結果ログの中身が混ざって後からみたとき何がなにやら訳がわからない感じになります。ログは人力で見るものじゃないという声もあるかと思いますが、解析器に書けたときの揺れも大きくなってしまいます。ワーカー数が増えてくると尚更辛い感じです。

# 分割する

config/unicorn.rb の `after_fork` の中でこんな感じに書いておくとワーカー毎にログが別々に出力されるようになります。

```rb:config/unicorn.rb
after_fork do |server, worker|
  Rails.logger = ActiveRecord::Base.logger = ActionController::Base.logger = begin
    path = Rails.configuration.paths["log"].first
    f = File.open(path.sub(".log", "-#{worker.nr}.log"), "a")
    f.binmode
    f.sync = Rails.configuration.autoflush_log
    logger = ActiveSupport::Logger.new f
    logger.formatter = Rails.configuration.log_formatter
    logger = ActiveSupport::TaggedLogging.new(logger)
    logger
  end
end
```

# 参考リンク

- [Rails 4.0.2におけるロガー設定](https://github.com/rails/rails/blob/v4.0.2/railties/lib/rails/application/bootstrap.rb#L32-L54)
- [Rails 3でのやりかた](http://stackoverflow.com/questions/5551660/how-to-make-each-unicorn-worker-of-my-rails-application-log-to-a-different-file)
[Objective-C] NSDate周りのまとめメモ


Objecitve-Cは慣れてくると引数が分かりやすかったりとメリットもあるんですが、とにかく最初になにかをやるのが大変なイメージです。
ていうことで、今回は`NSDate`クラス周りのメモです。随時更新予定。

##NSDateの作成

```objc
// 今の時間
NSDate *now = [NSDate date];

// 今から3秒後
NSDate *after3 = [NSDate dateWithTimeIntervalSinceNow:3.0];
```

##文字列からNSDateオブジェクトを作る

```objc
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

// フォーマットを文字列で指定
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];

// 文字列からNSDateオブジェクトを生成
NSDate *fromFormatDate = [dateFormatter dateFromString:@"2014/03/18 00:00:00"];

// 特定の日付から未来の時間（5分後）
NSDate *futerDate = [fromFormatDate initWithTimeInterval:(5 * 60) sinceDate:fromFormatDate];
```


##日付同士を比較する

```objc
NSDate *now = [NSDate date];
NSDate *otherDate = [NSDate dateWithTimeIntervalSinceNow:5.0];

NSComparisonResult result = [now compare:otherDate];

switch (result) {
	case NSOrderedSame:
		// 同一時刻
		break;
	case NSOrderedAscending:
		// nowよりotherDateのほうが未来
		break;
	case NSOrderedDescending:
		// nowよりotherDateのほうが過去
		break;
}
```

##日付同士の差分（経過時間）を取得する

```objc
// anyDateという、以前取得したデータがあるとする
NSDate *now = [NSDate date];

NSTimeInterval delta = [now timeIntervalSinceDate:anyDate]; // => 例えば 500.0 秒後
```
DDSKK+org-modeでM-RETしたときに`▼'がバッファに残る問題を解決

#問題
DDSKK + org-modeでリストを入力しているとき、例えば
`- ▼ためし`
から`SPC`を入力して
`- ▼試し`
となった後に`M-RET`を入力すると
`- ▼試し
 - `
となる。

# 2014年
## 解決
以下を `init.el` などで設定する。

```el
(skk-wrap-newline-command org-insert-heading)
```

##追記
コメントにあるように、最新版では`skk.el`に取り込まれているので新しく設定する必要は無いようです。
@kitamoto さんありがとうございます。

# 2020年

## 再発
数年ぶりにorg-modeを再び使い始めたら同じ症状に遭遇した。

## 解決
`M-RET` にバインドされている関数を調べたら、 `org-meta-return` に変わっていた。

そういう訳で、今度 `init.el`などで設定するのはコレ。

```el
(skk-wrap-newline-command org-meta-return)
```

いたちごっこだなこれ……
Atomプラグインの設定項目を指定する


command + , でAtom用の設定画面が開けます。
そこで、自作したプラグイン用に設定項目を追加しましょう！

## 設定項目を追加

```coffescript：qiita-yoosei.coffee

QiitaYooseiView = require './qiita-yoosei-view'

module.exports =
  qiitaYooseiView: null,
  configDefaults: {
    url_name : "",
    pass : "",
    token : ""
  },
  
  #省略

```

今回は、qiitaのAPIで使うパラメータを設定する事にしました。

url_name
pass
token

この三つです。
configDefaultsに Key Valueで渡すと、Atomの設定項目で表示されるようになります。

設定画面はこんな感じになります。

![スクリーンショット 2014-03-24 9.53.41.png](https://qiita-image-store.s3.amazonaws.com/0/40099/086d42cc-4844-abb2-1765-3499951a7c80.png "スクリーンショット 2014-03-24 9.53.41.png")

ちなみに、Valueの箇所を true, falseにすると、設定画面ないの項目が
テキストボックスじゃなく、チェックボックスになります。

```cofeeScript
configDefaults: {
    is_enable : false
  },
```

## 項目の取得、コード内で項目の値の設定の仕方

取得や設定するには、[Config](https://atom.io/docs/api/v0.75.0/api/)クラスを使います。

```coffeescript

//取得
atom.config.get('qiita-yoosei.token')

//設定
atom.config.set('qiita-yoosei.user', 'johna1203')

```

## 今後の課題
できるかどうかは、まだ未定ですが
パスワード項目には、プレーンテキストじゃなくてパスワードのタイプにして
パスワードを隠したいですね。。。
まだ、やり方がわかりませんが、調べたら書くようにします。
Railsでデータベースを分けてmigrationを実行する方法(+modelとdatabase.yamlの書き方)


## 概要
* 今回の要件は、master slaveを作るのでなく、テーブルを分けたい
* 専用のrakeタスクを作成した
* railsのissueでやり取りがあったけど、古いしバグもありいろいろ直すのが大変だった。。

## rake
* ``lib/tasks``以下に配置
* ``your_engine``には好きな名前で置き換える
* ``rake your_engine:db:migrate``で実行
* (``establish_connection``をmigrationの中で実行すると、migrationのversion管理がうまく動かなくなる。)

``` database.rake
engine = "your_engine_name"

# Run custom task before original task
task 'db:migrate' => "#{engine}:db:migrate"
task 'db:schema:dump' => "#{engine}:db:schema:dump"
task 'db:schema:load' => "#{engine}:db:schema:load"

engine_namespace = namespace engine.to_sym do
  namespace :db do
    @engine = engine
    desc "Migrates the #{engine} database"
    task :migrate => :environment do
      p "#{engine} db migrate"
      with_engine_connection do
        ActiveRecord::Migrator.migrate("#{File.dirname(__FILE__)}/../../db/#{@engine}_migrate", ENV['VERSION'].try(:to_i))
      end
    end

    desc "Dump #{engine} schema"
    task :'schema:dump' => :environment do
      require 'active_record/schema_dumper'

      with_engine_connection do
        File.open(File.expand_path("../../../db/#{@engine}_schema.rb", __FILE__), 'w') do |file|
          ActiveRecord::SchemaDumper.dump ActiveRecord::Base.connection, file
        end
      end
      engine_namespace['db:schema:dump'].reenable
    end

    desc "Load #{engine} schema"
    task :'schema:load' => :environment do
      with_engine_connection do
        load File.expand_path("../../../db/#{@engine}_schema.rb", __FILE__)
      end
    end

    # Hack to temporarily connect AR::Base to custom database engine.
    def with_engine_connection
      original = ActiveRecord::Base.remove_connection
      ActiveRecord::Base.establish_connection "#{@engine}_#{Rails.env}".to_sym
      yield
    ensure
      ActiveRecord::Base.establish_connection original
    end
  end
end
```

## ついでにモデルとdatabase.ymlの設定

### Model

```
class YourModel < ActiveRecord::Base
    establish_connection "your_engine_#{Rails.env}".to_sym
end
```

### database.yml

```
your_engine_development:
  adapter: 
  database:
  encoding:
  username:
  password:
  host:
```

## 参考
* https://github.com/rails/rails/issues/3497
    * 微妙に書いてあるコードにバグがあった
* statac overflow等にあったのはあまり役に立たなかった。。
    * http://stackoverflow.com/questions/12021715/rails-migration-establish-connection-creates-table-in-wrong-database
    * http://d.hatena.ne.jp/kanbayashi/20070319/p5
Windowsユーザもできる！iOSアプリの対象OSを判別

#はじめに
projectファイルに含まれるターゲットOSの記述と
ipaにしてからバージョンを確認する方法です。
Xcode ArchiveからOrganizerに取り込んでも分からないし。
###みんながみんなMac使いじゃない！なことがあります。
windowsの方でも確認が出来るようなメモです。

#ipaをビルドする前に確認

プロジェクトファイルから判別できます。
#ビルド環境
 - Xcode5.1

##xcodeproj
Macだと`パッケージの中身を表示`で中身がみれます。
Windowsだとフォルダになっているはず
ここに`project.pbxproj`というファイルが見つかります。
##project.pbxproj
使い慣れたエディタで開いてみましょう。

```
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 46;
	objects = {
(略)

		6759B4E718D9825300FE702B /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
				GCC_PRECOMPILE_PREFIX_HEADER = YES;
				GCC_PREFIX_HEADER = "IconCheck/IconCheck-Prefix.pch";
				INFOPLIST_FILE = "IconCheck/IconCheck-Info.plist";
				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
				PRODUCT_NAME = "$(TARGET_NAME)";
				WRAPPER_EXTENSION = app;
			};
			name = Debug;
		};

```
ここにある`IPHONEOS_DEPLOYMENT_TARGET`がtargetOSの記述になります。
上記では省いていますが、debugとreleaseの記述がありました。
#ipaをビルドした後に確認
##ipaをほどく

 1. ipaファイルの拡張子をzipに変更し解凍
 2. Payloadフォルダにappファイルが含まれる形で展開される
 3. appファイルを右クリックし、`パッケージの内容を表示`を選択
 4. info.plistを見つけて開く

##plistをみる
Macの人は簡単です。
Xcodeをダウンロード！インストール！無料版でいいので！
plistの編集ができるエディタが使えます。

Windowsの人にとって、たぶんここが一番ネックでしょう！
有料ツールしか出てこない・・・
ProjectファイルからtargetOSを探すのが一番簡単なような気がします。

###対象のOSの記述は
```
MinimumOSVersion
```
というところが対象とする一番下位のOSバージョンになります。
このinfo.plistは、開発者が通常Xcodeで見ている情報以外もビルド時に追加されていて、みていて興味深いです。

#さいごに
個人的には、Appleへipa:バイナリ提出後に、iTunes ConnectからbinaryDetail確認する方法が一番楽だし、確実です。
間違ったらバイナリリジェクトすればいいし。
Capybara RSpecでのマッチャ、セレクタ 「こんなときどうするの」その1


TDDやってますか？必須と言われつつも、なかなか習慣にするまでは時間かかりますよね。
本質的に 入力と評価したいものに集中できるよう、覚える必要があるマッチャとセレクタは、とっとと覚えられるようにしたいですね。


##HTML要素の属性を評価したい
xpathでの記法とcssでの記法両方が使えますが、おそらく皆さんがなじみ深いのは(jQueryセレクタでよく使う) cssでの記法だと思いますので、そちらに集中して掲載します。

###自分が楽だと思った方法
とりあえず、findに入れて、テキストが返ってくる状態にしてから、シンプルなマッチャで評価する。
have_css とか have_xpath とかで評価したいものを表現するよりも、書くのが早い気がする。

```_spec.rb
find('#my_element')['class']
find('a#my_element')['href']
```

###他のやり方

```_spec.rb
expect(page).to have_css "a.my_link.disabled"
expect(page).to have_css "a.my_link[disabled]"

#要素の属性の値も評価したい場合
expect(page).to have_xpath "//a[@class='my_link' and @disabled='disabled']"
```

参考
http://stackoverflow.com/questions/5153550/capybara-assert-attributes-of-an-element

##おまけ
CapybaraとSelenium Remote Webdriverを使っているときに、HTMLを保存してくれるLaunchyは起動しませんでした。せめて画像だけでも．．という方は、以下の方法で Capybaraさんがスクショ取ってくれます。

```_spec.rb
page.driver.browser.save_screenshot "保存したい画像ファイル名.png"
```

スクショは、RSpecを走らせているルートディレクトリに保存されるようです。
商用iBeaconを探してみる「きてみてガチャって！」

ご無沙汰していました。今回も、商用ビーコンを探してみるという旅です。

本日、『iBeaconを利用したauショップ来店促進アプリ「きてみてガチャって！」をリリース』っていうニュースが出ました。(http://ysci.jp/info/2014/detail_98.html)

早速、　auショップ高田馬場店に行ってきました。

いつもどおり、iBeacon Detectorで、iBeaconの信号が吹いていることを確認！

![Screenshot_2014-03-24-19-25-32.png](https://qiita-image-store.s3.amazonaws.com/0/33220/0c653049-4fa6-e8d0-6286-62d242ef8a30.png)

一応、UUIDとか、Major,Minorの値は隠しておきます！

もちろん、ビーコンを受信しているので、iPhone 5Sの画面上には！

![IMG_1721.PNG](https://qiita-image-store.s3.amazonaws.com/0/33220/1e19869e-c660-ab95-da77-59195bb98482.png)

って通知出ているので、開いてみると

![IMG_1722.PNG](https://qiita-image-store.s3.amazonaws.com/0/33220/cd587af5-fada-eb70-3b1f-864beab6172e.png)

ガチャチケットを入手することができました！

５００円のiTunesギフトを得るためには、あと最低２回お店に行かなければならないのが欠点ですが、もらえるといいなあ〜！

期間限定のサービスみたいなので、みなさんも体験しましょう！

商用のビーコン情報お待ちしています！
cocos2dx - jsbindings/html5 でjsonでプロパティをまとめて設定

spriteを作る例。以下のattr命令で。

```JavaScript:hoge.js
this.sprite = cc.Sprite.create(res.HelloWorld_png);
this.sprite.attr({
    x: size.width / 2,
    y: size.height / 2,
    scale: 0.5,
    rotation: 180
});
this.addChild(this.sprite, 0);
```

参考
http://www.cocos2d-x.org/news/192

注意
c++とluaの「cocos-2dx 3.0 rc」といっしょに出た「Cocos2d-JS v3.0 alpha」からです。
多分js版だけです。
ブラウザ毎にStyleを変える方法

モダンブラウザで切り分ける事ってあまり無いかもしれませんが、
厳密に切り分ける必要があるならこのやり方がいいと思いました。

属性セレクタが効くブラウザなら使えるはずです。

- ブラウザの種類（バージョン指定も可）
- OS
で切り分けできます。

1. JavaScript経由でhtml要素にユーザエージェント文字列を属性値として設定
`var b = document.documentElement; b.setAttribute('data-useragent', navigator.userAgent); b.setAttribute('data-platform', navigator.platform);
`

2. HTMLタグがこのようになる
`<html lang="ja" data-useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0" data-platform="Win32">
`

3. 属性セレクタで指定
`html[data-useragent*='Firefox']{
color: blue;
}
`
バージョン指定する場合
`html[data-useragent*='Chrome/27.*']{
color: blue;
}gator.platform);
`

**注意点は**

- JavascriptがOFFの場合は効かない
- ユーザエージェント変えるとcssも変わってしまう
- SafariとChromeのcss両方書く時はSafariを先に書く
- IE6は効かないのでCSSHackで対応
lua5.2.3をhomebrewでインストール（Mac）

```
$ brew tap homebrew/versions
```

```
$ brew search lua
lua	  lua52	    luabind   luajit	luarocks  metalua
```

```
$ brew install lua52
==> Downloading http://www.lua.org/ftp/lua-5.2.3.tar.gz
######################################################################## 100.0%
==> Patching
patching file Makefile
patching file src/Makefile
==> make macosx INSTALL_TOP=/usr/local/Cellar/lua52/5.2.3 INSTALL_MAN=/usr/local/Cellar/lua52/5.2.3/share/man/man1
==> make install INSTALL_TOP=/usr/local/Cellar/lua52/5.2.3 INSTALL_MAN=/usr/local/Cellar/lua52/5.2.3/share/man/man1
?  /usr/local/Cellar/lua52/5.2.3: 12 files, 276K, built in 4 seconds
```

```
$ lua -v
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
```
Laravel4 で update_at や create_at を変更させる


わからんからソース見たら、あっさり解決する系。

他のプロジェクトで別フレームワークを使っている時、create_atやupdate_atのカラム名が違う場合の対処法。


```app/model/Test.php
<?php

class Test extends Eloquent {
	/**
	 * The name of the "updated at" column.
	 *
	 * @var string
	 */
	const UPDATED_AT = 'update_time';

	/**
	 * The name of the "created at" column.
	 *
	 * @var string
 	 */
	const CREATED_AT = 'create_time';



} 
```


その他にも `delete_at` ってあるんだけど、これ何に使うんだ？
Fess(MySQL版)のrpmをCentOS6.5へインストール

##概要
FessのMySQL版をrpmでCentOS6.5へインストールした手順

##導入環境
* OS - CentOS6.5
* Java - Java7 7u25
* MySQL - 5.1.73

##下準備
#####JAVA
環境変数にセットされているか確認
`# echo $JAVA_HOME　/usr/java/default`

#####MySQL
my.cnf内の[mysqld]に以下を追加する。
なお、[mysqld]に記述する内容はMySQLのバージョンによって異なる。
```character-set-server = utf8　# mysql 5.5 以降
default-character-set = utf8  # mysql 5.1以下```
`# vi /etc/my.cnf`

```vim:my.cnf
[mysqld]
default-character-set=utf8 #追加
max_allowed_packet=10M #追加
```

PacketTooBigExceptionが発生するのでmax_allowed_packetが必要。
設定後、MySQLを再起動する。
`# /etc/init.d/mysqld restart`

#####グループとユーザーを作成
```# groupadd fess
 # useradd -d /opt/fess -m -g fess fess```


##Fessのインストール

###fess-server-mysqlをインストール
#####fess-serverをダウンロード
fess-server-mysql-9.1.0.noarch.rpm[14/3/17]
http://sourceforge.jp/projects/fess/releases/

#####fess-server-mysqlをインストール
`# rpm -ivh fess-server-mysql-9.x.y.noarch.rpm`

#####MySQLの設定
FessとS2RobotのDBが作成されます。MySQLのrootのパスワードを聞かれます。
再インストールなどする場合はuninstall.shを実行して既存のDBを削除します。
`# /opt/fess/extension/mysql/install.sh`
```Please enter a new DB password(search server)>
パスワード入力
Please enter a new DB password(crawler)>
パスワード入力
MySQL(root) Password:
パスワード入力
Creating DB on MySQL...Created.
Creating tables... Created.```
#####Fessの起動
`#./bin/startup.sh`

#####サービスへの登録
Fessをサービスへ登録します。
`# chkconfig fess on`
起動と停止
```# service fess start
 # service fess stop```
または、
```# /etc/init.d/fess start
 # /etc/init.d/fess stop```


##ブラウザアクセス
#####Fessの管理画面にログイン
管理: http://hostname:8080/fess/admin/ (・管理者パスワードの部分 - http://fess.codelibs.org/ja/9.0/install/install.html)

#####検索画面
検索: http://hostname:8080/fess/

##アンインストール
```
# /opt/fess/extension/mysql/uninstall.sh
MySQL(root) Password:
パスワード入力
Dropping DB on MySQL...Dropped.
# rpm  -e `rpm -qa|grep fess-server`
```

/opt/fess 削除(インデックス等が残ります)
` #rm -rf /opt/fess/`
VirtualBox+VagrantでphpMyAdminを動かすまで

# virtualBoxのインストール

[ダウンロードサイト](https://www.virtualbox.org/wiki/Downloads)

基本デフォルトのまま

途中、OracleのUSB、ネットワークサービス？も
一緒にインストールするか聞かれたが、すべてyes

# vagrandのインストール

[ダウンロードサイト](http://downloads.vagrantup.com/)
普通にインストール完了

**★PC再起動**    


コマンドプロンプトで実行

```
> vagrant -v
```

## box ファイルのインストール  
Providerが「VirtualBox」で最新のCentOSを取得

[ダウンロード](https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box)

コマンドプロンプトで実行

```shell-session
> vagrant box add centos64 
```

# Vagrantfile の作成、初期化

フォルダ作成
C:\workspace\vagrant

```
> vagrant init centos64
> vagrant up
```

サーバーが立ち上がる


## 仮想サーバーにログイン

windowsでは vagrant sshが使えないのでpoderosaでログイン

|項目|初期値|
|:---|----:|
|ホスト|127.0.0.1|
|ポート|2222|
|アカウント|vagrant|
|パスワード|vagrant|
|認証方法|パスワード|

# httpd+phpインストール

サーバで実行
インストール(サーバで実行)

```
$ sudo yum -y install httpd
$ sudo yum -y install php
```

* サービス開始

```
$ sudo service httpd start
```

* iptables設定(無効に)

```
$ sudo chkconfig httpd on
$ sudo service iptables stop
$ sudo chkconfig iptables off
```

## ブラウザで接続

* Vagrant fileの編集(IPアドレスとホスト名設定)

```
config.vm.hostname = "my.localhost"
config.vm.network :private_network, ip: "192.168.33.10"
```

コマンドプロンプト

```
> vagrant reload
```

ブラウザでアクセスできる
http://192.168.33.10


# mysqlのインストール

[ダウンロードサイト](http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/)


必要なライブラリを取得

* MySQL-shared-compat-5.6.16-1.linux_glibc2.5.x86_64.rpm
* MySQL-server-5.6.16-1.linux_glibc2.5.x86_64.rpm
* MySQL-client-5.6.16-1.linux_glibc2.5.x86_64.rpm

```
$ sudo yum localinstall MySQL-shared-compat-5.6.16-1.linux_glibc2.5.x86_64.rpm 
$ sudo yum localinstall MySQL-client-5.6.16-1.linux_glibc2.5.x86_64.rpm 
$ sudo yum localinstall MySQL-server-5.6.16-1.linux_glibc2.5.x86_64.rpm 
$ service mysql start
```

erro 12が出る

* エラーはメモリ確保失敗
* swapが0なのが原因のようです。


* スワップ領域の確保

```
$ dd if=/dev/zero of=/swapfile bs=1M count=1024
$ mkswap /swapfile
$ swapon /swapfile
```

上記だけだと再起動すると消えるので  /etc/fstabを編集

```
$ sudo vi /etc/fstab
$ /swapfile swap swap defaults 0 0 
```

* 確認

```
$ free
```

* mysqlスタート

```
 service mysql start
```

うまくいった

* MYSQLの初期パスワード

```
$ cat /root/.mysql_secret
The random password set for the root user at Thu Feb  7 14:24:54 2013 (local time): XXXXXXXX
````

* XXXXXXのところがパスワード

* パスワード変更

```sql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('');
mysql> FLUSH PRIVILEGES;
```

# phpMyAdminのインストール

[ダウンロード](http://www.phpmyadmin.net/home_page/index.php)

* zipをworkspaceで解凍(フォルダ名をphpMyAdminにしておく)
* ドキュメントルートにphpMyAdminを置く

httpd.conf →　php.ini編集

参考にさせていただいたサイト
http://www.webcyou.com/?p=4703

* php-mbstring php-mysqlをインストール

```
$ sudo yum -y install php-mbstring php-mysql
```


* httpdリスタート

```
$ sudo service httpd restart
```


* アクセス
http://192.168.33.10/phpMyAdmin/


phpMyAdminに接続できた
FreeBSD 10.0にVirtualBox-Guest Additionsを入れて使う

FreeBSDにVirtualBoxを入れる。今回は全部pkgでやる

```
pkg install virtualbox-ose-additions
```

これでX.orgまで全部インストールされる。

あとはお好みでウィンドウマネージャをインストールする。


`Xorg -configure`でxorg.conf.newを生成させる。
このときxorg.confの Identifier "Mouse0"のところを次のように書き換える。
これで制御キーを押さなくてもホストOSとマウスが連携される。

```
Section "InputDevice"
        Identifier "Mouse0"
        Driver "vboxmouse"
EndSection
```

画像ドライバのところは書き換えなくても自動生成の時に付け加えておいてくれるみたい。

rc.confに次を追加

```
vboxguest_enable="YES"
vboxservice_enable="YES"
```

あとXorgを初めて入れたときはhaldとdbusdをenableにする。

なんらかの理由でntpdateを落としているときは次も追加

```
vboxservice_flags="--disable-timesync"
```

.xinitrcに次の一行を追加する。これでシームレスモードの有効化，ウィンドウの自動リサイズ，クリップボードの共有が可能になる。

```
VBoxClient-all
```

rebootをかける。

ちゃんと設定ができていればxinitでHappyになれる。

ちなみにちゃんと設定されていてもなぜかバージョンによってはダメだったりするときもある。（今は解消されたみたい）

###2014/08/01追記
当時は上記で出来たが，現在は場合によって解像度自動設定がコケるときがある。
コケる時はXorg -configure　の際にビデオカードドライバがvesaになってしまう。のでxorg.conf該当箇所を下記の様に上書きするとよい。

```
Section "Device"
        Identifier "Card0"
        Driver "vboxvideo"
        VendorName "InnoTek Systemberatung GmbH"
        BoardName "VirtualBox Graphics Adapter"
        BusID "PCI:0:2:0"
EndSection
```

要はDriver "vesa"をDriver "vboxvideo"に書き換えるだけ。
PostgreSQLで実行されたSQLをログ出力する方法

PostgresSQLで実行したSQLをログ出力する設定手順です。
プログラム経由でDBアクセスしている箇所の挙動がおかしいな、という時や
ORマッピングフレームワークで最終的にどんなSQLが何回発行されてるの？
という時に役立つかもしれません。

#環境
* OS：Windows7
* PostgresSQL：9.3
* pgAdmin：1.18.1

#手順
###1. postgresql.confを開く###
postgresql.confはPostgreSQLのインストールフォルダ＞data の下にあります。
pgAdminのバックエンド構成エディタを使う場合、
　ファイル＞postgresql.confを開く
で対象となるファイルを選択します。
![edit_conf_bk.PNG](https://qiita-image-store.s3.amazonaws.com/0/39547/bcc439cb-32a3-9f94-6c50-7cd7389312e2.png)

###2. パラメータ：log_statementの値を変更する###
![log_statement.PNG](https://qiita-image-store.s3.amazonaws.com/0/39547/3d25961f-8e8f-bbb3-5564-13431926c03e.png)

| 値 | 意味 |
|:-----------|:------------|
| none|ログに記録しない|
| ddl|CREATE、ALTER、およびDROP文といった、データ定義文を全てログに記録する|
| mod|全てのddl文に加え、INSERT、UPDATE、DELETE、TRUNCATE、およびCOPY FROMといった、データ変更文をログに記録する|
| all|全てのSQL文をログに記録する|
　※allを設定してもSQLに構文エラーがある場合は記録されない

###3. postgresSQLを再起動する###

###4. ログが文字化けする場合###
パラメータ：lc_messagesの値を変更する
* 変更前：Japanese_Japan.932
* 変更後：ja_JP.UTF-8　または　en_US.UTF-8

　※デフォルト値はinitdbを使用してデータベースクラスタを作成する時に実行環境のロケール設定に従って設定されている

![lc_messages.PNG](https://qiita-image-store.s3.amazonaws.com/0/39547/99c188e5-600a-1840-757a-a9639224ccc7.png)
よく使うnpmまとめ


個人的によく使うnpmのメモです。

## async

- Github: https://github.com/caolan/async

### 概要

非同期処理を、順次処理にするモジュールです。一連の処理を直列で実行させたり、平行して実行させて最後で同期を取るなど、色々なケースで使えます。
callback関数地獄になったコードがスッキリ書けますが、個人的な経験から言うとcallback関数地獄になるのはそもそもの書き方が良くない場合もあるので注意です。

### 使用例

```javascript
// githubから引用
// https://github.com/caolan/async

async.series([
    function(callback){
        // do some stuff ...
        callback(null, 'one');
    },
    function(callback){
        // do some more stuff ...
        callback(null, 'two');
    }
],
// optional callback
function(err, results){
    // results is now equal to ['one', 'two']
});
```

## cheerio

- Github: https://github.com/MatthewMueller/cheerio

### 概要

サーバサイドでjQueryちっくなDOM操作を行えるモジュールです。jQueryに慣れていればすごく便利です。
用途としては主にHTMLの解析（スクレイピング）に使っています。HTMLの生成にも使えますが、その場合はtemplateエンジン（ejsとかectとか）を使うので、使ったことはありません。

### 使用例

```javascript
var cheerio = require('cheerio');
var $ = cheerio.load(body);	// httpレスポンスのbodyだと思ってください

$("a").each(function(){
	// aタグのhrefの値を順次取り出す。
	var url = $(this).attr("href"));
});
```

## passport

### 概要
[Node.js+Express+Passportで認証情報をセッションに保存する方法](http://qiita.com/bisque33/items/c5080daf8bc3bc10efb5)にも書きましたが、node.jsでAuth認証を実装するための決定版的なモジュールです。

### 使用例

```javascript
// 公式のガイドから引用
// http://passportjs.org/guide/facebook/

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://www.example.com/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOrCreate(..., function(err, user) {
      if (err) { return done(err); }
      done(null, user);
    });
  }
));
```

## cron

### 概要
定期的にスケジュールされたタスクを実行したい時に使います。
スケジュールの指定方法はLinuxのcronサービス（crontab）と同じように書けます。

### 使用例

```javascript
var CronJob = require('cron').CronJob;

var cronJob = new CronJob({
	cronTime: "00 00 00 */7 * *",	// 7日間隔で実行

	onTick: function() {
		// ここに処理を書く
	},
	start: false
}).start();
```

## moment

- Moment.js: http://momentjs.com/

### 概要

日時に関することをやってくれる便利なモジュールです。JavaScriptは日時の処理があまり便利ではないので、このようなモジュールを使うと便利です。とにかく機能が充実しています。

### 使用例

```javascript
var moment = require('moment');
var date = Date();
var WEEK = ["日", "月", "火", "水", "木", "金", "土"];

moment(date).format('YYYY-MM-DD');	// '2014-03-19'
WEEK[moment(date).format('e')];	// '水'
```

## request

### 概要

httpリクエストを行うためのモジュールです。メソッドやパラメータの指定が細かく設定できます。

### 使用例

```javascript
var request = require('request');
request({url: url}, function(error, response, body) {
	if(error || response.statusCode != 200){
		return callback(error);
	}
	return callback(null, body);
});
```
ガウシアンフィッティング

# 正規分布とそのフィッティング

すでに何度か登場している[線形回帰](http://qiita.com/ynakayama/items/d6e8513791b43f18d28b)ではデータの分布にフィットする線の理論式を最小二乗法にて求めました。線形回帰など[今までに登場](http://qiita.com/ynakayama/items/e41f592ad7fe02f23c1c)したさまざまな分析の多くで正規分布が仮定されます。

フィッティングに欠かせない手法とも言える最小二乗法は、プロットされたデータを理論式にフィッティングさせることによって理論式中に含まれる定数がいくらであるか、そこからさまざまな情報を得ることができます。たとえば各点にフィットする直線の傾きを求めたいとき、正規分布を仮定する分布の統計量を求めたいときなど色々な場面で使われます。

**正規分布 (normal distribution)** はまたの名を **ガウス分布 (Gaussian distribution)** と言い、平均値の付近にピークが集積するデータの分布を表した連続変数に関する確率分布であることは[過去の記事](http://qiita.com/ynakayama/items/e41f592ad7fe02f23c1c)でも説明しました。正規分布に対する近似曲線（フィッティングカーブ）の関数を求めることをガウシアンフィッティングと言います。例によって [SciPy](http://www.scipy.org/) の強力な数学関数を駆使することでガウシアンフィッティングは容易に実現できます。

## 正規分布に近似したサンプルを得る

まずは正規分布に近似したサンプルを求めます。次のように 100 を平均とした 500 件のデータを生成します。

```py3
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt
import pylab as plb

# 正規分布に近似したサンプルを得る
# 平均は 100 、標準偏差を 1 、サンプル数を 500 とする
sample = norm.rvs(loc=100,scale=1,size=500)

print (sample) # =>
#[ 101.02975418   99.95689958  100.8338816    99.32725219  101.50090014
#   99.29039034  101.64895275  100.45222206  100.22525394   98.8036744
#  100.73576941   99.32705948  100.52278215  102.38383015   98.28409264
#   99.22632512  100.84625978   99.69653993  100.9957202    97.97846995
#   99.49731157  100.89595798  101.3705089   101.15367469  100.26415751
#   99.14143516  100.21385338   99.69883406   99.68494407  100.70380005
#  100.73544699  100.3434308    99.50291518   99.61483734  100.92201666
#  100.98639356  100.36362462   98.39298021   98.39137284  101.54821395
#  100.2748115   100.78672853   99.79335862   98.8123562   100.57942641
#  100.03497218   99.98368219  100.45979578   99.32342998   98.08908529
#  ...
```

## フィッティングと可視化

フィッティングは 1 つのメソッドですみます。

```py3
param = norm.fit(sample)

print (param)
# => (99.92158820017579, 1.0339291481971331)
```

パラメータが求まりましたのであとはこれをプロットすれば OK です。

```py3
x = np.linspace(95,105,100)
pdf_fitted = norm.pdf(x,loc=param[0], scale=param[1])
pdf = norm.pdf(x)
plt.figure
plt.title('Normal distribution')
plt.plot(x, pdf_fitted, 'r-', x,pdf, 'b-')
plt.hist(sample, normed=1, alpha=.3)
plt.show()
plt.savefig("image.png")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/aa0e1e43-659a-547e-9c7d-ee3c27b8943e.png)

うまくいきました。

最小二乗法を使って工学上などの問題を解析した例などは枚挙に暇がありません。また、正規分布を仮定したモデルでその前提がゆらぐとデータ分析工程が台無しになりますので、確率分布や検定についてよく理解しておくことが大切です。