メインコンテンツまでスキップ

「Ruby」タグの記事が8件件あります

全てのタグを見る

rbenv (WSL2 / Ubuntu) へのインストール方法

· 約1分
ひかり
Main bloger

依存パッケージのインストール

sudo apt update
sudo apt install autoconf patch build-essential rustc libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev -y

rbenv のインストール

# rbenv と ruby-build をインストール
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash

# 起動時に rbenv を読み込み
echo 'eval "$($HOME/.rbenv/bin/rbenv init - bash)"' | tee -a ~/.bashrc

参考

Ruby 3.3.0 のインストール

source ~/.bashrc     # rbenv を初期化 (WSL 再ログインでも可)
rbenv install 3.3.0 # Ruby 3.3.0 のインストール
rbenv global 3.3.0 # Ruby 3.3.0 を規定に設定

参考

自作 gem の作り方

· 約4分
ひかり
Main bloger

gem を作成 (bundle gem)

gem_name という gem のテンプレートを作成する場合は以下を実行します。

bundle gem gem_name

bundle gem のオプション

bundle gem にはオプションが存在します。

詳細またはその他のオプションを知りたい場合は Bundler: bundle gem を参照してください。

オプション説明
--exe, -b, --bingem にバイナリ実行ファイルを含めます。
--extgem に C 拡張を含めます。
--mitプロジェクトを MIT ライセンスにします。
--cici サービスを設定します。
--linterリンターとフォーマッターを指定します。

例: リンターに rubocop を使用し、MIT ライセンスでコマンドを含み、C 言語拡張を含む myapp という gem を作成する場合

bundle gem myapp --exe --ext --mit --ci=github --linter=rubocop

プロジェクトの構造

上記コマンドで生成したプロジェクトの構造は以下のようになっています。

myapp
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── exe
│   └── myapp
├── ext
│   └── myapp
│   ├── extconf.rb
│   ├── myapp.c
│   └── myapp.h
├── lib
│   ├── myapp
│   │   └── version.rb
│   └── myapp.rb
├── myapp.gemspec
└── sig
└── myapp.rbs

各ディレクトリーは以下のようになっています。

  • lib/: ライブラリーのコード (require で呼び出される)
  • ext/: C 言語のソースコード (インストール時にコンパイルされ、require で呼び出される)
  • exe/: コマンドがある

myapp.gemspec がもっとも重要なファイルで、gem の構成が定義されています。 基本的に上記 3 つのディレクトリー (C 言語を使用しない場合は、2 つのディレクトリー) の中にあるファイルと gemspec ファイルを編集します。(必要に応じて Rakefile や README.md も編集します。)

Gemfile は編集しないでください。

gemspec の編集

gem を作るために myapp.gemspec を編集する必要があります。

TODO のある行やホームページの行をコメントアウトし、spec.summary の設定を行えば最低限動作します。

必須である項目を以下に示します。

  • spec.name
  • spec.version
  • spec.authors
  • spec.summary

bundle install コマンドを実行し、エラーがなければ問題ありません。

依存パッケージの追加

gemspec に以下のように追記して依存している gem を追加できます。

  spec.add_dependency "example-gem", "~> 1.0"

gemspec に以下のように追記し開発時に必要な gem を追加できます。

  spec.add_development_dependency "example-gem", "~> 1.0"

詳しくは、class Gem::Specification (Ruby 3.1) リファレンスマニュアルlibrary rubygems (Ruby 3.1 リファレンスマニュアル) を参照してください。

bundle install

bundle install を実行することで、Gemfile および gemspec に記述されている gem がインストールされます。

バージョンの変更

バージョンは、lib/myapp/version.rb に定義されています。

コンパイル

以下のコマンドを実行し、C 拡張をコンパイルします。 このコマンドの実行により、共有ライブラリー lib/myapp/myapp.so が生成されます。

rake compile

コンパイル後、gem に含まれるコマンド実行すると、 エラーなく実行されます。

bundle exec myapp

C 拡張

C 言語で Ruby を拡張することができます。

たとえば、/etc/myapp/myapp.c を以下のように変更します。

void
Init_myapp(void)
{
rb_mMyapp = rb_define_module("Myapp");
+ rb_p(rb_str_new2("Hello, world!"));
}

rake compile でコンパイルを行い、bundle exec myapp を実行すると、"Hello, world!" と表示されます。

この例は、C 言語から Ruby の C API を呼び出し表示するプログラムで、

p "Hello, world!"

と同等です。

Ruby の C API だけではなく、コンピューターにインストールされている共有ライブラリーを扱うことができるため、ラッパーを作成することが可能です。

また、C 拡張により計算が必要な場合に高速化することができます。

ライブラリーの作成

lib/myapp.rb あたりを編集。

新しいファイルを作成した場合は、git add する必要があります。

gem をインストール (rake install)

プロジェクト内の gem がインストールされます。

rake install

gem を公開 (rake release)

gem を公開するには、rubygems のアカウントを作成する必要があります。 リリースするたびに、バージョンを変更する必要があります。

rake release

gem パッケージを生成 (rake build)

プロジェクトから pkg/myapp-x.x.x.gem が作成されます。

rake build

Webrick で rbenv 経由でインストールした Ruby の CGI が動かない場合の対処法

· 約1分
ひかり
Main bloger

ブラウザで CGI を実行すると、 /usr/bin/env: 'ruby': No such file or directory とエラーが出る

#!/usr/bin/env ruby

# ...

原因

$PATH が設定されていない。

#!/usr/bin/env bash

echo -ne "Content-type: text/html\n\n"
echo $PATH

とすると、

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 

と表示され、Ruby のあるディレクトリーがないことがわかる。

対処法

:CGIPathEnv で Ruby のパスを設定する。

srv = WEBrick::HTTPServer.new({
:DocumentRoot => "./site/",
:Port => 8080,
:CGIPathEnv => ENV["PATH"]
})

gem 作り方

· 約1分
ひかり
Main bloger

テンプレートの作成

bundle gem <GEM 名> -t
cd <GEM 名>

Gemspec の編集

  1. <GEM 名>.gemspec を開く。
  2. spec.summaryspec.descriptionspec.homepage、 を編集する
  3. spec.metadata["allowed_push_host"] にホームページの URL を記述
  4. spec.homepage に Gem のページを記述
  5. spec.metadata["source_code_uri"] にリポジトリの URL を記述
  6. spec.metadata["changelog_uri"]changelog.md の URL を記述

最低限このくらい設定する。

GitHub に push しインストール

git init
git add .
git commit -mFirst\ Commit
git remote add origin [email protected]:<ユーザー名>/<GEM 名>.git
git push -u origin master

インストール

gem install specific_instal
gem specific_install -l "git://github.com/<ユーザー名>/<GEM 名>.git"

Gemfile

gem "<GEM 名>", github: "<ユーザー名>/<GEM 名>.git", branch: :main

Numo::NArray でドット積

· 約1分
ひかり
Main bloger
require "numo/narray"

実数ベクトルのドット積

a = Numo::NArray[4, -1, 2]
b = [2, -2, -1]
c = a.dot b
8

複素数ベクトルのドット積

a = Numo::NArray[1+1i, 1-1i, -1+1i, -1-1i]
b = [3-4i, 6-2i, 1+2i, 4+3i]
c = a.conj.dot b
(1.0-5.0i)

複素数とそれ自身のドット積

d = a.conj.dot a
(8.0+0.0i)

行列のドット積

a = Numo::NArray[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]
c = (a * b).sum(0)
Numo::Int64#shape=[3]
[54, 57, 54]

行ベクトルとしてドット積を求める

c = Numo::NArray[(a * b).sum(1)].transpose
Numo::Int64(view)#shape=[3,1]
[[46],
[73],
[46]]

Ruby の作り方

· 約1分
ひかり
Main bloger

例として3を返すプログラムを作る。

まず、C でソースコードを書く。

// three.c
#include <ruby.h>

static VALUE int_three(void){
return INT2NUM(3);
}

void Init_three(void){
rb_define_singleton_method(rb_cInteger, "three", int_three, 0);
}

Makefile を作成するための スクリプトを作成。

# extconf.rb
require 'mkmf'
create_makefile "three"

Make

$ make

作成したプログラムを呼び出す Ruby スクリプトを書く。

# main.rb
require "./three"
p Integer.three

実行

$ ruby main.rb
3