どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

独自gem作成その3 / 体裁整え, README

前回の 独自gem作成では、実際のコードを書いてテスト完了し、rubocopによりraisのスタイルガイドに沿っているかチェックをしたところまでやりました🙂
本日は続きをやっていきます!

目次

1.rubocopの検証

前回の rubocop の検証では、26個のCの警告が出ているところまでやりました!
これらをひとつひとつ確認して修正していきます。

26個のCの内容と対処方法は以下のとおりです💪
重複している内容もあるので、全部で8種類でした🙂

Style/FrozenStringLiteralComment: Missing magic comment # frozen_string_literal: true.

# frozen_string_literal: trueと記載し、直後に空白の1行を入れる(出典

Style/StringLiterals: Prefer double-quoted stringsunless you need single quotes to avoid extra backslashes for escaping.

' text 'の表記を" text "に修正(出典

Style/UnneededPercentQ: Use %q only for strings that contain both single quotes and double quotes.

%q{ text }の表記を" text "に修正(出典

Style/HashSyntax: Use the new Ruby 1.9 hash syntax.

→ ハッシュの記法を Ruby1.9 以降のものに修正(出典

Layout/SpaceInsideParens: Space inside parentheses detected.

( calc )の中にある余計なスペースを削除(出典

Layout/TrailingBlankLines: Final newline missing.

→ 最終行に空白行を追加(出典

Layout/SpaceAroundOperators: Operator = should be surrounded by a single space.

=の前後に連続しているスペースを1つにする(出典

Layout/SpaceInsideBlockBraces: Space between { and | missing.

{| text | }{ の後にスペースを1つ入れる(出典

これらをひとつひとつ修正しました😊
f:id:mistyrinth:20181221163559p:plain

2.READMEを記述

公開する前に、README.mdに gem に関する情報を書いておきます。
コードではなく、人にわかるように文章を書きます💡ここに書いておくと、他の方が README を読んで、どんな gem なのか知ることができます✨
デフォルトでは以下のような状態です。
f:id:mistyrinth:20181221164109p:plain
これを自分なりに書いていきます。

ここまでできたら無事公開!のはずですが…
Githubの使い方わからないので、一旦Githubの勉強を挟みます🙏
道のりは長い😂

独自gem作成その2 / Gemの作成, RSpecテスト, rubocop

本日は具体的に gem を作っていきます!

目次

1.gemのアイデア

作る gem のアイデアですが、いろいろと考えた結果、数値を英語に変換してみようと思います!
例えば1oneに変換するやつです。
gem の名前はconv_num_wordsにします!

2.実際に作ってみる

2-1. gemテンプレートの作成

まずは以下のコマンドで gem のテンプレートを作ります。

$ bundler gem conv_num_words

作る場所はどこでも良いのですが、私はホームディレクトリにしました!
f:id:mistyrinth:20181213112058p:plain
この時点で自動的に gem に必要な沢山のファイルが作成されます。
gem は沢山のファイルによって構成されているため、IDE統合開発環境)でgem のルートディレクトリを開いたほうが作業しやすいです✨
わたしの場合は Visual Studio Code を使っています🙂
IDEを使うと、いちいちメモ帳のようなエディタを開いて編集しなくても、ディレクトリの中のファイルをツリーで確認しながら、ファイル間を行ったり来たりできるようになります!
細かくて見にくいですが、以下が IDEVisual Studio Code)の編集画面です。
f:id:mistyrinth:20181213112208p:plain
ざっくり分類分けすると、左側に gem を構成するディレクトリ、メイン部分がコードエディタ、下部にターミナルがあります👀
この画面は、次に編集するgemspecを開いているところです😊

2-2. gemspecの修正

先程の操作で自動的に作成されたファイルのうち、gemspecというファイルを編集します💪
TODO:で始まるところがダミーなので、そこに自分の情報に置き換えます。
とは言っても description などは作っているうちに変わりそうなので、とりあえず今はTODO:を取り外したり、ソースコードURLをコメントアウトにして、後で編集し直すことにします🤗

2-3. 実際のコードを記述

テンプレート作りが終わったので、今度は実際にコードを書いていきます。
数値を英文字に変換するという同じ発想の方がいらっしゃったので、かなり参考にさせていただきました!

d.hatena.ne.jp

コードを書くのはlib/conv_num_words.rbの中です。
f:id:mistyrinth:20181217192721p:plain
Numericクラスを拡張していく形で変換前後を定義していきます。
21以上の数は大変なので、桁(hundred, thousand)ごとに計算式を書きます✍️
f:id:mistyrinth:20181217192901p:plain

2-4. ビルドして実行

コードが書けたら、ビルドしてみます!
ビルドのためにまずexeファイルを作成する必要があります。
gemのルートディレクトリで以下のコマンドを実行します。

$ mkdir exe
$ touch exe/conv_num_words
$ chmod +x exe/conv_num_words

この一連の流れは、1行目でexeディレクトリを作り、2行目でその中にconv_num_wordsというファイルを作り、3行目でconv_num_wordsの実行権限を付与しています💡 次に、以下のコマンドを実行してビルドします。

$ bundle exec rake build

f:id:mistyrinth:20181214143746p:plain
このあたり参考にしたページのリンクを載せておきます👏
qiita.com

続いて、gemをインストールします!

$ gem install pkg/conv_num_words-0.1.0.gem

f:id:mistyrinth:20181214144114p:plain

ここで確認のため、 irb を起動してrequire'gem名'を実行してtrue`になると良いです👌
エラーが出たら修正して、再ビルドして再インストールです😊😊
私は修正したきり再ビルドせずに irb を繰り返して何度も同じエラーを見ていながら、修正が反映されないことに気づくのが遅かったです笑

2-6. テスト

次に、spec/conv_num_words_spec.rbを編集します。
RSpecを使ってテストを行います。
f:id:mistyrinth:20181217200217p:plain
上のキャプチャは、conv_num_wordsのNumericクラスに対して、to_wを使ったときに予測できる変換前後を述べています。
テスト名(テストが成功したときに表示される名前)をconvert number into wordsにしています。
一応全ての通りの組み合わせがテストできるように書いてみたつもりですが、見落としがあったらご指摘ください😶
テストを書いたら、ターミナルで以下のコマンドを実行します👆

$ bundler exec rspec spec

※コマンドがbundlerだったりbundleだったりぶれてしまい申し訳ありません。どちらでも良いようです笑
f:id:mistyrinth:20181217201248p:plain
テスト完了です!
ここで予測した答えと実際の答えが一致しないと、以下のように丁寧に教えてくれます。
f:id:mistyrinth:20181217201453p:plain

2-7. rubocopで検証

ここまできたらもうパッケージ化して公開ですが、その前にひとつ確認しておくことがあります🤨
それは Ruby のコードはスタイルガイドに則っているか?ということです。
コードが正しくても、インデントがめちゃくちゃだと見にくいので、Rubyのスタイルガイドに合わせて書き直す必要があります。

github.com
このスタイルガイドに則って書けているか確認する rubocop というものを試してみます。
rubocop が未インストールの場合は以下のコマンドでインストールします。

$ gem install rubocop

使い方は簡単で、チェックしたいコードが書かれているファイルがあるディレクトリに移動し、rubocopを実行するだけです。
私の場合はホームディレクトリに作っているconv_num_wordsというディレクトリに移動してrubocopを実行します☀️
ただし、はじめはrails本家の設定にするために一手間加えます🙂
まずは対象のディレクトリに移動し、.rubocop.ymlというファイルを作成します。
f:id:mistyrinth:20181217202705p:plain
とりあえずtouchで作成しました!ls -aで作成できたことが確認できますね〜🌝
もちろん、IDEのほうでも確認できます。というかIDEで編集します。
rails本家のrubocop.ymlファイルが公開されているので、これを作成したファイルの中身に反映させます✨

github.com

こんな感じになります。
f:id:mistyrinth:20181217203154p:plain
いよいよターミナルで以下のコマンドを実行してみます!

$ rubocop

すると、長々とメッセージが現れます。
f:id:mistyrinth:20181217203722p:plain
黄色のCの文字が目立ちますね👀
このアルファベットは、見つかった違反の種類を指しています。
違反の重要度が重い順にFatal, Error, Warning, Conventionがあります。
メッセージに現れるCは一番軽い違反を教えてくれています。 最後の1行には、8 files inspected, 26 offenses detectedと書かれており、26個の違反が見つかったことが分かります🙄
f:id:mistyrinth:20181217203905p:plain
これを修正してから、パッケージ化をして公開、という手順を踏んでいきます。

さて、これをひとつひとつ確認して修正していくのは次回で!笑

独自gem作成その1 / bundler

本日からは、独自の gem を作ることを目標にいろいろ学習を進めていきます!
gem についてはこちらの記事で少し触れていますのでご参照ください✨

目次

1.gem 作成前の下準備

独自の gem はまだ思いついていないので、まずはRubyGemsの公式ページを読んでみます。

Guides - RubyGems Guides

目次の順番に読んでいき、MAKE YOUR OWN GEMを読み始めてみると、bundler で gem を作るというリンクがあります💡
ちょっと寄り道してリンク先の bundler のページを見てみると、bundler 1.13で gem を作る解説ページに飛びます👀
私のパソコンにインストールされている bundler のバージョンは 1.17.1 なので、1.17の解説ページを読むことにしました😊

Bundler: How to create a Ruby gem with Bundler

私のパソコンには bundler がいつの間にかインストールされています。というか、過去にインストールした記憶はあるのですが、なぜだったか思い出せません笑
なのでインストール手順は飛ばして、以下のコマンドでバージョンの確認をします。

$ bundler -v

f:id:mistyrinth:20181204102428p:plain
バージョンは 1.17.1 です💡
ちなみに bundler 未インストールの場合、以下のコマンドでインストールできます。

$ gem install bundler

2.bundler で gem を作る練習

2-1. Getting Started

先程の bundler のサイトに gem を作る例が載っているので、まずはそれに従ってやってみます。
bundler で新しく gem を作るには、まず以下のコマンドを実行します。

$ bundler gem 作りたいgem名

ここではfoodieという名前の gem を作ってみます!

We call our gem foodie because this gem is going to do a couple of things around food, such as portraying them as either “Delicious!” or “Gross!”. Stay tuned.

どうやら food に対してDilicious!Gross! のどちらか反応をするための gem っぽいですね🙂

bundler gem foodieを実行すると、3つの質問をされます。
f:id:mistyrinth:20181204110643p:plain

どれも今は正直分からないので、テストファイルはよく見かけるほうのrspecにしておいて、それ以外はyesとしておきます。

無事にfoodieという gem が作れたみたいです!
f:id:mistyrinth:20181204113109p:plain
ホームディレクトリにfoodieというファイルができたみたいです!これが gem ですね😊
f:id:mistyrinth:20181204113436p:plain
foodieの中にも様々なファイルが作成されています。
ターミナル操作は大変になってくるので、ここからは必要に応じてVSCodeで作業します😗

2-2. Testing our gem

VSCodefoodieを開いてみると、ファイルが作成されているのがより分かりやすくなります。
次のキャプチャはfoodieの中のfoodie.gemspecを開いている様子です。authors や homepage などダミーの文字列が入っていますが、正しく入力しないと進めないので、適当に入力して、飛ばしたいところはコメントアウトしていきます😐笑
f:id:mistyrinth:20181204142135p:plain

次にbundle installを実行します。ここでエラーがあると、先程のダミーがまだどこかに残っている可能性があります💀
エラー文が丁寧に教えてくれるので、読んだとおりに対処すれば解決は難しくないと思います。
f:id:mistyrinth:20181204162436p:plain

bundlerのページを読み進めていくと、foodie_spec.rbに書く内容が載っているので、コピペしてみます。
f:id:mistyrinth:20181204161528p:plain
foodie_spec.rbには元々何か書かれているのでそれはそのままにして、# added by sayaka以下がコピペ文章になります。
ちなみにコピペそのままだと 17行目でdescribeが Object に定義されていないというエラーが起きてしまうので、ここは元々書いてあるコードの真似をして冒頭にRSpec.を付け足しています⛄️
コードを見ると、どうやらブロッコリーが不味いみたいですね😂笑
bundler exec rspec specを実行します。
f:id:mistyrinth:20181204162727p:plain
テスト成功です🎉🎉

2-3. Using other gems

続いて、自分の gem から Active Support のpluralizeメソッドを使うとのことですが、なんのこっちゃという感じですね〜🙃
解説を読んだところ、activesupportという gem を指しているのだと思いますが、pluralizeは今のところ謎です。
それっぽいリンクは見つかりました!笑

Method: String#pluralize — Documentation for activesupport (5.2.1)

今は言われるがままに進めてみましょう💪💪
他の gem を使うには、foodie.gemspecに使いたい gem を関連付けます。
activesupportへの紐付けをfoodie.gemspecの44行目に書いてみました。
f:id:mistyrinth:20181204181718p:plain
次に、再びbundle installを行います。これでactivesupportという gem がインストールされるはずです✨
実行画面では分からなかったので、gem listコマンドを実行し、インストール済みの gem 一覧を見てみました。
f:id:mistyrinth:20181204180103p:plain
activesupportが正しくインストールされていることが確認できました🙂
次はfood_spec.rbdescribe Foodie::Foodブロック内にpluralizeのテストを作成します。
f:id:mistyrinth:20181204180735p:plain
上のキャプチャでいう26〜28行目です!
最後に、doof.rbの先頭にrequire 'active_support/inflector'を追加し、foodクラスの中にpluralizeメソッド(14〜16行目)を定義します。
以上で Active Support のpluralizeメソッドが使えるようになったはずなので、テストしてみます!
f:id:mistyrinth:20181204182344p:plain
テストは成功…っぽいですが、pluralizes a wordという出力で合っているんでしょうか…笑
てっきりfoodie.spec.rbで設定したtomatoesが出力されると思っていたのですが😐
仕組みがまだ分からない以上なんとも言えませんが、とりあえず本日はここまで!

Rakeの基本

今回はRubyで使える便利なツール、Rakeというものを扱ってみます!

目次

1.Rakeとは

Rubyに限らず、アプリケーションを構築するとき、手順を自動化したりするビルドツールというのがよく使われます💡
有名なビルドツールにMakeというものがあるそうですが、文法が難しいみたいです😨
Rake は Ruby-Make の略で、Rubyの文法で使えるビルドツールです。
以下のサイトの前半が参考になるようですので、見ながらやっていきます👀

ファイルを扱う作業をRakeで便利にしよう!(パート1:概要編) - るびくる&RBのRubyプログラミング大作戦! - rubicle.net

インストールにはgemを使って# gem install rakeとするのですが、私の場合、RubyGemsをインストールしたときに Rake も一緒にインストールされています。
参考記事:RubyGems

念のため確認してみます!rake --versionを実行すると、インストールされている Rake のバージョンが表示されます🙂
f:id:mistyrinth:20181203144802p:plain
Rakeのバージョン12.3.1がインストールされていることが分かりました!✨

2.Rakeの使い方

2-1. Ralefileを作る

Rakeを使うには、まずRakefileという名前のファイルを作成し、その中にRakeを使って実行したい一連の流れをタスクとして定義します。
とりあえず以下の手順で、デスクトップにRakefileを作ってみました!

  1. cdコマンドでデスクトップに移動
  2. vim Rakefile のコマンドでRakefileを作成
  3. 先程の参考サイトに載っている内容をコピペ

Ralefileの内容は以下のとおりです。
f:id:mistyrinth:20181203150028p:plain

testfileという名前のタスクが定義されています。
"Hello Rake world."と書かれたテキストファイルを作るタスクです😶
実行するには、rake testfileコマンドです!💪
するとデスクトップにhello-world.txtというファイルが作成され、中にはHello rake World.と書かれています🎉
f:id:mistyrinth:20181203150633p:plain

このように、RakeはRakefileの中身を解析し、その内容に従ってビルドを進めるということがわかりました!

3.C言語を使ってビルド

C言語で書かれたソースコードを使ってビルドすることもできます👌
と言っても私はC言語を使えないので、gistを拝借します😆😆
知らない方のgistを挨拶無しで使ってしまうことに対して非常に抵抗がありますが、公開されているし…
このあたりのマナーはよく分からないので、IT業界に入ったら身につけていけるのではないかと期待しています笑

gist.github.com

このRakefileを実行したら何かが起きるはず!と思ったら、結果は以下のとおりでした。
f:id:mistyrinth:20181203155711p:plain
hello.cが無いみたいです。これ、gistの1番目にあったC言語ソースコードの名前ですね😐
このファイルが同じディレクトリに無いとだめなんですね!!
当たり前と言われれば当たり前かもしれませんが、C言語読めなかったのでスルーしてしまいました…笑
今度は実行したディレクトリ(私の場合デスクトップ)にhellohello.oというファイルが作成され、ターミナルにも実行結果が現れました😇
f:id:mistyrinth:20181203162112p:plain

ちなみにデスクトップに生まれたhellohello.oの中身は、catで見ると文字化けしているようでよく分かりませんでした😗笑

Rakeの使い方は以上です〜!

RubyGems

本日は、RubyGemsというソフトを使ってみます!
Rubyのライブラリを扱うことができるそうで、Ruby on RailsRubyGemsでパッケージングされているとのこと。早速始めます😊

目次

1.RubyGemsとは

RubyGemsの公式ガイドはこちらです。

Guides - RubyGems Guides

今回はこのページに従って進めていきます!英語なので、ざっくりの要約を入れながら進めていきます💪

The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” which contains a packaged Ruby application or library.

どうやらRubyにはgemと呼ばれるソフトがあるそうで、Rubygemsは、この gem を使えるようにしてくれるみたいですね。

Gems can be used to extend or modify functionality in Ruby applications. Commonly they’re used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.

gemというのは、Rubyの機能性を拡張できるものらしく、他の人と共有したりできるみたいです。
なんだかUNIXみたいですね👀

2.gemのインストール

まずgemをインストールします。
INSTALLING GEMSのとおりにインストールしてみます!

$ gem install drip

f:id:mistyrinth:20181203101306p:plain
最後の行に2 gems installedとあります。
これはdripというgemと合わせて、rbtreeというgemも一緒にインストールされているようですね!!🎉
よく見るとrbtreeが先にインストールされて、rbtreeが拡張されてdripがインストールされているようですね。
rbtreeとやらが何なのか、公式サイトで検索できました!便利〜😎

rbtree | RubyGems.org | your community gem host

A RBTree is a sorted associative collection that is implemented with a Red-Black Tree. It maps keys to values like a Hash, but maintains its elements in ascending key order. The interface is the almost identical to that of Hash.

rbtreeはRedとBlackのTreeのことで、赤と黒のツリー表示で何かを表している専門用語のようです😪笑

ではdripは?というと、以下の解説が書かれています。

Simple RD-Stream for Rinda::TupleSpace lovers.

さっぱり何言ってるか分かりませんね〜😂
RDストリームも Rinda も TupleSpace も、調べてみると深そうなのでとりあえず今は置いておきます。
ひとまず、RubyGems で gem のインストールはできました👏

3.gemの一覧を表示

インストール済みの gem を一覧表示することができます。

gem list

f:id:mistyrinth:20181203104202p:plain
いつの間にか沢山ありますね😳😳最初から入っているのでしょうか。
リモートで gem を探したい時はsearchを使って検索できます。

gem search キーワード

先程インストールしたdripで検索してみました!
f:id:mistyrinth:20181203104618p:plain
他にもいろいろな gem があるのが確認できました💡

4.gemの更新

gemを更新するには、以下のコマンドを実行します。

gem update gem名

gem名を指定しない場合、全部のgemをアップデートします。
私の場合は1分くらい処理をして、アップデートが完了しました👌
ログがすごく長いので、キャプチャは割愛します😆

5.gemのアンインストール

gemをアンインストールするには以下のコマンドを実行します。

gem uninstall gem名

ではdripをアンインストールします👋
f:id:mistyrinth:20181203111928p:plain

RubyGemsについては今後使っていくと思いますが、とりあえず導入は以上です!✨

Ruby入門 part11

Ruby入門、標準ライブラリについての続きです🎈
これでRuby入門は最後になります!長かった〜!
この記事もそれなりに長いです😂笑

目次

1.配列(Array)クラス

1-1. 要素の置き換え、追加

配列オブジェクトについてはこちらの記事で学習したとおりですが、インデックスという数値を使って他のオブジェクトを管理できるものでした💡
インデックスは先頭の要素を 0 として、1, 2, 3, ... と増えていくものでした。
そして、配列に含まれる要素を取得するには次のように行います。
1つの要素を取得する方法と、複数の要素を配列として取得する方法を続けて記載いたします。

変数名 = 配列オブジェクト名[インデックス]
新しい配列オブジェクト名 = 配列オブジェクト名[開始位置..終了位置]

また、配列に含まれる要素を別の要素に置き換えることもできます。

配列オブジェクト名[インデックス] = 新しい要素
配列オブジェクト名[開始位置..終了位置] = 新しい要素
配列オブジェクト名[開始位置, 要素の数] = 新しい要素

要素を追加するには、上記の3つめの方法を応用して、引数の「要素の数」を0にすることで、開始位置に新しい要素を追加できます✨

これまでの解説をまとめて実際にやってみました!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181129180354p:plain

1-2. 配列の平滑化

配列オブジェクトの中の要素に他の配列があるとき、中の配列を展開して平滑化することができます。 Arrayクラスで用意されているflattenメソッドを使います。

配列オブジェクト名.flatten

具体的には以下のようになります。
ここでは、配列の中のひとつの要素に["塩", "胡椒"]という配列が入っていますが、これを展開して平滑化しています🌝

gist.github.com
結果は以下のようになります。
f:id:mistyrinth:20181129183136p:plain

1-3. 要素を取り除くメソッド

ここからは要素を取り除くメソッドをいくつか紹介します。

メソッド 動作 備考
uniq 重複要素を取り除いて配列を作成
uniq! 重複要素を取り除いて配列を上書き
compact nilの要素を取り除いて配列を作成
compact! nilの要素を取り除いて配列を上書き
delete 指定した値と等しい要素を取り除いて上書き 引数あり
delete_at 指定したインデックスの要素を取り除いて上書き 引数あり
delete_if ブロック内の処理結果がtrueの要素を取り除いて上書き 解説後述

沢山ありますね!!
delete_ifは、以下のように書くことができます。rejectも同様です😊

配列オブジェクト名.delete_if {|x|
    実行する処理
}

uniqのように新しく配列を作成するメソッドに対して、deleteのように自身を上書きするメソッドを破壊的メソッドといいます。
新しく作成するメソッドなのか、上書きするメソッドなのかを把握しながら実行しないと、予期せぬ戻り値になります笑
ちなみにわたしはdeleteが新規作成メソッドだと思いこんでいたら、取り除きたい値だけが戻り値になって返ってきてしまい、苦戦しました😂

ひとつひとつ試していきます!

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181129212617p:plain

1-4. 並び替えメソッド

削除の次は、要素を並び替えるために使えるメソッドを紹介します😋

メソッド 動作 備考
reverse 要素を逆順に並び替えて配列を作成
reverse! 要素を逆順に並び替えて配列を上書き
sort 要素を一定の規則でソートして配列を作成 解説後述
sort! 要素を一定の規則でソートして配列を上書き
transpose 配列を行列とみなす(行と列を入れ替える) 解説後述

sortメソッドは、以下のようにブロックを使ってソートする方法を指定することができます。

Arrayオブジェクト.sort {|a, b|
    aとbを使った比較の方法
}

なお、比較方式を指定しない場合には各要素を<=>メソッドが使われます。この場合、要素は小さい順に並べ替えられます。

transposeメソッドは、配列(左から右へ)を行列(上から下へ)として入れ替えるメソッドです。
行と列が入れ替わるというイメージですね😶

これらを実際に試してみます!

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181129215028p:plain

2.ハッシュ(Hash)クラス

ハッシュについてはこちらの記事で学習しましたが、他にもHashクラスで使えるメソッドがあるので紹介します💡

メソッド 動作 備考
delete 指定したキーに対応する値を取り除いて上書き 解説後述
delete_if ブロック内の処理結果がtrueのキーと対応する値を取り除いて上書き 解説後述
reject! 同上
relect ブロック内の処理結果がtrueのキーと対応する値を取り除いたハッシュを作成
clear ハッシュを空の状態にする

先程も出てきたdelete系のメソッドがHashクラスにも用意されていますね〜😐
指定したキーに対応する値を、ハッシュ自身から取り除きます。破壊的メソッドですね🔥
戻り値は削除された値になります。

deleteメソッドでは、指定したキーが存在しない場合の処理をブロックに指定することもできます!

ハッシュオブジェクト名.delete(キー) {|key|
    ...
}

delete_ifメソッドは次のように書くことができます。
同じ動作をするreject!メソッドも同様です👌

ハッシュオブジェクト名.delete_if {|key, value|
    ...
}

実際にやってみます!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181201130625p:plain

3.時刻(Time)クラス

3-1. Timeオブジェクトの作成

今度は初登場のTimeクラスです。時刻を扱うクラスですね🕑

Timeクラスから作成できるTimeオブジェクトには、起算時と呼ばれる時刻から現在までの経過秒数を持っています。
起算時は、一般的には1970年1月1日午前0時です。
なぜかというのはちょっと調べてみただけではよく分かりませんでしたが、世界的な基準やらUNIXのシステムやらがそうなっているらしいです😶

Timeオブジェクトを作成するには、おなじみnewメソッドを使います。

Timeオブジェクトを格納する変数 = Time.new

newメソッドの他にnowメソッドを使うこともできます。

Timeクラスには、オブジェクトの経過秒数から時刻を構成する要素を取り出すメソッドがいくつか用意されています。

メソッド 動作
sec 秒を整数で取得
min 分を整数で取得
hour 時を整数で取得
day 日を整数で取得
mday 同上
month 月を整数で取得
mon 同上
year 年を整数で取得
wday 曜日を0(日)から6(土)の整数で取得
yday 1月1日からの通算日を整数で取得
isdst 夏時間があるなら true
dst? 同上
zone タイムゾーンを表す文字列を取得

沢山ありますね😳
これらを組み合わせてプログラムを書いてみました!

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181201135604p:plain
実行した時の時刻が表示されました!🎉

現在時刻ではなく、指定した日時を表すTimeオブジェクトを作成するには、Timeクラスで用意されているlocalメソッドを使います。また、mktimeメソッドを使っても同じです。
localメソッド(またはmktimeメソッド)の引数には以下の2種類があります。

Time.local(year, month, day, hour, min, sec, usec)
Time.local(sec, min, hour, day, month, year, wday, yday, isdst, zone)

ひとつめの引数は、年、月、日、時間、…という順で作っていきます。usecはマイクロ秒のことです😊
途中から省略することもでき、その場合は省略された引数には取り得る最小値が代入されます。
ふたつめの引数は、秒、分、時間、…という順です。
こちらは引数を省略できず全て指定するのですが、wday, yday, zoneは設定しても無視されるようです笑
isdstサマータイムの有無を指し、値はtrueまたはfalseです。

3-2. Timeオブジェクトを文字列として取得

Timeオブジェクトを指定したフォーマットで文字列として取得するには、Timeクラスで用意されているstrftimeメソッドを使います。

変数 = Timeオブジェクト名.strftime(フォーマット文字列)

引数のフォーマット文字列とは、出力したい形式を表す文字列です。以下のような特別な文字列を使って指定することができます。

フォーマット文字列 出力形式 出力例
%A 曜日 Sunday, Monday, ...
%a 曜日の省略形 Sun, Mon, ...
%B 月(文字) January, February, ...
%b 月(文字)の省略形 Jan, Feb, ...
%c 日付と時刻
%d 01 〜 31
%H 24時間制の時 00 〜 23
%I 12時間制の時 01 〜 12
%j 年中の通算日 001 〜 366
%M 00 〜 59
%m 月(数字) 01 〜 12
%p 午前または午後 AM,PM
%S 00 〜 60 (60はうるう秒)
%U 週番号(最初の日曜日が第1週) 00 〜 53
%W 週番号(最初の月曜日が第1週) 00 〜 53
%w 曜日を表す数(日曜日が0) 0 〜 6
%X 時刻
%x 日付
%Y 西暦
%y 西暦の下2桁 00 〜 99
%Z タイムゾーン
%% %自身

沢山あって、覚えるのは難しそうですね💦
実際にやってみると、次のようになります。

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181201192528p:plain

3-3. 時刻の取得

Timeクラスには、時刻を取得するためのメソッドがいくつかあります。

メソッド 動作 備考
to_a Timeオブジェクトの各要素を配列として取得 解説後述
to_f 起算時からの経過秒数を浮動小数点数で取得
to_i 起算時からの経過秒数を整数で取得
tv_sec 同上
utc_offset 現在のタイムゾーン協定世界時との時差を取得
gmt_offset 同上
gmtoff 同上

to_aメソッドで取得できる時刻の要素は、次の順番で配列に格納されます。
[sec, min, hour, mday, month, year, wday, yday, isdst, zone]

これらを実際に試してみました!
gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181201210445p:plain

4.日付(Date、DateTime)クラス

4-1. Dateクラス

Dateクラスは日付を扱うクラスですが、Ruby公式では推奨されていないらしいです。将来的になくなるとか🧐
Dateクラスは組み込みクラスではないため、Dateクラスを使うにはまずプログラムファイルの中で次の一文を記述する必要があります。

require "date"

Dateクラスのオブジェクトを作成するには、newメソッドを使って年月日を指定するか、todayメソッドを使って本日の日付を取得する方法があります。

Date.new(year, month, day)
Data.today

DataクラスのオブジェクトはTimeオブジェクトと同様に、dayメソッドなどを使って時刻を取得したり、フォーマット文字列を使って文字列を取得することができます。

4-2. DateTimeクラス

DateTimeクラスはDateクラスのサブクラスで、Dateクラスの年月日に加え、時分秒を扱うことができます💡
DateTimeクラスも当然組み込みクラスではないため、始めにプログラムファイルの中でrequire "date"を記述する必要があります。

DateTimeクラスのオブジェクトを作成するには、newメソッドで任意の時間を指定するか、nowメソッドで現在の時刻を取得します。

Date.new(year, month, day, hour, min, sec, offset)
DateTime.now([start])

offsetは、協定世界時との時差を指定します。単位はです🌞
例えば、日本の時差(9時間)を表すには9[時間] / 24[時間]日の0.375日となります。

Ruby入門、以上です!長々ありがとうございました😆

Ruby入門 part10

Ruby入門いよいよラストスパートです!
標準ライブラリのセクションに入りました\(^o^)/

目次

1.標準ライブラリ

Rubyで最初から用意されているクラスやモジュールを標準ライブラリといいます。
項目は公式リファレンスマニュアルのライブラリに載っています😊
docs.ruby-lang.org

2.数値(Numeric)クラス

2-1. 整数(Integer)と浮動小数点数(Float)の変換

Numericクラスには、サブクラスとしてIntegerクラスとFloatクラスがあります。
Numeric は数値、Integer は整数、Float は浮動小数点数でしたね👨‍🎓
整数と浮動小数点数といっても、数値を指すことには変わりないので、例えば1010.0はお互いに変換することができます。

メソッド 用途
to_f IntegerからFloatに変換
to_i floatからIntegerに変換(小数点以下切り捨て)
truncate 同上
round floatからIntegerに変換(四捨五入)
ceil floatからIntegerに変換(切り上げ)
floor floatからIntegerに変換(切り下げ)

小数点以下の扱いにもいろいろなパターンがありますね〜🤨
それぞれ試して結果を見てみましょう!!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181128155044p:plain
ちょっとずつ結果が違うので、用途を考えて変換しなくちゃですね💪

2-2. 数値を文字列に変換

続いては、Integerクラスで用意されているメソッドを2つ紹介です!
ひとつは数値を文字列に変換するto_sメソッドです。sStringの頭文字ですね。
数値を文字列にするというのは、10"10"にする感じです。数字としての10ではなく、「10」という文字列にするということです。
また引数として、2から36までの基数を指定できます。
例えば10.to_s(2)なら、10を2進数にした1010が文字列として返ってきます👏 もうひとつは数値を文字コードに変換するchrメソッドです。
US-ASCIIでは、1バイトの文字(簡単に言うと半角の文字)は、0 から 255 までの範囲の文字コードに対応しています。
ただし私の使っている環境がUTF-8なので、実際に試すとエラーになります😖
今はNumericクラスの学習がメインなので割愛しますが、UTF-8文字コードがあれば、文字コード.chr(UTF-8)という書き方で文字に変換できます😊
数値を文字列にするほうを実際にやってみました!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181128164545p:plain

2-3. 割り算メソッド

次は、割り算についてのメソッドを紹介します。
四則演算についてはこちらの記事に書いたとおりです。
当時は注意点として、/を使って割り算をすると、整数÷整数=整数になってしまうことを挙げました🙁
今回は、/以外の方法で割り算をして、答えが浮動小数点数になるようにしてみます!
割り算をするためにNumericクラスに用意されているメソッドとして、divメソッドとquoメソッドがあります。
割り算に使われる数値が整数でも浮動小数点でも、divメソッドは答えを整数で返します。
逆にquoメソッドの答えは浮動小数点数になります。
割られる数と割る数のパターンに対する結果を以下にまとめました!

- div:割り算の答えは整数
- divmod:割り算の答えを整数と余りで表示
- fdiv:割り算の答えは浮動小数点数
- /:整数同士の割り算の答えは整数、それ以外は浮動小数点数
- quo:割り算の答えは分数

ちなみにメソッドは割られる数.div(割る数)という書き方になります。割る数は引数ですね🙂
実際にやってみました!

gist.github.com
結果は以下のとおりです。

f:id:mistyrinth:20181128172241p:plain

2-4. 絶対値を取得

最後に、絶対値を取得するabsメソッドです。
数値.absで絶対値を取得します。負の値なら(-5).absです💡
これはややこしくないので、キャプチャは割愛しますね😂

3.文字列(String)クラス

3-1. 文字列の大小関係

文字列オブジェクトについてはこちらの記事で扱っていますので、ここではStringクラスについて詳しく見ていきます😎
数値と同じく、文字列にも大小関係があります!
なので==!=演算子は当然使えますが、>=<も使えます😳
どうやらアルファベットに対応していて、ABCDEF....XYZabcdef...xyzという順番で大きくなっていくみたいです。
ではひらがな、漢字は?というと…ワカリマセン🤪
文字のバイト数を比較しているようですが、詳しく載っているブログを見つけたので貼っておきます!

qiita.com

いろいろ試してみました。
gist.github.com
結果は以下のとおりになりました!Japan は America より大きい!!\(^o^)/
f:id:mistyrinth:20181128180328p:plain

3-2. 文字列の一部を取得、置き換え

今度は、文字列の一部を取得して、文字を置き換える方法です。
書き方は以下のとおりです。文字で説明するのわかりにくいですが…😖笑

文字列[取得したい文字の先頭位置, 取得したい文字の長さ]
    または
文字列[取得したい文字の先頭位置..取得したい文字の最後の位置]

ただし、先頭は0番目として数えます!あと、長さの単位はbyteです。これは注意ですね🖊
例えばHello[1,3]とすると、Helloの1番目のeから始まって3文字の長さであるellを取得します。
また、Hello[2..4]とすると、Helloの2番目から4番目の文字列lloを取得します。
他には、以下のような書き方もあります。こちらは数え方が少し変わっています。

文字列[取得したい文字が始まる位置...取得したい文字が終わる位置]

文字だけの説明だと全然わからないと思いますが😭頑張って説明してみます。
これは文字と文字の間を数えていく方法で、0番目(先頭)の文字の左隣が0、0番目と1番目の文字の間が1、という数え方です。
例えばWelcome[2...4]なら、引数の2は e と l の間を指し、4は c と o の間を指しています。
つまり、lcを取得します。

試しにやってみます。
gist.github.com
結果は以下のとおりです✨
f:id:mistyrinth:20181128212530p:plain

3-3. 文字列を挿入、検索

文字列の中に他の文字列を挿入するには、Stringクラスで用意されているinsertメソッドを使います。

insert(挿入する位置, 文字列)

挿入する位置は、先程と同様に先頭の文字が0番目です。

文字列の中から指定の文字列を検索するには、Stringクラスで用意されているindexメソッドを使います。

index(文字列, 検索開始位置)

このうち、検索開始位置は省略できます👌
indexメソッドは、文字列の左端から右端に向かって検索を行います。
また、右端から左端に向かって検索するときは、rindexメソッドを同じように使います。
いずれのメソッドも、見つかった場合は対象の文字列の左端の位置を返し、見つからなかったらnilを返します👏
ちなみに、対象の文字列が含まれているかどうかの確認だけならinclude?メソッドを使います。

include?(文字列)

引数の文字列が含まれていればtrue、含まれていなければfalseを返します。
実際にやってみます!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181128220718p:plain
なんとなくわかってきました〜!

3-4. 文字列を削除、分割

文字列の中に含まれている文字列を削除したい場合は、Stringクラスで用意されているdeleteメソッドを使います。

delete(文字列1, 文字列2, ... )

引数には削除したい文字列をカンマで繋げて、複数の文字列を削除できます。
deleteメソッドは、削除した後の文字列を繋げて新しい文字列として保存しますが、delete!にすると削除した後に上書き保存します。

また、文字列を分割するには、Stringクラスで用意されているsplitメソッドを使います。

split(分割パターン, 分割数)

分割バターンは区切り文字を指定したり、正規表現を使うことができます💪分割数は省略可能です。
分割された文字列は、新しく作られる配列の各要素となります。

削除と分割を実際に試してみました〜!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181128223925p:plain

引き続き削除メソッドを2つ紹介しますが、サンプルプログラムでは非常にわかりにくいため、文章だけで説明になってしまいますがご了承ください😖😖
ひとつは、既存のファイルから文字列を読み込んだ場合などに、文末の改行文字\nなどをまとめて取り除きたい場面があります。
文字列の最後にある改行文字を取り除くためには、Stringクラスで用意されているchompメソッドを使います。
もうひとつは、既存のファイルから文字列を読み込んだ場合などに、先頭や末尾の空白をまとめて取り除きたい場面があります。
文字列の先頭や末尾にある空白文字(タブなども)を削除するには、Stringクラスで用意されているstripメソッドを使います。

本日は以上です✨