2012年2月1日水曜日

sqliteでログをとってみよう。

ふと思ったんですが、各サーバーの動作ログを一元管理したいときに、テキスト形式のログファイルを吐いたり、syslogのサーバーに集めたり、はたまたmysqlに保存したりとしますが、個人的に以下のような欠点があります。

テキスト形式のログ:動作は簡単、お手軽、検索等は文字列の検索になるので、苦手。1カ所に集めるのが面倒。
syslogのログ:動作は簡単、お手軽といえばお手軽、検索等はやりにくい。1カ所にまとめるのも簡単。UDPで通信してるので、遮断されたらだめかも。
mysqlのログ:動作はやや面倒。手軽というほどでもない。検索はやりやすい。1カ所にまとめるのもやりやすい。TCPで接続してやり取りしなければいけない。あとサービスでつかいまくってると、重いクエリを走らせたりしちゃうと、サービスに影響がでる。

といった感じです。

そこでsqliteをつかってみようと思いました。
sqliteのログ:動作はやや面倒。手軽ではある。検索はやりやすい。1カ所にまとめるのは面倒、通信しないのでサーバーが死なない限り動作できる。なんかあったら手元にダウンロードして解析とかもできる。なんといっても複数サーバーのログをまとめて、あつかったりできる。
という感じ。
あたらしい手段としては、なかなか優れてる気がします。

というわけで、さっそくいろいろ調べていきます。
まず、基本的な情報
iMacにいれてあるのはsqlite 3.6.12
CentOS(サクラVPS)にいれてあるのはsqlite 3.3.6
基本的なコマンドは次のとおり。
$ sqlite3 (dbファイル名)
テーブル作成
sqlite> create table [テーブル名] (カラム,カラム....);
データ取得
sqlite> select * from [テーブル名];
データ追加
sqlite> insert into [テーブル名] (データ, データ....);
sqliteをやめる。
sqlite> .quit;

sqliteでデータをいれたものを合成して結果を出す方法。
unionで結合すればOK

ざっとこんな感じ。
testlogというテーブルにdate(文字列) task(文字列) result(文字列)という構成があるとします。


sqlite> attach database "1.db" as a;
sqlite> attach database "2.db" as b;
sqlite> select * from a.testlog;                                                

date|task|result
2012-02-01 20:30:50|test|ok
2012-02-01 20:30:53|test2|ok?
2012-02-01 19:40:50|test3|ng
sqlite> select * from b.testlog;
date|task|result
2012-02-01 20:40:50|test3|ng
2012-02-01 20:40:30|test4|ng?
2012-02-01 19:30:30|test5|ok
中身はこんな感じです。


さてこのログを時系列で並べるならこんな感じ

sqlite> select * from a.testlog union select * from b.testlog order by date asc;
date|task|result
2012-02-01 19:30:30|test5|ok
2012-02-01 19:40:50|test3|ng
2012-02-01 20:30:50|test|ok
2012-02-01 20:30:53|test2|ok?
2012-02-01 20:40:30|test4|ng?
2012-02-01 20:40:50|test3|ng
ちゃんと時間順に並んでます。
order byは全体にかかるみたいです。

時間を制限するとすれば、
sqlite> select * from b.testlog where date > "2012-02-01 20:00:00" union select * from a.testlog where date > "2012-02-01 20:00:00" order by date asc;
date|task|result
2012-02-01 20:30:50|test|ok
2012-02-01 20:30:53|test2|ok?
2012-02-01 20:40:30|test4|ng?
2012-02-01 20:40:50|test3|ng
こんな感じになります。where文は両方に設定しないとだめみたいです。

とりあえずここまでの調査で、sqlite3のファイルを日付順にでも並べておいて、どこかのサーバーにまとめてしまえば特定のサーバーの特定の日付の範囲のログとか出せそうです。

あとは、phpやjava、そのほかの言語での動作の確認をチェックしてやれば・・・いろいろできるはず。

以上個人メモでした。

2012年1月21日土曜日

MacFusionを導入してみた。

Ubuntuとかを利用しているときには、簡単に外部のサーバーにsftpで接続して、ローカルにあるファイルのように編集して作業を実行する・・・ということができました。

同じようなことをiMacでしたかったので、google先生に問い合わせてみたところMacFusionというのでできるっぽいことが発覚。

まずmacfusionを取得しました。
zipをダウンロードして解凍してみたところappファイルがあるので、それを実行。
確かにスクリーンショットにあるとおり動作したんですが、なぜかマウントがうまくいかない・・・

設定アイコンの中に(歯車みたいなやつ)ログ出力があったので、内部を確認してみたところなんかlibfuseとかいうライブラリがねーぞっていわれました。

MacFuseというのを入手しないとだめみたいですね。

さくっとみつけてインストール
再度macfusionをトライしてみたところ。意図したとおり動作成功しました。

さて、これでしばらくphpやってみようか・・・

2011年12月23日金曜日

sencha touchのtoolbar

今日はあさから、youtubeのmp4データをjavascriptだけで抜けないかずっとやってました。
結果的には、URLは解析できたんですが、IPアドレス制限にひっかかりましたね。音楽を再生するwebアプリはできないっぽい。中継サーバーたてればいいのですが、それやるとjasracに目を付けられそうだし・・・うーん残念。

さて、sencha touchについて、しばらくまとめようと思います。
今回の記事は一発目、とりいそぎ、toolbarの挙動についてです。

サンプルで作ったwebアプリはこちら。
http://taktodtools.appspot.com/toolbarApp.html
ソースコードに何ができるか等、記述してあります。

要点は。

  • 親要素のdockedItemsにいれればつかえるが、itemsにいれてもOK
  • iconClsによるアイコンの追加はできない。
  • textは無視される。
  • titleは有効で中央に表示される。
  • title内では、htmlタグが有効、ただしaタグ貼ってもリンクにはできない。
  • 子要素のdockedItemsは無視される。
  • 子要素のitemsはボタン風になる。
  • 子要素のitems内では、uiでback forward action等追加スタイルを設定できる。
  • 子要素のitems内では、spacerを挟むと反対側(右側)にアイコンがならぶようになるが、追加はすべて右向き
といった感じでした。

2011年12月19日月曜日

sencha touchのテキストエリア

iPhoneのwebアプリをsencha touchでつくっていて、非常にこまったのが、テキストエリアの取り扱い。

普通にtextareaを置くだけなら、デフォルト動作が発動するので、問題はないのですが、sencha-touchをつかってつくっているといろいろと動作不具合がでてきます。
問題点は

  • テキストエリアの中で行数がふえすぎると、テキストエリアの内部をスクロールさせるすべがない。
  • テキストエリアがおおきく、スクロールして、テキストエリアのトップが上部にはみ出している場合に、文字入力しようとするとアドレスバーがはいってきて、編集できない。
といった問題があります。

というわけで、僕の対処の仕方です。
まず、前者の問題行数が増えすぎて、はみ出るとスクロールできない。
→よって行数がふえたら、テキストエリアを大きくしてやればよい。
textareaでkeyup eventを監視して、行数が増えた場合は大きくしてやればいい。

sencha touchで追加したコンポーネントは直接IDを取得したりする方法がないので、textareaの大きさ変更はtextareaのスタイルシートを書き換えることで実施しています。
テキストエリアのcss設定
textarea {
  height: 100;
}
// cssの要素の大きさを変更するjavascript関数
function changeTextareaHeight(value) {
  var css_list = document.styleSheets;
  if(css_list) for (var i = 0;i < css_list.length;i ++) {
    var rule_list = (css_list[i].cssRules) ? css_list[i].cssRules : css_list[i].rules;
    if(rule_list == null) {
      continue;
    }
    for(var ii = 0;ii < rule_list.length;ii ++) {
      if(rule_list[ii].selectorText == 'textarea') {
        with(rule_list[ii].style) {
          // fontSize = "50%";
          height = value + "px";
        }
      }
    }
  }
}

// keyupのイベント
keyup: function(target, event) {
  // 入力文字の文字列数を確認して、改行にあわせて、パネルのサイズを変更する。
  var data = target.getValue();
  var matches = data.match(/[\n|\r\n]/g);
  var num = 0;
  if(matches instanceof Array) {
    num = matches.length;
  }
  if(this.lineNum == num) {
    return;
  }
  this.lineNum = num;
  // パネルの高さx2+文字の高さx改行数
  // これをtextareaのサイズにして調整すればOK
  changeTextareaHeight(App.views.viewport.height + num * 24);
}

これで行数がふえればそのままテキストエリアがどんどん大きくなっていきます。
一応問題点もあり、文字が長過ぎて改行文字抜きに改行されてしまった場合。
上記の正規表現からすると、改行とカウントされないのでずれが発生します。

さて2つ目の問題、アドレスバー等がはいってきて困る問題の対処です。
アドレスバーがでてきてしまう問題は、テキストエリアにフォーカスがあたったときに、テキストエリアのちょうど上部の端までwindowをスクロールしてやれば大丈夫みたいです。
よってfocusのイベントでwindow.scrollToを実行します。
focus: function(target, event) {
  var toolbar = Ext.getCmp('editToolbar');
  this.toolbarHeight = toolbar.getHeight();
  window.scrollTo(0,this.toolbarHeight);
},

今回のwebアプリのサンプル(chrome safari iphoneにて動作確認済み)

ではでは〜

2011年12月17日土曜日

sencha touchを解析中。

iPhone用のWebアプリをつくるのに、始めはjqtouchをつかってやろうと思っていたのですが、formのパーツをいれてフォーカスを移動させると動作がおかしくなったり、タイトルバーをださないとボタンが動作しなかったりとちょっと癖が多そうなので、はやめに見切りをつけました。

というわけで、sencha touchを使おうと思っています。
ぱっとみ、kitchensinkというアプリ これが非常に優秀なので、これを参考にプログラムをするつもりです。

というわけで、kitchensinkの構造がどうなっているか、自分用のメモを書いておきます。
プログラム構造
index.html
+ CodeBox.js(ソースコード表示する小窓のデータ:コードの要素解析を実施して、色をつけたりしてる。)
+ index.js(動作の中央部)
+ structure.js(アイテムリストを保持している)

 CodeBoxは要素解析とかいった部分のデータなのでいらないです。
というかiPhoneの選択は、タグを超えて動作しにくいみたいなので、むしろ邪魔。
 indexは動作の中央部。見た目的にNestedListをつかってるだけに見えますが、kitchensinkでは、通常のコンポーネントの組み合わせでNestedListっぽく動作させているようです。
これ、めちゃくちゃはまりました。だって、NestedListだけでつくれると勘違いしてしまったんですから・・・orz
 structureは各リストの内容用の部分です。

Webアプリをつくるwebアプリをつくってみた。

iPhoneを入手しました。
いろいろできて便利ですが、やっぱりこういうデバイスをでたら、それようのアプリを開発したくなります。

ちょっと思いついたら電車の中で、ぱぱっとアプリを書いてみたい・・・
とおもったので、WebアプリをつくるWebアプリをかいてみました。
jqtとはいっていますが、JQtouchのフレームワークをつかってつくってみました。



JQtouchは、フォームの部品があると動作がおかしくなったりするバグがあるしSave,Load,Runのメニューのところむりやりcssを解除してるので妙な動作しますね^^;

jqtouchはさわって3日目ですが、すでにあきてて同じアプリをsenchatouchでつくって、senchatouchのアプリ開発ができるような編集アプリをつくりたいと考えてます。
ではでは〜

2011年12月4日日曜日

ロガーのレベルの振り分け方、個人メモ

最近やってるロガーの振り分け方。

FATAL 全体をとめないといけないような危険な状況。要通知
ERROR 現在の動作ユーザーの処理が続行できない。要通知?
WARN 好ましくない状況が発生、でも動作はする。
INFO 動作段階のメモ
DEBUG 動作中の変数状況のDumpなど

こんな感じが最近のマイブーム。
FATAL、ERRORについては、メールやSyslog、Nagiosに検知を飛ばす等する。
これで想定内の動作のバグ等については、ばっちりかなとおもってるw