OmniAICreator/Qiita-1.07M huggingface dataset:
AWS S3でのコンテンツ配信

AWS S３に画像等を配置しても、そのままではwebサイトやアプリからは参照できない。
ちなみに、cloudFront経由、独自ドメインで配信するやり方については
[AWS S3の画像等のデータをCloudFront経由で配信する](http://qiita.com/THHacker/items/8b61dc0302387b1fced9)
を参照してください。

# 手順
1, バケットを開いた状態で、[プロパティ]→[アクセス許可]を選択
2, [バケットポリシーの編集]を押し、下記を挿入

```
{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Sid": "AddPerm",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::{バケット名}/*"
		}
	]
}
```
Push通知サービス検討

android / iosで配信する、webview経由、railsのgameアプリで、push通知を実装する機会があったので、push通知に関して、ｻｰﾋﾞｽを比較してみた。

- [Amazon Simple Notification Service] (https://aws.amazon.com/jp/sns/)
 - 最初の100万送信無料、以降100万送信ごとに0.5USD
- [mobile backend](http://mb.cloud.nifty.com/push/)
 - ニフティクラウドのサービス。無料で200万プッシュ、または月額3万円で1,000万プッシュまで可能
- [Appvisor push](https://app-visor.com/)
 - 料金非公開だが、導入事例が結構すごい
- [CORE PUSH](http://core-asp.com/)
 - 100ユーザまで無料、25,000ユーザまで月額9,800円
- [Growth Push](https://growthpush.com/)
 - 月100万APIアクセスまで無料。その後は月額9,900円（月200万APIアクセス）
- [Kii Cloud](https://jp.kii.com/)
 - 月100万プッシュまで無料。その後は7セント/1,000通の従量課金

少し前の記事になるが、このサイトが結構まとまっていて参考になった。
http://blog.mb.cloud.nifty.com/?p=2167


AWS SNSで実装することにしました。
やはりコストメリットと、ドキュメントの量、信頼性が決めてですね。
個人的にはCORE PUSHもユーザ数課金という点で、他のサービスとは異なり、用途が合えば有かなと感じました。

ちなみに最近AWS Pinpointというサービスが新しく出ましたね。
SNSとの比較については今度書きたいと思います。

次回はAWS SNSでのPUSH通知実装について書きます。
MFi認証、取得について

iosﾃﾞﾊﾞｲｽと繋げるIoTﾃﾞﾊﾞｲｽを作っていたので、MFi認証取った方がよいのかなぁと思い、調査してみました。

#MFi認証とは#
「Made For iPhone/iPad/iPod」の略で、Appleが用意した認証プログラムに通っているという認証
元々はiPodのオーディオアクセサリ製造者向けプログラムだが、現在はWi-FiやBluetoothなど無線通信関連の製品も含まれるようになっている。たとえば、Blueotoothでは、iPhoneに接続できるゲームパッド、iBeaconに利用できるビーコンデバイスで、MFi認証を通った製品が提供されている。

[Apple MFi page](https://developer.apple.com/jp/programs/mfi/)

- メリット
 - 認定ロゴが使える
 - iOS接続関連ならAppleの技術サポートが受けられる
- デメリット
 - 高い
 - 認証を得るための対応が必要（定期的）
- コスト
 - 公式では非公開
 - 非公式では1プロダクト 4$ or プロダクトの販売価格の10%
(最近上記より安くなったらしい)

> What is the royalty associated with MFi accessories?
This information is only available under NDA. You will be able to review this information once your application for the MFi Manufacturing License has been approved.

- MFi認証の対象

> What types of accessories and technologies are not part of the MFi Program?
>- Accessories that do not use any of the MFi licensed technology listed above are not part of the MFi Program. For example:
- Accessories that use only standard Bluetooth profiles supported by iOS
- Accessories that use only Bluetooth Low Energy (BTLE) (note: BTLE-enabled HomeKit accessories and BTLE-enabled MFi Hearing Aids are part of the MFi Program)
- Accessories that connect to an Apple device through the headphone jack and do not use any MFi licensed technology
Non-electronic cases

対象かどうかも怪しいし、コストがかなり高い。iOSにかなり依存するようなプロダクトでなければ必要ないかなぁと感じました。
node.js on functionsのlocal開発環境の作り方


Azureのfunctions上をnode.jsでプログラミングする場合、プログラムを修正する度、毎回funcionsにデプロイして動作確認する、という繰り返しは効率が悪いので、localでも同じソースが動く用な雛形を作ってみました。

## localでも動くnode.jsの書き方

### まず結論
適当な実行用ファイル、例えばrun.jsを用意して

```javascript:run.js
// functionsメインのindex.js読み込み
var main = require("./index");

// index.jsに渡すcontextオブジェクト
var context = {
	log:function(v){
		console.log(v);
	},
	done:function(){
		console.log("function complete");
	}
}

// メイン処理
new main(context,null);
```
これだけでok。あとはこれを実行する。

```sh
$node run.js
```

こうすることで、functions上で動くindex.jsをローカルでも動かせます。

### 解説
#### functionsの構成
まず、funtionsは`index.js`と`function.json`が最小構成になっています。メインの処理となる`index.js`は以下のようなソースが最小の形になります。

```index.js
module.exports = function (context, trigger) {
	// debug
	context.log("ログ表示");
	
	// メインの処理
	// ・・・・
	
	// functions終了処理
	context.done();
}
```


ポイントは以下で

 * module.exportsのfunctionの引数は２つで、`context` と `trigger` 
	 * `context`・・・functions内の独自オブジェクト
	 * `trigger`・・・functionsに渡されるtriggerに関する値
 * `context.done()`はfunctions終了処理で、これが呼び出されないとtimeout errorになるまでプロセスが残る
 * ログ表示は`console.log()`では無く、書いても何も表示されない。debugは`context.log()`で、log window[^1]に表示される

#### contextへの対応
つまり、ローカル環境で、ログを表示したり、functionsの終了処理を呼び出そうとすると、この`context`オブジェクトをlocalで動作させる必要があります。
そこで、`run.js`で、`context`オブジェクトを用意してます。

```run.jsの一部
// index.jsに渡すcontextオブジェクト
var context = {
	// ログ表示処理
	log:function(v){
		console.log(v);
	},
	// 疑似終了処理
	done:function(){
		console.log("function complete");
	}
}
```

これで、functions上で動作するindex.jsがlocalでも動作するようになります。

## 補足
ログ表示は上記でとりあえずは可能なのですが、context変数はこのままだとmodule.exports内でしか使えません。そこで、以下のように対応したのが現状です。

```javascript:index.js
// グローバル？にデバッグ用変数用意
var debug;

// メイン関数
function main_function(){
	// こうすることで、module.exports外部でもログ表示できる
	debug.log("ログ表示");
	
	// やりたい処理
	// ・・・・・
	
	// functions終了処理もここで呼び出せる
	debug.done();
}

module.exports = function (context, trigger) {
	// contextをdebugにセット。以降、debugを利用
	debug = context;
	
	// メインの処理
	main_function();
}
```

もっとスマートな方法がある気がしてます。あればコメントお願い致します！


[^1]: log windowはこちらを参考 -> [Azure functions ログの参照方法まとめ](http://qiita.com/papettoTV/items/5b0c530af9a35dd32d8d)
Aspellでさっくりとソースコードのスペルチェック

## きっかけ

開発中案件でpaymentがpaymantになっている事件が発覚したため。
[GNU Aspell](http://aspell.net/)でさっくりとチェックかけたいな、と思った。

## 前期: せめてファイル名だけでもきちんとしたい

### Aspell導入

CentOSならyumでさっくり入る。
```
$ sudo yum install aspell-en
$ echo "lang en_US" > ~/.aspell.conf
```

### チェックしてみる

```
$ cd path/to/files
$ find . -type f |sed "s/[A-Z][a-z]/ \0/g" | tr '[A-Z]' '[a-z]' |aspell list |sort|uniq
```

といった感じで実行して、

```
ajax
ami
ansible
apache
auth
bowerrc
btn
cli
colorbox
commom
conf
config
configs
const
consts
css
csv
（以下略）
```

### 直す

怪しいのを見つけたらgrepして、必要に応じて置換。

```
find . -type f -print | xargs grep -l typo_word | xargs sed -i "s/typo_word/correct_word/g";
```

あるいはgit-gsubを使って

```
git gsub typo_word correct_word
```

### 結果

commomなどが発掘され、平和が訪れたような気がした。

## 後期: さらに見つかり

ソースコード内の変数の中にbirthbayが埋もれていたりしたので、カッとなった。

### 改良してチェック


```
find . -type f -print |xargs file |grep text |awk -F' ' '{print $1}' |sed -e 's/://g' |xargs cat |sed "s/[A-Z][a-z]/ \0/g" |tr '[A-Z]' '[a-z]' |aspell list |sort|uniq
```
catで開いて、中身までチェック。

### 結果

![2017-01-05_17h20_59.png](https://qiita-image-store.s3.amazonaws.com/0/54590/13b73373-0ffe-8da9-6647-aa7cc118052f.png)

俺たちの戦いはまだ終わっていなかったりするし、次回作なんていらない。

## まとめ

さっくりじゃなくなってきたので、ぼちぼち違う手法を使おうと思っている。
syntasticでシステムではなくローカルの実行ファイルを動かす

[syntasitic](https://github.com/vim-syntastic/syntastic) を使って自動チェックを行うには、 vim から Rubocop や eslint などを実行する必要があるので、よくシステム全体にツールをインストールしたりする。（:warning: 後述するように eslint はグローバルにインストールしてはいけないらしい）

```
npm install -g eslint
```

しかし、これだと全てのプロジェクトで同じバージョンの eslint を使わなければならないし、プロジェクトで使っているバージョンが変わるたびにシステムに入っているパッケージもこうしなければならず DRY ではない。どうにかしてプロジェクトローカルのバージョンを使いたい。

この課題には2つの対応策がある。

## 環境変数を設定する

一番簡単な方法は、プロジェクトでインストールした実行ファイルを使えるように `PATH` を設定することだ。

こういうディレクトリ固有の環境変数を管理するには [direnv](https://github.com/direnv/direnv) を使うのが楽だろう。 direnv をインストールしたあと、プロジェクトルートに次のような .envrc ファイルを作る

```sh:.env
export PATH="$(npm bin):$PATH"
```

この状態で起動した vim は `PATH` に `npm bin` を含むので、 eslint を実行することができる。

この方法のいいところは、 syntastic に限らず様々なツールを一括で設定できることだ。その一方で、1つの vim の中で複数のプロジェクトを横断してファイルを編集したりすると、 vim を起動したプロジェクト以外の場所にあるファイルのチェックがうまくいかなくなってしまう。そういう状況がありうる場合は、次の都度設定する方法を取らなければならない。

## 都度設定する

syntastic は変数で簡単に言語ごとの設定ができるが、バッファ変数を使ってバッファごとに挙動を変えることができる。実行ファイルのパスを指定するには `b:syntastic_<filetype>_<checker>_exec` を使う。

```vim
augroup SyntasticConfig
  au!
  au FileType javascript call s:syntastic_javascript_settings()
augroup END

function! s:syntastic_javascript_settings()
  if executable('npm')
    let bin_path = systemlist('npm bin')[0] . '/eslint'
    if executable(bin_path)
      let b:syntastic_javascript_eslint_exec = bin_path
    endif
  endif
endfunction
```

このスクリプトは javascript ファイルを開くたびに npm で eslint がインストールされているか調べ、インストールされて入ればそれ使うようにする。なければシステムの eslint にフォールバックする。こうすることで、各 javascript ごとに正しい eslint を使うことができるようになる。

## eslint 固有の解決方法

@mysticatea さんのコメントで知ったが eslint に限っては [eslint-cli](https://www.npmjs.com/package/eslint-cli) というツールをグローバルインストールすることで解決できる。 eslint-cli をインストールするとファイルごとに適切な eslint を実行する `eslint` コマンドがインストールされるようだ。

> **Note:**
> - The `eslint` module must not be installed into global.
> - This module must be installed into global.

とのこと。
RxJSの練習のための環境

[RxJSの練習 - Qiita](http://qiita.com/masakielastic/items/b46dfcdb1ddd15ab9d17) がいいなと思ったので、それをするための環境を作るスクリプトを書いてみた。

RxJSのリポジトリ

 - https://github.com/Reactive-Extensions/RxJS

リアクティブプログラミングについては以下の記事がわかりやすい

 - http://ninjinkun.hatenablog.com/entry/introrxja
 - http://system.blog.uuum.jp/entry/%E3%83%AA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%B8%E3%81%AE%E7%90%86%E8%A7%A3%E3%81%8C%E3%82%A4%E3%83%9E%E3%82%A4%E3%83%81%E3%81%A0%E3%81%A3

# 導入

node 前提

```
# rxjs のインストール
npm install -g rx

# ターミナルで ES6 (ES2015) のスクリプトを試すのに便利
npm install -g babel-cli
```

# スクリプト

簡単に構成を自動化するスクリプトを書く

```rxgen.sh
#!/bin/bash

CMDNAME=`basename $0`
if [ $# -ne 1 ]; then
    echo "Usage: $CMDNAME project_name" 1>&2
    exit 1
fi

# 新規ディレクトリの作成
if [ -f $1 ]; then
   echo "$1 is exits" 1>&2
   exit 1
fi
mkdir $1 && cd $1

# package.json の記述
cat > package.json <<EOF
{
  "name" : "$1",
  "version" : "0.0.1",
  "description" : "",
  "scripts": {
    "start" : "babel-node app.js --presets es2015-node"
  },
  "babel": {
    "presets": ["es2015-node"]
  }
}

EOF

# npm install の実行
npm install --save-dev rx
npm install --save-dev babel-preset-es2015-node@6
npm install --save-dev rxjs
npm install --save-dev rx-dom

# app.js の生成
cat > app.js <<EOF
import Rx from 'rxjs/Rx';

// write your code under this line !!

EOF

# ディレクトリを抜ける
cd ../
```

これを使ってサクッと作業ディレクトリを作成する

```
./rxgen.sh rxtutorial
```

# 運用

app.js にメインコードを書く。
npm start でコンソール上でRxが動く。

以上
Unixという考え方:読書録

読んでみて、読み物としての面白さとエンジニアにとっての大切なことの両方が感じられたので
気になったところを抜粋して残しました。

### Unixは「ユーザは自分が何をしているか分かっていることを前提にしている」→システムとしての実装が軽い→使い方がわかるユーザに使いやすさや分かりやすさとして還元できる

openVMSなどが使い方がわからないユーザを取り込もうとしてる中で、Unixは「何をしているのかがわかる」ユーザを前提にしている。分かっていることが前提→わからないことに対するアプローチをシステムから削ることが可能。


### プログラムを梃子として利用

プログラムの再利用は開発を加速させる。できるだけ再利用する。
部分の総和を大きくさせることができる。「部分」のもつ効能を大きくできる。柔軟性を持たせることができる。

### 部分の総和は全体よりも大きい
小さなプログラムがまとまって動くとき、全体よりも柔軟性に富む上にシステムとしての機能は全体よりも大きく持てることになる。
AWS IAMでのMFA強制

AWSのIAMをユーザに割り振ったけど、セキュリティ強化のためにMFA(多要素認証)を強制にしたい場合ってありますよね？

# MFAとは
セキュリティを向上させるには、多要素認証（MFA）を設定して AWS リソースを保護することを推奨します。MFA は、AWS ウェブサイトまたはサービスへのアクセス時に承認済みの認証デバイスまたは SMS テキストメッセージから取得した一意の認証コードを入力するようユーザーに要求することで、セキュリティをさらに高めます。
(AWS公式より)


## 手順
MFAによるアクセスでなければ何もさせたくない場合は

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BlockAnyAccessOtherThanAboveUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": "iam:*",
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```
としてIAMのポシリーを作成し、IAMユーザにアタッチすれば良いです。
NotActionの部分でiamのアクションを許可しているのは、ログインした後、iamの設定画面でmfaを有効化してもらうためです。
厳密にはiamのmfa有効化のアクションのみに絞るべきですね。
（ただ、ユーザにMFAを有効化するにはどうするかを教えなければいけません。。MFA有効化を管理者が行い、初期ログイン時に設定フローが出てくる、とかしてほしいです。。。）

上記ポリシーをアタッチしたユーザでMFAを使わずログインすると、IAM以外はエラーとなり、見えないはずです。

また、上記設定すると、自身のMFAの有効化もできなくなってしまうので、下記も一緒にアタッチした方が良いです。
私は別のPolicyとして作りましたが、一緒のPolicyにしても良いかと思います。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListMFADevices"
            ],
            "Resource": "arn:aws:iam::489928898057:user/${aws:username}"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteVirtualMFADevice",
                "iam:CreateVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::489928898057:mfa/${aws:username}"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "iam:ListUsers",
            "Resource": "arn:aws:iam::489928898057:user/"
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "iam:ListVirtualMFADevices",
            "Resource": "arn:aws:iam::489928898057:mfa/"
        }
    ]
}
```
riotで名前付きのyieldをネストさせると......

# yield[from=XXX]の名前付きでyieldをさせると、解析に失敗する。

このように使える。テストコードから持ってきた例だけど、実際には&lt;panel>みたいなタグで使える。

```html:タグ
<yield-multi3>
  <div class="header"><yield from="header" /></div>
  <div class="content"><yield /></div>
</yield-multi3>
```

こうすると、ネストするときには、こうするんだけど、

```html:使う方
    <yield-multi3>
      <yield to="header">
        <span>header1</span>
      </yield>
      <yield-multi3>
        <yield to="header">
          <span>header2</span>
        </yield>
        <span>content</span>
      </yield-multi3>
    </yield-multi3>
```

こうなっている。

```html:予定
    <yield-multi3>
      <div class="header"><span>header1</span></div>
      <yield-multi3>
        <div class="header"><span>header2</span></div>
        <div class="content"><span>content</span></div>
      </yield-multi3>
    </yield-multi3>
```

でも、こんな風になってしまう。

```html:結果：header2が消えている
    <yield-multi3>
      <div class="header"><span>header1</span></div>
      <yield-multi3>
        <div class="content"><span>content</span></div>
      </yield-multi3>
    </yield-multi3>
```

# 何が問題

正規表現で、解析しているので、その限界。ということで、木構造の段階で解析してやればよい。

1. 対象のhtmlのノードの子供をなめる。
2. 子供がyieldタグであれば、to属性の名前をキーとして子供のinnerHTMLにして、消す。
3. 対象のhtmlのノードでinnerHTMLをyield用のhtmlとする。

たとえば、前の例では、こんなオブジェクトに変換させる。

```js
{
  "header": "<span>header1</span>",
  "": '<yield-multi3>'+
      '  <div class="header"><span>header2</span></div>'+
      '  <div class="content"><span>content</span></div>'+
      '</yield-multi3>'
}
```

ようなパッチを書いてみた。
でも、かなりのコードが影響受けるので、ちょっと微妙だけど、場所的には妥当かな。
途中の呼ばれる関数の引数がinnerHTML(String)からObjectに代わるので、ちょっと気になるけど。

# URL
修正前 http://plnkr.co/edit/5jCnKV93z0wAmpjkDYp9?p=preview
修正後 http://plnkr.co/edit/drOMHJ0TgMslyM4yld9p?p=preview
GIT https://github.com/uk-taniyama/riot/tree/fix/nested-slot-yield
個人的にRubyのstrftimeでよく使う表記

# 目的
* rubyの時刻表記を任意のフォーマットに整形してくれるメソッドであるstrftime
* 使い方はとても簡単だけど、忘れる
    * たとえば%mと%Mのどちらが月なのか？分なのか？とか
* %の表記を覚えるのもいいけど、使うフォーマットはいつも同じ
* よく使うフォーマットと表記の対応を羅列して、コピペで使えるようにしたほうが便利かと思ったのでメモとして作成した


# 環境
ruby 2.3.1

# コード

## まず時刻を取得
```ruby
> t = Time.now
=> 2017-01-06 09:54:49 +0900
```

## 年月日
```ruby
## 半角数字のみ
> t.strftime('%Y%m%d')
=> "20170106"

## 半角スラッシュ（/）区切り
> t.strftime('%Y/%m/%d')
=> "2017/01/06"

## 全角 年 月 日 区切り
> t.strftime('%Y年%m月%d日')
=> "2017年01月06日"
```


# 年月日時分

```ruby
## 半角数字のみ
> t.strftime('%Y%m%d%H%M')
=> "201701060954"

## 半角スラッシュ（/）区切りと半角スペースと半角コロン（:）区切り
> t.strftime('%Y/%m/%d %H:%M')
=> "2017/01/06 09:54"

## 全角 年 月 日 時 分区切り（24時間表記）
> t.strftime('%Y年%m月%d日%H時%M分')
=> "2017年01月06日09時54分"

## 全角 年 月 日 時 分区切り（１２時間表記）
> t.strftime('%Y年%m月%d日%I時%M分%p')
=> "2017年01月06日09時54分AM"
```


# 年月日時分秒
```ruby
## 半角数字のみ
> t.strftime('%Y%m%d%H%M%S')
=> "20170106095449"

## 全角 年 月 日 時 分 秒区切り（24時間表記）
> t.strftime('%Y年%m月%d日%H時%M分%S秒')
=> "2017年01月06日09時54分49秒"
```

## 0を除いた表記
*  __%__ の後に __-__ を挿入する

```ruby
## 年月日
> t.strftime('%Y年%-m月%-d日')
=> "2017年1月6日"

## 年月日時分
> t.strftime('%Y年%-m月%-d日%-H時%-M分%')
=> "2017年1月6日9時54分%"

## 年月日時分秒
> t.strftime('%Y年%-m月%-d日%-H時%-M分%-S秒')
=> "2017年1月6日9時54分49秒"
```

# 参考
* [class Time (Ruby 2.3.0)](https://docs.ruby-lang.org/ja/2.3.0/class/Time.html)

# 備考
* 例にする時刻を２４時間表記と１２時間表記のメリハリがつく時刻にすればよかった
[Java][Java EE][Glassfish] (続)Glassfishのキャッシュを疑っていくスタイル

[Glassfishのキャッシュを疑っていくスタイル](http://qiita.com/opengl-8080/items/838758ea34efcb0ea958)を真似っ子して、自分もGlassfishのキャッシュを疑っていくスタイルで生きていこうという宣言です。

Glassfishを使っていると、こんな症状が出ることがあります。

- アプリをデプロイしなおしたら、なんでかエラーで動かない。
- JDBCリソース追加したら、Glassfishが起動しない。
- エラーが出た。 `RAR7132: Unable to enlist the resource in transaction. Returned resource to pool.`
- エラーが出た。 `RAR5117 : Failed to obtain/create connection from connection pool [ ... ]. Reason : com.sun.appserv.connectors.internal.api.PoolingException: java.lang.IllegalStateException: Local transaction already has 1 non-XA Resource: cannot add more resources.  ]]`
- エラーが出た。 `RAR5114 : Error allocating connection : [Error in allocating a connection. Cause: java.lang.IllegalStateException: Local transaction already has 1 non-XA Resource: cannot add more resources.  ]]]`

そんなときは、このスタイルでいきましょう。 
↓
[Glassfishのキャッシュを疑っていくスタイル](http://qiita.com/opengl-8080/items/838758ea34efcb0ea958)

でもきっと、Payaraへ移行するのが最も正解に近い。
ブラウザのフォームのオートコンプリート機能を用いたフィッシングに注意！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">This is why I don&#39;t like autofill in web forms. <a href="https://twitter.com/hashtag/phishing?src=hash">#phishing</a> <a href="https://twitter.com/hashtag/security?src=hash">#security</a> <a href="https://twitter.com/hashtag/infosec?src=hash">#infosec</a> <a href="https://t.co/mVIZD2RpJ3">pic.twitter.com/mVIZD2RpJ3</a></p>&mdash; Viljami Kuosmanen ⭐ (@anttiviljami) <a href="https://twitter.com/anttiviljami/status/816585860661518336">2017年1月4日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

流れとしては、

1. CSSでフォームの一部を隠す
2. ブラウザのオートコンプリート機能を使って名前等を入力する
3. 送信ボタンを押すと、住所などの意図しない情報まで送信されている

といった感じです。 [anttiviljami/browser-autofill-phishing](https://github.com/anttiviljami/browser-autofill-phishing) から実際に試すことができます。自分も、住所や電話番号が抜かれていることが確認できました。

## どう対処するか？

こういった方法がある以上、現状だとブラウザのオートコンプリート機能を使わない、以外に対処法はなさそうです（一応、ソースを見れば分かるかもしれませんが･･･）。

自分はあまり意識したことがなかったので、今後は気をつけようと思います。
Windows7 AutoHotkey HHKB Pro2 Vimライクっぽいもの

HHKB Pro2にはカーソルキーがありません。
vimに似たカーソル操作で動かすためにAutoHotkeyを導入しました。
これでほぼホームポジションから手を動かさずに操作できます。
キーはアプリごとに設定する必要があります。
ファイル操作などはマウスを使っています。

自分用のメモ書き
AutoHotkeyの使用例

Window毎にキー設定を変える
AutoHotKeyのツールである Window spyで対象アプリのClassを見つける。

例
Window Title Class and Process
AutoHotkey.ahk - メモ帳
ahk_class Notepad     <<<<<<ここの文字列をコピー
ahk_exe notepad.exe

<img width="573" alt="AutoHotkey.png" src="https://qiita-image-store.s3.amazonaws.com/0/44761/4df80db2-c71b-f864-007d-f9ac032d8e2a.png">


```AutoHotkey:AutoHotkey.ahk
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#Warn  ; Recommended for catching common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

;＝基本
; 「;」セミコロンの右側はコメント文になる。
; 「;」セミコロンは行頭または半角空白後に置く。
; 「;」キーを利用するときは`を先頭において「`;」と書く。
; 複数のシンボルを同時に指定するときは、
; 「!+」のように間に何も開けずに連続して記述する。
; 「a::b」と書くと、aを押すとbが押されます。

;＝記号
;修飾シンボル
;+ Shift
;^ Control
;! Alt
;# Win
;& 2つのキーを連結（同時押し）

;＝注意
;CapsLockキーをCtrlキーに
;Capslock::Ctrl
;sc03a::Ctrl
;CaplLockを変更すると不具合あるらしい。（OKという報告も有り）
;ちなみに、CapsLock→CtrlはHHKB Pro2では不要。
;ちなみに、CapsLock→Ctrlはネットブックではレジストリ書き換え（by KeySwap）で実行済。

;＝テンプレ（対象アプリウィンドウを増やすためのテンプレ）
;|| WinActive("")		;コメント

;＝基本HHKB
# If WinActive("ahk_class Notepad") 		;メモ帳
|| WinActive("ahk_class Chrome_WidgetWin_1")	;Chrome
|| WinActive("ahk_class Hidemaru32Class")	;秀丸
|| WinActive("ahk_class XLMAIN")		;エクセル
|| WinActive("ahk_class CabinetWClass")		;エクスプローラー
|| WinActive("ahk_class TMainForm")		;Leeys

;＝英文字変換
^m::Send, {F10}			;英文字に変換
^+m::Send, {F7}			;カタカナに変換

;＝カーソル（Ctrl+英字でカーソル移動）
^h::Send, {Left}
^j::Send, {Down}
^k::Send, {Up}
^l::Send, {Right}
^u::Send, {Home} ;行頭へ
^o::Send, {End} ;行末へ
# IfWinActive

# If WinActive("ahk_class Chrome_WidgetWin_1")	;Chrome
,::Send, ^+{Space}
# IfWinActive

;＝言語関係
;LWinキーをWindowsキーから半角/全角キーに変える
LWin::++Space
;RWinキーをWindowsキーから半角/全角キーに変える
RWin::++Space

```
macOS SierraでPassengerのApacheモジュールを簡単にビルドする方法

## 方法

```sh:shell
brew install apr apr-util
APU_CONFIG=$(brew --prefix apr-util)/bin/apu-1-config \
passenger-install-apache2-module --auto --apr-config-path $(brew --prefix apr)/bin/apr-1-config
```

- 要は環境変数の APR_CONFIG と APU_CONFIG に apr-1-config と apu-1-config へのフルパスを指定しておけばよいようです
- passenger-install-apache2-module には APR_CONFIG を設定する --apr-config-path オプションがあるのでこれを使います
- 一方、APU_CONFIG を設定する --apu-config-path オプションはないので自分で指定します

## 懸念点

ビルド後、次のようなエラーメッセージが出ますが、ほっといても問題ありませんでした。

> /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.12.xctoolchain/usr/local/bin/apr-1-config not found!.

## 参考

- Sierra ~~El Capitan~~へPassengerをインストール http://qiita.com/MasamiKumazawa/items/2c221e2bc10fd886b1d3
- https://github.com/Homebrew/homebrew-core/blob/master/Formula/passenger.rb#L25-L26
サービスのデータ集計でよく使うSQL集

サービスを運営していると、定期的に数値を集計しなければいけない場面に出くわしますが、特に集計関連のSQLは毎度調べることが多いのでまとめておきます。最近ではre:dashで保存しておいたりもできるので、パターンごとに共有しておくと良いかもしれない。

## 平均
### 日毎にレコード数をカウントして平均を算出
ここではfollowersというテーブルを例に、サブクエリで日別のレコード数をカウントした後に平均を算出しています。

```mysql
/** 平均を算出 **/
SELECT
    avg(a.num)
FROM
(
    /** まず日毎のレコード数をカウント **/
    SELECT
        count(following_user_id) as num
    from
      followers
    WHERE
      created_at BETWEEN '2016-01-01 00:00:00' AND '2016-01-31 23:59:59'
    GROUP BY 
      DATE( created_at )
) as a;
```

## ランキング
### 期間内の投稿のいいねのランキング
likeテーブルと投稿テーブルをjoinしてランキングを作るクエリです。

```mysql
SELECT 
    count(likes.id) as count, 
    likes.post_id
FROM 
    `likes` 
LEFT JOIN
    posts as p
ON
    c.id = likes.post_id
WHERE 
    likes.created_at BETWEEN '2016-08-03 00:00:00' AND '2016-08-03 23:59:59' 
GROUP BY 
    likes.post_id
ORDER BY 
    count DESC
LIMIT 100;
```

## 日によってデータがないものを連続データとして扱いたい場合

```mysql
SELECT
	d, hoge_count
FROM(
	SELECT
    date_add('2016-10-13', interval td.generate_series day) as d
    from
    (
        SELECT 0 generate_series FROM DUAL WHERE (@num:=1-1)*0 UNION ALL
        SELECT @num:=@num+1 FROM `information_schema`.COLUMNS LIMIT 1000 /* LIMIT指定しないと無限にインクリメントしてしまう */
    ) as td
) as t1
LEFT OUTER JOIN
(
	SELECT
		 date(created_at) as created_at, count(id) as hoge_count
	FROM
		hoge
  	WHERE
  		deleted_at IS NULL
	GROUP BY
		date(created_at)
) as c
ON
	t1.d = c.created_at
WHERE
    d < '2017-01-10' /* ここで範囲指定 */
ORDER BY 
    d desc
```

## その他
```mysql:指定カラムに入っている最大文字数が知りたい
SELECT MAX(CHAR_LENGTH(name)) FROM table;
```

```mysql:日付毎の数値
SELECT DATE(created_at), COUNT(*) FROM hoge GROUP BY DATE(created_at);
```
dockerのapacheコンテナにすぐログインできるワンライナー


こんだけです。

```sh
docker exec -it `docker ps | grep apache | awk '{print $1}'` /bin/bash
```


コンテナの名前に含まれる``apache``をgrepして、コンテナIDを``awk``ってdocker execに渡しているだけなので
apacheを他の名前に変えればmysqlコンテナなんかにも即ログイン可能に！

長いコンテナ名を打つのに疲れたり、``docker ps``でCONTAINER ID調べて``docker exec``がだるくなってきたあなたにオススメ。


``~/.bashrc``にalias登録しとけばさらに実用的に。

```~/.bashrc
alias docker-apache="docker exec -it `docker ps | grep apache | awk '{print $1}'` /bin/bash"
alias docker-mysql="docker exec -it `docker ps | grep mysql | awk '{print $1}'` /bin/bash"
```

では良いdockerライフを〜
Adobe XD - 使いやすくなったXDスマホアプリ編

ついにWindows版もでましたXDですが、スマホアプリのXDもバージョン1.2になってものすごく使い勝手が上がったので自分メモ。

# オフライン対応

![0001.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/b7068ebd-329a-9193-64b5-df7b0f15d329.gif)

USB接続中のみアプリ上で表示できなかったものが、
デバイスにキャッシュされるようになり、
ついに有線の重力から（ちょっぴり）解放されました。
打ち合わせ前に複数台のプレビュー端末にキャッシュ忍ばせておけば、
使用イメージの同時共有が非常にしやすくなり超スマート。
いままでの有線式のアプリプレビューの
XDファイル編集者向けの端末確認メインだった感触から、
一気に対クライアントレビューに使える強力なツールとなった印象デス！

# Creative Cloud Files対応

![cc.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/8cef2567-fbcb-83df-b408-faa301951721.gif)

とはいえキャッシュさせるのにUSB接続は必要じゃねーかとなるんですが、
Creative Cloud FilesフォルダにXDファイルを入れておけば、
USB接続無しでファイルプレビューからのキャッシュで完全無線化を（ほぼ）完備。
複数端末で、アプリへのログイン接続が必要にはなりますが、
XDファイル更新→Creative CloudのXDドキュメント再読込で
リアルタイム風のアプリ上での編集作業＆プレビューが実現。（めんどいけど
仕様ぎめなど編集頻度の高い時は有線で、
もう一段回進んで使い勝手の検証は無線でという使い方が良いかもっすね！

# 画像共有

![slack.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/b855e45b-1a4a-0a16-8f78-ff7135b94a95.gif)

ああ、この画面ココ変えて欲しいというケースで、
スマホでキャプしてslack起動してーと、ちょいとステップが面倒な指示出し作業。
対象画面を即slackなどに貼り付けて指示出しできるようになりました。
もうデスクでカシャカシャとシャッター音出さなくて済んじゃうのです！
iOS新しければ解決じゃんは言わない約束。

# まとめ
Windows版ではまだ使えない機能があったりしますが、
XD本体だけでなくアプリ側も着実にアップデートが進んでるのは流石のヒトコト。
無線でのライブプレビューができれば至極ですが、
それも遠くない未来と信じて今回は『完』。
iOS版のofVideoGrabberの解像度

# 概要
　iOS10では解像度は一律360x480なる。

# 確認
```
grabber.setup(width, height)
```
という形で初期化時に取得サイズを指定出来るが、どんなサイズを指定しても一律360x480になる。


ただし

```
grabber.draw(width, height)
```
ではサイズの変更は可能。

# その他
* 他のiOSバージョンでは未確認。
FirebaseのFacebook認証とFacebook SDKを一緒に使う

またFirebaseですが、妙にはまってしまったので書き記しておきます。
FirebaseにはFacebookをはじめとしてTwitterやGoogleアカウントで認証してユーザーをつくれる便利な機能があります。
いわゆるOAuth認証なのですが、Firebase側で用意されている認証関数を使うと、そこで独自にアクセストークンをつくって認証を全部やってくれてしまうため、便利な反面、普通にやっているとその認証情報をつかってプロフィールの情報とかフレンドリストとか、FacebookのJavaScript SDKを通した、Graph API等へのアクセスと両立できません。
しかし、そこは両立させたいのでどうやったら両立できるのか、でいろいろやってハマりました。
一応、公式の

[JavaScript で Facebook ログインを使用して認証する / 高度: 手動でログインフローを処理する](https://firebase.google.com/docs/auth/web/facebook-login?hl=ja)

に書いてあるっちゃ書いてるんですが、なんかちょっと手順が複雑になってたりもするので、一番シンプルなやり方です。基本的には、先にJavaScript SDKでログインして取得したトークンでFirebase認証するだけです。

まずは、javascript SDKを使うときに書く、いつものおまじないを書きます。
単純にFirebaseの認証を使う場合はこれを書かなかったりするのですが、今回はJavaScript SDKを使うので書きます。

```javascript:
  window.fbAsyncInit = function() {
    FB.init({
      appId      : 'your-app-id',
      xfbml      : true,
      version    : 'v2.5'
    });
  };

  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "//connect.facebook.net/en_US/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
```

その後は、まずは普通にFB.login()でログインしてもらいます。
レスポンスが来たら、FB.getLoginStatus()でちゃんとログインしているかを確認します。
ログインできていたらその段階で当然、Facebookのアクセストークンを取れるのでそれを使って、firebase.auth.AuthCredentialオブジェクトをつくって、それを引数にしてsignInWithCredential()関数を実行すると、さっき普通にFB.login()して認証した情報をそのまま使ってFirebaseの認証を行うことができました。

```javascript:
FB.login(function(response) {
	checkFBLogin(response);
}, {scope: 'public_profile,email'});

function checkFBLogin(response){
	//ログインのステータスチェック
	FB.getLoginStatus(function (response) {
		if (response.authResponse) {
			//ログインしている
			//レスポンスに入っているアクセストークンを使って、firebaseのcredentialをつくる
			var credential = firebase.auth.FacebookAuthProvider.credential(response.authResponse.accessToken);
			//signInWithCredential()を使うと、既に存在しているアクセストークンでFirebase認証できる
			firebase.auth().signInWithCredential(credential).then(function() {
				//認証できた！
			}).catch(function(error) {
				//エラー
			});
		} else {
			//ログインしてない
		}
	});
}
```

作業をしていたのが休み明けなのもあって、妙にハマってしまったのがこの後で、じゃあFirebaseで認証を成功させた後、どうやって自分のユーザー情報とかを取得すればいいんだ?! と思って悩みました。通常の認証だと、firebase.auth().signInWithPopup(provider).then(function(result) {
とかやってresultの中にそのへんの情報が入っているのでちょっと勝手が違います。

よく考えると当たり前で、認証が成功している段階においてはいつでもどこでも、firebase.auth().currentUserに直接アクセスすれば情報が取れます。なので下記のようになります。

```javascript:
firebase.auth().signInWithCredential(credential).then(function() {
	//認証できた！

	var _user = firebase.auth().currentUser;
	console.log(_user.displayName);

}).catch(function(error) {
	//エラー
});
```

そうすると、console.log(_user.displayName)のところでFacebookアカウントにひもづいた名前（私の場合、"Qanta Shimizu"）が出力されるはずです。
と同時に、

```javascript:
firebase.auth().signInWithCredential(credential).then(function() {
	//認証できた！

	var _user = firebase.auth().currentUser;
	FB.api('/me/location', function(response) {
		if (!response || response.error) {
			//エラーハンドリング
		} else {
			//Graph APIからの情報
		}
	});

}).catch(function(error) {
	//エラー
});
```

みたいな感じで同時にGraph APIへのリクエストをしたりすることも可能です（例文の/me/locationの取得には、Facebookに使用申請して許可をもらう必要があります）。
Ansibleで特定のtaskだけを1台ずつ実行させる

# serialが使えれば良かったのだけど

Ansibleでは特に指定がないと処理対象のホストに同時にモジュールが実行される。
そのため例えばサービスの再起動を全台同時に行ってしまうと、せっかくロードバランス等していても外から見て一時的にサービス停止となってしまう。

全台同時に実行されないためには`serial: (最大同時実行台数)`を指定しておけば良いのだが、残念ながらserialはplay単位でしか指定できない。
play単位でしか指定できないということはroleも再起動するためのtaskだけ分けないといけないか、role丸ごとserialの影響下に置かないといけないということであり、前処理の関係上現実的にそれが困難であることもあり得る。

もちろんこれまでもtaskごとのserial機能の追加要望などが挙がっていたりもしたのだが、どうやら実装が難しいらしく今のところ追加される気配はない。
https://github.com/ansible/ansible/issues/12170

# ではどうするか

さて、上記URLの最後にワークアラウンドが書かれている。引用すると以下の通り。

```yaml
- mytask: ..
  delegate_to: "{{item}}"
  run_once: true
  # many diff ways to make the loop
  with_inventory_hostnames: all
```

delegate_toとrun_onceを使うのは固定で、あとはループを何で回すかであるようだ。
さあ、何で回そう。

想定される使い道として、大抵はhandlerとして呼ばれるtaskで行うことになるだろう。
とするとnotify側のtaskがchangedになったホストだけに適用されるのが要件になるだろう。

handler側にrun_onceがあるということは、notify側がchangedになったうちのどれか1台だけでhandler側が実行されるということだ。（だからわざわざ台数分ループで回してdelegate_toでホストごとに実行させている）

ならばまずどのホストでchangedであったのかをhandler側に伝える必要がある。これがないと実行しているホストは自分がnotify側でchangedであったことを知っているが、他のどのホストがchangedであったかを知りようがないからだ。
というわけでnotify側ではregisterを使う。

```yaml
- name: task1
  mytask1module: ..
  notify: handler1
  register: task1result
```

handler側ではホストごとのregisterされた情報をhostvarsから引き出して、そこから実行判断をすれば良い。play_hostsはplayの対象となっているホストのリストである。

```
- name: handler1
  myhandler1module: ..
  delegate_to: '{{ item }}'
  run_once: yes
  when: hostvars[item].task1result | changed
  with_items: '{{ play_hosts }}'
```

# 欠点

この方法ではserialのように好きな台数を指定できるわけではなく、必ず1台ごとに実行されることになる。

また、notify側がchangedになったうちのどれか1台だけでhandler側が実行されるため、PLAY RECAPとして表示される実行の最終結果も、その1台だけに加算されるのが残念である。
以下はnode1ではchangedにならず、またnode2がhandler側になった場合のPLAY RECAPの例である。

```
PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0
node2                      : ok=4    changed=2    unreachable=0    failed=0
node3                      : ok=3    changed=1    unreachable=0    failed=0
```

# だめだった例

なお、途中以下のようなhandler側も考えたのだが、skipはモジュールの処理時間より圧倒的に短く、またplay_hostの順番は処理ホストごとに一定しないのでこれだと同時に実行される可能性が高い。

```
- name: handler1
  myhandler1module: ..
  with_items: '{{ play_hosts }}'
  when: inventory_hostname == item
```

やはり1台ごとに実行させるためには実行主体をrun_onceで1台にしてから、並列処理されないようループを使うしかなかった。
CentOS 5.xにyumでImageMagick 6.9.xをインストールする


## remiリポジトリの追加

```bash
# 先にepelを追加
$ rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
# remiを追加
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
```

### 参考URL
- [Centos5,6,7にEPEL/REMIのyumリポジトリの追加をする。 - Qiita](http://qiita.com/chidakiyo/items/3b81a442dda34d439b42)
- [CentOSにEPELリポジトリを追加する - Qiita](http://qiita.com/muniere/items/6c4923a070cbbd824f39)

## remiリポジトリからImageMagick6系をインストール

```bash
$ yum install -y ImageMagick6 ImageMagick6-devel ImageMagick6-c++ ImageMagick6-c++-devel --enablerepo=remi
```

### 参考URL
- [ImageMagick6 and ImageMagick7 - Remi's RPM repository - Blog](https://blog.remirepo.net/post/2016/12/12/ImageMagick6-and-ImageMagick7)
Cognos BI Dynamic Query Mode(DQM)のキャッシュ保持期間の話

Cognos BIでは、レポート参照時のクエリーの実行モードとして、動的クエリーモード(DQM)と互換クエリーモード(CQM)が存在します。
いまどきのCognos BIでは、DQMがデフォルトになっていますが、DQMではレポート実行時にCognos BIサーバー上のJVMメモリー(Query Service)にキャッシュを保持し、再利用によるパフォーマンスの向上が図られています。

このキャッシュの保持期間について、特にRelational Modelでの動作について、きちんと説明されている情報があまり無いので、私なりの理解をまとめておきます。

##DQMの基本情報
Dynamic Query Mode(DQM)の基本情報は、何と言ってもCookbookを参照する事が一番です。
DQMのキャッシュがどのようなものかの基本的な話はこちらをご参照下さい。
**The Cognos BI 10.1.1 Dynamic Query Cookbook**
http://www.ibm.com/developerworks/data/library/cognos/infrastructure/cognos_specific/page529.html

##DQMのDMR \& OLAPモデルでのキャッシュ保持期間
DMR(Dimensionally Modeled Relational)とOLAPでのキャッシュ保持期間について説明します。
念のため、DMRとはデータソースとしてはリレーショナルなデータベース(OracleやDB2等)ですが、以下のCognosのサンプルのモデルのように、標準ディメンションや数値ディメンションなどで構成される、階層構造を定義したモデルとなります。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/9f7dea6b-f0f5-a0c2-c985-ba0833ac5dcb.png)

OLAPとは、Cognos TM1やSAP BWやOracle Essbase等の、Cubeベースのデータソースのモデルとなります。

キャッシュ保持期間は、デフォルトで24時間となっていて、
C:\Program Files\ibm\cognos\c10_64\configuration\xqe.securecache.config.xmlの中の、clearCacheEveryXminituesの箇所で指定できます。
24時間はキャッシュが作成されてから24時間となり、キャッシュが作成されてから、他のレポート実行で再利用されたかどうかは関係がありません。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/eec2ecc1-f97a-91de-3e70-3d1f69639855.png)


**Automatic cache clearing**
http://www.ibm.com/support/knowledgecenter/en/SSEP7J_10.2.1/com.ibm.swg.ba.cognos.ug_cra.10.2.1.doc/c_dqm_qry_srvc_auto_cache_clr.html

##DQMのリレーショナルモデルでのキャッシュ保持期間
現在ではDQMがデフォルトとなっていますので、実際の使用用途は、このケースが最も一般的と思います。
データソースとしてはリレーショナルデータベースで、先ほどのDMRのような階層構造を持たない一般的なモデルです。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f9aafe63-4298-fb91-cc7c-b70b825de736.png)

このモデルでのDQMキャッシュ保持期間は、こちらのQuery Serviceのパラメーターの「アイドル接続タイムアウト」の期間で決まります。
ちなみにこのキャッシュ保持は、他のレポートが実行されると、例えキャッシュが再利用されていなくても、タイムアウトのカウントはその時点からにリセットされます。
最大値は65536秒なので、もしそれ以上の期間のキャッシュを保持したいのであれば、ダミーのレポートを定期的にスケジュールで実行するなど、工夫が必要です。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8b2364ae-fae7-df18-b974-bef70c1ee7fb.png)

##DQMキャッシュのクリアーについて
Cognos Administrationの「キャッシュをクリア」からDMR,OLAP,リレーショナルモデルに関わらずクリアは可能で、APIを用いてコマンドラインからのクリアも可能です。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3598100d-c8ec-43f3-6590-de38e0319157.png)


**Clear everything in the cache**
http://www.ibm.com/support/knowledgecenter/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_cra.10.2.2.doc/t_asg_clear_qs_cache.html#ASG_clear_qs_cache

**Query service command-line API**
http://www.ibm.com/support/knowledgecenter/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_cra.10.2.2.doc/c_dqm_qry_srvc_api.html
docker logs で表示されるログの保存場所とローテート方法

docker でコンテナを起動したとき、コマンドとして指定したプロセスが標準出力・標準エラー出力に吐いたログは `docker logs ${コンテナID}` で閲覧できる。

自分で docker のサービスを運用するにあたって、**このログが溜まりつづけてホスト側のディスクを圧迫してしまうのではないか？**という懸念があったので、ログの保存場所やローテート方法を調べた。

## ログの保存場所

そもそも docker にはこのログの保存の仕方をカスタマイズできる Logging Driver という仕組みがあるのだが、デフォルトでは `json-file` というドライバーが利用されている。

```
$ docker info | grep Log
Logging Driver: json-file
```

ドライバーが `json-file` の場合、`docker inspect` コマンドでログの保存場所を調べることができる。(他のドライバーについては未確認。)

```
$ docker inspect 8f18b6bfb58a | grep 'LogPath'
        "LogPath": "/var/lib/docker/containers/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138-json.log",

$ cat /var/lib/docker/containers/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138-json.log
## docker logs 8f18b6bfb58a したときと同じ出力が得られる
```

## ログのローテート方法

上記のログはデフォルトではローテートされないので、`docker run` するときのオプションでローテート設定を指定してやる必要がある。

```
--log-opt max-size=[0-9]+[kmg]
--log-opt max-file=[0-9]+
```

100MB ごとにローテートして 10 世代まで保存するならこんな感じで `docker run` するとよい。

```
docker run -d --log-opt max-size=100m --log-opt max-file=10 my-docker-image
```

1 コンテナを延々と立ち上げっぱなしにするような用途で、標準出力・標準エラー出力に大量のログを出力しているとディスクを圧迫してしまう可能性があるので、設定しておいたほうがいいかも。

## 参考資料

* [Configure logging drivers - Docker](https://docs.docker.com/engine/admin/logging/overview/)
ショートカットを活用しよう - 5 - Alt + ↓

# <kbd><kbd>Alt</kbd> + <kbd>↓</kbd></kbd> の効果

コンボボックスなどで、ドロップダウンリストを表示します。
例えば、前回の[ファイル名を指定して実行]ダイアログでの場合。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/65065886-aab6-b7f3-fd60-9271ba5713a8.png)
から
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/8f825bae-a7ae-111a-b483-a6f478fc5378.png)
といった感じで、ドロップダウンリストが表示されます。

アプリケーションなどによっては表示されない場合もあるかもしれませんが、まずほとんどで機能するかと思います。

以上


|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Win</kbd> + <kbd>R</kbd></kbd>](http://qiita.com/rrryutaro/items/9ad55f4f72e3a1d599b8)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Win</kbd> + <kbd>E</kbd></kbd>](http://qiita.com/rrryutaro/items/60fc01ec753a25ffecf8)|
Mac 10.11.6 bash→ zsh 移行メモ

自分用メモ
#経緯
- これまでMac標準という理由でbashを使ってたが…
- unixコマンドに詳しくないため  
→ 「MacOSXターミナルコマンド ポケットリファレンス」で勉強中  
→ いろんなシェルがあるらしいと知る  
⇒ **zsh** が便利そう⇒ 採用

#手順
[こちら](http://qiita.com/akashima/items/bdcde778644086533ade)を参考にさせて頂いた。

1)brewから最新zshをインストール

```:コマンドプロンプト
brew install zsh zsh-autosuggestions zsh-completions zsh-syntax-highlighting colordiff
```
2) /etc/shells 末尾に以下を追記（シェルの変更対象に含むため）

```:/etc/shells
/usr/local/bin/zsh
```
3)シェルの変更（システム環境設定→ ユーザとグループ→ ログインユーザをctrlクリック「詳細オプション」でも同様）

```:コマンドプロンプト
chsh -s /usr/local/bin/zsh
```
4)ターミナル再起動
このとき、q 0 1の質問をされるが(0)を選択。
空の.zshrcが作成された（初回のみ）

5).zprofile を作成

```:.zprofile
# 補完機能（ls -などの補完ができる）
autoload -U compinit
compinit

# これ以降はqiita記事参考に試行錯誤中
...
```
コマンドプロンプトから読み込む
ついでに[zplug（公式？git）](https://github.com/zplug/zplug)を入れた。

```:コマンドプロンプト
source .zprofile  
curl -sL zplug.sh/installer | zsh
```
6)zplugについて[こちら](http://post.simplie.jp/posts/59)を参考にした。

ここまで実行したが、今後カスタマイズすることがあれば *文末* に追記する

--
#備考
- ブラグイン管理どれにしようか？
 [oh-my-zsh](http://vdeep.net/zsh-oh-my-zsh)なるものに興味持ったが
→ **zplug**を採用（こっちのが軽い様子）

- .zshrc と.zprofileの読み込み順など[こちらを参考](http://qiita.com/ktr_type23/items/3eb782f98c7a5f4c60b0)にした

--
#追記（予定）

今後、発見やカスタマイズがあればここに書くつもり。
GCS Fuseを使ってみる


[Google Cloud Platform(1) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gcp)の25日目です（今何年何月何日でしたっけ？ごめんなさい…）

## GCS Fuseとは

[公式ドキュメント](https://cloud.google.com/storage/docs/gcs-fuse)

Google Cloud StorageのFuseアダプタです。
GCSバケットをファイルシステムとしてマウントできます。
MacとLinuxに対応してます。

ソースコードは[GitHub](https://github.com/GoogleCloudPlatform/gcsfuse/)に公開されています。

GCP公式のリポジトリで公開されていますが、コミュニティサポートのみのオープンそースツールです。

GCSの安いストレージをファイルシステム代わりに使えるとかめっちゃ便利やんけ、安価な無限ストレージゲット！うおおお！と思った方。
3割正解。残りは…。

今回はそんな話。

## GCS Fuseを使ってみる

さっそく使いましょう。

### インストール

今回はMacで。HomeBrewでインストールします。

1. `brew cask install osxfuse`でOSX Fuseをインストールする
2. `brew install gcsfuse`でGCS Fuseをインストールする
3. 再起動する
4. 終わり

### 使う前に

`gcloud auth login`でGCPアカウントにログインしましょう。
そのアカウントでGCSにアクセスします。

### マウント

1. `gsutil mb gs://hogehoge`バケット作成
2. `gcsfuse hogehoge /path/to/mount`でマウント
	- `gs://`いらないです。
3. あとは普通にローカルファイルとしてコピーとかできます。

## 使ってみた感想

**おっせえ…**

まあこれに尽きるわけですが。
でも普通に考えれば当たり前ですね。
ローカルのファイルシステムに書き込んでるわけじゃなくてGCSにアップロード・ダウンロードしているのでその分だけ時間がかかります。
でもドキュメントによるとgsutilと同じスピードは出るらしい。
だから普通にgsutil cpとか使ってるときくらいの心の余裕を持ちましょう,ということです。

その他にもこんな点が。

- GCSのファイル取得とかたまに失敗する
	- SLA的にそんなもん
	- 諦めない心が必要
- 転送料金かかるよ
	- わりと何してもGCSの有料コマンドになる
	- 頻繁に更新するようなファイルだと毎回ダウンロード・アップロードしちゃう。
	- [ここらへん](https://cloud.google.com/storage/docs/gcs-fuse#charges)にまとまってます。

### パフォーマンスに関して

ローカルファイルに比べたら圧倒的に遅いです。
ドキュメントでは小さいファイルを一個だけ扱ったりしまくってると遅くなるから注意しろといってます。
でかいファイルか、一度に複数のファイルを扱えば良くなるみたいです。

### レートリミット

GCSへのアクセスにはデフォルトでレートリミットがかかります。
マウント時のオプションでいくつか指定できます。
デフォルトだと5リクエスト/秒です。

### キャッシュ

マウント時にキャッシュ時間の設定もできますね。

## まとめ

大体以下のような用途では使えるのかな、と思います。

- たまにしかアクセスしないファイル置き場
	- バックアップとか
	- 自分で編集する類のファイルは向いてない（保存する都度通信しちゃう）
- アプリの設定ファイル置き場（これが一番な気がする）
	- 複数インスタンスとかで設定ファイルを共有したいときには便利かも
	- Readonlyで。

あれ？別にFUSE使わなくてもよくね？って感じにはなるけどまあそんな感じです。
NASくらいのつもりで使うとイライラMAXになるから使い所を見極めて正しく使うといいと思います。
技術英語 > C++ has [the C family resemblance] but with distinctive features:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 294 / 12833)

> C++ has **<font color=red>the C family resemblance</font>** but with distinctive features: 


https://www.merriam-webster.com/dictionary/resemblance
> a :  the quality or state of resembling; especially :  correspondence in appearance or superficial qualities
> b :  a point of likeness :  similarity

<hr>
関連して思い出したのは
(類似を偶然とみなした場合)

http://qiita.com/7of9/items/fbb265beeec40b6d9678
> What a coincidence! 

<hr>
余談

アイデア自体は複数の人がほぼ同時期に考え出していると聞いたことがある。成果の違いは、それを具体化するかどうか。
The Gridded Population of the World in Google Earth Engine の感想

# [The Gridded Population of the World in Google Earth Engine](https://medium.com/@mdhancher/the-global-population-of-the-world-ae8b8b362c99#.v3365hynl) の感想

データそのものにも興味があるけど、この Google Earth Engine のコード例の北カリフォルニア感が好きですね。データをウェブの向こう側に持っていって、ウェブネイティブかつクラウド親和であるけれども通信層とか隠蔽した API を晒す。API はどちらかというと関数型趣味である。こういう技術が、だんだんと自然にクラウドの霧が晴れていくなかで現状よりもややオープン気味に主流化するというのがだいたい5年スパンでは正しい道ではないでしょうか。その中で、既存の API のエンタープライジーなところが晴れていって、Leaflet の API のように奥が深くないものに改善され、またオープン化する見返りに計算負荷がクラウドの向こう側からブラウザサイドにある程度まで移転する。そこで次世代ウェブが取り込まれる、鍵となる要素技術はもちろんここでもタイル。（インタフェース的には隠蔽されるとはいえ。）これならば、プラットフォーマーもデータプロバイダーも共存できるはず。プラットフォーマーとデータプロバイダーがお互いに自分の有利な形の接触を求めながら、切磋琢磨していく形が継続するのが望ましいのであり、どちらかがどちらかに完全隷属するということは市場原理的にもウェブの原理的にも政治的にも経済的にも相当難しいので、逆に安心してディスラプティブに進むべきである。それにしても、先の rebuild.fm のエピソードにもあったが、もう完全に「GUIよりもcodeがクール」が定着しましたね。これは世の中の進歩である。

（追伸）短期的には、この処理モデルに合致するデータをどれほど短期的に揃えられるかがプラットフォーマー側のチャレンジかもしれませんね。この処理モデルがピッタリはまるデータって、それほど存在しないかもしれないし、この処理モデルでベネフィットが得られるユーザクラスターを短期に作り上げるのは、それほど簡単ではないかもしれない。難しいだろうという側に賭けるとすれば、そのような観点があるかもしれません。従前もクラウドGISというのは難しかったし、従前のクラウドGISとくらべての新しみは、codeが晒せるという程度しか今は私には見えていません。

（追伸）この流れと同じ流れにいて、すこしだけ重なる部分をオープンソースでやっているのが http://turfjs.org なのではないかと思います。こちらも、北カリフォルニア産のようです。turf の流れと Google Earth Engine の API の流れは似ているような気がしていて、いずれもデータプロバイダーというよりはプラットフォーマーの持ち物ではありますが、こういうプロセッシングに対応したオンラインデータを出せるように考えておくのがウェブでのデータプロバイダーの生き残りの早道かと思います。

（参考）turf と Mapbox GL JS の組み合わせ例：https://www.mapbox.com/mapbox-gl-js/example/measure/
PowerShellメモ　特殊ディレクトリへ移動

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
カレントディレクトリを特殊ディレクトリに設定する関数。
[プロファイル](http://qiita.com/Kosen-amai/items/70513b51e9b67a856ff9#-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB "PowerShellメモ　基本：プロファイル - Qiita")に登録しておくのがお勧め。

# <i class="fa fa-file-text-o" style="font-size:1em;"></i> コード

```PowerShell
<#
.SYNOPSIS
    デスクトップへ移動
#>
function CdDt
{
    Set-Location ([Environment]::GetFolderPath([Environment+SpecialFolder]::DesktopDirectory))
}

<#
.SYNOPSIS
    マイドキュメントへ移動
#>
function CdMd
{
    Set-Location ([Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments))
}

<#
.SYNOPSIS
    マイピクチャへ移動
#>
function CdMp
{
    Set-Location ([Environment]::GetFolderPath([Environment+SpecialFolder]::MyPictures))
}

<#
.SYNOPSIS
    Program Filesへ移動
#>
function CdPf
{
    Set-Location ([Environment]::GetFolderPath([Environment+SpecialFolder]::ProgramFiles))
}

<#
.SYNOPSIS
    Program Files(x86)へ移動
#>
function CdPf86
{
    Set-Location ([Environment]::GetFolderPath([Environment+SpecialFolder]::ProgramFilesX86))
}

<#
.SYNOPSIS
    アプリケーションデータへ移動
#>
function CdAd
{
    Set-Location ([Environment]::GetFolderPath([Environment+SpecialFolder]::ApplicationData))
}
```

```PowerShell:実行例
PS C:\Work> cdpf
PS C:\Program Files>
```

# <i class="fa fa-cubes" style="font-size:1em;"></i> 動作確認した環境
* PowerShell V4 (Windows 8.1)
* PowerShell V5 (Windows 10)

# <i class="fa fa-book" style="font-size:1em;"></i> 参考サイト
* [Environment.SpecialFolder 列挙型 - MSDN](https://msdn.microsoft.com/ja-jp/library/system.environment.specialfolder.aspx)
* [Desktop と DesktopDirectory - Life like a clown](http://d.hatena.ne.jp/tt_clown/20110429/desktop/)
NanoPi NEO から Arduino Due のシリアルポートを使う


# 問題

NanoPi NEO 公式ファームウェアだとArduino Dueを接続してもシリアルポートが認識されない

# 結論

armbianを使え


# 経緯

Arduino Due のシリアルポートを認識させるためには[sam-ba](http://lxr.free-electrons.com/source/drivers/usb/serial/sam-ba.c?v=2.6.37)というドライバが必要っぽい
↓
NanoPi NEO 公式ファームのカーネルには含まれてないっぽい
↓
カーネルリビルドするか
↓
Allwinnerが提供してるtoolchainでmake menuconfigやるのどうしたらいいのかわからない
↓
ぐるる
↓
armbianを使えとのこと

armbianについては[こちら](http://qiita.com/nanbuwks/items/98eae3801edd24ede942)を。
[メモ] STM32のペリフェラル


- STM32CubeMX Version 4.18.0で、New Projectで出てくるやつ<br>
![Qiita-STM32_01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/1af2ba6d-e970-073b-1574-e09df6a84019.png)


|Peripherals |  |
|:--|:--|
|ADC 12-bit|Analogue-to-Digital Converter|
|ADC 16-bit|Analogue-to-Digital Converter|
|CAN|Controller Area Network |
|COMP|Comparator|
|DAC 12-bit|Digital-to-Analogue Converter|
|DCMI|Digital Camera|
|DFSDM|Digital Filter for Sigma-Delta modulators|
|DSIHOST|Display Serial Interface Host|
|Ethernet|Ethernet|
|FMC|Flexible Memory Controller|
|FMPI2C|Fast-mode Plus Inter-integrated circuit|
|HDMI CEC|High-Definition Multimedia Interface Consumer Electronics Control|
|HRTIM| High Resolution Timer|
|I2C|Inter-Integrated Circuit|
|I2S|Inter-IC Sound|
|IRTIM| infrared interface|
|LPTIM|Low-power timer|
|LPUART|Low-power UART|
|MDIOS|Management data input/output slave|
|OPAMP|Operational Amplifiers|
|QUADSPI|Quad SPI|
|RTC|Real-Time clock|
|SAI|Serial Audio Interface|
|SDIO|Secure Digital Input Output|
|SDMMC|Secure Digital and Multi Media Card|
|SPDIFRX|S/PDIF（Sony Philips Digital InterFace) RX|
|SPI|Serial Peripheral Interface|
|SWPMI|Single Wire Protocol Master Interface|
|Segment LCD|  |
|TFT LCD|  |
|Timer 16-bit|  |
|Timer 32-bit|  |
|Touch Sensing|  |
|UART|Universal Asynchronous Receiver Transmitter|
|USART|Universal Synchronous Asynchronous Receiver Transmitter|
|USB Device|Universal Serial Bus Device|
|USB OTG_FS|USB On-The-Go full-speed|
|USB OTG_HS|USB On-The-Go high-speed|
|
社会人が参加できそうなロボコンまとめ

IoT時代の到来・Makersブームが続く世の中、社会人になって改めてロボコンに興味が出た人も多いはず。
ということで、社会人も参加できそうなロボコンをまとめました。
他にもあればぜひ教えてください！

# （2017/02/20追記）2足歩行ロボット格闘技大会「ROBO-ONE」

> 2足歩行ロボット格闘技大会「ROBO-ONE」が関西で2月25日、26日に初開催となる。国内外から200台以上が出場し、頂点を競う予定。今回から完全自律型モデルのみで構成する部門が登場する。
> ROBO-ONEでは、腕自慢のロボットが集い、パンチや投げ技などで相手を倒す。3分1ラウンド、3ダウン制でトーナメントを行い、最強の1台を決める。2002年より年2回開催しており、今回で30回目。会場は神戸市立青少年科学館、通称「バンドー神戸青少年科学館」。レギュレーションの異なる3部門がある。

* https://internetcom.jp/202195/robo-one-auto

# レスキューロボットコンテスト

> 大規模都市災害における救命救助活動を題材としたロボットコンテストです。多くの方々に防災や災害対応ついて関心を持っていただいたり、次世代の研究者・技術者を育てたりすることを主な目的として開催しています。

* 応募締め切り：2017年1月31日（火）必着
* ラジコン型
* https://www.rescue-robot-contest.org/forTeam/


# 全日本ロボット相撲大会

> 正式名称は、「全日本ロボット相撲大会」。
> 1989年より開催されている競技大会で、 参加者が自作したロボット力士を技術とアイディアで戦わせる競技である。全国大会には高校生の部と全日本の部があり、全日本の部は両国国技館で開催されている。
> 土俵上に2台のロボットを置き、どちらかのロボットを土俵外に押し出すことで勝敗を決める。

* 自立型・ラジコン型
* http://www.fsi.co.jp/sumo/index.html


# マイクロマウス全日本

> マイクロマウス競技は、参加者自らが作った自立型ロボットが自律的に（自分の力だけで）迷路を探索し、 ゴールまでに達する最短時間を競う競技です。
> この競技は、1977年にＩEEE（米国電気電子学会）が提唱したことに始まり、日本では1980年より「全日本マイクロマウス大会」として 毎年開催され、我が国で初めての「ロボコン」として
> 30余年全日本大会が開催され続けている、世界でも最も歴史あるロボット競技会です。 
> 現在では全日本大会とは言え、欧米の他アジア地域からシンガポール・台湾・韓国等からも非常> に技術レベルの高いロボットが多く参加するなど、事実上の世界大会と言われています。

* 自立型
* http://www.ntf.or.jp/mouse/



# Intelligent Robot Contest

> スタート時を除いて人為的操作をいっさい加えないロボットを用いて，決められた作業を所定の時間内に行い，獲得した点数を競う．
> 競技は対象物が単純なチャレンジャーズコースと異種形状を正確に扱うことが求められるマスターズコースに分かれて行われる．

* 自立型
* http://www.inrof.org/


# かわさきロボット競技大会

> 高校生以上が参加するバトルロボット競技の他、川崎市内の小中学生が参加するJr.ロボット部門も開催します。バトルロボット部門は、脚・腕構造を持つラジコン型ロボットによる異種格闘技戦です。高校生以上の2名以上4名以下でチームを組み、190cm四方のリングの上で戦います。

* ラジコン型
* http://www.kawasaki-net.ne.jp/robo/


# ETロボコン

> 走行体（ロボット、ハードウェア）はワンメイク（市販キットを使った規定のもの）、バッテリーも同じものを使い、ソフトウェアの違いだけによる競技です。指定されたコース、課題を、走行体が速く正確に走行するシステムを開発します。開発にあたっては、UML等で記述されたシステムの分析・設計モデルを提出します。この分析・設計モデルの内容審査と、走行競技結果が総合評価されます。

* 自立式
* http://www.etrobo.jp/2016/
wgetコマンドで外部からPDFを取り出してpdftkでPDFを結合しよう

#はじめに
外部からpdfを取ってきて、それを最終的に結合するところまで持っていきます。自分へのメモです。
#環境
Ubuntu 14.04 LTS
#wgetで持ってくる
##-r
URL名で指定したディレクトリ内のファイルを再帰的に取得しています。
##-np
そのディレクトリ以外のディレクトリは遡らないことを明示しています。
##--http-user=ユーザー名 --http-passwd=パスワード
basic認証が必要なサイトに対して適用します。
##--restrict-file-names=nocontrol
日本語文字化けを防ぐためにあります。ファイル名を変えずにwgetするように指定しています。restrict-file-namesというオプションがnocontrolという意味です。Qiitaで見るとfileと-namesが離れて見えてしまいますが繋げてください。
##結局
最終的にこのコマンドを打ちます。
```wget URL名 -r -np --http-user=ユーザー名 --http-passwd=パスワード　--restrict-file-names=nocontrol```
例を挙げるとしたのようになります。
```wget hoge.com -r -np --http-user=1234 --http-passwd=5678　--restrict-file-names=nocontrol```

#wgetで持ってきたものを統合する
wgetしてきたファイルを結合していきます。(PDF)
##まずpdftkをインストール
```sudo apt-get install pdftk```
##pdftkコマンドを使う
```pdftk *.pdf cat output tougou.pdf```
これでtougou.pdfに全て統合されました。
###**Error: Unexpected Exception in open_reader()**
とか出てくる時あります。
この時はpdftkはやめて、pdfuniteを使いましょう。
```pdfunite *.pdf tougou.pdf```
#参考
[あらくさな日々をつれづれと:UbuntuでのPDFの結合、分割の方法](http://blog.livedoor.jp/arakusa/archives/1583682.html)
[Linux とかで PDF を結合とか n-up とかするコマンドたち](http://polamjag.hatenablog.jp/entry/2015/02/09/170713)
iOSの時計が12時間表記のときにアプリ側で24時間表記にする

## サンプルソース

```swift:DateFormatter+format.swift
extension DateFormatter {

    class func allFormat(date: Date) -> String {
        let format = DateFormatter()
        format.dateFormat = "yyyy/MM/dd HH:mm"
        format.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
        format.locale = NSLocale.system
        format.timeZone = NSTimeZone.system
        return format.string(from: date)
    }
}
```

上記のようなextensionを作ってやればいいかなと

呼び出す場合は以下

```swift:ViewController.swift
class ViewController: UIViewController {
    ・・・
    func hoge() {
        print(DateFormatter.allFormat(date: Date()))
    }
}
```
UnityでC#の補完を最強にする

## 背景
Unityを使ってて補完が効かないメソッドが多かった。

## こんな事ができます

![Snippet](https://i.gyazo.com/7e5061fd5b294a3ad0f98de9b93a3931.gif)

メソッド名を書きかけてTabを2度押すと、勝手に補完される。

## 手順

1. https://github.com/anchan828/unity-snippets からxmlをダウンロード（エディタ毎にディレクトリが分かれてるので必要なものだけでOK）
2. エディタ、OSに合わせてコードを移動orコピー（詳細は上記リンクに書いてあります）

## 補足
もし保存先で指定されているフォルダが見つからない場合は、各OSで「隠しフォルダ・ファイルを表示」させるようにすれば出てきます。方法は適宜ググってください。

## 参考

http://tsubakit1.hateblo.jp/entry/20130518/1368877171
↑2013年の記事だから少し変わってる