maven dependencymanagementの使用用途

最近、mavenを学習したときに引っ掛かりを覚えたのでメモ *1

何に引っ掛かりを覚えたか

公式ではなく、他の方の記事から引用になってしまうのですが、、、

dependenciesとは違って依存関係の定義ではなく、依存関係の定義の為の定義 *2

私がマルチスタイルのプロジェクトのpomをガッツリ管理したことがないからか、
使用例を見ても利便性を理解できず

腹落ちした理由

intellijでは、dependencyManagementで指定されている依存関係のリストを表示して
任意のライブラリを追加することができる
毎回親pomを除いてコピペするが面倒くさいと思っていたけど、これは便利
と書いていて気がついた
ライブラリを追加するときに、毎回親pomを見ることに面倒くささを感じていたんだな

参考

maven3に慣れる - 備忘log *1
Mavenでビルドする際の10のTips - cynipeと読む *2
Maven 依存関係 | IntelliJ IDEA ドキュメント *3

maven3に慣れる

はじめに

業務でmavenを利用している、正直、雰囲気で触っている。 苦手意識を克服することを目標に、mavenの学習に取り組もうと思う 公式のDocumentを読んで理解できるタイプではないため、Maven3 チュートリアルに沿って手を動かしながら学習をする

TECHSCORE(テックスコア)と迷ったが前者のほうが情報が圧倒的に新しいので、そちらを選択

ゴール

java + Spring Bootのプロジェクトを触る上で困らない程度に理解できること

環境

$ mvn -v
Apache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f)
Maven home: C:\Program Files\apache-maven-3.9.3
Java version: 17.0.2, vendor: Oracle Corporation, runtime: C:\Program Files\jdk-17.0.2
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"

1章

ケルトン(雛形)を作成

出来上がったものがこちら

$ cat .\pom.xml
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>hello</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>hello</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

pomの内容について

ケルトンを作成するときに入力したgroupId,artifactId,version,packageは以下のように反映される

  • groupId,artifactId,versionはpom.xmlに反映
  <groupId>com.example</groupId>
  <artifactId>hello</artifactId>
  <version>1.0-SNAPSHOT</version>
  • packageはプロジェクトのパッケージ構成に反映される
src\main\java\com\example

各要素が持つ意味は次の通り *1

groupId プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的です。
artifactId プロジェクトの成果物の名前。 作成する JAR や WAR, EAR ファイルなどの名前に使用されます。
version プロジェクトのバージョン。 snapshotについて:Maven SNAPSHOTの概要とリリース方法(スナップショット) - Web系開発メモ
1.6.2 TODO テストコンパイル設定

src/main配下はテスト用のコードを配置する場所ではないため、エラーになる junitdependencyから<scope>test<scope>の記載を削除してもだめ

1.6.3 TODO リソースの配置

javaフォルダ配下のhoge.txtはコピーされず、resouces配下のhoge.txtはコピーされる これは、1.5.1で出力した設定値を見ると解決する

1.7,1.8は割愛(知っている内容について記載を行うことに疲れてきた)

2章

読み物なので記載を割愛

3章

※3.1,3.2はスキップ

3.3

ライブラリ 説明 適切なスコープ そのスコープにした理由
junit.jar ユニットテスト用ライブラリ compile or runtime どこまでテストを組むのかによるけど、基本的にcompileでよいという理解
ojdbc6.jar Oracle JDBCドライバ
slf4j-api.jar ロギングライブラリ
servlet-api.jar Servlet API

4章

※割愛、私はintellijにインポートした

5章

※割愛 インハウスリポジトリを意識したことがないので、今度時間のある時に作って見ようと思います

mavenのインハウスリポジトリを作るよ - Qiita

6章

以下の設定をpomに追加
  <properties>
    <hoge.value>hoge.hoge</hoge.value>
  </properties>

=======省略======= <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <configuration> <target> <echo>project.groupId = ${project.groupId}</echo> <echo>project.artifactId = ${project.artifactId}</echo> <echo>project.version = ${project.version}</echo> <echo>project.build.directory = ${project.build.directory}</echo> <echo>env.JAVA_HOME = ${env.JAVA_HOME}</echo> <echo>hoge.value</echo> </target> </configuration> </plugin>

$ mvn antrun:run
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< example.com:maven_props >-----------------------
[INFO] Building maven_props 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- antrun:1.8:run (default-cli) @ maven_props ---
[INFO] Executing tasks

main:
     [echo] project.groupId = example.com
     [echo] project.artifactId = maven_props
     [echo] project.version = 1.0-SNAPSHOT
     [echo] project.build.directory = C:\work\maven\example\maven_props\target
     [echo] env.JAVA_HOME = C:/Program Files/jdk-17.0.2
     [echo] hoge.value
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.971 s
[INFO] Finished at: 2023-07-31T20:11:57+09:00
[INFO] ------------------------------------------------------------------------

デフォルトプロパティ,環境変数,ユーザー定義プロパティの反映状況が確認できる

7章

7.3.1

pomに以下の一文を追加することで、mvn packageを実行した際にwarがtarget配下に生成される

<packaging>war</packaging>

8章

8.1.1
以下の設定をpom.xmlに追加したことにより、verifyのフェーズでcheckstyle:checkが実行される これは、mavenのlife cycleを理解しているとinstallコマンドの実行時にverifyが実行されることが理解できる *2
  <build>
    </pluginManagement>
    ==== 割愛 ====
    <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>2.17</version>
        <executions>
          <execution>
            <id>checkstyle</id>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

9章,10章

学習先の構成と若干ずれますが、、、 学習に利用していたmavenプロジェクトのrootディレクトリからmvn archetype:generateで子プロジェクトを作成しようとしたところ、次のエラーに遭遇した
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.2.1:generate (default-cli) on project parent_pom: Unable to add module to the current project as it is not of packaging type 'pom' -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
これは、すでにmavenプロジェクトが存在しているフォルダでプロジェクトを作成しようとした場合に発生するエラーで <packaging>pom</packaging>をpom.xmlに追加することで解消する また、この記載を親pomに記載した状態で子プロジェクトを作成するとmavenが親pomにmodulesの設定を反映してくれる

参考情報

2. Maven 入門 (2) | TECHSCORE(テックスコア) *1

Mavenの「よくわらない」を解消 ! ライフサイクル、フェーズ、バインドの概念 | dawaan *2

AS番号ってなに?

AS番号とは

AS番号とは、インターネットを構成する個々の独立したネットワーク(AS:自律システム)に対して割り当てられている、一意の識別番号。2バイト(16ビット)または4バイト(32ビット)の値で、各国のネットワークインフォメーションセンター(NIC)が発行している。

https://e-words.jp/w/AS%E7%95%AA%E5%8F%B7.html

だそうです。難しい。

前提:インターネットの作りについて

よくよく言われることですが、インターネットは色々な規模のネットワークの集合対です。
※日本で例えると インターネット=国、ネットワーク=都道府県 といったイメージになるとかと思います。

本題

さて、AS番号とは独立したネットワークに振られるものということでした。
独立したネットワークとは、ISP(Internet Service Provider)や企業を指します。
ISPでわかりやすいところだと、OCNとかSoftBankとかがパット思いつくところかと
繰り返しになりますが、上記のようなネットワーク管理を行う業者や大規模ネットワークを持つ企業に割り振られる一意の番号がAS番号ということです。
つまり、我々が普段自宅で利用しているネットワーク(Wi-Fiなど)はどこかのAS番号(ISP)に管理されたものであるということですね。
※先程の日本のたとえでいうと都道府県に割り振られている番号がAS番号みたいなイメージになるかと思います。
 ただ、都道府県で覚えてしまうとAS番号が枯渇していることなどの理解がわかづらくなるので、あまり正しい表現ではないかなと、、、
AS番号がどんな場面で利用されているかは、以下のサイトに詳しく利用されていました。

https://milestone-of-se.nesuke.com/nw-advanced/bgp/bgp-summary/

なるほど、アクセス先の判断に使われるんですね。

※余談ですが、単純にAS番号などで調べると文字だけの説明で理解が追いつかないことがあるので
 私は画像検索を行い分かりやすそうな図を乗せているサイトを見るようにしています

公開鍵と秘密鍵の使い方について復習した

きっかけ

転職しました(唐突)

 

転職先では業務開始前にe-learningの受講が義務付けられており仕事中に勉強させてもらっています(天国か)

心機一転ということで、わからないこと、少しでも理解が曖昧なことは勉強し直そうと思っています。

 

前置きが長くなりました。

e-learningでSSH用の認証キーを作成する場面がありました。

公開鍵と秘密鍵という単語はよく耳にする言葉ですが、

私はEC2を作る時にダウンロードシているのが正直どっちの鍵なのか理解できていないレベルです。

ということでSSHと使う鍵について勉強し直しました。

 

SSHって?

VPSにつなぐための技術です。

まず遠隔操作の技術について記載します。

 

telnet
    PCを遠隔操作するためのプロトコル    
    なお、通信内容は暗号化されないため現在は主流ではない    

 

SSH(secure shell:セキュアシェル)        
    簡単にいうとtelnetの強化版    
    通信内容が暗号化された状態で送受信される。つまりネットワーク上に流れているデータは暗号文なので傍受されても解読できない    

例えば、telnetの場合、通信内容を暗号化しない。①から以下のような情報を③に送信した場合、②はすべての情報を傍受できてしまう。        
    メールアドレス:hogehoge@yyy.yyy    
    パスワード  :hogehoge    
        
SSHの場合の場合は暗号化した内容を①が送信、③は暗号化された内容を復号化して取り出す。        
    ※多分こんな感じの文章が送信されている    
    adhfgjsdfhgisdfhg    
    doifgnaejkgnskfd    
②が通信内容を傍受したとしても、傍受できるのは意味不明な文字列でありコレを意味のある文字列に復号化する方法を知らなければ内容を理解することはかなわない。        
        
、、、さて、ここで①と③はどうやって暗号化と復号化を行っているのか?という話になるわけだけど、ここで登場するのが公開鍵と秘密鍵になる。長かった。。。        

 

補足 SSHと似た言葉でSSLという単語があります。
    SSL/TLS(Secure Sockets Layer/Transport Layer Security)については以下がとてもわかりやすかった
    https://qiita.com/angel_p_57/items/dcb12a6a864f9aeba427
    https://qiita.com/satodayo/items/b45573b7165235a15152
    
    TLSSSLの違いについては、時間のある時に調査して自分の言葉でまとめようと思います。

公開鍵を使った仕組み

公開鍵暗号方式について

https://it-trend.jp/encryption/article/64-0089#:~:text=%E3%82%92%E9%AB%98%E3%82%81%E3%82%88%E3%81%86-,%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%A8%E3%81%AF,%E6%80%A7%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

共有鍵との違いについてよく説明されるのは、これのことかと思います。

個人的にわかりやすかったのはこちらの記載
https://udemy.benesse.co.jp/development/blockchain/public-key-cryptography.html

公開鍵で暗号化した文章は秘密鍵でしか復号化できない。
相手が自分宛てに送信する情報を自分だけが安全に復号化できる仕組み
、、、というのは字面として暗記しています。

公開鍵認証方式について

個人的にわかりやすかったのはこちらの記載
https://hnavi.co.jp/knowledge/blog/ssh/
SSHで利用するのはこっち!
秘密鍵で署名を作成して、公開鍵で検証を行う
サーバーに公開鍵を登録して置くことにより、自分が登録された秘密鍵を持つユーザーであることを証明できる。
AWSインスタンスを作成する時にダウンロードしているのは秘密鍵
赤の他人がユーザーを偽ってサーバーにログインできてしまうので絶対に漏らしてはイケナイ

 

https://qiita.com/angel_p_57/items/d7ffb9ec13b4dde3357d
 公開鍵認証での秘密鍵で暗号化という言葉はどうも正確ではないようです。

 

振り返り

公開鍵暗号方式と公開鍵認証が頭の中で混ざっていたことで、もやもやしていたことがわかりました。

ざっくりまとめると、復号化(チェック)が秘密鍵と公開鍵どちらでも行うパターンがある。これを理解していないことが原因だったなと

暗号化方式:公開鍵を使って暗号化し、秘密鍵で復号化する
認証方式 :秘密鍵を使って電子証明を作成、公開鍵でチェックする

※あれ?公開鍵でチェック?でも秘密鍵で復号化するんだよね???みたいな

また、調べる時に「公開鍵」という単語で検索するため
ヒットした検索が「認証」について説明しているもの「暗号化方式」について説明しているものという切り分けができておらず五里霧中という状態に、、、

同じように悩んでいる人の助けになれば幸いです。

Androidアプリケーション技術者認定試験ベーシックに合格したので振り返り

タイトルの通りです。

受験に当たりやったことなんかを振り返っていこうと思います。

 

■使った教材

・基礎&応用力をしっかり育成! Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン

・徹底攻略 Androidアプリケーション技術者認定試験ベーシック問題集 (ITプロ/ITエンジニアのための徹底攻略)

 ・クラムメディア (OA0-001 Androidアプリケーション技術者認定試験ベーシック)

 

勉強した順番は記載順と同じ。

 

■所感

クラムメディア最強

試験とほぼ同じ問題が出題されていた。

1週間あればandroidアプリ作ったことなくても、合格できる。

 

今回取得した資格に限らないけど、

この資格を取ったからandroidアプリケーションを開発できるかと言われたら絶対にできないと思う。

何を目的に資格を取得するのかによるけど、

実際にアプリを作りたい人は黒本とクラムメディアを中心に勉強すると絶対に無理

どんな仕組みやツールがあるかを知ることはできるけど、そこから自分で突っ込んで勉強しない限り意味ない。

というか試験の内容もそうだけど、出題内容が古い

sdkのバージョンは4とか6時代に作られた問題だからだと思うけど

10年以上前の問題がそのまま使われているのはどうなんすかね。

 

逆に資格を取るメリットは何だろうというと

業務やハンズオン系の書籍に登場していない概念が知れる。

こんなこと実はできるんだとかが知れるのが一番大きいと思う。

それぐらいかな、、、

 

 

City as a Serviceって?

この手の

xxxx as a Serviceって数が多すぎて覚えられない

City as a Serviceって

CaaSとか調べたら出てくるんだろうと思って

CaaSで調べるとContent as a Serviceっていうのが引っかかった

なにそれ、、、

 

このxxxx as a serive系をきれいにまとめているHPがあったので

興味がある人は下記を見てみてください。

https://boxil.jp/mag/a3600/

 

本題

City as a serviceとは

、、、良さそうな引用元をみつけれませんでした。

要はスマートシティ的なやつのようです。

ICTを利用して、都市全体の快適なサービス空間を目指すというもの。

調べると東急が大々的に取り組んでます。

2050年を目標に「世界が憧れる街づくり」を目指すとか。先が長い、、、

http://book.gakugei-pub.co.jp/tokyu-corporation-city-as-a-service-plan/

 

今後、このCity as a Serviceが加速していくらしい。

それは技術の発展によりというよりも

SDGsテック(持続可能な開発目標)」が大きく影響している様子。

 

今まで慈善活動として行われていた開発途上国での活動が

めちゃめちゃお金になるという事が話題になっているから。

詳しくはWASSHAという会社の活動を見てみてください。

https://wassha.com/

ランタンの貸し出しなんか、

わかりやすくテクノロジーを使って生活を変えていて

かつビジネスにもなっている。

 

ということで無人化とか以外にITで生活を変えていくための例でした。

なんとなくカーシェアと似ている気がするな

Windowsで作成したExcelマクロはMacOSでも動くのか?

結論

全然動かない!!

,,,

業務で必要があったので調査したけど、

移行云々の前にそもそもExcel for Macの開発タブの機能が

Windowsと違いすぎてお話にならない。

中途半端すぎて、無いほうがマシな気がする。

 

ということで実際どれくらい違うのか、まとめてみました

調査結果

 まず、「Mac マクロ」「Mac Excel VBA」とかで調べると出てくるのが

以下のような情報

・ファイルパス区切り文字が異なる(※1)

Macはソース上のバックスラッシュを認識しない(char(92)で置換する必要がある)(※1)

・セル内改行コードが異なる。(※1)

・Office2019が動くのはMac OS X 10.10 yosemite以上(※2)

 

※2
https://qiita.com/masato1230/items/58d82ede75737a56fdc1

※3
http://monomania.sblo.jp/article/151126018.html

 

まぁこれくらいなら動く簡単に移行させられそうな気がした

ところがどっこい実際に移行させてみたら次のような事象が発生した

 
・確認した端末の情報
OS       :MacOs Mojava 10.14.6
Excelのバージョン:Excel for Mac 16.16.18(200112)

■1
【関数の発火方法が異なる】
Macのエクセルでは「ActiveXコントロール」が存在しない
Windowsで「ActiveXコントロール」から追加した画面部品にマクロを設定している場合動作しない
→「フォームコントロール」から同じ見た目の部品を配置、ボタン等の部品を右クリック「マクロの登録」から発火元の関数を設定し直す必要がある。

■2
【フォームコントロールの扱いが異なる】
「1」と内容がかぶるが
ActiveXコントロール」が存在しない為、コンボボックスやラジオボタンをマクロ上から操作できない。

■3
【一部標準関数の扱い方が異なる】
GetOpenFileName関数のFileFilterに設定している引数(xlsxファイルしか選択できないようにする設定)
をマック用に変更しないとシステムエラーが発生する
■4
【マクロ付きエクセルは読み取り専用で開かれてしまう】
※原因不明

■5
Windowsと同じ方法でカレントディレクトが取得できない】
MacでCurDir関数を使用すると全角文字が文字化けしてしまう

■6
【FileSystemObjectが使えない】
Macで動くスクリプト言語を記載してVBAから実行すれば動くらしい
http://neos21.hatenablog.com/entry/2019/01/21/080000

■7
【一部標準関数の扱い方が異なる その2】
Workbooks.Open関数に「IgnoreReadOnlyRecommended」を指定すると実行時エラーになる

■8
【Dictionaryが使えない】
CreateObject(“Scripting.Dictionary”)を実行するとシステムエラーになる。
→どうしてもmapを使いたい時は自作すると使えるようになるらしい。
http://fccreator.blogspot.com/2014/03/macmacexcelvbadictionary.html

■9
【ユーザーフォームが使えない】
Windows側でuserFormを作成し、Macで確認したところフォームが消えている。
Macで右クリックしたところ、挿入の選択肢にユーザーフォームが存在しなかった。

 

間違ってる情報があったら教えていただけると嬉しいです。

 

今まで、業務ではほぼJavaしかやったことがなかったので

OSの違いによる洗礼を初めて浴びましたという話でした。

MacでEマクロを組もうとしている誰かの助けになれば幸いです。