タグ

ブックマーク / qiita.com/k0kubun (14)

  • Rustプログラムのデバッグ辛すぎ問題 - Qiita

    この記事は Rust Advent Calendar 2023 シリーズ2 の1日目の記事である。 Rustは良くも悪くもシステムプログラミング言語なので、何も工夫しなければデバッグの体験がC言語と同じレベルになってしまう。例えば「rust lldb」でググると上位に Debugging Rust programs with LLDB is a nightmare というスレッドが出てきてしまう。 使うべきツールを知っていれば幾分かマシな体験にできる。Rustコンパイラはデバッガとして LLDB, GDB, WinDbg/CDB をサポート していて、僕はWinDbGは10年くらい触ってないので、この記事ではLLDBとGDBについて書く。 LLDB Apple SiliconのMacだとGDBが使えないので、必然的にLLDBを使うことになる。 CodeLLDB GDBと同じく、LLDBにも

    Rustプログラムのデバッグ辛すぎ問題 - Qiita
  • YJITで使ったRustの省メモリ化テクニック - Qiita

    これは Rust Advent Calendar 2022 のカレンダー2の22日目の記事です。 YJITとは 私は今年の7月からShopifyという会社でRubyのJITコンパイラであるYJITを開発している。このJITは今年CからRustに書き直されたため、現職では業務としてフルタイムでRustを書いている。 実用段階になったYJIT おそらく世界最大規模でRubyを使っている弊社では、お客様のお店のサイトをレンダリングするアプリには社内最大のトラフィックが来ていて、実は最近そのアプリほぼ全台で最新のYJITが有効化されたことが昨日公開情報になった。あまりにも大量のトラフィックが来るので、YJITによって行なわれているRubyコード実行量はYJITが使われてないものよりも世界全体で見て多くなったのではないかとCEOが言っていた。 この規模のトラフィックを捌くためにこのアプリは比較的よく

    YJITで使ったRustの省メモリ化テクニック - Qiita
  • Ruby 3.2 のIRBの新機能 - Qiita

    これはRubyアドベントカレンダー2022の22日目の記事です。 binding.irb のすすめ 8年前に 今更聞けないpryの使い方と便利プラグイン集 という記事を書き、そこから長い間 binding.pry を愛用していた。binding.irb も binding.pry も使ったことがないよ、という人はご一読をお勧めしたい。 当時PryにあったIRBに対する優位性のうち、時間が経っても常に使い続けた機能といえば binding.pryの存在、$ (show-source)、@ (whereami)、ls とその -G (grep) オプション、デバッグ機能 (要pry-byebugプラグイン) という感じで、他はまあたまに使うかもねくらいの感じになったのだが、なんとこれらはRuby 3.2ではIRBで全て使えるようになった。その上、Gemfileに何も書かなくてもデフォルトで使え

    Ruby 3.2 のIRBの新機能 - Qiita
    Watson
    Watson 2022/12/22
  • Linux perfで快適に計測するためのtips - Qiita

    これがあるのとないのとでは分かりやすさが全然違うので、perfを使う時は常に入れておくようにすると便利です。 2. --call-graph は fp 以外で使う 上記の問題を解決すると perf record + perf report では何が呼ばれているかおおむね分かることが多いのですが、call graphを出すために perf record -g をすると [unknown] というのが出てきてしまうことがあります。(以降の計測結果はRack::Utils::HeaderHashを使ったRuby VMのベンチをRubyのmasterで走らせたものです) Samples: 38K of event 'cycles:ppp', Event count (approx.): 271180000 Children Self Command Shared Object Symbol - 1

    Linux perfで快適に計測するためのtips - Qiita
  • ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い - Qiita

    ActiveRecordでN+1クエリを潰すためにeager loadingを行う場合、preloadやincludesやeager_loadが役に立つ。 Preload, Eagerload, Includes and Joinsという記事にそれらの違いがよくまとめられているんだけど、includesが挙動を変える条件があまり正確に書かれていなくて自信が持てなかったし、そもそも記事が古いのでRails4.1.5のソースを読んで調べた。 せっかく調べたので、全体を通して日語でまとめてみようと思う。 User.joins(:posts).where(posts: { id: 1 }) # SELECT `users`.* FROM `users` INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id` WHERE `posts`.`id

    ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い - Qiita
    Watson
    Watson 2019/11/29
  • VM命令ディスパッチ手法: Context Threading - Qiita

    2005年のそれほど新しくないものだが、Context Threading: A flexible and efficient dispatch technique for virtual machine interpreters という論文を読んだので、内容について少しまとめておく。 前提知識: 既存のThreading手法 http://www.complang.tuwien.ac.at/forth/threaded-code.html にまとまっているが、この論文では以下の2つが関係している: Direct threading: ラベルのアドレスを取得するGCC拡張などを使い、VMのprogram counterからVM命令の実装のアドレスをディスパッチしてそこにジャンプする Subroutine threading: VM命令の実装を関数にしておき、それをcallする命令を並べたネ

    VM命令ディスパッチ手法: Context Threading - Qiita
    Watson
    Watson 2019/07/02
  • かRuby 2.6のJITで実装か検討を行なった最適化集 - Qiita

    これは言語実装 Advent Calendar 2018の25日目の記事です。 今日2018年12月25日は、Rubyに初めてJITコンパイラが搭載されたRuby 2.6のリリース日です。めでたい!! 進捗はRuby 2.6 JIT - Progress and Futureに書いてある通りですが、ハイライトとしては、CPU計算負荷の高いOptcarrotというNESエミューレータのベンチマークで、以下のような性能向上を達成しました。 Optcarrot Lan_Master.nes 2.6.0+JIT: 86.6 fps 2.6.0: 54.6 fps - 1.59x slower 2.5.3: 48.5 fps - 1.78x slower 2.0.0: 34.6 fps - 2.50x slower Ruby 2.6では、JITを有効にしなくても2.5に比較してそこそこ速くなっていま

    かRuby 2.6のJITで実装か検討を行なった最適化集 - Qiita
  • Perfect Frozen String Literal - Qiita

    現時点では解説がパーフェクトではないのを自覚しているが、めんどくさいので後でパーフェクトにする Frozen String Literalとは "str".freezeのようなリテラルのこと。 Feature#8992 (r43627) でこのようなリテラルを書くと事前にallocate & freezeされた文字列オブジェクト(内部的にはfstringと呼ばれる) が取得されるようになり、Ruby 2.1以降ではイミュータブルな文字列が必要な場面でこのリテラルを使うと高速になる。 以下、それに関連した機能や最適化がどのバージョンで入ったか、各バージョンでのお勧めの書き方をまとめておく。 Ruby 2.0.0まで まだ入ってないので気にしなくてよい Ruby 2.1〜2.2 Ruby 2.1: Use String#freeze and compiler tricks to replace

    Perfect Frozen String Literal - Qiita
    Watson
    Watson 2018/04/12
  • Ruby高速化のためのベンチマークツール benchmark_driver.gem - Qiita

    この記事はRuby Advent Calendar 2017 17日目の記事です。 benchmark_driver.gem とは Rubyの処理系を高速化していく上で重要な計測環境を改善するため、Ruby体のリポジトリにあるbenchmark/driver.rbの後継として作られたベンチマークツールです。普通にRubyのスクリプトのパフォーマンスを比較するのにも使えます。 また、このgemRuby Association開発助成金2017に採択されたプロジェクトとして開発されています。 何が便利なのか Procの起動を行なわない精度の良い計測ができる 皆さんがベンチマークによく使うのは、標準ライブラリの benchmark.rb か、見易い比較結果を得られる benchmark-ips.gem 等でしょう。 benchmark-ips.gem でよく使われるインターフェースや ben

    Ruby高速化のためのベンチマークツール benchmark_driver.gem - Qiita
  • The Story of Method Lookup - Qiita

    おおむね以下の点を理解することを目標に、CRubyのメソッド呼出がどのようなフローで実行されているかを見ていく。対象バージョンは2.4.1。 Rubyで定義されたメソッド、C拡張で定義されたメソッド、コア内部で実装されたCのメソッドはそれぞれCRuby内部でどういったデータ構造で保管されているか それらはそれぞれどのようなアルゴリズムで検索されるか それらはそれぞれどのような流れで実行されるか メソッドキャッシュはどのように実装されており、どういう時使われるのか バックトレースの管理などメソッド体の処理以外には何が行なわれているのか send命令とopt_send_without_block命令とrb_funcallの間では何が異なるのか なおこの記事のタイトルは、RubyConf 2015の時 Messenger: The (Complete) Story of Method Look

    The Story of Method Lookup - Qiita
    Watson
    Watson 2017/06/12
  • CRubyは最適化のためにメソッド再定義をどのようにチェックするか - Qiita

    Ruby 2.4.1について書いている。書きかけだけど読みたいところが読めてしまって多分これ以上すぐには書かないので公開しておく。 CRubyのopt_*命令について Rubyで1+1を実行すると、何が起きるか。 Rubyでは全ての演算子がメソッドになっているので、一見Integer#+メソッドの呼び出し(ここでは、YARVでsend系の命令が実行されること、という定義)が行なわれるように思うかもしれないが、ほとんどの場合ではそうではない。 $ ruby --dump=insns -e "1+1" == disasm: #<ISeq:<main>@-e>============================================ 0000 trace 1 ( 1) 0002 putobject_OP_INT2FIX_O_1_C_ 0003 putobject_OP_INT2FI

    CRubyは最適化のためにメソッド再定義をどのようにチェックするか - Qiita
    Watson
    Watson 2017/06/07
  • Rubyを評価するCLIツールはCRubyとmrubyのどちらで実装するべきか - Qiita

    最近MItamaeやxkremapなど、Rubyで設定ファイルを既述するCLIツールをCRubyではなくmrubyで実装することがあったのだが、そのようなCLIツールを作る際にCRubyではなくmrubyを使うことへの妥当性について考えていたことをダンプしておく。 以下、ハードウェアにmrubyを組み込む用途や、Ruby以外で書かれた既存のツールにmrubyを組み込む用途については(僕は特に経験してないので)除外して書きます。 CLIツールの作成にmrubyを使うメリット CRubyrubygemsの存在に依存しないバイナリとしてCLIツールを作ることができる gem installする場合に比べ、rbenvに気を使わずバイナリを叩くだけで手軽に実行できる gem installして入れたCLIツールは、rbenvが入っている環境ではrbenv globalや.ruby-versionが

    Rubyを評価するCLIツールはCRubyとmrubyのどちらで実装するべきか - Qiita
  • 今更聞けないpryの使い方と便利プラグイン集 - Qiita

    Rubyのソースコードを読むとき、grepやctagsだけで読んでるとどこにどういう値が入るのか頭で考える必要があり大変。 そういう時、実際に動かしながらpryを使って中身を確認すると、どういう動きをしているのか楽に把握できる。 普通のエディタを使ってRubyを書いている人にとって、IDE的な機能を提供してくれるのがpryといえる。 稿では、この記事を書く前の私のように、この次の「最低限の使い方」くらいしかpryを使いこなせていない人向けに、便利な機能をひと通り説明する。 最低限の使い方 まだpryを使ったことがない人はこれだけ知ってれば十分な気がする。 binding.pryで任意の場所からREPLを立ち上げる ソースの任意の箇所にbinding.pryを書いてRubyのプログラムを走らせると、実行中にその行でストップしてpryのREPLが立ち上がり、その環境での変数がどうなっているか

    今更聞けないpryの使い方と便利プラグイン集 - Qiita
    Watson
    Watson 2015/10/07
  • Electronを初めて触った時にハマった5つのこと - Qiita

    初めてElectronを使ってTwitterクライアント https://github.com/k0kubun/Nocturn を作ったときによくわからず時間を吸われたことについて、これからElectronを使いはじめる人のために残しておく。 トラックパッドでスクロールすると画面の外までひっぱれてしまう マウスホイールでスクロールしてると気づかないのだが、トラックパッドで画面の適当なところを引っ張ると画面の外側が見えてしまい、普通のブラウザっぽくなる。Electronの検索性が低くてなかなか情報にたどり着けなかったが、ChrominumベースなのでChromeについてググったら直し方がわかった。 http://stackoverflow.com/questions/12046315/prevent-overscrolling-of-web-page html, body { width:

    Electronを初めて触った時にハマった5つのこと - Qiita
  • 1