昨年度の話、もしくは1年Mastodonで暮らした結果
芝が生えた*1。
あとSKK*2使いになって半年は経った。割と肌に合うらしい*3。
そういえば落書きもたくさんしたね*4。iPad Pro ほしい*5。
LTの雑スライドに使えそうな数字群*6
- 52k posts
- 59k favorites
- 136 merged PRs
- 30 commits on forks (kirakiratter/kktCSS, mstdn.maud.io, etc.)
- 5 bookmarklets
- 15 custom styles (rules)
- 18 user scripts
- 英文を読み書きした回数: たくさん(例年*7に比べて)
そうこうしてたら一年経っていたとお考えください。ツケがまわってきたので最近contributionも大人しくなってますが。
制作物もろもろ
Mastodon関係ないやつ
- MDN Translation Helper
MDN*8の記事を翻訳する時のあれこれを自動化するUserScript。私自身はご無沙汰ですが…。 - T/U box - Hatena::Let
見ているWebページのタイトルとURLをコピペするブックマークレット。ogpやcanonicalからWebサイト製作者の望むパーマリンクを取得しようとしたり、ぐぐるや密林のURLから余分なパラメータを取り除いたりもします。WebShareAPIが使えればそれも使えます*9。
UserScript
- Mastodon - Open status/account on dropping URLs
投稿やアカウントのURLをWebUIにドラッグドロップすると、それをWebUI内で開くやつ。複数鯖でMastodonを使っている人はもちろん、domain/@user/12345なURLで投稿を見てふぁぼやブーストしたい時にもサッとできて便利。 - Mastodon - Open post link in WebUI
投稿中に書かれたURLの直前に追加された吹き出しアイコンをクリックすると、WebUI内で開けたら開くやつ。連合の投稿URLとか、鳥の投稿URLとか、渋のURLとかとか。対応してないURLにも追加されるのは諦めて。 - Mastodon - Make fullscreen on clicking media modal
添付画像をクリックしてポップアップ表示されたところから、さらにその画像をクリックすることで全画面表示にするやつ。 - :don: - Add web+mastodon://follow link to user page
domain/@userなユーザーページにリモートフォローのリンクを足すやつ。web+mastodonはWebUI開いてちょっと待つと「登録しますか?」とか聞いてくるあれです。 - Mastodon - 期限付きミュート
- Pixiv - Replace "Pawooでシェア" with web+mastodon button
Pawooに限定した方が楽なのはわかるけど、惜しいなあ。
2カラムレイアウト関連(最近のバージョンだとちょっと挙動が怪しい)
開発者向け
UserStyle
/* 単体のカスタム絵文字を大きくする(雑判定) */ p > .emojione[alt^=":"]:only-child { width: 2.5em; height: 2.5em; margin: 0; } /* 「アニメーションの動きを減らす」向けの調整 */ .compose-form > div:first-child { opacity: 1 !important; } .modal-root { transition: opacity .2s } /* 色々小さくする */ .search__input, .autosuggest-textarea__textarea { font-size: 13px !important; } .status__info { font-size: 13px; } .status__content, .reply-indicator__content { font-size: 13px; line-height: 19px; } .status__action-bar { margin-top: 5px; } /* ユーザー詳細でアバターにカーソル乗せた時のアニメーションを(ry */ .account__header__avatar { border-radius: 100% !important; transition: .5s;} .account__header__avatar:hover { border-radius: 8% !important; transition: .5s; } /* 縦に長い投稿を省略 */ .status__content--with-action { max-height: 30em; overflow: hidden; } /* リモート宛のメンションでドメインの頭文字を表示(可能なら) */ /* [...Array(26).keys()].map(i => String.fromCharCode(97 + i)).map(c => `a.mention[title*="@${c}"]:after { content: "@${c}…" }`).join("\r\n") */ a.mention[title*="@a"]:after { content: "@a…" } a.mention[title*="@b"]:after { content: "@b…" } a.mention[title*="@c"]:after { content: "@c…" } a.mention[title*="@d"]:after { content: "@d…" } a.mention[title*="@e"]:after { content: "@e…" } a.mention[title*="@f"]:after { content: "@f…" } a.mention[title*="@g"]:after { content: "@g…" } a.mention[title*="@h"]:after { content: "@h…" } a.mention[title*="@i"]:after { content: "@i…" } a.mention[title*="@j"]:after { content: "@j…" } a.mention[title*="@k"]:after { content: "@k…" } a.mention[title*="@l"]:after { content: "@l…" } a.mention[title*="@m"]:after { content: "@m…" } a.mention[title*="@n"]:after { content: "@n…" } a.mention[title*="@o"]:after { content: "@o…" } a.mention[title*="@p"]:after { content: "@p…" } a.mention[title*="@q"]:after { content: "@q…" } a.mention[title*="@r"]:after { content: "@r…" } a.mention[title*="@s"]:after { content: "@s…" } a.mention[title*="@t"]:after { content: "@t…" } a.mention[title*="@u"]:after { content: "@u…" } a.mention[title*="@v"]:after { content: "@v…" } a.mention[title*="@w"]:after { content: "@w…" } a.mention[title*="@x"]:after { content: "@x…" } a.mention[title*="@y"]:after { content: "@y…" } a.mention[title*="@z"]:after { content: "@z…" } /* ピン留め投稿を折り畳む(微妙) */ article[data-id^="f-"] .status__wrapper:not(:focus) .status { padding-top: 0; min-height: 0; max-height: 0.5em; overflow: hidden; } article[data-id^="f-"] .status__wrapper:not(:focus) .status__avatar, article[data-id^="f-"] .status__wrapper:not(:focus) .display-name { display: none } /* unlisted投稿の右下に鍵マーク表示 */ .status-unlisted:after { display: block; position: absolute; width: 14px; height: 14px; right: 10px; bottom: 8px; font: 14px/1 FontAwesome; content: "\F13E"; /* fa-unlock-alt */ opacity: 0.3; }
*1:このグラフはGithubのユーザーページに表示されているもので、過去一年間のGithub上での活動量を色で表現したものです(縦に曜日、横に週が並ぶ)。その一年間においてより多く活動をした日が濃い色で表示されるので、例えばまんべんなく色がついていれば毎日同じようにコミットしたりissue/pr投げたりしていたねという感じです。その色から芝生などと呼ばれています。
*2:変換する範囲や送り仮名の位置をキー操作で明示して変換する、ちょっと変わった日本語入力システム。一見面倒に思えるが熱狂的なファンも多い(よくあるやつ)。詳しくはお好みの百科辞典サイトで。
*3:彼のどこが一番好きかと言われると、ひらがなカタカナが意図せず変換されることがない(ひらカナを強制するのは普通のIMEでもできるが、変換候補に挙がってこないし学習もされないのが大きい)ところなのかなあ。同音異義語の出しわけに弱い(単語単位で変換するので文脈を全く読まないし送り仮名も最後まで見ない)のが難点だけれど。
*4:日頃かわいいイラストをありがとうございます。こんなに描いてもらえるなんて思ってもみなかった。
*5:新しいiPad AirでもApplePencilは使えるけれど、スピーカー4つ魅力的じゃない?
*6:c.f. 林檎社とかの基調講演
*7:ほぼゼロ
*8:Mozilla Developer Network。JavaScriptに関して調べるとよく出てくる https://developer.mozilla.org/ja/docs/Web/JavaScript とかのことです。
EAPIの壁を越えてPortageを更新する
Windows使いとしては、1年以上GentooLinuxを更新せずに放置するとか、やっぱりあるわけです。で久々にうどんワールドしようかなとか思うと、大量のエラーに見舞われるわけです。
まあPortage更新すりゃいいんでしょ。
$ emerge -p1v portage ... !!! All ebuilds that could satisfy "dev-python/pyblake2[python_targets_pypy(-)?,-python_single_target_pypy(-),python_targets_python2_7(-)?,-python_single_target_python2_7(-),python_targets_python3_4(-)?,-python_single_target_python3_4(-),python_targets_python3_5(-)?,-python_single_target_python3_5(-)]" have been masked. !!! One of the following masked packages is required to complete your request: - dev-python/pyblake2-1.1.0::gentoo (masked by: EAPI 6) - dev-python/pyblake2-0.9.3-r1::gentoo (masked by: EAPI 6) The current version of portage supports EAPI '5'. You must upgrade to a newer version of portage before EAPI masked packages can be installed. (dependency required by "sys-apps/portage-2.3.13-r1" [ebuild]) (dependency required by "portage" [argument]) For more information, see the MASKED PACKAGES section in the emerge man page or refer to the Gentoo Handbook.
🙄
sys-apps/portage 自体は EAPI 5 であるものの、その依存パッケージが EAPI 6 だけになってしまったようです。
PortageはROOT環境変数ないし --root オプションを使うことでインストール先の環境を変更することができます。これを使って、正常にPortageが動作する環境、stage3から更新をかけてみます。
chrootまで
まずはインストール時と同様にchrootできる状態にします。
# mkdir /mnt/gentoo # tar xvpf stage3-*.tar.xz -C /mnt/gentoo # mount --rbind /dev /mnt/gentoo/dev # mount --rbind /proc /mnt/gentoo/proc
Portageツリーは更新してしまったのがあるのでそれを、またインストール先である / を適当なディレクトリにbindマウントしておきます。
# mkdir /mnt/gentoo/usr/portage # mount --bind /usr/portage /mnt/gentoo/usr/portage # mkdir /mnt/gentoo/mnt/parent # mount --bind / /mnt/gentoo/mnt/parent
ROOTを指定するとROOTにある /etc/portage/*
が読み込まれますが、これをそのまま使うと依存関係がまたややこしくなるので、stage3のものをベースにします。MAKEOPTSやFEATURESはよしなに。
# mv /etc/portage /etc/portage_ # ln -s /mnt/gentoo/etc/portage /etc/portage
そしてROOTを毎回指定しなくていいように、chrootしたらexportしてしまいます。
# chroot /mnt/gentoo /bin/bash # export ROOT=/mnt/parent
いつものemergeバトル
# emerge -p1u portage ... [blocks B ] <dev-lang/python-3.3.5-r4:3.3 ("<dev-lang/python-3.3.5-r4:3.3" is blocking dev-lang/python-exec-2.4.5) [blocks B ] app-emulation/emul-linux-x86-baselibs ("app-emulation/emul-linux-x86-baselibs" is blocking sys-libs/ncurses-6.0-r1)
手前のは例によって dev-lang/python-exec
を足したら消えた、というか最初はこれ出てたはずなんだけど再現できない…。
問題は後者。amd64として構築したGentoo環境では基本的にamd64向けのバイナリしかビルドされないが、バイナリ配布しかないソフトウェアの中にはx86版しかないものがあります。ここでx86版のライブラリも同時にインストールしておこうというのがmultilibプロジェクトで、以前はemul-linux-なんちゃらというパッケージに定番ライブラリのx86バイナリを詰めこんで配布していました。ただこれだと個別のパッケージをユーザー側でどうこうできないしパッチ当ても別になるしで微妙だったので、USEフラグの仕組みでビルド・インストール・依存するABIを選択できるようにしたのがgx86-multilibと呼ばれるものです。
でー…なんかこの環境にはその移行から数年経ってそうなemul-linuxのパッケージが残っていたわけですね。かといってgx86-multilibに乗りかえると該当するパッケージのリビルドが走ってだるい…。
emerge -cpv emul-linux-x86-baselibs
から始めて、emul-linuxパッケージを足していきながら、なにに要求されているのかを確認してみると nvidia-drivers だけでした。どのみちEFIブート周りではまって nouveau を検討していましたし、とりあえず今はXは全く使えなくても問題ないです。emerge -C
で強引に消してしまう手もありますが、穏便に行きましょう。
# INPUT_DEVICES="" VIDEO_CARDS="" emerge -a1u xorg-drivers # emerge -ac emul-linux-x86-{baselibs,db,medialibs,soundlibs,xlibs,opengl} nvidia-drivers
これであとは emerge -a1u portage
して目標達成です。pythonふたつを含む10パッケージほどが更新されました。/etc/portage/
がディレクトリじゃないからリネームしといたよとか言われてますが、まあいいでしょう。後で再mergeするだろうし…。
しかしここからが大変そうだなあ…。