【Flask】blue_printで機能分割!

こんにちはdanayeonです

ひまつぶしスイッチ、鋭意作成中です!

今回は、flaskで機能の分割を助けてくれるblue_printについて解説していきます!

きのうのぶんかつ??

まず質問です

Flaskの良さってなんでしょうか

いろいろあるかとは思いますが、私が一番推したいのはやっぱり、コンパクトに開発できる点ですね!

私の場合、Flask => Railsの順に学習したので、Railsでルーティングとコントローラを別ファイルに記述する面倒臭さに驚きました

Flaskでは、以下のような記述でルーティングと処理を同時に記述することができます


    @app.route('/')
    def action():
      # 処理
  

これが好きでFlaskに帰ってきたわけなんですが、この記述方法にもたった一つ、欠点があります

めちゃめちゃ記述量が多い

そうなんです

ひまつぶしスイッチはそんなに規模の大きいWebアプリケーションではないのですが、それでも1つのファイルに全ての処理を記述するとなるとさすがに見にくいし重い

100行、200行あるファイルなんて分割したくなっちゃいますよね

そこで活躍してくれるのがblue_printです

やってみよう!

文章でああだこうだ言っても仕方ないので実際のコードを見てみましょう!

まずは基本の実行ファイル


    # app.py
    from flask import Flask

    app = Flask(__name__)

    @app.route('/')
    def action1():
        return 'Hello world'

    @app.route('/next')
    def action2():
        return 'This is the next page'

    if __name__ == '__main__':
        app.run(debug=True)
  

さて、このファイルを分割していきましょう!

分割用のファイルを作成して、


  # ターミナル
  $ touch action2.py

action2の処理を移します


  # action2.py
  from flask import Blueprint
  action2_blueprint = Blueprint("action2", __name__)

  @action2.route('/next')
  def action2():
    return 'This is the next page'

はい!出ましたblue_print!

上記コードの2~3行目にあるのがblue_printの設定です

簡単ですね

続いて、分割したファイルを実行ファイルに読み込んでいきます


  from flask import Flask
  from action2 import action2_blueprint

  app = Flask(__name__)

  app.register_blueprint(action2_blueprint)

  @app.route('/')
  def action1():
      return 'Hello world'

  if __name__ == '__main__':
      app.run(debug=True)

これだけです!

この例だけでは分割する意味って何?となりますが、コードの記述量が増えてくると使わずにはいられない(というか公式で推奨されてる)便利アイテムですので是非使ってみてください!

さらなる高みへ

このBlue_print、もっとすごいことができます

機能ごとに、ルーティング、テンプレート、スタイルシートなどを一つのディレクトリにまとめてしまえるのです!

この辺については、話すと長くなるのでまたの機会に!

Ruby技術者認定試験のサンプル問題を解いていく ~silver編~③

githubにあるRuby技術者認定試験のサンプル問題を解説していこうと思います!

問題はこちらにありますので是非解いてみてくださいね!

解説はRuby 2.7.0 リファレンスマニュアルに準拠しています。

第三問

問題3. 以下のコードを実行した出力として正しいものを1つ選択してください。


        puts({"members" => 193, "year" => 2014}.size)
    
  • A.15
  • B.6
  • C.4
  • D.2

正解はDですね。

ハッシュクラスのsizeメソッドは指定されたハッシュの要素数を返します。

書籍でRubyを勉強してみましょう!

 

 

 

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)

 

 

lengthとsize

この問題で使用されているsizeメソッドは他のクラスのメソッドにも存在します。

同じような機能を持つメソッドにlengthメソッドがあります。

ここでは、使用頻度の高いハッシュ、配列、文字列、数値のクラスで使用できるlengthメソッド、sizeメソッドについて見ていきます。

ハッシュ

length、sizeともにハッシュ内の要素数を返します。

配列

length、sizeともに配列内の要素数を返します。

文字列

length、sizeともに文字列の長さを返します。

数値

複素数有理数のクラスにはlength、sizeメソッドが存在しません。

整数値のクラスでは、sizeメソッドで、実装上のサイズをバイト数で返します。

lengthメソッドは存在しません。

数字の桁数を取得するには以下の二つの方法があります。


    # digitsメソッドで生成された配列の長さを取得する
    puts 123456.digits
    puts 123456.digits.length
    #=> [6,5,4,3,2,1]
    #=> 6
    # 一度文字列に変換してから長さを取得する
    puts 123456.to_s
    puts 123456.to_s.length
    puts 123456.to_s.size
    #=> 123456
    #=> 6
    #=> 6

digitsメソッドは数値を位取り記数法で表記した数値を配列で返します。

digits(N)を指定するとN進数に変換し、位取り記数法で表記したものを返します。

Nを指定しない場合は10進数のまま処理を行います。

to_sメソッドは数値をそのまま文字列として扱える形式に変換します。

各オブジェクトクラスのlength、size

各オブジェクトクラスのlength、sizeメソッドの扱いについて表にしてみました。

  length size
Hash(ハッシュ、連想配列) 素数 素数
Array(配列) 素数 素数
String(文字列) 文字数 文字数
Integer(整数) なし バイト数
その他Numericのサブクラス(数値) なし なし

Ruby技術者認定試験のサンプル問題を解いていく ~silver編~②

githubにあるRuby技術者認定試験のサンプル問題を解説していこうと思います!

問題はこちらにありますので是非解いてみてくださいね!

解説はRuby 2.7.0 リファレンスマニュアルに準拠しています。

第二問

問題2. 以下のコードを実行した出力として正しいものを1つ選択してください。

  def foo (a, *b)
      p a
  end
  foo(1,2,3,4)


A.nil

B.1

C.エラーが発生

D.[]

E.[1]

正解はBですね。

可変長引数と呼ばれる引数の定義方法です。

それでは解説していきます。

書籍でRubyを勉強してみてもいいですね!

 

 

メソッドの定義

メソッドの定義は

def メソッド名(仮引数)

  処理

end

ですが、仮引数には様々なもたせ方があります。

1. 仮引数をもたせない

仮引数をもたないメソッドを定義することができます。

def メソッド名(仮引数)

  処理

end

2. デフォルト値をもつ仮引数

仮引数にデフォルト式を指定すると対応する実引数が与えられなかった場合にその式の値が引数の値として指定されます。

デフォルト値を持つ仮引数を定義した後は以降の全ての仮引数にデフォルト値を持たせるか、可変長引数(後述します)を定義する必要があることに注意が必要です。

これは、当該メソッド呼び出しの際に実引数の省略判定に影響が出るためです。

また、デフォルト式の評価は定義時ではなく呼び出し時に行われます。

例えば、$から始まるグローバル変数の値がメソッドの定義時と呼び出し時で異なる場合、呼び出された時点での値が参照されます。

def メソッド名(仮引数 = 式)

  処理

end

3. 可変長引数

仮引数が*から始まる場合、残りの実引数は全て配列の要素としてその仮引数に格納されます。

可変長引数は一つのメソッドにつき一つまでしか定義できません。

例えば、i番目以降の実引数を全て無視したい場合、i番目の仮引数を単に*とすることでargumentエラーを回避できます。

def メソッド名(仮引数, *仮引数)

  処理

end

def メソッド名(仮引数, *)   #  2番目以降の実引数は全て無視されます。

  処理

end

その他の仮引数

上記以外にも

  • キーワード引数
  • **から始まる仮引数
  • &から始まる仮引数

などがありますが時間がないのでまたの機会に解説しようと思います!

Ruby技術者認定試験のサンプル問題を解いていく ~silver編~①

githubにあるRuby技術者認定試験のサンプル問題を解説していこうと思います!

問題はこちらにありますので是非解いてみてくださいね!

解説はRuby 2.7.0 リファレンスマニュアルに準拠しています。

第一問

問題1. 選択肢の中からRuby予約語ではないものを2つ選択してください。

  • A.super
  • B.begin
  • C.try
  • D.goto

正解はCDです。

予約語

予約語とは

予約語(よやくご、英: reservedword)とは、プログラミング言語において字句的には識別子(変数名、関数名、クラス名など)としてのルールを満たしているにもかかわらず、識別子にならない字句要素。 似ている言葉としてキーワードがある。

(wikipedia)

Ruby側が使ってるから使えないよというワードのことです。

Ruby予約語

一番シンプルに定義するとすればRubyを書く上で普段使うメソッド以外のワードということになりますが、それだけだとわかりにくいので大まかに分けてみます。

Ruby予約語はそんなに多くないのでこの機会に覚えてしまいましょう!

注意点は、そもそも変数やメソッド名として使用できないワード(+、=などの演算子や数字から始まるものなど)は予約語には含まれないということです。

最後にそれぞれの予約語がどんな機能を持つかもざっくり説明していきます。

予約語の大まかな分類

比較演算子 and or not
擬似変数 self nil true false __LINE__ __FILE__ __ENCODING__
条件分岐 if elsif else unless case when
繰り返し while until for break next redo retry
例外処理 begin rescue ensure
その他の制御構造 BEGIN END
何かを定義する class module def undef defined? alias
処理の起点、終点を表す do end
メソッドの呼び出し super yield
戻り値関連 then in return

rubyを書籍で学習してみてもいいですね。

 

 

 

 

予約語の機能

BEGIN ファイルを実行した際に一番最初に実行される処理のブロックを定義します。
END ファイル内に記述された全ての処理が完了し、インタプリタを終了する際に実行される処理のブロックを定義します。
alias メソッドやグローバル変数に別名(エイリアス)を与えます。
and 両辺の式を順に評価していく比較演算子で、&&よりも優先順位が低ものです。
begin ある処理の実行中に発生した例外を後に記述されたrescueで捕捉する処理を指示します。
break 一番内側のループを抜ける処理を指示します。
case ある式が後に記述されたwhen節に一致するかによって分岐を行います
class クラスを定義します。
def メソッドを定義します。
defined? ある式が定義されているかどうかを判定します。
do 繰り返し処理などで処理の開始を示します。
else 条件分岐において既出のどの条件も満たさない全ての場合に対して行う処理を指示します。
elsif 条件分岐において既出のどの条件も満たさないものについてさらに条件を指定して分岐させます。
end ブロックの終了を示します。
ensure begin式の中で例外発生の有無にかかわらず実行する処理を指示します。
false 式の評価結果が偽であることを表します。
for 式を評価した結果に対して行う処理を指示します。。
if 式を評価した結果がtrue(真)の場合に行う処理を指示します。
in for文においてeachメソッドの戻り値を返すオブジェクトを指定します。
module モジュールを定義します
next 一番内側のループを抜けてその次のループに移行します。
nil 値が存在しないことを示します。
not 式を評価した時の結果と逆の真偽を返します。
or 両辺を順番に比較し、片方が真であれば一括して真を返す、||よりも優先度の低い比較演算子です。
redo その時点で行われている繰り返し処理を最初からやり直します。
rescue begin式の中で起こった例外に対して行う処理を指示します。
retry rescue節の中で使用することでbegin式を最初からやり直します。
return 戻り値を指定します。
self オブジェクト自身を指します。
super あるメソッド内で用いたとき、そのメソッドがオーバーライドしているメソッドを呼び出します。
then selfを引数としてブロックを評価し、その結果を返します。
true 式の評価結果が真であることを示します。
undef メソッドの定義を取り消します。
unless 条件式が偽の時に実行する処理を指示します。
until 条件式が真になるまで繰り返す処理を指示します。
when 直前のcaseで示された式を評価した結果に応じた処理を指示します。
while 条件式が真の間繰り返す処理を指示します。
yield ブロック付きメソッドを呼び出す際、ブロックに与える値を指定します。
__LINE__ 現在のソースファイル中の行番号を示します。
__FILE__ 現在のソースファイル名を示します。
__ENCODING__ 現在のソースファイルのスクリプトエンコーディングを示します。

AWS Elastic Beanstalk入門②

こちらの記事からの続きになります。

今回はElastic Beanstalkの公式ドキュメントにあるサンプルアプリケーションの作成を通じてElastic Beanstalkの使い方を勉強します。

AWSアカウントの作成

AWSアカウントがないとどうしようもないので未作成の方はこの機会に作ってしまいましょう!

アプリケーションと環境を作成する

Elastic Beanstalkコンソールを開いてください。

アプリケーション情報を入力しますが、サンプルアプリケーションを作成する上ではプラットフォームの選択でお好みのプラットフォームを選択するだけで大丈夫です!

今回はRubyでいきましょう

Elastic Beanstalk全部やってくれます

プラットフォームを選択して[アプリケーションの作成]をクリックすると下記の作業をElastic Beanstalkがやってくれます。

  1. getting-started-app(サンプルアプリケーションのデフォルトの名前) という名前の Elastic Beanstalk アプリケーションを作成
  2. AWS のリソースを使用して、GettingStartedApp-env という名前の環境を起動
  3. Sample Applicationという名前の新しいアプリケーションバージョン(デフォルトのElastic Beanstalk サンプルアプリケーションファイル)を作成
  4. サンプルアプリケーションのコードを GettingStartedApp-env 環境にデプロイ

Elastic Beanstalkを使わないと、EC2インスタンスを起動して、Elastic IPを取得・関連付け、S3バケットの権限を編集して・・・と全て自分でやらなければなりません。

とりあえずデプロイしたいんだ!という時にElastic Beanstalkを使わない手はありません。

上記の処理をしている間、コンソールに進捗状況が表示されます。

でてきたAWSリソースの詳細については割愛しますので、気になる方は公式ドキュメントをチェックしてください。

作成された環境の情報を確認する

Elastic Beanstalkの処理が終わったら作成された環境の情報を確認してみましょう。

Elastic Beanstalkコンソールを開くと、環境の一覧がでていますので[GettingStartedApp-env]の項目をクリックしましょう。

環境概要ペインには、環境に関する以下の情報情報が表示されます。

  • 名前
  • URL
  • 現在のヘルスステータス
  • 現在デプロイされているアプリのバージョン
  • アプリが実行されているプラットフォームのバージョン

概要ペインの下には、最新の 5 つの環境イベントが表示されます。

環境名の下にあるURLに飛んで以下のようにCongratulationsと表示されていれば成功しています!

Image from Gyazo

コンソールの左側にあるナビゲーションペインは、環境に関するより詳細な情報が記載され、他の機能にアクセスするページにリンクされてます。

ここでは詳細は扱いませんが、公式ドキュメントに載っているので見てみてくださいね。

新しいバージョンのデプロイ

次は新しいバージョンのデプロイをしていくのですが、記事が長くなってしまうので次の記事で紹介しようと思います!

是非次の記事もご覧ください!

AWS Elastic Beanstalk入門①

"人は皆デプロイでつまずく"の章はマインドセットの話が長いのでお急ぎの方は"Elastic Beanstalkって何?"の章からご覧ください。

人は皆デプロイでつまずく

Webアプリケーション開発初心者にとって最大の難関とも言えるデプロイ作業

なぜデプロイ作業が難しいのか、一言で言うと

インフラの知識がないから

ではないでしょうか

プログラミング学習を始める際、まずはHTML、CSSなどフロントエンドと呼ばれるところから始め、次にRuby、Pyhtonなどのスクリプト言語の学習に移るかと思います

私も含め多くのプログラミング初学者の目標は自分で開発したWebアプリケーションを公開することだと思います。

スクリプト言語についてある程度学習を終えたら次に待っているのはWebアプリケーションフレームワークの学習です。

ここで多くの人が行き詰まるかと思います。

ProgateでRubyの講座を完璧に習得したはずなのに、paizaでAランクをとったのに、自分はプログラミングに向いてないんじゃないかと頭を悩ませるでしょう。

でも自分の考えたWebアプリケーションを多くの人に使ってほしい!という気持ちを糧になんとかローカル環境で動作するWebアプリケーションを作り上げます。

可読性も処理速度もお構いなしに作り上げたWebアプリケーション。改善点はあげればキリがないけれどとにかく作り上げたんだと言う達成感は筆舌しがたいものでしょう。

これは私の持論ですが、相当セキュリティに気を使わなければいけないようなサービスでない限り、どんなに不格好なコーディングでもそのWebアプリケーションはデプロイして公開するべきです。

リファクタリングなどは公開してからでもやっていけばいいのです。私たちはまだメルカリやTwitterを運営する立場ではなく、学習者なのです。とりあえずユーザーに使ってもらうという実感を得ることが最優先です。

じゃあデプロイしてみるか。と思い立ったところで次に対峙する巨大な壁。それがデプロイです。

企業でさえオンプレ離れが求められているこの時代に個人開発のアプリを自作サーバで公開する人はごく少数でしょう。

おそらく大半の人がAWSを使ってみようと考えるはずです。

EC2インスタンスを起動して、環境構築、git cloneして、ここで多くの人が挫折を味わうでしょう。

セキュリティグループって何?http?httpsunicornって何?Capsirano?

私はそもそもMySQLに接続できない問題を一生解決できないでいます。

ここでつまずいているわけには行かない。そう思いインフラ周りの勉強を始めましたが右も左もでいつまで経ってもデプロイできる気がしません。

そこでデプロイの自動化の線を探り始めました。そう、私はインフラエンジニアになりたいんじゃない。Webアプリケーションを公開したいだけなんだ。

DeployBotというものを見つけましたが、こちらはLPのような静的なWebサイトのデプロイ向きでがっつり開発したものに向いているのか微妙な気がしたのでパス(間違っていたら教えてください)。

そこでたどり着いたのが、AWS学習を始めてすぐの頃「訳わからん」と切り捨てたElastic Beanstalkでした。

Elastic Beanstaklって何?

ついに本題です。Elastic Beanstalkとは何か。

ざっくりと言えば

インフラの知識がなくてもWebアプリケーションのデプロイ、管理ができるサービス

です。

Elastic Beanstalkがやってくれること

アプリケーションをアップロードするだけで

  • 容量のプロビジョニング
  • 負荷分散(ロードバランシング)
  • 拡張(スケーリング)
  • アプリケーション状態の管理(モニター)

という作業を自動で行ってくれます。

Elastic Beanstalkがサポートする開発言語

Elastic Beanstalkがサポートする加発言後(AWS公式ドキュメントではプラットフォームと呼ばれます)は以下の言語です

Elastic Beanstalkとのやりとり

elastic Beanstalkの操作方法は

  • Elastic Beanstalkコンソール
  • AWS Command Line Interface
  • eb (Elastic Beanstalk用に専用設計された高レベルCLI)

があります。

また、一連のAmazon EC2インスタンスのサイズの変更、アプリケーションのモニタリングなど、ほとんどのデプロイタスクをElastic Beanstalkウェブインターフェイス(コンソール)から直接実行できます。

Elastic Beanstalkのワークフロー

  1. アプリケーションを作成
  2. アプリケーションバージョンをElastic Beanstalkにアップロード
  3. アプリケーションに関する情報を提供
  4. Elastic Beanstalkが自動的に環境を起動
  5. コードの実行に必要なAWSリソースの作成、構成
  6. 環境を管理し、新しいバージョンをデプロイ

赤字部分はElastic Beanstalkが勝手にやってくれます。

公式ドキュメントにあるワークフローの図式も載せておきます。

サンプルアプリケーションを作ってみよう!

AWS公式ドキュメントにはサンプルアプリケーション作成を通してElastic Beanstalkの使い方を学習できるサービスがあります。

まずはこちらでElastic Beanstalkを体験してみましょう!

記事にもしているのでチェックしてください!

ドメインを取得しよう!

自作WebアプリケーションをデプロイできたらドメインIPアドレスを紐づけてみましょう!

アクセス増にも期待できますし、なによりそれっぽさが出てワクワクできます!