Railsでセキュリティのことを考えずに作ったwebアプリは脆弱性があるのか調べてみた(webアプリ作成編)
こんにちは。僕はこのたびセキュリティキャンプ九州2016に行ってきました。
一言感想を言わせていただくと大変面白かったです。
ただ一つ不安になったことがあります。それはwebアプリの脆弱性です。
キャンプ中にwebアプリの脆弱性を見つけてみようという講座があり、脆弱性があるwebアプリを公開してみんなで脆弱性を探すというものだったのですが、30分もたたないうちに実装されてないはずの画像アップロード機能が追加されたりページを開いた瞬間音声が流れ出す迷惑サイトに変化していたりと蜂の巣状態になっていました。
そこで今回は普段使っているRuby on Railsで作ったwebアプリに脆弱性が存在するのかを確かめてみようと思います。
仕様
セキュリティキャンプ九州で使用した脆弱SNSの機能は次のようなものでした。
- ログイン機能(登録・編集)
- ログインすると掲示板への投稿・削除ができる
- 投稿内容の一覧
- 投稿とユーザの検索機能
DB
- 投稿テーブル(内容/投稿者/日時)
- ユーザテーブル(ユーザ名/パスワード/URL)
これと同じような機能のwebアプリをRailsでできるだけコードを書かずに作ってみたいと思います。
Railsではログイン機能はコマンドだけでは生成できないので超有名なユーザー管理のgemであるDeviseを使いました。
環境
Rails 4.2.4
Devise 4.1.1
ログイン機能
まずはrailsアプリを生成。 以下のコマンドを実行します。
% rails new testApp create create README.rdoc create Rakefile create config.ru create .gitignore create Gemfile create app create app/assets/javascripts/application.js create app/assets/stylesheets/application.css create app/controllers/application_controller.rb create app/helpers/application_helper.rb create app/views/layouts/application.html.erb — 略 — create vendor/assets/stylesheets/.keep run bundle install Fetching gem metadata from https://rubygems.org/ Fetching version metadata from https://rubygems.org/ Fetching dependency metadata from https://rubygems.org/ Resolving dependencies...... Using rake 11.2.2 Using i18n 0.7.0 Using json 1.8.3 — 略 —
Gemfileに以下を追記。
# Gemfile
gem ‘devise’
bundle installを実行。
% bundle install
rails generateでdeviseをインストールします。
これでユーザー管理を行うための準備が完了します。
% bundle exec rails generate devise:install Running via Spring preloader in process 4640 create config/initializers/devise.rb create config/locales/devise.en.yml =============================================================================== 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. 2. Ensure you have defined root_url to *something* in your config/routes.rb. For example: root to: "home#index" 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> 4. If you are deploying on Heroku with Rails 3.2 only, you may want to set: config.assets.initialize_on_precompile = false On config/application.rb forcing your application to not access the DB or load models when precompiling your assets. 5. You can copy Devise views (for customization) to your app by running: rails g devise:views ===============================================================================
言われた通りに設定していきます。
development.rbに追記します。
# config/enviroments/development.rb config.action_mailer.default_url_options = { :host => 'localhost:3000' } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => 'smtp.gmail.com', :port => 587, :authentication => :plain, :user_name => 'メールアドレス', :password => 'パスワード' }
root用のcontrollerとviewをコマンドで生成します。
% bundle exec rails generate controller home index Running via Spring preloader in process 7935 create app/controllers/home_controller.rb route get 'home/index' invoke erb create app/views/home create app/views/home/index.html.erb invoke test_unit create test/controllers/home_controller_test.rb invoke helper create app/helpers/home_helper.rb invoke test_unit invoke assets invoke coffee create app/assets/javascripts/home.coffee invoke scss create app/assets/stylesheets/home.scss
routes.rbに追記してroot_urlを設定します。
# config/routes.rb root to: "home#index"
home/index.html.erbにログインと登録用のURLを追加します。
<h1>Home#index</h1> <% if user_signed_in? %> Logged in as <strong><%= current_user.email %></strong>. <%= link_to "Settings", edit_user_registration_path, :class => "navbar-link" %> | <%= link_to "Logout", destroy_user_session_path, method: :delete, :class => "navbar-link" %> <% else %> <%= link_to "Sign up", new_user_registration_path, :class => 'navbar-link' %> | <%= link_to "Login", new_user_session_path, :class => 'navbar-link' %> <% end %> <p>Find me in app/views/home/index.html.erb</p>
ログイン情報を出力させるためにlayouts/application.html.erbに追加します。
<!DOCTYPE html> <html> <head> <title>TestApp</title> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> </head> <body> <% if notice %> <p class="alert alert-success"><%= notice %></p> <% end %> <% if alert %> <p class="alert alert-danger"><%= alert %></p> <% end %> <%= yield %> </body> </html>
次にユーザー用のmodelとmigrationファイルを生成します。
% bundle exec rails generate devise User Running via Spring preloader in process 4790 invoke active_record create db/migrate/(タイムスタンプ)_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
今回はtrackableとvalidatableは使わないので user.rbの一部をコメントアウトします。
# app/models/user.rb class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registrable, :recoverable, :rememberable # :trackable, # :validatable end
その修正に合わせて (タイムスタンプ)__devise_create_users.rbの一部もコメントアウトします。
# db/migrate/(タイムスタンプ)__devise_create_users.rb class DeviseCreateUsers < ActiveRecord::Migration def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable # t.integer :sign_in_count, default: 0, null: false # t.datetime :current_sign_in_at # t.datetime :last_sign_in_at # t.string :current_sign_in_ip # t.string :last_sign_in_ip ## Confirmable # t.string :confirmation_token # t.datetime :confirmed_at # t.datetime :confirmation_sent_at # t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at t.timestamps null: false end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end end
DBを生成します。以下のコマンドを実行してください。
% bundle exec rake db:migrate == 20160920061425 DeviseCreateUsers: migrating ================================ -- create_table(:users) -> 0.0012s -- add_index(:users, :email, {:unique=>true}) -> 0.0007s -- add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0008s == 20160920061425 DeviseCreateUsers: migrated (0.0029s) =======================
rails s
でサーバを起動させ、http://localhost:3000にアクセスするとこうなります。
Sign upから登録をすませると
これでdeviseのデフォルトのログイン機能は完了ですが、現在ではユーザ情報がメールアドレスとパスワードしか存在しません。 なのでユーザ情報にユーザ名を追加し、ユーザ名とパスワードでログインできるようにします。
以下のコマンドを実行します。
% rails generate migration add_username_to_users username:string Running via Spring preloader in process 9875 invoke active_record create db/migrate/(タイムスタンプ)_add_username_to_users.rb
usernameはログインで使われるためuniqueを与えます。 (タイムスタンプ)_add_username_to_users.rbに追記します。
#db/migrate/(タイムスタンプ)_add_username_to_users.rb class AddUsernameToUsers < ActiveRecord::Migration def change add_column :users, :username, :string add_index :users, :username, unique: true end end
以下のコマンドを実行します。
% bundle exec rake db:migrate == 20160920080558 AddUsernameToUsers: migrating =============================== -- add_column(:users, :username, :string) -> 0.0018s -- add_index(:users, :username, {:unique=>true}) -> 0.0025s == 20160920080558 AddUsernameToUsers: migrated (0.0045s) ======================
user.rbにvalidationを追加します。
validates :username, presence: true, uniqueness: true
ログインで使うデータを変更したため、viewをカスタマイズします。
以下のコマンドを実行します。
% rails g devise:views Running via Spring preloader in process 11412 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/password_change.html.erb create app/views/devise/mailer/reset_password_instructions.html.erb create app/views/devise/mailer/unlock_instructions.html.erb
以下のviewの current_user.email
を current_user.username
に変更します。
app/views/home/index.html.erb
以下のviewの :email
を :username
に変更し、 email_field
を text_field
に変更します。
app/views/devise/sessions/new.html.erb
以下のviewにusername用のフォームを追加します。
app/views/devise/registrations/new.html.erb
app/views/devise/registrations/edit.html.erb
先ほど登録したuserはusernameにデータが入っていないので一度DBをリセットします。
以下のコマンドを実行します。
% bundle exec rake db:migrate:reset == 20160920061425 DeviseCreateUsers: migrating ================================ -- create_table(:users) -> 0.0013s -- add_index(:users, :email, {:unique=>true}) -> 0.0007s -- add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0007s == 20160920061425 DeviseCreateUsers: migrated (0.0029s) ======================= == 20160920080558 AddUsernameToUsers: migrating =============================== -- add_column(:users, :username, :string) -> 0.0006s -- add_index(:users, :username, {:unique=>true}) -> 0.0011s == 20160920080558 AddUsernameToUsers: migrated (0.0018s) ======================
rails s
でサーバを起動し http://localhost:3000/users/sign_upにアクセスすると
usernameも登録できるようになっていて
usernameとpasswordでログインできるようになっています。
次にURLカラムを追加します。 以下のコマンドを実行します。
% rails generate migration add_url_to_users url:string Running via Spring preloader in process 12882 invoke active_record create db/migrate/20160920090632_add_url_to_users.rb
先ほどと同様に以下のviewにurl用のフォームを追加します。
app/views/devise/registrations/new.html.erb
app/views/devise/registrations/edit.html.erb
先ほど登録したuserはurlを持っていないので一度DBをリセットします。
以下のコマンドを実行します。
% bundle exec rake db:migrate:reset == 20160920061425 DeviseCreateUsers: migrating ================================ -- create_table(:users) -> 0.0012s -- add_index(:users, :email, {:unique=>true}) -> 0.0006s -- add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0007s == 20160920061425 DeviseCreateUsers: migrated (0.0028s) ======================= == 20160920080558 AddUsernameToUsers: migrating =============================== -- add_column(:users, :username, :string) -> 0.0006s -- add_index(:users, :username, {:unique=>true}) -> 0.0010s == 20160920080558 AddUsernameToUsers: migrated (0.0017s) ====================== == 20160920090632 AddUrlToUsers: migrating ==================================== -- add_column(:users, :url, :string) -> 0.0005s == 20160920090632 AddUrlToUsers: migrated (0.0006s) ===========================
これでログイン機能はOKです。
投稿機能
以下のコマンドを実行します。
% rails g scaffold post body:text user:references Running via Spring preloader in process 13853 invoke active_record create db/migrate/20160920092635_create_posts.rb create app/models/post.rb invoke test_unit create test/models/post_test.rb create test/fixtures/posts.yml invoke resource_route route resources :posts invoke scaffold_controller create app/controllers/posts_controller.rb invoke erb create app/views/posts create app/views/posts/index.html.erb create app/views/posts/edit.html.erb create app/views/posts/show.html.erb create app/views/posts/new.html.erb create app/views/posts/_form.html.erb invoke test_unit create test/controllers/posts_controller_test.rb invoke helper create app/helpers/posts_helper.rb invoke test_unit invoke jbuilder create app/views/posts/index.json.jbuilder create app/views/posts/show.json.jbuilder create app/views/posts/_post.json.jbuilder invoke assets invoke coffee create app/assets/javascripts/posts.coffee invoke scss create app/assets/stylesheets/posts.scss invoke scss create app/assets/stylesheets/scaffolds.scss
ユーザと投稿は1対多の関係なのでrelationをuser.rbに追記します。
また、ユーザが削除されたときにそのユーザの投稿も削除してほしいのでdependent属性も設定します。
# app/models/user.rb has_many :posts, dependent: :destroy
以下のコマンドを実行します。
% bundle exec rake db:migrate == 20160920092635 CreatePosts: migrating ====================================== -- create_table(:posts) -> 0.0017s == 20160920092635 CreatePosts: migrated (0.0017s) =============================
投稿と投稿者が結びつくようにフォームを修正します。
# app/views/posts/_form.html.erb <div class="field"> <%= f.label :body %><br> <%= f.text_area :body %> <%= f.hidden_field :user_id, value: current_user.id %> </div>
まだ色々な微調整は済んでいませんが、基本的な投稿機能は完成です。 (書くのが面倒くさくなりました。誠に申し訳ございません。一番下にソースのリンクを貼っておくので参考にしてください)
検索機能
次に検索機能を実装します。 今後も使っていくようなアプリであれば検索機能用のgemであるransackを使うのですが、今回は簡単な検索のみなのでgemを使わずに実装しようと思います。
まずはscopeを実装します。post.rbとuser.rbに追記してください。
# app/models/post.rb scope :by_body_like, ->(body){ where("body LIKE '%"+body+"%'") } scope :by_users_id, ->(users_id){ where(user_id: users_id) }
# app/models/user.rb scope :by_username_like, ->(username){ where("username LIKE '%"+username+"%'") }
これで Post.by_body_like(‘hoge’)
で投稿内容に’home'が含まれる投稿を取得することができます。
また、 Post.by_users_id(User.by_username_like(‘foo’).pluck[:id])
でユーザー名に’foo’が含まれるユーザーの投稿を取得することができます。
注意!! この記述には脆弱性が存在します。詳しくは脆弱性検証編を書いてあります。
次は検索機能で用いるラジオボタン用の定数を設定します。 post.rbに追記します。
# app/models/post.rb POST_SEARCH = 1 USER_SEARCH = 2
この定数は Post::POST_SEARCH
と記述すると使えます。
次にcontrollerを記述します。
今回の検索機能はsearch_typeで検索する対象(postのbody,userのusername)を決定し、searchが検索ワードという実装にしました。
posts_controller.rbのindexメソッドを次のように変更します。
# app/controllers/posts_controller.rb def index if params[:search_type] == Post::POST_SEARCH.to_s @posts = Post.by_body_like(params[:search]) elsif params[:search_type] == Post::USER_SEARCH.to_s users_id = User.by_username_like(params[:search]).pluck(:id) @posts = Post.by_users_id(users_id) else @posts = Post.all end end
Post::POST_SEARCH.to_sとなっているのはGETメソッドから得られるパラメータは数値も文字列に変換されているためです。
次にviewを記述します。
posts/index.html.erbに追記します。
# app/views/posts/index.html.erb <%= form_tag({controller: '/posts',action: 'index'}, method: 'get', class: 'search_form', style: 'padding: 20px;') do %> <div class="field"> <%= radio_button_tag :search_type, Post::POST_SEARCH %> <%= label_tag :post %> <%= radio_button_tag :search_type, Post::USER_SEARCH %> <%= label_tag :user %> </div> <div class="field"> <%= text_field_tag :search,'' %> </div> <div class="actions"> <%= submit_tag '検索' %> </div> <% end %>
これで検索機能は完成です。
ここから
- 新規投稿機能をトップページに持ってくる
- bootstrapをCDNで読み込ませる
- UIの調整
- 使ってないメソッド、ルーティング、ビューを削除
- タイムゾーンを東京に変更
などなどを書き換えると脆弱かもしれないSNSの完成です。
次は脆弱性検証編です。 euglena1215.hatenablog.jp
ソースはこちら GitHub - euglena1215/testApp
【大学編入】専門科目の参考書と対策
参考書
プログラミング
C言語によるアルゴリズムとデータ構造
- 作者: 柴田望洋,辻亮介
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/09/01
- メディア: 単行本
- 購入: 3人 クリック: 37回
- この商品を含むブログ (7件) を見る
色々な編入体験記に載っているのアルゴリズムの本です。
基礎固めに役立ちました。
1周
プログラミングコンテストチャレンジブック
プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?
- 作者: 秋葉拓哉,岩田陽一,北川宜稔
- 出版社/メーカー: マイナビ出版
- 発売日: 2012/01/28
- メディア: Kindle版
- この商品を含むブログを見る
通称アリ本です。「C言語によるアルゴリズムとデータ構造」にはグラフ理論や有名なアルゴリズム(エラトステネスの篩、ダイクストラなど)が載ってなかったのでそれらを実装方法を主眼において読みました。ソースはC++ですがCが分かれば読めると思います。
アルゴリズムとデータ構造(青)
アルゴリズムとデータ構造<改訂 C言語版> (電気工学入門シリーズ)
- 作者: 平田富夫
- 出版社/メーカー: 森北出版
- 発売日: 2002/09/01
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 2回
- この商品を含むブログ (2件) を見る
アルゴリズム図鑑
基本的な探索、ソートの名前を聞いたらすぐに挙動をイメージできるように暇なときはこのアプリを使って確認してました。アニメーションを使って分かりやすく説明してくれてるのでとてもイメージしやすかったです。 300円課金すると全てのアルゴリズムが解放されるのですが課金する価値は十分にありました。論理回路
論理回路入門
- 作者: 浜辺隆二
- 出版社/メーカー: 森北出版
- 発売日: 2008/12/16
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 2回
- この商品を含むブログ (1件) を見る
情報理論
情報理論
- 作者: 三木成彦,吉川英機
- 出版社/メーカー: コロナ社
- 発売日: 1999/12
- メディア: 単行本
- クリック: 51回
- この商品を含むブログ (2件) を見る
対策
対策を始める前の僕は「クイックソート、なんか早そう」「グラフ理論なにそれおいしいの?」「計算量ってなんですか」「篩が読めねえ」というような状況で初めて筑波の過去問を解いたときは解き終わるのに2時間半かかり(筑波は数学と専門合わせて2時間)もう死んだと思ってました。
どうせ他の人も同じようなもんだろと思い編入体験記を漁ると「筑波の専門は簡単」「競プロやってたらいける」「直前の1週間に過去問解きまくったらいけた」という記事ばかりで絶望しかありませんでした。
なので他の人より多めに勉強しました。
論理回路や情報理論は勉強すれば点が取れると思います。
対策の方針はこんな感じでした。
プログラミング
参考書をばーっと読む+写経する
過去問解く
解けない&時間がかかり過ぎるところを中心に参考書を読む
もう一度過去問を解く
を繰り返す
暇なときはアルゴリズム図鑑で復習する
論理回路
論理回路をばーっと目を通す
演習問題を解く
過去問を解く
もう一度過去問を解く
を繰り返す
情報理論
情報理論にバーっと目を通す
過去問を解く
もう一度過去問を解く
を繰り返す
僕の勉強のおおまかな流れは
プログラミング
3月下旬~4月上旬
アルゴリズムとデータ構造 読む 1周
4月上旬~試験日
過去問を繰り返し解く、アリ本、アルゴリズムを必要に応じて読む
論理回路
4月中旬~5月中旬
毎週金曜 3時間前後
5月中旬~試験日
過去問を解く
情報理論
6月~試験日
気が向いたときに過去問を解く
分からなかったら情報理論を読む
下の記録を見てもらえれば詳細の勉強記録が載っています。
http://studyplus.jp/users/teppest
編入体験記をまとめました。
euglena1215.hatenablog.jp
rake db:migrateとrake db:schema:loadの違い
rake db:migrate
と rake db:schema:load
はどちらもテーブルを作成、変更、削除するときに使うコマンドだけど違いがよく分かっていなかったのでメモメモ。
rake db:migrate
- migrateファイル群を元にschema.rbを作成
- schema.rbを元にSQLクエリを発行する
rake db:schema:load
- schema.rbを元にSQLクエリを発行する
要するにrake db:schema:load
はmigrateファイルの変更は考慮しないよってことか。
ローカルでは rake db:migrete
, CIツール上では rake db:schema:load
と使い分けるのが一般的で、そうすることによってmigrateし忘れてpushしてもCIツール上のschema.rbのバージョンが同じになるようにしてるみたい。
賢いなあ。
【大学編入】物理の参考書と対策
参考書
力学
基礎 物理学演習Ⅰ
基礎物理学演習 (1) (ライブラリ工学基礎物理学 (別巻=1))
- 作者: 永田一清
- 出版社/メーカー: サイエンス社
- 発売日: 1991/01
- メディア: 単行本
- クリック: 18回
- この商品を含むブログ (2件) を見る
力学の勉強はこれから始めましたが難しかったので10ページほどで断念しました。
結局この参考書に戻ってくることはありませんでした。
物理のエッセンス 力学・波動
- 作者: 浜島清利
- 出版社/メーカー: 河合出版
- 発売日: 2013/04
- メディア: 単行本
- この商品を含むブログを見る
基礎物理学演習で培った苦手意識を克服するために基礎から勉強を始めました。物理対策の導入にはいいと思います。
1周
良問の風
- 作者: 浜島清利
- 出版社/メーカー: 河合出版
- 発売日: 2013/10
- メディア: 単行本
- この商品を含むブログ (2件) を見る
物理のエッセンスより難易度の高い問題集を解こうと思って解き始めたのですが、物理のエッセンスと難易度は変わりませんでした。
物理のエッセンスをスラスラ解けるようになっているのであればワンランク上の名門の森をやった方がいいと思います。僕は時間がなくてできませんでした。
1周
基礎 物理学演習
- 作者: 後藤憲一,小早川恵三,国友正和
- 出版社/メーカー: 共立出版
- 発売日: 1986/10
- メディア: 単行本
- この商品を含むブログを見る
横国の範囲が高校物理と剛体だったのでこの本で剛体をカバーしました。
剛体の例題のみ 1周
電磁気
基礎 物理学演習
- 作者: 後藤憲一,小早川恵三,国友正和
- 出版社/メーカー: 共立出版
- 発売日: 1986/10
- メディア: 単行本
- この商品を含むブログを見る
サイエンス社の電磁気学演習よりこっちの方が薄かったのでこちらを選びました。
難しくて答えを写すことが多く、やった意味があったのかどうかは不明です。
1周
対策
僕は農工大と横国の物理で対応できる程度の物理対策しかしていないので旧帝大、東工大狙いの人は参考にしないでください。
力学と電磁気は問題集を解いて基礎作りをしてから過去問を何周もしました。物理の対策は過去問を何度も解くのが効率よく点数を取る方法な気がします。
解けない過去問は先生や友達に聞いて解答を作りました。
分からない問題を悩んでる時間がもったいないと思ったので嫌われない程度に他人の時間をガンガン使うのが吉だと思います。
対策の方針はこんな感じでした。
力学
基礎物理学演習(黄色) 10ページほどで断念
↓
物理のエッセンス 1周
↓
良問の風 1周
↓
過去問 たくさん
電磁気
基礎物理学演習(青) 1周
↓
過去問 たくさん
僕の勉強のおおまかな流れはこんな感じでした。
力学
春休み始め~春休み中盤
基礎物理学演習(黄色) 3日に1度 30分
春休み中盤~春休み終わり
物理のエッセンス 1日 1時間前後
4月~5月上旬
良問の風 1日 1時間前後
5月上旬~試験まで
過去問 1日1年分、基礎物理学演習 剛体の範囲を適当に
電磁気
4月~5月上旬
基礎物理学演習(青) 1日2例題
5月上旬~試験まで
過去問 1日1年分
下の記録を見てもらえれば詳細の勉強記録が載っています。
http://studyplus.jp/users/teppest
編入体験記をまとめました。
euglena1215.hatenablog.jp
【大学編入】数学の参考書と対策
参考書
大学編入のための数学問題集
- 作者: 碓氷久
- 出版社/メーカー: 大日本図書
- 発売日: 2015/05
- メディア: 単行本
- この商品を含むブログを見る
この本さえおさえておけばだいたい戦えます。解説も丁寧で分かりやすいです。
教科書と同じ出版社なので解答に教科書のページが書かれていて使いやすいです。
とりあえずこれを買うのがいいと思います。
2周
マセマ 線形代数
スバラシク実力がつくと評判の線形代数キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!
- 作者: 馬場敬之
- 出版社/メーカー: マセマ
- 発売日: 2015/12
- メディア: 単行本
- この商品を含むブログを見る
線形空間の導入として使いました。
これだけだと線形空間がふわっとしか分からない(気がする)ので問題集をしっかり解いて慣れることが重要だと思います。
線形空間のみ1周
先生お手製線形空間の冊子
線形空間の定義から定理を示してくれてる冊子です。これのおかげで線形空間の理解がかなり深まりました。
問題集だけだと定理の証明があまり載ってなかったりするので筑波対策だとこれには特に力を入れた方がいいと思います。
教科書の問題集
- 作者: 高遠節夫
- 出版社/メーカー: 大日本図書
- 発売日: 2014/02
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 高遠節夫
- 出版社/メーカー: 大日本図書
- 発売日: 2013/12
- メディア: 単行本
- この商品を含むブログを見る
※筑波っぽい問題・・・問題文がシンプルだけど複雑な問題、定理などの色々な証明問題
STEPUPの難易度は数学問題集のA,Bレベルで農工大レベルだと丁度いいくらいだと思います。
徹底演習
大学編入試験問題 数学/徹底演習(第3版)-微分積分/線形代数/応用数学/確率-
- 作者: 林義実,小谷泰介
- 出版社/メーカー: 森北出版
- 発売日: 2013/11/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
筑波っぽい問題のみ 1周
「大学編入のための数学問題集」を一通り解いて目新しい問題を解きたくなったのでやりました。
数学の教科書
- 作者: 高遠節夫
- 出版社/メーカー: 大日本図書
- 発売日: 2012/11
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 高遠節夫
- 出版社/メーカー: 大日本図書
- 発売日: 2013/12
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 高遠節夫
- 出版社/メーカー: 大日本図書
- 発売日: 2012/11
- メディア: 単行本
- この商品を含むブログを見る
問題集のCを解いていて基礎ができてなくて応用できない問題が出現し始めてからまとめました。
1周
対策
僕は数学対策で一番先に手をつけたのは問題集でした。
教科書でじっくり勉強するのは問題集を一通り解いて「何が分からないのか」を分かってからが効率がいいような気がします。
教科書をじっくり読んでいないと解けないような問題を出してくるのは筑波レベルあたりからで農工大、横国レベルであれば問題集の解答に載っているテクニックさえ押さえておけば一通り解けるんじゃないかと思います。(各大学の傾向もあるので一概に言えませんが)
対策の方針はこんな感じでした。
数学問題集を1~2周 Cは解けないけど答えを見ながらでもいいので解く
↓
教科書をまとめて定義、定理をしっかり押さえる
— 農工大、横国レベル
↓
数学問題集を1周
↓
他の問題集を1~2周
— 筑波レベル
↓
未知の領域
僕の勉強のおおまかな流れはこんな感じでした。参考にしてもらえればと思います。
12月~春休み直前
数学問題集 問題A 1周 1日0~5題
春休み
数学問題集 問題BC 1周 1日7題、マセマの線形代数 1周
4月
筑波過去問を解く、線形代数教科書1周、数学問題集2周目
5月
農工大、横国過去問を解く、筑波をもう一度過去問解く、先生お手製プリント 1周
6月
豊橋の過去問を解く、徹底演習、数学の問題集を筑波っぽいところだけ1周
7月
過去問を主に解きつつ、曖昧なところを教科書をチェック、いままでの問題集の類題を解くなどして最終調整
下の記録を見てもらえれば詳細の勉強記録が載っています。
http://studyplus.jp/users/teppest
編入体験記をまとめました。
euglena1215.hatenablog.jp
実行中のプロセスを表示・終了させる
rails s
でサーバーを立ち上げている最中にPCがフリーズして再起動させるとデーモン化してしまい、終了させることができない。。。ということが多々あるのでメモ。
実行中のプロセスを表示
ps
: 実行中のプロセスを表示
オプション | 機能 |
---|---|
a | 自分以外のユーザーのプロセスも表示 |
u | ユーザー名と開始時刻を表示 |
x | 制御端末を持たないプロセスも表示 |
よく使うのはgrep
コマンドをパイプでつないで
ps aux | grep rails
実行中のプロセスを終了
kill
: 実行中のプロセスを終了
よく使うのは
sudo kill プロセスID
【大学編入】編入体験記まとめ
様々な編入体験記にお世話になったので先人たちに倣って編入体験記を書いていこうと思います。
高専時代の成績
出身高専: 呉高専(電気情報工学科)
1年次 17位
2~4年次 9~11位
5年次 21位
TOEIC: 655(4年次1月)
各大学の記事
筑波大学 情報学群 情報科学類(合格)
→ 単位認定・院試の推薦基準について
横浜国立大学 理工学部 数物・電気情報系学科 情報工学EP (不合格)
東京農工大学 情報工学科(合格)
豊橋技術科学大学 情報・知能課程(合格)
各科目の参考書と対策の記事
勉強スケジュール
僕が勉強を開始したのは4年の冬休みでした。
勉強を始める前についてはこちら
時期 | 時間数 | 内容 |
---|---|---|
12月 | 69時間 | TOEICを中心に勉強。数学に手をつけ始めるも全然わからず。サイエンス社の基礎物理学演習が難しく心が折れて物理から離れる。 |
1月 | 87時間 | 引き続きTOEICを中心に勉強して655点をとった。だいたい12月と同じ。 |
2月 | 28時間 | 定期テストで勉強量ダウン(定期テストを言い訳に勉強しなかった)。 |
3月 | 199時間 | 数学を本格的に始める。物理がこのままではヤバいと思い、難易度を落として物理のエッセンスを進める。アルゴリズムの一般教養(各種探索、ソート、グラフ理論)が抜け落ちていることに気づき愕然とする。編入英語用に速単・DUOを始める。このあたりから数学・専門の過去問を解き始める。 |
4月 | 203時間 | 各教科をまんべんなく進める。電磁気を始める。線形代数の根っこが理解できていないと思い教科書をまとめる。ようやく線形代数が分かり始める。 |
5月 | 163時間 | 各種過去問を中心に解いた。 |
6月 | 156時間 | 各種過去問を中心に解いた。 |
7月 | 69時間 | 各種過去問を中心に解いた。 |
合計974時間でした。
7月の試験直前は記録できてないので実質1000時間にギリギリ達していないくらいだと思います。
3月からは平日6時間、休日10時間で1ヶ月で200時間を目標に勉強してました。
同級生の勉強時間はこれと同じかこれより少ないくらいだったように思いますが、studyplusを眺めていると旧帝大クラスに受かっている人は200時間前後は勉強してたみたいです。
これは一例なので他の方の体験記も参考にしながら勉強スケジュールを決めてください。
下の記録を見てもらえれば勉強記録の詳細が載っています。
http://studyplus.jp/users/teppest
編入試験が終わった人へ
まとめてみました。 euglena1215.hatenablog.jp