スマートフォンからのリモートプレゼンテーション制御

最近レポートを作成しました( Percona Liveについて )。 そして、ある夜(結局は時差ぼけ)、スライドに関するコメント(ノートとラップトップに移動せずにスライドを切り替える)を何らかの形で見るのがいいと思いました。 スライドを切り替えてコメントを表示するための奇跡的なデバイスはありませんでした。 しかし、Androidを搭載したスマートフォンがありました。 Googleマーケットは失望しています。 これらのアプリケーションのほとんどはPowerPointでしか動作しませんでした。LibreOfficeの場合、1つしか見つかりませんでしたが、有料で、どういうわけか間違っていました。



しかし、簡単な解決策があります-ブラウザ。 ラップトップでhttpサーバーを上げ、電話からログインし、リンクを介してスライドを切り替えることができます。 また、Androidだけでなく、AppleやWindows Phoneでも動作します。 はい、一般的に、スマートフォンは必要ありません。WAPを使用することも、別のラップトップから使用することもできます。



それは非常に簡単でした。 Pythonで約70行、外部依存関係なし(ほぼ)。



コメントはファイルから読み取られます(プレゼンテーションからコメントを引き出すことはありませんでした)。 いくつかのポートでBaseHTTPServerを上げます。8000から9000までのすべてを、うまくいくまでランダムな順序で試します。 StackOverflowの指示に従って、IPを決定します。 さらに、大きな乱数を生成します。これはURLの一部であるため、聴衆の誰もスライドを切り替えません。 ささいな便宜のため、ブラウザを開いてサーバーにアクセスするためのQRコードを表示します。 会議中にインターネットにアクセスできない場合は問題ではありません。URLを手動で入力する必要があります。それだけです。 そして、仕事のために、十分な内部無線LAN。



BaseHTTPServerの指示に従って 、GET要求を処理するには、 do_GETメソッドを作成する必要があります。 作成します。 最初に確認する必要があるのは、乱数です。 存在し、URLがnextまたはprevで終わる場合、スペースまたはそれぞれバックスペースをシミュレートし、次または前のページのコメント付きのページを返します。



fvwmがあるので、クリックのシミュレーションに問題はありませんでした。 他のウィンドウマネージャーについては、別のプログラムまたはPython用の特別なモジュールを使用できます。いくつかあります-私はチェックしました。



まあ、実際には、それだけです。 モバイルブラウザの設定のフォントのみを大きくする必要があります。 そして、短いコメントを書くか、そうでなければ長い間読むために-レポート中の不快な一時停止が判明します。 はい、スマートフォンとラップトップの画面をオフにするためのタイムアウトを削除します。



戦闘状態でのテストは成功しました。



#!/usr/bin/python import sys import os import random import socket import BaseHTTPServer import re handler_class=BaseHTTPServer.BaseHTTPRequestHandler token="/" + str(random.randint(0, sys.maxint)) + "/" page = 1 validate = re.compile(token + "(prev|next)$") def send_key(key): os.system("FvwmCommand 'All (VCLSalFrame) FakeKeypress press {}'".format(key)) class Handler(BaseHTTPServer.BaseHTTPRequestHandler): def link(self,s,n): if n < 0 or n >= len(data): return " " return '<a href="{}{}">{}</a>'.format(token,s,s) def do_GET(self): cmd = validate.match(self.path) if cmd is None: self.send_response(404) self.send_header("Content-type", 'text/html') self.end_headers() self.wfile.write('<h1>OK</h1>') return global page if cmd.group(1) == 'prev' and page > 0: page = page - 1 send_key('BackSpace') elif cmd.group(1) == 'next' and page < len(data)-1: page = page + 1 send_key('space') self.send_response(200) self.send_header("Content-type", 'text/html; charset=utf-8') self.end_headers() self.wfile.write(""" {pagenum} - {next} <hr> {data} <hr> {prev} - {pagenum} """.format(prev = self.link('prev', page - 1), pagenum = page + 1, next = self.link('next', page + 1), data = data[page])) def read_file(s): with open(s) as f: return re.split('--- *\n?', f.read()) def ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('192.168.1.1', 0)) # fake, but nobody cares return s.getsockname()[0] def make_url(port): url="http://{}:{}{}prev".format(ip(), port, token) print url os.system("firefox 'http://chart.apis.google.com/chart?cht=qr&chs=200x200&chl={}' &".format(url)) def run(): for port in random.sample(xrange(8000, 9000),1000): try: httpd = BaseHTTPServer.HTTPServer(('',port), Handler) httpd.server_activate() make_url(port) httpd.serve_forever() except socket.error, e: if e.errno not in (98,): print e exit() except KeyboardInterrupt: print "\nExiting" exit() data = read_file('notes.txt') print "Got {} slides".format(len(data)) run()
      
      






All Articles