いけむランド

はてダからやってきました

古い chrome をインストールする

CI で docker イメージをつくらずにスクリプトで常に最新の chrome をダウンロードしてたりすると、version up された時に CI がこけるようになったりするので、できれば version 指定しておきたい。(まあ、docker イメージをつくっておけよという話ではあるが。)

http://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages を見ると、古いバージョンが置かれているかはわかるが、"deb pool main google-chrome-stable" とかでググると、ミラーが微妙に同期されていないせいか、かなり古い chrome も見つかったりするので、そちらからダウンロードしてみると良いかもしれない。

メーリングリストに登録するというハードルの高さ

あまりに GitHub を使った開発に慣れきってしまったため、バグレポートやパッチは「まずメーリングリストに登録して」みたいな文章を見るだけで、一気にハードルが高く感じてしまって、やる気がなくなってしまう。

そういうものに限って、世界的に使われているデファクトスタンダードだったりするため、対応してもらわないと、こちらの手間がものすごくかかったりする。

たまに GitHub への mirror や、repository 自体の公開をしてくれているものはあるけど、pr/issue が禁止されていたりするため、結局ソースコードビューワ的な効果しかない。それでも latest tarball しかリンクしてないものに比べれば、だいぶありがたい。

やっぱり歴史が古いものほど開発プラットフォーム移行の腰が重くなるのはわかるが、現代においては「気持ち的にはクローズドソース」だなあと感じてしまうことがある。

RubyKaigi 2018 に行ってきたので小並感を書く

Day1

Keynote

  • 生 Matz 初めて見た。

Lunch

  • 牛タン弁当
  • スタンプラリー
  • どら焼き祭り
    • クッ社さんのどら焼きはずんだ&餅で一味違った
  • フロッピー獲得

Analyzing and Reducing Ruby Memory Usage

  • 「草生えるで有名になった」で草
  • 5000 兆円ほしい
  • 「簡単でしょ」と言いながら diff が長い

Hijacking Ruby Syntax in Ruby

  • 通訳泣かせの高速トーク
  • Binding の万能感

Afternoon Break

  • 電源がないので GitHub さんのブースにみんな群がる

TTY - Ruby alchemist’s secret potion

RubyGems 3 & 4

Exploring Internal Ruby Through C Extensions

  • デカ外人クイズ
  • C/C++ の他の hash lib でも検証してほしかった
  • メインホールの肘掛けが開いてサイドテーブルが出てくるツイートが 1 時間ごとくらいに流れてきてた

LT

  • ruby is dead every year

RubyKaigi 2018 Official Party

  • LT で windows 版の話が出てたのでメンテナの方に Cygwin 版はどうなってるか訪ねたら、担当者不在ということでした。(ワンチャンある?)

Day 2

Sponsor session (SmartHR)

  • 社長が人が欲しい気持ちをぶっちゃけ過ぎてて草

My way with Ruby

  • 「まつもとさんという言語デザイナーの方」がいらっしゃるそうです

Faster Apps, No Memory Thrash: Get Your Memory Config Right

Lunch

  • トランプタワー

Improve Ruby coding style rules and Lint

  • デカ外人クイズ
    • 正解はバナナソングでも可

Firmware programming with mruby/c

  • オフィス内の二酸化炭素濃度が上がると Slack に Alert が飛ぶ
  • トマト推し
  • Nice Lake

RNode with code positions

Type Profiler: An analysis to guess type signatures

Ruby Committers vs the World

  • backtick あまり使われていないなら地上げして method symbol にしたい
  • 任意の end に ensure をつけられるようにすると else さんの存在意義が...
  • OS 特有の話になると、コミッタ以外置いてきぼりで流速がガクッと下がる

Day 3

Parallel and Thread-Safe Ruby at High-Speed with TruffleRuby

  • 会場の自販機から RedBull が消える (売り切れ)
  • Graal で殴ればとりあえず速くなる風潮
  • 180fps とか初めて見た

Grow and Shrink - Dynamically Extending the Ruby VM Stack

  • 先生がインターン売り込みするのヤバい
  • 大学の発表会っぽい感じだった

The Method JIT Compiler for Ruby 2.6

  • こちらも同時通訳泣かせの速度
  • C is dead
    • 答 : コロンビア

LuaJIT as a Ruby backend

  • LLVM を JIT にするのは最近は流行ってない
  • コンパイラ最適化と Lua/LuaJIT についての説明がかなりの割合だった
  • 結局ものはできていないので次回に期待したい
    • SCDD (進捗だめです)

How happy they became with H2O/mruby, and the future of HTTP

  • printf デバッグになっちゃうよねー

JRuby 9.2 and Rails 5.x

  • ここでも Graal
  • C extension どうするんじゃい問題

TRICK 2018 (FINAL)

RubyKaigi 2018 After Party

  • なんだかんだでいつものメンバとしか話せなかったが良かった

  • 疲れてた&風邪をもらったぽかったので不参加
  • どうやら「川」が RubyKaigi の本当の本番らしい

Wait for ajax on Rails5 (without jQuery)

ボタンをクリックするなどして、画面が変わったことを待ってから、テストをしたい場合に、処理完了を待つ snippet がぐぐるとけっこうでてくる。

robots.thoughtbot.com

要するに jQuery.active に通信数が保存されているので、これが 0 になるまで待つというのが定石らしい。

stackoverflow.com

ところが Rails5 だと脱 jQuery 化しているようで、これだと完了を検出することができない。

公式の issue でも言及されているようで現時点では解決されていないようである。

github.com

仕方ないのでテストが成功するまでループするやっつけコードを使うことにした。

def wait_for
  Timeout.timeout(Capybara.default_max_wait_time) do
    loop do
      break if yield
    end
  end
end

wait_for do
  actual == expected # RSpec の expect(...).to で書きたい...。
end

capybara & chrome でテスト時に画面外を click できなかった → Element#hover で解決した

以前に capybara & chrome でテスト時に画面外を click できなかった問題をスクロールで解決したのだが、画面がさらに長くなるような修正を入れたところ、スクロールが完了する前に click をしようとして、エラーになるようになってしまった。

fd0.hatenablog.jp

続きを読む

charlock_holmes を bundle install するのに苦戦した

タイトルそのまんまです。

github.com

環境は以下の通り。

$ uname -rs
CYGWIN_NT-10.0 2.8.2(0.313/5/3)
$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-cygwin]

bundle install すると extension のコンパイルでコケます。

g++ -I. -I/usr/include/ruby-2.3.0 -I/usr/include/ruby-2.3.0/ruby/backward
-I/usr/include/ruby-2.3.0 -I. -DHAVE_UNICODE_UCNV_H     -ggdb -O2 -pipe    -o
transliterator.o -c transliterator.cpp
In file included from /usr/include/unicode/utypes.h:38:0,
                 from /usr/include/unicode/translit.h:15,
                 from transliterator.cpp:5:
/usr/include/unicode/umachine.h:347:13: error: 'char16_t' does not name a type
     typedef char16_t UChar;
             ^

char16_tC++11 の機能であるため、g++ に -std=c++11 を渡さないといけないようです。 というわけで bundle config でオプションを設定する必要があります。(これを知るのにけっこう時間を食った。)

$ bundle config --local build.charlock_holmes --with-cxxflags=\"-std=c++11\"

bundle config の build.* は extconf.rb 内で with_config したものしか受け取れないのかと思ってました。

[追記] with_config してましたね。

$CXXFLAGS = (with_config("cxxflags", arg_config("CXXFLAGS", config["CXXFLAGS"]))||'').dup

積極性

「こんなことがしたいんですけどつくったら便利だと思いますか?」という内容の質問の issue を assign されても、そんなの自分で判断しろよボケとしか思わない。

それよりも「こんなことがしたいのでつくってみました。」という内容の pull request (実装がっつり) の reviewer に勝手に俺を assign する奴の方が 5000 兆倍信頼できる。

calm のインストールと mksetupini

はじめに

cygport が 0.23.0 になった時に既存の genini が使えなくなるという問題に遭遇した。

原因は cygport が生成する hint のファイル名が固定の setup.hint から変わってしまったことによるもので、genini は setup.hint 固定されている前提の処理であったため、hint ファイルが認識できなくなってしまったというものであった。

というわけでなんとかしたい旨を cygport に issue ってみた。


https://github.com/cygwinports/cygport/issues/1github.com


すると genini じゃなくて calm の mksetupini を使えばいいんじゃね?という返事をもらったので、さっそく試してみた。

インストール


github.com


残念ながら pip で入れようとすると別の calm というパッケージが入ってしまうようなので、仕方なく setup.py でインストールすることにした。

$ git clone https://github.com/cygwin/calm.git
$ cd calm
$ python3 setup.py install
$ rehash
$ which mksetupini
/usr/local/bin/mksetupini

実行


普通に実行しても、いろいろとエラーを吐かれたため、最終的には以下のようなオプションをつけての実行となった。

$ mksetupini --arch x86_64 --inifile ./x86_64/setup --okmissing required-package --releasearea .
$ xz ./x86_64/setup
  • genini とは異なり、結果を stdout に出してはくれない。(そのため、あとから xz している。)
  • releasearea はデフォルトだと /sourceware 配下にあることを想定する。そのためオプションでカレントを指定した。


あと、追加で calm のソースコードをいじって、categories に Emulators など過去に存在したカテゴリを追加した。(ここで宣言されていないカテゴリが yacp に残っており、それらが存在するとエラーとなり、setup.ini が生成されなかったため)


time で実行時間を確認したところ genini の 2/3 くらいになったように見えた。

$ gtime ./genini --recursive x86_64 > /tmp/setup.ini
29.17user 7.23system 0:51.42elapsed 70%CPU (0avgtext+0avgdata 60227584maxresident)k
2367inputs+0outputs (258major+112605minor)pagefaults 0swaps
$ gtime mksetupini --arch x86_64 --inifile /tmp/setup.ini --okmissing required-package --releasearea .
17.31user 4.70system 0:33.37elapsed 65%CPU (0avgtext+0avgdata 192790528maxresident)k
1950inputs+3outputs (676major+34400minor)pagefaults 0swaps