Make the Most of IT.

お酒と映画が好きなJava屋さんがRubyとか学んだこと感じたことをつらつらと

Hamlに入門して「. 」(ドット)がエラーになってハマった話

はじめに

現在復習ととポートフォリオ作成のためにRails Tutorialをもう一周しています。

そんな中でただ2周目をするのでは勿体無い気がしてerbではなくhamlを使ってみようと導入してみました。

右も左も分からない中、第3章の「3.2.2 静的なページの調整」でやらかしてしまったので備忘録として。

ハマったところ

お手本はerbなので脳内変換頑張ってやったコードがこちら。

お手本

<h1>Help</h1>
<p>
  Get help on the Ruby on Rails Tutorial at the
  <a href="https://railstutorial.jp/help">Rails Tutorial help page</a>.
  To get help on this sample app, see the
  <a href="https://railstutorial.jp/#ebook"><em>Ruby on Rails Tutorial</em>
  book</a>.
</p>

脳内変換したもの

%h1 Help
%p
  Get help on the Ruby on Rails Tutorial at the
  %a{ :href => 'https://railstutorial.jp/help'} 
    Rails Tutorial help page 
  . To get help on this sample app, see the
  %a{ :href => 'https://railstutorial.jp/#ebook'} 
    %em Ruby on Rails Tutorial
  book.

その結果

Illegal element: classes and ids must have values.

解決方法

グーグル先生に聞いたところによると、Hamlでは「.」でクラスを指定することができるみたい。

ということは上では「.」の後にすぐスペースがきているので「はよちゃんとしたクラス指定せんかい!」って怒ってるわけですね。

エラーメッセージ見てもクラスと値には必ず値を設定してねって書いてあるし。

ということで下記のように「.」をバックスラッシュでエスケープすることで解決しました!

%h1 Help
%p
  Get help on the Ruby on Rails Tutorial at the
  %a{ :href => 'https://railstutorial.jp/help'} 
    Rails Tutorial help page 
  \. To get help on this sample app, see the
  %a{ :href => 'https://railstutorial.jp/#ebook'} 
    %em Ruby on Rails Tutorial
  book.

Hamlは文量少ないしわかりやすくてとても便利!
もっと早く脳内変換できるようにがんばろー

rails newしただけなのにNo connection pool with 'primary' found.が出て困った話

はじめに

先日公開したrails環境構築中にgemのバージョン不整合でハマったので同じことで困ってる人に届け!

f:id:marumama6:20190217222540j:plain

環境

Ruby 2.5.1 ・Ruby on Rails 5.2.2 ・sqlite使用時

エラー概要

rails new の後、起動確認のためにrails serverでserverを立ち上げると下記エラー

エラーメッセージ:No connection pool with 'primary' found.

def retrieve_connection(spec_name) #:nodoc:
  pool = retrieve_connection_pool(spec_name)
  # 下でエラー
  raise ConnectionNotEstablished, "No connection pool with '#{spec_name}' found." unless pool
  pool.connection
end

原因

ググった結果、2019/2/4にgem ‘sqlite3’ が、2019/2/4に 1.3.13から1.4.0にアップデートされたため。 railsがまだ1.4.0に未対応のよう。

対策

sqlite3を明示的に1.3.Xを使用するように追記後、アップデート。

gem 'sqlite3', '~> 1.3.6'
$ bundle update

おわりに

というわけでRails newした時にsqliteのバージョンの壁に阻まれた場合の対応方法をご紹介しました。

rails tutorialでもsqliteを使ってたけど、Postgreの方がいいのかなぁ

古いRubyだけ入れてあるMacにバージョンアップからRails導入までやってみた

はじめに

railsチュートリアルAWS Cloud9にて学習していたので、ローカル環境にてVimで開発できるように環境構築をしようと思います。

以前「プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)」を勉強していた時に構築したRubyのみの開発環境があったので、バージョンアップも込めて。

具体的には以下のものは既に入っていました。 今回はRubyを2.5.1にします。

・homebrew ・rbenv ・ruby (2.4.1)

こちらを参考にさせていただきました qiita.com

f:id:marumama6:20190217222540j:plain

Ruby

homebrewアップデート
$ brew update
インストールできるRubyのバージョンを確認

この時jrubyやrbxなど大量に出てくるのでびっくりする。

$ rbenv install --list
Available versions:
  1.8.5-p52
  1.8.5-p113
  ・・・続く
インストールしたいRubyにアップデート

今回は2.5.1にアップデートしたいので2.5.1を指定 この時PCくんがかなり頑張って普段聞かない駆動音が聞こえてくるのでびっくりする。

$ rbenv install 2.5.1
デフォルトのrubyのバージョンを指定
$ rbenv global 2.5.1
$ rbenv rehash
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]
bundlerインストール
$ gem install bundler
$ bundle -v
Bundler version 2.0.1
gemのアップデート

とりあえずgemも古くなっているだろうと思ったのでアップデート。 本当は互換性とか色々確かめながらしないといけないと思う。。。

$ gem update

Rails

Railsディレクトリ作成
$ mkdir ~/workspace
$ cd ~/workspace
bundle init
$ bundle init
Writing new Gemfile to /Users/*****/workspace/Gemfile
Gemfile編集

Railsディレクトリに作成されたGemfileの「gem "rails"」がコメントアウトされているので外す

# frozen_string_literal: true

# ...省略

gem "rails"
Railsインストール
$ bundle install --path=vendor/bundle
Rails new
$ bundle exec rails new [app name]
ライブラリをインストール
$ bundle install --path=vendor/bundle
Raisアプリケーションを起動

作成したアプリケーションのサーバーを立ち上げて http://localhost:3000/にアクセスで起動確認

$ cd [app name]
$ bundle exec rails s

おわりに

ということで、RubyのバージョンアップからRailsのインストール、Rails newまでやってみました!

次はVim周りの整備かなぁ〜

【書評】10年後も通用する”基本”が詰まってる 「オブジェクト指向でなぜつくるのか」を読んで

はじめに

久々の投稿ですがまたまた書評です。

普段の業務ではオブジェクト指向の代名詞とも言われるJavaに触れていますが、体系だってオブジェクト指向を学んだことがありませんでした。

そこで改めてオブジェクト指向とはなんぞや?を知るために「オブジェクト指向でなぜつくるのか」を手に取ってみました。

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

全体の構成

本書は大きく分けて以下の4パートに分かれています。

1.導入:オブジェクト指向の全体像と概念(1章、2章)

 パート1では、オブジェクト指向とはどのようなものなのかを大まかに説明した後に、オブジェクト指向の解説でよく耳にする「動物スーパークラスを継承した哺乳類クラスや鳥クラスを作成する」と言った比喩がオブジェクト指向の解説に適していない理由が解説されています。

2.プログラミング技術:OOPフレームワークデザインパターン(3章〜7章)

 パート2では、まずプログラミング言語の歴史を紐解きながらオブジェクト指向がなぜ必要だったのか、オブジェクト指向が登場したことにより登場前に比べて何が便利になったのかが書かれています。また誤った比喩などを使用せず、オブジェクト指向が実際にどのような仕組みで成り立っているのかをソースと図を用いて解説されています。

3.応用技術:UMLモデリング、設計、開発プロセス(8章〜11章)

 パート3では、オブジェクト指向がプログラミング内だけにとどまらず設計や開発プロセスに応用されていることを紹介し、オブジェクト指向を活用した要件定義や設計方法などを例を交えた解説がされています。

4.関数型言語関数型言語でなぜつくるのか(13章)

 パート4は第2版で新たに書き加えられたパートで、オブジェクト指向の対局とも言える関数型言語の特徴を紹介しています。

本の感想

オブジェクト指向とはなんぞや?と言う基礎の基礎から固めたいと思って手に取った本書ですが、結論から言うと大正解でした。

まずパート1から僕の考えは打ち砕かれました。

第2章にてまず下記のソースを用いて、従来からの比喩でオブジェクト指向が説明されます。

// 動物クラス
class Animal {
    void move() {}   // 行動する
    String cry() {}  // 吠える/ 泣く
}
// 哺乳類クラス(動物クラスを継承する)
class Mammal extends Animal {
    void bear() { }  //出産する
}
// 鳥クラス(動物クラスを継承する)
class Bird extends Animal {
    void fly() { }  // 飛ぶ
}

哺乳類も鳥も動物なので行動するし吠える / 泣くから動物クラスを継承してmoveメソッドとcryメソッドを呼び出せるようにする。個々のサブクラスでは各クラス固有のメソッドを定義する。

全てうんうん、せやなせやなと納得しながら読み進めると。。。

現実世界の人やモノはクラスから作られない

!?

犬が生まれるのはオスとメスが発情期に仲良くなった結果としてメスが妊娠するからで、あらかじめ定義された「犬」クラスから作るわけではありません。

!?!?

た、確かに!!!

私はこの説明に度肝を抜かれてしまいました。

ではオブジェクト指向とはどのようなものなのか、オブジェクト指向は実際にどのような仕組みで実現されているのか、それをパート2で解説されています。

曰くオブジェクト指向の特徴はメモリの使い方にあり

メソッドテーブルやメソッドエリアなど馴染みのない言葉が多く登場しましたが、簡潔に書かれた図が非常にわかりやすくとても理解しやすかったです。

パート3ではこれまでの「オブジェクト指向は現実と似て日なるものである」を覆し、オブジェクト指向的思考で現実世界をソフトウェアに落とし込むやり方を紹介しており、さわりだけながら実際の要件定義などでの思考方法を疑似体験することができました。

第2版にて新たに追加されたパート4:関数型言語はですが、これは少し期待はずれでした。

最近Qiitaなどでも目にすることがあり関数型言語についての関心が高まっていただけに、Qiitaで読んで知ってるな。。。と言う内容だったので残念でした。

しかし裏を返すとQiitaを読んだだけで理解することができる関数型言語がかなり簡潔でわかりやすいものなのだと言うことだと思います。

おすすめしたい人

本書はオブジェクト指向がどのようなものかが解説されている本のため、「オブジェクト指向ってよく聞くけどなんなの?」や「動物クラスがー赤ちゃんクラスがーってよく比喩でなんとなくわかった気がするけど結局何が言いたいのかわからない」って言う初心者の方におすすめしたいです。

逆にデザインパターンなど実際にどのように活用したら良いのかの内容は薄めなため、「オブジェクト指向を適用して効率の良いプログラムを書きたい!」などの実践型の知識をお求めの方にはあまりおすすめできません。

最後に

ということで「オブジェクト指向でなぜつくるのか」を読んだ感想について書いてみました。

本書はオブジェクト指向の利点について、オブジェクト指向登場以前と比較しながら解説されており、これまでの誤った比喩では理解しきれなかった「オブジェクト指向の何がいいの?」や「オブジェクト指向って実際に使うとどうなるの?」が丁寧に解説されている良書でした。

第1版が出版されたのが2004年、第2版が出版されたのが2011年ということですが、実際に今でも通用する知識(というか常識?)が詰まっている一冊となっています。

帯にある「10年後も通用する"基本”を身につけよう」に偽りなしです!

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

【書評】人を動かすで人の気持ちに

はじめに

あけましておそようございます。

あれよあれよと言う間にもう2019年の1月がもう終わろうとしています。
一日一日の過ぎるのが早すぎる。

最近はちょっとアレなプロジェクトに巻き込まれてしまい思いの外忙しい毎日です。
もともとあるシステムをゴニョゴニョするプロジェクトなのですが、もうクソコードの嵐で。。。
びっくり仰天なものもあったのでどんなソースコードだったか、僕だったらどうリファクタリングしようかなとかを今度まとめようと考え中です。

さて今日はデール・カーネギーの名著「人を動かす」を読みましたのでその感想を書いていきたいと思います。

人を動かす 文庫版

人を動かす 文庫版

内容紹介

「人を動かす」とは前述の通りデール・カーネギーの名著で、人との関わり方について歴史上の人物や実際にカーネギーの唱える手法を用いて成功した人の体験談など具体例を用いて如何にして人と友好な関係を築いてくかが書かれています。

本著は大きく分けて4つのパートに分かれています。

1.人を動かす三原則
2.人に好かれる六原則
3.人を説得する十二原則
4.人を変える九原則

全てのパートに一貫して書かれているのは相手の立場に立って、相手がどのように考え、自分がどのように振る舞うと相手が喜ぶか考えると言うことです。

例えばパート2.人に好かれる六原則の6章「心から褒める」と言う章にも

人間は、誰でも周囲の者に認めてもらいといと願っている。自分の真価を認めてほしいのだ。小さいながらも、自分の世界では自分が重要な存在だと感じたいのだ。見えすいたお世辞は聞きたくないが、心から賞賛に飢えているのだ。

とあるように、自分が相手に対して何をしたら相手が喜びこちらの思うように動いてくれるかが書かれています。(上の文章では書いてある通り「褒める」ことが大事と書いてありますね)

感想

実は本書は再読です。

前回読んだのは去年の11月ごろだったかと思います。
各所でおすすめされていたのを見て手に取ってみました。

そして今年に入り、もう一度読みたいなと言う気持ちからまた手に取りました。
こんなに早く再読したい気持ちになった本は初めてです。
それだけこの本が僕に強い衝撃を与えた本なのだと思います。

本書の中で一番印象に残っているのは、パート3. 人を説得する十二原則の第1章「議論を避ける」です。

恥ずかしながら僕は相手を説得するには論理立てた説得こそ最も有効な手段だと思っていました。論理的に考えれば明らかなのだから相手もわかってくれるはず、そう思っていたのです。

しかし、本書には全く正反対のことが書かれていたのです。

議論に勝つことは不可能だ。もし負ければ負けたのだし、たとえ勝ったにしてもやはり負けているのだ。なぜかと言えばー仮に相手を徹底的にやっつけたとしても、その結果はどうなる?ーやっつけた方は大いに気をよくするだろうが、やっつけられた方は劣等感を持ち、自尊心を傷つけられ、憤慨するだろう。

この文章はこれまでの僕の常識を一瞬にして打ち崩し、もう一度僕に常識を再構築する機会を与えてくれました。

これまでの僕は全てを論理的に片付けようとしていました。
しかし、僕たちは人間なのです。論理的ではなく感情的な人間なのです。

もちろん相手をやっつければとても気分良く、その気分のまま相手の考えを変えてやったと自己満足に浸ります。しかし、やっつけられた方はそうはいきません。

あいつはそう言っているけれどもやっぱり違う、そんなはずないと余計意固地になり考えを変えるどころかより強固にしてしまう結果を招きます。

この本を読んでから極力議論は避けるようにしています。

議論をするのではなく相手の意見を聞いて納得するところは納得し、自分の意見を言う時も左も自分の意見が正しく相手の意見は間違っていて愚かな相手にわざわざ教えてやる、と言った態度を取らずに謙虚に意見を言うように努めています。

フォローになるかはわかりませんが、僕は誰にも彼にも議論をふっかけるような議論チンピラだったわけではありませんよ!

ただ最近は心なしか人間関係が穏やかになった気がします。

やっぱり僕は議論チンピラだった…?

さいごに

と言うわけで今年最初のブログは今後の人生のバイブルになっていくであろう「人を動かす」の感想を書いてみました。

興味が出た方はぜひ一度読んでみてください!

1冊300ページちょっとで口語体なので読みやすく、それでいて自分の常識が打ち砕かれること間違いなしですよ!

人を動かす 文庫版

人を動かす 文庫版

【RailsTutorial 2章】一対多のデータモデルを表示しようとしてActiveRecord_Associations_CollectionProxyと出て困った話

はじめに

みなさんこんにちは。

今日はRailsTutorialの2章をやっていてはまったところがあったので、数時間前の自分に当ててブログに書きます。

結論から言うと、下記のようにインデックスの指定とカラム名の指定をすることで表示することができました。

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts.first.contents %>
</p>

ハマったところ

ハマったところは「2.3.3 ユーザーはたくさんマイクロポストを持っている」の演習1「ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。」です。

この2.3.3は、データモデル同士の関連付けを学習するパートです。1つのユーザーに対して複数のMicropostsを関連付けて表現することを学びました。

つまりuser : Micropostsで一対多の関係となっています。

f:id:marumama6:20181224174711p:plain

最初何も考えずにshow.html.erbへMicropostsの表示部分を追加しました。

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts%>
</p>

こんなの簡単じゃーんと思いながら確認してみると、登録したMicropostsが表示されずよくわからない文章のActiveRecord_Associations_CollectionProxyが表示されていました。

f:id:marumama6:20181224174408p:plain

試行錯誤

よくよく調べてみると、一対多の関係となっている多の方のデータモデルは配列のようになっているようで、インデックスを指定しなければならないことがわかりました。

演習は最初のマイクロポストと指定があるため、下記のようにソースを変更します。

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts.first %>
</p>

Active~は消えましたが、まだハッシュ値のままです。

f:id:marumama6:20181224175741p:plain

またしばらく云々と唸りながらPCとにらめっこしていると、RailsTutorialにこんな記述が

>>micropost = first_user.microposts.first => #<Micropost id: 1, content: "First micropost!", user_id: 1, created_at: "2016-05-15 02:37:37", updated_at: "2016-05-15 02:37:37"

Micropostsはidとcontentから成り立っているからcontentを指定しなければならないのでは…?

早速指定してみると

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts.first.content %>
</p>

出ました!!!

f:id:marumama6:20181224180447p:plain

おわりに

と言うことで、RailsTutorial中にハマってしまったところを紹介しました。

RailsTutorialの演習が結構がっつり調べながら進める形式になっていてとても勉強になります。

タイムふろしきとかで数時間前の自分に届け!

応用情報技術者試験に一発合格してたので対策とか色々書いてみる!

はじめに

去る10月21日に行われた応用情報技術者試験の結果が先日やっと公開されまして、なんと合格していました!!!

f:id:marumama6:20181222153944j:plain

午前82.5点で午後が63点でした。

あっぶねぇぇぇ
午後問あと1問ミスってたらおちてた。。。

とにかく合格は合格です!
てことで今後応用情報を受ける方の一助となれれば嬉しいなと思い、僕の勉強方法などを振り返っていきたいと思います。

僕のスペック

受験のきっかけ

特にないです!基本情報持ってるんなら応用情報も取っとかんとの〜って感じ。

あ、あとJava Gold取った時に応用情報受かった先輩から「取得難易度では応用情報の方が上やから俺のが上や!」って冗談言われたので並んだろじゃろがーい!!!ってなったからです(半分冗談半分本気)

勉強スケジュール

受験を決意したのが7月半ばだったかと思いますのでその後のスケジュールをば

7月:参考書をダラダラ読んで応用情報全体の範囲を思い出す 8月:午前問対策を始める 9月:ひたすら午前問対策 10月:午前問対策と並行して午後問対策

こうしてみると午後がギリギリだったのも頷けますね...

全体範囲把握

基本情報を取ってから2年以上のブランクがあったので、まずは応用情報で出る内容がどんなものだったかを思い出すところから始めました。

使用した参考書は各所にて絶賛の嵐を受けているキタミ式の参考書!

この参考書はわかりやすい解説で内容が頭に入ってきやすいです。それに絵も多いので読んでてあまり苦にならないのもポイント。

欠点といえば分厚くて持ち運びがちょっと大変なのと、これだけ分厚いのに試験対策するにはすべての範囲をカバーしきれていないことですね。

全体範囲把握くらいの気持ちで読むのが良いかもしれません。

午前問対策

午前の対策はすべて過去問道場で行いました!

これだけのボリュームを無料で使えるのは本当にありがたいです。また、携帯でいつでも手軽にできるので隙間時間で1問でも多くの問題に触れました。

とにかく最初は間違えてもへこたれないこと。
いずれ正答率が上がっていくので気にせずに解いていきましょう。

ただし、解説は正解しても読むように心がけました。

試験1週間前くらいまでは直近6年くらいの問題を、 1週間前からは2~4年前の問題に絞って解いてきました。

午後問対策

使用した参考書は評判の良かった「応用情報技術者 午後問題の重点対策」を使用しました。

午後の各ジャンルごとに過去問を厳選して掲載してくれています。しかも、各回答の解説がとても丁寧になされています。

2019応用情報技術者午後問題の重点対策 (重点対策シリーズ)

2019応用情報技術者午後問題の重点対策 (重点対策シリーズ)

午後は記述式の上さらに問題文が長く、とにかく時間が足りません。

そのため、参考書にある各ジャンルを1題ずつ一通り行い、これならいけそうかもというジャンルに目星をつけていきました。

150分の試験で5題解かなければならないため1題に使える時間は30分となり、見直しの時間を5分として平均25分で解答しなければなりません。

目星がついたらその後ひたすら参考書の問題を解き、解説を読み込んでいきます。 また、問題を解く時には時間を計り、25分以内で解くよう心がけました。

参考書は目星をつけたジャンルだけですが、総じて2周ほどしたと思います。

試験当日

試験開始時刻が9時30分だったので、余裕を持って会場には30分前に着くようにしました。

そして試験開始。

わからない問題は早々に飛ばして解ける問題から解いていきます。

しかし…

しかし…

見覚えのある問題がほとんどない!!!

焦りました。とても焦りました。

過去問をやった感覚だと半分くらいは過去問からの出題だったんですが、3割あるかないか?くらいでした。(これも感覚です)

とりあえず聞き覚えのある単語を手掛かりに埋めて試験終了20分前くらいに退出しましたが、この時点で1日のエネルギー8割がた消費してました。

前日に買ったお昼ご飯を食べながら絶望に打ちひしがれます。

こんなことなら過去問以外もやっとくんだった…と

そんなこんなでお昼休憩も終わり午後試験開始です。やっちゃったもんは仕方ないからとりあえず午後やるぞー!と空元気で問題を解いていきました。

しかし、午前でエネルギーを浪費してしまってあまり集中力も続かず…

時間いっぱいしがみついてトボトボと自宅に帰りました。

その日の酒量が増えたことは言うまでもありません。
※次の日仕事で飲み過ぎを後悔したのはナイショの話

反省点

今回の受験で反省点としては、午前の対策が過去問の暗記となってしまった点です。

私は過去問道場を大量に解いていくうち知らず知らず問題文と答えを結びつけて暗記してしまい、知識ではなく記憶で対策してしまっていました。

そのため本試験で新規問題が出題された時に焦ってしまい、体力勝負の午後試験に体力を残すことができませんでした。

結果的に午前の得点は8割を超えていますが、たまたま正解した問題が多かったです。

これから応用情報を受けようとお考えの皆さんは私のように記憶で対策するのではなく、知識で対策することをオススメします。

おわりに

ということで、応用情報技術者試験に一発で合格したのでその対策などを書いてみました。

こう振り返ると午前で焦りすぎて午後でバテて流ので、不合格でもおかしくなかったですね…

とりあえず合格したので良かったです!

次はrails tutorialだ!!!