サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
WWDC25
qiita.com/k0kubun
def timeout(sec) bl = proc do y = Thread.start { sleep sec } result = yield(sec) y.kill y.join return result end bl.call caller(0) end timeout(100) do foo.bar end ところが、実際にはbl.callでVMを起動する時のISeqがfoo.barのあるブロックになってしまい、そこでfoo.barを呼び出した後普通に次の行に抜け、本来大域脱出により到達しないはずのcaller(0)の呼び出しに到達してしまいました。 gdbで見てみるとbl.callからvm_call_opt_call経由でinvoke_blockにより積まれているcfpのiseqには正しいiseqがセットされ、実行され始めていた。なので上記の引用の内容は間違っていた。 一
この記事は 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 Advent Calendar 2022 のカレンダー2の22日目の記事です。 YJITとは 私は今年の7月からShopifyという会社でRubyのJITコンパイラであるYJITを開発している。このJITは今年CからRustに書き直されたため、現職では業務としてフルタイムでRustを書いている。 実用段階になったYJIT おそらく世界最大規模でRubyを使っている弊社では、お客様のお店のサイトをレンダリングするアプリには社内最大のトラフィックが来ていて、実は最近そのアプリほぼ全台で最新のYJITが有効化されたことが昨日公開情報になった。あまりにも大量のトラフィックが来るので、YJITによって行なわれているRubyコード実行量はYJITが使われてないものよりも世界全体で見て多くなったのではないかとCEOが言っていた。 この規模のトラフィックを捌くためにこのアプリは比較的よく
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? これはRubyアドベントカレンダー2022の22日目の記事です。 binding.irb のすすめ 8年前に 今更聞けないpryの使い方と便利プラグイン集 という記事を書き、そこから長い間 binding.pry を愛用していた。binding.irb も binding.pry も使ったことがないよ、という人はご一読をお勧めしたい。 当時PryにあったIRBに対する優位性のうち、時間が経っても常に使い続けた機能といえば binding.pryの存在、$ (show-source)、@ (whereami)、ls とその -G (gre
プロと読み解く Ruby 3.0 NEWS のJITパート向けに、Ruby 3.0.0のNEWS.mdの僕が書いた部分をゆるくコメントしていきます。 Performance improvements of JIT-ed code Microarchitectural optimizations Native functions shared by multiple methods are deduplicated on JIT compaction. 2.6や2.7のJITではメソッドごとに作る.oファイルを /tmp に残し、一定期間後に.soファイルにまとめてロードし直す (コードの局所性が上がり速くなります) ということをしていたんですが、.soファイルを眺めたところ共通のメソッドが何度もコード生成されていることに気付きました。 これを、.oファイルからリンクするのではなく、各メソッ
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
ハマりどころしかなくてなかなかうまくいかなかったのでハマったポイントを全てメモしておく。 設定ファイルはhome以下に置く必要がある /etc/systemd 以下とかに置いてもダメ。~/.config/systemd/user/*.service を使わないと--userではうまくいかない。 [Install]を必ず書く がないとenableしても意味ない --userモードにはmulti-user.targetが存在しない 普通、rootで起動するサービスはmulti-user.targetにしておくのが良いようだが、--userで使う場合はdefault.targetじゃないと起動してくれない。 [Install]をいじったら systemctl --user enableを叩き直す WantedByが変わるとsymlink先も変わる。その場合enableもやり直さないと当然ダメ。
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? 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:
以下のデータ構造と関連している: 1) Binary Heap ALDS1_9_B: Complete Binary Treeの各nodeのキーが1つの配列の各要素に対応するように表されたデータ構造。論理的にはComplete Binary Treeなものの、実装は1オリジンの1次元配列になる。単にHeapとも呼ぶが、Heap Memoryとは無関係。 Max Heap: 各nodeのキーが親のキー以下になる Min Heap: 各nodeのキーが親のキー以上である あるnodeのインデックス(1オリジン)をiとすると、親はi/2、左の子は2*i、右の子は2*i+1になる。 親子にのみ大小関係があり兄弟間に制約はないため、rootから値を取り出すのに向いている。 2) Priority Queue ALDS1_9_C: キーを挿入した後、最大のキーから順に取り出せるデータ構造。上記のBin
https://speakerdeck.com/k0kubun/number-ginzarb の資料作成のためのnewrelic_rpmのコードリーディングメモ。バージョンはv4.3.0。 Railtie→Agent#start まで require 'newrelic_rpm'でRailtieが作られる まずRailsの場合、普通にGemfileにgem 'newrelic_rpm'を書くと、Bundler.requireされた時にNewRelic::Railtieが定義される。 if Rails::VERSION::MAJOR.to_i >= 3 module NewRelic class Railtie < Rails::Railtie initializer "newrelic_rpm.start_plugin" do |app| NewRelic::Control.instanc
$ find . -name \*.erb -o -name \*.c |grep mjit_compile|xargs wc -l 254 ./mjit_compile.c 77 ./tool/ruby_vm/views/mjit_compile.inc.erb 54 ./tool/ruby_vm/views/_mjit_compile_ivar.erb 94 ./tool/ruby_vm/views/_mjit_compile_send.erb 36 ./tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb 86 ./tool/ruby_vm/views/_mjit_compile_insn.erb 105 ./tool/ruby_vm/views/_mjit_compile_insn_body.erb 706 total この記事では、Ruby
mitamaeとは Chefに比べ、よりシンプルかつ依存(chef server, cookbook, berkshelf, data_bags)が少なく実行できるItamaeというツールがあるんですが、mitamaeはmrubyを使うことでそこから更に依存(Rubyインタプリタ, RubyGems)を減らしシンプルにしたツールです。 歴史: https://k0kubun.hatenablog.com/entry/itamae-mruby https://k0kubun.hatenablog.com/entry/mitamae 何故mitamaeは便利なのか itamae sshを使うとサーバーに何も入ってない状態のまま気軽にサーバーをプロビジョニングできるため非常に便利なのですが、itamae ssh は各コマンドごとにssh越しの通信が発生してしまい非常に遅く不快なため、通の間ではo
この記事はRuby Advent Calendar 2017 17日目の記事です。 benchmark_driver.gem とは Rubyの処理系を高速化していく上で重要な計測環境を改善するため、Ruby本体のリポジトリにあるbenchmark/driver.rbの後継として作られたベンチマークツールです。普通にRubyのスクリプトのパフォーマンスを比較するのにも使えます。 また、このgemはRuby Association開発助成金2017に採択されたプロジェクトとして開発されています。 何が便利なのか Procの起動を行なわない精度の良い計測ができる 皆さんがベンチマークによく使うのは、標準ライブラリの benchmark.rb か、見易い比較結果を得られる benchmark-ips.gem 等でしょう。 benchmark-ips.gem でよく使われるインターフェースや ben
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? 現時点では解説がパーフェクトではないのを自覚しているが、めんどくさいので後でパーフェクトにする Frozen String Literalとは "str".freezeのようなリテラルのこと。 Feature#8992 (r43627) でこのようなリテラルを書くと事前にallocate & freezeされた文字列オブジェクト(内部的にはfstringと呼ばれる) が取得されるようになり、Ruby 2.1以降ではイミュータブルな文字列が必要な場面でこのリテラルを使うと高速になる。 以下、それに関連した機能や最適化がどのバージョンで入っ
おおむね以下の点を理解することを目標に、CRubyのメソッド呼出がどのようなフローで実行されているかを見ていく。対象バージョンは2.4.1。 Rubyで定義されたメソッド、C拡張で定義されたメソッド、コア内部で実装されたCのメソッドはそれぞれCRuby内部でどういったデータ構造で保管されているか それらはそれぞれどのようなアルゴリズムで検索されるか それらはそれぞれどのような流れで実行されるか メソッドキャッシュはどのように実装されており、どういう時使われるのか バックトレースの管理などメソッド本体の処理以外には何が行なわれているのか send命令とopt_send_without_block命令とrb_funcallの間では何が異なるのか なおこの記事のタイトルは、RubyConf 2015の時 Messenger: The (Complete) Story of Method Look
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? Rubiniusをhackしたことは特にないが、中を軽く読んでおこうという気持ちになったので読んだ内容をメモしておく。今日初めて読んだ状態なのであまり参考にならないかもしれない。 歴史 2007あたり開発開始 v1 (2010) 「Rubyで実装されたRuby」 バイトコード仮想マシンはC++/LLVM LLVM JIT 世代別GC JRubyに次ぐ3番目にRailsが走ったRuby処理系 v2 (2013) 当時まだ出ていなかったRuby 2.1互換 GILなし、マルチスレッドサポートの向上 JITにより2-4倍程度まで高速化を達成
この記事はHaml 4.1.0.beta.1について書いています。最初は最新の安定板であるHaml 4.0.7について書いていたんですが、4.0.7だと書き方によってattributeが消えたりしてバグっぽいので、betaですが4.1.0について書くことにしました。 解説は全て自分用のメモです。 値がArray, Hash, true, false, nil以外のケース 以下のHamlのレンダリング結果は何でしょうか。haml -t ugly ファイル名のコマンドの出力(escape_attrs: true, escape_html: false, format: :html5, ugly: true)で答えてください。なお、Rubyとして有効な警告の出ないコードにコンパイルされるので、シンタックスエラーは不正解です。
core i7 4790K と Z97 extreme4 による自作PCに Ubuntu GNOME 16.04を入れた時の手順メモ。 Ubuntu 18.04 20.04 をセットアップするメモ。 内容は自分用です。 インストールメディアのブート ここではUSBメモリでインストールメディアを作成しブートする。 USBメモリにisoを焼く (UEFIブートのため)64bitのdesktop imageをダウンロードしておく。以下macOSで焼く手順を書く。 ExFAT GUIDパーティションマップでフォーマットしてから (diskutil eraseDisk ExFAT UbuntuFocal /dev/disk2 とか)、以下のコマンドを実行する。 hdiutil convert -format UDRW -o ubuntu ubuntu-20.04.1-desktop-amd64.is
最近MItamaeやxkremapなど、Rubyで設定ファイルを既述するCLIツールをCRubyではなくmrubyで実装することがあったのだが、そのようなCLIツールを作る際にCRubyではなくmrubyを使うことへの妥当性について考えていたことをダンプしておく。 以下、ハードウェアにmrubyを組み込む用途や、Ruby以外で書かれた既存のツールにmrubyを組み込む用途については(僕は特に経験してないので)除外して書きます。 CLIツールの作成にmrubyを使うメリット CRubyやrubygemsの存在に依存しないバイナリとしてCLIツールを作ることができる gem installする場合に比べ、rbenvに気を使わずバイナリを叩くだけで手軽に実行できる gem installして入れたCLIツールは、rbenvが入っている環境ではrbenv globalや.ruby-versionが
初めてElectronを使ってTwitterクライアント https://github.com/k0kubun/Nocturn を作ったときによくわからず時間を吸われたことについて、これからElectronを使いはじめる人のために残しておく。 トラックパッドでスクロールすると画面の外までひっぱれてしまう マウスホイールでスクロールしてると気づかないのだが、トラックパッドで画面の適当なところを引っ張ると画面の外側が見えてしまい、普通のブラウザっぽくなる。Electronの検索性が低くてなかなか情報にたどり着けなかったが、ChrominumベースなのでChromeについてググったら直し方がわかった。 http://stackoverflow.com/questions/12046315/prevent-overscrolling-of-web-page あとWebっぽくなくすテクニックとしては
僕はRackミドルウェアを何個か書いたことがあるけど、この前Rubyを始めたばかりの人に「Rackって何?」って聞かれた時、ちゃんと答えられなかった。 なので、rack/rackは何を実装していて、RailsやSinatraはどのようにRackを利用しているのかについてRack 1.6.4のコードを読みつつ調べてみた。 Rackとは何か Rackは、指定したファイルを独自のRuby DSLとして読み込み、DSLで指定した様々なミドルウェア、アプリケーションを組み合わせてWebサーバを立ち上げることができるrackupというコマンドを提供するライブラリである。 Rack::Serverの仕組み rackupコマンドはRack::Server.startしているだけであり、rackupによって立ち上がるWebサーバの挙動を理解するにはRack::Serverの仕組みを知る必要がある。 Rack
Customizing Git - Git Hooks git hookはサーバサイドならばアクセスする全ユーザ共通にできるが、通常使うクライアントサイドのgit hookは特に共有設定などを用意することができない。 そのため、tpopeさんはctagsのタグ生成のために、git initやgit clone時に.gitのテンプレートでhooksを配布する方法をブログに書いている。 しかしこの方法では配布したgit hookを後から共通でいじりたくなってもできない。 そこで、.gitのテンプレートのhooksから~/.githooksにシムリンクを張る方式を提案する。 .gitconfigにinit.templatedirを設定
サーバのボトルネックを探る サーバが重い時、主に以下の4つがボトルネックとなる。 CPU使用率 メモリ使用量 ディスクI/O TCPコネクション数 この記事では、これらのうちどれがボトルネックとなっているかを突き止める方法について書く。 ロードアベレージを見る まずはロードアベレージを見ることで、おおまかに問題を切り分ける。 ロードアベレージの確認方法はload averageを見てシステムの負荷を確認するに書いた。 ロードアベレージが高い場合 現在のホストの**「1. CPU使用率」**, 「2. メモリ使用率」, **「3. ディスクI/O」**を疑う。 ロードアベレージが1以下であれば軽く、1〜3くらいだとやや重く、それ以上だとこれらがボトルネックの可能性が高い。 ロードアベレージが低い場合 **「4. TCPコネクション数」**か、リモートホストがボトルネックになっていないか疑う。
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? Rubyのソースコードを読むとき、grepやctagsだけで読んでるとどこにどういう値が入るのか頭で考える必要があり大変。 そういう時、実際に動かしながらpryを使って中身を確認すると、どういう動きをしているのか楽に把握できる。 普通のエディタを使ってRubyを書いている人にとって、IDE的な機能を提供してくれるのがpryといえる。 本稿では、この記事を書く前の私のように、この次の「最低限の使い方」くらいしかpryを使いこなせていない人向けに、便利な機能をひと通り説明する。 最低限の使い方 まだpryを使ったことがない人はこれだけ知って
と書くと、レシピのmethod_missingでItamae::Plugin::Resource::Fooが探されます。 itamaeのレシピが読み込まれた段階でこのFoo resourceがレシピのchildrenに追加されます。 そのため、bundle gemの自動生成規則に従うと、pluginのgem名はitamae-plugin-resource-fooにする必要があります。 レシピに追加されたresourceがrunされる レシピの読み込みが終わると、レシピに追加された各resourceがrunされます。 ★ なので、 が実行されたらサーバの状態に応じた適切なコマンドが走るようにItamae::Plugin::Resource::Fooを定義すればよいことになります。 resourceに共通して必要なメソッドがItamae::Resource::Baseに定義されているので、新た
概要 k0kubun/ppという、pretty printライブラリを作った。 任意の型のオブジェクトをpp.Print()に渡すと色つきでpretty printしてくれるという非常にシンプルなもの。 作った背景 fmt.Printf("%#v", ...)等ではわかりづらい複雑なmapやstructをdebug printするときは、pretty printを使うと便利。既存のpretty printライブラリには、GitHubで人気なものだとdavecgh/go-spewやkr/prettyなどがある。 いままではGoでデバッグのために複雑な構造をダンプするときこれらを使っていたのだが、必要以上に型の情報が書かれていたり、大きなものだと白黒なのでパッと見てわかりづらいなどの問題があった。 そこで、型やフィールドごとに別の色をつけることで視認性を高め、ビルトインの型情報は色にまかせて省
ActiveRecord::QueryMethods#eager_loadでeager loadingをする際に、 ActiveRecord::Associations::JoinDependencyがどのような働きをしてレコードの読み込みを行っているかコードリーディングをしたので、そのメモ。 そもそもeager_loadって何 JOINで関連先オブジェクトをeager loadingするためのscope。 ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い eager_loadを呼んでからクエリが走るまで Tweet.eager_load(:favorites).to_aをrbtraceを使って実際にトレースして少し加工したものを以下に示す。 ActiveRecord::QueryMethods#eager_load ActiveRecor
次のページ
このページを最初にブックマークしてみませんか?
『@k0kubunのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く