TECH EXPERT 34日目

TECH::EXPERT

本日で応用カリキュラムを終えました。2日前倒し。
スケジュール的には多分1週間程度の前倒しをして欲しそうだけど、事前学習をみっちりやってる人じゃないと無理っぽい。もしくはカリキュラムをなぞるだけでパーっと進んじゃう人か、もともと多少なりとも経験のある人。
私の場合はこの34日間のうち、休んだのは5日ほど。加えて基礎カリキュラムが終わった段階でカリキュラムを無視して自分用のスクレイピング機能を作ったりして5日くらい無駄にしているので余裕は10日分ほどしかない。理解がゆっくりな人だと終わらないんじゃないかな。
あと私は連日10〜12時間程度を勉強に当てていたけど、8時間程度なら毎日欠かさずやってもギリギリな気がする。そういう意味では渋谷に家を借りて正解だった。

ということで今日はやることがなくなったので17時にはサヨウナラ。
明日以降は個人アプリ開発なのでTECHの教室にいる意味もないし出席しません。
盆休みも終わって宿や道路も空くだろうし、台風も過ぎ去るので旅に出ようかな。

重要なことですが、この期日までに指定のアプリを仕上げないと就職補償を受けられないそうです。私は就職はどうでもいいですが、人によってはやめるか続けるかの岐路に立たされるかもしれない。

rails

timezoneの変更

通常はrailsの表示はutcで、データベースの書き込みもutcで行われる。
表示のみjstにするか、データベースをjstにするかでやり方が変わる。

基本的な考え方は、railsの表示時間とDBに保存する時間の2つ。
加えてDBからviewに出力する際にrailsの表示時間と異なる場合に変換をかませるか。
ここに注意しておけばOK。

db: utc 表示: jst

config/application.rb

config.time_zone = 'Tokyo'
config.active_record.default_timezone = :utc 

active_record.defalult_timezoneは書かなくてもutcがデフォルトになる。

views/view.html.erb

created_at.in_time_zone('Tokyo')

in_time_zone(‘Tokyo’)をつけることで表示上+9時間してくれる。

データベースもjstへ変更する。

config/application.rb

config.active_record.default_timezone = :local 
(ローカルがjstに設定されていること前提、サーバーがjstである必要あり)

time_zone変更時にデプロイでrake aborted!

requireと同レベルにconfig.time_zoneを書くと、
NameError: undefined local variable or method `config’ for main:Object
が出て困った。

正しくはmodule Projectの中に入れます。以下のように。

require_relative 'boot'

require 'rails/all'
Bundler.require(*Rails.groups)

module Project
  class Application < Rails::Application
    config.generators do |g|
      g.stylesheets false
    end
    config.i18n.default_locale = :ja
    config.time_zone = 'Tokyo'
  end
end

ロードバランサ

ELB

Elastic Load Balancing

CLB(Classic Load Balancer)、ALB(Application Load Balancer)、NLB(Network Load Banancer)の3種類

ELBを使う時の注意点

ロードバランサによって最初に振り分けられたサーバと別のサーバに振り分けられると、そこで一連の流れが途切れてしまいまた最初からやり直しが必要だったりする。

  • ELBを作成した後に”維持設定の編集”をクリック
  • “ロードバランサーによって生成された Cookie の維持を有効化”を選択
  • 設定情報を持つ秒数を入力

デバッグ

mysqlの起動の確認と起動

sudo service mysqld status
sudo service mysqld start

mysql.sockのパス指定

railsとMySQLサーバーのやり取りは、ソケットファイルを通じて行われる。

$ mysql_config --socket
# 下記のようにmysql.sockがどのディレクトリに存在しているかが出力される
/var/lib/mysql/mysql.sock
config/database.yml

production:
  <<: *default
  database: ~~~(それぞれのアプリケーション名によって異なっています。こちらは編集しないでください)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
 # socket: に続く部分を先ほど調べたパスに置き換える 
  socket: /var/lib/mysql/mysql.sock

cannot allocate memory ~

# rootユーザーへ変更する
$ sudo su -

# ダーティー・キャッシュをディスクに落とし込む
$ sync

# ページキャッシュおよびディレクトリエントリー(dentry) とinode のクリア
$ echo 3 > /proc/sys/vm/drop_caches

nginx 403 Forbiden

ログの確認

cat log/nginx.error.log

13 permission deniedの場合、nginxの設定変更へ

sudo vi /etc/nginx/nginx.conf

userに関する記述を、下記のように変更

user  ユーザー名;
worker_processes  1;

自動デプロイ時みmigrateで失敗

マイグレーションの実行履歴から該当ファイルを削除

マイグレーションを削除した時にnofileと表示されてしまった場合の対処法 - bokunonikki.net

デプロイ時に設定変更が反映されない。

unicornをkillできていない可能性があるため手動でkillしてから再度デプロイする。

アクセスできない we are sorry~~

UnicornとNginxを再起動してみる

sudo service nginx reload

css, javaが反映されない

project階層で以下を実行

rake assets:precompile RAILS_ENV=production

画像の読み込みがうまくいかない

public/images以下に設置した画像はコンパイルされないため、本番環境にデプロイしてもパスが変わらない。
一方、assets/images以下に保存した情報はコンパイル時に参照先が変化する。この影響で画像を読み込めない場合がある。
このため必要な画像はpublic/images以下に設置する。

production.logに何も出力されない

railsアプリケーションをherokuにデプロイする際には、rails_12factorgemを導入する必要あり。
CSS・Javascriprなどのassetsとアプリケーションのlogの出力先をheroku用に整えるgem。

herokuからAWSへとデプロイ先を切り替える場合は、このgemをGemfileから削除。
gemfileから削除してbundle install

tail -f

ファイルの変更をリアルタイムで反映して表示する

tail -f log/production.log

mySQL

mysql.server start

が実行されると.socketファイルを読みに行く。
過去にmysqlをインストールしていたりするとこの位置が違ってエラーがでる可能性あり。

MySQLの設定ファイルであるmy.cnfを作って、今から使う設定をそこに書き込む
  (+ エラーが吐かれるようにエラーログを記録するディレクトリ等も書き込む)
上記で指定したファイルには、書き込みが可能な権限を与える

/etc/my.cnfの位置にmySQLの設定ファイルであるmy.confを作成する。
中身は以下のようにする。

[mysqld]
socket  = /tmp/mysql.sock

[mysqld_safe]
log-error=/var/log/mysqld.log

ログが出力されるファイルを作成する。

sudo touch /var/log/mysqld.log

権限の変更をする。

sudo chown ユーザー名:wheel /var/log/mysqld.log

※sudo する権限のあるグループはwheel という名前にする(ただの慣習)

usr/local/binなどあたりにpidファイルを生成しようとするも権限が無くできない

sudo chmod ユーザー名:wheel /private
エラーログが書けない。
$sudo chmod 755 /var/log
socketファイルが書けない(生成できない)
$sudo chmod 755 /tmp

mysqlをbrewで入れて、my.confを作ってない場合、
以下でエラーログを確認できる。

less /usr/local/var/mysql/`hostname`.err

mySQLのソフトウェアとデータのバージョン違い

通常インストールすると5.7が、指定すれば5.6等の他バージョンを使える。

brew uninstall mysql, brew install mysql56

などとすればソフトウェアのバージョンを切り替えることができるが、データのバージョンまでは変わらない。ここでエラーとなる場合がある。
/usr/local/var/mysqlを削除すればデータの削除となる。

sudo rm -rf /usr/local/var/mysql

mysqlの起動に関するファイルの権限が違う場合

所有者権限を確認。

ls -la /usr/local/var/mysql

ファイルの権限がユーザーと違っていれば書き換える。

sudo chown -R $(whoami):admin /usr/local/var/mysql

rails

enum

カラム名に対して設定する。
カラムはinteger型かboolean型のものが対象。

nationテーブルにprefectureカラムがある場合
enum prefecture: [:tokyo, :saitama, kanagawa]

enum prefecture: { tokyo: 5, saitama: 10, kanagawa: 3 }

[]で指定すると0から順にintが割り当てられる。
{}で渡すと番号も指定できる。ただし、自動追加はできない。

linux

psコマンド

オプション一覧

ps コマンド

コメント