2010年11月29日月曜日

iPhoneからの投稿テスト

BloggerはSafariからも投稿可能だが、さすがに使いにくいので、専用アプリを試してみた。以下のアプリを候補に上げた、理由は、、、無料!

  • BlogWriterLite
  • Free mobile blogging with BlogBooster
  • BlogSpace

まず始めに、BlogWriterLiteを試してみたが、いきなり欠点が発覚した。編集途中でアプリを切り替えると編集内容がクリアされてしまう。アプリ上で下書き機能がある様だが、使い勝手は良くない。またサーバー上の下書きを編集する事が出来ない。もしかしたら出来るのかも知れないが、直感的に操作出来なかった。

次にBlogBoosterを試してみた。BlogWriterLiteで指摘した欠点は全てクリアしていた。強調イタリック下線取消線、画像アップロードなど出来る。フォント変更も出来そうだが、使い方が分からなかった。

次にBlogSpaceを試してみた。これもBlogWriterLiteで指摘した欠点は全てクリアしていた。しかし、BlogBoosterにあったhtmlのタグを挿入してくれる機能はない。

ここまで書いた時点BlogBoosterで決まりかと思ったが、BlogBoosterで作成した下書きをBlogSpaceで確認したら、勝手に以下のものが挿入されていた。

<span id='BB_SIGN_BEGIN'><img alt='BlogBooster-The most productive way for mobile blogging. BlogBooster is a multi-service blog editor for iPhone, Android, WebOs and your desktop' src='http://theblogbooster.com/pixel.gif' style='border:none;'/></span>


もう少し時間をかけて調査する必要がありそうだ。

2010年11月23日火曜日

Google Apps Script サービスとして公開

サービスとして公開してみる。
まずは以下のコードを作成する。

function doGet(e){
var app = UiApp.createApplication();
var panel = app.createVerticalPanel();
panel.add(app.createLabel("Hellow. World."));
app.add(panel);
return app;
}

あとはスクリプトエディタの「共有」=>「サービスとして公開...」を選択する。表示されたダイアログの「サービスを有効にする」にチェックをつける。あとはURLに表示されているアドレスにアクセスすると、以下のように表示される。
Hellow. World.

google apps scriptとは関係ないが、上記のように長いアドレスはgoo.glなどのサービスを用いて短縮するとよいかもしれない。

2010年11月18日木曜日

Google Apps Script 連絡先にアクセスしてみる

Googleの連絡先にアクセスするベーシックなスクリプトを作ってみた。連絡先に登録されているすべてのデータを取得し、spreadsheetsに書き出すだけである。


function myFunction() {
var contacts = ContactsApp.getAllContacts();

var doc = SpreadsheetApp.getActiveSpreadsheet();
var cell = doc.getRange('A1');
for (var i in contacts) {
var contact = contacts[i];
var FamilyName = contact.getFamilyName();
var GivenName = contact.getGivenName();

cell.offset(i, 0).setValue(FamilyName);
cell.offset(i, 1).setValue(GivenName);
}
}

2010年11月15日月曜日

iPhoneの壁紙

いまお気に入りのiPhone壁紙を紹介する。

よくある本棚壁紙は中身が空で味気なかったり、いかにもコンピュータで作られたものだったりなかなかよいものが無かった。
4×5に区切られたセンスの良い本棚画像があったのでヘッダ部分とフッダ部分を加工した。実際に設定した画像を見ると、程よくピントがずれているために思ったより落ち着いた仕上がりになった。


次はマンションを外から撮影し、ベランダにアプリのアイコン配置されるようにしてみようかと思う。ただ、マンションを撮影していると通報されたりしないか心配だ。

Google Apps Script カレンダーイベント取得の動作

カレンダーイベントを取得したときの、取得順番を調べてみた。

var cal = CalendarApp.getDefaultCalendar();

var events = cal.getEvents( new Date("July 10, 2009 JST"), new Date("July 25, 2009 JST") );


上記のコードで取得したときにevents配列に取得できるイベントは以下の法則で決まっているようである。
しかし、イベントには多くのパラメータがあるので、ほかにもイベント取得順番に影響を与えているパラメータがあるかもしれない。
  1. イベント終了時刻が早いものから格納される

  2. イベント開始時刻が早いものから格納される。

  3. イベントタイトルの降順

簡単な調査の結果なので、まだまだ不確かな状態ではあるが、イベントの開始時刻よりも終了時刻が優先されているのが意外であった。

Google Apps ScriptのTimezone

Google Apps Script はサーバーサイドで動作するので、Timezoneがどのように認識されているのか確認してみた。

function myFunction() {
var d = new Date();
Browser.msgBox(d.toLocaleString());
}


結果「November 9, 2010 8:22:16 AM PST」と表示された。

なお、クライアントサイドで実行されるJavaScriptでは「Wed Nov 10 2010 01:22:16 GMT+0900 (Japan Standard Time)」と表示された。

Googleのサーバが設置してある地域にあわせてあるのだろうか?
と思ったがちょっと調べたら、スクリプトエディタの[ファイル]->[プロパティ]で設定できることが分かった。

さっそく、タイムゾーンを「(GMT+09:00) Tokyo」に設定し先ほどのスクリプトでJSTと変化したので、さらに確認用のスクリプトを作成してみた。
function myFunction() {
// デフォルトのカレンダーを取得
var MyCalendar = CalendarApp.getDefaultCalendar();
// 現在の日時を取得
var d1 = new Date();
// その日の深夜を求める
var d2 = new Date;
d2.setHours(24);
d2.setMinutes(0);
d2.setSeconds(0);
// イベント作成
var evt = MyCalendar.createEvent( "テストイベント", d1, d2 );
// 登録されたイベント終了時刻を表示
Browser.msgBox(evt.getEndTime());
}

スクリプトの内容は実行時刻からその日の深夜までのイベントを登録するスクリプトで、思った通り動作した。

当分はこれでもよいが、そのうちJST以外のタイムゾーンに設定されているカレンダーだと正常に動作しないので、なにか対策を考えたいと思う。

Bloggerへのソースコード貼り付け

Bloggerにソースコードを貼り付ける方法を考えてみた。

「デザイン」=>「HTML の編集」より、以下のスタイルを追加する。

.main-outer pre.src{
display: inline-block;
margin: 4px 0px 6px 15px;
padding: 5px;
border: 3px dotted #98CB00;
background-color: #bbdd88;
font-family: monospace;
font-size: smaller;
width: 95%;
overflow: auto;
}

.main-outer pre{
display: inline-block;
margin: 4px 0px 6px 15px;
padding: 5px;
border: 3px dotted #CB9800;
background-color: #ddbb88;
font-family: monospace;
font-size: smaller;
width: 95%;
overflow: auto;
}


実際の記事にソースコードに貼り付けるときは以下のようにする。
<pre class=src>.main-outer pre.src{
display: inline-block;
margin: 4px 0px 6px 15px;
padding: 5px;
border: 3px dotted #98CB00;
background-color: #bbdd88;
font-family: monospace;
font-size: smaller;
width: 95%;
overflow: auto;
}
</pre>


エラーやプログラムの出力などソースコード以外を貼り付けるときは以下のようにする。
<pre>.main-outer pre{
display: inline-block;
margin: 4px 0px 6px 15px;
padding: 5px;
border: 3px dotted #CB9800;
background-color: #ddbb88;
font-family: monospace;
font-size: smaller;
width: 95%;
overflow: auto;
}
</pre>

色合いなど満足できていないが、当面はこのままいこうと思う。

Google Apps Script のイベント削除のバグ?

Google Apps Scriptの練習として、まずはカレンダーにイベント作成&削除という基本的なことから試してみた。

デフォルトカレンダーにイベント作成し、すぐに削除するスクリプトを作成した。
エラーなく動作しているようだが、作成したイベントをすぐに削除するようにしたので、
「一旦イベントが登録されてすぐに削除された」
のか、
「登録も削除もされずにエラー表示もされなかった」
のか区別がつかない。そこで削除する前にメッセージボックスを表示するようにした。

メッセージボックスが表示されているときにカレンダーを確認するとイベントが作成されていることを確認できる。そこでメッセージボックスのOKボタンを押下すると、イベントが削除されるはずが、、、

なぜかエラーが表示される。

"Service error: Calendar : If-Match or If-None-Match header or entry etag attribute required"

いろいろ試してみるとdeleteEventやsetTimeなどの前にmsgBoxを呼び出すとエラーになるようだ。


function myFunction() {
// デフォルトのカレンダーを取得
var MyCalendar = CalendarApp.getDefaultCalendar();

// 現在の日時を取得
var d1 = new Date();

// 5分後を求める
var d2 = new Date;
d2.setTime(d1.getTime()+5*60*1000);

// イベント作成
var evt = MyCalendar.createEvent( "テストイベント", d1, d2 );

Browser.msgBox(d1.toLocaleString());
// Browser.msgBox()後にevt.deleteEvent()やevt.setTime()を
// 行うと以下のエラーが表示される。
// "Service error: Calendar : If-Match or If-None-Match
// header or entry etag attribute required"

// イベント作成
evt.deleteEvent();
};