OmniAICreator/Qiita-1.07M huggingface dataset:
WebでChainerを「触って」学習出来る Chainer Playground をやってみた

Qiita的にもネット全般でもまだあまり話題になっていないようですが、PFN社の公式コンテンツとしてWeb上でChainerを学べる[Chainer PlayGround β](https://play.chainer.org/)が公開されています。

[PFN社のアナウンス](https://www.preferred-networks.jp/ja/news/chainer-playground)では2016年11月初旬に最初のリリースがあったようです。

また同アナウンスには
> 深層学習を使う上で必要なテクニックを分野毎に一問一答形式で学べる「深層学習100本ノック（仮称）」、より初心者向けの深層学習教材、深層学習や機械学習の経験がないアプリケーションデベロッパー向けのChainerチュートリアルなどを随時増やしていきます。
との記載もあり、現状はβ版で発展途上ですが今後に期待が持てます。

# 軽く触ってみたので御紹介
![1-1.Welcome.png](https://qiita-image-store.s3.amazonaws.com/0/141216/5cea9a0b-7c80-2ab4-ed2b-aa4c27a351ff.png)

このあとで触れますが、右側のペインでは実際にpythonのコードを記述し実行できます。

## いまのところ3章の途中まで記述されているようです
![1-1.Welcome_Menu.png](https://qiita-image-store.s3.amazonaws.com/0/141216/da4ea6ab-d800-6033-916b-a6cfda48a1ef.png)

- 第1章 Introduction
- 第2章 Chainer
- 第3章 CNN (2017/01/04現在、記述中のようです)

## 実際にpythonのコードを実行してみました
![1-2_1.python実行テスト1.png](https://qiita-image-store.s3.amazonaws.com/0/141216/f9766fe1-1aaa-d9d7-ae4a-eb04ad8740a1.png)

2ページには早速pythonコードが登場します。
まだChainer的なコードではありませんが、CBTの雰囲気は掴めると思います。

## pythonのコードを書き換えてみた
![1-2_2.python実行テスト2_ソース書き換え.png](https://qiita-image-store.s3.amazonaws.com/0/141216/44ac3831-03ec-aef3-2489-59451938a3e0.png)

本当にpythonインタプリタで実行されていることを確認するために、ソースコードを軽く変更してみました。

右下のペインに**Hello, Qiita!**などが正しく表示されているため、本当にリアルタイムに実行されていることがわかります。

尚、**Run**ボタンを押下してから実行が始まるまで1秒程度必要です。

## エラーも出してみた
![1-2_3.python実行テスト2_エラー.png](https://qiita-image-store.s3.amazonaws.com/0/141216/e8ea01d6-debd-a9e7-1c4e-c3d30a6b9606.png)
完全にpythonです。(笑)

ちなみにOSやインタプリタのバージョンを取得するためにsysモジュールをimportしようとしたら怒られました。
一部のモジュールはimport出来ないよう制限されているようです。

## 本編に突入します
![1-3.機械学習.png](https://qiita-image-store.s3.amazonaws.com/0/141216/e0b1e060-a8c2-f2b5-b459-a535a1e28a13.png)
3ページ目からは実際に機械学習について学びます。

##課題もあります
![1-12.課題.png](https://qiita-image-store.s3.amazonaws.com/0/141216/8d6e8b74-0b55-8bbf-a54f-b7ac3aba3d4d.png)

##お馴染みNumpyやCupyも軽く解説されています
![1-19.NumPy.png](https://qiita-image-store.s3.amazonaws.com/0/141216/045f04e4-24f1-80fe-3d9b-acb7dbc654f4.png)

##みんな大好きMNIST
![1-20.Playground_MNIST.png](https://qiita-image-store.s3.amazonaws.com/0/141216/bf9668da-74d7-fff1-790b-bd83ba553d6d.png)
やはり出ましたMNIST。
但し、右ペインのソースコードにimport文が記述されている通り、playground(第1章)専用の簡易版のようです。

##第2章は具体的にChainerに触ります
![2-1.Chainer.png](https://qiita-image-store.s3.amazonaws.com/0/141216/cd05f58f-687a-1c79-76ad-b64f1c7825fc.png)

![2-4.Chainerの基本.png](https://qiita-image-store.s3.amazonaws.com/0/141216/bc7e3fa7-cab5-89ee-f60d-699884ea7f02.png)
第2章ではVariable、Function、LinkやChainだけでなく、OptimizerやSerializerについても学習します。

##Chainer版MNIST
![2-11.Chainer_MNIST.png](https://qiita-image-store.s3.amazonaws.com/0/141216/d2f3d9bf-b1a8-0669-68c6-badd05d75008.png)
こちらは簡易版ではなく本物のChainerを使ったチュートリアルのようです。
但し、CNNを使用せずFCだけでモデルが構築されています。

##第3章ではCNNについても学べるようです
![3-1.CNN.png](https://qiita-image-store.s3.amazonaws.com/0/141216/dc8b7ede-6610-7b30-ab8f-15836f61ffa0.png)
現在、PFN社による記述作業が進行中とのことで第3章は未完成ですが、ちらっと見たところMNISTではなくCIFAR-10(100?)が用いられるようです。
***
2016年は大人の事情により専らTensorFlowを使用してきましたが、Chainerもまだまだ負けていないようです。

早く100本ノックがリリースされないかな...
svnのURLの変更

sourceforgeにあるソースで久しぶりにcommitしたところ以下のようにエラーになった。

```
bash-3.2$ svn commit -m "fixed"
svn: Commit failed (details follow):
svn: Repository moved permanently to 'https://svn.code.sf.net/p/ubsa-osx/svn/avrir'; please relocate
```

snv infoで元のパスを確認

```
bash-3.2$ svn info
Path: .
URL: https://himori@ubsa-osx.svn.sourceforge.net/svnroot/ubsa-osx/avrir
Repository Root: https://himori@ubsa-osx.svn.sourceforge.net/svnroot/ubsa-osx
Repository UUID: c0ceaddf-8823-4bce-a8de-5f6b89fa8458
Revision: 260
Node Kind: directory
Schedule: normal
Last Changed Author: himori
Last Changed Rev: 260
Last Changed Date: 2012-05-19 07:47:49 +0900 (Sat, 19 May 2012)

```

元のパスと、エラーで表示されたパスでsvn switch --relocateする。

```
bash-3.2$ svn switch --relocate https://himori@ubsa-osx.svn.sourceforge.net/svnroot/ubsa-osx/avrir https://svn.code.sf.net/p/ubsa-osx/svn/avrir
```

これでcommitできるようになった。
Steam ホームストリーミング で プツプツ音 の解消

# 事の始まり
Steam ホームストリーミングという、とても便利な物がある

http://store.steampowered.com/streaming/?l=japanese

要はリモートプレイを可能にする技術だが、クライアント（リモート）側の端末が非力でも、
ホスト側の端末でゲームが動くならば、家中どこでもゲームが楽しめるシロモノである。

更に、クライアント側の端末でゲームコントローラーが認識すれば、
ホスト側では DirectInput・XInputのどちらの入力方式でもゲームがプレイできるようになるというオプション付きである。[^1]

[^1]: SteamのホームストリーミングがAPIを吸収し、ゲームでは箱コンとしてゲームの入力を与えている模様

しかし、最近のアップデートによって、このSteam ホームストリーミング でのゲーム音に謎の **プツプツ音 ・ ポップ音** が 響くように。
これが地味にうざい。何とかして解消せねば。

# 環境
## ホスト側
- OS : Windows10 Pro
- CPU : Core i7-4700
- GPU : GeForce GTX 760
- Steam version : 1482202200

## クライアント(リモート) 側
- Machine : MacBookAir '13 (2013)
- OS : macOS Sierra (10.12.2)
- CPU : Core i7
- GPU : Intel HD Graphics 5000
- Steam version : 1482202200


今回はこの環境でのみ現象の再現を確認しました。

# 原因
日本語では出てこなかったのですが、英語では出てきました。[^2]

[^2]: 英語では、"Steam In-Home streaming" っていうのに気づくのに時間がかかりました…

https://steamcommunity.com/groups/homestream/discussions/0/540733523463783601/

概要をまとめると、
Steamのアップデートによってホームストリーミングの音声出力が、

<font size=4>44100Hz, 16bit から 48000Hz, 24bit に</font>

変更になっていた様です。

# 対策
今回はmacOS Sierra での対策です。
Windowsでも同様の現象が起こる場合には、スタートバーの端にあるスピーカーマークからいいように頑張ってください。

## macOS での音声出力設定
macOS (旧OSX) では、音声出力設定は `Audio MIDI 設定` というアプリで設定できるようです。

簡単に呼び出すには、`⌘ + Space` で Spotlight検索を呼び出し、 `MIDI` と入力すれば出てくるでしょう。 [^3]

![スクリーンショット 2017-01-04 20.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/93120/12152fb3-af1d-9ae4-be2b-c0f429e47a0c.png "スクリーンショット 2017-01-04 20.50.37.png")


[^3]: Alfred 3 でも出てきましたはい。

## 出力設定の変更
これ以上は説明は不要かと思いますが、一応。

出てきたウィンドウのうち、普段使用しているもの（本体イヤホンジャックの場合は画面表示のもの）を選択します。
DACを別途使用している場合は要注意。

本体内蔵3.5mm ジャックの場合は、予めジャックを接続しておくことをおすすめします。（一応）

![スクリーンショット_2017-01-04_20_50_56.png](https://qiita-image-store.s3.amazonaws.com/0/93120/dcadabae-1cd9-90b4-d94e-f74d362075f2.png "スクリーンショット_2017-01-04_20_50_56.png")

選択後、右側にある `フォーマット` のドロップダウンリストを選択して、
<font size=4>48kHz の 2ch 24ビット整数</font>
を選択します。
![スクリーンショット 2017-01-04 20.51.09.png](https://qiita-image-store.s3.amazonaws.com/0/93120/4a2c951c-a98e-f38d-eb6c-6eb13ab2abad.png "スクリーンショット 2017-01-04 20.51.09.png")


設定後はそっ閉じして、後はSteam ホームストリーミングをいつも通り立ち上げて[^4]頑張ります。

[^4]: WoL + Chrome リモートデスクトップ でログイン。RDPでのログインは×。

# 注意
他のアプリではバグる可能性があるので、バグった場合はもとの設定
(基本は<font size=4>44.1kHz の 2ch 24ビット or 16ビット整数</font>)
に戻す必要があるので注意です。
PowerPointで"Workbook_Open"相当のことをするには

# はじめに

[他のところ](http://chemiphys.hateblo.jp/entry/2017/01/01/225918)で書いた内容を備忘録も兼ねてまとめる。

# 方法

条件は厳しいが、少なくとも2種類の方法がある。

## ①「Auto_Open」プロシージャ

まだイベントが無かった頃のレガシー機能として、「特定の名前のプロシージャを作成すると、その名前に応じたタイミングで実行される」といったもの。

> 詳細は
> [Office TANAKA - Excel VBA Tips[自動実行マクロを名前で定義する]](http://officetanaka.net/excel/vba/tips/tips86.htm "Office TANAKA - Excel VBA Tips[自動実行マクロを名前で定義する]")

基本的にはExcelで使われる機能だが、PowerPointでも**アドイン**なら「Auto_Open」を使用できる。

### 利点

ある程度古いOfficeでも使用可能。

### 欠点

アドインファイルのみ（アドインであれば `.ppa`/`.ppam`どちらの形式でも可）。

### PowerPointのアドインの注意

Excelの場合、元のファイルの構成をほぼ完全に保持したままアドインとすることができ、簡単に元に戻すことができる。
しかしPowerPointの場合、アドイン化すると中のコードなどは原則閲覧・編集不可となる。
（アドインに関しては別に詳しく書こうと思っているが予定は未定）


## ② Custom UI XMLの「onLoad」コールバック

Custom UI XMLはRibbon UI のカスタマイズに使用するものであるが、「onLoad」コールバックを使えば、リボンロード時≒ファイルオープン時に処理を行うことができる。

### 利点

比較的新しい技術。

### 欠点

最低でもOffice2007以降でないと使用不可。
ファイル形式も2007以降のもの（`pptm`,`ppam`など）である必要がある。
XMLの追加などが面倒（ツールを使う手もあるが）。

Custom UIについては以下を参照。
> [2007 Office Fluent リボンをカスタマイズする (開発者向け) (パート 1/3)](https://msdn.microsoft.com/ja-jp/library/aa338202.aspx "2007 Office Fluent リボンをカスタマイズする (開発者向け) (パート 1/3)")
> [2007 Office Fluent リボンをカスタマイズする (開発者向け) (パート 2/3)](https://msdn.microsoft.com/ja-jp/library/aa338199(v=office.12).aspx)
> [2007 Office Fluent リボンをカスタマイズする (開発者向け) (パート 3/3)](https://msdn.microsoft.com/ja-jp/library/aa722523(v=office.12).aspx "2007 Office Fluent リボンをカスタマイズする (開発者向け) (パート 3/3)")
> [Office 2010 Fluent UI カスタマイズの基礎知識](https://msdn.microsoft.com/ja-jp/library/office/ff936211(v=office.14).aspx "Office 2010 Fluent UI カスタマイズの基礎知識")
Android Thingsでブート時に起動するアプリを作成

# IoT Launcher
デフォルトではAndroid Things起動時にIPアドレスを表示するIoTLauncherというアプリが起動するようになっていますが、これを置き換えます。

https://github.com/androidthings
こちらのGoogleが提供するサンプルアプリを見る限り、すべてのアプリが、
この方法でブート時に起動するようになっています。

# AndroidManifest.xmlを書き換える
ブート時に起動させたいActivityのIntent Filterに以下を追加

```
<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.IOT_LAUNCHER"/>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
```

# インストール
上記を追記したアプリをインストールすると、ブート時に起動するアプリが、デフォルトのIoTLauncherから置き換わります。

# 複数存在するとどうなるか

![複数の起動アプリをインストール](https://qiita-image-store.s3.amazonaws.com/0/129712/9253437b-bd74-d70d-4ab0-18be76e81405.png)

Android Things上に複数のIoTLauncherアプリが存在すると、起動時に↑のような起動アプリリストが表示されます。

# 参考
https://developer.android.com/things/sdk/index.html#home_activity_support
【Oracle】インデックスの有無によるSQLの実行計画の違い

# はじめに
OracleのDB関連の仕事で、SQLのパフォーマンスチューニングをしていた時に、
実行計画を見る機会が多かったので、
簡単ではありますが実行計画について記事を書きました。

今回は、パフォーマンスチューニングをする上で重要となってくるインデックスを
使用した時と使用しない時で実行計画がどう変わってくるのかを見てみました。

# インデックスとは？
データにアクセスするための目印で、本でいうところの目次のようなものです。
インデックスを作成することで、SQL実行時の処理時間を短縮させることが出来ます。

# DBのバージョン
今は12cもあって11gはちょっと古いかもしれませんが、
下記のバージョンで確認しています。

* Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

# ツール
SQLplusを使用しています。

#準備
## テーブル
今回は、SQLの研修などでよく使われるEMP表を用意しました。

```sql
DESC emp;
```
![image](https://qiita-image-store.s3.amazonaws.com/0/122482/e293907f-20b5-40d4-e5ba-8f328143c62b.png)

## データ
レコード数が少ないと実行計画に差が出なさそうなので、
10万件ほど用意しました。

```sql
SELECT count(1) FROM emp;
```
![image](https://qiita-image-store.s3.amazonaws.com/0/122482/a0192c7a-90aa-68b6-8aa4-8a05865dc5d8.png)

## インデックス作成
ENAME(従業員名称)にインデックスを貼ります。

```sql
CREATE INDEX emp_ename_ix1 ON emp(ename);
```

# 実行計画
## 実行計画とは
ユーザが発行したSQLを実行するための計画書・手順書のようなものです。
テーブルの結合方法や使用するインデックスの選抜などをします。
実行計画は、オプティマイザと呼ばれるものが作成し、
基本的に最適な実行計画を作成してくれますが、
複雑なSQLの場合、必ずしも100%最適とは限りません。
そのため、人が目で実行計画を見て、改善点がないかを検討するための材料として使われます。

## 実行計画を見る方法
AUTOTRACEを実行することで実行計画を取得できます。

```sql
SET AUTOTRACE ON
```

## 実行計画を確認
先ほどのようにAUTOTRACEをONにしたら、実際にSQLを実行して実行計画を確認してみます。
今回はENAMEが「JONES」のレコードを取得するSQLを実行します。

* 実行するSQL

```sql
SELECT * FROM emp WHERE ename = 'JONES';
```

### インデックスを使用する場合

![image](https://qiita-image-store.s3.amazonaws.com/0/122482/46fe415d-be3d-8dd1-eeb7-0a3696eae97c.png)

一番上がSQLの実行結果になります。ENAMEが「JONES」のデータが1レコード取得できていることが分かります。
その下に表示されているのが実行計画になります。
赤枠で囲っているid=2の行が「INDEX RANGE SCAN」となっており、
さらにName列が「EMP_ENAME_IX1」となっているので、
最初に作成したインデックスが使用されていることが分かります。
Cost列を見ると、id=2の行は「1」となっていて少ないコストで済んでいることが分かります。
このように、オプティマイザはCostができるだけ小さくなる実行計画を作成します。
次にインデックスを使用しない場合どうなるか見てみましょう。

### インデックスを使用しない場合

ヒント句を使って、インデックスを使わせないようにすることもできますが、
分かりやすくするためにインデックスを削除します。

```sql
DROP INDEX emp_ename_ix1;
```
![image](https://qiita-image-store.s3.amazonaws.com/0/122482/4d95189f-4d83-ceb1-55f2-2f30e2672a7b.png)

インデックスが無い状態で先ほどと同じSQL文を実行します。
実行計画は下記のようになりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/122482/7d0222bd-93f6-3bce-5ecf-1c841025e386.png)

実行結果は同じように1レコード取得されています。
実行計画を見ると、id=1が「TABLE ACCESS FULL」となっています。
これは、テーブルの全レコードを検索しているという意味です。
Costも「182」と大きくなっていることが分かります。

## まとめ
単純なSQLではありますが、インデックスを使用した時の方が、
SQLのコストが低くなっていることが分かりました。

## 次回
次回以降は、インデックスの仕組みの詳しい説明、もしくは実際にパフォーマンスチューニングをする際の具体的なアプローチの仕方などを紹介できればと思います。
オシロスコープ

#はじめに
今後、I2CやSPIを使っていく予定なのでUSB接続のオシロスコープを導入しました。

#使用機器
今後は下記の機器を使用して波形を確認します。

USB接続のオシロスコープは[Analog Discovery 2](https://reference.digilentinc.com/reference/instrumentation/analog-discovery-2/start)を使用します。
波形はPCで見ることになりますが、そのためのソフトウェアは[Digilent社](https://reference.digilentinc.com/reference/software/waveforms/waveforms-3/start?redirect=1#newest)から無償でダウンロードすることができます。

また、プローブを接続するための[テストクリップ](http://akizukidenshi.com/catalog/g/gP-10840/)を準備しておくといいと思います。
BNCで接続したい場合は、[拡張ボード](http://akizukidenshi.com/catalog/g/gM-07743/)も販売されているようです。

#使用画面
実際にAnalog Discovery 2で取得した波形の画像です。
画像の波形はI2Cの波形となります。

I2Cの通信速度は100kHzに設定しています。
Channel1:データライン
Channel2:クロックライン

![oscilloscope.jpeg](https://qiita-image-store.s3.amazonaws.com/0/148400/ab5520c8-2395-17e9-97e1-bb354bc32fd4.jpeg)

#まとめ
USB接続のオシロスコープは小型で場所もとらないので、自宅で使用するにはいいと思います。
マウスでオシロスコープを操作して、PCで波形を見ることができるようになるとは、とても便利な世の中になりました。
chibi:bit(micro:bit)で電流イライラ棒の制作

#はじめに

子供達とchibi:bitで遊ぶためのネタ帳として、電流イライラ棒を制作してみました。
![iraira.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/00cbfcf2-c03a-b65e-281b-a7b8fab9b91c.jpeg)

#材料

- chibi:bit　本体
- micro:bit用電池ボックス or USB給電
- ワニ口クリップコード 数本
- スピーカー(写真は百均のスマホ用スピーカー）
- メタルコードクリップ（ゴール用）
- 鉄製の針金（太さ1.5mm以上。長さ50cm以上。百均で売っているアルミのワイヤーは抵抗が高いためダメでした。）
- LEGOを適当（針金を固定できれば、木の板他なんでもOKです）

#作成

-適当に台を作ります
-針金を曲げて作成
-配線を行います
![iraira回路図.png](https://qiita-image-store.s3.amazonaws.com/0/44523/6136a08f-6102-9628-4941-2f4ce0cbfc82.png)


#プログラム

![iraira-bou.screen.png](https://qiita-image-store.s3.amazonaws.com/0/44523/84225306-7fc5-fb6c-f170-7c8866f7287f.png)

#プレイ動画

[![](http://img.youtube.com/vi/4NhmK1pZUw8/0.jpg)](https://www.youtube.com/watch?v=4NhmK1pZUw8)
https://www.youtube.com/watch?v=4NhmK1pZUw8

#感想

子供と一緒に作ってみましたが、楽しかったようです。
プログラムを作る時間よりイライラ棒の環境や配線をする時間の方が時間がかかりました。
初めての子供にchibi:bitを教えるネタとして使う場合、２時間あれば余裕ですが、１時間で教えるのであれば、台は事前に作成しておいた方がよさそうです。
js DNA塩基配列のペアを返す

##お題
DNA塩基配列をペアにして返す。
*[塩基配列](https://ja.wikipedia.org/wiki/%E5%A1%A9%E5%9F%BA%E9%85%8D%E5%88%97)

```js
function pairDna(str) {

 return arr;
}
pairDna("ATCGA");//[["A","T"],["T","A"],["C","G"],["G","C"],["A","T"]]
```

出力結果　例

```js
("TTGAG")// [["T","A"],["T","A"],["G","C"],["A","T"],["G","C"]].
("CTCTA") // [["C","G"],["T","A"],["C","G"],["T","A"],["A","T"]]
```

##使ったもの
split()
for文

##考え方
・オブジェクトとしてDNA塩基配列のペアをセットする。
・引数をsplitで分割して配列(arr)に入れる。
・arr[i]のペアはobj[arr[i]]で対応する。
・for文を回しておわり

##コード

```js
function pairDna(str) {
  var obj = {T:'A', A:'T', G:'C', C:'G'};
  arr = str.split('');
  for (var i=0;i<arr.length;i++){
    arr[i]=[arr[i], obj[arr[i]]];
  }
 return arr;
}
pairDna("ATCGA");//[["A","T"],["T","A"],["C","G"],["G","C"],["A","T"]]
```

##他にもコードが浮かんだ方(ES6)、コメントお待ちしております。
UIViewControllerにUITableViewのStatic Cellsを配置する方法

UIViewControllerにUITableViewを配置し、Static Cellsを設定すると下記のようにエラーが出てビルド出来ません。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/135478/4c619b2c-f13c-59a6-899e-dd906778e007.png)

Static CellsはUITableViewControllerでのみ使用できます。
ですのでこの記事では代替案として、UIViewControllerにContainer Viewを配置し、Container Viewの中にUITableViewControllerを配置することでStatic Cellsを使えるようにしています。


# 手順

## UIViewControllerにContainer Viewを設置
![setContainerView.png](https://qiita-image-store.s3.amazonaws.com/0/135478/a8a1455a-1e29-f68a-1976-db4693467c8c.png)
自動的に生成されるViewControllerは削除してください。

## UITableViewControllerを設置
![setTableViewController.png](https://qiita-image-store.s3.amazonaws.com/0/135478/f013dcbb-ab94-93ea-ce9e-4b7340ddf1ca.png)


## 接続
最後に、Control+ドラッグでContainer ViewからUITableViewControllerにEmbed接続します。
![embed.png](https://qiita-image-store.s3.amazonaws.com/0/135478/e6673907-b7aa-a849-f200-368b450b7049.png)

## 完成
![complete.png](https://qiita-image-store.s3.amazonaws.com/0/135478/b27815e0-481e-af30-ed0e-3af78e9f14cf.png)
Static Cellsにしてもエラーが出なくなりました。
AWS Cognito の認証情報を API Gateway + Lambda で受け取りたい

Cognitoの認証情報をLambdaで受け取る為の覚え書き。

## やりたいこと

1. Cognito（User Pool）でログイン
2. ログインしたユーザーでAPIを叩く
3. 叩かれたAPIから実行されるLambda関数の中で、認証情報を取得したい。すごくしたい。

API Gateway でログインを要求する設定は可能なので、（非ユーザーがそのAPIを叩いてもエラーが返される様になる）そのログインしているユーザーをLambdaに伝える事が出来ればOKですね。

## 1. API Gateway でユーザーログインを要求する様にする

### オーソライザーのセットアップ

1. ユーザープールを作成しておく
2. API Gateway のコンソールで「オーソライザー」を選択
3. 「作成」から「Cognito ユーザープールオーソライザー」を選択
4. 認証に用いるユーザープールを選択して「作成」する

### メソッドのセットアップ

1. 任意のリソースの任意のメソッドを選択（/hello の GET 等）
2. 「メソッドリクエスト」を選択
3. 「認証の設定」の「認証」で、認証に用いるユーザープールを選択

これで、このAPIはユーザープールでのログインを要求するようになり、未ログインユーザーは利用出来なくなります。

## 2. ログインユーザーでAPIを呼ぶ

JavaScript SDK でログインしてAPIを呼んでみましょう。

```
// 既にログイン処理を済ませた前提

userPool.getCurrentUser().getSession(function(e, session){
	$.ajax({
		type: "GET",
		url: "http://xxxxx.execute-api.xx-xxxxx-1.amazonaws.com/sandbox/hello",
		headers: {
			Authorization: session.getIdToken().jwtToken
		}
	})
	.done(function(res){
		console.log(res);
	});
});
```

Authorization ヘッダーで idToken を渡してやれば通ります。

Cognito は、この idToken を localStorage に保存して継続的に認証をしていて、idToken は中に認証情報を内包しています。要するに、API Gateway および Lambda でリクエストヘッダーを取得してこれをデコードしてやれば、認証情報を取得出来るわけですね。


## 3. API Gateway でリクエストヘッダをLambdaにパススルーする

1. 任意のリソースの任意のメソッドで、「統合リクエスト」を選択
2. 「統合タイプ」で「Lambda関数」を選択して、LambdaリージョンとLambda関数を入力する
3. 「本文マッピングテンプレート」で Content-Type を新規作成（application/json）
4. 「テンプレートの生成」で「メソッドリクエストのパススルー」を選択
5. 「保存」

何をしているのかというと、API Gateway に来たリクエストのパラメータ類をLambdaにそのままパスする様に設定しています。こうすることで、Lambda関数の引数 event でこれらを取得する事ができます。


## 4. Lambda 関数でパラメータを取得する

```
exports.handler = function(event, context, callback){
	var token = event.params.header.Authorization;
	...
};
```

event から辿ってゆけば idToken を取得する事ができます。でもこのままでは意味不明な文字の羅列なのでデコードしてやらなければなりません。

デコードは、Cognito JavaScript SDK も依存していた、sjcl.js を使用します。関数と一緒にzipで固めてアップロードするのが正式なのでしょうが、面倒だったので取り急ぎ丸ごとエリアにコピペしました。

[ドキュメント通りに](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/setting-up-the-javascript-sdk.html)ビルドしてやるのを忘れないようにしましょう。

sjcl.js の導入をした上で、次のようにデコードします。

```
exports.handler = function(event, context, callback) {    
    var token = event.params.header.Authorization,
    	payload = token.split(".")[1],
    	data = JSON.parse(sjcl.codec.utf8String.fromBits(sjcl.codec.base64url.toBits(payload)));

    callback(null, {
        "hello": "world",
        "user": data["cognito:username"]
    });
};
```

idToken の正体は、JSON文字列をなんやかんやエンコードした物でした。デコードの結果得られたオブジェクトから認証情報が取得出来るようになっています。これでLambdaさんが無事認証情報を知る事ができました。やったー！

デコードのコードは、SDKから拝借しています。  
cf) <https://github.com/aws/amazon-cognito-identity-js/blob/master/src/CognitoIdToken.js#L41>


## めんどくさい

もっと楽な方法がある気がしてなりません。
スライサー（FDM式３Ｄプリンタ向け）の作成　付録Ｂ（G-Code）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　作成したスライサーソフトで利用したG-Codeです。
　私のBS01+はMarlin Ver.1.0.2のファームウェアが搭載されているため、このファームウェアに対応するG-Codeを利用しています。
　※私はMarlin Ver.1.0.2 をカスタマイズして独自のG-Codeを割り当てています。
　[其の２　ソフト概要](http://qiita.com/isTwt/items/c23381879f889e59d5ca)にサンプルのG-Codeの一部があるので、別窓などで開き、合わせて読むと分かりやすいかもしれません。
 
# ２．G-Codeファイルフォーマット
　G-Codeファイルは、拡張子 .g または .gcode などです。
　作成したスライサーソフトは、パラメータファイルで拡張子を指定します。
　G-Codeファイルは、テキスト形式で、コマンドは１行で記述します。
　コメント行は ; (セミコロン)で始まります。

# ３．Ｇコマンド

| コマンド | パラメータ | 意味 |
|:---|:---|:---|
| G1 |  | X Y Z E を移動させる（移動時にE指定が無いとヘッドの移動のみで、E指定があるとフィラメントが吐き出される造形となる） |
|  | X | X軸を指定値に移動させる |
|  | Y | Y軸を指定値に移動させる |
|  | Z | Z軸を指定値に移動させる |
|  | E | エクストルーダを指定値に移動させる |
|  | F | F移動速度を指定する |
| G1例 | G1 X100 Y100 F100 | ヘッドをX100Y100へ100[mm/min]で移動 |
| G4 |  | 待機 |
|  | P | 指定値を[ミリ秒]単位で待機する |
|  | S | 指定値を[秒]単位で待機する |
| G4例 | G4 S1 | 1秒待機 |
| G28 |  | ホーム位置(パラメータ指定が無い場合は全軸対象) |
|  | X0 | X軸ホーム位置(数値指定でホーム位置の座標を指定することができる) |
|  | Y0 | Y軸ホーム位置(数値指定でホーム位置の座標を指定することができる) |
|  | Z0 | Z軸ホーム位置(数値指定でホーム位置の座標を指定することができる) |
| G90 |  | XYZ座標値の扱い（絶対値モード） |
| G92 |  | 現在値設定 |
|  | X | X軸の現在値を指定値とする |
|  | Y | Y軸の現在値を指定値とする |
|  | Z | Z軸の現在値を指定値とする |
|  | E | エクストルーダの現在値を指定値とする |
| G92例 | G92 X0 | 現在のヘッド位置(X)を0とする |

# ４．Ｍコマンド

| コマンド | パラメータ | 意味 |
|:---|:---|:---|
| M82 |   | E値の扱い（絶対値モード） |
| M104 |  | ヘッド温度設定(設定のみ) |
|  | S | 設定温度 |
|  | T | 設定するヘッド番号 |
| M104例 | M104  S180 T0 | ヘッド1を180度に設定 |
| M106 |  | Fan回転数設定 |
|  | S | 回転数(0(停止)-255(100[%]) |
| M106例 | M106  S178 | ファンを約70%で回転させる |
| M109 |  | ヘッド温度設定(設定値になるまで待機) |
|  | S | 設定温度 |
|  | T | 設定するヘッド番号 |
| M109例 | M109 S180 T0 | ヘッド1を180度に設定し180度になるまで待機 |
| M140 |  | ベッド温度設定(設定のみ) |
|  | S | 設定温度 |
| M140例 | M140 S90 | ベッドを90度に設定 |
| M190 |  | ベッド温度設定(設定値になるまで待機) |
|  | S | 設定温度 |
| M190例 | M190 S90 | ベッドを90度に設定し90度になるまで待機 |
| M218 |   | ヘッドのオフセット設定 |
|  | T  | 設定するヘッド番号 |
|  | X  | 設定するX値 |
|  | Y  | 設定するY値 |
| M218例 | M218 T0 X30 Y0 | ヘッド１のオフセットを X30Y0に設定 |

# ５．Ｔコマンド
| コマンド | パラメータ | 意味 |
|:---|:---|:---|
| T0 |  | ヘッド１を選択 | 
| T1 |  | ヘッド２を選択 | 

# ６．スライサーソフト向けコメント
　造形用G-Codeの前に以下のコメントを入れると、各スライサーソフトでG-Codeファイルを開いたとき、造形箇所が特定できる。

| 意味 | [Simplify3D](https://www.simplify3d.com/)用コメント | [CraftWare](https://craftunique.com/craftware)用コメント |
|:---|:---|:---|
| 外周 | ; outer perimeter | ;segType:Perimeter |
| 内周 | ; inner perimeter | ;segType:Loop |
| インフィル（外壁） | ; solid layer | ;segType:HShell |
| インフィル | ; infill | ;segType:Infill |
| サポート | ; support | ;segType:Support |
| サポート(高密度) | ; dense support | ;segType:SoftSupport |
| ラフト | ; raft | ;segType:Raft |
| スカート／ブリム | ; skirt | ;segType:Skirt |

　なお、G-Codeファイルの最後に、以下のようなコメントを入れることにより、[Simplify3D](https://www.simplify3d.com/)でG-Codeファイルを開いたとき、下記箇所に情報が表示される。

```
; Build Summary
;   Build time: 0 hour 2 minutes
;   Filament length: 239.1 mm (0.24 m)
;   Plastic volume: 575.11 mm^3 (0.58 cc)
;   Plastic weight: 0.59 g (0.00 lb)
;   Material cost: 2.53
```
![s3d-summary.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/f090b833-2465-7730-9fb8-c8d4ff46f58f.jpeg)
[firebase]エラーコードまとめ	

# 目次
※随時更新します

- Google認証が怪しい


## Google認証が怪しい

- エラーメッセージ

`"The given sign-in provider is disabled for this Firebase project. Enable it in the Firebase console, under the sign-in method tab of the Auth section."`

- 日本語訳

`このFirebaseプロジェクトでは、指定されたサインインプロバイダが無効になっています.Firebaseコンソールで、Authセクションのサインインメソッドタブの下で有効にしてください。`

### A.データベースの設定ミス

![9E2BC264-0DA3-4B75-908F-0093955AED33.png](https://qiita-image-store.s3.amazonaws.com/0/103475/3afe6efa-c697-2de3-f2a9-04e6c18b9fd0.png "9E2BC264-0DA3-4B75-908F-0093955AED33.png")

google認証を「有効」にしてなければ使用できません。（そりゃそうだ）
※初期設定では「無効」になっています。
[firebase]hostingのためのCLがインストールできなかった


# エラー内容
```
npm ERR! code 1
npm ERR! code 1
npm ERR! code 1
~
npm ERR! Darwin 14.5.0
```

## エラー時のバージョン
- node v0.6.1
- npm 3.6.0

```

```

## やったこと
 http://qiita.com/n0bisuke/items/ccecd6644ea87db44a69

>
npmを2系にすると動くみたいです。
npm install npm@2.14.12
その後もういちど以下コマンドでインストールしたら無事にインストールできました。
$ npm install t2-cli -g

npmとnodeのバージョンを調整すると直りました。
Payara Micro向けにDockerfileを作って起動する方法

「[PayaraをDockerで動かす](http://qiita.com/backpaper0@github/items/a0eb59b9b81899c922f2)」で紹介されているやり方でも起動できますが、Dockerイメージの中にアプリも入れてしまいたい！なるべくGlassFishと同じ感じで起動できるようにしたい！という場合に。

参考: 
ADAM BIEN'S WEBLOG - PAYARA MICRO AND DOCKER
http://www.adam-bien.com/roller/abien/entry/payara_micro_and_docker

> リンク先のビデオでは、Payaraの公式イメージを使わずに作成する方法が解説されています。Payaraの公式イメージには、ビデオで解説されている内容の内の半分ぐらいが実装されています。

以下、ローカルホスト (boot2dockerやDockerMachine) の`/path/to/war/`にある`WAR_TO_DEPLOY.war`をデプロイしてpayaraを起動する場合を例にとり、説明します。

## Dockerfileの記述

```Dockerfile:Dockerfile
FROM payara/micro

ADD "/path/to/war/WAR_TO_DEPLOY.war" "/tmp/"
ENTRYPOINT java -jar ${PKG_FILE_NAME} --deploy "/tmp/WAR_TO_DEPLOY.war"
```

warファイルをDockerコンテナの`/tmp`に格納し、そこからデプロイして実行するようにしています。`/tmp`でなくても構いません。変数等は、ここに書かれている通りに記述すれば良いです。

## ビルド・Webサーバの起動

```
$ docker build -t イメージ名 .
$ docker run --name コンテナ名 -p 8080:8080 -p 4848:4848 -p 8009:8009 -p 8181:8181 -d イメージ名
```

> `payara/micro`でEXPOSEされている全てのポートをフォワードする場合の記述です。実際には、自分が使う予定のあるポートだけ指定すれば十分です。

## Webアプリにアクセス

`http://localhost:8080/WAR_TO_DEPLOY` にアクセスします。

(`localhost`の部分は、適宜boot2dockerやDockerMachineのアドレスに読み替えてください)

## Payara Microドメインに設定を追加（オプション）

コネクションプールを作っておきたい場合など、ドメインに設定を追加する必要がある場合は、次の手順も必要です。

参考:
How do I add JDBC drivers and configure JDBC Resources in Payara Micro?
http://stackoverflow.com/questions/32899120/how-do-i-add-jdbc-drivers-and-configure-jdbc-resources-in-payara-micro

### microdomain.xmlの取得と編集

[Payaraのリポジトリにあるmicrodomain.xml](https://github.com/payara/Payara/blob/master/appserver/extras/payara-micro/payara-micro-core/src/main/resources/microdomain.xml)をダウンロードします。Payara Micro向けのdomain.xmlのようなものです。domain.xmlを編集するような感じでmicrodomain.xmlを編集して、保存します。

> PayaraやGlassFishの管理コンソールで一通り設定を作ってから、domain.xmlを開いて差分を見ると、追加すべき内容と場所が簡単に確認できます。


### Dockerfileの修正

payara起動時に`--domainConfig`オプションでmicrodomain.xmlを参照させるようにします。

```Dockerfile:Dockerfile
FROM payara/micro

ADD "/path/to/war/WAR_TO_DEPLOY.war" "/tmp/"
ADD "/path/to/resource/microdomain.xml" "/etc/opt/"
ENTRYPOINT java -jar ${PKG_FILE_NAME} --deploy "/tmp/WAR_TO_DEPLOY.war" --domainConfig "/etc/opt/microdomain.xml"
```

> 稼働中に、`Exception while persisting domain.xml, changes will not be available on server restart.`というメッセージが出てくることがありますが、特に心配することはありません。Payara「Micro」を再起動するというシチュエーションは、ほぼ無いはずですので…
OAuth&ロングポーリングでイベント監視処理をする時に気をつけるポイント

イベント監視系のシステムで、テストではうまく動くのに、長期稼働させると不意に動かなくなるシステムを安定稼働させるためのポイントをメモ
（※随時加筆予定）
（※なるべく一般化して記述）
（※APIつなぎ先のサービスで提供されているSDKが吸収していることもある）
（※そもそもつなぎ先のAPIが貧弱というのはアンコントローラブルなので諦める）


### 気をつけるポイント
+ access_token、認証用tokenの有効期限
+ clientの同時アクセス数制限(IPアドレス)
+ clientの同時アクセス数制限(APIリクエスト数・頻度)

### 記事の前提
###### 監視対象のAPI
+ ロングポーリングでイベントを取得
+ OAuth (& JWT)で認証
 
###### サンプルコード前提
+ CoffeeScript
+ node.js

### access_token、認証用tokenの有効期限

###### 事象

認証用tokenの有効期限が切れて、ロングポーリングでイベントが拾えなくなってしまったり、イベントを拾った後処理でAPIを叩けなかったりする事象
テストだと問題ないのに長期稼働で不安定になったり、一定時間後に動かなくなる時に確認

###### 解決策

+ 認証用tokenの有効期限が切れる前にロングポーリングの待機中プロセスを再構築する、foreverを使う前提であればプロセスをKILLするような実装も可能だが、実行中の処理が中途半端にならないように気をつける
+ ロングポーリングのイベント取得開始のpositionをKVSなどで管理する

```
TODO：　サンプルスクリプトをなんか書く
```

### clientの同時アクセス数制限(IPアドレス)

###### 事象

複数のサーバーからAPIを叩く環境で、　認証が拒絶される。複数サーバーで動かす環境にしたときにエラーが出たら疑う

###### 解決策

+ 同一のアプリケーションID、同一のアカウント、同一のtokenが使用できる条件・制限を確認する。ドキュメントに書いてないこともあるが、サポートに問い合わせるなど頑張る、運が良ければ拒絶されたときのエラーメッセージから推測できる
+ 複数のサーバーからAPIを叩いている場合は、アプリケーションIDを別けるなど制限に沿った対策を実施する

### clientの同時アクセス数制限(APIアクセス数・頻度)

###### 事象

APIへのアクセスが増えたときに拒絶される、イベントを多数キャッチした時にAPIに上限値以上にアクセスが発生して拒絶される

###### 解決策

+ 同一のアプリケーションID、同一のアカウント、同一のtokenが使用できる条件・制限を確認する。ドキュメントに書いてないこともあるが、サポートに問い合わせるなど頑張る、運が良ければ拒絶されたときのエラーメッセージから推測できる
+ APIにアクセスする一連の処理をキューイングしてアクセス頻度を制御する
+ 監視するイベント・対象など分離できるポイントを見つけて、アプリケーションIDやアカウントを分離してAPIアクセスのカウントを分散させる
+ （一時しのぎ）非同期処理でAPIアクセスが発生している場合、同期処理化して一度に多数のアクセスが発生しないようにする
Vigenere_decrypt.c

```c
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 1000000

float IC(int show[26])	//计算IC
{
	int i;
	float ic,n=0,m=0;
	for(i=0;i<26;i++)
	{
		n=n+show[i];			     //n表示所有字母的总数
		m=m+show[i]*(show[i]-1);   //show[i]是第i个字母出现的次数
	}
	ic=m/(n*(n-1));
	return ic;
}
int MAX(int show[26])
{
	int m=0,max,i;
	for(i=0;i<25;i++)
		if(m<show[i])
		{
			m=show[i]; //记录的是出现次数最多的字母数的位置
			max=i+1;
		}
		return max;
}
int main()
{
	int i=0,j=0,k=0,l=0,d=1,letter[26],n,m;
	float ic;
	char encrypt[N]={"a"},ch,keyword[100]={"a"},s;
	FILE *fin,*fout;

	if((fin=fopen("miwen.txt","r"))==NULL)      //打开密文文件
	{
		printf("can't open miwen.txt\n");
		return;
	}
	while(!feof(fin))
	{
		ch=fgetc(fin);
		if((ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z'))
		{
			l=l+1;               //统计密文的字母总数
			encrypt[i]=ch;	//把所有的字母输入到encrypt数组中
			i++;				
		}

	}  
	fclose(fin);
	printf("total of letters: %d\n",l);
	
	for(i=0;i<20;i++)
	{
		for(j=0;j<i+1;j++)      //对于每组每一行的遍历
		{
			for(n=0;n<26;n++)   //初始化letter数组
			{
				letter[n]=0;
			}
			for(n=0;(n<N/(i+1)+1)&&encrypt[j+n*(i+1)]!='\0';n++)
			{							
			 	m=encrypt[j+n*(i+1)]-'a';     //求出该字母在字母表中的位置
			 	letter[m]+=1;	//统计每个字母出现的次数,保存在letter数组中
			}
			ic=IC(letter);	//根据letter数组计算出ic
			if (fabs(ic-0.065)>0.010)		//测试ic是否符合,若超出0.010的误差,则继续寻找最佳ic值的情况
				continue;
		}
		if (fabs(ic-0.065)<=0.01)             //当ic的值足够接近0.065,则继续
		{
			d=i+1;
			break;                 //d代表分成几组
		}
	}
	
	//计算密钥
	for(j=0;j<d;j++)
	{
		for(n=0;n<26;n++)                   //置0
			letter[n]=0;
		for(n=0;(n<N/d+1)&&encrypt[j+n*d]!='\0';n++) //统计各个字母的出现次数
		{
			 m=encrypt[j+n*d]-'a';
			 letter[m]+=1;
		}
		keyword[j]=(21+MAX(letter))%26+'a';       //由于出现概率最大的字母即为e,相当于加上21
	}
	printf("the key is: %s\n",keyword);               //打印密钥
	return 0;
}

# Vigenere
```
Vigenere_encrypt.c

```c
#include <string.h> 
#include <stdio.h> 

int main()
{
	int l,i,k;       //l是密钥的长度,i,k是计数用的
	char ch,key[50];	//ch是文件中读取的每个字符的变量,key是密钥字符串
	printf("please input key:\n");
	scanf("%s",key);
	for(i=0;key[i]!='\0';i++)
		l=i+1;   //计算密钥长度
	FILE *fin=freopen("mingwen.txt","r",stdin); //定义读取的文件指针,明文
   	FILE *fout=freopen("miwen.txt","w",stdout); //定义写入的文件指针,密文

	k = 0;
	while (!feof(fin)&&(ch!=-1))   
	{
		ch=fgetc(fin);     //每次从文件里读一个字符
		if(ch!=-1)		//判断是否到达文件尾
		{
			if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))	//如果该字符是字母的话
			{
			    k=k+1;                              //密钥每次自增
			    if(ch>='a'&&ch<='z')		//大小写分开加密
					ch=(ch-'a'+key[(k-1)%l]-'a')%26+'a';//如果字符在a和z之间则进行加密运算
			    else if(ch>='A'&&ch<='Z')
			    	ch=(ch-'A'+key[(k-1)%l]-'a')%26+'A';//如果字符在A和Z之间则进行加密运算
			}
			fputc(ch,fout);	    //加密后的字符写到文件
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}

# Vigenere
```
Auto Layout for Sketchで複数の画面サイズのデザインを効率化しよう

[テクニカルクリエイター.com](http://technical-creator.com/auto-layout-for-sketch/)で掲載している内容ですが、Qiitaぽいなーと思ってこちらにも書いてみました。

![1-HemKn1OC2bh7tUpK7_p0Ng.png](https://qiita-image-store.s3.amazonaws.com/0/48973/0dd9b115-f9dd-2dae-57e5-d5aaf0c0cc7b.png)

Sketchで作ったデザインをObjective-CやSwiftで書き出すツール「Sketch to Code」を開発中のAnimaから、Sketch用プラグインの「Auto Layout for Sketch」がリリースされました。
[**Auto Layout for Sketch**](https://animaapp.github.io/Auto-Layout/index.html)

Animaって何？という方はこちら！
[**これまで書いたAnima関連の記事**](http://technical-creator.com/category/anima/)

## 使い方

### インストール
<img src="http://technical-creator.com/wp-content/uploads/2017/01/dca76df88c83c4116d451a4ecc54e05b.png" alt="" width="859" height="415" class="alignnone size-full wp-image-2019 img-responsive" />
まずは[**こちらのページ**](https://animaapp.github.io/Auto-Layout/index.html)からプラグインをダウンロードします。
ダウンロードしたSketchプラグインのファイルを開くと自動的にインストールされます。
※Sketch to Codeのβ版をインストールしている場合、Sketch to CodeにAuto Layoutが上書きされてしまいます。Sketch to Code β版にはAuto Layout機能が含まれているのでインストールの必要はありません。

### デザインを作成する
<img src="http://technical-creator.com/wp-content/uploads/2017/01/8cfd177260a39995a36967c164e8fa25.png" alt="" width="1252" height="791" class="alignnone size-full wp-image-2020 img-responsive" />
試しにiPhone7サイズのアートボードの中央に丸いシェイプを置いてみました。

### レイアウトを設定する
<img src="http://technical-creator.com/wp-content/uploads/2017/01/8cfd177260a39995a36967c164e8fa25-1.png" alt="" width="1252" height="791" class="alignnone size-full wp-image-2021 img-responsive" />
作成した丸いシェイプを選択して、右の[**インスペクタ**](http://technical-creator.com/sketch-interface/)に表示された**Auto Layout**の中にある**Pin**というところから2つのアイコンをクリックして下の図のような状態にします。
<img src="http://technical-creator.com/wp-content/uploads/2017/01/703e201d6e5c8e3323a8df4db0ed9726.png" alt="" width="211" height="85" class="alignnone size-full wp-image-2022 img-responsive" />

### 画面サイズを変更する
レイアウトが設定できたら、試しに画面サイズを変更してみます。アートボードを選択して、Auto Layout内にあるデバイス選択のアイコンをクリックすると、選択肢が表示されます。
<img src="http://technical-creator.com/wp-content/uploads/2017/01/bbbc8390da34ecd495fa419e38070825.png" alt="" width="192" height="271" class="alignnone size-full wp-image-2025 img-responsive" />

アートボードをコピーして、端末別に並べてみました。
<img src="http://technical-creator.com/wp-content/uploads/2017/01/2ff3a928a5c703e4fd8fedbe1b5b13c9.png" alt="" width="1252" height="791" class="alignnone size-full wp-image-2026 img-responsive" />
さきほど設定したようにど真ん中に丸いシェイプが来ています。

### より細かい設定も
<img src="http://technical-creator.com/wp-content/uploads/2017/01/d2f74a4bf46d1c59cde09eca3388636b.png" alt="" width="209" height="371" class="alignnone size-full wp-image-2027 img-responsive" />
Xcode上のAuto Layoutのように右端から何％の位置にするとか、シェイプのサイズを相対値で指定するなど細かい設定をすることもできます。

## 複数の画面サイズを意識したデザインにAuto Layoutは必須
iPhoneアプリをデザインする際、昔はデバイスのサイズに違いがなかったため統一したレイアウトで行われることが多かったですが、最近はiPhone7サイズ・SEサイズ・4サイズ・iPad…など複数の画面サイズを意識しなければなりません。さらにAndroid端末やPCでの利用なども考慮すると画面の種類はさらに膨らみます。こういったデザインをする際にAuto Layout for Sketchは大いに活躍してくれそうです。

そして本命のSketch to Codeも日々開発が進んでいる様子です。Sketch＋Animaでコーディングいらずのアプリ開発が可能になるのか…？今後がさらに楽しみです！
ES6でisNaN関数を作るととてもアレになる。

タイトルは半分釣りです。

NaN（Not a Number）はNumberじゃないって言ってるのに`typeof`したら`number`が返ってきたり、（`({}).toString.call(NaN)`みたいな[厳密な型チェック](http://qiita.com/Layzie/items/465e715dae14e2f601de)しても`Number`が返ってきくる）`NaN === NaN`が`false`になったり（例えば`parseInt("a")`と`parseInt("b")`は両方`NaN`だけど違うもんね）する不思議なヤツです。

普通の数字かどうやって見分けるのかといえば、[`window.isNaN()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/isNaN)や[`Number.isNaN()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN)を使うのですが、今回はその関数を簡単に作ってみたいと思います。

`Number.isNaN()`が厳密に**`NaN`かどうか**をチェックしているのに対し、`window.isNaN()`は**数ではないか**を見ています。

簡単な例を出せば、

```js
isNaN("x")        // -> true
Number.isNaN("x") // -> false
```

となります。

今回作るのは、`Number.isNaN()`の方です。

## ソースコード
    myIsNaN =_=>_!==_ ;

    myIsNaN(NaN) // -> true

なんか記号がいっぱいでわかりませんね。わざわざシンタックスハイライトを適用していないところに筆者の意地悪さがでています。

## 考え方

黒魔術っぽく見えますが分解して整理すると簡単です。

```js
myIsNaN = _ => _ !== _ ;
```

勘の良い方は気づかれたんじゃないでしょうか？

`_`はJavaScriptでは他の文字と同じように変数名として使用できる記号です。何か他の文字に変えてみましょう。

```js
myIsNaN = value => value !== value ;
```

なんだ、ただの[アロー関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)ですね。

これで謎が解けました。

念の為見すぎて目にタコができた形式にするとこうなります。

```js
function myIsNaN(value){
  return (value !== value);
}
```

`NaN`の性質の一つ、「両方`NaN`でも等価にならない」を応用してるわけですね。

ちなみに、`window.isNaN()`の方は、`Number`型でないものも`true`を返すので、

```js
myIsNaN =_=>({}).toString.call(_)!=="[object Number]"||_!==_
```

こうなります。また、[ド・モルガンの法則](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BB%E3%83%A2%E3%83%AB%E3%82%AC%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87)を利用して、

```js
myIsNaN =_=>!(({}).toString.call(_)==="[object Number]"&&_===_)
```

こういう風にも書けます。


# さいごに
アロー関数たのちい
MySQL(テーブルImportまとめ)

テーブルのImport方法についてまとめます。

Importする方法には、下記の2つの方法があり。
 1.mysqlimportコマンドを使う
 2.load data table文を使う

上記の2つについて、それぞれの長所、短所をまとめます。

1.mysqlimportコマンド
  (長所)
  ①．入力レコード数、削除レコード数、スキップしたレコード数、ワーニングのあったレコード数を、リダイレクト出力させることができる。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/147094/f8666d07-5964-e874-bf6e-7b3f15843ab5.png)
  →上記の「テーブル名: Records: xx  Deleted: xx  Skipped: xx  Warnings: xx」
    ような形で、「a.txt」っていうファイルにリダイレクトさせることができる。

  ②．「--delete」のオプションを付けることで、一度deleteした後に、レコードのロードを行うことができる。

  (短所)
  ①．発生したワーニングの詳細を出力させることができない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147094/d32dc555-ddb0-34a8-85cb-6bc906c0a1a4.png)
　  →上記のような形で、何行目のどのカラムのデータが不正などの情報を出力させることができない。

 2.load data table
  (長所)
  ①．発生したワーニングの詳細を出力させることができる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147094/fbd231d7-1c94-42ea-4558-0f031ef47f03.png)
　  →上記のような形で、mysqlのターミナルにログインする際に、「--show-warnings」のオプションを付けることによって、ワーニングの詳細情報を出力させることが出来る。

  (短所)
  ①．入力レコード数、削除レコード数、スキップしたレコード数、ワーニングのあったレコード数を、リダイレクト出力させることができない。
→シェルのヒアドキュメントなどで「LOAD DATA INFILE～」情報をmysqlコマンドに渡すことはできるが、その際、上記の情報はリダイレクトされない。ワーニングの詳細情報はリダイレクトされたが。。
端末をRAWモードに設定して子プロセスに制御文字を素通りさせる


sshクライアントみたいなプログラムをどうやったらつくれるのか知りたかったので、とりあえずローカルでforkしたプロセスをラップするだけのプログラムをつくってみた。

# Python版

PTYの扱いがいまいちわからなかったので、[PtyProcess](https://pypi.python.org/pypi/ptyprocess)というライブラリを使ってずるをした。

```python
import sys
import tty
import os
import termios
import select
import ptyprocess
import threading
import time

stop_event = threading.Event()

def read_stdin(p):
    while not stop_event.is_set():
        r, w, e = select.select([sys.stdin], [], [], 0)
        #print('hoge')
        if sys.stdin in r:
            x = sys.stdin.read(1)
            p.write(x)
        time.sleep(0.01)

#args = ['python']
args = ['bash']
p = ptyprocess.PtyProcessUnicode.spawn(args)
t = threading.Thread(target=read_stdin, args=(p,))
t.start()

oldtty = termios.tcgetattr(sys.stdin)

tty.setraw(sys.stdin.fileno())
print("raw mode started")
tty.setcbreak(sys.stdin.fileno())
print("cbreak mode started")

while True:
    try:
        x = p.read(1)
        sys.stdout.write(x)
        sys.stdout.flush()
    except EOFError:
        print("subprocess exit")
        break

stop_event.set()
t.join()

termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
```

http://www.betatechnology.jp/pp/index.php?Unix%2F%E7%AB%AF%E6%9C%AB
http://docs.python.jp/3/library/pty.html
http://docs.python.jp/3.5/library/termios.html
http://docs.python.jp/3.5/library/tty.html


# Ruby版

rubyでもやってみた

```ruby
require "pty"
require "termios"

STDIN.extend Termios
term_preset = STDIN.tcgetattr

system("stty raw -echo")

begin
  PTY.spawn("bash -i") do |pin, pout|
    Thread.new do
      loop do
        pout.print STDIN.getc.chr
      end
    end

    loop do
      print pin.sysread(512)
      STDOUT.flush
    end
  end
rescue EOFError => e
  STDIN.tcsetattr(Termios::TCSANOW, term_preset)
end
```

termiosは`gem install ruby-termios`でインストールできる。

http://stackoverflow.com/questions/2730642/wrapper-around-bash-control-stdin-and-stdout
http://melborne.github.io/2013/02/19/flippy-console-now-added/
CodePipelineでServerless Frameworkのデプロイを管理する


## 概要
- CodePipelineでServerless Frameworkのデプロイを自動化する
- デプロイはCodeBuildから直接slsコマンドを実行する
- CodePipelineを使えば、リリースリーダー確認後の本番デプロイみたいな管理もできる（はず）

## 経緯
Serverless Frameworkで作ったアプリを以下のようなフローで管理してみたくなった。

- masterブランチにPR
- masterブランチにマージ
- stg用環境をデプロイ
- 動作確認
- リリースリーダー承認
- prod環境にデプロイ

## Pipelineを作ってみた
![スクリーンショット 2017-01-04 17.50.25.png](https://qiita-image-store.s3.amazonaws.com/0/23936/ffbc3933-a2e7-c098-72a5-e65b6cda2194.png "スクリーンショット 2017-01-04 17.50.25.png")

流れとしては、以下の通り。

- GitHubのリポジトリからソースを取得
- CodeBuildが`sls deploy --stage stg`を実行
- SNSからリリース担当者へメール or Slack通知
- 動作確認後、承認ボタンクリック
- CodeBuildが`sls deploy --stage prod`を実行
- SNSからリリース担当者へメール or Slack通知
- 動作確認後、承認ボタンクリック

２回めの承認ボタンは別に要らないかなという気もしますが、「リリース後の動作確認やりましたよ」という意味でつけてます。

## CodeBuildの設定
![スクリーンショット 2017-01-04 15.24.00.png](https://qiita-image-store.s3.amazonaws.com/0/23936/a4bdce71-4c8d-5759-6e01-af70f8a792d6.png "スクリーンショット 2017-01-04 15.24.00.png")
後述しますが、「ビルド仕様」は「ビルドコマンドの挿入」にしておいたほうが楽そうです。

## 悩んだところ → 対応
他にいい案あればコメントください。

### CodeDeploy使えない -> CodeBuildでデプロイ実行
CodeDeployはEC2インスタンスへのデプロイに使用するサービスなので、今回のようにデプロイコマンドを実行するということができません。

とりあえずはCodeBuildを利用してビルドコマンド内で`sls deploy`を実行するということで対応しています。
CodePipelineはCloudFormationでのデプロイにも対応していますので、上手くやれば

- CodeBuildでCloudFormation作成
- CodepipelineでCloudFormation更新

とかもできるかもです。


### buildspec.ymlが使えない → `Insert build commands`でビルドコマンド設定

デプロイ実行のためにCodeBuildをSTG / PRODでそれぞれ実行させています。
ただし`sls deploy`のオプションが異なるので、buildspec.ymlでの定義ができません。

ということで`Insert build commands`でビルドコマンドを直接設定しています。

YAML形式にすると、以下通り。

```YAML
version: 0.1

phases:
  build:
    commands:
      - npm install -g serverless && npm install && sls config credentials -p aws -k YOUR_AWS_KEY -s YOUR_AWS_SECRET && sls deploy --stage stg && touch test.zip

artifacts:
  files:
    - test.zip
```

###CodeBuildのartifactsが省略不可
当たり前っちゃ当たり前ですが、指定しないと怒られます。
ただし今回はCodeBuildの中でデプロイやっちゃうので、別に要らなかったりします。
ということで、空のtest.zipを作ってそれを指定するという横着で一旦対応しています。

###APIエンドポイントわからない問題 → CloudFormation管理画面から確認 / 初回リリースだけローカルから
`sls deploy`コマンドをCodeBuild内で実行してしまうので、デプロイ結果がCloudWatch Logsに行っちゃいます。
そのためAPI GatewayのエンドポイントURLなどの情報を確認するための何かを作る必要があります。

- CodePipelineからLambda呼び出し
- LambdaでCloudFormationのOutputsを取得
- 取得したデータをSNS経由なりで通知

とかでしょうか。

ただこれ頑張るよりは、初回リリースだけローカルでやっておいて、Codepipelineの承認メッセージなどにURL入れておくほうが手っ取り早いかもしれません。

![スクリーンショット 2017-01-04 18.06.53.png](https://qiita-image-store.s3.amazonaws.com/0/23936/b4728728-d2e9-7db8-e54f-bf4ac70b308b.png "スクリーンショット 2017-01-04 18.06.53.png")

##感想
デプロイコマンドを毎回手動で実行するのは煩わしさがあったり、デプロイ先を間違えそうになって冷や汗をかいたりと個人的にはあまりやりたくないところがあります。
ということでServerless Frameworkで作られたアプリのデプロイフローについても、いい感じの事例やベストプラクティスがこれから集まってくると良いなと思います。
Cygwin環境を管理者権限なしで作り直す


# あれこれ削除したら壊れた
[直前のエントリ](http://qiita.com/lranran/items/159bfeeaa0f2612956b6)で不要なファイルを削除しまくってたら
１．Vimで色がつかなくなった。
２．cygwin-setup.shの起動ショートカットが働かない
３．gvim起動しなくなった。libcairo2入れたら起動したが、閉じなくなった。
特にVimで色つけされないのは不便すぎる。気持ち悪いのできれいな気持ちで2017年Cygwin環境をまっさらな状態からやり直そう。

# インストールから
1. setup-x86_64.exeをダウンロード
2. コマンドラインから`setup-x86_64.exe --no-admin`で起動する。
3. 本体はC:\apps\PortableApps\cygwin64にインストールする。
4. パッケージはC:\apps\PortableApps\cygwin64\packagesに取ってくる。
5. ftp://ftp.jaist.ac.jp を使う。
6. 以下ダウンロードされるらしい。

```bash
_autorebase
alternatives
base-cygwin
base-files
bash
coreutils
cygutils
cygwin
dash
diffutils
editrights
file
findutils
gawk
getent
grep
gzip
hostname
info
ipc-utils
libopenssl100
libreadline7
login
man-db
mintty
ncurses
openssl
rebase
run
sed
tar
terminfo
tzdata
util-linux
vim-minimal
which
```

７. 足りないものを追加。

```bash
vim
curl
git
openssh
tmux
rxvt-unicode
wget
```

8.「次へ」で進むと、 諸々依存関係を解決してくれるのでそれらも同時にインストール。
9. cygwin64/cygwin.batを以下のように変更。

```bat
@echo off

C:
chdir C:\apps\PortableApps\cygwin64\bin

mintty -i /Cygwin-Terminal.ico /bin/bash --login -i
```

10．次回インストールしやすいように/usr/local/bin以下にcygwin-setup.shを作成する。

```bash:cygwin-setup.sh
#! /bin/sh

cd ~
CYGWIN_EXE="setup-x86_64.exe"
rm ${CYGWIN_EXE}
wget http://cygwin.com/${CYGWIN_EXE}
chmod u+x ${CYGWIN_EXE}
run ./${CYGWIN_EXE} --no-admin
```
11．setup_x86_64.exeを C:\apps\cygwin64\home\（名前）\setup-x86_64.exe として保存。
12．以下へのショートカットを作成。
C:\apps\PortableApps\cygwin64\bin\mintty.exe -i /Cygwin-Terminal-ico /bin/bash -l -c 'cygwin-setup.sh'
僕はcraftlaunchに以下のエントリを入れている。

```python
( u"Cygwin-Setup",  window.ShellExecuteCommand( None, portdir + "cygwin64/bin/mintty.exe", u"-i /Cygwin-Terminal.ico /bin/bash -l -c 'cygwin-setup.sh'", u"") ),
```

13．minttyのフォントをMigu 1Mの12に設定する。
14．今こんな感じ。
![cygwin_20170104.jpg](https://qiita-image-store.s3.amazonaws.com/0/152216/8d4fec38-94c8-b185-5e5e-9ab9e1f4f7b5.jpeg)

# 今後行うこと
1. .ssh 及び .ssh/configを移行
2. alias、bash関数のうち必要なものを移行
3. シンボリックリンクのうち必要なものを移行
4. Vimの.vimrc、プラグインなどから必要なものを移行
5. minttyのテーマをSoloarized Lightに設定する。

# 今回の気づき
1. tmuxがあればウインドウマネージャーは不要
2. 起動が遅いとイラつく。多機能より速さ。
3. 何でもかんでもインストールせず、なるべくbashなどスクリプトで補う。
android:process について

`<activity>`要素に指定可能な`android:process`属性についての詳細です。

原文：https://developer.android.com/guide/topics/manifest/activity-element.html#proc

`android:process`はActivityが実行されるべきプロセス名を指定します。通常、アプリケーションの全てのコンポーネントはアプリケーションのために作られたデフォルトのプロセス名で実行され、その場合はこの属性を使用する必要はありません。しかしもし必要であれば、この属性でデフォルトのプロセス名を上書きすることができます。これによりアプリケーションコンポーネントをマルチプロセスで動作させることができます。
プロセス名がコロン(':')で始まる場合は、アプリケーション内のプライベートな新規プロセスが作られ、その中でActivityが動作します。プロセス名が小文字で始まる場合は、Activityはその名前のグローバルプロセスで実行されます。これにより異なるアプリケーションに含まれるコンポーネントでプロセスを共有し、リソースを節約することができます。

`<application>`エレメントの`android:process`属性には全てのコンポーネントのデフォルトのプロセス名を指定できます。


※コンポーネントとは`<activity>`,`<service>`等のアプリケーションを構成する部品です。
Xamarin.Android で日本語ビルド出力が文字化けするようになった場合の対策例

#環境と発生した現象
Windows 10 (64bitアーキテクチャ) に Visual Studio 2015 (Community) Update 3 を入れて、Xamarin で Android アプリを開発しています。
コーディング中、Visual Studio の IDE から「Xamarin の最新版が出ていますよ！」とメッセージが表示されたので、Xamarin 公式サイトから最新版をダウンロードしてインストールしました。

PC を再起動し、作成しているアプリをビルドすると、大量に文字化け出力が表示されるようになりました。ビルド自体は今のところ「失敗」にはならないのですが...

(以下、出力メッセージの例です)
> ------ すべてのリビルド開始: プロジェクト:**********, 構成:Release Any CPU ------
    Processing: obj\Release\res\layout\main.xml
    Processing: obj\Release\res\values\strings.xml
  ********** -> * :\******* \Projects\********** \********** \bin\Release\**********.dll
    Processing: obj\Release\res\layout\main.xml
    Processing: obj\Release\res\values\strings.xml
    Processing: obj\Release\res\layout\main.xml
    Processing: obj\Release\res\values\strings.xml
  隴ｦ蜻・ C:\Program Files (x86)\Android\android-sdk\platforms\android-25\android.jar(java/lang/Object.class): 繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ52縺ｯ縲√％縺ｮ繧ｳ繝ｳ繝代う繝ｩ縺ｧ繧ｵ繝昴・繝医＆繧後※縺・ｋ譛譁ｰ縺ｮ繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ51繧医ｊ譁ｰ縺励＞縺ｧ縺吶・
    繧ｳ繝ｳ繝代う繝ｩ縺ｮ繧｢繝・・繧ｰ繝ｬ繝ｼ繝峨ｒ縺願岬繧√＠縺ｾ縺吶・
  隴ｦ蜻・ C:\Program Files (x86)\Android\android-sdk\platforms\android-25\android.jar(android/app/Activity.class): 繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ52縺ｯ縲√％縺ｮ繧ｳ繝ｳ繝代う繝ｩ縺ｧ繧ｵ繝昴・繝医＆繧後※縺・ｋ譛譁ｰ縺ｮ繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ51繧医ｊ譁ｰ縺励＞縺ｧ縺吶・
    繧ｳ繝ｳ繝代う繝ｩ縺ｮ繧｢繝・・繧ｰ繝ｬ繝ｼ繝峨ｒ縺願岬繧√＠縺ｾ縺吶・
  隴ｦ蜻・ C:\Program Files (x86)\Android\android-sdk\platforms\android-25\android.jar(android/view/LayoutInflater.class): 繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ52縺ｯ縲√％縺ｮ繧ｳ繝ｳ繝代う繝ｩ縺ｧ繧ｵ繝昴・繝医＆繧後※縺・ｋ譛譁ｰ縺ｮ繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ51繧医ｊ譁ｰ縺励＞縺ｧ縺吶・
    繧ｳ繝ｳ繝代う繝ｩ縺ｮ繧｢繝・・繧ｰ繝ｬ繝ｼ繝峨ｒ縺願岬繧√＠縺ｾ縺吶・
  隴ｦ蜻・ C:\Program Files (x86)\Android\android-sdk\platforms\android-25\android.jar(android/view/LayoutInflater$Factory2.class): 繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ52縺ｯ縲√％縺ｮ繧ｳ繝ｳ繝代う繝ｩ縺ｧ繧ｵ繝昴・繝医＆繧後※縺・ｋ譛譁ｰ縺ｮ繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ51繧医ｊ譁ｰ縺励＞縺ｧ縺吶・
    繧ｳ繝ｳ繝代う繝ｩ縺ｮ繧｢繝・・繧ｰ繝ｬ繝ｼ繝峨ｒ縺願岬繧√＠縺ｾ縺吶・
  隴ｦ蜻・ C:\Program Files (x86)\Android\android-sdk\platforms\android-25\android.jar(android/view/LayoutInflater$Factory.class): 繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ52縺ｯ縲√％縺ｮ繧ｳ繝ｳ繝代う繝ｩ縺ｧ繧ｵ繝昴・繝医＆繧後※縺・ｋ譛譁ｰ縺ｮ繝｡繧ｸ繝｣繝ｼ繝ｻ繝舌・繧ｸ繝ｧ繝ｳ51繧医ｊ譁ｰ縺励＞縺ｧ縺吶・
    繧ｳ繝ｳ繝代う繝ｩ縺ｮ繧｢繝・・繧ｰ繝ｬ繝ｼ繝峨ｒ縺願岬繧√＠縺ｾ縺吶・
...

<img width="937" alt="p1.png" src="https://qiita-image-store.s3.amazonaws.com/0/100206/8a71959c-915b-437f-340c-c4355f0f8e9f.png">

#解決策
JDK (Java SE Development Kit) を 1.8系 (Java SE Development Kit 8) にアップグレードしたところ、大量の文字化け出力はなくなり、素直にビルド成功するようになりました。

文字化けメッセージは、どうも次のような内容のようです。
>警告: /*******/Library/Android/sdk/platforms/android-24/android.jar(java/lang/Object.class): 
メジャー・バージョン52は、このコンパイラでサポートされている最新のメジャー・バージョン51より新しいです。
  コンパイラのアップグレードをお薦めします。

Windows コントロールパネルのプログラム一覧をみると、Java SDK の 1.7系がインストールされていました。Visual Studio 2015 のインストール時に一緒に導入されたもののままと思われます。
とりあえず 1.7系をアンインストール、Oracle サイトで現時点での最新 (1.8系の32ビット版、8u111）をインストールしました。PCを念のため再起動して、同じプロジェクトをビルトすると、大量の文字化けメッセージはもう出力されなくなりました。

もう大丈夫そうですが、もし何か問題が起きたらご報告します。

#参考にさせていただいたサイト（感謝！）
- [2016-7-26 【Unity】AdMob入れようとしたらエラー、メジャー・バージョン52は、このコンパイラでサポートされている最新のメジャー・バージョン51より新しいです](http://blog.naichilab.com/entry/jdk-52) - naichi's labさん
MySQL(テーブルのExport方法まとめ)

表題の件について、
昨年は、仕事で調査する必要があったので、テーブルのExport方法について、下記に把握できたことをまとめます。

【前提】
  使用したMySQLのバージョン
  5.6.24

  使用しているOS
  Windows10


(固定長)
・発行するSQL
SELECT * FROM テーブル名 INTO OUTFILE '出力するファイル名' FIELDS TERMINATED BY '' OPTIONALLY ENCLOSED BY '' ESCAPED BY '';
  →ポイントは、FIELDS TERMINATED や OPTINALYなどのオプション設定の箇所を''として何も設定しないことらしい。

・出力先
C:\ProgramData\MySQL\MySQL Server 5.6\data
 →自宅のPCでは上記の通り。MySQL Server 5.6って下にdataっていうディレクトリが掘られるが、その下に固定長ファイルが出力される

(CSV)
・発行するSQL
SELECT * FROM テーブル名 INTO OUTFILE '出力するファイル名' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '' ESCAPED BY ',';

・出力先
固定長のときと同じ

(TAB区切り)
・発行するSQL
SELECT * FROM テーブル名 INTO OUTFILE '出力するファイル名' FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '' ESCAPED BY '';

・出力先
固定長のときと同じ
4DDAMへのログイン説明

AIDMAとは広告戦略のことらしいが，今回はAIDAM関係の話をする．

4DDAMから名称変更が行われ，現在はAIDAMになっている(しかし，私の知識は4DDAM時代のもの)．
そんな中で，基本的なログイン方法についてだけ，触れることにした．

以下のURLを開いていただければ分かるとおり，大した作業は必要ない．
https://www.ibm.com/support/knowledgecenter/ja/SSZJPZ_9.1.0/com.ibm.swg.im.iis.ds.trouble.ref.doc/topics/1438482.html
![4ddam.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/9ab34d08-dce1-32de-3935-d43770160a27.jpeg)
※なぜか，トラブルシューティングページのみしか見つけられなかった．

``` :コマンド例
/usr/uv/uv/bin/uvsh
```

インストール先は環境によって変わるため，binディレクトリ配下の `uvsh` を叩けば起動する．

``` :ログイン成功画面例
UniVerse Command Language 10.3
(c) Copyright IBM Corporation 2009. All rights reserved.
ARTEMIS_chesscommands logged on: Wed Jan 4 17:30:59 2017

You are 15 ARTEMIS_chesscommands From 4dmar01
HELLO
```

AIDAMとは(外部リンク)：http://wp.asc-net.co.jp/category/aidam/

以上．
(初心者)Macでpyenvを使用するときのメモ

# 背景

流行りのTensorflowのチュートリアルをやるよりもグラフィカルに様子を見たかったので、以下のページを参考に進めようとしたら画像を表示するところでトラブルが。。

- TensorFlowのチュートリアルをやってみる（1）
  http://www.mwsoft.jp/programming/tensor/tutorial_beginners.html

pylabで画像を表示できなかったのをきっかけに環境を見直しました。
備忘録として残します。

ちなみに、画像を表示できなかったのは、単に最後に```plt.show()```をしていなかった為なのも原因の一つでした。

## 環境

Mac OS X El Capitan (10.11)

```
$ pyenv --version
pyenv 20160509

$ pyenv versions
  system
* 2.7.10 (set by /Users/butada/.python-version)
  3.4.4
```

# 問題点の整理

## 使用しているpythonがOSのになっていておかしい

pyenvを使っている割にOSと同じPythonを使っていることに気づきました。

```
$ which python
/usr/local/bin/python
```

## .bash_profileにinitが記載されていなかった

pyenvの構築手順を読み直したところ、
.bash_profileへの記載が不足していました。

```
eval "$(pyenv init -)"   # ここが不足していた
eval "$(pyenv virtualenv-init -)"
```

2行目は書かれていたが、1行目が書かれていなかった。。
これによって、pipによってインストールされるライブラリは
OSのほうにインストールされてしまっていた。。

## backend問題

systemのPythonでないとbackend問題が生じるので、backendを```macosx```から```TkAgg```へ変更します。
変更すべきファイルは以下のコマンド実行でわかります。

```
python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
```

私の環境では以下のパスにありました。

```
vi /Users/butada/.pyenv/versions/2.7.10/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc

#backend      : macosx # comment out 2017/1/4
backend      : TkAgg
```

# 動作確認

今回はpyenvが動作せずにmatplotlibはOSの方にインストールされていたので、正しくpyenvを設定した後、matplotlibをインストールする必要がありました。
matplotlibのインストール説明は省略します。

## グラフを表示できるかを確認

以下のページのコードを実行して確認しました。
http://qiita.com/saj_kz/items/40dbfbb84dabcd2a9b46

**メモ：**
ウィンドウを閉じる度に ```plt.show()``` を実行し直せば
ウィンドウが表示されるのかを思ったのですが、
```plt.plot(x,y)``` からやり直さないとダメでした。

## pyenvが動作しているかを確認

以下のように```/usr/bin```や```/usr/local/bin```ではなくホームディレクトリ配下であればOK。

```
$ which python
/Users/butada/.pyenv/shims/python
```

## pyenvでPythonバージョンの切り替わるかを確認

pyenvによってpythonバージョンが切り替わることを確認する。

```
$ mkdir tensorflow
$ cd tensorflow

$ pyenv local 3.4.4
$ python --version
Python 3.4.4 

$ pyenv local 2.7.10
$ python --version
Python 2.7.10

$ pyenv local system
$ python --version
Python 2.7.10  # OSにインストール済みのPythonも同じバージョンなので変化がわかりにくいですね。。
```

それぞれにインストールされているライブラリも確認できます。

```
$ pyenv local 3.4.4
$ pip list

$ pyenv local 2.7.10
$ pip list

$ pyenv local system
$ sudo pip list  # OSのなので、listでは必須ではありませんがinstall時にはsudoが必要。
```

**メモ：**
バージョンの切り替え方法は3種類。

- global
- local
- shell

globalはシステム全体ということだったので怖くて試していません。
localはそのディレクトリ配下に反映させます。.python_versionファイルを作成して設定を保存しているようです。
shellはそのshellのセッションにのみ反映させるようです。

ほか、使えそうなコマンド

- pyenv versions
- pyenv install --list
- pyenv install 3.4.4

```pyenv local system```システムのデフォルトのPythonに戻るようです。

# 最後に

pyenvの使い初めがわかんない！とか、virtualenvと同時に使っている時の混乱が生じた時にここに戻って心を落ち着けようと思います。

# 参考

- pyenvでPythonがSystemバージョンから切り替わらない時の対処
http://qiita.com/ta_ta_ta_miya/items/e24394c6b0022405a126
ここのページに書かれていた最後の方の```~/.bash_profile```の記載に救われました。

- pyenvとvirtualenvで環境構築
http://qiita.com/Kodaira_/items/feadfef9add468e3a85b