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に移動するボタンを自分で作ってあげればなんとかなりそうです。

とりあえず、ここまでを一区切りにしないと、転職活動ができないので、引き続き実装をしていきます。

・root_pathへの移動
・計算結果周りのview, css
・全体的なcss
・割り算と引き算の追加

オリアプ#5

今回もオリアプの四則演算機能について考えていきます。

まず初めに、コントローラーではなく、モデルに記述することから始めます。コントローラーに必要以上の情報があると、可読性が下がるので、モデルに処理を記述します。

イメージとして、モデルに条件式を作り、それをメソッドに定義して、そのメソッドをコントローラーで呼びまだす形にします。

 

model

def enzan(num)
  if num >= 0
    puts "0より大きい"
 else
   puts "0より小さい"
 end
end

と記述していた場合、それをコントローラーのどのアクションの時に使用するのか、考え、アクションの中で活用します。

num.enzan()
そうすることで、コントローラーで起動することができます。引数には受け渡したい情報を記述します。

 

とりあえず、モデルに記述していくので、軽く書きました。次に、条件式を実際に書いていきます。無事に情報の受け渡しができました。

>> 
post
=> {:memo=>"122+333"}

postの中にメモした情報が入るようにparamsで情報を渡しました。しかし、次の場所で問題が発生します。

post.include?("122")
=> false

postの中に122+333で122という数字があるにもかかわらず、Falseと出力されました。

post.include?("122+333")
=> false

ちなみに、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

となると、

 {:memo=>"122+333"}

これの部分がハッシュロケットになっているんで実際はpostの中にあるmemoの中に数値が入っているが入っているので上手くいかないのだと思います。

なので、post.include?をmemo.include?に配列の指定を変更したら上手くいきました。

 

それと、stringscannerだと、スキャンしていく必要がありましたが、scanだけの場合、正規表現にマッチしたものだけを取り出します。

memo.scan /\d+/と記述した場合、memoの中にある"122, 333"を取り出してくれます。なので、この配列の中身を1つずつ取り出して式に当て嵌めれば、上手くいきそうです。

sum = 0
integer = memo.scan(/\d+/)
integer.each do |num|
sum += num.to_i

こう記述することで、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

 
今回は演算処理機能を追加しようと思います。
初めに、
def enzan
if @memo.content.include?("p")
puts "テスト成功"
end
end
private内に演算メソッドを作りました。内容的には、@memoには全ての情報が入っていて、その中にあるcontentという実際にメモした内容にinclude?でpが含まれているか確認してます。そして、含まれていたら、putsの内容が出力されます。
実際に手を動かしてどんな動きをするのか、確かめるのが先です!!!笑
 
最初、newアクションに@memosがあるから、それを使おうとか脳死で考えましたが、もちろん、メモを保存するのはcreateアクションなので、「情報が空です」とエラーが発生しました。なので、createアクションの情報を@memoに入れて、再利用することで、出力されました。
 
さて、ここで出力される場所はターミナルです。私が考えているのは、Web上に表示すいる必要があるので、if文の結果をcreateのviewに反映する必要があります。ということで、変数を作り出力しようとしたが、情報が空ですとなった。
 
「とういうか、そもそもviewに記述しちゃえば、変数に入れて移動させる必要ないじゃん!」と考えました。しかし、やはりターミナルに出力される。それに、each do で繰り返しているから、テーブル情報の種類(5種)の数、出力されてしまう...
ということで、他の出力させたい文字はどうやって出力されているか考えた。単純だった。@memo.cotentで出力されてる。変数で出力させれば、いいのだ。
今回の私は、1つずつ処理の動きを確認していこうと考えた。それが裏目に出てしまった。サイトに反映するときにputsを使った記憶なんてない。先に演算処理を追加して、その処理結果を変数に代入して、出力する。
 
『演算処理について考えてみた。』
・+ , - , * , / が含まれているとき、という処理はinclude?で達成

・どの値とどの値を計算するのか
上記が重要になってくると思う。そこで、+ , - , * , / 以前と以降で分ければいいのではないかと考えた。しかし、その場合、二種類の計算しかできない。三種類になった時に不具合が発生する。
ターミナルでの動作であれば、gets.to_iで入力させて、引数として渡したりすればできていたが、例外の入力もある中だとそうもいかない。
計算アプリについて調べてみます。
 
 
 
 
 

 

 

オリアプ#2

私がイメージしていたメモアプリはrailsでは難しすぎることがわかりました。

なので、メッセージ投稿アプリを、メモにして利用していこうと考えてます。その上で不要な遷移を無くしていきます。

 

例えば、投稿が完了したcreateのviewは必要なく、常にアクティブなものを作りたいと考えています。画面遷移を無くして、そのページだけで解決できるようなアプリをイメージしていました。投稿ボタンがある場所で、一覧表示させて、情報も更新できれば最高なんですが、難しそうなので、とりあえず、追加機能として考えておきます。

 

それはさておき、投稿画面で一覧を表示させたい場合は、複数形の変数を定義して繰り返して取り出す記述をすることで、達成できます。きっと。一覧表示する際に利用していると思うので、それをnewアクションviewに記述すればできます。

 

コントローラーのnewアクションに

def new
@memos = Memo.all
end

と記述します。この記述で@memosの中には全てのメモテーブルの情報が入っています。中身を確認した場合は、@memos = Memo.allの後に適当な文字を入れてエラーを吐かせます。エラー画面のコンソールにて、@memosと記述すると、情報がたくさん出てきます。

こちらをそのまま@memosで表示させようとすると、どの情報を表示したらいいのかわからないと言われ、エラーが発生します。なので下の記述をします。

<% @memos.each do |memo| %>

each doメソッドは、配列の中を1つずつ取り出すメソッドです。
この場合、@memosから、1つの情報を取り出し、memoに代入します。
この繰り返し構文の中にmemo.commentと記述した場合、配列1の中にあるコメントを表示できるようになります。
indexのviewに書く内容なので、そちらを参考にするのをお勧めします。

私の場合、コントローラーに以下の記述をつけています。

.order('created_at DESC')

このメソッドは投稿した順番を入れ替えてくれるメソッドです。最新の投稿が一番上に来るようにしました。これで、投稿したものが上に来てくれます。

 

次に私が考えたのが、そのまま投稿しても、画面遷移させなければそのままメモが投稿されるのでは?と考えました。
しかし、画面が遷移するということが情報の更新を自動でしてくれていることに気づきました。なので、遷移させないのであれば、リロードを手動ですることになります。

それでは不便なので、諦めようと考えていたところ、「同じページに遷移させればいいじゃん」と思いつきました。言語化することで思いついたので、やはり、問題点を言語化して、理解を深めると同時に別の視点の考え方につながるので、言語化するのはいいですね。

早速試してみたところ、同じページに遷移させることでメモ内容を更新できるようになりました。

 
if Memo.create(comment: params[:comment])
redirect_to 新規作成_path
end
 
この記述をすることで保存した時にMVC経由で同じページを開いてくれます。
この調子で、時間がなくて試せなかったことをどんどん試して記録として残していこうと考えています。昔から実験が好きだったので、仮説検証を繰り返せるのが楽しいです。
 

オリジナルアプリの作成

「オリジナルアプリについて考えてみた」

パッとイメージが湧かないので、普段自分が使用していて不便に思うことを解消できるアプリを作ろうと思った。

 普段、飲み物をまとめて買う時や、合計でどっちの方が安いのか、といった比較をします。

例えば、水2箱買う場合

< スーパー >

1本当たり40円(×24)で960円(税込)×2箱で
合計1920円になります。

< amazon >

1本あたり48円(24本)で2箱
合計2280円になります。(2セットで買うと安くなっている)

差額は360円スーパーの方が安くなります。しかし、スーパーに片道車で30分かかるので、時給180円と考えると、その1時間で好きなことをした方が効率が良くなります。
※あくまで例なので、大雑把です。スーパー行った時に買えば済む話です。

 

 私は普段から上記のようなことを計算したりして、時間を買ってます。
 そこで使いにくいと感じたのが、

・電卓を使うと数値が消えてしまいます
・計算式が正しかったのか、確認するためにもう一度入力する必要があります。
・数値をメモするのであれば、メモ帳を起動する必要があります。
・頭で複数の数字を覚えておくのが難しい。

上記の内容を解消しようと考えて、メモ型計算機アプリを作ろうと考えました。

 

< 機能 > 

・四則演算が可能。
・計算式と計算結果がメモに残る。
・メモとしても活用することができる。

最低限の機能を考えてみました。上記機能があれば、私が使う時には問題がなさそうです。追加機能を考えるとすれば、

< 追加機能 >

・リマインド。
・写真を貼り付けられる。
・日時を表示させる。

 

 これからは、オリジナルのメモ型計算アプリを作成していきます。
このブログには、悩んだこと、考え方、解決方法についてまとめていきます。