SpringプロジェクトにSpring MVCを設定する。

前回は、Springのプロジェクトを作ってTomcatを設定するところまでやりました。

ponsuke-tarou.hatenablog.com

環境

Spring MVC を設定します。

pom.xmlに依存関係を追加します。

  • pom.xml に追記して依存関係を追加していきます。
Spring MVC のモジュールを指定します。

spring-webmvc を指定すると Spring Web やその他のSpring Frameworkの依存モジュールへの依存関係を解決できます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
Hibernate(ハイバネート) Validator を指定します。

Hibernate Validatorは、Bean Validation のリファレンス実装です。
Spring MVC は Bean Validation の仕組みを利用して入力チェックをします。
fits.hatenablog.com
you-tk.hatenablog.com

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
JCL inplement over SLF4 と Logback を指定します。

Spring はJCL(Apache Commons Logging)のAPIを使ってログ出力を行います。
そのため、SLF4JのAPIにロギング処理をブリッジするJCLの実装クラスを提供するライブラリである JCL inplement over SLF4 と
SLF4Jの実装クラスを提供するライブラリであるLogbackを指定します。
ponsuke-tarou.hatenablog.com

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

ContextLoaderListener のセットアップ

ContextLoaderListener クラスをサーブレットコンテナに登録することで、Webアプリケーション用のアプリケーションコンテキストを生成できます。
www.weblio.jp
qiita.com

空のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
}
作成したコンフィギュレーションクラスをweb.xmlに設定して、アプリケーションコンテキストを生成できるようにします。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <listener>
    <!-- ContextLoaderListenerクラスをサーブレットコンテナのリスナクラスとして指定します. -->
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <context-param>
    <!-- AnnotationConfigWebApplicationContextクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextClass</param-name>
    <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    </param-value>
  </context-param>
  <context-param>
    <!-- 作成したコンフィギュレーションクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextConfigLocation</param-name>
    <param-value>example.config.AppConfig</param-value>
  </context-param>

DispatcherServlet のセットアップ

DispatcherServletクラスをサーブレットコンテナに登録することで、Spring MVC のフロントコントローラを利用できるようにします。
Spring MVCではWebアプリケーション用のアプリケーションコンテキストとは別に、DispatcherServlet 用のアプリケーションコンテキストを作成します。

DispatcherServlet 用のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * DispatcherServlet用のコンフィギュレーションクラス.
 * EnableWebMvcアノテーション を指定すると、Spring MVC を利用するために必要となるコンポーネントのBean定義が自動で行われる.
 * ComponentScanアノテーション を指定すると、value属性に指定されたパッケージの配下にある Component や Controller などの
 * アノテーションを付与したクラスがスキャンされ、アプリケーションコンテキストにBean登録される.
 */
@Configuration
@EnableWebMvc
@ComponentScan("example.app")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    // WebMvcConfigurerAdapterクラスを継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズできる。
}
DispatcherServletクラスをサーブレットコンテナに登録します。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>
      <!-- DispatcherServletクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <!-- contextClassパラメータにAnnotationConfigWebApplicationContextを指定します. -->
      <param-name>contextClass</param-name>
      <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
    </init-param>
    <init-param>
      <!-- contextConfigLocationパラメータに作成したコンフィギュレーションクラスを指定します. -->
      <param-name>contextConfigLocation</param-name>
      <param-value>example.config.WebMvcConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. -->
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

日本語が文字化けしないようにCharacterEncordingFilter のセットアップをします。

CharacterEncordingFilterクラスをサーブレットコンテナに登録することで、画面から入力した日本語が文字化けしないようにします。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
      <!-- CharacterEncodingFilterクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
      <!-- encodingパラメータにリクエストパラメータの文字エンコーディングとしてUTF-8を指定します. -->
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <!--
       forceEncodingパラメータにリクエストとレスポンスの文字エンコーディングを上書きするかを指定します.
       trueを指定してリクエストは強制的に指定したUTF-8に上書きされ、レスポンスもUTF-8となります.
       -->
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <!-- CharacterEncodingFilterを適用するリクエストのURLパターンを指定します. -->
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Viewを判別できるように ViewResolver をセットアップします。

Spring MVC では、ViewResolver を使用してView名を解決して使用するViewを判別します。
以下メソッドを作成したWebMvcConfigに追加します。

    /** ViewResolverのセットアップ用メソッド. */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // ViewResolverRegistryクラスのjspメソッドを呼び出し JSP 用のViewResolverをセットアップします。
        // これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。
        registry.jsp();
    }

JSPからSpring MVCのtaglibが利用できるように定義を追加します。

以前作成したinclude.jspに定義を追加します。
ponsuke-tarou.hatenablog.com

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

次回は、簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

この本を読みながらやっています。

www.shoeisha.co.jp

コモン・マロウの葉っぱを食べてみた。

天ぷらにしてみた。

味がしない・・・花も単品でお茶にすると味がしない・・・体にいいからいいか。
f:id:ponsuke_tarou:20180609215853j:plain

サラダにしてみた。

味がしない・・・何にでも合わせられるともいえる。
f:id:ponsuke_tarou:20180616140012j:plain

炒めてみた。

初めて味がした。ほうれん草っぽいような気がする。
f:id:ponsuke_tarou:20180616140100j:plain

うちのブルーマロウさんの写真集

f:id:ponsuke_tarou:20180528185112j:plain
苗を植えて1ヵ月ぐらい
f:id:ponsuke_tarou:20180707103336j:plain
2018-07-07 初めて花が咲いた



ponsuke-tarou.hatenablog.com

Springのプロジェクトにプロジェクトファセットを設定する。

Tomcatを設定したのでプロジェクトファセットを設定します。
ponsuke-tarou.hatenablog.com

ファセットで、プロジェクトが使うものの定義をします。

  • ファセットの和訳 : 〔宝石などの〕面を刻む、〔物事の一つの〕相、様相

ファセットは、Java EE プロジェクトの特性および要件を定義し、ランタイム構成の一部として使用されます。
ファセットをプロジェクトに追加すると、そのプロジェクトは、特定のタスクを実行し、特定の要求を実現し、または特定の特性を持つように構成されます。
プロジェクト・ファセット

プロジェクトの作成時にはさまざまな情報が収集され、それらに基づいてプロジェクト タイプの特定、標準ライブラリの追加、コンパイラ オプションの設定、パブリッシュ タスクの制御、ビルド パスの設定、アノテーション プロセッサの追加などが行われます。これらの情報は、プロジェクトの作成中にファセットを選択することによって指定します。
http://otndnld.oracle.co.jp/document/products/wlw/docs103/guide/ideuserguide/projects/conFacets.html

Eclipseでプロジェクトファセットを設定します。

  1. [Packge Exploer]でプロジェクトを選択します。
  2. 「Command + I」でプロジェクトの設定画面を開きます。
  3. 左側のメニューで[Progect Facets]を選択します。
  4. [Convert to Faceted...]リンクを押下します。f:id:ponsuke_tarou:20180311225506p:plain
  5. [Project Facet]の一覧で[Java]にチェックを入れて[Version]を「1.8」にします。
  6. [Dynamic Web Module]にチェックを入れて[Version]を「3.1」にします。
  7. 下の方に出てくる[Further configuration available...]リンクを押下します。f:id:ponsuke_tarou:20180311230123p:plain
  8. [Modify Faceted Project]画面で以下を設定します。
    • Content directory : /WebContent
      • HTMLや、CSSや、画像ファイルなどのコンテンツを格納するディレクトリルートです。
      • デフォルトで入っていたらそのままで。
    • Generate web.xml....... : チェックする
  9. [OK]ボタンを押下します。
  10. [Dynamic Web Module]で[Runtimes]を押下します。
  11. [Apatch Tomcat v8.0]にチェックを入れます。f:id:ponsuke_tarou:20180311230759p:plain
  12. [Apply] > [OK]ボタンを押下します。

f:id:ponsuke_tarou:20180606155313j:plain

わいるどふらい(WildFly)って何?から学ぶEJB

WildFlyは、オープンソースJavaEEアプリケーションサーバです。

WildFlyは、Javaで記述されたサーバサイドアプリケーションを動作させるための基盤を提供します。
www.ossnews.jp

JBoss Application Serverから改名しました。

WildFly(ワイルドフライ)とは、JBoss AS(コミュニティ版)とJBoss EAPエンタープライズ版)との混同を避けるため2014年4月にJBoss ASが改名された名称です。
その為、名称が変更されたのみとなっており、開発コミュニティ(オープンソースプロジェクト)やソフトウェア自体などJBoss ASと変わりません。
www.ossplaza.com

JBoss Application Server は1999年にEnterprise JavaBeansコンテナとして開発をされたJ2EEアプリケーションサーバです。
www.ossplaza.com

Tomcatとの違いはEJBが使えることです。

同様なサーバサイドプラットフォームとして「Tomcat」があります。
Tomcat」はJSP/Servletを処理するアプリケーションサーバです。
WildFly」は、TomcatをWebコンテナとして搭載しています。そのため、EJBJSP/Servletの両方を処理できます。
www.ossnews.jp

Tomcatで提供される機能は基本的にServlet, JSP, JDBC接続プールのみで、他のものは提供されていません。シンプルですが、他のものが必要になったときに、それらをインテグレーションするコストが発生するなど、少し面倒なことになります。
TomcatになくてJBossにあるものを軽く列挙してみます。

Java EEなもの
JTAトランザクションマネージャ
EJB
MDB
JPA
・JMS
JCA
JAX-WS
JBoss固有なもの
JMX
log4jを用いたログ基盤
・分散キャッシュなどの各種クラスタリングサービス
nekop.hatenablog.com

log4jはログを出力するAPIです。

ponsuke-tarou.hatenablog.com

EJBは、JavaEEに既定されているサーバサイド向けのJavaBeansです。

EJBを利用したシステムの開発者は必要な機能を「Bean」(ビーン)と呼ばれるJavaクラスとして開発していき、これを繋ぎ合わせてアプリケーションを構築する。BeanはEJBの仕様に準拠したアプリケーションサーバに組み込まれて実行される。サーバ側でトランザクション処理やDI(Dependency Injection:依存性注入)、セキュリティ制御などの諸機能を提供してくれるため、Beanの開発者はこれらに個別に対応する必要はなく、自らのビジネスロジックの記述に集中できる。
e-words.jp

まず、JavaBeansはJavaで書かれた再利用可能なソフトウェアコンポーネントのことです。

Java Beansはプログラムの再利用を目的としており、汎用的なロジックで構成されているクラスである。Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 サーバーサイド向けのJavaBeansはEnterprise JavaBeansと呼ばれている。
JavaBeans - Wikipedia

JavaBeansは、Sun Microsystems社のJavaBeans仕様に準拠した再使用可能なソフトウェア・コンポーネントです。JavaBeans仕様は、JavaBeanとなる一式のJavaクラスによって実装されるインタフェースおよびパッケージングの詳細を規定します。 開発者は、JavaBeansをプログラムを使用して組み合せるか、Oracle JDeveloperなどのビジュアル・プログラミング環境を使用してアプリケーションを作成できます。
http://otndnld.oracle.co.jp/tech/java/htdocs/java_roadmap/javabean/listing.htm

技術的な仕様のことを指してJavaBeansということもあります。

Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 再使用可能なコンポーネントを作成できる。
http://otndnld.oracle.co.jp/tech/java/htdocs/java_roadmap/glossary.htm#434709

JavaBeansの特徴

JavaによるWebアプリケーション入門

①プロパティ

JavaBeansは、「プロパティ」と呼ばれるものをもつJavaクラスです。あるBeanが持つ「属性」を「プロパティ」と考えることができます。
Javaのクラスでは、クラスの属性は、クラス中のフィールドで表現されると考えられます。ところが、あるBeanが持つプロパティは、クラスのフィールドとは関係ありません。ある特定のネーミング・ルールに従ったメソッドの存在が、そのBeanのプロパティを決めているのです。
JavaBeansのネーミング・ルールでは、あるBeanに次のようなメソッドがあるとき、そのBeanにはtitleというプロパティが存在することになります。

String getTitle ( ) ;
void   setTitle ( String title);
  • ネーミング・ルール
    • setter、getter:プロパティ名の先頭の文字を大文字にして、"set"や"get"の文字を加える
      • setter名 = "set" + ( プロパティ名 )'
      • getter名 = "get" + ( プロパティ名 )'
    • プロパティ名:setter名やgetter名から、先頭の"set"、"get"を取り除いた文字列
      • プロパティ名 = ( setter名から、先頭の"set"を取り除いたもの ) = ( getter名から、先頭の"get"を取り除いたもの )
② 永続化

Beanは、必要に応じてオブジェクトの状態を保存したり、復元したりすることができなければいけません。このことを、Beanを「永続化」する、といいます。このためには、Beanにjava.io.Serializableインタフェースを実装する必要があります。このインタフェースにはメソッドは定義されていないので、次のように定義するだけで構いません。

import java . io . Serializable;

public class HogeBean implements Serializable {
     .....
}
③ 引数無しのコンストラク

Beanには引数無しのコンストラクタが必要です。

import java . io . Serializable;

public class HogeBean implements Serializable {
public HogeBean ( ) {
.....
}
.....
}

Beanの種類

Session Bean:セッションを保持し、一時的なロジックを保存するオブジェクト

ビジネスロジックを実装するためのEnterprise Bean

  • Stateful Session Bean:クライアントごとの状態を保持するセッションBean
  • Stateless Session Bean:クライアントごとの状態を保持しないセッションBean
  • Singleton Session Bean:常に同じインスタンスへのアクセスが保証されているシングルトンなセッションBean
Message Driven Bean ( メッセージ駆動型Bean):非同期処理の記述などJMS(Java Message Service)を使い、非同期のメソッドの呼び出しをサポートするEnterprise Bean
Entity Bean:永続的なデータを保存するオブジェクト、(Java EE 7)EJB 3.2で廃止

f:id:ponsuke_tarou:20180529002156j:plain

うちの庭という名の極小花壇

せり科

イタリアンパセリ

  • 学名:Petroselinum neapolitanum
  • 分類:セリ科オランダゼリ属
  • 原産地:地中海
  • 2018-07-07 週に1度は収穫してサラダにしている。

f:id:ponsuke_tarou:20180707225927j:plain

グラジオラス

f:id:ponsuke_tarou:20180626080911j:plain
f:id:ponsuke_tarou:20180626080935j:plain

アボカド

ハス

  • 2018-05-24 数年前に生ゴミを花壇にコンポストしたらガンガン生えてきた。現在4本成長中。虫もつかないが実もつかない。余裕で越冬してひたすらでかくなる。

f:id:ponsuke_tarou:20180529221234j:plain

パッションフルーツ

パッシフロラ・エドゥリス

  • 別名:クダモノトケイ
  • 原産地:ブラジル、パラグアイ
  • 収穫期:6-8月
  • 紫色系は、自家受粉性で1本で実がなる。
  • 2018-05-24 3年で1つしか実がならないがよくでかくなる。

あじさい

名称不明

f:id:ponsuke_tarou:20180520100157j:plain

ダンスパーティー

f:id:ponsuke_tarou:20180528185223j:plain

シソ科

ラベンダー

アングスティフォリア
  • 別名:イングリッシュラベンダー
  • 学名:Lavandula angustifolia
  • 名称不明

f:id:ponsuke_tarou:20180528185004j:plainf:id:ponsuke_tarou:20180609223003j:plain

  • ほのか

f:id:ponsuke_tarou:20180513135643j:plain

ストエカスラベンダー
  • 別名:フレンチラベンダー
  • 学名:Lavandula stoechas
  • 名称不明
    • 2018-05-22 春に盛大に切り戻したので今年のお花は諦める。

f:id:ponsuke_tarou:20180523083420j:plain
f:id:ponsuke_tarou:20180528185203j:plain

ラベンダーデンタータ
  • 別名:フリンジラベンダー、キレハラベンダー
  • 学名:Lavandula dentata
  • 名称不明

f:id:ponsuke_tarou:20180513142024j:plain

  • 名称不明

f:id:ponsuke_tarou:20180528184939j:plainf:id:ponsuke_tarou:20180609223043j:plain

ローズマリー

f:id:ponsuke_tarou:20180520100057j:plain

タイム

  • 別名:タチジャコウソウ、イブキジャコウソウ
  • 学名:Thymus vulgaris L.
  • 分類:シソ科イブキジャコウソウ属(ティムス属)
コモンタイム

f:id:ponsuke_tarou:20180520105234j:plain

ゴールデンレモンタイム
  • 学名:Thymus x citriodorus ”Aureus”

f:id:ponsuke_tarou:20180520105259j:plain

  • 2018-05-29 使いきれなくてオリーブオイルに突っ込んだ。流行りのハーバ何とかっぽい。

f:id:ponsuke_tarou:20180529222042j:plain

スペアミント

f:id:ponsuke_tarou:20180817083414j:plain

マロウ

ゼニアオイ

f:id:ponsuke_tarou:20180707103336j:plain
初めて咲いた花

ユリ科

ゆり

夫婦百合

f:id:ponsuke_tarou:20180520095741j:plain

名称不明

f:id:ponsuke_tarou:20180520102111j:plain
f:id:ponsuke_tarou:20180619223559j:plainf:id:ponsuke_tarou:20180626081022j:plain

デルフィニウム

ブルーミラー

  • 学名:Delphinium chinensis
  • 別名:Larkspur、オオヒエンソウ
  • 耐寒性1年草
  • 2018-05-22 地植えしてから1年草なのを知った。1回目の花をドライフラワーにしたら凄く色が残って良かった。

f:id:ponsuke_tarou:20180513141419j:plain
f:id:ponsuke_tarou:20180528185245j:plain

トリフォリウム

  • 学名:Trifolium

プリンセス・クローバー

  • 学名:Trifolium repens
  • 分類:マメ科シャジクソウ属(トリフォリウム属)
  • 多年草
  • レオノーレ

f:id:ponsuke_tarou:20180513142006j:plain

コウモリラン

  • 別名:ビカクシダ
  • 分類:ウラボシ科ビカクシダ属
  • 原産地:東南アジア、ポリネシア、亜熱帯オーストラリア
  • 樹木や岩などに付着して生育する着生シダ
  • 根を保護したり落ち葉や雨水などを受けるための付着葉と、繁殖のための胞子がつく胞子葉、2種類の葉がある

f:id:ponsuke_tarou:20180520095534j:plain

月桂樹

f:id:ponsuke_tarou:20180520101148j:plain


雲仙コメツツジ

f:id:ponsuke_tarou:20180524083628j:plain

キク科

ムギワラギク

  • 別名:帝王貝細工(ていおうかいざいく)
  • 分類:キク科ムギワラギク属
  • 学名:Xerochrysum bracteatum
コロロ
  • フランボワーズ

f:id:ponsuke_tarou:20180513140444j:plain

ダリア

  • 学名:Dahlia
  • 別名:テンジクボタン
  • キク科テンジクボタン属(ダリア属)
ラベラ・ピッコロ

f:id:ponsuke_tarou:20180523083157j:plain

カモミール

  • 学名: Matricaria chamomilla
  • 分類:キク科カミツレ
  • 2018-05-22 種から育成中。

f:id:ponsuke_tarou:20180524083724j:plain

ティランジア

銀葉種

チランジア・カプトメドゥーサエ

f:id:ponsuke_tarou:20180520234219j:plain

サンスベリア

  • 学名:Sansevieria trifasciata
  • 分類:キジカクシ科チトセラン属(サンスベリア属)※分類体系によってリュウゼツラン科
  • 別名:チトセラン、厚葉千歳蘭

サンスベリア・トリファスキアタ・ローレンティ

  • 学名:Sansevieria trifasciata 'Laurentii'
  • 別名:トラノオフクリンチトセラン
  • 原産地:熱帯アフリカ
  • 2018-05-22 水に入れておいたら切断面から根がめきめき出ていた。

f:id:ponsuke_tarou:20180523083000j:plain

お亡くなりになってしまった方々

すみれ

ムーランフリルネロ
  • スミレ科ビオラ
  • 時間が立つと黒から濃い紫色に変色していく
  • 2018-05-22 ナメクジの餌食中。
名称不明
  • 2018-05-22 ナメクジの餌食中。
  • 2018-06-20 ナメクジの餌食になったところをバッサリ切ったら蘇らなかった・・・。

f:id:ponsuke_tarou:20180523002513j:plain

MacにPython3とPyCharmをインストールする方法

  • 環境 : macOS Catalina Version10.15.6

Mac にはデフォルトでPython2がインストールされています。

% python --version
Python 2.7.16

% which python
/usr/bin/python

Python3 をインストールします。

  1. Download Python | Python.orgを表示します。
  2. pkgファイルをダウンロードします。
    • 今回は「python-3.8.5-macosx10.9.pkg」
    • f:id:ponsuke_tarou:20180512230455p:plain
  3. pkgファイルをダブルクリックしてインストーラーを起動します。
  4. f:id:ponsuke_tarou:20180512231153p:plain
  5. f:id:ponsuke_tarou:20180512231206p:plain
  6. f:id:ponsuke_tarou:20180512231211p:plain
  7. f:id:ponsuke_tarou:20180512231303p:plain
  8. f:id:ponsuke_tarou:20180512231311p:plain

バージョンと場所を確認します。

バージョンを確認するコマンドはPython2だと `python --vesion` でしたが、Python3は `python3 --version` になります。

% python3 --version
Python 3.8.2

% which python3    
/usr/bin/python3
注意:デフォルトであったPython2を消してはなりません。

Apple が提供している Python のビルドは /System/Library/Frameworks/Python.framework と /usr/bin/python にそれぞれインストールされています。これらは Apple が管理しているものであり Appleサードパーティのソフトウェアが使用するので、編集したり削除したりしてはいけません。
4. Macintosh で Python を使う — Python 3.8.6rc1 ドキュメント

統合開発環境であるIDLEを起動します。

  1. Lanchpad から IDLE を起動します。
    • f:id:ponsuke_tarou:20180512233532p:plain
  2. インタラクティブシェル が表示されます。
    • この画面で頑張っているのがインタラクティブシェルという方だそうです。
    • ここで具体的な操作を行うそうです。
    • f:id:ponsuke_tarou:20180513002509p:plain
  3. 「Hellow Python」と表示させてみます。
    • 画面の>>>は入力待ち状態です。
>>> print('Hellow Python')
Hellow Python

統合開発環境であるPyCharmをインストールします。

Homebrewでインストールします。

# インストール前に健康診断します。
% brew doctor
Your system is ready to brew.

# updateもしておきます。
% brew update
Updated 3 taps (homebrew/core, homebrew/cask and homebrew/cask-fonts).
==> New Formulae
#...省略...
==> Deleted Casks
hand-mirror                                                                                      jing

# バージョンはこんな感じに見えました。
% brew --version
Homebrew 2.5.2
Homebrew/homebrew-core (git revision 0b6544; last commit 2020-09-29)
Homebrew/homebrew-cask (git revision be3785; last commit 2020-09-29)

# 無料のCommunity版であるpycharm-ceをインストールします。
% brew search pycharm
==> Casks
pycharm                                pycharm-ce                             pycharm-ce-with-anaconda-plugin        pycharm-edu                            pycharm-with-anaconda-plugin

# brew caskでインストールします。
% brew cask install pycharm-ce
==> Downloading https://download.jetbrains.com/python/pycharm-community-2020.2.2.dmg
==> Downloading from https://download-cf.jetbrains.com/python/pycharm-community-2020.2.2.dmg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'pycharm-ce'.
==> Installing Cask pycharm-ce
==> Moving App 'PyCharm CE.app' to '/Applications/PyCharm CE.app'.
🍺  pycharm-ce was successfully installed!

起動してみます。

  1. f:id:ponsuke_tarou:20200929213418p:plain
    インストールできました。
  2. f:id:ponsuke_tarou:20200929213838p:plain
  3. f:id:ponsuke_tarou:20200929213910p:plain
  4. f:id:ponsuke_tarou:20200929213923p:plain

PyCharmでプロジェクトを作成します。

参考 : ステップ 1. 最初のPythonプロジェクトを作成して実行する-ヘルプ| PyCharm

  1. [New Project]を選択します。
  2. [Location:]でプロジェクトを作成するディレクトリを選択します。
  3. [New enviroment useing]で仮想環境の作成ツールを「Virtualenv」に選択します。
  4. [Base intersepter]にはインストールしたPython3.8が選択されていることを確認します。
  5. [Create]ボタンでプロジェクトを作成します。

f:id:ponsuke_tarou:20201006212140p:plain

仮想環境を作成します。
  1. Command + ,で設定ダイアログを開きます。
  2. [Project: {プロジェクト名}] > [Python Interpeter] > 歯車アイコン > [Add...]でダイアログを開きます。
  3. [Virtualenv Enviroment] > [New enviroment] > [Location:]で仮想環境の作成場所を選択します。
  4. [OK]ボタンで仮想環境を作成します。
    • f:id:ponsuke_tarou:20201006214124p:plain
  5. [OK]ボタンで設定ダイアログを閉じるとプロジェクトツールウィンドウに仮想環境用のディレクトリが表示されています。
    • f:id:ponsuke_tarou:20201006214924p:plain
ライブラリをインストールします。
  1. 画面下にある[Terminal]でターミナルを開きます。
  2. pip install {ライブラリ}の形式で開発に必要なものをインストールする
# 数値計算ライブラリであるNumPyをインストールします。
(venv) pon@mac tryPython % pip install numpy
Collecting numpy
  Downloading numpy-1.19.2-cp38-cp38-macosx_10_9_x86_64.whl (15.3 MB)
     |████████████████████████████████| 15.3 MB 2.9 MB/s 
Installing collected packages: numpy
Successfully installed numpy-1.19.2

# CSVやExcelファイルを読み込めるPandasをインストールします。
(venv) pon@mac tryPython % pip install pandas
Collecting pandas
# ...省略...
Installing collected packages: six, python-dateutil, pytz, pandas
Successfully installed pandas-1.1.3 python-dateutil-2.8.1 pytz-2020.1 six-1.15.0

# pip listでインストールしたライブラリを確認できます。
(venv) pon@mac tryPython %  pip list
Package         Version
--------------- -------
numpy           1.19.2
pandas          1.1.3
pip             20.2.3
python-dateutil 2.8.1
pytz            2020.1
setuptools      50.3.0 
six             1.15.0
ソースファイルを作成します。
  1. プロジェクトツールウィンドウでプロジェクトを選択した状態でCommand + Nでメニューを表示します。
  2. [Python File]を選択してダイアログを開きます。
    • f:id:ponsuke_tarou:20201006220553p:plain
  3. ソースファイル名を入力してEnterでファイルを作成します。
やりたいことをやります。

qiita.com

Windowsにインストールしたい場合

ponsuke-tarou.hatenablog.com

ディジタル証明書の有効性はCRLで確認します。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

特定の認証局が発行したCRLに関する記述のうち,適切なものはどれか。

  1. CRLには,失効したディジタル証明書に対応する秘密鍵が登録される。
  2. CRLには,有効期限内のディジタル証明書のうち失効したディジタル証明書と失効した日時の対応が提示される。>> 正解
  3. CRLは,鍵の漏えい,破棄申請の状況をリアルタイムに反映するプロトコルである。
  4. 有効期限切れで失効したディジタル証明書は,所有者が新たなディジタル証明書を取得するまでの間,CRLに登録される。

平成27年秋期問2 CRLに関する記述|情報処理安全確保支援士.com

CRLは、有効期限内に失効したディジタル証明書の一覧です。

  • 英語 : Certificate Revocation List
  • 日本語 : 証明書失効リスト
  • CRLに書いてあること : 証明書のシリアル番号 と 失効日

CRLとは有効期限よりも前に失効させたデジタル証明書の一覧です。有効期限よりも前に失効させるというのは、例えば証明書の誤発行や証明書の秘密鍵紛失で悪用されるのを回避するための処置です。認証局では、そのような証明書をCRLに登録して管理します。
CRL(証明書失効リスト)とは、OCSPとは | ネットワークエンジニアとして

認証局が管理する、失効済み電子証明書の一覧。
CRLの仕様は、電子証明書と同様にX.509の規格で決められています。また、CRLにはリストを発行した認証局電子署名を行っているので、電子証明書と同じく偽造はほぼ不可能といえます。
証明書失効リスト (CRL)|SSLサーバ証明書 ジオトラスト

本来のユーザーから失効の申し出があると、認証局はその情報を CRL に追加する。また、デジタル証明書の記載内容が変更されることもある。こういった場合も、認証局に申請すると CRL に加えることができる。
【公式】NTTPCコミュニケーションズ

CRLは認証局(CA)から定期的に最新のものが配布されています。CRLの仕様はデジタル証明書の仕様を定めたITU-T X.509で標準化されています。
CRL(Certificate Revocation List) | セコムトラストシステムズのBCP(事業継続計画)用語辞典

有効期限前に失効される理由は色々あるらしいです。

  • 送信データを暗号化する鍵データが入ったパソコンを紛失した >> 誰かが使わないように失効させる
  • 間違って発行してしまった >> 使わないから失効させる
  • 被発行者の規則違反 >> 証明したくないから失効させる

受け取ったデジタル証明書は、CRLを突き合わせて有効かを確認できます。

方法1. CRLファイルをダウンロードして突き合わせて確認します。

CRLファイルを実際に見てみました。
qiita.com

方法2. OCSPというプロトコルを使ってオンラインで確認します。

  • 英語 : Online Certificate Status Protocol
  • 日本語 : オンライン証明書状況プロトコル

OCSP(Online Certificate Status Protocol)は、ブラウザなどのクライアントが、認証局が提供するOCSPサーバーに対して証明書のシリアル番号を問合せ、OCSPサーバーが証明書のステイタスを返すという仕組みです。
証明書の失効:CRL(Certificate Revocation Lists) とOCSP | rms.ne.jp

OCSP は、オンラインで証明書の失効情報を確認するためのプロトコルであり、RFC2560 に規定されています。証明書利用者(OCSP リクエスタ)は、OCSP レスポンダ(OCSP サーバーとも呼ばれる)に失効情報を問い合わせます。OCSP レスポンダは、問い合わせに対して証明書の状態 について、有効(good)、失効(revoked)、不明(unknown) のいずれかとして返します
f:id:ponsuke_tarou:20180411213603p:plain
KI関連技術に関するコンテンツ

デジタル証明書の有効性をリアルタイムで確認するプロトコルOCSPサーバはCA自身や、CRLを集中管理するVAが運営する。OCSPクライアントはサーバに対してデジタル証明書を確認させることによって、自力でのCRL取得や照合の手間を省略できる。
OCSP(Online Certificate Status Protocol)とは - IT用語辞典 e-Words

リアルタイムでディジタル証明書の失効情報を検証し、有効性を確認するプロトコル。対象となるディジタル証明書のシリアル番号をVA(証明書有効性検証局)に送信し、有効性の検証結果を受け取る機能を提供する。
OCSP|情報セキュリティマネジメント試験.com

OCSPレスポンダにサーバが問い合わせをしてその応答をキャッシュしておいて、そのキャッシュを基にクライアントに送信する方法をOCSP Staplingと言います。

OCSP Staplingとは、WebサーバーなどのSSLサーバ証明書を提示するサーバーが認証局OCSPレスポンダーに問合せを行い、そのキャッシュされた結果を、証明書とともにブラウザなどのクライアントに提示するという仕組みです。
このキャッシュされた結果は、サーバーとクライアントのTLS/SSLハンドシェイクの過程でCertificate Status Requestとして利用されます。
rms-digicert.ne.jp

OCSP Stapling(ステープリング)では、クライアントがOCSP要求を行うのではなく、サーバがOCSP要求を行い、その応答をキャッシュする。サーバはキャッシュしたOCSP応答を、サーバ証明書と一緒にクライアントに送信する。これによりクライアントはOCSP responderに問い合わせる必要がなくなり、HTTPS通信の開始を高速化することができる。
https://camo.qiitausercontent.com/106767202f346a246a3401a6e435c2dff007cff1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f353231382f66616361363436622d346533302d656164642d343238612d6437623066303332613433362e706e67

qiita.com

OCSP の問題のひとつは、SSL ハンドシェイク時にウェブサーバとクライアント間の通信に加えて、クライアントが OSCP サーバへ通信するという実質 3 者間の通信になっておりこれが SSL ハンドシェイク時のオーバーヘッドになっていることです。OCSP ステープリングは、ウェブサーバがウェブブラウザの代わりに OSCP レスポンダに問い合わせ、SSL ハンドシェイクの際に OCSP レスポンスをクライアントに提供するというメカニズムです。※ 8 これはすでに IETF RFC6066 で定義されています。
f:id:ponsuke_tarou:20180412000041p:plain
https://www.jp.websecurity.symantec.com/welcome/pdf/wp_ssl_handshake.pdf

実際に見てみました。

qiita.com

CRLを集中管理して検証してくれるのはVAです。

  • 英語 : Validation Authority
  • 日本語 : 検証局
  • 別名 : 証明書有効性検証局

認証局(CA)と違い、デジタル証明書の発行は行わず、検証機能に特化しているためこのように呼ばれる。クライアントからの問い合わせに応じて、CAの公開鍵で署名の正当性を検証したり、証明書の有効期限を確認したりする。
e-words.jp

デジタル証明書の有効性を確認する検証機能のみを行うので、証明書を発行する認証局とは区別する意味合いから異なる名称がついています。VAがCRLを集中管理することで無効な証明書にすばやく対応することができます。
www.secomtrust.net

クライアントからのディジタル証明書の有効性に関する問い合わせに対し、署名の検証、有効期限の確認、CRLの確認などを行い、有効性の可否を応答する役割をもつPKIの機関。
VA|情報セキュリティマネジメント試験.com

f:id:ponsuke_tarou:20180411220714j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

ディジタル署名の公開鍵を保証するディジタル証明書

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

ディジタル証明書に関する記述のうち,適切なものはどれか。

  1. S/MIMETLSで利用するディジタル証明書の規格は,ITU-T X.400で標準化されている。
  2. ディジタル証明書は,TLSプロトコルにおいて通信データの暗号化のための鍵交換や通信相手の認証に利用されている。
  3. 認証局が発行するディジタル証明書は,申請者の秘密鍵に対して認証局ディジタル署名したものである。
  4. ルート認証局は,下位の認証局の公開鍵にルート認証局の公開鍵でディジタル署名したディジタル証明書を発行する。

情報セキュリティスペシャリスト平成29年秋期 午前Ⅱ 問10

ディジタル証明書は、公開鍵暗号方式において公開鍵の正当性を保証するものです。

デジタル署名だけではそもそも配布されている公開鍵が本当に正しい公開鍵(下図ではAさんの公開鍵)なのかを確認することができません。デジタル署名の解析用の公開鍵が正しいことを証明するためにはデジタル証明書を使用します。
https://www.infraexpert.com/studygif/security17.gif
デジタル証明書の仕組み

デジタル証明書は、証明したい内容に対して「ハッシュ化」と「秘密鍵による暗号化」を行ったものです。
証明書を信頼できる第三者機関から発行してもらうことで、公的な確認(証明)ができる仕組みです。
デジタル署名とデジタル証明書 CapmNetwork

デジタル署名単独では公開鍵が本人のものであるか確認できないが、デジタル証明書をデジタル署名に付属させることにより、データが改ざんされていないこととともに(この機能はデジタル署名単独で実現できる)、データの作成者を認証局を通して証明することができる。
デジタル証明書(電子証明書)とは - IT用語辞典 e-Words

受信者に届いたデータは、送信者からのデータであることを確認できます。

ディジタル証明書をもつA氏が,B商店に対して電子メールを使って商品の注文を行うときに,A氏は自分の秘密鍵を用いてディジタル署名を行い,B商店はA氏の公開鍵を用いて署名を確認する。この手法によって実現できることはどれか。ここで,A氏の秘密鍵はA氏だけが使用できるものとする。

ウ. B商店に届いた注文は,A氏からの注文であることを確認できる。
平成26年秋期問37 ディジタル証明書で確認できること|基本情報技術者試験.com

ディジタル証明書は、認証局(CA)と呼ばれる第三者機関によって発行された、個人や企業(のサーバ)に対する電子式の証明書です。
ディジタル証明書には「発行者ID」「主体者ID」「有効期間」などの情報が含まれ、その信頼性を保証するため認証局ディジタル署名が付されています。
平成27年春期問45 社員のスマートフォンの認証|基本情報技術者試験.com

ディジタル証明書の有効性はCRLで確認します。

ponsuke-tarou.hatenablog.com

SSL/TLSでのクライアントとサーバでのやり取りではディジタル証明書が使われます。

ponsuke-tarou.hatenablog.com

f:id:ponsuke_tarou:20180408213510j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

送ったデータの完全性を保証するためのディジタル署名

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

XMLディジタル署名の特徴はどれか。

  1. XML文書中の、指定したエレメントに対してデタッチ署名(Detached Signature)することができる。
  2. エンベローピング署名(Enveloping Signature)では一つの署名対象に必ず複数の署名を付ける。
  3. 署名形式として、CMS(Cryptographic Message Syntax)を用いる。
  4. 署名対象と署名アルゴリズムをASN.1によって記述する。

平成28年秋期問4 XMLディジタル署名の特徴|情報処理安全確保支援士.com

ディジタル署名でデータがなりすましや改ざんが行われていないことを証明します。

・ファイルにくっつけるデータだよ
・ファイルの正当性を証明するよ
・誰が作ったかを示すよ
・改ざんされていないことを示すよ
デジタル署名とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

https://www.ninsho.co.jp/explanation/images/digitalsign01.gif
NDN:電子入札・電子認証講座|電子署名|日本電子認証株式会社

送信者は、メッセージの原文から一定の計算手順で割り出した短いデータを文書に添付して送信する。受信者は受け取った署名データを一定の手順でこれを検証することにより、文書に署名を行ったのが送信者本人であることや、文書が通信途上で改ざんされていないことなどを確認することができる。
電子署名(デジタル署名)とは - IT用語辞典 e-Words

送信側のデータをハッシュ値にしてデータと一緒に送信し、受信側でもデータをハッシュ値にして比較することで改ざんされていないことを確認する仕組みをメッセージ・ダイジェストといいます。

https://www.ibm.com/developerworks/jp/websphere/library/web/web_security/i/1_8.gif
Webセキュリティー入門 第1回「セキュリティー対策を考える」 – IBM Developer

https://thinkit.co.jp/images/marugoto/2/1/9/27.gif
[ThinkIT] 第9回:メッセージダイジェスト関数 (1/2)

データから生成したハッシュ値ダイジェスト値といいます。

https://www.ipa.go.jp/security/pki/images/image019.png
PKI関連技術に関するコンテンツ

データのダイジェスト値ハッシュ関数で取得して、それを秘密鍵で暗号化します。

データの送信者はまず作成したデータを自分の秘密鍵を使って暗号化するとともに、データのハッシュ値ハッシュ関数によって算出する。ハッシュ値は、元のデータを逆算できないという特殊な値で、算出したハッシュ値を自分の秘密鍵を使って暗号化する。送信者は受信者にあらかじめ公開鍵を渡しておき、暗号化したデータと暗号化したハッシュ値を受信者に向けて送信する。
KDDI株式会社――Tomorrow, Together

「署名」はハッシュ値を暗号化した値のことです。

デジタル署名を利用する前提として、送信者と受信者の間で公開鍵の入手とハッシュ関数の共有が必要となる。仕組みとしては、送信者はデータの一部分のハッシュ値を計算し、それをあらかじめ入手してある送信先の公開鍵で暗号化する。そして、元データとともにその暗号化したハッシュ値(署名)を送信する。
デジタル署名 − @IT ネットワーク用語事典

メッセージダイジェスト(またはハッシュ値)と呼ばれるデータを暗号化します。メッセージダイジェストハッシュ値)とは、本文より「ハッシュ関数」という一方向関数を用いて抽出したビットデータのことを言います。「ハッシュ関数」という関数を用いると、本文から一定の長さのビット列(0と1の羅列)が抽出されます。ハッシュ関数とは、ビット列から全く異なるビット列と作り出す関数になります。
デジタル署名・電子署名とは何か?|ハッシュ関数とメッセージダイジェスト

f:id:ponsuke_tarou:20201001223305j:plain
新潟の月岡温泉で買ったがま口

XMLディジタル署名XML要素として署名を付けられます。

  • 英語 : XML digital signature
  • 別名 : XML署名

XMLディジタル署名には、以下の特徴があります。

・署名対象、署名アルゴリズムメッセージダイジェストおよび証明書などをXMLの文法で表現している。
ディジタル署名XMLタグ付き言語であり分かりやすい。
・任意のデータファイルやXML文書の全体だけではなく、XML文書の一部に対しても署名を付けることができ、部分署名や多重署名などができる。
XML署名で参照する暗号アルゴリズムなどのオブジェクトの識別子は、W3Cなどで定めているURIを参照する。
平成28年 秋期 情報セキュリティスペシャリスト 午前II 問4

署名対象のダイジェスト値ハッシュ値)を求め、ダイジェスト値を子要素としてXML署名情報要素に入れ、さらにその署名情報要素に対してダイジェスト値と署名値を計算し挿入する。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

XML 署名では、XML ドキュメントに埋め込むか、別の方法で XML ドキュメントに関連付けることができる一連の XML 要素を定義します。これによって、受信者は、メッセージが変更されておらず、送信者が意図したとおりのものであることを確認できます。
https://msdn.microsoft.com/ja-jp/library/cc465608.aspx

デジタル・コンテンツに対するデジタル署名に署名し、それを検査するための XML 構文および処理規則を定義する仕様です。 この仕様は、World Wide Web Consortium (W3C) および Internet Engineering Task Force (IETF) による共同開発です。
IBM Knowledge Center

インターネット上での情報交換のためのフォーマットとしてXMLが使われるので、XMLデジタル署名を付与するする必要があります。

近年、インターネット上での情報交換のためのフォーマットとして、XML(eXtensible Markup Language)が注目を浴びています。XML は拡張可能なマークアップ言語 [75] であり、テキストファイルでありながら構造化された情報を柔軟に扱うことができます。XML は、HTML の元ともなった SGML から、インターネットでの情報交換に必要な箇所を抽出したサブセットです。

XML 文書に対する改ざん、なりすましを防ぐために、デジタル署名の機能が求められています。現在、XMLデジタル署名を付与するための規格として、W3C (World Wide Web Consortium) において「XML 署名(XML Signature)」の標準化が進められています。XML の署名要件(RFC2807)、XML 署名構文と処理(RFC3075)、XML の正規化 (RFC3076) が RFC として公表されています。
PKI関連技術に関するコンテンツ

XML署名の種別

http://image.itmedia.co.jp/ait/articles/0207/24/r12webserv01.gif
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

https://www.ipa.go.jp/security/pki/images/image087.png
https://www.ipa.go.jp/security/pki/images/image088.png
PKI関連技術に関するコンテンツ

XML文書中の任意のエレメントに対してつけることができるのがデタッチ署名です。

  • 英語 : Detached Signature

対象データと署名を別々のところに置いとけるのはデタッチ署名です。

Detached Signature(デタッチ署名)
署名要素と署名対象要素が独立している場合の署名形式。(署名対象別のファイルである場合や同じXML文書内でも要素の親子関係がないときなど)
平成28年秋期問4 XMLディジタル署名の特徴|情報処理安全確保支援士.com

署名対象要素と署名要素が独立した署名形式(sibling elements)である。
Detached署名は、署名対象データに任意の電子ファイル(Word、ExcelMPEG画像データ、XML文書など)を指定して、署名対象データをXML署名部分とは独立させ外部ネットワークやローカルファイルに置くことができる。またXML文書内にXML署名要素とXML署名対象要素を並列に配置させることもできる。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

エンベロープ署名は、複数の人の署名を付けられます。

署名要素が署名対象要素の子要素となる署名形式である。
Enveloped署名は同じ文書に複数人の署名を付けるなどの用途に適している。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

エンベローピング署名では署名要素の子要素として対象データを指定します。

署名要素が署名対象要素の親要素となる署名形式である。
Enveloping署名は署名対象要素を包含した形式で、医療のカルテのように初めの医師が署名したカルテに、次の医師が新しく書き添えた部分のみに署名を加えていくような用途に適している。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

f:id:ponsuke_tarou:20180408212311j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

パラメータと引数の違い

似ているし、意思疎通にはそれほど困らないけど・・・「引数 == パラメータ」ではないです。

パラメータと引数の違い

パラメータは、関数に受け渡されるものの宣言す。

/*
 * pra1とpra2は、パラメータです。
 * JavaDocでも「@param」で説明を書きます。
 */
private void calledMethod(int pra1, String pra2) {
・・・・
}

 ・メソッド(や関数)に定義されているのは「パラメータ」(もしくは「パラメータ変数」)。

 ・メソッド(や関数)に定義されたすべてのパラメータ群は「パラメータ リスト」と呼びます。
blog.masahiko.info

パラメータは、プロシージャが呼び出されるときに期待する値を表します。パラメータは、プロシージャの宣言で定義されます。
パラメータと引数の違い

関数の定義の中で関数に渡す値として定義されている値。
パラメータと引数の違い | 同じと思っていない?

引数は、関数に渡した実際の値のことです。

// arg1とarg2は、引数です。
private void callMethod() {
    int arg1 = 5;
    String arg2 = "五";
    calledMethod(arg1, arg2);
}

・メソッド(や関数)のパラメータに渡された値*1は「引数」(「パラメータ値」との言い換えも可能)。

 ・メソッド(や関数)のパラメータ群に渡されたすべての値群は「引数リスト」と呼びます。
blog.masahiko.info

引数は、プロシージャを呼び出すときに、プロシージャのパラメータに渡す値を表します。呼び出し元のコードは、プロシージャを呼び出すときに引数を渡します。
パラメータと引数の違い

関数を呼び出すときに渡す値。
パラメータと引数の違い | 同じと思っていない?

仮引数と実引数の違い

仮引数は、パラメータのことです。

仮引数とは関数定義時に使用される引数のことである。
仮引数と実引数

http://wa3.i-3-i.info/img/diff/200/df00271-4.png
http://wa3.i-3-i.info/diff271programming.html

www.weblio.jp

実引数は、引数のことです。

実引数とはその関数を実際に使用するときに関数に引き渡される引数のことである.
仮引数と実引数

http://wa3.i-3-i.info/img/diff/200/df00271-5.png
http://wa3.i-3-i.info/diff271programming.html

仮引数と実引数の違いは、パラメータと引数のそれと同じです。

メソッド定義のパラメータ変数のことを仮引数という。
呼び出し側でメソッドに渡すパラメータのことを実引数という。
blog.codebook-10000.com

仮引数も実引数も「~な引数」で理解が難しいです。

仮パラメータと実パラメータの違い

仮パラメータは、パラメータのことです。

実パラメータは、引数のことです。

仮パラメータと実パラメータの違いは、パラメータと引数のそれと同じです。

仮引数も実引数も用語説明があまり見当たらなくてで理解が難しいです。

こんな感じで使われています。

変数パラメータの実引数は仮パラメータと正確に同じ型でなければなりません。
E2033 変数実パラメータと変数仮パラメータとは同一の型でなければなりません (Delphi) - RAD Studio

関数を呼び出すとき、その関数が受け取る引数の数、それぞれの引数の型が一致していなくてはならない。引数の数が一致しないとエラーになる:
[エラー] 実パラメータが足りません
Add 関数は 2 つの引数を受け取るので、引数 1 つでこの関数を呼び出すことはできない。
関数

プロシージャ呼び出し時の実パラメータ・リスト
プロシージャ定義時の仮パラメータ・リスト
パラメータ渡し

まとめ

関数が受け取るものの定義 関数に渡す値
パラメータ 引数
仮引数 実引数
仮パラメータ 実パラメータ

EclipseでTomcatを設定する。

前回は、プロジェクトにSpringを設定しましたがTomcatを設定していないことに気が付きました。

ponsuke-tarou.hatenablog.com

Tomcatは、Java ServletJSP を実行するためのWebコンテナです。

f:id:ponsuke_tarou:20180301224225p:plain

Apache License 2.0を採用したオープンソースソフトウェア。
2005年以降、Apacheソフトウェア財団のトップレベルプロジェクトのひとつであるApache Tomcat Project 内で開発されている。
それ以前はかつて存在していたJakartaプロジェクト内で開発されていた。
Apache Tomcat - Wikipedia

オープンソースのソフトウェアで、JavaサーブレットJSPを処理するアプリケーションサーバTomcatは単独でWebサーバとして動作することも可能だが、ApacheIISプラグインと動作できるようになっており、実際にはプラグインとしての利用が主流である。
Tomcatは主なUNIX系OSWindowsMac OS Xなどで動作する。Sun Microsystems社からJavaサーブレットJSPのリファレンス実装として認められたソフトウェアで、利用者も非常に多い。
e-words.jp

Webコンテナは、Javaサーブレットの実行環境となるソフトウェアです。

Java EE アーキテクチャのWebコンポーネント規約を実装するソフトウェア。
この規約では、コンピュータセキュリティ、並列性、ライフサイクル管理、トランザクション処理、デプロイやその他のサービスを含むWebコンポーネントの実行環境を規定している。WebコンテナはJava EEプラットフォームAPIを利用したJSPコンテナとしての機能も提供する。
Webコンテナ - Wikipedia

サーブレットはWebサーバ上で動作させるJava言語で書かれた簡易なプログラムで、クライアント(Webブラウザなど)からの要求を受けて処理を行い、結果をWebページとして送信する。サーブレットは単体では動作せず、Webサーバからの処理要求を受け付けてサーブレットの記述に従って実際の処理を行うソフトウェアが必要で、これをサーブレットコンテナという。
e-words.jp

f:id:ponsuke_tarou:20210123112409j:plain
台東区浅草の鶴の湯

Macの場合

Tomcatを配置します。

  1. Apache Tomcat® - Apache Tomcat 8 Software Downloadsへアクセスします。
  2. 好きなバージョンの.tar.gz をダウンロードして解凍します。
    • f:id:ponsuke_tarou:20180301230312p:plain
  3. 解凍した「apache-tomcat-8.0.23」(バージョンによって末尾は変わる)をApplicationsディレクトリ配下に移動します。
    • f:id:ponsuke_tarou:20180301230429p:plain
  4. Tomcatに権限を付与します。
  5. Tomcatを起動します。
  6. ブラウザで「http://localhost:8080/」にアクセスします。
    • f:id:ponsuke_tarou:20180301230942p:plain
  7. Tomcatを停止します。
# Tomcatに権限を付与します。
$ chmod 755 /Applications/apache-tomcat-8.0.23/bin/startup.sh
$ chmod 755 /Applications/apache-tomcat-8.0.23/bin/shutdown.sh

# Tomcatを起動します。
$ /Applications/apache-tomcat-8.0.23/bin/startup.sh 
Using CATALINA_BASE:   /Applications/apache-tomcat-8.0.23
Using CATALINA_HOME:   /Applications/apache-tomcat-8.0.23
Using CATALINA_TMPDIR: /Applications/apache-tomcat-8.0.23/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
Using CLASSPATH:       /Applications/apache-tomcat-8.0.23/bin/bootstrap.jar:/Applications/apache-tomcat-8.0.23/bin/tomcat-juli.jar
Tomcat started.

# Tomcatを停止します。
$ /Applications/apache-tomcat-8.0.23/bin/shutdown.sh 
Using CATALINA_BASE:   /Applications/apache-tomcat-8.0.23
Using CATALINA_HOME:   /Applications/apache-tomcat-8.0.23
Using CATALINA_TMPDIR: /Applications/apache-tomcat-8.0.23/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
Using CLASSPATH:       /Applications/apache-tomcat-8.0.23/bin/bootstrap.jar:/Applications/apache-tomcat-8.0.23/bin/tomcat-juli.jar

EclipseにTomactのプラグインを入れます。

方法は2つあるので好きな方を選びます。

zipファイルでインストールする方法
  1. Eclipse Tomcat Pluginへアクセスします。
  2. zipファイルをダウンロードします。
    • f:id:ponsuke_tarou:20180301235556p:plain
  3. [Help] > [Install New Software]を選択します。
  4. [Work with] > [Add...]ボタン > [Archive]ボタン > ダウンロードしたzipファイルを選択 > [OK]ボタン
  5. [Tomcat Plugin]にチェックを入れます。
  6. [Next>]ボタン > [Next>]ボタン > [I accept the........]を選択 > [Finish]ボタン
  7. Eclipseを再起動します。
  8. Tom猫マークが表示されます。
    • f:id:ponsuke_tarou:20180302000344p:plain
Eclipse Marketplaceでインストールする方法
  1. [Help] > [Eclipse Marketplace]でダイアログを開く
  2. [Find]に「tomcat」を入力して検索する
  3. 検索結果に表示された「Eclipse Tomcat Plugin x.x.x(バージョン)」の[Install]ボタンでダイアログを開く
    • f:id:ponsuke_tarou:20200609111645p:plain
  4. [License text:]で「I accept...」を選択して[Finish]ボタンでインストールする
  5. Eclipseの再起動を促されるので再起動する

EclipseTomcatを設定します。

  1. 環境を設定します。
  2. [Windows] > [Preferences] > [Tomcat] > [Tomcatバージョン] > [Version 8.X]を選択します。
  3. [Tomcat ホーム] > [Browse...]ボタン > 「/Applications/apache-tomcat-8.0.23」を選択します。
  4. コンテキスト宣言モードを選択します。
    • f:id:ponsuke_tarou:20180302001451p:plain

「コンテキスト宣言モード」は、コンフィグレーションファイルの選択となります。
「server.xml」を選択すると、\conf\server.xml にアプリケーションコンテキストの設定が更新されます。
「コンテキストファイル」を選択すると、指定したディレクトリ(デフォルトは \conf\Catalina\localhost)にアプリケーションコンテキストの設定ファイル(プロジェクト名.xml)が作成されます。
proenomichi.blogspot.jp

  1. Eclipseに設定されているJavaのバージョンを確認します。
    1. [Windows] > [Preferences]で[Preferrence]ダイアログを開きます。
    2. [Java] > [Installd JREs]を開いて、インストールしたTomcatに合ったものがdefaultになっていることを確認します。
  2. サーバを追加します。
    1. [Servers]タブを表示してリンクをクリックします。
      • f:id:ponsuke_tarou:20180302002753p:plain
    2. [Apache] > [Tomcat v8.0 Server]を選択して、[Next>]ボタンを押下します。
      • f:id:ponsuke_tarou:20180302002758p:plain
    3. [Tomcat install directory:]の[Browse...]ボタンを押下してTomcatが置いてある「/Applications/apache-tomcat-8.0.23」を指定します。
    4. [JRE:]で「Workbench default JRE」を選択します。
      • f:id:ponsuke_tarou:20180304135740p:plain
    5. [Finish]ボタンを押下すると[Server]にTomcatが追加されます。
      • f:id:ponsuke_tarou:20180302002807p:plain
  3. アプリケーションを動かしてみます。
    1. [Project] > [Clean...] を押下してプロジェクトをクリーンします。
    2. [Package Exploer]でプロジェクトを選択して右クリックします。
    3. [Run As] > [Run on Server] を押下するとダイアログが表示されます(されないこともあります)。
    4. ダイアログで Tomcat を選択して [Finish] を押下します。
      • 毎回、同じサーバを使用するのであれば「Always use this server when running this project」にチェックを入れておきます。
    5. http://localhost:8080/{プロジェクトの名前}/ にアクセスすると「Hellow World!!」が表示されました。
      • f:id:ponsuke_tarou:20180615141014p:plainf:id:ponsuke_tarou:20180615141039p:plainf:id:ponsuke_tarou:20180615141223p:plain

f:id:ponsuke_tarou:20210123105118j:plain
台東区の帝国湯(お湯が尋常じゃなく熱い)

Windowsの場合

  • 環境
    • Windows10 Pro 64bit
    • Eclipse Version: Oxygen.3a Release (4.7.3a)

qiita.com

Tomcatを配置します。

  1. Apache Tomcat® - Apache Tomcat 8 Software Downloadsのサイトからzipファイルをダウンロードする
    • f:id:ponsuke_tarou:20210123105520p:plain
  2. 任意のフォルダに解凍する
  3. 起動してみる
    1. startup.shで起動する
      • f:id:ponsuke_tarou:20210123105558p:plain
        初回の起動の場合はダイアログが表示されるので[アクセスを許可する]ボタンを押下する
  4. http://localhost:8080/ をブラウザで表示して起動することを確認する
    • f:id:ponsuke_tarou:20210123105643p:plain
  5. shutdown.shで停止する
# startup.shで起動する
$ /path/to/apache-tomcat-8.5.47/bin/startup.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /path/to/Java/jdk1.8.0_231/
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar
Tomcat started.

# shutdown.shで停止する
$ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /path/to/Java/jdk1.8.0_231/
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar

EclipseTomcatを設定します。

  1. Eclipseを起動する
  2. f:id:ponsuke_tarou:20210123105900p:plain
    [ヘルプ] > [Eclipseマーケットプレース] > [検索] > 「tomcat」で「Eclipse Tomcat Plugin」を検索してインストールする
  3. f:id:ponsuke_tarou:20210123110104p:plain
    Eclipseの再起動が促されるので再起動するとTom猫マークが表示される
  4. [設定]ダイアログ > [Tomcat] > [Tomcatバージョン] > [Version 8.X]を選択
  5. [Tomcat ホーム] > [参照...]ボタン > Tomcatを解凍したフォルダを選択
  6. [コンテキスト宣言モード] > [コンテキスト・ファイル]を選択
  7. [適用して閉じる]ボタンで[設定]ダイアログを閉じる
  8. [サーバー]タブ > 右クリック > [新規] > [サーバー] > ダイアログを表示
    • f:id:ponsuke_tarou:20210123110213p:plain
      まだサーバを何も設定していなければリンクが表示されるので、そのリンクをクリックするとダイアログが表示される
  9. [Apache] > [Tomcat v8.8 Server]を選択 > [次へ>]ボタン
  10. [Tomcatインストール・ディレクトリー:] > [参照...]ボタン > Tomcatを解凍したフォルダを選択
  11. [JRE:] > インストールしたTomcatに合ったバージョンを選択(Apache Tomcat® - Which Version Do I Want?) > [完了]ボタンでTomcatを追加する
  12. [サーバー]タブに表示されたTomcatをダブルクリック > [ポート] > 変更の必要があれば変更する(他のサーバと被らない様にする等)

f:id:ponsuke_tarou:20210123112202j:plain
荒川区の帝国湯

失敗したこと

Java/bin/java: No such file or directory

# shutdown.shを実行したら怒られました。
$ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /c/Program Files (x86)/Common Files/Oracle/Java
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar
/path/to/apache-tomcat-8.5.47/bin/catalina.sh: line 520: /c/Program Files (x86)/Common Files/Oracle/Java/bin/java: No such file or directory

Could not contact [localhost:8005]. Tomcat may not be running.

# shutdown.shを実行したら怒られました。
$ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /path/to/Java/jdk1.8.0_231/
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar
11 12, 2019 10:49:04 ▒ߑO org.apache.catalina.startup.Catalina stopServer
▒d▒▒: Could not contact [localhost:8005]. Tomcat may not be running.
11 12, 2019 10:49:04 ▒ߑO org.apache.catalina.startup.Catalina stopServer
▒d▒▒: Catalina.stop:
java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
...省略...
<!--変更前-->
<Server port="8005" shutdown="SHUTDOWN">
<!--変更後-->
<Server port="8080" shutdown="SHUTDOWN">

The CATALINA_HOME environment variable is not defined correctly

# バッチを使ったら怒られた。
$ /path/to/apache-tomcat-8.5.47/bin/startup.bat
The CATALINA_HOME environment variable is not defined correctly
This environment variable is needed to run this program

次は、Spring MVC の設定をしていきます。

ponsuke-tarou.hatenablog.com

EclipseでMavenのプロジェクトにSpringとJSPを設定する

Eclipseをインストールします

参考 : Mac 版 Eclipse Pleiades All in One リリース - Qiita

  1. Pleiadesのページよりdmgをダウンロードします。
    • f:id:ponsuke_tarou:20190604003148p:plain
      JavaのFull Edition
  2. f:id:ponsuke_tarou:20190604003403p:plain
    EclipseアイコンをAplicationsにドラッグ&ドロップ

Mavenプロジェクトを作成します。

ponsuke-tarou.hatenablog.com

Eclipseの設定をします。

Eclipseのデフォルトを使用しない場合に設定を行います。

(必要があれば)プラグインSTSをインストール

使うEclipseの種類によってインストールされている場合もあります。

  1. [Help] > [Eclipse Marketplace...]で「STS」を検索 > 「Spring Tools(aka Spring IDE and Spring Tool Suite)」に似た名前のプラグインをインストールします。
    • バージョンによってちょとずつ名前が違います。

Workspace全体の設定

  1. [Eclipse] > [環境設定...]で[設定]ダイアログを開く
  2. [Java] > [インストール済みのJRE]で使用するJavaを選択 > [適用]ボタン(デフォルトはEclipseの起動に必要なJavaのバージョン)

プロジェクト固有の設定

  1. [プロジェクト・エクスプローラー]か[パッケージ・エクスプローラー]でプロジェクトを選択して右クリック > [プロパティ]でダイアログを開く
  2. Javaコンパイラーの設定
    1. f:id:ponsuke_tarou:20180525135556p:plain
      [Javaコンパイラー] > [コンパイラー準拠レベル]でプロジェクトに合わせたものを設定
    2. [OK]ボタンを押下すると再ビルドを促すメッセージが表示されるので再ビルドする
  3. プロジェクト・ファセットの設定
    1. [プロジェクト・ファセット] > [Java] > コンパイラに設定したJavaと同じバージョンを設定する
    2. [プロジェクト・ファセット] > [動的Webモジュール] > 好きなバージョンに設定する
  4. ビルド・パスの設定
    1. [Java Build Path] > [Libraris]タブ > [JREシステム・ライブラリー]からデフォルトの設定を除去します。
    2. f:id:ponsuke_tarou:20180525140708p:plain
      [Add Library...]ボタン > [JREシステム・ライブラリー] > プロジェクトに合わせたものを追加します。
    3. f:id:ponsuke_tarou:20180525141110p:plain
      [完了]ボタンを押下してダイアログを閉じます。

Spring をpom.xmlに設定します。

pom.xmlって何?

Mavenは、Project Object Modelに基づいたプロジェクト管理ツールです。

https://maven.apache.org/images/maven-logo-black-on-white.png
Maven – Welcome to Apache Maven

Project Object Modelを略すとPOMです。
pom.xmlにはプロジェクトの情報を設定します。

https://www.studytonight.com/maven/images/sample-pom-xml.jpg
POM in Maven | Apache Maven Tutorial | Studytonight

pom.xmlに依存関係を設定します。

pom.xmlに設定する配下の定義内容は、Maven Repository: Search/Browse/Exploreで検索して取得しました。
f:id:ponsuke_tarou:20180312000924p:plain
必要なタグがない場合は保管機能を使って追記します。

  1. [Package Explorer]でpom.xmlを選択して開きます。
Spring IO Platformの dependencyManagement 定義をインポートして依存ライブラリのバージョンを管理します。
  • 以下定義を project の dependencyManagement の dependencies に追記します。
<!-- https://mvnrepository.com/artifact/io.spring.platform/platform-bom -->
<dependency>
      <!-- Spring IO Platformは、Springのアプリ開発・実行で必要な各種ライブラリやサードパーティライブラリのバージョンを決定し、依存関係を解決するためのSpringサブプロジェクトです。 -->
    <groupId>io.spring.platform</groupId>
    <artifactId>platform-bom</artifactId>
    <version>2.0.8.RELEASE</version>
    <type>pom</type>
    <scope>import</scope><!-- 追記します。 -->
</dependency>
Servlet APIのjarを依存ライブラリとして指定します。
  • jarを依存ライブラリに追加すると src/main/webapp/index.jsp で発生していたエラーを解消できます。
  • 以下定義を に追記します。
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version><!-- バージョンはSpring IO Platformで管理されているバージョンが適用されるので削除します。 -->
    <scope>provided</scope>
</dependency>
JSP Standard Tag Library(JSTL)のjarを依存ライブラリとして指定します。
  • jarを依存ライブラリに追加することでJSPの実装を手助けしてくれるタグを利用できるようになります。
  • 以下定義を に追記します。
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-jstlel -->
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-jstlel</artifactId>
    <version>1.2.5</version><!-- バージョンはSpring IO Platformで管理されているバージョンが適用されるので削除します。 -->
</dependency>
コンパイルするソースファイルとコンパイルして出力するJavaの互換バージョンを指定します。
  • 以下定義を に追記します。
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
<dependency><!-- <plugin>タグに変更します。 -->
    <groupId>org.apache.maven.plugins</groupId><!-- 削除します。 -->
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version><!-- バージョンはSpring IO Platformで管理されているバージョンが適用されるので削除します。 -->
       <configuration><!------ ▼追記します。 --->
              <source>1.8</source><!--- プロジェクトの[Javaコンパイラー]に設定したバージョンを指定します。 --->
              <target>1.8</target><!--- Java8を指定します。 --->
       </configuration><!--- プロジェクトの[Javaコンパイラー]に設定したバージョンを指定します。 --->
</dependency><!-- </plugin>タグに変更します。 -->

書き終わったpom.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.qiita.ponsuke0531</groupId>
  <artifactId>trySpring</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>trySpring Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <dependencyManagement>
    <dependencies>
      <!-- https://mvnrepository.com/artifact/io.spring.platform/platform-bom -->
      <dependency>
        <groupId>io.spring.platform</groupId>
        <artifactId>platform-bom</artifactId>
        <version>2.0.8.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-jstlel -->
    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-jstlel</artifactId>
    </dependency>
  </dependencies>
  <build>
    <finalName>trySpring</finalName>
    <pluginManagement>
      <plugins>
        <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

依存関係をプロジェクトに反映します。

  1. [パッケージ・エクスプローラ] > 右クリック > [Maven] > [プロジェクトの更新...] で[Mavenプロジェクトの更新]ダイアログを表示します。
    • f:id:ponsuke_tarou:20180606234611p:plain
  2. プロジェクトが選択されていることを確認して[OK]を押下します。
    • f:id:ponsuke_tarou:20180606234717p:plain

Web.xmlを編集します。

  1. src/main/webapp/WEB-INF/web.xml を開きます。

(必要があれば)動的Webモジュールのバージョンをプロジェクト指定に変更します。

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"<!--ここ-->
    version="3.0"><!--ここ-->

JSPを設定します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
  <jsp-config>
    <!-- JSPに関する共通的な定義. -->
    <jsp-property-group>
      <url-pattern>*.jsp</url-pattern>
      <!-- JSPファイルの文字コード指定. -->
      <page-encoding>UTF-8</page-encoding>
      <!-- 各JSPファイルの先頭にインクルードするJSPファイルの指定. -->
      <include-prelude>/WEB-INF/include.jsp</include-prelude>
    </jsp-property-group>
  </jsp-config>
</web-app>

web.xmlで指定したJSPファイルを作成して JSP Standard Tag Library(JSTL) のtaglib定義を追加します。

taglibの定義を追加することで、どのJSPからもJSTLのtaglibが利用できるようになります。

  1. web.xmlに指定した「/WEB-INF/include.jsp」のパスになるようにinclude.jspを作成します。
  2. f:id:ponsuke_tarou:20180615130103p:plainf:id:ponsuke_tarou:20180615130112p:plain
  3. 自動で色々書いてありますが、全部消して以下を記載します。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
taglibって何?

こういった定義をディレクティブといいます。
JSPをどのように処理するかをサーブレットコンテナに対して指示するための要素です。
taglibディレクティブは、カスタムライブラリを使用できるようにするためのディレクティブです。

次は、Tomcatを設定します。

ponsuke-tarou.hatenablog.com

困った

qiita.com

プロバイダの迷惑メール対策にOP25B

前回の勉強内容

ponsuke-tarou.hatenablog.com

メールのざっくりとした流れ

f:id:ponsuke_tarou:20180224131345j:plain

OP25Bは、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止します。

  • 正式 : Outbound(外に向かう) Port 25 Blocking

ネットワークの境界にあるルータなどの機器で、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止することで、インターネットサービスプロバイダなどが会員のパソコンからスパムメールが送信されるのをブロックするために行っています。

OP25Bとは、ネットワークの境界にあるルータなどの機器で、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止すること。インターネットサービスプロバイダ(ISP)などが会員のパソコンからスパムメールが送信されるのをブロックするために行っている。
OP25B(Outbound Port 25 Blocking)とは - IT用語辞典 e-Words

インターネットサービスプロバイダ(ISP)が,OP25Bを導入する目的はどれか。

イ. ISP管理外のネットワークに向けてISP管理下のネットワークから送信されるスパムメールを制限する。
平成29年春期問15 OP25Bを導入する目的はどれか|情報処理安全確保支援士.com

25番のポートはメール送信において、SMTPでデータを送る際に利用するウェルノンポートです。

ウェルノウンポートという特定のサービスやプロトコルが利用することが広く知られているポートがあります。

ウェルノウンポートとは、TCP/IPによる通信で利用されるTCPUDPのポート番号のうち、著名なサービスやプロトコルが利用するために予約されている0番から1023番のこと。
ウェルノウンポート(well-knownポート)とは - IT用語辞典 e-Words

SMTPとは、電子メールを伝送するための通信手順の一つです。

利用者(の使うメールソフト)からメールサーバに送信依頼する際や、メールサーバ間でメールを転送する際にシステム間で交わされる要求や応答のデータ形式、伝送手順などを定めている。
SMTP(Simple Mail Transfer Protocol)とは - IT用語辞典 e-Words

f:id:ponsuke_tarou:20180226222610j:plain

なんでこんな事するの?

25番ポートの送信を塞ぐことでメールの送信ができなくなります。

クライアント・ソフトウェアからの送信だけでなく、メール・サーバ間での中継でも利用される。そのため、一般的には、認証なしで接続、利用できるようになっている。もしSMTPプロトコルで認証を必須にしてしまうと、任意のドメインからのメールを受け付けることができなくなるからだ。
スパム・メールの送信を制限するOutbound Port 25 Blockingとは − @IT

spamメールやvirusメールは、 しばしば自ネットワーク(ISP)のメールサーバを用いず、 送信先メールサーバのTCP 25番ポートへ直接接続して配送されます。 こういった状況から、 外部のメールサーバへの通信をできなくすることでspamメールやvirusメールの送信が抑止されることを期待するものです。
インターネット用語1分解説~OP25B(Outbound Port 25 Blocking)とは~ - JPNIC

プロバイダの会員がプロバイダのメールサーバでスパムメールを送信しようとする場合は対応できるけれど、外部のメールサーバを利用されると対応できません。

プロバイダが管理しているネットワーク内からプロバイダの会員がメールサーバでスパムメールを送信しようとする場合は、これを個別に遮断したりその会員がネットワークを使えないようにしたりそれなりに対処できるけれど、外部のメールサーバを利用されると外部からなので対処が難しくなります。

OP25Bを導入して、外部のSMTPサーバへの通信を遮断することで会員が外部のメールサーバを利用してスパムメールを送るのを防ぎます。

そこで、ネットワークの境界で外部のSMTPサーバへの通信を遮断することにより、会員のコンピュータが外部のメールサーバを利用してスパムメールなどを送ることを根こそぎ防ぐことができる。あくまで外部サーバへの通信を遮断するだけで自ネットワーク内にあるメールサーバへの通信は可能なため、プロバイダのメールサーバを利用した通常のメールの送受信は影響を受けない。
OP25B(Outbound Port 25 Blocking)とは - IT用語辞典 e-Words

f:id:ponsuke_tarou:20180226222623j:plain

IP25Bは、外部のコンピュータからネットワーク内のTCPポート25番への通信を禁止します。

OP25Bが内側から外側への怪しいメール送信をブロックするのに対し、IP25Bは外側から内側への怪しいメール送信をブロックします。

インターネットサービスプロバイダ(ISP)が,スパムメール対策として導入するIP25Bに該当するものはどれか。

答. 他社ISPのネットワークの動的IPアドレスから自社ISPのメールサーバへのSMTP通信を制限する。

情報処理安全確保支援士令和2年秋期 午前Ⅱ

次回の勉強内容

ponsuke-tarou.hatenablog.com

メールを書くときに使う文法はRFC 5322です。

前回の勉強内容

ponsuke-tarou.hatenablog.com

メールのざっくりした流れ図

f:id:ponsuke_tarou:20180224131345j:plain

メールを書くときにRFC 5322を使います。

インターネット標準 RFC 5322(旧 RFC 822)に準拠した電子メールにおいて,ヘッダと本体を区別する方法はどれか。

ア. <header>と </header>で囲まれた部分をヘッダ,とで囲まれた部分を本体とする。
イ. 1個のピリオドだけから成る行の前後でヘッダと本体を分ける。
ウ. Subjectフィールドがヘッダの最後であり,それ以降を本体とする。
エ. 最初に現れる空行の前後でヘッダと本体を分ける。>>>正解
平成26年秋期問20 メールヘッダと本体を区別する方法|情報処理安全確保支援士.com

RFC 5322とは、メールのフレームワークにおいてコンピュータ利用者間で送信されるテキストメッセージの文法です。

RFC 5322とは、IETFが発行するRFCという文書の一つで、電子メールのフレームワークにおいてコンピュータ利用者間で送信されるテキストメッセージの文法、インターネットメッセージフォーマット(IMF)を規定しています。
いつもメーラーによろしくやってもらっているけどちゃんと決まりがあるんです!

IETFとは、インターネット技術の標準を定める団体です。

IETFは、インターネット技術の標準化を推進する任意団体です。 コンピュータシステムを相互接続するため、 共通の技術仕様策定を議論するグループから発展したものです。
インターネット用語1分解説~IETFとは~ - JPNIC

RFCとは、インターネットの標準を定めた文書です。

RFC 【Request For Comments】
RFCとは、インターネット技術の標準化などを行うIETF(Internet Engineering Task Force)が発行している、技術仕様などについての文書群。TCP/IP関連のプロトコル(通信規約)の標準仕様などが記されたもので、インターネット上で公開されており誰でも入手・閲覧することができる。
RFC(Request For Comments)とは - IT用語辞典 e-Words

f:id:ponsuke_tarou:20180224162332j:plain

ヘッダ情報は、「フィールド名:フィールド本文CRLF」で構成されます。

メールの情報は、フィールドを定義して書かれています。

ヘッダフィールドは、フィールド名の次にコロン(":")、次にフィールドの本文、最後に CRLF で終了する行である。フィールド名は(コロンを除く)印刷可能な US-ASCII 文字で構成されなければならない。フィールド本文は CR と LF とを除く任意の US-ASCII 文字のほかに、空白・水平タブの各文字で構成されてよい。<省略>
必須のヘッダフィールドは発信日付フィールドと発信元アドレスフィールドだけである。それ以外のすべてのヘッダフィールドは文法的にはオプションである。
2.2. ヘッダフィールド | RFC5322(Internet Message Format)

発信日付フィールドには、メール配送システムへの投入準備ができたことをメッセージ作成者が示した日付と時刻を書きます。

Date: Sat, 24 Feb 2018 12:59:20 +0900

発信元フィールドには、メッセージの送信元のメールボックスを書きます。

発信元フィールド 書く内容
From: メッセージの作者のアドレス
Sender: メッセージの実際の送信に責任を持つ代理人のメールボックス(実際に送った人的な)
このフィールドがない時は送信者が作者と同一ということ。
Reply-To: メッセージの返信先
このフィールドがない場合の返信先はFrom:にあるアドレス
From: "はてなブログ " < noreply+blog-anniversary_mail@hatena.ne.jp>

宛先アドレスフィールドには、メッセージの受信者を書きます。

宛先アドレスフィールド 書く内容
To: メッセージの主要な受信者
Cc: メッセージの内容はその人たちに向けられたものではないかもしれないが、それを受け取るべき人のアドレス
Bcc: メッセージの受信者を表すが、他の受信者に公開されないアドレス
To: hoge@hoge.com

識別フィールドは、必須じゃないんだけど「書くべき」とされています。

「Message-ID:」フィールドには、ユニークなメッセージ識別子を書きます。

Message-Id: <20180224035920.A26A21B80B9@smtp01.hatena.ne.jp>

「Message-ID:」フィールドを書くことで、特定のメッセージの特定のバージョンを表しユニーク性はそれを生成したホストによって保証されます。
メッセージ識別子は機械的に読み取られることを目的としており、その後に修正されたメッセージはそれぞれ新しいメッセージ識別子を持つことになります。

識別フィールド 書く内容
Message-ID: ユニークなメッセージ識別子
In-Reply-To: 返信元メッセージの「Message-ID:」フィールドの内容
References: 返信元メッセージの識別フィールドの値

情報フィールドには、メッセージに関して人が読むことのできる情報を書くけど必須ではありません。

「Subject:」には、メッセージの見出しを表す短い文字列、件名を書きます。

Subject: はてなブログ/ponsuke_tarou(id: ponsuke_tarou)
  さま、ponsuke_tarou’s blogを開設して1年が経ちました

返信では、「Re:」の後に元のメッセージの "Subject:" フィールドの内容を続けてもいいです。必須ではありません。
他の文字列や二つ以上の "Re: " が使用されるのは望ましくないため、文字列 "Re: " をひとつだけ使うのが好ましいそうです。
そういえば、社会人なり立ての十数年前にメーラの件名では見切れるぐらい「Re:」が連続しているメールをちょいちょい見かけて「わかりずらいよ」と思ったことがありました。

情報フィールド 書く内容
Subject: メッセージの見出しを表す短い文字列、件名
Comments: メッセージボディに関する任意の追加コメント
Keywords: 受信者にとって役に立つかもしれない重要な単語や語句のカンマ区切りリスト

再送フィールドには、メッセージの特定の再送に関連する情報を書きます。

再投入のたびに個別の再送フィールドの集合が追加されるべきである(SHOULD)。メッセージの特定の再送に関連するすべての再送フィールドはひとまとめにして置かれるべきである(SHOULD)。再送フィールドの新しい集合はメッセージの先頭に追加される。したがって、もっとも新しい再送フィールドがメッセージの前方に現れる。再送フィールドが追加されるとき、そのメッセージの他のフィールドは変更されない。<省略>
再送フィールドは、そのメッセージがユーザーによって配送システムに再投入されたことを識別するために使用される。再送フィールドを使用する目的は、最終受信者に対してそのメッセージが元の送信者から(元のフィールドはすべて同じままで)直接送られたかのように見せることである。
RFC5322(Internet Message Format)

返信の時に欲しいフィールド 対応する再送フィールド 内容
MUST Resent-Date: メッセージの再送信者がその再送メッセージを発信した日付と時刻
MUST Resent-From: メッセージを再送した人またはシステムのメールボックス
「Resent-From:」と同じ場合、使用されないべき(SHOULD NOT)。 Resent-Sender: 一人または複数の人に代わってメッセージを再送した個人
SHOULD Resent-Message-ID: 再送メッセージのためのユニークな識別子

※. 他にもフィールドはあります。

トレースフィールドは、情報提供用です。

Received: by 10.100.164.108 with SMTP id h99csp1614716pje;
        Fri, 23 Feb 2018 19:59:21 -0800 (PST)
Return-Path: <noreply+blog-anniversary_mail@hatena.ne.jp>
Received: from smtp01.hatena.ne.jp (gw.hatena.ne.jp. [59.106.108.66])
        by mx.google.com with ESMTP id a21sixxxxxxxpgw.xxx2018.02.23.19.59.20
        for <hoge@hoge.com>;
        Fri, 23 Feb 2018 19:59:21 -0800 (PST)

f:id:ponsuke_tarou:20180224162501j:plain

はてなブログからもらったメールを土台に見てみます。

Delivered-To: hoge@hoge.com
Received: 一番上の Received が受信側メールサーバ
X-Google-Smtp-Source: 「X-」始まりで、Gmailがつけている
X-Received: by 「X-」で始まる項目は、メール送信者やサーバ側で任意に設定できる
ARC-Seal: i=1; a=rsa-sha256; t=..................................
ARC-Message-Signature: i=1; a=rsa............................
ARC-Authentication-Results:..........................................
Return-Path: <noreply+blog-anniversary_mail@hatena.ne.jp>送信先のメールアドレスに届けられない場合、サーバが自動的に送信者へ通知するための宛先
Received: 経由したサーバのIPアドレスやドメイン名、送信元のIPアドレスやドメイン名などで、経由したサーバの数だけ Received が記録される
Received-SPF: SPF認証情報とドメイン送信元サーバーを照合した結果
Authentication-Results: 送信ドメイン認証の結果。RFC 5451にて標準化
Received: from ヘッダ一番下の Received が送信元
From: "はてなブログ " < noreply+blog-anniversary_mail@hatena.ne.jp>
To: mana.ukigaya.opentone@gmail.com
Subject: はてなブログ/ponsuke_tarou(id: ponsuke_tarou)
  さま、ponsuke_tarou’s blogを開設して1年が経ちました
Date: Sat, 24 Feb 2018 12:59:20 +0900
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="メールを情報を区切る文字"
Message-Id: <20180224035920.A26A21B80B9@smtp01.hatena.ne.jp>

--メールを情報を区切る文字
Date: Sat, 24 Feb 2018 12:59:20 +0900
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

メッセージ本文の部分
メッセージのボディは単純な US-ASCII 文字からなる行である。ボディに課される制限は以下の二つだけである:
CR と LF とは CRLF としてのみ現れなければならず(MUST)、ボディ内にそれらが独立して現れてはならない(MUST NOT)。
ボディ内の各行は CRLF を除いて 998 文字までに制限されなければならならず(MUST)、78 文字までに制限されるべきである(SHOULD)。
[http://srgia.com/docs/rfc5322j.html#p2.3:title]

--メールを情報を区切る文字
Content-Type: MIME-Type; name="添付ファイルの名前"
Content-Disposition: attachment; filename="添付ファイルの名前"
Content-Transfer-Encoding: base64

添付ファイルを文字にしたもの

--メールを情報を区切る文字--

次回の勉強内容

ponsuke-tarou.hatenablog.com

プログラムの気持ちを理解したいから逆ポーランド表記法

前回の勉強内容

ponsuke-tarou.hatenablog.com

f:id:ponsuke_tarou:20180219230542j:plain

逆ポーランド表記法とは、コンピュータが理解しやすい記述方法です。

  • 別名 : Reverse Polish Notation / 後置記法
  • 数式やプログラムを記述する方法の一種。
  • コンピュータで処理するのに都合のいい形の、数式の書き方。

ポーランド記法をコンピュータでの利用に適した形に改変したものである。
逆ポーランド記法 - Wikipedia

コンピュータのプログラミングにおいて、算術式を表記する手法の一つである。
逆ポーランド記法とは何? Weblio辞書

コンピュータで数式を計算する時、逆ポーランド法が都合が良い方法ため利用します
数式を逆ポーランド法に変換するための事柄

逆ポーランド記法で記述された数式x 1 2 - 3 + =は、「xに1から2を引いた(-)ものに3を足して(+)代入する(=)」と読むことができます。 より機械的な表現にすれば「xに、1に2を-して、それに3を+して、それを=する」と読むこともできます。 つまり、この表記においては、演算対象と演算処理が処理順に記述されることになります。 プログラミングなどではx = 1 - 2 + 3;といった式を書きますが、実は実行時にはスタックというものを使って逆ポーランド記法的に計算しています。
二分木を使った数式の逆ポーランド記法化と計算 - Programming/Tips - 総武ソフトウェア推進所

「A+B×C」の逆ポーランド表記法はどうなるでしょう?

式A+B×Cの逆ポーランド表記法による表現として,適切なものはどれか。
ア. +×CBA イ.×+ABC ウ. ABC×+ エ.CBA+×
平成23年秋期問1 逆ポーランド表記法|情報処理安全確保支援士.com

演算子を被演算子の後に記述します。

逆ポーランド記法の利点

  • カッコが不要
  • 左から順に処理していけば計算結果が得られる

ここでは、Y=(A+B)×(C-(D÷E))という式をポーランド表記法で表現する例を説明します。 木で表現し、節から上に出るときにそこの記号を書いていくと以下のようになります。
https://www.zealseeds.com/img/ITSkilStandard/BasicTheoryOfInformation/PolishNotation/H18Abasic10-1.gif
ポーランド表記法―逆ポーランド記法の利点や欠点、例など

https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F36744%2F3325f4b2-e857-3176-6046-cdf53431edda.gif?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=1ba7aa7e8994b9794bc5715afdb8f587
逆ポーランド記法と木構造の絵 - Qiita

問題を逆ポーランド表記法で書くと「ABC×+」です。

演算子を被演算子後に記述するので
A + B × C = A + (B × C) = A + BC× = ABC×+

小学校で習いましたが「+-」より「×÷」を先に計算します。

A + B × C = AB+ × C = ABC+×は間違いです。
f:id:ponsuke_tarou:20180219230633j:plain

「逆」じゃないポーランド表記法とは、演算子を数値の前に置く記法です。

  • 別名 : Polish notation / 前置記法

ポーランド記法とは、数式表現の表記法の一つで、演算子を数値の前に置く記法のことである。考案者がポーランド人の論理学者であったことからこのように呼ばれる。
ポーランドきほうとは何? Weblio辞書

問題をポーランド表記法で書くと「+A×BC」です。

演算子を被演算子前に記述するので
A + B × C = A + (B × C) = A + ×BC = +A×BC

人がよく使うのは、中置記法です。

問題を中置記法で書くと「A+(B×C)」です。

A + B × C = A + (B × C)
f:id:ponsuke_tarou:20180219230726j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com