OmniAICreator/Qiita-1.07M huggingface dataset:
iOS8向けEnterpriseAppに潜む罠


##EnterpriseAppのアップデート機能
EnterpriseAppはAppStoreのアップデート機能に対応していないためこちら側で実装する必要があります。
そこで、強制アップデード機能などを実装することなどもあるかと思いますが、ココに罠が潜んでいます。

##アップデート機能に潜む罠
実はiOS7端末でインストールしたEnterpriseAppをiOS8にしてからアップデートするとインストールが失敗することがあります。（というか失敗します）

インストールページに貼り付けるリンクは以下のように作るのですが、

```
<a href="itms-services://?action=download-manifest&url=itms-services://?action=download-manifest&url=http:/oursite.com/myApp.plist" id="text">
```

aタグをタップしてもタップしても「http:/oursite.comからインストールします」的なアラートは出るのですが **一向にインストールが始まる気配がない**かと思います。


しかも、一旦アプリを削除しようものなら **二度と画面にアプリが現れることはありません**。

「えっ、どういうこと！？」と驚かれる方も居るかもしれません。（僕はとても驚きました）

##解決法
以下のページが参考になりました。

- [Unable to install app from web on iOS 8](http://apple.stackexchange.com/questions/147733/unable-to-install-app-from-web-on-ios-8)
- [Enterprise App Update Distribution on iOS 8](http://stackoverflow.com/questions/25772664/enterprise-app-update-distribution-on-ios-8)

簡単に言うと、
**iOS8用のplistを用意しとくといいよ**。
ってことみたいですね。

具体例として、既存のサーバーにおいてあるEnterpriseAppのplistの
BundleIdentifier（com.oursite.myApp）のStringを少し改変したものをiOS8用にもう1つ作って下さい。

```
<key>bundle-identifier</key>
<string>com.mycom.MyApp</string>
<key>bundle-version</key>
<string>0.2.2</string>
```
を

```
<key>bundle-identifier</key>
<string>com.mycom.MyApp.ios8fix</string>
<key>bundle-version</key>
<string>0.2.2</string>
```

的に改変すればいいみたいです。（僕はこれでできました）

ココではダウンロードの際に監視するplistに記載されているBundleIDを偽装しているようです。
インストール後はローカルのBundleIDを見るので、アプリが複数インストールされるという自体にはならずに済みます。


##新たな問題
上記の方法はあくまでも一時的に対処するためのものです。
社内のiOS7ユーザーがiOS8用に作ったplistを利用してインストールした後にiOS8にアップデートしたら同様の問題が生じます。

**「社内の端末のバージョンは勝手に上げるな」**と大きな声で言うのが一番の解決策なのかもしれないですね。

周知と検証は徹底すべきと痛感した次第です。
Facebookの特定のユーザーの友人数を取得する（だけ）PHP


## 0.前提
Facebookのプライバシー設定にて友人リストを公開する設定していないユーザーは取得できません。。
詳細は後述

## 1.アプリ登録
FQLを使用するためアプリ登録してApp ID、App Secretの値をメモる

参考：
[Facebook アプリを作成する方法](https://help.exacttarget.com/ja/documentation/socialpages/facebook/)

## 2.ライブラリダウンロード

[Facebook PHP SDK](https://github.com/facebookarchive/facebook-php-sdk)
のライブラリを使うのでダウンロード

srcのフォルダのみ（base_facebook.php、facebook.php、fb_ca_chain_bundle.crt）使用する

## 3.実装

App ID、App Secretを以下に打ち込む

### 単数ユーザーの場合
```php
require_once("src/facebook.php");

$facebook = new Facebook(array(
  'appId' => 'xxxx',
  'secret' => 'xxxx'
));

$result = $facebook->api(array(
    'method' => 'fql.query',
    'query' => 'SELECT friend_count FROM user WHERE uid = xxxx',
));

echo $result[0]["friend_count"];
```


### 複数ユーザーの場合
```php
require_once("src/facebook.php");

$facebook = new Facebook(array(
  'appId' => 'xxxx',
  'secret' => 'xxxx'
));


$results = $facebook->api(array(
    'method' => 'fql.multiquery',
    'queries' => array(
        'query1' => 'SELECT friend_count FROM user WHERE uid = xxxx',
        'query2' => 'SELECT friend_count FROM user WHERE uid = xxxx',
    ),
));

echo $results[0]["fql_result_set"][0]["friend_count"];
echo $results[1]["fql_result_set"][0]["friend_count"];
```

以上


　
　
## Facebookプライバシー設定（友人リスト）について
以下より「プライバシー設定編集」をクリック
![スクリーンショット_2014_10_24_12_35-2.png](https://qiita-image-store.s3.amazonaws.com/0/49055/5d228a77-2c63-69b9-4efd-b2e82a313b15.png "スクリーンショット_2014_10_24_12_35-2.png")


　
以下で公開になっていない人は取得できない〜
![スクリーンショット 2014-10-24 15.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/49055/d00c0280-577e-05b3-a720-64ef718cb0f1.png)


## 参考
FQLで関連する複数クエリを実行する
http://qiita.com/cognitom/items/fec2fec6cb3bf5ab0cce

Graph API Explorer
https://developers.facebook.com/tools/explorer
正規表現を解析して可視化してくれるサイト『Regexpra』がやばい


ある正規表現に対して特定の文字列がマッチングしているのを確認してくれるサイトは山のようにあるんだけど、正規表現そのものがどんな文字列を期待しているのか分析・解読してくれるツールってあまりないのよね...(´･ω･`)

例えば
^(a-z|A-Z|0-9){4}$
こんな簡単なものだったらすぐに分かるけど
これが複雑になってくると自分でも頭が？？？状態になってしまいます＞＜

そこでこんなものを見つけました。

<h1>Regexper</h1>
www.regexper.com
正規表現を入力してDisplayボタンを押すとその正規表現が示す内容を図で表示してくれます。


例えば誰かが書いたこんな正規表現で???になるときもあると思いますが

```
^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$
```

メールアドレスをマッチングさせる正規表現ってのは分かるんだけど、この表記でどんな文字列を
期待しているのか分からない場合でもこのツールを通してみると


![結果.png](https://qiita-image-store.s3.amazonaws.com/0/11200/9fb35300-738c-1616-1259-072af694cd83.png "結果.png")

図の見方は左から線を辿って行って分岐があれば好きな所に行けますよーって感じ
そして右まで辿り着くと出てきた文字を繋ぎ合せて文字列を期待している感じ

この場合
Group #1のところは必ず1回は一定の文字を繰り返さなければならないけど、Group #2のところは別に文字は繰り返さなくても問題ないんだ！っていうのが一目で分かります。


あとは表記ゆれとか...
正規表現だけじゃ分からないけどこれなら
画面のキャプチャーを取って人に説明する際に役に立ちそうですねー(･∀･)
日付処理が楽になる！Moment.jsの使い方

## Moment.jsとは
JavaScriptで日付の処理は面倒ですが、いろいろと便利にしてくれるのが、[Moment.js](http://momentjs.com/)です。

### 備考
- Moment.jsは、`ver 2.8.3`で確認
- 2014年10月24日に実施したので、それを元に以下計算されてます

## 基本的な使い方

JSを読み込む

```html
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.2/moment.min.js"></script>
```

以降、script内

```JS
// momentオブジェクトをセット
var m = moment(); //現在の時刻が入る
var output = m.format('YYYY年MM月DD日 HH:mm:ss dddd');

console.log(output); // => 2014年10月24日 11:44:00 Friday
```



## 各単位で出力

```JS
var m = moment();

// 各単位のメソッド
/*
m.year();    // 年
m.month();   // 月 ※ 0〜11の値（始まりが0なので-1で計算）
m.date();   // 日
m.day();    // 曜日
m.hours();    // 時
m.minutes();  // 分
m.seconds();  // 秒
m.milliseconds();  // ミリ秒
*/

console.log(m.year()); // => 2014
```



## 現在の時刻ではなく、指定した日付の場合

```js
// momentオブジェクトをセット
var m = moment("20150101", "YYYYMMDD"); // 第一引数：指定日時、第二引数：フォーマット
var output = m.format('YYYY年MM月DD日 HH:mm:ss dddd');

console.log(output); // => 2015年01月01日 00:00:00 Thursday 
```



## 今日から指定日数まで何日か計算

```js
var output = moment().add(30, 'days').format('YYYY年MM月DD日'); // add第一引数：日数、第二引数：単位   

console.log(output);  // => 2014年11月23日
```

※加算の場合は`add()`、減算の場合は`subtract()`を使う



## 指定日から何日経過したか計算
```js
var output = moment().diff(moment([2014, 4, 1]), "days");

console.log(output);  // => 176
```
もちろん、今日だけじゃなく、AとBの差も計算できます。



## 参考文献
詳しくは以下が参考になります。
※ただし、Moment.jsのバージョンが古いときの記事のため、`add()`など一部仕様が違うため注意。最新仕様は公式サイト参照。

- [Moment.js（公式サイト）](http://momentjs.com/)
- [おすすめライブラリつまみ食い Moment.js](https://app.codegrid.net/entry/momentjs)
- [JavaScriptで日付を扱うならこれ！「moment.js」](http://blog.asial.co.jp/1158)
iOS開発のミチシルベ


# CocoaPods

iOSアプリ開発用のパッケージ管理システム（CentOSでいうyum）
これなしでは、ライブラリをプロジェクトに入れるのが大変過ぎてやってられない。

# CoreData

#### CoreData Tutorial
http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started
#### MagicalRecord Tutorial
http://www.raywenderlich.com/56879/magicalrecord-tutorial-ios

#### CocoaPodsで使えそうなPodの概要と（あれば）イメージの一覧
http://qiita.com/weed/items/5c56d52b812b0a061b4e

MagicalRecord は、Ruby on Railsとかの有名どころのフレームワークで採用されているActiveRecordっていうデザインパターンを実装したO/Rラッパー。

# そもそもActiveRecordってなんや

#### Ruby on Rails の ActiveRecord入門（ドットインストール）
http://dotinstall.com/lessons/basic_activerecord


# NSDate関係

#### ある時点からの相対的な日時を取得する

```Objective-C
NSDate date = [NSDate dateWithTimeIntervalSinceNow:3600]; //現在から1時間後の時刻
```

参考にしたサイト : http://program.station.ez-net.jp/special/handbook/objective-c/nsdate/date-with-time-interval-since-now.asp


# 非同期処理関係

メインスレッド以外で処理を行うのは、ユーザ応答をよくするのに役立つ。ただし、いくつかの処理はメインスレッドで行わなければ上手く行く

メインスレッドに処理をお願いする方法↓
http://iosdevelopmentjournal.com/blog/2013/01/16/forcing-things-to-run-on-the-main-thread/かなかったり、エラーを出したりするので注意が必要。

#### メインスレッドでの操作が必要な例
・UI操作
・データベース操作


# コールバック関数の作り方
http://www.yoheim.net/blog.php?q=20130210
↑のページの「Blockを用いたコールバックを実装する」っていうのが、とてもすっきりしていて良い。

# ステータスバーの文字色を白くする
http://qiita.com/yimajo/items/7051af0919b5286aecfe#2-3
開発用端末を購入したらチェックしておきたい15ぐらいのこと


# はじめに

先日、デバッグ用端末としても使っていた私物のiPhone 6 Plusが初期不良で修理交換となりました。
プログラム技術とは関係ありませんが、端末購入時にチェックしておいた方が良いことを列挙してみたいと思います。

今すぐ使わない機能であっても、将来アプリ開発の際に突如使う可能性もあるでしょうし、各種トラブルは保証期間中に解決しておきたいものです。
（保証期間切れそうな方も是非。）

なお、以下のチェックは製品が正常であるかどうかを保証するためのものではありません。
自己責任でお願いいたします。

# チェック項目

## 付属のイヤホンが壊れていないか？

特にiPhoneを１〜２年おきに買い換えている人の場合、

「イヤホンはとりあえず古いの使っておいて、消耗してきたら新しいイヤホン使おう！」
　　　　　　　　　　　　↓
「いざ新しいイヤホン使おうとしたら片耳からしか音が聞こえなかった。」

**しかも保証期間が切れていた。**

...などという悲劇が起こり得ます（実際にやってしまいました）。

商品が届いたらイヤホンを検品しましょう。

* 両耳からステレオで音が鳴るか？
* 音に変なノイズなどが乗っていないか？
* リモコンのマイクから音声入力は正しく動作するか？
* リモコンの各操作は正しく動作するか？
 * [+][-]ボタンでボリュームが変わるか？
 * 中央クリックで再生／一時停止が行えるか？
 * 中央ダブルクリックで次の曲へ行くか？
 * 中央ダブルクリック長押しで早送りできるか？
 * 中央トリプルクリックで前の曲へ行くか？
 * 中央トリプルクリック長押しで巻き戻しできるか？ 

## タッチを正しく認識しているか？

マルチタッチ含めて、スワイプ、ピンチなどが正しく認識されるか？

## 本体の外部ボタンがすべて正しく動作するか？

* ボリュームボタンが効くか？
* マナーモードスイッチが切り替えられるか？
* 電源ボタンが効くか？
* ホームボタン押下でホーム画面がでるか？
* ホームボタン二回押下でタスク切り替えができるか？
* ホームボタン軽く二回タップで「簡易アクセス」機能が動作するか？
 *  環境設定で簡易アクセス機能が有効になっている必要があります（デフォルト有効）
* ホームボタン三回押下でズームなどを使えるか？（要設定（デフォルト無効））

## 各種センサーは正しく動作しているか？

この辺どうやって検品しよう...

* 指紋認証センサー(TouchID)は正しく動作しているか？
 * 環境設定で指紋の登録だけでも動作するか確認した方がいいです（私のiPhone 6 Plusはこれが故障していた）。
* 加速度センサーは正しく動作しているか？
* 近接センサーは正しく動作しているか？
* 環境光センサーは正しく動作しているか？
* 3軸ジャイロスコープは正しく動作しているか？
* 気圧計は正しく動作しているか？

＊機種によって搭載しているセンサーは異なります。



## Wi-Fiが使用できるか？

これはちょっとハードウェアの故障かどうかを判断するのは難しいです。
ステータスバーにWi-Fiマークが出ているのにも関わらず、パケ詰まりを起こしているような症状を多くの人が訴えています。

参考：
iPhone6 (iOS8)でWi-Fi接続が不安定、遅い場合に試してもらいたい3つの設定
http://keikenchi.com/iphone6-wifi-setting

私の家でも、プレステやmacなどは何の問題もなくWi-Fi通信が行えているのに、iPhone 6 Plusだけがパケ詰まりのような症状を起こしていました。
バッファローに問い合わせたところ、Wi-Fi親機の設定画面で使用するチャンネルを自動から適当に変えると改善される事があるという回答をもらい、実際に試したところ症状が劇的に改善しました。

参考：
電波状態が悪いときの設定方法（チャンネル変更）
http://buffalo.jp/download/manual/html/air851/router/whrg54s/chapter118.html


ちなみに、本当にWi-Fiチップが故障するとコントロールセンターでのWi-Fiボタンがこんな感じになりますので、こうなったらアウトです。

![wifi.png](https://qiita-image-store.s3.amazonaws.com/0/31347/33e87a37-5e28-2a11-152b-134200bdce49.png "wifi.png")

（上の画像はiPhone4Sのものですが、とあるアプリを使っていたところ、発熱が激しく、その熱でWi-Fiチップが故障した模様。）

## Bluetoothが使用できるか？

bluetoothキーボードやイヤホンを持っている場合は、正しくペアリングできるかを試してみましょう。

ただしうまく利用できなかったとしても、iPhoneの故障ではなく単純に対応していないケースもあるようですので、各種商品のレビューや情報収集をしましょう。

## 本体スピーカーから音は正しく出るか？

* 音量はどうか？
* 変なノイズが乗っていないか？

## 本体マイクから音を入力できるか？

スカイプで誰かに掛けてみましょう。

## 電話で会話ができるか？

誰かに掛けてみましょう。
スカイプで会話が正しくできても、電話回線の方はうまくできないケースもあります。

何か問題が起きたとしてもiOS 8.0.1の件もありますので、ハードのせいばかりとは言えませんが。

## データ通信ができるか？

さすがにこれは通常利用で気がつきますね。

## バイブ機能は正しく動作しているか？

１分後にアラーム掛けてみましょう。

## ハードウェアデコード機能が正しく動作しているか？

詳細はよくわかっていませんが、一部の音声や動画はCPUではなくハードウェアを使ってデコードしているらしいですので、適当にmp3やらaacやら動画ファイルやらを再生してみて問題なく再生できることを確認するのが良いかなと。

## GPS機能は正しく動作しているか？

地図アプリを起動してしばらく外を歩いてみましょう。

## カメラが正しく動作しているか？

* リア/フロントカメラで静止画が撮影できるか？
* リア/フロントカメラで動画が撮影できるか？
* フラッシュが効くか？
 * コントロールセンターのライト機能でもいいかな？
* 顔検出ができるか？

## 充電できるか/バッテリーの減りが早すぎたりしていないか？

設定からアプリごとのバッテリー使用状況が見られますので、それらの情報を合わせて判断した方がいいですね。

# おわりに

自分で書いておいてなんですが、とても面倒くさい?
他にもやっておいた方が良いことがあればコメント頂ければ幸いです。
（ドット欠けはあまり話に聞きませんが、修理交換対象になるのかなあ。）
Docker コンテナでマトリックス


![output.gif](https://qiita-image-store.s3.amazonaws.com/0/20833/001a7a48-60b6-2929-5c30-21cc34b78798.gif "output.gif")

Communities meetup Chef, Docker, Openstack, Puppet on pre-event Rakuten Technology Conference 2014 にて Docker, Inc の nathan が demo してたやつ

## REF

* [nathanleclair/matrix_japan](https://registry.hub.docker.com/u/nathanleclaire/matrix_japan/)
* [Cmatrix](http://www.asty.org/cmatrix/)
【メール送信エラー】Net::SMTPAuthenticationError - 534-5.7.14 <https://accounts.google.com/ContinueSignIn ...


メール送信周りでちょっとはまりかけたのでメモ（上記エラー）
[pony](https://github.com/benprew/pony)というgemを使ってSMTPでメール送信をしようとしてました。
サイトからユーザーが申し込みしてきたら、申込完了メールをユーザーに送信するイメージです。

★環境
・Ruby
・pony on sinatra
・Gmailで送信(from @gmail.com)

たぶんRails(ActionMailer)でもあまり変わらないと思います。

普通にドキュメントに書かれてる通り実装すると、

```
Net::SMTPAuthenticationError - 534-5.7.14 <https://accounts.google.com/ContinueSignIn ...
```

というエラーが出てしまいました。
 http://www.google.com/accounts/DisplayUnlockCaptcha 
上記にアクセスして許可すればいいとう記事もありましたが、うまくいかず。

結論をいうと、送信したいGmailアカウントの設定から2段階認証を有効にして、
アプリ固有のパスワードを作り、実装にそのパスワードを組み込むのが手っ取り早いと思います。

![スクリーンショット 2014-10-24 11.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/15031/db138524-1cf8-5048-b4fc-a59ab8496307.png "スクリーンショット 2014-10-24 11.22.22.png")

↑
左上の「2段階認証プロセス」の設定を有効にすると「アプリパスワード」という項目が現れるので設定してください。

以上でうまくいくと思います。

※参考までにponyを使った実装を載せておきます。

```
def send_complete_mail
  # charsetはデフォルトでutf-8なのですが、指定してないと怒られた気がします。
  Pony.mail(
    to: '送信先メールアドレス',
    subject: '件名',
    body: send_mail_body,
    charset: 'utf-8',
    via: :smtp,
    via_options: {
      address: 'smtp.gmail.com',
      user_name: 'アカウント名@gmail.com',
      password: 'アプリ固有のパスワード',
      authentication: :plain,
      domain: 'サイトのドメイン名'
    }
  )
end

def send_mail_body
  # send_mail.erbというファイルを用意しておけばよいです。
  # localsのハッシュでview内の変数に値を渡せます。
  erb :send_mail, locals: {
    hoge: session[:hoge],
    fuga: session[:fuga]
  }
end
```
Githubのtab-sizeが8で見づらい人向け

困ってるひとの [Issue](https://github.com/isaacs/github/issues/170)。

UserStylesheetで良いのですが、
いくつかの Browser Extension があるので、それを使うのも手です。

自分では、「GitHub Tab Size」 を Fork したものをローカルでぐいっと入れていますが、
（[issue, PR用、gist と bitbucket 分を足してる ](https://github.com/tgfjt/github_gist_bitbucket-tab-size)）
さきほど、[Issue](https://github.com/isaacs/github/issues/170) に新しく「GitHub EditorConfig」を見つけたので、これも導入しました。

- [GitHub Tab Size](https://chrome.google.com/webstore/detail/github-tab-size/ofjbgncegkdemndciafljngjbdpfmbkn?utm_source=chrome-ntp-icon)
- [Github Tab Change](https://chrome.google.com/webstore/detail/github-tab-change/ljioaacdegnnenakodladamafjodehnd?utm_source=chrome-ntp-icon)
- [GitHub EditorConfig](https://chrome.google.com/webstore/detail/github-editorconfig/bppnolhdpdfmmpeefopdbpmabdpoefjh/related)
WindowsのAnkiでTeXを使う TeX Live 2014の場合

#Ankiで数式を綺麗に書きたい
Windows7 64bit上のAnkiクライアント。
[公式wiki](http://wikiwiki.jp/rage2050/?2.0%2FLaTeXSupport "LaTeX サポート (LaTeX Support) - Anki日本語マニュアル Wiki*")ではMikTeXを前提にしているが、TeX Live版でもなんとかなった。

#導入手順
[TeX Live 2012をWindows 7 (64bit)環境にインストールしたメモ](http://d.hatena.ne.jp/hyuki/20120915/tex "TeX Live 2012をWindows 7 (64bit)環境にインストールしたメモ")を参考に。

[Installing TeX Live over the Internet - TeX Users Group](http://www.tug.org/texlive/acquire-netinstall.html "Installing TeX Live over the Internet - TeX Users Group")からinstall-tl.zipをDL、展開してinstall-tl-windows.batを実行するだけ。各種ファイルのDLに結構時間を食うので、寝てる間にでもやらせたほうがいい。

パスは自動で通してくれるので、インストールが終わったらコマンドプロンプトから`tex`と`dvipng`が起動することを確かめて準備完了。

**Ankiを管理者権限で起動**しないと画像が生成されなかったので、そこだけ注意。
AutoLayout制約付きのViewを簡単にアニメーションさせる


Masonryを使うとコードでのAutoLayoutの記述が簡単に書けます。

![スクリーンショット 2014-10-24 11.00.55.png](https://qiita-image-store.s3.amazonaws.com/0/32832/8a866aef-1700-0a27-497b-732655a1be0c.png "スクリーンショット 2014-10-24 11.00.55.png")


**view1**には、Storyboardでtop,left,width,heightの制約を設定しており
**view2**には、left->view1から8,top,width,heightはview1と同じになるように設定してあります。

view1に対して、アニメーション処理を実行することでview2も追従することになります。

```objectivec:MAsonryを使ったアニメーション
- (IBAction)actionAnimationButton:(id)sender {
    
    [UIView animateWithDuration:0.3f
                          delay:0
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         [self.view1 mas_updateConstraints:^(MASConstraintMaker *make) {
                             make.top.mas_equalTo(arc4random() % 200 + 100);
                             make.height.mas_equalTo(arc4random() % 200 + 10);
                         }];
                         
                         [self.view layoutIfNeeded];
                     } completion:^(BOOL finished) {
                         
                     }];
}
```
Rubyで「ダーツの旅」と「住所←→緯度経度」助けになるGem作ったわ

### バグの報告は頂いてから24時間以内に直します.

こんにちは.

個人的に使っていたスニペットをGemにしてみました.
（Google Maps APIのラッパーです）

「実家の緯度と経度なんだっけ〜」とか「ダーツの旅したいけどダーツとアレがない」という時に使えると思います.

#とっととデモへ

お好きな様にgemを引っ張ってもらって


    $ gem install gogo_maps

や

    $ echo "gem 'gogo_maps'" >> Gemfile; bundle install

## 住所を緯度経度に変換

```ruby
require 'gogo_maps'

GogoMaps.get_latlng('長野県上高井郡高山村')
# => { lat: 36.6797676, lng: 138.3632554 }

GogoMaps.get_latlng('東急東横線 日吉駅')
# => { lat: 35.5565107, lng: 139.6460026 }

GogoMaps.get_latlng('東京スカイツリー')
# => { lat: 35.7100627, lng: 139.8107004 }
```

### パルテノン神殿とグランドキャニオンの緯度を簡単に比較出来る！！

```ruby
include GogoMaps

get_latlng('パルテノン神殿')[:lat] <=> get_latlng('グランドキャニオン')[:lat]
# => 1
```


## 緯度経度を住所に変換
```ruby
GogoMaps.get_address(35.6549288, 139.7408335)
# => '日本, 〒108-0073 東京都港区三田１丁目２−１７'

# 言語の指定が可能（その他GoogleMapsAPIのオプションは渡せるはず）
GogoMaps.get_address(37.358126, -122.050636, language: :en)
# => '902 Rockefeller Drive, Sunnyvale, CA 94087, USA'
```

## ダーツの旅
```ruby
require 'gogo_maps'

3.times { p 'ジャカジャカジャカ' }
p 'バン！！'

GogoMaps.random
# => 'ロシア 〒628245 ハンティ・マンシ自治管区・ユグラ'
```

note: 海には落ちないようなってます.

## PR待ってます.

https://github.com/Gogogogogogogo/GogoMaps

ネタでも何でも良いです、バグさえなければ大体マージします.
iOS 7のMobileSafariでセレクトボックスをタップするとフリーズする

という不具合に出くわしたので、調べた内容をまとめておく。

# 再現HTML

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no">
<script src="//code.jquery.com/jquery-2.1.1.min.js"></script>
<script>
$(function(){
  var loop = navigator.userAgent.split("").slice(0, 20);
  loop.forEach(function(){
    // そこそこの大きさのtableを作成して追加していく
    $("#contents_main").append(
      "<table border=1>" + loop.map(function(){return "<tr><td>1</td><td>2</td><td>3</td><tr>"}).join("") + "</table>"
    );
  });
  $(".open_select").click(function(){
    $("#contents_main").hide();
    $("#contents_select").show();
  });
});
</script>
</head>

<body style="padding: 10px;">

<div id="contents_main">
<a class="open_select">自分自身のaタグを含むメインコンテンツをhideしつつセレクトを開く</a><br/>
</div>

<div id="contents_select" style="display: none;">
<select><option>セレクトをタップするとフリーズしたりしなかったり</option></select>
</div>

</body>
</html>
```

これで、

1. aタグをタップ ⇒ セレクトボックス表示
2. セレクトボックスをタップ ⇒ フリーズ（そのうち復帰）

という事象が確認できる。

# 事象の特徴

- iOS 8のMobileSafariでは発生しない
- 端末モデルは関係なし、iPhone4, iPhone5 iPhone5c で事象確認
- hideされるメインコンテンツのDOMを大きくするとフリーズする時間が延びる
- 性能のよい端末モデルほどフリーズする時間は短い

レンダリングエンジンによるCPUバウンドな処理が誘発されていると推測。

# ワークアラウンド

aタグのhref属性に`javascript:void 0;`を付与してあげると事象は発生しなくなる。

```
<a class="open_select" href="javascript:void 0;">...</a>
```

# 似たような話、IE 6にもあったな...

- [Proxyとか :: javascript:void(0); で gifアニメ が動かないバク](http://fula.jp/blog/index.php?no=r677)

これはどういう話かというと、aタグのブラウザデフォルト挙動というものがあって、通常は画面遷移とみなすのでDOMに対してページを破棄するような処理が内部で走っているとかどうとか（破棄しているページのgitアニメーションを動かし続ける必要がないから停止させられる、という話）。

# 考察

つまりこういうことだろう。

- aタグのブラウザ内部動作（hrefの有無で変わる）+DOMの変更によりレンダリングエンジン内部処理を行うフラグがセットされる（リフローやらリレンダリング的なやつ、あくまでフラグだけで処理は遅延されている）
- セレクトボックスをタップすることで内部イベントにより結果レンダリングエンジンの処理が走る（iOSのセレクトボックスはレンダリング領域外下方からUIがせり出してくるタイプなのでレンダリングに寄与するでしょう）

# フリーズを抑止する他のHTML記述

なんか変なパターンも見つけた。hideされるコンテンツの外に要素を追加することで挙動が変わる。

```html
:
<body style="padding: 10px;">

<h1>aaa</h1>

<div id="contents_main">
<a class="open_select">自分自身のaタグを含むメインコンテンツをhideしつつセレクトを開く</a><br/>
</div>
:
```

これは依然としてフリーズ事象が発生するが、

```html
:
<body style="padding: 10px;">

<a>aaa</a>

<div id="contents_main">
<a class="open_select">自分自身のaタグを含むメインコンテンツをhideしつつセレクトを開く</a><br/>
</div>
:
````

こうするとフリーズ事象が抑止される。

これも考えてみると、aタグはユーザーイベントに反応しなければいけない要素なので、イベント反応する領域は事前に計算されなければならないはず（そしてそれは関連する全ての要素の表示位置とサイズが計算されなければならないのでリフロー相当の処理が行われているはずだ）。その計算必要有無でフリーズ事象に寄与しているのかなと推測したい。

# まとめ

- href属性のないaタグってそもそも行儀の悪い書き方かもなのでモダンブラウザ全盛の昨今でも気をつけたほうが良さげ
- 実際問題レンダリングエンジンの挙動にそこまで明るいわけではないので間違ってたらツッコミ欲しい
- ブラウザこわい（＞＜）
YosemiteにしたらHomebrewでphpを更新できなかったときの対策

備忘録として残しておきます。

何気なくYosemiteにアップグレードしたら、Apache2.4、php5.5.14になり、
いままでの環境と変わってしまいました。

で、php5.5を最新にしようとしたところ、Homebrewでエラーが発生。
いろいろ調べたところ下記の対応で動作するようになりました。


```
brew uninstall php55
brew cleanup
xcode-select --install
brew install php55
```
Dartにおけるリスト(配列)のインスタンス生成による違い

Dartではリスト(配列)として`List<E>`クラスを用いますが、インスタンス生成の方法によって内部の実装クラスが変化し、挙動に影響します。具体的に言うと、インスタンス生成の時点で、そのリストが「可変長かどうか」でクラスが使い分けられ、可変長でないリストに対して`add()`や`clear()`などのリスト長が変化するメソッドを呼び出すとエラーとなります。

というわけでDartにおけるリストのインスタンス生成方法についてまとめました。なお今回の例ではジェネリクスは省略していますが、本来はつけるべきです。

## 空(長さ0, 可変長)のリスト
単純な可変長配列として使うならこの方法です。

```dart
var list = new List();
```

もしくは

```dart
var list = [];
```

出力結果

```
[]
```

## 空(長さ10, 可変長)のリスト
インデックスが存在するのではじめから`list[0]`等のアクセスが可能になります

```dart
var list = []..length = 10;
```

もしくは

```dart
var list = new List.generate(10, (i)=>null);
```

出力結果

```
[null, null, null, null, null, null, null, null, null, null]
```

## 初期値あり(長さ10, 可変長)

任意の値を入れたいのであれば

```dart
var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
```

インデックスにより導出できる値であれば

```dart
var list = new List.generate(10, (i)=> i);
```

出力結果

```
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

## 空(長さ10, **固定長**)
一つ目の落とし穴がここです。他の言語(例えばJava)ではListのコンストラクタに初期長さを与えるとメモリ確保だけしてくれるような感じですが、Dartで同じことをすると思わぬエラーが出ます。

```dart
var list = new List(10);
```

## 初期値あり(長さ10, **固定長**)

```dart
var list = new List.filled(10, 1);
```

出力結果

```
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
```

ここで2つ目の落とし穴です。`List.filled`は`List.generate`と違い、遅延実行ではなく、与えられたオブジェクトをそのままリストの初期値にします。そのため、参照型のオブジェクトを与えればすべての要素が同一オブジェクトとなります。つまり次のようなことになります。

```dart
var list = new List<List>.filled(2, []);
for (var i = 0; i < 2; i++) {
  list[i].add(i);
}
```

出力結果

```
[[0, 1], [0, 1]]
```

ちなみに、やりたかったことはこうです。

```dart
var list = <List>[[], []];
for (var i = 0; i < 2; i++) {
  list[i].add(i);
}
```

出力結果

```
[[0], [1]]
```

## まとめ

```dart
var list = new List(); // 長さ0, 可変長
var list = new List(10); // 長さ10, 固定長
var list = []; // 長さ0, 可変長
var list = []..length = 10; // 長さ10, 可変長
var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 長さ10, 可変長
var list = new List.generate(10, (i)=>i); // 長さ10, 可変長
var list = new List.filled(10, 0); // 長さ10, 固定長
```

ちなみに`List.from`にはオプション引数に`growable`があるので、これをfalseにすると固定長として生成することが出来ます。
CoreAnimation: TODO: 止め方を調べる


- Windowをゆらす事はできるが止め方がよくわからない

WindowDidLoad() でゆらす:

~~~csharp

	public partial class MainWindowController : MonoMac.AppKit.NSWindowController
	{
	    //....

		public override void WindowDidLoad ()
		{
			base.WindowDidLoad ();

            Shake();
		}
~~~

アニメーションを作ってセットして、 Windowを移動すると揺れる。

~~~csharp
				
        void Shake()
		{
			var key = new NSString (@"frameOrigin");
			var animation = CreateShakeAnimation (this.Window.Frame);
			var animations =  NSDictionary.FromObjectAndKey (animation, key);

			Window.Animations = animations;

			((NSWindow)this.Window.Animator).SetFrameOrigin(
				Window.Frame.Location);	
										
		}
~~~

ゆらすアニメーションの作成

~~~ csharp

		CAKeyFrameAnimation CreateShakeAnimation(
			RectangleF frame, 
			int shakes = 100,
			float swing = 0.02f,
			float duration = 10.0f
		)
		{
			var shakePath = new CGPath();

			shakePath.MoveToPoint(frame.GetMinX(), frame.GetMinY());

			for (int index = 0; index < shakes; index++)
			{
				shakePath.CGPathAddLineToPoint(
					frame.GetMinX() - frame.Size.Width * swing, frame.GetMinY());

				shakePath.CGPathAddLineToPoint(
					frame.GetMinX() + frame.Size.Width * swing, frame.GetMinY());
			}

			shakePath.CloseSubpath();

			return new CAKeyFrameAnimation () {
				Path = shakePath,
				Duration = duration
			};
		}

~~~
突然独自のルートドメインが使えなくなった


herokuにショッピングサイトを構築し、それをムームードメインで取得したドメイン（wwwなどはないルートドメイン　例:www.example.comではなくexample.com）で取得したドメインで運用していた。

かれこれ２年くらい問題なく接続できていたのだが、つい先日（2014/10/20）からアクセスするとheroku のアプリケーションエラー画面が出てつながらなくなった。


取得したドメイン（というかURL）へアクセスするとherokuのアプリケーションエラー画面がでるということで、名前解決は問題なくされている。つまりheroku側で弾いているようだ。

独自ドメインでなくherokuの実態のURL（xxxx.herokuapp.com）でやるとつながるので、やはり独自ドメインからのアクセスを拒否しているように見える。

ググってみると、herokuではルートドメインは簡単には使用できないという情報が結構見つかった。でもいままで２年以上も問題なくつながっていたのはなぜなのか・・・・

とにかくこのままではまずいので、解決方法を探した結果、[heroku で 独自ドメインを使う際の最善策を考えた]
(http://www.workabroad.jp/posts/2002)にたどり着きました。

ここではAWSのサービスのひとつである「Amazon Route53」を使ってルートドメインからサブドメインに転送しようというもの

具体的には http://example.com へアクセスすると http://www.exsample.com へリダイレクトし、実体のxxx.herokuapp.comへアクセスするしくみ。

そのためにドメインを取得したムームードメインで使用するネームサーバーをこの「Amazon Route53」へ向けてあげている。


設定を終えてもすぐには反映されず、３時間くらいヒヤヒヤしたけど無事、つながりました。


でも今まで使えていたルートドメインに突然つながらなくなったのかは未だ不明・・・


しかしAWSってすごいなー




##追記（2014/11/4)
メールのDNSもムームードメインを使っていたので、それもRoute53に以降する必要があった。

これをしないことで、独自ドメインとしてとっていたgmailのアドレスにメールが届かなくなっていた。（しかし送信はできる）

以下を参考に、Route53にMXレコードを設定して完了！

https://angelndxp.wordpress.com/2012/05/28/amazon-route53%E3%82%92google-apps%E3%81%AEdns%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B-%EF%BD%9E%E3%83%A1%E3%83%BC%E3%83%AB%E8%BB%A2%E9%80%81/
Hubot の Help は非同期で読み込まれる

# 追記

下記の問題は `hubot@2.9.3` で解消されました。現在は同期的に読み込まれます。 

# 問題

Hubot の Help の表示をテストしようと `loadHubotScripts` / `load` / `loadFile` しても Help が読み込まれない。

```coffeescript
robot = new Robot(...)
robot.adapter.on 'connected', =>
  robot.load path.resolve(__dirname, '../../src/scripts')
  # この時点では help は読み込まれていない。script 自体は読み込まれているのに！
robot.run()
```

# 解決策

読み込み後、setTimeout などでタイミングをずらす。

```coffeescript
robot = new Robot(...)
robot.adapter.on 'connected', =>
  robot.load path.resolve(__dirname, '../../src/scripts')
  # この無意味に思える setTimeout が重要。
  setTimeout ->
    # ここなら help が読み込まれている。
  , 10
robot.run()
```

# 原因

これは Hubot 本体の実装の不備である。 Hubot スクリプト自体は同期的に `require()` するのに対し、Hubot スクリプトのコメントは `Robot#parseHelp()` 内で `fs.readFile()` で非同期に読み込まれることに起因する。

おそらくタイミングをそろえることが望ましく、両方とも非同期にしてしまい完了を通知するようにするか、両方とも同期的にするかが良いと思う。

ちなみに修正用の PR ( https://github.com/github/hubot/issues/759 & https://github.com/github/hubot/pull/762 )も存在するが、マージされていないので、現状、上記のような解決策が必要になる。

# 参考

- [bouzuya/hubot-script-boilerplate](https://github.com/bouzuya/hubot-script-boilerplate)
    - 同等のロジックを組み込んでいる。

# まとめ

でも、まあ、そんなところを厳密にしたいユーザーはそうそう居ないよね。
IPアドレスがホワイトリストに入っていないときだけDigest認証

参考: [Apache - IPアドレスがホワイトリストに入っていないときだけBasic認証 - Qiita](http://qiita.com/shinichinomura/items/8ecf626f72c795536aa2)

Satisfy ディレクティブを使う。社内からは認証なしにするとか。

## .htaccess

```bash:.htaccess
AuthType Digest
AuthName "Digest Auth"
AuthUserFile "/srv/digestpass"
Require valid-user

Satisfy Any

Order deny,allow
deny from all
Allow from 127.0.0.1 192.168.0.6
```

## htdigest

```bash:digestpassを作成
$ htdigest -c digestpass "Digest Pass" user1
New password:
Re-type new password:
$ cat digestpass
user1:Digest Pass:631f9c4acdb69ac32cc50bec2f538760
```
mailqの削除

# mailqの削除

```bash:キューに残っているメール確認
mailq
```

```bash:キューのデータを確認
sudo /usr/sbin/postcat -q QUEUEID | w3m
```

```bash:個別に削除
sudo /usr/sbin/postsuper -d QUEUEID
```

```bash:一括で削除
sudo /usr/sbin/postsuper -d All
```
【PHP】MySQLに保存しているデータをJSONで吐き出す

# はじめに
iPhoneアプリを作成する際にJSONでデータのやり取りをしようと思っていてWeb上で方法を探していたのですが、情報が古く、PHP5.5.0では非推奨になっている情報しか手に入りませんでした。そこで、現在では非推奨になってはいるものの参考になるサイトを利用してMySQLに保存しているデータをJSONで吐き出せるようにPHPで作ってみました。

# 参考にした記事
* 『[PHPでデータベースから取得したデータを使ってJSONを吐き出してみる](http://webdelog.info/blog/2012/01/12/php-output-json.html)』

上記のサイトは2012.01.12に記述された記事で、記述されていた内容は現在非推奨になっています。
ただし、ほとんどはこちらのサイトの情報をPHP5.5.0に対応できるように変更しただけです。

# サンプルコード
下記に示してる設定ファイル、ファンクション管理ファイル、JSONを吐き出すファイルは今回のために作ったもので、実際に渡しが利用する場合はもう少しセキュリティについて考えて作っていますが、今回は簡易なサンプルとして公開しています。なので、実際に今回のサンプルコードを利用して作成される場合は暗号化などの対策等を自身で施してください。
(＊今回のサンプルコードを利用したことによって何らかの損害が出たとしても私は一切の責任を負えないのをご了承の上ご利用ください。)

***
今回は以下の様なデーターベースが存在していたと仮定して説明していきます。
サーバー名：mysql000.example.jp
データーベース名：_example
ユーザー名：_example
データーベースへのパスワード：testpassword
テーブル名：userInfo

***
『userInfo』内のカラム
|user_id|user_name|user_age|user_sex|
***
『userInfo』内のデータの中身
|user_id|user_name|user_age|user_sex|
|1|sato teru|20|man|
|2|maeda teruko|23|woman|

## 設定ファイル
```php:config.php
<?php
define('DSN','mysql:host=mysql000.example.jp;dbname=_example');
define('DB_USER','_example');
define('DB_PASSWORD','testpassword');
error_reporting(E_ALL & ~E_NOTICE);
```

【変更が必要な点】

* mysql000.example.jp：サーバ名なので自身のサーバ名に変更してください。
* _example：DSNに定義している"_example"はデーターベース名、DB_USERに定義している"_example"はユーザー名なのでそれぞれ自身のデーターベース名およびユーザー名に変更してください。
* testpassword：データーベースにアクセスする際のパスワードなので自身で設定しているパスワードに変更してください。

## ファンクション管理ファイル
```php:functions.php
<?php
function connectDb() {
    try {
        return new PDO(DSN, DB_USER, DB_PASSWORD);
    } catch (PDOException $e) {
        echo $e->getMessage();
        exit;
    }
}
 
```

【変更が必要な点】
こちらのファイルでは特に変更すべき点はありません。

## JSONを吐き出すファイル
```php:json.php
<?php
require_once('config.php');
require_once('functions.php');
 
mb_language("uni");
mb_internal_encoding("utf-8"); //内部文字コードを変更
mb_http_input("auto");
mb_http_output("utf-8");
 
$dbh = connectDb();

$sth = $dbh->prepare("SELECT * FROM userInfo");
$sth->execute();

$userData = array();

while($row = $sth->fetch(PDO::FETCH_ASSOC)){
	$userData[]=array(
	'id'=>$row['user_id'],
	'name'=>$row['user_name'],
	'age'=>$row['user_age'],
	'sex'=>$row['user_sex']
	);
}

//jsonとして出力
header('Content-type: application/json');
echo json_encode($userData);
```

【変更が必要な点】
userInfo：テーブル名です。自身のconfig.phpで指定したデーターベース内で取得したいテーブル名に変更してください。
userData：関数名ですが、jsonで吐き出すものの意味にそうものに変更したほうが後々いいと思いますので、ご自身の判断で変更してください。
user_id、user_name、user_age、user_sex：これらは指定したテーブル内にあるカラムなので自身のテーブル内にある取得したいカラムに変更してください。

***

## 出力結果のサンプル
```
[
  {
    "id": "1",
    "name": "sato teru",
    "age": "20"
    "sex": "man"
  },
  {
    "id": "2",
    "name": "maeda teruko",
    "age": "23"
    "sex": "woman"
  }
]
```
PhpStormを高速化する方法

## PhpStormは意外と重い
PhpStormはeclipse等と比べると速いのですが、sublimeと比べると断然重いです。
幾つかのサイトでPhpStormの動作速度の改善策が出ており、試してみたので書いておきます。

## 改善方法
### 1.PhpStorm へのメモリの割り当てを増やす
以下の記事で紹介されていました。
http://qiita.com/kilhyungdoo/items/ec36cc7d240431c181a1
気持ち早くなったような感じです。
### 2.キャッシュファイルを削除する
メニューの`File->Invalidate Caches & Restart`からキャッシュを削除してPhpStormを再起動する事で動作は軽くなります。
### 3.使わないツールウィンドウを閉じる

超基本的な事かもしれませんが、私にはこれが一番効果的でした。
特に`Project`と`Structure`を閉じただけで、それまで一文字打つだけでもモッサリしていたのがサックサク快適に動作が軽くなりました。
ionic + AngularJSのモバイルウェブ開発環境を構築しました

AngularJSつかったフレームワークionicの環境を、Yeoman + generator-ionicを使って生成しました。環境はubuntuです。

# 準備
事前準備としてnodejsなどはインストール済みです。

```bash:事前準備
npm install -g yo grunt-cli generator-angular
```
恐らく上記のモジュールをインストールしているはずです。

```bash:generator-ionicをインストール
npm install -g generator-ionic
```

# ionicファイルを生成
yoコマンドでionicのファイルを生成します。

```bash:ionicファイルを生成
mkdir ionic
cd ionic
yo ionic
```
yoコマンドを実行すると、生成前にいくつか質問をされますが、cordovaはアプリ用なので今回はspaceを押して外しておきます。
![スクリーンショット 2014-10-24 21.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/1624/beb622de-2ae2-14fa-d1f3-0d1cdb14d504.png)
上記のような画面が表示されます。

初期テンプレートを選択できるので、Side Menuを選択しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/ba24fe55-0364-348b-0840-47fc735b424e.png" width="279" />


# 動作確認
ここまでで、grunt serveしてサーバーが起動すれば成功です。

しかし、ボクの環境ではMultiple addressesの選択画面が出ました。

```bash:サーバーを起動
grunt serve

略

Multiple addresses available.

Please select which address to use by entering its number from the list below:

 1) 10.0.2.18 (eth0)
 2) 192.168.33.11 (eth1)
 3) localhost

Address Selection:  
```
なぜかここで数字が選択できず止まってしまいました＼(^o^)／

vagrantを利用しているせいかと考え、Macでも環境を作ってみましたが、同様にMultiple addressesが表示されました。

ここまでのフローで、Yeomanのyo ionicコマンドでファイルを生成した際に、.ionicディレクトリがユーザーのホームディレクトリに生成されています。.ionicディレクトリには、ionic.configというファイルがあるので、ionicServeAddressを指定します。

```
vi ~/.ionic/ionic.config
{
  "versionCheck": 1414045129210,
  "ionicServeAddress": "localhost"
}
```
versionCheckの項目だけがあるので、ionicServeAddressを追加しました。

再びgrunt serveでサーバーを起動します。

```bash:サーバーを起動
grunt serve

略

Running "ionic:serve" (ionic) task

Running "watch" task
Waiting...Running dev server: http://localhost:8100
```
8100番でサーバーが起動したので、ブラウザから確認します。
ちなみにボクのvagrant環境はlocalhostではアクセスできない指定になっていました。vagrantが192.168.33.11で立ち上がっているので、IPであるhttp://192.168.33.11:8100/ へ直接アクセスして確認しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/4f6a22f7-b3c6-b9f7-39dc-eb39fcee87bc.png" width="219" />
Side MenuがあるionicのUIを、ブラウザから確認することができました。
やったね(☝ ՞ਊ ՞)

# 参考
https://github.com/diegonetto/generator-ionic
http://stackoverflow.com/questions/26328184/ionic-serve-displays-multiple-addresses-and-i-chose-wrong-one-how-to-change-ad/26330536
sorcery 利用時のテストの書き方


まあ wiki にあるとおりなんだけど,

まず fixture や factory で login する user 用意して

```
noam:
  email: whatever@whatever.com
  salt: <%= salt = "asdasdastr4325234324sdfds" %>
  crypted_password: <%= Sorcery::CryptoProviders::BCrypt.encrypt("secret", salt) %>
  activation_state: active
```

以下のように `spec_helper.rb` 内で include.

```
RSpec.configure do |config|
  config.include Sorcery::TestHelpers::Rails::Controller, type: :controller
  config.include Sorcery::TestHelpers::Rails::Integration, type: :feature
end
```

それでテスト内で

```ruby
login_user(user) # login
logout_user
```

という helper method を呼ぶ.
Feature Test での書き方など詳しいことについては Reference のリンクを参照.

## Reference

[Testing Rails · NoamB/sorcery Wiki](https://github.com/NoamB/sorcery/wiki/Testing-Rails)
grunt serve で Warning: Couldn't find the `compass` binary. が出る解決方法

grunt serveをするとcompassがないよってエラーがでます。

```
grunt serve

略

Warning: Couldn't find the `compass` binary. Make sure it's installed and in your $PATH Used --force, continuing.
```
compassが無いだけなのでインストールします。

```bash:compassをインストール
npm install compass
```
今度は問題なくgrunt serveできました。
Yeoman + generator-ionic環境でyo ionicを実行した時に、Please run `yo ionic` in an empty directoryと表示される解決方法

Yeoman+generator-ionicを使用して、ionic環境を作成しました。Yeomanはインストール済みです。

# generator-ionicをインストールして環境構築

```
npm install -g generator-ionic
```
generator-ionicをインストールしました。

# yo ionicを実行
yo ionicを実行します

```
yo ionic

 略

[?] Would you like to use Sass with Compass (requires Ruby)? No
Created a new Cordova project with name "Ionic" and id "com.example.Ionic"
[?] Which Cordova plugins would you like to include? org.apache.cordova.console, org.apache.cordova.device
[?] Which starter template [T] or example app [A] would you like to use? [T] Blank

 略

Installing selected Cordova plugins, please wait.
{ [CordovaError: Current working directory is not a Cordova-based project.]
  name: 'CordovaError',
  message: 'Current working directory is not a Cordova-based project.' }
✗ Please run `yo ionic` in an empty directory, or in that of an already existing cordova project.
```
空のディレクトリ内でyo ionicを実行しろと表示されました。

既に存在したhogeディレクトリの中でyo ionicを実行したのですが、不要なファイルがいくつか合ったので、hogeディレクトリを一削除しました。次に、新たにhogeディレクトリを作成し、ディレクトリの中に移動してからyo ionicコマンドを実行します。

```
cd ../ # hogeディレクトリから出ました
rm -rf hoge
mkdir hoge 
cd hoge
yo ionic
```
今度はエラーが出ず、生成に成功しました。

# 参考
https://github.com/diegonetto/generator-ionic
https://github.com/diegonetto/generator-ionic/issues/47
【iOS】【swift】アルバムへの保存 UIImageWriteToSavedPhotosAlbum

基礎的な話ですが。


保存処理

```swift

// image は UIImage
UIImageWriteToSavedPhotosAlbum(image, self, "image:didFinishSavingWithError:contextInfo:", nil)


```

保存処理の結果受け取り

```swift

func image(image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutablePointer<Void>) {
        if error != nil {
            //プライバシー設定不許可など書き込み失敗時は -3310 (ALAssetsLibraryDataUnavailableError)
            println(error.code)
        }
}

```

エラーの意味などについては
このあたりに記述されています。


https://developer.apple.com/library/ios/documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/#//apple_ref/doc/constant_group/Error_Codes
Jscript/Excel覚え書き(4) －セルに色をつける－

#覚え書き
##セルに色をつける

```js:Test.js
var Excel = new ActiveXObject("Excel.Application");
Excel.Visible = true;              //Excelを表示する
var Book = Excel.Workbooks.Add();  //新規ブック
var Sheet = Book.Worksheets(1);    //1シート目のオブジェクトを取得

Sheet.Range("A1").Interior.Color = 0x0000ff;
Sheet.Range("B1").Interior.Color = 0xff00ff;

WScript.Quit();
```
rbenv使ってYosemiteさんにRuby入れようとしたらBUILD FAILED (OS X 10.10 using ruby-build 20140926-6-gc2b2e15)とか言われた

Yosemiteにupdateしてから、rbenvを使ってRuby2.1.3を入れようとしたら以下のエラーになりました。

```
▶ rbenv install 2.1.3
Downloading ruby-2.1.3.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/0818beb7b10ce9a058cd21d85cfe1dcd233e98b7342d32e9a5d4bebe98347f01
Installing ruby-2.1.3...

BUILD FAILED (OS X 10.10 using ruby-build 20140926-6-gc2b2e15)

Inspect or clean up the working tree at /var/folders/cl/cv8n7__12n15v_c8d1tp58vw0000gn/T/ruby-build.20141024011806.89352
Results logged to /var/folders/cl/cv8n7__12n15v_c8d1tp58vw0000gn/T/ruby-build.20141024011806.89352.log

Last 10 log lines:
checking for stdint.h... yes
checking for unistd.h... yes
checking minix/config.h usability... no
checking minix/config.h presence... no
checking for minix/config.h... no
checking whether it is safe to define __EXTENSIONS__... yes
checking for cd using physical directory... cd -P
checking whether CFLAGS is valid... no
configure: error: something wrong with CFLAGS=" -O3 -Wno-error=shorten-64-to-32  "
make: *** No targets specified and no makefile found.  Stop.
```


以下のコマンドでインストールできました。

```
RUBY_CONFIGURE_OPTS="--without-gcc --disable-install-rdoc" rbenv install 2.1.3
```


以下記事ではYosemiteのgccがぶっ壊れてるとか言っていますが詳細はわかってないです。

20141106 追記
apple-gcc42が入っているとこのエラーになるそうです。
apple-gcc42はYosemiteに対応してないのですが、パスで先に見つかると使われてしまうそうです。
apple-gcc42が入ってるかの確認はbrew listコマンドでできます。
入っている場合はbrew uninstall apple-gcc42でuninstallできます。
その後はrbenv install 2.1.3でinstallできるようになります。


参考
http://igarashikuniaki.net/diary/20141028.html (追記)
[RE-INSTALLING RUBY AFTER UPGRADING TO OS X YOSEMITE](http://www.thekunit.com/re-installing-ruby-upgrading-os-x-yosemite/)
[Unable to build Ruby 2.1.3 on OSX 10.10 GM 3.0 with rbenv]
(http://stackoverflow.com/questions/26309860/unable-to-build-ruby-2-1-3-on-osx-10-10-gm-3-0-with-rbenv)
[Cannot install Ruby 2.1.2 on Yosemite Beta]
(https://github.com/sstephenson/rbenv/issues/610)
Windowsドメインに参加しているPCのログオンが遅い時の改善方法

ネットワーク未接続状態でログオン試行した際、何秒も待たされた結果が「ユーザー名またはパスワードが正しくありません」だったりしてイライラすることの改善方法

1. 「ファイル名を指定して実行」に、「gpedit.msc」と入力して「OK」
　「ローカルグループポリシーエディター」が開く。
2. 「コンピューターの構成」→「管理用テンプレート」→「システム」→「ユーザープロファイル」を選択する
3. 「ユーザーに移動ユーザープロファイルまたはリモートホームディレクトリがある場合にネットワークの最大待機時間を設定する」をダブルクリッックする。（リストの一番下にある）　
4. 「未構成」から「有効」に変更し、「オプション」の「最大時間（秒）ネットワークを待機する」を「0秒」に変更。

※この設定でも3秒程度は待たされる。

（参考）
http://akab.blog.so-net.ne.jp/2011-08-13
Laravel4 の環境に composer dump-autoload を使わずに自作 (ライブラリ|クラス|ヘルパー) を登録する

========

前置き
--------
composer パッケージを作るまではいかない、現在作成中の Laravel4 プロダクト内だけで使うような共通機能の作成と登録・適用について。


なんのために調べたの？
--------
- 複数の自作 Artisan コマンドやフロントコントローラーにまたがって使いたい定数や共通処理を、 1 つのファイル (クラス) でまとめたかったから。


何が嬉しいの？
--------
- composer dump-autoload をしないで済み、改修範囲が Laravel4 内で完結する
- これにより、当該ライブラリを改修する場合、確認・変更箇所が少なくて済む


方法
--------
実は、
[What are the best practices and best places for laravel 4 helpers or basic functions? - Stack Overflow](http://stackoverflow.com/questions/17088917/what-are-the-best-practices-and-best-places-for-laravel-4-helpers-or-basic-funct#answer-17098390)
のまんまです…。

1. `app/libraries` ディレクトリを作成。 (*libraries* は任意)
2. その中に `Orelib/Orelib.php` のようにディレクトリとファイルを作成する (それぞれの名前は任意)
3. ファイルの中身は次のようになる

    ```php:Orelib/Orelib.php
        <?php
        namespace Orelib;
        class Orelib {
            public static function hello() {
                $message = 'Hello';
                return $message;
            }
        }
    ```

4. `app/start/global.php` の当該箇所に *libraries* のパスを追記する。

    ```php:app/start/global.php
        ClassLoader::addDirectories(array(
            app_path().'/commands',
            app_path().'/controllers',
            app_path().'/models',
            app_path().'/database/seeds',
            app_path().'/libraries', // <- Add this
    
        ));
    ```

5. `app/config/app.php` の `aliases` セクションに当該設定を追記する。

    ```php:app/config/app.php
        ...
        ...
        'aliases' => array(
        ...
        ...
            'Orelib'      => 'Orelib\Orelib',
        ),
        ...
        ...
    ```

6. 任意の自作コマンドファイルやコントローラー内に `echo Orelib::hello()` のように記述して使う。


関係ないこと
--------

Query Builder がどんな SQL を生成するのか知りたい。
`$db->toSql()` で良いみたい。

```php
$query = DB::table('books')
            ->whereRaw('(created_at - NOW()) < 86400')
            ;

// クエリを投げる前に SQL を取得・確認したい
echo $query->take(1)->toSql();

echo "\n----------------------------------------\n";

// クエリが実行された後で、投げられた SQL を取得・確認したい
$result = $query->first();
dd(DB::getQueryLog());
```

```console:出力
select * from `books` where (created_at - NOW()) < 86400 limit 1
----------------------------------------
array(1) {
  [0]=>
  array(3) {
    ["query"]=>
    string(78) "select * from `books` where (created_at - NOW()) < 86400 limit 1"
    ["bindings"]=>
    array(0) {
    }
    ["time"]=>
    float(1.71)
  }
}
```

ちなみに dd() すると 内部に `die` が書かれているので、そこで処理が中断・終了します。

以上。
改行コード：Environment.NewLine

　機能の修正中に、他の人の描いたソースってのは結構参考になるなあなんて思いながら見ていたら、string.Joinのセパレートの引数に「**Environment.NewLine**」って書いてあったのを見て、何じゃこりゃ、って思って調べたら、なんと改行コードだったよこれ。

>
Environment.NewLine プロパティ
この環境で定義されている改行文字列を取得します。
(msdnより引用)

　ディレクトリの区切り文字は**Path.DirectorySeparatorChar**ってのは結構前から知ってたんだけどこれは知らんかったなあ……。

>
Path.DirectorySeparatorChar フィールド
階層ファイル システム編成を反映するパス文字列の、ディレクトリ レベルを区切るために使用する、プラットフォーム固有の文字を提供します。
(msdnより引用)

　しかし、Environmentクラスって特殊ディレクトリのパスを取ってこれるだけのクラスだと思ってたら違うんだね……！ 
　なんかメンバの一覧見たら、改行文字だけ浮いてねえ？ って思ったのはここだけの話。

***
**参考ここらへん** 

-  [Environment メンバ](http://msdn.microsoft.com/ja-jp/library/system.environment_members(v=vs.71).aspx)
-  [Path.DirectorySeparatorChar フィールド (System.IO)](http://msdn.microsoft.com/ja-jp/library/system.io.path.directoryseparatorchar(v=vs.80).aspx)
-  [特殊ディレクトリのパスを取得する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/file/getfolderpath.html)
VyOS(Vyatta)にgitをインストールする

VyOS(Vyatta)でレポジトリを追加してgitをインストールします。

VyOS上のコマンドで任意のレポジトリを追加する事が可能です。コマンドは以下の通り。


```
configure
 set system package repository squeeze components main
 set system package repository squeeze url http://cdn.debian.net/debian
 set system package repository squeeze distribution squeeze
``` 

commit/saveしてください。デフォルトの設定と合わせて以下のようになるはずです。

```
    package {
        repository community {
            components main
            distribution helium
            url http://packages.vyos.net/vyos
        }
        repository squeeze {
            components main
            distribution squeeze
            url http://cdn.debian.net/debian
        }
    }
```

インストールはapt-get installです。

```
$ sudo apt-get update
$ sudo apt-get install git-core
```

gitインストール後は以下もどうぞ。

VyOSのバックアップをGitHubとTFTPに自動でアップする
http://komeiy.hatenablog.com/entry/2014/12/05/200946
ActiveRecord のデフォルト値


ActiveRecord が DB の DEFAULT で設定した値を attribute の初期値として設定してくれるという挙動を知らなかったため、軽くハマってしまったので忘れないようにメモ。

Migration を使っていない案件で DB の DEFAULT 値を ALTER 文で変更したら急にテストが失敗するようになったが、コードは特に弄っていなかったのでなかなか原因に気付けなかった。

### 試してみる

例えば Model に以下のようなバリデーションを設定。

```rb
class Post < ActiveRecord::Base
  has_many :comments
  validates :title, presence: true
end
```

この状態で rails console で Model を new して valid? を呼ぶと以下のようにバリデーションはエラーになる。

```rb
% bundle exec rails c
Loading development environment (Rails 4.1.6)
irb(main):001:0> post = Post.new
=> #<Post id: nil, title: nil, body: nil, lock_version: 0, created_at: nil, updated_at: nil>
irb(main):002:0> post.valid?
=> false
irb(main):003:0> post.errors
=> #<ActiveModel::Errors:0x007f88438d3010 @base=#<Post id: nil, title: nil, body: nil, lock_version: 0, created_at: nil, updated_at: nil>, @messages={:title=>["can't be blank"]}>
```

ここまでは想定通り。
ここで DB 側に以下の ALTER を流してデフォルト値を設定。

```sql
-- MySQL
ALTER TABLE `posts` MODIFY COLUMN `title` varchar(255) NOT NULL DEFAULT 'No Title';

-- SQLite
DROP TABLE "posts";
CREATE TABLE "posts" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255) DEFAULT "No Title", "body" text, "lock_version" integer, "created_at" datetime, "updated_at" datetime);
```

rails console で relaod! してから再度試すと Model を new した時点で DB の DEFAULT に設定した値が入っている事が分かる。
当然 valid? の結果も今度は true になる。

```rb
irb(main):004:0> reload!
Reloading...
=> true
irb(main):005:0> post = Post.new
=> #<Post id: nil, title: "No Title", body: nil, lock_version: 0, created_at: nil, updated_at: nil>
irb(main):006:0> post.valid?
=> true
```

ハマった時はこの逆で、デフォルト値を数値から NULL に変えたためバリデーションエラーが発生してしまった。

恥ずかしながら今までこの挙動を知らなかったが、知っていれば便利な機能だと思う。
Migration 使ってる環境なら Model 側意識せずに DB のデフォルト値だけ変える事もそう無さそうだし。

### 設定している所

余りちゃんと読んでいないけど適当に grep してみると `lib/active_record/model_schema.rb` の 254 行目辺りで設定してるっぽい。

```rb
# Returns a hash where the keys are column names and the values are
# default values when instantiating the AR object for this table.
def column_defaults
  @column_defaults ||= Hash[columns.map { |c| [c.name, c.default] }]
end
```

https://github.com/rails/rails/blob/v4.1.6/activerecord/lib/active_record/connection_adapters/column.rb#L37

https://github.com/rails/rails/blob/v4.1.6/activerecord/lib/active_record/model_schema.rb#L252-L256

### 参考

ruby on rails - How can I set default values in ActiveRecord? - Stack Overflow
http://stackoverflow.com/questions/328525/how-can-i-set-default-values-in-activerecord/328874#328874

how do set default value for ActiveRecord fields? - Ruby Forum
https://www.ruby-forum.com/topic/75429
CentOS 6.0 gcc 4.7.2にBoost 1.5.0をインストール

# 参考文献
[Getting Started](http://www.boost.org/doc/libs/1_56_0/more/getting_started/unix-variants.html)
[Boostライブラリのビルド方](https://sites.google.com/site/boostjp/howtobuild)

# 前提

~/以下にインストールする。（gcc4.7.2は~/以下の適当な場所にインストール済）

# 準備

まずは、ダウンロードして解凍。

```
$ cd ~/download
$ wget http://sourceforge.net/projects/boost/files/boost/1.50.0/boost_1_50_0.tar.gz
$ tar zxvf boost_1_50_0.tar.gz
```

./bootstrap.shを実行。b2, bjamを生成する。

```
$ cd boost_1_50_0
$ ls
INSTALL  Jamroot  LICENSE_1_0.txt  boost  boost-build.jam  boost.css  boost.png  boostcpp.jam  bootstrap.bat bootstrap.sh  doc  index.htm  index.html  libs  more  rst.css  status  tools
$ ./bootstrap.sh
Building Boost.Build engine with toolset gcc... tools/build/v2/engine/bin.linuxx86/b2
Detecting Python version... 2.6
Detecting Python root... /usr
Unicode/ICU support for Boost.Regex?... not found.
Generating Boost.Build configuration in project-config.jam...

Bootstrapping is done. To build, run:

   ./b2

To adjust configuration, edit 'project-config.jam'.
Further information:

  - Command line help:
    ./b2 --help

  - Getting started guide:
    http://www.boost.org/more/getting_started/unix-variants.html

  - Boost.Build documentation:
    http://www.boost.org/boost-build2/doc/html/index.html

$ ls
INSTALL  LICENSE_1_0.txt  bjam   boost-build.jam  boost.png     bootstrap.bat  bootstrap.sh  index.htm   libs project-config.jam  status
Jamroot  b2               boost  boost.css        boostcpp.jam  bootstrap.log  doc           index.html  more  rst.css             tools
```

# インストール

b2でインストール。15-20分くらいかかる。

```
// Build
$ ./b2 cxxflags="-std=c++11" --prefix=$HOME/oss/boost_1_50_0 -j 10 define=BOOST_SYSTEM_NO_DEPRECATED stage release
// Install
$ ./b2 install cxxflags="-std=c++0x" --prefix=$HOME/oss/boost_1_50_0
```

今回は~/以下にインストールするので問題ないが、忘備録。
> 
```
Linuxを使っており、ディストリビューション提供のboostライブラリをインストールしている場合は、--prefixで/usr以外を必ず指定してください。
--prefixを省略した場合/usr/localが選択されますが、多くの環境では$PATHの解決順序の関係上無条件で/usr/local上のBoostが選択されてしまうでしょう。
/usr以下を使用すると環境を壊すことになりかねないので、通常は$HOME/localや$HOME/boost_1_51_0といったディレクトリを用意するのが良いでしょう。一部のディストリビューションでは$HOME/localを$PATHにデフォルトで登録しているものもあるので、複数人で共用している場合には便利です。
```

パスを通す。

```
export CPLUS_INCLUDE_PATH=$HOME/oss/boost_1_50_0/include:$CPLUS_INCLUDE_PATH
export LD_LIBRARY_PATH=$HOME/oss/boost_1_50_0/lib
```

終わり。

# Tips

ビルド時に、-DBOOST_SYSTEM_NO_DEPRECATEDを付けないと、-lboost_system指定時に怒られた。
インストール時にdefine=BOOST_SYSTEM_NO_DEPRECATEDを付けてるんだけど....。深くは追ってない。

```
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
```
[Node.js] モジュールとして読み込まれたのか直接実行されたのか判定する

`require.main === module` でそのスクリプトがモジュールとして読み込まれたのか、直接 Node から実行されたのかを判定できるようだ。

```javascript
module.exports = function () {};

if (require.main === module) {
    // 直接実行された場合実行される
    console.log("this is not module.");
} else {
    // モジュールとして読み込まれた場合実行される
    console.log("this is module.");
}
```

これがわかると例えば Express の app オブジェクトをデーモン化するツールに渡した場合と直接実行した場合の両方でうまく実行することができる。

```javascript
var express = require("express");
var app = module.exports = express();

....

if (require.main === module) {
    app.listen(3000);
}
```

使いどころがありそうなので覚えておきたい。

- [Modules Node.js v0.10.33 Manual & Documentation](http://nodejs.org/api/modules.html#modules_accessing_the_main_module)