サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
災害への備え
esmasui.hatenadiary.org
概要 「ART; Android RuntimeになったらMockitoのテスト動かない!」なんてことはないけれども、現状は罠があるという話。詳細はそれぞれの項を参照してください。 引数なしのインターフェイスのメソッドのテストで失敗する NoClassDefFoundErrorが発生してテストがクラッシュする 引数なしのインターフェイスのメソッドのテストで失敗する AndroidのデベロッパーサイトのVerifying App Behavior on the Android Runtime (ART)というページでInvocationHandler.invoke()の挙動が変わった旨の記載があります。 Proxy InvocationHandler.invoke() now receives null if there are no arguments instead of an empt
はじめに こんな感じでGoogle Analyticsのトラッキングを実装できるライブラリつくったよー、という内容。 @SendEvent(category = "HelloWorld", action = "sayHello", label="%1$s") String sayHello (String name) { return format("Hello, %s.", name); } トラッキングのためのコードは本来のコードを分断する AndroidアプリケーションにGoogle Analytics(以下、GA)を使ったトラッキングを実装する機会はしばしば起こる。 トラッキング対象のイベントを実装するメソッドがあったとして、 String sayHello (String name) { return format("Hello, %s.", name); } トラッキングをいれ
IdobataのAndroid版クライアントアプリケーション「Idovatar」をつくりました。 WebViewを貼り付けているだけです。 以下の機能があります。 mentionを受けるとNotificationで通知する 画像・テキストの共有Intentに対応 これらのWebViewから独立した通信には Idobata4J を使っています。 Idobata4Jでの認証はWebViewとHTTPセッションを共有する方式で行っていますので、端末にはユーザー名・パスワードは保存していません。 制限 mentionの監視にはPush通知ではなくWebSocketを使っているので通信圏外にいる間に受けたmentionは取りこぼします。 通信圏内に入ったときに /seed のエンドポイントからmentionsを呼んで取りこぼしを無くす機能を入れていましたが、 Idobata4Jのissue「Unre
概要 targetSdkVersionが19以降の場合はAlarmManagerの set() 及び setRepeating() が厳密ではなくなるという話。 Android 4.4 APIs #BehaviorAlarms | Android Developers When you set your app's targetSdkVersion to "19" or higher, alarms that you create using either set() or setRepeating() will be inexact. 詳細 Android 4.4 APIs #BehaviorAlarms | Android Developersより。 When you set your app's targetSdkVersion to "19" or higher, alarms t
概要 ScalaのプロジェクトをGradleで管理しながらIntelliJで開発したいよ。 でも現行バージョンのJetGradleはScalaに対応していないので、GradleのideaプラグインでIntelliJのプロジェクトファイルを生成します。 環境 ScalaプラグインをインストールしたIntelliJ IDEA 12.1.6 Gradle 1.8 Scala 2.10.3 IntelliJは後にしてGradleでScalaをビルドする IntelliJでの開発を始める前に、GradleでScalaをビルドするところまでやってみましょう。 build.gradle Gradle User GuideのChapter 25. The Scala Pluginに従って、以下のようなbuild.gradleを作ります。 runtimeクラスパスにscala-compilerがないとGra
概要 Macのお話です。 環境変数の値、具体的にいうと$ANDROID_HOMEをIntellij IDEAとかAndroid Studioにわたしたいなー。でもIDEでいちいち定義するのもめんどーだなー 方法 launchctlというコマンドで、GUIアプリケーションに渡す環境変数を指定できます。 ANDROID_HOME に Android Studioのsdkディレクトリを指定する例 $ launchctl setenv ANDROID_HOME '/Applications/Android Studio.app/sdk'
概要 enchantMOONでストロークを操作するシールを作ろうとすると困ることがあります。それはレンダリングされたストロークを取得する手段がないことです。例えば、ページに描いた絵をアニメーションさせたり、範囲選択したストロークをドラッグさせたり、といったことを行うにはラスタライズされたストロークが必要になります。現状、enchantMOONにはそのようなAPIがありません。じゃあつくるか...、できたよ...というお話。 enchantmoonstrokes的なデモ ストロークをアニメーションさせるデモ 画面が赤っぽいのは、ぼくんちの蛍光灯が白熱灯色だからですね。どうでもいいですね。 ストロークをアニメーションさせるデモで使ってるシール 下記リンクからシールダウンロードする シールを適当なページ(ブランクのページがよい)に貼り付ける あまり大きくない、アニメーションさせたい絵を描く 動か
概要 HTML5でenchantMOONのシミュレータのようなもの( enchantMOON/simulator)をつくりました。 主にMOON.getPaperJSON(), setPaperJSON()を利用するシールのデバッグにおいて有用です。また、そのとおりにMOON.setPaperJSON(), MOON.getPaperJSON()が動けばいいやくらいの感じでしか作っていないので、そのくらいの機能しかありません。 ページのレンダリングには、過去エントリ「enchantMOONのストロークをTwitterに投稿するシールを公開しました」で作ったものを使っていますので、レンダリング結果はenchantMOON本体と差異がある場合があります。 動作確認はMac版のChromeでしか行っていないので、それ以外の環境では動作しない可能性があります。 サポートしているMOON.jsの機能
概要 任意のURLをブラウザで開くシールのつくりかたを説明します。 enchantMOONのブラウザにはアドレスバーがないので、特定のURLを開きたいときにやや不便。MOONBlockで「ハイパーリンク」ブロックを使えばできるけども、開きたいURLができるたびにMOONBlockを開くのはちょっと面倒...。とくに、ダウンロードしたいシールを探すときとか...。 そんな時に作っておくと便利なシールの作り方を説明します。 つくりかた 任意のシールをHackしてMOONBlockを開く JavaScriptの「実行」ブロックをシールの「タップされたとき」にドロップする 「実行」ブロックをタップするとプロンプトが開くので、以下のとおり入力する(大文字小文字を区別するので注意) 「Done」をタップしてMOONBlockを終了する 「実行」に入力する内容 MOON.openUrl(window.p
概要 MOONBlockの実装を調べてみよう、みたいな話。MOONBlockの使い方等は一切でてきません。 MOONBlockはenchantMOONにバンドルされたビジュアルプログラミング環境です。enchantMOONで作成したシールはコンテキストメニューの「Hack」を選択することでMOONBlockで編集できます。編集できるということは、シールのデスクリプタである manifest.json、メインプログラムである hack.js の読み書きを何らかの方法で実現しているということです。そこで、MOONBlockがどうやってそれらのファイルを読み書きしているのか調べてみました。 MOONBlockの構成 MOONBlockのプログラム本体は、/App/MOONBlock/main.js です。main.jsは多く分けて四つの要素で構成されています。 ユーザーインターフェイス ビジュア
概要 ページに貼り付けたシールのストロークを変更する方法です。 予備知識 enchantMOONには、ページの情報を取得する以下のAPIが用意されています。 MOON.getCurrentPage MOON.getPaperJSON MOON.setPaperJSON これらのAPIを使うとページに配置されているオブジェクトの読み取りと書き込みが可能です。 MOON.getCurrentPage MOON.getCurrentPageは、シールが貼られているページの情報を返すメソッドです。 実行すると、次のようなJSONオブジェクトが返ってきます。 MOON.getCurrentPage(); {"backing":"_CpZ206t1377673853927","papers":["eKkRhcBN1377787370632"]} backingはページのストロークのID、papersは
概要 enchantMOONがストローク情報(info.json)をどのように描画しているか調べてみましたという話、その1。 過去エントリ「info.jsonのストロークを再現するHTML5アプリつくったよ」、及び「enchantMOONのストロークをTwitterに投稿するシールを公開しました」の描画結果がenchantMOONとずいぶん違う(enchantMOON本体での描画に比べて全体的に線が薄くて細い)ので、結果を近づけるためにという動機。 MOON.setPaperJSON()で任意のストローク情報を設定してenchantMOON本体でのレンダリングを目視する方法で確認していきます。 本エントリのenchantMOONのレンダリング結果の画像は本体で撮影したスクリーンショットで、本体でのレンダリングとは微妙に差異があります(劣化している)が、レンダリングの傾向は損なわれていないた
概要 enchantMOONでTDDする方法を解説します。 以下の効能があります。 PCで編集したファイルをenchantMOONで即実行できる つまり編集するたびにストレージをマウント・アンマウントしなくていい もちろんZipに固めたりアップロードしたり台帳を開いたりしなくてもいい 但し、最終的にプログラムをシールとして実行・配布したい場合は従来通りマウントして書き込むかZipで固めて本体に転送する必要があります。 本エントリは「WEBコンソールでenchantMOONをスクリプティングする」の応用編です。enchantMOONとPCとの通信にはSocket.IOを使います。 QUnit 本エントリでは、テストフレームワークとしてQUnitを使います。 Jasmineじゃないの?と思われるかもしれませんが、最初は簡素なフレームワークを使ったほうが実現しやすかろうというのがQUnitを使っ
概要 localStorageに書き込んだらMOON.finish()などで明示的に終了しないとフラッシュされないというお話。 localStorageって? localStorageはページ単位のデータを保持するためのオブジェクトです。 キーを指定して代入すると書き込み、書き込んだ値は同じキーを指定して取り出せます。 localStorage["hoge"] = "piyo"; var piyo = localStorage["hoge"]; これはenchantMOON独自のオブジェクトではなく、HTML5のStorageに該当するものです。 localStorageへの書き込みがフラッシュされる場合 localStorageに書き込んだ後、MOON.finish()を呼び出すことで、フラッシュされます。 以下のシールをタップすると、タップするたびに0, 1, 2... と表示される数
enchantMOONのストロークをTwitterに投稿するシールを公開しました。 シールのインストール方法は以下のオフィシャルサイトを参照してください。 MOONPhaseがバージョン2.4.0にアップデートされました | enchantMOON News- enchantMOON ; The Hypertext Authoring Tablet ダウンロードURL http://goo.gl/M844qo 内容 シールを貼り付けているページのストロークを enchantmoonstrokesにポストしたあと、ストロークのURLと任意入力のテキストをTwitterに投稿します。 使い方 シールをインストールする Tweetしたいページから台帳を開く インストールしたシールを台帳からノートに貼る 貼ったシールをタップする ダイアログが開くので、Tweetしたい文言を入力する 後の手順のブラ
概要 ブラウザのWEBコンソールでenchantMOONをスクリプティングする方法を説明します。この方法を使えば、WEBコンソールからJavaScriptをタイプしてenchantMOONで実行された結果をダンプできるので、効率的にデバッグが行えるでしょう。 WEBコンソールのスクリーンショット このスクリーンショットは以下のJavaScriptを順に実行したものです。 console.log("Hello, enchantMOON.") importJS(["lib/MOON.js"], function(){}) MOON.getPaperJSON(MOON.getCurrentPage().backing) スクリーンキャストを見ていただければ、WEBコンソールでタイプした内容がリアルタイム(若干のディレイがありますが...)に実行されている様子がわかると思います。 WEBコンソール
概要 enchantMOONのXHR(XMLHttpRequest)は非同期に実行されていないんじゃないか?というお話。 XHRの非同期実行 XHRは通常、UIの動作を妨げないように非同期で実行します。 XMLHttpRequest.open()の第三引数を省略するかtrueを指定することによってHTTPリクエストが非同期に実行されます。 XHRを非同期に実行する例 var xhr = new XMLHttpRequest(); xhr.open("GET", "http://example.com", true); xhr.send(); 以下の非同期動作の確認用コードを実行してみましょう。 接続先のサーバー http://example.com は10秒待ってからレスポンスを返すように構成しているとします。 プログラムは以下の条件でログ出力用のバッファを更新します。 XHRの送信前にバ
概要 enchantMOONのストロークをTwitterにポストする方法をのひとつを説明します。 応用すればTwitter以外のSNSにも投稿できるでしょう。 前提 まず、enchantMOONのストロークをTwitterに投稿する際の前提を見てみましょう。 TwittrはenchantMOONのストローク(info.json)を可視化できない TwitterはenchantMOONのストロークを可視化する方法を知りません。そのため、Twitterのメディア投稿用のエンドポイントである statuses/update_with_media にinfo.jsonをポストすることはできません。従って、このエンドポイントを利用する場合はストロークを画像データとして可視化する必要があります。 enchantMOONはバイナリデータをポストできない 可視化の方法として、ストロークをPNG画像に変換し
enchantMOON MOONのダンプ enchantMOON __moon__のダンプ enchantMOON windowオブジェクトのダンプ enchantMOON window.coreオブジェクトのダンプ enchantMOON window.nsオブジェクトのダンプ enchantMOON window.utilsオブジェクトのダンプ enchantMOON window.__SubEagleCoreManagerのダンプ enchantMOON window._AudioServiceのダンプ enchantMOON XMLHttpRequestのダンプ
info.jsonのストロークを再現するHTML5アプリをつくりました。 リンク先のページを開いて、ブラウザのウィンドウにNote、またはStcikerのinfo.jsonをドラッグしてください。 Note、Stcikerのinfo.jsonは以下のような位置にあります。 マウントしたストレージのDataディレクトリ MyNotebook1 8erZS3bJ1374848367804 info.json (これはダメ) IxLwfpr81374908043324 info.json (これはいい) XxeNARKV1374848367804 info.json (これもいい) 解説 info.jsonの構造は以下のようになっています。(上記プログラムで使っている部分のみ) width ... ストローク全体の幅 height ... ストローク全体の高さ color ... 背景の色 st
enchantMOONでSocket.IOを使ってみました。 そのままでは動かないので、いくつかの修正を加えたもの(enchantMOON/socketio/lib/socket.io.js at master · esmasui/enchantMOON)を使います。 修正点は主に以下の内容です。 enchantMOONはWebSocketsなどをサポートしてないので、'xhr-polling'以外のTransportを削除する (削ったなかにenchantMOONでの動作に支障をきたすコードがあるのか、xhr-pollingを固定で使用するだけでは動作しませんでした) handshake時のサーバーからのレスポンスのtransportに変な文字が追加されてしまうので'xhr-polling'固定にする (*XHRのレスポンスに変な文字が追加されてしまうのはenchantMOONの不具合で
enchantMOONからTwitterに投稿するStickerの作り方。 注意: 固定の文字列を投稿するだけの機能しかありません。 OAuth認証を処理するために以下のライブラリを利用しています。 oauth - API needz authorized? - Google Project Hosting sha1.js oauth.js 手順 1. Stickerのlibディレクトリにsha1.js, oauth.jsをコピーします。 2. importJS()で、sha1.js, oauth.jsをインポートします。 3. stickertapイベントハンドラに以下のようなコードを実装します。'Tweet from enchantMOON!'という固定の文字列を投稿するようになっています。なお、このコードはJavaScript で OAuth 認証を行う方法 - vivid memo
enchantMOONはStickerと呼ばれるウィジェットのようなものを、端末上のMoonBLOCKというビジュアルプログラミング環境で編集できます。 端末上で動くプログラムを端末上でコーディングできちゃうんですよ! でも...なんか動作重い。重くてつらい。なかのひとがんばって。 ところで、Stickerの実体はJavaScriptで、PCにマウントできるストレージ領域にhack.jsという名前で保存されます。 なのでPCにマウントして、このスクリプトを直接編集することもできます。 くわしくはUEIの清水さんのブログを参照してね MOONPhaseの最も簡単なJavaScriptプログラムの書き方 - UEI shi3zの日記 だけど...だけど、マウント、編集、アンマウント、デバッグ、またマウント... ってやってらんねーよ!て感じなので、PCで編集したStickerをそのまま実行した
mockito-allとdexmakerをdepencenciesに追加すると、dex化の段階でjava.lang.IllegalArgumentException: already added: Lorg/hamcrest/BaseDescription;というエラーが発生します。 このエラーは、dexmaker-mockitoのdependenciesであるhamcrest-coreに含まれるクラスがmockito-allにも含まれるため発生します。 dependencies { ... instrumentTestCompile "com.google.dexmaker:dexmaker:${dexmakerVersion}" instrumentTestCompile "com.google.dexmaker:dexmaker-mockito:${dexmakerVersion}"
内部インターフェイスにstatic修飾子つけちゃう奴 内部インターフェイスは暗黙的にstaticになります。 以下のように、static修飾子を明示したNestedStaticInterface、明示しないNestedInterfaceがある場合、コンパイルされたインターフェイスはともにstatic修飾子を伴います。 package com.uphyca.example.interfacedef; public class EnclosingClass { // static修飾子を明示する public static interface NestedStaticInterface { } // static修飾子を明示しない public interface NestedInterface { } } コンパイルされたNestedStaticInterface public abstra
Android Studio 0.1.3へようこそ。 これらのtipsを読むことで、IDEの主な機能にすぐに精通できます。 スクリーンにtipsのダイアログが開いておいて、tipsで説明している機能を試してみましょう。 メインメニューの Help | Tip of the Day を使えば、いつでもtipsを表示できます。 Welcome to Android Studio 0.1.3 You can quickly get familiar with the main features of the IDE by reading these tips. You may try out the features described in the tips while this dialog stays open on the screen. If you close the dialog,
Volleyのネットワーク設定を変更する方法です。 Volleyのネットワーク設定の変更は、Volley.newRequestQueue(...)でRequestQueueを生成する際に行えます。 newRequestQueue(...)はContextを引数に取るものと、Context,HttpStackを引数にとるオーバーロードの二つがあります。 後者のオーバーロードに任意に設定したHttpStackを渡すことでネットワーク設定を変更します。 HttpStackには標準で二つの実装があります。 HttpURLConnectionを使った実装であるHurlStack Apache Http Clientを使った実装であるHttpClientStack これらの実装は、Contextだけを引数にとるnewRequestQueue(Context)でAPIレベルによって使い分けられています。
ADTからAndroidStudioにプロジェクトを移行するには、Exportコマンドを使うと簡単にAndroidStudio用のgradle.buildを生成できます。 ですが、現行バージョンでは何故かdependenciesが空になってしまうので手作業で追加する必要があります。 Exportの手順は以下のとおりです。 プロジェクトを選択 Export... > Android > Generate Gradle build files なぜか選択したプロジェクトが選択されていないので、選択 Finish プロジェクトのルートディレクトリにbuild.gradleが生成されます。 でも何故かdependenciesが空... 生成されたbuild.gralde buildscript { repositories { mavenCentral() } dependencies { cla
Eclipseでよく使うショートカットの、Android Studioでのキーマップを調べました。 EclipseのキーマップはEmacsの場合ですが、たぶんDefaultでも変わりません。 Android StudioのキーマップはMac OS X 10.5+の場合です。 記事中のコマンド名はEclipseに準拠しています。 メタキーの見方 ⌃ control ⌘ command ⌥ option/alt ↩ return/enter ⇧ shift Quick Outline クラスのアウトラインを表示してジャンプするコマンドです。 Eclipse Android Studio ⌘O ⌘F12 Quick Type Hierarchy(クラスがコンテキストの場合) クラスの階層を表示してジャンプするコマンドです。 Eclipse Android Studio ⌘T ⌃H Quick T
次のページ
このページを最初にブックマークしてみませんか?
『esmasui.hatenadiary.org』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く