.save

セーブがしたいんです…

ruby silver 勉強記録 (4日目)

 

・学習内容

 

1、find_allとselect

 配列の検索。

enum.find_all {|item| block }
enum.select {|item| block }

find_allメソッドは、条件に合う要素を探して集めます。ブロック引数itemに要素を入れながらブロックを繰り返し、ブロックの戻り値が真になったときの要素を集め、配列にして返します。

selectメソッドは、find_allの別名です。

次の例は、1から30までの整数のうち7で割り切れるものを集めています。

p (1..30).select {|n| n % 7 == 0 }
[7, 14, 21, 28]

ref.xaio.jp

 

2、mapとcollect

array.map {|item| block }

mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。collectメソッドの別名です。

numbers = ["68", "65", "6C", "6C", "6F"]
p numbers.map {|item| item.to_i(16) }
[104, 101, 108, 108, 111]

ref.xaio.jp

 

3、zipとfirst

 zip

array.zip(other_array, ...)

zipメソッドは、配列の要素を引数の配列other_arrayの要素と組み合わせ、配列の配列を作成して返します。transposeメソッドで[array,other_array, ...].transposeとしたときと同じく、行と列を入れ替えます。ただし、transposeメソッドと違って足りない要素はnilで埋められ、余分な要素は捨てられます。

arr1 = [1, 2, 3]
arr2 = [4, 5]
arr3 = [6, 7, 8, 9]
p arr1.zip(arr2, arr3)
[[1, 4, 6], [2, 5, 7], [3, nil, 8]]

ref.xaio.jp

 

first

array.first
array.first(num)

firstメソッドは、配列の最初の要素を返します。配列が空のときはnilを返します。

引数numに整数を指定すると、先頭からその数だけ要素を取り出して、配列にして返します。配列が空のときは空の配列を返します。

fruits = ["apple", "orange", "banana", "kiwi"]
p fruits.first
p fruits.first(2)
"apple"
["apple", "orange"]

ref.xaio.jp

 

4、slice

array.slice(index)
array.slice(index, length)
array.slice(range)

sliceメソッドは、[]メソッドの別名です。配列から引数で指定した位置の要素を取り出して返します。
引数の指定のしかたと戻り値については、[]メソッドを参照してください。

animals = ["dog", "cat", "mouse", "rabbit", "horse"]
p animals.slice(3)
p animals.slice(1, 3)
p animals.slice(2..4)
"rabbit"
["cat", "mouse", "rabbit"]
["mouse", "rabbit", "horse"]

ref.xaio.jp

 

5、eql?

array.eql?(other_array)

eql?メソッドは、ハッシュのキーが配列であるときに、「キーとして同じかどうか」を調べるために内部的に使われるメソッドです。

レシーバarrayと引数other_arrayの各要素を順に比較して、それぞれが同じであればtrue、違いがあればfalseを返します。要素の比較には、各要素のeql?メソッドが使われます。

配列の比較には、普通はeql?メソッドを使わずに、「配列の内容が同じかどうか」を調べるには==メソッドを、「同じオブジェクトかどうか」を調べるにはequal?メソッドを使ってください。

array = [1, 2, 3]
puts array == [1.0, 2.0, 3.0]
puts array.eql?([1.0, 2.0, 3.0])
true
false

ref.xaio.jp

 

6、equal?

obj.equal?(other_obj)

equal?メソッドは、レシーバobjと引数other_objが同じオブジェクトならtrue、別のオブジェクトならfalseを返します。

Ruby 1.9 Ruby 1.9では、Objectクラスのequal?メソッドはBasicObjectクラスに移されました(この変更は、Ruby 1.8用に書いたプログラムには特に影響はありません)。

Objectクラスでは==equal?は同じメソッドの別名です。しかし、==と違ってequal?メソッドはサブクラスで上書きされず、常にオブジェクトの同一性を調べるのに使われます。自作のクラスでもequal?を上書きしないでください。

次の例では、文字列を==equal?で比較しています。Stringクラスの==は、文字列の内容が同じであればtrueを返します。equal?で比較すると、同じ内容でもオブジェクトが別ならfalseになります。

str1 = "hello"
str2 = "hello"
puts str1 == str2
puts str1.equal?(str2)
true
false

ref.xaio.jp

 

ruby silver 勉強記録 (3日目)

 毎日やるためにはルーティーンをしっかり組まないといかんと思った。

 本当にすぐにさぼってしまう。

 

学習内容

・定数のオーバーライド

 警告は出るができる。

演算子の意味

 ..と&

1、範囲式(..)

1..20で1から20

2、論理積演算子。または類似の演算を行うメソッド(&)

p( 3 & 5 ) #=> 1 ・・ 二進数で 0011 & 0101 #=> 0001

参考

Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 2.4.0)

 

・sortメソッドの使い方

「self <=> other」メソッドの場合はselfとotherを比較して、selfが大きい時に正、等しい時に0、小さい時に負の整数を返します。そこで降順に並べるように記述してみます。

参考

配列内の要素をソートする - 配列(Array)クラス - Ruby入門

 

・配列の積集合

 a & b

 配列の重複したものを取り出す。

ruby silver 勉強記録 (2日目)

使用教材

Ruby技術者認定試験合格教本 Silver/Gold対応 Ruby公式資格教科書 | 増井 雄一郎, 小川 伸一郎, 株式会社 日立ソリューションズ 牧 俊男, 一般財団法人Rubyアソシエーション 前田 修吾, CTCテクノロジー株式会社 |本 | 通販 | Amazon

 

学習内容

組み込みライブラリの配列と文字列

 

昨日の10問を解き直し

今日の分野で15問を新規に解く

 

考察

 これまでの学習から、試験の肝はメソッドの動きを覚えることにあると思った。

 普段使っているメソッドの数は知れているので、試験用にこれらを網羅的に覚える必要がある。結構しんどい。

 面白くするためには、普段使わないメソッドをあえて使って何か小さいプログラムを作ってみることもいいと思った。今のところ、いつまでにsilverを取れ!とは言われていないし。

ruby silver 勉強記録 (1日目)

勉強方法

 過去問をとく => わからないところは解説を読んで復習する

心がけること

 終わった問題でも試験日まで何回も解く

目標

 過去問1日10〜20問。

本日の記録

・マジックコメントの書き方
 coding: エンコーディング

・メソッド内と外では変数名が同じでも別の変数として扱われる。

・puts 090は通らない。090が数として存在できないから。

三項演算子 条件? true : false

・定数のオーバーライドには警告が出るが変更は可能。

MAX = 100  
puts MAX  
MAX = 1000
puts MAX

=> 1000

・引数のアスタリスク
引数にアスタリスクをつけると任意の個数の引数が渡せる。
これは配列で保存される。

 def foo(*a)
  p a
end

foo(1,2,3)
=>[1,2,3]

・変数の書き方について
ローカル:アルファベット小文字、もしくは_から始まり、1文字以上
クラス:@@で始まる
グローバル:$
インスタンス:@

deviseのrootをregistrations#newにすると、undefined method `validatable?' for nil:NilClassになる

f:id:hachijoukozima:20170402190713p:plain

deviseのrootをregistrations#newにすると、undefined method `validatable?‘ for nil:NilClassになる

原因分析

registrations#newにいきなりアクセスすると、レシーバーであるdevise_mappingが空なので、メソッドvalidatable?が機能しないのでエラーになる。

解決策

どこかのページからregistrations#newにアクセスすると普通に表示される。

やりたいこと

root画面にregistrations#newを表示させたい。

JS学習 文字が入力されるたびに検索できるようにする(インクリメンタルサーチ)

インクリメンタルサーチ学習に向けて

文字が入力されるたびに検索できるようにする

・main.js

// 入力されたものと比較される値の配列
var fruits = ['apple', 'apricot', 'avocado', 'blueberry', 'cherry', 'coconut', 'cranberry', 'dragonfruit', 'durian', 'grape', 'grapefruit', 'guava', 'kiwi fruit', 'lemon', 'lime', 'lychee', 'mango', 'melon', 'watermelon', 'miracle fruit', 'orange', 'bloodorange','clementine','mandarine','tangerine','papaya','passionfruit','peach','pear','persimmon','physalis','plum/prune','pineapple','pomegranate','raspberry','rambutan','star fruit','strawberry'];

$(function() {
// 変数listにid listの場所を代入する
  var list = $("#list");
  var preWord;
// 9,検索結果を表示するlistに追加する処理
  function appendList(word) {
    // 変数itemに<li class="list">を新規に作成し、そこに引数wordを追加する
    var item = $('<li class="list">').append(word);
    // 変数listに変数itemの中身を挿入
    list.append(item);
  }

// 5,前方一致に対応するためには、^を検索する言葉の前につける必要がある。今回は、splitで作成した配列要素の前に^をつければ前方一致ができる。配列の要素を加工した新しい配列を作成するには、map()を使用する。map()の引数に要素の頭に^をつける処理をする、関数editElementを渡す。map()によって作成された新しい配列をnewInputsという変数に入れる。
    function editElement(element) {
    var result = "^" + element;
    return result;
  }
  
// 1,#keywordにワードが入力された時の処理
  $("#keyword").on("keyup", function() {
    // 2,変数inputに、#keywordに入力された値を取得し、代入する
    var input = $("#keyword").val();
    // 3,変数inputに入った複数の文字列をsplit()で分割する。split()で空文字で区切った配列から空文字を削除している。引数のeには、配列の要素が代入されている。eに文字が代入されている場合はtrueになるので、配列に格納される。反対に空文字の場合はfalseになるので、配列には格納されない。このようにすることで、スペースが入力された時に配列の要素がすべて表示されなくなった。
    var inputs = input.split(" ").filter(function(e) { return e; });
    // 4,変数inputsに入った配列から要素を1つずつ取り出し、引数に与えられた関数の処理を行った結果から新しい配列を作る。map()は、配列から要素を1つずつ取り出し、引数に与えられた関数の処理を行った結果から新しい配列を作る。
    var newInputs = inputs.map(editElement);
    // 6,変数wordに変数newinputsの中身の要素を|でつないだ配列を代入する
    var word = newInputs.join("|");
    // 7,変数wordの中身を正規表現化したものを代入する。
    var reg = RegExp(word);
    // 8,2回目以降の検索時に前の検索結果をremove()を使って.list(検索結果を表す変数itemで作っているliのこと)を削除する
    $(".list").remove();
    // 9,変数wordと変数prewordがイコールでない場合、さらに入力されたワードが0でない場合に、配列から1つずつ取り出して変数regと比較する。マッチしたのをappendlistに加える。
    if (word != preWord && input.length !== 0) {
      $.each(fruits, function(i, fruit) {
        if (fruit.match(reg)) {
          appendList(fruit);
        }
      });

      if ($(".list").length === 0) {
        appendList("一致する果物はありませんでした");
      }
    }
    // 変数prewordに変数wordの中身を代入する。これによって次の検索の準備をする。入力されたもの=>word これと同じ値のpreword.wordが違う値になったらまた検索をスタートさせる。
    // preWord = word;
  });
});

・index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script src="main.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="style.css">
  </head>
  <body>
    <div class="form-group">
      <input type='text' id="keyword" class="form-control" placeholder="好きなフルーツを入力してください">
      <button type="button" id="submit" class="btn">検索</button>
    </div>
    <ul id="list"></ul>
  </body>
</html>