2012年12月25日火曜日

MySQL SELECT OUTFILE Errcode: 13


Ubuntu ServerでMySQL検索結果をファイルで出力する時書き込み権限エラーが発生。

mysql> SELECT * FROM T_BABUKUMA INTO OUTFILE "/root/babukuma.csv" CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
ERROR 1 (HY000): Can't create/write to file '/root/babukuma.csv' (Errcode: 13)

権限の解決方法は調べてみたら色々あるが、難しいからやめた。

一応rootで入ってディレクトリ指定をしなければ、「/var/lib/mysql/db名」ディレクトリに出力は可能なので、出力結果が欲しいだけならこれでいいかと。

mysql> SELECT * FROM T_BABUKUMA INTO OUTFILE "babukuma.csv" CHARACTER SET 'sjis' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
Query OK, 346 rows affected (0.00 sec)

# ls /var/lib/mysql/babukuma/babukuma.csv
babukuma.csv

2012年11月14日水曜日

WebSQL

原本はこちら

1. WebSQL

HTML5の標準仕様から外されていつなくなるかわからないが、
まだ、色んなブラウザでサポートしているのでまとめてみる。
ここではSafari向けのWebSQL。他のブラウザは知らん。


Creating and Opening a Database

var db = openDatabase(dbName, version, displayName, maxSize);

  1. dbName : db名(例:'babukumaDb')
  2. version : dbのバージョン(例:'1')
  3. displayName : 表示名(例:'Babukuma's Database')
  4. maxSize : 最大格納サイズ(単位bytes)(例:65536)

    var dbName = 'babukumaDB';
    var displayName = "babukuma's database";
    var maxSize = 1024 * 1024 * 4;
    var version = '1';
    var db;

    try {
      db = openDatabase(dbName, version, displayName, maxSize);
    } catch(e) {
      if (e === 2) {
        alert("Invalid database version.");
      } else {
        alert("Unknown error " + e);
      }
    }


Executing a Query


executeSql(sqlStatement, arguments, callback, errorCallback);

  1. sqlStatement : SQL
  2. arguments : 引数
  3. callback : 成功時のコールバック
  4. errorCallback : エラーじのコールバック

    // 成功時コールバック
    function nullDataHandler(transaction, results) {}
    
    // エラー時コールバック
    function errorHandler(transaction, error) {
      alert('Error was ' + error.message + ' (Code ' + error.code + ')');
    }

    db.transaction(function(transaction) {
      transaction.executeSql('CREATE TABLE T_TEST ID INT PRIMARY KEY, NAME TEXT', [], nullDataHandler, errorHandler);
      transaction.executeSql('INSERT INTO T_TEST VALUES (?, ?)', [1, 'BABUKUMA'], nullDataHandler, errorHandler);
    });


Handling Result Data

    // クエリ実行成功時コールバック
    function dataHandler(transaction, results) {
      var size = results.length;
      for(var i = 0 ; i < size ; i++) {
        row = results.rows.item(i);
        console.log("ID=%d, NAME=%s", row.ID, row.NAME);
      }
    }
    
    // エラー時コールバック
    function errorHandler(transaction, error) {
      alert('Error was ' + error.message + ' (Code ' + error.code + ')');
    }

    db.transaction(function(transaction) {
      transaction.executeSql('SELECT * FROM T_TEST WHERE ID > ?', [1], dataHandler, errorHandler);
    });


Migration


changeVersion(oldVersion, newVersion, migrationHandler, errorHandler, successHandler);

  1. oldVersion : 以前のバージョン
  2. newVersion : 新バージョン
  3. migrationHandler : マイグレーション用関数
  4. errorHandler : エラー時コールバック
  5. successHandler : 成功時コールバック

    var dbName = 'babukumaDB';
    var displayName = "babukuma's database";
    var maxSize = 1024 * 1024 * 4;
    var DB_VERSION = '4';
    var db;

    // 成功時コールバック
    var successHandler = function() {
      alert('マイグレーション成功!');
    };

    // エラー時コールバック
    function errorHandler(transaction, error) {
      alert('Error was ' + error.message + ' (Code ' + error.code + ')');
    }

    // 初期化
    var initDB = function(transaction) {
      transaction.executeSql('CREATE TABLE ......', [], nullDataHandler, errorHandler);
    };

    // Version 1 -> Version 2
    var migration_1_2 = function(transaction) {
      transaction.executeSql('ALTER TABLE ......', [], nullDataHandler, errorHandler);
    };

    // Version 2 -> Version 3
    var migration_2_3 = function(transaction) {
      transaction.executeSql('ALTER TABLE ......', [], nullDataHandler, errorHandler);
    };

    // Version 3 -> Version 4
    var migration_3_4 = function(transaction) {
      transaction.executeSql('ALTER TABLE ......', [], nullDataHandler, errorHandler);
    };

    try {
      db = openDatabase(dbName, '', displayName, maxSize); // versionを指定しないのが重要

      if (db.version !== DB_VERSION) {
        if (db.version === '') {
          db.changeVersion('', '1', initDB, errorHandler, function() {
            db.changeVersion('1', '2', migration_1_2, errorHandler, function() {
              db.changeVersion('2', '3', migration_2_3, errorHandler, function() {
                db.changeVersion('3', '4', migration_3_4, errorHandler, successHandler);
              });
            });
          });
        } else if (db.version === '1') {
          db.changeVersion('1', '2', migration_1_2, errorHandler, function() {
            db.changeVersion('2', '3', migration_2_3, errorHandler, function() {
              db.changeVersion('3', '4', migration_3_4, errorHandler, successHandler);
            });
          });
        } else if (db.version === '2') {
          db.changeVersion('2', '3', migration_2_3, errorHandler, function() {
            db.changeVersion('3', '4', migration_3_4, errorHandler, successHandler);
          });
        } else if (db.version === '3') {
          db.changeVersion('3', '4', migration_3_4, errorHandler, successHandler);
        }
      }

    } catch(e) {
      if (e === 2) {
        alert("Invalid database version.");
      } else {
        alert("Unknown error " + e);
      }
    }

2012年10月28日日曜日

Node.jsについて個人的なまとめ


原本はこちら

1. Node.js

 - ブラウザ以外のところで動くJavaScriptフレームワーク
 - JavaScriptエンジンとしてGoogleのV8を採用
 - 一部のCommonJS仕様を準拠している。(ModuleとUnit Testingらしい)
 - Nonblocking I/O フレームワーク
 - イベントドリブン
 - 基本的にシングルプロセス(クラスタ化でマルチ可能)

2. メリット

 - JavaScript
  ・意外とJavaScriptが使いやすいと思ってる人が多いので。一応言語を覚えるハドルは低いかな。
 - CoffeeScript使用
  ・こっちかな。
 - JSON
  ・当たり前だけどJSONは結局JavaScriptなのでJavaScriptよりJSONに得意な言語はないと思う。
 - V8エンジン性能が良くて改善も早い。
 - 性能がいい。
  ・どこで見たか覚えてないが、基本的にNode.jsがJavaよりは遅いが、PHP(Python, Ruby)より3〜10倍性能がいい。
 - npm
  ・Node Package Manager
 - C/C++ Addon
 - NoSQLと相性がいい。

3. デメリット

 - まだ商用で使うには不安定な部分がある。
 - 開発者が少ない。
  ・JavaScript開発者がNode.jsの開発者ではない。
 - メジャーでもない。
 - 非同期処理なのでエラーハンドリングが難しい。
 - 基本的にシングルプロセスなのでどこかでシステムエラーが発生するとサーバダウン。
  - Hot deployができない。

4. Node.jsに合うユースケース

 - 同時リクエストが多い軽量処理。リアルタイムサーバ
  ・Gameサーバの一部
  ・チャットサーバ
 - RESTful + JSON
  ・RESTfulなAPI用のサーバならいいと思う。
  ・JSONならJavaScriptほど得意な言語はないと思う。
 - ページが少なくてAjaxでほとんどの処理をするパターン


5. Node.jsに合わないユースケース

 - I/OよりCPUを使う処理が多いパターン。
  ・動画エンコーディング
 - 静的コンテンツ用サーバ
  ・画像、動画や静的なHTMLページなどのサーバ。
  ・Node.jsよる用途にあうサーバが色々ある。
 - 単純なHTMLレンダリングとCRUD用サーバ
  ・既存のいいものがいっぱいあるはず。
  ・PHP, Python, Rubyなど。こっちが使えるフレームワークなどを色々あるし。

6. 知られている問題

  - メモリリークがあるらしい。バグ?