20121127

Linux shell脚本,Linux下的西红柿时间管理法 II

Linux shell脚本,Linux下的西红柿时间管理法 II

4. 架框及已有的技术

我原来的代码非常简单,里面包含了大致的框架和已经利用的技术,如下。

1 #!/bin/bash
2 at now + 20 minutes 2>/dev/null <<EOF
3 aplay -q /usr/lib/openoffice/basis3.2/share/gallery/sounds/horse.wav &
4 EOF
5
6 atq | tail -n 1

以上是计时20分钟的,计时5分钟的基本相同,唯上面的20改为5。

第1行,表示将使用bash作为shell解释执行。

第2行,at指令表示增加一个作业,在某个时间执行,具体的时间是20分钟以后。"2>/dev/null"是错误重定向,即如果有错误信息,输出到null设备,也就是忽略它们。这是为了避免有错误的时候出提示信息。我希望程序出错的时候就死掉。

从第2行的"<<EOF"到第4行的"EOF"之间,是当20分钟到了的时候,计算机应该干点啥。第3行,也就是播放那声巨难听的马叫。

以上,就是主要的框架,手动运行脚本时增加一个at作业,然后到时间的时候放点声什么的提醒我。但是仅仅有音乐不足以打断我,所以向eyefoo学习,我准备让计算机到时间的时候把屏幕锁住。

这就涉及到下一个问题,我需要一些新的技术支持我。这也是做不熟悉的小项目的一个重要技巧:不是按需求-分析-设计-实现这样的瀑布或其变形,而是在做完需求和基本框架以后,要做技术原型测试需要的新技术。

5. 需要的支持技术

需要的支持技术包括:锁屏幕,解除屏幕的锁定,放音乐,算还剩多少时间休息。之所以新技术里需要
放音乐,是因为我发现马叫声太难听了,而eyefoo的那几段mid不错,准备拿来用。

算还剩多少时间这个比较麻烦,后面我们再单独谈,先看其他的。

5.1 锁屏幕和解锁屏幕

google了一下,得到以下结果。

[http://stackoverflow.com/questions/8681662/lock-ubuntu-from-shell-script]
Lock
ssh -X user@server "export DISPLAY=:0; gnome-screensaver;
gnome-screensaver-command -l;
UnLock
ssh -X user@server "export DISPLAY=:0; gnome-screensaver;
gnome-screensaver-command -d

然后我手动试了一下,好使。这里想再补充两点。第一,google不是万能的,使用它的前提是你得知道自己要找什么。所以从需求到分析、能找到需要的技术都很重要,它们帮助你知道要找什么。第二,找到以后试一下很重要。不试你不知道它好使,仅仅网友宣称甚至手册宣称都是没用的。亚里士多德还宣称两个铁球不同时落地呢。你得先试一下。此外,试的时候不要在你正准备做的项目里试,另做一个小的项目,专门试这个技术的。一次只解决一个问题,保持最小系统,都是符合14条原则的。

5.2 放音乐

5.2.1 音乐文件

eyefoo的mid在我的Linux机器上放不出声来,因为我的机器里没有这种乐器库。这个说起来就复杂了,跟mid的原理有关,此处略过。总之,你可以有两种方法做出个新的mid来。一种方法是,找个听音牛的,让她告诉你那个曲子的谱,然后你用lilypond或者cakewalk或者Siblius之类的软件按谱做个mid出来。嘴哼哼也行,在旋律上这没什么差别,所不同者,嘴哼哼的不能用mid格式。另一种方法是,用rosegarden打开这个mid文件,编辑一下,换个乐器试试,我换了三角钢琴。

5.2.2 播放

timidity break2.mid

timidity是个Linux下的midi播放软件,命令行的,可以在shell脚本下调用。这就是为什么那些命令行工具会长久存在的原因,它们为shell脚本提供服务。而GUI编脚本就困难多了。等你看了我后面贴的脚本代码,再对比.net之类写的工具,就会发现脚本真是简单了。

当然,这个也得试一下技术原型。

5.2.3 音量

我发现原有的曲子音量有点小,有的时候预告时间快到了那几声听不到,所以查了一下timidity的参数,-A 是调音量的。

当然,这个也得试一下技术原型。下略。

6. 代码

根据需求、既定的框架、新试完的技术,就有了以下代码:

1 #!/bin/bash
2 tomato_path="~/tools/tomato"
3
4 at now + 24 minutes -q r 2>/dev/null <<EOF
5 timidity -A 800 $tomato_path/prebreak2.mid &
6 EOF
7
8 at now + 25 minutes -q r 2>/dev/null <<EOF
9 timidity -A 800 $tomato_path/break2.mid &
10 gnome-screensaver-command -l
11 sleep 300
12 timidity $tomato_path/unlock.mid &
13 gnome-screensaver-command -d
14 20.sh
15 EOF
16

第2行,定义一个变量名字叫 tomato_path,后面在第5行、第9行、第12行分别引用了一次。

第5行,到24分钟的时候,预报时间快到了;第9行,放声音,下课啦;然后在第11行休息300秒,即5分钟;第12行,播上课铃声。

第10行,到时间了,锁屏幕。输入密码的时间通常足够阻止我继续工作的冲动。

第13行,休息结束,开启屏幕。

第14行,自动地再次运行这个脚本,即开始计时25分钟。

这段代码也可以在 [https://github.com/younggift/tomato.git] 找到。

7. 更多需求

这基本就够用了,但是还有不足。指令atq可以列出任务在什么时间将被执行,像这样:

$ atq
3444 Tue Nov 27 18:47:00 2012 r young
3445 Tue Nov 27 18:48:00 2012 r young

但是,我更想直接快速知道还有多少分钟可以工作,而不是根据当前时间和任务时间计算。所以,我们还希望能用脚本解决这个问是。

未完待续

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

No comments: