OmniAICreator/Qiita-1.07M huggingface dataset:
djangoバージョン

Djangoは環境依存しているモジュールが多々あり、バージョンにより処理が稼働しない可能性がある為、設定環境を書いておくことにしました。

#Python3.6.8
　理由：一部pcではtensorflowが正常に稼働しない場合がある為

#django2.2.4
　まずdjango2.1以下だと以下のように存在しない親ノードを見に行きエラーが出る場合があります。

djangoエラー　

```
django.db.migrations.exceptions.NodeNotFoundError: Migration app.0001_initial dependencies reference nonexistent parent node ('auth', '0011_update_proxy_permissions')
```

しかしdjango2.2でも以下エラーが発生するケースがあります。

#systemctlでエラー　sqlからMariaDBへ

サーバー上でsystemctlするとエラーが発生

```
sudo systemctl status hoge.com
```

エラー内容

```
$ sudo systemctl status hoge.com
    ● hoge.com.service - hoge.com
       Loaded: loaded (/etc/systemd/system/hoge.com.service; disabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since 火 2019-08-27 13:58:15 JST; 14s ago
      Process: 9245 ExecStart=/usr/local/bin/gunicorn --bind 127.0.0.0:8000 hogehogehoge.wsgi:application (code=exited, status=3)
     Main PID: 9245 (code=exited, status=3)
     
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp gunicorn[9245]: check_sqlite_version()
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp gunicorn[9245]: File "/usr/local/lib64/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 63, in check_sqlite_version
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp gunicorn[9245]: raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp gunicorn[9245]: django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp gunicorn[9245]: [2019-08-27 13:58:15 +0900] [9249] [INFO] Worker exiting (pid: 9249)
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp gunicorn[9245]: [2019-08-27 13:58:15 +0900] [9245] [INFO] Shutting down: Master
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp gunicorn[9245]: [2019-08-27 13:58:15 +0900] [9245] [INFO] Reason: Worker failed to boot.
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp systemd[1]: hoge.com.service: main process exited, code=exited, status=3/NOTIMPLEMENTED
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp systemd[1]: Unit hoge.com.service entered failed state.
     8月 27 13:58:15 tk2-401-41950.vs.sakura.ne.jp systemd[1]: hoge.com.service failed.
```

```
raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)
     8月 27 13:58:15 hoge-444-44444.hoge.ne.jp gunicorn[9245]: django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
```

#解決方法
解決方法は２つあります。

#１．django2.2を利用する
　これはSQLiteのバージョンが古いために起きているので、MariaDBを導入しdjango2.2系で稼働するように設定しましょう

#２．django2.1にダウングレードする
　pip3 install django==2.1.xxxx --user

#　MariaDB　5.5.60
mysql  Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
LinuxでAndroid端末を認識しないときにやったこと

UbuntuでAndroid開発をしていた際にハマったので備忘として残しておきます。

## 起きたこと

USBにPixel3を接続しても、デバッグ接続ができない。

```shell
$ANDROID_HOME/platform-tools/adb devices

XXXXXXXX    no permissions (user in plugdev group; are your udev rules wrong?); 
see [http://developer.android.com/tools/device.html]
```

## 対応方法

設定がない場合は、以下の内容のファイルを作成する
`/etc/udev/rules.d/51-android.rules`

```shell
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
```

権限を追加（必要があれば）

```shell

chmod a+r /etc/udev/rules.d/51-android.rules
```

端末を繋ぎ直せば認識される

```
$ANDROID_HOME/platform-tools/adb devices

XXXXXXXX    device
```
djangoエラー　django.db.migrations.exceptions.NodeNotFoundError: Migration app.0001_initial dependencies reference nonexistent parent node ('auth', '0011_update_proxy_permissions')

djangoで以下のようなエラーが出た場合は、存在していない親ノード(今回の場合はauth)を参照している可能性があります。

```
django.db.migrations.exceptions.NodeNotFoundError: Migration app.0001_initial dependencies reference nonexistent parent node ('auth', '0011_update_proxy_permissions')
```

そんな時は、djangoのバージョンを2.2以上にグレードをあげるとなおる可能性があります。今回の場合は2.2.4

#1　djangoバージョンを2.2.4へあげて

```
pip3 install django==2.2.4 --user
```


#2　manage.pyがある場所でrunserverを実施します。

```
python manage.py runserver
```

無事runserverやmigrateが通りました。

```
C:\Users\hoge\Desktop\hoge\hoge>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
August 27, 2019 - 08:15:33
Django version 2.2.4, using settings 'hoge.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```

#３補足　

参考までにエラー一覧を掲載しておきます。

```
Performing system checks...

System check identified no issues (0 silenced). Unhandled exception in thread started by .wrapper at 0x0000029C0D0D3EA0> Traceback (most recent call last): File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\utils\autoreload.py", line 225, in wrapper fn(*args, **kwargs) File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\core\management\commands\runserver.py", line 120, in inner_run self.check_migrations() File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\core\management\base.py", line 442, in check_migrations executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\db\migrations\executor.py", line 18, in init self.loader = MigrationLoader(self.connection) File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\db\migrations\loader.py", line 49, in init self.build_graph() File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\db\migrations\loader.py", line 273, in build_graph raise exc File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\db\migrations\loader.py", line 247, in build_graph self.graph.validate_consistency() File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\db\migrations\graph.py", line 243, in validate_consistency [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)] File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\db\migrations\graph.py", line 243, in [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)] File "C:\Users\hogeuser\AppData\Roaming\Python\Python36\site-packages\django\db\migrations\graph.py", line 96, in raise_error raise NodeNotFoundError(self.error_message, self.key, origin=self.origin) django.db.migrations.exceptions.NodeNotFoundError: Migration app.0001_initial dependencies reference nonexistent parent node ('auth', '0011_update_proxy_permissions')
```
Unity：UI Elements でマウスのクリックイベントを取得する


# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

今回は「[いくつかサンプル書いたよ](https://www.fast-system.jp/unity-ui-elements-samples/)」の記事の１つ「 画像をパラパラ漫画風に動かす 」を解説したいと思います。
ぜひ、お付き合いいただければと思います(#^^#)

# UI Elementsとは？

[こちらの記事](https://www.fast-system.jp/unity-uielements-howto/)をご参照いただければと思います。

# マウスイベントの取得方法

通常ではマウスイベントは、Button.Clicked とかのボタンが***デフォルト定義してくれているイベント***を使いますが、
今回ご紹介するのはもっと***汎用的な低レベルな感じの実装***になりますので***様々なコントロールでマウスの移動・クリックなどのイベントが実装***できます。

それでは、マウスイベントの実装をしてみたいと思います。

***Editor フォルダを作成***し、右クリックのメニューから***「UIElements Editor Window」を選択***してください。

![image-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/056ec77a-7255-a7cf-12e2-9987c4f926ee.png)

「Sample3」を入力してください。

![image-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/de30361a-5471-f3f2-f941-096b33f6e97c.png)

次に、Sample3.cs を以下のように変更してください。

```c#:Sample2.cs
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;


public class Sample3 : EditorWindow
{
    [MenuItem("UIElementsSamples/Sample3")]
    public static void ShowExample()
    {
        Sample3 wnd = GetWindow<Sample3>();
        wnd.titleContent = new GUIContent("Sample3");
    }

    public void OnEnable()
    {
        VisualElement root = rootVisualElement;

        root.AddManipulator(new MouseEventLogger());
        root.Add(new Label() { style = { backgroundColor = Color.yellow }, text = "output console log!" });
    }

    class MouseEventLogger : Manipulator
    {
        protected override void RegisterCallbacksOnTarget()
        {
            target.RegisterCallback<MouseUpEvent>(OnMouseUpEvent);
            target.RegisterCallback<MouseDownEvent>(OnMouseDownEvent);
        }

        protected override void UnregisterCallbacksFromTarget()
        {
            target.UnregisterCallback<MouseUpEvent>(OnMouseUpEvent);
            target.UnregisterCallback<MouseDownEvent>(OnMouseDownEvent);
        }

        void OnMouseUpEvent(MouseEventBase<MouseUpEvent> evt)
        {
            Debug.Log("Mouse Up " + evt + " in " + evt.propagationPhase + " for target " + evt.target);
        }

        void OnMouseDownEvent(MouseEventBase<MouseDownEvent> evt)
        {
            Debug.Log("Mouse Down " + evt + " in " + evt.propagationPhase + " for target " + evt.target);
        }
    }
}
```

## 動作結果

どうでしたか簡単に実装が行えたと思います。
Unityのメニューから、「UIElementsSamples -> Sample3」を選択して実行を確認してみてください。

![image-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/68826d8f-5662-fcdd-b17c-21f44539fba5.png)

![sample3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/af425f6f-632d-5e90-1280-e951e488c450.gif)


# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
react-syntax-highlighterのstyleを見比べるサンプルページ作った

Reactで画面上にソースコードを載せるときにシンタックスハイライトをしてくれるパッケージ「react-syntax-highlighter」のstyleを見比べる為のページを作ったので紹介。

# 作ったもの

https://k8shiro.github.io/ReactCompareCodeHighlighter/

こんな感じで動きます。
![captured.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/e055e852-fa59-5896-9beb-01a43635030b.gif)

## react-syntax-highlighter
[react-syntax-highlighter](https://www.npmjs.com/package/react-syntax-highlighter)は上記の通りソースコードのシンタックスハイライトをいい感じにしてくれるReact用のパッケージです。以下のように、languageとstyleを指定して使用します。

```
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
import { dark } from 'react-syntax-highlighter/dist/esm/styles/prism';
const Component = () => {
  const codeString = '(num) => num + 1';
  return (
    <SyntaxHighlighter language="javascript" style={dark}>
      {codeString}
    </SyntaxHighlighter>
  );
};
```

languageとしてはpython、javascript, json等様々な形式に対応しているようで、また、シンタックスハイライのstyleとしてgithub風やxcode風等かなり多くのstyleがあります。今回は言語ごとにスタイルをいっぺんに見比べられるサンプルページを作りました。

## その他

このサンプルページはGithub Pagesで公開しています。
build前のソースコードは[こちら](https://github.com/k8shiro/ReactCompareCodeHighlighter)です。
webarenaでubuntu その35

#概要

webarenaでubuntu18.04やってみた。
apache2.4,php7.2やってみた。
imgのcorsやってみた。

#サンプルコード

```
<?php
	header("Access-Control-Allow-Origin: *");
	header('Content-type: image/png');
	$fp = fopen("./png/test.png", "r");
	while (!feof($fp))
	{
		$line = fgets($fp);
		print($line);
	}
	fclose($fp);
?>
```

#サンプルコード

```
<html>
  <head>
    <link rel="stylesheet" href="style.css">
    <script src="//code.jquery.com/jquery-1.8.3.min.js"></script>
  </head>
  <body>
    <h1>Hello Plunker!</h1>
    <img src="http:///test22.php" alt="" crossOrigin="anonymous">
    <script>
$(window).load(function() {
    $("img").each(function() {
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext("2d");
        var img = new Image();
        img.crossOrigin = ''; 
        img.src = $(this).attr("src");
        canvas.width = img.width;
        canvas.height = img.height;
        ctx.drawImage(img, 0, 0);
        var pixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
        for (var y = 0; y < pixels.height; y++) 
        {
            for (var x = 0; x < pixels.width; x++)
            {
                var i = (y * 4) * pixels.width + x * 4;
                var rgb = parseInt((pixels.data[i] + pixels.data[i + 1] + pixels.data[i + 2]) / 3, 10);
                pixels.data[i] = rgb;
                pixels.data[i + 1] = rgb;
                pixels.data[i + 2] = rgb;
            }
        }
        ctx.putImageData(pixels, 0, 0, 0, 0, pixels.width, pixels.height);
        $(this).attr("src", canvas.toDataURL());
    });
});
</script>
  </body>
</html>
```

#成果物

https://embed.plnkr.co/VkCRzbrKjMqx4vpYzvbw/

以上。
マイクロフロントエンドにおけるCI/CD戦略

# マイクロフロントエンドのCI/CD戦略

マイクロフロントエンドでCI/CDパイプラインを構築する上で、どのようにパイプラインを構成すべきかを検討します。

## 前提

以下のサンプルアプリケーションで、CI/CDパイプラインを構成することを前提とします。

[tmiyajima-sunarch/microfrontend](https://github.com/tmiyajima-sunarch/microfrontend)

なお、上記サンプルでは、すべてのアプリケーションを1つのリポジトリに含めていますが、
実際は、アプリケーションごとにリポジトリを分けて、アプリケーションごとにCI/CDパイプラインを構成することになると思います。

## パイプラインの流れ

パイプライン全体としては、通常のマイクロサービスと同様、以下のような流れになると思います。

![CI CDパイプライン](https://www.plantuml.com/plantuml/svg/0/XL9DIyD04BtdLomvwK64_W0fr1xy5IKrQn7IR4Ws1szc1web5OsYWXv4aHQhjeBW5yK_CyJaPxYxIhF5WuU5nynxRzumMu-u4_Auwv76ncfZ7I53SOjmZd2dmRCLqatk-1sF4eGJX7k4Fd4YqewtFNUXEKH84G1X7w67ubq2HOovoLBb7i8CnPiqH_64iAV7FSfnYkxIm6CxhOXt35cprbpmf3LgTErV0zX5CKNnYZ2ItlbHXaaspspFGxU2aBd_oirSIr_zD4zFyybLUJrOjesOGUXQbdObAsjgrPWhO2nHGTLGmULJqCXIGKEihNt6AMappbcNi2qjBoudvV2ikFaenmSMzLsYE7-OXdl-EIXUBZ2P_co1oKYVQ8pYGH_YE9_9uc7bLPT8_eXl "CI CDパイプライン")

上記のビルドやユニットテストのステップに、フロントエンド部分のビルドやユニットテストも含めて実行することになると思います。

### マイクロフロントエンドのユニットテスト

マイクロフロントエンド部分のテストに関しては、通常のフロントエンドのテスト手法に則り、
以下のような手法でテストすることになると思います。

- [karma](http://karma-runner.github.io/latest/index.html)によるブラウザでのテスト
- [Jest](https://jestjs.io/ja/)等のテストフレームワークによるテスト

karmaの場合は実ブラウザが存在する環境でテストする必要があり、CI環境が制限されてしまうため、
できる限りテストフレームワークを用いたテストができるようにしたほうがいいです。
そうなると、jQueryやDOMを用いたテストは困難になってくるため、
モダンなフロントエンドライブラリ（Vue.js、React、Angularなど）で作成されていたほうが、有利な点が多いと思います。

### コンテナアプリケーションとの互換性の担保

マイクロサービス間の互換性担保のためには、[Spring Cloud Contract](https://spring.io/projects/spring-cloud-contract)や[Pact](https://docs.pact.io)などの、
Consumer Driven Contractテスト（以下CDCテスト）の手法が使われることが多いと思います。

マイクロフロントエンドにおいても、コンテナアプリケーションをConsumerと見立てたCDCテストができればいいのですが、
現状は以下の点から、自動テストに組み込んで実現するのは困難と考えています。

- 実ブラウザでのテストが必要になる
- レイアウトは目視確認が必要
- マイクロフロントエンドでCDCテストを実現している実例がない

結局この点に関しては、ステージング環境でのE2Eテスト、目視確認が必要になると思います。
そのため、各マイクロサービスのユニットテストを充実させることよりも、
Selenium等を用いたE2Eテストを充実させることを考えるのも、一つの方法となりそうです。

## まとめ

- マイクロフロントエンドでも、CI/CDのパイプラインは、通常のマイクロサービスと大きくは変わらない
- UIの確認を含むため、E2Eテストでの目視確認は必須になりそう
- E2Eテストの自動化を充実させるのも一つの手段

## 参考サイト

- [Karma(公式)](http://karma-runner.github.io/latest/index.html)
- [Jest(公式)](https://jestjs.io/ja/)
- [step by stepで始めるKarma](https://qiita.com/howdy39/items/b9d704e7f84053924da3)
- [Vueでunitテストをする為の基礎基礎メモ](https://nogson2.hatenablog.com/entry/2019/01/30/175723)
- [Pact(公式)](https://docs.pact.io)
- [Spring Cloud Contract(公式)](https://spring.io/projects/spring-cloud-contract)
Windows上にVirtualBox+Vagrant+Ubuntuでローカル開発環境を構築する

# Windows上にVirtualBox+Vagrant+Ubuntuでローカル開発環境の土台を構築する

## 前提条件

- 窓

## 準備

### VirtualBoxのダウンロード

ダウンロードURL
Windows版をダウンロードしてインストール

https://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

### Vagrantのダウンロード

同様にWindows版をダウンロードしてインストール

https://www.vagrantup.com/downloads.html

## 環境構築

### Ubuntuのダウンロード

~~18.4LTSが公開されてることに勘づいてはいけない（戒め）~~

（2019/09/04 追記：18.4LTSに対応済）

vagrant initする。

```
.\vagrant> vagrant init bento/ubuntu-18.04
```

## Vagrantfileの修正

IPなどは任意で、どうぞ。

```
Vagrant.configure("2") do |config|

  config.vm.box = "bento/ubuntu-18.04"

  config.vm.network "forwarded_port", guest: 3000, host: 3000

  config.vm.network "private_network", ip: "192.168.33.10" #コメントアウト
  config.vm.synced_folder "./", "/vagrant", nfs: true #修正

end
```

## Ubuntuの起動と接続

Vagrantの起動

```
.\vagrant> vagrant up
```

ssh接続

```
.\vagrant> vagrant ssh
```

ssh接続終了

```
$ exit
```

vagrantの終了(?)
2行目のように表示され、コマンド入力待機状態になったら完了。

```
.\vagrant> vagrant halt
==> default: Attempting graceful shutdown of VM...

.\vagrant>
```

## 毎回/Vagrantディレクトリまで移動するの面倒

vagrant sshしたときに、カレントディレクトリが `/Vagrant` ではなく面倒だと怒る憤怒兄貴のために。

### macrosにdoskeyの設定を書き込む

doskeyにコマンドを設定

```
.\vagrant> doskey vu=vagrant up
.\vagrant> doskey vssh=vagrant ssh -c "cd /vagrant; bash"
```

macrosに書き込む

```
.\vagrant> doskey /macros > %USERPROFILE%\macros.txt
```

### コマンドプロンプトの設定

コマンドプロンプトショートカットのリンク先にdoskeyの設定（macrosの読み込み）を追記する。

```
%windir%\system32\cmd.exe
↓
%windir%\system32\cmd.exe /k doskey /macrofile=%USERPROFILE%\macros.txt
```

以降、 `vssh` というコマンドでssh接続することで、カレントディレクトリが `/vagrant` に。

これでログイン出来たらUbuntu自体の設定は完了。

## 参考

https://qiita.com/ikuyamada/items/f647bd5a54168a67eea4

https://qiita.com/teradonburi/items/660b4b59ff1a5c6765de

https://qiita.com/maikya_gu/items/4b6a9bf29b2bf3c89a2f

https://sanabo.com/words/archives/2014/08/post_3257.html

https://www.adminweb.jp/command/command/index2.html
Web APIって便利すぎない？？？

#Web APIとはなんぞや？

どうも、ぽんぽこです。

前回の記事で大まかにAPIとは何か。イメージは掴んでいただけましたか？
今回は、APIはAPIでも「Web API」について少しでもご理解していただけたら幸いです。

ご指摘やこうしたらもっと読みやすいんじゃない？などご意見お待ちしております！！

では、本編へ。

####そもそもWeb APIとは？

1つの機能に特化したプログラムで共有可能なものやソフトウェアの機能を共有する仕組みを
Web APIと言うそうだ。

とにかくめちゃめちゃ便利！！！
だからWeb APIを使っている企業は世界中に恐ろしいほどあります。

前回の記事で記述した通り、
Amazon、Facebook、Twitter、Google、ぐるなび、楽天などだ。


####ではなぜわざわざWeb APIを使用するのだろうか？

答えは単純明快。

- 異なるプログラミング言語で開発されたアプリケーション間を連携させることが可能。
- Webを経由しているので最新情報を取得できる。
- バグ修正などの運用コストも必要がない。
- 多くのWeb APIは無料で公開されている。

デメリットが思いつかないぐらいのメリットの多さ。

実際にデメリットを調べてみたが全然見当たらない。。。
（デメリットを知っている方がいらっしゃったら教えてください。）

メリットばっかりですごい！！！
使いたい人は全員使えるの？

これらのメリットの前では、使用不可避。

Web APIの使用に必ず必要なものがある。

それは、、、

###「APIキー」と「APIシークレットキー」だ！！！

これは、APIを提供しているサイトに登録した際に発行されるので
これを使用してWeb APIを使用しなければならない。

APIキーとはそのアプリのIDで
APIシークレットキーとはパスワードだ！

以上の２つがなければなぜできないの？？？と一晩中悩むことになりますよ。。。

> 最後に、すごくわかりやすい図があったので引用させていただきます。
<img width="427" alt="スクリーンショット 2019-08-27 4.55.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484836/149eb709-9ce9-72a5-fbfa-6f7d0083e5dd.png">


では、最後まで読んで頂きありがとうございます！！

また次回！
Ubuntu + mysql5.7 + adminer ではまる

adminerで
Access denied for user 'root'@'localhost'
がでて入れずにはまった。解決策は以下で。

```
grant all privileges on *.* to root@'localhost' identified by 'ぱすわーど';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ぱすわーど';
flush privileges;
```
DockerでRedisのログファイルをVolumeマウントしてコンテナ起動する方法

AmazonLinux2 

```../redis-build/Dockerfile
FROM redis:5.0.5

RUN mkdir -p /var/log/redis
RUN touch /var/log/redis/redis.log
```

```docker-compose.yml
version: '3.7'
services:
  redis:
    container_name: redis
    build: ./redis-build
    ports:
      - 6379:6379
    command: redis-server --logfile /var/log/redis/redis.log
    volumes:
      - ./log:/var/log/redis
```

```
$ mkdir log
$ chmod 777 log
$ docker-compose up -d
$ ls -l ./log

total 8
-rw-r--r--. 1 999 render 1259 Aug 26 18:12 redis.log
```
## 2019/8/29追記

docker-compose.ymlだけでもできました

```docker-compose.yml
version: '3.7'
services:
  redis:
    container_name: redis
    image: redis:5.0.5
    ports:
      - 6379:6379
    command: >
      bash -c "mkdir -p /var/log/redis && 
      touch /var/log/redis/redis.log && 
      redis-server --logfile /var/log/redis/redis.log"
    volumes:
      - ./log:/var/log/redis
```

```
$ mkdir log
$ chmod 777 log
$ docker-compose up -d

$ ls -l ./log
合計 4
-rw-r--r-- 1 root root 1678  8月 29 00:54 redis.log
```
End-to-End Machine Learning with TensorFlow on GCPを受講した話

# 3行で
https://www.coursera.org/learn/end-to-end-ml-tensorflow-gcp?specialization=advanced-machine-learning-tensorflow-gcp
Advanced Machine Learning with TensorFlow on Google Cloud Platform Specializationという一連のコースの1番目
GCPを使った基本的な機械学習プロジェクトの進め方を一通りさらえる

# どんな人におすすめか
必須
・英語字幕で動画が理解できる
・クラウドサービスと機械学習に興味がある（触ったことがなくてもOK）

推奨
・SQLを触った事がある（SELECT, WHERE, GROUP BYの意味ぐらいわかればいい）
・オンプレの計算資源に依存しない機械学習システムを構築したい問題意識がある
・GCPの基本的な機能を使える
（不足を感じたらGoogle Cloud Platform Fundamentals: Core Infrastructureを受講するぐらいで大丈夫そう）

不適
・クラウドサービスを完全に理解しているマン
・どうしてもAWSしか使いたくないマン
・機械学習のモデリング部分にしか興味がない人
・機械学習の実際のプロジェクトを何度も回したことがある人

# どんなコースか
GCPを使った基本的な機械学習プロジェクトの進め方を一通りさらう内容になっています。
公開されてる出産時の妊婦と新生児のデータを使って、出産前に新生児の体重を予測するサービスを構築する仮想のプロジェクトをベースに、
・どんな特徴量をつかうか
・どうやって（ごくごく単純に）モデルを構築するか
・構築したモデルをスケールアウトするには
・機械学習モデルをwebサービスとして提供するには
のような流れになっています。

6つ（+1つのオプション）のQwikLab実習があって実際にコードを書きながら学習することができます。

Specializationのあとに続くコースの基礎になっています。
あとに続くコースはより「質の高い」機械学習システムを構築する上で覚えるべきことが続きます。


# 感想など
実習も結構おんぶにだっこ感はあるけど、完全にお膳立てされてるわけでもなく、自分の裁量で考えてすすめる余地のあるものだった点は面白かった。
例えば、どんな特徴量をモデルに入れるべきか探索する実習では、一応お膳立てされた正解はあるものの、自分であれこれの特徴量を試すことができる。
あえて指示から脱線して自由に遊んでみるとより面白いし学べるんじゃないだろうか。
受講者の負担は時間とcourseraの受講料だけで、GCPの利用料が追加でかかるわけじゃないし、実習は何度も再受講可能だしね。

機械学習を実際のビジネスとして運用するまでに必要なことのうち、モデリングが占める割合なんてめちゃくちゃ少ないなとは常々思っていたけども、ここまで受講してようやく一通りさらえた感じがある。
コースの実習で使う素材はgithubで公開されているし、自分で機械学習プロジェクトを遂行する際にも大いに参照できる。
https://github.com/GoogleCloudPlatform/training-data-analyst

クラウドサービスを使うからまあ当たり前だけど、自分で環境構築せずに開発をはじめられるのはめちゃくちゃよい。
環境つくるのって時間の無駄な上に時間食うんだよな・・・。
このコースはGCP上のAI platformでJupyterLabを使って進められる。予めtensorflowを始めとしたパッケージが入ってる環境なので環境構築をすっとばして機械学習に集中できる。

これまでTensorFlowってDNNの計算ライブラリだと思ってたんですけど、それだけじゃないんですね。
機械学習のモデリングと、モデリングのすぐ近くにあるところまでカバーされてるんだね。
GCPのDataFlowからデータ受け取るとか、GCPで分散コンピューティングしてもらうとか。


# 次は
Advanced Machine Learning with TensorFlow on Google Cloud Platform Specializationを一通り受講したい。
コードレビューに使える「7つの設計原則」

書籍「プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則」を読んだメモ

7つの設計原則とは、**障害を作り込まないために考慮すべき、コード構造上の７つの核心観点**であり、**レビューやコードを書くときの観点**になるもの

# 1. 単純原理

- シンプルにこだわる
- 高級なテクニックを使わず、単純なやり方で通す
- むやみにコードを複雑化、肥大化せずに、単純で小さいままに保つ

# 2. 同型原理

- 形にこだわる
- 例
  - あるモジュールにおいて、扱う数値の単位を統一する
  - 高階関数の引数の数を統一する
  - 関数の使用順序を統一する
- コードに一貫性を持たせる

# 3. 対称原理

- 形の対称性にこだわる
- 上があれば下、左があれば右、アクティブがあればパッシブがあるというような対称性にこだわる
- コードに対称性があれば、コードの予想がつきやすく、条件漏れに気づけたり、違和感を覚えやすい
- 対称性のあるコード例
  - 条件があれば反条件も書く
  - 命名の対称性 set/get、start/stop、begin/end、push/pop
  - 例外を排除する。例外的状況は特殊なケースであるが故に対称性を崩す。構成を見直してできるだけ排除する

# 4. 階層原理

- 構造が階層であることにこだわる
- 物事の**主従関係**、**前後関係**、**本末関係**など、階層関係を意識し、整理された関係性を構築する
- コードの各々について、抽象レベルを意識して、１つの階層は同じ抽象レベルのものだけで構成する
- 上位から中位、中位から下位、下位で実際のロジック、というふうに分割する

# 5. 線形原理

- 処理の流れは直線であることにこだわる
- スイッチでコードを制御したり、状態の数をむやすみに増やすとコードはわかりにくくなる
- 処理の分岐を少なくし、処理の流れを直線的に読めるようなコードにする
- 特殊な振る舞いを、主処理に混ぜて書かないようにする
- 処理の一貫性やルートにこだわり、時折コードを俯瞰して　複雑となっていないことを確認する
- 保守するうちに複雑になりすぎたものに関しては、再構築することも視野に入れる

# 6. 明証原理

- ロジックの明証性にこだわる
- ロジックが明瞭なコードを書くようにする
- ロジックは直感的でわかりやすいものにし、コードを読んでいる人が疑問に思うようなことは排除するかコメントする
- 誰でも同じことを想像できる用語を関数名や変数に使用する。意味のない変数名は使用しない

# 7. 安全原理

- 安全性にこだわる
- 例
  - あるif文に対してありえないと思いつつもelse文を考慮
  - あるcase文に対してありえないとおもいつつdefault句を考慮
  - ある変数に対して、ありえないと思いつつもNULLチェックを行う
- 必然性のないところや、曖昧なところは安全サイドに設計する
- すべての動作を洗い出し、それぞれが安全になるよう考慮する
- 要件・機能を理解し、場合分けをコードに正しくブレイクダウン出来ると、ソフトェアが安全に動作する確率が高くなる
- ありえないという条件でもあえて考察の対象として、設計・プログラミングする

# 参考1. コード再利用のリスク

- コードを再利用するときには、コードを本当に理解してから流用する
- ハードウェアの場合、よい設計から学び、悪い設計を避ける知恵の伝達が物理的な現物によって行われるため、その現物がさらされる環境条件に気を配れば比較的容易に流用可能
- ソフトウェアの場合、流用元のコードが、たくさんのその他のコードと相互作用を行う文脈であり、使用実績はまったく当てにできない。

# 参考2. コード障害修正のリスク

- 既存のコードを修正する場合には、再利用以上にそのコードを深く理解する必要がある
- 完全に理解しないと、考慮漏れやデグレードの危険性が高い
- 障害のケースのみを確認するのではなく、コードを完全に理解し、障害パターンを完全に理解し、仮設を立て、修正し、パターンを網羅したテストを行うことで品質を担保する
Ruby on　Rails　初級

##本日のRailsおさらい

順不同
考え方のみ。
細かなコマンドは別日

１、データベース
　　DBの中には、テーブルという物にデータが保存
　　されている。またデータをみやすくする為
　　にレコード（行）とカラム（列）などIDを作
　　って紐つける。

２、DBへのアクセス
　　DBへはモデルがやりとりを行う。
　　コントローラーがモデルに接続し、引っ張り出
　　してビューにわたす。

３、DB引き出し方
　　モデルからDB情報引き出す時は、
　　モデルの命名規則にそって行う。
　　●モデルクラス名
　　　先頭は大文字の単数形＝＞Tweet
　　　モデル作成する時は全部小文字

　　●モデルクラスのファイル名
　　　先頭は小文字の単数形＝＞tweet.rb
　　　作成してできるファイルはこれ！

　　●テーブル名
　　　先頭は小文字の複数形＝＞Tweets


４、マイグレーションファイル
　　DBにあるテーブルの設計図
　　レコード(行)、カラム(列)の表を作る所

　　●レコードは大体数字
　　　１、２、３など
　　
　　●カラムは名称が多い
　　　名前、年齢、性別など
　　　カラムは一緒に　型　も設定するよ

　　●スキーマファイル
　　　マイグレーションファイルのバージョン
　　　確認用

５、DBのテーブル編集
　　今までで、テーブル作って、テーブルに名称
　　も作ったから次は編集

　　●Sequel Pro
　　　これ使って書き込みます。
　　　以上！

　　●ターミナルでもできるよ
　　　その事をコンソールって言うねんて

６、クラスの継承
　　よーわからんからまた勉強します。
　　モデルの作成で作ったやつは全部
　　アプリケーションリコードを継承してるみたい

７、間違えてた所
　　rails c 
   コンソール起動してできることは
　　コード実行できる
　　メゾッ ド実行できる。
Si4730をArduinoで制御　DSP　ラジオモジュール

---
#はじめに
* 今回はSi4730に挑戦。アメリカの会社らしく、データシート類も公開されていて資料には困らない。逆に資料が多すぎてポイントがわかりにくい。
* DSPラジオのICは「レジスタに2バイトずつ書き込む」ことで制御することが多いが、本ICは「コマンド+引数」でコントロールするので、勝手が違って苦労した。
* Si4730はAM/FM対応ですが、今回はFMだけです。

#使用したもの
* Aitendoさんのモジュール。Si4730-M(http://www.aitendo.com/product/4768)
* IC（Si4730)のProgramming Guide　AN332。上記参照。
* IC（Si4730)のデータシート。検索してください。
* Arduino Uno互換機(ELEGOO)

#モジュールについて
* DIP化。この基板(http://www.aitendo.com/product/11032) を利用しましたが、手間がかかりました。専用の変換基板の方が使いやすいです。
![20190825_015541.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/d558864b-b128-9ae7-bf67-d815a224c29e.jpeg)


#データシートについて
* AN332は250ページもあるのですが、複数のICをまとめて記載しているため長くなっています。本ICの該当箇所だけ見れば十分です。
* AN332のP213のProgramming Exampleが参考になります。

#配線
* モジュールの説明通りにつなぐだけ。イヤフォンに直接出力可能ですが、出力コンデンサは必要です（適当な容量でOK）。 
* モジュールのRSTピン（9番ピン）は 10KΩ の抵抗を通して、3.3V につなぎました。
* RDA5807のモジュールと配線が似ています。
![Si4730.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/f64f1cae-dfa9-4143-0631-08edd1f78b2d.jpeg)

#Slaveアドレス
* I2C Scannerによると「0x63(1100011)」でした。

#I2C通信
* 本モジュールは、レジスタに書き込むスタイルではないものの、コード的には似たような形になります。レジスタ番号の代わりにコマンド、データの代わりに引数、といった感じです。
* 普通のコードで書き込めます。

#コード作成のポイント
* AN332を参照しながらコードを作成するわけだが、ICの持つ機能をすべて生かすために、AN332はやたらと細かいところまで記述してある。とりあえず、FM放送を受信することに絞りました。
* AN332のProgramming Exampleフローチャートを追っていくと、次の流れにすれば良いようだ。
    1. Power Up: ICを起動する。
    2. Get_Rev: ICの情報を読み取る。
    3. Set FM Tune Frequency: 周波数設定
    4. FM_TUNE_STATUS: 受信状況の読み取り
* 上記のうち、2.と4.は省略してもよいはず。なので、1.と3.に絞ってコードを書きました。
* Power Up: 
    * コマンドは 0x01
    * 引数1 (ARG1)は、水晶を使うので "0b00010000"
    * 引数2 (ARG2)は、音声はアナログ出力なので "0b00000101"
    * 本来はこの後、Responceを取って、ICの状態を確認すべきですが、割愛。
* Set FM Tune Frequency: 
    * コマンドは 0x20
    * 引数1 (ARG1)は、AN332の指定で "0b00000000"
    * 引数2、引数3 (ARG2,ARG3)は、設定する周波数を10kHz単位で設定。80MHzなら8000(=1F40)を2バイトに分けて書き込む。ARG2 = 1F, ARG3 = 40
    * 引数4はAN332を参照して"0b00000000"

#動作コード
* 上記のポイントを考慮して作成した、特定の周波数を書き込むシンプルなコード。コマンド2つだけ操作し、後はDefaultのままでOK。
* コマンドと引数を並べて書けばよいので、単純なコードになりました。

```
#include <Wire.h>
void setup()
{
delay(100);
Wire.begin();
Wire.beginTransmission(0X63); //slave ad
  Wire.write(0x01); //  Power up
  Wire.write(0b00010000);
  Wire.write(0b00000101);
Wire.endTransmission();
delay(200);
Wire.beginTransmission(0X63); //slave ad
  Wire.write(0x20); //  FM Freq
  Wire.write(0x00); 
  Wire.write(0x1F); // 8000 =1F40
  Wire.write(0x40); // 8000 =1F40
  //Wire.write(0x20); // 8250
  //Wire.write(0x3A); // 8250
  Wire.write(0x00);
Wire.endTransmission();
}

void loop() {
  // put your main code here, to run repeatedly:
}

```

#おまけ
* 本ICは、データシートの日付が2008年。比較的古いICなので、他のモジュールと操作方法が異なるのかな、と思いました。
* 資料は詳細で、機能も豊富にあるようなのですが、十分に活用できませんでした。
Three.jsを使ってみる①

##Three.jsとは?
three.jsは3次元コンピュータグラフィックスを描画するJavascriptのライブラリである. three.jsのページでは様々なサンプルが公開されており, 幅広い3DCGのプログラミングが可能なことがわかる.更にWebブラウザで動作するので手軽に始めることができる.

##three.jsのダウンロード
[ここ](https://threejs.org/)のdownloadからthree.jsを取ってくる.

##基本的な使い方
####three.jsを記述する場所を決める
[ここ](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene)を参考にコーディングをしていく.

```html
<!DOCTYPE html>
<html>
	<head>
		<meta charset=utf-8>
		<title>My first three.js app</title>
		<style>
			body { margin: 0; }
			canvas { width: 100%; height: 100% }
		</style>
	</head>
	<body>
		<script src="js/three.js"></script>
		<script>
			// ここにコードを書いていく
		</script>
	</body>
</html>
```

####シーンの作成

```js
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

//3DCGの描画範囲と場所を指定する
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
```
このコードでははじめにシーンを作成し, カメラを設置する.最後にレンダラーを作成する.今回はbodyに直接シーンを描画する.

####オブジェクトを置く

```js
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

camera.position.z = 5;
```
ここでは, 箱型のジオメトリ(図形)を作成し, その箱の材質をを決めてシーンに追加している.最後にカメラ位置をz軸方向に5進めている.

####アニメーションと描画

```js
function animate() {
	requestAnimationFrame( animate );
    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;
	renderer.render( scene, camera );
}
animate();

```
ここでは先程設置した箱を回転させるアニメーションの作成と, シーンの描画をしている.

####実行結果
![Screenshot from 2019-08-27 01-10-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316006/a6191688-2113-bee9-505d-4e8ab7db6352.png)

箱が回転している.

##おわりに
今回はthree.jsのチュートリアルに沿って進めていった.[ここ](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene)に使い方など詳しく書いてあるので, それを参考にしながら実際に触ることをおすすめする.続きの記事も書いていく予定.
Notifications APIを上書きしてまとめて通知する

Notificationクラスを上書きしてキューにためておく。通知を制御するExtensionなんかが作れないかなーと思ってメモ

```js
let queue = []

class MyNotification {
    constructor(title, options) {
        queue.push({title: title, options: options})
    }

    static async notify(notifications) {
        for (let i in notifications) {
            new OrgNotification(notifications[i].title, notifications[i].options)
            await new Promise(r => setTimeout(r, 1000))
        }
    }
}

OrgNotification = Notification
Notification = MyNotification

new Notification("title1")
new Notification("title2")
new Notification("title3")

await Notification.notify(queue)
```
【GAS】Spreadsheetに記載されたURLのサイトに、特定のバナー画像があるかGoogle Apps Scriptで確認する

お客さんが「SpreadsheetにあるURLリストの遷移先に、特定のバナー画像があるか一つ一つ確認している」とおっしゃっていたので「それはあかん」となり作ってみました。
Excelでやれば諸々都合は良いのですが、生憎MacユーザーなのでVBS動かず・・・
Spreadsheetにもともと記載されているしそのままGASでやってみます。

##Spreadsheetを用意
こんな感じ
<img width="904" alt="スクリーンショット 2019-08-27 0.32.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256890/aeeac588-9c19-610b-e388-675ef4d65727.png">
今回は
1. G列のURL先に飛ぶ
2. I列のバナー種別を元に、バナーの存在チェックを行う
3. バナー種別通りに貼られていた場合はH列に◯を、そうでない場合は×を記載
という流れになります。
バナーはAとBの二種類があり、両方貼られている場合もあります。

##スクリプトを登録
早速スクリプトを登録します
メニューのツール＞スクリプトを開きましょう
<img width="751" alt="スクリーンショット 2019-08-27 0.37.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256890/8a756a77-44c3-646b-0307-c6541df440e3.png">

中身はこんな感じです

```javascript

function myFunction() {
  // シート情報にアクセスできるようにします
  var sheet=SpreadsheetApp.getActiveSheet();
  // 最後の行数を取得します
  var rowcount = sheet.getLastRow();
  // 開始行から最終行までまわします
  for(var i=7; i<rowcount+1; i++){
    // G列のURLを取得します
    url = sheet.getRange(i,7).getValue();
    // I列のバナー種別を取得します
    status = sheet.getRange(i,9).getValue();
    // バナーの存在チェックをします
    result = check_url(url,status);
    if(result){
      // 想定通りならH列に◯を
      sheet.getRange(i,8).setValue('○');
    } else {
      // 想定と違ったら×を
      sheet.getRange(i,8).setValue('☓');
    }
  }
}

function check_url(url,status) {
    // URL先のHTML情報を取得します
  　html = get_html(url);
    a = false;
    b = false;
    // 取得したHTMLの中に、指定されたバナーがあるか確認します
    if(status == '両方'){
      if (html.match(/https:\/\/hogehoge\/assets\/img\/user\/link\//)) {
        a = true;
      }
      if (html.match(/https:\/\/pupupupu\/assets\/img\/user\/link\//)) {
        b = true;
      }
      if((a) && (b)){
        return true;
      }
    }else if(status == 'Aのみ'){
      if (html.match(/https:\/\/hogehoge\/assets\/img\/user\/link\//)) {
        return true;
      }
    }else if(status == 'B'){
      if (html.match(/https:\/\/pupupupu\/assets\/img\/user\/link\//)) {
        return true;
      }
    }else{
      return false;
    }
}

function get_html(url) {
  try{
    var response = UrlFetchApp.fetch(url).getContentText();
    return response
  }catch(e){
    return '';
  }
}
```

愚直に書いてしまったので定数など使っていませんが
あとは画面の実行マークを押すだけです

##注意点
###・無限ループしてしまった場合は？
https://script.google.com/home/all
ここにアクセスすると、自分が作ったスクリプトのステータスが確認できます。
https://script.google.com/home/executions
ここで該当の処理の設定ボタンをクリックし、終了しましょう。
###・タイムアウトしてしまった
GASは5分以上実行できません！


ということで、初めてのGASでしたが、簡単にSpreadsheetを操作することが出来ました。
URLがどんどんフ増えると5分におさまらなくなるので辛いです
（Excelいいな・・・）
C++ Library: OptimLib（最適化ライブラリ）のinstall

こちらの[armadilloのinstall記事](https://qiita.com/JuUr/items/0f8490e488ebb771dac2)は，OptimiLib(非線形関数のための数値最適化法のライブラリで)をインストールするための作業でした．OptimLibをインストールしたところ，どうもarma::関連でエラーが出るため，まず，先記事の通り，armadilloを正規にインストール＆動作確認しました．

そののち，[OptimLib](https://www.kthohr.com/optimlib.html)の説明にしたがって[^1]，
適当なフォルダで，
git clone -b master --single-branch https://github.com/kthohr/optim ./optim
cd ./optim
を行い，
./configure --header-only-version
または
./configure -i "/usr/local" -p
make
make install
をしました．(僕はheader-only-version[^2])

コンパイルは，
g++ -std=c++14 logit_reg.cpp -o test -I /(インストールしたフォルダ)/header_only_version/ -DARMA_DONT_USE_WRAPPER -lblas -llapack
で通りました．
オプションは，c++11でも通りました．ただし，-lblas(or -lopenblas) -llapackの代わりに-larmadilloを使うと通りませんでした．
これで，c++で最適化計算を歯車の再設計・再構築を行わずに実行できる環境が整った！（はず）

[^1]: 正確には，最初の事情説明通り，armadilloのインストール前にやっています．
[^2]: うまく実行できなかったため，実際は，両方・色々試しましたが．．
propsとdataの違い、propsについて

# TL;DR

他の使い方もあるだろうけど、とりあえず大体以下じゃね？って解釈

 - props
    - 親コンポーネントから渡されるであろう値を自コンポーネントに定義しておくやつ
 - data
    - storeから取得されるデータの形など（を定義しておこう）


# はじめに

vueの例は[単一ファイルコンポーネント](https://jp.vuejs.org/v2/guide/single-file-components.html)で記入します
また、propsとdataの比較記事かと思いきやほぼpropsの事しか話していません。
dataについては多分別記事で書くよ
多分

# propsについて

[コンポーネントの基本 #プロパティを使用した子コンポーネントへのデータの受け渡し](https://jp.vuejs.org/v2/guide/components.html#プロパティを使用した子コンポーネントへのデータの受け渡し)

親コンポーネントから子コンポーネントに値を渡す際に使用されるのがpropsです。

親コンポーネント

```vuejs
<Content title='`ほげ`' />
```

子コンポーネント

```vuejs
<template>
  <div>{{ title }}</div>
</template>

export default {
  name: 'Content',
  props: ['title']
}
```

## 注意1. propsの形式

上ではわかりやすさのためにただの文字列として渡しましたが、本当は以下の様にどの様な値が来るかまで書いておく方が好ましいです。
(Props should at least define its types)


子コンポーネント

```js

export default {
  name: 'Content',
  props: {
    title: {
      type: String,
      required: true
    }
  }
}
```

[プロパティ #プロパティの型](https://jp.vuejs.org/v2/guide/components-props.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%9E%8B)


## 注意2. propsをHTMLの内容に渡す時と属性に渡す時

### HTMLの内容に渡す時

```vuejs
<template>
  <div>{{ title }}</div>
</template>
```

子コンポーネント側で先ほどの様に{{}}波括弧を２つ書いたもの(”Mustache” 構文(二重中括弧))でくくればOK

### HTMLの属性に渡す時

```vuejs
<template>
  <div :class="title">ここはベタ書き</div>
</template>
```

子コンポーネント側でv-bindを使用することで渡されたprops要素が入り込む様になっている

## 注意3. 親コンポーネントでの渡し方について

### ベタ書きの時(あんまないと思うけど)

```vuejs
<Content title='`ほげ`' />
```

親コンポーネント側でバッククオートで囲いながらベタ書きすればOK（当たり前のことを言っている人）
文字列として判断させたいため、バッククオートで囲う

### dataとかから取得する場合

v-forと交えながら書きます（コンポーネントに渡す時data使うなら大体v-for使うだろという仮定）

```vuejs
<template>
...
<Content 
  v-for="item in items"
  :key="item.id" :id="item.id"
  :content="item.content"
  :user-id="item.userId"
/>
</template>

export default {
  data: function() {
    items: [
       {
          id: 1,
          content: 'ぴよぴよ',
          userId: 3
       },
       {
          id: 2,
          content: 'わんわん',
          userId: 4
       },
    ]
  }
}
```

親コンポーネント側でこの様な記述をします。注意点は以下。

 - :keyを絶対に入れなきゃいいけない([リストレンダリング #状態の維持](https://jp.vuejs.org/v2/guide/list.html#%E7%8A%B6%E6%85%8B%E3%81%AE%E7%B6%AD%E6%8C%81))
 - バッククオートはいらない（文字列じゃないから）
 - user-idと渡しているものは子コンポーネント側ではuserIdとなってくれる([プロパティ #プロパティの形式](https://jp.vuejs.org/v2/guide/components-props.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%BD%A2%E5%BC%8F-%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9-vs-%E3%82%B1%E3%83%90%E3%83%96%E3%82%B1%E3%83%BC%E3%82%B9))


# dataについて

そのコンポーネントで使用するデータ（子コンポーネントに渡すものも含む）を定義しておく場所
多分大体storeとかから取得したデータが入ってる場所と考えるべき？(computedなどと併用して)

## 注意点1. コンポーネントでのdataは関数にする

[コンポーネントの基本 #dataは関数でなければいけません](https://jp.vuejs.org/v2/guide/components.html#data-%E3%81%AF%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93)

コンポーネントじゃなかったらオブジェクトでよかったですよね
[Vue インスタンス #データとメソッド](https://jp.vuejs.org/v2/guide/instance.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)

---

# 最後に

mapStateを使ってstoreからデータを取得してほにゃらららへんはちょっとまだ勉強中なので、理解したら記事を書きます
ModuleNotFoundError: No module named 'Crypto'

# ModuleNotFoundError: No module named 'Crypto'

こちらのエラーが出た場合は、以下のコマンドで解消できます。
必要ないものがインストールされていると読み込み順番でエラーになるのかな。

```
pip uninstall Crypto
pip uninstall pycrypto
pip install pycrypto
```
Macのターミナルで実行するとEOFが認識されない？

# はじめに
競プロの問題を解いていてあまりググっても解決策が出てこない問題にぶつかったので記事にしておきますー！

## EOFとは
AOJでこちらの問題[ ALDS1_3_A ](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_A)を解いていて、 **EOF** というものを使うことが必要になった。EOFはEnd of Fileの略。意味は「ファイルの終わり」といったところでしょうか？
この問題では
```while(scanf("%s", s) != EOF)```
という使い方をしました。

## ターミナルで実行するとEOFが認識されない
いつも通りコンパイルしてターミナルで実行すると、返り値が返ってきません。でも、AOJに提出するとAcceptedとなるのでコードは間違っていません。
どうやら先ほどのコードのwhileループが終わっていないようです。
ということは、入力が終わっても!=EOFになっている、つまり入力の終わりが認識されていないということですよね？

なんででしょう。

## 解決方法
実行時に**Enterキーではなく *Control+D* を押す！**
これで成功しました。

# 終わりに
ただのメモなのでどうしてこれで上手くいくのか、など詳しいことは分かりません。ガチプロの方教えていただければ幸いです、、。
もし同じ壁に詰まった方がいればこれをみて解決してもらえれば！と思います*\(^o^)/*

## 参考ページ
https://stackoverflow.com/questions/21364313/signal-eof-in-mac-osx-terminal
Windows10, MacでのPATHの通し方。パスの通し方。

# 環境
OS：windows10, MacOS 10.14.6

# 背景
PATHに関する解説はたくさんありますが、常用するような設定ではないため毎回調べないといけないので簡潔に忘備録を残します

# PATHを通すとは
PATHを通すとはプログラム名のみで実行できる環境を作ること。
**/aaa/bbb/ccc**にある**ccc**を実行する際に、コマンドライン上に**/aaa/bbb/ccc**と入力しなければならないところ、**ccc**と入力することで実行できるようにすることが目的。
これは、PATHという環境変数にディレクトリ登録することで可能となる

# 環境変数とは
環境変数とは、OSが使用出来る変数のことで、全体から参照出来る変数なのでそのOS内の全てのアプリケーションから参照する事が出来る

```sh
# 環境変数の確認コマンド
> printenv

# 出力結果にPATHというものがある
...
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/MAMP/Library/bin...
...

# 環境変数の使用は通常の変数のように'$'を始めにつければ良い
> echo $PATH 

# 出力結果
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/MAMP/Library/bin...
```

上記出力結果の通りPATHは次のように`:`区切りで書かれており、左から優先的にパスの中を探して実行するようになっている。
実行したいプログラム名が入力されたとき、該当するパスになければ次のパスを探して、なければ次のパスを探すという流れ

```sh
# 現在の環境変数が前述の出力結果の場合、左から優先して探されるので次の順で探されることになる。
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/MAMP/Library/bin...
# --------流れ--------
/usr/locak/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Applications/MAMP/Library/bin
...
```

# 環境変数の設定
## 一時的に環境変数を設定する(再起動で元通り)
上記のPATHに対して**export**コマンドを使うことでパスを追加できる。
追加したら**source**コマンドで反映させる。

```sh
# $PATHを左に書けば、最優先で探してくれる
> export PATH = $PATH:{追加したいパス}/bin

# $PATHを右に書けば、最後に探す項目として追加できる
> export PATH={追加したいパス}/bin:$PATH

# (例)
# composerというパッケージ管理ツールのパッケージに対してPATHを設定したい場合
# composer/vendorのディレクトリにパッケージが管理されている
# composer自体は現在は/usr/local/bin/に配置されているとする
# 　=> /usr/local/bin/composer/vendeorという状況
# ※'/usr/local/bin/'　は　'~'　で表せる
# ※PATH設定の際は最後に`/bin`を書く必要がある
> export PATH=~/.composer/vendor/bin:$PATH
```

**source**コマンド実行でexportした結果を読み込み直すことができる

```sh
> source ~/.bash_profile
# or
> source ~/.zshrc
```

## 再起動後もPATHを通したままに設定する
OSにログインすると自動的に立ち上げられるファイルの中に次の2つがあり、このいずれかのファイルに上記**export**内容を追記することでOSログイン時に**export**してもらうようにする

・ **bash：~/.bash_profile**
・ **zsh：~/.zshrc**

※この場合OSログイン時に自動的にexportされるようになるため、**source**コマンドで読み込み直す必要はない
### bashかzshどちらに追記するか

```sh
# 次のコマンドの出力内容の末尾が"bash"か"zsh"かでどちらのファイルに書き込むかを決める
> echo $SHELL

# 出力結果の末尾が次のように"bash"のとき、"~/.bash_profile"に書き込む
/bin/bash

# 出力結果の末尾が次のように"zsh"のとき、"~/.zshrc"に書き込む
/usr/local/bin/zsh
```

### 実際に追記する
```sh
# 設定ファイルに書き込む"~/.bash_profile"に書き込むとき
> vi　~/.bash_profile
# "i"でinsertして下記内容を追記し、"esc"でinsert終了し、":wq"で保存して閉じる
export PATH=~/.composer/vendor/bin

# zshの場合も同様
```
RoboMasterS1を解析してROSで動かせるように頑張ってみる（プロトコル解析１）

###mROS動かない。。。
mROSがとりあえず動かないので、今デバッグ用に別の手段を考えていたりするので、その辺りは次回に書きたいと思いますので、今回はRobomaster S1が届いて組み立てましたので、さっそくプロトコルの解析の話を（忘れないうちに）書いておきたいと思います。
（組み立てについてもまた後日）
###そういえばDJIにTelloというドローンがあってだな・・・
知る人ぞ知るお話ですが、DJIのTelloというトイドローンが人気で、なんでもSDKも公開されているし、プロトコルも解析されて動画まで転送できるわで、盛り上がっているそうです。
https://note.mu/keizi666/n/nddef168ffb76
じゃあこれでWifi乗っ取れば同じようにRobomaster S1でも行けるんじゃね？？ということでやってみましたが。。。。
。。
。。
無理でした（大汗）
プロトコルがそのままRawで流れているわけではないようでした。
###本題
前回先人たちによるCANパケットによりいくらか通信プロトコルが見えてきました。
さらに、そのデータの解析を進め、私も自分のRobomaster S1で取得したり試してみました。
そこで、DJIのRobomaster S1の通信プロトコルは以下のようになっていることが発覚しました。
（CANにシリアル的に流しているのは許せませんが。。。DJIさん、もう少しCANらしくお願いします。）

|ヘッダ|メッセージ長|固定値|CRC8|データバイト列|CRC16|
|---:|---:|---:|---:|---:|---:|
|0x55|0xXX|0x04|CRC8|Data[]|CRC16|

ここでお気づきの方もおられると思いますが、CRC8の計算が普通のものではないのです（Telloのとほぼ同じ）
ということで、見つけました！
https://cdn-hz.robomasters.com/tem/383c6c3f8c8351515755292179151736.pdf
2018年のICRAでRoboMasterが行われた際のレフリーシステムのManualですね。
これの最後のほうにテーブルでのCRC8とCRC16の計算方法が載っています。（バグっているので自分で直して使いましょう）

ただ、計算してみるとわかるのですが、CRC8とCRC16の計算がどうしても合いません。。。
計算方法を変えているわけないし。。。。ということでInitial Valueが違うのではということで、
適当に総当たりで（たかが255通りと65535通りなので）やってみました。
その結果以下のInitial Valueと判明しました。

|CRC8|CRC16|
|---:|---:|
|0xXX|0xXX|
（別PCに入っているので後で書きます）

これで、CRC8とCRC16の計算ができるようになったので、データバイトもいじり放題になりました。

###データの解析
実機が届いたので、とりあえずCANのコネクタは4PINだったので総当たりでCAN-HとCAN-Lを見つけました。
Robomaster S1のコネクタは特殊形式ですが、2.54mmピッチなので、よくあるヘッダピンが刺さるので便利です。
調べたところBaudrateは1Mbpsでした。車だと500kbpsが多いので、これまた時間をとられました。
今回解析に使用したツールは以下になります。
・Kvaser Leaf Light v2
・Busmaster 
KvaserはCANツールの中でも内部にSJA1000を搭載しており、データの欠損が起こりにくく、
Linux用のAPIも公開されているので、ROSノードの作成も簡単です。
BusmasterはWindows用のソフトですが、個人では買えないVecto CANalyzer/Canoeに近い機能をオープンソースで提供しており、各種USB-CANツールに対応しているため利用しました。
データの取得後、Converter機能でエクセル形式に出せるのも魅力です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/cfd289f1-9dad-8d28-4ed3-39c35cf266e8.png)

###インテリジェントコントローラの出力のIDは0x201
CANのモニタリングをしながら、インテリジェントコントローラの接続を外すと見事0x201がなくなりましたので、これがインテリジェントコントローラからの指示のようです。（CAN IDが小さいのと送信周期が短いので、だいたい予想できます）
0x201と分かったのですが、このIDを使ってまるでシリアル通信のようにコマンドを垂れ流しています（マジでやめてくれ）
ということで、ログをとって編集して、0x55を起点に改行したらこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/8e772e86-6186-1aff-b08a-6f69a9315f0e.png)

はい、もうかったも同然ですね。これを見ながらコントローラで走行指示を与えると、、、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/0f568910-f863-2c2b-37b0-c8d94809076b.png)

0x55,0x1Bがどうやら走行指示のようです。
ということで、こんな感じで解析をガンガン進めていきたいと思います。
次回は、解析の結果orシステムの検討を書きたいと思います。
ではまた。
Xserver のキャンペーンドメイン のみを残してメール運用を考えた

とある事情があり、Xserverのサーバーを解約することになった。
しかし、せっかく作った名刺にはXserver 契約時にいただいたドメインのメールアドレスが記載されている。
どうしよう。

どうも、XserverではXdomainへキャンペーンドメインを移管することができるとのことだ。
これを機にドメインを生き延びさせることに成功した。

そこで様々なことを考えた。

#1 AWS やGCP上にメールサーバーを立てる

→これは結構お金がかかるとわかった。
私はこのドメインは最低要件で動かしたいという思いがあったため、この方法は断念。
しかしメールサーバーの構築は行ってみたかったなと

#2 Sakura インターネットでメールサーバー専用のプランがあった
今回はこれを使用した。
https://www.sakura.ne.jp/mail/

要件
=> 月額　86円
=> 容量　10GB
=> 初期費用　無料！
=> 24時間365体制での対応

十分すぎるのでは！？

そう思いました。

現時点でWEBサーバーを立てる予定もなく、とりあえず個人用のメールアドレスを残したいという一心ですぐに契約をした。

また、さらにすごいのは
=> 独自ドメインを使用することができる！


よって、１年間にメールを利用するのにかかる費用は以下の通りだ

1. Xdomain ドメイン更新料　1480円
2. さくらのメールボックス　1000円程度

合計　2500円くらい

素晴らしいと感じた。
またブログを始める時もDNSのレコード設定で同じドメインを使用できるのが良いと思った。


#3 最後に
自分の名刺の維持も大変や（Gmailにしておけばよかったな笑）
AWS | ssh接続できない permission denied (publickey).

ec2-userでログインはできる、でも新規ユーザを作成後(ここでは**app**という名前のユーザーを作ったこととする)、そのユーザでssh接続を試みると、、、

```
permission denied (publickey).
```

_WTF_ ...

＊ 公開鍵も適切に設置されている
＊ ユーザー名やホスト名が間違っているわけではない(IPアドレスも正しい)
＊ アクセス権限も問題なし
＊ セキュリティグループも問題ない
原因がわからず、エラーログを追ってググっても権限関係の解決方法がほとんどで大分ハメられたので、誰か同じように悩まれてる方がいたらと思い、解決方法をシェアしたいと思います。 

```shell

# ちなみにssh接続のログの出し方
# -vvv をつける

$ ssh -i "~/.ssh/id_rsa" app@88.90.10.10 -vvv

# ちなみにIPアドレスのこの数字は "ハヤクイレテ" って読める
```
 
## appユーザーにパスワードを設定
(1)まずec2-userでとりあえずEC２に入り、管理者権限に切り替える

(2)パスワードを設定

```shell
# パスワードの状態を確認
$ passwd -S app

# こんな感じの出力結果になると思われ
app LK 2019-06-26 0 99999 7 -1
# LK => パスワードがロック状態という意味

# appユーザのパスワードのロックを解除
# -uがロック解除 -fが強制的に というオプション
# -fがないと"危険な操作"として弾かれる
$ passwd -u -f app

# もう一度パスワードの状態を確認
$ passwd -S app

# こんな感じの出力結果になると思われ
app PS 2019-06-26 0 99999 7 -1
# LKからPSとなっていることを確認

# パスワードを設定
$ passwd app
# Enter New Password:
# Confirm New Password:
```

## (EC2)sshd_config 以下の通りとなるようコメントアウトまたは追記
```
# /etc/ssh/sshd_config

RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys
```

＊ sshd再読み込み

```
$ sudo service sshd restart
```
***

これでappユーザで再びssh接続を試みてみてください。
ssh接続時にパスワードの入力が求められますので、そのときは↑で設定したパスワードを入力。
***

## 参考にした記事

[SSH keys fail for one user](https://serverfault.com/questions/220788/ssh-keys-fail-for-one-user/221364)

## 注意
今のところ二人同じ問題につまづいた方にこれを勧めたところ解決しました。
しかしながら、当方インフラが全然でなぜこのようなエラーとなるのか、なぜパスワードを設定+sshd_configの書き換えで解決するのか根拠を示せません。

どなたかこの問題について違うアプローチ方法または知見を共有していただければ幸いです。
【編集中】IISExpress実行時ERR_CONNECTION_REFUSEDで起動しない...

# TODO
- [ ]  解決策書けてない。

※完全な解決策はないにしろ、予防策はあるはず...
　ポートが利用されているかどうかを確認するコマンド(netstat)
　大量にポートを利用するアプリケーションがないか!?

# はじめに
ポート番号を変更すれば動作するんですが、問題発生する度に毎回対応するのは大変…特に忙しい時に発生したときなんて(ToT)

# 参考サイト
◆IISExpressを実行しているlocalhostに接続しようとしたときのERR_CONNECTION_REFUSEDを解決する方法 - エラー502（Visual Studioからデバッグできません）
　https://www.it-swarm.net/ja/visual-studio/iisexpressを実行しているlocalhostに接続しようとしたときのerrconnectionrefusedを解決する方法-エラー502%EF%BC%88visual-studioからデバッグできません%EF%BC%89/1055912141/
　※問題の概要はこのサイトとほぼ同じ

◆インターネット インフォメーション サービス MMC スナップインで Web サイトを起動しようとするとき、「プロセスはファイルにアクセスできません」エラー メッセージが表示されます。
　https://support.microsoft.com/ja-jp/help/890015/you-receive-a-the-process-cannot-access-the-file-because-it-is-being-u
　※イベントビューアにも下記エラーで出力される...
　　イベント ソース: HTTP
　　イベント ID: 15005

◆IPアドレスへのIISExpressのバインドが失敗する
　https://codeday.me/jp/qa/20190410/597752.html
　　※①現状どうなっているか確認！！

◆Solved - IIS Express failed to register URL - Access is denied
　https://programmingflow.com/2015/08/28/solved-iis-express-failed-to-register-url-access-is-denied.html
　※②Solutionを試してみる。。。

◆IISのapplicationhost.configのファイルのパス、保存場所はどこ？
　https://urashita.com/archives/27177
　　
◆IIS Express のサイト設定から存在しないものを一括で削除する
　https://blog.shibayan.jp/entry/20150615/1434375654
　　※これが原因っぽい…当たりならここにあるスクリプトを使いたい③
　

# 解決に向け試してみる...

```sh:try.bat
REM ①
netsh http show iplisten

REM ②
netsh http add iplisten ipaddress=::

REM ③ ※powershell
$appcmd = "C:\Program Files\IIS Express\appcmd.exe"
[xml]$result = Invoke-Command -Command {& $appcmd 'list' 'vdir' '/xml' }
for ($i = 0; $i -lt $result.appcmd.VDIR.Length; $i++)
{
    if (!(Test-Path $result.appcmd.VDIR[$i].physicalPath))
    {
        $sitename = $result.appcmd.VDIR[$i]."APP.NAME".TrimEnd('/')
        Invoke-Command -Command {& $appcmd 'delete' 'site' $sitename }
    }
}

```

# 結果
Coming Soon...
README データベース設計

## railsdにてデータベース設計時のデータ型

string 文字列型
text テキスト（不定長文字列）型
integer 整数型
float 浮動小数点数型
decimal 固定長整数型
datetime 日時型
timestamp タイムスタンプ型
time 時刻型
date 日付型
binary バイナリ文字列型
boolean 真偽値型
references 他のテーブルへの外部キーの定義、_id が付いた整数

## railsdにてデータベース設計時のカラム制約(mysql)

null: false カラムにnullを許可しない
unique: true　カラムに同じ値を許可しない
foreign_key: true　他のテーブルへの外部キー制約をつける　indexも自動付与
default: "oooooo"　カラムに値が設定されなかった場合にデフォルトで格納される値を設定。
limit: 50　データ型の最大幅を指定。
対象となるデータ型は文字列タイプはstring型とtext型の2つ、数値タイプはinteger型とbinary型の2つ。
precision: 10, scale: 5 指定することで精度(最大桁数)とスケール(小数点以下の桁数)を指定。
対象となるデータ型は文字列タイプはdecimal型。


## railsdにてデータベース設計時のアソシエーション
 

- 対象を1つ持っているなら、has_one

    - has_oneは自分のテーブルが対象テーブルを1つ持っている(複数持たない)場合に使います。対象テーブル側に自分のidのカラムがある場合に使います。


- 対象を複数持っているなら、has_many

    - has_manyは自分のテーブルが対象テーブルを複数もつ場合に使います。対象テーブル側に自分のidのカラムがある場合に使います。



- 自分が対象に所属しているなら、belongs_to

    - belongs_toは、自分のテーブルが対象テーブルのレコードに所属する(対象テーブルのidカラムがある)場合に使います。
DBの型　〜生年月日はdate型〜

###生年月日がDBに登録されない:frowning2:
ユーザーの新規登録の部分の生年月日の部分だけDBに登録されなかったので困ってました。
ということで備忘録メモ:writing_hand_tone1:

##困ってたこと
```registration_controller.rb

def create
    @user = User.new(user_params)
    if @user.save
      sign_in(@user)
      session[:user_id] = @user.id
      redirect_to phonemumber_users_path
    else
      render 'new'
    end
  end

private
    def user_params
      params.require(:user).permit(:nickname, :email, :password, :password_confirmation, :last_name, :first_name, :first_name_kana, :last_name_kana, :birthday)
    end
```

ニックネームとかemailはDBに入るのにbirthdayだけ登録されない:sob:

##解決した方法
####:point_up_tone1:birthdayのカラムがstring型だったのでdate型に直した

一番最初のマイグレーションファイルに書いていたので、書き直してrake db:migrate:resetで書き換えました

```
t.string :nickname,           null: false
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :last_name,          null: false
      t.string :first_name,         null: false
      t.string :last_name_kana,     null: false
      t.string :first_name_kana,    null: false
      t.date :birthday,             null: false
      t.integer :tel,               null: false, unique: true
      t.string :avatar
```

これでできました:hugging:


####電話番号はintegerだとダメで、stringはOKだそうです。

勉強になりました:innocent:
tensorflow-rocmでimport時にnumpyのFutureWaringが出た話

# 環境
OS：ubuntu 19.04
Python version：3.7.3
tensorflow version：1.14.1
numpy version：1.17.0

# 状況
tensorflowをimportすると以下のようなメッセージがたくさん表示される。

```python
/home/[username]/.local/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
```

# 対処
numpy 1.17.0がtensorflow 1.14.1に対応していないのが原因。
numpy 1.16.4に落としてあげればいい。

```terminal
pip3 install numpy==1.16.4
```

# 参考
[TenserFlow 1.4.0 をWindows10にインストールしたときのトラブル対応方法](https://qiita.com/yasthon/items/83f3a30fdcbf5eed95b6)

#2019/12/24 追記
ちょっと前にpipで入るtensorflow-rocmのバージョンが2系になったので、最新のtensorflow-rocmを使えば最新のnumpyでも動くみたい。