別冊とっしーぱんち

IT技術系、Ruby関連、プログラミングお役立ち

IntelMacにRuby3.1をインストールする。そしてRuby3.2へ更新。

MacにRubyのインストールを行った記事です。先月Ruby3.2がリリースされたので、更新作業も追記。

この記事は以下の機種で試しています。 MacBook Pro 2020(Intel)

MacBookにはすでにRubyがインストールされている。

MacBookには、なにもしなくてもRubyがインストールされています。ターミナルを起動し、以下のコマンドを打つことでインストールされているRubyのバージョンを確認することができます。

% /usr/bin/ruby -v

ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.x86_64-darwin21]

Rubyの基本的な文法は、バージョン2.6でも学習することはできます。このまま始めても良いのですが、どうせなら最新バージョンを使いたい!という欲望があったので、インストール作業から始めることにしました。2022年9月時点でのRuby最新バージョンは3.1です。これをインストールすることにしました。

Homebrewとrbenv

プログラマ版のAppleStoreみたいなものがHomebrew。

たくさんのRubyバージョンをインストールして切り替えながら使うことができるrbenv。

今回はこの2つをインストールすることにしました。rbenvをインストールするにはHomebrewが必要なのでまずはこちらから。

Homebrewのインストール

brew.sh

公式サイトに手順が載っていますが、こちらのコードをターミナル上にコピペするだけでインストールは完了します。

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

rbenv

rbenvはRubyを複数インストールして切り替えることができる便利ツール。インストールはrbenvのREADMEを読みながら進めていきます。

github.com

手順が少し長いので、メモを残して置きます。

rbenvのインストール

# インストールする
brew install rbenv
brew install ruby-build

# 最新版に更新をしてみる。
brew upgrade rbenv ruby-build       

Macログイン時にrbenvが使えるようにする。

#vimはテキスト編集を行うソフト。テキストエディタといいます。
% vim ~/.zshrc

--- ここから.zshrcというファイルの中身です。

# に以下を記述する。場所はどこでもいいけど、最終行に追記した。
eval "$(rbenv init -)"

--- ここまで

# このコマンドを実行すると、.zshrcに追記した内容が反映されるらしい。
% source .zshrc 

rbenvでRubyをインストールする。

# rbenvというコマンドが使えるようになっているはず。
# ダメだったら新しいターミナルを立ち上げる。
% rbenv -v
rbenv 1.2.0

# インストールできるRubyのバージョン一覧。めっちゃ出てくる。
% rbenv install --list-all

# Rubyをインストール。コーヒー休憩でもしながら気長に待ちます。
% rbenv install 3.1.2

インストールしたRubyを使えるようにする。

# インストールしたRubyたちを一覧で表示する。
% rbenv versions 
*  system
  3.1.2

# 使いたいRubyのバージョンを以下のコマンドで変更します。
% rbenv global 3.1.2

# このコマンドを呼ぶと確定、反映されるようです。
% rbenv rehash

# もう一度確認すると、*が3.1.2を指しているはず。
% rbenv versions
  system
*  3.1.2

# この状態でRubyのコマンドを使って最終確認できればインストール完了!
% ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]

(追記) Ruby3.2をインストールする。

すでにrbenvのインストールが終わっているので、追加手順は以下を実行するだけでした。更新作業はお手軽でいい感じ。

# 最新版に更新をする
brew upgrade rbenv ruby-build       

# Ruby3.2.0-rc1がでてくれば更新済
% rbenv install --list-all | grep 3.2.

# Rubyをインストール。コーヒー休憩でもしながら気長に待ちます。
% rbenv install 3.2.0-rc1

# 使いたいRubyのバージョンを以下のコマンドで変更します。
% rbenv global 3.2.0-rc1

# このコマンドを呼ぶと確定、反映されるようです。
% rbenv rehash

% ruby -v
ruby 3.2.0rc1 (2023-01-06) [x86_64-darwin22]

作成:2022年09月18日
更新:2023年01月06日

【RubyGem紹介】HTMLテンプレートエンジン「liquid」

単品のHTMLと簡単なCSSを書いてWebページを作るみたいなことをしてる人なんですが。テーブルで表示するようなリスト表示ものを作りたいってときに、数行程度ならまだしも10とか超えてくると、物量多いしコピペミスるしということで疲れたりします。体力が少ないのでここはプログラミングの力を借りてHTMLを一部生成できるようにしたい!そこで登場するのがHTMLテンプレートエンジンです。

Ruby標準ライブラリのなかにも「erb」というものがあるんですが、それよりも高機能な雰囲気だったLiquidをつかってみることにしました。ちなみにLiquidはShopifyという会社が開発。その会社が運営するネットショップ開設サービス、利用者がShopify(日本でいう楽天市場みたいな)で自分のサイトをカスタマイズするときにも使われているそうです。

Gemインストール

# インストール
gem install liquid

# バージョン確認
gem list liquid
liquid (4.0.3)

ちいさく試す

最小限っぽいコードはこんな感じになりました。

require 'liquid'

product = {'title' => "Awesome shoes"}

File.open("index.liquid") do |f|
  template = Liquid::Template.parse(f.read)
  puts template.render( 'product' => product )
end

index.liquidというのは、Liquidで使われる構文が埋め込まれたHTMLファイルです。こんな感じ

<!DOCTYPE html>
<head>
<meta charset="utf-8">
    <title>Liquid Demo Page</title>
</head>
<body>

{%  if product.title == "Awesome shoes" %}
    these shoes are awesome!!!
{%  endif %}

</body>


</html>

{% if product.title == "Awesome shoes" %}の中身がRubyの文法で記述できるわけです。puts template.render( 'product' => product )で渡したproductの中身が"Awesome shoes"という内容だったら、these shoes are awesome!!!と表示せよ、という意味になります。基本形はこれだけ。

ここまでだとerbと大差ないのですが、他にもフィルタやテンプレートからテンプレートを呼び出せるようです。それはまた次の機会にでもこの記事に書き足していければと思います。最近思うのはこの手の技術記事ってブログの特徴であるリライトを重ねていく方がより良いものになったりするのではないかなと考えていまして。少しずつ紹介しながら、内容を拡充しながら記事を育てていく感じにできればなあと考えています。

shopify.dev

【JavaScript】シンプルなフレームワーク Stimulus.js

Rubyの世界を探訪中に見つけたJavaScriptフレームワークStimulus.js。

控えめなJavaScriptフレームワークと称されるだけあって、最低限動かすところまでの敷居が低くていい感じでした。今日はそんなStimulus.jsさんの紹介です。

出会い

Ruby on Rails7の機能を眺めていたら見つけたのがきっかけ。Railsと連携して使うこともできるし、Stimulus単体でも利用可能とのこと。Rails環境はちょうどいいのがなかったので、まずはStimulus単体で触りごごちを試してみることにしました。


実験台はシンプルなWebサイト

実験台としてちょうど良いサイトということで、以前作ったEasy Password Generatorを改造することにしました。

このサイトは、ラジオボタン、チェックボックスとボタンの簡単なフォームでできていて、制御にvue.jsというJavaScriptフレームワークを使っています。

余談ですが、パスワード文字列生成そのものは、OpalというGemでRubyからJSに変換したコードによって実現しています。これもOpalの実験でおためし実装したものです。


公式ハンドブックを眺めながら実装

以下のサイトからHandBookを読み進めながら、基礎的な動作を学びます。

stimulus.hotwired.dev

最低限、覚えることはざっくり3つ

  • クラスをStimulusにControllerとして登録。
  • 制御したいタグにTargetをくっつける。Target名には「data-クラス名-target」という名前規則がある。
  • ボタン押したときの動作はActionをくっつける。data-action="クラス名#メソッド名"という名前規則がある。

といったところだけ覚えました。もう少し色々ありそうですが、この3つだけ覚えておけばなんとなく操作できそうです。


Stimulusとは無関係に、yarnとはなんぞ?でつまずく

Hello Stimulusのところで、yarn installとか出てきてなんじゃそれは?となったのですが、Node.jsというものをインストールすると一緒についてくるnpmというJavaScriptライブラリをお手軽インストールする仕組みを、さらに便利にしたパッケージ管理システムとのこと。Node.jsを使っていなかったのでここが一番つまずいたポイントでした。

プログラミングって、やはり環境構築というのが大きなつまずきポイントなのではないかなと改めて思うところではあります。


そして、yarnを使わない方法にあとから気づく

一通りの学習を終えたのち、Installing Stimulus in Your Applicationというページをのぞいてました。するとUsing Without a Build Systemという箇所に、yarn使わない方法が載っていました。なんてこった最初からこっちやっておけばよかった!

載せ替えたWebページは、シンプルなこちらの方法を採用することにしました。こちらの方法はNode.jsも不要なので環境構築の手間が省けます。その代わりHTMLに書く量が少し増えるかな?といった感じです。

既存のサイトを書き換えていく

HandBookでは、JavaScriptのソースファイルは別に置いてある前提なのですが、手っ取り早く試したかったのでHTML埋め込みでJavaScriptを書いていきました。書き換え自体は、最初のハンドブックで覚えた内容を置き換える程度だったので、簡単にできた印象です。

できあがったWebサイトは、こちらパスワードジェネレータになります。

コードを一部抜粋して紹介

まずは、scriptタグの中身です。

    <script type="module">
        import {Application, Controller} from "https://unpkg.com/@hotwired/stimulus@3.2.1/dist/stimulus.js"

        window.Stimulus = Application.start()

        Stimulus.register("password", class extends Controller {
            static targets = ["option", "lower", "result"]
            static classes = ["supported"]

            connect() {
                if ("clipboard" in navigator) {
                    this.element.classList.add(this.supportedClass);
                }
            }

            generate() {

                // ラジオボタンのチェックが入っているデータを取得する。
                let words;
                this.optionTargets.forEach(x => {
                    if (x.checked) {
                        words = x.value
                        return
                    }
                })

                // 全て小文字にチェックが入っているか
                const isLower = this.lowerTarget.checked

                // パスワード文字列生成
                const password = Opal.EasyPasswordMaker.$make(parseInt(words, 10), isLower);

                // 結果表示
                this.resultTarget.value = password
            }

            copy() {
                navigator.clipboard.writeText(this.resultTarget.value)
                alert('コピーしました。')
            }
        })
    </script>

CDNからstimulus.jsを拾うようにしているのと、Controllerもここで作成しています。


つづいて、bodyタグの中です。全部書くと長いので、使っているところだけピックアップします。

<div class="container-fluid d-flex align-items-center justify-content-center"
     data-controller="password" data-password-supported-class="clipboard--supported">


<input data-password-target="option"
            class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1"
            value="8" checked>

<button data-action="click->password#generate" type="submit" class="btn btn-primary btn-sm">
                        パスワード文字を作る

BootStrapの定義もあってごちゃっとしていますが、StimulusのコードはHTMLタグの中にdata-なんとかを書いているところです。

ここで、各タグ内の動作を制御したり、値を書き換えたりができます。既存のHTMLに付け足していくだけなので、このような簡単なWebページであれば、かなりお手軽に実装できるところがお気に入りポイントですね。

コードの完全版はGitHubに置いています。ソースがとっ散らかってる感は否めないですが・・。何か参考になりましたら幸いです。

oki-ppanashi/docs/epg_stimulus.html at master · osio-toshimasa/oki-ppanashi · GitHub

まとめ:学習量は少なくても済むので、Webページに簡単な制御をつけたいときにおすすめです!

HandBookに沿って学習していけば、わりあっさり動くところまで持っていくことができます。作者はBaseCampというWebサービスを作っている会社(Ruby on Railsもこの会社が作っています)なので、仕事として使えるものなのですが、趣味時間のなかで個人制作している身としては、このようなシンプルなフレームワークは使い勝手や時間効率がよく、とても魅力的に感じました。ありがたい!

Webページ作るときはしばらくStimulusを選択肢としてやっていきたいと思います😊

MacのターミナルAppを整える。

プログラミングをしていると何かとお世話になることが多いターミナルソフト。そのまま使うこともできますが、お気に入りの見た目に変更したり、便利な機能を導入することで使い勝手を向上できます。

これもハマると抜け出せないなかなかの沼っぷり。プログラミングをするために環境を整えているつもりが、いつの間にかカスタマイズすることに喜びを感じてしまうのです。。恐ろしい。。でも楽しい。。

今回は、そんなターミナルソフトのカスタマイズ例をご紹介します。

なお、使用している環境は、MacBook Pro2020(Intel)です。
OSのバージョンはmacOS Ventura を利用しています。

% sw_vers
ProductName:     macOS
ProductVersion:  13.0.1
BuildVersion:  22A400

テーマカラーを変える

まずは、ターミナルのテーマカラーの変更をします。標準のテーマカラーだと気に入ったものがなかったので、検索して見つけた「Iceburg」を使うことにしました。Iceburgの特徴は、黒基調で寒色系の色が中心です。彩度も抑え気味なので、刺激が少なくて目に優しいです。

Iceberg - dark blue color scheme for Vim / Neovim


テーマ「Iceburg」の追加手順

Macの場合は、ページを下の方にぐぐっとスクロールしていくと、Iceburg for MacOSというのが見つかるのでそこからDownloadボタンでテーマファイルをMacに保存します。保存したら、以下の画面で読み込みを押して、保存したテーマファイルを指定すればテーマが追加されます。

一般というタブに、起動時に開くプロファイルという項目があるので、ここにiceburgを指定すると、次回のターミナル起動時にiceburgのテーマで表示されるようになります。

文字フォントを変更する

ターミナルに表示されるフォントも変更していきます。フォントの選び方については以前紹介したこちらの記事を参考にしつつ、自分が気に入ったフォントを見つけてもらえばと思います。

osio-tosimasa.com

ここでは、ターミナルフォントにJetBrains Monoに変更しています。JetBrains Monoはプログラマ向けのフォントで、無料で利用することができます。見た目がパリッとしていて見やすいところが好きです。

フォントの追加手順

JetBrains社のWebサイトからフォントをダウンロードします。

JetBrains Mono: A free and open source typeface for developers | JetBrains: Developer Tools for Professionals and Teams

フォントをMacにインストールする

Macの場合は、公式サイトに詳しい説明が載っていますので、こちらを参考にインストールしていきます。

Mac でフォントをインストール/削除する方法 - Apple サポート (日本)

ターミナルに設定する

設定メニューから、さきほど設定したiceburgを選び、フォントの変更からJetBrainsMonoを選びます。フォントが出てこない場合は、開いているターミナルを一度閉じてから起動すると読み込まれると思います。

ちなみにフォントの大きさは13pt。文字間隔1。行間隔1.2。で設定しています。

Z Shell(ズィーシェル)をカスタマイズする

さてここからは、ちょっとマニアックな設定になってしまうのですが、ターミナル上で動作する、Z Shell。通称zshというソフトについてカスタマイズしていきます。カスタマイズするには設定ファイルを作る必要があります。

カスタマイズしたターミナルソフトを立ち上げて、以下のコマンドでファイルを作成します。

# ファイルがあるか調べてみる。
ls -a ~/.zshrc

# ファイルがないときはこんな感じに出ます。
ls: ~/.zshrc: No such file or directory

# 空っぽのファイルを作ります。
touch ~/.zshrc

作られたファイルをテキストエディタで編集します。編集するソフトはなんでも大丈夫ですが、以前紹介したテキストエディタがおすすめです。

osio-tosimasa.com

VisualStudioCodeで開くときは、少し注意が必要です。作られたファイルはホームアイコンにあるのですが、ファイルを開くメニューからその場所に行っても見つかりません。そう言う場合は、ファイルが表示されている場所をどこか適当に選択したあと、Cmd+Shift+.を入力します。そうすると.(ドット)から始まるディレクトリやファイルも表示されるようになります。


余談ですが、.(ドット)から始まるディレクトリを隠しディレクトリ。ファイルは隠しファイルと呼びます。様々なアプリがこの隠しディレクトリやファイルを使って設定ファイルを保存したりしているのでうかつに手で消したりしないように普段は見えないようにしています。

さて、無事ファイルを開けたらこんな感じで設定を追記していきます。設定例として以下に中身をぺたっと貼り付けます。#で始まる箇所はコメントという説明文で、その下の行が実際の設定になります。めっちゃ多いですね。。その中でも特に大事そうなところだけ、かいつまんで説明します。

# rbenvの読み込み 
eval "$(rbenv init -)"

# Terminal

## ファイル名日本語表示対応 
export LANG=ja_JP.UTF-8
 
## 色を使用出来るようにする
autoload -Uz colors
colors

## ヒストリの設定
HISTFILE=~/.zsh_history
HISTSIZE=1000
SAVEHIST=1000

### 直前のコマンドの重複を削除
setopt hist_ignore_dups

### 同じコマンドをヒストリに残さない
setopt hist_ignore_all_dups

### 同時に起動したzshの間でヒストリを共有
setopt share_history

## 補完
# 補完機能を有効にする
autoload -Uz compinit
compinit

# プロンプト表示 
PROMPT="%{${fg[blue]}%}%n:%{${reset_color}%} %c/ %# "

# option 
## cdしたら自動でpushdする
setopt auto_pushd

## 重複したディレクトリを追加しない
setopt pushd_ignore_dups

# beep を無効にする
setopt no_beep

# エイリアス
alias la='ls -a'
alias ll='ls -l'
 
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
 
alias mkdir='mkdir -p'


# Plugins

## 存在するファイルやコマンドに色をつけるプラグイン
### https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md
if [ -f ~/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]; then
  source ~/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

  ### https://github.com/zsh-users/zsh-syntax-highlighting/tree/master/highlighters/main
  #### 存在するファイルなら色を変える 
  ZSH_HIGHLIGHT_STYLES[path]='fg=cyan'
fi


## 過去に入力したコマンド候補を入力、補完してくれるプラグイン
### https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md
if [ -f ~/.zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then
  source ~/.zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
fi

## 入力途中のコマンドを補完表示してくれるプラグイン
### https://github.com/marlonrichert/zsh-autocomplete
if [ -f ~/.zsh/plugins/zsh-autocomplete/zsh-autocomplete.plugin.zsh ]; then 
  source ~/.zsh/plugins/zsh-autocomplete/zsh-autocomplete.plugin.zsh
fi

ファイル名日本語表示対応

これを入れておくと日本語ファイルが????にならずにちゃんと表示されます。

export LANG=ja_JP.UTF-8

プロンプト表示を短くする&色を使用出来るようにする

これでターミナルに表示される左側の表示をカスタマイズできます。例だと、青で自分のユーザー名。デフォルト色(icebergの場合は白)で今いるディレクトリ名を表示するようにしています。ユーザー名は正直いらないかもですが、ディレクトリ名は地味に重要で、例えばDownloadsというディレクトリにいるときに、デフォルトでは/Users/oco/Downloads/みたいに表示されます。この設定にしておくとDownloadsだけ表示されるので、表示領域を圧迫せずに作業することができます。

autoload -Uz colors
colors

## プロンプト表示 
PROMPT="%{${fg[blue]}%}%n:%{${reset_color}%} %c/ %# "

beep音を無効にする

beep音というのは、コマンドが見つからないときなどに出るプップッみたいな機械的な音のことなのですが、ターミナルで作業していると、この音が結構気になるので無効にしておきます。

 # beep音を無効にする
setopt no_beep

プラグインを導入する

説明すると長くなってしまうので、詳細は割愛しますが、zshもプラグインを追加することで機能が拡張されて、さらに便利になります。今の設定だと、プラグインファイルをベタにダウンロードして読み込んでいるのですが、このプラグインを管理するプラグイン(ややこしいですね)を利用することで、こんなに長ったらしく書かなくても簡単にプラグインを導入することができるようです。調べるとZplugというソフトがおすすめっぽですね。

衰えぬカスタマイズ欲。沼は深くなる一方です。。

最後に紹介したプラグイン管理用ソフトZPlugの導入や、ターミナルソフトについても、iTerm2という高機能なターミナルソフトもあるそうで色々と試したい欲望は尽きません。


・・とかやっていると肝心のプログラミングがほったらかしになりがち。というか既になっているので、プログラミングとプログラミング環境。両方を行き来しながら、少しずつ育てていく感じで、やっていくと良いですね。

とりとめもないRubyWorldConference2022の話

先週11月10日(木)と11日(金)に開催されたRubyWorldConference2022について、配信で見させていただきました。

まず、RubyWorldConferenceてなに?という話ですが、RubyのWorldConferenceみたいです。いやRubyWorldのConferenceかもしれないです。



・・・すみません、あんまりよくわかってないので、公式サイトよりそのまま引用します。

RubyWorld Conferenceは、プログラミング言語「Ruby」の国内最大のビジネスカンファレンスです。 Rubyが、多様な現実世界にどのように適合し浸透していくのか、そのような普及過程と成長を考える機会となることを期待すると共に、Rubyのさらなる普及・発展とビジネス利用の促進を目指します。先進的な利用事例や最新の技術動向、開発者教育の状況などの情報を発信することで、「Rubyのエコシステム(生態系)」を知っていただくことができる場として開催します。

Rubyは初学者。趣味でやっているだけ。という属性なため、ビジネスカンファレンス見てもしょうがないかもな・・・と思いきや、見たら見たで面白く、また良い勉強にもなりました。勉強っていうと真面目そうな感じが出ちゃうので少し語弊があるのかもしれませんが。興味をそそるというか知的好奇心がくすぐられるというか。そういう類のものです。

さて、そんなイベント内容はこちらのリンクから直接みることもできるのですが

2022.rubyworld-conf.org

その中でも個人的に印象深かったところ、好奇心をくすぐられた点について、書き残しておきたいと思います。

Rubyは死んだ?

1日目は、Rubyのパパことまつもとゆきひろさんによる講演。Rubyを採用している企業の時価総額からRubyは今もなお価値を生み続けているプログラミング言語である(つまりは全く死んでない)という話。

このなかで出てきたRubyの企業価値ランキングのサイトが気になって後で覗いてみました。

toprubycompanies.info

1位のairbnbは日本円にして約10兆円の価値があるそうです。日本企業で10兆円超えしている企業というとNTTとかソフトバンクグループとか日本のトップ5くらいに入ってくるような企業たちなのでその価値は推して知るべしといったところでしょうか。一概に単純比較はできないのかもしれないですが、すごい価値を生み出しているということですね。Rubyだけ使っているわけではないとは思います。Rubyも取り入れている企業ということだと思います。ちなみに日本企業では、18位にマネーフォワード。23位にFreee。24位にmixiがそれぞれランクインしていました。

そして、まつもとさんの講演途中でプレゼン用に使っていたノートブックのバッテリーが切れるというアクシデントが発生。ある意味Rubyは死んだのかも知れません(?)

Rubyに型は必要か?

1日目のまつもとさんの話によれば、型宣言は不要だけども型チェックはあってもいいとのこと。Ruby3.0からRBSという別ファイルを定義して型チェックする仕組みを導入してバージョンアップするごとに洗練させていっているということでした。

そして、2日目のShopifyエンジニア、Aaron Patterson(アーロンパターソン)さんの話によると、チームの規模やエンジニアの数が増えてきて、コード量が増えて、複雑化することが見えてきた段階で型情報を追加できれば良い。その解決策としてSorbet(シャーベット)という型チェック用のGemを利用しているとのことでした。といっても全てのコードにSorbetを使っているわけでもなく、大体6割ぐらいの利用率なのだそう。

たしかに、個人レベルの小さな規模で作る分には素早く簡潔に。Shopifyのような大きな企業で作るときには、型チェックを導入してミスの混入を防ぐ。というような棲み分けができていれば、Ruby本体の機能としては型情報はいらないように思いました。RBSはまだ使ったことないですけど、個人で書いている分にはあまり必要性は感じていないのですよね。

Rubyの速さとは仕事の速さ

アーロンさんが基調講演で話していたRubyの魅力。つまり、Rubyはコードを書くためのルールは少ないので、その分ビジネス上の解決策を考える時間に集中できる。ということなのだそう。プログラムの実行速度ではなく仕事の速度という観点からRubyを評価するという点がとても新鮮に感じました。

速さというと、プログラムの実行速度を思い浮かべがちなのですが、ビジネスの現場では仕事を進める速度のほうが大事なのでしょう。ああなんてビジネスカンファレンスっぽいんだ!と勝手に感銘を受けていました。

これ追加したらRuby使うは脈ナシ

好きな異性にアタックしても、どうやら脈ナシの時に察するアレですね。頑張って要望取り入れても使ってくれない人は結局使ってくれないのだそう。無視するとはいかないまでも、脈ナシと分かったらあまり執着しないのがよいのかもな話でした。


Rubyは初心者大歓迎(きっと)

1日目、Rubyの開発を支えるエコシステムについて、アンドパッド社柴田さんの話。 廃れていくコミュニティというのは、初心者が少なくなっていくそうです。現在のRubyコミュニティには初心者が少なくなってはきているということなので、初心者のかたは今が大チャンスかもしれません。そして色々と情報発信してくださいということでしたので、このブログも1ミリくらいは貢献できたら幸いです。

僕自身がそもそもコミュニティに参加していないので、あまり具体的なイメージが湧いてはいないのですが、プログラムという共通の話題を通して、ゆるやかなつながりができてきたら楽しそうですよね。

色々なサービスたち

講演のなかでちらちら出てきたRubyを使ったサービスたちをメモ書きがてら紹介。基本ビジネス向けかと思いますが、Rubyを扱っている以上どこかでお世話になるかもしれないですからね。

GitLab

企業価値ランキングで登場。GitHubに似たソースコード管理システム。調べてみたらサービス自体もRailsで動いているようです。GitLab自体もオープンなので自分でサーバをたててオリジナルGitLabを運用することもできる。

about.gitlab.com

RedMine

Webのプロジェクト管理ツール。チケットという単位で仕事を分割して担当者の割り当てや作業状況を可視化できる。

redmine.jp

色々なGemたち

講演のなかで直接紹介されたものと、紹介されてないけど、講演で使っていたものを勝手に探して調べました。このブログでもいずれ取り入れていきたいですね。

debug.gem

Rubyコードの動作確認をする機能。Rubyのコードを1行単位で実行しながら、変数の値や実行結果を確認することができる。

techlife.cookpad.com

textbringer

テキストエディタ「Emacs」を模したRuby製テキストエディタ。

github.com

Rabbit

まつもとさんが使っていたスライド作成用Gem。パワポみたいなスライドが作れる。

rabbit-shocker.org

Sorbet

すでに出てきましたけど、Rubyに型チェック機能を追加することができる。

sorbet.org

プログラミングで使う名前の付け方をパターン化する。

プログラミングをしているとき、作業の中でそれなりの割合を占めるのが、「名前をつける」という作業。

たかが名前をつけるだけ。その油断が命取り。書いてる最中はいいのですけど、しばらくぶりにコードを読んだりすると意味不明な感じになることもしばしば。かといってその場その場で名前を考えるのは結構時間かかるりますよね。かかるんですよ僕は。そういうわけで名前の付け方をある程度パターン化してしまうという考え方で、時短していきたいと思います。

名前の付け方ルールを把握する

プログラム言語の規約に従った名前にしないとエラーになってしまうので最低限ルールを把握しておきます。Rubyの場合は

  • クラス名はパスカルケース
  • 変数名は小文字。 単語を区切る時にスネークケースを使う。
  • メソッド名も同じく小文字でスネークケース

といった感じです。なんとかケースという文字がいっぱいでてきましたが、これらの意味わからないよーってかたは以下の記事を参考にしてもらえばと思います。変数名はRubyだとスネークケースを多く見かけますが、他の言語だとキャメルケースが多いように感じます。

osio-tosimasa.com

ところで、変数名には、いわゆる「予約語」を使うことはできません。「予約語」というのはプログラム言語で既に使われている名前のことです。Rubyだとifとかwhileとかclassとかそういうのが予約語に該当します。

クラス名のつけかた

名詞にあたるものをそのままつける

1つめは名詞をそのまま使うパターン。

例を挙げると、アカウント情報を扱うクラスならば、そのまんまAccountみたいな感じです。

クラス名は擬人化して名付ける

2つめはクラスを擬人化して名付けるパターン。このクラスって何する人か?っていう役割によって名前をつけるようなイメージですね。

例を挙げると、AccountManager(アカウント管理する人)みたいな感じです。プログラムの内容を見なくても、名前だけでアカウント追加したり削除してくれたりしそうなイメージが持てるのがよいです。

変数名のつけかた

何が入っているかわかればOK

変数に関しては、器の名前として成立していればそれで問題ないと思います。

さきほどクラス名で出てきたAccountを変数に入れるならば、そのままaccountでもいいですし、新規アカウント用の変数だったら、new_accountで良いんじゃないでしょうか。

変数名は、単語を省略して使われることもある

名前の付け方というところで変数名については、長い単語を省略して表す場合があります。例えば

  • 数をカウントする count --> cnt
  • 数字や番号を表す number --> num
  • 列を表す columns --> col

とかは見かけますね。他のかたが書いたコードを参考にしたりする場合などにこのような省略形で名前が付いている場合もあります。自分で名付けるときも省略系を使っても良いですが、あまり浸透してない略し方を使うとやっぱりわからなくなってしまうので、なるべく省略せずに名前をつけるのがおすすめです。よっぽど長い単語の場合は別の単語に置き換えるとかがいいんじゃないでしょうか。

メソッド名のつけかた

動詞からつける

メソッド名は、動詞から始まるパターンが多いです。クラス名で出てきたAccountManagerにメソッド名をつけていくとしたらこんな感じです。

  • アカウントを作成する ーー> create
  • アカウントを削除する --> delete
  • アカウントを探す   ーー> find

動詞に形容詞や名詞をくっつける

さきほどの応用編で、動詞に付け加えて名詞をくっつけるパターンですね。同じくAccountManagerを例に挙げます。

  • 最初のアカウント探す --> find_first
  • アカウントに権限をつける --> add_role
  • アカウントグループを作る --> make_group

メソッド名は、「なにをするのか」ということが名前になっていればよいと思うので、動詞をメインに名前を考えておけばそれっぽくなると思います。

今回は名前の付け方や考え方についてご紹介しましたが、名前のつけかたとしてよく使う英単語も、パターン化しておくとさらにいい感じかも。

初製作のGem「paapi_mini」を公開しました。

前回、自作のRubyGemの公開準備を進めていますで作っていたGemを、やっと公開することができました。

RubyGemsのサイトに飛んでもらって、paapi_miniと検索すると出てきます。感動。

Gemの内容としては、Amazonの商品検索をRubyから行えるというものです。事の発端とか経緯については、雑記ブログのこの記事とかこの記事を読んでみていただければと思います。

Gem公開でやったこと

ざっと書き上げるとこんな感じになります。

  • Gem用のGitHubリポジトリを作る。
  • あたらしいリポジトリにコードを移植する。
  • RubyGemsのアカウントを作る。
  • Gem公開用の設定を書く。
  • Gemをビルドする。
  • ビルドしたGemをRubyGemsにPushする。

一度できてしまえばなんてことないですが、やはり初めて取り組んでみると妙に時間がかかってしまいました。あとどこで見かけたのか失念してしまったのですが、Gemとして公開するときは英語のドキュメントを書くのが良い。みたいなのを見かけたので日本語で書いてあったものを英語に翻訳するなどしてみました。

といっても、ほとんどがDeepL翻訳だったりもします。そして、英語になることを意識して文字を書いてると、日本語文章が途端にカタコトになり始めるという現象に襲われたりもしました。余談ですが、日本語って文法は適当に書いても、なんとなく意味通じちゃうから、文法の柔軟性すごいですよね。

公開したといっても、わからないところはたくさんあります。

わからないことはたくさんあって、例えばバージョンアップ番号の上げ方もよくわかってなかったり。0.1.2として公開してますが、実情は恐る恐る下一桁を更新してみているだけです。真ん中のバージョンを上げるタイミング全然わからないけど多分機能追加したときがいいっぽい。このへんドキュメントにも載っていそうなので再度読み直してみたいと思います。

なぜかダウンロードされている。

知名度も宣伝力も0に関わらず、公開した瞬間から少しずつダウンロードされているようです。今200ぐらい。全く使われないよりは100万倍嬉しいのですが、どうやって存在を知ったのかわからず少し怖い。でも嬉しい。みたいな気持ちです。

Gemを公開するというのが、Rubyの楽しみのひとつかも

個人的にはGem作り面白い!というのが初公開の感想で、RubyのものづくりとしてGem作るってのは全然ありだなと思います。やってみた感じ思ったより敷居は低いです。例えばRailsでWebサービスを公開するよりもお手軽に思います。

そのわりに、初めて公開したときの達成感だったり、公開後にダウンロード数がじんわり増えていく嬉しさも味わえます。

Rubyでプログラム書いている人のひとつの目標としてはGem作りはかなりおすすめです。自習でサンプルコード書いたり書籍読んだりも大切ですが、自分で作った何かを公開するっていうのはモチベーション維持にもなるんじゃないかとも思いました。

自作のRubyGemの公開準備を進めています。

タイトルの通り、現在初の自作RubyGemの製作作業を進めています。ドキュメントをもう少し書き足したら初版?としてRubyGemsに登録してみます。なにぶんはじめてなので、作法がよくわからずつまずく可能性が高めですが、無事公開できたらまた改めてこのブログで紹介する予定です。

今回はそんなRubyGemについてのお話です。

RubyGemというもの

RubyGemというのは、Rubyでプログラミング開発に使用できる、あらかじめ用意された便利なプログラム部品集のようなものです。Webアプリケーションを一から作るのは大変ですが、RubyonRaisというgemを利用すればたくさんの部品が用意されているので比較的簡単に作り上げることができる、みたいな感じです。

おそらく最も有名なgemはRubyonRails

RubyonRailsのような超有名なgemは、開発自体も実際のビジネス現場にも使われていて、RubyonRailsを扱う書籍やプログラミングスクールなどなど、教材の数もすごいです。GitHubで覗いてみると、利用者数(Users)はGitHubの登録数だけで180万人以上、開発者数も4,500人(Contributer)超います。すごすぎますね。。有名すぎるのでgemという存在を少し超越している感あります。

Gemは、誰でも利用・登録することができます。しかも無料です。

だからといって、誰しもがRubyonRailsのような超大作を登録しているわけではなく、個人製作のちょっとした便利な部品も登録、公開することができます。正確な数はわからないのですが、むしろこのような小規模の作品もかなり多いという印象です。ちなみに登録されているGemの数を見てみると、173,669。公開しているユーザーの数は171,362でした。


そして、RubyGemsに登録してなくても、自分のGemを公開していなくても、既存のGemたちは誰でも利用することができます。しかも無料です。さきほどRubyonRailsも無料で使うことができます。一方的に無料で便利な部品集を手に入れて自分のプログラム開発をすばやく進めることができるなんて、なんだか申し訳ない感じもしないでもないですが、後から請求されるわけでもないです。どんどん遠慮なく使ってOKなのです。ほとんどの場合、ソフトウェアライセンスというドキュメントにこういう使い方はOK、これはダメみたいなことが書かれています。この辺の紹介はまたの機会に。

と紹介しておいて登録していないのも説得力に欠けるので自分で登録してみることに

ここで冒頭の話に戻るのですが、誰でも登録できるということを紹介しておいて、自分で登録していないのもなんだかなあという気がしていたので、この機会にRubyGemsに登録してみよう!となったのが今回の経緯です。なにぶん手慣れてないのでこうやって公開すればいい!みたいな紹介はできないかもですが、このくらいの作業量で公開できるんだ!とか雰囲気をつかんでもらえるような感じの紹介ができればと思いますので、もうしばらくおまちください。

プログラミング用語「エスケープシーケンス」とはなんぞ?

文字列を扱うとき、そこそこお世話になってくるエスケープシーケンス。

今回はこのエスケープシーケンスの使い方を紹介します。

文字で表せない特殊な文字

以前この記事でもちらりと紹介していますが、「改行」という文字は画面上で直接表示できないので、エスケープシーケンス「\n」で表現します。

puts "ここで\n改行します"

# 結果
=> ここで
    改行します。

最近あまりみかけないような気がしますが、タブ文字という一定の間隔を空けてくれる文字は「\t」を使います。 エスケープシーケンスを使う場合は、””(ダブルクォーテーション)で囲む必要があります。

ただの文字として表示するには''(シングルクォーテーション)を使います。

じゃあ\を出すときは?

\そのものを文字として出すときは\と入力します。

puts "\\バックスラッシュです"

# 結果
=> \バックスラッシュです

じゃあ”を出すときは?

""で囲っている中に"という文字を出したい場合、\"と入力します。

puts "\"1,000\"です"

# 結果
=> "1,000"です

色々混ぜてみるとこんな感じになります。

puts "このお菓子は\n \"¥1,000円\"です"

# 結果
=> このお菓子は
   "¥1,000円"です

余談ですが、Macだと\バックスラッシュを使いますが、Windowsだと¥を使います。さきほどの例をWindowsで置き換えると

# Windows
puts "このお菓子は¥n ¥"¥¥1,000円¥"です"

# 結果
=> このお菓子は
   "¥1,000円"です

こんなふうになります。¥記号を出すために¥でエスケープしてあげる必要が出てきます。¥がいっぱいで読みづらい感じになってしまいますよね。そんな場合は以前紹介した、改行付きでみたままの文字列を変数に入れるやり方や、文字列を改行やカンマで区切るやり方など、他の手段を検討してみるといいかもしれません。

プログラミングで使う名前の付け方。なんちゃらケース4つ紹介

今回は変数名。クラス名。メソッド名など名前に使うときの規則名について紹介します。

スネークケース

単語と単語の間を_(アンダースコア)で繋げる書式です。こんな感じです。

# _でつなげるスネークケース
mail_address_form

Rubyの変数名やメソッド名はスネークケースを使う場合が多いっぽいです。

パスカルケース

単語の最初の文字を大文字にするのがパスカルケース。こんな感じです。

# 単語の最初が大文字のパスカルケース
MailAddressForm

Rubyではクラス名やモジュール名に使うこと多いっぽいです。他のプログラム言語でもクラス名に用いることが多いかも。

キャメルケース

単語の最初は小文字。以降の単語の先頭は大文字で書きます。こんな感じです。

# 最初の単語が小文字で以降はパスカルケースと同じなのがキャメルケース
mailAddressForm

最初の小文字がラクダの頭で、以降の大文字がラクダのコブみたいだからキャメルなんだとか。Rubyではあまりこの書き方はみかけないです。JavaScriptとかSwiftなんかでメソッド名で見かける書き方ですね。

ケバブケース

ケバブケースは単語の間を-(ハイフン)で繋げます。こんな感じです。

mail-address-form

ケバブは食べ物のケバブのことでハイフンで串刺しにして見えるからとかなんとか。この書き方もRubyではあまり見かけません。HTMLやCSSでよく用いられる記法かと思います。


この4つあればRubyに限らず大体の言語でも網羅できると思われるのでああこれはなんちゃらケースで書くんだな、と意識しておくとファイル名やソースコードの名前つけるときに統一感が出てくるのでいい感じです。