OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL 5.7で生成カラムを使ってCHECK制約もどきを実装する

[MySQL 5.7で生成カラムを使って関数INDEXを作成する](http://qiita.com/hmatsu47/items/128ece7276e4deac1477) の続きです。

MySQLでは、DDLに**CHECK制約（検査制約）を記述することはできますが、動作上は無視されてしまいます。**
そのため、MySQL 5.6までであれば、トリガで代用するのが定番でした。

MySQL 5.7で実装された生成カラム機能を使うと、CHECK制約と同じようなことが可能になります。

**2019/12/01追記：**
MySQL 8.0.16から、CHECK制約が有効に機能するようになりました。

**[参考情報]**

- [詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド](http://www.shoeisha.co.jp/book/detail/9784798147406) P.236～
- [Yakst　CHECK制約をエミュレートする新旧の方法とドメイン (MySQL Server Blogより)](https://yakst.com/ja/posts/3764)

# 実装例
定義されたドメイン（＝登録値として許される範囲）から外れる値が登録されないようにするケースを考えます。

[先のエントリ](http://qiita.com/hmatsu47/items/128ece7276e4deac1477)で使ったテーブル定義では、都道府県（pref）カラムの値から地方／地域（area）カラムの値を導出する形で生成カラムを使っていましたが、この生成カラムは、

**「都道府県名として正しくない値が（で）挿入／更新されるのを防ぐ」**

ことに流用することも可能です。

[先のエントリ](http://qiita.com/hmatsu47/items/128ece7276e4deac1477)で示したテーブル定義を、以下のように変更します。

```mysql:制約を掛けるためのテーブル定義
mysql> CREATE TABLE `virt_test`.`yuruchara3` (
    ->   `id` bigint(20) NOT NULL AUTO_INCREMENT,
    ->   `name` varchar(100) NOT NULL,
    ->   `pref` varchar(3) NOT NULL,
    ->   `area` varchar(3) AS ((case when (`pref` = '北海道') then '北海道'
    ->                               when (`pref` in ('青森','岩手','秋田','宮城','山形','福島')) then '東北'
    ->                               when (`pref` in ('茨城','栃木','群馬','埼玉','千葉','東京','神奈川')) then '関東'
    ->                               when (`pref` in ('山梨','長野','新潟','富山','石川','福井','静岡','愛知','岐阜')) then '中部'
    ->                               when (`pref` in ('三重','滋賀','京都','大阪','兵庫','奈良','和歌 山')) then '近畿'
    ->                               when (`pref` in ('鳥取','島根','岡山','広島','山口')) then '中国'
    ->                               when (`pref` in ('香川','愛媛','徳島','高知')) then '四国'
    ->                               when (`pref` in ('福岡','佐賀','長崎','熊本','大分','宮崎','鹿児島','沖縄')) then '九州' else NULL end)) NOT NULL,
    ->   `point` int(10) NOT NULL,
    ->   PRIMARY KEY (`id`),
    ->   KEY `idx_pref` (`pref`),
    ->   KEY `idx_area` (`area`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
```

yuruchara2テーブルとの違いが分かりづらいですが、

- areaカラムに**NOT NULL制約を付けたまま、**
- 入力値が、列挙された都道府県名に合致しない場合の、**else時に返す値をNULLにする**（変更前は「その他」）

ことで、

- 正しくない都道府県名がやってくると、
- areaカラムで**NOT NULL制約違反**になる

ようにしてあります。

例えば、都道府県名と間違えて市町村名（「須崎」）を入れようとした場合、

```mysql:以前のテーブルでINSERT
mysql> INSERT INTO virt_test.yuruchara2 SET name = 'しんじょう君', pref = '須崎', point = 4345960;
Query OK, 1 row affected (0.00 sec)
```

普通にINSERTされてしまいますが、変更後のテーブル定義では、

```mysql:変更後のテーブルでINSERT
mysql> INSERT INTO virt_test.yuruchara3 SET name = 'しんじょう君', pref = '須崎', point = 4345960;
ERROR 1048 (23000): Column 'area' cannot be null
```

怒られます。

出力されるエラーメッセージが分かりづらいのが難点ですが、CHECK制約のかわりに使えることがイメージできたと思います。

但し、生成カラムの式にサブクエリを含めることはできません。

例のように、値ドメインを都道府県名に限定するような場合はいいとして（都道府県名は数が少なく、変化することもほどんどないため）、市町村名をチェックするような用途には不適当です。

他テーブルを参照するような制約を掛けるときは、従来通りトリガなどを利用することになります。

---

**【おまけ】**
MySQL 5.7関連投稿記事へのリンクを集めました。

 * **[Qiitaに投稿したMySQL 5.7関連記事](http://hmatsu47.hatenablog.com/qiita_mysql57)**
GitbucketのデータベースをMySQLに変更

MySQLのPortの確認

```
mysql > show variables like 'port';
+——————–+———+
|Variable_name | Value |
+——————–+———+
| port | 3306 |
+——————–+———+
1 row in set (0.00 sec)
```

GitBucket用のDatabaseを作成

```
mysql > create database gitbucket;
```

GitBucketの設定の更新

```
$ cd ~/.gitbucket
$ sudo vim database.conf

db {
  url = "jdbc:mysql://localhost:3306/gitbucket?useUnicode=true&characterEncoding=utf8"
  user = "username"
  password = "password"
}
```

GitBucketを再起動(tomcat8で動かしていることを想定)

```
$ sudo service tomcat8 restart
```
Git memo

# 最新のコミットで変更があったファイルだけを vim で開く
`vim -O $(git log --name-only --pretty="format:" -n1 | tr '\n' ' ')`

# .gitignore_global
`git config --global core.excludesfile ~/.gitignore_global`

`vim ~/.gitignore_global`

# Author
`git config user.name "Foo Bar"`
`git config user.email "hoge@hoge.com"`

あとで変える
`git commit --amend --author "Foo Bar <hoge@hoge.com>"`

# Misc
Git ディレクトリからステージングに
`git reset HEAD <file>`

ステージングから作業ディレクトリに (untrack)
`git checkout -- <file>`

# Fetch
リモートの最新データを取得
`git fetch`

pull --rebase = fetch + rebase

Rebase to hoge.
`git pull --rebase origin hoge`

# Cherry-pick
$[A,B]$ を cherry-pick
`git chrry-pick A^..B`

$(A,B]$ を cherry-pick
`git chrry-pick A..B`

`git cherry-pick another_branch`
This will cherry-pick the last commit from another_branch.

hoge の上から 3つ
`git cherry-pick hoge^^^..hoge`
（PHP）NewRelic daemon を自動起動モード（Agent mode）で動かす

以前にさくさくっと導入していた[NewRelic](https://newrelic.com/)だが、新しく用意したLaravel環境で導入しようとしたら、次のようなログを吐かれてた。
NewRelicへのレポートもうまくいっていなかった。

```sh:php-agent.log
2016-10-28 18:04:10.113 +0900 (5259 5259) warning: daemon connect(fd=4 uds=/tmp/.newrelic.sock) returned -1 errno=ENOENT. Failed to connect to the newrelic-daemon. Please make sure that there is a properly configured newrelic-daemon running. For additional assistance, please see: https://newrelic.com/docs/php/newrelic-daemon-startup-modes
2016-10-28 18:04:10.149 +0900 (5284 5284) info: New Relic 6.7.0.174 ("maslennikova" - "ea58fadcfc3b") [daemon='/tmp/.newrelic.sock'  php='5.6.27' zts=no sapi='cli'  pid=5284 ppid=5282 uid=0 euid=0 gid=0 egid=0 backtrace=yes startup=init os='Linux' rel='3.10.0-229.14.1.el7.x86_64' mach='x86_64' ver='#1 SMP Tue Sep 15 15' node='localhost.localdomain']
```

**環境**
- Mac + VitrualBox + Vagrant + CentOS7.1 の仮想VM環境
- PHP5.6
- Apache2.4.6 + Laravel 5.2.39
- NewRelic PHP / Daemon 6.7


## 原因

newrelic-daemonをrootで起動（External Mode起動）していたから。

Apacheを動かしているユーザーが`vagrant`。
newrelic-daemonを動かしているユーザーが`root`で、これがソケットファイル`/tmp/.newrelic.sock`を作ってた。（`systemctl`で起動）
`vagrant`ユーザーがこのソケットファイルを使うにあたり、作成ユーザーが異なるため使えなかった（通信できなかった）からだと思われる。たぶん。
（参考）
https://discuss.newrelic.com/t/error-message-in-php-agent-log-so-new-relic-doesnt-receiver-datas/3900
https://discuss.newrelic.com/t/failed-to-connect-newrelic-daemon/23564

## 解決方法

newrelic-daemon を起動させない！ **自動起動モードで動かす！**

newrelic-daemon は、Agent Modeと呼ばれる自動起動モードがあるので、（Apache下で動くPHPが）必要に応じて起動させることができる、とのこと。
そうすると、Apacheを動かしているユーザーの権限でdaemonが立ち上がって必要なソケットファイルを作成し、無事 New Relic 側へデータを送ることができる。

以下、その部分のドキュメントを訳したので、参考にしてちょんまげ。




## （翻訳）Automatically starting newrelic-daemon (Agent mode)

https://docs.newrelic.com/docs/agents/php-agent/advanced-installation/starting-php-daemon-advanced

**自動起動の newrelic-daemon （Agent mode） について**

```
（ヒント） External Mode起動を使う特別な理由でもない限り、この自動設定を使いましょう。たった１ファイル設定するだけでいいので、ほとんどのユーザーにとって最も簡単でエラーが出にくくなっています。daemonの起動をする必要もありません。
```

このモードでは、INIファイル中の記述だけでdaemonの設定ができます。そしてこのモードでは、エージェントがdaemonが起動していなければ、自動的にdaemonを起動させます。
自動起動モードは、次のようになっています。

- daemonの設定やグローバルなパラメータの設定は、グローバルなPHPのiniファイルに記述することができます。
- （New Relicの）エージェントが開始する時に、daemonを自動的に立ち上げます。（コマンドラインからでもApacheやPHP-FPMの再起動時でも）
- daemon のログファイルの書き込み権限が、どのアカウントがdaemonを起動させるかに左右します。（訳註：正確に訳せなかったが、daemonを起動させるアカウントも書き込めるようにログファイルの書き込み権限を適切に設定する必要があるよ、ということかと。）
- **php-agent.log**中で各行の冒頭には、この自動起動モードを意味する "agent" という単語が入ります。

この自動起動モードを使うためには、次のようにします。

- `/etc/init.d/newrelic-daemon stop`を実行して、daemonが動いてないことを確実にしてください。
- 設定ファイル `/etc/newrelic/newrelic.cfg` が**ないこと**を確認してください。もしあるならば、どこか他の場所に移すか、削除してください。
- INIファイルを編集して、[daemonまわりのパラメータ](https://docs.newrelic.com/docs/agents/php-agent/configuration/php-agent-configuration#inivar-daemon-settings)を設定してください。パラメータについては、INIファイルのテンプレートの 
`/usr/lib/newrelic-php5/scripts/newrelic.ini.template` にも説明が書いてあります。
- （以上の準備をして）WebサーバまたはPHPプロセスを起動させているプログラムを、新しい設定を反映させるために、再起動してください。
Bash on WindowsにOracle java8をインストール

bash on windowsでOralceのjava8をインストールして使えるようにしたときのメモです。

**1. ダウンロード先のURL**
ブラウザでOracleのJDKのダウンロードページから、ダウンロードするJDKのリンクをコピーする。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

このページから「Accept License Agreement 」を選択して、Linux x64のtar.gzのダウンロード先URLをコピーしておく(以下はバージョン8u112のURL)。

```
http://download.oracle.com/otn-pub/java/jdk/8u112-b15/jdk-8u112-linux-x64.tar.gz
```

**2. wgetでファイルダウンロード**
bash on windowsを開き、wgetで1のリンク先からファイルをダウンロードする。
```
wget --header "Cookie: oraclelicense=accept-securebackup-cookie" <1でコピーしたURL>
```

**3. ファイル展開**
/opt/jdk等を作って、ダウンロードしたファイルを展開する。
この場合、/opt/jdk/jdk1.8.0xxx/binにjavac, javaコマンドがある。

```
mkdir /opt/jdk
tar -xzf <ダウンロードしたファイル> -C /opt/jdk
```

**4. その他**
update-alternativesを使って/usr/bin/javaのリンクから使えるようにすると便利。

**5. 参照元**
https://www.digitalocean.com/community/tutorials/how-to-manually-install-oracle-java-on-a-debian-or-ubuntu-vps
docker(docker-engine or docker-ce), docker-composeのインストール

## 概要
dockerとdocker-composeのインストール手順

## 環境
- CentOS 7.1
- docker-engine (Docker 1.12.3)
- docker-compose 1.15.0

以下のいずれかを実行してdockerをインストールする。docker-ceを推奨。

- [docker-engineのインストール](#docker-engineのインストール)
- [docker-ceのインストール](#docker-ceのインストール)


## docker-engineのインストール
<b><font color="#191970">こちらの手順でなく、</font>[#docker-ceのインストール](#docker-ceのインストール)<font color="#191970">を推奨</font></b>

レポジトリの追加

```
$ sudo vi /etc/yum.repos.d/docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

install docker-engine

```
$ sudo yum install -y docker-engine
```

## docker起動

```
$ sudo systemctl start docker
$ sudo systemctl enable docker
```

## docker-ceのインストール

### 依存関係インストール

```
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
```

### docker.repo追加

```
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
```

### docker-ceインストール

```
$ sudo yum install -y docker-ce
```

### docker起動

```
$ sudo systemctl start docker
$ sudo systemctl enable docker
```

## docker-composeのインストール

```
$ curl -L "https://github.com/docker/compose/releases/download/1.15.0/docker-compose-$(uname -s)-$(uname -m)" > docker-compose

$ sudo mv docker-compose /usr/bin/
$ sudo chmod +x /usr/bin/docker-compose
```

インストールされたか確認

```
$ docker-compose --version
 docker-compose version: 1.15.0
```

## dockerをroot以外でも起動できるようにする

```
$ sudo usermod -g docker vagrant
```

[参考]
[そろそろDockerを始めないとやばいと思い始めたあなたへ](http://tech.respect-pal.jp/docker_tutorial/)
Python 基礎の基礎　リストについて

この記事は、Django Girls Japan Python初級者向け、
勉強会用資料です。尚、記載者も初心者のため、何らかの不具合などござましたら申し訳ございません。

# リスト

a = ["A","B","C","D","E","F","G"]

上記のような、AからGまでの７の要素をもったリストがあるとします。
リストには、部屋番号がついています。

![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/426ceee5-d463-fa05-3427-71eed7324f83.jpeg)

左側から数えていきますが、最初の部屋番号は0になりますので
気を付けましょう。
右から数える場合は、-1 -2・・・と数えていきます。

## リストをつくる
### 手で書く
自分で書くだけです。
[ ]でくくり、要素をカンマ区切りで記載します。
a = ["A","B","C","D","E","F","G"]

### タプルをリストにする
変数に（今回はtaple)タプルを代入して、list(変数）とすればリストになります。
taple = ("A","B","C","D","E","F","G")
a = list(taple)
a は["A","B","C","D","E","F","G"]　のリストになります。

### 文字列をリストにする
a = list("ABCDEFG")
a は["A","B","C","D","E","F","G"]　のリストになります。

### split()を使う
i = "A,B,C,D,E,F,G"
a = i.split(",")
a は["A","B","C","D","E","F","G"]　のリストになります。
split()は引数に指定した文字で分割しリストにしてくれます。

例えば・・上記のiにいれているものを↓のようにしてみると・・
i = "AB,C,D,EF,G"
a = i.split(",")
a は["AB", "C", "D", "EF", "G"] のリストになります。

## スライスを使った取り出し

部屋番号を指定すると、その要素を取り出す事ができます。
a[0]  →　"A"

開始位置と終了位置の指定で、指定した範囲を取り出す事ができます。
a[1:-3]　→ ["B", "C", "D"]
a[1:4]   → ["B", "C", "D"]
＊この２つは同じことです。

開始位置のみを指定して後は最後までを取り出す事ができます。
a[2:]    → ["C","D","E","F","G"]

終了位置のみを指定して最初から指定位置までを取り出す事ができます。
a[:2]    → ["A","B"]

## 値の追加と削除
### += を使って追加
すでにあるリストの最後に要素を追加したいとき += で追加する事ができます。
a = ["A","B","C","D","E","F","G"]
a += "H"
aは["A","B","C","D","E","F","G","H"] のリストになります。

### append()を使って追加
すでにあるリストの最後に要素を追加したいとき リスト.append(追加したいもの)
で追加する事ができます。
a = ["A","B","C","D","E","F","G"]
a.append("H")
aは["A","B","C","D","E","F","G","H"] のリストになります。

### insert()を使って追加
insert(追加したい場所,　追加したいもの )を使うと任意の場所に値を追加する事ができます。
a = ["A","B","C","D","E","F","G"]
a.insert(0, "W")
a は["W","A","B","C","D","E","F","G"] のリストになります。

### remove()を使って削除
リスト.remove(削除したいもの)で削除してくれますが、
削除したいものを左からみて最初のだけを削除します。

a = ["A","B","C","D","E","F","G","A","B","C","D"]
a.remove("B")
aは["A","C","D","E","F","G","A","B","C","D"]のリストになります。

### リストの部屋番号（位置）を使って削除

del リスト[部屋番号]　で削除します。
a = ["A","B","C","D","E","F","G","A","B","C","D"]
del a[1]
aは["A","C","D","E","F","G","A","B","C","D"]のリストになります。

リストの範囲指定での削除もできます。
a = ["A","B","C","D","E","F","G","A","B","C","D"]
del a[2:4]
aは ["A","B","E","F","G","A","B","C","D"]のリストになります。

## 並び変え
### sort()を使った並び変え
リストの要素を昇順に並び替えます。
a = [4, 6, 8, 1, 3]
a.sort()
aは[1, 3, 4, 6, 8]のリストになります。

降順にしたい場合は引数にreverse=True　と指定します。
a = [4, 6, 8, 1, 3]
a.sort(reverse=True)
aは[8, 6, 4, 3, 1]のリストになります。

### sorted()を使った並び変え
元のリストは変更せずに、リストの要素を昇順に並び替えます。
a = [4, 6, 8, 1, 3]
b = sorted(a)
bは[1, 3, 4, 6, 8]のリストになります。
この時、aは元のまま[4, 6, 8, 1, 3]のリストです。


## 要素の数を調べる
len(リスト)で要素数を調べる事ができます。
a = ["A","B","C","D","E","F","G","A","B","C","D"]
len(a) で　要素数１１を取得できます。
翻訳を行うニューラルネットワーク　ByteNetの概要

Bytenetとは2016/10/31にDeepMindから投稿された論文，"[Neural Machine Translation in Linear Time](https://arxiv.org/abs/1610.10099)"にて提案された機械翻訳をするニューラルネットワークです．音合成をするニューラルネットワークとして提案されたWaveNetと同じように，Dilationを導入することによって，遠い時系列の相関を学習することができます．さらに，学習にかかる時間が，文章の長さにたいして線形となっており，比較的速いと言われています．

#Bytenetの概要
翻訳タスクをするニューラルネットワークです．元の言語の文字列を${\bf s}=s_0,\dots,s_{N_s}$として，翻訳後の言語の文字列を${\bf t}=t_0,\dots,t_{N_t}$とすると，$p({\bf t}|{\bf s})$を推定するタスクです．

この確率分布をByteNetでは

```math
p({\bf t}|{\bf s})=\prod_{i=0}^{N_t} p(t_i|t_{<i},{\bf s})
```

として$N_t$個の確率分布に分けて推定を行います．

著者は以下の図を用いて，ByteNetについて説明しています．

![image](https://qiita-image-store.s3.amazonaws.com/0/128182/14dfafdd-5ed9-0a91-4ce5-5617934d3952.png)

下半分はsource network，上半分をtarget networkといいます．言語翻訳ではエンコーダー-デコーダーモデルという考え方を行います．エンコーダーは翻訳前の文から，その文の意味を抽出して別の表現に変換するもので，デコーダーはその表現を翻訳後の文に変換するものです．ByteNetではsource networkがエンコーダー，target networkがデコーダーになります．

どちらも，Dilationという仕組みを利用して，畳み込みを行っています．Dilationのメリットは比較的少ない層，少ない結合でかなり遠い場所との相関をモデリングできることです．1層目では1つ隣のユニットの出力と一緒に次の層への入力としています．さらに2層目では2つ隣のユニットの出力，3層目では4つ隣のユニットの出力，・・・というように，次の層へいくごとに，入力の数は変化させずに，入力に使うユニットとの距離を指数的に増やしています．これによって層の数を増やすごとに指数的により遠い場所との相関を学習することができます．

source networkの良いところは，文の長さによって，出力する中間表現のサイズも変化することです．リカレントニューラルネットワークでこれを行うと，同じサイズの中間表現になってしまいます．長い文も，短い文も同じサイズの表現に変換すると，文の解像度が文の長さによって違ってきてしまうという問題が生じてしまいます．長い文の方が多くの情報を持っているはずなのに，それが中間表現に変換すると，短い文のそれと情報の量が同じになってしまいます．しかし，ByteNetでは文の解像度が保たれたまま翻訳を行うことができます．

下半分のsource networkと比較して，上半分のtarget networkでは右のユニットの入力は使っていないことがわかります．これは，masked convolutionと言われるものです(maskは隠すの意）．なぜこのようなことをしているのかというと，未来の情報は使いたくないからです．上半分のtarget networkの出力は，$p(t_i|t_{<i},{\bf s})$を表しており，$t_{i+1},t_{i+2},\dots$は$t_i$には関係ないです．masked convolutionをすることで，未来の関係がない情報を使わずにモデリングしています．

#まとめ
Dilationやmasked convolutionなどを適用することにより，速く動く，遠い時系列の相関を取り込める，文の解像度が保たれるといったことがByteNetによって可能になりました．今後は機械翻訳以外の自然言語のタスクでの応用が期待できるかもしれません．とても面白いので近いうちに実装できればと思っています．
serverless-webpack で作る複数環境運用に耐えるserverless-node環境


## 課題

serverless で Circle CIの自動テスト・デプロイを考えていて、色々つらい経験があった。

- Circle CI で自動テスト、自動デプロイしたい。
- AWSのnodeは4.3。 Circle CI で4.3環境作ってもnpm i 周りで死ぬっぽい
- APIKEYとかの管理どうするのよ問題

それまでは`setting.js`とかを作ってローカルでignoreファイルに認証系入れていたけど、自動デプロイとなるとそうも行かない。

`.env`周りを作っても、`.env`依存のコードがLamdbaに上がった瞬間死ぬ

っていうかnodeのバージョン問題も辛い(手元のローカルは6.1)

ので、しっかりと理想の環境を構築することにしてみた。

## 理想の環境

- バージョン問題は考えたくないのでserverless-webpackを導入
- 開発時は`sls webpack serve`でテスト実行
- デバッグ時にはローカルで`mocha`実行
- `mocha`実行時にはwebpack じゃないコードでブレイクポイント貼ったりしたい
- circle CIでは mocha 回してから自動でデプロイする
- 認証情報の多元管理とかは辛い 

## 構築

まずは serverless-webpack のexampleを参考に serverless-webpackの基本環境構築を行う。
https://github.com/elastic-coders/serverless-webpack/tree/master/examples/babel 

認証情報の管理には `.env` を使用する。

とりあえず、`setting.js`という名前で下記ファイルを設置

````
"use strict"

const loadenv = require("node-env-file");
loadenv("./.env")

module.exports = {
    BACKLOG_APIKEY: process.env.BACKLOG_APIKEY,
    ....
};
````

ローカルには`.gitignore`指定で`.env`を作成し、認証情報系を記録していく。

````
BACKLOG_APIKEY=XXXXXXXXXXXX
....
````

`handler.js` などではこの`setting.js`を読み込む

````:handler.js
'use strict';

const {BACKLOG_APIKEY} = require("./setting")
````

ココでのポイントとして、必ず`require("./setting")`とすること。`require("./setting.js")`ではなく。

これ でひとまずmochaでは動くようになった。webpackでも多分動く？

circle CIのテストでも、env の設定を行えば動くが、このままではデプロイしても動かない。
(Lamdba上の環境変数設定が無いため)

Lamdaにデプロイしても動くように、webpack のDefinePlugin を利用して変数の埋め込みを行う。

````:webpack.config.js
"use strict"

const webpack = require("webpack")

module.exports = {
    entry: './handler.js',
    resolve:{
        extensions: ["", ".webpack.js", ".js"]
    },
    ...
    plugins: [
        new webpack.DefinePlugin({
            env: JSON.stringify(require("./setting.js"))
        })
    ]
};
```` 

更に下記内容で`setting.webpack.js`を追加

````:setting.webpack.js
module.exports = env;
````

`resolve.extensions`設定のお陰で、`require("./setting")`はWebpack 経由での読み込みのみ、`setting.webpack.js`を参照するようになる。

`setting.webpack.js`のenvはDefinePluginの効果で、`setting.js`の中身をビルド時評価したものに置き換えられる。

実際にビルドされた`.webpack/handler.js`をチェックしながら作業を進めると分かりやすかったりする。

従って、

- sls webpack serve -> ビルド時評価のローカル環境環境変数参照
- ローカルmocha実行時 -> テスト実行時評価のローカル環境変数参照
- Circle CI mocha実行時 -> テスト実行時評価のCircleCI環境変数参照
- Lamdba 稼働時 -> ビルド時評価のCircleCi環境変数参照

という形で環境変数を切り分けられる。

ローカルにおいて認証情報は.evnでignore運用が可能で、後はCircleCIにenv として登録してやれば良い。

## あとがき

見落としてるだけかも知れないけど Lamdbaの環境変数簡単にいじれたらもっと楽なのに
カレントディレクトリが変になったときに戻す

毎日いっぱいEmacsを使ってると非常にまれに、なにかのコマンドが悪さをして**現在のディレクトリ**(`default-directory`)が変になることがある。<kbd><kbd>C</kbd>-<kbd>x</kbd> <kbd>C</kbd>-<kbd>f</kbd></kbd>とか<kbd><kbd>M</kbd>-<kbd>x</kbd> <kbd>find-file</kbd></kbd>とかでファイルを開こうとするけど、現在編集中のファイルがある場所とは全然別のディレクトリが選択されてめんどくさいことになってる状態。厄介なので直したい。

わざわざパッケージにするほどでもないかなって気がするので、`init.el`とかに書く。

```el
(defun my/reset-default-directory-by-buffer-file-name ()
  "Set default-directory by `buffer-file-name'."
  (interactive)
  (require 'f)
  (when buffer-file-name
    (setq default-directory (f-dirname buffer-file-name))))
```

## セットアップ

[`f.el`](https://github.com/rejeep/f.el)があるとファイルの操作とかファイルパスの操作がラクなので入れる。[MELPA](https://melpa.org/)のセットアップをして、<kbd><kbd>M</kbd>-<kbd>x</kbd> <kbd>ielm</kbd></kbd>とか起動して、以下のようなコードを打ち込む。

```el:ielm
(package-install 'f)
```

下記のような表示なら、特に何もしなくていい。

<img width="274" alt="‘f’ is already installed" src="https://qiita-image-store.s3.amazonaws.com/0/4121/bc84c2dc-e389-b80e-bee1-12b10e24542e.png">

## 動かしかた

おっ壊れやがったな、と思ったら<kbd><kbd>M</kbd>-<kbd>x</kbd> <kbd>my/reset-default-directory-by-buffer-file-name</kbd></kbd>を起動する。

ただし人類はそんなに長いコマンド名を覚えられないので、[君は誰とEmacsる？ (補完インターフェイス紹介篇)](http://qiita.com/tadsan/items/33ebb8db2271897a462b)を読んで、部分一致でコマンド呼び出しできるようにすると良い。

<img width="613" alt="helm-smex: reset dir" src="https://qiita-image-store.s3.amazonaws.com/0/4121/b68e585f-3ccb-15aa-ccdd-c5a5ed791821.png">

(写真は[helm-smex](https://github.com/ptrv/helm-smex)のもの)

### りくつ

カレントディレクトリは`default-directory`って変数に文字列が入ってるだけなので、これを`setq`してやるだけ。`buffer-file-name`を見てるので、実ファイルを編集してるとき以外は特に何もしない。

## あとがき

てきとーにEmacs Lispのコードを書きながら動かしてるときが一番壊れる。
borderless な NSWindow でテキスト入力を有効化する

1時間くらいハマった上に，日本語情報としてはまだないようなので，メモを残します．

NSWindow は，以下のようにスタイルを設定することで borderless，すなわち，タイトルバー等を除去することができます．

```swift
let window = NSWindow()

window.styleMask = [.borderless]
```

しかし，borderless な NSWindow に対しては，デフォルトでキー操作が無効になってしまうようです．すなわち，そのような `NSWindow` 上に `NSTextField` 等の入力可能な要素を配置しても，キー入力を受け付けないために，編集できません．

> By default, borderless windows cannot become key. 
> [objective c - NSTextField not editable in custom NSWindow - Stack Overflow](http://stackoverflow.com/questions/9464423/nstextfield-not-editable-in-custom-nswindow)

公式にも記述がありました．

> The value of this property is true if the window has a title bar or a resize bar, or false otherwise.
> [canBecomeKey - NSWindow | Apple Developer Documentation](https://developer.apple.com/reference/appkit/nswindow/1419543-canbecomekey)

これを解決するためには，NSWindow クラスを継承したクラス内で，`canBecomeKey` プロパティを `true` に設定する必要があります．先ほどの参照先は Objective-C のコードですが，Swift では以下のように記述できます．

> ```swift
> class PPWindow: NSWindow {
> 
>     override var canBecomeKeyWindow: Bool {
>         return true
>     }
> }
> ```
> [xcode - How to set canBecomeKeyWindow? - Stack Overflow](http://stackoverflow.com/questions/30776875/how-to-set-canbecomekeywindow)

以上です．
sqliteインストールからいってみよう#003


##記述する動機
私、とある専門学校でPGを教えています。ついに１０年超えました。いまだにSEもやってます。
主に現役学生さんたちに読んでもらうために書いているのですが、悩めるPG,SEにも何かのヒントにはなると思い、公開していきたいと思います。

##どこでも使えて便利ですね。
普通に手に入るコンピュータのどこでも動きます。

##オフィシャルサイト
https://sqlite.org/download.html

##brewによるインストール
```brew
brew install sqlite3
```
Homebrewについては各自よろしく。

###SQLって何なの？
構造化問合わせ言語。すとらくちゃーどくえすちょんらんげっじ。
Englishではシークェルなんて言うけど。
RDBを扱う為の言語です。
DDL,DML,DCLとあります。
とにかくこの辺りは自分で調べよう。あえてリンク張らない。

###スタート
```command
sqlite3 foo
```
foo ってのは「何でもいいよ」ってことです。
ターミナルからコマンドをうつべし。
ファイルハンドラがオープンされてる。
クローズしたら実態化する仕様です。

```sql
create table ccc (a,b);
```

はい。テーブル（表）が出来ました。簡単ですね。
最低限の実装でAmazon Kinesis Streamの動作を確認する

急にボールが来たので。
もとい、急に "Kinesis Streamクライアントが正常に動いたか確認したいんだけど" と言われた時の対処を書いておきます

TL;DR
-----

AWS LambdaでAmazon Kinesis StreamのTriggerをフックしてCloudWatchのログに流し込んだだけです
しかもBlueprintをそのまま使ってるので、実質コードは書いてません

手順
----

前提: Amazon Kinesis Streamのストリームは作成済みとします (ここでは `ks-test-st0` とします)

### 1. Select Blueprint / テンプレ探し ###

新規 AWS Lambda function を作成します
その際、Blueprintを探して使います

- Runtime: *Python 2.7*
- Filter: `kinesis`

と入力すれば __kinesis-process-record-python__ が見つかるので、これを選択します

![1.png](https://qiita-image-store.s3.amazonaws.com/0/22754/06200269-9aa6-807a-28ca-c9daba939f90.png)

### 2. Configure Trigger / 対象ストリームとトリガー設定 ###

- Kinesis Stream: `ks-test-st0`
- Starting position: `Latest`
- Enable Trigger: *ON*
- （ほかはデフォルト）

![2.png](https://qiita-image-store.s3.amazonaws.com/0/22754/cb473575-6966-019f-9733-a71e7e8c3ae3.png)

### 3. Configure Function / Lambda関数の設定 ###

- Name: 適宜 (ここでは `ks-testfunc0` としました)
- Existing role: 適宜 (ここでは作成済みの *lambda_basic_execution* ロールを選択しました)
- （ほかはデフォルト）

※Roleはこの画面で新規に作成できるので、気軽に作っちゃってOKです（削除忘れずに）

![31.png](https://qiita-image-store.s3.amazonaws.com/0/22754/fcb58b84-0e52-b84e-d50d-e4c3ecb6f232.png)

![32.png](https://qiita-image-store.s3.amazonaws.com/0/22754/0af4926a-7353-ccb5-01cd-347917559308.png)

レビューを経たら **Create Function** しましょう

### 4. Test ###

*Test* ボタンを押したら Sample event template から *Kinesis* を選び、 **Save and test** します

![4.png](https://qiita-image-store.s3.amazonaws.com/0/22754/0d778890-f5cf-5200-9b00-cbed3f6bc637.png)

### 5. CloudWatchで確認 ###

CloudWatchに移動し、ログを見てみると */aws/lambda/ks-testfunc0* というロググループができています
ここでログを確認できます

**Decoded payload: ....** が中身です。テストの時は *Hello, this is a test 123.* と出ているのが正常です

![5.png](https://qiita-image-store.s3.amazonaws.com/0/22754/7d71a945-fe02-5b2e-6297-7026422dfae0.png)

これでおしまいです。全工程で１０分くらいでできます。

ちゃんとput-recordしてみる
-----------------------

aws cliを使って put-record してみます

```console
$ aws kinesis put-record --stream-name ks-test-st0 --data '{"foo":1}' --partition-key 1
{
    "ShardId": "shardId-000000000000", 
    "SequenceNumber": "49567441242410188585246498180921316713103945544971059202"
}
```

### CloudWatchで確認 ###

![6.png](https://qiita-image-store.s3.amazonaws.com/0/22754/77f841f9-638d-058d-4ef2-dc0ffe20884d.png)

できてますねー

あとかたづけ
----------

削除対象はこんなところです

* Amazon Kinesis Stream
* AWS Lambda ファンクション
* CloudWatch ロググループ
* IAMロール (必要なら)

特にKinesisはカネがかかりますので、ストリーム削除忘れのないように。

あとがき
-------

久々に書いたよ。次はAWS IoTだ。
アノテーションって便利だよね

よくコードの中で見つける@～って何なんだろうと思ったので、
調べて見ました！

よく見るものだけですが、
良かったら参考にしてください。

@Override :そのメソッドがスーパークラスのメソッドをオーバーライドしていることを明示的にします。

@Deprecated :そのメソッドの仕様が非推奨であることを明示的にするアノテーション。このアノテーションがついたメソッドやクラスを利用すると警告メッセージがコンパイル時に表示されるようになります！

@SuppressWarning :引数にメッセージを与えると、メッセージによってコンパイル時のエラーを非表示にすることができます。
配列っぽい文字列をうまく配列に変換する

## 前提
databaseに配列っぽい括弧でくくられたただの文字列があります。
`["hoge","fuga"]`
でもいざRails内でmodelを通して取り出すとこんな形になってます。
` "[\"hoge\",\"fuga\"]"`
つらい

## 標準メソッドでどうにかならないか
https://docs.ruby-lang.org/ja/latest/class/Array.html
**結論:ならない(っぽい)**

`Array.new(["hoge","fuga"])`　のような形ならどうにかなるのですが( []もArrayなので当たり前)、今回のケースの場合はmodelから取り出した時点で文字列なのでうまいことやらないと配列にはキャストできません。
当然`Stringに.to_ary`メソッドはありませんので`Array.try_convert`もnilが返ります。


## 結論
結論としては、splitで無理やり分割し、deleteで余分な文字列を消すことにより強制的に配列にしました。このケースで対応できない場合もあるかもしれませんが、その際はうまくやりましょう。


```ruby
[1] pry(main)> hoge = model.column
=> "[\"hoge\",\"fuga\"]"
[2] pry(main)> hoge_a = hoge.split(',').map { |m| m.delete('[]"\\\\')}
=> ["hoge", "fuga"]
```

僕はあまりやりたくありませんが、evalでやる方法もあります。こっちの方が綺麗ですがevalなのであしからず。

```ruby
[1] pry(main)> hoge = model.column
=> "[\"hoge\",\"fuga\"]"
[2] pry(main)> hoge_a = eval(hoge)
=> ["hoge", "fuga"]

```
30分で作る事業計画書: VR ストリーミングサービス

注意: この事業計画書は、下記のイベントにて **VR ストリーミングサービス** をテーマに30分で作成・発表したものです。

http://supporterz-seminar.connpass.com/event/43689/

---

## VROOM

---

# サービス名
- VROOM
  - VR + ROOM の掛け合わせ

---

# サービス概要
- VRコンテンツをストリーミングで提供するサービス
- VRコンテンツの制作から公開までを簡単に行うことができる

---

# ミッション・解決すべき課題
- 誰もがオリジナリティある自己表現を行えるようにする
- しかしVRコンテンツの制作技術がない
- スマホで誰でも楽しくVRコンテンツを制作できる

---

# サービス内容
![](http://appgiga.cloudstream.tokyo/wp-content/uploads/files/2016/10/best-javascript-library-03.gif)

---

# サービス内容
- VRコンテンツエディタの提供
    - 誰もがスマートフォンさえあればVRコンテンツを作成
    - 写真と描画を組み合わせて制作
- VRコンテンツの公開・整理・検索
    - WebVR 空間上にVRコンテンツを配置・閲覧・没入
    - マイページが WebVR 空間、自分オリジナルのギャラリーに

---

# ビジネスモデル
- ユーザ課金 500円/月
    - VRコンテンツの制作の幅を広げるアイテムの購入
    - VRコンテンツの共同編集 / 音声つきライブ配信

---

# KPI
- ユーザ数
- ユーザのアクティブ率
- 一人あたり公開コンテンツ数
- ユーザ数の増加率
- 一人あたり公開コンテンツ数の増加率
- 有料会員率

---

# KPIの推移
- 2016年12月 プロトタイプ検証(Web)
- 2017年2月 アプリ公開(iOS/Android)
- 2017年11月 アプリDL数5万人 公開コンテンツ数1万本 有料会員0~1% インフルエンサをつくる & SNSシェアを狙う
- 2018年2月 アプリDL数50万人 公開コンテンツ数10万本 有料会員5% 課金コンテンツを充実させ、課金率を上げる

---

# 業績計画
- 2018年11月 ユーザ数100万人 うち有料会員率 10% 500万円 x 24 = 年商1億2000万円
- 2019年11月 ユーザ数1000万人 うち有料会員率 10% 5000万円 x 24 = 年商12億円

---

# 市場規模
![](http://imgcc.naver.jp/kaze/mission/USER/20160628/78/7373898/0/849x674xa435a8ed3fd0522efcca4eba.jpg)

---

# 市場規模
- プラットフォーム領域 の 3D Tools
- 中でも簡単・手軽を狙う分野において、日本における No.1 を目指す

---

# ポジショニングマップ

|  | 一般向け | ビジネス向け |
| --- | --- | --- |
| 制作の容易さ | **V ROOMS** | ? |
| 自由度の高さ | ? | Unity / Unreal |

---

# 競合環境
- ハコスコ
    - スマホでの動画メインの制作を補助
    - 描画まではサポートしていない

---

# 資金調達額
- 5000万円
    - ハコスコのシードマネー 3000万円
    - VRエディタ開発 
    - 共同編集・ライブ機能開発
    - 各マーケティング施策(広告費など)
    - => これらに2018年までは注力

---

# V ROOMS

**すべての人にオリジナリティある自己表現を**
Virtual Data Room Services

Here is a brief instruction how to use <a href="https://www.idealsvdr.com">ideals VDR</a> software. 

![site features.png](https://qiita-image-store.s3.amazonaws.com/0/148375/321951ab-e8ea-ae3f-3d08-4393215af7f4.png)

This cloud service is very popular these days as it can be used for any kind of business deals.
音楽を聴くことがないことがわかった。

250GBのマイクロSDに所有している音楽をすべて入れてみたのだけれど、持ち歩いていても、聴くことがないことがわかった。
そもそもヘッドセットをもっていないので、電車のなかでは聴けないし、仕事場でもUSB-C端子もないので取り出しにくく、聴く機会がないのだ。
そんなことなら、わざわざ音楽を入れなくてもよかったかと思わないでもないけれど、まあやってみなければわからなかったのだから、実行して悪かったということにはならないだろう。
とは思う。
jsで子ウインドウを開き、子の値を親に返す手段




## やりたかったこと

①ブラウザから別ウインドウを開く
②別ウインドウのある要素がクリックされたときにその値を親ウインドウに返す

結果的に子側で__window.opener__を使えば親の関数が呼べる。

(同一ドメインでしか試していません)

## 簡単な見本

### 親ウィンドウ側

```html
<button onclick="openNewWindow()">
    Open
</button>

<script type="text/javascript">
    function openNewWindow() {
        window.open(
            'http://~~~~~', //移動先
            'pop',  //新規ウィンドウで開く
            'width=800, height=480' //サイズ指定
        );
    }

    function onCallBack(data) {
        console.log(data); //hoge
    }
</script>
```


### 呼び出す子ウィンドウ側

```html

<button onclick="closeWindow()">
    Close
</button>

<script type="text/javascript">
    function closeWindow() {
        window.opener.onCallBack('hoge');
        window.close();
    }
</script>
```

### ちなみに

子側からwindow.postMessageとかも使ってみたけどうまくいかなかったのは何故なのか
postMessage使ってる方いたらご教授願いたい。
ellipsis で幅指定したら、外側のmarginがwidth:100%の計算を崩してしまったケース

# 文字がはみ出たら ... にする
 text-overflow: ellipsis; 

幅を指定しないとはみ出たことにならないので、block 、幅指定する

しかし、、

# 外側に margin 幅の指定があると、、、
width: 100%;
にて、横スクロールバーが出てしまう。

# 解決は、
外側の横幅のmarginを、padding にする。

# 類似の問題だが解決しない方法
幅100% を指定した時の横スクロールバーが出る問題

box-sizing: border-box;

を指定しても、外側に margin があるとダメ
phpstorm設定メモ

【設定メモ】

■一行削除
commond + D　に設定。


■タブをスペースに変換
preference > keymap > Main menu > Edit > Convert Indent > To Space
shift + alt + commond + P　に設定。
検索にconvert　が早い



■画面分割
【split vertical】
alt + L
keymapの変更
AssetGraphで１アセット１アセットバンドルを作る方法

# AssetBundle Graph Toolで１アセット１アセットバンドルを作る設定

## 結論から
Groupingノードの設定をファイル名をワイルドカードにして拡張子まで指定するとできました、以下のような感じ。

*.prefab

## AssetBundle Graph Toolとは
AssetBundle Graph ToolはUnityのAssetBundleを作るためのGUIツールです。
アセットバンドルの作成はスクリプトを書く必要があったり、エディタ上で設定する必要があったり面倒でした。
このツールを使うとアセットバンドルを簡単に作成することはもちろん、事前に一つのアセットから設定を変更して品質の違う複数のアセットバンドルつくったりなど、より高度なことがコード書かずにも行えるようです。Unity公式の方々が開発しているようなので安心感もあります。

<https://github.com/unity3d-jp/AssetGraph>
## 1アセット 1アセットバンドルを作る方法
とりあえず1アセット 1アセットバンドルが作りたかったので、それができるのか調べてみました。ゲーム中のアイテムをそれぞれプレハブひとつひとうにして管理している場合などで使うと思います。
日本語のクイックスタートにサンプルがあったのでまず読んでみることに。
<https://github.com/unity3d-jp/AssetGraph/blob/1.0/release/Doc/QuickStart_jp.md>
### サンプルについて
「複数のアセットから、それぞれを別のアセットバンドルにする。」
というフォルダ毎にアセットバンドルを分けるサンプルがありGroupingノードでアセットバンドルの出力を分けているようです（ノードをつなぐ線の数値にも反映されます）。
サンプルではファイル個別ではなくフォルダで分けているので別の設定が必要そうでした、なので自分でGroupingの設定をいろいろ試してみたところ、うまくいったので書きます。

### Groupingノードの設定の仕方
Grouping　Keywordにファイルの拡張子まで指定するとファイル個別でグループにできるようです。
ちなみにファイル名をワイルドカードにして以下のように設定しています。
Prefabs/*.prefab

ノード全体
![AssetGraphNodes.PNG](https://qiita-image-store.s3.amazonaws.com/0/57778/46b0093e-afc5-154a-f4fe-f2526780d56c.png)
Grouping
![AssetGraphGroping.PNG](https://qiita-image-store.s3.amazonaws.com/0/57778/c237b64b-84b8-acf9-ab25-d7e3e11e33fa.png)


とりあえずStanderd AssetsのPrototypingだけimportしたAssetBundleというプロジェクト名で作業していて
そのときの設定を表示しています。Unityのバージョンは5.4.0f3
Prefabs以下のアセットを5000個程度に複製して個別にアセットバンドルを作成してみたところ、問題なく作られたのでこういったグルーピングも想定して作られてるのだろうと思いました。

以下そのほかのノード周りのスクショ
プロジェクト
![AssetGraphProjects.PNG](https://qiita-image-store.s3.amazonaws.com/0/57778/8f8073a1-94c2-20a3-509d-91e7a61e7c17.png)
Loader
![AssetGraphLoader.PNG](https://qiita-image-store.s3.amazonaws.com/0/57778/a18811eb-3fd7-d96f-a4af-4fa2e8d5c5ec.png)
BundleConfig
![AssetGraphBundleConfig.PNG](https://qiita-image-store.s3.amazonaws.com/0/57778/67b17fcc-2f60-c41c-c62d-3fa4991b54d6.png)
BundleBuilder
![AssetGraphBundleBuilder.PNG](https://qiita-image-store.s3.amazonaws.com/0/57778/39d04555-66b2-27ac-66c4-4a81508f04ba.png)
Exporter
![AssetGraphExporter.PNG](https://qiita-image-store.s3.amazonaws.com/0/57778/e493119f-0a42-9416-2fb7-349020f78abe.png)

## まとめ
とりあえず1アセット１アセットバンドルの作成も行えることが確認できました（あんまり個別のアセットバンドルは推奨されないのかもしれないですが）。
AssetBundle Graph Toolかなり汎用的に作られていて色々できそうです。
今回はファイル名指定してグルーピングしました。ただそういう指定の仕方はサンプルにはなかったのでノードサンプルがもっと増えるとうれしいと思いました、おわり。

## 参考
AssetBundle Graph Toolのgithub
<https://github.com/unity3d-jp/AssetGraph>
日本語のクイックスタート
<https://github.com/unity3d-jp/AssetGraph/blob/1.0/release/Doc/QuickStart_jp.md>
AndroidProjectをgitで管理するための初期設定

AndroidStudioのプロジェクトをGitで管理する際、何を除外すればいいのかイマイチわからなかったのでまとめてみました。

まずはプロジェクトルートに移動します。
macでAndroidStudioからターミナルを起動した場合は標準でいるはず

.gitをファイルを作成します
Terminalで以下のコマンドを叩きましょう。

```terminal
git init
```

.gitignoreを作成します

```terminal
touch .gitignore
```
.gitignoreファイルを編集します。

```
vim .gitignore
```

中身には以下を記述しましょう。

```
*.apk
*.ap_
*.dex
*.class
bin/
gen/
local.properties
.classpath
.project
proguard/
*.iml
*.ipr
*.iws
.idea/workspace.xml
.idea/tasks.xml
.idea/libraries/
.gradle
*/build/
.DS_Store
```

全ての作成が終わったらcommitしましょう


以下は参考ページの丸写しのため確認してません。

```

git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch   6: diff   7: quit   8: help
What now> 4

// .gitignoreファイルを追加して前の画面に戻る

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch   6: diff   7: quit   8: help
What now> 4

// .gitignoreが反映されていることを確認する

// 全ファイルをステージングに追加
git add --all

//　念のために確認
git status

//　コミット
git commit -m "first commit. project created"

// 確認
git log
commit 6bb73326b4185855b940f14ea6faf2f69640d068
Date:   Thu Aug 6 07:44:14 2015 +0900

    first commit. project created

```

参考URL
http://edywrite.blogspot.jp/2015/09/android-4-apk.html
院試を解いてみた（東大院 情報理工 数理情報 修士 専門 H24）

```math
\newcommand{\T}{\mathsf{T}}
\newcommand{\i}{\mathrm{i}}
\newcommand{\d}{\mathrm{d}}
\DeclareMathOperator{\tr}{\mathrm{tr}}
```

東京大学大学院 情報理工学系研究科 数理情報学専攻 修士課程
入学試験問題 専門科目 数理情報学(24年度)
http://www.i.u-tokyo.ac.jp/edu/course/mi/pdf/2012suuri-j.pdf

手始めに第1問だけ解いてみました。といってもいろいろ手を抜いています。
いただいたコメント・ストック・View数次第で、ミスを直したりもうちょっと真面目に詳しく書いたり他の問題も解いたりするかもしれません。

#(1)

$A$の$(i,j)$成分を$A_{ij}$とすると，

```math
\begin{align}
&\frac{1}{2^n}
\sum_{\sigma_1=\pm 1}
\sum_{\sigma_2=\pm 1}
\dots
\sum_{\sigma_n=\pm 1}
\sigma^\T A \sigma\\
&=
\frac{1}{2^n}
\sum_{\sigma_1=\pm 1}
\sum_{\sigma_2=\pm 1}
\dots
\sum_{\sigma_{n-1}=\pm 1}
\sum_{\sigma_n=\pm 1}
\sum_{i=1}^n\sum_{j=1}^n
A_{ij} \sigma_i \sigma_j\\
&=
\frac{1}{2^n}
\sum_{\sigma_1=\pm 1}
\sum_{\sigma_2=\pm 1}
\dots
\sum_{\sigma_{n-1}=\pm 1}
\sum_{\sigma_n=\pm 1}
\left(
\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}A_{ij} \sigma_i \sigma_j
+\sum_{i=1}^{n-1}A_{in} \sigma_i \sigma_n
+\sum_{j=1}^{n-1}A_{nj} \sigma_n \sigma_j
+A_{nn}\sigma_n^2\right)\\
&=
\frac{1}{2^{n-1}}
\sum_{\sigma_1=\pm 1}
\sum_{\sigma_2=\pm 1}
\dots
\sum_{\sigma_{n-1}=\pm 1}
\left(\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}A_{ij} \sigma_i \sigma_j+A_{nn}\right)\\
&=
\frac{1}{2^{n-1}}
\sum_{\sigma_1=\pm 1}
\sum_{\sigma_2=\pm 1}
\dots
\sum_{\sigma_{n-1}=\pm 1}
\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}A_{ij} \sigma_i \sigma_j+A_{nn}\\
&=\dots\\
&=A_{11}+\dots+A_{nn}\\
&=\tr(A).
\end{align}
```

#(2)
答えは3．(3)の特殊な場合なので詳解は省略．

#(3)
$A$のJordan標準形$P^{-1}AP=\Lambda$の対角成分を$\lambda_1,\dots,\lambda_n$とすると，

```math
\begin{align}
&\frac{1}{2^n}
\sum_{\sigma_1=\pm 1}
\sum_{\sigma_2=\pm 1}
\dots
\sum_{\sigma_n=\pm 1}
\frac{1}{2\pi\i}
\oint_{\partial D}
\sigma^\T (zI-A)^{-1} \sigma
\d z\\
&=
\frac{1}{2\pi\i}
\oint_{\partial D}
\left(\frac{1}{2^n}
\sum_{\sigma_1=\pm 1}
\sum_{\sigma_2=\pm 1}
\dots
\sum_{\sigma_n=\pm 1}
\sigma^\T (zI-A)^{-1}\sigma\right)
\d z\\
&=
\frac{1}{2\pi\i}
\oint_{\partial D}
\tr\left((zI-A)^{-1}\right)
\d z\\
&=
\frac{1}{2\pi\i}
\oint_{\partial D}
\tr\left((zI-\Lambda)^{-1}\right)
\d z\\
&=
\frac{1}{2\pi\i}
\oint_{\partial D}
\sum_{k=1}^n\frac{\d z}{z-\lambda_k}\\
&=
\sum_{k=1}^n
\frac{1}{2\pi\i}
\oint_{\partial D}
\frac{\d z}{z-\lambda_k}\\
&=
\sum_{k=1}^n
\left\{
\begin{array}{ll}
1 & (\lambda_k\in D)\\
0 & (\lambda_k\notin D)\\
\end{array}
\right.
\end{align}
```
curlコマンドでAPIからの返り値の確認



WEB APIからの返り値などの確認には、curlコマンドが便利です。
実装前に、どんな感じで値が返るのか確認したり、パラメータ変えたらどんな感じで返ってくるのか？という状況で使えるコマンドです。

```
curl URL名
```

terminal内では見づらいので、返り値をファイルに書き出す

* curl のオプションを使う -o ファイル名
* シェルのリダイレクトを使う > ファイル名

リダイレクトの方を使う例として
デスクトップに移動して

```
$ cd Desktop　
```

```
$ curl http://www.example.com/　> example.txt
```

という感じで叩くとwww.example.comからの返り値が、デスクトップにexample.txtというファイルに書き出されます。

## リダイレクトについて補足

```
>	出力のリダイレクト（画面からファイル）
>>	出力をファイルに追記する（ファイルの更新）
<	入力のリダイレクト
<<	入力終端文字列を指定する
```
ESPr Developer（ESP-WROOM-02開発ボード）で "warning: espcomm_sync failed" と表示される場合の対処

「簡単にWiFiに繋がる開発ボード」として気軽に使えるESPr。
https://www.switch-science.com/catalog/2500/

ファームウェアの書き込み時にハマってしまったので、備忘録代わりにメモしておきます。

## 現象
書き込み時に下記のようなエラーが発生

<img width="742" alt="スクリーンショット 2016-11-05 14.45.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/490753da-c076-601e-f0ac-45fd15faedb9.png">

```
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
```

- ArduinoIDE再起動
- PC再起動
- ブレッドボード交換
- USBケーブル交換

などトラブルシューティングを一通り試すも、状況変わらず。

## ファームウェア書き込みモード
前述のスイッチサイエンスさんの商品ページに下記説明がありました。

>リセットボタンを押すとリセットがかかります。
>モード切替ボタンはIO0番ピンにつながっています。
>ボタンを押すとIO0がLOW、放すとIO0がHIGHになります。
>IO0がHIGHの状態でリセットされるとファームウェアの実行モードで起動しますが、
>IO0がLOWの状態でリセットされるとファームウェアの書き込みモードで起動します。

![espr.JPG](https://qiita-image-store.s3.amazonaws.com/0/38442/20819aee-358e-4ad6-3654-e7f0b5da68ef.jpeg)

赤枠がリセットボタン、青枠がIO0ボタンです。

つまり、ArduinoIDEからESPrにプログラムを書き込む際は、
**IO0を押下した状態でリセットボタンを押す必要がある。**

ということで、書いてある通りにやってみたけど、上手くいかない....なぜ.....

## 突然の解決
試しに、リセットボタンを押した後も**IO0を押し続けたまま**にしてみたところ、

![espr_io0.JPG](https://qiita-image-store.s3.amazonaws.com/0/38442/fd4fa7a2-5257-e089-52c6-b4b621849798.jpeg)

上手くいきました。

<img width="1179" alt="スクリーンショット 2016-11-05 14.48.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/d1560543-4ca0-4b69-238d-e511d6a7d2a5.png">

つまり、
IO0とリセットボタンを同時に押した後、ボタンを離してしまうのではなく、
**「IO0は押し続けたままで書き込み開始を待つ」**必要があったのです。

:innocent::innocent::innocent:

## ハードウェアあるある
友人曰く、「ハードウェアあるあるだよね」とのこと。えぇ・・・
だって一回ボタン押したら手離しても大丈夫って思うじゃないですか・・・

電気回路に詳しかったら、「リセット時にボタン押しっぱなしは当然でしょ」の知識があるのかもしれませんが、今回はそこまで思い至りませんでした。
この辺りのTipsはとにかく場数踏んで、肌感で掴んでいくしかなさそうです。もしくはマニュアルを熟読できるようになるとかでしょうか。
強く生きます。

## 追記（2016.11.10）
コメントでご指摘頂きました、`Reset Method`を`nodemcu`にすることで自動的に書き込みできるようになるとのことでした。
参考URL：http://trac.switch-science.com/wiki/esp_dev_arduino_ide
<img width="430" alt="スクリーンショット 2016-11-10 13.33.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/eebc3221-fee6-9331-1ece-992c69d2ee78.png">
Macが重いときにやることまとめ

本文の内容はGistでshellで公開してます。

https://gist.github.com/bright23/6dc8fd43432a42e8edc7c95589098014

これをHOMEディレクトリにでも置いておく

` $ vi ~/clean.sh `

gistの内容を貼り付けて保存。

なんか重くなったなーと思ったらシェルの実行

` sh clean.sh  `

```
Password:
clean Xcode/DerivedData!
clean Xcode/Archives!
rm: /Users/~~/Library/Caches/CloudKit/com.apple.Safari: Operation not permitted
rm: /Users/~~/Library/Caches/CloudKit: Operation not permitted
rm: /Users/~~/Library/Caches/Google/Chrome: Directory not empty
rm: /Users/~~/Library/Caches/Google: Directory not empty
rm: /Users/~~/Library/Caches/com.apple.Safari: Operation not permitted
rm: /Users/~~/Library/Caches/com.apple.Safari.SafeBrowsing: Operation not permitted
rm: /Users/~~/Library/Caches/com.apple.safaridavclient: Operation not permitted
clean Library/Caches!
clean iOS logs
clean simulator cache
```


## 以下本文


iOSアプリ開発をしているとコンパイル回数が多いせいか、結構Macが重くなります。

不要なログ的なデータ削除だったり、メモリやCPUの開放だったりで軽くなることが多々有ります。



## メモリ解放

```
sudo purge
```


## メモリ解放（そこそこ時間かかります）

```
du -sx /
```

↑はハードディスクのの容量をディレクトリごとに表示してくれるコマンドですが、そのチェック処理中に開放し忘れてた処理を開放するらしいので結果メモリの開放になるようです。
実際、activity monitorで確認しても開放されます。


## アプリとOSのキャッシュのアップデート

```
sudo update_dyld_shared_cache -force 
```

## ドライバキャッシュのクリア
```
sudo kextcache -system-caches
```
カーネルエクステンションというドライバのキャッシュをクリアします。

## カーネルキャッシュの更新
```
sudo kextcache -system-prelinked-kernel
```

## メンテナンススクリプトの手動実行
```
sudo periodic daily weekly monthly
```

上記の最終実行日の確認
```
ls -l /var/log/*.out
```

メンテナンススクリプトは真夜中に自動的に実行さるやつです。
しかし、その真夜中の時間帯にMacの電源を切っていると実行されませんので、いつもちゃんと電源切ってる人は手動実行してあげるといいかもです( `)3')▃▃▃▅▆▇▉ブ ブブーブォォオ

---

### iOS開発やってるなら下記は定期的にやったほうがいい

アプリのビルドキャッシュ的なものが消えるので、フルコンパイルになるので、開発作業中なら注意

## ビルド情報の削除

```
sudo rm -rf ~/Library/Developer/Xcode/DerivedData
```

## アーカイブの削除

```
sudo rm -rf ~/Library/Developer/Xcode/Archives
```

## キャッシュの削除

```
sudo rm -rf ~/Library/Caches
```
RackのenvからRailsのControllerを取得する

Railsは4.1.1で検証しました。

例えばRackミドルウェアの中でロギングしていて、そこにRailsの情報も含めたいという場合、callの引数であるenvからRailsのControllerのインスタンスを取得することができます。
Controllerのインスタンスは`env['action_controller.instance']`に格納されています。

これはairbrakeのユーザ連携などでも使用されています。
https://github.com/airbrake/airbrake/blob/baf02e0b3b112c34f31880d998344141729bc2ce/lib/airbrake/rack/user.rb#L25

Rackミドルウェアの場合、

```rb
def call(env)
  status, headers, body = @app.call(env)
ensure
  controller = env['action_controller.instance']
  controller.class # => XXXController
end
```

とすることでインスタンスが取れるので、Railsがもつ様々な情報にアクセスできます。

```rb
# アクション名
env['action_controller.instance'].action_name => "show"
# ログに表示されるActiveRecordの実行時間(msec)
env['action_controller.instance'].db_runtime # => 30.77199999999999
# ログに表示されるViewの実行時間(msec)
env['action_controller.instance'].view_runtime # => 2.412
# params
env['action_controller.instance'].params
# request
env['action_controller.instance'].request
# 自前で定義したメソッドも呼べる
env['action_controller.instance'].current_user
```
会社のマシンで、社用とプライベートのgitアカウントを使い分けたい


### やりたいこと

プライベートで使ってるgitのリモートリポジトリ（github）に、自分のアカウントでコミット・プッシュしたい
（会社の名前を一切出さないようにする）

### やること（会社のマシンで設定）

1. プライベート用のssh鍵を作成し、リモートリポジトリに登録
2. ~/.ssh/config にhost設定を追記

上記設定後、必要なリポジトリで個別に設定を行う


# 1. プライベート用のssh鍵を作成し、リモートリポジトリに登録

## プライベート専用のssh鍵を作成

```
// sshディレクトリに移動
$cd ~/.ssh

// ssh鍵生成
$ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):

```

まずファイル名を聞かれるので、プライベート用とわかるファイル名を入力

```
./id_private
```

パスフレーズを2回聞かれるので同じものを入力

```
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

## リモートリポジトリに登録

```
$ pbcopy ~/.ssh/id_private.pub
```

使用するサービスに上記を登録。


# 2. ~/.ssh/config にhost設定する

`~/.ssh/config `に（なければ作成）下記を追加

```
Host github.private
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_private
  TCPKeepAlive yes
  IdentitiesOnly yes

```


# 各リポジトリ個別での設定（リポジトリを作成 or `git clone` するたびに設定する）

## リモートリポジトリの設定

2.で設定したhost名を使用して`git clone`（もしくは`git remote add`）する

```
$ git clone github.private:account/sample.git

// いつもはこう
// $ git clone git@github.com:account/sample.git

```

## 個別のuser設定

接続はプライベートアカウントでできるようになったけど、コミットする際にglobal設定が適用されるので、コミットログにうっかり会社のメールアドレスが出てしまいヤバい。

該当リポジトリ配下でlocalのgit設定を行う。

```
$ git config --local user.name "user name"
$ git config --local user.email "username@example.com"
```

* * * * * * * * * * 

以上で、設定したリポジトリの操作は全てプライベートで行ってるように見えるはず。

__会社では仕事を優先しましょうね！__
Pythonで画像内の数字認識

# はじめに
画像内の数字を「手軽」に認識します。
今回はpythonライブラリの tesseract を使用します。
コード自体は非常に簡単に組むことが出来るのですが、tesseract をインストールするのが案外楽ではなかったので、メモしておきます。

# インストール手順

ターミナルから以下のコマンドでインストールを完了できます。

```bash:tesseractのインストール
$ brew install tesseract
$ pip install pytesseract
$ pip install pillow
```

```bash:インストール完了の確認
$ python
>>> import pytesseract
```
これでエラーが出なければ完了です。

# 実行例

今回はこちらの画像 (screen.png) の数字を認識させます。
![screen.png](https://qiita-image-store.s3.amazonaws.com/0/130181/970b842c-a3dd-5275-7cd3-4cca078e4b5b.png)

数字認識用のスクリプトはこちら。

```py:recogition_number.py
# -*- coding: utf-8 -*-
import pytesseract
from PIL import Image

url_img = 'screen.png'
img = Image.open(url_img)
number = pytesseract.image_to_string(img)
print number
```

では、実行してみましょう。

```bash
$ python recog_number.py
2048
```

お、さっと認識してくれました。
今回は画像内にノイズが少なく、認識が容易だったということも有りますが、うまく認識できているので満足です。

# インストール失敗例

pipで素直にtesseractをインストールすると、割とハマってしまうので、お気をつけ下さい。

pip が入っていれば、他のライブラリと同様に pip経由でインストールできます。

```bash
$ pip install tesseract --user
```

これでインストール完了と思いきや、インポートしてみるとよくわからないことを聞かれます。

```bash
$ python
>>> import tesseract
Please enter the path to an existing directory where qhull should be installed:
```

何かをインストールしている場所を教えて下さいと言われますが、心当たりがありません。
お気を付け下さい

# おまけ
フォローお待ちしています！
Qiita: [Carat 吉崎](http://qiita.com/carat_yoshizaki)
twitter：[@carat_yoshizaki](https://twitter.com/carat_yoshizaki)
はてなブログ：[Carat COOのブログ](http://carat-tech.hatenablog.com/)
ホームページ：[Carat](http://caratinc.jp)

機械学習をマンツーマンで学べる家庭教師サービス「[キカガク](https://kikagaku.net)」
「数学→プログラミング→Webアプリケーション」まで一気に学べる「[キカガク](https://kikagaku.net)」に興味のある方はお気軽にご連絡ください。
Cocos CreatorでAndroidコンパイルが失敗する

Cocos Creatorに触る機会があって、Hello Worldプロジェクトを試してみたが、
Androidのコンパイルでいきなり躓いたので、その時の解決方法です。

# Cocos Creatorについて
こちらの記事がわかりやすくていいと思います。
http://qiita.com/kaway/items/25df3a1ceaa9689e3b54

# 環境
|tool|ver|
|----|----|
|Cocos Creator|v1.2.2|
|Android NDK|r12|
|Android SDK|API Level 23(Marshmallow)|
|Ant|v1.9.7|

# Androidのコンパイルでエラー
Buildは通りましたが、Compileでエラーになりました。

![スクリーンショット 2016-11-08 18.24.02.png](https://qiita-image-store.s3.amazonaws.com/0/92539/8011a00b-761b-3d41-4b32-d467fcbd3f5b.png)

![スクリーンショット 2016-11-08 15.16.35.png](https://qiita-image-store.s3.amazonaws.com/0/92539/a74fb96e-dbbc-7ba9-331f-3d99af65af86.png)

```native.log
Building mode: release
Using Android Studio project : /CocosCreatorProjects/HelloWorld/build/jsb-default/frameworks/runtime-src/proj.android-studio
running: '/Users/yuki.kuroda/Library/Android/sdk/tools/android update project -t android-10 -p /CocosCreatorProjects/HelloWorld/build/jsb-default/frameworks/runtime-src/proj.android-studio/app'

Updated project.properties
Updated local.properties
Updated file /CocosCreatorProjects/HelloWorld/build/jsb-default/frameworks/runtime-src/proj.android-studio/app/proguard-project.txt
Building native...
NDK build mode: release
Parse NDK version from file /Users/yuki.kuroda/Library/android-ndk-r12b/build/source.properties failed.
NDK_TOOLCHAIN_VERSION: 4.8
running: '/Users/yuki.kuroda/Library/android-ndk-r12b/build/ndk-build -C /CocosCreatorProjects/HelloWorld/build/jsb-default/frameworks/runtime-src/proj.android-studio/app -j4 NDK_MODULE_PATH=/CocosCreatorProjects/HelloWorld/build/jsb-default/frameworks/cocos2d-x:/CocosCreatorProjects/HelloWorld/build/jsb-default/frameworks/cocos2d-x/cocos:/CocosCreatorProjects/HelloWorld/build/jsb-default/frameworks/cocos2d-x/external NDK_TOOLCHAIN_VERSION=4.8'

[armeabi-v7a] StaticLibrary  : libjscocos2d.a
[armeabi-v7a] StaticLibrary  : libcocos2d.a
make: /Users/yuki.kuroda/Library/android-ndk-r12b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc-ar: No such file or directory
make: /Users/yuki.kuroda/Library/android-ndk-r12b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc-ar: No such file or directory
make: *** [obj/local/armeabi-v7a/libjscocos2d.a] Error 1
make: *** Waiting for unfinished jobs....
make: *** [obj/local/armeabi-v7a/libcocos2d.a] Error 1
Error running command, return code: 2.
```

# 解決内容
このあたりの問い合わせと見ると、NDKのバージョンを下げてみてとありました。
http://discuss.cocos2d-x.org/t/cocos-creator-compile-error/28689/11

Android NDKは公式サイト上だと最新しかダウンロードリンクがありませんが、URLを直接叩けば古いバージョンもダウンロード出来るものもあります。
↑のやり取りであるように、10系なら行けそうなので、10系をダウンロードしました。
https://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip

PreferencesからNDKのパスを変更しますが、12系と10系だとルートの場所が違うので注意です。

NDK r12bの場合
> /Users/{username}/Library/android-ndk-r12b/build

NDK r10eの場合
> /Users/{username}/Library/android-ndk-r10e

`ndk-build`ファイルが移動したようです。

以上で、無事Compileが通り、実機で確認まで出来ました。

因みに、Cocos2d-xはエミュレータだと、arm系じゃないとうまく行かなかったりするので、実機があれば手っ取り早いです。
Xcode8 でのドキュメントコメント（関数コメント）の付け方について

# はじめに

今更感たっぷりですが、Xcode8 & Swift3を１から勉強している際にドキュメントコメントの書き方が非常にわかりづらく、苦戦したので情報をまとめておきます :frowning2:

今回はこちらの関数に対してドキュメントコメントを自動的に入力してくれる方法を探しました

```swift
func sampleMethod(value: String) -> String {
    return value;
}
```

## 試したドキュメンコメントの書き方

AndroidStudioで使用している`/** + Enter`や
Unityで使用している`///`を
入力してもドキュメントコメントの雛形が自動生成されず、
下記のようになるだけでした…


##### `/** + Enter`の場合

```swift
/**

func sampleMethod(value: String) -> String {
    return value;
}
```
`/** ... */`でコメントアウトはできるものの、自動的には`*/`の補完はしてくれず、ドキュメントコメントの雛形が自動的に入力されることはありませんでした

##### `///`の場合

```swift

///
func sampleMethod(value: String) -> String {
    return value;
}
```
こちらも同じくコメントアウトとしては成立するものの、関数コメントの雛形が自動的に入力されることはありませんでした

## 外部プラグインを使う
### VVDocumenter-Xcode

http://dev.classmethod.jp/references/vvdocumenter-swift/
この問題を解消するために外部プラグインを作った方がいたので早速インストール
が、こちら**上手くインストールできず**

追ってみたところXcodeプラグインのインストールはAlcatrazというXcodeプラグインのパッケージマネージャーを使うのが一般的なのですが、AlcatrazがXcode8から非対応になったようです…

なので**Xcode8からはVVDocumenter-Xcodeなどの外部プラグインの導入が難しい状態**となっているようです
（少なくとも現状では）

#### 追記
正式な対応とは少し違いますが、
AlcatrazをXcode8で利用する方法は存在しているようでした
https://github.com/alcatraz/Alcatraz/pull/488

なのであくまで"VVDocumenter-Xcodeは今までの手法では導入できない"でした
誤情報失礼しました :bow: 

## 実は公式に導入されていたVVDocumenter-Xcode
[こちら] (https://github.com/onevcat/VVDocumenter-Xcode/issues/228)のissue曰く、どうやらVVDocumenter-Xcode（又はそれをベースとして開発されたもの）が**XCode8からデフォルトで導入されている**ようでした。

で、こちらの記事を見ると、以下のショートカットでドキュメントコメントの入力ができるよ、とのこと

```
Alt + Cmd + / 
```

早速試して見ると…

```swift
/// <#Description#>
///
/// - Parameter value: <#value description#>
/// - Returns: <#return value description#>
func sampleMethod(value: String) -> String {
    return value;
}
```

**できた！**

`<#`と`#>`が入っている分見た目が少し変ですが、実際はこんな感じです
![スクリーンショット 2016-11-08 16.36.42.png](https://qiita-image-store.s3.amazonaws.com/0/85904/ec11d653-2ff6-5856-9e00-879389369f18.png)

#結論
## Xcode8未満の人：
[VVDocumenter-Xcode] (http://dev.classmethod.jp/references/vvdocumenter-swift/)を導入すれば対応可能

## Xcode8以上の人：
外部プラグイン等の導入は不要
`Alt + Cmd + / `を入力することで以下のようなドキュメントコメントの雛形が自動的に入力される

```swift
/// <#Description#>
///
/// - Parameter value: <#value description#>
/// - Returns: <#return value description#>
func sampleMethod(value: String) -> String {
    return value;
}
```
Qiitaの最近気になるところメモ

前にも似たようなのを書いたけれども、その他気になったところのメモ（個人の感想です）
[Qiitaでの記事作成についての雑感 - Qiita](http://qiita.com/koara-local/items/ce55955359b87a1228e0)

#Web版について
・下書きの保存可能件数が少ない気がする（たりなさすぎて限定共有を下書きにしてるひと多数）
・限定共有を公開にしたときに新着にのらない気がする（下書き代わりにしてる使い方がそもそも間違ってる気もする）
・通知の「あなたの投稿がツイートされました」をクリック => その人のTwitterに飛ばずにQiitaの記事に飛ぶ => ！？？？ 
・プロフィールページの円グラフはもうちょっと細かく出てくれると嬉しいなと思う（Otherが約50%・・・）
・あと円グラフの要素がアニメーションするので、クリックしてその人のそのタグの投稿一覧に飛べそうに見えて飛べない
・Qiitaのプロフィールページはスキルリストというかポートフィリオとして使えそうだなぁと思った

#モバイル版について
・一番下までスクロールして、そのままストックできない（一番上まで戻る必要がある）
・モバイル版で上にスクロールするときなんか横にぐねぐねするような？？

#その他気になるところ
[Markdown記法 チートシート - Qiita](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E8%A8%98%E6%B3%95)
・Qiita公式の記事への編集リクエストが承認も却下もされない、通知が飛んでいるのか気になるところ

[Qiitaでシンタックスハイライト可能な言語一覧 | Syntax Highlighting: List of Supported Language at Qiita - Qiita](http://qiita.com/Qiita/items/e84f5aad7757afce82ba)
・シンタックスハイライトの対応についてはどうなる？
　　=> いろいろとリクエストが来てるけれども対応ってどうなってるのか
　　=> ここに書くよりPRとか送ったほうがよい？
　　　　=> [increments/qiita-markdown: Qiita-specified markdown processor.](https://github.com/increments/qiita-markdown)