@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

Ruby

Legacy on Rails

最近古いバージョンのRailsに触ることが多かったので、二度と使わないで済むことを祈りつつ、得た知見をメモします。 Ruby 2.4 と PostgreSQL と Rails 3.2 Rails 3.2 と PostgreSQL とRuby 2.4で rake db:create だけコケるおもしろ現象に出会いました。 ht…

React on Ruby on Railsの素振り

Ruby on RailsとReactの連携の仕方がイマイチ理解できていないので、簡単なアプリケーションを作って勉強します。 4月生まれのホットな動画を見つけたのでこちらを参考にします。 www.youtube.com 動画でなくテキストがお好みの人は、GitHub - zayneio/open-…

一度moveしたオブジェクトは移動先のRactorが死んでも帰ってこない

moveしたオブジェクトを参照するとRactor::MovedError 次のRubyスクリプトがあります。 dead = Ractor.new {} dead.send STDIN, move: true STDIN.gets RactorにSTDINをmoveしてから、STDINを使います。 するとRactor::MovedErrorが起きます。 ~ ruby dead_a…

sjisの文章をShift_JISとして読むとEncoding::UndefinedConversionError

Rubyの話です。 ‘Ⅸ’(ローマ数字の9) を含むsjisの文章をShift_JISとして読むとエラーが起きます。sjisとして読むとエラーが起きません。 たとえば、 'Ⅸ'.encode('sjis', 'utf-8').encode('utf-8', 'Shift_JIS') はエラーが起きて 'Ⅸ'.encode('sjis', 'utf-…

rbenvでのバージョン指定が効かなくなりました

~ rbenv version 2.5.5 (set by /Users/shigerunakajima/pubannotation/.ruby-version) ~ ruby --version ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin18] ruby のバージョンが上がっている。パスが上書きされたのでしょうか? ~ echo $P…

gem install libxml-ruby -v '3.1.0' に失敗します

Building native extensions. This could take a while... ERROR: Error installing libxml-ruby: ERROR: Failed to build gem native extension. current directory: /Users/shigerunakajima/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/libxml-ruby-3…

切符を通したときだけ通れる改札口Ractor

前回、Ractor.selectでtakeとrecvを両方待てることがわかりました。 これを使って切符を通したときだけ通れる改札口を作ります。 完成形 キーボード入力を待つRactor = Ractor.new { loop { Ractor.yield gets.chomp } } 改札口Ractor = Ractor.new(キーボー…

Ractor.recvの代わりにRactor.selectする

RactorはsendされたメッセージをRactor.recvで受け取ります。 Ractor.selectでも受け取れます。 例えば、次の例です。 r = Ractor.new do # message = Ractor.recv と同じ _, message = Ractor.select self p "Hello #{message}!" end r.send 'World' r.take…

歌うRactor

Ractorで歌ってみましょう。 歌う部分はRactorは関係ありません。出落ちです。 Ractor内で、spawnしたプロセスをメインスレッドでkillできるか確認します。 非同期なspawn関数をRactor内で実行する必要があるのかは知りません。 完成形 LYRICS =<

Ractor間のメッセージ送受信 Pull型とPush型

やることは前回と同じです。Ractorの構成を組み替えてみました。 Pull型とPush型 Ractorのメッセージ送受信にはPull型とPush型があります。 前回、メインスレッド(?)でRactorインスタンスをselectしてイベントを待ちました。Pull型です。 Pull型 今回、描…

Ractorを使ったTUIプログラムの一歩

前回のユーザー入力とクロックを両方待つプログラムを少し改造します。 Enter以外の入力を受け取る カーソルを移動せずに書き換える 後者はRactorは関係ないです。 Enter以外の入力を受け取る 任意の1文字を受け取るためにSTDIN.getchを使いたいです。 STDIN…

Ractorを試す 改訂版

macOS で https://github.com/ko1/ruby/tree/ractor のソースコードをビルドする方法を改善しました。 インストール先 コンパイルしたRubyをmake installしたら「PCの環境が壊れるかも」とビビっていたところ、 id:hanachin さんに ./configure --prefix="$H…

Ractorをつかうプログラムの練習 2つのイベントを待つ

Ractorをつかって、ユーザー入力とクロックを両方待つプログラムを書いてみます。 練習中であり、Ractorを使ったイケているソースコードではありません。 次のプログラムを実装します。 1秒毎にカウントアップします。 ユーザーがEnterキーを押したらカウン…

Ractorを使ってプログラムを書く練習    

注意:Ractorならではとか、計算効率の良さとか考えていません。 1から10までを足す # 最終結果送り先のRactor CR = Ractor.current r = Ractor.new { CR << Ractor.recv } 1.upto(10) do |i| # 数を足すRactorを作ってポインタを置き換える r = Ractor.new(…

Ractorを試す

Ruby3 さみっと online - connpass を見ていました。 Ractorの発表を見て使ってみたくなったので環境を整えてみます。 ビルドする https://github.com/ko1/ruby/tree/ractor のソースコードをビルドします。 git clone git@github.com:ko1/ruby.git ractor c…

RubyMineのターミナルが壊れた話

RubyMineのターミナルのシェルがおかしいです。 パスから/usr/local/binが消えてしまった。rbenvが動かせません rbenvが動かせません。 シェルにはfish-shellを使っています。 fish-shellの起動時に、次のエラーメッセージが出ます。 ~/.config/fish/config.…

Rubyのコンパイルに挑戦した記録

OpenSSLがみつからない GithubのREADMEに従って git clone git@github.com:ruby/ruby.git して ./configure make make check すると、次のような警告メッセージがでました。 *** Following extensions are not compiled: openssl: Could not be configured. …

RSpecでSharedExamplesを使ったときのエラー表示の現状

RSpecで、SharedExamplesを使うと、失敗したテストの行番号の代わりに [1:2:2:3:1] みたいなのが表示されて、どのテストを見ればいいのかわかりにくくなるのが辛いです。 2015年からInclude line numbers as well as index in output · Issue #2119 · rspec/…

今週の作業メモ

spring Rails 5.2.3でrails consoleを実行すると、プロンプトが出る前で止まります。 ~ bundle exec rails --version Rails 5.2.3 ~ bundle exec rails c ^CTraceback (most recent call last): 15: from bin/rails:3:in `<main>' 14: from bin/rails:3:in `load' </main>…

Ruby2.6 に関数合成オペレータが追加されたのでFizzBuzzで遊ぶ その2

ledsun.hatenablog.com の続きです。 もうちょっと関数合成しがいのある書き方を思いつきました。 fizz = -> x {[x, ('Fizz' if x % 3 == 0)]} buzz = -> (x) {[x[0], x[0] % 5 == 0 ? "#{x[1]}Buzz" : x[1]]} filter = -> (x) {x[1] || x[0]} do_fizzbuzz =…

RubyKaigiに行く意味とは?

結論をいうと「RubyKaigiに行くと自分が世界最高のエンジニアになる可能性」が得られます。どういうことでしょうか? 目的地を知らないとどうがんばっても目的地にたどりつけません。当たり前の話です。エンジニアとしての成長も一緒です。自分がエンジニア…

Ruby2.6 に関数合成オペレータが追加されたのでFizzBuzzで遊ぶ

fizzbuzz = -> x { x % 15 == 0 ? 'FizzBuzz' : x % 5 == 0 ? 'Buzz' : x % 3 == 0 ? 'Fizz' : x } p_fizzbuzz = -> x { p x } << fizzbuzz 1.upto(15){ | n | p_fizzbuzz.call(n) } pと合成するだけでは面白くないですね。 fizz = -> x { (x.is_a? Integer)…

#railsdm Rails Developers Meetup 2018 Day 4 Nouvelle Vague で発表しました

Rails Developers Meetup 2018 Day 4 Nouvelle Vague で発表してきました。 趣旨は「ActiveRecordやActiveJobなどのRailsの用意した抽象インタフェースを使うと、アプリケーションのミドルウェア構成、ひいてはアーキテクチャの決定を遅らせる事ができる。そ…

Ruby on Railsの開発環境でマルチスレッドでクラス定義を探索すると刺さるが再現できなかった話

現象 Ruby on Railsの、ActiveJob内で起動したスレッドで非同期にDBに書き込もうとすると、ActiveRercordのクラス探索で無限に待って固まります。 わかっている条件 ActiveJobで起きる ActiveJobのQueueAdapterにはAsync adapterを使っている DBへの接続以前…

<Repository (class)> yielded |nil| to block with

RSpecMockで見慣れないエラーが起こせました。 再現コードをメモります。 class Repository; end RSpec.describe do it do expect(Repository).to receive(:doc).and_yield(nil) Repository.doc {} end end 実行すると ~ rspec spec.rb F Failures: 1) shoul…

#rubykaigi 2018でLTしました

会社がお金を出してくれるのでRubyKaigiへの参加が決まっていました。 どうせ参加するなら何かしら発表したいです。 LTに応募したら通りました。 資料です。 speakerdeck.com 結論に被さるぐらいの勢いで銅鑼が鳴りました。 英語で発表 英語での発表にチャレ…

面白かったけど役に立てられる気がしないセッション #rubykaigi

Hijacking Ruby Syntax in Ruby Hijacking Ruby Syntax in Ruby from SATOSHI TAGOMORI クレイジーでした。Binding#local_variable_set や TracePoint を使ってRubyの言語仕様を拡張しようという趣旨です。 CRuby本体を拡張せずに、新文法のProof of concept…

印象に残ったセッション #rubykaigi

Ferrari Driven Development: superfast Ruby with Rubex Parallel and Thread-Safe Ruby at High-Speed with TruffleRuby (Keynote) Ferrari Driven Development: superfast Ruby with Rubex RubyのC拡張を作るためのプログラミング言語の話でした。 グルー…

仙台駅から国際センターまで歩く #rubykaigi

1.5kmぐらいですが、だらだらと見物しながら歩いて1時間ぐらいでした。 市街 街に歴史あり 大町西公園駅から広瀬川を渡る 主要部から徒歩圏内でこの景観 ゴール 伊達家の家臣のお家の跡にカンファレンスセンター

RubyKaigi 2018 参加に関するお金の話

弊社では、今年からRubyKaigi 2018への参加支援を始めました。 今年は3人の参加者がいます。 主にお金周りの準備の仕方のメモを残します。 参加費 参加者個人で申し込んで支払いました。 以下の文書で経費精算 doorkeeperからの支払い確認メール Paypalから…