muzigram

山椒は小粒でもピリリと辛い

2013/02/28

cloudなIDEでGAEのdployまで可能な。DevTable触ってみた。

2013/03/05追記
これって治る予定ありますか?と訪ねてみたところ。

We've added the issue to our priority bug fix list
と返答来ました!期待して待ってます!great!

Google App Engine Blog: Deploying App Engine apps with DevTable
によると、GAEへのデプロイが可能なクラウドIDEがあるとか

■ DevTable http://try.devtable.com/

なんか凄そうなので試してみる。
自分が試してみた感じ

  • カーソルの位置がずれるバグがある…
  • リリースデプロイですこし苦戦
  • とりあえずハローワールド
  • 2バイト文字、表示がずれたり、カーソルがずれたりでかなり残念なことに
  • Chrome(バージョン 25.0.1364.99)だとカーソルの表示ずれ。
  • Safari(バージョン 6.0.2 (7536.26.17))だとうまく動作した。ただし、日本語は「ああいあいうあいうえ」みたいな残念なことに
  • とりあえずHello worldデプロってみた。https://mogepython.appspot.com/

とはいえ、関数のジャンプや入力のサポートが充実していて、動作もそこそこ軽く。
テスト、デプロイまでが比較的カンタンなので何かに使ってみたい!。
git等とも連動しているし、共同開発のチャット等にはだいぶ未来を感じました。

登録終わった後の画面。とりあえず、Google App Engine作ってみよう!

スクリーンショット 13 02 28 11 39 3

Google App Engineとの連携

スクリーンショット 13 02 28 11 46

許可許可!

スクリーンショット 13 02 28 11 47

名前とURLの設定

スクリーンショット 13 02 28 11 49

で、これがIDEのメイン画面。

スクリーンショット 13 02 28 12 18

ビルド待ち

スクリーンショット 13 02 28 11 50

release Deplyの際にGAEの管理画面からversion -> mimic ->1 へ変更

スクリーンショット 13 02 28 12 11

とりあえずハローワールド
https://mogepython.appspot.com/
ChromeBook等からここにアクセスすれば、開発もできちゃうよね!Great!って感じでしょうか。

2013/02/27

GAEで静的ファイルが表示できない。

■ 問題

GAEで静的なファイルが表示されない。pngとかそういうの。

■ 環境

GAEでGoという環境。
  • release: "1.7.4"
  • timestamp: 1352314290
  • api_versions: ['go1']

我ながらどうしてこういうことで詰まってしまったのか…

■ 事象

GAEを適当に動かしていたら静的ファイルが表示できない!という現象に遭遇。
しかし、ログを見ても
INFO     2013-02-27 05:14:47,565 dev_appserver.py:3103] "GET /add.png HTTP/1.1" 200 -
正常系の200…

■ 解決

参考にさせて頂きました。

http://jutememo.blogspot.jp/2008/09/google-app-engine.html

ただし、 `- url: /.* ’ の記述よりも前に記述すること。

ルーティングとかをきちんと理解していないからこういうことをしてしまう…

2013/02/20

[予習その2] YouTube API Tech Talk・コードラボ

その1:http://muzigram.muzigen.net/2013/02/youtube-api-tech-talk.html

続き

■ Lesson 3: Requesting the YouTube User Id and List of Uploads

https://docs.google.com/document/d/1QLF1Nrg8xBCOfZrC8yVICKi53OWwY4FPky7iZdk9NdI/pub#h.odszgbq0my2j

valid な OAuth 2 access tokenを手に入れたのでYoutubeから2つ程、情報を取得してみよう。というお話。

認証を通過すると以下の関数が実行される。
  function loadAPIClientInterfaces() {
    gapi.client.load('youtube', 'v3', function() {
      gapi.client.load('youtubeAnalytics', 'v1', function() {
        // Once both the client interfaces are loaded, use the Data API to request information
        // about the authenticated user's channel.
        getUserChannel();
      });
    });
  }

  • youtubeとyoutubeAnalytics両方のAPIをロード
  • gapi.client.loadのcallbackでgapi.client.loadしてる。
  • getUserChannelを実行

  function getUserChannel() {
    // https://developers.google.com/youtube/v3/docs/channels/list
    var request = gapi.client.youtube.channels.list({
      // mine: true indicates that we want to retrieve the channel for the authenticated user.
      mine: true,
      part: 'id,contentDetails'
    });

    request.execute(function(response) {
      if ('error' in response) {
        displayMessage(response.error.message);
      } else {
        // We will need the user id associated with this channel later on when making calls to the
        // Analaytics API. It looks like UCdLFeWKpkLhkguiMZUp8lWA.
        channelId = response.items[0].id;
        // This is a string of the form UUdLFeWKpkLhkguiMZUp8lWA, and represents a unique
        // identifier for the uploads in the authenticated user's channel.
        var uploadsListId = response.items[0].contentDetails.relatedPlaylists.uploads;
        // Now that we have the uploads list id, retrieve the items in the uploads list.
        getUploadsList(uploadsListId);
      }
    });
  }

requestを作成、実行。request.executeの中身は実行された際のcallback。

  • request.execute実行される
  • 結果がfunction(response)に渡される。
  • うまくいっていたらuploadsListIdを取得してgetUploadsListを実行

function getUploadsList(listId) {内
 var videoIds = $.map(response.items, function(item) {
            return item.snippet.resourceId.videoId;
          });

補足

$.map()はjQuery.map(array, callback)のことで 配列にcallback文の処理をして返す。

function getMetadataForVideos(videoIds) {内
callback : function(response) のthisは通常のthisではなく、callback内のthisであることに留意

■ Lesson 4: Requesting YouTube Analytics Data for a Given Video

https://docs.google.com/document/d/1QLF1Nrg8xBCOfZrC8yVICKi53OWwY4FPky7iZdk9NdI/pub#h.q9dzy1uklmei
与えられた動画のAnalytics Dataの取得

function displayVideoAnalytics内で、今までと同様にリクエスト投げて値を取得してます。
formatDateStringpadToTwoCharactersで細かいstringの調整などもしてるのでみてみるといいと思います。

このデモではログインしているアカウントを使ってますが、ログアウトせずに他のアカウントを使う場合はChromeのシークレットモードがおすすめ!っとのこと

■ 補足

どのAPIを叩いてるかは以下のURLと比較するとわかりやすくなります。
https://developers.google.com/youtube/v3/docs/

2013/02/18

[予習するよ!] YouTube API Tech Talk・コードラボ

予習するよ!
2013/02/21に

YouTube API Tech Talk ・コードラボ
に行くことになったので予習。
英語の勉強も兼ねてる。
上記ブログの
https://docs.google.com/document/d/1QLF1Nrg8xBCOfZrC8yVICKi53OWwY4FPky7iZdk9NdI/pub を軽く見てみる!

■ Lesson 1: Base HTML

javascriptとかAPI使う前に基本的なHTML構造が必要だ!
それがこいつだ!

■ Lesson 2: Authentication with OAuth 2

Oauth2な認証をするよ!
http://io12-youtube-codelab.appspot.com/static/lesson2/index.html
をみてみると8行目に

<script type="text/javascript" src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script>
という記述がある。
index.jsの方をみてみると

  
window.onJSClientLoad = function() {
    gapi.auth.init(function() {
      window.setTimeout(checkAuth, 1);
    });
  };
となっていて、checkAuthが走るようになっている。
認証の結果によってpre-auth要素とpost-auth要素を消したり表示したり。
認証が通っていない際には#login-linkにclick時に動作する

$('#login-link').click(function() {
        gapi.auth.authorize({
          client_id: OAUTH2_CLIENT_ID,
          scope: OAUTH2_SCOPES,
          immediate: false
        }, handleAuthResult);
      });
を加えている。

■補足
http://code.google.com/p/google-api-javascript-client/
グーグルによって書かれた、Google's RESTful APIsにアクセスするライブラリ!簡潔で効率がいいらしいよ!
Lesson2の下のほうに「(function() {})();」に関する
解説があります。グローバルな値や関数を抑制するための仕組み?
ですね。即時関数とか呼ばれてたりするのかしらん。

続く!

2013/02/12

android-junit-reportでテスト結果をxmlファイルで出力

既にいろいろな所で紹介されている感もありますが…

■ 概要

AndroidのUnitTestの結果をxmlにて出力する。

■ 使用lib

ソースコード
https://github.com/jsankey/android-junit-report

jarならこちら
https://github.com/jsankey/android-junit-report/downloads

■ 使い方

■ TestProjectのlibsにjarを設置。

■ TestProjectのmanifestの一部を変更
    <!-- android:name="android.test.InstrumentationTestRunner" -->
    <instrumentation
        android:name="com.zutubi.android.junitreport.JUnitReportTestRunner"
        android:targetPackage="{テストされるプロジェクト}" />

■ Eclipseから実行する場合はRun Configurationsで下記
(Instrumentation runner)を変更
スクリーンショット 13 02 12 17 23 2

■ 結果の取得方法

結果はxmlとして出力されますが、そのファイルは実行したAndroid端末の内部に存在しています。なので、下記のコマンド等を用いて、ファイルを取り出します。
adb pull /data/data/{テストされる側のpackage}/files/junit-report.xml

2013/02/08

[go] hello go world

_人人人人人人人人_
> 突然のgo lang <
 ̄Y^Y^Y^Y^Y^Y^Y ̄

■ 環境

2013/02/08 . 使用OS Mac OS X 10.7.5
sw_vers -productVersion
10.7.5
go version
go version go1.0.3

■ install

homebrew使うよ
brew install go
でうまいことやってくれます。

■ ready

どっか適当な場所で
mkdir hello
cd hello
touch hello.go

■ code

package main

import fmt "fmt"

func main() {
    fmt.Printf("Hello world")
}

■ run

go run hello.go

■ result

Hello world

■ tips

import fmt is http://golang.org/pkg/fmt/

2013/02/07

robotiumで無理矢理にWebViewのテスト

■ WebViewが含まれたアプリのテスト

robotiumを用いて簡単なシナリオテストを作りたい。
しかしWebViewを直接操作、となるとなかなかうまく行かない。
そこで下記の方法を用いて、無理矢理にテストシナリオを書いてみた。

■ 主に使用するmethod

//スクリーン上のfloat x,y 点をタッチする
solo.clickOnScreen(x,y);
//ログ上に指定のStringが出てくるまで待機
solo.waitForLogMessage("");
//指定ミリ秒待機
solo.sleep(int);

■ 開発者向けオプションを使用し、座標を把握

現在のタップデータをオーバーレイ表示するをチェックすると
タッチした座標が表示できる。
テストの時に利用するリンクの位置を予め調査してメモ
Screenshot 2013 02 07 15 38 52 Screenshot 2013 02 07 15 19 00 2

■ 注意点

下記のpermissionを「テストされる側」の AndroidManifest.xmlに付け加えること。
<uses-permission android:name="android.permission.READ_LOGS"/>
あとは、画面上のリンクの座標をクリック。
ページが更新されるまで待つ、
次の動作を行う。

を繰り返すだけ。

■ sample code

String webLoadFinishLogString= "ロード完了時に出力するログ"
private void linkClickAndWaitResult(float x,float y){
 solo.clickOnScreen(x,y);
 solo.waitForLogMessage(webLoadFinishLogString);
}
こんな感じのmethodを用意して、クリックしたら遷移を待つ。みたいな体にすると簡単な遷移テストが可能になります。 このエントリーをはてなブックマークに追加

2013/02/06

[Android]UnitTest +Robotium + Library jars

■ 事象

Robotiumを試そうと既存のプロジェクトに対するテストプロジェクト を作成。

その後、Exampleを元にテストをしようとしたのだけれど

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
とか、警告を受け、動作しない事象に遭遇。

■ 補足

robotiumは簡単かつ強力なブラックボックステストがかけちゃうツール(意訳)
アクティビティをまたいだテストや
スクリーンショットの撮影等、
そこそこ便利な機能が揃っています

■ 対処1

BuildPath上で必要となるlibraryのExport スクリーンショット 13 02 05 10 08
スクリーンショット 13 02 05 10 10 で、動かず。
かなり試行錯誤した挙句
BuildPathのOrder&Exportで順番を何気なく動かしてみる
すると、動いたり、動かなかったりする事象が発生。

■対処2

原点に戻って、libsにrobotiumのjarを設置。
すると動作。
どうやら、libs以外にjarをおいた場合の挙動がすこぶる怪しい。
また、Eclipse上では動作を確認できたけど、IntelliJ IDEA12の ほうでは未だ

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation が発生中。引き続き調査中。

Eclipseの方は

classpathによって
com.android.ide.eclipse.adt.ANDROID_FRAMEWORKという名前の
Android Dependenciesが定義されている(libs内のJarが半自動的にAndroid Dependenciesに含まれていく)

ココらへんの処理をIntelliJでうまく補完できれば、動作するはずなんだけれども…