OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsでImageMagick.jlを入れるには

# 背景

Julialangで画像データを扱うにはImages.jlなるパッケージがある。
Images.jlを入れると

```jl
img = load("hoge.jpg")
```

とすることで、画像ファイルを読み込んでくれる。

windowsやLinuxでは内部的にImageMagick.jlを利用するこで、
様々な画像フォーマットのファイルの読み込みに対応している模様。

ということで、さっそく自分もImages.jlを使うことに。

# トラブル発生

```jl
import Pkg;Pkg.add("Images")
```

でインストールされるも、いざ、

```
load("snap.jpg")
```

としたら、

![Cmder 2019_04_29 14_03_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458/d628de0f-6bc8-d2cc-7ee5-d1688c0dd6d5.png)

それじゃってことで、手動でImageMagick.jlを入れようと

```jl
import Pkg;Pkg.add("ImageMagick")
```
として、ImageMagick.jlをインストールすると、

```txt
imagemagick.jl windows ERROR: Can not create symbolic link
```

# 解決策

管理者権限でインストールする方法もあるが、
ユーザー配下のフォルダにJuliaを入れているのに、
単なる画像ファイルの処理パッケージのインストールに管理者権限を
使いたくないなぁと、調べてみると、
Github上にIssuesが上がっており、開発者モードにすることで、
シンボリックリンクが作成可能になり、ImageMagick.jlをインストールできるとの事

![設定 2019_04_29 14_13_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458/2f7b3d8f-740d-8838-2a3a-b4a207f92535.png)

設定後、今度はPkg.addできるが、loadを使うと怒られるので、
あらかじめ

```jl
Pkg.add("ImageMagick")
Pkb.build("ImageMagick")
```

と明示的にビルドを行っておくと多分、怒られずにloadが使えるハズ。

## 参考資料

- https://github.com/JuliaIO/ImageMagick.jl/issues/133

# 関連記事

- [Julia言語からmruby-webcamを使ってWebカメラの画像を取得した](https://abrakatabura.hatenablog.com/entry/2019/04/30/152311)
- [Julia言語で久しぶりにHTTPをHTTP.jlや生ソケット通信で喋って、動画配信を試した](https://abrakatabura.hatenablog.com/entry/2019/05/24/234010)
Cloud FirestoreのデータをPythonで取得する

Cloud Firestoreに登録されているデータをPythonで取得する方法を紹介します。

## 環境

```bash
$ python -V
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)
```

## 準備
### ライブラリ
必要なライブラリをインストールします。

```bash
$ pip install firebase-admin
$ pip install google-cloud-firestore
```

### 認証ファイルをダウンロード
firebaseのコンソール画面を開きます。

[Sign in - Google Accounts](https://console.firebase.google.com)

プロジェクトの設定をクリックします。

![20180616152619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116168/55043522-c5d8-588a-99ad-3d55ef6c619b.png)

サービスアカウントのタブを開きます。

![20180616152631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116168/05383d96-50b1-2b90-cf94-ea2be86f0f7d.png)

Pythonにチェックをし、**新しい秘密鍵の生成**をクリックします。

![20180616152645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116168/d92700eb-bfd0-e2e5-4a88-ebf375418f5a.png)

秘密鍵（ファイル名：〜.json）がダウンロードできたか確認しましょう。
## 実装
usersコレクションのデータを取得してみます。

![20180616152707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116168/547a48da-75d7-41ac-1998-be78c0f2da5c.png)

まずは必要なライブラリをインポートし、秘密鍵を読み込みます。

```python
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

cred = credentials.Certificate("./〜.json") # ダウンロードした秘密鍵
firebase_admin.initialize_app(cred)
```

usersコレクションのデータを取得します。

```python
db = firestore.client()
docs = db.collection('users').get()
for doc in docs:
    print(doc.to_dict())
```

条件を追加してデータを取得します。

```python
query = db.collection('users').where('active', '==', True)
docs = query.get()
for doc in docs:
    print(doc.to_dict())
```

複数条件を設定します。

```python
query = db.collection('users').where('active', '==', True).where('created_at', '>', datetime.datetime.now())
docs = query.get()
for doc in docs:
    print(doc.to_dict())
```

上記のように等価演算子（==）と範囲比較（<、<=、>、>=）を組み合わせる場合は<b>カスタムインデックス</b>を作成する必要があります。
インデックスを作成してない状態で実行するとエラーが発生します。

```bash
google.api_core.exceptions.FailedPrecondition: 400 The query requires an index. You can create it here: https://console.firebase.google.com/project/〜
```

表示されたURLに遷移するとインデックス作成画面に遷移しますので、そのまま**Create index**をクリックしましょう。

![20180616152726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116168/5c7e2d54-f0a2-14d6-f93f-b750bed64255.png)


## まとめ
複合クエリの実行は癖ありますが、比較的簡単に実装できますね。
Minecraft Skript 応用編 Part.1 カウントダウンコマンド

#カウントダウンコマンドを作る

```perl:countup.sk
command /cu <int>:
	permission: skript.admin
	trigger:
		loop arg-1 times:
			if loop-number is arg-1:
				send "%loop-number%" to player
				execute console command "/playsound entity.enderdragon.ambient master %player% ~ ~ ~ 1 0.7 1"
			else:
				send "%loop-number%" to player
				execute console command "/playsound entity.experience_orb.pickup master %player% ~ ~ ~ 1 0.5 1"
				wait 1 seconds
```
前回書いたコードです。
これはカウントアップするというコマンドなんですが、これをカウントダウンさせるのはとても簡単なんです。

では一度これを実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404179/b424bf84-a73e-9208-d664-12289ac92743.png)
はい。これでなにがわかった？

とてーも簡単・・・とりま完成形見せるわｗｗ

```perl:countdown.sk
command /cd <int>:
	permission: skript.admin
	trigger:
		set {_countdown} to arg-1
		loop arg-1 times:
			send "%{_countdown}%" to player
			execute console command "/playsound entity.experience_orb.pickup master %player% ~ ~ ~ 1 0.5 1"
			wait 1 seconds
			set {_countdown} to {_countdown} - 1
		send "カウントダウン終了" to player
		execute console command "/playsound entity.enderdragon.ambient master %player% ~ ~ ~ 1 0.7 1"
```
まあ、今回は`loop-number`を使わなくてもできます。

まず一時変数に`arg-1`を代入します。
そしてメッセージを送信したあと、１秒間待ち、その一時変数から１を引きます。

そしてLoopが終わったあとに「カウントダウンが終わったよ～」と知らせるんですね・・・

ちなみに一時変数から１を引く方法は`set {_countdown} to {_countdown} - 1`でいいんです。

これを使ってカウントアップもできるけど、それは`loop-number`のほうが楽なんでね・・・

次は[コチラ](https://qiita.com/meoto2408/items/841eec0ae4ffb09899f3)

前は[コチラ](https://qiita.com/meoto2408/items/938a1035998ca80ee59e)
Angularで直感的に日付や時間を選択するDateTimePickerを使ってみる

Angularで日付や時間を直感的に選択できるDateTimePickerがないかなーと探してみました。
今回、**ng2-flatpickr**を採用することにしたので、その使い方を簡単に紹介します。

## 比較対象と採用理由

Google先生に良さげなライブラリがないか聞いてみて、一通り物色し下記3つを候補に挙げました。
今回、メンテナンスされていないようなライブラリは除外しています。

- [@angular-mdl/datepicker](https://github.com/mseemann/angular2-mdl-ext)

- [angular-bootstrap-datetimepicker](https://github.com/dalelotts/angular-bootstrap-datetimepicker)

- [ng2-flatpickr](https://github.com/mezoistvan/ng2-flatpickr)

結果的にng2-flatpickrにしましたが、その理由は**日付と時間を同時に選択できる**、**デザインの修正が不要**、**設定しやすく簡単**の3点でした。

## ng2-flatpickrの導入する

まずはインストールをしましょう。

```bash
$ npm i --save flatpickr ng2-flatpickr
```

### モジュールを読み込む

`app.module.ts`でNg2FlatpickrModuleを読み込みます。

```typescript
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { Ng2FlatpickrModule } from 'ng2-flatpickr';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    Ng2FlatpickrModule,
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
```

### スタイルシートを読み込む
次にangular.jsonを開き、cssファイルを読み込むようにします。

```typescript
:
"styles": [
  "src/styles.css",
  "./node_modules/flatpickr/dist/flatpickr.min.css",
  "./node_modules/flatpickr/dist/themes/material_blue.css"
],
:
```

material_blue.cssはカレンダーのテーマです。全部で6種類あり読み込むcssを変更することでテーマを変えることができます。

![20180610103802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116168/deecb2f2-b912-7ea1-70b3-6abe4f9368dd.png)

### DatePickerを使用する
これで使用できる環境が整いました。まずはデフォルトの状態で動かしてみましょう。
htmlファイルにng2-flatpickrタグを追加します。

```html
<ng2-flatpickr></ng2-flatpickr>
```

これだけで完了です。試してみましょう。
<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/maroemon58/20180610/20180610102117.gif" alt="f:id:maroemon58:20180610102117g:plain" title="f:id:maroemon58:20180610102117g:plain" class="hatena-fotolife" itemprop="image"></span>
大丈夫そうですね。
### オプションを設定する
時間も選択できるようにしたいので、オプションを設定します。
はじめに利用するcomponentで下記2つを読み込みます。

```typescript
import { FlatpickrOptions } from 'ng2-flatpickr';
import Japanese from 'flatpickr/dist/l10n/ja.js';
```

オプションを設定します。

```typescript
options: FlatpickrOptions = {
  locale: Japanese,      // ロケールを日本
  enableTime: true,      // 時刻選択を有効
  time_24hr: true,       // 24時間表記を有効
  minDate: '2018-06-10', // 最小選択日時
};
```

componentで設定したオプションをhtml側に反映します。

```html
<ng2-flatpickr [config]="options"></ng2-flatpickr>
```

確認してみます。

<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/maroemon58/20180610/20180610101959.gif" alt="f:id:maroemon58:20180610101959g:plain" title="f:id:maroemon58:20180610101959g:plain" class="hatena-fotolife" itemprop="image"></span>

問題なく動作してますね。
その他の設定項目はこちらをご覧ください。

[Options - flatpickr](https://flatpickr.js.org/options/)

## おわりに
デザインにこだわらなければ必要十分ではないでしょうか？使い方が簡単ですので、手軽にDateTimePickerを利用したいときに重宝しますね。
docker-composeを使う前に整理しておきたいこと

複数コンテナの管理は`docker-compose`が使えそうという事や使い方は、開拓してくれた先人がしっかり記事に残してくれているので、検索すればすぐに見つかると思いますので、そちらを感謝して参照してください。

ここでは、docker-composeを使うにあたり、事前に整理しておけばよかったなあと思ったこと、簡単にいうとcomposeファイルに書くにあたり決めておきたい事を残しておきます。

### 事前に決めておきたい事
要はcomposeファイルのオプション定義です。
ですが、コンテナ内の設定ファイルと合わせないといけない事があり、そこを曖昧なままとりあえず先へ〜と進めると、結局コンテナ内の設定ファイルの確認・差し替えやコンテナイメージの作り直しが発生し、余計な手間をかける事になります。
という事で一覧です。

|明確にしておきたい事|ひとこと|関連するcomposeファイルのオプション|関連するdocker runのオプション|
|:-----------:|:----------------------------:|:-------------------------:|:----:|
|起動するイメージ名|バージョン(タグ)まで決めておくと実行環境の差が出にくい|image|-|
|コンテナ名|コンテナ同士で通信する場合のホスト名。|container_name|--name|
|使うポート|コンテナ同士の通信で使うもの、コンテナ外に公開するものを整理。|ports|-p|
|依存するコンテナ|起動順を意識しないといけないものはないか？|depends_on|--link|
|共有するディレクトリ|意図せずマウント元が被らないように。|volumes|-v|
|環境変数|dockerファイル内のものを上書きする必要があるか？|environment|--env|

コンテナ名とポートは、composeファイルとコンテナ内の各設定ファイルと合わせないと通信に失敗するので、コンテナ間で通信する場合はここだけでも決めておくと、つまらない躓きが減らせるのではないかなと思います。
IBMi ローカルyumリポジトリに変更する方法

最近ではオープンソース等のソフトはyum経由でダウンロードしインストールしますが、
セキュリティ上の理由からIBMiがインターネットに出られない場合があるかと思います。

[Using yum on an IBM i system without internet access](https://bitbucket.org/ibmi/opensource/src/master/docs/yum/#markdown-header-using-yum-on-an-ibm-i-system-without-internet-access)というページを見つけたのですが、手順が詳しくないので私が実施した手順を記載します。

イメージとしてはこんな感じです。
![yum01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146069/61ce100a-80d6-680f-1bbd-af3e79389768.png)

ここではWebサーバー上にローカルリポジトリを構築する手順を紹介します。

# 準備
ローカルリポジトリを置くPCにはCentOS7.6をインストールしておきます。
IBMiにyumをインストールしておきます。[※Offline Install Instructions (without ACS)] (https://bitbucket.org/ibmi/opensource/src/master/docs/yum/#markdown-header-offline-install-instructions-without-acs)

# 手順概略
1. 必要なソフトウエアをインストールする
2. 設定情報の入手
3. ローカルyumリポジトリを作成する
4. ローカルリポジトリが見れるか確認
5. IBMiの設定をローカルリポジトリに向ける
6. yum稼働確認
7. ローカルyumリポジトリを最新の状態にする

1、3～4、7がローカルリポジトリを設置するPCでの作業、2、5～6がIBMiでの作業です。
### 1.必要なソフトウエアをインストールする
``` console
# yum -y install yum-utils createrepo
# yum -y install httpd
```
### 2. 設定情報の入手
IBMiのコマンドラインから以下のコマンドを入力します。

```
EDTF STMF('/QOpenSys/etc/yum/repos.d/ibm.repo')
```
以下が表示されるかと思います。

```
[ibm]
name=ibm
baseurl=https://public.dhe.ibm.com/software/ibmi/products/pase/rpms/repo
enabled=1
gpgcheck=0
sslverify=0
```

### 3. ローカルyumリポジトリを作成する
/etc/yum.repos.d/CentOS-Base.repoに、手順２の情報をまるまる追記して下さい。

ここでは/var/www/html 直下にロカールリポジトリを作成します。
なお、初回取得時はそれなりの時間がかかります。

``` console
# reposync -a ppc64 -p /var/www/html -r ibm
# reposync -a fat   -p /var/www/html -r ibm
# createrepo /var/www/html/ibm
```

### 4. ローカルリポジトリが見れるか確認
webサーバーを起動し、ポート80を通します。

``` console
# systemctl start httpd
# firewall-cmd --add-port=80/tcp
```

以下のURLをブラウザで入力し、xmlファイルが表示されればOKです。

```
http://<ローカルリポジトリのIPアドレス>/ibm/repodata/repomd.xml
```

### 5. IBMi設定をローカルリポジトリに向ける
手順2と同じコマンドでibm.repoファイルの以下の部分を書き換えます。

```
baseurl=http://<ローカルリポジトリのIPアドレス>/ibm
```

### 6. yum稼働確認

例えば以下のコマンドで結果が返ってくればOKです。

```
$ yum search node
```

### 7. ローカルyumリポジトリを最新の状態にする
手順3のコマンドを再度入力すれば最新化されます。

``` console
# reposync -a ppc64 -p /var/www/html -r ibm
# reposync -a fat   -p /var/www/html -r ibm
# createrepo /var/www/html/ibm
```
アニメの字幕をもとに自動生成した文章を一定間隔ごとにtweetする

#概要
[アニメの字幕をもとにマルコフ連鎖で文章自動生成 - Qiita](https://qiita.com/keyyum/items/8fdd015fe148892dd26c)の続きです。
自動生成した文章を一定間隔ごとにtweetするbotアカウントを作りました。
[アニメ見て日本語覚えたbot - Twitter](https://twitter.com/anime_de_oboeta)
![アニメ見て.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398022/a2ed5b33-f13c-6a61-8e54-e0281bb88458.jpeg)

#環境
ubuntu 18.04 LTS / python 3.6.7 / php 7.2.17

#TwitterAPIの利用申請
Twitterの機能を利用するためにはAPIの申請が必要なようです。こちらの記事（[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2018年9月時点の情報 - Qiita](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)）を参考に申請を行いConsumerキーとアクセストークンを入手しました。

#TwitterOAuthを使ってtweetを行う
APIを使用するにはTwitterOAuthが必要なようなので[https://github.com/abraham/twitteroauth](https://github.com/abraham/twitteroauth)からダウンロード、解凍して適当なディレクトリに置きます。
とりあえずこんな感じのディレクトリ構成にしました。

```
~/workspace/
  ┣ twitteroauth/
  ┣ assdumper/
  ┣ Videos/
  ┃    録画した.tsファイルをすべてここに入れておく
  ┣ wakatigaki.txt
  ┣ ass2text.py
  ┗ generate_text.py
```

公式ドキュメント（[https://twitteroauth.com/](https://twitteroauth.com/)）を参考に下記のようなコードにしてみました。

```tweet.php
<?php

//OAuthライブラリの読み込み
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

//認証情報
$consumerKey = '取得したconsumerKey';
$consumerSecret = '取得したconsumerSecret';
$accessToken = '取得したaccessToken';
$accessTokenSecret = '取得したaccessTokenSecret';

//接続
$connection = new TwitterOAuth( $consumerKey, $consumerSecret, $accessToken, $accessTokenSecret );

//文章生成
exec( 'python3 generate_text.py', $out );

//tweet
$statues = $connection->post( "statuses/update", [ "status" => $out[ 0 ] ] );

?>

```
このファイルをworkspace直下において実行すると自動生成された文章がtweetされます。

#crontabでスケジューリング
あとはcrontabでスケジューリングしたら完成です。

```.sh
crontab */20 * * * * cd ~/workspace && php tweet.php

```
これで20分ごとに自動生成した文章がtweetされます。
#あとがき
記事に書くことがなくて困るくらい簡単に出来ました笑
twitterAPIの利用申請時の英作文が一番苦労したんじゃないかってぐらいです笑
TwitterOauthさまさまですね。
Angular + Cloud Firestoreでデータ登録する方法

2017年10月にリリースされたCloud Firestore(ベータ版)をAngularで利用してみました。

## Cloud Firestoreとは？

> Google の柔軟でスケーラブルな NoSQL クラウド データベースを使用して、クライアント側開発とサーバー側開発のデータを保存、同期します。
> 引用元：[Cloud Firestore | Firebase](https://firebase.google.com/docs/firestore/?hl=ja)

主な特徴は以下のとおりです。

- 強力なクエリを備えたドキュメントとコレクション
- オフライン データアクセスに対応した iOS、Android とウェブ SDK
- リアルタイム データ同期
- 高い整合性を持った自動マルチリージョン データ複製
- Node、Python、Go、Java のサーバー SDK

従来のRealtime Databaseと比べ役割が似通ってますが、複雑なデータ構造が扱いやすくなる、クエリ機能、スケーラビリティなど様々な面で強化されています。

[データベースを選択: Cloud Firestore または Realtime Database  |  Firebase](https://firebase.google.com/docs/firestore/rtdb-vs-firestore?hl=ja)

## Angularに実装してみる
Cloud Firestoreにユーザ情報を登録するserviceクラスを実装しました。

### 実行環境

- Angular: 6.0.3
- angularfire2: 5.0.0-rc.10
- firebase: 5.0.4

### プログラム

```typescript
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { AngularFireAuth } from 'angularfire2/auth';
import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';
import { User } from '../../class/user';

@Injectable({
  providedIn: 'root'
})
export class UserService {

  private userCollection: AngularFirestoreCollection;

  constructor(
    private db: AngularFirestore,
    private router: Router
  ) {
    this.userCollection = db.collection('users');
  }

  save(user): void {
    this.db.collection('users').doc(user.uid)
      .snapshotChanges()
      .subscribe(data => {
        if (!data.payload.exists) {
          this.userCollection.doc(user.uid).set(user.getData());
        }
        this.router.navigate(['/']);
      });
  }
}
```

### Realtime Databaseから移行しハマるとこ
キモはこの行の**set関数**です。

```typescript
this.userCollection.doc(user.uid).set(user.getData());
```

**公式のサンプルでは下記の様にItemクラスをそのままセットしてますが、このままではエラーになります。【2018年6月現在】**
[https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md](https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md)

※add関数と前述のset関数の違いについては後ほど説明します。どちらもエラーになることには変わりありません。

```typescript
this.itemsCollection.add(item);
```


試しに先程のserviceクラスを同じ様に実装して試してみます。

```typescript
this.itemsCollection.doc(user.uid).set(user);
```

すると次のようなエラーが発生します。

```bash
FirebaseError: Function DocumentReference.set() called with invalid data. Data must be an object, but it was: a custom User object
```

カスタムオブジェクトはダメとのことなので、userクラスにgetData関数を追加します。

```typescript
export class User {
  uid: string;
  displayName: string;

  constructor(user) {
    this.uid = user.uid;
    this.displayName = user.displayName;
  }

  getData(): object {
    const result = {};
    Object.keys(this).map(key => result[key] = this[key]);
    return result;
  }
}
```

そしてset関数にはgetData関数から返された値を設定します。

```typescript
this.itemsCollection.doc(user.uid).set(user.getData());
```

これでエラーとならず登録できるようになりました。

### 補足：addとsetの違い
ぼくが作成したプログラムと公式のサンプルでちょっと異なっていたsetとaddの違いですが、**ドキュメントのキー（赤枠部分）を指定するかしないかの違い**になります。

![20180607162556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116168/5e8abd22-60dd-360b-ba48-0f3b221f2abc.png)

add関数で追加した場合はドキュメントのキーはランダム値になります。
キーを指定したい場合はdoc関数にキーを指定し、set関数にフィードの値を設定します。
Minecraft Skript 基礎編 Part.2

#アーグメントについて・・・
無理やり日本語にしてみましたが、正式には`argument`と書き、Skriptでは`arg`と略すことが可能です。

まあ、何に使うのかというとコマンドです。

きっとMinecraftをやっている人でよくコマンドを使う方はわかると思いますが、`/give @a stone 5`とすれば石をすべてのプレイヤーに５つ渡すというコマンドです。

そしてこの中にargumentは含まれています。

**それは`@a` `stone` `5`です。**

まあ、単純に言えば`/give`などの主体部分のあとの部分がargumentです。

そしてカスタムコマンドにもこれはできます。

デフォルトコマンドだとわかりずらいかもですが、よくプラグインなどで、コマンドの主体はすべて同じというものを見かけませんか？

じつはそれをSkriptでもできるのです。

```:test.sk
command /test <text>:
    trigger:
        if arg-1 is "close":
            execute console command "/whitelist on"
            loop all players:
                if loop-player is not an op:
                    kick the loop-player due to "サーバーが非公開になりました"
            send "サーバーを非公開にしました" to player
            stop
        if arg-1 is "open":
            execute console command "/whitelist off"
            send "サーバーを公開しました" to player
            stop
        else:
            send "&cそのようなコマンドは存在しません" to player
```
はい、`IF`と`ELSE`を使って、コマンドを増やしました。

今回追加したコマンドは`/test close`と`/test open`です。
`/test close`は以前紹介したコードですし、`/test open`はホワリスを解除して、メッセージを流してるだけなので説明はいりませんね。

ここで理解していただきたいのは、`arg-1`という部分です。

この`arg-1`はargumentのことでこのコマンドでいうと`<text>`の部分ですね。
まあ、それ以外argumentはないのですが・・・

って<text>って何？って方が多いのではないでしょうか？

コマンドにargumentは追加したいときは<～～～>を追加すると覚えていてください。

<～～～>

このように記した理由なんですが、すべて<text>にしてもいいのですが、それだとコードを見ただけで理解しにくいんです。

argumentには<text>のほかに<player>、<number>、<int>・・・などなど。あらゆる形式があります。

例えば、カウントアップコマンドを作ってみましょう。

```:test.sk
command /cu <int>:
	permission: skript.admin
	trigger:
		loop arg-1 times:
			if loop-number is arg-1:
				send "%loop-number%" to player
				execute console command "/playsound entity.enderdragon.ambient master %player% ~ ~ ~ 1 0.7 1"
			else:
				send "%loop-number%" to player
				execute console command "/playsound entity.experience_orb.pickup master %player% ~ ~ ~ 1 0.5 1"
				wait 1 seconds
```
はい。
また新しいもの出しちゃったけど先に<int>について説明します。

といいたいけど、そこまで重要じゃないので興味がある方は[コチラ](https://wa3.i-3-i.info/word14966.html)を見てください。（変数についても書いています）

それでは`loop time`について説明しましょう。

#Loop timeについて・・・
loop timeというのは「指定した回数実行しまっせ」というコード。
Skriptでの使い方は`loop 5 times:`のように書きます。

今回は5をarg-1として`/cu 5`というコマンドを実行することになり、入力した回数によってカウントする数を変えれるのです。

そして、今回はカウントアップということで数字を出さなければならないのですが、それはとても単純なんです。

それは`loop-number`を使うというものです。
先ほど`loop-number`でカウントアップしたように表示できるのです。
「今、何回目のループですよ～」ってね。

#waitコードについて・・・
`wait 1 seconds`というものがあったのを覚えていますか？

これは１秒間待つというコードです。

この他にも`wait 1 tick`という１tick待つというものもありますが、今は気にしなくてもいいでしょう。

これで１秒ごとにカウントアップするようになります。

`execute console command`で音がでるようにしています。

実はSkriptで音を出せるのですがバグなのかうまくいかないことがあるので今回は紹介しません。

そしてカウントアップ終了時、入力した数値と同じになった場合、別の音声を流すようにしています。

##実行時の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404179/64d66ab7-31d4-3794-62ea-c96a4f5325a1.png)

次は[コチラ](https://qiita.com/meoto2408/items/d50f645ae0003e241b6b)

前は[コチラ](https://qiita.com/meoto2408/items/3d507c1d1417b73e641b)
MacでコマンドラインからGitのチートシートを表示させる

### 記事の概要

[Git でよく使われるコマンドにイラストによる説明を加えて1枚のチートシートにまとめてみた](https://qiita.com/kozzy/items/b42ba59a8bac190a16ab)で紹介されているチートシートがとても便利なので、ターミナルからコマンド1つで表示されるように設定しました。その方法を簡単に紹介します。

ちなみに、私の環境は「macOS Mojave 10.14.3」です。

### 方法の概要

- Gitのサブコマンド機能を使って自作コマンドを作成
- ターミナルからクイックルックを呼び出してチートシートを表示

それぞれの機能の簡単な説明は次のとおりです。

### 今回使った機能の概要

#### Gitのサブコマンド機能

Gitには、`git-subcommand`という実行ファイルをパスの通ったディレクトリに保存しておくと、

```bash
$ git subcommand
```

というコマンドで自作のコマンドを実行できる機能があります。

`git-subcommand`を保存するディレクトリは、`git --exec-path`コマンドで表示されるパスか、`echo $PATH`コマンドで表示されるパスのいずれかでOKです。

#### クイックルックをターミナルから呼び出す方法

これは簡単で、`qlmanage -p (開きたいファイル)`でOKです。

### 各機能の組み合わせ

まず、表示させたいチートシートをダウンロードします。

続いて、`git --exec-path`コマンドでGitがサブコマンドを探すパスを確認します。

```bash
$ echo git --exec-path
# 私の環境での実行結果
# /usr/local/Cellar/git/2.21.0/libexec/git-core
```

そして、確認できたパスに`git-cheet`という名前のファイルを作成します。ファイル名がサブコマンドの文字列になりますので、その点を念頭に置いてファイル名を決めます。

そして、`git-cheet`ファイルにスクリプトを書きます。

```bash
#!/bin/sh
qlmanage -p ~/Git_cheet_sheet.png
```

これで、コマンドラインで`git cheet`と入力するだけで、チートシートをクイックルックで表示させることができるようになります。

### 参考記事

- [Git でよく使われるコマンドにイラストによる説明を加えて1枚のチートシートにまとめてみた](https://qiita.com/kozzy/items/b42ba59a8bac190a16ab)
- [便利な「git-サブコマンド」を作成する - Qiita](https://qiita.com/b4b4r07/items/6b76a5f969231e5e9748)
- [コマンドラインから GUI を操作する - Qiita](https://qiita.com/b4b4r07/items/037377b8efb0c1e36800#qlmanage-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
統計学4 - 標本分散と不偏分散

※こちらの記事は"Pythonで学ぶあたらしい統計学の教科書"に基づいて、統計学初学者が頭の整理とアウトプットを目的に掲載している記事です。本の内容のみならず、自分で調べた内容、自分のイメージにマッチした内容を追記している場合もあります。

※今回はまだまだPythonを使用しません。

私が投稿している[統計学2 - 統計量](https://qiita.com/TAMIYAN/items/c3e07d47c5e2dda791f7)に記載していた、分散についてもう少し詳しく見ていきます。

## 1. 母分散
母分散については、定義式のみ記載しておきます。
本記事の中では使用はしませんが、標本分散と不偏分散の関係において今後必要になるため、区別できるように紹介だけしておきます。
$$ \sigma^2 = \frac{1}{N}\sum_{i=1}^{N}(x_i-\mu)^2$$


## 2. 標本分散
先に式を見たほうがイメージ湧きやすいと思います。
標本分散$s^2$は式(1)のように表現されます。
$$s^2 = \frac{1}{N}\sum_{i=1}^{N}(x_i-\bar{x})^2 = \sum_{i=1}^{N}P(x_i)(x_i-\bar{x})^2 \tag{1}$$ 

上記の式の変数を説明しておきますが、$x_i$は標本を表しています。$\bar{x}$は平均値です。
期待値は下記の式で表現されます。期待値は標本の総和をサンプルサイズ(標本の個数)$N$で割ることで算出されます。
$$\bar{x} = \frac{1}{N}\sum_{i=1}^{N}x_i \tag{2}$$
また、$P(x_i)$は、確率変数$x_i$における確率です。

さて、数式(1)の説明へ移ります。
$(x_i-\bar{x})$を偏差と呼び、偏差の二乗和$\sum(x_i-\bar{x})^2$を偏差平方和と呼びます。
偏差平方和は、データ$x_i$と期待値$\bar{x}$の距離と見なすことができますので、標本分散は｢**"データと期待値の距離"の期待値**｣であると言えます。

## 3. 不偏分散
不偏分散の式は下記の通り表されます。
$$u^2 = \frac{1}{N-1}\sum_{i=1}^{N}(x_i-\bar{x})^2\tag{3}$$ 
さて、標本分散に引き続き、こちらも分散ですが、何が異なるのでしょうか。
(1)と(3)を比較すると、$u^2 = \frac{N}{N-1}s^2$となっていることがわかります。
つまり、$s^2$は$u^2$より小さいということが式から読み取ることができます。

$s^2$の方が小さいわけですが、何か理由があるのでしょうか。

もちろん理由はあります。
標本分散では、母分散(母集団の分散)$\sigma^2$に比べて分散を過小評価してしまうというバイアスがあります。これを修正したものが、不偏分散です。なぜ、標本分散が母分散と比較した時に過小評価されてしまっているのか、という点については、改めて別の記事で解説しておきます。

## 参考サイト
[なぜ不偏分散はN-1で割るのか - Kosugitti's BLOG](http://kosugitti.sakura.ne.jp/wp/wp-content/uploads/2013/08/est.pdf)
[期待値の定義・性質・計算例。平均との違いも！ - to-kei.net](https://to-kei.net/basic/glossary/expected-value/#i-7)
Vagrant cannot forward the specified ports on this VM, since they would collide with some other application that is already listening on these ports. の解決方法

forwarded_portして、特定のポートをvagrantfileで指定し,
vagrant upした時に出てくるエラーの解決方法。

```shell
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 8080 is already in use
on the host machine.

To fix this, modify your current project's Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.network :forwarded_port, guest: 80, host: 1234

Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding. You could
try 'vagrant reload' (equivalent of running a halt followed by an up)
so vagrant can attempt to auto-correct this upon booting. Be warned
that any unsaved work might be lost.
```



これはすでに他のポートが使用されているからなので、他で使われているポートを確認=>killすればOK。


#使用しているプロセスのポート番号を確認
例えば、8080ポートを使っているプロセスを確認したい時

```shell
$sudo lsof -i tcp:8080
COMMAND     PID       USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
VBoxHeadl 47319       hoge   19u  IPv4 0x8dcbc04453b308b      0t0  TCP *:http-alt (LISTEN)
```

#ポートを閉じる（プロセスを終了する）

上記で出てきたプロセス(PID)をkillする。

```shell
$kill 47319
```
いつかUnity Package Manager使う時用のメモ

現状以下のバージョンで利用可能

Unity2019.1 => Package Manager UI 2.1.2
Unity2018.3 => Package Manager UI 2.0.7

なのだけど、今の所、依存パッケージの管理がしんどいのでもう少し見送ることにした。
（特に自作パッケージが外部パッケージの依存を多く持つ時がしんどい）

Packageの開発ワークフローは悪くないんじゃないかと思います。

あとはもんりぃ先生が開拓しきったらその後ろを楽に歩く事にします
https://monry.hatenablog.com/entry/2019/04/17/024205

## Packageの作成

以下みたいな構成にする

- rootにpackage.json
- rootにAssembly Definition Files

```
.
├── Scripts
│   ├── MyModule.cs
│   └── MyModule.cs.meta
├── MyModule.asmdef
├── MyModule.asmdef.meta
├── package.json
└── package.json.meta
```

`package.json`の内容

```
{
    "name": "com.meleap.unity.plugin.mymodule",
    "displayName": "MyModule",
    "description": "Kore wa my module desu",
    "version": "1.0.3",
    "unity": "2018.3",
    "dependencies": {}
}
```

上記をgitでタグ付けする

```
git tag 1.0.3
git push --tags
```



## 使う側

manifest.jsonの指定方法

```
{
  "dependencies": {
  	"com.meleap.unity.plugin.mymodule": "ssh://git@github.com/meleap/MyModule.git#1.0.3",
	...
  }
}
```

unityで読み込むと次のようにlockが追加される

```
{
  "dependencies": {
  	"com.meleap.unity.plugin.mymodule": "ssh://git@github.com/meleap/MyModule.git#1.0.3",
	...
  },
  "lock": {
    "com.meleap.unity.plugin.mymodule": {
      "hash": "fa1a3387c4ac95fafecaa95af71c3d327dc7728c",
      "revision": "1.0.3"
    }
  }
}
```

lock部分を消してUnity再起動すると、再インポートされる


## Packageの開発ワークフロー

普通にUnityProjectとして開発を進めておいて、タグ付けするブランチをgit subtree管理することで
ディレクトリ構成を変える


```
.
├── Assets
│   ├── Scenes
│   ├── MyModule1 
│   │   ├── Scripts
│   │   │   ├── MyModule.cs
│   │   │   └── MyModule.cs.meta
│   │   ├── Scripts.meta
│   │   ├── MyModule.asmdef
│   │   ├── MyModule.asmdef.meta
│   │   ├── package.json
│   │   └── package.json.meta
│   └── MyModule.meta
├── Library
├── Packages
└── ProjectSettings
```

タグをつけるタイミングで


```
git subtree split --prefix=Assets/MyModule --branch upm
```

upmブランチは以下になる

```
.
├── Scripts
│   ├── MyModule.cs
│   └── MyModule.cs.meta
├── MyModule.asmdef
├── MyModule.asmdef.meta
├── package.json
└── package.json.meta
```

push, push, push

```
git tags 1.1.0 upm
git push origin upm --tags 
```
Railsのインストール

##目次
1.Homebrewのインストール
2.rbenvとruby-buildのインストール
3.rbenvのパスを通す
4.readlineのインストール
５.rbenvを利用してRubyをインストールする
6.Mysqlのインストール
7.Mysqlの自動起動設定
8.Mysqlコマンドを実行できるようにする
9.bundler(gem)のインストール
10.Rails(gem)のインストール

##1.Homebrewをインストール

```:ターミナル
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 

$ brew -v
$ brew update
```

##2.rbenvとruby-buildのインストール

```:ターミナル
$ brew install rbenv
$ brew install ruby-build
```

##3.rbenvのパスを通す

```:ターミナル
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

4.readlineのインストール

```:ターミナル
$ brew install readline
$ brew link readline --force
```

##5.rbenvを利用してRubyをインストールする

```:ターミナル
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.3.1
$ rbenv install 2.5.1
$ rbenv rehash
$ rbenv global 2.5.1
$ ruby -v
```

##6.MySQLのインストール

```:ターミナル
$ brew install mysql@5.6
```

##7.MySQLの自動起動設定

```:ターミナル
$ mkdir ~/Library/LaunchAgents 
$ ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
```

##8.MySQLコマンドを実行できるようにする

```:ターミナル
#mysqlのコマンドを実行できるようにする
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
#mysqlのコマンドが打てるか確認する
$ which mysql
#以下のように表示されれば成功
/usr/local/opt/mysql@5.6/bin/mysql
```

##9.bundler(gem)のインストール

```:ターミナル
$ gem install bundler
```

##10.Rails(gem)のインストール

```:ターミナル
$ gem install rails --version='5.2.2.1'
$ rbenv rehash
$ rails -v
```
Leetcode #121: Best Time to Buy and Sell Stock

Time Complexity: O(n), only one pass is needed
Space Complexity: O(1), only two variables are needed.

```swift
func maxProfit(_ prices: [Int]) -> Int {
    if prices.isEmpty {
        return 0
    }
    var minPrice = Int.max
    var maxProfit = 0
    for i in 0..<prices.count {
        minPrice = min(minPrice, prices[i])
        maxProfit = max(maxProfit, prices[i] - minPrice)
    }
    return maxProfit
}
```
DataFrame　マルチレベルインデックス　｜備忘録

#マルチインデックスの書き方
→　インデックスをさらに大きなレベルのインデックスでまとめる

【前提】
pythonのDataFrameにてエクセル読み込み
e.g.　df = pd.read_excel('hogehoge.csv')

→　日本、韓国、中国、イタリア、フランス、スペインのcolumnsはあるが、それをより大きなインデックスでまとめたい。

###最終目的
<img width="526" alt="スクリーンショット 2019-04-29 12.25.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407482/4b820c73-2f6e-cc0c-0fd2-9fe1b7d3bbf2.png">
上の図のアジアやヨーロッパのようにまとめること


##方法

df = pd.read_excel('hogehoge.csv')　#元のデータを読み込む

d = {}　#空の辞書を作成
d['アジア'] = df[['日本','韓国','中国']]　
d['ヨーロッパ'] = df[['イタリア','フランス','スペイン']]

df = pd.concat(d, axis=1) # ２つを結合
df = df.loc[:,['関東','四国']] # 列の並び替え

dfdf.to_csv('hogehoge.csv')
【Unity】 Unity側のプライバシーポリシーの実装


以下のプライバシーポリシーを作成し、ホームページやFaceBookにUPして、
UnityのTop画面からボタン押下で、外部ブラウザを起動して
プライバシーポリシーを表示させる。

プライバシーポリシーの作成方法は、以下を参照。
【GooglePlay】 AdMob広告を入れた場合のプライバシーポリシー対応方法（英語版ジェネレート）
https://qiita.com/nonkapibara/items/a9d63e692bc3aa5c314e


Unity側で、プライバシーポリシーを設置しているサイトを開く。という実装をする

```
    public static void OnTapPrivacy() {
        string url = "https://ameblo.jp/nonkapibara/entry-12457558044.html";
        Application.OpenURL(url);
    }
```


Google Play Consoleの「ストア掲載情報」の「プライバシーポリシー」欄に
URLを設定する
<img width="1087" alt="スクリーンショット 2019-04-29 23.16.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b8796bf6-3b55-98a8-5cb1-dbf985111209.png">

完了！

<br/>
<br/>

↓↓Google Play 無料Free
[![googleStoreLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/4f311c2d-2092-e9b8-bc53-4291aeb114f3.png)](https://play.google.com/store/apps/details?id=com.non.CherryCocktailGrass)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">⭐️Androidアプリ⭐️リリース<br>🍒CherryCocktailGlass🍒<br>Blenderで絵を描いてUnityで作成したミニゲームリリースしました😍<br>🍷カクテル🍷グラス🍷に<br>🍒チェリー🍒をのせるシンプルなゲームです。<br>✨（●＾o＾●）✨<br>【Android】<br>Google Play 無料Free<a href="https://t.co/I70R9QEDuq">https://t.co/I70R9QEDuq</a><a href="https://twitter.com/hashtag/CherryCocktailGlass?src=hash&amp;ref_src=twsrc%5Etfw">#CherryCocktailGlass</a> <a href="https://t.co/g8kCM9QVhL">pic.twitter.com/g8kCM9QVhL</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1121818121323433984?ref_src=twsrc%5Etfw">April 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Homebrew経由でDocker Toolboxインストール奮闘（そもそもVirtualBoxのURLが問題）

## 経緯
現在(2019年4月)はMacのアプリ版Dockerがありますが，当方古いMacでCPUが仮想化対応しておらず，仕方なくDocker Toolboxをインストールしようとしたところ，ハマった話を残しておきます

### 結論
Docker Toolboxインストール時にVirtualBoxもインストールされるが，VirtualBoxのダウンロード元がそもそもなんかおかしい．VirtualBoxのダウンロード元アドレスを https → http に変更したら解決．

## ログ
### 環境
- MacBook Pro (Mid2010)
- macOS Sierra 10.12.6
- Homebrew 2.1.1-81

### 1. 普通にインストールしようとすると..
まず Docker Toolboxのインストーラ版はフリーズしました
参考: https://qiita.com/nemui-fujiu/items/231971609762a6562af3

次にHomebrew経由でインストールしようとすると以下のエラー

```sh
$ brew cask install docker-toolbox
(略)
curl: (60) SSL certificate problem: Invalid certificate chain
(略)
Error: Download failed on Cask 'virtualbox' with message: Download failed: https://download.virtualbox.org/virtualbox/6.0.6/VirtualBox-6.0.6-130049-OSX.dmg
```
VirtualBoxのダウンロード(cURL)でエラーが起きている．

### 2. cURLの問題かと思ったらそうでもなかった
色々調べるとHomebrewのcURLがOSネイティブのTLS1.2できないやつを参照しているからとかなんとか．
https://qiita.com/shiro_yone/items/fabe27e229a7e2c0f127
http://blog.naoshihoshi.com/entry/2016/11/10/083000

Homebrewのopensslとcurlをインストール → opensslを使っていない

```sh
$ brew install openssl curl
$ nano .bash_profile
export PATH="/usr/local/opt/openssl/bin:/usr/local/opt/curl/bin:$PATH" を追加
$ source .bash_profile ← 再読み込み
$ curl --version
curl 7.64.1 (x86_64-apple-darwin16.7.0) libcurl/7.64.1 SecureTransport zlib/1.2.8
↑ openSSLを使っていない
```

curl-opensslというFormulaがあるらしいので入れてみる

```sh
$ brew install curl-openssl
.bash_profile のPATHに /usr/local/opt/curl-openssl/bin を追加
$ curl --version
curl 7.64.1 (x86_64-apple-darwin16.7.0) libcurl/7.64.1 OpenSSL/1.0.2r zlib/1.2.8 brotli/1.0.7 c-ares/1.15.0 libssh2/1.8.2 nghttp2/1.38.0 librtmp/2.3
```

openSSL対応になったが，docker-toolbox はインストールできず．

### 3. そもそもVirtualBoxのURLおかしい
この時点で試しに直接VirtualBoxをブラウザでダウンロードしようとすると..

```
https://download.virtualbox.org/virtualbox/6.0.6/VirtualBox-6.0.6-130049-OSX.dmg
→ An unauthorized request.
```
これについて調べて見ると，証明書とページのドメインが一致していない問題が．
https://qiita.com/rekaito/items/6e1a7c26af4830ad2a10
つまり http 接続にすると.. 

```
http://download.virtualbox.org/virtualbox/6.0.6/VirtualBox-6.0.6-130049-OSX.dmg
→ ダウンロードできた
```

### 4. Homebrewに適用
Homebrewのvirtualbox用ソースを変更

```ruby:/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Casks/virtualbox.rb
- url "https://download(以下略)"
+ url "http://download(以下略)"
- appcast 'https://download.virtualbox.org/virtualbox/LATEST.TXT'
+ appcast 'http://download.virtualbox.org/virtualbox/LATEST.TXT'
```

これで`brew cask install docker-toolbox`したらVirtualBoxのインストールはできるようになりました．

### 余談
Macの対応機種こちらにありました: https://qiita.com/superdog/items/ca7c1d1f22fd84bdf603
2010は古いよね.. いや，だって動くから使うやん..
SSL化させる前に、SSLの仕組みを調べてみた



# SSL通信って簡単にいうとどいういう仕組みなの・・・？という方向けの記事

私はさくらのVPS・CentOS7にDockerをインストールした環境にリバースプロキシコンテナを使ったマルチドメインを構築したいのですが、なかなか上手く行かず、その中の一つにSSL化が何故かうまくいきません。

恥ずかしながら、SSLとは通信セキュリティの担保ぐらいの認識でした。

そのため、今回はそのSSLとは何か、その仕組みについて自分なりにですが簡単に調べてまとめてみました。

# SSL通信をする目的・役割は何か？(→3つあります)

まずネットでSSL通信をする目的・役割は何かを調べてみて、以下のページを発見。

[SSLとは？ | 基礎から学ぶSSL入門ガイド | CSP SSL](https://cspssl.jp/guide/ssl.php)

正式名称とSSL通信をする目的・役割について言及されています。

図や短い文章でまとめられていたので、おすすめの記事です。

引用すると、

>SSLとは「Secure Socket Layer」の略で、WebサーバとWebクライアント（ブラウザ等）やメールサーバとメールクライアント（メーラー等）等の通信を安全に保つために利用されています。
>SSLは『暗号通信』というイメージが強いですが、それは通信の安全性を保つ3つの機能のうちのひとつでしかありません。SSLは__「通信内容を秘匿する暗号機能」と「通信相手の真正性」「通信データが改ざんされていないか検知する機能」の3つの機能があり、その機能を使うことによって安全に通信することができます。__
>[SSLとは？ | 基礎から学ぶSSL入門ガイド | CSP SSL](https://cspssl.jp/guide/ssl.php)から

ということで、SSL通信を行う目的・役割に関して簡単にまとめると、
1. 通信内容を暗号化する
2. 通信対象が正しいかチェック
3. 通信内容が改ざんされていないかチェック
の3つということですね。

# 3つの目的・役割をどのように果たしているのか？(→4つのステップでSSL通信ができます。但し準備物が一つ有)

それでは、どのように3つの目的・役割を果たしているのかその仕組を調べてみました。

調べた結果、個人的にわかりやすいソースは以下。

[SSL暗号化通信の仕組み｜GMOグローバルサイン【公式】](https://jp.globalsign.com/ssl-pki-info/ssl_practices/ssl_encryption.html)

こちらはSSL通信の流れの図と説明がわかりやすかったです。

文章だけ引用すると、

>__1. 接続要求__
>クライアント側からSSL通信のリクエストをサーバ側へ送信。
>__2. SSLサーバ証明書と公開鍵をクライアント側へ送付__
>サーバ側から、公開鍵付きのSSLサーバ証明書がクライアント側に送付。
>クライアント側のブラウザに搭載されているルート証明書で署名を確認し、SSLサーバ証明書を検証。
>※グローバルサインをはじめとする「信頼のある認証局」のルート証明書は、あらかじめ主要PCブラウザや携帯端末に搭載されているので、ユーザ側で新たにインストールする必要がありません。
>__3. 共通鍵(セッションキー）を暗号化しサーバ側へ送付__
>クライアント側で生成された暗号用の「共通鍵(セッションキー）」を、サーバ側から送られてきた公開鍵を用いて暗号化し、サーバ側へ送信。
>サーバ側に送信された共通鍵は、サーバ側で保持している秘密鍵で復号化され、共通鍵が取り出される。
>__4. SSL暗号化通信開始__
>個人情報などの機密性の高いデータを、クライアント側で保持している共通鍵で暗号化しサーバ側へ送信。
>サーバ側は、受け取った暗号データをサーバ側で保持している共通鍵で復号してデータを取得する。
>※共通鍵は、サーバとクライアントが使用するブラウザの双方が対応する、最も強度の高い暗号方式・鍵長が使用されます。
> [SSL暗号化通信の仕組み｜GMOグローバルサイン【公式】](https://jp.globalsign.com/ssl-pki-info/ssl_practices/ssl_encryption.html)から

ということで、引用元の図にある、4番の状態(情報を暗号化してクライアントとサーバーで通信し合う)を実現するために、SSLの仕組みは以下のようになるかと思います。

1. クライアントがサーバーに接続をリクエスト
2. リクエストを受けたサーバーはクライアントにSSL通信を行うために必要なもの(サーバー証明書・公開鍵)を送付→クライアントはサーバー証明書に記載されている情報が正しいか検証→通信対象が正しかったら、共通鍵を生成(4の状態での暗号文を復号化するため)__※★ここで通信対象が正しいかチェックという役割を果たす★__
3. クライアントは共通鍵を暗号化し、サーバーに送付→暗号化された共通鍵を受け取ったサーバーは、秘密鍵でその共通鍵を復号化
4. クライアント・サーバー両方で、通信内容を暗号化→共通鍵で復号化して読込という流れ通信を行う__※★ここで通信内容を暗号化という役割を果たす★____※★ここで通信内容が改ざんされていないかチェックという役割を果たす★__

という感じかなと思います。
この流れを実現するためには、サーバー側には秘密鍵付きのサーバー証明書の設置が必要とのこと。

4番の状態までにするまでのステップは引用先の図がわかりやすいのでぜひ見てみるのをおすすめします。

# サーバー証明書を準備できたら、SSL通信ができます！

サーバー証明書を発行するためには、認証局を通して発行し、サーバーに設置することになります。

認証局は、シマンテック、グローバルサイン、無料で使えるLet's Encryptなど様々です。

私は勉強で使うので、無料で使えるLet's Encryptを使います。

# さいごに

普段何気なくWEBサイトをSSL化させていたのですが、仕組みについて分かったので少し前進した気がします。

私はVPS・CentOS7にDockerをインストールした環境にリバースプロキシコンテナを使ったマルチドメインを構築し、SSL化もさせたいので、次はそこについて調べてみようかなと思っています。

# 参考

[SSLとは？ | 基礎から学ぶSSL入門ガイド | CSP SSL](https://cspssl.jp/guide/ssl.php)

 [SSL暗号化通信の仕組み｜GMOグローバルサイン【公式】](https://jp.globalsign.com/ssl-pki-info/ssl_practices/ssl_encryption.html)
Leetcode #120: Triangle

```swift
func minimumTotal(_ triangle: [[Int]]) -> Int {
    if trianlge.count == 0 {
        return 0
    }
    var nums = Array(repeating: triangle[0][0], count: triangle.count)
    var tmp = nums
    for i in 1..<triangle.count {
        nums[0] += triangle[i][0]
        for j in 1..<i {
            nums[j] = triangle[i][j] + min(tmp[j], tmp[j-1])
        }
        nums[i] = tmp[i-1] + triangle[i][i]
        tmp = nums
    }
    return nums.min()
}
```
最低限のTwitter bot をRubyで実装してみた

## はじめに
ふとTwitterのbotの作り方が気になったので、今回はRubyで1日１回ツイートしてくれるbotを作ってみました。
(Pythonでもだいたい同じものを作ったのですが、そちらは別記事で投稿します。)

## 使用環境
+ CentOS 7.4
+ Ruby 2.5.1

## 実装の流れ
実装は以下の４ステップで実装を進めました。

1. Twitter開発者サイトでアプリの登録
2. 必要なモジュールのインストール
3. ツイートする処理のコーディング
4. crontabで定期的に実行させる

## Twitter開発者サイトでアプリの登録
今回、コーディングよりもここが一番の山場でした。。。

アプリの登録のやり方ですが、事前にbot用のアカウントを取得した上で、
[開発者サイト](https://developer.twitter.com)にアクセスします。

bot用のアカウントでログインし、アプリの登録を進めていけばいいのですが、、
2018年夏頃から、Twitter側の審査が厳しくなり、事前にどういったアプリなのか
申請が必要になりました（英語で３００単語程度）
説明が簡単すぎると、審査が通りません（私は２回目で申請が通りました。）

こんな記事も出てますね

Twitter、API使用条件を厳格化　「厳しすぎる」開発者から悲鳴も
https://www.itmedia.co.jp/news/articles/1807/26/news079.html

申請が上手く通ったら、アプリの作成を進めていきます。
手順は以下のブログ記事を参考に進めました。
https://toaster-inc.com/twitter-bot-pmp-vocabulary-02/

以下４つの文字列が生成できればこのステップは完了です。

+ Access Token
+ Access Token Secret
+ Consumer Key
+ Consumer Secret

## 必要なモジュールのインストール
必要なGemをインストールします。
今回はクライアント側でTwitterのAPIを叩くので、以下のコマンドで
Twitterをインストールします。

```
$gem install twitter
```

インストールが無事完了したら、次に進みます。

## ツイートする処理のコーディング

コードは以下の通りです。
~/ruby_bot/bot.rb

```
require 'twitter' #twitterの読み込み
 
#作成したTwitterアプリにアクセスする情報を記載する
twClient = Twitter::REST::Client.new do |config|
    config.consumer_key    = "取得したConsumer keyを入力"
    config.consumer_secret = "取得したConsumer Secretを入力"
    config.access_token    = "取得したAccess Tokenを入力"
    config.access_token_secret = "取得したAccess Token Secretを入力"
end
 
twClient.update("Tweet from Ruby!!") #ツイートする文字列
```

rubyコマンドで上記のスクリプトファイルを実行すればツイートできます。

```
$ruby bot.rb
```

<img width="588" alt="スクリーンショット 2019-04-29 15.45.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125532/58c9cba2-bc84-f23d-8816-b35c64fe5cc0.png">

## crontabで定期的に実行させる

プログラムでツイートできるところまでできたので、crontabを使って
定期的に実行します。

'crontab -e'を実行すると定期実行するコマンドの設定画面（エディタ画面）が出てくるので
以下のように設定を入れていきます。

参考
https://eng-entrance.com/linux-command-crontab

```
0 16 * * * /usr/bin/ruby /home/username/ruby_bot/bot.rb
//分 時 日 月 曜日 コマンドのファイルパス 実行するファイルのパス
```

設定が保存されたら、定期的に実行されるようになります。
上記だと、毎日bot.rbが16時に実行されます。

##最後に
今回は今後拡張性を持たせるためにかなりシンプルにしてます。
いろんなAPIをプログラムから叩きつつ、あとはユーザーのツイートに反応できるようにも
してみたいなと考えております。
vuexでmapStateのimportの仕方を間違えてた話

# 問題
mapStateを使って、stateをコンポーネントで使おうとしたとき、
`Error: [nuxt] Error while mounting app: TypeError: Object(...) is not a function`
とコンソールに表示され、画面が表示されなくなった

問題のコード↓

```hoge.vue
<script>
import mapState from 'vuex'

export default {
  computed: mapState(`fuga`, {
    isPiyo: `isPiyo`
  })
}
</script>
```

# 間違ってたところ
mapStateはだけimportするときも

```hoge.vue
<script>
import { mapState } from 'vuex'

~~略~~

</script>
```

と書かなければならななかった。


自分はてっきり`{　}`は

```hoge.vue
<script>
import { mapState, mapAction } from 'vuex'

~~略~~

</script>
```
のように複数のmap〇〇ヘルパーをimportするときに使うだけだと勘違いしていた。
Laravelのインストール

##目次
1.composerのインストール
2.Laravelのインストール
3.Laravelのパスを通す
4.Laravelで新規アプリの作成、起動

##1.Homebrewでcomposerをインストール

```:ターミナル
$ brew install composer

$ composer -V　 #確認する
```

##2.composerでLaravelをインストール

```:ターミナル
$ composer global require "laravel/installer"
```

##3.Laravelのパスを通す（どこからでもLaravelのコマンドを使えるようにする）

vimで.bash_profileファイルを開きます。

```:ターミナル
$ vi ~/.bash_profile
```

.bash_profileに下記を記述追加する

```:bash_profile
export PATH="$PATH:$HOME/.composer/vendor/bin"
```

.bash_profileを更新します。

```:ターミナル
$ source ~/.bash_profile
```

##4.Laravelで新規アプリの作成

```:ターミナル
$ laravel new testApp
```
サーバーを立ち上げる

```:ターミナル
$ php artisan serve
```
pyenvでPythonのバージョンを切り替えられない場合

#pyenvでPythonのバージョンを切り替えられない場合【MacOS Mojave】

今回、pyenvでpythonのバージョンを切り替えられない理由は、
MacOS Mojaveにありました！

```
$ pyenv global 3.6.5
```
とすると、

```
pyenv: version `3.6.5' not installed
```

と出てしまう。
そこで

```
$ pyenv install 3.6.5
```
としたものの、

```
pyenv: version `install' not installed
```
とまたまたエラー。

```
$ pyenv install --list
```
ここにはきちんと一覧に載っているのだが、、、
xcode-selectの最新バージョン(2354)にMojave用のmacOS SDK headerがデフォルトで入っていないのが原因のようなので、

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```
これを実行して、再び！

```
$ pyenv install 3.6.5
```
OK！
High Sierra以前ではこれは基本的にxcode-select --install　で直せたが、Mojaveではそう上手く行かないよう。

そして最後に

```
$ pyenv global 3.6.5
```

```
$ python --version                                                                                             
Python 3.6.5
```

できました！
C++erは一体どこから来たのか。

# どこからC++erはやってきたのか。

Twitterでアンケートを取ってみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あなたがC++を学び始める前に学んでいたプログラミング言語(以下、言語)は何ですか？<br><br>1. CからC++<br>C言語を学んだ後にC++を学んだ場合。<br><br>2. 最初からC++<br>最初に学んだ言語がC++の場合。<br><br>3. 他言語からC++<br>C言語以外の言語を学んだ後にC++を学んだ場合。<br><br>4. C++を学んでいない<br>上記以外の場合。</p>&mdash; std::gaccho( ¨̮ );  <a href="https://twitter.com/wanotaitei/status/1121825070458884096?ref_src=twsrc%5Etfw">2019年4月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

|番号|選択肢|割合|説明|
|:---|:---|:---|:---|
|1|CからC++|49％|C言語を学んだ後にC++を学んだ場合。|
|2|最初からC++|10％|最初に学んだ言語がC++の場合。|
|3|他言語からC++|21％|C言語以外の言語を学んだ後にC++を学んだ場合。|
|4|C++を学んでいない|20％|上記以外の場合。|

**投票数は525票でした。**
(1人の人間が525個のアカウントを使用して投票した可能性もなくはないですが、ここでは1人=1票で525人に投票して頂いたと考えます)

全体の1％=5.25人と考えて話を進めていきます。

# 1. C++er以外の人を除く

投票番号1~3番は少なくともC++を学んでいますが、
投票番号4番はC++を学んでいないため、C++erではないでしょう。

投票番号4番は20％いるため、およそ105人です。
525人から105人を引きます。**"C++erの投票数は420票"**となりました。

|番号|選択肢|割合|説明|
|:---|:---|:---|:---|
|1|CからC++|61.25％|C言語を学んだ後にC++を学んだ場合。|
|2|最初からC++|12.5％|最初に学んだ言語がC++の場合。|
|3|他言語からC++|26.25％|C言語以外の言語を学んだ後にC++を学んだ場合。|

それにしてもわたしのTwitter周りの方々は**8割方C++er**という結果、中々に多いですね。

# 2. C++erはどこから来たのか。

**"C言語から来た人は61.25%"**
**"C++の世界から生まれてきた人は12.5%"**
**"C言語以外の他言語から来た人は26.25%"**

という結果になりました。

大雑把に言いますと、
**"8人に5人はC言語から来た。"**
**"8人に1人はC++の世界から生まれてきた。"**
**"8人に2人はC言語以外の他言語から来た。"**
と考えることが出来るでしょう。

**"C言語から来た人が大半だということがわかりました。"**

# 3. C++初学者にはC言語とC++の違いを教えると良さそう

C++を始める人の8人に5人はC言語から来ていると考えると
多くのC++初学者には、まずC言語とC++の違いを教えるのが良いのではないかと考えます。

C言語とC++の違いというば、例えば関数の空引数の定義が違いますよね。

```c:C言語
int func();
```

```cpp:C++
int func();
```

これらは一見、同じものに見えますが、全く違う意味を持っています。
このようにC言語とC++の違いを教えることによって誤った書き方を防ぐことが出来ます。

# 4. 最後に

最初の初歩は**"Better C"**で始まって徐々に**"C++"**の機能を理解していくのが良いのではないかと思います。
**"C++er"**の方々がどこから来たのか。無事に解明できたようです。

おわり。
DjangoでAPI使う練習してみる②

__注意:__著者は初心者なので間違ってることがあるので注意してください。
さて、前回の続きです。まずは今回使うAPIがどんなものか見ていきましょう。
[Weather Hacks](http://weather.livedoor.com/weather_hacks/webservice)ここに仕様が書いてありますね。
簡単にまとめると、
- このAPIたたくとJson形式のデータがもらえるよ
- 基本URLの後ろにIDを入れるとその地域のデータがもらえるよ

そのほか細かいのは仕様を見てみるといいでしょう。

# APIからデータを受け取ってみる
では実際にデータを受け取ってみましょう。
どうやらrequestsというライブラリを使うっぽいのでpipで入れましょう。

```ruby:Terminal
pip install requests --user
```
一番最後の`--user`コマンドはパーミッションエラーが出たのでつけています。
これでインストールできたのでview.pyをいじってみましょう！

```ruby:view.py
import requests  # 追加
import json  # 追加

...
    def get_context_data(self, **kwargs):
        api = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=400040'
        get_data = requests.get(api)
        json_data = json.loads(get_data.text)
        context = super().get_context_data(**kwargs)
        context["data"] = json_data
        return context

```
今回選択する地域とかは、例にあるものをそのまま持ってきます。
`requests.get(api)`でリクエストを送ってデータをもらいます。
そして`json.loads(get_data.text)`で受け取ったテキストをjson形式からデコードしてます。
以降は前回のものと同じですね。
base.htmlも変更しておきましょう。

```ruby:base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--dataを表示するように変える-->
{{data}}
</body>
</html>
```
では実行してみましょう!
<img width="960" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/8fe0f6df-ffea-3bcc-9b0b-f192187020a2.png">
こんな結果が出ますでしょうか。どうやらちゃんとデータを受け取れてるみたいですね。


# 受け取ったデータの表示してみる
でもでも、これではいくら何でも見ずらいですね。必要なデータだけ取り出して見えるようにしましょう。
今回はテンプレートを変更してデータを表示しましょう。
表示したいデータは
- title
- location
- description
- forecasts
こんなところでしょうか。それぞれについては仕様を確認しましょう。
これらを表示するのは非常に簡単です。

```ruby:base.html
...
{{data.title}}<br/>
{{data.location}}<br/>
{{data.description}}<br/>
{{data.forecasts}}
...
```
さて、このままではまだlocationとかは表示がきれいではないですね？
さっきやったように`.`でつなげていくことで子のデータを表示できます。なので

```ruby:base.html
...
{{data.title}}<br/><br/>
{{data.location.area}}/{{data.location.prefecture}}/{{data.location.city}}<br/><br/>
{{data.description.text}}<br/><br/>
{{data.forecasts}}
...
```
これでforecasts以外はきれいに表示されました。
forecastsだけまだしてないのですが、じつはこれだけ周りとちょっとデータ形式が違いまして。
jsonデータをよく見ると{}と[]があるのがわかりますね？あるのですよ。
[]はリスト型で、配列のようなものです。`[A,B,C,...]`のような構造になっており、テンプレート上でAを持ってきたいときは`[0]`とすると持ってこれます。
対して{}は辞書型で、`{key1:val1,key2:val2,....}`のような構造になっており、テンプレート上でval2を持ってきたいときは`.key2`とすると持ってこれます。
そのためforecastsのデータを持ってくるにはまずリストの0番目を指定してあげる必要があるので

```ruby:base.html
...
日付:{{data.forecasts.0.date}}<br/>
天気:{{data.forecasts.0.telop}}<br/>
最高気温:{{data.forecasts.0.temperature.max.celsius}}℃
...
```
このようになりますね。


# まとめ
さあ実行してみましょう！
<img width="960" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/fd721785-ff9b-6d63-047b-edf760387a0e.png">

おぉ！見やすいじゃないですか！
ただのままだとさすがに汎用性が少ないですね...
というわけで次回はこれと同じものをview.pyをいじって作っていきましょう。

Kiteのサジェストは便利なのでスラスラかけますね。
サジェストの左の方にちっちゃく内容がわかるようにアイコンが出てるっぽいんですが、まだ使って日が浅いのでよくわからんですよ...
【はじめてのUiPath】RPAで「SMTPサーバーでのメール送信自動化」を実装してみる！

RPAツールであるUiPathを使用して、自動的にExcelからデータをとってきて、それをメール送信したいと思います！

gmailを使って実装します！


# Excelを用意する

メールを送りたい相手のメールアドレスと件名と本文をExcelに打ち込みます！

![スクリーンショット (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/01595892-0837-de8f-511f-f1e901f1265a.png)


そして、このエクセルファイル「mail.xlsx」を、適当なところに保存します。

※どこに保存したかは覚えておいてください！


# Uipathで実装するぞー！


## 1. Excelからデータを抽出する

以前書いた記事に全部載せてます！

以下のURLの**Uipathで実装するぞー！**から、**9.アクティビティパネルから「メッセージボックス」を持ってくる**の手前まで行ってください。

## 9. アクティビティパネルから「smtpメールメッセージを送信」を持ってくる

アクティビティパネルで「smtpメールメッセージを送信」を探して、bodyの中にドラッグアンドドロップします。

そして、宛先、件名、本文にそれぞれ`row(0).ToString`と`row(1).ToString`と`row(2).ToString`をいれます。

![スクリーンショット (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/2a5417b1-31f1-48a3-dd75-e3b8dd061ed3.png)


## 10. プロパティパネルにgmailの情報をいれる

右側にあるプロパティパネルに注目してください。

サーバー： `"smtp.gmail.com"`
ポート：`465`
ログオンのパスワード: `自分のグーグルアカウントのパスワード`
ログオンのメール：`自分のGmailアドレス`

もっと下にある送信者の`名前`と`送信元`はいれてもいれなくても構いません。お任せします。

![スクリーンショット (26)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/5e5f289c-0128-734c-b7c3-d41c4f9174ff.jpeg)


## 11. googleアカウントのセキュリティ感知レベルを下げる

1. [googleアカウントのセキュリティ](https://myaccount.google.com/u/0/security)にアクセスしてください（※メール送信を実行したいGmailのアカウントでグーグルにログインしていることを確認してください。)
2. 「安全性の低いアプリのアクセス」のところで「アクセスを有効にする」にしてください。（セキュリティ的に良くないことがあると思うので、用事がすんだら、「アクセスを無効にする」に戻すことをおすすめします。）


![スクリーンショット (31)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/ae5cb2fe-1282-a86a-05ca-e71a3fbd8b80.jpeg)


## 12. 実行する

F5キーを押すだけで、実行されます！

さあ、メールは送れましたでしょうか！！

メールを送る件数が増えてくれば増えてくるほど、Excelに文章を送って、RPAでメール送信したほうが早くなりますよね。



#おわりに



すごいっすね！RPA！

というわけで、これでおわりです！
RTX2080Ti  & Ubuntu16 でtensorfrowが使える環境を作る

##導入環境
Ubuntu 16.04
CPU: 2x Xeon Gold 6126
RAM: 12x 16GB
GPUs: 4x GeForce RTX 2080ti

##経緯説明
深層学習を利用したプロジェクトを進めているので、ボスに頼んで新しいGPUサーバーを導入してもらった。納入したメーカーの話では機械学習の環境はプリインストールしてくれいているとのことだったが、nvidia-smiを叩いても「NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.」と言われてしまった。これはカーネルのバージョンとNVIDIA GPU display driverとの相性が悪いために起こるらしい。また、TensroFlow1.11.0なのにCUDA10.0が入っている。
めちゃくちゃな環境だったのでGWを溶かして自分好みの環境を作ることにした。

##導入するもの
- Nvidia-Driver-418.xx
- Miniconda
 - Python3.6
 - CUDA 10.1
 - cuDNN 7.3
 - TensorFlow-gpu 1.13.0

これらのバージョンは[TensorFlowとCUDA・cuDNNの対応関係](https://www.tensorflow.org/install/source#common_installation_problems)と[CUDA・NvidiaDriver・GPUアーキテクチャの対応関係](https://docs.nvidia.com/deploy/cuda-compatibility/index.html)を参考にした。
RTX2080ti(Turingアーキテクチャ) -> Driver 410.48+ or Driver 418.39+
Driver 418.xx -> CUDA Toolkit ~10.1
CUDA 10.1 -> TensorFlow 1.13.0
とした。

nvidia-smiが走らない問題はNvidia-Driverをインストールし直したら解決した。
NVIDIA driver Version: 418.56
Linux kernel version: 4.4.0

##Nvidia-Driverのインストール
- ドライバーをダウンロード
https://www.nvidia.co.jp/Download/Find.aspx?lang=jp&QNF=1
- GUIの停止

```
sudo service lightdm stop
```

- 実行

```
chmod +x ****.run
$ sudo ./****.run
```
##minicondaを使ってTensorFlow周りを一気にインストール
今までは、CUDA、cuDNN、TensorFlowをそれぞれバージョンをすり合わせながらインストールしていた。
condaパッケージマネージャーが優秀ということなので、anacondaかminicondaを使うことにした。
TensorFlowさえ動けばよいので、今回はminicondaを使う。

```
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod +x (downloaded_filename).sh
./(downladed_filename).sh
```

pathを通すかを聞かれる。ここのminicondaでのみ作業する予定なのでyesにした。
ここまでで一度、ターミナルを再起動する。

TensorFlow用なのでpython3.6環境を作る。（TensorFlowはPython3.7未対応）

```
conda create -y -n tf python=3.6
```

作った環境に入る。

```
source activete  tf
```

tensorflowに必要なものをインストールする

```
conda install tensorflow-gpu
```
でCUDA, cuDNNも含めて一発で入る
```tensorflow-gpu==1.11.0```などとしてバージョンを指定することも可能