First of all, let me introduce myself, I am a Hearthstone player, streamer, youtuber, a coder. I am megablue. I liked the idea of tracking your scores when people started to mention it on this sub. However I was getting kind of frustrated to remind myself not to forget about marking down the score after each and every arena run ( i am sure most of us tend to forget from time to time) and wanted the effortless experience where you can focus on your gameplay and having fun instead of worrying about score tracking. Also, I wanted to display the score on my stream and don't want the hassles for the same reason i'd stated above. So I spent a few hours and built the prototype and got kind of satisfy by it. Realizing it might be helpful for Hearthstone players so I decided to put more effort into it, to make it better.
Hereby, let me introduce the score tracking app, the HearthTracker.
Screenshot
How does it work The app uses the least invasive, image recognition technique to obtain information on the screen. It doesn't inject dll, read/modify Hearthstone process memory in any way nor parse the game packets. It is basically functioning as it is a screen recording/screenshot tool and nothing more. It is probably the safest way you can extract stats from Hearthstone.
cross platforms (windows/osx/linux) only tested on Windows though.
Upcoming Features
Support play and challenge mode
UI Cosmetic changes
Web app for collective and your own private stats
More stats and better breakdown of stats
Beautiful graphs
Known Limitations
It can only work with Hearthstone in Window Mode
Due to the nature of image recognition technique, the app can be fooled (but i doubt anyone wanted to cheat on your own stats).
Also, due to the nature of image recognition technique, there is no way to track the stats in 100% precision but i'd put in a lot of efforts in order to apply the best strategies to give you the best results.
Requirement
you must have java machine installed first before launching the app, get it from http://www.java.com/
Installation & Usage
Download and extract it into a folder of your choice
Double click on HearthTracker.jar to run
Make sure your Hearthstone is running in Windows mode
Make sure your Hearthstone is running with the correct resolution.
Instruction to upgrade from older versions
Backup your existing data folder.
Extract and replace existing files
copy the backup contents of data folder back into the original data folder
Finally you guys can see it live in action on my stream, http://twitch.tv/megablue. Also, I will try to get some feedback about the app on my stream~
Is there somewhere that this is going to be updated? i'm only able to run 1024x reso's on my laptop/desktop (i know i know...) any chance this will happen within a short while? Not meaning to rush you i'm just curious.
Is there somewhere that this is going to be updated? i'm only able to run 1024x reso's on my laptop/desktop (i know i know...) any chance this will happen within a short while? Not meaning to rush you i'm just curious.
Improved customizabity and expandability for multi langangues support, you can now add new languages support by yourself (you have to use some common sense though :P).
Replaced the classes text with corresponding images
Support multiple resolutions! I just spent 10 hours re-wrote a big part of the code responsible for handling image recognition and make it far more flexible to deal with different resolutions.
nope, no specific order required, just make sure you start it before important screens (arena score screen) shows up and visible. And, may i know what is your Hearthstone resolution? did you run Hearthstone in window mode? did you select the correct resolution at HearthTracker?
For those who can't get HearthTracker to "see", I just made a small update, version 1.0.6b, to include a tool to visualize the scanned area(s). So that you can get a clue what HearthTracker is trying to do or does it even functioning at all. You can check out the details at http://hearthtracker.blogspot.com/2013/11/visualize-scanned-areas.html
This looks very interesting, I don't like that it's a desktop application, but this will do until Blizzard decides to make the web api available, good work with this tho, I was thinking of programming something similar myself because I love stat tracking XD. Also this will be very useful for a lot of streamers out there (like Hafu who uses a friken notepad to keep scores)
This looks very interesting, I don't like that it's a desktop application, but this will do until Blizzard decides to make the web api available, good work with this tho, I was thinking of programming something similar myself because I love stat tracking XD. Also this will be very useful for a lot of streamers out there (like Hafu who uses a friken notepad to keep scores)
Glad to hear that! I am looking forward for your feedback!
Edit: I had recommended Hafu to try but she seems like a bit reluctant to use it for some unstated reasons, oh well~
Changelog for v1.0.7b - fixed a bug where the app ignores the disabled visualize scanned area. - fixed a bug which caused losses to be ignored when the user maximized the Hearthstone window - introduced a new feature to automatically detect Hearthstone resolution on Windows which allows non-standard resolution to be scanned regardless of the resolution being listed in HearthTracker or not.
Hi, it's not working at all for me, windowed mode 1920*1080 windows7 64 bit, and when I make a scan, there is a yellow square, but it's not in the middle, it is about 5 cm to the left from it, maybe that's the problem...
Hi, it's not working at all for me, windowed mode 1920*1080 windows7 64 bit, and when I make a scan, there is a yellow square, but it's not in the middle, it is about 5 cm to the left from it, maybe that's the problem...
I messed up the default config so please make sure you remember to select "English" for game language at preferences. if the blue square draws on top of hearthstone window correctly and the app is saying Last seen moments ago , that means the app is able to "see" heartsthone. You dont need to care about the yellow square, it doesn't give much information for the user yet, as long as the blue square is correctly drawn, it should work.
First of all, let me introduce myself, I am a Hearthstone player, streamer, youtuber, a coder. I am megablue. I liked the idea of tracking your scores when people started to mention it on this sub. However I was getting kind of frustrated to remind myself not to forget about marking down the score after each and every arena run ( i am sure most of us tend to forget from time to time) and wanted the effortless experience where you can focus on your gameplay and having fun instead of worrying about score tracking. Also, I wanted to display the score on my stream and don't want the hassles for the same reason i'd stated above. So I spent a few hours and built the prototype and got kind of satisfy by it. Realizing it might be helpful for Hearthstone players so I decided to put more effort into it, to make it better.
Hereby, let me introduce the score tracking app, the HearthTracker.
Screenshot
How does it work
The app uses the least invasive, image recognition technique to obtain information on the screen. It doesn't inject dll, read/modify Hearthstone process memory in any way nor parse the game packets. It is basically functioning as it is a screen recording/screenshot tool and nothing more. It is probably the safest way you can extract stats from Hearthstone.
Features
Upcoming Features
Known Limitations
Requirement
Installation & Usage
Instruction to upgrade from older versions
Finally you guys can see it live in action on my stream, http://twitch.tv/megablue. Also, I will try to get some feedback about the app on my stream~
Download link
Official website/blog for changelogs/features/details
HearthTracker - Fully automated Hearthstone stats tracking!
Is there somewhere that this is going to be updated? i'm only able to run 1024x reso's on my laptop/desktop (i know i know...) any chance this will happen within a short while? Not meaning to rush you i'm just curious.
yes, it is within reach, soon™
HearthTracker - Fully automated Hearthstone stats tracking!
Updated!!!!
Change log for v1.0.2b
Now support Hearthstone in Traditional Chinese
Replaced the classes text with corresponding images
Improved current stats and overview table
HearthTracker - Fully automated Hearthstone stats tracking!
Changelog for v1.0.4b
.
HearthTracker - Fully automated Hearthstone stats tracking!
Downloading, will try it out.
I produce Hearthstone Highlights, a series of short 1-5min videos giving detailed information and lore on individual Hearthstone cards!
Check Out My Topic (with links) Here!
Is there a specific open order? I opened HS first and then this, and it didn't record anything.
I produce Hearthstone Highlights, a series of short 1-5min videos giving detailed information and lore on individual Hearthstone cards!
Check Out My Topic (with links) Here!
nope, no specific order required, just make sure you start it before important screens (arena score screen) shows up and visible.
And, may i know what is your Hearthstone resolution? did you run Hearthstone in window mode? did you select the correct resolution at HearthTracker?
HearthTracker - Fully automated Hearthstone stats tracking!
Changelog for v1.0.5b
HearthTracker - Fully automated Hearthstone stats tracking!
Nice app, works perfectly. Looking forward to play mode tracking and a more detailed stats view. :)
For those who can't get HearthTracker to "see", I just made a small update, version 1.0.6b, to include a tool to visualize the scanned area(s). So that you can get a clue what HearthTracker is trying to do or does it even functioning at all. You can check out the details at http://hearthtracker.blogspot.com/2013/11/visualize-scanned-areas.html
HearthTracker - Fully automated Hearthstone stats tracking!
This looks very interesting, I don't like that it's a desktop application, but this will do until Blizzard decides to make the web api available, good work with this tho, I was thinking of programming something similar myself because I love stat tracking XD. Also this will be very useful for a lot of streamers out there (like Hafu who uses a friken notepad to keep scores)
Glad to hear that! I am looking forward for your feedback!
Edit:
I had recommended Hafu to try but she seems like a bit reluctant to use it for some unstated reasons, oh well~
HearthTracker - Fully automated Hearthstone stats tracking!
Mega does this auto-update or have an update option somewhere?
Can I Import my stats from http://www.hearthpwn.com/forums/hearthstone-general/general-discussion/1143-hearthstone-stats ?
I am yet to implement auto update, you have to check the official website for update.
Regrading that... you have to ask the creator, i have no idea the app exports stats or not.
if it does, i can certainly write a reader to read all the exported data.
HearthTracker - Fully automated Hearthstone stats tracking!
New version released. Please check out HearthTracker official website for more info.
Changelog for v1.0.7b
- fixed a bug where the app ignores the disabled visualize scanned area.
- fixed a bug which caused losses to be ignored when the user maximized the Hearthstone window
- introduced a new feature to automatically detect Hearthstone resolution on Windows which allows non-standard resolution to be scanned regardless of the resolution being listed in HearthTracker or not.
HearthTracker - Fully automated Hearthstone stats tracking!
Hi, it's not working at all for me, windowed mode 1920*1080 windows7 64 bit, and when I make a scan, there is a yellow square, but it's not in the middle, it is about 5 cm to the left from it, maybe that's the problem...
Awesome Idea, man! I can't wait to try it out.
http://www.youtube.com/user/SeePlayWin
I messed up the default config so please make sure you remember to select "English" for game language at preferences. if the blue square draws on top of hearthstone window correctly and the app is saying Last seen moments ago , that means the app is able to "see" heartsthone. You dont need to care about the yellow square, it doesn't give much information for the user yet, as long as the blue square is correctly drawn, it should work.
HearthTracker - Fully automated Hearthstone stats tracking!
Changelog for v1.0.8b
Fixed a resolution detection bug with multi display setup.
Download the latest version here.
HearthTracker - Fully automated Hearthstone stats tracking!


Loads textures from external files.
More...
#include <texture.h>
|
| static GLuint | load2DTexture (const char *filename, GLint internalFormat=GL_RGB, GLenum picFormat=GL_RGB, int loadChannels=SOIL_LOAD_RGB, GLboolean alpha=false) |
| | A function to load a 2D texture from a file. If parameters aren't set they're set to their defaults. More...
|
| |
| static GLuint | makeAttachmentTexture (GLint level=0, GLint internalFormat=GL_DEPTH24_STENCIL8, GLsizei width=800, GLsizei height=600, GLenum picFormat=GL_DEPTH_STENCIL, GLenum picDataType=GL_UNSIGNED_INT_24_8) |
| | A function to create a texture which can be attached to a frame buffer. More...
|
| |
| static GLuint | makeMAAttachmentTexture (GLint samplesNum=4, GLint internalFormat=GL_RGB, GLsizei width=800, GLsizei height=600) |
| | A function to create a multi-sampled texture which can be attached to a frame buffer. More...
|
| |
| static GLuint | loadDDS (const char *filename) |
| | Function to load an external DDS (DirectDraw Surface) file. More...
|
| |
Loads textures from external files.
◆ load2DTexture()
| static GLuint TextureHelper::load2DTexture |
( |
const char * |
filename, |
|
|
GLint |
internalFormat = GL_RGB , |
|
|
GLenum |
picFormat = GL_RGB , |
|
|
int |
loadChannels = SOIL_LOAD_RGB , |
|
|
GLboolean |
alpha = false |
|
) |
| |
|
inlinestatic |
A function to load a 2D texture from a file. If parameters aren't set they're set to their defaults.
- Parameters
-
| filename | Name of the texture file. |
| internalFormat | Colour format of the texture. |
| picFormat | Picture format of the texture. |
| loadChannels | The texture's colour channels. |
| alpha | Whether or not to enable alpha transparency in the texture. |
◆ loadDDS()
| static GLuint TextureHelper::loadDDS |
( |
const char * |
filename | ) |
|
|
inlinestatic |
Function to load an external DDS (DirectDraw Surface) file.
- Parameters
-
| filename | Name of the DDS file. |
◆ makeAttachmentTexture()
| static GLuint TextureHelper::makeAttachmentTexture |
( |
GLint |
level = 0 , |
|
|
GLint |
internalFormat = GL_DEPTH24_STENCIL8 , |
|
|
GLsizei |
width = 800 , |
|
|
GLsizei |
height = 600 , |
|
|
GLenum |
picFormat = GL_DEPTH_STENCIL , |
|
|
GLenum |
picDataType = GL_UNSIGNED_INT_24_8 |
|
) |
| |
|
inlinestatic |
A function to create a texture which can be attached to a frame buffer.
- Parameters
-
| level | Level of detail. More that 0 will reduce image detail. |
| internalFormat | Number of colour components in the texture. |
| width | Texture width. |
| height | Texture height. |
| picFormat | Format of pixel data. |
| picDataType | Type of pixel data. |
◆ makeMAAttachmentTexture()
| static GLuint TextureHelper::makeMAAttachmentTexture |
( |
GLint |
samplesNum = 4 , |
|
|
GLint |
internalFormat = GL_RGB , |
|
|
GLsizei |
width = 800 , |
|
|
GLsizei |
height = 600 |
|
) |
| |
|
inlinestatic |
A function to create a multi-sampled texture which can be attached to a frame buffer.
- Parameters
-
| sampleNum | Number of samples the texture is comprised of. |
| internalFormat | Texture's colour format. |
| width | Texture width. |
| height | Texture height. |
The documentation for this class was generated from the following file:
- C:/Users/crona/Desktop/P2423910 - Shaders Assignment 2020/advancedLighting/include/independent/texture.h


Course literature
- Course textbook: "Bayesian Logical Data Analysis for the Physical Sciences", by
Phil Gregory, 2005. The paperback version (from 2010) should be for sale at Store, Chalmers.
An electronic version of the book is available through books24x7 via Chalmers library
(login required):
- Phil Gregory, "Bayesian Logical Data Analysis for the Physical Sciences", Cambridge University Press (2005).
- Lecture notes. See below.
- Additional reading:
- David J.C. MacKay, "Information Theory, Inference, and Learning Algorithms", Cambridge University Press (2005).
- D.S. Sivia, "Data Analysis : A Bayesian Tutorial", Oxford University Press (2006).
- Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, "The Elements of Statistical Learning", Springer (2009).
- Andrew Gelman et al., "Bayesian Data Analysis", CRC Press, 3rd edition (2014). e-book not available.
- Aurelien Geron, "Hands‑On Machine Learning with Scikit‑Learn and TensorFlow", O'Reilly (2017).
git repository
All files that are associated with this course are available via a public git repository, hosted on https://github.com/physics-chalmers/tif285.git, that you are welcome to clone.See detailed instructions.
Lecture notes
Here you find lecture notes in various formats and Jupyter Notebooks with in-class demonstrations. These notebooks are available both as download links (ipynb files), and as viewable html rendered by nbviewer. Note that the nbviewer version is not interactive. Lecture notes are updated continuously. See date on first page.
Week 1
- Lecture notes: Introduction [html] [pdf]
- Lecture demonstration: First example: Nuclear binding energies [ipynb] [nbviewer]
- Lecture notes: Linear regression [html] [pdf]
Week 2
- Lecture notes: Model Validation and Regularization [html] [pdf]
- Lecture demonstration: Linear Regression and Model Validation [ipynb] [nbviewer]
- Python Data Science Handbook: Hyperparameters and Model Validation [nbviewer]
- Lecture notes: Basics of Bayesian Statistics [html] [pdf]
- Lecture demonstration: Interactive Bayesian Coin Tossing [ipynb] [nbviewer]
Week 3
- Lecture notes: Bayesian Parameter Estimation [html] [pdf]
- Lecture demonstration: Gaussian noise and Fitting a straight line [ipynb] [nbviewer]
Week 4
- Lecture notes: Markov Chain Monte Carlo sampling [html] [pdf]
- Lecture demonstration: Metropolis-Hasting MCMC sampling of a Poisson distribution [ipynb] [nbviewer]
- Lecture notes: Error propagation and nuisance parameters [html] [pdf]
- Lecture demonstration: Bayesian billiard and Error propagation [ipynb] [nbviewer]
Week 5
- Lecture notes: Assigning probabilities [html] [pdf]
- Lecture demonstration: Assigning probabilities [ipynb] [nbviewer]
- Lecture notes: Hypothesis testing and Bayesian model selection [html] [pdf]
Week 6
- Lecture notes: Gaussian processes [html] [pdf]
- Lecture demonstration: Gaussian processes [ipynb] [nbviewer]
Week 7
- Lecture notes: Logistic regression [html] [pdf]
- Lecture notes: Neural networks [html] [pdf]
- Lecture demonstration: Neural networks [ipynb] [nbviewer]
Week 8
- Lecture notes: Convolutional neural networks [html] [pdf]
- Lecture demonstration: Convolutional neural networks [ipynb] [nbviewer]
- Lecture notes: Bayesian neural networks [html] [pdf]
- Lecture demonstration: Bayesian neural networks [ipynb] [nbviewer]
Exercises
Here you find a list of Jupyter Notebooks with demonstrations and guided exercises. These notebooks are available both as download links (ipynb files), and as viewable html rendered by nbviewer. Note that the nbviewer version is not interactive.
Week 1
- Jupyter/Python intro (part 1): [ipynb] [nbviewer]
- Jupyter/Python intro (part 2): [ipynb] [nbviewer]
- Linear Regression: [ipynb] [nbviewer]
Week 2
- Linear Regression: [ipynb] [nbviewer]
- Probability sum and product rules: [ipynb] [nbviewer]
Week 3
- Bayesian Parameter Estimation: [ipynb] [nbviewer]
Week 4
- Lecture demonstration/exercise: Metropolis-Hasting MCMC sampling of a Poisson distribution [ipynb] [nbviewer]
Week 6
- Gaussian processes: [ipynb] [nbviewer]
Week 7
- Logistic regression and neural networks: [ipynb] [nbviewer]
Week 8
- Bayesian binary classifier: [ipynb] [nbviewer]
Problem sets
The problem sets consist of Jupyter Notebooks and, in some cases, datafiles. The files are therefore packed together in a gzipped tarball. Extract with, e.g., tar xvfz TIF285_ProblemSet1.tgz
- Problem set 1: [tgz]
- Problem set 2 (basic-point problems): [tgz]
- Problem set 2 (extra-point problems): [ipynb]
- Problem set 3 (basic-point problems):
- Problem set 3 (extra-point problems):
See Examination in the for more information.
Projects
- Project 1: [ipynb] [nbviewer]
- Project 2: [tgz]
- Project 2 (extra): [ipynb]
See Examination in the for more information.


Old stuff, just for reference
Moderator: Joe M.
-
- Char not saved?
by Necromadon » Thu Aug 28, 2008 9:19 am
- 3 Replies
- 182 Views
- Last post by Necromadon
Thu Aug 28, 2008 10:20 am
-
- I have a bug maybe had**
by Serenity » Thu Aug 28, 2008 9:39 am
- 1 Replies
- 119 Views
- Last post by Serenity
Thu Aug 28, 2008 10:16 am
-
- Too many many monsters = Crash
by Necromadon » Thu Aug 28, 2008 6:19 am
- 6 Replies
- 342 Views
- Last post by Karl G.
Thu Aug 28, 2008 9:35 am
-
- Hard reboot.
by Necromadon » Thu Aug 28, 2008 9:04 am
- 1 Replies
- 116 Views
- Last post by Karl G.
Thu Aug 28, 2008 9:35 am
-
- Stat screen?
by Necromadon » Thu Aug 28, 2008 9:08 am
- 1 Replies
- 110 Views
- Last post by Karl G.
Thu Aug 28, 2008 9:31 am
-
- Tonight's Installer Package - NEW EXECUTABLE - MUST HAVE
by Karl G. » Tue Aug 26, 2008 7:17 pm
- 17 Replies
- 424 Views
- Last post by Sega Rally Pownz
Thu Aug 28, 2008 8:03 am
-
- Challenge #3: Find a Golem
by Karl G. » Tue Aug 26, 2008 11:36 am
- 11 Replies
- 508 Views
- Last post by Nirvana9832
Thu Aug 28, 2008 8:00 am
-
- The time has come...
by Nirvana9832 » Thu Aug 28, 2008 2:13 am
- 7 Replies
- 496 Views
- Last post by Nirvana9832
Thu Aug 28, 2008 7:57 am
-
- Karl: nv4_disp.dll (BSOD List)
by Richard. UK » Wed Aug 27, 2008 2:17 pm
- 8 Replies
- 216 Views
- Last post by Karl G.
Thu Aug 28, 2008 6:37 am
-
- Items show on character
by 9sam1 » Thu Aug 28, 2008 12:19 am
- 2 Replies
- 215 Views
- Last post by Karl G.
Thu Aug 28, 2008 6:13 am
-
- Some Cool and Funny Screenies by ME
by Nirvana9832 » Wed Aug 27, 2008 11:02 pm
- 0 Replies
- 275 Views
- Last post by Nirvana9832
Wed Aug 27, 2008 11:02 pm
-
- IRc CHAT ROOM
by Nirvana9832 » Wed Aug 27, 2008 7:40 pm
- 2 Replies
- 136 Views
- Last post by Nirvana9832
Wed Aug 27, 2008 9:08 pm
-
- Last server change for the night
by Karl G. » Wed Aug 27, 2008 7:44 pm
- 1 Replies
- 152 Views
- Last post by Nirvana9832
Wed Aug 27, 2008 8:43 pm
-
- Okay i posted this someone else BUT
by Nirvana9832 » Wed Aug 27, 2008 6:39 pm
- 3 Replies
- 188 Views
- Last post by Nirvana9832
Wed Aug 27, 2008 8:27 pm
-
- getting back on after exitting
by combatman » Tue Aug 26, 2008 7:53 pm
- 5 Replies
- 251 Views
- Last post by Karl G.
Wed Aug 27, 2008 8:02 pm
-
- [ERROR] CONFIRM( SUCCEEDED( myD3DDevice->Present( NULL, NUL
by lawn gnome » Tue Aug 26, 2008 7:22 pm
- 3 Replies
- 183 Views
- Last post by Karl G.
Wed Aug 27, 2008 8:02 pm
-
- Wednesday 8/27 Update - Small download!
by Unseen Studios » Wed Aug 27, 2008 3:25 pm
- 3 Replies
- 223 Views
- Last post by Karl G.
Wed Aug 27, 2008 7:43 pm
-
- I'm all blue!
by Joe M. » Wed Aug 27, 2008 3:42 pm
- 1 Replies
- 126 Views
- Last post by Serenity
Wed Aug 27, 2008 3:43 pm
-
- nv4_displ.dll - BSOD
by Richard. UK » Wed Aug 27, 2008 10:15 am
- 7 Replies
- 232 Views
- Last post by Karl G.
Wed Aug 27, 2008 1:25 pm
-
- Version Numbers
by Ashlar » Wed Aug 27, 2008 1:14 pm
- 0 Replies
- 125 Views
- Last post by Ashlar
Wed Aug 27, 2008 1:14 pm
-
- No Models Displayed-cannot support indexed blended animatio
by xile » Wed Aug 27, 2008 10:56 am
- 13 Replies
- 348 Views
- Last post by thadiusofx3
Wed Aug 27, 2008 12:39 pm
-
- Crashes when attempting to Create New Account
by Hatebreed » Wed Aug 27, 2008 11:59 am
- 3 Replies
- 158 Views
- Last post by thadiusofx3
Wed Aug 27, 2008 12:03 pm
-
- Sex/Race/Class information
by Joe M. » Wed Aug 27, 2008 11:24 am
- 0 Replies
- 126 Views
- Last post by Joe M.
Wed Aug 27, 2008 11:24 am
-
- Lag bug ANNIHILATED!!!!!
by Karl G. » Wed Aug 27, 2008 10:50 am
- 2 Replies
- 191 Views
- Last post by Richard. UK
Wed Aug 27, 2008 10:59 am
-
- big, blue, screen :(
by joeafro » Wed Aug 27, 2008 10:46 am
- 1 Replies
- 122 Views
- Last post by Karl G.
Wed Aug 27, 2008 10:58 am
Return to Board index
Users browsing this forum: No registered users and 1 guest
Forum permissions
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum


{% extends 'base.html' %} {% load static %} {%block title %} Home {% endblock %} {% block content %}
Worried about your festive shopping in the lockdown? We have got your back. India's best apparels at the lowest prices.


Branch Metrics for Mac SDK
The Branch SDK for Mac brings universal deep linking to your app. The same http://
web based
Branch link open apps on Mac, iOS, and Android so you can have one link that works on all your
platforms.
Branch links adapt to a user’s environment and can be configured with journeys and fallback options so unexpected conditions are handled gracefully.
In addition you can track and analyze your app usage and the effectiveness of sharing virality, marketing campaigns, and cohorts with atrribution, influencer, and content breakdowns of your links on the Branch dashboard.
NOTE: This project is still in beta. We support deferred and regular deep linking. We are currently building support for analytics, but you can get raw data out, via our Data Feedback product. Please send feedback to<EMAIL_ADDRESS>Happy linking.
See also:
Contents
Support and Example
- If you need support or help integrating and using Branch, check our Support Portal.
- The TestBed-Mac project is a working example the uses Branch. TestBed-Mac.
Deep Linking on the Mac
The most familiar links look like http://example.com
which are http
links that open web pages. These are great for web
pages but don’t open Mac apps. Instead, Mac apps open with URI schemes, the first part of a URI.
The parts of a URI are:
<scheme>://<host>/<path>?<query>
Common schemes are mailto:
, tel:
, fax:
which do as you may expect.
You’ll need to choose a unique URI scheme for your Mac app.
URI Scheme Considerations
You need to choose an URI scheme that is not already in common use and is likely unique on a Mac.
For instance, web://
is probably a bad choice. Many people choose the reverse domain name for
their app or use their bundle identifier, like io.branch.cool-app://
.
Don’t use an app scheme starting with fb
, db
, twitterkit-
, pin
, or
com.googleusercontent.apps
. These schemes are ignored by Branch since they are commonly used by
other app kits for oauth and other uses.
How Branch Deep Linking for Mac Works
A Branch link is a web URL that looks like https://your-app.app.link/bOsE0bbUtO
. When this link
is clicked on a Mac it opens a Branch web page that quickly determines if the Mac app can be opened
on the user’s computer, and if so, Branch opens the app with a Mac URI scheme like
your-app-scheme://open?link_click_id=348527481794276288
.
(If the user doesn’t have the app installed Branch can redirect the user to a fallback URL, like an app download page or some other configurable place).
Once your app is running, macOS passes the URI your-app-scheme://open?link_click_id=348527481794276288
to
your app, which is intercepted by the Branch SDK. The SDK takes the link and makes a network call to our servers, which
translate and expand the parameters in the link to something meaningful for your app. The SDK then notifies your app that a link
was opened with the expanded data.
Adding Branch to Your App
Get a Branch Key
You can sign up for your own app id at https://dashboard.branch.io.
You’ll need your app scheme to configure your app in the Branch dashboard.
Install the Framework
Add the Branch.framework as an embedded binary in your app.
You can drag and drop the framework into your app to install it.
In Xcode, click on your project in the Project Navigator, select your app in the Targets area,
select the ‘General’ tab up top, and scroll down to the ‘Embedded Binaries’ section. You can drag
the Branch.framework bundle from the Frameworks/macOS
project directory into this area.
 This
example shows testbed-mac
as the app scheme. Add just the scheme and not the ://
part.
Here’s a snippet of xml you can copy into your Info.plist. Right click on your Info.plist and open it as source code. You can paste
this snippet before the final </dict>
tag. Remember to change YOUR-APP-SCHEME-HERE
to the app scheme for your app.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>YOUR-APP-SCHEME-HERE</string>
</array>
</dict>
</array>
Caution: Your app’s URI scheme must be the first scheme defined (item 0) in the list.
The Branch SDK will use the first URI Scheme from your list that does not start with fb
, db
, twitterkit-
, pin
, or
com.googleusercontent.apps
. These schemes are ignored by Branch since they are commonly used by other app kits for
oauth and other uses.
Add Some Code
Start Branch when your app first starts up. In your app delegate, start Branch in your applicationWillFinishLaunching:
method:
#import <Branch/Branch.h>
// In your app delegate class file add this method to start the Branch SDK:
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification {
// Register for Branch URL notifications:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(branchOpenedURLNotification:)
name:BranchDidOpenURLWithSessionNotification
object:nil];
// Create a Branch configuration object with your key:
BranchConfiguration*configuration =
[[BranchConfiguration alloc] initWithKey:@"key_live_YOURBRANCHKEY"];
// Start Branch:
[[Branch sharedInstance] startWithConfiguration:configuration];
}
Next, add a notification handler so your app can handle the deep links:
- (void) branchOpenedURLNotification:(NSNotification*)notification {
// Get the Branch session info:
BranchSession*session = notification.userInfo[BranchSessionKey];
// Do something with the link!
// In this contrived example we'll load a view controller that plays the song that was in the link:
SongViewController *viewController = [SongViewController loadController];
viewController.songTitle = branchSession.linkContent.title;
[viewController.window makeKeyAndOrderFront:self];
[viewController playSong];
}
Rejoice
Rejoice! You’re just integrated Branch into your app.
Branch Reference
Turning on Logging
To help debugging your app, you can turn on Branch logging, which logs to the console. Remember to turn it off in your production app.
Property
Setting User Identities
Often, you might have your own user IDs, or want referral and event data to persist across platforms or uninstall/reinstall. It’s helpful if you know your users access your service from different devices. This where we introduce the concept of an ‘user identity’.
Method
[Branch setUserIdentity:completion:]
See setUserIdentity:completion:
Logout
If you provide a logout function in your app, be sure to clear the user when the logout completes. This will ensure that all the stored parameters get cleared and all events are properly attributed to the right identity.
Warning: This call will clear attribution on the device.
Method
[Branch logoutWithCompletion:]
Tracking User Actions and Events
Use the BranchEvent
class to track special user actions or application specific events beyond app installs, opens, and
sharing. You can track events such as when a user adds an item to an on-line shopping cart, or searches for a keyword, among
others.
The BranchEvent
interface provides an interface to add contents represented by BranchUniversalObject in order to associate
app contents with events.
Analytics about your app’s BranchEvents can be found on the Branch dashboard, and BranchEvents also provide tight integration with many third party analytics providers.
The BranchEvent
class can be simple to use. For example:
Objective-C
[[Branch sharedInstance]
logEvent:[BranchEvent standardEvent:BranchStandardEventAddToCart]];
Swift
Branch.sharedInstance.logEvent(BranchEvent.standardEvent(.addToCart))
For best results use the Branch standard event names defined in BranchEvent.h
. But you can use your own custom event names too:
Objective-C
[Branch sharedInstance]
logEvent:[BranchEvent customEventWithName:@"User_Scanned_Item"]];
Swift
Branch.sharedInstance.logEvent(BranchEvent.customEventWithName("User_Scanned_Item"))
Extra event specific data can be tracked with the event as well:
Objective-C
BranchEvent *event = [BranchEvent standardEvent:BranchStandardEventPurchase];
event.transactionID = @"tx-12344555";
event.currency = BNCCurrencyUSD;
event.revenue = [NSDecimalNumber<EMAIL_ADDRESS>event.shipping = [NSDecimalNumber<EMAIL_ADDRESS>event.tax = [NSDecimalNumber<EMAIL_ADDRESS>event.coupon = @"coupon_code";
event.affiliation = @"store_affiliation";
event.eventDescription= @"Shopper made a purchase.";
event.searchQuery = @"Fashion Scarf";
event.contentItems = @[ branchUniversalObject ];
event.customData = (NSMutableDictionary*) @{
@"Item_Color": @"Red",
@"Item_Size": @"Large"
};
[event logEvent];
Swift
let event = BranchEvent.standardEvent(.purchase)
event.transactionID = "tx-12344555"
event.currency = .USD
event.revenue = 12.70
event.shipping = 10.20
event.tax = 2.50
event.coupon = "coupon_code"
event.affiliation = "store_affiliation"
event.eventDescription = "Shopper made a purchase."
event.searchQuery = "Fashion Scarf"
event.contentItems = [ branchUniversalObject ]
event.customData = [
"Item_Color": "Red",
"Item_Size": "Large"
]
event.logEvent()
Enable or Disable User Tracking
In order to comply with privacy requirements, you can disable tracking at the SDK level. Simply call:
[Branch sharedInstance].trackingDisabled = YES;
Branch.sharedInstance().trackingDisabled = true
This will prevent any Branch network requests from being sent, except when deep linking. If someone clicks a Branch link, but does not want to be tracked, we will return the deep linking data back to the app but without capturing any tracking information.
In do-not-track mode, you will still be able to create & share links. The links will not have identifiable information and will be long format links. Event tracking won’t pass data back to the server if a user has expressed to not be tracked. You can change this behavior at any time by calling the above function. The trackingDisabled state is saved and persisted across app runs.
Branch Universal Object
Use a BranchUniversalObject to describe content in your app for deep links, content analytics and indexing.
The properties object describes your content in a standard way so that it can be deep linked, shared, or indexed on spotlight for instance. You can set all the properties associated with the object and then call action methods on it to create a link or index the content on Spotlight.
Branch Universal Object best practices
Here are a set of best practices to ensure that your analytics are correct, and your content is ranking on Spotlight effectively.
- Set the
canonicalIdentifier
to a unique, de-duped value across instances of the app - Ensure that the
title
,contentDescription
andimageUrl
properly represent the object - Initialize the Branch Universal Object and call
userCompletedAction
with theBNCRegisterViewEvent
on page load - Call
showShareSheet
andcreateShortLink
later in the life cycle, when the user takes an action that needs a link - Call the additional object events (purchase, share completed, etc) when the corresponding user action is taken
- Set the
contentIndexMode
toContentIndexModePublic
orContentIndexModePrivate
. If BranchUniversalObject is set toContentIndexModePublic
, then content would indexed usingNSUserActivity
, or else content would be index usingCSSearchableIndex
on Spotlight.
Note: Content indexed using CSSearchableItem
could be removed from Spotlight but cannot be removed if indexed using NSUserActivity
.
Practices to avoid:
- Don’t set the same
title
,contentDescription
andimageUrl
across all objects. - Don’t wait to initialize the object and register views until the user goes to share.
- Don’t wait to initialize the object until you conveniently need a link.
- Don’t create many objects at once and register views in a
for
loop.
Branch Universal Object
Methods and Properties
Objective-C
#import "BranchUniversalObject.h"
BranchUniversalObject *branchUniversalObject = [[BranchUniversalObject alloc] initWithCanonicalIdentifier:@"item/12345"];
branchUniversalObject.title = @"My Content Title";
branchUniversalObject.contentDescription = @"My Content Description";
branchUniversalObject.imageUrl = @"https://example.com/mycontent-12345.png";
branchUniversalObject.contentMetadata.contentSchema = BranchContentSchemaCommerceProduct;
branchUniversalObject.contentMetadata.customMetadata[@"property1"] = @"blue";
branchUniversalObject.contentMetadata.customMetadata[@"property2"] = @"red";
Swift
let branchUniversalObject: BranchUniversalObject = BranchUniversalObject(canonicalIdentifier: "item/12345")
branchUniversalObject.title = "My Content Title"
branchUniversalObject.contentDescription = "My Content Description"
branchUniversalObject.imageUrl = "https://example.com/mycontent-12345.png"
branchUniversalObject.contentMetadata.contentSchema = .product;
branchUniversalObject.contentMetadata.customMetadata["property1"] = "blue"
branchUniversalObject.contentMetadata.customMetadata["property2"] = "red"
Properties
canonicalIdentifier: This is the unique identifier for content that will help Branch de-dupe across many instances of the same thing. If you have a website with pathing, feel free to use that. Or if you have database identifiers for entities, use those.
title: This is the name for the content and will automatically be used for the OG tags. It will insert $og_title
into the data dictionary of any link created.
contentDescription: This is the description for the content and will automatically be used for the OG tags. It will insert $og_description
into the data dictionary of any link created.
imageUrl: This is the image URL for the content and will automatically be used for the OG tags. It will insert $og_image_url
into the data dictionary of any link created.
keywords: Key words that describe the object. These are used for Spotlight search and web scraping so that users can find your content.
locallyIndex: If set to true, Branch will index this content on Spotlight on the user’s phone.
publiclyIndex: If set to true, Branch will index this content on Google, Branch, etc.
expirationDate: The date when the content will not longer be available or valid. Currently, this is only used for Spotlight indexing but will be used by Branch in the future.
contentMetadata: Details that further describe your content. Set the properties of this sub-object depending on the type of content that is relevant to your content:
BranchUniversalObject.contentMetadata
The BranchUniversalObject.contentMetadata
properties further describe your content. These properties are trackable in the Branch dashboard and will be automatically exported to your connected third-party app intelligence partners like Adjust or Mixpanel.
Set the properties of this sub-object depending on the type of content that is relevant to your content. The BranchUniversalObject.contentMetadata.contentSchema
property describes the type of object content. Set other properties as is relevant to the type.
contentMetadata.contentSchema: Set this property to a BranchContentSchema
enum that best describes the content type. It accepts values like BranchContentSchemaCommerceProduct
and BranchContentSchemaMediaImage
.
contentMetadata.customMetadata: This dictionary contains any extra parameters you’d like to associate with the Branch Universal Object. These will be made available to you after the user clicks the link and opens up the app.
contentMetadata.price: The price of the item to be used in conjunction with the commerce related events below.
contentMetadata.currency: The currency representing the price in ISO 4217 currency code. The default is USD.
contentMetadata.quantity: The quantity.
contentMetadata.sku: The vendor SKU.
contentMetadata.productName: Product name.
contentMetadata.productBrand: Product brand.
contentMetadata.productCategory: The BNCProductCategory
value, such as BNCProductCategoryAnimalSupplies
or BNCProductCategoryFurniture
.
contentMetadata.productVariant: The product variant.
contentMetadata.condition: The BranchCondition
value, such as BranchConditionNew
or BranchConditionRefurbished
.
ratingAverage, ratingCount, ratingMax: The rating for your content.
addressStreet, addressCity, addressRegion, addressCountry, addressPostalCode: The address of your content.
latitude, longitude: The longitude and latitude of your content.
imageCaptions: Image captions for the content’s images.
Tracking User Interactions With An Object
We’ve added a series of custom events that you’ll want to start tracking for rich analytics and targeting. Here’s a list below with a sample snippet that calls the register view event.
| Key | Value |
|---|---|
| BranchStandardEventViewItem | User viewed the object |
| BranchStandardEventAddToWishlist | User added the object to their wishlist |
| BranchStandardEventAddToCart | User added object to cart |
| BranchStandardEventInitiatePurchase | User started to check out |
| BranchStandardEventPurchase | User purchased the item |
| BranchStandardEventShare | User completed a share |
Methods
Objective-C
[branchUniversalObject userCompletedAction:BranchStandardEventViewItem];
Swift
branchUniversalObject.userCompletedAction(BranchStandardEventViewItem)
Parameters
None
Returns
None
Shortened Links
Once you’ve created your Branch Universal Object
, which is the reference to the content you’re interested in, you can then get a link back to it with the mechanisms described below.
Encoding Note
One quick note about encoding. Since NSJSONSerialization
supports a limited set of classes, we do some custom encoding to allow additional types. Current supported types include NSDictionary
, NSArray
, NSURL
, NSString
, NSNumber
, NSNull
, and NSDate
(encoded as an ISO8601 string with timezone). If a parameter is of an unknown type, it will be ignored.
Methods
Objective-C
#import "BranchLinkProperties.h"
BranchLinkProperties *linkProperties = [[BranchLinkProperties alloc] init];
linkProperties.feature = @"sharing";
linkProperties.channel = @"facebook";
[linkProperties addControlParam:@"$desktop_url" withValue:@"http://example.com/home"];
[linkProperties addControlParam:@"$ios_url" withValue:@"http://example.com/ios"];
[branchUniversalObject getShortUrlWithLinkProperties:linkProperties andCallback:^(NSString *url, NSError *error) {
if (!error) {
NSLog(@"success getting url! %@", url);
}
}];
Swift
let linkProperties: BranchLinkProperties = BranchLinkProperties()
linkProperties.feature = "sharing"
linkProperties.channel = "facebook"
linkProperties.addControlParam("$desktop_url", withValue: "http://example.com/home")
linkProperties.addControlParam("$ios_url", withValue: "http://example.com/ios")
branchUniversalObject.getShortUrl(with: linkProperties) { (url, error) in
if error == nil {
NSLog("got my Branch link to share: %@", url)
}
}
Link Properties Parameters
channel: The channel for the link. Examples could be Facebook, Twitter, SMS, etc., depending on where it will be shared.
feature: The feature the generated link will be associated with. Eg. sharing
.
controlParams: A dictionary to use while building up the Branch link. Here is where you specify custom behavior controls as described in the table below.
You can do custom redirection by inserting the following optional keys in the dictionary:
| Key | Value |
|---|---|
$fallback_url |
Where to send the user for all platforms when app is not installed. Note that Branch will forward all robots to this URL, overriding any OG tags entered in the link. |
$desktop_url |
Where to send the user on a desktop or laptop. By default it is the Branch-hosted text-me service. |
$android_url |
The replacement URL for the Play Store to send the user if they don’t have the app. Only necessary if you want a mobile web splash. |
$ios_url |
The replacement URL for the App Store to send the user if they don’t have the app. Only necessary if you want a mobile web splash. |
$ipad_url |
Same as above, but for iPad Store. |
$fire_url |
Same as above, but for Amazon Fire Store. |
$blackberry_url |
Same as above, but for Blackberry Store. |
$windows_phone_url |
Same as above, but for Windows Store. |
$after_click_url |
When a user returns to the browser after going to the app, take them to this URL. iOS only; Android coming soon. |
You have the ability to control the direct deep linking of each link by inserting the following optional keys in the dictionary:
| Key | Value |
|---|---|
$deeplink_path |
The value of the deep link path that you’d like us to append to your URI. For example, you could specify $deeplink_path: radio/station/456and we’ll open the app with the URI yourapp://radio/station/456?link_click_id=branch-identifier. This is primarily for supporting legacy deep linking infrastructure. |
$always_deeplink |
true or false. (default is not to deep link first) This key can be specified to have our linking service force try to open the app, even if we’re not sure the user has the app installed. If the app is not installed, we fall back to the respective app store or $platform_url key. By default, we only open the app if we’ve seen a user initiate a session in your app from a Branch link (has been cookied and deep linked by Branch). |
alias: The alias for a link. Eg. myapp.com/customalias
matchDuration: The attribution window in seconds for clicks coming from this link.
stage: The stage used for the generated link, indicating what part of a funnel the user is in.
tags: An array of tag strings to be associated with the link.
Get Short Url Parameters
linkProperties: The link properties created above that describe the type of link you’d like
callback: The callback that is called with url on success, or an error if something went wrong. Note that we’ll return a link 100% of the time. Either a short one if network was available or a long one if it was not.


My dear marine critters,
This is will be my blog's last entry before entering Bootcamp. During this 10 weeks journey through Foundations, I met again with HTML and CSS and starting to get to know Javascript. I also reflected on myself, my learning skills and my ability to communicate with others.
In the end, the most surprising aspect of the Core Curriculum was how well it echoed the personal path I was already on. It gave me a chance to finally take the time to organise my thoughts about my values and put them down in writing. The Core curriculum also brought meditation back in my life and is now pushing me to take on journaling. I am grateful that this part of my dev journey aligned with my personal path and that it helped me to finally bring in my life practices I've read a lot about in the past.
It might seem strange to see how important a place the core curriculum occupies in this course. But code writing is just a part of being a web developer. Other facets includes working as a team, problem-solve, continuous learning. Knowing yourself, trusting your ability to learn and developing your emotion intelligence will help you when facing challenges.


the soundtrack store is composer and musician ben andre and his nice friends. we write and produce music for cool films and video games.
great video games and films use writing, art and music to build a sense of "world" that is more than the sum of its parts. ben also makes music that confounds monitization, and is not available on this site.
<EMAIL_ADDRESS>347.791.5116


{% include head.html %}
{% include coa-header.html %} {% include dash-top-nav.html %}This dashboard reports the progress of the Austin Transportation Department's Annual Signal Timing Program. Beginning in 2017, traffic signal engineers will re-time approximately 1/3 of the city’s 1,000+ signals each year, with the goal of ensuring signals are timed for optimum safety and performance. More info
We identify corridors for re-timing on annual basis, typically in October. Every signal in our system is re-timed at least once every three years. You can view the corridors that have been scheduled for re-timing in the above table.
The Annual Signal Timing Program's performance goals are established by city management, and are reviewed annually based on the pervious year's performance.
To report an issue or request a new traffic signal, call 3-1-1. You can also submit a traffic signal service request online.
This dashboard is for informational purposes and may not have been prepared for or be suitable for legal, engineering, or surveying purposes. It does not represent an on-the-ground survey and represents only the approximate relative location of traffic signals.


I am currently a Senior at Waterloo West High and will graduate in May of 2020. After I graduate, I will be enrolled in Hawkeye Community College in the Fall of 2020.
In this class, we would do ...
In this class, we would do ...
In this class, we would do ...
In this class, we would do ...
In this class, we would do ...
In this class, we would do ...
In this class, we would do ...
A picture of Waterloo West High School
In this class, we would do ...
In this class, we would do ...


Anatomy of a request template¶
This section describes how to write templates and how to run specific tests. Templates are input files which have raw HTTP requests and may be supplemented with variable data using extensions.
Note: The name of a template file must end with the extension .template
Otherwise, syntribos will skip the file and will not attempt to parse any files
that do not adhere to this naming scheme.
Using external functions in templates¶
Extensions can be used to supplement syntribos template files with variable data, or data retrieved from external sources.
Extensions are found in syntribos/extensions/
.
Calls to extensions are made in the form below:
CALL_EXTERNAL|{extension dot path}:{function name}:[arguments]
One example packaged with syntribos enables the tester to obtain an AUTH
token from keystone. The code is located in identity/client.py
.
To use this extension, you can add the following to your template file:
X-Auth-Token: CALL_EXTERNAL|syntribos.extensions.identity.client:get_token_v3:["user"]|
The "user"
string indicates the data from the configuration file we
added in examples/configs/keystone.conf
.
Another example is found in random_data/client.py
. This returns a
UUID when random, but unique data is needed. The UUID can be used in place of
usernames when fuzzing a create user call.
"username": "CALL_EXTERNAL|syntribos.extensions.random_data.client:get_uuid:[]|"
The extension function can return one value, or be used as a generator if you want it to change for each test.
Built in functions¶
Syntribos comes with a slew of utility functions/extensions, these functions can be used to dynamically inject data into templates.
| Method | Parameters | Description |
|---|---|---|
| hash_it | [data, hash_type (optional hash type, default being SHA256)] | Returns hashed value of data |
| hmac_it | [data, key, hash_type (optional hash type, default being SHA256)] | Returns HMAC based on the has algorithm, data and the key provided |
| epoch_time | [offset (optional integer offset value, default is zero)] | Returns the current time minus offset since epoch |
| utc_datetime | [] | Returns current UTC date time |
| base64_encode | [data] | Returns base 64 encoded value of data supplied |
| url_encode | [url] | Returns encoded URL |
All these utility functions can be called using the following syntax:
CALL_EXTERNAL|common_utils.client.{method_name}:{comma separated parameters in square brackets}
For example:
"encoded_url": "CALL_EXTERNAL|common_utils.client:url_encode:['http://localhost:5000']|
Other functions that return random values can be seen below:
| Method | Parameters | Description |
|---|---|---|
| get_uuid | [] | Returns a random UUID |
| random_port | [] | Returns random port number between 0 and 65535 |
| random_ip | [] | Returns random ipv4 address |
| random_mac | [] | Returns random mac address |
| random_integer | [beg (optional beginning value, default is 0), end (optional end value)] | Returns an integer value between 0 and<PHONE_NUMBER> by default |
| random_utc_datetime | [] | Returns random UTC datetime |
These can be called using:
CALL_EXTERNAL|random_data.client.{method_name}:{comma separated parameters in square brackets}
For example:
"address": "CALL_EXTERNAL|random_data.client:random_ip:[]|"
Action Field¶
While syntribos is designed to test all fields in a request, it can also ignore specific fields through the use of Action Fields. If you want to fuzz against a static object ID, use the Action Field indicator as follows:
"ACTION_FIELD:id": "1a16f348-c8d5-42ec-a474-b1cdf78cf40f"
The ID provided will remain static for every test.
Meta Variable File¶
Syntribos allows for templates to read in variables from a user-specified meta variable file. These files contain JSON objects that define variables to be used in one or more request templates.
The file must be named meta.json and must be placed in the same directory as the template files that reference it. Meta variable files take the form:
{
"user_password": {
"val": 1234
},
"user_name": {
"type": config,
"val": "user.username"
},
"user_token": {
"type": "function",
"val": "syntribos.extensions.identity:get_scoped_token_v3",
"args": ["user"]
}
}
To reference a meta variable from a request template, reference the variable name surrounded by | (pipe). An example request template with meta variables is as follows:
POST /user HTTP/1.1
X-Auth-Token: |user_token|
Accept: */*
Content-type: application/json
{
"user": {
"username": "|user_name|",
"password": "|user_password|"
}
}
Running a specific test¶
As mentioned above, some tests included with syntribos by default are: LDAP injection, SQL injection, integer overflow, command injection, XML external entity, reflected cross-site scripting, Cross Origin Resource Sharing (CORS), SSL, Regex Denial of Service, JSON Parser Depth Limit, and User defined.
In order to run a specific test, use the -t, --test-types
option and provide syntribos
with a keyword, or keywords, to match from
the test files located in syntribos/tests/
.
For SQL injection tests, see below:
$ syntribos --config-file keystone.conf -t SQL run
To run SQL injection tests against the template body only, see below:
$ syntribos --config-file keystone.conf -t SQL_INJECTION_BODY run
For all tests against HTTP headers only, see below:
$ syntribos --config-file keystone.conf -t HEADERS run


(Deprecated API)
(Deprecated API)
(Deprecated API)
Includes enterprise licensing and support
The Maps Data API allows client applications to view and update maps (and features on those maps) through the use of Google Data API feeds. These feeds are provided as URLs using the popular Atom standard. You programmatically create, alter and delete data using HTTP requests.
In addition to providing some background on the capabilities of the Maps Data API Data API, this document provides examples of basic Data API interactions using the Java client library. If you're interested in understanding more about the underlying protocol that the library uses, see the HTTP Protocol Guide of this developer's guide.
This document is intended for programmers who want to write Java client applications that can interact with the Google Maps Data API.
This document assumes that you understand the general ideas behind the Google Data APIs protocol, and that you're familiar with the Google Maps Data API.
For reference information about the classes and methods provided by the client library, see the Java client library API reference. For general Maps Data API Data API reference information, see the HTTP Protocol Reference.
Using the Maps Data API requires the following:
For help setting up the Java client library, see the Getting Started Guide.
The Java client library requires Java 1.5. After
downloading the client library, you'll find the classes you need to get started in the
java/lib/gdata-maps.client-2.0.jar
file.
Maps are stored and associated with user IDs attached to a Google Account. If you do not currently have a Google account, sign up for one here.
The Maps Data API manipulates maps which appear within the My Maps feature on Google Maps. MyMaps includes two types of maps: Public, and Unlisted. A sample MyMap is shown below:
You can use MyMaps within your browser to inspect the state of your map after data updates. Additionally, if you create Public maps, these will be indexed and may show up in search results. Note that you do not need to use MyMaps to present your data. Any application that can present KML is an appropriate "browser" for data returned by the Maps Data API.
Conceptual information about authentication is covered within the HTTP Protocol Guide.
You can supply or retrieve credentials from within your application using several
authentication schemes. The simplest method involves using ClientLogin
using a stored username and password in the client. The following code
requests an authentication token using the passed username and
password:
MapsService myService = new MapsService("applicationName"); myService.setUserCredentials("username","password");
Storing usernames and passwords within code is not advised due to security
concerns, however. Applications wishing to add more security
may wish to use AuthSub
or OAuth
authentication
instead. However, the sample code in this chapter assumes
ClientLogin
authentication schemes to keep the code simpler.
The fundamental MapEntry
within a Maps Data API feed is an
instance of a map. Using the Maps Data API, you may perform the following
operations on maps:
Each of these operations is discussed in the following sections.
The Maps Data API provides a feed that returns the maps created by a particular
user; this feed is known as a "metafeed". Using the Java client
library, the metafeed is returned within a MapFeed
object.
You then use methods on that object to return information about the feed.
The following sample code uses an authenticated MapsService
object to retrieve the metafeed and then prints each map's title. The
feed is returned within a MapFeed
object, each consisting
of zero or more MapEntry
objects.
package com.google.gdata.client.sample.maps; import com.google.gdata.client.*; import com.google.gdata.client.maps.*; import com.google.gdata.data.*; import com.google.gdata.data.maps.*; import com.google.gdata.util.*; import java.io.IOException; import java.net.URL; public class GetMapsFeed { public static void main(String[] args) { // Name your service MapsService myService = new MapsService("applicationName"); try { // Replace these credentials with your own myService.setUserCredentials("username","password"); } catch(AuthenticationException e) { } try { printUserMaps(myService); } catch(ServiceException e) { } catch(IOException e) { } } public static void printUserMaps(MapsService myService) throws ServiceException, IOException { // Request the default metafeed final URL feedUrl = new URL("http://maps.google.com/maps/feeds/maps/default/full"); MapFeed resultFeed = myService.getFeed(feedUrl, MapFeed.class); // Print the title of the feed itself. System.out.println(resultFeed.getTitle().getPlainText()); // Iterate through the feed entries (maps) and print out info // for each map for (int i = 0; i < resultFeed.getEntries().size(); i++) { MapEntry entry = resultFeed.getEntries().get(i); System.out.println(entry.getTitle().getPlainText()); System.out.println(" Summary: " + entry.getSummary().getPlainText()); System.out.println(" Self Link: " + entry.getSelfLink().getHref() +"\n"); } } }
Each MapFeed
metafeed contains a set of Link
elements
which specify how to interact with the user's maps. These link elements
may be accessed via the following MapFeed
methods noted below:
getSelfLink()
returns the full maps metafeed (also known as a
#feed
link). This feed
requests all maps created by the user associated with the authenticated
session. (Additionally the default metafeed is useful for determing your
userID, which is included in the link.)getEntryPostLink()
returns a URL for POST
requests to add new map elements. This link is also known as a #post
link.getFeedBatchLink()
returns a URL for
batch processing. This
link is also known as a #batch
link.
You can also return these links by calling getLinks()
on the
MapFeed
object, and determine the type of link using getRel()
on the links themselves. The following code iterates through a metafeed and prints
out both the relation types and the URLs of the links:
for (Link link : resultFeed.getLinks()) { System.out.println("\t" + link.getRel() + "\n" + link.getHref()); }
Executing this code will print out links similar to those below:
alternate http://maps.google.com/maps/ms?msa=1 http://schemas.google.com/g/2005#feed http://maps.google.com/maps/feeds/maps/userID/full http://schemas.google.com/g/2005#batch http://maps.google.com/maps/feeds/maps/userID/full/batch http://schemas.google.com/g/2005#post http://maps.google.com/maps/feeds/maps/userID/full
The standard #feed
returns all feeds associated with a given
authenticated userID. This userID is a unique token associated
with your Google account username.
The response also contains MapEntry
elements for each
map available for access by the authenticated user. These MapEntry
elements only contain meta information about the map; they do not
contain specific feature information about maps. Each MapEntry
contains a set of fields. (Most of these are inherited from
BaseEntry.EntryState
.) Of special note are the fields noted below:
id
field containing a URL used to specify this
particular entry (map)published
)
and modification (updated
)title
and summary
field, which
correspond to the title and description entered within the My Maps editor.link
fields of type Link
containing URLS for performing
operations on this map:
self
for requesting information on this element.
This feed simply returns the MapEntry
you see here.edit
for PUT
requests to update information in
this elementauthor
fields of type Person
describing the
author(s) of this map.content
field whose src
attribute specifies the
feed for retrieving the full list of features for this map.Note that the MapEntry
does not itself describe any of its feature
content (markers, polylines,polygons, etc.) To retrieve that additional
information, you will need to request a map's feature feed. (See
Requesting a List of Features below.)
For complete information about these elements, consult the Maps Data API feed elements reference guide, Google Data APIs Protocol Reference document, or the Atom 1.0 specification.
In addition to http://maps.google.com/maps/feeds/maps/default/full
, which
retrieves all feeds associated with a given user, the following subsets are available:
http://maps.google.com/maps/feeds/maps/default/owned
returns all maps
created by the userhttp://maps.google.com/maps/feeds/maps/default/public
returns all
public maps created by the userhttp://maps.google.com/maps/feeds/maps/default/unlisted
returns all
unlisted maps created by the userTo retrieve a map, simply initiate a request to the
self
URL specified within the map's entry. We can get
these URLs from the metafeed itself. The following code prints out
title and summary information for a map given its #self
feed URL.
public static void getMapInfo(MapsService myService) throws ServiceException, IOException { // Request the self link on a particular map // Note that you should replace the URL to a self link of // a particular map final URL mapSelfUrl = new URL("http://maps.google.com/maps/feeds/maps/userID/full/mapID"); MapEntry map = myService.getEntry(mapSelfUrl, MapEntry.class); System.out.println("\t" + map.getSelfLink().getHref()); System.out.println(map.getTitle().getPlainText()); System.out.println(map.getSummary().getPlainText()); }
As with the metafeed, retrieving an individual MapEntry
does
not return feature information associated with a map. To do so, you will
need to request the map entry's feature feed. Note that the MapEntry
you return and access is identical to the entry returned within the full maps metafeed.
Generally, you either use the maps metafeed or get the entry for a specific map,
but there's usually not a reason to do both.
Authenticated applications can publish new maps by using the metafeed's POST (edit) URL.
To create a new map, first create a MapEntry
object to represent
the map. Set the title, summary and other attributes of the map, and call
the insert()
method on the MapsService
object to
create the map. The following example creates a new map:
public static MapEntry createMap(MapsService myService) throws ServiceException, IOException { // Replace the following URL with your metafeed's POST (Edit) URL final URL feedUrl = new URL("http://maps.google.com/maps/feeds/maps/userID/full"); MapFeed resultFeed = myService.getFeed(feedUrl, MapFeed.class); URL mapUrl = new URL(resultFeed.getEntryPostLink().getHref()); // Create a MapEntry object MapEntry myEntry = new MapEntry(); myEntry.setTitle(new PlainTextConstruct("Demo Map")); myEntry.setSummary(new PlainTextConstruct("Summary")); Person author = new Person("Maps Developer", null, "example@gmail.com"); myEntry.getAuthors().add(author); return myService.insert(mapUrl, myEntry); }
The insert()
method creates a map using the MapEntry
. The
entry returned is the same one you sent, but also contains various elements added
by the Maps Data API, such as an id
element and creation
information. If your request fails for some reason, the Maps Data API Java client library
will throw a ServiceException
. You should handle such exceptions
gracefully.
To update an existing map, first retrieve the MapEntry
you want
to update, modify it, and then call the method update()
on
the MapsService
object, passing it the the updated MapEntry
and the map's POST (edit) URL.
In the following example, we simply change the map's title:
public static MapEntry updateMap(MapsService myService) throws ServiceException, IOException { // Use the map entry's post (edit) URL final URL editMapUrl = new URL("http://maps.google.com/maps/feeds/maps/userID/full/mapID"); // Create a MapEntry object and replace the title to 'Demo Map 2' MapEntry myEntry = new MapEntry(); myEntry.setTitle(new PlainTextConstruct("Demo Map 2")); return myService.update(editMapUrl, myEntry); }
To delete a map, call the delete()
method on the
MapsService
object, passing it the to the MapEntry
's POST (edit) URL.
This is the same URL used to update a map.
public static void deleteMap(MapsService myService) throws ServiceException, IOException { // Request the POST (edit) URL of a specific map final URL editMapUrl = new URL("http://maps.google.com/maps/feeds/maps/userID/full/mapID"); myService.delete(editMapUrl); }
So far, we have only discussed maps, but we haven't discussed the things we want to put on maps: markers, lines, shapes, etc. These elements are known as features in the Maps Data API. Each map contains a feature feed which returns a list of the features attached to a map. You may then add, modify, or delete features using this feed.
This chapter discusses the feature feed (of type FeatureFeed
),
what makes up a feature in the Maps Data API, and how to perform the following
functions:
Features are attached to individual maps, so to fully address a feature in the Maps Data API, you will need to provide both a userID of the authenticated user and a mapID of the specific map. You can only request a feature feed per map. There is no feature feed for all features across all maps.
A map's feature feed is generally retrieved from a MapEntry
via the getFeatureFeedUrl()
method. The feature feed not only
contains a userID but also a mapID of the map in question. A
feature feed is a URL of the following form:
http://maps.google.com/maps/feeds/features/userID/mapID/full
Upon success, a feature feed will return information about the
map and a list of FeatureEntry
elements for each
feature. Each FeatureEntry
contains content in the form of KML,
consisting of a list of <Placemark>
elements.
The following code uses a feature feed URL to return the set of features associated with a given map and print out the KML content of those features.
public static void getFeatures(MapsService myService) throws ServiceException, IOException { // Get a feature feed for a specific map final URL featureFeedUrl = new URL("http://maps.google.com/maps/feeds/features/userID/mapID/full"); FeatureFeed featureFeed = myService.getFeed(featureFeedUrl, FeatureFeed.class); System.out.println("Features of the Map:"); for (int i = 0; i < featureFeed.getEntries().size(); i++) { FeatureEntry entry = featureFeed.getEntries().get(i); // Print the title of the feed itself. System.out.println("\nTitle: " + entry.getTitle().getPlainText()); System.out.println("Self Link: " + entry.getSelfLink().getHref()); System.out.println("KML: \n"); // Print out the KML try { // Note that the KML is set to type XmlBlob XmlBlob kml = entry.getKml(); System.out.println(kml.getBlob()); } catch(NullPointerException e) { System.out.println("Error: " + e.getClass().getName()); } } }
Executing the above code will produce output like the following for a map:
Title: Bicycle Leg 1 Self Link: http://maps.google.com/maps/feeds/features/userID/mapID/full/featureID KML: <Placemark> <name>Bicycle Leg 1</name> <Style> <LineStyle> <color>40000000</color> <width>3</width> </LineStyle> <PolyStyle> <color>406666FF</color> <fill>1</fill> <outline>1</outline> </PolyStyle> </Style> ... </Placemark> Title: Bicycle Leg 2 Self Link: http://maps.google.com/maps/feeds/features/userID/mapID/full/featureID KML: <Placemark> ... </Placemark>
Note that individual features have #self
links of the following form:
http://maps.google.com/maps/feeds/features/userID/mapID/full/featureID"
The fully address a feature, you will need the ID of the authenticated user, the ID of the map, and the ID of the specific feature.
Note that if you are given a MapEntry
, you can request the feature feed directly
using the getFeatureFeed()
method.
To retrieve a specific feature associated with a map, you can either
directly query the feature feed URL as shown above and pick out the individual
feature, or you can initiate a request to the self
URL specified
within the feature's entry. The following code uses a previously stored
feature entry #self
URL:
public static void printFeatureInfo(MapsService myService) throws ServiceException, IOException { // Get a feature entry from its self URL (returned in the feature feed) final URL featureEntryUrl = new URL("http://maps.google.com/maps/feeds/features/userID/mapID/full/featureID"); FeatureEntry entry = myService.getEntry(featureEntryUrl, FeatureEntry.class); // Print out the KML try { XmlBlob kml = ((OtherContent) entry.getContent()).getXml(); System.out.println(kml.getBlob()); } catch(NullPointerException e) { System.out.println("Null Pointer Exception"); } }
Note that the FeatureEntry
you return and access is identical to
the entry returned within the full feature metafeed. Generally, you either use
the feature metafeed or get the entry for a specific feature,
but there's usually not a reason to do both.
Authenticated applications can publish new features to a map by using the feature feed's POST (edit) URL.
To create a new feature, first create a FeatureEntry
object to represent
the feature. Set the title and KML content of the feature, and call
the insert()
method on the MapsService
object to
create the feature.
In practice, you will likely want a way to write existing KML in a file to a string. The following utility method may be useful:
// Utility method to read KML from a file and create a string private static String getKml(String filename) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader r = new BufferedReader(new FileReader(filename)); int c; while ((c = r.read()) != -1) { sb.append((char) c); } return sb.toString(); }
The following example uses this utility method to create a new
feature from an existing KML file. Note that the KML file
must contain only one <Placemark>
and
not full KML (such as the <kml>
root element).
public static FeatureEntry createFeature(MapsService myService) throws ServiceException, IOException { // Use the feature feed's #post URL as the Edit URL for this map // Replace userID and mapID with appropriate values for your map final URL featureEditUrl = new URL("http://maps.google.com/maps/feeds/features/userID/mapID/full"); // Create a blank FeatureEntry object FeatureEntry featureEntry = new FeatureEntry(); try { // KML is simply XML so we'll use the XmlBlob object to store it XmlBlob kml = new XmlBlob(); kml.setBlob(CreateFeature.getKml("YOUR_KML_FILE.kml")); // Set the KML for this feature // Note that the KML should only include one <Placemark> entry featureEntry.setKml(kml); // Set the tile for the feature. Each atom entry requires a feature // This feature title will be displayed within My Maps featureEntry.setTitle(new PlainTextConstruct("Feature Title")); } catch(NullPointerException e) { System.out.println("Error: " + e.getClass().getName()); } // Insert the feature entry using the #post URL return myService.insert(featureEditUrl, featureEntry); }
The insert()
method creates a feature using the FeatureEntry
.
Once the entry is added, it will also contain various elements added
by the Maps Data API, such as an id
element and creation
information. If your request fails for some reason, the Maps Data API will throw
a ServiceException
. You should handle such exceptions
gracefully.
You may also create a feature from a text string rather than from a file.
Doing so is slightly easier, since you simply need to pass the KML text string
to setBlob()
rather than use the CreateFeature.getKml()
class method:
//Specify the KML as a String String kml = "<Placemark xmlns=\"http://www.opengis.net/kml/2.2\">" + "<name>Aunt Joan's Ice Cream Shop</name>" + "<Point>" + "<coordinates>-87.74613826475604,41.90504663195118,0</coordinates>" + "</Point></Placemark>"; // Call createFeature, passing the KML string createFeature(myService,kml); public static FeatureEntry createFeature(MapsService myService, String KML) throws ServiceException, IOException { // Use the feature feed's #post URL as the Edit URL for this map // Replace userID and mapID with appropriate values for your map final URL featureEditUrl = new URL("http://maps.google.com/maps/feeds/features/userID/mapID/full"); // Create a blank FeatureEntry object FeatureEntry featureEntry = new FeatureEntry(); try { // KML is simply XML so we'll use the XmlBlob object to store it XmlBlob kml = new XmlBlob(); kml.setBlob(KML); // Set the KML for this feature // Note that the KML should only include one <Placemark> entry featureEntry.setKml(kml); // Set the tile for the feature. Each atom entry requires a feature // This feature title will be displayed within My Maps featureEntry.setTitle(new PlainTextConstruct("Feature Title")); } catch(NullPointerException e) { System.out.println("Error: " + e.getClass().getName()); } // Insert the feature entry using the #post URL return myService.insert(featureEditUrl, featureEntry); }
To update an existing feature, first retrieve the FeatureEntry
of the feature you want to update, modify it, and then call the
update()
method on your MapsService
object,
passing it the feature's edit #post
URL and the updated
FeatureEntry
.
public static FeatureEntry updateFeature(MapsService myService) throws ServiceException, IOException { // Request the default metafeed // Replace userID, mapID and featureID with appropriate values for your map final URL featureEditUrl = new URL("http://maps.google.com/maps/feeds/features/userID/mapID/full/featureID"); FeatureEntry featureEntry = myService.getEntry(featureEditUrl, FeatureEntry.class); featureEntry.setTitle(new PlainTextConstruct("Aunt Joan's Coffee Shop")); return myService.update(featureEditUrl, featureEntry); }
To delete a feature, call the delete()
method on your
MapsService
object, passing it the feature's
edit URL. This is the same URL used to update a
feature.
public static void deleteFeature(MapsService myService) throws ServiceException, IOException { // Get a feature entry from its edit URL (returned in the feature feed) final URL featureEditUrl = new URL("http://maps.google.com/maps/feeds/features/userID/mapID/full/featureID"); myService.delete(featureEditUrl); }
Note: To update existing features, see Updating Features; don't update features by deleting and then re-adding them.
Controlling access to your maps is important: sometimes you need to keep your data restricted to a small set of people, and other times you'd like your map to be accessible to the entire world. The Maps Data API provides two layers of access control:
api_visible
custom
property defines whether a map can be accessed by non-owners through the Maps Data API.
Using these two layers of control, you can make sure that the correct people have access to your maps.
api_visible
Custom
PropertyMaps are always accessible to their owners through the API.
If you'd like your map to be accessible to others through the API (such as
with a web application you create), the map's api_visible
custom
property must be true. The map's
access control list then defines access
levels for non-owners. In this case, users who are not authenticated fall
under the ACL's default
scope.
When api_visible
is false, only a map's owner
can access that map through the API.
A map's api_visible
custom property is set at creation according
to the method of creation:
api_visible
set to
true.api_visible
set to false.Note: All maps created before
December 16th, 2009 were created with api_visible
set to
false.
To update the api_visible
custom property:
public static MapEntry setApiVisibleProperty(MapsService myService) { final URL editMapUrl = new URL("http://maps.google.com/maps/feeds/maps/userID/full/mapID"); MapEntry map = myService.getEntry(editMapUrl, MapEntry.class); com.google.gdata.data.extensions.CustomProperty customProperty = new com.google.gdata.data.extensions.CustomProperty(); customProperty.setName("api_visible"); customProperty.setValue("1"); // Or "0" for false map.addCustomProperty(customProperty); return myService.update(editMapUrl, map); }
The Google Maps Data API provides methods to control access to your maps. ACLs control both individual user access, as well as default access levels for all users not specifically named.
Access control is accomplished using the classes in the
com.google.gdata.data.acl
package. You must import this package
in your Java file:
import com.google.gdata.data.acl.*;
Each map has one AclFeed
object, containing one or more
AclEntry
objects. Each entry
specifies a scope and a role; the
scope defines the user affected, and the
role defines their access level. All feeds contain an entry
for the default
scope, which applies to all users without their
own entry.
Allowed scopes in the Maps Data API are:
Allowed roles are explained in the table below.
| Role | Map | Features | ACL |
|---|---|---|---|
owner (not valid with default scope) |
View - Edit | View - Add - Edit - Delete | View - Edit |
reader |
View | View | View |
writer |
View - Edit | View - Add - Edit - Delete | View |
appender |
- | Add | - |
readappender |
View | View - Add | View |
default |
Explicitly grants a user the same role as is granted the default scope. | ||
none |
Assigning a role of none to a user will remove
that user's ACL entry. |
The creator of a map always has full permission to the map, its features, and its ACL, regardless of any changes to the owner's ACL entry. A map can only be deleted by its creator.
A map's access control list can be retrieved with the ACL's unique URL. This
URL can be inferred from the map entry's id
property, as
follows:
final URL aclFeedUrl = new URL(map.getId().replace("feeds/maps", "feeds/acl/maps") + "/full");
The ACL feed URL is passed to getFeed()
on the MapsService
object, along with the class of this feed (AclFeed.class
in this case).
public static AclFeed getAclFeed(MapsService myService, MapEntry map) throws IOException, ServiceException { final URL aclFeedUrl = new URL(map.getId().replace("feeds/maps", "feeds/acl/maps") + "/full"); return myService.getFeed(aclFeedUrl, AclFeed.class); }
From the ACL feed, individual entries can be returned by calling
getEntries()
on the feed object.
public static void printAclEntries(AclFeed aclFeed) { for (AclEntry aclEntry : aclFeed.getEntries()) { System.out.println("Scope type: " + aclEntry.getScope().getType()); System.out.println("Scope value: " + aclEntry.getScope().getValue()); System.out.println("Role value: " + aclEntry.getRole().getValue()); } }
An ACL entry can also be retrieved by passing the entry's unique URL to
myService.getEntry()
, along with the type of feed (in this case,
AclEntry.class
). To obtain this URL, either:
getSelfLink().getHref()
on the ACL entry, oruser%3Ajohn%40gmail.com
).The following example shows how to retrieve an ACL entry by constructing the URL:
public static void printAclEntry(MapsService myService, AclFeed aclFeed) throws IOException, ServiceException { final URL aclEntryUrl = new URL(aclFeed.getId() + "/user%3Ajohn%40gmail.com"); AclEntry aclEntry = myService.getEntry(aclEntryUrl, AclEntry.class); System.out.println("Scope type: " + aclEntry.getScope().getType()); System.out.println("Scope value: " + aclEntry.getScope().getValue()); System.out.println("Role value: " + aclEntry.getRole().getValue()); }
AclEntry objects are inserted into the ACL feed by calling
insert()
on the MapsService
object. The role and
scope must be defined in the ACL entry.
public static AclEntry addAclEntry(MapsService myService, AclFeed aclFeed) throws IOException, ServiceException { AclEntry aclEntry = new AclEntry(); AclRole role = new AclRole(); role.setValue("writer"); AclScope scope = new AclScope(); scope.setType(AclScope.Type.USER); scope.setValue("john@gmail.com"); final URL aclFeedUrl = new URL(aclFeed.getId()); return myService.insert(aclFeedUrl, aclEntry); }
To update an ACL entry, first retrieve the AclEntry
you wish to
update. Then modify the AclEntry
object before passing it (and
the map's edit URL) to update()
on the MapsService
object.
Only the role value of an entry can be changed; scope can not be updated.
public static AclEntry updateAclEntry(MapsService myService, AclEntry aclEntry) throws IOException, ServiceException { AclRole aclRole = aclEntry.getRole(); aclRole.setValue("reader"); aclEntry.setRole(aclRole); final URL aclEntryUrl = new URL(aclEntry.getId()); return myService.update(aclEntryUrl, aclEntry); }
To delete an ACL entry, call the delete()
method on the
MapsService
object, passing it the AclEntry's
unique
URL.
public static void deleteAclEntry(MapsService myService, AclEntry aclEntry) throws IOException, ServiceException { final URL aclEntryUrl = new URL(aclEntry.getId()); myService.delete(aclEntryUrl); }


Enter your coupon code if you have one.


-
gridWidth
int gridWidth
The width of the grid in terms of number of MyButtons.
-
gridHeight
int gridHeight
The height of the grid in terms of number of MyButtons.
-
numCreepers
int numCreepers
The number of creepers to be created and put into the MyButton grid.
-
numSigns
int numSigns
The number of signs the player has available to them.
-
creepersLeft
int creepersLeft
The number of creepers left without signs marking their positions.
-
totalCreepers
int totalCreepers
The total number of creepers.
-
background
javax.swing.JLabel background
The main background of the whole application.
-
logoIcon
javax.swing.Icon logoIcon
The main heading image.
-
signsLeft
javax.swing.Icon signsLeft
The image that contains the text "Signs Left - ".
-
signsCount1
javax.swing.JLabel signsCount1
The first digit of the signs count numbers.
-
signsCount2
javax.swing.JLabel signsCount2
The second digit of the signs count numbers.
-
windowDimensions
java.awt.Dimension windowDimensions
The main JFrames dimensions.
-
creeperGrid
MyButton[][] creeperGrid
The main MyButton 2D array.
-
firstClick
boolean firstClick
Boolean to determine whether or not the user is clicking a MyButton for the first time.
-
holderSize
int holderSize
The height and width of the buttonHolder JPanel.
-
containerSize
int containerSize
The height of the JPanel that holds the buttonHolder JPanel.
-
timeTracker
int timeTracker
The elapsed time in seconds.
-
time
int[] time
The time array. time[0] is hours, time[1] is minutes and time[3] is seconds.
-
rmbPressed
boolean rmbPressed
Boolean used to determine if the right mouse button is currently being pressed.
-
lmbPressed
boolean lmbPressed
Boolean used to determine if the left mouse button is currently being pressed.
-
keepTime
boolean keepTime
Tells the startTiming() method whether or not to update the time.
-
timeLabel
javax.swing.JLabel timeLabel
The JLabel containing an image with the word "Time - ".
-
minutesFirst
javax.swing.JLabel minutesFirst
The first digit of the minutes for the timer.
-
minutesSecond
javax.swing.JLabel minutesSecond
The second digit of the minutes for the timer.
-
m
javax.swing.JLabel m
The JLabel containing an image with the word "Min".
-
secondsFirst
javax.swing.JLabel secondsFirst
The first digit of the seconds for the timer.
-
secondsSecond
javax.swing.JLabel secondsSecond
The second digit of the seconds for the timer.
-
s
javax.swing.JLabel s
The JLabel containing an image with the word "Sec".


GFC Test
Follow the instructions
Open this page using IE7 with Google Chrome Frame installed
You should see Firebug Lite opening without problems


Hello there, Im just a delicious human who likes to do things others did before him.
On this site I will showcase my project that I work on through the years.
they will mostly be web-based applications for the universal reach.
All my projects source-code can be found on the github repository. (I hope the space is ENOUGH!)


Pop
A simple jQuery and css3 tooltip example
Hover over one of the 3 boxes below to view the tooltip.
Pop Out Text One
One
Pop Out Text Two
Two
Pop Out Text Three
Three
Home
Download


{{> layout._template.styles}}{{! there are also some scripts as well }}
{{> layout.navbar}}
{{> layout.sidebar}}
{{> layout.breadcrumbs}}
{{> layout.settings}}
{{> layout.footer}}
{{> layout._template.scripts}}


- Users, Shops, Listings, Taxonomy, Favorites, Feedback, Sales Data, Homepage, Treasury, etc.
- Method schema
- RSS feeds
- REST with method override support
- JSON and JSONP response format
- Paging, field selection, associations
- Public and Private service endpoints
- Public: unsigned requests (API key only)
- Private: OAuth 1.0a
- Some calls work on both
- Use Sandbox for development


| Total net profit | -29.02 | Gross profit | 57.69 | Gross loss | -86.71 |
| Profit factor | 0.67 | Expected payoff | -0.29 | ||
| Absolute drawdown | -29.02 | Maximal drawdown (%) | 38.68 (400.41%) | ||
| Total trades | 101 | Profit trades (% of total) | 50 (49.5%) | Loss trades (% of total) | 51 (50.5%) |
| Long positions (won %) | 51 (62.75%) | Short positions (won %) | 50 (36.0%) | ||
| Largest | profit trade | 3.79 | loss trade | -2.8 | |
| Average | profit trade | 1.15 | loss trade | -1.7 | |
| Minimum | profit trade | 0.16 | loss trade | -0.04 | |
| Maximum | take profit in pips | 49.5 | stop loss in pips | -37.8 | |
| Average | take profit in pips | 16.1 | stop loss in pips | -26.2 | |
| Minimum | take profit in pips | -3.7 | stop loss in pips | -5.9 | |
| Maximum | Reward-Risk | 3.3 | Duration in minutes | 3361 | |
| Average | Reward-Risk | 0.7 | Duration in minutes | 169.3 | |
| Minimum | Reward-Risk | 0.0 | Duration in minutes | 0 | |
| Maximum | consecutive wins (profit in money) | 6.0 (8.21) | consecutive losses (loss in money) | 5.0 (-5.31) | |
| Average | consecutive wins | 1.0 | consecutive losses | 1.0 |
| Total net profit | -0.05 | Gross profit | 36.36 | Gross loss | -36.41 |
| Profit factor | 1.0 | Expected payoff | -0.0 | ||
| Absolute drawdown | -2.34 | Maximal drawdown (%) | 11.68 (125.05%) | ||
| Total trades | 51 | Profit trades (% of total) | 32 (62.75%) | Loss trades (% of total) | 19 (37.25%) |
| Largest | profit trade | 3.79 | loss trade | -2.8 | |
| Average | profit trade | 1.14 | loss trade | -1.92 | |
| Minimum | profit trade | 0.16 | loss trade | -0.12 | |
| Maximum | take profit in pips | 49.5 | stop loss in pips | -37.8 | |
| Average | take profit in pips | 15.7 | stop loss in pips | -29.1 | |
| Minimum | take profit in pips | -3.7 | stop loss in pips | -13.1 | |
| Maximum | Reward-Risk | 3.3 | Duration in minutes | 3361.0 | |
| Average | Reward-Risk | 0.6 | Duration in minutes | 229.9 | |
| Minimum | Reward-Risk | 0.0 | Duration in minutes | 0.0 | |
| Maximum | consecutive wins (profit in money) | 6.0 (5.69) | consecutive losses (loss in money) | 4.0 (-8.54) | |
| Average | consecutive wins | 2.0 | consecutive losses | 1.0 |
| Total net profit | -28.97 | Gross profit | 21.33 | Gross loss | -50.3 |
| Profit factor | 0.42 | Expected payoff | -0.58 | ||
| Absolute drawdown | -29.44 | Maximal drawdown (%) | 33.88 (763.06%) | ||
| Total trades | 50 | Profit trades (% of total) | 18 (36.0%) | Loss trades (% of total) | 32 (64.0%) |
| Largest | profit trade | 2.44 | loss trade | -2.37 | |
| Average | profit trade | 1.19 | loss trade | -1.57 | |
| Minimum | profit trade | 0.32 | loss trade | -0.04 | |
| Maximum | take profit in pips | 40.8 | stop loss in pips | -34.3 | |
| Average | take profit in pips | 16.5 | stop loss in pips | -23.2 | |
| Minimum | take profit in pips | -0.7 | stop loss in pips | -5.9 | |
| Maximum | Reward-Risk | 3.3 | Duration in minutes | 403.0 | |
| Average | Reward-Risk | 0.8 | Duration in minutes | 107.5 | |
| Minimum | Reward-Risk | Duration in minutes | 0.0 | ||
| Maximum | consecutive wins (profit in money) | 2.0 (4.44) | consecutive losses (loss in money) | 7.0 (-9.91) | |
| Average | consecutive wins | 1.0 | consecutive losses | 2.0 |