20201006のJavaに関する記事は5件です。

【Java】データ型・文字列のクラスのチートシート

個人用メモにJavaのデータ型をメモりました。

とりあえず最初は

  • String(文字列)
  • int(整数)
  • double(小数点を含む数)

この三つは確実に抑える。

データ型・文字列のクラス

種類 型名 扱える範囲
整数型 int -2147483648 ~ 2147483647 までの整数
文字列クラス String "Java"、"自分"、"Mac" などの複数の文字
浮動小数点型 double ± 1.8 × 10308 ~ ± 3.4 × 10 - 324 さらに細かい数字
論理型 boolean true ( 真 ) or false ( 偽 ) 真偽知
文字型 char "あ" 、 "虹" などの一文字の文字列
整数型 short -32768 ~ 32767 までの整数
整数型 long -92223372036854775808 ~ 9223372036854775807 までの整数
整数型 byte -128 ~ 127 までの整数
浮動小数点型 float ± 3.4 × 1039 ~ ± 1.4 × 10 - 45 細かい数字
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Microsoft Azure SDK For SQL API of Azure Cosmos DB Service 4.6 を使ってみる

Azure CosmosDB Java SDK version 4.x が2020年に公開されております。

以下ドキュメントに使い方が公開されているのですが、最低限のHello Worldコードとしてはどうなるのかを作ってみました。
https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java-v4

pom.xml

<!-- https://mvnrepository.com/artifact/com.azure/azure-cosmos -->
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-cosmos</artifactId>
    <version>4.6.0</version>
</dependency>

接続に必要な情報はAzure Portalで取得できます。

image.png

package hello.cosmosdb;

import java.util.Iterator;

import com.azure.cosmos.CosmosClient;
import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosContainer;
import com.azure.cosmos.CosmosDatabase;
import com.azure.cosmos.models.CosmosQueryRequestOptions;
import com.azure.cosmos.util.CosmosPagedIterable;
import com.fasterxml.jackson.databind.JsonNode;

/**
 * 
 * https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java-v4
 * https://docs.microsoft.com/en-us/java/api/overview/azure/cosmos-readme?view=azure-java-stable
 * https://github.com/Azure-Samples/azure-cosmos-java-sql-api-samples/blob/367c796257feb37d2f8003a86fe51b0658fcf6ff/src/main/java/com/azure/cosmos/examples/queries/sync/QueriesQuickstart.java#L119
 * 
 * @author Hiroki Oya
 *
 */
public class HelloCosmosDbJavaSDK_V4 {

    private CosmosDatabase database;
    private CosmosContainer container;

    public void query() throws Exception {

        // [Azure Portal] - [your_cosmosdb] - [Keys] - [URI]
        String serviceEndpoint = "https://your_cosmosdb.documents.azure.com:443/";

        // [Azure Portal] - [your_cosmosdb] - [Keys] - [PRIMARY KEY | SECONDARY KEY]
        String key = "your_key_here";

        // [Azure Portal] - [your_cosmosdb] - [Data Explorer]
        String databaseId = "TEST";

        // [Azure Portal] - [your_cosmosdb] - [Data Explorer]
        String containerId = "container_for_test";

        String query = "SELECT * from c";

        CosmosClient client = new CosmosClientBuilder() //
                .endpoint(serviceEndpoint) //
                .key(key) //
                .buildClient();

        database = client.getDatabase(databaseId);
        container = database.getContainer(containerId);

        CosmosQueryRequestOptions options = new CosmosQueryRequestOptions();

        CosmosPagedIterable<JsonNode> page = container.queryItems(query, options, JsonNode.class);

        Iterator<JsonNode> it = page.iterator();

        while (it.hasNext()) {
            System.err.println(it.next());
        }

        client.close();

    }

    public static void main(String[] args) throws Exception {
        HelloCosmosDbJavaSDK_V4 h = new HelloCosmosDbJavaSDK_V4();
        h.query();
    }

}

Reference

Azure Cosmos DB Java SDK v4 for SQL API release notes and resources | Microsoft Docs
https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java-v4

Maven Repository: com.azure » azure-cosmos
https://mvnrepository.com/artifact/com.azure/azure-cosmos

Azure CosmosDB Client Library for Java | Microsoft Docs
https://docs.microsoft.com/en-us/java/api/overview/azure/cosmos-readme?view=azure-java-stable

azure-cosmos-java-sql-api-samples/QueriesQuickstart.java at 367c796257feb37d2f8003a86fe51b0658fcf6ff · Azure-Samples/azure-cosmos-java-sql-api-samples · GitHub
https://github.com/Azure-Samples/azure-cosmos-java-sql-api-samples/blob/367c796257feb37d2f8003a86fe51b0658fcf6ff/src/main/java/com/azure/cosmos/examples/queries/sync/QueriesQuickstart.java

Azure Cosmos DB Workshop - Querying in Azure Cosmos DB
https://cosmosdb.github.io/labs/dotnet/labs/03-querying_in_azure_cosmosdb.html

以上です。

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

Processing(Java)からSwiftで書いたプログラムを呼び出す

Processing を使ってユーティリティ系のソフトを作っていると、どうしてもかゆいところに手がとどかない(システム環境設定系とか)

Swiftで実装すればAPIを叩くのに苦労はしないが、
Java側で Runtime#exec とか ProcessBuilder を使うのはなんか違う気がするので、
どうにかしてして、Javaで実装されたメソッドのようにSwiftで実装した関数を叩きたい!

JNA(Java Native Access)

Processingの実体はPAppletクラスを継承したJavaクラスであるため、
Javaの文法、資産を利用することができる

Javaには、JNI(Java Native Interface)と呼ばれる、C/C++などで実装されたネイティブコードと連携する仕組みがある。
このJNIを利用すれば、Swiftで実装したネイティブコードを呼び出されるのではと思うが、
このJavaとC/C++を繋ぐJNIを書くのがマヂ無理
(パッケージ名を含めた関数名をつけた関数をつくったり...)

※ Swiftの実装を呼び出すには結局SwiftとJavaの間にCのコードを挟まないといけない
Write & call Swift code using Java’s JNI
https://stackoverflow.com/questions/27628385/write-call-swift-code-using-java-s-jni

あー、Javaからネイティブコードを呼びたい
けど、JNIは書きたくない

そんなときは JNA(Java Native Access) を使おう
なんかよしなにやってくれるらしい!

JNAに関してはこのあたりを参照されたし
https://qiita.com/everylittle/items/b888cbec643f14de5ea6

Swiftのソースからダイナミックリンクライブラリを生成

兎にも角にも、Javaから呼び出したいメソッドを作ります

hello.swift
import Darwin.C

@_cdecl("hello")
public func hello() {
    print("Hello")
    fflush(stdout)
}

上のプログラムは標準出力に Hello と表示する関数の実装
ポイントは 1.呼び出し規約を設定する,2.publicにする です

fflush(stdout) がないとprintされないらしいので入れておきましょう
Printf from native code appears only at the end of the java app
https://stackoverrun.com/ja/q/3379588

このままではソースのままなのでコンパイルしましょう
上のプログラムからダイナミックリンクライブラリ(MacOSだとlib*.dylib)を生成します

ダイナミックリンクライブラリを生成
swiftc -emit-library hello.swift

ターミナルで上のコマンドを実行すると lib + ファイル名(拡張子なし) + .dylib
ダイナミックリンクライブラリが生成されます
image.png

nmコマンドで確認すると hello関数がグローバルセクションにあってなんか呼べそうな気がしてきますね

nmコマンドで確認
cha84rakanal$ nm libhello.dylib 
0000000000000e40 T _$S5helloAAyyF
                 U _$S6Darwin6stdoutSpySo7__sFILEVGvg
                 U _$SSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC
                 U _$SSSN
                 U _$Ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5
                 U _$Ss5print_9separator10terminatoryypd_S2StF
                 U _$Ss5print_9separator10terminatoryypd_S2StFfA0_
                 U _$Ss5print_9separator10terminatoryypd_S2StFfA1_
0000000000000fac s ___swift_reflection_version
                 U __swift_FORCE_LOAD_$_swiftDarwin
0000000000001060 s __swift_FORCE_LOAD_$_swiftDarwin_$_hello
                 U _fflush
0000000000000e30 T _hello
                 U _swift_bridgeObjectRelease
                 U _swift_bridgeObjectRetain
                 U dyld_stub_binder
cha84rakanal$ 

実際にJava側からSwiftで実装した関数を呼び出す

さて実際にProcessing(Java)側から先程作った Hello関数 を呼び出してみます
スケッチのdataディレクトリに先に生成したダイナミックリンクライブラリを入れて、次のスケッチで動かします!

JNAProcessing.pde
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public interface SwiftLib extends Library {
    void hello();
}

SwiftLib mylib;

void setup(){
    mylib = (SwiftLib) Native.loadLibrary(dataPath("libhello.dylib"), SwiftLib.class);
    mylib.hello();
}

void draw(){
}

ポイントは、

  1. JNA関連のライブラリをインポート
  2. com.sun.jna.Libraryを継承したインターフェースを定義(中に作成した関数の定義)
  3. Native#loadLibrary でダイナミックリンクライブラリを読み込み、ライブラリ名だけだと、Javaが参照しているダイナミックライブラリのパスをみにいく、絶対パスで入れられると確実

これでHelloと表示されたらOK! あとは何でも好きな処理をSwiftで実装するだけ!
それでは、よいProcessing Life

image.png

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

ラーメンで学ぶJava 【その1】

Javaをラーメンで学ぼう

なぜならみんなラーメンが好きだから。
Javaの基本をラーメンを通して学びましょう。

一連の目標

  • Javaの基本を理解して書けるようになる

読者のみなさんがこれくらいのレベルに達してくれたら嬉しいなあ。

出力にチャレンジ

プログラミング学習において、"This is a pen."にあたる導入は"Hello World!"と出力することです。
しかし、ラーメン大好きなみなさんには「ラーメン大好き」と出力していただきます。

Javaで出力したい時のキーワードは
System.out.println();
です。この()の中に入れた内容が出力されます。

「ラーメン大好き」と出力したいならこう。

Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("ラーメン大好き");
    }
}

今は、
public class Main
public static void main(String[] args)
とかは気にせず、
System.out.println();()中に"ラーメン大好き"
が入っていることを確認してください。

この状態で実行するとコンソールに
「ラーメン大好き」が出力されると思います。

念のため注意していただきたいのは、

  • ""(){}は半角であること。

です。これさえ守っていれば動くはずです。

さて、もしあなたが「ラーメンを食べたい」となった場合はどうすれば良いでしょうか。
「ラーメン大好き」を「ラーメンを食べたい」に置き換えれば大丈夫です。

Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("ラーメンを食べたい");
    }
}

あなたがラーメンを食べたがっていることが伝わったかと思います。

変数について

上で書いた「ラーメン大好き」文をもう少しスマートに書いてみましょう。
スマートに書くには変数を使います。

変数はよく箱に例えられます。
箱に文字や数字を入れることで、その箱を見た人がその中の値を確認・利用することができるという仕組みです。

しかし、「ラーメンで学ぶJava」である以上、ラーメンに絡めた説明もしておきます。

我々が店でラーメンを食べる際、ラーメンは器に入っています。まさか麺とスープを手渡しするような店はないはずです。この「器」に相当するのが「変数」だとここでは思ってください。

店主さんが作ったラーメンが器に入って我々に提供され、我々は器の中身のラーメンを頂くわけです。

Java(や多くのプログラミング言語)も同様で、誰かが計算した結果を「変数」にいれ、我々はその変数の中身を使って更に計算をしたり、中身を出力したりするわけです。

では、変数を使って「ラーメン大好き」文を書いてみましょう。

Main.java
public class Main {
    public static void main(String[] args) {

        String love = "ラーメン大好き";

        System.out.println(love);
    }
}

ここではあなたのラーメン愛をloveという変数に込めました。
System.out.println(love);
によってあなたの愛の中身を出力しているのです。

「ちょっと待って、Stringって何。」
となった方、次回をお待ちください。

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

[Android開発]Javaで画像をサーバーから取得してImageViewに設定しよう!!

説明

画像ファイルをURLで参照して、サーバーから取得する方法です。(非同期処理)

Java

GetImagesUrl
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class ImageUrl extends AsyncTask<Integer, Integer, Bitmap> {

    ImageView bmImage;

    public ImageUrl(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    @Override
    public Bitmap doInBackground(Integer... integers) {
        Bitmap image;
        URL imageUrl = null;
        try {
            //引数の数字で取得するURLを変える
            //Staric変数として画像のURLを定義しよう
            if (integers[0] == 0) {
                imageUrl = new URL(Constants.Image1);
            } else if (integers[0] == 1) {
                imageUrl = new URL(Constants.Image2);
            } else if (integers[0] == 2) {
                imageUrl = new URL(Constants.Image3);
            }
            InputStream imageIs;
            imageIs = imageUrl.openStream();
            image = BitmapFactory.decodeStream(imageIs);
        } catch (MalformedURLException e) {
            return null;
        } catch (IOException e) {
            return null;
        }
        return image;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
}

実行

main
 int ImageNum;
 //ImageNumに入っている数値で対象の画像を取得して、ImageViewに設定する
 new ImageUrl((ImageView) view.findViewById(R.id.any_image)).execute(ImageNum);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む