basyura's blog

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

GitLab - Hashed Storage

v10.0 からリポジトリパス(/var/opt/gitlab/git-data/repositories 配下のパス)をハッシュ化する機能がリリースされていて、v12.0 でデフォルト ON に変更された。

プロジェクト名やグループを変更した際にディスクのパスが変更されていたけど、プロジェクトID を hash 化したパスを使うことでそれがなくなった。特定のグループに偏ることなくフラットに配置されるので色々とディスクに優しくなるらしい。

管理画面でプロジェクトのパスを確認できる。

To access the Projects page, go to Admin Area > Overview > Projects
and then open up the page for the project.
The “Gitaly relative path” is shown there, for example:
"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"

新規のプロジェクトを Hashed Storage にするかは管理画面で設定できる。

1. Go to Admin > Settings > Repository and expand the Repository Storage section.
2. Select the Use hashed storage paths for newly created and renamed projects checkbox.

ID 指定で migration できる。

sudo gitlab-rake gitlab:storage:migrate_to_hashed ID_FROM=50 ID_TO=100

逆に元のプロジェクト名のフォルダ構成に戻す方法もある

sudo gitlab-rake gitlab:storage:rollback_to_legacy

Rails console から該当プロジェクトを引く方法もある。

Project.find(16).disk_path
ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project

いろいろ機能追加されていってて便利に。

dokuwiki で plantuml

dokuwiki に前からある plantuml plugin はそのままじゃ動かなくなってて、代わりに plantumlparser ができてた。 ただ、サーバーを指定できなくて plantuml 公式の方にリクエストを投げるしかなかった。 せっかく社内に docker で plantuml サーバーを立てたのでこちらに投げたいと思っていたらちょうど MR が作成されてた。

MR がマージされたので、さっそくインストールしてセットアップ完了。

plantuml を動かせる環境が増えたのでまた一つ便利に。

docker x509: certificate has expired or is not yet valid

docker x509: certificate has expired or is not yet valid

windows に入れてた docker toolbox の証明書がいつの間にかきれてた。

You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.

docker-machine regenerate-certs を実行するとよいらしいのだけど実行しても更新されたふうに終わるものの改善しない。 --client-certs を付けるとさらによいらしいのだけど古すぎて指定できない。かといってアップデートするのも怖い。

コンテナで動かしてるサービスは動くからいいのだけどバックアップが取りたい (データの置き場を別にしとくべきだったんだけど)。

virtualbox を開いて直接コンソールを叩けることを確認。さらに git bash からも入れることを確認。

$ ssh localhost -p 3327 -l docker
$ docker-machine ssh

ssh で入ってコマンドを叩けることを確認。

$ docker-machine ssh default free

bat で git bash 経由でコマンドを実行できることを確認。

"C:\Program Files\Git\bin\sh.exe" --login -i -c "ls"

バックアップを生成する sh をコンテナ内に置いといてキックして結果をコピーしていくリレー方式でバックアップ取れるようにできた。

f:id:basyura:20200422225946p:plain

docker のバージョンを上げてきれいに作り直したい。

nginx + plantuml

docker で plantuml 入れたら終わりと思ったらポートは 80 しか開放してなくてホストの nginx で振り分ける構成になってた。

http://サーバー:8081/plantuml のように prefix を付けてアクセスするためには webapps/ROOT.warwebapps/plantuml.war に変えればいいだけだった。

$ docker exec -it plantuml /bin/bash
$ pwd
/var/lib/jetty
$ cd webapps
$ mv ROOT.war plantuml.war

nginx の設定を conf.d に置く。

server {
    listen       80;
    server_name  localhost;

    location  /plantuml/ {
        proxy_pass   http://localhost:8081/plantuml/;
    }
}

nginx の再起動

$ nginx -s reload

これで http://サーバー/plantuml でアクセスできる (はず)。

dokuwiki も java 入れたりしなくても plugin 設定でサーバ url 指定すればよかったので、plantuml のサーバを一個立てればいろいろ使えそう。 confluence でも使えるようにしたいけど設定周りを触ったこと無いのでよく分からない。

Inkdrop - PlantUML Plugin

手元でも UML (クラス図とシーケンス図くらい) を書きたいけど、公式サーバ ( https://plantuml.com/plantuml ) にリクエストを送りまくるのも嫌なので会社の適当なサーバにこっそりコンテナを追加したいのでローカル環境でまずは試してみる。

$ docker run -d -p 8081:8080 plantuml/plantuml-server:jetty

Server Url を http://localhost:8081/ に変更。

f:id:basyura:20200413220202p:plain

適当に書いてみる。

f:id:basyura:20200413220504p:plain

便利。

go - xlskiller

ActiveX な社内システムなせいか、タブ化するソフトを入れてるせいか Excel のプロセスが大量に残ってしまうことがよくある。タスクマネージャーから消すのもだるいのでプロセスを kill するやつ。

package main

import "github.com/shirou/gopsutil/process"

import "fmt"
import "strings"

func main() {
    procs, err := process.Processes()
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, proc := range procs {
        name, err := proc.Name()
        if err != nil {
            continue
        }
        if strings.HasPrefix(name, "EXCEL") {
            fmt.Println("Kill " + name)
            err := proc.Kill()
            if err != nil {
                fmt.Println(err)
            }
        }
    }
}

inkdrop-vim v2

プレビューモードでスクロール

v2 にメジャーバージョンアップしてプレビューモードでも j k ctrl-d ctrl-u でのスクロールができるようになって便利。ctrl-d ctrl-u の挙動が半ページスクロールじゃなくて 1 ページスクロールになっていたので通報したらすぐ直してもらえた。嬉しい。

keymap.cson に定義していたキーが効かなくなったのがびっくりしたけど prefix が vim-mode から vim に変わったようだ。

'.CodeMirror.vim-mode:not(.insert-mode):not(.key-buffering) textarea':
    '0': 'vim:move-to-first-character-of-line'
    'ctrl-e': 'vim:move-to-last-character-of-line'

今までは常にエディタモードだったけどプレビューモードも有りかなと思い始めてる。となると、Hit a Hint が欲しくなっちゃう。

リンクを開きたい

normal mode で enter 時に url をブラウザで開くか、note の場合はそれを表示する挙動をしたくて PR を送ったら本体で実装してくれる回答をもらったので楽しみにしている。今のところは以下を定義して待機中。

init.js

inkdrop.commands.add(document.body, "mycmd:open-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
    });
  }
});

keymap.cson

'.CodeMirror.vim-mode:not(.insert-mode):not(.key-buffering) textarea':
    'enter': 'mycmd:open-link'

僕の実装だとカーソルが左端に合って url も左端から記載されてる場合にリンクが判定されないのがちょっともにょる。カーソル行にあるリンクを開くような挙動にしても良さそう。

まとめ

またひとつ便利になった。

プレビューモードで見るとタイポを見つけやすいのはなんなんだろう。 紙に書いてたのを印刷したら間違いが分かりやすいのに似てる。