Webシステム開発で関わる技術のまとめ(2022年に知った物)

# はじめに
Webシステムの開発に携わりたくて転職して9か月，知らない事ばかりで日々勉強しております。
自分の勉強用メモとして知っておくべき技術をまとめようと思いました。
([こちらの記事](https://qiita.com/inagacky/items/43cc0518ef11f1e4beb3)にインスパイアされたものです)

技術用語について，なるべく2～3行で概要を説明できる事を目指しています。

情報が多過ぎるので，主流な技術は見出しを<font color="Red">赤字</font>にしています。(主観強め)
また，今後需要が増えそうな技術は<font color="Blue">青字</font>にしています。(かなり主観強め)
とはいえ，新しい技術が登場すれば，数年でトレンドが変わってしまう事も多々あると思います。

ほとんどはあくまでも初心者がネットで情報をかき集めた程度のものです。
誤りがあればご指摘，ご意見など頂きたいです。

**※2023/2/6追記
不正確・不十分だと思った記載はひっそりと随時修正しています。
また，「そういえばこんなんあったな」という項目も追記しています。
あと，自分が読み方覚えたいものはルビを振っていきます。**

# 【クラウドプラットフォーム】
`IaaS`, `PaaS`, `SaaS`を提供しています。
`AWS`と`Azure`でシェア50%を超えます。
オンプレ環境で数ヶ月かけて構築するようなインフラが，ワンクリックで用意できる時代になってしまいました。
（知識が必要な事に変わりはありませんが）

大企業では`Azure`の採用が増えているように感じます。

## <font color="Red">AWS(Amazon Web Services)</font>
2006年サービス開始。シェア31%(2022年)
IT業界に革命を起こしたクラウドサービスの先駆けです。

各サービスの名前が独特です。
主要なサービスはみんな知っている前提で話をされる事があります。

- `Amazon EC2`: 仮想サーバーです。
- `Amazon EBS`: 高可用性のストレージです。EC2インスタンスからローカルディスクとして認識されます。
- `Amazon S3`: ストレージです。EBSより容量あたりの料金が安いので画像や動画などのコンテンツの格納に向いています。
- `Amazon RDS`: データベースです。
- `Route53`: DNSです。名前の由来はUDP53番ポートです。

[アマゾン ウェブ サービス（AWS クラウド）- ホーム](https://aws.amazon.com/jp/)

## <font color="Blue">Microsoft Azure</font>
2010年にサービス開始。シェア24%(2022年)
`Microsoft`の様々な製品・サービスと連携しやすいです。

[クラウド コンピューティング サービス | Microsoft Azure](https://azure.microsoft.com/ja-jp/)

※英語圏の発音をカタカナにすると「アジュア」（アジャーのリズムで）が一番近い気がしますが，
ほとんどの日本人は「アジュール」と呼んでいます。

## GCP(Google Cloud Platform)
2008年にサービス開始。シェア8%(2022年)です。
採用例を見たことが無いので何とも言えません。
大規模なデータの処理が得意らしいです。

[Google Cloud Platform](https://console.cloud.google.com/)

# 【プログラミング言語】

## <font color="Red">JavaScript</font>
Webブラウザ上で動く言語です。
現在のWebシステムは確実に使用します。
`ECMAScript`という仕様で規格化されています。

私は`ES5`の時代にトラウマを植え付けられたのですが，
`ES6`以降は仕様も綺麗になって最も人気の高い言語の1つです。

## <font color="Blue">TypeScript</font>
`Microsoft`が開発しました。
`JavaScript`に静的型付けとオブジェクト指向を加えたスーパーセットです。
コンパイルするとJavaScriptになります。

## <font color="Red">Java</font><font color="Red"></font>
とても幅広く使われている言語です。
`JVM(Java Virtual Machine)`上で動きます。
サーバーサイドで企業に広く使われている言語です。

`Java`関連の技術を知ろうとするだけで情報量に圧倒されます。
Setter/Getterをメソッドとして書かないといけないのが面倒臭いです。
(`IDE`が面倒臭さの大部分を吸収してくれますが……)

## <font color="Blue">Kotlin</font>
`Javaプラットフォーム`の言語です。
`Java`よりも簡潔で安全な構文のモダンな言語です。

`Android`の開発で使われます。(`Android`もかつては`Java`で開発されていました)
サーバーサイドの開発でも使用できます。

## <font color="Blue">Scala</font>
`Javaプラットフォーム`の言語です。
`Java`をモダン化した言語です。
「オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語」らしいです。

難しそうです……

## Groovy
`Javaプラットフォーム`のスクリプト言語です。
`Gradle`でお世話になります。

## Swift
特に`iOS`や`macOS`の開発で使われます。
`Objective-C`の後継です。

## PHP
Webに特化したスクリプト言語です。

## <font color="Red">Ruby</font>
日本製のスクリプト言語です。
スタートアップ向きです。

## <font color="Blue">Python</font>
インタープリタ型言語です。
AIや機械学習の分野に強いです。
科学計算の分野でも`FORTRAN`から`Python`に移る例があるようです。

## <font color="Blue">Go(Golang/Go言語)</font>
`Google`が開発した言語です。
軽量でシンプルなのが特徴です。
継承や例外処理が無いのが特徴的です。

## <font color="Blue">Rust</font>
`C`，`C++`の後継として開発された言語です。

モダン言語のように安全で書きやすく，`C++`のように速い……らしいです。

## <font color="Red">C#</font>
`Microsoft`が開発した言語です。
主にWindowsアプリ(`.NET Framework`)や`Unity`(ゲームエンジン)の開発などに使われます。

個人的に一番好きで，文法が最も美しい言語の1つだと思います。

## VB.NET(Visual Basic .NET)
`Microsoft`が開発した言語です。
見た目は`Visual Basic`風ですが，仕様はほとんどC#です。

個人的には**絶対に関わりたくない言語No.1**です。

## VBA(Visual Basic for Applications)
`Excel`のマクロが作れます。
Webに関係無いのですが，これでゴリゴリツール作ってる職場もあります。

# 【サーバーサイドのフレームワークなど】
「`サーバーサイド`」「`バックエンド`」が何を指すかは人や文脈に依りますが，
私は以下のように解釈しました。

- `フロントエンド`: ユーザーの目に見えるもの(ブラウザやクライアントアプリ)
- `サーバーサイド`: サーバー上で動くもの
- `バックエンド`: ユーザーから見えない処理をするもの

## <font color="Red">Spring</font>
`Javaプラットフォーム`のフレームワークです。
`Spring Framework`か，それを使いやすくする`Spring Boot`を指す事が多いです。
`Java`，`Kotlin`，`Scala`，`Groovy`などで開発できます。

[Spring | Home](https://spring.io/)

複数言語が選択肢って扱いが難しそう……と思いきや，
`Spring Initializr`で言語などを指定するとすぐにプロジェクトのテンプレートを用意してくれました。

[Spring Initializr](https://start.spring.io/)

## Ruby on Rails
`Ruby`のWebフレームワークです。
_"Don't Repeat Yourself"_ という理念が素敵です。

`Redmine`の開発にも使われています。

[Ruby on Rails](https://rubyonrails.org/)

## Laravel
`PHP`のWebフレームワークです。

[Laravel - The PHP Framework For Web Artisans](https://laravel.com/)

## Flask
`Python`のWebフレームワークです。

[Welcome to Flask — Flask Documentation (2.2.x)](https://flask.palletsprojects.com/en/2.2.x/)

## Django
`Python`のWebフレームワークです。

[The web framework for perfectionists with deadlines | Django](https://www.djangoproject.com/)

## Gin
`Go`のWebフレームワークです。

[Gin Web Framework](https://gin-gonic.com/ja/)

## Node.js
`サーバーサイド`の`JavaScript実行環境`です。
`SSR`を実現したり，`JavaScript`でフルスタック開発したりと色々できるようです。

`npm`(Node Package Manager)というNode.js用のパッケージ管理ツールを使用します。

[Node.js](https://nodejs.org/ja/)

## Express.js
`Node.js`のWebアプリケーションフレームワークです。

[Express - Node.js web application framework](http://expressjs.com/)

# 【フロントエンドのフレームワークなど】
`SPA`を実現する`JavaScript`(`TypeScript`)フレームワーク(もしくはライブラリ)です。
`Angular`，`React`，`Vue.js`が御三家です。

## <font color="Red">Angular (2.0以降)</font>
`Google`が開発しました。2016年リリース。
前身の`AngularJS`(Angular 1)は2010年リリースです。

[Angular 日本語ドキュメンテーション](https://angular.jp/)

## <font color="Red">React</font>
`Facebook`(現`Meta`)が開発した`JavaScriptライブラリ`です。2013年リリース。
レンダラーに依存しないという原則があり，Webに限らずスマホアプリなどにも適用できます。

[React – ユーザインターフェース構築のための JavaScript ライブラリ](https://ja.reactjs.org/)

## <font color="Red">Next.js</font>
`React`ベースのフレームワークです。2016年リリース。
`SSR`，`SSG`，`ISR`が使えます。

フロント技術の中でも先進的なようです。

[Next.js by Vercel - The React Framework](https://nextjs.org/)

## <font color="Red">Vue.js</font>
`JavaScriptフレームワーク`です。2014年リリース。
日本では使用率が高いようです。

[Vue.js - The Progressive JavaScript Framework | Vue.js](https://ja.vuejs.org/)

## <font color="Red">Nuxt.js</font>
`Vue.js`ベースのフレームワークです。
`Next.js`にインスパイアされたらしいです。
`SSR`，`SSG`が使えます。

[Nuxt: The Intuitive Web Framework](https://nuxt.com/)

## その他，JavaScriptやReactで使われるライブラリ
`jQuery`
`Redux`
`Recoil`
`SWR`

# 【MPAとSPA】
現在，新規開発されるWebシステムは`SPA`が多いです。

## MPA(Multiple Page Application)
従来から存在するWebの仕組みです。
ブラウザからの`HTTPリクエスト`に対して，サーバーから`HTML`が返って来て，レンダリングし，画面遷移します。
ユーザーが操作する度にこれを何度も繰り返します。

`JSP`などで開発されます。
画面とビジネスロジックを分離しづらいという欠点がありました。
例えばWebデザイナーが納品した`HTML`/`CSS`から`JSP`を作る作業をエンジニアがしたり。

## <font color="Blue">SPA(Single Page Application)</font>
現在主流の仕組みです。
ブラウザはWebシステムにアクセスした初回のみ`HTML`を受け取ります。
以降はAPIへの`HTTPリクエスト`に対してデータのみを受け取って差分のみ画面を更新します。

- ユーザーのメリット
  - 操作毎に読み込みを待たなくて良いので快適

- 開発者のメリット
  - フロントエンドエンジニアは画面の開発に集中できる
  - バックエンドエンジニアはビジネスロジックの開発に集中できる
  - ブラウザ，スマホアプリ，デスクトップアプリでAPIを共用できる

- デメリット
  - ユーザーにとって初回の読み込みが長い
  - API通信は少し知識のあるユーザーには丸見えなので`MPA`では起こらない**セキュリティ問題が発生し得る**
    (`Twitter`のAPIに問題があって個人情報が大量流出した事件などは記憶に新しいです)
  - `SEO`(検索エンジン最適化)が`MPA`より難しくなる
  - 画面遷移してもURLが変わらない(変える為に開発者は`Router`というものを書かないといけない)

# 【SPAのレンダリング方式】
ページのレンダリングをいつどこでするか，方式によって特徴が変わります。
使用できる方式はフレームワークによって変わります。
また，1つのシステムでも機能ごとに方式を使い分ける事もできます。

## CSR(Client Side Rendering)
ブラウザでページをレンダリングします。
読み込みに時間がかかります。
特にスマホや低スペックなPCでは遅くなります。

## <font color="Red">SSR(Server Side Rendering)</font>
`CSR`の欠点を解消するためにサーバー上でレンダリングを行います。
レンダリングがサーバーサイドで行われるという点では`MPA`と同じですね。

サーバー上で`JavaScript`を処理するために`Node.js`などを使用します。

- メリット
  - `CSR`より読み込みが早い
  - `SEO`に有利

- デメリット
  - サーバーの負荷が増える

## <font color="Red">SSG(Static Site Generation)</font>
`SSR`の欠点を解消するために，ビルド時にレンダリングを済ませておきます。
内容が更新されない静的なコンテンツ向けです。

- メリット
  - `CSR`，`SSR`より読み込みが早い
  - `SEO`に有利

- デメリット
  - APIで取得するような動的な情報に依存すると不都合が生まれる

## <font color="Red">ISR(Incremental Static Regeneration)</font>
`SSG`の欠点を解消するために，サーバーで定期的にレンダリングを行います。
こちらも`Node.js`などを使用します。

- メリット
  - `SSG`のメリットを享受しつつ，動的な情報に対応できる

- デメリット
  - タイミングによってはユーザーが最新の情報を得られない

# 【WebAPIアーキテクチャ】
クライアントとサーバー，あるいはサーバーとサーバーは`WebAPI`を介して通信することが多いです。
`HTTPリクエスト`に対してレスポンスによってデータを送ります。

APIという言葉は`カーネル`などWeb以外の分野でも使いますが，
Webシステム開発の文脈で単に「API」と言った場合は`WebAPI`(`HTTP`でアクセスするAPI)の事を指します。

## SOAP
データをやり取りするためのプロトコルです。XMLを使用しています。
メッセージは`SOAPヘッダー`と`SOAPボディ`から成る`SOAPエンベロープ`という構造を持ちます。
WebAPIでは`HTTPリクエスト`に`XML`を返すものですが，下位プロトコルは`HTTP`に限りません。

## <font color="Red">REST(Representational State Transfer)</font>
アーキテクチャースタイルです。
RESTの制約に従ったシステムを「`RESTful`である」などと言います。

Webの文脈では`HTTPリクエスト`に対して`JSON`，`XML`，`HTML`，`プレーンテキスト`などを返す実装を指します。
特に`JSON`がポピュラーです。
これを`REST API`や`RESTful API`と呼ぶことが多いです。

扱いが簡単な一方で，項目のボリュームが増えると管理が煩雑です。
とはいえ，最も広く使用されていてエコシステムが豊富なのでデフォルトの選択肢になります。

[Architectural Styles and the Design of Network-based Software Architectures](https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)

## <font color="Red">OAS(OpenAPI Specification)/OpenAPI 仕様</font>
`Swagger`で定められて広まった`RESTful Webサービス`の仕様です。
主に`YAML`でAPI仕様を記述します。

[Home - OpenAPI Initiative](https://www.openapis.org/)

なお，一般(or 提携企業)に公開するAPIは`Open APIs`と呼ぶようです。
日本語では「`オープンAPI`」と呼ばれています。（まぎらわしい……）

## <font color="Blue">GraphQL</font>
`Facebook`(現`Meta`)が開発しました
クエリーで必要な項目を指定してデータを`JSON`で取得します。

`GraphQL`ではリクエストする側がレスポンスに必要な項目を`POST`します。
これにより，`REST API`であった過剰なデータ取得やAPI開発の手間を削減できます。

[GraphQL | A query language for your API](https://graphql.org/)

## <font color="Blue">gRPC(Google Remote Procedure Calls)</font>
`Google`が開発しました。
`RPC`をモダン化したものです。
データをシリアライズするので`REST API`より軽量なAPIが実現されます。

[gRPC](https://grpc.io/)

# 【Ajax】(Asynchronous JavaScript And XML)
ブラウザから非同期で(=ページ遷移せず)`HTTPリクエスト`を送る方法です。
これによって`SPA`が実現できます。
名前に`XML`が入っていますが，もはや`XML`に限りません。

## XHR(XMLHttpRequest)
初期の技術です。
標準で使用できます。

## jQuery.ajax
`jQuery`は`JavaScriptライブラリ`です。
その中に`Ajax`機能があります。

## axios
`Ajax`送信のための`JavaScriptライブラリ`です。

## <font color="Blue">Fetch API</font>
`XHR`より新しく便利な仕組みです。
標準で使用できます。

[フェッチ API - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API)

# 【IDE(統合開発環境)】
ソースコードを書いたりデバッグしたりするためのソフトです。
構文が間違っているとすぐに指摘してくれたり，コードを補完してくれたり，
最近ではAIがコードをサジェストしてくれたりします。
IDEによって得意な言語が変わります。

# Visual Studio
`Microsoft`の製品です。
主にC#の開発に用いられます。
個人，学習環境などであれば無償版の`Visual Studio Community`が利用できます。

## <font color="Red">VSCode(Visual Studio Code)</font>
`Microsoft`が開発したOSSのテキストエディタです。
拡張機能をインストールすることで様々な言語に対応できます。

優秀過ぎて`Atom`を開発終了に追い込んだと言われています。

## Eclipse
OSSです。
主に`Java`系の開発で使われる開発環境です。

## IntelliJ IDEA
`JetBrains`の製品です。
主に`Java`系の開発で使われる`IDE`です。

有償ですが，教育目的や非営利など条件を満たせば無償で利用できます。

## GoLand
`JetBrains`の製品です。
主に`Go`の開発で使われる`IDE`です。

有償ですが，教育目的や非営利など条件を満たせば無償で利用できます。

## Xcode
`Apple`公式の`macOS`用`IDE`です。
`Swift`等の開発に使用されます。

# 【OS】(Operating System)
## UNIX
1969年に開発されました。
現代人が「OS」と聞いて思い浮かべるもので最も古いです。

## <font color="Red">Linux</font>
1991年に`UNIX`を真似して作られたOSです。
無数のディストリビューションがあります。

サーバーサイドのOSは`Linux`が選ばれる事がほとんどだと思います。

有名なディストリビューション

- `Red Hat`系
  - `Fedora`: Red Hatが支援するコミュニティで開発されています。RHELの実験場のような位置付けです。
  - `Red Hat Enterprise Linux`(RHEL): 名前の通りエンタープライズ品質です。高いです。個人開発者は無料で16ノード使えます。
  - `CentOS`: RHELのクローンです。無料かつ高品質ですがサポート終了します。
  - `Amazon Linux 2`: AWSでお世話になります。

- `Debian`系
  - `Ubuntu`: 使いやすさを重視しています。
  - `Linux mint`: Ubuntuの派生です。

## Windows
`Microsoft`のパソコン向けOSです。
大企業の業務環境は大抵`Windows`です。

## Windows Server
`Microsoft`のサーバーOSです。
`ADサーバー`に使われる事が多いです。

## Android
`Google`が開発した`スマートフォン向け汎用OS`です。

## iOS
`Apple`の`iPhone`のOSです。

## macOS
`Apple`の`Mac`のOSです。

# 【RDBMS／データベース】(Relational Database Management System)
Webシステムでは必ずと言っていいほど`RDB(Relational Database)`を使用します。
`SQL(Structured Query Language)`を書けることはエンジニアを名乗るなら必須スキルです。

## Oracle Database
`Oracle`の`RDBMS製品`です。
高い信頼性を謳っています。
価格がとても高いです。大企業向けです。

## IBM Db2
`IBM`の`RDBMS製品`です。
こちらも大企業向けなイメージです。

## Microsoft SQL Server
`Microsoft`の`RDBMS製品`です。

## MySQL
OSSの`RDBMS`です。
`Oracle`が所有しています。

[MySQL](https://www.mysql.com/jp/)

## Maria DB
`MySQL`から派生したOSSの`RDBMS`です。
多くの点で`MySQL`より優れている

[MariaDB Enterprise Open Source Database & SkySQL MariaDB Cloud | MariaDB](https://mariadb.com/)

## <ruby><rb>PostgreSQL</rb><rt>ポストグレスキューエル</rt></ruby>
OSSの`RDBMS`です。
通称「ポスグレ」

`Oracle Database`と高い互換性があります。
`Oracle Database`が高いと感じた企業が移行先に選ぶ事がよくある気がします。

[日本PostgreSQLユーザ会 | 日本PostgreSQLユーザ会](https://www.postgresql.jp/)

# 【データベース接続クライアント／SQLクライアント】
`Oracle`だと`Oracle SQL Developer`(開発環境)，`Oracle Database Client`(アプリ用ライブラリ)などがありますが，
そんな事はきっと会社の手順書に書いてあるので，ここは汎用的なSQLクライアントのメモです。

## A5:SQL Mk-2
フリーソフトです。

[A5:SQL Mk-2](https://a5m2.mmatsubara.com/)

## DBeaver
OSSです。
有償版もあります。

[DBeaver Community | Free Universal Database Tool](https://dbeaver.io/)

# 【NoSQL】
`RDB`ではない，`SQL`を使用しないデータベースです。
`RDB`に比べると整合性が担保されない代わりに，高速で大容量のデータを扱えます。
ビッグデータの分野などでも使われます。

## HBase(Apache HBase)
列指向の非リレーショナル・データベース管理システムです。
`Hadoop`(Apache Hadoop)という分散技術を使用しています。
`Solr`(Apache Solr)というサーチエンジンが使えます。

`Solr`ではクエリーを`URI`で表現でき，アプリは`HTTP`でデータを受け取る事ができます。

[Apache HBase – Apache HBase™ Home](https://hbase.apache.org/)

## MongoDB
ドキュメント志向のデータベースです。

# 【コンテナ仮想化技術】
現在のWebシステム開発で必須となっているのが`コンテナ仮想化`に関する技術です。
アプリケーションやミドルウェアをまとめてパッケージ化し，1つのホストOSの中で複数の環境を運用することがきでます。

OSの仮想化に比べて，リソースが効率的に活用できます。
（仮想OSの中でコンテナを動かすこともできます）

## <font color="Red">Docker</font>
`コンテナ仮想化`のオープンプラットフォームです。
`Windows`上で動くデスクトップ版もあります。

[Docker: Accelerated, Containerized Application Development](https://www.docker.com/)

## <font color="Red"><ruby><rb>Kubernetes</rb><rt>クーバ(ル)ネティス</rt></ruby>(K8s)</font>
`コンテナ・オーケストレーション・プラットフォーム`(コンテナを管理する仕組み)です。
多くの場合で`Docker`と共に使用されます。

`Docker`は1つのノード(OS)内でコンテナを管理しますが，
`Kubernetes`は複数ノードにまたがってシステム全体を管理します。

[Kubernetes](https://kubernetes.io/)

# 【OS仮想化技術】
コンテナ化の技術が普及したことで，アプリ開発者は仮想OSを意識する事が減りました。

## VMware vSphere
`VMware`社の製品です。

## KVM
`Red Hat`の製品です。
`Linux`が`ハイパーバイザー`になります。

# 【バージョン管理システム（ソース管理ツール）】
ソースコードの参照，更新をする上でこれらのツールの操作は必須となります。

## <font color="Red">Git</font>
現在，最も使用されているバージョン管理ツールです。
使うためには`リモートリポジトリ`と`ローカルリポジトリ`の概念を理解する必要があります。
主要なクラウドプラットフォームは標準的に`Git`を備えています。

[Git](https://git-scm.com/)

## <font color="Red">GitHub</font>
`Git`を使用しているインターネット上の開発プラットフォームです。
2018年に`Microsoft`が買収しました。

様々なプロジェクトのソースコードが見れます。
`GitHub`にリポジトリを持つ企業沢山もあります。

[GitHub](https://github.com/)

## SVN(Apache Subversion)
`Git`より昔からあるソース管理ツールです。
`TortoiseSVN`というクライアントソフトがよく使われます。
かつては`SVN`でソースコードを管理していましたが，多くの現場は`Git`に移行しています。

# <font color="Red">【CI/CDパイプライン】 </font>
`CI/CD(Continuous Integration／Continuous Delivery)`とは，
**ビルド -> テスト -> デプロイなどを自動化**するアプローチです。

開発作業を効率化・高品質化します。
**主要なクラウドプラットフォームはCI/CDサービスを備えています**。

[CI/CD パイプラインとは | Red Hat](https://www.redhat.com/ja/topics/devops/what-cicd-pipeline)

## AWS CodePipeline
`AWS`の`CI/CDサービス`です。

## Azure Pipelines
`Azure`の`CI/CDサービス`です。

## Cloud Build
`GCP`の`CI/CDサービス`です。

## Jenkins
オープンソースの`CIツール`です。
社内環境でも使えます。

[Jenkins](https://www.jenkins.io/)

## <ruby><rb>GitLab</rb><rt>ギットラブ</rt></ruby>
`Git`のマネージャーです。
`GitLab CI/CD`というツールを備えています。

[GitLab DevOps プラットフォーム](https://about.gitlab.com/ja-jp/)

# 【Javaのビルドツール】
主に`Java`系言語のプロジェクトでお世話になります。

## <ruby><rb>Maven</rb><rt>メイヴェン</rt></ruby>(Apache Maven)
`Java`用プロジェクト管理ツールです。
`Ant`の後継です。
`pom.xml`を編集します

## <font color="Red">Gradle</font>
現在`Java`系で主流となっているビルドツールです。
`build.gradle`を編集します。

`Maven`との最大の違いは**スクリプトでビルドの手続きを記述する**ことです。

[Gradle Build Tool](https://gradle.org/)

# 【Webサーバー】
クライアントからのHTTPリクエストを処理するミドルウェアです。
（もしくはこの機能を担うサーバー装置を指す場合もあります）

## <font color="Red">Apache HTTP Server</font>
OSSのWebサーバーです。
歴史的に，単に「Apache」というとこれを指す事が多いです。

## IIS(Microsoft Internet Information Services)
`Windowsサーバー`が備えるWebサーバーです。

## <font color="Red"><ruby><rb>nginx</rb><rt>エンジンエックス</rt></ruby></font>
OSSのWebサーバーです。
リバースプロキシ機能があります。

性能が高く，大量のリクエストの処理や静的コンテンツが得意です。

[NGINX(エンジンエックス)｜日本公式サイト](https://www.nginx.co.jp/)

# 【APサーバー】
Webサーバーから受けた要求によってビジネスロジックを実行したりDBアクセスをする`Java`アプリケーションを動かすためのミドルウェアです。
（もしくはこの機能を担うサーバー装置を指す場合もあります）

2023/8/4 追記
ここに記載しているのはJavaのAPサーバーです。
Java以外の言語では、例えば、Webサーバーの拡張機能でアプリが動いていたり、その言語用のAPサーバー相当のものがあったりするようです。(Java以外でのAPサーバーという言葉の取扱はよくわかりませんでした)

## Apache Tomcat
OSSのAPサーバーです。
`Java Servlet`や`JSP(JavaServer Pages)`を実行するサーブレットコンテナです。

`WAR`ファイルをデプロイできます。

同等のミドルウェア: `Jetty`

## <font color="Red">WildFly(旧JBoss AS)</font>
`Red Hat`が開発したOSSのAPサーバーです。
`Jakarta EE`に対応しており，`Tomcat`より高機能です。

`WAR`ファイルや`EAR`ファイルをデプロイできます。

同等のミドルウェア: `WebSphere`(IBM)，`WebLogic`(Oracle)，`GlassFish`(OSS)

[WildFly](https://www.wildfly.org/)

## JBoss EAP(JBoss Enterprise Application Platform)
`WildFly`の商用版です。
商用利用のためにはサポート契約が必要です。

# 【API開発者向けツール】
APIの仕様を管理したり，実際に`HTTPリクエスト`を送るためのツールです。

## <font color="Red">Swagger</font>
`YAML`で`OpenAPI`の仕様を定義し，管理できます。

[API Documentation & Design Tools for Teams | Swagger](https://swagger.io/)

## Postman
`Postman Inc.`の製品です。
変数などを扱えて`Swagger`より使い勝手が良かったです。
無料で機能制限があるクライアント版を使用でき，設定ファイルの入出力も可能です。
有償版ではチームで設定を共有できます。

[Postman API Platform | Sign Up for Free](https://www.postman.com/)

## <font color="Red"><ruby><rb>cURL</rb><rt>カール</rt></ruby></font>
ライブラリです。
`Linux`に最初からインストールされていたりします。
手軽にコマンドで`HTTPリクエスト`を実行できます。

[curl](https://curl.se/)

# 【IaC】(Infrastructure as Code)
ネットワーク，サーバー，ミドルウェアなどのインフラをコードとして定義する技術です。
同じインフラ構成を別の場所で再現するのに便利です。

よく使われる`Ansible`と`Terraform`はエージェントレスですが，エージェント型のものもあります。

## <font color="Blue">Ansible</font>
手続き型の`IaC`です。
構築の手順を記述します。
サーバー，ネットワークの環境構築によく使われます。

[Ansible is Simple IT Automation](https://www.ansible.com/)

## <font color="Blue">Terraform</font>
宣言型の`IaC`です。
環境のあるべき姿を記述します。
クラウド上のサーバー，ネットワークの構築でよく使われます。

[Terraform by HashiCorp](https://www.terraform.io/)

# 【認証技術】

## <font color="Red">OAuth 2.0</font>
標準的に使われる認可プロトコルです。
複数のシステムの連携に使用できます。
認証の際に利用可能なリソースまで定義されるのが特徴です。

`Twitter`や`Facebook`のアプリ連携もこの仕組です。

[OAuth 2.0 — OAuth](https://oauth.net/2/)

## <font color="Red">OpenID Connect</font>
`SSO`を実現する認証プロトコルです。
`OAuth 2.0`を拡張したものです。

`Google`，`LINE`，`Yahoo! Japan`などが準拠しています。

[OpenID Connect | OpenID](https://openid.net/connect/)

## <font color="Red">SAML(Security Assertion Markup Language)</font>
`SSO`を実現する認証プロトコルです。
`HTTP`と`SOAP`を使用します。

社内システムでよく使用されます。

[Security Assertion Markup Language (SAML) V2.0 Technical Overview](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html)

# 【マークアップ言語】
単純なテキストと決められた構文で何かを表現する言語です。

## <font color="Red">HTML(HyperText Ma rkup Language)</font>
Webページを表現するための言語です。

## <font color="Red">CSS(Cascading Style Sheets)</font>
`スタイルシート言語`です。(マークアップ言語とは違うかもしれませんが)

## XML(Extensible Markup Language)
コンピューターが理解しやすい構文です。
**人間には見づらい**です。

## <font color="Red">JSON(JavaScript Object Notation)</font>
`XML`と同等のデータを表現できますが，`XML`よりも**人間が読み書きしやすい**構文です。

[JSON Example](https://json.org/example.html)

## <font color="Red">YAML</font>
**見た目は`JSON`に似ています**。（`JSON`が`YAML`のサブセットなので当たり前らしいですが）
設定ファイルなどでよく使用します。

[The Official YAML Web Site](https://yaml.org/)

## <font color="Red">Markdown</font>
`HTML`の書きづらさを解消した言語です。
簡単な記載で`HTML`にレンダリングされます。
ソースコードと横並びのドキュメントの記載などで使用します。
`Wiki`などでも使います。
Qiitaの記事も`Markdown`で記載されます。(`HTML`も使えますが)

## PlantUML
`UML図`を記載する言語です。

[PlantUML 概要](https://plantuml.com/ja/)

## Mermaid
`UML図`を記載する言語です。

[Mermaid | Diagramming and charting tool](https://mermaid.js.org/)

## TeX
数式を記載する言語です。

# 【技術スタック】
完全なアプリケーションを実現するための技術(フレームワークやミドルウェアやDB)の集まりに対する呼称です。

アプリケーションを作るために**絶対に必要という訳ではない**ですが，スタックを使えば必要な技術要素が揃う事が保証されます。

## LAMP
- **L**inux
- **A**pache HTTP Server
- **M**ySQL(or MariaDB)
- **P**HP(, Perl or Python)
の頭文字です。

## MEAN
- **M**ongoDB
- **E**xpress
- **A**ngularJS
- **N**ode.js
の頭文字です。

`Angular`を`Vue.js`に置き換えた**MEVN**や，
`React`に置き換えた**MERN**という言葉もあります。

## JAM
- **J**avaScript
- **A**PIs
- **M**arkup
の頭文字です。

# 【プロトコル】

## <font color="Red">HTTP(Hypertext Transfer Protocol)</font>
Webシステム開発で最も重要な技術です。
**API設計やトラブルシューティングをする上で必ず理解する必要があります。**

- `HTTPリクエスト`の構造(HEADER, BODY)
- `HTTPメソッド`(GET, POST, PUT, DELETE, etc.)
- `HTTPレスポンス`の構造
- `HTTPステータスコード`(200, 400, 401, 403, 404, 500, etc.)

実際の運用では`トランスポート層`で暗号化された`HTTPS`を使用します。

## SSH(Secure Shell)
ノードにリモートアクセスするためのプロトコルです。
`Telnet`は認証を平文で行うため脆弱性がありますが，`SSH`はセキュアです。

# 【技術用語】

## 認証(Authentication)
「アクセスしている人が誰か」を確かめる仕組みです。

認証の要素は`IDとパスワード`，`BASIC認証`，`ワンタイムパスワード`，`Twitter`，`クライアント証明書`など。

## 認可(Authorization)
認証された人に対してリソースに対する権限を与えることです。

参照権限，更新権限，承認権限など。

## SSO(Single Sign On)
`シングルサインオン`です。

例: 会社のWindowsにADアカウントでログインしたら社内の複数のシステムがそのまま使える

## 証明書／認証局
クライアントやサーバーが本物であることを証明するための仕組みです。

公開鍵と秘密鍵を使います。
ある認証局のルート証明書を信頼していると，認証局にアクセスせずにその認証局が発行したクライアント証明書・サーバー証明書を検証することができます。

## FQDN(Fully Qualified Domain Name)
ドメインとサーバー名を組み合わせたものです。

このような関係です。
URL: https://www.microsoft.com/
ドメイン名: microsoft.com
ホスト名: www
FQDN: www.microsoft.com

大抵は`DNS`によって`FQDN`が1つのIPアドレスと紐付きます。

## CDN(Content Delivery Network)
世界中のサーバーにコンテンツをミラーする仕組みです。
大量のユーザーがアクセスするサービスで使用されます。
`アカマイ`，`Cloudflare`，`Amazon CloudFront`が有名です。

# 【おわりに】
ここでは取り上げていない技術や概念も無数にあります。
やっと何かを理解したと思ったら，別の新技術が流行っていたりもします。

同列に語られる技術でもカバーする範囲が微妙に違ったり，
言葉によっては厳密な意味が定義されていなかったり，
「実装までは言及していない仕様」と「よくある実装」を混同している記事が多かったり，
で調べるのが中々大変です。
（アプリを開発する上でそこまで細かい事を正確に知る意味はあまり無いかもしれませんが……）

# 【参考】

[SPA(Single Page Application)と利用されるレンダリング技術まとめ | yutaro blog](https://yutaro-blog.net/2021/12/03/spa-csr-ssr-ssg-sg/)

[本当にRESTは「4つの原則」？原文に当たって分かった驚きの事実 | 日経クロステック（xTECH）](https://xtech.nikkei.com/atcl/nxt/column/18/00138/092100882/)

[Kubernetes と Docker の比較 | Microsoft Azure](https://azure.microsoft.com/ja-jp/solutions/kubernetes-vs-docker/)

[Tomcat vs JBoss - What's the Difference? (Pros and Cons)](https://cloudinfrastructureservices.co.uk/tomcat-vs-jboss-whats-the-difference/)