2014年7月29日火曜日

インストールした直後のLinux(Redhat,CentOS系)が外に繋げない(名前解決してくれない。yumできない)。

VMとかにLinuxをインストールして、yumでミドルウェアをインストールしようとしたら、、、WorldWideWebに繋がっていないなんてことありますよね。

そんな場合は、慌てずに下記を試してください。

1.pingってみる
ping yahoo.co.jp
これで100% packet loss


2.まずは、問題の切り分けです。
/etc/hostsに下記を追記してください。
182.22.59.229 yahoo.co.jp


3.外につながるか確認
ping yahoo.co.jp
これで、つながる。


手順3でつながるなら、下記手順で対応出来る可能性があります。

4./etc/nsswitch.confを確認
hosts:と書かれている行を探す。
"files"としか書かれていなければ、アウト。
"files dns"と記述してください。

5.手順4で無理なら、/etc/resolve.confを確認
nameserverの記述があるか?
なければ、下記を追加
nameserver 8.8.8.8
※8.8.8.8はGoogleのpublic DNSです。

これで外の世界につながるようになっているはずです。

※手順2でhostsファイルに追記した設定は消しておいてください。

2014年7月21日月曜日

MySQLのスロークエリログに出し方

下記を/etc/my.cnfに追記する。
[mysqld]
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2
log_queries_not_using_indexes
log_slow_admin_statements

・low_query_log
1:ログを出力する
2:ログを出力しない

・long_query_time
単位は秒なので、どのラインから遅いか?というのを適当に決めて書く

・log_queries_not_using_indexes
これを記述するとインデックスを使っていない検索はすべてログに出す

・log_slow_admin_statements
ALTER TABLEなどのクエリも同様に計測したい場合に記述する

MySQLのスロークエリをログに出す方法があると初めて知った。

他にも色々と書いてあって参考になった。↓

2014年7月20日日曜日

Railsにて複合主キーのテーブルをupdateしたい場合

Railsはデフォルトでは複合主キーに対応しておらず、検索は問題なくできるが、更新系(update,delete)はエラーが発生してしまう。
『rails update Mysql2::Error: Unknown column where clause』的なエラーに遭遇してしまうはず。

そういう場合は、composite_primary_keysというモジュールを組み込むと解決できるので試してみるとよい。

Gemfileに下記を記述
gem 'composite_primary_keys'

その後、bundle install
bundle install

それから、modelを修正する
class UserClassRelation < ActiveRecord::Base
  self.primary_keys = :user_id, :class_id
end

上記を書いたら、アプリケーションサーバを再起動してupdateなどを試してみてください。

2014年7月12日土曜日

Dockerfileを利用してMySQLのインストールとRuby2.1、Railsのインストールを行い、かつソースもGithubからcloneする

Mac上で開発をしてもいいが、あんまり環境を汚したくないのでDocker上のCentOS上で開発ができる用にする再現の装備を整える手順です。

Docker上に設定しきってしまいたい部分。
OS:CentOS
ミドルウェア:MySQL,Ruby2.1,Rails
ソース:Githubのclone

MySQLに関してはutf-8がいいので、設定ファイルをホストOSからコピーさせています。

> cat Dockerfile 

FROM centos
MAINTAINER sample_name 

RUN echo "Install lib"
RUN yum install -y git vim sudo tar wget
RUN yum install -y gcc make gcc-c++ zlib-devel httpd-devel openssl-devel curl-devel sqlite-devel

RUN echo "Install mysql"
RUN yum install -y mysql mysql-server mysql-devel
ADD etc/my.cnf /etc/my.cnf
RUN touch /etc/sysconfig/network

RUN echo "Install ruby"
RUN cd /root/ && wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
RUN cd /root/ && tar zxvf ruby-2.1.1.tar.gz
RUN cd /root/ruby-2.1.1 && ./configure && make && make install
RUN gem install bundler --no-ri --no-rdoc -V
RUN gem install rb-readline --no-ri --no-rdoc -V

RUN echo "Install rails"
RUN gem install rails --no-ri --no-rdoc -V
RUN gem install mysql2 -v '0.3.16' --no-ri --no-rdoc
RUN echo rails -v

RUN git clone https://github.com/{githubユーザID}/{プロジェクト名}

RUN bundle install

ADDって箇所が、ホストOSのファイルをDocker上にコピーしている部分です。
Dockerfileのディレクトリからのファイルパスを記述します。
ADD ホストOS側のファイルパス Docker上のファイルパス

Dockerfileを利用してのdockerの起動は下記コマンドになります。
docker build -t {docker imageを保存する名前} .
例)
docker build -t ak220/ruby:1.0 .

本来なら、Monitとかのインストールもしてしまって、MySQLの起動などをMonitに任せる感じにしたいところだが、Docker上でシステム開発をすることを目的としているので、この状態で今回は終わりです。

MySQL起動時に /etc/sysconfig/network: No such file or directoryと言われたら

Dockerを利用してCentOS上のMySQLを起動しようとすると下記感じでエラーが出る事がある。
$ /etc/rc.d/init.d/mysqld start
/etc/rc.d/init.d/mysqld: line 23: /etc/sysconfig/network: No such file or directory

その場合は、networkファイルを作ってあげれば解決する。
$ touch /etc/sysconfig/network

git push で 403 Forbidden が発生したら

Githubにpushしたら下記エラーが発生した。
git push
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/{githubユーザ名}/{プロジェクト名}/info/refs

fatal: HTTP request failed

・対処方法
pushするURLを見失っている状態っぽいので、下記コマンドを実施。
git remote set-url origin https://{githubユーザ名}@github.com/{プロジェクト名}
git push
これで正しくpushできるようになるはずです。