Golangの文字列変数のコピーはO(1)

Go 言語の string は、他の多くの言語と違って nil にできない。string の「ゼロ値」(特定の値で初期化しない場合に格納されるデフォルトの内容)は空文字列だ。これを知ったとき、つい C++std::string を連想してしまい、「すると string 変数の代入は O(n) (高コスト)だったりしないか?」と少し気になってしまった。ということで、簡単な実験で検証してみた。

続きを読む

Windowsで使える各種Vimの設定ファイル置き場

最近すっかり Vim 好きになってしまったので、コマンドラインインタフェース (CLI) 環境があれば必ず Vim をインストールするようになった。で、先日 Bash on Ubuntu on Windows を導入したことで自分の Windows 環境には 4 つもの vim が同居することになり、設定ファイル置き場について頭がこんがらがってきた。良い機会なので、Vim の設定ディレクトリの場所を調査・整理してみた。

まず前提として、使っている各種ソフトウェアのバージョンなどは以下の通り:

CLI環境 環境上でのパス 実体のパス(標準的な設定の場合)
msys2 (%HOME%未設定) ~/.vim/ C:\msys64\home\USERNAME\.vim
Git for Windows (%HOME%未設定) ~/.vim/ C:\Users\USERNAME\.vim
Bash on Ubuntu on Windows ~/.vim/ Windowsのパスではアクセス不可)
Windows版vimKaoriYa版vimも) %UserProfile%/vimfiles C:\Users\USERNAME\vimfiles

なお Windows環境変数として HOME を設定してやると、msys2 と Git for WindowsCLI 環境における ~ はそのディレクトリを参照するようになる。したがって、HOME を設定すると msys2 と Git for WindowsVim は同じ設定ディレクトリを読みに行くことになる点に注意が必要かな。とはいえ Git for WindowsCLI 環境は msys2 のサブセットなので、まず問題になることは無いだろう。

古いWindows 10でコマンドプロンプトのカラーテーマをアップグレードする

2017年8月2日にリリースされた Windows 10 の build 16257 でコマンドプロンプトがフルカラー(24ビット)に対応し、それと同時にコマンドプロンプトの標準カラーテーマ(配色)も更新された。しかしこのカラーテーマ、build 16257 以前の Windows 10 をアップグレードしても有効にならない。そこで、古い Windows 10 で新しいカラーテーマを使うための設定方法を書いてみた。

  • 新旧のカラーテーマの違い
  • カラーテーマを規定値に適用する
  • コマンドプロンプトを使う既存のショートカットは作り直す
  • 補足:「カラーテーマ」について
続きを読む

テキストエディタの禁則処理

SourceForge.JP で運営しているプライベートプロジェクトの Azuki の開発が止まっています。ただしプロジェクト管理システムから見ると止まっているだけで、水面下では次期バージョンに向けて「禁則処理」と呼ばれる処理を試し実装しています。何もしていないワケではないのです🙂

禁則処理は日本語特有と思われるルールです。代表例は「行を句読点で始めてはいけない」というルールでしょうか。要するに読みにくい「見た目」にならないようにするのが目的のルールです。しかしこの禁則処理、実は私自身がまったく普段使わないのです。はい。そのため、普段とはまったく違った作業の進め方を試しています。普段の開発では、複雑な処理であっても「設計、実装、テスト」の3段階で進めていきます。しかし今回の禁則処理については自分が使わない=知らないことが原因で多くの問題を設計時に見落とすのではないかと考えました。そこで現在は、捨てることを前提にしたプロジェクトのコピーを作って試行錯誤をしています。ガチャガチャと無責任にコーディングするのは楽しいものです。

捨てることを前提に雑な実装を重ねてガチャガチャやった結果、やはりいくつか気付いていなかった問題が出てきました。その中で一番大きな収穫は、次のような場合の対応です。

  • 折り返し幅が[(あ)]という文字列の最後の文字あたりに該当している
  • 行頭禁則と行末禁則により、[(あ)]が次の行の頭に表示されている
  • この状態での後ろにもう一つを追加する

このような状況になった場合、正しくは[(あという前半の文字列が前の行に移動しなくてはいけません。もし最初から[(ああ)]だった場合を考えると禁則処理は次のように進むからですね。

  1. 折り返し幅が[(ああ)]という文字列の最後の文字あたりに該当している
  2. 通常の折り返し処理でが次の行の頭に移動
  3. しかしは行頭禁則によって行頭にあってはいけないので一文字余分に次の行へ送る、つまり次の行頭に)]が来る
  4. しかし)]は行頭禁則により行頭に来てはいけないのでさらに一文字余分に次の行へ送る、つまりあ)]が次の行頭に来る
  5. ここで禁則に反する状態ではなくなるので、折り返し位置を確定する

ある行で文字を追加したときに「その行より前の行に」影響が出る場合は珍しいので、完全に想定外でした。いやはや、勉強になったです(なお単純な英文ワードラップでもスペース入力によって割られた単語の前半が前の行末に移動するケースがあるので、禁則処理特有の話ではありません)。

ちなみに[(あ)]の場合、さきほどの禁則処理の 5 番目の時点で行末がになり、禁則に反する状態になります。そのためが次の行へ送られ、さらに行末禁則でが次の行に送られる結果となります。さらにちなみに、のかわりにa、つまり[(aa)]だった場合は英文ワードラップによって真ん中で割られることなく全体が次の行へと送られます。うーん、複雑です…もう一回設計しなおすべきかな。

なおこの水準まで禁則処理をしっかり実装しているテキストエディタは少なかったです。参考にした 15 種類の日本語テキストエディタの中では、秀丸、Ginnie、真魚[まな]、Mery の4つ。まあここまで要求するユーザもほとんどいないと思いますので、開発者のこだわりの成果だろうなと思います。あっぱれ😉