Google Sites APIでサイトの一覧を取得すると自分が作成したサイトしか取得できない

Google Site API

http://code.google.com/intl/ja/apis/sites/docs/1.0/developers_guide_protocol.html#SitesFeedGET

で、サイトの一覧を取得すると、自分が作成したサイトしか取得されない。

“The site feed can be used to list the Google Sites a user owns or has viewing permissions”とあるので、読み取り権限があるサイトも取得できるはずなのにおかしいな?と思ったら、ちゃんとありました。「include-all-sites」パラメータをtrueにセットすると、自分から見て読み取り権限のあるサイトも見れるようになりました。

http://code.google.com/intl/ja/apis/sites/docs/1.0/reference.html#feed_ListSites

「include-all-sites」のデフォルトはfalseだったため、指定しないと自分の作成したサイトしか取得されません。

Windows7でArduino UNOを認識させる

息子がWindows7が昨日若松通商で買ってきたArduino UNO認識しないと言うのでちょっと見てみた。

ArduinoというのはAMRマイコンと簡単なI/Oがのった小さな基板で、秋葉原のはんだづけカフェを主催しているスイッチサイエンス社が代理店をしている。

Prototyping Lab ―「作りながら考える」ためのArduino実践レシピという本によると、「ArduinoをUSBで繋ぐとデバイスマネージャ上に「USB Serial Port」というエントリーが一つ表示される」はずだが、それが出ないという。確かに出ていないが、良く見ると「その他のデバイス」の下に「Arduino UNO」と出ている。こいつの「デバイスドライバーを更新」で「自動的に更新ではなくPCにあるファイルで更新」として、Arduinoプロジェクト本家からダウンロードしたArduino Softwareのドライバーディレクトリの下を指定してうまく認識するようになった。「Arduino UNO」からシリアルコンバーターまわりが違うらしい。

さっそくArduino IDEのExampleから「Blink」というやつをアップロードすると、ちゃんと点滅した。

WordPressを3.1にアップデートしたら500 Internal Server Errorが出るようになった

このブログに使っているオープンソースソフトウェア”Wordpress”を、自動アップデートを使って3.1.1にアップデートした。

アップデートの過程の表示を見ると「アップデートに成功しました」と出たので安心したが、画面を切り替えようとすると「500 Internal Server Error」が出てダウンする。

仕方なくApacheの吐いたエラーログを見ると、

PHP Fatal error:  Cannot redeclare user_can() (previously declared in /var/www/html/wp-includes/capabilities.php:1099)

と出ていたのでこれをたどって下のページに行き着いた。

Fatal Error after successful WP upgrade

admin-ssl-secure-adminプラグインが原因だそうで、そのとおりにwp-content/plugins/admin-ssl-secure-adminのディレクトリ名を変えてプラグインを無効化すると復帰した。

 

 

GDataでカレンダーイベントを指定のタイムゾーンに日時を変換して取得する

GData Python clientでカレンダーイベントを取得すると、各カレンダーのデフォルトタイムゾーンで日時を返す。

AさんとBさんのプライベートカレンダーのデフォルトタイムゾーンが違う場合、同じイベントに参加している場合でもそのイベントの日時がAさんとBさんで違って表示されてしまう。AさんBさんならまだ問題は小さい(AさんBさんが同じタイムゾーンを設定すればよい)が、プレミアエディションのカレンダーリソースを使う場合はデフォルトでUS時間のタイムゾーンが設定されてしまう上カレンダーリソースのタイムゾーンを変更する方法が面倒くさい。

なにか良いプロパティはないかと探したら、ありました。CalendarEventQueryのctzです。

query = gdata.calendar.service.CalendarEventQuery(‘calendar_id’, ‘private’, ‘full’)
query.ctz = ‘GMT+09:00’
result = calendar_service.CalendarQuery(query)

IEのJavascriptで「識別子、文字列または数がありません。」エラー

IEの場合だけガジェットのロード時にエラーになってエントリーポイントがキックされない。FireFoxはOK、ChromeもOK、SafariもOK。IEだけNG。エラーメッセージは「識別子、文字列または数がありません。」

しばらく悩んでいたが、検索するとあっさり解決した。

IEのjavascriptエラー「識別子、文字列または数がありません。 」

他にも同じ言及をしているページが多数ある。IE-Javascriptでみんな一度は遭遇するメジャーな問題らしい。

オブジェクトの記法で最後の要素の後ろにカンマを許容するかどうかで

  • 許容しない(IE)
  • 許容する(その他)

で動作が変わってしまうのが原因だった。Javascriptの規格上は許容しないのが正解、つまりIEが正しい珍しいケースだ。

しかしJavascript以外の動的言語では要素の最後にカンマを許容するのが普通だ。PythonやPHPではエラーにならないし、下記ページによるとPerlやRubyでも許容するらしい。

連想配列の最後にカンマを入れてはいけない言語もある – すぎゃーんメモ

悩ましい問題だ。

argument of type ‘bool’ is not iterable – GData Python Client

PythonのGData clientを使っていて、CalendarEventQueryでカレンダーイベントを取得している。繰り返しイベントを展開して取得しようと考え、

http://d.hatena.ne.jp/shingotada/20070529/1180449643

を参考に

query.singleevents=True

とセットしたところ、

argument of type ‘bool’ is not iterable

というエラーが出た。なぜ?と思い調べたところ、このパラメータの型は文字列だったので、

query.singleevents=’true’

としたところ正しくクエリーが処理された。

ExtJSをSSLサイトに使うとセキュリティ警告が出る

ExtJSをSSLで保護したサイトに使うと、ブラウザーのセキュリティ警告が出る。

調べてみたら、ExtJSが外部のgifファイル http://extjs.com/s.gif にアクセスしているのが原因だった。

下の一文をページに追加して解決した。

Ext.BLANK_IMAGE_URL = ” … /resources/images/default/s.gif”;

この方法は3年前の下記記事で紹介されている。

http://d.hatena.ne.jp/yshgt/20080701/1214881433

今だにそのままというのは、ExtJSの使用状況の調査にでも使っているということだろう。

Javascriptで連想配列のlengthを見てはいけない

Javascriptで、配列と同じように連想配列でもlengthで要素数が取れるとばかり思っていたのだが、違った。これに気づかずずいぶん時間を取られた。

JavaScript の配列と連想配列の違い – IT戦記

連想配列のほうがObjectで、配列はObjectからの派生クラスという説明でやっと附に落ちた。ひょっとしてJavascript使いの間では常識?

ExtJSでtreeNodeのselectをコールするとエラーになる

ExtJSを使っていて、ツリー表示をするためにExt.tree.TreePanelとExt.tree.TreeNodeを使っている。ページを開いた時にノードの一つをデフォルト選択状態で表示させたくてTreeNode.select()をコールするのだが、なぜかルート下のノード以外をデフォルト選択させようとするとJavaScriptエラーになる。

色々調べていたら、結局selectがコールされるノードは親ノードがexpandされて表示されている状態でないとダメということがわかった。

結局、デフォルト選択させるノードのparentを順にたどってルートまでの全てのノードを取得し、ルート側から順にexpandさせることで解決した。

GData Python clientのクエリーでurl.fetchのレスポンスタイムアウトを5秒からのばす

GAE上でGdata Python Clientを使い、サービスのクエリーで「DownloadError ApplicationError: 5」が稀に発生するので原因を調べていたら、以下の記事からライブラリ内部のurl.fetchで5秒タイムアウトしていることがわかった。

GAEのurl.fetchでDownloadError ApplicationError: 5 | ウフル技術ブログ

5秒はきついので10秒にのばそうと調べたら、run_on_appengineの引数に”deadline=10″を渡せばいいことがわかった。

gdata.alt.appengine.run_on_appengine(calendar_service, deadline=10)