2013年5月27日月曜日

GaiaプロファイルでFirefoxOSを起動してついでにロック画面も変えてみた

このエントリーをはてなブックマークに追加 はてなブックマーク - GaiaプロファイルでFirefoxOSを起動してついでにロック画面も変えてみた

気になったのでやってみました。 手順はツイートの通りですが、一応。

なお、普通(!?)にFirefoxOSのエミュレータ使う場合のやり方(Firefoxにアドオン追加)は[FirefoxOS]WebアプリをFirefoxMarketplaceにFirefoxOS用アプリとして登録した時のメモのエントリを参照ください。

まずはGitHubからGaiaをclone。

git https://github.com/mozilla-b2g/gaia.git

DEBUG=1でmakeする。

cd gaia
make DEBUG=1

完了すると最後に以下のようにprofileの場所が記載されます。

Profile Ready: please run [b2g|firefox] -profile /Users/toshihiro308/git/gaia/profile

プロファイルを指定してFirefoxNightlyを起動。

FirefoxNightly.app/Contents/MacOS/firefox -profile /Users/toshihiro308/git/gaia/profile

起動出来たー!

そういえば、昨日参加したWebプラットフォーム勉強会でホームスクリーンとかロック画面とか変えてみたとかというお話を聞いたような。。。

KEONとPEAKが無くてもFirefox OS開発出来る

ロック画面変えてみましょ!

vi gaia/apps/system/style/lockscreen/lockscreen.css
background: transparent url('./images/mask.png') 50% 50% no-repeat;

上記pngを適当な画像に変えて、再度起動。

とりあえずロックスクリーンをPink Floydにしてみた!

あれこれ何の話だっけ。。。。

2013年5月18日土曜日

Yeomanを使って簡単に今っぽいHTML5Webアプリケーション環境を構築

このエントリーをはてなブックマークに追加 はてなブックマーク - Yeomanを使って簡単に今っぽいHTML5Webアプリケーション環境を構築

Yeoman使えばGrunt,bowerも入るよっ!
YouTubeでChrome+HTML5 Developers Live Japan #4をたまたま見たら、Yeomanを使うとWeb開発で色々便利!という事を知り、早速導入。
なお、上記動画のスライドはつかってみよう!Yeoman。HTML5Webアプリケーション開発を効率化するツールの紹介にありましたが、とても分かりやすいです!
具体的にはYomanは大きく分けて以下によって構成されています。
  • Yo→Scaffold。npmでインストールしたテンプレートに従って、ディレクトリとか最低限必要なファイル群を構成してくれる。
  • Grunt→Build及びタスク実行。CoffeeScript、ビルドしたり、テスト実行したり、特定ファイルの変更監視して、ページの自動ロードしたり。すごいみたい。
  • Bower→HTML、CSS、JavaScript用のパッケージマネージャ。これを使ってjQueryとかBackboneとかのバージョン管理とか出来るみたいで便利そう。
実はどれもしっかり使った事がなくて、説明が曖昧ですいません。。。
個人的にYeomanに惹かれたポイントは以下です。
  • yoというコマンドがなんか良い。
  • インストールが楽。
  • Webアプリケーション構築時にTwitter Bootstrap for SassをYes/Noでインストールできる。
  • GruntでのLiveReloadやばい(ファイル保存でブラウザも自動更新される)
  • Gruntの設定ファイル作成面倒そうだけど、とりあえず動く奴作ってくれる。
  • Webアプリ作成時のテンプレートでBackboneとかAngularとかある。

1.準備

rubyのインストール

私は入っていたので除外。 rvmを利用してバージョン管理しています。 ちなみに1.9.2を利用。

nodeのインストール

最近はnodebrewが良さげみたいですが、僕はnvmインストールしてたのでそれで。0.8より新しいバージョンのnode必要のようです。
nvm ls-remote
nvm install v0.10.11
nvm use v0.10.11
★2013年6月16日修正
node v0.11はbowerのサポートをしていないみたいで、利用するnodeバージョンをnode v0.10に変更しました。

Compassのインストール

何かでインストールしてたので除外。 gemコマンドでもインストール出来るようです。 ちなみに0.12.2を利用。

Gruntのインストール

gruntをインストールしてないとgrunt-cliは動かないみたいなのでインストール。(細かく検証してませんが、必要ないかもしれません。ただ、インストールしてても問題ないはずです。)なお、gruntのバージョンは3.0より新しくする必要があるみたいです。
npm install -g grunt

2.インストール

Yeomanをnpmを利用してインストールします。 コマンドは公式サイトそのままで。
npm install -g yo grunt-cli bower
終わり!

3.テンプレートをダウンロード

利用するテンプレートファイルをnpmでインストールします。
npm search yeoman-generator
ずらーと出てきます。まだ試してないですが、generator-backbonegenerator-angularとかもあって、だいたい30、40個ぐらいあるみたい.。。
とりあえず標準テンプレートのwebappをインストールします。
npm install -g generator-webapp

4.Webアプリ作成

mkdir testyeoman
cd testyeoman
yo webapp


     _-----_
    |       |
    |--(o)--|   .--------------------------.
   `---------´  |    Welcome to Yeoman,    |
    ( _´U`_ )   |   ladies and gentlemen!  |
    /___A___\   '__________________________'
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

Out of the box I include HTML5 Boilerplate, jQuery and Modernizr.
[?] Would you like to include Twitter Bootstrap for Sass? (Y/n) 
おっさん(Yeoman)きた!Twitter Bootstrap使いたいのでYes。
[?] Would you like to include RequireJS (for AMD support)? (Y/n) 
RequireJSもインストールしたいのでYes。
とすると色々ダウンロードが始まります。(結構時間掛かります。) 私はXcodeインストールしながらやったらPhantomJSのインストールで時間がすごく掛かりました。辛抱強く待ちましょう。。。 なお、インストール途中でキャンセルすると通信途中の壊れたZIPファイルが残って、以降再ダウンロードしてもエラーになりますので、その場合には上記ZIPファイルを削除してからやりましょう。
toshihiro308@Toshihirock-MacBook-Air:~/yeomantest$ ll
drwxr-xr-x  15 toshihiro308  staff    510  5 18 06:47 .
drwxr-xr-x+ 94 toshihiro308  staff   3196  5 17 22:31 ..
-rw-r--r--   1 toshihiro308  staff     44  5 17 22:31 .bowerrc
-rw-r--r--   1 toshihiro308  staff    415  5 17 22:31 .editorconfig
-rw-r--r--   1 toshihiro308  staff     11  5 17 22:31 .gitattributes
-rw-r--r--   1 toshihiro308  staff     56  5 17 22:31 .gitignore
-rw-r--r--   1 toshihiro308  staff    408  5 17 22:31 .jshintrc
drwxr-xr-x   4 toshihiro308  staff    136  5 18 00:15 .sass-cache
drwxr-xr-x   4 toshihiro308  staff    136  5 18 06:47 .tmp
-rw-r--r--   1 toshihiro308  staff  11002  5 17 22:31 Gruntfile.js
drwxr-xr-x  11 toshihiro308  staff    374  5 17 22:31 app
-rw-r--r--   1 toshihiro308  staff    208  5 17 22:31 bower.json
drwxr-xr-x  27 toshihiro308  staff    918  5 17 22:31 node_modules
-rw-r--r--   1 toshihiro308  staff    941  5 17 22:31 package.json
drwxr-xr-x   5 toshihiro308  staff    170  5 17 22:31 test
色々出来ています。 とりあえず起動っ!
grunt server
ブラウザが起動し、以下の画面が表示されます。

HTML5 Boilerplate,Twitter Bootstrap,RequireJSがインストールされてますよと!
bowerで確認するとこんな感じでした。
toshihiro308@Toshihirock-MacBook-Air:~/yeomantest$ bower list
bower discover Please wait while newer package versions are being discovered
yeomantest
├── jquery#1.9.1 (2.0.0 now available)
├── modernizr#2.6.2
├── requirejs#2.1.6
└─┬ sass-bootstrap#2.3.1
  └── jquery#1.9.1 (2.0.0 now available)
おお、超便利!。分かりやすい!

5.編集とか

先ほどのディレクトリのapp/index.htmlが表示されたページなので、これを編集したり、別途ファイルを作成したりして構築を行っていきます。

6.まとめ

上記の通り、ディレクトリ構成及びファイルが良い感じに配置されて、対応するようにGruntfileも作成されるのってのが良いですね。とりあえず、これでえいと環境つくってカスタマイズしていくと良さげ。

LiveReload機能がうまく動かなかったので別途調査予定。

2013年5月20日追記
LiveReload機能が動かないのはブラウザにLiveReload用のエクステンションをインストールしてなかったからでした。Chromeでエクステンションインストールしてやったらしっかり動きました。

2013年4月30日火曜日

Chrome Developer Toolsの変更履歴管理機能が便利だった話

このエントリーをはてなブックマークに追加 はてなブックマーク - Chrome Developer Toolsの変更履歴管理機能が便利だった話
ChromeブラウザのDeveloper ToolsにてCSSやJavaScriptのコードが編集出来たりしますが、その変更履歴を管理する機能があり、めちゃめちゃ便利なのでメモ。

SlideShareのChrome Developer Toolsを使いこなそう!を参考にさせて頂きました。

サンプル画面及びソースコード

以下の画面にて確認。
上記でCSSをいじってみたりした想定です。

変更してみる。

上記HTMLを表示し、Google Developer Toolsを表示します。表示は以下の通り。
  • 右上の設定アイコン→ツール→デベロッパーツール
  • ショートカット→(Windows:Ctl+Shift+i,Mac:Command + Option + i)
で、Sourceタブを表示します。
その後、左の矢印のアイコンをクリックし、今回はmystyle.cssを編集したいのでこれをクリックします。
とりあえずfont-sizeを50pxに変更し、保存(MacならCommand+s)します。
その後、右クリック→Local Modificationsを選択すると画面下に変更履歴が表示されます!!!
しかも。。
diffが見れます!!すげー!!!
その後、変更して、保存とするとここの履歴にどんどん追加されていきます。

変更を元に戻す場合

色々編集したけど最初の状態(オリジナルのファイルの状態)に戻したい、という時は変更履歴の箇所にあるrevertをクリックする事で元の状態になります。
なお、上記の方法だと今までの変更履歴も全て削除されます。変更履歴は残したいけど、内容を最初の状態に戻したい場合はapply original contentを選択する事で、変更履歴を残して元の状態に戻す事が出来ます。(正確には元の状態に戻す、という変更を行っています。なので、変更履歴の最終履歴として元のファイルへ戻した処理が追加されています。)

特定の変更を反映したい

変更を反映したい内容の箇所でapply revision contentを選択すると対応する変更箇所のみを現在の状態に反映する事が出来ます。

最後に

色々Google Developer Toolsは便利な機能が有りますが、この機能は特に便利だと思いました。今後の開発では是非有効活用していきたいです。

2013年4月29日月曜日

Chrome Developr Tools(Elementタブ)使い方メモ1

このエントリーをはてなブックマークに追加 はてなブックマーク - Chrome Developr Tools(Elementタブ)使い方メモ1
Code SchoolChrome Developer ToolsのElementタブの使い方の1コース目を終了したので、そのメモ。

Chrome Developer Tools起動方法

  • 右上の設定アイコン→ツール→デベロッパーツール
  • 右クリック→要素の検証
  • ショートカット→(Windows:Ctl+Shift+i,Mac:Command + Option + i)

Elementタブで出来る事。

  • HTML、CSSなどの編集が出来る。
  • 要素の編集、確認が出来る。
  • 要素の追加、移動、属性の変更なども出来る。

変更したいDOMの検索

  • 画面左のHTMLビューから探す。
  • 画面下の虫眼鏡アイコンを選択し、HTML画面の変更したいDOMをクリックする。
  • HTML画面の該当の要素の箇所で右クリックしてInspect Elementを選択する。

DOM操作

  • 画面左のHTMLビューで直接文字列などを変更可能。
  • 該当箇所で右クリックしてAdd Atributeで属性追加可能。
  • 該当箇所で右クリックしてDelete Nodeで要素を削除。
  • 該当箇所で右クリックしてEdit As HTMLで選択箇所のHTMLを編集可能。
  • ドラッグ&ドロップで表示位置の変更も可能。

編集ファイルの保存

  • 右クリック→copy as HTMLで編集したHTMLのコピーが可能。

dotcloudのWordpressからBloggerに移動しました

このエントリーをはてなブックマークに追加 はてなブックマーク - dotcloudのWordpressからBloggerに移動しました
dotcloud上にWordpressを立ててBlog的に使っていたのですが、dotcloudの無料プランが終了してしまいました。。。(今はアクセスも出来ない)

記事や記事で利用した画像ファイルは丁度先月ぐらいにdropboxAPIを利用して毎日バックアップするようにしていたので何とか全ての記事を復活させる事が出来ました。バックアップの詳細はこちら。[dropbox]dotcloudからdropboxAPIを利用してwordpressをバックアップしてみた[dotcloud]

どこかまた違うPaaSにWordpress立てても良いかと思いましたが、今回みたいな事がまた起きるような気もしたのでやめときました。

まあ、そんな感じでこちらでも時間を見つけて何か思いついたりしたら色々書いていこうと思います。

[JavaScript]JavaScript本格入門chapter5まで読んだメモ

このエントリーをはてなブックマークに追加 はてなブックマーク - [JavaScript]JavaScript本格入門chapter5まで読んだメモ

Bloggerへの移行前のWordpressにて2013-04-20に投稿した記事です。

JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで(amazon)のChapter5までを読んでメモっておこうと思ったコトをつらつらと。

オブジェクトリテラル(連想配列)のプロパティへのアクセス

var obj = {a:1, b:2, c:3};
alert(obj.a); // 1
alert(obj['a']); // 1

プロパティへのアクセス方法はドット演算子(.)もしくはブラケット構文の方法がある。

JavaScriptでは内部的に2進数で計算しているため、少数点を含む計算では誤差が発生

alert(0.2 * 3); // 0.600000.....1

これは0.6ではなく、0.600000000000…..1みたいになる。なので、if文とか使うときには注意が必要。

宣言した変数の確認

宣言した変数のデータ型を確認する際にはtypeof演算子を利用する。

var one = 1;
alert(typeof(one)); // number
var hello = 'hello';
alert(typeof(hello)); // string
var ary = [];
alert(typeof(ary)); // object

ただし、オブジェクト型の変数にtypeof演算子を利用すると全てobjectとなる。どのオブジェクトか判断するためにはinstanceof演算子を利用する。

var ary = [];
if(ary instanceof Array) {
    alert('ary is Array'); // aryがArrayの時に表示
}

try,cathc,finally構文もある

変数が未定義の場合、などのエラー検出が出来る。

try{
    alert(i);
} catch(e) {
    alert(e.message); // i is not definded
} finally {
    alert('finally'); // finally
}

上記例では、変数iが宣言されていないため、catch構文、finally構文が実行される。

Functionコンストラクタ経由で宣言する事で引数、関数本体を文字列として定義出来る。

関数の宣言をJavaScript組み込みのオブジェクトしてFunctionオブエジェクとが存在し、そのコンストラクタを利用して関数の定義が出来る。以下にコード例を示す。

var param = 'height, width';
var body = 'return height * width / 2;';
var function = new Function(param, body);

上記の記述法の利点として引数や関数本体を文字列で定義出来る。 上記により、例えば引数を変えたい場合、paramを変更し、関数の内容を変える場合にはbodyを変更すれば良い。

varを利用せず宣言された変数は全てグローバル変数扱い

ローカル変数のはずなのに何故かグローバル変数として参照されてしまっている場合には、この記述ミスを疑う。

関数で引数の数をチェックしない

function showName(name) {
    alert(name);
}

showName(); // undefined
showName('yamada'); // yamada
showName('yamada', 'kazuo'); // yamada

こんな感じで関数の引数と呼び出し元の引数の数が合わなくてもエラーとならない。関数の中でarguementsオブジェクトを使うと引数の数とかそれぞれの値が取得出来るので、柔軟な関数定義が出来る。

関数の引数,戻り値を関数で指定出来る。(高階関数)

タイトルの通り。 高階関数の引数として利用される関数がその場限りのみの利用の場合、匿名関数として利用するとコードがよりスマートとなる。

スコープチェーン

変数にどんな値が入っているか、というのは自分の階層から順番に上位の階層に向けて値が入っているかチェックしていくイメージ。

プロトタイプ

コンストラクタでメソッドを定義するとインスタンスの生成毎にメソッドを作成(メモリに確保)する。 上記より、メモリを多く利用してしまう。 この問題を解消する為に、メソッドを定義する場合にはprototypeプロパティを利用して宣言する方が余計なメモリを利用せずに良い。 以下にリテラル表現を利用してメソッドを定義した例を示す。

// class Car
var Car = function(name, company){
    this.name = name;
    this.company = company;
};

Car.prototype = {
    getInfo: function() {
        return 'Name = '+ this.name + ',Company = ' + this.company;
    }
};

var mycar1 = new Car('fit', 'honda');
alert(myCar1.getInfo());

静的メソッドの時、prototypeは利用出来ない。

タイトルの通り。宣言出来ない。 はまった。。。

[dropbox]dotcloudからdropboxAPIを利用してwordpressをバックアップしてみた[dotcloud]

このエントリーをはてなブックマークに追加 はてなブックマーク - [dropbox]dotcloudからdropboxAPIを利用してwordpressをバックアップしてみた[dotcloud]
Bloggerへの移行前のWordpressにて2013-03-31に投稿した記事です。

このBlogというかWordpressはdotcloudで動いているのですが、今までバックアップをとっておらず、それめっちゃ怖いと今更思い、定期的にバックアップをするようにしてみたのでその時のメモ。

概要

バックアップ対象としてはWordpressのDBwp-contentで、バックアップ先はdropboxになります。

バックアップ方法としてはDropboxAPIのPython版をdotcloudで動かせるようにしてcronで定期的にファイル送信するという感じです。

Dropboxへファイルを送信するする方法はdotcloudに特化している訳ではないので、それ以外のPasSや自分で管理しているサーバーでも出来るかも。

なお、dotcloudの場合、dbとWebサーバーが別インスタンスみたいなのでそれぞれに環境及びcronの設定を行いました。(一つの環境でできるやり方を知っている方いましたら教えて下さい。。。)

ちなみにプラグインがうまく動くようであれば、BackWPupとかが良い感じみたいです。(dotcloudだと上記プラグインうまく動きませんでした。。。。)

目次

  1. Dropbox Applicationの登録
  2. Python環境の準備
  3. DropboxAPIの設定、確認
  4. PUT用スクリプトの作成
  5. backup.shの作成
  6. cronの設定

1.Dropbox Applicationの登録

DropboxAPIを利用する為にアプリケーション登録を行います。
この情報は適当にググれば出てくるので省略します。

Access typeについはapp_folderにしました。(本エントリの確認も上記が前提です。)

下記サイトが参考になりました。
DROPBOX API(PYTHON)を使ってみる

2.Python環境の準備

Pythonが利用出来るようにvirtualenvを利用します。
dotcloudではPython自体は既にインストールされていましたが、モジュールをインストールする際に必要なsetuptoolsが無かったのでvirtualenvを利用しています。(virtualenvを利用するとsetuptoolsは一緒にインストール出来る)

dotcloudのwww,dbインスタンスの確認。
$dotcloud conncet <アプリケーション名>
$dotcloud info
=== wordpressapp
flavor:          sandbox
cost to date:    Free
+------+-------+------------+-----------------+
| name | type  | containers | reserved memory |
+------+-------+------------+-----------------+
| db   | mysql | 1          | N/A             |
| www  | php   | 1          | N/A             |
+------+-------+------------+-----------------+
wwwサーバーにログイン。
$dotcloud run www
DBサーバーにログイン。
$dotcloud run www
以降の処理は両サーバーで実行する。

ダウンロード、解凍
$wget https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.9.1.tar.gz
$tar -zxvf virtualenv-1.9.1.tar.gz
インストール、有効化
$cd virtualenv-1.9.1
$python virtualenv.py --distribute ENV
$source ENV/bin/activate

3.DropboxAPIの設定、確認

DropboxAPIのインストール及び、接続確認を行います。
基本的には公式のドキュメントDropbox Developerに書いてある通りに実行しました。

DropboxAPIのダウンロード、解凍
$wget https://www.dropbox.com/static/developers/dropbox-python-sdk-1.5.1.zip
$unzip dropbox-python-sdk-1.5.1.zip
DropboxAPIのインストール
$cd dropbox-python-sdk-1.5.1
$python setup.py install
Exampleコードを利用して接続確認を行います。
1.Dropbox Applicationの登録で登録したアプリケーションの情報でApp key,App secretが必要なので確認しておいて下さい。(webから確認できます。)

App key,App secretの編集
$cd example
$vi cli_client.py
cli_client.py
# XXX Fill in your consumer key and secret below
# You can find these at http://www.dropbox.com/developers/apps
APP_KEY = ''
APP_SECRET = ''
ACCESS_TYPE = 'app_folder'  # should be 'dropbox' or 'app_folder' as configured for your app
APP_KEY,APP_SECRETを入力して下さい。

また、Dropboxへのアプリ登録時にAccess typeをapp_folderじゃなく設定した場合にはACCESS_TYPEの変更が必要そうですがうまくいくかは未確認です。

適当にDropboxに送信するファイルを作成します。
$touch put.txt
サンプルコードの実行。
CLIでdropboxAPIが利用出来ます。
まずはログイン。
$python cli_client.py
Dropbox>login
url: https://www.dropbox.com/1/oauth/authorize?oauth_token=xxxxxxxxx
Please authorize in the browser. After you're done, press enter.
表示されたURLをブラウザで表示すると認証するかの確認画面になるのでAllowを選択。
その後、コンソールに戻ってenterを押します。
その後はDropboxAPIが使えます。(詳細はhelpを入力)

試しにファイルをputします。put後の名前はabc.txtとします。
Dropbox> ls
2013-03-31_04:00:01_UTC.data.tar.gz
2013-03-31_04:00:01_UTC.sql.gz

Dropbox> put put.txt abc.txt

Dropbox> ls
2013-03-31_04:00:01_UTC.data.tar.gz
2013-03-31_04:00:01_UTC.sql.gz
abc.txt
これでサーバーからファイルが送信出来る事が確認できました。

4.PUT用スクリプトの作成

下記参考にさせていただき、コードを少しだけ変えてシェルスクリプトから実行出来るようにします。
DROPBOX API(PYTHON)を使ってみる2
$cd dropbox-python-sdk-1.5.1/example/
$vi backup-wordpress.py
backup-wordpress.py
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import cmd
import locale
import os
import pprint
import shlex
import time

from dropbox import client, rest, session

# XXX Fill in your consumer key and secret below
# You can find these at http://www.dropbox.com/developers/apps
APP_KEY = ''
APP_SECRET = ''
ACCESS_TYPE = 'app_folder'  # should be 'dropbox' or 'app_folder' as configured for your app

def command(login_required=True):
    """a decorator for handling authentication and exceptions"""
    def decorate(f):
        def wrapper(self, *args):
            if login_required and not self.sess.is_linked():
                self.stdout.write("Please 'login' to execute this command\n")
                return

            try:
                return f(self, *args)
            except TypeError, e:
                #self.stdout.write(str(e) + '\n')
                print str(e)
            except rest.ErrorResponse, e:
                msg = e.user_error_msg or str(e)
                #self.stdout.write('Error: %s\n' % msg)
                print ('Error: %s' % msg)

        wrapper.__doc__ = f.__doc__
        return wrapper
    return decorate

class DropboxTerm():
    def __init__(self, app_key, app_secret):
        self.sess = StoredSession(app_key, app_secret, access_type=ACCESS_TYPE)
        self.api_client = client.DropboxClient(self.sess)
        self.current_path = ''

        self.sess.load_creds()

    def do_ls(self):
        """list files in current remote directory"""
        resp = self.api_client.metadata(self.current_path)

        if 'contents' in resp:
            for f in resp['contents']:
                name = os.path.basename(f['path'])
                encoding = locale.getdefaultlocale()[1]
                #self.stdout.write(('%s\n' % name).encode(encoding))
                print ('Filename=%s' % name).encode(encoding)
                #print ('FullFilename=%s' % f['path']).encode(encoding)

    @command()
    def do_cd(self, path):
        """change current working directory"""
        if path == "..":
            self.current_path = "/".join(self.current_path.split("/")[0:-1])
        else:
            self.current_path += "/" + path

    @command()
    def do_put(self, from_path, to_path):
        """
        Copy local file to Dropbox

        Examples:
        Dropbox> put ~/test.txt dropbox-copy-test.txt
        """
        from_file = open(os.path.expanduser(from_path), "rb")
        #from_file = open(from_path, "rb")

        self.api_client.put_file(self.current_path + "/" + to_path, from_file)

    @command()
    def do_rm(self, path):
        """delete a file or directory"""
        self.api_client.file_delete(self.current_path + "/" + path)

class StoredSession(session.DropboxSession):
    """a wrapper around DropboxSession that stores a token to a file on disk"""
    TOKEN_FILE = "token_store.txt"

    def load_creds(self):
        try:
            stored_creds = open(self.TOKEN_FILE).read()
            self.set_token(*stored_creds.split('|'))
            print "[loaded access token]"
        except IOError:
            pass # don't worry if it's not there

    def write_creds(self, token):
        f = open(self.TOKEN_FILE, 'w')
        f.write("|".join([token.key, token.secret]))
        f.close()

    def delete_creds(self):
        os.unlink(self.TOKEN_FILE)

    def link(self):
        request_token = self.obtain_request_token()
        url = self.build_authorize_url(request_token)
        print "url:", url
        print "Please authorize in the browser. After you're done, press enter."
        raw_input()

        self.obtain_access_token(request_token)
        self.write_creds(self.token)

    def unlink(self):
        self.delete_creds()
        session.DropboxSession.unlink(self)

def main(s):
    if APP_KEY == '' or APP_SECRET == '':
        exit("You need to set your APP_KEY and APP_SECRET!")
    term = DropboxTerm(APP_KEY, APP_SECRET)

    print(s);
    #term.do_rm(s[1])
    term.do_put(s[0],s[1])

if __name__ == '__main__':
    import sys
    args = sys.argv
    if len(args) > 1:
           s = args[1:]
    main(s)
引数を利用してファイルをputするようにしました。(といってもmain文をほんの少し変えただけですが。。。) ファイルをputする処理を実行する場合、以下のようにします。
$python backup-wordpress.py put.txt abc.txt

5.backup.shの作成

次に上記スクリプトを実行するシェルを作成します。
といってもdotcloudではバックアップ用のシェルスクリプトが用意されており、それを少しだけ変更すればOKです。

下記を参考にさせて頂きました。
DotCloudをDropboxへバックアップ 2

まずはdotcloudの公式サイトからバックアップ用のシェルをダウンロードしてきます。
$wget http://docs.dotcloud.com/_downloads/backup.sh
次に上記を変更します。
#!/bin/bash
# Syntax: 
# backup.sh <what> <how> <where> [whereexactly]
# <what> indicates what you want to backup: mysql, pgsql, riak, data.
# <how> indicates the backup method: ssh, ftp, s3.
# <where> is a <user[:password]@host>.
# [whereexactly] is an optional path on the <where> target, when applicable.
set -e
TAG="$HOSTNAME_$(TZ=UTC date +%Y-%m-%d_%H:%M:%S_UTC)"
source ~/virtualenv-1.9.1/ENV/bin/activate

: <<'#__COMMENT_OUT__'
[ "$3" ] || {
	echo "Please specify what to backup, how, and where."
	exit 1
}
#__COMMENT_OUT__


case "$1" in
	mysql)
		FILENAME="$TAG.sql.gz"
		FILEPATH="/tmp/$FILENAME"
		mysqldump --all-databases | gzip > "$FILEPATH"
		;;
	pgsql)
		FILENAME="$TAG.sql.gz"
		FILEPATH="/tmp/$FILENAME"
		pg_dumpall | gzip > "$FILEPATH"
		;;
	riak)
		FILENAME="$TAG.bitcask.tar.gz"
		FILEPATH="/tmp/$FILENAME"
		tar -czf "$FILEPATH" /var/lib/riak
		;;
	data)
		FILENAME="$TAG.data.tar.gz"
		FILEPATH="/tmp/$FILENAME"
		tar -C "$HOME" -czf "$FILEPATH" "data"
		;;
	*)
		echo "Sorry, I don't know how to backup $1."
		exit 1
		;;
esac

: <<'#__COMMENT_OUT__'
if [ "$4" ]
then
	DEST="$4/$FILENAME"
else
	DEST="$FILENAME"
fi
#__COMMENT_OUT__

case "$2" in
	ssh)
		scp -q -o BatchMode=yes "$FILEPATH" "$3:$DEST"
		;;
	ftp)
		curl -sST "$FILEPATH" "ftp://$3/$DEST"
		;;
	s3)
		s3cmd put "$FILEPATH" "s3://$3/$DEST"
		;;
	s3multi)
		split --numeric-suffixes --bytes=4G "$FILEPATH" "$FILEPATH".
		s3cmd put "$FILEPATH".?? "s3://$3/$DEST/"
		;;
	dropbox)
		cd ~/dropbox-python-sdk-1.5.1/example/
	        python backup-wordpress.py "$FILEPATH" "$FILENAME"
		;;
	*)
		echo "Sorry, transfer method $2 is not supported."
		exit 1
esac

SIZE="$(stat --printf %s "$FILEPATH")"
echo "Backup $TAG completed. Its (compressed) size is $SIZE bytes."
rm -f "$FILEPATH"
変更点は以下の通りです。
  • shをbashにした
  • source ~/virtualenv-1.9.1/ENV/bin/activateを利用してvirtualenvを使う。
  • 引数$3,$4は使わないのでコメントアウト(必須ではない)
  • 第2引数にdropboxと指定した場合、dropboxAPIを利用する用に設定
実行権限設定。
$chmod +x backup.sh
下記に利用方法について記載します。

1.MySQLのバックアップをdropboxへ送信する場合。
$./backup.sh mysql dropbox
2.wp-conentのバックアップをdropboxへ送信する場合。
$./backup.sh data dropbox

6.cronの設定

最後にcronの設定をします。といっても特別な事はしません。
必要に応じて時間は適当に変更して下さい。

DBインスタンス側。
$crontab -e
00 4 * * * ~/backup.sh mysql dropbox >> result.txt
wwwインスタンス側。
$crontab -e
00 4 * * * ~/backup.sh data dropbox >> result.txt