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

【Ruby】早期return

早期リターン 式の値を戻り値としてメソッドの実行を終了。式が省略された場合には nil を戻り値とする。 条件分岐のネストが深くなりすぎてコードを読みにくくなってしまうときに使用すると可読性が高まる。 「Guard Clause」「ガード節」「ガード条件」「ガード構文」と呼ばれることもある。 def invalid_permission?(user) if user.present? #<= この例外処理はGuard Clauseで書き直せる case user.permission when 1,2,3 false else true end else true end end def invalid_permission?(user) return true if user.blank? #<= この1行で例外チェックをネストなしで完了できる case user.permission when 1,2,3 false else true end end 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

産業用ロボット販売営業職からエンジニアになってみて

前職の内容 制御機器を取り扱う商社でSE("セールス"エンジニア)をやっていました。 要は、メーカーの生産技術の方などに、省人化の提案をし、ロボットを買ってもらう営業の仕事です。 エンジニアになろうと思ったきっかけ 慣れてくると、作業をこなすだけの仕事をやるのが自分の性には合わなかったんです。エンジニアは技術の移り変わりが比較的早い職業ですし、どんどん新しい事にチャレンジできますよね。 まず前職の仕事に飽きが来たというお話をします。 SEと言っても技術的には、物体を掴んで別の場所に移動させて置くだけの簡単なプログラムを書くだけの事しかやりません。 しかもそのプログラムとは、メーカー専用のタブレットのGUI上でボタンを押し、ツリー上に各処理を追加していくだけの操作なのです。 SEといっても、やはり営業なので、いかに製品の良さを顧客に伝えれるかに注力し、顧客に買ってもらうのがメインのお仕事です。 買ってもらうためにはどうしたら良いか、次の発注に繋げるためにはどうしたら良いか、という試行錯誤はあったものの、技術的な試行錯誤をし、できなかった事をできるようにする過程がなかったので、仕事の喜びをあまり感じる事ができませんでした。 最初は楽しかったんですが、慣れてくると、同じようなプレゼンを繰り返す毎日で、飽きが来たんです。 さて、ここからがエンジニアに興味を持ったお話です。 2年ほど前に、youtubeでたまたまエンジニアの仕事を語っている方の動画を見ました。誰でも稼げるとか、本当なのか??と思うような内容ではありましたが、エンジニアとして仕事ができるようになるまでの学習の流れがわかったので、まずはちょっとprogateってサービスでプログラム書ける見たいだし、macかっこいいし、mac買ってやってみるかあ〜くらいの気持ちでやってみました。 macの画面綺麗!!見た目かっけぇ!!こんな簡単にwebのページ作れるんか!! ちょっとプログラミング面白いな。しかもリモートで働いていたり、私服勤務が多いみたいで、自分にはいいかもしれない。 という気持ちになり、エンジニアを目指す事になった訳です。 カッコ良いし割と自由そう。という気持ちが一番です。 人間、何をやるにしてもモチベーションが一番大事だと私は思っているので、きっかけとしては、これで十分でした。 エンジニアとして働いてみた感想(前職と比べてどう変わったか) ・私服通勤 ・オフィスで音楽流れてるしオフィス自体オシャレ ・スペック高いmac支給 ・定時10時〜19時 という状態で、働く環境的には大きく変わりました。 前職は、古くから続く企業なので、まあ堅苦しい感じでした。 ・リモート勤務中に私服で会議に参加したら怒られる →私服で仕事すると売り上げが落ちるんでしょうか?? 補足すると、隣の営業部の課長が毎日のように怒る人でした。 自分の部署の課長的にはリモート時の服装は私服でもokだったんで、隣の営業部の課長が堅い人だった訳です。 ・髭が濃いだけで怒られる →髭剃ってますけど画質の問題で濃く見えていたみたいです。逆に見た目の事言うとかひどくないですかね、髭濃いの私ちょっと気にしていますし。 さて、働く環境のお話は終わりにして、次は仕事内容です。 単純に良かった点、良くないと感じた点に分けた方が書きやすかったので、分けました。 良いところ エンジニアであれば当たり前ですが、 ・勤務中pcと向き合える ・やりたい技術で開発をやらせてくれる これが自分にとって良かったです。 ・勤務中pcと向き合える 営業をしていると、移動時間が必ず発生します。 少しなら良いんですが、私の場合、都内行ったり千葉行ったり茨城行ったりしていたので、一日の大半が移動時間みたいな日も当然ある訳で、時間がもったいないし、変に移動で疲れたりしました。 エンジニアは基本pcと向き合って仕事をするので、移動時間が無いです。 割と一定のリズム感で一日の仕事ができます。 ・やりたい技術で開発をやらせてくれる これは会社によって大きく違うところなので、私の会社の場合は、という前置き付きです。 会社の方針と大きく外れていなければ基本的に好きな技術で開発をさせてくれます。受託と自社開発両方やっていますが、クライアントがいわゆる開発会社では無くハイブランド系の会社なので、クライアントからの技術指定が無いです。なので、開発を行う側の私たちは、好きな技術選定ができる訳です。 自分はフロント側はVue3(言語はTypeScript), サーバー側はRuby on Rails(言語はRuby)で開発をしています。 iOSアプリ開発がやりたいと言えば、今すぐにとは行かないものの、希望は通るでしょう。 次の案件の開発は何を取り入れようかといった具合で、新しいチャレンジをさせてもらえています。入社してから成長の実感を得られているし、当初の目的であった新しいチャレンジもできているので、ひとまずこの調子でやっていこうと思えています。 良くないと感じているところ 良くないという言い方は適切ではないかもしれませんが、要するに気をつけないといけない事の話です。 ・体調不良になりやすいかもしれない ・力技で案件をこなさないようにする ・体調不良になりやすいかもしれない 自分の会社でも足腰を痛めている人や、首を痛めている人がいます。エンジニアという職種に直接関係しているかは定かではありませんが、前職の営業の会社では、40歳を超えても元気な人ばかりだったので、人と話す事や、移動する事が日常の人の方が、健康で居やすいかもしれないと感じています。 ・力技で案件をこなさないようにする 技術の移り変わりが早いので、移り行く環境に対応していく必要があるのですが、力技でプログラムを書いたり、ただただやり方を暗記したりして、日々を過ごし、年齢を重ねてしまうと、若者との差が対して開かないので、後々きついと感じています。 私は、今のところ実力のある方からのレビューを通して、1ヶ月前の自分のレベルの低さを実感できているので、引き続き成長したい気持ちです。 力技使うとすぐ指摘を喰らいますね。笑 今後はどんなエンジニアを目指したいか まずはwebの分野で日々の業務を半日で終わらせられるエンジニアを目指したいです(本当は数時間で)。で、残りの時間を自分の時間(スキルアップとか)に当てたいです。 今はある程度仕事ができるようになってきてはいますが、事前に計画を立て、ゴールまでの道筋を正確に描き、そのために必要な働きかけを主体的にできているとは言い難いので、上記ができるエンジニアを目指します。 余裕がなく日々残業しているようでは、イレギュラーな対応が来たら、その時点で計画は破綻し、計画がシンプルに遅れるか、無理をするかしか道はないですし、そのような状態では仕事を頼む側の人も仕事を頼みにくいですから。 最後に ここまで読んでいただきありがとうございます。 私と同じように感じていただける人がいれば嬉しく思います。 営業が別に嫌いな訳ではないので、エンジニアに飽きが来たら、SE的な事しても面白いかもと思ったりもします。 新しい事にチャレンジするのは確かにしんどい事ですが、やらなければ良かったと後悔した経験はほとんどないので(多分皆さんも)、色々とやっていきたいと思う所存です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】global source linesとは何か

global source lines  Gemfileに記述されるgemに対してsource、git、pathのオプションを指定しなければ、Gemfileの一行目にある引数のサイトから取得される。 source "https://rubygems.org" このsourceメソッドの行はマニュアル内で global source lines と呼ばれる事がある。 sourceオプション  gemを検索するサイトを取得 gem "gem_name", source: "url" #全てのオプションで、ブロックを用いて一括で書ける source 'url' do gem 'gem_name1' gem 'gem_name2' end pathオプション  ファイルシステム内のパスを指定し、gemの取得先とする gem "gem_name", path: "url" gitオプション  作成されたgemのgitリポジトリから取得 gem "gem_name", git: "url"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

webpackerによるStimulusのインストールでハマったこと

はじめに 皆さんStimulusを使っていますか? ReactやVueを使う程学べていないけど、jQueryは使いたくないって人におすすめのフレームワークです! JaveScriptの簡単なDOM操作ができる人なら学習コストはほぼゼロで使えます! 更に、Webpackerを導入しているRailsならコマンド一発でインストールできるのも魅力的です。 ターミナル rails webpacker:install:stimulus 上記コマンドでインストールして公式サイトでサクッと勉強しながら皆さん良いStimulusライフを! 、、、としたかったのですが、インストールの際にエラーが発生して上手く動かなかったので修正点を備忘録として残しておきます。 前提 技術など バージョン等 ruby 2.7.4 Rails 6.1.4 執筆時点の日時は2021/11/27です。 調査結果 修正点とか言ってますが、ただのバージョンの問題でした。 詳しくは分かってないのですが、Rails7にStimulusは標準で組み込まれるっぽいです(現在の筆者のRailsのバージョンは6)。 それに先駆けてStimulusが色々バージョンアップしたっぽいので、Rails6ではそのままだと使えませんでした。(間違いがありましたら諸先輩方ご指摘お願いします?‍♂️) 修正内容 まずは、Stimulusのバージョンを直しましょう(すでにStimulusのバージョン3.0.0をインストールしてしまった前提です。) package.json { "name": "myapp", "private": true, "dependencies": { "@popperjs/core": "^2.10.1", "@rails/activestorage": "^6.0.0", "@rails/ujs": "^6.0.0", "@rails/webpacker": "5.4.3", // 中略 - "stimulus": "^3.0.0", + "stimulus": "^2.0.0", "turbolinks": "^5.2.0", "webpack": "^4.46.0", "webpack-cli": "^3.3.12" }, "version": "0.1.0", "devDependencies": { "webpack-dev-server": "^3" } } 上記のように3.0.0を2.0.0に修正します。 その上で、 ターミナル yarn install で、再インストールして下さい。 不安な人は、yarn.lock内を検索して、"@stimulus/core@^2.0.0":となっているか確認してみてください。 次に、app/javascript/packs/application.jsに追記をします。 application.js import Rails from "@rails/ujs"; import Turbolinks from "turbolinks"; import * as ActiveStorage from "@rails/activestorage"; // 中略 + import "controllers"; 上記のように1行だけ追加して下さい(もしかしたら自動で記述されているかもしれません) 最後に、app/javascript/controllers/ディレクトリにhello_controller.jsを作成、公式サイトのTOPにある部分とかを打ち込んで動くか確認してみて下さい。 公式サイトTOPと同じ動きをしてくれたら成功です! 終わりに 今回がQiita初投稿ですので、温かい目で見守ってくださるとありがたいです。 また、ミスやこうすると読みやすい等ご指摘がありましたらぜひコメントの方宜しくお願いします?‍♂️ 繰り返しになりますが、ReactやVueを使うほどではない簡単な動きだけならStiumulusの方が導入・開発スピードは早いと思いますので、ぜひ使ってみて下さい!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby silver合格までにやったこと

①チェリー本を改めて1周した ②RExを9割以上になるまでやる ③ネットにある問題はやっておく ④問題を解いている中でわからないORしらないものは片っ端からGoogle先生にお世話になる。&常にirbやエディタでコードを動かして挙動を確かめる。 なんとなく気になるところを自分なりにまとめていたものです? マジックコメント エンコーディングはcoding: エンコーディング名の前後に任意の文字を入れても良い&大文字・小文字どちらでも可 0xでスタートする数値は16進数リテラル p [].sizeは0になる。nilじゃない。 p [].to_i(to_sも)は0ではなくエラーが起きる。 定数PIはMathモジュールに定義されているもの sprintf関数は書式を揃えるときに使う。第1引数にはフォーマットを指定する。第2引数にフォーマットしたい値を指定する。 Rubyではメソッド内で定数を定義することができない。 Hash({})で空のHashオブジェクトを生成できる Stringクラスにto_h、to_aのメソッドはない 例外処理 StandardErrorを継承しないクラスのインスタンスをraiseメソッドの引数に指定すると、TypeErrorが発生する <=>では文字列と数値は比較できない - メソッドと変数の探索順位は変数が先 absはIntegerクラスSelfの絶対値を返す 正・負の方向に関係なく考えた時の値 -3は3 require requireするとファイルが評価される 読み込んだものがclassの場合、そのまま使える 読み込んだものがmoduleの場合、includeしないと使えない extend (モジュール) extend Module_name とすると、特異クラスにモジュールのメソッドが追加される do ... endと{ ... }を比べた場合、{ ... }の方が結合度が強い p [1,2,3,4].map do |e| e * e end do ... endの結合度が弱いため、p([1, 2, 3, 4].map)が評価されます。 Time系 %x  日付(%m/%d/%y) 01/05/15 %D 日付(%m/%d/%y) 01/05/15 %F 日付(%Y-%m-%d) 2021-11-01 %r 時分秒とAM or PM(12時間制) 12:00:00 AM %T 時分秒(24時間制) 03:46:11 %Y 西暦を表す数(9999) 2015 %y 西暦の下2桁(00-99) 15 %m 月を表す数字(01-12) 01 %d 日(01-31) 05 %-d 日(1-31) 2 %R 時分(24時間制) 03:46 %M 分(00-59) 00 %p 午前または午後(大文字) AM %P 午前または午後(小文字) am 判定式 == === eql? equal?違い a = 2 b = 2.0 p a == b # => true p a === b # => true p a.eql? b # => false nil.eql?(NilClass) #=> false p a.equal? b # => false 目についたメソッドまとめ gsub!とreplaceの違い gsub! gsub(pattern, replace) -> String 文字列中で pattern にマッチする部分全てを文字列 replace で置き換えた文字列を生成して返す。 replace:置き換える文字列のパターンを表す文字列か正規表現 str = "aaabbb" str = str.gsub!("a","c") puts str   #=> cccbbb replace シーバーの値を新しい値に置き換えてしまうのはgsub!メソッドと同じ gsub!メソッドのように部分的に一致する文字列を変更するということはできない。 文字列全部を新しい文字列全部に変更できる。 str = "aaabbb" str = str.replace("c") puts str # => c %記法 %、%Q ダブルクオートで囲う場合と同等 変数・定数の展開可能 %q シングルクオートで囲う場合と同等 変数・定数の展開不可 %W 配列を作る 式の展開がされる %w 配列を作る。配列の要素はスペース区切りで指定する。 式の展開はされない %I 要素がシンボルの配列を作る。 式の展開がされる %i 要素がシンボルの配列を作る。 式の展開がされない %x コマンド出力を行う。バッククオートで囲った場合と同等 %s シンボル。 式の展開がされない メタ文字 . 改行以外の任意の1文字にマッチする。ただしオプションmの指定によって複数行モードの場合は改行にもマッチする。 [] []内のいずれかの1文字 [^..] どの文字でもない a-z 英字にマッチする \w 英数字とアンダースコアにマッチする \W 英数字とアンダースコアではない文字にマッチする。(\w以外の1文字にマッチする) \s 空白文字にマッチする。(スペース、タブ、改行、復帰、垂直タブ) \S 空白文字ではない文字とマッチする。(\s以外の1文字) \d 0から9までの数字1文字にマッチする。 \D 0から9までの数字ではない文字にマッチする。(\d以外の1文字) \A 文字列の先頭にマッチする。^とは違い改行の直後の文字ではない文字にマッチする。 \z 文字列の末尾にマッチする。(改行含む) \Z 文字列の末尾にマッチする。(改行を含まない) Procクラス ブロックを持ち運び便利なオブジェクトにしたもの Proc.newで生成可能。作成されたProcオブジェクトはCallで呼び出し可能。 Procオブジェクトは変数は共有されない 仮引数を設定する事が可能 proc1 = Proc.new { |par1| p par1 } proc1.call("arg") #=> "arg" lambda Procオブジェクトを作る方法の一つ Proc.newで作成されたオブジェクトと違う点 &演算子(積集合「&」) 重複している要素は取り除かれ、共通する要素を取り出す。 a = [1, 2, 3] b = [1, 3, 5] a & b #=> [1, 3] &&演算子 &&は a と b がどちらも真のとき、最後に評価された b を出力する a && b #=> [1, 3, 5] &, &&, |, ||演算子それぞれの動きの違い |演算子(和集合「|」) 重複している要素は取り除かれ、重複している要素をまとめて出力する。 a = [1, 2, 3] b = [1, 3, 5] a | b #=> [1, 2, 3, 5] ||演算子 ||は a と b がどちらかが真のとき、最初に評価された a を出力する a = [1, 2, 3] b = [1, 3, 5] a || b #=> [1, 2, 3] a = nilの場合右辺の処理が行われる a || b #=> [1, 3, 5] よく使われる特殊文字 \n:改行  LF文字(Line Feed) \r:改行 CR文字(Carriage Return) \t:タブ  10進数以外の整数リテラル 2進数の場合は0b 8進数の場合は0 16進数の場合は0x unless文 条件式が偽になったときにだけ処理を実行する。unless文でelseは使えるがelsifは使えない。thenも使える。 お世話になった 偉大な記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Git】【Ruby】 Gemfile,Gemfile.lock変更後、git push後にエラー

1. 概要 Ruby on rails アプリ(開発環境の更新が本番環境に反映されるようGitHub Actions設定済み) にて、Gemfileに新機能を色々追加したり試したりした後 git push後にエラー発生・・時に自分が解決したやり方を記載 2.エラー内容/対処 Githubのactionsから最新ワークフローを確認した際に Deploy時エラーが発生していた 以下がエラー内容詳細 Run echo "$PRIVATE_KEY" > private_key && chmod 600 private_key Warning: Permanently added '***' (ECDSA) to the list of known hosts. From github.com:syokaturyou/sangoku * branch main -> FETCH_HEAD b1b89e5..4a8562f main -> origin/main error: Your local changes to the following files would be overwritten by merge: Gemfile.lock Please commit your changes or stash them before you merge. Aborting Error: Process completed with exit code 128. 本番環境のGemfile.lock とpushした内容と食い違いがあるために起こったと考えられるため 本番環境(自分の場合aws EC2インスタンスを使用)のGemfile.lockを一旦削除 ※Gemfileが確認できるディレクトリに移動し以下を実行 [ec2-user@ip-〇-〇-〇-〇 アプリ名] rm Gemfile.lock →Gemfile.lock削除後には本番環境でgit pull origin main 実行 これで直ったと思い再度開発環境の更新内容をgit pushするも 今度はDeploy時エラーとして以下がgithubのactions上で発生していた。 Run echo "$PRIVATE_KEY" > private_key && chmod 600 private_key Warning: Permanently added '***' (ECDSA) to the list of known hosts. error: You have not concluded your merge (MERGE_HEAD exists). hint: Please, commit your changes before merging. fatal: Exiting because of unfinished merge. Error: Process completed with exit code 128. マージが完了しておらず、MERGE_HEADが存在しているために発生しているエラーと考えられる。 本番環境でgit pull した時には以下が発生していた。 [ec2-user@ip-〇-〇-〇-〇 アプリ名]$ git pull origin main error: You have not concluded your merge (MERGE_HEAD exists). hint: Please, commit your changes before merging. fatal: Exiting because of unfinished merge. 「hint: Please, commit your changes before merging.」の記載に従って 本番環境下で空コミット [ec2-user@ip-〇-〇-〇-〇 アプリ名]git commit --allow-empty -m "commitmessage" 空コミット後にgit pullを実行するとエラーは発生せず [ec2-user@ip-〇-〇-〇-〇 アプリ名]$ git pull origin main この状態で開発環境で修正内容をgit push すると本番環境でも正常更新された
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む