ムーのしょ〜もない様でしょ〜もなくもないブログ

プログラミング未経験だけど、エンジニアになりたい、IT関係の仕事がしたい方向けに情報を発信しています!あっ!けどプログラミング以外にも皆さんに有益になる様な情報も発信しますよー!

Githubのアカウントを二つ目取得!からのリモート接続までの道のり

こんにちは!

内定を頂いた会社で研修等があり宿題を提出する様でもう一つGithubアカウント

を取得したかったので、

取得してからのリモートで接続をしてEclipseでpushするまでが

なかなか大変だったのでメモ!

けど最終的にはとても簡単に接続が出来ました!

まずはssh鍵を新しく作ってGithubに登録して

リモート接続を試みました!

こちらの記事参照

qiita.com

qiita.com


ssh鍵の確認方法


もうすでにssh鍵を作成しておいたので今回は作成の手順は省きます

ssh鍵の確認コマンドは

$ cat ~/.ssh/id_rsa.pub

公開鍵をGithubにUPする


https://github.com/settings/ssh

これで公開鍵の設定が出来る(GitHubに登録していることが前提条件)

右上のNew SSH keyを選択

そしたらこの様な画面になるので f:id:muuuuukun:20190114225111p:plain

[title]を記入(titleはなんでも良いのかな?)

そして公開鍵をコピーするコマンドで(mac)コピーして貼り付ける

$ pbcopy < ~/.ssh/id_rsa.pub 

そしてAdd SSH keyを押したらエラー!!

なにやら同じ公開鍵ではGithubアカウントは複数登録出来ないみたいなので

公開鍵を作成する事に


ssh鍵の作成


$ ssh-keygen -t rsa -f xxxxxxxxxxx

xxxxxxxxxxxは自分の適当に


.ssh/configを修正する


$ vim ~/.ssh/config
------------------------------
vimファイルが開かれる
------------------------------
#private様
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
    Port 22
#xxxxxxxxxxxx
Host xxxxxxxxxxxx
    HostName github.com
    User git
    IdentityFile ~/.ssh/xxxxxxxxxxxx
    Port 22
Host------------アカウントを識別出来る名前
HostName------git.comを設定
User------------gitを設定
IdentityFile------それぞれのアカウントのキーファイルを設定
Port-------------22を設定

公開鍵を新しく作ったGithubに登録する


新しく作った公開鍵をコピーしておいて

$ pbcopy < ~/.ssh/xxxxxxxxxxxxx.pub

最初の方に紹介した手順で登録する


ssh鍵の登録


$ ssh-add /Users/your_home/.ssh/id_rsa
   
$ ssh-add /Users/your_home/.ssh/新秘密鍵

登録をしたらそれぞれのHost名で接続確認をする。

$ ssh -T github.com
Hi アカウントA! You've successfully authenticated, but GitHub does not provide shell access.
 $ ssh -T xxxxxxxxxxxxxx
Hi アカウントB! You've successfully authenticated, but GitHub does not provide shell access.

この時に最初どっちとも同じアカウントBで、こんにちは!って言われたので

しっかりと登録が出来てなかったみたい。

最初は鍵の登録の手順の時に「新秘密鍵」しか登録していなかったから

アカウントBで、こんにちは!ってなった原因だと思う。

それから元々あったアカウントを登録してあげたらしっかりと

アカウントAこんにちは!ってなりました!


アカウントBのディレクトリ設定


リポジトリ毎に設定が必要

名前とメールアドレスを登録

$ cd アカウントBのディレクトリ
$ git config user.name "アカウントBのユーザーネーム"
$ git config user.email "アカウントBのメールアドレス"

からの〜確認

$ less ./.git/config

・・・ここまでした所でとてもバタバタして

途中経過を載せる事が出来ませんでした!

けどここからの手順ではGithubにリモート接続を出来なかったです。

なんでだろうと思い悩み、色々考えると難しく考え過ぎていたのかなって

そしてここから気を取り直してもう一度1からやり直す事に!


Githubに新規リポジトリを作成


とりあえずリポジトリはこのまま放置しておいて

次はEclipseの方で操作!


Eclipseで新規プロジェクトを作成


まだgit管理していないものをgit管理して、githubと連携する

まずは新規プロジェクトを作成 f:id:muuuuukun:20190120211359p:plain

javaプロジェクトを選択 f:id:muuuuukun:20190120211445p:plain

プロジェクト名を決める f:id:muuuuukun:20190120211527p:plain

動作検証用のソースコードの追加 f:id:muuuuukun:20190120211607p:plain

Mainクラスを追加 f:id:muuuuukun:20190120211637p:plain

hogeを出力 f:id:muuuuukun:20190120211747p:plain

ローカルリポジトリをgit化 f:id:muuuuukun:20190120211843p:plain

Gitを選択 f:id:muuuuukun:20190120211910p:plain

まだローカルにリポジトリがないので

リポジトリ欄の右の「作成」を押す f:id:muuuuukun:20190120212009p:plain

好きな名前をつける。場所を変更しても大丈夫 f:id:muuuuukun:20190120212054p:plain

これで完了したらRubyでgit initしたのと一緒の状態になる

ステージにあげたって事

そして動作検証でcommitをする f:id:muuuuukun:20190120212250p:plain

この様な画面が出るので

Main.javaを選択して+を押す(git add Main.javaと一緒)

そしてコミット! f:id:muuuuukun:20190120212617p:plain

からの f:id:muuuuukun:20190120212812p:plain

先ほど用意しておいたGithubリポジトリ

URLをコピーして貼り付ける f:id:muuuuukun:20190120212922p:plain

プレビューを押したらアカウントを登録した時の

名前とパスワードを聞かれるので入力する f:id:muuuuukun:20190120213102p:plain

そしてこんな感じになるので f:id:muuuuukun:20190120213238p:plain

後は作成したリポジトリを見てしっかりと

pushが出来ていたら成功です!

【Java】の配列

配列のデータの従来のfor文と拡張for文の比較


従来のfor文

public class Main { 
  public static void main(String[] args){
   int[] score = {1, 2, 3, 4, 5};
   for (int i = 0; i < score.length; i++) {
     System.out.println(score[i]);
   }
  }
}
1
2
3
4
5

拡張for文

public class Main { 
  public static void main(String[] args){
   int[] score = {1, 2, 3, 4, 5};
   for (int value : score) {
     System.out.println(value);
   }
  }
}
1
2
3
4
5

引数に配列を用いる


メソッドんp引数にはint型やString型などの変数だけでなく

配列も使う事が出来る。

public class Main { 
  public static void main(String[] args){
   int[] array = {1,2,3};
   printArray(array);
  }
  
  public static void printArray(int[] array) {
    for (int element : array) {
      System.out.println(element);
    }
  }
}
1
2
3

戻り値に配列を用いる


public class Main { 
  public static int[] makeArray(int size) {
    int[] newArray = new int[size];
    for (int i = 0; i < newArray.length; i++) {
      newArray[i] = i;
    }
    return newArray;
  }
  
  public static void main(String[] args) {
    int[] array = makeArray(3);
    for (int i : array) {
      System.out.println(i);
    }
  }
}
0
1
2

Java初級【基礎編】

命令実行の文


System.out.println("");は改行されてしまうが

public class Main { 
  public static void main(String[] args){
    System.out.print("Hello");
    System.out.print("World");
  }
}
HelloWorld

System.out.print("")は改行されない


大きい方の数字を代入する命令


二つの値を比較して大きい方の数字を代入する

public class Main { 
  public static void main(String[] args){
    int a = 5;
    int b = 6;
    int m = Math.max(a, b);
    System.out.println("大きい方は" + m);
  }
}
大きい方は6

文字列を数値に変換する命令


String型をint型に変換する命令

public class Main { 
  public static void main(String[] args){
    String a = "5";
    int b = Integer.parseInt(a);
    System.out.println(b);
  }
}
5

乱数を生み出して代入する命令


ランダムな数を生成する命令

class Main {
  public static void main(String[] args) {
    int r = new java.util.Random().nextInt(90);
    System.out.println(r);
  }
}
65

Java初級【基礎編】

メソッドを呼び出してみる


メソッドとは、何らかの処理を割り当てた部品。

Javaのファイルを実行すると、自動的にmainメソッドが実行される

mainメソッドの処理をメソッドに切り分けると、

mainメソッドが各メソッドに指示を出し、

各メソッドが個々の処理を実行するという構造になる。

class Main {
  public static void main(String[] args) {
    hello();
  }
  
  public static void hello() {
    System.out.println("Hello Java");
  }
}
Hello Java
class Main {
  public static void main(String[] args) {
    printData();
    printData();
  }
  public static void printData() {
    System.out.println("私は佐藤です");
  }
}
私は佐藤です
私は佐藤です

メソッドに引数を渡す


メソッドに引数を渡すには、

メソッド名(引数)としてメソッドを呼び出す。

渡された引数は、メソッドの仮引数で指定した変数に代入され、

その変数はメソッドの処理の中で用いることができる。

class Main {
  public static void main(String[] args) {
    printData("佐藤");
    printData("加藤");
  }

  public static void printData(String name) {
    System.out.println("私の名前は" + name + "です");
  }
}
私の名前は佐藤です
私の名前は加藤です

複数の引数をもつメソッド


引数は複数渡すこともできる。

メソッドが複数の引数を受け取るためには、

仮引数をコンマ(,)で区切って定義する。

異なるデータ型の引数を複数受け取ることもできますし、

引数を受け取る順番も任意に決めることができる。

引数は左から順番に「第1引数、第2引数・・・」

というように呼ぶ。

class Main {
  public static void main(String[] args) {
    printData("佐藤", 34);
    printData("加藤", 23);
  }

  public static void printData(String name, int age) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
  }
}
私の名前は佐藤です
年齢は34歳です
私の名前は加藤です
年齢は23歳です

戻り値とreturnとvoide


return

メソッドの処理結果を、メソッドの呼び出し元で使いたい場合がある

このようなときは、

メソッドが戻り値(もどりち)を返すようにする。

メソッドの中でreturnを使うと、

returnの値をメソッドの呼び出し元に返すことができる。

戻り値があるメソッドは、戻り値のデータ型を指定する。

定型だった「public static void」のvoidの部分で指定する。

voide

voidは戻り値がないという意味。

戻り値のない(returnがない)メソッドには、voidを指定する。

class Main {
  public static void main(String[] args) {
    String name = fullName("佐藤", "健");
    printData(name, 27);
    printData("渡辺 健", 65);
  }
  public static void printData(String name, int age) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
  }

  // fullNameメソッドを定義してください
  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
}
私の名前は佐藤 健です
年齢は27歳です
私の名前は渡辺 健です
年齢は65歳です

メソッドのオーバーロード


同名のメソッドは原則として定義できない。

同じメソッドが複数存在すると、メソッドを呼び出したときに

どのメソッドを用いればいいのか、

コンピュータがわからなくなってしまうから。

ただし、引数の型や個数が違う場合は同名のメソッドを定義できる。

同名のメソッドがあっても、引数が違えばどれを呼べばいいのか

コンピュータが判断できるためです。

このように同名のメソッドを定義することをオーバーロードと言う。

class Main {
  public static void main(String[] args) {
    printData(fullName("佐藤", "健"), 27);
    
    // fullNameメソッドを用いて、printDataの引数を書き換えてください
    printData(fullName("渡辺", "ナベ", "健"), 65);
  }

  public static void printData(String name, int age) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
  }

  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
  
  public static String fullName(String firstName, String middleName, String lastName) {
    return firstName + " " + middleName + " " + lastName;
  }
}
私の名前は佐藤 健です
年齢は27歳です
私の名前は渡辺 ナベ 健です
年齢は65歳です


メソッドからメソッドを呼ぶ


メソッドは、mainメソッド以外のメソッドから呼び出すことも可能

プログラムの部品であるメソッドが、

相互に助けあってプログラムを形作る。

class Main {
  public static void main(String[] args) {
    printData(fullName("佐藤", "健"), 27, 1.6, 50.0);
    printData(fullName("渡辺", "ナベ", "健"), 65, 1.75, 80.0);
  }

  public static void printData(String name, int age, double height, double weight) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
    System.out.println("身長は" + height + "mです");
    System.out.println("体重は" + weight + "kgです");
    
    double bmi = bmi(height, weight);
    
    System.out.println("BMIは" + bmi + "です");
  
  }

  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
  
  public static String fullName(String firstName, String middleName, String lastName) {
    return firstName + " " + middleName + " " + lastName;
  }
  
  public static double bmi(double weight, double height) {
    return weight / height / height;
  }
} 
私の名前は佐藤 健です
年齢は27歳です
身長は1.6mです
体重は50.0kgです
BMIは6.4E-4です
私の名前は渡辺 ナベ 健です
年齢は65歳です
身長は1.75mです
体重は80.0kgです
BMIは2.7343749999999997E-4です

クラス・他のクラスを呼び出す


クラスは、メソッドという小さな部品をまとめる、

より大きな部品で。これまではmainメソッドと同じクラス

(Mainクラス)のメソッドを使ってきたが、

他のクラスのメソッドを利用することも可能

クラスの定義は「class クラス名」とします。

クラス名の最初の文字は大文字にし、

ファイル名は「クラス名.java」としなければならない。

Main.java

class Main {
  public static void main(String[] args) {
    Person.hello();
  }
}
Hello

Person.java

class Person {
  public static void hello() {
    System.out.println("Hello");
  }
}

先ほどの一つにまとまっているclass Mainを

class Personを作って分けてみる

Main.java

public class Main {
  public static void main(String[] args) {
    
    Person.printData(Person.fullName("Kate", "Jones"), 27, 1.6, 50.0);
    Person.printData(Person.fullName("John", "Christopher", "Smith"), 65, 1.75, 80.0);
  }
}

Person.java

class Person
  public static void printData(String name, int age, double height, 
  double weight) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
    System.out.println("身長は" + height + "mです");
    System.out.println("体重は" + weight + "kgです");
    
    double bmi = bmi(height, weight);
    
    System.out.println("BMIは" + bmi + "です");
  
  }

  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
  
  public static String fullName(String firstName, String middleName, String lastName) {
    return firstName + " " + middleName + " " + lastName;
  }
  
  public static double bmi(double weight, double height) {
    return weight / height / height;
  }
} 
私の名前は佐藤 健です
年齢は27歳です
身長は1.6mです
体重は50.0kgです
BMIは6.4E-4です
健康です
私の名前は渡辺 ナベ 健です
年齢は65歳です
身長は1.75mです
体重は80.0kgです
BMIは2.7343749999999997E-4です
健康ではありません


外部ライブラリ


Javaでは、他人が作ったクラスを利用することもできる。

このようなクラスを外部ライブラリと呼び、

自分のプログラムに読み込むことで利用できるようになる。

すべてのプログラムを自分だけで開発する必要がない。

世界中のエンジニアが作った便利なメソッドを利用することで、

開発の幅は一気に広がる。

Mathクラスのメソッド

Mathクラスのmaxメソッドを使ってみる。

maxメソッドは、引数に渡した2つの数値の大きい方を

返してくれる。

外部ライブラリをうまく活用すれば、

自分で実装する手間が省けるので便利。

Person.java

import java.lang.Math;

class Person
  public static void printData(String name, int age, double height, 
  double weight) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
    System.out.println("身長は" + height + "mです");
    System.out.println("体重は" + weight + "kgです");
    
    double bmi = bmi(height, weight);
    
    System.out.println("BMIは" + Math.round(bmi) + "です");
                                       ここ
  }

  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
  
  public static String fullName(String firstName, String middleName, String lastName) {
    return firstName + " " + middleName + " " + lastName;
  }
  
  public static double bmi(double weight, double height) {
    return weight / height / height;
  }
} 
私の名前は佐藤 健です
年齢は27歳です
身長は1.6mです
体重は50.0kgです
BMIは20です
健康です
私の名前は渡辺 ナベ 健です
年齢は65歳です
身長は1.75mです
体重は80.0kgです
BMIは26です
健康ではありません

import不要のクラス


先ほど読み込んだ「java.lang.Math」はよく利用されるため、

実は特別にimportせずに自動で読み込まれるようになっている。

Mathクラス以外にも「java.lang.クラス名」となる外部ライブラリは

すべて自動で読み込まれる。 


Scannerで文字を受け取る


import java.util.Scanner;

class Main {
  public static void main (String[] args) {
    Scanner scanner = new Scanner(System.in);
    
    System.out.print("名前: ");
    
    String name = scanner.next();
    
    // 「こんにちは◯◯さん」と出力してください
    System.out.println("こんにちは" + name + "さん");
  }
}

Scannerで数値を受け取る


Scannerを用いて、整数と小数を受け取る方法。

整数を受け取るメソッドはnextIntメソッド、

小数を受け取るメソッドはnextDoubleメソッド。

    System.out.print("年齢:");
    int age = scanner.nextInt();
    
    System.out.print("身長(m):");
    double height = scanner.nextDouble();

Java初級【基礎編】

真偽値とは


真偽値には「true」と「false」という2つの値しか存在しない。

trueは真(正しい)、falseは偽(間違っている)。

真偽値のデータ型はboolean型。

trueとfalseはboolean型

boolean bool = true;
   ↑
データ型

class Main {
  public static void main(String[] args) {
    // 「真」を表す真偽値を出力
    System.out.println(true);
    true
    
    // 「偽」を表す真偽値を出力
    System.out.println(false);
    false
    
    // 「==」を用いて、値を比較した結果を出力
    System.out.println(12 / 4 == 3);
    true

    // 「!=」を用いて、値を比較した結果を出力
    System.out.println(12 / 4 != 3);
    false
    
    // boolean型の変数boolを定義し、「3 * 9 == 27」を代入
    boolean bool = 3 * 9 == 27;
    
    // 変数boolの値を出力
    System.out.println(bool);
    true
  }
}

倫理演算〜ではない


// 「8 < 5」でない、の結果を出力
    System.out.println(!(8 < 5));
    true

if文


class Main {
  public static void main(String[] args) {
    int number = 12;
    
    if (number < 10) {
      System.out.println("10より小さい");
    } else if (number < 20) {
      System.out.println("10以上、20より小さい");
    } else {
      System.out.println("20以上");
    }
  }
}
10以上、20より小さい

switch文


条件分岐にはswitch文という構文もある。

switch文は下図のように記述し、

条件の値がcaseの値と一致するとき、処理が実行される。

switch文は構文が少し複雑。caseの後ろのコロン(:)などは

忘れがちなので注意。

class Main {
  public static void main(String[] args) {
    int number = 12;
    
    switch (number % 3) {
      case 0:
        System.out.println("3で割り切れる");
        break;
      case 1:
        System.out.println("3で割ると1余る");
        break;
      case 2:
        System.out.println("3で割ると2余る");
        break;
    }
  }
}
3で割り切れる

switch文default


switch文では、どのcaseとも一致しなかったときに実行する処理を

defaultに指定することができる。

class Main {
  public static void main(String[] args) {
    int number = 13;
    
    switch (number % 5) {
      case 0:
        System.out.println("大吉");
        break;
      case 1:
        System.out.println("中吉");
        break;
      case 4:
        System.out.println("凶");
        break;
      default:
        System.out.println("吉");
        break;
    }
  }
}
吉

繰り返し処理while文


class Main {
  public static void main(String[] args) {
    int number = 10;
    
    while (0 < number) {
      System.out.println(number);
      number --;
    }
  }
}
10
9
8
7
6
5
4
3
2
1

繰り返し処理for文


class Main {
  public static void main(String[] args) {
   
    for(int i = 1; i <= 10; i ++)
    System.out.println(i + "回目");
  }
}
1回目
2回目
3回目
4回目
5回目
6回目
7回目
8回目
9回目
10回目

breakとcontinue


break

繰り返し処理を終了するためには、

条件をfalseにする以外に、

breakを使って強制的に終了させる方法がある。

if文などの条件分岐と組み合わせることで、

任意の箇所で繰り返し処理を終了させることができる。

continue

繰り返し処理を終了するbreakと違い、

continueはその周の処理だけをスキップして、

次の周を実行することができる。

continueもif文などと組み合わせて利用するのが一般的。

class Main {
  public static void main(String[] args) {
    System.out.println("=== while文 ===");
    int i = 1;
    while (i < 10) {
      // iが5の倍数のとき、繰り返し処理を終了
      if (i % 5 == 0) {
        break;
      }
      
      System.out.println(i);
      i++;
    }
    
    System.out.println("=== for文 ===");
    for (int j = 1; j < 10; j++) {
      // jが3の倍数のとき、処理をスキップ
      if (j % 3 == 0) {
        continue;
      }
      
      System.out.println(j);
    }
  }
}
===while文===
1
2
3
4
===for文===
1
2
4
5
7
8

配列の変数定義


配列を扱う場合には、配列型の変数に配列を代入する。

配列型は、「int型の要素を持つ配列型」

「String型の要素を持つ配列型」という風に指定する。

int型の要素を持つ配列はint,

String型の要素を持つ配列はStringと記述。

class Main {
  public static void main(String[] args) {
    
    String[] names = {"本","音楽","いたずら"};
    
    System.out.println(names[0]);
    
    System.out.println(names[2]);
  }
} 
本
いたずら

配列のfor文とlengthメソッド


配列には、要素の数を数えるlengthという機能が備わっている。

lengthは、「配列.length」のようにドット(.)でつないで用いる。

lengthを用いれば、配列の要素数を気にする必要がなくなる。

class Main {
  public static void main(String[] args) {
    String[] names = {"本", "音楽", "いたずら"};
    
    for (int i = 0; i < names.length; i ++) {
      System.out.println("これは" + names[i] + "です");
    }
  }
}
これは本です
これは音楽です
これはいたずらです

拡張for文の文法


for文は配列用に特別な構文(拡張for文)を用意している。

これを使えば、先ほどのfor文をよりシンプルに書くことができる。

拡張for文はこのように記述する。

class Main {
  public static void main(String[] args) {
    String[] names = {"本", "音楽", "いたずら"};
    
    for (String name: names) {
      System.out.println("これは" + name + "です");
    }
  }
}
これは本です
これは音楽です
これはいたずらです

Java超初級【基礎編】

RubyからJavaを勉強をする事になったのでRubyとは違うなって

思ったとこをメモ


変数の定義・初期化


変数を使うには、まず変数を「定義」する必要がある

変数を定義することで値をいれる箱がつくらる

Javaで変数を定義するためには

①変数にいれる値のデータ型を指定する

②変数の名前を決める、という2つが必要。

整数
int number = 3;
少数
double number = 3.14;
文字列
String text = "Hello World";

変数の注意点


変数にはいくつか決まりがある

変数名は基本的に自由に決めらるが、

Javaでは下図のような決まりがある。

「userName」のように2語以上の変数名を使うときは、

単語の始めを大文字にして区切る。

この記述法をキャメルケースと呼ぶ。 f:id:muuuuukun:20181230205733p:plain


型変換について


「+」などの操作は同じデータ型同士でないとできない。

よって型の違うものを演算するときは、

型を変換し同じ型にしてる。

Javaではこの型変換の方法として、

自動の変換と手動の変換がある。

まずは自動型変換を学ぶ。

下図のようにString型とint型を足すと、

int型が自動でString型に変換され、

文字列の結合が行われる。

System.out.println("中村さんは" + 32 + "才です");

32はint型だがString型に変換される
中村さんは32才です

数値の計算の注意点


int型同士の計算は、結果もint型になり、

double型同士の計算は、結果もdouble型になる。

int型の5をint型の2で割ると、結果は「2.5」ではなく

「2」となることに注意する。

System.out.println(5 / 2);
↓
2
System.out.println(5.0 / 2.0);
↓
2.5

キャスト


強制的に型変換を行う事をキャストと呼び、

(変換したいデータ型)値とする。

int型同士の値から、最終的にdouble型の計算結果を得たい場合、

どちらか一つをキャストしてあげる。

int number1 = 13;
int number2 = 4;
System.out.println((double)number1 / number2);
↓
3.25


Ruby On RailsでherokuとLINE Message APIで名言ボットを作る

学ぶ事がいっぱいでしっかりアウトプットをしながら進めて行きたかったから

ボリュームがあるので小分けにしてアウトプットしてます

この記事の以前の進捗はこの記事を参照

muuuuukun.hatenablog.com

早めにアウトプットしたのでタスク名とか

アクション名とか細かな設定は変更してます。


10分間隔で通知が出来る様になったから次は

DBに名言と名言を発信した方の写真を保存をして

保存したのをランダムで取得して出力をしていくまでのメモ!

データベースを事前に作成する


$ rails db:create

development.sqlite3とtest.sqlite3が作成される

モデルクラスを作成する

$ rails g model Post content:text image:text

マイグレーションの実行

$ rails db:migrate

データベース用コンソールを起動

$ rails dbconsole

テーブルが作成されていることを確認

sqlite> .table

テーブル構造を確認

sqlite> .schema テーブル名

引数を省略するとデータベースにある全てのテーブルを確認できる


db/seeds.rbに初期データを追加する

Post.create(:id => 1, :content => 'しっかりと

準備もしていないのに

目標を語る資格はない。

by イチロー', :image => 'https://trend-comment.com/wp-content/uploads/2013/08/A5A4A5C1A5EDA1BCA3B2.jpg')
Post.create(:id => 2, :content => 'やってみて

「ダメだ」とわかったことと

はじめから

「ダメだ」と言われたことは

違います。

by イチロー', :image => 'https://trend-comment.com/wp-content/uploads/2013/08/A5A4A5C1A5EDA1BCA3B2.jpg')

この時名言を1行で書くとlineで送られてくる時に

文がバラけた感じで送られてくるからこの様に記述した

けどもっと良い方法があるかもしれないからもっと

DBの勉強をしなくては!

そしてシードデータに投入する

$ rake db:seed

これでローカルの(SQLite3)に初期データを保存出来た!


webhookcontrollerを編集

meigendayoアクションでcontentカラムとimageカラムを

取得して、それをランダムに出力出来る様に記述

そしてhashで、DBから取り出したら配列になっているから

LINEドキュメントをのコードを参考にして、contentとimageを振り分ける

class WebhookController < ApplicationController
  require 'line/bot'

  def meigendayo
    number = (1..229).to_a
    number2 = number.sample
    meigen = Post.pluck(:content, :image)
    meigen2 = meigen[number2]
    hash = {"1" => meigen2[0], "2" => meigen2[1]}

    message = {
              "type": "text",
              "text": hash["1"]
            },
            {
            "type": "image",
            "originalContentUrl": hash["2"],
            "previewImageUrl": hash["2"]
    }
    client = Line::Bot::Client.new { |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    }
    response = client.push_message(ENV["LINE_USER_ID"], message)
  end
end

herokuにDBのテーブルを作る

訳あってローカルでSQLite3で本番でpostgresになっちゃったから

次は本番のpostgresにテーブルを作る

めんどくさい事になったけどDBを二つ使う事により

DBの良い勉強になったし、理解も深められたから

結果二つのDBで作業をして良かったって思う!

まずはマイグレーションの実行

$ heroku run rake db:migrate

そしてseedsファイルに記載されている情報をDBに追加

$ heroku run rake db:seed

そしてDBの確認

$ heroku pg:psql -a herokuのアプリ名

テーブルの確認

DATABASE=> select * from posts;

これでズラーッとDBに保存された内容が出たら成功!!

試しに

$ heroku run rake reminder_task:meigen

をしたらしっかりと名言と写真が送られてきました!

そして

$ git add .
$ git commit -m "~~~"
$ git push heroku master

こんな感じでLINEから名言と写真が送られてきました(☝︎ ՞ਊ ՞)☝︎

f:id:muuuuukun:20181229150200p:plain