やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

「はじめに」「コマンド」を読む

 コマンドは色々あって奥が深そう。

情報源

気になった所をピックアップ

 これまで学習してきたことの繰り返し。

コマンド 概要
erb 埋め込みRuby処理ツール。テンプレートエンジン。
gem Rubyのパッケージ管理ツール。
irb Ruby の対話インタフェース。REPL。
rake Ruby の内部 DSL で記述するビルドツール。タスクツール。
rdoc Ruby のソースファイルからドキュメントを生成するツール。
ri RDoc で書かれた Ruby のドキュメントをコマンドラインから閲覧するツール。
ruby Ruby 本体。

erb

 テンプレート用言語。

用語 概要
eRuby 任意のテキストファイルに Ruby スクリプトを埋め込む書式の仕様
eruby 前田修吾さん作のeRubyの C による実装
ERB 関将俊さん作のeRubyRuby による実装
ERb ERBが標準添付になる前のバージョン (ERb と ERbLight があった)
Erubis ERBの高速化と高機能化のために開発された
Erubi Erubisからフォークされた。さらなる高速化と機能削ぎ落とし。

 eRubyが仕様としての正式名称らしい。その処理系としてERBが標準っぽい。Rubyをインストールすると一緒に入る。Ruby on RailsではErubiが使われているようだ。

ERBを触ってみる

a.erb

<ul>
% [1,2,3].each do |i|
  <li><%=i%></li>
% end
</ul>
erb a.erb
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>

rake

 ビルドツール。テスト、gem化、圧縮ファイル化、rdoc生成の処理をコーディングする。rakeを読めばいいのだろうが大変そう。ざっとみた感じ、ビルドツールというよりタスクツールにみえる。

Rails5からrakeタスクがrailsコマンドに統一された。

 Ruby on Railsでは別コマンドらしい。マジかよ。

 ていうか、RubyというだけでRailsの情報しか出てこない。辟易とする。まだRails触ったことないのに。

触ってみる

 テストを自動化してみる。

 rakefileだけ抜粋する。

require 'rake/testtask'
require 'rake/clean'
task :default => [:test]
desc 'Run test_unit based test'
Rake::TestTask.new do |t|
  t.libs << "test"
  t.test_files = Dir["../test/**/test_*.rb"]
  t.verbose = true
end

ri

 Rubyのマニュアル。

$ ri

Enter the method name you want to look up.
You can use tab to autocomplete.
Enter a blank line to exit.

>> 
検索するメソッド名を入力します。
タブを使用してオートコンプリートできます。
空白行を入力して終了します。

 いや、まずどんなクラスやメソッドがあるかを知りたいんですけど? その一覧はできなんですか? あと構文の説明が最初にほしいんですけど? ないの?

>> syntax
Nothing known about .syntax

 構文の説明はないっぽいね。APIリファレンスみたいな感じなのかな?

>> class
= .class

(from ruby core)
=== Implementation from Kernel
------------------------------------------------------------------------
  obj.class    -> class

------------------------------------------------------------------------

Returns the class of obj. This method must always be called with
an explicit receiver, as #class is also a reserved word in Ruby.

  1.class      #=> Integer
  self.class   #=> Object


(from ruby core)
=== Implementation from PredefinedKey
------------------------------------------------------------------------
  class()

------------------------------------------------------------------------

Fake #class method for Registry#open, Registry#create

 qで戻る。jで下、dで上へスクロール。vim系の操作方法。

 大文字でClassとやるとclassメソッドでなくClassクラスの説明になったっぽい。Classクラスなんて存在するのか知らんけど。

>> Class
= Class < Module

(from ruby core)
------------------------------------------------------------------------

Extends any Class to include
json_creatable? method.

Classes in Ruby are first-class objects---each is an instance of class
Class.

Typically, you create a new class by using:

  class Name
   # some code describing the class behavior
  end

When a new class is created, an object of type Class is initialized and
assigned to a global constant (Name in this case).

When Name.new is called to create a new object, the #new method in Class
is run by default. This can be demonstrated by overriding #new in Class:

  class Class
    alias old_new new
    def new(*args)
      print "Creating a new ", self.name, "\n"
      old_new(*args)
    end
  end

  class Name
  end

  n = Name.new

produces:

  Creating a new Name

Classes, modules, and objects are interrelated. In the diagram that
follows, the vertical arrows represent inheritance, and the parentheses
metaclasses. All metaclasses are instances of the class `Class'.
                           +---------+             +-...
                           |         |             |
           BasicObject-----|-->(BasicObject)-------|-...
               ^           |         ^             |
               |           |         |             |
            Object---------|----->(Object)---------|-...
               ^           |         ^             |
               |           |         |             |
               +-------+   |         +--------+    |
               |       |   |         |        |    |
               |    Module-|---------|--->(Module)-|-...
               |       ^   |         |        ^    |
               |       |   |         |        |    |
               |     Class-|---------|---->(Class)-|-...
               |       ^   |         |        ^    |
               |       +---+         |        +----+
               |                     |
  obj--->OtherClass---------->(OtherClass)-----------...
------------------------------------------------------------------------
= Class methods:

  new

= Instance methods:

  allocate, inherited, json_creatable?, new, superclass

 BasicObject, Object, Module, Classというキーワードが出てきた。あと、コンテナとしてArrayHashがある。そのあたりを読んでおけばいいんじゃないかな? とくにArrayはかなり参考になった。

ri -h

ログ

Usage: ri [options] [name ...]

Where name can be:

  Class | Module | Module::Class

  Class::method | Class#method | Class.method | method

  gem_name: | gem_name:README | gem_name:History

All class names may be abbreviated to their minimum unambiguous form.
If a name is ambiguous, all valid options will be listed.

A '.' matches either class or instance methods, while #method
matches only instance and ::method matches only class methods.

README and other files may be displayed by prefixing them with the gem name
they're contained in.  If the gem name is followed by a ':' all files in the
gem will be shown.  The file name extension may be omitted where it is
unambiguous.

For example:

    ri Fil
    ri File
    ri File.new
    ri zip
    ri rdoc:README

Note that shell quoting or escaping may be required for method names
containing punctuation:

    ri 'Array.[]'
    ri compact\!

To see the default directories ri will search, run:

    ri --list-doc-dirs

Specifying the --system, --site, --home, --gems, or --doc-dir options
will limit ri to searching only the specified directories.

ri options may be set in the RI environment variable.

The ri pager can be set with the RI_PAGER environment variable
or the PAGER environment variable.

Options:

    -i, --[no-]interactive           In interactive mode you can repeatedly
                                     look up methods with autocomplete.

    -a, --[no-]all                   Show all documentation for a class or
                                     module.

    -l, --[no-]list                  List classes ri knows about.

        --[no-]pager                 Send output to a pager,
                                     rather than directly to stdout.

    -T                               Synonym for --no-pager.

    -w, --width=WIDTH                Set the width of the output.

        --server[=PORT]              Run RDoc server on the given port.
                                     The default port is 8214.

    -f, --format=NAME                Use the selected formatter.  The default
                                     formatter is bs for paged output and ansi
                                     otherwise.  Valid formatters are:
                                     ansi, bs, markdown, rdoc.

    -h, --help                       Show help and exit.

    -v, --version                    Output version information and exit.

Data source options:

        --[no-]list-doc-dirs         List the directories from which ri will
                                     source documentation on stdout and exit.

    -d, --doc-dir=DIRNAME            List of directories from which to source
                                     documentation in addition to the standard
                                     directories.  May be repeated.

        --no-standard-docs           Do not include documentation from
                                     the Ruby standard library, site_lib,
                                     installed gems, or ~/.rdoc.
                                     Use with --doc-dir.

        --[no-]system                Include documentation from Ruby's
                                     standard library.  Defaults to true.

        --[no-]site                  Include documentation from libraries
                                     installed in site_lib.
                                     Defaults to true.

        --[no-]gems                  Include documentation from RubyGems.
                                     Defaults to true.

        --[no-]home                  Include documentation stored in ~/.rdoc.
                                     Defaults to true.

Debug options:

        --[no-]profile               Run with the ruby profiler.

        --dump=CACHE                 Dump data from an ri cache or data file.

ri -l

 引数の一覧。これだよ、これが欲しかったんだ!

Classes and Modules known to ri:

ACL
ACL::ACLEntry
ACL::ACLList
ARGF
Abbrev
Addrinfo
ArgumentError
Array
Base64
BasicObject
BasicSocket
Benchmark
Benchmark::Tms
BigDecimal
BigMath
Binding
Bundler
CGI
CGI::Cookie
CGI::Escape
CGI::HTML3
CGI::HTML4
CGI::HTML4Fr
CGI::HTML4Tr
CGI::HTML5
CGI::HtmlExtension
CGI::InvalidEncoding
CGI::QueryExtension
CGI::Session
:

ri -f markdown

ri -f markdown Class

 見出しが#になる程度だった。

所感

 コマンドについては流し読みする。細かく使いこなそうとするのはずっと後でいい。というか、その必要性が出てからでいい。「何ができるのか」だけ把握しておけばいい。「これは便利」と思えたらよしとする。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux