SlideShare a Scribd company logo
1 of 81
Download to read offline
C-LIS CO., LTD.
C-LIS CO., LTD.

Google Cloud Endpointsによる	

API構築
Who am I?

•

有山 圭二(ありやまけいじ)
有限会社シーリス代表	


•
•

Androidアプリ開発者	

日本Androidの会 関西支部
サーバーは

JSONを出し入れするもの
商品

ウォッチ

クライアント

ウォッチ

JSON
通知

通知

サーバー
APIを作ろう!

• 追加	

• 一覧	

• 詳細	

• 変更	

• 削除 etc…
プラットフォームごとに実装

JavaScript
APIに変更があった!
プラットフォーム×APIの	

数だけ変更するんだ

ユニットテストも書こうね!
手で実装する必要あるの?
Google Cloud Endpoints
Google Cloud Endpoints

AppEngine上にバックエンドを構築	

クライアント用ライブラリを自動生成
さっそく使ってみよう
準備

• Google App Engine Java SDK (1.7.5 or newer)	

• Java 7	

• Apache Maven	

•

You need to be familiar with development using Google
App Engine and the Java runtime.
手順
•

Create your backend API project (using Maven to do this is the
easiest method), then write your API backend code.	


•

Annotate your API backend code, so classes and client libraries
can be generated from it. (Alternatively, use the Google Plugin for
Eclipse, which can annotate for you.)	


•

Generate the client library using Maven, or alternatively, the
endpoints.sh command line tool. (Another alternative is to use
the Google Plugin for Eclipse to generate the client library.)	


•

Write your client app, using the client library when making calls
to the API backend.
作るもの
ココネコ

• 街にいる猫の写真を撮影して、

位置情報と一緒に投稿するサービス	


• スマートフォンやブラウザ上で、

猫の位置や写真を閲覧できる。
APIを作ろう

• 猫の写真と位置情報を登録	

• 猫の情報を一覧	

• 付近の猫の情報を取得
APIを作ろう

• 猫の写真と位置情報を登録 → insert	

• 猫の情報を一覧 → list	

• 付近の猫の情報を取得 → nyaaby
写真データは外部

AppEngineにはURLのみ格納
34.706781 135.494632
34.706781 135.494632
↓
xn0m7q008t18
xn0m7q008t18
xn0m7q008t18
xn0m7q008t18
Geohash
http://www.tom-carden.co.uk/p5/geohashing/applet/Geohash.java
準備(バックエンド)
AppEngineプロジェクト作成
$ cd coconeco
$ mvn archetype:generate

Choose a number or apply filter,
com.google.appengine.archetypes:skeleton-archetype

!

Choose com.google.appengine.archetypes:skeleton-archetype version:
2: 1.7.5

!

groupId: io.keiji.coconeco

!

artifactId: coconeco

!

version:

!

padkage:
appengine-web.xmlを編集
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>coconeco</application>
<version>${appengine.app.version}</version>
<threadsafe>true</threadsafe>

!

<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
</appengine-web-app>

coconeco/src/main/java/webapp/WEB-INF/appengine-web.xml
pom.xmlを編集
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

!
!
!
!

!

!
!

!
!

<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<groupId>io.keiji.coconeco</groupId>
<artifactId>coconeco</artifactId>
<properties>
<appengine.app.version>1</appengine.app.version>
<appengine.target.version>1.7.5</appengine.target.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Compile/runtime dependencies -->
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>${appengine.target.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test Dependencies -->
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-testing</artifactId>
<version>${appengine.target.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>${appengine.target.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>2.5.1</version>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<archiveClasses>true</archiveClasses>
<webResources>
<!-- in order to interpolate version from pom into appengine-web.xml -->
<resource>
<directory>${basedir}/src/main/webapp/WEB-INF</directory>
<filtering>true</filtering>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
<plugin>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.target.version}</version>
</plugin>
</plugins>
</build>

</project>

coconeco/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">

!
!
!

<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<groupId>io.keiji.coconeco</groupId>
<artifactId>coconeco</artifactId>

<properties>
<appengine.app.version>1</appengine.app.version>
<appengine.target.version>1.8.9</
appengine.target.version>
<project.build.sourceEncoding>UTF-8</
project.build.sourceEncoding>
</properties>

!
endpointsの依存を追加
<dependencies>
<!-- Compile/runtime dependencies -->
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>${appengine.target.version}</version>
</dependency>
…
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-endpoints</artifactId>
<version>${appengine.target.version}</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Test Dependencies -->
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-testing</artifactId>
<version>${appengine.target.version}</version>
<scope>test</scope>
</dependency>
…

coconeco/pom.xml
プラグインを追加
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<webXml>${project.build.directory}/generated-sources/
appengine-endpoints/WEB-INF/web.xml</webXml>
<webResources>
<resource>
<!-- this is relative to the pom.xml
directory -->
<directory>${project.build.directory}/
generated-sources/appengine-endpoints</directory>
<!-- the list has a default value of ** -->
<includes>
<include>WEB-INF/*.discovery</include>
<include>WEB-INF/*.api</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>

<plugin>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.target.version}</version>
<configuration>
<enableJarClasses>false</enableJarClasses>
</configuration>
<executions>
<execution>
<goals>
<goal>endpoints_get_discovery_doc</goal>
</goals>
</execution>
</executions>
</plugin>

coconeco/pom.xml
初期処理

$ mvn install

JDK 7でないとエラーが発生	


Unsupported major.minor version 51.0	


http://www.coderanch.com/t/624933/tools/Maven-dependency-mystery-Google-App
実装(バックエンド)
package io.keiji.coconeco;	

!

public class Entry {	
public Double latitude;	
public Double longitude;	
public String geoHash;	
public String url;	
public String description;	

!
!
!
!
!
!
!
!
!
!

public Entry() {	
}	
public Entry(String url) {	
this.url = url;	
}	
public Double getLatitude() {	
return latitude;	
}	
public Double getLongitude() {	
return longitude;	
}	
public String getGeoHash() {	
return geoHash;	
}	
public void setLocation(Double lat, Double lon) {	
this.latitude = lat;	
this.longitude = lon;	
this.geoHash = Geohash.encode(lat, lon);	
}	
public String getUrl() {	
return url;	
}	
public void setUrl(String url) {	
this.url = url;	
}	
public String getDescription() {	
return description;	
}	
public void setDescription(String description) {	
this.description = description;	
};	

}

coconeco/src/main/java/io/keiji/coconeco/Entry.java
package io.keiji.coconeco;	

!
import java.util.ArrayList;	
!

public class EntryList {	
public static ArrayList<Entry> entries = new ArrayList<Entry>();	

!

static {	
entries.add(	
new Entry("http://i.gzn.jp/img/2009/03/13/swimming_cat/
swimming_cat.jpg"));	
entries.add(	
new Entry("http://upload.wikimedia.org/wikipedia/ja/
1/16/%E6%97%A5%E6%9C%AC%E7%8C%AB_2008-4.jpg"));	
}	

!

public Entry getEntryList(Integer id) {	
return entries.get(id);	
}	

}	

coconeco/src/main/java/io/keiji/coconeco/EntryList.java
package io.keiji.coconeco;	

!
import java.util.ArrayList;	
!
import javax.inject.Named;	
!
import com.google.api.server.spi.config.Api;	
!

@Api(name = "coconeco", version = "v1")	
public class EntryList {	
public static ArrayList<Entry> entries = new ArrayList<Entry>();	

!

static {	
entries.add(	
new Entry("http://i.gzn.jp/img/2009/03/13/swimming_cat/
swimming_cat.jpg"));	
entries.add(	
new Entry("http://upload.wikimedia.org/wikipedia/ja/
1/16/%E6%97%A5%E6%9C%AC%E7%8C%AB_2008-4.jpg"));	
}	

!

public Entry getEntryList(@Named("id") Integer id) {	
return entries.get(id);	
}	

}	

coconeco/src/main/java/io/keiji/coconeco/EntryList.java
package io.keiji.coconeco;	

!

//
//
//
//
//
//
//
//

http://www.tom-carden.co.uk/p5/geohashing/applet/Geohash.java	
Geohash.java	
Geohash library for Java	
ported from David Troy's Geohash library for Javascript	
- http://github.com/davetroy/geohash-js/tree/master	
(c) 2008 David Troy	
(c) 2008 Tom Carden	
Distributed under the MIT License	

!
public class Geohash {	
!
…

coconeco/src/main/java/io/keiji/coconeco/Geohash.java
テストサーバーの起動
$ mvn appengine:devserver

!

…

!

[INFO] INFO: Started SelectChannelConnector@127.0.0.1:8080	
[INFO] Feb 14, 2014 9:15:02 PM
com.google.appengine.tools.development.JettyContainerService startHotDeployScanner	
[INFO] INFO: Full scan of the web app in place every 5s.	
[INFO] Feb 14, 2014 9:15:02 PM com.google.appengine.tools.development.AbstractModule
startup	
[INFO] INFO: Module instance default is running at http://localhost:8080/	
[INFO] Feb 14, 2014 9:15:02 PM com.google.appengine.tools.development.AbstractModule
startup	
[INFO] INFO: The admin console is running at http://localhost:8080/_ah/admin	
[INFO] Feb 14, 2014 9:15:02 PM com.google.appengine.tools.development.DevAppServerImpl
doStart	
[INFO] INFO: Dev App Server is now running
ブラウザでアクセス	


http://localhost:8080/_ah/api/explorer
ブラウザでアクセス	


http://localhost:8080/_ah/api/explorer

しかし何も起こらなかった!
そもそも、localhostでアクセス出来ない

127.0.0.1ならアクセス出来る

(MacOS X Marvericsの場合)
http://stackoverflow.com/questions/20345132/127-0-0-1-is-working-but-localhost-not-working
https://developers.google.com/appengine/docs/java/tools/maven?hl=ja
pom.xmlを編集
<plugin>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.target.version}</version>
<configuration>
<enableJarClasses>false</enableJarClasses>
<address>0.0.0.0</address>
<port>8888</port>
</configuration>
<executions>
<execution>
<goals>
<goal>endpoints_get_discovery_doc</goal>
</goals>
</execution>
</executions>
</plugin>

coconeco/pom.xml
ブラウザでアクセス	


http://localhost:8888/_ah/api/explorer
Discovery Based API
Google Cloud Endpoints

AppEngine上にDiscovery Based APIに	

準拠したバックエンドを構築
package io.keiji.coconeco;	

!
import java.util.ArrayList;	
!
import javax.inject.Named;	
!

import com.google.api.server.spi.config.Api;	
import com.google.api.server.spi.config.ApiMethod;	

!

@Api(name = "coconeco", version = "v1")	
public class EntryList {	
public static ArrayList<Entry> entries = new ArrayList<Entry>();	

!

static {	
entries.add(new Entry("http://i.gzn.jp/img/2009/03/13/swimming_cat/
swimming_cat.jpg"));	
entries.add(new Entry("http://upload.wikimedia.org/wikipedia/ja/
1/16/%E6%97%A5%E6%9C%AC%E7%8C%AB_2008-4.jpg"));	
}	

!
!
!

public ArrayList<Entry> getEntryList() {	
return entries;	
}	
@ApiMethod(name = "get", httpMethod = "get")	
public Entry getEntry(@Named("id") Integer id) {	
return entries.get(id);	
}	

}	

coconeco/src/main/java/io/keiji/coconeco/EntryList.java
package io.keiji.coconeco;	

!
import java.util.ArrayList;	
!
import javax.inject.Named;	
!

import com.google.api.server.spi.config.Api;	
import com.google.api.server.spi.config.ApiMethod;	

!

@Api(name = "coconeco", version = "v1")	
public class EntryList {	
public static ArrayList<Entry> entries = new ArrayList<Entry>();	

!

static {	
entries.add(new Entry("http://i.gzn.jp/img/2009/03/13/swimming_cat/
swimming_cat.jpg"));	
entries.add(new Entry("http://upload.wikimedia.org/wikipedia/ja/
1/16/%E6%97%A5%E6%9C%AC%E7%8C%AB_2008-4.jpg"));	
}	

!
// 略	
!

!

@ApiMethod(name = "insert", httpMethod = "post")	
public Entry insertEntry(	
@Named("lat") Double lat,	
@Named("lng") Double lng,	
@Named("url") String url,	
@Named("desc") String description) {	
Entry entry = new Entry();	
entry.setLocation(lat, lng);	
entry.setUrl(url);	
entry.setDescription(description);	

!

// 保存	
entries.add(entry);	

!
!

return entry;	
}	

}	

coconeco/src/main/java/io/keiji/coconeco/EntryList.java
lat

34.697418

35.675595

lng

135.516559

139.767504

url

http://i.gzn.jp/img/2009/03/13/
swimming_cat/swimming_cat.jpg

http://upload.wikimedia.org/wikipedia/ja/
1/16/%E6%97%A5%E6%9C%AC%E7%8C
%AB_2008-4.jpg

desc

シーリス本社

シーリス東京オフィス
!

@ApiMethod(name = "insert", httpMethod = "post")	
public Entry insertEntry(	
@Named("lat") Double lat,	
@Named("lng") Double lng,	
@Named("url") String url,	
@Named("desc") String description) {	
Entry entry = new Entry();	
entry.setLocation(lat, lng);	
entry.setUrl(url);	
entry.setDescription(description);	

!

public void setLocation(Double lat, Double lon) {	
this.latitude = lat;	
this.longitude = lon;	
this.geoHash = Geohash.encode(lat, lon);	
}	

coconeco/src/main/java/io/keiji/coconeco/Entry.java

// 保存	
entries.add(entry);	

!

return entry;	
}

coconeco/src/main/java/io/keiji/coconeco/EntryList.java

{	

"latitude": 34.697418,	

"longitude": 135.516559,	

"geoHash": "xn0m7u2phew2",	

"url": "http%3A%2F%2Fi.gzn.jp%2Fimg%2F2009%2F03%2F13%2Fswimming_cat%2Fswimming_cat.jpg",	

"description": "%E3%82%B7%E3%83%BC%E3%83%AA%E3%82%B9%E6%9C%AC%E7%A4%BE"	

}
package io.keiji.coconeco;	

!

import java.util.ArrayList;	
import java.net.URLEncoder;	
import java.io.UnsupportedEncodingException;	

!
import javax.inject.Named;	
!

import com.google.api.server.spi.config.Api;	
import com.google.api.server.spi.config.ApiMethod;	

@ApiMethod(name = "nyaaby", httpMethod = "get")	
public ArrayList<Entry> getEntry(	
@Named("lat") Double lat,	
@Named("lng") Double lng) {	

!
!
!

ArrayList<Entry> result = new ArrayList<Entry>();	
String geoHash = Geohash.encode(lat, lng);	
// 検索条件	

!

@Api(name = "coconeco", version = "v1")	
public class EntryList {	
public static ArrayList<Entry> entries = new ArrayList<Entry>();	

!
private static final int GEO_THRESHOLD = 7;	
!

static {	
Entry entry1 = new Entry();	
entry1.setLocation(34.697418, 135.516559);	
entry1.setUrl("http://i.gzn.jp/img/2009/03/13/swimming_cat/
swimming_cat.jpg");	
try {	
entry1.setDescription(	
	
	
URLEncoder.encode("シーリス本社", "UTF-8"));	
	

!

	

entries.add(entry2);	
} catch (UnsupportedEncodingException e) {}	
}	

!

// 検索処理	
search(entries, result, term);	

!
!

entries.add(entry1);	
} catch (UnsupportedEncodingException e) {}	

Entry entry2 = new Entry();	
entry2.setLocation(35.675595, 139.767504);	
entry2.setUrl("http://upload.wikimedia.org/wikipedia/ja/
1/16/%E6%97%A5%E6%9C%AC%E7%8C%AB_2008-4.jpg");	
try {	
	
entry2.setDescription(	
	
	
URLEncoder.encode(”シーリス東京オフィス”, ”UTF-8”));	

String term = geoHash.substring(	
0, geoHash.length() - GEO_THRESHOLD);	

return result;	
}	
private static void search(ArrayList<Entry> from,	
ArrayList<Entry> to, String term) {	
for (Entry entry : from) {	
if (entry.getGeoHash().startsWith(term)) {	
to.add(entry);	
}	
}	
}	

}	

coconeco/src/main/java/io/keiji/coconeco/EntryList.java
desc

大阪天満宮

有楽町

lat

34.697211

35.6770686

lng

135.513215

139.7697867
{	

"items" : [ {	

"latitude" : 35.675595,	

"longitude" : 139.767504,	

"geoHash" : "xn76uqx96uut",	

"url" : "http://upload.wikimedia.org/wikipedia/ja/1/16/%E6%97%A5%E6%9C%AC%E7%8C%AB_2008-4.jpg",	

"description" : "%E3%82%B7%E3%83%BC%E3%83%AA%E3%82%B9%E6%9D%B1%E4%BA%AC%E3%82%AA
%E3%83%95%E3%82%A3%E3%82%B9"	

} ]	

}
サーバーへのupload準備
<?xml version="1.0" encoding="utf-8"?>	
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">	
<application>stable-apogee-488</application>	
<version>1</version>	
<threadsafe>true</threadsafe>	

!

<system-properties>	
<property name="java.util.logging.config.file" value="WEB-INF/
logging.properties"/>	
</system-properties>	
</appengine-web-app>	

coconeco/src/main/java/webapp/WEB-INF/appengine-web.xml
アップロード
$ mvn appengine:update

!

…

!

Please enter code:
Beginning interaction for module default...	
0% Created staging directory at: '/var/folders/tv/yr_x0jn163s4yr1gv77bk1mr0000gn/T/
appcfg4387737080071537979.tmp'	
5% Scanning for jsp files.	
20% Scanning files on local disk.	
25% Initiating update.	
28% Cloning 10 application files.	
40% Uploading 6 files.	
52% Uploaded 1 files.	
61% Uploaded 2 files.	
68% Uploaded 3 files.	
73% Uploaded 4 files.	
77% Uploaded 5 files.	
80% Uploaded 6 files.	
82% Initializing precompilation...	
84% Sending batch containing 6 file(s) totaling 21KB.	
90% Deploying new version.	
99% Closing update: new version is ready to start serving.	
99% Uploading index definitions.	

!

Update for module default completed successfully.	
Success.	
Cleaning up temporary files for module default...	
[INFO] ------------------------------------------------------------------------	
[INFO] BUILD SUCCESS	
[INFO] ------------------------------------------------------------------------	
[INFO] Total time: 1:00.795s	
[INFO] Finished at: Sat Feb 15 06:07:07 JST 2014	
[INFO] Final Memory: 13M/245M	
[INFO] ------------------------------------------------------------------------
https://apis-explorer.appspot.com/apis-explorer/?base=https://stable-apogee-488.appspot.com/_ah/api#p/
Android用ライブラリ
クライアントライブラリの
生成
$ mvn appengine:endpoints_get_client_lib

target/endpoints-client-libs/coconeco/target/coconeco-v1-1.17.0-rc-SNAPSHOT.jar
依存ライブラリ山盛り
•
•
•
•
•
•
•
•
•

google-api-client-1.12.0-beta.jar	

google-api-client-android-1.12.0-beta.jar	

google-http-client-1.12.0-beta.jar	

google-http-client-android-1.12.0-beta.jar	

google-http-client-gson-1.12.0-beta.jar	

google-oauth-client-1.12.0-beta.jar	

gson-2.1.jar	

guava-jdk5-13.0.jar	

jsr305-1.3.9.jar

https://developers.google.com/appengine/docs/java/endpoints/consume_android
pom.xmlに依存関係を追加
<dependencies>	
<dependency>	
<groupId>com.google.api-client</groupId>	
<artifactId>google-api-client</artifactId>	
<version>1.17.0-rc</version>	
</dependency>	
<dependency>	
<groupId>com.google.api-client</groupId>	
<artifactId>google-api-client-android</artifactId>	
<version>1.17.0-rc</version>	
</dependency>	
<dependency>	
<groupId>com.google.api-client</groupId>	
<artifactId>google-api-client-gson</artifactId>	
<version>1.17.0-rc</version>	
</dependency>	
</dependencies>	

!

<properties>	
<project.build.sourceEncoding>UTF-8</
project.build.sourceEncoding>	
</properties>	
</project>

target/endpoints-client-libs/coconeco/pom.xml
依存関係のファイルを取得

$ target/endpoints-client-libs/coconeco/
$ mvn dependency:copy-dependencies

target/endpoints-client-libs/coconeco/target/dependency にダウンロード
Androidプロジェクトの作成

• Coconeco	

• io.keiji.coconeco.android
依存ライブラリのコピー

• プロジェクトの libs/
以下にコピー
表示する画面
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"	
xmlns:tools="http://schemas.android.com/tools"	
android:layout_width="match_parent"	
android:layout_height="match_parent"	
android:paddingBottom="@dimen/activity_vertical_margin"	
android:paddingLeft="@dimen/activity_horizontal_margin"	
android:paddingRight="@dimen/activity_horizontal_margin"	
android:paddingTop="@dimen/activity_vertical_margin"	
tools:context=".MainActivity"	
android:orientation="vertical">	

!

!

<ImageView	
android:id="@+id/iv_picture"	
android:layout_width="wrap_content"	
android:layout_height="wrap_content" />	
	
<TextView	
android:id="@+id/tv_description"	
android:layout_width="wrap_content"	
android:layout_height="wrap_content"	
android:text="読み込み中..." />	

</LinearLayout>	

activity_main.xml
表示する画面
package io.keiji.coconeco.android;	

!
public class MainActivity extends Activity {	
!
	
	

private ImageView mImage;	
private TextView mDescription;	

	
	
	
	

@Override	
protected void onCreate(Bundle savedInstanceState) {	
	
super.onCreate(savedInstanceState);	
	
setContentView(R.layout.activity_main);	

	
	

	
	

mImage = (ImageView) findViewById(R.id.iv_picture);	
mDescription = (TextView) findViewById(R.id.tv_description);	

	

	

// 付近の情報を取得	

	
	
	

	
	
}	

NyaaByTask task = new NyaaByTask();	
task.execute(new Void[0]);	

	
	
	
	
	
	

@Override	
public boolean onCreateOptionsMenu(Menu menu) {	
	
// Inflate the menu; this adds items to the action bar if it is present.	
	
getMenuInflater().inflate(R.menu.main, menu);	
	
return true;	
}	

!
!
!
!

!

MainActivity.java
付近の情報を取得する処理
	

private class NyaaByTask extends AsyncTask<Void, Void, List<CoconecoEntry>> {	

	
	

	
	

@Override	
protected List<CoconecoEntry> doInBackground(Void... params) {	

	
	
	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
	
	
	
	
	
	
}	

	
	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
	
	
	
	
	
	

@Override	
protected void onPostExecute(List<CoconecoEntry> result) {	
	
super.onPostExecute(result);	
	
if (result.size() > 0) {	
	
	
CoconecoEntry entry = result.get(0);	
	
	
try {	
	
	
	
String desc = URLDecoder.decode(entry.getDescription(),	
	
	
	
	
	
"UTF-8");	
	
	
	
mDescription.setText(desc);	
	
	
} catch (UnsupportedEncodingException e) {	
	
	
}	

	
	
	
	
	

	
	
	
	
}	

	
	
	
}	

!
!

!

!

Coconeco.Builder builder = new Coconeco.Builder(	
	
	
AndroidHttp.newCompatibleTransport(), new GsonFactory(),	
	
	
null);	
Coconeco service = builder.build();	
try {	
	
EntryCollection result = service.nyaaby(34.697211, 135.513215)	
	
	
	
.execute();	
	
return result.getItems();	
} catch (IOException e) {	
}	
return null;	

	
	
}	

ImageLoadTask task = new ImageLoadTask();	
task.execute(new String[] { entry.getUrl() });	

MainActivity.java
画像を取得する処理
	

private class ImageLoadTask extends AsyncTask<String, Void, Bitmap> {	

	
	
	

	
	
	

@Override	
protected Bitmap doInBackground(String... params) {	
	
String url = params[0];	

	
	
	

	
	
	

	
	
	

HttpGet request = new HttpGet(url);	
AndroidHttpClient client = AndroidHttpClient	
	
	
.newInstance("Coconeco");	

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}	

Bitmap bmp = null;	
InputStream is = null;	
try {	
	
HttpResponse response = client.execute(request);	
	
is = response.getEntity().getContent();	
	
bmp = BitmapFactory.decodeStream(is);	
} catch (IOException e) {	
} finally {	
	
if (is != null) {	
	
	
try {	
	
	
	
is.close();	
	
	
} catch (IOException e) {	
	
	
}	
	
}	
	
client.getConnectionManager().shutdown();	
}	
return bmp;	

	
	
	
	
	
	

	
	
	
	
	
}

@Override	
protected void onPostExecute(Bitmap result) {	
	
super.onPostExecute(result);	
	
mImage.setImageBitmap(result);	
}	

!
!
!

!

MainActivity.java
実行結果
他のプラットフォームは…

JavaScript	


https://developers.google.com/appengine/docs/java/endpoints/consume_js

iOS	


https://developers.google.com/appengine/docs/java/endpoints/consume_ios
C-LIS CO., LTD.

本資料料は、有限会社シーリスの著作物であり、  
クリエイティブコモンズの表⽰示-‐‑‒⾮非営利利-‐‑‒継承  3.0  Unported  ライセンスの元で公開しています。

各製品名・ブランド名、会社名などは、⼀一般に各社の商標または登録商標です。  
本資料料中では、©、®、™を割愛しています。

More Related Content

What's hot

Building Mobile Apps With Ionic & Loopback
Building Mobile Apps With Ionic & LoopbackBuilding Mobile Apps With Ionic & Loopback
Building Mobile Apps With Ionic & LoopbackChibuzor Obiora
 
Creating Your Own Server Add-on that Customizes Confluence or JIRA
Creating Your Own Server Add-on that Customizes Confluence or JIRACreating Your Own Server Add-on that Customizes Confluence or JIRA
Creating Your Own Server Add-on that Customizes Confluence or JIRAAtlassian
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRaymond Camden
 
Integration Testing on Steroids: Run Your Tests on the Real Things
Integration Testing on Steroids: Run Your Tests on the Real ThingsIntegration Testing on Steroids: Run Your Tests on the Real Things
Integration Testing on Steroids: Run Your Tests on the Real ThingsAtlassian
 
Simplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring CloudSimplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring CloudRamnivas Laddad
 
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobileJavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobileLoiane Groner
 
How to Build a Better JIRA Add-on
How to Build a Better JIRA Add-onHow to Build a Better JIRA Add-on
How to Build a Better JIRA Add-onAtlassian
 
Forge: Under the Hood
Forge: Under the HoodForge: Under the Hood
Forge: Under the HoodAtlassian
 
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...Atlassian
 
Serverless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLMServerless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLMBoaz Ziniman
 
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...Fwdays
 
Spec-first API Design for Speed and Safety
Spec-first API Design for Speed and SafetySpec-first API Design for Speed and Safety
Spec-first API Design for Speed and SafetyAtlassian
 
20201012 - Serverless Architecture Conference - Deploying serverless applicat...
20201012 - Serverless Architecture Conference - Deploying serverless applicat...20201012 - Serverless Architecture Conference - Deploying serverless applicat...
20201012 - Serverless Architecture Conference - Deploying serverless applicat...Marcia Villalba
 
What's New in Jira Cloud for Developers
What's New in Jira Cloud for DevelopersWhat's New in Jira Cloud for Developers
What's New in Jira Cloud for DevelopersAtlassian
 
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜崇之 清水
 
Practical Patterns for Developing a Cross-product Cross-version App
Practical Patterns for Developing a Cross-product Cross-version AppPractical Patterns for Developing a Cross-product Cross-version App
Practical Patterns for Developing a Cross-product Cross-version AppAtlassian
 
Building Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in RailsBuilding Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in RailsJim Jeffers
 
Supercharge Your Pages - New Ways to Extend the Confluence Editor
Supercharge Your Pages - New Ways to Extend the Confluence EditorSupercharge Your Pages - New Ways to Extend the Confluence Editor
Supercharge Your Pages - New Ways to Extend the Confluence EditorAtlassian
 
[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache Cordova
[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache Cordova[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache Cordova
[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache CordovaHazem Saleh
 

What's hot (20)

Building Mobile Apps With Ionic & Loopback
Building Mobile Apps With Ionic & LoopbackBuilding Mobile Apps With Ionic & Loopback
Building Mobile Apps With Ionic & Loopback
 
Creating Your Own Server Add-on that Customizes Confluence or JIRA
Creating Your Own Server Add-on that Customizes Confluence or JIRACreating Your Own Server Add-on that Customizes Confluence or JIRA
Creating Your Own Server Add-on that Customizes Confluence or JIRA
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoop
 
Integration Testing on Steroids: Run Your Tests on the Real Things
Integration Testing on Steroids: Run Your Tests on the Real ThingsIntegration Testing on Steroids: Run Your Tests on the Real Things
Integration Testing on Steroids: Run Your Tests on the Real Things
 
Simplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring CloudSimplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring Cloud
 
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobileJavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
 
How to Build a Better JIRA Add-on
How to Build a Better JIRA Add-onHow to Build a Better JIRA Add-on
How to Build a Better JIRA Add-on
 
Forge: Under the Hood
Forge: Under the HoodForge: Under the Hood
Forge: Under the Hood
 
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...
 
Serverless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLMServerless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLM
 
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
 
Spec-first API Design for Speed and Safety
Spec-first API Design for Speed and SafetySpec-first API Design for Speed and Safety
Spec-first API Design for Speed and Safety
 
20201012 - Serverless Architecture Conference - Deploying serverless applicat...
20201012 - Serverless Architecture Conference - Deploying serverless applicat...20201012 - Serverless Architecture Conference - Deploying serverless applicat...
20201012 - Serverless Architecture Conference - Deploying serverless applicat...
 
Firebase with Android
Firebase with AndroidFirebase with Android
Firebase with Android
 
What's New in Jira Cloud for Developers
What's New in Jira Cloud for DevelopersWhat's New in Jira Cloud for Developers
What's New in Jira Cloud for Developers
 
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
 
Practical Patterns for Developing a Cross-product Cross-version App
Practical Patterns for Developing a Cross-product Cross-version AppPractical Patterns for Developing a Cross-product Cross-version App
Practical Patterns for Developing a Cross-product Cross-version App
 
Building Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in RailsBuilding Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in Rails
 
Supercharge Your Pages - New Ways to Extend the Confluence Editor
Supercharge Your Pages - New Ways to Extend the Confluence EditorSupercharge Your Pages - New Ways to Extend the Confluence Editor
Supercharge Your Pages - New Ways to Extend the Confluence Editor
 
[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache Cordova
[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache Cordova[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache Cordova
[JavaLand 2015] Developing JavaScript Mobile Apps Using Apache Cordova
 

Viewers also liked

Google Cloud Endpoints の紹介
Google Cloud Endpoints の紹介Google Cloud Endpoints の紹介
Google Cloud Endpoints の紹介Taiji Miyamoto
 
AWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API GatewayAWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API GatewayAmazon Web Services Japan
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogle Cloud Platform - Japan
 
How to work Tableau x Google Cloud Platform in CyberAgent AdTech Studio
How to work Tableau x Google Cloud Platform in CyberAgent AdTech StudioHow to work Tableau x Google Cloud Platform in CyberAgent AdTech Studio
How to work Tableau x Google Cloud Platform in CyberAgent AdTech StudioKen Takao
 
Google Cloud のネットワークとロードバランサ
Google Cloud のネットワークとロードバランサGoogle Cloud のネットワークとロードバランサ
Google Cloud のネットワークとロードバランサGoogle Cloud Platform - Japan
 
CocoaPodsのはなし
CocoaPodsのはなしCocoaPodsのはなし
CocoaPodsのはなしHironytic
 
APIモック3分クッキング
APIモック3分クッキングAPIモック3分クッキング
APIモック3分クッキング政雄 金森
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスEtsuji Nakai
 
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at FlickrJohn Allspaw
 

Viewers also liked (11)

Google Cloud Endpoints の紹介
Google Cloud Endpoints の紹介Google Cloud Endpoints の紹介
Google Cloud Endpoints の紹介
 
AWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API GatewayAWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービス
 
AimingでGoogle Cloud Platformの利用について
AimingでGoogle Cloud Platformの利用についてAimingでGoogle Cloud Platformの利用について
AimingでGoogle Cloud Platformの利用について
 
How to work Tableau x Google Cloud Platform in CyberAgent AdTech Studio
How to work Tableau x Google Cloud Platform in CyberAgent AdTech StudioHow to work Tableau x Google Cloud Platform in CyberAgent AdTech Studio
How to work Tableau x Google Cloud Platform in CyberAgent AdTech Studio
 
Client-Side Deep Learning
Client-Side Deep LearningClient-Side Deep Learning
Client-Side Deep Learning
 
Google Cloud のネットワークとロードバランサ
Google Cloud のネットワークとロードバランサGoogle Cloud のネットワークとロードバランサ
Google Cloud のネットワークとロードバランサ
 
CocoaPodsのはなし
CocoaPodsのはなしCocoaPodsのはなし
CocoaPodsのはなし
 
APIモック3分クッキング
APIモック3分クッキングAPIモック3分クッキング
APIモック3分クッキング
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービス
 
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
 

Similar to Google Cloud Endpointsによる API構築

Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkDeploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkAmazon Web Services
 
Deploying applications to Cloud with Google App Engine
Deploying applications to Cloud with Google App EngineDeploying applications to Cloud with Google App Engine
Deploying applications to Cloud with Google App EngineAlexander Zamkovyi
 
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Amazon Web Services
 
Running Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkRunning Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkAmazon Web Services
 
Tutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer WorkshopTutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer WorkshopVivek Krishnakumar
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaLars Vogel
 
Alfresco Development Framework Basic
Alfresco Development Framework BasicAlfresco Development Framework Basic
Alfresco Development Framework BasicMario Romano
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Againjonknapp
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Enginecatherinewall
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0Eugenio Romano
 
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...Amazon Web Services
 
Play Framework on Google App Engine
Play Framework on Google App EnginePlay Framework on Google App Engine
Play Framework on Google App EngineFred Lin
 
Web APIs & Apps - Mozilla
Web APIs & Apps - MozillaWeb APIs & Apps - Mozilla
Web APIs & Apps - MozillaRobert Nyman
 
Application Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless WorldApplication Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless WorldAmazon Web Services
 
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkDeploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkAmazon Web Services
 
In Act Developers Platform
In Act Developers PlatformIn Act Developers Platform
In Act Developers PlatformEris Ristemena
 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaAmazon Web Services
 
Angularjs Tutorial for Beginners
Angularjs Tutorial for BeginnersAngularjs Tutorial for Beginners
Angularjs Tutorial for Beginnersrajkamaltibacademy
 

Similar to Google Cloud Endpointsによる API構築 (20)

Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkDeploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
 
Deploying applications to Cloud with Google App Engine
Deploying applications to Cloud with Google App EngineDeploying applications to Cloud with Google App Engine
Deploying applications to Cloud with Google App Engine
 
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
 
Running Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkRunning Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic Beanstalk
 
Tutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer WorkshopTutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer Workshop
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
Alfresco Development Framework Basic
Alfresco Development Framework BasicAlfresco Development Framework Basic
Alfresco Development Framework Basic
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
 
Nativescript with angular 2
Nativescript with angular 2Nativescript with angular 2
Nativescript with angular 2
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0
 
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
 
Play Framework on Google App Engine
Play Framework on Google App EnginePlay Framework on Google App Engine
Play Framework on Google App Engine
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
 
Web APIs & Apps - Mozilla
Web APIs & Apps - MozillaWeb APIs & Apps - Mozilla
Web APIs & Apps - Mozilla
 
Application Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless WorldApplication Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless World
 
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkDeploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic Beanstalk
 
In Act Developers Platform
In Act Developers PlatformIn Act Developers Platform
In Act Developers Platform
 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
 
Angularjs Tutorial for Beginners
Angularjs Tutorial for BeginnersAngularjs Tutorial for Beginners
Angularjs Tutorial for Beginners
 

More from Keiji Ariyama

Vuzix Developer Conference
Vuzix Developer ConferenceVuzix Developer Conference
Vuzix Developer ConferenceKeiji Ariyama
 
Android Studio開発講座
Android Studio開発講座Android Studio開発講座
Android Studio開発講座Keiji Ariyama
 
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
2015年のAndroidアプリ開発入門 - ABCD 2015 KanazawaKeiji Ariyama
 
Realmの暗号化とAndroid System
Realmの暗号化とAndroid SystemRealmの暗号化とAndroid System
Realmの暗号化とAndroid SystemKeiji Ariyama
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力Keiji Ariyama
 
Vuzix developer conference - M100アプリ開発
Vuzix developer conference - M100アプリ開発Vuzix developer conference - M100アプリ開発
Vuzix developer conference - M100アプリ開発Keiji Ariyama
 
Google Glassアプリ開発と自由度の変遷
Google Glassアプリ開発と自由度の変遷Google Glassアプリ開発と自由度の変遷
Google Glassアプリ開発と自由度の変遷Keiji Ariyama
 
Google Mirror API勉強会 20130607
Google Mirror API勉強会 20130607Google Mirror API勉強会 20130607
Google Mirror API勉強会 20130607Keiji Ariyama
 
これからの"日付変更線"の話をしよう
これからの"日付変更線"の話をしようこれからの"日付変更線"の話をしよう
これからの"日付変更線"の話をしようKeiji Ariyama
 
20130119 adkハンズオン発表資料
20130119 adkハンズオン発表資料20130119 adkハンズオン発表資料
20130119 adkハンズオン発表資料Keiji Ariyama
 

More from Keiji Ariyama (10)

Vuzix Developer Conference
Vuzix Developer ConferenceVuzix Developer Conference
Vuzix Developer Conference
 
Android Studio開発講座
Android Studio開発講座Android Studio開発講座
Android Studio開発講座
 
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
 
Realmの暗号化とAndroid System
Realmの暗号化とAndroid SystemRealmの暗号化とAndroid System
Realmの暗号化とAndroid System
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力
 
Vuzix developer conference - M100アプリ開発
Vuzix developer conference - M100アプリ開発Vuzix developer conference - M100アプリ開発
Vuzix developer conference - M100アプリ開発
 
Google Glassアプリ開発と自由度の変遷
Google Glassアプリ開発と自由度の変遷Google Glassアプリ開発と自由度の変遷
Google Glassアプリ開発と自由度の変遷
 
Google Mirror API勉強会 20130607
Google Mirror API勉強会 20130607Google Mirror API勉強会 20130607
Google Mirror API勉強会 20130607
 
これからの"日付変更線"の話をしよう
これからの"日付変更線"の話をしようこれからの"日付変更線"の話をしよう
これからの"日付変更線"の話をしよう
 
20130119 adkハンズオン発表資料
20130119 adkハンズオン発表資料20130119 adkハンズオン発表資料
20130119 adkハンズオン発表資料
 

Recently uploaded

Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 

Recently uploaded (20)

Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 

Google Cloud Endpointsによる API構築