ゆんたんのきまぐれBlog

'The answer of life, universe, and everything'.gsub(/,/, '').size #=> 42

#mikutter #Snap #AppImage

mikutterコミッタになった

mikutter 3.9.6 | mikutter blog 公式にmikutterコミッタにされてしまったとして参加することになりました.よろしくお願いします.

これから取り組んでいきたいこととしてはGTK+3対応です.現時点(2019/10/22)ではmiraclepainterがとりあえず動くくらいの段階にあります.コードをながめているとプラグインの分割など色々アイデアが出てくるのですが、ひとまず出来るだけもとの作りのままGTK+3対応を進めることに集中したいです.

mikutter AppImageでリンクをブラウザで開けるように修正した

バグ #1364: AppImage版にてMastodonアカウントの新規登録時、認証URLをクリックしても何も出ない | mikutter Redmine

AppImage版のmikutterで、本文中のリンク等をクリックしてもブラウザが起動しないという問題です.アカウント追加時に必ずブラウザを開く必要があるので、これは重大な不具合でした.

対策方法は上のチケット🎫に書いた通りなのですが、復習も兼ねて書いておきます.AppImage環境はchrootみたいなことをしていて、外の環境と非互換のDLL(動的リンクライブラリ)を引っ張ってこれるようにしています.ブラウザを起動するときのみ、外の環境の環境変数を参照して、ブラウザのバイナリを叩くようにしたという修正です.

1ページ分上/下にスクロールするコマンドを実装した

提案 #1381: 1ページ分上/下にスクロールするコマンドを実装する | mikutter Redmine タイトルの通りです.vimの手癖でCtrl+Dしてしまいがちだったので実装しました.

mikutter Snapの更新

2019/10/22現在のSnap版mikutterはv3.9.6ですが、v3.9.5からv3.9.6にアップデートする際に以下の変更を加えました.

  • jemallocの利用
  • ruby v2.6.5に更新
  • オーディオ再生の権限を修正

#mikutter #snap Install mikutter for Linux using the Snap Store | Snapcraft

rev 60-63では日本語入力ができるはず.

やったこと

  • gnome platformをgnome-3-26-1604にダウングレードした

変更点:downgrade to gnome-2-26-1604 · yuntan/mikutter-snap@9ce9d36

yuntan/writefreely: blog.untan.xyzを支える技術 | GitHub を公開した.以下の修正を加えている.

  • fenced code blockの上部にファイル名を表示する機能を追加
  • Snapでパッケージングするためにsnapcraft.yamlを追加
  • トップページの記事数を10 –> 30に変更

#writefreely

CSS Gridでarticle要素をいい感じに並べるCSSを書いた.Scrapboxのレイアウトを意識している. writefreely custom CSS for listing page | Gist

上のキャプチャのように画像をプレビューするには,記事の最初のパラグラフに画像が含まれている必要がある.

元は記事の本文が省略されずに縦に並んでいるだけだった.記事一覧として全く機能していない.

#KDE #Plasma5 #ArchLinux

r/unixporn的ノリでLinuxデスクトップを自慢するコーナー.

Plasmaのブラー効果の強度は「System Settings > Desktop Behavior > Desktop Effects」で適当に調整する.

Install mikutter for Linux using the Snap Store | Snapcraft

#mikutter#Snap としてパッケージングし,Snap Storeで公開した.

Snapとは

Linuxアプリを最新に保つための新しいパッケージ管理システム.

  • アプリのバージョンをOSの更新のタイミングと切り離して管理できる
  • アプリが依存するパッケージも含めて1つにまとめることができる
  • Ubuntuやそれ以外のLinuxディストリビューションで使える

などの特徴がある.よく似たものとしてFlatpakやdockerがある.dockerはサーバーアプリに特化しているのに対し,Snapはデスクトップアプリ・サーバーアプリの両方を扱うことができる.

参考

Snapアプリとしてのmikutter

mikutterの動作に必要なRuby,Gem,GTKのライブラリを全てまとめて,Snapアプリとしてパッケージングした.

ビルド用スクリプト:yuntan/mikutter-snap | GitHub

Rubyアプリをパッケージングする知見が無駄に溜まったのでまた今度記事にしたい.

既知の問題

日本語入力ができない.

Snapアプリの統計

Snapアプリのメンテナは,Snapアプリがどれだけのデバイスにインストールされているかを確認することができる.

過去一ヶ月間のインストール数の統計.

ディストリビューション別のインストール数の統計.

Snapアプリの今後の更新方針

  • mikutterのupstreamでタグが切られた時のみSnap Storeにリリースする.
  • edge channelはタグが切られた後,一日以内に更新される.(私が管理しているサーバーで自動更新用のスクリプトを回している.)
  • stableは手動で更新する.

#writefreely

コード:writefreely dark mode compatible Custom CSS | Gist

上の画像のような感じのダークモードにするCustom CSSを作った.ブラウザのprefers-color-schememediaクエリを読んでテーマを切り替える.

Custom CSSの設定方法:Customizing Write.as | Write.as Guides

#Scrapbox の記法をいい感じにMarkdownに変換して適当に文字をデカくするスクリプトを書いた.ついでにScrapbox拡張として使えるようにした.

Scrapboxの記事(左)と,それをMarkdownに変換したもの(右).記事タイトル・パラグラフのタイトル・画像・リスト・コードがいい感じに変換されている.

変換処理は適当なので上手く変換できないこともあるけどその時は適当に手で直せばOK.

nodejs用スクリプト

Scrapbox –> Markdown | Gist

cat scrapbox.txt | node sb2md.js | tee scrapbox.md みたいな感じで使う.

Scrapbox拡張

Scrapbox –> Markdown (Scrapbox extension) | Gist

テキストを選択した時に出るポップアップとページメニューの両方に対応.

#vim shot-fぽい挙動.

rhysd/clever-f.vimderis/vim-shot-fの挙動を実装した. Add feature to highlight characters to which the cursor can be moved directly by yuntan · Pull Request #47 · rhysd/clever-f.vim

素晴らしいプラグインを公開されている@rhysd様と@deris様に感謝.

#vim #Julia

endwise.vimみたいな感じでendを補完するプラグインであるlexima.vim(それ以外の機能もあるがここでは省略)をJuliaに対応させた.

Add endwise rules for julia #82

感想(?)

PRを見返すと追加したコードより追加したテストの方が長かった.

本当は2018年の末に公開したのだけど,記事にしていなかったので書いておく.

Chrome ウェブストア / Firefox Add-ons / GitHub

これは何?

15分ごとに時間を合成音声で読み上げる拡張機能

動機

作業にかかった時間に対する意識を高めるために作った.※効果には個人差があります.

3日くらいで使わなくなってしまった.なぜ使わなくなったかというと,他の人と同じ部屋(研究室)で作業しているときには鳴らせないから.

元ネタ

Amazon Prime Videoで観たメンタリスト(アメリカの刑事ドラマ)のシーズン6,エピソード17「銀の翼が時を超え」

#mikutter

yuntan/mikutter-rss: RSS plugin for mikutter 3.6+

  • feed-normalizerに依存しないように変更
    • bundle installが不要になったので,AppImage版のmikutterでも動作するようになった.
  • subparts_image対応
  • RSSの取得に失敗したときにクラッシュする不具合を修正
  • 非ASCII文字を含むURLを扱えるように修正

#neovim #dotfiles #tmux

TL;DR

let s:osc52_copy = {lines, regtype ->
\ chansend(v:stderr, printf("\x1b]52;;%s\x1b\\", system("base64", join(lines, "\n"))))}
let s:osc52_paste = {-> getreg('"', 1, 1)} " fallback
if !exists('$TMUX')
  let g:clipboard = {
\   'name': 'osc52',
\   'copy': {
\     '+': s:osc52_copy,
\     '*': s:osc52_copy,
\   },
\   'paste': {
\     '+': s:osc52_paste,
\     '*': s:osc52_paste,
\   },
\   'cache_enabled': 1,
\ }
endif
set -g set-clipboard on

OSC 52制御文字列とは

CLIアプリとクリップボードを連携するためのXTermの制御文字列. XTerm Control Sequences

OSC 52に対応している端末エミュレーターで以下のコードを試すと,クリップボードの内容を変更できる.

printf "\x1b]52;;%s\x1b\\" "$(base64 <<< "hello")" # "hello" をクリップボードに送信

以下のコードでクリップボードの内容を取得できる(…はずだが,なぜか上手くいかない)

printf "\x1b]52;;?\x1b\\"; awk -F ";" '{print $3}' | base64 -d

利点

  • OSに依存しない
    • xclippbcopyなどのプログラムを指定しなくてもOSのクリップボードを読み書きできる.
  • SSHで使える
    • X11転送ssh -Xの代わりに使える.

欠点

  • 対応している端末エミュレーターが少ない
    • 特に,OSC 52 ?にはセキュリティ上の理由で対応していないアプリがほとんど.
  • クリップボードの内容をvim/tmuxに反映することができない
    • neovimでクリップボードの内容の取得を試したが手段が見つからなかった.
    • tmuxはクリップボードの内容の取得に対応していない.

neovimの設定

neovimのclipboard-providerとして登録する.:h provider-clipboardを参照.

let s:osc52_copy = {lines, regtype ->
\ chansend(v:stderr, printf("\x1b]52;;%s\x1b\\", system("base64", join(lines, "\n"))))}
let s:osc52_paste = {-> getreg('"', 1, 1)} " fallback
if !exists('$TMUX')
  let g:clipboard = {
\   'name': 'osc52',
\   'copy': {
\     '+': s:osc52_copy,
\     '*': s:osc52_copy,
\   },
\   'paste': {
\     '+': s:osc52_paste,
\     '*': s:osc52_paste,
\   },
\   'cache_enabled': 1,
\ }
endif
  • clipboard providerから/dev/ttyにアクセスできないので,ワークアラウンドとしてchansend(v:stderr, "hello")を使う.
  • tmuxの上にnvimが乗ってるときは,providerを追加せずにデフォルトで用意されているtmux providerを使う.
  • OSC52?(クリップボードの内容の取得)を試したが,上手いやり方が見つからなかった.
    • 失敗例
    • code:vim
    • let s:osc52_paste = {–> system(“base64 -d”, split(chansend(v:stderr, “\x1b]52;;?\x1b\”), “;”)[2])}
    • code:vim
    • let s:osc52_paste = “echo -en '\x1b]52;;?\x1b\'; awk -F ';' '{print $3}' | base64 -d”
  • ひとまず"registerの内容を持ってきて誤魔化している.
    • code:vim
    • let s:osc52_paste = {–> getreg('“', 1, 1)} ” fallback

tmuxの設定

tmuxはOSC52?(クリップボードの内容の取得)には対応していない. – OSC 52 clipboard reading · Issue #1477 · tmux/tmux

set -g set-clipboard on

OSC52に対応している端末エミュレーター

端末エミュレーターの設定

  • Alacrittyは設定不要.
  • RLoginの設定例

参考

#mikutter #AppImage mikutter.AppImage on Ubuntu 18.04

mikutter.AppImage on Fedora 28

🚧️ このパッケージはテスト版です.配布物に関していかなる保証も致しかねます.告知なしに配布を取りやめることがあります. 🚧️

配布ページ:https://github.com/yuntan/mikutter/releases/tag/v3.8.8-20190525 前のバージョン:v3.8.7-20190503

必要な環境

AppImage版mikutterを使うには2014年以降にリリースされたLinuxデスクトップ環境が必要です. 以下のディストリビューションにて動作を確認しました.

  • Ubuntu 18.04
  • Fedora 28
  • Arch Linux

使用方法

wget https://github.com/yuntan/mikutter/releases/download/v3.8.8-20190525/mikutter-3.8.8-20190525-x86_64.AppImage
chmod +x mikutter-*.AppImage && ./mikutter-*.AppImage

連絡先

@yuntan_t@mstdn.maud.io又はGitHubのIssues

主な変更点

既知の問題

  • 一部の環境で,リンクをブラウザで開くことができない.Ubuntu 18.04で不具合を確認.
    • リンクをクリックするとError: no DISPLAY environment variable specifiedが標準出力され失敗する.
    • AppImageKit-checkrtexec.so関連の問題と思われる.
  • AppImageにバンドルされていないRuby gemに依存するmikutter pluginを利用できない.
  • 突然クラッシュすることがある.

ビルド用スクリプト

https://github.com/yuntan/mikutter/tree/ci-appimage/deployment/appimage

TODO

#Windows

microsoft/terminalのCIからアプリのパッケージをダウンロードし,パッケージを自己署名証明書で署名する.

用意するもの

  • Windows 10 1903

手順

  1. microsoft/terminalのCIから成果物のZIPファイルをダウンロードする. https://dev.azure.com/ms/Terminal/_build のビルド履歴のうち,master branchに対してビルドされたもの(Rolling build for …とあるもの)のみ,ビルドの成果物をダウンロードできるようになっている.
  2. ZIPファイルを展開 展開して出てきたCascadiaPackage_x.x.x.x_x64.msixをインストールしようとすると失敗する.
  3. 自己署名証明書を作成する. 参考:Create a certificate for package signing – Windows UWP applications | Microsoft Docs
New-SelfSignedCertificate -Type Custom -Subject "CN=YOUR NAME HERE" -KeyUsage DigitalSignature -FriendlyName "My cert" -CertStoreLocation "Cert:\LocalMachine\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
$pwd = ConvertTo-SecureString -String <Your Password> -Force -AsPlainText
Export-PfxCertificate -cert "Cert:\LocalMachine\My\<Certificate Thumbprint>" -FilePath <FilePath>.pfx -Password $pwd
  1. 作成した自己署名証明書をインストールする. 参考:UWPをターゲットマシンにインストールする方法 – Qiita 「ローカル コンピューター」を選択し,「信頼されたルート証明機関」にインストールする.
  2. MSIXに署名する. MSIX Packaging Toolをインストール.
  3. できあがったMSIXをインストールする.

おまけ

#AtCoder #ABC #Julia

ABC125

#tmux #dotfiles

見た目の変更

ウィンドウとペインのインデックスを1から始めるようにする.

set -g base-index 1
set -g pane-base-index 1

アクティブなペインの枠を目立たせる

set -g pane-active-border-fg red

prefixキーの変更

prefixキーを押しやすいキー(Ctrl-a)に変更する.

unbind C-b
set -g prefix C-a
bind C-a send-prefix

キーバインド

PREFIX Tabで次のパネルに移動する.

bind Tab select-pane -t :.+ # 次のペインを選択

PREFIX Shift-Tabで前のパネルに移動したいが,なぜか次の設定は反映されない.

bind S-Tab select-pane -t :.- # 前のペインを選択

vimのようにPREFIX pで貼り付けする.

bind p paste-buffer # ペースト

ペイン分割のキーバインドを覚えやすいものに変更する.

bind | split-window -h # 縦に分割
bind - split-window -v # 横に分割

copy modeのキーバインドをよりvimらしくする(vで選択開始,yでyank).

setw -g mode-keys vi # copy-modeでvi bindingを使う 
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection  

#tmux #dotfiles

以下の画像のようなstatus lineにするための,tmuxの設定を紹介する.

通常時のstatus line.左から順に,モード,ホスト名,ウィンドウリスト,メモリの容量,ルートのディスクの容量,load average,日付時刻を表示している.

prefix keyを押下したときのstatus line.モード表示の色を反転させている.また,ホスト名の代わりに一部のキーバインドを表示している.

copy modeにおけるstatus line.モードとcopy modeで使える一部のキーバインドを表示している.

この記事では以下の設定について紹介する.

  • emacsのwhich-keyぽいやつ
  • モードの表示とprefix keyの状態表示
  • メモリ,ディスク容量,load average等の表示

status lineの色の設定

お好みで.

set -g status-fg black
set -g status-bg white

左側の設定

set -g status-left-length 120
# prefix keyが押されていたら色を反転,copy-modeに入ったら表示を変更
set -g status-left '#{?pane_in_mode,#[bg=yellow] COPY ,#[fg=cyan,bg=black]#{?client_prefix,#[reverse],} TMUX }'
# ホスト名を表示,prefix keyが押されたらwhich-key的なヒントを表示,copy-modeに入ったらwhich-key的ヒントを表示
# #H: ホスト名
set -ga status-left '#[default] #{?pane_in_mode,/: search  v: begin-selection  y: copy  q: cancel,#{?client_prefix,M-1: even-h  M-2: even-v  M-3: main-h  M-4: main-v  M-5: tiled  Space: next-layout  d: detach  Enter: copy-mode  p: paste,#H}}'

?pane_in_modeでcopy modeかどうか,?client_prefixでprefix keyが押されているか判別できる.which-key的ヒント用の文字列はお好みで.status leftに表示する文字列の長さに応じてstatus-left-lengthを変更する.

中央(ウィンドウリスト)の設定

set -g status-justify centre # ウィンドウリストを中央寄せ
set -g window-status-current-fg red # アクティブなウィンドウを目立たせる

右側の設定

set -g status-right-length 120
set -g status-right '[mem: #(tmux-status-mem)]' # メモリの容量と空き
set -ga status-right ' [disk: #(tmux-status-disk)]' # /の容量と空き容量
set -ga status-right ' [load: #(tmux-status-load)]' # load average
set -ga status-right ' [%Y-%m-%d %H:%M]' # 日付・時刻

メモリ,ディスク,load averageを取得するスクリプトは,別のスクリプトに分けて,$PATHが通るところに置く..tmux.conf内にスクリプトを書くと,文字列の多重エスケープにより解読不能になるため.

#!/bin/bash

free -h | awk '/^Mem:/{print $3"/"$2}'
#!/bin/bash

# /にマウントされているファイルシステムの容量と空き容量を表示
df -h | awk '$6 ~ /^\/$/ {print $4 "/" $2}'
#!/bin/bash

uptime | awk '{print "1m " $(NF - 2) "/5m " $(NF - 1) "/15m " $(NF)}' | sed 's/,//g'

おまけ

tmuxの設定例(その2)

#Android GIF

Float値を扱えるカスタムSeekBarPreferenceを作った.

動機

AndoridXのSeekBarPreferenceAPI)はSeekBarPreference#getValue/setValueIntしか受け付けない.Float型を扱えて,かつ値のフォーマット文字列を指定できるPreferenceクラスを自作した.

実装

SeekBarPreference for Float with value formatter · GitHub