OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftLintを入れたいと思ったシーンとその理由

# これはなに
最近チーム開発をしていて、[SwiftLint](https://github.com/realm/SwiftLint)が欲しい[^1]と初めて思ったシーンがあったのでその紹介と、なぜ入れたいと思ったのかを紹介する記事です。

# SwiftLintが欲しいと思ったシーン

- 初めての人とチーム開発をすることになったとき
- チームに新しい人が入ってきたとき
- その時々で自分が「イケてる」と思っている書き方は変わるが、将来の自分に対して「このプロダクトは、この書き方で統一させた方が一貫性が出て良い」と説得したいとき

# SwiftLintが欲しいと思った理由

- 将来の自分自身に対しても、他のチームメンバーに対しても、あとから参入する人のためにも、「この書き方で統一するルールになっています」ということが示せるから
- **「このチームではこの書き方をしているので、こう直してください」みたいなのをPR時に指摘していくのは、指摘する方もされる方もエネルギーを消費してしまう**から

# 「コーディング規約」は「朝の挨拶運動」

欲しいと思った理由の前提として、コーディング規約が整備されていることを想定しています。

まずそのコーディング規約に対して賛成と反対が出てきたり、その人によって慣れたものでない可能性があります。それは小中高などの学校教育の中で行われた、「朝の挨拶運動」みたいなものだと思いました。

我々は学校教育の中で「朝は気持ちよく挨拶した方が、された方が気持ちいいだろ！」という理不尽を体験してきましたが、それは行う側・受け手側、個々人によって考え方が異なる部分になります。そしてそういう活動に反対だからという理由でやらないでいると「ちゃんと真面目にやれよ！」「がんばってみんなでやろう？」みたいな　**理由が曖昧なお叱りを人から受けてはストレスを感じてきました。**

コーディング規約においては、そうすべき理由がはっきりしていることが多いのでストレスは軽減されるものの、 **いちいち人が指摘するという行動にはまだストレスと疲労が発生します。** 

また、「朝の挨拶運動」に賛成だったからといっても、その日の体調によっては気持ちよく挨拶が出来ない日が出てきてしまうかもれません。 **いちいち人が確認するという行動にはまだ疲労が発生しますし、見逃しが出てしまう可能性もあります。**

「指摘されるコードを書く方が悪い」とか誰が悪いとかそういうものではなく、エネルギーを節約して、見逃しなどの人依存のミスを減らすために、SwiftLintを入れた方が良かったかもと思ったのでした。

# 次の開発に向けて

今のプロジェクトはちょっと切羽詰まってきているので、次のプロジェクトでは開始時にSwiftLintを入れたいと思いました。

あと @YusukeHosonuma さんに教えてもらったものですが、[SwiftFormat](https://github.com/nicklockwood/SwiftFormat)も試してみる価値があるかもと思いました。(Warningが出て教えてくれるだけでなく、良くないところは自動で直してくれるツールっぽいです)

[^1]: 「SwiftLint」と書いたのは、自分がSwiftで開発しているから。それに関連した話になりそうだったからで、他の言語・環境においてもLintを入れる動機とかは同じようなものになると思う
GoogleAppsScriptでぐるなびのAPIを叩いた結果をスプレッドシートに書き出す

GASの勉強がてらやってみました。

近所のお店をずらっと書き出すとかに使えそうです。
出力件数の制限があるそうなので、そこはもうちょっと工夫しないと回らなさそうですが。
(for文でoffsetいじるとかになるかな)



githubはこちら。
https://github.com/ymk1t/gnavi_api


```gnavi_api.gs
function myFunction() {
  var gurunaviAPI = '*************';//取得したアクセスキー
  var url = 'https://api.gnavi.co.jp/RestSearchAPI/20150630/?';
  url = url + 'keyid='+ gurunaviAPI;
  url = url + '&format=json';
  
  // リクエストパラメータ
  url = url + '&freeword=ラーメン';
  
  var response = UrlFetchApp.fetch(url);
  var json=JSON.parse(response.getContentText());
  
  var jsonLength = Object.keys(json.rest).length;//ヒットした件数を取得する
  var arrArea = [];//出力する値を入れるための配列
  
  if(jsonLength < 1){
    return;
  }

  for (var i=0;i<jsonLength;i++){
    // 出力したい情報を配列に入れていく
    arrArea.push([json.rest[i].url,
                  json.rest[i].name,
                  json.rest[i].id
                 ]);
  } 
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = sheet.getSheetByName('シート1');
  var rows = arrArea.length;
  var cols = arrArea[0].length;
  sheet1.getRange(3,2,rows,cols).setValues(arrArea);//スプレッドシートに書き込む
}
```


GASは初めて使いましたが、シートの書き込み処理が結構シンプルで嬉しい驚きでした。
1. 対象とするシートやセルを指定する
2. 書き込みたい値を配列に入れておく。
3. getRange().setValue()を使って決めた場所に配列の値を書き出す
ぐらいで動きますもんね。

APIの検索条件は冒頭のURLの文字列にパラメータを追加していくことでできて
出力についてはarrArea.pushのところで順番や内容を修正できます。


APIやGASの良い練習になりました。


### 補足
ぐるなびAPIはアカウント発行してアクセスキーを取得しないと動かないので利用になる場合は事前に登録しましょう。
また、期間の指定やアプリの登録が必要になりますが、自分はお試しの一時利用ということにして突破しました。


### 参考サイト

[ぐるなびウェブサービス](http://api.gnavi.co.jp/api/manual/)
[Google Apps Script 入門](https://qiita.com/t_imagawa/items/47fc130a419b9be0b447)
Ubuntu 16.04 LTS > .svgファイルから.pdfへ変換する

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

関連: [Ubuntu > マウスクリックの自動化 > Tinkercadの操作が面倒なので > 下に移動しながらスライス | link:Iron Man Bust by tails_, published Nov 12, 2014](https://qiita.com/7of9/items/394a4f8b709eed6ba05d)

Tinkercadと自作スクリプトによって作成したスライスのsvgファイル。レーザーカットに用いるためInkscapeを使ってA3のファイルに整理した。

.svgファイルのままだとレーザーカッターのソフトのバージョンによってはサイズが不定になる場合があると聞いている。
前回はMacbook Airを起動して変換したが、Ubuntuで変換してみる。


https://superuser.com/questions/381125/how-do-i-convert-an-svg-to-a-pdf-on-linux

```bash
$ sudo apt-get install librsvg2-bin
$ rsvg-convert -f pdf -o A3_IronMan_180325.pdf A3_IronMan_180325.svg 
```

pdfファイルが作成された。
ゼロから作るDeepLearningを読んで2

# ニューラルネットワークの学習
次に、ニューラルネットワークの学習に移ります。

# 損失関数
## 2乗和誤差
```math
\begin{eqnarray}
E=\dfrac {1}{2}\sum _{k}\left( y_{k}-t_{k}\right) ^{2}
\end{eqnarray}
```
- $ y_{k} $ : ニューラルネットワークの出力(ソフトマックス関数などによる出力)
- $ t_{k} $ : 教師データ
- $ k $ : データの次元数

  例：y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
　　t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] ←三番目の要素が正解の場合 
　　E=0.097500000

## 交差エントロピー
```math
\begin{eqnarray}
E=-\sum _{k}t_{k}\log y_{k}
\end{eqnarray}
```

![log.png](https://qiita-image-store.s3.amazonaws.com/0/164189/ac720da6-8a07-7efd-c591-c943b0037888.png)

# 数値微分
損失関数を使用して、パラメータを最適化していく際に、偏微分を用います。
まずは微分の説明から。
## 微分
ある地点での変換量は下記式で求まります。
高校数学で$ y=x^{2}$が$ \dfrac {dy}{dx}=2x $に微分できると習ったかと思いますが、ここでは別の求め方をしています(解析的な微分と呼ぶそうです)。

```math
\begin{eqnarray}
\dfrac {dt\left( x\right) }{dx}=\lim _{h\rightarrow 0}\dfrac {f\left( x+h\right) -f\left( x\right) }{h}
\end{eqnarray}
```
丸め誤差を考慮し、$ h=10^{-4} $程度の桁数が良いそうです。
ただ、hの値が限りなく0の近い訳ではないので、**中心差分**というのが有効だそうです。
中心差分とは$ \dfrac{f\left( x+h\right) - f\left( x-h\right)}{2} $になります。

## 偏微分
$ f\left( x_{0}-x_{1}\right) = x_{0}^{2} + x_{1}^{2} $というように、複数の変数がある場合、
1つを除く他の変数に値を固定し微分したものを**偏微分**といいます。
これにより、固定した値における傾きを知ることができます。

# 勾配
$ x_{0}, x_{1} $の両方のある地点での偏微分をまとめて次のように表記します。

```math
\begin{eqnarray}
\left( \dfrac {\partial f}{\partial x_{0}},  \dfrac {\partial f}{\partial x_{0}}\right) 
\end{eqnarray}
```
これをベクトルとして表記したものを勾配と呼びます。

$ f\left( x_{0},x_{1}\right) = x_{0}^{2} + x_{1}^{2}$の各地点の勾配を求めてみましょう。
![localhost_8888_notebooks_Untitled.ipynb_kernel_name=python3.png](https://qiita-image-store.s3.amazonaws.com/0/164189/aafcafca-d900-0449-d94f-cb933f70f695.png)

勾配は次のようになります。
![localhost_8888_notebooks_Untitled.ipynb_kernel_name=python3 (1).png](https://qiita-image-store.s3.amazonaws.com/0/164189/9390f018-281b-4928-a997-ecb1102d916b.png)

# 勾配法
勾配方向へパラメータを調整し、最小値を求める方法が**勾配法**です。

```math
\begin{eqnarray}
x_{0}=x_{1}-\eta \dfrac {\partial f}{\partial x_{0}}
\end{eqnarray}
```

```math
\begin{eqnarray}
y_{0}=y_{1}-\eta \dfrac {\partial f}{\partial y_{0}}
\end{eqnarray}
```

$ \eta $は学習率を表します。つまり、偏微分に学習率を掛け合わせた値で補正させます。
学習率を0.01として、$ (-3.0, 4.0) $から100回試行した場合、$ (-6.11110793e^{-10}, 8.14814391e^{-10}) $となり、限りなく$ (0, 0) $になります。
学習率が大きすぎたり、小さすぎたりすると、期待した結果になりづらい可能性があります。
学習率のようなパラメータは**ハイパーパラメータ**と言い、うまく学習する値を探す作業が必要になります。

# ニューラルネットワークに対する勾配
勾配法をニューラルネットワークに適用する方法を考えます。

形状が$ 2\times 3 $の重み$ W $だけを持つニューラルネットワークがあり、損失関数を$ L $で表す場合、次のように表記できます。

```math
\begin{eqnarray}
W=\begin{pmatrix}
w_{11}w_{21}w_{31} \\
w_{12}w_{22}w_{32}
\end{pmatrix}
\end{eqnarray}
```

```math
\begin{eqnarray}
\dfrac {\partial L}{\partial W}=\begin{pmatrix}
\dfrac {\partial L}{\partial w_{11}} & \dfrac {\partial L}{\partial w_{21}} & \dfrac {\partial L}{\partial w_{31}} \\
\dfrac {\partial L}{\partial w_{12}} & \dfrac {\partial L}{\partial w_{22}} & \dfrac {\partial L}{\partial w_{32}}
\end{pmatrix}
\end{eqnarray}
```
cakephp3のインストール

composerを使ってcakephp3をインストールする。
[composerインストール](https://qiita.com/naka46/items/5bed3a6a52abc610d537)

cakephpはphp以外にphp-intl php-mbstringが必要
※yumでインストールする場合は対象のバージョンのものをインストールする事
　例えば php71-intl php71-mbstring
[phpインストール](https://qiita.com/naka46/items/7057a6fcb848a203de1b)

### インストールする
sampleフォルダを作って、そこにcakephp3のアプリケーションを作成する。
最新のバージョンをインストールする。

```
cd /var/www/html
mkdir sample
cd sample
composer self-update && composer create-project --prefer-dist cakephp/app app
```

### アパッチのルートフォルダ変更

```
cd /etc/httpd/conf
cp httpd.conf httpd.conf_20180325
vim httpd.conf
```

```
DocumentRoot "/var/www/html/sample"
```

再起動する。

```
service httpd restart
```


下記の画面が表示されれば、ひとまずインストールは完了。
![cakephp3画面.png](https://qiita-image-store.s3.amazonaws.com/0/79214/cb456db8-60dd-5188-bb6c-a723cd2040ae.png)
うまくいかない場合は、本家サイトを参考にする。
[本家インストール手順](https://book.cakephp.org/3.0/ja/installation.html)


あとはDBまわりを設定すればOK！
[mysql 設定](https://qiita.com/naka46/items/8a6f6ddfff80d487d42c)

これを設定してDBのエラーも解消され、**CakePHP is able to connect to the database.**と表示されれば完了！
Node.jsでcsvからjson変換

0.作業フォルダ
　C:\tmp\c2j

1.インストーラーのダウンロード
　http://nodejs.org/

2.csvtojson をインストール
　npm install csvtojson

3.スクリプト
　c2j.js
	//引数確認
	/*
	for(var i = 0;i < process.argv.length; i++){
	  console.log("argv[" + i + "] = " + process.argv[i]);
	}
	*/

	var fs = require('fs');
	var Converter=require("csvtojson").Converter;
	var csvConverter = new Converter({
	  constructResult: false,
	  toArrayString: true
	});

	var readStream = fs.createReadStream(process.argv[2]);
	var writeStream = fs.createWriteStream(process.argv[3]);

	readStream.pipe(csvConverter).pipe(writeStream);
	console.log("END");

4.実行
　cd C:\tmp\c2j
　node c2j.js test.csv test.json
UbuntuにDockerを入れる

Lubuntu にDocker をインストールする手順をまとめた。

# この記事を読む対象の人
- Linux を触ったことがある人(現在進行形で触っている人)
- Docker を使ってみたいと思っている人

# 今回のOS環境
- Lubuntu 16.04 (Ubuntu でも同様の手順でインストール可能)

# インストール手順
インストールは、全てターミナルから行う。
インストールを始める前に、パッケージのアップデートをしておく。

```zsh
sudo apt-get update
```
HTTPS経由でリポジトリを取得できるようにする。
※ インストールには、curl コマンドを使用するので、curl をインストールしておくこと。curl については説明を省略。

```zsh
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
```
Docker の公式GPGキーを追加する。

```zsh
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
公開鍵のフィンガープリントを確認。

```zsh
sudo apt-key fingerprint 0EBFCD88
```
`apt` コマンド用のリポジトリの設定を行う。

```zsh
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
```
docker-ce をインストールする。

```zsh
sudo apt-get update
sudo apt-get install docker-ce
```
`hello-world` イメージを実行して、Docker が正しくインストールされているか確認する。
下記のようになれば成功。

```zsh
sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

## sudo なしでDocker を動かすために
このままだと、いざDocker を動かすときに、いちいちdockerコマンドの前にsudoをつけて実行しないといけないのは面倒なので、sudo なしでDocker を動かせるようにする。

`docker` という名前のグループを作成し、そのグループにユーザを所属させる。

```zsh
sudo groupadd docker
sudo gpasswd -a [username] docker
```

# 参考URL
記事の大体は公式サイトから。
https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository

とてもわかりやすかったです。ありがとうございました。
http://www.atmarkit.co.jp/ait/articles/1701/30/news037.html
https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d
https://qiita.com/DQNEO/items/da5df074c48b012152ee
[Unity]LoadScene()でシーンが切り替わらない時の対処法

```C#
void Start()
    {
        SceneManager.LoadScene("シーン名");
    }
```

からシーンを移動させようとしたが、

>Scene 'シーン名' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.

このようにエラーが起きた。

よく見てみると、エラーの詳細に、
>To add a scene to the build settings use the menu File->Build Settings...

と書いてある。
つまり、**build settings**でシーンを追加するのを忘れているのだ。

![build settings](https://qiita-image-store.s3.amazonaws.com/0/216704/c1cbf241-d517-6271-23d5-c71c5967f1a9.png)
ここの、**Add Open Scenes**でシーンを追加している状態でなければならない。

シーンを開いている状態で**Add Open Scenes**をクリックすれば追加できる。
Windows 10 の VIDEO_SCHEDULER_INTERNAL_ERROR

Windows 10 の一部の環境で、スリープ復帰時にブルースクリーン VIDEO_SCHEDULER_INTERNAL_ERROR が発生して落ちる問題と、その対処法。

しばらく発生してなかったので、バグ修正されたのかと思ったのですけど、自分の環境でまた再発してしまったので、メモ。

# 1. 発生環境

恐らく NVIDIA と Windows 10 の組み合わせの環境。

# 2. 発生条件

## 2.1. 発生しうる状態になっているとき

スリープ復帰時。

恐らく、3 秒以上復帰に時間がかかった場合にエラーが発生。
3 秒以内に復帰できた場合は正常に復帰する。

(ファイル) エクスプローラで、画像や動画のサムネイルを沢山表示していると復帰に時間がかかる気がする？

Windows Update の後再発する。

## 2.2. 発生しうらないとき

3 秒以上復帰に時間がかかった場合も正常に復帰する。

サムネイル表示はやはり復帰時間に影響している気がする。

次の Windows Update までは安心。

# 3. 副作用

デスクトップのアイコンの配置の情報が失われることがある。
(失われないこともある)

デスクトップのアイコンが左上にグチャッと固まった感じに。

# 4. 応急処置

画像や動画のサムネイルを表示している (ファイル) エクスプローラをすべて閉じる。

# 5. 対処

経験ではこれで次の WIndows Update まで持ちます。

## 5.1. 「デバイス マネージャー」から「デバイスのアインインストール」

あくまで「デバイス マネージャー」を使います。
ドライバアインストール系のフリーソフトを使ってみたらダメでした (ソフトによるかもしれませんが) 。

スタートメニューを右クリックするとメニューに「デバイス マネージャー」があります。

![qiita01.png](https://qiita-image-store.s3.amazonaws.com/0/232067/a0c375c0-3937-1845-9b63-7b30ee890833.png)

![qiita02.png](https://qiita-image-store.s3.amazonaws.com/0/232067/00ae5eb0-563a-02ec-764a-9a7844c0d87a.png)

## 5.2. 再起動

NVIDIA のドライバが削除されているので、再起動後は低解像度で起動。

## 5.3. Windows の機能でドライバが自動的にインストールされるのを待つ

標準で ON になっている、ドライバの自動インストール機能でドライバがインストールされるのを待ちます。
(10 分程度？ そこそこ時間がかかります)

機能を OFF にしている場合は ON にしてください。

参考「[Windows10でドライバが勝手にインストールされないようにする方法 (2017年改訂) - ぼくんちのTV 別館](https://freesoft.tvbok.com/win10/driver-auto-install-invalid.html)」

この時も、NVIDIA のインストーラは使わずにインストール。

## 5.4. 再起動

インストールが終わると一時的に解像度が高解像度に戻りますが、そのまま使用すると不具合が出るので、さらに再起動。

# 6. その他

ネットで検索してみると、自分以外のひとたちも同じ問題が発生しているようなのですが、ごく少数で、不確定要素も多い問題なので、未だに謎が多いです…。

自分の環境はマルチディスプレイなのですが、もしかしてそれも影響しているのかな…？ と思ったり。
FlutterでHello World!

環境構築後、やることと言ったらHello worldというのがこの世界の習わしでするので、
[前回](https://qiita.com/kouichi_c/items/644c86d197c7758d826b)環境構築で終わったとこから進めてみようと思います。
#環境

```
OS: Mac OS X 10.13.3
Text editer:VSCode 1.20.1 
Flutter: Flutter 0.1.5 • channel beta
```

#main.dart
Flutter環境構築後のフォルダ構成は以下のようになっています。

```:terminal
$ tree .

.
├── README.md
├── android
├── android.iml
├── build
│   ├── app
│   ├── app.flx
│   ├── flutter_assets
│   ├── ios
├── ios
├── lib
│   └── main.dart
├── myapp.iml
├── myapp_android.iml
├── pubspec.lock
├── pubspec.yaml
└── test
    └── widget_test.dart

```

treeコマンドしたらたくさん表示されたので一部割愛してあります。

今回編集したいのはlibフォルダ配下のmain.dart

```
├── lib
│   └── main.dart
```

#Hello world
一度main.dartの中身を全削除し、次のコードに書き換えます。

```dart:main.dart
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new Text('Hello World'),
        ),
      ),
    );
  }
}
```

そしてビルド、実行(VS CodeではF5ボタン押下)すると、、、

<img width="300" alt="スクリーンショット 2018-03-25 12.34.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/57a96905-6eee-82b8-5a79-5f8afb2f31a3.png">

シンブルなHello Worldが出来上がりました。

# Hot Reload
Flutterの特徴の一つにHot Reloadというものがあります。
これが何かというと、
エミュレータを起動したまま内容の変更ができる、というもの
試しにエミュレータを起動した状態(上のようにアプリが立ち上がっている状態)で、
上記コードのHello worldの部分をHello Flutterなどに変更し、
保存してみると、、、


<img width="300" alt="スクリーンショット 2018-03-25 12.39.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/c40d4722-575e-a68f-378b-a85c576b506b.png">

すぐに反映してくれました。
これは素敵です。

#おまけ
画面の色が白では物足りない方は
main.dartの11行目あたりに

```dart:main.dart
backgroundColor: Colors.blue,
```

backgroundColorを追加してあげるともう少し遊べそうです。

<img width="300" alt="スクリーンショット 2018-03-25 13.07.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/59167b5e-5575-7b94-05a1-996f45ab1ae5.png">
【Rails】Simple Calendarを使ったカレンダー表示


カレンダーアプリを作成しようとした時に、カレンダー表示に時間がかかったので、その時の忘却防止メモ

今回はカレンダー表示までのテスト。
とりあえずrails new でプロジェクト作成

[simple calendar](http://excid3.github.io/simple_calendar)を参考にgemの追加

```ruby:gemfile.rb
gem 'simple_calendar', '~> 2.0'
```
・bundle install
・必要であればbundle update実行


今回はドキュメントに従ってscaffoldを使用

```bash
rails g scaffold meeting name start_time:datetime
```

ここで表示の確認すると、何も表示されていないので日付が表示されるように変更を加える

![スクリーンショット 2018-03-25 12.02.18.png](https://qiita-image-store.s3.amazonaws.com/0/174952/ac321791-b92e-fe89-c84b-f41e11ae58a3.png "スクリーンショット 2018-03-25 12.02.18.png")


views追加
~/views/meetings/index.html.erb

```erb
<%= month_calendar events: @meetings do |date, meetings| %>
  <%= date %>

  <% meetings.each do |meeting| %>
    <div>
      <%= meeting.name %>
    </div>
  <% end %>
<% end %>
```
このviewが、manth_calendar というところから１ヶ月分のカレンダー情報を取ってきてるよ。みたいなやつ。
そもそもmanth_calendarがないから現状何も表示されないので
・rails gコマンドで必要なviewを作成

```bash
rails g simple_calendar:views
```
これでsimple_calendarディレクトリ内に
・_calendar.html.erb
・_month_calendar.html.erb
・_week_calendar.html.erb
の３つが作成されたので、この「_month_calendar.html.erb」を読み込んで来てくれるはず。


![スクリーンショット 2018-03-25 12.05.19.png](https://qiita-image-store.s3.amazonaws.com/0/174952/a78e6bfb-8231-ed8e-251b-8c1401e0ef62.png "スクリーンショット 2018-03-25 12.05.19.png")


成功！！
１ヶ月の日付表示が出来た。

##見た目をカレンダーっぽくする
ここから見た目を変更する方法がわからず、色々やった結果。
app/assets/stylesheets/application.scss
・require simple_calendar追加

```scss:app/assets/stylesheets/application.scss
/*
 *= require simple_calendar
 *= require_tree .
 *= require_self
 */
```
![スクリーンショット 2018-03-25 12.47.38.png](https://qiita-image-store.s3.amazonaws.com/0/174952/7ef770fe-596c-b10e-5961-705b925a0073.png "スクリーンショット 2018-03-25 12.47.38.png")

表示できた！


どうやらsimple calendarのCSSを読み込んで来る必要があるみたい（これがわかるまでに時間かかってしまった）

なぜそうなるのか、あんまり理解できてないので調べておきます…
アセットパイプラインとかその辺り。


####参考：
・http://excid3.github.io/simple_calendar/
・http://melvinchng.github.io/rails/SimpleCalendarGEM.html#31-replaced-js-calendar-with-simplecalendar-gem

結局こういうのって色々情報は出てるけどバージョン違いとかで公式ドキュメントの英文に頼る場合が多い...
Google翻訳があればなんとかなりそうなので、このままイベントの登録機能の実装と、見た目を変えていきます。

とりあえずカレンダー表示は出来たのでここまで。
Webpack を使わずに import 文を使う

# 要約
2018 年現在のフロントエンド開発 (HTML, CSS, JavaScript) のスタンダードは Webpack によるモジュール分割。
しかし、Webpack にはそれなりの環境準備が必要であり、慣れていないと時間がかかるデメリットがある。

ES6 に対応した最新のブラウザーを使えば、Webpack なしでもモジュール分割された JavaScript を使うことができるので、簡単な検証にはそちらが向いている。

# 本文
## Webpack によるモジュール分割
Webpack は JavaScript の **バンドル** を担う。
たとえば、次のコードを分割することができる：

分割前

```html:index.html
<!DOCTYPE html>
<script src="./index.js"></script>
```

```js:index.js
// 汎用的な処理
function add(x, y) {
  return x + y;
}

// アプリのロジック
console.log(add(1, 2));

// 結果は 3
```

分割後

```html:index.html
<!DOCTYPE html>
<script src="./index.bundle.js"></script>
```

```js:common.js
// 汎用的な処理
export function add(x, y) {
  return x + y;
}
```

```js:index.js
import { add } from './common.js';

// アプリのロジック
console.log(add(1, 2));

// 結果は 3
```

分割後の 2 ファイルを Webpack によってバンドルすると、分割前の `index.js` のようなファイルとして `index.bundle.js` が生成される。
ブラウザーからは `index.bundle.js` のみを読み込んで、実行することができる。

    common.js ─┐
    index.js  ─┴─ index.bundle.js

`common.js` を読み込むための `import` 文は、「生の」JavaScript では使えない（正確には、使えなかった）。
Webpack はその点を補う。


## Webpack にはそれなりの環境準備が必要
Webpack のメリットを享受するには、環境準備が必要である。
環境準備とは次を指す：

- Node.js, npm のインストール
- Webpack のインストール
- webpack.config.js の作成

慣れれば問題はない。
しかし、たとえば Webpack を知らない人に JavaScript のサンプルを渡す場面で、こういった本質的ではない準備に時間を取られることがある。


## Webpack なしでもモジュール分割された JavaScript を使うことができる
ES6（JavaScript の仕様のバージョン名）に対応したブラウザー（最新の Chrome, Firefox, Edge ら）は、「生の」JavaScript で `import` 文を使うことができる。
その場合、`common.js` の読み込みはランタイムに解決されるため、バンドルのための環境準備が不要になる。

その場合のサンプルは次のとおり：

```html:index.html
<!DOCTYPE html>
<script type="module" crossorigin src="./index.js"></script>
```

※ `common.js` と `index.js` の中身は Webpack 利用の場合と同じ

注目すべきは

- `index.bundle.js` ではなく `index.js` である
- `type="module"` が必要（`import` を有効にするフラグとして）
- ほとんどの場合、`crossorigin` が必要（認証が必要なリソースを `import` するため）

といった点。
Webpack との違いや、`type="module"` 出ないスクリプトとの違いはほかにもあるが、長くなるので述べない。


# まとめ
JavaScript を動かしてみるだけなら、Webpack を使わず、`type="module"` によるスクリプトの読み込みが手軽で、おすすめ。


# 参考
## Node.js の `require` との違い
Node.js では `import` 文は使えない。[^1]
代わりに `module.exports` プロパティと `require` メソッドを使う。

[^1]: コメントで教えていただいた。実験的だが使えるようだ。 [Node.js(v8.5.0以降)でBabelやwebpackを利用せずにimport/exportを利用する - Qiita](https://qiita.com/Kaoru_Yamamoto/items/bcca9b63220e23b69399)

```js:common-node.js
// 汎用的な処理
module.exports.add = function add(x, y) {
  return x + y;
};
```

```js:index-node.js
const { add } = require('./common-node.js');

// アプリのロジック
console.log(add(1, 2));
```

```bash
node index-node.js
# 結果は 3
```
Composerインストール

PHPのパッケージ管理システムのComposerをインストールする。
PHPで開発するなら必須のツールかと思います。
cakephp3もComposerを使って簡単にインストールできる。

### ダウンロードする

```
cd ~
mkdir php
cd php
curl -sS https://getcomposer.org/installer | php
```

### 確認する

```
./composer.phar
```

コマンド説明が出たらOK

### 移動する
pathが通ているフォルダに移動する。

```
sudo mv composer.phar /usr/local/bin/composer
```
初めてライブラリを作った時の話

# はじめに
先日[Poi](https://github.com/HideakiTouhara/Poi)というiOSのライブラリを作成しました。
https://github.com/HideakiTouhara/Poi
PoiとはTinderのようなカードスワイプUIを簡単に実装できるライブラリです。
(15スター以上取るのが目標なので、よろしければスター頂けると幸いです)
<img width="414" alt="IMG_6126.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/155459/fa9520ca-35e9-55f8-02bf-a11a2128ebd1.png">
こんなかんじのUIを手軽に作ることが出来ます。

今大学生でエンジニアアルバイトをしているのですが、アプリを作るだけでなくOSS開発したいなーと思ったのがきっかけで作りました。
工夫した点としては、ユーザーはTableViewを実装するような感じでこのライブラリを使えるようにした点です。
多くのiOS開発者にとって慣れ親しんだ方法で実装することが出来ます。

# 導入方法
## 手動
手動で入れるならライブラリをCloneして

```
git clone git@github.com:HideakiTouhara/Poi.git
```
以下のように直接追加してあげればOKです。
![direct_import1.jpg](https://qiita-image-store.s3.amazonaws.com/0/155459/5e1e6405-568d-cfdf-40b8-40fedca92eb3.jpeg)

## Carthage, CocoaPods
Carthage, CocoaPodsどちらも対応済みです。
CocoaPodsならpodfileに

```
pod ‘Poi’
```

CarthageならCartfileに

```
github "HideakiTouhara/Poi"
```
でいけます。

# 使い方
PoiViewというカスタムViewを何らかの形で生成してください。
StoryBoardからViewを配置してClassをPoiViewにするか、
コード上で

```
let poiView = PoiView()
self.view.addSubView(poiView)
```
で作れます(どちらもimport Poiの記述は必要です)

あとはdelegateとdatasourceに準拠します

```
class ViewController: UIViewController, PoiViewDataSource, PoiViewDelegate {
```

```
poiView.dataSource = self
poiView.delegate = self
```

このあたりはTableViewと同じ感じですね。

# 使えるメソッドの紹介
## PoiViewDataSourceのメソッド

```
func numberOfCards(_ poi: PoiView) -> Int
```

設定するカードの枚数を決めます。

```
func poi(_ poi: PoiView, viewForCardAt index: Int) -> UIView
```

スワイプするカードの中身を設定します。
返り値はUIViewで返してください。


```
func poi(_ poi: PoiView, viewForCardOverlayFor direction: SwipeDirection) -> UIImageView? {
    switch direction {
    case .right:
        return UIImageView(image: #imageLiteral(resourceName: "good"))
    case .left:
        return UIImageView(image: #imageLiteral(resourceName: "bad"))
    }
}
```

カードが左右に振れたときオーバーレイする画像を設定することが出来ます。
directionで左右どちらの場合かで場合分けできます。


## PoiViewDelegateのメソッド

```
func poi(_ poi: PoiView, didSwipeCardAt: Int, in direction: SwipeDirection)
```

スワイプされたときに呼ばれるメソッドです。
こちらもdirectionで左右どちらにスワイプされたか場合分けできます。

```
func poi(_ poi: PoiView, runOutOfCardAt: Int, in direction: SwipeDirection)
```

最後のカードがスワイプされたときに行いたい処理はここに記述してください。

## その他のメソッド

```
func swipeCurrentCard(to direction: SwipeDirection)
```
強制的に1枚スワイプしたいときはこのメソッドを呼んでください。
アニメーションもついています。

```
func undo()
```

一枚前のカードに戻れます。
こちらも戻るアニメーションがついています。

GitHub上にはSampleも置いているのでチェックしてみてください！

# 作ってみて
ライブラリを作るというと大層なことに聞こえますが、実際は普段作っている機能を独立して切り出すだけという感覚でした。
ただ、実際はどんな人でもどんな使い方をしても動作するようにというところにかなり時間をとられました。いわゆる疎結合というやつです。
とりあえず最低限の機能はできたかなという段階なので、反応があれば今後ユーザーの意見を取り入れてどんどん新機能を追加していきたいです。
最後になりますが、ぜひスターをポチッと押して頂けると幸いです。
https://github.com/HideakiTouhara/Poi
AWS Linux アパッチ　php7.1 mysql インストール

[AWS Linux　ユーザ追加](https://qiita.com/naka46/items/cb9ac3d581d6239a6d17)
[AWS Linux タイムゾーン変更](https://qiita.com/naka46/items/3b0f39052aa09e2b3173)
[Composerインストール](https://qiita.com/naka46/items/5bed3a6a52abc610d537)



# yum 更新
```
sudo yum -y update
```

# アパッチインストール
何があるか確認してインストールする。

```
yum list | grep httpd
yum install httpd
```

インスタンスが起動されたらアパッチも起動するようにする。

```
sudo chkconfig httpd on
sudo chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

# php7.1 インストール

```
yum list | grep php
sudo yum install php71 php71-mysqlnd php71-intl php71-mbstring
```

# mysql 5.7 インストール

```
yum list | grep mysql
sudo yum install mysql57 mysql57-server
```

インスタンスが起動されたらmysqlも起動するようにする。

```
sudo chkconfig mysqld on
sudo chkconfig --list mysqld
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

# git インストール
```
yum install git
```
conda install pytorch torchvision -c pytorch で  PackageNotFoundError: Dependencies missing in current osx-64 channels:    - pytorch -> mkl >=2018 と言われる

pytorch のインストールでエラーがでました😉

# 環境
OSX

# pytorch をインストール
インストールコマンドは[コチラ](http://pytorch.org/)から取得しました。

```
conda install pytorch torchvision -c pytorch 

PackageNotFoundError: Dependencies missing in current osx-64 channels: 
  - pytorch -> mkl >=2018
  - torchvision -> pytorch >=0.3 -> mkl >=2018
```

PackageNotFoundErrorがでました。mklがないとかなんとか😳

# conda update
update しました。

```
conda update conda 
```

色々インストールされました。

# pytorch を再度インストール

```
conda install pytorch torchvision -c pytorch 
```
今度はうまくいきました。

# pytorchが使えているか
チュートリアルから試しました。

```python
>>> import numpy as np
>>> import torch
>>> 
>>> np_tensor = np.zeros([1,2,3])
>>> np_tensor
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])
>>> np_tensor.shape
(1, 2, 3)
>>> torch.zeros(1,2,3)

(0 ,.,.) = 
  0  0  0
  0  0  0
[torch.FloatTensor of size 1x2x3]
```
などなど動くみたいです(☝ ՞ਊ ՞)

# 参考
- https://github.com/pytorch/pytorch/issues/4090
- https://mosko.tokyo/post/pytorch_tutorial/#%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB
FlutterでFontAwesomeを使う

普段Web開発でFontAwesomeにお世話になっているのですが、Flutterによるアプリ開発でもお世話になれそうです。

FlutterでFontAwesomeを使うには[font_awesome_flutter](https://pub.dartlang.org/packages/font_awesome_flutter)が使えます。

例えばgoogleのアイコンを出したいときは以下のように出せます。

```yaml:pubspec.yml
dependencies:
  flutter:
    sdk: flutter
  font_awesome_flutter: ^6.0.0
```

```dart
new RaisedButton.icon(
  icon: new Icon(FontAwesomeIcons.google),
  label: new Text('Sigin In Google'),
)
```

![flutter_button_icon.png](https://qiita-image-store.s3.amazonaws.com/0/11510/a1d65962-e8ab-aa26-b1a4-911174c8c1d3.png)

FontAwesomeのバージョンも5系なので最新です。[実装](https://github.com/brianegan/font_awesome_flutter/blob/master/lib/font_awesome_flutter.dart)を見てみるとかなり愚直なので使っていないものまで入ってしまいそうですが、とりあえずはこれでアイコンに困らなくなりました。

ちゃんとしたアプリを作るときはやはり使うものだけ利用する形にしたほうがいいと思いますが、まずはやってみるというときに使えそうなライブラリです。
Arduinoで温度湿度を計測してLCDで表示する

Arduino UNOを使って温度と湿度を計測できるようにするための配線メモ

#環境
- Arduino UNO
- [温度湿度センサー DHT11](https://www.amazon.co.jp/KKHMF-%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-%E6%B8%A9%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC-Arduino%E3%81%A8%E4%BA%92%E6%8F%9B-%E3%83%87%E3%83%A5%E3%83%9D%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A8%E4%BB%98%E5%B1%9E/dp/B010PZZPLS/ref=sr_1_4?ie=UTF8&qid=1521944351&sr=8-4&keywords=%E6%B8%A9%E5%BA%A6+%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC)
- [超小型ＬＣＤキャラクタディスプレイモジュール（１６×２行バックライト・オレンジ）](http://akizukidenshi.com/catalog/g/gP-01797/)

※秋月電子で温度湿度センサーを買う場合は[ここ](http://akizukidenshi.com/catalog/g/gM-09876/)

#レイアウト
配線が見づらいのでもうちょっと綺麗な図ができたら更新します。

![LCDディスプレイに温度湿度を表示させる_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/183992/5fc219e0-f6fe-2715-8304-edde1868c6a9.png)
![LCDディスプレイに温度湿度を表示させる_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/183992/2d9b1cf9-1daa-14a1-6ae3-388f58d58ec1.png)

###注意
上記LCDのレイアウト図だとGPIO配置が1,2,…15,16になっている。
しかし、実物のLCDのGPIO配置を見ると15,16,1,2…13,14になっている。
そのため、上記レイアウトのまま端から配線すると間違うので気をつけること。


#プログラム
```
#include <DHT.h>
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const int PIN_DHT = 8;
DHT dht(PIN_DHT,DHT11);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello");

  Serial.begin(9600);
  dht.begin();
  
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  // print the number of seconds since reset:
  //lcd.print(millis() / 1000);

  delay(3000);

  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  Serial.print("Humidity:  ");
  Serial.print(humidity);
  Serial.println("%\t");
  Serial.print("Temperature:  ");
  Serial.print(temperature);
  Serial.println(" *C");
  
  lcd.setCursor(0, 0);
  lcd.print("Situdo:" + String(humidity) + "%");
    
  lcd.setCursor(0, 1);
  lcd.print("Ondo  :" + String(temperature) + "*C");
  
}
```


#結果
シリアルモニタ側の表示

```
Humidity:  49.00%	
Temperature:  20.00 *C
Humidity:  50.00%	
Temperature:  20.00 *C
```

LCDディスプレイ側の表示
![IMG_E5782.JPG](https://qiita-image-store.s3.amazonaws.com/0/183992/76a7f611-55be-7a15-fcd9-252df430a209.jpeg)
golangのstrings.TrimLeftはイケてない

[ツイート](https://twitter.com/kyoh86/status/977739242913714176)したりもしたけど、やはり気になるのでつらつらとポエムる。

## strings.TrimLeftわかりづらくね？
golangの`strings.TrimLeft`(`Right`)と`strings.TrimPrefix`(`Suffix`)の関係が嫌い。

`TrimLeft`の方は概念的には`TrimLeft(s string, cutset set<rune>)`のはずなのに、`TrimLeft(s string, cutset string)`となってる。
結果、型としては`TrimLeft(string, string)`と`TrimPrefix(string, string)`は見分けがつかない。
`Prefix`の存在を知らないと`TrimLeft("abc-back", "abc-")`とか書かれてたときに想像する結果が二通りに分岐してしまう。 正解は`"k"`なわけだけど、`"back"`かな、と思っちゃう場合もある。というかgolangを2年触ってる僕だってそう思う。

すべての関数は型で中身が想像できるべきだ！なんて1ミリも思わないけど、こればっかりはわかりづらすぎないか？

## じゃあどうするか

golangには`set<T>`がない（と言うかジェネリクスないし）わけだけど、代わりに何使うか。
形式的には`map[T]struct{}`とか定番だけど、

```
strings.TrimLeft("abcback", map[rune]struct{}{
    'a':struct{}{},
    'b':struct{}{},
    'c':struct{}{}
})
```

悍ましくて書きたくない。

結局、`array`じゃね？ということで、`strings.TrimLeft(string, []rune)`としてほしい。
結局stringと似た何かなんだけど、配列はシーケンシャルであると同時に集合としてのニュアンスを（stringよりは）持つと思うんだよね。

## 2に期待

golang 2で`strings.TrimLeft(string, []rune)`への変更が為されないかと密かに期待している。
RFC書きたいけど、議論が紛糾しそうで、そんな場に英語で参戦する勇気が出ない。
bundle exec ruby で cannot load such file -- test/unit (LoadError) になる問題

# この記事について
sidekiqの調査中にはまった。sidekiq自体は関係無いがrubyの基本的な知識が少ないため、「test/unit 自体はrubyに同梱されてるんじゃないの？」とか想像しつつ何時間も費やしたのでメモで残す。

## 結論
* `Gemfile` に `gem 'test-unit'` を書く
* 参考→ https://github.com/rspec/rspec-rails/issues/1273

# 現象

```bash
$ bundle exec ruby test/test_example.rb
```

結果

```
test/test_example.rb:1:in `require': cannot load such file -- test/unit (LoadError)
	from test/test_example.rb:1:in `<main>'
```

対象のrubyソース

```test/test_example.rb
require 'test/unit'
require_relative '../lib/example/example'

class TestExample < Test::Unit::TestCase
  def test_greeting
    example = Example.new
    assert_equal 'Hello World', example.say
  end
end
```

Gemfile

```Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}"}

gem 'sidekiq', '5.1.1'
```

# 原因
`bundle exec ruby` 経由でrubyを実行すると、基本的には `bundle install` でインストールされたgemのみが参照可能になる。そのため、`require "test/unit"` に必要な `test-unit` がインストールされていない状態では参照不可能で `cannot load such file` になる。


## ハマった理由
* もともと RubyMine でプロジェクト構成を作る練習をしてたので切り分けに時間 :timer: かかった
* rbenv 使ってたり　bundler 使ってたり、 `bundle install --path vendor/bundle` でインストールしてたのでどこが原因か不明だった
* そもそも知識不足 :cry: 

# 対応方法
`Gemfile` に gem `'test-unit'` を書く

```Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}"}

gem 'sidekiq', '5.1.1'
# bundler 経由で実行するので test-unit も必要
# https://github.com/rspec/rspec-rails/issues/1273
gem 'test-unit'
```
XcodeとVisual Studio 2010のショートカットキー比較

|Xcode(Mac)|VS2010(Windows)|説明|
|:---|:---|:---|
|⌘R|F5|デバッグ開始|
|^⌘R|？|ビルドなしでデバッグ開始|
|⌘.|Shift + F5|デバッグ終了|
|⌘\\(⌘⌥¥) or 行番号Click|F9|ブレークポイントの設定/解除|
|F6|F10|ステップオーバー(メソッドに入らない)|
|F7|F11|ステップイン(メソッドに入る)|
|^I|Ctrl + K, Ctrl + F|インデントの調整(選択範囲)|
|⌘/|Ctrl + K, Ctrl + C|コメントアウト|
|⌘/|Ctrl + K, Ctrl + U|コメントイン|
|⌥⌘/|///|ドキュメンテーションコメントの挿入|
|^⌘↑ or ^⌘↓|-|ヘッダー/実装/テストの切替|
|^⌘← or 2本指で左にスワイプ|Ctrl + -|前に戻る|
|^⌘→ or 2本指で右にスワイプ|Ctrl + Shift + -|次に進む|
|^⌘J or ^⌘Click|F12|定義へ移動|
|^1, Callers|Shift + F12|変数やメソッドなどの呼び出し元を表示|
|^6|-|プロパティ・メソッド一覧を表示|
|⌘⇧F|-|グレップ|
|⌘⇧O|-|Open Quickly|
|⌘L|Ctrl + G|指定行へジャンプ|
|⌘T|-|タブの追加|
|⌘W|Ctrl + F4|タブを閉じる|
|^⇥|Ctrl + F6|右のタブへ移動|
|^⇧⇥|Ctrl + Shift + F6|左のタブへ移動|
|⌥Click|-|ドキュメントの表示|

`^6` や `⌘⇧O` はインクリメンタルサーチできます。

## 参考

- [VS2010でよく使うショートカットキー一覧 - Qiita](https://qiita.com/uhooi/items/0d048b6df094925d37ca)
AWS Linux タイムゾーン変更

AWS Linuxでログの時間とかが日本時間と違うのは、タイムゾーンが違う為。
開発とかログを確認する際に分かりずらいので、日本時間に変更する。

### 確認する
```
date
Sun Mar 25 01:58:04 UTC 2018

strings /etc/localtime
TZif2
TZif2
UTC0
```

UTCになっている。

### 変更する
```
cp /etc/localtime /etc/localtime.org
ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

念のためバックアップを取得してから行う。
これでdateをするとJSTになっている。
kerasでbackend その5

#概要
kerasでbackendで、fizzbuzz書いてみた。

#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
import tensorflow as tf

fizz = K.constant("Fizz", dtype = tf.string)
buzz = K.constant("Buzz", dtype = tf.string)
fizzbuzz = K.constant("FizzBuzz", dtype = tf.string)

def fn(x):
	return K.switch(tf.equal(tf.mod(x, 15), 0), fizzbuzz, K.switch(tf.equal(tf.mod(x, 5), 0), buzz, K.switch(tf.equal(tf.mod(x, 3), 0), fizz, tf.as_string(x))))

kvar = K.arange(1, 100, step = 1, dtype = 'int32')
map = K.map_fn(fn, kvar, name = None, dtype = tf.string)
print (K.eval(map))

```

以上。
僕が sublime text から vim に乗り換えるまで その1 ~最新Verのインストール~

業界に入ってからずっと sublime text ばかり使ってきたので、頭の体操がてら別のエディタに乗り換えたいと思っている今日この頃。
sublime text のショートカットに慣れすぎていることが、他のエディタへ乗り換える弊害になっている。。

手元にあるMacBookにはvimがプリインストールされているので、とりあえず最新Verを入れてみる

#### OS
```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.3
BuildVersion:	17D102
```
#### vim
```
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jul 26 2017 19:10:24)
```
#### 最新Verの確認
```
$ brew info vim
vim: stable 8.0.0771, HEAD
```

#### インストール
今回は不要。必要な人はこちらを参照
[MacにテキストエディタVimをインストール・更新する方法](https://hajipro.com/vim/mac-vim-install)
mac製品キーボードの特殊キーのマークと由来

ショートカットキーを調べる際に、macの特殊キーのマークを忘れて何度も調べたりしたので、マークの由来を調べてみました。一部断言できない部分もありますが、キーを覚える際の助けになれば幸いです。
## command ⌘
他のキーと一緒に押すことで様々なコマンドを送信できるキー。
もともとはアップルのロゴを使う予定だったが、締め切り前に、「ロゴ乱用しすぎじゃね？」
ってJobsが言い始めて急いで探したのがこれ。
北欧の史跡などを示す交通標識マークらしい。まじか。なんでそれにしたんだApple。。。
Saint John's Arms とか Saint Hannes Crossと呼ばれており、フィンランドでは魔除けとして壁にペイントしたりするらしい。

## option ⌥
WindowsのAltキーに近い働きをするキー（altって書いてあるしね）。
commandやshiftキーと同じく、同時に他のキーを押すことで様々な機能を発揮する。
スイッチで電流の流れる方向をかえる図　であるという説が有力。
## control ⌃
controlキーは昔からこのマークらしい。
そうですか。。
## shift ⇧
アルファベットの大文字や、キーボードに書かれている上側の記号を撃つ際に使用する。
ずらすイメージなので、その通り。
ちなみにもともとは、タイプライターの仕組みから作られたキーらしい。
そんな昔からあったのね。
RailsとReactでSNSオリジナルアプリケーションを作ってみた。

Rails１ヶ月 → Python歴９ヶ月 → ReactとRails3ヶ月というようにまたWebの世界に戻ってきました。

JSだけでネイティブアプリ、Webアプリ、デスクトップアプリが作れるのを知り惚れ込んで勉強してるのですが、アウトプットがなかったのでMiLMiLというオリジナルアプリを作ってみました。

とにかくSPAっぽいもの作ってみたかった・・・

期間は大体１ヶ月くらいです。全然バリデーションとかViewとか作り込めてないので(あんまり作り込む気はない)デプロイとかはしてないです。


## Top

トップページはこんな感じ。

![oriapp.gif](https://qiita-image-store.s3.amazonaws.com/0/179816/cd0e4f08-5e95-3057-b639-efba8d477166.gif)

## ホーム

<img width="1399" alt="oriapp2.png" src="https://qiita-image-store.s3.amazonaws.com/0/179816/746086f8-5552-6e69-4fb5-5082e1f4bfb2.png">

こんな感じでマウスオーバーするとユーザー情報が見ることができます。

<img width="470" alt="スクリーンショット 2018-03-25 9.55.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/179816/e644d9f7-1f54-a07c-7a6a-f33759f672e3.png">
<img width="341" alt="スクリーンショット 2018-03-25 9.55.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/179816/d949a298-1bcd-5c7e-a89a-75eee567638e.png">



## 投稿ページ

![oriapp3.gif](https://qiita-image-store.s3.amazonaws.com/0/179816/1d6df212-d01b-8715-8526-402f8d80f430.gif)

[Fabric.js](http://fabricjs.com/) を使うとCanvas内で自由に動かせることができるので採用しました。

これをスクリーンショットしようとするとcrossorigin問題が発生して、解決策を模索中・・・。ホーム画面のcanvasが真っ白なのはこれが理由です。

## マイページ

![oriapp4.gif](https://qiita-image-store.s3.amazonaws.com/0/179816/9df6b379-008e-b48c-b53c-b75def3ccd81.gif)

こんな感じでいいねやイマイチを付けてくれた人を男女別にグラフで出したり、年代別でグラフを出してくれます。


## MiLMiLは何ができるのか？

ざっくり説明すると・・・

アプリ内で自由にコーディネートを作成することができ、それをみんなに知ってもらい評価してもらう感じです。

こだわりとしてシンプルにしてみたのですが、シンプルすぎて寂しい感じになってしまいました。


##　環境

バックエンド ・・・ Ruby on Rails
フロントエンド ・・・ React(Reduxなし)
デザイン ・・・ CSS, MaterialUI
データベース ・・・ MySQL

　バックエンドの言語はなんでも良かったのですが、 ちょっと使ってみたことがあるRailsを採用しました。とにかくReactを使ってシングルページアプリケーションを開発してみたかったので。

実際シングルページアプリケーションっぽいものを作った感想は、Reactに慣れてないのもあると思いますがものすごく大変でした。Rails+jQueryだけで完結するアプリの方がスピーディーに作れるでしょう。

## スケジュール

1月~2月 React,Javascriptの勉強
３月 実装！！

とりあえず実装！！っていう感じで進めてて設計とかなんも考えてませんでしたw

JSを何も知らなかったのにReactから入ったのは失敗だったかなと感じてます。

Reactだけで開発するのであればコンポーネントの設計は欠かせないなと感じました。あとで修正するときにものすごく大変です。こんな時にReduxの出番!!

## オリジナルアプリを開発中に感じたこと

### このアプリ微妙じゃね！？

作ってるとこれはなんのために作ってるの!？というつまらない感覚が出てきます。最初にこのアプリはどんな問題を解決するのかということを明確にした方が持続しやすいと思います。(練習なら大丈夫です！)

### デザインセンスが壊滅的

sketchでモックアップを作ってみたのですが、その時点で壊滅的でした。ノンデザイナーなのにBootstrapを使ってないのは致命的です。

`デザイナーは偉大です！！`
yarn global addしたパッケージにパスを通して使えるようにする

`yarn global add`でcreate-react-native-appを追加したあとで、

```bash
create-react-native-app Myapp
```

みたいにしても`unknown command`と言われて悲しかった。
（globalちゃうんかい😫）

まずは、
[yarn global addしたパッケージのパスを通す](https://qiita.com/t-hiroyoshi/items/49c03456e991594c3dc0)
を参考に、

```bash
set PATH $PATH (yarn global bin)
```

を`config.fish`に追記したけどだめだった。

確認したらパッケージのインストールは成功していたので、
ここにパスを通せば良さそう。

以下を`config.fish`に追記。

```bash
set -x PATH $PATH $HOME/.config/yarn/global/node_modules/.bin
```

config.fishを再読込み。

```bash
. ~/.config/fish/config.fish
```

これでうまくいきましたヽ(=´▽`=)ﾉ
〜変数の中身を確認〜　binding.pryでデバッグする（初心者の方向け）

以前、pメソッドを利用したデバッグ方法を書いたところ、友人にそこそこウケましたので、次はbinding.pryについて書いていきます。

ちなみにpメソッドの記事はこちら
〜変数に入っている要素を確認〜　pメソッドでデバッグする（初心者の方向け）
https://qiita.com/tomoharutsutsumi/items/925362d6963ebb318305

正直やり方が違うだけで、基本的なところではpメソッドもbinding.pryもデバッグの考え方は似ています。

#binding.pryでできること
binding.pryとコードの中に打つことで、一度プログラム処理が止まり、その時点におけるコードの状態をみることができるというものです。
コードの状態というのは、たとえば、「この時点ではこの変数にはこの値が入っているはずだ！」みたいなことです。
自分ではそう思っていても、いざ動かしてみたら望んだ動きをしません。binding.pryを使ってみたら、値が違うじゃん！みたいになってここが問題だったのか！と気づく。。。。
こんな形でデバッグが可能です。
まあ、文字を書くよりもやってみましょう。


#binding.pryを使うための準備
まず、binding.pryは最初からruby on railsで用意されているものではないので、gemでインストールする必要があります。

```
#ターミナル
gem install pry-byebug
```
こちらをターミナルに書き、インストールしましょう。

#実際のデバッグのやり方

まず下のようなコードがあったとします。

```example_controller.rb
def index 
 number = params[:number]

 if number >= 30
  puts "30より大きい"
 else if number <= 10
  puts "10より小さい"
 end

end
 
```
コーディングしている最中に、numberの中身を確認したいとなったとします。
例えば、３０より大きい数が飛んで来ていると思っているが、"１０より小さい"が表示されてしまっているといったときです。。。
そういうときにbinding.pryを入れます。

```example_controller.rb
def index 
 number = params[:number]
binding.pry

 if number >= 30
  puts "30より大きい"
 else if number <= 10
  puts "10より小さい"
 end

end
 
```
確認したい変数の直後に入れるようにします。
今回はnumberです。
binding.pryを追加しましたら、そのコードが書かれている部分をサービス側で実際に動かしてみます。処理が止まるはずです。
そして、ターミナルのrails サーバーに移動します。

```
#ターミナル
   1:def index 
   2: number = params[:number]
   3: binding.pry

=> 4: if number >= 30
   5:  puts "30より大きい"
   6: else if number <= 10
   7:  puts "10より小さい"
   8: end
   9:end

[1] pry(#<ExampleController>)> number
=> 5
```
処理が止まり、下にpryが出て来ます。
ここに自分が調べたい変数をかくと、その中身が表示されます。
5が飛んで来ているので、パラメータの飛ばし方を変えなきゃ。。。となります。

ちなみに、numberのところにexitと書けば、サーバーは元に戻ります。

```
#ターミナル
[2] pry(#<ExampleController>)> exit
```
ちなみに、htmlに書く場合は、<%~%>で囲みます。

```erb:example.html.erb
<% form_tag(books_search_path, method: "get") do %>
<% binding.pry %>
 <%= text_field_tag :title , params[:title] %>
<% end %>
```

実は、まだまだbinding.pryは技があるのですが、勉強中の身ですので、これから勉強していきます。。。。


##個人開発をされている方へ

Moverというプロダクトを開発しています。登録していただくと、開発したプロダクトのテスト利用を依頼し、フィードバックをもらうことができます。自分のプロダクトを公開して個人開発を加速させましょう！！　現在僕のアカウントも登録されているので、そちらにテスト利用依頼をいただければ実際に使ってみた感想などをお送りさせて頂きます。(アドバイスなどではなく、一人のユーザーとしての感想となります。)　もちろん無料です。
https://mover-web.herokuapp.com/



![Screen Shot 2020-05-19 at 4.36.42 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147990/40822905-5a9d-6323-4318-bb475c68e887.gif)
Windows Subsystems for Linux上のDebianでJupyter使うところまで

Windows Subsystem for LinuxはWindows上でLinuxバイナリの動作を可能とする互換レイヤーである。いままでは[VirtualBox](https://qiita.com/ueno-t/items/20b431b9fdc4b2a48f9a)使っていろいろやっていたのだけど、WSLを導入したところたいへん良い感じであった。ので、簡単な導入メモを残しておく。

[dotfiles](https://github.com/ueno-t/.dotfiles.git)

## インストール
Microssoft store からインストール。ダウンロードサイズは75M（Ubuntuだと195M）。
![2018-03-18 (1).png](https://qiita-image-store.s3.amazonaws.com/0/43992/102cf55a-8538-a4ac-0b09-b591f16d9d62.png)

## 環境設定
ログインシェルをzshにする。Creators Update からはシェル変更できるようになっている。

```sh
chsh -s /bin/zsh [user]
```

タイムゾーン設定

```sh
sudo echo Asia/Tokyo > /etc/timezone
sudo dpkg-reconfigure --frontend noninteractive tzdata
```

日本語ロケールに変更

```sh
sudo echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
sudo locale-gen
sudo update-locale LANG=ja_JP.UTF-8
```

## jupyter
導入

```sh
sudo apt install python3-pip
sudo pip3 install --upgrade pip
sudo pip3 install jupyter
```

設定ファイル作成。

```sh
jupyter notebook --generate-config
```

c.NotebookApp.notebook_dir で起動ディレクトリを指定する。
ホームディレクトリ指定（~）が効かないので注意。

起動

```sh
jupyter notebook
```

描画系（pandas, numpy, scipy）

```sh
sudo pip3 install matplotlib
sudo pip3 install seabone
```

Meacb

```sh
sudo apt install mecab libmecab-dev mecab-ipadic-utf8
sudo pip3 install mecab-python3
```
Play Framework勉強めも　データベースについて②Read

（参考）勉強してる書籍
https://www.amazon.co.jp/Play-Framework-2%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Java%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E9%96%8B%E7%99%BA-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798133922/ref=cm_cr_srp_d_product_top?ie=UTF8

#検索方法について
プレイフレームワークでは、検索の機能をModel.Finderというクラスにまとめている。
基本的な使用方法は、Model内にインスタンスを生成して、必要に応じて取り出す。

#Finderクラスについて

##Finderインスタンスの設定方法

```java
new Finder<プライマリキー,エンティティ>（プライマリキー.class,エンティティ.class）;
```
これで作成したインスタンスを、staticフィールドに保管し、必要に応じてそのメソッドでエンティティを取り出す。

##toStringクラスの設定方法

```java
	public String toString() {
		return ("[id:"+id+",name:"+name+",mail:"+mail+",message:"+message+",date:"+postdate+"]");
	}
```
オブジェクトクラスのtoStringメソッドを分かり易い用に、オーバーライド
(オブジェクトクラスについて参考)https://docs.oracle.com/javase/jp/7/api/java/lang/Object.html

##Modelクラス全体
```java
package models;

import java.util.Date;

import javax.persistence.*;
import javax.validation.*;

import play.data.validation.*;
import play.db.ebean.*;

@Entity
public class Message extends Model {

	@Id
	public Long id;
	public String name;
	public String mail;
	public String message;
	public Date postdate;

	public static Finder<Long,Message>find = new Finder<Long,Message>(Long.class,Massage.class);

	@Override
	public String toString() {
		return ("[id:"+id+",name:"+name+",mail:"+mail+",message:"+message+",date:"+postdate+"]");
	}

}
```
#Controllerクラスについて
コントローラクラスから、エンティティを取り出せるように設定を記述する。

##記載方法
```java
List<エンティティ>変数＝Finderインスタンス.all();
```
Javaのリスト（List）とは、重複した要素を含むことができる順序の付けられたコレクション
(参考Listとは)https://eng-entrance.com/java-array-list#List

###Applicationクラスに追加する項目
```java
List<Message>datas=Message.find.all();
```
findインスタンスのallメソッドを呼び出している。
allメソッドは、保管されていいる全てのメソッドをListに返す。

##Applicationクラス全体

```java
package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {
    //ルートにアクセスした際のAction
    public static Result index(){
      List<Message>datas=Message.find.all();
      return ok(index.render("データベースのサンプル"));
    }
}
```

#index.scala.htmlについて
受け取ったリストをそのまま出力出来るように変更する。


##index.scala.html全体
```
@(msg:String,datas:List[Message])

@main("Sample page") {
  <h1>Hello!</h1>
  <p>@msg</p>
  <pre>@datas</pre>
}
```
CentOS ログ設定

logwatchをインストール。1日1回メールでログを送ってくれるらしい。

```
$ yum install logwatch
```

どんな風に出力されるのか確認

```
$ sudo /usr/sbin/logwatch --output stdout
```

設定ファイル`/etc/logwatch/conf/logwatch.conf `に自分のメールアドレスを設定。

```
MailTo = hoge@example.com
```
AWS Linux　ユーザ追加

### rootユーザに切り替える
```
sudo -i
```

### ユーザを作成する
```
useradd cakephp3
```

### パスワードを設定する
```
passwd cakephp3
```
パスワードの次はパスワードを設定するユーザを入力する
New passwordとRetype passwordがきかれるので、パスワードを入力する。

### sudo設定を行う
sudoができるように/etc/sudoersファイルを変更する。

```
sudo visudo
```

既にrootの記述があるのでその下に追加する。

```
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
cakephp3    ALL=(ALL)       ALL
```

### sshでログインするために鍵を作成する
```
sudo su - cakephp3
mkdir .ssh
ssh-keygen -t rsa
cd .ssh/
mv id_rsa.pub authorized_keys
chmod 600 authorized_keys
cd ../
chmod 700 .ssh
```

「ssh-keygen」ではEnter passphraseをきかれるので、設定する場合は何か入力する。
設定不要な場合はenterを押す。

秘密鍵をローカルPCに保持しておく必要があるので、下記コマンドで表示される秘密鍵を保存する。

```
cat .ssh/id_rsa
```

### 接続確認
接続できればOK

接続できない場合は、authorized_keysの権限など確認する。
またsshのログは下記で確認する。

```
tail -f cat /var/log/secure
```
ライブラリに頼らず一から Python 3 で SHA2 を実装する

# 概要

[pysha2](https://github.com/thomdixon/pysha2) という pure Python な SHA-2 ライブラリがあるのだが、これが Python 2 用だったので、Python 3 で動くようにして、Github 上で公開した。

[pysha2 の Python 3 版](https://github.com/elm200/pysha2)

# SHA256 のコアな処理

分かりづらい命名だが、SHA256 は SHA2 の一部の規格である。

[SHA-2 - Wikipedia](https://ja.wikipedia.org/wiki/SHA-2)

上記のコードのうち、SHA256 の核心的な部分を記す。

```python
    def _rotr(self, x, y):
        return ((x >> y) | (x << (32-y))) & 0xFFFFFFFF

    def _sha256_process(self, c):
        w = [0]*64
        w[0:16] = struct.unpack('!16L', c)

        for i in range(16, 64):
            s0 = self._rotr(w[i-15], 7) ^ self._rotr(w[i-15], 18) ^ (w[i-15] >> 3)
            s1 = self._rotr(w[i-2], 17) ^ self._rotr(w[i-2], 19) ^ (w[i-2] >> 10)
            w[i] = (w[i-16] + s0 + w[i-7] + s1) & 0xFFFFFFFF

        a,b,c,d,e,f,g,h = self._h

        for i in range(64):
            s0 = self._rotr(a, 2) ^ self._rotr(a, 13) ^ self._rotr(a, 22)
            maj = (a & b) ^ (a & c) ^ (b & c)
            t2 = s0 + maj
            s1 = self._rotr(e, 6) ^ self._rotr(e, 11) ^ self._rotr(e, 25)
            ch = (e & f) ^ ((~e) & g)
            t1 = h + s1 + ch + self._k[i] + w[i]

            h = g
            g = f
            f = e
            e = (d + t1) & 0xFFFFFFFF
            d = c
            c = b
            b = a
            a = (t1 + t2) & 0xFFFFFFFF

        self._h = [(x+y) & 0xFFFFFFFF for x,y in zip(self._h, [a,b,c,d,e,f,g,h])]
```

`self._k` は64個の4バイトの数字の定数表。
`self._h` は8個の4バイトの数字が格納されるワーキングエリアで、ある定数の初期値が設定されている。

要するに、ローテート・シフト・AND・XOR・NOT等の典型的な論理演算を、最初から設定されている定数とダイジェストしたいメッセージに対して行って、`self._h` という32バイトのワーキングエリアを更新していき、最後に `self._h` をハッシュ値として出力している。SHA256 の名前のとおり、このハッシュ値は 32バイト * 8 = 256ビットになる。

想像より単純な実装という印象である。これが現代の情報セキュリティの基礎になっているのかと思うと感慨深い。

## 参考
[Federal Information Processing Standards Publication 180-2](https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf)
ラズパイ3にGitLabサーバー構築(基礎部分のみ)

ラズパイ3でGitLabサーバー建てるなんて需要がないと思うけど、勉強がてら躓いた部分などをメモ。
誰かのお役に立てたのならとてもうれしいです。

## 必要なパッケージをインストール
Raspbianインストール直後のまっさらな状態から構築しました。
ですので無駄なパッケージ類などは入っていません。

必要パッケージのインストールは、[公式サイト](https://about.gitlab.com/installation/#raspberry-pi-2)に載っていますが、１つ変更コマンドがあります。

```
sudo apt-get install curl openssh-server ca-certificates apt-transport-https 
sudo curl https://packages.gitlab.com/gpg.key | sudo apt-key add -
sudo curl -o /etc/apt/sources.list.d/gitlab_ce.list "https://packages.gitlab.com/install/repositories/gitlab/raspberry-pi2/config_file.list?os=debian&dist=jessie" && sudo apt-get update
sudo apt install -y gitlab-ce
sudo gitlab-ctl reconfigure
```

多分ですが、1行目のインストールではすでに最新パッケージが導入済み、と言ったメッセージがでてくるかもしれません。
また、postfixはメールを使用する際に必要なパッケージですが、取り敢えず動かすだけなので今回は省略します。
また、3行目に書いてある

```
sudo curl -o /etc/apt/sources.list.d/gitlab_ce.list "https://packages.gitlab.com/install/repositories/gitlab/raspberry-pi2/config_file.list?os=debian&dist=jessie" && sudo apt-get update
```

を叩かないと、`sudo apt install -y gitlab-ce`が出来ませんでした。
公式のCurlコマンドは叩かなくて大丈夫なはずです。[^1]
[^1]: 4/3(火)内容を若干更新しました。
インストールが終わり、コマンド入力状態になりましたら
5行目の`sudo gitlab-ctl reconfigure`
を実行し、GitLabの再設定と再起動をさせます。これをしないと変更などが反映されません。

## 動作検証
GitLabの再起動が終わりましたら、ラズパイのIPアドレスをブラウザで入力し、パスワード変更の画面が出れば完了です。

![gitlab.png](https://qiita-image-store.s3.amazonaws.com/0/230050/8dd416ab-3787-8cf0-5a19-b2c93880f22d.png)

変更後、ユーザー名:root パスワード:先ほど変更したもの　でログインできます。

またGitLabの設定ファイルは`/etc/gitlab/gitlab.rb`にあります。
メール設定などもここで行います。

おつかれさまでした。誤字、誤表記などありましたら指摘の程お願いいたします。
Androidアプリのリリース手順

こんにちは。m_saekiです。

Androidアプリのリリース手順をまとめついでに投稿します。

##1.Google Play デベロッパーへ登録
[googleアカウントでのログイン](https://play.google.com/apps/publish/signup/)
↓
デベロッパー契約に同意
↓
登録料の支払い
↓
アカウントの詳細の入力
>
1.デベロッパー名 : google playでアプリの下に出ている文字
2.電話番号 : +81-***-****-****(国番号が必須→日本は81)

##2.release apk 作成

AndroidStudio(3.0.0) ➡︎ Build ➡︎ Generate Signed APK
>
key store path : 作成したファイルを格納するパス
Alias : 署名キーに付ける名前
Validity(years) : 署名の有効期間　25年以上が推奨
First and Last Name : 開発者の名前（姓と名）
Organization Unit : 部署名
Organization：組織名 : 会社名
City or locality : 所在地
State or Province : 都道府県
Country Code(XX) : JP（日本コード）


app-release.apk
> release.apkファイルを保存しておく

**注意点**
作成したjksファイルを必ず保管しておくこと
なくしたらPlaySotreでアプリをUpdateできなくなる

##3.Google Play デベロッパーからアプリをリリース
必須項目を記入していきアプリを公開する(この辺かなり割愛しています)

**注意点**
イメージ画像も必須になるので頑張って作成しましょう。

##参考URL
http://ascii.jp/elem/000/000/561/561345/index-3.html
http://qiita.com/konifar/items/6c6b73deae9085a69666
https://support.google.com/googleplay/android-developer/answer/1078870?hl=ja