OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】migrationファイルまとめ(カラム追加・削除・変更)

# はじめに
学習中の備忘録です。
# 概要
- カラムのデータ型一覧
- モデル作成時
- カラム追加
- カラム削除
- データ型変更
- カラム名変更
- モデル作成時(外部キー制約付)
- カラム追加時(外部キー制約付)

# カラムデータ型一覧
|データ型|型の種類|用途|
|:------|:------|:--|
|integer|数字|金額、回数など|
|string|文字(短文)|ユーザー名、メールアドレスなど|
|text|文字(長文)|投稿文など|
|boolean|真偽|はい・いいえの選択肢など|
|datetime|日付と時刻|作成日時、更新日時など|
|float|浮動小数|小数点含む6桁までを丸めずに保存|
|decimal|精度の高い少数|小数点以下桁数揃えて正確に保存|
|timestamp|より細かい日時|より細かい日時|
|time|時間|時間|
|date|日付|日付|
|binary|バイナリデータ|バイナリデータ|
※floatとdecimalについて詳しくはこちら
https://qiita.com/y-ken/items/b8601092d0261c3a556d
※datetime,time,dateについて詳しくはこちら
https://qiita.com/y-ken/items/b8601092d0261c3a556d

# 前提
- rails 5.2.4.1
- コマンド入力はファイル名のみですのでファイルは編集してください。

# モデル作成時
postモデルを作成。

```
rails g model post
```
migrationファイルを編集してpostsテーブルにpostカラムをstring型で作成。

```ruby
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :post
      t.timestamps
    end
  end
end
```

# カラム追加
migrationファイル作成。

```
rails g migration AddTitleToPosts
```
postsテーブルにtitleカラムをstring型で追加。

```ruby
class AddTitleToPosts < ActiveRecord::Migration[5.2]
  def change
    add_column :posts, :title, :string
  end
end
```

# カラム削除
migrationファイル作成。

```
rails g migration RemoveTitleFromPosts
```
postsテーブルのtitleカラムを削除。

```ruby
class RemoveTitleFromPosts < ActiveRecord::Migration[5.2]
  def change
    remove_column :posts, :title, :string
  end
end
```

# データ型変更
migrationファイル作成。

```
rails g migration ChangeDatatypeNameOfPosts
```
postsテーブルのnameカラムをtext型に変更。

```ruby
class ChangeDatatypeNameOfPosts < ActiveRecord::Migration[5.2]
  def change
    change_column :posts, :name, :text
  end
end
```

#カラム名変更
migrationファイルを作成。

```
rails g migration RenameNameColumnToPosts
```
postsテーブルのnameカラムのカラム名をtitleに変更。

```ruby
class RenameNameColumnToPosts < ActiveRecord::Migration[5.2]
  def change
    rename_column :posts, :name, :title
  end
end
```

# モデル作成時(外部キー制約付)
postsテーブルにuser_idという外部キー付のカラムを作成。

```ruby
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      #~省略~
      # user_idという名前で users.id への外部キー制約をはる
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end
```
# カラム追加時(外部キー制約付)
postsテーブルにuser_idという外部キー付のカラムを作成。

```ruby
class AddUserIdToPosts < ActiveRecord::Migration[5.2]
  def change
    #user_idという名前で users.id への外部キー制約をはる
    add_reference :posts, :user, foreign_key: true
  end
end
```
※foreign_key オプションを省略してしまうと、外部キー制約がはられません。
※indexを作りたくない場合はオプションで明示的に index: false を記述。

# まとめ
今回は個人的に日頃使用するものでまとめました。
コマンド入力や外部キーについては参考記事にもっと詳しく書いてあります。

参考記事
https://qiita.com/dawn_628/items/13fa64dc6d600e921ce3
https://qiita.com/publichtml/items/1fba15d8071fab66d043
RubyエンジニアがArduinoで電子工作やってみた~温湿度センサ編~

# はじめに
皆様、こんにちは！
Toretaのサーバサイドエンジニア兼佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです！
最近、ひょろんなことから電子工作を始めたので、作成したものを整理・紹介したく、記事を書きました。
[RubyエンジニアがArduinoで電子工作やってみた~超音波距離センサ編~](https://qiita.com/hiroki_tanaka/items/e0cab15282b06d9e7ad2)の続編で、今回は温湿度センサを使いました。

# 使ったセンサ
- DHT11

[DHT11](http://akizukidenshi.com/catalog/g/gM-07003/)は温度と湿度をカリブレーション済みの状態で出荷されているセンサーです。信号はデジタル信号となっています。
温度は1°C程度の誤差、湿度は4%程度の誤差で測定可能ということになってます。
より高性能な[DHT22](http://akizukidenshi.com/catalog/g/gM-07002/)もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/0c85182e-cc9c-2555-a4d6-d274182c3ed7.png)

# 配線
- + (DHT11) -> +5V (Arduino)
- S (DHT11) -> Digital_Pin (Arduino)
- - (DHT11) -> GROUND (Arduino)

# 作ったもの
温湿度から室内の不快指数を算出し、ディスプレイに表示します。
そして、不快指数に応じてLEDが灯ったりブザーが鳴ります。
また、スマホ用モバイルバッテリーと接続して持ち運べるようにしました。

不快指数というのは、下記の通りです。
不快指数 = 0.81*温度 + 0.01*湿度 × ( 0.99*温度 − 14.3 ) + 46.3
60より小さい：寒いと感じる→青色LEDが灯る。
61〜74：普通→黄色LEDが灯る。
75より大きい：暑いと感じる→赤色LEDが灯る&ブザーが鳴る。
参考：https://ja.wikipedia.org/wiki/不快指数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/1d0885c6-48e3-940f-1bf2-2ace46e0016b.png)

# ソースコード
DHT11を操作するためにはライブラリを使用し、includeします。
DHT-sensor-library：https://github.com/adafruit/DHT-sensor-library

```c++

#include <LiquidCrystal.h>
#include <dht.h>                  
dht DHT;
const int dht11_data = 6;     
int temp=0;
int hum=0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int redLed = 10;
int greenLed = 9;
int blueLed = 8;
int buzzer = 7;

void setup() {
  lcd.begin(16,2);
  lcd.print("Welcome to");
  lcd.setCursor(0,1);
  lcd.print("Discomfort Check");
  delay(2000);
  lcd.clear();
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() { 
  DHT.read(dht11_data);
  temp=DHT.temperature;
  hum=DHT.humidity;
  float discomfortIndex = 0.81 * temp + 0.01 * hum * (0.99 * temp - 14.3) + 46.3;
  
  lcd.clear();
  lcd.print("H=");
  lcd.print(hum);
  lcd.print("%");
  lcd.setCursor(6,0);
  lcd.print("T=");           
  lcd.print(temp);
  lcd.write(0xDF);
  lcd.print("C");
  
  lcd.setCursor(0,1) ;
  lcd.print("Discomfort=");      
  lcd.print(discomfortIndex);

  if (discomfortIndex >= 75) {
   digitalWrite(redLed, HIGH); 
   digitalWrite(greenLed, LOW);
   digitalWrite(blueLed, LOW);
   digitalWrite(buzzer, HIGH);
  } else if(discomfortIndex >= 60 && discomfortIndex < 75) {
   digitalWrite(redLed, LOW); 
   digitalWrite(greenLed, HIGH);
   digitalWrite(blueLed, LOW);
   digitalWrite(buzzer, LOW);
  } else {
   digitalWrite(redLed, LOW); 
   digitalWrite(greenLed, LOW);
   digitalWrite(blueLed, HIGH);   
   digitalWrite(buzzer, LOW); 
  }
  delay(1000);
}
```

# 終わりに
より様々なセンサを使用して、実生活で使用できるハードウェアを作成したいです！
次回は人感センサをしようと思います(∩ﾟДﾟ)∩
javaで複数の例外をまとめてcatchする

javaで、複数の例外についてcatchして同じようにログ出力して上に投げるよいう処理をよく見ますが、
冗長で共通化したいなと思っていたので調べてみたらどうやらできるみたいです。[参考](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/language/catch-multiple.html)

```java
catch (IOException ex) {
     logger.log(ex);
     throw ex;
} catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}
```

`|`で区切ってあげると下記のような書き方で共通化できます。
少し注意なのが、java7以降でしか使えないようですので、昔のバージョンで開発してる方はご注意ください。

```java
catch (IOException | SQLException ex) {
     logger.log(ex);
     throw ex;
}
```
yukicoder contest 242 参戦記

# yukicoder contest 242 参戦記

## [A 1015 おつりは要らないです](https://yukicoder.me/problems/no/1015)

まず1万円以上の店に、超えない範囲で1万円を割り当てます. (1万円だったら、1万円、1万1円でも1万円、2万円なら2万円). 全部割り当ててもまだ1万円が残っている場合には、残額が大きい店順に1枚づつ割り当てます. 同様のことを5千円でもします. 残額が残っている店がまだあるのであれば、千円札で払えるかを確認します.

ソートと払い終わった店の排除を繰り返すことにより解けました.

```python
N, X, Y, Z = map(int, input().split())
A = list(map(int, input().split()))

A = [a + 1 for a in A]
A.sort(reverse=True)

for i in range(len(A)):
    if Z == 0:
        break
    if A[i] >= 10000:
        t = A[i] // 10000
        t = min(t, Z)
        Z -= t
        A[i] -= t * 10000
    else:
        break
A = [a for a in A if a > 0]
A.sort(reverse=True)
A = A[Z:]

for i in range(len(A)):
    if Y == 0:
        break
    if A[i] >= 5000:
        t = A[i] // 5000
        t = min(t, Y)
        Y -= t
        A[i] -= t * 5000
    else:
        break
A = [a for a in A if a > 0]
A.sort(reverse=True)
A = A[Y:]

for i in range(len(A)):
    t = (A[i] + 999) // 1000
    t = min(t, X)
    X -= t
    A[i] -= t * 1000
A = [a for a in A if a > 0]

if len(A) == 0:
    print('Yes')
else:
    print('No')
```

ソートを繰り返す代わりに、優先度付きキューを使っても解けました.

```python
from heapq import heapify, heappop, heappush

N, X, Y, Z = map(int, input().split())
A = list(map(int, input().split()))

A = [-a for a in A]
heapify(A)

while A:
    if Z == 0:
        break
    x = -heappop(A)
    if x >= 10000:
        t = min(x // 10000, Z)
        Z -= t
        x -= 10000 * t
        heappush(A, -x)
    else:
        Z -= 1

while A:
    if Y == 0:
        break
    x = -heappop(A)
    if x >= 5000:
        t = min(x // 5000, Y)
        Y -= t
        x -= 5000 * t
        heappush(A, -x)
    else:
        Y -= 1

while A:
    if X == 0:
        break
    x = -heappop(A)
    t = min((x + 1000) // 1000, X)
    X -= t
    x -= t * 1000
    if x >= 0:
        heappush(A, -x)

if len(A) == 0:
    print('Yes')
else:
    print('No')
```
定義が面白いIT技術系用語のご紹介

## git
- [*"git" can mean anything, depending on your mood.*](https://github.com/git/git/tree/e83c5163316f89bfbde7d9ab23ca2e25604af290)

> "git" は何を意味することも出来る、お前の気分次第だ。
- https://qiita.com/hogemax/items/b09abc522e0ec05da4fe

- Linusのセンスが光っています。

## YAML
- [*YAML: YAML Ain't Markup Language*](https://yaml.org/)

再帰的な表現になっています。

## GNU
- [*The name “GNU” is a recursive acronym for “GNU's Not Unix.”*](https://www.gnu.org/home.en.html)
- これまた再帰的な表現になっています。

# その他
## [WTFPL](http://www.wtfpl.net/about/)
- Do What the Fuck You Want to Public License

## [PHP](https://www.php.net/manual/ja/intro-whatis.php)
元々はPersonal Homepage Page Tools (PHP Tools)として登場しました。
これが正式名称と思っていましたが、公式マニュアルで[PHP Toolsはあくまでホームページを作るのに便利なCGI等を集めたものであり、プログラミング言語としてのPHPの前身である](https://www.php.net/manual/ja/history.php.php)と説明されています。
現在一般に使われているPHPの定義は、
> PHP (PHP: Hypertext Preprocessor を再帰的に略したものです) 

と、これまた再帰的な表現になっています。

# 再帰的な表現 ([再帰的頭字語](https://ja.wikipedia.org/wiki/再帰的頭字語)) の意味について
YAMLやGNUのような再帰的な表現のことを、[再帰的頭字語](https://ja.wikipedia.org/wiki/再帰的頭字語)といいます[^1]
[^1]: 再帰的とうじご（←なぜか変換できない）

YAMLやGNUに使われているこの表現にはやや皮肉が入っているような気がしていて、個人的に好きです。
GNUは、Unixのオープンソース版、初めてGPLというオープンソースの考え方を取り入れた、OSSの元祖です。
まだオープンソースという概念がなかった時代、コピーライトのUNIXに対し、改変・配布自由なコピーレフトの概念を謳って登場したのがGNUでした。
*"GNU is Not UNIX"* と繰り返すことで、 "UNIXでない" ことを強調しているように感じます。

YAMLの経緯については詳しくは知りませんが、こちらも *"YAML Ain't Markup Language"* と "Markup Languageでない" ことを強調しているように感じて面白いです。

PHPは、単純な言葉遊びに見えますね。

# 終わりに
個人的にはgitが一番好きで、YAMLとGNUがその次に好きです。gitの定義が衝撃すぎてこの記事を書きました。

他にも面白い用語の定義がないか、検索して探し回りましたがあまり見つけることができませんでした。
もしご存知のものがあればコメントに記載いただけるとうれしいです...！！

## Nagios
コメント欄からご紹介、Nagiosも再帰的頭字語でした。
https://support.nagios.com/knowledge-base/view-faq/?id=52&catid=35&faq_id=2

> The official meaning is that N.A.G.I.O.S. is a recursive acronym which stands for "Nagios Ain't Gonna Insist On Sainthood".

> An alternative meaning suggested by Sam Tilders is...

```
Notices
Any
Glitch
In
Our 
System
```

これは作者のFAQなんですが、他人が定義した別の名称も嬉々として紹介してて面白かったです。

## Markdown
コメント欄からご紹介、おなじみのMarkdownです。
> “Markdown” is two things: (1) a plain text formatting syntax; and (2) a software tool, written in Perl, that converts the plain text formatting to HTML. 
https://daringfireball.net/projects/markdown/

Markdownとは
1. プレーンテキスト形式の文法であり、
2. Perlで書かれた、プレーンテキストをHTML(HyperText Markup Language)に変換するためのソフトウェアです。

Markdownは Markup (XHTML, HTMLなど) よりも読みやすく、書きやすい文法として登場しました。
そのため、その名前はMarkupに対し、Markdownとなったようです [\[要出展\]](https://ja.wikipedia.org/wiki/Wikipedia:「要出典」をクリックされた方へ)
Cloud Functionsって何ぞや

職場でcloud functionを使う機会がありいろいろ教えてもらったが、10教えて頂いて0.01くらいしか理解できていない（理解率 0.1%）なので何とかこれ以上の忘却は防ぎたいと思い勉強した

インスタの投稿漁りまくっていたら「勉強の本質とは今まで出来なかったことをできる様になる事だ」みたいな事書いててそれ高校の時言ってくれよ〜っていう投稿者にとっては理不尽な批判をしてしまうのであった


#Cloud Functionsとは
>Cloud Functions は、Google Cloud のイベント ドリブンのサーバーレス コンピューティング プラットフォームです。ローカルでもクラウドでも、サーバーをプロビジョニングせずにコードを実行できます。引用元→[公式サイト](https://cloud.google.com/functions?hl=ja)

んんよく分からん笑
例えると、実行しただけで目的地まで行ってくれるかな
知らんけど

#機能
>Cloud Functions には、シンプルかつ直感的なデベロッパー エクスペリエンスがあります。コードを作成した後は、Google Cloud に運用インフラストラクチャを処理させるだけです。イベントに反応する小さなコード スニペットを作成して実行することで、開発を加速できます。トリガーを介して Google Cloud サービスやサードパーティのクラウド サービスに接続し、難しいオーケストレーションの問題を解決できます。引用元→[公式サイト](https://cloud.google.com/functions?hl=ja)

うんうん、とりあえずGoogleと僕は月とマントルくらいの差があることは分かった
まじで誰が考えて作ったんだこういうの天才だろ

#Cloud Functions を使ってみる

実際に使ってみようということで[公式サイト](https://cloud.google.com/functions?hl=ja)にあるチュートリアルをいじってみた

>ここでは、Cloud Console で Node.js、Python または Go を使用して Cloud 関数を作成し、デプロイする方法を説明します。[チュートリアル](https://cloud.google.com/functions/docs/quickstart-console?hl=ja)

Cloud関数て何ぞやって感じになってるが今はだるいんで後で調べる

#関数を作成する
*手順はちょっと端折ってます
    1. 関数を作成をクリック
    2. 関数に名前を付ける
    3. [トリガー]を[HTTP]にする
    4. [ソースコード]を[インライン　エディタ]にする
    5. [ランタイム]でお好きな言語にする
    
#関数をデプロイする
デプロイってなんやねんということで
>デプロイ（英: deploy）とは、「配置する」「配備する」「展開する」といった意味の英語の動詞です。日本語の中では、ソフトウェア開発の工程のうち、開発した機能やサービスを利用できる状態にする作業を指す語として用いられています。[デプロイとは](https://www.weblio.jp/content/%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)

1. [作成]をクリック
2. [作成]をするとCloud Functions概要ページに移動してデプロイが完了したら緑のチェックが付く
![BC114E45-4E30-4701-8355-414F501FA85E_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/044a56d6-771b-a3ce-e7e1-47a939cc5ecd.jpeg)

#関数をテストする
1. 自分が作成した関数をクリックする
2. [テスト]タブをクリック
![5913C34C-9AEB-4A61-BE30-273C6B75AF63.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/2ed110e1-5f8f-e9a0-ed00-cb3e3c800d79.jpeg)
3. [トリガーとなるイベント] フィールドにテキスト「{"message":"Hello World!"}」を入力して、[関数をテスト] をクリックする
4. [出力] フィールドに、「Success: Hello World!」というメッセージが表示される
![CB7F474E-0E1F-45D6-AD2B-85F2389D462C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/93ab8427-e95d-ae6d-7922-9f1870360292.jpeg)
5.
[ログ] フィールドにステータス コード 200 が表示されていれば、OK
![66236D7A-2B01-4043-8BE6-86B543F481A4_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/db5c5111-2560-4870-dcf9-64a30611d2ce.jpeg)
出てますね

何で200何でしょうね
知らんけど

疲れたから今日はここまで

記事作るの結構時間かかりますね

お休みなさい
pythonで複数のcsvファイルを1つのcsvファイルにまとめる(ヘッダーが1行だけの前提）

#はじめに
初めての投稿です。python初心者です。
設備などから吐き出された共通フォーマットのcsvファイルを複数まとめて１つのファイルにしたいと思い色々調べて作ったコードを紹介します。

2020/04/06追記
ヘッダーが一行かつ、きれいにすべてのデータがあるときに有効。
データが無い行があるとエラーになる可能性あるので注意。

#環境
- python3.x
- jupyter Notebook
- csv
- mac

#コード
実行場所にあるtestフォルダ内にフォーマットが同じcsvが大量にある想定。

```python
import pandas as pd
import glob

# パスで指定したファイルの一覧をリスト形式で取得. （ここでは一階層下のtestファイル以下）
csv_files = glob.glob('test/*.csv')

#読み込むファイルのリストを表示
for a in csv_files:
    print(a)

#csvファイルの中身を追加していくリストを用意
data_list = []

#読み込むファイルのリストを走査
for file in csv_files:
    data_list.append(pd.read_csv(file))

#リストを全て行方向に結合
#axis=0:行方向に結合, sort
df = pd.concat(data_list, axis=0, sort=True)

df.to_csv("test/total1.csv",index=False)
```

#やっていること
- globで指定したファイルのリストを取得
- pd.read_csv()でファイルを読み込みこむ(header=0でヘッダーありとして読み込まれる）
- forループで全てのlistの中身を追加
- pd.concatでリスト内全てを結合させる
- 最後にdf.to_csv()でcsvファイルに書き出す

#感想
ヘッダーの処理を気にしていましたが、pandasを利用すれば気にせずに同じカラムを持つもの同士データだけで結合してくれるので便利だし、pandasの動きを理解することができました。

#参考
- https://life-freedom888.com/pandas-hukusuufile-concat/#toc1
- https://deepage.net/features/pandas-concat.html

#追記(2020/04/06)
- これだとカラム数が一見違うようなファイルではうまく読み込めなかった。
- 行ごとに読み込む方法で解決した。（別記事）
【Python入門】C#とPythonの命名規則を比較してみた。

こんにちは。

いつも **C#** で開発することが多いのですが、最近 **Python** に触れる機会がありました。
**C#** 感覚でコーディングをした後に、改めて**Python**のコーディング規約である[PEP8](https://pep8-ja.readthedocs.io/)で確認したところ、変数宣言など地味なところで命名規則に違いがありましたので、ざっくり**C#**と**Python**の命名規則をまとめてみました。

なお[PEP8](https://pep8-ja.readthedocs.io/)では、以下のようにプロジェクトのコーディング規約を衝突する場合は、プロジェクトをコーディング規約を優先するようにと書かれています。

> 多くのプロジェクトには、自分たちのコーディングスタイルに関するガイドラインがあります。それとこの文書の規約の内容が矛盾した場合は、そのプロジェクトのガイドラインが優先します。

#はじめに
はじめに命名規則の簡単な説明です。

| 命名規則|説明|例|
|:-----------------|:------------------|:-------------------|
|キャメルケース（CamelCase）|先頭以外は単語の先頭を大文字にする。|happyNewYear|
|パスカルケース（PascalCase）|先頭含めは単語の先頭を大文字にする。|HappyNewYear|
|スネークケース（SnakeCase）|すべて単語は小文字。アンダースコアでつなぐ。|happy_new_year|
|コンスタントケース（ConstantCase）|すべて単語は大文字。アンダースコアでつなぐ。|HAPPY_NEW_YEAR|
※パスカルケースは、アッパーキャメルケースとも呼ばれます。
※コンスタントケースは、アッパースネークケースとも呼ばれます。
※[PEP8](https://pep8-ja.readthedocs.io/j)では、CapWords形式と表現されてますが、Pascal形式との違いが分からなかったので、以下ではPascal形式として整理しています。

#命名規則の比較一覧
C#とPythonの命名規則を簡単にまとめた比較一覧です。

<TABLE>
<TR><TH>識別子</TH><TH>C#</TH><TH>Python</TH></TR>
<TR><TD ROWSPAN=2>パッケージ（名前空間）</TD><TD>PascalCase</TD><TD>すべて小文字</TD></TR>
<TR><TD>HappyBirthday</TD><TD>happybirthday</TD></TR>
<TR><TD ROWSPAN=2>モジュール</TD><TD>PascalCase</TD><TD>すべて小文字 / SnakeCase</TD></TR>
<TR><TD>HappyBirthday</TD><TD>happybirthday / happy_birthday</TD></TR>
<TR><TD ROWSPAN=2>クラス</TD><TD>PascalCase</TD><TD>PascalCase</TD></TR>
<TR><TD>HappyBirthday</TD><TD>HappyBirthday</TD></TR>
<TR><TD ROWSPAN=2>型変数</TD><TD>PascalCase</TD><TD>PascalCase</TD></TR>
<TR><TD>HappyBirthday</TD><TD>HappyBirthday</TD></TR>
<TR><TD ROWSPAN=2>例外</TD><TD>PascalCase</TD><TD>PascalCase</TD></TR>
<TR><TD>HappyBirthdayException</TD><TD>HappyBirthdayError</TD></TR>
<TR><TD ROWSPAN=2>グローバル変数</TD><TD>Pascal</TD><TD>SnakeCase</TD></TR>
<TR><TD>HappyBirthday</TD><TD>happy_birthday</TD></TR>
<TR><TD ROWSPAN=2>パラメータ（引数）</TD><TD>CamelCase</TD><TD>SnakeCase</TD></TR>
<TR><TD>happyBirthday</TD><TD>happy_birthday</TD></TR>
<TR><TD ROWSPAN=2>メソッド（関数）</TD><TD>PascalCase</TD><TD>SnakeCase</TD></TR>
<TR><TD>GetHappyBirthday</TD><TD>get_happy_birthday</TD></TR>
<TR><TD ROWSPAN=2>変数</TD><TD>CamelCase</TD><TD>SnakeCase</TD></TR>
<TR><TD>happyBirthday</TD><TD>happy_birthday</TD></TR>
<TR><TD ROWSPAN=2>定数</TD><TD>PascalCase</TD><TD>ConstantCase</TD></TR>
<TR><TD>HappyBirthday</TD><TD>HAPPY_BIRTHDAY</TD></TR>
</TABLE>

その他に[PEP8](https://pep8-ja.readthedocs.io/)にも書かれているインデントやコメント、IFなどの制御文にクラス定義やメソッド定義などの記述の違いについては、別の機会にまとめていこうと思います。

参考）
Python コードのスタイルガイド（[PEP8](https://pep8-ja.readthedocs.io/)）
Rails deviceでログアウト時に【No route matches】でエラー

#エラー内容
gemのdeviseを導入してログアウトしてみるとエラーが出てログイン先に行かない。

#解決策
app/assets/javascript/application.jsに

```
//= require jquery
//= require jquery_ujs
```
を追加。

再度、rails s -b 0.0.0.0で起動。

これで、問題なくログアウトできる。
動的な配列って何？

プログラミングスクールでチーム開発をする際に、

参考にした記事のコードでこの一文で結構悩まされたので

メモに書いときます。

```javascript

let fileIndex = [1,2,3,4,5,6,7,8,9,10];
fileIndex.shift();

console.log(fileIndex);
//9[2,3,4,5,6,7,8,9,10]
fileIndex.push(fileIndex[fileIndex.length - 1] + 1)
//計算の順番に並べてます
//fileIndex.push(fileIndex[9 - 1] + 1)
//fileIndex.push(fileIndex[8] + 1)
//2,3,4,5,6,7,8,9,10　←この数字を取り出す
//0,1,2,3,4,5,6,7,[8番目]　配列の順番は下の文になります。
//↓そのために
//10
//fileIndex.push(10 + 1)
//fileIndex.push(11)
consol.log(fileIndex);
10[2,3,4,5,6,7,8,9,10,11]
```
fileIndex.push(fileIndex[fileIndex.length - 1] + 1)

一文だけにこんなに時間を使うとはは思いませんでした。
Vue.js用カレンダーライブラリ「v-calendar」の最新バージョンがimport出来ない件

プロジェクトにおいてRailsのWebpackerでVue.jsを使っていて、カレンダー機能を実装するために色々調べているとv-calendarというライブラリがあることを知った。
早速使ってみようと思って公式ドキュメントの通りインストールして設定下が、謎のエラーが発生したので記事にすることにした。
結論から言うと、エラーの原因はよく分からず、ただ後述するようにバージョンを下げてインストールするとうまく動いたので、解決策として記載する。

## Version
Vue.js 2.6.11
Ruby on Rails 6.0.0

## インストール
[v-calendar](https://vcalendar.io/installation.html)公式ドキュメントに従ってyarnを用いてv-calendarをインストールする。

```
yarn add v-calendar@next
```
するとv-calendarの`1.0.0-beta.23`がインストールされた。

```json:package.json
{
  "name": "...",
  "private": true,
  "dependencies": {
    "@coreui/coreui": "2.1.6",
    "@rails/actioncable": "^6.0.0-alpha",
    "@rails/activestorage": "^6.0.0-alpha",
    "@rails/ujs": "^6.0.0-alpha",
    "@rails/webpacker": "^4.0.7",
     // 中略
    "turbolinks": "^5.2.0",
    "v-calendar": "^1.0.0-beta.23",
    "vue": "^2.6.11",
    "vue-loader": "^15.9.1",
    "vue-template-compiler": "^2.6.11",
    "waypoints": "^4.0.1"
  },
  "version": "0.1.0",
  "devDependencies": {
    "webpack-dev-server": "^3.10.3"
  }
}
```
そしてwebpackerで使用するためにimportしてプラグインとして登録する。

```js:app/javascript/packs/application.js
import Vue from 'vue'
import App from '../app.vue'
import VCalendar from 'v-calendar'
Vue.use(VCalendar)

document.addEventListener('DOMContentLoaded', () => {
  new Vue({
    el: '#vue',
    render: h => h(App)
  })
})
```
公式ドキュメントに従ってここまで設定してローカルサーバを起動したところ、コンソール上で`"export 'default' (imported as 'VCalendar') was not found in 'v-calendar'`と怒られてる。
ブラウザでも、`Uncaught TypeError: Cannot read property 'mixin' of undefined`と怒られている。
公式通りにやってるのに何でや？と思って色々調べてみたがよく分からず。。。詰みかけていたところでこんなIssueを発見した。
["export 'default' (imported as 'Calendar') was not found in 'v-calendar/lib/components/calendar.umd'](https://github.com/nathanreyes/v-calendar/issues/502)

**わしの詰まってるエラーとほぼ同じや！！！きっとここに解決策が書いてあるはず！**
と思って読んでいくと、肝心の開発者からの返答がない。
他のメンバーからも、**はよ返事しろや。**と怒られている。
(原文は**Any responses to this?**)

## 解決策
詰んだ………と思ってぼーっとIssueを眺めていたら、質問者のv-calendarのバージョンが`v1.0.1 and 1.0.0-beta.23`であることに気づく。
これもしかしたらバージョン下げたらいけんじゃね？と思い下記を実行。

```
yarn add v-calendar@1.0.0-beta.22
```

エラー発生せず解決した…！！！

## 結論
v-calendarを使う際はバージョンを`1.0.0-beta.22`に指定しよう。
ReSwiftで複数のReducerってどうするん？

# はじめに
ReSwiftの勉強をしていて、Storeに登録するReducerが複数の時どうするんだっけ？と思ったのでメモです。

# [CounterExample](https://github.com/ReSwift/CounterExample/blob/master/CounterExample)
ReSwiftの公式の「CounterExample」を見ていて、以下のコードがありました。

~~~swift:AppDelegate.swift
import UIKit
import ReSwift

// The global application store, which is responsible for managing the appliction state.
let mainStore = Store<AppState>(
    reducer: counterReducer, //<---複数の時どうするの？
    state: nil
)

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
~~~

Reducerを複数登録する時ってどうすればいいんだろう？と疑問に思いました。
調べてみたら、[Issues](https://github.com/ReSwift/ReSwift/issues/340)にありましたね。

~~~swift:Is_it_possible_to_specify_an_array_of_reducers?#340
func combineReducers<T>(_ first: @escaping Reducer<T>, _ remainder: Reducer<T>...) -> Reducer<T> {
    return { action, state in
        let firstResult = first(action, state)
        let result = remainder.reduce(firstResult) { result, reducer in
            return reducer(action, result)
        }
        return result
    }
}

let reducer = combineReducers(first, second, third) // <--- これを使う！
~~~

stateやらreducerやらもう少し細かく分けると、自作しないといけないような気がしますが、とりあえずこいつを使っていくことにします。
チーム開発（本番環境にデプロイ）

[サーバーサイド]商品詳細編集担当
https://gyazo.com/e8d0cf10907793775d521cd780d4d24c
prefix_pathで書きましょうという指摘を受けた
修正
https://gyazo.com/229bb2b8163a4210840feebb8d2e18da



自分が担当したところが終わり必須項目は終了。
本番環境へのデプロイ作業
https://gyazo.com/1b8e8144700edcc82563aa58f388de61
https://gyazo.com/20e556f0efe262c621228ffc794f8a2a
https://gyazo.com/3b58754adcc048e7e68ceb3ffeb29a2f
Mysql2 :: Error：テーブル 'pays'は既に存在していますとエラーが出ているが、テーブルにはpaysテーブルはない。
ただpaysのマイグレーションが存在していた為、rollbackして削除することにした。
rollbackのやり方参考サイト
https://pikawaka.com/rails/migration

違うエラーが出た、また明日メンターに相談！
パッケージ分けされたJavaのコードをコマンドで実行する

調べてもなかなか出てこなかったのでメモ。

# 実行コマンド

```
$ javac -d /path/to/build/dir/ /path/to/javafiles
$ java -cp /path/to/classfiles/ main.Main
```
# 例

こんな階層だったとします。

```
.
└── src
    ├── app
    │   └── App.java
    └── hoge
        ├── Hoge.java
        └── fuga
            └── Fuga.java
```

## コンパイル

全部コンパイルします。-d で生成ファイルの出力先のディレクトリを指定します。

```
$ javac -d build src/*/*.java src/*/*/*.java
```

こうなります。

```
.
├── build
│   ├── app
│   │   └── App.class
│   └── hoge
│       ├── Hoge.class
│       └── fuga
│           └── Fuga.class
└── src
    ├── app
    │   └── App.java
    └── hoge
        ├── Hoge.java
        └── fuga
            └── Fuga.java
```
build ディレクトリにclassファイルがちゃんとパッケージ分けされて入っています。

## 実行

```
$ java -cp build app.App
```
-cpでクラスパスを指定します。クラスパスは、classファイルを探すルートとなるディレクトリです。buildの中にあるのでそれを指定します。

app.App の部分は、mainメソッドが入っているクラスをパッケージ名込み且つ、ドット区切りで指定します。



以上です。
flywayのflyway.configFileプロパティが消えてた。

DBのマイグレーションにflywayを使用しています。

flywayのバージョンを変更して、いつものようにコマンドを実行すると、エラーが出るようになりました。
実行できていたはずのコマンドがエラーになり困っていましたが、一先ず解決したので共有します。

原因：バージョンが変わったことでflyway.configFileが使用できなくなった。

エラーが発生した時のバージョンは以下です。
・Apache Maven 3.6.0
・flyway-maven-plugin 6.0.8　(4.1.0から変更)

```console:エラー例
$ mvn -Dflyway.configFile=src/main/resources/application-local.yml flyway:info
[INFO] Scanning for projects...
[INFO]
[INFO] --------------< jp.co.hoge.hoge.app:hoge-hoge-app >---------------
[INFO] Building hoge-hoge-app 0.1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:6.0.8:info (default-cli) @ hoge-hoge-app ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.462 s
[INFO] Finished at: 2020-04-03T08:50:08Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:6.0.8:info (default-cli) on project hoge-hoge-app: org.flywaydb.core.api.FlywayException: Unknown configuration property: flyway.configFile -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
```

メッセージで`Unknown configuration property: flyway.configFile`と表示されているように、
flywayのバージョンを変えてたことで(4.1.0 -> 6.0.8)、flyway.configFileが使用できなくなったようです。
(変更前は使えたのでプロパティがないとは疑えずはまった・・。)

[ドキュメント](https://flywaydb.org/documentation/maven/#config-files)で使用されていたプロパティに修正すると、エラーが解消されました。

```console:修正前後
$ mvn -Dflyway.configFile=src/main/resources/application-local.yml flyway:info    # 修正前
$ mvn -Dflyway.configFiles=src/main/resources/application-local.yml flyway:info   # 修正後 (configFilesに変更)
```

ちなみにIssueも上がっていました。
https://github.com/buthomas/Cake.Flyway/issues/12

複数のconfigファイルをサポートする時に消えたっぽい？
https://github.com/flyway/flyway/issues/1624


はまる人は少数かと思いますが、参考になればと思います。
今回は以上です。
ベイズの定理について (E資格対策)

やっと分かった気がしてきたので書きます。



#ベイズの定理とは
ある事象$H$が起きた条件下で$D$が起きる確率を以下の式で表せます。



$$
P(D|H)=\dfrac{P(H|D)P(D)}{P(H)}
$$

D：Distrbution(分布）
H：Hypothesis（仮定）
明確な文献を見つけられなかったのですがDとHはこの略だと推定しています。

##つまりどういうことだってばよ
ベイズの定理は読解力も試されます。
こんな問題を考えましょう。


ジョーカーを抜いたトランプの山札があります。一枚カードをとったとき、それが**ダイヤでかつ絵札**である確率は？

ちなみに図の斜線部の確率です。


<img width="621" alt="toranpurei.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/04794991-efca-fe3b-e88c-844fcb10cf78.png">

ダイヤでかつ絵札は全部で3枚しかないので答えは$\frac{3}{52}$




では次の問題

ジョーカーを抜いたトランプの山札があります。一枚カードをとったとき、それが**絵札でかつダイヤ**である確率は？

図の斜線部の確率です。

<img width="621" alt="teumprei1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/d071b466-fbe2-d8da-d83f-e65fd1cd6194.png">

絵札でかつダイヤは全部で3枚しかないので答えは$\frac{3}{52}$


つまり


引いたカードがダイヤである確率×引いたカードがダイヤであったときに絵札である確率

=引いたカードが絵札である確率×引いたカードが絵札であったときダイヤである確率

と言えます。

この式をベイズの式にあてはめます。

$P(H)$:引いたカードがダイヤである確率
$P(D)$:引いたカードが絵札である確率
$P(H|D)$:引いたカードが絵札だった時、ダイヤである確率
$P(D|H)$:引いたカードがダイヤだったとき、絵札である確率

DとHは問題によって変化するので今回はお気になさらなず。

とすると

$$
P(D|H){P(H)}={P(H|D)P(D)}
$$

変形すると
$$
P(D|H)=\dfrac{P(H|D)P(D)}{P(H)}
$$

ベイズの公式の完成。





##例題

ジョーカーを抜いたトランプの山札があります。一枚カードをとるとそのカードのマークはクラブでした。この時カードが絵札である確率は？

Hは仮説なので

$P(H)$:引いたカードがクラブである確率
です。順次公式に当てはめていきましょう。

$P(D)$:引いたカードが絵札である確率
$P(H|D)$:引いたカードが絵札だった時、クラブである確率
$P(D|H)$:引いたカードがクラブだったとき、絵札である確率

では計算すると

$$
P(D|H)=\frac{P(H|D)P(D)}{P(H)}=\frac{\frac{1}{4}\frac{4}{13}}{\frac{1}{4}}=\frac{4}{13}
$$

こんな感じです。




参考文献
図解・ベイズ統計「超」入門 (サイエンス・アイ新書)
初心者の気持ちがわかる!!　Railsチュートリアル第1章(1.1 1.2)

#初心者の気持ちがわかる！！Railsチュートリアル 1.1 1.2
##投稿の目的
１、私自身（初心者）が躓いた部分の解決方法をできるだけわかりやすく記載（urlのみの場合あり）する事で、初心者の方が躓いてもリタイアする事なく、Railsチュートリアルを完走できることを目的とする。（読者）

２、１、２周目で学んだことをoutputする場とし、曖昧な部分を明確にし、理解を深める。（筆者）

##筆者の現状##

Railsチュートリアル1周目が終わりました。

とにかく手を動かし、理解は５割ぐらいというところでしょう、、、

そこで２周目は80~90%理解を目指して、進めていくつもりです。

１周目でわかりにくかった所、その際参考にしたサイトなど控えております。


それでは、早速、、、

##Railsチュートリアル (1.1 1.2)
##1.1　はじめに
###1.1.1 前提知識
私は、Railsチュートリアルに取り掛かるまでに,
ProgateのHTML,CSS,コマンドラインコース,Gitコースをやっておきましょう。
完璧にする必要はありません。１、２周ぐらいで十分です。
（私は、上記に加えて、
Progate：Javascript(以後js）,jQuery
ドットインストール：HTML,CSS,js,jQuery
を完了させていました。
余裕があればやってみてください。後々必要です。）


###1.1.2　この本における取り決め
さらっと読んでおきましょう。

##1.2 さっそく動かす

###1.2.1 開発環境
本チュートリアルでは開発環境はIDE（統合開発環境）であるAWS Cloud9を使用します。

開発環境はローカル開発環境とIDE（統合開発環境）の二つに分けられます。
簡単にいうと、
ローカル開発環境：自分でカスタマイズしないといけない
→初心者には大変、、
IDE：ある程度元からカスタマイズされている。
→煩雑で時間のかかるカスタマイズをしなくてすむ。

AWS Cloud9のクラウドIDEを利用する手順はRailsチュートリアルの解説通り。

###1.2.2 Railsをインストールする

最初に、Rubyドキュメントのインストールで無駄な時間を使わないための、コマンドを追加する。
（これはrailsチュートリアルに現段階では理解する必要がないとの記載のため追究せず、、）

```terminal
$ printf "install: --no-document \nupdate:  --no-document\n" >> ~/.gemrc
```

今回は初めてなので以下に写真も載せておく、
ターミナルに記載していく。
（コピーしてくる時は「＄」もコピーしてこないように、、
＄は元からコンソールに記載済み）
![スクリーンショット 2020-04-03 21.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/c6a887f1-d306-e2a1-ef3e-534ebba56226.png)

次に、gemコマンドを使ってrailsライブラリをインストールする。

```terminal
$ gem install rails -v 5.1.6
```
上記にてrailsの5.1.6バージョンをインストールする。

vは（version)のこと、
-v以降にversion番号をいれる事でversionの指定ができる。

**Q. ライブラリとは？ gemとは？　gemコマンドとは？**


**A.**
**ライブラリとは、rubyを簡単に速く、書くための便利グッズ的なものです。**

rubyには便利なライブラリ(パッケージ）がたくさんあります。

今回はrailsというライブラリをインストールします。（今後他のライブラリもどんどんインストールしていきます。）

**gemとは、rubyのライブラリ（パッケージ）事をいい、**

**gemコマンドとは、ライブラリ（パッケージ）を管理するものです。**
つまり、gemコマンドでインストールやアンインストールができます。


##筆者コメント##
私自身初心者なので、間違いがあると思います。
間違いがあれば指摘していただけると幸いです。

また、
もう少しここを詳しく！！、イマイチわからなかった！！
等あれば、コメントいただけるとできる限り改善しようと思います。
私自身の成長にも繋がると思いますので、、、

最後まで、読んでいただきありがとうございました。
Laravelのページネーションについて

##Laravelのページネーションについてまとめました。


`````````
   public function index()
   {
      $tweets = Tweet::all()->paginate(30);
     //30個ごとのtweetが表示される。
      return view('tweets.index', ['tweets' => $tweets);
   } 
```
コントローラーはこれだけで、

```
{{ $tweets->links() }}
```
ビューファイルにはこれを書けば簡単いにページネーションができます。

<img width="337" alt="スクリーンショット 2020-04-03 22.08.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568038/0b2ee157-3351-88bb-9b40-eb779f91508c.png">
PowerBIで同じデータソースのデータを後から同一のテーブルに追加する

#やりたかったこと
**一度データソースから取得したテーブルに、同一データソースからのデータを追加して、同じテーブルで管理したい。**要は、GoogleAnalyticsから既にデータを取ってきて可視化してたんだけど、あとで他の項目も合わせて可視化したくなったんだけど、どうしたらいいんだってことです。

#全体の流れ
自分が試した全体の流れはこんな感じです。
＊既に一度データソースからテーブルを生成している前提です。

1. いつも通り「データを取得」で欲しいデータを選択する
1. 欲しいデータを含む、新しいテーブルが出来る
1. 「クエリの編集」からPower Query エディターを開く
1. 新しいテーブルの[クエリ]-[詳細エディタ]からクエリを直接みる／コピーする
1. 既にあった追加したいテーブルのクエリに直接追加する
1. 新しく追加したテーブルは削除（綺麗に管理する為）

＊ポイントは、[詳細エディター]で直接クエリを見て、どんなクエリなのかを直接確認する
![コメント 2020-04-03 193441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/d674861c-ebc2-0ee9-19aa-23de69b4775a.png)

#自分がやりたかったGoogleアナリティクスの場合
**最初のクエリ（一部）**
"PageViews" "New Users"がなかった
![コメント 2020-04-03 185030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/649b0160-0ee8-d02b-186e-d5fedb709757.png)

**新しく追加したテーブルを参照して、部分的に追加したクエリ（一部）**
"PageViews" "New Users"は直接コピペで追加
![コメント 2020-04-03 185258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/1012dbce-eebd-0207-65a4-62ac196b9197.png)

#結果
無事、１つのテーブルで管理することが出来ました。

#感想
[クエリのマージ]とかでも出来そうな気がするのですが、テーブルの照合などでデータの一貫性が万が一壊れたりすると嫌な感じがするので、とりあえず、今回の方法を試しました。何か、他に良い方法があれば。
Moveit2 ビルド＆動作検証

# 概要
Moveit2が少し動きそうな感じなので、サンプルプログラムを動作させた記録です。

# 対象

- ROS2触ったことがある人
- Moveit2に関心のある人
- [過去のMoveit2](https://github.com/AcutronicRobotics/moveit2)をビルドして苦い経験のある人

# 環境
Ubuntu 18.04
ROS2 **Eloquent**

ROSと関連のビルドツールのインストールは[公式のインストラクション](https://index.ros.org/doc/ros2/Installation/Eloquent/Linux-Install-Debians/)
と[ビルドチュートリアル](https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/)を参照してください。

# 準備
## 0.必要なソフトウェアの準備

依存ソフトウェアの取得にvcstoolが必要なので、下記のコマンドでインストールします。

```
$ sudo apt-get install python3-vcstool
```

## 1.ワークスペースの作成

下記のコマンドでワークスペース作ります。

```
$ export COLCON_WS=~/ws_ros2/
$ mkdir -p $COLCON_WS/src
$ cd $COLCON_WS/src
```

## 2.ソース取得
Githubからソースを取得後、vcsを使って依存関係にあるソースを集めます。

```
$ git clone https://github.com/ros-planning/moveit2.git -b master
$ vcs import < moveit2/moveit2.repos
$ vcs import < moveit2/moveit_demo_nodes/run_moveit_cpp/run_moveit_cpp.repos # ros2control等が不足しているので必要
$ rosdep install -r --from-paths . --ignore-src --rosdistro eloquent -y
```

## 3.ビルド
以下のコマンドでビルドします。

```
$ cd ..　# ワークスペース直下に戻る
$ colcon build --event-handlers desktop_notification- status- --cmake-args -DCMAKE_BUILD_TYPE=Release
```

# 起動方法

以下のコマンドで起動できました。

```
$ ros2 launch run_moveit_cpp run_moveit_cpp.launch.py
```

成功するとrvizが起動して、下記の画面が表示されるはずです。
![Screenshot from 2020-04-03 21-22-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/4692da90-3e26-28e3-8bf8-ebf308aadba4.png)

しばらくするとPandaと障害物のブロックが表示されPlanning経路が半透明のモデルで示されます。

![Screenshot from 2020-04-03 21-22-56 - 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/2f32297d-1076-5aa2-751f-e25397fab9f1.png)

Pandaが障害物を避けて動作すれば成功です。

![Screenshot from 2020-04-03 21-35-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/6942ba32-e2b7-5530-d0a6-af7cdd09d222.png)


# メモ＆総括

昔、仕事でやったときはかなり苦労したのですが、大分ちゃんとしてきた印象です。

また、まだMoveit!のようにボールを動かしてプランニングすることはできないようです。
URや他のロボットアームのドライバソフトが動かせると楽しそうですが、色々準備しなければ難しそうですね。。。。


#参考資料
- https://github.com/ros-planning/moveit2
- https://github.com/ros-planning/moveit2/tree/master/moveit_demo_nodes/run_moveit_cpp
【Ruby on Rails】ERROR: Error installing rails: sprockets requires Ruby version >= 2.5.0.【環境構築時エラー】


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

Rubyは「Ruby+Devit 2.4.6-1 (x64)」をインストールしました。

Rubyのバージョンや環境を切り替えることができるuru導入しました。
そしてrailsをインストールするために以下コマンドを入力しました。

```
gem install rails --version="5.2.2"
```

するとエラー発生。

```
ERROR: Error installing rails: sprockets requires Ruby version >= 2.5.0.
```
Rubyのバージョンが低いことが原因のようです。
今度は「Ruby+Devkit 2.6.5-1 (x64)」をダウンロードし、以下コマンドで登録。

```
uru admin add C:\Ruby26-x64\bin --tag Ruby26
```
Ruby26に変更してみます。

```
uru Ruby26
```

再びrailsインストールコマンドを入力します。

```
gem install rails --version="5.2.2"
```

今度はエラーが表示されなくインストールできました。
直線の方程式を正規化する

直線の方程式をプログラムで扱う場合、**正規化**すると便利。

[直線の方程式](https://qiita.com/tydesign/items/4d3909a826363d8fc29f)の一般形
$$ax+by+c=0$$
はこの形からわかるように、両辺にゼロ以外の定数を掛けても意味は変わらない。
つまり、
$2x+2y+2=0$ と $4x+4y+4=0$ は同じ直線を表している。

正規化とは、この性質を利用して
直線の方程式の係数 $a,b$ の組のベクトルが単位ベクトル（大きさが１のベクトル）となるように、
$a^2+b^2=1$ となるような $a,b$ を設定すること。
この $a,b$ の組のベクトルは、直線の法線ベクトルでもあるので、直線の法線ベクトルを単位ベクトル化するとも言える。

正規化するには、ベクトル $(a,b)$ の大きさの逆数、
$$\frac{1}{\sqrt{a^2+b^2}}$$
を掛ける（ベクトルの大きさで割る）ことで変形することができる。

#### 【例】直線 3x-2y-4=0 を正規化する。
$a=3, b=-2$ なので、
$$\frac{1}{\sqrt{a^2+b^2}}=\frac{1}{\sqrt{3^2+(-2)^2}}=\frac{1}{\sqrt{13}}$$
よって正規化された直線の方程式は、
$$\frac{3\sqrt{13}}{13}x-\frac{2\sqrt{13}}{13}y-\frac{4\sqrt{13}}{13}=0$$
となる。小数で表すと、
$$0.832050x-0.554700y-1.109400=0$$

## 正規化された直線の方程式を使って点と直線の距離を求める
直線 $ax+by+c=0$ と点 $P(x_0,y_0)$ との距離を $PH$ とすると、[点と直線の距離](https://qiita.com/tydesign/items/cf471b7bc1357e72c6e7)の公式より、
$$PH=\dfrac{\mid ax_0+by_0+c\mid}{\sqrt{a^2+b^2}}$$
となる。
正規化された直線の方程式を使うと、この公式の分母 $\sqrt{a^2+b^2}$ が 1 となるので、
$$PH=\mid ax_0+by_0+c \mid$$
で求めることができる。
また、原点 $(0,0)$ と直線 $ax+by+c=0$との距離の公式
$$PH=\dfrac{\mid c\mid}{\sqrt{a^2+b^2}}$$
は、正規化された直線の方程式を使うと単に、
$$PH=\mid c \mid$$
です。
正規化された直線の方程式の係数 $c$ の絶対値は、原点 $(0,0)$ からの距離を表している。
etc/hostsの設定一発編集（windows）


###etc/hostsに追加してください→どうやるの？

####簡単な方法
下記を実行するだけ（あとは設定を追記して保存）

```
powershell -NoProfile -ExecutionPolicy unrestricted -Command "start notepad C:\Windows\System32\drivers\etc\hosts -verb runas"
```
ちなみに,vscodeでも開ける

```
powershell -NoProfile -ExecutionPolicy unrestricted -Command "start code C:\Windows\System32\drivers\etc\hosts -verb runas"
```

####下記余談

社内システムやお客様側の開発環境にアクセスする方法を教えてくれという問合せが多くなってきました。
コンテンツ管理者からの問合わせだったり、要件定義メンバーからの問合わせだったり、、
（うちみたいな小さな会社では社内DNSは持っていない、、きっとみんな社内DNSのある会社で働いていたんだろうなと問合わせが来る度にしみじみ思う。）

よくある方法が
powershellを管理者権限で開いてC:\Windows\System32\drivers\etc\hostsを編集して下さい。

```powershell:
> write C:\Windows\System32\drivers\etc\hosts
```
だったり、
メモ帳を管理者権限で開いてC:\Windows\System32\drivers\etc\hostsを編集して下さい。
だったりする。

これで返答するとposershell？管理者権限？→難しいよ！ってなること間違いない。
（開発者でなければ、ファイルを編集するのに権限が必要だったり、powershellみたいなターミナルを使用する必要も考える機会もないのだから当然だと思う。常識では消してない。エンジニアが知っていることは日常で見えないところだから常識と思ってはいけない。昔自動販売機が壊れたという友達Aの笑い話に情報系の友達Bがロジカルに自動販売機の仕組みを説明し壊れた原因を伝えていた。うん、常識ではない。）
スクランブルエッグを作りたい

##関数、引数、仮引数、戻り値をスクランブルエッグを作りながら説明する。
###はじめに
**関数**とは、簡単に説明すると、「**機能を部品化して再利用できる様にしたもの**」です。
同じ様な処理が複数の箇所で必要になる場合があります。
処理が必要になる度に**同じ処理を記述していくことは手間が掛かる**ので、予め機能部品として定義しておくことで、処理を書く回数が１回限りになる上、関数名と引数を記述するだけで利用することが可能になります。

関数を使用して、**引数**や**仮引数、戻り値**について説明すると、
まず関数を使いたい場合は関数名を記述して呼び出します。
これを**呼び出し元**と言います。

呼び出し元から関数に引数を渡すと、
引数を処理した後に戻り値として処理結果を呼び出し元に返してくれます。
###スクランブルエッグを作ろう！
![images.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580388/2ba3c666-6dd3-9ea7-e385-58c8940f437c.jpeg)

例えば、とあるレストランには、卵🥚（**引数**）を使ってスクランブルエッグを自動で作れる機械（**関数**）が置いてあるとします。これはこのレストランが独自で開発（**関数の定義**）した機械🤖です。

機械に卵を渡すと、機械は自動的にかき混ぜて焼いてくれる処理を行い、料理した結果（スクランブルエッグという名の**戻り値**）を、注文したお客さん（**呼び出し元**)に届けてくれます。

お客さんは「卵」と呼んでいますが、このレストランでは卵のことを「白玉」という専門用語で呼んでいたとします。この専門用語が**仮引数**です。
同じ卵（引数名）でありますが、客（呼び出し元）とレストラン（関数）で呼び方が違うだけで、内容は全く同じ卵です。

この自動でスクランブルエッグを作れる機械（関数）を定義しないと、お客さんが注文するたびに店員は手作業（処理を一から記述していく）で作らなくてはなりません。


```php

<?php    
  
  function scrambleEgg($shiratama1, $shiratama2) {
    $ryouri = $shiratama1 * $shiratama2;
    return $ryouri; 
  };
    
  echo scrambleEgg(5, 10);  //結果：50
    
?>
```
上記を例にすると、お客さんは卵２個のことを「**５**」と「**１０**」と呼んでいるのに対して、同じ卵でもレストラン側では「**$shiratama1**」と「**$shiratama2**」と呼んでいます。
結果としては卵を使ったスクランブルエッグ（**５０**）という料理が注文したお客さんに届けられますね！

 
今回はここまで:santa:
pandas-profilingで相関グラフ描写をSkipする方法

# 概要
pandas-profilingを実行するにあたり、correlationsやdynamic binningなど高負荷な処理をSkipしたいケースに使える引数があったので備忘としてメモ。

# コード
```python:skip_conf
profile = ProfileReport(large_dataset, minimal=True)
profile.to_file(output_file="output.html")
```
・**minimal=True**を入れる

# ケース
・サイズの大きいデータセットにpandas-profilingかけたい時
・pandas-profilingがcorrelationsやdynamic binningでエラーが発生する時

# 参照
> https://github.com/pandas-profiling/pandas-profiling#large-datasets
「The Language Support for Java server crashed 5 times in the last 3 minutes. The server will not be restarted.」エラーで振り回された話

「The Language Support for Java server crashed 5 times in the last 3 minutes. The server will not be restarted.」
このエラーに振り回されたので、備忘録として残そうと思います。

自分メモなので適当

#始まり
Docker使ってJavaの環境を整えたいな...

せや、この記事参考にやってみよう！
https://blog.kondoumh.com/entry/2019/09/22/100000

![スクリーンショット 2020-04-03 20.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293066/4b4a5fd0-5482-1c86-0201-f0109302667b.png)


はい？？？できないんですがそれは。


#調べたら出てきた事
わからんのでエラー内容コピペで検索
これが出てきた。
http://wiki.tk2kpdn.com/language-support-for-java-error-in-vscode/

ほう、アンイストールしてsetting.jsonをやり直すのか。
アンイストールめんどい...
でもこれしかないか...

##アンインストール際に困った事
記事には、
ユーザー設定を削除。
( C:\Users\(ユーザー名)\AppData\Roaming\Code\User )

このAppDataフォルダがmacにない！！
どこにあるの？？

##調べた
https://www.atmarkit.co.jp/ait/articles/1810/12/news026.html


Windows：%APPDATA%\Code\Userフォルダ
macOS：~/Library/Application Support/Code/Userフォルダ
Linux：~/.config/Code/Userフォルダ


らしいです。ターミナル開いて行ったらありました。
なのでUserファイルをrmしました。

そして再インストールしました。

![スクリーンショット 2020-04-03 21.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293066/20d1b675-df0d-5497-4a10-eb976e89d76f.png)
わーいできた。

終わり
ホームディレクトリに作られる「公開」を「Public」にする

（弊ブログ http://circle9tym.blog.fc2.com/blog-entry-317.html の内容とだいたい同一です）

#「公開」「デスクトップ」「音楽」

Debian で、設定言語が日本語のままデスクトップ環境を立ち上げると、 「公開」だとか「デスクトップ」だとか、非 ASCII なディレクトリ名がたくさん出来上がります。 日本語名なディレクトリ名が存在すると、

* `cd` するときに、いちいち日本語入力に切り替えなければならない。
* X でない環境では、♦や■が大量に並んで、標準出力が読めなくなる。
* そもそもダサい。

といった不利益を被ります。なので、こいつらのディレクトリ名を英語に変えてあげたいわけです。

# XDG ユーザーディレクトリ

ところで、このディレクトリ群は何者かというと、[XDG ユーザーディレクトリ](https://wiki.archlinux.jp/index.php/XDG_%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA)と言うらしいです。`xdg-user-dirs` によって生成され、他のアプリケーションによって参照されることもしばしばあります。Web ブラウザでダウンロードしたものの保存先が、規定で「ダウンロード」もしくは “Downlodas” になっているのも、このおかげです（たぶん）。他のアプリケーションから参照するために、`~/.config/user-dirs.dirs` に、設定ファイルがあります。

```user-dirs.dirs
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
# 
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
```

上の例は、すでに英語設定になっている場合の例です。で、こいつらを日本語から英語にするには、この設定ファイルの中身を書き換えて、新しくディレクトリを掘ればいい……、わけですが、面倒ですね。

# “Public” “Desktop” “Music”

英語にするためには、`xdg-user-dirs` に、英語の設定でディレクトリを再び掘らせればいいわけです。すでにユーザーディレクトリがある場合は、ディレクトリの再配置に失敗するっぽいので、`--force` オプションで、強制的に再配置させましょう。

```
% LC_ALL=C xdg-user-dirs-update --force
```

こうすると、新しく英語名のディレクトリが配置され、`~/.config/user-dirs.dirs` も書き換わります。しかし、既存のディレクトリがリネームされるわけではないので（既存のものはそのまま残る）、必要に応じて `mv` などしてデータを移行しましょう。
【Python】Windows10でCuPyを導入してCUDAコアを利用するまで

導入でハマったので記事にしました。
※この記事は、2020/04/05に投稿した記事です。

#CuPy？
NumPy互換のGPU演算用ライブラリです。
>Python での 高速計算。 NumPy 互換 GPU 計算ライブラリ cupy
>https://purakaku-python.readthedocs.io/ja/master/chapter_ml/cupy.html

#環境
記事に必要そうな範囲のみ抽出

|種別|スペック/バージョン|
|---|---|
|CPU|Intel Core i7-9700K|
|RAM|DDR4-2133 32GB (8GBx4)|
|GPU|NVIDIA GeForce GTX1080Ti|
|OS|Windows10 Pro 1909 64Bit|
|CUDA Toolkit10.2|10.2.89|
|Python3|3.7.6|
|CuPy v7|7.3.0|

#自己責任でお願いします
CuPyは**Windowsでの動作を保証していません。**
また、当ページではWindowsでの利用方法を説明していますが、非サポート環境での利用を推奨しているものではありません。

#CUDAバージョンの確認
コマンドプロンプト等で以下のコマンドを実行

```
nvcc -V
```

実行後、以下のようなレスポンスがあれば正常に確認できています。

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:32:27_Pacific_Daylight_Time_2019
Cuda compilation tools, release 10.2, V10.2.89
```
CuPyインストール時に利用するので、最後の行の`release`の数字を控えておきます。
この場合は`10.2`だけ控えておけば問題ありません。

###あれ、違うレスポンス？
```
'nvcc'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ　ファイルとして認識されていません。
```
このようなレスポンスがあった場合はCUDA Toolkitをインストールする必要があります。

#CUDA Toolkitのインストール
###ダウンロード
**[CUDA Toolkitのダウンロードページ](https://developer.nvidia.com/cuda-downloads)**から、インストールする環境にあったものをダウンロードします。
![200403a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232583/208e09ab-86ac-8724-57bd-153e8d7f05be.png)
`exe[network]`と`exe[local]`はどちらでも構いません。

###インストール
表示される手順に従ってそのままインストールします。

#CuPyの導入
控えていた数字はここで使います。今回の場合では`10.2`でしたので、コンマを除いて以下のように入れてインストールします。

```
pip install cupy-cuda102
```

インストールが正常に完了したらシステムを再起動します。
使用方法は以下の記事が参考になります。

>pythonで簡単にGPU計算ができるCupyを紹介
https://qiita.com/samacoba/items/d18e6cf09f544477aff4

#importできない

```
import cupy as cp
Traceback (most recent call last):
File "C:\Users\thzking\AppData\Local\Continuum\anaconda3\lib\sit...
...
(いっぱいエラー)
...
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

###以下の方法で解決できるかもしれません。

- **セットアップ後、システムを再起動していない場合は再起動(重要)**
- CUDAのバージョン再確認
- CuPyの再インストール
- CUDA Toolkitの再インストール
- 放り投げて寝る
Ruby要点整理

# Ruby要点整理
Rubyを学ぶ中で、理解が曖昧で、何度も書籍に立ち戻り確認してしまう点について、知識の整理のために記事を作成します。

##アクセスメソッド
オブジェクトの外部から直接インスタンス変数を参照したり、インスタンス変数に代入したりすることができないため、オブジェクトの内部情報にアクセスするためのメソッドを定義する必要がある。

###例1


```ruby:example1.rb
class Menu
 def initialize(name)
   @name = name
 end

 def name
   @name
 end

 def name=(name)
   @name = name
 end
end
```

上の例1では、nameメソッドはインスタンス変数を参照するもので、name=メソッドは、インスタンス変数を変更するもの。
しかし、インスタンス変数をいくつも扱う場合、それぞれについてこれらのメソッドを定義する必要があり、手間やミスの可能性が増える。
そこで用意されているのが**アクセスメソッド**。

###例2

```ruby:example2.rb
class Menu
  attr_accessor :name

 def initialize(name)
   @name = name
 end
end
```

例２のように、　*「attr_accessor インスタンス変数名を示すシンボル」*
とすることで、例１のnameメソッドとname=メソッドの定義を１行で書くことができる。
このように、「attr_accessor」を用いることで、Menuクラスのインスタンスに、nameという情報（＝インスタンス変数）を持たせることができる。
[Shopify] 3月の更新をまとめました

皆様どうお過ごしでしょうか・・　オフィスのすぐ近くに住んでいる私はいつも以上にオフィスに出勤している日々です。

さて3月の更新をまとめました。

# 03月30日、

開発ストアで支払いのテストをしたい場合は`Shopify's test payment provider (Bogus Gateway)`のみでしかテストできないようになりました。

もしそれ以外のペイメントプロバイダーでテストが必要な場合は開発ストアから有料ストアにする必要があります。

今すでに使っている開発用ストアーはしばらくそのまま既存のテストGatewayが使えるようです。既存開発ストアに影響がある場合は、追ってアナウンスメントがあるそうです。

# 03月18日、カスタムエラーメッセージがより詳細化されました。

`customerActivate`、`customerActivateByUrl`、`customerReset`、`customerResetByUrl` にてパスワード入力エラー時に表記されるエラー内容がより詳細化されました。今までは `invalid customer` `token errors` のどちらかが返ってくるだけでした・・

下記がエラー一覧です。

UNIDENTIFIED_CUSTOMER, BAD_DOMAIN, BLANK, CONTAINS_HTML_TAGS, CONTAINS_URL, CUSTOMER_DISABLED, INVALID, INVALID_MULTIPASS_REQUEST, NOT_FOUND, PASSWORD_STARTS_OR_ENDS_WITH_WHITESPACE, TAKEN, TOKEN_INVALID, TOO_LONG, TOO_SHORT, ALREADY_ENABLED

https://shopify.dev/docs/storefront-api/reference/mutation/customererrorcode


# 03月03日、Storefront APIの`Order` `OrderLineItem` objectが新しくなりました。

Order
https://shopify.dev/docs/storefront-api/reference/object/order

OrderLineItem
https://shopify.dev/docs/storefront-api/reference/object/orderlineitem

`Order` と `OrderLineItem`に下記のフィールドが追加されました。

### Order.fulfillment_status
フルフィルメントのステータス、
FULFILLED, IN_PROGRESS, OPEN, PARTIALLY_FULFILLED, PENDING_FULFILLMENT, RESTOCKED, UNFULFILLED
のいずれか。
https://shopify.dev/docs/storefront-api/reference/object/order/orderfulfillmentstatus

### Order.cancelled_at

キャンセルされた日時、キャンセルされてない場合はNullが戻ってきます。

### Order.financial_status

支払いステータス
AUTHORIZED, PAID, PARTIALLY_PAID, PARTIALLY_REFUNDED, PENDING, REFUNDED, VOIDED
のいずれか。

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/order/orderfinancialstatus

### Order.cancel_reason

キャンセルされた理由
CUSTOMER, DECLINED, FRAUD, INVENTORY, OTHER
のいずれか。

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/order/ordercancelreason

### LineItem.current_quantity

マイナス分を差し引いた数

### LineItem.original_total_price

ディスカウントなどを加味しないオリジナル価格。商品マスタにあるユニットプライスを参照しています。

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/moneyv2

### LineItem.discounted_total_price

ディスカウントを加味した価格。

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/moneyv2

### Order.original_total_price

オリジナル価格

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/moneyv2


### Order.current_total_price

合計価格

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/moneyv2

### Order.edited

オーダーが編集されたか or not。

### Order.current_subtotal_price

小計価格

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/moneyv2

### Order.current_total_tax

税（部分）価格

タイプ:point_down_tone2:
https://shopify.dev/docs/storefront-api/reference/object/moneyv2

# 03月03日、PPA パートナーアグリーメントが更新されました。

`public app`と`custom app`の定義を追加、そしてShopifyのbilling agentとしての役割を明確にしたとのことです。Billing agentというのはパートナーとマーチャントの間で支払いのファシリテーションを行う事とのことです。すでに明確になっていたと思いますが、数多くのアプリの中でなにか問題があったのかな、どちらにしても`app`の品質を担保していくことはいいことですね。

そのほかに今回のPPA更新によってbilling/taxのステータス変更で影響がある方は個別に連絡いっているそうです。詳細はそちらを参照ください。
experimentalDecorators: true でも vscode がエラーを出すとき

`tsconfig.json` で

```
{
  "compilerOptions": {
    "experimentalDecorators": true,
```

な設定でも、何故か vscode がエラーを出すことがある。調べると何人かそういう症状の人が居るっぽい。

<img width="752" alt="スクリーンショット 2020-04-03 20.47.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5330/a816e2a3-f432-d7c8-b825-26f0363499ea.png">

その場合は、vscode の設定 > ワークスペース > TypeScript で、`Experimental Decorators` の設定を外す。(ワークスペースの`.vscode/settings.json` で以下の設定をする、と同等の設定。)

```
{
    "javascript.implicitProjectConfig.experimentalDecorators": true
}
```

<img width="910" alt="スクリーンショット 2020-04-03 20.48.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5330/2dad7eeb-9d33-76be-a4be-779c70c640e4.png">


`tsconfig.json` のほうが優先的なはずなのに謎である。

- https://github.com/microsoft/TypeScript/issues/9335#issuecomment-368418697
超簡単 tensorflow gpu 環境構築

tensorflow のGPU対応で、トラブルが発生している方も多いと思います。私も、その一人です。

例えば、tensorflow の公式サイトには、以下のように手順が示されていますが、[GPU サポート](https://www.tensorflow.org/install/gpu)、おいそれとはちゃんと動きません。以下、超簡単な手順です。ここでは、ubuntu 18.04 をクリーンインストールした場合を示します。

ubuntuをインストールした後、ドライバを自動でインストールします。

```
$ sudo ubuntu-drivers autoinstall`
```
再起動します。

```
$ sudo reboot
```

nvidia-smi で、GPUの同左確認をします。

```
$ nvidia-smi

Thu Oct 18 08:51:42 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.77 Driver Version: 390.77 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:01:00.0 On | N/A |
| 0% 57C P0 60W / 280W | 449MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1055 G /usr/lib/xorg/Xorg 264MiB |
| 0 1250 G /usr/bin/gnome-shell 102MiB |
| 0 1762 G ...uest-channel-token=13825578612558098011 80MiB |
+-----------------------------------------------------------------------------+
```
pipをインストールします。

```
$sudo apt update
$sudo apt install python3-dev python3-pip
```
anacondaをインストールします。

anaconda最新版を、https://www.anaconda.com/download/#linux から、ダウンロードします。

ダウンロードしたフォルダに移動して、実行します。ファイル名は、ダウンロードしたものにしてください。

```
$bash Anaconda3-5.3.0-Linux-x86_64.sh
```

anaconda 仮想環境を作成します。

```
conda create -n myenv pip jupyterpython=3.7 
```
作成した環境に移動して、

```
conda activate myenv
```
***ここがポイントです。***
anaconda チャネルからインストールするだけ！様々なパッケージもインストールしてくれます。

```
conda install -c anaconda tensorflow-gpu
```
以上