先週の帰省にともなう鉄ネタ

先週帰省してきたのですが、北海道新幹線が開業してから始めての盛岡以北ということでちょっと楽しみ

f:id:lmtak:20160910204151j:plain
大宮の次は「新潟まで止まりません」という潔さな。高崎や長岡すら通過するという剛胆さもな。
f:id:lmtak:20160910204152j:plain
新青森止まりの「はやぶさ」は濃いめの緑、新函館北斗まで向かう「はやぶさ」は薄めの緑。地味に違うというのは話に聞いていたけど、見てみたら確かに感はある。
よく考えたら東京でも見られるのではないか。わざわざ盛岡で見て感動していたという間抜けな話である。
f:id:lmtak:20160910204153j:plain
「快速リアス」が上米内駅止まりなのは、2015年12月11日に発生した土砂崩れ(発生区間は松草~平津戸)であり、上米内駅の次の停車駅が陸中川井駅であるために、区間運休という形で上米内駅止まりにしているのだろう。盛岡~上米内は各駅に止まっているため、快速とは名ばかりなのだが、区間運休なら仕方がない。この時点では、岩手県北バスの106急行も運休になっていたから、振替輸送も行われなかったという。
ところで「リアス」(rias)って「リア」(ria)の複数形だから、「Rapid RIASU」ってのはちょっと気になる表記だよね。
rias - Wiktionary

f:id:lmtak:20160910204154j:plain
東北新幹線のホームにある「LED式乗車口案内表示板」。新函館北斗がローマ字表記だと3行になってて苦心の跡を感じる。漢字だと2行になってた。

f:id:lmtak:20160910204155j:plain
新青森駅の在来線乗り換え改札口。「弘前・青森・■■方面」と一部隠されてるのは、おそらく(スーパー)白鳥号が運行されていた頃の名残で「函館」方面とでも書かれていたのだろう。
おそらく2016年3月のダイヤ改正で登場した青森~津軽新城奥羽本線区間運転に対応するために、用意されたゴシックのフォントがなくて明朝体風になってる「津軽新城」を見ると切ない。

f:id:lmtak:20160910204159j:plain
新青森駅の新幹線ホームにある車両位置案内ステッカー。新幹線新青森駅開業時はまだ東北新幹線系統にMax(E4系)が運行されていた名残だけど、上越新幹線系統に移ってからはもう来ないのだろうなあと思われて切ない。

f:id:lmtak:20160910204200j:plain
出発反応標識が「札幌」と書かれているのがステキ。車基は「新幹線車両基地『盛岡新幹線車両センター青森派出』」のことだろう。

f:id:lmtak:20160910204158j:plainf:id:lmtak:20160910204157j:plainf:id:lmtak:20160910204156j:plain
青森駅跨線橋に掲げられていたパネル。ロール式の案内板や、L特急はつかりの表記など、興味深い。

高山稲荷神社(青森県つがる市)

先週帰省してきました。
行きたいところがあったので、車を借りてドライブ。

JR青森駅から浪館通り、県総合運動公園を過ぎて国道7号バイパスから東北自動車道で青森IC~浪岡IC。そこから津軽自動車道(無料供用・自動車専用道路)に乗り換えて、五所川原北ICで国道339号線五所川原バイパス)に乗り、その後は中里広域農道(こめ米ロード)をひたすらまっすぐ進み、途中くねくね行ったら到着。

高山稲荷神社

高山稲荷神社|青森県観光情報サイト アプティネット

高山稲荷神社は、五穀豊穣、海上安全、商売繁盛の神様として青森県第一の霊験あらたかな神社です。ここの信仰には農業・商業・工業・漁業・家内安全・病気平癒・道中守護・憑物落とし等多様多彩のものがあり、地元を始め遠方の人々の力もあって神社は支えられてきました。またここでしか見ることのできない千本鳥居はとてもインパクトがあり、一見の価値があります。

f:id:lmtak:20160910223322j:plain
千本鳥居といえば、京都の伏見稲荷神社が筆頭ですが、津軽の千本鳥居はどんなもんだと来てみたわけですよ。
f:id:lmtak:20160910223324j:plain
f:id:lmtak:20160910223329j:plain
奥まで進むと、たくさんの「おきつねさま」がおわします。
f:id:lmtak:20160910223325j:plain
f:id:lmtak:20160910223326j:plain
f:id:lmtak:20160910223327j:plain
f:id:lmtak:20160910223328j:plain
あらステキ。
気温が30℃になりそうな残暑が同行者の体調を悪くしそうだったので、後ろ髪引かれつつも撤収と相成りました。

夏休みの自由研究 - uniana_comparator

KONAMI社のBEMANIシリーズを韓国で稼働させるための提携先にUNIANA社があり、それは下記サイトに詳しい。
韓国の音ゲー事情
そして、ローカライズや運営しているサイトのなかに稼働店舗一覧のページがあるようで、


というツイートを見かけた。
そもそもハングル文字読めないので、どこから稼働店舗一覧のページに遷移できるかを探すのに苦労した。マウスを動かしてリンクを表示させて、というのをひたすらやるしかない。
http://beat.uniana.com/store/store_list.php
ようやく見つけたので、しばらく動かしてみて、HTMLソースも眺めてみたりして、

<tr>
	<td>21세기 게임랜드</td>
	<td><span>서울시 관악구 신림9동 1538-1&nbsp;</span><a href="http://map.naver.com/?level=2&lat=37.4810215&lng=126.9516009&query=7ISc7Jq47Yq567OE7IucIOq0gOyVheq1rCDsi6Drprw564%2BZIDE1MzgtMQ%3D%3D&menu=location&stab=ADDRESS%3B1&queryRank=1&mapMode=0&enc=b64" target="_blank"><img src="http://webimage.uniana.com/beatmania2015/common/btn_store.jpg" alt="위치보기" /></a></td>	
</tr>
<tr class="detail_view" style="text-align:center;">
	<td colspan="2"><img src="http://webimage.uniana.com/uniana/store/jubeat/seoul06.png" alt="게임장 사진" /></td>
</tr>
<tr>
	<td>건대 해피 게임천국</td>
	<td><span>서울시 광진구 화양동 9-43&nbsp;</span><a href="http://map.naver.com/?dlevel=11&lat=37.5420939&lng=127.0687863&searchCoord=127.069268%3B37.5404038&query=7ISc7Jq47IucIOq0keynhOq1rCDtmZTslpHrj5kgOS00Mw%3D%3D&menu=location&tab=1&mapMode=0&enc=b64" target="_blank"><img src="http://webimage.uniana.com/beatmania2015/common/btn_store.jpg" alt="위치보기" /></a></td>	
</tr>
<tr class="detail_view" style="text-align:center;">
	<td colspan="2"><img src="http://webimage.uniana.com/uniana/store/beat/seoul/seoul_6.png" alt="게임장 사진" /></td>
</tr>

この時点で25時だし夜も遅いし明日も仕事だし、


とヒントだけ書いておいた。

数日経って時間に余裕も出来たので、ちょっと試しにつくって見ます。

0. 結論

以下のURLで試験運用中。いまのところ差分ないけど。
uniana.com shop comer/gone detector

1. クロール

先ほどのサイトでは、Flashで地域を選ぶとその地域内の店舗をページング表示する作りになっており、以下のようなURL構成になっている。

http://beat.uniana.com/store/store_list.php?p=1&area=1

パラメータ「p」はページで、1-originで指定できる。パラメータ「area」は地域を表し、1~16まで指定できる。
店舗が無かったり、ページ指定が誤り(全2ページなのに3ページ目を指定するなど)だったりすると、

<tr><td colspan='2'>매장이 없습니다.</td></tr>

のようになるので、これを検知すればいいかな。

10wget.sh

指定のゲームに対して、全ページを取得する。
引数に、ゲームの種別、今日の年月日を(yyyyMMdd)書式で指定する。

#!/bin/sh
GAME=$1
TODAY=$2

# 地域は1~16まで
for (( area=1; area<=16; area++ ))
do
  # ページ番号は1から
  page=1
  continueflag=1
  while [ ${continueflag} -gt 0 ]
  do
    url="http://${GAME}.uniana.com/store/store_list.php?p=${page}&area=${area}"
    zpage=`echo 000${page} | sed -e 's/.*\(..\)$/\1/'`
    zarea=`echo 000${area} | sed -e 's/.*\(..\)$/\1/'`
    # 保存するファイルは、beat/20160827a01p01.html のように保存。(地域=01、ページ=01)
    wgetfile=${GAME}/${TODAY}a${zarea}p${page}.html

    # HTMLを取得する処理は別ファイルに記述
    ./11wget.sh "${url}" "${wgetfile}"
    # 処理結果を取得。0なら成功(次ページを取得)、それ以外なら次の地域へ
    result=$?
    if [ ${result} -ne 0 ] ; then
      continueflag=0
    fi
    # 無限ループにならないよう、3ページ取得したら次の地域へ
    if [ ${page} -ge 3 ] ; then
      continueflag=0
    fi

    # ページ番号をインクリメント
    page=$(($page + 1))
  done
done
11wget.sh

実際にwgetでHTML文書を取得する。
引数には、アクセスするURLと、保存するファイル名を指定。
戻り値が0だと成功。それ以外だと何らかの失敗。そのエリアではこれ以上HTML取得しない、と判断する。

#!/bin/sh
WGETURL=$1
OUTFILE=$2
TMPFILE=${OUTFILE}.tmp
# パラメータチェック
if [ "${WGETURL}" = "" ] ; then
  exit 11
fi
if [ "${OUTFILE}" = "" ] ; then
  exit 12
fi

# ユーザーエージェント偽装
useragent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36"
# wgetコマンドでHTML取得
wget -v --append-output=wget.log \
--output-document="${TMPFILE}" \
--user-agent="${useragent}" ${WGETURL}
# 文字コードをShift_JISからUTF-8に置換
nkf -w "${TMPFILE}" > "${OUTFILE}"
rm -rf "${TMPFILE}"
# 店舗情報がこれ以上ないかどうか、<td colspan='2'> の有無で検知
COUNT=`grep "<td colspan='2'>" ${OUTFILE} | wc -l`
if [ ${COUNT} -ge 1 ] ; then
  # 店舗情報がない場合は、いま取得したファイルは削除
  rm ${OUTFILE}
fi

exit ${COUNT}

2. 店舗名と住所の抽出

10wget.shで保存したHTMLファイルから、店舗名を取得して1ファイルにまとめて保存。同様に、住所を取得する。
引数に、ゲームの種別、今日の年月日を(yyyyMMdd)書式で指定する。

30sed.sh
#!/bin/sh
GAME=$1
TODAY=$2

NAMEFILE=${GAME}/m_name${TODAY}.txt # 1行1店舗名
ADDRFILE=${GAME}/m_addr${TODAY}.txt # 1行1店舗住所
MERGFILE=${GAME}/m_list${TODAY}.txt # 1行に店舗名称と店舗住所をまとめる

rm -f ${NAMEFILE}
rm -f ${ADDRFILE}

# 保存したHTMLファイルのうち今日の年月日を含むファイルについて順次実施
for TARGET in `ls -1 ${GAME}/${TODAY}*`
do
# 店舗名をgrepで抽出し、sedで整形して保存
  cat ${TARGET} \
  | grep -e "<td>[^<]\+</td>" \
  | sed -e "s:^.\+<td>\([^<]\+\)</td>.\+$:\1:g" \
  >> ${NAMEFILE}
# 住所をgrepで抽出し、sedで整形して保存
  cat ${TARGET} \
  | grep -e "<td><span>[^&]\+&nbsp;</span>" \
  | sed -e "s:^.\+<td><span>\([^&]\+\)&.\+$:\1:g" \
  >> ${ADDRFILE}
done

# 店舗名だけのファイルと、住所だけのファイルをひとまとめにする
php -f ./31merge.php ${NAMEFILE} ${ADDRFILE} ${MERGFILE}
31merge.php

引数に、店舗名だけのファイル名、住所だけのファイル名、出力用ファイル名を指定

<?php
// $argc, $argv : 予約語
if ($argc < 4) {
  echo "$argv[0] in-shopname-file in-shopaddr-file out-merge-file\n";
  exit(1);
}

$fpName = fopen($argv[1], "r");
$fpAddr = fopen($argv[2], "r");
$fpMerg = fopen($argv[3], "w");

while (!feof($fpName) && !feof($fpAddr)) {
  // read each files by line
  // and delete CR/LF
  $shopname = trim( fgets($fpName) );
  $shopaddr = trim( fgets($fpAddr) );

  // write line
  if (!empty($shopname) && !empty($shopaddr)) {
    fwrite($fpMerg, "<tr><td>${shopname}</td><td>${shopaddr}</td></tr>\n");
  }
}

fclose($fpMerg);
fclose($fpAddr);
fclose($fpName);
?>

3.昨日との比較

31merge.phpで保存した m_listYYYYMMDD.txt を、昨日のものと今日のものとで比較することで、昨日なくて今日ある店舗と、昨日あって今日ない店舗を抽出する。

50diff.sh

引数に、ゲームの種別、今日の年月日(yyyyMMdd)書式、昨日の年月日(yyyyMMdd)書式、を指定する。

#!/bin/sh
GAME=$1
TODAY=$2
YESTERDAY=$3

TFILE=${GAME}/m_list${TODAY}.txt
YFILE=${GAME}/m_list${YESTERDAY}.txt
RHTML=${GAME}/result${TODAY}.html

rm -f ${RHTML}
touch ${RHTML}

# HEADER
cat html1.html >> ${RHTML}

# TITLE
echo "<h1>${GAME} - ${TODAY}</h1>" >> ${RHTML}

# NEW COMER
echo "<h2>NEW COMER</h2>" >> ${RHTML}
echo "<table>" >> ${RHTML}
echo "<tr><th>ShopName</th><th>ShopAddress</th></tr>" >> ${RHTML}

diff ${YFILE} ${TFILE} | grep -e "^> " | sed -e "s/^> //g" >> ${RHTML}

echo "</table>" >> ${RHTML}
# GONE
echo "<h2>GONE</h2>" >> ${RHTML}
echo "<table>" >> ${RHTML}
echo "<tr><th>ShopName</th><th>ShopAddress</th></tr>" >> ${RHTML}

diff ${YFILE} ${TFILE} | grep -e "^< " | sed -e "s/^< //g" >> ${RHTML}

echo "</table>" >> ${RHTML}

# LINK

echo "<hr>" >> ${RHTML}
echo "&gt;&gt; <a href=\"result${YESTERDAY}.html\">result${YESTERDAY}.html</a>" >> ${RHTML}

# FOOTER
cat html2.html >> ${RHTML}

4. Webサーバ

50diff.shで作成したHTMLファイルを、Webサーバのドキュメントディレクトリへコピー。
index.htmlのエイリアスとして最新の日付のファイルをシンボリックリンク設定する。

60html.sh
#!/bin/sh
GAME=$1
TODAY=$2

RFILE=result${TODAY}.html
RPATH=${GAME}/${RFILE}
WWWPATH=/var/www/html/pub/uniana
DESTPATH=${WWWPATH}/${GAME}/index.html
REALPATH=${WWWPATH}/${GAME}/${RFILE}

cp -p ${RPATH} ${REALPATH}
ln -s -f ${RFILE} ${DESTPATH}

5. 定時実行

上記のシェルスクリプトをシーケンシャルに実行する

00all.sh
#!/bin/sh
cd /usr/local/uniana

TODAY=`date +%Y%m%d`
YESTERDAY=`date --date '1 days ago' +%Y%m%d`
for GAME in beat
do
  ./10wget.sh ${GAME} ${TODAY}
  ./30sed.sh  ${GAME} ${TODAY}
  ./50diff.sh ${GAME} ${TODAY} ${YESTERDAY}
  ./60html.sh ${GAME} ${TODAY}
done
crontab
## uniana wget
59 7 * * * /usr/local/uniana/00all.sh

C90-3rd(8/14(Sun.))

昔は6:00入りしてたもんだ。もう体力はないぜ。購入欲は抑えてる。カタログ買ってサークルチェックすれば欲しい物が増える一方なので、買ってもほとんど読まないんだぜ。

11:30 東京臨海高速鉄道国際展示場駅到着

買ったもの


AFEEのやつ。認識し始めたのがここ数ヶ月の出来事なので、まずは読むことから始めていきたい


新刊を。国鉄から第三セクターなどに移管された本州と四国の特定地方交通線についてまとめられた本。1982年や1986年当時のスジも簡易ながら描かれていて見ていて楽しい


世界樹の迷宮でミキサーなどやられているquad氏の新譜を。


新譜を。買ったらスーパーブラックシリカちゃんシールをもらい、塩飴つかみどりサービスがあり、そしてカード引き(プリキュアプリキュア、なんかの特撮?、万能文化猫娘)の4択なら万猫えらぶしかないじゃろ そしてやっぱりこの4択なら万猫が人気だったんだとか 客層の年齢層の高さよ


新譜を。かつての勝手なイメージと違って顔がスリムになられたような片岡氏。


新刊を。SQLiteの話だけして「壁おめでとうございます!」っていうの忘れた……

お疲れさまでした。

C90-2nd(8/13(Sat.))

昔は6:00入りしてたもんだ。もう体力はないぜ。購入欲は抑えてる。カタログ買ってサークルチェックすれば欲しい物が増える一方なので、買ってもほとんど読まないんだぜ。

13:30 ゆりかもめ国際展示場正門駅到着

買ったもの


KEYCRASHさんはシンクロニカのレーティングランキングでも見かけたことがあるのでホントに多機種勢なのですね。
多機種でゲーセンめぐりしてる/してた身としては、あるある感たっぷりで共感しまくりであります。

行脚できると「実績」とか「称号」がもらえるゲーム
 ・beatmania IIDXKONAMI
 ・maimai(SEGA
 ・CHUNITHM(SEGA
 ・GROOVE COASTER(TAITO)
 ・crossbeats REV.(CAPCOM
   リフレクもあった(過去形)

行脚?何それ美味しいの?(p4)より抜粋

Dance Dance Revolution に一文字も触れてないのは、単に忘れてるだけなのか、エリアレーダーは実績じゃない認定なのだと思います。

正解のバス乗り場から乗らないと死ぬ……
一度青森で失敗して一時間半循環だけしたのは結構トラウマ

行脚?何それ美味しいの?(p9)より抜粋

ラウンドワンに行こうとして浜田循環線に乗るべきところを横内循環線に乗ってしまったということだろうか。それはキツい……
運行経路・運賃案内/青森市



ばーるさんのところのいつものやつ


山田太郎参議院議員の特集が気になりまして


中央線と山手線と小田急線の終電ちゃんを買いました。東海道新幹線は売り切れてました。

お疲れさまでした