---
layout: post
title: "Who Were 2016's Most Active Ed-Tech Investors?"
date: 2016-12-26 11:35:00 +0000
tags:
image: https://s3.amazonaws.com/hackedu/2016-12-26-money.jpg
imagecredits: https://www.flickr.com/photos/ersu99/9739629332
---
The following venture capital firms were the most active investors in ed-tech this year:
- Reach Capital – investments include Abl Schools, BetterLesson, ClassDojo, Freshgrade, Gradescope, KickUp, Piper, SchoolMint, Tynker, Volley
- Learn Capital – investments include Andela, CourseHorse, Fluent City, Schoold, SoloLearn, Teachable, VIPKID, Wonder Workshop
- University Ventures – investments include CollegeVine, Credly, Galvanize, Portfolium, Revature, Schoold, UNICAF
- 500 Startups – investments include Noodle Partners, Piper, Platzi, StudySoup, Tinkergarten, Transweb
- Omidyar Network – investments include Andela, Ellevation, Platzi, Skillshare, Spark Schools, Tinkergarten
- Kapor Capital – investments include ClassDojo, CodeSpark, Constant Therapy, SchoolMint, Student Loan Genius
- Sequoia Capital – investments include BYJU’s, Cuemath, Everwise, VIPKID, Zuoyebang
The following individuals were the most active angel investors in ed-tech this year:
- John Katzman (co-founder of The Princeton Review and 2U) – investments include StudySoup, Tabtor Math, Tinkergarten, Tynker
- Deborah Quazzo (founder of GSV Advisors) – investments include Nearpod, Degreed, Handshake, KickUp, Speakaboos, Tynker
The most active investors were not necessarily the ones investing the most money. Of the ten companies that raised over $50 million this year, Sequoia Capital participated in three of those rounds (BYJU’s, VIPKID, Zuoyebang); Lightspeed Venture Partners participated in two (Affirm and BYJU’s). There was just one investor in the largest ed-tech investment this year – the $150 million Iconiq Capital invested in app maker Age of Learning.
Celebrity investments:
- Richard Branson invested in Codecademy
- Kobe Bryant invested in VIPKID
- Mark Cuban and Chris Sacca invested in Brightwheel after the startup appeared on the reality TV show Shark Tank
See also: Peter Thiel’s ed-tech investment portfolio; Mark Zuckerberg’s ed-tech investment portfolio; the Emerson Collective’s ed-tech portfolio; Y Combinator’s ed-tech portfolio; Gates Foundation grant recipients in 2016


Welcome to my website. My name is Howard Vogl. I'm an Assistant Professor in the Graphic Communication Department at Cal Poly State University in San Luis Obispo California. This is my fifth year at Cal Poly and I've enjoyed every minute of my time here.
Where do you go from here?
I believe that lifelong learning is the key to a happy life. Learning something new excites me. Not only is learning exciting, but also it’s the best way to find out about the world around you, and importantly, find out about yourself.
Students often ask me about the path they should take after graduating. To be honest, I don’t know. In fact no one knows, but here are two of my favorite quotes that may give you some perspective.
One should waste as little effort as possible on improving areas of low competence. It takes far more energy and work to improve from incompetence to mediocrity than it takes to improve from first-rate performance to excellence.
—Peter F. Drucker
All paths are the same: they lead nowhere. There are paths going through the bush, or into the bush...Both paths lead nowhere; but one has a heart, the other doesn’t. One makes for a joyful journey; as long as you follow it, you are one with it.  One will make you strong; the other weakens you.
—Carlos Castaneda


Action Required: Angular Tree Component Compatibility Update
The @circlon/angular-tree-component
library that is used to create this example is no longer maintained and is not compatible with Angular 16.
To ensure continued compatibility with Angular 16, we recommend using one of the patched versions of the Angular Tree Component library:
@ali-hm/angular-tree-component
@bugsplat/angular-tree-component
The Tree View component can be created by using the tree-root
tag. It allows tree content to be
displayed
in a familiar Explorer-like format. The component is highly extensible and supports the following features:
The data to be displayed in the Tree View should be set by using the nodes
input on the component. Each
node should have a name
property which will define the text displayed in the node.
A node may have child nodes by adding a children
property to the node object. Additional custom
properties
can also be added to a node object, for example an id
.
Full documentation on how to implement all the features listed above, and more, can be found on the component's website.
The following sample code can be used to create the example shown above:
Dependencies: @circlon/angular-tree-component
Modules: TreeModule
Documentation: Angular Component Documentation


Phonetic Alphabet
A new password trend is phrases all in lowercase. This will create a phrase from a word you provide using the phonetic alphabet.
A new password trend is phrases all in lowercase. This will create a phrase from a word you provide using the phonetic alphabet.


|
TSP Solver
Operations Research Homeworks by Francesco Cazzaro and Marco Cieno
|
Structure to help parsing the command line. More...
#include <tspconf.h>
Structure to help parsing the command line.
This structure is used by parse_opt() to store command line arguments as they are being parsed.
| filename | Name of the TSP file to be parsed. |
| name | Name to assign to this problem. Default: parsed from file. |
| cpxlog | Tune information display. Default: silent. |
| shouldplot | If true, use GnuPlot to draw the tour. Default: yes. |
| solving_method | Model/solver to be used. Default: Dummy Branch and Cut. |
| threads | Number of threads to use. Default: all. |
| memory | Maximum amount of memory (in MB) the program may use. If the program cannot proceed without requesting more memory, it should be terminated. A meaningful value is between 1 and SIZE_MAX. Default: no limit. Notice that if the real system does not have enough memory, the program may be terminated by the OOM Killer. |
| nodelimit | Maximum number of nodes the program may visit. If the program does not find a solution within these nodes, it should be terminated anyway. A meaningful value is between 1 and SIZE_MAX. Default: no limit. |
| timelimit | Maximum number of seconds the program may run. If the program does not terminate within this time, it should be terminated anyway. A meaningful value is between 1 and DBL_MAX. Default: no limit. |
| heurtime | Maximum time to allocate to improve an heuristic solution. |
| cutup | Upper cutoff value for the problem. |
| epgap | CPLEX optimality gap. Default: automatic. |
| seed | CPLEX Random seed. Default: automatic. |


visual module¶
Create colormap based on rank mode
-
class
visual.
MapLayer
(date_time, dest, mode=0)[source]¶ Bases:
folium.folium.Map
Create a MayLAyer based on destination, parking time
-
visual.
color_bar
(mode)[source]¶ Create different colormap for each mode
Parameters: mode (int) – 1: Rate, 2: Occupancy, 3: Recommanded Returns: color map Return type: branca.Colormap
-
visual.
switch_layer
(mode)[source]¶ Switch the function to call to deal with dataset and the property based on the ranking mode
Parameters: mode (int) – 1: Rate, 2: Occupancy, 3: Recommanded Returns: The function to deal with dataset Return type: ‘function’ Returns: The property key to read Return type: str


The moment you use iPhone 6s, you know you’ve never felt anything like it. With a single press, 3D Touch lets you do more than ever before. Live Photos bring your memories to life in a powerfully vivid way. And that’s just the beginning. Take a deeper look at iPhone 6s, and you’ll find innovation on every level.
The original iPhone introduced the world to Multi-Touch, forever changing the way people experience technology. With 3D Touch, you can do things that were never possible before. It senses how deeply you press the display, letting you do all kinds of essential things more quickly and simply. And it gives you real-time feedback in the form of subtle taps from the all-new Taptic Engine.
The 12-megapixel iSight camera captures sharp, detailed photos. It takes brilliant 4K video, up to four times the resolution of 1080p HD video. iPhone 6s also takes selfies worthy of a self-portrait with the new 5-megapixel FaceTime HD camera. And it introduces Live Photos, a new way to relive your favorite memories. It captures the moments just before and after your picture and sets it in motion with just the press of a finger.
iPhone 6s is powered by the custom-designed 64-bit A9 chip. It delivers performance once found only in desktop computers. You’ll experience up to 70 percent faster CPU performance, and up to 90 percent faster GPU performance for all your favorite graphics-intensive games and apps.
Innovation isn’t always obvious to the eye, but look a little closer at iPhone 6s and you’ll find it’s been fundamentally improved. The enclosure is made from a new alloy of 7000 Series aluminum — the same grade used in the aerospace industry. The cover glass is the strongest, most durable glass used in any smartphone. And a new rose gold finish joins space gray, silver, and gold.
| iPhone 6s | iPhone 6s Plus | |
|---|---|---|
| Capacity |
16GB 64GB 128GB |
16GB 64GB 128GB |
| Weight and Dimensions |
5.44 inches (138.3 mm) x 2.64 inches (67.1 mm) x 0.28 inch (7.1 mm) Weight: 5.04 ounces (143 grams) |
6.23 inches (158.2 mm) x 3.07 inches (77.9 mm) x 0.29 inch (7.3 mm) Weight: 6.77 ounces (192 grams) |
| Display |
Retina HD display with 3D Touch 4.7-inch (diagonal) LED-backlit widescreen 1334-by-750-pixel resolution at 326 ppi 1400:1 contrast ratio (typical) Both models: 500 cd/m2 max brightness (typical) Full sRGB standard Dual-domain pixels for wide viewing angles Fingerprint-resistant oleophobic coating on front Support for display of multiple languages and characters simultaneously Display Zoom Reachability |
Retina HD display with 3D Touch 5.5-inch (diagonal) LED-backlit widescreen 1920-by-1080-pixel resolution at 401 ppi 1300:1 contrast ratio (typical) |
| Chip | A9 chip with 64-bit architecture Embedded M9 motion coprocessor | |
| iSight Camera |
New 12-megapixel iSight camera with 1.22µ pixels Live Photos Autofocus with Focus Pixels Optical image stabilization (iPhone 6s Plus only) True Tone flash Panorama (up to 63 megapixels) Auto HDR for photos Exposure control Burst mode Timer mode ƒ/2.2 aperture Five-element lens Hybrid IR filter Backside illumination sensor Sapphire crystal lens cover Auto image stabilization Improved local tone mapping Improved noise reduction Face detection Photo geotagging |
|
| Video Recording |
4K video recording (3840 by 2160) at 30 fps 1080p HD video recording at 30 fps or 60 fps 720p HD video recording at 30 fps Optical image stabilization for video (iPhone 6s Plus only) True Tone flash Slo-mo video support for 1080p at 120 fps and 720p at 240 fps Time-lapse video with stabilization Cinematic video stabilization (1080p and 720p) Continuous autofocus video Improved noise reduction Take 8MP still photos while recording 4K video Playback zoom 3x zoom Face detection Video geotagging |


|
: |
| % | / | % |
-
The Seventh Report of the Joint National Committee on Prevention, Detection, Evaluation, and Treatment of High Blood Pressure, NIH obtained 8 March 2012 (http://www.nhlbi.nih.gov/guidelines/hypertension/jnc7full.htm)
-
The Fourth Report on the Diagnosis, Evaluation, and Treatment of High Blood Pressure in Children and Adolescents National Heart, Lung, and Blood Institute, NIH obtained 6 April 2011 (http://www.nhlbi.nih.gov/health/prof/heart/hbp/hbp_ped.pdf)
-
CDC Clinical Growth Charts obtained 6 April 2011 ( Charts, Data, Length, Stature )


---
layout: base
lastmod: 2023-03-31
title: "Blog"
description: "Find all my latest blog posts about development, 3D, games and my hobbies and interests."
---
{{ title }}
{%- for post in collections.post | reverse %}
{% from 'components.njk' import badge with context %} {{
badge(post.data.series) }}


COLLECTION OF DISRUPTIVE INFORMATION
Here you will find an array of
data
I've gathered on pivitol research, cutting edge technology and discovery in the academic world, and a plethora of datasets covering active flights to consciousness and space weather.
Take your time, its all you have.
Peer-Reviewed
Research
Manipulation of Extra Dimensions
PRIME DATA
Asymmetrical Capacitors for Propulsion
Relativistic Propulsion
PRIME DATA
Entanglement of Photons within Living Systems
Propulsion Based on Vacuum Engineering
AAV Executive Report
PRIME DATA
Photonic Coherence in Microtubules
Human electromagnetic emission in the ELF band
Schumann Values in Microtubules
Emission of Mitochondrial Biophotons
Prespacetime-Premomentumenergy
Unified Theory of Bivacuum
Evolving Deep Neural Networks
Conformal Quasicrystals and Holography
Dark Energy from Ratio Gravity
Quantum Ground States as Equilibrium
(Spacetime Metric) Engineering
PRIME DATA
Challenging local realism via choice
CCC and the Fermi paradox
Chaotic Cyclic Cosmology
Nontensorial Gravitational Waves
Modeling the Collective Participant
Plasma Brain Dynamics
Queries in Intelligent Systems
Entanglement in Visual Perception
A possible extension of belief function
Quantum information in quantum cognition
Brain as n-qudit Quantum Hopfield Network
Gravity and the Standard Model in E8
Benefactor
Organizations
Earthtech International
Stuart Hameroff ORCH OR
To The Stars Academy
The Grand Integrator
Quantum Gravity Research
Huping Hu's Quantum Brain
Electromagnetic Mind
AGGREGATE
Nima Arkani-Hamed Homepage
JASON Defense Technical Reports
AGGREGATE
NRG Excess Corolation Device
Dr. Michael Persinger
Jack Sarfatti Stardriveb class="hl"> AGGREGATE
Roger Penrose Institute
Christof Koch’s Home Page
bigelow aerospace
Displacement Field Technologies Inc.
Cannae Technologies Inc
Satellite Propulsion Research
Svalbard Global Seed Vault
Live Environmental
Metrics
Wildfires
Earthquakes
Atmosphere
Solar Magnetogram
Space Weather | Radio
Geomagnetic
Population
Financial
Aviation
Schumann Archive
Schumann Resonance
Consciousness
Hacking
return to links


Reverse Z
I recently switched the depth buffers in Flex Engine to use “reversed Z” due to the precision benefits it provides. The default way of encoding depth is from 0.0 to 1.0 as objects get further from the camera. One reason to reverse this is to spread the depth precision out more evenly across the distance of your scene. Using the default encoding, floating point precision combined with a non-linear depth results in lots of precision right next to the near plane, and little precision as things get farther away. See this for a more in-depth explanation. I also found a great explanation of the perspective projection here, which was a great refresher.
The four steps (five for OpenGL) involved in swapping to reversed Z are as follows:
- Swap near and far plane values
- Use greater than or equal as a depth comparison rather than less than or equal to (e.g. GL_GEQUAL or VK_COMPARE_OP_GREATER_OR_EQUAL in OpenGL or Vulkan respectively)
- Clear the depth value to 0.0 at the start of each frame rather than 1.0
- Ensure your depth buffer is using a floating point format
- If using OpenGL, call “glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE)” to make the depth clip range [0, 1] rather than the default of [-1, 1]. (Note that this function is provided in the “GL_ARB_clip_control” extension, which became core in version 4.5)
This change doesn’t make a visually noticeable difference, but it does allow for a lower precision depth buffer, and it should reduce the chances of any z-fighting issues for triangles with very similar positions, especially in shaders with a lot of calculations, and therefore potentially a lot of rounding errors.


What is Meteor Launcher?
Meteor Launcher is a multi-platform desktop app to help Meteor developers create, manage, launch and build multiple Meteor projects easily.
Features
- Multiplatform! This app runs in Windows, Linux and OS X
- Friendly user interface to manage all your projects from one app.
- Configure and customize your project settings
- Create a new empty Meteor Application in a new folder
- Add existing Meteor applications located in your computer
- Control the execution of your project with real-time logs
- Add or remove platforms to run in Android and iOS
- Add or remove packages from Atmosphere or NPM to your project
- Build your application to publish in your server, Android Market o iOS Store
- Open a terminal directly in the project working directory for advanced functionalities
Screenshots
Installation
IMPORTANT!! First of all you need to install Meteor in your computer. Otherwise, this application will not work. You can install Meteor following the steps in the official site.
On Windows
Execute the installer and follow the steps.
On Linux (Ubuntu)
Extract the zip file in the folder
$ unzip meteor_launcher_linux64_1.1.0.zip -d /opt
Copy the launcher file in shared applications
$ sudo cp /opt/meteorlauncher/meteorlauncher.desktop /usr/share/applications
Now you can open the app directly from Unity.
On Mac OS X
Extract the zip file and copy the app to your Applications folder.
Next steps
- Run app in production mode for testing before build
- Button to create Meteor examples in empty directories
- Button to check package updates and update them
- Button to reset Meteor Project
- Button to update Meteor Project
- Use settings.json file on run
- General settings
- And much more...
Last changes
10/08/2015 :: Pre-release version (BETA) 12/05/2015 :: Adding New Dev Branch 12/06/2015 :: Adding Compass configuration 12/06/2015 :: Update Compass files 10/21/2016 :: Process Bug Fixing 10/23/2016 :: Releasing version 1.0 10/25/2016 :: Update NWJS and Some Bug Fixing 22/12/2016 :: Improve Process Log 26/12/2016 :: Button for clear the log 04/01/2017 :: List project platforms and packages 14/01/2017 :: Adding and removing platforms from project 27/01/2017 :: Adding and removing packages from project 28/01/2017 :: Create new projects directly from the interface 28/01/2017 :: Update NWJS to version 0.20.0 29/01/2017 :: Build projects to output folder 29/01/2017 :: Releasing version 1.1.0
Support this project
If you think this project is useful, you can buy me a beer doing click on the donation button or you can take part on this project through GitHub.
You can also contact me by sending an email to necro_txilok[at]hotmail.com.


Page under construction
IDS and Web Wipe Cassettes
IDS and Web Wipe Cassettes
IDS and Web Wipe Cassettes
IDS and Web Wipe Cassettes
IDS and Web Wipe Cassettes
Press Exhaust Parameters
Ink Delivery System (IDS) Ink Pressures with Pumps Off
BA Print Bars for Leaks
Vent Lines for Blockages
IDS Ink Trap
Press Exhaust Parameters
Ink Delivery System (IDS) Ink Pressures with Pumps Off
BA Print Bars for Leaks
Vent Lines for Blockages
IDS Ink Trap
Press Exhaust Parameters
Ink Delivery System (IDS) Ink Pressures with Pumps Off
BA Print Bars for Leaks
Vent Lines for Blockages
IDS Ink Trap
Press Exhaust Parameters
Ink Delivery System (IDS) Ink Pressures with Pumps Off
BA Print Bars for Leaks
Vent Lines for Blockages
IDS Ink Trap
Press Exhaust Parameters
Ink Delivery System (IDS) Ink Pressures with Pumps Off
BA Print Bars for Leaks
Vent Lines for Blockages
IDS Ink Trap
Bottom of the Print Bars and Check Cap Plates
Antistatic Bar
IDS Ink Trap
Bottom of the Print Bars and Check Cap Plates
Antistatic Bar
IDS Ink Trap
Bottom of the Print Bars and Check Cap Plates
Antistatic Bar
IDS Ink Trap
Bottom of the Print Bars and Check Cap Plates
Antistatic Bar
IDS Ink Trap
Bottom of the Print Bars and Check Cap Plates
Antistatic Bar
IDS Ink Trap
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
DFE Rack for Component Warnings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
DFE Rack for Component Warnings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
DFE Rack for Component Warnings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
DFE Rack for Component Warnings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
DFE Rack for Component Warnings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Air Filters
Rollers to Remove Oil from Bearings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Air Filters
Rollers to Remove Oil from Bearings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Air Filters
Rollers to Remove Oil from Bearings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Air Filters
Rollers to Remove Oil from Bearings
Rollers
Nip Rollers
IPC Rollers, and Line Light
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Air Filters
Rollers to Remove Oil from Bearings
Corrosion and remove it
Corrosion and remove it
Corrosion and remove it
Corrosion and remove it
Corrosion and remove it
Corrosion and remove it
IPC Rollers, and Line Light
Dryer Chamber
Corrosion and remove it
IPC Rollers, and Line Light
Dryer Chamber
Corrosion and remove it
IPC Rollers, and Line Light
Dryer Chamber
Corrosion and remove it
IPC Rollers, and Line Light
Dryer Chamber
Corrosion and remove it
IPC Rollers, and Line Light
Dryer Chamber
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing
Dryer Chamber
BA Aerosol Duct
Aerosol Filter and Housing


sealed class NextActionData : StripeModel
DisplayOxxoDetails |
data class DisplayOxxoDetails : NextActionData |
RedirectToUrl |
Contains instructions for authenticating by redirecting your customer to another page or application. data class RedirectToUrl : NextActionData |
SdkData |
When confirming a PaymentIntent or SetupIntent with the Stripe SDK, the Stripe SDK depends on this property to invoke authentication flows. The shape of the contents is subject to change and is only intended to be used by the Stripe SDK. sealed class SdkData : NextActionData |


{% extends 'layout.html' %} {% block pageTitle %} NHS.UK information architecture prototype kit {% endblock %} {% block beforeContent %} {% endblock %} {% block content %}
Use the IA manual to build consistent, usable and findable websites and digital products.


Can you record a script specifically for my situation?
YES
Email me your situation, what the issues are, and what your ideal result will be.
All fields are required, unless you have chosen a quick option*
Altered States, Inc.
879 Laurel WayArnold, MD 21012
(888) 555-5555


Currently this is a scratch pad for documentation. I hope to eventually either incorporate buildable markdown doco into the source tree or find a more obvious and permanent home.
The Image Factory is intended to be a general purpose and extensible component for building machine images (sometimes referred to as appliances). It is initially being targeted towards building Linux images for public and private clouds. At present it can build Linux images for EC2, Rackspace, RHEV-M, VMWare and raw KVM. Over time the goal is to provide support for additional OS types, including Windows, and additional targets including both raw virtual machines and bare metal.
The Image Factory uses an XML Input Descriptor (aka a Template or TDL) when creating builds. The process of creating an image is logically divided into two distinct steps.
1) "Building" an image for a particular cloud type (eg EC2 or VMWare) referred to as the "target".
2) "Pushing" an image to a specific instance or region of a cloud (eg, EC2 us-east 1 or an individual VMWare cluster) referred to as the "provider".
Depending on the type of cloud and the style of build selected the above steps may involve creating and then uploading a binary image or they may involve launching and then modifying an existing image to match the Template and then saving the result.
In all cases a second component, the Image Warehouse, is currently used to store both binary data (where appropriate) as well as metadata representing details of the images being built and the providers to which they are pushed.
The Factory can be driven via a built-in command line tool, a command line tool "aeolus-image" provided as part of the Conductor component or using a QMF interface.
The best way to start using the Image Factory tool is to install all the components of the Aeolus project. This will install both the Image Factory and the Image Warehouse as well as the optional aeolus-image command line tool and the Conductor web interface for launching images on a variety of clouds. Instructions for how to do this can be found on the Aeolus project web site at this link:
http://www.aeolusproject.org/get_it.html
After installing the Conductor component and configuring your cloud accounts, you can build images using the aeolus-image command line tool.
To make basic use of the Image Factory you must install and configure an Image Warehouse as well as a number of Factory dependencies.
Packaged releases of the Factory and its dependencies can be found here:
http://repos.fedorapeople.org/repos/aeolus/image-factory/
Recent releases of the Warehouse are available as the "iwhd" packages available in the "testing" and individual versioned release directories for the Aeolus project here;
http://repos.fedorapeople.org/repos/aeolus/conductor/
The exact model used when passing objects between the Factory, Warehouse and Conductor has evolved somewhat over time. As of the 0.4.0 release the model is loosely based on this mailing list post:
https://fedorahosted.org/pipermail/aeolus-devel/2011-May/001667.html
We are in the process of refining the model and clarifying how it relates to the aeolus-image command. That discussion can be found here:
https://fedorahosted.org/pipermail/aeolus-devel/2011-July/003311.html
The general behaviour of the Image Factory is controlled by a configuration file. The default location for this file is /etc/imagefactory/imagefactory.conf. Here is an example:
{ "warehouse": "http://localhost:9090/", "image_bucket": "images", "build_bucket": "builds", "target_bucket": "target_images", "template_bucket": "templates", "icicle_bucket": "icicles", "provider_bucket": "provider_images", "imgdir": "/var/tmp", "ec2_build_style": "upload", "ec2_ami_type": "s3" }
The individual elements of this file are described below.
Starting with commit 057e66 we have introduced initial support for specifying target-specific packages and repositories outside of the TDL passed in to the build command. For now, you must specify this information in a local config file on your Factory host. This file must be /etc/imagefactory/target_content.xml. The file looks like this:
<template_includes> <include target='ec2' os='Fedora' version='14' arch='x86_64'> <packages> <package name='oz'/> </packages> <repositories> <repository name='oz-repository'> <url>http://repos.fedorapeople.org/repos/aeolus/oz/0.6.0/packages/fedora-14/x86_64/</url> </repository> </repositories> </include> <include target='rhevm' os='RHEL'> <packages> <package name='rhev-fedora-generic-package'/> </packages> <repositories> <repository name='rhev-repo'> <url>http://rhev.repo.com/</url> </repository> </repositories> </include> </template_includes>
Each <include> tag can specify, in increasing order of specificity, a target, an OS, a version and an architecture. The Factory will search, from most specific to least specific, for an include block that matches the build it has been asked to perform. If it finds one, it merges the package and repositories content within the tag with the information already present in the TDL passed to the build request. At present, packages and repos with the same name are overridden by this include file.
An expected use case for this features is the installation of VMWare tools and the equivalent RHEV-M packages on all images built for those targets.
Support for build-time specification of this information is pending.
Some cloud provider types, such as VMWare, RHEV-M and EC2 support directly uploading complete binary disk images. For these clouds, the Image Factory creates a full system image locally and then uploads it to the cloud provider instance using the appropriate format and tools. The process of creating the image content is done during the "build" step and the actual uploading (along with any required format change or bundling) is done in the "push" step.
This process is sometimes referred to using the shorthand of "upload style" builds and the associated cloud targets as "upload style clouds".
Other clouds, such as Rackspace, do not support direct uploads. These types of clouds instead provide a collection of minimal images that users can modify as well as API calls to "snapshot" the state of a modified instance and turn it back into an image. For these clouds the Image Factory creates a place holder "image" object during the "build" step. When a user then requests a "push" the Factory selects an appropriate pre-existing minimal (aka JEOS) image, launches it, modifies it to match the package list in the template and then "snapshots" the result as a new image.
This process is sometimes referred to as a "snapshot style" build and the associated cloud targets as "snapshot style clouds".
Note that is usually possible to produce snapshot style builds on an upload style cloud. Currently the factory supports this only on EC2. The build style used for EC2 images is controlled by the ec2_build_style configuration option described above.
Building for VMWare VSphere (ESX) instances is supported using the cloud target name of "vsphere". Individual VMWare providers must be listed in a configuration file at /etc/imagefactory/vsphere.json. Here is an example:
{"user_selected_name": {"api-url": "https://vsphere.office.redhat.com/sdk", "datastore": "datastore1", "network_name": "VM Network" } }
At present, you must specify the name of an existing Datastore and Virtual Network to be used when uploading the image.
Building for RHEV-M instances is supported using the cloud target name "rhevm". Individual RHEV-M providers must be listed in a configuration file at /etc/imagefactory/rhevm.json. Here is an example:
{"user_selected_name": {"nfs-dir": "/home/vdsm/v1", "nfs-path": "/home/vdsm/v1", "nfs-host": "nfs-server.redhat.com", "cluster": "_any_", "api-url": "http://rhevm-server.redhat.com/rhevm-api", "timeout": 1800 } }
The push step for RHEV-M providers is currently executed by the Image Warehouse and requires the use of an NFS share visible to both the RHEV-M server and the machine hosting the Image Warehouse.
NOTE: RHEV-M is currently the only cloud type for which iwhd executes pushes. Provider pushes for all other clouds are done within the Factory and use Warehouse only for storage.
Detailed setup instructions can be found in the Warehouse source tree markdown documentation on registration here:
http://git.fedorahosted.org/git/?p=iwhd.git;a=blob;f=doc/registrations.md;hb=HEAD
The rough process is as follows:
1) Create an NFS share with sufficient space for your images and mountable by both the RHEV-M server and the Factory host (note that the Factory host itself can be used as the server). Ensure that the mount point is owned by UID/GID 36:36.
2) Create an "export domain" in RHEV-M that points to the share created above
3) Populate the configuration file above. The fields need to be set as follows
Note that the timeout must be set in the config file if using iwhd 0.99 with a factor version earlier than 0.8.0
With Factory 0.8.0 and newer this value will be set to 1800 seconds if not specified in the configuration file.
Note that the "user_selected_name" given to the provider must match what is used in Conductor.
TDL is the format used to describe the image being built. It is used primarily by the underlying Oz tool to create and customize disk images. The Factory itself typically only reads the TDL to determine the specific OS and version being built.
The full documentation for Oz can currently be found here:
http://aeolusproject.org/oz.html
Below is an example TDL file for building Fedora 13:
<template version="1.0"> <name>f13-samepletdl</name> <description>Fedora 13 32 bit - Example Template</description> <os> <name>Fedora</name> <version>13</version> <arch>i386</arch> <install type='url'> <url>http://fedora-mirror-site.com/install_trees/fedora/F-13/GOLD/Fedora/i386/os/</url> </install> <rootpw>changeme</rootpw> </os> <repositories> <repository name='signed-custom-repo'> <url>http://custom-package-site.redhat.com/repos/unsigned_custom_repo/</url> <signed>True</signed> </repository> <repository name='unsigned-custom-repo'> <url>http://custom-rpackage-site2.redhat.com/repos/signed_custom_repo/</url> <signed>False</signed> <persisted>False</persisted> </repository> </repositories> <packages> <package name='kernel-PAE'/> <package name='euca2ools'/> <package name='imgfacsnapinit'/> </packages> <files> <file name='/etc/rock.it'> This is a custom configuration file. </file> <file name='/tmp/binary_file' type='base64'> VGhpcyBpcyBhbiBlbmNvZGVkIGZpbGUK </file> </files> <commands> <command name="test"> echo "hello" > /var/lib/foo.bar </command> </commands> </template>
This example contains all currently supported elements of TDL. Some line-by line detail:
<install type='iso'> <iso>http://download.devel.redhat.com/released/F-14/GOLD/Fedora/i386/iso/Fedora-14-i386-DVD.iso</iso> </install>
<package name="@my_repo_group"/>


(Deprecated API)
(Deprecated API)
(Deprecated API)
Includes enterprise licensing and support
Note: The Google Mapplets API has been officially deprecated as of May 19, 2010. Existing Mapplets will continute to be supported, but no new Mapplets will be accepted into the Mapplets Gallery.
The Google Mapplets API is regularly extended, adding new functionality and features that are often released on maps.google.com first. This section covers these services. Note: because the definition of a "service" is somewhat elusive, this section is somewhat of a catch-all. Basically, this section is where we put all of those neat things that we couldn't put anywhere else.
The setprefs
feature of the Google Gadgets API allows you store user state in-between sessions.
To use it, your Mapplet should include:
<Require feature="setprefs"/>
tag (under
<ModulePrefs>
) to tell the gadget to load the
setprefs
library.<UserPref>
tag inside the Mapplet spec
whose value you want to set programmatically and store persistently.
If you give this userpref a datatype of hidden
, then the
user will not be allowed to directly edit it._IG_Prefs(__MODULE_ID__)
constructor.
This object has methods for getting and setting preferences.For more information on manipulating user preferences, see the Working with Userpref Data Types section of the Google Gadgets API documentation.
The following example has buttons for incrementing a counter and resetting the counter. If you reload the Mapplet, you'll notice that the value of the counter persists between sessions for that user.
<?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="Set Userprefs Demo"> <Require feature="sharedmap" /> <Require feature="setprefs" /> </ModulePrefs> <UserPref name="counter" default_value="0" datatype="hidden"/> <Content type="html"> <![CDATA[ <input type=button value="Increment Counter" onClick="incrementCounter();"> <input type=button value="Reset Counter" onClick="resetCounter();">
  ]]> </Content> </Module>
Run this example (setprefs.xml)
Geocoding is the process of converting addresses (like "1600 Amphitheatre Parkway, Mountain View, CA") into geographic coordinates (like latitude 37.423021 and longitude -122.083739), which you can use to place markers or position the map.
You can access the Mapplets API geocoder via the GClientGeocoder
object. Use GClientGeocoder.getLatLng()
to convert a string address into
a GLatLng
. This method takes as parameters a string address to convert,
and a callback function to execute upon retrieval of the address. The callback function is
necessary since geocoding involves sending a request to Google's servers and
can take some time.
In this example, we geocode an address, add a marker at that point, and open an info window displaying the address. Note that the callback is passed as a function literal.
var map = new GMap2(); var geocoder = new GClientGeocoder(); showAddress("76 9th ave new york"); function showAddress(address) { geocoder.getLatLngAsync( address, function(latlng) { if (!latlng) { alert(address + " not found"); } else { map.setCenter(latlng, 15); var marker = new GMarker(latlng); map.addOverlay(marker); marker.openInfoWindowHtml(address); } } ); }
Run this example (geocoding-simple.xml)
If you need to access the geocoder from outside a Mapplet, then please see the Geocoding via HTTP section of the standard Google Maps API.
If you would like to access structured information about an address,
GClientGeocoder
also provides a getLocations()
method that returns a JSON object consisting of the following information:
Status
request
-- The request type. In this case, it is always
geocode
.code
-- A response code (similar to HTTP status codes)
indicating whether the geocode request was successful or not.
See the full list of status codes.Placemark
-- Multiple placemarks may be returned
if the geocoder finds multiple matches.
address
-- A nicely formatted and properly capitalized version of the address.AddressDetails
-- The address formatted as xAL, or
eXtensible
Address Language, an international standard for address formatting.Accuracy
-- An attribute indicating how accurately we
were able to geocode the given address. See a
list of possible values.Point
-- A point in 3D space, consisting of a
coordinates
value -- The longitude, latitude, and
altitude of the address. In this case, the altitude is always set to 0.Here we show the JSON object returned by the geocoder for the address of Google's headquarters:
{ "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA", "Status": { "code": 200, "request": "geocode" }, "Placemark": [ { "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", "AddressDetails": { "Country": { "CountryNameCode": "US", "AdministrativeArea": { "AdministrativeAreaName": "CA", "SubAdministrativeArea": { "SubAdministrativeAreaName": "Santa Clara", "Locality": { "LocalityName": "Mountain View", "Thoroughfare": { "ThoroughfareName": "1600 Amphitheatre Pkwy" }, "PostalCode": { "PostalCodeNumber": "94043" } } } } }, "Accuracy": 8 }, "Point": { "coordinates": [-122.083739, 37.423021, 0] } } ] }
In this example, we use the getLocations()
method to geocode
addresses, and extract the nicely formatted version of the address and the
two-letter country from the JSON and display it in the info window.
var map = new GMap2();; map.setCenter(new GLatLng(34, 0), 1); var geocoder = new GClientGeocoder();; function addAddressToMap(response) { map.clearOverlays(); if (!response || response.Status.code != 200) { alert("\"" + address + "\" not found"); } else { place = response.Placemark[0]; point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]); marker = new GMarker(point); map.addOverlay(marker); marker.openInfoWindowHtml(place.address + '
' + 'Country code: ' + place.AddressDetails.Country.CountryNameCode); } } // showLocation() is called when you click on the Search button // in the form. It geocodes the address entered into the form // and adds a marker to the map at that location. function showLocation() { var address = document.forms[0].q.value; geocoder.getLocationsAsync(address, addAddressToMap); } // findLocation() is used to enter the sample addresses into the form. function findLocation(address) { document.forms[0].q.value = address; showLocation(); }
Run this example (geocoding-extraction.xml)
All the calls in the Working with Remote Content section of the Gadgets API documentation work inside Mapplets:
_IG_FetchContent(url, callback)
-- Returns the content at url
as text.
Use this function to fetch HTML or plain text content._IG_FetchXmlContent(url, callback)
-- Returns and operates on the XML content at
url
as a DOM object. Use this function to fetch XML content which must be parsed.Suppose you had the following XML file (located at http://mapgadgets.googlepages.com/cta_red.xml) which lists the coordinates of the Chicago Transit Authority red train line. The points that have names are where stations are located.
<?xml version="1.0" encoding="UTF-8" ?> <points> <point lng="-87.67283499240875" lat="42.019110918045044">Howard</point> <point lng="-87.66907453536987" lat="42.01585473134908">Jarvis</point> <point lng="-87.66744375228882" lat="42.014483688722116" /> <point lng="-87.66716480255127" lat="42.014228607763144" /> <point lng="-87.66695022583008" lat="42.01400541108485" /> <point lng="-87.66682147979736" lat="42.01379815632509" /> <point lng="-87.66662836074829" lat="42.01357495813621" /> <point lng="-87.66645669937134" lat="42.0133198735327" /> <point lng="-87.66634941101074" lat="42.013080730787806" /> <point lng="-87.66611337661743" lat="42.01263432859157" /> <point lng="-87.6660704612732" lat="42.012283581810934" /> <point lng="-87.66602754592896" lat="42.01188500357604" /> <point lng="-87.66602754592896" lat="42.008010693009815">Morse</point>  </points>
The following example uses _IG_FetchXmlContent()
to download and parse the
XML file, and then draws the train line and adds markers for each station.
var map = new GMap2(); // Go to Chicago map.setCenter(new GLatLng(41.882853, -87.642059), 11); // Render the red train line and stations from a remote XML file var url = "http://mapgadgets.googlepages.com/cta_red.xml"; _IG_FetchXmlContent(url, function(response) { var trainline = []; var points = response.getElementsByTagName("point"); for (var i = 0; i < points.length; i++) { var point = points.item(i); var lat = point.getAttribute("lat"); var lng = point.getAttribute("lng"); var latlng = new GLatLng(lat, lng); trainline.push(latlng); if (point.firstChild) { var station = point.firstChild.nodeValue; var marker = createMarker(latlng, station); map.addOverlay(marker); } } var polyline = new GPolyline(trainline, "#ff0000", 3, 1); map.addOverlay(polyline); }); // Creates a marker at the given point with the given name function createMarker(point, name) { var marker = new GMarker(point); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(name); }); return marker; }
Run this example (remotecontent.xml)
Note: The _IG_FetchContent
and _IG_FetchXmlContent
calls
automatically cache the content to reduce the load on your servers. See the
Refreshing the Cache section of the Gadgets API documentation for information
on how to change the cache duration or disable caching.
Rather than adding points using Javascript, we recommend that you instead store your data
in the KML or
GeoRSS data formats. These data formats are
added to a map using the GGeoXml
object, whose constructor takes
the URL of a publicly accessible XML file. GGeoXml
placemarks are
rendered as GMarker
s, while GGeoXml
polylines and
polygons are rendered as Google Maps API polylines and polygons.
<GroundOverlay>
elements within KML files are
rendered as GGroundOverlay
elements on the map.
GGeoXml
objects are added to a map using the addOverlay()
method. (You can remove them from the map using removeOverlay()
.)
Both KML and GeoRSS XML files are supported.
The following example displays all the Chicago Transit Authority train lines from
http://mapgadgets.googlepages.com/cta.kml
(view in
Google Maps). Notice how much simpler this is than the above example which uses _IG_FetchXmlContent
.
var map = new GMap2(); var geoXml = new GGeoXml("http://mapgadgets.googlepages.com/cta.kml"); map.setCenter(new GLatLng(41.882853, -87.642059), 11); map.addOverlay(geoXml);
Run this example (ggeoxml.xml)
You can add driving directions to your Mapplets by using the GDirections
object. The GDirections
objects requests and receives direction results using either
query strings (e.g. "New York, NY to Chicago, IL") or provided textual lat/lons (e.g. "40.712882,
-73.967257 to 41.943181,-87.770677"). The GDirections
object also supports multi-part
driving directions using a series of points. Directions may be displayed as either a polyline
drawing the route on a map or retrieved as a JSON structure.
To use directions in the Google Maps API, create an object of type GDirections
and
designate a GMap2
object to receive and display results. By default, the
map is centered and bounded by the returned route(s) (though you can change this with parameters
within a GDirectionOptions
object).
Driving directions are requested using the GDirections.load()
method. This method
takes a query string and a set of optional GDirectionsOptions
parameters. If the
GDirections
object was constructed with a supplied GMap2
object, then
the returned directions will contain a polyline overlay.
Note that the directions object is not populated with this return information immediately. For this reason,
the GDirections
object defines a "load" event which you can intercept to determine this state.
Once directions are returned, the GDirections
object will internally store
results which you can retrieve using GDirections.getPolyline()
and/or
GDirections.getRoute(i:Number)
methods. Steps within a route can be retrieved
using the GRoute.getStep(i:Number)
method and the HTML summary of that step can be
retrieved using GStep.getDescriptionHtml()
.
// Create a directions object and register a map to hold the // resulting computed directions var map; var directions; function initialize() { map = new GMap2(); map.setCenter(new GLatLng(49.496675,-102.65625), 3); directions = new GDirections(map); directions.load("New York, NY to Chicago, IL"); }
The GDirections
object also supports multi-point directions,
which can be constructed using the GDirections.loadFromWaypoints()
method. This method takes an array of textual input addresses or textual
lat/lon points. The directions from each sequence of waypoints is computed
as a separate route and returned in a separate GRoute
object,
each of which contains a series of GStep
objects.
GRoute
objects store the number of steps (of type
GStep
) for that route, the starting and ending geocode
for that route, and other computed information such as distance, duration,
and exact lat/lon of the endpoint (which may be different than the ending
geocode if the geocode does not lie on a road segment). Each GStep
object also contains the description for that text (e.g.
"Merge onto US-101 S via the ramp to San Jose") plus computed information
including the distance, duration, and exact lat/lon as well.
The GDirections
object fires three events which you can intercept:
load
": This event is triggered when a directions result successfully returns,
but before any overlay elements are added to the map.addoverlay
": This event is triggered after the polyline directions
components are added to the map.error
": This event is triggered if a directions request
results in an error. Callers can use GDirections.getStatus()
to
get more information about the error.For full documentation of the various objects, methods and events in the Directions API package, consult the API Reference.


Emergency Re-Router
Add Elements
Destination:
Obstacle:
Choose Service:
Fire
Police
Medical
Map Area


Across: 7. Ask for help behind small floral arrangement (5) 8. Cycling party sent to Welsh town (9) 9. Pointless brevity holds back words of action (5) 10. Declaration by people from Utah may be on time (9) 12. Wandering Scot follows setter belonging to French family (11) 16. Get boring friend to start laughing (4) 17. Time taken out initially to muse (5) 18. Dines with every adult tasting scampi starters (4) 19. Princess has heard about half-butter spread (11) 22. Doctor nor hero is loco! (4 5) 24. Upstart gets in small measure of drink (5) 25. Suspension of charge involving better half (9) 26. Feeling satisfaction when dropout gets in University (5) Down: 1. Impermanent record one has left about queen being on edge (9) 2. Fool, scholar and doctor reject the Spanish beastly place (9) 3. Document humour about reigning leader (4) 4. Problem with birds’ and stoats’ pics I developed (11) 5. Hello? Mother is hot stuff! (5) 6. No sly criminal seen in French city (5) 11. Church supports saver getting current type of trousers (11) 13. A six-footer in the army – or someone much taller? (5) 14. Lacking enthusiasm, take drugs back to local top conservative (9) 15. Hard to use urns wrongly (9) 20. Terrible news about river birds! (5) 21. Dine out with ten to make up table (5) 23. Get rid of old wine (4)