Qiitaに移行します

 はてなブログで記事を書いていくときにコードのインデントが整わずに読みづらいという問題が発生していました。マークダウン記法にすれば良かった話なのですが、コードを用いる記事に関してはQiitaに移行していくことにしました。

 

qiita.com

 今日からQiitaでも随時記事を投稿していきます。

 

 

NATとNAPTとは

  インターネットで使用するものはグローバルIPアドレスであり、企業内ネットワークに存在する端末が利用するようなLANは、「プレイベートIPアドレスを使用します。

 コンピュータネットワークで、データを2つ以上の異なるネットワーク間に中継する通信機器であるルーターには、相互交換機能が備わっています。1対1で相互交換する「技術」が「NAT(Network Address Translation)」です。

 1つのグローバルIPアドレスと、複数のプライベートIPアドレスを相互交換する「技術」が「NAPT(Network Address Port Translation)」です。変換に「ポート番号」も利用し、IPマスカレードとも呼ばれます。

 ポート番号は通信相手のアプリケーションを識別するために使用される番号であり、住所のようなものです。「0 ~ 65,535」の番号がつけられます。「0 ~ 1,023」は「ウェルノウンポート」と呼ばれ、特定のアプリケーションのために予約されています。HTTP(Hyper Text Transfer Protocol)は「80」、SMTP(Simple Mail Transfer Protocol)は「25」、POP3(Post Office Protocol version 3)は「110」です。

 

 栢木厚『基本情報技術者教室』(技術評論社、2021年)

 

 上記の書籍を参考にしています。

 

 

 

インターフェースとは

 オブジェクト指向プログラミング言語を学んでいると様々な部品が登場します。オブジェクト指向とは複数の部品(オブジェクト)を組み合わせて1つのプログラムを作ることであり、僕が学んでいる「Ruby」も「Java」もオブジェクト指向プログラミング言語となります。

 「Java」を学ぶ上では、「クラス」、「メソッド」、「フィールド」、「インスタンス」、「ポリモーフィズム」、「インターフェース」といった部品がそれぞれどういう役割を果たすのかを理解する必要があるでしょう。

 今回はその中でも「インターフェース」について整理しておきます。整理するにあたって、下記の書籍を参考にしました。

 

石井真、株式会社カサレアル『いちばんやさしいJavaの教本』(株式会社インプレス、2020年)

 

辞書的な意味

 まずこの「インターフェース」の辞書的な意味を調べると、「接合部分」、「仲立ち」、「橋渡し」と言ったワードが出てきました。オブジェクト指向プログラミング言語の中でも、何かしらの「橋渡し」をする役割を持つ用語なのかもしれませんね。

 

ポリモーフィズム

 そしてこのインターフェースという仕組みは、ポリモーフィズムという考え方に基づきます。ポリモーフィズムとは「多態性」という意味であり、似たようなクラスを統一的に扱えるようにする考え方のことです。

 

インターフェースとは

 インターフェースは割と抽象的なものを定義するための部品です。もしAppleクラスとOrangeクラスとStrawberryクラスがあるとするなら、Fruitsを定義するものがインターフェースです。それくらいの抽象度の高さということです。

 

クラスと似ている

 このインターフェースはメソッドを定義することができます。またインターフェース型の変数を作ることも可能であり、その変数からメソッドも呼び出せます。そう言った点からクラスに似ていると言えます。

 

クラスとの違い

 しかしながら、インターフェース内で定義できるのは「抽象メソッド」だという点で、クラスとは大きく異なります。抽象メソッドが通常のメソッドである具象メソッドと違うのは、処理を書くためのブロック({}で囲まれた部分)を持たないことです。つまり名前と引数、戻り値の定義しかありません。インターフェースの役割は、クラスがどんなメソッドを持つかを表すことであり、実際の処理はインターフェースを実装したクラスの中に書きます。

 またクラスと違って単体ではインスタンスを生成できない点もあります。

 

 

 

 

コンパイルとは

 コンパイル方式に関する用語を説明していきます。下記の書籍を参考にしています。

 

栢木厚『基本情報技術者教室』(技術評論社、2021年)

 

 コンパイルとは、原始プログラムから目的プログラム(オブジェクトモジュール)を生成することであり、字句解析、構文解析、意味解析、最適化、コード生成を行います。

 リンクとは、複数の目的プログラムから、1つのオブジェクトモジュール(実行可能プログラム)を生成することです。

 アプリケーションの「実行中」、必要となったモジュールを、OSによって連携する方式のことを「動的リンキング」と言います。「静的リンキング」は、事前に複数のプログラムをリンクしておく方式です。

 「ロード」とは、アプリケーションの実行に先立って、ロードモジュールを主記憶に読み込むことです。

 開発に使用しているものとは異なる機種で、実行可能な目的プログラムを生成するソフトウェアを「クロスコンパイラ」と言います。エミュレータとは、特定のハードウェアやソフトウェアを、本来の仕様とは異なる動作環境で擬似的に実行させるためのハードウェアやソフトウェアのことです。「emulate」は「真似する」という意味を示します。

「RubyZip 3.0 is coming!」の警告を消す方法

 最近アプリを作り、テストコードを実行してみると、「RubyZip 3.0 is coming!」という警告が出てしまう問題が発生しました。この問題を解消した方法を軽くまとめておきます。

 まずこの警告はrubyzip2.3.1で追加されたようです。

Gemfile

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'rspec-rails', '~> 4.0.0'
gem 'factory_bot_rails'
gem 'faker'
gem 'rubyzip', '2.3.0'
end

 そのため下記のような記述をGemfileに加えました。

gem 'rubyzip', '2.3.0'

 

 そしてターミナルで「bundle update」をすると警告は表示されなくなりました。

 

 

 以上です。

 

 

 

テストコードでエラーメッセージを確認する方法

 テストコードでエラーメッセージを確認する方法を記録しておきます。やることは簡単です。まずテストコード内の「valid?」の後ろに「binding.pry」を記述します。

 

spec/models/user_spec.rb

it 'emailが空では登録できない' do
user = User.new(nickname: 'test', email: '', password: '000000',
password_confirmation: '000000')
user.valid?
binding.pry
end

 

 そしてターミナルで「user.errors.full_messages」といった記述をすれば、「Email can't be blank」といったエラー文が表示されます。

[1] pry(#<RSpec::ExampleGroups::User::Nested>)> user.errors
=> #<ActiveModel::Errors:0x00007faf069c1140
@base=
#<User id: nil, email: "", created_at: nil, updated_at: nil, nickname: "test">,
@details={:email=>[{:error=>:blank}]},
@messages={:email=>["can't be blank"]}>
[2] pry(#<RSpec::ExampleGroups::User::Nested>)> user.errors.full_messages
=> ["Email can't be blank"]

 

 ちなみにテストコードは下記のようなコマンドで実行します。

% bundle exec rspec spec/models/user_spec.rb

 この時の「bundle exec」とは、Gem同士の依存関係を整理するものです。

 

 

 以上です。

 

 

 

 

 

 

whereとLIKE句

 whereメソッドとLIKE句についてまとめておきます。テーブルとのやりとりで使われるメソッドであるため、モデルに置きます。

 

whereメソッド

 「検索」の時によく使われるメソッドであり、モデルが使用できるActiveRecordメソッドの1つです。「モデル.where(検索対象となるカラムを含む条件式)」のように引数に条件を指定することで、テーブル内の「条件に一致したレコードのインスタンス」を配列の形で取得できます。whereメソッドを連続して記述して、複数の条件に一致したレコードを取得することもできます。

 

LIKE句

 whereメソッドと一緒に用いる、曖昧な文字列を検索するときに使用するメソッドです。曖昧な文字列の検索とは、1文字目が「あ」、最後の文字が「お」のデータを探すといったことです。

 

 

 

モジュール、オブジェクト指向、ポリモフィズム

栢木厚『基本情報技術者教室』(技術評論社、2021年)

 

 上記の書籍を参考にしてモジュール、オブジェクト指向ポリモフィズムに関連する知識をまとめていきます。オブジェクト指向に関しては過去にも記事にしていますが、別の言い方で捉え直していきます。

 

kim-shun.hatenablog.com

 

構造化設計

 大きな機能から段階的に詳細化していく設計手法のことです。

 

コンポーネント

 ある機能の実現のために部品化されたプログラムのことです。

 

モジュール

 プログラムを構成する最小単位であり、独立性が高くなるように設計するものです。モジュール強度は「1つの」モジュール内に含まれる機能間の関連性の度合いであり、「強いほど」独立性が高くなります。モジュール結合度は、「複数の」モジュール間の結合の度合いであり、「弱いほど」独立性が高くなります。

 

オブジェクト指向

 オブジェクトとはデータ(属性)とそれを操作するメソッド(手続き)を一体化したもののことです。オブジェクト内のデータとメソッドを、外部から隠蔽することを「カプセル化」と言います。オブジェクトの中身を知らなくても、メッセージを送ることで必要な操作ができます。

 

クラスとインスタンス

 オブジェクトの雛形を定義したものが「クラス」であり、それを基に生成されたオブジェクトが「インスタンス」です。

 

ポリモフィズム

 既存のクラスを基にして、新しいクラスを生成できます。基となるクラスをスーパークラス(基底クラス)、新しく生成したクラスをサブクラス(派生クラス)と言います。基のクラスのデータやメソッドを派生クラスに引き継ぐことを「継承」(インヘリタンス)と言います。

 基のクラスのメソッドを「一部変えて使いたい時」は、派生クラスに同じ名前で内容を変えて「再定義」する「オーバーライド」を行います。これを「ポリモフィズム」(多相性・多態性)と言います。

 「委譲」は、あるオブジェクトに依頼されたメッセージの処理を、そのオブジェクトの内部から他のオブジェクトに委ねることです。

 

クラスの階層化

 下位クラスの共通部分を抽出して上位クラスを定義することを「汎化」と言い、その逆を「特化」と言います。

 また上位クラスが下位クラスの組み合わせで構成されていることを「集約」と言い、その逆を「分解」と言います。