Webデザインの超概要

Webデザインを学習するにあたり全体像を見渡す記事が必要と感じたので、作成しました。
情報処理技術者試験の参考書のようなノリで書いていきます。

1.近年のWebページの傾向

エンドユーザーの目に触れる部分について、HTMLの機能をそのまま使ったシンプルなページは少なくなり、ボタンやラベル等の見た目を装飾したページやアニメーションを付けたページが主流になっている。
PCと共にスマートフォンも一般的に使われるようになっており、スマートフォンの表示への対応(レスポンシブデザイン)も必要になっている。
また、従来のページでは、「①ブラウザからサーバへリクエストを送信」「②サーバからブラウザへレスポンスを送信」「③ブラウザでページを更新」を繰り返していたが、③を部品の入れ替えのみで済ませページ更新を伴わないSPA(Single Page Application)が採用されることも増えてきた。SPAでは、簡単な中間の操作では①②を伴わないこともある(ブラウザ上のメモリに保持したデータの操作だけで処理が完結する)。

これらの傾向は、エンドユーザーに感動を与える(UX、User eXperience)ために生まれたものである。
エンドユーザーに分かりやすさや快適さを提供することで、サービスの利用を促すことを目的としたものである。

なお、上記で挙げたような技術は、PCや回線に負荷をかけるものである。
PCや回線の性能が向上したからこそ、UXを重視したデザインが可能になったということも特筆するべきである。

2.近年のWeb開発の進め方

1で前述した通り、近年のWebページではデザインについて考慮するべきことが増えており、Webデザインの専門性が強くなっている。
そのため、従来のシステムエンジニアに加え、専門のWebデザイナーが開発に加わることが増えている。
システムエンジニアとWebデザイナーが協働する上で、システムエンジニアはWebデザイナーと会話できるようにWebデザイナーの仕事内容を理解するべきであり、その逆もしかりである。

Webデザイナーは主に上流工程を担当する。
ウォーターフォールの場合、開発の進め方は以下のようになる。

要件定義工程でWebデザイナーがUIのデザインを決める

設計工程でシステムエンジニアが要件定義に沿った画面設計を行う

画面設計に沿って実装を行う

実装したものを単体試験・結合試験にて検証する

総合試験にて、Webデザイナーはデザイン通りに実装されていることを確認する

3.Webデザイナーが使用する技術

Webデザインを行う上で、レイアウト配置や配色パターン、フォント、画像、アニメーション等を考える必要がある。
良いデザインを行う上での理論や資格はあるが、個人の感覚による部分が大きい。
(感覚は、既存のデザインから学んだり、エンドユーザーの反応から学んだりすることで鍛えることができる)

デザインは、Photoshop、Illustrator、Adobe XD、Sketchといったツールで表現する。
これらのツールを用いることで、デザインを正確かつ軽快に伝えることができる。
(誤解を恐れずに言えば、Microsoft Power Pointをデザイナー向けに機能特化したツールであるとイメージすれば良い)

4.システムエンジニアが使用する技術

システムエンジニアは、以下の技術を用いることでデザインを実装する。

見た目の装飾やアニメーション
CSSを用いて実装する。
アニメーションはJavaScriptのライブラリで実装することもあるが、CSSもCSS3のバージョンにてアニメーションの機能が追加されたため、CSSで実装することが増えている。

・レスポンシブデザイン
CSS3のメディアクエリと呼ばれる機能を使うことで実装する。
また、レスポンスデザインを実現するためのツールやサービスも存在している。

・SPA
JavaScriptにより実装する。
また、一般的には、Angular、React、Vue.jsといったフレームワークを併用する。
これらのフレームワークを機能強化するために追加して用いるフレームワークも登場しており、例えばVue.jsの場合はVuexやNuxt.jsといったフレームワークを追加で適用することができる。


いかがでしたでしょうか。

体系的な知識はIPAの情報処理技術者試験で概ねカバーできるのですが、Webデザインの分野はカバーされていないので作成してみました。
他チームと調整する場合や学習を進める場合に、こうした体系的な知識は役立つと思います。

java:ソートキーが複数存在する場合、一時的なフォーマット変更ではなく独自Comparatorで対応するべき

複数のソートキーが存在するオブジェクトの配列について、固定長のフォーマットに直すことでソートキーを1つにできます。
しかし、フォーマットを直して1つのキーでソートできるようにするよりも、独自Comparatorを定義して複数のキーでソートした方が高速なので、そのようなケースでは独自Comparatorを定義して対応するべきです。

単純にフォーマット変更でコストがかかるだけでなく、ソート処理自体も複数のキーでソートした方が高速です。
複数のキーを1つのキーにまとめてソートする場合は必ずキー全体を見る必要がありますが、複数のキーでソートする場合はキーの一部を見るだけでソートできる場合があるので、複数のキーでソートした方が高速になるのだと思います。

以下、テスト結果です。

【ソースコード】

・SortTest.java

・SortTestRecord.java

・SortTestComparator.java

【結果(1回目)】

【結果(2回目)】

【結果(3回目)】

【結果まとめ】


いかがでしたでしょうか。

昔に固定長フォーマットに直してまとめてソートするという手法を実務で見かけたので試してみましたが、この手法はやめた方が良さそうなことがわかりました。
ソート処理自体も複数のキーでソートした方が高速だというのは意外でした。

Java:任意の順番でのソート

JavaのCollection型(サブクラスにList型等がある)は、Collections.sortメソッドでソートすることが可能です。
Collections.sortメソッドは、第一引数にソートしたいCollection型のオブジェクト、第二引数にComparator型のオブジェクトを渡します。
第二引数のComparator型のオブジェクトにより、ソート順が決まります。

Collections.sortメソッドでは、Comparator型のcompareメソッドを利用してソートを行います。
ソート順を定義するためには、Comparator型を実装したクラスを独自に作成し、compareメソッドをオーバーライドして独自のロジックを記述する必要があります。
compareメソッドの説明は以下です。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html#compare-T-T-
簡単に言うと、compareメソッドの第一引数と第二引数について、戻り値がマイナスの値の場合は「第一引数→第二引数」の順番に並び、戻り値がプラスの値の場合は「第二引数→第一引数」の順番に並びます。

これを利用して、任意の順番でソートを行うサンプルが以下になります。

【サンプルコード】

・MySortMain.java

・MySort1.java

・MySort2.java

【実行結果】


いかがでしたでしょうか。

javaで独自順のソート処理をする機会があったので、実装方法を簡単に書いてみました。
Comparatorインターフェースのcompareメソッドを実装すること、compareメソッドの戻り値によりソート順を定義すること、を抑えれば、何をしているか理解できると思います。

Base64の説明とjavaでのエンコード・デコードの例

Base64とは、テキストデータやバイナリデータ(画像ファイル、PDFファイル等)を表現する方式の一つです。
以下の64種類の文字と末尾のパディング文字(=)を用いて表現するのが特徴です。
・アルファベット(a~z, A~Z)
・数字(0~9)
・一部の記号(+, /)

この表現方式は、一部の文字しか使用できないプロトコルでデータの送受信を行いたい場合に有用であり、ASCII文字しか送受信できないプロトコルでもデータの送受信が可能になります。
有名な所で言うと、電子メール(SMTP)でBase64が使われています。
また、APIでのデータ送受信でも良く使われます。

ここで、Base64のエンコード・デコードをイメージしやすくするため、2バイト文字(日本語)をJava8 の java.util.Base64を用いてエンコード・デコードしてみます。

【サンプルコード】

・Base64Test.java

【実行結果】


なお、今回の記事では触れませんが、バイナリファイルを1バイトずつエンコード・デコードすることで、バイナリデータにも対応できます。
また、Base64のエンコード・デコードの方式は公開されており、人気の言語ではライブラリも存在しているので、他の言語でも実装可能です。


いかがでしたでしょうか。

Base64については入門書で触れられることが少なく、情報処理技術者試験でも午前問題で稀に出題される程度なので、実務で初めて耳にする方は少なくないと思います。
「Base64を使えば画像や動画もASCII文字(1バイト文字)で表現できる」というざっくりな知識だけでも覚えておけば、実務でもスムーズにコミュニケーションできるかと思います。

java:通常のクラスと匿名クラス(無名クラス)の書き方の比較

以前の記事で「通常のクラスと匿名クラスの書き方の比較を見たい」という意見があったので、少し補足を行います。

サンプルコードの通り、匿名クラスの場合、クラスに名前を付ける必要が無く、またオブジェクト生成と同時に処理を定義することができます。
これにより、以下のようなメリットがあります。

  • 記述を簡潔にできる
  • 使い捨てのクラスを定義でき、使い捨てであるという意図も明確にできる
  • (ソースファイル名とクラス名を同じにする場合)管理が容易になる

【サンプルコード】

・AnonymousClass.java

・AnonymousSubClass.java

・AnonymousInterface.java

・AnonymousImplementsClass.java

・AnonymousMain.java

【実行結果】


良い意見やコメントを頂いた時は、今回のような形で答えていきたいと思います!