2014年04月21日

Openboxログイン時間制限用のスクリプトを書いた

前回「MinecraftもどきのMinetestに息子がはまった」と書いたが、ゲームにはまって抑制が効かなくなるのも困るので、親子の間で時間制限をかけることに合意した。1日30分とか2日で1時間とか、いや1日1時間はしたいとか、いろいろ攻防があった挙句(もともとテレビは見ないし、Wiiもやめるという前提で)、1週間に5時間ということで落ち着いた。ただし、これをいちいち手作業で管理していたら大変だから、1週間に5時間しかつかえないように設定したい。Mintestそのものにはそういう機能はないので、外部からペアレンタルコントロールをかける必要がある。これはシステムのレベルでも行えないことはないのかもしれないけれど、たまたま他の必要からMintest専用アカウントをつくったので、このアカウントへのログイン時間を制限すればいい。となると、以前作成した「lxdeでペアレンタルコントロール」のスクリプトを改造すればいいのではないかと考えた。
けれど、考えはじめてみると、1週間の時間制限というのは案外難しい。Pythonで書くとして、経過時間を外部ファイルに書き出して記録するのが実際的だなと考えた。そして、週のはじめにその経過時間をゼロにリセットする。曜日を整数として取得すると月曜日が0だから、これを利用すればいいんだろうと考えた。
けれど、よく考えたら、必ずしも毎日アカウントにログインするとは限らない。「月曜日ごとにリセットする」というスクリプトでは、たとえば初回のログインが水曜日だったら数値はリセットされない。最終のログインが週末とも限らないから、「前回のログイン曜日よりも小さなログイン曜日になったらリセット」というのも使えない。全く使わない週も可能性としてはあるわけで、そこまで考えたら、やっぱり日付を取得してきっちりと週のはじめを読んでやらないといけない。
ということで、次のようなスクリプトを書いた。例によって基本がわかっていない私は、あちこちから拾ってきたサンプルのつぎはぎである。公表するのも恥ずかしいようなものだが、私はプログラマではないので、プログラマにとって恥ずかしいようなことでも恥と思わずにできる。素人の強みだ。


#!/usr/bin/python
# coding: UTF-8

import datetime
from datetime import date
import time
import ConfigParser
import os;
import locale
import pynotify


if __name__ == "__main__":

    inifile = ConfigParser.SafeConfigParser()
    inifile.read("./config.ini")

lastdate = inifile.get("int","lastdate")
totaltime = int(inifile.get("int","totaltime"))

lastyear = int(lastdate[0:4])
lastmonth = int(lastdate[5:7])
lastday = int(lastdate[8:10])
d = datetime.date.today()
d0 = date(lastyear, lastmonth, lastday)
days = d - d0
dayow = d0.weekday() - d.weekday()

if int(days.days) > 6:
        totaltime = 0
else:
        if dayow >0:
                totaltime = 0
        else:
                totaltime = totaltime

while totaltime < 360:
        time.sleep(60)
        totaltime = totaltime +1
        st = """[int]"""+ "\n" +"""lastdate        =        """+ str(d) + "\n" + """totaltime        =        """ + str(totaltime)
        f = open('config.ini', 'w')
        f.write(st)
        f.close()

pynotify.init( "1週間の制限5時間です" )
n = pynotify.Notification("制限時間になりました。", "また来週!", "dialog-warning")
n.show()

time.sleep(60)
os.system( "openbox --exit") 


別にconfig.iniという初期設定ファイルを作成しておく。内容は、

[int]
lastdate=2014-04-16
totaltime=0

という感じだ。これをOpenbox環境のアカウントでautostartに仕込んでおく。ただし、ここで重要なのは、スクリプト中に指定してある初期設定ファイルの場所を絶対パスに書き換えておくこと。あるいはcdでディレクトリを変更しておけばいいのかもしれないが、相対パスだと自動起動がうまく働かなかった。しばらく悩んでしまった。

1分毎に設定ファイルを書き換えるスクリプトなので、うるさいといえばうるさいのだけれど、ゲームの終了時のイベントを読んで設定ファイルを記録するスクリプトを書けなかったので、しかたない。これでとりあえずは十分に役に立っているようだ。現在のところこのスクリプトでわかるように制限時間を経過すると1分だけ時間猶予を与えてから強制ログアウトするようになっている。なんだか息子はこれを逆手に取って制限時間後にログインし、1分だけ遊ぶというおかしなことをやっているようだから、ここは10秒ぐらいに短縮したほうがいいのかもしれない。

「どうやって制限しているの?」と尋ねられたので、上記のような大まかな構造だけは説明した。息子はその設定ファイルがどこにあるのかを探し出したいらしいが(もちろん書き換えたいのだ)、それは秘密にしてある。もしもそれを探しだし、書き換えるぐらいの力量がついたら、ペアレンタルコントロールなんか不要になるんだろう。いつかそんな日が来ることを願っている。
posted by 松本 at 10:56| Comment(0) | TrackBack(0) | Ubuntuのアプリケーション | このブログの読者になる | 更新情報をチェックする

2014年04月18日

MinecraftもどきのMinetestに息子がはまった

小学生とパソコンをどうつき合わせるかというのはなかなか悩ましい問題だ。近頃のパワフルなパソコン、特にオープンでたいていのアプリケーションがそろってしまうUbuntuなんかを使ったら、たいていのことができる。創造力を育むには絶大な力をもったツールだ。だから、そういう世界を味わってほしいし、そのためには早くからパソコンを与えたい。けれど、いったん与えたら、それは動画再生装置かゲームマシンにしかならない。こちらが期待したような使い方を決してしてくれないのが小学生というものだ。

それがわかっていたから、最初はブラウザを隠し、ワープロぐらいしかつかえないようにしたパソコンを与えていた。そのうちにアニメーションに興味をもつようになり、アニメ制作ソフトや画像制作ソフトをインストールした。さらに初歩のプログラミング用の環境も整えたが、これはさすがに手に余ったようだ。適切な指導者がいればそうでもないのだろうが、私にはそういったことはできないのだし。

そうやってそれなりにコントロールをかけてきたつもりではあるのだけれど、そのうちに表面から消えているブラウザの起動のしかたを覚えてしまった。しかたないのでペアレンタルコントロールをかけて検索ぐらいはできるようにしていたのだけれど、そうなると情報がどんどん入ってくる。今年にはいって、「マインクラフトをやりたい」と言いはじめた。

それがゲームだというぐらいの知識は私にもある。調べてみたらLinux環境でもできるようだし、classicであれば対戦のようなこともなく、ひたすらものを作っていくだけのことらしいので、それはそれでありかなとも思った。その後いろいろあって、結局、ゲーム機(Wii)を卒業するのであれば、その代わりにMinecraftをやってもいいということにした。ただし、週5時間以内という制限をかけるという条件だ。

さて、このMinecraftだが、基本的には課金型のゲームのようだ。ただ、自分でサーバーを立てるつもりならその必要もないようすではある(ちがうかもしれない)。小学生というビギナーがネットのトラブルにまきこまれないためにも、できたらここはパブリックなサイトではなく、ローカルでちまちまとやりたい。サーバーを立てて稼働させるというのがよさそうだと考えた。

とはいえ、私はプログラマではないサーバー構築は以前書いたようにBitNamiを使って試みたことはあるが、やっぱりあやふやだ。研究するにも時間がかかるが、あいにくとここのところ少し忙しい。もうちょっと手軽にできないかと考えていたら、MinecraftもどきのMinetestというゲームに行き当たった。これならUbuntuのリポジトリにも入っているから、数クリックで手軽に導入できる。Minecraftよりもシステム要件は低いし、とりあえずローカルではじめられるし、中身はだいたいMinecraftだし、ま、これでもいいかという気になった。試しに息子にやらせてみたら、気に入ってくれた。ただし、やっぱり本物のMinecraftの方がいいようで、これで数カ月の猶予をくれる、というだけの話のようだけれど。

ただ、ちょっと現行版のMinetestには問題があって、日本語環境ではメニューがおかしなことになってしまう。いったん使い方がわかってしまえばさほど問題ではないのかもしれないが、試しに動かしてみた私にはさっぱりだった。これはシステム環境を英語にすれば問題がなくなる。しかし、小学生の普段使いの環境は、やっぱり日本語のほうがいいだろう。

ここで思いついた。どうせ使用時間の制限をかけなければいけない。だったら、Minetest専用のアカウントをつくり、そこにログインする時間に対して制限をかければいい。個別のアプリケーションの稼働時間のログをとってそれに対して制限をかけるのはちょっと私の手に余るなあと思っていたのだけれど、特定のアカウントに対する制限ならPythonのスクリプトで書けそうだ。

ということで、英語環境の専用アカウントを用意し、ここにはOpenBoxでログインさせることにした。Minetest実行以上の機能は不要だから。そしてどんなスクリプトを書いたのか、それは次回にとっておこう。あまり長い記事を書くのも辛いので。
posted by 松本 at 13:44| Comment(2) | TrackBack(0) | 総記・雑記 | このブログの読者になる | 更新情報をチェックする