競泳で競技結果速報をツイッターで流す方法

4年程前より、私が関わってる神戸市水泳協会では、一部の大会について、競技結果の速報をツイッターに流している。ただ、1年間に使う回数が少ないため、自作のシステムながら、動かし方を忘れていることが多く、自分自身への備忘録と言う意味でシステムについての解説を書いてみた。

<背景>
私自身小学校から高校までの間競泳選手として様々な大会に出場してきた。そのなかでいつも不満に思っていた1つが、競技結果の速報が非常に見にくいことだった。競技結果は、たいてい会場のロビーにある掲示板に、A4用紙にプリントアウトされた形で張り出されているのだが、いかんせん、A4の用紙では見たい人間の数に対して、見える範囲が限られ、自分の泳いだ記録を確認することは、人だかりをかき分けて、掲示板の前にたどり着き、そして、多くの貼り出された紙の中から、自分が出場した競技の紙をさがしだし、更にその中から自分の名前を探して、記録を見ると言う、元来人ごみが苦手な私にとっては苦痛きわまりないことだった。

大学を卒業して、神戸に戻ってきたあと、兵庫県の水泳に関わるようになって、過去に苦痛に感じた競技結果速報の問題を何とかしたいと言う思いを持ちいろいろな技術を試した。

FMラジオの文字多重放送「見えるラジオ」が使えないかや、競技結果をリアルタイムに神戸市水泳協会のWebサイトのデータベースサーバーに転送し、Web検索で結果が検索できるというような、ちょうどスイムレコードドットコムのようなサービスを試験的に行なったこともあった。ただ、時代背景としては、スマホはなく、いわゆるフューチャーフォンの簡易Webブラウザ機能を使うことが前提のサービスで、会場にURLを掲示しても殆どアクセスがないと言う状況だった。

その後時は流れ、携帯電話は、スマートフォンのシェアが広がり,Twitterと言ったSNSサービスが登場する中で、再び転機が訪れた。私の職場環境が変わったことにより、身近なコンピューターがMacになった。仕事柄UNIXを使うことが多かったため、WindowsからMacへの移行はそれほど大きな支障はなく、逆にWindowsを使っていた頃よりも、簡単にUNIXコマンドラインツールが使える利点が大きかった。
自分のプライベート環境をもMac化したことにより、大会会場に携行するノートPCもMacになり、競泳の多くの大会で競技システムとして使われているセイコーリザルトシステムの種目別競技結果のCSV出力を使って、いろいろできるようになった。

つまり、コマンドラインツールで、ツイッターへの投稿ができるようになれば,リザルトが出力できるCSVファイルを経由して、ツイッターへの速報投稿ができるようになると考えた。

<実装>
調べてみると、Rubyで書かれた tw というツイッターコマンドラインツールがあり、パイプ機能の使うことにより、投稿文を標準入力から取得できることが分かった。

CLI Tweet Utility : tw
http://shokai.github.io/tw/

これに、リザルトの競技印刷メニューにある種目別競技結果印刷から、CSV形式での書き出されたファイルを元に、整形しツィートするシェルスクリプト ”tweetResult.sh” を作成し、運用している。

tweetResult.shの中身

#!/bin/tcsh

if ( $#argv != 1 ) then
echo "########## Usage ##########"
echo " $0 [ResultFile] "
echo "###############################"
exit -1
endif

#set debug=1
set debug=0

nkf -w $1 | grep -v "OPEN" | grep -v '棄権' | grep -v '失格' | awk -F "," 'NR>7 {print $1"位",$5,$10}' > /tmp/$$
set lines=`wc -l /tmp/$$ | awk '{print $1}'`
set top=`head -n 1 /tmp/$$`
set second=`head -n 2 /tmp/$$ | tail -n1`
set third=`head -n 3 /tmp/$$ | tail -n1`
set forth=`head -n 4 /tmp/$$ | tail -n1`
set fifth=`head -n 5 /tmp/$$ | tail -n1`
set sixth=`head -n 6 /tmp/$$ | tail -n1`
set seventh=`head -n 7 /tmp/$$ | tail -n1`
set eighth=`head -n 8 /tmp/$$ | tail -n1`
set header=`nkf -w $1 | head -n 3 | tail -n 1 | awk -F "," '{print $1$6$2$4$3}' |awk '{print $1,$2,$3}'`

if ($lines >= 1 ) then
switch ($lines)
case 1 :
set tweet=`echo "${header} 競技結果: ${top}" | sed -e 's| | |g' | sed -e 's| | |g'`
breaksw
case 2 :
set tweet=`echo "${header} 競技結果: ${top} / ${second}" | sed -e 's| | |g' | sed -e 's| | |g'`
breaksw
case 3 :
set tweet=`echo "${header} 競技結果: ${top} / ${second} / ${third}" | sed -e 's| | |g' | sed -e 's| | |g'`
breaksw
default :
set tweet=`echo "${header} 競技結果: ${top} / ${second} / ${third} / ${forth}" | sed -e 's| | |g' | sed -e 's| | |g'`
endsw

echo $tweet

if ( $debug == 0 ) then
echo $tweet | tw --pipe
endif

endif

if ($lines >= 5) then
switch ($lines)
case 5:
set tweet=`echo "${header} 競技結果: ${fifth}" | sed -e 's| | |g' | sed -e 's| | |g'`
breaksw
case 6 :
set tweet=`echo "${header} 競技結果: ${fifth} / ${sixth}" | sed -e 's| | |g' | sed -e 's| | |g'`
breaksw
case 7 :
set tweet=`echo "${header} 競技結果: ${fifth} / ${sixth} / ${seventh}" | sed -e 's| | |g' | sed -e 's| | |g'`
breaksw
default :
set tweet=`echo "${header} 競技結果: ${fifth} / ${sixth} / ${seventh} / ${eighth}" | sed -e 's| | |g' | sed -e 's| | |g'`
endsw

sleep 5
echo $tweet

if ( $debug == 0 ) then
echo $tweet | tw --pipe
endif

endif

このスクリプトでは、8位までを2投稿で処理している。
全員分処理していないのは、1時間当りの投稿数上限に当たらないようにするため。

./tweetResult.sh [リザルトで作成した種目別競技結果のCSVファイル]

で投稿することができる。

スクリプト中のデバッグ機能を有効にすると、整形後のデータラインが表示され、実際の投稿は行なわれない。

20150830追記
リレーの場合、以下のコマンドにてフォーマット変換を行う。

cat R001.txt | nkf -w | awk -F',' '{print $1","$2","$3","$4","$5","$6","$7","$8","$9","$20}' > R001-Relay.txt


以上