Consoleでモデルの出力を整形するGem 'Hirb'

こんにちは!kossyです!




本日気になったニュースはこちら
headlines.yahoo.co.jp

解雇規制の緩和が行われるまでは、共存の状態が続くのではないでしょうか。
もっとも、その領域に口を出す政治家が現れるかはわかりませんが、、、









さて、今回はRailsのREPL環境であるpry上で、モデルの出力を整形して
表示してくれるGem'Hirb'の導入方法について、
ブログに残してみたいと思います。




環境
Rails 5.1.6
Ruby 2.5.1
MacOS Mojave





gemの導入

hirbとhirb-unicodeというgemを導入します。

Gemfile

group :development do
  gem 'hirb'
  gem 'hirb-unicode'
end

irbを使用する場合はこのままでも使えるのですが、
pryを導入している場合はこのままでは使えないので、
.pryrcというファイルをアプリケーションファイル直下に作成します。





.pryrcの作成

.pryrc

begin
  require 'hirb'
rescue LoadError
  # Missing goodies, bummer
end

if defined? Hirb
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  Hirb.enable
end

これでconsole上でモデルの出力を整形できます。
こんな感じで出力されます。

f:id:kossy-web-engineer:20181202122210p:plain

localhost:3000/rails/info でルーティング一覧が見られる

こんにちは!kossyです!




本日気になったニュースはこちら
www.tv-tokyo.co.jp

本日のことでもないしニュースでもないですが(笑)

ビニールハウスってデッドスペースが多いですし、
野菜を縦に育てるという発想が素晴らしいですね。

野菜を一年中安価で提供できるのはいいと思いますが、
このサービスを利用した事業者が増えすぎて、野菜市場が下落してしまい、
事業が立ち行かなくなってしまう危険性はあると思っています。










さて、今回は、記事にするほどでもないかもしれませんが(というかいつもそうかもしれない笑)、
rails routesに換わるルーティングの確認の仕方を見つけたので、
ブログに残してみたいと思います。




環境
Rails 5.1.6
Ruby 2.5.1
MacOS Mojave





localhost:3000/rails/infoにブラウザからアクセスするとルーティングの一覧が表示される

見出しで話が完結するのですが、開発環境でlocalhost:3000/rails/infoにアクセスすると、
f:id:kossy-web-engineer:20181130172804p:plain

こんな感じで出力されます。

path表示とurl表示を切り替える機能と、
マッチするURLをソートできる機能が搭載されています。

URLはlocalhost:3000/rails/info/routesなのですが、
localhost:3000/rails/infoにアクセスすると、自動的にroutesにリダイレクトされます。



今までターミナルでrails routesしていたのですが、
もういらないですね。

RSpecでdeviseを使う方法

こんにちは!kossyです!




本日気になったニュースはこちら
dev.classmethod.jp

サーバレスについて少し調べてみましたが、よくわかりませんでした、、、
オンプレやレンタルサーバとも違うみたいですね。

このサービスを用いることで、オンプレやレンタルサーバと比較して
ランニングコストを抑えることができると仮定するならば、
今後はクラウドサーバー環境構築のノウハウを蓄積するよりも、
こちらの技術のノウハウを貯めた方がいいかもしれません。











さて、今回はRailsのテストフレームワークであるRSpecで認証系のGemとして有名なdeviseを使う方法を
ブログに残してみたいと思います。



環境
Rails 5.1.6
Ruby 2.5.1
RSpec 3.8.0
MacOS Mojave





マクロファイルの作成

controller_macros.rbという名前でファイルを作成し、loginメソッドを定義します。
macrosってなんだ?と思いましたが、
マクロ(ヘルパーメソッド)を定義してフィーチャースペックのユーザー切替えを楽に行う - Qiita

こちらによると、マクロ = ヘルパーメソッド
という認識で間違いなさそうです。

以下参考コードです。

spec/support/controller_macros.rb

module ControllerMacros
  def login(user)
    @request.env["devise.mapping"] = Devise.mappings[:user]
    sign_in user
  end
end


マクロファイルの読み込み

次にmacrosファイルを読み込む記述をします。
include以降の記述でdeviseとmacrosを読み込む処理を記述しています。

spec/rails_helper.rb

RSpec.configure do |config|
  Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.include ControllerMacros, type: :controller
end

これでRSpec内でdeviseを使うことができます。





参考にさせていただいたサイト
rspecのテスト環境でdeviseにログインする方法【rails】 - Qiita
マクロ(ヘルパーメソッド)を定義してフィーチャースペックのユーザー切替えを楽に行う - Qiita

Railsにおけるturbolinksの無効化の手順

こんにちは!kossyです!




本日気になったニュースはこちら
aws.amazon.com

AWSで提供されているDynamoDBにトランザクション機能が追加されるそうです。
が、当方インフラ面には疎いので、何がすごいのかわかりません、、、
他の方の意見を引用すると、


今まで、DynamoDBとRDBMSの違いを説明するときは、トランザクション対応しているかどうかと発言していましたが、
だんだん優劣の説明が難しくなってきましたw。特に最近の立て続けのアップデートはかなり強力でした。
ネイティブでの暗号化、ポイントインタイムリカバリ対応、トリガー、グローバルテーブル、
KMS対応、ローカルテスト、アクセラレータ、そして、今回のトランザクション対応によって、
多くのデータベースの移行先や、新規サービスのデータベース基盤として、DynamoDBを検討できるのではないでしょうか。
とくに、サーバーレスとかIoTのバックエンドとしてDynamoDBは無くてはならない存在です。
今後の更なる進化にも期待したいですね。

出典: DynamoDBのトランザクションについてFAQ形式で答えてみる #reinvent | DevelopersIO

とのことでした。
トランザクションに対応したことで、DynamoDB一択、ということになっていくのでしょうか。










さて、今回はRailsで標準で組み込まれている、
turbolinksを無効化する手順について、ブログに残してみたいと思います。




そもそもturbolinksってなにしてくれてるの?

Turbolinksはリンクを生成する要素であるa要素のクリックをフックにして、
移動した先のページをAjaxで取得します。

その後、取得ページのデータが遷移前のページと同じものがあれば再利用し、
title・body要素を置き換えて表示します。
データを再利用するので、アプリケーションの速度向上などのパフォーマンスの向上を
させることができます。

Railsと一緒に使われるイメージがあるTurbolinksですが、
iOSやAndoroid環境でも使用することができます。
github.com




本題

回り道をしてしまいましたが、これからTurbolinksの無効化手順を説明します。


まずはGemfileからTurbolinksを削除します。

gem 'turbolinks', '~> 5'  # この行を削除

bundle updateします。

$ bundle update

次に、application.jsのTurbolinksをrequireしている部分を削除します。

//= require turbolinks  # この行を削除

そして、レイアウトファイルでTurbolinksを読み込んでいる部分を削除します。

# この2行を削除

= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'

これでTurbolinksを削除できます。

SSH通信の概要

こんにちは!kossyです!




本日気になったニュースはこちら
jp.techcrunch.com

太っ腹ですね。
Progateをはじめとした各種プログラミング学習サービスの充実度は
本当に素晴らしいもので、初学者向けの学習環境の整備はめちゃめちゃ進んでいる印象です。
ただ、今まではWeb系コンテンツの充実度ばかりが進行していた気がしますので、
今回のAmazonの発表でWeb系以外のコンテンツもどんどん充実してほしいなと思います。










さて、今回はSSH通信の概要についてブログに残してみたいと思います。




SSHとは?

暗号や認証技術を用いて、セキュアにリモートコンピュータと通信を行うための通信プロトコルのことです。
プロトコルとは、大雑把に言ってしまうと、通信を行う際の決め事、です。

どんなメリットがあるのか

きちんとセキュアにSSH通信が行われていれば、以下のようなメリットが得られます。

①通信が盗聴される危険性を回避できる
②バックアップを取りたい時に、サーバ上で圧縮して、ファイルを一括ダウンロードできるので、アップロード・ダウンロード時に
 時間短縮ができる
③リモート(遠隔)サーバ上でファイルの操作や編集が安全にできる


より詳しく

SSH通信が中で何を行なっているか、とても詳しく解説してくれています。
qiita.com

実際の設定までカバーされています。
qiita.com



通信周りの知識がまだまだ足りていないと感じています。。。

Rubyの X || = y みたいなコードの読み方

こんにちは!kossyです!




本日気になったニュースはこちら
thebridge.jp

いいサービスだな、と思ったら既に類似のビジネスが走っているのですね、、、
どんだけこの界隈に疎いんだよ自分、、、

しかしクラウドファンディングに成功してニュースとして取り上げてくれるのはいいですね。
まだサービスがローンチされてない中でこのようにメディアに取り上げてくれるのは、
ある程度の広告効果が期待できそうです。

サービスの提供開始前の広告戦略として参考になるかも。









さて、今回はRubyにおける自己代入のイディオムである、|| = の読み方について、
ブログに残して見たいと思います。





環境
Ruby 2.5.1




Ruby熟練者がよく書くらしい

最初見たときはなんじゃこりゃ、と思いましたが。
Rubyの熟練者の方がよく使うらしいです。
Railsチュートリアルにもこのイディオムは登場してますね。


|| = の解読

端的にまとめると、
「左辺の値がnilであれば、右辺の値を左辺に代入する。もし左辺に値が存在していれば、
右辺の値は評価されない」
と言うイディオムになります。

例えば、

@current_user ||= User.find_by(id: user.id)

というコードがあるとすれば、
「@current_userの値がnilであれば、Userモデルの中のidがuser.idであるレコードを検索して、
@current_userに値を代入する」
という流れになります。

使いこなせれば結構便利ですね。

ミュータブルとイミュータブル

こんにちは!kossyです!




本日気になったニュースはこちら
news.yahoo.co.jp

そこまでやるか、って感じですね、、、
インターネットや検索エンジンが人々の生活を豊かにしたのは間違いないですし、
規制の深化でテクノロジーの進歩が阻害されるようなことがあってはいけないと思ってます。











プログラミングを学んでいると、毎日必ず知らない単語に出会うのですが、
今日もご多聞に漏れずミュータブルとイミュータブルという単語に出会ってしまいました。

今回はミュータブルとイミュータブルとはなんぞや、ということで
ブログに残しておこうかと思います。



ミュータブルとは?

英語で書くとmutableって書くみたいですね。
bleで語尾が終わっていると(availableとかvariableとか)、「〜できる」とか「〜しやすい」って意味になります。
mutableも他のbleで終わる単語と同様に、「可変の」とか、「変更可能な」等の意味を持っています。

プログラミングの世界では、「破壊的な変更ができる」という意味で使われているみたいです。
Rubyで言うと!マークが付いているメソッドが適用できるってことですね。

例えば、Stringクラスはデフォルトでミュータブルなので、!が付いたメソッドを乱用していると、
意図せずバグを起こすということが起き得ます。

イミュータブルとは?

英語って(と言うか言語って)便利で、一つ単語を覚えてしまうと、
覚えようと思えば対義語や類義語、活用形なんかもすんなり覚えられちゃいます。

イミュータブル(immutable)もmutableと対を成しており、
「不変な」とか「変更不可の」等の訳し方をするみたいです。



余談ですが、im-とかin-で始まる単語は基本的に否定の接頭辞として使われてまして、例えば、
「immposible(不可能)」とか、incredible(信じられない)とかです。

immposibleの対義語はpossibleで、incredibleはcredibleですね。ちなみにcredibleの名詞形はcredit(信用)です。
こんな感じで一つ単語を覚えてしまうと枝のように広がることができるのが面白いですね。



話が逸れてしまいました。
プログラミングの世界では、immutableのことを、「破壊的変更が適用できない」という意味で用いられるみたいです。

Rubyではimmutableなクラスや値がいくつかあって、
・IntegerやFloat
・Symbol
・True/FlaseClass
Nil
等が有ります。



まぁ、「ミュータブルだから〜」とか言われたら、
「あぁ、ここの値変更できるのね」

「イミュータブルだから〜」だったら、
「変更できないのね、freezeすんのかな」

とか思っとけば良さそうです。

リンクを自動で生成してくれるgem 'rails_autolink'

こんにちは!kossyです!




本日気になったニュースはこちら
headlines.yahoo.co.jp

Twitter等のSNSを見ていても、「仮想通貨で大儲け!」のような人は
めっきり見かけなくなった気がします。
テレビ番組でも去年は特番なんかが組まれていましたが、
最近はほとんど見ません。

ちょうど昭和終わりー平成初期のバブルから30年くらい経ちましたし、
世代が変わるとバブルが起きる、ということの証明にはなったのではないでしょうか。









さて、今回はRailsでの開発において、自動でURLをリンク化してくれるgem 'rails_autolink'の使い方を
ブログに残してみたいと思います。




環境
Rails 5.2.1
Ruby 2.5.1
MacOS Mojave




実装方法

まずはgemの導入です。

Gemfile

gem 'rails_autolink'


$ bundle install

これでauto_linkメソッドが使えるようになるので、
任意のビュー内に記述します。

= auti_link(simple_format(h(@content.description), {}, sanitize: false, wrapper_tag: "div"))

これで自動でリンクが生成されるはずです。

開発環境でのActive_Storageの使い方

こんにちは!kossyです!




本日気になったニュースはこちら
thebridge.jp

インターネットの登場で情報の非対称性はかなり緩和されたと思うのですが、
それでもなお一定数は存在していると思います。

この企業の事業は情報の非対称性の緩和にかなり貢献するのではないでしょうか。










さて、今回はRails5.2系から新しく導入されている、Active_Storageの開発環境での使い方について、
ブログに残してみたいと思います。



環境
Rails 5.2.1
Ruby 2.5.1
MacOS Mojave




尚、Active_Storageについて絞って記述するので、
routing、controllerの設定、細かなビューの記述については割愛しています。



Active_Storage利用準備

ターミナルで下記のコマンドを実行します。

$ rails active_storage:install

=> Copied migration 20181122043208_create_active_storage_tables.active_storage.rb from active_storage


$ rails db:migrate


画像を添付できるようにモデルを編集

任意のモデルファイルにhas_one_attahedメソッドを用いて、
1つのコンテンツに1つの画像を紐づけることを、
その画像をコンテンツモデルからimageと呼ぶことをRailsに伝えています。

app/models/任意のモデルファイル(ここではContentとしておきます)

Class Content < ApplicationRecord

has_one_attached :image(任意)

end


ビューファイル編集

任意のビューファイル(ここではapp/views/contents/new.html.slimとします)
* bootstrapを使っています


= form_with model: content, local: true do |f|
  - if task.errors.present?
    ul#error_explanation
      - task.errors.full_messages.each do |message|
        li= message
   .form-group
    = f.label :image
    = f.file_field :image, class: 'form-control'
= f.submit '登録する', class: 'btn btn-primary'

show.html.slimにimage_tagを追加
動作確認のためにshow.html.slimを変更します。
任意の位置にimage_tagを追加します。

= Content.human_attribute_name(:image)
= image_tag @content.image if @content.image.attached?

これでファイルの保存ができます。

Mailerの動作確認ができるgem 'mailcatcher'

こんにちは!kossyです!




本日気になったニュースはこちら
www.tv-tokyo.co.jp

最近は小規模のM&Aがサラリーマンの間で話題になっているみたいですね。
TRANBIというM&Aマッチングプラットフォームの会社で、
会社の売買や事業承継なんかができるそうです。

普通のサラリーマンの方が会社を持つ手段として、起業だけではなく、
M&Aという手段もこれからどんどん注目されていきそうです。










さて、今回はRailsにおいて、ActionMailerでのメール送信機能の動作確認が
開発環境でできるmailcatcherというgemの使い方をブログに残したいと思います。




環境
Rails 5.1.6
Ruby 2.5.1
MacOS Mojave





mailcatcherのインストール

bundlerでインストールすると不具合が発生するらしいので(開発者が言ってます)、
ターミナルで、

$ gem install mailcatcher

と記述し実行します。

その後、config/environments/development.rbに、
「mailcatcherのSMTPサーバを利用する」という設定をアプリケーション側に追加します。

  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = { address: '127.0.0.1', port: 1025 }

次に、mailcatcherを起動します。

$ mailcatcher



Starting MailCatcher
==> smtp://127.0.0.1:1025
---省略---
==> http://127.0.0.1:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.

サーバーサイド側のMailerのコードは
Action Mailerの使い方 | 酒と涙とRubyとRailsと
Action Mailer の基礎 - Rails ガイド

こちらを参考にしてみてください。