近日看完两本关于Slackware的入门书,一本是大名鼎鼎的《Slackware Linux Essentials》,另一本是《Slackware Linux Basics》。之所以想起来看Slackware相关的书,是因为人生接触的第一个Linux发行版就是Slackware。那时候家里没有网络,从报纸上知道了开源软件和Linux的存在。后来在书店里看到了电子工业出版社出版的《Linux大全》,那是一本很厚的书,书的背面印着获取书中描述的Linux版本的方法,我就是从那里获取到的人生第一个Linux发行版。原版书提供三个Linux发行版可供选择,而电子工业出版社只提供其中的两个发行版,一个是人们熟知的RedHat,而另一个就是Slackware。当时本人处于对计算机技术极度痴迷的状态,总是希望能有一些挑战,所以选择邮购了其中安装及配置较为复杂的一个发行版,也就是Slackware。当然,最后从拿到Slackware光盘,到安装并简单配置到能使用确实花了不少时间,也因为如此,我对Slackware的印象才如此深刻。之后在大学的时候自己买过RedHat/Fedora并用了那么几次,工作了后接触更多的是Ubuntu,但是随着Linux使用经验的逐渐增长以及知识的不断积累,越发觉得之后使用的那些Linux发行版似乎都缺少了一点什么,这种感觉说不上来,但是这种隐隐约约的感觉将我的目光再次引向Slackware发行版。
现在说说才看完的这两本书,作为Slackware Linux的官方教材《Slackware Linux Essentials》3更新并不频繁,目前作者正在编写第三版,但是该版尚处于Beta状态4,所以市面上能买到的只有第二版。鉴于前者更新不够及时,导致了《Slackware Linux Basics》5的出现。从名字上看,前者似乎比后者更加全面,但从本人阅读下来的感觉来说,Basics的内容明显要比Essentials的深入一些;从页数上来说,Basics的相比也要多一些,但是这并不是说两本书哪本更好。单从入门角度来讲,我觉得Essentials的内容更适合入门学习;Basics的内容作为Essentials的补充,适合进阶学习。总体来讲,两本书可以互相参考学习。就本人经验,看完其中一本后,另外一本可以很快看完,因为只需要看差异的部分就可以了。虽然这两本书都以Slackware为切入点,但是其内容对于其它发行版也是部分适用的。所以,不论对于想学Slackware还是想学Linux的同学,我是极力推荐去看这两本书的,比市面上买的那些翻译山寨教学书好过不少。至于需要书的同学,可以去脚注找找,两本书官方都提供常用电子档下载,而我是用软件将HTML转成了kindle格式在kindle上读完这两本书的。
#!/system/bin/shtp_name="xxxx"# xxxx为注册的tp名称input_name=`cat /sys/class/input/input0/name`if["x_$tp_name"="x_$input_name"]; thenecho"`date` touch screen is OK." >> /data/check_tp.log
reboot
elseecho"`date` touch screen is not OK." >> /data/check_tp.log
fi
同时,修改 init.rc 文件,在其中加入:
123
service check_tp /system/bin/sh /system/bin/check_tp.sh
class main
oneshot
privatevoidkeyPressed(intkeyCode){mHaptic.vibrate();KeyEventevent=newKeyEvent(KeyEvent.ACTION_DOWN,keyCode);mDigits.onKeyDown(keyCode,event);// If the cursor is at the end of the text we hide it.finalintlength=mDigits.length();if(length==mDigits.getSelectionStart()&&length==mDigits.getSelectionEnd()){mDigits.setCursorVisible(false);}}
/** * Vibrate with a given pattern. * * <p> * Pass in an array of ints that are the durations for which to turn on or off * the vibrator in milliseconds. The first value indicates the number of milliseconds * to wait before turning the vibrator on. The next value indicates the number of milliseconds * for which to keep the vibrator on before turning it off. Subsequent values alternate * between durations in milliseconds to turn the vibrator off or to turn the vibrator on. * </p><p> * To cause the pattern to repeat, pass the index into the pattern array at which * to start the repeat, or -1 to disable repeating. * </p> * * @param pattern an array of longs of times for which to turn the vibrator on or off. * @param repeat the index into pattern at which to repeat, or -1 if * you don't want to repeat. */publicvoidvibrate(long[]pattern,intrepeat){if(mService==null){Log.w(TAG,"Failed to vibrate; no vibrator service.");return;}// catch this here because the server will do nothing. pattern may// not be null, let that be checked, because the server will drop it// anywayif(repeat<pattern.length){try{mService.vibratePattern(pattern,repeat,mToken);}catch(RemoteExceptione){Log.w(TAG,"Failed to vibrate.",e);}}else{thrownewArrayIndexOutOfBoundsException();}}
<!-- Vibrator pattern for feedback about touching a virtual key --><integer-arrayname="config_virtualKeyVibePattern"><item>0</item><item>10</item><item>20</item><item>30</item></integer-array>
(defunmy-screenshot()"Take a screenshot into a unique-named file in the current buffer filedirectory and insert a link to this file."(interactive)(setqfilename(concat(make-temp-name"./")".png"))(setqfullfilename(concat(file-name-directory(buffer-file-name))"images/blog/"filename))(if (file-accessible-directory-p(concat(file-name-directory(buffer-file-name))"images/blog/"))nil(make-directory"images/blog/"t))(call-process-shell-command"screencapture"nilnilnilnil"-i"(concat"\""fullfilename"\""))(insert(concat"[[./images/blog/"filename"]]"))(org-display-inline-images))