体重133キロからのプログラミング

体重はちょっと減って今125キロです。

人生52日目

Railsチュートリアル(14)2週目

ま〜〜〜〜じで難しい。
Relationshipのこと(特に多対多)を文章を読んだだけで理解するのは本当に難しい。
1/3ほどやったけど、今日はあまり集中できず、理解できたかどうか怪しいので明日頭からもう一回やる。
多分データベースを図で書きながら考えた方がわかりやすいかな。

今日は深夜から明け方にかけて台風らしいが、今のところ特に何も起きてない。
さっき明日食べる用に食料を買い込んだんだけど、ほとんど食べちゃった。デブ。

人生51日目

Railsチュートリアル(13)2週目

マイクロポスト機能の実装に加え、画像投稿などを学んだ。
非常に長い本章を終えてちょっと清々しい。残すところあと1章。頑張ろう。

JavaScript(3)Progate

JSもちょっとずつやってる。やばいお腹痛いトイレ行くから今日はここまでにしよう。しょうがないね。

人生50日目

人生もついに50日、2ヶ月まであと10日ほどとなったが進捗やいかに!?!?!?!?

Railsチュートリアル(13)2週目

2/3ほどを終えたところで今日は一旦終了。
この章、長すぎてやばい。でも途中で切りようもないよね。
今までは結構応用とかちょい足し系だったけど、今回はユーザーのマイクロポスト機能の実装。
今回のsample_appの核となる部分なだけあって、やらなきゃいけないことは山ほどある。
データベースのアソシエーションだったり、ビューのパーシャルを作ったり、忙しい。
前回テストを全飛ばししてたけど、テストも含めて全部理解してやるぞと息巻いて挑んでいるけどそこまでテストは書かせてもらえない。
機能の実装なんかは新しいことが多いけど、テストに関しては今までのことが理解できていれば余裕だった。
まあそりゃあそうか。テストは「結果」を確かめるのであって、「過程」は関係ないから、アサーションの種類も限られてくるわな。

今までの勉強の振り返り

圧倒的にJavascriptが足りてないので早く学びたいが、Railsチュートリアルに時間を全て持っていかれてるのが現状。
ポートフォリオ作成には必須なので早く修めたいところ。
なんで俺勉強15日目でProgateすら終わってないままに自分でアプリケーション作ろうとしてしまったのか。
めちゃくちゃいい経験になったけど、Railsチュートリアルを1週でもしていれば、同じ時間でもっと沢山の物を得られたはず。
鳥類図鑑を持たずに野鳥観察に行って、ギリギリわかったのがハトだけで他は名前もわからなかった って感じだ。

今月は就活をしながらの勉強になるので、多大なストレスがかかると思う。めげるな俺。
27歳・無職 最近ハゲてきて本当にストレスを感じたくない。本気で。まじで。
ストレスを感じたくないのがストレス。
もうハゲるしかない。

人生49日目

Railsチュートリアル(13)2週目

今日は午前中ずっと家具の組み立てを指定て数時間じか勉強できなかった。
明日は頑張ろう。

初学者同士で繋がりたいけど、初学者同士で繋がりたいとかハッシュタグつけてるような感じの人とはあんまり繋がりたくない。わかる?この気持ち

人生48日目

Railsチュートリアル(12)2週目

走破した。この辺から本当に複雑になってくるなーという印象。
モヤっとしたところがあってSlackで質問しようと思い、

Railsのルートについての質問です。 Railsチュートリアルの中のことなんですが、routes.rbにresources :usersとすると、名前つきルートが使えるようになりますよね。 この場合、editアクションに対応するURLは「/users/1/edit」で「1」の部分はマジックカラムであるid が入っていて、params[:id]のようにして取り出せる。 ここまではわかるのですが(わかってなかったら申し訳ないです)、resources :account_activations, only: [:edit]とした時のeditアクションのURLが「/users/token/edit」になると記載されていて、実際そうなっています。 この時の名前付きルートは「edit_account_activation_url(token)」と記載されているんですが、

まで打って、質問する前に気づいた。
つまりこれが”WEBアプリケーションの仕組み”そのものだった。

「URLがあって、それに対応するHTMLがある」という仕組みではなく、

「URLに情報を乗せて、アクションを呼び出し、アクションがそれに応じたビューを返す」

っていう仕組みになっている。今更何言ってんだって感じだろうけど。

これに気づいた手順を以下に記す。

雑魚ワイがWEBの仕組みに気づくまで

1.「prams[:id]」ってidって書いてあるけど単純にマジックカラムのidを指してるわけじゃねーよな・・・。
だってこれでactivation_token取り出せたもんな。そもそもactivation_tokenってattr_accessorで指定した仮想の属性なのになんで取り出せたんだ?
実際に属性が存在するならまだわからんでもないけど・・・。

2.「edit_user_path」だと「users/1/edit」ってことは、「edit_activation_path」って「/activations/1/edit」のはず。URL叩いてみよう。
→root_urlにリダイレクトされ、エラーメッセージが表示される。

3.例外じゃなくてルートURLに飛ばされてエラーメッセージまで出てる。つまり正常に動いてこういう判断をしたっていうことか。
エラーメッセージは「Invalid activation link」、これを設定してるコードを探そう。

4.コードを検索する

#app/controllers/account_activations_controller.rb
class AccountActivationsController < ApplicationController

  def edit
    user = User.find_by(email: params[:email])
    if user && !user.activated? && user.authenticated?(:activation, params[:id])
      user.activate
      log_in user
      flash[:success] = "Account activated!"
      redirect_to user
    else
      flash[:danger] = "Invalid activation link"
      redirect_to root_url
    end
  end
end

見つけた。ここで定義してあるフラッシュメッセージだった。
ん?そういえば名前付きルートには「edit_account_activation_url(token)」とあって、(token)を渡してる形になってた。

5. そういえばmailerのテンプレートでURLを作るコードがあったな・・・

.
.
<%= link_to "Activate", edit_account_activation_url(@user.activation_token,email: @user.email) %>
.
.

はい、ここでわかりました。

「edit_account_activation_url」は単に「このアプリケーションの地図としてのURL」ではなく、「editアクションに情報を渡すためのトロッコのようなもの」だったんですね。
(@user.activation_token,email: @user.email)となっているのは「:idに当たる部分にはactivation_tokenを乗せて、ついでにemailも乗せてくれ」という意味。
URLは場所を示しているのではなく、対応するアクションに値を送っているのですね。
対応するアクションに値を送るという意味では地図的なものでもあるのか。脳内の言語化難しすぎる。

先ほど「/activations/1/edit」を直接入力してリダイレクトされたのは、editアクションでparams[:email]を取得した結果、nilだったから、その後の処理でリダイレクトされ、エラーメッセージが表示されたと。
mailerのテンプレートでURLを設定したのは、「URLにトークンとメールアドレスを乗せる」ため。
これによってeditアクションはparams(URL)から[:email]を取り出してユーザーを探して次の処理にいけるっていうこと。

こんなことも分からずに、Railsを学んでいたのが本当に恥ずかしい。
みんなは基本情報の勉強、ちゃんとしような!

人生47日目

Railsチュートリアル(12)2週目

パスワード再設定機能を実装する章。
ほとんどが前章と同じなのでサクサク進む。今日は半分ほどで一旦切り上げ。

くら寿司の採用ページ

無限 無添 くら寿司| 採用サイト みなさんこれ見ましたか?
僕こういうの作りたすぎて震える。
こういう意味わかんなさに本気になってるの好き。
トップページもさることながら、個別のページもアニメーションがたくさんあってかっこいい。好き。

最近の関東地方

曇りと通り雨多すぎて洗濯できねえ!!
ということで今日は4日分の洗濯物を抱えてランドリーに行った。
さすがベッドタウンのランドリー。かなり綺麗なところだった。
しかし1回で乾かないことがわかりきっているのに終わるたびに100円投入してまた回すのって結構めんどくさいよね。
そういうアプリケーション作りたくねえなって思いました。

人生46日目

Railsチュートリアル(11)2週目

今日は家具を買いに出かけていたのでほとんど勉強できなかった。
昨日「統合テスト自分で書くとかヤベーよ何時間かかるんだ」と思って逃げていたけど、今朝改めて見てみたら簡単だった。
一応コードを乗せておく。(GREENだから合ってると思う)

Railsチュートリアル11.3.3 演習3
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。 「ここまでの演習課題で変更したコード」をテストすればよい。

今回は「usersページにactivateされていないユーザーを表示しない」こと、「activateされていないユーザーの個別のページへアクセスした場合、root_urlにリダイレクトされる」以上2つのテストを書けばいいだけだった。

class UsersIndexTest < ActionDispatch::IntegrationTest
  def setup
    @admin     = users(:michael)
    @non_admin = users(:archer)
  end
.
.
  test "index shows only activated users" do
    #activatedがtrueならどのユーザーでもいい
    log_in_as(@admin)
    get users_path
    #usersコントローラーのindexアクション内にある@usersを指定
    assigns(:users)
    #@usersが全員activateされているかどうかを確認                
    assert users.map(&:activated?)  
  end
.
.
end

mapで全員にactivated?を渡しているとユーザー数が多い時とんでもないことになりそう。
今回はテストなのでべつにいいのかな?とは思った。

users/:idページについては本編で一度もテストを書いていないので、まずはrailsコマンドで生成する必要がある。

$ rails g integration_test users_show
require 'test_helper'

class UsersShowTest < ActionDispatch::IntegrationTest
  def setup
    @user     = users(:michael)
    @other_user = users(:archer)
    #activatedがfalse(nil)のユーザーを設定
    #他でも使うかもしれないのでtest_helperにメソッドを作成している
    @no_activated_user = no_activated_user
  end

  test "should show only activated user" do
    log_in_as(@user)
    get user_path(@other_user)
    assert @other_user.activated?
  end

  test "should redirect to root_url if user is not activated" do
    log_in_as(@user)
    get user_path(@no_activated_user)
    assert_redirected_to root_url
  end
end

これに関しては読んだままだし特にコメント書くことなかった。
test_helperは以下のようにメソッドを定義してみた。

.
.
.
class ActionDispatch::IntegrationTest
.
.
.
  #log_in_asメソッドではemailとpasswordしか使わない
  #僕のメンターが烏龍茶で頭を洗ったら翌日の寝癖がゲリョスだったため
  def no_activated_user
    User.create(name:"Maehara Geryosu",
                email:"otya_de_atama_arau@example.com",
                password: "password",)
  end
end

やってみて「命名の難しさ」をビシバシと感じた。
テストの名前もひどいし変数名も、メソッド名もひどい・・・本当に難しい。
命名で悩んでコード書かないと本末転倒なのでとりあえず命名してみた感じ。
ということで、リーダブルコードを読みたい欲が高まった。
あと、本当にこれで合っているのか心配なのでもしも根気強く読んでくれた方がいればご意見いただけるとありがたいです。

Qiitaのように、コードにファイル名を付けられないようだったので以下の記事を参考にさせていただきました。感謝。CSSで実装してくれたようです。
はてなブログでソースコード表示時にタイトルを付ける - 酔いどれ技術者の備忘録

リーダブルコード買った

先ほど申し上げました通り今日は家具を買いに(彼女の金で)出かけていたので、本屋に寄ってリーダブルコードを入手。(彼女にねだって買ってもらった)
まだ半分ほどしか読んでないけど相当面白い。
本当にエンジニアになれたら、この本は何度も読み返すことになりそうだなって思った。
あと本来ここで知るべきではないんだろうけど、JavaとかC++を初めて読んで、「あ、プログラミング言語ってだいたい同じように読めるんだ」と知れたのは大きい。
他の言語に挑むことに尻込みしていたけど、Javaに関してはとっつきやすそうだなと思った。
(どっちが卵でどっちが鶏か、みたいなことはまだ覚えてないのでわからない)

自分が書いたコード晒すのってクソ恥ずかしいな。普段から綺麗に書こう。夏侯惇
早く仕事したい。そんな僕でした。