浅野直樹の学習日記

この画面は、簡易表示です

Pythonで退屈な作業を自動化する「第18章 CSV、JSON、XML」の訳後感

訳文はPythonで退屈な作業を自動化するです。

XMLの説明が追加されるなど、第2版から加筆されています。

割と地味な内容ではありますが、ITに携わる者としては押さえておきたいです。

私は必要に迫られて調べることで何となくこれらのフォーマットを使っていましたけれども、このような体系的な説明を読んで、CSVのreaderオブジェクトのline_num属性で整数の行番号を取得できる、JSONには文字列型、整数型、浮動小数点数型、ブール型、リスト型、辞書型、None型の基本的な型を含められる、XML文書を読み取る2つの方法があるといった新たな発見がありました。



Pythonで退屈な作業を自動化する「第17章 PDFとWord文書」の訳後感

訳文はPythonで退屈な作業を自動化するです。

この章は第2版とほぼ同じ内容になっています。PDFのテキスト抽出をしてからAIによる後処理をする部分は新しいです。

PDFとWord文書はPythonから扱いにくいですが、特に事務系の業務に従事していると避けられないところではあります。

PDFに深入りするととても大変なので、テキスト抽出、回転、ページ結合、重ね合わせあたりに内容を絞ったのは妥当な線だと思いました。



Tellus公式データAPIの使い方でわかりづらかった点

Tellus公式データAPIと数日間格闘して、Tellus公式データAPIを使って指定した住所の周辺の衛星画像を取得するまでこぎつけました。

あとに続く人のために、わかりづらかった点をまとめます。

ユーザー登録からAPIトークンの発行までは簡単でした。例えばTellus APIを利用した衛星データ活用 可視化偏などをご参照ください。

 

 

1.全体像

Tellus Travelerというブラウザから衛星データを検索して閲覧できるサービスで感触をつかんでから、その作業をプログラムから自動化するためにAPIを使うという順序を強くおすすめします。私は最初にこの全体像を聞きたかったです。

APIドキュメントは、「サポート」→「利用ガイド」にあります。

いろいろなページがあって道に迷いそうになりますが、頻繁に参照するのはこの2箇所です。

 

2.Tellus Traveler

デフォルトではすべてのデータセットが選択された状態になっていて、このまま検索すると膨大なデータがヒットしてわけがわからなくなります。いったんすべてクリアしてから、興味のあるデータセットを少数選ぶことをおすすめします。

データセットの違いや特徴を理解するのも難しいですが、これは物事の性質上どうしても難しいので仕方ないです。私はまだほとんど理解できていません。

AOI(関心領域)で検索対象とする地理的な場所を選択できます。それも絞ったほうがヒットする結果が少なくなって見やすいです。

検索結果はシーン単位で表示されます。一つのシーンが一つの衛星画像だと大まかに考えるとわかりやすいです。

 

3.APIの使い方

APIリファレンス(Tellus公式データAPI)が非常に見づらいので、以下のサンプルコードを見たほうがわかりやすいです。

特に最初の2つが最重要資料だと私は考えます(最後の2つが重要でないと考える理由は後述します)。

 

(1) シーンを検索して衛星データをダウンロード(前編) (サンプルコード)

APIトークンの発行やPythonのモジュールのインストールについては丁寧に説明されているのですが、肝心のTellus公式データAPIについてはいきなりコードを示されて面食らいます。

シーンの検索→(シーン情報の取得)→ファイル情報の取得→ダウンロードURLの取得→データ(画像)ダウンロードという流れを最初に示してもらいたかったです。

そして、示されるコード例が、関数の定義と呼び出しがつながっていて、理解に苦しみました。

赤線の上が関数の定義、赤線の下が関数の呼び出しです。せめてここに改行がほしかったです。

また、ご覧のとおり、この図の関数呼び出しがわかりづらいです。引数で各種設定ができるように柔軟な関数になっている分だけ理解しづらいのです。

Tellus公式データAPIを使って指定した住所の周辺の衛星画像を取得するで私が書いたように、関数の定義部分でできるだけ固定したほうがわかりやすいと思います。

この前編では、シーンの検索→(シーン情報の取得)まで扱われているのですが、この→のつなぎ目がわかりにくいです。printした結果ないしTellus Travelerの操作画面から手動でコピーすることが想定されているようです。

そうではなく、Tellus公式データAPIを使って指定した住所の周辺の衛星画像を取得するで私が書いたように、プログラムで取得する方法が知りたかったです。言い換えると、この前編を通してのコードの全体像を示してほしかったということでもあります。「# API 呼び出しの共通設定」と書かれている部分は1回だけ書けばよいと気づくのにも時間がかかりました。

データ(画像)を取得するのが目的ならシーン情報の取得は必須ではないこと、「data_id(シーンID)」と書かれているように、data_idとシーンIDが概念的に同じものを指していることを理解するのにも苦労しました。

 

(2) シーンを検索して衛星データをダウンロード(後編) (サンプルコード)

前編同様、シーンの検索→(シーン情報の取得)→ファイル情報の取得→ダウンロードURLの取得→データ(画像)ダウンロードという流れが示されずにいきなりコードが登場します。この後編では、ファイル情報の取得→ダウンロードURLの取得→データ(画像)ダウンロードが扱われます。

細かいことですが、ファイル情報の取得に相当する関数名が、この後編ではget_files_listとなっていて、ややミスリーディングです。データ(画像)ファイルにはまだまだたどり着けませんので。私はget_file_informationという名前の関数にしました。

ダウンロードURLの取得では、何の説明もなしにfile_idとして9が指定されていることに戸惑います。おそらく、その前の段階のファイル情報の取得結果をprintで表示して、ほしいファイルのidを目視で見つけ出したのでしょう。私はwebcog形式のファイルがほしかったので、やむなく「if “webcog” in file[“name”]:」としてそのファイルidを見つけ出すコードを書きました。

データ(画像)ファイルのURLまで取得できれば、あとはTellus公式データAPIというよりもPythonの一般的な処理になります。この後編では複数ファイルを一括でダウンロードするコードを示してくれていますが、読みづらく、一つのファイルがダウンロードできたら複数ファイルをダウンロードするように拡張するのはPythonの知識でできるので、この部分は参考にしていません。

 

(3) 光学データ「SLATS」をダウンロードして画像結合 (サンプルコード)

国立競技場の衛星画像を取得するという、見た目にわかりやすく興味深い内容です。

しかし、致命的なことに、ここで説明されているSLATSはTellus環境でのみ利用可能で、それ以外の環境からは利用できません。

開発/解析環境 | Tellusによると、Tellus環境は最低でも月額1万円を超えるので、個人で気軽に試すにはハードルが高すぎます。

どおりで国立競技場の衛星画像を取得してみたくてサンプルコードを慎重にコピーして何度実行してもうまくいかないわけです。画像をダウンロードするところで「KeyError: ‘download_url’」が発生します。エラーが発生した「url = download_url[“download_url”]」の行の直前に「print(download_url)」を実行してみたら、「{‘detail’: ‘このアクションを実行する権限がありません。’, ‘code’: ‘permission_denied’}」という表示だったため、権限の問題だと気づきました。

APIの使い方を説明する記事でTellus環境からしか使えないデータセットを例に取るのはやめてもらいたいです。ここで時間を浪費しました。

また、仮にこの問題をクリアしたとしても、(1)(2)と同様のわかりにくさに加えて、分割した画像で国立競技場が写っている範囲をおそらく目視で推測して選んでいるのがとてもわかりにくいです。「io.imshow(img[row1_size * 20 : row1_size * 30, col1_size * 15 : col1_size * 25, :])」の数値がどこから出てきたのかが疑問です。

 

(4) SARデータ「PALSAR-2」をダウンロードして描画 (サンプルコード)

いちいち細かく示しませんが、PALSAR-2もTellus環境でのみ利用可能で、それ以外の環境からは利用できません。

これをAPIの説明で例に使われても…と感じます。

 

4.まとめ

せっかく素晴らしいデータを無料で公開しているのに、ドキュメントがわかりづらくて利用できていない人がたくさんいるのではないかと危惧します。

このデータをもっと多くの人が有効活用できるように、私が理解した限りのことを書き残しました。

 



Tellus公式データAPIを使って指定した住所の周辺の衛星画像を取得する

仕事でTellus公式データAPIを使うことになり、数日間悪戦苦闘してようやく仕組みがわかってきました。

指定した住所の周辺の衛星画像を取得するという例で、Tellus公式データAPIの使い方をコード例とともにわかりやすくまとめます。

数日前の自分が読みたかった記事です。比較的新しいサービスのせいか、まだ解説記事があまりありませんでした。

パッケージのインストール方法やループ、関数など、Pythonの基本は理解しているという前提で書きます。

 

1.コード例

私の手元で動作確認をしたコード例を示します。

わかりやすさのために、エラー処理はしておらず、トークンや住所などをコードに書き込んでいますので、そのあたりは適当に処理してください。

・main.py

import time
import my_latlng
import my_tellus
import my_images

# 定数の設定
address = "京都府京都市左京区下鴨宮河町"
dataset_id = "ea71ef6e-9569-49fc-be16-ba98d876fb73"
the_number_of_images = 5

# 住所から緯度経度を取得
latlng = my_latlng.get_latlng(address)

# 取得した緯度経度からtellus用の矩形の緯度経度を算出
tellus_rectangle_latlng = my_latlng.get_rectangle_latlng(latlng)

# tellus用の矩形の緯度経度からシーンを検索してdata_id(シーンID)を取得
scenes = my_tellus.search_scene(
    dataset_id=dataset_id,
    intersects={
        "type":"Polygon","coordinates":[
            tellus_rectangle_latlng
        ]
    }
)
print(f"{len(scenes["features"])}件のシーンがヒットしました")

# シーンごとにファイル情報を取得して 形式の画像を処理
for scene in scenes["features"][:the_number_of_images]:
    data_id = scene["id"]
    file_information = my_tellus.get_file_information(dataset_id, data_id)
    
    for file in file_information["results"]:
        if "webcog" in file["name"]:
            file_name = file["name"]
            file_id = file["id"]
            print(f"{file_name}を処理しています")
            download_url = my_tellus.get_download_url(dataset_id, data_id, file_id)
            my_images.get_tellus_image(download_url["download_url"], file_name)
            my_images.clip_image(file_name, tellus_rectangle_latlng)
            time.sleep(1)

・my_latlng.py

import urllib
import requests

def get_latlng(address):
    """国土地理院の住所検索APIを利用して、指定された住所の緯度経度を取得する。

    Args:
        address (str): 緯度経度を検索する住所

    Returns:
        latlng (list): 経度と緯度のリスト [lng, lat]

    """
    address_search_url = "https://msearch.gsi.go.jp/address-search/AddressSearch?q="
    quoted_address = urllib.parse.quote(address)
    response = requests.get(address_search_url + quoted_address)
    response.raise_for_status()
    latlng = response.json()[0]["geometry"]["coordinates"]
    return latlng

def get_rectangle_latlng(latlng):
    """緯度経度からTellus用の矩形の緯度経度リストを生成する。

    Args:
        latlng (list): 中心の緯度経度 [lng, lat]

    Returns:
        tellus_rectangle_latlng (list): 矩形の頂点座標のリスト(二次元リスト)

    """
    margin = 0.01
    lng = latlng[0]
    lat = latlng[1]
    
    tellus_rectangle_latlng = [
        [lng - margin, lat - margin], 
        [lng + margin, lat - margin], 
        [lng + margin, lat + margin], 
        [lng - margin, lat + margin],
        [lng - margin, lat - margin],
    ]
    return tellus_rectangle_latlng

・my_tellus.py

import json
import requests

TOKEN = "TOKENXXXXXXXXXXXXXXXXXX"

# API 呼び出しの共通設定
BASE_URL = "https://www.tellusxdp.com/api/traveler/v1"
REQUESTS_HEADERS = {
    "Authorization": "Bearer " + TOKEN,
    "Content-Type": "application/json",
}

def search_scene(dataset_id, intersects):
    """Tellus APIでシーンを検索する。

    Args:
        dataset_id (str): 検索対象のデータセットID
        intersects (dict): 検索範囲を指定するGeoJSON形式のPolygon、例: {"type": "Polygon", "coordinates": [[...]]}

    Returns:
        scenes (dict): 検索にヒットしたシーンの情報のリストを含む辞書

    """
    url = f"{BASE_URL}/datasets/{dataset_id}/data-search/"
    payloads = {
        "intersects": intersects,
        "query": {},
        "sortby": [
            {"field":"properties.end_datetime","direction":"desc"}
        ],
    }
    response = requests.post(url, headers=REQUESTS_HEADERS, data=json.dumps(payloads))
    response.raise_for_status()
    scenes = response.json()
    return scenes

def get_file_information(dataset_id, data_id):
    """Tellus APIで指定したシーンのファイル情報を取得する。

    Args:
        dataset_id (str): データセットID
        data_id (str): シーンID

    Returns:
        file_information (dict): ファイル情報の一覧を含む辞書

    """
    url = f"{BASE_URL}/datasets/{dataset_id}/data/{data_id}/files/"
    response = requests.get(url, headers=REQUESTS_HEADERS)
    response.raise_for_status()
    file_information = response.json()
    return file_information

def get_download_url(dataset_id, data_id, file_id):
    """Tellus APIでファイルのダウンロードURLを取得する。

    Args:
        dataset_id (str): データセットID
        data_id (str): シーンID
        file_id (str): ファイルID

    Returns:
        download_url (dict): ダウンロードURLを含む辞書

    """
    url = f"{BASE_URL}/datasets/{dataset_id}/data/{data_id}/files/{file_id}/download-url/"
    response = requests.post(url, headers=REQUESTS_HEADERS)
    response.raise_for_status()
    download_url = response.json()
    return download_url

・my_images.py

import requests
import rioxarray
import matplotlib.pyplot as plt

def get_tellus_image(download_url, file_name):
    """Tellusから画像ファイルをダウンロードして保存する。

    Args:
        download_url (str): ダウンロードURL
        file_name (str): 保存するファイル名

    """
    response = requests.get(download_url)
    response.raise_for_status() 
    with open(file_name, 'wb') as file:
        file.write(response.content)

def clip_image(file_name, tellus_rectangle_latlng):
    """画像を指定された矩形領域でクリップし、PNGファイルとして保存する。

    Args:
        file_name (str): クリップ対象の画像ファイル名
        tellus_rectangle_latlng (list): Tellus用の矩形の緯度経度リスト(二次元リスト)

    """
    bounding_box = [
        tellus_rectangle_latlng[0][0], 
        tellus_rectangle_latlng[0][1], 
        tellus_rectangle_latlng[1][0],
        tellus_rectangle_latlng[2][1],
    ]
    data = rioxarray.open_rasterio(file_name, masked=True)
    clipped_data = data.rio.clip_box(*bounding_box)
    fig, ax = plt.subplots(figsize=(8, 8))
    clipped_data.sel(band=[1, 2, 3]).astype("uint8").plot.imshow(ax=ax)
    ax.set_title('')
    plt.savefig(f"clipped_{file_name}.png")

 

この4つのファイルを同じディレクトリに入れ、python main.pyと実行すれば、コードに書いた住所付近の衛星画像が指定枚数分だけ作成されます。

2025年10月30日に、この例で書いたように京都府京都市左京区下鴨宮河町付近の衛星画像を5枚作成すると、以下のようになりました。

画像の著作権はすべてJAXAにあります。

鴨川デルタと呼ばれる、川がYの字に合流する地点を住所として指定しました。雲がない画像だときれいに写っていますね。画像左下の緑の部分は御所です。

 

2.大きな流れ

(1) 住所→住所の緯度経度(1点)

(2) 住所緯度経度(1点)→住所を中心とする矩形の緯度経度(5点)

(3) dataset_idと矩形の緯度経度(5点)→data_id(シーンID)

(4) dataset_idとdata_id→ファイル情報一覧

(5) dataset_idとdata_idとfile_id→(COG形式の画像ファイルの)ダウンロードURL

(6) ダウンロードURL→COG形式の画像ファイル

(7) COG形式の画像ファイル→住所を中心とする矩形の緯度経度でクリップしたPNG形式の画像ファイル

(1)と(2)の緯度経度関係の処理をmy_latlng.pyに、(3)と(4)と(5)のTellus公式データAPIの処理をmy_tellus.pyに、(6)と(7)の画像処理をmy_images.pyに書いています。

この大きな流れの見通しをつかむまでに苦労しました。

 

3.緯度経度の処理

(1)の住所から緯度経度への変換は、Pythonで地名/住所から緯度/経度を取得し地図にプロットする方法 #folium – Qiitaを参考に国土地理院のAPIを利用するとあっけなくできました。これはありがたいです。

(2)は(1)で取得した緯度経度にそれぞれ0.01を足したり引いたりすることで、指定した住所付近の矩形にしました。指定した住所を中心とする約2キロメートル四方の矩形です(緯度により0.01の東西の距離が変わってしまい正方形になりませんが、今回は周辺画像を大まかに取得したいという目的なので、これでよしとしました)。

 

4.Tellus公式データAPIの使い方

tellus-traveler-pythonというパッケージを使ってもよかったのですが、ここでは原理的な理解を目指して、公式のAPIをそのまま利用しました。

How to Use|TellusHow to Use|Tellusが最重要の資料です。

それをもとに試行錯誤を繰り返し、できるだけわかりやすい形にしたのが冒頭で示したコードです。

この公式ドキュメントがわかりづらかったので、別記事で詳しくまとめられたらと思っております。

 

5.取得した画像の後処理

この部分はTellus APIを利用した衛星データ活用 可視化偏からほぼそのまま拝借しました。

COG形式の画像ファイルを活用すると緯度経度でクリップできるというのがポイントです。

ただ、それをそのまま保存しても人間が見てすぐにわかるような衛星写真の画像にはならなかったので、Matplotlibで可視化しました。

私はこのあたりの処理がよくわかっておらず、もっとよい方法があるかもしれません。

ともあれ、やりたいことは実現できたので、知見を共有します。

 



令和7年度秋期情報処理安全確保支援士試験を受けました

令和7年度秋期情報処理安全確保支援士試験を受けてきました。

受ける直前の記事は令和7年度秋期情報処理安全確保支援士試験を受けますです。

以下、感想と再現答案です。

 

午前Ⅰ

1周目でそれなりに解けた感触があり、2周目で迷った問題や計算問題の答えを出して、解答用紙にマークしました。

思考プロセスの一部を紹介します。

問3は、m行n/m列だから、列の平均がn/2mで行の平均はm/2で、これらを足したものが選択肢イにあったので選びました。

問7は、aが1でbが0で、このときだけ1になるものを選べばよいから、足し算は1となる組み合わせが2つあるのであり得ず、選択肢アが条件を満たすと考えました。

問10は、2つのLANの差から考えるので、パケットの個数が同じだからパケットの送信間隔は気にせず、全部ビット単位で考えたほうが計算しやすそうだったのでビットに揃え、方程式を解いてウを選びました。

問19は、少なくとも8人月余計にかかるから800万円以上になるはずなのに選択肢の最高額が700万円でどうしようかと悩みました。他のプロジェクトを手伝うためにこのプロジェクトから外れたメンバーの人件費は計上しない理屈なのかとひらめき、それなら教育期間の4人月×半月=200万円でアと考えました。

問29は、機械1時間当たりの利益が商品Aが1500円で商品Bが1250円だからほかに制約条件がないこの問では全部商品Aを作る、15000時間だから8で割り切れるので商品Aが整数個作れるので、1時間当たりの利益から合計の利益を単純計算し、固定費を差し引いてイとしました。

正解と照らし合わせると、問19は間違っていました。私は単純に4人増員すると考えてしまいましたが、引き継ぎ期間の元のメンバー4人分の遅れを取り戻すために増員が必要になるのは5人で、引き継ぎ期間の250万円と8月9月の100万円ずつで合計450万円というウが正解です。

25/30正解できたのでここは通過できました。

 

午前Ⅱ

見たことのある問題がけっこうありましたが、これは無理だという問題が3〜5問あり、厳しいなと感じました。

1周目で自信のある問題を埋め、2周目3周目と少しずつ埋めていきました。

ほぼすべて知識問題で、計算問題は問24だけですね。これは過去問にあったような気がしました。最初から織り込み済みの停止時間は分母にも分子にも含めないのがポイントです。あとは月の日数から時間数を算出し、割り算するだけです。計算を間違えるといけないので、停止時間を分子にした場合と提供時間を分子にした場合の両方を計算して、一致するのを確認しました。

21/25正解できたのでここも通過できました。

 

午後

全体

問題冊子全体にざっと目を通して、問1はWeb系だからおそらく選ぶ、問2は難しそう、問3はネットワーク系で問4がマネジメント寄りかなという印象を得ました。

令和7年度秋期情報処理安全確保支援士試験を受けますで書いた方針に基づき、すべての問について頭の中で答えを作っていきました。

問1はスクリプトも比較的単純で意図がわかりやすく、Excelファイルに偽装したファイルにスクリプトを仕込んだことも明白でしたから、大きなストーリーをつかめた感触があり、早めに解答用紙に書いていきました。

問2は設問2のサイドチャネル攻撃の一般的な定義は知っているとしてもこの場合の内容がわからず、その後の問題も難しそうに見えたので、飛ばす方向にしました。

問3は最初のDNS関係の知識問題は1〜2問どうにかできそうという今ひとつな滑り出しでしたが、あとは問題文をじっくり読めば何とかなりそうでした。問題文が長いのはそれだけヒントも多いだろうと好意的に捉えられました。

問4は「未知の」と「暗号化」かなと最初の空白は埋められそうで権限の設問も問題文をよく読めば答えられそうに思いましたが、主なストーリーである後半部分の手がかりを思いつくことができませんでした。

ということで問3を頭の中で解き進め、いけそうならこれを選び、ダメそうなら問4に挑戦するという戦略を立てました。

 

問1

設問1は、SAMEORIGINに着目してaはできない、Content-Security-Policyのselfに着目してbもできないにしました。

設問2の(1)は、元従業員のZが管理者権限を不当に取得するというストーリー(スクリプトの内容を参照)から、ロール管理としました。

(2)は、タスク名ですね。一瞬タスクの詳細説明かとも思いましたが、プロジェクト進捗管理で詳細説明は表示されずタスク名は表示されるのでこちらが正解でしょう。

(3)は個人タスク<script src=”/files/F1234567890.xlsx”></script>としました。図2の正常なタスク名と見比べて慎重に抜き出しました。

(4)はeが管理者、fが締切日を過ぎた、gが管理者ロールを設定するとしました。eは利用者かなと最初は思いましたが、表1をよく読んでこの処理は管理者しかできないと気づきました。

(5)は、CSPの設定で防御できていたという記述から(CSPが何かわからなかったのですが、Content-Security-Policyのことだろうと思い至りました)、工夫前は直接スクリプトの文字列を書いていたのだろうと想像し、スクリプトを仕込んだファイルをスレッドにアップロードし、そのファイルを参照すると書きました。「スクリプトを直接書くのではなく」といった内容も含めたかったのですが、解答欄が足りませんでした。他サイトではなく自サイトのスレッドにファイルをアップロードするのが一つのポイントですから、そこは外せないと思いました。

設問3の(1)は、テキストファイルとして開き、スクリプトが含まれていないことを確認するとしました。Pythonで言うならrbではなくrでファイルをオープンして、scriptのような文字列を検索するイメージです。

(2)はプロジェクト進捗管理としました。最初は入力時にエスケープ処理をすると考えてタスク管理と書きましたが、htmlへの出力時にエスケープ処理をするほうが自然かと思い直して書き直しました。

(3)はHTMLで特別な意味を持つ記号<と>をエスケープ処理すると書きました。設問で「具体的に」と指示されており、<と>を具体化しました。&lt;のような内容も書こうかと思いましたが、自信がなかったことと「エスケープ処理」という表現を入れたかったので、この記述に落ち着きました。本文中に「類似の問題がないかどうか」とあったので、<と>をエスケープすればいいだろうと考えました。

設問4は、SASTが何かわからず、頭をひねった挙句、専門家による手動での検査にしました。これなら文句はつけられないだろうという判断です。

アルファベットの頭文字の略称は覚えきれないのでやめてほしいです。

 

問3

設問1の(1)はDNSSEC、(2)のbはDoS、cはTLSと書きました。調べてみると、DoSではなくDoHが正解のようですが、仕方ないです。

設問2はイ、アとしました。eは通常なら表示されないポップアップ画面に入力されたものだからアなのは間違いないだろうと考え、dのほうにアを出すならあとでeを出す必要がないのでイだろうと考えました。

インターネットバンキングは大きなテーマの割にこれだけしか設問がないのかと拍子抜けしました。

設問3は、Kサービス設定サイトへのアクセスを許可する接続元IPアドレスとしてa1.b1.c1d1を設定するとしました。なるべく問題文中の表現を活用しました。解答用紙に「1」と書くときに私が普通に書くと「l」のように見えたので、不自然になるのを覚悟で縦棒の上と下に付け足しました。

設問4の(1)は、各取引先サービスで行っている接続元IPアドレス制限について、P社の契約者専用のKサービス用固定グローバルIPアドレスからの接続を許可してもらうと書きました。問題文中の表現を最大限活用するという姿勢は変わりません。「接続を許可してもらう」と「接続も許可してもらう」のどちらにしようかと数分悩んだ挙句、全体利用も想定しているので「を」のほうにしました。過去問で「も」が模範解答になっていた問題を思い出しました。

(2)は、ざっくりと基本サイトのことかと考えたあとで、それにしては解答欄が不自然に広く、基本サイトの周囲をよく読み、OSベンダーのOSアップデート配布サイト及びQ社のマルウェア定義ファイル配布サイトとしました。この2つはKサービスへの接続前に接続する必要があるのに対し、VサービスとP社専用WサービスはKサービスへの接続後に接続すると想像しました。問題文中の後二者はWebブラウザのブックマークに登録するという記載がヒントだと解釈しました。2つのサイトをつなぐ文言を「及び」にするか「と」にするか迷いましたが、A、B、C、D及びEという形になっている問題文を参考にして「及び」にしました。

設問5の(1)は、認証方式1でSMS通知を受ける1件の電話番号を利用者ごとにあらかじめ登録するにしました。ここでも問題文中の表現を最大限利用するという姿勢です。「利用者ごとにあらかじめ」とまで最初は書いていませんでしたが、時間があまって見直ししているときに消しゴムで消してそれも追加しました。

(2)は、Kサービス接続時に接続元PCのOSのバージョンをチェックし、移行前のバージョンであれば接続を拒否するようP社の管理者アカウントで設定するとともに、ログから接続を拒否されたPCを割り出してそのPCの利用者にOSの移行を促す声かけをするとしました。これで解答欄をちょうど使い切るくらいの分量です。システム的(技術的)な施策と運用的(人間的)な施策の両方を欲張って盛り込みました。ここでも問題文の表現を最大限活用しています。バージョンXとかバージョンYのように具体化しようか迷いましたが、下線③の直前にはそのような具体的な名前が書かれていなかったのでやめました。

 

全体

ベストは尽くせたという手応えです。

午後の問題選択には迷わず、問1と問3を選んだことに悔いはありません。

問1はLaravelやDjangoでWebアプリを作る仕事をしてきたのが生きました。

問3は国語力勝負ですね。

この試験を受けることをきっかけにして、セキュリティについて集中的に学べてよかったです。

 

 




top