IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

スーパーエンジニアの独り言

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第95回 白いレガッタ (藤江一博) 2020年2月

気が付いたら、ひとりぼっち。
見捨てられて、ひとりぼっち。
取り残されて、ひとりぼっち。
迷子になって、ひとりぼっち。
災難に遭って、ひとりぼっち。
大海の孤島で、ひとりぼっち。

来る日も、誰も来ない。
来る日も、誰も来ない。
ここには、誰もいない。
ここには、誰もいない。

ここには、何もない。
ここに留まる、理由がない。
ここに居て、誰にも必要とされない。
こんな孤独に耐えられる奴なんていない。

誰か助けてくれ。

孤独に打ちひしがれて、絶望の淵に沈んでしまう。
その前に、助けてくれ。

 
 
 

「ソー・ロンリー」:

ロックに目覚めた高校生の頃、同級生で「ナック」"The Knack" が大好きな平田君から借りた LP レコードが「白いレガッタ」"Reggatta de Blanc" でした。
借りたLPレコードをカセットテープに録音して愛聴していました。
情報源が雑誌くらいしか無くて情報量が少ない時代(一九八〇年頃)ですので雑誌記事などの文字情報は勿論の事、「レコードジャケット」はとても大事でした。
その頃は、サンプル音源を聴くこともなくレコード屋さんでジャケットだけを見て購入するという「ジャケ買い」していたのですから。
「ジャケ買い」でお分かりの様にイメージを増殖させる「グラフィック」を担当するレコードジャケットは大事です。
平田君家にあった当時珍しいコピー機(お父さんのお仕事がたぶん印刷関係)で、レコードジャケットやインナースリーブをカラーコピーして貰った「紙」は、今でも大事にスクラップブックに持っています。

その頃から、
「何の音楽が好きなの?」
と聞かれたら、
「ポリスです。」
と答えるようになりました。

ロックバンドの「ポリス」"The Police" は、「スティング」"Sting"、「スチュワート・コープランド」"Stewart Copeland"、「アンディ・サマーズ」"Andy Summers" のスリーピース(三人組)です。

「ポリス」"The Police" は、全部で五枚のスタジオアルバムをリリースしています。

一九七八年にリリースのファースト・アルバム「アウトランドス・ダムール」"Outlandos d'Amour" からシングルカットされたセカンド・シングル「ロクサーヌ」"Roxanne" は、初回リリース時点(一九七八年)では聴衆の反応が良くなかったみたいですが、翌年(一九七九年)リイシュー(再発売)された時にはスマッシュヒットになり彼らが世界へと飛び立つ足掛かりになります。

三枚目のシングル「キャント・スタンド・ルージング・ユー」"Can't Stand Losing You" も良かったのですが、実は「ロクサーヌ」"Roxanne" と同様に「英国放送協会」"BBC; British Broadcasting Corporation" から放送禁止の憂き目に遭いまして、どうやら世間に認知されることを妨害されたらしいです。シングル盤のジャケットの画がまずかったみたいです。

ですが良いものは良いということで、「ロクサーヌ」"Roxanne" 同様に「キャント・スタンド・ルージング・ユー」"Can't Stand Losing You" もリイシュー(再発売)されてヒットを記録します。

同じくファースト・アルバムからのシングルカットで「ソー・ロンリー」" So Lonely" という楽曲がありますが、このプロモーションビデオは、香港の市街と東京の地下鉄で撮影がされています。

東京での撮影は「都営地下鉄浅草線」らしいですが、三人が絶頂期へと階段を上る真っただ中という神々しい眩しさで人を寄せ付けず闊歩するかの如く練り歩きながらトランシーバーで誰かを求めて「交信」しつつ東京や香港の街を「行進」していくというビデオです。

寂しさは全く感じないビデオですが、「ソー・ロンリー」" So Lonely" というタイトルです。

「ソー・ロンリー」" So Lonely" は「スティング」"Sting" の手に由る楽曲ですが、元ネタは「ボブ・マーリー」 "Bob Marley" の「ノー・ウーマン、ノー・クライ」"No Woman, No Cry" という超有名曲です。これは「スティング」"Sting" 自身が認めているそうです。創作は音楽でもプログラミングでも模倣から始まるのです(過去コラム『第44回 シップビルディング』もご参照くださいませ)。

「アウトランドス・ダムール」"Outlandos d'Amour" に続く、一九七九年リリースの「白いレガッタ」"Reggatta de Blanc" が、彼らのセカンド・アルバムになります。このアルバムに収録されている「孤独のメッセージ」"Message in a Bottle" がシングルカットされて世界制覇を果たします。

「ポリス」"The Police" の代表曲であり、大好きな曲です。

 
 
 

「ネクスト・トゥ・ユー」:

筆者は、学生時代に吉祥寺にあった飲食店(パブレストラン)でバイトしていました(過去コラム『第45回 ストリート・オブ・ファイヤー』と『第78回 歪んだ身体 歪んだ言葉』を併せてご参照くださいませ)。

当時、店長だった杉浦さんが亡くなったと「風の噂」で聴いていました。
まだ若い筈なのに、どうやら病気を患っていたそうです。
しかも、亡くなったのが大分以前の事だったらしいのですが、人伝でも聴いておりませんでしたので、その事を露程も存じ上げませんでした。

店長の杉浦正廣さんは初代店長から数えて三人目の店長だったのですが、とてもお世話になりました。
年に一回程度でバイト仲間と交流するのですが、昨年末に集まった際の帰り際に杉浦さんの話が出てきました。
芳賀ちゃんがこの前、奥多摩にお墓があるらしいことを聴きだしたので、後輩の玲ちゃん(水沢玲)が車出しますから墓参りにいきましょうと発案してくれました。
そうして芳賀ちゃんと玲ちゃん、拓哉と俺の四人で週末に奥多摩へ出掛けたのは今月に入ってからの事です。

墓参に奥多摩へ向かったその日は、「青梅マラソン」が開催されていました。
交通規制で通行止めされた箇所に何度も出くわしてその度に迂回しながら、奥多摩霊園へと向かいました。
やっとの事で奥多摩霊園に到着したものの、今度はお墓が見つかりません。
管理事務所に聴けばすぐ分かるといっていたのですが、「見つからない」らしいです。
お墓の所有者が分からないと見つからないらしくて、そのお墓に誰が埋葬されているのかまでは分からないというのです。
そもそも名簿がB4ほどの「大きな厚紙」に書いてありましたが、数千枚あると思われる「紙」で探すのに無理があります。
「紙の記録」を探す事自体に無理がありますが、勝手に置き場所が変えられてしまうCDショップさながらにちゃんと「整理」されていなければ尚の事です。

もしも、ちゃんと整理されていたとしても対象の母数が膨大になれば視認する物理的行為での「検索」"search" が限定された時間内では事実上不可能です。
起きたこと、話したこと、書いたこと、どのような「情報」"information" でも「記録」として、すべて保存すべきです。
可能であるならば、「森羅万象」"every thing" を「記録」"record" すべきです。あることが起きて、そこに何かが生きていた証でもあるからです。
「過去」"past" を知ることでしか、「未来」"future" を予想できません。
「記録」は言わずもがな重要ですが、その運用を考えると「記録媒体」や「記録方式」も大事だと気づきます。「検索」できなければ、意味を「喪失」してしまいます。

管理事務所の方も困っていましたが、「紙」で管理しているのですから到底探し出すことができません。市役所や病院やCDショップも必要ですが、霊園にも「電子化(デジタル化)」が必要なのだろうと思い馳せました。

そんな夢想をしている間にも、芳賀ちゃんが何度も情報源である杉浦さんの元奥さんや奥さんのお兄さんに電話してお墓の所在情報を聴き出そうとしてくれましたが、それでもお墓が見つかりません。半ばあきらめてどこでも良いからお参りしようと嘆いていました。

本当に諦めかけて昼飯でも食べて出直そうと車に乗り込んだその時、「電話」が鳴り出しました。掛かってきた電話、その通話で決定的な情報を入手しました。
どうやら、別れた奥さんのお家のお墓、その四つ隣に「杉浦家」のお墓を建てたそうです。
寂しがり屋さんの杉浦さんらしいです。
やっとの事で店長の杉浦正廣さんのお墓が見つかりました。

見つけた墓石で名前を確認したものの歓喜の渦とはなりません。
皆でそそくさと掃除を始めました。
たわしでゴシゴシ泥を落として墓石を綺麗にしていきます。
人気のない墓地に小雨が降ります。
高台で冷え込んだ外気に澄んだお水でお墓を綺麗にしてお花と線香をご用意しました。
墓石の裏には埋葬されている方のお名前が刻まれていました。

「平成二十一年三月十一日没、五十七才」

もう亡くなってから十年以上も経っていました。
杉浦さんは、とても寂しかったんじゃないのかなと思いました。
杉浦さんは、皆に囲まれてワイワイしているのが好きだったから。

ちょっと遅れましたけど、
あなたのそばにきましたよ。

 
 
 

「ゴースト・イン・ザ・マシーン」:

愚図つく墓参りには格好のお天気の中、奥多摩への墓参を終えました。
往復六時間強、全行程、八時間越え。
ドライバーの玲ちゃんは朝九時出発、朝十時丁度にお迎えして頂き、吉祥寺到着が五時半過ぎ。
墓参の帰り、これまた通行止めに遭遇したために「澤乃井園」に由ってくる計画も駄目になりました。
空腹のまま、長い帰路につくことにしました。

吉祥寺に到着すると妙な達成感が漂いました。
玲ちゃんは車を置きにいっている間にイタリア飯屋を探しておきました。
昼飯すらまともに食っていなかったので、皆でピザや肉をガツガツと飲み食いしました。
そうしてお腹が膨れてから、手土産にお洒落なパイを購入して墓参の報告へと赴きました。
情報源であり今回も散々ご迷惑をおかけした(元奥さんの)お兄さんのお店に行きました。
今日の出来事をお兄さんにご報告しまして、歓談タイムに突入。
不思議とあまり杉浦の思い出話をする訳でもなく、映画や音楽の話です。

長い一日となりました。
ほぼ日帰り旅行です。
歓談も早めに切り上げることにしました。
皆、疲労を隠せず明日も仕事。
日曜日の夜、ぐったりして家路につきました。
また逢おうね。

 
 
 

「ドゥドゥドゥ・デ・ダダダ」:

講習での課題として "Apache HTTP Server" のアクセスログを解析するというのを考えました。
課題での妥当なシナリオを考えるのがいつも大変です。今回は、Python スクリプトで「ウェブサーバーのログ解析をしましょう」という課題です。
その課題を実行するために、「ダミーログ」"dummy log" が必要になりました。

以前、直人が用意してくれた短いダミーログはありますが、今度は一か月分くらいの大量のログを用意して取り組んで貰おうかなと思いつきました。
そこで新たに「ダミーログ」を用意しようと思ったのですが、何のツールを使ってダミーログ生成しようかなと迷いました。

ツールの選定に迷ったのは、話し相手がいないからです。
直人は旅立ってしまい、もうここには居ないのです。
直人に聴けないからです(過去コラム『第92回 ナンバーガール』をご参照くださいませ)。
直人が居たとしても、覚えていないでしょう(直人にSlackメッセージ送りまして、この事を訪ねてみたら「覚えていません。」との事、やっぱりです)。

どちらにしても、自分で何か都合の良い「生成器」を探す必要があります。

そこで早速、ウェブで「検索」してみました。
検索ワードは、「apache ダミーログ」です。
検索上位に引っかかるのが、良く使われているツールの筈であるという方向性で調べると、"apache-loggen" というツールが見つかりました。

"apache-loggen" は、「ギットハブ」"GitHub" に公開されているツールです。
作者は、"tamtam180" さんという方らしいです。
「TreasureDataのスクリプトをパクりました。」とトップページの「謝辞」に記載がありました。
元ネタも良さそうなので、試してみることにしました(ご提供された 「tamtam180」さんに感謝して使わせて貰います)。

"apache-loggen" は、"Ruby" (Ruby programming language) で実装されています。
Windows でも問題なく動きそうです。
「インストール」も簡単そうでしたので、早速インストールします。

gem install apache-loggen

さくっとインストール完了です。
使い方も掲載してくれています。
幾つかオプションも用意されており、ファイル名を指定して実行するだけです。

apache_log_gen abc.log

「おぉ、コレいいじゃない。」と、思ったのはつかの間の事。
一か月分のログを吐くには、どうすればと困惑しました。
オプションコーナーを見る限り"apache-loggen" にはそれらしい機能は無さそうです。
それならばと、バッチのスクリプトを「自作」して複数ログファイルを生成すれば良いかも、と思いつきました(実はコレも直人に相談しました)。自作スクリプトでは、日ごとに「ログローテーション」 "logrotate" しているという風味を醸し出そうと思いました。

スクリプト作成に取り掛かろうと思って Python を使おうかなとも考えたのですが、"apache-loggen" が Ruby で実装されているので親和性を考えて、Ruby スクリプトにしました。後で色々問題出てきたらと考えて、それが妥当かなと思ったのです。

短いスクリプトですし Ruby で書くことに大きな問題なかったので、すぐに一か月分のログファイルを生成できるようになりました。ですが、生成されたログファイルは全部、同じ日付になっています(ダミーすぎる)。

そこで、"touch" コマンドでタイムスタンプを変えれば良いかと試してみると、"touch" コマンドがありません。使用している PC が "Windows 10" だったのを忘れていました。Windows OS には、"touch" コマンドありません。

代替案を探さなければいけないので更に「検索」すると、"Windows 10" なら "WSL"(Windows Subsystem for Linux) が使えそうですが、早速これを試してみるとちょっと制限が多くて思い通り使えません。少し使ってすぐに諦めました。

他に方法無いかなと再度「検索」すると "PowerShell" が使えそうです。 "PowerShell" は別件ですが、つい先日に見様見真似で一個スクリプトを書いたばかりですので抵抗ないです。 簡潔に書けて便利です。 "PowerShell cmdlet" (コマンドレット)には "Set-ItemProperty" があって、ファイルの「最終変更時刻」を変更できそうです。これをスクリプトに採用しました。

ログファイル名に日付を加えて毎日ログとっている運用の雰囲気が出ました。
ファイルのタイムスタンプも更新されてダミーですけど、本物らしく装うことが出来ました。
これで上手く出来たなと、満足げに眺めてみると何かおかしいです。
急き勝ち(せっかち、いらち)で、早とちりの自分をいつも疑いますが、何か忘れています。

ログファイルの中身を見ると、「リクエストした日付」が全部同じ日付です。
ダミーで生成するアクセスログの情報が固定で「今日の日付」になっている事がわかりました。
ちゃんと "README" 読んでない所為なのですが、これでは駄目です。雰囲気出ません。

そこで覚悟を決めて、ソースコードに手を入れることにしました。

まずは、ソースコードの全体を眺めて、どこが「コア(核)」なのかを辿る作業です。
久々に他人のソースコードを眺めるのは、辛いです。
しかも最近ご無沙汰の Ruby ですので難易度は高めです。
読むのも辛いですが、最小の変更で意図通りに動かせるように考えなければなりません。
自作コードではないので、相手(ソースコード)の出方次第となり受け身となります。

幸い "apache-loggen" コードはコンパクトなコードでファイル数が少なくて助かりました。
"apache-loggen" の本体は、"base.rb" だと判明しましたので、ここを集中的に攻めていきます。
何とか核心に近づいてきたと思ったら、色々手を入れて動作で確認しながら修正を施して行きます。

コマンドライン引数の取得には、"OptionParser" を使っていたので、対策の方向性を決めました。
コマンドラインオプションを増やして、指定の日付でアクセスログを生成できるようにしようと思ったのです。

--date オプションで指定の日付を取得するコード部分(断片)が下記です。

  def parse_config()
    config = {}
    op = OptionParser.new
    op.on('--date=DATE', 'リクエストした日付'){|v| config[:date] = v}  # you can specify access date, adding option --date
    op.on('--limit=COUNT', '最大何件出力するか。デフォルトは0で無制限。'){|v| config[:limit] = v.to_i }
    op.on('--rate=RATE', '毎秒何レコード生成するか。デフォルトは0で流量制限無し。'){|v| config[:rate] = v.to_i }
    :
    :

実際にアクセスログのレコードを生成するメソッドが generate() メソッドだと判明しました。
その generate() メソッド内の実装では、文字列整形のための format() メソッドを呼び出して「HTTPリクエストを受信した時刻」を文字列として設定しています。
核心の format() メソッドでは、「HTTPリクエストを受信した時刻」の情報が「現在時刻」で固定されていました。

下記コードが該当の部分です。

 [#{Time.now.strftime('%d/%b/%Y:%H:%M:%S %z')}]

ここをコマンドラインから取得した日付にしてやれば、良さそうです。

下記が format() メソッドの修正部分(断片)です。

    def format(record, config)
      #
      # cosutomized by detective
      #     @author  kazuhiro.fujie@ctc-g.co.jp
      #     @date Feb 20, 2020
      # specified "access date" from option parameter "--date"
      r = Random.new  # time is random
      if config[:date]
        date = config[:date]
        record['time'] = Time.strptime(date, '%Y/%m/%d') + r.rand(24*60*60)
      else
        record['time'] = Time.now + r.rand(24*60*60) 
      end
      if config[:json] then
        return record.to_json + "\n"
      else
        return %[#{record['host']} - #{record['user']} [#{record['time'].strftime('%d/%b/%Y:%H:%M:%S %z')}] "#{record['method']} #{record['path']} HTTP/1.1" #{record['pre']} #{record['size']} "#{record['referer']}" "#{record['agent']}"\n] 
      end
    end
    :
    :

書き直してから気が付いたのですが、修正箇所を format() メソッドではなくて generate() メソッド側で修正した方が、スッキリしそうです。ですが、先ずはこのまま行きます。

この改修で、コマンドラインオプションで「apache-loggen --date 日付」で指定すれば任意の日付でアクセスログの内容も変更される筈です。

ソースコード修正に対応するためにバッチ用スクリプトも修正しました。

Rubyスクリプトに PowerShell を投入した修正済みバッチ用スクリプトが下記になります。

# generate daily dummy-log for one month  
#   powered by Ruby and PowerShell
# 
# @author:  kazuhiro.fujie
# @contributor: naoto.hori
# @date:    2020-02-26
require 'date'
dt = DateTime.now
system("powershell Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser") 
log_prefix = "./dummy/dummy_access.log"
for i in 0...31
    dts = dt.strftime("%Y/%m/%d %H:%M:%S") # timestamp
    dtd = dt.strftime("%Y/%m/%d") # specified the date for "--date" option of appache-loggen
    d = dt.to_date
    puts "\n\t #{d}"  # specified the date for log filename
    # generate a daily log
    system("apache-loggen --date #{dtd} --rotate=100 --limit=10000 --progress #{log_prefix}.#{d}")
    # timestamp
    system("powershell Set-ItemProperty #{log_prefix}.#{d} -Name LastWriteTime -Value '#{dts}'") 
    dt += 1  # next day
end

バッチ用スクリプトから回収した apache-loggen を使ってダミーログを生成します。
ここでは、生成されたダミーログファイルは「31日」分、つまりファイルが「31個」出来ます。

dummy_access.log.2020-02-26
dummy_access.log.2020-02-27
dummy_access.log.2020-02-28
dummy_access.log.2020-02-29
dummy_access.log.2020-03-01
    :
    :

生成されたダミーログの内容の一つは、こんな感じです。

120.78.40.58 - - [28/Mar/2020:00:59:01 +0900] "GET /item/software/4549 HTTP/1.1" 200 129 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; YTB730; GTB7.2; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Media Center PC 6.0)"
208.84.127.158 - - [28/Mar/2020:02:52:32 +0900] "GET /item/cameras/4237 HTTP/1.1" 200 42 "/category/electronics" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
36.174.84.206 - - [28/Mar/2020:21:56:55 +0900] "POST /search/?c=Electronics+Office HTTP/1.1" 200 76 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3"
    :
    :

指定された日付で「HTTPリクエストを受信した時刻」がランダムに刻まれています。

これで当初の目的は達成できました。ですが、ソースコードの修正に半日も費やしてしまいました。それに調査(検索して評価)している時間は、考えを纏めるのに少し寝かせたので約一日かかりました。合計で約一日半も時間を掛けてしまいました。

ですが、気になることがクリア出来たら「おしまい」はいつもの事です。

本当にこれで本物らしい雰囲気を醸し出したダミーのアクセスログになったかも検証していません。それに本来の目的である本当にこのダミーログを使った課題を創るのか自体が未定です。

思い付きで創ったのではありますが、折角ですのでここに晒しておきます。
もし何某かのご参考になるのでしたら本懐です。
最後に「記録」は大事です。

 
 
 

「孤独のメッセージ」:

来る日も来る日も、誰も来ない。

僕はSOSを世界に流そう。
僕はSOSを世界に流そう。
誰か拾ってくれないか。
誰か拾ってくれないか。
誰か拾ってくれないか。
一本の瓶に入ったメッセージを。

ある朝、海辺を散歩したら信じられない光景を目にした。
千億の瓶が岸に打ち上げられていたんだ。
望郷の念に駆られているのは、自分だけではないんだ。
同じように孤独を抱えている人が、いっぱいいるんだ。

 
 
 

次回をお楽しみに。

 
 
 

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes