# activesupport/lib/active_support/core_ext/digest/uuid.rb#58
+ def self.pack_uuid_namespace(namespace)
+ if [DNS_NAMESPACE, OID_NAMESPACE, URL_NAMESPACE, X500_NAMESPACE].include?(namespace)
+ namespace
+ elsif use_rfc4122_namespaced_uuids == true
+ match_data = namespace.match(/\A(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})\z/)
+
+ raise ArgumentError, "Only UUIDs are valid namespace identifiers" unless match_data.present?
+
+ match_data.captures.map { |s| s.to_i(16) }.pack("NnnnnN")
+ else
+ ActiveSupport::Deprecation.warn <<~WARNING.squish
+ Providing a namespace ID that is not one of the constants defined on Digest::UUID generates an incorrect UUID value according to RFC 4122.
+ To enable the correct behavior, set the Rails.application.config.active_support.use_rfc4122_namespaced_uuids configuration option to true.
+ WARNING
+
+ namespace
+ end
+ end
# activesupport/lib/active_support/core_ext/class/subclasses.rb#L17
def descendants
ObjectSpace.each_object(singleton_class).reject do |k|
k.singleton_class? || k == self
end
- end
+ end unless method_defined?(:descendants) # RUBY_VERSION >= "3.1"
つっつきボイス:「ActiveSupport::DescendantsTrackerにあるdescendantsメソッドが、Ruby 3.1にネイティブのClass#descendantsが入ったのを機にRubyのバージョンを見て切り替えるようにしたんですね」「Active SupportにあるメソッドがこうやってRuby本家に取り入れられることはときどきありますよね」「descendantsもとうとう出世メソッドになった」「出世おめでとうございますImage may be NSFW. Clik here to view.」
:year_formatオプションと同様の:day_formatオプションをdate_selectに追加。
ロケールをja(日本語)にしたRailsアプリケーションとrails-i18nではdate_selectで以下が表示される。 Image may be NSFW. Clik here to view.
日本では2021-10-29という日付を2021年10月29日と表示するのが普通(年はyear、月はmonth、日はdayの意味)。
しかし現在のdate_selectにはdayの書式をカスタマイズするオプションがないのでday_formatを追加した。
# 同リポジトリより
require 'test_helper'
class UserTest < ActiveSupport::TestCase
let(:user_ken) { User.create! :email => 'ken@metaskills.net' }
it 'works' do
user_ken.must_be_instance_of User
end
end
Ruby と Go を比較する様な雑記事かと思って読み進めたら Ruby で Go の処理系書いてる変態記事だった。(良い意味で) / “A no-go fantasy: writing Go in Ruby with Ruby Next — Martian Chronicles” https://t.co/wvor6I4wKN
つっつきボイス:「記事ではrefinementsまで登場してる」「RubyのStructは、いわゆるPORO(Plain Old Ruby Object)ですね: OpenStructは登場してから多少変わってきたようですが、RubyのStructはそれほど変わっていないかな」「StructはMarshalのdumpやrestoreも問題なくできたはず」
> What I can remember of that meeting was the insistence of John McCarthy, that any new language should have what he called overloading of operatorshttps://t.co/tUlBoFBNxK
「目次を見た限りでは、クラウドサービスのカタログというよりも、コンピュータサイエンスの基礎のようにアーキテクチャをみっちり学ぶ本のようですね」「そうそう、コンピュータサイエンス基礎という感じで、最初はモノリスだったのがだんだん大きくなってサーバーレスになって…みたいなことが解説されてました」「一般性が高くてなかなかよさそうな本Image may be NSFW. Clik here to view.: 買ってみよう」
つっつきボイス:「はてブで見つけた記事です」「お、これ読みました: GETで付けられないボディをQUERYだと付けられるんでしたっけ」「GETはボディが付けられないのでたくさん渡そうとするとURLパラメータを使うことになりますが、URLの長さに制限があるのと、URLパラメータがサーバーログに残るのが嬉しくないんですよ」「お〜」「記事にもあるように、QUERYならURLエンコードも不要でURL長さ制限にもかからないとありますね: 使えると嬉しいかもImage may be NSFW. Clik here to view.」
class Entry < ApplicationRecord
delegated_type :entryable, types: %w[ Message Comment ]
delegate :title, to: :entryable
end
class Message < ApplicationRecord
def title
subject
end
end
class Comment < ApplicationRecord
def title
content.truncate(20)
end
end
class TestController < ApplicationController
def index
name = "Sam"
age = 23
byebug
place = "Boston"
end
end
# Result
[1, 8] in /Users/sam/test_app/app/controllers/test_controller.rb
1: class TestController < ApplicationController
2: def index
3: name = "Sam"
4: age = 23
5: byebug
=> 6: place = "Boston"
7: end
8: end
(byebug) name
"Sam"
ruby/debugを使う場合
class TestController < ApplicationController
def index
name = "Sam"
age = 23
binding.break
place = "Boston"
end
end
# Result
[1, 8] in ~/test_app/app/controllers/test_controller.rb
1| class TestController < ApplicationController
2| def index
3| name = "Sam"
4| age = 23
=> 5| binding.break
6| place = "Boston"
7| end
9| end
=>#0 TestController#index at ~/test_app/app/controllers/test_controller.rb:5
#1 ActionController::BasicImplicitRender#send_action(method="index", args=[])
(rdbg) name # ruby
"Sam"
(rdbg) continue # command
#!/usr/bin/env ruby
require 'rubygems'
# Prepares the $LOAD_PATH by adding to it lib directories of the gem and
# its dependencies:
gem 'rspec-core'
# Loads the original executable
load Gem.bin_path('rspec-core', 'rspec')
#!/usr/bin/env ruby
require 'rubygems'
# Prepares the $LOAD_PATH by adding to it lib directories of all gems in the
# project's bundle:
require 'bundler/setup'
load Gem.bin_path('rspec-core', 'rspec')
If action is the empty string, let action be the URL of the form document.
html.spec.whatwg.orgより
「今までは以下のように<form method="get">をアクションなしで作りたくてもform_withやform_forなどではデフォルトでurl_for({})が使われるので作る方法がなかったということみたい」「たしかに、今まではform_withやform_forを使うと必ずaction="/postsみたいなアクションが<form>タグに入ってたので、アクションなしのフォームもありとは知りませんでした」「この機能を自分で使う状況はあまり思いつかないけど、HTMLの仕様で許されていることができないとRailsの自由度が下がってしまうことになるので、できる方がいいでしょうねImage may be NSFW. Clik here to view.」
<form method="get">
<button name="sort" value="desc">Most to least</button>
<button name="sort" value="asc">Least to most</button>
</form>
form_for @post do |f|
f.field_tag :tag, name: f.field_name(:tag, multiple: true)
# => <input type="text" name="post[tag][]">
end
Sean Doyle
同PRより
つっつきボイス:「今回はフォーム周りの改修が多いですね」「お〜、フォームのフィールドでネステッドな連想配列形式のフィールド名を指定する公式の方法がついにできたImage may be NSFW. Clik here to view.(シンボル渡しだとtag[hoge][]のようにできなかった)」「しかもmultiple: trueにも対応しているのが偉い!」
# amatsuda/jbより
# app/views/messages/show.json.jb
json = {
content: format_content(@message.content),
created_at: @message.created_at,
updated_at: @message.updated_at,
author: {
name: @message.creator.name.familiar,
email_address: @message.creator.email_address_with_name,
url: url_for(@message.creator, format: :json)
}
}
if current_user.admin?
json[:visitors] = calculate_visitors(@message)
end
json[:comments] = @message.comments.map do |comment|
{
content: comment.content,
created_at: comment.created_at
}
end
json[:attachments] = @message.attachments.map do |attachment|
{
filename: attachment.filename,
url: url_for(attachment)
}
end
json
「jbだとRubyっぽく書けるのが嬉しいんですよImage may be NSFW. Clik here to view.」「わかります、jbuilderの書き方はDSL的ですよね」「それそれ、jbuilderで思ったとおりのJSONやXMLを出力しようと思ったらDSLの書き方を覚えないといけないんですよ」「Response.jsonとかxmlを組み立てていて細部の挙動が思うようにならないと、ERBで書く方がましという気持ちになったりしますよね」
つっつきボイス:「監査ログ機能のgemを比較する記事だそうです」「知っているのや知らないのや、いろんなのがありますね」「記事の末尾で使い分けが書かれていました」「自分はpaper_trailを使ってます」「監査ログ機能は常に何らかの形で求められる機能なので、こういうふうに定期的にまとめてくれるのはいいですねImage may be NSFW. Clik here to view.」
# 同記事より
def deliver_car(year, model, color, city)
yield check_year(year)
yield check_model(model)
yield check_city(city)
yield check_color(color)
Success("A #{color} #{year} Toyota #{model} will be delivered to #{city}")
end
def check_year(year)
year < 2000 ? Failure("We have no cars manufactured in year #{year}") : Success('Cars of this year are available')
end
def check_model(model)
@available_models.include?(model) ? Success('Model available') : Failure('The model requested is unavailable')
end
def check_color(color)
@available_colors.include?(color) ? Success('This color is available') : Failure("Color #{color} is unavailable")
end
def check_city(city)
@nearby_cities.include?(city) ? Success("Car deliverable to #{city}") : Failure('Apologies, we cannot deliver to this city')
end
つっつきボイス:「koicさんの記事にもあるように、Railsエンジニア3年目ぐらいの人を対象にした題材で銀座Rails#39に登壇いただきました: とてもいい話Image may be NSFW. Clik here to view.」「お〜、スライドを見た感じでもよき話なのが伝わってきます」「最初の頃はタスクを拾うだけで一杯になりますけど、3年目ぐらいになってくるともっといい設計にすることに目が向くようになりますよね」
def calculate_scores(test_id, participant_id)
RailsEventStore::Projection
.from_stream(stream_name(test_id, participant_id))
.init(-> { NullScore.new( })
.when(
SurveyExecution::AnswerRegistered,
->(state, event) do
state += AnswerScore.new(
skill_id: event.data.fetch(:skill_id),
score: event.data.fetch(:score)
)
end
)
.run(Rails.configuration.event_store)
.reduce(&:+)
.average_score
end
この時点ではNullScoreがないので動きません。NullScoreを実装しましょう。
class NullScore
def +(other)
raise ArgumentError unless AnswerScore === other
other
end
def ==(other)
NullScore === other
end
alias eql? ==
def hash
'NullScore'.hash
end
end
私たちのProjectionが機能しなくなりました。理由は、弊社のRails Event Storeフレームワークの現在の実装ではできないからです。初期の実装では、ステートをHashで保存し、その同じインスタンスを改変していたので動いたのですImage may be NSFW. Clik here to view.
しかし光明が見えた
WeDontDoThatHere = Class.new(StandardError)
def calculate_scores(test_id, participant_id)
Rails
.configuration
.event_store
.read
.stream(stream_name(test_id, participant_id))
.map do |event|
case event.event_type
when 'SurveyExecution::AnswerRegistered'
AnswerScore.new(
skill_id: event.data.fetch(:skill_id),
score: event.data.fetch(:score)
)
else
raise WeDontDoThatHere
end
end
.reduce(&:+)
.average_score
end
つっつきボイス:「TechRacho翻訳記事でお世話になっているArkencyさんの記事です」「ざっと見たところ、複雑なJOINをするようなデータを毎回Active Recordで取り出したりする代わりに、よく使うデータをRead Modelというもので共通化している感じかな」「広義のFacadeパターンのような趣ですね: 自分はこういうふうに複雑なものをうまく共通化するのは割と好きImage may be NSFW. Clik here to view.」「そうそう、よく使うクエリ結果を取り出すFacadeみたいな感じですね」「それにRead Modelという呼び方を与えたということでしょうね」
# 同記事より
ApplicationRecord.transaction do
booking = Booking.create!(params)
CalendarReadModel.handle_booking_created(booking)
end
「記事のRead Modelは、ActiveRecord::Relationを返さないようにすれば何も気にしないで使ってもよいものですねImage may be NSFW. Clik here to view.: その代わり返す結果が巨大だとメモリを大量に消費しますが」「そうそう」「もっともCQRS(コマンドクエリ責務分離)↓の文脈ではActiveRecord::Relationを返すことはしなさそうですけどね」
つっつきボイス:「久しぶりのHanami記事ですね」「Hanamiの公式ブログ記事にあったRailsとHanamiのアーキテクチャ比較図がよかったので取り上げてみました」「なるほど、RailsでRoutesから直接コントローラのアクションを呼ぶとか、そこからビューやヘルパーを呼び出すとかはおなじみの部分」「HanamiはモデルのところがPersistanceになってる」「こういう比較の図があるといいですね: Railsを知るにもよさそうImage may be NSFW. Clik here to view.」
「Railsチュートリアルは教育目的なのであえて認証機能を手作りしていますけど、最初からDeviseを使うとマジックが増えて初学者につらくなってしまうからでしょうね」「チュートリアルでいきなりDevise使ったらマジックオブマジックになっちゃいそうImage may be NSFW. Clik here to view.」「ちなみにRailsチュートリアルの本文では認証ライブラリとしてDeviseを推しています」
つっつきボイス:「これは?」「以下みたいにpruを呼び出すことでRubyをsedやawk的なフィルタとして手軽に使えるようにするそうです」「お〜なるほど、Rubyを-eオプションで使おうとすろとPerlのperl peよりコマンドラインが長くなりがちなので、なかなか便利そうImage may be NSFW. Clik here to view.」「pru -i Gemfile 'sub /ruby/, "foo"'でperl -i的なインライン置換もできるんですね」
# 同リポジトリより
# count letters of each line
ls -1 | pru size
# select lines longer than five letters
ls -1 | pru 'size > 5'
# 2nd to last character
ls -1 | pru self[2..-1]
Cgo must always be guarded with build tags.
Cgo is not Go. Go Proverbsより
動画では、Rob Pikeがcgoを「シーゴ」と発音しています(シージーオーではないんですね)。これは少なくとも動画の中ではC言語の神(C God)にかけていると推測しました。動画中でも「cgoを呼び出せばその結果は神のみぞ知る(God only knows)」とダジャレをかましています。詩情まではあまり手が回ってない感あります。
# request_forgery_protection.rb
def any_authenticity_token_valid? # :doc:
request_authenticity_tokens.any? do |token|
valid_authenticity_token?(session, token)
end
end
# 改修前
Foo Load (0.2ms) SELECT "foos".* FROM "foos" WHERE "foos"."passw" = ? LIMIT ? [["passw", "hello"], ["LIMIT", 1]]
# 改修後
Foo Load (0.5ms) SELECT "foos".* FROM "foos" WHERE "foos"."passw" = ? LIMIT ? [["passw", "[FILTERED]"], ["LIMIT", 1]]
Aishwarya Subramanian
同Changelogより
つっつきボイス:「お、filter_attributesでフィルタをかけたときにSQLログでも属性がフィルタされるようになったのね」「これは賢い」「SQLログはログレベルを:debugにしないと出ませんが、これはやっておくべきImage may be NSFW. Clik here to view.」
# activesupport/lib/active_support/core_ext/pathname/existence.rb#18
def existence
self if exist?
end
「なるほど、Active SupportのObject#presenceみたいなチェックをファイルの存在について行ってチェインできるのか↓」「ファイルが存在すればそのファイル自身を返して、存在しなければnilを返すんでしょうね」「後置ifだとチェックと処理が分かれてしまうけど、existence&.readなら簡潔に書き下せるのがいいですねImage may be NSFW. Clik here to view.」
つっつきボイス:「OWASPが正式にX-XSS-Protectionヘッダーを0にすべきと言っているならそのとおりにするのがよさそうImage may be NSFW. Clik here to view.」「X-XSS-Protectionヘッダー自体を削除しないのはなぜなんだろう?Image may be NSFW. Clik here to view.」「このヘッダーに対応しているブラウザがまだあるからじゃないかな: 一度広まったものをなくすのは大変」「ほんとにそうですよね」
「AWS Cloud Development Kit(CDK)↓も使ってみたいんですが、Terraformと別管理になるとしたら複雑になるんじゃないかという点が気になって、まだ手出ししてません」「以前そのあたりを調べたことがあったんですが、割と強い権限が必要になる機能がいくつもあって、そのときは諦めました」「IAMのロールやポリシーを作成できる権限はどうしても強くなるので、それならTerraformでやる方がいいのかなという気持ちにもなります」「悩みは尽きない…」
# 同リポジトリ
class Person < ApplicationRecord
kredis_list :names
kredis_list :names_with_custom_key, key: ->(p) { "person:#{p.id}:names_customized" }
kredis_unique_list :skills, limit: 2
kredis_enum :morning, values: %w[ bright blue black ], default: "bright"
end
person = Person.find(5)
person.names.append "David", "Heinemeier", "Hansson" # => RPUSH people:5:names "David" "Heinemeier" "Hansson"
true == person.morning.bright? # => GET people:5:morning
person.morning.value = "blue" # => SET people:5:morning
true == person.morning.blue? # => GET people:5:morning
「RedisのプリミティブなAPIをRubyのシンプルなオブジェクトでラップしたRubyインターフェイスライブラリという感じかな」「RDBがあるのにkredisを使う理由って何だろう?Image may be NSFW. Clik here to view.」「速度的な理由でRDBの代わりにRedisにデータを入れておきたいことはあるかも」「gem 'kredis'をGemfileに追加してインストールとあるので、デフォルトでRailsに入るわけではなさそう」
ブログ書きました。今日は改訂版チェリー本の発売日なので、改訂版の見どころをまとめてみました!できるだけ多くの人に見てもらいたいので拡散してもらえると嬉しいですImage may be NSFW. Clik here to view. Ruby 3.0に完全対応、だけじゃない!?改訂2版「プロを目指す人のためのRuby入門」が発売されましたImage may be NSFW. Clik here to view.https://t.co/z21dpUaqhR
「お、asmreplの依存関係にfiskが入っている」「fiskも@tenderloveさんが作ったんですね(ウォッチ20210713)」「fiskはもともとwilsonというプロジェクトにインスパイアされたのか」「fiskはエミュレーションとかではなくちゃんとx86アセンブラそのものが動きそうに見えるので、もしかするとasmreplもエミュレータではないのかもImage may be NSFW. Clik here to view.」
# 同記事より
loc = caller_locations(1, 1)
puts " --> called from #{loc.path} at line #{loc.lineno}"
puts " (full path: #{loc.absolute_path})"
# 同記事より
$> ruby tea.rb
1 teaspoon per cup...
Pouring water and waiting 3.5 minutes...
Ssssip! Mmmm, Assam.
--> called from tea.rb at line 9
(full path: /Users/alextaylor/code/tea.
つっつきボイス:「2つともruby-jp Slackで見かけたプルリクです」「Rubygems.orgで何か変わるんでしょうか?」「1つ目は、gemのオーナーシップをリクエストできるフォームの追加だそうです」「なるほど、ところで今さらですがrubygems.orgってRailsで構築されているんですね」「あ、ホントだ」「しかもきちんとメンテナンスされていて凄い」「NewRelicが入っているとか、そっちが気になってしまうImage may be NSFW. Clik here to view.」
「2つ目は、bundle gemを実行したときにRBSのテンプレートも追加するようにする改修だそうです」「これは話題になっていましたね: こうやってコンベンションを定めることでRBSの作成と利用を促進していくのは大事Image may be NSFW. Clik here to view.」「RBSはsigディレクトリに置くことになるのね↓」
考えるまでもないことですが、アプリがユーザー入力を受け取ったらバリデーションが必要になります。Ruby on Railsアプリでバリデーションといえば真っ先に思い当たるのがモデルのバリデーションです。しかしそれ以外のレベルのバリデーションについてはどうでしょう。モデルのバリデーションがあれば完璧なソリューションになるのでしょうか?今回はRailsアプリの4つのレベルのバリデーションを簡単にご紹介しつつ、それぞれのメリットとデメリットについて説明したいと思います。お題として、Userモデルのemailカラムを使います。
I just released Rails 7.0.0.rc1. The plan is to have the final version before Christmas. Please give it a try and report any issues you find so we can have a smooth final release https://t.co/RXf9GOFPVR
「上のコンフィグの例がまさにそうですが、マルチテナントのデータベースはテナントごとにアクセスの多さがかなり違う、つまりテナントごとにlocality(局所性)が大きく違うことが多い」「ふむふむ」「上のコンフィグのように、たとえばIPアドレスやドメイン名でshardを分けると、キャッシュが乗りやすいような形できれいに分散できるでしょうね」「あ〜たしかに」「Active Recordのコードでconnected_toを書いて自分でshardを選ばなくてもミドルウェアレベルでresolveできるようになって便利になったということだと思います」「なるほど!」「ごく一部をconnected_toでやるならともかく、広範囲でやると構成の変更も難しくなるので、ミドルウェアでできるのはいいですねImage may be NSFW. Clik here to view.」
つっつきボイス:「お〜、_raise_record_not_destroyedのときに、削除に失敗したクラス名とキーも表示するようになった」「たしかに”Failed to destroy the record”だけだと、どのレコードで失敗したのかわからないですね」「そういうときにRailsのログを探し回るというのを何度となくやってきました」「これは出る方が便利Image may be NSFW. Clik here to view.: ユーザーへのエラーメッセージで見せたくない場合には注意が必要かもしれませんが」
# activerecord/test/cases/associations/has_many_associations_test.rb#L2787
test "raises RecordNotDestroyed when replaced child can't be destroyed" do
car = Car.create!
original_child = FailedBulb.create!(car: car)
error = assert_raise(ActiveRecord::RecordNotDestroyed) do
car.failed_bulbs = [FailedBulb.create!]
end
assert_equal [original_child], car.reload.failed_bulbs
- assert_equal "Failed to destroy the record", error.message
+ assert_equal "Failed to destroy FailedBulb with #{FailedBulb.primary_key}=#{original_child.id}", error.message
end
つっつきボイス:「まだマージされていないプルリクですが、Rails 7 RC1を試していて自分もこれを踏んでしまったので取り上げてみました」「お、そういえばRails 7からUJSのサポートがなくなることになっていますね」「UJSの代わりに今後はTurbo Driveになるんですが、Railsガイドもそれに合わせて整合性を取らないといけないという流れです」「こういう部分も試してくれているのはいいですねImage may be NSFW. Clik here to view.」
The public API of some Rubyzip classes has been modernized to use named
parameters for optional arguments. Please check your usage of the
following classes:
* Zip::File
* Zip::Entry
* Zip::InputStream
* Zip::OutputStream
Please ensure that your Gemfiles and .gemspecs are suitably restrictive
to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.3.0).
See https://github.com/rubyzip/rubyzip for details. The Changelog also
lists other enhancements and bugfixes that have been implemented since
version 2.3.0.
# 同リポジトリより
class Bug < ApplicationRecord
enum status: {unassigned: 0, assigned: 1, resolved: 2, closed: 3} do
event :assign do
transition :unassigned => :assigned
end
event :resolve do
before do
self.resolved_at = Time.zone.now
end
transition [:unassigned, :assigned] => :resolved
end
event :close do
after do
Notifier.notify "Bug##{id} has been closed."
end
transition all - [:closed] => :closed
end
end
end
「aasmというステートマシンgem↓のようなことをRailsのenumでやる感じに見えますね: aasm doで書く代わりにenum doで書くのが違うけど他は似ているかな」「aasm gemは超定番ですよね」「aasmは昔からあってよく使いますけど、stateful_enumはRailsの機能を使っている分よさそうに見えるImage may be NSFW. Clik here to view.」
# aasm/aasmより
class Job
include AASM
aasm do
state :sleeping, initial: true
state :running, :cleaning
event :run do
transitions from: :sleeping, to: :running
end
event :clean do
transitions from: :running, to: :cleaning
end
event :sleep do
transitions from: [:running, :cleaning], to: :sleeping
end
end
end
# aasm/aasmより
class Job < ActiveRecord::Base
include AASM
aasm do # default column: aasm_state
state :sleeping, initial: true
state :running
event :run do
transitions from: :sleeping, to: :running
end
event :sleep do
transitions from: :running, to: :sleeping
end
end
end
「CableReady v5.0 pre-releaseのサイトを見るとこんなことが書かれてる↓」「複雑なSPAフレームワークなしにリアクティブにできるのね」「でも機能が足りなくて結局ReactとSPAを使ったりしているのをよく見かけますけどねImage may be NSFW. Clik here to view.」「StimulusJSやTurboはSPAに走らない方向で頑張っている印象あります」
CableReady offers 36 different operations that let you create reactive user experiences without the need for complex SPA frameworks.
cableready.stimulusreflex.comより
# 同記事より
def show_rank_for(target, query)
rank = catch(:rank) {
each_google_result_page(query, 6) do |page, page_index|
each_google_result(page) do |result, result_index|
if result.text.include?(target)
throw :rank, (page_index * 10) + result_index
end
end
end
"<not found>"
}
puts "#{target} is ranked #{rank} for search '#{query}'"
end
つっつきボイス:「『Rubyのしくみ(Ruby Under Microscope)』の著者のPat Shaughnessyさんによる記事です」「RubyとCrystal言語でArrayクラスの動作を掘り下げて詳しく調べている」「CrystalのプリミティブがRubyよりもかなり複雑で著者も驚いてるみたいですね」
Qiita記事書きました。アドベントカレンダーに投稿してもらったコードを僕の方で動画でレビューしてみました!今回は1日目から5日目の記事が対象ですImage may be NSFW. Clik here to view. 点字メーカープログラムのコードレビュー Part 1 – Rubyプログラミング問題にチャレンジ! -改訂版・チェリー本発売記念-https://t.co/hJIRkqxpzf
# 同リポジトリより
c.name # => "United States"
c.unofficial_names # => ["United States of America", "Vereinigte Staaten von Amerika", "États-Unis", "Estados Unidos"]
# Get the names for a country translated to its local languages
c = Country[:BE]
c.local_names # => ["België", "Belgique", "Belgien"]
c.local_name # => "België"
# Get a specific translation
c.translation('de') # => 'Vereinigte Staaten von Amerika'
c.translations['fr'] # => "États-Unis"
ISO3166::Country.translations # {"DE"=>"Germany",...}
ISO3166::Country.translations('DE') # {"DE"=>"Deutschland",...}
ISO3166::Country.all_translated # ['Germany', ...]
ISO3166::Country.all_translated('DE') # ['Deutschland', ...]
『研鑽Rubyプログラミング』の翻訳原稿(第2部以降も含めたぜんぶ)のレビュアーを若干名、追加で募集します。興味あるかたはご協力ください!!q Image may be NSFW. Clik here to view. (β版でお読みいただける第1部へのフィードバックも随時受付中です https://t.co/EXXN7Bh6hP )https://t.co/cEgmP8O4R0
「Redshift Processing Unitsで1秒単位の課金ということはクエリを投げなければ課金されないということでしょうね」「お〜、今までだとRedshiftのインスタンスを起動している時間は課金されてたのがServerlessだと変わるんですねImage may be NSFW. Clik here to view.」
「これまでのRedshiftは、まともなパフォーマンスを出そうとすると結構強力なインスタンスを買う必要があってミニマムコストがかさむので、使い始めるまでの敷居が高かったんですが、Redshift Serverlessが完全従量課金ならコンピューテーションパワーの必要なものに使いやすくなりますねImage may be NSFW. Clik here to view.」「お〜」「DynamoDBにも定額課金と完全従量課金があるので使い始めやすい↓」
概要
原著者の許諾を得て翻訳・公開いたします。