サカナ未遂

プログラミング、筋トレ、子育て

RubyでStruct.newを使って構造を包み隠す

今日読んでたオブジェクト指向設計実践ガイドでStruct.newについて学んだのでメモのつもりで記録しておきます。

以下のコードは時価総額を計算する簡単なものとします。

class MarketCapitalization
  attr_reader :data
  # 初期化
  def initialize(data)
    @data = data
  end

  # 時価総額計算
  def calc_market_capitalization
    data.collect do |cell|
      # 株価 * 株数
      cell[0].to_i * cell[1].to_i
    end
  end
end

# [0]に株価、[1]に株数とする
data = [[100,500],[200,1000],[300,320]]

mc = MarketCapitalization.new(data)
puts mc.calc_market_capitalization

このコードの場合、calc_market_capitalizationメソッドが、配列の構造を知っている前提になっているので、例えばdataの[0]に銘柄コードなどを差し込んだ場合、メソッド内の配列の要素数を変更する必要が出てきます。 メソッドが一つだけなら修正も容易ですが、このdataを多岐に渡って使用している場合、あちらこちらを修正する必要があります。

そこで、Struct.newを使い、以下のように修正します。

class MarketCapitalization
  attr_reader :stocks
  # 初期化
  def initialize(data)
    @stocks = stock_assign(data)
  end

  # 時価総額計算
  def calc_market_capitalization
    stocks.collect do |stock|
      # 株価 * 株数
      stock.price.to_i * stock.num.to_i
    end
  end

  StockInfo = Struct.new(:price,:num)
  def stock_assign(data)
    data.collect do |cell|
      StockInfo.new(cell[0],cell[1])
    end
  end
end

# [0]に株価、[1]に株数とする
data = [[100,500],[200,1000],[300,320]]

mc = MarketCapitalization.new(data)
puts mc.calc_market_capitalization

Structクラスを使い、stock_assignメソッドの中でArray配列をStruct配列に変換しています。 これによって、calc_market_capitalizationメソッドでは配列の要素数を気にすることはなくなりました。 dataの要素数が増えた場合、このstock_assignメソッドのみを修正すれば、他の処理に影響することはなくなります。

学びを結果に変えるアウトプット大全を読んだ

ブログを始めたものの、アプトプットが難しいと感じていたので(前にブログにも書きましたが)、樺沢紫苑さんの

学びを結果に変えるアウトプット大全 (Sanctuary books)

を読みました。

 

何か良いアウトプットするための教科書みたいなもは無いものかと探していて、この本を見つけました。

 

精神科医の先生が、自身の体験や論文などのエビデンスをもとに書いた、アウトプットの王道的なテクニックの本となります。

 

アウトプットが上手くなるにはとにかく続けることが大事。

また企画書の書き方、読書感想の書き方、日記の書き方など、それぞれケースごとに使えるテクニックを紹介してくれています。

 

とにかく実践すべきと思ったのは、アウトプットのスピードです。

インプットしたらすぐにアウトプットすることで脳に定着し、記憶として残るとのことです。

この本を参考に私ももっとアウトプットを増やし、質を高めて行こうと思いました。

 

VagrantでUbuntu操作してRailsアプリに接続する方法

ふとLinuxRailsアプリでも開発しようと思い、Linux環境を構築してみました。 Vagrantを使ってVM上にUbuntuを入れてみました。

VagrantFileにはローカル側のアプリとポートが被らないように

config.vm.network "forwarded_port", guest:8000, host: 8000↲

と記載しておきました。

Ubuntuで、Rubyなど諸々インストールし

rails new

でアプリを使って、

rails s --port=8000

としましたがローカル側からはいつもの Yay! You’re on Rails!が出てくれません。

色々調べると、どうやらIPアドレスの指定も必要だったので、

rails s -b 0.0.0.0 --port=8000

とオプションつけてやると動きました。

f:id:tera_chan3700:20181016211031p:plain

環境構築の類は、いつもハマるので備忘録です。 細かいVagrantとかの設定はまたいつか書きたいです。

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版を読んだ

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版を読了しました。

 

前から読もうと思っていたのですが、紙は辞書並だし、電子媒体は固定フォーマットだったので二の足を踏んでいたのですが、9月の終わりころにリフロー版が出たので、即買いました。

 

通勤中に読んでいたのですが、3週間くらいかかりました。

またサンプルのコードがPHPで書かれているのですが、通勤中のため動かすことはなくとにかく読むことに徹しました。

 

SQLインジェクションXSSなどメジャーなものから、セッションを使った攻撃、OSコマンドインジェクションなど、ありとあらゆる攻撃についての解説とその対処法が記載されていました。

タイトル通りセキュリティについてを体系的に学べるため、Webアプリケーションを開発するなら一度は目を通す必要があると思われます。

 

ただ内容がとにかく多く、私は全てを暗記できるわけではないので、攻撃手法と概要はしっかり読み、対処法は流し読みし、必要になったら読み直そうと思います。

 

アウトプットの難しさ

アウトプットって難しくて悩みますね。

 

ブログを書くのもなかなか捗らない日々です。

 

プログラミングに関しても、勉強した技術とか、

今までの知見とか、もっと書いていけばいいのに、

他のブログで書いてある技術をここで書いてもしょうがなくね?

とか思うと、なかなか筆が進みません。

 

でも、結局自分のブログ何だし、新しい技術習得でつまづいたところを、メモのように残していけば、いつか自分の役に立つのでやはり何かしら書いて行こうと思う今日この頃。

 

Ruby on Railsについて、もっとスキルアップを望むべく、

7月よりポテパンキャンプというプログラミングスクールに通っています。

(通ってるっていうかほぼオンラインで、週一にレビュー会)

3ヶ月間のスクールなので、あと1週間で終了となります。

スクールの内容に関しては別の機会にブログに書こうと思います。

 

で、スクールも終わりなので、そろそろ本格的に転職活動を開始します。

スクールからも紹介してもらえるらしいし、自分でも転職エージェントに登録し

探し始めています。

来年までには、良い会社を見つけたいと思います。

 

最近読んだ本では独習Gitがよかったです。 

githubではなくgitの本です。githubのことも書いてますが)

独習Git

独習Git

 

 git自体は何となくgithubからcloneして、commitしてpushして使ってただけですが、

思った以上に沢山の便利な機能がありとても勉強になります。

※あぁ、この辺もちゃんとまとめてアウトプットしたい、、、読書感想苦手、、

 

次はRubyをもっと深く知るため

改訂2版 パーフェクトRuby

を読みます。(現在積読中)

 

 

 

gemの選定方法について

 

railsを使用していてgemを入れる時、どういう基準で選べばいいか悩んでいました。

今日は、勉強会であった、ある企業のCTOから教えてもらったgemの選定方法について書いていきます。

 

star数が100以上ある

まあこれは当然の指標だと思いますが、やはり人気があるかどうかはここを見ると思うのでまずはstarを見るとのことです。

 

contoributorsの数が20〜30以上ある

 外部から貢献する人数が多ければ、活発に修正、改良が行われてる可能性が高いため、最低でも20以上ある方が安心できるそうです。

 

Fork数が多くない

どれくらいが多いとするかを聞くのを失念していましたが、Forkが多いということは、gem自体に修正の余地があるのに対応されないため、各々がforkして修正している可能性が高いと取れるそうです。

 

Issuesが放置されいない

Issuesに対してキチンと対応していると、アクティブなgemと判断できるそうです。

 

最終更新が1年以内

モジュールの修正があまり古いと、やはり開発が止まって放置されている可能性が高いそうです。だいたい目安は1年以内に更新されているものを選びたいとのことです。

ただ、いい意味で枯れてて修正の余地のないものもあるので、ソースコードを読んで判断する必要があるとのこと。

 

ActiveRecordに対してモンキーパッチを当てていない

これをやっていたらまず避けるそうです。

確かに危険な匂いがしますね。

 

以上です。

また他のエンジニアにも聞いてみて、自分なりの基準を見つけたいと思います。

エンジニアの課金について

 

私はゲームをやらないのですが、電車乗っていると、結構スマホでゲームやっている方をよく見ます。

スマホのゲームって結構な金額を課金する人もいるようです。

私の職場には、先月9万円課金したという人もいました。

(9万円使うとほしいキャラが手に入るとか)

 

無課金では無理なんでしょうかと尋ねると、無課金でもやれないことはないが、効率が悪い。課金する理由は

・欲しいキャラを手に入れたい。

・強いキャラを手に入れてゲームを進めたい。

などとおっしゃっていました。

ゲームをやらない私からすると、もったいないなぁと思いつつ、

エンジニアの自己投資も課金みたいなものか?とふと考えました。

 

今年に入ってから新しい技術を習得しようと勉強をはじめましたが、

今年購入した本は、

【プログラム関連】

JavaScriptエンジニアのためのNode.js入門 350円

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ) 3218円

Ruby on Rails 5アプリケーションプログラミング 3880円

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書 3888円

RUBY技術者認定試験 公式ガイド (ITpro BOOKs) 531円

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES) 4536円

【電子合本版】Code Complete 第2版 完全なプログラミングを目指して 5400円

マスタリングTCP/IP 入門編 第5版 2200円

実践Vim 思考のスピードで編集しよう! (アスキー書籍) 2177円

エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング 2380円

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) 2776円

Ruby on Rails 5の上手な使い方 現場のエンジニアが教えるRailsアプリケーション開発の実践手法 3200円

メタプログラミングRuby 第2版 3240円

Web制作者のためのCSS設計の教科書 モダンWeb開発に欠かせない「修正しやすいCSS」の設計手法 1026円

改訂2版 Ruby逆引きハンドブック 4126円

Effective Ruby 3456円

改訂2版 パーフェクトRuby 3521円

パーフェクト Ruby on Rails 3110円

独習Git 3542円

 

結構買ってますね、、、まだ全部読破できていませんが(年内には必ず)

合計は54177円でした。

計算してみたらかなり使っててびっくりしてます。

プログラムの勉強するのに、今の時代は本がなくてもWebの情報だけでも

可能なのですが、Webの情報は断片的だったり、ピンポイントだったりで、

体系的に学ぶのにあまり適していない場合があります。

つまり、Webの情報(無課金)だけでもやれないことはないが、

書籍購入(課金)するほうが効率的な場合が多いと考え、思い切って買ってます。

Railsチュートリアルのような素晴らしいサイトもありますが、まれですね)

ゲームに課金することも、クリアのための効率化なので

似たようなものなのかなぁと思ってみたり。

 

本棚に技術書が増えていくのも結構うれしくて、ゲームでキャラを集める感覚に似ているのかも。

そう考えると、ゲームに課金する人の気持ちもわかるような気がしてきます。

だから私もゲームを始めると、すぐに課金してしまいそうなので、ちょっとやってみたい気もしますが、手を出さないように自制しています。

 

ゲームに課金なんてもったいないと考えるのは簡単ですが、自分に置き換えてみて考えると同じような思考で技術書を買っているので、人は人、自分は自分で好きなことを他人に迷惑かけずにやれてればいいのかなと思います。

今年はあといくら課金するのか、後半もたのしみです。