サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
インタビュー
watson.hatenablog.com
macOS 上で RubyのC拡張ライブラリのパフォーマンスを計測するために、 Xcode 付属の Instruments というアプリを利用してます。以前は特になにもしなくともパフォーマンス計測結果を見るときにソースコードが表示されてどの箇所がパフォーマンスが悪いか表示されていたのですが、年末年始に時間があったので久しぶりに試したらアセンブラコードしか表示されずに読み解くのがとても大変でした。 C拡張ライブラリをインストールするときに、コンパイルしたときに収集したシンボル情報をもとに dSYM を作成したら解決しそうだったので試してみました。 Ruby の mkmf.rb に手を加え、C拡張ライブラリをインストールする際に生成する Makefile に dSYM を作成するためのコマンドを追加しました。 diff --git a/lib/mkmf.rb b/lib/mkmf.rb ind
今日はReproでの最終出社日。思い返せば 30 歳も過ぎてから Ruby とどう関わっていくかという人生だった。 MacRuby (2010年~) 暇つぶしに Mac OS X のアプリを作ってみようかと思い立った時に出会ったプロジェクトだった。 今のように Swift や clang というコンパイラもなく、 Objective-C 言語というとにかく [] を書きまくらないとならずどうにもなじめなかった。もともと趣味で Ruby はさわっていたのでそれでアプリが作れたら良いのにと思っていたところで、渡りに船的にさわり始めたのがきっかけだった。 私がさわり始めたころはちょっとしたコードを書いてもすぐにクラッシュするような感じで、ちまちま「こういうコードを書くとクラッシュするんだけど何でだろう?」とプロジェクトの issue に書き連ね、気がついたら「こういう風に直すと動くようになるんだ
現在、Ruby 製 worker を作成することを業務で行っているのですが、継続的にメモリ使用量が増加する現象に遭遇してました。 (グラフの値が下がったタイミングが数回ありますが、それぞれでデプロイが行われてリセットされただけ) ObjectSpace.allocation_sourcefile や ObjectSpace.allocation_sourceline を利用してどのファイルのどの行でメモリ確保が多くなるのか調べれるようにしました。 以下のようなコードを worker に追加しました。 require 'objspace' class MemoryProfiler INTERVAL = 5 * 60 DISPLAY_COUNT = 20 def self.start Thread.start do loop do memory_usages = {} ObjectSpace.
FFI を利用して C のライブラリを呼び出す時のオーバーヘッドがどれくらいなのかと思い調べてみました。 使用したコード 呼び出し時のオーバーヘッドを知りたかったので、処理負荷がかからない単純に加算するだけのコードとしました。 int add(int x, int y) { return x + y; } 使用したコード一式は https://github.com/Watson1978/ffi-benchmark にあるので、興味がある方はそちらを参照ください。macOS 上でしか試してないので、他の環境だと動かないかもしれません。あしからず。 環境 macOS 13.1 Apple M1 Max Apple clang version 14.0.0 (clang-1400.0.29.202) ruby 3.2.0 (2022-12-25 revision a528908271) [arm
年始に転職して、現在は Repro株式会社 に所属しています。 昨日 ImageMagick 6 & 7 に対応した RMagick 4.1.0 をリリースしましたので、簡単に移行手順を書きます。 はじめに ImageMagick 6 と ImageMagick 7 が提供する異なる API インタフェースの差分を吸収するために、作業に取りかかった初期の頃から RMagick のインタフェースを変えないと対応が困難だと判明しておりました。 そのため、RMagick 3.2.0 から RMagick 4.0.0 へバージョンを上げた際に事前にインタフェースのみ変え、RMagick 4.1.0 は内部的な変更のみで ImageMagick 6 と 7 に対応したため、このようなバージョニングになっております。 RMagick 4.1.0 へ移行する ver 4.0.0 未満をアプリで使用されて
【追記 2019/06/17】パッチを含んだ RMagick v3.2.0 がリリースされました。 RMagick を使用すると馬鹿みたいにメモリ使用量があがると言われ続けてましたが、修正方法の見込みがたちようやく直しました。 何が起きていたか RubyKaigi 2019 で登壇した際にも話しましたが、RMagick が引き起こしていた多数のメモリリークは修正済み だったので、Ruby の GC が動作すると抱え込んでいる不要なメモリ領域は解放されていました。 問題は Ruby の GC がなかなか動作してくれないことにありました。例えば RMagick で画像用のオブジェクトを生成しても、サイズはたかだか 40 bytes しかありません。 require 'rmagick' require 'objspace' img = Magick::Image.new(1000, 1000)
RubyKaigi 2019 CFP を書いた - @watson1978 の日記 で応募した CFP が無事採択されたので、RubyKaigi 2019 で登壇してきました。CFP を採択、運営に携わったスタッフの皆さんに感謝です。 CFP にはエモいことを書いたりしましたが、RMagick がどう改善されていてどういう方向性で進むのかがみなさん興味あるでしょうから、それを全力で話したつもりです。至らない点があったら申し訳ない。 スライドの英語を添削してくれた RMagick Team メンバーにも感謝です。 以下は自分の印象に残ったことを。 0 日目 「RubyKaigi 2019 前夜祭 - Ippudo Party!! -」に参加いたしました。ペパボさんで「大名エンジニアカレッジ」というのを始めるそうで、igaigaさんが大名に任命されてた。おめでとうございます(\( ⁰⊖⁰)/)
RMagick のテストが通らないものを調べる際にどのようにデバッグしようかと思ったのですが、Debugging Ruby C Extensions in XCode - Emil Soman's blog に有益なことが書かれておりました。元の記事では Xcode 5.1 が使われていたので最新の Xcode のスクリーンショットを交えつつ手順を書いてみます。 この記事では Ruby C 拡張ライブラリの C 言語で書かれたコードをデバッグする手法を記述します。 デバッグ対象のコードを入手 $ git clone https://github.com/rmagick/rmagick.git Makefile を作成 Ruby C 拡張ライブラリの C 言語のコードは ext ディレクトリ配下にあります。RMagick では ext/RMagick となります。そこへ移動し Makefil
RMagick の ImageMagick 7 対応 作業をするにあたり Windows 環境でも簡単に使えるようにインストールまわりを昨年末くらいからやってました。備忘録がてら作業ログを残しておきます。 Ruby の Windows 環境は 2 種類存在しております。 RubyInstaller に代表される GCC を使用する MinGW 環境 ActiveScriptRuby のように Microsoft Visual Studio でビルドされた mswin 環境 MinGW 環境 RubyInstaller から Ruby+Devkit 2.6.0-1 をダウンロードしインストールします。 RubyInstaller なのですが途中でメンテナーが代わりパッケージング方法が変わったのか、Ruby+Devkit 2.4.5-1 とそれ以前のバージョンとで挙動が違っていました。Fix
Ubiregi Advent Calendar 2018 の 18 日目です。 ユビレジではたくさんのお客様の大量の POS データをお預かりしており、様々なバッチ処理も実行されています。今回は特定のケースでバッチ処理の一部が 30 分以上かかっていた処理を 14 秒で終わるようにした話について書きたいと思います。前回の Ruby 2.5 の SEGV と闘った話 - @watson1978 の日記 に引き続き DTrace を使った話になります。 はじめに ユビレジでは CSV ファイルでお客様が特定のデータをダウンロードしたりアップロードできる機能があります。CSV ファイルにエクスポートしたり、CSV ファイルから DB に取り込む処理を Worker を起動してバッチ処理しています。 大量のデータを保有しているアカウントと同量のデータを用意して手元の環境で試したところ時間がかかるこ
Ubiregi Advent Calendar 2018 の 5 日目です。 同僚が「Ruby 2.5 が SEGV するんだけど」というので調べて見たときの話です。結論から言うと Ruby 2.6 では直っています。 クラッシュログ 同僚の変更内容を手元の macOS で動かすと確かに SEGV して以下の様なクラッシュログが出力されていました。 Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_BAD_ACCESS (SIGABRT) Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000 Exception Note: EXC_CORPSE_NOTIFY VM Regions Near 0: --> __TEXT 000
Ubiregi Advent Calendar 2018 の 2 日目です。 私は ユビレジ でスクラムチームに所属し Rails や iOS、React.js なコードを書いております。スクラムチームでは各個人に得手不得手がありながらもサーバやクライアントのコードを分け隔て無く面倒見ています。チームの簡単な紹介については、初日の ユビレジ開発チームのご紹介 をご覧ください。 2 週間のスプリント期間で機能開発しています。この期間内にはバグマッシュデーという「普段の開発では見落とされがちな軽微な不具合の修正や技術的な調査をしたり、メンバーが自由にプロダクトに貢献」できる日が用意されています。私はバグマッシュデーを活用しながら弊社でも利用している RMagick を ImageMagick 7 に対応する作業を細々とやっております。 出発点 大江戸Ruby会議 07 の発表題材として作業をは
RubyKaigi 2018 が終わった後、Red Data Tools に参加しようかと思い numo-narray を見ていたりするのですが、ベンチマークが不可解な値を示して頭を悩ませています。 使用しているベンチマークは公式の Wiki にあった Tentative Benchmark を用いてます。 require 'numo/narray' N = 100000 M = 10000 a = Numo::DFloat.new(N).seq b = Numo::DFloat.new(N).seq M.times{|i| c = a + b } これを macOS で実行した結果が以下のようになります。 $ rbenv install 2.5.1 $ gem install numo-narray $ time ruby bench.rb ruby bench.rb 1.59s use
途中からぬけて、嫁と合流して仙台市内を観光したりしてました。 Parallel and Thread-Safe Ruby at High-Speed with TruffleRuby 3年以上 TruffleRuby のことやっているそう CRuby と C extension のフルサポートをターゲッティング CRuby 2.5.1 より起動が速い (25ms vs 44 ms) 実行速度は3倍以上 OptCarrot CRuby 2.0 → 28 fps TruffleRuby with JIT → 200+ fps C extesion を動かすにはパッチが必要になったりする 改善はされそう TruffleRuby の JIT はすごいね 途中で定数になると、つぎつぎインライン展開していて、最終的に定数を返すだけになっていた CRuby の JIT だと runtime の C AP
RubyKaigi 2018 2日目に参加してきました。お昼に弁当食べたあと、仙台城跡を見に歩いて行ってきました(帰りはタクシーだったけど)。天気が良くて満足度が高かったです。 My way with Ruby My way with Ruby 活動されている内容のはなし。 フリーソフトウェアを使って Ruby でできることをたくさん増やす ライブラリのメンテナンス 130くらいメンテナンスしているライブラリがある 自分にとって必要だったから。 Web の feed RSS/ATOM RSS/ATOM の validation Ruby 2.6 以降はキーワード引数に対応 REXML REXML → Ruby Electric XML ライブラリ作者と Ruby を通じてやりとりすることになった コード懇親会しますよ Matz も参加しますよ 2010年からメンテナーになった Ruby だ
発表を聞きながらメモした内容を貼っておきます。 Keynote ことわざの話 ことわざ=先人の知恵 名は体を表す -> 名前重要 名前を付けてアイディアを交換する。名前付けは非常に重要。 1. 振る舞いに対して クラス、メソッド、変数などの概念 名前付けが難しいのは、概念を十分に理解しきれていないから 良い名前付けは使い勝手につながる → 良いソフトウェアにつながる 悪い例:yield_self もう少しましな名前に変更します → then version あげるコミット以外で、意味のあるコミットしたのは 5年ぶりくらい 2. プロジェクトに対して 良い名前はコミュニティーの旗印や求心力になる Ruby という名前じゃなかったら、いまのようではなかっただろう Ruby という名前付けは良かった (1993年) Google 登場前だったので、今なら Google アビリティの高いものに G
「LT、良かったですよー」と発表後にちらほら話しかけられて良かったです。 (余談)発表では JSON.parse() のパフォーマンスは 19 % 向上と話したのですが、RubyKaigi 2018 LT の CFP 出した - @watson1978 の日記 のときはもっとパフォーマンスが良かった。LT資料を作成する際に計測し直していたら、一部変更の影響ですごく長い文字列を扱った際にメモリ使用量がだいぶあがっているのに気がつき、駄目そうとなって急遽該当のコミットを削除した。
Xcode で開いているファイルを GitHub で表示する - @watson1978 の日記 で作ったスクリプトをもとに、OpenGithub という Xcode Source Editor Extension を作りました。 github.com Xcode で開いているソースコードをGithub上で簡単に表示することができるようになります。 使い方 セットアップ Release ページから OpenGithub.zip をダウンロードしてください。 アプリを1度起動してください。すぐに終了して頂いてかまいません。 システム環境設定 の 機能拡張 を選択してください。 Open Github のチェックボックスを on にし機能拡張を有効にしてください。 機能拡張の使い方 Xcode でソースコードを表示しします。 機能拡張が有効になっていると、Editor -> Open Gith
調べごとをしていると、Xcode で開いているファイルを GitHub で表示して URL をメモっておくことがままあります。RubyMine だと標準機能で現在開いてるファイルを、 ブラウザで GitHub 上のファイルを開くということができるのですが、なぜか Xcode には見当たりません。 Xcode Source Editor Extension を使えば実現できるのかなと雑に思っていたのですが、ファイルパスが欲しいのにこれはソースコードの内容しか取得できないのですね・・・。 仕方が無いので、AppleScript で Xcode で開いているファイルのパスを取得しGitHub 上の URL を開くスクリプトを書いてみました。 Xcode で適当にファイルを開いた状態で、 $ ruby open_xcode_file_on_github.rb と実行してください。(もっとスマートな
弊社ユビレジでは、開発要件や手動でテストすることをMarkdownファイルを書いてGitHub上のレポジトリにPull Requestし管理する運用をしています。 今までさっとプレビューしたいときにはQLMarkdownというプラグインを使用していたのですが、GitHub Flavored Markdownのタスクリストがちゃんとレンダリングされずもやもやしていたので自分でつくってみました。 GitHub Flavored MarkdownをパースするのはGitHubがメンテナンスしているgithub/cmarkが良さそうかと目を付けたのですがタスクリストが扱えないという・・・。機能追加しやすそうだったのでタスクリストを扱えるようにしてみました(https://github.com/github/cmark/pull/94)。 で、できあがったQuick Look プラグインはこちらです。
次のような感じで RubyKaigi 2018 LT の CFP に出したよ。 ## Improve JSON performance I would like to talk my progress of daily contribution to Ruby world. Last year, I talked about my performance improvement to Ruby core at RubyKaigi 2017. I'm planing to talk the improvement to json gem as following with 5 minutes at RubyKaigi 2018 LT. - https://github.com/flori/json/pull/345 - https://github.com/flori/json/pull/3
以前、macOS 上で Ruby のパフォーマンスを計測する で iprofiler を使ったパフォーマンス計測方法を書いたのですが、Xcode 9 で $ iprofiler -timeprofiler ./a.out iprofiler error: DTPerformanceSession: Authorization failure. とエラーが出るようになってた。 よく分からないし、あきらめて instruments コマンドを使うようにした。以下のような感じで使う。 $ instruments -l 10000 -t "Time Profiler" ./a.out iprofiler みたいに 10 秒経過したら自動で終了しないので、必要なら -l でリミットをミリ秒単位で指定する。-t では計測に使用するテンプレートを指定する必要があるが、instruments -s で表示
卜部さんの推薦により、Rubyコミッターになることができました。 MacRuby と RubyMotion の開発に携わっていた際に Ruby のソースコードは良く読んでいたりしたので、そこでの知見を生かしていければと思っています。 当面は自分が送付したPull Requestを処理していこうと思います。
(追記 2017-10-02 01:28:42 +0900) Xcode 9 からは以下のように計測に失敗するようです。解決策が見つかるまでは Xcode 8.3 を使うか、Instruments.app で直接計測する必要がありそうです。 $ iprofiler -timeprofiler ./a.out iprofiler error: DTPerformanceSession: Authorization failure. macOS では、ターミナルから iprofiler を経由してコマンドを実行することでパフォーマンスを計測することができる。 $ iprofiler -timeprofiler ./a.out iprofiler: Preparing recording resources iprofiler: Profiling process 66908 (a) for 1
4 年半にわたって RubyMotion の開発・ユーザーサポート等に携わってきましたが、2 月末日をもって離れることになりました。前身となるMacRuby の開発からですと 7 年以上になり、よく飽きずにやってきたなと思います。 RubyMotion は我ながらとても良いプロダクトだと思っていますが、Swift が Apple からリリースされて以来すっかり押さえ込まれてしまった、というのが離れることになった簡単な理由です。 のんびり次の仕事を探していきます。 【追記】お仕事をくださる方がいらっしゃいましたら、以下の職歴をご参照ください m(_ _)m www.wantedly.com
このページを最初にブックマークしてみませんか?
『@watson1978 の日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く