大化通信

大化物流開発合同会社の社員から技術発信をしていきます

【初心者向け】Javaの条件分岐と繰り返し処理

こんにちは。大化社員のeriです。 初心者向けにJavaの条件分岐と繰り返し処理について、どれを使えばいいか迷ったときに選びやすいようにシンプルにまとめました。

条件分岐

if文

  • if文は条件は複数の条件をチェックし、真の条件に該当する場合に対応するコードを実行できます。
  • 複雑な条件式(論理演算子など)を含めることができます。
if (条件) {
 // 条件が真の場合に実行されるコード
} else if (別の条件) {
 // 別の条件が真の場合に実行されるコード
} else {
 // いずれの条件も偽の場合に実行されるコード
}
if文の使用例

成績(scoreの値)に応じて異なるメッセージを表示します。

int score = 85;
if (score >= 90) {
 System.out.println("成績は優秀です。");
} else if (score >= 70) {
 System.out.println("成績は良いです。");
} else if (score >= 50) {
 System.out.println("成績は合格です。");
} else {
 System.out.println("成績は不合格です。");
}

結果

成績は良いです。

switch文

  • switch文は値に基づく一致を必要とし、式の値が特定の条件(case)と一致する場合、その条件に対応するコードを実行します。
  • switch文の条件は整数型や文字型の定数式である必要があります。
  • switch文にbreakが無い場合、該当するcaseが実行された後、次のcaseも実行されます。これは意図しない結果を生むことがあるため、多くの場合は特定のcaseが実行されたあとに他のcaseが実行されないようにbreakを記載します。
switch (式) {
 case 値1:
  // 値1に一致する場合に実行されるコード
  break;
 case 値2:
  // 値2に一致する場合に実行されるコード
  break;
 default:
  // いずれのcaseにも一致しない場合に実行されるコード
 }
switch文の使用例

数字で表された曜日(day)に対応する曜日名(dayName)を表示します。

int day = 3;
String dayName;

switch (day) {
 case 1:
  dayName = "月曜日";
  break;
 case 2:
  dayName = "火曜日";
  break;
 case 3:
  dayName = "水曜日";
  break;
  // 他の曜日に対するcase文を追加
 default:
  dayName = "不明な曜日";
}
System.out.println("今日は" + dayName + "です。");

結果

今日は水曜日です。

繰り返し処理

for文

  • for 文は反復回数が既知である場合や特定の回数だけ繰り返しをする場合に使用されます。
  • カウンタ変数の値が特定の条件を満たさなくなった場合にループが終了します。
for (初期化式; 条件式; 変化式) {
 // 実行したいコードを記述
}
for文の使用例

1から10までの整数を合計します。 i変数が1から10まで順番に増加し、それをsum変数に加算していきます。

int sum = 0;
for (int i = 1; i <= 10; i++) {
  sum += i;
}
System.out.println("合計: " + sum);

結果

合計: 55

拡張for文(for-each文)

  • 拡張 for 文は条件式がありません。対象となる配列やコレクションの要素の数だけ繰り返しを行います。
  • ListやMapなどの配列を処理するのに便利です。
for (データ型 変数名 : コレクションまたは配列) {
 // 要素に対する処理
}
拡張for文の使用例

リスト内の整数を反復処理し、それらの合計を計算します。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int number : numbers) { 
  sum += number;
}
System.out.println("合計: " + sum);

結果

合計: 15

while文

  • while文は特定の条件が満たされている限り繰り返しを続けるため、反復回数が不明な場合に使用されます。
  • for 文とは異なり初期化式や変化式はありません。初期化式は while 文の前で宣言などを行い、条件式が変化するような処理はブロックの中で行います。
int i = 0;
while (条件式) {
 // 実行したいコードを記述
}
while文の使用例

整数を1から順番に2乗し、2乗した数が10を超えるとループを終了します。

int i = 1;
while (true) {
 int square = i * i;
 if (square > 10) {
  break; // 2乗した数が10を超えたらループを終了
 }
 System.out.println(i + " の2乗は " + square);
 i++; 
}

結果

1 の2乗は 1
2 の2乗は 4
3 の2乗は 9

do..while文

  • while 文とほぼ同じですが、条件式の評価が繰り返しの最後で行われるため、少なくとも一回は繰り返し処理が行われます。
  • ループの終了条件がループ内で計算される場合に使用されます。
do{
 // 実行したいコードを記述
 ...
}while (条件式);
do..while文の使用例

1から10までの偶数を表示します。

int number = 1;
do {
 if (number % 2 == 0) {
  System.out.println(number);
 }
 number++;
} while (number <= 10);

結果

2
4
6
8
10

繰り返し処理のbreak

  • breakは繰り返し処理内で特定の条件が満たされた場合、ループを終了するために使用されます。
for文でのbreakの使用例

i が5になると break が実行され、ループが終了します。

for (int i = 1; i <= 10; i++) {
 if (i == 5) {
  break; // ループを終了
 }
 System.out.println(i);
}

繰り返し処理のcontinue

  • continueはループ内での特定の条件に従って、現在の繰り返し処理をスキップし、次の繰り返し処理を開始するために使用されます。
for文でのcontinueの使用例

i が3のとき、continue が実行され、その繰り返し処理のコードがスキップされ、次の繰り返し処理が開始されます。そのため3は出力されません。

for (int i = 1; i <= 5; i++) {
 if (i == 3) {
  continue; // iが3の場合、この繰り返し処理をスキップ
 }
 System.out.println(i);
}

以上になります。Javaの条件分岐と繰り返し処理で迷った時の参考になれば幸いです。

参考サイト

www.javadrive.jp

Excel VBA入門:初心者向けの便利な機能

こんにちは、大化社員のIrioです。

今回は、VBA初心者の私が便利だと思った機能を4つ紹介したいと思います!

  • 1つ目: マクロの記録


Excelは操作を記録してVBAコードに変換する「マクロ記録」機能を提供してくれています。
操作を記録することで、VBAコーディングのスタート地点を簡単に作成できます。
なのでマクロを録画してみて、生成されたコードを見て学んでみましょう!

  • 2つ目: オブジェクトブラウザ


VBAエディタ内の「オブジェクトブラウザ」は、Excelのオブジェクトモデルに関する情報を提供してくれています。
オブジェクトやメソッドの説明を探しやすく、VBAコーディングを助ける便利なツールです。
利用方法が分からないプロパティ、メソッド、どのようなメンバがあるのかを確認したい場合は非常に便利なツールですので、是非活用してみてください!

オブジェクトブラウザの開き方

起動方法を2つ紹介します。

1. 「表示」→「オブジェクトブラウザ」で起動

2. 「F2キー」で起動

2つ目の「F2キー」で起動 の方法が作業の効率化につながるのでお勧めです。

  • 3つ目: コードの自動補完


VBAエディタは、コードを入力する際に自動補完機能を提供してくれています。
変数やメソッド名を入力し始めると、一致する候補が表示されます。
タイプミスが減り、コーディングの速度が向上するので、初心者にとってはとてもありがたい機能ですよね!


コードにコメントを追加することは、コードの理解と協力のために非常に役立ちます。
コメントを入れることで、コードの目的や処理内容を説明でき、他の人とコードを共有するときに有用です。

VBAのコメントはシングルクォーテーション ( ' ) で始めることができます!

ですが、1つ残念な部分があります。

それは、VBAではコメントアウトのショートカットキーが使えないという点です。
VisualStudioCodeで複数行のコードをまとめてコメントアウトをする場合は、ショートカットキー「Ctrlを押しながら+K+C」を押すとコメントアウトされますが、VBAでは押してもコメントアウトされないので注意してください。

VBAでは、違う方法で複数行のコードを一括でコメントアウトできる方法があるので、そちらの参考サイトを載せておきます。

参考サイト 
↓ ↓ ↓ ↓
vba-labo.rs-techdev.com


これで、初心者向けの便利な機能の紹介を終わりたいと思います。
ありがとうございました。

JavaでAzure Functionsの関数を作成する

こんにちは。大化の社員のDKといいます。 とある案件にて、初めてAzure Functionsの開発を行いました。 この際、苦労しましたので、備忘録として残せればと思いこの記事を作成しました。

環境

環境構築

ここでは、環境構築は割愛させていただければと思います。 ですので、参考URLのご紹介とだけさせていただければ幸いです。 また、環境構築の詳細については後日別の記事で投稿させていただければと思います。

learn.microsoft.com

ソースコードのご紹介

ここでは、JavaでAzure Functionsの関数の処理についてソースを踏まえながらご紹介いたします。 また、URLからアクセスし発火させるHttTriggerについてのご紹介です。

トリガークラス

まずは、Azure Functionsからキックされる元のクラスとなるトリガークラスの紹介です。

package jp.co.ht.contract.trigger.test;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;

import org.springframework.cloud.function.adapter.azure.FunctionInvoker;

import jp.co.ht.contract.Endpoints;
import jp.co.ht.contract.models.request.test.TestExecRequest;
import jp.co.ht.contract.models.response.common.Error;
import jp.co.ht.contract.models.response.test.TestExecResponse;

/**
 * テスト実行トリガークラス
 */
public class TestExecHttpTrigger extends FunctionInvoker<TestExecRequest, TestExecResponse> {

    @FunctionName("TestExec")
    public HttpResponseMessage execute(@HttpTrigger(name = "request", methods = {HttpMethod.POST}, 
            route = ”test/exec”, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<TestExecRequest> request,
            ExecutionContext context) {
        HttpResponseMessage response = null;

        // リクエスト情報設定
        TestExecRequest param = request.getBody();

        // テスト実行処理
        response = request.createResponseBuilder(HttpStatus.OK).body(handleRequest(param, context))
                .header("Content-Type", "application/json").build();

        return response;
    }

}

public class TestExecHttpTrigger extends FunctionInvoker<TestExecRequest, TestExecResponse> {

クラスを作成する際は、Springのフレームワークの処理を呼び出すために「FunctionInvoker」を継承して作成いたします。 FunctionInvokerに指定しているクラスは下記の様になっています。

  • 第1引数・・・リクエストで使用するパラメータのクラスを指定する
  • 第2引数・・・レスポンスで使用するパラメータのクラスを指定する

@FunctionName("TestExec")

@FunctionNameのアノテーションでFunctionの名前を指定します。 ここでは、「TestExec」という名前で指定しております。

methods = {HttpMethod.POST}

methods のパラメータに、受け取るリクエストのタイプを指定することができます。 ここでは、POSTでのアクセスを受け付けていますが、GETでのアクセスを受け付けたりPOSTとGETなど複数のリクエストを受け付けることをも可能です。

route = ”test/exec”

routeのパラメータに、リクエストする際のドメイン以外のURLを指定します。 ローカルでテスト実行する際に、このトリガーを実行する場合は、下記の様なURLとなります。

実行時のURL:http://localhost:7071/api/test/exec

HttpRequestMessage<TestExecRequest> request

WEB APIを呼び出した際に指定したパラメータを受け取りは、こちらの「request」という変数に格納されます。 ここには、BODY部だけでなくHEADER情報なども含まれて格納されます。 受け取るリクエストの形式としては、「TestExecRequest」として指定した形式で受け取るようになっています。 このプログラムを作成した際は、JSON形式のものをリクエストのBODY部の情報として受け取っていました。 その受け取った文字列をオブジェクトに変換をAzure側でGSONを使用して自動で行ってくれます。 ただ、リクエストの仕様た項目が受け取り時のクラスにない場合、実行エラーとなります。 また、数値で受け取るようにしていて、文字列で渡した場合これもエラーとなります。 文字列で数値だけの場合は、自動で変換されるのですが、英字などの文字が含むとタイプエラーとなります。 バリデーションなどで、数値のみ指定されているかどうかチェックする場合は、一旦文字で受け取らないとバリデーション自体が行えませんでした。

        // リクエスト情報設定
        TestExecRequest param = request.getBody();

        // テスト実行処理
        response = request.createResponseBuilder(HttpStatus.OK).body(handleRequest(param, context))
                .header("Content-Type", "application/json").build();

ここでは、リクエストのBODY部の情報を変数に格納し、「handleRequest」でSpringの処理を実行します。 その結果を、HTTPステータスがOK(200)として返却と、返却時のBODYの内容の設定および返却時の形式をJSON形式で返却するように指定しております。

これを、returnすれば、処理結果が返却される形となっています。

ファンクションクラス

次に、トリガークラスからキックされる元のクラスとなるファンクションクラスの紹介です。

package jp.co.ht.contract.functions.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.function.Function;

import jp.co.ht.contract.models.request.test.TestExecRequest;
import jp.co.ht.contract.models.response.test.TestExecResponse;
import jp.co.ht.contract.service.test.TestExecService;

/**
 * テスト実行ファンクションクラス
 */
@Component("TestExec")
public class TestExec implements Function<TestExecRequest, TestExecResponse>{

    /**
     * テスト実行サービスクラス
     */
    @Autowired
    TestExecService testExecService;

    /**
     * テスト実行処理
     * @param request リクエスト情報
     * @return レスポンス情報
     */
     public TestExecResponse apply(TestExecRequest request) {
        return testExecService.execApi(request);
    }
}
@Component("TestExec")
public class TestExec implements Function<TestExecRequest, TestExecResponse>{

トリガーから呼び出されるクラスと分かるように「@Component」のアノテーションをつける必要があります。 また、クラス名はFunciton名と同じする必要があり、同じ名前にするとトリガークラスに記載した「handleRequest」から自動的に呼び出されます。 ただ、名前解決がうまくいかないことがあり、「@Component」に引数としてFunctionの名前を指定しております。 こうしておけば、名前解決に失敗することはありませんでした。 それと、「Function」には下記の様にクラスを指定します。

  • 第1引数・・・リクエストで使用するパラメータのクラスを指定する
  • 第2引数・・・レスポンスで使用するパラメータのクラスを指定する
    /**
     * テスト実行サービスクラス
     */
    @Autowired
    TestExecService testExecService;

ここでは、サービスクラスを自動生成しております。 ここは、Springと同じような処理を記載することが可能となっております。

    /**
     * テスト実行処理
     * @param request リクエスト情報
     * @return レスポンス情報
     */
     public TestExecResponse apply(TestExecRequest request) {
        return testExecService.execApi(request);
    }

「apply」というメソッドを準備し、この中でトリガーから呼び出される処理を記載いたします。 このプログラムを作成したときには、バリデーションの処理を呼び出すような処理を行い、問題なければサービスクラスの処理を行うような処理を行っておりました。 呼び出しているサービスクラス内の処理は、Springでの記載と同じため個々では割愛いたします。

リクエストクラス

次に、リクエスト時に私パラメータの形式を指定するクラスを参考として紹介します。 詳細については、特に記載の必要がないと思われるため、割愛いたします。

package jp.co.ht.contract.models.request.test;

import java.io.Serializable;

import lombok.Data;

/**
 * テスト実行リクエストクラス
 */
@Data
public class TestExecRequest implements Serializable {

    /** 関数名 */
    private String functionName;

}

レスポンスクラス

次に、レスポンス時に私パラメータの形式を指定するクラスを参考として紹介します。 詳細については、特に記載の必要がないと思われるため、割愛いたします。

package jp.co.ht.contract.models.response.test;

import java.io.Serializable;

import lombok.Data;

/**
 * テスト実行レスポンスクラス
 */
@Data
public class TestExecResponse implements Serializable {

    /** コンテント */
    private String content;

}

今回は、以上となります。 Azure Functionsを使用してアプリ開発を行う方の力に少しでもなればと思います。

phpseclibでRSA公開鍵暗号方式の暗号化と復号

こんにちは、大化社員のkannaです。
今回はRSA公開鍵暗号方式の暗号化と復号をPHPのライブラリ「phpseclib」を使用して行ったのでそれについて記事にしました。

以前携わった案件にてパスワード保護付きのPDFを扱う際に、
フロントからPDFと暗号化したパスワードを受け取りPHPで処理を行う必要があったためこちらのライブラリを使用しました。

概要

OpenSSLを使用して秘密鍵と公開鍵を作成し
PHPのライブラリ「phpseclib」で暗号化と復号を行う

環境

本記事での環境は以下

  • Windows 10

  • PHP 8.1.2

  • "phpseclib/phpseclib": "^3.0"

OpenSSLのコマンドで鍵を生成

秘密鍵の生成

下記コマンドで秘密鍵を生成します

openssl genrsa -out private-key.pem 2048

openssl genrsa -out 秘密鍵ファイル名 ビット数

ビット数は鍵のサイズとなります。
サイズが大きいほど鍵の強度は高くなりますが、復号の際の解読時間が長くなります。

秘密鍵から公開鍵を生成

下記コマンドで秘密鍵から公開鍵を生成します

openssl rsa -in private-key.pem -pubout -out public-key.pem

openssl rsa -in 秘密鍵ファイル名 -pubout -out 公開鍵ファイル名

先ほどのコマンドで生成した秘密鍵ファイルを指定します。

phpseclibを使用し、文字列の暗号化と復号を行う

暗号化

use phpseclib3\Crypt\PublicKeyLoader;

$text = '暗号化したい文字列';
// 公開鍵ファイルを読み込み
$public = file_get_contents('/path/to/public-key.pem');
$publicKey = PublicKeyLoader::load($public);
// 引数に指定した文字列を暗号化
$encrypted = $publicKey->encrypt($text);

$public = file_get_contents('/path/to/public-key.pem');

file_get_contents()で公開鍵ファイルの値を取得します。

$publicKey = PublicKeyLoader::load($public);

PublicKeyLoader::load()を使い、公開鍵を読み込みます。

$encrypted = $publicKey->encrypt($text);

encrypt()で指定した文字列を暗号化します。

復号

use phpseclib3\Crypt\RSA;

// 秘密鍵ファイルの読み込み
$private = file_get_contents(storage_path('test_private-key.pem'));
$privateKey = RSA::loadPrivateKey($private);
// 引数に指定した文字列を復号
$decrypted = $privateKey->decrypt($encrypted);

echo '復号した文字列:'.$decrypted;

$privateKey = RSA::loadPrivateKey($private);

RSA::loadPrivateKey()を使い、秘密鍵を読み込みます。

$decrypted = $privateKey->decrypt($encrypted);

decrypt()で指定した文字列を復号します。

phpseclibを使用して鍵を生成する場合

use phpseclib3\Crypt\RSA;

// 秘密鍵を生成
$private = RSA::createKey();
// 秘密鍵から公開鍵を生成
$public = $private->getPublicKey();


phpseclibを使ったRSA公開鍵暗号方式の暗号化と復号については以上になります。
読んでくださってありがとうございます。
参考になれば幸いです。

参考サイト

Opensslコマンドで秘密鍵と公開鍵を生成

weblabo.oscasierra.net

www.ibm.com

phpseclib

phpseclib.com