Prototype datamart/reporting system, used for aggregate reporting and rapid insight. DEMO COMING!
I was asked to revitalize an internal reporting tool that was on its final legs in a last ditch effort to save it from the brink.
The result was DataMart, a systems reporting aggregator that tied together disparate ERP, CRM, and SFA data into a single, unified view. It was wildly successful and is now the defacto account management tool -- there is even a training program behind it. One of my favorites!


Cloud - Big Data - Streaming Data - Micro Services - NoSQL
Find Out More Contact MeBuilding quality in from the start.
Years of experience in building real-life 24/7 systems on Amazon AWS.
Capture and turn your application data into real business value.
Build huge clusters using in-memory and NoSQL data stores.
Being an IT architect is just my dream job. I've built, launched and cared for many sites and systems in my career, both in the cloud and in the data center. At heart, I'm a pragmatist, and these are the core values that guide my work:
Simplicity
the opposite of accidental complexity, which allows you to understand and reason about a system, especially over time.
Scalability
choosing technology that can scale both down in size to fit on your laptop and up to hundreds of servers in the cloud when you need it.
Reliability
choosing technology and services that will stay up and tend to bounce back.
Serviceability
providing all the monitoring, metrics and insight we will need to keep the site working well and therefore our customers happy!


"Dogma" -- Divine Irreverence by Homer Yen (c) 1999
The litmus test to whether you'll enjoy this movie comes in the very first 15 minutes of the film. An eminent Cardinal of the Catholic Church is about to unveil a marketing promotion to reinvigorate the Church's waning attendance numbers. Comedian George Carlin plays the Cardinal. He espouses the Church's newest campaign, Catholicism Wow! He points out that people believe that the Church has lost its spark and youthfulness. This campaign intends to turn things around. To kick things off, he introduces the Church's newest sacred image called Buddy Christ. The current holy but wholly depressing icon of Jesus hanging from the cross gives the people the 'willies,' as he puts it. This updated, friendlier representation has Jesus winking, giving a warm smile, and displaying a Roger Ebert-like thumbs-up. As another component of his campaign, he designates the entrance to his church as a mechanism of forgiveness. Simply pass through the arch, and all of your sins will be forgotten.
This blessed arch is big news for two fallen angels, Loki (Matt Damon) and Bartleby (Ben Affleck). These two were responsible for the destruction of Sodom and Gomorra, which understandably incurred God's wrath. Exiled to Wisconsin, they have long-awaited their chance to reenter paradise, and this new loophole in Church dogma may just be their ticket. The consequence, however, is that we'll all be blinked out of existence. A celestial war is about to ensue, but it is a human that will be needed to save us all. Bethany (feisty Linda Fiorentino) is selected for this holy crusade. She is visited by the 'voice of God' (Alan Rickman) who asks her for her help. Here's another wacky moment. He appears as a column of flame (a la Burning Bush) in her bedroom. She is not awed by this presence, and instead, reaches for the fire extinguisher.
She grudgingly accepts this bizarre mission. Along the way, she meets up with a host of celestial good guys who want to help Bethany. These include two prophets, very foul-mouthed Jay (Jason Mewes) and Silent Bob (Bob Smith); a muse-turned-stripper (Salma Hayek); and Rufus, the 13th Apostle (Chris Rock, who actually curses less than Jason Mewes). Celestial bad guys want to stop Bethany, led by Azrael (Jason Lee). He welcomes the end of existence and promises to help Loki and Bartelby reenter paradise.
What detracts from an otherwise clever film is the second act. Story lines begin to splinter and it isn't exactly clear who is trying to accomplish what and for what reasons. As the impending apocalyptic events are about to unfold, explanations are given so quickly that I felt that I needed to rewind the film again in order to really understand what was taking place. Gratuitous violence begins to overshadow the tone that has been established, and that made the film seem unbalanced.
Still, I was able to get by the 15-minute litmus test, and laughed at this satirically good-natured film. In part, I enjoyed Fiorentino's steady performance and appreciated the unconventionality of this movie, including Rufus's explanation of why no one has ever heard of the 13th apostle. And, if you can stay the course, it would be no surprise that Jesus might actually be black or that God was a woman (and they might have been because I wasn't here 2000 years ago). Beneath the obscenities, there is intelligent commentary about the belief structures in place within Church doctrine. I don't think it blasphemous of me to say that Director Kevin Smith has certainly taken a leap of faith with a film that has some genuinely clever ideas.
Grade: B
Do You Yahoo!? Bid and sell for free at http://auctions.yahoo.com
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Use #!, not just #, for the shebang.
# /bin/bash echo "Hello World"
#! /bin/bash echo "Hello World"
You appear to be specifying a shebang, but missing the bang (i.e. !). The shebang should always be on the form #!/path/shell.
!
#!/path/shell
None.


cf classes¶
Field construct class¶
A field construct of the CF data model. |
Field list class¶
An ordered sequence of field constructs. |
Metadata component classes¶
An auxiliary coordinate construct of the CF data model. |
|
A cell measure construct of the CF data model. |
|
A cell method construct of the CF data model. |
|
A coordinate reference construct of the CF data model. |
|
A dimension coordinate construct of the CF data model. |
|
A domain ancillary construct of the CF data model. |
|
A domain axis construct of the CF data model. |
|
A field ancillary construct of the CF data model. |
Constructs class¶
A container for metadata constructs. |
Coordinate component classes¶
A cell bounds component of a coordinate or domain ancillary construct of the CF data model. |
|
A coordinate conversion component of a coordinate reference construct of the CF data model. |
|
A datum component of a coordinate reference construct of the CF data model. |
Domain class¶
|
A domain construct of the CF data model. |
Data classes¶
An N-dimensional data array with units and masked values. |
|
An array stored in a netCDF file. |
Miscellaneous classes¶
Self-describing CF flag values. |
|
Encapsulate a condition for subsequent evaluation. |
|
A duration of time. |
|
Store, combine and compare physical units and convert numeric values to different units. |
|
A regridding operator between two grids. |
|
A container for a constant with context manager support. |
|
Dictionary-like container for the global constants. |
Data compression classes¶
Classes that support the creation and storage of compressed arrays.
A count variable required to uncompress a ragged array. |
|
An index variable required to uncompress a ragged array. |
|
A list variable required to uncompress a gathered array. |
|
An underlying gathered array. |
|
An underlying contiguous ragged array. |
|
An underlying indexed ragged array. |
|
An underlying indexed contiguous ragged array. |


{% extends 'layout.html' %} {% set crumbs = (('Miscellany',), ('Changelog',)) %} {% set toc = ( ('v0.4',), ('v0.3.1',), ('v0.3',), ('v0.2.3',), ('v0.2.2',), ('v0.2.1',), ('v0.2',), ('v0.1.9',), ('v0.1.8',), ('v0.1.7',), ('v0.1.6',), ('v0.1.5',), ('v0.1.4',), ('v0.1.3',), ('v0.1.2',), ('v0.1.1',), ('v0.1',) ) %} {% block content %}
This page is a comprehensive list of all user-visible changes between versions. If you are upgrading be sure to check out the upgrading page for any backwards incompatible changes.
domain
configuration setting, it defaults to https
.mynt.yml
. Support for config.yml
will be removed in a future release.

from and added classes to the outputted markup for Markdown footnotes.items
and values
, that act as syntactic sugar for iteritems()
and itervalues()
.item
properties, prev
and next
, that store the previous and next items in the container.posts_order
and posts_sort
.archives
and tags
globals are now properties of the posts
global to maintain consistency between content containers.post
local has been renamed item
to maintain consistency between content containers.<title>
variable in URL formats has been renamed to <slug>
.markup
and parser
configuration settings have been removed.parser
frontmatter attribute, the parser
container configuration setting, and lastly the file extension.layout
frontmatter attribute can now be set to None
to skip rendering.data-lang
attribute of the
tag instead of the lang
attribute of the

tag.watch
subcommand now honors the configured log level.serve
subcommand.serve
subcommand when handling paths containing Unicode characters.watch
subcommand when a file is moved into the directory that is being watched.absolutize
filter of the Jinja renderer.get_url
template helper where it was appending a forward slash when it shouldn't.init
, gen
, watch
, and serve
.gen
subcommand.get_url
template helper if the domain
configuration setting has been set.excerpt
post property is no longer wrapped in a

tag.setup.py
.year
and name
properties from archives and tags respectively.mtime
.slug
property from posts.name
attribute to tags.-qv
flags.Initial release.
{% endblock %}


1 - Click To Hide
2 - Click To Hide
3 - Click To Hide
Click To Slide Up
Click To Slide Down
Click To Slide Toggle


Ready for your next challenge? Believe in working smart, and want to have fun doing it? Ematic Solutions might just be the place for you!
We’re a SaaS provider offering a Marketing Intelligence Platform that helps digital marketers nimbly build and deploy sophisticated and high ROI digital marketing programs. Our goal is to make the digital marketer smarter!
We’re a global team of 120 (and growing!) email experts, developers, metric-obsessed marketers and data nerds who believe that Artificial Intelligence can take digital marketing where it has never been before. At lunch we find ourselves talking shop, and actually enjoying it. We’re a nimble, flexible and fun group, where your good ideas can make a difference!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis et enim aperiam inventore, similique necessitatibus neque non! Doloribus, modi sapiente laboriosam aperiam fugiat laborum. Sequi mollitia, necessitatibus quae sint natus.
Posted by Anonymous on 3/1/17Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis et enim aperiam inventore, similique necessitatibus neque non! Doloribus, modi sapiente laboriosam aperiam fugiat laborum. Sequi mollitia, necessitatibus quae sint natus.
Posted by Anonymous on 3/1/17Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis et enim aperiam inventore, similique necessitatibus neque non! Doloribus, modi sapiente laboriosam aperiam fugiat laborum. Sequi mollitia, necessitatibus quae sint natus.
Posted by Anonymous on 3/1/17


I will continue adding new good resources to this post. But don’t get lost in them. Choose one and keep learning. After you finished one course, then choose another one.
Hope this can be helpful to you!
Github Resources
Roadmap of DL and ML
For a newecomer to deep learning and machine learning area, facing some much courses and resources, the first question is how to choose right books and courses to begin this trip.The roadmap includes some highly recommended courses, books and papers which can help you get into DL and ML area quickly. Maybe some materials are quite difficult, but really worth reading and studying.
Machine Translation Reading List
A machine translation reading list maintained by the Tsinghua Natural Language Processing Group.
TensorFlow Course
This repository aims to provide simple and read-to-use tutorials for TensorFlow. Each tutorial includes source code
and most of them are associated with a documentation
.
Summer School on Deep Learning and Bayesian Methods
In this course, they discuss how Bayesian Methods can be combined with Deep Learning and lead to better results in machine learning applications.
The most important thing is this course provides full videos, slides and assignments.
Machine Learning for OpenCV
It is a Jupyter notebook version of this book
It might be a good book for the people who want to learning CV but with little background.
Kaggle Past Solution
A searchable and sortable compilation of Kaggle past solutions. Website
Hands-On Machine Learning
This project aims at teaching you the fundamentals of Machine Learning in python. It contains the example code and solutions to the exercises in this book.
You can download a pdf version of this book at here.
Code for PRML
This Matlab package implements machine learning algorithms described in the great textbook: Pattern Recognition and Machine Learning by C. Bishop (PRML).
Cheatsheets AI
Essential Cheat Sheets for deep learning and machine learning researchers and practitioners.
Paper with code
The mission of Papers With Code is to create a free and open resource with Machine Learning papers, code and evaluation tables.
Interpretable machine learning
This book explains to you how to make (supervised) machine learning models interpretable.
Q&A of Some Concrete Topics
Maximum Likelihood Estimators - Multivariate Gaussian
The full derivation of the Maximum Likelihood Estimators for the multivariate Gaussian.
Why Is The Cov of Multivariate Gaussian Positive Definite?
Page 3 of a note of CS229.
Why We Use Negative (log) Likelihood Sometimes?
This question puzzled me when I read page 96 of PRML. The original book uses likelihood, but in the errata, the author changed likelihood to negative likelihood to statisfy to condition of Robbins and Monro(1951).
Completing The Square
In this reference tutorial, we will demonstrate how to complete the square in both univariate (scalar) and multivariate (matrix) contexts. You can also find relevant discussion in section 2.3.1 of PRML.
Normal distance from the origin to the dession surface
Derivation of PRML eq(4.5).


This procedure calculates the TURF values for a set of response variables. TURF differs from simple frequencies by accounting for overlapping responses.
The reach for a combination of variables is the number of cases where at least one variable in the combination has a positive response. The frequency is the total number of positive responses to the combination. The Pct of Responses calculation uses all the positive responses to any variable in the table as the denominator.
Variables to Analyze Select the variables to analyze. All should be coded the same way, at least for positive responses.
Maximum Variable Combinations Specify the maximum number of combinations for which to calculate the TURF. If you specify 3, for example, best values will be reported for all individual variables, all combinations of two variables, and all combinations of three.
Number of Combinations to Display This determines the maximum number of rows in each table. The rows are sorted in descending order of reach, with ties broken by frequency. However, there could be additional ties with the last item in the table.
Minimum Percentage of Positive Responses If there are fewer than this percentage of positive responses for a variable, it is discarded from the analysis. Variables with zero positive responses are always discarded. This filter is not applied to forced variables: they are always included.
Positive Response Value(s) By default, a value of 1 defines a positive response. Enter one or more values to define positive responses differently. For example, if response values are on a scale of 1 to 5, you could top box these by entering 5 or 4 5. Put a space between values.
Number of Analyze Variables Always Required The value, n, indicates the the first n variables listed in the Variables to Analyze box are required and will thus appear in every combination of variables regardless of their effect on the reach. If the value is 0, no variables are forced. If the value is positive, there cannot be any removal cycles.
Times to Remove Top Variable and Repeat Run Enter the number of times the best single variable should be removed and the analysis repeated for the remaining variables. Only the cases where the best single variable did not have a positive response are used. The effect is cumulative, so two cycles would repeat the analysis a second time without the best variable in the first round and the best variable in the second round. It would only use cases that were negative on both variables for the second round.
If using heats, the remove cycle applies only to the finals round
Reach and frequency plot Check this box to produce a plot showing the best reach and frequency for each group size.
Show only results for maximum variables combination Check this box to show only the table for the maximum combination of variables. If unchecked, tables are shown for the best combinations for each size up to and including the maximum number of variables. If using heats, one table is shown per heat regardless of this setting.
Size Limit TURF analysis can require calculating a surprisingly large number of set unions and take considerable time to run. If you specify a limit, the analysis will not be carried out if it would exceed this limit. The TURF output includes a statement of the number of set unions that are required. You can set the limit to 0 to see the problem size without running the analysis. The size information appears in a Viewer log object.
If heats are used, the size applies to each heat and the final round separately.
As the number of variables and number of combinations grows, the computation time increases dramatically. You can use heats to find an approximate but usually accurate solution in dramatically less time.
Use heats for large problems If this box is checked, the procedure will run heats on randomly chosen subsets of the variables with all variables included in some heat, and the heat winners will be included in a final round. The heat size and number of winners that advance to the finals are controlled by the Heat Size and Number of Winners parameters. Check Automatic to let the procedure set these parameters, or check Specify to set on or both of these values.
The heat size and number of winners values should not include forced variables, since they are automatically included in every heat.
For good performance, the number of winners setting should be much smaller than the heat size. It is best to balance the size and winners settings so that the final round is not substantially larger than the preliminary round sizes.
If the heat size is large enough to include all the variables in one heat, the preliminary round is skipped.
Since variables are randomly assigned to heats, you can get an idea of how the heat-based solutions compare with the exact solution by running this procedure multiple times and examining the best reach reported for each or by slightly increasing the number of winners parameter.
The output includes the mean and total importance of positive responses if weights are used. First, the average of the importance weights for the positive responses for a particular variable combination is calculated for each case that has at least one positive response. The output reports the mean of those means. The total importance is also displayed.
Weight Checking These radio buttons determine how the weight specification is checked and used. If All variables... is selected, the specification must list every variable in the analysis if any weights are used. If Assume weight... is selected, variables not listed are assumed to have a weight of 1.
Weight specifications Enter
variable names and weights. List each variable name followed by
the importance weight for that variable. For example,
V1 2 V2 1.5
assigns a weight of 2 to variable V1 and 1.5 to V2. The decimal
symbol must always be a period.
The percentage results are based on the cases included, so the base will differ with the two approaches. Thresholding can also introduce differences as it is affected by the base.
The base for reach percentages counts all respondents (after any filtering in effect), so a missing value can contribute to the base. With multiple variables in a group, there is no obvious other way to compute the base.
The computational burden of this calculation grows very rapidly with the number of variables and the value of Maximum Variable Combinations. The output includes the number of set union calculations required. Using heats is recommended for large problems.
All data on positive responses is held in memory. Only one data pass is required.
This dialog generates syntax for the SPSSINC TURF extension command. To display help for this command, run the following syntax:
SPSSINC TURF /HELP.
In syntax you can specify a log file that records progress during execution of the command. This can be helpful for very long running jobs.
Syntax provides additional controls over the tables that are displayed.
This dialog requires the Integration Plug-In for Python and the SPSSINC TURF extension command. For IBM® SPSS® Statistics 19 and higher, the Plug-In and the extension command are installed with the Essentials for Python. For more information, see How to Get Integration Plug-Ins, under Core System > Frequently Asked Questions in the IBM SPSS Statistics Help system.
© Copyright IBM Corp. 1989, 2016


All of our coffees are roasted on site, right in the back of our café. Amid jute bags of green coffee from the best small-lot farms in the world, you'll find us roasting, cupping and bagging our favorites of the season.


If you search LinkedIn for groups related to Scrum, you get almost 700 results as of this writing. Many of these are fantastic groups, with great people offering advice from the trenches. If you use Agile, particularly Scrum, you should follow these groups. Just beware that there is a problem there: sometimes you find yourself staring into the wide eyes of the converted. It's particularly bad if you're staring in a mirror.
From time to time people in various Scrum groups ask "What are the weakness of Scrum?" And, I kid you not, more than once I have seen the reply "none, Scrum is perfect."  Out of deference to their disability, I will set a goal for the meeting, time-box it at eight hours, and when the participants email me the action items, I will print out that email and burn it. It will be a good day.
Or, as a fellow Agile trainer wrote to me "some of my clients are dumping Scrum just to get away from the zealots."
Lord, save me from your followers.
Fortunately, those who believe that Scrum (or XP, or Kanban, or Scrumban, or, or, or ...) is perfect, are in the minority. They're the obvious crackpots that we greet with a fixed smile and back away from slowly, but there are the less obvious crackpots who are far more dangerous because they sound so reasonable.
These are the ones who believe with a fiery passion that everything should be Agile.
To understand this, we need to remember what Agile is. Agile development is simply a set of practices designed to better cope with uncertainty and change. That's all. A key indicator of when to use Agile is when you're developing a new technology and saying "wow, look at all the possibilities!" When you're breaking new ground, when you're pushing change rather than following the herd, then Agile is a great approach.
But what if you don't have a rapidly changing environment? What if quality and reproducibility are more important considerations? Janitors don't need product owners. They don't create "who/what/why" story cards. They don't have sprints. If your janitorial staff are struggling with a chaotic, uncertain environment, you have bigger problems on your hands. Mind you, there are janitors who have to deal with rapidly changing environments and uncertainty. We call them SEAL teams.
OK, so maybe you've outsourced your janitorial staff and are thinking everything else can be Agile. Let's head over to your accounting department. Forget about your prejudices for a moment and look at what accounting does. Ask yourself one question "do I want them using a project management system that's optimized for uncertainty and change, or quality and reproducibility?" Remember, your answer not only has financial implications, but legal ones as well.
When it's phrased in those terms, the answer is fairly clear. Even the most ardent Agile proponents would have to agree that an accounting team may need to be run differently from a software development team. There is no "one size fits all" suit for project management and if you're trying to cram everything in your organization into the same system, you're begging for trouble.
As a rule of thumb, for every department ask yourself how "new" their product is. The newer it is, the more likely it's being born in an uncertain environment and Agile is a good approach. If it's an older, mature, stable environment, consider PRINCE2, TQM, or other related project management solutions. Lean solutions fit somewhere in the middle of those two extremes.
Don't let yourself get caught up in the hype. Agile solutions are excellent, but don't go out in pairs, knocking on doors and preaching to the masses. Different problems require different solutions and we need to give up our ever present quest to find the One True Way.
If you'd like to know more, you might want to read when to choose agile
Please leave a comment below!
If you'd like top-notch consulting or training, email me and let's discuss how I can help you. Read my hire me page to learn more about my background.
Copyright © 2018-2023 by Curtis “Ovid” Poe.


hl-persistence-binding
Subscribe
Unsubscribe
list-devices
list-device-capabilities
start-polling
stop-polling


Project Information
Click Me!
Scope and Inspiration
This webpage displays information from a Kaggle dataset on the top songs (according to Billboard rankings) worldwide on Spotify between 2010 and 2019.
We were inspired to work on this dataset because Spotify is a widely used streaming application, and drawing connections between different song qualities (here called "factors") seemed like an intriguing idea.
Points of Interest
- The three strongest positive correlations found are between decibels and energy (0.538), valence and danceability (0.502), and valence and energy (0.41). The strongest negative correlation was between acousticness and energy (-0.562). (Heatmap)
- The pop genre is always 'popular', making up 80% of the top tracks (Sunburst)
- 2013 marks the year where a greater variety of genres start appearing within the top tracks (Bubble)
- 2013 and 2015 tracks are high in positivity (valence), danceability and energy. They also seem to be years with the most popular tracks. Meanwhile 2012 and 2019 mark a downturn in all these factors. (Bar)
Terms
- Popularity/pop: how popular a song is. The higher the number, the more popular it is.
- Speechiness/spch: how much spoken word is in the track.
- Acoustic-ness/acous: how acoustic the song is.
- Duration/dur: how long the track is (in seconds).
- Valence/val: how positive the track is.
- Liveness/live: how likely it is for the track to be a live recording.
- Decibels/dB: how loud the track is.
- Danceability/dnce: how easy it is to dance to the song.
- Energy/nrgy: how energetic the song is.
- Beats Per Minute/bpm: how many beats per minute, or, the track's tempo.
Correlation Heatmap
This chart is a correlation heatmap showing the level of relation between the different factors of each song. The values within this chart range from -1 to 1, with 1 signifying a closer relation.
Hover over the tile to see the correlation value. Use the heat legend to see the r-value.
Sunburst Chart
This chart is a sunburst which depicts genres, artists and songs. The innermost circle shows the genre; within each genre are the artist names, and the outermost circle shows the songs by each artist.
Click on each slice to expand that segment.
Bubble Chart
This graph shows a bubble chart showing the tracks from a given year, comparing factors of each track against each other. The color of the bubbles are determined by the genre of the tracks, and the popularity of the track determines the bubble size.
Choose the year, and factors you want on the x- and y-axes, then click 'Make Chart' to see those factors compared.
- Current Changes to Apply:
Bar
This graph is a bar chart that organizes the tracks per year, and shows the total value of all the tracks for a certain factor.
Choose the factor you want displayed, then click 'Make Chart' to see that factor compared across the years compared.


4.0 Introduction
4.1 Objectives
4.2 Elements of Electronic Spread Sheet
4.2.1 Opening of Spread Sheet
4.2.2 Addressing of Cells
4.2.3 Printing of Spread Sheet
4.2.4 Saving Workbooks
4.3 Manipulation of Cells
4.3.1 Entering Text, Numbers and Dates
4.3.2 Creating Text, Number and Date Series
4.3.3 Editing Worksheet Data
4.3.4 Inserting and Deleting Rows, Column
4.3.5 Changing Cell Height and Width
4.4 Function and Charts
4.4.1 Using Formulas
4.4.2 Function
4.4.3 Charts
4.5 Summary


--- layout: post permalink: boobybluefoot.html Tags: Array NameOfCoupon: Booby Bluefoot Cash Back Summary: See our Booby Bluefoot Coupon Code, Booby Bluefoot Rebate, Booby Bluefoot Promo Code, Booby Bluefoot Discount, Booby Bluefoot Coupon Cash Back Rebate here. MetaKeywords: Booby Bluefoot Coupon Code, Booby Bluefoot Rebate, Booby Bluefoot Promo Code, Booby Bluefoot Cash Back Rebate, Booby Bluefoot Discount, Booby Bluefoot Coupon Image: images/27573.jpg LinkURL: http://www.shareasale.com/r.cfm?b=234542&u=412002&m=27573 affiliate_url_link: http://www.icouponblog.com/jane.php?id=1156 thesis_readmore: See the Booby Bluefoot Coupon thesis_thumb: http://www.icouponblog.com/tn.php?merchantURL=boobybluefoot.com Title: Save 10% - Booby Bluefoot Coupon Code for boobybluefoot.com. Booby Bluefoot Rebate & Discount thesis_description: Our Booby Bluefoot Discount Coupon Code for boobybluefoot.com. We have the best Booby Bluefoot Rebate anywhere. thesis_keywords: Booby Bluefoot, Booby Bluefoot Coupon Code, Booby Bluefoot Discount, Booby Bluefoot Rebate product_name: Booby Bluefoot hop_url: http://www.icouponblog.com/hop.php?id=1156 ---
Booby Bluefoot has products that will greatly benefit your skin, your general appearance and your overall health. You can get a supply of daily antioxidant supplement. It is a pinnacle of super ingredients that resulted from cutting edge scientific findings, and wisdom of ancient medicine. Booby Bluefoot’s daily antioxidant supplement is a defense mechanism for your skin that is an indispensable part of your skincare regimen. Get it today and start nourishing, protecting and caring for your skin.
Booby Bluefoot has the best and the most beneficial facial cleanser and cream available. Check it out online now. The skin cleaners are for all skin type and have a powerful non stripping, gentle action. The daily skincare cream is an amazing moisturizer. It will help you maintain a youthful radiance. Also get Booby Bluefoot’s ‘sunshine vitamin’…vitamin D supplement. It is good for the skin, heart and bones. According to The Harvard Heart Letter, 40% Americans over the age of 30 are deficient in vitamin D. Check out Booby Bluefoot products online. They are great products made from natural ingredients and are formulated to succeed. They are also low priced!


<colorpickerA jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/colorpicker" fieldLabel="No validation" name="./colorpickerA"/> <colorpickerB jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/colorpicker" fieldLabel="Required" name="./colorpickerB" required="{Boolean}true"/>


GPS style navigation system that guides you towards your nearest quest target.
Increase the effectiveness of Stimpaks and RadAway in order to restore more health and remove more radiation.
TBC


THE CRUCIBLE A film review by Scott Renshaw Copyright 1996 Scott Renshaw
(20th Century Fox) Starring: Daniel Day-Lewis, Winona Ryder, Paul Scofield, Joan Allen, Bruce Davison, Rob Campbell. Screenplay: Arthur Miller, based on his play. Producers: Robert A. Miller, David V. Picker. Director: Nicholas Hytner. MPAA Rating: PG-13 (brief nudity, adult themes) Running Time: 125 minutes. Reviewed by Scott Renshaw.
To demonstrate my empathy with the themes of THE CRUCIBLE, I'm going to engage in a bit of heresy of my own: I don't think Arthur Miller's play is particularly good. I'm not suggesting that it is dated, as other critics have done. Irrational fear and extremism are alive and well in 1990s America; you only need to watch the recent documentary PARADISE LOST for evidence. The ideas in THE CRUCIBLE were never the issue, but those weighty issues overwhelmed under-developed characters. Productions of THE CRUCIBLE have lived or died on the ability of the actors to invest the material with feeling missing from the page, and this first English-language film of the play is no different. Fortunately, the cast is very strong, and the conventions of cinema give the energy level a much-needed boost. Flawed as it may be, THE CRUCIBLE still has moments of undeniable power.
Set in 1692 in Salem, Massachusetts, THE CRUCIBLE begins with a gathering in the woods where several young girls, led by Abigail Williams (Winona Ryder) play at conjuring spirits. The fun ends when they are discovered by Reverend Parris (Bruce Davison), and the Reverend's own daughter is frightened into a catatonic state. To save themselves from punishment, the girls begin accusing Salem's women of witchcraft, naming names indiscriminately. Abigail, however, has one specific name in mind: Elizabeth Proctor (Joan Allen), wife of her former employer -- and lover -- John Proctor (Daniel Day-Lewis). As Salem becomes a town ruled by paranoia, Judge Danforth (Paul Scofield) arrives to try the accused witches, with only a few men like Proctor brave enough to challenge the court.
Miller's 1953 play is well-known as an allegory for the "red scare" and black-listing of the 1950s, but Miller's own screen adaptation attempts to make the story less specific to that era, while also making it more visual. The girls' ritual gathering, only described by other characters in the play, is shown in graphic detail, including blood-smeared faces and nude writhing; an incident where Abigail stabs herself with a needle and accuses Elizabeth of hexing her is similarly portrayed. The scenes are not meant simply for shock value, but to emphasize the active hypocrisy of the accusers. They also make Abigail less a creature of youthful spite and more a deeply disturbed young woman caught up in the attention and admiration she receives for pointing out the witches of Salem. Winona Ryder does some of her best work ever in the role, shedding the restrained quality of her previous period film performances. Here she lets loose like an animal -- desperate, haunted and dangerous.
Ryder is one part of a cast which gives its all to THE CRUCIBLE, beginning with Paul Scofield as Danforth. Scofield brings a commanding, weathered presence to the role of Salem's Grand Inquisitor, and a conviction that the judge's work is good and proper. He also gives lines a punch few other actors could muster; when he announces that he intends to "touch the bottom of this swamp" of accusations and counter-accusations, he utters the word "swamp" with a fearsome authority. Joan Allen's steady, cool Elizabeth is just what the part calls for, and she shows that passive-aggression is not a uniquely 20th century phenomenon. Surprisingly, the weak link in the cast is Daniel Day-Lewis. Proctor is an under-written role, but there is too much self-righteous heroism in Day-Lewis's reading. When he delivers his final plea to avoid a public confession, literally foaming at the mouth, he almost seems to believe he deserves special consideration.
Under-written characters and under-developed relationships are the main faults of THE CRUCIBLE as a text; at times, it feels nearly as plot-driven as a Michael Crichton novel. The story is meant to provoke the audience to outrage at the lives destroyed by false accusers and complicit authority figures, but it only takes a couple of scenes to make the point rather than the repetitive structure of the children's accusations. Still, there are a couple of scenes in THE CRUCIBLE which can get any audience to hold its breath, notably a tense questioning of Elizabeth for which there can be no correct answer. Director Nicholas Hytner (THE MADNESS OF KING GEORGE) offers an interpretation which isn't in the least iconoclastic, but he knows where to use George Fenton's score or a lingering close-up to give a scene added weight. THE CRUCIBLE is a good (though not great) adaptation of a good (though not great) play which still has the ability to cast its own spell.
On the Renshaw scale of 0 to 10 witch crafts: 7.
Visit Scott Renshaw's MoviePage http://www-leland.stanford.edu/~srenshaw Subscribe to receive reviews directly via email See details on the MoviePage
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Image For Thumbnail
The following activity tests ActivityContext methods that can be used by an Activity.
The following methods are available on the activityContext object [passed to Start()],
once an activity is running.
- navigateToNextPage()
- navigateToPreviousPage()
BL-9871 Page 1
Test of Widget navigation.
BL-9871 Page 2
Test of Widget navigation.


<EMAIL_ADDRESS>You only have a limited amount of time to weast on this page,
so make the most of it.


Get(CurrentExtendedPrivileges)Returns a list of keywords, separated by carriage returns, for the enabled extended privileges. The list that is returned is based on the account that is being used to evaluate this calculation. See also Get(AccountExtendedPrivileges) function.Extended privileges are additional access rights assigned to an account’s privilege set. See About accounts, privilege sets, and extended privileges.
• If you specify the context for the current calculation, this function will be evaluated based on that context; otherwise, it will be evaluated based on the context of the current window.
• Position(Get(CurrentExtendedPrivileges); "fmwebdirect"; 1; 1) returns a value greater than 0.If you are logged in and running a script that is set to run with full access privileges, Get(AccountExtendedPrivileges)returns the extended privileges for your account, but Get(CurrentExtendedPrivileges)returns the extended privileges for the Admin account.


Class CalendarclassComponent
Object class, allowing __construct and __destruct in PHP4.
Also includes methods for logging and the special method RequestAction, to call other Controllers' Actions from anywhere.
- Object
- CalendarclassComponent
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
Object(),
__construct(),
__openPersistent(),
_persist(),
_savePersistent(),
_set(),
cakeError(),
log(),
requestAction(),
toString()
|
public
integer
|
$year | 2000 |
|
public
integer
|
$month | 1 |
|
public
integer
|
$day | 0 |
|
public
array
|
$week_day_names | array() |
|
public
string
|
$error | "" |
|
public
integer
|
$month_days | 0 |
|
public
integer
|
$month_week_day | 0 |
|
public
integer
|
$calendar_rows | 0 |
|
public
integer
|
$border | 1 |
|
public
string
|
$width | '100%' |
|
public
string
|
$style | '' |
|
public
string
|
$class | '' |
|
public
integer
|
$page | 0 |
|
public
integer
|
$rowsperpage | 10 |
|
public
integer
|
$totalrows | 0 |
|
public
integer
|
$headerlistingrowrange | 1 |
|
public
integer
|
$footerlistingrowrange | 0 |
|
public
integer
|
$headerlistingpages | 0 |
|
public
integer
|
$footerlistingpages | 1 |
|
public
integer
|
$listpages | 3 |
|
public
string
|
$pagevariable | 'page' |
|
public
string
|
$pagelinkurl | '' |
|
public
array
|
$pagelinkvalues | array() |
|
public
string
|
$pagelinkvaluesstring | '' |
|
public
string
|
$rangelinkseparator | ' | ' |
|
public
string
|
$firstprefix | '<<' |
|
public
string
|
$previousprefix | '<' |
|
public
string
|
$nextsuffix | '>' |
|
public
string
|
$lastsuffix | '>>' |
|
public
integer
|
$rangeinfirstlast | 1 |
|
public
integer
|
$rangeinpreviousnext | 1 |
|
public
integer
|
$this_year | 0 |
|
public
integer
|
$this_month | 0 |
|
public
integer
|
$this_day | 0 |
|
public
string
|
$days_highlight | "#EFEFEF" |
|
public
string
|
$today_highlight | "#00DDDD" |
$_log
|


What is Customer Engagement?
Customer engagement refers to the practices that organizations employ to keep users coming back to their applications. Maximizing customer engagement is vital in today’s digital marketplace, where an ever-increasing number of brands are competing for a finite amount of customer attention. In this article, we discuss the factors that impact customer engagement, and provide information about specific steps you can take to improve customer engagement.
Why customer engagement matters
In 2012, the average adult in the United States spent one hour per day using his or her mobile device; by 2017, that figure had increased to 5.6 hours per day. Over half of that time is spent using third-party apps, but the majority of app users access 20 or fewer apps each month. Of those 20 apps, most users spent the vast majority of their time in their top 10 applications.
At the same time, first impressions are everything in today’s digital marketplace. Almost a quarter of users have downloaded an app, ran it once, and never opened it again. Additional research suggests that as many as 80% of all app users stop using a given app within 90 days.
These statistics paint a very clear picture: in order to succeed in this highly competitive environment, organizations must deliver digital content that delights and engages their customers.
Customer engagement in action
Let’s assume your organization produces a mobile app for sports fans called All Things Sports. In your app, users can get the latest sports news, purchase memorabilia and event tickets, and play exciting mini-games. Your organization has devoted a large amount of time, effort, and money into creating a best-in-class app and acquiring new users. For this reason, it’s essential that your users keep coming back to your application so that your business can grow.
For all applications, user interactions fall into three categories: activation, retention, and conversion. All Things Sports requires users to confirm their email address and select their favorite sports teams; the percentage of users who complete this process is the activation rate. Next, you need to offer content that is compelling enough to keep your users coming back. All Things Sports offers fun mini-games and special offers that encourage users to return to the app often. The likelihood that your customers will return to your application repeatedly is referred to as your retention rate. Finally, your organization needs to make money in order to grow. The main revenue generating activity in All Things Sports is the sale of event tickets and merchandise. The percentage of users who purchase these products through your app is your conversion rate. As the application developer, you have to continuously improve all three of these metrics in order to grow your business.
The first step toward improving these metrics is to gather customer analytics data. Customer analytics data is the data you collect and analyze to better understand the ways in which customers use your application. A thorough analysis of this data can help you better serve your users, thereby increasing their engagement with your application. Making optimizations to your application based on this data can lead to positive reviews, better app store rankings, and increased word of mouth. These factors can increase your activation rate, which can in turn increase your retention and conversion rates. You can start gathering this information by integrating the AWS Mobile SDK into your application. For more information about customer analytics, see our companion article, What are Customer Analytics?
The next step toward improving customer engagement is to create targeted segments of customers based on their characteristics. By targeting specific customers based on their demographics, preferences, behaviors, and interests, you can ensure that you’re using the right channels to send the right messages to the right customers. Amazon Pinpoint can import app usage data obtained from the AWS Mobile SDK and use it to create customer segments. To learn more about the ways in which you can create customer segments, see our companion article, What is Customer Segmentation?
The final step toward improving customer engagement is to deploy personalized, multi-channel messaging to your customers. You can use these messages to proactively update engaged customers on exciting new features and improvements in your application, or to incentivize less-engaged customers to sign back in to your application. You can also use this messaging to convey vital transactional content—such as password reset emails or purchase confirmations—to all customers. You can also use Amazon Pinpoint to meet this need. For more information about multi-channel messaging, see the companion article titled What is Multi-Channel Messaging?
What Is Amazon Pinpoint?
Amazon Pinpoint is an AWS service that you can use to engage with your customers across multiple messaging channels. You can use Amazon Pinpoint to send push notifications, emails, SMS text messages, and voice messages.
Amazon Pinpoint Features
This section describes the major features of Amazon Pinpoint and the tasks that you can perform by using them.
Define Audience Segments
Reach the right audience for your messages by defining audience segments. A segment designates which users receive the messages that are sent from a campaign or journey. You can define dynamic segments based on data that’s reported by your application, such as operating system or mobile device type. You can also import static segments that you define outside of Amazon Pinpoint.
Engage Your Audience with Messaging Campaigns
Engage your audience by creating a messaging campaign. A campaign sends tailored messages on a schedule that you define. You can create campaigns that send push notifications, email, SMS text messages, and voice messages.
To experiment with alternative campaign strategies, set up your campaign as an A/B test, and analyze the results with Amazon Pinpoint analytics.
Create User Journeys
Create custom, multi-step experiences for your customers by designing and building journeys. With journeys, you can send messages to your customers based on their attributes, behaviors, and activities. When you build a journey, you design an automated workflow of activities that perform a variety of different actions—for example, sending an email message to participants, waiting for a certain period of time, or splitting participants based on actions that they take, such as clicking a link in a message.
Provide Consistent Messaging with Templates
Design consistent messages and reuse content more effectively by creating and using message templates. A message template contains content and settings that you want to reuse in messages that you send for any of your Amazon Pinpoint projects. You can use message templates in email messages, push notifications, SMS messages, and voice messages.
Deliver Personalized Content
Send content that’s customized for each recipient of a message. Using message variables and attributes, you can deliver dynamic, personalized content in messages that you send from campaigns and journeys.
To streamline development, you can also use message variables and attributes to add personalized content to message templates. With message templates, this content can come from attributes that you create directly in Amazon Pinpoint or a machine learning model that you create in Amazon Personalize. By connecting message templates to models in Amazon Personalize, you can use machine learning to send relevant promotions or recommendations to each recipient of a message.
Analyze User Behavior
Gain insight into your audience and the effectiveness of your campaigns and messaging activities by using the analytics that Amazon Pinpoint provides. You can view trends in your users’ level of engagement, purchase activity, demographics, and more. You can also monitor your message traffic by viewing metrics such as the total number of messages that you sent for a campaign or project. Through the Amazon Pinpoint API, your application can also report custom data, which Amazon Pinpoint makes available for analysis.
To analyze or store analytics data outside Amazon Pinpoint, configure Amazon Pinpoint to stream the data to Amazon Kinesis.
Send Test Messages
Test the design and deliverability of your messages by sending test messages before you send messages to your customers.
Get Started
Get started with Amazon Pinpoint by creating a new project or completing a tutorial.
Getting Started with Amazon Pinpoint
To start sending targeted messages in Amazon Pinpoint, you have to complete a few steps. For example, you have to add customer contact information into Amazon Pinpoint, and then create segments that target certain customers. Next, you have to create your messages and schedule your campaigns. Finally, after you send your campaigns, you can use the analytics dashboards that are built into Amazon Pinpoint to see how well the campaigns performed.
Intended Audience
This tutorial is designed for marketing and business users.
Features Used
This tutorial shows you how to complete all of the following steps by using the Amazon Pinpoint console:
-
Importing customer data from a file.
-
Creating a segment that targets specific users based on their attributes.
-
Creating an email campaign and scheduling it to be sent at a specific time.
-
Viewing email delivery and response data by using the analytics dashboards that are built into Amazon Pinpoint.
Step 1: Create and Configure a Project
To create a project and verify an email address
-
Open the Amazon Pinpoint console at https://console.aws.amazon.com/pinpoint/.
-
On the All projects page, choose Create a project.
-
On the Create a project window, for Project name, enter a name for your project, and then choose Create.
Note The project name can contain up to 64 characters.
-
On the Configure features page, next to Email, choose Configure.
-
For Email address, type an email address that you want to use to send email. For example, you can use your personal email address, or your work email address. Choose Verify.
-
Wait for 1–2 minutes, and then check the inbox for the email address that you specified in step 4. You should see an email from Amazon Web Services<EMAIL_ADDRESS>with the subject line “Amazon Web Services – Email Address Verification Request in region RegionName”, where RegionName is the name of the AWS Region that you’re configuring Amazon Pinpoint in.
-
Open the email, and then click the link in the body of the email.
-
Return to the Amazon Pinpoint console in your browser. On the Set up email page, choose Save.
Your account is now ready to send email from the email address that you verified. You can add additional email addresses later.
You can also verify entire domains. When you verify a domain, you can send email from any address on that domain. For more information, see Verifying a Domain.
Step 2: Import Customer Data and Create a Segment
A segment is a group of your customers that share certain attributes. For example, a segment might contain all of your customers who use version 2.0 of your app on an Android device, or all customers who live in the city of Los Angeles.
When you create a campaign, you have to choose a segment to send the campaign to. You can send multiple campaigns to a single segment, and you can send a single campaign to multiple segments.
There are two types of segments that you can create in Amazon Pinpoint:
-
Dynamic segments – Segments that are based on attributes that you define. Dynamic segments can change over time. For example, if you add new endpoints to Amazon Pinpoint, or if you modify or delete existing endpoints, the number of endpoints in that segment may increase or decrease.
-
Imported segments – Segments that are created outside of Amazon Pinpoint and saved in CSV or JSON format. Imported segments are static—that is, they never change. When you create a new segment, you can use an imported segment as a base segment, and then refine it by adding filters.
In this tutorial, you create an imported segment by uploading a file from your computer. Next, you create a dynamic segment that is based upon the imported segment.
Step 2.1: Download and Modify the Sample File
In this section, you download a file that contains fictitious customer data. You also modify the data to include your own contact information. Later in this tutorial, you use this data to create a segment.
- In a web browser, download the sample file from https://raw.githubusercontent.com/awsdocs/amazon-pinpoint-user-guide/master/examples/Pinpoint_Sample_Import.csv. Save the file to your computer.
Tip You can quickly save this file to your computer by right-clicking the link, and then choosing Save Link As.
-
Open the file in a text editor or spreadsheet application. On the last row of the file, replace the items in angle brackets (<…>) with your own contact information.
In the Address column, provide the same email address that you verified in Step 1.
In the User.UserAttributes.Company column, specify a company name that’s different from the fictitious company names in the file. You’ll use this unique company name when you define the criteria for your targeted segment in the next section.
Note You don’t have to provide your information for each column in the file. However, at a minimum, you have to provide information for the ChannelType, Address, and User.UserAttributes.Company columns.
The email that you create later in this tutorial uses several of these fields to create a personalized message.
-
When you finish, save the file.
Note If you used a spreadsheet application to modify the file, make sure that you save the modified file in Comma-Separated Values (.csv) format. Amazon Pinpoint can only import .csv and .json files.
Step 2.2: Import a File that Contains Customer Data
Now that you have a file that contains customer data, you can import it into Amazon Pinpoint. To import customer data, you have to create a new segment.
To create an imported segment
-
In the Amazon Pinpoint console, in the navigation pane, choose Segments.
-
Choose Create a segment.
-
On the Create a segment page, choose Import a segment.
-
In the Specifications section, under Import method, choose Upload files from your computer.
-
Select Choose files. Navigate to the Pinpoint_Sample_Import.csv file that you downloaded and modified in the previous section.
-
Choose Create segment. Amazon Pinpoint copies the file from your computer and creates a segment. Wait for about 1 minute while the import completes.
 It also contains your contact information.
In this section, you create a targeted segment. You add segment criteria that filter the segment so that you’re the only member of the segment.
To create the segment
-
On the Segments page, choose Create a segment.
-
On the Create a segment page, choose Build a segment.
-
For Name, enter a name for the segment.
4.Under Segment group 1, do the following:
- Next to Include endpoints that are in any of the following segments, choose the Pinpoint_Sample_Import segment that you created in the previous step.
-
Under Add filters to refine your segment, from the menu, choose Filter by channel.
-
Next to Endpoints that match, choose all.
-
For Channel, choose EMAIL.
-
Under Add filters to refine your segment, from the menu, choose Filter by user.
-
In the User filter, use the menu to choose Company. Next, use the Choose values menu to choose the unique company name that you specified for your own contact record in step 2.1.
-
Choose Add an attribute or metric.
-
In the new filter, use the menu to choose First Name. Next, use the Choose values menu to choose your first name.
- Choose Create segment.
Step 3: Create and Schedule a Campaign
A campaign is a messaging initiative that engages a specific audience segment. A campaign sends tailored messages on the days and times that you specify. You can use the console to create a campaign that sends messages through the email, push notification, or SMS channels.
In this section, you create an email campaign. You create a new campaign, choose your target segment, and create a responsive email message for the campaign. When you finish setting up the message, you choose the day and time when you want the message to be sent.
Step 3.1: Create the Campaign and Choose a Segment
When you create a segment, you first give the segment a name. Next, you choose the segment that the campaign applies to. In this tutorial, you choose the segment that you created in Step 2.3.
To create the campaign and choose segment
-
In a web browser, download the sample file from https://raw.githubusercontent.com/awsdocs/amazon-pinpoint-user-guide/master/examples/Pinpoint_Sample_Email.html. Save the file to your computer.
Tip You can quickly save this file to your computer by right-clicking the link, and then choosing Save Link As.
-
Open the file that you just downloaded in a text editor, such as Notepad (Windows) or TextEdit (macOS). Press Ctrl+A (Windows) or Cmd+A (macOS) to select all of the text. Then, press Ctrl+C (Windows) or Cmd+C (macOS) to copy it.
-
In the Amazon Pinpoint console, in the navigation pane, choose Campaigns.
-
Choose Create a campaign.
-
Under Campaign details, for Campaign name, enter a name for the campaign.
-
For Campaign type, choose Standard campaign.
-
For Choose a channel for this campaign, choose Email.
-
Choose Next.
-
On the Choose a segment page, choose Use an existing segment. Then, for Segment, choose the targeted segment that you created in Step 2.3. Choose Next.
Step 3.2: Create the Campaign Message
After you specify a campaign name and choose a segment, you can create your message. This tutorial includes a link to an HTML file that you can use to create your message.
This sample file uses responsive HTML to create a message that renders properly on both computers and mobile devices. It uses inline CSS to provide compatibility with a wide variety of email clients. It also includes tags that are used to personalize the message with the recipient’s name and other personal information.
To create the message
-
On the Create your message page, under Message content, choose Create a new message.
-
For Subject, enter a subject line for the email.
-
Under Message, erase the sample HTML code that’s shown in the editor. Paste the HTML code that you copied in the first step in this section.
-
(Optional) Modify the content of the message to include a message that you want to send.
You can personalize the message for each recipient by including the name of an attribute inside two sets of curly braces. For example, the sample message includes the following text: . This code represents the User.UserAttributes.FirstName attribute, which contains the recipient’s first name. When you send the campaign, Amazon Pinpoint removes this attribute name and replaces it with the appropriate value for each recipient.
You can experiment with other attribute names. Refer to the column headers in the spreadsheet that you imported in Step 2.2 for complete list of attribute names that you can specify in your message.
Tip You can use Design view to edit the content of the message without having to edit the HTML code. To use this view, choose Design from the view selector above the message editor, as shown in the following image.
5.Choose Next.
Step 3.3: Schedule the Campaign
The last step in creating the campaign is to choose when to send it. In Amazon Pinpoint, you can set up your campaigns so that they’re sent immediately after you launch them. You can also schedule them to be sent in the future—anywhere from 15 minutes from the current time, to six months into the future. Finally, you can schedule your messages to be sent on a recurring basis (that is, hourly, daily, weekly, or monthly). Recurring campaigns are a great way to send account or status updates where the appearance of the campaign message stays the same over time, but is populated with information that changes dynamically.
In this section, you schedule your campaign to be sent immediately after you launch it.
To schedule the campaign
-
On the Choose when to send the campaign page, choose At a specific time. Then, under Choose when the campaign should be sent, choose Immediately. Finally, choose Next.
-
On the Review and launch page, review all of the details of the campaign. When you’re ready to send it, choose Launch campaign.
Congratulations—you’ve created your first campaign with Amazon Pinpoint! Because you’re the only member of the segment that you created in Step 2.3, you should receive the message in your inbox within a few seconds.
Step 4: View Campaign Analytics
At this point, you’ve created a segment that you’re a member of. You’ve also created an email campaign and sent it to yourself. In this section, you look at the delivery and response metrics for the campaign.
Step 4.1: Interact with Your Campaign
Before you can view the delivery and response metrics for your campaign, you have to interact with the message that you sent yourself in Step 3.
To interact with the email
-
In your email client, open the message that you sent yourself in Step 3.
-
If your email client automatically hides images by default, choose the Download pictures (or equivalent) button to load the images in the message.
-
Choose one or more of the links that are contained in the message.
-
Wait for a few minutes, and then proceed to the next section.
Step 4.2: View Metrics for the Campaign
After you interact with the email that you sent from the campaign, you can view the metrics for the campaign.
To view the campaign metrics
-
Open the Amazon Pinpoint console at https://console.aws.amazon.com/pinpoint/.
-
On the All projects page, choose the project that you used to send the campaign.
-
In the navigation pane, under Analytics, choose Campaigns.
-
In the Campaigns section, choose the campaign that you created in Step 3.
-
(Optional) Use the date control to choose a date range for the reports on this page.
On the metrics page for your campaign, you see the following information:
-
Delivery count metrics – This section provides information about the delivery of the messages that were sent from your campaign. It includes the following information:
-
Messages sent – The number of messages that were sent.
-
Messages delivered – The number of messages that were delivered to their recipients.
-
Links clicked – The number of times that links in the messages were clicked by recipients. If a single recipient clicks a link more than once, each click is represented in this section.
-
Endpoint deliveries – The average number of endpoints that the campaign was sent to, for each day in the chosen date range. The chart shows the number of endpoints that the campaign was delivered to, for each day in the chosen date range.
-
-
Delivery rate metrics – This section shows the overall delivery and response rates for the messages that were sent from your campaign. It includes the following information:
-
Delivery rate – The percentage of messages that were delivered to recipients, of the total number of endpoints that you targeted in the segment that you sent this campaign to.
-
Email open rate – The percentage of messages that were opened by recipients, of the total number of messages that were delivered.
-
Bounce rate – The percentage of messages that weren’t delivered to recipients because they bounced. This value includes only hard bounces—that is, messages that bounced because of a permanent issue. For example, hard bounces could occur when the recipient’s email address doesn’t exist, or when the recipient permanently rejects email from your domain.
-
-
Campaign runs – This section shows information that’s specific to each time the campaign ran. Because you can use Amazon Pinpoint to create recurring campaigns, this section can show information for several campaign runs. However, if you completed the procedures in this tutorial, this section contains information for only one campaign run because you ran the campaign only once. This section contains the following metrics, in addition to the metrics that are defined in the preceding sections:
-
Endpoints targeted – The number of endpoints that were targeted by the segment that was associated with the campaign run. This number includes endpoints that were part of the segment, but didn’t receive the message.
-
Total email opened – The total number of times that messages sent from the campaign run were opened. For example, if a message was opened two times by one recipient, both of those opens are counted.
-
-
Next Step
We hope that you use this tutorial as a starting point as you discover the additional capabilities of Amazon Pinpoint. For example:
-
You can improve the delivery of your email campaigns by making sure that your campaigns align with industry best practices. For more information, see Tips and Best Practices.
-
You can verify an entire domain, which allows you to send email from any address on that domain. For more information about verifying domains, see Verifying a Domain.
-
You can obtain dedicated IP addresses for sending your email. Dedicated IP addresses are a great option for sending email in certain use cases. For more information, see Using Dedicated IP Addresses with Amazon Pinpoint.
-
You can enable the Amazon Pinpoint Deliverability dashboard. The Deliverability dashboard helps you identify issues that could impact the delivery of your emails. For more information, see The Amazon Pinpoint Deliverability Dashboard.
-
You can send messages through other channels, such as SMS or push. Before you can use these channels, you have to enable and configure them on the Settings page. For more information about using the Settings page to enable and configure channels, see Amazon Pinpoint Settings.
-
You can send data about your campaigns outside of Amazon Pinpoint. For example, you can send delivery and response data for your campaigns to Amazon S3 for long-term storage. You can also send data to Amazon Redshift to perform custom analyses. For more information about sending your data outside of Amazon Pinpoint, see Event Stream Settings.
-
You can integrate Amazon Pinpoint with your apps, or interact with Amazon Pinpoint programmatically, by using an AWS SDK. For more information, see the Amazon Pinpoint Developer Guide.


grunt
what it is ?
a javascript task runner (like ant)
used to build app
getting started
http://gruntjs.com/getting-started
project related files
A typical setup will involve adding two files to your project: package.json
and the Gruntfile
.
package.json
: This file is used by npm
to store metadata for projects published as npm
modules. You will list grunt and the Grunt plugins your project needs as devDependencies
in this file.
Gruntfile
: This file is named Gruntfile.js
or Gruntfile.coffee
and is used to configure or define tasks and load Grunt plugins.
IntelliJ integration
http://javamind-fr.blogspot.fr/2013/06/lancer-les-commandes-grunt-dans.html
grunt tasks list
grunt-contrib-connect
https://github.com/gruntjs/grunt-contrib-connect
This task launch a local webserver
manage template in html
http://gruntjs.com/api/grunt.file
Exemple :
grunt.file.copy('src/' + filename + '.html', this.data.dir + '/index.html', {
process: function (contents, path) {
return grunt.template.process(contents, {
data: {
baseRef: base,
scripts: jsFiles,
styles: cssFiles,
version: grunt.config('pkg.version'),
date: grunt.template.today("yyyy-mm-dd HH:MM"),
build: grunt.config('pkg.buildnumber')
}
});
}
});
<%= baseRef %> inside html template


{% extends "layout.html" %} {% block head %}
Please fill in your credentials to login.
Don't have an account? Sign up now.


---
layout: post
title: Why Having A Vision Is More Important Than Anything Else
tags:
- motivation
- Opinion
- projects
- vision
status: publish
type: post
published: true
meta:
_edit_last: '1'
_clicky_goal: a:2:{s:2:"id";s:0:"";s:5:"value";s:0:"";}
---
Do you know why we advance slower than we have some decades ago? Do you know that we went from the planning stage to the moon in 11 years? That is if you consider the time from the creation of NASA to the time we actually landed on the moon. But I think the most important part was the speech that President Kennedy gave*.
He said
First, I believe that this nation should commit itself to achieving the goal, before this decade is out, of landing a man on the Moon and returning him safely to the Earth
Which is, as someone from that time would have put it: "Thy be insane?". Or something like that. Now we know better, of course, because the US had this vision. So how will having a vision help you?
* Actually, the most important thing was probably the Germans. Because both the Soviet Union and the United States took, after World War II, rocket engineers from Germany to kick-start their endeavors. Yes, the famous rocket we all saw flying around were based on Nazi technology. So yeah…
So, A Vision, Any Vision?
Of course, not any vision will do. For example, saying "I will be one of the people in my circle that some people will know" isn't a good vision. So isn't "I will be the biggest site on the internet in 3 months". The first one isn't really something measurable, and, honestly, lame. And the second one isn't really possible to achieve.
What makes a good vision? A good vision is measurable. For example, "I will have 2000 subscribers by the end of the year" is simple to understand, measurable, and we always know where we stand. But it isn't a vision yet, it is just a goal. A vision should be something that can never really be reached, but motivates us to continue working.
A vision is something that we can strive for, something that is measurable, and something that is barely reachable. So, a good vision could be:
We will become the number one payment processor in the world with customers that just love us!
Ok, the love part is a bit hard to measure, but it is a good guideline. And I'm sure we could find some grad students who would love to study, well, love.
Should we give this customer a refund? Without a vision, we don't know, and to some we may give, to others we won't, which will confuse the customers even more. But with that vision? The action is clear!
A Good Vision Is A Good Guide
A vision isn't just for suits, or for people who want to sell something to suits (read: a company). No matter what your project is, I will bet that having a vision for it will help you immensely.
For one, we won't have to ask if we should show an error message, or if it won't annoy users more if we actually tell them that they are stupid. If the vision is to build the most robust, secure system, then yes, we should show a general error message.  If we write a command line utility for Linux, we don't even have to care about that. :)
A good vision answers probably 90% or more of all the small questions we have while developing a new project.
Sit Around, It's Story Time!
For example just recently I started on a new project. The first thing I did was asking for a vision. And they just repeated: "Oh yeah, build this basic thing here, we can try to analyze the rest later, it will be fine."
So I started implementing it. And lo and behold, it wasn't what they wanted. It showed error messages that were clear to us, but not to the expected user. It required things which seemed obvious to me, but which weren't actually needed. At all.
Even though it technically did everything they asked, it just didn't match with their vision.
And yes, by now I do have a vision for the project. Most people actually have a vision in mind, but they somehow don't want to spell it out. It's crazy!
Vision == Motivation
A vision keeps us motivated. That's all. Lets go to the next paragraph.
 Ok. Well, it's simple. We can code, and code, and code, but we will never "get there", we will never "get closer to the finished product". We will always be stuck in a rut.
Why? We reach the next goal, so our boss just figures out a new one for us. It sucks! We don't see the end of the tunnel. But a vision changes that!
With a vision, we suddenly have something to strive for. The goals suddenly aren't arbitrary points that the boss sets for us, but are actually real points that bring us closer to the ultimate goal.
Which is really what we want. Because then, at the end of the day, we can say: "Yeah, I got closer to the vision, and people are even more happy!"
Steve Jobs, A Visionary
One of the things that I think is just amazing about Steve Jobs is that he always had a vision. Maybe his private vision was to be a jerk and still be considered a successful, beloved business man, and if it was, he would have succeeded.
But even more amazing are his visions for the company. For example, before the iPhone, no one thought this will be possible. And Steve Jobs just said: "It is, do it!". Or as Steve (being a lot more eloquent than I am) would have put it:
Do we have what it takes to establish a third category of products? The bar is pretty high. It has to be far better at doing some key things. We think we have the goods. Our most advanced technology in a magical and revolutionary device at an unbelievable price.
Now that's a vision!
If you liked this post, you should follow me on Twitter and signup for the RSS feed!


8 Sampling
In this chapter we kick off the third segment of this book, statistical inference, by learning about sampling. The concepts behind sampling form the basis of confidence intervals and hypothesis testing, which we’ll cover in Chapters 9 and 10 respectively. We will see that the tools that you learned in the data science segment of this book (data visualization, “tidy” data format, and data wrangling) will also play an important role here in the development of your understanding. As mentioned before, the concepts throughout this text all build into a culmination allowing you to “think with data.”
Needed packages
Let’s load all the packages needed for this chapter (this assumes you’ve already installed them). If needed, read Section 2.3 for information on how to install and load R packages.
library(dplyr)
library(ggplot2)
library(moderndive)
8.1 Terminology
Before we can start studying sampling, we need to define some terminology.
- Population: The population is the (usually) large pool of observational units that we are interested in.
- Population parameter: A population parameter is a numerical quantify of interest about a population, such as a proportion or a mean.
- Census: An enumeration of every member of a population. Ex: the Decennial United States census.
- Sample: A sample is a smaller collection of observational units that is selected from the population. We would like to infer about the population based on this sample.
- Sampling: Sampling refers to the process of selecting observations from a population. There are both random and non-random ways this can be done.
- Representative sampling: A sample is said be a representative sample if the characteristics of observational units selected are a good approximation of the characteristics from the original population.
- Generalizability: Generalizability refers to the largest group in which it makes sense to make inferences about from the sample collected. This is directly related to how the sample was selected.
- Bias: Bias corresponds to a favoring of one group in a population over another group. Or put differently, when certain members of a population have a higher chance of being included in a sample than others.
- Statistic: A statistic is a calculation based on one or more variables measured in the sample.
- Point estimates/sample statistics: These are statistics, computed based on a sample, that estimate an unknown population parameter.
8.2 “In real life” sampling
Consider the following “sampling bowl” consisting of 2400 balls, which are either red, white, or green. We are interested in knowing the proportion of balls in the sampling bowl that are red, but do not wish to manually count the number of balls out of 2400 that are red. In other words, we’re not interested in conducting a census. So instead we attempt to estimate the proportion red by using the sampling “shovel” to extract a sample of size \(n = 50\) balls, and count the proportion of these that are red. However, before we extracted a sample using this shovel, we made sure to give the balls a good stir, ensuring we have random sampling.
 Groups of students “in real life” took random samples of size \(n = 50\). Thank you Niko, Sophie, Caitlin, Yaw, and Drew for doing double duty! In other words, we have 10 samples of size \(n = 50\):
bowl_samples
| group | red | white | green | n |
|---|---|---|---|---|
| Kathleen and Max | 18 | 32 | 0 | 50 |
| Sean, Jack, and CJ | 18 | 32 | 0 | 50 |
| X and Judy | 22 | 28 | 0 | 50 |
| James and Jacob | 21 | 29 | 0 | 50 |
| Hannah and Siya | 16 | 34 | 0 | 50 |
| Niko, Sophie, and Caitlin | 14 | 36 | 0 | 50 |
| Niko, Sophie, and Caitlin | 19 | 31 | 0 | 50 |
| Aleja and Ray | 20 | 30 | 0 | 50 |
| Yaw and Drew | 16 | 34 | 0 | 50 |
| Yaw and Drew | 21 | 29 | 0 | 50 |
For each sample of size \(n\) = 50, what is the sample proportion that are red? In other words, what are the point estimates \(\widehat{p}\) based on a sample of size \(n = 50\) of \(p\), the true proportion of balls in the tub that is red? We can compute this using the mutate()
function from the dplyr
package we studied extensively in Chapter 5:
bowl_samples <- bowl_samples %>%
mutate(prop_red = red / n) %>%
select(group, prop_red)
bowl_samples
| group | prop_red |
|---|---|
| Kathleen and Max | 0.36 |
| Sean, Jack, and CJ | 0.36 |
| X and Judy | 0.44 |
| James and Jacob | 0.42 |
| Hannah and Siya | 0.32 |
| Niko, Sophie, and Caitlin | 0.28 |
| Niko, Sophie, and Caitlin | 0.38 |
| Aleja and Ray | 0.40 |
| Yaw and Drew | 0.32 |
| Yaw and Drew | 0.42 |
We see that one group got a sample proportion \(\widehat{p}\) as low as 28% while another got a sample proportion \(\widehat{p}\) as high as 0.44. Why are these different? Why is there this variation? Because of sampling variability! Sampling is inherently random, so for a sample of \(n = 50\) balls, we’ll never get exactly the same number of red balls.
Let’s visualize this using our data visualization skills that you honed in Chapter 3! Let’s investigate the distribution of these 10 sample proportion red \(\widehat{p}\) each based on a random sample of size \(n = 50\) using a histogram, an appropriate visualization since prop_red
is numerical:
Let’s ask ourselves some questions:
- Where is the histogram centered?
- What is the spread of this histogram?
Recall from Section 5.4 the mean and the standard deviation are two summary statistics that would answer this question:
bowl_samples %>%
summarize(mean = mean(prop_red), sd = sd(prop_red))
| mean | sd |
|---|---|
| 0.37 | 0.052 |
What you have just unpacked are some very deep and very subtle concepts in statistical inference:
- The histogram in Figure 8.2 is called the sampling distribution of \(\widehat{p}\) based on samples of size \(n=50\). It describes how values of the sample proportion red will vary from sample-to-sample due to the aforementioned sampling variability.
- If the sampling is done in an unbiased and random fashion, in other words we made sure to stir the bowl before we sampled, then the sampling distribution will be guaranteed to be centered at the true unknown population proportion red, or in other words the true number of balls out of 2400 that are red. In this case, these 10 values of \(\widehat{p}\) are centered at 0.37.
- The spread of this histogram, as quantified by the standard deviation of 0.052, is called the standard error. It quantifies the variability of our estimates for \(\widehat{p}\).
8.3 Virtual sampling
In the moderndive
package, we’ve included a data frame called bowl
that actually is a virtual version of the above sampling bowl in Figure 8.1 with all 2400 balls! While we present a snap shot of the first 10 rows of bowl
below, you should View()
it in RStudio to convince yourselves that bowl
is indeed a virtual version of the image above.
View(bowl)
| ball_ID | color |
|---|---|
| 1 | white |
| 2 | white |
| 3 | white |
| 4 | red |
| 5 | white |
| 6 | white |
| 7 | red |
| 8 | white |
| 9 | red |
| 10 | white |
Note that the balls are not actually marked with numbers; the variable ball_ID
is merely used as an identification variable for each row of bowl
. Recall our previous discussion on identification variables in Subsection 4.2.2 in the “Data Tidying” Chapter 4.
Let’s replicate what the groups of students did above but virtually. We are going to now simulate using a computer what our students did by hand in Table 8.1 using the rep_sample_n()
function. The rep_sample_n()
function takes the following arguments:
tbl
: a data frame representing the population you wish to infer about. We’ll set this tobowl
, since this is the (virtual) population of interest.size
: the sample size \(n\) in question. We’ll set this to 50, mimicking the number of slots in the sampling “shovel” in the image in Figure 8.1.replace
: A logicalTRUE/FALSE
value indicating whether or not to put each ball back into the bowl after we’ve sampled it. In our case, we’ll set this toFALSE
since we are sampling 50 balls at once, not 50 single balls individually.reps
: the number of samples of size \(n =\)size
to extract. We’ll set this to 10, mimicking the data we have in Table 8.1.
Let’s apply this function to mimic our situation above and View()
the data. The output is rather large, so we won’t display it below.
all_samples <- rep_sample_n(bowl, size = 50, reps = 10)
View(all_samples)
Scrolling through the spreadsheet viewer, you’ll notice
- The values of
replicate
(1
through10
) come in bunches of 50, representing the 10 groups of respective samples of size \(n\) = 50. - The
ball_ID
identification variable is all over the place, suggesting we really are (virtually) randomly sampling balls. color
represents the color of each of the virtually sampled balls.
What is the proportion red for each group as denoted by the replicate
variable? Again, let’s leverage your data ninja skills from Chapter 5.
bowl_samples_virtual <- all_samples %>%
mutate(is_red = color == "red") %>%
group_by(replicate) %>%
summarize(prop_red = mean(is_red))
bowl_samples_virtual
| replicate | prop_red |
|---|---|
| 1 | 0.34 |
| 2 | 0.36 |
| 3 | 0.40 |
| 4 | 0.38 |
| 5 | 0.36 |
| 6 | 0.30 |
| 7 | 0.36 |
| 8 | 0.38 |
| 9 | 0.26 |
| 10 | 0.46 |
Compare Tables 8.2 and Table 8.4; they are similar in output format and also the resulting prop_red
are similar in values. Let’s plot this using the same histogram code as in Figure 8.2, but switching out bowl_samples
for bowl_samples_virtual
:
We’ve replicated the sampling distribution, but using simulated random samples, instead of the “in real life” random samples that our students collected in Table 8.1. Let’s compute the center of this histogram and its standard deviation, which has a specific name: the standard error.
bowl_samples_virtual %>%
summarize(mean = mean(prop_red), sd = sd(prop_red))
| mean | sd |
|---|---|
| 0.37 | 0.052 |
8.4 Repeated virtual sampling
Say we were feeling particularly unkind to Yaw and Drew and made them draw not 10 samples of size \(n = 50\), but TEN THOUSAND such samples. They would probably be at work for days! This is where computer simulations really come in handy: doing repetitive and boring tasks repeatedly. To achieve this virtually, we just use the same code as above but set reps = 10000
:
# Draw one million samples of size n = 50
all_samples <- rep_sample_n(bowl, size = 50, reps = 10000)
# For each sample, as marked by the variable `replicate`, compute the proportion red
bowl_samples_virtual <- all_samples %>%
mutate(is_red = (color == "red")) %>%
group_by(replicate) %>%
summarize(prop_red = mean(is_red))
# Plot the histogram
ggplot(bowl_samples_virtual, aes(x = prop_red)) +
geom_histogram(binwidth = 0.02, color = "white") +
labs(x = "Sample proportion red in sample of size n=50", y="Number of samples",
title = "Sample proportion red in ten samples of size n=50")
This distribution looks an awful lot like the bell-shaped normal distribution. That’s because it is the normal distribution! Let’s compute the center of this sampling distribution and the standard error again:
bowl_samples_virtual %>%
summarize(mean = mean(prop_red), sd = sd(prop_red))
| mean | sd |
|---|---|
| 0.37 | 0.052 |
Learning check
(LC8.1) Repeat the above repeated virtual sampling exercise for 10,000 samples of size \(n\) = 100. What do you notice is different about the histogram, i.e. the sampling distribution?
(LC8.2) Repeat the above repeated virtual sampling exercise for 10,000 samples of size \(n\) = 25. What do you notice is different about the histogram, i.e. the sampling distribution, when compared to the instances when the samples were of size \(n\) = 50 and \(n\) = 100?
(LC8.3) Repeat the above repeated virtual sampling exercise for 10,000 samples of size \(n\) = 50, but where the population is the pennies
dataset in the moderndive
package representing 800 pennies and where the population parameter of interest is the mean year of minting of the 800 pennies. See the help file ?pennies
for more information about this dataset.
8.5 Central Limit Theorem
What you have just shown in the previous section is a very famous theorem, or mathematically proven truth, called the Central Limit Theorem. It loosely states that when samples means and sample proportions are based on larger and larger samples, the sampling distribution corresponding to these point estimates get
- More and more normal
- More and more narrow
Shuyi Chiou, Casey Dunn, and Pathikrit Bhattacharyya created the following 3m38s video explaining this crucial theorem to statistics using as examples, what else?
- The average weight of wild bunny rabbits!
- The average wing span of dragons!
8.6 Conclusion
8.6.1 What’s to come?
This chapter serves as an introduction to the theoretical underpinning of the statistical inference techniques that will be discussed in greater detail in Chapter 9 for confidence intervals and Chapter 10 for hypothesis testing.
8.6.2 Script of R code
An R script file of all R code used in this chapter is available here.


Expressions are JavaScript-like code snippets that are usually placed in bindings such as {{
expression }}
. Expressions are processed by the $parse
service. Expressions are often post processed using filters to create a more user-friendly format.
For example, these are all valid expressions in angular:
1+2
user.name
It might be tempting to think of Angular view expressions as JavaScript expressions, but that is
not entirely correct, since Angular does not use a JavaScript eval()
to evaluate expressions.
You can think of Angular expressions as JavaScript expressions with following differences:
Attribute Evaluation: evaluation of all properties are against the scope doing the
evaluation, unlike in JavaScript where the expressions are evaluated against the global
window
.
Forgiving: expression evaluation is forgiving to undefined
and null
, unlike in JavaScript,
where trying to evaluate undefined properties can generate ReferenceError
or TypeError
.
No Control Flow Statements: you cannot do any of the following in angular expression: conditionals, loops, or throw.
If, on the other hand, you do want to run arbitrary JavaScript code, you should make it a
controller method and call the method. If you want to eval()
an angular expression from
JavaScript, use the
method.$eval()
You can try evaluating different expressions here:
Evaluation of all properties takes place against a scope. Unlike JavaScript, where names default
to global window properties, Angular expressions have to use
to refer to the global $window
window
object. For example, if you want to call alert()
, which is
defined on window
, in an expression you must use $window.alert()
. This is done intentionally to
prevent accidental access to the global state (a common source of subtle bugs).
Expression evaluation is forgiving to undefined and null. In JavaScript, evaluating a.b.c
throws
an exception if a
is not an object. While this makes sense for a general purpose language, the
expression evaluations are primarily used for data binding, which often look like this:
{{a.b.c}}
It makes more sense to show nothing than to throw an exception if a
is undefined (perhaps we are
waiting for the server response, and it will become defined soon). If expression evaluation wasn't
forgiving we'd have to write bindings that clutter the code, for example: {{((a||{}).b||{}).c}}
Similarly, invoking a function a.b.c()
on undefined or null simply returns undefined.
You cannot write a control flow statement in an expression. The reason behind this is core to the Angular philosophy that application logic should be in controllers, not in the view. If you need a conditional, loop, or to throw from a view expression, delegate to a JavaScript method instead.


A common criticism of deep learning models is that they tend to act as black boxes. A model produces outputs, but doesn’t given enough context to interpret them properly. How reliable are the model’s predictions? Are some predictions more reliable than others? If a model predicts a value of 5.372 for some quantity, should you assume the true value is between 5.371 and 5.373? Or that it’s between 2 and 8? In some fields this situation might be good enough, but not in science. For every value predicted by a model, we also want an estimate of the uncertainty in that value so we can know what conclusions to draw based on it.
DeepChem makes it very easy to estimate the uncertainty of predicted outputs (at least for the models that support it—not all of them do). Let’s start by seeing an example of how to generate uncertainty estimates. We load a dataset, create a model, train it on the training set, and predict the output on the test set.
import deepchem as dc
import numpy as np
import matplotlib.pyplot as plot
tasks, datasets, transformers = dc.molnet.load_sampl()
train_dataset, valid_dataset, test_dataset = datasets
model = dc.models.MultiTaskRegressor(len(tasks), 1024, uncertainty=True)
model.fit(train_dataset, nb_epoch=200)
y_pred, y_std = model.predict_uncertainty(test_dataset)
Loading dataset from disk.
Loading dataset from disk.
Loading dataset from disk.
All of this looks exactly like any other example, with just two
differences. First, we add the option uncertainty=True
when creating
the model. This instructs it to add features to the model that are
needed for estimating uncertainty. Second, we call
predict_uncertainty()
instead of predict()
to produce the
output. y_pred
is the predicted outputs. y_std
is another array
of the same shape, where each element is an estimate of the uncertainty
(standard deviation) of the corresponding element in y_pred
. And
that’s all there is to it! Simple, right?
Of course, it isn’t really that simple at all. DeepChem is doing a lot of work to come up with those uncertainties. So now let’s pull back the curtain and see what is really happening. (For the full mathematical details of calculating uncertainty, see https://arxiv.org/abs/1703.04977)
To begin with, what does “uncertainty” mean? Intuitively, it is a measure of how much we can trust the predictions. More formally, we expect that the true value of whatever we are trying to predict should usually be within a few standard deviations of the predicted value. But uncertainty comes from many sources, ranging from noisy training data to bad modelling choices, and different sources behave in different ways. It turns out there are two fundamental types of uncertainty we need to take into account.
Consider the following graph. It shows the best fit linear regression to a set of ten data points.
# Generate some fake data and plot a regression line.
x = np.linspace(0, 5, 10)
y = 0.15*x + np.random.random(10)
plot.scatter(x, y)
fit = np.polyfit(x, y, 1)
line_x = np.linspace(-1, 6, 2)
plot.plot(line_x, np.poly1d(fit)(line_x))
plot.show()
The line clearly does not do a great job of fitting the data. There are
many possible reasons for this. Perhaps the measuring device used to
capture the data was not very accurate. Perhaps y
depends on some
other factor in addition to x
, and if we knew the value of that
factor for each data point we could predict y
more accurately. Maybe
the relationship between x
and y
simply isn’t linear, and we
need a more complicated model to capture it. Regardless of the cause,
the model clearly does a poor job of predicting the training data, and
we need to keep that in mind. We cannot expect it to be any more
accurate on test data than on training data. This is known as aleatoric
uncertainty.
How can we estimate the size of this uncertainty? By training a model to do it, of course! At the same time it is learning to predict the outputs, it is also learning to predict how accurately each output matches the training data. For every output of the model, we add a second output that produces the corresponding uncertainty. Then we modify the loss function to make it learn both outputs at the same time.
Now consider these three curves. They are fit to the same data points as before, but this time we are using 10th degree polynomials.
plot.figure(figsize=(12, 3))
line_x = np.linspace(0, 5, 50)
for i in range(3):
plot.subplot(1, 3, i+1)
plot.scatter(x, y)
fit = np.polyfit(np.concatenate([x, [3]]), np.concatenate([y, [i]]), 10)
plot.plot(line_x, np.poly1d(fit)(line_x))
plot.show()
Each of them perfectly interpolates the data points, yet they clearly
are different models. (In fact, there are infinitely many 10th degree
polynomials that exactly interpolate any ten data points.) They make
identical predictions for the data we fit them to, but for any other
value of x
they produce different predictions. This is called
epistemic uncertainty. It means the data does not fully constrain the
model. Given the training data, there are many different models we could
have found, and those models make different predictions.
The ideal way to measure epistemic uncertainty is to train many different models, each time using a different random seed and possibly varying hyperparameters. Then use all of them for each input and see how much the predictions vary. This is very expensive to do, since it involves repeating the whole training process many times. Fortunately, we can approximate the same effect in a less expensive way: by using dropout.
Recall that when you train a model with dropout, you are effectively training a huge ensemble of different models all at once. Each training sample is evaluated with a different dropout mask, corresponding to a different random subset of the connections in the full model. Usually we only perform dropout during training and use a single averaged mask for prediction. But instead, let’s use dropout for prediction too. We can compute the output for lots of different dropout masks, then see how much the predictions vary. This turns out to give a reasonable estimate of the epistemic uncertainty in the outputs.
Now we can combine the two types of uncertainty to compute an overall estimate of the error in each output:
This is the value DeepChem reports. But how much can you trust it? Remember how I started this tutorial: deep learning models should not be used as black boxes. We want to know how reliable the outputs are. Adding uncertainty estimates does not completely eliminate the problem; it just adds a layer of indirection. Now we have estimates of how reliable the outputs are, but no guarantees that those estimates are themselves reliable.
Let’s go back to the example we started with. We trained a model on the SAMPL training set, then generated predictions and uncertainties for the test set. Since we know the correct outputs for all the test samples, we can evaluate how well we did. Here is a plot of the absolute error in the predicted output versus the predicted uncertainty.
abs_error = np.abs(y_pred.flatten()-test_dataset.y.flatten())
plot.scatter(y_std.flatten(), abs_error)
plot.xlabel('Standard Deviation')
plot.ylabel('Absolute Error')
plot.show()
The first thing we notice is that the axes have similar ranges. The model clearly has learned the overall magnitude of errors in the predictions. There also is clearly a correlation between the axes. Values with larger uncertainties tend on average to have larger errors.
Now let’s see how well the values satisfy the expected distribution. If the standard deviations are correct, and if the errors are normally distributed (which is certainly not guaranteed to be true!), we expect 95% of the values to be within two standard deviations, and 99% to be within three standard deviations. Here is a histogram of errors as measured in standard deviations.
plot.hist(abs_error/y_std.flatten(), 20)
plot.show()
Most of the values are in the expected range, but there are a handful of outliers at much larger values. Perhaps this indicates the errors are not normally distributed, but it may also mean a few of the uncertainties are too low. This is an important reminder: the uncertainties are just estimates, not rigorous measurements. Most of them are pretty good, but you should not put too much confidence in any single value.