text:
package org.sidoh.song_recognition.signature;

import org.sidoh.math.Histogram;

public class SizeScorer extends HistogramScorer {
	private static final long serialVersionUID = -3264789217685915505L;

	@Override
	public double score(Histogram hist) {
		return 1.0 - 1.0/hist.getTotal();
	}

}

redpajama_set_name: RedPajamaGithub


text:
Educators/Youth Workers
About PCX
Camp LVL Up
PCX Go!
Gamers READ .5K Walk/Run/Sprint
Gamers Read .5k (500 m) Walk/Run/Sprint aimed to bring the gaming, cosplay, anime, and running communities and their families together to advocate for literacy, especially among youth in grades K-5. This event also celebrated National Video Games Day.
Literacy is a critical skill for success in society, and esports careers such as game design & development, comic book creation, shoutcasting/streaming, and eSports journalism all require welldeveloped literacy skills. Gamers Read .5k (500m) Walk/Run/Sprint was sponsored by PCX GO!, a 501(c)(3) whose mission is to prepare K-16 youth for eSports careers through informing, instructing, and educating youth around eSports career pathways. "...WHEREAS Gerald "Jerry" Lawson, the father of modern gaming, developed the Fairchild Channel F in 1976, which allowed users to insert different cartridges that allowed people to play a variety of games in their homes on a single console. This paved the way for much more elaborate systems users know and love today..."
This is an excerpt from the Proclamation issued earlier this month by the Governor of the state of Georgia proclaiming September 12th as Video Games Day in Georgia.
In collaboration with Connecting Communities and Families, Technorganics, Blue Scorpion, and Rep. Kim Schofield, Pharaoh's Conclave is proud to receive this proclamation from the Governor along with students from Cristo Rey Jesuit High School, Georgia Cyber Academy, The Wilson Academy, and the DeKalb Elementary School of the Arts.
We are ecstatic to celebrate the contributions of pioneers like Gerald Lawson and others who were instrumental in the forming and growing of video games and the video games industry. Join us as we prepare youth for careers in the esports and video gaming industries. Learn more at www.pcxnow.com.
HOW IMPORTANT IS SOCIAL MEDIA PRESENCE TO ESPORTS ...
2022 Youth Esports League: National Conference & C...
No tags has been created yet
Get in the Game!
Explore New Learning Paths & Join the Excitement at PCX!
Sign up today for one of our innovative programs for elementary, middle & high school students
Youth eSports LeagueSign Up
LVL Up Academy
Sign up for updates on what's happening around the PCX community.
Pharaoh's Market
Youth eSports League
eSports Career & Cognitive Apprenticeship Program
© 2019 Pharaoh's Conclave. All rights reserved. | Website by GoMe

redpajama_set_name: RedPajamaCommonCrawl


text:
Florida Livin' (295)
8trk (12)
Bloggin' (345)
iPod (114)
iPod Random Tracks (17)
New Yorkin' (502)
Wordsmithing (106)
PALIN CURSE'S ST. LOUIS LEGACY
Maybe they were right: Hockey and politics don't mix.
They certainly didn't a couple of weeks ago, when the Philadelphia Flyers invited Sarah Palin to drop the ceremonial first puck, and then promptly lost to the Rangers. But at least they didn't lose a starting goaltender, like the St. Louis Blues did after they hosted the Republican VP candidate in their barn last night:
Before the game, Blues goalie Manny Legace tripped on a carpet laid out for Republican vice presidential candidate Sarah Palin to drop the ceremonial first puck.
"I went to go step on the ice and the [Scottrade Center security] guy goes, 'Watch the carpet,' and he had his foot there holding it, so I figured it would be safe to step on," Legace said. "If he's holding it and I figured the other end's pretty much secure, I was just worrying about the carpet slipping [forward]. As soon as I went to step down, he took his foot off the carpet. As soon as I stepped on the carpet, the carpet just shot out and my leg kept going and my other one was still on the bench. I felt it pull right away."
Legace played the first period but the left hip flexor injury obviously affected his play. He gave up two goals on 12 shots and was replaced by St. Louis native Ben Bishop at the start of the second period.
So now, the Palin Curse has a body count. And the Blues did lose the game, 4-0. Considering that Missouri is, indeed, a swing state (why else would Palin make this pitstop?), the GOP better hope the pissed-off hockey fan demographic isn't enough to throw those Electoral College votes into the Obama column.
by Costa Tsiokos, Sat 10/25/2008 01:03:55 PM
Category: Hockey, Politics
| Permalink | Trackback |
1 Feedback »
SARAH PALIN: FROM HOCKEY MOM TO HOCKEY COMMISH?…
In the aftermath of the 2008 Presidential election, some are wondering what Sarah Palin should do with herself to maintain a national profile.
Try this on for size: Sarah Palin, National Hockey League Commissioner.
Let's do a quick rundown of th…
Trackback by Population Statistic — 11/07/2021 @ 12:05:55 PM
Email (not required)
PLEASE NOTE: Various types of comment moderation may be triggered once you hit the "Say It!" button below. Common causes for this are the inclusion of several hyperlinks and/or spam words in the comment field. Please do not hit the "Say It!" button more than once. If you feel your comment is being blocked without cause, feel free to email me about it.


text:
#2 – Home is Where the Boat Is »
#1 – Introducing the Admiral's Club
My name is Gwen. But onboard our boat Tackless II I'm known as "The Admiral." Although not bestowed on me by the US Coast Guard, the Navy, or any other military authority, my admiralty is a rank I share proudly with hundreds if not thousands of other women in the cruising fleet. Being an Admiral is not merely a pseudonym for wife, cruising companion, or female-along-for-the-ride, although it is sometimes used that way. Nor is it merely a token title bestowed on "his better half" by the often self-appointed Captain, although it is sometimes used THAT way. No, to me, an Admiral is a woman who has gotten into IT.
What is IT? I asked a bunch of women cruisers, a circle of women I think of as my Admirals' Club, what they thought "IT" was. Although each described it a little differently, it all added up to a lifestyle definition and a state of mind to go with it: one where your boat is home, your community is the world, time and initiative are your own, nature — its beauty and its force — is fundamental, and responsibilities can be placed nowhere but in your own lap.
Some Admirals have extensive sailing backgrounds. Others may have started out feeling like they were yanked from their lives ashore by a press gang. The question is, how do you get from being an uncertain — if not actually unwilling — crew to Admiral status? Like everything in life, the more you know about the lifestyle, the more secure you will feel. The more secure you feel, the more proactive you will be on board, and that's the key to being an Admiral. It will not happen overnight, and there are stages to master.
Therefore, unlike most of the stuff you read in magazines, the goal of this column will be less to whet your appetite for far off places than to address the questions and anxieties that can complicate the getting-there both for women already on their way and the "wannabees" back on the dock. Some of the questions will have to do with practical considerations and others with emotional ones. The goal is to share advice and examples, to reveal that there is no one way to do things, and to show you that, far from being alone out there, you are in fact becoming members of a community like none other.
So who, you might ask, am I to be writing this column? The most important thing you need to know about me is that I didn't grow up sailing: No salty figures in my childhood, no youth racing programs. I did take a sailing class one summer with my sister in Mallett's Bay, Vermont, but I didn't catch the bug. That didn't happen until my 30s when I went along on a bareboat trip to the Virgin Islands. Talk about a change-your-life experience! Instantly, it seemed, I fell in love with the islands, life of the water, and, after my first reef dive, scuba-diving. Five years later, I left behind a "normal" life in New York City and, armed with a scuba instructor's ticket, found myself a job on a live-aboard dive boat.
That was the real beginning. I lucked into a terrific mentor and an opportunity to learn very quickly a lot of stuff I'd never given a thought: general seamanship, navigation, mechanics! Some two years later I went on my way with a captain's license, and that "way" led to a CSY 44 cutter named Whisper. Whisper was the boat broker's perfect answer to my request for "a boat I could charter (but afford not to charter), that could teach me to be a good sailor but could someday take me around the world." She was everything I'd asked for, and together she and I and various crew ran some 250 dive/sail charters over the next eight years.
It sounds so smooth and calculated, squeezed into black and white, but in fact there were momentous turning points, giant leaps of nerve all along the way. What cheek it seemed to go for my scuba instructor's certification in the first place, to go from neophyte to teacher! How bold to call myself Captain and let people pay me to take them on vacation! And the stuff I learned to do! From fixing heads to engine work to preparing three gourmet meals a day! Finally, seven years ago, I closed that successful business, sold my boat and joined forces with a fellow charter captain — a handsome guy with a sister-ship to Whisper — to sail away from the Virgins, my home for twelve years, on an open-ended cruise to the world…Wow, lots of gambles in one package!
Mine is not the typical resume of a cruising Admiral. But then again, I don't think there is a typical resume. Every Admiral I know has a different story. In the next months, as I address subjects that concern women cruisers, I will include input from other Admirals whose views will sometimes be the same and sometimes different. In this way, you'll be sure to collect lots of helpful information to smooth your way ….and at the same time, (and maybe even better yet) you'll get to know a lot of the neat cruising women out there who make up our Admirals Club!
This article was published in the October 2006 issue of Latitudes and Attitudes
Tags: Admirals |
1 comment to #1 – Introducing the Admiral's Club
Elizabeth Cover
I just saw your 2006 posting courtesy of a sailing friend. My husband, John, and I are very active sailors/cruisers. He owned a CSY 44 #263 he thinks, sailed it from New Jersey to Trellis Bay, Tortola fall of 1998 and lived there thru the winter. His retirement gift to himself! I joined his life and crew in 2004 when we moved to Florida. Skinny water here so we had a 30 Hunter Cherubini followed by our present Watkins 33 which we just accepted an offer on today so we can buy a Pearson 365 Ketch. "J" has always wanted a ketch and the 365 will allow us to extend our cruise area beyond the Keys and Bahamas. Look forward to other articles. "Admiral El"


For those of you who haven't had a chance to check us out with our new all star rhythm section...well...this is another chance. More chances to follow. O Frontera is an amazing act that we're thrilled to have on board for the show, and we've got the ever-artful Gillian Stone opening up the night. Doors 8 pm, $10.


text:
World Data - Page 8
Counts of Te Reo speakers of Maori descent by Meshblock
This dataset contains counts of people of Maori descent by the official language indicator from the 2013 Census. The data is presented at meshblock level and uses the 2013 Census boundaries. The variables provided are as follows:
Number of Maori Descent who speak te reo Maori
Number of Maori Descent who do not speak te reo Maori (includes no language)
This dataset allows for the comparison across areas to determine the strength or otherwise of te reo Maori language for people of Maori descent.
Confidentiality rules have been applied to all cells in this table, including randomly rounding to base 3.
Unrounded counts of less than 6 have been confidentialised.
Individual figures may not add up to totals, and values for the same data may vary in different tables.
-999 indicates cells have been suppressed for confidentiality reasons
Territorial Authority 2018 Clipped (generalised)
This dataset is the definitive set of annually released territorial authority boundaries at 1 January 2018, clipped to the coastline. This clipped version has been created for map creation/cartographic purposes and may not fully represent the official full extent boundaries. A territorial authority is defined under the Local Government Act 2002 as a city or a district council. Territorial authorities are the second tier of local government in New Zealand, below regional councils.
Digital boundary data became freely available on 1 July 2007. This generalised version has been simplified for rapid drawing and is designed for thematic or web mapping purposes.
For further information see ANZLIC Metadata 2018 Territorial Authority attachment below.
Area Unit 2016 Generalised Version
Area Unit 2016 Generalised Version is the definitive set of area unit boundaries for 2016 as defined by Statistics New Zealand.
Meshblock boundaries 2013
This dataset was first added to Stats NZ Geographic Data Service on 20 Oct 2016.
This is the release of the annually released meshblock pattern as at 1 January 2013. This dataset is the definitive set of meshblock boundaries for 2003 as defined by Statistics New Zealand.
Statistics New Zealand maintains an annual meshblock pattern for the collection and production of statistical data, allowing data to be compared over time. A meshblock is the smallest geographic unit for which statistical data is collected and processed by Statistics New Zealand. A meshblock is defined by a geographic area, which can vary in size from part of a city block to a large area of rural land. Each meshblock abuts against another to form a network covering all of New Zealand, including coasts and inlets and extending out to the 200 mile economic zone. Meshblocks are added together to build up larger geographic areas such as area units and urban areas. They are also used to define electoral districts, territorial authorities and regional councils.
Regional Council 2018 (generalised)
This dataset is the definitive set of the annually released regional council boundaries at 1 January 2018 as defined by the regional council and/or Local Government Commission and maintained by Stats NZ. Regional council is the top tier of local government in New Zealand. Regional councils are defined at meshblock, statistical area 1 (SA1), and statistical area 2 (SA2) levels.
For further information see ANZLIC Metadata 2018 Regional Council attachment below.
Regional council 2015_V1_00 Clipped
This dataset was first added to Stats NZ Geographic Data Service on 26 Jul 2017.
This is the definitive set of regional council boundaries for 2015 as defined by the Local Government Commission and/or regional councils themselves but maintained by Statistics New Zealand (the custodian) as at 1 January 2006.
The regional council is the top tier of local government in New Zealand. There are 16 regional councils in New Zealand (defined by Part 1 of Schedule 2 of the Local Government Act 2002). Eleven are governed by an elected regional council, while five are governed by territorial authorities (the second tier of local government) who also perform the functions of a regional council and are known as unitary authorities. These unitary authorities are Nelson City Council, and Gisborne, Tasman, and Marlborough District Councils. The Chatham Islands Council also performs some of the functions of a regional council, but is not strictly a unitary authority. Unitary authorities act as regional councils for the purposes of a wide range of legislative purposes. Regional councils are responsible for the administration of many environmental and transport matters such as land transport planning and harbour navigation and safety.
Regional Councils were established in 1989 after the abolition of the 22 local government regions. The Local Government Act 2002 requires the boundaries of regions to conform, as far as possible, to one or more water catchments. When determining regional boundaries, the Local Government Commission gave consideration to regional communities of interest when selecting which water catchments to include in a region. It also considered factors such as natural resource management, land use planning and environmental matters. Some regional council boundaries are coterminous with territorial authority boundaries but there are several exceptions. An example is Taupo District, which is geographically split between four regions, although most of its area falls within the Waikato Region. Where territorial local authorities straddle regional council boundaries, the affected area is statistically defined by complete area units. In general, however, regional councils contain complete territorial authorities.
The seaward boundary of any coastal regional council is the twelve mile New Zealand territorial limit.
Meshblock 2020 (generalised)
This dataset was last updated on Stats NZ Geographic Data Service on 02 Feb 2020.
This dataset is the definitive set of annually released meshblock boundaries for 2020 as defined by Stats NZ. This version contains 53,596 meshblocks.
Stats NZ maintains an annual meshblock geography for collecting and producing statistical data. This allows data to be compared over time. A meshblock is the smallest geographic unit for which statistical data is collected and processed by Stats NZ. A meshblock is defined by a geographic area, which can vary in size from part of a city block to a large area of rural land. Each meshblock borders on another to form a network covering all of New Zealand, including coasts and inlets and extending out to the 200-mile economic zone. Meshblocks are added together to build up larger geographic areas such as statistical area 1 (SA1), statistical area 2 (SA2), and urban rural. They are also used to define electoral districts, territorial authorities, and regional councils.
The following 16 meshblocks are outside the 12 mile limit and are not held in digitised form: 0016901, 0016902, 1588000, 3166401, 3166402, 3166600, 3166710, 3166711, 3195000, 3196001, 3196002, 3196003, 3196004, 3196005, 3196006, 3196007.
The meshblock classification can also be downloaded from the Stats NZ classification and concordance tool Ariā.
This dataset was last updated on Stats NZ Geographic Data Service on 17 May 2018.
Statistical Area 2 2018 (Centroid True) is the true centroid point layer for the major released version of the annually released statistical area 2 (SA2) boundaries for 2018. The "true" centroid is the centre of mass of that polygon, such that if some flat substance of uniform thickness and density were cut into the shape of that polygon, then that object would balance at the centroid. The centroid is a useful way of summarizing the location of a set of polygons as points, particularly when used for comparative analysis. Note that the centroid could potentially fall outside the SA2 polygon, depending on the shape of the polygon.The dataset contains the EASTING and NORTHING attributes of the centroid point in NZGD2000 New Zealand Transverse Mercator (EPSG:2193) and LATITUDE and LONGITUDE of the centroid point in decimal degrees in WGS1984 (EPSG:4326) projection. Non-digitised meshblocks cannot have a centroid.
Please note that a review of SA2 names was undertaken in early 2018. The review addressed issues with inconsistent naming and applied corrections, resulting in an update to this dataset applied in May 2018. All SA2 codes are unchanged.
Ward 2018 (generalised)
This dataset is the definitive set of ward boundaries 1 January 2018 as defined by the territorial authorities and/or Local Government Commission, and maintained by Stats NZ.Wards are defined under the Local Electoral Act 2001 and result from dividing a territorial authority for electoral purposes. Wards are defined at meshblock level.
For further information see ANZLIC Metadata 2018 Ward attachment below.


text:
We are proud to work with over 100 top speakers from around the globe who are leaders in their field of knowledge. At each meeting the speaker, chosen by your Chairman, will share their expertise and provide tangible takeaways for you to implement immediately to take you or your business to the next level, making you an even better version of yourself.
Generation differences
Influence and persuasion
Learning with a difference
Recruitment and induction
Situational leadership
Organisational Devp and Strategy
Mergers/acquisitions/exit
Purpose, vision and values
Personal visions and legacies
Spirituality and soul
Sales, Service and Marketing
Selling and negotiating
The big pitch
The Economy and Finance
Finance for non-financial
Making sense of the numbers – P&L, balance sheets
For 16 years Sharon had a successful career as a Criminal Barrister at multi award winning sets of Chambers. Find Out More
Michael Trigg
Michael Trigg is the Presentation Maestro. Find Out More
Andy Lopata
Labelled 'Mr Network' by The Sun, Andy Lopata was called one of Europe's leading business networking strategists by the Financial Times. Find Out More
Ken Allison
Ken is a business orientated human resource and employment law consultant specialising in boosting individual and organisational performance by enabling managers and directors to act with confidence when tackling issues that may present potential legal problems. Find Out More
Rohan Narse
Formerly an investment banker with Goldman Sachs, and later CEO Founder of an investment advisory company, Rohan now hosts deeply experiential, multi-sensory and practical programmes on mindfulness and integrative healing in the UK. Find Out More
Jeff Grout
Jeff Grout is a successful business consultant specialising in leadership, people management, team building, peak performance, recruitment and retention issues. Find Out More
Lee is a Motivational Speaker, Presentation Coach and author of twelve books. Find Out More
Chris is an expert in marketing and branding principles and disciplines. Find Out More
Simon Clarkson
An economics graduate from Leeds University, Simon traded commodities for Barclays before moving upstairs to work as an Investment Banker. Find Out More
Lesley Matile
Lesley is one of a handful of coaches accredited at Master Practitioner level by the European Mentoring and Coaching Council. Find Out More
Daniel Ludevig
Born in the US and currently based in Berlin, Daniel Ludevig has explored his love for the art of communication while living and working in France, Morocco, New York, Phnom Penh and Boston. Find Out More
Cris Beswick
Strategic Advisor on Innovation and Author of 'Building a Culture of Innovation' Originally trained as a product & industrial designer, Cris spent over a decade as a successful entrepreneur & CEO building an award-winning design group. Find Out More
Giles Miskin
Giles works with leadership teams in public, private and charity sectors around the world on programmes improving leadership skills and team-working. Find Out More
Mike Ferguson is a business psychologist and has spent almost 30 years studying 'successful' people and the ways in which they achieved it. Find Out More
Mark Fritz
When was the last time you washed a rental car? Probably never!…You don't own it. Find Out More
John has particular capabilities in the areas of Stress Management, Resilience, Coaching, Counselling Skills for Managers, Transactional Analysis, Team Development and Coaching Supervision. Find Out More
Louis Parsons
Louis Parsons works with high-level executives to unleash the creative energy within them and their company. Find Out More
Simon Hartley
Simon is passionate about helping individuals and organisations to maximise their performance, realise their potential and work towards becoming world class in their chosen field. Find Out More
Paul Sloane
Paul Sloane is an entertaining, thought-provoking, motivational speaker and a recognized expert on lateral thinking, innovation, crowdsourcing and leadership. Find Out More
David Hyner
David Hyner is a multi-award winning professional speaker, researcher, entrepreneur, broadcaster, author and facilitator. Find Out More
Jeremy Thorn
Jeremy Thorn's passion is for developing great organisations and their people. Find Out More
Alex Alley and Paula Reid
Alex Alley and Paula Reid successfully gel the extreme experience of the Global Challenge round-the-world yacht race with powerful leadership scenarios and lessons. Find Out More
John Cremer
John brings a unique twist to the Academy. Find Out More
César Gamio
Under the personal training and guidance of Dr. Find Out More
With over 25 years' experience in professional and executive recruitment, Larry's thought-provoking and entertaining workshops are filled with practical and easy to implement ideas and insights, aimed at challenging outdated hiring practices and perceptions and equipping delegates with the tools and techniques they need to attract and retain the right people. Find Out More
Jeremy Nicholas
Jeremy is an award winning TV and radio presenter who has been broadcasting since 1986. Find Out More
Jo Haigh
Jo has bought and sold over 400 companies in the last 27 years, specialising in owner managed companies. Find Out More
Nikki Owen
Nikki Owen is an international thought-leader, award winning speaker and bestselling author on Charisma. Find Out More
Steve Houghton-Burnett
Steve has nearly 25 years experience running businesses with the last 10 years delivering change by leading large programme and project environments. Find Out More
Pete Wilkinson
Pete is massively passionate about professional people achieving their potential and spends his time in his business supporting Chief Executives and Managing Directors in a range of businesses from small Micro Businesses up to £130m Engineering Businesses. Find Out More
Michael Dodd inspires business leaders to take their communications skills to new levels. Find Out More
David Smith has 34 years Corporate experience of change management, the last 15 years of which were spent in the turnaround of the Asda Retail Business. Find Out More
Simon Hazeldine
Simon Hazeldine is in demand as a facilitator, keynote speaker and consultant in the areas of leadership, performance and persuasion. Find Out More
John Dabrowski
John is a qualified NLP practitioner and NLP coach – he has a particular gift in teaching visualisation and inner voice techniques which access the subconscious to help create the future people really want. Find Out More
Celynn Morin
A registered dietician, Celynn Morin is not just a walking, living, breathing example of her proven philosophies. Find Out More
Phil Ives
Phil supports a broad range of owner/managers and business leaders around the world in many different sectors – all of whom are serious about change, and restless to drive their organisations forward quickly. Find Out More
Arti Halai
Arti Halai is a television presenter, reporter and producer with more than fifteen years experience in the media industry. Find Out More
Patrick Lucocq
Patrick founded his first manufacturing business in 1993, and sold it to a corporate body in 2001. Find Out More
David promotes creativity and innovation, providing local networks (Ideas Centres) of like-minded organisations to develop competence in facilitation of creativity through his workshops. Find Out More
David Thomas is an international speaker with vast experience who has spoken more than 300 times to CEO groups worldwide over the last 13 years. Find Out More
John Hotowka
The real reason John Hotowka is in demand as a speaker and magician is not because he's observant, insightful and funny but because of the way he communicates his message so the audience takes action. Find Out More
Andy Hanselman
Andy Hanselman helps businesses, their leaders and their people create competitive advantage by 'Thinking in 3D'! That means being 'Dramatically and Demonstrably Different'! As a recognised expert on business competitiveness, he has spent over 25 years researching, working with, and learning from, successful fast growth businesses. Find Out More
Steve Head is a full time Keynote speaker, inspirational trainer, coach and author. Find Out More
https://chiefexecutive.com/specialism/leadership/


Gadzooks! Is that a giant tentacle menacing the Roebling bridge in Cincinnati? Thrill your friends with this 11 x 17 inch digital print.
"Many obstacles confronted architect John A. Roebling when he was contracted to build what was, at the time, the longest suspension bridge in the world over the Ohio River in 1866. Most significant was the vocal community opposition to the project, as many feared that no bridge could span the length of the river or be strong enough to survive attacks by "Clancy," the Ohio River Octopus. In fact, the bridge proved more than capable of withstanding the stresses of construction, and Roebling befriended Clancy, with the many tentacled beast keeping watch over bridge well into the 20th century."


text:
CONCEPT AFENET CORPS OF DISEASE DETECTIVES (ACoDD) CONCEPT
Public health emergencies of national and international concern, expose the fragility of our emergency response systems and demonstrate the need for countries to be prepared and have the capacity to rapidly respond to outbreaks and other emergencies to maintain national and global health security.
The Global Health Security Agenda (GHSA), launched in February 2014, is a partnership of countries from around the world, and is designed to measurably address global vulnerability to the public health threats, strengthen systems, and ensure that a trained workforce has the tools needed to prevent, detect, and respond rapidly and effectively to infectious disease threats. And, stopping an outbreak at its source, whether naturally occurring, deliberate, or accidental, requires close collaboration among the health, animal, agriculture, defense, security, development, and other sectors.
The 2014 Ebola epidemic revealed major weaknesses in the global capability for addressing biologic threats, claimed more than 11,000 lives, cost billions in economic losses, and posed an unprecedented threat to regional stability in West Africa – with the majority of cases in three adjacent West African countries: Guinea, Liberia, and Sierra Leone. As Ebola ravaged the region and weakened the already fragile health systems in these countries, the world was reminded that all countries need GHSA capabilities – safe, secure, and strong laboratories; a well-trained workforce; multi-sectoral collaboration; reliable and sensitive real-time disease surveillance systems; and a command structure to coordinate an effective and focused response. A massive and costly global emergency response was required to gain control of the epidemic in West Africa and to prevent the outbreak from taking root in other countries.
Graduates from the African FETPs have jointly responded to several outbreaks including polio monkey pox, Lassa fever, Rift Valley Fever, Meningitis, Yellow Fever, anthrax, cholera, dengue, malaria and measles; and conducted studies on priority health issues including HIV, non-communicable diseases, maternal-child health, and injuries, among many others. These examples highlight the effective joint projects and programs that have already helped countries protect their citizens from infectious diseases. U.S. government agencies and global partners are continuing to provide technical assistance and support in Africa to advance the Global Health Security Agenda (GHSA) vision of a safe and secure world.
In light of that, and the increase in emerging and re-emerging pandemics, AFENET is establishing a team of disease detectives "AFENET Corps of Disease Detectives" in line with the GHSA action packages 3 & 5 to ensure maximum and efficient utilization of the well trained workforce from both the Frontline and the two year FETP. It will also foster collaboration with African MoHs as well as the established relationships with other agencies.
During the AFENET biennial regional scientific conference in Tanzania 2011 and Abuja, August 2016, the African Ministers of Health unanimously agreed that AFENET in collaboration with relevant stakeholders continues to lead efforts in building capacity for the public health workforce in Africa through FELTPs.
Because of its already existing programs and networks of epidemiologists across Africa, AFENET is well positioned to implement and manage ACoDD which will initially be structured to utilize AFENET platform (as a pilot) and eventually opened up to other agencies and organizations.
Establishing the AFENET Corps of Disease Detectives (ACoDD) will provide opportunity for AFENET FE(L)TPs graduates to collaborate and also redefine the Africa Health Security Strategy.
Previous Article Ghana FETP holds first workshop for Cohort X Frontline trainees
Next Article Strategies to Strengthen National Public Health Institutes in Africa


text:
05 August 2021 Blogs, Academic, Librarian, Faculty
ProQuest One Business is "Sleek and Intuitive," says Charleston Advisor
The industry's newest business resource ranks 4.75 out of 5 in a new review
Charleston Advisor, a renowned source of reviews for information databases and digital resources, has rated ProQuest One Business 4.75 out of 5 in a newly published review.
"The ProQuest One Business interface is sleek and intuitive," writes librarian Kaci Resau. "Searchability and manipulation of the search functions are easy. The widgets are helpful and intuitive and connect users to related and relevant content."
She adds, "the variety of content users have access to in one product is remarkable."
ProQuest One Business is a comprehensive solution designed to support the unique teaching and learning needs of business faculty and students. The resource delivers a mix of multi-format content in an interface that helps business students build the research skills and confidence they'll need for courses and careers. It's already in use at academic libraries around the world.
Charleston Advisor evaluates resources on four key factors: content, user interface and searchability, pricing, and purchase or contract options. ProQuest One Business ranked 4.5 out of 5 or higher in each category (pricing, which varies by institution, was rated N/A).
In her review, Resau also writes about several features that distinguish ProQuest One Business:
Videos: "A key feature of the video content is the scrolling transcript that appears beside the media file."
Company profile pages: "For undergraduate students or students new to business, the company profile pages are extremely useful."
Overall fit for purpose: "A one-stop shop for content with robust SWOT analysis, videos, and business profiles…"
"ProQuest One Business was designed with direct feedback from students, faculty and librarians to meet the unique needs of business programs," said Jo-Anne Hogan, Director of Product Management at ProQuest. "The feedback from our customers has been overwhelmingly positive so far, and we're honored that the Charleston Advisor and many of our users are finding value in its wealth of content and intuitive interface."
Read the full Charleston Advisor review (download the PDF or HTML version).
Interested in exploring ProQuest One Business? Learn more or request a demo.


text:
package com.linkedin.thirdeye.anomalydetection.function;

import com.linkedin.thirdeye.anomalydetection.context.AnomalyDetectionContext;
import com.linkedin.thirdeye.anomalydetection.context.TimeSeries;
import com.linkedin.thirdeye.anomalydetection.context.TimeSeriesKey;
import com.linkedin.thirdeye.anomalydetection.model.detection.SimpleThresholdDetectionModel;
import com.linkedin.thirdeye.anomalydetection.model.transform.MovingAverageSmoothingFunction;
import com.linkedin.thirdeye.anomalydetection.model.transform.TotalCountThresholdRemovalFunction;
import com.linkedin.thirdeye.api.DimensionMap;
import com.linkedin.thirdeye.datalayer.dto.AnomalyFunctionDTO;
import com.linkedin.thirdeye.datalayer.dto.MergedAnomalyResultDTO;
import com.linkedin.thirdeye.datalayer.dto.RawAnomalyResultDTO;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.joda.time.Interval;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestWeekOverWeekRuleFunction {
  private final static double EPSILON = 0.00001d;

  private final static long oneWeekInMillis = TimeUnit.DAYS.toMillis(7);
  private final static long bucketMillis = TimeUnit.SECONDS.toMillis(1);
  private final static long observedStartTime = 1000 + oneWeekInMillis * 2;
  private final static long baseline1StartTime = 1000 + oneWeekInMillis;
  private final static long baseline2StartTime = 1000;

  private final static String mainMetric = "testMetric";

  @DataProvider(name = "timeSeriesDataProvider")
  public Object[][] timeSeriesDataProvider() {
    // The properties for the testing time series
    Properties properties = new Properties();
    long bucketSizeInMS = TimeUnit.SECONDS.toMillis(1);

    // Set up time series key for the testing time series
    TimeSeriesKey timeSeriesKey = new TimeSeriesKey();
    String metric = mainMetric;
    timeSeriesKey.setMetricName(metric);
    DimensionMap dimensionMap = new DimensionMap();
    dimensionMap.put("dimensionName1", "dimensionValue1");
    dimensionMap.put("dimensionName2", "dimensionValue2");
    timeSeriesKey.setDimensionMap(dimensionMap);

    TimeSeries observedTimeSeries = new TimeSeries();
    {
      observedTimeSeries.set(observedStartTime, 10d);
      observedTimeSeries.set(observedStartTime + bucketMillis, 15d);
      observedTimeSeries.set(observedStartTime + bucketMillis * 2, 13d);
      observedTimeSeries.set(observedStartTime + bucketMillis * 3, 27d);
      observedTimeSeries.set(observedStartTime + bucketMillis * 4, 10d);
      Interval observedTimeSeriesInterval =
          new Interval(observedStartTime, observedStartTime + bucketMillis * 5);
      observedTimeSeries.setTimeSeriesInterval(observedTimeSeriesInterval);
    }

    List<TimeSeries> baselines = new ArrayList<>();
    TimeSeries baseline1TimeSeries = new TimeSeries();
    {
      baseline1TimeSeries.set(baseline1StartTime, 10d);
      baseline1TimeSeries.set(baseline1StartTime + bucketMillis, 20d);
      baseline1TimeSeries.set(baseline1StartTime + bucketMillis * 2, 15d);
      baseline1TimeSeries.set(baseline1StartTime + bucketMillis * 3, 24d);
      baseline1TimeSeries.set(baseline1StartTime + bucketMillis * 4, 14d);
      Interval baseline1Interval = new Interval(baseline1StartTime, baseline1StartTime + bucketMillis * 5);
      baseline1TimeSeries.setTimeSeriesInterval(baseline1Interval);
    }
    baselines.add(baseline1TimeSeries);

    TimeSeries baseline2TimeSeries = new TimeSeries();
    {
      baseline2TimeSeries.set(baseline2StartTime, 10d);
      baseline2TimeSeries.set(baseline2StartTime + bucketMillis, 10d);
      baseline2TimeSeries.set(baseline2StartTime + bucketMillis * 2, 5d);
      baseline2TimeSeries.set(baseline2StartTime + bucketMillis * 3, 20d);
      baseline2TimeSeries.set(baseline2StartTime + bucketMillis * 4, 10d);
      Interval baseline2Interval = new Interval(baseline2StartTime, baseline2StartTime + bucketMillis * 5);
      baseline2TimeSeries.setTimeSeriesInterval(baseline2Interval);
    }
    baselines.add(baseline2TimeSeries);

    return new Object[][] { {properties, timeSeriesKey, bucketSizeInMS, observedTimeSeries, baselines} };
  }

  @Test(dataProvider = "timeSeriesDataProvider") public void analyzeWoW(
      Properties properties, TimeSeriesKey timeSeriesKey, long bucketSizeInMs,
      TimeSeries observedTimeSeries, List<TimeSeries> baselines) throws Exception {

    AnomalyDetectionContext anomalyDetectionContext = new AnomalyDetectionContext();
    anomalyDetectionContext.setBucketSizeInMS(bucketSizeInMs);

    // Append properties for anomaly function specific setting
    properties.put(WeekOverWeekRuleFunction.BASELINE, "w/w");
    properties.put(SimpleThresholdDetectionModel.CHANGE_THRESHOLD, "-0.2");

    // Create anomaly function spec
    AnomalyFunctionDTO functionSpec = new AnomalyFunctionDTO();
    functionSpec.setMetric(mainMetric);
    functionSpec.setProperties(toString(properties));

    WeekOverWeekRuleFunction function = new WeekOverWeekRuleFunction();
    function.init(functionSpec);
    anomalyDetectionContext.setAnomalyDetectionFunction(function);
    anomalyDetectionContext.setCurrent(mainMetric, observedTimeSeries);
    List<TimeSeries> singleBaseline = new ArrayList<>();
    singleBaseline.add(baselines.get(0));
    anomalyDetectionContext.setBaselines(mainMetric, singleBaseline);
    anomalyDetectionContext.setTimeSeriesKey(timeSeriesKey);

    List<RawAnomalyResultDTO> rawAnomalyResults = function.analyze(anomalyDetectionContext);
    compareWoWRawAnomalies(rawAnomalyResults);

    // Test data model
    List<Interval> expectedDataRanges = new ArrayList<>();
    expectedDataRanges.add(new Interval(observedStartTime, observedStartTime + bucketMillis * 5));
    expectedDataRanges.add(new Interval(observedStartTime - oneWeekInMillis,
        observedStartTime + bucketMillis * 5 - oneWeekInMillis));

    List<Interval> actualDataRanges = function.getDataModel()
        .getAllDataIntervals(observedStartTime, observedStartTime + bucketMillis * 5);
    Assert.assertEquals(actualDataRanges, expectedDataRanges);
  }

  @Test(dataProvider = "timeSeriesDataProvider") public void analyzeWo2WAvg(
      Properties properties, TimeSeriesKey timeSeriesKey, long bucketSizeInMs,
      TimeSeries observedTimeSeries, List<TimeSeries> baselines) throws Exception {
    // Expected RawAnomalies without smoothing
    List<RawAnomalyResultDTO> expectedRawAnomalies = new ArrayList<>();
    RawAnomalyResultDTO rawAnomaly1 = new RawAnomalyResultDTO();
    rawAnomaly1.setStartTime(observedStartTime + bucketMillis * 2);
    rawAnomaly1.setEndTime(observedStartTime + bucketMillis * 3);
    rawAnomaly1.setWeight(0.3d);
    rawAnomaly1.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly1);

    RawAnomalyResultDTO rawAnomaly2 = new RawAnomalyResultDTO();
    rawAnomaly2.setStartTime(observedStartTime + bucketMillis * 3);
    rawAnomaly2.setEndTime(observedStartTime + bucketMillis * 4);
    rawAnomaly2.setWeight(0.22727272727272727);
    rawAnomaly2.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly2);

    AnomalyDetectionContext anomalyDetectionContext = new AnomalyDetectionContext();
    anomalyDetectionContext.setBucketSizeInMS(bucketSizeInMs);

    // Append properties for anomaly function specific setting
    properties.put(WeekOverWeekRuleFunction.BASELINE, "w/2wAvg");
    properties.put(SimpleThresholdDetectionModel.CHANGE_THRESHOLD, "0.2");

    // Create anomaly function spec
    AnomalyFunctionDTO functionSpec = new AnomalyFunctionDTO();
    functionSpec.setMetric(mainMetric);
    functionSpec.setProperties(toString(properties));

    WeekOverWeekRuleFunction function = new WeekOverWeekRuleFunction();
    function.init(functionSpec);
    anomalyDetectionContext.setAnomalyDetectionFunction(function);
    anomalyDetectionContext.setCurrent(mainMetric, observedTimeSeries);
    anomalyDetectionContext.setBaselines(mainMetric, baselines);
    anomalyDetectionContext.setTimeSeriesKey(timeSeriesKey);

    List<RawAnomalyResultDTO> rawAnomalyResults = function.analyze(anomalyDetectionContext);
    compareWo2WAvgRawAnomalies(rawAnomalyResults);

    // Test data model
    List<Interval> expectedDataRanges = new ArrayList<>();
    expectedDataRanges.add(new Interval(observedStartTime, observedStartTime + bucketMillis * 5));
    expectedDataRanges.add(new Interval(observedStartTime - oneWeekInMillis,
        observedStartTime + bucketMillis * 5 - oneWeekInMillis));
    expectedDataRanges.add(new Interval(observedStartTime - oneWeekInMillis * 2,
        observedStartTime + bucketMillis * 5 - oneWeekInMillis * 2));

    List<Interval> actualDataRanges = function.getDataModel()
        .getAllDataIntervals(observedStartTime, observedStartTime + bucketMillis * 5);
    Assert.assertEquals(actualDataRanges, expectedDataRanges);
  }

  @Test(dataProvider = "timeSeriesDataProvider") public void analyzeWo2WAvgSmoothedTimeSeries(
      Properties properties, TimeSeriesKey timeSeriesKey, long bucketSizeInMs,
      TimeSeries observedTimeSeries, List<TimeSeries> baselines) throws Exception {
    AnomalyDetectionContext anomalyDetectionContext = new AnomalyDetectionContext();
    anomalyDetectionContext.setBucketSizeInMS(bucketSizeInMs);

    // Append properties for anomaly function specific setting
    properties.put(WeekOverWeekRuleFunction.BASELINE, "w/2wAvg");
    properties.put(SimpleThresholdDetectionModel.CHANGE_THRESHOLD, "0.2");
    properties.put(WeekOverWeekRuleFunction.ENABLE_SMOOTHING, "true");
    properties.put(MovingAverageSmoothingFunction.MOVING_AVERAGE_SMOOTHING_WINDOW_SIZE, "3");

    // Create anomaly function spec
    AnomalyFunctionDTO functionSpec = new AnomalyFunctionDTO();
    functionSpec.setMetric(mainMetric);
    functionSpec.setProperties(toString(properties));

    WeekOverWeekRuleFunction function = new WeekOverWeekRuleFunction();
    function.init(functionSpec);
    anomalyDetectionContext.setAnomalyDetectionFunction(function);
    anomalyDetectionContext.setCurrent(mainMetric, observedTimeSeries);
    anomalyDetectionContext.setBaselines(mainMetric, baselines);
    anomalyDetectionContext.setTimeSeriesKey(timeSeriesKey);

    List<RawAnomalyResultDTO> rawAnomalyResults = function.analyze(anomalyDetectionContext);
    // The transformed observed time series is resized from 5 to 3 due to moving average algorithm
    Assert.assertEquals(anomalyDetectionContext.getTransformedCurrent(mainMetric).size(), 3);
    // No anomalies after smoothing the time series
    Assert.assertEquals(rawAnomalyResults.size(), 0);
  }

  @Test(dataProvider = "timeSeriesDataProvider") public void recomputeMergedAnomalyWeight(
      Properties properties, TimeSeriesKey timeSeriesKey, long bucketSizeInMs,
      TimeSeries observedTimeSeries, List<TimeSeries> baselines) throws Exception {
    // Expected RawAnomalies without smoothing
    List<RawAnomalyResultDTO> expectedRawAnomalies = new ArrayList<>();
    RawAnomalyResultDTO rawAnomaly1 = new RawAnomalyResultDTO();
    rawAnomaly1.setStartTime(observedStartTime + bucketMillis * 2);
    rawAnomaly1.setEndTime(observedStartTime + bucketMillis * 3);
    rawAnomaly1.setWeight(0.3d);
    rawAnomaly1.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly1);

    RawAnomalyResultDTO rawAnomaly2 = new RawAnomalyResultDTO();
    rawAnomaly2.setStartTime(observedStartTime + bucketMillis * 3);
    rawAnomaly2.setEndTime(observedStartTime + bucketMillis * 4);
    rawAnomaly2.setWeight(0.22727272727272727);
    rawAnomaly2.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly2);

    AnomalyDetectionContext anomalyDetectionContext = new AnomalyDetectionContext();
    anomalyDetectionContext.setBucketSizeInMS(bucketSizeInMs);

    // Append properties for anomaly function specific setting
    properties.put(WeekOverWeekRuleFunction.BASELINE, "w/2wAvg");
    properties.put(SimpleThresholdDetectionModel.CHANGE_THRESHOLD, "0.2");

    // Create anomaly function spec
    AnomalyFunctionDTO functionSpec = new AnomalyFunctionDTO();
    functionSpec.setMetric(mainMetric);
    functionSpec.setProperties(toString(properties));

    WeekOverWeekRuleFunction function = new WeekOverWeekRuleFunction();
    function.init(functionSpec);
    anomalyDetectionContext.setAnomalyDetectionFunction(function);
    anomalyDetectionContext.setCurrent(mainMetric, observedTimeSeries);
    anomalyDetectionContext.setBaselines(mainMetric, baselines);
    anomalyDetectionContext.setTimeSeriesKey(timeSeriesKey);

    MergedAnomalyResultDTO mergedAnomaly = new MergedAnomalyResultDTO();
    mergedAnomaly.setStartTime(expectedRawAnomalies.get(0).getStartTime());
    mergedAnomaly.setEndTime(expectedRawAnomalies.get(1).getEndTime());
    mergedAnomaly.setAnomalyResults(expectedRawAnomalies);

    function.updateMergedAnomalyInfo(anomalyDetectionContext, mergedAnomaly);

    // Test weight; weight is the percentage change between the sums of observed values and
    // expected values, respectively. Note that expected values are generated by the trained model,
    // which takes as input one or many baseline time series.
    final long oneWeekInMillis = TimeUnit.DAYS.toMillis(7);
    double observedTotal = 0d;
    double baselineTotal = 0d;
    int bucketCount = 0;
    Interval interval = new Interval(mergedAnomaly.getStartTime(), mergedAnomaly.getEndTime());
    TimeSeries observedTS = anomalyDetectionContext.getTransformedCurrent(mainMetric);
    List<TimeSeries> baselineTSs = anomalyDetectionContext.getTransformedBaselines(mainMetric);
    for (long timestamp : observedTS.timestampSet()) {
      if (interval.contains(timestamp)) {
        ++bucketCount;
        observedTotal += observedTS.get(timestamp);
        for (int i = 0; i < baselineTSs.size(); ++i) {
          TimeSeries baselineTS = baselineTSs.get(i);
          long baseTimeStamp = timestamp - oneWeekInMillis * (i + 1);
          baselineTotal += baselineTS.get(baseTimeStamp);
        }
      }
    }
    baselineTotal /= baselineTSs.size();

    // Compare anomaly weight, avg. current, avg. baseline, score, etc
    double expectedWeight = (observedTotal - baselineTotal) / baselineTotal;
    Assert.assertEquals(mergedAnomaly.getWeight(), expectedWeight, EPSILON);

    double avgCurrent = observedTotal / bucketCount;
    Assert.assertEquals(mergedAnomaly.getAvgCurrentVal(), avgCurrent, EPSILON);

    double avgBaseline = baselineTotal / bucketCount;
    Assert.assertEquals(mergedAnomaly.getAvgBaselineVal(), avgBaseline, EPSILON);

    // Test Score; score is the average of all raw anomalies' score
    double expectedScore = 0d;
    for (RawAnomalyResultDTO rawAnomaly : expectedRawAnomalies) {
      expectedScore += rawAnomaly.getScore();
    }
    expectedScore /= expectedRawAnomalies.size();
    Assert.assertEquals(mergedAnomaly.getScore(), expectedScore, EPSILON);
  }

  @Test(dataProvider = "timeSeriesDataProvider") public void testTotalCountThresholdFunction(
      Properties properties, TimeSeriesKey timeSeriesKey, long bucketSizeInMs,
      TimeSeries observedTimeSeries, List<TimeSeries> baselines) throws Exception {
    AnomalyDetectionContext anomalyDetectionContext = new AnomalyDetectionContext();
    anomalyDetectionContext.setBucketSizeInMS(bucketSizeInMs);

    // Append properties for anomaly function specific setting
    String totalCountTimeSeriesName = "totalCount";
    TimeSeries totalCountTimeSeries = new TimeSeries();
    {
      totalCountTimeSeries.set(observedStartTime, 10d);
      totalCountTimeSeries.set(observedStartTime + bucketMillis, 10d);
      totalCountTimeSeries.set(observedStartTime + bucketMillis * 2, 10d);
      totalCountTimeSeries.set(observedStartTime + bucketMillis * 3, 10d);
      totalCountTimeSeries.set(observedStartTime + bucketMillis * 4, 10d);
      Interval totalCountTimeSeriesInterval =
          new Interval(observedStartTime, observedStartTime + bucketMillis * 5);
      totalCountTimeSeries.setTimeSeriesInterval(totalCountTimeSeriesInterval);
    }
    properties.put(TotalCountThresholdRemovalFunction.TOTAL_COUNT_METRIC_NAME, totalCountTimeSeriesName);
    properties.put(TotalCountThresholdRemovalFunction.TOTAL_COUNT_THRESHOLD, "51");

    properties.put(WeekOverWeekRuleFunction.BASELINE, "w/2wAvg");
    properties.put(SimpleThresholdDetectionModel.CHANGE_THRESHOLD, "0.2");

    // Create anomaly function spec
    AnomalyFunctionDTO functionSpec = new AnomalyFunctionDTO();
    functionSpec.setMetric(mainMetric);
    functionSpec.setProperties(toString(properties));

    // Create anomalyDetectionContext using anomaly function spec
    WeekOverWeekRuleFunction function = new WeekOverWeekRuleFunction();
    function.init(functionSpec);
    anomalyDetectionContext.setAnomalyDetectionFunction(function);
    anomalyDetectionContext.setCurrent(mainMetric, observedTimeSeries);
    anomalyDetectionContext.setBaselines(mainMetric, baselines);
    anomalyDetectionContext.setTimeSeriesKey(timeSeriesKey);
    anomalyDetectionContext.setCurrent(totalCountTimeSeriesName, totalCountTimeSeries);

    List<RawAnomalyResultDTO> rawAnomalyResults = function.analyze(anomalyDetectionContext);
    // No anomalies after smoothing the time series
    Assert.assertEquals(rawAnomalyResults.size(), 0);

    // Test disabled total count by lowering the threshold
    anomalyDetectionContext = new AnomalyDetectionContext();
    anomalyDetectionContext.setBucketSizeInMS(bucketSizeInMs);

    properties.put(TotalCountThresholdRemovalFunction.TOTAL_COUNT_THRESHOLD, "0");
    // Create anomaly function spec
    functionSpec = new AnomalyFunctionDTO();
    functionSpec.setMetric(mainMetric);
    functionSpec.setProperties(toString(properties));
    function = new WeekOverWeekRuleFunction();
    function.init(functionSpec);

    anomalyDetectionContext.setAnomalyDetectionFunction(function);
    anomalyDetectionContext.setCurrent(mainMetric, observedTimeSeries);
    anomalyDetectionContext.setBaselines(mainMetric, baselines);
    anomalyDetectionContext.setTimeSeriesKey(timeSeriesKey);
    anomalyDetectionContext.setCurrent(totalCountTimeSeriesName, totalCountTimeSeries);

    rawAnomalyResults = function.analyze(anomalyDetectionContext);
    compareWo2WAvgRawAnomalies(rawAnomalyResults);
  }

  @Test
  public void testParseWowString() {
    String testString = "w/w";
    Assert.assertEquals(WeekOverWeekRuleFunction.parseWowString(testString), "1");

    testString = "Wo4W";
    Assert.assertEquals(WeekOverWeekRuleFunction.parseWowString(testString), "4");

    testString = "W/243wABCD";
    Assert.assertEquals(WeekOverWeekRuleFunction.parseWowString(testString), "243");

    testString = "2abc";
    Assert.assertEquals(WeekOverWeekRuleFunction.parseWowString(testString), "2");

    testString = "W/243";
    Assert.assertEquals(WeekOverWeekRuleFunction.parseWowString(testString), "243");

    testString = "A Random string 34 and it is 54 a long one";
    Assert.assertEquals(WeekOverWeekRuleFunction.parseWowString(testString), "34");
  }

  public static String toString(Properties properties) {
    if (properties != null && properties.size() != 0) {
      List<String> propertyEntry = new ArrayList<>();
      StringBuilder sb = new StringBuilder();
      Set<Object> keys = properties.keySet();
      for (Object key : keys) {
        sb.append((String) key).append("=").append((String) properties.get(key));
        propertyEntry.add(sb.toString());
        sb.setLength(0);
      }
      return StringUtils.join(propertyEntry, ";");
    }
    return "";
  }

  private void compareWo2WAvgRawAnomalies(List<RawAnomalyResultDTO> actualAnomalyResults) {
    // Expecting the same anomaly result from analyzeWo2WAvg
    List<RawAnomalyResultDTO> expectedRawAnomalies = new ArrayList<>();
    RawAnomalyResultDTO rawAnomaly1 = new RawAnomalyResultDTO();
    rawAnomaly1.setStartTime(observedStartTime + bucketMillis * 2);
    rawAnomaly1.setEndTime(observedStartTime + bucketMillis * 3);
    rawAnomaly1.setWeight(0.3d);
    rawAnomaly1.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly1);

    RawAnomalyResultDTO rawAnomaly2 = new RawAnomalyResultDTO();
    rawAnomaly2.setStartTime(observedStartTime + bucketMillis * 3);
    rawAnomaly2.setEndTime(observedStartTime + bucketMillis * 4);
    rawAnomaly2.setWeight(0.22727272727272727);
    rawAnomaly2.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly2);

    compareActualAndExpectedRawAnomalies(actualAnomalyResults, expectedRawAnomalies);
  }

  private void compareWoWRawAnomalies(List<RawAnomalyResultDTO> actualAnomalyResults) {
    // Expected RawAnomalies of WoW without smoothing
    List<RawAnomalyResultDTO> expectedRawAnomalies = new ArrayList<>();
    RawAnomalyResultDTO rawAnomaly1 = new RawAnomalyResultDTO();
    rawAnomaly1.setStartTime(observedStartTime + bucketMillis);
    rawAnomaly1.setEndTime(observedStartTime + bucketMillis * 2);
    rawAnomaly1.setWeight(-0.25d);
    rawAnomaly1.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly1);

    RawAnomalyResultDTO rawAnomaly2 = new RawAnomalyResultDTO();
    rawAnomaly2.setStartTime(observedStartTime + bucketMillis * 4);
    rawAnomaly2.setEndTime(observedStartTime + bucketMillis * 5);
    rawAnomaly2.setWeight(-0.2857142857d);
    rawAnomaly2.setScore(15d);
    expectedRawAnomalies.add(rawAnomaly2);

    compareActualAndExpectedRawAnomalies(actualAnomalyResults, expectedRawAnomalies);
  }

  private void compareActualAndExpectedRawAnomalies(List<RawAnomalyResultDTO> actualAnomalyResults,
      List<RawAnomalyResultDTO> expectedRawAnomalies) {
    Assert.assertEquals(actualAnomalyResults.size(), expectedRawAnomalies.size());
    for (int i = 0; i < actualAnomalyResults.size(); ++i) {
      RawAnomalyResultDTO actualAnomaly = actualAnomalyResults.get(i);
      RawAnomalyResultDTO expectedAnomaly = actualAnomalyResults.get(i);
      Assert.assertEquals(actualAnomaly.getWeight(), expectedAnomaly.getWeight(), EPSILON);
      Assert.assertEquals(actualAnomaly.getScore(), expectedAnomaly.getScore(), EPSILON);
    }
  }
}


With Christmas just around the corner and many of you yet to finish your Christmas shopping I thought I'd share this fantastic partnership to help spread the word on how you can give back this Christmas and give every child the chance to play and learn as sadly, not all children have the same opportunities.
Fisher-Price have teamed up with Save the Children to help change the lives of the most disadvantaged children in the UK with a new partnership that aims to give every child the chance to play and learn. From 2nd November to 24th December 2016 £1 from the sale of 16 different toys from the Fisher-Price Laugh & Learn range, sold at Argos, will be donated to Save the Children.
The money raised will help to provide some of the poorest families in the UK vital household items such as beds, cookers, books and toys to help children grow, learn and play. This will help give families the opportunity to create a positive home environment, reducing the family stress associated with poverty and helping ensure children can develop healthily. It's a vital part of Save the Children's work to give every child the best start in life.
We were recently sent the ABC learning centre from the Fisher-Price Laugh and Learn range to try out. The ABC learning centre is a colourful interactive play panel which is built to grow with your toddler. Harry will be two next month so is on the first stage which is learn. This introduces your toddler to letters, shapes, colours, animals, objects and more. Harry already knows a lot of his colours, shapes, objects animals as well as some letters so as well as the first stage we have been using the toy in the levels 2 and 3 which are engage and imagine.
Harry loves playing with the ABC learning centre and will quite happily sit on his own and press all of the buttons, repeating the words and moving the hands on the clock which then plays a song which he absolutely loves dancing to. There a few other songs on it too which he can't resist dancing to every time they play. Even Amelia who is 4 likes playing with it and shows Harry the letters on the buttons.
You can find out which toys from the Fisher-Price Laugh and Learn range are included in the Save the Children campaign available at Argos. They are all clearly marked with the Save the Children symbol. So if you're still looking at doing some Christmas shopping then I'd highly recommend choosing something from the Fisher-Price Laugh and Learn range as not only buying a great education toy for a child this Christmas you'll also be helping support a fantastic organisation!
What a lovely campaign. Blake loves his fisher price toys and this learning centre looks fab.
That is such a nice gesture. The toy looks brilliant.
Thats a nice campaign, and they do make great toys for little kids too.
My eldest daughter is of similar age to your little one and I think this is a great educational toy as well as helping a great cause.


There are the main benefits from the full lace wigs give and lace front wigs because that is they cover your hair loss. Hence, wigs are the very helpful for move away hairline and the whole hair loss. The correct type of wig will create your top look filled of hair. There are some online websites are offering on the black Friday lace front wigs which are giving the most excellent lace fronts for the people who would like to cover their retreating hairline although the filled laces are helpful for the those people who leave hairless on the backside and on the top.


text:
The Visual Power of Berkley's Romance Novel Cover Designs Recognized by Refinery29
Refinery29 recently posted How These Instagrammable Book Covers Are Tricking People Into Reading Romance by Elena Nicolaou, an article that explores the visual power of cover design on such romance novels as Jasmine Guillory's THE WEDDING DATE, Helen Hoang's THE KISS QUOTIENT and Alexa Martin's INTERCEPTED. Nicolaou notes that these books (as well as several other titles mentioned) "have three crucial elements in common. First, they're novelized takes on cinematic rom-com, in which the lovers' banter is just as memorable as their sex scenes. Second, they're sold as trade paperbacks, which are physically wider and more expensive than mass market romance novels. Finally, they're published by Berkley."
"THE KISS QUOTIENT started me on a romance kick," said Morgan Hoit, a 24-year-old assistant to a Broadway producer and an avid bookstagrammer. Since finishing Hoang's book, Hoit has read three more romances (with conventional covers), and sent THE KISS QUOTIENT to two friends. Emily Feldmesser, a 24-year-old living in D.C, agrees. After reading THE KISS QUOTIENT, Feldmesser told Refinery29 she was excited to explore the genre more. "It's a nice way to escape from the world, and it's quite different from my usual reading choices," Feldmesser said.
"I think the packaging is helping people who normally wouldn't pick up a romance novel pick one up," said Entertainment Weekly writer Maureen Lenker. "People want to be seen a certain way. We're careful of how we are perceived. What we read is part of that."
Erin Galloway, deputy director of publicity at Berkley, told Refinery29: "We knew THE WEDDING DATE was a contemporary romance that traditional romance readers would enjoy, but it also had qualities that we knew a reader who wouldn't classify themselves or identify themselves as a romance reader enjoy, too. What do you do with that? You have to give it a cover that's going to appeal to your core audience but will also say to women that wouldn't pick up a clinch cover, this is for you, too."
To read the complete Refinery29 article, click here.