2014年5月11日日曜日

redshiftでLinuxデスクトップの夜間のモニター輝度・色温度を調節する

正直歳をとったせいか、以前のようにモニターの輝度を上げると目が辛くなります。
特に夜間は若干色温度を下げたほうが目にはやさしいですね。
LinuxとWindowsでの双方動作するfluxというものがありますが、Linuxデスクトップでfluxを使用した場合には残念ながら時刻連携(日没後の輝度調整+色温度低下)が上手に動作しませんでした。
機能的にちょっと物足りなく見えますが、redshiftがうまく動作しましたのでこれをご紹介します。

例によってLinux Mint16で動作を確認してます。多分Debian系ならばパッケージは同じようにあるのではないかと思います。

  1. インストール
    まずはインストールです。Debian系の場合はredshihtgtk-redshift をインストールします。
    gtk-redshiftは機能としては大したことがありません(タスクバー経由でのredshift の入・切操作や、一時的な休止、ウィンドウマネージャ起動時のredshiftの自動起動を提供する)、が入れておいたほうがいいでしょう。
  2. 設定
    各ユーザの.config ディレクトリにredshift.conf ファイルを置くことにより、起動時にこれを読み込みします。
    redshift.conf ファイルはキーワードと値の間を=でつなぐ、一般的な普通のテキストファイルです。なお設定ファイルサンプルが/usr/share/doc/redshift/example-redshift.conf にありますが、少なくとも以下の通り記載する必要があります。ちなみにmanもありますが、manの通り記載しても動作しない場合がありました(Linux mint16の redshift1.7 付属のmanファイルの場合)。

    temp-day=****
    日中のディスプレイ色温度を指定します。****の部分に色温度を指定します。6000Kくらいがいいところでしょうか。

    temp-night=****
    夜間のディスプレイ色温度を指定します。上記と同じく****の部分に色温度を指定します。自分は蛍光灯くらいがいいので4200Kを指定しました。

    transition=0 もしくは 1
    manを直訳した感じでは変更出来るようにするという意味みたいですが、まぁ1にしておけばいいと思います。

    gamma=*.***:*.***:*.***
    ガンマ比を調整します。カンマで区切られた3種類の数値で色を指定します。前が赤、中間が緑、後ろが青です。通常は変える必要がないと思いますので、"1.000:1.000:1.000"で構わないでしょう。

    location-provider
    自分の場所を検知する方法を選択します。geoclue, gnome-clock, manual の3種類あるようです。Linux mintの場合、 geoclue・gnome-clockは何故か動作しないためmanual(手動で場所を指定)しかないようです。

    adjustment-method
    輝度・色温度を調整する方法を指定します。vidmodeとxrandrの2種類があるようです。最近のシステムならxrandrが適しているようです。

    brightness=*.*:*.*
    昼間・夜間の輝度を指定します。カンマの前が昼間の輝度、後ろが夜間の輝度です。

    lat=**.****
    緯度を指定します。

    lon=***.****
    経度を指定します。

    複数画面がある場合、screenを指定することでredshiftを有効する画面を指定出来るようです(ただし検証環境がないため不明)。
    以下に自分の設定で動作している設定ファイル貼り付けておきます。御自分で値は調整してみて下さい。もちろん、lat・lonはお住まいの場所に合わせてください。
    ; Global settings
    [redshift]
    temp-day=6000
    temp-night=4200
    transition=1
    gamma=1.000:1.000:1.000
    location-provider=manual
    adjustment-method=randr
    brightness=0.8:0.5
    ; The location provider and adjustment method settings
    ; are in their own sections.
    ; This is an example lat long for Portland, OR
    [manual]
    lat=43.0344
    lon=141.2116
    ; In this example screen 1 is adjusted by vidmode. Note
    ; that the numbering starts from 0, so this is actually
    ; the second screen.
    ;[vidmode]
    ;screen=1
  3. 動作確認
    仮想ターミナルでredshiftを実行し、夜間に輝度がちゃんと落ちるのを確認して下さい。
  4. gtk-redshiftの起動
    ログイン後仮想ターミナル上でgtk-redshiftを実行するか、自動起動するアプリケーションにgtk-redshiftを指定して下さい。これでログイン時にredshiftが有効になります。
    gtk-redshiftでは効果の切替をタスクバーで表示したアイコン経由で行うことが出来ます。

タイヤの真実について(その1)

今まで3回はLinux関連のネタを書いてきましたが、今回はクルマ関連ということでタイヤについて書きたいと思います。

この話、本当はタイヤメーカが書くべきなんでしょうけど、どこも書いてないし誤解を受けているのが非常に多いので。
元ネタは福野礼一郎氏の「超クルマはかくして作られる」から。これに書いてある内容はブリヂストンタイヤ製造部門のエラい方から聞き取りをした内容のため、ネットでよく書かれているものより真実でしょう。

まずは軽いところから
「タイヤは主に空気圧で車両重量を支えている」

当たり前の話だけど、ここが基本です。
わからない場合は風船2個に空気を詰め、それを棒の両端に付けたのを想像してみて下さい。
そして風船を2個とも床においてみたらどうなりますか?床に接している部分がタイヤ、手持ち棒が車軸と見立てることが出来ます。
風船の空気が完全に抜けている場合、棒は空中には浮いてませんよね。

既定の空気圧より不足している場合、タイヤの構造が車両重量の幾分かを支えている可能性があるということになります。
タイヤの寿命を考えた場合やメーカが保証している性能を100%発揮することを考えたら、空気圧はもっと気にするべきですよね。
外国車の場合は乗員や荷物の量に合わせて空気圧がいろいろ書いてある場合があります。国産車に比べ空気圧がクルマに与える影響が高いと判断しているのでしょう。
ちなみに空気圧が低い場合と高い場合はタイヤがその空気圧に耐えられるなら高いほうがちゃんと仕事をするそうです。これは「タイヤが主に空気圧で車両重量を支えている」ことから考えるとその通りです。

自分は最近になって知りましたが、XL規格のタイヤは明らかにインチアップで空気を入れる場所が減ってきた分を空気圧を上げることで対応しようと考えたものです。そうでなければ従来2.0〜2.2MPaでOKと言っていたものを、3.0MPa付近に設定しませんよね。
もしXL規格のタイヤが「空気圧に耐えられるだけの構造でタイヤを軽量化している」としたら、既定の空気圧より明らかに低い場合はタイヤの構造を壊すことになります(ここは自分の想像ですが)。

自分も若い頃、タイヤがパンクしていることを知らずに数十kmほど走り続けてサイドウォールが壊れてしまったことがあります。
という訳でタイヤの空気圧、もう少し良く確認しながら使ったほうがいいと思います。最低でも低過ぎにならないように空気を補充しましょう。

2014年3月4日火曜日

AudioQuest DragonFlyをLinuxで使用する。

USB-DACの超小型版、AudioQuest DragonFlyを購入してみました。
巷には24bit 96kHz出力可能なDACは幾つかあると思いますが、
これはUSBフラッシュ程度のサイズながら3.5mmフォーンプラグがあり
ヘッドフォンを十分駆動可能です。

さて、ここ見る人は上みたいな話はある程度知っているだろうから、
このくらいにして「果たしてどうやったら動くのか」ってのを検証します。

動作確認環境 Linux Mint 13・16

  • ハードウェアの認識確認
    さて、USBポートに接続してみます。
    lsmodでsnd_usb_audioが出てきたら、ハードウェアは認識されたということになります。
  • 音声出力デバイスの切替
    (Linux Mint16の場合について掲載します)。
    スピーカのアイコンを左クリックし、「サウンドの設定」を選択します。
    サウンドウィンドウの「出力」タブに「サウンドの出力」というリストが表示されていると思います。
    「アナログ出力
    Integrated Rate Matching Hub」という表示がDragonFlyです。
    これをクリックしてください。
    (挿入直後はスピーカのアイコンで表示されるメニューの「出力デバイス...」にはDragonFlyは表示されません)
  • 音量の調節方法
    いきなりヘッドフォンをつないで音を出すのはちょっと待ってください。PulseAudioで100%のボリウム設定の場合、凄まじくデカい音が鳴ります
    いろいろいじってみましたが、確実にボリウムを調整できるのは、実はalsamixerを使用する方法でした。
    端末でalsamixerと入力してください。
    その後、キャラクター表示でミキサーが表示されます。
    多分初期表示はPCの内蔵音源のミキサーが表示されると思います。焦らずにF6を押してください。
    画面中央にサウンドカードの選択メニューが開きます。
    AudioQuest DragonFlyを選択すると、ミキサーのボリウム表示が1本だけ中央に表示されると思います。
    あとは5%くらいから聞こえる音量の最適な部分を調節していきます。
  • DragonFlyでの最適な音量調節方法
    Alsaを使用すると、DragonFlyの特徴であるハードウェアボリウムで制御が可能になるようです。アプリ側のボリウム調整は最大にし、alsamixerで出力レベルを調整すると音質の劣化を防止できます。
  • トラブルシュート
    pulseaudioでintel HDA audio向けに24bit 96kHz出力の設定を行っている場合、DragonFly経由で音を鳴らそうとすると、ノイズが混じってまともにならない場合があります。
    この場合は~/.config/pulse/daemon.confの以下の部分を調節してください。
    resample-method = src-sinc-best-quality
    default-sample-format = s32le
    default-sample-rate = 96000
    alternate-sample-rate = 48000
    resample-method:pulseaudioでサンプリングレートを変換するアルゴリズムです。
    通常設定されているspeex-float-1はあまり良いアルゴリズムではないようなので、これを変更します。ただし、アルゴリズムを変更するとその分CPU負荷が増えます。
    default-sample-format:既定のデータ書式です。通常は16bit little-endianですが、32bit little-endianなどに変更可能です。
    default-sample-rate:既定のサンプリングレートです。通常は44.1kHzのはずですが、これでは96kHzに変更できます。
    alternate-sample-rate:既定以外のサンプリングレートです。通常は設定する必要がありませんが、うまく動作しない場合はこれを設定してみてください。

2014年2月20日木曜日

DKMSでカーネルモジュールを自動的に作成させる

 さて、昨日記載したHUAWEIのLinuxドライバーですが、今の状態だと新しいカーネルにアップグレードした際はもう一度全部インストールしなおさないとなりません。
 自分でカーネルモジュールのmakeをし、モジュールを既定のフォルダにインストールしてもいいのですが、せっかくDKMSって便利な仕組みがあるので、これを使ったほうがいいですよね。

1.DKMSとは

 DynamicKernelModulesSupportの略で、そのまま翻訳したとおりですね。でもそれでは解説にならないので説明しますと、ソースコードで配布されているカーネルドライバを新しいカーネルのアップデートに追従して自動的に生成してくれる仕組みです。

2.HUAWEIのNDISドライバをdkms化する

基本的には https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo こちらの説明のとおりにやっていくだけです。
 HUAWEIのLinuxドライバの場合、先のinstallスクリプトを見るとdriver/ndis_driver/ndis_src/
がそのままカーネルモジュールをmakeで行う場所になります。このフォルダの中身をそっくりdkmsで指定するフォルダに複写するわけです。
 dkmsのルールに従い、/usr/src配下にディレクトリを作成します。
 今回はパッケージ名をhw_cdc_driver、ドライバーバージョンは4.19.19.00です。
sudo mkdir /usr/src/hw_cdc_driver-4.19.19.00
cp -r driver/ndis_driver/ndis_src/* /usr/src/hw_cdc_driver-4.19.19.00

 しかし、dkmsが動作するにはもう一つ必要なものがあります。dkmsの設定ファル"dkms.conf"です。
 以下に引用で貼り付けますので、そのまま使ってみてください。dkms.confという名前で先に作成したフォルダにそのまま貼付けします。
PACKAGE_NAME="hw_cdc_driver"
PACKAGE_VERSION="4.19.19.00"
CLEAN="make clean"
BUILT_MODULE_LOCATION[0]="src/"
BUILT_MODULE_NAME[0]="hw_cdc_driver"
MAKE[0]="cd ${dkms_tree}/hw_cdc_driver/4.19.19.00/build; make KVER=${kernelver} modules"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="yes"
さて、準備が出来たところで、次からはdkmsのコマンドを入力していきます。まずはこのソースツリーをdkmsに追加します。
sudo dkms add -m hw_cdc_driver -v 4.19.19.00
成功したとメッセージがでたら、ツリーの追加が出来ました。
 次はdkmsで試しにメイクさせてみます。
sudo dkms make -m hw_cdc_driver -v 4.19.19.00
メイクが成功したら、モジュールをインストールしてみます。
sudo dkms install -m hw_cdc_driver -v 4.19.19.00
さて、これだけで後は新しいカーネルにアップデートした際に自動的に追従します。

3.特定のカーネルからモジュールを消す

以下のコマンドで出来ます。
sudo dkms uninstall -m hw_cdc_driver -v 4.19.19.00

4.DKMSから不要になったドライバを削除する

今回このモジュールが不要になった(別なPocketWifiに乗り換え)ので、削除するコマンドを調べました。
sudo dkms remove -m hw_cdc_driver

2014年2月19日水曜日

Linux Mint 13以降 (最近のDebian系) でPocket Wifi GL04Pをeth*として使用する

 さーて、自分のための備忘録も兼ねて、ふつーの人が使わないかもしれないけどちょっと使える情報を載せていこうと思う。
 ま、記載ペースは適当ってことで。毎日は続かないだろうけど、必要な人は見てください。
 んで第一回目はPocket Wifi GL04PをLinux Mint15以降(最近のDebian系)で使用する方法です。
 ふつーに使おうと思うんなら、PCにWifiが付いて入ればいいんでしょうけど、ここでお教えする方法は、WindowsやMacでは対応するんだけどLinuxでは提供されていない「USB経由でネットワークカードとして認識させる」方法です。
 この情報、他の場所にも載っていますが(Ubuntu 12.04で動作したという話、http://yutarommx.com/?p=433)、自分がLinux Mint 15以降で行おうと思った場合はひと手間加える必要がありました。
 また、HUAWEIのドライバをそのままインストールした際には、Debian系のinitデーモンスクリプトから見たら変な記述だったりしてちょっと不満なのでその当たりも変更する必要があります。

1.USB接続用のドライバの仕組み

さて、このGL04P、通常Linuxに接続するとCD-ROM以外は見えません。
 ここでこのルータにUSB端子経由でマジックコマンドを入力することにより、それがUSBネットワークデバイスであると変身させているのです。また、HUAWEIがNDISドライバを提供し、これによりネットワークデバイスとしても認識出来るようにします。
 そのために必要な仕組みはLinuxのディストリでも提供はされていますが(usb_modeswitch)、せっかくドライバをHUAWEIが提供しているのでそれを使います。

2.ドライバの入手

まず、以下の場所からドライバをダウンロードします。最新版は4.19.19.00です。
http://consumer.huawei.com/en/support/downloads/index.htm
Search Downloads By Keyword」 に"linux" と入力すると "HUAWEI Data Cards Linux Driver"が表示されると思います。
 次にこのZIPファイルを解凍します。tarボールが出るのでこれも解凍。

3.Debian系の場合のデーモンスクリプト修正

Readmeを読むとそのまま./installでインストールスクリプトが走りますが、ここで手間を加えます。
 最初はndis_driver/ndis_src/src にあるhw_cdc_driver.c の"dbg ("can't kmalloc dev");"をコメントアウトします。
 dbg関数が悪さをするらしく「ndis driverのMakeが出来ない」とググるとかなり引っかかります。

 次はskeletonファイルを以下のとおりに変更します。このファイル、インストール終了後はinitデーモンのスクリプトになりますが、このままの記述だとstopが正常に動作しません。

#!/bin/sh

# Copyright (c) 2008 Huawei Technologies, C
# All rights reserved.
#
# Authors: Franko Fang
#

### BEGIN INIT INFO
# Provides: HWActivator
# Required-Start: $syslog $local_fs
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: HWActivator daemon providing fxz
# Description: Start HWActivator to allow XY and provide YZ
# continued on second line by '#'
# should contain enough info for the runlevel editor
# to give admin some idea what this service does and
# what it's needed for ...
# (The Short-Description should already be a good hint.)
### END INIT INFO

HWAPP=CURPATH/driver/HWActivator
DAEMON=$HWAPP
NAME=HWActivator
PIDFILE=/var/run/HWActivator/$NAME.pid
DESC="Huawei Activator"
DAEMON_ARGS=".bin"

unset TMPDIR

test -x $HWAPP || { echo "$HWAPP not installed";
if [ "$1" = "stop" ]; then exit 0;
else exit 5; fi; }

. /lib/lsb/init-functions

case "$1" in
start)
log_begin_msg "Starting $DESC: $NAME"

#mkdir -p `dirname "$PIDFILE"`
start-stop-daemon --start --quiet --oknodo --background --exec $DAEMON -- $DAEMON_ARGS && success=1
log_end_msg $?
;;
stop)
log_begin_msg "Stopping $DESC: $NAME"
start-stop-daemon --stop --quiet --retry 2 --oknodo --name $NAME && success=1
log_end_msg $?
;;
restart)
log_begin_msg "Restarting $DESC: $NAME"
if start-stop-daemon --stop --quiet --retry 2 --oknodo --name $NAME; then
start-stop-daemon --start --quiet --oknodo --background --exec $DAEMON -- $DAEMON_ARGS && success=1
fi
log_end_msg $?
#$0 stop
#$0 start
;;
reload|force-reload)
log_begin_msg "Reloading $DESC: $NAME"
start-stop-daemon --stop --quiet --name $NAME --signal 1 && success=1
log_end_msg $?
;;
status)
echo -n "Status of $DESC: "
if start-stop-daemon --status --name $NAME; then
echo "$NAME is running."
exit 0
else
echo "$NAME is not running."
exit 1
fi

;;
*)
N=/etc/init.d/${0##*/}
echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
exit 1
;;
esac
#rc_exit

exit 0

4.インストーラへのデーモンスクリプト追加方法の修正(Debian系)


 あと、そのままのinstallスクリプトでは/etc/init*.dに強引にシンボリックリンクを貼る方法で実現しているため、Debian系のディストリの場合はここの記載事項を以下の通り直してしまいます。
 (元ファイルだと①265行目くらい"use command"のあたり〜280行目くらい"done"まで。②286行目くらい"if [ -f /etc/init.d/.depend.start ]; then"〜290行目くらい"fi"までです。もとのスクリプトはコメントアウトするか消してしまいましょう。)
① update-rc.d $CONFNAME defaults 99 1
②echo "update-rc.d -f $CONFNAME remove" >> "$INSTALL_PATH"/driver/Uninstall

 上の行はDebian系のデーモンを有効化するコマンド、下の行はUninstallスクリプトにupdate-rc.dでrunhuaweiactivatorを削除させるコマンドです。

5.スクリプトのインストール

さて、やっと準備が出来ました。後はsudoと共にinstallスクリプトを実行してください。標準では/usr/local/Mobile_Partnerにインストールされます。


6.モジュールの正常読込の確認+不要なドライバの除外

次に確認しないとならない事項は、lsmodコマンドでインストール後に正常にモジュールが読み込まれているかです。
 私が試した限りでは、以下の通りになっていないとeth*が追加されませんでした。
Module                  Size  Used by
option                 42468  0
usb_wwan               20380  1 option
usbserial              44667  2 option,usb_wwan
hw_cdc_driver          43815  0
mii                    13934  1 hw_cdc_driver
hw_cdc_driver以外にcdc_ncm・usbnetが追加された場合、正常に動作しません。 特にmiiの下にはhw_cdc_driver以外はあってはいけません。
このLinuxドライバではそのためにHWActivatorというプログラムがデーモンとして常駐し、USB挿抜時にいろいろお助けしてくれるようにはなっていますが、Linux Mint15以降のようにカーネルが比較的新しい場合には追従できていないです(cdc_wdmは消去するように記載されているようだ)。
この時動作を邪魔するものを/etc/modprobe.d/にブラックリストとして記載し、そのモジュールを読み込ませないようします。自分はblacklist-huawei.confというファイルを作成し、以下の通り記載しました。
blacklist cdc_ncm
blacklist usbnet

おそらく、cdc_ncmが読込されなければusbnetも上がってこないと思いますが一応念の為追加してます。
さて、多分これで再起動後にはちゃんと動作していると思います。NetworkManagerでもeth*が形成されれればDHCP経由でIPの設定がされますのでちゃんと動作します。


7.最後に

なぜWifiで動くのにこういうことやろうかと思ったきっかけは、PCにUSBで接続して充電しているとどうやら最近のカーネルの場合、ネット接続されないとPocketWifiの内部のファームを壊す可能性が非常に高い挙動が見受けられるためです(そのように使っていると、電源ボタンを押した際のシャットダウン→再起動がうまく動かない場合があり)。
 Wifiを使わないと周りの電波とも干渉しないし、便利ですしね。
 WindowsやMacにできてLinuxで動かないのも癪に障るし。
 あと、ここに紹介した方法、inidデーモンスクリプトの所以外はredhat系でも同じく有効だと思います。多分最近のカーネルではcdc_ncmが悪戯してこのhw_cdc_driverの動作を阻害するのでしょう。