OmniAICreator/Qiita-1.07M huggingface dataset:
BEMを参考にしたCSS設計

現時点でBEMによるCSS設計はベターだと思う。でもベストではない。
なにがベストに思わせないのかと言えば冗長的な命名方法。これだけ。
アンスコやらスラッシュが2連続くところが嫌すぎて困る。

というわけで。

BEMの命名方法をカスタマイズしてみる。

# BEMの基本設計
## BEMとは

- Block ⇒ 塊
- Element ⇒ 要素
- Modifier(keyとvalueで表す) ⇒ 状態（変化）

の事を言う。
BEM（ベム）と呼ぶようだが、某妖怪人間ではない。
[参考：知っておきたいHTMLテンプレート設計法 - OOCSSの基本 | CodeGrid](https://app.codegrid.net/entry/oocss-1)


## BEMのお約束
- BlockとElementの区切りはアンスコ2個（__）
- BlockまたはElementとModifierの区切りはハイフン2個（--）
- ModifierのKeyとValueの区切りはアンスコ1個(_)
- BlockやElementを2つ以上の単語で表す時はハイフン1個(-)

```css:css
.item {…}

 .item-nav {…}
  .item-nav__item {…}
  	.item-nav__item--state_active {…}

 .item__body {…}
  .item__body--state_active {…}
```

```html:html
<section class="item">
  <nav class="item-nav">
    <a class="item-nav__item item-nav__item--state_active" href="#">タブA</a>
    <a class="item-nav__item" href="#">タブB</a>
    <a class="item-nav__item" href="#">タブC</a>
  </nav>
  <div class="item__body item-box__body--state_active">
    …
  </div>
  <div class="item__body">
    …
  </div>
</section>
```

…アンスコやハイフンが2個続くのが嫌だ。分かりやすいけどクラス名も長い。
下記のように変更してみる。

#BEMの命名規則をカスタマイズしてみる

- BlockとElementの区切りはアンスコ1個(_)
- ModifierのKeyとValueの区切りはローワーキャメルケースで表わす。
- BlockとModifierまたはElementとModifierの区切りはハイフン1個(-)
- BlockやElementを2つ以上の単語で表す時はローワーキャメルケースにする(複合語の先頭を小文字で書き始める)

```css:css
.item {…}

 .itemNav {…}
  .itemNav_item {…}
  	.itemNav_item-stateActive {…}

 .item_body {…}
  .item_body-stateActive {…}

```

```html:html
<section class="item">
  <nav class="itemNav">
    <a class="itemNav_item itemNav_item-stateActive" href="#">タブA</a>
    <a class="itemNav_item" href="#">タブB</a>
    <a class="itemNav_item" href="#">タブC</a>
  </nav>
  <div class="item_body item_body-stateActive">
    …
  </div>
  <div class="item_body">
    …
  </div>
</section>
```

…あれ？
カスタマイズした結果、3年くらい前と書き方がものすごく似ている。
違うとすれば```<a>```にいちいちクラス付与しているところくらい。アンスコの意味合いも非常に似ている。

今はつなぎにハイフン使ってるけど、それはgoogleさんが推奨する書き方の一つだったからであって、さほどの意味は無い（というかハイフンって単語つなぎに使うから、違うように思っていたり)。

結局、自身が実務経験上編み出したCSS設計も「堅固で流用可能で短く書けるCSS設計」を目指していたわけで、突き詰めていくと似通ってくるのも当たり前と言えば当たり前。

とえいあえずはメモ書きなので、実装してみて内容を編集していこうと思う。

…と言っていた矢先。
[実践 めんどうくさくない BEM - ダーシマ・ヱンヂニヤリング](http://tsmd.hateblo.jp/entry/2013/12/12/004059)
ものぐさな私にぴったりなカスタマイズがあった。

わかる人には「ここはclass付与しても、ここは省略していいよ」で済むのだが、その一言では伝わらない人々を想定して書くのも勉強なので、時間見てまとめる予定。

# 更新履歴
## 2014.09.26追記
『Modifier』はマルチクラスで表わそうと考えていたが、こちらを変更する事にした。
理由としては、CSS内に記述された場合は```.itemNav_item.stateActive {…}```みたいな書き方になるので、```.itemNav_item```と一緒に記述された時のみ有効になるのでわかりやすい。

しかし、HTML側から見た場合はどうなるか？

```.stateActive``` というCLASS名はあちこちに出てくる可能性が高い。よく使う名前だと思う。だが『Active』と一口に言っても色々な『Active』が存在する訳で、それを一緒くたに```.stateActive``` で表わすのは乱暴すぎると思う。

冗長的にはなるが、HTMLから見た時は```.itemNav_item-stateActive``` というCLASS名の方が、どの要素に使えるか判断しやすい。

HTMLやCSSがデザイナーやコーダー内で完結できていればマルチクラスのままで良いと思う。
が、HTMLコーディングが完了した後、プログラマーの作業が発生するサイトの場合、プログラマーに対しての配慮が必要になる。
また、運用フェーズに入った時に、この書き方の方が膨大なCSSから検索がしやすく、対応時間を短縮する事も可能だ。

BEMの利点は、制作後の運用フェーズを考えた設計部分だと考えている。
命名方法については、ソースコードが長くなるので、冗長的な物はよくないと考える人も多いかもしれない。
だが、運用フェーズに入り、担当が変わった時の事を考えると、ある程度の察しがつく名称の方が引き継ぎがスムーズに行くと思う。
ISO8601表記でJST現在時刻を取得

```py3
# ISO 8601基本表記  例) "20140526T123456+0900"
jstnow().strftime('%Y%m%dT%H%M%d%z')
# ISO 8601拡張表記  例) "2014-05-26T12:34:56+0900"
jstnow().strftime('%Y-%m-%dT%H:%M:%d%z')
# ISO 8601拡張表記  例) "2014-05-26T12:34:56.123000+0900"
jstnow().isoformat()
```

```py3
from datetime import *

def jstnow():
  # JST timezone(+0900)
  class JST(tzinfo):
    def utcoffset(self, dt):
      return timedelta(hours=9)
    def dst(self, dt):
      return timedelta(0)
  return datetime.now(JST())
```

UTCから明示的に差分計算する実装

```py3
from datetime import *

def jstnow():
  # UTC tzinfo
  class UTC(tzinfo):
    def utcoffset(self, dt):
      return timedelta(hours=0)
    def dst(self, dt):
      return timedelta(0)
  # JST timezone(+0900)
  class JST(tzinfo):
    def utcoffset(self, dt):
      return timedelta(hours=9)
    def dst(self, dt):
      return timedelta(0)
  return datetime.utcnow().replace(tzinfo=UTC()).astimezone(JST())
```
jsFiddleでAngularJSを使う

jsFiddleでAngularJSを使おうと思って以下のような簡単なコードを実行してみるとUncaught objectというエラーがでてくる。

```html
<div ng-app="myApp">
    <div ng-controller="testCtrl">
        {{hoge}}
    </div>
</div>
```

```js
var app = angular.module('myApp', []);
app.controller('testCtrl', function ($scope){
    $scope.hoge = 'hello';
});
```

[jsFiddleでの実行例](http://jsfiddle.net/HS5Rb/)

この問題の解決方法はAngularJS jsFiddleとかでぐぐればすぐに出てくる。
[Using jsFiddle with AngularJS](http://pkozlowskios.wordpress.com/2012/08/12/using-jsfiddle-with-angularjs/)

#解決法
左のFrameworks & Extensionsの`onLoad`となっているセレクトボックスを`No wrap -in<body>`に変更してやればよい。
[jsFiddleでの修正例](http://jsfiddle.net/HS5Rb/1/)

#なぜ起こるのか
左のセレクトボックスを`onLoad`の状態で実行するとjsFiddleは以下の用なソースを出力する。(関係のない部分は省略, 見やすいようにインデントなどを変更)

```html
<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
		<title> - jsFiddle demo</title>

		<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js"></script>
		<script type="text/javascript">//<![CDATA[ 
			window.onload=function(){
				var app = angular.module('myApp', []);
				app.controller('testCtrl', function ($scope){
					$scope.hoge = 'hello';
				});
			}//]]>  
		</script>
	</head>
	<body>
		<div ng-app="myApp">
			<div ng-controller="testCtrl">
				{{hoge}}
			</div>
		</div>
	</body>
</html>
```

このソースを見るとjsが`window.onload`のタイミングで実行されるように設定されている。
AngularJSは`ng-app`を見つけると`DOMContentLoaded`のタイミングで初期化を行う。
その時にはまだ`myapp`モジュールが定義されていないのでモジュールが見つからないというエラーを出す。
参考:[AngularJSの起動 | AngularJS 1.2 日本語リファレンス | js STUDIO](http://js.studio-kingdom.com/angularjs/guide/bootstrap)

#なぜNo wrap -in\<body\>にすると解決できるのか
jsFiddleの左のセレクトボックスを`No wrap -in<body>`に設定すると`body`タグの最後に、`No wrap -in<head>`に設定すると`head`タグの最後に直接jsが埋め込まれる。
この時のjsは`window.onload`などでラップされないため`DOMContentLoaded`のタイミングで既にモジュールが定義されている。
よってこの修正を行うとAngularJSがエラーを出さないようになる。

#他の解決法
`ng-app`があることによってAngularJSが自動起動しようとする。
この自動起動によって問題が起こるため、`ng-app`を取り除き、AngularJS手動起動することでもこの問題を回避することができる。

```html
<div>
    <div ng-controller="testCtrl">
        {{hoge}}
    </div>
</div>
```

```js
var app = angular.module('myApp', []);
app.controller('testCtrl', function ($scope){
    $scope.hoge = 'hello';
});
angular.bootstrap(document, ['myApp']);
```

[jsFiddle 手動起動のサンプル](http://jsfiddle.net/HS5Rb/4/)
curlで[]とか{}を含むURLから取得する


curlを使って、[]とか{}を含むURLへアクセスすると

```
curl: (3) [globbing] error: bad range specification after pos nnn
```
って感じのエラーがでる。

これを解決するには、--globoff を指定して上げればおｋ

````
curl --globoff "http://exsample.com/hoge?foo=var[xx]"
````
Eclipse  JSPファイル内でincludeしている別JSPをコマンドで開く

EclipseでJSPを扱う場合、ファイル内でincludeしている別JSPファイルをコマンドで開く事ができます。

1. <%@include file="_test.jsp" %> のJSPファイル名部分をクリックしてフォーカスを合わせる
2. Ctrl + Alt + r

以上です。
ここでは同階層の_test.jspを指定していますが、

```lang:sample.jsp
<%@include file="/WEB-INF/view/common/test/_test123.jsp"%>
```

など別階層のJSPも問題なく開く事ができます。
なお、Macでは Ctrl + Option + r となります。
ga.jsからanalytics.jsへの移行のまとめ

Q.
GoogleAnalyticsで、ga.jsからanalytics.js(Universal Analytics)に乗り換えたいよぅ

A.
コレ読め
(公式ドキュメント以上にわかりやすすぎて辛い)

http://misterphilip.com/universal-analytics/migration/

以上。
今さら聞けないWebAPIの実装方式RESTとSOAPの違い

5/27 コメントでご指摘頂いた点を修正しました。

# RESTとSOAPの違い

## REST API
* RESTはREpresentational State Transferの略。
* RESTの世界では、ネットワーク上のコンテンツ(リソース)を一意なURLで表すのが基本。
* 各リソース（URL）に対してGET,POST,PUT,DELETEでリクエストを送信しレスポンスをXMLやjsonなどで受け取る形式（レスポンスのフォーマット形式は指定されていない）。
* RESTはURLがリソースに対応づけられるためURLは名詞的になることが多い。

## SOAP API
* SOAPはSimpleObject Access Protocolの略。
* リクエストおよびレスポンスともにXMLフォーマットのデータで行う形式。
* SOAPのURLは操作と対応づけられるため、URLの命名が動詞的になることが多い。

参考： http://programming-10000.hatenadiary.jp/entry/20130331/1364714875

## RESTとSOAPの使い分け

> * RESTでは不特定多数を対象にした、入力パラメータが少ない情報配信や検索サービス等での利用に向いている。
> * SOAPでは複雑な入力を必要としたり、入出力に対してチェックを必要とするようなサービス等での利用に向いている。

引用元： http://xmlconsortium.org/wg/web2.0/teigensho/4--REST-SOAP.html

# RESTとRESTfulの違い

ところで、RESTfulという言葉も聞くがこれは何を指すのか…

> * RESTの原則に従って実装されているシステムのことを、RESTfulと呼ぶようです。
> * 今現在、多数のWebAPIが国内で公開されていますが、そのほとんどがREST形式であると自称している（もしくはREST形式と一般に認知されています）。ですがそのほとんどは、HTTPプロトコルに対してXML形式の結果を返しているだけで、完全なRESTとはいえない「なんちゃってREST」であるような気がします。
> * 当時からこういった説明をするサービスが多かったこともあり、RESTといえば「HTTPリクエストに対してXMLレスポンスを返すもの」という認識が一般に広まり、普通に使用されるようになってしまった感があります。
そういった経緯のせいかどうかはわかりませんが、RESTに忠実な実装を行ったシステムのことをRESTfulと呼ぶようになり、なんとなく棲み分けができて、めでたしめだたし？となっているようです。

引用元： http://convivial-web.com/blog/2009/03/restrestful.html
Linux: カーネルモジュールのビルド時にコンパイルオプションを追加したい

だいたいこんな感じでできる
`$ KCFLAGS=<Cコンパイラ用追加オプション> KCPPFLAGS=<プリプロセッサ用追加オプション> KAFLAGS=<アセンブラ用追加オプション> <ビルドコマンド(makeとか)>`

以下経緯。

[エレコムのUSB3.0カードリーダ MR3-C004](http://www2.elecom.co.jp/data-media/memory-rw/mr3-c004/)がxubuntu 13で認識されなかったのでドライバをビルドしてインストールしてみた。

VirtualBox上では "Realtek USB3.0 Card Reader" と表示されるので以下からLinux用のドライバをダウンロード。2つあるけどどっちかわからんし(もっと言うとどっちも違うかもしれんが)調べるのもめんどいので両方入れてみる。

http://www.realtek.com.tw/Downloads/downloadsView.aspx?Langid=1&PNid=15&PFid=25&Level=4&Conn=3&DownTypeID=3&GetDown=false

README.txtの言うとおりmakeしたら怒られた。

```
  CC [M]  rts5229/rtsx.c:914:22: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rtsx_probe’
rts5229/rtsx.c:1069:23: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rtsx_remove’
rts5229/rtsx.c:1094:11: エラー: ‘rtsx_probe’ がここでは宣言されていません (関数内ではない)
rts5229/rtsx.c:1095:2: エラー: 関数 ‘__devexit_p’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
rts5229/rtsx.c:1095:24: エラー: ‘rtsx_remove’ がここでは宣言されていません (関数内ではない)
/
```

rtsx.cの914行目を見ると __devinit が解釈できなくて困っているらしい。[Linuxカーネル3.8でVMWare Playerを使う](http://cosmo0920.wordpress.com/2013/03/01/linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB3-8%E3%81%A7vmware-player%E3%82%92%E4%BD%BF%E3%81%86/) によるとこのマクロと __devexit, __devexit_p は3.8で削除されたらしい。

Makefileを読むと /lib/modules/$(shell uname -r)/build/Makefile に処理を引き渡しているので、コマンドラインでオプションを追加できる余地がないか "FLAG" で検索してみると KCFLAGS という変数に追加したいものをセットしておけばよいらしい。

以下を実行して再起動したら無事ドライバのインストールが完了しカードリーダが認識された。

```
$ make KCFLAGS="-D__devinit= -D__devexit= -D__devexit_p="
$ sudo make install
$ sudo depmod
```

そのほかいろいろな設定のための環境変数は[KBuildのドキュメント](https://www.kernel.org/doc/Documentation/kbuild/kbuild.txt)に書いてある。
Hive de CSV(TSV) - UDF作るよ

ということで前回、可変なCSVを処理するにあたって、ARRAY処理がどうにもならなかったのでいよいよUDFに手を出してみた。

現在のHiveではARRAYを処理するにあたって配列の添字を動的な別カラムの値だったり、動的な値を使ってアクセス出来ないようなので、独自にUDFを作る必要があるとのこと。

[https://issues.apache.org/jira/browse/HIVE-1955](https://issues.apache.org/jira/browse/HIVE-1955)

## 実装

こんな感じの実装でJarを作る。

```java:ArrayStringToStringUDF.java
import java.util.List;
import org.apache.hadoop.hive.ql.exec.UDF;

public class ArrayStringToStringUDF extends UDF{
    public String evaluate(List<String> values, int num){
        if(values == null || values.size() < num + 1){
            return null;
        }
        return values.get(num);
    }	
}
```

仕組みは全然難しいものでは無かった。むしろ簡単。

## 登録

add jar(もしくはhive-site.xmlで読み込み)した上で、下記のようにしてUDFを登録

```sql
create temporary function arraystring as 'net.jp.unk.hive.udf.ArrayStringToStringUDF';
```

## 実践

前回どうにもならなかった下記のデータセットで試してみる

```text:test.csv
1,HOGE,HUGA,HIGE
2,HIGE,HOHO,HIHI
2,HIHI,HOHO,HIGE
0,HUHU,HUHU,HOGE
```

テーブル作成

```sql
create table csv_test(
    items ARRAY<string>
)
ROW FORMAT DELIMITED
    COLLECTION ITEMS TERMINATED BY ',';
```

データ読み込み

```sql
LOAD DATA LOCAL INPATH 'test.csv' INTO TABLE csv_test;
```

HQLを書いてみる

```sql
select arraystring(items,cast(items[0] as int) + 1) from csv_test;
```

結果

```
HUGA
HIHI
HIGE
HUHU
```

ということでとりあえず出来た(・∀・)
UDF作るまでやったけど全然上級では無かったの巻。
[R] オブジェクトによる処理速度の違い

世間的には常識なんだろうと思いますが、へぇ～と思ったのでメモ。
私はプログラミングをきちんとした形で学んだことがないので、こういう基礎的なところからして知識や配慮が欠如しています・・・。

```r:R
x.null <- NULL   # 未定義、無値のオブジェクト（以下の代入によりベクトルになる）
system.time(for(i in 1:100000){x.null[i] <- i/100000})

x.1 <- numeric(1)   # 要素数 1 のベクトル（？）
system.time(for(i in 1:100000){x.1[i] <- i/100000})

x.vector <- numeric(100000)   # サイズを定義したベクトル
system.time(for(i in 1:100000){x.vector[i] <- i/100000})

x.matrix <- matrix(rep(0,100000),100000,1) # マトリクス
system.time(for(i in 1:100000){x.matrix[i,1] <- i/100000})

x.list <- list(numeric(100000))   # リスト
system.time(for(i in 1:100000){x.list[[1]][i] <- i/100000})

x.df <- data.frame(numeric(100000))   # データフレーム
system.time(for(i in 1:100000){x.df[i,1] <- i/100000})

library(data.table)   # データテーブル利用のためパッケージ読み込み

x.dt <- data.table(numeric(100000))   # データテーブル
system.time(for(i in 1:100000){x.dt[i,1] <- i/100000})
```

実行結果は以下の通り。(実行機はどこにでもあるような今時の安物 Windows PC）

```
# 未定義、無値のオブジェクト 
> system.time(for(i in 1:100000){x.null[i] <- i/100000})
   ユーザ   システム       経過  
      8.89       0.00       8.92 

# 要素数 1 のベクトル
> system.time(for(i in 1:100000){x.1[i] <- i/100000})
   ユーザ   システム       経過  
      8.91       0.00       9.00 

# サイズを定義したベクトル
> system.time(for(i in 1:100000){x.vector[i] <- i/100000})
   ユーザ   システム       経過  
      0.15       0.00       0.16 

# マトリクス
> system.time(for(i in 1:100000){x.matrix[i,1] <- i/100000})
   ユーザ   システム       経過  
      0.19       0.00       0.19 

# リスト
> system.time(for(i in 1:100000){x.list[[1]][i] <- i/100000})
   ユーザ   システム       経過  
      0.25       0.00       0.25 

# データフレーム
> system.time(for(i in 1:100000){x.df[i,1] <- i/100000})
   ユーザ   システム       経過  
     72.72       0.00      73.01 

# データテーブル
> system.time(for(i in 1:100000){x.dt[i,1] <- i/100000})
   ユーザ   システム       経過  
     47.02       0.00      47.20 
```

データフレーム・・・。笑。

ところでデータテーブルへの代入はこの書き方で行けましたが、要素の取り出しはリストみたいな書き方でないといけないみたいですね。

```
> x.dt[1,1]
[1] 1

> x.dt[[1]][1]
[1] 1e-05
```

まだよくわかってませんが。

とりあえずベクトル化できるものはできるだけ一旦ベクトルにして処理しようと思いました。

```r:R
x.df <- data.frame(numeric(100000))
system.time({
   x.df.v1 <- as.numeric(x.df[,1])
   for(i in 1:100000){x.df.v1[i] <- i/100000}
   x.df[,1] <- x.df.v1
   rm(x.df.v1)
})
```

```
   ユーザ   システム       経過  
      0.16       0.00       0.16 
```
アホみたいにでかいgit repositoryを上手く扱う方法

gitが大きくなると時間かかってしゃーないと思っていたら、ちょうどatlassianのブログにこんな記事があった。
[How to handle big repositories with git - Atlassian Blogs](http://blogs.atlassian.com/2014/05/handle-big-repositories-git)
[巨大なリポジトリ を Git で上手く扱う方法](http://japan.blogs.atlassian.com/2014/05/handle-big-repositories-git/)

直訳ではなく、読んだことを参考に自分用にメモを記す。これは本当にメモ代わりなので原文を参照した方がいいと思う。

gitが重くなる原因は、「長い歴史」と「デカいファイル」の2つがある。その2つの対処法。

# 長い歴史に対処する
## shallow cloneを使う
gitのhistoryが積み重なると、git cloneに時間がかかる。そのときはshallow cloneを使って、深さを限定してcloneする。

`git clone --depth depth remote-url`

手元の環境だと23sくらいかかっていたのでも6sくらいに短縮されたから、大きいのだともっと短縮されそう。

## filter-branchを使う。
誰かアホなやつが（主に俺が）`git add .`とかで不要なバイナリファイルとかを一度入れてしまうと、gitの歴史はずっとそのファイルを持ち続けるので、重くなる。そういう時はfilter-branchを使って、歴史の書き換えをする。

`git filter-branch --tree-filter 'rm -rf /path/to/spurious/asset/folder' HEAD`

[Git - 歴史の書き換え](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)

これによって、指定したコマンドをすべてのcommitに対して実行する。俺も何回か使っとことあるけど、gitの歴史の書き換えはすげえ注意が必要。

## single-branchを使う
shallow cloneの代わりに、single-branchオプションを使うこともできる。これで、ひとつのbranchのみcloneすれば、重いbranchを無視してcloneできる。

`git clone URL --branch branch_name --single-branch [folder]`

# デカいファイルに対処する
gitってそもそもbinaryファイルを上げることを嫌っていると思っていた（デフォルトではignoreされた気がする）。でも違って、特にバイナリを扱うことに劣っているわけではないらしい（優れてもいない）。

デカいファイルには、状況に応じた対処が必要

* バイナリファイルの変更が大きい時は、差分圧縮は使いものにならない。不必要な差分圧縮を避けるためにも、これらのファイルをdelta offにしておく必要がある。
* 上記の状況だとzlib圧縮は上手く機能しないだろうから、`core.compression 0`もしくは`core.loosecompression 0`に設定をして、圧縮をしないようにしておく必要がある。バイナリファイル以外には悪い影響が出るので、バイナリを別のrepositoryに分けるのをおすすめする。
* git gcによって不必要なオブジェクトを削除したり、ゆるいオブジェクトを一つのパックファイルに整理したりする。これも有効
* `core.bigFileThreshold`をチューニングすることも有効。512MiBより大きいファイルは差分圧縮されるべきではない。（.gitattributes）を設定することを除いて。

## sparse checkout
sparse checkoutというものを使えば、明示的に特定のfileやdirectoryのみをgit上で扱えるようになる。

まずは普通にgit cloneする。
`git clone`

configを設定。
`git config core.sparsecheckout true`

扱いたいdirectoryを`.git/info/sparse-checkout`に記述
`echo src/ > .git/info/sparse-checkout`

反映させる
`git read-tree -m -u HEAD`

これを使うと、指定したdirectoryやfileのみを操作できるようになる。（他のファイルは見えなくなる。）

## submodule
大きいbinaryなどは別のrepositoryにいれて、そのrepositoryをsubmoduleとする。
[Git submodule の基礎 - Qiita](http://qiita.com/sotarok/items/0d525e568a6088f6f6bb)

submoduleを使えば、binaryの入っているrepositoryは参照するだけで、一緒に更新したりしないので、重いものを有効に除外できる。

## git annexもしくはgit-bigfiles
git-annexを使う。これを使えば、ファイルの中身を取り込まずに管理できる。
[git-annex](https://git-annex.branchable.com/)

また、git-bigfilesは、大きいファイルを扱うことを目的としたgitのforkである。
[git-bigfiles – Caca Labs](http://caca.zoy.org/wiki/git-bigfiles)
Hive de CSV(TSV)

行毎にカラムの意味の異なるCSVを処理する必要があったのでメモ
そんな特殊なCSVにめぐり合う機会も少ないだろうけど...

## 導入

問題は行毎にカラムの意味が異なる事に加え、カラムの数が異なるということだった。
最初は下記のように単純にカラムの最大数に合わせテーブル定義を作成していた。

```sql
CREATE TABLE csv_test(
   item01 STRING,
   item02 STRING,
   item03 STRING,
   item04 STRING
) 
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ',';
```

みたいな感じで。
データも数値か文字かもわからないのでとりあえず全部STRINGで定義。

うーん、CSVのカラム数が変わる度にテーブル定義変えたりするのはあまり賢く無いし、だからといってitem100まで事前に作っとけばいいかというとそういう問題でもないし、そもそもカラムの名前がイカしてない。

という事で、しばし考えた後、ARRAYにすれば良い事に気付く。

```sql
create table csv_test(
    items ARRAY<string>
)
ROW FORMAT DELIMITED
    COLLECTION ITEMS TERMINATED BY ',';
```

これであれば、

```sql
SELECT items[0] FROM csv_test; 
```

とやって任意のカラムにアクセス可能である。
行毎にカラム数が違う場合にも、

```sql
SELECT items[10] FROM csv_test WHERE size(items) >= 10;
```

みたいな書き方も出来る。

## 発展形

下記のようなデータで、先頭のカラムに入っている値を元に後方のカラムの値を取る方法を考えてみる。

```text:test.csv
1,HOGE,HUGA,HIGE
2,HIGE,HOHO,HIHI
2,HIHI,HOHO,HIGE
0,HUHU,HUHU,HOGE
```

indexは0スタートとすることとした場合、例えば、一行目は`HUGA`、二行目は`HIHI`を取りたいといった具合だ。
いやいや、難しくないでしょ、、、
ということで、下記のように書いてみた。

```sql
SELECT items[cast(items[0] as int)] FROM csv_test;
```

エラった。
配列の添字に動的な値を取ることは出来ないとのこと。

本件、下記にも上がっていた。

[https://issues.apache.org/jira/browse/HIVE-1955](https://issues.apache.org/jira/browse/HIVE-1955)

issueとしては上がっているものの2012年から更新無いね。見放されてるかな？
しかし、ネイティブではサポートされていないけど、UDF作ればできるけどねって言ってるね(・∀・)

さてさて、いよいよUDFか。次回に続く。
IE8でwindow.postMessage()して返ってくるEventはMessageEventではない

例えばiframeに対してpostMessage()でなにか通信をしたい時、

```js:parent
var iframe = $('iframe');
iframe.contentWindow.postMessage('moge', '*');
```

この時、iframe側で受け取ったEventは[MessageEvent](https://developer.mozilla.org/ja/docs/DOM/window.postMessage)という型になっているんだけど、
IE8ではただのEvent型になっているので注意が必要。

そもそもMessageEventというオブジェクト自体が定義されていないので```evt instanceof MessageEvent```みたいなことはできない。

```js:iframe
window.addEventListener('message', function(evt) {
   console.log(evt instanceof MessageEvent)); // IE8で死ぬ。死は避けられない。人はいつか死ぬ。
});
```
display:none と visibility:hidden の違い

visibility:hiddenは名前の通り、要素はあるけど見えない状態。
display:noneは、要素も取得されず、完全にその場にない扱い。

# 検証準備

## html

```html
<!doctype html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>difference between visibility hidden and display none</title>
	<link rel="stylesheet" href="css/style.css">
</head>
<body>
	<div id="one" class="box"></div>
	<div id="two" class="box">
		<h3>Visibility:hidden</h3>
		エレメント描画されず。けど、表示エリアは「残る」。背景色で塗りつぶした感じ。
	</div>
	<div id="three" class="box">
		<h3>display:none</h3>
		エレメントが表示エリアから消える。DOMとして存在はするけど描画されない。
	</div>
		<div id="four" class="box"></div>
</body>
</html>
```



## css

float:leftかけておく。

2番目のボックスにvisibility:hiddenをかけて、
3番目のボックスにdisplay:noneをかけようと思います。

```css

@charset "UTF-8";

.box{
  width:150px;
  height:150px;
  margin:10px;
  border-radius: 10px;        /* CSS3草案 */
  -webkit-border-radius: 10px;    /* Safari,Google Chrome用 */
  -moz-border-radius: 10px;   /* Firefox用 */
  float:left;
  padding:20px;
}

#one{

  background:#000;
}

#two{
  /*visibility:hidden;*/
  background:#9eccb3;
}

#three{
  background:#f47d44;
  /*display:none;*/
}

#four{
  background:#000;
  clear:right;
}


```

## ブラウザ

![2.png](https://qiita-image-store.s3.amazonaws.com/0/44278/c99feb2b-fe1a-f9ef-6c6b-5d22ac773585.png)



# 検証結果

## visibility:hidden

＜二番目の緑のボックス＞
二番目のボックスがあった場所だけぽっかりそのまま空白に。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/44278/9a90562e-5f8d-93b4-cf58-b1a6bc98d9ac.png)



## display:none

＜三番目のオレンジのボックス＞
要素自体がなくなったので、次の4番目のボックスがつまる。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/44278/e4c91323-4993-76b7-28e4-4fbd13105433.png)



visibility:hiddenは名前の通り、要素はあるけど見えない状態。
display:noneは、要素も取得されず、完全にその場にない扱い。

もしdisplay:noneで要素の横幅等を測りたかったら、
absoluteにっして-9999pxしてとばして測る。
自分が生まれてから何秒経ったかをJavaScriptで計算する方法

...なんてものが必要になる日がくるのか分かりませんが、現在時刻のDateオブジェクトから、自分の生年月日のDateオブジェクトを引き算すると簡単に求められます。

```js:birth.js
var now = new Date(),
    birthDay = new Date(1991, 8 , 18); //僕の誕生日です

var past = (now - birthDay)/1000;
console.log(past);
```

ここで注意が必要なのは、```new Date(year, month, date)```するときの```month```は **zero origin** だということです。そのため、僕の場合1991年9月18日生まれですが、```month```には8を渡しています。

現在時刻```now```と誕生日```birthDay```が作れたら、```now```から```birthDay```を引くと、誕生日から現在時刻までの経過時間がミリ秒で返ってきます。今回知りたいのは秒数なので、1000で割っています。

イマイチ実用感が無いですが、Dateオブジェクトの引き算は使いどころを選べばとても便利です。たとえば、Web Audio APIなんかと組み合わせて、トラックの再生時間を動的にコントロールしたりとかできますね。こういう組み込みオブジェクトを上手く使えるとかっこいいなー、と思います。
LibreOffice ImpressにCalcの表をキレイに貼り付ける


ImpressにCalcから表をコピーするとImpressのほうの表の書式が適用されてデザインなどのコントロールが難しい。

そういうときはCalcで貼り付けたい領域をコピーして、Impress側で[編集]=>[形式を選択して貼り付け]=>calcを選択すると見たままコピーされる。

エクセルからパワーポイントからやOpenOfficeの場合も多分同じ。
いつかあなたが絶対に引っかかる、ある一つのJavaScriptの罠

JavaScriptは、シンプルな仕様が美しい言語です。
しかしながら、シンプルが故に、一度罠にハマると見つけにくくて抜け出すのが大変です。

罠にハマった時に、すぐに抜け出せるように、簡単な例で抑えておきましょう。

# ある一つのJavaScriptの罠が入ったコード
罠が入ったサンプルコードがこちら。

```js:sample
for (var i = 0; i < 3; i++) {
	setTimeout(function() {
		console.log(i);
	}, 0);
}
```

コンソールに i という変数を出力しています。

# 出力はどのようになりますか？
これ、実行したらどのような出力になると思います？
0、1、2と答えたあなた。わたしはそんな素直なあなたが大好きです。
2、2、2と答えたあなた。素晴らしい。JavaScriptを極めてますね！ただ、不正解。ケアレスミス。

# 出力の答え
こたえは3、3、3。不思議ですね。
さて、なぜこうなるかを解説しましょう。

# 罠の解説
## 罠の本質。クロージャとsetTimeout
JavaScriptにはクロージャという仕組みがあります。簡単に言うと、変数が生きつづける仕組みです。
これとsetTimeout という処理を後から実行する仕組みのコンビネーションでこれが発生します。

## 処理の解説
for 分の中で変数 i は0、1、2と増えて行きます。
しかしながらconsole.logへの出力はsetTimeout の中で行われるため、for文のループが回っている最中は実行されません。なのでconsole.log(i)の i は、ループ中はまだ値として解釈されません。
iが3になってループが終わり、setTimeout が実行される順番が来るとそこで始めて i の中身が出力されるので、出力は3,3,3となるのです。

# 予言しよう！あなたはいつか、この罠を踏む。
クロージャもsetTimeoutも、JavaScriptには欠かせない重要な機能です。
しかしながら、よくよく理解していても、この罠をちょくちょくふむことがあります。
「あれー。なんかループの中のデータがおかしい！」とか、「ん？変数の値が上書きされてる！」とかいう事態が起きたら、この投稿を思い出してください。
サンプルコードは、ループとsetTimeout で例にあげましたが、この罠はその他の組み合わせ、クリックと通信処理など、他の組み合わせでも発生します。
HiveでJSONデータを処理するあれこれ(中級編)

前回初級編と書いてしまったけど、上級な知識も無いのでこの中級編で終わり(・∀・)

今回はこんなJSONを集計したいのだ！


```json
{
    "a": "abc", 
    "b": 123, 
    "c": {
        "aa": "xyz", 
        "bb": 987
    }, 
    "d": [1,2,3], 
    "e": [
        {
            "aaa": "ABC", 
            "bbb": 12345
        }, 
        {
            "aaa": "XYZ", 
            "bbb": 98765
        }
    ]
}
```

JSON中の`a`,`b`に関しては初級編で行った通り、json_tupleもしくはget_json_objectを使えば簡単に集計出来る。
`c`に関しても上記の応用でなんとかなる。`d`と`e`に関してはそれら応用ではなんともしがたいのだが、JSON SerDeを使えばあっというま。

## 多階層JSONにおけるjson_tupleの利用
`c`に含まれる要素の取得集計については下記の例のとおりjson_tupleを段階的に使う必要がある。

```sql
SELECT json_c.* FROM raw_json 
    LATERAL VIEW json_tuple(
        raw_json.line,
        'c'
    ) json as c
    LATERAL VIEW json_tuple(
        json.c,
        'aa',
        'bb'
    ) json_c as aa, bb;
```
`json.c`で取得出来るのは、`{"aa":"xyz","bb":987}`という文字列なので、これを更にLATERAL VIEW json_tupleしてあげればとれるってわけ。LATERAL VIEWで新たに`json_c`というFieldを別名で定義しているので、`aa`を参照するには、`json.c.aa`ではなくて`json_c.aa`となることに注意(個別に参照する場合は単に'aa'や'bb'でもOKだと思う)。

## Listの処理
`d`のListを処理するにはこれまでのjson_tuple,get_json_objectだけではダメ。
そもそも、一レコードに複数のレコードが入っているとい状態で、通常のRDBであれば`d`は別テーブルになっているはずのところ。ETL処理で`d`を別ファイルに書き出し、JOINすれば出来そうだが、なんだか手間だ。何か方法があるはずと思い調べてみた。

問題点としてはjson_tuple, get_json_objectが返す値はPrimitive Typeだけって事。
json_tupleに関してはListな値については"[1,2,3]"という文字列で取得出来るだけ、get_json_objectに関してはget_json_object(raw_json.line, '$.d[0]')とList内にアクセスは可能だが、これだとListのLengthが事前にわからないと集計が出来ない事になるし、そもそも各レコード毎にListのLengthが違えばそもそも集計なんて出来ない。ARRAYとしてのアクセスが可能であれば`explode`を利用する事によってARRAYを展開して集計が可能になるのに。

### split,substr,length & explode
組み込み関数を駆使して強引にやってみるとこうなるのかな？

**dに含まれる値の合計値を出すクエリ**

```sql
SELECT sum(number) FROM raw_json 
    LATERAL VIEW json_tuple(
        raw_json.line,
        'd'
    ) json_list as numbers
    LATERAL VIEW explode(
        split(
            substr(
                json_list.numbers,
                2,
                length(json_list.numbers)-2
            ),
            ','
        )
    ) numbers as number;
```
イヤだ、これはイヤだ...。
explodeの中でやっている事が必死過ぎるのでイヤだ...。

### JSON SerDe & explode
ということで、もっとスマートに行こう！

JSON SerDeを使ってListを持つテーブルを定義すると

```sql
CREATE TABLE serde_json(
    d ARRAY<INT>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;
```
となる。
これに対して

```sql
SELECT sum(number) FROM serde_json
    LATERAL VIEW explode(d)
        numbers as number;
```
これでOK。スッキリ。

## Listの処理 - 応用
Listの処理で行った応用で`e`の項目も定義してみる。
eのARRAYはclassのARRAYとなっているので、下記のように書くこととなる。

```sql
CREATE TABLE serde_json(
    e ARRAY<STRUCT<aaa:STRING,bbb:INT>>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;
```
Listの処理と同じく、`e`の集計を行うにも同じくexplodeを使うと良い。

```sql
SELECT sum(data.bbb) FROM serde_json
    LATERAL VIEW explode(e) datas as data;
```

すべてをまとめると下記のようにしておくと良いのかな。

```sql
CREATE TABLE serde_json(
    a STRING,
    b INT,
    c STRUCT<aa:STRING,bb:STRING>,
    d ARRAY<INT>,
    e ARRAY<STRUCT<aaa:STRING,bbb:INT>>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;
```

ここまで出来ればどんなJSONであってもある程度はHiveで集計できそうだ(・∀・)

SerDeだったりUDFを自分で作り始めたら上級編かな...？
Xcodeの環境変数 $(PROJECT_DIR)や$(SRCROOT) などを確認する方法

方法の一つという所だと思うのですが、
ターミナルで、各プロジェクト(xxx.xcodeprojが格納されている場所)に遷移し、
以下のコマンドを実行。

```
xcodebuild -showBuildSettings
```

ただし、この場合だと大量に表示されるので、

```
xcodebuild -showBuildSettings | grep "SRC\|PROJECT"
```

的な感じで見たいやつだけ見るとするといいかもしれません。

他に方法があればまた教えていただければ幸いです。
Objective-Cのカテゴリについてメモ


既存のクラスにメソッドを追加できる仕組み
サブクラスを作成せずに、機能を拡張する
rubyのmixinに似ている気がするが、インスタンス変数は宣言できない
（カテゴリはコード実行時に動的に解決される為）

また、複数のカテゴリで同じメソッドが定義されていた場合はどのメソッドが呼ばれるかは決められない
機能の拡張の他にも、メソッドのグループ化にも使われる

もともとは、クラスを分割して書くことができるようにするために実装された機能なので
「カテゴリ」という名前のようだ

使用するには、カテゴリ用のヘッダファイルと実装ファイルを用意する
元のクラス名+カテゴリ名という命名規則がよさそう


```objectivec:NSString+Additional.h

#import <Foundation/Foundation.h>

@interface NSString (Additional)

- (NSString *)addMethod;

@end

```

```objectivec:NSString+Additional.m

#import "NSString+Additional.h"

@implementation NSString (Additional)

- (NSString *)addMethod
{
  ...
}

@end
```
Qiita の検索パターン



# ユーザー検索

```txt:特定のユーザーの投稿
user:asahina_dev 
```

```txt:いずれかのユーザーの投稿
user:asahina_dev OR user:qiita
```

# タグ検索

```txt:特定のタグの投稿
tag:mysql
```

```txt:指定したタグをいずれかを含む投稿
tag:mysql OR tag:php
```

```txt:指定したタグを全て含む投稿
tag:php tag:java
```

## タイトル検索

```txt:タイトルに含む
title:github
```

# コード検索

```txt:コードブロックに指定した語句を含む
code:Scanner
```
# ストック数検索

```txt:n件数超のストックされた投稿
stocks:>1000
```

```txt:n件数以上のストックされた投稿
stocks:>=1000
```

```txt:n件数のストックされた投稿
stocks:1000
```

```txt:n件数未満のストックされた投稿
stocks:<1000
```

```txt:n件数以下のストックされた投稿
stocks:<=1000
```

# 投稿日検索

```txt:指定日以降の投稿（当日含まない）
created:>2019-01-01
```

```txt:指定日以降の投稿（当日含む）
created:>=2019-01-01
```

```txt:指定日の投稿
created:2019-01-01
```

```txt:指定日以前の投稿（当日含まない）
created:<2019-01-01
```

```txt:指定日以前の投稿（当日含む）
created:<=2019-01-01
```
# 更新日検索

```txt:指定日以降に更新された投稿（当日含まない）
updated:>2019-01-01
```

```txt:指定日以降に更新された投稿（当日含む）
updated:>=2019-01-01
```

```txt:指定日に更新された投稿
updated:2019-01-01
```

```txt:指定日以前に更新された投稿（当日含まない）
updated:<2019-01-01
```

```txt:指定日以前に更新された投稿（当日含む）
updated:<=2019-01-01
```

# 特定のバージョンのみ（まともに検索不可）
```
version:5
```
Rails Markdown サンプルアプリ


**環境**
- Rails 4.1

**サンプル**
- https://github.com/usutani/note_md

**参考**
[ASCIIcasts - “Episode 272 - RedcarpetでMarkdown”](http://ja.asciicasts.com/episodes/272-markdown-with-redcarpet)
[masuidrive/open-wripe](https://github.com/masuidrive/open-wripe)
[vmg/redcarpet](https://github.com/vmg/redcarpet)

# 実装

Markdownで記述できるメモアプリを作成したいと思います。

```bash
rails _4.1.1_ new note_md
cd note_md
rails g scaffold Page body:text
rake db:migrate
```

Markdownの処理に用いるgemを追加します。

```ruby:Gemfile
# markdown
gem "redcarpet", "~> 2.3.0"
```

```bash
bundle install
```

Markdownの処理を追加します。

```ruby:app/helpers/application_helper.rb
module ApplicationHelper  
  @@markdown = Redcarpet::Markdown.new Redcarpet::Render::HTML,
    autolink: true,
    space_after_headers: true,
    no_intra_emphasis: true,
    fenced_code_blocks: true,
    tables: true,
    hard_wrap: true,
    xhtml: true,
    lax_html_blocks: true,
    strikethrough: true

  def html(markdown)
    @@markdown.render(markdown).html_safe
  end
end
```

```ruby:app/views/pages/show.html.erb
<%= html @page.body %>
```
vimで、開いているファイル内の単語数を数える


```vim
:%s/str//gn
```

strの数を教えてくれます。

"s"で置換なんだけれど、"n"で置換しないっていう意味。
だので、置換しないけれど変更箇所数は教えてくれる。

ちなみに、"c"は1個ずつ確認しながら置換していける。
Rails4で画面遷移しないajax的な更新フォームを作成する

viewにremoteとformatを設定して

```haml
=form_for @item, remote: true, format: :json, |
  html: {class: 'item_form'} do |f|
  =f.text_field :name
  =f.submit '保存'
```

responseのjsonを受け取った際になんかやる処理を追加する

```coffeescript
$('.item_form').on 'ajax:success', (e, products) ->
  alert("アイテム情報を保存しました")
$(".item_form").on "ajax:error", (xhr, data, status) ->
  alert("アイテム情報の保存に失敗しました")
```

controllerはデフォルトのscaffoldとかで生成しておけば勝手にjsonレスポンスの記述が入っているので特にやる事ナシ

便利すぎる・・
Maven導入メモ[Win,Mac]

#[Windows]
##[1]:Mavenのサイトから最新のMavenをダウンロードする。
http://maven.apache.org
左のメニューからGetMaven > Download > Maven 3.x.x > Maven 3.x.x(Biary zip) > apache-maven-3.x.x-bin.zip をダウンロードして解凍する。(解凍したフォルダはC:直下)
##[2]:コンピュータ > プロパティ > システムの詳細設定 > 環境変数 > システム環境変数
ここで変数を追加する。

変数　JAVA_HOME
値　　C:¥Program Files¥Java¥jdk1.x.x_xx　　（jdk1.x.x_xx　へのパス）

上記はJAVA_HOMEが登録されていない場合

変数　Path
値　　〜〜元々書いてあるパス〜〜;C:¥apache-maven-3.x.x¥bin  (apache-maven-3.x.x¥bin　へのパス）

##[3]:コマンドプロンプトで
`mvn --version`
と入力して、mavenのversion、javaのversionなどが出れば終了。

#[Mac]
##[1]:brewが入っている前提で、ターミナルで
`% brew install maven`
と入力するとインストールされる。
`% mvn --version`
と入力して、mavenのversion、javaのversionなどが出れば終了。
※もしパスが通っていない、見つからない場合
ホームディレクトリで
`% vi .bash_profile`
以下記入
`export M2_HOME=/usr/local/apache-maven-3.x.x
export PATH=$PATH:M2_HOME/bin`
保存
`% source .bash_profile`
反映
`% mvn --version`
と入力して、mavenのversion、javaのversionなどが出れば終了。

##[2]:MacPortが入っている前提で、ターミナルで
`% port search maven`
と入力するとmavenのversionのリストが表示される。
`% sudo port install maven3`
欲しいmavenをinstallの後に入力する。
※もしパスが通っていない、見つからない場合
ホームディレクトリで
`% vi .bash_profile`
以下記入
`export M2_HOME=/usr/local/apache-maven-3.x.x
export PATH=$PATH:M2_HOME/bin`
保存
`% source .bash_profile`
反映
`% mvn --version`
と入力してmavenのversionなどが出れば終了。

以上2点の方法でエラーが出る場合、brewの場合はproxyかgit、macportはproxyかrsyncだと思います。
ansibleでsudo可能なユーザを追加する


# 環境

* ubuntu 14.04
* ansible: 1.6.1
* vagrant: 1.6.2

# sudo可能なユーザを追加するplaybookの例

```
---
- hosts: webservers
  sudo: true
  vars:
    # created with:
    # openssl passwd -salt scibloaddx -1 *******
    password: $1$tekitoun$t293q2jBZPnzIljKNdGK..
  tasks:
    - user: name=yamada password={{password}} shell=/bin/bash state=present append=yes groups=sudo
```

# パスワードの設定方法

ansibleのuserモジュールでパスワードを指定するときは、暗号化済みのものでないとならない。その値は、 `openssl` コマンドで計算することができる。

```
openssl passwd -salt tekitouna_salt -1 p@ssW0rd
```

# 参考文献

[user - Manage user accounts — Ansible Documentation](http://docs.ansible.com/user_module.html)
mac 半角カタカナを入力

macで半角カタカナの入力が出来た！

ここのブログで紹介されてました！
http://d.hatena.ne.jp/kacchi0516/20110130/1296352990

・テキスト部分だけ抜粋 ※ サイトと見た方が画像もあって分かりやすいです。
環境設定->言語とテキスト->入力ソース
ことえりを探して（私の環境では一番下だった）半角カタカナにチェックを入れる
これで文字を入力後にfn + F8を押すと半角カタカナになります。
ansibleでSSHのユーザ、パスワードを指定する方法


ansibleでSSHのユーザやパスワードを指定したければインベントリファイルに書く方法がある。

```
[webservers]
192.168.111.222

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=ansible
ansible_ssh_pass=p@ssW0rd
ansible_sudo_pass=p@ssW0rd
```
誰か教えて: vagrantでrc.localを実行する方法



* vagrant up --no-provision で rc.local を実行したい
* rc.local では sh /vagrant/init.sh を実行している
* /vagrant がマウントされるより先に rc.local が実行される(みたい?)
* そのため init.sh が見つからず実行できない。boot.log には `sh: 0: Can't open /vagrant/ansible/rclocal/main.sh` と出てた
* 毎回 vagrant を起動するときに sudo /etc/rc.local するの大変…

Vagrantfile などで `--no-provision` でも /etc/rc.local を実行する方法はあるのでしょうか?

# 環境

* ubuntu 14.04
* vagrant: 1.6.2
ansibleでRAMディスクをマウントするPlaybook


ここではシンプルな構成管理ツール [ansible] を使って、RAMディスクをマウントするPlaybookを紹介する。

# 環境

* ubuntu 14.04
* ansible: 1.6.1
* vagrant: 1.6.2

# RAMディスクをマウントするPlaybook

```yaml:ramdisk.yml
# ramdiskをセットアップする
---
- hosts: docker-host
  sudo: true
  tasks:
    - mount: name=/mnt/ram src=none fstype=tmpfs opts="size=1024m" state=mounted
```

# パラメータの解説

* name: マウントするディレクトリ
* src: デバイス。`mount`モジュールは`src`が必須なので指定しないといけない。とりあえずnoneとした。
* fstype: ファイルシステム。ここでは `tmpfs` を設定する
* opts: RAMディスクのサイズを設定する。ここでは1GB
* state: あるべき状態を設定する。`mounted`にすると`/etc/fstab`に情報が書かれていて、かつ、マウントされている状態にプロビジョニングしてくれる。単に fstab に書き込むだけなら、 `present` を設定すればいい

# マウントされたか確認

df -hで調べる

```
vagrant@vagrant-ubuntu-trusty-64:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G  2.1G   36G   6% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            997M   12K  997M   1% /dev
tmpfs           201M  368K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1002M     0 1002M   0% /run/shm
none            100M     0  100M   0% /run/user
vagrant         120G   78G   42G  66% /vagrant
none            1.0G  4.0K  1.0G   1% /mnt/ram
```

あと、再起動してもマウントされるか確認する

```
vagrant halt
```

```
vagrant up --no-provision
```

# 性能測定?

RAMディスクの性能を測定するなら、bonnie++を使うといい。

ちなみに、ansibleのタスクとしては下記のように書くと bonnie++ をインストールできる。

```yaml
    - apt: name=bonnie++ state=present
```

bonnie++の使い方は[Linux - Bonnie++でファイルシステムのI/Oパフォーマンスを測定する - Qiita](http://qiita.com/suin/items/48757daa269920f8e011)を参照されたし。


# 参考文献

[mount - Control active and configured mount points — Ansible Documentation](http://docs.ansible.com/mount_module.html)

[ansible]: http://www.ansible.com/
正規表現の最短マッチ

### 今さらだけど、最短マッチ

URLを解析して、特定パターンに合致する文字列を取り出したかったのです。

http://hoge.com/hoge/fuga/goods/

ここから、スラッシュで囲まれた最初のブロックの文字列…
今回の場合は hoge だけ取り出したい。

最初はこう書いてましたが。


~~~誤.rb
url.match(/^http:\/\/hoge.com\/(.*)\//)
~~~

これだと、引っかかるのは「hoge/fuga/goods」になる(´・ω・`)
条件として指定している「/」は、一番最後のを使っている形になってますね。
違うんです、一番最初に出てきた「/」を区切りとして使いたいんです！

てなわけで、最短マッチのメタ文字を追加。

~~~正.rb
url.match(/^http:\/\/hoge.com\/(.*?)\//)
~~~

任意の1文字の繰り返しを最短で切り上げるため、(.*)に「?」を入れます。

すると、期待通りに「hoge」だけ取れるようになりました。

デフォルトは最長マッチになっているけど、最短もよく使うので覚えておく。

参考：
http://d.hatena.ne.jp/cloned/20061110#c
メモ：Quickstart Docker example with google/busybox on boot2docker for Vagrant

https://developers.google.com/compute/docs/containers#quickstart_example

```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "yungsang/boot2docker"

  config.vm.box_version = ">= 0.9.3"

  config.vm.provision :docker do |d|
    d.pull_images "yungsang/busybox"
    d.run "simple-echo",
      image: "yungsang/busybox",
      args: "-p 8080:8080",
      cmd: "nc -p 8080 -l -l -e echo hello world!"
  end

  config.vm.network :forwarded_port, guest: 8080, host: 8080
end
```

```bash
$ vagrant up
$ nc localhost 8080
hello world!
```

Cf.) Quickstart Docker example with google/busybox on boot2docker for Vagrant
https://gist.github.com/YungSang/7b37b484d97af34557c6
MySQLクエリ結果をlessで見る。

MySQLでSQLを実行しているときに、見づらいなーと思ったときに巡り合ったプロンプトの表示方法の変更。クエリ結果をlessで見れる。

CUIで頑張っている人にしか役立たないかも。


# 環境
mysql 5.x
linux

# 設定

lessでの文字化けを防ぐために以下の設定

```
# export LESSCHARSET=utf-8
```

DBへ接続し、設定を投入。

```
# mysql -uroot -p
mysql> pager less -n -i -S

```

# 確認

以降、コマンドでクエリーを実行すると、lessで確認しているようになれる。
方向キーで縦横無尽に動け、カラムも整形されていて見やすい。

試しに以下を叩いて頂ければと。

```
mysql> select * from mysql.user;
```

# 参考

http://dev.mysql.com/doc/refman/5.1/ja/mysql-commands.html
proxmox3.2でソフトウエアRAID1

[Proxmox software raid - MontelLUG](http://www.montellug.it/wiki/index.php?title=Proxmox_software_raid)を参考にやってみた。 

proxmox3.2をインストール直後。
インストールは以下bootオプション使用

`> linux ext4 maxroot=10 swapsize=4`


今の構成

* /dev/sda --- OSをインストールした。
* /dev/sdb --- RAID1用。今は空

ボリューム予定

* /dev/md1 : /boot
* /dev/md2 : /

準備
=======

```bash:mdadmのインストール
# apt-get install -y mdadm sudo vim screen
allを選択
# modprobe raid1
```

```bash:GPTパーティション構成のコピー(sda->sdb)
# sgdisk -R /dev/sdb /dev/sda
```

```bash:RAID1の準備
# sgdisk -G /dev/sdb
# sgdisk --randomize-guids --move-second-header /dev/sdb
# parted -s /dev/sdb set 2 "raid" on
# parted -s /dev/sdb set 3 "raid" on
# mdadm --zero-superblock /dev/sdb2
# mdadm --zero-superblock /dev/sdb3
# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
y
# mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
y
# cp /etc/mdadm/mdadm.conf{,.org}
# mdadm --examine --scan >> /etc/mdadm/mdadm.conf
```

/boot のRAID1化
===============

```bash:/bootのRAID1化
# mkfs.ext4 /dev/md1
# mkdir /mnt/md1
# mount /dev/md1 /mnt/md1
# cp -ax /boot/* /mnt/md1
```

```diff:/etc/fstab
-UUID=c1e90048-e3fd-48e8-a337-XXXXXXXXXXXX /boot ext4 defaults 0 1
+/dev/md1 /boot ext4 defaults 0 1
```

```bash:OS再起動
# reboot
```


```bash:GRUBのインストール
# cat >> /etc/default/grub <<EOL
GRUB_DISABLE_LINUX_UUID=true
GRUB_PRELOAD_MODULES="raid dmraid"
GRUB_TERMINAL=console
EOL
# echo raid1 >> /etc/modules
# echo raid1 >> /etc/initramfs-tools/modules
# grub-install /dev/sda --recheck
# grub-install /dev/sdb --recheck
# update-grub
```

/ のRAID1化
===========

```bash:
# parted -s /dev/sda set 2 "raid" on
# mdadm --add /dev/md1 /dev/sda2
# pvcreate /dev/md2
# vgextend pve /dev/md2
```

```bash:500gbで3時間くらいかかる
# pvmove /dev/sda3 /dev/md2
  /dev/sda3: Moved: 0.0%
  /dev/sda3: Moved: 0.1%
  ...
  /dev/sda3: Moved: 100.0%
```

```bash:
# vgreduce pve /dev/sda3
# parted -s /dev/sda set 3 "raid" on
# mdadm --add /dev/md2 /dev/sda3
```
Ruby2.1+Rails4+PostgreSQL9.3でJSON KVS

* Ruby2.1&bundler&Rails4インストール
* PostgreSQL9.3インストール&DB作成&設定&起動

```
rails new kvs --database=postgresql --skip-test-unit --skip-bundle
cd kvs
```

Gemfileに以下を追加

```
gem 'therubyracer'
gem 'puma'

group :test, :development do
  gem 'rspec'
  gem 'rspec-rails'
end
```

```
bundle install
rails g rspec:install
rails g scaffold entity key:string value:json
vi config/database.yml #データベース接続情報を設定(ユーザ名など)
vi config/routes.rb #`scope :kvs do resources :entity end`のネスト設定
vi config/secrets.yml #secrete_key_baseを設定
rake db:create RAILS_ENV=production
rake db:migrate RAILS_ENV=production
rake assets:precompile RAILS_ENV=production
nohup rails21 s Puma -e production & echo $! > /tmp/kvs.pid
```

終了時は
```
kill $(cat /tmp/kvs.pid)
```

あとはコントローラでソート順をいじったり、ビューで必要な情報だけ表示したり。
JSPテンプレートのキャラセットを変更する

windows環境でJSPファイルを自動生成すると、毎回嬉しくないキャラセットが指定されてしまうので、これを変更する事にした。

```
<%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J"%>
```
これを、、、

```
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
```
こうしたい。

# 手順
`ウィンドウ`>`設定`を開く
`Web`>`JSPファイル`>`エンコード`>`ISO 10646/ユニコード(UTF-8)`
これで新規に作成したJSPファイルのキャラセットがデフォルトでUTF-8に。
Ubuntu 14.04でdockerをsudoなしで動かす

[本家のドキュメント](http://docs.docker.io/installation/ubuntulinux/#giving-non-root-access)通りに`docker`を`sudo`なしで動かせるようにしようとしたら、`docker`という名前のserviceはないと怒られました。

```shell-session
$ sudo service docker restart
docker: unrecognized service
```

Ubuntu 14.04では`docker`は`docker.io`という名前でインストールしているので、service名も`docker.io`になります。
以下実行コマンド。

```console
$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ sudo service docker.io restart
```

コマンドを実行した後にログインし直すと、`docker`を`sudo`なしで動かせるようになりました。
Eclipseプラグインでダイアログをカスタマイズする

Eclipseのプラグインでダイアログをカスタマイズしたくなったので簡単なサンプルを作った。

ソースはここ https://github.com/mshoj/EclipsePluginCustomDialog

#### ダイアログ開く
```java
   /**
     * the command has been executed, so extract extract the needed information
     * from the application context.
     */
    public Object execute(ExecutionEvent event) throws ExecutionException {
        IWorkbenchWindow window = HandlerUtil
                .getActiveWorkbenchWindowChecked(event);
        // ダイアログを開く側はダイアログのインスタンスを生成してopen()するだけでOK
        Dialog dialog = new CustomDialog(window.getShell());
        dialog.open();
        return null;
    }
```
コメントにも書いてあるけど、ダイアログを開くのはインスタンスをを作ってopen()するだけで良い

#### ダイアログの中身をカスタマイズする


```
public class CustomDialog extends Dialog {

    public CustomDialog(Shell parentShell) {
        super(parentShell);
    }

    /**
     * ここでダイアログ内の部品の初期化を行っている。<br/>
     * 今回はボタンとテキストボックスの部品を追加している。
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);
        Button button = new Button(container, SWT.PUSH);
        button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
                false));
        button.setText("Press me");
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                System.out.println("Pressed");
            }
        });

        createTextBox(container);

        return container;
    }

    /**
     * ここでダイアログのタイトルを設定している。
     */
    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText("Custom dialog");
    }
}
```
ここには全部書いていないが、Dialogクラスを継承してcreateDialogAreaの中で追加したい部品を書いていけばカスタマイズ完了


[参考URL](http://www.vogella.com/tutorials/EclipseDialogs/article.html)
PythonでSimRankを実装した


##前置き

SimRankはグラフにおけるノード間の類似度を（再帰的に）計算する手法

共通の隣接ノードをもっていなくても類似度を計算できるという特徴を持つ

[論文](http://faculty.ksu.edu.sa/73693/web%20mining/SimRank%20A%20Measure%20of%20Structural-Context%20Similarity.pdf)
[わかりやすい日本語の説明](http://www.dbl.k.hosei.ac.jp/~miurat/readings/July1111.pdf)
[Wikipedia（英語）](http://en.wikipedia.org/wiki/SimRank)

ちなみに、SimRank論文の第二著者は超著名なDB研究者

##実装

論文中では二部グラフに対してもSimRankを計算する方法が書いてあったのでそれも実装してみた。

```simrank.py
import numpy as np

def simrank(G,C,n,t=10):
    S = np.identity(n)
    I = np.identity(n)
    G = normalize(G)
    i = 1
    while True:
        S = C * np.dot(np.dot(G.T,S),G) + (1-C) * I
        for j in range(n):
            S[j][j] = 1
        if i >= t:
            break
        i += 1
    return S

def bipertite_simrank(G,C,n,m,diag_1=True,t=10):
    S1 = np.identity(n)
    S2 = np.identity(m)
    I1 = np.identity(n)
    I2 = np.identity(m)
    G_T = normalize(G.T)
    G = normalize(G)
    i = 1
    while True:
        S2 = C * np.dot(np.dot(G.T,S1),G) + (1-C) * I2
        for j in range(m):
            S2[j][j] = 1
        S1 = C * np.dot(np.dot(G_T.T,S2),G_T) + (1-C) * I1
        for j in range(n):
            S1[j][j] = 1
        if i >= t:
            break
        i += 1
    return (S1,S2)

def normalize(G):
    s = G.sum(0)
    return G/s

if __name__ == '__main__':
    C = 0.8

    """ univ """
    n = 5
    G = np.zeros((n,n))
    G[0][1] = 1
    G[0][2] = 1
    G[1][3] = 1
    G[2][4] = 1
    G[3][0] = 1
    G[4][2] = 1

    S = simrank(G,C,n)
    print S

    print '=================='

    """ cake """
    n = 2
    m = 4
    G = np.zeros((n,m))
    G[0][0] = 1
    G[0][1] = 1
    G[0][2] = 1
    G[1][1] = 1
    G[1][2] = 1
    G[1][3] = 1

    S1, S2 = bipertite_simrank(G,C,n,m)
    print S1
    print S2
```

実際のところ行列積をほいほい計算して更新していくだけ

Cの値は論文中では0.8くらいがいいとされているけど、その後の研究で0.6くらいがいいよねってなってるらしい（出典はWikipedia）。

それと、イテレーション回数は論文中では５回位で十分ってなっているけど、これもその後の研究でもっとやったほうが良さげと言われるようになったらしい（出典はWikipedia）。

##結果

```結果
>> python simrank.py
[[ 1.          0.          0.1321943   0.          0.032768  ]
 [ 0.          1.          0.4131072   0.          0.10575544]
 [ 0.1321943   0.4131072   1.          0.04096     0.08687124]
 [ 0.          0.          0.04096     1.          0.33048576]
 [ 0.032768    0.10575544  0.08687124  0.33048576  1.        ]]
==================
[[ 1.          0.54658196]
 [ 0.54658196  1.        ]]
[[ 1.          0.61863088  0.61863088  0.43726175]
 [ 0.61863088  1.          0.61863088  0.61863088]
 [ 0.61863088  0.61863088  1.          0.61863088]
 [ 0.43726175  0.61863088  0.61863088  1.        ]]
```

論文中の結果（Figure1、Figure2）と一致してるから合ってるんでしょうきっと！
PHPにルートクラスなんて無かった

## Java

```java:ソースコード
public class Main {
    public static void main(String[] args) {
        new A();
        new B();
    }
}
 
class A {
    public A() {
        System.out.println(getClass().getSuperclass().getSimpleName());
    }
}
 
class B extends Object {
    public B() {
        System.out.println(getClass().getSuperclass().getSimpleName());
    }
}
```

```text:実行結果
Object
Object
```

C#
--

```csharp:ソースコード
class Program
{
    static void Main(string[] args)
    {
        new A();
        new B();
    }
}
 
class A
{
    public A()
    {
        System.Console.WriteLine(this.GetType().BaseType.Name);
    }
}
 
class B : object
{
    public B()
    {
        System.Console.WriteLine(this.GetType().BaseType.Name);
    }
}
``` 

```text:実行結果
Object
Object
```

## PHP

```php:ソースコード
<?php

new A;
new B;
 
class A {
    public function __construct() {
        var_dump(get_parent_class());
    }
}
 
class B extends stdClass {
    public function __construct() {
        var_dump(get_parent_class());
    }
}
```

```text:実行結果
bool(false)
string(8) "stdClass"
```

何か `false` じゃfu*k
HTML5の書き方（改訂版）


まずHTMLは大きく2つに分けることができます。
【テキスト】とURLを用いた【ハイパーリンク】です。
テキストは「本文」「本文を補足するサブテキスト（広告、関連記事リンク、注釈、コラム、用語集など）」「ナビゲーションなどのリンクを説明するテキスト（ナビゲーション）」の3つに分けることができます。
【ハイパーリンク】を使って表現できることは「URLジャンプ（リンク）」、「メディアなどの埋め込み（画像・Flash・JSなど）」、「参照（CSS、RSSなど）」となります。

ハイパーリンクにはいろいろな機能があるのですが今のところ、この4つの機能が実装されています。

##HTML文章はアウトライン構造をもっている文章フォーマット
HTML文章は見だしによるアウトライン（階層）構造を持った文章フォーマットです。見だしを元に作られたアウトラインデータはSEOなどでも重要視されています。

※ここでいうSEOについて簡単に説明すると、見だし内で使われている単語が検索インデックスとして評価され、良い見だしをつけると検索に引っかかりやすくなるというものです。perldocのように見だしにNAMEやVERSIONSのような単語をつかうと重要な文章とは評価されず検索に引っかかりにくなります。


###見だしによるセクションの範囲
HTML4では「同一レベル以上の見出しが現れるまで」をセクションとしていました。

HTML5では見だしで示していた「セクション（章・節・項・目）」の範囲を要素を使って細かく明示できるようになりました。

同一レベル以上の見出しが現れるまでの「見だし区切り」では「広告」や「ナビゲーション」が文中に現れると文章としての境界が曖昧になり、広告や本文をデータとして区別することが難しかったのですが（商業上、広告テクニックとしてわざと曖昧にしてることもあります）、セクションに関する要素が定義されたことではっきりと明示できるようになりました。

html5ではセクションに関する様々な要素が定義されています。
代表的な物はsection,article,aside,nav,figureの5つです。
これまでアウトラインに含めることのできなかった「広告」や「ナビゲーション」などもアウトラインに組み込むことができるようになりました。


####section要素
本文を表すセクションです。必ずアウトライン構造を持つため「見だし」が必要です。
先ほどHTML4では「同一レベル以上の見出しが現れるまで」をセクションとして扱うと書きましたがHTML5でもそのように使うことができます。


例えばsection要素内にh1が2つあるような場合(もしくはh1がなく、h2が2つある場合)、1つのsection要素でもアウトライン上ではセクションが2つあるものとして扱われます（そういった使い方はしない方がいいでしょう）。


####article
本文とは独立した文章を表すときに使います。
具体的にはWEBアプリケーション（ブログなど）が生成するコンテンツ、過去に作成された記事、
筆者の違う独立した記事・コンテンツを扱うときはartcle要素を使います。

アウトライン構造を持つ必要がありますが、独立した記事・コンテンツであることを表すことが重要なので取り扱うコンテンツしだいでは、柔軟に対処してもよいでしょう。

####aside
用語集やコラム、広告、関連記事リンク、コメントなど本文の補足事項を表します。
アウトライン構造を持たなくてもよいです。アウトラインを持たない場合、空の見だしが設定されます。

####nav
グローバルリンクなどリンクを説明する文章を表します。
asideと同じでアウトライン構造を持つ必要はありません。

### アウトラインを正しく管理する
アウトラインを正しく管理するにはセクション要素内のアウトラインルートとなる見出しをh1から始めることです。こうすることで独立した文章ノードとして管理することが容易になります。

セクション内のサブセクションはサブセクションごとに独立した文章ノードとして管理したい場合を除けば、見だしレベルを用いて「同一レベル以上の見出しが現れるまで」をサブセクションとして取り扱うようにすると良いでしょう。

### アウトラインの自動生成
HTML5ではセクション要素を正しく使うことでアウトラインを自由に構成できるようなりました。自動的、機械的に処理されるべきものに対してセクション系要素を用いることで、より簡単にHTMLが書けるようになります。

逆に言えばアウトラインを自動構成・生成、管理するような機能を必要としていない場合、本当にセクション系要素を使うべきか、もう一度検討すべきです。


## HTML5になったことによる変化
アウトライン構造とその文章範囲が明確にすることができるため「アウトラインの見だしとその内容」を文章ノードとして個別に保存するようなことも可能です。以前に比べて、アウトラインの順序や入れ子関係を気にせずに管理できます。アウトラインさえ管理できればFirewokrsによるデザインレイアウトの自動生成などもできるようになるでしょう（できるとはいっていない。


##基本のおさらい

- 3種類のテキストとURLに分けて考える。「本文」「本文を補足するサブテキスト」「ナビゲーションなどのリンクを説明するテキスト」
- HTMLは見出しによるアウトライン構造を持っている
- アウトラインの種類をsection,article,aside,nav,figureと細かく分類できるようになった。
- セクション系要素はレイアウトのためでなくアウトライン生成を自動化するために使われる
- マークアップエンジニアより、アウトライン編集・管理ツールが必要。
Microsoft Azure SDK for PHPをComposerでインストールする方法 2014/05/26

#Microsoft Azure SDK for PHPをComposerでインストールする方法 2014/05/26#

[https://github.com/Azure/azure-sdk-for-php](https://github.com/Azure/azure-sdk-for-php "Microsoft Azure SDK for PHP")や[http://azure.microsoft.com/en-us/documentation/articles/php-download-sdk/](http://azure.microsoft.com/en-us/documentation/articles/php-download-sdk/ "Download the Azure SDK for PHP")に書かれている方法では、既に情報が古いので以下でインストールしましょう。

2014/05/26時点での最新のインストール方法は以下のcomposer.jsonでインストールできます。

#### composer.json ####

	{
	    "require": {
	        "microsoft/windowsazure": "dev-dev",
	        "pear-pear.php.net/http_request2": "*",
	        "pear-pear.php.net/mail_mime": "*",
	        "pear-pear.php.net/mail_mimedecode": "*"
	    },
	    "repositories": [
	        {
	            "type": "pear",
	            "url": "http://pear.php.net"
	        }
	    ]
	}
proveのプラグインが動かなくなった


安易に色々試してたら開発環境を壊してしまったので新しく作り直し、既存のテストを動かしてみると動きませんでした。




proveのプラグインからTest::Mysqldなどが動くようにしてたのですが開発環境のlibから読み込んでくれなくなりました。

```bash:こんなの
prove -Ilib -PMyTest::Hoge
```

どうも今のproveのオプション「-Ilib」はプラグイン読み込み時には＠INCに反映されていないようでした。

で、結論としては[Harriet](https://metacpan.org/pod/Harriet)をインストールすることで解消されました。
今後はそういう形で使っていけばいいてことなのかな？
ファイル作成日時が更新日時になってしまう(about created date)

[日本語]
vim でファイルを編集し`:wq` や`:ZZ` で保存・終了したファイルの作成日時が更新日時と同じ時刻になってしまいます。
保存時に作成日時が上書きされないようにするにはどうしたら良いのでしょうか。

[English]
When I edit a file with vim and save by `:wq` or `:ZZ` command, the created date of the file become same as the modified date.
What should I do so that it prevents the created date from being overwritten?