2012/05/08

さくらVPS 新プランへの移行


先日(といっても結構日が経ってしまいましたが)、さくらVPS に「絶対お得な新プラン」が登場しましたね。



開始当初は申し込みが殺到し、一次申込み停止になりましたが現在は安定しているようです。


というわけで、旧プラン の 「さくらのVPS 512」を、同じ金額でグレードアップした「さくらのVPS 1G」に移行してみました。


新プランでは CentOS 6 がインストールされています。新OSも気になりますが、ひとまずココは旧プランの CentOS 5 の環境をそのまま移行することにしました。


作業の流れ


作業の流れは大体下記のような感じになります。


  1. DNS の TTL を変更
  2. OS再インストール
  3. データ転送
  4. 調整
  5. 動作確認
  6. 再データ転送
  7. DNS の A レコード を変更
  8. 後始末


前提条件・事前準備


ここで紹介する方法は、まるごと移行してしまう方法ですので、下記の前提条件と、事前準備を実施します。


前提条件


  • 両サーバとも同じOS及びバージョンで行うこと(ここでは CentOS 5)

事前準備 作業時間:15分程度


DNS の TTL を変更


サーバ切り替えが即座に反映されるようにするため、DNS の TTL を短め(60など)に設定しておきます。

この DNS の設定変更タイミングは、現在設定されている TTL を目安に考えます。

例えば、現在の TTL が 3600 だとすると、3600秒前(1時間前)までに DNS の変更をしておくのが望ましいです。


OS再インストール


両サーバとも同じOS及びバージョンで行うことが条件なので、まずは VPS コントロールパネル から OS再インストール を実施します。

カスタムOSインストール から、 CentOS 5 x86_64 を選択して OS 再インストールを実行します。


カスタムOSインストール は、ブラウザの Java アプレット上から手動で実施します。公式サポートマニュアルを参考に進めてください。


なお、カスタムOSインストール実行中に表示される、ホスト名やIPアドレスなどが記載された画面は、後ほどまで確認するので閉じないようにします。念のためメモ帳などにコピペしておくのがいいです。


カスタムOSインストールガイド|さくらのVPS|さくらインターネット公式サポートサイト


再インストールが完了したら、VPS ホームよりサーバを起動しておきます。


移行作業


データ転送 作業時間:約1G の転送で30分程度


サーバの再インストールが完了したら、いよいよデータの移行です。

データの移行は、旧サーバ の root ユーザから下記のコマンドで一括転送します。

[new_server_ip] は新サーバの IP アドレスに置き換えてください



# rsync -rtlzvogpHAX --exclude /boot/ --exclude /dev/ --exclude /proc/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude ifcfg* --exclude ssh_host_* --exclude fstab --block-size=4096 -e ssh / new_server_ip:/

コマンドの意味やオプションなどについては、下記を参考にしてください。


オプション
動作内容
-r
ディレクトリ内容を再帰的にコピーします
-t
更新日時を保持します
-l
ソフトリンクを保持します
-z
転送時に圧縮します
-v
処理状況を表示します
-o
所有者を保持します
-g
グループを保持します
-p
パーミッションを保持します
-H
ハードリンクを保持します
-A
ACLを保持します
-X
拡張パーミッションを保持します
--exclude
除外するファイルの名前を指定します
--block-size=
チェックサムをとる際のブロックサイズを指定します
-e ssh
ssh経由でコピーします

転送が完了したら、VPS コントロールパネルよりサーバを再起動します。


新サーバのネットワーク設定 作業時間:5分程度


GATEWAY の追記


再起動後、SSH で接続できない場合は、VPS コントロールパネルの リモートコンソール から下記のようにネットワークの設定を修正します。

GATEWAY の設定を追記します。

[GATEWAY=***.***.***.***] は新サーバの ゲートウェイ アドレスに置き換えてください


/etc/sysconfig/network-scripts/ifcfg-eth0

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

# Intel Corporation 82540EM Gigabit Ethernet Controller
DEVICE=eth0
BOOTPROTO=static
DHCPCLASS=
HWADDR=**:**:**:**:**:**
IPADDR=***.***.***.***
NETMASK=255.255.254.0
ONBOOT=yes
GATEWAY=***.***.***.***

# /etc/init.d/network restart

SSH の許可


旧サーバの SSH の設定は、外部からの接続は 鍵認証のみ root ログイン不可 になっているので、一時的にこれを変更します。


/etc/ssh/sshd_config

#vi /etc/ssh/sshd_config

PermitRootLogin yes
PasswordAuthentication yes


/etc/hosts.allow


/etc/hosts.allow, deny で接続制限をしている場合は、こちらも旧サーバを許可する。


/etc/hosts.allow

# vi /etc/hosts.allow

sshd: 旧サーバのIPアドレス

IP アドレスに依存する設定の修正 作業時間:それぞれ


ネットワークの設定が完了したら、IP アドレスに依存する設定などを修正していきます。

旧サーバのユーザ情報などそのまま移行しているので、SSH クライアント の設定も IP アドレスの変更だけで OK でした。


  • NameVirtualHost での Apache 設定
  • MySQL の pid 置場

バックアップ無し

$ sudo find /etc/httpd/conf.d -type f -name '*.conf' | xargs sudo perl -i -pe 's/xxx\.xxx\.xxx\.xxx/xxx\.xxx\.xxx\.xxx/g'
$ sudo find /var/www/vhosts -type f -name '*.conf' | xargs sudo perl -i -pe 's/xxx\.xxx\.xxx\.xxx/xxx\.xxx\.xxx\.xxx/g'

バックアップをとっておく場合(*.bak というバックアップファイルが作成されます)

$ sudo find /etc/httpd/conf.d -type f -name '*.conf' | xargs sudo perl -i.bak -pe 's/xxx\.xxx\.xxx\.xxx/xxx\.xxx\.xxx\.xxx/g'
$ sudo find /var/www/vhosts -type f -name '*.conf' | xargs sudo perl -i.bak -pe 's/xxx\.xxx\.xxx\.xxx/xxx\.xxx\.xxx\.xxx/g'

/var/run 以下は転送から除外しているので、/var/rub/mysqld を作成しておく

$ sudo mkdir /var/run/mysqld
$ sudo chgrp mysql /var/run/mysqld/
$ sudo chmod g+w /var/run/mysqld/
$ sudo /etc/rc.d/init.d/mysqld start

動作確認


ここまでで既に殆どの環境が移行できているはずなので、自分のマシンの hosts を設定して動作を確認してみます。

なお、 hosts ファイルは管理者権限で起動したメモ帳などで編集します。

スタートメニュー > 全てのプログラム > アクセサリ > メモ帳 から右クリックで管理者として実行。その後メニューの開くからファイルを開きます。

C:\Windows\System32\drivers\etc\hosts

新サーバIPアドレス   ドメイン名
xxx.xxx.xxx.xxx   www.test.com

再度データ転送


確認作業をしている間などの差分ファイルを転送します。

転送中にファイルが変更されないように、旧サーバの主要なサービスは予め停止しておきます。


サービスを停止している間は、外部からの閲覧もダウンしている状態になります。


コマンドは最初の転送と同じですが、旧サーバで SSH のポートを変更している場合はポートの指定を入れます。

# /etc/init.d/httpd stop
# /etc/init.d/mysqld stop

# rsync -rtlzvogpHAX --exclude /boot/ --exclude /dev/ --exclude /proc/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude ifcfg* --exclude ssh_host_* --exclude fstab --block-size=4096 -e ssh / new_server_ip:/

ポートを指定する場合
# rsync -rtlzvogpHAX --exclude /boot/ --exclude /dev/ --exclude /proc/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude ifcfg* --exclude ssh_host_* --exclude fstab --block-size=4096 -e "ssh -p 10022" / new_server_ip:/

IP アドレスに依存する設定の修正


転送で修正ファイルが上書きされてますので、上記の設定を再度実施します。



DNS の A レコードを変更


いよいよです。

DNS の A レコードを変更することで、外部からの接続が新サーバに振られることになります。

各ネームサービスの指示に従って変更してください。

TTL の設定を変更した場合は、ついでに戻しておきましょう。


移行後


SSH の設定などを元に戻す


SSH の設定など、一時的に許可した設定を元に戻すのを忘れずに。


お疲れ様でした!


これで無事に移行が終わったかと思います。お疲れ様でした。

さくらのVPS 新プラン乗り換え優遇施策 は、2012年5月20日(日)までなので、まだ申し込みしていない方はお早めに!




参考サイト:

2011/11/04

#gdd11jp Google Developer Day


11月1日、パシフィコ横浜で Google Developer Day 2011 が開催されました。


毎年参加させていただいており、今年もなんとか参加してきました。


サプライズ


結果的にはとても楽しかった GDD。セッションに迷うのは毎度のことですが、今年は色々「しかけ」が用意されており、楽しめるイベントになっていました。

ただ、恒例?のサプライズ発表は特になかったので、ちょっと残念。


全体を通して、やっぱり HTML5(Chrome) と Android(Ice Cream Sandwich) に力入ってましたね。


今回参加したセッションは次の通り。


  • Android の最新情報
  • Google+ Hangout アプリを作ろう
  • 今までにないサイトを作る:HTML5 による最新ウェブアプリ
  • Google Apps : 新しい API、新機能、ベストプラクティス
  • Google のエンジニアの日常
  • イグナイト ( ライトニングトーク )

改めて見ると、新サービス関連に偏ってます。

セッションの内容も、サービスの説明から入る分、あまりコアな情報はありませんでした。

既存サービスのセッションのほうが割りと濃い内容だったみたいです。


Android の最新情報


気になる Android 4.0 。Android 4.0 からは、テレビ、タブレット、スマートフォンなど、すべてのデバイスをカバーする。

なので、デザインはより慎重に行う必要がある。画面サイズの管理も。

ソーシャルもより重要に。Google + が前面に出ています。インテントを利用した設計がおすすめ。

思った以上に、NFC の Android Beam は面白いですね。今開いているWebページが、相手の端末にも表示されるデモは素晴らしかったです。

それと、Wifi Direct ってのも気になります。端末同士がダイレクトにネットワークでつながるということで、面白い使い方ができそうですね。


Google+ Hangout アプリを作ろう


違うセッションを予定していたけど、基調講演で Hangout が気になったので続きを聞いてみた。


基本的に、iFrame のガジェットで構築。ビデオカンファレンスのようなものを手軽に構築できそう。

デモは、チャットルームのような Hangout で、招待された人とビデオチャットしながら、参加者のロボットアバターがアプリ内で動く。というもの。

データはひとつの Shared データなので、参加者全員にリアルタイムで更新される。

面白そうだけど、どんな使い道があるか?今後に期待です。


今までにないサイトを作る:HTML5 による最新ウェブアプリ


HTML5 のフルスペックである Chrome ならこんなことまでできる!という内容でした。

これからのWebアプリは、ビジュアルも重要だと。

HistoryAPI でシングルページだけど、URLが変わってブラウザの戻るも使える。GitHub みたいなページ遷移。たしかにコレ重要ですね。

FilesystemAPI では、ネイティブとの連携でファイルのドラッグドロップなど、ネイティブファイルを操作できる。

古いブラウザには、PolyfillsChrome Frame を使うのがいいみたい。


ライブラリは、lawnchair , Boilerplate , Modernizr を使うといい。


これらが ブラウザ標準で利用できるのが素晴らしいですね。(まだまだ対応していないブラウザも多いですが)


Google Apps : 新しい API、新機能、ベストプラクティス


DevQuiz での Apps Script が面白かったのでもう少し詳細を期待していましたが、やっぱり、そもそも Apps Script は知名度が低く、触り程度の紹介でした。

しかし、UI Builder や PickerAPI などビジュアル的にも Google UI と統一されたものが揃ってきて、かなり使えるという印象でした。

マーケットプレイスでの公開も拡充してきており、Apps Script は今後本気で勉強したほうがよさそうです。

Google Data API については、これまでの複雑なものをシンプルにすべく [HTTPS] [OAuth2] [JSON] で統一とのこと。これは嬉しいですね。

API の確認には、Google APIs Explorer が便利。


Google のエンジニアの日常


あの有名な yugui さんが登場とのことで、観てきました。

オープンソースな人から見た Google というのは面白かった。

オープンソースの世界では当たり前の光景が、Google という巨大な組織でも適用されているのがすごいと。

エンジニア主導、ドキュメント、コードレビュー、ひとつのリポジトリなどは、初めての GDD に聞いた時と変わっていないようで、その徹底ぶりが Google の強みだと改めて感じました。


イグナイト ( ライトニングトーク )



最後のセッションは、おなじみ?Google スタッフによるダンス!合計30時間も練習したんだとか。みなさん、お上手でした。

Chrome の WebAudio と Node.js のデモはすごかったですね。基調講演でも WebAudio が紹介されていて、Javascript と HTML5 で音まで操作できるみたい。昔の MIDI を奏でるサイトをパワーアップできそうです。



初めにもらった、3Dメガネ。結局自分は使わなかったけど、どうやら Youtube が 3D に対応した動画があるようで、帰宅後我が家は大興奮でした。

緑と赤のあのメガネをお持ちの方は、是非御覧ください。




まとめ


世の中、Javascript と HTML5 の世界になるようです。この2つの技術は必修科目ですね。

そして、進化した Android と AppEngine でバックエンドとモバイル。

ソーシャル対応に Google+ 。ビジネス Apps では、Apps Script 。

なんだかんだで、覚えることはイッパイです。

 

最後に、スタッフやボランティアの皆様方、お疲れ様でした!

2011/09/16

Google Apps Script ってすごいね

先日まで、Google Developer Day 2011 の DevQuiz がありました。

その中で Apps Script に関する問題が出題されていました。

個人的に気になっていたもので、ちょっとやってみることにしたのですが、ユーザガイドをみて驚きました。機能がすごく充実しています。

「オラ、わくわくすっぞ!」って感じです。


Google Apps Script ってなに?


Google Apps Script は、JavaScript を使用して Docs, Spreadsheets, Sites などから各種 Google サービスを制御することできます。
Microsoft Office における VBA のようなものです。

Apps Script では、作成した JavaScript のプログラムがサーバ上で実行される、という点が特徴ですね。


まだまだ日本語の情報が少ない Google Apps Script ですが、 Googleを追いかけろ! が参考になります。


Google Apps Script って何が出来るの?


何が出来るのかは、これから見ていきましょうw。

Excel を Apps Spreadsheets に移行する際の障壁は、VBA マクロだと思っていましたが、それが取り除かれた。と思ってもいいくらいなことができそうな予感です。


Google Apps Script を使ってみる


何はともあれ、どんなものかやってみましょう。


お題


よくある Excel マクロのように、CSV ファイルを読み込んで、Spreadsheets に出力してみます。


  1. スクリプトエディタ

    新規に作成した Spreadsheet から、ツールメニューの「スクリプトエディタ」でスクリプトエディタを起動します。

  2. コードを記述

    コード欄に下記を打ち込みます。

    function onOpen() {
      var app = UiApp.createApplication().setTitle("Upload CSV to Sheet");
      var form = app.createFormPanel().setId('frm').setEncoding('multipart/form-data');
      var formContent = app.createVerticalPanel();
      form.add(formContent);
      var file = app.createFileUpload().setName('thefile');
      var button = app.createSubmitButton('Submit');
    
      formContent.add(file);
      formContent.add(button);
    
      app.add(form);
    
      var doc = SpreadsheetApp.getActive();
      doc.show(app);
    }
    
    function doPost(e) {
      var app = UiApp.getActiveApplication();
      var fileBlob = e.parameter.thefile;
    
      var data = fileBlob.getDataAsString();
      if (!data) {
    	return app.close();
      }
      var csvData = data.split('\n');
    
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange(sheet.getLastRow()+1, 1).setValue(fileBlob.getName());
    
      var startRow = sheet.getLastRow()+1;
      var startColumn = 1;
      for (var i=0,l=csvData.length;i<l;i++) {
    	var csvRow = csvData[i].split(',');
    	for (var j=0,l2=csvRow.length;j<l2;j++) {
    	  sheet.getRange(startRow+i, startColumn+j).setValue(csvRow[j]);
    	}
      }
    
      return app.close();
    }
    		
  3. Script の実行

    フロッピーアイコンでスクリプトを保存し、「関数を選択」より「onOpen」を選択します。

    再生ボタンでスクリプトを実行します。

  4. CSV をアップロード

    表示されたフォームより、適当な CSV ファイルを選択して、Submit です。

  5. CSV がシートに出力される

    CSV の内容がシートに書きだされました!


プログラムの説明を少しすると、[onOpen]という関数が、シートを開いたときに自動実行される関数です。VBA にもありますね。

ここで、アップロードフォームを作成し、表示させています。

もう一つの[doPost]という関数。これはフォームポスト時に呼び出されるもので、データの取得とシートへの書き出しを行っています。

doPost がポスト時に呼ばれるということに気付くまで結構はまりました…。


参考までに、アップロード時に使用した CSV と、Spreadsheet は下記から。参考にしてください。
*スクリプトの実行はできません


Google Apps Script をやってみて


リファレンスとにらめっこが必要ですが、汎用的な JavaScript で記述できるので非常にわかりやすいですね。

これから少しずつ、どんなことができるのか確認しながら、紹介してきたいと思います。

2011/09/12

Google AppEngine の新料金体系

とっても久しぶりのブログ更新です。皆さんお元気ですか?僕は元気です。


最近、AppEngine の料金体系変更によって、大幅に料金が増えるという話題をよく目にします。

気になって自分も確認してみました。
そして、多分にもれず驚いたのでメモしておきます。


AppEngine 新料金体系


AppEngine の新料金体系は、従来(現行)の CPU Time での課金から、Instance Hours での課金に変更されます。


料金の詳細は、 Google cloud services – App Engine に記載されています。


また、気になる、新料金体系ではどのように見積もられるのか?は、Admin Console の Billing History から確認することができます。



via Managing Your App's Resource Usage - Google App Engine - Google Code

今なら半額キャンペーン中!


上記のレポートの一例では、 Frontend Instance Housrs は、 $12.41 となっています。

為替レートが 1米ドル /円 = 77.089115 (ほんと円高ですね)ということなので、約956円/日。一ヶ月で 28,700円です。


でもよくみると、「Frontend Instance Hour costs reflect a 50% price reduction active until November 20th, 2011.」となっています。

11月20日までは半額キャンペーン中みたいです。

確かに Frontend Instance Hours: $0.04/Hour となっています。正規の料金は $0.08/Hour ですよね!


キャンペーンが終了したらどうなるのでしょうか?

単純に倍なので、約1,912円/日。一ヶ月で 57,400円です。


これ、みんな気づいているんでしょうか?僕は最初気がつかなかったです。

ダブルでビックリしますね。


新料金体系対策


今まで無料枠で気軽にアップしていたアプリが、突然金食い虫になったらたまりません。


App Engine アプリケーションのリソースを管理する方法 - Kay's daddy のリソースの管理方法が参考になります。


要は、ちゃんとリソース意識してアプリ作ってね、ということですが、

一番手軽な方法は、Admin Settings にある、 Max Idle Instances を 1 にする ということでしょうか。


近頃は、フリーミアムモデルからフリーの部分がなくなる、もしくは縮小される傾向が強いように思います。

手軽な環境がなくなっていくのは残念ですね。

2011/02/23

Rails 3, MySQL, jQuery, Shoulda, FactoryGirl

Rails 3 で、MySQL, jQuery, Shoulda, FactoryGirl を使うときのプロジェクトメモ。

MySQL でプロジェクトを作成

デフォルトでは Sqlite3 を使用するので、オプションで MySQL を使用するように指定。

$ rails new appname -d mysql

jQuery, Shoulda, FactoryGirl の設定

jQuery, Shoulda, FactoryGirl を使用するために、各ファイルを編集する。

environment.rb
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Gemfile
gem 'jquery-rails'
gem 'rails3-generators', :group => :development
group :test do
  gem 'shoulda'
  gem 'factory_girl_rails'
end
application.rb
config.generators do |g| 
  g.test_framework :shoulda, :fixture => true
  g.fallbacks[:shoulda] = :test_unit
  g.fixture_replacement :factory_girl, :dir => "test/factories"
end

インストール

$ bundle install

Shoulda / FactoryGirl が適用されているか確認。

$ rails g scaffold --help
...

Shoulda options:
  [--dir=DIR]                   # The directory where the model tests should go
                                # Default: test/unit
  [--fixture-replacement=NAME]  # Fixture replacement to be invoked
                                # Default: factory_girl

jQuery をインストール

generator で jQuery に置き換えます。

$ rails g jquery:install