The simplest possible setup.py script to build a py2app application looks like the following:
"""
py2app build script for MyApplication
Usage:
python setup.py py2app
"""
from setuptools import setup
setup(
app=["MyApplication.py"],
setup_requires=["py2app"],
)
The py2applet script can create setup.py files of this variety for you automatically:
$ py2applet --make-setup MyApplication.py
For ease of distribution, you may wish to have your setup.py script automatically ensure that setuptools is installed. This requires having a copy of ez_setup in your project, which can be obtained from here:
http://peak.telecommunity.com/dist/ez_setup.py
Or it may be referenced from svn:externals as such:
ez_setup svn://svn.eby-sarna.com/svnroot/ez_setup
If choosing the svn:externals approach you should consider that your project’s source code will depend on a third party, which has reliability and security implications. Also note that the ez_setup external uses the svn:// protocol (TCP port 3690) rather than http:// so it is somewhat less likely to work behind some firewalls or proxies.
Once this is done, you simply add the two line ez_setup preamble to the very beginning of your setup.py:
"""
py2app build script for MyApplication.
Will automatically ensure that all build prerequisites are available
via ez_setup.
Usage:
python setup.py py2app
"""
import ez_setup
ez_setup.use_setuptools()
from setuptools import setup
setup(
app=["MyApplication.py"],
setup_requires=["py2app"],
)
Cross-platform applications can share a setup.py script for both py2exe and py2app. Here is an example Self-bootstrapping setup.py that will build an application on Windows or Mac OS X:
"""
py2app/py2exe build script for MyApplication.
Will automatically ensure that all build prerequisites are available
via ez_setup
Usage (Mac OS X):
python setup.py py2app
Usage (Windows):
python setup.py py2exe
"""
import ez_setup
ez_setup.use_setuptools()
import sys
from setuptools import setup
mainscript = 'MyApplication.py'
if sys.platform == 'darwin':
extra_options = dict(
setup_requires=['py2app'],
app=[mainscript],
# Cross-platform applications generally expect sys.argv to
# be used for opening files.
options=dict(py2app=dict(argv_emulation=True)),
)
elif sys.platform == 'win32':
extra_options = dict(
setup_requires=['py2exe'],
app=[mainscript],
)
else:
extra_options = dict(
# Normally unix-like platforms will use "setup.py install"
# and install the main script as such
scripts=[mainscript],
)
setup(
name="MyApplication",
**extra_options
)


RequestProvider
public enum RequestProvider
Allows the client to choose between using a Combine publisher or a simple closure for fetching new pages of data.
-
A Combine publisher which will perform a network request with a given page. The publisher is expected to:
- Return a Swift
Result
. The data type is expected to match this class’s genericResponse
type. - Never fail. This approach is considered so requests may be retried if they fail. A failable publisher has the downside of finishing on error and makes retrying slightly more complex.
Declaration
Swift
case publisher((Int) -> AnyPublisher<Result<Response, Error>, Never>)
- Return a Swift
-
A simple closure which will perform a network request with a given page. This closure should perform its work and call back the provided completion block with the result of its network request.
Declaration
Swift
case closure((Int, @escaping (Result<Response, Error>) -> Void) -> Void)


Fantastic Fruits LLC. prides itself on having been a family-owned and operated company for over 50 years. Since FF was acquired by Apple on April 1, 2016, our mission has not changed. Our two divisions work collaboratively to serve our customers. Our Exotic Fruit Division sources the finest fruits from across the globe to create wholesome and natural products. Our Flavor Identifier Division is one of the most creative companies in flavor development and innovation. The synergy of our two divisions gives us the advantage of supplying the most creative and natural solutions to the consumable market. One of our greatest strengths is developing strategic partnerships and relationships. We are one team shaping success through exceptional service, innovative people and consistent values. Our goal is to make your next fruit product taste great!
Fantastic Fruits vision is to be on the forefront of development as it relates to customers’ needs, global trends and industry requirements. Our strategic partnering with our customers will lead us to be the most relied upon supplier of wholesome and natural products as we expand into new marketplaces.
We act honestly, ethically and honorably.
We are dedicated to ensuring every product we ship is something we would be proud to bring home to our own families.
We believe our employees are our family and therefore we strive to be respectful, caring and compassionate with one another.
Our employees are passionate about our business and strive for professionalism in order to deliver the best solutions possible to our customers.
We have been committed to this business, our customers and our employees for many years by being hard working and creative in our everyday tasks.
Communication and trust encourage employee pride and participation. Our employees work as one team shaping success through exceptional service, innovative people and consistent values.
We act responsibly as members of the communities in which we operate and we respect our environment by recycling, reusing and reducing our waste whenever we can.


14.12 The statcache Module
The statcache module, shown in Example 14-15, contains a function that returns information about files.
It's an extension of the os.stat function in
that it keeps a cache with recently collected information.
Example 14-15. Using the statcache Module
File: statcache-example-1.py
import statcache
import os, stat, time
now = time.time()
for i in range(1000):
st = os.stat("samples/sample.txt")
print "os.stat", "=>", time.time() - now
now = time.time()
for i in range(1000):
st = statcache.stat("samples/sample.txt")
print "statcache.stat", "=>", time.time() - now
print "mode", "=>", oct(stat.S_IMODE(st[stat.ST_MODE]))
print "size", "=>", st[stat.ST_SIZE]
print "last modified", "=>", time.ctime(st[stat.ST_MTIME])
os.stat => 0.371000051498
statcache.stat => 0.0199999809265
mode => 0666
size => 305
last modified => Sun Oct 10 18:39:37 1999
|


Sales Earnings
$0.00
10%
total sales
4512
20%
Today's Visits
158
30%| NO. | projects | owner | Priority | progress | Project Team |
|---|---|---|---|---|---|
| 01. |
Gabriella Cruz16 Feb 2016 |
high | 10% |
|
|
| 02. |
Edward Chun14 March 2016 |
low | 55% |
|
|
| 03. |
Mario Flores10 Feb 2018 |
medium | 92% |
|
|
| 04. |
Johana Cooper13 jan 2018 |
low | 17% |
|
top Sales
- Store16b
- online20
- services150
- shares29
user activities
Browser Statics
- google chorme 65%
- Mozila Firefox 33%
- Safari 12%
- Opera Mini 28%
- Microsoft Edge 97%
- Internet Explorer 89%
- Android 20%
recent invoice
| Invoice# | Customer Name | status | due | ammount |
|---|---|---|---|---|
| INV-001001 |
Mario Flores |
paid | 10 March 2017 | $ 1200.00 |
| INV-001001 |
Gabriella Cruz |
over due | 10 April 2017 | $ 150.00 |
| INV-001001 |
Johana Cooper |
pending | 25 September 2017 | $ 298.00 |
| INV-001001 |
Edward Chun |
pending | 13 May 2017 | $ 300.00 |
| INV-001001 |
Gabriella Cruz |
over due | 10 April 2017 | $ 150.00 |
| INV-001001 |
Mario Flores |
paid | 10 March 2017 | $ 1200.00 |
© 2020. Osen Concepts. All Rights Reserved.


Register TODAY to attend the next complimentary ACM Webcast, "Engineering Software as a Service," presented on Wednesday, May 8, 2013, at 2 PM ET (1 pm CT/12 noon MT/11 AM PT/6 PM GMT).
Join David Patterson, Director of the Parallel Computing Lab (ParLab) at UC-Berkeley (and a former ACM president) in a special virtual event moderated by his ParLab colleague Armando Fox. The talk will be followed by a live question and answer session. (If you'd like to attend but can't make it to the virtual event, you still need to register to receive a recording of the webinar when it becomes available.)
(Note: You can stream this and all ACM Learning Webinars on your mobile device, including smartphones and tablets.)
Abstract
Software as a Service (SaaS) and Agile software development started simultaneously but independently. SaaS deploys software at one site made available over the Internet. Agile relies on incrementally developed prototypes and continuous customer feedback. Since Agile embraces change, it is an excellent match to SaaS’s rapid evolution. Thus, Amazon, eBay, Facebook, Google...rely on Agile.
What You'll Learn About
The synergy between SaaS, Agile, and modern frameworks like Ruby on Rails and modern tools like Cucumber, RSpec, and Pivotal Track.
Eliciting SaaS requirements from customers via User Stories.
Following Behavior-Driven Design to convert SaaS User Stories into acceptance tests using Cucumber.
Following Test-Driven Design to transform SaaS acceptance tests into unit tests using RSpec.
Projecting SaaS app costs and schedule via Velocity using Pivotal Tracker.
Organizing SaaS programming teams by following Scrum principles.
This talk is based on Massive Open Online Courses from UC Berkeley, offered in partnership with EdX (CS169.1x and CS169.2x), and a related textbook.
Duration: 60 minutes
Welcome to CS169.1x: Software Engineering for Software as a Service!
You can check out the
syllabus page
to see the topics we’ll be covering. You will learn the principles of software engineering by developing software to be deployed as a service in the cloud. Rather than just advise on good practices, this course offers software tools to put each of those practices to work. There will be lecture videos and homework assignments or programming assignments nearly every week, and quizzes every two weeks.
The course information page has information about course logistics and policies. Our primary communication channel will be our interactive forum, where we’ll all contribute to an ongoing discussion of the material.
There are a couple videos for you to watch on the courseware page: an official welcome to the course by us and tutorial videos walking you through the edX platform. The first lecture segments will be available for you to watch on Monday. In these introductory segments, we give the history of software (including some infamous disasters) and how it led to the Agile software development method, which we teach and which many SaaS companies use.
We will post a mini-quiz, Quiz 0, that will serve as a course self-diagnostic so you can verify your programming preparedness for the course as well as your understanding of the goals of this course.
We look forward to participating in a grand learning experiment with you!
-- Armando, Dave, Wei, and Yongzheng
If you have any questions please send mail to<EMAIL_ADDRESS>You can also visit our homepage on weibo or renren to see the latest activities or leave a message for us.


Outcomes Introduction Now - Week 4 - Understand the fundamental principles of CT imaging. - Explain the fundamental concepts behind CT image formation and reconstruction. Basic Physics Now - Week 4 - Describe CT systems and instrumentation Quality Assurance Week 7 - 15 - Identify correct parameters required for CT imaging applications - Describe the major causes and corrections of image artifacts - Discuss recent advancement in CT technology - Assess recent advancement in clinical applications of CT - Understand and describe image quality parameters in CT Dose Considerations Week 7 - 15 - Understand and analyse contributing factors to patient dose from CT scanning - Describe how and why QA and QC is performed in CT
Objectives PRINCIPLES OF CT Now - Week 4 You can summarize each process: data acquisition image reconstruction image display BASIC PHYSICS Now - Week 4 You can explain each concept: sampling, quantization, aliasing bits, Bytes resolution spatial, resolution contrast, temporal resolution INSTRUMENTATION Now - Week 4 You can differentiate between using: an adequate and inadequate bowtie filter requirements for a detector array superior temporal resolution and isotropic voxels


I passed by some new-contruction luxury houses in my area. They had 4 bedrooms and 3-1/2 bathrooms.
We saw a new contruction condo with two bedrooms, and two full bathrooms. One of the bathrooms had his and her sinks. It wasn't a big condo.
What is wrong with people that they can't share bathrooms? Are we trying to maintain the highest per capita toilet rate? I can't find any numbers on the net, except that Vietnam is on the low end, and we're getting more.
I won't complain about public toilet paranoia; it really bothers me more that we can't share spaces with our own family. Or maybe it's just the trend towards metrosexuality that causes men and women to compete more for bathroom time. Or it's just another SUV-ism, the coveting of excess.
I have some friends who recently had a baby and bought a house. We went to see it, and they seemed almost apologetic about the house and its state. But it was far nicer than any house I grew up in (and I certainly never felt deprived). I think they hang out with the wrong people; it's easy for your expectations to increase in accordance with your peer group.
There's those that say our standard of living has been declining, but I don't really see it.  (Except maybe for health care, where we have a shitty overpriced system that is only becoming more shitty and overpriced with time.) And if economic collapse is around the corner, will people have any idea how to be poor? It's an acquirable skill, but it's one no one has been teaching in the US for 60 years.
Ian,
You really are talented so, please don't get caught up in never ending cynicism that just may not be true.
I read the link on 'economic collapse around the corner', and truly, if you are taking this guys views to be even somewhat objective with regard to the global economy then you need to think twice.
I am an expat. living and working in Germany (one bathroom, two flush options to save water), and I have a pretty good sense of the world outside the US. That said, I also believe that the US is still the best place on earth for real _personal_ economic opportunity.
I know you are going to say what about Europe, what about Asia, what about the debt, and what about the trade and current account deficit..
Well, even though you will find this hard to believe, especially if you are used to thinking that everything in the US is crap and the grass is green on the other side, but the first two have far more corruption, positions of favor, and analysis paralysis then even the US. Not to mention a complete lack of personal economic opportunity, you wouldn't even believe it.
The debt and the current account deficit is economics at work. There is an ecomomic correction happening in the US. It started back in the 80's, and one of my best economics professors actually taught us about it back in the early 90's. His hypothesis basically was that the dollar was overpriced then, as it is now, and would be weakened by increases in the debt and trade deficits vs. the GDP. All these things are still happening now. The impact of which would be dampened by increasing the US's position as a better investment for stronger currency investors and eventually lead to a situation where the economy both intact, more inline with reality, and a better value for new opportunity.
As we are still in the middle of this correction no one knows for sure where we are heading, but just maybe it is not the hard landing that some are talking about..
# Anthony
I'm not sure we'll head for economic collapse. How would I know? I do see real irrationality in the economy, and problems in things I see as fundamental -- like the fact we, as a nation, have turned to a service economy. We spend all our times doing things for each other, rather than making things.
But, economy aside, I see a situation where economic wealth (which is plentiful, recession or not) is not providing much happiness, security, or freedom. Instead of using wealth to put away some money for a rainy day, people are spending furiously to match any gains they see.  Putting aside any moral consideration about the world and limited resources, these things simply are effective at making people happy. And instead of using wealth to follow dreams, by squandering their wealth people are cornering themselves, creating a lifestyle that cannot withstand any transition. It's concerning, and it's bad for everyone; not just the individuals, but the families and communities and the entire world. Hell, economic collapse might just be better for everyone in the long term. Well, probably not...
So you have been to Europe and have worked there. I also have been to Europe and for you to say that Europeans do not have a fairly high standard of living really is not truthful. Also It depends where you live in Europe, In a big expensive city or a smaller, less expensive town. The average European worker receives over 50 days off a year (Monday through Friday) which is over 10 weeks. The average European receives free education and also free Healthcare. The average European receives Sick Day when they are ill. The average European works 38 hours a week. Europeans receive complete Workers Injury Compensation, Unemployment benefits, retraining, help with Daycare, Many countries also help families obtain flats and houses. In fact many European countries such as Spain has Home Ownership over 80 percent of the Population. The working population between the ages of 18 to 65 is around 64 percent, The U.S. is around 62 so all this misinformation really is crap. My family is a small busines owner and she is paying $1020.00 per month for healthcare coverage with a $3600.00 deductable. That does not cover dental work so if she wanted to have the medical coverage they have in Germany it would cost her probably $20,000 per year. What about going to college? I have already been to college and have Graduated 10 years ago but would like to train for something else because Our America Wages are so high. I'm looking into Sonography but the college wants $30,000 for a 16 month course. maybe the Government would pick some of the bill up through grants but most of it they will not. How does this help me? My Friend in Germany spends around $30 dollars a month on electricity for a 1000 square foot flat in Essen. The total land tax, street cleaning, heating, electricity and basic upkeep on the building is around $1000.00 per year. Her Phone service is about $30.00 per month. Her car Insurance for a new toyota corolla is $500.00 per year. Germany's Income taxes are between 15 to 42 percent depending on Income. For 4 liter of milk the price is around $2.30. The Price in Florida would be over $3.00. Pineapples $2.00 Florida $4.00 Monthly Florida Electricity bill: $100.00 Yearly Florida Car Insurance: $1200.00 Phone Bill: $50.00 monthly basic service. Land Tax on typical house: $1500.00 Water: 600.00 per year Garbage: 400.00 per year House Insurance: $2000.00 What the Hell are you saying about how good we have It? Bullshit! You can fool some of the people some of the time but not everyone all of the time. The U.S. has the most expensive Healthcare, University costs and Insurance costs in the world. We have a huge housing bubble, with prices far outstripping Income. We have a 700 billion plus current account deficit and rising. We have a 600 billion dollar government debt and rising. We have almost 3 million people in prison and another 5 million on parole by far the most in the world! In Holiday, Florida which is near Tampa the typical house is around $180000 and rising, these are very moderate houses nothing to brag about. In Tampa It would be over $200,000. The typical Wage for the area is around $25,000 with many people making $15,000 to $20,000. So the price to earnings ratio is between 8 to 10 times income. It should be between 2 and 3 so the house prices versus income is 3 times higher then they should be or a $200,000 house should be between $65,000 and $70,000. The new houses they are building are crap, they build then with pressed wood and cheap materials throughout, also the prices on them would be higher, maybe $250,000 for a moderate home. I see people with no Health Insurance, I see Homeless who are working, I see people working two jobs so they can pay their bills. I see people who do not take any vacations because they must work to live. I see people who would like to go to college but cannot afford it. Europe is the world's largest manufacturing economy, largest exporters, largest Investors, and the world's biggest market. China and Europe are the two economic powerhouses of the world. Europe has a current account surplus, much less personal debt then Americans, Government debt of 2.7 percent of GDP which is lower then America's at a time they are spending huge amount of money building eastern europe up to western standards. They are nuclear armed so no-one in their right mind would attack them! Anyway have a nice day!
# thomas riccardo
"...it's easy for your expectations to increase in accordance with your peer group" is a theme in the excellent book Status Anxiety, which I'm sure you'd enjoy.
# Greg


Lampard enjoys ‘solid win’ for Chelsea over Palace
Chelsea 2 - 0 Crystal Palace
Frank Lampard felt his young side passed another stern test as they beat Crystal Palace 2-0.
Second-half goals from Tammy Abraham and Christian Pulisic secured a sixth straight Premier League win for the Blues and lifted them, temporarily at least, up to second.
They endured a frustrating first half against an obdurate, well-drilled Palace side but found a way through after the break with Abraham’s 10th goal of the season and Pulisic’s fifth in three games.
“Every game in the Premier League is hard, particularly against a team as organised as Palace,” said Lampard.
“In the first half we started well, then allowed our tempo to drop, but when we came out in the second half with the intent that we did, we won the game relatively comfortably – a nice, solid win with a clean sheet.
“We’ve had teams come here and be difficult to break down, it’s a test of not only how you unlock the door, but can you switch on to make sure you don’t get hit by the sucker punch?
“I was really delighted with the game management in a game like today. I got as much joy out of Kurt Zouma and Fikayo Tomori’s performances in defence, and the midfielders shielding in front of them, as I did our attacking play.”
Six minutes after the interval Abraham broke the deadlock. Mateo Kovacic was the architect, brushing off a couple of challenges in a congested midfield before finding Willian with a clever reverse pass.
The Brazilian’s neat flick on the edge of the box teed up Abraham, who strode forward and confidently buried his shot past Vicente Guaita.
Palace briefly threatened an equaliser but James Tomkins headed wide from a corner.
Instead, Chelsea killed off the visitors with 11 minutes remaining when Pulisic fed Michy Batshuayi in the area, continued his run and got on the end of the striker’s deflected shot.
It meant defeat for Roy Hodgson in his 300th Premier League match as a manager.
“I thought we weathered the early storm well. We controlled an opponent in very good form,” said Hodgson.
“Eventually they scored a good goal, but the second goal was a little unfortunate as we were starting to grow into the game and looking a little bit likely ourselves. Then it was very difficult for us to get back into it.
“It’s an unfortunate spell we find ourselves in, but I can’t say I’m disappointed with our performance.”


| DOSE: |
5 tsp |
oral |
Yohimbe |
(ground / crushed) |
So I saw the yohimbe preparations and decided to try it. I bought 1/4 of a pound for $7. I put 5 teaspoons into about 2 cups of water, and boiled it for about 7 minutes. I strained the bark out, and was left with a red mixture. I added globs and globs of honey, and like this it wasn't at all difficult to drink. It really wasn't bad tasting.
I drank the mixture at 2:00 PM, and after about 20 minutes, I started having mild nausea. I also started feeling something thatis difficult to describe. Not very dopaminerginic like amphetamines or opiates (that warm feeling.) It was very strange to walk, kind of like I was walking through water. The effect was not really that pronouned. There was no intellectual clouding; I was quite with it cognitively.
Anyway, the nausea kept getting worse, and it eventually culminated in me vomiting very hard. I vomitted so hard that I burst the blood vessels around my eyes, and had little red spots around there (I've heard that these go away within a couple weeks if not days.) After that, I had mild nausea for the next 3 hours, especially whenever I drank or at anything. I also had to burp every 5 minutes for the next 6 hours. It did seem to elevate my mood for the rest of the day, as I was quite cheery and giggly. I also had trouble falling asleep at 12:30 AM, 10.5 hours after I ingested the mixture, despite taking a benadryl.
Overall, I would definitely not recommend this high a dosage to anyone. The high wasn't even really a high. If you want to try it, try one teaspoon, two at most. In fact, I would just recommend you buy the tea bags of Yohimbe that they sell at the health food stores. This could be an effective antidepressant in low dosages, I would think. I will never again have this high a dosage, though I will probably try one or two teaspoons again.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Let's Code a Pomodoro Timer
The Pomodoro Technique is a time management method that tracks the number of focused work periods you perform and rewards you periodically with breaks so that you stay refreshed.
The technique is simple. Set a Work Timer (usually for 25 minutes). Work on the task.
When the timer completes, evaluate your progress.
Did you complete the period successfully, working on the task throughout? Then put a checkmark on a piece of paper.
Did you get distracted during the period and fail to work the full length? Well, then it doesn’t count.
If your piece of paper has fewer than four checkmarks, start a Break Timer (usually 3-5 minutes). Take a short break. Then start the work timer again.
When you’ve completed four Pomodoros (four checkmarks), take a longer break (15-30 minutes), erase the checkmarks, and continue working.
In an 8 to 10 hour day, you ideally complete 16 pomodoros. You’ll have 4 15-30 minute breaks, and 16 3-5 minute breaks.
This comes out to 6 hours and 40 minutes of focused work, and between 1hr 48mins and 3hrs 20 mins of breaks.
We’re going to code a Pomodoro Timer.
We’d like to be able to invoke the timer like this:
window.onload = function () {
const displayDiv = document.querySelector("div#timer");
var timer = new Pomodoro({ displayDiv });
timer.init();
timer.startTimer();
};
Let’s code a basic object to manage our timer.
-
We want to specify a duration for our work period and our two break periods, short and long.
-
We’d like to be able to pause and resume the timer.
-
We need to be able mark a work period as an incomplete Pomodoro.
We configure checkMarks
(count of the number of successful Pomodoros), a running
flag, an interval
to hold the reference to the setInterval function that calls the timer periodically, a timerType
(‘work’ or ‘break’), a displayDiv
to hold the div in which time info is displayed, and lastTick
(the instant we last incremented the elapsed time).
isValid
is a flag set at the start of each timer run that determines whether the Pomodoro was valid or not (did the user get distracted)? timerLength
holds the length of the current timer (one of either workSeconds, shortBreakSeconds, or longBreakSeconds). secondsElapsed
holds the number of seconds that have passed while the timer has been running for the given timerType
.
var Pomodoro = (function () {
function Pomodoro(args = {}) {
const {
workMinutes,
shortBreakMinutes,
longBreakMinutes,
displayDiv,
} = args;
// short defaults for testing
this.workSeconds = workMinutes * 60 || 10;
this.shortBreakSeconds = shortBreakMinutes * 60 || 5;
this.longBreakSeconds = longBreakMinutes * 60 || 30;
// longer defaults for real-world: 25*60; // 5*60; // 15*60
this.checkMarks = 0;
this.isValid = true;
this.running = false;
this.interval = null;
this.lastTick = null;
this.secondsElapsed = 0;
this.timerLength = null;
this.timerType = "work"; // 'work' or 'break'
this.displayDiv = displayDiv;
}
return Pomodoro;
})();
Defining Object Methods
We initialize by starting with a work period.
Pomodoro.prototype.init = function () {
this.timerLength = this.workSeconds;
let res = document.createElement("div");
res.classList.add("clock");
res.id = "clock";
this.displayDiv.appendChild(res);
this.resultsDiv = document.querySelector("div#clock");
// got distracted
let b = document.createElement("button");
b.innerHTML = "got distracted";
this.displayDiv.appendChild(b);
b.addEventListener("click", () => (this.isValid = false));
// pause timer
let pause = document.createElement("button");
pause.innerHTML = "pause";
this.displayDiv.appendChild(pause);
pause.addEventListener("click", () => this.togglePause());
};
We define a few simple functions to toggle timer type and check whether the timer is a work timer or a break timer.
wasValidPomodoro
tells us whether isValid===true
. During a work period, if the user clicks a “got distracted”, we continue with the work period, but we do not count that period toward the checkmarks for a longer break.
displayTime
uses the provided div to output the relevant user-facing timer information. You’ll notice that it uses two helper functions. nTimes
just repeats a given character c
n
times and returns it in an array. We use it to update our list of checkmarks. formatTime
takes the seconds remaining and formats them to a mm:ss display (padding out seconds with a 0 if fewer than 10).
Pomodoro.prototype.flipTimerType = function () {
return (this.timerType = this.timerType === "work" ? "break" : "work");
};
Pomodoro.prototype.isWork = function () {
return this.timerType === "work";
};
Pomodoro.prototype.isBreak = function () {
return this.timerType === "break";
};
Pomodoro.prototype.displayTime = function () {
this.displayDiv.innerHTML = `${this.timerType}! time left: ${Math.ceil(
this.timerLength - this.secondsElapsed
)} checkMarks: ${this.checkMarks}`;
};
Pomodoro.prototype.wasValidPomodoro = function () {
return this.isValid === true;
};
Pomodoro.prototype.displayTime = function () {
this.resultsDiv.innerHTML = `${this.timerType}!
${nTimes("✔", this.checkMarks).join(" ")}

time left: ${formatTime(
Math.floor(this.timerLength - this.secondsElapsed)
)}
successful pomodoros: ${this.pomodoroCount}`;
};
startTimer
We call startTimer
when the timer is first initialized and also each time the timer type changes. We set the running
flag, reset secondsElapsed
, and set the timer interval to call update and display every 1000ms.
Pomodoro.prototype.startTimer = function () {
this.secondsElapsed = 0;
this.lastTick = Date.now();
this.running = true;
this.isValid = true;
this.interval = setInterval(() => {
this.updateTime();
this.displayTime();
}, 1000);
};
updateTime
updateTime
increments the elapsed time by adding the difference between the current instant and the last instant the function was called. We divide by 1000 because Date.now()
returns milliseconds, and we are measuring elapsed time in seconds.
Each tick we check if elapsed has exceeded the current timer length. If so, we stop the timer.
Note that we do not assume that updateTime
gets called every second, even though we define the interval as 1000ms. This is because the event loop timing is not that precise
. We can’t just add 1
to secondsElapsed every time updateTime
gets fired.
Instead, each time the function is called, we calculate the difference between the two time points.
Pomodoro.prototype.updateTime = function () {
if (!this.running) {
return false;
}
this.secondsElapsed += (Date.now() - this.lastTick) / 1000;
if (this.timerLength - this.secondsElapsed < 0) {
this.running = false;
return this.timerEnded();
}
this.lastTick = Date.now();
};
timerEnded
We call timerEnded
whenever a time interval (work or break period) ends. The timer stops the interval. Then, if we just finished a work interval, we check to see if the Pomodoro was valid, incrementing checkMarks
if so. We flip the current timer type and set the length of the next time period, calling startTimer
at the end.
Pomodoro.prototype.timerEnded = function () {
clearInterval(this.interval);
// if timer was work, prompt user to see if they get a checkmark or not
if (this.isWork()) {
// time for a break
if (this.wasValidPomodoro()) {
this.checkMarks++;
}
if (this.checkMarks === 4) {
// long break
this.timerLength = this.longBreakSeconds;
this.checkMarks = 0;
} else {
this.timerLength = this.shortBreakSeconds;
}
} else {
// time to work
this.timerLength = this.workSeconds;
}
this.flipTimerType();
this.startTimer();
};
togglePause
We’d like to be able to pause the timer if we step away from a work or break period and return later. If the timer is not paused when we call togglePause, we stop the interval (no need for it) and set the running flag to false. If the timer was already paused, we resume the timer.
Note how we’ve been able to code pause by simply composing existing object methods. Since we created small functional units that act without side effects, we can compose them in different ways to produce different behaviors. This makes code functionality easier to debug, shorter, less error prone, and easier to unit test and reason about.
Pomodoro.prototype.togglePause = function () {
if (this.running) {
this.running = false;
clearInterval(this.interval);
} else {
this.running = true;
this.interval = setInterval(() => {
this.updateTime();
this.displayTime();
}, 1000);
}
};
That’s that!
It works! It’s simple, but it’s enough to use as a productivity tool. Note how it works even if it is open in a separate tab. It’s also minimal in that it only requires user intervention when the user fails to complete a Pomodoro. Otherwise, it works silently in the background and can be viewed in the page title or open tab if in a browser.
Additional Features
- We can enhance the UI to make it prettier.
- We can use the Notifications API and Vibration API to make subtle indications of the start and end of pomodoro periods.
- We can use LocalStorage to track “Pomodoros for the day” so that users can leave the site and return later.
- We can establish “daily pomodoro goals”
- We can track Pomodoro success over time: days, Pomodoros completed, # times distracted


Event Location:
University of South Florida (USF), College of Business Bldg.
4202 E Fowler Ave
Tampa, Florida
Abstract:
This session explores the tabular approach to building cubes in SQL Server Analysis Services 2012 for those DBAs and developers who are more comfortable working with relational databases than cubes. Starting with a ‘normal’ relational database, the attendee will learn how to build a basic model by loading data from several data sources, establish relations between these data sources, define measures and dimensions, build hierarchies, create KPIs and deploy functional cubes that can be used to answer management’s questions about what is really going on with their data. For users already familiar with PowerPivot, this session provides a good transition into the world of SSAS as both use essentially the same techniques.
Speaker(s): Michael Antonovich,
Abstract:
As the most prolific inventor in American history, Thomas Edison was a master of “Best Practices!” Edison’s creations were not just novel and commercially successful, but many launched entire new industries including electric light and power, sound recording, motion pictures and industrial cement and concrete manufacture. At the heart of Edison’s remarkable record of innovation was his categorization of the innovation process into “competencies,” or bundles of skills supporting the achievement of success in a particular area of endeavor. In this session, we will look at ways that we can use many of these broad success secrets to bring powerful tools and strategies to the recurring implementation of business intelligence.
Speaker(s): William E Pearson III,
Abstract:
There’s no denying that Big Data is here to stay, and that society will ultimately be transformed in many ways as a result of its impact. But while Big Data might be 'the next big thing', most companies, no matter what size, would probably do better to focus first on fully utilizing non-big-data BI to address the core challenges of any company, which include: leadership, management, and motivation. In this presentation, I’ll be reviewing three uses of "traditional BI" that are often under-employed and which can be transformational for a business in their own right. For this, I'll be sharing examples, practical tips, and stories from my own experiences at my organization, coupon-giant Valpak.
Speaker(s): Thomas Spetnagel,
Abstract:
Microsoft revamped SSIS with the 2012 release. Attend this session to learn about the new project deployment model, parameters, the SSIS catalog and more!
Speaker(s): Kathi Kellenberger,
Abstract:
Analyzing data across multiple sources for a 360 degree view of your business Not only is the size of data growing, but so are the number of data sources and the number of requests from the business to analyze it. Today’s data professionals are now required to access a myriad of relational and non-relational sources, mash it up together and provide in-depth reports and visualizations, and usually without a lot of time. In this session, product evangelist Peter Evans will show you how Toad can dramatically reduce time spent on accessing relational and non-relational data, simplify data integration, and how to collaborate with other users for a 360 degree view of your business.
Speaker(s): Peter Evans,
Abstract:
By now, we have heard a lot about the new Power* tools. PowerPivot, PowerView, PowerQuery and the tabular data model. But what does it all mean? How can you put these tools to work for you, where you live and work every day? This session provides examples of powerfully combining data from lots of different sources in creative ways that were simply not possible in the past. This session will walk you through real life scenarios, using these tools to fill in missing and move from “if only” to “what if”, and valuable insight...
Speaker(s): James McAuliffe,
Abstract:
Are you storing or planning to store credit card numbers? If so, you need to learn all you can about the requirements for PCI compliance. We'll cover how PCI works from the requirements to the final audit, and eveything in between that you'll need to know something about. We'll talk about encryption, key management, logging, alerting, administration access, granular permissions, tokenization, and as much more as we can fit into an hour. It's a complex topic, but that just makes it more interesting!
Speaker(s): Andy Warren,
Abstract:
Wondering about Hadoop, and how all that big data is going to be moved around? Or how you are going to move any of it into your SQL Server environment? Come to this session, and learn about some of the familiar and not so similar tools you can use for moving big data. We’ll compare the options, discuss how they can work with your existing Microsoft technologies, and provide some guidance on when to use each of the tools.
Speaker(s): John Welch,
Abstract:
You’ve got your Analysis Services cube created, and deployed in production. However, you notice that every night, the cube is taking longer and longer to process, and users are starting to complain about their data not being ready when they arrive in the morning. If you’ve found yourself in this situation, or want to avoid being in it in the first place, come to this session. We’ll cover how to benchmark processing performance, track down bottlenecks, and how to tune things to get the best performance for processing your cube.
Speaker(s): John Welch,
Abstract:
Let's get rid of the barriers to getting started with Hadoop. in this session we will walk through how to setup a HDInsight service cluster in the cloud and how to set up a HDP cluster in VMs.
Speaker(s): Brian Mitchell,
Abstract:
In this session, we will explore the basic architecture of SQL Server including how data is stored and accessed within SQL Server. Next, we will dive into the practical by discussing how to identify performance bottlenecks at a system level and then again at the query level and we will wrap things up by walking through the tuning of a specific problematic query.
Speaker(s): Steve Abraham,
Abstract:
Is your day full of repetitive tasks that you would like to hand off? Maybe you can push them back to the source. SSRS can empower you to empower your users. By pass the UI team and do it yourself. We will discuss options and considerations you should know about to create a report process to populate data your users are asking you to populate with validation and defaults.
Speaker(s): Pam Shaw,
Abstract:
If you have a SQL Server license (Standard or higher) then you already have the ability to start data mining. In this new presentation, you will see how to scale up data mining from the free Excel 2013 add-in to production use. Aimed at beginning to intermediate data miners, this presentation will show how mining models move from development to production. We will use SQL Server 2012 tools including SSMS, SSIS, and SSDT.
 Are you wondering what opportunities and changes big data may bring to your data warehouse architecture? In this session you will learn about HDinsight, Microsfot’s big data platform, capabilities and tool set. We will address common myths and develop recommendations to successfully bring big data capabilities to your data warehouse and business intelligence implementation. After this presentation you will better prepared to make architectural and functional design decisions when considering Microsoft HDInsight as part of your solution.
Speaker(s): Jason Virtue,
Abstract:
Let's go beyond the hype of Big Data and the Microsoft story around Big Data and talk about a real-world actual implementations of Big Data Big Data Analytics solutions. In this session, I'll talk about implementing SQL Server, Big Data Analytics engines, Hadoop and Big Data visualizations tools using specifics of a customer implementation which I was responsible for.
Speaker(s): Mark Kromer,
Abstract:
In this session Mike shows how a complete BI solution is built from the transactional system to the finished Cube and reports. He will go over the steps involved in planning a BI solution and how to make your project successful. You will get an understanding of the roles SSIS, SSAS, and SSRS play in building a BI solution.
Speaker(s): Mike Davis,
Abstract:
Ever as yourself what time of day it is? Like what time of day does our support desk get the most cases? What are my average sales per hour? When do I need to add more staff, or even perhaps am I over staffed? There are many situations in which being able to slice your data by time of day would be valuable. In this session we will review how to setup a time key and time dimension, configure it in an OLAP cube, and discuss implementing in a tablular model.
Speaker(s): Alexander Nykolaiszyn,
Abstract:
This session will describe our journey to convert our cluttered, underutilized, power draining physical hosts to a sleek virtualized environment. This session will also provide some VMware high level architecture, terms and concepts, and a look at vSphere (VMware admin console). I'll discuss the differences between virtual and physical host metrics and issues surrounding them. We'll discuss some virtualization shortcomings and then show a little about Confio's Ignite and how it can help DBAs achieve virtualization and not lose visibility of their physical layer.
Speaker(s): Rob Mandeville,
Abstract:
Self service BI can be a snap even when you build your data models in SQL Server Analysis Services by using PowerPivot for Excel to compress, query and report on the data. This session will begin by showing how to create a cube in Analysis Services and then connect that cube to PowerPivot for Excel. Once in PowerPivot, we will see how to connect this data to other data sources and augment the cube data with calculated DAX expressions. We will close by showing from a user's point-of-view how easy it is to manipulate the data to create a variety of different reports and charts with no code.
Speaker(s): Michael Antonovich,
Abstract:
Want to take Self Service BI to the next level. Learn how the new Microsoft PowerBI works in the Cloud. You'll see how to set up Gateways, Data Sources as well as connect using Excel Power Query.
Speaker(s): Jon Bloom,
Abstract:
When reviewing your ETL processes, the No. 1 question is always, "Does it work as expected?" Closely following that question is the ubiquitous, "How fast does it run?" This session’s tips are targeted at improve the latter. In this session, we’ll focus on SSIS package performance, quickly reviewing 15 of the most common hotspots for performance issues as well as recommended methods for maximizing throughput. You’ll walk away with some key design patterns and recommendations that you can use today to improve SSIS package performance.
Speaker(s): Tim Mitchell,
Abstract:
Take your relational data warehouse query performance all the way to ELEVEN!! The Column Store Index is a new feature that allows for stunning performance. We will cover how it works, why it is so fast as well as the v1.0 limitations and gotchas.
Speaker(s): Kevin Boles,
Abstract:
In this session we will do an introduction to SQL Server Reporting Services (SSRS). SQL Server Reporting Services provides a full range of ready-to-use tools and services to help you create, deploy, and manage reports for your organization, as well as programming features that enable you to extend and customize your reporting functionality. You will walk away with basic skills to create SSRS reports along with some tips and tricks.
Speaker(s): Wes Springob,
Abstract:
On this session we are going to cover how to create ETL frameworks using Metadata using SSIS. The introduction would start from standard ETL File loading using BCP, Bulk Copy, File Delimited and Fixed Width. Finally we will create a single framework to track and deliver the File (s) to any destination within your organization while maintaining company standards and code consistency.
Speaker(s): Jorge Novo,
Abstract:
In this session we will go over some of the breakthroughs that USF has made in Analytics and Big Data.
Speaker(s): Balaji Padmanabhan,
Abstract:
This fun and informative session covers best practices for data visualization and even infographics using Microsoft BI: Excel, Power View, the Office 2013 Web Apps Framework, Reporting Services, Visio and other open source and third-party data visualizations.
Speaker(s): Jen Underwood,
Abstract:
On this session we are going to cover the Type I (Data Refresh) and Type II Slowly changing dimension processes to successfully load and track your historical changes on a SQL Server warehouse and how to keep track of the Raw data for data quality and auditing.
Speaker(s): Jorge Novo,
Abstract:
Being a full-stack .NET developer, I have written my fair share of T-SQL, but not until I became an accidental DBA did I find a new world of T-SQL options available to me. In this session, I will go over a five T-SQL commands available since SQL Server 2005 and up that I have been completely missing. We will evaluate the usefulness of CTE, OUTPUT, MERGE, APPLY, and RANKING FUNCTIONS and how each of these can replace common cases you see everyday.
Speaker(s): Jason Carter,
Abstract:
Hadoop is becoming the industry standard for processing Big Data. Learn about Hadoop offerings from Hortonworks On-Premise. You’ll see both the Linux and Windows versions and get familiar with some of it’s functionality.
Speaker(s): Jon Bloom,
Abstract:
Come see how to write queries against a multidimensional database! We will be covering: How to Think About Writing an MDX Query, Basic Terminology, and Build From Simple to More Powerful Query Components. This will be a great launch into
Speaker(s): Michael Simon,
Abstract:
Explore some of the mistakes and misconceptions DBAs tend to have about SSIS. Also look at the performance and scalability of ETL vs ELT with real world examples and sample code.
Speaker(s): Paul Rizza,
Abstract:
Even in the most reliable ETL system, it's eventually going to happen: A package will fail, an output row count won't match what is expected, a data anomaly will force a forensic search of the package infrastructure... In this session, we'll talk about some of the things that can go wrong during package execution - and some of the defenses that can be built into SSIS to help head off those errors (or at least make the errors easier to troubleshoot). From error handlers to package restartability, and from logging methods to row count validation and remediation, we'll cover various ways to keep your ETL flowing when problems arise.
Speaker(s): Tim Mitchell,
Abstract:
This session focuses on error handling in SQL Server Integration Services 2012. Different techniques and strategies will be introduced for error handling in control flow, data flow, and script tasks as well as how to dynamically handle errors.
Speaker(s): David Dye,
Abstract:
Find out what hiring managers really want to see throughout the hiring process. This session will walk through the basics that every successful candidate should know: Resume tips, Job search and Interview tips. Yes, recruiters and hiring managers view your LinkedIn page; but, did you realize they also view your twitter account, your blog, your Facebook and that webpage you designed freshman year in college? If you are in a job search, considering one or just want to be prepared for one, then this session will be a great opportunity to find out what "they" are really looking for.
Speaker(s): Todd Davis,
Abstract:
In this session we will go over the most important BI features available in SharePoint.
Speaker(s): Clinton Daniel,
This is a list of speakers from the XML Guidebook records. The details and URLs were valid at the time of the event.
LinkedIn: https://www.linkedin.com/in/michaelpantonovich?
Contact: http://sharepointmike.wordpress.com
Michael Antonovich is the assistant director of Web and Technology Services in the Communications Division for Orange County Public Schools in Orlando, FL, where he manages the Internet and intranet infrastructure. He has published seven books, ranging from an Apple II User Guide to Office and SharePoint 2010 User's Guide. His blog has focused mainly on PowerPivot and Power BI, but for the last year Mike has taken a break to pursue some other activities. He hopes to restart his blog later this year focusing more on style and presentation. Mike has used SQL Server since 1998 and, for the past 7 years, has been promoting SSAS, PowerPivot, and Power BI for the masses.
Contact: http://www.mb2x.com
With 16 years of experience, Microsoft Technology Expert, Steve Abraham, holds 9 Microsoft certifications and has contributed to the development of 11 Microsoft certifications covering various Microsoft technologies. Steve has lead teams for some of the biggest and best known companies and organizations many of them dealing with mission critical data and in crisis situations including the U.S. State Department, Eddie Bauer, 1-800-Flowers and Hasbro.Steve is co-founder and CTO of MB2x.
LinkedIn: http://www.linkedin.com/in/prizza/
Contact: http://blogs.msdn.com/b/paulrizza/
Paul Rizza is a Senior Consultant at Microsoft Consulting Services (MCS), Lead on the MCS SQL Hiring Team, and has over 25 years’ experience consulting, teaching and developing on SQL Server platforms. Paul’s expertise includes ETLs, Dimensional modeling, architecting highly available SQL environments and performance tuning. Paul has an Undergraduate degree from UMBC and a Master’s degree both in Computer Science with a concentration in Database Theory from Johns Hopkins University.
Contact: http://etldevelopernotes.blogspot.com/
Jorge Novo is a database developer with more than 10 years of experience in the design, implementation, and maintenance of OLAP, ROLAD database system for the enterprise. Jorge specialize himself on ETL processes using automation, and dynamic programming for SSIS. Currently Jorge is working in the programming and development of Data Master Service for the organization.
Contact: http://www.littlebigintel.com/
Alexander Nykolaiszyn is a Sr. Business Intelligence Developer for Citrix Systems. Specializing mostly in the BI Stack and Dashboard Design. In his spare time he thinks way too much about the consumption and perspective of business intelligence as well as putting his family to sleep with way too much enthusiasm about data.
Contact: http://jason-carter.net
Jason#39;s past has included being a developer, a development manager, accidental DBA, and now a full-time DBA. Having worked with VLDBs as a developer, he found great interest in tuning, tweaking, and making things run faster. With the support of his wife, he gave up his managerial duties and jumped the Development ship and dove head first into his new career as a Database Administrator
LinkedIn: https://www.linkedin.com/in/timmitchell/
Contact: http://www.TimMitchell.net
Tim Mitchell is a business intelligence architect, author, and trainer. He has worked with SQL Server for over a decade, specializing in data warehousing, ETL/SSIS, and reporting. He holds a Bachelor’s Degree in Computer Science from Texas AM at Commerce, and is recognized as a Microsoft Data Platform MVP. Tim is a business intelligence consultant and principal at Tyleris Data Solutions. Tim is an active community speaker and volunteer, having spoken at over 100 events including the PASS Summit, SQLBits, Dev Connections, SQL Intersection, and scores of SQLSaturdays. He blogs at TimMitchell.net, and tweets at @Tim_Mitchell.
LinkedIn: http://www.linkedin.com/profile/view?id=33808310
Contact: http://brianwmitchell.com
Brian Mitchell, an MCM - SQL 2008 with a MBA from the University of Florida, is a Senior Consultant in the Microsoft Big Data Center of Expertise, where he focuses on SQL Server Parallel Data Warehouse, HDInsight, and Microsoft Business Intelligence. Brian has spent countless hours onsite at customer sites delivering Microsoft database and BI solutions. He has extensive experience creating and delivering advanced training for the full range of the Microsoft BI stack, with a particular passion for Analysis Services and Reporting Services. Brian has presented at TechEd, PASS Summit, SQLRally, and several SQLSaturdays and SQL Server user groups. You can read more about his deep involvement in Microsoft data technologies at http://brianwmitchell.com.
Contact: http://www.agilebay.com
Jon Bloom is a Business Intelligence Consultant for Agile Bay, Inc. working in the Microsoft BI stack. Jon has worked with Data professionally since 1996 in various roles such as: Report Writer; Programmer; Data Warehousing; ETL; and now Big Data. He is also a member of the Microsoft Tampa Bay BI User Group. Twitter: @SQLJon.
LinkedIn: https://www.linkedin.com/e/fpf/252170891
Contact: https://mvp.support.microsoft.com/profile=02C5CD07-7511-4151-A678-3A4A3451F85E
Bill Pearson created Island Technologies Inc. in 1997, and has developed a large and diverse customer base since. Bill#39;s background as a CPA, Internal Auditor, Management Accountant, and SQL Server MVP (BI) enables him to provide value to clients as a liaison between Accounting / Finance and Information Services. Bill has implemented enterprise business intelligence systems over the years for many Fortune 500 companies and focuses his practice upon the integrated Microsoft Business Intelligence
LinkedIn: https://www.linkedin.com/profile/view?id=218587224amp;trk=hp-identity-name
Rob Mandeville is a Senior DBA with over 20 years of broad experience in database technologies. He's served in many roles including production DBA, development DBA, and architect/data modeler on a variety of platforms. Before coming to Solarwinds, Rob worked in the aerospace, global technology, and geospatial industries. Rob also had the honor of teaching database related master level courses at Regis University.
Peter Evans is the Business Intelligence and Analytics Product Evangelist and Product Technologist Consultant for Dell and is a recognized expert in the design, implementation and delivery of bespoke Business Intelligence and Analytics systems utilizing various technologies to a large number of major international companies in over 16 years in the field. Holding memberships of the British Computer Society, Institute of Analysts and Programmers and certification from Microsoft, Novel and Targit.
Contact: http://etldevelopernotes.blogspot.com/
Jorge Novo is a database developer with more than 10 years of experience in the design, implementation, and maintenance of OLAP, ROLAD database system for the enterprise. Jorge specialize himself on ETL processes using automation, and dynamic programming for SSIS. Currently Jorge is working in the programming and development of Data Master Service for the organization.
Jason Virtue is a Business Intelligence professional with 15+ years of experience for management consulting firms and Fortune 500 IT departments. Jason is a BI TSP for the Florida region at Microsoft
Todd Davis is a Manager at Convergence Consulting Group, an Analytics, BI and DW consultancy. He is responsible for recruiting and hiring some of the industry’s top tier BI Consultants. Todd is a 2003 graduate of the University of Florida where he studied Economics and Management and also began his career in recruiting and managing employees while attending UF. Todd has been instrumental in the placement of more than 1,000 professionals over a thirteen-year career.
LinkedIn: https://www.linkedin.com/in/michaelpantonovich?
Contact: http://sharepointmike.wordpress.com
Michael Antonovich is the assistant director of Web and Technology Services in the Communications Division for Orange County Public Schools in Orlando, FL, where he manages the Internet and intranet infrastructure. He has published seven books, ranging from an Apple II User Guide to Office and SharePoint 2010 User's Guide. His blog has focused mainly on PowerPivot and Power BI, but for the last year Mike has taken a break to pursue some other activities. He hopes to restart his blog later this year focusing more on style and presentation. Mike has used SQL Server since 1998 and, for the past 7 years, has been promoting SSAS, PowerPivot, and Power BI for the masses.
LinkedIn: http://www.linkedin.com/in/mikedavissql
Contact: http://MikeDavisSQL.com
Mike Davis, MCITP, is a Consulting Team Lead at Pragmatic Works. He is an author with books covering Business Intelligence and SSIS. Mike is an experienced speaker and has presented at many events such as several SQL Server User Groups, Code Camps, SQL Server Launches, SQLSaturday, and SQL Rally. Mike is an active member at his local user group (JSSUG) in Jacksonville, FL.
LinkedIn: http://www.linkedin.com/in/thesqlguru
Kevin Boles is a SQL Server expert, working exclusively with the product since v6.5. With over 25 years of database experience and over 45,000 man hours of SQL Server engine experience, he holds many related certifications, is an MCT and was a SQL Server MVP from 2007 to 2012. Kevin has been a very successful independent consultant for over 20 years. His passion is the relational engine, especially designing, building, analyzing and tuning high-performance database applications.
Contact: https://sqlandy.com
Andy Warren is a SQL Server consultant and trainer based in Orlando, FL. Focusing on administration, performance tuning, and SQL Server patterns and practices, he’s been a SQL Server MVP since 2008. Andy served two terms on the PASS Board of Directors, was a founding principal in SQLServerCentral, and created both the SQLSaturday and SQLRally event models.
Contact: http://www.valpak.com
Tom Spetnagel is currently the Director of Business Intelligence for Valpak, the 40-year-old nationally-recognized provider of coupons and savings to consumers via The Blue Envelope and various digital platforms such as Valpak.com. Tom has both a Master's in Aerospace Engineering and an MBA from Georgia Tech, and is a former platinum consultant at global ERP giant SAP, where he helped companies like BMW, Hershey, Georgia-Pacific, Kimberly-Clark, and GE-Fanuc solve their reporting challenges.
LinkedIn: http://www.linkedin.com/in/johncwelch/
Contact: http://agilebi.com/jwelch
John Welch joined SentryOne in spring 2018 as VP of Engineering with the acquisition by SentryOne of the software division of Pragmatic Works. John leads the development of a suite of products that make developing, managing, and documenting data solutions easier. John has been successfully delivering IT solutions to business problems since 1994, and has been focused on business intelligence and data warehousing technologies since 2001. He is a Microsoft Most Valued Professional (MVP), and a frequent presenter on SQL Server and data topics. He also contributes to several open source projects and community initiatives targeted toward making data professionals work more productive.
Contact: http://www.interlinebrands.com/
BI Developer trained while on staff at Pragmatic Works (under Brian Knight). Now developing for Interline Brands a $1.5 Billion distributor. Experienced in writing MDX for Performance Point 2010/2013,SSRS 2008R2 and SSAS 2008R2.
LinkedIn: http://www.linkedin.com/in/kathikellenberger
Contact: http://auntkathisql.com
Kathi Kellenberger is the editor of Simple Talk at Redgate and a Data Platform MVP. She has worked with SQL Server for over 20 years and has authored, co-authored, or tech edited over a dozen technical books. Kathi is the co-leader of the PASS Women in Technology Virtual Group and a volunteer at LaunchCode. When Kathi isn’t working, she enjoys spending time with family and friends, cycling, singing, and climbing the stairs of tall buildings. Be sure to check out her courses on Pluralsight.
LinkedIn: https://www.linkedin.com/in/jenunderwood
Contact: http://www.impactanalytix.com/
Jen Underwood, a Senior Director at DataRobot, has held worldwide analytics product management roles at Microsoft and served as a technical lead for system implementation firms. She has over 20 years of experience launching new products and turning around failed projects in enterprise data warehousing, reporting, and advanced analytics. Today she designs product and helps analytics professionals learn how to solve complex problems with machine learning in the emerging citizen data science segment. Jen has a Bachelor of Business Administration – Marketing, Cum Laude from the University of Wisconsin, Milwaukee and a post-graduate certificate in Computer Science – Data Mining from the University of California, San Diego.
Contact: http://www.bloomconsultingbi.com/
Jon Bloom is a Business Intelligence Consultant working in the Microsoft BI stack. Jon has worked with Data professionally since 1996 in various roles such as: Report Writer; Programmer; Data Warehousing; ETL; and now Big Data. He is also a member of the Microsoft Tampa Bay BI User Group. Twitter: @SQLJon.
Contact: http://www.kromerbigdata.com
Mark Kromer is a Big Data Analytics product specialist who has been a product manager, delivery consultant and solution architect in the BI DW space for 20 years with Microsoft, Oracle, ATT and now Pentaho.
Contact: http://www.SQLWes.com
Wes Springob is a Business Intelligence Consultant working for Agile Bay, Inc., a Tampa based consulting firm specializing in Data Warehouse, Business Intelligence and Big Data solutions. He has been involved in creating web based applications for over 15 years and has experience in a variety of industries for companies large and small.
LinkedIn: http://www.linkedin.com/profile/view?id=11710667amp;trk=tab_pro
James McAuliffe is a Cloud Solution Architect with CCG Analytics, a Microsoft Gold Partner. He is also a Microsoft Preferred Partner Solutions expert and has been worked with clients of all sizes, from local businesses to Fortune 500 companies. Today’s mix of Big Data and cloud offerings make yesterday’s dream today’s possibility. Let’s talk about it!
Faculty at USF.
Pam Shaw has been in IT for almost 30 years. Since 2001, Pam has been working with SQL Server, first 2000, then 2005 and now 2008. Pam is currently an independent contractor. Pam is also the Chapter Leader of the Tampa Bay SQL Users Group - a local chapter of PASS and organizer of SQLSaturday Tampa.
LinkedIn: https://www.linkedin.com/in/marktab
Contact: http://marktab.net
Mark Tabladillo Ph.D. works for Microsoft as a Cloud Solution Architect for the US CTO Customer Success Team. He has a science doctorate from Georgia Tech. Based in Atlanta, GA, Mark provides cloud enterprise solutions for companies in the US for Microsoft's strategic clients. He is a chapter leader for the PASS Data Science virtual chapter.
David is a Sergeant with the Cape Coral Police Department and currently works as a database administrator and developer in the Administrative Services Division. He began his career with the police department in 1990 in the patrol division and worked various assignments until being promoted to Sergeant in 1998. Based on his education and experience David was assigned to his current position in 2002 and is responsible for database administration, software integration, and development for public sa
LinkedIn: https://www.linkedin.com/in/timmitchell/
Contact: http://www.TimMitchell.net
Tim Mitchell is a business intelligence architect, author, and trainer. He has worked with SQL Server for over a decade, specializing in data warehousing, ETL/SSIS, and reporting. He holds a Bachelor’s Degree in Computer Science from Texas AM at Commerce, and is recognized as a Microsoft Data Platform MVP. Tim is a business intelligence consultant and principal at Tyleris Data Solutions. Tim is an active community speaker and volunteer, having spoken at over 100 events including the PASS Summit, SQLBits, Dev Connections, SQL Intersection, and scores of SQLSaturdays. He blogs at TimMitchell.net, and tweets at @Tim_Mitchell.
LinkedIn: http://www.linkedin.com/in/johncwelch/
Contact: http://agilebi.com/jwelch
John Welch joined SentryOne in spring 2018 as VP of Engineering with the acquisition by SentryOne of the software division of Pragmatic Works. John leads the development of a suite of products that make developing, managing, and documenting data solutions easier. John has been successfully delivering IT solutions to business problems since 1994, and has been focused on business intelligence and data warehousing technologies since 2001. He is a Microsoft Most Valued Professional (MVP), and a frequent presenter on SQL Server and data topics. He also contributes to several open source projects and community initiatives targeted toward making data professionals work more productive.
Faculty at USF.
The following is a list of sponsors that helped fund the event.


|
HypePubSub
Hype demo for a publish/subscribe protocol.
|
#include "hype_pub_sub/list_service_managers.h"
Functions | |
| HpbServiceManagersList * | hpb_list_service_managers_create () |
| HpbServiceManager * | hpb_list_service_managers_add (HpbServiceManagersList *list_serv_man, HLByte service_key[SHA1_BLOCK_SIZE]) |
| int | hpb_list_service_managers_remove (HpbServiceManagersList *list_serv_man, HLByte service_key[]) |
| void | hpb_list_service_managers_destroy (HpbServiceManagersList **list_serv_man) |
| HpbServiceManager * | hpb_list_service_managers_find (HpbServiceManagersList *list_serv_man, HLByte service_key[]) |
| HpbServiceManager* hpb_list_service_managers_add | ( | HpbServiceManagersList * | list_serv_man, |
| HLByte | service_key[SHA1_BLOCK_SIZE] | ||
| ) |
Adds an HpbServiceManager to a HpbServiceManagersList.
| list_serv_man | List in which the HpbServiceManager should be added. |
| service_key | Service key of the HpbServiceManager to be added. |
| HpbServiceManagersList* hpb_list_service_managers_create | ( | ) |
Allocates space for a linked list of HpbServiceManager elements.
| void hpb_list_service_managers_destroy | ( | HpbServiceManagersList ** | list_serv_man | ) |
Deallocates the space previously allocated for a linked list of HpbServiceManager elements.
| list_serv_man | Pointer to the pointer of the HpbServiceManager linked list to be deallocated. |
| HpbServiceManager* hpb_list_service_managers_find | ( | HpbServiceManagersList * | list_serv_man, |
| HLByte | service_key[] | ||
| ) |
Finds a given HpbServiceManager in a linked list.
| list_serv_man | List in which the HpbServiceManager should be searched. |
| service_key | Service key of the HpbServiceManager to be searched. |
| int hpb_list_service_managers_remove | ( | HpbServiceManagersList * | list_serv_man, |
| HLByte | service_key[] | ||
| ) |


Welcome to the JLXD Web Portal. Click one of the above links to start using the application.
For more information about LXD see:


Not correct. If they still perceive you through spot or they have TS there will be no target loss. Listen is bugged though, so although the enemy is still perceived the target is lost and retargetting is needed.Quote: Posted 07/28/09 18:39 (GMT) -- Calbrenar
I know when you hips people have to retarget you in melee.


STRING IN UTF8
|
0x01
|
ID
|
ID for this string
|
[u1]*
|
UTF8 characters for string
(NOT NULL terminated)
|
|
LOAD CLASS
|
0x02
|
u4
|
class serial number
(always > 0)
|
ID
|
class object ID
|
u4
|
stack trace serial number
|
ID
|
class name string ID
|
|
UNLOAD CLASS
|
0x03
|
|
STACK FRAME
|
0x04
|
ID
|
stack frame ID
|
ID
|
method name string ID
|
ID
|
method signature string ID
|
ID
|
source file name string ID
|
u4
|
class serial number
|
u4
|
> 0
|
line number
|
0
|
no line information
available
|
-1
|
unknown location
|
-2
|
compiled method (Not implemented)
|
-3
|
native method (Not implemented)
|
|
|
STACK TRACE
|
0x05
|
u4
|
stack trace serial number
|
u4
|
thread serial number
|
u4
|
number of frames
|
[ID]*
|
series of stack frame ID's
|
|
ALLOC SITES
|
0x06
|
u2
|
Bit mask flags:
0x1
|
incremental vs.
complete
|
0x2
|
sorted
by allocation vs. line
|
0x4
|
whether to force GC
(Not
Implemented)
|
|
u4
|
cutoff ratio (floating
point)
|
u4
|
total live bytes
|
u4
|
total live instances
|
u8
|
total bytes allocated
|
u8
|
total instances allocated
|
u4
|
number of sites that
follow:
u1
|
array indicator: 0
means not an array, non-zero means an array of this type (See Basic Type)
|
u4
|
class serial number
|
u4
|
stack trace serial
number
|
u4
|
number of live bytes
|
u4
|
number of live
instances
|
u4
|
number of bytes
allocated
|
u4
|
number of instances
allocated
|
|
|
HEAP SUMMARY
|
0x07
|
u4
|
total live bytes
|
u4
|
total live instances
|
u8
|
total bytes allocated
|
u8
|
total instances allocated
|
|
START THREAD
|
0x0A
|
u4
|
thread serial number
|
ID
|
thread object ID
|
u4
|
stack trace serial number
|
ID
|
thread name string ID
|
ID
|
thread group name ID
|
ID
|
thread parent group name ID
|
|
END THREAD
|
0x0B
|
|
HEAP DUMP
or
HEAP DUMP SEGMENT
|
0x0C
or
0x1C
|
Contains any number of sub-tags,
each begins a u1 field (no order implied here):
ROOT UNKNOWN
|
0xFF
|
|
ROOT JNI GLOBAL
|
0x01
|
ID
|
object ID
|
ID
|
JNI global ref ID
|
|
ROOT JNI LOCAL
|
0x02
|
ID
|
object ID
|
u4
|
thread serial number
|
u4
|
frame number in
stack trace (-1 for empty)
|
|
ROOT JAVA FRAME
|
0x03
|
ID
|
object ID
|
u4
|
thread serial number
|
u4
|
frame number in
stack trace (-1 for empty) |
|
ROOT NATIVE STACK
|
0x04
|
ID
|
object ID
|
u4
|
thread serial number
|
|
ROOT STICKY CLASS
|
0x05
|
|
ROOT THREAD BLOCK
|
0x06
|
ID
|
object ID
|
u4
|
thread serial number
|
|
ROOT MONITOR USED
|
0x07
|
|
ROOT THREAD OBJECT
|
0x08
|
ID
|
thread object ID
|
u4
|
thread serial number
|
u4
|
stack trace serial
number
|
|
CLASS DUMP
|
0x20
|
ID
|
class object ID
|
u4
|
stack trace serial
number
|
ID
|
super class object ID
|
ID
|
class loader object
ID
|
ID
|
signers object ID
|
ID
|
protection domain
object ID
|
ID
|
reserved
|
ID
|
reserved
|
u4
|
instance size (in
bytes)
|
u2
|
size of constant
pool and number of records that follow:
u2
|
constant pool
index
|
u1
|
type of entry:
(See Basic Type)
|
value
|
value of entry
(u1, u2, u4, or u8 based on type of entry)
|
|
u2
|
Number of static
fields:
ID
|
static field
name string ID
|
u1
|
type of field:
(See Basic Type)
|
value
|
value of entry
(u1, u2, u4, or u8 based on type of field)
|
|
u2
|
Number of instance
fields (not including super class's)
ID
|
field name
string ID
|
u1
|
type of field:
(See Basic Type)
|
|
|
INSTANCE DUMP
|
0x21
|
ID
|
object ID
|
u4
|
stack trace serial
number
|
ID
|
class object ID
|
u4
|
number of bytes that
follow
|
[value]*
|
instance field
values (this class, followed by super class, etc)
|
|
OBJECT ARRAY DUMP
|
0x22
|
ID
|
array object ID
|
u4
|
stack trace serial
number
|
u4
|
number of elements
|
ID
|
array class object
ID
|
[ID]*
|
elements
|
|
PRIMITIVE ARRAY DUMP
|
0x23
|
ID
|
array object ID
|
u4
|
stack trace serial
number
|
u4
|
number of elements
|
u1
|
element type (See Basic Type)
|
[u1]*
|
elements (packed
array) |
|
|
HEAP DUMP END
|
0x2C
|
Terminates a series of HEAP DUMP
SEGMENTS. Concatenation of HEAP DUMP SEGMENTS equals a HEAP DUMP.
|
CPU SAMPLES
|
0x0D
|
u4
|
total number of samples
|
u4
|
number of traces that
follow:
u4
|
number of samples
|
u4
|
stack trace serial
number
|
|
|
CONTROL SETTINGS
|
0x0E
|
u4
|
Bit mask flags:
0x1
|
alloc traces on/off
|
0x2
|
cpu sampling on/off
|
|
u2
|
stack trace depth
|
|


The snapprep
R package is used by the package author/maintainer primarily to prepare and curate data sets for downstream use in other SNAP projects and R packages. It is a developer package not made for other users in general. However, this vignette documents some of the data prep pipelines facilitated by snapprep
, which can make various types of data munging from raw/source SNAP data files to more useful, manageable and meaningful curated data sets that cater to specific projects and analysis objectives a more seamless process.
There is not much to show in terms of code, but this is the intent of snapprep
. It encapsulates the heavy lifting of procedures like climate variable probability distribution modeling in package functions and the package includes standard default options for working with source data located on the SNAP network.
First, you can generate a table of available combinations of climate models, CRU data, emissions scenarios (RCPs) and climate variables. On the Atlas cluster, you do not have to pass an explicit directory unless you want to override the default. The package knows where the standard outputs are stored. Note that in terms of outputs, you have to provide a directory. You will not have permissions to write to the default. Since this needs to be run on the Atlas cluster, this vignette cannot print the output for you here.
library(snapprep)
x <- clim_inputs_table()
x
Now you are ready to extract data from SNAP’s downscaled CMIP5 Alaska/western Canada maps collection. This will take a while to run if you are planning to process every data set (every row of x
). It will process in parallel over years using 32 CPUs on an Atlas compute node by default. The call below to clim_dist_monthly
extracts monthly data for all years from whatever climate models (plus CRU), historical period and RCPs, and climate variables (min, mean and max temperature, and precipitation) are passed via x
.
purrr::map(1:nrow(x), ~ %>% clim_dist_monthly(slice(x, .x)))
This saves .rds files containing data frames of modeled probability density functions for spatial distributions of climate variables for all these source data sets. Outputs are saved to a directory containing groups of regions. Each region group contains subdirectories of related subregions. These directories contain the .rds files.
If it is important to keep monthly files on disk rather than annual files containing all months’ data, the step above can be followed up with split_monthly_files
, which will split the original 12-month files into 12 single-month files and store the new structure in another directory.
The regions for which spatial distributions are estimated are taken from the 2-km level locations listed in snapdef()$cells_akcan1km2km
, which is made by snapprep::save_poly_cells
and itself uses common SNAP polygons that can be found in the snappoly
SNAPverse data package.
Modeling seasonal and annual temporal resolution distributions does not require revisiting the source downscaled geotiff files. That brute force approach of aggregating the source data to seasonal and annual averages would be a waste of time and effort. The sensible approach is to estimate seasonal and annual distributions from the already estimated monthly distributions. Those outputs now become your inputs. The further you get from the source data as you continue down the processing pipeline, the faster the processing will go.
clim_dist_seasonal
also uses parallel processing internally. There is a one-to-one correspondence between monthly and seasonal files. Using default arguments, it is as simple as:
It is recommended, however, to split the processing into multiple batches by using the rcp
and variable
arguments:
clim_dist_seasonal(variable = "tas", rcp = "rcp60")
The options for rcp
include historical
, rcp45
, rcp60
and rcp85
. The options for climate variable include pr
, tas
, tasmin
and tasmax
. Like the monthly outputs, now you have seasonal (and annual) climate variable distributions, stored (by default) in an adjacent directory with analogous structure.
The next step is to produce statistics from these distributions, which are useful and efficient for projects requiring specific statistics and not the need for general distributional information. The following function can be applied to both monthly and seasonal outputs. It offers internal parallel processing, again defaulting to the full 32 CPUs available on an Atlas compute node.
clim_stats_ar5(type = "monthly")
clim_stats_ar5(type = "seasonal")
The same batch processing recommendations for seasonal distributions apply to monthly and seasonal statistics. The difference is that since all statistics for a given region are intended to be stored in a single file, the optional file filter argument for smaller batch processing jobs is region_group
.
clim_stats_ar5(type = "monthly", region_group = "FMZ regions")
clim_stats_ar5(type = "seasonal", region_group = "LCC regions")
Make sure to read the documentation on these functions. You should be familiar with their arguments, including any not shown in this vignette. If you apply these functions to a large amount of data, it is also good practice to run the job in non-interactive mode via a SLURM job manager script, in case of disconnection.


- Water irrigation
- Transferring money between accounts with transfer limits
- Traffic flow in a city
- Moving electricity from production power plants to cities
Dinitz's Algorithm
Solving maxflow problems intuitively
By: Rany Tith
Graph algorithms are also just fun!
Let \(G = (V,E, c) \) be a capacited directed graph. Where we have \(c\) denote the capacity function \(c: E \rightarrow \mathbb{R}^{+}\) assigning a capacity to each edge.
The above solution tells us that there exists a flow of 19. Note that this constructed flow follows the capacity and flow constraint. This also so happens to be the max flow. And so how do we construct this flow and guarantee that it is the maximum?
\[ c_{f}(u,v) = \begin{cases} c(u,v) - f(u,v) & \text{ if } (u,v) \in E \\ 0 & \text{otherwise} \end{cases} \]
Let \(f'\) be the current flow of the graph. A blocking flow is that here is no path from source to sink in the follow graph: \[ G' = ((V, E'_{L}), s, t) \] where \[ E'=\{(u,v) : f'(u,v) < c_{f}|_{E_{L}} (u,v) \} \] Or in other words, its a graph where all the saturated edges are removed.
Input: \(G = ((V,E),c,s,t) \)
Output: A \(s-t\) path with a maximal flow
Given \(G_{f}\) we want to be able to construct the level graph.
The goal here is to given the current flow graph, give a level to each vertex if the flow on that edge is less than the capacity.
bool bfs() {
std::queue next_verts;
next_verts.push(s);
// Keeping track of distance of each vertex
level = std::vector(col_size, 0);
level[s] = 1;
while(!next_verts.empty()) {
int cur_vert = next_verts.front();
next_verts.pop();
for(unsigned int i=0; i < row_size; i++) {
// Not visited and flow is less than capacity
if (flow[cur_vert][i] < data[cur_vert][i] &&
(level[i] == 0)
) {
// Grab the current level the vert is add and every node it is connected to is + 1
level[i] = level[cur_vert] + 1;
next_verts.push(i);
}
}
}
// sink is reachable from source
return level[t] > 0;
}
Notice that there are 3 blocking flows:
Now note that the smallest capacity along these edges gives us:
This gives us in the flow for this phase to be: \[ f_{total} = f_{1} + f_{2} + f_{3} = 14 \]
int dfs(int start, int cap) {
int tmp_targ = cap;
if (start == row_size-1) {
return tmp_targ;
}
for (unsigned int i=0; i < row_size; i++) {
if (
level[i] == (level.at(start)+1) &&
flow[start][i] < data.at(start).at(i)
) {
// Grab the smallest capacity that we can find
int local_min = std::min(tmp_targ,
data.at(start).at(i) - flow.at(start).at(i));
int prop_flow = dfs(i, local_min);
flow[start][i] = flow[start][i] + prop_flow;
tmp_targ = tmp_targ - prop_flow;
}
}
return cap - tmp_targ;
}
Let us consider a single phase of Dinitz's algorithm.
First consider we have to build our level graph using BFS. During the building of the level graph it is possible that we have to visit every edge as they meet our capacity requirement and is unvisited. This gives us \(O(|E|)\) so far.Now consider our DFS to find a blocking flow which is of length \(l\). That gives us \(O(l|E|) = O(|V||E|) \) for a single phase. Now how many times is this phase done?
Proposition: There is at most \(|V| - 1\) phases of Dinitiz's algorithm.
Proof: Notice that the distance between the source and target cannot exceed the number of vertices minues one.
Thus we have in total \(O(|V|^{2}|E|)\).
Model name: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
CPU family: 6
Model: 140
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
Stepping: 1
CPU max MHz: 4200.0000
CPU min MHz: 400.0000
...
Caches (sum of all):
L1d: 192 KiB (4 instances)
L1i: 128 KiB (4 instances)
L2: 5 MiB (4 instances)
L3: 8 MiB (1 instance)
...
total used free shared buff/cache available
Mem: 31Gi 3.0Gi 23Gi 1.9Gi 4.8Gi 25Gi
Swap: 8.0Gi 0B 8.0Gi
Instead of using adjacency matrices you can use compressed sparse row matrix.
Consider: \[ \begin{pmatrix} 0 & 119 & 116 & 0 & 0 & 0 \\ 0 & 0 & 244 & 237 & 0 & 0 \\ 0 & 0 & 0 & 108 & 188 & 0 \\ 0 & 0 & 0 & 0 & 101 & 182 \\ 0 & 0 & 0 & 0 & 0 & 204 \end{pmatrix} \]
We can reduce this matrix to CSR format: \[ \text{offsets} = \begin{pmatrix} 1 & 3 & 5 & 7 & 9 & 10 & 0 \\ \end{pmatrix} \] \[ \text{end_vert} = \begin{pmatrix} 2 & 3 & 3 & 4 & 4 & 5 & 5 & 6 & 6 \end{pmatrix} \] \[ \text{weights} = \begin{pmatrix} 119 & 116 & 244 & 237 & 108 & 188 & 101 & 182 & 204 \end{pmatrix} \]Runtime:
| Size (nxn) | CSR (s) | Adj Matr. (s) |
|---|---|---|
| 5 | 2.22E-05 | 2.77E-05 |
| 100 | 0.0003850460052 | 0.006009817123 |
| 500 | 0.002076864243 | 0.5234670639 |
| 1000 | 0.004136323929 | 2.249393702 |
| 1500 | 0.006240844727 | 10.91037941 |
A dynamic tree is a data structure that contains multiple trees (forest). In particular, this data structure allows us to do the following:
findroot(v)
returns the root of the tree containing vertex v.
findcost(v)
returns a pair (w,x). x is the minimum weight on the tree path of v to findroot(v)
. w is the last vertex on the path with weight w.
addcost(v,x)
adds x to the cost of every vertex on the path v to findroot(v)
.
During depth first search when finding the blocking flow we can speed up Dinitz's algorithm by using a dynamic tree. Normally DFS will have an asymptotic runtime of \(O(|V||E|)\). However, by using a dynamic tree to reuse visited paths on \(G_{f}\) we can have a run time of \(O(|E|\log(|V|))\) for finding a blocking flow instead. This gives us a total runtime of \(O(|V||E|\log(|V|))\).
Note that we can add to the flow of our graph by using addcost(v,x)
. We can also find the portion of the blocking path by using findcost(v)
. In other words, we can start DFS until we run into a vertex that is in our dynamic tree, then use the dynamic tree to find the rest of the cost from there.
Input:
a flow network G = (V, E, c, s, t)
a feasible flow f, in G (equal to zero by default)
Initialization:
compute ∀e ∈ E: c_f(e) = c(e) - f(e);
dowhile
begin
compute ∀e ∈ V: rank(v) = dist(v,t), by BFS from t on edges with c_f > 0
in the inverse edge direction;
if ranks(s) = infinity then begin f = c - c_f; return f; end;
while DFS from s do
begin
any edge (x,y) s.t. c_f(x,y) = 0 or rank(y) != rank(x)-1 is skipped;
if (x == t) then
begin
/* P denotes current DFS path */
epsilon = min {c_f(e): e is in P};
for edges (v,u) of P, from t downto s do
begin
c_f(v,u) = c_f(v,u) - epsilon;
c_f (u,v) = = c_f(u,v) + epsilon
if c_v(u,v) = 0 then x = u;
end
end
end
end
Ask me anything (AMA)
Too long than it should have.
See above.
Yes 😀
Using amortized analysis, the proof I saw uses the potential method. Very cool stuff.


This Privacy Policy describes our policies on the collection, use, and disclosure of information about you in connection with your use of our websites, emails, and mobile applications ("Site"). The terms "we", "us", and "Touch Sweden" refer to Motion Touch Scandinavia AB, a Delaware corporation. When you use the Site, you consent to our collection, use, and disclosure of information about you as described in this Privacy Policy.
Table of Contents
Information We Collect and How We Use It
Cookies
Third Parties
Controlling Your Personal Data
Data Retention and Account Termination
Children
Security
Dispute Resolution
Jurisdiction
Modifications To This Privacy Policy
Information We Collect and How We Use It
We may store the information you submit to or through the Site, as well as information we collect in connection with your use of the Site.
We use the information to fulfill your requests, provide the Site’s functionality, improve the Site’s quality, personalize your experience, track usage of the Site, provide feedback to businesses that are listed on the Site, display relevant advertising, provide customer support, message you, back up our systems and allow for disaster recovery, enhance the security of the Site, and comply with legal obligations.
Among the information we collect, please note:
Account Information: If you create an account on Touch Sweden, we may store and use your name, email address, zip code and other information you may provide with your account, such as your gender and birth date. If you feel that an unauthorized account has been created depicting you or your likeness, you can request us its removal.
Public Content: The information that you post to the Site is intended for public consumption, including your tips, photos, check-ins, feedbacks, likes, Talk posts, bookmarks, friends, lists, compliments, and account profile. We may share it with businesses.
Contacts: You can invite your friends to join the Site by providing their contact information, or by allowing us to use your address book from your computer, mobile device, or other sites. If you invite a friend to join and connect with you on the Site, we may transmit your friend’s contact information to Touch Sweden long enough to process your requests.
Communications: When you sign up for an account, you are opting in to receive emails from other businesses, and Touch Sweden itself. You can manage your email preferences, but note that you cannot opt out of receiving certain administrative or legal notices from Touch Sweden. If you exchange messages with others through the Site, we may store them in order to process and deliver them, allow you to manage them, and investigate possible wrongdoing in connection with the Site. If you send information from the Site to your phone via SMS text message, we may log your phone number, phone carrier, and the date and time that the message was processed. Carriers may charge recipients for texts that they receive.
Transactional Information: If you make reservations or purchases through the Site, we may collect and store certain information about you to process your requests and populate forms for future transactions, such as your phone number, address, email, and credit card information. This information may be shared with third parties who help process and fulfill your requests. When you submit credit card numbers, we encrypt that information using industry standard technology. If you write reviews about businesses with which you transact through the Site, we may privately display the fact that you transacted with those businesses.
Site Activity: We may store information about your use of the Site, such as your search activity, the pages you view, the date and time of your visit, and the businesses you call using our mobile applications. We also may store information that your computer or mobile device provides to us in connection with your use of the Site, such as your browser type, type of computer or mobile device, browser language, IP address, mobile carrier, unique device identifier, location, and requested and referring URLs.
Cookies
We, and third parties with whom we partner, may use cookies, web beacons, local shared objects (sometimes called "flash cookies"), and similar technology in connection with your use of the Site and third party websites ("Cookies"). Cookies are small data files that may have unique identifiers, and reside, among other places, on your computer or mobile device, in emails we send to you, and on our web pages. Cookies may transmit information about you and your use of the Site, such as your browser type, search preferences, data relating to advertisements that have been displayed to you or that you have clicked on, and the date and time of your use. Cookies may be persistent or stored only during an individual session.
Types of Cookies used on the Site include:
Category of Use
Explanation
Processes
Intended to make the Site work in the way you expect it to. For example, we use a Cookie that tells us whether you have already signed up for an account.
Authentication, Security, and Compliance
Intended to prevent fraud, protect your data from unauthorized parties, and comply with legal requirements. For example, we use Cookies to determine if you are logged in.
Preferences
Intended to remember information about how you prefer the site to behave and look. For example, we use a Cookie that tells us whether you have declined to allow us to use your phone’s geolocation data.
Notifications
Intended to allow notice of information or options that we think could improve your use of the site. For example, we use a Cookie that allows us to stop showing you the signup notification if you have already seen it.
Advertising
Intended to make advertising more relevant to users and more valuable to advertisers. For example, we use a Cookie that tells us if you have recently clicked on an ad.
Analytics
Intended to help us understand how visitors use the Site. For example, we use a Cookie that tells us how our search suggestions correlate to your interaction with the search page.
Managing Cookies:
It may be possible to disable some (but not all) Cookies through your device or browser settings, but doing so may affect your ability to use the Site. The method for disabling cookies may vary by device and browser, but can usually be found in preferences or security settings.
We may share information about you with third parties as follows:
Advertisers: We may allow third parties to use Cookies on the Site to collect the same type of information for the same purposes as Touch Sweden does for itself. They may be able to associate the information they collect with other information they have about you from other sources. We do not necessarily have access to or control over the Cookies they use, but you may be able to opt-out of some of their practices by visiting the following links: Network Advertising Initiative, Omniture, Aperture, Digital Advertising Alliance and PrivacyChoice. Please note that opting out does not prevent the display of advertisements to you.
Service Providers: Some of the services that are offered through the Site, such as dinner reservations and food delivery, may be provided by third-party providers. We also outsource some of Touch Sweden’s functions to third-party providers, such as technical and customer support, tracking and reporting functions, quality assurance testing, payment processing functions, and other services. We may share information from or about you with these third-party providers so that they can perform their services or complete your requests.
Aggregate Information: We may share user information in the aggregate with third parties, such as advertisers and content distributors. For example, we may disclose the number of users that have been exposed to, or clicked on, advertisements.
Business Transfers: We may share information from or about you with subsidiaries, joint ventures, or other companies under common control, in which case we will require them to honor this Privacy Policy. If another company acquires Motion Touch Scandinavia AB or all or substantially all of our assets, that company will possess the same information, and will assume the rights and obligations with respect to that information as described in this Privacy Policy.
Businesses on Touch Sweden: We may share information from or about you (such as your age and gender) and your use of the Site (such as which businesses you bookmark or call) with businesses on Touch Sweden. You may adjust your settings to increase or decrease the amount of information we share.
Investigations: We may investigate and disclose information from or about you if we have a good faith belief that such investigation or disclosure is (a) reasonably necessary to comply with legal process and law enforcement instructions and orders, such as a search warrant, subpoena, statute, judicial proceeding, or other legal process served on us; (b) helpful to prevent, investigate, or identify possible wrongdoing in connection with the Site; or (c) protect our rights, reputation, property, or that of our users, affiliates, or the public.
Links: The Site may contain links to unaffiliated third party websites. Except as set forth herein, we do not share your personal information with them, and are not responsible for their privacy practices. We suggest you read the privacy policies on all such third party websites.
Facebook and Twitter: If you are logged into Facebook, and you access but are not logged into the Site, we may receive information from Facebook to make it easier for you to create an account on the Site and show you relevant content from your Facebook friends. This information personalizes your experience and helps you create a Touch Sweden account. To learn more about this feature and how to block aspects of it, please click here. You can also connect your Touch Sweden account to your accounts on third party services like Facebook or Twitter, in which case we may collect and store information identifying your account with the third party service. We use the information to help you connect and share public content with your friends and followers.
Controlling Your Personal Data
Business owners may be able to identify you, or associate you with your account if you include personal information in the content you send to them. You can reduce the risk of being personally identified by using the Site pseudonymously, though doing so could detract from the credibility of your contributions to the Site. Users can also use the Member Search feature to find businesses based on their names or email addresses.
Please also note that the messages you send or receive using the Site are only private to the extent that both you and the sender/recipient keep them private. For example, we do not have any control over whether a recipient of one of your messages publicly posts it or its contents. Similarly, Touch Sweden may also access such messages in the course of investigations relating to Site use.
You can close your account by contacting us. We will remove your posts from view and/or dissociate them from your account profile, but we may retain information about you for the purposes authorized under this Privacy Policy unless prohibited by law. For example, we may retain information to prevent, investigate, or identify possible wrongdoing in connection with the Site or to comply with legal obligations. Please note that businesses cannot remove their business listings by closing their accounts.
The Site is intended for general audiences and is not directed to children under 13. We do not knowingly collect personal information from children under 13. If you become aware that a child has provided us with personal information without parental consent, please contact us. If we become aware that a child under 13 has provided us with personal information without parental consent, we take steps to remove such information and terminate the child's account.
We follow generally accepted industry standards to protect the personal information submitted to us, both during transmission and once we receive it. However, no method of transmission over the Internet or via mobile device, or method of electronic storage, is 100% secure. Therefore, while we strive to use commercially acceptable means to protect your personal information, we cannot guarantee its absolute security.
If you believe that Touch Sweden has not adhered to this Privacy Policy you may contact us by email or write to us at the following address:
C/O FENA LUND
Scheelevägen 17
223 70 Lund
Sweden.
The information we obtain from or about you may be processed and stored in Sweden, which may provide for different data protection rules than the country in which you reside. We comply with the EU & Swiss Safe Harbor Privacy Frameworks as set forth by the United States Department of Commerce regarding the collection, use, and retention of data from the European Union and Switzerland. We will respond to requests relating to personal data within 30 days..
We may revise this Privacy Policy from time to time. If we make material changes to this Privacy Policy, we will notify you by email or by posting a notice on the Site prior to the effective date of the changes. By continuing to access or use the Site after those changes become effective, you agree to be bound by the revised Privacy Policy.