おかゆ++

IT業界の片隅で生き残るブログ

PixiJSで日本語フォントが見切れる問題の対応

f:id:okayu-moka:20190211160822j:plain

PixiJSのバージョンは4.8.4です。 指定のフォントで描画したいだけなのにすごく困った。

最初に結論

PIXI.TextMetrics.BASELINE_SYMBOLに適当な全角文字を追加してやればOK。

PIXI.TextMetrics.BASELINE_SYMBOL += "あ|";

詳細

以下は Mplus 1m regularで描画したとき。

f:id:okayu-moka:20190211155513p:plain

const width = 500;
const height = 200; 
const renderer = PIXI.autoDetectRenderer(width, height, {
  backgroundColor: 0x000000
});
document.querySelector("body").appendChild(renderer.view);
var container = new PIXI.Container();

var textStyle = new PIXI.TextStyle({
    fontFamily: ["M+ 1m"],
    fontSize: 24, 
    fontWeight: "normal",
    fill: 0xffffff,
});
var sprite = new PIXI.Text("Hogeあいうえお", textStyle);
sprite.anchor.set(0.5);
sprite.x = width / 2;
sprite.y = height / 2;

container.addChild(sprite);
renderer.render(container);

ただPIXI.Textを生成して描画しているだけですが、見切れます。

調べてみると、このあたりの話をしているissueがありました。

https://github.com/pixijs/pixi.js/issues/4228

どうもPIXI.TextMetrics.measureFontの中でフォントのサイズを測ってるみたいですが、ここで使ってるサンプルの文字よりも大きい文字があると、見切れちゃうみたいですね。

以下、pixi.jsから抜粋。

TextMetrics.measureFont = function measureFont(font) {
    ...
    var metricsString = TextMetrics.METRICS_STRING + TextMetrics.BASELINE_SYMBOL;
    var width = Math.ceil(context.measureText(metricsString).width);
    var baseline = Math.ceil(context.measureText(TextMetrics.BASELINE_SYMBOL).width);
    ...
    context.fillText(metricsString, 0, baseline);
    ...
}

ということで、PIXI.TextMetrics.BASELINE_SYMBOL に適当な文字列を追加してやればいい。 とりあえず "あ|" とか追加しておけば大丈夫じゃないでしょうか。

f:id:okayu-moka:20190211155525p:plain

Vim上でDeniteでagでQuickfixぽくgrepしたい

とても頭の悪そうなタイトルですが、やりたいことは書いてあるとおりです。

※注意:Vimと書いてますが基本NeoVimでしか確認してないです。

参考にした記事

ほぼ書いてあるまんまです。

qiita.com

vimgrep hoge **/*.* | cw のときみたいに、Quickfixっぽい感じで表示したり、 grepにマッチした箇所を順番に巡ったりしたい。

agにする

grep じゃなくて ag を使うように設定します。ag 使ったこと無いけど……

call denite#custom#var('file_rec', 'command', ['ag', '--follow', '--nocolor', '--nogroup', '-g', ''])
call denite#custom#var('grep', 'command', ['ag'])
call denite#custom#var('grep', 'recursive_opts', [])
call denite#custom#var('grep', 'pattern_opt', [])
call denite#custom#var('grep', 'default_opts', ['--follow', '--no-group', '--no-color'])

:Denite grep と :Denite -resume のショートカットを作る

  • :Denite grep -buffer-name=hogegrep結果のバッファに名前をつける
  • :Denite -resume -buffer-name=hoge:対応する名前のバッファを開き直す
  • :Denite -resume -buffer-name=hoge -select=+1 -immediately:次のマッチ位置へジャンプ
  • :Denite -resume -buffer-name=hoge -select=-1 -immediately:前のマッチ位置へジャンプ

ということで、これらを簡単に呼び出せるようにしておけば良いみたいです。

参考記事では <C-u>g などに割り当てていますが、個人的にはコマンドを作る方が好きです。

" grepする
command! Dgrep execute(":Denite grep -buffer-name=grep-buffer-denite")
" Denite grep結果を再表示する
command! Dresume execute(":Denite -resume -buffer-name=grep-buffer-denite")
" resumeしたgrep結果の次の行の結果へ飛ぶ
command! Dnext execute(":Denite -resume -buffer-name=grep-buffer-denite -select=+1 -immediately")
" resumeしたgrep結果の前の行の結果へ飛ぶ
command! Dprev execute(":Denite -resume -buffer-name=grep-buffer-denite -select=-1 -immediately")
  • :Dgrep:grepする
  • :Dresume:grep結果を再度開く
  • :Dnext:次のgrep結果
  • :Dprev:前のgrep結果

Vimでクリップボードと快適にやり取りしたい

小ネタです。

Vimクリップボード操作しようとすると、以下のような感じです。

ぅゎ面倒くさぃ……VSCodeしょ……

ってなったので、以下を vimrc に追加しました。

"--------------------------------------------------------
" クリップボードにコピー
"--------------------------------------------------------
" 選択部分
vnoremap <C-c><C-c> "+y
" 1文字
nnoremap <C-c><C-c> v"+y
" 単語
nnoremap <C-c><C-i><C-y> viw"+y

快適になってよかった話でした。

自作キーボードを作ります3-2 3号機あらためNatsumiひとまず完成

3号機が(一応)完成しました

自作キーボード3号機がひとまず完成しました。 今回のものは配列含めてとても気に入ったので、Natsumiという名前をつけました。

f:id:okayu-moka:20181014014059j:plain

f:id:okayu-moka:20181014014239j:plain

f:id:okayu-moka:20181014014547j:plain

f:id:okayu-moka:20181014014638j:plain

f:id:okayu-moka:20181014014825j:plain

f:id:okayu-moka:20181014015248j:plain

使用感

2週間ほど使ってみましたが、すこぶるいい感じです。

完全な格子配列より、こうやって少しずつずらした配置のほうが私は押しやすかったです。

また、今回採用したKailh BOXスイッチ茶軸もいい感じの打鍵感です。 2号機はGateron赤軸を使っていましたが、それよりも少し重く、でも軽すぎない、ちょうどいい打鍵感です。

次は基盤を作ってみます!

現状、2号機とおなじように空中配線で作ったのですが、せっかくなので基盤を起こしてみようかと思ってます。

ということで、勉強のために『自作キーボード設計入門(電子版)』を購入しました。 これみて勉強して基盤を起こして、そうしたら正式にNatsumiという名前で公開したいなぁと思っています!

booth.pm

自作キーボードを作ります3-1 3号機のモデリング&3Dプリント

自作キーボード2号機が完成してからずっと常用していて、概ね満足しているのですが、 色々試したいこともあり、3号機の設計をはじめました。

2号機については過去記事参照 okayu-moka.hatenablog.com

2号機の気に入っている点

  • 左右分割キーボードは正義
  • 基本的に格子配列Good
  • コンパクト
  • 3軸ケーブルでOK
  • 親指のキーに日本語IMEのON/OFFを割り当てるとすごく便利
  • 親指のキーにESCを割り当てるとVimですごく便利

2号機の不満点

  • 左右を接続するコードが中央から出ているので、キーボードの間にものを置くときに少し邪魔。
  • チャタリング対策が不十分で稀にチャタる。
  • 他のキーボードが本格的に使えなくなってきている
    • 前に使っていたHHKBすらあやしい
      • というか左右分割HHKBが出たらEndGameって人多いのでは

不満ではないが試したいこと

  • 格子配列以外の配列
    • ErgoDoxみたいに上下に少しズレてるやつ
    • HHKBの配列
  • ピンク以外の色

3号機の方針

全部をやるのは難しいので、以下の方針で作っていく予定です。

  • 当然左右分割
  • 小さく&薄く
  • 格子配列をベースに、ErgoDoxぽく上下に少しズラした配列にする
  • 左右接続のケーブルを奥側から出す
  • QMK Firmwareを導入する

まずは筐体のモデリング

こんな感じになりました。

f:id:okayu-moka:20180921231404j:plain

3Dプリンターで印刷!

f:id:okayu-moka:20180921231750j:plain

あとはキースイッチつけて、配線して……とまぁ、ぼちぼちやっていきます。

仕事用にMacBookPro 2018 13inchを買ってもらったのでセットアップする

仕事用に買ってもらいました!

たぶんこんな感じのスペックです。

13インチMacBook Proをカスタマイズ - シルバー

    第8世代の2.3GHzクアッドコアIntel Core i5プロセッサ(Turbo Boost使用時最大3.8GHz)
    True Tone搭載Retinaディスプレイ
    Touch BarとTouch ID
    Intel Iris Plus Graphics 655
    16GB 2,133MHz LPDDR3メモリ
    512GB SSDストレージ
    Thunderbolt 3ポート x 4
    バックライトキーボード - 英語(米国)

Xcode

GUIは使ったことないですが何かと要求されるっぽいので、AppStoreから入れておきます。 そのうちiOS開発にも手を出したい。

フォント

プログラミング用のフォントはMyricaをずっと使っています。 zipをダウロードしてきて入れました。

myrica.estable.jp

ターミナル(iTerm2)

特にこだわりはないので、定番っぽいiTerm2を使っています。 公式サイトからダウンロード→解凍→Applicationsへコピー でインストール。

Homebrew

これがないと始まらないっぽいので。

brew.sh

Vim

これがないと始まらないので……

brew install vim --with-override-system-vi --with-lua

Vimの設定周りはGitHubに上げてるのでcloneしてやれば引き継ぎ終わり。

github.com

Visual Studio Code

Vimと併用しているのでこっちも入れます。

code.visualstudio.com

拡張機能の Setting Sync を使っているので、gist経由で設定を引き継いで終わり。

Ruby(rbenv)

brewでサクッと入るんですね。便利。

$ brew install rbenv
$ rbenv install --list
$ rbenv install 2.5.1
$ rbenv rehash
$ rbenv install 2.5.1
$ rbenv global 2.5.1
$ echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

保留中の事項:

  • シェル変更 bash→fish
    • fishにしようかと思ってたけど、bash以外だとなんだかんだ変なところで詰まったりするので、 仕事用PCはbashのままにしておこうと思います
  • Railsのインストール
    • 環境が全部dockerで整備されてたので何もする必要なかった。素晴らしい。

3Dプリンタ HICTOP 3dp-08bk (RepRap) に施した改造まとめ

f:id:okayu-moka:20180707095037j:plain

HICTOP 3dp-08bkは、ほかのRepRap Prusa i3系プリンタと同じく、改造しやすい部類だと思います。

Thingiverse3dp-083dp08 で検索すると、いくつかパーツが出てきますので、プリントして使うといいです。

また、形状としては Anet A8 や A6 に近いみたいなので、それらのパーツを流用したりもできます。 (いざ印刷してみたら、形が合わないこともありますが……)

RepRapは自分自身でパーツを印刷して改造していくのも醍醐味だと思うので、バンバンいじっていきたいですね!

以下は、私が改造した内容や部品のまとめです。

ベルトテンショナー

X軸・Y軸のベルトテンションは結構、印刷精度に関わってくるみたいです。 いちいち分解してベルトを張りなおすのは手間なので、テンショナーを付けるといいです。 とは言ってもそう頻繁に調整するものでもないので、手軽さも考慮してパーツを選ぶといいと思います。

自分が使っているのは以下の2つです。

www.thingiverse.com

Y軸のベルトテンショナー。簡易なものですが必要十分です。

www.thingiverse.com

X軸のベルトテンショナー。こちらはAnet用のパーツですが、そのまま使えます。 ただX軸のベルトを切ってしまっていると、ベルトの長さが足りずに使えない可能性があります。 ベルトもAmazonなどで買えるので、いっそのこと買い直すのもアリだと思います。

Y軸のエンドストップスイッチを本体側にするためのマウント

www.thingiverse.com

初期状態では、Y軸のエンドストップがテーブル側についていて、ケーブルの取り回しなどが不便です。 というかすぐ断線しそうな雰囲気です。

なので、本体側にスイッチをつけられるようなマウントを作るといいです。

エクストルーダのファンダクト

www.thingiverse.com

初期のダクトはなんか頼りないので、定番っぽいこの形状のダクトに変えると良さげです

SDカードスロットを前に出す

RepRap系では、PCとUSBで接続して印刷する方法のほかに、SDカードからスタンドアロンで印刷する方法があります。 私は主にSDカードから印刷する方法を使っているのですが、スロットが本体後ろ側にあって使いづらい……ので、前に出しました。

やったことは、100均でSDカード⇔microSDカードの変換器を2枚買ってきて、余っていたケーブルをはんだ付けして作った適当延長器を取り付けただけです。作るのは割と面倒でしたが、これが超便利です。おすすめ。

オートレベリングに対応させる

Z軸の調整を半自動化できる、オートレベリングに対応させる改造をしています。 オートレベリングに対応させるためにはファームウェアの書き換えが必要なので、あんまり手軽じゃないですが、 先人の知恵を借りて何とか対応させました。

以下の記事を多いに参考にさせていただきました。ありがとうございます<( )>

nomolk.hatenablog.com

ちなみに改造後のファームウェアGitHubにアップしているので奇特な方は参考にしてください。

github.com

やっぱりオートレベリングがあると楽です。正直、最初から対応している機種を買うほうがいいかもしれないですね。

ハコで囲む

なんかのハコで囲んでやると、騒音防止、ホコリの混入防止、冬場の温度維持などの効果があります。

okayu-moka.hatenablog.com

正直、でかく作りすぎたorz でもまぁ騒音は圧倒的に抑えられるので、十分満足しています。