サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ノーベル賞
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が言っていた。 この規模のトラフィックを捌くためにこのアプリは比較的よく
これは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.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ファイルからリンクするのではなく、各メソッ
これがあるのとないのとでは分かりやすさが全然違うので、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
ハマりどころしかなくてなかなかうまくいかなかったのでハマったポイントを全てメモしておく。 設定ファイルは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:
アルゴリズムとデータ構造に関連した基礎知識をまとめておく。 英文で出てきた時に理解できることを目的に可能な限り英語表記を優先しているが、いくつかは日本語での表記も併記してある。ものによっては練習用にAOJの問題をリンクしてある。 1. アルゴリズム Comparison Sort 何らかの方法で要素同士を比較できる配列に対して適用可能なソートアルゴリズムのことをComparison sortやComparison-based sorting algorithmという。 Bubble Sort ALDS1_2_A: 最初は端から端に全てを比較して入れ替え、入れ替える幅を狭めながらその操作を繰り返す。 Time Complexity: $O(N^2)$ 配列の流さが $n$ の時、$n-1$, $n-2$, ..., $1$ 回の比較・入れ替えを行なう。 $\sum_{k=1}^{n} k =
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
これは言語実装 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に比較してそこそこ速くなっていま
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
現時点では解説がパーフェクトではないのを自覚しているが、めんどくさいので後でパーフェクトにする 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
おおむね以下の点を理解することを目標に、CRubyのメソッド呼出がどのようなフローで実行されているかを見ていく。対象バージョンは2.4.1。 Rubyで定義されたメソッド、C拡張で定義されたメソッド、コア内部で実装されたCのメソッドはそれぞれCRuby内部でどういったデータ構造で保管されているか それらはそれぞれどのようなアルゴリズムで検索されるか それらはそれぞれどのような流れで実行されるか メソッドキャッシュはどのように実装されており、どういう時使われるのか バックトレースの管理などメソッド本体の処理以外には何が行なわれているのか send命令とopt_send_without_block命令とrb_funcallの間では何が異なるのか なおこの記事のタイトルは、RubyConf 2015の時 Messenger: The (Complete) Story of Method Look
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倍程度まで高速化を達成 v3 (2016) ビルドにclang/clang++しかサポートしなくなった AOTコンパイルによるバイナリ生成もサポート 実行時にRubyを使わないようにした JITはバグが多かったため取り除かれた 特徴 2017/4/12時点ではRuby 2.3.1を
この記事は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として有効な警告の出ないコードにコンパイルされるので、シンタックスエラーは不正解です。 - c = 'c' - ::D = Struct.new(:id) #
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が
MacBook - ArchWikiとArch Linux Installation with OS X on Macbook Air (Dual Boot)を参考にしている。 自作PCにArch Linuxをインストールして環境構築すると重複する部分が多い。 Macでの準備 OSXのクリーンインストール OSXとArchを共存させる場合はOSXをクリーンインストールしておくのが無難らしい。 OSXのインストールディスクを作成してOptを押しながら起動し、ディスクユーティリティでディスク全体をフォーマットした後OSXをインストールする。 その後、AppStoreでソフトウェア・アップデートをやって再起動する。 ついでに、システム環境設定 > サウンド から内蔵スピーカーの音量を0にしておくと起動音を無効にできる。 EFI bootable USBメモリを作る https://www.arc
初めてElectronを使ってTwitterクライアント https://github.com/k0kubun/Nocturn を作ったときによくわからず時間を吸われたことについて、これからElectronを使いはじめる人のために残しておく。 トラックパッドでスクロールすると画面の外までひっぱれてしまう マウスホイールでスクロールしてると気づかないのだが、トラックパッドで画面の適当なところを引っ張ると画面の外側が見えてしまい、普通のブラウザっぽくなる。Electronの検索性が低くてなかなか情報にたどり着けなかったが、ChrominumベースなのでChromeについてググったら直し方がわかった。 http://stackoverflow.com/questions/12046315/prevent-overscrolling-of-web-page html, body { width:
core i7 4790K と Z97 extreme4 による自作PCにArch Linuxを入れた時の手順メモ。 インストールメディアのブート ここではUSBメモリでインストールメディアを作成しブートする。 USBメモリにisoを焼く https://www.archlinux.org/download/ からisoを落としておく。 hdiutil convert -format UDRW -o arch archlinux-2023.07.01-x86_64.iso diskutil list # 焼きたいUSBメモリのパスを確認 (/dev/disk2 だったとする) sudo dd if=arch.dmg of=/dev/disk2 bs=1m
僕はRackミドルウェアを何個か書いたことがあるけど、この前Rubyを始めたばかりの人に「Rackって何?」って聞かれた時、ちゃんと答えられなかった。 なので、rack/rackは何を実装していて、RailsやSinatraはどのようにRackを利用しているのかについてRack 1.6.4のコードを読みつつ調べてみた。 Rackは、指定したファイルを独自のRuby DSLとして読み込み、DSLで指定した様々なミドルウェア、アプリケーションを組み合わせてWebサーバを立ち上げることができるrackupというコマンドを提供するライブラリである。 Rack::Serverの仕組み rackupコマンドはRack::Server.startしているだけであり、rackupによって立ち上がるWebサーバの挙動を理解するにはRack::Serverの仕組みを知る必要がある。 Rack::Server.
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コネクション数」か、リモートホストがボトルネックになっていないか疑う。 特定のホストの問題を解
Rubyのソースコードを読むとき、grepやctagsだけで読んでるとどこにどういう値が入るのか頭で考える必要があり大変。 そういう時、実際に動かしながらpryを使って中身を確認すると、どういう動きをしているのか楽に把握できる。 普通のエディタを使ってRubyを書いている人にとって、IDE的な機能を提供してくれるのがpryといえる。 本稿では、この記事を書く前の私のように、この次の「最低限の使い方」くらいしかpryを使いこなせていない人向けに、便利な機能をひと通り説明する。 最低限の使い方 まだpryを使ったことがない人はこれだけ知ってれば十分な気がする。 binding.pryで任意の場所からREPLを立ち上げる ソースの任意の箇所にbinding.pryを書いてRubyのプログラムを走らせると、実行中にその行でストップしてpryのREPLが立ち上がり、その環境での変数がどうなっているか
itamaeは軽量でChefライクなサーバ構成管理ツールです。詳しくはこちら。 本稿ではitamaeで独自のresourceを定義する方法を紹介します。 resourceとは 文字通りサーバが持つ各リソースの種類に対応していて、itamaeではレシピにresourceを列挙することによってサーバの状態を定義します。 itamaeにはresource pluginを定義するための機構があり、簡単に独自のresourceを定義することができます。 plugin機構の仕組み レシピのmethod_missingでItamae::Plugin::Resource::*が探される レシピに と書くと、レシピのmethod_missingでItamae::Plugin::Resource::Fooが探されます。 itamaeのレシピが読み込まれた段階でこのFoo resourceがレシピのchildr
概要 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ページを開く