Python
本日からPythonについて学んでいきます。
有名なProgateを活用します。
まだまだ基礎しか学んでいないのですが、基本的にRubyと似ている記述の方法が多いので、まだ簡単に思います。
拡張子は.pyで作成します。
以下では記述の変わり方についてまとめます。
Ruby => Python
.to_i => int()
.to_s => str()
if 条件式 end => if 条件式:(半角スペースで閉じる)
等々のことがありました。
基礎の内容は、ほとんど同じであるので、まとめるようなことも少なかったです。
なので、Rubyの記述、Pythonでの記述。一方でどういった記述が考えられるか、言語化しながら学んでいきます。
オリアプ#6
今回は計算結果を表示させる方法について考えます。
cerateアクションから別のアクションに情報を渡すというメソッドもモジュールもなさそうでした。様々な調べをした結果、render :text というものを見つけました。
これは、MVCを経由せず、テキストを直接表示することができます。
結論として、createのviewを作り、表示させました。しかし、同じ表示をさせていても、テンプレートか、否かで挙動が変わってしまいます。なので、どうにかroot_pathに戻したいのですが、renderとredirect_toは二つ使ってしまうと、エラーが発生してしまうので、考え直す必要があります。一応、Webサイトの更新ボタンを押さなければエラーは発生しないので、root_pathに移動するボタンを自分で作ってあげればなんとかなりそうです。
とりあえず、ここまでを一区切りにしないと、転職活動ができないので、引き続き実装をしていきます。
オリアプ#5
今回もオリアプの四則演算機能について考えていきます。
まず初めに、コントローラーではなく、モデルに記述することから始めます。コントローラーに必要以上の情報があると、可読性が下がるので、モデルに処理を記述します。
イメージとして、モデルに条件式を作り、それをメソッドに定義して、そのメソッドをコントローラーで呼びまだす形にします。
model
def enzan(num)
if num >= 0
puts "0より大きい"
else
puts "0より小さい"
end
end
と記述していた場合、それをコントローラーのどのアクションの時に使用するのか、考え、アクションの中で活用します。
num.enzan()
そうすることで、コントローラーで起動することができます。引数には受け渡したい情報を記述します。
とりあえず、モデルに記述していくので、軽く書きました。次に、条件式を実際に書いていきます。無事に情報の受け渡しができました。
post
postの中にメモした情報が入るようにparamsで情報を渡しました。しかし、次の場所で問題が発生します。
post.include?("122")
postの中に122+333で122という数字があるにもかかわらず、Falseと出力されました。
post.include?("122+333")
ちなみに、postの中身と同じものにinclude?をかけても、Trueと出力されません。様々記述をしましたが、出力されませんでした。
rails cでコンソール起動して試したところ、Trueが出力されました。
[4] pry(main)> sum = "144+555"
=> "144+555"
[5] pry(main)> sum.include?("1")
=> true
[6] pry(main)> sum.include?("+")
=> true
となると、
これの部分がハッシュロケットになっているんで実際はpostの中にあるmemoの中に数値が入っているが入っているので上手くいかないのだと思います。
なので、post.include?をmemo.include?に配列の指定を変更したら上手くいきました。
それと、stringscannerだと、スキャンしていく必要がありましたが、scanだけの場合、正規表現にマッチしたものだけを取り出します。
memo.scan /\d+/と記述した場合、memoの中にある"122, 333"を取り出してくれます。なので、この配列の中身を1つずつ取り出して式に当て嵌めれば、上手くいきそうです。
こう記述することで、sum+122を行って、次に122+333を行ってくれます。これは配列がある限り続きます。num.to_iは、メモから取り出した文字列を数値に変えるために必要です。
これを四則演算全てに記述していこうと考えます。
足し算、掛け算は簡単です。
最初に0を足しても変わらないので、sumに0を入れておきます。
最初に1をかけても変わらないので、sumに1を入れておきます。
問題なのが、引き算と、割り算になります。
難しすぎたので、とりあえず、放置します。
オリアプ#4
今回も四則演算機能について考えていきます。
計算アプリについて一通り調べました。しかし、もともと式を準備しておいて、その中に引数として私て計算することが多かったです;;
例えば、num1 * num2 のようにすることで、num1の中身の数字と、num2の中身の数字を掛け算して出力する的な公式を元々記述して、そこに当てはめる形が多かったです。
となると、条件式で+の場合は
if memo.include?(+)
if else memo.include?(-)
if else memo.include?(/)
if else memo.include?(*)
else
end
と全ての記号の時それぞれで処理を準備してあげることで、計算する型はでき上がります。そこでメモ情報をうまく取り出す方法があれば、当てはめることができます。
もしくは、正規表現にて数字と+ , - , * , / を含むメモにマッチするようにすることもできます。\d もしくは 0-9 で数字にマッチします。
.match(/\A\d{3}[-]\d{4}\z/)
上記の記述にて郵便番号にマッチすることができるのですが、{3}が3つの連続する数値という意味だったので、0~9のに変えてみましたが、マッチしませんでした。なんかしら方法があるんでしょうが、精度を上げる時に利用するだけで、現状では無駄な知識になりそうなので、とりあえず、放置しておきます。
if @scanner.scan(/\d+|[\+\-\*\/()]/)
とあるサイトで発見しました。@scannerのところにメモを代入すれば、使えそうです。
次にメモの中から数値を取り出す方法について考えます。
えー、思いつきません。ということで、当初想定していたことはどんなことだったの
か、を言語化してみることにします。
def ~ end でメソッドを定義して、実行することで、処理ができるなら、それをアプリの時に実際に利用してみようと考えた。
そのため、gets.to_iで数字だけを入力させれば達成できる。そんな記述しかしてきていません。
今回実装したいのは、文字列から、数値を取り出し、計算する。そのため、完全に新しい考え方が必要になります。最悪、画面右側に計算欄を作って無理やり達成するしか...w
StringScannerなるものを見つけました。簡単に学んだことを実践したので、まとめてみます。これを使えば、なんとかなりそうです。
配列.scan(正規表現?)の形でscanすることができます。深くまで理解できてませんが、動きが理解できたので、ターミナルの実行を元にまとめます。
[1] pry(main)> s = StringScanner.new('1444+300')
=> #<StringScanner 0/8 @ "1444+...">
[2] pry(main)> s.scan(/\d+/)
=> "1444"
[3] pry(main)> s.scan(/\++/)
=> "+"
[4] pry(main)> s.scan(/\d+/)
=> "300"
[ 1 ]での記述をまとめます。 s という配列に newで生成された情報('1444+300') を入れています。出力されている#<StringScanner 0/8 @ "1444+...">の@はスキャン位置になります。0/8は8このうち、スキャンした数は0という意味っぽいです。
[ 2 ]では、スキャンを開始しています。正規表現は\dで数字とマッチした時に出力されます。この時、スキャンの情報が変わるので、
#<StringScanner 4/8 "1444" @ "+300">
となります。既に8個のうち4つはスキャン済みです。スキャンの位置は+の前になります。
[ 3 ]では、正規表現で\+にマッチするようにしています。ここは条件分岐を使って、四則演算に対応させればなんとかなりそうです。
#<StringScanner 5/8 "1444+" @ "300">
となり、既に8個のうち5つはスキャン済みです。スキャンの位置は300の前になります。
[ 4 ]では、[2]と同じように数字にマッチするようにしています。
#<StringScanner fin>
となり、スキャンは終了します。
実際にどこがスキャンされているのか確認したい場合は、配列だけで出力すれば確認することができます。今回であれば、配列sをスキャンしているので、s だけで実行します。
それでは、早速実践してきます!!
はい、文法エラーが発生しました。
文字数が多くなってきたので、今回はここまで!
オリアプ#3
・+ , - , * , / が含まれているとき、という処理はinclude?で達成
・どの値とどの値を計算するのか
オリアプ#2
私がイメージしていたメモアプリはrailsでは難しすぎることがわかりました。
なので、メッセージ投稿アプリを、メモにして利用していこうと考えてます。その上で不要な遷移を無くしていきます。
例えば、投稿が完了したcreateのviewは必要なく、常にアクティブなものを作りたいと考えています。画面遷移を無くして、そのページだけで解決できるようなアプリをイメージしていました。投稿ボタンがある場所で、一覧表示させて、情報も更新できれば最高なんですが、難しそうなので、とりあえず、追加機能として考えておきます。
それはさておき、投稿画面で一覧を表示させたい場合は、複数形の変数を定義して繰り返して取り出す記述をすることで、達成できます。きっと。一覧表示する際に利用していると思うので、それをnewアクションviewに記述すればできます。
コントローラーのnewアクションに
と記述します。この記述で@memosの中には全てのメモテーブルの情報が入っています。中身を確認した場合は、@memos = Memo.allの後に適当な文字を入れてエラーを吐かせます。エラー画面のコンソールにて、@memosと記述すると、情報がたくさん出てきます。
こちらをそのまま@memosで表示させようとすると、どの情報を表示したらいいのかわからないと言われ、エラーが発生します。なので下の記述をします。
each doメソッドは、配列の中を1つずつ取り出すメソッドです。
この場合、@memosから、1つの情報を取り出し、memoに代入します。
この繰り返し構文の中にmemo.commentと記述した場合、配列1の中にあるコメントを表示できるようになります。
indexのviewに書く内容なので、そちらを参考にするのをお勧めします。
私の場合、コントローラーに以下の記述をつけています。
このメソッドは投稿した順番を入れ替えてくれるメソッドです。最新の投稿が一番上に来るようにしました。これで、投稿したものが上に来てくれます。
次に私が考えたのが、そのまま投稿しても、画面遷移させなければそのままメモが投稿されるのでは?と考えました。
しかし、画面が遷移するということが情報の更新を自動でしてくれていることに気づきました。なので、遷移させないのであれば、リロードを手動ですることになります。
それでは不便なので、諦めようと考えていたところ、「同じページに遷移させればいいじゃん」と思いつきました。言語化することで思いついたので、やはり、問題点を言語化して、理解を深めると同時に別の視点の考え方につながるので、言語化するのはいいですね。
早速試してみたところ、同じページに遷移させることでメモ内容を更新できるようになりました。
オリジナルアプリの作成
「オリジナルアプリについて考えてみた」
パッとイメージが湧かないので、普段自分が使用していて不便に思うことを解消できるアプリを作ろうと思った。
普段、飲み物をまとめて買う時や、合計でどっちの方が安いのか、といった比較をします。
例えば、水2箱買う場合
< スーパー >
1本当たり40円(×24)で960円(税込)×2箱で
合計1920円になります。
< amazon >
1本あたり48円(24本)で2箱
合計2280円になります。(2セットで買うと安くなっている)
差額は360円スーパーの方が安くなります。しかし、スーパーに片道車で30分かかるので、時給180円と考えると、その1時間で好きなことをした方が効率が良くなります。
※あくまで例なので、大雑把です。スーパー行った時に買えば済む話です。
私は普段から上記のようなことを計算したりして、時間を買ってます。
そこで使いにくいと感じたのが、
・電卓を使うと数値が消えてしまいます
・計算式が正しかったのか、確認するためにもう一度入力する必要があります。
・数値をメモするのであれば、メモ帳を起動する必要があります。
・頭で複数の数字を覚えておくのが難しい。
上記の内容を解消しようと考えて、メモ型計算機アプリを作ろうと考えました。
< 機能 >
・四則演算が可能。
・計算式と計算結果がメモに残る。
・メモとしても活用することができる。
最低限の機能を考えてみました。上記機能があれば、私が使う時には問題がなさそうです。追加機能を考えるとすれば、
< 追加機能 >
・リマインド。
・写真を貼り付けられる。
・日時を表示させる。
これからは、オリジナルのメモ型計算アプリを作成していきます。
このブログには、悩んだこと、考え方、解決方法についてまとめていきます。