Sort by - committed date
-
CUI/ForEach-Objectでcontinue#PowerShell 結論 continue ではなく return 。 参考 https://yukimemi.github.io/post/2013-10-19-foreach_object_continue/ 1 余談 そもそも何の話かというと、PowerShellには、いわゆるforeach文とは別の、渡されたオブジェクトを順番に処理する ForEach-Object というものがある。 PowerShellでもforeach文であればcontinueで そのループを中断して次のループに移る という挙動をするのだが、ForEach-Object はそのつもりで continue と書くと、思ってたのと違う、となってしまう。 foreach文のcontinue相当の挙動は、returnと書かないと得られない、という話。 1参考というかただそのまま。
-
Gadget/DDJ-FLX6でDjayを使う時のマッピング変更#DJ やりたいこと djay proのNeural MixをDJコントローラから操作できるようにしたい。 前提 macOS版のみ。Windows版は触ったことがないから。 説明 マッピング変更の画面は、メニューの MIDI → コンフィグ DDJ-FLX6 か、Super + Y で呼び出す。 コンフィグ DDJ-FLX6 の部分は実際にその時繋げてるDJコントローラの型番とかが出る、はず。対応してないのはどう出るか不明。 DDJ-FLX6の、PAD MODE の中の一番右、 Shift + SAMPLER の SP.SCRATCH という機能は使ってないので、そのモードのパッドを使う。以下の命令にそれぞれの動作を割り当てる。 コントロール動作パート Note E8Neural Mix Solo (1)Drums Note F8Neural Mix Solo (2)Bass Note F#8Neural Mix Solo (3)Harmonic Note G8Neural Mix Solo (4)Vocals Note G#8Neural Mix Mute (1)Drums Note A8Neural Mix Mute (2)Bass Note A#8Neural Mix Mute (3)Harmonic Note B8Neural Mix Mute (4)Vocals デッキごとのチャンネルは以下(同じNoteでチャンネルが別の命令があったが詳細は分かってない)。 Deck1: Channel8 Deck2: Channel10 Deck3: Channel12 Deck4: Channel14 これらを設定することで、Neural Mix Solo はそのパートだけ鳴らす、Neural Mix Mute はそのパートだけ音を抜く、という動作がワンボタン(Shift + SAMPLERだから本当は二動作必要)でできるようになる。 余談 それぞれのパートの音量を弄ることもできるが、つまみが足りてないのでそれは割り当てずにソフトのUIをクリックやドラッグして操作している。 こういう機能が元々ハード側に付いてるっぽい機種もある。1 1モーターも付いててとてもいいけどとても高い。
-
CUI/現在のシェル名を取得#Shell #Linux #macOS 何で? プロンプトに出したいから。 結論 以下のコマンドで出る。 ps -p $$ | awk '$1~/'$$'/ { print $NF }' | sed -e "s/[^a-zA-Z]//g" 備忘録 元々は ${SHELL##*/} でログインシェルのフルパスの basename を取るようにしていた。もっと言うと、その前は echo ${SHELL} | sed -e "s:.*/::" としてた(結果は同じだけど不格好な書き方)。 ただ、これだとログインシェルではないシェルを実行した時に、その時実行しているシェルと違うものが出るようになってしまっていた。 ほとんど発生しないことではあるけど、ちょっと気持ち悪いので対応してみることにした。すぐ解決しないならやめることにして。 【Linux】現在使用しているシェルを確認する方法 #shell - Qiita こちらの記事の readlink "/proc/$$/exe" で解決かと思ったが、macOSには /proc がなかった。それだと多分だが、FreeBSDにもない。それをどこでも使えるものとして dotfiles に含めるのはちょっと嫌だったので、もう少し深掘り。 シェルの種類と確認方法:bash / zsh / fishを使いこなす | ミントジャムス ps -p $$ とすると、以下の情報が出る(この時のシェルは yash)。 PID TTY TIME CMD 56561 ttys000 0:00.27 -yash zsh だと以下。 PID TTY TIME CMD 64547 ttys000 0:00.08 zsh これで欲しいものは出た。 その中の不要なものを awk と sed で取り去ったものが以下。 ps -p $$ | awk '$1~/'$$'/ { print $NF }' | sed -e "s/[^a-zA-Z]//g" もっとスマートな解決法があれば、それに差し替えたい。
-
CUI/PowerShellのフィルタ処理速度#PowerShell 結論 Where-Object より Whereメソッドの方が早い。のを確認しようとしたけど、オブジェクトに対して -match するのが一番早い。 準備 System.IO.DirectoryInfo のメンバーを取得して、そこから BaseName をフィルタする。 $Object = Get-Item . | Get-Member $Measure = @() 以下の5ケース。 $Measure += Measure-Time -Expression { $Object | Where-Object { $_ -match "BaseName" } } -Name 'Where-Object' $Measure += Measure-Time -Expression { $Object | Where-Object { $_.Name -match "BaseName" } } -Name 'Where-Object(Name)' $Measure += Measure-Time -Expression { $Object.Where({ $_ -match "BaseName" }) } -Name '.where' $Measure += Measure-Time -Expression { $Object.Where({ $_.Name -match "BaseName" }) } -Name '.where(Name)' $Measure += Measure-Time -Expression { $Object -match 'BaseName' } -Name '-match' それぞれのケースが同じ結果を得られることの確認。 > $Object | Where-Object { $_ -match "BaseName" } TypeName: System.IO.DirectoryInfo Name MemberType Definition ---- ---------- ---------- BaseName ScriptProperty System.Object BaseName {get=$this.Name;} > $Object | Where-Object { $_.Name -match "BaseName" } TypeName: System.IO.DirectoryInfo Name MemberType Definition ---- ---------- ---------- BaseName ScriptProperty System.Object BaseName {get=$this.Name;} > $Object.Where({ $_ -match "BaseName" }) TypeName: System.IO.DirectoryInfo Name MemberType Definition ---- ---------- ---------- BaseName ScriptProperty System.Object BaseName {get=$this.Name;} > $Object.Where({ $_.Name -match "BaseName" }) TypeName: System.IO.DirectoryInfo Name MemberType Definition ---- ---------- ---------- BaseName ScriptProperty System.Object BaseName {get=$this.Name;} > $Object -match 'BaseName' TypeName: System.IO.DirectoryInfo Name MemberType Definition ---- ---------- ---------- BaseName ScriptProperty System.Object BaseName {get=$this.Name;} これは得られる結果が異なるのでケースには含めない。 > $Object.Name -match "BaseName" BaseName 結果 > $Measure | ft Name Count Average Maximum Minimum StandardDeviation ---- ----- ------- ------- ------- ----------------- Where-Object 10000 0.17 3.62 0.13 0.12 Where-Object(Name) 10000 0.16 6.25 0.12 0.12 .where 10000 0.05 3.77 0.04 0.06 .where(Name) 10000 0.04 3.44 0.03 0.05 -match 10000 0.01 1.91 0.01 0.02 Nameの指定はしなくても同じ結果が得られるのは、そういう仕様かもしれない。他のプロパティに対してだとできなかった。 速度も指定ありなしで有意な差はなし。 Measure-Time関数 Measure-Commandのラッパー。 function Measure-Time { param( [scriptblock]$Expression, [int]$Count = 10000, [string]$Name ) $array = @() foreach ($i in (1..$Count)) { $array += (Measure-Command -Expression $Expression).TotalMilliseconds } return $array | Measure-Object -AllStats | Select-Object @{N = "Name"; e = { $Name } }, Count, Average, Maximum, Minimum, StandardDeviation }
-
CUI/Gitコマンドメモ#git add後にdiffする git diff --cached
-
OS/QEMUでGuixのVMを作る#Deploy #Linux #Guix VM作成 proxmoxのホストで実施 doas /sbin/qm create 101 --name guix --memory 2048 --cores 2 --net0 virtio,bridge=vmbr1 --ostype l26 --scsihw virtio-scsi-pci doas /sbin/qm set 101 --serial0 socket doas /sbin/qm set 101 --ide2 local:iso/guix-system-install-1.4.0.x86_64-linux.iso,media=cdrom doas /sbin/qm set 101 --scsi0 local-lvm:vm-101-disk-0 doas /sbin/qm set 101 --boot order=scsi0 doas /sbin/qm start 101 Guix インストール インストーラを起動して、CUIインストールを選ぶ。 ネットワーク設定 Guix はインストール時にネットワーク接続が必須のため、外に接続するための設定が必要になった。 DHCPで変なアドレスを設定しようとするので、無効にして適切な設定を入れる。 herd stop networking ip l set dev eth0 down ip a flush dev eth0 ip r flush dev eth0 ip a add 10.10.10.2/24 dev eth0 ip l set dev eth0 up ip r add default via 10.10.10.1 CloudflareのDNSサーバをネームサーバに指定。 cat << _EOF_ > /etc/resolv.conf nameserver 1.1.1.1 nameserver 1.0.0.1 _EOF_ パーティション cfdisk がTUIなのでログが残せない。 /dev/sda1 を /boot、/dev/sda2 を swap、/dev/sda3 を / に割り当て インストール中は、/dev/sda3 を /mnt にマウントする cfdisk parted /dev/sda set 1 esp on mkfs.fat -F32 /dev/sda1 mkfs.ext4 -L root /dev/sda3 mount LABEL=root /mnt mkswap /dev/sda2 swapon /dev/sda2 インストール /dev/sda3 に config.scm を配置 mkdir /mnt/etc cp -p /etc/configuration/bare-bones.scm /mnt/etc/config.scm vi /mnt/etc/config.scm VMのSCSIディスク用設定を追加 (initrd-modules (append (list "virtio_scsi") %base-initrd-modules)) 書き込み先を /mnt に変更 herd start cow-store /mnt config.scm に基づいてインストール実行 guix system init /mnt/etc/config.scm /mnt
-
OS/古いiMacにproxmoxを入れた記録#Deploy #Linux #proxmox 初期設定 sshd /etc/sshd_config は触らず、/etc/ssh/sshd_config.d に confg を置いて必要なパラメータを上書きする。 標準ポートにしないなら、 ${SSHD_PORT} には、ssh用のポート番号を入れておく。 cat <<_EOF_ > /etc/ssh/sshd_config.d/10-proxmox.conf PermitRootLogin no PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no KbdInteractiveAuthentication no Port ${SSHD_PORT:-22} _EOF_ サービス再起動が必要。 systemctl restart sshd 管理用ユーザ追加 rootで運用前提なのかインストール時にユーザが作られないので自分で作る。 wheelグループがないので作る。 ${NEWUSER} には、ユーザ名を入れておく。 addgroup --system wheel useradd ${NEWUSER} -G wheel -m -d /home/${NEWUSER} doas OpenBSDで採用されてる軽量 sudo 的コマンド。 これを入れても sudo が捨てられるわけではないのであまり意味はない。 wheelグループのみ使用を許可する設定をする。 apt install doas -y echo 'permit persist :wheel' >> /etc/doas.conf doas -C /etc/doas.conf chmod 400 /etc/doas.conf 以降、基本的に前項で作った管理用ユーザでログインし直す。 ファイアウォール Proxmoxの操作コマンドである pvesh で設定する。 ufw を入れる手順ばかりだったが、折角専用ツールがあるのだからと使う。 ${INTERNAL_NETWORK} は 192.168.1.0/24 というような形式でLANのネットワークアドレスを入れておく。 doas pvesh create /cluster/firewall/ipset --name management doas pvesh create /cluster/firewall/ipset/management --cidr ${INTERNAL_NETWORK} --comment 'Local Network' LAN以外は全部ブロックする。 doas pvesh set /cluster/firewall/options --enable 1 --policy_in DROP doas pvesh create /cluster/firewall/rules --action ACCEPT --type in --source +management --enable 1 --comment 'Allow Management LAN Access' サービス再起動が必要。 doas systemctl restart pve-firewall cloudflaredインストール 安全に外から接続するために入れる。 公式の手順に従う。 ${CLOUDFLARED_TOKEN} には、トンネル作成時に表示されたトークンを入れる。 mkdir -p --mode=0755 /usr/share/keyrings curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' | tee /etc/apt/sources.list.d/cloudflared.list apt update apt install cloudflared cloudflared service install ${CLOUDFLARED_TOKEN} ターミナル環境整備 gitインストール homebrew に必要だったので入れる。 homebrew は eza と yash のために必要。 doas apt install git -y homebrewインストール /home 配下に homebrew 用ディレクトリを作る。 doas mkdir -p /home/linuxbrew/.linuxbrew doas chown -R 1000:1000 /home/linuxbrew 公式の手順に従う。 cd /home/linuxbrew curl -L https://github.com/Homebrew/brew/tarball/main | tar xz --strip-components 1 -C .linuxbrew eval "$(.linuxbrew/bin/brew shellenv)" brew update --force --quiet chmod -R go-w "$(brew --prefix)/share/zsh" yashインストール POSIX準拠モードという素敵なモードがあるシェル。 なんとなく使ってただけの zsh よりも軽い気がする。 brew install yash ログインシェルにする。 echo "/home/linuxbrew/.linuxbrew/bin/yash" | doas tee -a /etc/shells chsh -s /home/linuxbrew/.linuxbrew/bin/yash .yashrc をサンプルからコピー。 cp -p /home/linuxbrew/.linuxbrew/Cellar/yash/2.60/share/yash/initialization/sample ~/.yashrc .yashrc に homebrew 用の設定を追記する。 cat <<_EOF_ >> .yashrc # homebrew if test -e /home/linuxbrew/.linuxbrew/bin/brew; then eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" fi _EOF_ ezaインストール rust製 ls 互換コマンド。 これの表示に慣れたので、標準の ls だと落ち着かないだけで有効活用はできていない。 brew install eza .yashrc に ls として振る舞うためのエイリアスを追加。 cat <<_EOF_ >> .yashrc # eza which eza > /dev/null 2>&1 && alias ls='eza -g' _EOF_ proxmoxの設定 WebUIのサブスクリプション通知メッセージ抑止 via https://qiita.com/flathill/items/01321c48bdf8022fa37e 616行目辺りのIF文を修正した。 vi /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js メール抑止 システムから送られてくるメールの通知がターミナルに出るのを抑止。 postfix のサービスを停止。 doas systemctl stop postfix doas systemctl disable postfix ログインメッセージ抑止 doas rm /etc/motd doas rm /etc/issue ディスプレイ表示のタイムアウト設定 GRUB_CMDLINE_LINUX_DEFAULT の末尾に consoleblank=5 nomodeset video=efifb を追加。 vi /etc/default/grub 変更を適用して再起動 update-grub reboot ただし、実際には反映されておらず、ディスプレイは付きっぱなし。 VM関係 VM用内部ネットワーク作成 LANとは隔離したVM用ネットワークを作る。 proxmoxの機能ではなく、Linuxの仮想NICを作るだけ。 cat << _EOF_ | doas tee -a /etc/network/interfaces auto vmbr1 iface vmbr1 inet static address 10.10.10.1/24 bridge-ports none bridge-stp off bridge-fd 0 _EOF_ サービス再起動で反映。 systemctl restart networking NAT設定 VM用ネットワークをNATで外部に繋げる。 外からは直接繋がらず、VMからは外に繋がる。 echo '1' | doas tee /proc/sys/net/ipv4/ip_forward > /dev/null echo 'net.ipv4.ip_forward = 1' | doas tee /etc/sysctl.d/99-ip-forward.conf > /dev/null doas sysctl -p /etc/sysctl.d/99-ip-forward.conf doas iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE doas apt install iptables-persistent doas netfilter-persistent save doas netfilter-persistent reload サービス再起動で反映。 doas systemctl restart pveproxy doas systemctl restart pvedaemon dnsmasq追加・無効化 必要があったので入れたはずだが、どうして無効にしたのかは憶えてない。 doas apt install -y dnsmasq doas systemctl stop dnsmasq doas systemctl disable dnsmasq
-
OS/wslでのArchLinuxセットアップ#Setup #WSL #Linux #Arch Linux インストール ここだけはWindows側のPowerShellで実施。 wsl --install archlinux 初期設定 以降はArch Linuxで実施。 rootパスワード変更 多分何も設定されてないので、いの一番に何か設定する。 passwd システムアップデート 必ず何らかのアップデートはあるので、とにかく真っ先にやる。 pacman -Syu 最低限のパッケージ追加 パッケージを追加するための base-devel パッケージのソースや dotfiles を持ってくるための git エディタの neovim pacman -S --noconfirm base-devel git neovim pacmanの設定 Color のコメントアウトを外す。 [options] 配下に ILoveCandy を追加する。 パッケージインストールのインジケータがパワーエサを食べるパックマンになるだけ。 nvim /etc/pacman.conf sudoersの設定 %wheel ALL=(ALL:ALL) ALL の行のコメントアウトを外す。 nvim /etc/sudoers ユーザ追加 ${NEWUSER} には、ユーザ名を入れておく。 groupadd -g 1000 ${NEWUSER} useradd -d /home/${NEWUSER} -g 1000 -u 1000 -G wheel -s /usr/bin/bash -m ${NEWUSER} WSL でのデフォルトユーザとして指定する。 cat <<_EOF_ >> /etc/wsl.conf [user] default=${NEWUSER} _EOF_ 強いパスワードを設定。 passwd ${NEWUSER} doas OpenBSDで採用されてる軽量 sudo 的コマンド。 これを入れても sudo が捨てられるわけではないのであまり意味はない。 wheelグループのみ使用を許可する設定をする。 pacman -S --noconfirm doas echo 'permit persist :wheel' >> /etc/doas.conf doas -C /etc/doas.conf chmod 400 /etc/doas.conf 再起動 一旦WSLから抜ける。 exit Windows側から、Archの再起動を実施する。 wsl -t archlinux パッケージ追加 Arch User Repository対応 以下の機能を備える pacman ラッパーの yay を導入する。 AURのパッケージを入れる root以外から pacman を実行できる(でも doas や sudo は必要なのであまり効果がないように見える)。 mkdir -p ~/codes/aur && cd $_ git clone --depth 1 https://aur.archlinux.org/yay.git cd yay makepkg -si pacman -Qi yay yay でroot権限が必要な時に実行されるコマンドを doas に変更。 yay --sudo doas --save LazyVim git clone --depth 1 https://github.com/LazyVim/starter ~/.config/nvim rm -rf ~/.config/nvim/.git cat << _EOF_ > ~/.config/nvim/lua/plugins/colorscheme.lua return { { "sonph/onehalf" }, { "LazyVim/LazyVim", opts = { colorscheme = "onehalfdark", }, }, } nim yay -S choosenim nimble stable yash yay -S yash ghq yay -S ghq mkdir ~/ghq eza yay -S eza locale doas sed -i -e "s:^#ja_JP.UTF-8:ja_JP.UTF-8:" -e "s:^#en_US.UTF-8:en-US.UTF-8:" /etc/locale.gen doas doas locale-gen gemini-cli yay -S gemini-cli podman yay -S podman podman-compose doas loginctl enable-linger 1000 https://matthewsanabria.dev/posts/podman-error-arch-wsl2/ doas setcap cap_setuid+ep /usr/bin/newuidmap doas setcap cap_setgid+ep /usr/bin/newuidmap getcap /usr/bin/newuidmap podman ps yay -S shadow
-
OS/ArchLinuxのAURを使わないセットアップ#Deploy #Linux #Arch Linux できるだけ軽量に済ませたい環境として使うための手順。 インストール ネットワーク設定 WiFiのアクセス設定をする。 iwctl station list iwctl station wlan0 get-networks iwctl station wlan0 connect <SSID> iwctl station wlan0 show インストール インストール内容はファイルに保存しているものを使う。 archinstall セットアップ doas OpenBSDで採用されてる軽量 sudo 的コマンド。 これを入れても sudo が捨てられるわけではないのであまり意味はない。 wheelグループのみ使用を許可する設定をする。 インストール自体は archinstall で実施済み。 echo 'permit persist :wheel' >> /mnt/etc/doas.conf ログインシェル変更 AUR がないので、zsh で妥協する。 chsh -s /usr/bin/zsh ネットワーク iwd を有効化。 doas systemctl enable iwd doas systemctl start iwd systemdで設定するため、iwdでの設定を無効化、およびIPv6の無効化。 cat <<_EOF_ | doas tee -a /etc/iwd/main.conf [General] EnableNetworkConfiguration=false [Network] EnableIPv6=false systemd でのネットワーク設定ファイルを作成。 各種変数は先にネットワーク環境に適したアドレス等を入れておく。 cat <<_EOF_ | doas tee /etc/systemd/network/20-wlan0.network [Match] Name=wlan0 [Network] DHCPServer=false Address=${WLAN_IPADDRESS} Gateway=${WLAN_GATEWAY} DNS=${WLAN_DNS} _EOF_ sshd /etc/sshd_config は触らず、/etc/ssh/sshd_config.d に confg を置いて必要なパラメータを上書きする。 標準ポートにしないなら、 ${SSHD_PORT} には、ssh用のポート番号を入れておく。 cat <<_EOF_ > /etc/ssh/sshd_config.d/10-default.conf PermitRootLogin no PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no KbdInteractiveAuthentication no Port ${SSHD_PORT:-22} _EOF_ ファイアウォール ufw を使用する。 LANからの ssh 以外は全部ブロックする。 sshd の設定を標準ポートにしていないなら、 ${SSHD_PORT} には、ssh用のポート番号を入れておく。 ${INTERNAL_NETWORK} は 192.168.1.0/24 というような形式でLANのネットワークアドレスを入れておく。 doas ufw default DENY doas ufw allow proto tcp from ${INTERNAL_NETWORK} to any port ${SSHD_PORT:-22} doas ufw limit ${SSHD_PORT:-22} doas ufw enable ノートPCを閉じた時の動作 ノートPCを閉じた時、電源の状態に関わらず、何もしないように変更する。 doas sed -i -r "s/^#(HandleLidSwitch[a-zA-Z]*)=.+/\1=ignore/g" /etc/systemd/logind.conf dotfiles 自分の GitHub から dotfiles リポジトリを clone する。 ghq get https://github.com/clesteria/dotfiles.git --shallow ホームディレクトリからリポジトリ内ファイルへのシンボリックリンクを作成する。 cd $(ghq root)/github.com/clesteria/dotfiles ./create_link.sh コンテナ podman を使う。 コンテナレジストリの省略時に補完される内容を定義する。 mkdir -p ~/.config/containers cat <<_EOF_ > ~/.config/containers/registries.conf unqualified-search-registries = ["docker.io", "registry.access.redhat.com", "registry.redhat.io"] short-name-mode = "permissive" _EOF_ neovim LazyVim を入れる。 git clone --depth 1 https://github.com/LazyVim/starter ~/.config/nvim rm -rf ~/.config/nvim/.git nvim