OmniAICreator/Qiita-1.07M huggingface dataset:
wgrib2ツール でCSVを標準出力する方法

#やりたいこと
　気象情報の配信フォーマットであるgrib2。このフォーマットはバイナリデータの為、読込・集計にはデータ変換が必要です。ここでは、wgrib2というフォーマット変換ソフトを用いて、GRIB2データをCSV形式のテキストストリームを標準出力する方法を説明します。
　GRIB２データは非常にデータ量が多いので、CSVファイルとして保存後に加工すると重い処理になります。そこで、WGRIB2でのフォーマット変換の結果をファイルではなく標準出力にすることで、他のコマンドと組み合わせての加工を可能としました。

#環境構築
　wgrib2はLinux用のアプリケーションです。
　ソースコードをダウンロードし、ビルドして利用します。
本投稿では、Amazon Linuxで動作確認しております。（MacOSでトライしましたが、現状はNGでした）

[こちらの投稿](http://qiita.com/ShingoOikawa/items/77c837374721a2b945ba)が非常に参考になりました。ありがとうございます。

###ダウンロード

```shell-session:
wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz
```
###解凍・ビルド
```shell-session
tar xvzf wgrib2.tgz
cd grib2/
make
```
###パスが通ったディレクトリにコピー
　これは必須ではありませんが、コマンドラインフルパスを記述する際に面倒な場合は、実施を検討してみてください。

```shell-session
sudo cp ./wgrib2/wgrib2 /usr/local/bin/
```

#標準出力へCSVを出力
　wgrib2のCSV出力の簡単な仕様の説明です
第１引数： 処理対象のGRIB2のファイル
第２引数： -csv オプション　 CSVフォーマットで出力
第３引数： CSV出力ファイル名称（　- で標準出力）

```shell-session
wgrib2 GRIB2ファイルパス -csv - 
```

##オマケ：出力する列を指定する
cutコマンド用いて、カンマ記号で分割した列を選択的に出力します
cutコマンドでは、-d'デリミッタ'（デフォルトはタブ）,-fは出力列番号（１スタート）

```shell-session
wgrib2 GRIB2ファイルパス -csv - | cut -d',' -f1,5,6,7
```
社内開発で使ってるSinatra + Datamapper + Heroku + Dockerの簡易テンプレート for Mac

# なぜ？
社内システムは、なるべくクラウドの既製品を使うという方針でIT部を運営していますが、ちょっとしたバッチ処理、自動監視、データ転送・変換処理なんかは自分で開発したほうが早かったりします。
そういった処理を実現するために、社内サーバを用意するのは面倒なので、Herokuを使ってサクっと作ってしまおうということを繰り返してきた結果、なんとなくテンプレートのようなものができたので、ここに公開しておきます。

# なんでDockerを使うの？
自分のMacの環境をできるだけ汚さないようにするためです。特にMacの場合はRubyの環境がmacOSのバージョンアップの度に大きく変わって、つらい思いをしたのでDockerでHeroku相当の環境を作成する方針を取っています。

# 開発環境
- 個人の[Macbook](http://www.apple.com/jp/macbook/)（弊社はBYODを認めてます）
- OS X El Capitan (10.11.6)
- Docker for Mac（最近までは Docker Toolboxでした）

# 使い方

```
git@github.com:maloninc/quickherokuapp.git
cd quickherokuapp
rake
```

http://localhost:9292 へブラウザでアクセスすると下記のような画面が表示されます。

![スクリーンショット 2016-08-06 13.08.38.png](https://qiita-image-store.s3.amazonaws.com/0/96599/a16799d8-dcf9-51e7-333e-3061c2eee341.png)

あとは、要件に応じて適宜、ソースコードを改修していきます。


# テンプレートの構成
```
- Dockerfile
- Gemfile
- Rakefile

# 以降はSinatraウェブアプリケーションの構成
- app.rb
- configu.ru
- env
+ public
  + css
    - app.css
  + js
    - app.js
- resources.rb
+ views
  - index.haml
```

## Dockerfile
Herokuが公開している`cedar`スタックのイメージを`FROM heroku/cedar:14`で呼び出して、rubyのbuildpackをインストールしています。

## Gemfile
Sinatra + Datamapperのウェブアプリケーションを開発するために必要なGemを指定しています。Datamapperのデータベースは、ローカルの環境ではSQLiteで、本番環境ではPostgreSQLになるようにしています。

## Rakefile
dockerコマンドを覚えられないので邪道ですが、以下の様なよく使う機能をタスクとして定義しています。

- ウェブアプリケーションをサーバとして起動： rake
- ジョブとしてとして起動： rake run_job
- シェルの起動： rake shell
GoogleMapsのFusionTablesLayerで表示物のクリックイベントで表示されるInfoWindowの内容を変更する

2015年に実験的に試した内容。メモしておいた内容を今更ながら自分用メモとして投稿。
間違い等あったらごめんなさい。
markdown をイマイチよくわかってない。。。

# 条件

* 以下のfusion tableを利用する。  
https://www.google.com/fusiontables/DataSource?docid=1oVouXsjBueThIMExCZh9LhYNVINnqIjzrnuc1fIT  
※ 路線情報と駅名が登録されてある。詳細は [GoogleMapsに路線を表示する](http://qiita.com/oya3/items/a54eca64f6cdf31e4c34) を参照
* 変更する内容は、デフォルトでは InfoWindow で表示される内容は、クリック対象の fusion table に登録された内容すべてが表示される。（geometoryはデフォルトで外れている。。。なんでだ？）
ここでは、事業者名、路線名、駅名のみを表示するよう変更する
* 表示確認は chorme のみ

# 対応内容

クリック対象のInfoWindowを変更する方法は、google.maps.event.addListener() で click イベントを登録し対応する

<pre><code class="javascript">
var map, layer;
function initialize() {
  var center = new google.maps.LatLng(34.686871327463116, 135.52652215576177);
  map = new google.maps.Map(document.getElementById('map-canvas'), {
    center: center,
    zoom: 11
  });
  layer = new google.maps.FusionTablesLayer({
    query: {
      from: "1oVouXsjBueThIMExCZh9LhYNVINnqIjzrnuc1fIT",
    }
  });
  layer.setMap(map);
  google.maps.event.addListener(layer, 'click', function(e) {
    // Change the content of the InfoWindow
    e.infoWindowHtml =
      '事業者：' + e.row['company_name'].value + "<br>" +
      '路線：' + e.row['line_name'].value;
    if( e.row['data_type'].value == 'station') {
      e.infoWindowHtml += '<br>駅名：' + e.row['station_name'].value;
    }
  });
}
google.maps.event.addDomListener(window, 'load', initialize);
</code></pre>

参考サイト：  
https://developers.google.com/fusiontables/docs/samples/change_infowindow_content  

# 成果物

* 以下にすべて登録ずみ。  
https://github.com/oya3/gis_analyze.git  
 * map_change_infowindow.html ... 表示サンプル
* 動作サンプル  
http://oya3.net/map/map_change_infowindow.html


# リンク

*  [GoogleMapsに路線を表示する](http://qiita.com/oya3/items/a54eca64f6cdf31e4c34) 
* [GoogleMapsのFusionTablesLayerで条件を指定してスタイルを変更する](http://qiita.com/oya3/items/a947044ca926935f7699)
GoogleMapsのFusionTablesLayerで条件を指定してスタイルを変更する

2015年に実験的に試した内容。メモしておいた内容を今更ながら自分用メモとして投稿。
間違い等あったらごめんなさい。
markdown をイマイチよくわかってない。。。

# 条件

* 以下のfusion tableを利用する。  
https://www.google.com/fusiontables/DataSource?docid=1oVouXsjBueThIMExCZh9LhYNVINnqIjzrnuc1fIT  
※ 路線情報と駅名が登録されてある。詳細は [GoogleMapsを利用して路線を表示する](http://qiita.com/oya3/items/a54eca64f6cdf31e4c34) を参照
* 変更するスタイルは、ポリラインとマーカーを service_provider_type 項目の値に従って色を変更する。
* 表示確認は chorme のみ

# 対応内容

スタイルを変更するポイントは以下の通り

* layer = new google.maps.FusionTablesLayer で引き渡しているパラメータの内容。
query.select で 'geometry'指定し、styles に service_provider_type の値に従って色を変える指定を行う。
* 表示／非表示のサンプルとしては、query.where のコメントアウトした部分を参考にすること。

※ 対応ソースは以下に登録ずみ
https://github.com/oya3/gis_analyze.git
map_query.html 


<pre><code class="javascript">
var map, layer;

function initialize() {
  var center = new google.maps.LatLng(34.686871327463116, 135.52652215576177);

  map = new google.maps.Map(document.getElementById('map-canvas'), {
    center: center,
    zoom: 11
  });

  layer = new google.maps.FusionTablesLayer({
    query: {
      select: 'geometry',
      from: "1oVouXsjBueThIMExCZh9LhYNVINnqIjzrnuc1fIT",
      // where: "name CONTAINS '線'", // "線"を含むもののみ
      // where: "data_type = 'rail'", // 路線だけ
      // where: "data_type = 'station'", // 駅だけ
    },
    styles: [{
      where: "service_provider_type = '1'",
      polylineOptions: {
        strokeColor: "#0000ff",
        strokeOpacity: 1.0,
      },
      markerOptions: {
        iconName: 'small_blue',
      }
    },{
      where: "service_provider_type = '2'",
      polylineOptions: {
        strokeColor: "#00ff00",
        strokeOpacity: 1.0,
      },
      markerOptions: {
        iconName: 'small_green',
      }
    },{
      where: "service_provider_type = '3'",
      polylineOptions: {
        strokeColor: "#ff0000",
        strokeOpacity: 1.0,
      },
      markerOptions: {
        iconName: 'small_red',
      }
    },{
      where: "service_provider_type = '4'",
      polylineOptions: {
        strokeColor: "#ff00ff",
        strokeOpacity: 1.0,
      },
      markerOptions: {
        iconName: 'small_purple',
      }
    },{
      where: "service_provider_type = '5'",
      polylineOptions: {
        strokeColor: "#ffff00",
        strokeOpacity: 1.0,
      },
      markerOptions: {
        iconName: 'small_yellow',
      }
    }]
  });
  layer.setMap(map);
}
</code></pre>

# 成果物

* 以下にすべて登録ずみ。  
https://github.com/oya3/gis_analyze.git  
 * map_query.html ... 表示サンプル
* 動作サンプル  
http://oya3.net/map/map_query.html  

# リンク

* [GoogleMapsを利用して路線を表示する](http://qiita.com/oya3/items/a54eca64f6cdf31e4c34)
技術英語 > Are the routine's parameters [in a sensible order], ...?

@ Code Complete (No. 6525 / 36077)

> Are the routine's parameters <font color=red>in a sensible order</font>, ...?

http://ejje.weblio.jp/content/sensible
> 分別のある、思慮のある、賢明な、道理にかなった、賢明で、感じられる、知覚できる、気づくほどの、かなりの、著しい

前後の文章も入れると

> Are the routine's parameters in a sensible order, including matching the order of parameters in similar routines?

分別のない例を上げると

```
float calcAdd(float lhs, float rhs);
void calcMulti(float lhs, float rhs, float *retPtr);
float calcDiv(float *retPtr, float lhs, float rhs);
```

ここで、lhs(left hand side), rhs(right hand side)。

上記の3つの関数は、関数使用者のmental overloadを高める関数signatureであり、「not in a sensible order」ということなのだろう。

しかしながら、複数のライブラリが使うコードになるとライブラリ間のsignatureが異なり、統制は取りにくくなる。
MyBatisのアノテーション内で動的SQLを組み立てる

以前の投稿で、「[GroovyでMapperを書くことでアノテーション内にSQLを指定する方法](http://qiita.com/kazuki43zoo/items/0c6ac5acaee1201a433e)」を紹介しましたが、動的SQLは書けないの？と思った方もいるかもしれません。私も実は知らなかったのですが・・・アノテーションでもXMLと同様に動的SQLが書けます。デフォルトではXML形式の動的SQLがサポートされています。

本投稿ではGroovyでMapperを作った時のサンプルになっていますが、もちろんJavaでつくっても同じことができます。

# どうやって動的SQLを指定するの？

こんな感じです。

```groovy
@Select('''
<script>
    SELECT
        id, title, details, finished
    FROM
        todo
    <where>
        <if test="title != null">
            AND title = #{title}
        </if>
        <if test="details != null">
            AND details = #{details}
        </if>
        <if test="finished != null">
            AND finished = #{finished}
        </if>
    </where>
</script>
''')
List<Todo> findBy(@Param("title") String title
                  , @Param("details") String details
                  , @Param("finished") Boolean finished)
```

ポイントは、`<script>`要素でSQLを囲むことです。`<script>`要素でSQLを囲むと、動的SQLを組み立てるためのXML要素が使えるようになります。

# アノテーション内で指定できるのはXML形式だけなの？

MyBatisの標準APIではXML形式だけですが、FreeMarkerとVelocityも拡張ライブラリとしてサポートされています。本投稿では使い方の紹介はしませんが、興味がある方はそれぞれ以下のページを参照してください。

* [FreeMarker](https://github.com/mybatis/freemarker-scripting)
* [Velocity](https://github.com/mybatis/velocity-scripting) 


# 他の方法で動的SQLは組み立てられないの？

ロジックで動的SQLを組み立てることもできます。

```groovy
@SelectProvider(type = SqlProvider.class, method = "findBy")
List<Todo> findBy(@Param("title") String title
                  , @Param("details") String details
                  , @Param("finished") Boolean finished)

class SqlProvider {
    String findBy(@Param("title") String title
                  , @Param("details") String details
                  , @Param("finished") Boolean finished) {
        new SQL() {
            {
                SELECT("id, title, details, finished")
                FROM("todo")
                if (title != null) {
                    WHERE("title = #{title}")
                }
                if (details != null) {
                    WHERE("details = #{details}")
                }
                if (finished != null) {
                    WHERE("finished = #{finished}")
                }
            }
        }.toString()
    }
}
```

ポイントは、SqlProvider（`@SelectProvider`などのアノテーション）を使うことです。

# まとめ

紹介してみたものの・・・個人的には、XML形式に比べてタイプセーフな実装になるSqlProviderを使う方が好きです。 :sweat_smile: 
アノテーション内だとXML要素のコード補完が利用できないのでタイプミスなどの単純ミスも生れやすそう。
Laravel Mail 


Laravel のメールパッケージについて

https://laravel.com/docs/5.2/mail

## 概要　

メールを送信するパッケージ

使うべき理由としては、

- キューシステムとの連携。
- Viewを使ったメールテンプレートの取り扱い
- Swift_Transportベースの多様なメールサービスサポート

などがあげられる。

デフォルトでは、Mailgun, Mandrill, SparkPost, SES に対応している。

但し、キューと送信は別になっているので適宜ラップする必要はありそう。

## 使用方法
 
Mail ファザードを利用。コンテナから直接取るときは、`app("mailer")`。クラス名での登録はない模様。

型は`Illuminate\Contracts\Mail\Mailer`で落ちてくる。


````
Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
    $m->from('hello@app.com', 'Your Application');
    $m->to($user->email, $user->name)->subject('Your Reminder!');
});
````

第一引数にmailのviewテンプレート名を、第二引数にViewで使用する変数を、第三引数にはメールを操作するためのクロージャを用意する。

クロージャには `\Illuminate\Mail\Message`が落ちてくる形で、`from`や`to`と言った情報をここでセットする。

### キューを使用する

````
Mail::queue('emails.welcome', $data, function ($message) {
    //
});
````

メールをキューにセットする時には、`queue`メソドを使用する。引数の取り方は同じで、第四引数にキューの名前を指定する事もできるよう。

ちなみに`queue`はContractに無いのでContractでタイプヒントとっている時には要注意。

## 最後に

Transportの拡張とかも楽ちんっぽいので、Laravel系列での開発では便りになりそう。

Config 参照している箇所がもうちょっとなんとかなればなぁ…という気もするが…
dokku で graphite-grafana plugin をインストールして Grafana のダッシュボードにアクセスする

急に時系列 DB が必要になったのでとりあえず dokku でサクッと入れられそうだったのでやってみたメモ。
肝心のダッシュボードにどうやってアクセスするのか、がドキュメント化されていなかったので主にそこを残すために。

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

[dokku-graphite-grafana](https://github.com/dokku/dokku-graphite-grafana) のドキュメントに従う。

`dokku plugin:install` は `sudo` で実行する必要があるので、dokku のホストマシンに SSH で繋いで以下を実行する。

```
$ sudo dokku plugin:install https://github.com/dokku/dokku-graphite-grafana.git graphite
```

## コンテナの作成

```
$ dokku graphite:create grafana
       Waiting for container to be ready
=====> Graphite container created: grafana
       DSN: statsd://dokku-graphite-grafana:8125
-----> Service grafana available under 172.17.0.9:80
-----> Initial login/pass: admin/admin. Please change it on first login
```

ここで若干途方にくれるがとりあえずポートフォワーディングでお茶を濁す。

```
$ ssh -L 10080:172.17.0.9:80 dokku-host.example.com
```

これを接続した状態でブラウザで http://localhost:10080/ にアクセスするとログイン画面が表示されるので、初期ログイン情報の `admin` / `admin` でログインする。

![image](https://qiita-image-store.s3.amazonaws.com/0/208/c7f30250-4a03-52b1-1dd2-5d293914b5a0.png)

とはいえさすがに面倒なのでもっとちゃんとしたやり方がないかは引き続き調べてみる。
Xamarin.FormsとAzure Mobile Appsの連携時のテーブル追加方法

Xamarin.FormsとAzure Mobile Appsの連携については、
[Xamarin.Forms アプリの作成](https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-xamarin-forms-get-started/)
の通りに進めることで、TodoListを持つサンプルアプリを作成できますが、
TodoItem以外のテーブルを追加してアプリと連携させるための、サーバサイドの作業内容をまとめます。

# 環境

Visual Studio Professional 2015
Microsoft azure tools 2.9
バックエンド言語：C#

# テーブルクラスの追加

クイックスタートを完了させると、以下のようなプロジェクト構成になっているはずです。

![image](https://qiita-image-store.s3.amazonaws.com/0/136146/b0357602-d622-f0c8-50e9-40327dfa0c16.png)

ここに、追加したいテーブルの列に合わせたクラスをDataObjectsフォルダに作成します。
クイックスタート作成時に既存のTodoItemに倣って以下のように作成します。

```csharp
using Microsoft.Azure.Mobile.Server;

namespace [YourProject].DataObjects
{
    public class Employee : EntityData
    {
        public string Name { get; set; }
    }
}
```

# コントローラの追加

テーブルへアクセスするためのコントローラクラスを、Controllersに作成します。
Controllersフォルダを右クリックし、追加(D) -> コントローラー(T)　を選択しますと、
スキャフォールディングを追加　画面が出てきますので、
Azure Mobile Appsのテーブル コントローラーを選んで進みます。

モデル、コンテキスト、コントローラー名（クラス名）を聞かれますので、
モデル：先ほど作成したテーブルクラス
コンテキスト：クイックスタートプロジェクトに既に存在しているコンテキスト
コントローラ名：デフォルト
として設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136146/d3d75f19-b997-01cf-aa93-5f51329a2340.png)

ここで、追加をクリックすることで、コントローラクラスが生成され、
コンテキストファイルにもDbSet Employeesの定義が追加されます。

# Azureへ公開

以上で最低限のコーディングは完了です。
Azureへ公開することで、コンテキストファイルに基づいてテーブルが自動で作成されます。

このあたりの仕組みはEntityFrameworkを調べることでより詳細がわかると思います。

# 参考

[Entity Frameworkでの新しいデータベース向けのCode First](https://msdn.microsoft.com/ja-jp/data/jj193542.aspx)
対応するHTMLタグを抽出したいっ！

# 背景
実際の所rtfの文書にコメントを挿入したかっただけなんです
でも、rtfに真正面から向き合う気はない、ほんの遊び心で手を出してしまいました

# 方針
勿論プログラム的にrtfオブジェクトをハンドリングするのが正攻法でしょう
でもrtfはHTMLが一般的になる以前にMSが策定した、文書を構造的に表現するprintableな一連の文字列です
!!! 構造を持った文字列！
正規表現の出番ですね！
と云うお話

で、rtfは余り一般的ではないので、HTML構造で話を続けたいと思います

# 目的
DOMで話をしてしまうと、OuterHTMLをテキストから切り出したい、と云う事です
例えば…

```html
<body>
    <div>
        <p>むにゃむにゃ</p>
        <div>～～～</div>
        <p>にょろにょろ</p>
    </div>
</body>
```

ってな文字列があったとき、最初の `<div>` と最後の `</div>` までの間の文字列を切り出すという事
途中にある `</div>` に反応しちゃだめですよ

# 結論
結構いきなりです
内容はどこかでパクってきた情報です
ごめんなさい、古すぎてどこから参照してきたか思い出せません
情報を公開してくれた人、感謝しています

では…

```csharp
<TAG((?!<TAG|/TAG>).|<TAG(?<depth>)|/TAG>(?<-depth>))*(?(depth)(?!))/TAG>
```

`TAG` を実際のタグ名に読み替える事で、特定の対応するタグを抜き出す事ができます
ここで `TAG` に `div` を当てはめれば、文字列中の対応する `<div～～～/div>` が抜けてくる感じです
`depth` の辺りがどこでも使える技ではないみたいですが、少なくともC#では使えてます

なので上の指定だとー
* 閉じタグがないと抜けません
* 閉じタグにアトリビュートがあると抜けません

ま，そこらへんは応用編という事で

# 附録
って、私的にはこっちが本題だったんですが、rtfの対応するタグを抜く方です
例えば

```text
\{fonttbl([^\{\}]|\{(?<depth>)|\}(?<-depth>))*(?(depth)(?!))\}
```

ってやるとfonttblタグ全体が抜けてくるんです
で、構造を見ながら適切な（と思われる）ところにコメントを入れてあげるとやりたい事が出来る筈です
筈…
SpringにはStopWatchなんてクラスもある

すごくどうでもいい話題ですが、Spring Frameworkには`org.springframework.util.StopWatch`なんてクラスもあります :blush: 

```java
StopWatch stopWatch = new StopWatch();
stopWatch.start();

// ... 処理時間を計測したい処理

stopWatch.stop();
System.out.println(stopWatch.getTotalTimeMillis());
System.out.println(stopWatch.prettyPrint());
```

```text:コンソール
949
StopWatch '': running time (millis) = 949
-----------------------------------------
ms     %     Task name
-----------------------------------------
00949  100%  

```

AOPなどを使って各処理の処理時間をログに出力する場合などに使えるクラスです。

```java
@Component
@Aspect
public class ProcessingTimeLoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(ProcessingTimeLoggingAspect.class);

    @Around("@within(org.springframework.web.bind.annotation.RestController)")
    public Object logging(ProceedingJoinPoint pjp) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Object returnObject;
        try {
            returnObject = pjp.proceed();
        } finally {
            stopWatch.stop();
            logger.info("{} : {} ms", pjp.getSignature(), stopWatch.getTotalTimeMillis());
        }
        return returnObject;
    }

}
```

```text:コンソール
...
2016-08-07 00:05:32.215  INFO 46975 --- [o-auto-1-exec-1] eApplication$ProcessingTimeLoggingAspect : String com.example.DemoResttemplateApplication$DemoRestController.readme() : 783 ms
...
```

Springにはいろいろなユーティリティクラスやサポートクラスが提供されています。オレオレなクラスやメソッドを作る前にSpring Frameworkや3rdパーティ製のライブラリに該当するメソッドがないか調べてみましょう！！
切ない思いをしないためのDNSチェッカー

完全に私事なんですが、先日、某所からGoogle Cloud DNSにDNSサーバを移しました。
何も考えずにコピペしてたんですが、ある日、SPFレコードが無効になっている事に気付き…

## SPFレコードが無効に？
私が書いていたのはこんなレコード`v=spf1 include:_spf.google.com ~all`だったはずでしたが、何故か`"v=spf1" "include:_spf.google.com" "~all"`という感じになっていました。
原因はコレ、スペースを含む場合はダブルクォートで囲む必要があるのですが、Google Cloud DNSの場合、なんともお節介な位置に勝手にダブルクォートを入れられていました…
*ちなみに、Google Cloud DNSだと`"v=spf1 include:_spf.google.com ~all"`が正解です。*

## というわけで、未然に防ぐために
DNSのレコード、特にTXT系については検証が難しいので、それらを検証するための手段を集めてみました。

### SPF
こちらはSPFレコードの取得だけではなく、GUIで展開していけるのでとてもわかりやすいです
https://dmarcian.com/spf-survey/


### DKIM
Google Appsの場合はSelectorはgoogle（_domainkeyより前）で、簡単にフォーマットをチェックできます
http://dkimcore.org/tools/keycheck.html

### DMARC
DMARCに設定した内容をわかりやすく分解して表示してくれます。部分的な文法ミスもチェック可能です
https://dmarcian.com/dmarc-inspector/

## あとがき
結局、メール系ばかりになってしまいました。（ドメイン認証系はチェックがし易い事もあり）
私用のドメインはこれくらいしか今は設定がありませんが、もし他にもあったらコメントください。
リーンキャンバスをMarkdownで書く

# はじめに

![canvas.png](https://qiita-image-store.s3.amazonaws.com/0/104608/4f04ac5f-6aa0-9ad6-8275-46b902352bf2.png "出力イメージ")

私は新規サービス・製品を企画開発する部署に所属している関係で、リーンキャンバスを書く機会が割とあります。

みなさんはキャンバスを書くとき、どんなツール使ってますか？
私の場合はExcelです。

Excelという慣れたツールで気軽に書けるのはとても良いことですが、歴史を刻んだキャンバスでは色々と苦しくなってくる側面もあります。

* いつ、どこを変更したかわからない。
* 変更することになったトリガー、背景がわからない。

「変更履歴書けよ」とか「自動で履歴残す機能あるよ」って声が聞こえてきそうですが、多くの場合履歴を書くのをサボる私のような人が出てきたり、自動で履歴が残ったとしても編集理由までは記録できません。

また、草案レベルではMarkdownでカジュアルに編集することも多いので、「Markdownがそのままリーンキャンバス(HTML)になったら良いんじゃね？gitで管理できるし」ということでツールを作りました。

置き場所はこちらです。
https://github.com/tanksuzuki/easel

# インストール

https://github.com/tanksuzuki/easel/releases からWin/Mac/Linuxでお好きなものを落としてください。

Macな方はbrewでいけます。

```
brew tap tanksuzuki/easel
brew install easel
```

# 使い方

```bash
$ easel help

easel is a tool for write down your lean-canvas using markdown.
https://github.com/tanksuzuki/easel

Usage:
    easel command [args]

Commands:
    get         Preview the markdown on the web
    init        Generate markdown template
    watch       Run the preview server
    write       Convert the markdown to HTML
    version     Show the easel version information

Use "easel help [command]" for more information about a command.
```

## Markdownのテンプレートを生成

```bash
$ easel init > sample.md 
```

```text:sample.md
# PROBLEM



# CUSTOMER SEGMENTS



# UNIQUE VALUE PROPOSITION



# SOLUTION



# CHANNELS



# REVENUE STREAMS



# COST STRUCTURE



# KEY METRICS



# UNFAIR ADVANTAGE



```

## 各項目を記入

生成された見出し配下に内容を記入します。
無駄に`:beer:`記法で絵文字が使えたり:beer:、ほとんどのMarkdown記法が制約なく使えますが、下記のきまりごとがあります。

* トップレベルの見出し(`# 見出し`)を編集するのはNG（順番は変えても良い）
* 新しくトップレベルの見出しを追加するのはNG

また、最初に出現するトップレベルの見出しより前に書かれたものはキャンバスに出力されないため、コメントで何か残したりとかメモ的に使えます。

下記は実際に書いてみた例（内容は適当です）：

```text:sample.md

__この部分はキャンバスに出力されません。__
最初に出現するh1(# PROBLEM)以下がキャンバス化の対象になります。

# PROBLEM

* キャンバスを編集したタイミングや内容、理由を後から思い出せない
* 改版履歴で管理しようと表は作ったものの、永遠の初版になってしまう
* キャンバスへのフィードバックが口頭になりがちで記録しづらい

## EXISTING ALTERNATIVES

* エクセルで編集してファイルサーバ管理
* エクセル上で改版履歴を残す


# CUSTOMER SEGMENTS

* ドキュメントはMarkdownで書くのがイケてると思ってるのに、キャンバス書く時は普通にエクセル開いてしまう人
* 実はMarkdownでキャンバス原案作ってからエクセルに転記しているオーバーヘッド多めの人
* 有料のサービスを使ってキャンバス管理・共有したいけど、お金もったいないし頑張れば自力でなんとかなると思ってる人

## EARLY ADOPTERS

* 俺


# UNIQUE VALUE PROPOSITION

* Markdownがリーンキャンバスになる


# SOLUTION

* キャンバスをMarkdown化してGitHub等で管理しやすくする
* issue駆動で因果を明確化する


# CHANNELS

* この記事


# REVENUE STREAMS

* 趣味なので度外視


# COST STRUCTURE

* 趣味なので度外視


# KEY METRICS

* ストック数
* スター数
* ダウンロード数


# UNFAIR ADVANTAGE

* なし（こんな物は誰でも作れる）

```

## HTMLへ変換

```bash
$ easel write sample.md > sample.html
```

## リアルタイムプレビュー

```bash
$ easel watch sample.md
```

ブラウザで`localhost:3000`へアクセスするとキャンバスが表示されます。
また、引数で指定したMarkdownが変更されると自動的にページがリロードされます。

## Web上のMarkdownをプレビューする

リモートリポジトリ等、Web上のMarkdownを手元でプレビューしたい時は下記のように`get`を使います。

```
$ easel get https://raw.githubusercontent.com/username/reponame/master/sample.md?token=xxxxxxxxxx
```
laraveのORM「eloquent」の設定、利用

[laravel5で顧客管理webアプリを作成したのでメモ](http://qiita.com/ryo2132/items/769968fcf28a7333eda6)の続きです。

前提として、[データベースの接続、マイグレーションの利用](http://qiita.com/ryo2132/items/a1c8119b00799d3aed00)で説明した「.env」の利用データベースの設定が必要となります。


#eloquentとは？
laravelで使用出来るORM（オブジェクト関係マッピング）です。通常phpでデータベースのテーブルを編集する場合は、sqlを用います。ですがそうすると、コード内にphpとsqlが混ざり可読性が損なわれてしまいます。そこで、ORMを使うとテーブルとの接続をまとめたクラスを作成し、そのメソッドを使うことでsqlを用いないレコード操作が可能となります。

#eloquent使用の準備
##モデルの作成
eloquentで使用するテーブルとの接続をまとめたものをモデルと言います。artisanで雛形を作成しましょう。

```
$ php artisan make:model モデル名
```
これでappの直下にモデル名.phpが作成されます。

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class モデル名 extends Model
{
    //
}
```
##テーブルとの紐付け
作成したモデルと使用するテーブルを紐付ける設定をします。
まず行うのは、テーブルの設定です。作成したモデルのclass内に下記を追加しましょう。

```php
protected $table = 'テーブル名';
```
通常はこれだけで指定したテーブルの操作が可能となります。
##その他設定
前述の紐付けだけではエラーとなる場合もあります。その理由としてよくあるのは
1. 主キーのカラム名
2. タイムスタンプの有無
です。

####主キーのカラム名
eloquentでは通常テーブルの主キーを「id」として想定しています。そのため主キーが「id」以外の場合はエラーが発生します。

その場合はクラス内に

```
protected $primaryKey = ‘主キー名’;
```
を追加するとエラーが回避されます。

####タイムスタンプの有無
eloquentでは自動的にレコードの追加、編集をした際にタイムスタンプ「created_at」と「updated_at」カラムを更新します。
もし上記のカラムがない場合はエラーが発生してしまうので、タイムスタンプの更新を無効にする

```php
public $timestamps = false;
```
をモデル内に追加しましょう。

##例
[データベースの接続、マイグレーションの利用](http://qiita.com/ryo2132/items/a1c8119b00799d3aed00)で作成したhistory_listテーブルのクラスは下記のようになります。

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class History extends Model
{

//テーブルの指定
protected $table = 'history_list';

//プライマリーキーを設定
protected $primaryKey = ‘code’;

}
```


#eloquentの利用
##レコードの追加
レコードの追加はモデルのインスタンスを作成し行います。
ここではpatient_listテーブルにレコードを追加するため、Patientモデルを使用します。

```php
$test_recode = App\Patient;
```
これで$test_recodeを編集することでPatientモデル（patient_listテーブル）へのレコードが追加できます。
それでは各カラム値にデータを入力します。

```php
$インスタンス名->カラム名 = '入力値'
```
が雛形です。

今回は例として下記のように入力しました。

```php:
$test_recode->name1 = '山田 太郎';
$test_recode->name2 = 'やまだ たろう';
$test_recode->sex = '男性';
$test_recode->birthdate = '20160101';
$test_recode->phone_num = '01201111111';
$test_recode->zip = '1234567';
$test_recode->address = '東京都杉並区11';
$test_recode->ad = 'ホームページ';
$test_recode->experience = 'あり';
$test_recode->firstday = 'date';
$test_recode->memo = 'テストです';
```

これでインスタンスにデータが入力できたので、それをテーブルに反映sるためsaveメソッドを実行します。

```php:
$test_recode->save();
```

これでテーブルへのレコード挿入が完了です。
テーブル内のデータを呼び出すスタティックメソッドall()を利用し確認します。

```php:
App\Patient::all();
```
下記のように表示され
EC2でSFTP専用ユーザを作成する

SFTP専用ユーザを作成するときにちょいちょいやり方忘れるので、自分用にまとめ。

## やりたいこと
1. sftp接続用にパスなしの公開鍵を作成する
2. sftpコマンドでしか接続できない（sshできない）ユーザを作成する
3. sftp接続時に接続先の階層が見えないようにする（ルートディレクトリを `/` にする）

接続元のIPアドレス制限をしたかったら、EC2のセキュリティグループへ接続元IPアドレスの設定を追加しておく。


## 接続ユーザの作成  
ユーザのホームディレクトリをSFTP専用にするので、接続用ユーザを新規に作成する。

```
$ sudo su
$ useradd [username]
$ passwd [username]
```

## 認証鍵の作成
鍵なしの認証鍵を作成する。
※鍵なしなのはコマンドで色々処理させたい（パスワード入力の応答処理をさせたくない）から。

```
$ sudo su [username]
$ cd /home/[user_dir]
$ mkdir .ssh
$ cd .ssh
$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/[user dir]/.ssh/id_rsa):   *未入力（必要に応じてキー名を入力）
    Enter passphrase (empty for no passphrase):   *未入力
    Enter same passphrase again:   *未入力
    Your identification has been saved in /home/[user dir]/.ssh/id_rsa.
    Your public key has been saved in /home/[user dir]/.ssh/id_rsa.pub. 
```

認証鍵が作成できたら、公開鍵をauthorized_keysに転記してパーミッションを変更する。

```
$ cp /home/[user_dir]/.ssh/id_rsa.pub /home/[user dir]/.ssh/authorized_keys
$ chmod 600 /home/[user_dir]/.ssh/authorized_keys
$ chmod 700 /home/[user_dir]/.ssh/
```

## sftpコマンドでのみ接続を許可させる
authorized_keysの先頭に下記の記載を追加。

```:/home/[user_dir]/.ssh/authorized_keys
command="internal-sftp"
```

## 接続ディレクトリを制限する
SFTP接続時にいろいろ移動されたりしたくないので、接続できるディレクトリを制限する。
ChrootDirectoryは後で作成するSFTP接続用のディレクトリを設定する。

```:/etc/ssh/sshd_config

# 以下の行のコメントアウトを解除
Subsystem sftp /usr/libexec/openssh/sftp-server

# 以下を追加
Match user [username]
ChrootDirectory /home/[user_dir]/sftp-root
ForceCommand internal-sftp
```

sshd_configの編集が終わったら、sshdを再読み込みする。

```
$ service sshd reload
Reloading sshd:        [  OK  ] 
```
 
## ディレクトリ権限の変更
ホームディレクトリの権限を変更する。
ここでうっかり対象のディレクトリを間違うと悲惨な目に遭ったりする（体験談）

```
$ sudo su
$ chown root: /home/[user_dir]
$ chmod 755 /home/[user_dir]
```

ホームディレクトリの権限設定が完了したら、SFTP接続時のルートディレクトリを作成する。
※ルートディレクトリの名前を変える場合にはsshd_configのChrootDirectoryも忘れず変更する。

```
$ mkdir /home/[user_dir]/sftp-root   *sshd_configのChrootDirectoryで設定したディレクトリ
$ chown root: /home/[user_dir]/sftp-root
$ chmod 755 /home/[user_dir]/sftp-root
```

ルートディレクトリを作成したら、書き込み用のディレクトリをその下に作成する。

```
$ mkdir /home/[user_dir]/sftp-root/sftp
$ chown [username]: /home/[user_dir]/sftp-root/sftp
$ chmod 777 /home/[user_dir]/sftp-root/sftp
```
 
## 接続確認
最初に作成した秘密鍵（/home/[user_dir]/.ssh/id_rsa）を使用して、SFTP接続できるか確認する。
以下が満たされていればOK。
1. 接続できること
2. Remote working directoryが `/` になっていること
3. 接続したディレクトリの配下に `sftp` （書き込み用ディレクトリ）が存在すること
4. 書き込み用ディレクトリで `put` `get` ができること

```
$ sftp -i [認証鍵] [username]@[server]
    Connected to [server]
    sftp> pwd
    Remote working directory: /
    sftp> ls -la
    drwxr-xr-x 3 0 0 4096 Dec 1 00:00 .
    drwxr-xr-x 3 0 0 4096 Dec 1 00:00 ..
    drwxrwxrwx 2 510 510 4096 Dec 1 00:00 sftp
```
    
sftpコマンドでのみ接続を許可しているので、ssh接続は下記のように拒否される。
もし拒否されなかったらauthorized_keysにちゃんと追記しているか確認する。

```
$ ssh -i [認証鍵] [username]@[server]
    Could not chdir to home directory /home/[user_dir]: No such file or directory
    This service allows sftp connections only.
    Connection to [server] closed.
```
fabricでtexファイルを管理する

# 何をするか
texファイルをfabricファイルで管理する方法を書きます.
仮定として, texプロジェクトをgitで定義しているとします.
また, Linux or Mac で書いているとします.

# latexmk
まず, latexmkを入れてない人は, 入れましょう.
自動的にlatexを何回実行したらいいかを計算して, 実行してくれます.
```
$ sudo apt-get install latexmk
```

日本語に対応するために, `~/.latexmkrc` を作ります.

```
$latex = 'platex -synctex=1 %O %S';                                             
$bibtex = 'pbibtex %O %B';                                                      
$dvipdf = 'dvipdfmx %O -o %D %S';                                               
$makeindex = 'mendex %O -o %D %S';                                              
$max_repeat = 10;                                                          
$pdf_previewer = 'evince %S'    
```

# fabric

入っていない人はfabricをインストールしておいてください.

``` sh
$ pip install fabric
```

# sample.tex-by-fab

自作のfabric.pyをdownloadしてきます.

```
$ wget https://raw.githubusercontent.com/yassu/sample.tex-by-fab/master/fabfile.py
```

後はfabric.pyのデフォルト値を変更して, 自由に使うだけです.
詳しくは [document](https://github.com/yassu/sample.tex-by-fab)を書いているので, そちらを見てください.
KC705使ってみた

機能豊富なのは良いですが、初めて使う人には取っつきにくいところもありました。
## 特色

- JTAGがFMCカードまで回っている<br/><span style="color:red">+</span> FMCカードのデバッグが容易<br/><span style="color:red">-</span> 間違えてFMC上のFPGAをプログラムしてしまうかも。<br/>プログラムしようとしたら、デバイスが違うとエラーに、最初は焦った。
- 起動プログラムを選択できる<br/><span style="color:red">+</span> DIPSW13の設定により、SPI, BPI (4つ), JTAGを切り替えられる。
- LCD、ロータリースイッチが付いている
<br/><span style="color:red">+</span> プログラムが面倒だけどちょっと便利。
- マニュアルが不親切

## 気をつけよう

### コンフィグレーション電圧が書いていない。
vivadoでは設定が必要なのにどこにも書いてない。回路図から読むとこうなる。

`
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 2.5 [current_design]
`
### ２種類のUSBコネクタ
<br>UART接続はMINI-B、JTAGはMICRO-B
<br>サンプルプログラムでUART接続に使ったケーブルが、JTAGに刺さらず焦った。誤接続の防止には役に立つと思うが焦る。
### SYSCLOCK_P,NがLVDSレベル

`
U1100_i:IBUFGDS
generic map (
   DIFF_TERM => TRUE,
   IBUF_LOW_PWR => TRUE,
   IOSTANDARD => "DEFAULT")
port map (
   O => clk200m_int,  --このあとGBUFにいれること
   I => SYSCLK_P,
   IB => SYSCLK_N
);
`
### DIPSWのシルク印刷とピン番号が反対<br>
1:GPIO_DIPSW_3,2:GPIO_DIPSW_2, 3:GPIO_DIPSW_1, 4:GPIO_DIPSW_0
### LCDの仕様の情報が少ない
グーグルで探すと、大学関係のサイトにサンプルプログラムがある。
[Brian Zufelt,"Using the Spartan-3E Starter Board LCD Display With ISE 10.1"](https://forums.xilinx.com/xlnx/attachments/xlnx/NewUser/31283/1/lcd.pdf)
### ロータリースイッチの情報はこちら
 [Ken Chapman,"Rotary Encoder Interface Spartan-3E Starter Kit",20th February 2006](http://www.eng.utah.edu/~cs3710/xilinx-docs/examples/s3esk_rotary_encoder_interface.pdf)
## SFP+の送信有効信号の論理が逆
 SFP RS0,RS1のデフォルト設定がLOW BANDWIDTH。10Gで用いるにはJ27,J28のジャンパ変更が必要。
### SDカードソケットのwrite protect, SD_DETが常に'1'
これらのスイッチのコモン側は、本来GNDに接続するはずだが結線されていない。

## BUG

- SFP+の信号の極性がバージョンによって違う。制約に注意
- Si570のI2Cアドレス誤記(正 0b1011101)
User Guide(UG810)
Bash on Ubuntu on Windowsのいろいろ

#Bash on Ubuntu on Windowsのいろいろな導入・設定
## 導入
後ほど
## 設定

### sshサーバーが起動しているので使用しない人は切る

"スタート"→"設定"→"ネットワークとインターネット"→画面下部の"Windowsファイアウォール"→画面左部の"Windwosファイアウォールを介したアプリまたは機能を許可"→"Ssh Server"のチェックを外す→"OK"をクリックして完了．
### 日本語入力を行う
要検証中
暫定対応:ConEmuなどで起動すれば日本語入力はできる．
~~Google日本語入力を導入するため以下のコマンドを実行する．~~

```bash
$ sudo apt-get install ibus-mozc
````
Edge、Chrome対応メモ


## 0.経緯

元々IE11用に作成されていたJava製のWebシステムで
Edge、Chromeへの対応をやってる際、
他のシステムでも対応しないとならなさそうな
問題が色々出て来たのでメモ。
今後更に増えるかも？

## 1.日本語名ファイルのダウンロード文字化け対応

IE11、Edgeでは問題無かった日本語ファイル名のダウンロードが
Chromeでは文字化け。
サーバー側で該当部分のコードを調べてみると…

```java
String fileName = new String(value.getBytes("Windows-31J") , "8859_1" );
response.setHeader("Content-Disposition", "attachment;filename=¥"" + fileName +"¥"" );

```

この通り、Windows-31J(Shift-JIS)でのエンコード。
Chromeがダメなわけです。

幸運にも今回の案件ではIEの下位互換は考えなくて良かったので
RFC 6266 にならって以下の通り修正。

```java
String fileName = URLEncoder.encode(value, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName);

```

これにてChromeでの文字化けが解消。
Edge、IE11でも文字化けは起こらず、一件落着。

## 2.コード項目のハイパーリンク化対応

業務系のシステムだとありがちな
文字列数字n桁のコードの画面表示。

IE11ではごく普通のラベルとして表示されていたのに、
Edgeで確認すると謎のハイパーリンク化。

一体何だろうと調べてみるとこんなオチでした。
https://msdn.microsoft.com/ja-jp/library/dn265018%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

IE11の話として書いてるけど、IE11では発生せず…
むしろEdgeでの話として捉えた方が良さそうです。

というわけで、画面のjspのheadタグ内に以下の一行を追加。

```html
<meta name="format-detection" content="telephone=no"/>

```

これにて、謎のハイパーリンク化現象は解消。
SSHで"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!"エラー

ssh接続しようとしたら上のエラーが出てきた

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Please contact your system administrator.
Add correct host key in /Users/XXXX/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/XXXX/.ssh/known_hosts:36
RSA host key for XXX.XXX.XXX.XX has changed and you have requested strict checking.
Host key verification failed.
```


##解決方法
```
ssh-keygen -R XXX.XXX.XXX.XX
```

known_hostsファイルの削除の方法が書いてあったが、known_hostsファイル削除してももWARNINGのエラー出てきたのでこっちの方法でやった。
systemd と netcat で簡易中継サーバを作る

下記の systemd を使った版です。

- [xinetd と netcat で簡易中継サーバを作る - Qiita](http://qiita.com/zakkied/items/604c19adf2779bc91c98 "xinetd と netcat で簡易中継サーバを作る - Qiita")

下記のように systemd-socket-proxyd を使えば簡単にできますが、あえて netcat でやってみました。

- [systemdで簡易中継サーバを作る - Qiita](http://qiita.com/pasela/items/a387711c7a39c3aa4ec0 "systemdで簡易中継サーバを作る - Qiita")

---

.socketファイルと.serviceファイルを作ります。

**`/etc/systemd/system/http-proxy.socket`**

```
[Socket]
ListenStream = 0.0.0.0:80
Accept = yes
```

**`/etc/systemd/system/http-proxy@.service`**

```
[Service]
ExecStart = /usr/bin/nc -w 5 192.0.2.123 80
StandardInput = socket
StandardOutput = socket
StandardError = journal
```

daemon-reload して .socket の方を起動します。

```sh
sudo systemctl daemon-reload
sudo systemctl start http-proxy.socket
```

あとはアクセスするだけ。

ポイントは次のとおりです。

- socket では Accept = yes を指定する
    - デフォルトの No だとサービスにはリッスンソケットが渡されるだけになる
    - Yes にすれば systemd が accept したソケットがサービスに渡される
- service はテンプレートユニットにする
    - Accept = yes の場合はそうしなければならない
    - 接続ごとのサービスになるから
- StandardInput/StandardOutput に socket に指定する
    - systemd が accept したソケットが標準入出力に設定される
    - StandardError に journal を指定しているけど何もしなければ StandardOutput と同じになる
Laravel5でのValidationMessageを日本語化してみた

Laravel5で入力チェックを実装した際、デフォルトのValidationMessageが英語だったので、日本語化しました。
その際の手順を下記で紹介していきます。
##環境
	MAC OSX EL Capitan ver 10.11.5
    PHP 7.0.0
	Laravel 5.2.41
		
##デフォルトのValidationMessageを確認する

お馴染のログイン画面

![スクリーンショット 2016-08-04 20.27.16.png](https://qiita-image-store.s3.amazonaws.com/0/128479/03768ec9-0862-8e07-b108-715067ffff51.png "スクリーンショット 2016-08-04 20.27.16.png")
 何も入力せずに「Login」ボタンを押下すると.... ↓

![スクリーンショット 2016-08-04 20.30.29.png](https://qiita-image-store.s3.amazonaws.com/0/128479/4374cb08-98b3-ba87-fab4-458e2262b760.png "スクリーンショット 2016-08-04 20.30.29.png")

required. あー「必須」入力か.....  
もちろんわかるのですが、日本語にしましょう笑  
では下記で設定ファイルをいじっていきます！ 
##localeをjaに変更する 
`config/app.php`を開き70行目くらいに`Application Locale Configurationen`という項目があるので、  
`en`を`ja`に変更する  
  
    
    'locale' => 'ja',  // 変更前は←en
##resources/lang配下にjaフォルダを作成する
同階層にあるenフォルダをコピーし、jaにリネームする  
下記のような構造になるはず！  
	
	resources
	 └── lang
	 		├── en
	 		│    └── validation.php
	 		└── ja
	     		 └── validation.php

##resources/lang/ja/validation.phpの中身を書き換える
	'required'     => ':attributeは必須です。', 

 上記のような感じで、一個一個変えていってもいいんですが、めんどくさい.....  
探してみたら、翻訳版をあげてくれている人が居ました！感謝！！
[https://gist.github.com/syokunin/b37725686b5baf09255b](https://gist.github.com/syokunin/b37725686b5baf09255b)

resources/lang/ja/validation.phpを上記URLで取得したvalidation.phpへ置き換えます。 
##再度画面でValidationMessageを確認してみる

![スクリーンショット 2016-08-04 21.36.10.png](https://qiita-image-store.s3.amazonaws.com/0/128479/b5e8b15a-2ca5-e5de-572c-f6d66cd5fb0d.png "スクリーンショット 2016-08-04 21.36.10.png")  
おっ！いいですね！日本語になりました！ ただここまで来たら欲を出して、項目名も日本語にしたいな〜

##項目名を日本語化する
`resources/lang/ja/validation.php`の100行目あたりに、`Custom Validation Attributes`という項目がある。  
そのすぐ下の`'attributes'`に定義を追加していく。  
この際、左辺の項目名をviewのname属性と一致させる必要がある。

	'attributes' => [
        'email'=>'メールアドレス',
        'password'=>'パスワード',
    ],　　
    
再度画面を確認する  
![スクリーンショット 2016-08-04 21.52.51.png](https://qiita-image-store.s3.amazonaws.com/0/128479/713e3483-74c8-e46f-1bf0-56f40d3b334b.png "スクリーンショット 2016-08-04 21.52.51.png")
  
今度は項目名も日本語化されました！
SwiftでUIWebviewのリクエストヘッダーをカスタムする


【参考記事】
[iOS UIWebViewでrequest http header をカスタムする方法](http://qiita.com/hikaruna/items/ba9fd3286d7265620914)

今回は初期ロード時のみヘッダーをいじる必要があったのでもっと簡単に。

```
class WebViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet weak var webView: UIWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.webView.delegate = self
        
        let request = NSURLRequest(URL: NSURL(string: "url")!).mutableCopy() as! NSMutableURLRequest
        
        // ヘッダにフィールドを追加
        request.setValue("value", forHTTPHeaderField: "field")
        
        // .mutableCopy()の戻り値を渡す
        self.webView.loadRequest(request)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
```
ブロック内でブロック要素を上下左右中央揃えにする技

# ブロックの中でブロックを上下左右中央にする簡単な方法


##意外と上下左右中央に配置するのは大変 

```index.html
<div class="wrapper">
    <p>この要素を上下左右中央に寄せたい</p>
</div>
```

左右中央に寄せるのはとても簡単

```index.css
.wrapper {
    text-align: center;
}
```

上下がなかなか難しい。

```index.css
.wrapper {
    postion: relative;
}
.wrapper p {
    position: relative;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: 0 auto;
    height: 50px;
    width: 50px;
}
```

ざっとこれだけの記述が必要になるし、`height``width`の記述が必要になって、要素の大きさによって完全に中央による保証がない。

## flex boxを使ってみる
flex boxに関する詳しい説明は[こちら](http://qiita.com/HiromuMasuda0228/items/baf8015076d7d90b8fea)

flex boxの左右中央寄せと上下中央寄せを同時に使ってみる

```index.html
<div class="wrapper">
    <p>この要素を上下左右中央に寄せたい</p>
</div>
```
```index.css
.wrapper {
    display: flex;
    justify-content: center; /*左右中央揃え*/
    align-items: center;     /*上下中央揃え*/
}
```
これだけでブロックの中のブロック要素が上下左右中央に配置される。
UnityEngine.ObjectとSystem.Objectの注意点

UnityEngine.ObjectとSystem.Objectはキャストできます。

```lang:UnityEngine.Objectコード抜粋

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using UnityEngine.Internal;
using UnityEngineInternal;
namespace UnityEngine
{
	[StructLayout(LayoutKind.Sequential)]
	public class Object
	{
		private int m_InstanceID;
		private IntPtr m_CachedPtr;
		private string m_UnityRuntimeErrorString;
		public extern string name
		{
略...
```

これはUnity側でどうこうしてるというわけではなく、C#の言語機能になります。
C#は**あらゆるクラスは基底クラスとしてSystem.Objectを継承している**という言語仕様があります。
Unityは.Net(C#)を使っています。そのため、C#仕様に則り先ほどのコードは暗黙的にSystem.Objectを継承しています。

```lang:実はこうなっている
namespace UnityEngine
{
	[StructLayout(LayoutKind.Sequential)]
	public class Object : System.Object {}
```

そのためUnityEngine.ObjectはSystem.Objectにキャスト可能になっています。

しかし、このせいでいくつか注意しておくべきことがあったのでまとめておきます。

##自作クラスはUnityEngine.Objectにキャストできない

例えば次のような自作クラスがあったとして、

```lang:自作クラスだよ
public class Hoge
{
	
}
```

これはSystem.Objectクラスを暗黙的に継承しています。

そのためUnityEngine.Objectにキャストしようとするとエラーが発生します。

```lang:キャスト失敗
Hoge hoge = new Hoge ();
UnityEngine.Object hoge2UnityEngine = (UnityEngine.Object)hoge; //コンパイルエラー発生
System.Object hoge2System = (System.Object)hoge; //OK
```

そりゃそうですよね。
もしUnityEngine.ObjectにキャストしたいならUnityEngine.Objectを継承させればOKです

```lang:キャストできるよ
public class Piyo : UnityEngine.Object
{
	
}
Piyo piyo = new Piyo ();
UnityEngine.Object piyo2UnityEngine = (UnityEngine.Object)piyo; //OK
System.Object piyo2System = (System.Object)piyo; //OK
```

間違いやすいので注意しましょう。

##自作コンポーネントはUnityEngine.Objectにキャストできる
例えばこんなコンポーネントがあったとして、

```lang:自作コンポーネント
using UnityEngine;

public class Test :MonoBehaviour
{

	void Start ()
	{
		
	}
}
```

自作コンポーネントはUnityEngine.ObjectにもSystem.Objectにもキャストできます。
自作コンポーネントの継承関係は次のようになっています。

```
自作 -> MonoBehaviour  -> Behavior  -> Component  -> UnityEngine.Object  -> System.Object
```

UnityEngine.ObjectもSystem.Objectも継承しています。
そのため２つともキャストできるのです。


##UnityEngine.Objectはいろいろオーバーライドしています。

```lang:toString関数
		[WrapperlessIcall]
		[MethodImpl(MethodImplOptions.InternalCall)]
		public override extern string ToString();
```

```lang:Equals関数
		public override bool Equals(object o)
		{
			return Object.CompareBaseObjects(this, o as Object);
		}
```


```lang:GetHashCode
		public override int GetHashCode()
		{
			return this.GetInstanceID();
		}
```


```lang:その他
		public static implicit operator bool(Object exists)
		{
			return !Object.CompareBaseObjects(exists, null);
		}
		public static bool operator ==(Object x, Object y)
		{
			return Object.CompareBaseObjects(x, y);
		}
		public static bool operator !=(Object x, Object y)
		{
			return !Object.CompareBaseObjects(x, y);
		}
```

##FindObjectOfType関数は自作クラスには使えない

FindObjectOfTypeのコードをみると次のようになっています。

```lang: FindObjectOfType
		public static T FindObjectOfType<T>() where T : Object
		{
			return (T)((object)Object.FindObjectOfType(typeof(T)));
		}
```

`where T : Object`のObjectはUnityEngine.Objectを指します。
自作クラスは基本的にはSystem.Objectを直接継承しているのでFindObjectOfTypeに使うことはできません。


各種注意しましょう。
UnityEngine.ObjectとSystem.Object紛らわしい・・・
&&とANDの違い

#はじめに
PHPで論理積を行う演算子、&&とAND、
および、論理積を行う演算子、||とOR、この違いを調べたのでまとめた

#違い
結論から述べると、&&とAND、この両者の違いは、
&&（AND）前後の式の結合度が異なる。

演算子の計算には、優先順序がある。例えば、以下のような加算と乗算では、乗算の方が優先される。
そのため、カッコを付けることで、加算を乗算よりも先に計算しようとする。
`例: 1 ＋ 2 * 3　=>　7`
`例: ( 1 + 2 ) * 3 => 9`

しかし、計算の優先順位が同じ場合は、結合性（右から評価をするにか、左から評価をするのか）によって計算の順序が決まる。
例えば、
「−」は、左結合のため、
`1 − 2 − 3 は （ 1 − 2 ） − 3 ` のように、計算される
一方、「＝」は、右結合のため、
`$a = $b= $c は、$a = ($b = $c) `のようになる

では、&&とANDについてである。
&&とANDでは、&&の方が演算子の優先順位が高い。
また、ANDは、「=」や、「+」「-」、「<」「>」などよりも優先順位が低い

そのため、
`$a = true && false;
=> $a に代入されるのは、(true && false) の評価結果
=> $a = false`

`$b = true and false; 
=> ($b = true ) and false
=> $b には true が代入される`

#まとめ
&&（||）を使いましょう。

参考
[演算子の優先順位]
(http://jp2.php.net/manual/ja/language.operators.precedence.php)
俺は！！！PHPのビルトインサーバをマルチプロセスにしたいしHTTPSで使いたいぞ！！！

# 動機

Guzzleの行き過ぎた抽象化があまり好みではないので，cURLとジェネレータでシンプルに気持ちよく非同期HTTPリクエストが書ける [mpyw/co](https://github.com/mpyw/co) を書いた

↓

それをベースに [FriendsOfPHP/Goutte](https://github.com/FriendsOfPHP/Goutte) そっくりのインタフェースを備えた，非同期スクレイピングクライアント [mpyw/coutte](https://github.com/mpyw/coutte) を書いてみた

↓

Coutteのテスト書きたいけど，SymfonyのBrowserKitのソースコード読んでも`@param array`とか雑な型説明しか無くて，どんな構造があり得るのかわかりにくかった

↓

実際にサーバ立ててテストしたいけど，普通のビルトインサーバだと同時リクエストさばけないしHTTPSの場合のテストができない

↓

これだけのためにApacheとかNginxに依存したくない，composer.jsonに書いておけばそれだけで解決する世界を手に入れたい

↓

**php-cli上にビルトインサーバへのリバースプロキシ立てればいいじゃないか！ （何故そうなった）**

**[mpyw/php-hyper-builtin-server](https://github.com/mpyw/php-hyper-builtin-server)**


# 使い方

dev-master ではツールっぽく仕上げました．ReactのSocketコンポーネントに関して，本家にPRが採用され次第，Stable出そうかと思います．

```
Usage:
    vendor/bin/hyper-run <options>

[Required]
    -S   Server URL such as "127.0.0.1:8080" or "https://127.0.0.1:8081".
         When protocol is omitted, it is assumed as "http://".
         When port is omitted, it is assumed as 80(http) or 443(https).
         Multiple arguments can be accepted.
         At least 1 server must be specified.
    -s   The same as -S but the default protocol is "https://".

[Optional]
    -n   The number of PHP built-in server clusters. Default is 10.
    -t   Path for document root. Default is the current directory.
    -r   Path for router script. Default is empty.
    -c   Path for alternative PEM-encoded certificate.
         Default is "....../certificate.pem".

[Restriction]
    - "https://" is supported only on PHP 5.6.0 or later.
    - Access logs are not displayed in Windows.
```

```
vendor/bin/hyper-run -S localhost:8080 -s localhost:8081 -t src/app/www
```

フォークするプロセスの数が前より圧倒的に少なくなっているので，コンピュータにも優しいです．

![スクリーンショット 2016-08-31 17.15.15.png](https://qiita-image-store.s3.amazonaws.com/0/25060/8fce636a-dd09-d3b5-af27-d79ef8d1afdf.png)

![スクリーンショット 2016-08-31 17.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/25060/65da6165-156a-ac40-c75e-f760e883a2a8.png)
Pythonで動的にゼロ埋めする方法


ちょっと考えさせられたので。

※ Pythonのバージョンは3.5.2を使っています。


# 動的でない場合
これはよく紹介されている方法で、基本文法だと思います。

```
'{0:05d}'.format(12)  #=> '00012'
```

ゼロ埋めとは関係ないですが、スペースで埋めるには以下のような感じですね。

```
'{0:5d}'.format(12)  #=> '   12'
```


# 動的にする場合
Pythonでは `{0:05d}` のようなフィールドに変数が使えないのでこの記法では「動的に桁数を指定して文字列を得る」ということができません。

なので、 以下の方法で実現することができます。

```python:
# -*- coding: utf-8 -*-

max = 10000  #<= これが動的になる想定

# 最大桁を得る
max_len = len(str(max))
# 対象の数値（今回は適当）
test = 123

### 対象の数値に対して最大桁でゼロ埋め ###
# `zfill`を使う場合
output = str(test).zfill(max_len)
print(output)  #=> '00123'

# rjustを使う場合
output = str(test).rjust(max_len,'0')
print(output)  #=> '00123'
```

`zfill` を使うことで引数で指定する桁数に変数が使えるようになるのを利用しています。

また、`rjust`を使えば、`0`以外の文字を第二引数に指定すればゼロ以外の文字で埋めることができます。
（`rjust`を使う方法は @matobaa san より教えていただきました。 thanx @matobaa san!）
ShinobiLayer: SoftLayerの物理サーバーでKVM Consoleを起動する方法

#1. はじめに
SoftLayerでは、物理サーバーを利用できるため、IPMI経由でアクセスすることも可能です。本記事では、IPMIにブラウザおよび専用クライアントを使って接続し、KVMコンソールにアクセスします。KVMコンソールにアクセスできれば、CDマウントを行ったり、サーバー上のOSでネットワークが構成されていなくても、直接OSにログインすることが可能です。

#2. IPMIにアクセスするためのIPアドレスとパスワードの確認方法
SoftLayerのCustomer Portalにおいて、Devices -> Device Listから対象の物理サーバーを選択し、Remote Mgmtのタブを選択します。下記画面において、Management IPがIPMIのアドレスを、Passwordがパスワードを表します。ユーザーはrootです。
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/39408e92-ff5b-c201-cb1b-b711af4c1a09.jpeg)


#3. IPMIへのアクセス方法
##3-1. ブラウザを使ってアクセスする方法
1. SSL VPN/PPTP VPNを使って、SoftLayerのPrivate NWにアクセスできるようにする。（SoftLayer上のサーバーから実行するのであれば、SoftLayerのサーバーはPrivate NWにアクセスできるのでVPNは不要です。）
2. 上記で確認した対象物理サーバーのIPMIのアドレスに対して、`https://<IPMIのアドレス>`でブラウザを使ってアクセスし、ID/Passwordを入力する。<br>![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/7daf736b-1170-e06d-d09f-55dfe5cc5984.jpeg)
そうすると、以下のようにIPMI Consoleにアクセスすることが可能です。
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c857b794-0fca-85ca-1676-5a92795f167c.jpeg)
3. 上記の画面にて、**Remote Console Preview**の黒い画面をダブル・クリックする。（launch.jnlpが起動します。セキュリティー的にブロックされる場合は許可を与えて下さい。）
![003-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/d30b88d9-0ac8-ba8c-1db6-198157183ab5.jpeg)<br>
最終的に、以下のようなコンソールが表示されるようになります。
![011.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4c16cd8e-85d3-b53f-cab4-c2a97071cde9.jpeg)

##3-2. 専用クライアント(IPMIView)を使ってアクセスする方法
ブラウザ経由でアクセスしても良いのですが、専用クライアントを利用する方法もあります。私個人としては、VPN接続した後に専用クライアントを起動すれば、（ID/Password情報を保管可能なので）対象サーバーをクリックすれば接続できるこちらのやり方の方が好みです。

##3-2-1. 専用クライアントの入手。
SoftLayerにSSL VPNで接続した後に、http://downloads.service.softlayer.com/ipmi/ からIPMIViewをダウンロードすることができます。（このサイトはSoftLayerのPrivate NW上に存在するため、SoftLayer上のサーバーから実行するのであればVPNは不要です。）現在は、Windows/Linux/Macに対応しているようです。もしくは、Supermicroのサイト（ftp://ftp.supermicro.com/utility/IPMIView/ ）からもダウンロード可能です。
##3-2-2. 専用クライアントを使ってアクセス
製品を導入後、
1) 管理者権限で起動（管理者権限で起動しないと、私の環境では構成情報を保存できませんでした。）<br>![020.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/84248f47-d60a-dfb7-0dfe-7142de86f8df.jpeg)
2) File -> New -> System <br> ![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c81db9cb-534e-847d-5ae7-55bd97574a31.jpeg)
3) 対象サーバを識別する名（任意）とIPアドレス接続情報を入力 <br>![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/dfefec9b-16e0-f47d-ca11-f763f35717e6.jpeg)
4) "IPMI Domain"のビューから今回作成したサーバーを選択し、Login ID/Passworrdを入力してLoginを行う。成功したら以下のように"Connected"という画面が表示される。<br>![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e71d9b0a-f168-e3a9-93d9-a50f17f9b9e5.jpeg)
5) KVM Consoleを使いたいときは、KVM Consoleのタブに移動して、Launch KVM Consoleを選択する。
![010.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/f57be04f-9c39-a470-a65e-36431589fa4e.jpeg)
最終的に、以下のようなコンソールが表示されるようになります。
![011.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4c16cd8e-85d3-b53f-cab4-c2a97071cde9.jpeg)
Githubで公開しているライブラリを Xcode8/Swift3 対応しました

[Github](https://github.com/tasanobu)で公開している下記のライブラリを Xcode8 / Swift3.0 に対応させました。
今後は、Xcode8 GMのリリースまで `swift3.0` ブランチでメンテしていく予定です。

- [TypedDefaults](https://github.com/tasanobu/TypedDefaults/tree/swift3.0)
  - TypedDefaults is a utility library to type-safely use NSUserDefaults
- [Misen](https://github.com/tasanobu/Misen/tree/swift3.0)
  - Script to support easily using Xcode Asset Catalog in Swift.
- [Kamagari](https://github.com/tasanobu/Kamagari/tree/swift3.0)
  - Simple UIAlertController builder class in Swift.
- [Otafuku](https://github.com/tasanobu/Otafuku/tree/swift3.0)
  - Otafuku provides utility classes to use WKWebView in Swift.
- [PercentEncoder](https://github.com/tasanobu/PercentEncoder/tree/swift3.0)
  - Lightweight library to escape string using so called URL encoding in Swift
【UnityEditor】EditorWindow上でキー入力を受け取る方法

#はじめに
EditorWindow上でのキー入力の検知、知らないと意外とはまるのでまとめてみました。

#EditorWindow上でキー入力を検知するには
Event.current を見ることでキーが押されたかどうかを判別することができます。

#ESCキーでEditorWindowを閉じてみる
実験として、ESCキーが押されたら閉じるEditorWindowを作ってみました。
ウィンドウにフォーカスが乗っている必要があります。

```TestEditorWindow.cs
using UnityEngine;
using UnityEditor;

public class TestEditorWindow : EditorWindow
{
    [MenuItem("EditorWindow/TestEditorWindow")]
    static void Open()
    {
        GetWindow<TestEditorWindow>();
    }

    void OnGUI()
    {
        var e = Event.current;
        if (e.type == EventType.KeyDown && e.keyCode == KeyCode.Escape)
        {
            Debug.Log("Close");
            this.Close();
        }
    }
}
```

ESCキーを押すとウィンドウが閉じます。(完
PHPでExceptionがcatchできずにハマった

Laravelで開発している際に以下のように`try``catch`をしているのに、例外発生時にcatchされずにフツーにエラーページが表示されてしまった。

```
try{
    // 処理
}catch(Exception e){
    // 例外処理
}
```

Laravelに限らず、namespaceを使用しているとそのnamespace内のExceptionクラスを待ち受けるため、通常のExceptionとは別のクラスだと判断されるようだ。
クラス名に`\`をつければnamespaceの縛りがなくなるので、以下のように記述すればcatchされて解決。

```
try{
    // 処理
}catch(\Exception e){
    // 例外処理
}
```
Remove default Apps from Windows 10

Windows10 付属の標準アプリを削除する手順です。
PowerShell で実行します。

<pre>
## RemoveDefaultAppsFromWindows10.ps1
# URL: https://thomas.vanhoutte.be/miniblog/delete-windows-10-apps/

#Remove 3D
Write-Host "削除完了： 3D"
Get-AppxPackage *3d* | Remove-AppxPackage

#Remove Camera
Write-Host "削除完了： Camera"
Get-AppxPackage *camera* | Remove-AppxPackage

#Remove Mail and Calendar
Write-Host "削除完了： Mail and Calendar"
Get-AppxPackage *communi* | Remove-AppxPackage

#Remove Money, Sports, News and Weather
Write-Host "削除完了： Money, Sports, News and Weather"
Get-AppxPackage *bing* | Remove-AppxPackage

#Remove Groove Music and Film & TV
Write-Host "削除完了： Groove Music and Film & TV"
Get-AppxPackage *zune* | Remove-AppxPackage

#Remove People
Write-Host "削除完了： People"
Get-AppxPackage *people* | Remove-AppxPackage

#Remove Phone Companion
Write-Host "削除完了： Phone Companion"
Get-AppxPackage *phone* | Remove-AppxPackage

#Remove Photos
Write-Host "削除完了： Photos"
Get-AppxPackage *photo* | Remove-AppxPackage

#Remove Solitaire Collection
Write-Host "削除完了： Solitaire Collection"
Get-AppxPackage *solit* | Remove-AppxPackage

#Remove Voice Recorder
Write-Host "削除完了： Voice Recorder"
Get-AppxPackage *soundrec* | Remove-AppxPackage

#Remove Xbox
Write-Host "削除完了： Xbox"
Write-Host "次に表示されるエラーメッセージは無視してください"
Get-AppxPackage *xbox* | Remove-AppxPackage

Write-Host "終了しました"

## End
</pre>