Raspberry Pi でデジタルサイネージ その2

さて、前の記事で、ガチョーン! となった
adwaita not found.
というエラーで eog がスライドショーをしてくれないと言う問題、
さて、どのパッケージに入ってるんだろうなと

# apt-cache search awaita

とやってみたものの見つからず、アレコレ調べてみた結果、adwaitaというライブラリを単体でインストールする方法はなく、LXDEをつかっているにもかかわらず、gnomeのテーマパッケージを入れる方法でしか、インストールできないと言う事なので

# sudo apt-get install gnome-themes-standard

とやって、無事にeogでスライドショーが出来るようになった。

次に LXDE が起動すると、スライドショーが始まるように設定を進める。
作業としては、 ~/.config/lxsession/LXDE/autostart のなかに、 @eog -s -f /SLIDE と書き込むだけ。
このファイルの中では、コマンドは頭に@をつけるのがお作法らしい。

# mkdir -p ~/.config/lxsession/LXDE
# echo '@eog -s -f /SLIDE' >> ~/.config/lxsession/LXDE/autostart

あとは、ひたすらスライドショーを繰り返すだけなので、途中でスクリーンセイバーが働いたり、スリープしたりしないようにする設定をすれば、基本的には完成するのだが・・・
正直この辺はよくわかっていない。(^^;
結果的に

/etc/kbd/config
/etc/X11/xinit/xinitrc

この2ファイルを弄ることで、スリープしなくなった。

/etc/kbd/config では、

BLANK_TIME=30
POWERDOWN_TIME=30

という2つのパラメタがそれぞれ300秒と設定されているので、

BLANK_TIME=0
POWERDOWN_TIME=0

0秒(設定無し)とする。

/etc/X11/xinit/xinitrc では、
#!/bin/sh の次に

xset s off
xset -dpms
xset s noblank

の3行を追加する。

これで、再起動すれば、完成。

eogは、フル画面表示にあわせて画像のリサイズをしてくれるのですが、そこに頼ってしまうと次の画像に切り替わる際にもたつく(そこはやっぱりRaspberry PiのCPUは、非力なのでまぁ仕方ない)ので、720P(1280×720)で用意すると軽やかにスライドショーをしてくれる。

次回は、SAMBAの設定と、モニター画面の電源制御をまとめる予定です。

Raspberry Pi でデジタルサイネージ

前回書いたのが、ちょうど1年前。
忘れた頃にしか書かないブログだったりする訳ですが・・・

親戚のじいちゃんが、グループホームから介護付きの施設に移る事になり、そこでつかっていた、AQUOSが浮くとのことで、私の手元に転がり込んできました。

そして、私の手元には、息子が遊び飽きた Raspberry Pi B が転がっていたので、
This is a Raspberry Pi !
This is a AQUOS
Woo!
This is a Digital Signage!
ってことで、構想5分、製作半日という感じでやってみた。

Digital Signage って(動画をながせるのが特徴なのだがw)要するに、スライドショーを連続して再生し続ければオッケーな訳です。

Google先生にアレコレ聞いてみると、どうやら Raspberry Pi の スタンダードOS である Raspbian から apt コマンドでインストール可能なアプリに、 eog という画像ビュワーがあり、コマンドラインの起動オプションで 指定したフォルダの中にある画像ファイルを、スライドショーでひたすら表示し続ける事ができるそう。

基本的にサイネージを置くショーケースは、レーザー加工機の奥になるので、スイッチのオンオフや、ラズパイのUSBにキーボードを繋ぎに行ったり、USBメモリを刺しに行ったりするのは、いろいろモノをどけたり、アクロバティックな移動をする必要があるので出来るだけ避けたい。
そして、私が朝イチに工場に行くとは限らないので、時間になったら勝手にスライドショーが始まって、時間になれば勝手に終わるような仕掛けにしたい。

そこで、作戦はこう。

1)eogをインストール。
2)eogで表示させるフォルダは、ネットワーク経由で画像ファイルを置けるようにする。
3)モニタの電源も、コマンドでオンオフしたい。GPIOでSolid State Relay をコントロールする。
4)メンテナンスも、できるだけリモートでしたいので SSH も立ち上げる。
5)電源を入れたら、eog がスライドショーモードで起動するようにする。

まず、1)は言うまでもなく簡単に片付いた。
#apt-get install eog
これ一発でOK。 とはいかず、息子が遊んだ後だったので、
#apt-get update
というおまじないが必要だった。

2)も1)同様に apt-get コマンドで片付く。
#apt-get install samba
とりあえず、F/Wの内側のプライベートネットワークに置く端末なので、IPアドレス制限のゲスト書き込み許可設定した画像フォルダを作る。ここに、サイネージとして表示させるファイルを、リモートから書き込むようにする。

とりあえずテスト用に画像を適当に置いてみて、
eog -s -f /SLIDE

await not found. と言うエラー・・・

ネットの書き込みを見ながら作業するとよくある話なのですが、「なんで我がとこの環境だとエラーになるねんな…」 と・・・

ひとまず次ぎに続く…

名簿の掲載順序をシャッフルする

新年あけましておめでとうございます。

久しぶりのブログ更新なんですが、今回のネタは、「Excelで作った名簿の順序をシャッフルしたい」と言う要求に対する回答例を解説します。

まず問題の背景なんですが、小学校の役員改正の選挙で名簿の上位の人が不利という話がありました。まぁ、実際の選挙でも、候補者掲示板の場所が重要と言う話もありますし、ならば、各個人に配布する候補者名簿の順番をランダムにしたらどうかと言う話が出たようです。(あくまでも、カミさんからの伝聞w)

さて、実際に作るにあたって、過去数年の名簿がExcelのファイルで各年度の役員を持ち回ってきた事を鑑みて、Excelでお膳立てしておけば、何かと役に立つんだろうということでExcelでの実現とし、幸か不幸か私のメイン環境がMac版のExcelということもあり、VBAに頼らず関数のみで実現する方法としました。

Excelファイルの中は大きく2種類のシートに分かれ、1つは名簿の元データとして編集可能な上3年〜下4年の4シート(原簿)、もう1つは、ランダムに順序が並び変わる候補者名簿の2シート(名簿)で構成されています。

仕組み自体は、名簿の各個人データに rand() で乱数を振り、名簿側で、乱数を元に昇順にソートしたデータを使うというもの。再計算するたびに原簿の乱数が変わるので、名簿の順序はシャッフルされます。

まずは、原簿シートについて

A列から順に、順序キー、班、名前、・・・と個人情報が並んでいます。
順序キーのみ関数が仕込んであります。
関数:=IF(C3="","",ROUNDUP(RAND()*10000,0))
名前欄に値があった時のみ、乱数値が入ります。 乱数値は、1万倍してから小数点以下を切り上げる事によって0〜9999の間の整数を得ています。
また、名簿シートで使うための名前の定義として、順序キーのみと、データ全体を定義しています。

次に、名簿シートについて

図では、上地区、下地区となっていますが、基本的には参照している原簿シートが異なるのみの違いです。
図でA列は非表示になっていますが、原簿の順序キーを参照する関数が入っています。
関数:=IF(上3年!A3="","",SMALL(上3年順位,1))
原簿側の人数が可変できるようにするため、原簿側のデータ1行目のデータの生む判定を組み込んでいます。
関数:SMALL(上3年順位,1) 
が肝で、原簿側の順序キーを昇順に並べ替え、小さい順に1番目の値をとって来る という動作をします。
つまり2行目は、SMALL(上3年順位,2) となります。

次にB列では、A列の順序キーを検索鍵として原簿を検索し、見つけた行の2列目つまりB列の値を取っています。
関数:=IF(A3="","",IF(VLOOKUP(A3,上3年原簿,2,FALSE)="","",VLOOKUP(A3,上3年原簿,2,FALSE)))
参照する値がない場合、つまりA列がブランクの場合、エラーになるので、if関数で、A列に値があるときのみ関数を実行するようにしています。

C列以降もB列と同じ関数の繰り返しで、原簿シートのC列の値を取得するためには、VLOOKUP関数で取得する列番号が3になります。

作ったファイルは、下記リンクにおいておきますので、ご興味があればどうぞ。
RandomList.zip

尚,ファイル中の個人情報は、なんちゃって個人情報を利用して生成しました。

科学データのオープン化

ようやく動き出したか…

理事長室から −オープンサイエンスの国際的な広がり−


実験データの管理システムは、私の研究者生活の中で多くの時間を費やしてきたテーマである。当初は、タンパク質結晶構造解析ビームラインで遠隔操作実験を進める上で、SPring-8の実験データストレージシステム上に存在する計測データを遠隔地にいる実験者にどう渡すのかから始まった実験データ取扱システムの研究が、その後2008年に出向と言う形で行った防災科学技術研究所・兵庫耐震工学研究センター(E-ディフェンス)の実験データ公開システムASEBI(*1)として、実験データ公開システムの完成形となった。2011年に出向が解けてSPring-8に戻ったあとに取り組んだSPring-8実験データリポジトリ(*2)で、まだ一部分ではあるもののメタデータと実験データの確実な紐付けを実装し、来るべきオープンサイエンス時代の幕開けに備えた。

ただ、SPring-8で測定される総てのデータを公開するためには、総てのデータを入れる箱がなければならない。巨大なストレージシステムは莫大な運営維持費が必要になる金食い虫でもある訳で、そのあたりを国としてどう手当していくのだろうか。
そして、ここで改めて科学研究データは誰のものなのかという議論をしてほしいと思う。
日本の場合、多くの研究者が研究費として使うのは科研費や、振興調整費といった税金が原資の費用である。
これらの研究データは、研究者1個人に帰属すべき性格のものではなく、一定の排他的独占利用期間が認められた国有財であると考えるべきである。それゆえ、個人の責による毀損や滅失があってはならない。そして排他的独占利用期間が終了した後には、速やかに広く国民に解放され、多角的に利活用されなければならない。
しかしながら、科学データは、生データを公開して終わりと言うものではなく、実際に利用可能なデータとして公開するためには、いくつかの大きな課題を解決しなければならない。
そのうち最も大きな課題は、実験条件といったメタデータの取得紐づけ問題、即ちそのデータがどういうプロセスで取得されたのかというメタ情報をデータに確実に紐づけなければならないということである。
記憶に新しいSTAP細胞事件、データの取り違えという初歩的なミスがあったとされているが、ある意味起こるべくして起こったともいえよう。
SPring-8という最先端の施設でさえ、潜在的にこの危険性を孕んでいる。それは、実験データと試料とを紐づけたり、実験データとその計測条件を紐づけたりする、計測データとメタデータの関連付けに人間が介在しなければならないためである。
例えば、非常に似たデータとなる試料AとBを測定するときに、試料Aを試料Bと誤認しデータを取り違えるというような不注意によるミスである。
このようなミスを完全に防ごうとした場合、試料の調製段階から一意の標識付与による経過追跡が有効であるのは間違いない。だが、現実にそれを行うことは非常に困難が伴う。試料の性状により識別付与が困難であったり、現場の研究者が煩雑を理由に導入に否定的であったり、導入のための費用捻出が困難であったりするためである。
また出来上がった試料の測定施設であるSPring-8でも、最先端ゆえに経過追跡を困難にする要因が存在する。先端の実験では、1パッケージ化された計測システムというのが存在せず、ここの機器を組み合わせて計測する事が多い。試料から発せられるなにかしらの物理量を電気信号に変換する計測器、その信号を増幅する増幅器、ノイズを軽減するフィルタ、数値として変換する計数器である。
それぞれの回路には、いくつかの調整パラメタが存在し、ダイヤルを回して設定するものや、コンピューターからのデジタル信号で設定するものなどが混在する。これらの値は、解析手法により、重要なものから、なくても支障のないものまであり、研究者によって、取捨選択され手書きのノートに記録されたり、テキストファイルや、エクセルデータとして、保存され、解析に利用されている。つまり、切り口を変えると解析に必要なパラメタが変わって来る事を意味する。つまり、現状のまま実験データを公共財として公開出来たとしても、当初の実験者が見ようとした切り口以外からの解析に堪えうるメタデータが紐づいている可能性はきわめて低い。現在の実験データの信頼性や可用性は実験者に委ねられているといえよう。
この問題の解決は研究データのオープン化を進める上で最も大きな課題であり、先端性を確保しながら、自動的に全ての実験条件情報を収集する仕組みの構築が急務である。

1: ASEBI

2: DEIM2013 SPring-8実験データリポジトリの構築(PDF)

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

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


以上

SSD高速ストレージ

少し前から進めているSSDを16個RAID0で束ねてどこまでI/O性能がが伸びるのかという評価で、ベンチマークツールが違うので単純に比較できないという面はあるのですが、非常に大きな差が出ている。
ドライバの出来なのか?!

Windowsの結果(CrystalDiskMarkの結果)

Linuxの結果(1M〜1Gのファイル100個を、255回生成(各々25500回の書き込み動作)したときのそれぞれの所要時間から書込み速度を算出し、頻度分布を見た)