2017/11/08


追記

CreationFlags に直接指定出来ますね...

package main

import (
    "log"
    "os/exec"
    "syscall"
)

const (
    _IDLE_PRIORITY_CLASS = 0x40
)

func main() {
    cmd := exec.Command("notepad")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        CreationFlags: syscall.CREATE_UNICODE_ENVIRONMENT | _IDLE_PRIORITY_CLASS,
    }
    err := cmd.Start()
    if err != nil {
        log.Fatal(err)
    }
    cmd.Wait()
}

追記ここまで

先日 GoCon に参加した際、牛乳を吹いてるアイコンの人に「Golang で優先度を変えてプロセスを起動するにはどうしたらいいんでしょうね」というお題を貰ったので書いてみました。

syscall には必要な API しか持ってないので API を持ってくるところが若干めんどくさいですが、出来る事は出来ます。プロセスをサスペンド状態で起動しておき、優先度を変更後にリジュームします。(起動後いきなり激しい動きをするヤバい奴がいない事もない)

package main

import (
    "log"
    "os/exec"
    "syscall"
    "unsafe"
)

const (
    _CREATE_SUSPENDED        = 0x00000004
    _IDLE_PRIORITY_CLASS     = 0x40
    _PROCESS_SET_INFORMATION = 0x0200
)

var (
    kernel32             = syscall.NewLazyDLL("kernel32")
    procSetPriorityClass = kernel32.NewProc("SetPriorityClass")
    procOpenThread       = kernel32.NewProc("OpenThread")
    procResumeThread     = kernel32.NewProc("ResumeThread")
    procThread32First    = kernel32.NewProc("Thread32First")
    procThread32Next     = kernel32.NewProc("Thread32Next")
)

func resumeChildThread(childpid interror {
    snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPTHREAD, 0)
    if err != nil {
        return err
    }
    defer syscall.CloseHandle(snapshot)

    const _THREAD_SUSPEND_RESUME = 0x0002

    type ThreadEntry32 struct {
        Size           uint32
        tUsage         uint32
        ThreadID       uint32
        OwnerProcessID uint32
        BasePri        int32
        DeltaPri       int32
        Flags          uint32
    }

    var te ThreadEntry32
    te.Size = uint32(unsafe.Sizeof(te))
    ret, _, err := procThread32First.Call(uintptr(snapshot), uintptr(unsafe.Pointer(&te)))
    if ret == 0 {
        return err
    }
    for te.OwnerProcessID != uint32(childpid) {
        ret, _, err = procThread32Next.Call(uintptr(snapshot), uintptr(unsafe.Pointer(&te)))
        if ret == 0 {
            return err
        }
    }
    h, _, err := procOpenThread.Call(_THREAD_SUSPEND_RESUME, 1uintptr(te.ThreadID))
    if h == 0 {
        return err
    }
    defer syscall.Close(syscall.Handle(h))

    ret, _, err = procResumeThread.Call(h)
    if ret == 0xffffffff {
        return err
    }
    return nil
}

func main() {
    cmd := exec.Command("notepad")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        CreationFlags: syscall.CREATE_UNICODE_ENVIRONMENT | _CREATE_SUSPENDED,
    }
    err := cmd.Start()
    if err != nil {
        log.Fatal(err)
    }

    hProcess, err := syscall.OpenProcess(_PROCESS_SET_INFORMATION, trueuint32(cmd.Process.Pid))
    if err != nil {
        log.Fatal(err)
    }
    r1, _, err := procSetPriorityClass.Call(uintptr(hProcess), uintptr(_IDLE_PRIORITY_CLASS))
    if r1 == 0 {
        log.Fatal(err)
    }
    syscall.CloseHandle(hProcess)

    resumeChildThread(cmd.Process.Pid)
    cmd.Wait()
}
Posted at by



2017/11/05


11/05、プログラミング言語 Go 言語のカンファレンス、GoCon に参加してきました。

今まで Go に色々コントリビュートしてきましたが、Go に関するイベントには一度も参加した事が無かったので、ゲストとして呼んでは頂きましたが、応募してもなかなか当選しない GoCon に呼んで頂けたのは、一参加者として嬉しい思いでした。

六本木ヒルズのメルカリ社で行われました。朝、会場に向かっていると前に座っていた人が突然声を掛けてきて「ファッ?」と驚きましたが、顔を上げると kaoriya さんが居てビックリしました。

実は今回、嫁に VimConf2017 と GoCon に参加するという話をした際、「は?トークを聞きに行くんでしょ?」と言われ、何度も「いや、僕が話しに行くねん」と説明しました。家族に理解を得るのは難しい物です。

六本木ヒルズ

会場はとても綺麗でした。

メルカリ社

トークが始まる前、会場のスクリーンに僕の無 修正アイコンが貼られており、なんとも言えない気持ちになりました。本当にありがとうございました。

トークは cubicdaiya さん、kaoriya さん、qt_luigi さんと僕の4人で色々なお話をさせて頂き、また皆さんのお話も聞かせて頂きました。僕一人じゃちょっと心細かったので非常に助かりました。オッサンギャグの一つでも言えば良かったなぁと後悔しております。普段、あまり表舞台に出ないので緊張したけれど、普段僕が Go についてどんな事を考えてるのか少しだけでも皆さんに伝えられて良かったと思います。

トークが終わった後、Gopher のTシャツを2枚貰いました。Gopher コレクションが増えて嬉しいです。

貰った

ちなみにこれまでの Go 関連のコレクションは Gopher の青い方のぬいぐるみTシャツブランケット でしたが、今回 Gopher のステッカーとピンクのぬいぐるみ、Tシャツ2枚が増えました。行って良かった。

帰りがけに fatih のトークを少しだけ見せて頂きました。時間が無くて途中で帰ってしまったけれど、その後も面白そうなトークが沢山あってとても羨ましい思いで帰りました。

運営されたメルカリさん、Google さん、トークに参加頂いた方々、そして僕の他愛もない話にお時間を取って頂いた参加者の皆さん、貴重な体験をありがとうございました。

Posted at by




11/04、#vimconf2017 に参加してきました。

Vim の国際会議として開催される VimConf2017 に kaoriya さんからお誘いを受けたので参加してきました。電源は各席に付いていて、WiFi も完備、LAN ケーブルも繋がるし、会場も綺麗、弁当付き、コーヒー飲み放題、白い恋人、懇親会、LT、本当に本当に盛沢山で素晴らしい国際会議だったと思います。

Vim, Me and Community

haya14busa さんの Vim 人生を振り返り。haya14busa さんがコントリビュートしてきた EasyMotion、そして incsearch.vim というプラグインの機能紹介をしつつ、Vim 本体への incsearch の実装を分かりやすく説明してくれました。

僕ら古株 Vimmer には思いつかないアイデアだったと思います。Vim 初心者の方にも伝わる発表でした。

The Past and Future of Vim-go

vim-go の作者、fatih 氏による発表。僕は普段 Go言語をよく書いていますが、正直 vim-go が無いと Go を書くのが辛いくらい vim-go に依存してしまっているので、その vim-go の生い立ちを作者から聞けたのは良い体験でした。

Vim と Go の相性の良さが、vim-go を有名にしたと言って過言ではないでしょう。

Talk Show

kaoriya さん、k-takata さん、僕でトークショーをやってきました。僕と k-takata さんの Vim 使用歴の話から始まり、ここ最近の vim-jp の立ち位置、なぜ vim-dev でなく vim-jp で議論するのかといった話を皆さんにお伝えする事が出来て良かったと思います。

ちなみにこのトークショー前に壇上で皆さんの前で、すき焼き弁当を食べるという滅多にない体験をしてきました。貴重な体験でした。お弁当美味しかったです。

Creating your lovely color scheme

実は僕もカラースキームを作った事があります。Vim に同梱されている shine.vim (シャイン) というカラースキームです(「社員」でも「死ね」でもない)。ただその頃はカラーパレットを使って、色の色調を考えるといった事をしていなかったので、単にベース色の上に主張し過ぎない程度の色を選んだ程度の物でした。ちゃんと考えて作れば iceberg の様に綺麗なカラースキームを作れるんだなーと、良い勉強になりました。この発表は Vim に限らず色テーマを作る方であれば参考になる良い発表だっと思います。

vim-mode-plus: The most ambitious vim emulator in the world

Atom 上でありながら Vim という変則的な UI を作り出し、さらにその上でどの様に機能を足すかで新しい UX を作り出す事を考えていらっしゃる t9md さんらしい発表でした。僕たち開発者からは出て来ないかもしれないアイデアに目を見張る物がありました。0 から 1 を生み出そうとしている感が出ていて良かったです。

Vim and Compatibility

POSIX の在り方と Vim の在り方を照らし合わせた面白い発表でした。has() や exists() といった、Vim がバージョン相違問題の回避に使っている関数が出てきて、分かる人にはニヤニヤする発表でした。正直 Vim はバージョン毎に機能追加されたりデグレを起こしたりするソフトウェアです。ツギハギしながら成長した証が垣間見れます。

Shougo -Neosnippet.vim + Deoppet.nvim-

暗黒美夢王の発表。Shougo ware の近況報告と neocomplete.vim 終了のお知らせ。また neosnippet、deoppet について構想している内容について。個人的には UltiSnips や snipMate 等は、Vim の UX 上では開発しづらいと思っていて、僕が作っている sonictemplate.vim というプラグインはマーカーのリアルタイム編集は行っていません。ただ、僕らよりも補完に関する知見を多く持っている暗黒美夢王であれば、もしかするとまた新しい UX を作りだしてくれるかもしれません。

How ordinary Vim user contributed to Vim

dice_zu さんが Vim 本体に contribute した際の話。パッチは小さい物とご本人が仰っておられましたが、だれも直せなかったバグを直せた貢献度は、パッチの大きさには依存しないと思っています。とても良い発表で、僕の中ではこの日のベストトークでした。haya14busa さんの発表もそうでしたが、Vim のコミュニティは本体にコントリビュートしたいと思っておられる方が多く、vim-jp の志す所とマッチしていて本当に良い雰囲気となっているなと思いました。

The new syntax highlighter for Vim

Vim の syntax highlight を独自実装した話。言語のシンタックスを言語自身で AST に落とし、それを JSON で引き取って Vim の matchaddpos を使ってレンダリングするという方法。これも僕には思いつかなかった面白い方法だと思います。何か本体にフィードバック出来る物があれば、アイデアを持ち込んでみても良いのではないでしょうか。

You've been Super Viman. After this talk, you could say you are Super Viman 2 -- Life with gina.vim

alisue さんの gina.vim に関する発表。Vim の Git 関連のプラグインは数多く存在しますが、gina.vim の特徴的な部分を皆に伝える事が出来る良い発表だったと思います。僕は Git 関連のプラグインを使っていませんが、ぜひ今度試してみたいと思います。

懇親会

色々な方に喋りかけて頂けて頂き、本当に楽しめました。ありがとうございました。LT 飛び入りも楽しかったです。メルカリさんから配られた Vim バッジと Emacs バッジのうち、Emacs バッジの方が早く無くなったというのがこの日のハイライトでした。あとメルカリさんから Gopher のステッカーが配られており、さっそくノート PC に貼りました。

総評

実は今回、直接的なスタッフでは無かったのですが、サイトの更新等をお手伝いさせて頂いておりました。運営に関するお手伝いは出来なかったのですが、同じ slack で皆さんが色々な起きうるシーンを想定しながら、issue を書いて議論したり、名刺を作ったり、翻訳の為の打ち合わせをしたり、機材の準備をしたり、業者と連絡を取ったり、いろいろな準備をしているのを見て、本当に感謝の言葉しか出ない思いです。皆さん、本当にご苦労様でした。ありがとうございました。

おまけ

実は fatih を迎えるにあたり、当初外国人の渡航難しくなるのではという話が出ていたので、もしもの事を考えてスライドを作らせて頂いていました。

VimConf 2017 当日では運良くこのスライドが使われる事はありませんでしたが、せっかく作ったので発表形式ではありませんが公開したいと思います。

Posted at by