ござるのブログ

覚え書きいろいろ

Xfce on Arch Linux on Apple container

はじめに

Apple containerでmacOSにLinuxコンテナ環境を作る(ハンズオン)」によると、container machineで永続的なLinux環境をつくれるらしい。たまにLinuxのDesktopを使いたいことがあって、 UTM上のArch Linux ARMXfce Desktop Environmentを入れているのですが、container machinexrdpを入れて、Windows Appから繋げばいいのではと思ったので試してみました。なおXubuntuとかじゃなくArch Linux ARMなのは趣味です。

Apple containerのインストール

Apple containerのGitHub release pageからインストーラを入手できます。Homebrewでもインストールできます。私はHomebrewでインストールしました。

brew install container

インストール後、サービスを起動します。

container system start

ホストから[machine名].machineで接続できるように、DNSを設定します。

sudo container system dns create machine

container machineをつくる

以下のDockerfileを用意します。

# syntax=docker/dockerfile:1.7
FROM menci/archlinuxarm:base-devel

# Disable CheckSpace and DisableSandbox globally FIRST
RUN sed -i 's/^CheckSpace/#CheckSpace/' /etc/pacman.conf && \
  sed -i '/\[options\]/a DisableSandbox' /etc/pacman.conf

# Install utilities and development tools
RUN --mount=type=cache,target=/var/cache/pacman/pkg,sharing=locked \
  pacman -Syu --noconfirm --needed \
  systemd \
  openssh \
  iproute2 \
  iputils \
  curl \
  wget \
  vim \
  git \
  sudo \
  man-db \
  man-pages \
  xorg-server \
  xorg-xinit \
  xfce4 \
  xfce4-goodies \
  libfdk-aac \
  ffmpeg \
  fuse3 \
  x264 \
  pipewire \
  pipewire-pulse \
  wireplumber

# Build AUR packages as non-root user
RUN useradd -m builder && \
  echo 'builder ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/builder && \
  chmod 440 /etc/sudoers.d/builder

USER builder
WORKDIR /home/builder

RUN --mount=type=cache,target=/home/builder/.cache,sharing=locked \
  --mount=type=cache,target=/var/cache/pacman/pkg,sharing=locked \
  git clone --depth=1 https://aur.archlinux.org/xrdp.git && \
  cd xrdp && \
  makepkg -si --noconfirm --skippgpcheck && \
  cd .. && \
  git clone --depth=1 https://aur.archlinux.org/xorgxrdp.git && \
  cd xorgxrdp && \
  makepkg -si --noconfirm --skippgpcheck && \
  cd .. && \
  git clone --depth=1 https://aur.archlinux.org/pipewire-module-xrdp.git && \
  cd pipewire-module-xrdp && \
  sed -i '/^arch=/c\arch=("x86_64" "aarch64")' PKGBUILD && \
  makepkg -si --noconfirm --skippgpcheck

USER root
WORKDIR /

# Cleanup builder user
RUN userdel -r builder && \
  rm -f /etc/sudoers.d/builder

# Cleanup and systemd configuration
RUN systemctl set-default multi-user.target && \
  systemctl mask \
  sys-fs-fuse-connections.mount \
  systemd-remount-fs.service \
  dev-hugepages.mount && \
  systemctl enable xrdp && \
  systemctl --global enable pipewire.socket && \
  systemctl --global enable pipewire-pulse.socket && \
  pacman -Scc --noconfirm

RUN echo "exec startxfce4" > /etc/skel/.xinitrc

ENV container=docker
STOPSIGNAL SIGRTMIN+3
CMD ["/usr/lib/systemd/systemd"]

waynelloyd/apple-container-machine-archlinuxarmを参考にさせていただいた…というか、パクって必要なパッケージを追加しただけです。

buildします。

container build -t archlinux-xrdp .

buildが終わったら

container image list -v

とすると

NAME                TAG         INDEX DIGEST  OS     ARCH   VARIANT  FULL SIZE  CREATED                         MANIFEST DIGEST
archlinux-xrdp      latest      ee037736844a  linux  arm64           800.8 MB   2026-07-24T04:11:42.827675208Z  49510b6b525b
menci/archlinuxarm  base-devel  627d2d58ce9f  linux  arm64           392.6 MB   2026-07-19T07:10:28.648759071Z  4a3e2d4bf2fb

と表示されます。次に

container machine create archlinux-xrdp:latest -n archlinux

とすると、archlinuxという名前のcontainer machineがつくられます。

container machine list

とすると

NAME       CREATED              IP            CPUS  MEMORY  DISK  STATE    DEFAULT
archlinux  2026-07-24 12:26:33  192.168.64.2  4     12G     2.7G  running  *

と表示されると思います。IPcontainer machine起動の都度変わります。

Windows Appから接続

ユーザーのパスワードを設定します。

container machine run -n archlinux --root

で、container machineに入って

passwd [ユーザー名]

で、パスワードを設定します。

いよいよWindows Appから接続してみます。設定は以下のような感じです。

Windows Appの設定

PC nameIPを指定してもいいですが、毎回変わって面倒です。先にsudo container system dns create machineしておいたのでarchlinux.machineで接続できます。

接続するとこんな感じです。

Xfce Desktop

pipewireを入れたので音も出ます。

おわりに

Dockerfileに常用のパッケージを追加しておけば、いつもの環境がどこでも再現できて便利そうです。

参考

zenn.dev

github.com

各OSのPATHの初期値

はじめに

FreeBSD 10.1で

$ pkg install ctags

として、Exuberant Ctagsを入れたのに

$ ctags -R
ctags: illegal option -- R
usage: ctags [-BFTaduwvx] [-f tagsfile] file ...

と言われます。/usr/local/bin/ctagsではなく/usr/bin/ctagsが呼ばれていて、FreeBSDPATHの初期値が、Debianと違うことに今さら気付きました。以下、自分のためのメモです。

Debian Sidの場合

/etc/login.defsで設定。

ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

/usr/binよりも/usr/local/binが優先される。

OSX Yosemiteの場合

/etc/paths(と/etc/paths.d/)で設定

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

/usr/binよりも/usr/local/binが優先される。

FreeBSD 10.1の場合

/etc/login.confで設定

default:\
        :passwd_format=sha512:\
        :copyright=/etc/COPYRIGHT:\
        :welcome=/etc/motd:\
        :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
        :path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin ~/bin:\

/usr/local/binよりも/usr/binが優先される。

最後に

わかってないと地味にひっかかりそう…

Ruby/Tkで少しだけインタラクティブなグラフを表示する

はじめに

以前書いたように、Ruby/TkPlotchartでグラフを表示できるのですが、それだけではつまらないので、ちょっとだけマウスと連動させてみます。

コード

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'csv'
require 'tk'
require 'tkextlib/tcllib/plotchart'

# plotchart.rb を修正するモンキーパッチ
module Tk::Tcllib::Plotchart
  class XYPlot
    def pixel_to_coords(x, y)
      list(tk_call_without_enc('::Plotchart::pixelToCoords', @path, x, y))
    end
  end
end

# データを読み込み
en, cn = CSV.parse(DATA).map { |r| [r[0].to_f, r[1].to_i] }.transpose

# データをプロット
pl = Tk::Tcllib::Plotchart::XLogYPlot
     .new([0, en.size, 10**Math.log10(en.size).floor],
          [1, 10**Math.log10(cn.max).ceil],
          width: 600, height: 400) do
  title 'Spectrum'
  xtext 'Channel'
  ytext 'Counts/Channel'
  dataconfig('series1', color: :red)
  cn.each_with_index { |c, i| plot('series1', i, c) }
  pack(fill: :both)
end

# マウスカーソルの位置の値を表示
label = TkLabel.new.pack
pl.bind(:Motion, '%x %y') do |x, y|
  ch = pl.pixel_to_coords(x, y)[0].to_i
  if 0 <= ch && ch < en.size
    label.text(sprintf('%10d ch, %10.1f keV, %10d counts',
                       ch, en[ch], cn[ch]))
  end
end

# イベントループ
Tk.mainloop

__END__
32.78,1074
62.72,12131
92.70,13944
122.72,13110
152.79,11859
182.90,13204
213.05,11647
243.24,8780
273.47,7412
303.75,6632
334.07,6460
364.43,6369
394.83,6503
425.28,6566
455.76,5250
486.29,2766
516.86,1574
547.48,1062
578.13,914
608.83,3532
639.57,15018
670.35,18992
701.18,6495
732.04,660
762.95,177
793.90,157
824.89,134
855.93,154
887.00,131
918.12,124
949.28,129
980.48,113
1011.73,96
1043.01,103
1074.34,112
1105.72,92
1137.13,95
1168.58,86
1200.08,85
1231.62,66
1263.20,50
1294.83,29
1326.49,40
1358.20,33
1389.95,47
1421.74,93
1453.57,111
1485.45,67
1517.37,41
1549.33,19
1581.33,17
1613.38,11
1645.46,13
1677.59,18
1709.76,15
1741.98,10
1774.23,6
1806.53,13
1838.87,15
1871.25,11
1903.67,6
1936.14,8
1968.64,6
2001.20,8

実行結果

OSX Yosemiteで実行した結果です。下記のように、マウスカーソルの位置の値がグラフの下に表示されます。

f:id:gzalt:20141219145331g:plain

Ruby 2.2.0同梱のplotchart.rbのバグ

グラフ内におけるマウスカーソルの座標を取得するためにTk::Tcllib::Plotchart::XLogYPlot#pixel_to_coordsを使ったのですが、Ruby 2.2.0 同梱のplotchart.rbにはバグがあるので、下記のようにモンキーパッチを当てています。

module Tk::Tcllib::Plotchart
  class XYPlot
    def pixel_to_coords(x, y)
      list(tk_call_without_enc('::Plotchart::pixelToCoords', @path, x, y))
    end
  end
end

既に修正が本家に取り込まれたようなので、そのうち必要なくなると思います。

最後に

Ruby/TkPlotchartさえ入っていればWindowsでも動きます。しかし、WindowsPlotchartを使えるようにするまでがちょっと面倒でした(こちらに書きました)。

Ruby 2.2.0でRuby/TKを使えるようにするconfigureオプション

はじめに

rbenvruby-buildでそのままRuby 2.2.0を入れると、たいていRuby/Tkが使えないので、configureオプションを設定します。ちなみに、こちらのパッチは必要無くなったようです。

Debian SidやUbuntu 14.10 (64bit)の場合

$ apt-get install tk-dev
$ RUBY_CONFIGURE_OPTS="--with-tcltkversion=8.6 \
--with-tcl-lib=/usr/lib/x86_64-linux-gnu \
--with-tk-lib=/usr/lib/x86_64-linux-gnu \
--with-tcl-include=/usr/include/tcl8.6 \
--with-tk-include=/usr/include/tk8.6 \
--enable-pthread --enable-shared" \
rbenv install 2.2.0

FreeBSD 10.1の場合

$ pkg install tk86
$ RUBY_CONFIGURE_OPTS="--with-tcltkversion=86 \
--with-opt-dir=/usr/local \
--with-tcl-include=/usr/local/include/tcl8.6 \
--with-tk-include=/usr/local/include/tk8.6 \
--enable-pthread --enable-shared" \
rbenv install 2.2.0

最後に

WindowsRuby/Tkを使う場合は、こちらのサイトが大変参考になります。

Lubuntu 14.04のTcl/Tk 8.6とrbenvに入れたRuby 2.1.5でRuby/Tkを使う

はじめに

前の記事で「現時点でRuby/Tkは8.6には対応してない」と書いたばかりなのですが、こちらのサイトでパッチが公開されていて、Ruby/TkでTcl/Tk 8.6が使えます。(注: Ruby 2.2.0ではパッチが必要なくなったようです。こちらを参照のこと。12/02/15追記)

Tcl/Tk 8.6のインストール

apt-gettk-devをインストールするとtk8.6-devが入ります。

$ sudo apt-get install tk-dev

パッチを当てて、Ruby 2.1.5をビルド

こちらのサイトから、「Ruby-2.1.3 p242用パッチ」tk-diff-ruby-2.1.3-p242.gzを、ありがたくいただいてきます。2.1.3用となってますが、2.1.5でも問題無いようです。

ruby-buildにはパッチを当てる機能があるのですが、stripのレベルを指定できないようなので、今回はruby-buildを使いません。まず、Rubyの公式サイトから、Ruby 2.1.5のソースruby-2.1.5.tar.gzをダウンロードし、以下のようにパッチを当ててビルドします。

$ tar zxf ruby-2.1.5.tar.gz
$ cd ruby-2.1.5
$ zcat ../tk-diff-ruby-2.1.3-p242.gz | patch -p1
$ ./configure --prefix=$HOME/.rbenv/versions/2.1.5-tk8.6 \
--with-tcltkversion=8.6 \
--with-tcl-lib=/usr/lib/x86_64-linux-gnu \
--with-tk-lib=/usr/lib/x86_64-linux-gnu \
--with-tcl-include=/usr/include/tcl8.6 \
--with-tk-include=/usr/include/tcl8.6 \
--enable-pthread
$ make

ビルドが問題なく完了したら、インストールして有効化します。

$ make install
$ rbenv global 2.1.5-tk8.6
$ rbenv rehash

サンプルを動かしてみます。

$ ruby ext/tk/sample/cd_timer.rb 10

f:id:gzalt:20141123114741p:plain

うまく動きました。

最後に

記事のタイトルが長い…

Lubuntu 14.04にrbenvとruby-buildで入れたRuby 2.1.5でRuby/Tkを使う

はじめに

ちょっとした数値データを処理してグラフを表示するためにRuby Gnuplotを使っていたのですが、ここを見てRuby/Tkの素晴しさを知り、早速Lubuntu 14.04にrbenvruby-buildで入れたRuby 2.1.5でRuby/Tkを使おうとしたところ、環境構築にてこずりました。

Tcl/Tk 8.5のインストール

まず、Tcl/Tkをインストールします。apt-gettk-devをインストールするとtk8.6-devが入りますが、現時点でRuby/Tkは8.6には対応してないそうなので(注: パッチを当てると使えます。こちらを参照のこと。11/23/14追記)(注: Ruby 2.2.0ではパッチが必要なくなったようです。こちらを参照のこと。12/02/15追記)、以下のようにtk8.5-devを入れます。

$ sudo apt-get install tk8.5-dev

Ruby 2.1.5のインストール

次にRubyRuby/Tkrbenvruby-buildでインストールします。普通は

$ rbenv install 2.1.5

だけでいいと思うのですが、今回はこのままではTcl/Tkのヘッダやライブラリを認識せず、Ruby/Tkコンパイルされません。ここでだいぶ時間をロスしました。こちらのサイトでは、必要なライブラリにシンボリックリンクを張って対応しています。それでも良いと思いますが、/usr/libにパッケージシステム管理外のシンボリックリンクがあるのは何となく気持ち悪いので、以下のようにconfigueのオプションでどうにかします。32bitの場合はx86_64-linux-gnui386-linux-gnuなどに適宜変更してください。

$ RUBY_CONFIGURE_OPTS="--with-tcltkversion=8.5 \
--with-tcl-lib=/usr/lib/x86_64-linux-gnu \
--with-tk-lib=/usr/lib/x86_64-linux-gnu \
--with-tcl-include=/usr/include/tcl8.5 \
--with-tk-include=/usr/include/tcl8.5 \
--enable-pthread" rbenv install 2.1.5 -v
$ rbenv global 2.1.5
$ rbenv rehash

私の環境では、これでRuby/Tkがインストールされました。サンプルを動かしてみます。

$ ruby ext/tk/sample/24hr_clock.rb

f:id:gzalt:20141122154755p:plain

うまく動いているようです。

最後に

そもそも拡張TkパッケージPlotchartを使いたくてがんばっているわけですが、まだ使えていません。

$ sudo apt-get install tklib

という感じでPlotchartを入れたのですが、サンプルを実行すると下記のようにエラーになります。

$ ruby ext/tk/sample/tkextlib/tcllib/plotdemos1.rb
/home/gzalt/.rbenv/versions/2.1.5/lib/ruby/2.1.0/tk/package.rb:86:in `rescue in require': TkPackage attempt to provide package Plotchart 2.1.0 failed: package Plotchart 2.0.1 provided instead (RuntimeError)

道のりは長い…

Plotchartのバグ(23/11/14追記)

ここによると、どうもPlotchartのバグのようです。下記のように修正します。

--- /usr/share/tcltk/tklib0.6/plotchart/plotchart.tcl.orig   2013-03-14 17:01:30.000000000 +1100
+++ /usr/share/tcltk/tklib0.6/plotchart/plotchart.tcl 2014-11-23 19:11:59.456417506 +1100
@@ -2849,4 +2849,4 @@
 
 # Announce our presence
 #
-package provide Plotchart 2.0.1
+package provide Plotchart 2.1.0

サンプルを動かしてみます。

$ ruby ext/tk/sample/tkextlib/tcllib/xyplot.rb

f:id:gzalt:20141123172838p:plain

うまく表示されました。