2013年11月28日木曜日

WindowsやMacなら当たり前にできること、それは輝度の維持 [追記あり]

[追記:2014/03/04]

この記事に書いた内容は古くなりました。こちらの記事をお読み下さい。→輝度を維持できるinitスクリプト書きました

[追記おわり]


なんでか知らないですけど出来ないですよね、なんでか知らないですけど。


いや、ディストリビューションによって違うかもしれませんが、少なくともUbuntu13.04やDebian Sidでは勝手にやってくれません。多分。再起動すると輝度がMAXで目が、目がぁ〜状態になるのホント嫌です。

前々から気になっていたので調べたりはしたんですよ?でも輝度のパラメータを決め打ちで起動時に指定するって、全然解決できてないと思うんですよ。

夜中で暗めの明るさで作業していて仕方なく再起動していたら、昼間に使う明るめの明るさで起動されるとか。目がやられます。やっぱり再起動してもそのまま暗めの明るさでいて欲しいんですよ。

そういうことでシャットダウン、再起動の時の時点の輝度をどこかに保存しておいて、ログイン時に復元するという感じに出来ました。(参考:Tips: (Linuxで)コンピュータの終了時にコマンドを実行する - disklessfun’s Wiki*)

まず、xbacklightが必要なので入れて下さい。

# aptitude install xbacklight

次に、シャットダウンか再起動の時に/sys/class/backlight/acpi_video0/brightnessから輝度の数値をとってきて保存、それ以外の時にxbacklightでその数値を指定するシェルスクリプトを書きます。実行権限も付与して下さいね。

/usr/local/bin/save_brightness.sh

#!/bin/sh

BRIGHTNESS=`cat /usr/local/share/backlight/brightness`

if test x$RUNLEVEL = x0 -o x$RUNLEVEL = x6 ; then
 cat '/sys/class/backlight/acpi_video0/brightness' > '/usr/local/share/backlight/brightness'
else
 xbacklight -display ':0.0' -set $BRIGHTNESS
fi

/usr/local/share/backlight/も作っておきます。

# mkdir /usr/local/share/backlight

シャットダウンや再起動する時、つまりランレベルが切り替わる時に実行されて欲しいので、/etc/init.d/rcにスクリプトを書いておきます。PATHを通してあるところ以降に書いて下さい。

/etc/init.d/rc

#! /bin/sh
#
# rc
#
# Starts/stops services on runlevel changes.
#
# Optimization: A start script is not run when the service was already
# configured to run in the previous runlevel.  A stop script is not run
# when the the service was already configured not to run in the previous
# runlevel.
#
# Authors:
#  Miquel van Smoorenburg 
#  Bruce Perens 

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

/usr/local/bin/save_brightness.sh

(後略)

あとは.profileにもスクリプトを実行するように書いておきます。

$ echo '/usr/local/bin/save_brightness.sh' >> ~/.profile

これで終わりです。その時の気分でちょうど良い輝度にして、再起動してみて下さい。ログインした瞬間に暗くなってくれます。

ログイン前から暗くなってくれないと困るという人は、/etc/rc.localに

cat '/usr/local/share/backlight/brightness' > /sys/class/backlight/acpi_video0/brightness
を追加とかすればいいんじゃないかと思います。


これで寝パソが捗ります。では。


[追記:2013/12/03]

程なくsave_brightness.shを修正しました。今度は起動時に輝度が変わるようにしました。色々試しすぎてなんでこれでうまく行かないと思ったのかは謎です。

以前のものではディスプレイマネージャを使ってログインしている場合にしか動かないので、変えたほうが良いと思います。

尚、xbacklightは不要です。

/usr/local/bin/save_brightness.sh

#!/bin/sh

BRIGHTNESS=`cat '/usr/local/share/backlight/brightness'`

if test x$RUNLEVEL = x0 -o x$RUNLEVEL = x6 ; then
 cat '/sys/class/backlight/acpi_video0/brightness' > '/usr/local/share/backlight/brightness'
else
 echo $BRIGHTNESS > '/sys/class/backlight/acpi_video0/brightness'
fi

/etc/init.d/rcは同様に、あと~/.profileではなく/etc/rc.localで実行するようにして下さい。

/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/local/bin/save_brightness.sh

exit 0

これで終わりです。こっちのほうが色々不自然じゃないと思います。

2013年11月24日日曜日

PowerTOPでラップトップのバッテリー持ちを良くしたい! その2

前回はPowerTOPでおすすめされたスクリプトを起動時に実行するようにしました。でも、私の場合はこれでは十分ではありませんでした。


何が十分じゃなかったかって言うと、一度でもACアダプタを挿すと、一部のパラメータが元に戻ってしまうことです。

こにゃこにゃ調べてみたんですけど、丁度いい資料がありましたよ。

Gentoo Linux ドキュメント -- 電力管理ガイド

これを読むとACPIイベント(蓋を閉じたり、電源ボタンを押したり)をacpidがキャッチするたびに何らかの動作を行っているみたいですね。何のACPIイベントで動作を行うかは/etc/acpi/events/に、実際に行われる動作は/etc/acpi/に書かれているみたいです。

一部のパラメータが元に戻ってしまう現象も、ACアダプタを挿す、というACPIイベントをacpidがキャッチして、何らかの動作をしているんでしょう。

問題はまたACアダプタを抜いた時に、パラメータがACアダプタを挿す前の状態に戻ってくれないところなので、抜いた時に再度スクリプトを実行してくれれば良いわけです。それでは、私の場合に沿って書いていきます。

私の場合、/sys/class/scsi_host/host*/link_power_management_policyの値が"min_power"になるようにしたのに、"max_performance"になっていました。他には変化はありませんでした。(host*はhost0、host1、などのことを指しています)

また値が"min_power"になるよう/etc/acpi/にスクリプトを書きました。

/etc/acpi/powertop.sh

#!/bin/sh

echo 'min_power' > '/sys/class/scsi_host/host0/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host1/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host2/link_power_management_policy
echo 'min_power' > '/sys/class/scsi_host/host3/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host4/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host5/link_power_management_policy'

あと、この/etc/acpi/powertop.shがACアダプタを抜いた時に実行されるように、/etc/acpi/events/に書きました。

/etc/acpi/events/powertop

event=battery.*
action=/etc/acpi/powertop.sh

あとはacpidを再起動すると反映されているはずです。

# /etc/init.d/acpid restart

ACアダプタを挿して、抜いてから、ちゃんと動いてくれているかpowertopコマンドで確かめてみて下さい。律儀に切り替わってくれているはずです。

もうひとつ付け加えておくと、VM writeback timeoutだけは、SSDを積んでいる人はBadのままの方が良いと思います。/proc/sys/vm/dirty_writeback_centisecsの値が1500より大きかったら、そのままで良いと思います。


肝心の駆動時間はどうなったか、ですか?1時間くらい伸びたかなぁ。では。

2013年11月23日土曜日

PowerTOPでラップトップのバッテリー持ちを良くしたい! その1

基本家でしか使わないので私にはあまり意味がないかもしれませんが。


私は今Dell Vostro 3360をメインに使っています。初めはWindows7、途中からDebianとデュアルブート、そして今はDebianオンリーなのですが、どう考えてもバッテリーの持ちがWindowsよりも悪いんです。5時間くらい持っていたのが3時間くらい。

acpidはちゃんと動いているので、やっぱりメーカーが調整してくれるってのがどれだけ素晴らしいかってことですよね。DellはUbuntu入れて売っている時期があるんだから是非またやってみてもらいたいです。

まぁそんなこんなでバッテリー持ちを良くしたいと思い検索すると、どうやらPowerTOPというものがあるらしく。なんかIntelご謹製みたいです。

https://01.org/powertop/

早速入れました。

# aptitude install powertop

使ってみるとバッテリー食ってそうなプロセスや機器が見られたり、今何ワットで動いているのか分かったり、CPUがどのクロックで動いているのか分かったりします。Tabキーで画面が切り替わります。一番目につくのはTuneableというタブで、実行した方が良いコマンドや、より省電力になるパラメータを教えてくれます。

適用したい設定にカーソルを合わせてエンターを押すと適用してくれるんですけど、再起動すると元に戻っちゃうんですよね。なので、今回はこれらを自動的に適用してくれるようにやってみます。

まず、実際に適用するときに使われるスクリプトはこのままではたぶん分からないのですが、powertopを起動した際の状況をhtmlに出力してくれるオプションがあるので、それを実行します。

# powertop --html

そうするとpowertop.htmlというのが出来ているので、適当なブラウザで開いてみてください。見た目は違えど内容は大体同じです。しかし、Tuningというタブをクリックすると説明と共に実行されていないスクリプトが載っています。

画像ではあまり項目が多くないですが、これはスクリプトを自動で実行できるようにした後の様子なので参考にならないかもしれません;
初期状態ではもっとたくさんありました。

自動で実行する方法として、私は/usr/local/bin/powertop.shにpowertopで推奨されるスクリプトを書き、/etc/rc.localで起動時に実行してもらうことにしました。(参考:PowerTOP to Optimise Laptop Power Consumption - Manjaro Linux)

/usr/local/bin/powertop.sh

#!/bin/sh

iw dev wlan0 set power_save on
echo '0' > '/proc/sys/kernel/nmi_watchdog'
echo '1' > '/sys/module/snd_hda_intel/parameters/power_save'
echo 'min_power' > '/sys/class/scsi_host/host0/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host1/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host2/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host3/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host4/link_power_management_policy'
echo 'min_power' > '/sys/class/scsi_host/host5/link_power_management_policy'
echo 'auto' > '/sys/bus/usb/devices/1-1.1/power/control'
echo 'auto' > '/sys/bus/usb/devices/1-1.3/power/control'
echo 'auto' > '/sys/bus/usb/devices/3-1.1/power/control'
echo 'auto' > '/sys/bus/usb/devices/3-1.3/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:00.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:02.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:14.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:16.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1a.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1b.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.4/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1d.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.2/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.3/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:01:00.0/power/control'
echo 'auto' > '/sys/bus/pci/devices/0000:02:00.0/power/control'

/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/local/bin/powertop.sh

exit 0

とまぁこんな感じです。個々powertopの結果を見てこんな感じにやってみて書いてみて下さい。終わったらACアダプタを抜いた状態で再起動して、powertop --htmlを実行して変化があるか確かめて下さい。

need of Tuningの欄が減っていたらやったぁ!って感じです。powertop.shに書いたのに変化がない箇所があれば、打ち間違いなど確かめたほうがいいんじゃないですかね。お疲れ様です。


...お疲れのところ申し訳ないのですが、まだやることがあります。それはその2でやります。では。

2013年11月15日金曜日

起きていても体が寝ているらしいです

今週整体に行ったのですが、操法を受けていると暖かくて眠くなるんですよね。


それでいつものようにしていると先生がうーんとかハァとか声を漏らしていらっしゃるから何か問題でもあるのかなぁと気にかけていると、「もう良いです。」ということで体起こしたんです。

すると突然先生が「今からそこの路地で走ってきたら如何ですか。」とおっしゃるので、私はよく意味が分かりませんでした。

まぁでも説明を受けていると、何をしても体に変化が起きない。まるで寝ているようだ、とのことらしく。

そりゃ今は家の自室でほとんどを過ごしているのでそうもなるよなぁと。学校に行っている間はまだ良かったらしいです。とにかく刺激がなさすぎて体が寝ているらしいです。

流石にまずいと思い、昨日地元のフィットネスに行ってみたのですが、インストラクターのお兄さんにひと通りの説明を受けて、ウォーキングマシーンに乗ってみると、1.5kmでもう汗だくだくなんですよ。途中から隣でやりだしたおじさんなんかよりはるかに体力が無い事を思い知らされました。他にも下半身の筋トレマシーンもやってみましたが、これは別段苦痛ではありませんでした。

やっぱり有酸素運動だよねということで、私は近場の森林公園でジョギングをしようと思います。今日早速サボりましたが。


いや、明日からやります。

2013年11月8日金曜日

abcdeでqaacを使ってリッピングする

前回ではqaacがシェルから使えるようにしました。その続きです。


次にabcdeとatomicparsleyをいれます。これはA Better CD Encoderの略で、cddbからのタグ取得とリッピングとエンコードを一気にやってくれます。サイコーです。atomicparsleyはaacエンコードをした際にabcdeでのタグ付けに必要なようです。

# aptitude install abcde atomicparsley

abcdeはAACエンコーダがfaacしか使えないのですが、実はシェルスクリプトなのでqaacが使えるように弄れます。弄ってうまくいったのでパッチを作りました。パッチを当てられるようにpatchコマンドもいれます。

# aptitude install patch

abcde.patch

--- abcde.orig 2012-09-18 22:51:23.000000000 +0900
+++ abcde 2013-11-08 03:50:05.355956207 +0900
@@ -1154,7 +1154,9 @@
     ;;
    m4a)
     # Tag the file at encode time, as it can't be done after encoding.
-    if [ "$DOTAG" = "y" ]; then
+    if [ "$AACENC" = "qaac" ]; then
+     $RUN_COMMAND nice $ENCNICE $AACENCODER $AACENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --track "$1" --genre "$CDGENRE" --date "$CDYEAR" "$IN" -o "$OUT"
+    elif [ "$DOTAG" = "y" ]; then
      $RUN_COMMAND nice $EFFECTIVE_NICE $AACENCODER $AACENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --track "$1" --genre "$CDGENRE" --year "$CDYEAR" --comment "$COMMENT" -o "$OUT" "$IN"
      
     else
@@ -3869,6 +3871,10 @@
   AACENCODEROPTS="${AACENCODEROPTSCLI:-$AACENCOPTS}"
   AACENCODER="$AACENC"
   ;;
+ qaac)
+  AACENCODEROPTS="${AACENCODEROPTSCLI:-$AACENCOPTS}"
+  AACENCODER="$AACENC"
+  ;;
 esac
 
 # and which tagger

# patch /usr/bin/abcde < abcde.patch
設定ファイルはホームディレクトリでも読んでくれるのでコピーします。
$ cp /etc/abcde.conf ~/.abcde.conf

あとはabcdeがqaacを使うように設定します。一応私の設定とデフォルトの差分を載せておきます。

abcde.conf.diff

--- abcde.conf 2012-09-18 22:51:23.000000000 +0900
+++ .abcde.conf 2013-11-08 21:57:47.090984769 +0900
@@ -12,6 +12,7 @@
 # If you just wanted to use a proxy server, just set your http_proxy
 # environment variable - wget will use it correctly.
 #CDDBURL="http://freedb.freedb.org/~cddb/cddb.cgi"
+CDDBURL="http://freedbtest.dyndns.org/~cddb/cddb.cgi"
 
 # The CDDB protocol level.
 # Right now 5 is latin1 output and 6 is UTF8 encoding.
@@ -70,6 +71,7 @@
 #SPEEXENCODERSYNTAX=default
 #MPPENCODERSYNTAX=default
 #AACENCODERSYNTAX=default
+AACENCODERSYNTAX=qaac
 
 # Specify the syntax of the normalize binary here - so far only 'normalize'
 # is supported.
@@ -128,6 +130,7 @@
 #SPEEXENC=speexenc
 #MPPENC=mppenc
 #AACENC=faac
+AACENC=qaac
 
 #ID3=id3
 #ID3V2=id3v2
@@ -186,6 +189,7 @@
 
 # M4A/AAC
 #AACENCOPTS=
+AACENCOPTS="--cvbr 192 -q 2"
 
 #ID3OPTS=
 #ID3V2OPTS=
@@ -239,6 +243,7 @@
 # OUTPUTTYPE can be either "ogg", "mp3", "flac" or "spx", or a combination
 # of them separated with ",": "ogg,mp3".
 #OUTPUTTYPE=ogg
+OUTPUTTYPE=m4a
 
 # Output filename format - change this to reflect your inner desire to
 # organize things differently than everyone else :)
@@ -251,9 +256,10 @@
 # to the files. Remove it from your user defined string if you are getting
 # files like ".ogg.ogg".
 #OUTPUTFORMAT='${ARTISTFILE}-${ALBUMFILE}/${TRACKNUM}.${TRACKFILE}'
+OUTPUTFORMAT='${ALBUMFILE}/${TRACKNUM} ${TRACKFILE}'
 
 # Like OUTPUTFORMAT but for Various Artists discs.
 #VAOUTPUTFORMAT='Various-${ALBUMFILE}/${TRACKNUM}.${ARTISTFILE}-${TRACKFILE}'
+VAOUTPUTFORMAT='${ALBUMFILE}/${TRACKNUM} ${TRACKFILE}'
 
 # Like OUTPUTFORMAT and VAOUTPUTFORMAT but for the ONEFILE rips.
 #ONETRACKOUTPUTFORMAT=$OUTPUTFORMAT
@@ -305,6 +311,10 @@
 #{
 # echo "$@" | sed s,:,\ -,g | tr \ / __ | tr -d \'\"\?\[:cntrl:\]
 #}
+mungefilename ()
+{
+ echo "$@" | sed s,:,\ -,g | tr / \  | tr -d \'\"\?\[:cntrl:\]
+}
 
 # Custom genre munging:
 # By default we just transform uppercase to lowercase. Not much of a fancy
@@ -359,6 +369,7 @@
 # If you'd like to have abcde eject the cdrom after all the tracks have been
 # read, uncomment the following line.
 #EJECTCD=y
+EJECTCD=y
 
 # To encode on the remote machines foo, bar, baz, quux, and qiix, as well as
 # on the local machine (requires distmp3 to be installed on local machine and

これでひと通り終わりました。お疲れ様です。

音楽CDを挿入してabcdeと唱えればあとは分かります。

エンコードオプションは.abcde.confの186行目付近のAACENCOPTSで変えられます。なんで--cvbr 192なのかというのも前回紹介したkamedoさんのサイトで分かります。自分でテストしたわけじゃないのですが。

AACとWMAの音質比較 - Kamedoの音風景

ちなみにabcdeではファイル名にスペースやスラッシュが使われる場合アンダーバーに置き換えられるのですが、これも.abcde.confの設定を変えることでできます。311行目付近の関数mungefilename内のtrコマンドが使われているところです。ここを

#mungefilename ()
#{
#echo "$@" | sed s,:,\ -,g | tr \ / __ | tr -d \'\"\?\[:cntrl:\]
#}
から
mungefilename ()
{
echo "$@" | sed s,:,\ -,g | tr / \  | tr -d \'\"\?\[:cntrl:\]
}
とかに変えればいいわけです。あとは色々好きにしてください。


それでは。


[追記:2013/12/12]
諸々の変更や記事名の変更をしました。

Debianでqaacを使う

Tips記事書くの、私の夢だったのでお暇な方はお付き合いください。


普段から音楽はそこそこ聴くのですが、どのエンコーダを使うと良いのかなーと一時期調べていた時期がありまして。で、結論としてはqaacを使うことにしました。なんでかっていうのはこちらのサイトをご覧ください。

MP3,AACの音質比較 - Kamedoの音風景

qaacはiTunesエンコーダのCUIフロントエンドで、Windowsでだけ動きます。ですがDebianでも使いたいので色々試してみました。


まずWineをいれます。私の場合amd64版なのでmultiarchを有効にしてからいれました。ついでにwinetricksもいれるといいかもしれません。

# dpkg --add-architecture i386
# aptitude update
# aptitude install wine winetricks

次にiTunesのインストーラーをダウンロードします。

http://www.apple.com/jp/itunes/download/

これをcabextractで展開して、AppleApplicationSupport.msiだけいれます。

$ cabextract iTunes64setup.exe
$ msiexec AppleApplicationSupport.msi

次にqaacをいれます。まずこちらからダウンロード。一番新しいもので大丈夫です。多分。私が見た時点では2.25が最新でした。

https://sites.google.com/site/qaacpage/cabinet

落としたら適当に解凍して~/.wine/drive_c/Program Files/とかに置きます。サブディレクトリのx86にだけqaac.exeがあります。

とりあえずwineで動くか試してみてください。

$ cd ~/.wine/drive_c/Program\ Files/qaac_2.25/x86
$ wine qaac.exe

それっぽいのが動いたら、今度はシェルスクリプトqaac.shを書いて、qaac.exeと同じ場所に置きます。

#! /bin/sh
wine $HOME/.wine/drive_c/Program\ Files/qaac_2.25/x86/qaac.exe "$@"

qaac.shのシンボリックリンクを/usr/bin/qaacとして貼って、権限を弄ります。

$ chmod 755 qaac.sh
# ln -s ~/.wine/drive_c/Program Files/qaac_2.25/x86/qaac.sh /usr/bin/qaac
# chmod 755 /usr/bin/qaac

これでシェルからqaacが使えるはずです。


続きます。→ abcdeでqaacを使ってリッピングする


[追記: 2013/12/12] 記事名を"Debianでqaacを使ってリッピングする その1"から変更しました。