OmniAICreator/Qiita-1.07M huggingface dataset:
Hinton教授のDeep Belief Networkの論文を理解したい part1_abstract

---
# Deep Learningブームの元となったアルゴリズムを理解したい
ここ数年話題に上がらない日がないDeep Learningについて、
ここでは、第三次深層学習ブームを引き起こしたHinton教授のDeep Belief Networkの研究（RBM及び貪欲法の考え方をもとにした方法により、DBNの学習性能を向上させた）について
論文「A fast learning algorithm for deep belief nets(2006)」
https://www.cs.toronto.edu/~hinton/absps/fastnc.pdf
を読み進めてみたいと思います:relaxed:

正直DBNについての知識は全くがないのですが、
とりあえず概要でも良いので、どのようなことが書かれているか
理解出来たらいいなあと思っております:star2:

とりあえずわからない単語が出てきたらその都度調べる方向で…
もうたぶんわからないことばかりで、ダメダメなので、
もしご指摘等ありましたらぜひお寄せください:sweat_drops:

# Abstract
とりあえず翻訳してみまーす。本当にわからないんで、一文目から。
【原文1】
*We show how to use “complementary priors” to eliminate the explaining away effects that make inference difficult in densely-connected belief nets that have many hidden layers.*
【翻訳1】
正直全く意味がわからないのでGoogle翻訳しまーす。

*隠れ層が多い"densely-connected belief nets"において、推論を困難にする解説効果を排除するために、"complementary priors"を使用する方法を示します。*

ちょっと意味が分かりません…:relaxed::sweat_drops:
とりあえず次も見てみます。

【原文2】
*Using complementary priors, we derive a fast, greedy algorithm that can learn deep, directed belief networks one layer at a time, provided the top two layers　form an undirected associative memory.*
【翻訳2】
*我々は"complementary priors"を用いて、高速貪欲アルゴリズムを導出する。
このアルゴリズムにより、上位2層が"an undirected associative memory"を形成するような"deep, directed belief networks"を学習することができる。*

【原文3】
*The fast, greedy algorithm is used to initialize a slower learning procedure that fine-tunes the weights using a contrastive version of the wake-sleep algorithm.*
【翻訳3】
*高速貪欲アルゴリズムは、"wake-sleep algorithm"とは対照的な方法により、重みを微調整するためのより遅い学習方法を初期化するために使用される。*

【原文4】
*After fine-tuning, a network with three hidden layers forms a very good generative model of the joint distribution of handwritten digit images and their labels.*
【翻訳4】
*微調整後、3つの隠れ層をもつネットワークは、手書き数字認識及びそのラベルとの"joint distrubution"の非常に良いモデルを生成する。*

【原文5】
*This generative model gives better digit classification than the best discriminative learning algorithms.*
【翻訳5】
*この生成モデルにより、(既存の)最良の識別学習アルゴリズムよりも優れた数字の分類が行える。*

【原文6】
*The low-dimensional manifolds on which the digits lie are modelled by
long ravines in the free-energy landscape of the top-level associative memory and it is easy to explore these ravines by using the directed connections to display what the associative memory has in mind.*
【翻訳6】意味わからないのでとりあえずGoogle翻訳をもとにしています。
*それぞれの数字が存在する低次元の多様体は、"top-level associative memory"の"free-energy landscape"における"long ravines"（「長い峡谷」？）でモデル化され、"associative memory"が念頭に置いているものを示すために"directed connections"を用いてこれらのravines"（「峡谷」？）を探索することは簡単である。*
↑ちょっと意味がわかりません！

# Abstractまとめ
とにかく、何を言っているのか全くわからないことがわかりました…。
とりあえずわかったことと言えば、
・この論文では、高速貪欲アルゴリズムという手法が提案されている。
・提案された手法には、"complementary priors"という考え方が使われている。
・提案された手法は、上位2層が"an undirected associative memory"を形成するような"deep, directed belief networks"に対して有効である。（これらの英単語が何を意味するのかは不明）
・提案された手法を使うと、手書き数字の認識（MNISTのことか？）において、既存手法よりも良い認識性能が得られる。

理解できていないワードがたくさんあるのですが、とりあえず本文中に4～5回出てきたら、調べてみようと思います。
とりあえず理解度はものすごく低いのですが、次回Introductionから先も目を通してみたいと思います。
車輪の再発明を否定しないでほしい

技術系の議論をしていて、「それ、車輪の再発明じゃんｗ」みたいに言われたのが、めっちゃ腑に落ちなかったので、思いの丈を書いてみます。

### システムを作るときに一番重要だと思うもの
---

僕がシステムを作るときに一番重要だと思うのは、

* 正しく動作すること!!

です。

言い換えれば、

* ダウンせずに動いて、求められている機能が求められている時間内で実行出来ること

です。
（ずっとダウンしないとか無理なのは承知で言ってます。）

それを実現するためには、「すべてのシステム動作が理解できている」かつ、「対象のソースコードを変更可能」であることが重要だと思います。

それが出来れば、すべてを掌握できるので、何かあってもすぐに直せるし、正体不明のバグに苦しむこともないです。

究極を言えば、CPUとかOSも作成して完全無欠に理解したいです。

ですが、現状ではGoogleとかAppleとかのトップ企業くらいしかそんなこと出来そうに無いです。

なので、開発に時間が掛かり過ぎるようなものを再発明はしないほうが良いとは思います。

しかし、そこまで時間が掛からずに作成できるものは作成しても良いのでは？という話です。

### 再発明のメリット
---

下記のメリットがあります。

* 自分達のシステムに合わせたシンプルで高速な車輪が使えるようになる
* 自分のチームで作成したものなので、何かあっても直せる
* 自分のチームで作成したので、仕組みを理解できている
* 対象のOSSは突然終了したりするかもしれないが、自分のシステムは続けられる限り終わらない

### 自分のシステムに合わせたシンプルで高速な車輪が使えるようになる
---

[「悪い方が良い」原則と僕の体験談](https://note.mu/ruiu/n/n9948f0cc3ed3)

こちらの記事が参考になると思うのですが、ruiさんが高速なリンカを開発したときの話です。

本来であれば、既にリンカが存在していたので、完璧に車輪の再発明です。再発明の否定派からマサカリの嵐なはずです。

ですが、「ビルドが速くなったありがとう」と大絶賛です。すごいです。

この例だと、既存の車輪が、自分らが求める要求仕様を満たしていなかったので、あってないようなものだったのかもしれません。

また、高速動作を求めるとシンプルさが絶対条件になってきます。

NVIDIAという会社は、機械学習用のチップと、グラフィック用のチップで設計を変えて出しています。

速さを求めると、どうしても用途を限定して特化させる必要があり、なんでも出来るというのは特化型には勝てないということだと思います。

### 自分のチームで作成したものなので、何かあっても直せる
---

これはシステムの安定動作に重要な話だと思います。

Linuxなど開発が活発なOSSは何か合ってもパッチを作成してくれると思います。

しかし、何年も前に開発が止まってしまったようなものを使っていると、自分らではコミット権限が無く直せなかったりします。

ちゃんとコードの内容を隅々まで理解して、ホワイトボックス的に使っているというのなら、自分のところに持ってきて直して使うというのは可能だと思います。

しかし、そうやってOSS使っている人は少数だとおもいます。

### 自分のチームで作成したので、仕組みを理解できている
---

上の話とも被りますが、仕組みを隅々まで理解していないと、安定動作が危うくなるので、必要だと思います。

「ORM使っていたら、クエリめちゃくちゃ投げていて処理に時間が掛かっていた」とか、現場でもありました。

余談ですが、↑を防ぐためにDB側のクエリログが意図したものか？コーディング中に確認することが必要だと思います。

### 対象のOSSは突然終了したりするかもしれないが、自分のシステムは続けられる限り終わらない
---

[NPMとleft-pad : 私たちはプログラミングのやり方を忘れてしまったのか？](https://postd.cc/npm-and-left-pad/)

こちらの記事に書いてありますが、昔、npmモジュールでleft-padモジュールが削除され、それを使用していた多くのモジュールがnpm installできないという事件がおきました。

「車輪の再発明」を嫌がった結果なのかどうかは分からないですが、依存モジュールがあるとこういうことも起き得るという事例だと思います。

自分らで開発していれば、消さない限り消えないのに、誰かがNPM消しただけでシステムがビルド出来なくなるなんて駄目だと思います。
（自社でNPMサーバ建てれば良いとか、プロジェクトにコミットしちゃうとか、打ち手はあると思いますが。。）

### まとめ
---

とはいえ、全部開発していたら時間が無くなってしまうので、既存のものを使う必要はあると思います。

ただ何も考えずに、車輪の再発明を否定するのではなく、色々と熟考した結果、今回はしないとか、今回はするとか決めてほしいですm(_ _)m
mysql5.7でrootのパスワードを空で設定したときの対処法

# 背景
vagrantにmysqlをインストールしたのですが、rootのパスワードを空でインストールしてしまいました。

`mysql -uroot -p`
すると上記コマンドを打って、求められたパスワードを空にして実行しても

```shell

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```
ぐぬぬ…。

# 環境
mysql:5.7.22
ubuntu:16.04.4

# 対処法①
パスワードを再設定する
>auth_socket pluginは、MySQLクライアントを実行したlinuxユーザーを、MySQLのユーザーとして認証しようとするらしい

ので`sudo mysql`で入れる

そこでmysqlに入った状態で下記を実施

```shell

mysql> use mysql
mysql> update user set authentication_string=PASSWORD("ここにパスワードを記述") where User='root';
mysql> flush privileges;
```

※ 以前はpasswordというカラムだったが5.7以降はauthentication_stringというカラム名になっている

# 対処法②
再インストールする

ただし単にアンインストール→インストールしても状況は変わりません。

なぜか。
パスワードが格納されているDBが残っているからです。
ので、削除して問題なければ消しちゃいましょう。
`sudo rm -rf /var/lib/mysql/`
消してインストールし直せばOKです


# 参考
Ubuntu16.04にaptでMySQL5.7を入れる時にrootを空パスワードにするとどうなるか
https://qiita.com/mwatanabe@github/items/7e9a40d31bc27ab9d901

MySQL 5.7.6でroot用パスワードが変わらなくて困った話
https://qiita.com/gatchan0807/items/7323a5d2dd365308cb94
Learning Spatio-Temporal Features with 3D Residual Networks for Action Recognitionを読んだ

Hara, Kensho, Hirokatsu Kataoka, and Yutaka Satoh. "Learning spatio-temporal features with 3D residual networks for action recognition." Proceedings of the ICCV Workshop on Action, Gesture, and Emotion Recognition. Vol. 2. No. 3. 2017.

- [arXive](https://arxiv.org/abs/1708.07632)

# 1.どんなもの？
ResNetsを拡張して3DCNNに適用
ActivityNetおよびKineticsデータセットを3D ResNetsで評価
Kineticsで訓練された3D ResNetsは、C3Dなどの比較的浅いネットワークより優れた結果が得られた

# 2.先行研究と比べてどこがすごいの？
動画像認識のアプローチには2DCNNを用いたtwo-streamやC3Dがある
3DCNNは、2DCNNのアーキテクチャに比べて比較的浅いが2DCNNの手法と互角である
ResNetsを3DCNNに適用することで，3DCNNより深く収束時の損失も小さくなることが期待できる(I3Dのinceptionよりもいい結果が期待できる)

# 3.技術や手法のキモはどこにあるか？
## 入力データ
50%の確率で画像が反転
ランダムに選択したところの16フレーム
画像を角4つと中心から選んでクロップして3×16×112×112の形にする
## 3DResNets
ResNetの18層版と34層版で実装
畳み込みカーネル:3x3x3
各畳み込み層の後にバッチ正規化とReLU
※第一層はC3D同様，時間情報を潰さないように時間方向のストライドサイズは1
最適化手法:SGD
学習率:0.1 収束したら1/10にする

![スクリーンショット 2018-04-28 19.50.32.png](https://qiita-image-store.s3.amazonaws.com/0/249838/f9e466cf-6de0-1ec5-0115-0b11fd832a23.png)
# 4.どうやって有効だと検証した？
ActivityNetとKineticsデータセットを使用
ActivitityNetはResNet18層版で実装→C3Dの方がいい結果![スクリーンショット 2018-04-28 21.15.03.png](https://qiita-image-store.s3.amazonaws.com/0/249838/335cacd4-e53b-beff-1052-616e0f53f54e.png)
KineticsデータセットではResNet34層で実装→ResNet版がいい結果
![スクリーンショット 2018-04-28 21.16.10.png](https://qiita-image-store.s3.amazonaws.com/0/249838/1f810e9c-2ffd-f3cc-7de7-35fc9820c6ab.png)

C3Dが浅すぎることを示している．3DResNetsはKineticsデータセットを使用するときに適している．
![スクリーンショット 2018-04-28 21.21.37.png](https://qiita-image-store.s3.amazonaws.com/0/249838/27010e89-f13e-b68a-df23-093e47ad354d.png)

# 5.議論はあるか？
RGB-I3Dがいい結果を出しているが，GPUのメモリの問題のため，3×16×112×112であるのに対して、RGB-I3Dのサイズは3×64×224×224である．高空間分解能および時間的長さが高いため、認識精度が向上すると考えられる．

# 6.次に読むべき論文はあるか？
CentOS6系にSupervisor3系をインストールするには

# 何故記事を書いたのか？

CentOS6.9の環境にLaravel5.4をインストールして、キューを使いたいという状況だった。
（Laravelのドキュメントには、キューを使うときは、Supervisorでデーモン化しましょうみたいなことが書いてある）

しかし、この手順はSupervisor3系を前提にされている様子。
とあるサイトで見つけた内容を鵜呑みにすれば、Supervisor2系には[include]設定（/etc/supervisor/conf.d/に各ジョブのconfファイル置く使い方）ができないとか。

ということで、yumでSupervisorをインストールすると2系が入ってしまうので、3系をインストールする手順をログする。

# インストール手順

## python-pipのインストール

Supervisorはpythonのパッケージになっているということで、yumではなくpython-pipでもインストールできる。

```
yum -y install python-pip
```

## Supervisorのインストール

```
pip install supervisor
```
インストールをログを見ていてもわかるが、投稿時点では3.3.4がインストールされた。

```
# supervisord -v
3.3.4
```

依存するライブラリが最新だと、エラーになる場合があるとのことで、参考にしたサイトに従って下記のパッケージをダウングレード。

```
pip install meld3==1.0.0
```

## 設定ファイルを/etcに作成

yumでインストールすると作成される設定ファイルは、pipでのインストールでは作成されない。
→下記コマンドで作成される。

```
echo_supervisord_conf > /etc/supervisord.conf
```

## /etc/supervisor/conf.d/の下のconfファイルを読み込む設定
/etc/supervisord.confでコメントアウトされている[include]を次のように書き換える。

```
[include]
files = /etc/supervisor/conf.d/*.conf
```

ここでよくわからないのは、Laravelのドキュメントでは「*.confが普通だよ」と言っているが、コメントアウトされていた文言は、「*.ini」だった。
私はconf派なのでconfにしたが、世の中的にはini派が多そう。

## Supervisorで管理したいプロセスの設定
一応、プロセスの設定についても記載。
上記のパスで読み込むからということで、/etc/supervisor/conf.d/xxxx.confのようなファイルを次の内容で作成する。（日本語文字列を書き換える）

```
[program:ワーカー名]
process_name=%(program_name)s_%(process_num)02d
command=実行したいコマンドなど
autostart=true
autorestart=true
user=実行したいユーザ
numprocs=プロセスの数（上記のコマンドを複数起動ができる）
redirect_stderr=true
stdout_logfile=フルパスで出力するログファイルを指定
```


## serviceコマンドで使えるように/etc/init.dのスクリプトを作成する
githubでスクリプトを公開されている方がいらっしゃるので、使わせてもらう。

```
curl -o /etc/rc.d/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec
chmod 755 /etc/rc.d/init.d/supervisord
chkconfig --add supervisord
```



# 動作確認

## 起動
次のコマンドで起動。

```
service supervisord start
```

## 停止
なんとSupervisorのserviceコマンドによるstopでは停止できない。
止めるときは下記のコマンド。

```
pkill supervisord
```
要するにプロセスを直接killしている。
（stack overflowでも「killしなさいよ」という情報にぶち当たった）


# 参考
https://hawksnowlog.blogspot.jp/2017/03/install-supervisor3-on-centos6.html
https://qiita.com/yushin/items/15f4f90c5663710dbd56
https://github.com/Supervisor/initscripts/blob/master/redhat-init-equeffelec
GeForce GTX 1050搭載のMSI社製PCにUbuntu18.04をインストール

#はじめに
OSのインストールとNVIDIAドライバーを使用する手順ですが、少々はまりました。色々試した中でこのやり方が簡単かな？と思うので記事に残しておきます。
主に参考にしたのは[【罠がいっぱい！】ubuntu 16.04 LTS をMSI製ノート(GE62 6QC)にinstall](https://qiita.com/Urushibara01/items/b64f86afe5908bd30d5c)です。

#作業
##OSのインストール
- [MacでUbuntu18.04のブータブルUSBを作成](https://qiita.com/TDC/items/40114299c2d52e1ad8cd)で作ったUSBを挿入
- 電源をいれ「DELETE」キーを連打し、BIOS画面を表示
- Bootタブを選択
    - Fast Boot = [Disabled]
    - Boot mode select = [UEFI with CSM]
    - Boot Option #1 = [USB CD/DVD]
- [F10]キーを押して保存、再起動をする
- 「Try Ubuntu without installing」が選択されている状態で[e]キーを押す
- 「quiet splash」という文字列の後ろに半角スペースを開けて「acpi=off」と記入
- [F10]キーを押す。
- 試用版のデスクトップ画面のインストーラーアイコンをダブルクリック
- インストーラーの指示に従いインストールを進め、終了したら再起動

##Nvidiaドライバー設定
- 「ソフトウェア更新」を起動して「設定」を開く
- 追加のドライバータブを開く
- NVIDIA driver metapackageのラジオボタンを選択し、変更の適用をクリック
- PC再起動

#最後に
今のところ安定して動いてます。デスクトップのビーバーがかわいいです。
①DB設計/モデル作成/中間テーブル

①rails g model 単数形
 削除の場合、rails d model 単数形
↓
②マイグレーションファイルの変更

　型　　　　	説明	　　　　用例
　integer	数字	　　　　ユーザーのidなど
　string	文字(少なめ)	ユーザー名、パスワードなど
　text　	文字(多め)	投稿文など
　boolean	真か偽か	真偽フラグ
　datetime	日付と時刻	作成日時、更新日時など

　例：
  class CreateTweets < ActiveRecord::Migration
  　def change
    　  create_table :tweets do |t|
      　  t.string      :name
        　t.text        :text
        　t.text        :image
        　t.timestamps
      　end
    　end
  　end
　
例２：中間テーブル
　class CreateEntries < ActiveRecord::Migration
  def change
    create_table :entries do |t|
      t.references :user, index: true, foreign_key: true
      t.references :job, index: true, foreign_key: true
      t.timestamps
    end
  end
end


③マイグレーションファイルの実行
 $ pwd
  # 現在のディレクトリが正しいことを確認

 $ rake db:migrate
  # マイグレーションファイルの実行

④データベースでデータを確認


④データベースを戻す場合
rake db:rollback
マイグレーションファイルの削除
Laravel Lumenのネーミングルールとか良いコーディングとか

LaravelやLumenの初回立ち上げでファイル・クラス・変数のネーミングルールの確認したいときありませんか？

そんなときはこのリポジトリで確認できます。

https://github.com/alexeymezenin/laravel-best-practices

このリポジトリには他に効率の良いコーディング方法なんかも紹介されているので一度、読んでみましょう。

```php:bad.php
$request->session()->get('cart');
$request->input('name');
```

```php:good.php
session('cart');
$request->name;
```

こんな感じ。
初めてWebページを作成して

## 前置き

　プログラミングの勉強を始めて3か月が経ったので、練習も兼ねて大体1ヶ月ぐらいの時間を用意して、[初めてWebページ](https://y2yamanaka.github.io/kouzi_pg.github.io/)を作成しました。アップロードは[GitHub](https://github.com/Y2Yamanaka/kouzi_pg.github.io)を使用。

## 完成するのに時間がかかった部分を考えてみる

　コードを書く事よりも、どういうデザインにするのか考えるのに一番時間がかかったと思います。

## 作成する過程で学んだ事

　1.　viewportの設定方法
　2.　メディアクエリの仕様
　
　今回作成したのは一番シンプルなWebページなので、せっかくだからレスポンシブWebデザインにしてみました。書き終わった後にブラウザのサイズを弄った時に、しっかりサイズが変わっているのを見た時は割と感動しましたね。

　3.　背景画像の設定関連
　
　background-repeat, background-position, background-attachment, background-sizeなどは実際に書きながら細かく設定できる事に驚きました。

## 次回注意したい事

　デザインを考えるのに時間がかかった理由は「最初だけど、しっかりした物を作りたい」というプライドのせいな気もしますが、「どういう層に見てほしいか」をきちんと考えなかったからだと思うので次回Webページを作成する時には「こういう層に見てほしい」を途中で変えたりせず、日数を決めてテキパキ作成しようと思います。

　あとは、今回のは短いですがCSSファイルが読みにくいのでコメントをしっかり書く癖を身につけようと思います。
ReactNativeでAndroidのリリースビルドだけが落ちる

## 概要
具体的にはlogcatで覗ける以下のエラーの対処法について。

```
04-28 19:51:21.349 22127-22151/? E/AndroidRuntime: FATAL EXCEPTION: Thread-6266
    Process: com.hogehoge, PID: 22127
    java.lang.RuntimeException: Unable to load script from assets 'index.android.bundle'. Make sure your bundle is packaged correctly or you're running a packager server.
        at com.facebook.react.bridge.CatalystInstanceImpl.jniLoadScriptFromAssets(Native Method)
        at com.facebook.react.bridge.CatalystInstanceImpl.loadScriptFromAssets(CatalystInstanceImpl.java:215)
        at com.facebook.react.bridge.JSBundleLoader$1.loadScript(JSBundleLoader.java:34)
        at com.facebook.react.bridge.CatalystInstanceImpl.runJSBundle(CatalystInstanceImpl.java:232)
        at com.facebook.react.ReactInstanceManager.createReactContext(ReactInstanceManager.java:1131)
        at com.facebook.react.ReactInstanceManager.access$800(ReactInstanceManager.java:112)
        at com.facebook.react.ReactInstanceManager$4.run(ReactInstanceManager.java:927)
        at java.lang.Thread.run(Thread.java:841)
```
これは、ReactNativeのAndroidリリースビルドの際にJavaScript側のバンドルが走らず、ランタイムに読み込み対象のバンドルアセットが見つからないためアプリがクラッシュするというもの。

## 対処法
以下の行を追記すればよい。

```diff:/android/app/build.gradle
 project.ext.react = [
+    bundleInDebug: false,
+    bundleInRelease: true,
     entryFile: "index.js"
 ]
```
`react-native bundle` というコマンドを[長ったらしいオプションと一緒に実行する](https://stackoverflow.com/a/45475932/5616750)という解決策もあるようだが、こちらのほうがソースコードとして残る上に次回以降はさくっとまともなリリースビルドが作れるようになるのでラクチン。

参考: https://proandroiddev.com/bundling-react-native-during-android-release-builds-ec52c24e200d
MacでUbuntu18.04のブータブルUSBを作成

#はじめに
せっかくUbuntu18.04LTSリリースされたのでデスクトップ版を試してみたいと思います。
今回はブータブルUSBを作成するまでです。ほぼ、[MacでUbuntuのインストールUSBディスクを作成する](https://qiita.com/kpkpkp/items/6664a1dba97198b984ec)の内容です。少しだけ自分用に手を加えさせてもらい記事に残します。

#環境
- macOS High Sierra 10.13.4
- USBメモリ4GB

#準備
- Ubuntu 18.04のisoファイルを[ダウンロード](https://www.ubuntu.com/download/desktop/contribute?version=18.04&architecture=amd64)
- USBメモリをMacに挿入

#作業
## USB初期化
- USBメモリのディスク番号を確認

```
diskutil list
```
※今回自分の環境では「disk2」でしたが、環境により異なるためそれぞれの環境に置き換えて下さい。

- USBメモリをFAT32で初期化

```
diskutil eraseDisk MS-DOS UNTITLED /dev/disk?
```

- 一旦アンマウントする

```
diskutil unMountDisk /dev/disk?
```

## imgファイル生成
```
hdiutil convert -format UDRW -o ~/Downloads/ubuntu-18.04.img ~/Downloads/ubuntu-18.04-desktop-amd64.iso
```
```
mv ~/Downloads/ubuntu-18.04.img.dmg ~/Downloads/ubuntu-18.04.img
```

## imgをUSBに書き込み
```
sudo dd if=~/Downloads/ubuntu-18.04.img of=/dev/rdisk? bs=1m
```

# 最後に
このUSBを使って早速、PCにインストールしてみたいと思います。
追記：需要の少なそうな条件ですが、実際にインストールする手順を[GeForce GTX 1050搭載のMSI社製PCにUbuntu18.04をインストール](https://qiita.com/TDC/items/9704e7981dd7a072a22d)に記載しました。
c++メモ

# 前書き
　競技プログラミングを始めるにあたって、c++を始めることにしました。その上で自分のぶち当たった壁と忘れそうなことをメモっていきます。**公開してからも随時更新していきます**ので、いいねでもストックでもしてもらえれば光栄です。



自分がどんな言語をどれだけ扱ってきたかを先に書いておきます。

- c言語・・・半年
- swift・・・1年
- python・・・1年半
- c++・・・***new!***

こんな感じです


# 機能

### ■ ストリーム入出力
変数の型を意識せずに使える入出力機構。

**要するにscanfとprintfのc++版**

こんな感じ

```c++
#include <iostream>

using namespace std;

int a, b;

cin >> a >> b;

cout << a+b << endl;
```

このプログラムを実行すると`cin`で標準入力待ち状態となる。もし、`5 2`と入力すると`7`と出力される。

### ■ constについて
　変数の宣言にconstをつけることで、その変数の値が書き換えられないようにできる。

こんな感じ 

```c++
const int max_len = 120;
max_len = 130; //コンパイルエラー
```

constをつける位置はどっちでもいい

```c++

const int value
int const value
```

でも、ポインタが絡んでくると順番にも気をつけなければならない。

1. `*`の前にconstをつけた場合は、ポインタを指している先が不変になる。
- `*`の後にconstをつけた場合は、ポインタ変数そのものが不変になる。

1.の場合

```c++
const int* p1 = &value1;

//ポインタ変数そのものを変更することはできるが、
p1 = &value2;             //OK
//ポインタ変数が指している実態を変更することはできない。
*p = 10;                  //NG
```

2.の場合

```c++
int* const p2 = &value1;

// ポインタ変数そのものを変更することはできないが、
p2 = &value2;             //NG
// ポインタ変数が指している実態は変更することはできる。
*p2 = 10;                 //OK
```
### ■ 名前空間(namespace)
大規模開発の際に変数名や関数名が衝突してしまうことを避けるための仕組み。

例えば、

```c++
namespace Hoge {
    int a;
    void hello();
}

namespace Geho {
    int a;
    void hello();
}
```
と書いて、

```c++
Hoge::a=1;
Geho::a=2;

Hoge::hello();
Geho::hello();
```
と使うと、aとhelloは別として扱われる。

そして、ファイルの先頭などに`using namespace Hoge`と書くと`Hoge::`を省略することができる。

## STL
STLとは、C++の標準ライブラリの一つ。

特に競技プログラミングでは重宝されるらしい。

algorithmとかstackとかqueueとかstringとか...

### ◆ algorithm

- max(a, b)・・・aとbの大きい方を返す。(minもあるよ。)

```c++
int a=10, b=4;
int large = max(a, b) // 10
```

- swap(a, b)・・・aとbの値を交換する。

```c++
int a=10, b=4;
swap(a, b); //aが4でbが10になってる。
```

- sort(f, t)・・・fからt-1までを昇順ソートする。(fとtは配列のポインタ)

```c++
int a[] = {6, 2, 1, 3, 7};
sort(a, a+5) // {1, 2, 3, 6, 7}
```
降順でしたかったら、

```c++
sort(a, a+5, greater<int>());
```

- reverse(f, t)・・・fからt-1までを反転する。

```c++
int a[] = {4, 6, 2, 7, 5}
reverse(a, a+5) // {5, 7, 2, 6, 4}
```

- count(f, t, x)・・・fからt-1までに含まれるxの数を返す。

```c++
int a[] = {2, 4, 7, 3, 6, 7, 7, 1};
int cnt7 = count(a, a+8, 7); // 3
```

- fill(f, t, x)・・・fからt-1までを全てxで初期化する。

```c++
int a[] = {4, 2, 6, 2, 1, 5}
fill(a, a+6, 1); // {1, 1, 1, 1, 1, 1}
```

他にも便利な関数は色々あります。
equel, find, search, copy, remove, replace, random_shuffle, unique, lower_bound, upper_bound, binary_search, max_element, min_element, next_permutation, などなど...


# 参考
[C言語経験者のためのc++入門](http://kanamori.cs.tsukuba.ac.jp/docs/cpp_introduction.pdf)
[c++におけるconstをつける位置の違い](https://qiita.com/pink_bangbi/items/a36617bf1d5923743d69)
[開発環境]プロジェクトごとにrailsの開発環境を設定する方法


# 目的 
- 手順をテンプレート化しておき、今後の作業効率を上げる。

# 開発環境

- Ruby:2.4.1
- Rails:5.1.3
- DB: MySQL ver5.7系


# 前提条件
- homebrewをインストール済み
    - rbenv / ruby-buildをインストール済み
    - MySQLのver5.7をインストール済み

[[開発環境]Ruby/Rails/MySQLをインストールする](https://qiita.com/shi-ma-da/items/3e2122bd9a5ebcb5e9b7)

# 手順

## 1. プロジュエクトディレクトリを作成し、移動

```bash:
mkdir sample_app && cd $_

# mkdir sample_appでディレクトリを作成
# cd $_ で直前に実行したコマンドの最後の引数（上記の場合だと「sample_app」）へ移動
```

## 2. バージョンを指定してRailsをインストールする
```bash:
gem install rails -v 5.1.3
```

![https://gyazo.com/16453cac2fd1e6ab2bc0d1aaf47178fe](https://i.gyazo.com/16453cac2fd1e6ab2bc0d1aaf47178fe.png)

## 3. rails newを実行する (バージョン番号を指定)

```bash:
rails _5.1.3_ new ./ -B -d mysql --skip-turbolinks --skip-test

# ./ :現在いるディレクトリに作成する
# turbolinksをOFFって、データベースをmysqlに変更して、testをRSpec使うためにskipする。
# _5.1.3_： railsのバージョンを指定
# -B： 「bundle install」を自動的に実行しない
# -d: 指定したデータベースに変更する（railsのデフォルトのDBはsqlite3）
# --skip-turbolinks： turbolinksを無効化してrails newする
# --skip-test： testを作成しない。RSpecに変更したいときに使うと良い。Rails5で有効なオプション。
```

## 4. bundle installを実行してgemをインストール

```bash:
bundle install --path vendor/bundle --jobs=4

# --path vendor/bundleはプロジェクトディレクトリ配下のvendor/bundleディレクトリ内にgemがインストールされるように設定。
# 上記の設定により、gemをrailsプロジェクト毎に管理できるっ！！
# あと調べて見ると　　ディレクトリ名「vendor/bundle」 である必要は無いが慣例として使っているっぽい。
# --jobs=4 は並列処理の設定。これがあると高速化するので追加すると良さげ
```

## 5. サーバー立ち上げ

```bash:
# mysqlの起動
mysql.server start

bin/rails s
```
---
## 関連情報
[[初期設定]なぜ「.ruby-version」を作成するのか？](https://qiita.com/shi-ma-da/items/74033b932800bb61b3f3)

[[初期設定]Rails開発における初期設定5項目](https://qiita.com/shi-ma-da/items/feecfb84360edea83710)
Python 3 エンジニア認定基礎試験備忘録

# 【前置き】
先週受けに行こうと思って行けなかったPython3エンジニア認定基礎試験を受けに行き合格したので備忘録として残します。対象は今後の受講者と企業様向け。

# 【本題】
いろいろよくない話があるこの試験ですが。
まず、この試験に合格したらpythonバリバリやぞ！！！なんでもこいや！！！ってものではありません。python触ってみようと思うんだ、っていう意思表示くらいは出来るかもですが・・・受けた事ないでのわかりませんが、Java Bronzeの方が数十倍難しいと思います。はい。今後出来るであろうデータ解析試験が所謂pythonsilver的な扱いになるんじゃないでしょうか。乞うご期待。

ひとまず公式の出題範囲は以下となっています。
合格ラインは7割。受験料は1諭吉です。
https://www.pythonic-exam.com/exam/basic

|章立て	|出題数	|出題率
|:-----------------|------------------:|:------------------:|
|1章　食欲をそそってみようか	|1	|2.5%
|2章　Pythonインタープリタの使い方	|1	|2.5%
|3章　気楽な入門編	|6	|15.0%
|4章　制御構造ツール	|9	|22.5%
|5章　データ構造	|7	|17.5%
|6章　モジュール	|2	|5.0%
|7章　入出力	|1	|2.5%
|8章　エラーと例外	|4	|10.0%
|9章　クラス	|2	|5.0%
|10章　標準ライブラリめぐり	|4	|10.0%
|11章　標準ライブラリめぐり─PartII	|1	|2.5%
|12章　仮想環境とパッケージ	|1	|2.5%
|13章　次はなに?	|0	|0.0%
|14章　対話環境での入力行編集とヒストリ置換	|1	|2.5%
|合計	|40	|100.0%

それに対して私の成績は・・・825/1000点。
数問やばいなぁと思って900くらいかと思いきや思いっきり削れてます。
詳細は以下でした。

|章立て	|出題数	|出題率
|:-----------------|------------------:|:------------------:|
|1章　食欲をそそってみようか	|?	|100%
|2章　Pythonインタープリタの使い方	|?	|100%
|3章　気楽な入門編	|?	|89%
|4章　制御構造ツール	|?	|86%
|5章　データ構造	|?	|50%
|6章　モジュール	|?	|50%
|7章　入出力	|?	|0%
|8章　エラーと例外	|?	|75%
|9章　クラス	|?	|100%
|10章　標準ライブラリめぐり	|?	|100%
|11章　標準ライブラリめぐり─PartII	|?	|0%
|12章　仮想環境とパッケージ	|?	|0%
|13章　次はなに?	|-	|-
|14章　対話環境での入力行編集とヒストリ置換	|?	|100%
|合計	|40	|82.5%
※？は実際の問題数はわからなっしんぐの為です。

1問しか出ないところで落としてる所は0%でございます！！！なんかいやこのスコア！！

# 【勉強方法について】
私が思いっきり自分のメモ書きとして備忘録としておいてありますが、
これだけです。これだけしかないと言っていい。

pythonチュートリアル
https://docs.python.jp/3/tutorial/index.html
模擬試験
https://diver.diveintocode.jp/exam#exam-list

pythonチュートリアルを2週読みましょう。
模擬試験10連続100点取れるくらいは仕様の感覚を掴みましょう。

これで合格点は上記のように取れます。
高得点を狙うならチュートリアルの骨の隅々までをしゃぶるようにして下さい。
出題範囲はチュートリアル14章までとなってます。

# 【後書き】
他に受けられていた方の記事を参考にすると勉強時間大体10時間となっていますが、自給換算すると1時間1000円として1万円、受験料1万円で2万円の資格と言う事になります。

2万円分有効に活用できるなら十分かと思いますが、
本題に記載した通り、これに2万かけるなら最新ツールの参考書1冊買って17時間程度読んだ方がコスパがいいと思います。いや本当に・・・

その他私事ですが、現職続けて勉強する（＋転職活動する）って言うのは正直大分つらいと感じてきました。4月は比較的余裕がある中で続けて来ましたが来月からはわかりません。その為、現職を離職し、職業訓練校で修行するという方向を現在検討しています。お財布の中身は辛いのですが、仕方ありませんね・・・
【Laravel入門】設定を整える〜ルーティングの確認

# 各種ファイルの修正

引き続き、作業に必要な設定を整えていく。

- 下記ディレクトリの権限を変更する。chmodコマンドがあれば簡単だ。

```
$ chmod 777 storage
$ chmod 777 bootstrap/cache
```

- ``config/app.php``を編集

```config/app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```

- ``.env``を編集（まだデータベースは作成していない。用意した後に記載しよう。）

```
APP_URL=http://localhost:8000
DB_DATABASE=データベース名
DB_USERNAME=データベースのユーザー名
DB_PASSWORD=データベースのパスワード
```

# ルーティングの基本

ルーティングの情報は``routes/web.php``に記載されている。先程``localhost:8000``にアクセスして画面が表示されたのは、ここにその指示が書かれていたからだ。

```routes/web.php
<?php

Route::get('/', function () {
    return view('welcome');
});
```

公式ドキュメントにはこう書かれている。

>一番基本のLaravelルートはURIと「クロージャ」により定義され、単純で記述しやすいルートの定義方法を提供しています。

行われている処理を順を追って説明する。

- ``Route::get( );``には２つの引数が使われている。中に記述されている処理はgetメソッドでアクセスした時に実行される。（getはHTTP動詞の１つである。HTTP動詞には、他にpostなどがある。）
- 第１引数のURIは``'/'``のこと。つまり``localhost:8000``を指す。
- そしてgetメソッドで第１引数のURIにアクセスされた時、第２引数である``クロージャ（無名関数）``が実行される。

```
function () {
    return view('welcome');
}
```
- 結果、``view('welcome')``が返される。これが基本画面となる。

# さらに便利なルーティング

公式ドキュメントにはこうも記載されている。（一部省略）

>名前付きルートは特定のルートへのURLを生成したり、リダイレクトしたりする場合に便利です。ルート定義にnameメソッドをチェーンすることで、そのルートに名前がつけられます。

>ルートに一度名前を付ければ、その名前をグローバルなroute関数で使用することで、URLを生成したり、リダイレクトしたりできます。

一例として、以下の記述の説明をする。

```
Route::get('/login', 'AuthController@getLogin')->name('login');
```

- ``Route::get( );``には２つの引数が使われている。中に記述されている処理はgetメソッドでアクセスした時に実行される。（先程と同じである。）
- 第１引数のURI``'/login'``でアクセスされた時、第２引数である``AuthControllerのgetLoginアクション``が実行される。
- さらに``nameメソッド``により、グローバルな``route関数login``が作成される。

この``route関数``が色々と役に立つのだ。コントローラーやビューの説明は後日記事にする予定だが、記載例として先に上げておく。

## コントローラでリダイレクトしたい時に

```
return redirect()->route('login');
```

- ログインに必要なloginアクションをpost用とget用に分けておく。
- post用アクションには、if文でログイン成功時・失敗時それぞれの処理を書いておく。
- get用アクションは、単純にログイン画面を表示するだけである。

post用アクションを使って送られたデータでログインに失敗した時、上記のコードが書かれていればget用アクションにアクセスできる。再度ログイン画面が表示できるという流れができるのだ。

## ビューでリンクを作成したい時にも

```
<a href="{{ route('login') }}">Login</a>
```

# 暗記力よりも検索力

研修会の講師も、講義中に頻繁に公式ドキュメントを参照していた。普段複数の言語やフレームワークを扱っていると、それぞれの書き方を完璧に暗記することはできない。その代わり、必要な時に素早く正確な情報を手に入れることが重要になるそうだ。

講師はとにかく検索が早かった。自分だったら何時間かかっていただろうか・・・と思われる箇所も、テキパキと必要な情報を得ていた。

ちなみにブラウザ上では``ctrl+F``で画面内の用語検索が可能である。これを公式ドキュメント上で使用する。今はこれを真似している。

そして公式は最強。Laravelの公式ドキュメントはレイアウトが見やすいのも助かる。今回参考にしたページはここ。

- [初期設定](https://readouble.com/laravel/5.5/ja/installation.html)
- [ルーティング](https://readouble.com/laravel/5.5/ja/routing.html)

今回はここまで。
ライブデモを支える技術 on Windows

## ライブデモをやりました

2018年4月26日の [SORACOM Technology Camp 2018](https://technology-camp2018.soracom.jp/) で、見事ライブデモを成功させたうえ、登壇時間を8分オーバーした [松下](https://twitter.com/ma2shita) です。

![livedemo/overview](https://docs.google.com/drawings/d/e/2PACX-1vQrCOzqhZfxcthYYN4eS7sVb-L5AKuMtr5vBgFi-kj0a838qWZN4ryNLZ__owRqK9znoefqlokh3zM2/pub?w=640&h=427)

上記のように、手元での作業をスクリーン上に出してライブデモを行ったわけですが、この仕組みについて解説します。

## TL;DR

- USB Web カメラを使いました。
- このカメラの内容を表示するのに [CameraViewer](http://kougaku-navi.net/backyard/index.html) を使いました。

## 解説

使ったのは

- Web カメラ (1500 円くらい)
    - Web カメラの高さを確保するための台 (プライスレス)
- USB ライト (900 円くらい)
- カメラを表示するソフトウェア (後述)

このくらいです

### カメラを表示するソフトウェア

[CameraViewer](http://kougaku-navi.net/backyard/index.html) というソフトウェアを利用させていただきました

![livedemo/CameraViewer](https://docs.google.com/drawings/d/e/2PACX-1vQSNbeTjr_DOke06Zhwwd5azkR-K058kXGCApTweX9TGRcknAnuawHUxE9g7fcODXXbfGHoyC26yndZ/pub?w=393&h=265)

このソフトウェアは、まさにカメラで撮っている内容をその場で表示することに特化しています。
最新版は **2013年** です。さすがシンプルなソフトウェア、すばらしいです。

ライセンスが ["配布しているソフトウェアやソースコードのご使用は自己責任でお願いします．"](http://kougaku-navi.net/about/index.html) というソフトウェアになります。。。

#### macOS の場合

QuickTime Player の "新規ムービー収録" を選んで、録画しなければ同じようなことになると思います。（未確認）

### Web カメラ

カメラは BUFFALO さんの [HD720p 対応カメラ](http://buffalo.jp/product/multimedia/web-camera/bswhd06m/) にしました。というか、社内に転がっていたモノをお借りした感じです。

### 現場での作業

![livedemo/closeup](https://docs.google.com/drawings/d/e/2PACX-1vSqabqHgihUhgXtVCGUHuGvmdTc2d5hQoZIYAlYo36DlVh2wkz-qI_ApeGWvp8-M5pVPsBY1O8DnHO-/pub?w=640&h=455)

ちょっと見づらいのですが Web カメラの高さを確保するための箱を用意しています。確かタッパーだったような。その程度でいいんです。

あと手元の明かりは必要です。 [900 円の USB ライト](https://www.amazon.co.jp/gp/product/B01N2A5LGV/) を使いました。 USB Type A で給電できます。軽くて明るく、しかも軸のフレキシビリティが高いので光を入れる方向を調節しやすかったです。

## 他に検討した技術について

- [Miracast](https://ja.wikipedia.org/wiki/Miracast)
    - PC を無線モニターにできる仕組み ([PC Watch さんの解説記事](https://pc.watch.impress.co.jp/docs/topic/review/752171.html))
    - Windows Phone を持っていたので [接続] から無線で画面を配信し、 Windows Phone の「カメラ」アプリで表示してみた
    - 表示はできたんだけど、遅延がひどくて役に立たず
    - Android でも試してみたけど、私が持っていた機種 (GRAND X LTE) では配信できなかった

## あとがき

よくよく思うと「支える技術」というほどの事はやってませんでした、ゴメンナサイ。
結局有線が最強＆簡単ということを再認識したということでした。

今後もライブデモ増やしていきたいなー

EoT
VSCodeで特定のファイルを言語に関連付ける

# 例) Phalconの場合
`phtml`,`volt`あたりを設定しておくとシンタックスハイライトされ、
且つデバッグでブレイクポイントも使えるようになるので非常に良い

```json:.vscode/settings.json
{
  "files.associations": {
	  "*.volt": "php", // ワイルドカードも使える
	  ".phtml": "php"
  },
}
```
pullRequest対応時のエラー対処メモ


### 開発環境

+ MacOS High Sierra
+ XCode9.3


XCodeからGitHubにあげたソースのpullRequestの対応で、以下のエラーが起きたので対処した際の記録
なお、当初はXcodeのGUI操作でやろうとしたがやり方が分からなかった為、コンソールで該当プロジェクト直下に移動して実行している。

```
$git fetch origin
fatal 'origin' does not appear to be a git repository - fatal Could not read from remote repository.
```
originというremoteがないという意味らしい。

[Git push: “fatal 'origin' does not appear to be a git repository - fatal Could not read from remote repository.”](https://stackoverflow.com/questions/32238616/git-push-fatal-origin-does-not-appear-to-be-a-git-repository-fatal-could-n/32238628)

上記リンクの方法で解決。要するに、remoteの名前をoriginという名前で設定し直しただけ。
これでコマンドが打てる環境になったと思ったら次のエラーが出る

```
$ git pull ttps://github.com/XXXXXXXXXXXXX
The following untracked working tree files would be overwritten by merge:
```
GitHubにあるソースとローカルにあるソースのリポジトリに差異がある？

[[Git]エラー：The following untracked working tree files would be overwritten by merge:](http://to-developer.com/blog/?p=1162)

```
$ git reset --hard FETCH_HEAD
```

これ実行してようやく、ローカルでブランチのソースを実行出来て、マージもして最後にpushして完。
Google Cloud Platform・Dockerでの無料プライベートリポジトリ利用

Google Cloud Platform(GCP)ではプライベートリポジトリが無料でホスティングできるため、実際のアプリケーションで利用しなくても、有用です。
ただ、これの操作に[使うGoogle Cloud SDKは、特定バージョンのPythonのインストールが前提となる](https://cloud.google.com/sdk/docs/quickstart-macos?hl=ja)ため、 PCの環境を汚してしまうのがいやで躊躇していました。
しかし、GoogleはSDKのDockerコンテナを配布しており、これだけでほかの設定などなしで目的が果たせたので、残しておきます。

# 前提

- (筆者はmacOS High Sierraを使用しています)
- Docker・Gitインストール
- Google Cloud Platformへの登録・プロジェクト作成

# Cloud SDKコンテナのダウンロード
コンテナ化されたCloud SDKをPullします。
[このやり方はGoogleのDocker Hubページにあります。](https://hub.docker.com/r/google/cloud-sdk/)

```
docker pull google/cloud-sdk:latest
```

# Cloud SDKコンテナ起動
ローカルのリポジトリを作りたいディレクトリで下記を実行します。

```
docker run -it -v `pwd`:/repos -w /repos google/cloud-sdk /bin/bash
```

このコマンドは先のSDKコンテナを対象ディレクトリをマウントし、そこを作業ディレクトリとしてコンテナ起動します。

# Ckoud SDK初期設定
まずCloud SDKの認証・初期設定を行います。

```
gcloud init
```

色々と聞き返されますが、かなり適切にナビゲートしてくれ、それにしたがえば良いので、ここでは示しません。用意したプロジェクトを指定してください。

# GCP上でリポジトリ作成
下記コマンドでGCP上に空のリポジトリが作成されます。

```
gcloud source repos create [リポジトリ名]
```

ブラウザでGCPコンソールから確認してみてください。

# ローカルにGitリポジトリをクローン
再びCloud SDKコンテナで下記を実行。

```
gcloud source repos clone
```

これで、GCP上のリポジトリと、作業用のローカルリポジトリが出来上がります。
あとは、適宜みなさんのやり方で進めてください。
【Unity】Animationのmissingを自動で修正するエディタ拡張

# 概要
Hierarchy上でのオブジェクトの階層を変えたことによって起きるAnimationのmissingを修正します
# 背景
Unityのアニメーションを編集中に、ヒエラルキー上で階層を変更するとAnimationのプロパティに黄色文字のMissing!が表示され、うまく動かなくなってしまいます。
その都度手動でAnimation側のプロパティ名を変更する必要がありました。

こりゃめんどいぞということで拡張作りました

# デモ

![demo_1.gif](https://qiita-image-store.s3.amazonaws.com/0/41732/f557d023-b568-6196-9149-ad91d0b4ba0d.gif)


# 実装
https://github.com/sukedon/AnimationValidator
コード全文はこちらにあります。

## animとオブジェクトの紐付け
![image.png](https://qiita-image-store.s3.amazonaws.com/0/41732/7398b2a4-e763-7057-f715-a486332ccc4c.png)

そもそもなんでmissingになるんだろうっていうので.animファイルの中身を見てみたんですが、アニメーションで動かすオブジェクトは名前で取得しているんですね。上の画像のPathというプロパティでオブジェクトを探して紐付けているようです。ヒエラルキー上のオブジェクトのguidで紐付けているわけではないようです。

## Missingになったオブジェクトの見つけ方
Pathの値で親のオブジェクトからFindをし、nullだったらMissing。

## Missingの修復方法
オブジェクトの名前を元にanimation側のパスを直すようにしました。
なので、

- animationで制御するオブジェクトの子階層のオブジェクトは、全て名前が一意になっている必要がある

という条件がついてしまいます。


# 参考にさせていただいた記事

AnimationClipからPathを取り出すところは下記の記事を参考にさせてもらいました。

>Unity 壊れたAnimationClipを少しリカバリーしてみるEditor拡張
http://www.shibuya24.info/entry/2016/03/11/090000



# github
https://github.com/sukedon/AnimationValidator
改善点等ありましたらプルリクをお待ちしておりますm(__)m
【Ruby on Rails】RSpecで使うymlで直接シンボルを表現したかったこの頃

RSpecなどでテストデータとしてymlを使う場合多いっすよね。
なんですが、たまにテストコード書いてると、ymlで読み込んだデータがシンボルで表現されずにテストケースがfailしてしまうことがありますよね。

まぁ、symbolize_keysとか使えばいいんですけど、めんどくさいのでymlをloadしたときからシンボルにできないんか？と。

結果、できました。
なので、ymlでシンボルを表現するやり方を書いておきます。


とりあえず、以下のymlを用意しました。

```test/fixtures/files/hoge.yml
user:
  id: 1
  name: ほげ太郎
  kana_name: ホゲタロウ
  nick_name: ほげほげ
```

まずは、こいつをコンソールから読み込んでみます。

```rb
[4] pry(main)> h = YAML.load_file("test/fixtures/files/hoge.yml")
=> {"user"=>{"id"=>1, "name"=>"ほげ太郎", "kana_name"=>"ホゲタロウ", "nick_name"=>"ほげほげ"}}
```

で、例えばnameがほしかったら


```rb
[6] pry(main)> h['user']['name']
=> "ほげ太郎"
```

こう表現するんですけど、シンボルで欲しい！！
h[:user][:name]と。

どうするかというと、ymlをこう書き換えます。

```test/fixtures/files/hoge.yml
:user:
  :id: 1
  :name: ほげ太郎
  :kana_name: ホゲタロウ
  :nick_name: ほげほげ
```

:を追加！！
それで、ymlをloadしてみると。

```rb
[8] pry(main)> h = YAML.load_file("test/fixtures/files/hoge.yml")
=> {:user=>{:id=>1, :name=>"ほげ太郎", :kana_name=>"ホゲタロウ", :nick_name=>"ほげほげ"}}
[10] pry(main)> h[:user][:name]
=> "ほげ太郎"
```

シンボルでnameを取得できました！！！

やったね！！

おわり
rbenvをmacOS High Sierraにインストールする

[rbenv](https://github.com/rbenv/rbenv#homebrew-on-macos)は複数バージョンのrubyを管理するツールです。 

[公式](https://github.com/rbenv/rbenv#homebrew-on-macos)の手順を見て作業を進めたので記録を残しておきます。 環境はmacOS High Sierra 10.13.4（17E199）でinstallには[Homebrew](https://brew.sh/index_ja.html)を使いました。


まずrbenvをインストールします。  

```shell
$ brew install rbenv
```

バージョンを確認しておきます。  

```shell
$ rbenv --version
rbenv 1.1.1
```

rbenv initを実行すると必要な作業手順が表示されます。  

```shell
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

bash_profileを開き`eval "$(rbenv init -)"`を追記します。  

```shell
$ cd ~
$ vi .bash_profile
```

編集後、bash_profileの再読込みを行います。

```shell
$ source .bash_profile
```

rbenv-doctorスクリプトを実行して正しくｒｂenvがセットアップされたかを確認します。

```shell
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash  

Checking for `rbenv' in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20180424)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/Users/username/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```

インストールできるrubyの一覧を確認します。

```shell
$ rbenv install --list
```

下記コマンドでruby2.5.1をインストールします。

```shell
$ rbenv install 2.5.1
```

インストールされているversionを確認します。`*`がついているものが現在rbenvが参照しているrubyです。

```shell 
$ rbenv versions
* system (set by /Users/username/.rbenv/version)
  2.5.1
```  

rbenvがglobalに参照するrubyバージョンを変更します。変更後に`rbenv versions`を実行するとバージョンが切り替わっているのがわかります。

```shell

$ rbenv global 2.5.1
$ rbenv versions
  system
* 2.5.1 (set by /Users/username/.rbenv/version)
```  

色々使い方を知りたい場合、[公式のREADME](https://github.com/rbenv/rbenv#table-of-contents)が充実しているのでそこを読むと良いです。
PythonでMP3音源を再生する

タイトルの通りです。
# この記事の特徴
- 依存ライブラリのインストールはpipで完結
- きちんと音源の長さだけ再生する(途中で止まる・空白を再生し続けることはない)
- Python3で書いてます(2系で動くかは知りません)

# 依存関係
- pygame
- mutagen

以下のコマンドで依存ライブラリをインストールします。

```sh:
pip3 install pygame mutagen
```

# コード
```python:
from mutagen.mp3 import MP3 as mp3
import pygame
import time

filename = 'filename.mp3' #再生したいmp3ファイル
pygame.mixer.init()
pygame.mixer.music.load(filename) #音源を読み込み
mp3_length = mp3(filename).info.length #音源の長さ取得
pygame.mixer.music.play(1) #再生開始。1の部分を変えるとn回再生(その場合は次の行の秒数も×nすること)
time.sleep(mp3_length + 0.25) #再生開始後、音源の長さだけ待つ(0.25待つのは誤差解消)
pygame.mixer.music.stop() #音源の長さ待ったら再生停止
```

下から2行目でMP3音源の長さ+0.25秒待っていますが、そのままだとほんの少し早くブチッと切れたりすることがあったので0.25秒足しています。お好みで調整してください。
flaskで複数のcontent typeを処理する

Flaskで　`Content-Type: multipart/form-data`を処理した時のメモ。

```python
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/', methods=['POST'])
def index():
    for key, value in request.files.items():
        # 何かやる
        do_something(key, value.read(), value.memetype)

    return jsonify({'success': True})

if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=8000)
```

`curl` で以下のようにリクエストを送ります。

```bash

$ curl --trace-ascii - -X POST \
  -F "upload_image=@image.jpg;type=image/jpeg" \
  -F 'meta=@payload.json;type=application/json' \
  http://0.0.0.0:8000/
```

## `form-data`の処理

### request.files

リクエストデータは [request.files](http://flask.pocoo.org/docs/0.12/api/#flask.Request.files) に格納されています。
keyを送信時のキー名、valueを[FileStorage](http://werkzeug.pocoo.org/docs/0.14/datastructures/#werkzeug.datastructures.FileStorage)とした[MultiDict](http://werkzeug.pocoo.org/docs/0.14/datastructures/#werkzeug.datastructures.MultiDict) 型で格納されています。

[FileStorage](http://werkzeug.pocoo.org/docs/0.14/datastructures/#werkzeug.datastructures.FileStorage)は file-like objectと同じように `storage.read()` のようにすることでコンテンツを読むことができます。

### request.form

[request.form](http://flask.pocoo.org/docs/0.12/api/#flask.Request.form)でもリクエストデータを扱うことが可能ですが、 `Content-Type`を取得する方法が確認できませんでした。（**要調査**）

`Content-Type`でハンドリングするためにrequest.filesを使うのがとりあえずは良さそう。（クライアントが `Content-Type`を付けている前提ですが。。。）

## curl

curlで`multipart/form-data`を扱う時に気になったところもついでにメモ。

### `Content-Type` を指定する

送るファイルの後に `;`区切りで `Content-Type`そ指定できます。

### trace-asciiをつける

`curl -v`してもどのようなpayloadが送られているか全体を確認することはできません。そのため、`--trace-ascii -`を付けて確認すると楽でした。

## 参考

- [Flask Incoming Request Data](http://flask.pocoo.org/docs/0.12/api/#incoming-request-data)

- [Flaskでmultipart/form-dataのファイルアップロードを実現する方法](https://qiita.com/5zm/items/ac8c9d1d74d012e682b4)

- [curlでmultipart post時にファイルのContent-Typeを指定する方法](https://qiita.com/hotakasaito/items/72f9b5b2d75d0211ef29)

- [curlコマンドによるデータ送信あれこれ](http://www.wagavulin.jp/entry/2015/10/18/060938)

- [How do you display POST data with cURL?](https://superuser.com/questions/291424/how-do-you-display-post-data-with-curl)
【入門】Angular QuickStart Step2 に沿って 新規プロジェクトを作成してみる

今回は
[【入門】Angular QuickStart Step1 に沿って開発環境を構築してみる](https://qiita.com/tanuki0143/items/dcb99d8e74559c3d300e)
に 続けて

[クイックスタート](https://angular.jp/guide/quickstart)

の Step 2. 新規プロジェクトを作成する を 実施して行きます。

#Step 2. 新規プロジェクトを作成する
>ターミナルを開いてください。
>次のコマンドを実行して、新規プロジェクトと空のアプリケーションを生成してください。

とありますが、
コマンド実行時のカレントディレクトリにプロジェクトが作成されますので
プロジェクトを作成したいディレクトリまで移動しておきましょう。

その後

```
ng new my-app
```
コマンドを実行し プロジェクトを作成します。
中身を確認するとこんな感じです。

```console
$ ls -ltr
total 0
drwxr-xr-x  15 xxxxxxx  staff  510  4 28 17:44 my-app
$ cd my-app
$ ls -ltr
total 824
-rw-r--r--    1 xxxxxxx  staff    3012  4 28 17:42 tslint.json
-rw-r--r--    1 xxxxxxx  staff     363  4 28 17:42 tsconfig.json
drwxr-xr-x   14 xxxxxxx  staff     476  4 28 17:42 src
-rw-r--r--    1 xxxxxxx  staff     722  4 28 17:42 protractor.conf.js
-rw-r--r--    1 xxxxxxx  staff    1291  4 28 17:42 package.json
-rw-r--r--    1 xxxxxxx  staff     923  4 28 17:42 karma.conf.js
drwxr-xr-x    5 xxxxxxx  staff     170  4 28 17:42 e2e
-rw-r--r--    1 xxxxxxx  staff    1021  4 28 17:42 README.md
drwxr-xr-x  859 xxxxxxx  staff   29206  4 28 17:44 node_modules
-rw-r--r--    1 xxxxxxx  staff  397129  4 28 17:44 package-lock.json

```

次は [Step 3: アプリケーションをサーブする](https://qiita.com/tanuki0143/items/776aa69e97deee6e8ec5) です。
[メモ] Google Cloud SDKをHomebrewを使ってMacにインストールした時のメモ


1. `brew cask install google-cloud-sdk` する.
2. `brew cask info`で出る下記のような注意書きの通りに `.profile` や `.bashrc` や `.zshrc` などの適切なところに指定のスクリプトを実行する2行をいれる. これをしないとパスが通らない.

> $ brew cask info google-cloud-sdk
(中略)
==> Caveats
google-cloud-sdk is installed at /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk. Add your profile:
> 
  for bash users
    **source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'**
    **source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc'**
> 
  for zsh users
    **source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc'**
    **source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc'**


※ Homebrewにおける注意事項として、`brew install` や `brew cask install` の後にCaveatsがあればCaveatsに従って諸々の設定を行う作業が必須ということがあります。Homebrewならコマンドで一発インストールできると思い込みがちですが、必ずしもそうではありません。皆さんもCaveatsを見逃さないように注意しましょう。特に複数のbottleを同時にインストールした時などは見逃しやすいので気をつけてくださいね。
Pythonで親ディレクトリの絶対パスを取得

自分が必要で少し時間かかったので（技術力不足）共有します
特に説明する事もないので簡単に
子のファイルと、上に戻るディレクトリ階層の指定を引数に与える事ができます
#ソース
- osを使ったもの


```python
import os

def parentpath(path=__file__, f=0):
    return str('/'.join(os.path.abspath(path).split('/')[0:-1-f])))
```
- pathlibを使ったもの　（4/29 コメントで教えていただきありがとうございます！）

```python
from pathlib import Path

def parentpath(path='.', f=0):
    return Path(path).resolve().parents[f]
```

#使い方


```python
#currentdir /Users/you/repository/test/pro/source/app/api/cruc.py

print(parentpath(__file__,0))#->/Users/you/repository/test/pro/source/app/api/
print(parentpath(__file__,1))#->/Users/you/repository/test/pro/source/app/
print(parentpath(__file__,2))#->/Users/you/repository/test/pro/source/
print(parentpath(__name__,0))#->/Users/you/repository/test/pro/source/app/
print(parentpath(__name__,1))#->/Users/you/repository/test/pro/source/
```
初めてScalaに触ってみることにした(Macで環境構築編）

# MacにScala環境を構築してみる
特に現場でScalaを触っているわけではないのですが、他プロジェクトではScalaを使っていたり、世間ではScalaが流行っているようなので、特に何をするわけでもないのですがMacに環境を作ってどんなもんか触ってみることにしました。
まったくScalaを知らないド素人なのでもっと良いやり方や間違っている部分をどんどん指摘いただけると幸いです。

私の環境は下記の通りです。
macOS High Sierra
メモリ  8GB

Java1.8がインストールされていることとHomebrewがインストールされていることを前提としています。

**追記**
Activatorを使うやり方を記載しましたが、Activatorは終了となっていたようですので、
こちらの記事を参考にSBTを使うようにしてください。
[Activator が EOL を迎えるので、Activator と SBT コマンドの対応表を作成します。](https://qiita.com/TKR/items/9200ca19e14376b305b5)

---

## 環境構築
### Activatorのインストール
playフレームワークを触ってみたいのでActicatortというビルドツールをインストールします。
とりあえずこれがあれば動かせるらしい。
`$ brew install typesafe-activator`

### Activator起動
`$ activator`
結構時間がかかるのでゆっくり待ちましょう。
下記のようなログが出たら大丈夫です。
> [info] play - Listening for HTTP on /127.0.0.1:8888

ブラウザを起動して
http://localhost:8888
にアクセスして画面が表示されればOKです。

### プロジェクト作成
プロジェクトを作成したい場所で下記のコマンドを実行します。
`$ activator new`

下記のような画面が表示されます。
![scala001.png](https://qiita-image-store.s3.amazonaws.com/0/212450/f3a25feb-55f2-b475-1291-9db1eacad4e5.png)
今回はplayフレームワークを使用するので「６」を入力してEnterを押下します。

次にアプリケーション名を入力するように促されるので任意の名称を付けてEnterを押下します。
これでプロジェクトの作成は完了です。

lsコマンドで作成したプロジェクトのディレクトリがあることを確認し、ｃｄで作成したプロジェクトのフォルダへ移動してください。

### プロジェクト起動
下記のコマンドを実行します。
`$ activator run`

自分の環境だけなのかわかりませんが、これめちゃくちゃ時間かかりました。
１５分〜２０分くらい待ちました・・・・

まぁ気長にお茶でも飲みながら待って下さい。

　　　∩＿＿＿∩
　　　| 丿　　　　　ヽ
　　 /　　●　　　● |
　　 |　　　　( _●_) 　ミ
　 彡､　　　　ヽノ　,,/ 　　　♪
　 / 　　　　┌─┐´
　|´　 丶　ヽ{ .茶 }ヽ
　 ｒ　 　 ヽ、__)ニ(_丿
　ヽ、___　　　ヽ　ヽ
　　と＿＿_＿ノ＿ノ


こんな感じのメッセージが出たらOKです。
![scala002.png](https://qiita-image-store.s3.amazonaws.com/0/212450/13ec4cee-b25d-bd61-0881-6d6f987118bb.png)


ブラウザを起動して
http://localhost:9000
にアクセスして下記の画面が表示されればOKです。
![scala003.png](https://qiita-image-store.s3.amazonaws.com/0/212450/818e2cf2-bce3-9112-d0d8-84de52ecec5d.png)

### 統合開発環境インストール
統合開発環境（IDE）をインストールします。
有名所だとEclipseかＩｎｔｅｌｌｉＪになるかと思います。
普段はEclipseを使っているのですが、今回は使ったことのないIntelliJをインストールして使用してみようと思います。

下記のサイトからダウンロードします。
https://www.jetbrains.com/idea/
今回はフリー版をダウンロードします。
![scala004.png](https://qiita-image-store.s3.amazonaws.com/0/212450/43e43fef-e42b-a1a4-0011-8dd6eec18101.png)

インストールが完了したら次のステップに行きます。
画面キャプチャを取り忘れてしまいましたが、初回起動時にScalaのプラグインなど初期設定をする必要があります。
直感的にわかりやすいと思うので特に躓くことなく進めると思います。
必要に応じてググって頂きますようお願い致します。

### プロジェクトのインポート
IntelliJを起動して「Import Project」を選択します。
![scala005.png](https://qiita-image-store.s3.amazonaws.com/0/212450/e2f96995-4137-cbf2-a470-812b9f3f84b6.png)
先程作成したプロジェクトのフォルダを選択して次に進みます。

「SBT」を選択して次に進みます。
![scala006.png](https://qiita-image-store.s3.amazonaws.com/0/212450/c0b04d43-bd7e-4350-f1f0-c53beb361009.png)

「Project　JDK」にある「New」ボタンを押下してOKを押下してください。
画面のようにデフォルトでJDKが設定されます。
Finishボタンを押下したら作成完了です。
![scala007.png](https://qiita-image-store.s3.amazonaws.com/0/212450/eae4112d-608b-23fd-9051-cf15773acb15.png)


以上で環境構築完了です。
いよいよ開発できる準備ができたわけですが、これからどうしようといった感じです（汗）
とりあえずHello Worldかなぁ・・・・
何をどうすればいいんだろ・・・

何かよくわかんないけど引き続きがんばります！
また何か進んだらまた記事にするかもです。

以上、読んで頂きありがとうございました！
私のrailsインストールエラーの解決方法は"sudo"

#目的
rails のインストールです。

#railsインストールのために使った参考サイト
https://qiita.com/yu-yan/items/6e693caf23054c6ba9a1
こちらのサイトです。

上から順番にやっていき、肝心なrailsのインストールができず躓いていたのですが、解決したので私の失敗と解決方法を備忘録として残しておきます。

#railsのインストールとエラー

インストールコマンド
```$ gem install rails
```
↓

```While executing gem ...(Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.```

というエラーを吐かれました。

なので上記のエラーをそのままコピペして検索したところ、こちらのサイトが出てきたので、参考にしてみることに。

→https://teratail.com/questions/74708

このサイトを見て、いろんなコマンドを打ってみましたが、うまくいかず…

##できなかった理由

そもそも、このサイトの質問者と私の解決したい問題が異なっていたため、このサイトの解決方法を実行したところで解決するはずがなかった。

この質問者さんの実行したかったことは”bundler”のインストール、私の実行したかったことは”rails”のインストールです。

この質問者さんの問題に関する解決策の提案の１つに 

```
$ sudo gem install bundle
```

という、管理者として実行するために"sudo"をつけるということがあったのですが、私もこちらが解決策の１つだったようです。

##できた操作方法

```
$ sudo gem install rails
```

私も管理者権限がなかったようで、こちらのコマンドを打つことで解決できました。

たった一行のためにこれだけ悩んでしまったのですが、勉強になりました。

#管理者権限を持てるようにしたほうがいいのか？

どうやら、"sudo" というものをつけないとできないものがあるということを理解しました。それでは管理者権限を持てるように設定しておいたほうが面倒でないのでは？

と思い、こちらのサイト（https://support.apple.com/ja-jp/HT204012）
をのぞいてみました。

こちらでは詳しく載せませんが、

>ルートユーザを有効にする代わりに、ターミナルで sudo コマンドを使った方が安全です。

と書いてあったので、設定は変えない事にします。

ルートユーザを有効または無効にする方法を知りたい方は、こちらのサイト（https://support.apple.com/ja-jp/HT204012）
を覗いて設定してみてください。

#この一件より学んだ事

エラー文をコピペして検索するのはいいが、質問者の解決したいことと、自分の解決したいことが一緒とは限らない。

解決コマンド等は参考程度にとどめておくこと！

#最後に

こちらの記事は本当に冗長な文になってしまい申し訳ないです。
備忘録ですが、どなたかの参考になれば幸いです。

以上
antってなんだ

#antとは
（蟻じゃないほうで）
**Apache Ant**のこと。
##Apache Ant (アパッチアント）
- ビルドツールソフトウェアのこと
- XML文書でビルド（ソフトウェア構築）のルールを記述する

###特徴
- 特定の環境に依存しにくい
- GNU make のJava版ともいえる
- 元々 Apache Tomcat をビルドするために開発されたもの
- 統合開発環境EclipseにはAntプラグインが標準で内蔵



>参考
[Wikipedia](https://ja.wikipedia.org/wiki/Apache_Ant)
「Raspberry Pi Zeroと カメラモジュールで作るライブ配信実験機」の話をしました

先日開催された[Streaming Conference #2](https://streaming-lab.connpass.com/event/79586/)で「Raspberry Pi Zeroと カメラモジュールで作るライブ配信実験機」の話をしました。

発表資料のリンク: https://www.slideshare.net/tetsu.koba/raspberry-pi-zero-94974456

録画: https://freshlive.tv/tech-conference/205662
(開始後20分くらいから私の発表)

説明の中で使ったコードはgistに貼りました。
https://gist.github.com/tetsu-koba/302e2d5ef96ca6001fba541f8eda8be2

# 補足説明

## 専用のカメラモジュールを使おう

カメラモジュールを買うのをためらってずっとUSBのWebcamで試していたのですが、これだと性能が出ないです。640x480 20fps くらい。専用カメラモジュールだと1920x1080 30fps できます。

## 設置方法

今回は100均で売っている大型の洗濯バサミで挟んで固定しました。

## いきなり電源を切ってもファイルが壊れにくくする工夫

今回は録画機能は無いので、動作中にファイルへの書き込みはありません。なのでffmpegを動かすループに入る前に/ と /boot をread only でremountしています。
唯一、fifoを/tmpに作成するので、/etc/fstab に追加で /tmp をtmpfsにマウントするようにしています。

本格的にやるなら、私ならRasbianを使わずにBuildrootで必要なものだけを入れたルートファイルシステムを作りますが、今回はこれくらいで。

## Raspberry Pi Zero以外を使うときは

ラズパイ2や3でも共通に使えます。
ただし、LEDに関してはZeroは他のシリーズと違ってON/OFFが反転しているので、それだけ修正してください。

## できる人はケースを自作したら？

ラズパイゼロのケースセットのケースはコンパクトなのですが問題もあります。
- ピンヘッダのピンを切らないとカメラ用のフタがしまらない
- フタを閉めるとLEDが見えないので動作状況がわからない
- ケースにいれたままだとマイクロSDカードの抜き差しができない

一時期はケースセットしか入手できなかったのですが、この前に秋葉原の秋月をのぞいたらラズパイゼロを単体販売していました。
工作できる人はオリジナルのケースを作ったほうが楽しめそうです。
Ruby で OpenID Connect の JWT を検証する

# Ruby で OpenID Connect の JWT を検証する

[AzureAD B2Cのススメ](https://qiita.com/yossy6954/items/8d9404536a649c45ef45) と関係あるような無いような記事。

Rails でユーザ管理とまではいかないものの API のアクセス制限をしたかったのでちょっと書いてみました。
直接ペタろうかとも思いましたが今まで Gist を使った事がなかったのでこれを機会に使ってみました。

https://gist.github.com/yossy6954/f66205d3eeab16b4ba5d6961fdac4563

一旦バリデーション無しで JWT をデコードしてからIDプロバイダ側の公開鍵をもってきてバリデーションする必要があります。

Qiitaって Gist のソース埋め込みは使えないんですね。ちょっと残念。

## OPENID_CONFIGURATION_URL について

![3-openid-configuration-url.png](https://qiita-image-store.s3.amazonaws.com/0/246831/55701ad3-1c50-1c57-2b1d-04ab55765b9c.png)

OPENID_CONFIGURATION_URL は AzureB2C の場合ポータルのポリシーの詳細を開いた時に出てくるURLになります。

## 参考

http://muziyoshiz.hatenablog.com/entry/2017/03/20/213526

ここの実装を参考にしました。
uWSGI と Nginx の設定でsocketエラーが発生したのでメモ


#uWSGI と Nginx の設定でsocketエラーが発生したのでメモ
>flask を uWSGI と Nginx でデプロイする
>https://qiita.com/ekzemplaro/items/a570f79de254428a151d

この記事を参考にpython3系(virtual-env)＋flask＋uWSGI+Nginxの環境構築していたら躓いたので共有
##前提
- Ubuntu 16.04LTS
- Python 3.6

上の記事のように一通り必要なパッケージはインストールしてあること

ちなみにuwsgiコマンドはデフォルトだと、ビルトインのpythonのバージョン(おそらく2.7)を使うので
python3系を使いたい人はvirtual-env上で作るのが楽かと

##状況

まず、上の記事の手順通りに構築を行い
途中の

>uwsgi を動かす

>```bash
>uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
>```

というところまではページが表示された

##エラー発生
しかし、最後のnginxの設定を終えたあと、クライアントで確認したところ
**503 Bad Gateway**
これが表示された

```
tail -f 100 /var/log/nginx/error.log
```

logを確認したところ
**1 connect() to unix:/home/pomcho555/myproject/myproject.sock failed (2: No such file or directory)**

socketファイルがないよって怒らたので自前で作成することにする

```
touch /home/pomcho555/myproject/myproject.sock
```
nginx再起動

```
systemctl restart nginx
```
なんとか元記事の通り表示されたのでとりあえずOK
![nginx-confirm.png](https://qiita-image-store.s3.amazonaws.com/0/250600/0b116b3b-a6be-74b4-79fd-835ea0bcfeea.png)

##幕間
なぜ表示されないかは未だに不明
MySQLやRailsでも同様のことが発生するようだが今回の場合の原因は特定できなかった
>https://cre8cre8.com/rails/nginx-privatetmp-with-unicorn-rails.htm

*分かる人いたら教えてください！*:joy:


##参考
https://qiita.com/ekzemplaro/items/a570f79de254428a151d
https://qiita.com/kanohisa/items/564035efd74d9c75bdcb
NativeScript + Vue.jsメモ書き

NativeScript + Vue.jsメモ書き

# インストール
1. https://nativescript-vue.org/en/docs/getting-started/installation/
2. https://nativescript-vue.org/en/docs/getting-started/quick-start/

# NativeScriptプラグイン
https://market.nativescript.org/
プッシュ通知やチャートのUIなどをプラグインできる

## ~~Windowsでビルドした場合に動作しない問題~~(修正されてた)
~~次のプルリクを反映すると動作する~~
~~https://github.com/nativescript-vue/nativescript-vue-externals/pull/4~~

## チュートリアル
https://nativescript-vue.org/en/docs/getting-started/nativescript-plugins/

## チャート
  1. npm install nativescript-ui-chart --save
  2. Playgroundのchart-directive.jsのコードを参考にVueに登録する ![image.png](https://qiita-image-store.s3.amazonaws.com/0/63081/55107406-34fa-3336-6143-0be8b3f3ce9b.png)

  3. templateでの使い方はPlaygroundのコードを参考に

## プッシュ通知
  1. npm install nativescript-push-notifications --save
  2. 後はここ参考 https://market.nativescript.org/plugins/nativescript-push-notifications

## ローカル通知
  1. npm install nativescript-local-notifications --save
  2. 後はここ参考 https://market.nativescript.org/plugins/nativescript-local-notifications

# NativeScript API

## ドキュメント
- https://docs.nativescript.org/api-reference/globals
- https://docs.nativescript.org/cookbook/
  - ファイル操作 https://docs.nativescript.org/cookbook/file-system

## ~~一部APIがimportできない問題~~(修正されてた)
~~次のプルリクを反映すると動作する~~
~~https://github.com/nativescript-vue/nativescript-vue-externals/pull/4~~

# Playground 
https://play.nativescript.org/
お試しでweb上でUIを作ることができる。
一度QRコードで読み込んでおけば、変更が即座に実機に反映される。