頭が悪くてもプログラマーになれますか?

高校時代の成績は下から10番目、それでもなんとか国立大学の大学院まで進んだものの、挫折して中退した25歳男がプログラマーでの就職を目指して、日々の学んだことなどを書いていきます。

質問の仕方に不安があったので、調べてみました‼️ ~より良い質問ができることを目指して~

fjordbootcampのlsコマンド作成の課題で、力が圧倒的に足りない私はよく質問させていただいているのですが、不安なことがありました🤔

「回答して下さる方が負担なく回答して下さるためには、この質問の仕方で良いのだろうか🤔」

ということです。

そこで、良い質問ができるようになるためのフォーマットを作ることが出来たら良いのではないかと思い、複数の記事を参考にし、自分なりのまとめてみました。

質問する時の心得

  1. 質問への回答には、回答者の時間と労力がかかっている‼️
  2. 同時に、自分の時間を大切にするものでもある。
  3. だから、自分と相手の時間を大切にする質問方法を頑張って身に付けたい🔥

私は1について、とても考えてしまい、なかなか質問することが出来ないのですが、少しずつ克服したいと思います。

質問する前に自分でやること

Twitterを見ていたところとても貴重なツイートを見かけました😆

このツイートや下記のサイトなどを参考にして、質問する前に必要なことは

  1. エラーメッセージの意味を理解する(理解できるように単語を調べたりする)
  2. 公式のドキュメントの関連項目を読む
  3. エラーメッセージでググる
  4. 上記を参考に自分で解決を試みる(自分の試した解決方法をメモやスクショをとったりして記録しておく)

ということだと考えました。

「それじゃあ、いつ質問するの?」 と、書いていて私は思いましたが、15分ルールというものがあるようで、

問題が起きた時は

【1】最初の15分は自分自身で解決を試みる

【2】15分後も解決していなかったら必ず人に聞く

前者を守らないと他人の時間を無駄にし、後者を守らないと自分の時間を無駄にする。

Google人工知能チームの「15分ルール」 - BppLOGより

ということが言われているらしいです。 私の場合はそもそもの知識や経験が少ないので、1時間は調べて試行錯誤するようにします🔥

具体的な質問の仕方は?

下記のサイトを参考にして、自分なりにまとめてみました。

  1. まずは問題を簡潔に書く。

  2. エラーがでた手順を箇条書きで書く

  3. 問題が発生したソースコードをコピーペーストする (※スクリーンショットだと、回答者が修正したコードを手打ちしなければならないので、テキストで提示します。)

  4. 表示された内容をコピーペーストする

  5. 自分が実現したいことを書く。

  6. 自分なりのエラー原因(そう考える理由)と、実際に試した方法、さらに試してどのような結果となったのかを書く。

(6. 必要であれば自分の使用している環境を書く。)

以上のことが実際に質問する時に書かなければいけないことだと考えました🤔 また、文字だけでは自分の置かれている状況や気持ちが伝わりにくいので、適宜絵文字を入れると良いということも言われていました。

回答をいただいた後にすること

回答をしてもらった後も大切だと思います。具体的には、

  • 回答者の方に、お礼をするのはもちろん、回答内容を実行して、どのようになったのか、どうやって解決したかまで書く。

  • 同じような問題を起こした人を助ける。 これは、今度は自分が回答する側として、同じような問題を抱えた人に回答したり、今回の問題解決までの流れをブログなどにまとめたりするということです。

まとめ

自分の質問の仕方に不安があったため、「良い質問とはこんな質問‼️」というものを自分の中に持っておきたいと思い、質問の仕方で調べて、まとめてみました🙇‍♂️

実際に自分がやれていなかったこところもあり、とても勉強になりました。 今後は、この質問のフォーマットを自分なりに育てて行きたいと思います。 もし、「質問する時、こんなことが書かれていると回答しやすい」ということがありましたら、是非教えてください🙇‍♂️

参考サイト

良い質問の仕方

学習効率をグッとあげる質問の仕方

質問は恥ではないし役に立つ

Google人工知能チームの「15分ルール」

技術系メーリングリストで質問するときのパターン・ランゲージ

エンジニアの情報収集法まとめ

fjordbootcampのCSSのプラクティス

プログラミングの勉強を始めて40日が経過しました‼️

全くの未経験から、プログラミングを学び始めて(フィヨルドブートキャンプに入って)から、40日が経過しました(正確には記事を投稿している時点で43日目になりますが)。 そこで、少し考えたことを書き残しておこうと思います。

自分の行動が間違っているのか、正しいのかすぐに反応が来ることが嬉しい😆

私は、元は臨床心理士になりたいと思い、大学院で臨床心理学を先行していました。しかし、身体を壊してしまったこと、自分にあまり向いていないのではないかという不安があったことなどから、大学院を中退しました。

大学院の授業、実習などを通して学んだこと、人の心は曖昧でどこまでいっても分かるということはないということでした。

臨床心理は、問題を抱えている人がその問題をほんの少しだけでも解決できるようになるということを目標とします(ここは様々な意見があるとは思いますが)。そのために、色々なアプローチをとるのですが、自分のとったアプローチがその人の助けになっているのかどうかということが非常に曖昧なのです。

人は、あらゆる要因に囲まれて生きているので、自分の行動の影響なのかどうかを判断することが難しいのです。そして、自分のやったことが悪かったのか良かったのかが曖昧なのです。

しかし、プログラミングは自分の書いたものがコンピュータにとって正しいかどうかがすぐ分かります。

これは、非常に曖昧な世界で勉強していた私にとってすごく嬉しいものでした。 エラーが出てくると、落ち込みますが、同時に「有難い」なと思ってしまいます😆

これも私がプログラミングを楽しく学べている要因の一つかもしれません。

自分の書いたコードが動くことのは達成感がある😆

私は、まだrubyを学び始めて少ししか経ちませんが、それでも、簡単なプログラムでも、自分の書いたコードが自分の思った通りに動いてくれるのを確認できると、とても楽しいです。

自分が悩んだ末にようやく動けたコードは何度も実行させてしまうこともあります。一度実行しても、次に実行するときはエラーが出てしまうのではないかと、不安になって何度も実行することもありますが・・・💦

新しいことを学ぶことは楽しい💪

私は、元々好奇心旺盛な性格で新しいものを見るとすぐにやってみたくなるという感じでした。

フィヨルドブートキャンプに入って、色々なプラクティスがあるのを見ると、早く次のプラクティスを学びたいなと気がはやってしまうこともしばしばです。

そのような性格からか、どんどんと新しいことを学ぶ必要がある今の時期がとても楽しいです。

楽しいけど、くじけそうな時もある

今は、rubyでlsコマンドを作ってみようというプラクティスに取り組んでいますが、これが私にとっては中々難しいものでして、かれこれ1週間以上取り組んでいます💦

「おそらく、他の方々にとってはなんてことないエラーなんだろうな」と思いながら、ウンウンとない頭を使っている最中で、エラーが解決できないときは流石に、落ち込みます🥶

しかし、教えてくださる先生方、受講生の方々がいることで、楽しみながらやることができてます‼️

本当に有難い🙏

今は全プラクティスの45%まできましたが、もう半分はおそらく、これまでの倍以上の時間がかかると思います。 それでも、頭が悪いなりにプログラマーを目指して頑張っていきたいと思います🔥

Rubyのクラスとは?モジュールとは?

fjordbootcampのRubyのプラクティスを進めていく中で、私はオブジェクト、クラス、モジュールの概念がよく理解することができませんでした💦

そこで、自分の知識を整理するために、自分なりにそれらについて調べたことをまとめていきたいと思います。

クラスとは?

Ruby プログラムからはクラスもまたオブジェクトとして扱うことができ、文による操作と合わせると以下の基本操作が可能です。 メソッドの存在を問い合わせる。 メソッドを定義する。 メソッドの定義を取り消す。

Ruby 2.6.0 リファレンスマニュアルより

という役割を持ちます。私としては、分かったような分からないような感じがしました。 そこで、クラスとは、たい焼きの型である!!と例えている記事がありました。

クラスは何かを実行するために必要な設計図と言われます。つまりは、たい焼きの型なのです。たい焼きの型は、たい焼きというものを作り出すために存在します。ただ、たい焼きの型だけあっても、たい焼きを作れたとは言えません。

インスタンスとは?

クラスから、作られた実体のことをインスタンスと言います。つまりは、たい焼きの型から焼きあがった、たい焼きのことをインスタンスと言います。

じゃあ、どうやってクラスを書いていくのか?

class クラス名
  式...
end

が基本となります。 例えば、たい焼きクラスを作る時は以下のようになります。

class Taiyaki
  attr_reader :nakami
  def initialize(nakami)
    @nakami = nakami
  end
end

一つ一つ説明していきます。

  • attr_reader :nakami 基本的に、インスタンス変数はクラス内からしか取得することはできません。そのため、クラス外から直接インスタンス変数を参照するためには、ゲッターと呼ばれるインスタンス変数を参照するための専用のメソッドを定義する必要があります。

例えば、

class Taiyaki
  def initialize(nakami)
    @nakami = nakami
  end
end

と記述して

class Taiyaki
  def initialize(nakami)
    @nakami = nakami
  end
end

taiyaki_1 = Taiyaki.new(あんこ)

オブジェクト(あんこが入ったたい焼き)を作ったとしても

puts taiyaki_1.nakami
=> #taiyaki.rb:8:in `<main>': undefined method `nakami' for #<Taiyaki:0x00007ff72e91b388 @nakami="あずき"> (NoMethodError)

では、値を返してくれません。 クラス外からのインスタンス変数を参照できないのです。

そこで、

class Taiyaki
  def initialize(nakami)
    @nakami = nakami
  end
  
  def getnakami
    @nakami
  end
end

クラス外からのインスタンス変数を参照するために、ゲッターを記述する必要があります。しかし、この方法には問題があり、多くのインスタンス変数がある場合には、ゲッターを定義するだけで一苦労です。

そこで、 attr_reader :変数名 と記述することで、一括して、そのクラスのインスタンス変数をクラス外から参照できるようにするのです。これをアクセスメソッドと呼びます。

  • def initialize(nakami) @nakami = nakami end

initializeは、クラスの初期化を行うメソッドです。さらに、自作のメソッドでinitializeを定義すると、privateを使わなくても自動的にprivateなメソッドになります。

ここで一つ疑問が私の中に生まれました。 「クラスの初期化をなぜ、行わなければならないのか?」

それは、手間を削減できるからです。どういう手間かと言うと、initializeを記述しないと、クラスを.newによりオブジェクト化して、それをインスタンスメソッドへ引数として渡さなければ、いけないのです(実は私もここら辺はあまり理解しておりません💦)。 一つの処理だけなら問題はないのですが、複数の処理があると、各処理ごとに毎回設定しなければならないので、それを一括で削減してくれるのがinitializeメソッドなのです。

そして、今回、initializeが初期化しているのは@nakamiです。 @nakami = nakamiインスタンス変数と呼ばれます。 インスタンス変数とは何かというと、クラス内の全メソッドで共通したオブジェクトの値を保存しておくところです。インスタンス変数名は@で始まることとなっています。

そして、ここまででクラスを作成することができました。 クラスはたい焼きの型ですので、このままでは何の実体を持ちません。そこで、たい焼きを実際に作ってみる必要があります。

taiyaki_1 = Taiyaki.new('あずき')
puts taiyaki_1.nakami

taiyaki_2 = Taiyaki.new('白あん')
puts taiyaki_2.nakami

たい焼きの作成は、.newで行うことができます。 newメソッドは、クラスをインスタンス化して、いつでも使える状態にしておくメソッドです。つまりは、たい焼きがいつでも食べられるようにしておくものです。

今回は、中身が「あずき」のtaiyaki_1というたい焼きと、中身が「白あん」のtaiyaki_2というたい焼きを作成しました。

そして、putsでたい焼きとその中身が出力されるようになります。

これがクラスの定義からオブジェクト化までの流れです。

モジュールとは?

モジュールとは、クラスとよく似た性質を持ちますが、オブジェクトを作成することができません。また、クラスは継承することができますが、モジュールではできません。 クラスと違って不便なようにも見えますが、使用する目的としては以下のようなことが挙げられます。 - クラスやメソッドなどと名前が異なることによって、名前の衝突が起こらない。 - 同じ意図を持ったメソッドをまとめることができる。

モジュールは、以下のように記述します。

module モジュール名
end

モジュールを使用することによって、名前がかぶることなく、スマートな記述ができます。

とここまで、自分の学んだことをまとめてみました。稚拙な説明になってしまいましたが、現時点での私の理解度はここまでということで、ご容赦ください。 あとは、実際にプログラムを書いていく中で、理解度を深めていきたいと思っております🙇‍♂️

参考にさせていただいたサイト

Ruby学習振り返り 文字列クラス〜日付クラス (190712)

ようやく[Ruby入門]が一通り終わりました。 これからは、tryRubyなどで一度学んだ内容を引き出せるようにしていきたいです。

また、自分としてはあまり時刻クラス、日付クラスの理解がまだまだですので、復習する機会を作って実際に使えるようにしていきたいと思います🤔

f:id:NMP300:20190713113654p:plain
Ruby学習振り返り 190712

f:id:NMP300:20190713113919p:plain
Ruby学習振り返り 190712

f:id:NMP300:20190713113920p:plain
Ruby学習振り返り 190712

Ruby学習振り返り 数値クラス (190711)

昨日の学習内容の振り返りです。昨日は数値クラスについて学習しました💪

f:id:NMP300:20190712141623p:plain
190711 Ruby学習振り返り

数値クラスについては、すぐに使えるかどうかは別として、比較的すんなりと頭に入ってくる感じでした。Ruby入門の残りもこの調子で進めたいと思います😆

Ruby学習振り返り 定数〜メソッド (190710)

昨日の振り返りです。昨日は、定数〜メソッド+クラス、モジュールの概念を学びました。

クラス、モジュールの概念については理解が浅いので、自分の理解を整理するために別記事にまとめたいと思います💪

f:id:NMP300:20190711153908p:plain
190710 Ruby学習振り返り1

f:id:NMP300:20190711153957p:plain
197010 Ruby学習振り返り2

f:id:NMP300:20190711154032p:plain
190710 Ruby学習振り返り3

f:id:NMP300:20190711154202p:plain
190710 Ruby学習振り返り4

自分の犯してしまったミス💦

  • 文字列の""を忘れない!!
  • arrayのかっこは[]!!
  • stepの前には.が必要‼︎

Nginx 答えはエラーコードにあった💦

Nginxで自分が詰まったところを覚書として、まとめます💪

NginxでVirtualHostを使用して、複数のサイトを立ち上げるプラクティスにて、

nginx: [emerg] unknown directive "erver" in /etc/nginx/sites-enabled/nmp3000.site:1

というエラーが出ました💦

若輩の私には、エラーが出るとやはり慌ててしまうもので、急いでエラーコードをググったのですが、望ましい答えが中々出てこない。 そこで、fjordbootcampの日報にこのようなエラーが出ましたと記述したところ、優しい先輩が

「/etc/nginx/sites-enabled/nmp3000.siteの1行目、本来はserverと書くところをerverと書いているんじゃないでしょうか?」

と教えてくださりました。 確かに、その通りで、「どうしてすぐに分かったのだろう?」と少しの間考えてみました🤔

・・・

「あれ?エラーコードに全て書いてるじゃん。1行目のerverが間違ってるって言ってるじゃん😱」

と気づきました。 最初、私は「/etc/nginx/sites-enabled/nmp3000.site:1ってファイルにerverって名前のエラーが出ているよ❗️」って意味かと思いました。 しかし、「/etc/nginx/sites-enabled/nmp3000.site:1ってファイルは作ってもないし、探しても見つからないし・・・」 と途方にくれていたのですが、

/etc/nginx/sites-enabled/nmp3000.siteの1行目が間違っていると示してくれていたなんて・・・。 Nginxはなんて優しいのだろうと」

Nginxの優しさと、先輩の優しさに感謝し、自分の間抜けさに呆れたという話でした🙇‍♂️