OmniAICreator/Qiita-1.07M huggingface dataset:
基本文法（変数・データ型）

##変数とは

><strong>データを割り当てることができる名前付きのメモリ空間</strong>のことで、<u>プログラミングする上で欠かせない重要な概念</u>である。

###変数の宣言
JavaScriptで変数を利用する場合、まず変数を宣言する必要がある。
変数を宣言することで、JavaScriptで利用するデータの格納領域を確保する。
変数を宣言する場合、次のように「var」キーワードを利用する。

**`var 変数名;`**

変数宣言時に値を設定することもできる。
これは「変数初期化」と呼び、次に示すような変数宣言と代入分を組み合わせた書式になる。

**`var 変数名 = 値;`**

###変数名の命名規則
JavaScriptでは変数名について命名規則がある。

+ `英字`,`数字`,`アンダースコア(_)`,`$`が利用できる。ただし<strong>数字は先頭文字としては利用できない。</strong>
+ `予約語`は利用してはならない。ただし予約語を変数名の一部に含めることはできる。

JavaScriptの予約語：
break/case/catch/continue/default/delete/do/else/false/finally/for/function/if/in/instanceof/new/null/return/switch/this/throw/true/try/typeof/var/void/while/width

##データ型
###整数
整数をそのまま記述すると10進数として扱われる。
-9007199254740992(-2の53乗)〜900719925470992(2の53乗)まで整数を表現できる。

###少数
少数点や指数を利用して実数を扱える。
浮動少数点値が表現可能な最大値を超えた場合は`Infinity`として扱われ、負の場合は`-Infinity`として扱われる。
0を0で除算するような特殊な計算の場合、JavaScriptは数値以外の特殊な値を表す`NaN`(Not a Number)として扱われる。

###Null
Nullは`値がない`ことを示す特殊な値である。

###文字列
文字列はシングルクォーテーション「'」もしくはダブルクォーテーション「"」で囲むことによって定義できる。

###エスケープシーケンス
JavaScriptではバックスラッシュではじまる特殊な文字列が定義される。
これらの文字はエスケープシーケンスと呼ぶ。

||Null|
|b|バックスペース|
|t|タブ|
|n|改行|
|c|垂直タブ|
|f|フォームフィード|
|r|復帰|
|"|ダブルクォーテーション|
|'|シングルクォーテーション|
|00～377|8進数の文字コードを指定したLatin-1文字|
|x00=off|２桁の16進数で文字コードを指定したLatin-1文字|
|\u0000～\uffff|4桁の16進数で文字コードを指定したUnicode文字|

###論理値
真`true`もしくは偽`false`のどちらかを取り扱うデータ型である。

###配列
データ値の集合を「配列」と呼びます。
つまり複数のデータをまとめて保持できる変数ともいえる。
配列を利用すると、データ値の集合を共通の名前で利用できる。

```
//配列の定義その1
var 変数名 = new Array(要素, 要素, ・・・);
//配列の定義その2
var 変数名 = [要素, 要素, 要素, ・・・];
```
定義した配列は下記のように配列に添え字（[]の部分）を指定することにより取得できる。
配列は定義された順に「０」から番号がふられる。
jQueryのセレクタ:firstと:first-childの違い

知らなかったのでメモ
(`:last`,`:last-child`も同じ)

`$('ul li:first')`
すべてのulタグ内をあわせたliタグの中の最初の要素を選択

`$('ul li:first-child')`
各ulタグ内にあるそれぞれのliタグの最初の要素を選択


## つまり

###`$('ul li:first').css('color','red');`

```html
<ul>
  <li>リスト1</li> //ここだけ赤
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
<ul>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
<ul>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
```

###`$('ul li:first-child').css('color','red');`

```html
<ul>
  <li>リスト1</li> //赤
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
<ul>
  <li>リスト1</li> //赤
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
<ul>
  <li>リスト1</li> //赤
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
```
[調査編]Chef-SoloやChef-Clientのログ出力はパイプやリダイレクトをかますとフォーマットが変わってしまう件

`chef-solo`(や`chef-client --local-mode`)のログは、普通に実行するとこういう感じなのですが

```
% sudo chef-solo -c .chef/solo.rb -o hello -W
Starting Chef Client, version 12.3.0
[2015-06-12T21:14:04+09:00] WARN: Run List override has been provided.
[2015-06-12T21:14:04+09:00] WARN: Original Run List: []
[2015-06-12T21:14:04+09:00] WARN: Overridden Run List: [recipe[hello]]
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[hello world] action write


Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources would have been updated
```

パイプやリダイレクトをかますとフォーマットが全然別の形になってしまいます。

例えば ` | cat`しただけで、こう↓なります。

```
% sudo chef-solo -c .chef/solo.rb -o hello -W | cat
[2015-06-12T21:14:20+09:00] INFO: Forking chef instance to converge...
[2015-06-12T21:14:20+09:00] INFO: *** Chef 12.3.0 ***
[2015-06-12T21:14:20+09:00] INFO: Chef-client pid: 17520
[2015-06-12T21:14:21+09:00] WARN: Run List override has been provided.
[2015-06-12T21:14:21+09:00] WARN: Original Run List: []
[2015-06-12T21:14:21+09:00] WARN: Overridden Run List: [recipe[hello]]
[2015-06-12T21:14:21+09:00] INFO: Run List is [recipe[hello]]
[2015-06-12T21:14:21+09:00] INFO: Run List expands to [hello]
[2015-06-12T21:14:21+09:00] INFO: Starting Chef Run for localhost
[2015-06-12T21:14:21+09:00] INFO: Running start handlers
[2015-06-12T21:14:21+09:00] INFO: Start handlers complete.
[2015-06-12T21:14:22+09:00] INFO: Processing log[hello world] action write (hello::default line 1)
[2015-06-12T21:14:22+09:00] INFO: hello world
[2015-06-12T21:14:22+09:00] INFO: Chef Run complete in 0.472361641 seconds
[2015-06-12T21:14:22+09:00] INFO: Skipping removal of unused files from the cache
[2015-06-12T21:14:22+09:00] INFO: Running report handlers
[2015-06-12T21:14:22+09:00] INFO: Report handlers complete
```

ファイルにリダイレクトしたときもパイプ時と同じフォーマットになります。

```
$ sudo chef-solo -c .chef/solo.rb -o hello -W > ~/tmp/tmp.log
$ tail  ~/tmp/tmp.log
[2015-06-12T21:14:32+09:00] INFO: Run List expands to [hello]
[2015-06-12T21:14:32+09:00] INFO: Starting Chef Run for localhost
[2015-06-12T21:14:32+09:00] INFO: Running start handlers
[2015-06-12T21:14:32+09:00] INFO: Start handlers complete.
[2015-06-12T21:14:33+09:00] INFO: Processing log[hello world] action write (hello::default line 1)
[2015-06-12T21:14:33+09:00] INFO: hello world
[2015-06-12T21:14:33+09:00] INFO: Chef Run complete in 0.500912414 seconds
[2015-06-12T21:14:33+09:00] INFO: Skipping removal of unused files from the cache
[2015-06-12T21:14:33+09:00] INFO: Running report handlers
[2015-06-12T21:14:33+09:00] INFO: Report handlers complete
```
(そういえばvagrant provisionしたときもこの形ですね)

うーん、なんでこんな仕様なんでしょうか...
catを通すだけで内容が変化するなんて、Unix哲学的にはありえないと思んですよね(ぶつぶつ)

例えば`Chef Client finished, 1/1 resources would have been updated` の行だけ抜き出してメールで通知したいのですが、、パイプを使ったらメッセージフォーマットが変わってしまってこの行があらわれない。

これってアレですよね。
観察するという行為によって観察される現象に変化を与えてしまい正しい観測ができなくなるというアレですよね。

http://ja.wikipedia.org/wiki/観察者効果

というわけで次回はChefSoloのソースコードを読んでこの件の対策を考えたいと思います。
つづく
iPadなどで起きる謎の余白の対処法

忘れた頃にやってくるのでメモ

viewportの設定もしてある。
CSSで下記のようにも書いてみた。

```css
html,
body{
    width: 100%;
    margin-left: 0;
    margin-right: 0;
}
```

それでもダメな場合。


**overflowの設定**

body直下をdivなどで囲い、`overflow: hidden;`を指定する。

これ。いつも忘れる・・・


## おまけ

iPhone,iPadで画像が表示されない問題が発生。
AndroidのChromeでは正常に表示されている。

### 原因

レスポンシブサイトだったため、`transition-duration`がスマホ・タブレットでも設定されていた。

JSの`userAgent`を使ってCSSを指定することで解決。

ちなみに、`transition-duration:0s;`で解消できる。
基本文法（演算子・式）

##式と演算子
`演算子`とはデータを演算するための識別子

###算術演算子
`算術演算子`は数値を加減乗除など四足演算するために使う

|演算子|記号|
|---|---|
|加算|+|
|デクリメント|--|
|除算|/|
|インクリメント|++|
|剰余|%|
|乗算|*|
|減算|-|

##文字列結合演算子
演算する変数に文字列やオブジェクトが含まれる場合、`+`演算子は文字列結合演算子として扱われる
文字列結合演算子は文字列として処理するため、文字列に変換されてから各文字列が連結される

##比較演算子
|演算子|説明|
|---|---|
|===|厳密等価演算子<br><strong>データの型も意識して等しい</strong>場合|
|==|比較する対象が<strong>等しい</strong>場合|
|!==|厳密非等価演算子<br><strong>データの形も意識して等しくない</strong>場合|
|!=|比較する対象が<strong>等しくない</strong>場合|
|>|比較する対象が<strong>大きい</strong>場合|
|>=|比較する対象が<strong>大きい、または等しい</strong>場合|
|<|比較する対象が<strong>小さい</strong>場合|
|<=|比較する対象が<strong>小さい、または等しい</strong>場合|

###論理演算子

|演算子|説明|
|---|---|
|&&|AND演算子<br>つなげた条件式が<strong>どちらも真（True）</strong>である場合|
|&#124;&#124;|OR演算子<br>つなげた条件式が<strong>いずれかが真（True）</strong>|
|!|条件式が<strong>偽（False）</strong>だった場合|

###条件（三項）演算子
条件によって２つの式のどちらかを返す
**`条件式 ? trueの場合の式 : falseの場合の式`**

###void演算子
void演算子は未定義値を返却する単項演算子である
主にURLを利用してJavaScriptを実行し、その実行結果をWebブラウザに表示させたくない場合に利用される
開いているウィンドウの内容を変更せず、新規ウィンドウを作成する場合、void演算子を利用して次のように記述する
ng-repeatのfilterの条件を否定する



http://stackoverflow.com/a/13450568/2406748 とかで

```
filter:'!'+func
```

って書いたらできるって書いてあるけどできないので調べてたら

```html
ng-repeat=" n in numbers | filter:'!':odd "
```
こうするとできた。
バージョンは1.3.15です。



コードを追ってみると `'!' + ` は `func.toString()` させるためのおまじないで結果として内部では関数が文字列に展開されてそれが再評価された結果動いてたぽかった。文字列のはじめが `!` だと否定されるの自体は機能してた。
みっつめの`comparator`は最終的に比較に使われる関数が渡せるので、そっちに渡してnegateすればできるということで。
RailsでPostgreSQLを使ってるときに、rake db:resetが失敗する場合


データの状態を見ようと、psqlで操作した時とか、セッションが残っていてリセット(DROP)出来なかったりする。


```bash
% rake db:reset                                                                                                                                                    PG::ObjectInUse: ERROR:  database "sample_development" is being accessed by other users
DETAIL:  There are 2 other sessions using the database.
: DROP DATABASE IF EXISTS "sample_development"
```

以下のようなRakeタスクを`lib/task`の中に入れておく。

```ruby:lib/tasks/database.rake
require 'active_record/connection_adapters/postgresql_adapter'
module ActiveRecord
  module ConnectionAdapters
    class PostgreSQLAdapter < AbstractAdapter
      def drop_database(name)
        raise "I won't drop the production database" if Rails.env.production?
        execute <<-SQL
          UPDATE pg_catalog.pg_database
          SET datallowconn=false WHERE datname='#{name}'
        SQL

        execute <<-SQL
          SELECT pg_terminate_backend(pg_stat_activity.pid)
          FROM pg_stat_activity
          WHERE pg_stat_activity.datname = '#{name}';
        SQL
        execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"
      end
    end
  end
end
```

これで`rake db:reset`ができる。

イェア
Windows 2008 R2 の IPv6無効化


HKEY_LOCAL_MACHINE¥SYSTEM¥CURRENTCONTROLSET¥SERVICES¥TCPIP6¥PARAMETERS
DisabledComponents=0xff:DWORD:32bit

※IPv6 またはそのコンポーネントを無効にすることは推奨されません。

参考として、IPv4を優先化する方法http://www.vwnet.jp/Windows/w7/IPv4/IPv4PriorityUP.html

■現在の優先順位の確認
netsh interface ipv6 show prefix policies
■優先順位変更
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 50 0
netsh interface ipv6 set prefixpolicy ::1/128 40 1
netsh interface ipv6 set prefixpolicy ::/0 30 2
netsh interface ipv6 set prefixpolicy 2002::/16 20 3
netsh interface ipv6 set prefixpolicy ::/96 10 4
■優先順位リセット
netsh interface ipv6 reset
AIDL がメソッドのオーバーロードを出来ない問題を何とかする

AIDL では、メソッドのオーバーロードが出来ません。

つまり、以下のような AIDL はコンパイルできません。

```:BadAIDL.aidl
interface BadAIDL {
    void doSomething();
    void doSomething(int flags);
}
```

これで何が困るかといえば、呼び出される側のアプリをアップデートして IPC のインタフェースを変更出来ないということです。呼び出し側のアプリの改修を待たなければ、IPC はメソッドの実装がないものとして扱われ`AbstractMethodError`を吐いてクラッシュします。

ところが、このインタフェースの実装を工夫することで、擬似的ながらインタフェースのオーバーロードが可能になります。

## オーバーロードができているように見せるハック

あるバージョンでは、以下のように AIDL が定義されているとします。

```:SomeAIDL.aidl
interface BadAIDL {
    void doSomething();
}
```

この AIDL に従って実装を以下のように記述します。

```java:SomeIPCHandler.java
public class SomeIPCHandler extends SomeAIDL.Stub {
    public void doSomething() {

    }
}
```

ここで、次のアップデートで AIDL を変更してみます。

```:SomeAIDL.aidl
interface BadAIDL {
    void doSomething(int flags);
}
```

すると、実装も以下のように変更が必要になります。

```java:SomeIPCHandler.java
public class SomeIPCHandler extends SomeAIDL.Stub {
    public void doSomething(int flags) {

    }
}
```

ところが、IPC の呼び出し側は以前のバージョンのままの場合、このままでは存在しないメソッドを呼び出すことになります（古いバージョンの呼び出しは古いインタフェースで判断されるので、実装がないエラーとなる）。

そこで、以下のようにオーバーロードを試みます。

```java:SomeIPCHandler.java
public class SomeIPCHandler extends SomeAIDL.Stub {
    public void doSomething() {

    }

    public void doSomething(int flags) {

    }
}
```

Java ではオーバーロードそのものですので、IPC でもしっかり古い方の`doSomething()`が呼び出されます。
AIDL 上には`doSomething()`の定義は消滅していますが、問題なく呼び出されているはずです。

これで、AIDL のバージョニングによる互換性問題が解決出来ました。
mysql空間テーブルの作り方

## 注意
mysqlでは、空間テーブルはMyISAMでしか作れません（正確には、InnoDBでもテーブルは作れますがインデックスが張れません。InnoDBで空間インデックスが張れるのは、[5.7.4LABリリース](http://mysqlserverteam.com/innodb-spatial-indexes-in-5-7-4-lab-release/)からのようです。）。
MyISAMでも問題ない場合は、空間検索速度が速いので空間DB使うべきですが、トランザクションやテーブルロックなどの問題もありますので、InnoDBしか許されない場合は、[一次元ハッシュコードを用いる方法](http://qiita.com/kochizufan/items/2fe5f4c9f74636d22ddb)を検討してください。

### Mysql Reference manual
http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html

### 空間テーブルの作り方
```sql:空間テーブル作成
CREATE TABLE IF NOT EXISTS `geo_table` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `geometry` geometry NOT NULL COMMENT 'ジオメトリ',
  PRIMARY KEY (`id`),
  SPATIAL KEY `geometry` (`geometry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

* 空間テーブル自体はInnoDBでも作れますが、現状インデックスを張れるのはMyISAMのみです。
 
### 空間データの突っ込み方
```sql:空間データ突っ込み
INSERT INTO `geo_table` (`geometry`) 
VALUES (
  GeomFromText('POINT', 4326)
);
```

* 空間データ型（geometry型）はGeomFromText関数を使って文字列から作ります。
* 点データを作成する文字列は、'POINT' です。
* 4326という数字は、異なる座標系を同じテーブルに入れる際の見分けるIDです（SRIDといいます）。  
いわゆる世界測地系と呼ばれる経緯度を入れる際の値は4326です。  
別に同じ座標系のデータしか入れない際は省略して構いません。  
というか、空間sqlの仕様が策定されているので、それに合わせてこの引数が設定されてるだけで、mysqlの場合、違うSRIDを入れても区別しなかったはず...。

### 空間データの検索方法（矩形）
例：経度130度、緯度30度から経度140度、緯度40度の間にある点を探す。

```sql:空間検索（矩形）
SELECT `id`, X(`geometry`) AS `lng`, Y(`geometry`) AS `lat` 
FROM `geo_table` 
WHERE MBRWithin(`geometry`, GeomFromText('LineString(130.00 30.00, 140.00 40.00)', 4326));
```
* 空間検索には、MBR...系の関数を使います。
* MBRWithin関数は、第二引数の形状に外部で接する長方形の範囲に含まれる、第一引数のgeometryカラムの結果を返す関数です。
* 第二引数として、GeomFromText関数で作成した経度130度、緯度30度と経度140度、緯度40度を結ぶ線を与えることで、結果的に経度130度、緯度30度と経度140度、緯度40度の間にある長方形内の点を検索しています。
* mysqlのリファレンスを見ると、空間関数にはいろんな便利な関数があります（衝突判定、交差判定等）が、検索時インデックスが効くのはMBR...系の関数だけなので注意が必要です。  
他の関数を使いたい場合は、まずMBR...系関数でフィルタしてやった後、足切りにひっかかった結果に対して関数計算します。
* X(), Y()はgeometryデータ型からX座標、Y座標をそれぞれ取り出します。

### 空間データの検索方法（距離、円検索）
* 距離検索はいきなりはできないので、円に外接する矩形を求めてやって、その矩形で上記のように検索してやった後、結果に対して距離を求めてフィルタリングする形になります。
* 矩形の求め方は、 http://blog.fujiu.jp/2011/09/gps-1.html を参考にすると、大雑把ですが緯度方向には緯度1度あたり111.3194908mの距離、経度方向には、緯度によって異なりますが、例えば北緯20度付近では経度1度当たり104.60610km、北緯44度付近では経度1度当たり80.07654kmになるので、これから逆算してやります。
* なので大阪当たりでは、半径1kmの検索をしたい場合、検索したい経緯度を中心として緯度差0.01797度、経度差0.02221度程度の長方形を作って、検索してやればいいかと。
* そうして得られた検索結果に、都度距離計算を行って（距離計算ロジックはよく見つかるので省略）、必要に応じてソートしてやる形になると思います。

### 空間検索の速度について

[一次元ハッシュコードを用いる方法](http://qiita.com/kochizufan/items/2fe5f4c9f74636d22ddb)の方で比較していますので、そちらを参照してください。
空間インデックスを用いない、GeoHash( http://blog.masuidrive.jp/index.php/2010/01/13/geohash/ )のような検索方法とも簡単に比較してみましたが、ほぼ同一オーダながら若干速かったです。
もし何十万件と位置情報データがたまり、この検索方法ではおっつかなくなった場合は、Solr等を使ってサーバ並べて、しかないかと思います。

### mysql以外ではどうするの？

以前、ブログで[主要3種類DBの、空間SQLの違い](http://d.hatena.ne.jp/kochizufan/20130223/1361628164)をまとめたことがあります。
今回の記事とは違うSQLなので、そのまま差はわかりませんが、参考にはなるかと思います。
Apple Watch アプリ開発 超初級チートシート

**この記事は watchOS 1.0.1 の時期に書かれています。その後のOSでは内容が正しくない可能性があります。**

## 画面遷移
```objc:WKInterfaceController.h
- (void)pushControllerWithName:(NSString *)name context:(id)context;

[self pushControllerWithName:@"NextInterface" context:@{@"Text": @"Apple Watch"}];
```
name に Storyboard ID
context に 次の画面へ渡したい物

## iPhone から データを取得する
Apple Watch 側

```objc:WKInterfaceController.h
+ (BOOL)openParentApplication:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo, NSError *error)) reply;

[WKInterfaceController openParentApplication:@{@“Action" : @“Type"}
                                       reply:^(NSDictionary *replyInfo, NSError *error) {
                                           NSLog(@"replyInfo: %@, error: %@", replyInfo, error.debugDescription);
                                       }];
```

iPhone 側

```objc:AppDelegate.h
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply;

NSString *actionType = userInfo[@"Action"];
if ( [actionType isEqualToString:@"Type"] ) {
    // do something
    reply(@{@“Reply” : @“Value"});
}
```

## Force Touch に対応する (メニューを表示する)
```objc:WKInterfaceController.h
- (void)addMenuItemWithImage:(UIImage *)image title:(NSString *)title action:(SEL)action;           // all parameters must be non-nil
- (void)addMenuItemWithImageNamed:(NSString *)imageName title:(NSString *)title action:(SEL)action;
- (void)addMenuItemWithItemIcon:(WKMenuItemIcon)itemIcon title:(NSString *)title action:(SEL)action;
- (void)clearAllMenuItems;

[self addMenuItemWithItemIcon:WKMenuItemIconAccept title:@"Accept" action:@selector(pushAcceptButton:)];
```

## 絵文字、サジェスト、音声入力に対応
```objc:WKInterfaceController.h
- (void)presentTextInputControllerWithSuggestions:(NSArray *)suggestions allowedInputMode:(WKTextInputMode)inputMode completion:(void(^)(NSArray *results))completion;

    [self presentTextInputControllerWithSuggestions:@[@"おはようございます", @"少々お待ちください", @"お疲れ様です"]
                                   allowedInputMode:WKTextInputModeAllowAnimatedEmoji
                                         completion:^(NSArray *results) {
                                         }
     ];
```

*WKTextInputModePlain*
サジェスト + 音声入力
*WKTextInputModeAllowEmoji*
絵文字 + サジェスト + 音声入力
*WKTextInputModeAllowAnimatedEmoji*
アニメーション絵文字 + 絵文字 + サジェスト + 音声入力
ggplot2 でベースラインから上下に伸びる棒グラフ #rstatsj

ggplot2 でベースラインから上下に伸びる棒グラフを描きたい。

そこで、次のようにする。

```r:データの生成
data <- data.frame(x=LETTERS[1:10], y=rnorm(10, mean=0))
head(data)
```

```:結果
  x          y
1 A -0.4755912
2 B  0.1196277
3 C  0.1837534
4 D -0.2376496
5 E  0.8864223
6 F  0.9673385
```

```r:グラフの描画
library(ggplot2)
ggplot(data, aes(x=x, y=y, fill=y > 0)) + 
  geom_bar(stat="identity") +
  theme(legend.position="none")
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/2570/cb01d4c2-e3cf-241e-15a2-6cafa4e2cf84.png)


ベースラインが 0 のものは簡単にできた。

しかし、私が本当に欲しかったグラフは、ベースラインが 0 ではなかった。
ちょっと工夫して次のようにした。

```r:データの生成
data2 <- data.frame(x=LETTERS[1:10], y=rnorm(10, mean=1))
head(data2)
```

```:結果
  x            y
1 A  1.502520219
2 B -0.909011496
3 C  0.005040713
4 D  1.836899722
5 E  3.064928707
6 F  0.854557083
```

```r:グラフの描画
base <- 1
ggplot(data2, aes(x=x, y=y-base, fill=y > base)) + 
  geom_bar(stat="identity") +
  scale_y_continuous(labels=function(y) y+base) +
  theme(legend.position="none") +
  ylab("y")
```

![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/2570/ee432f80-dd9b-1999-f32c-cab209b13fc1.png)

できた！
DayDreamは充電時間に影響するのか？

Android 4.2から使えるようになったというDayDream機能について、気になったことがあったので試してみようと思います。
(もう大分昔の機能だとか言うツッコミは聞かない）

#DayDreamって何？
充電中に表示されるスクリーンセーバーのような機能です。
実は、最近までこの機能を使った事、ありませんでした。

# 気になること
## Androidのバッテリー消費の激しさ
Androidのバッテリー消費の激しさは周知の事実だと思います。
見えないところで色々動いていたり、とかしているせいですが、バッテリー消費をどの機能に割り当てているか見られます。
試しに、私の所有しているXperia Z1の状態を見てみましょう。

![Screenshot_2015-06-09-12-14-30.png](https://qiita-image-store.s3.amazonaws.com/839/71714/b8a162e6-4d86-01f7-a541-773442bc2909.png)

ディスプレイに51%、システム系がおよそ25%、その他アプリと続いていきます。
お気づきになったでしょうか…？

**ディスプレイに51%**
####**ディスプレイに51%**####

タッチパネルがスタンバイ状態をキープしているからなのか、動力の半分は画面に使われています。
つまり操作をしていなくても、画面を表示状態にしているだけでバッテリーはずんずん消費されていく、ということになります。
最近はあまりありませんが、**充電しているのに画面をアクティブな状態で表示しているだけ(操作なし)でバッテリーが減っていく**、という現象を見たこともありました。
そんな現象が起きるAndroidでは、DayDream機能を使用すると、充電時間が長くなってしまうのでしょうか？

# 試してみる
気になったら、試してみればいいですよね。

## 実験方法
大雑把ですが、以下の方法で行います。

###前提
・原則として、充電中はOSを起動しておく
・原則として、充電中は画面のスリープはしない
・通信は特に制限しない
・充電中は極力画面操作を行わない
・充電に使うケーブルや電源は同じ状態で行う

###使った充電器
* [10400mAhの充電器](http://cheero.jp/powerplus_danboard/)

###実験対象端末
Xperia Z1 (docomo SO-01F)

###手順
1. バッテリーが空になるまで使う
2. 充電開始時間を確認してから、充電開始
3. 充電開始5分後に電源を入れる 
4. 充電完了まで待つ
5. 充電にかかった時間を算出。

これをそれぞれ、DayDreamを設定しているとき、していないときで実行します。


## 実験結果
| DayDreamの設定有無 | 充電開始時間 | 充電終了時間 | 充電にかかった時間 | 備考 |
| :----: | :----: | :----: | :----: | :----: |
| 設定なし | 15:28 | 18:27 | 約3.0h | 完全に消灯されることはないけれど、<br/>少し遠くからみると点灯しているのがわからないくらい。 |
| 設定あり | 03:45 | 07:00 | 3.25h | 100%になった時の時間。<br />100%になっても常に充電状態が保たれていました。 |

どちらも画面を点灯している状態で充電していましたが、DayDreamを設定していると15分程度100%になるのにかかるようです。

## 考察＆感想
### 充電はそれほど阻害しないらしい
実験結果から、DayDreamは充電を大幅に阻害することはないようです。
しかし、モバイルバッテリーを使っていると、いつまでたっても充電が終わらず延々とモバイルバッテリーを消費し続けるので、外出時には設定をオフにしておく方が良さそうです。
また、今回は1端末でのみ確認しているので、平均したりするともっと違うデータが出てくるかもしれません。
### 使ってみたけど…
「デザートタイプ」(KitKatのイースターエッグのアレ)を設定したら、時間も充電状態も確認できなくて不便だったので、デフォルトのロック画面の方が利便性は高いかもしれません。
設定するDayDream次第なのかなぁ…？
→「デザートタイプ」は頻繁に描画があるので、食ってたとおもわれます。

### おまけ
実験結果として採用しなかった、充電結果。
この結果を見て、リアルタイムで充電完了時間を確認することを諦めました。

| 状態 | 充電開始 | 充電終了 | かかった時間 | 除外理由 |
| :----: | :----: | :----: | :----: | :----: |
| DayDreamなし。<br />データ通信用ケーブル使用か | 23:58 | 翌5:47 | **5h49m** | こんなの待ってられるか！！！ <br />※充電完了タイミングを確認するために起きていました |
Tesla Motors Model Sのメモ

#必要なもの
Tesla Motors Model S 1台

ネットから注文できる。
http://www.teslamotors.com/jp/

#公式アプリ
iPhoneとAndroidのアプリがある。

Tesla Model S on the App Store on iTunes
https://itunes.apple.com/us/app/tesla-model-s/id582007913?mt=8

Tesla Model S Beta - Android Apps on Google Play
https://play.google.com/store/apps/details?id=com.teslamotors.tesla&hl=en

#サードパーティ製アプリ
Tesla Info - Android Apps on Google Play
https://play.google.com/store/apps/details?id=cz.anywhere.tesla

#API
上記のiPhone and/or AndroidアプリのAPIが載っている様子。
公式ではAPIは公開していない。

Tesla Model S JSON API—by apiary.io
http://docs.timdorr.apiary.io/

# APIでできること
以下のデータの取得の他、充電の開始・終了、ドアロックON/OFF、サンルーフの開け閉めの命令などが可能。

| # | 内容| 備考 |
|:----------:|:-----------:|:------------:|
| 1 | 充電状態 | 充電の詳細、航続距離など |
| 2 | 車内外の温度 | - |
| 3 | 位置情報| 緯度経度、方角 |
| 4 | GUI設定| 華氏/摂氏など |
| 5 | 自動車の状態 | ボンネットやサンルーフの開閉状態、ホイールサイズなど |

#ライブラリやアプリ
Python
https://github.com/nside/pytesla
Node.js
https://github.com/hjespers/teslams
Java
https://github.com/jpasqua/TeslaClient
C#
https://github.com/morrisonbrett/teslalib
Ruby
https://github.com/gstark/tesla-api
PHP
https://github.com/apach3guy/Tesla-Mobile-Web-App

#参考
REST API Tools and Apps - Tesla Motors Club - Enthusiasts & Owners Forum
http://www.teslamotorsclub.com/showwiki.php?title=REST+API+Tools+and+Apps

#あとがき
筆者はAPIもアプリも試してません。
ESXi再構築の所要時間

# 概要

ESXiの一般的な再構築方法は、ESXiを新規インストールした後に`vicfg-cfgbackup.pl`で取得しておいた構成情報を書き戻すことで、所要時間は1時間以内でした。

# 詳細

ESXiの一般的な再構築方法は、ESXiを新規インストールした後に、`vicfg-cfgbackup.pl`で取得しておいた構成情報を書き戻すことです。再構築の所要時間などはあまり情報が見つからなかったのですが、実施機会があり1時間以内で再構築を一通り終えられたので、参考として記録しておきます。

## ESXiのバックアップ方法

ESXiのバックアップは、以下の二点を行います。

1. インストール媒体とパッチファイルを準備します。
2. vSphere CLIの`vicfg-cfgbackup.pl`コマンドで、構成情報を取得します。

構成情報取得時の`vicfg-cfgbackup.pl`コマンドの書式は以下になります。

    vicfg-cfgbackup.pl --server=ESXi_host_IP_address --username=root -s output_file_name

通常、構成情報は数秒～数分で取得でき、数十KB程度のファイルが作成されます。保存ファイル名（output_file_name）は任意ですが、取得年月日、ホスト名、ビルド番号を含めておくと良いと思います。

## ESXiの再構築方法

ESXiの再構築は、以下の手順を行います。

1. ESXiをインストールし、構成情報取得時点までのパッチを適用します（ビルド番号が構成情報取得時と合っていることが必要）。
2. IPアドレス、rootパスワードを設定します（≒vSphere CLIでネットワーク越しに操作できる状態にする）。
3. vSphere CLIの`vicfg-cfgbackup.pl`コマンドで、取得しておいた構成情報を書き戻します。

構成情報書き戻し時の`vicfg-cfgbackup.pl`コマンドの書式は以下になります。

    vicfg-cfgbackup.pl --server=ESXi_host_IP_address --username=root -l backup_file

## 再構築の所要時間

実際に再構築が必要になった際の作業記録では、以下のようになっていました。所要時間は1時間以内でした。

* 13:00～ 再構築対象サーバー前で簡単な打合せ
    * 関係者の顔合わせと情報交換（確認）
    * インストール媒体、パッチファイル、構成情報バックアップファイルが揃っていることを確認
* 13:10～ ESXi 5.0.0インストール開始
* 13:21～ パッチ（この時はハードウェアベンダからのドライバファイルのみ）適用開始
* 13:46～ 構成情報書き戻し（`vicfg-cfgbackup.pl`コマンド実行）
* 13:50～ 動作確認

再構築されたESXiホストは、元通りvCenter管理下に戻り、利用可能な状態になりました。

# 参考

バックアップとレストア方法については、以下を参考にしました。詳細はこちらを参考にしてください。

* [VMware KB: vSphere コマンドライン インターフェイスと vSphere PowerCLI を使用した ESXi 構成のバックアップとリストア(2092886)](http://kb.vmware.com/kb/2092886)

----
本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
ElixirのPhoenixでBootstrap3を使う

Bootstrap3を[ダウンロード](https://github.com/twbs/bootstrap/releases/download/v3.3.4/bootstrap-3.3.4-dist.zip)してきたら、解凍して、下の構造になっています。

```
$ tree -L 2 bootstrap-3.3.4-dist/
bootstrap-3.3.4-dist/
├── css
│   ├── bootstrap-theme.css
│   ├── bootstrap-theme.css.map
│   ├── bootstrap-theme.min.css
│   ├── bootstrap.css
│   ├── bootstrap.css.map
│   └── bootstrap.min.css
├── fonts
│   ├── glyphicons-halflings-regular.eot
│   ├── glyphicons-halflings-regular.svg
│   ├── glyphicons-halflings-regular.ttf
│   ├── glyphicons-halflings-regular.woff
│   └── glyphicons-halflings-regular.woff2
└── js
    ├── bootstrap.js
    ├── bootstrap.min.js
    └── npm.js

3 directories, 14 files
```

そして新しいphoenixプロジェクトを作成します。

```
$ mix phoenix.new hello --no-brunch

```

* `bootstrap-3.3.4-dist/css/`ディレクトリしたのファイルをすべてphoenixのプロジェクト`hello/priv/static/css/`ディレクトリ下移動します。

* `bootstrap-3.3.4-dist/fonts/`ディレクトリをphoenixプロジェクト`hello/priv/static/`ディレクトリ下に移動します。

* `bootstrap-3.3.4-dist/js/`ディレクトリ下のファイルをすべてphoenixプロジェクト`hello/priv/static/js/`ディレクトリ下移動します。


使うときに例としては`hello/web/templates/layout/application.html.eex`ファイルの`<head>`タグに下の2行を追加するとどのファイルでも使えるようになります。

```
<link rel="stylesheet" href="<%= static_path(@conn, "/css/bootstrap.css") %>">
<link rel="stylesheet" href="<%= static_path(@conn, "/js/bootstrap.js") %>">
[メモ]指定の型を判別

使用する値の型を調べる関数一覧

* is_array
* is_bool
* is_float
* ＋is_double (is_floatのエイリアス)
* ＋is_real (is_floatのエイリアス)
* is_int
* ＋is_integer (is_intのエイリアス)
* ＋is_long (is_intのエイリアス)
* is_null
* is_object
* is_resource
* is_scalar
* is_string
* is_callable

型が**合っていればTRUE、違えばFALSE**を返す。
Ajax備忘録

よく忘れるのでまとメモ。

## 通信完了後の処理に何か値を引き継ぎたい

取得したいデータ (ファイル) が複数あって、それぞれを繰り返し処理するときに、iをdoneに突っ込んだりしたいときがたまにある。

```js:JavaScript
var hoge = [a,b,c,d]; // なんかデータ取得用のURLが書いてあるとする。

var getData = function(url){
  return $.ajax({
    type: 'GET',
    url: url,
    dataType: 'jsonp'
  });
};

for (var i = 0, len = hoge.length; i < len; i++) {
  getData(hoge[i]).done(function(data){
    // 何か処理
    // ここにiとか別の値とか、とにかく任意の値をつっこみたい。
  });
}
```

こういうときはコンテキストで引き継ぐ。

```js:JavaScript
var hoge = [a,b,c,d]; // なんかデータ取得用のURLが書いてあるとする。

var getData = function(url, i){
  return $.ajax({
    type: 'GET',
    url: url,
    dataType: 'jsonp',
    context: i
  });
};

for (var i = 0, len = hoge.length; i < len; i++) {
  getData(hoge[i], i).done(function(data){
    // 何か処理
    console.log(this); // iがかえってくる。
  });
}
```

複数指定も可能。

```js:JavaScript
var hoge = [a,b,c,d]; // なんかデータ取得用のURLが書いてあるとする。

var getData = function(url, i){
  return $.ajax({
    type: 'GET',
    url: url,
    dataType: 'jsonp',
    context: {
      num: i,
      mogu: 'fuga'
    }
  });
};

for (var i = 0, len = hoge.length; i < len; i++) {
  getData(hoge[i], i).done(function(data){
    // 何か処理
    console.log(this.num); // iがかえってくる。
    console.log(this.mogu); // fugaがかえってくる。
  });
}
```

## 繰り返しで並列Ajax通信するけど順番守ってほしい

この方の記事でばっちり。

[JavaScript - 結果の順番を保証して、且つ『並列』でAjax通信を行う方法 - Qiita](http://qiita.com/YusukeHirao/items/bca14c5f2fe4026fd4d7)

実行するAjax通信を配列に詰めておいて、配列を$.when.applyの引数に渡すだけ。

## そもそもAjaxに渡す内容がバラバラなんだけど

引数を配列にでも突っ込んでおく。

```js:JavaScript
var request = [
  {
    type: 'GET',
    url: 'url1',
    dataType: 'jsonp',
  },
  {
    type: 'GET',
    url: 'url2',
    dataType: 'html',
  }
];

var getData = function(request){
  return $.ajax(request);
};

for (var i = 0, len = request.length; i < len; i++) {
  getData(request[i]).done(function(data){
  });
}
```

Ajaxに限らず、プラグインのオプション受け渡しとか何にでも使える。
移除 UIButton Highlighted 時的效果


在 UIButton 按下時，會進入 UIControlStateHighlighted 的狀態，這時候按鈕會被蓋上深色的半透明效果

如果要移除這個效果，只要加上以下設定即可

這時候， **button** 是 `UIButton` 的一個 instance ，button type 則要設定成 `UIButtonTypeCustom` ：

``` objc

button.adjustsImageWhenHighlighted = NO;
```
Genericタイプを用いるGsonパーザーを実装するメモ


こんにちは、ナムです。

```REST APIのCallback<T extends GeneralObject>``` のようにレスポンスをGenericタイプとして使用し、あとGsonを用いてレスポンスオブジェクトを習得する手順を実装しました。悩んだこととその解決についてメモにしました。

###実装したいメソッド
```
public T parse(String raw) {
	return ...;
}
```

ここで、gsonを使用すると、どうするかわからなくて悩みました。

```
return gson.fromJson(raw, 
			xxx	// ここはなになるかわからない
				// Class<T> のインスタンスまたはTypeインスタンスとなりますが、
				// ただのGeneric Type 'T'しか持っていないから〜
			);
```

###解決

一行で終わりそうです。

```
// ここはポイントです
Type type = ((ParameterizedType) this.getClass().getGenericSuperclass())
				.getActualTypeArguments()[0]; // <-- 複数のタイプの場合もありますね。

return gson.fromJson(raw, type);
```

わかっている方がたくさんいるかもしれませんが、javaのGenericに慣れていない僕はやはり勉強になりました。初心者の方に参考になれると嬉しいです。

では、短いですが、以上です。
Homebrewでコーディングに適したフォント「Source Han Code JP」をインストールする。


Caskroomのfontsリポジトリを追加し、インストールします。

```shell
$ brew tap homebrew/cask-fonts
$ brew cask install font-source-han-code-jp
```

フォント選択画面を開いたら「源ノ角ゴシック Code JP」を選択します。


## 参考サイト

- [Introducing Source Han Code JP](http://blogs.adobe.com/CCJKType/2015/06/source-han-code-jp.html "Introducing Source Han Code JP")
- [caskroom/homebrew-fonts](https://github.com/caskroom/homebrew-fonts "caskroom/homebrew-fonts")
bashでtsvを読む

# bashでtsvを読む

趣味の領域。

```bash
#!/bin/bash

echo "<table>"

echo "select * from employees" | mysql -uroot -Demployees -N -B | while read line; do
    IFS=$'\t' read -a ROW <<< "$line"
    echo "<tr>"
    for x in ${ROW[*]}; do
        echo "<td>"
        echo "$x"
        echo "</td>"
    done
    echo "</tr>"
done

echo "</table>"
```
AWS：EC2のプロンプト部分($PS1)がわかりにくいのでNAME Tagに変える

わかりにくいんじゃー
ってことで、NAME Tagを使うように修正です。
※サーバにIAMロール付けておいて下さい。describe-instancesが打てれば良いです。

```lang:/etc/profile.d/term.sh
export AWS_DEFAULT_REGION=ap-northeast-1

INSID=`curl http://169.254.169.254/latest/meta-data/instance-id 2>/dev/null`
HNAME=`aws ec2 describe-instances --output json | jq -r '.Reservations[].Instances[] |
  select(.InstanceId == "'${INSID}'") |
  [
    ( .Tags[]| select(.Key == "Name") | .Value )
  ] | @csv' | cut -d \" -f 2`

export PS1="[\u@\${HNAME} \W]\\$ "
```

上記をprofileで読みこめば、以下のようになります。
> [ec2-user@ip-192-168-X-XXX ~]$

が

> [ec2-user@myserverName ~]$

といった具合です。
MAMPにZendFramework1をインストールする

```php:index.php
Warning: require_once(Zend/Application.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/...
```

MAMPでZendFramework1をインストールする必要があったので、以下の手順でインストールした。

1. [MAMP](https://www.mamp.info/en/)をインストールする
2. MAMPで使用しているPHPのバージョンを確認する
2. [GitHubのReleaseページからフレームワークを入手](https://github.com/zendframework/zf1/releases)
3. 解凍し、`Library/Zend/` ディレクトリを取り出し、他は削除
4. `Zend/`ディレクトリを`/Applications/MAMP/bin/php/php5.x.x/lib/php`へ移動
  * x.xには先程調べたバージョン番号が入る
4. `/Applications/MAMP/bin/php/phpx.x.x/lib/php`

`php.ini`の`include_path`を編集するのであれば、`Zend/`ディレクトリは他の場所でも良い模様
Laravel5の認証コントローラー内でミドルウェアを設定


認証は管理者向けなので、特定のユーザーはマイグレーションで登録済み。

ユーザー登録をログインした状態でのみ許可したい。

```Http/Controllers/Auth/AuthController.php
public function __construct(Guard $auth, Registrar $registrar)
	{
		$this->auth = $auth;
		$this->registrar = $registrar;

		$this->middleware('guest', ['except' => ['getLogout', 'getRegister', 'postRegister']]);
		$this->middleware('auth', ['only' => ['getRegister', 'postRegister']]);
	}
```

ルーティングの変更は以下で確認。

```
artisan route:list
```
[Ruby]大文字小文字を気にせず、文字の装飾をする方法

 
 This is a pen.
 と
 I like this pen.
 
という文章のうち"this"を強調して画面表示をしたい場合、強調するものに対してHTMLタグをつけたり、記号をで前後を挟んだり(ex: "this") したい。

普通に正規表現を使ってgsubを書くと大文字小文字を認識しない、以下のサンプルコードのようにオプションを付けてやれば万事解決

 
 ```rb
words =  "This this THIS tHiS"
keyword = "this"
 
# 正規表現にiをつけて大文字小文字を区別しない
# \&でマッチした文字列を使う
# シングルクウォートの場合は\&, ダブルクウォートで囲う場合は\\&
words.gsub(/#{keyword}/i, "<mark>\\&</mark>")
 
=> "<mark>This</mark> <mark>this</mark> <mark>THIS</mark> <mark>tHiS</mark>"
```
monacaでスマホアプリを作ろう #4

# 動的にリストを生成する

デザインはわかった。次は実装だ。
というわけで動的にリストを生成してみます。


生成したPage1Controller.jsに配列を定義

```js:Page1Controller.js
app.controller('Page1Ctrl',function($scope){
    $scope.oss= [
        {"name":"KiKat", "kind":"android", "desc":"androidos4.4系です"},
        {"name":"JellyBean", "kind":"android", "desc":"androidos4.1-3系です"},
        {"name":"Honycomb", "kind":"android","desc":"androidos3.x系です"},
        {"name":"Mavericks", "kind":"osx","desc":"Mac 10.9"},
        {"name":"Mountain Lion", "kind":"osx", "desc":"Mac 10.8"},
        {"name":"Lion", "kind":"osx","desc":"Mac 10.7"},
        {"name":"SnowLeopard", "kind":"osx", "desc":"Mac 10.6"},
        ];
}) ;
    
```

page1.htmlを修正

```html:page1.html
<ons-page>
<div ng-controller="Page1Ctrl">
  <ons-toolbar>
    <div class="center">List With Header</div>
  </ons-toolbar>

  <ons-list>
    <ons-list-header>Versions</ons-list-header>
    
    <ons-list-item modifier="chevron" ng-repeat="os in oss">
    {{os.name}}
    </ons-list-item>
  </ons-list>
</div>
</ons-page>
```
![スクリーンショット 2015-06-12 16.12.43.png](https://qiita-image-store.s3.amazonaws.com/0/74328/7c8b95a4-e605-eea1-9783-fba46c2117a3.png)


さらに修正して

```html:page1.html
<ons-page>
<div ng-controller="Page1Ctrl">
  <ons-toolbar>
    <div class="center">List With Header</div>
  </ons-toolbar>

  <ons-list>
    <ons-list-header>Android Versions</ons-list-header>
    <ons-list-item modifier="chevron" ng-repeat="os in oss" ng-if="os.kind == 'android'">
    {{os.name}}
    </ons-list-item>
    
    <ons-list-header>MacOSX Versions</ons-list-header>
    <ons-list-item modifier="chevron" ng-repeat="os in oss" ng-if="os.kind == 'osx'">
    {{os.name}}
    </ons-list-item>

    
  </ons-list>
</div>
</ons-page>
```

![スクリーンショット 2015-06-12 16.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/74328/35ccae0a-3a54-3b35-18e6-627abadccf08.png)



これで静的なコードと表示と同じになりました。
PortableFirefoxを使った履歴をパソコンに一切残さないWebアクセス

注意！パソコンに履歴を残さないだけで、ネットワーク、プロキシ等にはアクセス履歴は残ります。つまらない悪用はしないように。

# 目標：ブラウザでWebアクセスをするうえで、パソコンにURL,
コンテンツキャッシュ、Cookie、画像キャッシュなどを一切残さず、もしくは最後に作業することで
一切消し去る方法を確立する

# 検証方法：
ブラウザでサイトにアクセス後、そのサイトのURLや画像がパソコンファイルシステム上に残っていないかを確認する
findやgrepで
Macで検証しました
[前提条件]
　1.マウントしたUSBメモリ:/Volumes/UNTITLED/
　2.この直下にPortableFirefoxをインストールします
　3.Firefoxの設定変更：環境設定>プライバシー>履歴
　　Firefoxに「履歴を一切記憶させない」を選択設定をする
　4.今までにアクセスしたことのないサイト、今回は
　　http://en.wikipedia.org/wiki/Charles_Darwin
　　にアクセスしてみる

まず、
`sudo find /Volumes/UNTITLED -mtime -1 -type f -print0 | xargs -0 -n 1 sudo grep -nH 'Charles_Darwin' `
まだアクセスしてないから、見つかるはずないよね。
次にMac全体。
`sudo find / -mtime -1 -type f -print0 | xargs -0 -n 1 sudo grep -nH 'Charles_Darwin' `
これも、まだアクセスしてないから、見つかるはずないよね。
じゃあ、ここでPortableFirefoxのURL欄に
http://en.wikipedia.org/wiki/Charles_Darwin
を打ち込んでアクセスします。その後
`sudo find /Volumes/UNTITLED -mtime -1 -type f -print0 | xargs -0 -n 1 sudo grep -nH 'Charles_Darwin' `
見つかりません。
次にMac全体。
`sudo find / -mtime -1 -type f -print0 | xargs -0 -n 1 sudo grep -nH 'Charles_Darwin' `
これも見つかりません。

ちなみに、前提条件であげた設定の部分で
Firefoxに「履歴を記憶させる」を選択すると
`sudo find /Volumes/UNTITLED -mtime -1 -type f -print0 | xargs -0 -n 1 sudo grep -nH 'Charles_Darwin' `
これでつらつらファイルが出てきます。

# 結論：
PortableFirefoxをUSBメモリにインストールし、以下の設定をした上で利用する
　1. PortableFirefoxをダウンロードして、USBメモリに展開する
　2. PortableFirefoxを起動する
　3. 環境設定>プライバシー>履歴
  　 Firefoxに「履歴を一切記憶させない」を選択
Zabbixインストール(Amazon Linux&MySQL と RHEL6&RDS(PostgreSQL))してみた

# インストール
インストール手順は以下を参考にすればうまくいきました。(To：Amazon Linux & MySQL)
すごくよくまとまっていて助かりました。
http://qiita.com/gitya107/items/3e0e4dcdc82ce1ff2f44

## Zabbix2.4(今の最新)をRHELに入れたい人はyumリポジトリ登録を以下のコマンドに。
```rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm```

## PostgreSQL(RDS)使う人
### インストールするZabbixパッケージ
zabbix-server-mysql zabbix-web-mysql
ではなく

> yum install zabbix-server-pgsql zabbix-web-pgsql

### DBクライアント
> yum install postgresql

### SQL投入準備
スキーマ作成とsearch_path設定

```
psql -h hogehoge.amazonaws.com -U USERName -d DBName -p 5432
create schema zabbix;
ALTER USER USERName SET search_path to 'zabbix';
```
ログアウト/ログインして、SHOW search_path; すると設定されてる。
### SQL投入
```
cd /usr/share/doc/zabbix-server-pgsql-2.4.5/create
psql -h hogehoge.amazonaws.com -U USERName -d DBName -p 5432 < schema.sql
psql -h hogehoge.amazonaws.com -U USERName -d DBName -p 5432 < images.sql
psql -h hogehoge.amazonaws.com -U USERName -d DBName -p 5432 < data.sql
```

### zabbix_server.conf いじり
```lang:/etc/zabbix/zabbix_server.conf
DBHost=hogehoge.amazonaws.com
DBName=DBName
DBUser=USERName
DBPassword=hogehoge
```

## 初期ユーザとパスワード

Adminでzabbixなので、すぐ変えましょう。

# はまったところ
## Redhat(Amazon)にyumインストール出来ない

```yum install zabbix-server-pgsql zabbix-web-pgsql```
を打ったところ。。。
> エラー: パッケージ: zabbix-web-2.4.5-1.el6.noarch (zabbix)
>             要求: php-mbstring
> エラー: パッケージ: zabbix-web-2.4.5-1.el6.noarch (zabbix)
>             要求: php-bcmath

って言われる。

ということで、**2つをインストール**。

**[ リポジトリ確認 ]**
```yum repolist all```
 ->オプションのリポジトリが有効になってない。。。


**[ リポジトリ有効化 ]**
```yum-config-manager --enable rhui-REGION-rhel-server-releases-optional```
もう一回確認コマンド打つと「**有効**」になってる。

**[ インストール ]**

```
yum -y install php-mbstring
yum -y install php-bcmath
```



## [ Zabbixサーバーの起動 ]がずっと[ いいえ ]になったまま

ログを見ると。。。
> Cannot upgrade database: the database must correspond to version 2.0 or later. Exiting ...

と出てました。
Zabbixのバージョンアップしたわけでもないのに。。。ワケガワカラナイヨ。
いろいろ紆余曲折(*)のすえ、zabbix.conf.phpいじりとzabbix_server.confで出来るだけ指定してあげることで直りました。
(\*)pg_hba.confをいじれと言う記事を見て、RDSなので無理じゃん！と、愕然としたり。。。

```lang:/etc/zabbix/web/zabbix.conf.php
$ZBX_SERVER = 'localhostじゃなくて自分のPrivateIP';
```

前のConfいじりに加えて、以下もいじる。

```lang:/etc/zabbix/zabbix_server.conf
ListenPort=ZabbixPortNo
DBSchema=SchemaName
DBPort=PostgresPortNo
```
なんか上手く行った！(；・∀・)

## サーバを再起動するとzabbix-agentが上手く起動しなくなる

Agent起動しても、ナゼかZabbixサーバでAgentが有効にならない。。。なぜだ。
ログを確認

> cannot create PID file

んー、、、まぁ、あるよねぇ。。。と思ったんですが、、、

> \# ll /var/run/zabbix/
> ls: /var/run/zabbix/ にアクセスできません: そのようなファイルやディレクトリ はありません

pidを吐く先がないじゃないか！？ｗ (/var/runがtmpfsを使ってるから云々かんぬん。)
ということで起動スクリプト修正

```lang:/etc/init.d/zabbix-agent
conf=/etc/zabbix/zabbix_agentd.conf
pidfile=$(grep -e "^PidFile=.*$" $conf | cut -d= -f2)
timeout=10

if [ -f /etc/sysconfig/zabbix-agent ]; then
    . /etc/sysconfig/zabbix-agent
fi

### このあたりに追加
if [ ! -d /var/run/zabbix ]; then
    mkdir /var/run/zabbix && chown zabbix.zabbix /var/run/zabbix
fi
###
```

動いたー！
ハッシュのキーをいい感じにSymbolにする関数

ActiveSupport使うとこんなのがある。便利。
Hashのキーに文字列じゃなくてシンボルを使いたいとこはこれを使いましょう。

```rb
"Foo Bar Value".parameterize("_").to_sym
=> :foo_bar_value
```

http://apidock.com/rails/ActiveSupport/Inflector/parameterize
golang の net/http で basic auth

golang の net/http で、外部モジュールをつかわずに basic 認証実装。

```go

func checkAuth(r *http.Request) bool {
	username, password, ok := r.BasicAuth()
	if ok == false {
		return false
	}
	return username == "user" && password == "pass"
}

func rootHandler(w http.ResponseWriter, r *http.Request) {
	if checkAuth(r) == false {
		w.Header().Set("WWW-Authenticate", `Basic realm="MY REALM"`)
		w.WriteHeader(401)
		w.Write([]byte("401 Unauthorized\n"))
		return
	}
  ...
}

func main() {
	http.HandleFunc("/", rootHandler)
  ...
}
```

昔は net/http に BasicAuth ってメソッドがなかったのかな？　って感じ。

r.BasicAuth がかえす第３返り値の ok bool はヘッダの解析失敗時に false がくる。

✧＼\ g( 'ω' )o /／✧
[rails]form_for / form_tagの違い



##　まとめ
***form_for →　modelに基づいたformを作るときに使う。***
***form_tag →　modelに基づかないformを作るときに使う。***

***


``` 
 <% form_for(@book) do |f| %>
 	<%= f.label :name %>
 	<%= f.text_field :name %>
 	<%= f.submit %>
 <% end %>
```
bookコントローラーのcreateメソッドにpostします。

```
  Parameters: {
	"utf8"=>"✓", 
  	"authenticity_token"=>"~~~~", 
	"book"=>{
  		"name"=>"ノルウェイの森"
  		}
  	}
``` 
Book.create(book)で保存できます。

```
 <% form_tag{ :controller => "book", :action => "create"} do %>
 	<%= label_tag :name %>
 	<%= text_field_tag :name %>
 	<%= submit_tag %>
 <% end %>
``` 		
 
bookコントローラーのcreateメソッドにpostします。
Roo v2 へのアップデート

## 前置き
RailsでExcelファイルを読み込むのにRooを使っている人がどれくらいいるか分かりませんので、需要あるのか？微妙ですが

## bundle updateの恐怖

ある日不用意にbundle updateしてしまい、Rooがv1.13からv2.0に上がっていることに気づかず、Excelファイルのインポート機能が動作していないとクレームが来ることに。。。

## 何が起こってる？

Roo::Excelx.new で「ArgumentError (wrong number of arguments (3 for 1..2))」

あれ？メソッドの仕様が変わっている！！
とりあえずヴァージョン1.13に戻して調査することに

## 仕様変更

```lang:version1.13.2
def initialize(filename, options = {}, deprecated_file_warning = :error)
```

だったので
`Roo::Excelx.new(@file.path, nil, :ignore)`
と呼んでいたのですが

```lang:version2.0.0
def initialize(filename, options = {})
```

となっています。

deprecated_file_warningどこいった？と思いましたがinitialize内で
`file_warning = options.fetch(:file_warning, :error)`
とあるのでoptionsに入れてしまえばいいでしょう

`Roo::Excelx.new(@file.path, :file_warning => :ignore)`

## 旧フォーマット（xls）も使いたい

Roo::Excelは別ライブラリに移行してしまいました
roo-xls のGEMを追加しましょう
arry.map(&:hoge) が好きな人は Lambda Driver も使いましょう！

```rb
arr.map(&:hoge).map(&:bar)
```
を 

```rb

arr.map(&:hoge >> :bar)
```
で書けるようになるlambda_driver を皆さんもっと使いましょう！

最高や！

https://github.com/yuroyoro/lambda_driver
Slimのログ出力

前回の[フラットなPHPで書かれたサイトにSlimフレームワークを導入してみた](http://qiita.com/nkura/items/a33d0f76b8e53eaf1cc8)に引き続きSlimフレームワークの忘備録。
今回はログ出力。

## ログ出力
まずログの出力先のディレクトリをpublicディレクトリと同じ階層下に作成。

```lang:
composer.json
composer.lock
logs/ ←これ
public/
以下略
```

ログのファイル名と出力先を指定します。

```lang:
$today = new DateTime('now', new DateTimeZone("Asia/Tokyo"));
$logWriter = new Slim\logWriter(
    fopen('../logs/' . $today->format('Y-m-d'), 'a'));

$config = array(
    'log.level' => \Slim\Log::DEBUG,
    'log.writer' => $logWriter
    );

$app = new \Slim\Slim($config);
```

とりあいずログレベルはDEBUGから出力。
適宜出力レベルは指定してください。

参照：`..\vendor\slim\slim\Slim\log.php`

```lang:
    const EMERGENCY = 1;
    const ALERT     = 2;
    const CRITICAL  = 3;
    const FATAL     = 3; //DEPRECATED replace with CRITICAL
    const ERROR     = 4;
    const WARN      = 5;
    const NOTICE    = 6;
    const INFO      = 7;
    const DEBUG     = 8;
```

ログを書き込んでみます。

```
$app->getLog()->info('info');
$app->getLog()->debug('debug');
```

`../logs/2015-06-12`の中身。

```
info
debug
```

ログの出力は終了。
上手くログファイルが作れていなかったりエラーが出たら`../logs`のパーミッションを見なおしてみるといいかも。

```
chmod 755 ../logs
```

ちなみにSlimインスタンスを作るときにconfigの設定を渡したけど
あとから設定しても可。

```
$app = new \Slim\Slim($config);

$app->config('log.level', Slim\Log::DEBUG);
$app->config('log.writer', $logWriter);
```
日付の差分を「○年△ヶ月」で取得する in Rails


ある期間の開始日時が分かっていて、現在まで**何年何ヶ月以上**経過しているのかの差分を取って欲しい、みたいな要件が Rails でありました。

## はじめに考えた

Rails には`distance_of_time_in_words_to_now`というまさになヘルパーメソッドがあるのでそれの利用を検討したんですが、このメソッドは「1分」「3分」「5分」みたいに近い時間は細かく扱ってくれるけど、期間が長くなると「約1ヶ月」「約2年」みたいに結構マルっと丸めてくれるので用途に合いませんでした。ということで自前で実装することにしました。

## 日付の差分を「○年△ヶ月」で取得する

```rb
  def distance_of_time_in_words_to_now(from_time)
    distance_of_time_in_words(from_time, Time.now)
  end

  def distance_of_time_in_words(from_time, to_time)
    from_time = from_time.to_date if from_time.respond_to?(:to_date)
    to_time = to_time.to_date if to_time.respond_to?(:to_date)
    years = 0
    months = 0
    loop {
      from = from_time + years.year + months.month
      if    (to_time - (from + 1.year))  >= 0 then years  += 1
      elsif (to_time - (from + 1.month)) >= 0 then months += 1
      else break
      end
    }
    distance = ''
    distance += "#{years}年 " if years != 0
    distance += "#{months}ヶ月"
  end
```

`from` を「1年」or「1ヶ月」ずつズラしていって「○年△ヶ月」を計算するようにしました。もう少し書き足せば「○年△ヶ月□日」とかもイケそうですね。


## まとめ

こういうときの悩みどころは「1年」や「1ヶ月」の扱いだと思います。「1年 = 366日」の年もあれば「1ヶ月 = 28日」の月もあるわけで、どうやってその辺をうまく「1年」「1ヶ月」として扱うかということ。
自前で「？年？月だからこの月は 28日」とか「？年だから 366日」とか実装することを考えると・・・いや考えたくないですね。今回は ActiveSupport にその辺を任せることでうまく実装できました。ありがとう ActiveSupport。
ファクトリメソッドのみのクラスを作る

目的： `new`を禁止してインスタンスを作る

Javaだとコンストラクタを`private`にして`static`なメソッドから呼び出せばよい。

```java
public class Hoge {

  private int i;

  private Hoge(int _i) {
    i = _i;
  }
  
  public static Hoge create(int i) {
    return new Hoge(i);
  }
}

// Hoge.create(1);
```

Scalaの場合はコンパニオンオブジェクトを使う。
ポイントは、クラス宣言時の基本コンストラクタ `class Hoge(i: Int)` を `private` 指定すること。
`apply`メソッドの場合はメソッド名を省略できる。

```scala
class Hoge private (i: Int)

object Hoge {
  def create(i: Int) = new Hoge(i)
  def apply(i: Int) = new Hoge(i)
}

// Hoge.create(1)
// Hoge(1)
```
ActiveRecord 4.1.0 から inverse_of の指定はいらない？

いつのまにか inverse_of オプションなしでオブジェクトが共有されるようになっていました。

```ruby
gem "activerecord", ">= 4.1.0"
require "active_record"

ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
ActiveRecord::Schema.define do
  create_table :users do |t|
  end
  create_table :articles do |t|
    t.belongs_to :user
  end
end

class User < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :user
end

user = User.create!
user.object_id                  # => 70337900207200

article = user.articles.create!
article.user.object_id          # => 70337900207200
```
TwilioでSMSを送信してみた


# 前提条件 / 制限

* SMSを送信するにはTwilio電話番号が必要（要購入） 
* トライアルアカウントでは承認済みの電話番号にしかSMS送信できない


# 電話番号の取得

[電話番号](https://jp.twilio.com/user/account/phone-numbers/incoming)のページから **電話番号を購入** をクリックして購入ページヘ。

![Twilio_User_-_Account_Phone_Numbers_Incoming.png](https://qiita-image-store.s3.amazonaws.com/0/29860/093b91d9-6941-d3e6-32c0-41ccdc59e443.png "Twilio_User_-_Account_Phone_Numbers_Incoming.png")

SMSを送信するには **アメリカの電話番号** が必要です。

![Twilio_User_-_Account_Phone_Numbers_Search.png](https://qiita-image-store.s3.amazonaws.com/0/29860/e9ed80f2-57e4-6b98-a9f0-9b131f59a6a9.png "Twilio_User_-_Account_Phone_Numbers_Search.png")

用途を選んで電話番号を検索。

![Twilio_User_-_Account_Phone_Numbers_Search.png](https://qiita-image-store.s3.amazonaws.com/0/29860/295dc131-2eca-db35-c6f8-5d3d16e6ba38.png "Twilio_User_-_Account_Phone_Numbers_Search.png")

電話番号とcapabilityが一覧表示されるので適当なものを購入。金額は$1〜$2くらい。何故かトライアルアカウントで、カードも登録していない状態で購入できます。不思議。

![Twilio_User_-_Account_Phone_Numbers_Search_Buy_Results.png](https://qiita-image-store.s3.amazonaws.com/0/29860/11c38591-c91f-f18a-1210-b46bf094de84.png "Twilio_User_-_Account_Phone_Numbers_Search_Buy_Results.png")


# SMS送信

電話番号を取得したらSMSを送信します。[API Explorer](https://jp.twilio.com/user/account/developer-tools/api-explorer/message-create)でフォームをポチポチ埋めて、画面下部の **リクエストを発行する** をクリックすると送信されます。

![Twilio_User_-_Account_Developer_Tools_API_Explorer_Message_Create.png](https://qiita-image-store.s3.amazonaws.com/0/29860/43d19ce4-f608-5ca8-4ede-9ffa3e9c7447.png "Twilio_User_-_Account_Developer_Tools_API_Explorer_Message_Create.png")

プログラム上で送信するには、SID, AuthTokenはアカウント設定ページから取得して、[githubにあるサポートライブラリ](https://github.com/twilio/twilio-python)を使って送信します。クレデンシャルはこんなの。

![Twilio_User_-_Account_Settings.png](https://qiita-image-store.s3.amazonaws.com/0/29860/c1d6a976-dad7-b3ac-e907-eac259a65036.png "Twilio_User_-_Account_Settings.png")

API Explorerで提示されているサンプルコードをコピペして使用。

```python
from twilio.rest import TwilioRestClient 
 
# put your own credentials here 
ACCOUNT_SID = "[SID]" 
AUTH_TOKEN = "[AuthToken]" 
 
client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN) 
 
client.messages.create(
	to="12345678", 
	from_="87654321", 
	body="hello! it's a twilio!",  
)
```

## 成功時

リクエストが成功すると`twilio.rest.resources.messages.Message`が返ってくる。`result.status`は`queue`となるみたい。

## 失敗時

リクエスト失敗時は`TwilioRestException`が送出される。エラーメッセージに詳細な理由がついているので便利。

```python
TwilioRestException:
HTTP Error Your request was:

POST https://api.twilio.com/2010-04-01/Accounts/xxxxxxxxxxxxx/Messages.json

Twilio returned the following information:

Message body is required.

More information may be available here:

https://www.twilio.com/docs/errors/21602
```
linuxサーバの起動日時を知りたい

このサーバ、いつ起動したっけ、と調べるのに、uptimeやtop、wコマンドで大雑把な起動時間を知ることができますが、何月何日何時何分に起動した？という問いかけに対しては計算しないといけません。

エレガントなコマンドがあるのかもしれませんが、現在時刻をUNIX Timeで取得して、/proc/uptimeの起動秒数から計算するワンライナーを書いてみました。

```bash:get_start_time.sh
date --date=@$(expr `date +%s` - `cut -d "." -f 1 /proc/uptime`)
```

exprは小数点を解釈できないので、cutで整数部分だけ切り出してます。bc使えば小数点の計算も可能ですが、手持ちの環境だとbcが入ってないサーバも多かったのでexprでやっております。

コマンド一発でいけるよって情報お待ちしてますｗ
RailsConfigの設定が書き換わらない

# 問題
Springを使っている場合、RailsConfigの設定がキャッシュされるため、settings.ymlに書いた内容が反映されない

# 解決

Springのファイル監視を追加する

```config/spring.rb
Spring.watch "config/settings.yml"
Spring.watch "config/settings/development.yml"
Spring.watch "config/settings/test.yml"
Spring.watch "config/settings/production.yml"
```

# 参考
[Settings not updated even with restart](https://github.com/railsconfig/rails_config/issues/92)
HTTPSでの接続を有効にしたCloudFlareでHTTPからの接続をHTTPSに転送させるようにする

CloudFlareを使うと証明書の取得にかかる費用がなく、HTTPSによる接続のサポートができます[^1]。

これはCloudFlareと自身のサーバーの間をHTTP接続にしても行えるのですが、そうした場合には自身のサーバー側にはHTTPによる接続として伝わるのでHTTPSでだけ接続を許可して、HTTPの場合にはHTTPSにリダイレクトをさせたい場合に少し手間が要ります。

CloudFlareはリクエスト時にX-HTTP-Forwarded-Protoヘッダーを送ってくれるのでそれを使うと良いでしょう。

```nginx:/etc/nginx/sites-avalable/example.com.conf
server {
  listen 80;
  server_name example.com;

  # ...

  set $is_redirect "true";
  if ($scheme = "https") {
    set $is_redirect "false";
  }
  if ($http_x_forwarded_proto = "https") {
    set $is_redirect "false";
  }
  if ($is_redirect = "true") {
    rewrite . https://$host$uri permanent;
  }

  # ...
}
```

わたしは前述するような記述をNginxの設定ファイルに書き、解決させました。`map` ディレクティブを使うほうが綺麗に書けそうではあるのですが、取り急ぎで解決させられる簡単な方法で済ませました。

これはElastic Load Balancingでも同様のことができるので少し便利です。

## 結論

本当に安全に通信を行いたいのであれば、CDNやロードバランサーと自分のサーバーの間にインターネットを挟むのならばHTTPではなくHTTPSで接続を行うようにしましょう。

[^1]: [無料でSSL使える時代きてた！CloudFlare最高！！！（？） - uzullaがブログ](http://uzulla.hateblo.jp/entry/2015/02/25/033133)
Laravel5でGoutteを使う


Goutteは有名なPHPで作られたスクレイピングツールですが、
Laravel-Goutteというものがあったので、さっそくインストールしてみました。

まずcomposer.jsonに下記を追加。

```php:
    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
        "fabpot/goutte": "2.0.*" // ←これ
    },
```

でアップデート

```bash:
composer update
```

使ってみよう。

```php:laravel
use Goutte\Client;

class TestController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function getTest()
    {
        // Create Goutte Object
        $client = new Client();

        // Get Data Source
        $crawler = $client->request('GET', "http://www.yahoo.co.jp/");

        $crawler->filter('title')->each(function ($node) {
            echo $node->text() . "\n";
        });
    }
```

結果
![スクリーンショット 2015-06-12 13.38.04.png](https://qiita-image-store.s3.amazonaws.com/0/75412/3e3d7d0d-e424-1c37-d5aa-f9c7229ecf61.png "スクリーンショット 2015-06-12 13.38.04.png")

簡単！