StringBuilder styles = new StringBuilder(); boolean writeStyles = false; public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if (localName.equalsIgnoreCase("link")) { // If the element currently in queue is a link tag inspect it String href = atts.getValue("href"); String rel = atts.getValue("rel"); if (rel.equalsIgnoreCase("stylesheet")) { String css = ""; // TODO: Load the stylesheet from the JCR, store it with others loaded // so far and append to styles } return; } if (localName.equalsIgnoreCase("style")) { if (atts.getIndex("amp-custom")) { writeStyles = true; // TODO: Use this flag to emit all styles gathered in styles // in the transformer's characters method } return; } contentHandler.startElement(uri, localName, qName, atts); }
<ampJS jcr:primaryType="bmw:ampJSResource" bmw:ampCustomElementTag="[amp-video]"/>
final PageManager pageManager = resource.getResourceResolver().adaptTo(PageManager.class); final String currentPage = pageManager.getContainingPage(resource).getPath() + "/jcr:content"; final String query = String.format("SELECT * FROM [bmw:ampResourceHint] AS s WHERE ISDESCENDANTNODE(s,'%s')", currentPage); final Iterator<Resource> result = resource.getResourceResolver().findResources(query, Query.JCR_SQL2); while (result.hasNext()) { Resource queryResource = result.next(); final String type = queryResource.getParent().getResourceType(); ValueMap properties = queryResource.adaptTo(ValueMap.class); String[] usedComponents = properties.get("bmw:usedAmpComponents", String[].class); if (usedComponents != null && usedComponents.length != 0) { // TODO: Store all used components somewhere for later rendering } }
AdFormat
UNKNOWN
GEO_PERFORMANCE_REPORT
/src
YOUR_API_KEY
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=visualization"></script>
app.js
const apiKey = 'YOUR_API_KEY';
$ python -m SimpleHTTPServer 8000
{ "geometry": { "type": "Point", "coordinates": [-0.1428115, 51.5125168 ] }, "type": "Feature", "properties": { "category": "patisserie", "hours": "10am - 6pm", "description": "Modern twists on classic pastries. We're part of a larger chain of patisseries and cafes.", "name": "Josie's Patisserie Mayfair", "phone": "+44 20 1234 5678", "storeid": "01" } }
{
"geometry": {
"type": "Point",
"coordinates": [-0.1428115,
51.5125168
]
},
"type": "Feature",
"properties": {
"category": "patisserie",
"hours": "10am - 6pm",
"description": "Modern twists on classic pastries. We're part of a larger chain of patisseries and cafes.",
"name": "Josie's Patisserie Mayfair",
"phone": "+44 20 1234 5678",
"storeid": "01"
}
geometry
coordinates
properties
initMap
lat:
lng:
function initMap() { // Create the map. const map = new google.maps.Map(document.getElementById('map'), { zoom: 7, center: {lat: 52.632469, lng: -1.689423}, });
function initMap() {
// Create the map.
const map = new google.maps.Map(document.getElementById('map'), {
zoom: 7,
center: {lat: 52.632469, lng: -1.689423},
});
const input = document.createElement('input'); const options = { types: ['address'], componentRestrictions: {country: 'gb'}, fields: ['address_components', 'geometry', 'name'], }; const autocomplete = new google.maps.places.Autocomplete(input, options);
const input = document.createElement('input');
const options = {
types: ['address'],
componentRestrictions: {country: 'gb'},
fields: ['address_components', 'geometry', 'name'],
};
const autocomplete = new google.maps.places.Autocomplete(input, options);
fields
index.html
<div id="map"></div>
<script>
stores.json
<!DOCTYPE html> <html> <head> <style> /* Set the size of the div element that contains the map */ #map { height: 400px; width: 600px; } </style> </head> <body> <!--The div elements for the map and message --> <div id="map"></div> <div id="msg"></div> <script> // Initialize and add the map var map; function initMap() { // The map, centered on Central Park const center = {lat: 40.774102, lng: -73.971734}; const options = {zoom: 15, scaleControl: true, center: center}; map = new google.maps.Map( document.getElementById('map'), options); // Locations of landmarks const dakota = {lat: 40.7767644, lng: -73.9761399}; const frick = {lat: 40.771209, lng: -73.9673991}; // The markers for The Dakota and The Frick Collection var mk1 = new google.maps.Marker({position: dakota, map: map}); var mk2 = new google.maps.Marker({position: frick, map: map}); } </script> <!--Load the API from the specified URL -- <remember to replace YOUR_API_KEY--> <script async defer src="https://maps.googleapis.com/maps/api/js? key=YOUR_API_KEY&callback=initMap"> </script> </body> </html>
<!DOCTYPE html>
<html>
<head>
<style>
/* Set the size of the div element that contains the map */
#map {
height: 400px;
width: 600px;
</style>
</head>
<body>
<!--The div elements for the map and message -->
<div id="msg"></div>
// Initialize and add the map
var map;
// The map, centered on Central Park
const center = {lat: 40.774102, lng: -73.971734};
const options = {zoom: 15, scaleControl: true, center: center};
map = new google.maps.Map(
document.getElementById('map'), options);
// Locations of landmarks
const dakota = {lat: 40.7767644, lng: -73.9761399};
const frick = {lat: 40.771209, lng: -73.9673991};
// The markers for The Dakota and The Frick Collection
var mk1 = new google.maps.Marker({position: dakota, map: map});
var mk2 = new google.maps.Marker({position: frick, map: map});
</script>
<!--Load the API from the specified URL --
<remember to replace YOUR_API_KEY-->
<script async defer
src="https://maps.googleapis.com/maps/api/js?
key=YOUR_API_KEY&callback=initMap">
</body>
</html>
// Draw a line showing the straight distance between the markers var line = new google.maps.Polyline({path: [dakota, frick], map: map});
// Draw a line showing the straight distance between the markers
var line =
new google.maps.Polyline({path: [dakota, frick], map: map});
function haversine_distance(mk1, mk2) { var R = 3958.8; // Radius of the Earth in miles var rlat1 = mk1.position.lat() * (Math.PI/180); // Convert degrees to radians var rlat2 = mk2.position.lat() * (Math.PI/180); // Convert degrees to radians var difflat = rlat2-rlat1; // Radian difference (latitudes) var difflon = (mk2.position.lng()-mk1.position.lng()) * (Math.PI/180); // Radian difference (longitudes) var d = 2 * R * Math.asin(Math.sqrt(Math.sin(difflat/2)*Math.sin(difflat/2) +Math.cos(rlat1)*Math.cos(rlat2) *Math.sin(difflon/2)*Math.sin(difflon/2))); return d; }
function haversine_distance(mk1, mk2) {
var R = 3958.8; // Radius of the Earth in miles
var rlat1 = mk1.position.lat() * (Math.PI/180);
// Convert degrees to radians
var rlat2 = mk2.position.lat() * (Math.PI/180);
var difflat = rlat2-rlat1; // Radian difference (latitudes)
var difflon = (mk2.position.lng()-mk1.position.lng())
* (Math.PI/180); // Radian difference (longitudes)
var d = 2 * R
* Math.asin(Math.sqrt(Math.sin(difflat/2)*Math.sin(difflat/2)
+Math.cos(rlat1)*Math.cos(rlat2)
*Math.sin(difflon/2)*Math.sin(difflon/2)));
return d;
R = 6371.0710
// Calculate and display the distance between markers var distance = haversine_distance(mk1, mk2); document.getElementById('msg').innerHTML = "Distance between markers: " + distance.toFixed(2) + " mi.";
// Calculate and display the distance between markers
var distance = haversine_distance(mk1, mk2);
document.getElementById('msg').innerHTML
= "Distance between markers: " + distance.toFixed(2) + " mi.";
toFixed
let directionsService = new google.maps.DirectionsService(); let directionsRenderer = new google.maps.DirectionsRenderer(); directionsRenderer.setMap(map); // Existing map object displays directions // Create route from existing points used for markers const route = { origin: dakota, destination: frick, travelMode: 'DRIVING' } directionsService.route(route, function(response, status) { // anonymous function to capture directions if (status !== 'OK') { window.alert('Directions request failed due to ' + status); return; } else { directionsRenderer.setDirections(response); // Add route to the map var directionsData = response.routes[0].legs[0]; // Get data about the mapped route if (!directionsData) { window.alert('Directions request failed'); return; } else { document.getElementById('msg').innerHTML += " Driving distance is " + directionsData.distance.text + " (" + directionsData.duration.text + ")."; } } });
let directionsService = new google.maps.DirectionsService();
let directionsRenderer = new google.maps.DirectionsRenderer();
directionsRenderer.setMap(map); // Existing map object displays directions
// Create route from existing points used for markers
const route = {
origin: dakota,
destination: frick,
travelMode: 'DRIVING'
directionsService.route(route,
function(response, status) { // anonymous function to capture directions
if (status !== 'OK') {
window.alert('Directions request failed due to ' + status);
return;
} else {
directionsRenderer.setDirections(response); // Add route to the map
var directionsData = response.routes[0].legs[0];
// Get data about the mapped route
if (!directionsData) {
window.alert('Directions request failed');
else {
document.getElementById('msg').innerHTML +=
" Driving distance is " + directionsData.distance.text +
" (" + directionsData.duration.text + ").";
"routes": [{ "legs": [ { "distance": { "text": "1.6 mi", value: 2619 }, { "duration": { "text": "9 mins", value: 516 } } } ] }]
"routes": [{
"legs": [
"distance": {
"text": "1.6 mi",
value: 2619
"duration": {
"text": "9 mins",
value: 516
}]
travelMode
BICYCLING
TRANSIT
WALKING
TRANST
GDG Tokyo オーガナイザーの Tomoki Katsu と申します。 私は新卒入社から約 5 年間モバイル、ウェブ、サーバーの各種アプリケーション エンジニア、その後はシステム全体の SE として PL をやったりしていました。今はそのときの経験を生かし、自社製品を用いて各地域の課題を IT の力で解決したり、行政や学校と連携し地域を盛り上げる活動をしています。
エンジニアとして、技術の共有や情報リテラシーの強化をやっていくべきだと考えていました。その考えを持ちながら、いくつかコミュニティのスタッフとして活動していたのですが、仕事が忙しくなり参加できなくなっていました。 仕事が落ち着き、またコミュニティ活動を始めようと思った時、たまたま 2 年ぶりに当時 GDG Tokyo のオーガナイザーをしていた友人と再会し、その際 GDG Tokyo の運営に入らないかとお誘いいただいたのがきっかけです。
人脈は大きく変わりました。今までは、ハッカソン界隈で活動していたのですが、界隈が変われば、参加している人がこんなにも違うのかと思いました。 一番驚いたのは、GDG 石巻の fish さんと、私が一緒に仕事していた企業さんが知り合いだったことと、その、企業さんの一人が GDG Fukushima として GDG に現れたことです。世の中って狭いなーと思いました(笑)。
一番は、大きなイベント運営を体験できたことです。GDG では年に一度 DevFest というコミュニティのカンファレンスを開催しており、去年はその運営に携わらせていただきました。今まで、スタッフとして参加することはあったのですが、1,000 人規模のイベントを開催する経験はなく、大変勉強になりました。
東京には技術コミュニティがたくさんあります。そのため、Google の技術初心者はどこに行けばいいか迷ってしまうと思います。 私はこれを例えるとき、医者にかかりたい時、症状はわかるけど、何科に行けばわからない現象と紹介しています。
GDG は Google の技術を全般的に担っているコミュニティなので、そういう、自分のやりたいことはわかっているけど、どの技術を使えばいいのわからない方に、まずは GDG に来ていただき、情報収集をしていただければと思っています。GDG はそんな方達と各コミュニティをつなぐ、入り口になれればと考えています。
GDG Tokyo は、これから新しい技術をキャッチアップしたり、他のコミュニティを繋ぐ場所になれるよう、技術初学者から上級者の方々まで幅広いユーザーに楽しめる勉強会やイベントを開催していきます。