- 投稿日:2022-03-22T22:32:39+09:00
Rubyのメソッド名につく?(クエスチョンマーク)について
はじめに 末尾に ? がついているメソッドをよく見かけるけど、どういう役割なんだろう?と気になった そもそも ? はどこで使われるているの? def xx? この場合の「?」はメソッド名の一部分です。慣用的に、真偽値を返すタイプのメソッドを示すために使われます。 (引用: Rubyリファレンス) つまり ? まで含んだものがメソッド名になるということ def test? true end [1] pry(main)> test1? => true 例えばArrayクラスだと include? や empty? などのインスタンスメソッドがこれに相当する 末尾以外でも使える? 識別子というわけではないみたいから、句中には入れられない [1] pry(main)> def test?1 SyntaxError: unexpected tINTEGER, expecting ';' or '\n' def test?1 じゃあ ? をつけたら真偽値を返すようになるのか? def test2? p "test2" end [1] pry(main)> test2? "test2" => "test2" 否、 ? をつけたメソッドでも自動的に真偽値が返るわけではないみたい スタイルガイドでは The names of predicate methods (methods that return a boolean value) should end in a question mark (i.e. Array#empty?). Methods that don’t return a boolean, shouldn’t end in a question mark. # bad def even(value) end # good def even?(value) end (日本語訳)述語メソッド(ブーリアン値を返すメソッド)の名前は、クエスチョンマークで終わるべきです(例:Array#empty? 真偽値を返さないメソッドは、クエスチョンマークで終わるべきではありません。 真偽値を返すメソッドを自作するときは、末尾に ? をつけるようにしようぜ!ということみたい つまり 真偽値を返すメソッドは 末尾に ? をつけるべし ?をつけたところで、返り値が変わるわけではない 追記 コメントいただいた内容が勉強になったので追記します Rubyでの「真偽値」は単にtrue/falseを表すものではなく、 真偽性を利用するための値として扱われるため、?のつくメソッドの返り値はtrue/falseには限られないようです。 また?のつくメソッドを述語メソッドと呼ぶようです 述語メソッド predicate method 返り値を真偽値として用いるためのメソッド。メソッド名の末尾に ? を付ける習慣がある。 参考記事URL
- 投稿日:2022-03-22T21:16:41+09:00
【Ruby】Procオブジェクトの呼び出し
def foo(n) n ** n end foo = Proc.new { |n| n * 4 } puts foo[2] * 2 この答えは 16 になる。 Procを呼び出すときには、[]もしくは.callで呼び出すことができるらしい。 そのため、この問題ではputs foo[2] * 2としているため、 foo = Proc.new { |n| n * 4 } この処理が走るということらしい。 ちなみに、puts foo 2 * 2であれば、 def foo(n) n ** n end この処理が走ることになるらしい。 あっているかわからないので、詳しい方コメントいただけたら嬉しいです。
- 投稿日:2022-03-22T20:28:00+09:00
rails7(apiモード), react, dockerを使って環境構築してみた
環境 Ruby 3.1.1 Rails 7.0.2.3(apiモード) MySQL8.0 node 17.2 rails→3001port、react→3000portになるように設定する 環境構築 まずは以下のディレクトリとファイルを作成 invest_qa |-api |-Gemfile |-Gemfile.lock |-Dockerfile |-entrypoint.sh |-front |-dockerfile |-docker-compose.yml docker-compose.ymlは以下のように docker-compose.yml version: '3' services: db: platform: linux/x86_64 # M1チップ対応のため追記 image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: password ports: - '3306:3306' command: --default-authentication-plugin=mysql_native_password volumes: - mysql-data:/var/lib/mysql api: build: ./api command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - ./api:/myapp - gem_data:/usr/local/bundle ports: - "3001:3000" depends_on: - db stdin_open: true tty: true front: build: ./front command: yarn start ports: - "3000:3000" volumes: - ./front:/myapp depends_on: - api volumes: mysql-data: gem_data: driver: local dockerの環境構築(バックエンド編) Gemfileは以下のように Gemfile source 'https://rubygems.org' gem 'rails', '~> 7.0.2.3' Gemfile.lockは何も書かなくてOK Gemfile.lock entrypoint.shは以下のように entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" dockerfileは以下のように Dockerfile FROM ruby:3.1.1 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get update -qq \ && apt-get install -y nodejs yarn \ && mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] フロントとまとめdockerにbuildしていくのでひとまずフロントエンドの環境構築へ dockerの環境構築(フロントエンド編) Dockerfileは以下のように Dockerfile FROM node:17.2 RUN mkdir /myapp WORKDIR /myapp イメージの構築 以下を実行しイメージの構築をする docker-compose build railsアプリの構築 まずはrailsアプリをapiモードで作成 docker-compose run api rails new . --force --no-deps --database=mysql --skip-test --webpacker --api Gemfileが更新されてるのでイメージを再構築する docker-compose build database.ymlを修正する api/config/database.yml # # And be sure to use new-style password hashing: # https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html # default: &default adapter: mysql2 encoding: utf8 #ここ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password #ここ docker-compose.ymlで設定したパスワード host: db #ここ docker-compose.ymlでdepend_onしてる development: <<: *default database: myapp_development # Warning: The database defined as "test" will be erased and # re- (以下略) 続いてデータベースの作成のため以下を実行 docker-compose run api rake db:create reactアプリの構築 まずはreactアプリの作成 docker-compose run front npx create-react-app front frontディレクトリに新しいfrontディレクトリが作成されてしまう。。。 元あるfrontディレクトリにコピペしてなんとかしないといけない ともあれこれやればなんとかなる。 それぞれのアプリにアクセス 以下のコマンドを実行してコンテナの構築・起動をする docker-compose up http://localhost:3001 http://localhost:3000 以上で環境構築ができました。
- 投稿日:2022-03-22T19:18:06+09:00
RubyとPHPの比較(文字列と変数)
この記事の概要 Rubyで学習を始めてPHPに言語チェンジをする人が一定数いるみたいなので そういった人達が参考にするための記事です。 簡単な出力 簡単な出力からそれぞれ見ていきます。 ⚫︎Ruby puts "プログラミング" ⚫︎PHP <?php // Your code here! echo "プログラミング"; ?> PHPだと最後に;がつくのが特徴です。 両方ともプログラミングと出力されます。 ⚫︎補足 ""だけでなく''で囲むことも可 コメントの書き方 コメントの書き方がそれぞれ違います。 ⚫︎Ruby #コメント puts "Ruby" Rubyでは#を使います。 ⚫︎PHP <?php // Your code here! //コメント echo "PHP"; //コメント ?> PHPでは//を使います。 文字列と数値の連結 ⚫︎Ruby puts "Ruby"+"の"+ "勉強するぞ" #Rubyの勉強するぞ と出力 puts "1" + "00" #100と出力 puts 100 + 50 #150と出力 ""で囲むと文字列になり+をつけると連結できます。 数値に""を付けない場合は通常通り数値のままで計算されます。 ⚫︎PHP <?php // Your code here! echo "PHP"."の"."勉強をするぞ"; //PHPの勉強をするぞ echo"1"."00"; //100の出力 echo 100 + 50; //150と出力 ?> 文字連結は.を使います。 変数 何かしらの値を入れておくための箱で、 変数があることで読めるプログラムが書けるようになります。 ⚫︎Ruby #数値の計算 a = 100 #イコールで変数に代入できる b = 50 puts a + b #150と出力 #文字の連結 a = "Ruby" b = "楽しい" puts a + b ⚫︎PHP PHPの場合、変数の前には$をつけます。 <?php //数値の計算 $a = 100; $b = 50; echo $a + $b; //150と出力 //文字の連結 $a = "PHP"; $b = "楽しい"; echo $a.$b; //PHP楽しいと出力 ?> 変数の上書き 変数は下のように上書きをすることができます。 変数が同じ場合は下の変数の中身が出力されます。 ⚫︎Ruby programming_study = "Ruby" programming_study = "Rubyを学習するぞ" puts programming_study Rubyを学習するぞが出力されます。 ⚫︎PHP <?php $programming_study = "PHP"; $programming_study = "PHPを学習するぞ"; echo $programming_study; ?> PHPを学習するぞが出力されます。 注意 PHPの場合は変数に$を忘れずに 変数の繰り返し 変数は繰り返し使うことができます。 programming_study = "Ruby" puts programming_study + "を習得するぞ!" puts programming_study + "は楽しい" 出力すると Rubyを習得するぞ! Rubyは楽しい と出力されます。 <?php $programming_study = "PHP"; echo $programming_study ."を学習するぞ"; echo $programming_study ."は楽しい"; ?> と出力すると PHPを学習するぞPHPは楽しい と出力されます。 変数の文字列展開 変数を使い文字列展開することができます。 ⚫︎Ruby 変数の文字列展開をする時には#{変数}を使います。 (変数は自分や他人がわかりやすいもので自由に決められます。) day = 5 program = "Ruby" puts "週に#{day}日#{program}を学習します" 週に5日Rubyを学習しますが出力されます。 ⚫︎PHP PHPの場合は{変数}で文字列展開ができます。 <?php $day = 5; $program = "PHP"; echo "週に{$day}日{$program}を学習します" ?> 週に5日PHPを学習しますが出力されます。 ⚫︎補足 変数は自分や他人がわかりやすいもので自由に決められます。 ⚫︎変数の参考資料 https://qiita.com/Hashimoto-Noriaki/items/d705a3fb92db14de4742 PHPのHTMLへの組み込み PHPのHTMLファイルの組み込み方です。 <p> <?php echo "PHP";?>の学習 </p> PHPの開始タグが<?phpで終了タグが?>です。 <p> PHPの学習 </p> が出力されます。 参考資料 ⚫︎Ruby ⚫︎PHP
- 投稿日:2022-03-22T16:26:50+09:00
【Mac】Ruby3.1.1がインストールできなくて辛かった
なんとなく「Rails7を使ってみよう!せっかくだからRubyも新しいの入れとくか!」と思い立ったものの、全然全くインストールできずハマったのでのでその時の対処法をメモ。 実行環境:macOS Monterey(12.2.1) エラー ruby3.1.1をインストールしようとするもエラーを吐かれてしまう。 $ rbenv install 3.1.1 Last 10 log lines: checking for llvm-strip... no checking for gcc... clang checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... configure: error: in `/var/folders/r1/x9mwdc5s12z1fj1361bzv8z00000gn/T/ruby-build.20220322144842.18804.Za253O/ruby-3.1.0': configure: error: cannot run C compiled programs. If you meant to cross compile, use `--host'. See `config.log' for more details make: *** No targets specified and no makefile found. Stop. やってみた1: Xcode再インストール ググると「Xcodeを入れ直す直すべし」との声が多数あったので、XcodeとCommandLineToolsを再インストール。 [参考] https://blog.nocorica.jp/2017/01/rbenv-failed/ →同じエラーが出た。 ログを読む See 'config.log' for more detailsと言っているのでとりあえず見てよう(先に見ればいいのに)。 $ cd /var/folders/r1/x9mwdc5s12z1fj1361bzv8z00000gn/T/ruby-build.20220322140955.1606.YESPtG/ruby-3.1.1 $ cat config.log ~~略~~ clang: error: argument to '-V' is missing (expected 1 value) clang: error: no input files configure:5773: $? = 1 configure:5762: clang -qversion >&5 clang: error: unknown argument '-qversion'; did you mean '--version'? clang: error: no input files ~~ clangが何か失敗してるっぽい。 $ clang -v Apple clang version 13.1.6 (clang-1316.0.21.2) Target: x86_64-apple-darwin21.3.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin ちゃんと入ってるのにね!なんだよ!!!! やってみた2(解決): clangのバージョンを下げる 憤りながらも残念ながら「clangのバージョンを下げてみる」くらいしかやることが思いつかなかったので実行。 [参考] https://soluna-eureka.hatenablog.com/entry/2021/01/10/201341 llvmをインストール。 $ brew install llvm パスを通す。 $ vi ~/.zshrc # 下記を追加 export PATH="/usr/local/opt/llvm/bin:$PATH" export LDFLAGS="-L/usr/local/opt/llvm/lib" export CPPFLAGS="-I/usr/local/opt/llvm/include" # 追加ここまで $ source .zshrc clangはどうなったのか? $ clang -v Homebrew clang version 13.0.1 Target: x86_64-apple-darwin21.3.0 Thread model: posix InstalledDir: /usr/local/opt/llvm/bin # 元の状態 Apple clang version 13.1.6 (clang-1316.0.21.2) Target: x86_64-apple-darwin21.3.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin ちょっと変わった。うーん意味があるか怪しいが、リベンジ。 $ rbenv install 3.1.1 ~~略~~ Installed ruby-3.1.1 to /Users/hoge/.rbenv/versions/3.1.1 インストールできました!!やったね!!!!
- 投稿日:2022-03-22T11:33:22+09:00
【LeetCode】20. Valid Parenthesesを解いてみた
はじめに コーディングテスト対策としてLeetCodeの20. Valid Parenthesesを解いていく。 問題文を和訳 文字 '('、')'、'{'、'}'、'[' および ']' のみを含む文字列sを指定して、 入力文字列が有効かどうかを判断します。 入力文字列は次の場合に有効です: 1.括弧は同じタイプの括弧で閉じなければなりません。 2.括弧は正しい順序で閉じる必要があります。 Input: s = "()" Output: true 回答 20_ValidParentheses.rb def is_valid(s) temp = [] for i in 0...s.length do if temp[-1] == "(" && s[i] == ")" temp.pop elsif temp[-1] == "[" && s[i] == "]" temp.pop elsif temp[-1] == "{" && s[i] == "}" temp.pop else temp.push(s[i]) end end return temp.length <= 0 ? true : false end 最後に 難易度はEasyでした。
- 投稿日:2022-03-22T11:28:04+09:00
【LeetCode】14. Longest Common Prefixを解いてみた
はじめに コーディングテスト対策としてLeetCodeの14. Longest Common Prefixを解いていく。 問題文を和訳 文字列の配列から最も長い共通の接頭語文字列を見つける関数を作成します。 共通の接頭語がない場合は、空の文字列 "" を返します。 Input: strs = ["flower","flow","flight"] Output: "fl" 回答 14_LongestCommonPrefix.rb def longest_common_prefix(strs) common = "" for i in 0...strs[0].length do s = strs[0][i] for j in 1...strs.length do if strs[j][i] != s return common end end common += s end return common end 最後に 難易度はEasyでした。