2019-01-01から1年間の記事一覧

Best Practice Ruby on Rails Refactoringは、Rails開発を初めて半年のエンジニアにピッタリの本だった

Rails AntiPatterns: Best Practice Ruby on Rails Refactoring (Addison-Wesley Professional Ruby Series) (English Edition)作者:Chad Pytel,Tammer Saleh出版社/メーカー: Addison-Wesley Professional発売日: 2010/11/09メディア: Kindle版 Best Practi…

Design Patterns in RubyでStrategyパターンを学んだ

Design Patterns in Ruby でStrategyパターンを学んだ。自分用のメモとして残しておく。 Design Patterns in Ruby (Adobe Reader) (Addison-Wesley Professional Ruby Series) (English Edition)作者:Russ Olsen出版社/メーカー: Addison-Wesley Professiona…

Rubyであるメソッドの定義場所を知る方法

OSSなど実装を見る機会が乏しいコードに触れる時、あるメソッドがどこに定義されているか継承を辿るとデバッグに時間がかかる時がある。 そんな時は、methodとsource_locationメソッドを利用すると便利である。 GraphQL::Types::String.method( :graphql_def…

GraphQLで独自Scalar型を定義する時に気をつけること

GraphQL-Rubyでは、Int、Float、String、Boolean,IDといったビルドイン以外にISO8601DateTimeやISO8601Date型が提供されています。 また、独自Scalar型を定義することができ、その方法はドキュメントに記載されています。 class Types::Url < Types::BaseSca…

alert(1)では、危険性がわからなかった人にも優しいXSS解説

XSSとは、攻撃者によって意図しないHTMLやJavaScriptを挿入される脆弱性です。 XSSを説明する際に、ローカルサーバーを立ち上げた後にブラウザ上でhttp://localhost:8080/?keyword=<script>alert(1)</script>にアクセスすると警告ダイヤルが表示される例を目にすることが多い…

GraphQL-RubyでUnion型を実装する方法

GraphQLにおけるUnion型は、Object型のリストを表現します。 実装方法は、ドキュメントを参考にすると以下の通りです。 簡易的にUnionを試すためUserクラスにcommentsメソッドを実装していますが、本来はSTIやCTIなどの実装を表現する場合に利用します。それ…

Rubyの予約語を取得する方法

Rubyの予約語を取得するワンライナーを知った。いくつか疑問があるので忘れないように残しておく。 RubyToken::TokenDefinitions.select { |definition| definition[1] == RubyToken::TkId }.map { |definition| definition[2] }.compact しかし、v2_7_0_pre…

Rubyでは、クラスの比較ができる

Rubyでは、クラスを比較できることを知ったのでメモとして残しておく。 String < Object 比較演算子は、Moduleクラスに存在している。 ここで、以下を比較すると結果としてnilが返る。 Kernel < BasicObject これは、BasicObjectとKernelが継承関係にないか…

GraphQL-RubyのEnum classes are never instantiated and their methods are never called.とは何か

GraphQL-RubyのEnumを翻訳するにあたり、Enum classes are never instantiated and their methods are never called.に疑問を持ったのでソースコードを読むことにしました。 version graphq-ruby: 1.9.5 ruby: 2.6.5 実装は、GraphQL::Schema::Enumにありま…

Rubyのmodule_functionは、引数なしで指定できる

Classにmoduleをmix-inしてもmoduleで定義したクラスメソッドを利用できない。 これを解決するために、以下ようにincludeされた時点でクラスに対してmoduleをextendする方法がある。 module M def self.included(klass) klass.extend ClassMethods end modul…

GraphQL-RubyのInstrumentationを翻訳して学んだこと

GraphQL-Rubyには、Queryの実行前後で処理を差し込むことが可能なInstrumentが実装されています。 この機能を利用するためには、必ず#before_query(query)と#after_query(query)二つのメソッドを定義する必要があります。 以下のように自身のスキーマクラス…

High Performance Imagesの「Browser Image Loading」を読んだ

Browser Image Loadingを読みました。タイトルの通り、ブラウザで画像ロードをどのように行うかを知ることができます。 High Performance Images: Shrink, Load, and Deliver Images for Speed (English Edition)作者: Colin Bendell,Tim Kadlec,Yoav Weiss,…

「初めてのGraphQL」の原書を読んだ

2018年に出版された「初めてのGraphQL」の原書である「Learning GraphQL」を読みました。 なぜ、読んだのか 新卒研修で一度読了したのですが、社内のエンジニアから日本語訳が出版される前に読書会を開かないかと誘われました。プロダクトコードで、もっとク…

GemfileにRubyのVersionをベタ書きしない方法

GemfileにRubyのVersionをベタ書きしているプロジェクトがある。 rbenvでVersion管理を行っている場合、rbenv local 2.6.5と実行すると.ruby-versionというファイルが作られる。 $ cat .ruby-version 2.6.5 そして、Gemfileで以下の記述するとGemfileにRuby…

MySQLで100年後の日時を設定する

RailsでActiveRecordを継承しているオブジェクトのデータ型カラムに対して100年後の日時を設定したい場合、Time.current.since(100.days)を利用することで実現できる。 しかし、Rubyを理解している人以外がデータを更新したい場合に上記は適切ではない。 SQL…

株式会社グロービスに新卒入社して半年が経った

TL;DR 株式会社グロービスに入社した。元気に生存中。押忍 はじめに 2019年4月1日から新卒エンジニアとして株式会社グロービスに入社しました。 普段は、グロービス学び放題というビジネスを動画で学べる学習サービスを開発しています。 hodai.globis.co.jp …

Railsアプリケーション初期段階のGemfileに記載されているplatformsについて調べた

rails new .でRailsアプリケーションを作成すると、Gemfileが生成されます。 source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.6.5' gem 'rails', '~> 6.0.0' ~~~~~ gem 'bootsnap', '>= 1.4.2', re…

@kakakakakkuさんのブログメンタリングで学んだこと

@kakakakakkuさんのブログメンタリングを卒業しました。 3ヶ月間があっという間に過ぎるぐらい濃い時間を過ごすことができました。 「最初は、誤字が多かったな〜」、「なんで@kakakakakkuさんはブログメンタリングをしてるんだろう?」、「もっと人生の先輩…

GraphQL-Ruby1.9+から子fieldが選択されたかによって処理を変更できるようになった

プロダクトでGraphQL-Rubyのgemを最新バージョンにアップデートしました! 1.9ではfieldにextras:[:lookahead]を追加できます。 この機能は、子field要素がリクエスト対象であるかで条件分岐を可能にします。 ドキュメントを見るだけでは挙動がわかりにくい…

Gemのアップデート方法

エンジニアとして働き始めると、学生時代には意識しない問題に取り組むことが多くなります。 ライブラリのアップデートもその中の一つでしょう。RubyのライブラリであるGemをアップデートする方法を学んだので忘れないうちにアウトプットしようと思います。 …

OSS Gateに参加したらOSSにコントリビュートできた

OSSにいつかコントリビュートしたいという想いから、OSS Gate東京ワークショップ2019-09-14に参加しました。 OSS Gateは、OSS開発未経験者の方とOSSの門をくぐった先輩メンターがペアになってOSS開発を体験するイベントです。メンターのサポーターがいるなど…

Railsでクラスインスタンス変数とクラス変数を利用する前に、設計を見直そう

下記のようなクラスインスタンス変数を定義した後に、値を確認する方法としてAPI::APIBase.class_eval { puts @remote_host }があります。class_evalは、Moduleクラスのインスタンスメソッドでブロック内でレシーバ定義式の中であるように振舞います。 ENV['…

コピペでSSH設定をすると危険だということを「OpenSSH実践入門」から学んだ

OpenSSHを基礎から学ぶことができる「OpenSSH実践入門」を読みました。ローカルで編集したコードをGitHubにpushするためにSSHのKeyを登録する必要があるなど、身近なところで頻繁に利用されている技術ですが、毎回コピーアンドペースト(以下、コピペ)で何も…

docker-composeでUbuntuのイメージのみを管理しようとしてハマったので、ruby-jpで質問した

環境 $ docker --version Docker version 19.03.1 本題 Ubuntu18.04をベースイメージとしたDockerfileを作成し、docker-composeでコンテナの管理をしようとすると、イメージからコンテナを作成されていることが標準出力から確認できるのですが、attachをする…

ラックサーバーでRAID0構成を組んだ

創意ラボさんが主催する、「サーバーにメモリ刺してもらっていいですかね」に参加しました。 connpass.com 参加者は6人いたので、ペアで作業をすることになりました。 内容は、以下のようにとても濃いものでした。 ラックサーバーにメモリを刺す RAID0構成を…

manを実行すると「No manual entry for ...」と表示されるコマンドの利用方法をどうしても知りたい時の対処法

動作環境 macOS Mojave # echo $0 /bin/bash 利用可能なコマンド一覧を取得するには、compgen -A commandまたはcompgen -acを実行すればよいことを知りました。 そこで、man compgenで詳しい利用法を確認しようとするとNo manual entry for compgenというメ…

git rev-parseの説明にあるPick out and massage parametersのmassageとは何か

Git

Gitのバージョン $ git --version git version 2.21.0 git rev-parse --show-toplevelを実行すると、Gitで管理しているrootのpathを知ることができます。 rails new check_rev-parse-dirでRailsプロジェクト作成してgit rev-parse --show-toplevelの動作確認…

manの結果をgrepできるようにするLinuxコマンドについて

特定のLinuxコマンドのコマンドやオプション名を忘れたが、一部のみ覚えている時にmanコマンドの結果からgrepしたいことがあります。 manコマンドで特定のLinuxコマンドのドキュメント読もうとすると、Manual pageが起動しますが標準出力されないためgrepコ…

サービスの管理を行うsystemctlコマンドについて調べてた

ISUCON9の練習をするため、Vagrant ISUCONを利用しました。チームはGoで参加するので、初期実装はPythonでした。言語を切り替える方法がわからず、悪戦苦闘していたのですがsystemctlコマンドを用いることで実現できることがわかりました。 解決する過程で、…

git remote rmがgit help remoteした時に表示されてなくて困った

Git

とあるプロジェクトをForkした後に、ローカルでCloneをして遊んでいると予期せず間違ってPRを元プロジェクトに投げてしまいました。そこで、Forkをしたリポジトリを削除し自分で新しくリポジトリを作成しました。変更に伴い、リモートリポジトリのリンク先を…