2016年9月26日月曜日

Ubuntu16.04 ログイン時の音を消す方法

以下のファイルを編集して
/usr/share/glib-2.0/schemas/50_unity-greeter.gschema.override

以下の二行を追加する。

[com.canonical.unity-greeter]
play-ready-sound = false


その後以下のコマンドを実行する。
sudo glib-compile-schemas /usr/share/glib-2.0/schemas/


参考元には簡単なコマンドがある
http://askubuntu.com/questions/24946/how-do-i-disable-the-drum-beat-sound-on-the-login-screen

2016年8月27日土曜日

最新のMesaでUbuntuを更に快適に

Phoronixの記事に最新のMesaが紹介されていたので試してみました。

padokaさんが配布されており簡単に試すことができます。
sudo add-apt-repository ppa:paulo-miguel-dias/mesa
sudo apt-get update
これで更新が自動的に入ります。

さて感想ですが明らかに体感速度が向上しておりかなりおすすめです。素晴らしいです。

またこれとは別にKernel(intelのツリー)も最新版を導入しているのですがカーネル単体だと速度変化は体感できていません。

追記:あまり安定しておらずおすすめしかねます。

2016年8月14日日曜日

Linuxの常識 (Windowsとの違い)


/がルートフォルダ。 C:\みたいな感じ。
Linuxインストール時には/とswap用のパーティションを個別に作るのが普通
メモリが潤沢にあるならswapはなくても良い。
ファイルシステムはEXT4が標準的。Ubuntuなら後からNTFSも扱えるため移行も楽。
パスの区切りが/。
ディスクなどのデバイス自体は /dev/sdaや/dev/sdbなど。HDD、SSD、USBメモリなど
パーティションで区切られた部分は/dev/sda1や/dev/sda2など。C:\やD:\などに相当
パーティションを使用するときはマウントという操作を行う必要がある。
例えば/dev/sdb1を/media/memorystickなどに結びつける。GUIのファイラーを使えば自動でマウントされるのが普通。

ユーザーのフォルダは/home/ユーザー名/。 C:\Users\ユーザー名\に相当
このフォルダは~で表される。~/Documentsは /home/ユーザー名/Documentsに等しい。
隠しフォルダは . で始まる名前。
アプリケーションの設定ファイルなどは ~/.アプリ名などにあることが多い。
/ フォルダなどのファイルを変更するには管理者権限が必要なのでGUIファイラーも管理者権限で起動する必要がある。


アプリケーションの設定は メニューの編集(Edit) > 設定(Preferences)にあるのが普通。
アプリケーションのファイルの拡張子は付いていないことが普通。 firefoxがfirefox.exeに相当
テキストファイルもREADMEなど拡張子が付いていないことが多い。
アプリによってはマウスの中クリックがコピペに割り当てられていることがある。

Windowsのコマンドプロンプトに相当するのが端末(Terminal)でよく使うことになる。
Terminalの中身がBashと呼ばれるもの。
Terminalなどはコピーが Ctrl+Shift+C で貼り付けが Ctrl+Shift+V に割り当てられている。
Ctrl+Cは実行中のプログラムへ停止信号を送るのに使われる。
Ctrl+Rで過去のコマンドの履歴を検索できる。
Ctrl+Uでキャレットより前のコマンドを削除
Ctrl+Kでキャレットより後のコマンドを削除

コマンドには管理者権限が必要なものがあるので必要に応じてsudoを使う。
Bashのコマンドをまとめたスクリプトファイルの拡張子は.shが普通。
スクリプトファイルを実行するにはまず権限を付与することが必要になる。 chmod +x スクリプト
そして実行する際は./スクリプト.shなどとして ./ でカレントフォルダのファイルであることを明示する必要がある。
Linuxの文字コードはUTF-8が普通。昔はEUC-JPが普通だった。
改行はLFのみが普通。

アプリケーションは大量にパッケージ化されており、Windowsのように手動でダウンロード、解凍、インストールすると言った手間は普通いらない。
インストールはUbuntu系ならapt search アプリ名 で正式なパッケージ名を検索してから
sudo apt install パッケージ名 でインストールできる。
UbuntuのUbuntu SoftwareからGUIでメジャーなアプリをインストールすることもできる。

以下プログラマ向けの話
aptなどから導入したライブラリなどは /usr/include にヘッダファイル、 /usr/lib などにライブラリファイルが導入されることが多く、自分でビルドしてインストールされたものは /usr/local/include 、 /usr/local/lib などに導入される場合が多い。

2016年7月1日金曜日

Ubuntu+PulseAudioで音量にリミッターを掛ける

背景
日頃音量が小さいアプリに合わせてマスターボリュームも大きくなりがちになります。そこに音量が大きいアプリが最大音量で鳴れば耳を痛めてしまいます。そこで出力されるマスターボリュームにリミッターを掛けることにします。

方針
PulseAudioにリミッターのプラグインを読み込ませます。リミッターにはswh-plugins内のfastLookaheadLimiterを使用します。プラグインの規格はLADSPAです。

まずはswhプラグインを導入し
sudo apt install swh-plugins

ファイル ~/.pulse/default.pa を作成し以下のような内容にします。
.include /etc/pulse/default.pa

load-module module-ladspa-sink sink_name=limiter label=fastLookaheadLimiter  plugin=fast_lookahead_limiter_1913 control=0,-15,0.5
set-default-sink limiter

pluginはインストールされたsoファイルの名前です。
labelはそのファイル内で読み込むプラグインの名前です。
sink_nameは好きな名前をつけましょう。
controlの最初の引数は事前に音量を上げ下げするパラメータらしいですが0でいいでしょう。
次の引数がリミッターです。-15dBを設定してみました。
3番めの引数が音量を元に戻すまでの時間sです。長めでも大丈夫でしょう。0.01~2s

結果
きちんと動作しました。しかし音量変更時にノイズが乗ってしまいます。
このプラグインは5msの遅延が入るらしいですが体感できませんでした。

その他
default.paに記述しなくてもpacmdで直接試すことができます。
パラメータの範囲は直接ソースを見たほうが早いです リミッターは 0 ~ -20dBの範囲です。

https://gist.github.com/ion1/5890413
https://github.com/LMMS/lmms/blob/master/plugins/LadspaEffect/swh/fast_lookahead_limiter_1913.c
http://plugin.org.uk/ladspa-swh/docs/ladspa-swh.html#tth_sEc2.39

2020/10月頃から起動時にリミッターが読み込まれなくなりました。今は手動で pulseaudio -kD して読み込んでいる状態です。 

2022年 現在はxubuntuのSettings Session and Startup に pulseaudio -kD を登録してリセットしています。

新しいUbuntuは PulseAudio ではなく PipeWire を使うようになっているため EasyEffects のコンプレッサーを使うようにしました。こちらのほうがかんたんです 。

2016年6月26日日曜日

grepとbashとアスタリスク*

grep a* といった
grepのパターンに*が含まれているとgrepに渡す前にbashがワイルドカードと解釈してカレントディレクトリにあるファイル名に展開してしまうので期待道理に動かないよという話。
echo *を実行してみると理屈がよくわかると思う。
grep "a*" のように常に引用符で括る癖をgrepに限らずつけたほうが良い。

2016年6月16日木曜日

シェルスクリプトで文字列を結合する


How to concatenate strings in shell script?

input file: input.txt
foo
bar 

expected results: output.txt
foo_awesome
bar_awesome

STR=_awesome
cat input.txt | xargs -n1 -d'\n' printf "%s %s\n" $STR | awk '{printf "%s%s\n", $2, $1}' > output.txt

Isn't it awesome?
解説
catでファイル内容を読み込みその内容とSTR変数をxargsを使いprintfの引数として渡す。
つまりprintf "%s %s\n" _awesome fooが一番目に呼ばれることになる。空白を挟んで _awesome foo という行を作り出し標準出力している。本当はここで整形を済ませたいがprintfコマンドが引数の順序を指定できず自由度が低いためawkのprintfで本格的に整形している。そして標準出力をファイルにリダイレクトして完了。


2 string variables version.

expected results: output.txt
prefoo_awesome
prebar_awesome
STR2=pre 
STR=_awesome
cat input.txt | xargs -n1 -d'\n' printf "%s %s %s\n" $STR $STR2 | awk '{printf "%s%s%s\n", $2, $3, $1}'  > output.txt

Shell script commandの根本的な解説

シェルスクリプトのコマンドがわかりにくい一因はその入出力方法が分かりにくいからであり、それさえ理解できればあとはなんとかなります。コマンド自体はただのC言語などで書かれたプログラムであり入出力方法の数はプログラムで可能な数だけありうるのです。

よく使われる入力方法としては
標準入力
プログラム引数
ファイル
があり
出力方法としては
標準出力
標準エラー出力 (コマンドの成否を表すメッセージなど)
ファイル
プログラムの戻り値(整数で正常終了した場合は普通0が返される)
があります。 入出力ともにネットワーク、プロセス間通信 etc などがありえます。

では次のコマンドを例に解説していきます。
cat foo.txt | sort
まずcatコマンドの引数として foo.txt を入力しています。そしてcatコマンドはその引数を元にファイル内容を読み込み標準出力へと出力します。そして | パイプで接続され標準出力の内容が次のプログラムsortへ標準入力として渡されます。sortは引数がなければ標準入力の内容をソートして標準出力へと出力します。そしてsortの標準出力の内容はこの後に何も指定していないため画面へと出力されます。

次のように
cat foo.txt | sort > out.txt
> リダイレクトを使用することで標準出力の内容をファイルへと出力することができます。(この場合 out.txtはsortの引数として渡しているわけではありません。|や>はシェルの機能です。)

プログラム自体がファイルを直接出力するというパターンもあります。
gcc main.c -o app
gccコンパイラに引数としてmain.c -o appを渡しています。gccはmain.cファイルを読み込みコンパイルした内容をappという名前のファイルへ出力します。

さて入力方法としては引数と標準入力が主に使われていることがわかりました。またファイルとしての入力は引数でファイル名を指定して読み込むというパターンが多いこともわかりました。出力方法としては基本的に標準出力が使われていることもわかりました。標準出力は| パイプで接続すれば次の標準入力になることはわかりましたが、後続のコマンドの引数として入力するにはどうしたら良いのでしょうか。それにはxargsを使いましょう。

input.txt:
file1
file2
file3

cat input.txt | xargs cat

xargsは標準入力から渡された文字列をxargsの引数として渡されたcatの引数として呼び出します。つまりxargsは cat file1 file2 file3を呼び出します。catは複数のファイル名が引数として渡された場合はその内容を結合してから標準出力へ出力します。つまり上記コマンドはinput.txtに書かれているファイル名を読み込みそのファイル内容をすべて結合して画面に表示します。xargs -n1 catと指定すればcatに引数を最大1個だけ付加して呼び出します。つまりcat file1、cat file2、cat file3と3回に分けてcatが呼びだされます。catコマンドの場合は分割したところで出力結果は同じですが。

入力元出力先利用可能なコマンド
ファイル標準出力cat
引数標準出力echo、printf
標準入力引数xargs
ネットワークファイルwget
ネットワーク標準出力curl
入力元出力先シェルの機能
標準出力標準入力|
標準出力画面そのまま
標準エラー出力画面そのまま
標準出力ファイル>
標準エラー出力標準出力2>&1

引数の指定方法によって入力元や出力先を変化させることのできるコマンドはよくあります。
入力元出力先コマンド解説
標準入力標準出力grep パターン引数として渡したパターンを標準入力から検索し標準出力へ出力する
引数のファイル名標準出力grep パターン ファイル名引数として渡したパターンをファイルから検索し標準出力へ出力する

また多くのUNIXプログラムはファイル名を指定する部分に - を指定することでファイルの代わりに標準入力(または標準出力)を使用できます。
echo "int main(){}" | g++ -x c++ -