OmniAICreator/Qiita-1.07M huggingface dataset:
NSUserDefaults/CoreDataの内容をブラウザで表示する

デバッグする際にリアルタイムでNSUserDefaultsの内容を表示したかったので、ブラウザで見れるライブラリを作ってみました。

2015/6/22 おまけ機能で、CoreDataと永続的に存在しているオブジェクトも閲覧できるようにしました

# 利用例

こんな感じでブラウザからNSUserDefaultsの内容を表示できます。

![example01.png](https://qiita-image-store.s3.amazonaws.com/0/37443/b8768292-cd17-0c09-e037-8055b72b7305.png)

※ Chromeに[JSON Formatter](https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=ja)を入れて表示してます。
# インストール

```ruby
// Podfile

pod 'PSUserDefaultsMonitor', git: 'https://github.com/hmuronaka/PSUserDefaultsMonitor.git'
use_frameworks! # for swift.

```

# 使い方

## start monitor
```Objc
#import "yourproject-swift.h"

// AppDelegate.h
@property(nonatomic, strong) PSUserDefaultsMonitor* monitor;

// AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  monitor = [PSUserDefaultsMonitor defaultMonitor];
  [monitor startMonitorWithPort:5050]; // 5050 is http server listen port.
}
```

## stop

```objc

[monitor stop];

```

## ブラウザからの表示方法

URL: http://{iPhone/iPadのIPアドレス}:{HTTPサーバーのリッスンポート}/U/

※　値がDictionaryかArrayの場合、キーを指定する事も可能です。

下図はNSUserDefaultsのNSLanguagesのみを表示した例

![example03.png](https://qiita-image-store.s3.amazonaws.com/0/37443/d44cb05e-a176-fc86-8641-87cc667369dc.png)

# 注意

無線LANの環境によっては、iPhone~mac間の通信が出来ない場合があります(pingが通らない)。その場合は MacからiPhone, iPhoneからMacへとお互いにpingを発行すると接続出来るようになる場合があります。

# リポジトリ

https://github.com/hmuronaka/PSUserDefaultsMonitor

# おまけ オブジェクトも見れるようにしてみました

需要があるか分からないけど、実装してみた。オブジェクトによっては再帰ループに陥りますが...

```objc
@property(nonatomic, strong) NSMutableDictionary* dict;

-(void)init {
  // 監視対象のオブジェクトを追加.
  // WeakDictionaryとして実装してあるので、PSUserDefaultsMonitorは追加したオブジェクトを弱参照します。
  [[PSUserDefaultsMonitor defaultMonitor] setObject:dict key:@"Test"];
}

-(void)foo {
  dict["TEST"] = @{@"B": @2, ...}
}
 
```

ブラウザの表示は以下のURLから
URL: http://{iPhone/iPadのIPアドレス}:{HTTPサーバーのリッスンポート}/O/


![example02.png](https://qiita-image-store.s3.amazonaws.com/0/37443/3a7dc80f-cd39-333e-751e-a2d6298b883e.png)

# おまけ２ CoreDataも見れます

```objc

-(void)init {
  // 現状では、myContextを強参照します。
  [[PSUserDefaultsMonitor defaultMonitor].managedObjectContext = self.myContext;
}


```

URL: http://{iPhone/iPadのIPアドレス}:{HTTPサーバーのリッスンポート}/C/テーブル名


![example04.png](https://qiita-image-store.s3.amazonaws.com/0/37443/9e93bd90-7ac8-2d08-27b1-13cc0b6eaeeb.png)


# あったら便利

- 実装済:ブラウザから特定のキーのみを表示する.
- 実装済:NSUserDefaults以外のオブジェクトも参照できる.
- 実装済:Json化する際の循環参照回避.
- 実装済: CoreDataを表示
- CoreDataを編集
- オブジェクトのプロパティの内容を表示、編集できる
- ブラウザから値を書き換えられる
- iOS内のファイル操作
【AWS】VPC内で将来的に使いたいプライベートIPを確保しておく


お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

VPC内に複数のECインスタンスを作る際にプライベートIPアドレスはどうされているでしょうか？

インスタンスの役割ごとに、使用するアドレスを決めたりしてないでしょうか？(WEBサーバーは10.0.0.10から10.0.0.19まで、APPサーバーは10.0.0.30から10.0.0.39など)

すぐに使う場合は、特に問題ないのですが、必要になった時に使おうと思っていると、ELBやRDSに勝手に使用されるといった事態が発生することがあります。(ELB等はVPC内の空いているプライベートIPを勝手に割り当てます)

そうならないようにするためにElastic Network Interface(ENI)を利用するといった方法があります。

ENIをつくり、そこにプライベートIPアドレスを割り振っけば、勝手に使用されるということがなくなります。

セカンダリープライベートIPアドレスを利用することで役割ごとに、まとめておくといったこともできます。
なおセカンダリープライベートIPアドレスを利用してまとめたりする場合は、プライマリーIPアドレスは変えることができないので、最後に利用予定、または、使用予定がないIPアドレスを割り当てた方が良いでしょう。
isotopeで要素追加したものに、isotope('layout')が効かない場合

##まずはコード(html)
```html

<div class="grid">
  <div class="grid-item"></div>
  <div class="grid-item grid-item--width2"></div>
  <div class="grid-item"></div>
  <div class="grid-item grid-item--height2"></div>
  ...
</div>

```
##まずはコード(js)
```js
var $grid = $('.gird')
$grid.isotope({
    itemSelector: '.grid-item',
    masonry: {
      columnWidth: 300
    }
})
```
##で、これに新しい要素を追加してあげる:ダメな例

```js
var elem ='<div class="grid-item"></div>';
    elem += '<div class="grid-item"></div>';
$grid.isotope()
    .append( elem )
    .isotope( 'appended', elem )
    .isotope('layout');
```

##何がダメって
appendしてあげているからソース上にはappendされている。
が、isotope('layout')で本来追加された要素にも
追加した.grid-itemの位置がstyle属性として設定されるはずが、されない。

##で、js直す:OKな例
elemはhtmlオブジェクトじゃなくて、jqueryオブジェクトにしてあげる。

```js
var elem ='<div class="grid-item"></div>';
    elem += '<div class="grid-item"></div>';
var $elem = $(elem);
$grid.isotope()
    .append( elem )
    .isotope( 'appended', $elem )
    .isotope('layout');

```

サイトにはhtmlオブジェクトで良さそうな記述なのにね。
(http://isotope.metafizzy.co/methods.html)

4時間くらいはまったあとで解析しなおしたらやっと判明。

たぶんmasonryでも同じなんだろうな。
WWDC2015の休憩中に会場で流れていたAppleオススメの洋楽曲まとめ

WWDC2015の基調講演やセッションの休憩時間に会場で流れている曲が良かったので、
アーティストと曲名をまとめました。

ライブ配信を日本から視聴して参加している開発者の方々にもWWDC会場の雰囲気が伝わったら嬉しいです。

![スクリーンショット 2015-06-11 15.10.22.png](https://qiita-image-store.s3.amazonaws.com/0/34488/096a672a-334a-926d-b0f9-6ffdbe60221a.png)



#WWDC2015のBGM一覧

|アーティスト|曲名|
|:---------|:--|
|Mark Ronson ft. Bruno Mars | Uptown Funk |
|Oceans     | Coasts  |
|Bad Suns   | Cardiac Arrest|
|Michael Franti & Spearhead | Everyone Deserves Music |
|Zedd ft. Matthew Koma, Miriam Bryant|Find You|
|Owl City |Up All Night|
|Vampire Weekend|A-Punk|
|U2|The Miracle (Of Joey Ramone)|
|Zedd ft. Ryan Tedder |Lost At Sea|
|The Killers |Shot At The Night|
|Ellie Goulding |Goodness Gracious|
|Mat Kearney | Heartbeat|
|Foo Fighters|Learn To Fly|
|Barenaked Ladies| Odds Are |
|Michael Franti & SpearHead| Hellow Bonjour|
|Foo Fighters| In The Clear|
|The Killers| Read My Mind|
|Jungle|Time|
|Foo Fighters|Times Like These|

※筆者が移動した部屋で流れていた曲を時系列に並べました。
常にShazamしていたわけではありませんので、完全ではありません。

#楽曲を聴く方法
WWDC2015でAppleが参戦を発表した定額制音楽配信サービスを使用してみてはいかがでしょうか？
LINEやavexも直近から参戦しており、今日本の音楽業界の中で熱い分野です。

|アプリ名|AppStore|
|:---|:---|
|Apple Music         | Coming soon ...
|LINE Music          | https://appsto.re/jp/WLIL5.i|
|AWA                 | https://appsto.re/jp/NiNC6.i| 
|レコチョクBest        |  https://appsto.re/jp/XyamH.i|
|ひかりTVミュージック   | https://appsto.re/jp/zy2CJ.i|
|dミュージック月額コース | https://appsto.re/jp/2HyWS.i|
|PlayStation Music   | Comming soon...|

#おまけ
現地で参加されている開発者の方で「この曲流れてたよ」というのがありましたら、
コメント欄などに記載して頂けると嬉しいです。
[Swift] 任意のキーとオブジェクトを保持するシングルトンインスタンス


iOS アプリ等のクライアントアプリ開発で、こういうクラスがあると何かと便利かと思い。どの画面(Controller)からもインスタンスの取得ができ、自由にキーと値(値はどんな型でもよい)を保持しておくことができます。（ただ、もしかしてアンチパターンかも？）

> 手元の Swift のバージョンは `1.1`。Swift `1.2` 以降であれば、クラスにアクセス修飾子(private) や static が利用できるらしいので、より良く書けるかも。

```swift:
class SomeKeyValueManager {

  // データ保持用のDictionary（Key と Value の配列）
  var showcase = Dictionary<String, Any>()

  // 本クラスのインスタンスを返す（シングルトン）
  class func getInstance() -> SomeKeyValueManager {
    struct Static {
      static let instance = SomeKeyValueManager()
    }
    return Static.instance
  }

  // Key と Value の登録
  func register(#key: String, #value: Any) {
    showcase[key] = value
  }

  // Key（と Value）の解除
  func unregister(#key: String) {
    showcase[key] = nil
  }

  // 特定の Key に対する Value を返す（Optional型）
  func get(#key: String) -> Any? {
    if let value = showcase[key] {
      return value
    } else {
      return nil
    }
  }

  // 登録されている Key と Value の組を全て返す
  func get() -> Dictionary<String, Any> {
    return showcase
  }

  // 登録数を返す
  func count() -> Int {
    return showcase.count
  }
}
```

### 利用例

```swift:
// インスタンスを取得
let manager = SomeKeyValueManager.getInstance()

// 任意の Key と Value を登録
manager.register(key: "key1", value: "someString")
manager.register(key: "key2", value: 99)

// 一件取得
if let item = manager.get(key: "key1") {
  println(item) // => someString
}

// 全件取得
for (key, value) in manager.get() {
  println("key: \(key), value: \(value)") // => key: key1, value: someString
                                          // => key: key2, value: 99
}

// 件数
println(manager.count()) // => 2
```

## 補足

もし Key が任意の文字列で気持ち悪い場合は Enum にすればよいかと。同様に、Value を絞りたければ Any を具体的な型へ変更すればよいかと思います。

またもし Key が不要で、値だけどんどん登録したい場合は Dictionary を辞めて Array に変えればよいかと。
JekyllのHTMLテンプレートで変数を使用する方法4種類

# _config.ymlで宣言した変数

`site.(変数名)`で呼び出すことができる。

```yaml:_config.yml
hogeString: hogehoge
hoge:
  hage: hogehage
  fuge: hogefuge

```
```html:index.html
...
<p>{{ site.hogeString }},{{ site.hoge.hage }},{{ site.hoge.fuge }}</p>
<!-- <p>hogehoge,hogehage,hogefuge</p> -->
...
```

# YAML Front Matterで宣言した変数

`page.(変数名)`で呼び出すことができる。

```html:_layouts/basic.html
...
<body id="{{ page.rootId }}" class="{{ page.rootClass }}">
<!-- <body id="index-page" class="index-page"> -->
  {{ content }}
</body>
```
```html:index.html
---
layout: basic
rootClass: index-page
rootId: index-page
---
<p>hoge</p>
<!-- <body id="index-page" class="index-page"> -->
<!--   <p>hoge</p> -->
<!-- </body> -->
```

すべてのファイルで定義するのが面倒な場合、デフォルト値を[Front Matter Defaults](http://jekyllrb.com/docs/configuration/#front-matter-defaults)にあらかじめ設定しておくことも可能な模様。

# 使い捨ての変数を宣言

宣言したファイルの中でしか参照できないと思う。

```html:index.html
{% assign hogeVar = "hogehoge" %}
...
<ul class="{{ hogeVar }}">
  <li>{{ hogeVar }}</li>
</ul>
<!-- <ul class="hogehoge"> -->
<!--   <li>hogehoge</li> -->
<!-- </ul> -->
```

# パーシャルをincludeする際にパラメータとして渡す

include先のファイル内に`include.(変数名)`を記述することでパラメータを親から子へ渡すことができる。ビューを再利用しやすくなるのでとても便利。

```html:_includes/part.html
<input type="button" name="{{ include.name }}" value="{{ include.val }}" />
{% if include.name == "my-button" %}
  <small>This is mine!</small>
{% endif %}
```

```html:index.html
...
<form>
  {% include part.html name="my-button" val="My Button" %}
  <!-- <input type="button name="my-button" value="My Button" /> -->
  <!-- <small>This is mine!</small> -->
  {% include part.html name="your-button" val="Your Button" %}
  <!-- <input type="button name="my-button" value="My Button" /> -->
</form>
...
```



# 使い分け

* サイト全体で共通化したい文字列は、_config.yml内に記述
  * 例) title要素のサイト名部分
* ページごとに異なる文字列が入る部分は、YAML Front Matter内に記述
  * 例) title要素の記事タイトル部分
* 1ファイルの中で繰り返す文字列を単にまとめたい場合は、使い捨ての変数で記述

# 参考情報

* [Jekyll - Configuration](http://jekyllrb.com/docs/configuration/)
* [Jekyll - Front Matter](http://jekyllrb.com/docs/frontmatter/)
* [Liquid for Designers](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers)
ajax読み込みでFailed to load resource: the server responded with a status of 412 (Precondition Failed)が出る場合

#Safariのajax読み込みでPrecondition Failedになる場合
***
##発生状況
jqueryの$.ajaxで以下のようにデータを取得している場合

```js

    $.ajax({
        url: "hoge.json",
        method: 'POST',
        dataType: 'json',
    })
    .done(function(data) {
        //do something
    })
    .fail(function() {
        console.log( "error" );
    })
    .always(function() {
        //do something
    });

```

***
##発生するエラー
[Error] Failed to load resource: the server responded with a status of 412 (Precondition Failed) (hoge.json, line 0)

***
##直し方
$.ajaxのbeforeSendで時間を指定してあげれば良い。
確認しているなかで、safariがヒットする。iOSのサファリも出るのかな。

```js

    $.ajax({
        url: "hoge.json",
        method: 'POST',
        dataType: 'json',
        //以下追加
        //再現している環境がsafariのみなので、安易にsafariのみ判定
        beforeSend : function( xhr ){
            if (window.navigator.userAgent.toLowerCase().indexOf('safari') != -1)
                xhr.setRequestHeader("If-Modified-Since", new Date().toUTCString());
        }                
    })

```

***
##なんで治るのかというか、そもそもなんのエラーなのか
###リクエストヘッダーの以下の値の評価がfalseになってしまうらしい←
(リクエストヘッダーって、なんぞ、っていう。。
すみません、詳しい方いたら補足もらえると嬉しいっす。)

* If-Match
* If-None-Match
* If-Unmodified-Since

ということで、そのうちの１つ、If-Unmodified-Sinceに最新データを渡してあげて、最新データと認識させてあげる。

***
***
調べると、chromeでもエラー出てるケースもあるみたいで、果たしてこの方法が良いのか悪いのか。




・・・
BeaconBridgeにユーザ登録してリファレンスアプリを使ってみた(iOS)



ビーコンプラットフォーム BeaconBridgeのトライアルに申込み、リファレンスアプリを使用してみたので、少しまとめました。

#経緯
5/15にクラウドコンピューティングExpoに参加したら、ビーコンを利用するためのプラットフォームがいくつか展示されてました。
その中に無料でトライアル利用できるBeaconBridgeというものがあったので、試してみました。

# トライアル利用

トライアル版には以下のような制限があるようです。
とりあえず、60日間利用できれば十分でしょう。
アクションとルールはどのようなものか、まだ判断できていません。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/aa47a73a-cecd-8789-9b92-48359029be68.png" alt="trial" width="700">


利用までの流れは以下でした。
1. トライアル利用の申込み(Googleフォーム)
2. アカウント作成メールを受信
3. アカウント確認メールからアクティベート


## 1.トライアル利用の申込み
まず、こちらにサイトからトライアル利用を申し込む。
<a href=http://try.beaconbridge.io/> ビーコンプラットフォーム:BeaconBridge 無料トライアル </a>

※ 展示会ではステッカーを配布しており、そこにQRコードが印刷されてました。
トライアルの利用申込みはGoogleフォームで、個人利用と企業利用の2種類でした。
(個人利用の方が入力項目が少なくて楽でした


## 2.アカウント作成メール受信
登録時のメールアドレスにアカウント作成完了メールが届く。
手動運用らしく、メールが届くまで数時間かかりました。


## 3.アクティベート
アカウント作成メールとは別途、アクティベート用のメールが届きました。
ここまで来たらトライアル利用できるようになりました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/d118b9a7-4abe-bc85-9121-a8850c95d068.png" alt="mail" width="700">



## 4.ユーザページへのログイン
ログイン画面はこんな感じでした。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/600752aa-f038-d328-e1c0-8c5c890a95d3.png" alt="login" width="700">

ログインすると表示されるユーザページの画面はこちら。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/9c0fd736-d180-f45f-3f10-77ce8ae838b2.png" alt="login" width="700">



#リファレンスアプリの利用
とりあえず、リファレンスアプリが公開されていたので、iOS版を利用してみました。
<a href="https://itunes.apple.com/jp/app/beaconbridgerifarensu/id948177766?l=ja&ls=1&mt=8">BeaconBridgeリファレンス</a>

手元にビーコンがないので、動作確認にはiPhone2台利用しました。
(トライアルの注意事項にアプリがビーコンの代替として使えると書かれていたので)

* 利用端末　: iPhone5,iPhone6+
* OSVer　　: iOS8.x

　
#### 起動直後の画面
アプリケーションを利用するための注意事項が書かれてました。
(ビーコンを利用するので位置情報についてとBluetooth ONにすること)

<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/7db12137-aa08-4dcc-30ce-97865e194be5.png" alt="BLE" width="300">


<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/7ab66e84-641b-2c0c-92b2-01e4a286abca.png" alt="location" width="300">

#### デモモード
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/a889c366-4ab6-79fb-0952-e5e005b68904.png" alt="demo_img" width="300">


#### ビーコンモード
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/139fe2ee-db7a-f584-c805-e457d99c294f.png" alt="beacon_img" width="300">



片方をビーコンモード、もう片方を検出状態にして試してみました。
ローカル通知が来るようです。
※ アプリをBackgroundにしても、検出イベントが上がってくるようです。

#### ビーコン受信
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/5d1afcc8-c64a-e050-e455-89b2a7a4af71.png" alt="demo_img" width="300">


# 感想
リファレンスアプリだけでは、外部サービス連携やSDKの使い勝手が見えてませんが、今後も利用した結果をまとめてみます。
リモートデスクトップ接続のちょっとした工夫

## お知らせ

[続編書きました](http://qiita.com/h_kachodairi/items/697050b30052bb0894df)

## リモートでの同時最大接続数が「1」なWindows系OS

WindowsServerであればリモートデスクトップの同時最大接続数を簡単に変更でますが、Windows7などの非サーバーでは、同時最大接続数を簡単には変更できません。

個人用途であれば、「Universal Termsrv.dll Patch」で最大接続数を増やせるようですが、業務目的のマシンに適用するとなるとNG判定されることが多いと思います。

+ （参考）[Windows7/Vista/XPのリモートデスクトップのセッション数制限を解除する「Universal Termsrv.dll Patch」](http://gigazine.net/news/20091205_universal_termsrv_dll_patch/)

そういう理由で同時最大接続数を1にしたままにしておくと、自分が作業をしているときに、他の人がログインしてきてセッションが切れるということが多発します。

+ 気分がノってるときに遭遇すると悲しくて悲しくて目に涙を浮かべながら下野由貴ちゃんの卓上カレンダーを眺めています

そんなモチベの低下を少しでも減らすためのバッチを作りました。

## 主な仕様

+ （おまけ）接続先のマシンに関する情報をCSVから取得する
+ （おまけ）接続先にpingを打って生死確認
+ 接続先に接続中のユーザがいないかを確認する⇒PSToolsを使う
+ 目視確認の上、問題なければリモートデスクトップで接続

## バッチのご紹介

```bat
@echo off
cd /d "%~dp0"
set /P INP=サーバー名を入力してください 例:YUKIDOKUSEN ＞
for /f "eol=, delims=, tokens=1-4" %%i in ('findstr /I %INP% serverlist.csv') do (
	set sv_name=%%i
	set sv_ip=%%j
	set user_name=%%k
	set user_pass=%%l
)
if DEFINED sv_name (
	@echo on
	echo;
	echo ＊＊＊PING送信中＊＊＊
	ping -n 1 %sv_ip%
	echo;
	echo ＊＊＊ログイン中のユーザ確認＊＊＊
	PSTools\PsExec.exe \\%sv_ip% -u %user_name% -p %user_pass% query user
	echo ＊＊＊状態がDiscならログイン状態を奪いません＊＊＊
	echo ＊＊＊状態がActiveの場合は誰かがログインしています＊＊＊
	echo;
	setlocal enabledelayedexpansion
	set /p YN=リモートデスクトップで接続しますか？[Y/N]
	if /i "!YN!"=="Y" ( 
		mstsc /v:%sv_ip%
	) else (
		exit /b
	)
)
```

バッチ本体とPSToolsをチーム内に配ると、みんなが少しだけハッピーに！

+ なる予定だったんですが２人くらいにしかお礼言われてません（f●ck)

## PSTools

早い話が、プロセスをリモートで実行するためのマイクロソフト謹製ツールです。

+ [PsTools == Windows Sysinternals](https://technet.microsoft.com/ja-jp/sysinternals/bb896649.aspx)

今回は、query userのコマンドをリモートで実行してその結果を確認していますが、当然、他のコマンドも叩けます。活用方法はいろいろあるのではないでしょうか。

## 備考

+ そんなに凝ったバッチでもないんですが、2回目のset /pで入力値をまともに受け取ってもらえませんでした
+ 解決策は、「setlocal enabledelayedexpansion」の一文
+ 未だに、なぜ、必要なのかよくわかってはいません（ぉぃ）
CoreosでRpmdb checksum is invalid:が出力された場合の措置

# coreos上のコンテナーでエラー

coreos上のdockerコンテナーをbuildした際にyumで以下のエラーが発生した。

```
Rpmdb checksum is invalid:
```

# 対処方法

```
yum install -y xxxx | true
※xxxxの部分は適時変更する
```

このように、| trueを付与することで、これを無視することができ、build処理を
継続できた。
VirtualDocumentRootを使ってサブドメインを活用する

# 事の発端

CakePHPの環境を作るたびにApacheのVirtualHost設定するのが面倒なので、サブドメインでアクセスできるようにApacheの設定を行おう！

*.hoge.example.comでバーチャルホストを切れるように設定する

# 環境

* Apache2.2
 * VirtualDocumentRootを使うのでmod_vhost_aliasが必須

# DNSレコード設定

Aレコードに*.hoge.example.comがWebサーバに向くように設定する。

# Apacheの設定

##### Apacheの設定ファイルにVirtualHostの設定を追加する。

```apache
<VirtualHost *:80>
    ServerName hoge.example.com
    ServerAlias *.hoge.example.com
    VirtualDocumentRoot /var/www/hoge.example.com/%1
    CustomLog    logs/hoge.example.com_access_log combined
    ErrorLog     logs/hoge.example.com_error_log
    # 必要に応じて追加
    <Directory "/var/www/hoge.example.com/%1">
        AllowOverride All
        Options FollowSymlinks
    </Directory>
</VirtualHost>
```

##### Apacheを再起動して設定を反映させる。

```zsh
% sudo apachectl configtest
Syntax OK
% sudo apachectl restart
```

これで以下の通りにマッピングされる。

|ホスト名|ディレクトリ|
|:-----------|:------------|
|fuga.hoge.example.com|/var/www/hoge.example.com/fuga|
|piyo.hoge.example.com|/var/www/hoge.example.com/piyo|

# その他捕捉

CakePHP3を実行しようとしたところそのままだとリダイレクトループに陥ってしまうので、.htaccessにRewriteBaseを追記する。

```diff:CAKE/.htaccess
 <IfModule mod_rewrite.c>
     RewriteEngine on
+    RewriteBase /
     RewriteRule    ^$    webroot/    [L]
     RewriteRule    (.*) webroot/$1    [L]
 </IfModule>
```
```diff:CAKE/webroot/.htaccess
 <IfModule mod_rewrite.c>
     RewriteEngine On
+    RewriteBase /
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteRule ^ index.php [L]
 </IfModule>
```
進行形：Chaplin.js のページ遷移でフェードアウトがぶつ切りになる問題

Chaplin.js はメモリ管理がきっちりしているので、画面遷移時に古い controller およびその管理下にある view や model をきれいさっぱり片付けてくれます。

これはこれでとても良い。けれど、例えば Bootstrap の Modal を使って確認ダイアログを出している場合、次画面への遷移時にフェードアウトの処理がぶった切られて、全画面カバーが残ったままになったりします。切ないですね。

そもそも Chaplin ではページ遷移エフェクトをサポートしていない（メモリ管理を優先・徹底するためのトレードオフであり、設計思想でもある）ため、こういった問題についてはアプリ側で対処することになります。

ひとまず手持ちの対処法晒すのですが、どれもイマイチなので、突っ込みもらいたいなと。Chaplin しか知らないので、Angular とか、他の SPA 用フレームワークならこんな冴えたやり方あるぜ、ってのでもいいです。

# 案1：view.dispose でゴミ掃除

遷移前に dispose される側の view でエフェクトの残骸を消します。Bootstrap の Modal はネストできないので、処理は共通化できます。ベースの view に実装するのが簡単かなと。

```coffeescript:view.coffee
class EditView extends View
  dispose: ->
    $('body').removeClass("modal-open")
    $('.modal-backdrop').remove()
    super()
...
```

実装は単純で良いですが、エフェクトがぶった切られるのはそのままです。しかし、キビキビ感が出るからこれでいいという人もいるかもしれない。遷移しないならフェードアウトは欲しいけど、遷移する場合はスパっとと切り替わって欲しいという感覚が、なんとなくあるような気がしますが、どうなんでしょう。。。

# 案2：view から controller にエフェクト終了通知をあげる

エフェクトの終了時に view からイベントを上げます。イベントを受け取った controller は明示的に遷移を行います。

```coffeescript:controller.coffee
class EditController extends Controller
  show: ->
    @view = new EditView
      region: 'main'
      model: new Model()
    @listenTo(@view, 'dialogClosed', @transition)

  transition: ->
    @redirectTo url: "/foo/bar"

  ....
```

```coffeescript:view.coffee
class EditView extends View
  events:
    'click #action', 'notifyDialogClosed'

  notifyDialogClosed: ->
    dialog = $("#confirmDialog")
    dialog.on 'hidden.bs.modal', =>
      @trigger('dialogClosed')
    
    dialog.modal('hide')

  ...
```

エフェクトが完全に終わるまで待ってから遷移するので、その点は良いですが、案1と比較するとずいぶん回りくどくなってます。また、Bootstrap の Modal でせっかく全画面カバーしているのに、遷移前に一瞬だけそれが解除されてしまいます。さらに、もっさり感もアップします。というわけで、正直使えないです。

# 案3：エフェクトを使わない

身も蓋もないですが、そもそも問題がなかったことにしてしまう。業務アプリなら、これもアリな気がしますが。

# 現在進行形

というわけで、アプリ側でできることをあげてみました。また何か思いついたら書き足します。

# 参考

- [View transition support #105 - chaplinjs/chaplin](https://github.com/chaplinjs/chaplin/issues/105)
- [Backbone.Events ](http://backbonejs.org/#Events)
- [Chaplin.utils](http://docs.chaplinjs.org/chaplin.utils.html)
Bootstrap3のnavigationをslimで書く

初めてslimをやってみてBootstrapのナビゲーション周りを書くのに意外と手間取ったので、
その部分だけ抜粋しておこうと思います。


```
doctype html
html
  head
    meta charset='utf-8'
    title MyPortfolio
    link rel='stylesheet' href='css/lib/bootstrap.css'
    link rel='stylesheet' href='css/styles.css'
  body
    nav.navbar.navbar-default.navbar-fixed-top
      .container
        .navbar-header
          button.navbar-toggle.collapsed type='button' data-toggle='collapse' data-target='#menu'
            span.sr-only Toggle Navigation
            span.icon-bar
            span.icon-bar
            span.icon-bar
          a.navbar-brand href='/' MyPortfolio
        #menu.collapse.navbar-collapse
          ul.nav.navbar-nav.navbar-right
            li
              a href='#about' About
            li
              a href='#portfolio' Portfolio
            li
              a href='#price' Price
            li
              a href='#contact' Contact
    == yield
    script src='js/lib/jquery.js'
    script src='js/lib/bootstrap.js'
```
グリッドシステム

##グリッドシステム
###グリッドシステムとは
グリッド（格子）の行を表す`row`というクラスを持つブロック要素をまず配置し、その中に、列数の合計が12になるようにブロックを配置していく

###グリッドシステムの実装方法
1. class="container"の中に
2. class="row"を作って
3. class="col-{prefix}-{columns}"を指定

+ `{columns}`は合計値が１２になるように数値を指定する
+ `{prefix}`は下記のルールで指定できる

|画面サイズ|適用範囲|指定方法（*は数値）|
|---|---|---|---|
|モバイル|768px以下|col-xs-*|
|タブレット|768px以上、992px未満|col-sm-*|
|デスクトップ|992px以上、1200px未満|col-md-*|
|デスクトップ|1200px以上|col-lg-*|
SSHのログインセッションが切れても処理が止まらないようにスクリプトを走らせる

SSHでログインしてちょっと眺めの処理をする時に何も対策をしないと接続が少し切れただけでその処理が途中で終了してしまいます。

なので、`ssh`で接続してる時に何か時間のかかるスクリプトを走らせる方法を調べてみました。

## 方法

```shell-session
nohup my_script &
```

でOKです。 `nohup`の読み方は多分「ノーハングアップ」。最後の`&`でバックグラウンド処理になります。
PowerShellでHyper-Vの仮想マシンをインポートする

PowerShellの勉強がてら、Hyper-Vの仮想マシンをインポートするスクリプトを書きました。

```
$inputHostName = Read-Host "作成するマシン名を入力してください"

$pathWindowsMaster = 'D:\Hyper-V\Windows-Master-Export\Windows-Master\Virtual Machines\xxxxxxxxxxxxxx.XML'
$pathHostDir = 'D:\Hyper-V\' + $inputHostName
$pathWindowsMasterVhdx = $pathHostDir + '\Windows-Master_OS.vhdx'
$importedName = 'Windows-Master'
$vhdxName = $inputHostName + '.vhdx'
$vhdxPath = $pathHostDir + '\' +$vhdxName

Write-Output "仮想マシンのインポート…"
Import-VM -Path $pathWindowsMaster –Copy -GenerateNewId -VirtualMachinePath $pathHostDir -SmartPagingFilePath $pathHostDir -SnapshotFilePath $pathHostDir -VhdDestinationPath $pathHostDir
Write-Output "仮想マシンの名前を変更…"
Rename-VM $importedName -NewName $inputHostName
Write-Output "仮想マシンのVHDXのファイル名変更…"
Rename-Item $pathWindowsMasterVhdx $vhdxName
Write-Output "仮想マシンのVHDXファイル指定…"
Set-VMHardDiskDrive -VMName $inputHostName -Path $vhdxPath
Write-Output "作成完了"
```

手でやっていることをスクリプトに焼き直しただけなのでツッコミどころは多いと思います（笑）。
Selenium IDEのインストール

# ブラウザテスト
UnitテストもAPI等のサーバーならそれだけでいいけど、html、jsなど絡んでくると最終的にはブラウザでの動作確認も必要ですよね。一回はIEに統一しかかった時期もあったけどchromeが出てきたあたりからまた群雄割拠になって・・・
すると各ブラウザでのテストが増えます。
　→やってられません(笑)

# インストール
## Firefox プラグインインストール

下記URLの下のほう「Selenium IDE」というキーワードがある部分、このサイトからのインストールは許可されていませんとでますが、Seleniumのサイトからなので許可。

http://www.seleniumhq.org/download/
![selenium ide.jpg](https://qiita-image-store.s3.amazonaws.com/0/12727/1af1ed4a-668e-69f6-9ba2-73b3e5f05f0b.jpeg)


インストール後アイコンがブラウザに表示されればOK

![Selenium IDE icon.jpg](https://qiita-image-store.s3.amazonaws.com/0/12727/198dbca9-6825-976c-fb59-250cf0af092c.jpeg)

Firefoxだけのテストならこれだけで終了なのですが、他のブラウザもテストする場合はほかにもファイルが必要になります。

一回インストールしてしまうとマシンを変えたときに忘れてしまうのでここに備忘録も兼ねて残しておく。

欲しいファイルは以下のファイル
* selenium-server-standalone-x.xx.x.jar
* chromedriver.exe
* IEDriverServer.exe

## selenium-server-standalone-x.xx.x.jar ダウンロード
http://www.seleniumhq.org/download/
![server.png](https://qiita-image-store.s3.amazonaws.com/0/12727/da5b2381-36b2-c28f-bd8f-1fa51c03c4ac.png)


## chromedriver.exe、IEDriverServer.exe ダウンロード
各ブラウザのドライバをダウンロード
サーバー落としたページの少し下にリンクがあるのでそちらをクリック

![driver link.jpg](https://qiita-image-store.s3.amazonaws.com/0/12727/0afdd114-6fce-bb0b-c4a9-0a98e8caf033.jpeg)


すると各ドライバのリンクがあるのでクリックしてダウンロード

![driver.jpg](https://qiita-image-store.s3.amazonaws.com/0/12727/1361a139-126d-ae97-6048-398652772f02.jpeg)


# テスト実行
## Firefoxでの実行
Firefoxの場合は特に必要なくアイコンからテストを作成して実行すればいいのでさほど難しくありません。

## Firefox以外での実行
Firefox以外の場合は、先ほどダウンロードしたファイルを同じフォルダにいれます。
同じフォルダに以下のファイルを作成しておきます。（毎回手でたたくのでもかまいません） Firefox以外のブラウザの場合はこのバッチでサーバーを実行しておく必要があります。

```bat:server.bat
@echo off
java -jar selenium-server-standalone-x.xx.x.jar -Dwebdriver.ie.driver=.\IEDriverServer.exe -Dwebdriver.chrome.driver=.\chromedriver.exe
```

1. サーバー実行
server.batをクリック
1. Selenium IDE側でブラウザを切り替え設定
オプションから```WebDriver```タブを開き、```Enable WebDriver Playback```をチェックし実行したいブラウザを指定、ここで下のほうに指定できるブラウザの例が書かれている。
　
![option2.jpg](https://qiita-image-store.s3.amazonaws.com/0/12727/34b08346-c73a-cf34-8464-550fe425f023.jpeg)

　
 **WebDriverの設定を変更した場合は、```Selenium IDE```を一度開きなおす必要がある。**
Azure VMを決められた時刻に起動・停止させる

Azure VMを決められた時刻で起動・停止させたかったので、どうやるかを調べてみた。
それぞれAPIは用意されているので、あとは実行タイミングを制御できればそれでいけるはず。
APIは「Azure PowerShell」を使えば、PowerShellから操作できる。

起動：Start-AzureVM(https://msdn.microsoft.com/en-us/library/azure/dn495226.aspx)
停止：Stop-AzureVM(https://msdn.microsoft.com/en-us/library/azure/dn495269.aspx)
状態確認：Get-AzureVM(https://msdn.microsoft.com/en-us/library/azure/dn495236.aspx)
#参考ページ
* Azure Automaitonを使うのが楽そう。微妙に料金はかかるけど。
http://clemmblog.azurewebsites.net/using-azure-automation-start-und-stop-virtual-machines-schedule/


* ジョブスケジューラを使う方法もあった。初めの設定に時間がかかりそうだけど、無料なのと実行タイミングを細かく決められそうなのはいい。
https://a-auto50.unirita.co.jp/case_study2/


他には参考になる方法が見当たらなかった。AWSと比べると少ないなー....
c#のMQTTブローカーをsocket.ioに置き換えました。

##概要
「ohijs0.paas.jp-e1.cloudn-service.com/」のサンプルで、c#のMQTTブローカーをsocket.ioに置き換えました。

##部品表
* Attiny85
* BMP085
* 基板
* ピン

## 完成品    
![](http://jsrun.it/assets/d/s/r/B/dsrBU "BMP085")       
![](http://jsrun.it/assets/7/R/Y/O/7RYOd "BMP085")       

## 回路図
![](http://jsrun.it/assets/p/F/L/1/pFL1o "BMP085")

## プログラム
* attiny85
* [jsdo](http://jsdo.it/ohisama1/p2Ls "jsdoのページ") 
* グラフ表示
* [jsdo](http://jsdo.it/ohisama1/tlxe "jsdoのページ")     

## 説明
* MQTTブローカー、sangoを使ってましたが、自前でないと。
* c#から、cloudnにemitしています。9秒間隔です。    
* c#は、socketioclientdotnetを使っています。
* グラフは、socket.io.jsを使っています。
tinymce advanced のスタイル変更。functions.phpで。

```php
add_filter( 'tiny_mce_before_init', 'fb_mce_before_init' );
function fb_mce_before_init( $settings ) {

    $style_formats = array(
        array(
            'title' => 'Download Link',
            'selector' => 'a',
            'classes' => 'download'
        ),
        array(
            'title' => 'My Test',
            'selector' => 'p',
            'classes' => 'mytest',
        ),
        array(
            'title' => 'AlertBox',
            'block' => 'div',
            'classes' => 'alert_box',
            'wrapper' => true
        ),
        array(
            'title' => 'Red Uppercase Text',
            'inline' => 'span',
            'styles' => array(
                'color'         => 'red', // or hex value #ff0000
                'fontWeight'    => 'bold',
                'textTransform' => 'uppercase'
            )
        )
    );

    $settings['style_formats'] = json_encode( $style_formats );
    return $settings;
}
```
Clojure by Example

宣伝ですいません。

[Clojure by Example](http://kimh.github.io/clojure-by-example)というサイトを作りました！まだまだExampleの数は少ないですが、今後も少しずつ追加していく予定です。Clojureを学び始めた人に役立てば幸いです。
c++ builder > TThread:WaitFor()を使うときの注意 > FreeOnTerminateをfalseにしておく

```txt:動作環境
c++ Builder XE4
```

TThread:にはWaitFor()がある (http://www.gesource.jp/weblog/?p=562)。

TThread:WaitFor()を使って、threadの終了を待っていたのだが、WaitFor()にたどり着かない問題があった。

http://www.borlandtalk.com/image-vp94655.html
によると
> I seem to remember that FreeOnTerminate must be false if you are going to use WaitFor() as otherwise the thread's memory can get deleted before you return 
from Terminate() and you can get intermittent AVs.
AndroidNDKでccache

<a href="http://ja.wikipedia.org/wiki/Ccache" target="_blank">ccache - ウィキペディア</a>

> ccacheとは、CまたはC++コンパイラが出力するデータをキャッシュするソフトウェア開発ツールである。
> その目的は、2回目以降のソフトウェアビルドにおいてはコンパイルを避け、出力結果を再利用することにある。
> これは再コンパイル速度を劇的に改善する。

これを Eclipse の NDK ビルド時に使用するようにします。


* 前提条件
    * Mac OS X
    * Xcode インストール済み。
    * Eclipse + ADT インストール済み。


Homebrew のインストール
--------------------------------

<a href="http://brew.sh/index_ja.html" target="_blank">ここ</a> から`Homebrew`をインストール

インストール後、ターミナルで下記コマンドを実行

~~~sh
# brew の更新
$ brew update
~~~


ccache のインストール
--------------------------------

ターミナルで下記コマンドを実行

~~~sh
# ccache をインストール
$ brew install ccache

# インストールしたパッケージを更新
$ brew upgrade --all
~~~


ccache のパス確認
---------------------------------

ターミナルで下記コマンドを実行。
`ccache`の実行パスをコピーしておく。(ここでは例で`/usr/local/bin/ccache`とする)

~~~sh
# 指定したコマンドの実行ファイルパスを調べる
$ which ccache
/usr/local/bin/ccache
~~~


Eclipse の環境変数設定
---------------------------------

環境設定から「C/C++」→「Build」→「Environment」
右側にある「Add...」をクリック

それぞれ下記を記入後、「OK」

項目  | 内容
------|------------------
Name  | NDK_CCACHE
Value | ccacheのパス (`/usr/local/bin/ccache`)


---------------------------------

初回はキャッシュが無いのでいつも通り。
２回目以降はキャッシュが効けば早くなる。

はず。


###### おまけ: ccache

~~~sh
# キャッシュの情報・ステータスを表示する
$ ccache -s

# 古いキャッシュをいい感じに削除する
$ ccache -c

# 全てのキャッシュを削除する
$ ccache -C
~~~
[css]BEM



すべての要素をBlock / Element / Modifierの概念に切って設計する概念。　

Element: アンダーバー２つ  __element
Modifier: ハイフン２つ --modifier

Block Element Modifierの概念が掴みづらい。

和訳
Block : 石や木の塊
Element : 全体の中で必要な要素、成分、構成部分
Modifier : 修飾語句(color-green / action-activeなどkeyとvalueで記述)


基本文法は、
「XXのZZのYY」

XX : Block
YY : Element
ZZ : Modifier 


例文

* [ユーザー]の[大きい][アイコン]
user__icon--size-big

* [テーブル]の[タイトル]
table__title

* [本のテーブル]の[ラベル]
book-table__label

* [本の売り上げチャートの][緑の][バー]
book-sales-chart__bar--color-green

* [テーブル]の[四角い][ボタン]
table__button--shape-square

* [著者の詳細情報のボックス]の[枠]
author-detail-box__frame

* [調査結果]の[トータルスコア]
survey-result--info-total-score
Google Drive push notifications を hubot で受ける

Google Driveの変更を通知する[仕組み](https://developers.google.com/drive/v2/reference/changes/watch)を活用して何かしたい。

### 特定のDriveフォルダの変更を通知させる
#### サービスアカウントの作成をする
1. [Google Developers Console](https://console.developers.google.com/)からプロジェクトの選択またはプロジェクトの作成を実施
2. APIと認証 > API でDrive APIを有効にする  
![image](https://qiita-image-store.s3.amazonaws.com/0/10256/c28f5fc4-7cc7-5587-114a-af4ac3d60f1f.png)
3. APIと認証 > 認証情報から新しいクライアントIDを作成を実施  
サービスアカウントで作成する  
![image](https://qiita-image-store.s3.amazonaws.com/0/10256/01cc9e37-b702-3ad5-cc38-fb22b3e31f77.png)
4. 新しいP12キーを作成ボタンでP12キーを作成しダウンロードされたものを保管
5. APIと認証 > プッシュ からプッシュを受けるドメインを追加しておく  
webmasterでドメインの所有者登録しておく必要あり

#### フォルダ共有
* サービスアカウントのメールアドレスを通知したいDriveフォルダの共同編集者として登録する  
![image](https://qiita-image-store.s3.amazonaws.com/0/10256/0b23d17b-2070-20a9-36a7-b7459cdec09a.png)

### プッシュを受けるサイト設定
* hubotのrouterで受ける場合  

```coffeescript
  robot.router.post "/google/drive/notifications", (req, res) ->
    robot.logger.debug req
    # 何かしらの処理
    res.status(200).send 'ok'
```

### プッシュ通知設定
* ダウンロードしたp12キーをpemに変換する  

```bash
openssl pkcs12 -in xxx.p12 -nocerts -passin pass:notasecret -nodes -out xxx.pem
```

* watch apiで登録する  
coffeescriptで実施するサンプル  

```coffeescript
googleapis = require('googleapis')
drive = googleapis.drive({version: 'v2'})

SERVICE_ACCOUNT_EMAIL = 'xxx@developer.gserviceaccount.com'
SERVICE_ACCOUNT_KEY = 'xxx.pem'
SCOPE = [
  "https://www.googleapis.com/auth/drive",
  "https://www.googleapis.com/auth/drive.file",
  "https://www.googleapis.com/auth/drive.readonly",
  "https://www.googleapis.com/auth/drive.metadata.readonly",
  "https://www.googleapis.com/auth/drive.appdata",
  "https://www.googleapis.com/auth/drive.apps.readonly",
  "https://www.googleapis.com/auth/drive.metadata",
]

jwt = new googleapis.auth.JWT(SERVICE_ACCOUNT_EMAIL, SERVICE_ACCOUNT_KEY, null, SCOPE)
resource = {id: 'watch-001', type: 'web_hook', address: 'https://上記でプッシュ設定したドメイン/google/drive/notifications'}
jwt.authorize (err, tokens) ->
  if err
    console.log err
  else
    jwt.credentials = tokens
    drive.changes.watch {auth: jwt, resource: resource}, (err, resp) ->
    if err
      console.log err
    else
      console.log resp
```

* 確認  
サービスアカウントに共有したフォルダ以下で何かしらのファイル変更を実施すると `https://上記でプッシュ設定したドメイン/google/drive/notifications` に通知が飛んでくる

```
2015-06-11T03:15:35.450146+00:00 heroku[router]: at=info method=POST path="/google/drive/notifications" host=xxx.herokuapp.com request_id=4660b262-e65b-42bc-bfad-06a9a290c292 fwd="xx.xx.xx.xx" dyno=web.1 connect=0ms service=6ms status=200 bytes=164
```
Kobito以外のMarkdownエディタを探してみた


Kobitoだと社内用のものをうっかりQiitaに投稿しちゃう恐れがあるので（ドジっ子なので）
お仕事用には別のMarkdownエディタを使おうと思って
ちょっと調べてみました。

有名どころだと[Sublime Text](http://www.sublimetext.com/3)がよく使われているようで
以前から気にはなっているのですが
なんとなく[MacDown](http://macdown.uranusjr.com/)という別のMarkdownエディタを使ってみることにしました。

ええ、ひねくれ者ですから。

##MacDown

MouというMarkdownエディタにインスパイアして
作られたものらしいです。
Mou自体は使ったことがないのですが
開発がストップしてしまっているようなので
こちらを使用することにしました。

###インストール方法
[MacDown](http://macdown.uranusjr.com/)からダウンロードしてきたMacDown.app.zipを解凍して
Applicationフォルダに移動するだけ。
すごく簡単。


##QLMarkDown

QLMarkDownはMacのQuickLookでmd形式のファイルを
プレビューできるようにするプラグインです。
いちいちエディタを開くのが面倒なときに使えますね。


###インストール方法

私はHomebrewを導入しているので
まずターミナルで下記コマンドを入力してHomebrew-caskをインストール。

```brew install caskroom/cask/brew-cask```

そのあと、homebrew-caskでQLMarkDownをインストールします。

```brew cask install qlmarkdown```

これでFinderでmd形式のファイルを選択してスペースキーを押せば
QuickLookでプレビューすることができるようになりました。


***

参考記事：
[快適 Markdown ライフを送ろう！Mac で使える Markdown 支援ツール6選 ｜ Developers.IO](http://dev.classmethod.jp/tool/markdown-tool-for-mac/)
[みんなhomebrew-caskって知ってるか？](http://qiita.com/ryurock/items/1432578d364985f6cb06)

***

追記：
コメントで教えていただいたATOMもインストールしてみました。
多機能で持て余しそうですが、少しずつ使い続けてみようと思います。
Install rbenv for westlab

# Install rbenv

```
$ sudo yum install zlib zlib-devel openssl-devel sqlite-devel gcc-c++ glibc-headers libyaml-devel readline readline-devel zlib-devel libffi-devel
```

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
```


```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile
```


```
$ rbenv install 2.2.2
$ rbenv global 2.2.2
```

If you get ` rbenv: no such command 'install' `
Please do following commad


```
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```
配列の操作(自分用メモ)


多次元配列の一番奥の数値の合計が0なら配列から削除する

```php
//配列
$arr = array(1=>array('2015-01-01'=>array('cnt'=>5,'sal'=>12000,'gas'=>0),
                      '2015-01-02'=>array('cnt'=>2,'sal'=>12000,'gas'=>2000),
                      '2015-01-03'=>array('cnt'=>12,'sal'=>12000,'gas'=>300),
                      ),
             2=>array('2015-01-01'=>array('cnt'=>0,'sal'=>0,'gas'=>0),
                      '2015-01-02'=>array('cnt'=>0,'sal'=>0,'gas'=>0),
                      '2015-01-03'=>array('cnt'=>0,'sal'=>0,'gas'=>0),
                      ),
             3=>array('2015-01-01'=>array('cnt'=>0,'sal'=>0,'gas'=>0),
                      '2015-01-02'=>array('cnt'=>2,'sal'=>15000,'gas'=>300),
                      '2015-01-03'=>array('cnt'=>0,'sal'=>0,'gas'=>0),
                      ));

//中身をチェックして新しい配列を作成
foreach($arr as $key=>$value){
    foreach ($value as $k=>$val) {
        $sum = array_sum($val);
        if($sum!==0){
            $res[$key] = $value;
        }
    }
}
```
node-amqpでRabbitMQに接続してみる

**環境・バージョン**
Windows 7
Node.js 0.12.4
RabbitMQ 3.4.1
node-amqp 0.2.4


###Subscriber

```js:sub.js
var amqp = require('amqp');

var options = {
    host: 'localhost',
    port: 5672,
};

var connection = amqp.createConnection(options);

connection.on('error', function(e) {
    throw e;
});

connection.on('close', function(e) {
    console.log('connection closed.');
});

connection.on('ready', function() {
    console.log('connected to ' + connection.serverProperties.product);

    connection.queue('my-queue', function(q) {
        q.bind('#');
        q.subscribe(function(message) {
            console.log(message.data.toString());
        });
    });
});
```

###Publisher

```js:pub.js
var amqp = require('amqp');

var options = {
    host: 'localhost',
    port: 5672,
};

var connection = amqp.createConnection(options);

connection.on('error', function(e) {
    throw e;
});

connection.on('close', function(e) {
    console.log('connection closed.');
});

connection.on('ready', function() {
    console.log('connected to ' + connection.serverProperties.product);

    sendMessage(connection, 'my-queue', 'Hello, AMQP1!!');
    sendMessage(connection, 'my-queue', 'Hello, AMQP2!!');
    sendMessage(connection, 'my-queue', 'Hello, AMQP3!!');
});

function sendMessage(connection, queue_name, payload) {
    connection.publish(queue_name, payload);
}
```

###実行結果

```
connected to RabbitMQ
Hello, AMQP1!!
Hello, AMQP2!!
Hello, AMQP3!!
```
jquery.tile.jsのちょっとした応用

特定の要素の高さを自動的に揃えてくれるjquery.tile.js。
基本は、
$(window).load(function(){
    $('.box').tile();
});

行ごとなら、２列の場合
$(window).load(function(){
    $('.box').tile(2);
});

にする。
n番目以降の要素にtileして欲しい場合は、
以下にする。（例は2番目以降の要素にtileする）
$(window).load(function(){
    $('.box:gt(0)').tile(2);
});

つーか、これってjquery.tile.js特有のやつではなく、
jqueryの基本みたいなもんだな。
rs-csv-importer-media-plusで画像ファイル名が重複する

# 問題点

[wp_post_helper](https://github.com/wokamoto/wp_post_helper)を使った、[rs-csv-importer-media-plus](https://github.com/torounit/rs-csv-importer-media-plus)はちょうべんりなんだけれども、カスタムフィールドに画像アップロードするときに、ファイル名が同じものだと上書きされてしまって、思い通りの動作にならないんです。

```
"post_type", "post_title", "custom_image"
"post", "記事1", "http://example.com/01/01.jpg"
"post", "記事2", "http://example.com/02/01.jpg"
```
みたいなCSVをインポートすると、記事1も記事2も同じ画像を参照するんですよ。

# 回避方法
とりあえずurlのmd5にすれば重複することはなかろうと。
https://github.com/zoker/wp_post_helper/commit/aead552ac15522380eaad1457a0b93cc4b449a57
C++ std・zlib関係メモ


## ■std::stringを使用するには？
　●Application.mkを使用する場合
　　APP_STL := gnustl_static

　●使用インクルード
```
　　#include <string>
```


　●const char* →std::string

```
 std::string teststring = std::string((char*)testdata);
```

## ■ハッシュを作成するには？

●xCodeのヘッダーに定義したらエラーになったので、C++11だとないのかも

●使用インクルード

```
#ifdef __ANDROID__
#include <tr1/functional>
#endif
```

```
std::tr1::hash<std::string>()(文字列);

```




## ■zlibの関数を使用するには？

　●Android.mkを使用する場合、追加したい場合は下記のように **+= -lz**
　　LOCAL_LDLIBS    += -lz


　●使用インクルード

```
#include <zlib.h>

```

　●inflateInit2、inflate、inflateEnd　とかでコンパイルが起こらなくなり、
　　使用できる。


## ■ファイル入出力


●使用インクルード

```
#include <iostream>
#include <fstream>
```

```
    // ファイル入力
    std::ifstream fin;    
    fin.open(保存パスのstd::string.c_str(), ios::in);

    // ■ファイル出力

　　//ファイルを開く
    ofstream fout;
    fout.open(保存パスのstd::string.c_str(), ios::out|ios::app);
    fout.write(保存データの.c_str(),保存データサイズ );
    fout.close();  //ファイルを閉じる

```


## ■複数のソースをmakeしたい時は、LOCAL_SRC_FILESでソースファイル名をスペース区切りで記述すればOK

```
LOCAL_ARM_MODE  := arm
LOCAL_PATH      := $(NDK_PROJECT_PATH)
LOCAL_MODULE    := libTestPlugin
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := DixHash32.cpp MiniZipTest.cpp
LOCAL_LDLIBS    := -llog
LOCAL_LDLIBS    += -lz
include $(BUILD_SHARED_LIBRARY)
```

## ■C++用ハッシュ作成
　昔からお世話になってるゲームつくろーさんのライブラリを使用
　http://marupeke296.com/TOOL_No10_Hash32.html
Hamlで余計なスペースを削除する


こういうのを書くと

```haml
%p
  %span.txtred
    ほげほげ
  ふがふが
```

![スクリーンショット 2015-06-11 11.28.00.png](https://qiita-image-store.s3.amazonaws.com/0/9186/fa15a329-73af-ed01-5556-2186c579779b.png "スクリーンショット 2015-06-11 11.28.00.png")

あああああ！スペースが入ってる！？！？

となるのですが、こうすると

```haml
%p
  %span.txtred<>
    ほげほげ
  ふがふが
```

![スクリーンショット 2015-06-11 11.30.35.png](https://qiita-image-store.s3.amazonaws.com/0/9186/626ead38-9af0-1b68-6379-acbfd5ff7dc8.png "スクリーンショット 2015-06-11 11.30.35.png")

ふぅ...危なかったぜ...
12行のバッチで行うお手軽な勤怠管理

## はじめに

タイムカードのない勤務先(客先常駐)で、自分自身で勤怠管理を行うとどうしてもルーズになりがちです。

僕は毎月月末になってひぃひぃ言いながら勤務表を作成しています。

でも、最近、歳のせいか、一週間前の勤務状況なんか覚えてません。

+ 僕の脳みそのメモリは下野由貴ちゃん(HKT48)でいっぱいです(恋の病)。

社会人にあるまじきこの現状を打破する方法を考えました。

+ しかし恋の病は相変わらずなので、よい処方箋があれば、速攻でストックさせていただきます。

## 簡単な仕様説明

+ スタートアップ時にバッチを叩く（引数：IN）⇒ログに時間を記録する
+ シャットダウン時にバッチを叩く（引数：OUT）⇒ログに時間を記録する
+ ログファイルは日付ごとに作成する
+ スタートアップ時、シャットダウン時というイベントハンドルはWindowsのグループポリシーを使う

## バッチファイルご紹介

任意のファイル名で以下のバッチを作成します（例:E:\TIMECARD\kintai.bat）

```bat
@echo off
SET YYYY=""
SET MM=""
SET DD=""
FOR /F "usebackq delims=\/ tokens=1,2,3" %%i IN (`echo %date%`) DO (
	SET YYYY=%%i
	SET MM=%%j
	SET DD=%%k
)
SET LOGNAME=%YYYY%%MM%%DD%.log
SET LOGPATH=E:\TIMECARD\log\%LOGNAME%
ECHO %TIME%【%1】 >> %LOGPATH%
```

## 起動準備

1. グループポリシーエディタの起動
  + win+rなどで[ファイル名を指定して実行]画面で"gpedit.msc"
2. スクリプト(スタートアップ/シャットダウン)を編集
  + ローカルコンピューターポリシー
    + コンピューターの構成
      + Windowsの設定
         + スクリプト(スタートアップ/シャットダウン)
3. スタートアップのプロパティ画面にてスクリプトを登録
  + スクリプト名：上掲のバッチへのパス
  + スクリプトのパラメータ：IN
4. 同様にシャットダウンのスクリプト登録
  + スクリプト名：上掲のバッチへのパス
  + スクリプトのパラメータ：OUT
  
## 出力例

### 20150610.log

```
10:14:23.39【IN】 
16:09:52.29【OUT】 
```

## その他備考

+ 遅刻したくせに早退していることについてはノーコメントでお願いします
pyenvにおけるpythonインストールエラー対処法（BUILD FAILED）


##pyenvのインストール
インストール方法は色々な方が解説されているのでそちらを参照しました。

- https://github.com/yyuu/pyenv
- [pyenvを使ってMacにPythonの環境を構築する](http://qiita.com/1000ch/items/93841f76ea52551b6a97)

##インストールエラー
###内容
pyenvをインストールし、パスを通し終え、いよいよpythonをインストールしようと喜び勇んで`$ pyenv install 3.4.3 `を実行したところ以下のエラーが発生しました。

```
$ pyenv install 3.4.3 

Downloading Python-3.4.3.tgz...

-> https://yyuu.github.io/pythons/4281ff86778db65892c05151d5de738d

Installing Python-3.4.3...

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.

https://github.com/yyuu/pyenv/wiki/Common-build-problems

BUILD FAILED (OS X 10.10.3 using python-build 20141028)

Inspect or clean up the working tree at /var/folders/yy/9bhhz0216dz7vbz5_1ffbl5m0000gn/T/python-build.20150610141204.31062

Results logged to /var/folders/yy/9bhhz0216dz7vbz5_1ffbl5m0000gn/T/python-build.20150610141204.31062.log

Last 10 log lines:

(cd /Users/[ユーザ名]/.pyenv/versions/3.4.3/share/man/man1; ln -s python3.4.1 python3.1)
if test "xupgrade" != "xno"  ; then \
case upgrade in \
upgrade) ensurepip="--upgrade" ;; \
install|*) ensurepip="" ;; \
esac; \
./python.exe -E -m ensurepip \
$ensurepip --root=/ ; \
fi
Ignoring ensurepip failure: pip 6.0.8 requires SSL/TLS
```

###対処法
xcode command line developer toolsをインストールすれば解決しました。もともと入っている人はこのエラーは発生しないのだと思います。
具体的にはターミナルで以下を実行
`$ xcode-select --install`

するとインストールの確認窓が立ち上がるので、指示に従いインストールします。
そして再びインストールを試みます。

```
$ pyenv install 3.4.3   

Downloading Python-3.4.3.tgz...

-> https://yyuu.github.io/pythons/4281ff86778db65892c05151d5de738d

Installing Python-3.4.3...

Installed Python-3.4.3 to /Users/[ユーザ名]/.pyenv/versions/3.4.3
```
エラーは起こっていません。
インストールされたpythonのリストを表示してみます。

```
$ pyenv versions
* system (set by /Users/[ユーザ名]/.pyenv/version)
  3.4.3
```

上手くインストール出来ました！
##参考

-http://o-tomox.hatenablog.com/entry/2014/09/22/174315
phpstorm8で保存時に空行のスペースを自動削除。

設定を開きます。

Editor - Generalの下の方のOtherに「Strip trailing spaces on Save」があるのでそこ。
NoneになっていたらAllかModified Linesにすれば自動で削除してくれる。

![スクリーンショット 2015-06-11 11.16.17.png](https://qiita-image-store.s3.amazonaws.com/0/9907/154d9ff6-c795-4d22-6857-23c405ca96a6.png)
IEの各バージョン事の動作を確認したい場合

IETesterがクラッシュ連発でまともに動かないので、
VMでそれぞれのIEを利用することにしました。

http://dev.modern.ie/tools/vms/

それぞれのバージョンのVMイメージをダウンロードして、
zipファイルを解凍する。

linux環境だとVMWare Playerでそのまま取り込めない？
手元の環境だと以下のエラーが発生した。
`ova did not pass OVF
specification conformance or virtual hardware compliance checks`

VMイメージを変換してやる必要があるようなので、以下のコマンドで変換
(ファイル名に空白が入っているのが嫌いなので、事前にファイル名は変換済み)
`ovftool --lax IE8.ovf IE8.vmx`

VMWare Playerで変換したIE8.vmxを取り込むことで動作する。

IEユーザーのパスワードはデフォルトだと
Password!に設定されている
CoffeeScriptやJavascriptで、console.logをminify時に消し去る＆消し忘れテストコードに気付く方法

#半分ネタです
シェルスクリプトかまして消すと良いよ、がまあかなり良好な解ですが、それだとconsole.logの前後にテストコードがあった時、そして、それをif DEBUG?とかで囲むのを忘れていた時、気付くチャンスを逃してしまいます。

たぶん世の中で良く行われているものとしては、if DEBUG?節でテストコードを囲んで、minify時に ```--define DEBUG=null``` を付けるというのがあるかと思いますが、**落とし穴があるよ**ということです。

DEBUG=nullで消えるのは、あくまで「**if DEBUG?節を付け忘れなかった場合**」です。

そこで併用をお勧めしたいのがconsole=nullをやってしまうことです。

```
uglifyjs test.js -m -c -d console=null,DEBUG=null
```

こんな感じ。DEBUGの影響下に無いテストコードが残ってしまっていたら、そこにはたいていconsoleのメソッドが使われているはずですので、これでエラーが引き起こせます。minify後に、エラーのみを指摘してくれるquietモードのあるlintを通すとかすれば、```null.log``` を指摘してくれるでしょう。実行時エラーではあるけど、スクリプトのパーズ時にもうエラーが発生するから、拾いようはいくらだってありますよね。

誰かがwindow.console使ってたら？　すみません、それはもう一工夫要りますね。

誰かがwindow['console']使ってたら？　それ、悪意あるだろ！　しばくといいですよ。
外部ディスプレイのウィンドウ配置を記憶する方法


普段、仕事で外部ディスプレイを利用しているのですが、外部ディスプレイって抜き差しした時にウィンドウの位置が記憶されないので手作業での再配置をしなければならず、とても面倒でした。

そこで解決策を調べたところ以下の2つのアプリが見つかりました:tada:

- [Stay](https://cordlessdog.com/stay/) 1800円
- [Display Maid](http://www.funk-isoft.com/display-maid.html) 720円

（値段は2015/6/11現在のものとなります）

機能はほぼ変わらないのですが、僕は値段が安く動きもキビキビしてるDisplay Maidを選びました。

使い方は簡単で、メニューバーからウィンドウを記憶・元に戻すを選ぶだけです。
自動で元に戻って欲しい人は「Auto Restore」を選べばOK！

![公式画像](http://www.funk-isoft.com/img/dm-menu.png)
（公式サイトより引用）

外部ディスプレイのウィンドウ配置に困っている方は購入してみてはいかがでしょうか？
Install pyenv for westlab


```
$ yum install -y  gcc gcc-c++ make git patch openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel

# pyenvのインストール
git clone git://github.com/yyuu/pyenv.git .pyenv
echo 'export PATH="$HOME/.pyenv/bin:$HOME/.pyenv/shims:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

# インストール出来るPythonバージョンの確認
pyenv install -l


cd ~/.pyenv/plugins
git clone git://github.com/yyuu/pyenv-virtualenv.git
```
Install nodejs in CentOS 6.6


# Install nodejs in CentOS 6.6

Install nvm

```
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.3/install.sh | bash
```

install 0.12.4

```
$ nvm install  v0.12.4
```

make default node alias

```
$ nvm alias default v0.12.4
```
vmstatで覚えておくと便利なオプション

サバ管のプロなら当然知ってることでしょうけど、もう記憶力がヤバいのでメモっときます。

vmstatコマンドでは以下のオプションを知っておくと便利です。

| オプション | 効果 |
| --- | --- |
| 1 | 1秒毎に結果を表示 |
| -w | 見出しと数字のズレを解消 |

例えば、以下の様にすると

```bash
vmstat -w 1
```

1秒毎にこんな結果が出てきます。

```
procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
 r  b       swpd       free       buff      cache   si   so    bi    bo   in   cs  us sy  id wa st
 0  0          0    2410640     111272     654816    0    0     2    21   63   80   2  1  97  0  0
 0  0          0    2410668     111272     654840    0    0     0    12  122  136   4  0  96  0  0
 0  0          0    2410668     111272     654840    0    0     0   112  351  280  12  1  87  0  0
```

仮に-wオプションを付けなかったら

```
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 2401856 111656 658684    0    0     2    21   63   80  2  1 97  0  0
```
こんな感じになってしまって、cpuのusとかsyあたりがズレで読みにくいです。
私はこのオプションをずーっと知らずに長年イライラしてきました。。。
std::functionって大きいね

　関数ポインタ書くの面倒なので、std::functionにする場合、当たり前だけどstd::functionの方が大きいので注意が必要なんすね。
　イージング関数をメンバー関数ポインタに代入しといて～、オブジェクトの移動をイージング関数で制御して～みたいな場合だと関数ポインタにした方が良い場合がありそうっすね。

```cpp

#include <iostream>
#include <functional>

int main()
{
    std::cout << sizeof(std::function<int()>) << std::endl;
    std::cout << sizeof(int(*)()) << std::endl;
}

```

MSVCだと、40、4。
clangだと、48、8。
gccだと、32、8。
という結果になったよ。MSVCだけ小さいのは64bitと32bitの違いとかかな？

#clangとgccはここで調べたよ
http://melpon.org/wandbox/

#参考にしたよ
[関数ポインタよりもstd::functionを使おう]
(http://torini.hateblo.jp/entry/2015/03/22/%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%82%88%E3%82%8A%E3%82%82std%3A%3Afunction%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86)
PSコマンドで、Nginx/UnicornのWorkerプロセスを見る

PSコマンドの、`-ef --forest`オプションを付与する

## nginx

```
ec2-user 32110 32086  0 09:59 pts/0    00:00:00              \_ grep nginx
root      3011     1  0 Apr28 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     3012  3011  0 Apr28 ?        00:00:25  \_ nginx: worker process
```

## unicorn

```
[ec2-user@ip-10-0-0-69 ~]$ ps -ef --forest | grep unicorn
ec2-user 32119 32086  0 09:59 pts/0    00:00:00              \_ grep unicorn
root      1980     1  0 Jun05 ?        00:00:10 unicorn_rails master -p 3000 -E production -c config/unicorn.rb -o localhost                                              
root      2013  1980  0 Jun05 ?        00:00:04  \_ unicorn_rails worker[0] -p 3000 -E production -c config/unicorn.rb -o localhost                                           
root      2016  1980  0 Jun05 ?        00:00:04  \_ unicorn_rails worker[1] -p 3000 -E production -c config/unicorn.rb -o localhost                                           
root      2018  1980  0 Jun05 ?        00:00:06  \_ unicorn_rails worker[2] -p 3000 -E production -c config/unicorn.rb -o localhost                                           
```

# 参考

[Inside NGINX: How We Designed for Performance & Scale](http://nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)