- 投稿日:2020-11-27T22:30:29+09:00
pythonによるスクレイピング&機械学習をtensorflow2で動かしてみた
前提条件
対象
この記事は、Webエンジニア向けです。
私自身Webプログラマでして、機械学習を仕事に活かせないかと考えるために勉強しつつ書いたものになります。
それと、「pythonによるスクレイピング&機械学習」に沿って書くので、本の補足のつもりでみてください。環境
・PC : Macbook pro
・OS : Catalina(10.15.7)
・言語 : python2.7.16
・エディタ : jupyter(せっかくなので使いましょう、便利です)
pythonやライブラリのインストールは、つまづいた記憶もないのでここでは省きます。お願い
あなたに感想や要望を書いて頂けると主が喜びます。ぜひ気軽にコメントしていってください。
もっとシンプルな方法があれば教えてください。レッツ機械学習
tensorflow2(以下、tf2)の便利技
基本的にtf2は、無印の動作もできます
sess = tf.compat.v1.Session() sess.run(tf.global_variables_initializer())本をよみながら、うまくtf2の書き方にできない時は、これで誤魔化しましょう
5-4をtf2でやってみる
src/ch5/placeholder1.pyをtf2化
著作権上元コードは乗せてませんimport tensorflow as tf #メソッドで制御 #noneを指定してあげると、配列が可変となる @tf.function(input_signature=[tf.TensorSpec([None], tf.int32)]) def hoge(a): b = tf.constant(2) return a * b #.numpy()で数字の部分だけとれる print( hoge(tf.constant([1,2,3])).numpy() ) print( hoge(tf.constant([10,20,30])) )結果
[2 4 6] tf.Tensor([20 40 60], shape=(3,), dtype=int32)簡単な解説
このメソッド自体は
元のコードでは、メソッドではなくsession.runで動作してます。
tf2ではsessionは使わなくてよくなったので、シンプルに作れます。まず、元のコードではrun時に値を代入していますが、私はメソッドに引数を渡して、動作させてます。
@tf.function(input_signature=[tf.TensorSpec([None], tf.int32)])
この定義により引数の型を決めています。もちろん複数定義もできます。その後は、元コードと同じように配列の掛け算を行って表示してます。
まとめ
短いですが、tf2のさわりはこんな感じです。
1.sessionは必要ない
2.メソッドを作りやすくなった
それ以外にももちろん機械学習において便利になった点もあるので、
この本を元に今後アップしていけたらと思います。ありがとうございました。
- 投稿日:2020-11-27T20:38:05+09:00
[自分用メモ]Karabiner-ElementsでMajestouch StingrayをMac風キーボードにする
- 投稿日:2020-11-27T18:46:25+09:00
README.org
第10回 <2020-11-30 月>
フィボナッチ
- LINK -> 第10回(1)
第9回 <2020-11-18 水>
assert_equal
- LINK -> 第9回
第8回 <2020-11-11 水>
条件分岐
- LINK -> 第8回
第7回 <2020-11-04 水>
条件分岐
- LINK -> 第7回
第6回 <2020-10-28 水>
変数とかメソッドとか
- LINK -> 第6回
第5回 <2020-10-21 水>
第1回目から第4回目までは環境構築だったり、gitだったりでした。今回の第5回からようやく本格スタート
README_links <2020-10-14 水>
equation <2020-10-28 水>
$$\frac{1}{4}$$
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/README.org
- 投稿日:2020-11-27T18:37:44+09:00
第8回
Rake
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
自動化
rake とは?
make とかのRuby版。Rakefile の記述に沿って、自動で処理を行ってくれる。うん、単純。講義で扱った例を見てみる。
task :default do system 'rake -T' exit end desc 'hello NAME' task :hello do name = ARGV[1] puts "Hello #{name}!" exit end意味解説
上記例を読み解いていく。まず、これの実行は
$ rakeすると、このような出力を得る。
rake hello # hello NAMEこれは、引数なしで実行した時の動作(default)が
rake -T
を実行するようにRakefileで記述されているからである。rake -T
はRakefileに記述されているタスク一覧を表示するコマンドである。詳しい記述法は以下である。
- descの後にはrake -Tとした時の説明文(description)
- :defaultはrakeが引数なしで呼ばれた時の動作
- それ以外はoptionで呼ばれるtaskの名前
- taskの中には標準のruby言語で,動作を記述
いざ、実践!
desc 'git push' task :push do ["git pull origin main", "git add -A", "git commit -m \'hoge\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endかなり罪深い。gitの一連の流れを自動化してしまった。コミットのコメントなんて、毎回同じやし。まぁいいか。本番環境ではダメ、ゼッタイ。いや、こうしよう。
desc 'git push' task :push do com = ARGV[1] ["git pull origin main", "git add -A", "git commit -m \'"+com+"\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endこれによって、
rake push "mod"としたらコミットメッセージも変更できる。便利。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no8.org
- 投稿日:2020-11-27T18:37:44+09:00
第8回、Rakeで作業自動化
Rake
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
自動化
rake とは?
make とかのRuby版。Rakefile の記述に沿って、自動で処理を行ってくれる。うん、単純。講義で扱った例を見てみる。
task :default do system 'rake -T' exit end desc 'hello NAME' task :hello do name = ARGV[1] puts "Hello #{name}!" exit end意味解説
上記例を読み解いていく。まず、これの実行は
$ rakeすると、このような出力を得る。
rake hello # hello NAMEこれは、引数なしで実行した時の動作(default)が
rake -T
を実行するようにRakefileで記述されているからである。rake -T
はRakefileに記述されているタスク一覧を表示するコマンドである。詳しい記述法は以下である。
- descの後にはrake -Tとした時の説明文(description)
- :defaultはrakeが引数なしで呼ばれた時の動作
- それ以外はoptionで呼ばれるtaskの名前
- taskの中には標準のruby言語で,動作を記述
いざ、実践!
desc 'git push' task :push do ["git pull origin main", "git add -A", "git commit -m \'hoge\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endかなり罪深い。gitの一連の流れを自動化してしまった。コミットのコメントなんて、毎回同じやし。まぁいいか。本番環境ではダメ、ゼッタイ。いや、こうしよう。
desc 'git push' task :push do com = ARGV[1] ["git pull origin main", "git add -A", "git commit -m \'"+com+"\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endこれによって、
rake push "mod"としたらコミットメッセージも変更できる。便利。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no8.org
- 投稿日:2020-11-27T18:37:41+09:00
第7回
条件分岐
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
if-elsif-else-end
お題
閏年の判定。テストする年は
2004, 1999, 1900, 2000
この4つで。Ruby での条件分岐
Ruby のリファレンシャルマニュアルにはこう書かれている。
if 式 [then] 式 ... [elsif 式 [then] 式 ... ] ... [else 式 ... ] end[]は省略可能を意味する。注意すべきは
else if
でなくelif
でもなくelsif
であることくらいで、そんなに目新しいことはない。then
も省略できるし簡単そう。けど上のマニュアルの記述はわかりずらいので例を出していく.類題を解く
- 2004年は?
A. 閏年である。4で割り切れるから。その条件分岐を書くには?
p year = ARGV[0].to_i if year % 4 == 0 p true end上のコードは実行時に引数を受け取って実行すると、引数をIntegerに変換して4で割った余りが0かどうかを判断して、そうであれば
true
を返す。
- 1999 はfalse
p year = ARGV[0].to_i if year % 4 == 0 p true else p false end簡単!
- 1900年は?
A. Not 閏年。100で割り切れるから。
p year = ARGV[0].to_i if year % 100 == 0 p false elsif year % 4 == 0 p true else p false end
- 2000年は?
A. 閏年。400で割り切れるから。
p year = ARGV[0].to_i if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false endテストするのに引数だと面倒臭い
配列に年を入れてループで回す。
[1900,2004,1999,2000].each do |year| p year if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end endメソッド化しよう
def leap?(year) if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end end [1900,2004,1999,2000].each do |year| p year leap?(year) endぽいことになってきたー。
case
case を使うと綺麗になる?
さっきも出てきた、リファレンシャルマニュアルをみると、こう書かれている。
case [式] [when 式 [, 式] ...[, `*' 式] [then] 式..].. [when `*' 式 [then] 式..].. [else 式..] endこれはわかりずらい。マニュアルにある例を借りてくるとわかりやすい。
case age when 0 .. 2 "baby" when 3 .. 6 "little child" when 7 .. 12 "child" when 13 .. 18 "youth" else "adult" endこれを使ってさっきの閏年の判定を綺麗にしよう。
def leap?(year) return case when year % 400 ==0 true when year % 100 ==0 false when year % 4 ==0 true else false end end [1900,2004,1999,2000].each do |year| p year leap?(year) end実行結果の確認。
$ ruby leap_year.rb 1900 false 2004 true 1999 false 2000 trueおおーいい感じ。以上。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no7.org
- 投稿日:2020-11-27T18:37:41+09:00
第7回、Rubyの条件分岐
条件分岐
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
if-elsif-else-end
お題
閏年の判定。テストする年は
2004, 1999, 1900, 2000
この4つで。Ruby での条件分岐
Ruby のリファレンシャルマニュアルにはこう書かれている。
if 式 [then] 式 ... [elsif 式 [then] 式 ... ] ... [else 式 ... ] end[]は省略可能を意味する。注意すべきは
else if
でなくelif
でもなくelsif
であることくらいで、そんなに目新しいことはない。then
も省略できるし簡単そう。けど上のマニュアルの記述はわかりずらいので例を出していく.類題を解く
- 2004年は?
A. 閏年である。4で割り切れるから。その条件分岐を書くには?
p year = ARGV[0].to_i if year % 4 == 0 p true end上のコードは実行時に引数を受け取って実行すると、引数をIntegerに変換して4で割った余りが0かどうかを判断して、そうであれば
true
を返す。
- 1999 はfalse
p year = ARGV[0].to_i if year % 4 == 0 p true else p false end簡単!
- 1900年は?
A. Not 閏年。100で割り切れるから。
p year = ARGV[0].to_i if year % 100 == 0 p false elsif year % 4 == 0 p true else p false end
- 2000年は?
A. 閏年。400で割り切れるから。
p year = ARGV[0].to_i if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false endテストするのに引数だと面倒臭い
配列に年を入れてループで回す。
[1900,2004,1999,2000].each do |year| p year if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end endメソッド化しよう
def leap?(year) if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end end [1900,2004,1999,2000].each do |year| p year leap?(year) endぽいことになってきたー。
case
case を使うと綺麗になる?
さっきも出てきた、リファレンシャルマニュアルをみると、こう書かれている。
case [式] [when 式 [, 式] ...[, `*' 式] [then] 式..].. [when `*' 式 [then] 式..].. [else 式..] endこれはわかりずらい。マニュアルにある例を借りてくるとわかりやすい。
case age when 0 .. 2 "baby" when 3 .. 6 "little child" when 7 .. 12 "child" when 13 .. 18 "youth" else "adult" endこれを使ってさっきの閏年の判定を綺麗にしよう。
def leap?(year) return case when year % 400 ==0 true when year % 100 ==0 false when year % 4 ==0 true else false end end [1900,2004,1999,2000].each do |year| p year leap?(year) end実行結果の確認。
$ ruby leap_year.rb 1900 false 2004 true 1999 false 2000 trueおおーいい感じ。以上。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no7.org
- 投稿日:2020-11-27T18:37:39+09:00
第6回
変数とメソッド
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
変数(variable)
お題
受け取った引数ARGV[0]をnameという変数に代入してそれを出力する
RudyRuby での変数
ruby には型宣言の必要がなく、いい感じに型を決めてくれる。代入はいつものようにできる。
name = 'Rudy'類題を解く
- name に代入して Ruby と出力
name = 'Ruby' puts "hello #{name}."
- ARGV[0] を受け取って, 自分の名前を返す。
name = ARGV[0] puts "hello #{name}."メソッド(method)
お題
$ ruby hello\_method.rb RudyHell Rudy.となる hello method を作る。
Ruby のmethod
Ruby での関数は method を定義する。method は 0 個以上の引数を受け取ることができる。例として、以下。
def hello(name) p name end類題を解く
def hello(name) p "hello #{name}" end name = ARGV[0] hello(name)おまけ
最終はこうした。
def hello(name) puts "hello #{name}" end def gets_name name = ARGV[0] if name == nil puts "What\'s your name? " name = gets.chomp end return name end hello gets_name
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no6.org
- 投稿日:2020-11-27T18:37:39+09:00
第6回、Rubyの変数とメソッド
変数とメソッド
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
変数(variable)
お題
受け取った引数ARGV[0]をnameという変数に代入してそれを出力する
RudyRuby での変数
ruby には型宣言の必要がなく、いい感じに型を決めてくれる。代入はいつものようにできる。
name = 'Rudy'類題を解く
- name に代入して Ruby と出力
name = 'Ruby' puts "hello #{name}."
- ARGV[0] を受け取って, 自分の名前を返す。
name = ARGV[0] puts "hello #{name}."メソッド(method)
お題
$ ruby hello\_method.rb RudyHell Rudy.となる hello method を作る。
Ruby のmethod
Ruby での関数は method を定義する。method は 0 個以上の引数を受け取ることができる。例として、以下。
def hello(name) p name end類題を解く
def hello(name) p "hello #{name}" end name = ARGV[0] hello(name)おまけ
最終はこうした。
def hello(name) puts "hello #{name}" end def gets_name name = ARGV[0] if name == nil puts "What\'s your name? " name = gets.chomp end return name end hello gets_name
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no6.org
- 投稿日:2020-11-27T18:37:37+09:00
第5回
Ruby で標準出力
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
puts hello_world
お題
Hello world.これを出力してみる
Ruby の文字出力
method 使いどき 基本はこれ、改行はセルフ puts まぁ普通に使う、改行は自動 p これは debug で使うらしい。 pp pのpretty print で,require 'pp' が必要らしい。 printf C のこれも使える。formatを指定できるから便利な時もある。 やってみよ
- puts
puts 'hello world'をファイル
puts_hello_world.rb
に記述して$ ruby puts_hello_world.rbでた。
hello world類題
- pとかprintとか
# coding: utf-8 # start here for print, p and pp # print は改行なしで文字列が出力される。 print 'hello world' # p は改行込みで出力されるが、文字列はダブルクォーテーションで囲まれる p 'hello world' ## pp も p と見かけは同じである。 pp 'hello world'gets もあるけど今回はARGV[0]
お題
$ ruby hello_name.rb Rudyこのコマンドに対して
Hello Rudy.と出力されるようにする。
Ruby の文字入力
まぁ順当にいけばputsしたしgetsだけど、この講義はCLIの引数から拾ってくる。ファイル
hello_name.rb
に以下を記述してputs ARGV[0]からのコマンド
$ ruby hello_name.rb Rudy出る。
Rubyこの辺はまぁ普通かな。
Hello Rudy.
とさせるのはいろんな方法があって、
puts puts "Hello " + ARGV[0] puts puts "Hello #{ARGV[0]}" print "Hello #{ARGV[0]}\n" print "Hello " + ARGV[0] + "\n" だそうです。
やってみよ
これを用いてさっきの
hello_name.rb
を書き換える。puts "hello #{ARGV[0]}."それから
$ ruby hello_name.rb Rudy出る。
hello Ruby.リダイレクト(redirect)
標準出力をファイルに書き込む
Bash等にはファイルディスクリプタを変更する機能が備わっている。まぁゆうたら標準出力をターミナル画面に表示するんじゃなくてファイルに書き込める。
# ruby hello_name.rb bob > hello_name.txtってやったら、~hello_name.txt~ に出力結果が出力される(追記じゃなくて上書き)
# cat hello_name.txtをしてみると中身を見れる。
hello bob.ちなみにファイル最後尾に追記したいときは
# ruby hello_name.rb bob >> hello_name.txtみたいに
>>
ってする。両方とも、ファイルが無かったら新規に作成してくれる。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_1.org
- 投稿日:2020-11-27T18:37:37+09:00
第5回、Rubyに触れる
Ruby で標準出力
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
puts hello_world
お題
Hello world.これを出力してみる
Ruby の文字出力
method 使いどき 基本はこれ、改行はセルフ puts まぁ普通に使う、改行は自動 p これは debug で使うらしい。 pp pのpretty print で,require 'pp' が必要らしい。 printf C のこれも使える。formatを指定できるから便利な時もある。 やってみよ
- puts
puts 'hello world'をファイル
puts_hello_world.rb
に記述して$ ruby puts_hello_world.rbでた。
hello world類題
- pとかprintとか
# coding: utf-8 # start here for print, p and pp # print は改行なしで文字列が出力される。 print 'hello world' # p は改行込みで出力されるが、文字列はダブルクォーテーションで囲まれる p 'hello world' ## pp も p と見かけは同じである。 pp 'hello world'gets もあるけど今回はARGV[0]
お題
$ ruby hello_name.rb Rudyこのコマンドに対して
Hello Rudy.と出力されるようにする。
Ruby の文字入力
まぁ順当にいけばputsしたしgetsだけど、この講義はCLIの引数から拾ってくる。ファイル
hello_name.rb
に以下を記述してputs ARGV[0]からのコマンド
$ ruby hello_name.rb Rudy出る。
Rubyこの辺はまぁ普通かな。
Hello Rudy.
とさせるのはいろんな方法があって、
puts puts "Hello " + ARGV[0] puts puts "Hello #{ARGV[0]}" print "Hello #{ARGV[0]}\n" print "Hello " + ARGV[0] + "\n" だそうです。
やってみよ
これを用いてさっきの
hello_name.rb
を書き換える。puts "hello #{ARGV[0]}."それから
$ ruby hello_name.rb Rudy出る。
hello Ruby.リダイレクト(redirect)
標準出力をファイルに書き込む
Bash等にはファイルディスクリプタを変更する機能が備わっている。まぁゆうたら標準出力をターミナル画面に表示するんじゃなくてファイルに書き込める。
# ruby hello_name.rb bob > hello_name.txtってやったら、~hello_name.txt~ に出力結果が出力される(追記じゃなくて上書き)
# cat hello_name.txtをしてみると中身を見れる。
hello bob.ちなみにファイル最後尾に追記したいときは
# ruby hello_name.rb bob >> hello_name.txtみたいに
>>
ってする。両方とも、ファイルが無かったら新規に作成してくれる。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_1.org
- 投稿日:2020-11-27T18:37:34+09:00
第5回...の前に
Ruby … その前に
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
CUI
CUI はとても便利。しかし時には GUI の方が便利な時もある。だから CUI vs GUI ではなく、CUI × GUI で両方のいいところを用いて生産性を爆上げしよう。
ここで、生産性を左右するのはキーバインドが使えるかどうか。GUI でも CUI でも、キーバインドが左右する。
- (ex.) cmd+c, cmd+v, ctrl+a, ctrl+e
Shell
shell に命令を渡してやりとり。命令はコマンドと呼ばれる。
command は
$command [options] [arg0] [arg1] ...
が基本。
[]
は省略可能を意味し、options は-
あるいは--
の後ろに適宜入力。Directory
ディレクトリ(Direry) は Linux でコマンドを扱う上で理解が必須。
絶対パス
/Users/ryo/Documents/hogehoge.txt
- フルパスと呼ばれることもある。
- ルートディレクトリからの目的地までの経路を示す。
相対パス
./Documents/hogehoge.txt
- これはユーザーが作業中の位置をスタート地点として目的地までの経路を示す。
- 上記例ではユーザーが
/Users/ryo
で作業中であることを前提に hogehoge.txt を示すことができる。コマンド
超基本的だから説明は無しで羅列します。
- open <- Mac Only
- mkdir
- pwd
- cd [dir|..]
- ls
emacs
emacs はターミナル上で動作する高機能なeditor。
- 端末上で遠隔のファイル ( ssh サーバ等) を編集するのに向いている。(今は)
- マウスを使う前提で設計されてないのでキーバインドは必須。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_0.org
- 投稿日:2020-11-27T18:37:34+09:00
第5回...の前に、CUIと仲良くなりたい
Ruby … その前に
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
CUI
CUI はとても便利。しかし時には GUI の方が便利な時もある。だから CUI vs GUI ではなく、CUI × GUI で両方のいいところを用いて生産性を爆上げしよう。
ここで、生産性を左右するのはキーバインドが使えるかどうか。GUI でも CUI でも、キーバインドが左右する。
- (ex.) cmd+c, cmd+v, ctrl+a, ctrl+e
Shell
shell に命令を渡してやりとり。命令はコマンドと呼ばれる。
command は
$command [options] [arg0] [arg1] ...
が基本。
[]
は省略可能を意味し、options は-
あるいは--
の後ろに適宜入力。Directory
ディレクトリ(Direry) は Linux でコマンドを扱う上で理解が必須。
絶対パス
/Users/ryo/Documents/hogehoge.txt
- フルパスと呼ばれることもある。
- ルートディレクトリからの目的地までの経路を示す。
相対パス
./Documents/hogehoge.txt
- これはユーザーが作業中の位置をスタート地点として目的地までの経路を示す。
- 上記例ではユーザーが
/Users/ryo
で作業中であることを前提に hogehoge.txt を示すことができる。コマンド
超基本的だから説明は無しで羅列します。
- open <- Mac Only
- mkdir
- pwd
- cd [dir|..]
- ls
emacs
emacs はターミナル上で動作する高機能なeditor。
- 端末上で遠隔のファイル ( ssh サーバ等) を編集するのに向いている。(今は)
- マウスを使う前提で設計されてないのでキーバインドは必須。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_0.org
- 投稿日:2020-11-27T18:36:37+09:00
第9回
assert_equal
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
assert_equal は、イコール(両者が等しい)かどうかを確かめる関数。これを作っていく。とりあえず
思いつく範囲でとりあえず書いてみる。
def assert_equal(expected, result) return expected == result end p assert_equal(1, 1)これを実行する。
$ ruby assert_equal.rb trueよし。
色、つけてみる?
$ gem install colorizeしてから、
require 'colorize' def assert_equal(expected, result) if expected == result puts 'true'.green else puts 'false'.red end end assert_equal(1, 1) assert_equal(1, 2)みたいなプログラムを実行!
$ ruby assert_equal.rb true false
true
は 緑 、false
は 赤 になった!出力を豪華にしてみる?
require 'colorize' def assert_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected == result puts 'succeeded in assert_equal.'.green else puts 'failed in assert_equal.'.red end end assert_equal(1, 1) assert_equal(1, 2)実行!
$ ruby assert_equal_richer_output.rb expected :: 1 result :: 1 succeeded in assert_equal. expected :: 1 result :: 2 failed in assert_equal.qiitaでは色変わらないけど、ターミナル上では変わってます。
まぁNot Equal もやるか〜
require 'colorize' def assert_not_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected != result puts 'succeeded in assert_not_equal.'.green else puts 'failed in assert_not_equal.'.red end end assert_not_equal(1, 1) assert_not_equal(1, 2)簡単。
$ ruby assert_not_equal_richer_output.rb expected :: 1 result :: 1 failed in assert_not_equal. expected :: 1 result :: 2 succeeded in assert_not_equal.ファイルをまとめて汎用化
上の、イコールとノットイコールをまとめて、重複してる部分はまとめて、さらに外部からも呼び出します。まずは重複部分の整理
require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1)これを外部ファイルからも呼び出したい。
require './assert_equal' assert_equal(2, 1*2) assert_not_equal('bob', 'bob2')みたいな感じ。けど、外部から呼び出したら、tail の4行も実行されてしまう。これを避ける方法がある。
これはもう覚えるしかない。
if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endこれは、実行中のプログラムのファイル名と、記述されているファイル名が一致したら、という構文である。例えば、上記コードが
A.rb
に記述されていて、B.rb
から呼び出されても実行されない。最終はこうなった。require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endいい感じ!!今後の講義でもこのメソッドは活用するらしい。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no9.org
- 投稿日:2020-11-27T18:36:37+09:00
第9回、Rubyでassert_equal
assert_equal
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
assert_equal は、イコール(両者が等しい)かどうかを確かめる関数。これを作っていく。とりあえず
思いつく範囲でとりあえず書いてみる。
def assert_equal(expected, result) return expected == result end p assert_equal(1, 1)これを実行する。
$ ruby assert_equal.rb trueよし。
色、つけてみる?
$ gem install colorizeしてから、
require 'colorize' def assert_equal(expected, result) if expected == result puts 'true'.green else puts 'false'.red end end assert_equal(1, 1) assert_equal(1, 2)みたいなプログラムを実行!
$ ruby assert_equal.rb true false
true
は 緑 、false
は 赤 になった!出力を豪華にしてみる?
require 'colorize' def assert_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected == result puts 'succeeded in assert_equal.'.green else puts 'failed in assert_equal.'.red end end assert_equal(1, 1) assert_equal(1, 2)実行!
$ ruby assert_equal_richer_output.rb expected :: 1 result :: 1 succeeded in assert_equal. expected :: 1 result :: 2 failed in assert_equal.qiitaでは色変わらないけど、ターミナル上では変わってます。
まぁNot Equal もやるか〜
require 'colorize' def assert_not_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected != result puts 'succeeded in assert_not_equal.'.green else puts 'failed in assert_not_equal.'.red end end assert_not_equal(1, 1) assert_not_equal(1, 2)簡単。
$ ruby assert_not_equal_richer_output.rb expected :: 1 result :: 1 failed in assert_not_equal. expected :: 1 result :: 2 succeeded in assert_not_equal.ファイルをまとめて汎用化
上の、イコールとノットイコールをまとめて、重複してる部分はまとめて、さらに外部からも呼び出します。まずは重複部分の整理
require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1)これを外部ファイルからも呼び出したい。
require './assert_equal' assert_equal(2, 1*2) assert_not_equal('bob', 'bob2')みたいな感じ。けど、外部から呼び出したら、tail の4行も実行されてしまう。これを避ける方法がある。
これはもう覚えるしかない。
if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endこれは、実行中のプログラムのファイル名と、記述されているファイル名が一致したら、という構文である。例えば、上記コードが
A.rb
に記述されていて、B.rb
から呼び出されても実行されない。最終はこうなった。require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endいい感じ!!今後の講義でもこのメソッドは活用するらしい。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no9.org
- 投稿日:2020-11-27T15:34:11+09:00
M1チップ MacのUA
M1チップ搭載のMacのUAがネット上に無いって友人から言われたので貼っておきます〜。
※2020年11月27日の情報です。Chrome
Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36Safari
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15Firefox
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0どなたかの参考になればw