2013年10月12日

タッチパッドの有効・無効を切り替えるツール

息子に使わせている古いDellのInpiron mini 12の話なのだが、「タッチパッドに手が触れて文字が消える」と苦情がきた。実際、このマシンはタッチパッドが大きめで、それはそれで使いやすくもあるのだけれど、誤動作も多い。必要に応じてタッチパッドの有効・無効が切り替えられれば便利だろうとは思う。
で、これはUbuntuの通常ならシステム設定のマウスの設定でごく簡単に行える。ただし、このマシンはスペックの関係でLXDEを使っている。そして、LXDE上ではタッチパッドの設定を変更する手軽なGUIのツールが見つからない。
もちろん方法がないわけではなく、Synclientというコマンドで簡単に無効化することができる。とはいえ、小学生の子どもにいちいち端末を開いて設定させるのも考えものだ。
そこで、PythonでGUIツールを書いてみることにした。Synclientの使い方はこちらにあるので、そこに記載された
$ synclient TouchpadOff=1
をボタンを押すことで実行するようにすればいい。有効にする場合はこの1を0にすればいいから、そちらもボタンをつくっておく。GUIの設計なんて複雑なことはできないから、ここはそこらに転がっていたサンプルコードを流用。こんな具合になった。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygtk
import gtk
import os;

class Application():
 
    def __init__(self):
        self.window = gtk.Window()
        self.window.set_title("タッチパッド設定")
 
        self.create_widgets()
        self.connect_signals()
 
        self.window.show_all()
        gtk.main()
 
    def create_widgets(self):
        self.vbox = gtk.VBox(spacing=20)
 
        self.hbox_1 = gtk.HBox(spacing=20)
        self.button_1 = gtk.Button("タッチパッドを有効にする")
        self.hbox_1.pack_start(self.button_1)
        self.button_2 = gtk.Button("タッチパッドを無効にする")
        self.hbox_1.pack_start(self.button_2)
 
        self.hbox_2 = gtk.HBox(spacing=10)
        self.button_exit = gtk.Button("終了")
        self.hbox_2.pack_start(self.button_exit)
 
        self.vbox.pack_start(self.hbox_1)
        self.vbox.pack_start(self.hbox_2)
 
        self.window.add(self.vbox)
 
    def connect_signals(self):
        self.button_1.connect("clicked", self.callback_1)
        self.button_2.connect("clicked", self.callback_2)
        self.button_exit.connect("clicked", self.callback_exit)
 
    def callback_1(self, widget, callback_data=None):
        os.system( "synclient TouchpadOff=0" )
 
    def callback_2(self, widget, callback_data=None):
        os.system( "synclient TouchpadOff=1" )

    def callback_exit(self, widget, callback_data=None):
        gtk.main_quit()
 
if __name__ == "__main__":
    app = Application()
これにたとえばtouchpad_config.pyのような名前をつけてやり、ダブルクリックで動作するようにデスクトップファイルを設定してやる。たとえばこんな感じ。
[Desktop Entry]
Encoding=UTF-8
Name=タッチパッド設定
Comment=configure touchpad
Exec=python /(パス)/touchpad_config.py
Icon=
Terminal=false
Type=Application
Categories=
これを息子のデスクトップに置いていた。便利に使ってくれているようだ。
posted by 松本 at 19:46| Comment(0) | TrackBack(0) | Ubuntuのアプリケーション | このブログの読者になる | 更新情報をチェックする

2013年10月11日

PulseAudioを削除した

小学生の息子に与えたDellのInspiron mini 12なのだが、動画を再生したときに音がひどいのが気になっていた。YouTubeを見たい息子からも苦情がくる。もともとスペックの貧弱なネットブックだし、「Poulsboの呪い」というやつでビデオのドライバが十分ではなく、動画は決してなめらかとは言いがたい。音がひどいのもその関係だろうと思っていた。
ただ、ハードウェア的な故障ではない。たとえばスピーカーのコーンが破れているのなら、イヤホンで聞いたときはまともな音になるはずだ。以前はそれなりに音も出ていたのだから、やはりこれはOSのアップグレードにともなうソフトウェア的なトラブルだろうとは見当をつけた。ならば、どうにかなるのではないか。

サウンド設定の問題、ドライバの問題、カーネルのレイテンシの問題など、いろいろ情報を探してみたのだが、どうもピッタリとくるものがない。諦めかけたところで、PulseAudioによる遅延を指摘しているブログ記事を見つけた。実はこれも疑ってはいたのだけれど、対処方法がわからなかった。ところが、どうやらPulseAudioは削除してしまえばいいらしい。

もちろん不要なプログラムがデフォルトで含まれているわけはないので、PulseAudioを削除することによるマイナスはあるようだ。ただ、少なくともYouTubeの動画をブラウザで再生する分には、PulseAudioを経由しなくても音は出る。ということで、パッケージマネージャを開いてPulseAudioを削除してやった。関連ファイルがいくつか同時に削除されるが気にしない。再起動すると、嬉しいことに以前よりも音がだいぶマシになった。

非力なマシンだからこその対応だが、こんなふうに工夫することで使い物になるのだから、やっぱりUbuntuはありがたい。改めて思った。
posted by 松本 at 08:23| Comment(0) | TrackBack(0) | Ubuntuでの失敗・トラブル | このブログの読者になる | 更新情報をチェックする

2013年10月07日

lxdeでペアレンタルコントロール

古いDellのInspiron 12にUbuntuを入れて数年前から息子に与えているのだが、小学生にあまりネットの世界をウロウロさせるのもどうかと思ってメーラーもブラウザも、もちろんその他のSNS系のアプリケーションも表面からは隠してあった。ちなみにこのInspiron12、13.04にアップグレードしてからはグラフィックの描画がつらくなってきたので、デスクトップ環境をLXDEで運用するようにしている。LXDEの場合、メニューバーからメニューを削除しておけば、一見したところどんなアプリも起動できない。それでは何もできないので、こちらが許可したアプリ、たとえばワープロだとかお絵かきソフトだとかはショートカットのアイコンをデスクトップに置いてある。これでだいたいはことが済む。Synfigなんてアニメのアプリも、本人の希望に応じて使えるようにした。ただ、Web関係だけは許可しなかった。

けれど、本人はもちろん、ネットでいろいろと情報を仕入れたい。ウチにはテレビがないので、友だちとのあいだで話題になるアニメ関係の情報とか、DVDを借りてきて観る映画の情報(特にハリー・ポッターだ)、あるいは友だちとやるゲームの関係の情報とかを検索したり、YouTubeで見たりしたいらしい。
こちらはそれは禁止しておきたいのだが、ある日、うっかり私が彼のパソコンで調べ物をしようとしたところを見られてしまった。もちろん私はブラウザを立ち上げるわけだが、その手順を秘密にしておきたいので、わざわざ端末を開いてFirefoxと入力して起動している。そこを一瞬見られたわけだ。すると彼は、端末にアプリケーション名を入れれば起動できるのだということを悟ってしまった。それでも私は、「やれるもんならやってみろ」と大きく構えていたが、ついにある日、Firefoxの正しいつづりを見つけてしまった。

こうなったら、放置するわけにはいかない。それまではパソコンは使いたいときに使えというかっこうで任せていたのだけれど、それは、ワープロで文章を書くとか画像ソフトで絵を書くとかは、小学生にとってそうそう根気の続く作業ではないからだ。放っておいても何時間もパソコンにかじりつく心配はない。ほんの30分もやったら飽きてしまう。ところが、Webの世界をぼんやり眺めていたら、いくらでも時間が過ぎる。いわゆるペアレンタルコントロールをすべきタイミングだ。

ペアレンタルコントロールは、大きく分けて2種類の対策を施せばいいだろう。1種類は有害サイトのフィルターリングで、これはFirefoxのアドオンを使えばいい。具体的にはFoxFilterというので間に合いそうだ。無償版はロックがかけられないのだけれど、英語を理解しない小学生に設定の変更は難しかろうから、しばらくのあいだのしのぎにはなる。

もう1種類は、PCそのものの使用時間を制限することだ。夜遅くまでパソコンにかじりつかれてはかなわないから、夜8時半にはシャットダウンしてほしい。学校が遠く朝早い関係で、できれば夜9時には床につかせたいからだ。これに関しては、Gnome Nannyというのがよさそうなのだが、あいにくなことにこれはGnome環境でなければ動かず、LXDEでは論外だし、仮にGnome環境に変更するにしても最新のUbuntuではバグが出て使い物にならないらしい(もちろんアップデートにより動くようになるのは遠くないだろうが)。ともかくも、これは諦めるべきだ。

ただ、このGnome Nanny、Linux-PAMというモジュールを操作するものらしく、したがってLinux-PAMを直接設定してやればパソコンの使用可能時間をコントロールすることができそうだとわかった(このあたりとか)。ただ、けっこう高度な設定らしく、何度かトライしたけれど失敗。どこがどうなっているのかよく理解できないのにあまり深追いしても傷を負いそうなのでいいかげんなところで諦める。

ということで困ってしまったのだが、調べていると同じような悩みを解決するためにシェルスクリプトを書いたという記事があった。なるほど、一定時間を経過したらスクリプトで強制的にログアウトさせてやればいいわけだ。つまり、
#!user/bin/bash
sleep 33m
killall -9 lxsession
というスクリプトをたとえばlogout.shというような名前で保存し、LXDEなのでLXDEの設定のAutostartフォルダ内に
[Desktop Entry]
Encoding=UTF-8
Name=Auto Log Off
Comment = Will automatically log individual off after a set period of time
Exec=bash (パス)/logout.sh
Terminal=true
というような内容でデスクトップファイルをつくっておく。すると、ログイン時に「33分後にログアウトする」というスクリプトが自動スタートするわけで、つまり1回のログインで33分までしか使用ができないという制限になる。

ただし、いきなりログアウトするとデータが失われる可能性があるので、やはり警告は必要だろう。警告も同じシェルスクリプト内に書けばいいのだけれど、そこまでプログラミングに詳しくないので、以前ちょっとかじったPythonを使って、警告のスクリプトを次のように書いた。
#!/usr/bin/env python
# -*- coding:UTF-8 -*-

import pygtk
pygtk.require('2.0')
import gtk
import datetime
import time

time.sleep(1800)

d = datetime.datetime.today()

class HelloWorld:
    def __init__(self):
        self.window = gtk.Window()
        self.window.set_title('時間です!')
        self.window.connect('destroy_event', self.end_application)
        self.window.connect('delete_event', self.end_application)

        self.label_show = gtk.Label()
        self.label_show.set_markup('<span size="24000">\n\n<b>きみがコンピュータを使いはじめて30分がたちました。\nいったん休憩してください。\n3分後に自動的にシャットダウンするので、\nすべてのファイルを保存してください。\nわかったら、「わかりました」ボタンを\nクリックしてください。\n\n</b></span>')

        self.button_hw = gtk.Button()
        self.button_hw.set_label('もうちょっと使いたい')
        self.button_hw.connect('clicked', self.set_hw_txt)

        self.button_gn = gtk.Button()
        self.button_gn.set_label('いま何時?')
        self.button_gn.connect('clicked', self.set_gn_txt)

        self.button_quit = gtk.Button()
        self.button_quit.set_label('わかりました')
        self.button_quit.connect('clicked', self.end_application)

        self.vbox = gtk.VBox()
        self.vbox.add(self.label_show)
        self.vbox.add(self.button_hw)
        self.vbox.add(self.button_gn)
        self.vbox.add(self.button_quit)

        self.window.add(self.vbox)

        self.window.show_all()

    def set_hw_txt(self, widget, data=None):
        self.label_show.set_markup("\n\n<big><b>いったんパソコンを終了して休憩してください。\nそれからもう一度起動すれば使えますよ。</b></big>\n\n\n\n\n")

    def set_gn_txt(self, widget, data=None):
        self.label_show.set_markup("\n\n<big><b>時計を見てください!\nただちにコンピュータをシャットダウンしてください。</b></big>\n\n\n\n\n")

    def end_application(self, widget, data=None):
        gtk.main_quit()
        return False

def main():
    hw = HelloWorld()
    gtk.main()

if __name__ == '__main__':
    main()
このPythonスクリプトも、やはり同じようにAutostartにデスクトップファイルをつくって自動起動させる。そうすると、強制ログアウトになる3分前に警告メッセージが出るという寸法だ。なお、変なダイアログがいっぱいあるのは、コードをもらってきた先のサンプルに合わせなければいけなかったからで、このあたり、Pythonのことを何も理解していないのがバレバレだろう。

とはいえ、これでは再ログインすればまた33分使えてしまう。最大の課題は夜8時半以降は使わせないことだから、夜8時以降はログインできないようにしなければならない。これもやはりPythonのスクリプトで制御する。つまり、
#!/usr/bin/python
# coding: UTF-8

import time
import os;
import datetime
import locale
import pynotify

d = datetime.datetime.today()

t= d.hour
h = float(t)
if h > 19 :
pynotify.init( "午後8時を過ぎています" )
n = pynotify.Notification("午後8時を過ぎています", "パソコンをすぐにシャットダウンしてください。", "dialog-warning")
n.show()

time.sleep(10)
os.system( "killall -9 lxsession" ) 

というスクリプトをたとえばtimeup.pyとかいうファイル名で保存しておき、それをやはりAutostartでログイン時に起動するようにしておく。すると、datetime関数で時刻を取得し、それが19時より大きい(つまり20時以降)であれば警告を出して10秒後にログアウトするしくみだ。実際、これでやってみると20時以降のログインはあっさりと弾かれる。24時を過ぎるとログインできてしまうのだけれど、さすがに小学生、そんな時間まで起きていないので、これはこれでいいだろう。

なんとも始末のわるいことに自動起動のスクリプトを3つも使ってしまっている。もちろん少しでもプログラミングのわかっている人なら、これを1つにまとめることなど造作もないだろう。それはそう思うのだけれど、とりあえず素人としては、用が足りれば十分。これでしばらくしのげそうだ。
posted by 松本 at 00:13| Comment(0) | TrackBack(0) | Ubuntuのアプリケーション | このブログの読者になる | 更新情報をチェックする