R. 1 ネットワークスペシャリスト試験 午後1問題"自分用"メモ

問1

VRRP

ルータを冗長化させる技術。通常時はマスタールータのみがパケットの転送を行う。VRRPアドバタイズメントによって互いの状態を監視する。プライオリティ値の大きいルータがマスタールータとなる。

SNMP

UDPを使う。

SNMPポーリング

SNMPマネージャからSNMPエージェントに向けて送られるパケット。このパケットでエージェントの状態を送るように要求する。

SNMPトラップ

エージェントからマネージャに対してエージェントの状態を通知するために送られるパケット。

LACP

あとでかく

問2

各種ポート番号

SMTP (Simple Mail Transfer Protocol) : 25

POP3 (Post Office Protocol version 3) : 110

問3

DHCPサーバー

新たにネットワークに接続された端末に対してIPアドレスを割り振ったり、DNSサーバーのIPアドレスを教えたりする。

端末はサーバーに対してブロードキャストでDHCP発見パケットを送る。そのため、DHCPサーバーがネットワーク外にある場合はパケットが届かない。そういう場合はネットワーク内のDHCPリレーエージェントが代理でDHCPサーバーに対してユニキャストで要求を送る。

DHCPサーバーは特定の範囲(アドレスプール)からIPアドレスを選んで要求元に割り振るか、要求元のmacアドレスに対応したIPアドレスを割り振る。

DHCPスヌーピング

DHCPサーバーからIPアドレスを取得したクライアントのみが通信できる仕組み。

trusutedポートとuntrustedポートを設定する。trustedポートは無条件に通信が許されるポートで、DHCPサーバーなどが接続される。untrustedポートはDHCPサーバーへの通信のみが許される。このポートに接続された端末が、DHCPサーバからIPアドレスが付与されたのを確認されると、DHCPサーバー以外との通信が可能になる。

参考文献:番外編 DHCPスヌーピングでよりセキュアな環境を構築する

R. 3 ネットワークスペシャリスト試験 午後1問題"自分用"メモ

問1

DHCPサーバ

DNSサーバのアドレスを教えるのもDHCPサーバの役割

REST API

RESTの原則に従って作られたAPI。HTTPプロトコルによってネットワーク機器と接続し、設定の取得や変更が行える。

traceroute

目的地までに経由するL3ネットワーク機器を列挙するコマンド。

LLDP

レイヤ2の技術。隣接する機器に自分の情報を送ったり、情報を取得したりできる。

問2

VPC

仮想ネットワーク。プライベートIPアドレスを割り当てることができる。

バックボーンエリア

OSPFのエリア番号0のエリア。必ず存在しなければいけない。バックボーンエリアから受け取った経路情報は他のエリアに広告されない(ループ回避のため)。

経路集約

いくつかのネットワークへの経路を、IPアドレスを大きく取ることでまとめて広告すること。ABR(エリア境界ルータ)しかできない。

再配布

OSPFでは、静的経路など異なるルーティングプロトコルの経路情報は伝搬されない。OSPFで広告したければ、再配布を行う必要がある。

問3

CS-ACELP

音声の符号化の方法。携帯電話で利用される。伝送レート8 kbps。

ジッタ

パケットの到着時間のゆらぎ。バッファで到着時間のゆらぎを吸収して音質をあげる。

ToSフィールドとDSフィールド

ToSフィールドを再定義したのがDSフィールド。DSフィールドの上位6ビットがDSCP、下位2ビットがECN。

参考文献

『ネスペR3 - 本物のネットワークスペシャリストになるための最も詳しい過去問解説 情報処理技術者試験』左門 至峰、平田 賀一共著、技術評論社

自分用メモ:優先度の話がややこしい

自分用のメモです。随時書き足す

背景

最近ネットワークスペシャリストの勉強に明け暮れているが、そこで少しややこしいと思ったことがあった。

それは、プロトコルによって、プライオリティ値が大きいものが優先ものもあれば、プライオリティ値が小さいものが優先されるものもあると言うこと。

というわけで、いかにも試験勉強という感じで嫌だが、それらについて随時簡単にまとめておこうと思う。

プライオリティ値が大きいものが優先

StackWise テクノロジー

最も高いプライオリティ値を持つスイッチがマスタになる。

OSPF

最も大きなプライオリティ値を持つルータが代表ルータになる。

プライオリティ値が小さいものが優先

STP

最も小さいブリッジプライオリティを持つスイッチがルートブリッジになる。

検索時のサジェスト機能を実装する

HTMLのinput要素の機能を利用する

input要素のlist属性に、入力候補を列記したdatalistのidを指定する。autocomplete属性を"off"にしておくと、入力履歴がサジェストされなくなる。

コード例
<input type="text" autocomplete="on" list="sns">
<datalist id="sns">
    <option value="Twitter"></option>
    <option value="Instagram"></option>
    <option value="Facebook"></option>
</datalist>

実装

次のようにdatalistに投稿タイトルをすべて格納する。

search_index.html.erb
<h1>検索</h1>
<%= form_tag("/search/result", data: { turbo: false}) do %>
    <input type="text" name="word" autocomplete="off" list="post_titles">
      <datalist id="post_titles">
        <% @posts.each do |post| %>
            <option value="<%= post.title %>"></option>
            <% logger.debug(post.title) %>
        <% end %>
      </datalist>
    <input type="submit" value="検索">
<% end %>
search_controller.rb
class SearchController < ApplicationController
  def search_index
    @posts = Post.all
  end

  def result
    @posts = Post.where('title like ?', "%#{params[:word]}%")
              .or(Post.where('content like ?', "%#{params[:word]}%"))
              .order(created_at: :desc)
  end
end
問題点

検索ページを開いたタイミングで、投稿データをすべてdatalistに入れるので、データ数が多くなると処理が重くなる。

Readmeを書く

背景

GitHubソースコードを公開するなら、Readmeも自分なりにきちんと書いておきたいと思った。やりたいこととしては次の二点

  • Readmeの文法に則って説明を書く
  • デモ用に動画を乗せる

Readmeの文法に則って説明を書く

マークダウン記法で書く。自分はマークダウン記法というのを知らなかったので、次のサイトを参考にした。

READMEの書き方 - Laravel学習帳

とりあえず次の事柄に気をつけた

  • # で見出しをつける(#が多いほど見出しとしては小さくなる)
  • 半角スペース2つで改行
  • * で箇条書き

デモ用に動画を乗せる

gif形式の動画をissueにアップロードして、得られたURLを書き込めばOK。以下のサイトを参考にした。

GithubのReadmeに荒くないgifを作成から貼り付けまで

改行コードを<br>タグに変換して表示する

背景

今までtextareaで受け取った文字列をそのままhtmlに埋め込んで表示していた。これだと改行が反映されないので困っていた。

解決策

文字列の置換

gsub関数

コントローラで文字列を置換することにした。Rubyでは、文字列の置換をgsub関数で行う。改行コードの一括置換は次のように行う。

test.gsub(/\R/, "<br>")

ここで \R は改行コードを表すメタ文字。このようにして改行コードを一括で<br>タグに変換した。

参考文献
文字列中の改行コードを統一する - Qiita

HTMLタグのエスケープの回避

このままでは、<br>タグがエスケープされる。

html_safe

text.html_safe

こうすると、タグのエスケープが行われなくなる。ただし、<script>グもそのままになるので、XSSが怖い(他にもいろいろあるかも)

参考文献
HTML特殊文字のエスケープ - Ruby on Rails入門

sanitize

erbファイルで次のように記述する。

sanitize(text, tags: %w(br))

こうすると、<br>タグのみエスケープされなくなる。これで安心。

参考文献
sanitize | Railsドキュメント

成果物の一部(自分用メモ)

詳細はGitHub

show.html.erb(sanitizeの使用例)

<div data-controller="show">
<ul data-action="show#content">
  <% @post.errors.full_messages.each do |message| %>
    <li>
      <%= message %>
    </li>
  <% end %>
</ul>
<h2><%= @post.title %></h2>
<h3><%= @post.created_at %></h3>
<p><%= link_to("編集", "/posts/#{@post.id}/edit") %></p>
<p data-action="click->show#confirm"><%= link_to("削除", "/posts/#{@post.id}/destroy", data: {confirm: "a", turbo_method: :post}) %></p>
<p><%= sanitize(@content, tags: %w(br)) %></p>
<p><%= link_to("記事一覧へ", "/posts/index") %>
</div>

post_controller.rbの一部(gsubの使用例)

  def show
    @post = Post.find_by(id:params[:id])
    @content = @post.content
    @content = @content.gsub(/\R/,"<br>")
  end

JavaScript で削除確認ボタンを作った

昨日詰んだって書いてたけど、なんとかできた。結論から言うと、event.preventDefault()を呼ぶことで、リンクをたどるのをキャンセルできる。

解決策に気づいた経緯

Stimulus Referenceを見ていたらドンピシャリな記述が見つかった。

こんな記述です。


Cancels the event’s default behavior (e.g. following a link or submitting a form)

JavaScript に無知すぎて、全く知りませんでした。昨日までは、確認ボタンの返り値で遷移先のページを分けようとしていたんですが、そうするとどちらの分岐でも削除機能を呼ぶリンクをたどってしまって困っていました。

コード

show.html.erb

<div data-controller="show">
<ul>
  <% @post.errors.full_messages.each do |message| %>
    <li>
      <%= message %>
    </li>
  <% end %>
</ul>
<h2><%= @post.title %></h2>
<h3><%= @post.created_at %></h3>
<p><%= link_to("編集", "/posts/#{@post.id}/edit") %></p>
<p data-action="click->show#confirm"><%= link_to("削除", "/posts/#{@post.id}/destroy", data: {confirm: "a", turbo_method: :post}) %></p>
<p><%= @post.content %></p>
<p><%= link_to("記事一覧へ", "/posts/index") %>
</div>

show_controller.js

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  confirm() {
    var flag = window.confirm("本当に削除しますか?");
    if (!flag){
      event.preventDefault();
    }
  }
}


  1. リンクが押される
  2. JavaScript のconfirm 関数(自作)が呼ばれる
  3. 確認ボタンが表示される
  4. 「はい」が押されたら削除機能を呼ぶリンクをたどる。「いいえ」が押されたらリンクをたどるのをキャンセルする
って感じの流れです。

参考にしたサイト

JavaScript の event.preventDefault() のことが解説してあったので読みました。

【JavaScript】event.preventDefault()が何をするのか