学習記録

2020-02-09に作成

個人用の学習記録。成果がなくとも毎日更新。

所有者限定モードのためこのボードには投稿できません ボードとは?

Rubyシルバーについて個人的に抑えておきたいところ
- 破壊的メソッドかどうか覚える。(例: compact, uniq, replace, chop, chomp)
- %記法の%wや正規表現の//miといった。アルファベットの意味を覚えていない。
- ソート順を記号で判定するとき、昇順になるのか降順になるのか覚えられない。
- ->はラムダ。=>はHashか例外で使う。
- ファイルオープン時のモードはaなら追記。+が書いてあれば読み書きができる。
- 定数に代入すると警告が出るが、破壊的メソッドでは生じない。
- ||と|の引っかけ問題に注意する。
- 書式の%Yと%y、%mと%Mを間違える。
- 再定義できない演算子を覚える。
- メソッドの定義の中から外のローカル変数は参照できない。


LPIC Lv1

GRUB2の設定ファイルについての疑問
パーティションの番号はどう指定すればいいのかが分からなかった。
参考にした情報によると「(GRUB2の場合は)パーティション番号は(以前のバージョンのやり方である)ゼロから、ではなく1から数え始めます。」
とのことらしい。

参考:Linuxのインストールとパッケージ管理(主題102) のコマ問について


プロを目指す人のためのRuby入門

7.10.4 演算子の挙動を独自に再定義する

演算子の中にも再定義できるものとできないものがある。

再定義できるかどうかはドキュメントを参考にする。

ここでは例としてProductクラス同士を下記のように比較できるように再定義する。

a = Product.new('A-0001')
b = Product.new('B-0002')
c = Product.new('A-0001')
a != b  #=> true
a == c  #=> true
a != 1  #=> true
class Product
  def ==(other)
    if other.is_a?(Product)
      code == other.code
    end
  end
end

補足

==はメソッドなので先頭に.をつけて呼ぶことができる。

a.==(c) #=> true

また、==が呼び出されるのは左辺のオブジェクトなので、
右辺に書いた場合はProduct#==は呼ばれない。

7.10.5 等値を判断するメソッドや演算子を理解する

等値を判定するメソッドには4種類ある。
- equal?
- ==
- eql?
- ===
このうちequal?以外は再定義が可能。


プロを目指す人のためのRuby入門

7.6 クラスの継承

DVDクラスがProductクラスを継承すると、そこにスーパークラスとサブクラスの関係が生まれる。

継承でよくある誤解として「クラスの機能を全部引き継ぐ」という考えがある。
この考えだと非常に扱いづらいクラスが出来上がるので、「性質や概念の共通点」に着目する必要がある。
こう考えるための概念として「is-aの関係」がある。
例えば、販売管理システムにおける「DVDは商品の1種である(DVD is a product)」の関係は違和感がないはず。

OOPの参考書として「オプジェクト指向設計ガイド」がある。

7.6.1 標準ライブラリの継承関係

Rubyの継承は単一継承。(ミックスインという多重継承に似た機能は8章で説明)
継承関係の頂点にはBasicObjectクラスがあるが、特殊な用途でない限りObjectクラスが頂点と考えて良い。
(Ruby1.9以前はObjectクラスが継承関係の頂点にいた。)


PHPで
stringをarrayに変える際、区切り文字がある場合はexplodeメソッド、ない場合はstr_splitメソッドを使う。


プロを目指す人のためのRuby入門

2.12.7 require

標準ライブラリやgemを利用する場合、require構文を使う。

2.12.8 load

requireとの比較
- 何度でも読み込める。
- 拡張子を省略できない。

2.12.9 require_relative

実行ディレクトリの外に読み込む対象のファイルがある場合に使う。

3.2.1 テストコードの雛形

下記のライブラリを読み込む。

require 'minitest/autorun'

クラス名とファイル名は対応しており、ファイル名はスネークケースで書く。

minitestは「test_」で始まるメソッド名を探して実行する。

ここで扱う検証メソッドは3つのみ。
- assert_equal # 引数2つが等しければパス
- assert # 真であればパス
- refute # 偽であればパス


プロを目指す人のためのRuby入門

2.10.2 and, or, not

特徴が2つある。

  1. 優先順位の低い演算子である。
t1 = true
f1 = false
!f1 || t1       #=> true
not f1 || t1    #=> false
  1. andとorは優先順位が同じなので、左から順に評価される。
t1 = true
t2 = true
f1 = false
t1 || t2 && f1  #=> true
t1 or t2 and f1 #=> false

制御フローの例(and)

Railsチュートリアルでの使用例

redirect_to root_url and return unless FILL_IN

制御フローの例(or)

def greeting(country)
  country or return '入力してください'

2.10.3 unless文

elsifに相当するものはない。
疑問: unless文の使いどころがわからない。


プロを目指す人のためのRuby入門

2.8.4 フォーマットを指定

sprintf('%0.3f', 1.2)

または下記のようにも書ける。

'%0.3f' % 1.2

複数のオブジェクトを表示したい場合、下記のように書く。

sprintf('%0.3f %0.3f', 1.2, 0.4)

または下記のようにも書ける。

'%0.3f %0.3f' % [1.2, 0.4]

2.9.4 数値クラス

10.class    #=> Integer(過去のバージョンではBignumやFixnumクラスがあったが、2.4からはIntegerクラスにまとめられた。)
1.5.class   #=> Float

複素数や有理数

irb(main):006:0> 2r.class
=> Rational
irb(main):007:0> 2i.class
=> Complex

疑問

「1.superclass」で「Numeric」が得られることを期待したが、「undefined method `superclass'」が返ってくる。

調べたこと

Ruby: How to find superclass of an object?

> 1.class.superclass
=> Numeric
> 1.class.ancestors
=> [Integer, Numeric, Comparable, Object, Kernel, BasicObject]

プロを目指す人のためのRuby入門

ファイルエンコーディングとマジックコメント

Ruby1.9以前の場合、デフォルトエンコーディングはUS-ASCIIだった。
なので日本語をUTF-8で扱う時、下記のマジックコメントが必要になった。

# encoding: shift_jis

マジックコメントはプラグマとも呼ばれる。

2.2.1

nilや正規表現などの値は全てオブジェクトでto_sなどのメソッドを呼ぶことができる。

2.2.2

メソッドの括弧は省略できる。

2.2.3

文の区切りは改行かセミコロン、バックスラッシュ、( で表す。

2.2.4 コメント

=begin と =endで囲んでコメントを書ける。

2.2.7 リテラル

ソースコードの123や””と言った記述はリテラルという。

2.2.8

変数名はスネークケースで書く。

多重代入の使用を避ける。

c, d = 10
d #=> nil

=を複数回使うことも避ける。

a = b = 100

2.3.1 シングルクォートとダブルクォート

ダブルの場合、エスケープシーケンスを改行文字などのように解釈する。


黒田 努. Ruby on Rails 6 実践ガイド

つまずいた点

3.5.5節
ブラウザで「http://example.com:3000/」を確認したところ、エラーで"add the following to your environment configuration"が表示された。

原因

blocked_hosts.rbファイルの置き場所が間違っており、/app/configでなく/app/assets/configに配置していた。


学んだこと

phpを対話形式で動かしていたところ、「echo false」は何も表示されないことに気づいた。

$ php -a
> echo true;
1
> echo false;

Coursera Week4 machine-learning

つまずいた点

all_theta(c, :)と書くべきところ、all_theta(c)と書いてしまった。

matrix(c, :)

c行の列を全て取得する。

matrix(c)

a=[1 2 3;4 5 6]
a =

1 2 3
4 5 6

octave:11> a(1)
ans = 1
octave:12> a(2)
ans = 4
octave:13> a(3)
ans = 2
octave:14> a(4)
ans = 5


PHP
- password_hash()、 password_verify() というパスワード用の関数がある。
- 任意精度数値での除算はbcdivを使う。無ければ、floorやnumber_formatなど他の関数を使う。https://stackoverflow.com/questions/9944001/delete-digits-after-two-decimal-points-without-rounding-the-value/9944052


LPIC対策

調べたこと

リダイレクトでアンドマーク'&'がやっていること

ポイント

  • コマンドは左から実行される
  • 「&1」は lsの標準出力先をコピーしているという意味らしい。

あずき本

11.4 DNSの設定

DNSサーバの役割はホストとIPアドレスを相互に変換すること。
これを名前解決という。
ホスト名からIPを求めることを正引き、その逆を逆引きという。

/etc/resolv.conf

参照先のDNSサーバを設定する。

/etc/nsswitch.conf

問い合わせる順番を設定する。files(/etc/hostsファイル)、dns、ldapのように書く。

getent hostsコマンド

ホスト名の一覧を取得。

/etc/systemd/resolved.conf

systemdを採用したディストリビューションでは名前解決をsystemd-resolvedサービスで行う。

サービスを有効にするコマンド
$ systemctl restart systemd-resolved.service

/etc/systemd/resolved.conf

参照先のDNSサーバを記述する。

hostコマンド

名前解決の問い合わせをする。

digコマンド

DNSへ問い合わせ、登録されている情報を詳細に表示する。