約 5,388,265 件
https://w.atwiki.jp/api_programming/pages/133.html
http //developer.garmin.com/connect-iq/programmers-guide/resource-compiler/ 下位ページ Content Resource Compiler The Resource Module (a.k.a. Rez)フォルダ階層構造 Referencing Resources Within Resource Files Bitmaps Fonts App Settingsアプリ設定を定義するプロパティ(Properties) 設定(Settings) App Setting Valuesへのアクセス Garmin Connect Mobile/Garmin Express での値変更 App Settingsをテストする リソースのオーバーライド Resource Compiler The resource compiler compiles images, text, and static data into a resource database that the application can access at run time. The resource compiler is tied into the Monkey C compiler. Its input is an XML file resources bitmap id="bitmap_id" filename="path/for/image" / font id="font_id" filename="path/to/fnt" / string id="string_id" Hello World! /string /resources Eclipse のプラグインがリソースファイルを認識するために、パスは "resource" 名前のフォルダに入れる必要がある。 The Resource Module (a.k.a. Rez) リソースコンパイラは Rez というMonkey C モジュールを自動生成する。このモジュール内の ID でリソースの参照を行う。 module Rez { module Drawables { var bitmap_id = 123; } module Strings { var hello_id = 456; } module Fonts { var font_id = 789; } } ランライム中で、 Rez クラスを参照する。例えば、使用したいビットマップ画像があるとして、これを使用する際には、リソースファイルから読み込みを行わなければならない。 image = Ui.loadResource( Rez.Drawables.id_monkey ); dc.drawBitmap( 50, 50, image ); リソースは、他の Monkey C オブジェクトのようなものとして参照される。リソースの読み込みは拡張機能のようなもので、画面更新時にリソースを読み込むわけではない。 フォルダ階層構造 Referencing Resources Within Resource Files リソースは他のリソースファイルから参照させることもできる。その場合は @ module . id . と指定する。例えば、下記のように string リソースを menu リソースの定義で使うことができる。 string id="menu_item_1_label" Item 1 /string menu id="MainMenu" menu-item id="item_1" @Strings.menu_item_1_label /menu-item /menu 上記のコードは menu_item_1_label を メニューアイテムのラベルとして定義している。 Bitmaps Garmin devices have different form factors, screen sizes, and screen technologies, so bitmaps need to be explicitly converted for every device. The resource compiler will generate resources for every intended product, which allows the developer to have one set of resources for black and white products, one set for color products, one for larger screen sizes, etc. リソースコンパイラがサポートしているファイル形式は以下のとおり。 JPG/JPEG BMP/WBMP GIF PNG While each device has a unique palette, the developer can specify a palette to use for an image. The resource compiler will map the colors that are defined in the developer’s palette to the closest match in the device palette and use only those colors. A palette can be defined using the following syntax resources bitmap id="bitmap_id" filename="path/for/image" palette disableTransparency="false" color FF0000 /color color FFFFFF /color color 0000FF /color /palette /bitmap /resources The table below shows all of the valid attributes for a bitmap definition. Attribute Definition Valid Values 既定値 Notes id The handle for the layout, which is used to reference the layout in the Rez module 文字列(文字で始まること) - 必須 filename イメージファイルへの相対パス (有効なパスへのファイルパス) - 必須 dithering 画像のコンパイル時のディザリング floyd_steinberg or none floyd_steinberg The valid attributes for a palette definition are in the table below. Attribute Definition Valid Values Default Value Notes disableTransparency Should the compiler allow transparent pixels in the image? Disabling transparency may save memory true or false false Fonts The resource compiler supports fonts from the BMFont tool (download it at http //www.angelcode.com/products/bmfont/). Use the BMFont tool to convert a font from many formats into BMFont format. The resource compiler reads fonts in TXT or PNG format. Currently only 1-bit color fonts are supported, so the color can be set using dc.setColor(). The BMFont Export Options The BMFont Export Options 大きなビットマップフォントはメモリを大量消費する。時に、ある種の glyphs は watch face の数字のように、大きなサイズが必要になる。このようなときに filter 属性を使用し、特定の glyphs を読みこむようにする。 !-- Only include digits from this large font -- font id="font_id" file="big_font.fnt" filter="0123456789 "/ !-- 数字 と だけ読み込む -- App Settings "app settings framework" にて、アプリ開発者がエンドユーザーに Garmin Connect Mobile and Garmin Express を通じてオプションを与えることができる。これにより、アプリのカスタマイズやセットアップができる。これは、特に watch faces や data field など、ユーザー入力を受け付けないアプリでは有効な手段となる。 アプリ設定を定義する アプリの設定はプロパティと関連する設定で構成される。 プロパティは基本の値を格納するのに使われ、設定はどのようにプロパティがエンドユーザーに示されるかを記述するために使われる。 プロパティにはデフォルト値を設定し、関連した設定は定義しないが、 and not define an associated setting but you cannot define a setting without tying it to a property. プロパティ(Properties) プロパティ(Properties)は一つのリソースであり、リソースファイル内で定義される。よって、他のリソー不ファイルのように、オーバーライドすることもできる。 定義には property タグを使用する。 properties property id="appVersion" type="string" 1.0.3 /property property id="myString" type="number" 0 /property property id="myNumber" type="number" 500 /property property id="screenSleep" type="boolean" true /property property id="username" type="string" /property /properties 上記のように、 property タグは2つの属性をサポートする。 id 必須値のセットに用いるID 文字で始まる文字列 type 必須セットされる値の定義。文字列の値は、他のIDと被らない文字列か、文字列リソースへの参照 string, number, float or boolean 設定(Settings) 設定(Settings) もまたリソースで定義する。 setting タグを用いる。 settings setting propertyKey="@Properties.appVersion" title="@Strings.AppVersionTitle" settingConfig type="alphaNumeric" readonly="true" / /setting setting propertyKey="@Properties.myString" title="@Strings.MyStringTitle" prompt="@Strings.MyStringPrompt" settingConfig type="list" listEntry value="0" @Strings.HelloWorld /listEntry listEntry value="1" @Strings.Ackbar /listEntry listEntry value="2" @Strings.Garmin /listEntry /settingConfig /setting setting propertyKey="@Properties.myNumber" title="@Strings.MyNumberTitle" prompt="@Strings.MyNumberPrompt" settingConfig type="numeric" errorMessage="@Strings.MyNumberError" / /setting setting propertyKey="@Properties.screenSleep" title="@Strings.ScreenSleepTitle" settingConfig type="boolean" / /setting setting propertyKey="@Properties.username" title="@Strings.UsernameTitle" settingConfig type="alphaNumeric" required="true" / /setting /settings 以下に、設定にて有効な属性を示す。 propertyKey 必須 プロパティのキー。見つからないとコンパイラでエラーがスローされる。 title 必須Garmin Connect Mobile/Garmin Express に表示するタイトル when displaying hte list of settings/value of the setting. This must reference a string resource ID. Required prompt 任意 値の設定時に表示されるメッセージ Some settings will not display a prompt even if it’s provided (for example, readonly or boolean settings displayed as an on/off switch). helpUrl 任意 ユーザにヘルプを示すWebページヘのURL settingConfig タグは setting の要素であり、設定の追加詳細を与える。有効な属性は以下のとおり。 type The display type of the setting.list, boolean, numeric, alphaNumeric, phone, email, url, date or password listの場合は、 listEntry タグでリストの内容をセットする。 readonly 設定が読み取り専用かどうか。list, password では使えないtrue or false。デフォルトは false Optional required If the field is required. true or false Optional. Defaults to false. min The minimum value to allow.整数値。数字か日付のみ有効 max The maximum value to allow.整数値。数字か日付のみ有効 maxLength 最大長さ。整数ち文字列にのみ有効 errorMessage An error message to display if the value a user enters isn’t valid based on the type, min, max and maxLength values. A reference to a string resource. settingConfig は 以下の property 型にのみ有効である。 Property Type Valid settingsConfig Types Notes stringalphaNumeric phone email url password numberlist numeric date floatnumeric booleanboolean listEntry 要素は以下のとおりに定義される。これらの値は文字列リソースへの参照として定義する。 Attribute Value Notes value ユーザに選択された時に格納する値 The type of the value should match the property it’s being saved to. もし一致しなかった場合、complile time error がすろーされる。 App Setting Valuesへのアクセス アプリのプロパティへは Object Store へのアクセスと同様に行われる。プロパティへの値保存(プロパティからの値取り出し)は var mySetting = Application.getApp().getProperty("mySetting"); Application.getApp().setProperty("mySetting", mySetting); Garmin Connect Mobile/Garmin Express での値変更 エンドユーザはthe Garmin Connect Mobile or Garmin Express UIに定義した値をみることができる。もし、アプリの実行中に値が変更されたら、 AppBase.onSettingsChanged() 関数が呼ばれるので、ここに処理をオーバーライドしておく。 App Settingsをテストする App settings editor tool は Eclipse plug-in で使用可能。このツールで Eclipseのプロジェクトに対して、定義した設定をみたり、値を選択したり、これらの値をシミュレータに渡すことができる。 リソースのオーバーライド qualifiers を用いて、リソースをオーバーライドすることができる。同じIDを持っていながら、特定の qualifier を持つリソースで置き換える、という処理がされる。Resource qualifiers はベースのリソースフォルダに適用され、そのフォルダ内で見つかった全てのリソースに適用される。qualifier は、有効な qualifier の値に - (ハイフン)をつけたリソースフォルダで設定する。複数のqualifier を一つのフォルダに適用することもできるが、- で区切られ、下記にあるような順序で与えられなければならない。 All qualifiers are case insensitive. Qualifier Type Qualifier Values Examples Description Device A device code. Resources included in a folder with a device qualifier will override the resources with the same ID that are defined in the base resource folder when building for that specific device.例:square_watch or fr920xt Language and Region ISO 639–2 language code followed by an optional ISO 3166–1 3-letter country code. To include a region code, append it after the language code with an underscore (_) separating the two. リージョン(region)は言語と切り離し単独で用いる、ということはできない。このqualifiersは文字列リソースにのみ適用可能。fre, fre_FRA, and fre_CAN
https://w.atwiki.jp/aias-closurecompiler/pages/16.html
トップページ Closure Compiler Application Closure Compiler ApplicationはJavaで実装されたコマンドラインアプリケーションとしてClosure Compilerの機能を提供します。他の提供形式と比べ、Closure Compiler Applicationは以下の点で優れています: 外部サーバとの通信を一切行わず、単独で動作します。このため導入に際して外部との通信経路を考慮しなくてよく、また入力ファイルをWEBに公開する必要もありません。 入力データサイズの制限はありません。 細かいオプションが提供されており、Closure Compilerのもつ機能を最大限に利用することができます。 ある程度以上の規模のシステムでは、Closure Compiler Applicationの導入をお薦めします。 Closure Compiler Service APIのリファレンスは、こちらを参照してください。 このページは公式サイトのこちらを元に作成しました。 目次 インストール 使い方 Antタスクを利用する サンプルビルドファイル リファレンス インストール Closure Compiler Applicationの実行にはJavaの実行環境( JRE6 以上)が必要です。まだインストールされていない場合は、事前にその作業を行ってください。 下記のURLから compiler.jar をダウンロードし、任意のディレクトリに保存、展開します。これでインストールは完了です。 http //closure-compiler.googlecode.com/files/compiler-latest.zip ここから、Closure Compiler Applicationの過去のバージョンをダウンロードできます。 使い方 Closure Compiler Applicationは普通のJavaアプリケーションですので、実行方法自体は至ってシンプルです。以下ではごく短いサンプルコードを使ってコンパイルの手順を説明します。 以下のJavaScriptコードを内容とする hello.js というファイルを作成し、 compiler.jar と同じディレクトリ(ここでは closure-compiler ディレクトリとします)に保存します。 // A simple function. function hello(longName) { alert( Hello, + longName); } hello( New User ); closure-compiler ディレクトリで以下のコマンドを実行します。 java -jar compiler.jar --js hello.js --js_output_file hello-compiled.js このコマンドは hello-compiled.js という名前の新しいファイルを生成します。このファイルの中身は圧縮されたJavaScriptコードです。 function hello(a){alert("Hello, "+a)}hello("New User"); コマンドのオプションでコンパイルレベルを明示的に指定していないため、この例ではデフォルトのコンパイルレベルである SIMPLE_OPTIMIZATIONS が適用されています。 SIMPLE_OPTIMIZATIONS レベルでは、全てのコメント・改行・不要な空白が削除されるほか、ローカル変数が短くリネームされます。上の結果を見ると、実際に元のコードでは longName という名前だった変数が a に変わっているのがわかります。 下のように hello-compiled.js をHTMLに読み込んでみれば、コンパイルされたJavaScriptコードが正常に動作していることが確認できます。このHTMLファイルをブラウザにロードすると挨拶メッセージが表示されるはずです: html head title Hello World /title /head body script src="hello-compiled.js" /script /body /html Antタスクを利用する compiler.jar には組み込みのAntタスクが含まれています。残念ながら使える機能はそれほど多くありませんが、とても簡単に利用できます。 この部分は公式サイトのこちらを元に作成しました。 Antそのものの説明は公式サイトやWeb上の情報を参照してください。 サンプルビルドファイル ?xml version="1.0"? project basedir="." default="compile" taskdef name="jscomp" classname="com.google.javascript.jscomp.ant.CompileTask" classpath="../build/compiler.jar"/ target name="compile" jscomp compilationLevel="simple" warning="verbose" debug="false" output="output/file.js" externs dir="${basedir}/src" file name="extern.js"/ /externs sources dir="${basedir}/src" file name="simple1.js"/ file name="simple2.js"/ /sources sources dir="${basedir}/other" file name="simple3.js"/ /sources /jscomp /target /project リファレンス 属性 名前 説明 compilationlevel --compilation_levelオプションに相当し、コンパイルレベルを whitespace 、 simple 、 advanced のいずれかで指定します。デフォルトは simple です。 customexternsonly --use_only_custom_externsオプションに相当し、 true を指定するとデフォルトのexternファイルを使用しません。デフォルトは false です。 debug --debugオプションに相当し、 true を指定するとデバッグ用の出力を行ないます。デフォルトは false です。 output --js_output_fileオプションに相当し、コンパイル結果の出力ファイル名を指定します。 warning --warning_levelオプションに相当し、エラーと警告の出力量を quiet 、 default 、 verbose のいずれかで指定します。デフォルトは default です。 ネストできる要素このタスクには次の2つの要素をネストさせることができます。これらはFileList型の要素で、Compilerに渡されるファイルのリストを表します。 名前 説明 externs コンパイルに使用するexternファイルを指定します。 sources コンパイル対象となるJavaScriptファイルを指定します。 externs と sources は共に複数指定可能です。
https://w.atwiki.jp/aias-closurecompiler/pages/15.html
トップページ Closure Compiler Service API Closure Compiler Service APIはClosure Compilerの機能をWeb-APIとして提供します。この方式ではユーザプログラムは直接APIサーバとHTTP-POST通信を行い、処理結果を受け取れるようになります。 Closure Compiler Service UIは短いコードを使ってCompilerを試してみる分にはとても良いアプリケーションです。しかしあなたがJavaScriptのコンパイルプロセスを自動化したいと考えていたり、あるいはコンパイル処理を(IDEの拡張機能のようなかたちで)ビルドプロセスの一部として組み込みたいと考えているのであれば、Closure Compiler Service APIの利用は検討する価値があります。 以下では簡単なアプリケーションを作成しながら、何段階かに分けてAPIの使い方を説明します。 Closure Compiler Service APIのリファレンスは、こちらを参照してください。 このページは公式サイトの以下のページを元に作成しました。http //code.google.com/closure/compiler/docs/gettingstarted_api.htmlhttp //code.google.com/closure/compiler/docs/api-tutorial1.htmlhttp //code.google.com/closure/compiler/docs/api-tutorial2.html 目次 APIサーバのURL 最も単純なサンプルアプリケーション APIとの通信 JavaScriptファイルをAPIに渡すには データサイズの制限 APIサーバのURL Closure Compiler Service APIへのリクエストは、下記のURLへ送信してください。 http //closure-compiler.appspot.com/compile 最も単純なサンプルアプリケーション 手はじめに、formを使ってAPIサーバへリクエストを送るアプリケーションを作成してみます。Closure Compiler Service APIをformから呼出すのは実際の利用方法としてはやや不自然ですが、HTTP-POSTによる通信の様子を確認するにはこのやり方が最も簡単です。 下のHTMLをコピーペーストして closure_compiler_test.html というファイルを作成してください。 html body form action="http //closure-compiler.appspot.com/compile" method="POST" p Type JavaScript code to optimize here /p textarea name="js_code" cols="50" rows="5" function hello(name) { // Greets the user alert( Hello, + name); } hello( New user ); /textarea input type="hidden" name="compilation_level" value="WHITESPACE_ONLY" input type="hidden" name="output_format" value="text" input type="hidden" name="output_info" value="compiled_code" br br input type="submit" value="Optimize" /form /body /html 上のformでは4つの必須パラメータが設定されています。(各パラメータの詳細はこちらを参照してください)中でも重要なのは次の2つです。 js_code 処理対象となるJavaScriptコードを指定します。このようにコード文字列を直接送信する方法の他に、JSファイルのURLから入力コードを指定することもできます。後者についてはこちらで詳しく説明します。 compilation_level コンパイルレベルを指定します。この例では最も圧縮率の低い WHITESPACE_ONLY が設定されていますが、より強力にコードの短縮を行いたいのであれば、 SIMPLE_OPTIMIZATIONS や ADVANCED_OPTIMIZATIONS を試してみてください。 closure_compiler_test.html をブラウザで開きます。 Optimize ボタンをクリックしコードをClosure Compiler Service APIへ送ると、下のようなコードがAPIサーバから返却されてくるはずです。返却されるコードはオリジナルコードからコメントと空白・改行を削除したもので、機能はオリジナルと同じですがサイズはかなり小さくなっています: function hello(name){alert("Hello, "+name)}hello(){"New user"}; APIとの通信 次に、プログラムが直にHTTP通信を行うサンプルプログラムを示します: 以下のサンプルはPythonで記述されています。ただし構造自体はごく単純ですので、理解するのにPythonの言語的な知識は特に必要ありません。 #!/usr/bin/python2.4 import httplib, urllib, sys # Define the parameters for the POST request and encode them in # a URL-safe format. params = urllib.urlencode([ ( js_code , sys.argv[1]), ( compilation_level , WHITESPACE_ONLY ), ( output_format , text ), ( output_info , compiled_code ), ]) # Always use the following value for the Content-type header. headers = { "Content-type" "application/x-www-form-urlencoded" } conn = httplib.HTTPConnection( closure-compiler.appspot.com ) conn.request( POST , /compile , params, headers) response = conn.getresponse() data = response.read() print data conn.close このスクリプトはコマンドライン引数として渡されたJavaScriptをコンパイルし、処理されたコードを出力します。上のコードをコピーペーストして compile.py というファイル名で保存、ファイルのパーミッションを変更して実行権限を付与した後、以下のコマンドを実行してください。 $ python compile.py alert("hello");// This comment should be stripped 注意: Windows環境でこのプログラムを実行するには、Pythonのインストールが必要です。詳細はこちらを参照してください。 コマンドはAPIから返却されたコンパイル済みコードを出力します。このサンプルでは WHITESPACE_ONLY レベルが設定されているので、Compilerはコメントを取り除く以外は何もしません。 alert("hello"); このスクリプトについて、注意すべき点をいくつか挙げておきます。 HTTPConnection オブジェクトの request メソッドに渡されるパラメータは、 urllib.urlencode によって事前に全てURLエンコードされています。変数 params の値は次のような文字列です: js_code=alert%28%22hello%22%29%3B%2F%2F+This+comment+should+be+stripped output_info=compiled_code out=text compilation_level=WHITESPACE_ONLY リクエストの Content-type ヘッダは常に application/x-www-form-urlencoded でなければなりません。 JavaScriptファイルをAPIに渡すには 上の例ではコマンドライン引数としてJavaScript文字列をプログラムに渡していました。しかし実業務で使われるJavaScriptコード(その長さは2、3行などすぐに超えてしまうでしょう)を扱うには、この方式はやや無理が有るように思われます。このようなケースでは、 code_url パラメータを使って処理したいJavaScriptファイルのURLを指定するのがよいでしょう。 例として、次のJavaScriptプログラムを取り上げます: /** * A simple script for adding a list of notes to a page. The list diplays * the text of each note under its title. */ /** * Creates the DOM structure for a note and adds it to the document. */ function makeNoteDom(noteTitle, noteContent, noteContainer) { // Create DOM structure to represent the note. var headerElement = document.createElement( div ); var headerText = document.createTextNode(noteTitle); headerElement.appendChild(headerText); var contentElement = document.createElement( div ); var contentText = document.createTextNode(noteContent); contentElement.appendChild(contentText); var newNote = document.createElement( div ); newNote.appendChild(headerElement); newNote.appendChild(contentElement); // Add the note s DOM structure to the document. noteContainer.appendChild(newNote); } /** * Iterates over a list of note data objects and creates a DOM */ function makeNotes(data, noteContainer) { for (var i = 0; i data.length; i++) { makeNoteDom(data[i].title, data[i].content, noteContainer); } } function main() { var noteData = [ {title Note 1 , content Content of Note 1 }, {title Note 2 , content Content of Note 2 }]; var noteListElement = document.getElementById( notes ); makeNotes(noteData, noteListElement); } main(); このプログラムをひとかたまりの大きな文字列としてAPIに渡すより、ファイル名を指定するだけの方が便利です。それには以下のようにします: 上のコードをファイルに保存します。 そのファイルをWEBからアクセス可能な場所(あなたのWebサーバなど)に置きます。 APIとの通信で作ったデモを修正し、 js_code を code_url に置き換えます。 params = urllib.urlencode([ ( code_url , sys.argv[1]), # --- This parameter has a new name! ( compilation_level , WHITESPACE_ONLY ), ( output_format , text ), ( output_info , compiled_code ), ]) 以下のコマンドを実行すると、 http //example.com/yourJs.js というURLがClosure Compilerに渡されます。Compilerは指定されたURLからファイルを取得してコンパイルし、その結果を返却します。 $ python compile.py http //example.com/yourJs.js 1つのリクエストの中に複数の code_url パラメータを含めることができます: params = urllib.urlencode([ ( code_url , http //example.com/yourJsPart1.js), ( code_url , http //example.com/yourJsPart2.js), ( compilation_level , WHITESPACE_ONLY ), ( output_format , text ), ( output_info , compiled_code ), ]) ファイルは指定順に結合されてから、1つのコードとしてコンパイルされます。尚、 code_url と js_code も1つのリクエスト内で同時に使用できます。 データサイズの制限 Closure Compiler Service APIに送信できるデータのサイズには、以下の2種類の制限が設けられています。 POSTデータのサイズの合計は200,000バイトまで クライアントがAPIに送信するPOSTデータのサイズは200,000バイト以内でなければなりません。この制限を超過した場合はサーバエラー 8 POST data too large. が返却されます。もし js_code パラメータで送信しているソースコードの量が多い場合は、ファイルに分離した上でそれを code_url パラメータで参照するようにしてください。 コードの総量は1,024,000バイトまで APIが1回のリクエストで処理できるコードの総量は1,024,000バイトとされています。ここでいうコードの総量とは、 code_url 及び externs_url に指定された全てのファイル内のコード、 js_code 及び js_externs に指定された全てのコード文字列の合計を指します。 この制限を超過した場合はサーバエラー 9 File too large. が返却されます。 このエラーが発生する場合は、ローカルマシン上でのClosure Compiler Applicationの使用を検討してください。
https://w.atwiki.jp/aias-closurecompiler/pages/14.html
トップページ Closure Compiler Service UI Closure Compiler Service UIはClosure Compilerの機能をブラウザベースのWebアプリケーションとして提供します。短いコードをClosure Compiler Service UIに投入してその結果を確認してみることは、Compilerの動作を理解するのには最適の方法といえるでしょう。 このページは公式サイトのこちらを元に作成しました。 目次 使い方 JavaScriptファイルをコンパイルする コンパイル結果をファイルとして取得する コード入力欄先頭のコメントについて データサイズの制限 オプションリファレンス Add a URL Optimization Formatting 使い方 ブラウザで下のURLにアクセスします。 http //closure-compiler.appspot.com/ Closure Compiler Service UIの画面が表示されます。左下のコード入力欄には、シンプルな Hello World 関数が予めサンプルとして入力されています。通常はここにユーザのコードが上書きされることになります。 そのまま Compile ボタンをクリックすると、コンパイルされたコードが出力されます。 以上で、オリジナルの関数と同じ機能をもつ、より小さなJavaScriptコードを手に入れることがきました。コメント・空白の削除とローカルシンボルのリネームによって、Closure Compilerは92バイトあったコードを55バイトにまで小さくしました。 JavaScriptファイルをコンパイルする Closure Compiler UIは1つまたは複数のJavaScriptファイルを入力ソースとしてコンパイルを実行することもできます。ただしそのJavaScriptファイルは外部からHTTPでアクセスできる位置に公開されている必要があります。 Add a URL の右のボックスに指定したいJSファイルのURLを入力します。 サンプルとして以下のファイルが用意されています。 http //code.google.com/closure/compiler/samples/tutorial2.js Add ボタンをクリックします。入力欄の先頭コメントに、指定ファイルを値にもつ @code_url パラメータが追加されます。指定したいファイルが複数ある場合は、1.~2.の手順を必要なだけ繰り返します。同じファイルを2度指定した場合はコンパイル時にエラーとなりますので注意してください。 複数指定されたファイルは指定順に結合された後にコンパイルされます。またファイル指定と入力欄へのコード入力を同時に行った場合は、結合されたファイル内コードの後ろに入力コードが結合され、その後コンパイルが実行されます。 コンパイル結果をファイルとして取得する より使いやすいように、Closure Compiler Service UIはコンパイル結果をJSファイルとして1時間の間サーバ上に保持しています。このファイルにアクセスするには、コード出力欄の上にあるリンクのURLをコピーしてください。(The code may also be accessed at {filename}と表示されているところです)デフォルトの出力ファイル名は default.js ですが、入力欄の先頭部分にある @output_file_name パラメータの値を直接編集することで変更可能です。1時間の間に入力コードが変更されて再度コンパイルが行われた場合、Closure Compilerはサーバ上のファイルを新しい結果で上書きします。 アプリケーションのテスト環境からコンパイル結果へ直接リンクすることで、手軽にコードの動作チェックを行えるようになります。しかし決してこの機能を本番環境で使用しないでください。 注意: 過大な負荷を避けるため、あるユーザが一定時間内で連続してClosure Compiler Service UIを利用できる回数には制限が設けられています。もし以下のようなメッセージが表示された場合は、あなたがその制限を一時的にオーバーしてしまったことを示しています: Too many compiles performed recently. Try again later コード入力欄先頭のコメントについて コード入力欄の先頭にある「 // ==ClosureCompiler 」から始まる一連のコメントは、コンパイル時にコードと共にサーバに送信されるパラメータを表しています。この値は画面上のオプション設定変更に伴って即座に変更されていきますが、逆にこのコメントを直接書き換えて設定を変更することもできます。このときコメントと画面の設定が矛盾する可能性がありますが、コメント上の指定の方が優先されるようです。 コードのコピーペーストなどでこのコメントが一時的に消えてしまっても、送信時に自動的に再作成されます。ただし出力ファイル名( @output_file_name )の変更や入力ファイルの指定( @output_file_name )は復活しませんので注意してください。 データサイズの制限 Closure Compiler Service UIからサーバに送信できるデータのサイズは最大200,000バイトに制限されています。ここでいうデータには、入力欄に記述されたコードとアプリケーションが作成する各種のコンパイルパラメータが含まれます。データサイズが制限を超過している場合、コンパイル処理は失敗します。 入力コードのうち、サイズ制限の対象となるのは入力欄に直接記入された分のみです。従ってコードのサイズが大きすぎる場合はJavaScriptファイルをコンパイルするで示されている手順に従ってコードをJSファイルとして指定するようにしてください。(なお、コンパイルパラメータのサイズは全部合わせてもせいぜい100バイト程度です) オプションリファレンス Add a URL 入力ファイルのURLを指定します。詳しくはこちらを参照してください。 Optimization コードのコンパイルレベルを指定します。 Formatting 出力されるコンパイル済みJavaScriptコードの整形方式を指定します。 Pretty print チェックが付いている場合、Closure Compilerは人間が読み易くなるよう出力コードに改行とインデントを付加します。以下にその例を示します: function hello(a) { alert("Hello, " + a) } hello("New user"); Pretty print がチェックされていない場合は次のようになります。 function hello(a){alert("Hello, "+a)}hello("New user"); Print input delimiter チェックが付いている場合、Closure Compilerは各入力ファイルと入力欄に設定されたJavaScriptコードの範囲を示す文字列を出力コード内に付加します。例えば2つのファイルを一緒にコンパイルした場合、出力は次のようになります: // Input 0 alert("hi"); // Input 1 alert("bye"); ファイル間の境界を表す区切り文字としてClosure Compilerは「 // Input X 」を挿入します。これらの区切り文字はコメントであり、JavaScriptの動作を妨げない点に注意してください。 入力ファイルの区切りには、例えば各ファイルのうちコードサイズの圧縮に最も貢献しているものの把握を助けるというような用途が考えられます。
https://w.atwiki.jp/aias-closurecompiler/pages/24.html
トップページ Closure Compiler Service API Closure Compiler Service API リファレンス このページでは、Closure Comiler Service APIのインターフェース仕様について詳細に説明します。APIの使用方法についてはこちらを参照してください。 コンパイルされたコードやAPIからの様々な情報を取得するためには、HTTP POSTリクエストを下記のURLに送る必要があります。 http //closure-compiler.appspot.com/compile リクエストボディは「必須リクエストパラメータ」に列挙されたパラメータを必ず含んでいなければなりません。また「省略可能なリクエストパラメータ」に列挙されたパラメータを含めることもできます。 もしサーバがリクエストの処理に失敗した場合には、サーバエラーメッセージが返却されます。それらのメッセージについては「サーバエラーメッセージ」で説明されています。 このページは公式サイトのこちらを元に作成しました。 目次 必須リクエストパラメータ js_code code_url compilation_level output_format output_info 省略可能なリクエストパラメータ js_externs externs_url exclude_default_externs output_file_name formatting use_closure_library warning_level サーバエラーメッセージ 必須リクエストパラメータ js_code コンパイルするJavaScriptコードをパラメータの値として直接指定します。リクエストにはこのパラメータかcode_urlパラメータを少なくとも1つ以上含んでいなければなりません。両方指定することも可能です。 js_code パラメータを複数指定することもできます。 code_url コンパイルするJavaScriptコードを内容にもつファイルのURLを指定します。リクエストにはこのパラメータかjs_codeパラメータを少なくとも1つ以上含んでいなければなりません。両方指定することも可能です。複数の入力ファイルを指定するため、リクエストには複数の code_url パラメータを含めることができます。 ファイルのURLはWEBからアクセス可能な場所でなければならない点に注意してください。 code_url パラメータの使用方法については、こちらでも詳しく説明しています。 compilation_level JavaScriptに適用する圧縮と最適化の度合い(コンパイルレベル)を指定します。以下の3つのレベルがあります: WHITESPACE_ONLY JavaScriptから空白・改行とコメントだけを削除します。 SIMPLE_OPTIMIZATIONS 圧縮と最適化を実行しますが、ローカル変数のみをリネームし、コンパイルされたコードとそれ以外のコードとの連携を妨げません。 ADVANCED_OPTIMIZATIONS グローバル領域を含むシンボルのリネームを行い、最高レベルの圧縮度を実現します。 ADVANCED_OPTIMIZATIONS レベルを使用する場合、外部のシンボルとの参照関係を維持するために追加の手順が必要となる可能性があります。詳しくはこちらを参照してください。 各コンパイルレベルで入力コードに求められるコーディングルールについては、こちらで詳しく説明されています。 output_format Closure Compilerサービスの出力フォーマットを指定します。指定可能なフォーマットは以下の3つです: xml 処理結果をXML形式で返却します。出力されるXMLは以下のような形式になります: compilationResult compiledCode var a="hello";alert(a); /compiledCode statistics originalSize 98 /originalSize compressedSize 35 /compressedSize compileTime 0 /compileTime /statistics /compilationResult compiledCode 要素の内容はClosure Compilerが生成した圧縮済みのJavaScriptコードです。この要素はoutput_infoパラメータの値に compiled_code が指定されたときのみ出力されます。同様に、 statistics 要素は output_info パラメータの値に statistics が指定されたときのみ出力されます。 output_info パラメータの値に warnings が指定されCompilerが警告を生成した場合、出力結果には warning 要素が含まれます: compilationResult ... warnings warning type="JSC_NO_SIDE_EFFECT" file="default.js" lineno="12" charno="3" line="delete 1;" warning 1 /warning warning type="JSC_UNUSED_VAR" file="default.js" lineno="13" charno="13" line="delete 1;" warning 2 /warning /warnings ... /compilationResult output_info パラメータの値に errors が指定され、入力コードが文法エラーやその他コンパイル処理を妨害するような問題を含んでいた場合、Closure Compilerは errors 要素を出力します。 errors 要素は以下のようなものです: compilationResult ... errors error type="JSC_NO_SIDE_EFFECT" file="default.js" lineno="12" charno="3" line="var x=- hello ;" error 1 /error error type="JSC_UNUSED_VAR" file="default.js" lineno="13" charno="13" line="var x=- hello " error 2 /error /errors ... /compilationResult error 要素と warning 要素の file 、 line 、 col 属性はClosure Compilerがそのエラーに遭遇した位置を示しています。 もしClosure Compilerが処理を停止させるようなエラーに見舞われた場合、以下のような出力結果が返却されます。このタイプのエラーは、JavaScriptコードの内容ではなくリクエストそのものに問題があることを示しています。詳しくはこちらを参照してください: compilationResult serverErrors error code="1" Over quota /error /serverErrors /compilationResult json 処理結果をJSON(JavaScript Object Notation)形式の文字列で返却します。この文字列をJavaScriptとして評価すると、1個のJavaScriptオブジェクトが得られます。出力されるJSONデータは以下のような形式です: { "compiledCode" /* raw code here */, "errors" [ {"charno" 4321, "error" "ERROR You failed.", "lineno" 1234, "file" "default.js", "type" "ERROR_TYPE", "line" "var x=- hello ;"} ], "warnings" [ {"charno" 4321, "lineno" 1234, "file" "default.js", "type" "ERROR_TYPE", "warning" "Warning You did something wrong!", "line" "delete 1;"} ], "serverErrors" [ {"code" 123,"error" "Over quota"} ], "statistics" { "originalSize" 10, "compressedSize" 3000, "compileTime" 10 } } JSON形式とXML形式はよく似ています:XMLの各タグはJSONオブジェクト内の同名のプロパティに相当します。 text text フォーマットを指定すると、タグやJSONブラケットを取り除いたシンプルなテキスト形式の出力結果が返却されます。 output_info Compilerから取得するデータの種類を指定します。指定できるのは以下の4種類です: compiled_code 入力されたJavaScriptコードを圧縮・最適化したものです。 warnings JavaScript内のバグの可能性を警告するメッセージです。 errors JavaScript内の文法エラーやその他のエラーを示すメッセージです。 statistics Closure Compilerが行った圧縮処理の達成度に関する情報です。出力形式がXMLの場合、以下のフォーマットの統計情報が返却されます: compilationResult ... statistics firstStatisticName 24 /firstStatisticName secondStatisticName 15 /secondStatisticName /statistics /compilationResult 省略可能なリクエストパラメータ js_externs js_externs パラメータはコンパイルされるコードが使用している外部プログラム内のシンボル名をリネームから保護するために使用します。このパラメータの値にはリネームされたくない関数やその他のシンボルを宣言するJavaScriptコードを指定します。このパラメータが効果をもつのはcompilation_levelパラメータの値が ADVANCED_OPTIMIZATIONS の場合のみです。詳しくは「extern宣言」を参照してください。 externs_url externs_url パラメータはコンパイルされるコードが使用している外部プログラム内のシンボル名をリネームから保護するために使用します。このパラメータにはリネームされたくない関数やその他のシンボルを宣言するJavaScriptコードが記述されたファイルのURLを指定します。ファイル内に宣言されたシンボルはjs_externsパラメータに直接列挙された場合と全く同じ方法で保護されます。このパラメータが効果をもつのはcompilation_levelパラメータの値が ADVANCED_OPTIMIZATIONS の場合のみです。詳しくは「extern宣言」を参照してください。 リクエスト内に複数の externs_url パラメータを定義できます。 exclude_default_externs Closure Compilerは document オブジェクトやそのメソッドのような標準的なシンボルを宣言した定義情報を持っており、デフォルトではそれを使用してシンボル名の保護を行います。もしこれらの標準的なextern宣言を使いたくない場合は、このパラメータにtrueを設定してリクエストに含めてください。デフォルトのextern宣言に関する詳細はこちらを参照してください。 output_file_name このパラメータを指定すると、Closure Compilerはコンパイルされたコードをサーバ上に1時間キャッシュし、特別なURLを通してそれを利用可能にします。ファイルがキャッシュされている間、このURLにアクセスしコンパイルされたコードをテストすることができます。URLは以下のような形式です: http //closure-compiler.appspot.com/code/bf067f356d510e1c7b81347eb84f65d2/[output_file_nameの値] formatting 出力されるコンパイル済みJavaScriptコードの整形方式を指定します。このパラメータは pretty_print または print_input_delimiter のどちらかの値をとりますが、同一のリクエスト内に2つの formatting パラメータを含めれば、これらを同時に指定することが可能です。 pretty_print と print_input_delimiter は整形方法のそれぞれ異なる側面に関する指示であるため、重複しても互いに影響しあうことがありません。 pretty_print リクエストが pretty_print を値にもつ formatting パラメータを含む場合、Closure Compilerは人間が読み易くなるよう出力コードに改行とインデントを付加します。以下にその例を示します: function hello(a) { alert("Hello, " + a) } hello("New user"); pretty_print がない場合は次のようになります。 function hello(a){alert("Hello, "+a)}hello("New user"); print_input_delimiter リクエストが print_input_delimiter を値にもつ formatting パラメータを含む場合、Closure Compilerは各入力ファイルの範囲を示す文字列を出力コード内に付加します。例えば2つのファイルを一緒にコンパイルした場合、出力は次のようになります。 // Input 0 alert("hi"); // Input 1 alert("bye"); ファイル間の境界を表す区切り文字としてClosure Compilerは「 // Input X 」を挿入します。これらの区切り文字はコメントであり、JavaScriptの動作を妨げない点に注意してください。 code_urlパラメータによって与えられた入力ファイルは、出力コード内で各ファイルに対応するセクションに区切られます。一方js_codeパラメータによって与えられた入力コードは、全ての js_code パラメータの値を結合したものが1つのセクションにまとめられます。入力ファイルの区切りには、例えば各ファイルのうちコードサイズの圧縮に最も貢献しているものの把握を助けるというような用途が考えられます。 use_closure_library use_closure_library パラメータを true に設定すると、compilerはソース内の goog.require() を探し出し、そのステートメントが要求しているClosure Libraryのコードを出力に追加します。また、Closure Libraryのコードのために特に設計された最適化を実行します。Closure Libraryに関する詳細はClosure Library documentationを参照してください。 goog.require() 関数に関する詳細はFinding Your Way around the Closure Libraryを参照してください。 use_closure_library パラメータのデフォルト値は false です。 warning_level コード内の問題になりそうな箇所に関する情報の出力量を指定します。 warning_level パラメータはoutput_infoパラメータの値に warning が一緒に指定されている場合のみ有効です。警告レベルには以下の3種類があります: QUIET 現在のコンパイルでのcompilation_levelに基づく最適化パスで生成された文法エラーと警告のみを出力します。 DEFAULT 最適化パスで生成された文法エラーと警告に加え、最終的に選択されたコードチェックパスで生成された警告を出力します。 warning_level パラメータのデフォルト値です。 VERBOSE 最適化パスで生成された文法エラーと警告に加え、実行された全てのコードチェックパスで生成された警告を出力します。 サーバエラーメッセージ サーバがリクエストの処理に失敗した場合、下表に示すサーバエラーメッセージのうちのいずれかが返却されます。これらのエラーはCompilerが生成するエラーや警告とは異なるものである点に注意してください。Compilerが生成するエラーや警告はJavaScript内で見つかった問題を表しますが、サーバエラーのメッセージはリクエストそのもののエラーによりCompilerがコードを全く処理出来ないことを示しています。 コードの内容が原因で発生するエラーと警告については、こちらを参照してください。 エラーコード メッセージ 意味 2 Unknown output mode. output_formatパラメータの値が xml 、 json 、 text 以外です。 4 Unknown compression level. compilation_levelパラメータの値が WHITESPACE_ONLY 、 SIMPLE_OPTIMIZATIONS 、 ADVANCED_OPTIMIZATIONS 以外です。 8 POST data too large. APIに送信されたデータのサイズが200,000バイトを超えています。Closure Compiler Service UIとAPIではサービスとの通信にHTTP-POSTリクエストを使用しますが、その際リクエストデータの合計が200,000バイトを超えてはなりません。APIでは、この制限はリクエストパラメータに設定された全てのテキストの合計サイズに適用されます。UIでは、この制限はソースコードと @code_url のようなコンパイルオプションを合わせたものに適用されます。もしリクエストが大きすぎた場合はソースコードをファイルに分離した上でそれをcode_urlパラメータで参照するようにするか、ローカルマシン上でClosure Compiler Applicationを使用してください。 9 File too large. コードの総量が1,024,000バイトを超えています。コードの総量とは、全てのcode_urlに指定されたファイル、全てのexterns_urlに指定されたファイル、全てのjs_codeとjs_externsに指定されたコードの合計を指します。 10 Cannot retrieve content from URL. このエラーはAPIがcode_urlパラメータで指定されたJavaScriptファイルまたはexterns_urlパラメータで指定されたexternファイルを取得できなかった場合に発生します。URLが正しいか、またファイルの参照を許可するように権限が設定されているかを確認してください。 12 URL is not formed properly. code_urlパラメータまたはexterns_urlパラメータに指定されたURLが不正な形式であることを表します。 13 No output information to produce, yet compilation was requested. output_infoパラメータが指定されていません。 14 Unknown output_info value output_infoパラメータの値が compiled_code 、 warnings 、 statistics 以外です。 16 Unknown warning level warning_levelパラメータの値が QUIET 、 DEFAULT 、 VERBOSE 以外です。 17 Unknown formatting option. formattingパラメータの値が pretty_print 、 print_input_delimiter 以外です。 18 Unknown parameter in HTTP request 定義されていないパラメータが含まれています。 19 Illegal value for output_file_name 出力ファイル名が1文字の数字、文字、ドット、アンダースコア、ダッシュだけからなっているか、または2つの連続したドット(..)を含んでいます。 22 Too many compiles performed recently. Try again later. このマシンから送信されているコンパイルリクエストが多すぎます。コンパイルの実行が可能になるには1時間必要です。 23 Compiler exception (with backtrace) Compilerがクラッシュしました。エラーテキストにはGoogleのデバッグ作業の助けになる情報が含まれています。 24 Unsupported input resource type リソースタイプが「http 」でなかったため、入力ファイルを取得できませんでした。
https://w.atwiki.jp/android-reference/pages/21.html
android Contains the resource classes used by standard Android applications. Classes Manifest Manifest.permission Manifest.permission_group R R.anim R.array R.attr R.bool R.color R.dimen R.drawable R.id R.integer R.layout R.plurals R.raw R.string R.style R.styleable R.xml コメント 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/aias-closurecompiler/pages/20.html
トップページ Compilerが求めるコーディングルール Closure Compilerは自身への入力となるJavaScriptがいくつかのコーディングルールに適合していることを想定しています。そしてユーザが高いレベルの最適化を求めるほど、Compilerは入力されるJavaScriptに対しより多くのルールを課すことになります。このページではそれぞれのコンパイルレベルにおけるルールについて説明します。 このページは公式サイトの以下のページを元に作成しました。http //code.google.com/closure/compiler/docs/limitations.html http //code.google.com/closure/compiler/docs/api-tutorial3.html 目次 全てのコンパイルレベルに適用されるルール SIMPLE_OPTIMIZATIONSでのルール ADVANCED_OPTIMIZATIONSでのルール 一貫した方法でプロパティにアクセスする thisはコンストラクタとプロトタイプメソッドだけで使う Compilerが使用箇所を見つけられないコードは削除される アプリケーションは全体を一度にコンパイルする コンパイルされたコードと外部コードの間の参照関係を維持するには 全てのコンパイルレベルに適用されるルール 全てのコンパイルレベルにおいて、Closure Compilerは処理を行うJavaScriptに対し以下の2つのルールを課します。 Compilerは Ecmascript 262 revision 3 だけを正しく認識する Ecmascript revision 3 はJavascript 1.5とJScript 5.5の基礎になっており、"JavaScript"という言葉が使われる場合は通常このバージョンのJavaScriptを意味します。CompilerはJScript独自の言語仕様やJavaScript1.5以降のバージョンのJavaScriptをサポートしません。 ブラウザによる拡張機能は、それがEcmascriptの言語仕様に適合するものであれば、Compilerと共に正常に動作します。例えばActiveXオブジェクトは従来のJavaScriptの構文によって作成されるので、Compilerはそのコードを問題なく扱うことができます。しかし一方、従来のJavaScriptの構文から離れたブラウザ拡張はClosure Compilerのエラーを引き起こします。例えばFirefoxのJavaScriptエンジンは const キーワードをサポートしますが、このキーワードはEcmascriptの言語仕様には含まれていないため、Compilerもそれをサポートしません。この制約により、コードが全ての主要なブラウザで動作するかどうかをチェックするするためにCompilerを利用することもできます。 Compilerはコメントを保存しない 全てのコンパイルレベルにおいてコメントは削除されるため、特殊なフォーマットのコメントに依存しているコードはCompilerのもとでは正常に動作しません。例えば(Compilerがコメントを保存しないために)JScriptの「条件付きコメント」は使用できません。ただしこの制約は条件付きコメントを eval() 式で囲むことで回避できます。Compilerは下のコードをエラーを発生させることなく処理します: x = eval("/*@cc_on 2+@*/ 0"); 注意: @preserve アノテーションを使用して、Compilerの出力結果の先頭にオープンソースライセンスやその他の重要なテキストを含めることができます。詳しくはこちらを参照してください。 SIMPLE_OPTIMIZATIONSでのルール SIMPLE_OPTIMIZATIONS レベルでは、コードサイズを減らすために関数パラメータ、ローカル変数、ローカルで定義された関数の名前を短く変更します。しかしJavaScriptのいくつかの言語構造は、この変更処理を失敗させることがあります。 SIMPLE_OPTIMIZATIONS を適用する場合、以下の言語構造の使用やコードの書き方は避けてください: with with を使用するとCompilerはローカル変数とオブジェクトプロパティを区別できなくなり、プロパティと同名の変数が先に存在した場合はそれに合わせてプロパティ名を変更してしまいます。そもそも with 命令は人間にとってもコードを読みにくいものにします。 with 命令は名前解決のための通常のルールを変更し、名前が参照するものの識別をそのコードを書いたプログラマにすら困難にしてしまうことがあるため、利用すべきではありません。 eval() Compilerは eval() の引数文字列をパースしないので、この引数の中に含まれるいかなる名前も変更されることはありません。このことはリネームされたシンボルとの間で名前の不整合が発生する危険性があることを示しています。 関数やパラメータ名の文字列表現 Compilerは関数と関数パラメータの名前を変更するものの、コードの中でそれらを表す文字列までは変更しません。従って、コード内で関数名やパラメータ名を文字列として表現することは避けるべきです。例えばPrototype.jsライブラリの argumentNames() 関数は関数パラメータの名前を検索するために Function.toString() を使っています。 argumentNames() はコード内で引数名を利用したいと思わせるかもしれませんが、最適化処理の過程でこの種の参照は破壊されてしまいます。 ADVANCED_OPTIMIZATIONSでのルール ADVANCED_OPTIMIZATIONS レベルのコンパイルでは、 SIMPLE_OPTIMIZATIONS と同じ変換処理に加え、プロパティ、変数、関数に対するグローバルスコープでのリネーム、未使用コードの除去、プロパティの平坦化が実行されます。これらの新しい処理は入力されるJavaScriptに対し更に多くの制約を課すことになります。また、 SIMPLE_OPTIMIZATIONS でのルールは ADVANCED_OPTIMIZATIONS にも適用されます。 以下では、 ADVANCED_OPTIMIZATIONS でコンパイルされるコードについて注意すべき点を列挙します。 一貫した方法でプロパティにアクセスする コンパイルレベルに関係なく、Closure Compilerは文字列リテラルを決して変更しません。これは ADVANCED_OPTIMIZATIONS レベルにおいて、プロパティ名を文字列で指定してアクセスしているかどうかによってプロパティの扱い方が違ってくることを意味します。もしプロパティの参照に文字列とドットシンタックスによるものが混在していると、Closure Compilerはそれらの一部だけをリネームします。その結果、おそらくそのコードは正しく動作しなくなるでしょう。 例として以下のコードを取り上げます: function displayNoteTitle(note) { alert(note[ myTitle ]); } var flowerNote = {}; flowerNote.myTitle = Flowers ; alert(flowerNote.myTitle); displayNoteTitle(flowerNote); このソースコードの最後の2つの文は、実際には全く同じことを行っています。 ADVANCED_OPTIMIZATIONS レベルでコードを圧縮するとこうなります: var a={};a.a= Flowers ;alert(a.a);alert(a.myTitle); 圧縮されたコードの最後の文はエラーを引き起こします。 myTitle プロパティへの直接の参照は a にリネームされ、一方 displayNoteTitle() 関数内のクォートされた myTitle による参照はリネームされませんでした。その結果、最後の文では既に存在しない myTitle プロパティが参照されています。 この問題の解決策はとてもシンプルです。可能な限りクォートされた文字列ではなくドットシンタックスによるプロパティ名を使用し、文字列を使うのは Closure Compilerにプロパティ名を変更されたくない場合だけにします。例えばプロパティをエクスポートする際には、文字列が使用される必要があります。しかしそのプロパティがコンパイルされたコードの中だけで使われるなら、ドットシンタックスを使用してください。 もしどうしてもプロパティをクォートされた文字列によって参照する必要があるのであれば、常にその方法を使ってください: function displayNoteTitle(note) { alert(note[ myTitle ]); } var flowerNote = {}; flowerNote[ myTitle ] = Flowers ; alert(flowerNote[ myTitle ]); displayNoteTitle(flowerNote); 変数とグローバルオブジェクトのプロパティの不一致 Compilerはプロパティと変数をそれぞれ独立してリネームするので、それが原因でプロパティ名の不一致が発生する可能性があります。例えばCompilerは下の foo への2つの参照を、それらが実際には同一であっても、別のものとして扱います: var foo = {}; window.foo; // BAD このコードは次のようにコンパイルされます: var a = {}; window.b; もし変数をグローバルオブジェクトのプロパティとして参照したいのであれば、常にその方式で参照してください: window.foo = {}; window.foo; thisはコンストラクタとプロトタイプメソッドだけで使う 名前短縮の前段階として、 ADVANCED_OPTIMIZATIONS レベルのCompilerはオブジェクトプロパティに関するコードを1つにまとめる処理を行います。 var foo = {}; foo.bar = function (a) { alert(a) }; foo.bar("hello"); 例えば上のコードは、次のように変換されます: var foo$bar = function (a) { alert(a) }; foo$bar("hello"); このようなプロパティの平坦化はその後のリネーム処理をより効果的にします。例えば foo$bar はCompilerによって1文字の名前に置き換えられます。 しかしプロパティの平坦化は、関数内の this キーワードの意味を変えてしまうことがあります。 var foo = {}; foo.bar = function (a) { this.bad = a; }; // BAD foo.bar("hello"); 例えば上のコードは、次のように変換されます: var foo$bar = function (a) { this.bad = a; }; foo$bar("hello"); 変換前の foo.bar 内の this は foo を参照していましたが、変換後の this はグローバルの this を参照しています。このようなケースでは、Compilerは下に示す警告を出力します: WARNING - dangerous use of this in static method foo.bar プロパティの平坦化が this の参照を破壊するのを防ぐには、 this をコンストラクタまたはプロトタイプメソッドの中だけで使うようにしてください。コンストラクタを new キーワードを使って呼び出すとき、または this がプロトタイプのプロパティである関数内にあるときには、 this の意味は常に明確であるといえます。 この問題についてはこちらの説明も参照してください。 Compilerが使用箇所を見つけられないコードは削除される もし下の関数だけを ADVANCED_OPTIMIZATIONS でコンパイルした場合、Closure Compilerは空データを出力します: function displayNoteTitle(note) { alert(note[ myTitle ]); } Compilerに渡されたJavaScriptの中で関数が一度も呼び出されていないので、Closure Compilerはこのコードを不要とみなしてしまうのです。この振る舞いは多くのケースで望ましいものです。例えばあなたが自分のコードと大きなライブラリを一緒にコンパイルする場合、Closure Compilerはそのライブラリの中の関数が実際に使用されているかどうかを判断し、使用されていないものを取り除いてくれます。 ある関数(メソッドも)が使用されているとみなされるためには、Compilerが理解できる形式で呼び出しが行われている必要があります。JavaScriptではコンストラクタやそのプロトタイプのプロパティ名を反復処理の中で取得し、メソッドを実行できます。しかしCompilerはこの方法で呼ばれる特定の関数を識別することはできません。例えば次のコードは、意図しないコード削除の原因となります: function Coordinate() {}; Coordinate.prototype.initX = function() { this.x = 0; } Coordinate.prototype.initY = function() { this.y = 0; } var coord = new Coordinate(); for (method in Coordinate.prototype) { Coordinate.prototype[method].call(coord); // BAD } Compilerは for ループの中で initX() や initY() が呼ばれていることが分からず、両方のメソッドを削除します。 関数への参照がパラメータとして渡される場合、Compilerはそのパラメータへの呼び出しを見つけることができます。例えば次のコードが ADVANCED_OPTIMIZATIONS レベルでコンパイルされるとき、Compilerは getHello() 関数を削除しません: function alertF(f) { alert(f()); } function getHello() { return hello ; } // The Compiler figures out that this call to alertF also calls getHello(). alertF(getHello); // This is OK. 残しておきたいコードをClosure Compilerが削除している場合、これを防ぐには2つの方法があります: 関数呼び出しを行っているコードを、Closure Compilerが処理するコードの中へ移動させる 残しておきたいシンボルをエクスポートする 解決策1 関数呼び出しを行っているコードを、Closure Compilerが処理するコードの中へ移動させる もしあなたが自分のコードの一部だけをClosure Compilerでコンパイルした場合、望ましくないコードの削除に遭遇する可能性があります。例えば、関数定義のみを含むライブラリのファイルと、ライブラリをインクルードしその中の関数を呼び出すコードを含むHTMLファイルがあるとします。このとき、もしライブラリファイルだけを ADVANCED_OPTIMIZATIONS でコンパイルすると、Closure Compilerはライブラリ内の関数を全て削除してしまいます。 この問題の最もシンプルな解決策は、関数とそれらを呼び出しているプログラムを一緒にコンパイルすることです。下に示すプログラムをコンパイルしたとき、Closure Compilerは displayNoteTitle() 関数を削除しません: function displayNoteTitle(note) { alert(note[ myTitle ]); } displayNoteTitle({ myTitle Flowers }); このケースでClosure Compilerが displayNoteTitle() 関数を削除しないのは、それがコード内で呼び出されているためです。 言い換えると、Closure Compilerに渡すコード内にそのプログラムの「エントリポイント」を含まれていれば、望ましくないコードの削除を防ぐことができるわけです。プログラムの「エントリポイント」とは、プログラムの実行が開始される場所を指します。例えば前のセクションの"flower note"プログラムであれば最後の3行はJavaScriptがブラウザに読み込まれた直後に実行されるコードですので、ここがこのプログラムのエントリポイントということになります。コードを残すべきかどうかを決定するため、Closure Compilerはエントリポイントを出発点としてプログラムの処理フローのトレースを開始します。 解決策2 残しておきたいシンボルをエクスポートする ではもしあなたが再利用可能なライブラリを作成するため関数定義だけをコンパイルしたいと考えた場合、Closure Compilerによる関数の削除をどうすれば防げるでしょうか? この場合の最善の解決策は、下の例に示すように関数をエクスポートすることです。エクスポートとは、シンボルの参照をグローバルオブジェクトのプロパティにプロパティ名を文字列指定して設定する処理のことです: function displayNoteTitle(note) { alert(note[ myTitle ]); } // Store the function in a global property referenced by a string window[ displayNoteTitle ] = displayNoteTitle; ADVANCED_OPTIMIZATIONS レベルのコンパイルによって圧縮されたコードは、次のようになります: function a(b){alert(b.myTitle)}window.displayNoteTitle=a; 圧縮されたコードが alert 文を実行している部分を関数として残している点に注意してください。この関数はかつての displayNoteTitle() が a() にリネームされたものです。しかし a() を参照するグローバルオブジェクトのプロパティの名称に古い関数名が使われているため、依然としてこの関数を古い名前で呼び出すことも可能になっています。例えばこのコードの外部にあるプログラムから以下のような呼び出しがあったとしても、やはり正しくalertを表示するはずです: displayNoteTitle({ myTitle Flowers }); 上のコードが動作するのは、ちょうど window.alert プロパティの値が alert() 関数であるのと同様、 window.displayNoteTitle プロパティの値が関数であるためです。 さらに、Closure Compilerが関数定義を削除しなかった( a() にリネームして残した)のは、 displayNoteTitle() 関数が実行中の処理の中で使用されていると見なしたからです。以下の代入文が、その使用箇所にあたります: window[ displayNoteTitle ] = displayNoteTitle; コンストラクタやプロトタイプメンバも、上と同様の手法でエクスポートできます。以下に例を示します: MyClass = function(name) { this.myName = name; }; MyClass.prototype.myMethod = function() { alert(this.myName); }; window[ MyClass ] = MyClass; // -- Constructor MyClass.prototype[ myMethod ] = MyClass.prototype.myMethod; もし逐一エクスポートのための文を書くことが面倒に感じられるなら、エクスポート用の関数を使用するのも良いでしょう。そのような関数の例として、Closure Library内の goog.exportSymbol() や goog.exportProperty() を参照してみてください。 アプリケーションは全体を一度にコンパイルする もしあなたが自分のアプリケーションを2つのコードモジュール(JSファイル)に分割したとすると、おそらくそれらのモジュールを別々にコンパイルしたいと考えるでしょう。しかしそれらのモジュールが連携して動作している場合、あなたはコンパイル時に後述するような様々な問題に直面するものと思われます。そして仮にコンパイルに成功したとしても、2つの出力結果は互いに関連性を失っていることでしょう。 例として、データ取得とデータ表示の2つの部分に分割されたアプリケーションを想定します。データを取得するコードは以下のとおりです: function getData() { // In an actual project, this data would be retrieved from the server. return {title Flower Care , text Flowers need water. }; } データを表示するコードは以下のとおりです: var displayElement = document.getElementById( display ); function displayData(parent, data) { var textElement = document.createTextNode(data.text); parent.appendChild(textElement); } displayData(displayElement, getData()); これら2つのコードを別々にコンパイルした場合、いくつかの問題が発生します。第1に、Closure Compilerは getData() を削除します。(その理由についてはCompilerが使用箇所を見つけられないコードは削除されるを参照してください)第2に、データ表示のコードを処理する際、Closure Compilerは以下のエラーを出力します: input 6 ERROR - variable getData is undefined displayData(displayElement, getData()); データ表示のコードのコンパイル時に getData() 関数にアクセスできないため、Closure Compilerは getData を未定義として扱います。 適切なコンパイルを確実に行うには、アプリケーションに含まれる全てのコードを1回の処理で一緒にコンパイルさせるべきです。Closure Compilerには複数のJavaScriptファイルやJavaScriptコード文字列を入力として指定できるため、ライブラリのコードとそれ以外のコードを単一のコンパイル処理リクエストに同時に渡すことが可能です。 注意:コンパイルされたコードとそうでないコードをアプリケーション内に混在させたい場合、この解決策は役に立ちません。このような状況への対応については、次のコンパイルされたコードと外部コードの間の参照関係を維持するにはを参照してください。 コンパイルされたコードと外部コードの間の参照関係を維持するには ADVANCED_OPTIMIZATIONS レベルでのシンボルのリネームによって、Closure Compilerが処理したコードとそうでないコードの間では互いに対話ができなくなります。コンパイル処理がソースコード内に定義された関数をリネームした後に外部のコードがその関数を呼び出したとしても、それらは変更前の関数名を参照しているため全て失敗するでしょう。同様にコンパイルされたコードからの参照に用いられていた外部コードのシンボル名もまた、Closure Compilerによって変更されていると思われます。 注意してほしいのは、コンパイルされたコードから外部コードへの参照を正しく維持することと、外部コードからコンパイルされたコードへの参照を正しく維持することは、実際には別の問題だということです。これらにはそれぞれに異なった解決策があり、Closure Compilerを最大限に活用するには状況に応じ適切な解決策をとることが重要になります。 外部コードからコンパイル済みコードへの呼び出しについての解決策:エクスポート もしあなたがライブラリとして再利用しようと考えているJavaScriptコードを持っているとして、外部のコンパイルされていないコードからライブラリ内の関数を呼び出せなくなるのなら、Closure Compilerによるコードの短縮を使いたいとは思わないでしょう。 この状況に対する解決策は、残しておきたいシンボルをエクスポートするで示した望まないコードを削除への対策と同じです。要素のエクスポートは要素の削除を防ぐだけでなく、それらを外部コードから利用可能な状態にすることにもなります。 コンパイル済みコードから外部コードへの呼び出しについての解決策:extern あなたが"OpenSocial API"や"Google Maps API"のようなサードパーティのJavaScriptライブラリを利用している場合、コード内で使用されている外部ライブラリ定義のシンボル名がClosure Compilerによってリネームされないようにしなければなりません。例えばOpenSocialライブラリの opensocial.newDataRequest() 関数を呼び出しをClosure Compilerが a.b() に変換してしまうのは、まったく望ましいことではありません。あなたのコードは外部ライブラリで使われているとおりの名前を使う必要があるからです。 Closure Compilerは、外部コードが定義する名前を宣言しそれをリネームさせなくする機能を提供します。この機能は「extern」と呼ばれます。Closure Compilerはextern宣言されたシンボルがコンパイルされたJavaScriptが実行される環境内に存在するものとみなして処理を行います。externについてはこちらで詳しく説明します。
https://w.atwiki.jp/yasrun/pages/65.html
package org.yasrun.test4; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; /** * 起動クラス */ public class Test4Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); /* 描画クラスのインスタンスを生成 */ MyView mView = new MyView(getApplication()); /* 現在のViewに設定 */ setContentView(mView); } } class Point { public Point(int x, int y) { this.X = x; this.Y = y; } public int X = 0; public int Y = 0; } /** * 描画用のクラス */ class MyView extends View { private Paint myPaint = new Paint(); private Paint myPaint2 = new Paint(); private Bitmap myBitmap; private List Point list = new ArrayList Point (); /* 画像のx座標 */ int x; /* 画像のy座標 */ int y; /** * コンストラクタ * * @param c */ public MyView(Context c) { super(c); /* イベントが取得できるようにFocusを有効にする */ setFocusable(true); /* Resourceインスタンスの生成 */ Resources res = this.getContext().getResources(); /* 画像の読み込み(res/drawable/gclue.png) */ myBitmap = BitmapFactory.decodeResource(res, R.drawable.icon); /* x,y座標の初期化 */ x = 0; y = 0; list.add(new Point(x + 24, y + 24)); myPaint2.setColor(Color.YELLOW); myPaint2.setStyle(Style.STROKE); } /** * 描画処理 */ protected void onDraw(Canvas canvas) { /* 背景色を設定 */ canvas.drawColor(Color.BLUE); /* 線描画 */ boolean first = true; int prevX = 0; int prevY = 0; for (Point p list) { if (!first) { canvas.drawLine(prevX, prevY, p.X, p.Y, myPaint2); } else { first = false; } prevX = p.X; prevY = p.Y; } /* Bitmapイメージの描画 */ canvas.drawBitmap(myBitmap, x, y, myPaint); } /** * タッチイベント */ public boolean onTouchEvent(MotionEvent event) { // タッチした時に実行 // 曲線にする場合はACTION_DOWNではなくACTION_MOVEにする。 if (event.getAction() == MotionEvent.ACTION_DOWN) { /* X,Y座標の取得 */ x = (int) event.getX(); y = (int) event.getY(); list.add(new Point(x + 24, y + 24)); /* 再描画の指示 */ invalidate(); } return true; } }
https://w.atwiki.jp/devandroidknowledge/pages/14.html
≪Android Tips≫ ◆なんと、Androidには温度センサーが付いているみたい! 【温度センサーから温度を取得するには(概要)】 Sensorインスタンスの生成 Sensorインスタンスに温度センサーを指定する SensorManagerインスタンスにリスナ―指定する。( 温度変化があったごとに記録するには、左記にプラスして下記が必要。) Andoridのセンサーには加速度センサーとか磁気センサーなどがある リスナーに設定すると、センサーの値が変更されたタイミングでonSensorhangedというメソッドが呼び出され、センサーの値を取得することが出来る。 SensorManagerインスタンス センサーを管理するためのSensor系のインスタンス。センサーを管理するためのメソッドも用意されている。 【温度センサーから温度を取得するには(詳細)】 getSystemServiceメソッドでSensorManagerインスタンスを取得 SensorManager.getDefaultSensorメソッドにSensor.TYPE_TEMPERATURE(温度センサー)を指定する。 SensorManager.registerListenerメソッドに②で生成したSensorインスタンスを指定。 by nakamura ◆GoogleMap活用法系 GoogleMap使用準備 GooglMapAPIのKeyを取得する。 AndroidManifestにインターネット接続のパーミッションとGooglMaoAPIを利用する記述を行う。 GoogleMap使用準備 さぁ、準備が出来たら画面に表示だ! 画面に表示させるにはあ以下のことを行う必要がある。 MapActibityクラスの継承 そのクラスの中でonCreateするときにsetContentView(R.layout.main)で地図をセットする。 ※main.xmlにMapViewを配置しておく。 ※MapView・・・Googleから取得したAPIキーの記述や、地図に関する表示をクリックの可否の記述を行う isRouteDisplayedメソッドをオーバーライドしてfalseを返すようにする ※isRouteDisplayedメソッド・・・?? ※MapViewインスタンスからマップ表示させることも可能 MapView mapView = new MapView(this,getResources().getString(取得したキー)); mapView.setEnabled(true); mapView.setClickable(true); setContentView(mapView); by nakamura ◆画面系いろいろ入門編 1画面につき1つActivityクラスが対応する。 バックグラウンドの処理はServiceクラスに実装する。 AvtivityからService,ServiceからServiceを呼び出す際はIntentを使う。 アプリ起動時の画面はAndroidManifest.xmlのintent-filterに設定する。 参考にしたページ Androidアプリ作成のための基礎知識 Androidプログラミング入門 Android入門
https://w.atwiki.jp/api_programming/pages/195.html
下位ページ インテントとインテントフィルタ サービス(Service) ストレージオプション フラグメント(Fragment) プロセスとスレッド(processes and threads) リストビュー(List View) レイアウト(Layout) 入力コントロール(Controls) 設定(Setting) 通知(Notification) Content スピナーコントロールの設定レイアウトの準備 選択肢の設定string.xmlでの設定 プログラム側から値を選択する アクティビティアプリの閉じられ方で、挙動が異なる アクションバーの代わりに、ツールバーを使うアクションバーを消す ツールバーをレイアウトに追加する Activity内で、アクションバーの代わりに使う記述をする スライドメニューを実装するドロワーレイアウトを作成する ドロワービューの中身を準備するListViewで作る 別のXMLファイルで作る ドロワーのオープン・クローズを実装する バックグラウンド処理(サービス) 閉じられても動作するサービスを動かすServiceクラスの作成 Activityから、作成したサービスを動かす 加速度センサの情報を受ける 回転角の情報を受け取る回転角の解釈 画面の回転を抑制するAndroidManifest.xmlで抑制する 動的に(プラグラム内で)で抑制する インテントにオブジェクトの情報を乗っけるparcelable をインプリメントしたクラスをつくるParcelable.Creater フィールドの実装 BundleやIntentに情報を乗せる Activity側で受ける 複数の情報をリストにして表示する バイブレーションを一定時間、作動させるパーミッションの追加 Vibratorオブジェクトを生成する vibrateを実行する 通知バーにバックグラウンド起動中の表示を出す 裏返したときの方向で、記録を分ける メニューのバーを設定するメニューリソースを準備するフォルダの作成 リソースファイルの作成 設定したメニューファイルを、Activityのメニューバーに評させる メニューの選択を受け取る処理を作る チェックボックスを動作させる 設定画面を設定する/設定情報をローカルストレージに残す 記録内容をGoogleスプレッドシートに記録する 記録内容をGoogleカレンダーに記録するブラウザでURLを開く ブラウザを開くURIとして、認証ページを指定する リダイレクトを受け取る 受け取ったリダイレクトをデータに紐解く codeを送って、tokenを受け取る tokenを保存する 終了時間と開始時間から、時間の計算をする リストビューで独自レイアウトを設定する USBデバッグ リリースビルド スピナーコントロールの設定 [部分編集] レイアウトの準備 Spinner android id="@+id/planets_spinner" android layout_width="fill_parent" android layout_height="wrap_content" / 選択肢の設定 string.xmlでの設定 まずは、string.xmlに文字配列を作る string-array name="planets_array" item Mercury /item item Venus /item item Earth /item /string-array この文字配列をアダプタにして、スピナーコントロールにアダプタをするリソースのアダプタ化には、ArrayApapter.createFromResource を使用できる。simple_spinner_item はデフォルト外観を設定している。通常はこれで良し。 setDropDownViewResource(int) は選択時に一覧を表示するのに使う。なくても一応ドロップダウンは出てくるが、ちょっとしょぼい? Spinner spinner = (Spinner) findViewById(R.id.spinner); ArrayAdapter CharSequence adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); createFromResource - ArrayAdapter | Android Developers setDropDownViewResource - ArrayAdapter | Android Developers プログラム側から値を選択する Spinner.setSelection で位置を指定する。その位置を取得するにはAdapterを使う。 使っているアダプタを取得するobjSpinner.getAdapter でアダプタを取得できる objAdapter.getPosition("...") でセレクタの位置を取得値が見つからなかったら -1 が返る objSpinner.setSelection に先程取得した位置を設定する ArrayAdapter spinnerAdapter = (ArrayAdapter) objSpinner.getAdapter(); int i = spinnerAdapter.getPosition("value"); objSpinner.setSelection(i); getAdapter - AbsSpinner | Android Developers getPosition - ArrayAdapter | Android Developers setSelection - AbsSpinner | Android Developers アクティビティ アプリの閉じられ方で、挙動が異なる onDestroyが呼ばれない限りは、Serviceを使わずとも、 ↓にある通り、ホームボタンとバックボタンでアプリケーションから離れた場合で挙動が違う。 https //kokufu.blogspot.jp/2011/03/activity.html 説明として、 ホームボタン:ホームアプリケーションが起動している バックボタン:Activityスタックからポップしている と書いてあったが、気持ち悪いのは、□ボタンを押すとあたかもまだ生きているかのように、アプリケーションリストに表示されるから。画面上に残っているが実際には onDestroy で消えている。 このあたりが、「アプリケーションをスワイプして消しても消さなくてもメモリにはそれほど影響しない」ということなんだろうか。 アクションバーの代わりに、ツールバーを使う [部分編集] 今後の拡張性から、アクションバーよりツールバーを使ったほうが良い、という記述をちょこちょこ見かけるが、Android Studioでプロジェクトを作ると、基本はアクションバーが設定されている。これをツールバーに置き換える。 アプリバーの追加 | Android Developers Toolbar | Android Developers AndroidのToolBar(新しいActionBar)メモ | Qiita アクションバーを消す res/values/styles.xmlで AppThemeのテーマを変更する style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar" ツールバーをレイアウトに追加する android.support.v7.widget.Toolbar android id="@+id/toolbar" android layout_width="match_parent" android layout_height="wrap_content" / レイアウトの@android */* ,?attr/* ,?* ,?android attr/* の違い | Qiita Activity内で、アクションバーの代わりに使う記述をする /* ToolBarの設定 */ Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); toolbar.setTitleTextColor(Color.WHITE); // 設定をしておく setSupportActionBar(toolbar); // アクションバーの代わり、という設定 これを書かないと、画面上では何も表示されない(空間だけはある) スライドメニューを実装する [部分編集] NavigationDrawer が正式名称? DrawerLayout | Android Developers ナビゲーションドロワーの作成 | Android Developers ドロワーレイアウトを作成する レイアウトxmlにて、DrawerLayout オブジェクトをレイアウトのルートビューとして指定する。 ルートの中にドロワービューとメインビューを設定する順序はメインビューを先にする高さはルートに合わせる(match_parent) 次にドロワーのビューを指定するlayout_gravityを指定する(layout_gravity:どっちにくっつけるか、どちら方向から出てくるか?)右から左に出す場合にはstart layout_heightは親ビューと同じ高さを指定する layout_widthはすべての情報が見える幅を指定する ドロワービューの中身を準備する ListViewで作る ListViewの中に android layout_gravity="..." を入れないと、スライドで入ってくる設定にならず、重ねて見えている状態になる android background="#111" 背景がないと、中途半端にすけた状態で表示される。 別のXMLファイルで作る NavigationViewで作った場合、ヘッダ部分とメニュー部分をそれぞれレイアウトとメニューで作成する app headerLayout="@layout/drawer_header" app menu="@menu/drawer" ドロワーのオープン・クローズを実装する DrawerLayout にリスナーをセットする。このリスナーは DrawerLayout.DrawerListener を実装して、使う。 Activity にアクションバーがセットされている場合は ActionBarDrawerToggle が DrawerLayout.DrawerListener を実装する。 DrawerLayout mDrawerLayout = ...; ActionBarDrawerToggle mDrawerToggle; mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) {...} public void onDrawerOpened(View drawerView) {...} }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); 【Android】スライドして表示されるメニュー | Qiita Navigation Drawer の概要 | Android 開発入門 Navigation Drawer の基本的な実装方法 | Android 開発入門 バックグラウンド処理(サービス) サービス - Android Developers Androidアプリでのバックグラウンド処理と通知機能 | Android Studio 2で始めるアプリ開発入門 - CodeZine 流れ Serviceのサブクラスを作成する AndroidManifest.xmlにサービスを登録 サブクラスで、必要なクラスをオーバーライドする。次のあたり。onCreate() onStartCommand() onDestroy() アクティビティからサービスを起動する (きちっと止まるように設計しておく) 閉じられても動作するサービスを動かす バックグラウンドで動作させるためにはServiceを用いる。 Serviceクラスの作成 Activityのように、作成・開始などのイベントで動くが、おもに3つ。 onCreate onStartCommand onDestroy Service | Android Developers Activityから、作成したサービスを動かす startServiceで起動、stopService(stopSelf)で停止。忘れずにServiceを止めないと、いつまでも動き続ける。 startService、stopServiceなどには、インテントを準備して、サービスにそれをなげる形をとっている。 startService - Context | Android Developers stopService - Context | Android Developers stopSelf - Service | Android Developers 加速度センサの情報を受ける 回転角の情報を受け取る センサーは加速度まではそのまま読み取れるが、回転角は加速度情報、地磁気情報から計算する必要がある。まず getRotationMatrix で回転行列を求め、getOrientation で回転行列を回転角に変換する(計算する) getRotationMatric - SensorManager | Android Developers getOrientation - SensorManager | Android Developers 引数に取った2つの配列には、傾斜行列、回転行列(の情報)が計算されて入ってくる。情報が不要ならnullでよい。 回転角の解釈 正位置として Zは天を指す Yは磁北を指す Xは Y,Z の外積を指す 画面の回転を抑制する AndroidManifest.xmlで抑制する 回転させないActivityに android screenOrientation="portrait" を追加すると、縦向き固定になる activity | Android Developers 動的に(プラグラム内で)で抑制する Activity内で、setRequestedOrientation を呼び出す setRequestedOrientation - Activity | Android Developers screenOrientation - ActivityInfo | Android Developers インテントにオブジェクトの情報を乗っける bundleで多くの情報をわたすような方法として、putParcelableArrayList くらいしか見当たらないので、これを使う。そのためには、Parcelable をimplements したようなクラスを作る必要がある。 Bundle | Android Developers parcelable をインプリメントしたクラスをつくる Parcelable実装にはParcelable.Createorというstatic fieldが必要。そのフィールドの初期化にて、Parcelに保存したデータを復元するためのコンストラクタを呼ぶ。 Parcelable | Android Developers Parcelable.Creater フィールドの実装 Parcelable.Creater | Android Developers createFromParcel(Parcel source)Parcelable.writeToParcel() で書き出されたParcelデータをインスタンス化する → コンストラクタを作っておく newArray(int size)ParcelableクラスのArrayを作る BundleやIntentに情報を乗せる IntentならputParcelableArrayListExtra、BundleならputParcelableArrayList で情報を登録 putParcelableArrayListExtra - Intent | Android Developers getParcelableArrayList - Bundle | Android Developers Activity側で受ける IntentならgetParcelableで受けられる。受けたときにすでにParcelableをimplementしたオブジェクトで受けられる。 getParcelableArrayListExtra - Intent | Android Developers getParcelableArrayList - Bundle | Android Developers 複数の情報をリストにして表示する [https //www54.atwiki.jp/api_programming/pages/202.html] バイブレーションを一定時間、作動させる Vibratorインスタンスからvibrate()を実行する。バイブレーションの実施にはAndroidManifest.xmlにパーミッションの追加が必要。 パーミッションの追加 マニフェストにパーミッションを追加する - パーミッションの宣言 | Android Developers Vibratorオブジェクトを生成する getSystemServiceでVibratorオブジェクトを生成する Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); getSystemService - Context | Android Developers Vibrator | Android Developers vibrateを実行する 幾つかパターンはあるが、かんたんなところで、これ。 vibrator.vibrate(500); vibrate - Vibrator | Android Developers 通知バーにバックグラウンド起動中の表示を出す 裏返したときの方向で、記録を分ける メニューのバーを設定する メニューリソースを準備し、表示させる。そのうえで、メニューのタップ動作に対する反応を記述する メニュー | Android Developers メニューリソースを準備する フォルダの作成 デフォルトではメニュー用のフォルダが無い(かもしれない)ので、res/menuを追加し、ここに入れておく。 resフォルダ右クリック [New]>[Android resource directory]を選択 ダイアログで、「Resource type 」から「menu」を選択し、OK リソースファイルの作成 menuフォルダを右クリック [New]>[Menu resource file] ファイル名を入力し、OK ファイル内に menu item / item / /menu を記述(実際はidやタイトルを設定する必要あり) Menu Resource | Android Developers 設定したメニューファイルを、Activityのメニューバーに評させる onCreateOptionMenuをオーバーライドして、この中でリソースの指定などを行う。XMLのメニューを実際?のメニューオブジェクトに変換するのに、inflatorを使用できる。 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); //(1) inflater.inflate(R.menu.menu_options_menu_list, menu); //(2) return super.onCreateOptionsMenu(menu); //(3) } onCreateOptionMenu - Activity | Android Developers メニューの選択を受け取る処理を作る オプションメニューを作っていれば、その受取はonOptionsItemSelectedをオーバーライドして処理できる。 @Override public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } このとき、itemにクリックされた情報が入っているので、これを紐解いて、どのメニューがクリックされたか判断し、switchなどで処理する。 int itemId = item.getItemId(); Android 3.0(APIレベル11)以降では メニューリソースXMLのitemに、android onClick を記述しておくことで、動作を定義させることもできる。 チェックボックスを動作させる Android/入力コントロール(Controls) 設定画面を設定する/設定情報をローカルストレージに残す Android/設定 記録内容をGoogleスプレッドシートに記録する http //qiita.com/konnobu/items/8bec3d5a45235fc88a08 記録内容をGoogleカレンダーに記録する 多分、クライアント用のライブラリが作られていて、簡単に認証処理をしたり、データを取得したりできるようになっていると思われるが、別サイトでも転用が聞くように、地道な方法を取ってみる。というか、専用のライブラリの使い方をよくわかっていない。 流れは OAuth2.0で認証Google API にプロジェクトと登録(キーの発行) 認証コードを発行 受け取り コードを access token と交換 access token も使って、リクエスト送信 こまごまと引っかかった場所が多数。 AndroidManifest.xmlにパーミッションの設定が必要 ブラウザでURLを開く Android/インテントとインテントフィルタ ブラウザを開くURIとして、認証ページを指定する GoogleのOAuth2認証 OAuth2認証 | Android Developers Step 1 Send a request to Google's OAuth 2.0 server | Google Identify Platform リダイレクトを受け取る 大概の(google 以外でも)場合は、認証後に指定したリダイレクト先に飛ばしてくれる。そのスキーム名に応じて、Android側でどのアプリで開くのかを考えてくれる。Android に「このスキームがきたら、俺のアプリで開いて」と指示するためには、AndroidManifest.xml に記述する必要がある。 scheme // host port / path intent-filter内で、action, category, data を指定する。上記のリダイレクト先に対応する内容を書くのは data で、scheme は data android scheme="com.example.testproject" / のようになる。 Intent の 定数として ACTION_VIEW などが定義されているが、実体は文字列で、それが android.intent.action.VIEW などになる(ので、どれを設定するかはIntent を参照)。ブラウザでどんなスキームがきたらヨソになげるのか、どんな action として投げるのか、説明されている場所がわからないが、ひとまず action ACTION_VIEW category CATEGORY_BROWSABLR scheme ここは各自で で開けた。redirect_uri で scheme //~ が指定できない( /だけ)なので、hostは存在せず、pathだけ。 インテント解決 - インテントとインテント フィルタ | Android Developers Intent - Android Developers 受け取ったリダイレクトをデータに紐解く 一旦受け取れれば、中身は getIntent() を経由して、中身を見られる(Intent.getAction(), Intent.getCategories() など)。OAuth では、path のなかに code を入れて返してくるので、Dataのなかを探せばある Intent intent = getIntent(); String data = intent.getDataString(); とすると、googleの認証で指定した redirect_uri のあとに code がくっついて返ってきている。以下、サンプル com.example.####.#### /oauth2callback?code=4/8abcdefg# 上記の場合、oauth2callback を uri.getPath() で、4/8abcdefg# を getQueryParameter("code") で受け取れる。 getIntent - Activity | Android Developers getData - Intent | Android Developers getQueryParameter - Uri | Android Developers codeを送って、tokenを受け取る コードと必要情報を POST することで、access token との交換をする。この処理は、UIスレッドだとエラーになるので、AsyncTaskで実行する必要がある。 また、交換がうまく行かなかったときは、HttpURLConnection の getInputStream ではなく、 getErrorStream に情報が流れるため、プログラムの確認作業では注意。(この辺をよくわかっていなくて、エラー原因を探すのに苦労した。) redirect_uri はスキームもパスもコード発行依頼時と同じものを使う。 Android/プロセスとスレッド(processes and threads) Async Task | Android Developers tokenを保存する プレファレンスへの保存 終了時間と開始時間から、時間の計算をする リストビューで独自レイアウトを設定する https //www54.atwiki.jp/api_programming/editx/202.html USBデバッグ http //www.aiseesoft.jp/tutorials/android-debug-mode.html リリースビルド http //androidstudio.hatenablog.com/entry/2014/07/26/154043