恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

LANGに設定できる項目の一覧を調べる

X Windowを起動しないで作業することってありますよね。たとえば、ソフトウェアのアップデートしか行わない場合、ブラウザ等を開く必要はないので、白黒のコンソール画面で作業して終わりです。

こういう時、コンソール画面では日本語部分が文字化けして画面に表示されます。そこで、

LANG=C

として(英語表示にして)コンソールでの作業を行っています。

いつもはこれで話が終わるのですが、今日はコンソールでの作業が終わった後でブラウザで調べたいことが思い浮かんだので、startxでX Windowを起ち上げました。

すると、(当たり前ですが)ターミナルのロケール設定が「LANG=C」のままになっていました。そこで、LANGを日本語(UTF-8)にしようとしました。

その時、
LANGに指定できる項目の一覧を確認するにはどうするのかな?
という疑問が思い浮かびました。

そこで、manページを眺めたところ

-a, --all-locales
    Display a list of all  available  locales.
    The  -v  option causes  the  LC_IDENTIFICATION
    metadata about each locale to be included
    in the output.

という記述があったので

locale -a

を実行してみました。

自分の環境では、以下の一覧が表示されました。

C
C.UTF-8
POSIX
ja_JP.utf8


というわけで、以下のようにしてロケールを日本語(UTF-8)にしました。

LANG=ja_JP.utf8

i3wmを毎回同じレイアウトで起動する

Debianを起動して使うものは毎回ほぼ同じで、ターミナルを2つとGoogle Chromeです。普段は、これらを起動した後、画面の幅(横幅)のうち6割をChromeに割り当てるべく、Chromeの幅を調整しています。



しかし、PCを使っているのに同じ作業を人間が毎回手動でやるのはおかしいですよね。そこで、この作業を自動化することにしました。

現在はウィンドウマネージャとしてi3wmを使用しているので、i3wmのマニュアルを調べたところ、案の定、レイアウトを保存しておいて、起動時にそれを復元する方法が用意されていました。

情報源

https://i3wm.org/docs/layout-saving.html
もしくは
/usr/share/doc/i3-wm/

現在のレイアウトを保存する

最初の作業は、現在のレイアウトを保存することです。 デスクトップを普段使用する状態にして以下のコマンドを実行します。
(以下の実行例は、ワークスペース1を対象にしています。)

i3-save-tree --workspace 1 > ~/workspace-1.json


これで、ワークスペース1のレイアウト情報がworkspace-1.jsonファイルに保存されました。しかし、このファイルはこのままでは使用できません。少しだけ編集する必要があります。

レイアウト情報ファイルの編集

レイアウト情報ファイル(出力したworkspace-1.jsonファイル)の中には種々の項目が並んでいますが、ユーザーがチェックすべき項目は以下の4つです。

instance
class
title
window_role

(備考)このうちinstanceとclassは必須

初期状態ではこれらの項目がコメントになっているので各行の//を除去します(アンコメントします)。これで編集は終わりです。


終わりなのですが・・・、上記4項目に記述する内容を調べる方法を書いておきます。

xprop

というコマンドを実行するとマウスカーソルが十字になります。このカーソルで開いているウィンドウの1つをクリックします。するとターミナルに、そのウィンドウに関する情報が表示されます。

$ xprop
WM_WINDOW_ROLE(STRING) = "gimp-toolbox-color-dialog"
WM_CLASS(STRING) = "gimp-2.8", "Gimp-2.8"
_NET_WM_NAME(UTF8_STRING) = "Change Foreground Color"

(この出力例は「情報源」のページにあった例をコピペしたものです。)

出力例にある情報は、以下のように4項目に対応しています。

instanceは、WM_CLASSの1つ目の出力(出力例だとgimp-2.8)  
classは、WM_CLASSの2つ目の出力(出力例だとGimp-2.8)  
titleは、_NET_WM_NAME(出力例だとChange Foreground Color)  
window_roleは、WM_WINDOW_ROLE(出力例だとgimp-toolbox-color-dialog)  


レイアウトの復元設定

i3wmが起動時にレイアウト情報ファイルを読み込むように設定します。

まず、レイアウト情報ファイルを普段うっかり触らないように、i3wmの設定ファイルを置いているディレクトリに移動します。

mv workspace-1.json ~/.config/i3/


次に、

~/.config/i3/config

を開いて、ファイルの末尾に以下の行を加えました。

exec --no-startup-id "i3-msg 'workspace 1; append_layout ~/.config/i3/workspace-1.json'"

「これで作業は終わった」と思っていたのですが、i3wmを起動し直すと、ウィンドウ枠は復元されているものの、ソフトが起動していないことに気づきました。

私の場合、sakuraというターミナルを2つとGoogle Chromeを起動することになるので、~/.config/i3/configファイルの内容を以下のようにしました。

exec --no-startup-id sakura
exec --no-startup-id sakura
exec --no-startup-id google-chrome
exec --no-startup-id "i3-msg 'workspace 1; append_layout ~/.config/i3/workspace-1.json'"


念のために書いておくと、sakuraを2つ起動するのでsakuraに関する行が2行あります。わざと1行だけにすると(sakuraを1つしか起動しないと)下記画像のように左下の枠においてターミナルが起動していない状況になります。

追記

i3wmについて参考になりそうなウェブページを見つけた場合は、ここに追記していこうと思います。

i3wm(i3-gaps)の紹介およびトラブルシューティング | 点と接線。

シェルスクリプトを実行しようとすると「そのようなファイルやディレクトリはありません」と言われる

ある実験をするためにシェルスクリプトを書いたのですが、「そのようなファイルやディレクトリはありません」と言われてしまいました。

ネット検索をしてみると、よくある原因は改行コードがCRLFになっていること(CRが余計)らしいのですが、今回は違いました。

真犯人は「BOM」でした。

経緯

どんなスクリプトを書いても同じ結果になるので、以下のシンプルなスクリプトにして実験しました。

#!/bin/bash

echo "Hahaha!"

このスクリプトを「uho.sh」というファイルにして、実行したのですが

./uho.sh: 行 1: #!/bin/bash: そのようなファイルやディレクトリはありません

と表示されます。そこで、

cat -A uho.sh

としたら、

M-oM-;M-?#!/bin/bash$
$
echo "Hahaha!"$

と表示されました。

^M(CRを表す)は無く、$マークは「LF」なので、改行コードに問題はありません。しかし、1行目の#よりも前に謎の文字があります。

ネット情報によると、これはUTF-8の符号(BOM)とのこと。
そこで、スクリプトを書くのに使ったvimの設定ファイルを見たところ

set encoding=utf-8 bomb

という記述を見つけました。この行からbombを削除し、vimで同じスクリプトを書いたところ、普通にスクリプトが実行されました。

念のためcat -A を実行してみると、

#!/bin/bash$
$
echo "Hahaha!"$

となっておりました。めでたしめでたし。

(追記)
Apacheの設定ファイルで似たような目にあっている記事を見つけました。
https://think-t.hatenablog.com/entry/20100713/1279034152

ファイルだけ(ディレクトリだけ)をchmodする and umask

サブマシンで遊び始めてから少し経ちますが、作成したファイルのパーミッションが適切でないことに気づきました。

そこで、ファイルのパーミッションを600に、ディレクトリのパーミッションを700にしようかと

find . -type f -print | xargs chmod 600
find . -type d -print | xargs chmod 700

を実行したのですが、名前にスペースが入っているファイルやディレクトリに対する処理で「そんなファイルやディレクトリは無いでげす」と言われてしまいました。

原因は、xargsが「空白や改行」を区切りとして認識することです。よって、

Old patek

のようなスペースを含むディレクトリ名があった場合、「Old」と「patek」という別々のディレクトリとして処理されてしまいます。

そんなわけで、適切に処理を行うにはxargsが認識する区切り文字を変更する必要があります。

一般的な対応方法

Linuxを使っている人々の間で一般的なのは、区切り文字をヌル文字にする方法です。

たとえば、

xargs -0

とすると、xargsはヌル文字を区切り文字として認識します。

この場合、find側でも出力結果の区切り文字をヌル文字にする必要があるので、「-print0」を使って

find . -type f -print0 | xargs -0 chmod 600
find . -type d -print0 | xargs -0 chmod 700

のようにします。

別の対応方法

上記「一般的な対応方法」でも何ら問題は無いのですが、個人的にはfindの出力が行単位になっているのなら、xargsが改行だけを区切り文字と解釈してくれれば良いと思います。

そんなわけで、

find . -type d -print | xargs -d '\n' chmod 700

としても目的は達成できます。
この例では、xargsの後ろにある「-d '\n'」により、xargsは改行を区切り文字として認識します。

このやり方に問題があるとすれば、findの出力結果が「\n」ではない場合でしょうか。自分はDebianでしか実験していませんし、他のシステムのことを余り分かっていないのですが、もしも他のシステムで使われているfindの出力結果において、行末が「\n」以外のものになっていたら、この方法は破綻します。

umask(デフォルトパーミッションの設定)

今後の手間を省くために.bashrcに以下の記述を追加しておきました。

umask 0077


余談ですが、umaskの使い方を見るときはmanコマンドではなく

help umask

となります。

setfaclコマンド

umaskの他にsetfaclコマンドというものもパーミッションの制御に使えるようです(まだ詳細は調べていません、汗)。

rangerからhtmlファイルを開く時のブラウザをChromeにする

Debian上のファイルマネージャとしてrangerを使っているのですが、rangerからhtmlファイルを開いたところ、firefoxが起動しました。自分でそういう設定をした記憶はないのですが、私としてはGoogle Chromeでhtmlファイルを開きたいのでrangerの設定ファイルを少し変更しました。

rangerの設定ファイル変更

/usr/share/doc/ranger/config/rifle.conf.gz

を使います。

このファイルをホームディレクトリにコピーしてきて解凍します。

cp /usr/share/doc/ranger/config/rifle.conf.gz ~
gunzip rifle.conf.gz

解凍したファイルをrangerの設定フォルダに移動します。

mv rifle.conf ~/.config/ranger/

そして、rifle.confを開くと以下の記述があります。

(ここより上は省略)
ext x?html?, has opera,            X, flag f = opera -- "$@"
ext x?html?, has firefox,          X, flag f = firefox -- "$@"
ext x?html?, has seamonkey,        X, flag f = seamonkey -- "$@"
ext x?html?, has iceweasel,        X, flag f = iceweasel -- "$@"
ext x?html?, has chromium-browser, X, flag f = chromium-browser -- "$@"
ext x?html?, has chromium,         X, flag f = chromium -- "$@"
ext x?html?, has google-chrome,    X, flag f = google-chrome -- "$@"
ext x?html?, has epiphany,         X, flag f = epiphany -- "$@"
ext x?html?, has konqueror,        X, flag f = konqueror -- "$@"
(ここより下は省略)


実はちゃんとドキュメントを読んでいないのですが、「おそらく上に記述されているものが優先されるのだろう」と考えたので、google-chromeに関する行をfirefoxに関する行よりも上に移動しました。

(ここより上は省略)
ext x?html?, has opera,            X, flag f = opera -- "$@"
ext x?html?, has google-chrome,    X, flag f = google-chrome -- "$@"
ext x?html?, has firefox,          X, flag f = firefox -- "$@"
ext x?html?, has seamonkey,        X, flag f = seamonkey -- "$@"
ext x?html?, has iceweasel,        X, flag f = iceweasel -- "$@"
ext x?html?, has chromium-browser, X, flag f = chromium-browser -- "$@"
ext x?html?, has chromium,         X, flag f = chromium -- "$@"
ext x?html?, has epiphany,         X, flag f = epiphany -- "$@"
ext x?html?, has konqueror,        X, flag f = konqueror -- "$@"
(ここより下は省略)


そしてrangerからhtmlファイルを開いてみたら、無事にGoogle Chromeでhtmlファイルが開きました。

X Window System起動時にNumLockキーをONにする

ウィンドウマネージャ(i3wm)が起動した際にNumLockキーがオンになっていないことに気づきました。そこで、

setleds +num

を実行してみたところ、

setleds: Unable to read keyboard flags: デバイスに対する不適切なioctlです

と怒られてしまいました^^;。X Window内のターミナルエミュレータでsetledsは使えないようです。

そこで、解決方法を調べてみました。

参考にしたページ

https://wiki.archlinux.org/title/Activating_numlock_on_bootup

解決方法

上記「参考にしたページ」のstartxに関する部分を読むと

Install the numlockx package and add it to the ~/.xinitrc file before exec: 

という説明の後に、以下の記述例が書かれています。

#!/bin/sh
#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)
#

numlockx &

exec window_manager


つまり、

(1) numlockxというソフトをインストールする。
(2).xinitrcファイルにおいて、ウィンドウマネージャを起動する前にnumlockxが実行されるように記述する。

とすれば良いみたいです。

実行例

sudo apt install numlockx

を行ってから、ホームディレクトリにある.xinitrcを以下のようにしました。

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
fcitx &
numlockx &
i3

(下から2行目にnumlockxを記述)

最後に、X Windowを終了し再びX Windowを起動すると、NumLockがONになっていました。

i3wmのユーザーズガイド

サブマシンのDebianにi3wmをインストールしてあるので、i3wmのユーザーズガイドを読んでみました。丁寧に書かれていてよかったです(^^)。

i3wm User's Guide

https://i3wm.org/docs/userguide.html

もしくは
/usr/share/doc/i3-wmにあるuserguide.html