オフライン自然観察ガイドを作る

LinuxBeginner
オンラインで実践に進む

はじめに

明日の地域の自然観察会には、配信元が使えなくなっても読めるガイドが必要です。5 ページ、3 点のイラスト、スタイルシート、印刷できる観察シートを別のディレクトリへ持ち出します。ホームページだけを保存しても、この読書経路は用意できません。

原本は Source Guide、ダウンロード操作は Workstation、自分のファイルの閲覧は Field Copy を使います。用意された配信元サービスだけを停止し、移動したコピーから未読のカードとシートを開きます。LabEx 接続は引き続き使えます。失うのはコンテンツの配信元であり、プラットフォーム全体の接続ではありません。

基本的なターミナル操作ができれば十分です。URL、取得オプション、相対リンクはここで説明します。文章とイラストは独自の架空教材であり、実際の生物の同定、採食、安全に関する助言ではありません。どの教材言語でも、サイトとコマンド出力は英語のままです。

1 ページを保存して限界を確かめる

このステップでは、実際の閲覧経路をたどり、比較用に HTML を 1 ページだけ保存します。最初の保存は意図的に不完全なものです。完成したガイドではありません。

原本の経路をたどる

Source Guide を開き、Woodland、Start the route の順に選びます。Silver leaf に進んで文章とイラストを見てから、Return to the route で戻ります。Open observation sheet を開いてください。これはスケッチと観察を書く欄がある実際の SVG 文書です。ブラウザーの戻るボタンで戻ります。Amber cap と Reed fan は後の配信元停止テストのため、まだ読まないでください。

ホーム、経路、3 枚のカードは、5 つの異なる HTML ファイルです。画像、CSS スタイル、SVG シートも別々のファイルです。Harbor event — online only, outside this guide は意図的に除外する隣の催しで、オフライン閲覧経路には含まれません。

URL を読み、ホームページを保存する

Workstation に切り替えます。pwd は現在のディレクトリを表示します。準備済みターミナルはプロジェクト作業領域から始まります。

pwd
/home/labex/project

必要なら cd でディレクトリを変更できます。

cd /home/labex/project

ターミナルから配信元に接続するアドレスは http://127.0.0.1:8081/woodland/index.html です。http:// は HTTP を選び、127.0.0.1 はこのラボの同じマシン、8081 は配信元のポート、/woodland/index.html は要求するファイルのパスを表します。Source Guide タブは同じサービスをプラットフォームのブラウザー用アドレスで公開します。ターミナル用のループバックアドレスを自分のパソコンのブラウザーに入力しないでください。

wget は URL を取得します。大文字 O の -O オプションは出力ファイル 1 つの名前を指定し、再実行時にはそのファイルを上書きします。次のコマンドはホームページの HTML だけを保存します。

wget -O first-save.html http://127.0.0.1:8081/woodland/index.html

200 OK と保存完了のメッセージを確認します。転送時間やバイト数は変わる場合があります。ls でファイルを一覧表示し、名前を確かめられます。

ls first-save.html

Field Copy を開いて First single-page save に進みます。見出しと文章はありますが、イラストとスタイルはありません。経路を取得していないため、Start the route はローカルの 404: File not found を返します。Return to local files で閲覧デスクに戻ります。これは想定どおりの制限で、原本の故障ではありません。404 はサーバーから返答はあったものの指定パスがないこと、接続失敗はサービス自体に到達できなかったことを意味します。

ローカル閲覧デスクはポート 8082 で /home/labex/project 内のファイルを配信します。足りないファイルを配信元から代理取得することはありません。

許可された範囲でガイドを集める

このステップでは、隣の催しを取得せずに、リンクされたページと必要な資産を集めます。まずガイドの URL パスと、マシン上の保存先ディレクトリを区別します。

適切な境界を決める

配信元の構成は次のとおりです。

/woodland/                 homepage, route, species cards
/shared/woodland/          CSS, three illustrations, observation sheet
/harbor/                   a different activity: exclude it

3 枚のカードは /woodland/species/ にあります。観察シートとスタイルは /woodland/ の外側にあり、明示的に許可された共有ディレクトリに入っています。開始ディレクトリの子孫だけに制限すると範囲が狭すぎます。ホスト全体を取得すると広すぎます。

Wget の --recursive はリンクをたどり、--level=inf は通常の 5 階層という深さ制限を取り除きます。このサイトは小さく管理されたものです。深さを無制限にしても許可パスで範囲を限定します。--page-requisites は画像やスタイルシートなど表示に必要な依存ファイルも取得します。再帰取得で見つかるのはリンクされたファイルであり、サーバー上のリンクされていない任意のファイルすべてではありません。

--include-directories=/woodland,/shared/woodland はこの 2 つのツリーを許可します。許可する URL 接頭辞はコンマでつなぎ、空白を入れません。これにより深い生物カードのパスも含め、/harbor/ を除外します。--no-parent は不要です。このオプションでは今回必要な隣の共有ディレクトリが妨げられます。

--no-host-directories は保存先にホスト名のディレクトリを作りません。--directory-prefix=raw-guide は元の URL 階層をローカルの raw-guide/ 以下に保存します。ディレクトリは自動作成されます。次は 1 つのコマンドです。ターミナルの表示上は折り返される場合があります。

wget --recursive --level=inf --page-requisites --no-host-directories --directory-prefix=raw-guide --include-directories=/woodland,/shared/woodland http://127.0.0.1:8081/woodland/index.html

Wget は今回の教材取得を許可している配信元の robots.txt も読み取り、保存します。これはクローラー用メタデータであり、追加のガイドページではありません。HTML 5 枚、共有資産 5 個、このメタデータの合計 11 ファイルになります。

find raw-guide -type f はディレクトリツリー全体の通常ファイルを一覧表示します。-type f はディレクトリではなくファイルを選びます。

find raw-guide -type f

指定した 2 つのツリーと robots.txt があり、harbor/ ディレクトリがないことを確かめます。表示順は問いません。

ファイルが揃ってもリンクの修正が必要な理由

Field Copy で Raw collected guide を開きます。HTML はまだ /shared/woodland/guide.css のようなパスを使っています。先頭のスラッシュは raw-guide/ ではなく閲覧サーバーのルートから始まることを意味します。実際のファイルは raw-guide/shared/woodland/ にあるため、未変換のパスは目的のファイルに届きません。

正しいファイルを集めることと、ナビゲーションをそのファイルへ向けることは別の作業です。ローカル閲覧デスクに戻ります。raw-guide/ は比較用に残し、次に新しく持ち運べるコピーを作ります。

Wget が接続失敗を報告したら、Workstation で source-control start を実行して再試行します。この準備済みコマンドは配信元だけを起動し、コピーの取得や変更はしません。空の保存先でやり直す場合、rm -r raw-guide は再作成できる比較用ディレクトリと中身だけを削除します。この任意の復旧コマンドを使う前に綴りを確認してください。

ナビゲーションをコピーと一緒に移動させる

このステップでは、持ち運べる field-guide/ ディレクトリを作り、実際のリンクを使います。Wget は取得完了後にダウンロード済みのリンクを書き換えられます。

--convert-links は取得済みファイルへのリンクを相対パスに変えます。例えばコピーしたホームページは ../shared/woodland/guide.css を使います。.. は親ディレクトリです。深い階層のカードでは、同じ共有資産に届くためにもう 1 つ .. を使います。このパスは閲覧サーバーのルートに依存せず、ディレクトリと一緒に移動します。

配信元はまだ起動しています。新しい保存先に、リンク変換を加えて範囲指定の取得を繰り返します。

wget --recursive --level=inf --page-requisites --convert-links --no-host-directories --directory-prefix=field-guide --include-directories=/woodland,/shared/woodland http://127.0.0.1:8081/woodland/index.html

最後の Converted links メッセージを待ちます。どのリンク先が保存されたかが確定してから変換するため、変換は取得の後に行われます。除外した Harbor の催しへのリンクはオンライン参照のままです。そのラベルは、この催しがオフラインガイドの対象外であることを明示しています。

grep は一致するテキスト行を表示します。スタイルシート名を検索し、実際の HTML 内の相対参照を見ます。

grep 'guide.css' field-guide/woodland/index.html

出力は長い HTML 1 行です。その中に ../shared/woodland/guide.css があることを確認します。HTML を理解したり編集したりする必要はありません。'guide.css' の引用符は検索パターンを 1 つの引数として渡します。

Field Copy で Downloaded guide を選びます。レイアウトと 3 点のイラストが現れるはずです。Start the route、Silver leaf、All field notes の順に開きます。ブラウザーのアドレスを見ると、リンクは Field Copy サービスの /field-guide/ 内に留まっています。他の 2 枚のカードは次のステップまで開かないでください。

404 が出た場合、要求されたアドレスと find field-guide -type f の結果を比べます。ファイル不足なら取得、ルートパスの誤りならリンク変換が必要です。最初から再試行する場合、任意の rm -r field-guide は生成した持ち運び用ディレクトリだけを削除します。その後、完全な取得コマンドを再実行します。既存の Wget 保存先をそのまま使うと番号付きの重複ファイルが作られることがあるため、保存された .1 ファイルを正しい結果とみなさないでください。

配信元を停止してガイドを移動する

このステップでは、このコピーを作る目的を検証します。配信元を停止し、取得ディレクトリを移動しても、別の読者が利用できることです。

配信元への依存を取り除く

Workstation で準備済みの停止コマンドを使います。対象はポート 8081 だけで、ターミナルと Field Copy は使い続けられます。

source-control stop
Source stopped; Field Copy is still running.

Source Guide を再読み込みします。配信元プロセスを停止したため、接続またはプラットフォームのゲートウェイエラーは想定どおりです。キャッシュされた原本ページが見えても、配信元が稼働中である証拠にはなりません。Workstation では curl がアドレスに要求を送り、--max-time 3 が待ち時間を 3 秒に制限します。末尾の || true によって、この意図的に失敗する要求の後もシェルが続行します。

curl --max-time 3 http://127.0.0.1:8081/woodland/index.html || true

ガイドの HTML ではなく接続失敗が表示されるはずです。これでラボ内からも配信元が使えないと分かります。次に Field Copy から Downloaded guide、Start the route、未読の Amber cap を開きます。実際の文章と画像が読み込まれる必要があります。そこで Observation sheet を開き、実際の印刷可能な SVG が表示されることを確かめます。これらは元の配信元 URL とは異なるローカルアドレスです。

実際のイラストを含む完全なローカルカード

移動できるディレクトリを引き渡す

空の handover/ ディレクトリは準備済みです。mv は子要素を含むディレクトリ全体を移動します。handover/ の末尾のスラッシュで、移動先がディレクトリであることを明示します。

mv field-guide handover/

元のダウンロード場所はなくなりました。移動先の内容を一覧表示します。

ls handover/field-guide
robots.txt  shared  woodland

新しいプライベートウィンドウで Field Copy を開くか、新しいタブを使って閲覧デスクから Moved handover guide へ進みます。プライベートウィンドウでは通常のプラットフォームログインが必要な場合があります。学習操作には新しい Field Copy タブで十分です。移動後の URL は /handover/field-guide/woodland/index.html で、ローカル閲覧サービスから配信されます。古いブックマークで元の場所に戻らないでください。

Start the route から未読の Reed fan を開き、All field notes で戻り、Observation sheet を開きます。シートはブラウザーのメニューから保存・印刷できます。これは成功アニメーションではなく、実際のファイルを使う操作です。Harbor event リンクはオフライン範囲外なので、配信元停止後の動作は求めません。

必要なページがここで開けなければ、source-control start で配信元を復旧し、前のステップの方法で新しい取得を修復します。パスを確認してから不完全な引き渡しディレクトリを置き換えてください。その後、配信元を停止して移動先の閲覧経路を繰り返します。ラボ全体をリセットする必要はありません。完成した引き渡し用コピーを最終結果として残します。

最終成果物は、内容と共有資産を含む handover/field-guide/ です。このラボでは普通の静的ファイルサーバーを通じたブラウザー閲覧を検証します。すべてのブラウザーで同じ file:// 動作になることや、プラットフォームから自分のパソコンへディレクトリをワンクリックで取得できることは約束しません。

まとめ

保存した HTML 1 ページと、範囲を限定した再帰取得を比較し、共有依存ファイルを含め、リンクを相対パスに変換しました。その後、自分で配信元を停止し、独立したローカルコピーの未読内容を利用して、ディレクトリ全体を引き渡し先に移動しました。

役に立つ結果はガイドそのものです。読める 5 ページ、3 点のイラスト、スタイルシート、実際の観察シートに、クローラーのメタデータが加わります。配信元が使えること、取得範囲が正しいこと、ローカルナビゲーションが機能することは別々の性質です。それぞれを検証しました。