OmniAICreator/Qiita-1.07M huggingface dataset:
DynamoDBへのアクセス

DynamoDBに関する基本的な内容をまとめてみたものです。DynamoDBに関する、Web上にすでにある良識な解説コンテンツをまとめたサイトの抜粋です。
[DynamoDBへのアクセス] (https://www.techcrowd.jp/dynamodb/access/)


# [データモデルとAPI](https://www.techcrowd.jp/dynamodb/access/)

DynamoDBではデータ項目に対する更新およびクエリなどの操作を、AWS Management Console または APIを介して行います。CreateTable API を使用してテーブルを作成したら、PutItem API または BatchWriteItem API を使用して項目を挿入できます。テーブルに追加した項目は、GetItem や BatchGetItems を使用して、または Query API を使用して (テーブルで複合プライマリキーが有効化されており使用されている場合) 取得できます。

またDynamoDB ストリームは、過去 24 時間以内にテーブルのデータに対して行われた項目レベルの変更を時系列ストリームとして提供したものですが、簡単な API 呼び出しでストリームにアクセスできます。ストリームを使用すると、変更された直近の DynamoDB で他のデータストアを最新の状態に維持したり、テーブルに対する変更内容に基づいてアクションを実行したりできます。

各種言語向けの公式SDKが用意されています。
 
 
# [DynamoDB API: コントロールブレインとデータブレイン] (https://www.techcrowd.jp/dynamodb/access/)

コントロールプレーンの操作では、DynamoDB テーブルを作成、管理できます。また、インデックス、ストリーム、およびテーブルに依存する他のオブジェクトを操作できます。

- CreateTable – 新しいテーブルを作成します。オプションで、1 つ以上のセカンダリインデックスを作成し、テーブルに対して DynamoDB Streams を有効にできます。
- DescribeTable – プライマリキーのスキーマ、スループット設定、インデックス情報など、テーブルに関する情報を返します。
- ListTables – リストのすべてのテーブルの名前を返します。
- UpdateTable – テーブルまたはそのインデックスの設定を変更、テーブルの新しいインデックスを作成または削除、またはテーブルの DynamoDB Streams 設定を変更します。
- DeleteTable – テーブルとそのすべての依存オブジェクトを DynamoDB から削除します。

データプレーンオペレーションでは、テーブルのデータで、作成、読み込み、更新、および削除 (CRUD とも呼ばれます) アクションを実行できます。一部のデータプレーンオペレーションでも、secondary index からデータを読み込むことができます。

    PutItem – 新しい項目を作成するか、古い項目を (すべての属性を含め) 新しい項目で置き換えます。指定したテーブルに同じプライマリキーを持つ項目が存在する場合、既存の項目は新しい項目に完全に置き換えられます。条件付き 演算子を使用して、所定の条件に一致する属性値を持つ項目のみを置き換えたり、その項目が存在しない場合にのみ新しい項目を挿入したりすることもできま す。
    BatchWriteItem – 1 回のトランザクションとしてではなく、1 回のリクエストにより複数のテーブル間で複数の項目を挿入、置換、削除します。Put または Delete で最大 25 項目のバッチをサポートし、合計リクエストサイズは最大 16 MB です。
    UpdateItem – 既存の項目の属性を編集します。条件付き演算子を使用して、項目の属性値が所定の条件に一致する場合にのみ更新を実行することもできます。
    DeleteItem – プライマリキーを使用してテーブルから 1 つの項目を削除します。条件付き演算子を使用して、項目の属性値が所定の条件に一致する場合にのみ項目を削除することもできます。

    GetItem – GetItem 演算は、プライマリキーに一致する項目の属性セットを返します。GetItem 演算は、デフォルトでは、結果的に整合性のある読み込みを提供します。ご利用のアプリケーションで結果的に整合性のある読み込みを使用できない場合は、 ConsistentRead を使用します。
    BatchGetItems – BatchGetItems 演算は、複数の項目の属性を複数のテーブルから、それぞれのプライマリキーを使用して返します。16 件の応答のサイズ制限は 1 MB で、最大 100 個の項目を返します。強い整合性と結果整合性の両方をサポートします。
    Query – テーブルのプライマリキーを使用して、または、セカンダリインデックスからインデックスキーを使用して、1 つ以上の項目を取得します。比較演算子や式を使用すると、テーブルのクエリの範囲を絞りこむことができます。また、非キー属性に対してフィルタを使用する ことで、クエリ結果をフィルタリングすることもできます。強い整合性と結果整合性の両方をサポートします。応答 1 件あたりのサイズ上限は 1 MB です。
    スキャン – テーブルまたはセカンダリインデックスの全体をフルスキャンして、すべての項目および属性を取得します。リターンセットを制限するには、1 つまたは複数の属性と照合するフィルタを指定します。



# [DynamoDB API: DynamoDB Streams] (https://www.techcrowd.jp/dynamodb/access/)

DynamoDB Streams API を使用すると、開発者は、更新を使用して変更する前後の項目レベルのデータを受け取ることができます。それを使用して、DynamoDB を基礎として構築されたアプリケーションにお好みの拡張機能を作成できます。

DynamoDB ストリームはテーブルごとに有効にする必要があります。既存の DynamoDB テーブルで DynamoDB ストリームを有効にするには、AWS マネジメントコンソールからテーブルを選択し、[Overview] タブを選択し、[Manage Stream] ボタンをクリックし、表示のタイプを選択し、それから [Enable] をクリックします。

• Liststreams：すべてのストリームのリスト、または特定のテーブルのストリームのみを返します。

• DescribeStream：Amazon リソースネーム (ARN)、アプリケーションが最初のいくつかのストリームレコードの読み込みを開始できる場所など、ストリームに関する情報を返します。

• GetShardIterator：シャードイテレーターを返します。これは、ストリームからレコードを取得するためにアプリケーションが使用するデータ構造です。
Microsoft Azureって何？

から始まってこれまで得た知識をまとめてみる。

# Azureとは？
## 概要
マイクロソフトが提供している[クラウドサービス](https://azure.microsoft.com/ja-jp/)。
従来のレンタルサーバーにサービスてんこ盛りにしたもので、
これを使えばネットサービスが簡単に作れますよ、というもの。

Iaas, PaaS, SaaSのサービスを提供している。
![image](https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/89/67/metablogapi/8540.CloudServicesCompare_thumb_5BC81666.jpg) 
[[リンク元](https://blogs.technet.microsoft.com/xdot509/2013/07/24/getting-started-with-windows-azure-part-2-what-are-cloud-services/)]

# SaaS(サース)として使う場合
要するにエンドユーザ向けのWebアプリケーションのこと。
Office365とかもAzureで動いているらしい。

# PaaS(パース)として使う場合
ハードとかOSとかWebサーバーだとかの一式を提供し、ユーザはその上でアプリの開発を行える形態。
普通のWebサイトとかWebアプリ、Bot開発とか出来て、対応言語もC#, Java, PHP, node.js, Pythonなど。
最近人気の機械学習、ディープラーニングもここ。

で、オートスケール機能で、急にアクセス数が増えた場合に自動でサーバー台数を増やすことも出来る。

サービスの種類としては例えば以下のようなものが有る。
- [Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/web/): Webサイト, Webアプリ, WebAPIプラットフォーム。ローカルでアプリを開発してサイトにアップ(デプロイ)する。
- [Mobile Apps](https://azure.microsoft.com/ja-jp/services/app-service/mobile/): iOSとかAndroidとか、モバイルアプリのサーバー側プラットフォーム(プッシュ通知対応)
- [Cognitive Services](https://azure.microsoft.com/ja-jp/services/cognitive-services/): 人工知能的なサービス（音声認識だとか翻訳とか）
- [Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/) 機械学習とかディープラーニングのサービス
- [Bot Service](https://azure.microsoft.com/ja-jp/services/bot-service/): Bot開発プラットフォーム
- [Function App](https://azure.microsoft.com/ja-jp/services/functions/): タイマーとかWebHookとかをトリガーに動くシンプル機能(Azure Functionsと呼ばれている)。開発もポータル上で関数を1個書くだけで良くて楽。GitHubからソースを取得する機能も有るので、バージョン管理も問題無し。
- [Logic Apps](https://azure.microsoft.com/ja-jp/services/logic-apps/): 既存のサービスどうしを繋ぎ合わせるサービス(例えば、Twitterに、あるキーワードを含む投稿が行われたら、それをメールで送信するとかOneDrive,GoogleDriveにファイル保存するとか出来るみたい。YahooのmyThingsと同じサービスっぽい)

沢山あるんで、[Azure portal](https://azure.microsoft.com/ja-jp/)の上のタブから「ソリューション」「製品」「ドキュメント」を参照のこと。

(2017/04/09 追記)
この記事で色々なサービスの説明がされてますね。
[まだ知らない人のための最新Microsoft Azure入門](http://www.buildinsider.net/web/azure/01)


# IaaS(イァース)として使う場合
サーバーだとかロードバランサーだとかのインフラを提供して、
ユーザがそれを組み合わせて好きなＯＳ環境をセットアップ出来る形態。

Windows Serverは当然ながら、Ubuntu Server, Red Had, CentOSとかも用意されているし、
データベースサーバー用途として、SQL Server, Oracle, MySQL, PostgreSQLとか選べる。
さらにはLAMP構成とかVisual Studioがプレインストールされている環境とかJenkins入りなんてのも有る。
![image](https://qiita-image-store.s3.amazonaws.com/0/120192/42acebc4-d45f-97a9-119b-c78577aff1ef.png)

Ubuntu Serverの例
CPUのコア数、メモリサイズ、ディスクサイズだとか選べる。
![image](https://qiita-image-store.s3.amazonaws.com/0/120192/b117fdf1-7cfe-5e33-e69e-ca51426d7c47.png)

ロードバランサー(負荷分散)とかVPN接続も対応している。
![image](https://qiita-image-store.s3.amazonaws.com/0/120192/c4acdd54-9406-539d-67b1-51a3bb56039d.png)
【Laravel】Laravelにて簡単にIDE補完を有効にする方法

## はじめに
「`Ro`と打ったら`Route::`と補完して欲しい…」などのように、IDEでlaravelの補完して欲しい。
でも毎度`composer`で[Laravel 5 IDE Helper Generator](https://github.com/barryvdh/laravel-ide-helper/blob/master/readme.md)のインストールとか面倒だし、すべての開発環境で`composer`が使用出来るとも限らない。でも補完して欲しい。

調べてみると、ファイルをlaravelホームディレクトリに追加するだけでIDEでの補完が出来るようになりました。

## 解決法

https://gist.github.com/barryvdh/5227822

上記リンクから`_ide_helper.php`をダウンロードし、laravelのホームディレクトリ(`artisan`や`.env`と同じディレクトリ)に追加するだけ。

これで新しいプロジェクトに入っても楽に補完出来るようになりました。

当方**IntelliJ IDEA**を使用しているため`laravel Plugin`との相性も良く満足です。
Securing OpenAM 実践Ⅴ

Forgerock Access Management 5 (OpenAM 14？)のドキュメントが公開されているように見えるけど... とりあえず投稿。

# goto・gotoOnFailパラメータのバリデーション設定を行う


> Set the list of Valid goto URL Resources. By default, OpenAM redirects the user to the URL specified in the goto and gotoOnFail query string parameters supplied to the authentication interface in the login URL.

> To increase security against possible phishing attacks through open redirect, you can specify a list of valid URL resources against which OpenAM validates these URLs. OpenAM only redirects a user if the goto and gotoOnFail URL matches any of the resources specified in this setting. If no setting is present, it is assumed that the goto or gotoOnFail URL is valid.

> To set the Valid goto URL Resources, use the OpenAM console, and navigate to Realms > Realm Name > Services. Click Add, select Validation Service, and then add one or more valid goto URLs.

>When setting valid goto URLs, you can use the "*" wildcard, where "*" matches all characters except "?". For more specific patterns, use resource names with wildcards as described in the procedure, Configuring Valid goto URL Resources .

gotoパラメータとgotoOnFailパラメータはそれぞれOpenAMの認証成功後・失敗後にリダイレクトするURLを指定するパラメータとのこと。
ドキュメントの以下の箇所にパラメータの説明が記載されています。

> https://backstage.forgerock.com/docs/openam/13/admin-guide#authn-from-browser-parameters

PolicyAgentをインストールしたシステムにアクセスし、OpenAMに認証が要求されるとき、以下のようにgotoパラメータが付いたURLになっていました。PolicyAgentからOpenAMにリダイレクトされる際に登場するパラメータらしい。

> http://openam.auth.com/openam/XUI/#login/&goto=http%3A%2F%2Fpolicyagent.auth.com%3A

ここで認証に成功すれば、
http://policyagent.auth.com
にリダイレクトされることになります。gotoもしくはgotoOnFailのパラメータを付け、OpenAMで認証させた後、フィッシングサイトなどに誘導することができるので、gotoおよびgotoOnFailのパラメータのURLのバリデーションを行いましょうということらしい。

[REALM]-[レルム名]-[Services]-[Validation Service]を追加します。

![add_validation_service.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/40c601ae-5c92-3abc-fd1d-9e4db9c95ded.jpeg)

以下の画面でgotoパラメータに設定する有効なURLを指定することができます。ワイルドカードも使用できるので、対象システムのURLを設定しておけばよさそうですね。

![validation_service.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/622435ef-4b95-02df-f65a-b16350067730.jpeg)

ドキュメントの以下にも設定方法の記載がありました。

> https://backstage.forgerock.com/docs/openam/13/admin-guide#configure-valid-goto-url-resources

ここで個人的に以下の2つの疑問がありました。

Q1.設定画面には「Valid goto URL Resources」と記載されているけどgotoOnFailにも有効な設定なのか？

⇒やはり「goto」と記載されているだけあって、gotoOnFailパラメータのときには効果が見られませんでした。gotoOnFailパラメータのバリデーションはどこでできるのかもう少し調べるか...

Q2.gotoおよびgotoOnFailのパラメータが有効なURLでなかった場合、どのような動作になるのか？

⇒認証したユーザ自身のOpenAMプロファイル編集画面にリダイレクトされました。

PolicyAgentをインストールしているシステムのURLは設定しておいた方がよさそうですね。
boto3の例外ハンドリング

boto3を使ってるときに、存在しないS3のオブジェクトを読み込んだ時のエラーハンドリングがしたかった時に調べたことをメモ。

NoSuchKeyのエラーが返るけど、動的に生成される例外クラスのようで、インポートしてexcept節に記述できない。

stackoverflowに対応方法が書いてた。
http://stackoverflow.com/questions/33068055/boto3-python-and-how-to-handle-errors

以下、抜粋。

```py
import boto3
from botocore.exceptions import ClientError

try:
    iam = boto3.client('iam')
    user = iam.create_user(UserName='fred')
    print "Created user: %s" % user
except ClientError as e:
    if e.response['Error']['Code'] == 'EntityAlreadyExists':
        print "User already exists"
    else:
        print "Unexpected error: %s" % e
```

botocore.exceptionsのClientErrorとして例外をキャッチして、response['Error']['Code']の値でエラー内容を確認する。
Android開発でGoogleMapがクラッシュした時の対応


# 概要
Android開発でGoogleMapを導入した時に、
MapViewがクラッシュ・フリーズすることがありました。
クラッシュログは、出力されたりされなかったり...

その時の対応方法を書きます。

# 問題が起きた時のパターン
1. 画面がフリーズする → 応答なしダイアログ表示
2. アプリが強制終了する（強制終了ダイアログ表示）
3. アプリが強制終了する（強制終了ダイアログが表示されない）

# 問題が起きた時のログ

強制終了のダイアログが表示されるパターンでのみ、Logcatのエラーログを確認できました。
根気よく、再現を試してください。


```java:logcat
!!! FAILED BINDER TRANSACTION !!!  (parcel size = 3124236)
W/art: Suspending all threads took: 5.218ms
E/AndroidRuntime: Error reporting crash
    android.os.TransactionTooLargeException: data parcel size 3124236 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:503)
        at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4425)
        at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:90)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

```

# 原因は...情報量が多すぎる！？

`TransactionTooLargeException` ということなので、
大きすぎるデータの受け渡しがされているらしい。。
GoogleMapの内部で。。。
よくわからんけど。

確かに、タブレットのNexus7だと再現率がめっちゃ高い。
しかも、なぜか東京駅周辺で発生する。。
なんかそんな気がするけど、本当に！？w

# 対応方法

下記のように、インドアマップを取得しないようにしました。
根本解決ではないです。が、手元での再現は0になりました。

```java:MapHogeHoge.java
@Override
public void onMapReady(GoogleMap map) {
    this.map = map;
    this.map.setOnMarkerClickListener(this);

    // 情報量が多すぎでMapViewが android.os.TransactionTooLargeException を吐いて
    // 勝手にクラッシュする(Nexus7で再現)
    // MapView内部処理なので何も手出しができなかったから、この設定で情報量を制限している
    this.map.setIndoorEnabled(false);
```


# 最新のGoogleMapで再現してます

問題が発生していたアプリの開発環境です。
ちなみに、MapFragment,MapViewの両方とも再現してました。

```gradle:build.gradle
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
        ...
}

dependencies {
	# 2017/4/1時点で最新
	com.google.android.gms:play-services-maps:10.2.1 
	...
}
```

# 対応後の愚痴

この問題、一番凶悪だなーって思ったのが、[AndroidのGoogleMapサンプル](https://github.com/googlemaps/android-samples)で再現しないんです。
それは、なぜか？サンプルはオーストラリアのシドニーあたりを参照しているから。
東京と比べてデータ量が少ないんだと思います。

サンプルプロジェクトで位置情報だけを東京に変更すると、同じ問題が再現しました。ぐぬぬ。
（知ってて隠してたんじゃないのか...Google様よ）

かなり手強い不具合でした。
これを読んで、同じ問題にぶち当たっている開発者を救えたら幸いです。
Python でライブラリ関数のオーバーライド

やりたいことはタイトルの通りなので、前置きは飛ばしても良いです。

# 背景、前置き

Google API Client Library を使ってGoogle Calendar いじるアプリを書いていた。Google Cloud Platform からOAuth2のクライアント情報を `client_secret.json` として落としてきて、その **ファイル名** を `oauth2client.client.flow_from_clientsecrets()` の引数に指定する。

ここで問題。セキュリティ上の問題でgitのバージョン管理に `client_secret.json` を加えたくない。かといって Heroku でアプリを動かしているので、ファイルをアップロードできない。（Amazon S3などのオブジェクトストレージを使えば良いらしいのだが、使ったことがなかったのでめんどくさいのでやめた）

ようするに、 `client_secret.json` を指定しなければならないのに、そのファイルをHerokuサーバーに置けなくて困ったということである。

ということで、 `oauth2client.client.flow_from_clientsecrets()` 関数に `ファイル名` ではなく辞書型データを入れるようにしたい。そしてHerokuの環境変数に `client_secret.json` の内容をそれぞれ格納して、それを辞書データに落とし込めば良い。 
(環境変数に機密情報入れるの良くないってマジ？)

## 追記
普通に `OAuth2WebServerFlow` のインスタンスを作れば良かったということにコード書いてから気づきました。よって別にオーバーライドなんてしなくて良いのですが、オーバーライドこうやってできるんだねってことで知見になったので残しておきます。

# やりたいこと

`oauth2client.client.flow_from_clientsecrets()` 関数に **ファイル名** ではなく **辞書型** を入れるようにしたい。

# どうしたか   

ライブラリのソースコードはこんな感じだった。
(以降は、Google Inc. のApache license コードより抜粋)

`oauth2client.client.py` より一部省略。

```
@_helpers.positional(2)
def flow_from_clientsecrets(filename, scope, redirect_uri=None,
                            message=None, cache=None, login_hint=None,
                            device_uri=None, pkce=None, code_verifier=None):
    try:
        client_type, client_info = clientsecrets.loadfile(filename,
                                                          cache=cache)
        if client_type in (clientsecrets.TYPE_WEB,
        -----以下略------
```

注目するのは `filename` が `clientsecrets.loadfile()` に渡されているということ。
さらに `clientsecrets.loadfile()` を見てみた。

```
def loadfile(filename, cache=None):
    _SECRET_NAMESPACE = 'oauth2client:secrets#ns'

    if not cache:
        return _loadfile(filename)

    obj = cache.get(filename, namespace=_SECRET_NAMESPACE)
    -----以下略------
```

`cache` が存在しない場合、 `_loadfile` 関数に処理を移譲してる。 `_loadfile` を見てみよう。

```
def _loadfile(filename):
    try:
        with open(filename, 'r') as fp:
            obj = json.load(fp)
    except IOError as exc:
        raise InvalidClientSecretsError('Error opening file', exc.filename,
                                        exc.strerror, exc.errno)
    return _validate_clientsecrets(obj)
```

ファイルをロードしてる関数にたどり着いた。この関数をオーバーライドすれば `filename` 引数に辞書型をぶちこめるのではないか。

ということで以降は自分のコード

```
# `client.flow_from_clientsecrets` 関数が引数に辞書型を取れるように
# `clientsecrets._loadfile` 関数をオーバーライドする
def new_loadfile(data):
    return clientsecrets._validate_clientsecrets(data)
clientsecrets._loadfile = new_loadfile
```

こうすれば以降

```
flow = client.flow_from_clientsecrets(
    辞書型,
    scope='https://www.googleapis.com/auth/calendar',
    redirect_uri=flask.url_for('oauth2callback', _external=True))
```

のように 辞書型を引数に取る `flow_from_clientsecrets` が使えるようになった。

# まとめ

```
def new_func(args):
    # いろんな処理
    return hoge
hoge_library.func = new_func
```

こうすれば簡単にオーバーライドできて、その関数を使う関数全てに影響するんだね。

ライブラリ関数のオーバーライド初めてやったけど、こんな簡単にちゃんと動くんだなー。怖いけど。
GitHubのissueとcommitを紐付ける

Gitを使う時の小技を共有してもらったのでメモ。

## 関連するissueページへのリンクを自動で貼ってくれる

commitする際にメッセージに「#issueの番号」を入れると、該当するissueページに自動でリンクを付与してくれる。

```
 git commit -m "README.md #2 修正 "
```

GitHubリポジトリtopやcommitのタブにてみると「#issue番号」のところにリンクが付与されていることが確認できる。

▼GitHubリポジトリtop
<img width="1002" alt="スクリーンショット 2017-04-01 17.03.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/d1a5566b-d896-e686-9618-c414f0c0c6af.png">

▼commitのタブ
<img width="1000" alt="スクリーンショット 2017-04-01 17.07.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/fa6362c9-0109-40df-a939-7148710eaa8c.png">

### プルリクのメッセージでも同様の機能が使える


## commitメッセージで関連するissueを自動でcloseする

commitする際にメッセージに「close #issueの番号」を入れると、該当するissueを自動でクローズしてくれる

```
git commit -m "README.md create close #1"
```
<img width="1140" alt="スクリーンショット 2017-04-01 16.56.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/386508f1-2f41-4c1f-02c1-a90000017b18.png">


### プルリクの場合
プルリクのメッセージでも同様の機能が使えて、プルリクの場合にはマージされたタイミングでcloseされる
java - コメントについて統一したこと

Doxygen を使用するにあたって javaコメント を統一した時のメモ

##1. ヘッダーコメント

```ruby:test.java
/*
 *
 * @Title      : ${PACKAGE_NAME}
 * @Description:
 * @company    : ** corp
 * @history    : Created by ${USER} on ${DATE}.
 *
 */
public class ${PACKAGE_NAME} {
    /* constractor */
    ${PACKAGE_NAME} () {
        ...
    }
    ...
}
```
以上をテンプレートに入れておき、クラス作成時に自動入力します。
@Titleにクラス名を記載します
@Description にクラスの概略を記述します
@company に作成者、もしくは会社を記述します
@history に作成日、もしくはModified した日を記入します

##2 メソッドコメント
```ruby:test.java
/**
 *  @brief  This function is called by the application to add ...
 *  @param len  Length
 *  @param data Data
 *  @param src  Src
 *  @return     result
 *  @since      ticket no.
 */
private bool storeData(int len, int data, int src)
{
    ...
}
```
@brief に メソッドの概略を記載します
@param パラメータの詳細を記載します。データがどのような種類か、どんな範囲か記載すると後工程でわかりやすいです。
@return 返却値を記載します。これもデータの種類、範囲を記載するとわかりやすいです。

コメント生成ツールに登録しておき、自動で記入できるようにしておきます。
個人的にはVisual Studio Code が良いです。

##3 プロパティコメント
一行一行に記載するのではなく、実行単位での記載とします

```ruby:test.java
 // @summary The Name property ...
```

##4 まとめ
自分的には、コメントはこのくらいゆるくしておいて、
後はDoxygenの設定でどうにかする派
iOS10.3 APFSの対処

やらかしたので反省文

iOS10.3にてファイルシステムが HFS+からAPFSに強制変換されましたが
濁点など含むファイル名にてfopenなどの下位関数にアクセスする際
Stringなどからconst char* への変換は
UTF8String ではなく fileSystemRepresentation を使いましょう。


### ざくっと調べた

検証コードを整えるのが面倒なので結果だけ

合成された普通のもの NFC :  "だ" 3080 (1文字は1文字)
正規化分解NFD : "だ" 305F 3099 (濁点分割して検索なんかも楽しそうよね)

HFS+でもAPFSでもファイル名は正規化分割NFDされて保存される （前からそう)

HFS+では分割されていてもいなくても(NFD,NFC)同じNFDファイル名にアクセスできる、おそらくどこかでうまく処理してくれていたのだろう

APFSではfopenなどの下位関数はNFCそのままにアクセスされる、変換処理してくれない (ここが問題）

よってAPFSではNFC,NFDのファイル名が2つできたり、NFC名でアクセスした際ファイルが無いなどの問題が起こる
(これでNFCなファイルが出来るとbackupなんかでも問題起きたりするとか)

NSFileManagerなどの上位関数でのファイル処理は問題ない
(objc的に書いているけれども)swiftも問題は同じ

対処としては、ファイル名などは普通StringなりURLなりで持っていると思われ、
fopenなどの低位関数にてアクセスする際のファイル名は const char* に変換することになると思われるので、
このStringなりからconst char*への変換をUTF8StringではなくfileSystemRepresentation (これはファイルシステムに対応してNFDなりの処理をしてくれる)で行う。

CFStringNormalize((CFMutableStringRef)なにか, kCFStringNormalizationFormD);
でもNFD変換できるが、ここは素直にファイル系のAPIに従おう。

NSURLのメソッドなのでNSStringとかからなら
[[NSURL fileURLWithPath:self] fileSystemRepresentation]; 
てのでもよい。(相対パスからだと少し注意)

ファイルシステムとAPIの問題で、今までうまく処理していてくれただけに、バグと判断したくもなるﾖﾅ。

ざくっとなので内容に関しては自分で確認してね。

https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/APFS_Guide/FAQ/FAQ.html#//apple_ref/doc/uid/TP40016999-CH6-DontLinkElementID_3

追記
NFCなファイル名は存在するべきではないし、
ファイルのcreate/writeには上記に気をつけていれば問題ないがreadの場合、
NSFileManagerなどの上位関数ではNFCなファイル名のものは無いものとして処理される。
fileExistsAtPathなどではfalse
だがcontentsOfDirectoryAtPathではNFCなままリストアップされて返ってくる。
上位関数レベルで見ると、あるらしいけれどアクセスできないってファイルになるという。

そんなの作らなければいいのだけれど、windowsのiTunes転送だと、NFCなファイル名なまま作成されてしまう恐ろしい罠が。（あ、もうapple自身がやっちゃてるならバグよね）
Chainer で手書き数字認識(MNIST)

# 概要

定番の手書き数字データセット MNIST を Chainer を使用して3層のニューラルネットワークで学習してみました。

# 3層ニューラルネットワーク

Chainer では、MNIST のデータを自動的にダウンロードして使用できる便利なメソッドが用意されています。それを使って、3層ニューラルネットワーク（2つある隠れ層のノードはそれぞれ 50)で学習を行い、正答率(accuracy)を測定しました。下のコードは、Chainer の [MNIST サンプル](https://github.com/pfnet/chainer/blob/master/examples/mnist/train_mnist.py) を下敷きにしていますが、大幅に変更を加えてあります。

# コード

```python:neural_net.py
import numpy as np
import chainer
from chainer import Chain, Variable
import chainer.functions as F
import chainer.links as L

class NeuralNet(chainer.Chain):
    def __init__(self, n_units, n_out):
        super().__init__(
            l1=L.Linear(None, n_units),
            l2=L.Linear(n_units, n_units),
            l3=L.Linear(n_units, n_out),
        )

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return self.l3(h2)

def check_accuracy(model, xs, ts):
    ys = model(xs)
    loss = F.softmax_cross_entropy(ys, ts)
    ys = np.argmax(ys.data, axis=1)
    cors = (ys == ts)
    num_cors = sum(cors)
    accuracy = num_cors / ts.shape[0]
    return accuracy, loss

def main():
    model = NeuralNet(50, 10)

    optimizer = chainer.optimizers.Adam()
    optimizer.setup(model)

    train, test = chainer.datasets.get_mnist()
    xs, ts = train._datasets
    txs, tts = test._datasets

    bm = 100

    for i in range(100):

        for j in range(600):
            model.zerograds()
            x = xs[(j * bm):((j + 1) * bm)]
            t = ts[(j * bm):((j + 1) * bm)]
            t = Variable(np.array(t, "i"))
            y = model(x)
            loss = F.softmax_cross_entropy(y, t)
            loss.backward()
            optimizer.update()

        accuracy_train, loss_train = check_accuracy(model, xs, ts)
        accuracy_test, _           = check_accuracy(model, txs, tts)

        print("Epoch %d loss(train) = %f, accuracy(train) = %f, accuracy(test) = %f" % (i + 1, loss_train.data, accuracy_train, accuracy_test))

if __name__ == '__main__':
    main()


```
# 実行結果
```
Epoch 1 loss(train) = 0.242552, accuracy(train) = 0.926683, accuracy(test) = 0.924800
Epoch 2 loss(train) = 0.175040, accuracy(train) = 0.946167, accuracy(test) = 0.942000
Epoch 3 loss(train) = 0.133406, accuracy(train) = 0.959050, accuracy(test) = 0.954400
...
Epoch 98 loss(train) = 0.002298, accuracy(train) = 0.999267, accuracy(test) = 0.971300
Epoch 99 loss(train) = 0.002876, accuracy(train) = 0.998917, accuracy(test) = 0.972900
Epoch 100 loss(train) = 0.003336, accuracy(train) = 0.998917, accuracy(test) = 0.973500
```

# 解説

1エポック(epoch)は、600回のイタレーション(iteration)で構成されています。100エポック後に、訓練(train)データに対する正答率は、99.9%、テストデータに対する正答率は97.3%となっています。Optimizer は SGD も試しましたが、Adam のほうがはるかに学習速度が速かったです。上記のコードの他に、各層のノードの数を少し増やしたり、層を1つ増やして4層にしたりもしてみましたが、正答率に大きな違いはありませんでした。

# 感想
「ゼロから作る Deep Learning」を読んで5ヶ月が経ちましたが、ようやく Chainer で実装するところまでたどり着きました。当たり前ですが、やはりフレームワークを作ると非常にすっきりと記述できますね。今回のコードを記述するにあたり、Chainer の Link, Chain, Optimizer クラスあたりのソースコードを読み込みました。とても簡潔にかかれており、読めばちゃんと理解できるのには感動しました。徐々に Chainer がわかってきた感があります。

# 参考文献
[Chainer 本家ドキュメント](http://docs.chainer.org/)
macOS Sierra にしたらWifi接続出来なくなった

OS X El Capitan から macOS Sierra にアップグレードしたら
Wifiが使えなくなった。  
  
色々と調べると、OS のバージョングレードダウンや  
バックアップからの復元で対応する記事がちらほら。  
  
・・・バックアップしてない。詰んだと思った。  
  
なんとか解決したのでメモします。
あくでも私の環境で解決した方法を記載します。

環境
・MacBook Pro (Retina, 13-inch, Early 2015)
・USB Lanアダプター

#macOS Sierraにアップグレード
  
OS X El Capitan からmacOS Sierra 10.12 には
何事もなくアップグレードが完了
  
#問題は突然に！！

Wifiがうんともすんとも動いてくれないのです。  
接続先は表示されるのですが、接続が出来ない。  
  
家ではUSBのLanアダプターを使っているのですが、  
有線でもネットに接続出来なくなりました。

・・・・・真面目に詰んだと思った。

#なんとか解決

最後の希望として、スマホのデザリングどうかと試したら
ネット接続出来ました。
  
PCとスマホのケーブ接続の場合のみです。
Bluetooth接続だとうんともすんとも・・・・・駄目です。  
  
ここからした方法はまずはSierraのバージョンアップです。  
  
macOS Sierra 10.12.4 にバージョンアップしました。  
  
10.12.4 でWifi接続が出来るようになりました。  
  
この段階では有線はうんともすんとも・・・・・駄目です。  
  
Lanアダプターの製品ページにいき、最新のドライバーを  
ダウンロード&インストールしたら有線でもネット  
接続出来るようになりました。  


#注意
1.9GBをデザリング・・・・・4/1にも関わらず通信速度が
低速モードになりました。
スマホのプランによりますが、かなりの通信量が必要になるので
低速モードになるかもしれない覚悟が必要です。
オフラインリアルタイムどう書くE13 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/58541 )を行っています。

問題は「六角形のテトロミノ」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde13hextet/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。

【宣伝】
CodeIQ でたくさん問題出しています。
https://codeiq.jp/q/search?combine=%40Nabetani
をご覧いただければ幸いです。
なんとGoogle Cloud Platformが火星リージョンを発表

さすが我らがGoogle先生ですね．
ついこの間東京リージョンが追加されたと思ったら，一気に宇宙へ…！
 

![interplanetary data center](https://qiita-image-store.s3.amazonaws.com/0/17440/69fe5f60-4e80-dc0f-2808-326ee031dc3e.png)

"Ziggy Stardust"と名付けられたデータセンターは[ゲールクレーター](https://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%AB_(%E3%82%AF%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC))に建設されており，2018年に運用開始予定だそうです．

何と言っても宇宙なわけですから，もちろん従来と異なる次元の冗長性が期待できることでしょう．
性能面でも，「**わずか数秒でエクサバイト規模のクエリを実行する**（早期アクセスプログラム参加者談）」だそうですので，追随を許さないのは相変わらずのようです．

[ストリートビュー](https://www.google.com/maps/space/mars/@-4.5646112,137.390541,3a,75y,200h,84.1t/data=!3m6!1e1!3m4!1s2PdpogJoh9cAAAQ3uBGOBQ!2e0!7i5376!8i2688)や[グーグルマップ](https://www.google.com/maps/space/mars/@-4.5598987,137.3921563,580m/data=!3m1!1e3)も公開されています．

詳細:
https://cloudplatform.googleblog.com/2017/03/Google-Cloud-Platform-expands-to-Mars.html

　

ところで
今日は何月何日でしたっけ
Ansible で Fortigate のコンフィグを取得する

# 1. Ansible のFortiOS対応
Ansible 2.3 では、FortiOSに対応した以下2つのモジュールが導入されました。

 - [fortios_config](https://docs.ansible.com/ansible/fortios_config_module.html): コンフィグのバックアップを取得したりファイルからコンフィグを投入する
 - [fortios_ipv4_policy](https://docs.ansible.com/ansible/fortios_ipv4_policy_module.html): IPv4ポリシーを管理する

今回は `fortios_config` を利用して、Fortigate のコンフィグのバックアップを取得してみます。
([fortios_ipv4_policy についてはこちら](http://qiita.com/akira6592/items/8f9d8a652aedc0314978))


# 2. インストール
## 2.1. Asnbile
```
pip install ansible
```
今回はCentOS6.8上にインストールしました。

## 2.2. pyFG
fortOS 関連のモジュールは内部でpyFGというPythonのモジュールを利用しているためpyFGもインストールしておきます。

```text:pyFGnoのインストール
pip install pyFG
```

## 2.3. バージョン確認
```test:バージョン確認
[root@localhost ansible]# ansible --version
ansible 2.3.0.0
  config file =
  configured module search path = Default w/o overrides
  python version = 2.7.8 (default, Oct 22 2016, 09:02:55) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
```

ansible.cfg は特に作成していません。

# 3. インベントリファイルの作成

```ini:インベントリファイル例（/etc/ansible/hosts）
[forti]
192.168.0.254  # 今回は1台だけ

[forti:vars]
ansible_user=admin
ansible_password=passwordpassword
```

# 4. Plyaybookの作成
以下のファイルを forti.yml として作成します。

```yaml:Playbook
---
- hosts: forti
  gather_facts: no
  connection: local

  tasks:
    - name: Backup current config
      fortios_config:
        host: "{{ inventory_hostname }}"
        username: "{{ ansible_user }}"
        password: "{{ ansible_password }}"
        backup_path: /root/ansible/config_backup/  # バックアップ先ディレクトリ
        backup: yes  # バックアップする指定
```

本モジュールの[公式ドキュメント](https://docs.ansible.com/ansible/fortios_config_module.html)が参考になります。


# 5. 実行
```text:実行結果例
[root@localhost ansible]# ansible-playbook forti.yml

PLAY [forti] *************************************************************************************************

TASK [Backup current config] *********************************************************************************
ok: [192.168.0.254]

PLAY RECAP ***************************************************************************************************
192.168.0.254               : ok=1    changed=0    unreachable=0    failed=0

[root@localhost ansible]#
```
# 6. バックアップコンフィグの確認

## 6.1. ファイルの存在確認
```text:存在確認
[root@localhost ansible]# ls -al /root/ansible/config_backup/ 
-rw-r--r--.  1 root root 48996  4月  1 16:05 2017 192.168.1.81_config.2017-04-01@16:05:30
```

## 6.2. ファイルの内容確認
```text:内容確認
[root@localhost ansible]# ls -al /root/ansible/config_backup/192.168.0.254_config.2017-04-01@16:05:30
    config system global
      set timezone 04
      set fgd-alert-subscription advisory latest-threat
      set hostname "fortigate01"
      set internal-switch-mode interface
    end
    config system accprofile
        edit prof_admin
          set vpngrp read-write
          set utmgrp read-write
　（～略～）
```

無事に取得できました。

# 7. おわりに
コンフィグのバックアップを自動で取得する仕組みはいろいろありますが、Ansibleを導入済みであったり、「検討していたがAnsibleはFortiOSが未対応だからやめた」という方がいらっしゃいましたら、この方法も候補に入れてもよいのではないでしょうか。
Railsで１対多のテーブルデータを取得し表示させる

Railsを使って不動産サイトを作成しています。

rubyとrailsのバージョンは以下になります。

- ruby 2.3.0
- rails 5.0.1


物件一覧画面で、物件の子である空室の情報も取得しビューに表示させたいと思います。
ショッピングサイトであれば、１つの注文に商品が複数あるような場合です。

## 完成画面
完成形の画面は以下になります。
<img width="９００" alt="スクリーンショット 2017-04-01 12.10.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/104359/a8537bf8-054d-d6ac-daa8-fa1d11934e6c.png">

上記のように物件１に対し部屋が多紐づいて表示されます。

## ER図
テーブルのER図は以下になります。
<img width="725" alt="スクリーンショット 2017-04-01 19.29.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/104359/5226c93b-6ea7-cb01-20b7-3a2ff0ec392d.png">


## コントローラ
コントローラの記述は以下になります。

```ruby:app/controllers/rentals_controller.rb
class RentalsController < ApplicationController
  def index
    @rentals = Rental.all.includes(:rooms)
  end
end
```

## モデル
Rentalモデルの記述は以下になります。

```ruby:app/models/rental.rb
class Rental < ApplicationRecord
  has_many :rooms
end
```

Roomモデルの記述は以下になります。

```ruby:app/models/room.rb
class Room < ApplicationRecord
  belongs_to :rental
end
```

## ビュー
ビューの記述は以下になります。

```ruby:app/views/rentals/index.html.erb
<% @rentals.each do |rental| %>
	<div class="list_property">
		<h4><%= rental.name %></h4>
		<%= image_tag 'commons/image_sample.png', :width => '216', :height => '162', :class => 'img' %>
		<ul>
			<li>
				<dl>
					<dt>住所</dt>
					<dd><%= rental.address1 %><%= rental.address2 %></dd>
				</dl>
			</li>
			<li>
				<dl>
					<dt>交通</dt>
					<dd>
						<%= rental.traffic %>
					</dd>
				</dl>
			</li>
			<li>
				<dl>
					<dt>築年</dt>
					<dd><%= rental.built %></dd>
				</dl>
			</li>
			<li>
				<dl>
					<dt>階数</dt>
					<dd><%= rental.floor %></dd>
				</dl>
			</li>
			<li>
				<dl>
					<dt>構造</dt>
					<dd><%= rental.structure %></dd>
				</dl>
			</li>
			<li>
				<dl>
					<dt>向き</dt>
					<dd><%= rental.direction %></dd>
				</dl>
			</li>
		</ul>
		<div>
			<ol>
				<li>賃料</li>
				<li>間取り</li>
				<li>専有面積</li>
				<li>所在階</li>
				<li>詳細</li>
				<li>検討リスト</li>
			</ol>
			<% rental.rooms.each do |room| %>
				<ul>
					<li><strong><%= room.fee %></strong></li>
					<li><%= room.layout %></li>
					<li><%= room.exclusive_area %>㎡</li>
					<li><%= room.floor_position %>階</li>
					<li><a href="#">詳細を見る</a></li>
					<li><a href="#">追加する</a></li>
				</ul>
			<% end %>
		</div>
	</div>
<% end %>

```


上記でRentalの子であるRoomの情報も取得しビューに表示させることができます。
Windows10でRuby on Railsのサンプルページを開くまで

## 説明
初めてのRuby on Railsです。
前回の続きでサンプルページを開くまで手順です。
（Markdownの書き方も勉強中です。）

## 環境
| モノ     | バージョン                        |
|:-----|:-----------------------|
| OS   |Windows10 Home（64bit） | 
| Ruby |2.2.6                   |
| Rails|5.0.2                   |

## Railsアプリケーションを作成する
```
rails new hogehoge
```
>
```
      create
      create  README.md
      create  Rakefile
      create  config.ru
：
（省略）
：
Using rails 5.0.2
Using sass-rails 5.0.6
Bundle complete! 12 Gemfile dependencies, 56 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

ズラズラーッと何かしら処理されているようだ。

## サーバを起動する
hogehogeのフォルダに移動してから～

```
rails server 
もしくは
ruby bin/rails server
```

>
```
=> Booting Puma
=> Rails 5.0.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 3.8.2 (ruby 2.2.6-p396), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

このウィンドウはそのままにしておく。
なんかunavailableとかダメっぽいメッセージが出ている。そのうち調べる。


## ブラウザで確認してみる

```
http://localhost:3000
```


![20170401_001.png](https://qiita-image-store.s3.amazonaws.com/0/172106/304079dd-f38d-e105-ff4f-2a26e7e460fc.png)

素敵なページが開いた。
*you're on rails（あなたは軌道に乗っている）google翻訳。* 
その感じはある。

ここまで。続きはまた次回。

--- 
追記。アクセスしたときにログが出力されてた。ふむふむ。

```hogehoge\log\development.log
Started GET "/" for ::1 at 2017-04-01 16:05:30 +0900
Processing by Rails::WelcomeController#index as HTML
  Parameters: {"internal"=>true}
  Rendering C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-5.0.2/lib/rails/templates/rails/welcome/index.html.erb
  Rendered C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-5.0.2/lib/rails/templates/rails/welcome/index.html.erb (5.5ms)
Completed 200 OK in 94ms (Views: 47.1ms | ActiveRecord: 0.0ms)
````

---

### 感想
簡単さに驚いた。
vimの簡易Markdownハイライト設定


最新のvimだとmarkdownのシンタックスファイルが存在していますが、少し古いvimを使う機会が多く、プラグインも入れられる環境にないため、いつでも使えるように自分でシンタックスを作成してみた。
vimの知識が不足しているので、つたないものになっていますが、自分がmarkdownを書く時の見た目としては十分かなーという程度のモノです。

```Vim
""" MarkDownの簡易ハイライト設定
augroup simpleMarkdownHighlight
  autocmd!
  " シンタックス範囲定義
  autocmd VimEnter,WinEnter *.md syn sync minlines=500 maxlines=1000
  " コードブロック
  autocmd VimEnter,WinEnter *.md syn match mdCodeDelimiter "^```.*" contained
  autocmd VimEnter,WinEnter *.md syn region mdCode start="^\s*```.*" end="^\s*```" keepend contains=mdCodeDelimiter
  " 見出し
  autocmd VimEnter,WinEnter *.md syn match mdH "^#\+.\+$"
  " リスト
  autocmd VimEnter,WinEnter *.md syn match mdList "^ *[\-\+\*] "
  " 順序付きリスト
  autocmd VimEnter,WinEnter *.md syn match mdNumList "^ *\([0-9]\+\.\)\+ "
  " リンク
  autocmd VimEnter,WinEnter *.md syn match mdLinkDelimiter "[()\[\]]" contained
  autocmd VimEnter,WinEnter *.md syn region mdId start="\[\(?=.+?\](\)" end="\]" keepend nextgroup=mdLink skipwhite contains=mdLinkDelimiter
  autocmd VimEnter,WinEnter *.md syn region mdLink start="(" end=")" keepend contained contains=mdLinkDelimiter
  " 引用
  autocmd VimEnter,WinEnter *.md syn match mdBlockQuote "^> .\+$"
  " カラースキーマ定義
  autocmd Colorscheme * highlight def link mdH Title
  autocmd Colorscheme * highlight def link mdCodeDelimiter Special
  autocmd Colorscheme * highlight def link mdList CursorLineNr
  autocmd Colorscheme * highlight def link mdNumList CursorLineNr
  autocmd Colorscheme * highlight def link mdCode Comment
  autocmd Colorscheme * highlight def link mdBlockQuote Constant
  autocmd Colorscheme * highlight def link mdLink Underlined
  autocmd Colorscheme * highlight def link mdId Type
  autocmd Colorscheme * highlight def link mdLinkDelimiter cleaned
augroup END
```
sublime3環境を整える(Ruby)

# しばらく使ってなかったSublimeを使えるようにするぞ
JetBrainsをちょろっと使ってたけど、ライセンス切れてキレたので、Sublimeをセットアップする。
久方ぶりにRubyやるので、主にRuby向けに整える

## SublimeCodeIntel
[http://sublimecodeintel.github.io/SublimeCodeIntel/:title]
補完欲しいってことで、こちらを入れる。定義ジャンプも対応してる。
1. sublime text開いて、`ctr + shift + p`でパッケージマネジャーを開く。
2. `Package Control: intall package`を選択
3. `SublimeCodeIntel`を選択

## SublimeLinter
[http://www.sublimelinter.com/en/latest/#:title]
文法チェックもして欲しいので、SublimeLinterを入れる。
1. sublime text開いて、`ctr + shift + p`でパッケージマネジャーを開く。
2. `Package Control: intall package`を選択
3. `SublimeLinter`を選択
次に、各言語向けのプラグインを入れていく
- `SublimeLinter-ruby`を入れる
その他、jsとかのも入れておくと良さそう。

## 検索窓が日本語に対応してない問題への対応
日本語で検索しようとしてもうまくいかないケースへの対応。下記リンクにそってやればOK。
[https://gist.github.com/chibicode/ad1f50b3b191ee694556:title]  


## rubocop 
コーディング規約のSublimeLinterプラグインあるので、それ入れとく。
SublimeLinter-rubocop
rubocopについては下記。
[http://qiita.com/yaotti/items/4f69a145a22f9c8f8333:title]

# おわり
これでちょい様子を見る。
WROOM-32 examples

WROOM-32のesp-idfにあるサンプルアプリ一覧（[esp-idf/examples](https://github.com/espressif/esp-idf/tree/master/examples)）です。

☆を付けたモジュール追加されてました。20170609

#bluetooth
- a2dp_sink ☆
- ble_adv
- blufi
- controller_hci_uart ☆
- gatt_client
- gatt_security_server ☆
- gatt_server
- gatt_server_service_table

#ethernet
- ethernet

#get-started
- blink 

>指定したGPIOに接続したLEDをチカチカさせるサンプル

- hello_world

#performance ☆

>wifiのパフォーマンスチェックテストを行うコード

- tcp_perf
- udp_perf

#peripherals
- adc
- gpio
- i2c
> i2c接続の照度センサーBH1750のデータ読み込み/コマンド書き込みを行うサンプル　

- i2s

- ledc

>指定したGPIOに接続したLEDをだんだん明るくしたり、だんだん暗くしたりするサンプル。

- mcpwm
- pcnt
- rmt_nec_tx_rx
- sigmadelta
- spi_master
- spi_slave ☆
- timer_group
- touch_pad_interrupt
- touch_pad_read
- uart_echo 

>UARTで接続したコマンドラインから入力された文字をUARTで返すサンプル

- uart_events

>UARTのデータ読み込み時の各種イベントのハンドリング例　

#protocols
- aws_iot
- coap_client
- coap_server
- http_request
- https_request
- mdns
- openssl_client
- openssl_server
- pppos_client ☆
- sntp

#storage
- nvs_rw_blob
- nvs_rw_value
- sd_card
- wear_levelling ☆

#system
- base_mac_address ☆
- deep_sleep
- ota
- ulp
- ulp_adc ☆

#wifi
- power_save ☆
- smart_config ☆
- wpa2_enterprise
- wps ☆
macOS Sierra で Karabiner-Elements を使って Command キーに英数/かなキーを割り当てる

[2017/06/23 追記] Karabiner-Elements に同等の機能が追加されたので 以下の手法ではなく普通にそちらを使ってください．

#やりたいこと
タイトルの通り

#問題
そもそも Sierra では Karabiner が動かないため，tekezo さんが [Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements) を作成してくださっている．が，この Karabiner-Elements には1つ大きな問題がある．

US キーボードユーザには Karabiner を使って左 Command キーに半角英数キー，右 Command キーにかなキーを割り当てている方が多かったと思うが，この Karabiner-Elements ではそのように割り当ててしまうと `Command + 何か他のキー` のショーットカットキーがそれぞれ独立したキー操作として認識されてしまう．これではコピペすらできない．

#対処
wwwjfy さんが Standalone keys という機能を Karabiner-Elements に追加してくださった．これを用いて上記の問題は解決できる．

本家 Karabiner-Elements にも[プルリク](https://github.com/tekezo/Karabiner-Elements/pull/247)を送っているが，2017/04/01 時点ではコンフリクトが生じておりマージされていない．したがって wwwjfy さんがフォークしたリポジトリから Karabiner-Elements をインストールする必要がある．

#方法
##インストール
[最新のリリース](https://github.com/wwwjfy/Karabiner-Elements/releases) から dmg をダウンロードしてインストール

##設定
~/.config/karabiner/karabiner.json の `standalone_keys` 内を以下のように変更．

```json:~/.config/karabiner/karabiner.json

"standalone_keys": {
    "left_command": "japanese_eisuu",
    "right_command": "japanese_kana"
},

```

これで目的は達成されるはず．なんかミスってたら Karabiner-Elements Preferences の Log タブにエラー出ます．
プルリク通ったら普通に本家の Karabiner-Elements 入れればいいと思うのでそれまでのつなぎで．
これからAPI開発するための勉強メモ

# はじめに
今年度こそAPIを開発したいと思います。
そこで、APIを開発するにあたり、しっかりとした知識を持って設計をしたいと思います。
振り返りにも活用するために、本メモに参考とした情報を残します。

# サービスの粒度
まずは、マイクロサービスについて、そもそもサービス分割の考え方を学びたいと思います。
参考にしたのは、クックパッドさんの[クックパッドにおける最近のMicroservices事例](http://techlife.cookpad.com/entry/2016/03/16/100043)です。

クックパッドさんによると、以下の3つのタイプに分類しているとのこと。

- ユーザーサービス
    - 大原則は、事業ドメイン（プロダクト）で分割すること 
    - プロダクトが異なれば対象ユーザーも異なるので、柔軟な技術選定ができるはず
- ビューサービス
  - BFFに近い
  - 同じドメインモデルを別バージョンで提供する場合に使う
- 共通基盤サービス
  - サービス間で共通的使われるサービス。 

# BFFとは
Backends for Frontendsの略。SoundCloud開発中のPhil Calçado氏による造語。  
マイクロサービスアーキテクチャ著者のSam Newman氏によれば、
  
>ユーザエクスペリエンスごとにひとつのAPIバックエンドを用意する方法だ。概念としては，ユーザ向けアプリケーションが２つのコンポーネントで構成されることになる。ひとつがクライアント側で，もうひとつがサーバ側という

[マイクロサービスアーキテクチャにおけるAPIコールの仕方とHTMLレンダリング](http://qiita.com/kawasima/items/356d54e253c54d730fb0)  によると、ECサイトを表示する際、4つに分割されたサービスからデータを取得するためには、単純に考えると4回のAPIコールをしなければならなくなり、モバイルの通信料や画面描画の遅延にも繋がってしまう問題が発生する。  
この問題を解消するために、API ゲートウェイの採用を紹介されており、加えてBFFの考え方についても触れられている。
>APIゲートウェイを、呼び出しデバイスおよびアプリケーションごとに分離し、その管理責任を呼び出し側アプリケーションのチームに渡すのが、Backends for Frontends (BFF)です。


# 参考サイト
- [フロントエンドに対するAPIバックエンドの提供パターン](https://www.infoq.com/jp/news/2016/02/bff-backend-frontend-pattern)
- [マイクロサービスアーキテクチャにおけるAPIコールの仕方とHTMLレンダリング](http://qiita.com/kawasima/items/356d54e253c54d730fb0)
- [綺麗なAPI速習会](http://qiita.com/shimastripe/items/e9b0e1f8f8d77b89373f)
- [マイクロサービスのための綺麗なAPI設計](https://www.wantedly.com/companies/wantedly/post_articles/32977)
- [Webサービスの初期開発とマイクロサービス・BFF](https://speakerdeck.com/shimpeiws/websahisufalsechu-qi-kai-fa-tomaikurosahisubff)
- [APIのことはすべてシーマンが教えてくれた](https://www.slideshare.net/charlier-shoe/api-73960006)
- [
step-by-step BFF](https://speakerdeck.com/yosuke_furukawa/step-by-step-bff)
- [Microservices Meetup vol.5 (API Gateway & BFF)に参加しました！](https://techblog.hc-mti.com/2017/03/31/531/)
- [RESTfulなWeb APIを設計するときに考えること](http://qiita.com/shrkw/items/c6123ca25981e44a3d82#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0)
- [Web API: The Good Partsを読んだので「設計変更しやすいWeb API」についてまとめた](http://qiita.com/soyanchu/items/34f8e164c24f044e80a3#api%E3%82%92%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%97%E3%82%88%E3%81%86)
- [Web API 設計のベストプラクティス集 "Web API Design - Crafting Interfaces that Developers Love"](http://d.hatena.ne.jp/cou929_la/20130121/1358776754)
- [OAuth2.0をかみくだく](https://speakerdeck.com/garbagetown/oauth-2-dot-0-wokamikudaku)
position:absoluteした要素に可変の高さを与える

##　追記

なんか1年くらいかかりはしましたが2万viwe超えました。
他の記事なんか1000にも満たないことが多いので驚きです。

よく検索されているようなのでもしわかりにくいことがあればコメントください。

##　本題

positionは便利だけど、リキッドデザインで使う場合囲んだ`div`などに`position:absolute`を当てると画像の伸縮がうまくいかなくなる。

これは高さを指定しないから起こるのだが、
高さ固定したらそもそも`div`の中の画像が伸縮しなくなるじゃん！！

こんな場面に出会った人は少なくないはず、多分。

##どうにかなります

```html
<div class="box ratio-1_1">
    <div class="inner">
        <p>1 : 1</p>
    </div>
</div>
```

```css
.box {
    position: relative;
    width: 50%;
    height: auto;
    background: #444;
}
.ratio-1_1:before {
    content: "";
    display: block;
    padding-top: 100%; /* 1:1 */
}
.inner {
    position: absolute;
    top: 0; left: 0;
    width: 100%;
    height: 100%;
}
```

###ブラウザの幅を変えてみてください。

<p data-height="300" data-theme-id="26464" data-slug-hash="dvwxRO" data-default-tab="css,result" data-user="nknkt" data-embed-version="2" data-pen-title="position:abosoluteしたdivに可変の高さをつける" class="codepen">See the Pen <a href="http://codepen.io/nknkt/pen/dvwxRO/">position:abosoluteしたdivに可変の高さをつける</a> by kenta kanno (<a href="http://codepen.io/nknkt">@nknkt</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


divに`:before`でpaddingを与えることで
擬似的に高さを与えます。

`padding-top`の値を変えることで比率を変えることももちろんできます。

`.inner`の`width`、`height`は100%に指定することで`ratio-1_1`の高さを拾いますね。
watchを使ってReactとES6の変更を監視 + 自動ビルドする

[Reactビギナーズガイド」でReactを勉強する。](http://qiita.com/Takkiii/items/4fd108e24fc87b93a745)の続き。

前回は
* Railsプロジェクトの作成
* Reactコンポーネントの作成
* babelでReactとES6のコードをトランスパイル
* browserifyで依存関係を解決した1つのファイルにまとめる
といったところをやりました。

しかし、コードを変更する度に毎回手動でbabelとbrowserifyを実行するのはとても効率が悪いです。そこで、ファイルの変更を監視し、自動でトランスパイルと依存関係の解決をしたいところです。

「Reactビギナーズガイド」ではこのプロセスを**watch**という変更を監視するライブラリと、コマンドが記述されたシェルスクリプトを用意することで解決しています。

## 1. watch
watchは指定したディレクトリの内容を監視し、変更が発生したら何かしらの処理を実行できるライブラリです。

```shell-session
npm install --global watch
```

watchをグローバルにインストールすることで**watchコマンド**を使用できるようになります。

## 2. build.sh
続いて必要になるのはファイルの変更を検知した時に実行したい処理です。
今回はbabelによるトランスパイルと、browserifyによる依存関係の解決を実行したいので、同書に従ってシェルスクリプトを作成します。

```shell-session
touch build.sh
```

```build.sh
# トランスパイルしたjsの出力先をapp/frontends配下にしておくと無限ループに陥るため、public配下に出力
babel --presets react,es2015 app/frontend -d public/assets/javascripts/build

browserify public/assets/javascripts/build/books.js -o public/assets/javascripts/bundle.js

date;echo;
```

## 3. watchを起動し、開発する

シェルスクリプトが用意できたら以下のコマンドで監視を開始します。
見ての通り、watchコマンドの第一引数に実行ファイル、第二引数に監視するディレクトリを指定しています。

```shell-session
watch 'sh build.sh' app/frontend
```

watchが起動した状態で、[Reactビギナーズガイド」でReactを勉強する。](http://qiita.com/Takkiii/items/4fd108e24fc87b93a745)で作成したbooks.jsを変更してみましょう。

```posts.js
import React from 'react'
import ReactDOM from 'react-dom'

class Books extends React.Component {
  render() {
    return (
      // 「HelloWorld」から「BookApp」へ変更
      <h1>BookApp</h1>
    )
  }
}

ReactDOM.render(
  React.createElement(Books),
  document.getElementById("books")
)

```

ターミナルでは以下のような結果が出力されていることがわかります。

```shell-session
app/frontend/books.js -> public/assets/javascripts/build/books.js
2017年 4月 1日 土曜日 13時50分35秒 JST
```

## 4. ブラウザで確認する

`rails server`を起動し、http://localhost:3000/books/index へアクセスし、「BookApp」が表示されていれば成功です。

![image](https://qiita-image-store.s3.amazonaws.com/0/59672/ef5b5d82-518a-4935-b351-92d8251bcca8.png)

変更を繰り返し、自動でビルドがされているか何度か確認してみても良いでしょう。

この「**変更の監視と自動ビルド**」というプロセスは**gulp**や**grunt**などのタスクランナーを用いる手法や、**watchify**のようなライブラリを用いる手法もあるようなので別の機会にそれぞれ試してみたいと思います。



変更を監視し、自動でビルドされるようになったので次回以降は本格的にアプリケーション開発に入っていきたいです。
初心者向け Mac：ショートカットキー


## 概要
現在、1日の中で最も一緒に時間を過ごしているのが、Macbookです。(笑)

このMacbookとさらに仲良くなるには、ショートカットキーを使いこなすことです。

自分が使って便利だと思ったショートカットキーをご紹介します。

## 記号
- ⌘：command
- ⇧：shift
- ⌥：option
- ⌃：control

## ショートカットキー
※ あくまでも個人的に使って便利だと思った評価です。ご了承ください。

### 便利度：★★★
- Spotlight検索を開きます。
  - ⌘ + スペースキー
- ファイルを削除します。
  - ⌘ + delete
- ゴミ箱を空にします。
  - ⌘ + ⇧ + delete
- カーソルを現在の行の先頭に移動します。
  - ⌘ + 左矢印
- カーソルを現在の行の末尾に移動します。
  - ⌘ + 右矢印
- 行または段落の先頭に移動します。
  - ⌃ + a
- 行または段落の末尾に移動します。
  - ⌃ + e
- 選択したファイルを複製します。
  - ⌘ + d
- 新規フォルダを作成します。
  - ⌘ + ⇧ + n
- アプリを終了します。
  - ⌘ + Q
- シャットダウンを準備します。
  - ⌃ + 電源ボタン
- コピーします。
  - ⌘ + c
- ペーストします。
  - ⌘ + v

### 便利度：★★
- メニューに移動します。
  - ⌃ + F2
- 最前面のウインドウを最小化して Dock にしまいます。
  - ⌘ + m
- ディスプレイをスリープ状態にします。
  - ⌃ + ⇧ + 電源ボタン
- カーソルから、行または段落の末尾までの範囲にあるテキストを削除します。
  - ⌃ + k
- 書類の先頭までスクロールします。
  - fn + 左矢印
- 書類の末尾までスクロールします。
  - fn + 右矢印
- カーソルから、現在の行の先頭までの範囲のテキストを選択します。
  - ⌘ + ⇧ + 左矢印
- カーソルから、現在の行の末尾までの範囲のテキストを選択します。
  - ⌘ + ⇧ + 右矢印

### 便利度：★
- 全ウィンドウを閉じます。
  - ⌘ + ⌥ + w
- ダウンロードフォルダに移動します。
  - ⌘ + ⌥ + L
- 最前面のアプリのウインドウをすべて最小化します。
  - ⌘ + ⌥ + m
- 最前面のアプリの環境設定を開きます。
  - ⌘ + ,
- カーソルを前の単語の先頭に移動します。
  - ⌥ + 左矢印
- カーソルを次の単語の末尾に移動します。
  - ⌥ + 右矢印
- 選択したディスクまたはボリュームを取り出します。
  - ⌘ + e

## 総括
ここまでが便利度別のショットカットキーになります。

他にも多くのショットカットキーがありますので、以下に記載します。

ご参考下さい。

一つ一つ試してみるのが良いですね。

## Finder
- デスクトップのファルダを選択します。
  - ⌘ + 下矢印
- 一つ上の階層に行きます。
  - ⌘ + 上矢印 
- デスクトップに移動します。
  - com + ⇧ + d
- ダウンロードフォルダに移動します。
  - ⌘ + ⌥ + L

## 削除
- ファイルを削除します。
  - ⌘ + delete
- ゴミ箱を空にします。
  - ⌘ + ⇧ + delete

## キャッシュクリア
- ⌘ + ⇧ + r

## 一般的なショートカット
- 最前面のアプリのウインドウを非表示にします。
  - ⌘ + h
- 最前面のアプリを表示し、その他すべてのアプリを隠します。
  - ⌘ + ⌥ + h
- 最前面のウインドウを最小化して Dock にしまいます。
  - ⌘ + m
- 最前面のアプリのウインドウをすべて最小化します。
  - ⌘ + ⌥ + m
- 新規の書類またはウインドウを開きます。
  - ⌘ + n
- アプリを終了します。
  - ⌘ + Q
- 開いているアプリのうち、最近使った順番で次にあたるアプリに切り替えます。
  - ⌘ + tab
- 最前面のアプリの環境設定を開きます。
  - ⌘ + ,

## スリープ、ログアウト、システム終了
- Macを強制的に再起動します。
  - ⌘ + ⌃ + 電源ボタン
- ディスプレイをスリープ状態にします。
  - ⌃ + ⇧ + 電源ボタン

## 書類
- カーソルから、行または段落の末尾までの範囲にあるテキストを削除します。
  - ⌃ + k
- 書類の先頭までスクロールします。
  - fn + 左矢印
- 書類の末尾までスクロールします。
  - fn + 右矢印
- カーソルを書類の先頭に移動します。
  - ⌘ + 上矢印
- カーソルを書類の末尾に移動します。
  - ⌘ + 下矢印
- カーソルを現在の行の先頭に移動します。
  - ⌘ + 左矢印
- カーソルを現在の行の末尾に移動します。
  - ⌘ + 右矢印
- カーソルを前の単語の先頭に移動します。
  - ⌥ + 左矢印
- カーソルを次の単語の末尾に移動します。
  - ⌥ + 右矢印
- カーソルから、書類の先頭までの範囲のテキストを選択します。
  - ⌘ + ⇧ + 上矢印
- カーソルから、書類の末尾までの範囲のテキストを選択します。
  - ⌘ + ⇧ + 下矢印
- カーソルから、現在の行の先頭までの範囲のテキストを選択します。
  - ⌘ + ⇧ + 左矢印
- カーソルから、現在の行の末尾までの範囲のテキストを選択します。
  - ⌘ + shift + 右矢印
- 行または段落の先頭に移動します。
  - ⌃ + a
- 行または段落の末尾に移動します。
  - ⌃ + e
- カーソルの後に 1行挿入します。
  - ⌃ + o
- 「別名で保存」ダイアログを表示します。または、現在の書類を複製します。
  - ⌘ + ⇧ + s
- 選択したファイルを複製します。
  - ⌘ + d
- 選択したディスクまたはボリュームを取り出します。
  - ⌘ + e
- iCloud Driveを開きます。
  - ⌘ + ⇧ + i
- 「ユーティリティ」フォルダを開きます。
  - ⌘ + ⇧ + u
- 新規フォルダを作成します。
  - ⌘ + ⇧ + n
- メニューに移動します。
  - ⌃ + F2
TypeScript2.xをwebpack2.xでビルドする最弱サンプル

#概要
複数のファイルで構成したTypeScript(2.x系)をwebpack(2.x系)でJavaScript(ES5)にまとめます。
作成されたJavaScriptをコマンド実行してHello的なもの表示するだけの最弱サンプルです。

TypeScript(2.x系)をwebpack(2.x系)でまとめるだけのヤツをやりたいけど、あまりに低レベルなため見当たらなかったので、自分メモとして記録します。

#開発環境
Windows10
node.js : v6.10.1

#構成
[プロジェクトルートフォルダ]
.
├── package.json
├── src
│   ├── Index.ts
│   └── Test.ts
├── tsconfig.json
└── webpack.config.js

#ソースコード
```package.json
{
  "name": "typescript2_webpack2_sample",
  "version": "1.0.0",
  "license": "MIT",
  "scripts": {
    "build": "webpack --config webpack.config.js"
  },
  "devDependencies": {
    "ts-loader": "^2.0.3",
    "typescript": "^2.2.2",
    "typings": "^2.1.0",
    "webpack": "^2.3.2"
  }
}
```

```tsconfig.json
{
  "compilerOptions": {
    "outDir": "./dist/",
    "module": "CommonJS",
    "target": "es5"
  },
  "files": [
    "./src/Index.ts"
  ]
}
```
**module**
上記では"CommonJS"としていますが、正直、私はよくわかってません。
なんとなく"ES6"または"ES2015"としたいんですが、[公式サイト](https://www.typescriptlang.org/docs/handbook/compiler-options.html)のmoduleについての説明で
> "ES6" and "ES2015" values may not be used when targeting "ES5" or lower.

とあり、最終的にブラウザで利用できるJavaScript(ES5)にしたかったので、とりあえず"CommonJS"にしました。

```webpack.config.js
module.exports = {
    entry: "./src/Index.ts",
    output: {
        filename: "./dist/bundle.js"
    },
    resolve: {
        extensions: [".ts"]
    },
    module: {
        rules: [
            {
                test: /\.ts?$/,
                exclude: /node_modules/,
                use: "ts-loader"
            }
        ]
    }
};
```

```src\Index.ts
import Test from './Test';

let myTest = new Test("Kaban-chan");
myTest.greet();
```

```src\Test.ts
export default class Test {
    private name: string;
    constructor(name: string) {
        this.name = name;
    }
    public greet(): void {
        console.log(`Hello, ${this.name}!!!`);
    }
}
```

#依存パッケージインストール（ダウンロード）
下記コマンド実行。

```
cd [プロジェクトルートフォルダ]
npm install
```

#ビルド
下記コマンド実行。

```
cd [プロジェクトルートフォルダ]
npm run build
```
[プロジェクトルートフォルダ]\dist\bundle.jsに変換・まとめられたJSファイルができます。

#実行
下記コマンド実行。

```
cd [プロジェクトルートフォルダ]
node dist\bundle.js
Hello, Kaban-chan!!!
```
↑のように「Hello, Kaban-chan!!!」が表示されます。

#完了
以上です。
どうしても秘密鍵を使ってgitcloneできない

どうしても秘密鍵を使ってgitcloneできないので、ここに備忘録として残しておきます。下記の方法で、できるはずだけどなぜできないんだろう？

# ステップ１
github側に公開鍵を置く。

# ステップ２
ローカルの `.ssh` にエイリアスを書く。例えば下記のように

```
Host hostName
  Hostname github.com
  User git
  IdentityFile ~/.ssh/secretkey
```

# ステップ３

git userをチーム専用に変更して置く

```
git config --local user.name sea_mountain
git config --local user.email valid_email@example.com
```

# ステップ4
秘密鍵を指定してgitclone

```
$ git clone hostName:hostteam/hostteam.git
```

# 解決した

結局、[ここのサイト](http://dev.classmethod.jp/tool/github-ssh-sub-account-setting/) を見ながら丁寧にやったらできた。何度も丁寧にやるのが大事

# 参考

[Git の Commit Author と Commiter を変更する](http://qiita.com/sea_mountain/items/d70216a5bc16a88ed932)

[git clone 時に秘密鍵を指定する] (http://qiita.com/sonots/items/826b90b085f294f93acf)