プログラミンGOO

プログラミングナレッジ、ワードプレス、広告収入等について、気づき・備忘録を残していきます。

GoogleMapの経路を送る

行き先を送るだけなら誰でもできるが、時間を含めた予定を送ることができない。

いろいろ調べた結果、GoogleMapだけではこの目的は果たせないよう。

なので、少し工夫する。

相手のメールアドレスを知っていれば、以下の方法で送れる。

 

まずは通常通り経路を時間指定で検索。

経路検索



好きな経路を選択したら、下の方にスクロールし、「カレンダーに追加」

カレンダーに追加

すると、カレンダーアプリの方に、先ほど検索した出発時刻で経路情報が作成される。

カレンダーに自動追加される

予定を開いてみると、GoogleMapのURLと、メモ欄には乗り換えの詳細が自動で記載されている。

予定の経路

予定を下にスクロールして、「予定参加者」を開くと、メールを知っている相手に、同じ予定を共有できる。

予定を送る

 

JavaのJUnitにおける、getDeclaredMethodとgetMethodの違いは?

JavaのリフレクションAPIにおけるgetDeclaredMethodとgetMethodの違いは、主に取得対象のメソッドのスコープ(可視性)や、継承関係における挙動にあります。以下にその違いを詳しく説明します。

 

getDeclaredMethod

 

getDeclaredMethodは、クラス内で宣言されている特定のメソッドを取得します。

 

特徴

  1. 対象範囲:
  • 現在のクラスに宣言されているメソッドのみを取得します。
  • 継承されたスーパークラスのメソッドは取得できません。
  1. アクセス修飾子に関係なく取得可能:
  • privateやprotectedなど、あらゆるアクセス修飾子のメソッドを取得できます。
  • ただし、privateメソッドを呼び出すためには、setAccessible(true)を使用してアクセス許可を変更する必要があります。
  1. シグネチャに基づく取得:
  • メソッド名と引数の型を完全一致させて指定する必要があります。

 

 

import java.lang.reflect.Method;

 

public class Example {

    private void privateMethod() {

        System.out.println("Private method called");

    }

 

    public static void main(String args) throws Exception {

        Class<Example> clazz = Example.class;

 

        // getDeclaredMethodを使用してprivateメソッドを取得

        Method method = clazz.getDeclaredMethod("privateMethod");

        method.setAccessible(true); // アクセス許可を変更

 

        Example instance = new Example();

        method.invoke(instance); // 実行

    }

}

 

ポイント:

  • この例では、privateMethodはprivate修飾子を持っていますが、getDeclaredMethodで取得可能です。

 

getMethod

 

getMethodは、現在のクラスまたはスーパークラスから公開されている(public)特定のメソッドを取得します。

 

特徴

  1. 対象範囲:
  • 現在のクラスおよび継承されたスーパークラスに存在するpublicメソッドのみを取得します。
  • privateやprotectedメソッドは取得できません。
  1. アクセス修飾子の制限:
  • publicメソッドのみ取得可能です。
  • privateやprotectedメソッドは対象外です。
  1. シグネチャに基づく取得:
  • メソッド名と引数の型を完全一致させて指定する必要があります。

 

 

import java.lang.reflect.Method;

 

class Parent {

    public void publicMethod() {

        System.out.println("Public method in parent");

    }

}

 

public class Example extends Parent {

    public static void main(String args) throws Exception {

        Class<Example> clazz = Example.class;

 

        // getMethodを使用して親クラスのpublicメソッドを取得

        Method method = clazz.getMethod("publicMethod");

 

        Example instance = new Example();

        method.invoke(instance); // 実行

    }

}

 

ポイント:

  • この例では、getMethodを使うことで、Parentクラスから継承されたpublicMethodを取得しています。
  • getDeclaredMethodを使用した場合、ExampleクラスにpublicMethodが宣言されていないため取得できません。

 

getDeclaredMethodとgetMethodの主な違い

 

特徴 getDeclaredMethod getMethod

スコープ 現在のクラスのみ 現在のクラスとスーパークラス

アクセス修飾子 すべて(private, protected, public) public のみ

継承されたメソッド 取得不可 取得可能

ユースケース 非公開メソッドの取得、特殊な処理に利用 公開されたメソッドの取得

 

どちらを使うべきか?

  • privateprotectedメソッドを取得したい場合:
  • getDeclaredMethodを使う。
  • 継承されたpublicメソッドを含めて取得したい場合:
  • getMethodを使う。
  • JUnitテストでプライベートメソッドをテストしたい場合:
  • getDeclaredMethodを使うことが一般的です。

 

 

 

JavaのJUnitで使用する@ExtendWithの意味は?

@ExtendWithは、JUnit 5(Jupiter)で使用されるアノテーションで、テストに拡張機能(Extension)を追加するために使われます。このアノテーションを使用することで、JUnitのテストの実行にカスタマイズされた動作を加えることができます。

 

基本的な役割

 

@ExtendWithは、指定したクラス(エクステンションクラス)をJUnitに登録し、テストの実行時にそのクラスが提供するカスタムロジックを適用します。エクステンションを使うと、テストのライフサイクルにフックしたり、追加の設定や処理を行うことができます。

 

使用例

 

  1. エクステンションの登録

 

以下は、JUnitの拡張機能を利用する基本的な例です。

 

import org.junit.jupiter.api.extension.ExtendWith;

import org.junit.jupiter.api.Test;

 

@ExtendWith(MyExtension.class) // 拡張クラスを登録

public class MyTest {

 

    @Test

    void testExample() {

        System.out.println("Running test...");

    }

}

 

ここでは、MyExtensionという拡張クラスがテストの実行時に適用されます。

 

  1. エクステンションクラスの実装

 

エクステンションクラスは、org.junit.jupiter.api.extension.Extensionインターフェースを実装する必要があります。以下は簡単な例です。

 

import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;

import org.junit.jupiter.api.extension.ExtensionContext;

 

public class MyExtension implements BeforeTestExecutionCallback {

 

    @Override

    public void beforeTestExecution(ExtensionContext context) throws Exception {

        System.out.println("Before executing test: " + context.getDisplayName());

    }

}

 

このエクステンションでは、テストが実行される前に何らかの処理(この場合はログ出力)を行います。

 

@ExtendWithがよく使われるケース

  1. Mockや依存性注入のサポート
  • 例えば、MockitoExtensionを使ってMockitoのモックオブジェクトをテストに注入します。

 

@ExtendWith(MockitoExtension.class)

public class MyTest {

    @Mock

    private MyService service;

 

    @Test

    void testMock() {

        // モックを使用したテスト

    }

}

 

  1. カスタムコンテキストの提供
  • Spring Bootのテストでは、@ExtendWith(SpringExtension.class)が使用され、Springのアプリケーションコンテキストを初期化します。

 

@ExtendWith(SpringExtension.class)

@SpringBootTest

public class MySpringTest {

    @Test

    void testWithSpring() {

        // Springコンテキストを使用したテスト

    }

}

 

  1. ログやトレースの追加
  • テストのライフサイクルにフックして、ログやトレースを追加することができます。
  1. テスト環境のセットアップ
  • 外部リソースの準備やクリーンアップを行うための拡張。

 

JUnit 4との違い

 

JUnit 4では、拡張機能は@RunWithアノテーションを使って指定していました。JUnit 5では、@ExtendWithを使用することで、より柔軟な拡張が可能になりました。

 

まとめ

 

@ExtendWithはJUnit 5のテスト実行をカスタマイズするためのアノテーションで、以下のような用途に使えます:

  • テストライフサイクルにフックしてカスタム処理を追加
  • 依存性注入や外部リソースのセットアップ
  • テスト環境のカスタマイズ

 

具体的なエクステンションクラスの内容によって、その機能や目的が変わりますので、テストコードの上に指定されたクラス(例: MyExtension)の内容を確認すると、何を実現しているのかが分かります。

 

ラムダ式は可読性が低すぎる?メリットデメリットを整理

ラムダ式やメソッド参照は簡潔さを追求する一方で、場合によっては過読性を下げることがあります。これには賛否両論があり、どちらを優先すべきかはケースバイケースです。

 

ラムダ式の利点

  1. コードが短くなる:

繰り返し登場する匿名クラスや簡単な処理を短縮するため、コードがコンパクトになります。

  1. 意図が明確な場合に読みやすい:

単純な処理や直感的なロジックであれば、ラムダ式は一目で内容を把握しやすいです。

例:

 

list.forEach(item -> System.out.println(item));

 

 

  1. モダンなスタイル:

関数型プログラミングの概念を取り入れることで、ストリームAPIなどの便利な機能が活用しやすくなります。

 

ラムダ式の欠点

  1. 複雑な処理で読みづらい:

ラムダ式の中に複雑なロジックやネストが含まれると、意図が分かりにくくなります。

例:

 

map.computeIfAbsent(key, k -> list.stream()

                                  .filter(item -> item.getKey().equals(k))

                                  .findFirst()

                                  .orElse(null));

 

これは、簡潔すぎて何をしているか理解するのに時間がかかる可能性があります。

 

  1. デバッグがしづらい:

ラムダ式は一行で記述されることが多いため、デバッグ時にどの部分が問題か特定するのが難しい場合があります。

  1. 新しい開発者には慣れが必要:

ラムダ式やメソッド参照は、初心者にとっては馴染みが薄く、可読性を損なうことがあります。

 

どのようにバランスを取るか

 

ラムダ式やメソッド参照の過度な使用を避け、必要な場面だけ使うことが大切です。

  1. 単純な処理に限定する:

簡単な処理(1~2行程度)にラムダ式を使い、複雑なロジックでは通常のメソッドや関数を使う。

例: 以下のようにラムダ式を分離することで、意図を明確化できます。

 

Predicate<String> startsWithA = str -> str.startsWith("A");

list.stream().filter(startsWithA).forEach(System.out::println);

 

 

  1. 名前付きメソッドを活用する:

複雑なラムダ式はメソッドに分割し、メソッド参照で呼び出します。

例:

 

list.stream()

    .filter(this::isEligible)

    .forEach(System.out::println);

 

private boolean isEligible(String str) {

    return str.startsWith("A") && str.length() > 3;

}

 

  1. チームの合意を大切にする:

開発チームで「ラムダ式をどの程度使うか」を統一しておくと、コード全体の可読性を保つのに役立ちます。

 

 

MACアドレスのフォーマットはどんな形式?

MACアドレス(マックアドレス)のフォーマットは、ネットワークデバイスの物理的な識別子として使用される48ビット(6バイト)の番号で、通常は以下の形式で表記されます。

 

MACアドレスの一般的な形式

 

MACアドレスは、2桁の16進数(0〜9、A〜F)を6つ並べたものです。それぞれの2桁は1バイト(8ビット)を表します。以下のような区切り形式があります:

  1. ハイフン区切り: 00-14-22-01-23-45
  2. コロン区切り: 00:14:22:01:23:45
  3. ピリオド区切り: 0014.2201.2345(主にCisco製品で使われます)

 

MACアドレスの構造

 

MACアドレスは大きく二つの部分に分かれています:

  1. OUI(Organizationally Unique Identifier):
  • 最初の24ビット(6桁)で、デバイスを製造したメーカーを識別します。
  • 例: 00:14:22(これはIntelのOUIです)。
  1. デバイス固有部分:
  • 後半の24ビット(6桁)で、製造メーカーが一意に割り当てる番号です。
  • 例: 01:23:45。

 

これにより、全世界でユニークなMACアドレスが生成されます。

 

一部のMACアドレスの特殊な特徴

  1. マルチキャストビット:
  • MACアドレスの最下位ビット(最初の1バイトの末尾)が「1」の場合、そのアドレスはマルチキャスト用であることを意味します。
  1. ローカル管理アドレス:
  • MACアドレスの第2ビットが「1」の場合、そのアドレスはローカルに管理されたものであり、グローバルにユニークである必要はありません。

 

JavaのHttpCookieで、Expires属性を設定する方法は?

Expires属性を直接設定するための専用メソッドはありません。ただし、HttpCookieでは代わりにMax-Age属性を使用してクッキーの有効期限を制御することができます。

Max-Age属性とExpiresが両方とも設定されていた場合、Max-Age属性が優先されるため、有効期限を指定したい場合は、Max-Age属性を使用します。

 

Expires属性とMax-Age属性の違い

  1. Expires属性: クッキーが有効である期限を特定の日付(タイムスタンプ形式)で指定します。
  • 例: Expires=Tue, 01 Jan 2030 12:00:00 GMT
  1. Max-Age属性: クッキーの有効期間を「秒数」で指定します(現在から何秒後にクッキーが無効になるか)。
  • 例: Max-Age=3600(1時間後に有効期限が切れる)

 

Max-Ageが優先される仕様になっているため、HttpCookieではExpiresの代わりにMax-Ageを設定する方法が一般的です。

 

Javaでの設定方法

 

HttpCookieで有効期限を設定するには、setMaxAgeメソッドを使用します。

 

サンプルコード

 

 

import java.net.HttpCookie;

 

public class CookieExample {

    public static void main(String[] args) {

        // クッキーを作成

        HttpCookie cookie = new HttpCookie("myCookie""cookieValue");

        

        // Max-Ageを設定(例: 3600秒 = 1時間)

        cookie.setMaxAge(3600);

 

        // ドメインやパスも設定可能

        cookie.setDomain("example.com");

        cookie.setPath("/");

 

        // クッキー情報を表示

        System.out.println("Cookie: " + cookie);

    }

}

 

このコードでは、クッキーの有効期限が現在から一時間後に設定されています。

 

Expires属性を設定する場合

 

HttpCookieクラスでは直接Expiresを設定する方法がありません。ただし、以下の方法でHTTPレスポンスヘッダにExpiresを追加することで、手動で設定できます。

 

手動でレスポンスヘッダに追加

 

サーブレットを使用してレスポンスヘッダに直接Expiresを含める方法です。

 

 

import javax.servlet.http.*;

 

public class CookieWithExpiresExample extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {

        Cookie cookie = new Cookie("myCookie""cookieValue");

        

        // Max-Ageで有効期限を設定

        cookie.setMaxAge(3600); // 1時間後

        

        // クッキーをレスポンスに追加

        response.addCookie(cookie);

 

        // Expiresヘッダを手動で追加

        response.setHeader("Set-Cookie"

            "myCookie=cookieValue; Expires=Tue, 01 Jan 2030 12:00:00 GMT; Path=/");

    }

}

 

この方法では、レスポンスヘッダに手動でExpiresを含む完全なSet-Cookieヘッダを記述することで対応できます。

 

まとめ

  • JavaのHttpCookieクラスでは、ExpiresではなくMax-Ageを使用するのが基本です。
  • どうしてもExpiresを設定したい場合は、サーブレットやレスポンスヘッダをカスタマイズすることで対応可能です。

 

参考:

HTTP Cookie の使用 - HTTP | MDN

 

A5SQL備忘録

テーブルを別のデータベースにコピーする

いろいろ調べたがテーブル定義(キー制約やカラムの属性等)を含めたインポートはできないよう。
そのため、テーブルごとに定義をインポートしてコピー先に取り込む。
レコードは複数テーブル一括インポートできる。

テーブル定義のエクスポート

コピー元のテーブルを開く>ソースタブ
ここにcreate文が自動作成されているのでコピー

テーブル定義のインポート

新規作成>SQL>送信先にコピー先のDBを指定>先ほどのSQL文を実行する
ここまでをテーブルの個数分繰り返す

レコードのエクスポート

コピー元のDBを右クリック>一括エクスポート
形式を選択してエクスポート(形式は何でもいい)

レコードのインポート

コピー先のDBを右クリック>連続インポート
先ほど作成したファイルをインポートする