AndroidアプリからGoogle Document APIを使いたくてgdata-java-clientをDLして組み込んでみるも、なぜか実行時に落ちます。このGDataクライアントはGoogle Data APIのラッパークラスで、以下のようにURLからGoolgleドキュメントのワークシートを引っ張ってきて簡単に弄れる優れものなんです。
URL url = FeedURLFactory.getDefault().getSpreadsheetsFeedUrl();
SpreadsheetQuery sq = new SpreadsheetQuery(url);
なんで落ちるんだろ~?と思って説明をよく読んでみたら
gdata-java-client
http://code.google.com/p/gdata-java-client/
>Android support
>Since GData Java Client Library does not support Android, Android developers
>should instead use the new library Google API Client Library for Java.
なぜかAndroidだけサポートしなくなったようです。
javaバイナリなので自作アプリに組み込んでビルドまでできるけど実は動かない。
このトラップには要注意(´・ω・`) ← 何時間もハマった
Q. ではAndroidでGoogleドキュメントにアクセスしたい場合はどうするのでしょう?
A. Google-api-java-clientを使ってアクセスすることになります。
このライブラリはGoogleが提唱するhttpサーバー・クライアント間のデータ交換を行うプロトコルのラッパーであり、GData-clientのようなOOP的にGoogleドキュメントを扱うものではないので実装は面倒になります。
google-api-java-client
http://code.google.com/p/google-api-java-client/
2011年12月30日金曜日
2011年12月10日土曜日
mac mini (mid2011)+Windows7がスリープから復帰しない!
mac miniを導入して3週間前後経ちましたが、ここにきてスリープから復帰しないトラブルが発生。(Windows7 SP1)
前日までは正常だったんですが・・・・
スリープしてすぐに復帰させると成功するのに、1~2時間置いてから復帰しようとすると失敗。
モニタがNO SIGNALのままでUSBデバイスも無反応で復帰しません。
スリープ直後はACPI S1,S2ステートでこの時点では正常に復帰できるが、しばらくするとS3ステートに落ちて状態が変わるのかなー?と推測しましたが、powercfg/aで確認すると
mac miniはS1,S2をサポートしていない様子。
調べた所、HIDデバイスのFastResumeDisableを1にすれば直りそうなので試してみます。
Windows Vista ベースのコンピューターをスリープ状態または休止状態から再開した後、USB キーボードの一部の LED ランプがキーのオン、オフを正しく表示しないことがある
2011/12/12 追記
上記の対処で無事直ったようです。
前日までは正常だったんですが・・・・
スリープしてすぐに復帰させると成功するのに、1~2時間置いてから復帰しようとすると失敗。
モニタがNO SIGNALのままでUSBデバイスも無反応で復帰しません。
スリープ直後はACPI S1,S2ステートでこの時点では正常に復帰できるが、しばらくするとS3ステートに落ちて状態が変わるのかなー?と推測しましたが、powercfg/aで確認すると
mac miniはS1,S2をサポートしていない様子。
調べた所、HIDデバイスのFastResumeDisableを1にすれば直りそうなので試してみます。
Windows Vista ベースのコンピューターをスリープ状態または休止状態から再開した後、USB キーボードの一部の LED ランプがキーのオン、オフを正しく表示しないことがある
2011/12/12 追記
上記の対処で無事直ったようです。
2011年12月5日月曜日
スタンバイ復帰の原因を探る
先月mac mini(Mid2011)を導入しました。このPCは非常に消費電力(スタンバイ時2W)が少ないので
普段はスタンバイ状態しておき、数秒でサッと使うことができます。
さてWindowsをスタンバイにしていると、なぜか勝手にスタンバイ復帰してしまうことがあります。
実害はないのですが、節電の観点からはあまり好ましくありません。
そこでスタンバイが復帰してしまった原因を探ってみましょう。
コマンドプロンプトからpowercfg -lastwakeを実行します。その結果、
Wake History Count - 1
Wake History [0]
Wake Source Count - 1
Wake Source [0]
Type: Wake Timer
Owner: [PROCESS] \Device\HarddiskVolume4\Windows\System32\services.exe
Owner Supplied Reason: Windows は、スリープ状態の解除を要求したスケジュール
されたタスク '\Microsoft\Windows\Media Center\mcupdate_scheduled' を実行します。
タスクmcupdate_scheduledがスタンバイ復帰の原因であることが分かりました。
タスクスケジューラから当該タスクのプロパティを開き、「タスクを実行するためにスリープ解除する」のチェックを外せば勝手にスタンバイから復帰することはなくなります。
普段はスタンバイ状態しておき、数秒でサッと使うことができます。
さてWindowsをスタンバイにしていると、なぜか勝手にスタンバイ復帰してしまうことがあります。
実害はないのですが、節電の観点からはあまり好ましくありません。
そこでスタンバイが復帰してしまった原因を探ってみましょう。
コマンドプロンプトからpowercfg -lastwakeを実行します。その結果、
Wake History Count - 1
Wake History [0]
Wake Source Count - 1
Wake Source [0]
Type: Wake Timer
Owner: [PROCESS] \Device\HarddiskVolume4\Windows\System32\services.exe
Owner Supplied Reason: Windows は、スリープ状態の解除を要求したスケジュール
されたタスク '\Microsoft\Windows\Media Center\mcupdate_scheduled' を実行します。
タスクmcupdate_scheduledがスタンバイ復帰の原因であることが分かりました。
タスクスケジューラから当該タスクのプロパティを開き、「タスクを実行するためにスリープ解除する」のチェックを外せば勝手にスタンバイから復帰することはなくなります。
2011年10月31日月曜日
.NETからGoogleドキュメントAPIを使ってみる
.NETプログラムからGoogleドキュメントにアクセスするライブラリを使ってみました。
Google CodeからGoogle Data API Setupをダウンロードしてインストールします。
開発環境から.NETのプロジェクトを作成し、
(インストールパス)\Google\Google Data API SDK\RedistにあるマネージDLLを参照に追加します。
今回はとりあえず以下のDLLを使ってみます。
Google.GData.Client
Google.GData.Documents
Google.GData.Spreadsheets
以下はスプレッドシートを開くコードです。
# "Spread sheet Title"が開くドキュメント名です。
Dim ssrv As New SpreadsheetsService("hoge-service")
Google CodeからGoogle Data API Setupをダウンロードしてインストールします。
開発環境から.NETのプロジェクトを作成し、
(インストールパス)\Google\Google Data API SDK\RedistにあるマネージDLLを参照に追加します。
今回はとりあえず以下のDLLを使ってみます。
Google.GData.Client
Google.GData.Documents
Google.GData.Spreadsheets
以下はスプレッドシートを開くコードです。
# "Spread sheet Title"が開くドキュメント名です。
Dim ssrv As New SpreadsheetsService("hoge-service")
Dim sq As New SpreadsheetQuery()
ssrv.setUserCredentials(mUserName, mPassword)
sq.Title = "Spread sheet Title" ' 検索対象のスプレッドシート名
Dim feed As SpreadsheetFeed = ssrv.Query(sq)
If 0 < feed.Entries.Count Then
Dim ss As SpreadsheetEntry = CType(feed.Entries(0), SpreadsheetEntry)
End If
ssrv.setUserCredentials(mUserName, mPassword)
sq.Title = "Spread sheet Title" ' 検索対象のスプレッドシート名
Dim feed As SpreadsheetFeed = ssrv.Query(sq)
If 0 < feed.Entries.Count Then
Dim ss As SpreadsheetEntry = CType(feed.Entries(0), SpreadsheetEntry)
End If
これでスプレッドシートへの参照が取得できました。
次にシートの中のセルを更新してみます。
Protected Overrides Sub UpdateSheet( _
ByVal srv As SpreadsheetsService, _
ByVal ss As SpreadsheetEntry)
Dim sq As New SpreadsheetQuery()
If ss.Worksheets.Entries.Count = 0 Then Return
Dim ws As WorksheetEntry = CType(ss.Worksheets.Entries(0), WorksheetEntry)
' ワークシート上から範囲にあるセルの集合を取得します
Dim cq As New CellQuery(ws.CellFeedLink)
cq.Range = "A1:C3" ' セル範囲
cq.ReturnEmpty = ReturnEmptyCells.yes ' 空のセルも列挙する
Dim ce As CellFeed = srv.Query(cq)
For i As Integer = 0 To ce.Entries.Count - 1
Dim cell As CellEntry = CType(ce.Entries(i), CellEntry)
' セルの値を表示
If cell.Value IsNot Nothing Then
MsgBox(cell.Value.ToString)
End If
' 値を変更して更新
cell.InputValue = "セル(" & cell.Column.ToString & "," & cell.Row.ToString & ")"
cell.Update()
Next
End Sub
上記コードはセルごとにUpdateしています。
Updateメソッドで毎回POST送信するため、いくつものセルを一括更新するには向きません。
そのような場合にはバッチ更新を使います。
Protected Overrides Sub UpdateSheet( _
ByVal srv As SpreadsheetsService, _
ByVal ss As SpreadsheetEntry)
Dim sq As New SpreadsheetQuery()
If ss.Worksheets.Entries.Count = 0 Then Return
Dim ws As WorksheetEntry = CType(ss.Worksheets.Entries(0), WorksheetEntry)
Dim cq As New CellQuery(ws.CellFeedLink)
cq.Range = "A1:C3"
cq.ReturnEmpty = ReturnEmptyCells.yes
Dim ce As CellFeed = srv.Query(cq)
' 更新バッチ作成
Dim updateCells As CellFeed = ws.QueryCellFeed()
Dim batch As New GDataBatchEntryData(GDataBatchOperationType.update)
Dim batchFeed As AtomFeed = New AtomFeed(updateCells)
For Each cell As CellEntry In ce.Entries
If cell.Value IsNot Nothing Then
MsgBox(cell.Value.ToString)
End If
cell.InputValue = "セル(" & cell.Column.ToString & "," & cell.Row.ToString & ")"
cell.BatchData = batch
batchFeed.Entries.Add(cell)
Next
' バッチ実行
Dim rseult As CellFeed = CType(srv.Batch(batchFeed, New Uri(updateCells.Batch)), CellFeed)
For Each entry As CellEntry In rseult.Entries
If entry.BatchData.Status.Code <> 200 Then
Throw New Exception("Cell update for " + entry.BatchData.Id + " failed!")
ByVal ss As SpreadsheetEntry)
Dim sq As New SpreadsheetQuery()
If ss.Worksheets.Entries.Count = 0 Then Return
Dim ws As WorksheetEntry = CType(ss.Worksheets.Entries(0), WorksheetEntry)
' ワークシート上から範囲にあるセルの集合を取得します
Dim cq As New CellQuery(ws.CellFeedLink)
cq.Range = "A1:C3" ' セル範囲
cq.ReturnEmpty = ReturnEmptyCells.yes ' 空のセルも列挙する
Dim ce As CellFeed = srv.Query(cq)
For i As Integer = 0 To ce.Entries.Count - 1
Dim cell As CellEntry = CType(ce.Entries(i), CellEntry)
' セルの値を表示
If cell.Value IsNot Nothing Then
MsgBox(cell.Value.ToString)
End If
' 値を変更して更新
cell.InputValue = "セル(" & cell.Column.ToString & "," & cell.Row.ToString & ")"
cell.Update()
Next
End Sub
上記コードはセルごとにUpdateしています。
Updateメソッドで毎回POST送信するため、いくつものセルを一括更新するには向きません。
そのような場合にはバッチ更新を使います。
Protected Overrides Sub UpdateSheet( _
ByVal srv As SpreadsheetsService, _
ByVal ss As SpreadsheetEntry)
Dim sq As New SpreadsheetQuery()
If ss.Worksheets.Entries.Count = 0 Then Return
Dim ws As WorksheetEntry = CType(ss.Worksheets.Entries(0), WorksheetEntry)
Dim cq As New CellQuery(ws.CellFeedLink)
cq.Range = "A1:C3"
cq.ReturnEmpty = ReturnEmptyCells.yes
Dim ce As CellFeed = srv.Query(cq)
' 更新バッチ作成
Dim updateCells As CellFeed = ws.QueryCellFeed()
Dim batch As New GDataBatchEntryData(GDataBatchOperationType.update)
Dim batchFeed As AtomFeed = New AtomFeed(updateCells)
For Each cell As CellEntry In ce.Entries
If cell.Value IsNot Nothing Then
MsgBox(cell.Value.ToString)
End If
cell.InputValue = "セル(" & cell.Column.ToString & "," & cell.Row.ToString & ")"
cell.BatchData = batch
batchFeed.Entries.Add(cell)
Next
' バッチ実行
Dim rseult As CellFeed = CType(srv.Batch(batchFeed, New Uri(updateCells.Batch)), CellFeed)
For Each entry As CellEntry In rseult.Entries
If entry.BatchData.Status.Code <> 200 Then
Throw New Exception("Cell update for " + entry.BatchData.Id + " failed!")
2011年10月26日水曜日
pixivデビューしました
半年前から3D CGの勉強をはじめ、ようやく公開できるレベルの作品が
できたのでpixivデビューしました。モデリングにはMetasequioaを使っています。
(最初はフリー版を使い、ブーリアン等のプラグイン機能を使うためシェアウェア版に移行しました)
できたのでpixivデビューしました。モデリングにはMetasequioaを使っています。
(最初はフリー版を使い、ブーリアン等のプラグイン機能を使うためシェアウェア版に移行しました)
半年前、始めたばかり頃のモデリングの様子。形がオモチャっぽいですね。
何度か作り直し、ようやく実物に近づきました。
VIDROというGIレンダラで出力するご覧のとおり。
最終的にはVue9 Espritという3D景観ソフトを使って出力しました。
Metasequoiaからはオブジェクトを3ds形式で出力すると綺麗にインポートできます。
(「左右軸を反転」が必要)
海や太陽光などリアルな質感を持つ風景を簡単に作成できます。
ちなみにこのCGはアニメFORTUNE ARTERIALに出てきたシーンをモチーフにしています。
名鉄2000系ミュースカイ(もどき)の列車が珠津大橋を渡り、潮見湾に浮かぶ珠津島へ向かいます。
名鉄2000系ミュースカイ(もどき)の列車が珠津大橋を渡り、潮見湾に浮かぶ珠津島へ向かいます。
2011年10月16日日曜日
Mono 2.10.XでMutexがおかしい
.NETアプリをMono(Microsoft .NET Frameworkのopen sourceなimplementation)で動かそうと思い、MonoDevelop 2.8.1でbuildし実行!と思ったら不可解な現象に遭遇。
どうやらThreading.Mutexを作成し、初回のWaitOneでfalseが返されることがあるようだ・・・ナニコレ(;´Д`)
以下のコードをMono 2.10.6で実行すると、最初のWaitOneがfalseを返してくる。
(40%くらいの確率でループ内の最初の1,2回だけfalseが返り、後はちゃんとtrueが返ってくる)
とりあえずtrueになるまでリトライすればOKということにしておこう。
(後、Thread.Sleepが全く効いてない現象も発生。P/InvokeでSleep API何かおかしい?)
using System;
using System.Threading;
namespace MutexBugTest
{
class MainClass
{
private static Mutex mLockStatus = new Mutex();
public static void Main (string[] args)
{
for(int i=0;i<100;++i)
{
if (!mLockStatus.WaitOne(5000))
Console.WriteLine("WaitOne is returned false. #" + i.ToString());
else
mLockStatus.ReleaseMutex();
}
}
}
}
どうやらThreading.Mutexを作成し、初回のWaitOneでfalseが返されることがあるようだ・・・ナニコレ(;´Д`)
以下のコードをMono 2.10.6で実行すると、最初のWaitOneがfalseを返してくる。
(40%くらいの確率でループ内の最初の1,2回だけfalseが返り、後はちゃんとtrueが返ってくる)
とりあえずtrueになるまでリトライすればOKということにしておこう。
(後、Thread.Sleepが全く効いてない現象も発生。P/InvokeでSleep API何かおかしい?)
using System;
using System.Threading;
namespace MutexBugTest
{
class MainClass
{
private static Mutex mLockStatus = new Mutex();
public static void Main (string[] args)
{
for(int i=0;i<100;++i)
{
if (!mLockStatus.WaitOne(5000))
Console.WriteLine("WaitOne is returned false. #" + i.ToString());
else
mLockStatus.ReleaseMutex();
}
}
}
}
2011年9月11日日曜日
Amazon KINDLE DXレビュー
今日は電子書籍を読むための専用端末、Amazon Kindle DXを(去年)購入したときのレビューを紹介します。
アメリカのAmazon.comにアカウントを作成し、JPY(日本円)で注文しました。(当時のレートで約37,000円)
注文後、たしか5日以内には届いたと思います。(米国から発送)
到着したら早速PCに繋げて自炊したPDFを転送してみました。
メニューは日本語が表示できないので文字化けします。
KindleはE Inkを採用しているため、視認性は紙にかなり近いです。
コミックで紙とE Inkを比べてみましょう。(比較に使ったのはリリカルなのはVivid)
バックライトのない表示媒体としてはコントラストが非常に高いと言えるでしょう。
欠点: E Inkの表示性能はコントラスト・解像度ともに実用レベルです。(モノクロですが)
最大の欠点は画面の書き換えが遅いことと、それに伴う暗転が気になることです。
またKindleのMPU性能が低いのか、連続でページ送りしていると(先読みバッファが空になった時点で?)1,2秒余計に待たされるのがストレスに感じました。
総評: E Inkの紙に近い質感が気に入ったのなら自炊PDFリーダーとして買ってもいいと思います。
私は前述のページめくり時の暗転が気になってしょうがないので使うのをやめました。
4万円近いデバイスとしては動作が緩慢な点も大きなマイナスです。
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | } ミ ピコッ
. ヽ } ミ /\ ,☆____
ヽ ノ \ \ / \
/ く \. /\/ ─ ─ \ というわけでiPadに買い換えました(キリッ
| `ー一⌒) / (●) (●) \ Webにゲームに色々できるので満足度はKindleの比じゃなかった
| i´ ̄ ̄ ̄ \ | (__人__) |
\_ ` ⌒´ /
/ \
アメリカのAmazon.comにアカウントを作成し、JPY(日本円)で注文しました。(当時のレートで約37,000円)
注文後、たしか5日以内には届いたと思います。(米国から発送)
到着したら早速PCに繋げて自炊したPDFを転送してみました。
メニューは日本語が表示できないので文字化けします。
KindleはE Inkを採用しているため、視認性は紙にかなり近いです。
コミックで紙とE Inkを比べてみましょう。(比較に使ったのはリリカルなのはVivid)
バックライトのない表示媒体としてはコントラストが非常に高いと言えるでしょう。
PDFの解像度はあらかじめKindle DXの表示部サイズに合わせてあります。
紙とE Inkで文字の見やすさを比較してみましょう。(右側がKindle)
日本語のやや小さい文字でも十分に表示できます。
欠点: E Inkの表示性能はコントラスト・解像度ともに実用レベルです。(モノクロですが)
最大の欠点は画面の書き換えが遅いことと、それに伴う暗転が気になることです。
またKindleのMPU性能が低いのか、連続でページ送りしていると(先読みバッファが空になった時点で?)1,2秒余計に待たされるのがストレスに感じました。
総評: E Inkの紙に近い質感が気に入ったのなら自炊PDFリーダーとして買ってもいいと思います。
私は前述のページめくり時の暗転が気になってしょうがないので使うのをやめました。
4万円近いデバイスとしては動作が緩慢な点も大きなマイナスです。
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | } ミ ピコッ
. ヽ } ミ /\ ,☆____
ヽ ノ \ \ / \
/ く \. /\/ ─ ─ \ というわけでiPadに買い換えました(キリッ
| `ー一⌒) / (●) (●) \ Webにゲームに色々できるので満足度はKindleの比じゃなかった
| i´ ̄ ̄ ̄ \ | (__人__) |
\_ ` ⌒´ /
/ \
2011年8月28日日曜日
立川のたちフェスに行ってきた
今日は立川で行われたたちフェスに行ってきました。
このイベントは立川の夏・南口商人祭の催しの一つで
メイン会場は普通の夏祭り、たちフェス会場はオタク向けといった感じです。
このイベントは立川の夏・南口商人祭の催しの一つで
「とある魔術の禁書目録」などのアニメ巡礼地として有名になった立川。
会場ではその舞台の背景を記した「学園都市マップ」を配布してました。
(私は以前多摩センターでGET済み)
立川駅南口 |
たちフェス会場にはボーカロイド、キョン子、デモベ、AngelBeats!などの痛車が
10台程度並んでいたほか、自衛隊の車両も参加していました。