20211014のRubyに関する記事は6件です。

[Ruby]10進数⇄2,3,4...16進数に表示してみる(追記・訂正あり)

はじめに 本記事では、10進数⇄2,3,4...16進数に変換表示してみる記事です。 「追記」 コメントにてご指摘いただきしたが、 正式には、 `to_iメソッド`によって10進数に変換されているのではなく、 10進数として表示されたということになります。 詳しくは、以下の記事を参考にしていただけますと幸いです。 Ruby の "1101".to_i(2) は 2 進数を 10 進数に変換している,わけじゃない コード こちらを参考にしています。 →Ruby リファレンスマニュアル p 表示したい10進数の数字.to_s(表示したい○進数の○の部分を記述) # "表示したい進数の数が表示" p "表示したい○進数の数字".to_i(表示したい○進数の○の部分を記述) # 10進数に表示した数が表示 10進数でないと数値と見なされません。→間違いです。 2進数など他では文字列で表現することになります。 [訂正] 10進数のほかに、2進,8進,16進の数値リテラルがあります。 本記事のコメント欄にて情報をいただいておりますのでご確認ください。 申し訳ございません。 以下、実際に2~16進数へ表示してみました。 p 255.to_s(2) # "11111111" p 255.to_s(3) # "100110" p 255.to_s(4) # "3333" p 255.to_s(5) # "2010" p 255.to_s(6) # "1103" p 255.to_s(7) # "513" p 255.to_s(8) # "377" p 255.to_s(9) # "313" p 255.to_s(10) # "255" p 255.to_s(11) # "212" p 255.to_s(12) # "193" p 255.to_s(13) # "168" p 255.to_s(14) # "143" p 255.to_s(15) # "120" p 255.to_s(16) # "ff" せっかくなんで、それらを10進数で表示します。 p "11111111".to_i(2) # 255 p "100110".to_i(3) # 255 p "3333".to_i(4) # 255 p "2010".to_i(5) # 255 p "1103".to_i(6) # 255 p "513".to_i(7) # 255 p "377".to_i(8) # 255 p "313".to_i(9) # 255 p "255".to_i(10) # 255 p "212".to_i(11) # 255 p "193".to_i(12) # 255 p "168".to_i(13) # 255 p "143".to_i(14) # 255 p "120".to_i(15) # 255 p "ff".to_i(16) # 255 以上です。 終わりに ITパスポートの勉強で、 2進数から10進数に変換する問題があったので、 rubyでできるのかなと思い、調べました。 余裕でできましたね。 明日も頑張ります!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]10進数⇄2,3,4...16進数に変換してみる

はじめに 本記事では、10進数⇄2,3,4...16進数に変換してみる記事です。 コード こちらを参考にしています。 →Ruby リファレンスマニュアル p 変換したい10進数の数字.to_s(変換したい○進数の○の部分を記述) # "変換したい進数の数が表示" p "変換したい○進数の数字".to_i(変換したい○進数の○の部分を記述) # 10進数に変換した数が表示 10進数でないと数値と見なされません。→間違いです。 2進数など他では文字列で表現することになります。 [訂正] 10進数のほかに、2進,8進,16進の数値リテラルがあります。 本記事のコメント欄にて情報をいただいておりますのでご確認ください。 申し訳ございません。 以下、実際に2~16進数に変換してみました。 p 255.to_s(2) # "11111111" p 255.to_s(3) # "100110" p 255.to_s(4) # "3333" p 255.to_s(5) # "2010" p 255.to_s(6) # "1103" p 255.to_s(7) # "513" p 255.to_s(8) # "377" p 255.to_s(9) # "313" p 255.to_s(10) # "255" p 255.to_s(11) # "212" p 255.to_s(12) # "193" p 255.to_s(13) # "168" p 255.to_s(14) # "143" p 255.to_s(15) # "120" p 255.to_s(16) # "ff" せっかくなんで、10進数に戻します! p "11111111".to_i(2) # 255 p "100110".to_i(3) # 255 p "3333".to_i(4) # 255 p "2010".to_i(5) # 255 p "1103".to_i(6) # 255 p "513".to_i(7) # 255 p "377".to_i(8) # 255 p "313".to_i(9) # 255 p "255".to_i(10) # 255 p "212".to_i(11) # 255 p "193".to_i(12) # 255 p "168".to_i(13) # 255 p "143".to_i(14) # 255 p "120".to_i(15) # 255 p "ff".to_i(16) # 255 以上です。 終わりに ITパスポートの勉強で、 2進数から10進数に変換する問題があったので、 rubyでできるのかなと思い、調べました。 余裕でできましたね。 明日も頑張ります!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ルーティングのネストについて!

①.結論! ネストは、ある記述の中に別の記述をして、親子関係を示す方法です! 「入れ子構造」とも呼ばれます! ルーティングにおけるネストとは、あるコントローラーのルーティングの中に、別のコントローラーのルーティングを記述することです! ルーティングをネストさせる一番の理由は、アソシエーション先のレコードのidをparamsに追加してコントローラーに送るためです! 例を見ながら解説していきます! ②.記述について! 下記が記述の形になります! routes.rb Rails.application.routes.draw do resources :親となるコントローラー do resources :子となるコントローラー end end ルーティングでネストを利用すると、アクションを実行するためのパスで、親子関係を表現できます! 例えば、eats_controller.rbのルーティングの中にcomments_controller.rbのルーティングを記述します! ネストを利用したときに設定されるルーティングの例を見てみます! 【例】ネストを利用した場合 Prefix Verb URI Pattern Controller#Action eat_comments POST /eats/:eat_id/comments(.:format) comments#create パスの:eat_idという部分に記述された値は、パラメーターとして送られます! もし、ネストを利用しなかった場合は、:eat_idのような、パスにパラメーターを含められる部分がありません! 【例】ネストを利用しなかった場合 Prefix Verb URI Pattern Controller#Action comments POST /comments(.:format) comments#create 以上からわかるように、ルーティングにネストを利用しなければ、モデルと結びついている別モデルのid情報が送れなくなります! ネストを利用すれば、id情報を含めることができます! 最終的な書き方の例は以下の通りです! routes.rb Rails.application.routes.draw do resources :eats do resources :comments, only: :create end end ③.まとめ ネストとは、入れ子構造とも呼ばれ、ある記述の中に別の記述をする方法のこと! と言う事ですね! なかなか難しいですが、1つ1つ概念を分解して理解することが大切だと思います! 何か説明で間違っていたらご指導お願い致します(_ _)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】<%= %>内でstyle要素を書く方法

こんにちは!テックアカデミーのWebアプリコースを受講している駆け出し高校生エンジニアの安田駿介です。 今回は、「Ruby <%= %>内でstyle要素を書く方法」というテーマで解説していきます。 誤った書き方 このような書き方だと、エラーになってしまうはずです。 正しい書き方 style要素に注目すると、=ではなく、:を使っています。 開発環境 ・Cloud9 ・Ruby 3.0.0 ・Rails 6.1.3.1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsとTiDBの統合について

この記事は dev.toで発表されたものです。 このチュートリアルは、RailsとTiDBの統合に関する、おそらくWebで初めてのチュートリアルです。TiDBは、水平的なスケーラビリティ、高可用性、MySQLとの互換性を特徴とする、オープンソースの分散SQLデータベースです。 初心者にとって、ActiveRecordのような複雑なORMをTiDBに統合するのは難しい可能性があります。Web上にはこのトピックを扱っている記事がほとんどないことから、私はRailsユーザーによるTiDB導入を支援するために、このチュートリアルを執筆しました。 TiDB開発環境をローカルで構築する Railsとの統合に先立って、TiDBクラスタをローカルマシンにデプロイする必要があります。TiDBでは、TiDBエコシステム用のパッケージマネージャーであるTiUPによって、デプロイを円滑に進められるようになっています。 TiUPのインストール TiUPのインストールは、Darwin、Linuxのどちらのオペレーティングシステムからも簡単に行うことができます。次のコマンドを実行するだけです。 $ curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh これによって$HOME/.tiup/binがPATH環境変数に追加され、TiUPを直接使用できるようになります。 ローカルクラスタの確立 一般的にTiDBクラスタは複数のノードを必要とするため、デプロイが複雑で時間がかかる場合があります。そのためTiUPは、TiDBのテスト環境をローカルですばやく構築できる、TiUPコンポーネントのplaygroundを用意しています。 このコマンドは次のようにシンプルなものです。 $ tiup playground 次のように出力されます。 $ tiup playground Starting component ``playground``: /Users/hooopo/.tiup/components/playground/v1.4.1/tiup-playground Use the latest stable version: v5.0.0 Specify version manually: tiup playground <version> The stable version: tiup playground v4.0.0 The nightly version: tiup playground nightly Playground Bootstrapping... Start pd instance Start tikv instance Start tidb instance Waiting for tidb instances ready 127.0.0.1:4000 ... Done Start tiflash instance Waiting for tiflash instances ready 127.0.0.1:3930 ... Done CLUSTER START SUCCESSFULLY, Enjoy it ^-^ To connect TiDB: mysql --host 127.0.0.1 --port 4000 -u root -p (no password) To view the dashboard: http://127.0.0.1:2379/dashboard To view the Prometheus: http://127.0.0.1:9090 To view the Grafana: http://127.0.0.1:3000 これでローカルクラスタが確立されました。 TiDB Dashboardへのアクセス TiDBには、クラスタを監視するためのWeb UI、TiDB Dashboardが用意されています。これはすでにPDコンポーネントに組み込まれており、http://127.0.0.1:2379/dashboard から直接アクセスできます。 TiUPの詳細については、公式ドキュメントをご覧ください。 RailsをTiDB用に設定する TiDBクラスタを確立したところで、次にこれをRailsと統合します。 Railsプロジェクトの作成 TiDBはMySQLとの互換性があるため、MySQL用に設定されたRailsアプリを作成できます。 $ rails new myapp --database=mysql database.ymlの設定 database.ymlでは次の2つの重要な設定があります。 portを4000に設定します。ローカルのTiDBクラスタは、4000をデフォルトのポートとして使用します。 データベース接続変数tidb_enable_noop_functionsをONに設定します。Railsは、TiDBではデフォルトで無効になっているget_lock関数を使用する必要があります。 default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> port: 4000 username: root password: host: 127.0.0.1 variables: tidb_enable_noop_functions: ON URIメソッドを使用してデータベース接続を設定する場合も、設定方法は同様です。 default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> url: <%= ENV.fetch("DB_URL") || "mysql2://root:pass@localhost:4000/myapp" %> variables: tidb_enable_noop_functions: ON プライマリキー、自動インクリメント、一意インデックスの設定 usersというテーブルを作成します。 class CreateUsers < ActiveRecord::Migration[6.1] def change create_table :users do |t| t.string :email t.string :password t.string :username t.timestamps end end end 一意インデックスを追加します。 class AddUniqueIndexForEmail < ActiveRecord::Migration[6.1] def change add_index :users, :email, unique: true end end TiDBはMySQLとの互換性があるため、使用方法はスタンドアロンのMySQLデータベースとほとんど同じです。プライマリキー、自動インクリメント、一意インデックスなどの機能について互換性がない他の分散データベースと比較して、追加の処理が不要なTiDBは導入が非常に容易です。 ここまでで、次のようなデータテーブルが生成されます。 mysql> show create table users; + -------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+ | users | CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `email` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `username` varchar(255) DEFAULT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */, UNIQUE KEY `index_users_on_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 | +-------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+ 1 row in set (0.01 sec) セーブポイントへのパッチの追加 TiDBとActiveRecordを結合するうえで1つだけ障害になるのが、現時点ではTiDBではセーブポイントがサポートされていないことです。そこで、これを解決する簡単なパッチを作成しました。 # https://github.com/rails/rails/blob/6-1-stable/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb#L313 require 'active_record/connection_adapters/abstract/database_statements.rb' module DisableSavepoint def transaction(requires_new: nil, isolation: nil, joinable: true) if requires_new requires_new = nil Rails.logger.warn "savepoint statement was used, but your db not support, ignored savepoint." Rails.logger.warn caller super(requires_new: requires_new, isolation: isolation, joinable: joinable) else super(requires_new: requires_new, isolation: isolation, joinable: joinable) end end end ActiveRecord::ConnectionAdapters::DatabaseStatements.send(:prepend, DisableSavepoint) Railsでセーブポイントを使用するのは、トランザクションがtrueをパラメータrequires_newに渡す場合に限られます。その場合は、このパッチによってrequires_newの値がnilに変更され、移行のためのログが出力されます。 私の経験では、Railsプロジェクトでセーブポイントが頻繁に使用されることはほとんどないため、移行が必要になった場合でも大きな問題はありません。マイグレーションを行う場合はセーブポイントを使用しますが、並行して実行する移行がなければ、セーブポイントを削除しても予期しない結果になることはありません。 参考資料 What's New in TiDB 5.0 tidb_enable_noop_functions TiDB's Compatibility with MySQL Source code for rails-tidb Demo
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]any?を||の代わりに使わない

Rubyの配列(Array)にはany?という便利メソッドがあります。 すべての要素が偽である場合に false を返します。真である要素があれば、ただちに true を返します。 ブロックを伴う場合は、各要素に対してブロックを評価し、すべての結果が偽である場合に false を返します。ブロックが真を返した時点で、ただちに true を返します。 上記はドキュメントから転記しました。 any?を使うことで、配列内に特定の条件を満たした要素が1つ以上あること(または存在しないこと)を確認することができます。 また、真の要素が見つかったら以降の判定は行われないと記載されているため計算効率も良いです。 簡単に動作確認をしてみます。 配列[5, 3, 4]の中に3以下の数値があるかをチェックしています。 何が判定されたか可視化できるように判定ごとにp _1で判定した要素を出力するようにしています。 irb(main):005:0> ary = [5, 3, 4] irb(main):012:1> ary.any? do irb(main):013:1* p _1 irb(main):014:1* _1 <= 3 irb(main):015:0> end 5 3 => true 2つ目の要素3がtrueとなるため、以降の要素4は判定されていないことがわかります。 また、配列内の要素の真偽を判定するだけであれば、ブロックやパタメーターなしで使うことができます。 irb(main):028:0> [nil, 'a'].any? => true any? を || の代わりに使わない ここからがこの記事の本題です。 ブロックやパラメーターなしのany?を応用すると、複数項目のor条件の代わりに使えることがわかります。 例えばifの条件であったり、?メソッドの戻り値などでany?を使えます。 if hoge? || fuga? || piyo? # hoge?, fuga?, piyo?のいずれかがtrueの場合に実行される end # any?を使って下記のように書くこともできる if [hoge?, fuga?, piyo?].any? end # hoge?, fuga?, piyo?のいずれかがtrueか? def any_truthy? hoge? || fuga? || piyo? end # any?を使って下記のように書くこともできる def any_truthy? [hoge?, fuga?, piyo?].any? end 当初、私はどちらの書き方も好みの問題だけで、どちらでも良いと考えていました。 ただ、このパターンの場合は明確に||の方が良いということができます。 実際にhoge?, fuga?, piyp?メソッドを使って処理を確認してみます。 今回はfuga?だけがtrueを返却するようにしています。また、呼び出されたことがわかるようにプリントするようにしています。 def hoge? p 'hoge' false end def fuga? p 'fuga' true end def piyo? p 'piyo' false end ここで下記のように判定した場合、どうなるでしょうか? [hoge?, fuga?, piyo?].any? 前から処理していくと、fuga?がtrueを返却するのでpiyo?は確認しなくてもany?はtrueが確定しているのですがpiyo?も実行されてしまいます。 irb(main):015:0> [hoge?, fuga?, piyo?].any? "hoge" "fuga" "piyo" => true 一方、||を使うとpiyo?の判定は行われません。 irb(main):015:0> hoge? || fuga? || piyo? "hoge" "fuga" => true 上記の通り、any?を使った場合は3つのメソッドが全て呼び出されますが、||の場合はhoge?やfuga?がtrueになった場合に後続メソッドが呼び出されないので効率が良いです。 any?も真の要素が見つかれば処理が中断するのではなかったっけ??という疑問が起きると思いますが、[hoge?, fuga?, piyo?].any?の処理を分解すると下記のように動作しています。 最初に配列[hoge?, fuga?, piyo?]を生成 この時点でhoge? / fuga? / piyo?は判定されて、[false, true, false]という配列が生成されています。 [false, true, false]を先頭から順に判定 2つ目がtrueのため判定は終了します。最後のfalseの判定は行われません。 判定の前に配列の生成を行ってしまうため、配列内の要素はすべて実行されてしまうんですね。 上記のように||の代わりにany?を使う場合は、好みの問題だけでなくパフォーマンスにも影響があるので||を使うようにしましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む