basyura's blog

あしたになったらほんきだす。

inkdrop いじり

vim いじり (vimrc, plugin) をよくしてた頃と同じ感じで inkdrop いじり (init.js, plugin) をよくしてる。ちょっと気になるところがあれば自分で直せるのは大きい (yak shaving) が捗る。

enter でカーソル位置の url を開き、 <C-m> でカーソル行のリンクを全部開くようにしてみた。正規表現はやっつけ。

keymap.cson

'.CodeMirror.vim-mode:not(.insert-mode):not(.key-buffering) textarea':
    'enter': 'mycmd:open-cursor-link'
    'ctrl-m': 'mycmd:open-current-line-links'

init.js

inkdrop.commands.add(document.body, "mycmd:open-cursor-link", () => {
  const editor = inkdrop.getActiveEditor();
  const { cm } = editor;
  const cur = cm.getCursor();
  const token = cm.getTokenAt(cur);
  if (token.type == "url") {
    open(token.string);
  } else if ((token.type = "string url")) {
    const link = token.string.replace("inkdrop://", "");
    inkdrop.commands.dispatch(document.body, "core:open-note", {
      noteId: link,
    });
  }
});

inkdrop.commands.add(document.body, "mycmd:open-current-line-links", () => {
  const cm = inkdrop.getActiveEditor().cm;
  const cur = cm.getCursor();
  const str = cm.doc.getLine(cur.line);
  // url parse
  const urlReg = new RegExp(/(http.*?)( |\)|$)/g);
  [...str.matchAll(urlReg)].forEach((v) => {
    open(v[0]);
  });
  // inkdrop:// parse
  const idReg = new RegExp(/(inkdrop:\/\/.*?)( |\)|$)/g);
  const matches = [...str.matchAll(idReg)];
  if (matches.length > 0) {
    inkdrop.commands.dispatch(document.body, "core:open-note", {
      noteId: matches[0][1].replace("inkdrop://", ""),
    });
  }
});

Redmine: Contributed to View customize plugin v2.7.0

日頃からお世話になっている View customize plugin 。プロジェクト識別子を指定できるようにした PR が無事にマージされました (バグがあったりテストの書き方がおかしかったりで色々直してもらってます・・・)。

元の登録画面が url のパスを指定して js などを記述する UI になっているので、パス起点でしか動かせないとつい最近まで思い込んでた (そう思ってる人は多いはず)。なので、パスにプロジェクト識別子がある場合はいいのだけど、チケットを選ぶとパスから消えてしまうので特定のプロジェクトかを判断できず不便だなとずっと思ってた。

実は js で画面の要素を $(".current-project") で取って判定することができた (View customize plugin が埋め込む ViewCustomize 変数をから判断することもできてたっぽいけど未検証)。パスは .* を指定して js の先頭で判断すれば任意のプロジェクトにいる場合に実行することができるようになるのだけど、.* だらけになってどのプロジェクトを開いても js が html に埋め込まれて発動してしまうのが嫌になって PR を作った (余程の量を書かなければ性能影響はないと思うけど・・・)。

登録時の UI でプロジェクト識別子が明確に指定できるので、今まで存在を知らなかった人にも嬉しいのではないかと思う。

任意のプロジェクトで js を発動できるようになると、任意のプロジェクト選択中に任意の自作タブを表示するような事ができる (プロジェクト、活動、チケットのタブの横とか)。自分担当や任意のクエリタブを追加したりすると便利で、チケットを開いてもタブは表示されたままなので簡単に選択できてとても便利。

Twitter を見ると良い反応が多かったので良かった。

GitHub Actions 実践入門

入門した。便利。

最近は Twitter を見てると心が荒むのであまり見ないよにしていて、ブラウザでタイムラインを開いたら自分のプロファイルに飛ぶようにしたり、スマホの場合はドメイン丸ごと見えないようにする拡張を入れたりとかしているのだけど生存確認というか承認欲求のために GitHub のコミット記録を画像付きで垂れ流すようにしてみた。

実装は単純だけどテスト書いて GitHub Actions で push のたびに実行されるようにしてみた。

便利。テストを書いてたら test-unit-rr が便利だということも知れてよかった。

Twitter で自分のページしか見ないようにする Tampermonkey

色々と精神を揺さぶられることが多くなってきたので。

// ==UserScript==
// @name         twitter
// @namespace    http://basyura.org/
// @version      0.1
// @description  twitter save
// @author       basyura
// @match        https://twitter.com/*
// @grant        none
// ==/UserScript==

(function() {

    'use strict';
    const func = () => {
        setTimeout(function() {
            document.querySelector('[data-testid="sidebarColumn"]').style.display="none";
        }, 0);


        if (window.location == "https://twitter.com/notifications") {
            return;
        }

        const url = "https://twitter.com/basyura";
        if (!window.location.toString().startsWith(url)){
            window.location = url
        }
    }


    func();

    var observer = new MutationObserver(function(mutations) {
        func()
    });

    observer.observe(document, { childList: true, subtree: true });

})();

script をローカルで管理できたらいいんだけどなぁ。

inkdrop - sidetoc plugin v1.7.0 release

マイナーバージョンをガンガン上げていくのも微妙 (ブログ書くのが手間だな) と思って パッチバージョンを上げて機能を追加してメジャーバージョンアップ時にまとめてブログを書くのがいいかなと思ったけどパッチバージョンはバグフィックスにやっぱ使いたいなと一周した。

すでに 1.6.x でリリース済みであるけど 1.7 としてリリースしました。

  • プレビュー表示の際に
    • 対象のヘッダをある程度(汗)の判定で強調表示するようにした
    • ヘッダクリックでジャンプするようにした
    • jumpToNext (Prev) コマンドをプレビューでも使えるようにした
  • codeblock 内のコメントがヘッダとして認識されていたのを修正した。
    • ただし、html タグ内はサポート対象外とした (markdown で普通に?html タグが使えるの知らなかった)

evernote や bear を使っていて僕自身が前々からほしいと思っていて作った plugin なのだけど、一部の方には好評なようなので作ってよかったと思った。

Boot Redmine on Docker

久々に触るといろいろ変わってるのと記憶力がなさすぎるのとですぐハマるので未来の自分のためのメモ。

boot

$ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-redmine/master/docker-compose.yml > docker-compose.yml
$ docker-compose up -d

plugin を入れたい

nokogiri に必要なもの

$ apt-get install build-essential patch ruby-dev zlib1g-dev liblzma-dev
$ gem install nokogiri -v 1.10.9

bundle install に必要なもの

$ sudo apt-get install libmariadb-dev libpq-dev

単純に実行するとエラーが出る

$ bundle install

You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

If this is a development machine, remove the /opt/bitnami/redmine/Gemfile freeze 
by running `bundle config unset deployment`.

The dependencies in your gemfile changed

You have added to the Gemfile:
* activerecord-compatible_legacy_migration

設定を変更 (開発系だよマークを付ける意味合いっぽい)

$ bundle config unset deployment 

インストール

$ bundle install --no-deployment
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production

Gemfile に追記

gem "activerecord-compatible_legacy_migration"

再起動

$ passenger-config restart-app

docker compose した rails アプリだと Gemfile.lock が更新されないらしい?
再起動できてないのかコンテナを落とし上げしたら反映された。

inkdrop - sidetoc plugin v1.6.0 release

  • ヘッダの数が多い場合にスクロールするように修正 (けど、ScrollIntoView による挙動が微妙)。
  • sidetoc を表示していない場合でもヘッダジャンプしたくなったのでコンポーネントを削除しないようにした。
  • ヘッダがない場合に微妙な隙間ができていたので表示しないように修正した。

ついでに 1.6.1 もリリースしていて codeblock 内のコメントがヘッダとして認識されていたのを修正した。