20200727のJavaに関する記事は17件です。

宇宙船のコンピュータの整数演算ユニット作成し、船員を助けよう!

宇宙船のコンピュータの整数演算ユニット作成し、船員を助けよう!!

illustrain09-utyuu5.png

問題

以下の入力の場合、実装して、出力の配列[0]の値を示せ。

入力

[1,1,28,3,1,1,2,3,1,3,4,3,1,5,0,3,2,9,1,19,1,9,19,23,1,23,5,27,2,27,10,31,1,6,31,35,1,6,35,39,2,9,39,43,1,6,43,47,1,47,5,51,1,51,13,55,1,55,13,59,1,59,5,63,2,63,6,67,1,5,67,71,1,71,13,75,1,10,75,79,2,79,6,83,2,9,83,87,1,5,87,91,1,91,5,95,2,9,95,99,1,6,99,103,1,9,103,107,2,9,107,111,1,111,6,115,2,9,115,119,1,119,6,123,1,123,9,127,2,127,13,131,1,131,9,135,1,10,135,139,2,139,10,143,1,143,5,147,2,147,6,151,1,151,5,155,1,2,155,159,1,6,159,0,99,2,0,14,0];

出力

入力配列が同じサイズの配列

入力:[1,0,0,0,99] 。出力: [2,0,0,0,99]    原因 (1 + 1 = 2).
入力:[2,3,0,3,99]。出力:[2,3,0,6,99]       原因(3 * 2 = 6).
入力:[2,4,4,5,99,0]。出力:[2,4,4,5,99,9801]  原因(99 * 99 = 9801).
入力:[1,1,1,4,99,5,6,0,99] 。出力:[30,1,1,4,2,5,6,0,99]
制約

なし。言語は限らない。

ボーナス

出力配列[0]が19690720となる場合の入力配列[1]と[2]の値は何番でしょう。
取りうる範囲は0~99とする。

回答

回答例1(JavaScript)
const intCodeComputer = (intCode=[99]) => {
   for(let i=0; i<intCode.length; i+=4){
       if(intCode[i] === 99) return intCode;
       switch(intCode[i]) {
           case 1:
               intCode[intCode[i+3]] = intCode[intCode[i+1]] + intCode[intCode[i+2]];
               break;
           case 2:
               intCode[intCode[i+3]] = intCode[intCode[i+1]] * intCode[intCode[i+2]];
               break;
           default: break;
       }
   }
};

const answer = intCodeComputer([...PUZZLE_INPUT]);
console.log(answer[0]);
回答例2(C#)
static void Main(string[] args)
{
   Console.WriteLine(string.Join(',', OperationRecursive(args, 0)));
}

private static int[] OperationRecursive(int[] sources, int step)
{
   int calc(Func<int, int, int> f, int x, int y) => f(x, y);

   var targets = sources.Skip(step * 4).Take(4).ToArray();

   if (targets[0] == 99)
       return sources;
   if (targets[0] == 1)
       sources.SetValue(calc((x, y) => x + y, sources[targets[1]], sources[targets[2]]), targets[3]);
   if (targets[0] == 2)
       sources.SetValue(calc((x, y) => x * y, sources[targets[1]], sources[targets[2]]), targets[3]);

   return OperationRecursive(sources, step + 1);
}
回答例3(GO)
func main() {
 numlist := []int{}
 for i := 0; i < len(numlist); i += 4 {
   var a = numlist[i+1]
   var b = numlist[i+2]
   var c = numlist[i+3]

   if numlist[i] == 1 {
     var d = numlist[a] + numlist[b]
     numlist[c] = d
   }

   if numlist[i] == 2 {
     var d = numlist[a] * numlist[b]
     numlist[c] = d
   }

   if numlist[i] == 99 {
     break
   }
 }
 fmt.Println(numlist[0])
}
回答例4(Java)
public class Main {
   public static void main(String[] args) {
       int [] arrayCode = {};
       for(int i=0;i<arrayCode.length; i+=4)
       {
           if(arrayCode[i]==99){
               break;
           }

           if(arrayCode[i]==1)
           {
               arrayCode[arrayCode[i+3]] = arrayCode[arrayCode[i+1]] + arrayCode[arrayCode[i+2]];
           }
           else if(arrayCode[i]==2)
           {
             arrayCode[arrayCode[i+3]] = arrayCode[arrayCode[i+1]] * arrayCode[arrayCode[i+2]];
           }
       }
       System.out.print(arrayCode[0]);
   }
}
回答例5(Perl)
my @array = (1,0,0,0,99);

sub calc {
   my @array = @_;
   my $length = @array;

   for (my $i = 0; $i < $length; $i+=4) {
       ($array[$i] == 99) && (last);

        if ($array[$i] == 1) {
            $array[$array[$i+3]] = $array[$array[$i+1]] + $array[$array[$i+2]]
        } elsif ($array[$i] == 2) {
           $array[$array[$i+3]] = $array[$array[$i+1]] * $array[$array[$i+2]]
        }
   }
   return $array[0];
}

$result = &calc(@array);

print "$result";
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

YouTube Analytics APIでcom.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found

YouTube Analytics API Java サンプルコードが動かない問題

YouTubeで使えるAPIには、以下の三種類がある。

  • YouTube Data API
  • YouTube Analytics API
  • YouTube Reporting API

それぞれのAPIについての説明は省くが、サンプルコードが公開されている。
その中にあるJavaのAnalytics APIのサンプルを動かそうとすると以下のエラーになったため、これの解決法をまとめておく。
YouTubeAnalyticsReports.java

Result
Default Channel: ( xxxxxxxxxxxxxxxxxxx )

IOException: 404 Not Found
Not Found
com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
Not Found
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.api.services.samples.youtube.cmdline.analytics.YouTubeAnalyticsReports.executeViewsOverTimeQuery(YouTubeAnalyticsReports.java:134)
at com.google.api.services.samples.youtube.cmdline.analytics.YouTubeAnalyticsReports.main(YouTubeAnalyticsReports.java:103)

解決法

APIのバージョンをV2にする。
Google ConsoleからAPIのスコープの設定やclient_secrets.jsonの設定などをしたにも関わらず上記のエラーが出るのは、APIのバージョンが古い。

サンプルコードでは、Analytics API V1が使われているが、なぜかV1が使えず、V2にしたら動いたので、V2を使う。
googleにプルリクを出してみた。
https://github.com/youtube/api-samples/pull/292

pom.xml

pom.xmlを以下のように修正する。
Line:14

- <project.youtube.version>v3-rev182-1.22.0</project.youtube.version>
- <project.youtube.analytics.version>v1-rev63-1.22.0</project.youtube.analytics.version>
- <project.youtube.reporting.version>v1-rev10-1.22.0</project.youtube.reporting.version>
- <project.http.version>1.20.0</project.http.version>
- <project.oauth.version>1.20.0</project.oauth.version>
+ <project.youtube.version>v3-rev222-1.25.0</project.youtube.version>
+ <project.youtube.analytics.version>v2-rev272-1.25.0</project.youtube.analytics.version>
+ <project.youtube.reporting.version>v1-rev748-1.25.0</project.youtube.reporting.version>
+ <project.http.version>1.36.0</project.http.version>
+ <project.oauth.version>1.31.0</project.oauth.version>

YouTubeAnalyticsReports.java

YouTubeAnalyticsReports.javaを以下のように修正する
Line:12

- import com.google.api.services.youtubeAnalytics.YouTubeAnalytics;
- import com.google.api.services.youtubeAnalytics.model.ResultTable;
- import com.google.api.services.youtubeAnalytics.model.ResultTable.ColumnHeaders;
+ import com.google.api.services.youtubeAnalytics.v2.YouTubeAnalytics;
+ import com.google.api.services.youtubeAnalytics.v2.model.QueryResponse;
+ import com.google.api.services.youtubeAnalytics.v2.model.ResultTableColumnHeader;

Line:124

- private static ResultTable executeViewsOverTimeQuery(YouTubeAnalytics analytics,
                                                         String id) throws IOException {
+ private static QueryResponse executeViewsOverTimeQuery(YouTubeAnalytics analytics,
                                                           String id) throws IOException {

Line:128

- .query("channel==" + id,     // channel id
-         "2012-01-01",         // Start date.
-         "2012-01-14",         // End date.
-         "views,uniques")      // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("views")
+ .setStartDate("2020-01-01")
+ .setEndDate("2020-12-31")

Line:145

- private static ResultTable executeTopVideosQuery(YouTubeAnalytics analytics,
+ private static QueryResponse executeTopVideosQuery(YouTubeAnalytics analytics,

Line:149

- .query("channel==" + id,                          // channel id
-         "2012-01-01",                              // Start date.
-         "2012-08-14",                              // End date.
-         "views,subscribersGained,subscribersLost") // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("views,subscribersGained,subscribersLost")
+ .setStartDate("2019-01-01")
+ .setEndDate("2020-12-31")

Line:167

- private static ResultTable executeDemographicsQuery(YouTubeAnalytics analytics,
+ private static QueryResponse executeDemographicsQuery(YouTubeAnalytics analytics,

Line:170

- .query("channel==" + id,     // channel id
-         "2007-01-01",         // Start date.
-         "2012-08-14",         // End date.
-         "viewerPercentage")   // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("viewerPercentage")
+ .setStartDate("2020-01-01")
+ .setEndDate("2020-12-31")

Line:187

- private static void printData(PrintStream writer, String title, ResultTable results) {
+ private static void printData(PrintStream writer, String title, QueryResponse results) {

Line:194

- for (ColumnHeaders header : results.getColumnHeaders()) {
+ for (ResultTableColumnHeader header : results.getColumnHeaders()) {

Line:202

- ColumnHeaders header = results.getColumnHeaders().get(colNum);
+ ResultTableColumnHeader header = results.getColumnHeaders().get(colNum);

これで実行すると取得できるようになった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Processing】Perlinノイズは逆向きに戻れない?

結果

2020-07-27 (3).png
Perlinノイズに沿って動いた後のパーティクルの位置から、スタート位置を調べたいと思ったのですが、できないような気がしたので確かめてみました。普通に後ろ向きに進んだだけでは同じ位置に戻れないようです。良い方法があれば、コメントにてお願いします。

コード

https://gist.github.com/Nekodigi/8f5a1dea37d738130a637de91f56368c

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【java】条件分岐って言ったらif文だけど、条件演算子っていうのもあるんですね

はじめに

エンジニア未経験(34歳)の僕が、エンジニアとして転職。
その転職先でjavaシルバーの資格をとりましょう。と言われたので、その学習メモです。
(もともとjavaは学びたい言語だったのでめちゃくちゃ丁度良い)
なので、記事の内容は本当に基本のキです。
と、同時に誤りがあれば遠慮なくツッコミいただけると幸いです・・・・m(_ _)m

条件分岐って言ったらアレのことでしょ?

今まで(の僕)

僕「プログラミングをする上で、条件によって処理を分岐させたい時にどうすればいいんだろう・・・?」
もう一人の僕「決まってるぜ相棒。ここはif文switch文だぜ!」

if文の場合

もう一人の僕「リバースカード発動!『条件分岐 if文』!このカードは条件式で処理した結果がtrueかfalseとして判定される!trueの場合は条件式直後の{}の中の処理。falseの場合はelse直後の{}の中が実行される!」

if文.java
if(条件式){
   trueの処理;
}else{
   falseの処理;
}

もう一人の僕「ただし、if文は条件式のあとの{}を省略することもできる!その場合、条件式の結果がtrueだった時、そのあとに続く1行がtrueの処理として判断されるっ!!」

if文その2.java
if(条件式)
trueの処理;
trueだろうがfalseだろうが走る処理;

switch文

もう一人の僕「リバースカード発動!『条件分岐 switch文』!このカードh(略」

switch文.java
switch(){
 case 定数:
   ケースに該当した処理;
   break;
 case 定数:
   ケースに該当した処理;
   break;
}

条件演算子というものもある(ここが本題)

そんなこんなでドヤってたんですけど、条件演算子というものもあるみたいですね。
条件演算子は三つの項目から成るので、三項演算子というのに分類されるそうな。

構文

条件式 ? 式1 : 式2 ;

なんだか見慣れませんね・・・(動揺)
条件式の結果がtrueだった場合は、式1を実行。条件式の結果がfalseだった場合は、式2を実行するみたいです。

実際に使ってみる

早速使ってみました。
プログラムの内容としてはこんな感じ。

  1. コマンドラインでjavaを実行する時に引数で文字列を渡してあげる。
  2. それが"test"という文字列と一致しているかどうかを確認する(今回の本題、条件演算子:ソースコード6行目)  一致していれば、str(インプットされた値と"test"は)という変数に"一致してますよ"の文字列を結合  一致していなければ、str(インプットされた値と"test"は)という変数に"一致してませんよ"の文字列を結合
  3. 7行目で結合したstrをコンソールに出力
条件演算子のサンプル.java
public class Sample{
    public static void main(String[] args){
        String inputString = args[0];
        System.out.println("inputStringは" + inputString);
        String str = "インプットされた値と\"test\"は";
        str += inputString.equals("test") ? "一致してますよ" : "一致してませんよ";
        System.out.println(str);
    }
}
/*
 → コマンドラインで test を渡して実行すると「インプットされた値と"test"は一致してますよ」と表示される
*/

使い所としては、簡単な条件式に限定されますかね?
「if文を使って何行にもかけて記述するほどのものですかね?この条件。」ってレベルのものはこれで書いてあげるとソースコードが短くなってスッキリしますよね

さいごに

本当に、初歩の初歩だと思いますが、意外と初心者にとっては見慣れなかったり、そもそも引き出しが無かったりするので、まとめてみました。
何か誤りなどあれば、この記事を目にした人のためにも、僕の成長と自信のためにもご指摘いただけますと幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

@quantity

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】初心者のServlet理解-②

目次

  • はじめに
  • パラメーター(html)
  • サーブレット側
  • メソッド
    • setCharacterEncoding
    • getParameter
  • おわりに

はじめに

今回はServletを用いて、他htmlファイルからの値受け取りについてまとめます。
前回の「初心者のServlet理解①」のコードを引き継いでますので、コードをパッと見て「無理。」と思った方は一度戻って確認してみてください~

なお、本記事は
  ・「いまからJavaをやるよ~」
  ・「Javaやってるけどもっかい復習したいよ~」
人向けの雑な内容です。
筆者も鋭意学習中の身なので、内容の正確性は保証しませんが。。。
皆さんの学習の一助(自分の学習のメモ帳)になればと思います。

パラメーター(html)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>例題3</title>
</head>
<body>
    <div align="center">

        <!-- 宛先URL「sample」で、sample<form>タグ内の入力フォームの値を送信 -->
        <!-- methodに「get」ではなく「post」を指定して送信した場合、-->
        <!-- GET送信ではなく、POST送信が行われる-->
        <form action="sample" method="post" >

            <!-- テキストボックスに記述した文字列がパラメーター名「requestParam」の値に設定される-->
            <input type="text" name="requestParam" value="" >
            <input type="submit" name="button" value="送信" >
        </form>
    </div>
</body>
</html>

こんな感じのhtmlファイルのとき、
パラメーターとは、formタグ内のinputタグにあるnameとvalueの組み合わせのこと。
パラメーター名「requestParam」でパラメーター値「"(テキストボックスに入力した値)"」が取得できる。

サーブレット側

↑のhtmlファイル内のパラメータ[requestParam]の値を受け取るためのコードが↓。

package parameterPackage;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ParameterServlet extends HttpServlet {

    // GET送信を処理するにはdoGetメソッドが、
    // POST送信を処理するにはdoPostメソッドのオーバーライドが必要
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // HTTPリクエスト内の文字列を、文字コード「UTF-8」で読み込む(エンコード)
        request.setCharacterEncoding("UTF-8");
        // HTTPリクエストから「requestParam」のパラメータ値を取得
        String value = request.getParameter("requestParam");

        response.setContentType("text/html; charset=UTF-8");

        PrintWriter out = response.getWriter();

        // valueの値を出力
        out.println("<body>" + value + "</body>");

    }
}

メソッド

●setCharacterEncoding()

request.setCharacterEncoding("UTF-8");

HTTPリクエスト内のパラメータ値を、引数に指定した文字コードでエンコードする(読み込む)メソッド。
パラメータの値を日本語として指定する場合、正しく読み取ることができないらしい。(ServletはデフォルトでパラメータをASCIIコードとしか解釈しないため)ので、このメソッドで値を変換する必要がある。

●getParameter()

String value = request.getParameter("requestParam");

GET/POSTで送信(リクエスト)されたパラメータ値を読み取るためのメソッド。
サーブレットのdoGet()/doPost()メソッドの第1引数「HttpServletRequest」が、Httpリクエストに対応しているため、オブジェクトrequestを作成して読み込んでいる。

おわりに

これ系の知識って、調べ始めると「わからない単語をわからない単語で説明される」現象が普通に起きててかなり困る。
「正確な知識も大事だけど、最初はイメージをつかむことが大事かな~」
とか初心者なりに考えているとことでした。

では。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】初心者のServlet理解-①

目次

  • はじめに
  • Servlet(サーブレット)って何?
  • クラス宣言
  • 主なメソッド
    • doGet(), doPost()
    • getWriter()
    • setContentType()
  • 例外
  • おわりに

はじめに

本記事は
  ・「いまからJavaをやるよ~」
  ・「Javaやってるけどもっかい復習したいよ~」
人向けの雑な内容です。
筆者も鋭意学習中の身なので、内容の正確性は保証しませんが。。。
皆さんの学習の一助(自分の学習のメモ帳)になればと思います。

Servlet(サーブレット)って何?

一言でいうと、「サーバサイドで動くJavaのプログラム」のこと。

・通常のクラスファイル
   →ローカルの環境下でのファイルのやり取り
・Servletクラスファイル
    →HTTPリクエストに応じた処理をサーブレットが行い、レスポンスとして出力する
のイメージ。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    // GET送信が行われたHTTPリクエストに対し、返却するHTTPレスポンスを設定するメソッド
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // HTTPレスポンスとして返却するファイルの形式を「html」に、
        // 文字セットを「UTF-8」に指定
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<body>HelloServlet</body>");

    }
}

クラス宣言

ServletはHttpServletクラスの継承クラスとして作成

public class HelloServlet extends HttpServlet{
}

主なメソッド

●doGet(), doPost();

public void doGet[doPost](HttpServletRequest request, HttpServletResponse){
}

Get/Postのリクエストに対し、HTTPレスポンスを返すメソッド。
第1引数がHTTPリクエスト,第2引数がHTTPレスポンスに対応している。

●setContentType()
response.setContentType("text/html; charset=UTF-8");

HTTPレスポンスとして出力するファイルの「形式」と「文字コード」を指定するメソッド。
設定した値がhtmlヘッダのContent-Typeへ反映される

●getWriter()
PrintWriter out = response.getWriter();

出力用のストリームを取得するメソッド
PrintWriterクラスをoutオブジェクトとして作成することで、println()などのPrintWriterクラスメソッドを使用できるようにする
※ここでprintln()した内容はhtmlファイルとして書き込まれる。

例外

発生する例外は下記の2つ

  • IOException
  • ServletException

サーブレットクラスは単体では運用せず、他メインクラスからの呼び出しによって操作することが多いため(?)例外は呼び出し元のクラスへthrowsする。

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
}

おわりに

つたない文章/わかりづらい構成でつらい...
もっと伝わる文章を書けるようになりたいっすね。
徐々に改善していけるように投稿頑張るぞ~~

では。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java JDK14でプレビュー追加されたRecordsについて

はじめに

Javaも早いもので、もうすぐJDK15がリリースされます!(2020年9月予定)
ただ、その一つ前のJDK14も、あまりキャッチアップできていないのが正直なところでした・・・。
色々と調べていて、 Records という概念がJDK14でPreview版リリースされたことを知ったので、ちょっと記事を書いてみました。

※ Preview版ということで、JDK15以降ではまた形が変わるかもしれません。予めご了承ください。

Recordsとは

下記です。
https://openjdk.java.net/jeps/359
データ保存用としてrecordが提供されるようになり、
これを付与したクラスは結果として変更不可能(immutable)なオブジェクトとなります。
具体的には下記のような形になります。

record Point(int x, int y) { }

上記は結果として以下のクラスとなります。

class Point extends Record {
  private final int x;
  private final int y;

  public Point(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int x() {
    return x;
  }
  public int y() {
    return y;
  }

  public int hashCode() { ... }
  public boolean equals() { ... }
  public String toString() { ... }
}

上記のように、コンストラクタ以外からフィールド変数にアクセスできず(immutable)、
equals hashCode toString のメソッドを実装したクラスが生成されます。

引数の値は、下記のようにチェック可能なようです。

record Point(int x, int y) {
  public Range {
    // yにx未満の値のみ設定可能とする場合
    if (x > y) throw IllegalArgumentException();
    // 下記のように明示的に設定しなくても、値の設定をしてくれる。
    // this.x = x;
    // this.y = y;
  }
}

所感

まだPreview版なので今後どのようになるのかは不明ではありますが、
DTOで用いたり、 Record を用いることで直感的に理解可能になったりするのではと思いました。
名前付きtupleである、という表現が個人的に一番しっくりきました。
より深く知りたい方は、下記の記事が非常によくわかりやすかったです。
https://www.infoq.com/jp/articles/java-14-feature-spotlight/

Javaもどんどん進化していきますね・・・。ちゃんとキャッチアップしていきます。
読んでいただきありがとうございました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Bootで書籍管理Webアプリを作ろう part1

はじめに

どうも、プログラミング勉強中の大学生、@Ikuto19です。今回は勉強がてらにJavaのSpring Bootを使った簡易的な書籍管理webアプリを作ろうと思います。
以前、JavaではなくPythonで作成したんですが個人的に納得のいかない点があったので、作り直そうを思いました。その納得がいかない点というのは下記のようなものです。

  • Pythonはサーバーサイド言語として不向き
  • 無料で自作アプリを公開したい

サーバーサイドのプログラミング言語として使われているのはRuby、Java、PHPの三つが多い気がします。ネットで調べてもこの三つどれかが使われているのが大半みたいです。(個人調べ)

Pythonはサーバーサイドではなく、AIやディープラーニングといったものやデータサイエンスが得意なプログラミング言語です。なのにwebアプリのサーバーサイド言語として使っても、あまり使わないのであれば勉強にならないと思ったので、今回はJavaで作り直すという考えに至ったわけです。あと無料で自作アプリを公開できないかな?と調べた結果、Herokuというサービスがあることを知ったのも理由の一つです。

もし、載せている情報が間違っていたり、説明不足があれば、気にせず指摘してくださって構いません。この記事は自分の勉強のためであり、僕と同じように躓いている人に向けたものです。ですので、よろしくお願い致します。

前提条件

  • macOS Catalina(バージョン10.15.5)
  • Eclipse Version: 2020-03
  • サーバーサイド言語: Java
  • フロントエンド言語: HTML、CSS、Javascript(jQuery)
  • データベース: MySQL(HerokuではclearDBというアドオンからMySQLを使用)
  • Webアプリケーションフレームワーク: Spring FrameworkのSpring boot
  • ビルドツール: maven
  • 書籍管理API: openBD
  • webアプリの公開サービス: heroku

各ツールやプロジェクトについて

Spring Frameworkについて

公式サイト → https://spring.io/
Spring FrameworkはJavaによる開発をスピーディーに安全に開発するためのフレームワークで、Springというふうに読んだりもするみたいです。このSpringは「DI:依存性注入」と「AOP:アスペクト指向プログラミング」を特徴にもっています。

mavenについて

公式サイト → https://maven.apache.org/
mavenは複数あるビルドツールうちの一つです。他にはGradleやAntがありますが、今回はHerokuに完成したアプリをデプロイするのでmavenを選びました。pom.xmlに依存関係を記述することで、いろんなパッケージを扱えるようになります。

openBDについて

公式サイト → https://openbd.jp/
このopenBDは書誌情報や表紙を誰でもアクセスできる無料のAPIです。
今回はjavascriptのjQueryでこのAPIを使って書籍情報にアクセスします。

herokuについて

公式サイト → https://jp.heroku.com/about
コンテナベースのクラウド型PaaSで、多数のプログラミング言語から選んでき、自作アプリをデプロイ・管理することができるサービス。

ツールの導入

インストール済みのeclipseへSpring プロジェクトをインストール

  1. eclipse起動後、ヘルプ > eclipse マーケットプレースからSpring Tools 4(aka Spring Tool Suite 4) 4.7.0.RELEASEをインストール
  2. 全てのチェックボックスにチェックしたまま、確認
  3. 「使用条件の条項に同意します」にチェックを入れて完了
  4. 「再起動しますか?」と聞かれるのでそのまま再起動する。

もし、セキュリティ警告で「信頼性または有効性を確立できない署名されていないソフトウェアをインストールします。インストールを続行しますか?」と表示されたら、インストールボタンをクリック。

Herokuへの登録およびクレカの登録

Herokuでアカウント作成

サインアップ → https://signup.heroku.com/login
1. 上記で必要項目を入力し、アカウント作成
2. 確認メールが来るので、クリックしてパスワードを設定

ここまでできていると、ダッシュボード画面になっていると思います。

MySQL利用のためにクレジットカードの登録

HerokuではデフォルトのデータベースがPostgreSQLなので、MySQLにする際はclearDBという無料のアドオンを追加する必要があります。ですが、そのためにはクレジットカードの登録をする必要があるので、登録します。

  1. ダッシュボード画面から右上端のアイコンからAccount settingsをクリック
  2. BillingタブからBilling Informationの「Add credit card」をクリック
  3. 必要項目を入力して、Save Detailsをクリック

テストアプリの作成・実行とherokuでの公開

テストアプリの作成

一応、作成手順を載せておきますが、GitHubにプロジェクトをあげているので、以下のコマンドダウンロードしてくださっても構いません。

terminal
$ git clone https://github.com/ikuto19/test-webapp.git
作成手順
  1. eclipse起動後、パッケージ・エクスプローラーで右クリック
  2. 新規 > プロジェクトをクリック
  3. Spring BootのSpring スターター・プロジェクトを選択し、「次へ」をクリック
  4. 名前を「webapp-test」、グループとパッケージを「com.app」にして、「次へ」をクリック
  5. 依存関係のテンプレート・エンジンからThymeleafとwebからSpring Webにチェックして、「完了」をクリック

プロジェクトの中身を確認すると、以下の画像のような構成になっていると思います。もし、templatesフォルダがなければ追加で作っておいてください。
スクリーンショット 2020-07-26 16.35.59.png

次に以下の構成で新規のファイルを作成または既存のファイルを削除します。
スクリーンショット 2020-07-27 13.38.23.png

各ファイルの中身は以下のように記述します。

App.java
package com.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
IndexController.java
package com.app.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String getIndexPage(Model model) {
        String message = "Hello, World!!";
        model.addAttribute("message",message);
        return "index";
    }
}
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<meta charset="UTF-8">
<head>
<title>テストアプリ</title>
</head>
<body>
    <p th:text="${message}"></p>
</body>
</html>
Procfile
web: java $JAVA_OPTS -jar target/*.jar --server.port=$PORT

実行確認

パッケージ・エクスプローラーのApp.javaを選択したまま右クリックで、実行 > Spring Bootアプリケーションをクリックして、実行。
webブラウザで http://localhost:8080/ にアクセスすると、下記のような画像が表示される。
スクリーンショット 2020-07-26 17.13.10.png

Herokuへデプロイ

以下のコマンドを順に実行
「heroku login」を実行後に何かキーを押すと、webブラウザにとばされるので、「Log IN」ボタンをクリック

terminal
$ brew tap heroku/brew && brew install heroku
$ heroku login

createコマンドで「Name test-webapp is already taken」のようなエラーが出る場合、アプリ名を変えてください。他の人に使われている見たいなので。僕はアプリ名を「test-webapp01」としました。

terminal
$ cd (eclipseのワークペースがあるパス)/webapp-test
$ git init
$ heroku create test-webapp01
$ git add .
$ git commit -m "first upload"
$ git push heroku master (もしくは git push -f heroku master)

スクリーンショット 2020-07-27 14.37.58.png
このようにBUILD SUCCESSと出ていると、成功していると思います。
以下コマンドで開いて確認してください。今回はここまでにします。

terminal
$ heroku open

終わりに

今回は書籍管理アプリを作るための準備とテストアプリの作成・公開しました。
コードの詳しい説明などは次回以降にやっていく予定で、いよいよ書籍管理アプリを作っていこうと思います。

次回へ続く > 近々投稿

参考サイト

EclipseでSpring Frameworkを利用してみる

Heroku初心者がHello, Herokuをしてみる

Heroku初心者がJavaで作成したWebアプリをGitHub連携でデプロイする時つまずいた4つのこと

SpringBootを使ってWebアプリを作るまでを丁寧に解説

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Bootで書籍管理Webアプリを作ろうpart1

はじめに

どうも、プログラミング勉強中の大学生、ikuto19です。今回は勉強がてらにJavaのSpring Bootを使った簡易的な書籍管理webアプリを作ろうと思います。
以前、JavaではなくPythonで作成したんですが個人的に納得のいかない点があったので、作り直そうを思いました。その納得がいかない点というのは下記のようなものです。

  • Pythonはサーバーサイド言語として不向き
  • 無料で自作アプリを公開したい

サーバーサイドのプログラミング言語として使われているのはRuby、Java、PHPの三つが多い気がします。ネットで調べてもこの三つどれかが使われているのが大半みたいです。(個人調べ)

Pythonはサーバーサイドではなく、AIやディープラーニングといったものやデータサイエンスが得意なプログラミング言語です。なのにwebアプリのサーバーサイド言語として使っても、あまり使わないのであれば勉強にならないと思ったので、今回はJavaで作り直すという考えに至ったわけです。あと無料で自作アプリを公開できないかな?と調べた結果、Herokuというサービスがあることを知ったのも理由の一つです。

もし、載せている情報が間違っていたり、説明不足があれば、気にせず指摘してくださって構いません。この記事は自分の勉強のためであり、僕と同じように躓いている人に向けたものです。ですので、よろしくお願い致します。

前提条件

  • macOS Catalina(バージョン10.15.5)
  • Eclipse Version: 2020-03
  • サーバーサイド言語: Java
  • フロントエンド言語: HTML、CSS、Javascript(jQuery)
  • データベース: MySQL(HerokuではclearDBというアドオンからMySQLを使用)
  • Webアプリケーションフレームワーク: Spring FrameworkのSpring boot
  • ビルドツール: maven
  • 書籍管理API: openBD
  • webアプリの公開サービス: heroku

各ツールやプロジェクトについて

Spring Frameworkについて

公式サイト → https://spring.io/
Spring FrameworkはJavaによる開発をスピーディーに安全に開発するためのフレームワークで、Springというふうに読んだりもするみたいです。このSpringは「DI:依存性注入」と「AOP:アスペクト指向プログラミング」を特徴にもっています。

mavenについて

公式サイト → https://maven.apache.org/
mavenは複数あるビルドツールうちの一つです。他にはGradleやAntがありますが、今回はHerokuに完成したアプリをデプロイするのでmavenを選びました。pom.xmlに依存関係を記述することで、いろんなパッケージを扱えるようになります。

openBDについて

公式サイト → https://openbd.jp/
このopenBDは書誌情報や表紙を誰でもアクセスできる無料のAPIです。
今回はjavascriptのjQueryでこのAPIを使って書籍情報にアクセスします。

herokuについて

公式サイト → https://jp.heroku.com/about
コンテナベースのクラウド型PaaSで、多数のプログラミング言語から選んでき、自作アプリをデプロイ・管理することができるサービス。

ツールの導入

インストール済みのeclipseへSpring プロジェクトをインストール

  1. eclipse起動後、ヘルプ > eclipse マーケットプレースからSpring Tools 4(aka Spring Tool Suite 4) 4.7.0.RELEASEをインストール
  2. 全てのチェックボックスにチェックしたまま、確認
  3. 「使用条件の条項に同意します」にチェックを入れて完了
  4. 「再起動しますか?」と聞かれるのでそのまま再起動する。

もし、セキュリティ警告で「信頼性または有効性を確立できない署名されていないソフトウェアをインストールします。インストールを続行しますか?」と表示されたら、インストールボタンをクリック。

Herokuへの登録およびクレカの登録

Herokuでアカウント作成

サインアップ → https://signup.heroku.com/login
1. 上記で必要項目を入力し、アカウント作成
2. 確認メールが来るので、クリックしてパスワードを設定

ここまでできていると、ダッシュボード画面になっていると思います。

MySQL利用のためにクレジットカードの登録

HerokuではデフォルトのデータベースがPostgreSQLなので、MySQLにする際はclearDBという無料のアドオンを追加する必要があります。ですが、そのためにはクレジットカードの登録をする必要があるので、登録します。

  1. ダッシュボード画面から右上端のアイコンからAccount settingsをクリック
  2. BillingタブからBilling Informationの「Add credit card」をクリック
  3. 必要項目を入力して、Save Detailsをクリック

テストアプリの作成・実行とherokuでの公開

テストアプリの作成

一応、作成手順を載せておきますが、GitHubにプロジェクトをあげているので、以下のコマンドダウンロードしてくださっても構いません。

terminal
$ git clone https://github.com/ikuto19/test-webapp.git
作成手順
  1. eclipse起動後、パッケージ・エクスプローラーで右クリック
  2. 新規 > プロジェクトをクリック
  3. Spring BootのSpring スターター・プロジェクトを選択し、「次へ」をクリック
  4. 名前を「webapp-test」、グループとパッケージを「com.app」にして、「次へ」をクリック
  5. 依存関係のテンプレート・エンジンからThymeleafとwebからSpring Webにチェックして、「完了」をクリック

プロジェクトの中身を確認すると、以下の画像のような構成になっていると思います。もし、templatesフォルダがなければ追加で作っておいてください。
スクリーンショット 2020-07-26 16.35.59.png

次に以下の構成で新規のファイルを作成または既存のファイルを削除します。
スクリーンショット 2020-07-27 13.38.23.png

各ファイルの中身は以下のように記述します。

App.java
package com.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
IndexController.java
package com.app.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String getIndexPage(Model model) {
        String message = "Hello, World!!";
        model.addAttribute("message",message);
        return "index";
    }
}
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<meta charset="UTF-8">
<head>
<title>テストアプリ</title>
</head>
<body>
    <p th:text="${message}"></p>
</body>
</html>
Procfile
web: java $JAVA_OPTS -jar target/*.jar --server.port=$PORT

実行確認

パッケージ・エクスプローラーのApp.javaを選択したまま右クリックで、実行 > Spring Bootアプリケーションをクリックして、実行。
webブラウザで http://localhost:8080/ にアクセスすると、下記のような画像が表示される。
スクリーンショット 2020-07-26 17.13.10.png

Herokuへデプロイ

以下のコマンドを順に実行
「heroku login」を実行後に何かキーを押すと、webブラウザにとばされるので、「Log IN」ボタンをクリック

terminal
$ brew tap heroku/brew && brew install heroku
$ heroku login

createコマンドで「Name test-webapp is already taken」のようなエラーが出る場合、アプリ名を変えてください。他の人に使われている見たいなので。僕はアプリ名を「test-webapp01」としました。

terminal
$ cd (eclipseのワークペースがあるパス)/webapp-test
$ git init
$ heroku create test-webapp01
$ git add .
$ git commit -m "first upload"
$ git push heroku master (もしくは git push -f heroku master)

スクリーンショット 2020-07-27 14.37.58.png
このようにBUILD SUCCESSと出ていると、成功していると思います。
以下コマンドで開いて確認してください。今回はここまでにします。

terminal
$ heroku open

終わりに

今回は書籍管理アプリを作るための準備とテストアプリの作成・公開しました。
コードの詳しい説明などは次回以降にやっていく予定で、いよいよ書籍管理アプリを作っていこうと思います。

次回へ続く > 近々投稿

参考サイト

EclipseでSpring Frameworkを利用してみる

Heroku初心者がHello, Herokuをしてみる

Heroku初心者がJavaで作成したWebアプリをGitHub連携でデプロイする時つまずいた4つのこと

SpringBootを使ってWebアプリを作るまでを丁寧に解説

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS にて Java のバージョンを alias で手軽に切り替える

設定

.zshrc などに環境変数 JAVA_HOME と PATH を設定するようなエイリアスを設定する。
インストール済みの Java Virtual Machine (JVM) 毎に設定する。

# AdoptOpenJDK 8
alias setjava8="export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home; export PATH=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin:$(echo ${PATH})"

# AdoptOpenJDK 11
alias setjava11="export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home; export PATH=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin:$(echo ${PATH})"

# AdoptOpenJDK 14
alias setjava14="export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home; export PATH=/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin:$(echo ${PATH})"

# Amazon Corretto 8
alias setcorretto8="export JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home; export PATH=/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home/bin:$(echo ${PATH})"

# Zulu OpenJDK 13
alias setzulu13="export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-13.jdk/Contents/Home; export PATH=/Library/Java/JavaVirtualMachines/zulu-13.jdk/Contents/Home/bin:$(echo ${PATH})"

Java のバージョンを切り替える

設定したエイリアス名を入力することで Java のバージョンを切り替えることができる。

$ setjava14

切り替えられているか環境変数と java -version を確認。

$ echo; echo JAVA_HOME=${JAVA_HOME}; echo; echo PATH=${PATH}; echo; echo 'java -version'; java -version

JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home

PATH=/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

java -version
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)

欠点

  • エイリアス設定時に環境変数 PATH が展開されるため、シェルを起動するたびにエイリアスで設定される PATH の長さが伸びることがある。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10からラズパイで実行するjavaFXプログラムをリモートデバッグする方法~環境構築からデバッグ実行まで②~

初めにGitHubのリポジトリを貼っておく
https://github.com/kamoshika9999/HelloRemote.git

ラズパイにjavaFXを導入する

※ラズパイは固定IP化しておく。当サイトでは例として192.168.9.112を使用するが読み替えてください
※ラズパイのログイン名/パスワードは初期設定を使用している。

1.ノーマルで入っているJDKはjava-11-openjdk-armfである。
 このバージョンはjavaFXが除外されている為以下の方法でカスタマイズされたJDKを導入する

cd /home/pi
wget https://download.bell-sw.com/java/13/bellsoft-jdk13-linux-arm32-vfp-hflt.deb
sudo apt-get install ./bellsoft-jdk13-linux-arm32-vfp-hflt.deb
sudo update-alternatives --config javac
sudo update-alternatives --config java

sambaの導入

1.本体ダウンロード&インストール

sudo apt-get install samaba

2.テキストエディタのnano起動

sudo nano /etc/samba/smb.conf

3.最終行に追記

[raspberry_pi]
comment = Share
path = /home/pi/samba
public = yes
read only = no
browsable = yes
force user = pi

4./home/piにsambaフォルダを作成

sudo mkdir /home/pi/samba

5.サービス起動 ※次回以降ラズパイ起動時にも自動起動される

sudo systemctl restart smbd

Window10側の設定

1.「Windowsの機能の有効化または無効化」から、「SMB 1.0/CIFDクライアント」にチェックを入れて再起動
image.png
2.エクスプローラーに\192.168.9.112と入力しraspberry_piフォルダが見えるか確認する
※ネットワーク上のフォルダはraspberry_piだがラズパイ本体からみるとsambaである点に注意しておく
image.png

Antビルド用xmlファイルを準備する

1.Eclipse パッケージエクスプローラーのHelloRemoteを右クリックし
「エクスポート」-[Java]-[実行可能JARファイル」-「次へ」
image.png
2.
 起動構成 Main-HelloRemote
エクスポート先 ラズパイのsambaフォルダ+ファイル名「fxtest.jara」 ※ファイル名は適当に決める
Antスクリプトとして保管にチェック
 ロケーションはプロジェクトのワークスペースと同一、ファイル名はbuild.xmlとしておく。
image.png
3.完了を押すと警告がでるが、そのままOK
image.png
4.パッケージエクスプローラーの空白を右クリックしリフレッシュ
image.png
5.build.xmlを右クリックし、次で開く-ANTエディタ
image.png

6.build.xmlを以下に順次変更
ファイルパスの部分は書き換えが必要です

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="remotedebug" name="Create Runnable Jar for Project HelloRemote">
    <!--this file was created by Eclipse Runnable JAR Export Wizard-->
    <!--ANT 1.7 is required                                        -->
    <!--define folder properties-->
    <property name="dir.buildfile" value="."/>
    <property name="dir.workspace" value="${dir.buildfile}/.."/>
    <property name="dir.jarfile" value="//192.168.9.112/raspberry_pi"/>

    <property name="raspberrypi" value="192.168.9.112" />
    <property name="raspberryfolder" value="/home/pi/samba" />
    <property name="username" value="pi" />
    <property name="password" value="raspberry" />

    <target name="create_run_jar">
        <jar destfile="${dir.jarfile}/fxtest.jar" filesetmanifest="mergewithoutmain">
            <manifest>
                <attribute name="Main-Class" value="application.Main"/>
                <attribute name="Class-Path" value="."/>
            </manifest>
            <fileset dir="${dir.buildfile}/bin"/>
            <zipfileset excludes="META-INF/*.SF" src="C:/OPENCV3/pleiades-4.8/pleiades/eclipse/plugins/org.eclipse.fx.ide.css.jfx8_3.3.0.201805280700.jar"/>
        </jar>
    </target>

    <target name="remotedebug" depends="create_run_jar">
        <echo>"Starting ${raspberrypi}:${raspberryfolder}/${jar.filename} in debug mode"</echo>
        <sshexec trust="true" host="${raspberrypi}" username="${username}" password="${password}" failonerror="true" usepty="true" command="DISPLAY=:0 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=*:4001,suspend=y -classpath ${raspberryfolder} -jar ${raspberryfolder}/fxtest.jar" />
    </target>
</project>

6-1.中身の解説
「default="remotedebug"」は最後に実行されるtargetを指定

<project default="remotedebug" name="Create Runnable Jar for Project HelloRemote">

「target name="remotedebug" depends="create_run_jar"」のdependsはこのtargetの前に実行されるtargetを指定
 つまり、先に実行可能jarファイルが作成されラズパイに配備される

<target name="remotedebug" depends="create_run_jar">

jshを使用してsshでコマンドを実行する部分
ポイントは2点 
DISPLAY=:0 この指定がないとなにも表示されない
address=*:4001 *:は任意のホストからアクセスという意味。4001はポート番号で空きがあれば当然変更できる

<sshexec trust="true" host="${raspberrypi}" username="${username}" password="${password}" failonerror="true" usepty="true" command="DISPLAY=:0 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=*:4001,suspend=y -classpath ${raspberryfolder} -jar ${raspberryfolder}/fxtest.jar" />
</target>

7.jschをクラスパスへ設定
ダウンロードする。スクロールしていくとリンクが見えてくる
image.png
image.png

7-1.jsch-0.1.55.jarをダウンロードし適用なフォルダに保存

7-2.HelloRemoteを右クリックしインポート
image.png
7-3.一般-ファイル・システムを選択し次へ
image.png
7-4.jsch-0.1.55.jarにチェックいれて完了
image.png
7-5.パッケージエクスプローラーにjsch-0.1.55.jarがあるとを確認する
image.png
7-6.build.xmlを右クリックし実行-外部ツールの構成
image.png
7-7.antビルドを選択した後に新規作成のアイコンをクリック
image.png
7-8.「クラスパス」タブのユーザ・エントリを選択し、JARの追加ボタンをクリック
image.png
7-9.ツリーを展開しjsck-0.1.55.jarを選択しOKボタン
image.png
7-10.クラスパスに追加される
image.png
8.Antビルドを実行
実行ボタンを押す。コンソールに以下の表示がでれば成功している
image.png
8-1.ソースを変更して2回目以降はアイコンから実行できる
image.png

ANTビルドを行うと、「ビルド→ラズパイに配備→リモートJVMでの待ち受け」まで一発で実行でき非常に便利
前置きが長いがこれをしておかないと、時間ロスが大きい
Mavenと連携する方法もあるが、またの機会とする

リモートデバッグを実行

1.HelloRemoteを右クリックし「デバッグ」-「デバッグの構成」
image.png
2.リモートJavaアプリケーションを選択し後、新規構成のアイコンをクリック
image.png
3.ホストにラズパイのIPアドレス
ポートにbuild.xml内で指定したポート番号
リモートVMの終了を許可にチェック
デバッグを実行
image.png
4.こんな感じで実行できる。
ラズパイ側にターミナルは表示されない
※強制的に出す方法をご存じの方、情報を求む!!
image.png
5.ブレークポイントのテスト
onTestBTメソッド内にブレークポイントを設定しButtonを押すとパースペクティブがデバッグに切り替わり一時停止することを確認する
image.png

次回の予定

ラズパイのGPIO制御について解説する
主にPI4Jの使い方

2020.0727 kamoshika
当記事と全く関係ないが....主のチャンネルのリンクを貼っておく
https://www.youtube.com/channel/UCbtzwsQhTuUzW3ERoBSYZDw/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Eclipseでデバック中にJavaのコードを実行するのに使うViewはDebug Shell

つまんないことだけど・・・Viewの名前がわからなくなってすごく探したので。

  1. [Window] > [Show View] > [Other...]でダイアログを表示する
    • image.png
  2. [Debug] > [Debug Shell]でViewが表示される
    • image.png
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HashMapクラスとHashSetクラス

HashMapクラス

HashMapは、キーと値をセットにした要素の集まりを管理できるコレクションです。

下記は、元素名と原子番号をセットにして出力させてます。

import java.util.HashMap; // インポート

public class Sample {
  public static void main(String[] args){
    // キーは文字列、値は整数
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    String atom[] = {"水素", "ヘリウム", "リチウム", "ベリリウム"};
    map.put(atom[0], 1); // .put()でデータを格納
    map.put(atom[1], 2);
    map.put(atom[2], 3);
    map.put(atom[3], 4);
    System.out.println("---原子番号---");
    for(String s:atom){
      System.out.println(s + "は" + map.get(s) + "番"); // .get()で値を取得
    }
  }
}
---原子番号---
水素は1番
ヘリウムは2番
リチウムは3番
ベリリウムは4番

主なメソッド

メソッド 機能
get() 指定したキーの要素を返す。
put() キーと要素を対応させます。
remove() 指定したキーの要素を削除します。
clear() すべてのキーと要素を消去します。
containsKey() 指定したキーの値が存在すれば、true、なければfalseを返します。
isEmpty() 要素がなければ、trueを返します。
size() 要素数を返します。

HashSetクラス

HashSetは、重複なくデータを格納できるコレクションです。

下記は、APPLEを一文字ずつ格納し、出力しています。

import java.util.HashSet;

public class Sample {
  public static void main(String[] args){
    HashSet<String> hs = new HashSet<String>(); // String型で生成
    hs.add("A"); //.add()でデータを格納
    hs.add("P");
    hs.add("P");
    hs.add("L");
    hs.add("E");
    for(String s:hs){ // 特殊for文で全て表示
        System.out.println(s);
    }
  }
}

Pを2つ格納し、重複が起きたので一回しか出力されない。

P
A
E
L

主なメソッド

メソッド 機能
add() 要素を追加します。
remove() 指定した要素を削除します。
clear() すべて要素を消去します。
contains 指定した要素が存在すれば、true、なければfalseを返します。
isEmpty() 要素がなければ、trueを返します。
size() 要素数を返します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Boot で実装した REST API に swagger-ui を導入する

概要

  • Spring Boot で REST API を実装している前提
  • API のドキュメントを生成する swagger-ui を導入する
  • gradle に io.springfox:springfox-boot-starter:3.0.0 を追加するだけ

サンプルプロジェクト

  • Spring Initializr で Spring Web を選択してプロジェクト新規作成
  • REST API を実装
    • src\main\java\com\example\demo\api\DemoController.java を以下内容で作成
package com.example.demo.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/api/demo")
public class DemoController {

    @GetMapping("/customers")
    public String[] customers() {
        return new String[] {
                "あいうえお",
                "かきくけこ",
                "さしすせそ"
        };
    }

    @GetMapping("/customer/{id}")
    public Map<String, String> customer(@PathVariable String id) {
        return Map.of(
                "id", id,
                "name", "名前",
                "address", "東京都");
    }
}

swagger-ui 導入

  • build.gradle に追加
build.gradle
    implementation "io.springfox:springfox-boot-starter:3.0.0"

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ArrayListクラス

通常の配列は、要素をいくつ格納するか決めてから使用します。

int r [] = new int[4]

r[0] = 88;
r[1] = 45;
r[2] = 34;
r[3] = 47;

しかし、予め要素数がわからないけど配列を使いたい場合に、Collection(コレクション)を使用します。

コレクションの一つとしてArrayListクラスの使用例

下記は、10未満の乱数を発生させ0が出るまでArrayListに格納する処理です。

import java.util.ArrayList; // インポートします。
import java.util.Random;

public class PracticeList {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<Integer>(); // 生成
    Random random = new Random();

    while(true){
      int randomValue = random.nextInt(10);
      if(randomValue == 0){
        break;
      }
      al.add(randomValue); // 0が出るまで一つ一つ格納
    }

    for (Integer n: al) { // 特殊for文で回し、一つ一つ表示
      System.out.print(n); // 出力結果例 : 234245...
    }

メソッドとしては、主に

add() -> 要素を追加 (上記例で使用)

size() -> 要素数の取得

remove() -> 指定した番号の要素を削除

isEmpty() -> リストに要素がない時、trueを返す

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

abstract(抽象クラス) と interface(インターフェイス)

abstract(抽象クラス)とは

抽象メソッドを一つ以上もつクラスのこと。

抽象メソッドとは、具体的な処理を記述せずに、引数やメソッド名の定義のみを宣言するメソッド。

抽象クラスの宣言.java
abstract class クラス名{}
抽象メソッドの宣言.java
abstract 戻り値の型 メソッド名(引数の型 引数名);

特徴

⭕️スーパークラスのメソッドをサブクラスでオーバーライド(書き換え)できる。

❌クラスの多重継承できない。

❌直でインスタンス化ができない。

interface(インターフェイス) とは

クラスに含まれるメソッドの具体的な処理を記述せずに、変数とメソッドの型のみを定義したもののこと。

インターフェイスの宣言.java
interface インターフェース名{}
インターフェイスの実装.java
class クラス名 implements インターフェース名{}

特徴

⭕️メソッドの型だけ先に記述し、使用直前に処理を記述できる。

⭕️インターフェイスの多重継承OK。

イメージ

抽象クラス

孫悟空(スーパークラス)が孫悟飯(サブクラス)、孫悟天(サブクラス)の複数名に孫という苗字を引き継げる。

また、悟飯が婿入りすれば苗字が鈴木へ書き換えられる(オーバーライド)。

インターフェイス

悟空からサイヤ人、チチから地球人という仕様を悟飯が引継ぎできる。

明確な遺伝子は、直前に決めれる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む