lemonade でマルチバイト文字がコピーできなかった現象とその顛末

TL;DR $LANG 設定しろ。


某月某日。私はとある問題に頭を抱えていた。

「なんでマルチバイト文字を含む文字列だけコピーできないんだ!」

私は lemonade を使い、ssh 先から文字列をコピーしようとしていた。

lemonade については過去の記事に紹介を譲る。

ところが、マルチバイト文字を含む場合のみ、クリップボードが空になってしまうのだ。ASCII 文字だけならばなんの問題もないというのに。

最初は lemonade のバグを疑ったが、仮に報告をしたとして、現在 lemonade はメンテナを募集している状態だ。修正される可能性は低いだろう。何より困っているのは私自身だ。

「自分で調査するしかないか…」

lemonade は Go 言語で実装されている。Go 言語は不慣れだが、幸いにも勉強しようと思っていたところだ。既存のソフトウェアのソースコードを読むのは大変勉強になる。ある意味丁度いい。

原因を調査するために、ソースコードを変更してログを仕込む。しかし、私の lemonade サーバは Mac で動いており、以下のような設定でデーモンとして起動している。

~/Library/LaunchAgents/lemonade.server.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>lemonade.server</string>
  <key>KeepAlive</key>
  <true/>
  <key>ProgramArguments</key>
  <array>
    <string>lemonade</string>
    <string>server</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
$ launchctl load ~/Library/LaunchAgents/lemonade.server.plist

このままでは標準出力に吐かれるログが見れない。いや、見る方法はあるのかもしれないが、そこまでは調べなかった。

ここはデーモンを止めて、コマンドラインから実行してしまうのがはやい。

$ launchctl unload ~/Library/LaunchAgents/lemonade.server.plist
$ lemonade server

これでログを見ることができる。

愚直に print デバッグを繰り返していると、とあることに気付く。

「あれ? …普通にマルチバイト文字送れてるぞ?」

そう、実はこの状態であれば lemonade はご機嫌に動作したのだ。

ここまで来ると原因が絞り込めてくる。この状態で動いているということは、lemonade のバグの線は消えたと言っていい。あとは環境の違いということになる。デーモンではダメで、手元のターミナルから直接実行だと動く。そして起きている現象は、マルチバイト文字に絡む…。

環境変数 $LANG 辺りが怪しいな」

そう思い立つと、適当に環境変数をファイルに出すプログラム sh -c 'env > env.txt' をデーモンに仕込んで、デーモン環境での環境変数を確認してみる。

思った通り、環境変数 $LANG が設定されていない。恐らくこれだろう。ということで、デーモンに環境変数を設定するように plist ファイルを以下のように書き換えた。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>lemonade.server</string>
  <key>KeepAlive</key>
  <true/>
  <key>ProgramArguments</key>
  <array>
    <string>lemonade</string>
    <string>server</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>EnvironmentVariables</key>
  <dict>
    <key>LANG</key>
    <string>ja_JP.UTF-8</string>
  </dict>
</dict>
</plist>

これで動かしたところ、無事、マルチバイト文字のコピーに成功した。世界に平和が訪れた。

後で知ったが、launchctl setenv などでデーモン全体の環境変数を設定することも可能なようだ。こちらでも良さそうだが、試していない。

Udon.vim #0 に行ってきた

はるばる行ったぞ初四国!というわけで Udon.vim #0 に行ってきた話。

うどん県上陸

神戸から深夜フェリーでうどん県へ。4 時間ほどの船旅。

フェリーだけど海っぽい揺れは全然なく、せいぜいエンジンっぽい揺れがあるくらいだった。フェリー感はあまりないけど、4 時間乗ることを考えるとこうなってないと船酔いする人がつらい。

結果的に使わなかったけど、横になって寝れるスペースもあり、そういう意味では高速バスより快適説があって、とてもよかった。本数が少ないのがネック。

本編

もくもく会ということで、私は前日に行われた関西Ruby会議2017のレポートを書く作業をしていた。香川まで行ってやることではない…。

ここまで来たからには交流メインでやるべきだったのだけど、たぶん話せてない人とかいた気がする(たぶん)。完全に失敗した。

他では、y0za さんの発表があったりして、とてもよかった。私も何か技術系の発表をすればよかったかも。次に遠征する際はちゃんと準備しよう。

懇親会

香川大学の学生さんが何名か参加していて、就活の話なども話題に上がった。

あとは、香川だけだと人が集まらないので、四国.vim をやるか、みたいな話題が上がった。次回は愛媛で柑橘類食べ放題の Vim 勉強会が開催されるとのもっぱらの噂。

うどん録

滞在中にうどんを 4 杯食べました。

1日目。

2日目。

うどんめっちゃおいしいのだけど、最低でも1玉単位で出てくるのでハシゴは2件までしか無理だった…。観光客向けに半玉ずつ提供とかあると嬉しい。

さいごに

主催してくれた @mozi_kke さん、宿を提供してくれた @koturn さん、その他参加された皆さん、ありがとうございました!

香川となると気軽に「また行きます」とまでは言えないけど、機会があればまた行きたい。

関西Ruby会議2017に行ってきた

関西Ruby会議2017に行ってきたのでいつものようにざっくり感想を。

スポンサーセッション - 株式会社Agileware

テストコードがないと push できないようにしたり、パフォーマンステストの自動化をしているのがとても良さそう。

具体的にどうやっているのか、気になった。テストコード必須はカバレッジかな?

基調講演 株式会社クリアコード - 須藤功平

発表資料: https://slide.rabbit-shocker.org/authors/kou/kansai-rubykaigi-2017/

OSSをやることがビジネスとして成り立つ。

実際、イケてる会社は OSS をやっているように感じるし、それによってイケてる人材が入っていってるように思う。あくまで印象だけど。

Ruby にはフルタイムコミッタというのもいるし、そういうのが成り立つのは素晴らしい。

Rubyでデータサイエンスを行うための取り組み - kozo2

発表資料: https://github.com/sciruby-jp/ruby-datascience-examples/blob/master/Ruby%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E5%8F%96%E3%82%8A%E7%B5%84%E3%81%BF.pdf

興味がなかったわけではないのだけど、朝早かったのもあり、途中で意識が途切れ途切れに…。

発表の本筋とはすこしずれるが、話で出てきた Apache Arrow が気になった。

エンタープライズRubyOnRails エンプラでぶち当たった2つの壁と突破法 - 田中宏

エンタープライスはやったことがないので、その定義からしてどういうものなのか全く理解していない…。

メンバー10人中経験者は1人だけ、というのは、エンタープライズの特徴なんだろうか? まったくわからない…。

わからないけど、自動化がんばってたのはすごい。

ところで一次データが Excel なの、差分取りづらそうだしコンフリクト起きまくりそうだけど大丈夫なんだろうか。わからない…。

Rubygem開発の流儀 - joker1007

発表資料: https://speakerdeck.com/joker1007/rubygemkai-fa-falseliu-yi

よくある gem を作る手順の話ではなく、どのような gem を作るかの話。

Vim プラグインを作る際にも、ほぼ同じ話が適用できるし、実際のところ私もよく意識している。

ただ私は、性格上最初からフル機能で作ろうとしてしまうことが割とあり、そこは反省したい…だから全然リリースできないんだ…。

コミュニティ文化の取り込みとその機会で得た知見 - muryoimpl

社内コミュニティは、作ったあと、どうやって参加してもらうのか、というところがとても難しそう。

強制するものではないし、強制して反発されてしまっては元も子もない。そこをどうやっているのか気になった。

Rubyistと技術記事 ~なぜ書くの?どう書くの?何が起きるの?~ - 伊藤淳一

発表資料: https://speakerdeck.com/jnchito/number-kanrk2017

読者ファーストの視点は私にはあまりなかった。この記事にもない。そもそも感想羅列してるだけだし…。

少なくとも感想記事の場合はあえて読者視点なくして書いていたりもする。わかりやすく内容をまとめる能力がないことは自分でわかっているので。

技術記事書くときは意識してみたいところ。ところで最近技術記事自体全然書けてないので、まずは書くところからだ…。

「CoderDojo」を支えるRails CMSの活用事例 - yasulab

発表資料: https://speakerdeck.com/yasulab/coderdojo-wozhi-eru-rails-cms-falsehuo-yong-shi-li

CoderDojo の存在を今回初めて知りました。こんだけ世界に広がってるのに知らなかったとは…。

内容は具体的な事例で、Scrivito の紹介とも取れるが、私としては、どのようにエンジニア以外に負荷を分散していくか、という話だと受け取った。

エンジニアの負荷を減らす仕事は本当に大事。自動化できるのが一番だけど、このように移譲も十分有効な手段。やっていきたい。

スポンサーセッション - 株式会社 Ruby開発

素直に会社紹介。関西の人向けのアピールだったので、東京から参加した私としては、そうなのかーみたいな感じだった。

基調講演 18年でRubyから学んだこと - 増井雄一郎

発表資料: https://speakerdeck.com/masuidrive/18nian-derubykaraxue-ndakoto-guan-xi-rubyhui-yi-2017

最初に増井さん自身が言っていたように、「役に立たない話」。

増井さんの個人的な人生の話だった。ぶっとんだ話が多くてすごい。

最後に Ruby は軸として締め括ったけど、私の場合はここでいう軸は「Vim」になるのだろうなー。

実際どの言語をやるにもまずは Vim なので、作業の意味でも軸として機能している感じ。

懇親会

IT 系勉強会の本番は懇親会なので、懇親会にも参加。

懇親会の中で、LT 大会が開催された。発表したい人が適当に発表していくスタイルだったが、LT 大会の開始から懇親会の終了まで、途切れることなく LT が続いて、熱量の高さを感じた。

久々に会えた人や、今回(たぶん)初めて会えた人とかもいて、行って良かった。顔を覚えるのが苦手なので次会う時までに覚えていられるかがかなり自信ないけども。(下手すると実は今回初めてではない可能性の人も…)

Fablic.vim #1 に行ってきた

Fablic.vim #1 に行ってきたよ。

イベントの詳しい内容は公式レポートに譲って、個人的な感想などを。

ピザ

まずは開始前にピザを頂きつつアイスブレイク。ピザおいしい。

本編

最前列の見やすい席で聴講。ゲーム系のプラグインで盛り上がった。最近作ってないのでまた作りたいなぁ。

飛び込みの発表が割とあったのも良かった。少人数なのもあって、そういうのがやりやすい空気。ハードル低いのよい(発表者のレベルは高かったので本当にハードルが低いかはちょっとわからないけど)。

懇親会

最初にピザを食べたけど、発表が一通り終わった後にも追いピザが来てとても良かった。これは最初早めに開始して、最初のピザが完食された後に本編に来た人がピザ食べられなくて大変残念だったので、急遽追加で用意されたもの。柔軟な対応と配慮が行われて大変素晴らしかった。

私はと言うと、puyo.vim のデモの流れで、@rbtnn さんぷよぷよテトリスSで対戦して盛り上がった。こういう時に Nintendo Switch は便利すぎる。とても良かった。

次回は7月頃とのことなので、また参加させてもらおうと思います。次は何か発表するかも。というか声がかかる予感がある。何か考えておかないと…。

Meguro.vim #3 を開催した

第3回目の開催となった Meguro.vim #3 を開催したよ。簡単に振り返り。

ランチ

カレーを食べました。

f:id:thinca:20170520121712j:plain

本編

割とぐだぐだに始まってしまったのが反省点。途中で自己紹介タイムを挟むことに。

全体的に、みんな自由に作業したり雑談したりできていたみたいで、雰囲気はとてもよかったと思う。この感じでやっていきたい。

途中、キーボード談義が発生して皆さんキーボードについてアツく語っていてとてもよかった。

会の最中に、遠隔地にいる @ttk_vim さんに、Meguro.vim のロゴを作ってもらった。かっこいい!本当にありがとうございます!

ばんごはん

中華を食べました。

f:id:thinca:20170520195422j:plain

確か9人くらいが参加。

ふり返り

今回こそ、ふり返りを実施しました。

https://github.com/thinca/Meguro.vim/issues/1

各位コメントを書いていく形式です。どなたでも参加可能です。宣伝されてなくてイベントの存在を知れずに参加できなかった、とか書いても大丈夫です。(実際どれくらいいるのか気になる)

次回

次回は 7 月頃を予定してます。一応具体的な日も決まっているけど確定ではないのでここには書かないでおく。

ElixirConf Japan 2017 に行ってきた

ElixirConf Japan 2017 に行ってきたよ。

最初に書いておくと、私は Elixir に関しては全く書いたことがなく、Erlang についても遥か昔にちょっとだけ触って、今は忘却の彼方という感じ。 さすがに行く前にチュートリアルくらいやっておくか、と思ってたのだけど、結局時間が作れなくてできずじまい…。

何しに行ったんだよ感がすごいけど、まあ色々と縁があったのでお邪魔しました。

感想を書くけど、こういうレベルなので適当なことや的外れなことを書いてると思う(いつものこと)。 (あと特に後半はバッテリー切れによりほとんどメモが取れてないので記憶がやばい。)

「Opening Keynote」 by José Valim

Elixir とはどういった言語なのか、その歴史と、未来の話、だと思う。たぶん。

ゆっくりしゃべってくれて聞きとりやすいと評判の英語だったけど、基本的なリスニング能力がそもそもないのでゆっくりだろうが聞きとれない程度の英語力でした。本当にありがとうございました。

Elixir も英語もわからないなりに聞いた感じ、型システムの導入を検討している点が興味深かった。型システムが入れば Elixir の売りの一つであるメンテナンス性も上がりそうな気がするし、型いいよね。

Phoenix で作るスケーラブルなリアルタイムゲームサーバー」 by hdtkkj

ミクシィのゲーム部門、XFLAG の方の発表。モンストの裏側の話。

Phoenix で作るにしてもやはり苦労ポイントは色々あるようで、なんかよくわからないけどすごそう(小並感)。

実際にサービスで動いているのかという質問に、実はまだ動いてないという回答は色々と察するものがあった。

「Elixir から始める関数型言語」 by tuvistavie

発表資料: http://tuvistavie.com/slides/elixir-fp-intro/

パターンマッチ、末尾再帰最適化、高階関数、イミュータビリティ、そしてイミュータブルな世界でどうやって状態を扱うのか。

最初に書いた通り、Elixir 入門以前みたいな感じなので、チュートリアル的な内容はとても助かった。私の場合、関数型を(ある程度)知っている視点で Elixir の機能を知ることができた。

= がパターンマッチなのはとてもおもしろい。ただ今は型システムがないようなので、型が入るともっと色々できるようになるのかなーと想像した。

「Elixir 導入提案」 by cooldaemon

gumi の CTO の cooldaemon さんが、 Erlang や Elixir とどのように出会い関わってきたか、みたいな話。いや、話の主題はそこではないけども。

SLA 99.9982% というキビしい条件が求められるところ、Erlang なら 99.9999999% が可能、と。Erlang まじすごい。

Erlang 導入したけど変更多い部分は Perl 強要されたり、Scala に浮気したけど Elixir に戻ってきたり、色々あって聞いてておもしろかった。特に Erlang 使いたいがために出世するというのがすごい。

というわけで gumi は今後 PythonErlang をやめて Elixir でリプレースしていくらしい。すばらしい。

「Elixir はリアルタイムWeb に強いというのは本当か?」 by mururu

発表資料: https://speakerdeck.com/mururu/elixirkariarutaimuwebniqiang-i-toiufalsehaben-dang-ka

難しくて完全に雰囲気で聞いてた…。プロセス可視化のやつが見た目すごそうな雰囲気出ててよかった。

Rubyist |> (^o^) |> Alchemist 〜Elixirの採用からサービス稼動までの記録〜」 by ohr486

発表資料: https://www.slideshare.net/ohr486/elixirconfjapan2017sessionohr486

どのようにしてチームに Elixir を導入するか。教育の手法などの話。

かなり具体的な実務的な内容で、これから Elixir を採用しようと思ったチームにとってすごく参考になりそうな話だった。

個人的にはそういった立場にないのでアレだけど、並列に動くように書けるか、とか、テストなんかの話もあったので個人で何かやる場合にも参考にできそう。

「ニコニコを支えるErlang/Elixir 〜 大規模運用して初めて見えたアレやコレ」 by kojingharang

発表資料: http://niconare.nicovideo.jp/watch/kn2397

ドワンゴの Elixir の導入規模がやばくて会場(TL)がどよめく。全体的にやってることが大規模かつ高レベルで、ただただすごいなーという感想だった。

なんか今発表資料見たら当日使われてなかった(収まらなかった?)ページが最後の方にあった。ツールちゃんと作ってるのもさすがだし見習いたい。

LT: 「Why did we decide to start using Elixir?」 by ma2ge

発表資料: https://speakerdeck.com/ma2gedev/why-we-decided-to-start-using-elixir

なぜ Elixir を使うのか、という問いに対して 3 つの理由を挙げている。

実際にはこれ、Elixir に限らずあらゆるものに対して適用できそうな理由なので、なぜ Elixir という問いの答えにはなってなさそうだけど、理由については共感できるものだし私も新しいことやって行きたいと思った。

LT: 「「Surge」 - Amazon DynamoDB for Elixir」 by hirocaster

発表資料: https://speakerdeck.com/hirocaster/surge-amazon-dynamodb-for-elixir

Surge の紹介。この辺りの基礎知識がなさすぎたので、キーワード聞いたら思い出す程度にとどめておこう。

LT: 「初心者のElixir |> Flow,GenStage |> Concurrent MapReduce」 by ovrmrv

発表資料: http://qiita.com/ovrmrw/items/14dc9907c2ec699f849c

Flow を使うと並列処理してくれてすごいらしい。すごい!

逆に言えば、いくら Elixir 使ってもちゃんと意識して書かないと並列にはならないってこと。当然だけど大事。

LT: 「AngulaとElixirの新しい関係」 by isyumi_net

発表資料: https://www.slideshare.net/ssuserd34c39/angulaelixir

Vim の設定が大変だった部分がどう大変だったのかが気になりすぎて他のことを覚えていない。ごめん。(単にフロントエンドよくわかってないというのもある)

LT: 「Elixirでbotkitを倒す」 by ne_sachirou

倒せなかったらしい…。

Botkit と Hedwig を比較した。Botkit は速いけど安全じゃない。Hedwig は、速くはないが安全。

LT: 「APIサーバーとしてのCowboy」 by hayabusa333

軽量サーバ Cowboy の紹介。そもそも Phoenix の内側で使われているのが Cowboy らしい。私なんかはそもそも Phoenix が Web フレームワークだということをこの日に知った感じなのでとてもアレ。

LT: 「Elixir client from OpenAPI(Swagger) definition」 by niku_name

発表資料: http://slide.rabbit-shocker.org/authors/niku/elixir-conf-japan-2017-04-01-lt/

Elixir 用の OpenAPI のアレ。Swagger はちょっと触ったことあるけど、あれいいですね。Elixir でも使えるというのはとてもよい。

LT特別枠(15分): Erlang and Elixir Factory SF Bay 2017 参加報告」 by jj1bdx

発表資料: https://speakerdeck.com/jj1bdx/erlang-and-elixir-factory-sf-bay-area-2017-can-jia-bao-gao

当然(?)ながら、私はこの Erlang and Elixir Factory というもの自体知らないわけなんだけど、いやはや会議日程がすごい。トレーニングやばい。

で、恐らく一番伝えたかったのは最後のスライド。「日本の皆さんもすごい成果出しているので発表しましょう!」

私も分野は違えど何かしてもあまり発表とかしたがらない人なので(あまり大したことはできてないけど)、割と他人事ではない気もしつつもうぐぐ…英語~。

「クロージング Keynote」 by Voluntas

発表資料: https://gist.github.com/voluntas/81ab2fe15372c9c67f3e0b12b3f534fa

ここまで、Erlang VM つよい!すごい!みたいな話が多かったけど、まあ当然いいことづくめってわけにも行かないわけで。欠点も知っておきつつ、長所が活きる場所で使う。そのために欠点の部分もちゃんとカバーされていたのはとてもよかった。

特に技術の dis って(今回のは別に dis ではないけど)、本当にその技術に精通している人だからこそできるものだと思う。最後にこの話が聞けてよかった。

まとめ的なやつ

ほぼ知識ゼロで参加したけど、全体を通して、Erlang VM はとにかく堅牢性が高い、落ちない、そしてとっつきづらい文法の Erlang にかわって、書きやすくメンテナンスしやすい言語として Elixir があるということがとても伝わってきた。

Erlang や Elixir が注目されている理由について今までピンと来ていなかったので、そこがわかっただけでもだいぶ収穫だった。

未経験で、場違いなんだろうなーとドキドキしながら参加して、実際場違い感はあったけど、思い切って参加してよかった。来年までにはチュートリアルやっておきます。

Meguro.vim #2 リベンジを開催した

Meguro.vim #2 リベンジなるイベントを開催したので、簡単にレポートっぽい何かを。

元々は 2/25 に Meguro.vim #2 が開催予定だったのだけど、私が風邪を引いてしまい開催できなかった…参加登録してくれた方には申し訳なかった…。というわけで、仕切り直して 3/25 に #2 リベンジという形でなんとか無事開催!

本編

今回はたまたま Osaka.vim #9 at Kobe が同じ日に開催されており、Lingr でお互い挨拶した結果、その場のノリでお互いの会場を 無駄に Google ハングアウトで繋ぐことに。こうしてサテライト会場っぽい感じになってとてもよかった。 どちらももくもく会だったので、もくもくしたりたまに発生する雑談の様子などをお互いに見ることができてとても良かった。別の機会でもできそう。もっとやって行きたい。

本編の内容では、duzzle.vim が空前の大ブーム。作られたのはかなり昔だけど、その完成度は高く、絶賛の声が多数。続編も望まれているので、みんなでプレイして続編を待ちましょう。

また、参加者は私を入れて 9 人と多くはなかったのに、事前に知らなかったけど実は(元)同じ会社の人が参加していた、みたいなのが 2 組も発生し、業界狭い事案だった。すごい。

晩ごはん

晩ごはん会は、出席率100%を達成!次回もこの調子で行きたい。あ、参加を強制するとかではなく。

おまけ: 試射会

今回は日程が Splatoon 2 の先行試射会と重なったので、思いきって試射会も一緒にやる形式にしてみた。実際に参加したのは、昼の部はほとんどおらず、ハードを持ってきたも私だけだったけど、夜はそこそこいて、@yysaki さんがハードを持ってきてくれたので大型のテレビとプロジェクタの2面で Splatoon 2 を遊ぶことができた。終了後も 1-2-Switch でかなり盛り上がってかなりよかった。

結果として何人かに布教することができたように思う。計画通り。

振り返り

実は終了後にアンケートも兼ねて任意参加で参加者みんなで KPT をやろうと思っていたのだけど、気付いたら月曜で今さらみんなに書いてくださいって言いづらくなってしまったので、反省。次回はちゃんと終わったあとまで考えて準備しないと。

あと、この記事自体書くのが遅すぎる。遅くても翌日には書きたいところ。この辺りも次回の課題。