Help us understand the problem. What is going on with this article?

Raspberry Piでプレゼンテーションシステムを構築

More than 1 year has passed since last update.

あけましておめでとうございます🙇🙇🙇.
この記事は Muroran Institute of Technology Advent Calendar 2018 5日目の記事です.
もう年も越しましたが,ガキ使が終わるまでが期限ということで…

今回は,研究室のゼミ向けにセットアップした Raspberry Pi を紹介します.

背景

私が所属する研究室では,毎月 2 研究室合同で mtg をやっていますが,人数が多いため時間の削減のため,事前に全員のスライドを PDF で集め,一台のパソコンでスクリーンに表示しています.
流れとしては,全員が研究室の GitLab に PDF をアップロード(プッシュ)します.
GitLab CI の機能により,ある決められた時刻になると,プログラムが走り1つの PDF に集約されます.

今までは,その PDF をダウンロードし,スクリーンに写していましたが,私自身のメイン PC でその作業をしていたため,「気になったことが検索できない」,「メモをPCで取れない」といった悩みがありました.
タブレットでスクリーンに出していた時もありましたが,ページ送りが煩雑であり,ノート PC を mtg に 2 台持って行こうかと思いましたが,重くなるので今回はその悩みを Raspberry Pi で解決しようというわけです.

準備

【ヘッドレス】Raspberry Pi 3 セットアップ for macOS を参考にRaspberry Piをインストールする.

その後 evince と python3 をインストールしてください.

流れ

電源を入れると同時にスクリプトが走り,GitLab から CI で生成された PDF を zip 形式でダウンロードします.
その zip ファイルを Python で解凍し,evince を --presentation オプションで起動します.
自動実行は ~/.config/lxsession/LXDE/autostart で実現しました.

スクリプト


クリックでプログラム全文を展開します
#!/usr/bin/env python3

import os, sys
import yaml
import json
import requests
from requests.exceptions import Timeout
import subprocess
import zipfile

def get_jobs(config, project_id):
  headers = {'PRIVATE-TOKEN': config['gitlab_token']}
  url = 'http://gitlab.dslabo.net/api/v4/projects/{}/jobs?scope[]=success'.format(project_id)
  r = requests.get(url, headers=headers, timeout=(6.0, 15.0))
  return json.loads(r.text)

def download_zip(config, url):
  headers = {'PRIVATE-TOKEN': config['gitlab_token']}
  r = requests.get(url, headers=headers, timeout=(6.0, 15.0))
  with open('/home/pi/scripts/files/download.zip', 'wb') as f:
    f.write(r.content)
  with zipfile.ZipFile('/home/pi/scripts/files/download.zip') as f:
    f.extractall('/home/pi/scripts/files')

def main():
  with open('/home/pi/scripts/config.yml') as f:
    config = yaml.load(f)

  try:
    zip_url = ''
    for i in get_jobs(config, 130):
      if i['name'] == 'release_pdflatex':
        zip_url = "{}/{}".format(i['web_url'], 'artifacts/download')
        with open('/home/pi/scripts/filename.txt', 'w') as f:
          f.write(i['ref'])
        break

    if zip_url != '':
      download_zip(config, zip_url)
  except Timeout:
    pass

  filename = ''
  with open('/home/pi/scripts/filename.txt', 'r') as f:
    filename = f.readline()

  if os.path.exists("/home/pi/scripts/files/{}.pdf".format(filename)):
    res = subprocess.run(["evince", "--presentation", "/home/pi/scripts/files/{}.pdf".format(filename)], stdout=subprocess.PIPE)
    sys.stdout.buffer.write(res.stdout)

if __name__ == '__main__':
  main()

今後の課題

私の研究室では提出がギリギリの人やついついファイル名が規則通りになっていなかったり,あるいはディレクトリを間違えたりとトラブルがあり(午前に mtg のため修正の時間もない), mtg 中の提出が横行しているので,それに対応する必要があります.

お付き合いいただきありがとうございました🙇

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした