Gnomeのスタートアップアプリケーションでxdotoolが動かなくなってたので対応した

ibus-mozcは起動時にIMEが有効になっているため、IMEを無効にするためにこの記事を参考にして対応している。具体的には、xdotoolで自動的にMuhenkanキーを押してもらうだけのシェルスクリプトを書いてGnomeのスタートアップアプリケーションに登録している。(自分はMuhenkanキーでIMEの無効化、HenkanキーでIMEの有効化をやってる)

#!/bin/bash

sleep 1
xdotool key Muhenkan
exit
[Desktop Entry]
Name=AutoStart
GenericName=Auto Start Script
Comment=no comment
Exec=/home/shallovv/.auto_start.sh
Icon=utilities-terminal
Terminal=true
Type=Application
StartupNotify=false

シェルスクリプト(.auto_start.sh)を${HOME}/に置いて、アプリケーションエントリ(autostart.desktop)を${HOME}/.config/autostart/に置いておく。

これをやっておくと非常に便利だったんだけど、最近になってうまく動作しないようになっていた。シェルスクリプトは実行されているようなんだけど、何故かIMEが無効にならず有効のままになっているのだ。地味に困るので、シェルスクリプトを以下のように書き換えて対応した。ちなみにGnomexdotoolのバージョンはこれ。

  • gnome-desktop 1:40.4-1
  • xdotool 3.20211022.1-1
#!/bin/bash

sleep 1
xdotool key a
xdotool key Muhenkan
xdotool key BackSpace
exit

動作としてはなにか文字を入力して、MuhenkanキーでIMEを無効化し、直前に入力した文字を最後に消す、ということをやっている。Gnomeの起動時はActivities Overviewになっていて、その状態で文字を入力するとGnome Searchに入力される。文字を入力する状態ならIMEの有効化/無効化が行えるようになるので、IMEを無効化し、余計な文字を消している。

これで、以前のようにGnomeの起動時にIMEの無効化を行えるようになったがなんで変わってしまったのだろう。多分Gnomeをアップデートした際の問題だと思うのだがよくわからん。

Arch LinuxとIntel Wi-Fi 6 AX200

前回のブログWi-Fiの通信が時間が立つと止まる点と、Bluetoothが使えない点について書いたわけだが、それについて一応解決できたのでメモしておく。

shallovv.hateblo.jp

環境

Wi-FIの通信が時間が立つと止まる

具体的にはPCを立ち上げて1時間くらいすると特定のWebページが見れなくなったり、pingが通らなくなることがある。見れなかったページは以下の通り。

1時間立っても見ることができるページもある。見れたページは以下の通り。

なんでこうなるのかわからなくてググっていたらWi-Fiモジュールが節電になっているのではないかといった記事がヒットしたので、節電しないように設定することにした。

解決しなかった方法たち

まず、iwconfigを使う方法。以下の方法で節電をしないようにできるらしい。

$ sudo pacman -S wireless_tools
$ iwconfig wlan0 power off

wlan0はそれぞれ読み替えてほしい。これでいいはずだが1時間立って確認してみるとページに接続できなかった。

次に、/etc/modprobe.d/iwlwifi.confを編集して節電しないように設定してみた。今回はIntelワイヤレスカードのため、この設定が使えるはず。ファイルの中身を以下のようにする。

# /etc/modprobe.d/iwlwifi.conf
options iwlwifi power_save = 0

しかし、この設定では解決しなかった。

次に、NetworkManagerの設定から省電力機能をオフにしてみた。/etc/NetworkManager/conf.d/wifi-powersave-off.confを以下のように編集する。

# /etc/NetworkManager/conf.d/wifi-powersave-off.conf
[connection]
wifi.power_save = 2

NetworkManagerを再起動してみると、ちゃんと設定が反映された。だが、問題の解決には至らない。

最後に、pm-powersaveで省電力設定をオフにした。以下のコマンドを実行する。

$ yay -S pm-utils
$ sudo pm-powersave false

だめです。原因は省電力設定ではないのか...

解決した方法

そういえばUbuntu 16.04くらいのとき、IPv6をオフにしないとネットにうまくつながらなかったことを思い出し、今回ももしかしてIPv6での通信をオフにしてIPv4で通信するようにすればいいのではないかと思ったのでやってみた。Gnomeの設定→Wi-Fi / ネットワーク一覧→アクセスポイント名の隣の歯車→IPv6IPv6メソッドを無効に変更。すると1時間立っても上記のページに接続できた。良かったです。

追記(2021-08-01)

解決したかと思えば再発したので、journalctlで目についたログを検索したらこの記事を見つけた。NetworkManagerのinternal dhcp clientが問題らしく、dhclientに変更したら問題のログがでなくなり、Wi-Fiの接続も安定した。

qiita.com

Bluetoothが使えない

これはいろいろやりすぎて何が解決策だったかはわからなくなっていしまった。一応書いておく。

Windows 10をインストールする

LinuxBluetoothが使えなくてイライラしてWindows 10をインストールした。しかし、WindowsでもBluetoothが認識されなくて途方に暮れた。だけど、検索したら解決策があったのでやってみたら認識された。

  1. IntelのページからWi-FiBluetoothの最新のドライバーをダウンロードする。
  2. ネットワークをオフにする。
  3. バイスマネージャから既存のドライバーをアンインストールする。
  4. ネットワークをオフにしたまま、ダウンロードしたドライバーをインストールする。
  5. 再起動する。

上記をやることでWidnowsでは無事認識された。めんどくさ... しかし、これでLinuxでも使えるわけでもないが何故か使えるようになった気がしたので(?)もう一度Archをインストールする。

SystemdでBluetoothを起動する

そもそもこれやってなかったのかって感じだが、やった。Windowsをインストールする前にもやった気がするが、覚えていないのでやってないことにする。

$ sudo systemctl enable bluetooth.service

なんとBluetoothが起動しました。良かったですね。

両問題が解決するまで、UbuntuWindowsとArchを何回もインストールしてしまい、いろいろと手順が曖昧になってしまったが、なんとかなった。

参考

PCを組んだ

Ryzen 5000とRX 6000でPCを組みたくなったので組んだ。

構成

パーツ 名称
CPU Ryzen 7 5800X
マザーボード MAG B550M MORTAR WIFI
GPU Red Devil AMD Radeon RX 6700XT 12GB GDDR6 AXRX 6700XT 12GBD6-3DHE/OC
SSD CSSD-M2B5GPG3VNF
メモリ AD4U3200716G22-D
CPUクーラー Celsius S36 BKO FD-WCU-CELSIUS-S36-BKO
電源 FOCUS-GM-850
ケース P101 Silent

CPUとGPUだけ決めてあとは適当に選んだ。

感想

初めてPCを組んだけどそんなに難しくはなかった。もともと研究室のPCを(勝手に)いじっていたこともあったのでどこに何を挿せばいいかはだいたいわかっていたからかも。まあ、マニュアル見ればどうってことはないのもある。SSDもM2だしSATAケーブルとかごちゃごちゃしなくて全体的に組みやすかった。

ただP101 Silentと360mm簡易水冷の取り付けは結構苦労した。フロント部分に取り付けるのだが、ラジエータのネジ穴とケースのネジを通す溝の開いてる間隔が結構ギリギリでしっかり位置決めをしないとうまく取り付けられなかった。あと、ラジエータ用のファンのケーブルの長さがギリギリなのでPWMの延長ケーブルを買ったほうが楽かもしれない。

OSはArchを入れている。xf86-video-amdgpuを入れればRX 6700 XTも認識されるしインストールはすんなり行けた。

デスクトップ環境はGnome 40。IMEGnomeと相性のいいibus-mozcを選択したが、yayでmozcをインストールするときにgtk2が依存関係になっていてビルド中にエラーを吐いていた。pacmanでgtk2を先にインストールしておいて、その後mozcをインストールし直したらうまく行った。

気になる点としては、Wi-Fi周りの動作がちょっと怪しい。アクセスポイントには接続しているが、時間が立つと通信が途切れてしまう。設定からWi-Fiをオフにして再度オンにすると普通につながる。

それとBluetoothが何故か認識しない。モジュールはIntel Wi-Fi 6 AX200。Kernel 5.13はサポートしているはずで、Wi-FiはOKなんだけどBluetoothは使えなくなっている。検索してみると他にも同じような症状の人がいるみたいだ。ドライバーのアップデートを待つしかないか。

実はArchの前にUbuntu 21.04をインストールしたが画面が乱れる現象が見られた。GPUのドライバー周りの影響か、Gnome 3.38の問題かはよくわからないけど。

というわけで、新しいPCを手に入れた。スペックは普段使いには完全にオーバースペックなのでどうしようか迷っている。SteamDeckが発売されるようでLinuxでもゲームする環境が整いつつある感じがする。なにかゲームでもやろうかと考えている。

LaTeXで文章をハイライトする

Beamerでスライドを作った時に文章をハイライトしたいなと思って色々調べたログ。

\colorboxコマンドを使う

color packageの\colorboxコマンドで文章の背景に色をつける。

\usepackage{color}

document環境に以下を記述。

\colorbox{yellow}{ハイライト}された文章

highlight_colorbox

TikZを使う

\tikzコマンドで文章のハイライトをやる。

\usepackage{tikz}
\usetikzlibrary{positioning}

document環境に以下を記述。

\tikz[baseline=(x.base)]{\node(x)[rectangle, fill={yellow}, rounded corners]{ハイライト};}された文章

highlight_tikz

rounded cornersでrectangleで指定した四角形の角を丸くできる。\newcommandでマクロにしておくと便利かも。

\newcommand{\tikzhl}[2]{\tikz[baseline=(x.base)]{\node(x)[rectangle, fill={#1}, rounded corners]{#2};}}

\tikzhl{yellow}{ハイライト}された文章

参考

PythonでiTunesの曲のカスタムの歌詞を全て消す

iTunesで曲の歌詞を表示するにはApple Musicに登録しているか、自分で歌詞を入力する必要があるみたい。

support.apple.com

数日前に何を考えたのか、歌詞が表示されるといいよなと思って実際に入れようとしたんだけど、iTunesにある1,126曲を全て手入力するのはいやだなって思った。そこでなんとか自動で歌詞を入れることができないか調べたら、Lyrics Masterってツールがあったのでとりあえず入れてみた。

www.kenichimaehashi.com

Lyrics MasterはiTunesと連携して、iTunes内にある曲に歌詞をつけてくれるんですよね、しかも自動で。わぁとっても便利ー。ってことでやってみたんですけど、歌詞が見つからない曲があったり、Instrumentalだけど歌詞が入ってしまったり、と自分が求めていたものと微妙に違くて途中で止めてしまった(適切な設定ができていなかっただけかも)。歌詞が入らなかったり、歌詞が間違っている曲を一つずつ修正していくのはめんどくさいし、間違ったまま放置しておくのは嫌だし、なんとなく歌詞が表示されればいいなー程度に考えていたため修正に対するモチベーションが低かった。なので、いっそのこと歌詞なんて表示されなくていいのではないかと思ってしまった。

歌詞は表示されなくてよくなったので、今回入力したカスタムの歌詞を消したい。しかし、中途半端に歌詞を入力してしまっているのでどの曲に歌詞が入力されているかわからない。なのでiTunes内にある全ての曲の歌詞を削除するPythonスクリプトを書いた。

mutagen

mp3とかのメタデータを書いたり消したりできるPythonモジュールのmutagenを使う。

mutagen.readthedocs.io

インストール

普通にpipでインストールする。

$ pip install mutagen

iTunes内の曲の歌詞を消す

実際にmutagenを使って、曲の歌詞を消していく。今回はiTunesにMP3とM4Aしかなかったので、それらに対応したものにした。ITUNES_MEDIA_PATHは"iTunes Media"フォルダの場所にしておく。iTunes > 環境設定 > 詳細 に書いてある。

from mutagen.mp3 import MP3
from mutagen.mp4 import MP4
from mutagen import MutagenError
import glob

ITUNES_MEDIA_PATH = 'iTunes Mediaフォルダの場所'

def delete_lyrics_in_mp3(path):
    try:
        tags = MP3(path)
        if 'USLT::eng' in tags:
            tags.pop('USLT::eng', None)
            tags.save()
    except MutagenError:
        pass

def delete_lyrics_in_m4a(path):
    try:
        tags = MP4(path)
        if '\xa9lyr' in tags:
            tags.pop('\xa9lyr', None)
            tags.save()
    except MutagenError:
        pass

if __name__ == '__main__':
    mp3_list = glob.glob(ITUNES_MEDIA_PATH + '/Music/**/*.mp3', recursive=True)
    m4a_list = glob.glob(ITUNES_MEDIA_PATH + '/Music/**/*.m4a', recursive=True)

    for i in mp3_list:
        delete_lyrics_in_mp3(i)

    for i in m4a_list:
        delete_lyrics_in_m4a(i)

mutagen.mp3.MP3()mutagen.mp4.MP4()メタデータを辞書形式で受け取り、歌詞の要素を削除するだけ。MP3ならUSLT::eng、MP4なら\xa9lyrとなっている。

ということで、iTunes内の曲のカスタムの歌詞をPythonで消すことができた。正直Lyrics Masterを使う時点でもう少し調べておく必要があったとしか思えない...

追記(2021-03-24)

poetryを使ってpackageにした。

github.com

参考

OpenConnectとocproxyを使ってみる

在籍している大学では学内ネットワークを外部からVPNで利用できたりする。学内だけで公開しているwebページをみたり、研究室のサーバを学内だけで公開してsshで接続したりとか、そんな感じにしか使っていないけど。

VPNを利用する際、GUIクライアントが用意されていることが多いし、MacWindowsでも標準でクライアントが付いてる。だけど、マシンが行なっている通信がすべてVPNを通して行われているのはなんかアレで。帯域が狭くなったりするし、本来の目的とは関係ない通信が管理者にわかってしまうし。

知人に「OpenConnectってツールがある」って聞いたので、OpenConnectとocproxyを使ってSOCKSプロキシ経由でVPNをやっていこうって感じの話です。

インストール

Homebrewでインストールできる。

$ brew install openconnect ocproxy

OpenConnect

www.infradead.org

CiscoのAnyConnect SSL VPNやJuniper SSL VPN(Pulse Connect Secure)、Palo Alto Networks GlobalProtect SSL VPNを非公式にサポートしているVPNクライアント。以下のような感じで利用できる。

$ openconnect https://vpn.mycampany.com

GUIでも利用できるみたいだけどGithubみたらArchivedになってた。

ocproxy

github.com

OpenConnectの通信をSOCKSプロキシ経由でポートフォワーディングしてくれるツール。指定したポート経由でVPNできるので、ホストの通信を分けたりできるので便利。例えばこんな感じで使うようだ。

$ openconnect --script-tun --script \
    "./ocproxy -L 2222:unix-host:22 -L 3389:win-host:3389 -D 11080" \
    vpn.example.com

SOCKSプロキシをlocalhost:11080にたてて、localhost:2222unix-host:22を、localhost:3389win-host:3389を割り当てている。この状態で、ssh localhost:22とすればunix-hostに接続できるし、リモートデスクトップクライアントでlocalhost:3389に繋げばwin-hostに接続できる。ブラウザの使うプロキシにlocalhost:11080を設定すれば、社内や学内専用のページをみることだってできる。

SOCKSプロキシ経由してなければVPNを通して通信されないので、YoutubeをみたりしてもVPNでの通信を圧迫しないし、管理者にも知られない。うーん、便利。

自分はこんな感じで利用している。大学で利用しているVPNがPulse Connect Secureなので--protocol=pulseで使いたいがなんか接続できない。代わりにJuniper SSL VPNで接続するために、--protocol=ncにしている。

$ openconnect --script-tun --script \
    "ocproxy -D 11080" \
    --protocol=nc https://vpn.hoge.ac.jp

Proxy SwitchyOmega

chrome.google.com

OpenConnectとかとは関係ないけど、便利なので紹介。ブラウザが利用するプロキシを管理したり、切り替えたりできるChrome拡張。いちいちMacのプロキシ設定やChromeのプロキシ設定をしなくてもよくなる。設定もダンプできるのでマシンを切り替えるときも設定ファイルをインポートすればすぐに使えるので便利。


というわけで、OpenConnectとocproxyでVPNという話でした。Pulse Connect Secureのクライアントは起動も少し遅いし、アップデートでこけたりしたので代替品が見つかってよかった。

LinuxでもGUIでPulse Connect Secureを使いたい

LinuxでもGUIでPulse Connect SecureによるSSL-VPN接続がしたいということで、OpenConnectとNetworkManagerでやったという話。 www.infradead.org

使用環境

  • Ubuntu 20.04 LTS
  • OpenConnect version v8.05-1

インストール

$ sudo apt install openconnect network-manager-openconnect network-manager-openconnect-gnome

使用方法

設定 → ネットワーク → VPN → "+" → Multi-protocol VPN client(openconnect) からVPNを追加。VPN ProtocolをPulse Connect Secureに設定するだけ。Juniper Network Connectでもいける。


CUIでもできるけどGUIでできた方がなんとなく楽な気がする。今はMacを使っていてクライアントがあるけど、将来的にまたLinuxを使うときに実用していきたいですね。