2014年4月30日水曜日

Githubにpushしてしまったコミットログを書き換える方法

よく「歴史を書き換える」と言われている作業です
特に今回はコミットログとコミットしたユーザ情報を書き換える方法をご紹介します
違うマシンからpushすると.git/configとかを設定するのを忘れて変なユーザでコミットすることがたまにあるのでメモしておきます

git rebase -i HEAD~3
    3の部分はHEADからどらくらいまで遡るかを指定します
    3つ前のpushまで書き換えたい場合は3を指定します
    エディタが立ち上がるので歴史を書き換えたい行をpick -> editをする
    :wqで保存
    editとした部分で止まるのでコミッター情報を書き換える

git commit --amend --author="username <email@address.com>"
    エディタの起動とともにコミットログを書き換える画面が表示されるのでコミットログを書き換える
    このとき全く書き換えないとpushすることができないっぽいので、ちょっとでもいいので変更すること

git push -f
    コミットが完了したらpushする、このとき「-f」をつけてローカルの変更を無理矢理メインストリームにpushする
    Github上のコミットログで確認するとログとコミッタ情報が書き換えられていると思います

git rebase --continue
    rebase作業を続けます
    他にもeditを指定している場合は同じように修正してcommit -> pushします
    すべてのeditが終了すれば完了です


以上です
「-f」でローカルの情報を強制的にpushするのでローカルの情報はpullして最新の状態にしてから実施することをおすすめします

2014年4月29日火曜日

Jenkinsでビルドが失敗したらGmailに通知する方法

■環境
Windows7 64bit
Jenkins 1.560

■設定手順
1. SMTPメールサーバ(Gmail)の設定
Jenkinsの管理 -> システムの設定 -> E-mail 通知 の設定項目を開きます
「高度な設定」ボタンをクリックしSMTP認証に必要な情報を設定します
  • SMTPサーバー・・・smtp.gmail.com
  • SMTP認証・・・チェックON
  • ユーザ名・・・Gmailにログインするアカウント名
  • パスワード・・・上記アカウント名のパスワード
  • SSL・・・チェックON
  • SMTPポート・・・465
と設定します

2. ジョブ側の設定
既存のジョブでも新規のジョブでも問題ありません
ジョブの設定画面から「ビルド後の処理の追加」でE-mail通知を選択します
これはジョブが失敗した場合にメール通知するための設定でここにメールアドレスを設定します
メールアドレスはカンマ区切りで複数設定することも可能です
「不安定ビルドも逐一メールを送信」は必須ではないので適宜変更してください


以上で設定は完了です
これでジョブが失敗するとメールが通知されるようになります
通知が来ない場合はGmailの設定やACL(Gmailへのoutgoingなど)の設定を確認してみてください

通知機能はメールの他にもSNSやIMに対してもできるようです
また、プラグインで「Configuration Slicing Plugin」というプラグインがありこれをインストールするとメールを通知する設定を全部のジョブを一度に設定することができます

2014年4月28日月曜日

CentOS6.3でrailsのサンプルアプリを動かしてみた

■環境
CentOS release 6.3 (Final) 64bit
ruby 2.1.1p76
gem 2.2.2
rails 4.1.0
sqlite 3.6.20

■インストール
yum -y groupinstall "Development Tools"
yum -y install zlib zlib-devel openssl openssl-devel sqlite-devel
wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
tar zvxf ruby-2.1.1.tar.gz
cd ruby-2.1.1
./configure
make
make install
gem update
gem install rails --no-rdoc --no-ri
gem install execjs --no-rdoc --no-ri
gem install therubyracer --no-rdoc --no-ri
cd /var/tmp
rails new "rails-test"
cd rails-test
echo 'gem "therubyracer"' >> Gemfile
rake db:create
rails server

http://localhost:3000 にブラウザでアクセスしてrailsのサンプルが表示されることを確認する

■サンプルアプリ作成
cd /var/tmp/rails-test
rails generate controller test-app
create  app/controllers/test_app_controller.rb
invoke  erb
create    app/views/test_app
invoke  test_unit
create    test/controllers/test_app_controller_test.rb
invoke  helper
create    app/helpers/test_app_helper.rb
invoke    test_unit
create      test/helpers/test_app_helper_test.rb
invoke  assets
invoke    coffee
create      app/assets/javascripts/test_app.js.coffee
invoke    scss
create      app/assets/stylesheets/test_app.css.scss

vim config/routes.rb
Rails.application.routes.draw do
  get 'hello' => 'test_app#hello'
  get 'bye' => 'test_app#bye'
end

touch app/views/test_app/bye.html.erb
touch app/views/test_app/hello.html.erb
vim app/views/test_app/hello.html.erb
<h1>Hello</h1>
This page is created by template file.
<%= @msg %>

vim app/controllers/test_app_controller.rb
#coding: utf-8
class TestAppController < ApplicationController
  def hello
    @msg = 'hello'
  end

  def bye
    render :text => 'bye'
  end
end

rails server

http://localhost:3000/hello にアクセスするとテンプレートのファイルを表示
http://localhost:3000/bye にアクセスすると文字列を表示

■DBサーバ設定と接続テスト
rails generate model test_app

vim db/migrate/20140425074927_create_test_apps.rb
class CreateTestApps < ActiveRecord::Migration
  def change
    create_table :test_apps do |t|
      t.string :name
      t.timestamps
    end
  end
end
rake db:migrate
   うまくmigrateできない場合、スキーマを変更する場合は「rake db:migrate:reset」でDBを再作成できます
   id, created_at, updated_at カラムは自動で生成されるようです

vim db/seeds.rb
TestApp.create(:name => 'test1')
rake db:seed
   この操作でseeds.rbに記載したレコードをinsertしてくれます
   マスターデータ等事前に登録しておかなければいけないデータを記載します

rails dbconsole
select * from test_apps;
   sqlite3を使ってDBの中を見ることができます、上記SQLでデータが存在することを確認する
   sqlite3自信はファイルDBなので実データはrails上で管理しているファイルを参照しています

vim app/controllers/test_app_controller.rb
#coding: utf-8
class TestAppController < ApplicationController
  def hello
    @msg = 'hello'
    @test_app_all_record = TestApp.all
  end

  def bye
    render :text => 'bye'
  end
end
   モデル名.all とするとDB内にあるデータをすべて取得することができます

vim app/views/test_app/hello.html.erb
<h1>Hello</h1>
This page is created by template file.
<%= @msg %>

<br>
<br>

<table border="1">
  <tr>
    <td>id</td>
    <td>name</td>
    <td>created_at</td>
    <td>updated_at</td>
  </tr>
<% @test_app_all_record.each do |test_app| %>
  <tr>
  <td><%= test_app.id %></td>
  <td><%= test_app.name %></td>
  <td><%= test_app.created_at %></td>
  <td><%= test_app.updated_at %></td>
  </tr>
<% end %>
</table>
   controller内で取得したDBのオブジェクトをeachで回して全レコードを表示してあげます

rails server
httpd://localhost:3000/hello
にアクセスするとDB内の情報が表示されることを確認します

■Tips
ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime

gem install therubyracer --no-rdoc --no-ri
して
echo 'gem "therubyracer"' >> Gemfile
すれば解消する

rubyのインストールにchefのオムニバスインストールをするとgemのバージョンが古くてうまく動作しません

sqlite3でテーブルのスキーマを確認する方法は「select * from sqlite_master;」 or 「.schema table_name」

■参考サイト

P.S 20140508
insertやdeleteできるサンプルを含んだサンプルのソースコードをGithubで公開しました
https://github.com/kakakikikeke/ruby-rails-sample-app

2014年4月27日日曜日

PHPでTwitterのOAuth認証をやってみた

■環境
CentOS release 6.3 (Final)
PHP 5.3.3

■事前作業
yum -y install php php-devel git
TwitterDeveloperのサイトでアプリを作成し「API key」と「API secret」を取得しておく

■TwitterOAuthモジュールインストールおよび設定
cd /var/www/html
git clone https://github.com/abraham/twitteroauth.git
cd twitteroauth
mv config-sample.php config.php
vim config.php
define('CONSUMER_KEY', 'API key');
define('CONSUMER_SECRET', 'API secret');
define('OAUTH_CALLBACK', 'http://hostname/twitteroauth/callback.php');
  API key と API secretは先ほど取得したアプリのキーを入力してください
  OAUTH_CALLBACKのhostnameの部分はOAuth認証後に戻ってくるURLを指定するのでグローバルからアクセスできるhostnameを指定してください

service httpd start

■動作確認
http://hostname/twitteroauth/connect.php

あとは「Sign in with Twitter」をクリックするとtwitterのID/PWの認証が求められるので認証します
認証後はログインしたユーザの情報がvar_dump形式で表示されます
ログアウトしたい場合はサンプル右上の「clearing your session.」をクリックすればOKです

これで作成したTwitterアプリのkeyの有効性のチェックやOAuthできるかのチェックは簡単にできるようになりそうです
今回ソースコードは既存のものを利用しました
同じようにアプリでOAuth認証を実装したい場合はindex.phpの内容を真似れば大丈夫です
OAuth自体の流れを詳しく知りたい場合にはtwitteroauth/twitteroauth.phpの中を確認すればわかります

2014年4月26日土曜日

gitでsubmoduleする方法

  1. submoduleを管理するリポジトリを作成
  2. 作成したリポジトリをclone
  3. git submodule add https://github.com/kakakikikeke/cookbooks-emacs.git
  4. git add cookbooks-emacs
  5. git commit -m "add submodule"
  6. git push -u origin master
  7. サブモジュール側のgitが更新されたら「git submodule update」

上記はすべてGithub上で実施しました
とりあえずsubmoduleの登録の仕方だけメモ


■参考サイト

2014年4月25日金曜日

CentOS6.5にGoogleDriveをマウントしてみた

まずはじめにですが、この操作はGUI環境がないとできません
CentOSにGUI環境を構築する手順はこちらを参照ください
また以下の作業はX環境が整っていること以外、真っさらな環境で作業した場合の手順となります

■環境
CentOS release 6.5 (Final)
X Windows System
firefox 24.0
ocaml 4.01.0
opam 1.1.1

■ocamlインストール
yum -y groupinstall "Development Tools"
yum -y install git m4 fuse fuse-devel libcurl-devel libsqlite3x-devel zlib-devel libcurl sqlite-devel firefox

wget http://caml.inria.fr/pub/distrib/ocaml-4.01/ocaml-4.01.0.tar.gz
tar zvxf ocaml-4.01.0.tar.gz
cd ocaml-4.01.0
vim configure
    prefix=/usr/local -> prefix=/usr
./configure
make world.opt
make install
[root@localhost ocaml-4.01.0]# ocaml -version
The OCaml toplevel, version 4.01.0

■opamインストール
git clone https://github.com/OCamlPro/opam.git
cd opam
./configure
make
make install
opam init
opam update
[root@localhost ~]# opam --version
1.1.1

■google-drive-ocamlfuseのインストール
opam install google-drive-ocamlfuse
    Yを選択してインストールする
    内部的には.configure -> make -> make install の流れ
vim ~/.bashrc
PATH=$PATH:$HOME/.opam/system/bin
export PATH
source ~/.bashrc
google-drive-ocamlfuse

ここでGUI上にfirefoxが立ち上がります
なのでCUI環境しかない場合は事前にvncserver等でGUI環境を立ちあげておいてください
GoogleDriveをマウントするアカウント情報を入力します
アクセストークンを取得する時間に制限があるのでコマンド実行したら早めに認証を開始します


認証が完了するとgoogle-drive-ocamlfuseアプリからアクセスを許可する画面になると思いますので
「承認する」をクリックします


再度アプリのアクアスを許可するかどうか聞かれるので「Allow」をクリックします


最後のAllowをクリックした段階でCUI側のアクセストークンが渡ります
CUI側に「アクセストークンが取得できないよ」みたいなエラーが出ている場合は再度「google-drive-ocamlfuse」を実行してfirefox上で認証してください

■GoogleDriveのマウント
mkdir /googledrive
google-drive-ocamlfuse /googledrive/
mount | grep google
google-drive-ocamlfuse on /googledrive type fuse.google-drive-ocamlfuse (rw,nosuid,nodev)

となっていればOKです
あとは/googledriveにアクセスしてGoogleDrive上のファイルが存在することを確認してください

■Tips
・アンマウント
umount /googledrive

・アクセストークンが取得できていない場合
マウント後にdf等を実行して
df: `/googledrive': デバイスもしくはリソースがビジー状態です
と出る場合はgoogle-drive-ocamlfuseがうまくアクセストークンを取得できていません
google-drive-ocamlfuse /googledrive/のコマンドを実行した段階で再度GUI側にfirefoxが立ち上がるアクセス要求を確認する画面が立ち上がっていると思いますので「承認」をクリックします

・動作がかなり重い
マウントしたフォルダに対するアクセスが異様に重い場合があります
おそらくコマンドを発行するごとに必要な情報をGoogleDrive側に取得しに行っているためかと思います
df で容量を確認するときやlsでディレクトリ内の情報を確認するときに重くなる場合はおそらくネットワークが影響していると思います

・GUI環境がないと動作しなのが辛い
アクセストークンの期限が切れた場合は再マウントする必要があるのですが、その場合は再度アプリからのアクセスを承認する必要があるので
その場合はvnc等のGUI環境が動作している必要があります
どのくらいの頻度で承認を求められるかわかりませんが、GUI上に移動して毎回承認するのは結構辛いなと感じました

・GoogleAcountでアプリの権限を確認する
https://security.google.com/settings/security/permissions?pli=1
上記のページにログインすると今回承認したgoogle-drive-ocamlfuseがアクセス許可されていることがわかると思います
google-drive-ocamlfuseを使用しなくなった場合は念のためこのページからアクセス許可を削除したほうがいいと思います

■参考サイト

2014年4月23日水曜日

CentOS6.3にVNCをインストールしてGUI環境を構築する方法

■環境
CentOS release 6.3 (Final) 64bit
   -> yum updateして6.5になります
tigervnc-server-1.1.0-8.el6_5

■インストール作業
yum -y groupinstall "X Window System" "GNOME Desktop Environment" "Desktop"
yum -y install libXfont xorg-x11-xinit xorg-x11-fonts-Type1
yum -y install tigervnc tigervnc-server
export DISPLAY="localhost.localdomain:1"

yum -y update
   なぜこの段階でyum updateしているのかというとどうやらCentOS6.3のデフォルトのドライバだとうまくXが起動しませんでした
   以下のようなエラーが「X -configure」や「startx」時に出ていました
   open /dev/dri/card0: No such file or directory
startx &
   この段階でX Windows Systemが起動できるか確認します
   上記のコマンドで起動して「pgrep X」でプロセス番号が表示されれば起動できています
   とりあえず起動を確認したらkillしておきます
   vncserverを立ち上げる段階でもvncserverが自動でXを立ちあげてくれますがそもそもXの起動がうまくいかないとvncもうまく起動しないのでXの確認をしておきます

■vcnserver実行
vncserver
   初回実行時はパスワードを設定します

vncviewerを使って「IPアドレス:5901」にアクセスします


パスワードを聞かれるので設定したパスワードを入力します
通信が暗号化されていないよーという警告が表示されますが無視します
以下のように接続できてエクスプローラ等が表示、操作できれば問題ないです

■Tips
・vnc-server停止方法
   vncserver -kill :1

■参考サイト