2011年11月29日火曜日

Google Calendar Header and Navigation Switcherを 最新のGoogleカレンダーに対応

FirefoxのGreasemonkeyで、Googleカレンダーのサイドバーと上部コントロールを非表示にしてカレンダー部分を広くできる便利な「Google Calendar Header and Navigation Switcher」というのがあるが、これがGoogle+風の新しいGoogleカレンダーのデザインだと機能しない。

Userscripts.orgにこれの解決策が書いてあった。

Broken with new look - Userscripts.org
Fixed it.    Change line 88 to: var head = new DisplaySwitcher("head", "#vr-proto-header,#topBar,#cornerBookmarks,#gbar,#gbarl,#guser,#ft+.s,.gbh", (#vr-proto-header is the new header) and add after line 45 (or pretty much anywhere inside DisplaySwitcher.prototype.toggle declaration) the following line: if (this.id=="navi") { document.getElementById("mainbody").style.marginLeft = hide ? "0px" : "210px"; } (to fix the white space that the hidden sidebar leaves)

要約すると、
  • 88行目で指定する隠す対象の指定(後述)を変更する
  • 45行目あたりに、下記のif文を追加する(サイドバーを非表示にした時に空白のスペースが残るのを防ぐため)
    if (this.id=="navi") { document.getElementById("mainbody").style.marginLeft = hide ? "0px" : "210px"; }

88行目で指定する、隠す要素の指定についてはいろんな意見が出てる。
  • #vr-proto-header,#topBar,#cornerBookmarks,#gbar,#gbarl,#guser,#ft+.s,.gbh
  • #onegoogbar,#vr-proto-header,#vr-proto-nav,#topBar,#cornerBookmarks,#gbar,#gbarl,#guser,#ft+.s,.gbh
  • #onegoogbar,#vr-proto-header,#vr-nav,#vr-header,#vr-proto-nav,#topBar,#cornerBookmarks,#gbar,#gbarl,#guser,#ft+.s,.gbh

3番目のahbiさんのやつが一番指定要素が多いので一番シンプルになる。

ただ、自分の場合はアカウントの切り替えができるOne Google Barは残したいので、88行目を下記のようにした。
  var head = new DisplaySwitcher("head", "#vr-proto-header,#vr-header,#vr-proto-nav,#topBar,#cornerBookmarks,#gbar,#gbarl,#guser,#ft+.s,.gbh",
refleshCal);

うん、快適。

2011年11月17日木曜日

Google App Engineでデータを一括で削除する方法

Google App EngineがPreview版を卒業して正式版になったのに伴ない、2011/11/7から価格体系が変わり無料で使えるQuotaが減った。
特に、データ書き込み(Datastore Write Operations)がすぐに制限に達してしまう。

そんなにデータ登録してないけどな?と思って調べてみると、Datastore Write Operationsには登録・更新だけでなく削除も含まれるようだ。
過去データの削除をcronで動かしていたのが全てカウントされている。
そこで、過去データ削除のcronをコメントアウトすると、Datastore Write Operationsが大幅に減った。

残る問題は過去データの削除をどうするか?
調べてみると、Google App Engineの管理画面からDatastore Adminという機能を使えば削除できるらしい。

さっそくDatastore Adminを使ってみる。デフォルトでは無効になっているので、Enabledする。
すると...真っ白な画面が表示された。
調べてみても有効な情報がない。
・
・
・
1日経って気付いた。Googleのマルチアカウントが(例によって)悪さをしている?
いったんSign Outして再ログインしたら無事に表示された。

さっそく削除してみる。Entity Kind(テーブル)ごとの削除になる。(条件を指定して削除できれば完璧なのだが。)
実行すると、Datastore Write Operationsが制限に達して真っ赤になってしまった。Datastore Adminから削除しても、Quotaに含まれるらしい。
仕方ないのでQuotaがリセットされるのを待つ。
・
・
・
リセットされてからしばらく後で見てみると、無事にEntity Kindの削除が終わっていた。Datastore Write OperationsのQuotaの大部分を使ってしまっていたが、明日またリセットされればそれ以降は問題ない。
しばらくこの手でやりくりしてみるか。

2011年11月16日水曜日

Windows 7で Poderosaの接続履歴が保存されない問題

Windows7でPoderosaを使い始めたが、なぜか接続の履歴が保存されないので、毎回ユーザー名や鍵ファイルを指定しなければならないのが面倒。
そして試してみたら接続の履歴だけでなく、あらゆる設定が保存されていないことが判明。

対策は、Poderosaを起動する時に管理者として実行すること。

管理者として実行したら、接続の履歴も設定も保存される。
毎回管理者として実行するのは面倒なので、新しい接続設定を残したい場合や、その他の設定を変えたい場合のみやれば良いと思う。

あるいは、インストールする時にProgram Filesじゃないとこに入れればよかったのかもね。

2011年11月14日月曜日

PDOでテーブルの列名を全て取得する方法

テーブルの列名を取得するには、MySQLならDESCRIBEで簡単にできるが、PostgreSQLだとpg_attributeカタログから取得しないといけないらしい。

でもPDOを使えばMySQLでもPostgreSQLでも取得できた。
$pdo = new PDO("$driver:dbname=$db", $user, $password);
$pdoStatement = $pdo->query("SELECT * FROM $table_name LIMIT 0");

$columns = array();

for ($i = 0; $i < $pdoStatement->columnCount(); $i++) {
    $meta = $pdoStatement->getColumnMeta($i);
    $columns[] = $meta['name'];
}

var_dump($columns);

もしテーブルに1行以上データがあることが保証されているなら普通に1行SELECTして連想配列の列名見れば済む話だが、データなしでも動くようにしたらこうなった。


ただし、PDOStatement->getColumnMeta()のマニュアルを見ると、
この関数は、 実験的 なものです。この関数の動作・ 名前・その他ドキュメントに書かれている事項は、予告なく、将来的な PHP のリリースにおいて変更される可能性があります。 この関数は自己責任で使用してください。
PDO ドライバの全てが PDOStatement::getColumnMeta(). をサポートしているわけではありません。
と書いてあり、PHPやDBのバージョンによっては上手く動かないかもしれないが、とりあえず手元の環境では動いた。


これでPHPでO/R Mapperを作りたい人も安心だ。

2011年11月7日月曜日

Titanium Studioで作ったアプリを Android Marketに登録する手順


Titanium Stuidoで作ったAndroidアプリをMarketに登録できる証明書付きapkファイルにする手順は下記の通り。

  1. JDKのbinフォルダ内にあるkeytool.exeを使って、keystoreを作成する
    (作成時に入力するAliasとパスワードを覚えておくこと。)
    参考:keytoolコマンドで公開するandroidアプリに署名するための証明書(鍵)を生成する
  2. Titanium StudioのProject Explorerで該当のプロジェクトを右クリックする
    (Procejt ExploerはTitanium Studioの左側に表示されているView。表示されていない場合はメニューの「Window」→「Show View」から表示できる。)
  3. 表示されたコンテキストメニューから「Deploy」→「Distribute - Android」を選択する
  4. テキストボックスに必要事項を入力してFinish
    ※Distribution Location(apkファイルの作成場所)のパスに半角スペースを含むとエラーになるので注意。
  5. 慌てずにしばらく待つ(少し時間がかかる)
  6. 4で指定したフォルダにapkファイルが作られる

参考:295 デプロイと配布 - Training Lab Tutorials - Appcelerator Wiki


Android Marketに登録するには、最初にGoogle Checkoutで25ドル支払う必要がある。

また、Marketに登録する際にはスクリーンショット等の画像をアップロードできる。
参考:

2011年11月6日日曜日

Titanium Mobileで 特定のURLをブラウザで開くだけの Androidアプリを作成する方法


app.jsを下記の2行にする。(URLは起動したいURLにする。)
Ti.Platform.openURL("http://www.google.co.jp/"); // Googleの場合
Ti.Android.currentActivity.finish(); // ブラウザを起動したらアプリ本体は終了させる

Resources/androidにある下記の画像ファイルを適切な画像ファイルに置き換える。
  • appicon.png (アプリの起動アイコン)
  • default.png (起動時に表示されるスプラッシュ画像)

2011年11月2日水曜日

Seasar2入門の参考サイトとプロダクト選択のメモ

久しぶりにJava村に帰ってきた浦島さんの玉手箱メモ。


まずは概要を把握。



一口にSeasar2と言ってもたくさんプロダクトがあるので、Webアプリを作る場合にどのプロダクトを使うべきか調査。

  • MVCは、S2Struts or SAStruts or Teedaのどれがいい?
    • S2StrutsかSAStrutsだとどっち?
    • SAStrutsとTeedaでは?
      • Teeda
        • TeedaはJSFの実装
        • Teeda Extensionを使えばHTMLをテンプレートにできる
      • 「Seasarの問題点など」にそろそろ一言いっておくか - ひがやすを blog
        ただ、無責任に何でも自由というのは良くないので、SAStrutsとS2JDBCの組み合わせが、もっとも無難だというメッセージを出しているわけです。
      • SAStrutsとS2JDBCを作ったわけ - ひがやすを blog
        TeedaとS2Daoは、基本的に規約ベースのフレームワークです。規約を知っていれば、本当にさくさく開発できます。でも、規約ベースなので、規約を知らないと、何にもできなくなっちゃう。この辺が、大規模開発には向かないところ。
        SAStrutsとS2JDBCは、大規模案件にも耐えられるように最初から設計されています。
      • 感想:チームでの開発や今後のメンテを考えると、参考情報も経験者も多いStrutsの名前を冠するSAStrutsに比べてTeedaは学習コストがかかりそう
    • 結論:SAStrutsが無難
  • S2JDBC or S2Daoのどっちを使う?
    • HibernateとS2DaoとS2JDBCの考え方 - ひがやすを blogより引用
      • S2Daoについて
        S2DaoはSQLを中心に考えます。とはいえ、すべてのSQLを開発者が書くのは効率が悪いので、挿入、更新、削除は、S2DaoがSQLを自動生成しますが、検索は、開発者にSQLを書いてもらいます。
        デメリットは、SQLを書くのが面倒なことです。また、検索の結果セットごとにDTOを作らなければいけないので、DTOが増える傾向があります。
        Webのフレームワークとの組みあわせでいくと、Teeda Extensionは、S2Dao(DTO)と相性が良いように設計されているので、Teedaを使う場合は、S2Daoが良いと思います。
      • S2JDBCについて
        S2JDBCは、エンティティ(Java)とテーブル(データベース)は、同一のモデルだとみなしています。また、複雑なSQL以外は、すべて自動生成します。
        デメリットは、エンティティの設計が、テーブルに引きずられ、完全にドメインをあらわしたものにならないこと。
    • 感想
      • S2DaoはINSERT/UPDATE/DELETEのSQL自動生成と、手作りしたSQLの実行をしてくれるみたい
      • S2JDBCはDAOではなくApache CommonsのDbUtilsのようなSQLビルダー?
    • 結論:TeedaでないならS2JDBCで



久しぶりにJavaの世界に帰ってきたら、昔使ってたStruts1.3(1.x系は1.3で止まってるとは意外)のラッパーであるSAStrutsと、同じく昔使ってたJakarta Commons(現在は昇格してApache Commons)のDbUtilsに似たS2JDBCが最前線だなんて、奇遇と言うか、あるいは必然なのかな。