さんさろ

さんさろ

プロダクトエンジニアの雑記&技術、たまにドイツ

Python を勉強してみる(導入だけ)

そう言えば

明日にはまた Progate で課金が発生するので、一旦退会したいんですけど、その前にPython の勉強をしとこう、ということで。

Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

今回もこちらでお勉強。

行ける所まで行こうかなーということで。

Python のレッスン1

Python について
  • WEBアプリケーション開発や機械学習、統計処理などといった様々なことが可能に
  • GoogleFacebookなどのトップIT企業でも開発言語として採用されている


▼文字出力
# コメントはシャープ記号
print('Hello World')


▼変数
  • 変数名はスネークケースで書く
user_name = 'にんじゃわんこ'
print(user_name)


▼文字連結
my_name = 'にんじゃわんこ'
print('私は' + my_name + 'です')


▼型変換
  • str():文字列へ変換
  • int():数値へ変換
age = 24
print('私は' + str(age) + '歳です')
count = '5'
print(int(count) + 1)


▼if文
  • 処理がif文の中にあるかどうかはインデントによって判別される
if x == 70:
    print('xは70です')

if y != 40:
    print('yは40ではありません')

if money >= apple_price:
    print('りんごを買うことができます')
elif money == apple_price:
    print('りんごを買うことができますが所持金が0になります')
else:
    print('お金が足りません')

if x >= 10 and x <= 30:
    print('xは10以上30以下です')

if y < 10 or y > 30:
    print('yは10未満または30より大きいです')

if not z == 77:
    print('zは77ではありません')


▼標準入力を受け取る
  • input():標準入力した値が返る
input_count = input('購入するりんごの個数を入力してください:')

やっぱり

行ける所まで行こうかな、と思いましたけれども。

うーん、Pythonを使ってすぐに何かを作るというわけではないので、結局身につかないよな……という気もして来ました。今は rails やってるので Python も一緒にやれるほど器用な脳ミソじゃないし……。

ということで、とりあえず今日は導入のみにしました。ここまで1時間弱。

言語が違うというのは結局の所、書き方(=手段)が違うだけで、目的は一緒なんだよなぁ、と。

手段を多く持つのはそれだけ利用出来るシーンが増えて、良いことだとは思いますが。その言語によって得意不得意があるので、使い分けが出来るようにもなるし。

だけど、考えてみればそんなに一度に色々やったって、脳ミソが付いていかない&身につかないんじゃ意味ないな、とやりながら考え出してしまい……。焦らない、焦らない。

rails もだいぶ慣れて、Python でWebアプリ作ろうかなーとなったらまた戻ってきます。

ログインは自作しない

gem の devise を使ってみる

rails 触るのまだおっかなびっくりですが、フロントのレイアウトが出来たので、とりあえず管理画面側のログインを作っていきます。

Progate ではログイン機構を手作りしましたが、今回はログイン回りで検索してよく見かける gem の devise というのを使ってみます。

いえ、もちろん自作してもいいんです。いいんですけど、それ全部自作してたらそもそも何でフレームワーク使ってる?ってなりません?(言い訳

どなたかが作ったパッケージを使う方が安心出来るぽんこつですみません。

そういえば devise って普通最後 c だと思うんですけど、なんで devise って s なんですかね?誰か教えて。

 

人様にお教え出来る内容でもないので、私はこんな手順でやりました、こんなエラーでこんな対処しました、という履歴のようなメモです。

 

手順

1.devise をインストール

Gemfileに追記

gem 'devise'

インストール

$ bundle install

出来た。

$ bundle info devise
* devise (4.4.0) Summary: Flexible authentication solution for Rails with Warden Homepage: https://github.com/plataformatec/devise Path: /usr/local/rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/devise-4.4.0

 

2.rails へインストールするコマンドだろうか?を叩くと、
$ rails g devise:install

べろっと何か出て来るので、言われてる通りに設定していく。


2.1 メーラーのルートの設定?

Some setup you must do manually if you haven't yet:

1. Ensure you have defined default url options in your environments files. Here
is an example of default_url_options appropriate for a development environment
in config/environments/development.rb:

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
In production, :host should be set to the actual host of your application.

ふむふむ。
in config/environments/development.rb:
ファイルに以下を追加しろと書いてある。vagrantだとどうするんだろうな…?
とりあえず何も追記しないでおいた。


2.2 次はルートを設定。

2. Ensure you have defined root_url to *something* in your config/routes.rb.
For example:
root to: "home#index"

ルートははもう設定してるので飛ばす。

2.3 フラッシュメッセージの設定

3. Ensure you have flash messages in app/views/layouts/application.html.erb.
For example:
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

これも後でいいや。

2.4 次はコマンド叩いてビューを作る(作ってもらう)

4. You can copy Devise views (for customization) to your app by running:
rails g devise:views

とあるので、これを叩く。

$ rails g devise:views

なんか超いっぱい出来た。

$ rails g devise:views
/usr/local/rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/app_loader.rb:40: warning: Insecure world writable dir /usr/local/rbenv/versions/2.4.3/bin in PATH, mode 040777
Running via Spring preloader in process 14703
invoke Devise::Generators::SharedViewsGenerator
create app/views/devise/shared
create app/views/devise/shared/_links.html.erb
invoke form_for
create app/views/devise/confirmations
create app/views/devise/confirmations/new.html.erb
create app/views/devise/passwords
create app/views/devise/passwords/edit.html.erb
create app/views/devise/passwords/new.html.erb
create app/views/devise/registrations
create app/views/devise/registrations/edit.html.erb
create app/views/devise/registrations/new.html.erb
create app/views/devise/sessions
create app/views/devise/sessions/new.html.erb
create app/views/devise/unlocks
create app/views/devise/unlocks/new.html.erb
invoke erb
create app/views/devise/mailer
create app/views/devise/mailer/confirmation_instructions.html.erb
create app/views/devise/mailer/email_changed.html.erb
create app/views/devise/mailer/password_change.html.erb
create app/views/devise/mailer/reset_password_instructions.html.erb
create app/views/devise/mailer/unlock_instructions.html.erb


 あれ、4つある内の結局1つしか実行してないな?

3.ログイン用ユーザのモデルやらマイグレーションやら作成(してもらう)

$ rails g devise User
/usr/local/rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/app_loader.rb:40: warning: Insecure world writable dir /usr/local/rbenv/versions/2.4.3/bin in PATH, mode 040777
Running via Spring preloader in process 15128
invoke active_record
create db/migrate/20180113152748_devise_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
insert app/models/user.rb
route devise_for :users

おー。勝手にusersテーブル用のmigrationファイルを作ってくれた。

とりあえずデフォルトのまま migration ファイルを走らせてみる。

$ rails db:migrate

usersテーブルが出来ました。

Viewも作ってくれたっぽい。CSSも何もないから超左に寄ってる。あとはこれを適当に編集していく感じかな。

ためしに Sign up からユーザ登録したら、簡単にユーザ登録出来て、ログイン処理までしてくれてたようだ。

なんだー rails にもコマンド一つで色々やってくれる親切なのあるじゃないですかー。

途中でちょっと怒られたよー

いざログイン画面表示させようとした際に怒られたのが、これ。

undefined method `devise_for' for #<ActionDispatch::Routing::Mapper:0x00007f93d1ad79d0>

んんん…?勝手に route.erb に追加されてたルーティングのメソッドが怒られてる。

これはそもそもインストールした devise が認識されてない?

と思ったら案の定そうだったっぽい。

routing - undefined method `devise_for' in rails action controller - Stack Overflow

apache 再起動で治った。えええーー……そんなに頻繁にwebサーバの再起動が必要なの……dumpautoload 的なものはないの……。
 

参考URL

[*Rails*] deviseの使い方(rails5版) - Qiita

macOS High Sierra で 外付けハードディスクをフォーマットする

デフォルトだとちょっと躓くHDDフォーマットの仕方

年内にしようと思っていて結局今頃になって外付けHDDをフォーマットしていたら、なんかよく分からない所で躓いたので、外付けHDDのフォーマットの手順をメモメモ。

そんな大した設定がいるわけではありませんが、知らないとコケるなんとも物悲しいやつです。

 

ディスクユーティリティを使った「消去」

macOS High Sierra (10.13.2) で外部HDDを初期化するのに、以下の手順で行いました。

  1. Launchpad から「その他」→「ディスクユーティリティ」
    別にディスクユーティリティを選択出来ればどこから行ってもいんですが、私の場合はこれが一番早かったので…。

     

  2. 左上の「表示」メニューから「全てのデバイスを表示」を選択。これ大事!
    これを選択することで、サイドバーのディスクの表示が変わります。この表示でないと、なぜか正常にフォーマット出来ないという落とし穴が…。



  3. ディスクを選択
    ディスクは、HDD名でなくて、その一つ上のおおもとを選択してください。

     

  4. 「消去」



  5. 名前や設定を選択→「消去」
    名前やフォーマットは自分の環境に合わせてください。
    フォーマットも色々ありますので、用途に合わせて選択してください。私は WindowsMac 両方で HDD を使える必要がありましたので、exFat にしました。


    セキュリティオプションはお好みでいいと思います。
    私は別に復元出来てもいい(フォーマットした後も自分で使いますし、HDD 廃棄するときは物理破壊する)ので、「最も速い」を選択しました。
    この設定だと一瞬でフォーマットが終わります。



  6. 完了

    この画面まで行けば完了です。



    フォーマットしてる間に風呂でも入ってこようかなとか思ってたら一瞬で終わったのでΣ(゚Д゚)ってなりました。フォーマットってそんなに速く出来るんだ……。

 

 

注意点

手順の 2.で、「全てのデバイスを表示」を選択せずに、表示されたデバイスを選択しただけで「消去」を行うと、以下のエラーが出てフォーマットにコケます。

消去プロセスを完了できませんでした。
Unmounting disk

MediaKit reports not enough space on device for requested operation.

操作が失敗しました... 

 

なんとも理不尽な。

初期状態のデバイスを選択しただけだと、消去中にディスクがアンマウントされるっぽくて、それでエラーになってるのか…?

それなら最初っから全てのデバイス表示してくれていればいいものを……と文句を行った所で始まらないので、粛々と表示を確かめましょう。

 

これでHDDのフォーマットは終わりです!

 

あとはバックアップの設定だなぁ。

なんか Time Machine がめちゃ重たいという記事も見かけたので、もうフリーのシンプルなバックアップソフトにでもしようかな…。

 

 

Ruby on Rails5 のローカル環境出来た!

ローカル環境

Progate で Ruby on Rails5 のレッスンを終えたので、今度はローカルで環境作りました。

最終的に出来た環境はこんな感じ。

環境

 

Apacheのモジュールは passenger なるツールを使って準備しました。いまいち passenger が何者か分かってませんが、コマンド叩いてあとは指示通りにすれば Apacheruby 使うためのモジュールが使えるようになっているという優れもの。

いいツールが揃ってますねー。

余談ですけど、CentOS7 は主要なコマンドすら変わってたりして色々と地味に時間を取られるので、もうローカルの標準は CentOS6.9 でいいんじゃないかなーと思ったりして。。。

 

Ruby on Rails5 のプロジェクト作るまでの手順

叩いたコマンド全て載せようかと思いましたが、色々足りないものがあったりディレクトリの権限が足りなくて寄り道したりして、あんまりスマートでない感じだったので、大雑把な手順だけメモ代わりに載せることにします。

今回は、Apache2.2 で ruby2.4.3 を使う方法です。あと、gem 使って rails 入れて、プロジェクトの新規作成する所まで行きました。

 

  1. rbenv を clone してくる

  2. rbenv コマンドが使えるように、パスを通す

  3. rbenv のプラグイン rbenv-build を clone してくる

  4. インストール出来る ruby のバージョン確認したら、ruby をインストールして、使うバージョンを指定
    - 最新の 2.5.0 入れようとしたらエラー。どうやら ruby のバグっぽい?

  5. 必要なパッケージ(bundlerとか)を入れる

  6. passenger を入れる

  7. passenger を使って Apache のモジュールを準備
    - ここで足りないパッケージがあるよーってインストールのコマンド付きで警告が出たので、一旦コンソールに戻って寄り道

  8. Apache の設定ファイルに準備したモジュールを使うように設定追加して、バーチャルホストを追加して、Apache再起動

  9. gem 使って rails を入れる
    - mysql の関連パッケージ?も gem で入れようと思ったら mysql-devel が足りなくてまた寄り道

  10. nodejs が無いと ruby は動かないらしいので、これも入れる

  11. rails プロジェクト新規作成

 あとは hosts に書いて、アクセス。

出来たーーー!!

紆余曲折しなくても環境作れるようになったら、その内コマンドとか詳しい解説とか入れながらまた記事書きたいです。

 

気になった所

  • rbenv を入れるのに、今回は /user/local の下に入れたんですけど、なんかディレクトリの権限が足りなくてコケる事があったんですよね。~/.rbenv に入れるとするサイトがあったりして、そっちでも良かったのかな?と思ったり。Apache はどっちにしても vagrant ユーザで起動してるから、~/.rbenv の方が権限の問題がなくてよかったんじゃないかなーと思ったり。次はそれで試してみよう。
  • CentOS6.9 で rbenv-build を使って ruby2.5.0 をビルドしようとしたら、変なエラーが出てちょっと詰まった。調べて見たら、Ruby のサイトにチケット立ってた。

    Bug #14234: Failed to build on CentOS 6.9 - Ruby trunk - Ruby Issue Tracking System

    もしかして ruby のバグとかそういうやつだったのかな……。結局バージョンを ruby 2.4.3 に落としたらうまくいきました。

 

 参考にしたサイト

http://kimagureneet.hatenablog.com/entry/2016/08/31/180636

 

 

さーてもりもり

アプリ作るぞー。今回はイベントとかの告知サイト?のCMSっぽいものを作ってみようかと。

しかし、.ignore に入れるべきものを最初から入れといて欲しいもんだ。。。そのためのGit 管理するべき .sample ファイルとか最初から作っておいてほしいもんだ。。。とか言ったらいけないんですよね、すみません。

アプリは GitHubリポジトリ作ってバージョン管理する予定。

うちの会社では書かないテストを、今回は勉強しながら書くのだ……自動テストとか出来るようにするのだ……!

 

 

Ruby on Rails5 のレッスンに突入 その3(完)

Ruby on Rails5

さて、昨日はRuby on Rails5 レッスンでのログイン回りや認可を実装しました。

binthec.hatenablog.com 

使う学習サイトは同じく Progate です。今日で Ruby on Rails5 のレッスンを終わらせる予定です。

 

履修してるレッスン

  • Ruby on Rails5
  • 目標:TweetApp(TwiiterみたいなSNS)を作ること

昨日は「Ruby on Rails5」のレッスン8と道場3まで進みました。

今日はレッスン9から最後まで進めていきます。DBのリレーションなどをやるようですね。

  

リレーション…?(1対多)

  • リレーションをするのかと思いきや、やっぱりこっちも自作。あるぇ…?ORMがもしかして、ない…?流石にそれはないか?まだやらないだけ、かな……?
  • Post モデルの中で投稿ユーザの情報を返すインスタンスメソッドを定義する
    class Post < ApplicationRecord
        ...
        def user
            return User.find_by(id: self.user_id)
        end
    end
  • 呼び出し側は、post から user を呼び出せる
     def show
        @post = Post.find_by(id: params[:id])
        @user = @post.user
    end
  • 逆に、user に紐づく posts を引く時には Userモデルに posts メソッドを定義する
    class User < ApplicationRecord
        ...
        def posts
            return Post.where(user_id: self.id)
        end
    end
  • 使う時は@user に対して posts メソッドを呼び出す
    <% @user.posts.each do |post| %>
  • flash[:notice] に〜を代入してください、の時に"" ダブルクオートが付いてたり付いてなかったりするのは、これは注意力を付けるためにわざとやってるんだろうか…。

 

リレーション…?(多対多)

  • 中間テーブルに該当の値があるかどうか見る
    <% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
        いいね!済み
    <% else %>
        <%= link_to("いいね!", "/likes/#{@post.id}/create", {method: "post"}) %>
    <% end %>
    …そんまんまですね。(そしてまたここで {method: "post"} になってる)
    find_by は何もない場合の戻り値が nil なので判定に使える、ということらしい。
  • ajaxを使うのかと思ったらそんな事はなかった。流石にないか。

 

モデル

  • destroy メソッド。以前も出てきたけど復習も兼ねて。
    @like.destroy
    ソフトデリートってあるのかなぁ。
  • where メソッドとcount メソッド
    @likes_count = Like.where(post_id: params[:id]).count

 

  • link_toメソッドをHTMLに対して使う場合には少し異なった書き方をする
  • 文字列に対して
    <%= link_to("リンクテキスト", "/posts/index") %>
  • HTMLに対して
    <%= link_to("/likes/#{@post.id}/create", {method: "post"}) do %>
         <span class="fa fa-heart like-btn"></span>
    <% end %>

 

 gem(ジェム)

  • gemとは
    RubyRailsでプログラミングをする際に「よく使う機能」をパッケージ化したものです。Railsにインストールすることで使用することができます。
  • ほおほお。Composerのようなものか。CentOS上でコマンドを見たことだけはある。
  • Gemfile :インストールしたいgemを記述するファイル
    へえー。composer.json みたいなものか。
    gem 'rails', '5.0.3'
    gem 'bcrypt'
    バージョン名を省略すると、最新版をインストールする
  • Gemfile.lock :自動生成されるファイル。composer.lock みたいなもんですね、きっと。
  • gem インストール実行
    $ bundle install

 

bcrypt パッケージ

  • has_sercure_password メソッドというメソッドが使えるので、モデルに設定する。use も何もいらないらしい。また、has_secure_password は presence (存在するかどうか)のバリデーションも一緒に行う。
    class User < ApplicationRecord
       has_sercure_password
       ...
  • 項目名が password の中身を、save 時にbcrypt を通して「password_digest」カラムに入れてくれるので、項目名は password のままでよい
  • ログインさせるには、そのメールアドレスを持つユーザが存在し、かつ、bcrypt の authenticate メソッドを使ってパスワードが一致するかを確認して、通す
    @user = User.find_by(email: params[:email])
    if @user && @user.authenticate(params[:password])
        session[:user_id] = @user.id
        ....
    else
        ....
    end

  

余談:気がついた事

CakePHPRuby on Railsでは、バリデーションはモデルに記述し、モデルのsaveメソッドが走る時に行われる。

Laravel では、バリデーションは基本自分で設定するのでモデルに書いてもコントローラに書いても良くて、いつのタイミングでも掛けられる。私は大体、フォームからデータが渡ってきたタイミングでバリデーション掛けていたので、今回ちょっと違和感があって気が付きました。

どっちがいいんでしょうね。

私はLaravelでも良くモデルにバリデーションを配列で返すメソッド作ってたので、結局やってることは変わらない気がしますけども。save メソッドで呼び出された際にバリデーション通すか、その前に通すかの違いですかね。

でもCakePHPでは特定の項目だけ特定の場合にバリデーション掛けたくないシチュエーションがあった時に、ちょっと別オプション指定してあげたりが面倒だったので、Laravel の方が自分でタイミングと項目を設定出来る分、融通が効くと言えなくもないけど、結局全部手動だからなぁ。

一長一短ですかね。

 

Ruby on Rails5 のレッスンを修了!

レッスン6〜8と、道場3の合わせて4つを修了し、Ruby on Rails5 のレッスン全てが終わりました。ここまで3時間強でした。

さすがにパスワードの暗号化は出てきましたね。

DBのリレーションを張るのかと思いきや、ORMでなく手動だったのは少し驚きました。レッスンに入り切らなかったんですかね。どっちにしてもORMはいずれ格闘しなきゃいけないと思いますので、概念だけおさらいするという意味でいい復習になりました。

デバッグの仕方くらい教えてくれたら嬉しかったなーと思いましたが、別にそんくらい調べればすぐ分かることなので、あとは自分でなんとかしましょうってことですね。

次はローカル環境作って、公式ドキュメント見ながらORMとかソフトデリートとか探しつつ色々試してみようかと思います。とりあえず Multiauth やらねば。

正月休み中しっかり勉強したし、明日は1日遊んで、明後日からまた仕事ですね。正月明け早々に出張です……。

 

兎にも角にも、Ruby on Rails5 のレッスンは無事修了〜。

Progate さんありがとうございました。

折角だからjQueryPythonもやるだけやってみようかな。

 

Ruby on Rails5 のレッスンに突入 その2

Ruby on Rails5

さて、昨日はRuby on Rails5のレッスンに入っていきました。

binthec.hatenablog.com

引き続き今日はレッスンを進めて行きます。使う学習サイトは同じく Progate です。

 

 

あ、そういえば、明けましておめでとうございます。

 

履修してるレッスン

  • Ruby on Rails5
  • 目標:TweetApp(TwiiterみたいなSNS)を作ること

「Ruby on Rails5」のレッスン5と道場2まで進みました。今日はレッスン6からです。「Ruby on Rails5」のレッスン通してTwitterっぽいSNS作るということで、昨日まではルーティング、モデル、コントローラ、ビューの関係とか書き方を学びました。

レッスン6からはログイン機能を付けて行くようですね。

 

別にこの辺からはProgateでなくても良いような……とか思わなくもないですが笑 折角課金しましたので、このレッスン修了までは使ってみます。

 

ユーザ管理機能

  • 昨日も出てきましたが、復習も兼ねて。モデルとマイグレーション作成コマンドとマイグレートコマンド。やっぱりUserモデルのファイルが小文字なのがなんか気持ち悪い…
    $ rails g User name:string email:string
    $ rails db:migrate
  • Laravelみたいにコマンドで勝手にログイン機構を全部作ってくれたりは……しないのか。残念。
  • バリデーションのユニーク制約:
    validates :email, { uniqueness: true }
  • コントローラ名が複数形……でした、そう言えば。
  • ビューのnewとeditを一つにしたいな……
  • render()の引数はURIだと思ってたけど、ビューのパスだったっぽい。ユーザの新規作成画面のURIは /users/signup だけどrenderで指定する場合は
    render("users/new")
  • ページをめくるごとに設定していたname属性を消されて、知らずにブラウザで試して怒られるの巻\(^o^)/
  • お、もしかして編集の際のユニーク制約は、何もしなくても自分のID以外に検索をかけてくれてる?これは便利だ!何で判定してるんだろう。アクション名?
  • しかし、編集の際にDBのトランザクション張らなくていいんだろうか。また別のレッスンでやるのかな。

 

画像アップロード機能

  • 画像データはpublicディレクトリに保存
  • マイグレーションファイルの作成コマンド
    $ rails g migration add_image_to_users
  • マイグレーションファイルの書き方
    class AddImageNameToUsers < ActiveRecord::Migration[5.0]
        def change
            add_colums :users, :image_name, :string
        end
    end
  • HTMLヘルパーのようなものはないのかな…?
  • ファイル送信の際には、form_tagメソッドの第二引数に {multipart: true} 渡す。よく忘れるやつですね注意。
  • Ruby標準のFileクラスでファイルを書き込み出来る
    File.write("public/sample.txt""public/sample.txt""public/sample.txt""public/sample.txt", "Hello World")
    だと、sample.text に文字を書き込める。
    public ディレクトリに書き込む際もpublic から指定する必要がある事に注意。
  • 画像ファイル保存の場合には File.binwrite メソッドと、画像の read メソッドを使う
    @user.image_name = "#{@user.id}.jpg"
    image = params[:image]
    File.binwrite("public/images/#{@user.image_name}", image.read)
  • 画像表示の際には、

    <img src="<%= "/user_images/#{@user.image_name}" %>">

     ダブルクオートの中にダブルクオートを入れるのがなんか……不思議ですが。

 

ログイン機能

  • ログインのアクション命名規則URIは両方 /login
    ログイン画面(GET)   :login_form
    ログイン実行(POST):login
  • んんんwwパスワード平文入ってるんですけど、最初だからですよね??ww
  • form_tagメソッドはデフォルトでポストのルーティングを探す
    <%= form_tag("/login") do %>
    それにしても do をよく忘れてしまう…
  • Railsのログインはだいぶめんどくさいなぁ……ログイントレイトみたいなの欲しい……!
  • ログイン処理=「セッションの user_id キーにユーザIDを持たせること」
    session[:user_id] = @user.id
    変数名に入れるだけでセッションに入れてくれる機構があるんだな…
  • ログイン判定をして、ログイン中の場合に某かの値を出力
    <% if session[:user_id] %>
        ログイン中ユーザーのid: <%= session[:user_id] %>
    <% end %>
    うん、シンプルですね。これガードとかの判定出来るんかな。
  • ログアウトは逆にセッションのuser_idキーを空にするだけ。
    session[:user_id] = nil
    ……うん、シンプルですね。
  • 以前のレッスンでは link_to メソッドでポストのルーティングを指定する際には第3引数に
    {method: "post"}
    を指定してください、とあったのに、何の前置きもなく今度は
    {method: :post}
    を指定してください、になってたでござる……びっくりしたでござる。どっちでもいいみたいでござる。どっちでもいいよって書いてあったの私が見逃したかな…?
  • なるほど、連想配列…じゃなくてハッシュのキーを "key" ってのを :key に出来る、っていうだけの意味かと思ってたけど、これはもしかして "" ダブルクオートを : コロンで書くことが出来るってことだったのかな。なるほど、それで「省略して掛ける」って言ってたのか。ちょっと納得。
    だからPost.all.order(created_at: :desc) とかちょっと変な書き方だなあと思ったんですけど、そういうことだったのか……な……?え、今更?どんくさくてすみません……
  • 親クラスでメソッドとコントローラ呼び出し前に一括してメソッドを呼び出すことが出来る
    親クラス:application_controller
    class ApplicationController < ActionController::Base
       before_action :set_current_user
       #...
       def set_current_user
           @current_user = User.find_by(id: session[:user_id])
       end
    end
    と書けば、全てのControllerでアクション前にログイン中のユーザが取得出来る(=いちいち全てのControllerに書かなくて良い)。
    ビュー側では普通にcontrollerで指定したように
    <% if @current_user %>
        <%= link_to(@current_user.name, "/user/#{@current_user.id}/edit") %>
    <% end %>
    で利用出来る。
  • @変数は、
    @変数で定義した変数は同じクラスの異なるメソッド間で共通して使用することが可能です
  • なので、親クラスのapplication_controllerで先に
    before_action :set_current_user
    としておけば、application_controller 内の他のアクションでも @current_user が使えるよ、と。
  • 「ログイン済みしか見られない」ページを指定したい場合
    def authenticate_user
        if @current_user == nil
            flash[:notice] = "ログインが必要です"
            redirect_to("/login")
        end
    end
  • ログイン済みの場合に「見せないようにしたい」場合
    def forbid_login_user
        if @current_user
            flash[:notice] = "すでにログインしています"
            redirect_to("/posts/index")
        end
    end
  • で、各コントローラで、アクションの前に親クラスのメソッドを通す。このアクションでだけ通したい、という場合は only で指定出来る。
    before_action :authenticate_user, {only: [:index, :show]}
  • ログイン済みか否かでログイン画面表示さすかどうか、っての、全部自作かぁ……トレイトほしい。せめてミドルウェアほしい。

 

レッスンを4つ修了

レッスン6〜8と、道場3の合わせて4つを修了しました。ここまでで4時間半くらい。

昨日まではMVCの基本と表示部分の使い方などでそんなに難しい感じはありませんでしたが、ログイン回りは基本は変わりませんけどRailsっぽい書き方というか、今までとちょっと違ったので時間がかかりましたね。

Railsもコマンド叩けばログイン回り全部作ってくれればいいのに…!あとトレイトとミドルウェア欲しいです。ミドルウェアという概念は無いのかな…?あとで調べてみよう。

さすがに今日あと4つするの大変なので、今日はここまでにします。明日、Ruby on Rails5 のレッスンを最後まで行ければと。

ログイン回りを折角してるので、Multiauthもやってくれたら手間が省けて嬉しい。

 

Progateは本当に細かく丁寧に教えてくれるので、他のフレームワークしてる人には少し退屈かもしれませんが、初めてフレームワーク触る人にはとても優しい仕様になってますね。

 

ただ欲を言えば、レベルアップをお知らせしてくれるのは嬉しいけど、結構さくさくレベル上がってその度にいちいち閉じるボタン押すのが面倒なので、出来れば「もう表示しない」機能を付けてもらって、その場合は簡単なポップアップか何かだけでレベルアップを通知してくれると嬉しいなぁ…。

あと、エディタ画面でタブの入れ替え出来るとすごく嬉しい。

 

とりあえず、Ruby on Rails5 もあと少しでお終いですよー。

 

 

Ruby on Rails5 のレッスンに突入

Ruby on Rails5

さて、昨日はRubyの基礎を勉強しました。

binthec.hatenablog.com

引き続き今日はいよいよRuby on Rails5の学習に入っていきます。使う学習サイトは同じく Progate です。

自分のメモ代わりに、重要なポイントとかをまとめて見ます。

 

履修するレッスン

  • Ruby on Rails5
  • 目標:TweetApp(TwiiterみたいなSNS)を作ること

今回はブラウザ上で全て完結出来るみたいなので、ローカルの環境作ったりはしないんですね…ちょっと残念。まあいいか。Progate上のRuby on Rails5のレッスン終わったらローカルで環境作ってアプリ作ってみようかな。

ワガママ言うと、背景が黒なのが目がチカチカしてキツい‥‥背景色変えられる機能欲しいです Progate さん……。背景が黒いとカーソルをよく見失うし……。プリーズ!

 

基礎

  •  railsのアプリ生成コマンド
    $ rails new App名
  • サーバ起動(ビルトインサーバかな?)
    $ rails server
  • Railsの初期画面可愛いなぁ
  • トップページ生成コマンド。と思ったら、これはコントローラ作成コマンドで、デフォルトのアクションを一つ指定出来るというもののようです。ルーティングやメソッドやビューやassetsのJSまで作ってくれてる。
    $ rails generate controller home top
     ↓ 省略Ver
    $ rails g controller home top
  • Controllerのファイル名がスネークケースなのがだいぶ気持ち悪い…
  • Viewのディレクトリの命名規則CakePHPみたい。
    コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探してブラウザに返します。
    なのにルーティングがいるのか…?
  • いるらしい。ルーティングに書かれていないとビューを表示出来ない。
  • railsCSSファイルは、
    「stylesheets」フォルダの中に保存されているCSSファイルにコードを書けば、すべてのビューにCSSが適用されます。
    と書かれているけど、これ、コントローラ名.cssは、そのコントローラに紐付いた全てのビューに適用されます、ってわけじゃないのかな…?
    作成されたデフォルトのCSSにはコメントアウト

    // Place all the styles related to the posts controller here.
    // They will automatically be included in application.css.

    と書かれているけど…。単純にファイル名を分かりやすく区別してるだけなのかな?あとで確認してみよ。

  • ビューファイルの拡張子「erb」は「Embedded Ruby(埋め込みRuby)」の略
  • この拡張子のビューファイルでは、<% %> で囲むとrubyコードが記述出来る。
  • 変数を出力する場合は<%= %>を使う。これでechoしてくれるんですな
  • コントローラからビューに値を渡すのは、
    変数名を「@」から始めることでこの変数は特殊な変数となり、ビューファイルでも使用することができます
    らしい。これは便利だ!わざわざ渡さなくていいんですね。ビュー側で使う場合も
    <% @posts.each do |posts| %>
    になるらしい。
  • フラッシュメッセージは flash[:notice] = "メッセージ"
  • ビューで使う時も <%= flash[:notice] %>

 

ルーティング

  • ルーティングの基本
    Rails.application.routes.draw do
        get "/" => "home#index"
        get "/about" => "home#about"
        get "/post/:id" => "post#show"
    end
  • idなどのパラメータを指定する場合
    「posts/:id」というルーティングは「posts/index」より下に書かなければいけません。ルーティングは合致するURLを上から順に探します。そのため「posts/index」よりも上に書くと、「localhost:3000/posts/index」というURLは「posts/:id」というルーティングに合致してしまいます。
    あ、これあれですね、地味にハマるやつですね分かります…
  • link_to メソッドは get のルーティングを探す
  • post のルーティングを探す場合はlink_toメソッドの第三引数に {method: "post"} を渡す必要がある→追記:のちに {method: :post} という書き方も出てきた
  • Railsでのアクション命名規則
    一覧:index
    新規作成画面:new
    新規作成実行:create
    編集画面:edit
    編集実行:update
    詳細画面:show
    削除:destroy
    新規作成がLaravelと違うからちょっとごっちゃになりそう…

 

rails console

  • rails console を使ってrubyのコマンドを使うことが出来る。へー。rails consoleの起動は
    $ rails console
  • 変数も使えて、quit するまで記憶される
  • rails consoleからDBへレコード追加も出来る
    post1 = Post.new(content: "コンテンツテキスト")
    post1.save

 

フォーム

  • form_tagメソッドはFormヘルパーみたいなものっぽい。定義の仕方は
    <%= form_tag("/posts/create") do %>
        <div class="form">
            <div class="form-body">
                <textarea name="content"></textarea>
                <input type="submit" value="投稿">
            </div>
        </div>
    <% end %>

  

DB

 

Ruby on Rails5のレッスンを7つ修了

15レッスンということだったので5つずつ消化しようかと思ってたら、内4つは復習用のレッスンみたいだったので、キリがいい所まで進めました。なので今日は7つです。概ね4時間半程度かかりました。

DBを使った追加・表示・編集・削除までですかね。あとはレイアウトを使った表示の仕方。

思ったよりもLaravelに似てる感じがして、まだそれほど書き辛いとか難しいとかいうイメージは無いですね。いえ、あくまで「まだ」でしょうけども。

フレームワークってみんなこんな感じなんでしょうかね?フレームワーク3つ目なのでまだよく分かりません…。

でもバリデーションの書き方は、なんか、めんどくさそう間違えやすそう。

あと、ルーティングとアクションの命名規則が分かったのが良かったです。やっぱり郷に入れば郷に従えで、そのフレームワークらしい書き方ってあると思うので、倣うのが大事だと思うのですよね。

以前Laravel始めた当初に「CakePHPっぽい書き方しないでよ」と言われたことがありましたけど、今度はそうならないように・ω・

さて、あと1日で終わらせるか、2日に分けるか。早くローカル環境作りたいなー。

 

 

Rubyの勉強を始めました

Ruby

年末年始で時間があるので、気になっていたRubyの勉強を始めました。

今回使う入門サイトは Progate というサイト。

ブラウザ上でRubyを実行した結果が確認出来るのがいいですね。あとサイトの雰囲気やキャラクターが可愛いし、学習者のレベルで表示されたり、レベルアップした時にポップアップが出てSNSで簡単に共有出来るようになってたりと、学習者が飽きないような工夫が色々あって好感が持てます。

しかし「Ruby」のレッスンに関して言えば、プログラミングの初学者向けの内容ですので、当然基本的な部分(文字列と数値は別物ですので区別しましょうとか、if文の中では字下げしましょうとか)もきっちりやります。最初は少し退屈な部分もありそうだな、と思いつつ…。

でも「Ruby on Rails5」というレッスンもあるので、1月3日までにこれ修了出来るといいな。アプリ作りたいよアプリ。

この記事では、学習する中でPHPとの違いとか、へぇ〜と思った箇所を、自分のメモ代わりに書き出してみます。

 

Rubyの基礎

  • 文末は何もない。; (セミコロン)で終わらないので少し違和感
  • 文字連結は +(加算記号)。JSみたい
  • 数値と文字列は +(加算記号)で連結出来ない
  • 命名規則:変数はスネークケースで書く
  • 頭に何も付けなくても変数として使える。JSみたい
  • 変数展開出来るのは "(ダブルクオート)の中のみ
  • Rubyにはインクリメント演算子が無いらしい
  • 型変換は明示的にしてあげる必要がある
  • PHPで言う null は、Rubyでは nil

 

条件分岐

  • if にカッコが無い……違和感
  • else if のスペルが…!? elsif だって……

 

配列とハッシュ

  • 配列は fruits = ["apple", "orange"]
  • 配列の使い方は概ね同じ感覚でいけそう
  • と思ったら違った。PHPで言う連想配列は、Rubyでは配列ではなくハッシュというらしい。そもそも配列とは別物として扱うようだ…。定義する際の記号も { } を使う。
    user = {"name" => "suzuki", "age" => 20 }
  • でも使う際には配列のように user["name"] と、[ ] こっちのカッコを使うらしい。紛らわしい。
  • シンボル(:name)という新しい概念:文字列≒シンボル
  • ハッシュのキーをシンボルで置き換えられる。その場合、呼び出す時もシンボルで記述する必要がある
  • そうすると、ハッシュを
    user = { name: "suzuki", age: 20 }
    という省略した書き方が出来る。なるほど、確かに見やすい。呼び出す時は user[:name] でコロンを前につけて呼び出す
  • 配列の中にハッシュを入れられる……?JSONじゃん……?てかもうハッシュも含めて全部「配列」で良くないですか。要は多次元配列じゃないですか……とか思ってはいけないのですよねすみません。
  • foreachの書き方が全然違う…

    languages.each do |language|
        puts "#{language}を話せます"
    end

 

メソッド

  • メソッド定義は function ではなくて、def
  • 引数がない場合にはメソッドを呼び出す際でも (カッコ) を省略出来る
  • メソッド名もスネークケースが一般的なのかな??
  • メソッドから返る値は「戻り値」と言う
  • bool値を返すメソッド名末尾、カッコの前に?(クエスチョンマーク)を付ける慣習があるそうな。へえ〜。

    def negative?(number)
       return number < 0
    end

  • キーワード引数という新しい概念:引数を指定する際に

    def introduce(name:, age:)
       ...
    end

     というふうにコロンを後ろに付けて指定する。そうすると、メソッドを呼び出す時に

    introduce(name: "suzuki", age: 20)
    値の前にキーワードを付けて呼び出せる。引数が多くなった時にわかりやすくていいよねってことらしい。確かに分かりやすい。PHPStormの自動表示機能みたいだな。

 

クラス

  • インスタンスの生成には クラス名.new を使う
    menu1 = Menu.new
  • インスタンスメソッドなどの考え方はPHPと同じ。呼び出し方は
    menu1.name
    みたいに .(ドット)でつなぐ
  • PHPで言うところのコンストラクタは、Rubyでは initializeメソッド と言う
  • クラスの継承は
    class Food < Memu
    と書く。なんか新鮮。
  • オーバーライドの概念はPHPと同じようだ
  • super()が一瞬「ん?」ってなったけど……。要は単純にオーバーライドする元メソッドを呼び出してるだけですね。
  • クラスメソッド(=静的メソッド)を生成する場合
    class Menu  
        ...
        def Menu.is_discount_day?
            today = Date.today
            return today.sunday?
        end
    end

 

Ruby標準ライブラリの Dateメソッド

  • 私の誕生日は日曜日ではなかったらしい
  • 段々スキット内のネコの返しが雑になって来てる笑

 

Ruby」レッスンは修了

基礎修了までざっと3時間ちょいでした。こんなもんですかね…?

 

まあオブジェクト指向なのは変わんないから、手段が変わっただけってことですね。基本を理解してれば難しくありません。Rubyの書き方を覚えなければという所ですが、アプリ作ってればその内慣れるでしょう、って範囲を出ない気がします。良かった。

キーワード引数とシンボルは絶対何度も間違えるでしょうけど。

あとはRubyのメソッドとか覚えなければですが、今日はここまで。

今度は、ついに!

Ruby on Rails に入って行くぞー(゚∀゚)

 

「やる気だけは負けません」という言葉

「やる気」とは…?

既にPHPerされてる方や、一人でガツガツ勉強してアプリも作って、をされてる方には、「何を今更」ということしか書いてません。

この記事は、「これからWebエンジニアになりたいなぁ」「選考に進みたいけど何をすればいいんだろう、やる気はあるんだけど…」と考えてる人向けです。

さて、私は PHPer なので、他の分野については分からないのですが、あくまでWebエンジニアとして見た場合の話です。(断っておくと、私は採用担当でもなんでもありません。悪しからず。)

「技術はありませんが、やる気だけは誰にも負けません」という言葉を聞くことがたまにあります。その言葉について。

最初に言っておきますと、「やる気だけは負けません」と言ってる方を批判したり馬鹿にしたりする意図はありません。

むしろ、「その心意気や、良し」と思ってます。

いいことじゃないですか。やりたいことがあって、その想いが口に上ったというのはそれだけで価値のあることだと私は思います。

けど、エンジニアというのは文字通り技術者ですので、やはりどうしても「やる気があって、それで、何が出来るの?」となってしまうのです。

「まだビギナーですらないのに、何も持ってないんだからやる気をアピールする以外にどうしようもないじゃない」というのは分からなくもないです。

分からなくはないのですが、「やる気だけはあります」と言うだけでは、その「やる気」が形になって見えない。非常に分かりにくい。

もしこの業界に入ろうと本気で思うのなら、是非その「やる気」プラスアルファの部分に少しでも思いを馳せてみたら、きっと大きく飛躍する可能性があるんじゃないかなぁ、と思ったので、その方法を少し書いてみます。

 

技術は降ってこない

日本の小学校、中学校、高校の「座って教わる」受動的な学習が”普通”になっている人達は、きっと技術も”人から教わる”ものだと思っているんじゃないでしょうか。

だから、会社に入れば技術は教えてもらえると思っているし、教えてもらった事をきちんと習得し、成長していく気持ち・やる気は誰にも負けません、そんな思考になるのかなぁと思います。

もちろん、技術を人から教わることもあります。一人でモクモクやってて、でも出来なくて「詰んだ\(^o^)/」状態で魂抜けかけた時には私も先輩にヘルプを出して助けてもらいます。

ただ、それは口を開けて待っていれば降って来るものではありません。

人にも依るとは思いますが、Webエンジニアの多くは「技術は基本的に独学」と思っている方が多いように感じます。つまり、多くのエンジニアは大なり小なり「一人で本やネットなどの教材を使って学び、技術を身に付けて来た人たち」なのです。

独学でも現場で十分に戦える技術を習得出来ることを、よくよくご存知な方たちなのです。

なので、「やる気だけは負けません」というのを聞くと、「やる気あるなら何で自分でアプリ作ってみたりしてないの?」「やる気あるのに何で技術がゼロなの?」なんて思われてしまうわけです。 

 

とはいえ、何をすればいいのか

個人でアプリもがんがん作って、誰に聞かなくたってどんどん一人で勉強出来る人ももちろん居ますが、世の中そんな人ばかりではないでしょう。私のように、「どうしたらいいんだ…?」と最初は途方に暮れる人だっていると思うのです。

私はサーバサイドエンジニアをやり始めてやっとこさ3年目になりました。

私もこの職種で仕事を探し始めた当初、どうすればいいか分からずに、とりあえずPHPの入門書を買って、CRUDを作れるようにくらいは勉強しました。

でも、技術を飯の種にして行こうと思うなら、最初とは言えこれじゃ弱い。

今だったら、「あの時はこれしとけば良かったんだなぁ」と思えることがいくつかあるので、「どうしたら…?」と思っている人に少しでもヒントになればと思います。

 

とりあえず、これやってみたらどう?と思うもの

  1. Twitterアカウント作って情報収集
  2. ドットインストールなどで気になる科目を履修する
  3. 何か一つ、フレームワークを使ってアプリを作る
  4. Qiitaなど、アウトプットする場を作る
  5. GitHubでアカウントを持ち、リポジトリを作って公開する

 

Twitterアカウントを作って情報収集

ツイッターアカウント作って、「今から自分がなりたいと思っているもの」に、「既になっている人」「なろうとしてる人」「関連する情報をつぶやいてる人」を、フォローしまくります。

私の感覚では大体200〜300人くらい。いえ、数は好みだと思うので、100人でも500人でもいいと思うのですが。

そうしてベテランの方や勉強中の方や勉強会の情報など入り乱れるTLを見ていると、その界隈の人たちがどんな考えを持ってどんな事をしているのか、何が流行ってて何が廃れているのか、とかが良く分かります。もっと言うと、どういう事をするとウケが良くて、何が不評なのかも分かります。

その人達の考え方に合わせる必要はありませんが、「どうすればいいんだ…?」と思っている人には何かしらのヒントが落ちているはずです。TLで言われている事を丸っと信じ込むのはそれはそれでどうなの、と思いますが、色々取捨選択して自身で多様な考え方を構築するにはいい場だと思います。

私はツイッターのアカウントは持っていましたし、PHPの大きなコミュニティや、フレームワークの公式アカウント、有名なPHPerさんくらいはフォローしてましたが、そんなにたくさんはフォローしてませんでした。もっといろんな人フォローしとけば、色んな考え方を知ることが出来たのになーと今は思います。

最近は転職を考えていることもあり熱心にTLを眺めているのですが、転職に関しての考え方がちょっと変わりました。ツイッターって素敵なツールですね。

え、むしろ私、そんな事もしてなかったのかって?ね、ホントそれ……(´・ω・`)

 

ドットインストールなどで気になるものを履修する

プログラミングのネットでの教材は溢れてるので、どんどん活用すべきです。

私はドットインストールで学んでいましたが、いろいろ新しいサイトも出てきているようですし、検索して出てきたものを色々試してみるといいと思います。

有名所を履修していると、面接とかで「何かしていますか?」と聞かれた時に「ドットインストールでPHPを勉強しました」とか言うと話を分かってもらえるので、お勧めです。

 

何か一つ、フレームワークを使ってアプリを作る

PHPの基礎を勉強したら、次は簡単なフレームワークを使って、アプリを一つ作ってみるといいと思います。

業務で全てスクラッチで書いてる、という所は多分そんなに無いですから、フレームワークを一つ使えるようになっておくと強みになります。

PHPだとやはりとっつきやすいCakePHPとかでしょうか。先々の事考えるとZendとかLaravelとか。

どんなアプリを作るかは特に重要ではないので、自分が「こんなアプリ欲しいな」と思ったものでいいと思います。思いつかなければ、簡単なブログやBBSを作ってみるとかですかね。

ただし、あまり難しすぎると、難しすぎて完成しない、問題が解決しないからそもそもプログラミング自体が嫌になる、なんて本末転倒にもなりかねませんので、最初は簡単なものでいいと思います。

アプリを作るのがどういうことかが体感出来ますし、何より「成果物」として面接などの際にアピールに使うことが出来ます。これがあるのと無いのとでは、雲泥の差があります。

 

Qiitaなど、アウトプットする場を作る

アプリなどを作ってみて、分からなかった所、調べて分かるようになった所を、アウトプットする場を作ると良いと思います。

はてなブログなどの普通のブログでもいいですし、Qiitaのようなプログラミングに特化したブログツールでも良いと思います。

自分のナレッジベースとしても使えるし、やはりこれも後々、就職・転職する際のアピールに使えます。

 

GitHubでアカウントを持ち、リポジトリを作って公開する

この職種に就くまで、Gitを知りませんでした。恥ずかしい…。

でも、GitHubアカウント持って、リポジトリ登録しといて、面接申し込みの時にGitHubのURLとか貼れたらかっこいいですよね〜。

既にWebエンジニアの方が転職する際にはGitHubアカウントは持ってて当たり前かもしれませんが、この業界初めての人が、GitHubリポジトリ公開してたら「おっ、これは!」と思ってくれるんじゃないでしょうか。

 

まとめ

何をするにしても、一番大事なのは、

  • やる気がある「だけ」ではなく、「これだけ手を動かしてます」というのを示すこと
  • 自分が「一人で学習する能力がある」のを示すこと

だと思ってます。

あれ、なんかリクルーターみたいになってきた。

ともかく、もしこの業界に飛び込んでみよう、やる気はあるんだけどな…!と思ってる方は、是非「やる気だけ」の所から思い切って一歩前に踏み出してみてはいかがでしょうか。