作成者別アーカイブ: kujipon

Raspberry Pi をデジタルサイネージにする(動画流しっぱなしプレイヤにする)

坂本研Webの大学院講義「フィジカルコンピューティング特論」作品展示でも書いたのですが,この展示では1つの紹介動画をループ再生で流しっぱにしています。

要するにデジタルサイネージみたいなものですが,一度設定したらあとは管理フリーにしたかった(つまり放置したい)ので,以下のような条件でやりたいと思いました。

  • 朝自動的に起動し,夜自動的に終了する。
  • 自動的に起動したときに,動画を自動的に再生し始めたい。

これを何で実現するか考えたとき,

  • ノートPCやNUC: 定時の電源ON/OFFの設定が,少し調べた感じBIOSの対応を調べなければならず,面倒そう。かといって,外付けタイマーでON/OFFすると今度は「OSが正常にシャットダウンされませんでした」とか出そう。
  • デジ像などのメディアプレイヤ: 意外と高い。応用が効かない。レジューム再生はできるけど,それをループ再生にはたぶんできない。
  • デジタルフォトフレーム: 意外と高い。応用がかなり効かない。動画のフォーマットも限られている。

などと考えていったら,Raspberry Pi で実現するのが良いんじゃないかと思いました。表示はごく普通のPC用液晶ディスプレイを使う。ただしごく普通の安いのはHDMIがついていないこともあるので,HDMI-DVI変換をする。電源ON/OFFは外付けの家電用タイマで行う。

というわけで,主なものとして以下の機器を用意しました。

その他細かいものとしては以下を使いました。

RasPi2 には 2015-05-05-raspbian-wheezy をインストールし,raspi-config の Enable Boot to Desktop/Scratch では graphical desktop を選択します。

動画は今回は 960×540 (16:9), mp4(AVC/H.264), 29.97fps, 3Mbps で作りました。動画のアスペクト比やコーデックなどにあまり制限されないのも RasPi でやるメリットだと思います。この動画を RasPi2 の適当なディレクトリに置きます。

raspbian には動画プレイヤ omxplayer が始めから入っており,これでフルスクリーン再生ができます。
これを起動時に動作させるようこの辺などを参考に /etc/xdg/lxsession/LXDE-pi/autostart に以下を追加します。

@omxplayer --refresh --loop /path/to/video.mp4

リブートしたらだいたい期待通りの動きになりました。

これでうまくいくかと思ったのですが,テストのためしばらく放置してみると再生がフリーズしていることがあります(OS自体は動いています)。また,動画の最後の2~3秒が無視されて最初に飛んでしまいます。

そこで,OMXPlayer公式から最新ビルドomxplayer_0.3.6~git20150710~4d8ffd1_armhf.debを取ってきて以下のようにインストールします。

# wget http://omxplayer.sconde.net/builds/omxplayer_0.3.6~git20150710~4d8ffd1_armhf.deb
# dpkg -i omxplayer_0.3.6~git20150710~4d8ffd1_armhf.deb

なお,OMXPlayer公式にある以下の手順は必要ありませんでした(2015-05-05-raspbian-wheezyには既にこれらのパッケージの最新版が入っていました)。

# apt-get install libpcre3 fonts-freefont-ttf
# apt-get install fbset


これで完璧に動くようになりました。

あとはデジタルプログラムタイマで,RasPi と液晶ディスプレイの両方を定時ON/OFFするように設定しました。

Windows 7のボタン風LaTeXマクロ

LaTeXの文中でWindows7のボタンっぽいものを表示するマクロを作ってみました。

button.sty

例えば,

\documentclass{jreport}
\usepackage{button}
\begin{document}
こまめに\button{保存}ボタンを押しましょう。
\end{document}

とすると,以下のようになります。

button-sty-sample

また,

\button[150]{保存}

のようにすると,通常サイズの150%の幅のボタンになります。

続きを読む

RubyでPDFのページ数を数える

Rubyスクリプトから,既存のPDFファイルの総ページ数をカウントしたいことがたまにあります。

方法はいくつか考えられます(多少強引なのも含めて)。

PDF::Readerを使う方法

たぶん一番スマート。

#!/usr/bin/env ruby
require 'pdf/reader'

fname = "test.pdf"
p PDF::Reader.new(fname).page_count

PDF::Readerはgemでインストールできます。

$ gem install pdf-reader

続きを読む

白紙のPDF

需要があるかは謎ですが,白紙のPDFを置いてみます。改造や再配布はご自由にどうぞ。

これらが必要になる場面としては例えば,「幾人かの原稿をまとめて一つのPDFにしたいのだけど,各人の1ページめは必ず奇数ページにこないといけない」ような状況を想定しています。花子さんの原稿が3枚で次に太郎さんの原稿を置く場合,間にこの白紙PDFを挟めば良いかと。pdftk でやるならこうですね。

pdftk hanako.pdf blanksheet-a4-portrait.pdf tarou.pdf cat output all.pdf

Acrobatを持っている場合は新規空白ページを作成する方法(Acrobat X)でも可能なようですが,スクリプトでだーっとやりたい場面が多いので。

なお,これらのPDFは,Ruby と libHaru を用いて以下のようなスクリプトで生成しました。

#!/usr/bin/env ruby
require "hpdf"

sizes = %w(A4 A3 A5 B4 B5 LETTER)
directions = %w(PORTRAIT LANDSCAPE)

directions.each do |direction|
  sizes.each do |size|
    pdf = HPDFDoc.new
    page = pdf.add_page
    page.set_size(eval("HPDFDoc::HPDF_PAGE_SIZE_#{size}"),
                  eval("HPDFDoc::HPDF_PAGE_#{direction}"))
    pdf.save_to_file("blanksheet-#{size.downcase}-#{direction.downcase}.pdf")
  end
end

(2017-05-15 追記)
上記スクリプトは libHaru を用いていましたが,libHaru を Ruby から使う場合は hpdf.so が Ruby のバージョンに依存してしまうのがちょっとつらいところです。

Prawn は Pure Ruby なのが良いですね。というわけで最近PDF生成関係のスクリプトを Prawn で書き直したりしています。A4ポートレートの白紙PDFをPrawnで生成するとしたらこんな感じでしょうか。

#!/usr/bin/env ruby
require "prawn"

Prawn::Document.new(:page_size   => 'A4',
                    :page_layout => :portrait).render_file("hakushi-a4.pdf")

Linuxでxlsxをxlsに変換

LibreOfficeが入っていれば,

libreoffice --headless --invisible --convert-to xls:"MS Excel 97" foo.xlsx

という感じで良いみたいですね。

毎月事務局から送られてくる学食の営業情報のxlsファイルを,htmlに適当にコンバートして公開するのをRubyとSpreadsheetライブラリでやっていたのですが,今月からxlsではなくxlsx形式に変わってしまって,かつSpreadsheetはxlsxに対応してないようなので,この手の変換が必要になりました。

ちなみに学食営業情報ページはこちらです

PowerPointでCなどのソースコードをシンタックスハイライト

プログラミングの講義などを担当しているので,ソースコードをPowerPointに載せる機会が非常に多いです。そこで,少しでもわかりやすくしようと,Visual Studio や今どきのblogみたいにシンタックスハイライトをしたいのですが,当然PowerPointにはそんな機能はありません。いくつか方法はあるみたいですが,今のところ私はこうやっています。

テキストエディタ SciTEをまずインストール。
SciTEは source code editor というくらいなのでデフォルトでシンタックスハイライト機能があります。

ソースコードをSciTE上で編集します。他のエディタ等から貼り付けても良いです。自動的にシンタックスハイライトされます。

Ctrl+a で全選択し,Edit -> Copy as RTF します。

なお,SciTEから Copy as RTF するときにいちいちプルダウンメニューからやるのも大変です。Cops as RTFには元々ショートカットキーが無いみたいですが,以下のようにするとCtrl+cに割り当てることができます。

Options -> Open User Options File で,以下のように記入。

user.shortcuts=\
Ctrl+c|IDM_COPYASRTF|

PowerPointでテキストボックスを作って貼り付けます。このとき,「貼付けのオプション」で「元の書式を保持」という方を選びます。

シンタックスハイライトされた状態で貼り付けることができました。

とりあえずシンタックスハイライトだけなら以上で良いでしょう。

私はさらに,以下をやりたいと思いました。

  • 等幅フォントで表示したい。フォントサイズも変えたい。
  • 行間をもう少し詰めたい。
  • 背景色やドロップシャドウもつけて目立たせたい。

SciTEのデフォルト設定ではVerdanaフォントでコピーされます。しかしソースコードはやはり,Inconsolata 等の等幅フォントで表示したいものです。

この場合,等幅フォント化するには2つの方法があるようです。

  1. SciTEの設定で,はじめからInconsolataにしておく。
  2. PowerPointに貼り付けたあとでフォントを変更する。

1の場合は,SciTEの設定ファイル SciTEGlobal.properties の

font.base=font:Verdana,size:10

あたりをいじります。この設定は,SciTE上での表示と,コピーしたときに属性としてくっついていく情報の両方に使われます。

しかし,上記のように他にも変えたい部分がいくつかあるので,2.の方法の方が良さそうです。ただ,これらを毎回やっていたら非常に大変なので,マクロ(vba)にしてみました。(こちらを大変参考にさせて頂きました)

Sub 行間カンマ8フォントInconsolata背景色薄灰色()
  With ActiveWindow.Selection

    'シェイプが選択されていない場合はマクロを終了する
    If .Type = ppSelectionNone Or .Type = ppSelectionSlides Then
      MsgBox "行間を変更したいプレースホルダなどを選択してください。"
      Exit Sub
    End If

    'テキスト編集モードの場合にはシェイプを選択する
    If .Type = ppSelectionText Then .ShapeRange.Select

    '自動調整をいったんオフにする
    .ShapeRange.TextFrame.AutoSize = ppAutoSizeNone

    With .TextRange
      '行間をポイント数で指定するように設定
      .ParagraphFormat.LineRuleWithin = msoTrue
      '行間を0.8にする
      .ParagraphFormat.SpaceWithin = 0.8
      '段落前を0にする
      .ParagraphFormat.SpaceBefore = 0

      'フォントをInconsolataへ変更
      .Font.Name = "Inconsolata"

      'フォントサイズを18へ変更
      .Font.Size = 18
    End With

    '自動調整を再度オンにする
    .ShapeRange.TextFrame.AutoSize = ppAutoSizeShapeToFitText

    '背景色を薄灰色へ
    .ShapeRange.Fill.ForeColor.RGB = RGB(250, 250, 250)
  End With
End Sub

なお,この場合,ソースを貼り付ける先は,普通のテキストボックスではなく,図形描画の「正方形/長方形」にする必要があります。「正方形/長方形」のテキスト領域にSciTEからソースを「形式を選択して」貼付け,その図形を選択状態にした上で,この「行間カンマ8フォントInconsolata背景色薄灰色」マクロを適用します。最終的には以下のような感じになります。

Inconsolataフォントは以下からダウンロードできます。http://www.levien.com/type/myfonts/inconsolata.html