2023/11/20


はじめに

11/18、東京秋葉原のアキバプラザで、4年ぶりとなる VimConf、「VimConf 2023 Tiny」が開催されました。

今回、Kaoriya さんから「SoftwareDesign で執筆した内容で基調講演をして欲しい」とお願いされた際に、即答で OK をしましたが実は少し不安がありました。SoftwareDesign を事前に購入した人に同じ話を聞かせてしまうのは残念すぎないかという気持ちです。どうしようかとしばらく検討しましたが、SoftwareDesign の内容からスピンオフした内容にする事にしました。

規模が少し小さいとは言え、せっかく楽しみにきて頂いてる皆さんに、残念に思われないようにしたい、少しでも「来て良かった」と思って貰えるイベントにしたと思い、テーマは変えないまま色々な Bram Moolenaar 氏のエピソードを盛り込んだつもりです。

11/18 当日、僕は会場の受付で運営側としてノベルティの VimConf マスクを配布させて頂きました。(お気付きだっただろうか)

事前の PC 接続テストで Ubuntu Linux がうまく HDMI 出力できず最終的に KaoriYa さんのノート PC をお借りする事になった事だけが残念です。

発表の感想

以下は各登壇者の発表の感想です。

Λlisue さん (Revolutionizing Vim/Neovim Plugin Development ~ An In-Depth Look into Denops)

Vim と deno を RPC で繋ぎ、TypeScript で実装を行う事で、Vim をロックさせず、なおかつ型のある安全な実装をできる Denops という仕組みを実装した、ありすえさんの発表。Denops が生まれた経緯などがわかりやすく解説されていた。

Pros/Cons が説明されている点と、どんな物に Denops を適用すれば良いのかを解説していたのは良かった。AI との組み合わせはこれからの Vim 界隈でも増えていくと思いました。

ゴリラさん (Looking back at vim meetup)

ゴリラ.vim を発足した理由や、今も尚開催を継続しているモチベーションを説明いただきました。ゴリラさんの日頃からのモチベーションの高さは僕も皆も関心していて、逆にゴリラさんから熱いパワーを貰っている側面もあります。「まだ発表するには自分は早い」と言わずどんどん発表して欲しいとの事。次回開催は 12/13 です。次回開催は 12/13 です。(大事な事なので2度書きました)

大倉雅史さん (Developing a Vim plugin with Ruby, or when in Ruby do as the Rubyists do)

RSpec の使い勝手のよろしく無い部分を Vim で解決しようという話。英語での発表でありながらテンションの高さを表現されており素晴らしかった。個人的には LT の時の「マスタリング Vim」もテンション高くて良かったです。

kuu さん (Modern techniques for implements insert mode plugins / Why use IME within text editor?)

skkeleton の作者 kuu さんがインサートモード時の処理の難しさと skk.vim や eskk 等との比較なども。実は僕も Vim での SKK 実装を2回ほどやった経緯があり興味深く見せて頂きました。ちなみに SKK にチャレンジしたけど挫折した人は意外といるという知見を得ました。

aiya000 さん (Boost your vimrc with some template techniques!)

vimrc の基本的な構成の説明や、vital.vim が凄いという話をしていただきました。vimrc を書く上で便利な Lambda や辞書リテラル、メソッド記法、そして皆がまだ使ってないかもしれない String interpolation を解説して頂きました。僕個人もまだ String interpolation を使ってないのでどんどん使って行きたい。

ほか懇親会でも沢山 LT をしてくれた方がいて、とても楽しい会でした。

ところで

新型コロナウィルスが蔓延してテック系イベントが開催されなくなってはや数年、今年は開催しようという運営の判断で VimConf 2023 を開催しました。ただしギリギリまで決めかねていた事もあり、また4年という歳月が過ぎた事で、正直テキストエディタのシェアも変わっている可能性もあり、正直もしかするとユーザの多くが VSCode に移ってしまったかもしれないという一抹の不安もありました。運営としては極力、力を入れすぎない開催にしようという判断で VimConf 2023 Tiny と名付け、幾らか規模を小さくして開催する事にしました。

しかしその不安はすぐに間違っていた事に気付かされました。VimConf 2023 Tiny のチケットはあっという間に完売し、さらに SNS で「チケット買えなかった」「もっと参加人数を増やして欲しかった」と言われるほどでした。

そして何よりも Vimmer の皆さんの熱量が何も変わっていない事にとても嬉しく感じました。まだ VimConf を終えた直後ですが「また VimConf やろう」という気持ちも湧きました。そして今回、LT に Vim 好きの中学生がエントリしてくれました。メタバースで Vim の集会をやってる話をしてくれました。Vim 好きがちゃんと若い人たちにも育っているのを感じました。いい話すぎる。

今回、参加される皆さんにはマスクの着用をお願いしました。その為にマスクをノベルティとして配布しました。スタッフとして考えた末のノベルティでしたが当日、皆さんちゃんとマスクを付けて頂いていて本当に嬉しかったです。ありがとうございました。

今は無事 VimConf を復活させる事ができた安堵感でいっぱいです。

Posted at by



2023/02/20


2023/3/12 発売です。

Go が発表された当初から Go を見続けて来たので ずいぶん時間が経った気がします。僕なりにいろいろな活動をして来ました。Go 本体や周辺ツールへのコントリビュート、イベント登壇、雑誌への記事の投稿や「みんなのGo言語」の共著など。

あらゆる活動が Go づくめで刺激的でした。Go で得たものも沢山あります。そして Go を使う人も想像していた以上に沢山増えました。Go に関して書かれたブログ、Go の求人、今では大学で Go を教えているところもあるくらいです。Go を知った事で僕のプログラミング人生はずいぶん変わりました。それまでは何を作るにしてもC言語をメイン言語として使ってきましたが、今や新しいアプリケーションを書くのであればほぼほぼ Go で書くようになりました。(C言語/C++ は好きですよ)

クセが強いからか、なかなか理解され辛いプログラミング言語でもありますが、本質的には実用的なアプリケーションを効率的に開発する事ができ、それでいてマルチコア CPU でスケールするといった、とても高いポテンシャルを持った言語だと思っています。日頃からこの高いポテンシャルを持ったプログラミング言語「Go 言語」をもっと皆に正しく理解して欲しい、もっと沢山使って欲しいと思っていたところに、技術評論社さんから本書の執筆のお話を頂きました。

基本的な文法はほどほどに、並行処理の実装方法や、パフォーマンスを上げる為のテクニック、綺麗に書くための Tips、アプリケーションを順を追って解説混じりに実装する例、僕が Go で得た知識を沢山散りばめたつもりです。

Go はC言語を良くしたプログラミング言語でもある事から、いくらかC言語を意識した記述がされています。しかしC言語を習得していない人達でもなるべく理解頂ける様に心掛けたつもりです。Go というプログラミング言語がスクリプト言語の様な書き味を持ち、それでいて高速なアプリケーションが実装でき、さらには並行処理を扱うアプリケーションを簡単に設計・実装できるという事を、本書でご理解頂けると信じています。

ぜひ書店にて本書をお手に取ってご覧下さい。

Posted at by



2022/10/01


errors, fmt: add support for wrapping multiple errors · golang/go@4a0a2b3 · GitHub

An error which implements an "Unwrap() []error" method wraps all the non-nil errors in the returned ...

https://github.com/golang/go/commit/4a0a2b33dfa3c99250efa222439f2c27d6780e4a

Go でエラーを扱う際に、複数のエラーを束ねたい事があります。例えば複数のタスクを実行し、1つでもエラーになれば中断するのではなく、一通りタスクを実施し終えた結果を返したい様なニーズです。

package main

import (
    "errors"
    "log"
    "os"
    "sync"
)

func doMultiTasks(files []stringerror {
    var mu sync.Mutex
    var wg sync.WaitGroup
    var errs []error
    for _, file := range files {
        wg.Add(1)
        go func(file string) {
            defer wg.Done()

            f, err := os.Open(file)
            if err != nil {
                mu.Lock()
                errs = append(errs, err)
                mu.Unlock()
            } else {
                defer f.Close()
                // do something
            }
        }(file)
    }
    wg.Wait()

    return errors.Join(errs...)
}

func main() {
    err := doMultiTasks([]string{"not-found1""not-found2"})
    if err != nil {
        if errs, ok := err.(interface{ Unwrap() []error }); ok {
            for _, e := range errs.Unwrap() {
                log.Println(e)
            }
        } else {
            log.Println(err)
        }
    }
}

このコードは doMultiTasks に処理対象のファイル名を渡し、一通り実施した結果を返します。エラーを束ねるのに errors.Join を使います。束ねたエラーは通常踊り error として扱えます。ただし束ねたエラーを戻す関数は現状用意されていませんが、error を複数返す Unwrap という関数で型アサーションしてやる事で複数のエラーに戻せます。

また fmt.Errorf を使い書式フォーマットに %w を加える事でメッセージとエラーの両方を埋め込む事が出来ますが、本修正により複数の %w を埋め込む事ができる様になりました。

package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    err := fmt.Errorf("%w and %w", os.ErrNotExist, os.ErrClosed)
    if err != nil {
        if errs, ok := err.(interface{ Unwrap() []error }); ok {
            for _, e := range errs.Unwrap() {
                log.Println(e)
            }
        } else {
            log.Println(err)
        }
    }
}

個人的にはそれほど多いニーズとは思っていませんが、無くはない程度に感じています。

Posted at by