OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCIでスクリーンショットを撮る

取得したい箇所に以下を追記

```rb
page.save_screenshot ENV['CIRCLE_ARTIFACTS'] + "/screenshot1.png"
```

で、CircleCI側で、対象のブランチに行き、
[Artifacts]タブをクリック。

![スクリーンショット 2015-04-17 12.21.29.png](https://qiita-image-store.s3.amazonaws.com/0/10856/b1a36194-d3fc-7ced-b8fc-db4560fe6c91.png)


これで確認できます。

意外と？書かれてなかったのでメモ。
elasticesearch-1.5.1.jar のjavadoc

elasticesearch-1.5.1.jarのjavadocってどこにあるのだろう？

http://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html

上記には概要しか書いていない。。


-- 追記 --
Twitterでつぶやいたら、中の人からURLを教えてもらいました。

>Jun Ohtani ‏@johtani  
>@kaki7569 オンラインでは後悔してないです。有志の方が公開しているというのが、こちらのIssueに記載があります。https://github.com/elastic/elasticsearch/issues/1203

↓JavaDocのURL
http://javadoc.kyubu.de/elasticsearch/
dialyzerのエラーサンプル集 その1 #Erlang

# <font color="red" size="7">現在編集中です。</color>

# ソースコード

```erlang:error_sample.erl
-module(error_sample).

%%----------------------------------------------------------------------------------------------------------------------
%% Exported API
%%----------------------------------------------------------------------------------------------------------------------
-export([
         h/1
        ]).

%%----------------------------------------------------------------------------------------------------------------------
%% Macros & Records & Types
%%----------------------------------------------------------------------------------------------------------------------
-record(r, {
             item :: term()
           }).
-record(s, {
             item1 :: term(),
             item2 :: term()
           }).

-type r_list() :: [#r{}].
-type s_list() :: [#s{}].

%%----------------------------------------------------------------------------------------------------------------------
%% Exported Functions
%%----------------------------------------------------------------------------------------------------------------------
-spec h([term()]) -> ok.
h(List) ->
    {_, F} = f(List),
    g(F).

%%----------------------------------------------------------------------------------------------------------------------
%% Internal Function
%%----------------------------------------------------------------------------------------------------------------------
-spec f([term()]) -> {[1], r_list()}. % XXX: r_list() がおかしい
f(List) ->
    f(List, {[], []}).

-spec f([term()], {[1], s_list()}) -> {[1], s_list()}.
f([], R) ->
    R;
f([H|T], {R1, R2}) ->
    f(T, {[1|R1], [#s{item1=H}|R2]}).

-spec g(s_list()) -> ok.
g([]) ->
    ok;
g([H|T]) -> % error_sample.erl:xx: The pattern [H | T] can never match the type []
    io:format("~p", [H#s.item1]),
    g(T).

```

# エラー
```shell-session
$ dialyzer ...
error_sample.erl:xx: The pattern [H | T] can never match the type []
```
CakePHPでコントローラーのPOSTをテストする

testActionの第二引数でPOSTするデータを渡すとテストできます。

```php:CommentsControllerTest.php
public function testAdd() {
    $data = array(
        'Comment' => array(
            'body' => 'this is comment test'
        )
    );
    $this->testAction('/comments/add', array('method' => 'post', 'data' => $data));
}
```

こんな感じ。

ファイルのアップロードを伴うPOSTをテストしたい場合は、ファイルをPOSTした時に$_FILESにセットされる想定のものをファイルの値に入れて渡せば良いようです。

```php:CommentsControllerTest.php
public function testAdd() {
    $data = array(
        'Comment' => array(
            'body' => 'this is comment test',
            'img_file' => array(
                'name' => 'picture.jpg',
                'type' => 'image/jpg',
                'tmp_name' => ROOT . DS . APP_DIR . DS . 'Test' . DS . 'Fixture' . DS . 'picture.jpg',
                'error' => UPLOAD_ERR_OK,
                'size' => 58915
            )
        )
    );
    $this->testAction('/comments/add', array('method' => 'post', 'data' => $data));
}
```

テスト用のファイルをFixtureディレクトリの下とかに置いておき、tmp_nameにその場所を書きます。
EmbeddedEntity

#Who
Google App Engine (GAE/J)
Datastore API

#What
EntityにプロパティMapを埋め込む。
プロパティMapはEntityとしてDatastoreに登録する必要はない。
EntityからEmbeddedEntityへとその逆の変換が用意されている。
EntityのIDを関連付けるのではなく、Entityのプロパティ自体を持つ。

#When, Where
サーバーサイド

#Why
EntityのプロパティにEntityを指定するために使用する。

#How
employee EntityにContact Infoを埋め込む。

```java:
public class EmbeddedEntitySample {
  static final DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

  void execute() {
    final Entity employee = new Entity("employee");
    employee.setProperty("firstName", "Antonio");
    employee.setProperty("lastName", "Salieri");

    final EmbeddedEntity embeddedContactInfo = new EmbeddedEntity();

    embeddedContactInfo.setProperty("homeAddress", "XXX-XXXX");
    embeddedContactInfo.setProperty("phoneNumber", "XXXXXXXX");
    embeddedContactInfo.setProperty("emailAddress", "xxx@gmail.com");

    employee.setProperty("contactInfo", embeddedContactInfo);

    datastore.put(employee);

    final Entity contactInfo = new Entity("contactInfo");
    contactInfo.setPropertiesFrom(embeddedContactInfo);
    datastore.put(contactInfo);
  }
}
```
【国内】IOTに繋がりそうなアプリケーション

## ビデオチャット通訳アプリ「LACU」

![スクリーンショット 2015-04-17 11.51.20.png](https://qiita-image-store.s3.amazonaws.com/0/74972/296fdf9d-f55a-1457-09fb-15edbd7fb048.png)


http://www.itmedia.co.jp/news/articles/1405/02/news065.html

- 外国向けアプリケーション
- スマートフォンを介して見知らぬ人に同時通訳してもらえるアプリ
- メモ: 専用端末から音声で同時通訳できないだろうか。
イメージスライダーにひと工夫して動きをつける

## これは何？
主張したい要素に目を引かせるために、イメージスライダー内に動きを加えたものを作成したので、それのメモです。
[demo](https://nekoneko-wanwan.github.io/demo/bxSlider/)

## はじめに
トップにどーんと大きい画像を配置し、コンテンツを切り替えるスライダーはよくある見せ方だと思います。

切り替え時にフェードさせたり、カーテンのようにパラパラと動かしたり、3Dでぐるぐる回したり・・・
エフェクトによって面白くて目を引くような見せ方もできますが、ここでは切り替えはシンプルにしつつ、動きで中の要素を目立たせることをしてみます（最近よく見かけますね）

エフェクトはある程度パターンが決まってしまいますが、要素の動きであればいくらでも面白い見せ方ができるかと思います。

## スライダープラグイン
スライダーの実装にはプラグインを使用しています。
プラグインは以下を満たしているものであれば、何でも良いかと思います。

- imgだけでなくdiv, liなどブロックごとにスライドできるもの
- スライドの読み込み・各スライドが完了時のcallbackが用意されているもの

ここではbxSliderを使用しています
（対応ブラウザがIE7+というのも嬉しいです）
http://bxslider.com/

> 企業サイトなどでこういったスライダーを取り入れることが多いのですが、
> 未だにオールドブラウザに対応せざるを得ないこともあります。
> その上でスライダーで何か面白い動きを、と要求されると切り替えエフェクトだけでは厳しいです（面白い動きは大抵モダンブラウザのみ...もしくは動作が重くならざるを得なかったりするため）

## 考え方
- まずは普通にスライダーを設定します
- 各スライドの切り替えが終わったことを受けて（callback）、該当スライド内の要素をアニメーションさせます
- アニメーションはJSでもCSSでも何でも良いかと思います（ここではCSSを利用し、要素をフェード+回転させています）

## 実装
*cssは省略。

```html
<div class="slider">
  <ul class="slider__inner">
    <li>
      <div class="slider__cap">メインキャッチコピー</div>
      <div class="slider__cap is-sub">サブキャッチコピー</div>
      <img src="img/pic1.jpg" />
    </li>
    <li>...</li>
  </ul>
</div>
```

```js
$(function() {
    var $slider      = $('.slider__inner');
    var $sliderLists = $slider.find('li');
    var CLASS_NAME   = 'is-active';

    /**
     * classを付け替える関数
     * classによってCSSアニメーションを操作する
     * @param {object} $elm: $sliderListsに含まれる、liをjqueryObjectとして渡す
     */
    function switchClass($elm) {
        $sliderLists.removeClass(CLASS_NAME); /* Delete */
        $elm.addClass(CLASS_NAME); /* Add */
    }

    /* sliderのオプション */
    var options = {
        /* sliderが読み込まれたら */
        onSliderLoad: function(currentIndex) {
            var $elm = $($sliderLists[currentIndex]);
            switchClass($elm);
        },
        /* sliderが完了したら */
        onSlideAfter: function($elm, oldIndex, newIndex) {
            switchClass($elm);
        },
        randomStart: true,
        auto: true
    };

    /* コンテンツが読み込まれたら実行 */
    $(window).load(function() {
        /* bxSlider実行 */
        $('.slider__inner').bxSlider(options);
    });
});
```

## おわりに
動きで目立たせようとしているため、デザインがシンプルだとより効果的かもしれません。
またそれほど難しいものも無いので、JSが苦手なデザイナーの方でも取り入れやすいのではないでしょうか。
IdeaVimでキーマップが衝突した場合の対応

![スクリーンショット 2015-04-17 11.55.02.png](https://qiita-image-store.s3.amazonaws.com/0/1044/2f5da814-dcc9-3fde-7c10-a4cb379174e5.png)

`Preferences > Vim Emulation`から上のキャプチャのような画面にVimとIDEで衝突しているキーマップを表示してくれる。右の`Handler`の列でVimとIDEどちらに割り当てるか設定できる。

`Ctrl-r`, `Ctrl-d`でアプリケーションを実行したかったのにVimのキーマップが実行されるのがちょっとストレスだったので修正した。
PHPのjson_encode=>json_decodeで空連想配列が配列に変換される現象

PHPでJSONを扱う場合、json_decode()の第二引数にtrueを指定して配列として扱う場合がよくあると思います。
これを使っていると json_encode()してjson_decode()で戻すと、空連想配列(stdClass)が配列になってしまうようです。
memcachedなんかにJSONで配列を保存しているような場合には注意ですね。
キャッシュ時と非キャッシュ時で異なる形式のJSONをクライアントに返してしまうなんてことが起こってしまいます。

##ソース
```php
$r = array('hoge'=> new \stdClass());
$j = json_encode($r);
echo $j . "\n";
print_r(json_decode($j,true));
echo "\n";
```

##結果
```text
{"hoge":{}}
Array
(
    [hoge] => Array
        (
        )

)
```
ドキュメントとかろくろく見ない Excel VBA チートシート

いや ほんとVBAとか触りたくなかったんですがね。どうしても必要が出てきてしまったので今更ながら。
# DOSコマンドの実行
```vbnet:exec
Sub ExecCommand

    ' インスタンスはオブジェクト型っぽいやつ。おそろしい。
    Dim WindowsShell
    Dim WSExec

    ' SVNの情報もってきたかった
    Dim sourceURL As String

    sourceURL="http://hogehoge/trunk/hugahuga/piyopiyo.java"

    ' プロンプトのインスタンスを作成
    Set WindowsShell = CreateObject("WScript.Shell")
    ' 実行結果かな。型名とか何も無いからよくわからん。
    Set WSExec = WindowsShell.Exec("svn list " & sourceURL)
    
    tmp_stdout = ""
    tmp_stderror = ""
    Do
        tmp_stdout = tmp_stdout & WSExec.StdOut.ReadAll
        tmp_stderror = tmp_stderror & WSExec.StdErr.ReadAll
        DoEvents
    Loop While WSExec.Status = 0
    ' この WSExec.Status とやらはコマンドの実行が終わった時に0になるらしい。
    ' ちなみにエラーレベルは直接とれないらしい。斬新。
        
    MsgBox (tmp_stdout)
End Sub
```

斬新。

# コピペ
## 基本
```vbnet:copypaste
Sub cpp
    Range("E2").Copy 'コピー元
    Range("F2").PasteSpecial 'コピー先
End Sub
```
## 範囲にべたっと
```vbnet:copypastemany
    Range("F3").Copy 'コピー元
    Range("A2").Select 'A2を選択して
    Range(Selection, Selection.End(xlDown)).Select  'ctrl+下と同じ動作
    Range(Selection, Selection.Offset(0, 5)).Select  '5つ右まで広げる
    ActiveSheet.Paste 'ぺたり
    
```

# URIデコード
```vbnet:uridecode
Sub URIDecode()
  Range("B3").Select 'たまたま対象が「B3より下のデータ」だった
  Range(Selection, Selection.End(xlDown)).Select
  'ググったら出てきた。JS呼んでるのかな。
  Set sc = CreateObject("ScriptControl")
  sc.Language = "Jscript"
  Set js = sc.CodeObject

    Dim ch As Variant
    For Each ch In Selection '選択されているセル全てに対して
        urlEncode = js.decodeURIComponent(ch.Text) 'デコードして
        ch.Value = urlEncode '代入。1行でも多分大丈夫
    Next
End Sub
```
AWS S3にアップロードしたファイルのContent-Typeを一括で書き換えるワンライナー


# 問題

API 経由でのファイルアップロード処理の実装にミスるなどして、ファイルの Content-Type が ```binary/octet-stream``` になってしまって困ることがある。(あまりない)

# 解決策

aws cli を使ったワンライナーで以下のように書ける。
以下は、```.jpg ``` なファイル名のファイルに対して、```image/jpeg``` を設定して回るサンプル。

```console
$ aws s3 ls --recursive s3://<bucket_name>/<somewhere> | grep -e '.jpg$' | awk '{ print "s3://<bucket_name>/"$4 }' | while read origname; do aws s3 mv ${origname} ${origname}.bak; aws s3 mv ${origname}.bak ${origname} --metadata-directive REPLACE --content-type "image/jpeg"; done
```

* ```s3 mv``` はファイル名の変更を伴わずに Content-Type のみを書き換えることはできないぽい( ```Cannot mv a file onto itself``` と怒られる)ので、一旦別のファイル名にして戻す
* Content-Type を書き換えるときは ```--metadata-directive REPLACE``` オプションを指定する

# 参考

* [AWS CLI s3](http://docs.aws.amazon.com/cli/latest/reference/s3/index.html)
	* [ls](http://docs.aws.amazon.com/cli/latest/reference/s3/ls.html)
	* [mv](http://docs.aws.amazon.com/cli/latest/reference/s3/mv.html)
はじめてGoogleAppsScriptを触ってみた

Anzible触るのが楽しいのですが、とりあえずなんでもやってみた性格が難な私です。

ここ最近少し作ってみたいものがあって触っていました。
今回はセルの基本的な操作まで書いていきます。
何も知らずにとりあえず書いてみてハマったところを中心に書いていきます。
***

###最初の難関
初めてScriptエディタを開くと以下のような記述があって震えます。

```
function myfunction(){
}
```

###...だからなんだよ（ーー；

細かいところは抜きにしてとりあえずいじってみたい、最初で挫折しない！
を目標にざっくばらんに書くとGASは文字通りクスリプト言語なので

###単純にやりたいことを記述していく

ってことで自分のナニカを楽にする程度ならできるなと思います。
A＋B=Cじゃないっすけど、やりたいことを関数に書いてその関数を実行すれば動きます。
その辺を念頭に置いて始めていきます。
***

###スプレッドシートと作業シートの取得
魔法の言葉みたいなものです。
これを書いてどこで作業しているか書いてあげないとセルをいじったりができません。

・アクティブなシートを操作するとき
・明示的にどのシートを操作するかしていするとき

この２パターンについてまずは書いていきます。

####アクティブシートの選択
とりあえず検索するといつも出てきます。
Excelマクロとか書いていてもなんか似たようなもんやってますね。


```
function myfunction(){
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = Spreadsheet.getActiveSheet();
}
```


こんな感じです。補足します
GASはJavaSprict形式のようです。
私はJS経験皆無です。
GAS書くときはとりあえずRubyとかみたいに変数型は意識しなくていいようです。var型にintだろうがStringだろうが打ち込んで動かすことができます。
とりあえず、変数使いたいときは

####var　変数　＝　値；
で動くことを覚えておけば変数が使えます。
これで変数使えますね（＾＾


####シートの選択

```
function myfunction(n){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[n];
  return sheet;
}
```
引数でシートの要素番号を入力するとそれを返します。

###セルの利用-Range-
***
スプレッドシートで何かするならまずできると嬉しいのが以下のこと
・セルの値を参照する
・セルに値を代入する
・セルに関数をセットする

最低限普通の動作を行う際使いそうですよね。
それでは順に見ていきたいと思います

***
#####その前に関数の利用に関して
さて、上記の項目をどうにかしていく方法を見ていきます。その前に、関数の中で関数を呼び出す方法とその戻り値についてせつめいします。

・関数の中で定義した関数を使用する方法

```
function myfunc1(int){
  var a = 5 * int;
  return a
}

function myfunction(){
  var x = myfunc1(10);
}
```

こんな感じです。
これ、わりと色んなものを見ても基礎すぎて流されてるんですよね。
でもここがわからないのが自分でした。

関数の利用は関数の中で定義した関数を呼び出せば使用できます。
myfunc1(int);
これで使えます。
intは引数なので例に書いたようにここには実際の値や変数を渡します。
関数の戻り値はそのまま変数に格納することもできます。
それが２つ目の例です。
このようにして処理を分けて記述することができます。
微妙に使いたいことがあったのですがわからなくて詰まった点でした。
***


さて、セルの操作についての説明に戻ります。
セル操作は
#####シートのオブジェクト.getRange(場所);
で得ることができます。
このシートのオブジェクトはさっきのシートを取得した式でもそれを格納した変数でもどちらでも構いません。




###セルの参照

```
function myfunction(){
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = Spreadsheet.getActiveSheet();
  var cell =　sheet.getRange(x,y);
}

```
getRange();を使います
これで取得したセルの値を変数に格納することができました！
RangeはExcelとかと同じですね。範囲で取得することができます。

###セルに値をセットする
```
function myfunction(){
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = Spreadsheet.getActiveSheet();
  var cell =　sheet.getRange(x,y);
  sheet.getRange(x,y);.setValue("hoge");
}

```
入力したいセルを指定してsetValue();を使用します。
参照と代入ができました。

###関数の挿入
値の挿入を利用すると関数を挿入できません。
関数の挿入は以下のように行います。

```
function myfunction(){
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = Spreadsheet.getActiveSheet();
  var cell =　sheet.getRange(x,y);
  sheet.getRange(x,y).setFormula('=TODAY()');
}
```
関数の挿入ができました。
関数の引数はもちろん指定できます

```
sheet.getRange(x,y).setFormula("=SUM(A10:A20)");
```

みたいに書きます。
関数の引数に変数を渡すこともできます。

```
.setFormula('=SUM(' + m + ')');
```

このmは変数で範囲を代入してあるとします。
ポイントは変数両隣の+です。
これないと展開できずにそのままmになってしまいます・・・

```
.setFormula('=SPLIT('+"A" + last +',"_")');
```

lastにはA列の最終行の行番号が入っているとします。
こうすると、A列の最終行セルに入っている文字列を_で分割しろといったことが可能になります。
＋や’’を使ったりするのが大事なようです。

絶賛ちょこちょこ作っているのでまた書きたいと思います。
ビルドに利用するxcodeのバージョンを切り替える

jenkinsなどのビルド用サーバーを用意して、xcodeによるビルドを行う場合、時には利用をするxcodeのバージョンを明示的に指定する必要があります。

jenkinsの場合,xcode-pluginとかを利用することでなんとかできる気もしますが、xcode-pluginは設定項目の数が多くむしろ煩雑になる感じがしているので、シェルスクリプトで最低限管理をしています。

その状況下で、xcodeのバージョンを指定する方法ですが、`xcode-select`コマンドを利用することも考えられますが実はデメリットや留意事項として

 - xcode-select でxcodeのバージョンを切り替えるにはsudoが必要
 - システム全体に影響を及ぼすので、複数のジョブを走らせている場合、他のジョブに影響が出る可能性がある。

というわけでどうすればいいのかを調べていたら、[xcode-select(1)](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcode-select.1.html)に`DEVELOPER_DIR`環境変数を指定しろって書いてありました。

という訳で、次のディレクトリ構造を作りました。


```
├── MyApplicationProject
│   ├── src
│   ├── MyApplicationProject.xcodeproj
│   ├── MyApplicationProject.xcworkspace
│   ├── tests
│   ├── Library
│   ├── Podfile
│   ├── Podfile.lock
│   └── Pods
├── README.md
└── XCVERSION
```

`XCVERSION`には利用をするxcodeのバージョンを記入しておきます。そして、ビルドのスクリプトで

	export DEVELOPER_DIR=/Applications/Xcode$(cat ${WORKSPACE}/XCVERSION).app/Contents/Developer

としてあげることで、ビルド時に利用をするxcodeのバージョンを切り替えることができました。

## まとめ

xcodeのバージョンを切り替えるときは、環境変数`DEVELOPER_ENV`の変更を検討する。
EC-CUBE3のTwigのタグ覚え書き（一部EC-CUBE2系のSmarty比較）

## foreach文

+ Smarty 

```
# Valueのみ
<!--{foreach item=item from=$contact}-->
    <!--{$item}-->
<!--{/foreach}-->

# Key,Value
<!--{foreach key=key item=item from=$contact}-->
    <!--{$key}-->:<!--{$item}--><br />
<!--{/foreach}-->
```

+ Twig

```
# Valueのみ
{% for item in contact %}
  {{ item }}
{% endfor %}

# Key,Value
{% for key, item in contact %}
   {{ key }}: {{ item }}
{% endfor %}
```


## 生成されるHTMLの空白除去

+ Smarty  

```
<!--{strip}-->
hogehoge
<!--{/strip}-->
```
+ Twig  

```
間に記載された空白を削除
{% spaceless %}
hogehoge
{% endspaceless %}

左側の空白を削除
{%- hoge %}

右側の空白を削除
{% hoge -%}

左右の空白を削除
{%- hoge -%}
```

## コメント

+ Smarty 

```
<!--{* コメントアウトされる *}-->
```

+ Twig  

```
{# コメントアウトされる #}
```


## If文

+ Smarty   

```
<!--{if hoge }-->
fuga
<!--{else}-->
piyo
<!--{/if}-->
```

```
<!--{if !hoge }-->
fuga
<!--{else}-->
piyo
<!--{/if}-->
```


+ Twig   

```
{% if hoge %}
fuga
{% else %}
piyo
{% endif %}
```

```
{% if not hoge %}
fuga
{% else %}
piyo
{% endif %}
```

## 変数をdump

+ Smarty

```
<!--{$array|@var_dump}-->
```

+ Twig

```
{{dump(hoge)}}
```




## Twig独特の表現

### テンプレートの再利用や拡張

他のテンプレートを読み込んだり、テンプレートの一部（block）を再利用したり拡張したりできる

+ 他のテンプレートの読み込み（includeやrequire的な感じ）  

```
{% extends 'hoge.twig' %}
```

+ ブロックの作成 

````
{% block hoge %}
hogehoge fugafuga
{% endblock hoge %}
````

+ ブロックの再利用

````
# hogehoge fugafuga が出力される
{{ block('hoge') }}
```

+ ブロックの拡張  
hoge blockが書かれた、hoge.twigをextendsしたテンプレートで、hoge blockを拡張する 

```
# hoge.twigを読み込み
{% extends 'hoge.twig' %}

# hoge blockを拡張する
{% block hoge %}
fugafuga hogehoge piyopiyo
{% endblock hoge %}

# 拡張されたhoge blockを出力 fugafuga hogehoge piyopiyo が出力される
{{ block('hoge') }}
```

親の出力を利用する事もできる。

```
# hoge.twigを読み込み
{% extends 'hoge.twig' %}

# hoge blockを拡張する
{% block hoge %}
{{ parent() }} piyopiyo
{% endblock hoge %}

#  拡張されたhoge blockを出力 fugafuga hogehoge piyopiyo が出力される
{{ block('hoge') }}
```

特定の条件は別な物をだすblockに作りなおしたい時など、もともとのファイルを修正するのではなく、block内で、if分岐を追加するなどで対応ができるので、便利。


###  確認画面用の表示

form_widget では、入力フォームを作るだけでなく、form bilderでfreezeを与えて（全てHiddenになる）、確認画面等で表示するようの記述がかける。    
以下の例だと、通常はテキストボックス、freezeが与えられると、{% if freeze %} 部分が出力され入力されたテキストが出力される

```
{% block name_widget %}
    {% if freeze %}
        {# freezeなら単なるテキスト出力 #}
        {{ form_widget(name) }}
     {% else %}
        {# 普段はテキストボックスが表示される #}
        {{ form_label(name) }}&nbsp;{{ form_widget(name, {'attr': {'class': 'box120', 'style': 'ime-mode: active;'}}) -}}
     {%- endif -%}
{% endblock name_widget %}
```
iptablesでForword（転送）設定する

iptablesでForword（転送）設定する場合の設定忘備録

参考サイト：http://mokky14.hatenablog.com/entry/2013/12/04/143415


[root@kvm-elfinder ~]# cat /etc/sysconfig/iptables
> この設定に該当すると、宛先を「10.10.10.30:123」へ変更する

-A PREROUTING -s 10.10.10.10/32 -i eth1 -p udp -m udp --dport 123 -j DNAT --to-destination 10.10.10.30:123 
> この設定に該当すると、ソースを「10.10.10.20」へ変更する

-A POSTROUTING -s 10.10.10.10/32 -o eth1 -p udp -m udp --dport 123 -j SNAT --to-source 10.10.10.20

COMMIT


>この設定に該当すると、FORWARD する

-A FORWARD -s 10.10.10.10/32 -i eth1 -p udp -m udp --dport 123 -j ACCEPT                                                                                           
COMMIT
macで `tree`　ツールをインストール

```shell-session
brew install tree
sudo port install tree
fink install tree
```

インストール終わったら、Directoryに`tree`実行する

```shell-session
$ tree .
```

```shell-session
.
├── Dockerfile
├── README.md
├── asset_handler.go
├── default.etcd
│   └── member
│       ├── snap
│       │   ├── 0000000000000002-0000000000004e22.snap
│       │   ├── 0000000000000002-0000000000007533.snap
│       │   ├── 0000000000000002-0000000000009c44.snap
│       │   ├── 0000000000000002-000000000000c355.snap
│       │   └── 0000000000000002-000000000000ea66.snap
│       └── wal
│           ├── 0000000000000002-0000000000004e23.wal
│           ├── 0000000000000003-0000000000007534.wal
│           ├── 0000000000000004-0000000000009c45.wal
│           ├── 0000000000000005-000000000000c356.wal
│           └── 0000000000000006-000000000000ea67.wal
├── main.go
├── modules
│   ├── config
│   │   └── etcd_conf.go
│   ├── database
│   │   ├── aerospikedb.go
│   │   ├── mongodb.go
```
MySQLのスロークエリログの時間制御が効かない時はlog-queries-not-using-indexesを確認

MySQLのスロークエリログで明らかに
long_query_timeで設定した時間よりも短い結果で返ってくるクエリが保存されていた

原因はlog_queries_not_using_indexesがONになっていた。
これがONになっているとインデックスを使っていないクエリが保存される

従って、下記設定でlog_queries_not_using_indexesをOFFにする。
mysql>set global log_queries_not_using_indexes=0;

これで、long_query_timeでスロークエリを制御できる
Windwosの環境設定覚書

複数台のWindowsPCを使用しているので環境を合わせる為の覚書

- Chrome
- Chrome Canary
- 7-Zip
- PowerShell
- ConEmu
- SublimeText3
- SnapCrab
- KeySqap for XP
- Rapid Environment Editor
- Chocolatey
- MultiWall
- Fiddler
- FreeMind
- doPeek
- MacType
- WinMerge
- Folderico
- マッハCopy
docker push時に"already in progress"

# 状況
docker push時に毎回以下エラーが発生する。
本当に実行中ってこともあると思いますが。

```bash
$ docker push repository_name
FATA[0000] Error: push repository_name is already in progress
```
# 原因
docker push時にCtrl+cで処理を中断した場合(SIGINTが送信送信された場合)に発生する不具合らしい。
issueにも上がっていて、次のリリースで直るらしいです。
[docker push always fails with "push my-repo/my-app is already in progress" #5113](https://github.com/docker/docker/issues/5113)

# 対応方法(Workaround)
Dockerデーモンの再起動！！
restartでも良いと思いますが失敗してしまったので

```bash
sudo /etc/init.d/docker stop
sudo /etc/init.d/docker start
```
PHPで自動ダウンロード

コメント貰ったので追記してみる。

1.沢山あるファイルから検索条件を指定してファイルを選択するスクリプトにWEBアプリから検索条件を引数として渡して実行させる
2.選択したファイルをZIP圧縮して自動的にダウンロードさせる

この2番めが今回の目的

***
1.検索してまとめるプログラムはUserAでスクリプトを書いた。
WEBのFormで検索条件を入力させてFormのActionタグで検索スクリプトを実行したいが、その場合はユーザーがApacheだったりするので、PHPのsystemコマンドにユーザーやパスを指定してコマンドを渡してみる

```
system("su -u UserA -s スクリプト.sh"); > 検索スクリプトを実行
wait,終了を戻り値で確認してから
system("su -u UserA -s zip -r 出来上がりファイル名".".zip"); > ZIPへ圧縮
```
2.PHPでZIPファイルを作ったら自動ダウンロードさせる。
ZIPファイルの名前とContent_lengthを入れ込んだヘッダを作る。
application/octet-streamをヘッダに書くとIE,Firefox,Chromeではリンクのクリックなどが必要無く自動的にダウンロードされる。

```
header("Content-Type: application/octet-stream");
header("Content-Length: ".$content_length);
header("Content-Disposition: inline; filename=\"".$filename."\"");
```


バッファにゴミが溜まることがあるのでヘッダーの最後に
`ob_end_clean();`
を追記する。
PHPでMatlabを呼び出す

概要
-
HTMLフォームで入力した値を引数としてMatlabスクリプトに渡して実行する
MatlabはUserAでインストールされているので、WEBフォームからだとユーザーが違っているのでちょっとだけ手を入れないと動かない。

前提条件
-
OS:CentOS6
Matlab:R2014b
Apache2

やったこと
-
apacheがuserAにsudoできるようにしてやる。
なんでも良いのでapacheのパスワードを作成する
`$ passwd apache`

visudoでsudoできる権限を与える
`$ visudo`

最終行に以下を追加
`apache ALL=(userA) NOPASSWD: ALL`

以下の行はコメントにする
`#Defaults requiretty`

exec()関数にsudoのオプションと実行コマンドはフルパスで指定。
Matlab自作プログラムの引数を囲む（）はエスケープが必要。

```lang:PHPファイル(一部)
$cmd = "sudo -u userA -s /usr/local/matlab/bin/matlab myProgram\($input1,$input2\)";
exec($cmd);
```

MatlabにかぎらずcpコマンドなどもuserAでやっていたなら同様に
`sudo -u userA -s`
をexec()の引数の先頭に付けておけば良い。
Java EE仕様まとめ

Java EEのバージョンと仕様に含まれる機能の備忘録。
間違ってるかもしれません。

|Java EE     |Servlet      |JSP           |EJB           |JSF           |CDI           |JPA           |JAX-RS        |MVC           |
|:-----------|:------------|:-------------|:-------------|:-------------|:-------------|:-------------|:-------------|:-------------|
| J2EE 1.2   | 2.2         | 1.1          | 1.1          | ―            | ―            | ―            | ―            | ―            |
| J2EE 1.3   | 2.3         | 1.2          | 2.0          | ―            | ―            | ―            | ―            | ―            |
| J2EE 1.4   | 2.4         | 2.0          | 2.1          | ―            | ―            | ―            | ―            | ―            |
| Java EE 5  | 2.5         | 2.1          | 3.0          | 1.2          | ―            | 1.0          | ―            | ―            |
| Java EE 6  | 3.0         | 2.2          | 3.1          | 2.0          | 1.0          | 2.0          | 1.1          | ―            |
| Java EE 7  | 3.1         | 2.3          | 3.2          | 2.2          | 1.1          | 2.1          | 2.0          | ―            |
| Java EE 8  | 4.0         | ...          | ...          | 2.3          | 2.0          | ...          | 2.1          | 1.0          |

Java EE 6/7あたりでサードパーティー機能を積極的に取り込んだ結果、EE標準で作ろう！的な
感じになってきてる。
Java EE 8でもHTTP2.0、HTML5、JSONとかトレンド的なものがちゃんと強化されるみたい。
MVCはアクションベースみたいだけど、どうなんだろ。
[Action Base MVC : JSR-371](https://jcp.org/en/jsr/detail?id=371)
EE標準に戻る流れって、Struts／SpringからJSFみたいに、アクションベースからコンポーネントベースに
なってきてると思ってたのだけど。。
ただFaceletとかCDIみたいなコンポーネントをゆるくつなぐ感じなのかもしれないけど、
特に日本ではStrutsとかからJSFの乗り換えがEE移行のネックだし、その辺の受け皿の役割なのかな。
（そもそもJSフレームワークとかでSPAにするのが良いケースもあるでしょうが・・・）
swift optional型　調べてみた


optional型はnilが入ることができる
optional型の初期値はnil
optional型は非optional型とは同じようには扱えない(IntとInt?は全くの別物)


##ラップ、アンラップの４つの方法
###１（ラップ）　!をつける(nilが入るとエラー)
###２（ラップ）　?をつける（nilが入っていると、nilが返ってくる）

```
class Dog {
    func bark() -> String {
        return "Wan!"
    }
}

var d: Dog? = Dog() // Optional型

// 変数dのうしろに、「?」を付けるとアンラップされる（Optional Chaining）
println(d?.bark()) // -> Wan!

// 変数dにnilが入っていた場合、アンラップ時にnilが返ってくる
d = nil
println(d?.bark()) // -> nil
```


###3　ifやwhileの条件式で宣言され、optional型の変数を代入された時は非optional型になる

```
class Dog{
	func bark() ->{
		return "wan"
	}
}

var wrappedDog: Dog? = Dog()  //optional型

//非optional型になる
if var unwrapped = wrappedDog {
	println(unwrapped.bark())
}
```

ただし。if文内のみで有効

###４（アンラップ）　暗黙的アンラップ(Implicity unwrapped Optional)
?ではなく!を使ってラップする
アンラップ操作は不要（暗黙的にアンラップされる）
ShinobiLayer: Local Load Balancer使用時にクライアントの送信元IPを取得する方法(HTTP編)

#はじめに

SoftLayerのLocal Load Balancer経由でWebサーバーに接続した際には、Webサーバーによってはデフォルトの構成ではクライアント側のIPアドレスがログに出力されません。
これは、Local Load Balancerをパケットが経由する際にNATされて、パケットの送信元IPがクライアント側のIPからLocal Load BalancerのIPに変更されてしまうからです。

![LLB2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c26be53c-24ed-4f58-9ba6-8ad4ec54cad2.jpeg)


```text:HTTPサーバーにLocalLoadBalancerを経由せずに直接アクセスした際のアクセスログ。203.xxx.xxx.xxxはクライアントのIPアドレス
203.xxx.xxx.xxx - - [17/Apr/2015:09:30:15 +0900] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"
```

```text:LocalLoadBalancer経由でアクセスした際のアクセスログ。174.xxx.xxx.xxxはLocalLoadBalancerに割り当てられたIPアドレス（NATされている）
174.xxx.xxx.xxx - - [17/Apr/2015:09:31:37 +0900] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"
```

#webサーバーにおけるアクセスログの設定
このままだと、webサーバーから見た接続元IPはLocal Load Balancerになってしまいますが、Local Load Balancerは、NAT時に**X-Forwarded-For**というHTTPヘッダ情報に送信元IPを埋め込んでくれています。なので、HTTPサーバーのアクセスログでは、この情報を出力するように設定すれば良いでしょう。

以下は、Apacheのhttpd.confでの設定例です。LogFormatにて、`%{X-Forwarded-For}i %h`の順に並べたので、`LocalLoadBalancerへの接続元IP LocalLoadBalancerのNAT元のIP`の順で出力されることが分かります。
※行末の%Dは応答時間（単位はマイクロ秒）が見たかったのでおまけで付けています。その他の設定の意味は、http://httpd.apache.org/docs/current/ja/mod/mod_log_config.html を参考。

```text:Apacheのhttpd.conf設定
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
（途中略）
CustomLog logs/access_log combined
```

```text:変更後のアクセスログ。
203.xxx.xxx.xxx 174.xxx.xxx.xxx - - [17/Apr/2015:09:43:20 +0900] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0" 495
```

#接続元IP毎のアクセス制御
同様に、webサーバーから見た接続元IPはLocal Load Balancerになってしまいますので、source IPを使ったFirewall保護にあまり意味をもたなくなります。よって、webサーバーの設定でX-Forwarded-Forを使ったアクセス制限をかければよいでしょう。

```text:設定例
<VirtualHost *:80>
    SetEnvIf X-Forwarded-For "10.[1-3][0-9]" allow_ip
    #直接アクセスも、Load Balancer経由でのアクセスも禁止
    SetEnvIf Remote_Addr     "192.[1-3][0-9]" deny_ip
    SetEnvIf X-Forwarded-For "192.[1-3][0-9]" deny_ip

    <Location />
        Order Deny,Allow
        Deny from all
        Allow from env=allow_ip
    </Location>

    <Location /*/test1/>
        Order allow,deny
        Allow from all
        Deny from env=deny_ip
    </Location>

</VirtualHost>
```

#その他
OS Firewall（iptables）や、WAF（ApacheならModSecurity？NginxならNaxsi？）と組み合わせると、さらにしっかりとした保護ができると思います。
mod_security: http://www.ipa.go.jp/security/vuln/waf.html
Vue.jsの$elに指定するDOMのルール、Componentの使いドコロ

# 概要

`Vueコンストラクタに指定するelオプション` にいろいろ指定していて気づいたことのメモ。

# 環境
Rails+Webpack+Gulp+Vue+Coffeescript



# メモ

## 基本

`elオプション` には、id、もしくはひとつしかないclassを指定しないといけない。

```coffeescript
# good
id = new Vue(
  el: '#id'
  data: {
    text: 'はろう'
  }
)

# good
button_send = new Vue(
  el: '.button--send' # ひとつしか存在しないクラス
  data: {
    text: 'はろう'
  }
)

# bad（というか動かない）
button = new Vue(
  el: '.button' # 複数存在するクラス
  data: {
    text: 'はろう'
  }
)
```

## Componentを使いまわす

では、複数要素に使いまわすにはどうするか。
→同じviewmodel内でのcomponentの使い回しは可能。

```coffeescript
id = new Vue(
  el: '#id'
  data: {
    text: 'はろう'
  }
  components: {
    'my-component': {
      template: '<span>{{text}}</span>'
    }
  }
)
```

DOMはこちら。

```html
<div id="id">
  <div v-component="my-component" v-with="text: text"></div>
  <div v-component="my-component" v-with="text: text"></div>
  <div v-component="my-component" v-with="text: text"></div>
</div>
```

## Componentを別ファイルにする

componentを別ファイルに分けて、Webpackでrequireすればcomponentは1ファイルで使いまわせる。


```coffeescript
id = new Vue(
  el: '#id'
  data: {
    text: 'はろう'
  }
  components: {
    'my-component': require('my-component')
  }
)

some_id = new Vue(
  el: '#some_id'
  data: {
    text: 'こんにちは'
  }
  components: {
    'my-component': require('my-component')
  }
)
```

```coffeescript:my-component.coffee
# このファイルを使い回せばOK
module.exports = {
  template: '<span>{{text}}</span>'
}
```

# 参考
* <a href="http://vuejs.org/api/" target="_blank">The Vue Constructor - vue.js</a>
Aurelia翻訳ログ (docs.html 4/13 line: 243 to 1060)


引き続き翻訳しています。この間にも、3個くらいのpull requestがマージされており、コンフリクトしないかドキドキです。

### テンプレートコントローラー

`if` や `repeat` などを従来はテンプレートコントローラーと呼んでいたのですが、カスタム属性と呼ぶことにしたようです。（挙動は代わりません）

これはわかりやすさの観点で良い変更です。どちらもHTMLエレメントの属性として使うので、名前から使い方が想起できるようになったと思います。

ただ内部的な挙動は変わっておらず、そのため、ifやrepeatっぽいものを自分で作るときには、テンプレートコントローラーという概念が出てきます。うーん、このあたりは進化するにつれて整理されていくでしょう。

### wan't 

811行目。これをwon't のtypoだと思って翻訳していましたが、wantのtypoでした。。。逆ですね。

### カスタム属性の定義方法

デコレータの導入により、カスタム属性(旧 Attached Behavior)の定義方法が変わっています。

以前はstaticメソッドやプロパティで `Behavior` オブジェクトを返す必要がありましたが、デコレータでスッキリ書けるようになっています。

```javascript
import {inject, customAttribute} from 'aurelia-framework';

@customAttribute('show')
@inject(Element)
export class Show {
  constructor(element) {
    this.element = element;
  }

  valueChanged(newValue){
    if (newValue) {
      this.element.classList.remove('aurelia-hide');
    } else {
      this.element.classList.add('aurelia-hide');
    }
  }
}
```

### オプションプロパティ

上記だと単一の属性しか指定できませんが、複数指定するオプションプロパティというものがあります。以前はこれもメタデータ + fluentAPIで一個づつ設定していましたが、デコレータを使って簡潔にかけるようになっています。

```javascript
import {customAttribute, bindable} from 'aurelia-framework';

@customAttribute('my-attribute')
export class MyAttribite {
  @bindable foo;
  @bindable bar;
}
```

また、これをいちいち宣言しなくても、実行時にマップしてくれる `@dynamicOptions` というデコレータも追加されました。
PHP7調査(19)date.timezoneの設定がなくても怒られなくなる

PHP7から、date.timezoneが設定されていなくてもwarningが出なくなりました。デフォルトのタイムゾーンは今まで通りUTCです。

# 背景

PHP 5.3.0以降、php.iniでdate.timezoneを設定せずに日付系の関数を呼び出すと下記のようなwarningが表示されていました。

```
Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Command line code on line 1
```

しかし、PHPの実行バイナリ1個だけで動かしたいような状況もありうるので、設定ファイル無しでも正しく動作すべきだ、という提案が無事採用されたというわけです。

#参照

* [PHP RFC: Remove the date.timezone warning](https://wiki.php.net/rfc/date.timezone_warning_removal)
技術英語 > Off-by-one error / OBOE

Code CompleteかReadable Codeででていたと思う。

1つずれてしまって使っているエラー.

```sample.c
#include <stdio.h>
int idx;
double val[10] = { /* 適当な値 */ };

for(idx=1; idx<=10; idx++) {
    printf("val=%lf\n", val[idx]);
}
```

上記の例ではidxを0でなく1から始めてしまっている点がoff-by-one errorとなっている。
Linuxでアイコンを作成する方法

最近、私はWindowsもMacも飽きてしまったので、よく面白いことをしているFedoraをデスクトップPCに入れてみた。
そこで私がよく使う、AndroidStudioを入れたのだが、インストールと起動が糞だるい・・・。
[過去に私がUbuntuにいれて見た動画](https://www.youtube.com/watch?v=4fWZzhAT_OI)
(2015年8/8現在起動後unityランチャーのアイコンを右クリックで登録すると楽に出来ました。ubuntu 14.04)

これを見てもらうとわかるがいちいちターミナルから起動するのはだるいということで今回はデスクトップにアイコンを作るということでダルさから逃避する。。。
実際にはアプリケーションとしても登録されるので,デスクトップに必ずしも置く必要はないです。**アプリの一覧からも起動できるようになります！！**

#まず最初にどういう流れで進めていくか

|アイコン作成までの作業のながれ|
|:------------|
|**１.** アイコンを作成したいアプリの実行ファイルを見つける|
|**２.** デスクトップエントリーファイルをつくる|
|**３.**　そのデスクトップエントリーファイルをデスクトップにコピー（または移動）する。**デスクトップに置きたくなくてアプリケーションとしてアイコンを作りたいだけならここの処理はいらないです。** |
|**最後にAlt + F2**を押してrと入力して再読込みする。|

大体大きく分けて３段階ということで超楽に作れるのでご安心を！！



上手く設定が終えるとこのようになる

![andro.png](https://qiita-image-store.s3.amazonaws.com/0/33329/6ceb65c4-da77-d3ce-b8e2-08c9b0dbb670.png)

これでWindowsのようにダブルクリックでアプリが起動することができる。

ターミナルで以下のコマンドを実行して
cd ~/.local/share/applications/
 に移動する。
ls -a　ですべてのファイルを見てみるとepyfany-googleplus.desktopとかepyfany-facebook.desktopなど色々あった。

ここでアプリのアイコンを作りたい名前のエントリーをつくる。
vim　firefox.desktop とか
vimが入っていない時はemacsなどviに変えて打ってみるとよい。
vimなどの使い方はググってください。

そして以下のサンプルのように編集する。

```android.desktop
[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=AndroidStudio
Comment=AndroidStudio
Exec=/home/noriakioshita/android-studio/bin/studio.sh
Icon=/home/noriakioshita/android-studio/bin/AndroidStudio

Terminal=false
```
**これがAndroidStudioのデスクトップエントリーである。**

最後にAlt + F2**を押してrと入力して再読込みすると完了です！

たしか、Ubuntuだと起動した後にランチャーに保存みたいなこともできるが、画像だけは残るがクリックしても何も起こらない飾り物になるので注意が必要。

そして絶対パスで書くことが大事！！私のホームは私の名前のnoriakioshitaになっているがここは各自のユーザ名にすること
~/android-studioみたいに書いてみたけど上手く行かなかったので上のように書くと上手く行くと思う。

#細かい説明としては
Typeはアプリケーションとする
EncodingはUTF-8として、
NameはAndroidStudioとしている。ここは任意であって基本は自由。
Commentは~~良くわからないｗｗｗ(まあコメントなんじゃないのかなそのまま)~~
Commentはツールチップ（アイコンの上にカーソルを当てた時に表示されるもの）に表示する文章を書くみたいです。（04/17追記）
Execアプリを起動するための処理。ここではシェルがしていされている
Iconはアプリケーションの画像の選択。.pngとか.ico,.svg（ベクター画像）まで指定できるようなので色々試してみてください！！


##**以上です！Linuxをエンジョイして楽しくハックしちゃいましょう！！**
sbt プロジェクトのレイヤー分けサンプル

https://bitbucket.org/kokodayo/com.kokodayo.scala.sample.base.layer

なんとなく、sbtでのレイヤー分けと軽く役割を書いてみた。。。

酔っぱらいのお遊び・・・

各レイヤー毎の責務は、クラスの中で説明してます。

playなどを使う場合は、applicationにplayにすればいいです。
プロジェクトルートは、別にbuild.sbt入れなくてOK

* application
* domain
* infra

各単体でコンパイル可能。
別moduleかしてurlなどでgit指定してもOK

汎用性があるサンプルになるかと。

ProjectRefってのがplayの公式などに乗ってる書き方にはなかったが
build.sbtの記述量を劇的に減らせる気がします。（目的が違うからかもだけど）
ただProjectRefの日本語記事が少なくてどういう目的で使うのか
よくわかっていないです。知ってたら教えて欲しい。

sbtの公式サイトなどを見る限り
サブプロジェクトの設定などがあるが、あれはプロジェクトを分割するのには
いいと思うがmoduleとしてのライブラリを分けるのとは違う気がした。

ライブラリは単体でも生成できるのが理想と思ったので。

自社のプロジェクトでは、
applicationではapi用 frontサイト用と２つ作り
projectルート自体にもplayを入れてルーティングしてます。
ActiveAdminでfriendly_idを適用したモデルを扱う



friendly_idはURLを人や検索エンジンから見てわかりやすくしてくれるgemです。

ActiveAdminはリソース毎の管理画面を簡単に作れるgemで、RESTなURLは用意されています。その半面、ActiveAdminのルールに沿わない場合は少しカスタマイズが必要です。


### やりたいこと

* リソースArticleに対して、基本的な一覧/詳細/登録/編集/削除を行う管理画面を作成する。
* ユーザが利用する画面では、ArticleのURLをslugで表したいので、friendly_idを使う。 


### 問題
friendly_idを利用したモデルの詳細ページは以下のようにslugでアクセスすることができます。

```
http://localhost:3000/articles/todays-daiary
```

ActiveAdminの管理画面でリンクをたどって、Articleの詳細ページに遷移しようとすると、以下のようなURLになります。

```bash:url
http://localhost:3000/admin/articles/todays-daiary
```
しかし、ActiveAdminは自動で/admin/articles/:idというURLでアクセスされることを期待しているので、以下のようなエラーが表示されます。

```
Couldn't find Article with 'id'=todays-daiary
```



### 解決方法
ActiveAdminのリソースのfinderを以下のように、friendly_idのfinderを通すように設定することで、slugのURLでリソースにアクセスできるようになります。

```ruby:admin/article.rb
ActiveAdmin.register Article do
  controller do
    def find_resource
      scoped_collection.friendly.find(params[:id])
    end
  end
end
```


### 参考
[Active Admin | Customizing resource retrieval](http://activeadmin.info/docs/2-resource-customization.html#customizing-resource-retrieval)

[norman/friendly_id](https://github.com/norman/friendly_id)
aws-sdk-goで指定したProfileのCredentialを利用しアクセスを行う


aws-sdk-go 正式版は Coming Soonです。

※ aws-sdkの開発が進み、当初記載していた方法ではアクセスできなくなってしまったので、新しい方法に更新しました。

## 前提条件

**~/.aws/credentials**
にProfileに紐づくID,Secret情報が設定されているとします。
(credentialファイル指定はメソッドの引数で行えますが、ここではデフォルト設定の上記ファイルとします)

```~/.aws/credentials
[test]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYY
```

## 方法

`NewSharedCredentials` を利用します。

[aws-sdk-goのNewSharedCredentialsメソッド(GoDoc)](http://godoc.org/github.com/awslabs/aws-sdk-go/aws/credentials#NewSharedCredentials)

```go
cred, _ := credentials.NewSharedCredentials("", profile_name)
svc := ec2.New(&aws.Config{Credentials: cred, Region: "ap-northeast-1"})
```

## サンプルコード

上記を用いて利用するProfile指定し、
任意のNameタグでフィルターしたDescriveInstancesのうち、Nameタグ、InstanceID、 Status を返すスクリプトを作ってみました。
以下のような感じです。(※エラー処理はしてません。。)

:octocat:[gist](https://gist.github.com/simeji/945165da059d2f4ef4bf#file-descrive_ec2_instances-go)

```descrive_ec2_instances.go

package main
 
import (
	"fmt"
	"github.com/awslabs/aws-sdk-go/aws"
	"github.com/awslabs/aws-sdk-go/aws/credentials"
	"github.com/awslabs/aws-sdk-go/service/ec2"
)
 
func main() {
	profile := "test" // your profile name
	name := "*test*"     // search string (NameTag)
 
	svc := ec2.New(&aws.Config{
		Credentials: credentials.NewSharedCredentials("", profile),
		Region:      "ap-northeast-1",
	})
 
	params := &ec2.DescribeInstancesInput{
		Filters: []*ec2.Filter{
			&ec2.Filter{
				Name: aws.String("tag:Name"),
				Values: []*string{
					aws.String(name),
				},
			},
		},
	}
 
	res, _ := svc.DescribeInstances(params)
 
	for _, i := range res.Reservations[0].Instances {
		var nt string
		for _, t := range i.Tags {
			if *t.Key == "Name" {
				nt = *t.Value
				break
			}
		}
		fmt.Println(nt, *i.InstanceID, *i.State.Name)
	}
}
```

実行するとちゃんと指定したProfileのCredentialで動いています。

aws-sdk-go 待ち遠しいですね！
VimでVueifyをシンタックスハイライトしたかった

Vue.jsが流行っているらしいから入れた。

```
# npm install --save vue
```

Browserifyで使うならvueifyという便利なものがあると聞いて入れた。

> vueifyでcomponent化
> http://blog.koba04.com/post/2014/10/07/component-by-vueify/

![vue1.png](https://qiita-image-store.s3.amazonaws.com/0/33480/df182e48-ac5f-a809-08ab-a98b5c48ed79.png)

Vimとかの場合は・・・  
### __Vimとかの場合は・・・__

# __Vimとかの場合は・・・！？__

__ワイ「そういやVueifyてHTML+jsだしJSXに似とるな？」__

```vim:.vimrc
NeoBundle "pangloss/vim-javascript"
NeoBundle "mxw/vim-jsx"
```
NeoBundleでjsxハイライトを入れるやで~

```vim:.vim/bundle/vim-jsx/after/ftdetect/javascript.vim
autocmd BufNewFile,BufRead *.jsx,*.vue let b:jsx_ext_found = 1
autocmd BufNewFile,BufRead *.jsx,*.vue set filetype=javascript.jsx
autocmd BufNewFile,BufRead *.js
  \ if <SID>EnableJSX() | set filetype=javascript.jsx | endif
```

定義ファイル開いて.vueを追加するやで~

![syntax.png](https://qiita-image-store.s3.amazonaws.com/0/33480/8ba76661-5572-5e5a-7a08-ff14b3644c87.png)

よし。

![syntax2.png](https://qiita-image-store.s3.amazonaws.com/0/33480/ff9720d2-5fc8-5662-349e-cef9bd79bdf9.png)

つらみが残った。
そして思い至った。

# HTMLでいいじゃん。
```vim:.vimrc
autocmd BufNewFile,BufRead *.{html,htm,vue*} set filetype=html
```

![syntax3.png](https://qiita-image-store.s3.amazonaws.com/0/33480/ae98dca0-30dd-4238-d2ff-5be9f2517b7b.png)

![syntax4.png](https://qiita-image-store.s3.amazonaws.com/0/33480/f03a6849-2f1d-691a-4721-dd5031b00987.png)

HTMLには最初からHTMLもcssもjsも含まれているのであった。
敗北を知りたい。
マシンSID重複の神話とSysprepの必要性

時折「マシンSIDが重複すると問題があるのですか？」「Sysprepは必要ないですよね？」という質問が再来する。ああ、また春なのか、という感じだ。つまり、新しくWindowsや仮想化（つまりマシンの複製をしやすいインフラ）に携わる人が来て、「[Windows: マシン SID の重複神話](https://technet.microsoft.com/ja-jp/windows/mark_12.aspx)」を発見したのか、と思うわけだ。

# 誤った三段論法

彼らの中にある三段論法はこうだ。

1. マシンSIDの重複が問題を引き起こすというのは誤った神話で、実際には問題はない（だってMSの運営するTechnetに掲載されたブログエントリに書いてある！）
2. SysprepはマシンSIDを変えるツールである。
3. したがってシステムの複製時にSysprepが必要であるというのも誤った神話である。

いい線をついていると思うけど、惜しい。「マシン SID の重複神話」では、2番目を否定している。ただ最後でとって付けたように、以下のようなわずかな否定の言を載せてるだけだから、読み落としたり、重要視できなかったりする。

> Sysprepは、ほかにもマシン固有の状態をリセットします。それが重複していると、Windows Server Update Services (WSUS) などの特定のアプリケーションに問題が発生する可能性があるためです。したがって、マイクロソフトのサポート方針として、今後も複製されたシステムはSysprepを使用して一意であることが要求されることに注意してください。

でも繰返すけど、たしかに否定している。

# 「マシン SID の重複神話」から導ける三段論法

「マシン SID の重複神話」から導ける正しい三段論法があるとすれば、こうじゃないだろうか。

1. 複製されたシステムが動作保障されるのは、Sysprepが実施されている場合に限られる。
2. Sysprepがかけられていれば、マシンSIDが変わっている。
3. マシンSIDの重複は、動作保障されないシステムがあることのしるしである。

マシンSIDの重複は異常ではなくて、異常を知らせる信号だ。マシンSIDが重複するから動作しないのではなくて、マシンSIDが重複するなら省いてはいけない手順をすっ飛ばした粗忽者がいるからチェックしろということだ。その手順というのが、Sysprepの実施だ。

# Sysprepの必要性の説明

これからの説明文としては、たとえばこんなところでどうだろう。

> 複製したシステム、または複製するためのシステムのマスターイメージには、Sysprepを実施する必要があります。Sysprepは様々なシステムプロパティの初期化を行って問題発生を抑制します。これを行っていることがマイクロソフト社の動作保障条件です。
>
> 詳細な初期化内容は開示されていませんが、一つだけ、マシンSIDが変更されることははっきりと明かされています。Sysprepを実施していない複製されたシステムがないか確かめるのに、マシンSIDの重複がないか確認することが役立ちます。

なんにしても、最終的にはSysprepは実施しなければいけない。うっかり逆から、マシンSIDの重複があると問題が起きるなんて説明から始めちゃうと、また春が来て君はきれいに「マシンSIDの神話」再発見の洗礼を受けることになっちゃう。

まずSysprepが必要なことから初めて、Sysprepの確認手段として始めてマシンSIDを持ち出そう。実際、「マシンSIDの神話」を読む限り、それぐらいしかマシンSIDの意味なんて思いつかないし。
Sidekiq で enqueue する queue を動的に指定する

sidekiq で enqueue する queue を指定するには、通常は

```rb
class HardWorker
  include Sidekiq::Worker
  sidekiq_options queue: :event

  def perform(params)
  end
end

HardWorker.perform_async(params)
```

のようにクラスを１つ定義して、`sidekiq_options` で指定する。

これを、sidekiq_options ではなく、enqueue (`perform_async`) 時に動的に指定するにはどうするか。

# やり方

`Sidekiq::Worker.perform_async` ではなく `Sidekiq::Client.enqueue_to` を使う。

```rb
Sidekiq::Client.enqueue_to(:my_queue, HardWorker, params)
```

どちらも最終的に行き着く所は同じ。

[lib/sidekiq/client.rb#L146-L151](https://github.com/mperham/sidekiq/blob/e89f5f741b8e5dadd070f8684d7e7a577eb90713/lib/sidekiq/client.rb#L146-L151) あたりに書いてある。

```ruby
      # Example usage:
      #   Sidekiq::Client.enqueue_to(:queue_name, MyWorker, 'foo', 1, :bat => 'bar')
      #
      def enqueue_to(queue, klass, *args)
        klass.client_push('queue' => queue, 'class' => klass, 'args' => args)
      end
```

dequeue する方は

```
bundle exec sidekiq -q my_queue
```

のように sidekiq を起動するコマンドオプションで指定する

## おわりに

いちいちクラス作らなくて良くなった。[priority queue](https://github.com/mperham/sidekiq/wiki/Advanced-Options) を使いたい時などに役立つ。
jQuery 便利なonを使おう（on click)

## 対象者
click()とon('click', function())の違いが分からない人。
click()しか使ったことのない人。
何も考えずにon('click', function())を使っている人。

## onの有用性
クリックイベントを書くとき

```js
$('p').click(function(){
     hogehoge;
});
```
のような記述が出来る。

はたまた、

```js
$('p').on('click',function(){
     hogehoge;
});
```
とも記述できる。

果たして、onは何が良いのか。
＊＊＊＊＊＊
onの有用性
1.追加要素へのイベント（さまざまなイベントへの汎用性）
2.複数のイベント
＊＊＊＊＊

※onはjQuery1.7以降

## 1.さまざまなイベントへの汎用性

onはbind、live、delegateを統合したものである。

## bind
ー基本的なイベントの設定

```js
$('p').bind('click',function(){
     hogehoge;
});
$('p').unbind('click');
```

★onで書くと…

```js
$('p').on('click',function(){
     hogehoge;
});
$('p').off('click');
```


## live
ー後から追加した要素にもイベントを実行させる（documentにイベント設定）

```js
$('p').live('click',function(){
     hogehoge;
});
$('p').die('click');
```

★onで書くと…

```js
$(document).on('click','p',function(){
     hogehoge;
});
$(document).off('click','p');
```

## delegate
ー後から追加した要素にもイベントを実行させる(親要素にイベント設定）

```js
$('p').delegate('a','click',function(){
     hogehoge;
});
$('p').undelegate('a','click');
```

★onで書くと…

```js
$('p').on('click','a',function(){
     hogehoge;
});
$('p').off('click','a');
```

### liveとdelegeteって何をしているの？
例えば、bindを使うときは、ページを表示時に既に存在する要素に対してイベントを設定する。そのため、後に追加した要素にはイベントが設定出来ない。
それを解決するのが、live、delegate。この２つは、イベントを指定したい要素に直接設定するのではなく、親要素を使って間接的にイベントを設定する。
例えば、下記のように```<a></a>```の要素を追加したとすると、
```<p></p>```
↓
```<p><a></a></p>```

```js
$('a').bind('click',function(){
     hogehoge;
});
```
とbindで記述してもクリックイベントは実行出来ない。ここで、

```js
$('p').delegate('a','click',function(){
     hogehoge;
});
```

と親要素のpにイベントを設定することで間接的にイベントを設定することが出来る。
つまり、pに「中身のaにはクリックイベントをつける」というイベントを設定しているわけ。

liveはdelegateの親要素をdocumentと設定しているだけ。
つまり

```js
$('a').live('click',function(){ …
```
と

```js
$(document).delegate('click',function(){ …
```

は一緒。


###liveとdelegateって何が違うの？
delegateの中にliveが含まれると考えればオーケー。
liveは後で追加した要素にイベントを付与するとき手軽に(bind と同じ間隔で)イベントを実行出来る。
では、なんでdelegateがあるのかというと、実行速度が速いのです。
liveは内部でdelegateを実行しているわけで、一手多いのです。

### 参考 
実行順　bind→delegate→live
実行速度　delegate→live→bind　(意識するほどの差はない）

※live、dieはjQuery1.9で廃止

# 2.複数のイベント
onで複数のイベントを設定する

・同じ処理をする

```js
$('.foo').on('click blur', function(){...});
```

ースペース区切りでオーケー。

・別々の処理をする複数イベント

```js
$('.foo').on({
'mouseenter': function(){...},
'mouseleave': function(){...}
});
```

・イベントデリゲートで複数イベントを設定する

```js
$('.parent').on({
'mouseenter': function(){...},
'mouseleave': function(){...}
}, '.foo');
```

# 結論
結論、onはbind、live、delegateのいいとこ取りです、onを使いましょう。

参考URL
[jQuery の on() と off() を理解する](http://tacamy.hatenablog.com/entry/2013/03/03/213113)
[bindとlive, delegateの違い。そしてon。](http://www.tabayashi.com/dev/null/1497)
[clickとbindとliveとdelegateとonの違い](http://qiita.com/smzk/items/5eed5a90c4b32ca8b23a)
Vagrant上のCentOS6.5にNode.jsの開発環境を整える


[Vagrant上のCentOSにNode.jsをインストール](http://qiita.com/rana_kualu/items/d39fa29746ea1702a13b
)
を参考に、自分用の開発環境を作る。その時に詰まったところなどのメモ。


※Vagrant+VirtualBoxは導入済みとします。

```
vagrant up
vagrant ssh
[vagrant@vagrant-centos65 ~]$ pwd
/home/vagrant
[vagrant@vagrant-centos65 ~]$ uname -a
Linux vagrant-centos65.vagrantup.com 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[vagrant@vagrant-centos65 ~]$ cat /etc/redhat-release 
CentOS release 6.5 (Final)
```



##nodebrew のインストール
[nodebrew](https://github.com/hokaccha/nodebrew
)で管理と楽と先輩に聞いたのでさくっとREADMEに書いてあるのでその手順で導入。

...しようとしたらコケたのでメモ

#####なぜかコマンドはあるもののcurlできない

```
[vagrant@vagrant-centos65 ~]$ curl -L git.io/nodebrew
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Host name provided via SNI and via HTTP are different</p>
</body></html>
```


wgetでためそうとしたらwgetがないのでyum install

```
[vagrant@vagrant-centos65 ~]$ which yum
/usr/bin/yum
[vagrant@vagrant-centos65 ~]$ which wget
/usr/bin/which: no wget in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin)
[vagrant@vagrant-centos65 ~]$ sudo yum install wget

~~しばらくまつ

yを押す

Complete!
```

気を取り直して

```
[vagrant@vagrant-centos65 ~]$ wget git.io/nodebrew
```

あとは出てくるやつに従って

```
========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

[vagrant@vagrant-centos65 ~]$ export PATH=$HOME/.nodebrew/current/bin:$PATH
[vagrant@vagrant-centos65 ~]$ which nodebrew
~/.nodebrew/current/bin/nodebrew
```
とnodebrewが使えるように。


###nodebrewからnodeのインストール

とりあえずstable（2015/04現在v0.12.2)とv0.10系を入れておく

```
nodebrew install-binary v0.10.x
nodebrew install-binary stable
```


* 入れたらちゃんとuseしておく

```
nodebrew use v0.12.2
```

* aliasをつけておくのも良い

```
nodebrew alias v12 v0.12.2
nodebrew alias v10 v0.10.38
```


（nodebrew lsしたときにperlのwarningがうるさいので.bashrcに以下を記述した）

```
export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
```




##nodeでhello world

vimを入れる(好みによる)

```
sudo yum -y install vim
```


適当にtest.jsとかで

```
touch test.js
vim test.js
```

下記をコピペで

```
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "192.168.33.10");
console.log('Server running’);
```

```
node test.js
```

で192.168.33.10:1337 にアクセスするとhello worldがみれる

ひとまずこれでVagrant上でNode.jsの動く環境が構築できたはず。


（次はExpress とかを入れる）
systemdでmount完了を待ってサービスを起動する

sambaのバックエンドにbtrfsを使っていたりすると、mountが遅い上（少なくともFedoraでは）依存サービスがmount完了を待ってくれないので、sambaが先に起動して空のマウントポイントをクライアントに表示してしまう。

`RequiresMountsFor`命令でsamba側を待たせることで回避できる。

設定は sambaが `smb.service` として、

```ini
# /etc/systemd/system/smb.service.d/requiremount.conf
[Unit]
RequiresMountsFor=/mountpoint
RequiresMountsFor=/anothermountpoint
```

## service.d/*.conf

systemdは `foobar.service` が存在するとき、自動で`foobar.service.d/*.conf`をマージしてくれる。

ディストリのインストールする`smb.service`は手で変更してもパッケージ更新で上書きされるため、こちらを使う。

適用されているか確認するには、

```shell
# systemctl daemon-reload
# systemctl show smb | grep RequiresMount
RequiresMountsFor=/mountpoint /anothermountpoint
```
POH5 

POHの新しいのがやってるんですね。
また勉強用にやってみました。
３問目までは省いてみます。MINAMIちゃんルートでいってみました。

```rb
SPACE = 0
FIRED_BOMB = 2

_, row = gets.split(/ /).map(&:to_i)

puts bombs = row.times.map {
  gets.split(/ /).map(&:to_i)
}.transpose.map{|e|
  e.reverse.map{|state|
    state == FIRED_BOMB ? nil : state
  }.compact
}.map{|e|
  e + ([SPACE] * (row - e.length))
}.map(&:reverse).transpose.map{|e|
  e.join(" ")
}.join("\n")

```
【javascript】jQueryでプロパティを参照するとき

jQueryでプロパティにアクセスするとき

```js:javascript
$("#hoge").attr("name")//ゲット
$("#hoge").attr("name","hogehoge")//セット
```
めんどくさい。

```js:javascript
var name = $("#fuga")[0].name = "fuga"
```

楽ちん。
[Groovy]GroovyからJava8のstreamを利用する。


グルービャーなら一度は目にしたことがあるであろう[HAKI](http://mrhaki.blogspot.de/)に、GroovyからJava8のstreamを利用する方法が書かれていました。
[Groovy Goodness: Use Closures as Java Lambda Expressions](http://mrhaki.blogspot.de/2015/04/groovy-goodness-use-closures-as-java.html)

よりシンプルなサンプルを書いてみました。
以下のような感じで利用できるみたいです。

1から10の数値が格納されたリストから、偶数を抜き出して、それぞれに1を足す、と言う処理です。
Groovyからstreamってどんな時に使うの？と言われれば微妙ですが、Javaのサンプルソースなどを色々いじったりする際にGroovyからお手軽に確認することが出来ますね。

```groovy

// Listのstreamメソッドを叩いてstreamを取得
assert [3, 5, 7, 9, 11] == (1..10).stream()
.filter { // streamのfilter。Groovyで言うところのfindAll。
    it % 2 == 0
}.map{ Integer hoge -> //streamのmap。Groovyで言うところのcollect。itじゃなくて変数を宣言することも当然出来る。
    hoge + 1
}.collect() //コレでstreamからListに変換し直す。
```

# 追記（2017/10/16)
Groovy2.6(alpha-1)から、Java8の文法をそのままGroovyで書けるようになりました。
[こちらをご覧ください。](http://saba1024.hateblo.jp/entry/2017/10/07/004300)
Perlの変数について


たまに記号の意味がわからなくなるので自分用のメモとして残す。

### ルール
- アルファベット、数字、アンダースコアが使える
- 変数名の1文字目が数字の場合はすべて数字のみにしないとダメ
- 大文字、小文字は区別される

### 種類
| 種類 | ファニー文字 | 説明 | 例 |
|:------|:-----------|:-----|:-----|
| スカラー | $ | 1つの値を保持| $hoge = 'fuga' |
| 配列    | @ | 複数のスカラー値を保持 | @hoge = ('foo', 'bar')|
| 連想配列 | % | 複数のスカラー値とキー値のセットを保持 | %hoge = (foo=>'bar', spam=>'ham') |