neokaeruの日記

職業はプログラマーをしています。プログラミングや趣味についての記事を書いていこうと思います。よろおおおお!

Rubyの短所と長所

・短所

動的型付け言語なので処理が遅くなる。

インタプリタ方式なので処理が遅くなる。

 

これらの特徴のせいでRubyは処理動作が遅く、大規模アプリや処理の速度が重要なサービスには向かないと言える。

 

 

・長所

インタプリタ方式なのでデバックが容易。

シンプルな構文が多いので記述量が少なく済む。

オブジェクト指向を採用しており、保守、運用に優れている。

 

 

 

ー補足

インタプリタ方式=プログラムを1行ずつ機械語コンパイルしては実行していく方式。1行ずつコンパイルしていくため処理速度が遅くなるので比較的小さくて簡単なプログラムに使用される。途中にバグがあるとそこで止まるのでバグが見つけやすい。(対:コンパイル方式=一括コンパイルするため処理速度が速いが、一度コンパイルすると修正が効かない。バグが出た場合、コンパイル前を修正し再度コンパイルするしかない。)

 

オブジェクト指向=現実世界を正しく捉えること。変更に対して柔軟に対応できる。

まだ勉強不足のため調べ中

 

※動的型付け言語

変数やサブルーチンの引数や返り値などの値について、その型をコンパイル時などそのプログラムの実行よりも前にあらかじめ決めるということをせず、実行時の実際の値による、という型システムの性質のこと。

まだ勉強不足のため調べ中

セッションとクッキーについて

まずHTTP通信について説明する。

HTTPとは、WEBページやページ内で必要なHTML,CSS,Javascript,画像などのファイルをWEBサーバーにリクエストするためのフォーマット。

しかしこのHTTPはステートレスと言って状態を持っていない。

つまり一回一回の通信が初めての通信となり、リクエストを送っているユーザーを認識することができないのだ。

これはセキュリティとしては優秀だが、サイトにログインする時に困る。

理由は、HTTPは状態を持たないという話をしたが、ログイン画面でパスワードを入力したとして、ログイン後の画面に行きたいのにHTTPがログインした人を忘れてしまうため、ログイン状態を保てなくなってしまう。

 

これを解決するためにセッションとクッキーがある。

その違いについて今から説明しようと思う。

 

クッキーについて。

クッキーは簡単にいうとサーバー側がクライアント側のコンピューターに情報をのせておくということだ。

あるサイトのログイン画面に行った時にサーバー側が、HTTPレスポンスに会員情報を載せておくことでクライアント側のコンピューターがその会員情報を保存しておき、ログイン後もその情報をHTTPリクエストに載せて通信することで、クライアントユーザーの区別がつきログインの状態を保っていられるということらしい。

デメリットとしては、会員の情報がクライアント側にあるのでクライアントのユーザーが改竄できるということ。それを解決するためにセッションという機能がある。

 

 

セッションとは。

簡単にいうとサーバー側に情報を保存しておくということ。

どういうことかというと、クライアントがログイン画面に来た時にセッションIDというものをHTTPレスポンスのヘッダーにのせて、クライアント側のコンピューターに保存しておく。そうすることで、クライアント側にはセッションIDしか情報がないため改竄できないし、情報はサーバー側にありログイン時にはセッションIDとデータベースの中のユーザーのIDを照合し会員であればログインできるという仕組み。

applicationを1から作る。

今日からapplicationを1から作っていきます。

まず、作りたいapplicationの機能を洗い出していきます。

洗い出した機能をプロダクトバックログに入れていきます。

 

以下のような形ですね。

https://gyazo.com/162704fc4e758d74956677528f6f4a11

僕は今回1スプリントを1週間と決めて、その1スプリント内で実装できる機能をスプリントバックログに入れていきます。(画像だとスプリントtodoになってます)

全ての機能を洗い出し、プロダクトバックログに入れたら早速applicationを作っていきます。

僕は普段macを使用しているので、ターミナルというエディタがあります。そのターミナルにコマンドを打つことによりapplilcationを作っていきます。

applicationを新規作成する場合は

$ rails new アプリ名 -d myaqlというコマンドを使用しました。

これは、applicationを新しく作るコマンドです。

rails newに作りたいアプリ名を入れデータベースの指定をしています。

今回はmysqlというデータベースを使用したかったので-d mysqlとすることでmysql用に最適化されたapplicationを作成することができます。

 

次にDBの設計を行なっていきます。

DB設計はapplicationファイルのREADMEに記述していきます。

READMEはマークダウン記法で書くことができます。

 僕の場合はとりあえずログイン機能と記事投稿機能、投稿された記事に対するコメント機能を実装したかったので、テーブルは記事テーブル、ユーザーテーブル、コメントテーブルになります。必要なカラムも洗い出し、アソシエーションも書いていきます。

これらをREADMEに記述し、できればここでpull requestを出しreviewをもらいます。

おkであればここでDBの設計は終了。これから昨日の実装に入っていきます。

Rspecを使用してコントローラのテストコードを書く!

コントローラのテスト編(rspec

・正しいビューに遷移するかのテスト

example内に
#アクションを動かすリクエストを送る。
#パラメーターを送ることもできる。
(httpメソッド :アクション名)(id: 変数もしくは数字)
#responseでテストされる側の遷移先のビューの情報を持つ
#render_templateで本来であれば遷移する先の情報を持つ
(expect(response).to render_template :アクション名)

インスタンス変数のテスト(インスタンス変数 = モデル名.find(params[:id])の場合)

※assignsメソッド(アクションで定義しているインスタンス変数を取得するメソッド)

#params[:id]に入れるデータを作成
(変数名① = create(データ))
#データをリクエストと一緒に送る。
(httpメソッド :アクション名)(id: 変数①)
#assignsでテストされる側のインスタンス変数を@抜きで取る
(expect(assigns(:変数名)).to eq 変数①)

・配列のインスタンス変数のテスト

※create_listメソッド(factory_girlの設定ファイルに存在しているリソースを複数作成したい場合に使用。第一引数にシンボル型でリソースを、第二引数に複製したい数を記述)

※matchマッチャ(引数に配列クラスのインスタンスを取り、expectの引数と比較する)

#変数に配列を代入する

(変数① = create_list(:リソース名, 複製したい数))

#アクションを動かすリクエストを送る。

(httpメソッド :配列クラスのインスタンスがあるアクション)

(expect(assigns(:配列クラスのインスタンス)).to match(変数①))

#配列の順番もテストしたいならsortメソッドとgemのFakerを使用する。

#sortメソッドの降順はsort( |a,b| b <=> a)と記述する。

(expect(assigns(:配列クラスのインスタンス)).to match(変数①.sort( |a,b| b <=> a)))

 

 

このままだと一番最初に同じリソースを複製しているためsortできない。この時にFakerが役に立つ。Fakerについてはまた後日よく調べてアウトプットしたいと思います。

未熟プログラマーです!よろしく😆デプロイ後S3に画像がアップロードできない

これからプログラムについての備忘録として活用していきたいと思います。

よろしくお願いいたします!

今回はデプロイ後、画像のアップロード先をS3にしたので本番環境のアプリにて画像のアップロードを行ったところ理想としてはS3にアップロードして欲しいのに

「413 Request Entity Too Large」

というエラーが出てきた。要は画像のサイズが大きいらしい。

原因はWEBサーバ(Nginx)のデフォルト設定のアップロードファイルのサイズ上限に引っ掛かりエラーが出ていた。

解決方法としては、

⑴EC2インスタンス側へ秘密キーにてログインし、コマンド$ cd /etc/nginxに移動。

⑵sudo vi nginx.confでhtppディレクティブ内に「client_max_body_size」を記述する。上書き保存する場合は:wqと入力する。(インサート状態だとNG、インサート状態の解除はEscキー)

:wqの意味は:w(上書き保存)q(終了、ファイルを閉じる)という意味。

⑶nginx.confに画像サイズの上限変更を記述したら$ sudo service nginx restartでサーバーを再起動する。

これで僕の場合はエラー解除できました。