それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

windows で multipass を動かす

multipass を windows にインストール

windowsubuntu の実行環境を手軽に使いたかった。

choco install multipass

UAC のPSから使う。

multipass は UAC 昇格後のPSから使うように設計されている。

基本的な使い方は以下の通り。

新しくインスタンスを起動する

multipass  launch --name sample01

シェルに入る。

multipass  shell sample01

シェルに入る(別の方法)

## docker exec  / lxc exec 的な方法
multipass  exec sample01 bash 

インスタンスを削除する(データは残る。)

multipass  delete sample01

削除済みのインスタンスを完全に消去する。

multipass  purge 

wsl から使う。

私は WSL1 を使っているので直接EXEを叩けば使える。

alias を設定しておくと便利。

alias multipass=/mnt/c/ProgramData/chocolatey/bin/multipass.exe

標準はHyper-Vが使われる。

multipassはデフォルト設定では、Hyper-V を使うので、Hyper-Vの管理画面から、インスタンスを制御できる。

もしトラブったらそこを見ればいい。

UACなしだと、delete && purge ができない。

Admin権限のユーザーであればUAC昇格 なしでも launch や shell は動くのですが、delete purge がうまく動かずHyper-Vインスタンスが消されずに残ってしまう。

もし、Hyper-Vを使っているのであれば、次のフォルダのアクセス権限を取得しておけば、削除される。(はず)

C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd

virtualbox をバックエンドに使用する。

purge がHyper-Vでうまく行かないのであれば、 Virtualboxを利用する。

hyper-Vの代わりにVirtualBoxを使うように設定する。

choco install virtualbox
multipass set local.driver=virtualbox

わたしの場合、フォルダのアクセス権限を取得しておいて、virtualbox で起動することにした。

virtualbox を使うと、ファイルは次にの場所に設置される。

仮想ハードディスクなどは次の場所に設置された。

C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd\virtualbox

万が一の場合は、ここのフォルダを全消ししたら良さそう。

multipass の Virtualbox を表示する。

https://multipass.run/docs/using-virtualbox-in-multipass-windows

hyper-v みたいに、仮想マシンの管理画面でMultipassのゲストを確認するには、次のようなコマンドで pstoolsを使って起動する。

choco install pstools
PsExec.exe -s -i $env:VBOX_MSI_INSTALL_PATH\VirtualBox.exe

f:id:takuya_1st:20210105220438p:plain

hyper-v に戻すには

multipass set local.driver=hyperv

multipass 便利ですね。

カーネルビルドとかやってると完全仮想化のマシンが欲しくなる。削除・作成・起動ができる環境が手に入るのはとても嬉しい。

multipass の bash-completion とかも

wsl で multipass 使うなら bash-completion もあれば便利 ubuntu から持ってきた bash-completion を bashrc に追記しておく

#export PATH="${PATH}:/mnt/c/ProgramData/chocolatey/bin/multipass.exe"
alias multipass=/mnt/c/ProgramData/chocolatey/bin/multipass.exe
# Copyright © 2017-2019 Canonical Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

_multipass_complete()
{
    _multipass_instances()
    {
        local state=$1

        local cmd="multipass list --format=csv"
        [ -n "$state" ] && cmd="$cmd | \grep -E '$state'"

        local instances=$( \eval $cmd | \grep -Ev '(\+--|Name)' | \cut -d',' -f 1 )

        local found

        _get_comp_words_by_ref -n := -w WORDS -i CWORD cur prev
        for instance in $instances; do
            found=0
            for ((i=2; i<CWORD; i++)); do
                if [[ "${WORDS[i]}" == ${instance} ]]; then
                    found=1
                    break
                fi
            done
            if [ ${found} == 0 ]; then
                opts="${opts} ${instance}"
            fi
        done
    }

    local cur cmd opts prev prev_opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    cmd="${COMP_WORDS[1]}"
    prev_opts=false
    multipass_cmds="transfer delete exec find help info launch list mount purge \
                    recover shell start stop suspend restart umount version get set"

    opts="--help --verbose"
    case "${cmd}" in
        "info")
            opts="${opts} --all --format"
        ;;
        "list"|"ls")
            opts="${opts} --format"
        ;;
        "delete")
            opts="${opts} --all --purge"
        ;;
        "launch")
            opts="${opts} --cpus --disk --mem --name --cloud-init"
        ;;
        "mount")
            opts="${opts} --gid-map --uid-map"
        ;;
        "recover"|"start"|"suspend"|"restart")
            opts="${opts} --all"
        ;;
        "stop")
            opts="${opts} --all --cancel --time"
        ;;
        "find")
            opts="${opts} --show-unsupported --format"
        ;;
    esac

    if [[ ${prev} == -* ]]; then
        case "${prev}" in
            "--format"|"-f")
                opts="table json csv yaml"
                prev_opts=true
            ;;
            "--cloud-init")
                _filedir
                return
            ;;
        esac
    fi

    if [[ "$prev_opts" = false ]]; then
        case "${cmd}" in
            "exec"|"stop"|"suspend"|"restart")
                _multipass_instances "Running"
            ;;
            "connect"|"sh"|"shell")
                _multipass_instances "Running"
                _multipass_instances "Stopped"
                _multipass_instances "Suspended"
            ;;
            "start")
                _multipass_instances "Stopped"
                _multipass_instances "Suspended"
            ;;
            "delete"|"info"|"umount"|"unmount")
                _multipass_instances
            ;;
            "recover")
                _multipass_instances "Deleted"
            ;;
            "mount")
                local source_set=0
                local prev
                _get_comp_words_by_ref -n := -w WORDS -i CWORD cur prev
                # Scan through the current command line to detect if the source
                # positional arg has been set.
                for ((i=2; i<CWORD; i++)); do
                    if [[ "${WORDS[i]}" != -* ]] && \
                       ([[ "${WORDS[i-1]}" != -* ]] || [[ "${WORDS[i-1]}" == *=* ]]); then
                            source_set=1
                            break
                    fi
                done

                if [ ${source_set} == 0 ] ; then
                    if [[ ${prev} != -* ]] || ([[ ${prev} == -* ]] && [[ ${prev} == *=* ]]); then
                        _filedir -d
                        return
                    fi
                elif [ ${source_set} == 1 ] && [[ ${prev} != -* ]]; then
                    _multipass_instances "Running"
                    _multipass_instances "Stopped"
                    _multipass_instances "Suspended"
                fi
            ;;
            "transfer"|"copy-files")
                _multipass_instances "Running"

                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                if [[ "${#COMPREPLY[@]}" == "0" ]]; then
                    _filedir
                    return
                fi
            ;;
            "help")
                opts=$multipass_cmds
            ;;
        esac
    fi

    if [[ ${COMP_CWORD} -eq 1 ]]; then
        opts="${opts} ${multipass_cmds}"
    fi

    if [[ -n "${opts}" ]]; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    fi

    return 0
}
complete -F _multipass_complete multipass

参考資料

2020年、良いなと思えたオンプレ(self-hosted)可能ソフトウェア

目次

今年インストールしてオンプレ(self-hosted)可能なソフトウェア

2020 年も終わりを迎えるの。今年インストールして、良かったソフトウェアを上げていきたいと思う。

今年のテーマは脱Googleで、できる限りクラウドのサービスに頼らずに、自前でサーバーにインストールしてデータを扱っていきたいと思う。クラウドサービスの積み上がる請求額に怯える暮らしから脱却したいです。Take Back my own data and Control.

ここに挙げた以外にもたくさんインストールしたり試しているのですが、今年インストールして使い始めて良かったものをまとめておきます。

getoutline

https://www.getoutline.com/

このメモを書いているツール

マークダウンを使ってノートを保存するツールは色々あるが、サーバーにインストールして使えるもの、複数人が使えるもの、権限設定ができるものは限られている。

テーブル(表組み)を手軽に作れるのもポイントが高い。

キーボードショートカットに対応していてリンク挿入や装飾などが手軽なのがいい。

マークダウンで記述できるが、クリック操作でマークダウンをソースを取り出せないのがちょっと悲しい。

今年ようやく日本語IMEに対応して、使い始めた。ずっと進化しているるので、今後が楽しみ。

Qiita よりも書きやすく、Nota ScrapBokほどではない感じ。でもデータを個人で管理できる強みがある。

Bitwarden

https://bitwarden.com/

まだパスワードを「記憶している」の?

パスワード管理はソフトウェアに任せる。自動生成・自動保存・自動入力までやってしまうのは当たり前の時代です。記憶よりも器械です。

パスワードをGoogle Chromeに記憶させるのも怖い。多くの人が使うソフトウェアはそれだけ狙われやすい。Chromeを狙うマルウェアは後をたたない。また何よりもGoogleにすべてを依存するのも恐ろしい話だ。GoogleがアカウントをBANまたはシステムダウンさせたらと考えると少し怖い。(実際に今年起こった)。パスワードくらいは自分で管理したい。Google Chromeのパスワード管理はとても安全で、もしパスワード自動保存してない人は今すぐまずChorme自動保存から使い始めるべきと個人的には思うのですが、Google Chromeに保存したパスワードをiOS(iPhone)から更新・保存のwrite管理が不便すぎて不満でした。

パスワード管理ソフトウェアを導入するにしても 1password にロックインされるくらいならiCloud keyChains 使いたいと思う。いろいろソフトウェアを検討した結果、Bitwardenに行き着いた。自分で管理できるものでソースコードGPL公開されていて誰でも手軽に安全に、自動入力・自動保存・自動生成ができ、OS環境問わず使えるもの、これを満たしてくれるのがBitwardenだった。

bitwarden のパスワード管理以外の便利機能。

メモ機能が個人的に気に入ってる。

メモを機能でセキュアなメモを残せる。メモ機能で、パスワードではないが、重要な記録を残せる。写真にとって保存できる。

パスワード記録ににドメイン名・ID・パスワード以外に、メモを残せる。複垢だったり、同一ベースドメインで複数サーブビスが動いているとき、メモを残せるので、このアカウントがどの契約だったかすぐわかる。さくらインターネットの管理画面ログインなど、複数契約で複数アカウントを持っているときに重宝する。

すべてをbitwarden に

1月にインストール後に使い始め、4月にはすべてのパスワードをBitwardenに移動する決断に至った。約1年が経過し、今では生活必需品になった。iOS版、Windows版、Chrome拡張、コマンドラインツールと生活に必要な一式がすべて提供されているのもポイントが高い。5年先くらいまでは戦えそう。

OpenProject

https://www.openproject.org/

プロジェクト管理ツールはあまたあるけど、どれも帯に短し襷に長しになっている。ソフトウェアの設計者のプロジェクト管理思想が具現化しているので、汎用に使えそうなものはなかなかない。

openproject は、ガントチャート、プロジェクト親子関係、タスクの親子関係、進捗入力、プロジェクト作成のテンプレ化、進捗入力のテンプレ化ができるので、入力項目も選択肢一覧をカスタムフィールドとして自分で定義することができる。ソフトウェア開発以外の、どんなプロジェクトにも対応可能だ。顧客ごとに管理する部署や受発注でも使えそうなので面白い。

カンバンの管理ソフトはあまたあるので、うまく連携設定してあげたい。

git連携が不得意なので、gogs や bare repo などとうまく設定連携していてあげたい。

Gogs

Gogs: A painless self-hosted Git service

古き良き(?)、昔のGithubのウェブ画面を実現している。機能が少ない。が、むしろ分かりやすい。

Git初心者に良い。スッキリしててわかりやすい。

Gogsはシンプルにcommits/ Issue / pull req/ wiki の機能で構成されている。分かりやすい。

gitweb ほど無味乾燥でなく、gitlab/githubほどゴチャゴチャしてない。

ここ数年のgithub は多機能とプロジェクト管理機能が増え、チケット管理とIssue管理ソフトウェアになった。pull/push するシンプルな使い方には増えすぎかもしれない。コミットログをブランチごとに見るだけでもgithubのプロジェクト画面を右往左往することがある。

gitlab/github は多機能でとても使いやすいが、多機能ゆえに、非プログラマの人たち(デザイナ・文書作成)にはまだ敷居が高が高いらしく。データをやり取りするのにGithubはUIが難しすぎる。

GitLabも多機能であるが、シンプルに左バーにまとまっているので素敵だが、gitlab-ci.yml をつかってCI/CDをオンプレで回したい以外の用途でインストールは躊躇する。

Git初学者や初心者、多機能がいらないひとたちとgitのやり取りするのに本当におすすめ。インストールも楽ちん。

Jitsi

https://jitsi.org/

オンライン会議ツール。jitsi の発音は、ジッチィ・ジッツィの発音に近い

Google MeetやZoomに代替にとても良い。

Mattermostから連携させると、Slack・Discord・Teamsの代替としてとてもいい。

通話品質は設定次第なので、評価は分かれると思う。使用感として、会議中に複数人が同時に発言した際、音声が途切れない印象。Meetsは発言が被ると消える印象があるので好対照だった。またDiscordほどノイズキャンセルが強力でもなためキーボード音は入りノイズ判定で警告が出たりも多かったがDiscordのようにノイズ判定でマイク入力をカットしない印象だった。

インストール後にSTUNやSSLP2Pのe2e設定がわかりにくい。ユーザー認証周りがめんどくさい。それを除けば最高に使いやすい。

他と違う変わった機能としてyoutube 動画を一緒に閲覧したり、youtube Liveにデータを流したり、youtube関係がある。OBS使わずにブラウザのタブ1枚で、youtubeを扱えるのは便利。

jitsi単体で使うより、Mattermostに追加する感じで使っている。なぜならmattermostに通話関係の機能がなく、MattermostからJitsiへの連携がありこれが使いやすい。

Slackはああなってしまったので、Slack離れをするためMattermostを使うことになったが通話機能にJitsiを使うことでとても使いやすいコラボ環境が入手できる。

iOSアプリも用意されており、日常使いや会議開催また授業で大活躍できる。

Google Meetにおすすめのソフトウェアだと思います。

n8n.io

https://n8n.io/

Workflowを作り上げるWebUIデザインとタスク作成のわかりやすさが良かった。

Zapier や IFTTや Node-REDが比較対象になると思いますが、Node-REDよりはZapierに近い感じ。

どこをどこをつなぐなど、視覚的に取り扱えるので、流行りのノーコード・プログラミングっぽいRTAごっこができます。でも実際にはJSONだとかHTTP GET/POSTを知らないと使えないですけど。「プログラミングを知らなくても作れる」と、「知ってる人が手軽に書けるGUI」はまた別物なのですが、世間ではごっちゃにされている印象は少なからず受けますよね。

n8nは必要なリクエストログはしっかり残るし、コピーして作成するようなこともできる。ただし、Webhookで受け取ったJSONデータから必要箇所を抜き出して、次のWebhookを起動するようなパス廻しまで手軽にできるかというと、そこまででもない。

PreBill

https://github.com/shoynoi/prebill

年間契約のサービスや、月額サービスの更新日をリマインドしてくれる。

半年残して解約はもったいないなぁ。などとケチってると、更新日に解約を忘れ、更に一年継続しちゃうミスを防げるかもしない。クラウドサービスや携帯電話の料金が高くなりがちなのは、月額サービスの更新月を忘れて解約ミスが発生しすることも一因だとおもうし、年間いくら掛けているのか可視化することもとても重要。

年間でいくら払っているのかを可視化しつつ、契約満期直前にサクッと解約できるようにしておくためにリマンドがとても重要。

年間総額の計算と閲覧、リマインド・メールを送信してくれる。

リマインドは通常であれば、カレンダー経由で行うのでカレンダーに忘れずに登録しておけば良いのですが、カレンダーの登録だと、自分がいつどこでいったい全部で何件の何円契約してるかが一覧の視認性が悪くなるので、このように手軽に管理できるものはいいなと思います。クラウド貧乏を避けたい。

できれば、iOSカレンダーやGoogle カレンダーにiCal エキスポートとか欲しかった。

でも、ないものは作ればいいんだってのが、ソースコードが公開されてる良さですね。

OPNSense

https://opnsense.org/

ルータ用OSの代表的存在

今年始めに、家庭内のネットワークをx86 ルータに変更したのですが、その時からOpenWrtを使っているのですが、予備回線の方はwrtではなく、OPNSenseを使っています。

両者を1年使ってて、単なるルーターとして動作させるのであればOPNSenseのほうが扱いやすいなと思ったので挙げておきます。

特に良かった点が、次の3点。

自動的にアップデートされるのがいい。
WEB画面だけでほとんどできる。
バックアップと復元が使いやすい 。

ルータとして十分な機能を備えていて、なおかつWEB-UIで設定できるのでスマホから操作できる。PPPoEとIPoEつないで、ファイアウォールを設定してOpenVPNDDNSを設定するなら、このOPNSenseを入れておけば十分。使い方もそんなに難しくない。x86のNUCやArm ボードが格安なので、自由に設定できるルーターをおいておくには良い。ルーターと無線APを一緒にしていると、無線APを増設が手間になったり、買い替え後に設定をメーカー提供の画面でチマチマやっていくのは苦痛すぎるので、一家に一台設置してもいいと思う。Wifi機能は進化が早いのでルーター機能とわけて管理しておくほうが5年程度運用するとトータルコストでお得になるかもしれない。

ただベースがBSDなので、SSH経由で使うには、Linuxとコマンドと体系が異なるので、iproute2 や systemd もないしファイル・システムもext4でもZFSもなくUHSなのでLinuxしか使ってない人にはちょっととっつきにくいかもしれない。

ただ無線LANサポートが微妙、BSDなのでドライバが少なく動作するUSB-Wifiも少ない。そのためWiFiSoftbank AirをAPを使うことに。11ac 1300 のAPになれる、契約終了後のSoftbank Air4が捨てられてるので養子にすることに。Wifi扱うならOpenWRTの方がドライバサポートが多くてが良いですね。

LXC container

https://linuxcontainers.org/lxc/introduction/

docker や k8s をみんながやってる中、私がコツコツと使っていたのが、 LXC/LXD と multipass 。

LXCで作るコンテナは、Dockerとは違い、仮想マシンしてるので、systemd があったりカーネルをいじれたり、手軽に実験環境を作成・削除するのが便利だった。

virtualbox や libviet qemu+kvmでもいいのだけれどLXCとして使い方と管理が共通化されているので、ここまで紹介したソフトウェアを試験的に動かしたりインストール手順を確認するのに活躍してくれた。

最後に。

今年は粛々と脱Google依存とクラウド貧乏を防止を目指している感じでした。

来季は、暗号化ストレージまわりや、LDAP認証周りNAS周りをめんどくさいが対応していきたいなと思ったり、お仕事を含めOpenLayersOSM周をやるので、Mapでも脱Googleを目指して頑張れればなと思います。脱Googleをしても、最後に残るGmailだけはどうしても依存してしまう。

mac でdig が応答しないときに、/etc/resolv.confを疑う

mac でdig が応答しない

dig が応答しないんですよね。dig

dig t.co 
### 応答しない。困った

@つけてDNSサーバーを明記すると動く

dig t.co @1.1.1.1
## 応答する。あれれ

resolv.conf が行方不明。

takuya@~$ sudo ll /etc/resolv.conf
ls: cannot access '/etc/resolv.conf': No such file or directory

ln -s すれば解決。

sudo ln -s /var/run/resolv.conf /etc/resolv.conf

原因が相変わらず不明。

消える少し前に、networksetup コマンドとコントロールパネルで、VLANなどのネットワーク構成設定を変更した。多分そのへんなのだろう。

以前にも同じようなことが起きていた。

OSX の /etc/resolv.conf が消えてぶっ飛んでた。→ファイル作って解決 - それマグで!