Techracho

IEでJavaScriptからButtonのtypeを変更できない

このエントリーをはてなブックマーク Share
2010.07.20    Windows, javascript, 馬場   タグ: , , , —    baba   

JavaScriptで動的にエレメントを作成するときは、

var div = document.createElement('div');

のようにやります。

たとえば、ボタンを作ってそのボタンにクリックイベントを追加、などの良くある処理は、jQueryを使って、

var button = $(document.createElement('button'))
.attr('type', 'button').text('ぼたん');
button.click(function() {
    alert('hello');
});
$('#hoge').next(button);

のようにやると思います。typeを設定しているのは、デフォルトだとsubmit扱いになってしまうからです。

しかしこれ、IEだとエラーになります。

type property can’t be changed

buttonのtypeはなぜか読み取り専用プロパティらしい・・・

ということで、ちょっとダサイですが、以下のようにやって解決。

var button = $('<button type="button">ぼたん</button>');

以上、ちょっとした注意点でした。

PythonでGoogle Language APIを使うときに、&#39;がデコードされなくて困った

このエントリーをはてなブックマーク Share
2010.07.19    Python, 馬場   タグ: , , , , —    baba   

Google Language APIは素晴らしくて、AjaxのAPIがしっかり用意されているほか、RESTfulなAPIとして以下のようなものも使えます。

http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q={文字列}&langpair={変換前言語}|{変換後言語}

さらに、珍しく日本語ガイドがあるのも良いですね。
http://code.google.com/intl/ja/apis/ajaxlanguage/documentation/

さて、このRESTfulAPIで取得する結果はJSONになっているのですが、シングルコーテーション(アポストロフィ)は&#39; に文字参照されて帰ってきます。

Pythonは特に関係ないんですが、文字参照されたままだと色々困ります。
標準モジュールで簡単にデコードするものが見つからなかったので、http://d.hatena.ne.jp/MOOK/20100407/1270601539を使わせて頂くことにしました。

トータルでは、以下のようなコードになります。

import urllib
import json

#参照URLの実体参照解除コードを、entity_referenceモジュールにした
import entity_reference 

text = urllib.quote("私はピーターです")
url = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=%s&langpair=ja|en' % text
result = json.loads(urllib.urlopen(url).read())

print entity_reference.encode(result['responseData']['translatedText'])
#I'm peter

Twitter APIなども、実体参照で返ってきたはずなので、注意が必要ですね。

PythonのSQLiteで検索しようとしたらIncorrect number of bindings supplied. The current statement uses 1, 10 supplied.とか言われた

このエントリーをはてなブックマーク Share
2010.07.16    Python, 馬場   タグ: , , , , —    baba   

最近の言語はSQLite3のライブラリが入っていることが多いですね。

Python 2.6でも簡単で、

import sqlite3
db = sqlite3.connect('data.db')
db.execute('create table users (id integer primary key, name text, age integer)')
db.execute('insert into users (name, age) values (?, ?)', ('yamada', 21))

のように簡単に扱えます。

ところが、使い方を間違えると

Incorrect number of bindings supplied. The current statement uses 1, 10 supplied.

のようなエラーが出てしまうことがあります。

原因は単純。
executeの第2引数はタプルにしないといけません。

項目が1個のとき、()で囲んだだけだとダメですね・・・

#ダメな例
db.execute('select * from users where name = ?', ('yamada'))  

#良い例
db.execute('select * from users where name = ?', ('yamada',))

基本的ですが、普段別の言語を書いていると気づくのが遅れます。

RailsのログファイルをMessagePackで超高速解析!

このエントリーをはてなブックマーク Share
    Ruby on Rails, 伊藤   タグ: , , , —    tomotaka   

こんにちは、伊藤です。

最近Railsがガンガン出力するproduction.logを解析してどのアクションがリクエスト多いのか、DBがボトルネックになってるアクションはないか、などを調べているんですが、production.logがどんどん肥大化して、解析ツールの開発イテレーションを回す際の効率が悪くなってきました。

また似たようなツールをやたらめったらコピペで作ってきたため、開発効率も悪くなってきたので、ここでAPIを整理しつつ、あわよくばログをなめる部分を高速化できないものかと考えました。

シンプルに正規表現をつかって変化する箇所を切り出していたのですが、これではかなり重いのは自明ですし、がんばって文字列をパースするパーサを作ってもrubyではあまりスピードは出なそう、でもrubyで書きたいし….

ということで、一度パースしたデータを読込みに効率よさそうな形式に変換することで、次以降の解析を高速化しようと考えました。RubyのMarshalモジュールのdump/loadを使うのもよさそうでしたが、個人的にMessagePackというライブラリが気になっていたので、試してみました。特にウリ文句もread時のデシリアライズ性能がよいとのことでしたので、結果的にはマッチする用途だったのかなと思います。

んで今回つくったrails_log.rbというライブラリなのですが、以下のようにして使うことを想定してます。

require "rails_log"

# 普通のログファイルを生で解析
rlog = RailsLog.new("/hogege/log/production.log")
rlog.each do |row|
 # rowを使っていろいろ数えたりする
end

# binファイルに変換
rlog = RailsLog.new("...")
rlog.convert_to_bin

# binファイルを変換(はやい)
rlog = RailsLog.new("...")
rlog.bin_each do |row|
 # rowを使っていろいろ数えたりする
end

2つのイテレータeachとbin_eachが解析用のメソッドで、ブロック引数(この例ではともにrowとしている)はHashオブジェクトで、以下のようなキーと値を持ってます。

  • :controller_action – HogeController#action_nameのような文字列
  • :format – “html”とか”json”(レスポンスの出力フォーマット)
  • :ip – リクエストしてきたクライアントのIPアドレス(文字列)
  • :datetime – リクエストされたアクセス時刻(Timeオブジェクト)
  • :http_method – GETとかPOSTとか
  • :params – paramsの中身(Hash)
  • :time_total – アクション処理にかかった総時間(単位msec, FixNum)
  • :time_view – View処理にかかった時間
  • :time_db – DB処理にかかった時間
  • :http_response – “200 OK”とかそういう文字列
  • :request_uri -
    “http://mogera.bpsinc.jp/fuga/hoge/?p1=value1&p2=valuevalue22″のような文字列

出力フォーマットがjsonなリクエストと、そうでないリクエストの数を数えるには以下のようにします。

rlog = RailsLog.new("production.log")
c_json, c_other = 0, 0
rlog.each do |row|
 if row[:format] == "json" then
   c_json += 1
 else
   c_other += 1
 end
end
# 数字をつかってなにかする

ただこれでは遅いというのが、当初の開発動機ですので、MessagePackを応用した形式に変換してから解析してみましょう。

# まず変換(これには多少時間がかかる)
raw_log = RailsLog.new("production.log")
raw_log.convert_to_bin("production.log.bin")

# 解析
bin_log = RailsLog.new("production.log.bin")
c_json, c_other = 0, 0
bin_log.bin_each do |row|
  if row[:format] == "json" then
    c_json += 1
  else
    c_other += 1
  end
end

# 以降はbin_eachですばやく解析できる

注意

キーのリストにある以外の値は全て葬りさられますので、元のファイルはバイナリファイルを作成しても手元に残しておくことをおすすめします。(ロガーオブジェクトで出力したデバッグメッセージなど)

パフォーマンス

実験環境: Core2Duo E8500, Mem2GB, VM(KVM), Ubuntu Linux 32bit, ruby1.8.7 enterprise
ログファイル: 約1.4GB, 44万5000リクエストのログ

  • binファイルに変換: だいたい150秒ぐらいかかりました。変換後のバイナリデータの容量は約185MBになりました。
  • eachによる生ログの解析(変換前): eachを全部回すのにだいたい40秒程度
  • bin_eachによる変換されたログの解析: bin_eachを全部回すのにだいたい5秒程度 => 8倍程度の高速化
  • Java版によるログの解析: (環境が違うので参考まで: MacOSX10.6 CPU C2D 2.66GHz, Mem4GB)約2.3秒 => 15倍以上の高速化

常用していきたいruby版でも8倍ほど早くなりました。

ダウンロード

  • rails_log.rb – ログ解析フレームワークとMessagePackを用いたバイナリ形式への変換機能の提供
  • rails_log-java.zip – ログ解析フレームワーク(バイナリのみ)の提供

まとまらないまとめ

ログ解析なんてどうせ数日に1回とか、1日1回なので遅くてもいいや、という話もありますが、解析ツールを開発するときに実際のデータで素早く解析できる、eachとbin_eachを入れ替えるだけでアルゴリズムを触らず生のログファイル/変換済みのバイナリ形式ファイルと対応を切り替えることができるので割と気に入ってます。
またJava版も勢いで作ってみたものの、やはりかなり早かったので自己満足してしまいました。
MessagePackプロジェクトの皆さんにも感謝です!

参考リンク

プログラムはご自由にお使い頂いて結構ですので、よければ皆さんもお試しください。
# バグってたらごめんなさい…

Twitter OAuthのrequest_tokenするところで、CallbackURLを指定したときだけ401 Unauthorizedになる場合

このエントリーをはてなブックマーク Share
2010.07.15    Python, 馬場   タグ: , , , , , , , —    baba   

Twitter APIで認証ページに遷移させるときは、http://twitter.com/oauth/request_token にリクエストトークンを発行依頼します。
しかし、設定を間違えるとここで401 Unauthorizedが発生してしまうことがあります。

Tweepyの場合、以下のようなコードになると思います。

consumer_token = "xxxxxxxxxx"
consumer_secret = "xxxxxxxxxxx"
callback = "http://www.bpsinc.jp/"
auth = tweepy.OAuthHandler(consumer_token, consumer_secret, callback)
redirect_url = auth.get_authorization_url()

今回は、auth.get_authorization_url()のところで、401 Unauthorizedが発生しました。

OAuthHandlerの第3引数、callbackを無しにすると、うまく動きます。

なぜかと思ったら・・・

ここが空だった

ここが空だった

Twitterのページでアプリを登録する際に、「ブラウザアプリケーション」を選んで、Callback URLを入力し忘れると、自動的にクライアントアプリケーションになります

クライアントアプリケーションでCallbackは使えないため、401エラーが返っていたようです(400 Bad Requestを返して欲しかったな・・・)。

また、登録したアプリがBANされた場合にも、同じ現象が発生するようなのでご注意下さい。

Android端末のシェアやはりXperia強し!がんばれ

このエントリーをはてなブックマーク Share
2010.07.14    android, 未分類, 芝原      shibachan   

弊社で開発していおりますAndroidアプリ MusicFlyカタぞうではバグ報告システムによって収集しているデータがそこそこの量になってきたので、このたび、グラフとして現在のAndroid情勢を比較してみました。

バグ報告システムとは何ぞやという方はこちらの記事をどうぞ。

この仕組みを参考にさせていただきました。

*注 データとしてあまり信頼はしないでください。あくまで参考程度に。

デバイスのシェア

モデル

SDKのバージョン

SDK割合

AndroidにAdMob広告を配置する入門

このエントリーをはてなブックマーク Share
    android, java, 馬場   タグ: , , , , —    baba   

インプレッション表示の収入がないとか、クリック単価が低いとか、なかなか広告が出ないとか、アプリ・Web開発者側からするとお金にしづらいAdMobではありますが、すごく使いやすいので、使っている方も多いと思います。

Androidに完全対応した(少ない手間で組み込める)数少ない広告システムということもあり、色々お世話になります。

今回は、AdMobの登録~Androidで広告を表示してみるまでの簡単な手順と、注意点です。

登録

http://jp.admob.com/から登録します。

アプリケーションを追加

ログインしたら上部タブから「マーケットプレイス」を選択します。
「キャンペーン」は広告主用のものなので、開発者は「サイト及びアプリケーション」を開きます。

「サイト・アプリケーションを追加」ボタンをクリックし、「Android」ボタンをクリックすると、アプリ情報入力画面になります。
ここに入力した内容に間違いがあっても、広告が表示されない、ということはありませんが、なるべく正直に入力しましょう。

SDKのダウンロード

アプリの登録を完了すると、SDKとマニュアルPDFがダウンロードできるようになります。
SDKはダウンロード・解凍して、適当な場所に置いておきます。同フォルダにAdMobSDKのリファレンス(JavaDoc)もあるので、是非参考にしてください。

これ以降の手順は、PDFに従うのが一番です!!

広告が表示されないとき

ということで、解説を途中で放棄して、「PDF通りにやったのに広告が表示されない」という場合のチェックポイントです。
基本的に、ManifestにパブリッシャーIDを入れて、attrs.xml、表示したいViewのXMLを書けばOKなのですが、以下の場合、広告が表示されません。

・ネットワーク接続できない
この場合、広告は取得できず、何も表示されません。

・表示領域が狭い
AdViewのサイズは、横幅320px以上である必要があります。それより小さいと、何も出てきません。

・ログに「no ads are available」と出る場合
広告がありません。AdMobは広告主に比べて開発者が多いのか、広告が見つからないことが良くあります。
この場合、Webの管理画面から「自社広告」を入れておけば、何も見つからないときに自社広告を表示することができます。

・単に遅い
Viewが表示されてから広告が表示されるまで、数秒かかるのが普通です。
上部に入れる場合は、48pxくらいの高さを確保しておいた方が、レイアウトが変わらなくて良いかもしれません。

動的にキーワードフィルタする

Web管理画面から、表示する広告のジャンル、キーワードフィルタ等を設定することができます。
しかし、アプリのコードから指定すれば、現在表示しているコンテンツにマッチした広告を表示することも可能です。

以下のようなコードで可能です。

AdView ad = (AdView)findViewById(R.id.ad);
ad.setKeywords("music");

とても多機能なAdMob、うまく使いこなしたいですね。

Excel VBAの開発タブを表示

このエントリーをはてなブックマーク Share
2010.07.13    Windows, 馬場   タグ: , —    baba   

※基本機能です

Excel 2003までは、「ファイル」→「VBAエディタ」といった操作で、VBAのエディタを起動することができました。

Excel 2007では、リボンの「開発」タブから該当機能を起動するのですが、デフォルトでは開発タブがありません。

Excelのオプションで、チェックボックスをONにすることで、表示されるようになりました。

開発タブを表示

開発タブを表示

さて、そろそろ2010製品版も試してみたいですね。
ベータ版はなかなか良かったので、期待。

Androidの多言語対応strings.xmlを効率的に管理する

このエントリーをはてなブックマーク Share
2010.07.12    Eclipse, android, 馬場   タグ: , , , , , , , , , —    baba   

Androidは多言語対応が簡単で、

values/strings.xml
values-ja/string.xml

などの言語ファイルを作るだけで、システムロケールにあわせて自動的に多言語対応されます。

しかし、開発しながらstrings.xmlを書いていくと、複数言語を管理するのはかなり大変。
また、開発者以外の翻訳者にXMLを書かせるのも酷な話です。

ということで、万能ツールExcel君の出番です。

簡単なVBAスクリプトで、Excel管理している言語ファイルから、strings.xmlを出力する機能を作りました。
(たぶん似たようなことをやっている方は多いですよね・・・)

言語ファイル

言語ファイル

これを使えば、

・日本語にはあるのに英語には無い!などの、strings.xmlの記述ミスが無くなります
・Excelなので、XMLを分からない人にも翻訳をお願いできます
・一括生成で、スピーディーに言語のアップデートができます

作ってみたばかりで、不具合等あるかもしれませんが、是非お試し下さい。
フィードバック頂ければ幸いです。

ダウンロード

※VBAマクロなので、Excel設定でマクロを許可して下さい
※Excel 2007で作成しています
※UTF-8対応のため、UTF-8ファイル作成 for VBAのライブラリを使わせて頂きました。作者様に感謝致します。

MusicFly2.1 アップデート!!

このエントリーをはてなブックマーク Share
2010.07.09    MusicFly, android, プレスリリース, 芝原      shibachan   

みなさん、本当にお待たせしました!!

音楽生活をより楽しくするための音楽試聴AndroidアプリケーションMusicFlyが満を持して本日バージョン2.1にアップデートしました!

メイン画面再生画面

今回のアップデートの目玉は

  • 人気アーティスト、アルバムランキング機能
  • 気まぐれアルバム検索機能
  • 検索キーワード履歴

です。

他にも細かい修正や、機能追加など盛りだくさんの内容ですので

ぜひとも、あなた自身の目で、耳で、その違いを体感してください。

新バージョンのMusicFlyのダウンロードはこちら

« 新しい投稿古い投稿 »

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.