20201024のJavaに関する記事は6件です。

ラムダ、ソート、無名関数の例

import java.util.*;
import java.util.function.Predicate;
import java.util.Comparator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

// ソートのテスト
// https://techacademy.jp/magazine/34841
class Test1 {
public static void ソートテスト() {

    //小さい順
//  List<Integer> num1 = new ArrayList<>(Arrays.asList(100,35,72));

//     Collections.sort(num1);

//     for (Integer a : num1) {
//         System.out.println(a);//35 72 100
//     }

    List<Integer> num1 = new ArrayList<>(Arrays.asList(72,100,86));

    Collections.sort(num1,new java.util.Comparator<Integer>(){
        @Override
        public int compare(Integer i1,Integer i2) {

            System.out.println(i1);

            return i2 - i1;
        }
    });


    // for (Integer a : num1) {
    //     System.out.println(a); //100 72 35
    // }
}

}

public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
Test1.ソートテスト();

me test = new me();

    //その1 メソッドチェーンの話
    // つまりページの数のインデックス範囲をしぼりこみ
    // 一覧を作る例 100件5ページ目で10件ずつなら 50-60とか
    // 要素を取り出す取り出してリスト形式にする

    // showUserList = IntStream.range(0, allUserList.size())
    // .filter(index -> index >= (currentPage - 1) * showNumber && index < currentPage * showNumber)
    // .mapToObj(allUserList::get).collect(Collectors.toList());
  String 結果= test.test().substring(2,4);

  String 結果= test.test();


  System.out.println(結果);

  //その2 ラムダ式、無名関数の話
  //index -> index >= (currentPage - 1) * showNumber && index < currentPage * showNumber
  //ここの処理はメソッド渡しと言って、メソッドにメソッドそのものを渡す事が出来ます書き方はラムダ式、無名関数とも呼ばれます。

//   中身を書き直すと
//   ○○メソッドで引数がint型のarg変数で処理はargと1を比較するという意味です、全部省略するとこのような書き方になります
    boolean keltuka = test.test2(arg -> arg == 1);
    System.out.println(keltuka);

    //Comparatorインターフェースとは(compareToとは一致しているか調べるメソッドです)

// o1 < o2 なら -1

// o1 == o2 なら 0

// o1 > o2 なら -1
// Comparator c = (s1, s2) -> s1.compareTo(s2);
// System.out.println(c.compare("ABC", "ABC"));
}
}

class me{
public String test()
{
System.out.println("kazuki");
return "kazuki";
}

public boolean test2(Predicate<Integer> predicate)
{
    Integer argument = 1;

    if (predicate.test(argument)) {
        return true;
    } else {
        return false;
    }
}

}

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

google-java-formatの適用

はじめに

JavaCodeスタイルはたくさんありますが、
例えば:
Javaコーディング規約:https://future-architect.github.io/coding-standards/documents/forJava/Java%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84.html

Google Java Style:https://google.github.io/styleguide/javaguide.html

Codeのフォーマッタがあると便利だと思われます。

Google Java Styleに合わせたい

開発者はstyleの理解をしましたが、フォーマッタも自動化しないと漏れの可能性があります。
google-java-formatを適用すれば便利です。

google-java-formatとは

google-java-format is a program that reformats Java source code to comply with Google Java Style.

https://github.com/google/google-java-format

インストール方法

IntelliJ, Android Studio, and other JetBrains IDEs などPluginをインストールできます。

EclipseはJARファイルをダウンロードし、Eclipseのpluginsフォルダに配置した後、Eclipseを再起動
image.png

設定後、JAVAファイルを開いて、Ctrl + Shift + F でフォーマットできます。

以上

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

Java + Apache Batik で SVG のパスデータ (path 要素の d 属性) を描画する

概要

  • Apache Batik の Parser モジュールで SVG のパスデータ (path 要素の d 属性) フォーマットを解析して Shape オブジェクトを生成して描画処理をする

Apache Batik の Parser モジュール

Apache Batik の Parser モジュールは SVG を解析できる。
ただ、ドキュメントには Parser モジュールは一般的な開発には使うことを想定していないと書かれている (そのわりにはドキュメントがそれなりにちゃんと書かれている)。

Architecture overview

Finally, the Low level modules are used internally by the core modules to accomplish their work. These modules are not typically used by developers directly.

Parser module

SVG has a number of microsyntaxes that are used within attribute values, such as the transform attribute on SVGTransformable elements, and the path data d attribute on path elements. Since these are not trivial to parse, this functionality has been factored out into a separate package that can be used by other SVG-processing applications if needed.

Apache Batik の Parser モジュールを導入する build.gradle

Gradle 用の build.gradle を用意。

plugins {
  id 'java'
}

repositories {
  mavenCentral()
}

dependencies {
  // Apache Batik の Parser モジュールを導入
  // Batik SVG microsyntax parser
  // https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-parser
  implementation 'org.apache.xmlgraphics:batik-parser:1.13'
}

// サンプルコード PathDataDraw を実行するタスクを定義
task runPathDataDraw(type: JavaExec) {
  main = 'PathDataDraw'
  classpath = sourceSets.main.runtimeClasspath
}

// サンプルコード SVGPathDataDraw を実行するタスクを定義
task runSVGPathDataDraw(type: JavaExec) {
  main = 'SVGPathDataDraw'
  classpath = sourceSets.main.runtimeClasspath
}

パスデータを描画するサンプルコード

パスデータを文字列で用意しておいて、Apache Batik Parser で Shape オブジェクトを生成する。

import org.apache.batik.parser.AWTPathProducer;
import org.apache.batik.parser.PathParser;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PathDataDraw {

  public static void main(String[] args) throws IOException {

    // 描画先の画像オブジェクト
    BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = image.createGraphics();

    // 背景を白色で塗りつぶす
    g.setBackground(Color.WHITE);
    g.clearRect(0, 0, 500, 500);

    // 描画用のペン
    g.setStroke(new BasicStroke(5.0f));

    // 描画するパスデータのリスト
    // パスデータは SVG の path 要素の d 属性に指定するものと同等の文字列
    // path 要素の例: <path d="M 0,0 h 500 v 500 h -500 z" />
    String[] openedPathList = {
      "M 0,0 h 500 v 500 h -500 z", // 画像サイズと同じ正方形
      "M 30 30 C 40 140, 80 140, 100 110", // ベジェ曲線
      "M 30 80 C 120 10, 195 10, 285 80 S 450 150, 480 80", // ベジェ曲線
      "M 10 80 Q 52.5 10, 95 80 T 180 80", // ベジェ曲線
      "A 30 50 -45 0 1 215.1 109.9", // 円弧
    };
    // パスデータを描画
    g.setPaint(Color.RED);
    for (String path : openedPathList) {
      // パスデータを Shape オブジェクトに変換
      Shape shape = getShape(path);
      // パスデータを線として描画
      g.draw(shape);
    }

    // 描画するパスデータのリスト
    String[] closedPathList = {
      "M 100,200 h 200 v 100 h -200 z", // 長方形
      "M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z", // ハート
    };
    // パスデータを描画する
    for (String path : closedPathList) {
      // パスデータを Shape オブジェクトに変換
      Shape shape = getShape(path);
      // パスデータを面として描画 (塗りつぶし)
      g.setPaint(Color.GREEN);
      g.fill(shape);
      // パスデータを線として描画
      g.setPaint(Color.BLUE);
      g.draw(shape);
    }

    // 画像を PNG ファイルとして出力
    ImageIO.write(image, "png", new File("output.png"));
  }

  /**
   * パスデータを Shape オブジェクトに変換する。
   * @param d path 要素の d 属性に指定するものと同等の文字列
   * @return 形状を表すオブジェクト
   */
  private static Shape getShape(String d) {

    // d 属性値を解析するパーサー
    PathParser parser = new PathParser();

    // 解析結果を受け取って Shape を生成するオブジェクト
    // AWTPathProducer は PathHandler インターフェースを実装している
    AWTPathProducer producer = new AWTPathProducer();

    // パーサーに PathHandler を設定
    parser.setPathHandler(producer);

    // 解析処理を実施
    parser.parse(d);

    // Shape オブジェクトwp取得
    Shape shape = producer.getShape();

    return shape;
  }
}

SVG ファイルから path 要素の d 属性を抽出してパスデータを描画するサンプル

SVG ファイルから path 要素の d 属性を抽出し、そのパスデータを Apache Batik Parser で Shape オブジェクトに変換する。

import org.apache.batik.parser.AWTPathProducer;
import org.apache.batik.parser.PathParser;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.imageio.ImageIO;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Random;

public class SVGPathDataDraw {

  public static void main(String[] args) throws IOException, XPathExpressionException, ParserConfigurationException, SAXException {

    // SVG ファイルを読み込む
    String svgFile = "input.svg";
    Document doc;
    try (FileInputStream is = new FileInputStream(Paths.get(svgFile).toFile())) {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      doc = builder.parse(is);
    }

    // 描画先のオブジェクトを用意
    BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = image.createGraphics();

    Random r = new Random(); // 乱数発生機

    // SVG 文書から path 要素の d 属性を抜き出して描画
    XPath xpath = XPathFactory.newInstance().newXPath();
    NodeList nodelist = (NodeList) xpath.evaluate("//path/@d", doc, XPathConstants.NODESET);
    for (int i = 0; i < nodelist.getLength(); i++) {
      // d 属性の値を取得
      Attr attr = (Attr) nodelist.item(i);
      // d 属性の値を Shape オブジェクトに変換
      Shape shape = getShape(attr.getValue());
      // ランダムで描画色を決める
      g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
      // パスデータを描画
      g.draw(shape);
    }

    // 画像を PNG ファイルとして出力
    ImageIO.write(image, "png", new File("output.png"));
  }

  /**
   * パスデータを Shape オブジェクトに変換する。
   * @param d path 要素の d 属性に指定するものと同等の文字列
   * @return 形状を表すオブジェクト
   */
  private static Shape getShape(String d) {
    PathParser parser = new PathParser();
    AWTPathProducer producer = new AWTPathProducer();
    parser.setPathHandler(producer);
    parser.parse(d);
    return producer.getShape();
  }
}

参考資料

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

【Java】Spring Boot 基本からHello Worldまで

Springとは

Java開発におけるフレームワーク(=効率化tool)
ex:DBにアクセスするクラスなど

Springの全体図

spring.png

SpringBoot(≒スプリングフレームワーク)

  • Springフレームワークがベース(もともとJavaのフレームワーク)
  • 複数のライブラリの集合体。ビジネス系のApp作るために必要なものを網羅している
    • Spring MVC
    • Spring JDBC
    • Spring Security
    • Spring Data (JPA)
  • 複数のフレームワークを使用する際に設定をXMLでゴリゴリ書かなくても簡単に設定できるのがSpring Boot

Spring DI

  • DI :Dependency Injection(依存性の注入)
  • Spring DI =DIコンテナのこと
  • インスタンスの管理を行う
  • Springコア部分の機能を担う。Soring MVCなどはこの機能に沿っている。

Dependency Injectionとは

  • newという演算子でobject生成する方法
//Dateオブジェクトのインスタンスをtodayに代入
var today = new Date();
var day = today.getDate();
console.log("今日は"+ day +"日です");
  • これに対してDIではインスタンス変数(注入先の変数)に@Autowired(アノテーション)を付与 @Componentアノテーションのついたクラスの中から該当するクラスに対してオブジェクトを生成しインジェクトしてくれる(newしてインスタンスを突っ込んでくれる)
@Controller
public class ProductController {
    @Autowired
    private ProductService productService;
   //略
}
  • 良いソフトウェアコードの考え方に沿っている
    • 高凝集性(High Cohesion):責任範囲が明確
    • 疎結合性(Low Coupling):お互いに依存していない
  • new演算子を用いると密結合になってしまうが、 コンテナ(=第三者)にインジェクトしてもらうことで疎結合にすることができる!?

SpringBootでHello Worldを表示まで(IntelliJ + gradleを使用)

設定

  • Spring Initializr でProject SDKを指定(Java11)
  • ビルドシステム→Gradleを選択
  • Language→Javaを選択
  • Package→Jarを選択
    圧縮したままの状態で、Javaの実行環境で動かすことができる
  • Template Engines→Thymeleaf
  • Web→Spring Web
    どこのURLにエンドポイント持たせるかを適切にハンドリングしてくれるdependencies.png

フォルダ構成

  • build.gradle:グレードルのプロジェクトであることがわかる

    • group:成果物であるjarファイルの名前
    • source compatibility:Java11以降の環境で動く
    • dependencies ;使いたいライブラリを記述。ここに書くとリポジトリから勝手にとってきてくれる!?
  • src/main/java :配下にjavaのコード書くという決まり

  • src/main/resources/applications.propaties:ポートを簡単に変更できる

server.port=8081

クラス作成

  • src/main/java/com.example.demo上で、右クリック > New > Class 
  • Name: SampleController

demo1.png

//Springbootを動かす時に、URLを受け取り、index.htmlを返す
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class SampleController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Model model) {
        model.addAttribute("message", "Hello World!!");
        return "index";
    }
}

HTMLファイル作成

  • main/resources/templates > New > HTML File
  • Name: index.html

HTML.png

index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello World</title>
    <meta charset="utf-8" />
</head>
<body>
<h1>SpringBoot</h1>
<p>
    <span th:text="${message}"></span>
</p>
</body>
</html>

起動して完了!

  • main関数のエントリポイントとなる関数を選んでrunすると実行される
  • 右クリック > Run > DemoApplication
  • tomcatが勝手に動いて8080でportが開く
  • http://localhost:8080/ にアクセス 結果.png

(注)Portについて

  • Webアプリケーションでは8080ではなくhttps(=port443)を使用している
  • この仕組みはALB(アプリケーションロードバランサ)を使って実現
    • ALBでSSLTLS暗号化の処理をする
    • SSLオフロード(終端)で暗号化を解く
    • 後ろにある中で動いているVMやEC2を8080で受ける
  • 外からは8080って入れないけど中で動いているのは8080ということ spring3.png
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10でハードウェアシミュレータを拡大表示する

背景

『コンピュータシステムの理論と実装―モダンなコンピュータの作り方』のHardware Simulatorを使いたいが、表示が小さくて見づらかった。

image.png

やったこと

  1. スタートメニューから「javaw.exe」を検索
  2. 「javaw.exe」を右クリックし「プロパティ」
  3. 「互換性」タブ→「高DPI設定の変更」
  4. 『高いDPIスケールの動作を上書きします。』をチェックし、実行元に『システム(拡張)』を選択

image.png

結果

拡大できた~(〜*'▽')〜
image.png

参考

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

CloudFirestoreの簡単な使い方(Android)

はじめに

CloudFirestoreのAndroidでの基本的な使い方をメモ。
(導入から簡単なデータの送信受信など。)
使用言語はJava、開発環境はAndroidStudioを使用しています。
初投稿なので見にくい点が多々あると思いますがご了承を。

Firestoreについて

FirestoreはNoSQLデータベースです。
ファイル構造は画像の通りです。
コレクション内にドキュメントが入っていてその中のデータを使います。
ドキュメント内にサブコレクションを作成することも可能です。
structure-data.png

プロジェクトの作成、準備

Firebaseのホームページからプロジェクトを作成をクリックし、プロジェクトの追加をクリック好きな名前を設定しアナリティクスは有効、アカウントを選びプロジェクトを作成。
アプリは今回はAndroidなのでAndroidを選択。

Android アプリに Firebase を追加

手順1 アプリの登録
ここでの入力はAndroidパッケージのみで大丈夫です。
必要な場合はニックネームやSHA-1を記入。(今回は入力なし)
手順2 設定ファイルのダウンロード
google-services.jsonをダウンロードし
左上の表示方法をProjectに切り替えappにjsonファイルを導入
サイトの右の画像と同じ場所にjsonファイルが存在しているならOK
手順3 Firebase SDKの追加
サイトに表記されている内容をビルドグレイドルに追加。
サイトに表記されている内容とは別に以下の内容をアプリレベルのグレイドルに追加。

app
dependencies {
implementation 'com.google.firebase:firebase-core:17.0.0'
implementation 'com.google.firebase:firebase-firestore:20.0.0'
}

バージョンはこのサイト下の方の使用可能なライブラリから最新のものを調べて表記。

手順4 アプリを実行してインストールを確認
ここは終わらない場合があるためスキップで大丈夫です。
確認はアプリを実行し、logcatでI/FirebaseInitProvider: FirebaseApp initialization successfulが表示されていれば完了しています。
手順5 firestoreの作成
サイト左側タブのCloud Firestoreをクリックしてデータベースの作成
ルールは今回は本番環境モードを選択。
(テストモードは30日更新しないとアクセス拒否になります)
ロケーションは適当な場所を選びます。
そのままだとルールが厳しいため
write: if falseをwrite: if trueに変更します
53c13ab8b30c6ebcc4556a9541a4f954.png
以上で準備は完了です。

コード

送信・受信と他使えそうなコードを少し記述します。
Firestoreを確認しながら実行してみてください。

ドキュメントとコレクションの指定

以下の文で指定することができます。
指定したドキュメント/コレクションが存在しない場合データを保存する時に作成されます。

DocumentReference mDocRef = FirebaseFirestore.getInstance().document("コレクション名/ドキュメント名");

送信

まず初めに送信の処理のコードを紹介します。

Mapの保存

Map<String, Object> data = new HashMap<>();
       data.put("A","りんご");
       data.put("B","みかん");
       data.put("C","ぶどう");
        mDocRef.set(data);

リストの保存

ArrayList<String> group = new ArrayList<>();
        group.add("りんご");
        group.add("みかん");
        group.add("ぶどう");
        Map<String, Object> data = new HashMap<>();
        data.put("フィールド名",group);
        mDocRef.set(data);

受信

次にFirebaseの値を取得するときのコードを紹介します

Mapの取得

mDocRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document.exists()) {
                       //値が取得できた時の処理
                        String save = (String) document.get("フィールド名");//
                    } else {
                        //値が存在しなかった時の処理
                } else {
                    //取得に失敗した時の処理
                }

            }
        });

リストの取得

mDocRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document.exists()) {
                       //値が取得できた時の処理
                       ArrayList<String> group =  (ArrayList<String>) document.get("フィールド名");
                    } else {
                       //値が存在しなかった時の処理
                    }
                } else {
                    //値の取得に失敗した時の処理
                }

            }
        });

他によく使いそうなコード

次に使いそうなコードを記述します。

保存が成功・失敗した時の処理

データを送信する処理の後に記述します。

mDocRef.set(data).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    /// 保存が成功した時の処理
                } else {
                    /// 保存が失敗した時の処理
                }
            }
        });

値が変更された時の処理

起動時と値が変更された時に実行されます

mDocRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
                    @Override
                    public void onEvent(@Nullable DocumentSnapshot snapshot,
                                        @Nullable FirebaseFirestoreException e) {

                        if (snapshot != null && snapshot.exists()) {
                            Log.d("TAG", "Current data: " + snapshot.getData());
                            //変更されたときの処理
                        }
                    }
        });

さいごに

以上でFirestoreの使い方の紹介を終わります。
ありがとうございました。

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