無名クラス

ある機能に関してブランチを分けて実装している際、

別ブランチで作成しているクラスのインスタンスが今のブランチで実装しているメソッドを使えるか試したいことがありました。

別ブランチをpullして持ってこようかと思いましたが、
コンソール上で無名クラスを作って必要最低限のメソッドを実装してあげれば簡単に試せることを知りました!!

 

具体例

無名クラスを作り、そのインスタンスを生成する

[1] pry(main)> zip = Class.new do
[1] pry(main)* def url
[1] pry(main)* 'tmp/path/to/hoge.zip'
[1] pry(main)* end
[1] pry(main)* def filename
[1] pry(main)* 'hoge.zip'
[1] pry(main)* end
[1] pry(main)* end
=> #<Class:0x00007f948c61bae8>
[2] pry(main)>z = zip.new
=> #<#<Class:0x00007f948c61bae8>:0x00007f948c5a3390>

 

こうすることで、別ブランチで実装しているクラスのインスタンスを呼びたい部分で、代わりに無名クラスのインスタンスを渡してあげればささっと処理がうまく動くか確かめることができました!

 

このクラスが何なのか気になり確かめてみたらClassクラスでした。

[4] pry(main)> zip.class
=> Class

 

 

 

参考リンク

docs.ruby-lang.org

docs.ruby-lang.org

secret-garden.hatenablog.com

 

コードリーディング部(Rack編)へ参加した

今日はTama.rbから派生した部活のコードリーディング部へ参加してきました!

今回のテーマはRackでした。

github.com

 

 

主催の@coe401_さんが準備や資料を用意してくださり、Rackがサーバーを起動する仕組みを読み解いていきました!

 

 

ruckupコマンドでRackを立ち上げるところから、どんな順番でRackミドルウェアをラップしていくのか、そしてPumaが立ち上がるところまでの処理を追っていきました!

 

そのほか、Puma以外にもいろんなサーバーに対応できるようにしている処理や、TOPLEVEL_BINDINGはどこのことなのかなどをコードを動かしながら確認していきました!

 

Rack側からPumaへ処理が移っている部分や、色んなオプション対応できるようにしている部分、処理の流れなど、難しい内容が多く理解が追いつかない部分がたくさんあったので、またリベンジしようと思います!!

 

そしてやはりライブラリを読んでいるとメタプロが出てきます。。。!!

Rackを読んでいく中でもeval、instance_evalなどが出てきました。

ライブラリを読んでいくためにはメタプロを理解している必要があるなと改めて思いました。

 

 

再来週から始まるTamarb平日版では「メタプログラミングRuby」を読んでいく予定なので、これを機にメタプロを理解して、コードリーディングももっとスムーズに出来るようになりたいと思います!!

 

Sendagaya.rbへ行った

昼休みにruby-jpのスラックを眺めていたらSendagaya.rbが今日開催されるという情報を入手し、即申し込んで参加してきました!!

 

以下はDoorkeeperのSendagaya.rbのページです!

sendagayarb.doorkeeper.jp

 

 

初参加でも入りやすい雰囲気でとても助かりました!!(rubyのコミュニティはだいたいいい人ばかりと分かっていても、初めて参加する勉強会は少々緊張しますw)

 

Sendagaya.rbは、今気になっていることや困っていることなどテーマを自由に持ち寄り、いろんな方の意見やアドバイスを頂いたりできました!

 

自分も今まさに困っていた内容について質問し、具体的にどう形にしていくかというお手本を見てせいただきながらアドバイスをいただきました!!

自分が気づいていなかった考慮すべきポイントについても気づくことができました!!

 

 

Rubyの勉強会にはLT形式の会、手を動かす会、今まさに困ってる事が相談できる会、コードリーディングする会、輪読会、などなどいろんなタイプの勉強会があって面白いなと改めて思いました!!

 

 

 

追記

同じタイミングでSendagaya.rbに参加した方の記事で、私より丁寧にわかりやすくまとめてくれているものを発見したのでリンクを貼っておきます!

s4na.hatenablog.com

 

 

ハッシュ関数とソルト

先日あるapiを使うにあたって、ハッシュ関数とソルトを使わなければならない機会がありました。

よく分かっていなかったため調べてみました!

 

 

ハッシュ関数とは

ある文字列を、決まった長さの新しい文字列に変える関数です。

元の文字列が似たような値でも、ハッシュ関数を通した後は全く似てない値となります。

同じハッシュ関数を使えば、入力されたデータの長さに関係なく、必ず同じ長さのハッシュ値となります。

以下のリンクでは具体的なハッシュ関数の種類を生成される文字数ごとにまとめてくれていました!

qiita.com

 

ソルトとは

ハッシュ化する前のパスワードに付け足す文字列のことです。

パスワードをよりバレにくくするためにソルトを付け加えます。

※ハッシュ化するだけだと、ハッシュ化された値から元の文字列を求めることはできなくても以下のように試されてバレてしまうことがあるらしいです。

irb(main):007:0> hash1 = "7e263eb7439f020a8e60f454fcd8193ffc071d9f7d54f7260073a4ee8458c23b"
=> "7e263eb7439f020a8e60f454fcd8193ffc071d9f7d54f7260073a4ee8458c23b"
irb(main):008:0> hash2 = Digest::SHA256.hexdigest("test1235")
=> "7e263eb7439f020a8e60f454fcd8193ffc071d9f7d54f7260073a4ee8458c23b"
irb(main):009:0> hash1 == hash2
=> true  # hash1の元の値はhash2の元の値と同じ!!

 

Rubyハッシュ関数を使ってみる

Rubyでは、Digest::Baseクラスを使ってハッシュ関数を使うことができるようです!

docs.ruby-lang.org

 

 MD5ハッシュ関数を使うなら、以下のようにすれば可能です!

irb(main):001:0> require "digest/md5"
=> true
irb(main):003:0> Digest::MD5.hexdigest("test1234")
=> "16d7a4fca7442dda3ad93c9a726597e4"

 

同じようにSHA256を使うこともできます!

irb(main):004:0> require 'digest/sha2'
=> true
irb(main):005:0> Digest::SHA256.hexdigest("test1234")
=> "937e8d5fbb48bd4949536cd65b8d35c426b80d2f830c5c308e2cdec422ae2244"

 

きちんと”test1234”と"test1235"の1文字違いでもハッシュ化した値はかなり違う値になっています!

irb(main):004:0> Digest::SHA256.hexdigest("test1235")
=> "7e263eb7439f020a8e60f454fcd8193ffc071d9f7d54f7260073a4ee8458c23b"
irb(main):005:0> Digest::SHA256.hexdigest("test1234")
=> "937e8d5fbb48bd4949536cd65b8d35c426b80d2f830c5c308e2cdec422ae2244"

 

Railsでのパスワードハッシュ化

普段、Railsで認証周りにdeviseなどのgemを使っていれば、パスワードにソルトを足してハッシュ化して・・・といったことをgem側でやってくれているようです!

qiita.com

qiita.com

 

 

感想その他

今まで「パスワードを平文で保存はマズイ」といったことをよく耳にすることはあったのですが、

平文じゃなく正しく保存する方法はどんなものなのかよく分かっていませんでした。

しかし、今回ハッシュ関数とソルトを調べたことでなんとなく理解することができました。

また、devise gem、本当に色々なことやってくれていて凄いなと思いました。。。!!

 

 

Nerimarb#3へ行った!!

本日はNerimarbへ参加させていただきました!

今回のテーマはObjectクラスでした!

みんなでるりまのObjectクラスの章を読み進めていきつつ、疑問を深掘りしてみたり、解説をしていただいたり、rubyの実装をみにいったりしていき、

気づいたことや試したこと、参考リンクなどはesaに書いていきながら進めていきました!

docs.ruby-lang.org

 

 

ObjectクラスはStringintegerArrayHashなど全てのクラスの親クラスです。

それぞれのクラスで定義されているメソッドがObjectクラスにも定義されていたりします。

  

ただ、同じメソッドでもそれぞれのクラスで定義されているものとObjectクラスに定義されているものでは挙動が違うものがあり、頭がこんがらがりましたw

各クラスの性質に合わせて再定義されることを期待しているようです。

例)

self <=> other -> 0 | nil[permalink][rdoc]
    self === other である場合に 0 を返します。そうでない場合には nil を返します。 

self == other

    デフォルトでは equal? と同じオブジェクト の同一性判定になっています。 

 

  

その他にもto_sとto_str(to_i / to_int、to_a / to_ary、to_h / to_hash)の違いについてわかっていなかったのですが理解することができました!

codeday.me

 

 

さらに、「Rubyのcaseを〇〇(言語名)のswitch文だと思っている人たちにぼくから一言ガツンと申し上げたい」という記事を紹介していただいたりもしました!

melborne.github.io

 

 

cloneメソッドのところでは、深いコピーと浅いコピーがあることを知ることができました!

浅いコピーは自身を複製するだけで、オブジェクトの指し ている先までは複製しないようです。
深いコピーが必要な時はMarshalモジュールを利用するようです。

 

 

感想その他

読み進めていく中で、「このメソッドよく分からないな、いつどうやって使うんだろう?」

というものもあったのですが、どうやら「Effective Rubyにはそれらの使い所が結構詳しく書いてあるようなので、Effective Rubyを読んでみたい気持ちがさらに高まりました!!

次回も参加したい気持ちです!!

また、練馬区民の参加者が10人集まれば団体登録することができ、施設を半年前から予約することができるそうなので練馬区民の参加者が増えるといいなと思います!!(自分は全然練馬区民ではないですがw)

 

 

社内LT会

今日は月に1度行われる社内のLT会がありました。

基本入社歴の短いメンバーはLT必須なので自分もLTをしました。

それ以外のメンバーは希望制です!

 

LTのテーマは読んだ本について・試してみたツールについて等なんでもOKな自由な感じです。

 

自分の発表した内容は以下です。

発表時間5分にも満たないスカスカさですw

slides.com

 

自分の発表はうっすい感じでしたが、他の方々の発表がとても面白いものばかりでした!

以下は自分以外の方々の発表です!

  • Face APIで遊んでみた話
  • Effective Rubyを読んでみた話
  • 発想法についての話
  • Expoを使って5分でReactNativeアプリでプッシュ通知実装するデモ

 

Face APIで遊んでみた話

Face API は MicrosofAzuret が提供してくれている顔認識APIです。

このAPIでは画像を読み込ませると、年齢や性別などを判断して返してくれます。

実際の写真だけでなく、漫画のキャラでも判定してくれてともても面白そうでした!

以下はそのリンクです!

azure.microsoft.com

 

 

Effective Rubyを読んでみた話

Effective Rubyという本の概要や所感についての話です!

Rubyの処理の裏側の話やメタプロについても書いてあるようです。

freezeメソッドの使い所など実際の業務で役立つ内容も書いてあるようです!

いつか読んでみたいと思いました。

 

https://images-fe.ssl-images-amazon.com/images/I/5186AWFoSXL._SR600%2C315_PIWhiteStrip%2CBottomLeft%2C0%2C35_PIStarRatingTHREEANDHALF%2CBottomLeft%2C360%2C-6_SR600%2C315_ZA%285%20Reviews%29%2C445%2C286%2C400%2C400%2Carial%2C12%2C4%2C0%2C0%2C5_SCLZZZZZZZ_.jpg


発想法についての話

kj法という、ブレーンストーミングなどによって得られた発想を整序し、問題解決に結びつけていくための方法について書いてある本のようです。

こちらはプログラミングとは直接関係がある内容ではないですが、「日々のアプリ制作でもkj法と近いことを行っているため、kj法を意識することでより良いプロダクト作りに繋げることができるかも」という発表者の話があり、実践していこうと思いました。

 

 

Expoを使って5分でReactNativeアプリでプッシュ通知実装するデモ

ExpoはReact Nativeでのアプリ開発ができるサービスです。以下のような特徴があり、5分あれば実機にプッシュ通知を送れるところまで実装できちゃうそうです!!

・発行されたQRコード読み込むだけでケーブル繋がなくても実機確認OK

・実機のコンソールデバッグも簡単

・証明書周りもいい感じにやってくれる

・Reactの最新の書き方で書かれたコードがついてくる

こちらがExpoのサイトです!

expo.io

 

 

感想その他

人の発表を聞くのはいろんなことを知れるので面白いです!!

(先月も同じこと思っていた気がしますが)来月は自分ももっと頑張ろうと思います!!

 

 

 

RubyMineとVSCode

自分はRubyMineを約半年ほど愛用していたのですが、

昨日VSCodeを使ってみたら「あれ?!VSCodeめっちゃいいのでは...!!」という気持ちになっております。

 

よく「VSCodeからRubyMineに乗り換えた」系の記事は見かけたことがあったのですが、自分の場合逆ですw

 

そこで改めてRubyMineとVSCodeの違いや、自分が使ってみて感じたことについて書いてみることにしました!

 

 

RubyMineとVSCode比較 

ショートカット

RubyMine

独特なものが多い気がする

・ファイル内検索は command + F、全ファイル検索は  shift + control + F、なんでも検索は shift 2連打

 

VSCode

一般的な割り当て + アルファ

・ファイル内検索は command + F、全ファイル検索は command + shift + F、ファイル名検索は command + P 

 

改行時の空白

RubyMine

気にせず改行すると謎の空白が入る(そのせいでFiles changedにたくさん表示されてしまいレビューし辛い)

こういうやつ↓

gyazo.com

 

 VSCode

改行しても空白入らない

 

PCが重くなる度合い

RubyMine

しょっちゅう重くなる

しょっちゅうファンファンいう(特に起動したばかりの時)  

ファンファンなってる時アクティビティモニタ確認するとRubyMineのCPU使用率高いことが多い

 

VSCode

今の所全く重たくない 

今の所常に静か(気のせいか充電の減りも少ない気がする)

 

値段

RubyMine

約10000円/年

※セールで買えばもうちょい安いらしい&1年目以降は段々安くなる

  

VSCode

 タダ

 

メソッド定義元ジャンプ

RubyMine

デフォルトでできる

強力(gemのメソッド定義元もみれる)

 

VSCode

設定すればできる(簡単!)

拡張機能Ruby入れる → preferences → settings → Ruby: Intellisenseと検索 → falseをrubyLocateに変える → VSCode立ち上げ直す → これでメソッド名をcommand + クリックで定義元へ飛べる!!

 

Gitの履歴

RubyMine

参照できる機能あるのかな?

  

 VSCode

こんな感じでカーソル当てると誰がどんな変更したのか簡単にみれる! 

gyazo.com

 

 

感想その他

RubyMine、評判もいいしとても良いエディタだとは思うのですが、自分はあまり機能を使いこなせておりませんでした。

一方VSCodeは周りの人が使っていることもあり、最初にしておくべき設定や入れるべき拡張機能、基本のショートカットを教えてもらえたため、乗り換え初日からとても快適でした!!

 

メソッド定義元ジャンプがしたくてRubyMineを買ったのですが、VSCodeでも定義元ジャンプができるようになった今、RubyMineじゃなきゃダメな理由がなくなってしまいました。。。

音も静かだし充電の減りもVSCodeにしてから少し遅くなった気がするので、しばらくVSCode使っていこうと思います!!