ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Xrandrで左側に外部モニタ設置

(2021-09-21 初稿 - )

職場で外部モニタの支給があった。職場のノートPC用の外部モニタなので、職場のノートだけで使うのが本来であるが、自分のノートPCも持ち込んで利用しているので、ときには外部モニタを利用しようと考えた。

接続は、職場ノートはUSB Type C、自前のノートはHDMIである。

各ノートの接続端子の向き等から、向かって左から「職場ノート」、「外部モニタ」、「自前ノート」に順に設置せざるを得なかった(本当は、逆の方が良かったのだが…)。

ここでは、Linux Debian 10.10がインストールされた自前ノートの外部モニタの設定について記述する。

何が問題か

筆者は、LXDE環境でDebianを使っており、メニューから「設定」、「モニタの設定」を開くと、外部モニタをノート画面の拡張とする場合、下の画面のとおり「右側」または「上」に配置するメニューはあるものの、「左側」に外部モニタを配置するメニューがない。

当初、我慢して実際には左側に外部モニタがあるのに右側の設定で使ってみたが、マウス等の操作において違和感が半端ない状態だった。^^;

ということで、ここではLXDEのモニタの設定のメニューにない、外部モニタを左側に設定する方法を記述する。

f:id:hymd3a:20210921154525p:plain

LXDEの「モニタの設定」のメニュー

以降の設定については、以下のページを参考にさせていただいた。多謝。

現状の確認

外部ディスプレイをHDMIケーブルで接続し、電源を入れてから以下のxrandrコマンドで現在の状態を確認する。

長々と出力されるが、ノートPCの元々のディスプレイは、LVDS-1と認識され、1366x768で現在表示されている。一方、外部ディスプレイは、HDMI-1として1920x1080で接続できると表示された。  

$ xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 309mm x 174mm
   1366x768      60.00*+
   1360x768      59.80    59.96  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   800x512       60.17  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   720x450       59.89  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   680x384       59.80    59.96  
   640x400       59.88    59.98  
   576x432       60.06  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  
   VGA-1 disconnected (normal left inverted right x axis y axis)
   HDMI-1 connected (normal left inverted right x axis y axis)
   1920x1080     60.00 +  74.97    50.00    59.94  
   1680x1050     59.88  
   1400x1050     59.95  
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1440x900      59.90  
   1280x800      59.91  
   1152x864      75.00  
   1280x720      60.00    50.00    59.94  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       75.00    60.00    59.94  
   720x400       70.08  
   DP-1 disconnected (normal left inverted right x axis y axis)

Xrandrによる設定

上記サイトを参考に、HDMI-1で接続した外部モニタを「左側」に配置するためには、ノート画面は外部モニタの「右側」すなわち「--right-of」をつければ良いらしい。

コマンド全体としては、以下のとおり。

xrandr --output LVDS-1 --auto --right-of HDMI-1

ちなみに、ノート画面を「下」でHDMI-1を「上」に配置するコマンドは、ノート画面は外部モニタの「下側」すなわち「below」となる。

xrandr --output LVDS-1 --auto --below HDMI-1

設定コマンドをスクリプト

設定方法はわかったが、すぐに忘れてしまうので、とり急ぎbashスクリプトにしてみた。

名前はsetmonとして、作成後、chmod +x setmonとして実行権を与える必要がある。

#!/usr/bin/env bash
xrandr --output LVDS-1 --auto --right-of HDMI-1さ

さて、ノートPCを自宅や職場等の異なるネットワーク環境で用いるのは、どうしたら良いのか?

少し考えたけど、難しかったので、筆者だったら、/etc/resolv.confを調べて、nameserverのアドレスで判定するか、無線LANだけで接続するならば、無線のSSID辺りで切換えるのが普通なのかな

head -1 /etc/resolv.conf
namesearver 192.168.11.1

無線のSSIDを確認して、設定する場合

# sudo でパスワード入力が面倒
sudo iwconfig | grep ESSID:
  or
# NetworkManagerがインストールされている場合 (Debian 11 以降)
nmcli dev | grep "接続済み"

また、何か気がついたら追記するね。

関連ページ

 

ノートPCのDebianを11(Bullseye)にアップグレード

(2021-09-18 初稿 - 2021-09-21 追記)

2021年8月14日(日本時間だと15日)にDebian 11 Bullseyeがリリースされたので、9月18日にわが家のノートPCにインストールした。ちょうど、台風14号が近づいていて、暇だったので…^^;

WiFi設定のところで、つまづいたので備忘録を残すよ。

アップグレードしたノートPCは、Acer Aspire ES1-131 という2015年くらいに発売され未だに使っている人いるの?みたいな化石仕様のノートPC。

使っているノートPCによって、対処方法が多少変更するかもしれないけど、概ね行けると思うので、困った場合は参考に。

f:id:hymd3a:20210918123410p:plain

Bullseyeインストール後のデスクトップ

アップグレードの準備

まずは、Debian公式の以下を参考にアップグレードの準備をする。

前述のとおり古いノートPCで特に複雑なことはしていないので、以下の手順で準備を進めた。

まずは、現在のDebianバージョンの確認

$ cat /etc/debian_version
10.10

古い設定ファイルを検索して削除

# find /etc -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.merge-error'

見つかったら、削除

# rm 見つかったファイル

パッケージの状態をチェック

# dpkg --audit

sorce-listファイルの編集

deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
# ★★★ securityの書き方が変わったので注意 ★★★
# 前の書き方
#deb http://security.debian.org/debian-security buster/updates main contrib non-free
#deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
# Bullseyeの書き方
deb http://deb.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://deb.debian.org/debian-security bullseye-security main contrib non-free

deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free

deb http://deb-multimedia.org bullseye main non-free
deb-src http://deb-multimedia.org bullseye main non-free

アップグレードの実行

# apt update
# apt upgrade --without-new-pkgs
# apt full-upgrade

ここまでは、とても順調に終わった。

WiFiの設定

上記のアップグレードは、いつものWiFiネットワークを使って行い、順調に終わったので再起動したら、WiFiにつながらない… (・・;) 

慌てて、有線LANに接続して以下のサイトを参照したら、Bullseyeからはこれまで使っていたWicdを利用しないようになったとのこと。

どおりで、今までネットワークを選択するアイコンがタスクトレイに表示されていない。上記サイトによると、今後はNetworkManagerで設定するのが一般的とのこと。

まずは、筆者のノートPCで起動時にどんなエラーがおきているのかチェック。

# dmesg | grep error
[    7.183863] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro
[    9.573266] r8169 0000:03:00.0: Direct firmware load for rtl_nic/rtl8168h-2.fw failed with error -2

やはり、realtekのネットワークドライバの読み込みに失敗してるみたい。

以下のサイトを見ると、ファームウェアがインストールされていないようなので、以下のrealtekfirmwareをインストール(本当に意味があるかわかない)。

$ apt search rtl8168h
ソート中... 完了
全文検索... 完了
firmware-realtek/stable,now 20210315-3 all
Binary firmware for Realtek wired/wifi/BT adapters

$ sudo apt install firmware-realtek

ドライバをインストール後、WiFiのみにして再起動しても変化なし。ただし、dmesgのエラーは消えた。

つづいて、再度有線LANに接続して、以下をインストール。

ちなみに、筆者はLデスクトップ環境としてLXDEを使っているけど、gnomeをインストールしたよ。

$ sudo apt install network-manager-gnome

インストール後、WiFiのみにして再起動したら、タスクトレイにNetwork Managerのアイコンが… ほっ (^^)

アイコンをクリックして、無事WiFiの設定ができたとさ…  めでたし、めでたし。

関連ページ

SHARP Sense4 Plus(SH-M16)で楽天モバイル

(2021-090-08 初稿 - 2021-09-21 追記)

前のスマホは2019年5月5日に変更したHuawei P20 Lite。2019年の九州バイクツーリングで故障したためだった。あれから2年と4ヶ月、ついにSharp Sense4 Plusに機種変更し、併せてキャリアもauから楽天モバイルに変更した。

楽天に変更したのは、契約が一つでわかりやすいことと、先に変更した子供達から薦められたのが大きな理由だ。

f:id:hymd3a:20210907190958j:plain

機種変更したAQUOS Sense4 Plus

良かった点(2021-09-08まで使って)

  • 料金が安い。

筆者の現在の利用は、職場と自宅ともにWiFiがあるため、通信量が1GB超えることがない。このため、通信量、さらに楽天Linkを利用すれば通話料も無料となる予定。

  • デザリングがオプション無しで利用できる。

現在はコロナ禍なので、車中泊やバイクツーリングに出掛けることは少ないが、auを利用していた時は、万が一のデザリングのために毎月500円を支払っていた。楽天では、オプション無しでデザリングできるのは、大きい。

  • 画面が大きくてもバッテリーの持ちが良い

小さい文字が見えにくいお年頃なので、大きな画面の機種を選択したが、画面が大きくてもバッテリーの持ちが良い。

  • ヌルヌルでスムーズな動き

画面表示がヌルヌルでスムーズな動きなので、操作にストレスがない。

このスマホのことだけではないが、モバイルを契約するとポイントが通常よりもたくさんもらえるので、楽天圏内で買い物をする場合はお得である。

 

残念な点(2021-09-08まで使って)

  • 楽天回線エリアが狭い

もっとも期待していたのはデザリングで、旅行先や山の畑で通信量を気にせずに使いたかったが、残念ながら山の畑は楽天回線エリアではなく、パートナー回線エリアだった。ネットでは、街中でも楽天回線エリアにつながらない場合もあるとの情報が散見されるので、楽天にはぜひとも回線エリア拡大に努めていただきたいところだ。

auのようにデザリングのために毎月500円よりもずっと良いが、山の畑ではLPWA等に挑戦してみようかな…

  • WiFiの切替がスムーズでない

WiFiの切替えがスムーズでない。フロア毎にWiFiの設定が異なる場合、なかなか最適な基地局を選んでくれない。Mesh WiFi等を導入すればよいが、必ずしも導入してもらえるとは限らない。

  • 本体がやや重い

本体重量が約200gで、胸ポケット等に入れるやや重い。^^;

 

Tips

たぶん、筆者だけわかっていなかった操作(ジェスチャー

操作性は、これまで使っていたHuaweiの方がわかりやすかったかな…

  • ホーム画面の表示

画面下から上へスワイプ

  • 一つ前の画面に戻る

画面左端または右端から中央に向かってスワイプ

  • アプリの使用履歴画面の表示

これがわからなかった。(^_^;)

画面したから真ん中までスワイプして、一度指を止める

  • 一つ前のアプリを表示

画面下から右端に向かってスワイプ

 

また、何かわかったら追記するね。

関連ページ

 

Bashの文字列演算子

(2021-08-25 初稿 - )

Bashの便利な置換演算子、使うたびに調べるのだけど、そのたびに忘れるのでメモ。

なお、この記述は、以下の本を参考にした。

  • 「入門bash 第2版」 ISBK-900900-78-8

パターン照合演算子

 例として、変数 path に /home/pi/calc/data/temp.2021-08-25.txt が代入されているものとする。

 表 パターン照合演算子

演算子 意味
${variable#pattern} variableの先頭からpatternまでの最も短い部分を削除
${var#/*/} pi/txt/data/temp.2021-08-25.txt
${variable#pattern} variableの先頭からpatternまでの最も長い部分を削除
${var##/*/} temp.2021-08-25.txt
${variable%pattern} variableの終わりからpatternまでの最も短い部分を削除
${var%.*} /home/pi/txt/data/temp.2021-08-25
${variable%%pattern} variableの終わりからpatternまでの最も長い部分を削除
${var%.*} /home/pi/txt/data/temp
${variable/pattern/string} variableの先頭からpatternまでの最も長い部分を置換
${var/txt/text} /home/pi/text/data/temp.2021-08-25.txt
${variable//pattern/string} variableの先頭からpatternまでの最も長い部分を複数置換
${var//txt/text} /home/pi/text/data/temp.2021-08-25.text

 

【例】ファイルの拡張子の一括変換 (*.txt ⇒ *.dat)

for f in *.txt; do mv $f ${f%.*}.dat; done

 

置換演算子

置換演算子は、文字列の一部を取り出す(スライス)くらいしか使ったことがないけど、便利そうなものもあるので、以下に示す。


演算子 置換内容
${var:-value} varがNULLの場合、valueを返す
  変数が定義されていない場合にデフォルトの値を返す
${cnt:-0} cntがNULLならば、0を返す
${var:=value} varがNULLの場合、valueを設定する
  cntがNULLならば、varに0を設定する
${cnt:=0} cntがNULLならば、cnt=0
${var:?message} varがNULLならば、messageを出力してスクリプトを終了
  変数が未定義の場合のエラーメッセージの出力
${cnt:?"Error"} cntがNULLならば、Error表示して終了
${var:+value} varが存在しNULLでない場合、valueを返す
  変数の存在を評価する
${cnt:+1} cntが未定義ならば、1を返す
${var:offset} offset以降の文字列を取り出す
var="abcdefg"  
${var:4} efg
${var:offset:length} offset以降のlengthの長さ文字列を取り出す
${var:4:2} ef
  offsetを0未満にすると末尾から取り出す
  ※マイナス記号の前に半角スペースを入れること
${var: -4:2} de
  lengthに-を指定すると後ろからの文字列
${var:1:-2} bcdef

関連ページ

 

sshの設定メモ

(2007-12-24 初稿 - 2021-08-25 転記・修正)

はじめに

このページは、DebianLinuxRaspberry Pi等でsshを利用するためのメモ。

sshは安全性が高くネットワークの端末を操作できる。

今更だが、Rapsberry用に書き換える部分があったので修正した。

インストール

Debianの場合

$ sudo apt install ssh

Raspberry Piの場合

以下の図のとおり、メニュー「設定」、「Raspberry Pi の設定」、「インターフェース」タブを選択して、「SSH:」の有効にチェックを入れる。

f:id:hymd3a:20210713141120p:plain

Raspberry Pisshサーバの起動

簡単な使い方

$ ssh -l user remote.example.com         # リモートホストにログイン
$ scp test.txt user@remote.examle.com:   # リモートホストにコピー

ローカルとリモートのユーザ名が同じ場合はuserは省略できる。

この段階では、パスワード入力によるログインになる。

パスフレーズによるログイン

パスワードよりも安全性が高いパスフレーズによるログインに変更する。

まずは、暗号鍵の作成をローカルホストで行う。

$ ssh-keygen -t rsa
Generating public/private rsa key pair
Enter file in which to save the key (/home/user/.ssh/id_rsa):
# 暗号鍵の保存場所 デフォルトのままで良いので Enter
Enter passphrase (empty for no passphrase):       # パスフレーズを入力
Enter passphrase again:                           # 確認のために再度同じパスフレーズを入力

なお、パスフレーズは空白(Enterのみ)でも、安全性は確保されるとのこと。

以上で、~/.ssh に id_rsa と id_rsa.pub が生成される。

できあがった id_rsa.pub をリモートホストにコピーすることにより、パスフレーズ認証ができるようになる。
debianRaspberry Piでは、便利なコマンドがあるので以下のように行う。

$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote.example.com

コピー後、パスフレーズでログインできれば設定は成功。

また、リモートホスト側でパスフレーズ認証しか用いない場合は、安全性を高めるために以下を行い、パスワード認証できないようにする。

$ sudo vi /etc/ssh/sshd_config
  PasswordAuthentication の yes を no へと変更する
$ sudo systemctl restart ssh    # sshの再起動

なお、ssh_configとsshd_configの2つファイルがあるが、今回変更するのは、サーバーとしての設定ファイル sshd_config なので、間違えないように。

さらに便利に

リモートホストのプログラムの実行やファイルのコピー等ができて、大変便利なsshだが、以下の設定ファイルを作成することにより、入力が減りさらに便利になる。

~/.ssh/configファイルがない場合は、新たに作成し、以下の内容を書き込む。

$ vi ~/.ssh/config
    host hoge                    # 覚えやすいホスト名のalias
    HostName remote.example.com
    User user                    # リモートホスト側のユーザー名

上記の設定を行った場合は、sshのログインは以下のように簡略になる。

ssh hoge

なお、.ssh/configファイルにはこの他にも多数の設定ができるので、詳細は man ssh_configで調べてね。

scpの使い方

sshがインストールされていれば、scpも簡単に使える。

scp ~/Downloads/* 192.168.1.1:~/Downloads

リモートホストの名前が解決できれば、以下のようにコピーすることもできる。

scp ~/Downloads/* remote-pc:~/Downloads

ただし、最近気がついたが、リモート側のファイルをワイルドカードで指定してコピーしようとするとエラーになり、「そんなファイルはありません」等と冷たいメッセージが返ってきてしまう。

そんなときには、以下のようにダブルクォートすると良い。

scp "remote-pc:~/Downloads/*" ~/Downloads

sshfs

sshを利用したネットワーク越しのマシンの安全なマウントができる。
筆者は、職場から自宅のマシンや職場内の他のPCをマウントして利用している。

sshfsのインストール

最初に、sshfsを設定する上で、参照させて頂いたサイトは以下のとおり。

debianubuntuともに、パッケージが用意されていますので、インストールは簡単。

sudo apt-get install sshfs

(fuse-utils と libfuse2 もインストールされる)

続いて、ユーザー名がhogeの場合は、以下のようにfuseグループに追加する。

sudo adduser hoge fuse

念のために、以下で自分のユーザ名がfuseグループに追加されているか確認する。

less /etc/group

fuse:x:hoge」のようになっていれば、大丈夫。

最後にマウント・ポイントを作成する。
筆者は、一般ユーザとしてマウントする場合は、自分のホームディレクトリにmntというディレクトリを作り、マウントするのが好み。

mkdir ~/mnt

一旦、ログアウトし、再ログイン。

sshfsの使い方

使い方も簡単である。

192.168.0.1のマシンのマウントは以下のようにする。

sshfs 192.168.0.1: ~/mnt

lsコマンドでリモートホストのファイルが見えるか、また、cpコマンドでコピーができるか確認する。

続いて、アンマウントの方法。

fusermount -u ~/mnt

使ってみると、想像していた以上に便利だ。

関連ページ

LANG=C って必要だね

(2021-08-23 初稿 - 2021-08-25 追記 )

前職場のサーバが停電の後に調子が悪いとのこと、応援要請に応じてメンテナンスに行ってきた。

サーバのOSはDebianで、LANG=ja_JP.UTF-8で運用しており、サーバ本体はDMZに配置され、ご丁寧にsshも切ってある環境。

ちなみに確認は、以下のとおり。

echo $LANG
ja.JP.UTF-8

今回の依頼は、「Xが立ち上がらなくなり、メッセージも文字化けして読めないので対処しようがない。」とのこと。仕方がないので、前職場に出向きエラー修復を試みた。

エラーの原因は、一時的にDNSが動作せずにaptが正常に完了しなかったことが原因。でも、最も困ったのは、サーバのディスプレイを見てもエラーメッセージが読めず、エラーの原因がつかめないことだった。

せめて、sshが使えればと思ったが、この状態では設定変更もままならず、お手上げ状態。

それでも、エラーの原因と思われることに対処しようと試みるが、全く歯が立たず。

格闘すること30分くらいして、「なんとか画面の文字化けを解消したい」と思い、ネットを検索。

ふと、「LANG=C 〇〇××」という記述を見て、「あっ、これだ」と気がついた。

# LANG=C apt update

おお、英語だけど「ちゃんとエラーメッセージが読める!!」。

ということで、LANG=ja_JP.UTF-8 等で利用しているサーバ等で、Xが立ち上がらなくなり、sshも使えない場合は、「LANG=C」が有効だという話。

関連ページ

Bashスクリプトの関数、引数、ローカル変数、戻り値について

(2021-08-11 初稿 - 2021-08-12 追記)

Bashスクリプトの関数や引数、ローカル変数、戻り値(返り値)、終了ステータス等のメモ。

Bashスクリプトの関数の定義

smp01() {        # または   function smp01(){
  echo "Hello"
}
smp01      # => Hello

引数

引数は、関数側で $1 から順番に複数受け取ることができる。

smp02() {
  echo "Hello" $1.
  echo $2
}

smp02 Hoge ”Nice to meet you."    #  => Hello Hoge. 
                                         Nice to meet you.

ローカル変数

Bashスクリプトでは、変数が原則グローバルなので、関数内ではlocalコマンドで、積極的にローカル変数を用いる。

smp03() {
  local sum
  sum=$(($1+$2))
  echo $sum
}
smp03 1 2    # => 3

終了ステータス

Bash関数のreturnは終了ステータスを返す。終了ステータスは0〜255の整数。

通常、0が正常終了

echo #?  # => 直前のコマンドの終了ステータス

値を返す(戻り値)

値を返す場合は、以下の2つの方法がある。

1. グローバル変数に代入

関数の独立性が保てなくなるので、短いスクリプト以外では使いたくない。

2. 関数内で標準出力(echo)

関数内で標準出力したものは、呼び出し側の変数に関数の戻り値となり代入される。

smp04() {
  local sum
  sum=$(($1+$2))
  echo $sum
}
total=$(smp04 1 2)   # または ``(バッククォート)
echo $total   # => 3

複数の戻り値を返したい時は、echoを複数回実行する。

sum05() {
  echo "abc"
  echo 3.14
  echo "def"
}
rtext=$(sum05)
echo $rtext   # => abc 3.14 def

上記のように、関数内で標準出力したものは、全て呼び出し側の変数に格納されてしまう点に注意。

また、それぞれの出力は、改行がスペースとなって連結される。

元のように改行して出力したい場合は、以下のようにする。

for str in $rtext; do
  echo $str
done

最近筆者が覚えたsetコマンドを用いると、配列のように好きな部分を取り出せる。

(setコマンド便利!!)

set $rtext
echo ${3}   # =>  def      # 戻り値は${1}から。  ${0}は実行コマンド

おわりに

Bashスクリプトは、慣れてくると短いコマンドで簡潔に記述できる点がすばらしい。

また、既存のLinuxコマンドを違和感なく使えるのもメリットだね。

関連ページ