Personal data of individual users of AUTOLINE Service shall be processed by Linemedia FZC, an entity registered under the laws of the United Arab Emirates, address: P.O. Box 50797, ELOB of. No E-97F-09, Sharjah (hereinafter, the Company). The Company is the owner of AUTOLINE User Personal Data Base.
Linemedia FZC incorporated and acting under the laws of the United Arab Emirates located at P.O. Box 50797, ELOB of. No E-97F-09, Sharjah, is an administrator of AUTOLINE User Personal Data Base.
This Privacy Policy describes the procedure established by the Company for processing of personal data collected through the Websites and related services and tools enabling Users to register on the Website, to post or to view posted ads in a real-time mode, to use another AUTOLINE Service related to the above. In all these cases, the Company shall process users' personal data solely to the extent required by the Law of United Arab Emirates "On Personal Data Protection" and the Convention for the Protection of Individuals with regard to Automatic Processing of Personal Data. This Privacy Policy was developed in accordance with the provisions of these documents.
By using the Website and/or any other related services AUTOLINE, the User gives his/her consent to the Company for processing of his/her personal data, such as User's name; region of residence, e-mail address, telephone number and other User's contact details; IP addresses and other users' communication data; messages, letters, and applications submitted to the User by other users and vice versa, and gives his/her consent to the transfer of his/her personal data to third parties including the transfer of personal data abroad in any third country subject to this Privacy Policy and the AUTOLINE User Services Agreement.
Users should be aware that by clicking links available on the Website, they may be redirected to Websites (software applications, etc.) of other companies outside the Company's hosting space where Users' information is collected beyond the Company's control. In this case, the Privacy Policy of third party websites and/or software applications shall apply to the processing of information obtained from users by such third parties.
INFORMATION COLLECTED, RECEIVED AND POSTED BY THE COMPANY
Account information: When the User creates an account on the Website, the Company may require certain information, such as a valid e-mail address and a password. The account may include user information such as geographical location, full name, telephone number, and related details, including photos which can be uploaded by the User to his/her account. The account allows users to communicate with each other in order to express interest in their offers. Users are responsible for all information published by them in public accounts. The user should carefully consider all risks associated with making certain information, such as address or his/her exact location, publicly available. If the user decides to enter the Website using a third-party operator authentication service, for example, Facebook information, the Company may get his/her additional profile or other details, access to which is provided by such third party.
Ads and transactions: As part of website operation, the Company may post information, including personal and contact details, required for transactions between a buyer and a seller, so users could send messages, communicate with each other and make payments. All information required for the publication of ads is required to create an account. Users are responsible for all information posted on the website. The user should carefully consider all risks associated with making certain information, such as address or any other personal details, publicly available.
Customer service: When Users contact the customer service, the Company may, as a part of website operation, collect personal information to satisfy User's request and provide feedback if appropriate. The Company may also contact the User, using the contact information available in his/her current account provided for that purpose. The Company may also collect other information about communication with the User, such as all User's requests to the customer service or any feedback provided.
Website: The Company may automatically receive and record on its servers the information from user's browser or any other device, including his/her IP-address, software and hardware details, pages hit by the User, mobile identifiers, information about how to use the application and/or information about other devices or system-level information. This may occur on the Website or third party services. For more information about how users can control and/or block such collection please refer to section 6 of this Policy.
Enclosed information: The Company may also add information lawfully obtained from its business partners or third parties to the Company's existing data about their users. Information not collected and not processed by the Company: The Company neither collects nor processes personal data on racial or ethnic origin, political, religious or philosophical beliefs, membership in political parties and trade unions, and similar information.
IP ADDRESS, COOKIES AND MOBILE IDENTIFIERS
As a part of website operation, the Company may collect certain information by using technologies such as cookies, pixels, and a local store (in your browser or mobile device).
COOKIES are small text files that store information directly on a user's computer, mobile phone or other device.
Pixels are small digital images, elements of codes on web pages, which allow another server to measure web page viewability and are often used in conjunction with cookies. The code tracks if and when (and on what page) pixel is downloaded to indicate that the user interacts with the page or part of a page of the Website.
The Company may allow third parties, such as providers of promotional and/or analytical services, to collect information directly on the web page of the Website using these technologies. The data they collect are protected according to the privacy policy of such third parties.
USE OF PERSONAL DATA
In order to provide its services, the Company may use information which the Company collects and uploads for the following purposes:
provision of services to Users, including creating and managing User accounts, addressing technical issues, and accessing various functions;
adaptation of offers and experience, including advertising on its services or third party services;
control of User general and individual activities, such as keyword searches, ad placements and transactions, and Website traffic control;
communication with the User, including service issues, customer service or authorized marketing communications through any available communication channels;
research and analytic activities in order to improve our service; and
compliance of AUTOLINE Services with the User Agreement, including prevention of fraud and abuse.
The Company may store information that it collects and receives through the Website as long as it is required for the above-mentioned business purposes.
INFORMATION EXCHANGE
The Company may share information it collects with affiliates located in any third country. These companies may only process and use personal data for the purposes specified in section 4 of this Privacy Policy. In this case, the data transmitted are subject to this Privacy Policy.
The Company does not transmit users' personal information to non-affiliated parties unless otherwise is specifically authorized by Users.
The Company may use third-party service providers to provide certain elements of its services. In such cases, such providers are not authorized to use personal data obtained using the Company's Website and such personal data are subject to this Privacy Policy.
The Company reserves the right to exchange information with individuals and public authorities in accordance with legal requirements for the following purposes:
protection from fraud and abusive practice on the Website;
investigations into alleged violations of law or any other alleged violations of the AUTOLINE services User Agreement by Users.
The Company may provide users' personal data upon request of competent authorities provided such requests are submitted in accordance with legal requirements.
In accordance with our Privacy Policy, the Company undertakes not to rent or sell any User's personal data. In the event that the Company's business or a part thereof is sold or reorganized, and the Company transfers all or substantially all its assets to a new owner, users' personal data may be transferred to the buyer to ensure continuity of Website servicing.
The Company may share certain anonymized information (data that does not allow to identify individual users) to third party service providers, trusted partners or authorized researchers to better understand what kind of advertising or services may be of interest to Users, to improve the overall quality and efficiency of Website services or servicing, or to make a contribution to the research which the Company believes can bring good social benefits.
In the event of transfer of personal data as described in Section 5 of this Privacy Policy, users may be informed thereof at Company's discretion.
USER CONTROL
Access, Correction and Removal: Users, who have created an account and placed ads on the Website, may get access to, correct or delete the information they provide. The User is responsible for accuracy of the data submitted or ads posted on the Website.
Cookies: Most major PC (desktop) and mobile web browsers (e.g., Safari, Firefox, Internet Explorer, Chrome, and Opera) offer controls that allow users to restrict or block Cookies on your systems. Please note that disabling Cookies in respect to the first category (visited websites) domains and other domains (sites related to visited websites) can, in some cases, limit functionality of such websites.
Other rights of Users in connection with the processing of their personal data by the Company:
to know the location of personal data base containing AUTOLINE user personal data, designation and name of such database, location of personal data owner and administrators or to give the respective instructions about how persons authorized by Website users may obtain this information unless otherwise required by the law;
to receive information about the conditions of access to personal data, including information about third parties to which personal data of Website users are transmitted;
to have access to their personal data;
to receive the response whether his/her personal data is processed and to receive details on the content of such personal data within thirty calendar days from the date of the respective request, except for cases provided for by law;
to submit a reasonable request to the personal data owner with the objection to processing of personal data;
to submit a reasonable request to amend or destruct personal data by the personal data owner and/or administrator if such data is processed illegally or is untrue;
to have personal data protected against unlawful processing and accidental loss, destruction, damage due to willful concealment, non-provision or untimely provision of information, as well as to be protected against information that is unreliable or discrediting the honor, dignity and business reputation;
to lodge complaints with regard to personal data processing to state authorities and officials, empowered to ensure personal data protection or to a court;
to apply remedies in case of violation of personal data protection laws;
to withdraw consent to personal data processing;
to know the mechanism of the automatic personal data processing;
SECURITY
All information collected by the Company is protected, within reasonable limits, by technical means and security procedures to prevent unauthorized access to or use of data. Company's affiliates, reliable partners and third party service providers undertake to use the information received from the Company in accordance with our security requirements and this Privacy Policy.
AMENDMENTS TO THIS POLICY
The Company may update this Privacy Policy from time to time, and the new version of the Privacy Policy shall enter into force the day it is uploaded in the Internet at the address specified in this paragraph, unless otherwise provided for by such updated Privacy Policy.
In the event the Company makes any changes in the Privacy Policy and the User disagree with such changes, the User shall stop using the Website services. Continued use of the Website confirms User's acceptance of the respective version of the Privacy Policy.


23
The LORD Is My Shepherd
A PSALM OF DAVID.
1 The LORD is my shepherd; I shall not want.
2 He makes me lie down in green pastures.
He leads me beside still waters.
3 He restores my soul.


Even those this is becming less and less of a problem, some devices or browsers may not support WebGL. Here is how to check if it is supported and display a warning to the user if it is not.
In order to detect webgl compatibility and gracefully inform the user you can add https://github.com/mrdoob/three.js/blob/master/examples/js/Detector.js to your javascript and use this example to avoid even attempting to render anything:
if (Detector.webgl) {
init();
animate();
} else {
var warning = Detector.getWebGLErrorMessage();
document.getElementById('container').appendChild(warning);
}


Zone leader: access to your page
You are not connected. You can login by clicking the icon in the upper left corner to login with your JudgeApps account.


Classes | |
| struct | windings |
Public Types | |
| typedef windings | state_type |
Public Member Functions | |
| bool | operator() (const segment< const PS > &s, state_type &state) const |
Is tested for points ON border, more tests have to be done.
More efficient (less comparisons and no divison) than the cross count algorithm
| typedef windings geometry::strategy::within::winding< P, PS >::state_type |
| bool geometry::strategy::within::winding< P, PS >::operator() | ( | const segment< const PS > & | s, | |
| state_type & | state | |||
| ) | const |
|
October 14, 2008 |
Copyright © 1995-2008 Barend Gehrels, Geodan Holding B.V. Amsterdam, the Netherlands Copyright © 2008 Bruno Lalande, Paris, France |


CrimPapers
Articles published on 19 December 2018
On 19 December 2018, 14 new articles were published in 10 journals.
The Core‐10 in Screening For Current Mental Health Problems and Severe Mental Illness in Prisoners by Gwen O'Connor,
reg Morris
Are College-Educated Police Officers Different? A Study of Stops, Searches, and Arrests by Richard Rosenfeld, Thaddeus L. Johnson, Richard Wright
An Examination of the Effects on Crime of Switching Off Street Lighting by Matthew W Davies, David P Farrington
New Innovations – Need For New Law Enforcement Capabilities: by Kristina Doda, Aleksandar Vanchoski
Selling Sex As An Edgework: Risk Taking and Thrills in China’s Commercial Sex Industry by Eileen Yuk-Ha Tsang
Advancing An Integrated Theory of Sexual Minority Alcohol-Related Intimate Partner Violence Perpetration
The Change Up Project: Using Social Norming Theory With Young People to Address Domestic Abuse and Promote Healthy Relationships
Sexual Revictimization in College Women: Mediational Analyses Testing Hypothesized Mechanisms For Sexual Coercion and Sexual Assault by Alyssa L. Norris, Kate B. Carey, Robyn L. Shepardson, Michael P. Carey
Police Use of Body Worn Cameras by Erick Laming
Switching On, Switching Off: Reflections of A Practitioner Researcher Examining the Operational Behaviour of Police Officers by Ross Hendy
Research and Analysis: Technical Paper to Accompany the ‘the Uk’s Future Skills-Based Immigration System’ Economic Appraisal: Annex B by HM Government
Research and Analysis: Tier 4 Pilot Evaluation by HM Government
The Role of Land Use and Walkability in Predicting Crime Patterns: A Spatiotemporal Analysis of Miami-Dade County Neighborhoods, 2007–2015
Perception of Police Legitimacy Among Private Security Officers


Pattern Matching
Pattern matching is a little strange at first, so we're going to ease into it slowly...
There are two aspects to pattern matching: patterns, which you write, and matching, which is what Pyke does with your patterns.
In a nutshell, patterns are made up of two fundamental building blocks:
- Literal patterns.
- Theses are just data values that only match themselves.
- Pattern variables.
- These will match anything. (Including other pattern variables, as we'll see later)!
And one compound pattern:
- Tuple patterns.
- These match -- you guessed it! -- tuples!
We'll examine all of the above looking at how Pyke matches a pattern to data. Then we'll expand this to cover matching two patterns together.
And finally, a pathological question to see if you've been paying attention.
Sound like fun? Good! Let's get started!
OK, so why do we need patterns? The simple answer is that we need patterns to generalize statements. One example is to turn statements into questions.
Important
- When you want a direct statement, such as to state a fact, you just use data for its arguments.
- But when you want a generalized statement, such as to ask a question, you use patterns for its arguments.


| Level | Operators | Meaning | Associativity |
|---|---|---|---|
| 1 | f(a), a[k]
| function application, subscript | left |
| 2 | a^b
| power | right |
| 3 | -a, ~a
| negation, complement | right |
| 4 | a*b, a/b,
| multiplication, division, integer division, modulo | left |
| 5 | a+b, a-b
| addition, subtraction | left |
| 6 | a>>b, a<<b
| right shift, left shift | left |
| 7 | a&b
| bitwise and | left |
| 8 | a|b, a$b
| bitwise or, bitwise exclusive or | left |
| 9 | a..b
| range | left |
| 10 | a<b, a>b,
| less than, greater than, less than or equal to, greater than or equal to | left |
| 11 | a==b, a!=b
| equal to, not equal to, is the same object as, is not the same object as, membership, type membership | left |
| 12 | not a
| logical negation | right |
| 13 | a and b
| conjunction | left |
| 14 | a or b
| disjunction | left |
| 15 | a if c else b
| conditional expression | right |
| Keyword | Meaning |
|---|---|
and | logical operator |
assert | assert a logical expression |
begin | a code block |
break | leave a loop |
catch | catch an exception |
continue | jump to the begin of a loop |
do | separates a condition from a loop body |
elif | else if |
else | else case |
end | end of a statement |
false | literal of a logical value |
for | for loop statement |
global | declare a variable to be global |
goto | jump statement |
if | conditional statement |
in | membership operator |
is | is-the-same-object-as operator |
label | jump label |
null | literal of the null object |
not | logical operator |
or | logical operator |
raise | raise an exception |
return | return from a subroutine |
sub | subroutine |
table | literal of a table object |
then | separates a condition from conditional statments |
true | literal of a logical value |
try | exception handling may occur |
use | import a module |
while | while loop statement |
yield | return from a coroutine |


Grand Master Meldina:
Why have you come to me?
Ah, the one you seek has already departed with the information. Why are you looking for him?
What did you ask?


App
App is a movie starring Hannah Hoekstra, Isis Cabolet, and Robert de Hoog. A young psychology student is drawn into the dark and fearful world of a diabolic and mysterious App that starts to terrorize her, distributing compromising...


| Path: | README.rdoc |
| Last Update: | 2009-12-06 16:03:41 +0100 |
Robotstxt is an Ruby robots.txt file parser.
Robotstxt Parser allows you to the check the accessibility of URLs and get other data.
Full support for the robots.txt RFC, wildcards and Sitemap: rules.
This library is intended to be installed via the RubyGems system.
$ gem install robotstxt
You might need administrator privileges on your system to install it.
| Author: | Simone Rinzivillo
|
Copyright © 2009 Simone Rinzivillo, Robotstxt is released under the MIT license.


Drug*
Medication list
| Drug Name | Dose | Quantity | Days Supply | Date Filled | Calculated MME |
|---|
Total MME:
Clinical assessment:
*There is no completely safe opioid dose, and this calculator does not substitute for clinical judgment. Use caution when prescribing opioids at any dosage, and prescribe the lowest effective dose.*
[1] Opioid conversion factors sourced from CDC.
Instructions:
There are 2 ways to add a med to the medication list to calculate MME:
- add med button
- save med button (must be logged in)


A new property development has recently appeared near where I live. It's a block of flats called Marnie Court, so I suspect all the residents will be deranged blonde kleptomaniacs who try to suppress memories of having murdered a sailor when they were tiny tots.
I do like the idea of naming blocks of flats after Hitchcock films. Wouldn't you love to live in Psycho House, Rich And Strange Villas, Spellbound Court, Notorious Buildings, Torn Curtain Court, or Frenzy Flats?


Combining years of experience, we were born to transform needs or opportunities in digital cross-media experience, focusing on real audience engagement, developing results unimaginable before.
Our goal is to be the arm of technology and innovation marketing teams and agencies, in order to enrich the brainstorm and put into practice ideas and actions barred by the complexity and lack of resources.
We assist our partners in developing mobile, interactive actions with kinect, arduino and processing. We use technologies PHP, Python and Ruby to deliver a quality project and agile.
We are a digital projects producer, focused on deliver solutions in a simple, fast and easy way.
We deliver mobile projects using the main technologies available, through tools as PhoneGAP and Titanium or even native developing as Objective C.
We connect a digital action to real world, allowing an engagement action by creating a "like" on Facebook or capturing people movements.
Work on agile development methods such as Scrum and XP to deliver high quality projects in expected due date.
We work with PHP, Python and Ruby implementing projects such as: corporate portals, landing pages, e-commerce and hotsites, allowing an web action focused on results.
We develop applications focused on touch platforms such as TV, showcases, floors and tablets.
With SDKs support for games, we produce advergames for web, smartphones and tablets.
Our head office is in Campinas/SP but we attend to customers around the entire Sao Paulo state. Our HQ address:
Orozimbo Maia Avenue, 590, 15th floor.
CAMPINAS - SP, Zip code: 13010-211.
We understand that your project is real complex for a form filling contact, call us or send an email and we will get in contact:
+55 19 2517-2028 ou<EMAIL_ADDRESS>LIKE: facebook.com/dlabdigital FOLLOW: twitter.com/dlabdigital Google+
Let's have a chat? Click and call us:
+55 19 2517-2028
You can also send an email to:
<EMAIL_ADDRESS>Our HQ is located in Campinas - SP:
Orozimbo Maia Avenue, 590, 15th floor - Zip code 13010-211.


"The Gift"
Annie Wilson lives in the small Southern town of Blixton, Georgia, with her three sons. The young widow has a knack for psychic vision and is called upon by certain of the town folk to give readings, explain the past and predict the future. Her talent is sorely tested when a rich socialite disappears and Annie is called in by the police to help find the missing heiress in Sam Raimi's "The Gift."
Director Raimi has had a most rewarding and eclectic career since his breakthrough "Evil Dead" films. He has created stylish films like "The Quick and the Dead," "A Simple Plan" and the sometimes beautiful "For Love of the Game," always putting a different spin on each work. He continues this track record with "The Gift," a supernatural thriller that is a showcase for its star, Blanchett.
The story, by Billy Bob Thornton and Tom Epperson, is a middling entry for Raimi that is, disappointingly, a conventional whodunit coupled with supernatural power. Annie has psychic powers that allow her to help the various members of Brixton society who have come to depend on the gifted woman.
Her steady stream of troubled clients includes Valerie (Hilary Swank), a badly abused woman who comes to Annie for help but refuses to follow the psychic's advice to leave her violent husband, Donnie (Keanu Reeves). Donnie, a real redneck's redneck, declares Annie a witch working for the devil and threatens her and her boys with violence if she continues interfering in his life. Another patron, the simple but very troubled Buddy (Giovanni Ribisi), seems to be collapsing within himself over childhood abuse by his father, but may hold the key to later events.
The crux of this southern Gothic yarn is the disappearance of society girl Jennifer King (Katie Holmes). Jennifer is high school principle Wayne Collins' fiancée, but Annie soon learns the young woman has a promiscuous and selfish streak, catching her in flagrante delicto at one point. When Jennifer disappears one night, her frantic father begs Annie to use her power to find his daughter. The visions she has lead to the arrest, conveniently, of Donnie, sending the wife beater to prison for murder and out of Annie's life.
This is where the convention of the story replaces imagination. From here on in, doubt is raised as to Donnie's guilt and one suspect after another start to come out of the woodwork. Almost everyone who has a line in the movie falls under the suspicious gaze of the camera as Annie's psychic vision point to one, then another, possible murderer. It gets very confusing and forces the story to unravel into a morass of faux accusations. So many suspects crop up over the course of the movie that I thought I was watching the psychic edition of "Clue." The whirlwind of this whodunit replaces suspense with a series of false leads as the real killer is eventually brought to justice.
As I said, "The Gift" is a showcase for the very talented Cate Blanchett. Since her breakthrough performance as the young queen in "Elizabeth," the actress has shown versatility and is capable of a myriad of accents and characters. With her natural-sounding southern drawl, Blanchett pulls you into her character and the danger and confusion that her gift can cause. Even as she tries to help here clientele with her visions, she denies the impact they have, repeatedly, when they involve her or her own. It's not the best performance of the year, but it does further establish the actress as one of the most talented in the business today.
The supporting cast surrounding Annie provide an assemblage of two-dimensional characters, here to give cause to the mystery and not too much more. Keanu Reeves shows himself to be an actor willing to go against type and be something other than just a pretty face. As such, he brings attention to his character, Donnie Barksdale, and you believe, though he is a wife-beating jerk, he is no murderer. Hilary Swank does her best as the one-note Valerie, but the Academy Award winning actress is not given much to do as the abused wife - except to look extremely abused. Giovanni Ribisi needs to get his agent to get him roles other than the simple characters he has played of late. Greg Kinnear and Katie Holmes are miscast as a couple. Holmes, in particular, is too young for the femme fatale she is supposed to be.
The moody production fits the temperament sought for "The Gift" with the dark, atmospheric night scenery and swirling fog. It looks good and couples nicely with the story up to the first half. After that, as the tale gets confused, the decent techs become background only.
The draw to "The Gift" is Cate Blanchett. She is worth the price of admission, though the movie, overall, is less than her considerable efforts. I give it a C+.
For more Reeling reviews visit www.reelingreviews.com
<EMAIL_ADDRESS><EMAIL_ADDRESS>The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


To get personalized help on using inv, fill out this form with your question and we will contact you as soon as we can.
{% extends 'layout.html' %} {% block title %}Support{% endblock %} {% block header %}
To get personalized help on using inv, fill out this form with your question and we will contact you as soon as we can.
We appreciate any comments, questions, or concerns you may have regarding your experience with inv.


Call of Duty: Modern Warfare gets free content update
It's not a huge content update, but free content is better than nothing.
by Jennifer LockeSource: Activision
What you need to know
- Call of Duty: Modern Warfare received a free content update for all players today.
- It includes new game modes, featured playlists, and Special Ops experiences.
- The Special Ops content supports cross-play and cross-progression.
Activision has announced that Call of Duty: Modern Warfare's latest content update is now free for all players across all platforms. Today's update includes new games modes, featured playlists, and Special Ops content. It may not seem like much, but that's only because it's building towards major in-game events that will drop in the future.
Realism is coming to Domination, Headquarters, Kill Confirmed, Team Deathmatch, and Hardpoint. This removes the HUD and dramatically increases headshot damage along with lowering health. It is available across day and night map variants.
Gun Game, the popular free-for-all mode, is now in Modern Warfare. Avery player starts out with the same handgun, and once they defeat an enemy with that weapon they earn a new one. Rinse and repeat until you've earned the final weapon (a Combat Knife or Throwing Knife) and kill an enemy.
Operation Harbinger, Operation Brimstone, and Classic Special Ops: Door Kick round out the content this week. Each provides a unique scenario to take on, whether it be rigging a train for detonation or rescuing a local informant.
This is only a prelude to the First Season of Modern Warfare content.
Next level combat
Call of Duty: Modern Warfare
Warfare is Modern again
Developed by Infinity Ward, Call of Duty: Modern Warfare takes the concept of modern combat and reapplies it, with familiar characters in unfamiliar situations.
Get more Xbox
Xbox
- Xbox One S vs. Xbox One X: Which should you buy?
- Best Xbox One X and Xbox One S Accessories
- Best Xbox One Headsets 2019
- Best Xbox One Wireless Headsets 2019
- Best Xbox Controller Charging Stations in 2019
We may earn a commission for purchases using our links. Learn more.


Your browser doesn't support
custom elements
. Please use a latest version of an evergreen browser (Firefox, Chrome, Safari, Opera, etc).


Testing Unbounded Pipelines in Apache Beam
The Beam Programming Model unifies writing pipelines for Batch and Streaming pipelines. We’ve recently introduced a new PTransform to write tests for pipelines that will be run over unbounded datasets and must handle out-of-order and delayed data.
Watermarks, Windows and Triggers form a core part of the Beam programming model – they respectively determine how your data are grouped, when your input is complete, and when to produce results. This is true for all pipelines, regardless of if they are processing bounded or unbounded inputs. If you’re not familiar with watermarks, windowing, and triggering in the Beam model, Streaming 101 and Streaming 102 are an excellent place to get started. A key takeaway from these articles: in realistic streaming scenarios with intermittent failures and disconnected users, data can arrive out of order or be delayed. Beam’s primitives provide a way for users to perform useful, powerful, and correct computations in spite of these challenges.
As Beam pipeline authors, we need comprehensive tests that cover crucial failure scenarios and corner cases to gain real confidence that a pipeline is ready for production. The existing testing infrastructure within the Beam SDKs permits tests to be written which examine the contents of a Pipeline at execution time. However, writing unit tests for pipelines that may receive late data or trigger multiple times has historically ranged from complex to not possible, as pipelines that read from unbounded sources do not shut down without external intervention, while pipelines that read from bounded sources exclusively cannot test behavior with late data nor most speculative triggers. Without additional tools, pipelines that use custom triggers and handle out-of-order data could not be easily tested.
This blog post introduces our new framework for writing tests for pipelines that handle delayed and out-of-order data in the context of the LeaderBoard pipeline from the Mobile Gaming example series.
LeaderBoard and the Mobile Gaming Example
LeaderBoard is part of the Beam mobile gaming examples (and walkthroughs) which produces a continuous accounting of user and team scores. User scores are calculated over the lifetime of the program, while team scores are calculated within fixed windows with a default duration of one hour. The LeaderBoard pipeline produces speculative and late panes as appropriate, based on the configured triggering and allowed lateness of the pipeline. The expected outputs of the LeaderBoard pipeline vary depending on when elements arrive in relation to the watermark and the progress of processing time, which could not previously be controlled within a test.
Writing Deterministic Tests to Emulate Nondeterminism
The Beam testing infrastructure provides the PAssert methods, which assert properties about the contents of a PCollection from within a pipeline. We have expanded this infrastructure to include TestStream, which is a PTransform that performs a series of events, consisting of adding additional elements to a pipeline, advancing the watermark of the TestStream, and advancing the pipeline processing time clock. TestStream permits tests which observe the effects of triggers on the output a pipeline produces.
While executing a pipeline that reads from a TestStream, the read waits for all of the consequences of each event to complete before continuing on to the next event, ensuring that when processing time advances, triggers that are based on processing time fire as appropriate. With this transform, the effect of triggering and allowed lateness can be observed on a pipeline, including reactions to speculative and late panes and dropped data.
Element Timings
Elements arrive either before, with, or after the watermark, which categorizes them into the “early”, “on-time”, and “late” divisions. “Late” elements can be further subdivided into “unobservably”, “observably”, and “droppably” late, depending on the window to which they are assigned and the maximum allowed lateness, as specified by the windowing strategy. Elements that arrive with these timings are emitted into panes, which can be “EARLY”, “ON-TIME”, or “LATE”, depending on the position of the watermark when the pane was emitted.
Using TestStream, we can write tests that demonstrate that speculative panes are output after their trigger condition is met, that the advancing of the watermark causes the on-time pane to be produced, and that late-arriving data produces refinements when it arrives before the maximum allowed lateness, and is dropped after.
The following examples demonstrate how you can use TestStream to provide a sequence of events to the Pipeline, where the arrival of elements is interspersed with updates to the watermark and the advance of processing time. Each of these events runs to completion before additional events occur.
In the diagrams, the time at which events occurred in “real” (event) time progresses as the graph moves to the right. The time at which the pipeline receives them progresses as the graph goes upwards. The watermark is represented by the squiggly red line, and each starburst is the firing of a trigger and the associated pane.
Everything arrives on-time
For example, if we create a TestStream where all the data arrives before the watermark and provide the result PCollection as input to the CalculateTeamScores PTransform:
TestStream<GameActionInfo> infos = TestStream.create(AvroCoder.of(GameActionInfo.class))
.addElements(new GameActionInfo("sky", "blue", 12, new Instant(0L)),
new GameActionInfo("navy", "blue", 3, new Instant(0L)),
new GameActionInfo("navy", "blue", 3, new Instant(0L).plus(Duration.standardMinutes(3))))
// Move the watermark past the end the end of the window
.advanceWatermarkTo(new Instant(0L).plus(TEAM_WINDOW_DURATION)
.plus(Duration.standardMinutes(1)))
.advanceWatermarkToInfinity();
PCollection<KV<String, Integer>> teamScores = p.apply(createEvents)
.apply(new CalculateTeamScores(TEAM_WINDOW_DURATION, ALLOWED_LATENESS));
we can then assert that the result PCollection contains elements that arrived:
// Only one value is emitted for the blue team
PAssert.that(teamScores)
.inWindow(window)
.containsInAnyOrder(KV.of("blue", 18));
p.run();
Some elements are late, but arrive before the end of the window
We can also add data to the TestStream after the watermark, but before the end of the window (shown below to the left of the red watermark), which demonstrates “unobservably late” data - that is, data that arrives late, but is promoted by the system to be on time, as it arrives before the watermark passes the end of the window
TestStream<GameActionInfo> infos = TestStream.create(AvroCoder.of(GameActionInfo.class))
.addElements(new GameActionInfo("sky", "blue", 3, new Instant(0L)),
new GameActionInfo("navy", "blue", 3, new Instant(0L).plus(Duration.standardMinutes(3))))
// Move the watermark up to "near" the end of the window
.advanceWatermarkTo(new Instant(0L).plus(TEAM_WINDOW_DURATION)
.minus(Duration.standardMinutes(1)))
.addElements(new GameActionInfo("sky", "blue", 12, Duration.ZERO))
.advanceWatermarkToInfinity();
PCollection<KV<String, Integer>> teamScores = p.apply(createEvents)
.apply(new CalculateTeamScores(TEAM_WINDOW_DURATION, ALLOWED_LATENESS));
// Only one value is emitted for the blue team
PAssert.that(teamScores)
.inWindow(window)
.containsInAnyOrder(KV.of("blue", 18));
p.run();
Elements are late, and arrive after the end of the window
By advancing the watermark farther in time before adding the late data, we can demonstrate the triggering behavior that causes the system to emit an on-time pane, and then after the late data arrives, a pane that refines the result.
TestStream<GameActionInfo> infos = TestStream.create(AvroCoder.of(GameActionInfo.class))
.addElements(new GameActionInfo("sky", "blue", 3, new Instant(0L)),
new GameActionInfo("navy", "blue", 3, new Instant(0L).plus(Duration.standardMinutes(3))))
// Move the watermark up to "near" the end of the window
.advanceWatermarkTo(new Instant(0L).plus(TEAM_WINDOW_DURATION)
.minus(Duration.standardMinutes(1)))
.addElements(new GameActionInfo("sky", "blue", 12, Duration.ZERO))
.advanceWatermarkToInfinity();
PCollection<KV<String, Integer>> teamScores = p.apply(createEvents)
.apply(new CalculateTeamScores(TEAM_WINDOW_DURATION, ALLOWED_LATENESS));
// An on-time pane is emitted with the events that arrived before the window closed
PAssert.that(teamScores)
.inOnTimePane(window)
.containsInAnyOrder(KV.of("blue", 6));
// The final pane contains the late refinement
PAssert.that(teamScores)
.inFinalPane(window)
.containsInAnyOrder(KV.of("blue", 18));
p.run();
Elements are late, and after the end of the window plus the allowed lateness
If we push the watermark even further into the future, beyond the maximum configured allowed lateness, we can demonstrate that the late element is dropped by the system.
TestStream<GameActionInfo> infos = TestStream.create(AvroCoder.of(GameActionInfo.class))
.addElements(new GameActionInfo("sky", "blue", 3, Duration.ZERO),
new GameActionInfo("navy", "blue", 3, Duration.standardMinutes(3)))
// Move the watermark up to "near" the end of the window
.advanceWatermarkTo(new Instant(0).plus(TEAM_WINDOW_DURATION)
.plus(ALLOWED_LATENESS)
.plus(Duration.standardMinutes(1)))
.addElements(new GameActionInfo(
"sky",
"blue",
12,
new Instant(0).plus(TEAM_WINDOW_DURATION).minus(Duration.standardMinutes(1))))
.advanceWatermarkToInfinity();
PCollection<KV<String, Integer>> teamScores = p.apply(createEvents)
.apply(new CalculateTeamScores(TEAM_WINDOW_DURATION, ALLOWED_LATENESS));
// An on-time pane is emitted with the events that arrived before the window closed
PAssert.that(teamScores)
.inWindow(window)
.containsInAnyOrder(KV.of("blue", 6));
p.run();
Elements arrive before the end of the window, and some processing time passes
Using additional methods, we can demonstrate the behavior of speculative
triggers by advancing the processing time of the TestStream. If we add elements
to an input PCollection, occasionally advancing the processing time clock, and
apply CalculateUserScores
TestStream.create(AvroCoder.of(GameActionInfo.class))
.addElements(new GameActionInfo("scarlet", "red", 3, new Instant(0L)),
new GameActionInfo("scarlet", "red", 2, new Instant(0L).plus(Duration.standardMinutes(1))))
.advanceProcessingTime(Duration.standardMinutes(12))
.addElements(new GameActionInfo("oxblood", "red", 2, new Instant(0L)).plus(Duration.standardSeconds(22)),
new GameActionInfo("scarlet", "red", 4, new Instant(0L).plus(Duration.standardMinutes(2))))
.advanceProcessingTime(Duration.standardMinutes(15))
.advanceWatermarkToInfinity();
PCollection<KV<String, Integer>> userScores =
p.apply(infos).apply(new CalculateUserScores(ALLOWED_LATENESS));
PAssert.that(userScores)
.inEarlyGlobalWindowPanes()
.containsInAnyOrder(KV.of("scarlet", 5),
KV.of("scarlet", 9),
KV.of("oxblood", 2));
p.run();
TestStream - Under the Hood
TestStream relies on a pipeline concept we’ve introduced, called quiescence, to utilize the existing runner infrastructure while providing guarantees about when a root transform will called by the runner. This consists of properties about pending elements and triggers, namely:
- No trigger is permitted to fire but has not fired
- All elements are either buffered in state or cannot progress until a side input becomes available
Simplified, this means that, in the absence of an advancement in input watermarks or processing time, or additional elements being added to the pipeline, the pipeline will not make progress. Whenever the TestStream PTransform performs an action, the runner must not reinvoke the same instance until the pipeline has quiesced. This ensures that the events specified by TestStream happen “in-order”, which ensures that input watermarks and the system clock do not advance ahead of the elements they hoped to hold up.
The DirectRunner has been modified to use quiescence as the signal that it should add more work to the Pipeline, and the implementation of TestStream in that runner uses this fact to perform a single output per event. The DirectRunner implementation also directly controls the runner’s system clock, ensuring that tests will complete promptly even if there is a multi-minute processing time trigger located within the pipeline.
The TestStream transform is supported in the DirectRunner. For most users, tests written using TestPipeline and PAsserts will automatically function while using TestStream.
Summary
The addition of TestStream alongside window and pane-specific matchers in PAssert has enabled the testing of Pipelines which produce speculative and late panes. This permits tests for all styles of pipeline to be expressed directly within the Java SDK. If you have questions or comments, we’d love to hear them on the mailing lists.


Files | |
| file | mmu.h |
| This file contains the device HAL APIs for MMU. | |
Data Structures | |
| struct | MMU_TlbEntry |
| Structure holding all MMU Table Entry parameters. More... | |
Typedefs | |
| typedef enum MMU_IntType | MMU_IntType_t |
| Interrupt enable/status types. | |
| typedef enum MMU_PageSize | MMU_PageSize_t |
| Enumerated Type used to specify Page size. | |
| typedef enum MMU_Endianness | MMU_Endianness_t |
| Enumerated Type used to specify Endianness. | |
| typedef enum MMU_ElementSize | MMU_ElementSize_t |
| Enumerated Type used to specify Element size. | |
| typedef enum MMU_MixedPageAttr | MMU_MixedPageAttr_t |
| Enumerated Type used to Mixed Page Attribute use. | |
| typedef struct MMU_TlbEntry | MMU_TlbEntry_t |
| Structure holding all MMU Table Entry parameters. | |
| typedef enum MMUMixedSize | MMUMixedSize_t |
| MMU element size Enumerated Type used to specify whther to follow CPU/TLB Element siz. | |
| typedef enum MMUfault | MMUFault_t |
| MMU fault type Enumerated Type used to specify the particular fault to be generated. | |
Enumerations | |
| enum | MMU_IntType |
| Interrupt enable/status types. | |
| enum | MMU_PageSize |
| Enumerated Type used to specify Page size. | |
| enum | MMU_Endianness |
| Enumerated Type used to specify Endianness. | |
| enum | MMU_ElementSize |
| Enumerated Type used to specify Element size. | |
| enum | MMU_MixedPageAttr |
| Enumerated Type used to Mixed Page Attribute use. | |
| enum | MMU_Mode |
| Enumerated Type used to set MMU mode of operation. | |
| enum | MMU_Return_t |
| Status return from page table entry API's. | |
| enum | MMUMixedSize |
| MMU element size Enumerated Type used to specify whther to follow CPU/TLB Element siz. | |
| enum | MMUfault |
| MMU fault type Enumerated Type used to specify the particular fault to be generated. | |
Functions | |
| void | MMUCurrentVictimSet (uint32_t baseAddr, uint32_t tlbEntry) |
| Set Tlb Entry in Lock register Set Current Victim in Lock register. More... | |
| uint32_t | MMUCurrentVictimGet (uint32_t baseAddr) |
| Set Tlb Entry in Lock register Get Current Victim from Lock register. More... | |
| void | MMUTlbLockSet (uint32_t baseAddr, uint32_t tlbEntry) |
| Set Tlb Lock entry in Lock register Set Tlb Lock in Lock register. More... | |
| uint32_t | MMUTlbLockGet (uint32_t baseAddr) |
| Set Tlb Lock entry in Lock register Get Tlb Base Lock from Lock register. More... | |
| void | MMUGlobalFlush (uint32_t baseAddr) |
| Flush all MMU entries Flush all Tlb entrties in MMU. More... | |
| void | MMUTlbEntryFlush (uint32_t baseAddr, uint32_t virtAddress) |
| Flush MMU entry for the virtual address passed Flush Specific Tlb entrties in MMU pointed by specified Virt. Addr. More... | |
| void | MMUSoftReset (uint32_t baseAddr) |
| Reset MMU Reset MMU and wait for reset done. More... | |
| void | MMUSetMode (uint32_t baseAddr, MMU_Mode mode) |
| Set MMU operation mode Set MMU operation mode. More... | |
| uint32_t | MMUIrqGetStatus (uint32_t baseAddr) |
| Get MMU Irq Status. More... | |
| void | MMUIrqClearStatus (uint32_t baseAddr, MMU_IntType_t intType) |
| Clear MMU Irq Status. More... | |
| void | MMUIrqEnable (uint32_t baseAddr, MMU_IntType_t intType) |
| Get MMU Irq Status Enable selected interrupt. More... | |
| void | MMUIrqDisable (uint32_t baseAddr, MMU_IntType_t intType) |
| Get MMU Irq Status Disable selected interrupt. More... | |
| void | MMUWtlEnable (uint32_t baseAddr) |
| Enable MMU Walking table logic. More... | |
| void | MMUWtlDisable (uint32_t baseAddr) |
| Disable MMU Walking table logic. More... | |
| void | MMUEnable (uint32_t baseAddr) |
| Enable MMU. More... | |
| void | MMUDisable (uint32_t baseAddr) |
| Disable MMU. More... | |
| void | MMULoadTLB (uint32_t baseAddr) |
| Load an entry into TLB. More... | |
| void | MMUWriteCAM (uint32_t baseAddr, uint32_t cam) |
| Write to CAM Register. More... | |
| void | MMUWriteRAM (uint32_t baseAddr, uint32_t ram) |
| Write to RAM Register. More... | |
| uint32_t | MMUReadCAM (uint32_t baseAddr) |
| Read CAM value. More... | |
| uint32_t | MMUReadRAM (uint32_t baseAddr) |
| Read RAM value. More... | |
| uint32_t | MMUFaultAddrGet (uint32_t baseAddr) |
| Read fault address. More... | |
| uint32_t | MMUTTBGet (uint32_t baseAddr) |
| Read TTB value. More... | |
| void | MMUTTBSet (uint32_t baseAddr, uint32_t ttb) |
| sets TTB value More... | |
| MMU_Return_t | MMUTlbEntrySet (uint32_t baseAddr, uint32_t tlbEntry, const MMU_TlbEntry_t *mmuTlbEntry) |
| Fill MMU TLB Entry. More... | |
| MMU_Return_t | MMUSuperSection (const uint32_t physicalAddr, const uint32_t virtualAddr, const uint32_t TTB, MMU_Endianness_t endianism, MMU_ElementSize_t elementSize, MMUMixedSize_t mixedSize, MMUFault_t faultType) |
| Fill MMU page table supersection. More... | |
| MMU_Return_t | MMUSection (const uint32_t physicalAddr, const uint32_t virtualAddr, const uint32_t TTB, MMU_Endianness_t endianism, MMU_ElementSize_t elementSize, MMUMixedSize_t mixedSize, MMUFault_t faultType) |
| Fill MMU page table section. More... | |
| MMU_Return_t | MMUCoarseLargePage (const uint32_t physicalAddr, const uint32_t virtualAddr, const uint32_t TTB, const uint32_t pageTableBase, MMU_Endianness_t endianism, MMU_ElementSize_t elementSize, MMUMixedSize_t mixedSize, MMUFault_t faultType) |
| Fill MMU page table CoarseLargePage entry. More... | |
| MMU_Return_t | MMUCoarseSmallPage (const uint32_t physicalAddr, const uint32_t virtualAddr, const uint32_t TTB, const uint32_t pageTableBase, MMU_Endianness_t endianism, MMU_ElementSize_t elementSize, MMUMixedSize_t mixedSize, MMUFault_t faultType) |
| Fill MMU page table CoarseSmallPage. More... | |
| MMU_Return_t MMUCoarseLargePage | ( | const uint32_t | physicalAddr, |
| const uint32_t | virtualAddr, | ||
| const uint32_t | TTB, | ||
| const uint32_t | pageTableBase, | ||
| MMU_Endianness_t | endianism, | ||
| MMU_ElementSize_t | elementSize, | ||
| MMUMixedSize_t | mixedSize, | ||
| MMUFault_t | faultType | ||
| ) |
Fill MMU page table CoarseLargePage entry.
| physicalAddr | physical address |
| virtualAddr | virtual address |
| TTB | translation table base addr |
| pageTableBase | page table base addr |
| endianism | endianness |
| elementSize | element size of the page |
| mixedSize | mixed page attribute |
| faultType | fault type |
| MMU_Return_t MMUCoarseSmallPage | ( | const uint32_t | physicalAddr, |
| const uint32_t | virtualAddr, | ||
| const uint32_t | TTB, | ||
| const uint32_t | pageTableBase, | ||
| MMU_Endianness_t | endianism, | ||
| MMU_ElementSize_t | elementSize, | ||
| MMUMixedSize_t | mixedSize, | ||
| MMUFault_t | faultType | ||
| ) |
Fill MMU page table CoarseSmallPage.
| physicalAddr | physical address |
| virtualAddr | virtual address |
| TTB | translation table base addr |
| pageTableBase | page table base addr |
| endianism | endianness |
| elementSize | element size of the page |
| mixedSize | mixed page attribute |
| faultType | fault type |
| uint32_t MMUCurrentVictimGet | ( | uint32_t | baseAddr | ) |
Set Tlb Entry in Lock register Get Current Victim from Lock register.
| baseAddr | Base address of the instance |
| void MMUCurrentVictimSet | ( | uint32_t | baseAddr, |
| uint32_t | tlbEntry | ||
| ) |
Set Tlb Entry in Lock register Set Current Victim in Lock register.
| baseAddr | Base address of the instance |
| tlbEntry | uint32_t entry to be set in MMU |
| void MMUDisable | ( | uint32_t | baseAddr | ) |
Disable MMU.
| baseAddr | Base address of the instance |
| void MMUEnable | ( | uint32_t | baseAddr | ) |
Enable MMU.
| baseAddr | Base address of the instance |
| uint32_t MMUFaultAddrGet | ( | uint32_t | baseAddr | ) |
Read fault address.
| baseAddr | Base address of the instance |
| void MMUGlobalFlush | ( | uint32_t | baseAddr | ) |
Flush all MMU entries Flush all Tlb entrties in MMU.
| baseAddr | Base address of the instance |
| void MMUIrqClearStatus | ( | uint32_t | baseAddr, |
| MMU_IntType_t | intType | ||
| ) |
Clear MMU Irq Status.
| baseAddr | Base address of the instance |
| intType | MMU_IntType_t interrupt Type to Clear |
| void MMUIrqDisable | ( | uint32_t | baseAddr, |
| MMU_IntType_t | intType | ||
| ) |
Get MMU Irq Status Disable selected interrupt.
| baseAddr | Base address of the instance |
| intType | MMU_IntType_t interrupt Type to be disabled |
| void MMUIrqEnable | ( | uint32_t | baseAddr, |
| MMU_IntType_t | intType | ||
| ) |
Get MMU Irq Status Enable selected interrupt.
| baseAddr | Base address of the instance |
| intType | MMU_IntType_t interrupt Type to enable |
| uint32_t MMUIrqGetStatus | ( | uint32_t | baseAddr | ) |
Get MMU Irq Status.
| baseAddr | Base address of the instance |
| void MMULoadTLB | ( | uint32_t | baseAddr | ) |
Load an entry into TLB.
| baseAddr | Base address of the instance |
| uint32_t MMUReadCAM | ( | uint32_t | baseAddr | ) |
Read CAM value.
| baseAddr | Base address of the instance |
| uint32_t MMUReadRAM | ( | uint32_t | baseAddr | ) |
Read RAM value.
| baseAddr | Base address of the instance |
| MMU_Return_t MMUSection | ( | const uint32_t | physicalAddr, |
| const uint32_t | virtualAddr, | ||
| const uint32_t | TTB, | ||
| MMU_Endianness_t | endianism, | ||
| MMU_ElementSize_t | elementSize, | ||
| MMUMixedSize_t | mixedSize, | ||
| MMUFault_t | faultType | ||
| ) |
Fill MMU page table section.
| physicalAddr | physical address |
| virtualAddr | virtual address |
| TTB | translation table base addr |
| endianism | endianness |
| elementSize | element size of the page |
| mixedSize | mixed page attribute |
| faultType | fault type |
| void MMUSetMode | ( | uint32_t | baseAddr, |
| MMU_Mode | mode | ||
| ) |
Set MMU operation mode Set MMU operation mode.
| baseAddr | Base address of the instance |
| mode | Operation mode |
| void MMUSoftReset | ( | uint32_t | baseAddr | ) |
Reset MMU Reset MMU and wait for reset done.
| baseAddr | Base address of the instance |
| MMU_Return_t MMUSuperSection | ( | const uint32_t | physicalAddr, |
| const uint32_t | virtualAddr, | ||
| const uint32_t | TTB, | ||
| MMU_Endianness_t | endianism, | ||
| MMU_ElementSize_t | elementSize, | ||
| MMUMixedSize_t | mixedSize, | ||
| MMUFault_t | faultType | ||
| ) |
Fill MMU page table supersection.
| physicalAddr | physical address |
| virtualAddr | virtual address |
| TTB | translation table base addr |
| endianism | endianness |
| elementSize | element size of the page |
| mixedSize | mixed page attribute |
| faultType | fault type |
| void MMUTlbEntryFlush | ( | uint32_t | baseAddr, |
| uint32_t | virtAddress | ||
| ) |
Flush MMU entry for the virtual address passed Flush Specific Tlb entrties in MMU pointed by specified Virt. Addr.
| baseAddr | Base address of the instance |
| virtAddress | uint32_t Virtual Address of entry to be flushed |
| MMU_Return_t MMUTlbEntrySet | ( | uint32_t | baseAddr, |
| uint32_t | tlbEntry, | ||
| const MMU_TlbEntry_t * | mmuTlbEntry | ||
| ) |
Fill MMU TLB Entry.
| baseAddr | Base address of the instance |
| tlbEntry | uint32_t entry to be set in MMU |
| mmuTlbEntry | MMU_TlbEntry_t * pointer to MMU Table Entry |
| uint32_t MMUTlbLockGet | ( | uint32_t | baseAddr | ) |
Set Tlb Lock entry in Lock register Get Tlb Base Lock from Lock register.
| baseAddr | Base address of the instance |
| void MMUTlbLockSet | ( | uint32_t | baseAddr, |
| uint32_t | tlbEntry | ||
| ) |
Set Tlb Lock entry in Lock register Set Tlb Lock in Lock register.
| baseAddr | Base address of the instance |
| tlbEntry | uint32_t entry to be locked in MMU |
| uint32_t MMUTTBGet | ( | uint32_t | baseAddr | ) |
Read TTB value.
| baseAddr | Base address of the instance |
| void MMUTTBSet | ( | uint32_t | baseAddr, |
| uint32_t | ttb | ||
| ) |
sets TTB value
| baseAddr | Base address of the instance |
| ttb | TTB value to be set |
| void MMUWriteCAM | ( | uint32_t | baseAddr, |
| uint32_t | cam | ||
| ) |
Write to CAM Register.
| baseAddr | Base address of the instance |
| cam | CAM value to be entered |
| void MMUWriteRAM | ( | uint32_t | baseAddr, |
| uint32_t | ram | ||
| ) |
Write to RAM Register.
| baseAddr | Base address of the instance |
| ram | RAM value to be entered |
| void MMUWtlDisable | ( | uint32_t | baseAddr | ) |
Disable MMU Walking table logic.
| baseAddr | Base address of the instance |
| void MMUWtlEnable | ( | uint32_t | baseAddr | ) |
Enable MMU Walking table logic.
| baseAddr | Base address of the instance |


bench_lang_intro - bench language introduction
This document is an informal introduction to version 1 of the bench language based on a multitude of examples. After reading this a benchmark writer should be ready to understand the formal bench language specification.
In the broadest terms possible the bench language is essentially Tcl, plus a number of commands to support the declaration of benchmarks. A document written in this language is a Tcl script and has the same syntax.
One of the most simplest benchmarks which can be written in bench is
bench -desc LABEL -body { set a b }
This code declares a benchmark named LABEL which measures the time it takes to assign a value to a variable. The Tcl code doing this assignment is the -body of the benchmark.
Our next example demonstrates how to declare initialization and cleanup code, i.e. code computing information for the use of the -body, and for releasing such resources after the measurement is done. They are the -pre- and the -post-body, respectively.
In our example, directly drawn from the benchmark suite of Tcllib's aes package, the concrete initialization code constructs the key schedule used by the encryption command whose speed we measure, and the cleanup code releases any resources bound to that schedule.
bench -desc "AES-${len} ECB encryption core" -pre { set key [aes::Init ecb $k $i] } -body { aes::Encrypt $key $p } -post { aes::Final $key }
Our last example again deals with initialization and cleanup code. To see the difference to the regular initialization and cleanup discussed in the last section it is necessary to know a bit more about how bench actually measures the speed of the the -body.
Instead of running the -body just once the system actually executes the -body several hundred times and then returns the average of the found execution times. This is done to remove environmental effects like machine load from the result as much as possible, with outliers canceling each other out in the average.
The drawback of doing things this way is that when we measure operations which are not idempotent we will most likely not measure the time for the operation we want, but of the state(s) the system is in after the first iteration, a mixture of things we have no interest in.
Should we wish, for example, to measure the time it takes to include an element into a set, with the element not yet in the set, and the set having specific properties like being a shared Tcl_Obj, then the first iteration will measure the time for this. However all subsequent iterations will measure the time to include an element which is already in the set, and the Tcl_Obj holding the set will not be shared anymore either. In the end the timings taken for the several hundred iterations of this state will overwhelm the time taken from the first iteration, the only one which actually measured what we wanted.
The advanced initialization and cleanup codes, -ipre- and the -ipost-body respectively, are present to solve this very problem. While the regular initialization and cleanup codes are executed before and after the whole series of iterations the advanced codes are executed before and after each iteration of the body, without being measured themselves. This allows them to bring the system into the exact state the body wishes to measure.
Our example, directly drawn from the benchmark suite of Tcllib's struct::set package, is for exactly the example we used above to demonstrate the necessity for the advanced initialization and cleanup. Its concrete initialization code constructs a variable refering to a set with specific properties (The set has a string representation, which is shared) affecting the speed of the inclusion command, and the cleanup code releases the temporary variables created by this initialization.
bench -desc "set include, missing <SC> x$times $n" -ipre { set A $sx($times,$n) set B $A } -body { struct::set include A x } -ipost { unset A B }
Now that this document has been digested the reader, assumed to be a writer of benchmarks, he should be fortified enough to be able to understand the formal bench language specfication. It will also serve as the detailed specification and cheat sheet for all available commands and their syntax.
This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category bench of the Tcllib Trackers. Please also report any ideas for enhancements you may have for either package and/or documentation.
When proposing code changes, please provide unified diffs, i.e the output of diff -u.
Note further that attachments are strongly preferred over inlined patches. Attachments can be made by going to the Edit form of the ticket immediately after its creation, and then using the left-most button in the secondary navigation bar.
Benchmark tools
Copyright © 2007 Andreas Kupries <andreas_kupries@users.sourceforge.net>


Eden Hazard predicts outcome of Chelsea vs Manchester City
by Sarthak SharmaChelsea take on Manchester City in the Premier League this weekend, and it is undoubtedly the standout fixture of this particular matchday.
The last time Chelsea went to the Etihad Stadium it was a rather embarrassing occasion for the Blues, finding themselves on the wrong end of a 6-0 scoreline that outlined the difference between the two sides.
However, this season Chelsea have been particularly impressive under new manager Frank Lampard, and chances of another 6-0 look rather unlikely.
Eden Hazard was a part of that game where the Londoners were drubbed away from home, but even he believes that his former employers are in a much better position now, and can possibly even win this game.
“Of course they can beat Man City. It’s not going to be easy, it’s hard to play there and last time we played there we lost 6-0,” he said to Sky Sports.
“So it’s bad memories for me and for Chelsea as well but I think this season they are really good. They are really young but really good, so why not go there and win the game?”
Chelsea currently sit in the top four of the Premier League table and are actually one point ahead of Man City as things stand.


--- title: Home headerImg: beach.jpg ---
Welcome to my blog!
I've reproduced a list of recent posts here for your reading pleasure:
…or you can find more in the archives.


This page is dangerous, if you do not know what this is close this immediately!
All data will be destroyed!!! Check box to continue
Begin Test


Instagram to test hiding likes in parts of the U.S. as of next week
Source: Android Central
What you need to know
- Instagram is going to test hiding likes in parts of the U.S.
- The tests will begin next week.
- It's all part of Instagram's plan to become the safest place on the internet.
Instagram CEO Adam Mosseri has announced that it will start hiding like counts on its platform in parts of the U.S., beginning next week.
As reported by WIRED, Instagram has previously tested hiding likes in several countries including Canada, Australia, New Zealand, Japan, Ireland, Italy, and Brazil.
At WIRED25 conference on November 8, Mosseri announced that the tests would roll out to the U.S. next week. He clarified that it wouldn't be the whole U.S. but didn't further specify as to which regions would be included.
Rather than removing 'Likes', Instagram is testing making the like count on posts private, so users who post will be able to see their own like counts, they simply won't be visible to people who like and view your photos and videos. Likewise, you won't be able to see the like count on other people's content.
The move is part of Instagram's drive to make the platform the safest place on the internet. Recently, Instagram extended a ban on depictions of self-harm to include fictional content such as memes, drawings and graphic images from films and comics.
At WIRED25, Mosseri said:
"It's about young people, the idea is to try and depressurize Instagram, make it less of a competition, give people more space to focus on connecting with people that they love, things that inspire them."
Hiding public like counts won't necessarily solve issues around the pressure of Instagram and social media. Whilst the feature will prevent people from comparing likes on their own content with that of other people's, being able to privately view like counts on a photo means users will still be able to track exactly how many people like (or don't like) their content, which seems to be a core facet of this issue.
With that being said, users in the U.S. will be able to make up their own minds next week when testing begins.


Home
Classes
DownloadService
getInstance
download
Namespaces
Downloader
Uploader
Global
RefContainer
UploadManager
useDownloader
useUploader
Uploader
Uploader
Source:
hooks/useUploader.js
,
line 5


Pivotal Tracker Help
API
Introduction
Tracker provides an API that can be used to create, retrieve, update, and delete project, story, and task resources. This interface incorporates several elements of the REST tradition, making access to these actions consistent and intuitive.
In a nutshell: collections are accessed via a URL ending in a plural noun such as '/stories', and to target an individual record, append it's numerical id (/stories/85). To tell the API whether you are viewing, updating, or deleting the record, make use of the "HTTP verbs", GET, PUT, and DELETE (respectively). To create a new record, send a POST request to the collection's URL (/stories). The API will respond with an XML document reflecting your changes.
This is the second version of the API, and incorporates your feedback. To see what's new, please read the Recent Updates page. As always, we welcome additional feedback and suggestions on Satisfaction.
Note: The previous version of the Tracker API is still available, but has been deprecated, and will be removed in the future.
Available API Actions
Here are some examples of supported API commands, and the corresponding responses. These examples are shown in the form of 'curl' commands. Curl is a command line utility used to perform HTTP requests, and is available on most Unix systems, but you can use any tool or language which can submit a corresponding HTTP request.
API Logistical Details
This is some information you may need while consuming the API or writing software that does.
Retrieve User Token
Note: This API action requires SSL.  The example below shows how to retrieve all iterations, with stories.
curl -H "X-TrackerToken: TOKEN" -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/iterations(show response)
In most cases, you'll probably want to work with the done, current, or backlog group of iterations only. Iteration group can be specifying at the end of the URL. The example below retrieves only iterations in the backlog:
curl -H "X-TrackerToken: TOKEN" -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/iterations/backlog
Get iterations with limit and offset
Optionally, you can specify offset and limit as parameters (except for current, because there is always only one current iteration). The limit parameter controls the max number of iterations returned, and the offset parameter controls the number of iterations to skip from the beginning of the result. Given the previous example, the example below will only return iteration 2 and iteration 3 from our project:
curl -H "X-TrackerToken: TOKEN" -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/iterations?offset=1&limit=2(show response)
For done iterations, offset should be negative, relative to the most recent done iteration.  Note that for very large projects with hundreds or thousands of stories, you might need to use the curl "-o" option to write directly to a file instead of standard output.
curl -H "X-TrackerToken: TOKEN" -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories(show response)
A Note on Limits
For performance reasons, the API will return a maximum of 3000 stories per request. This is a temporary limit and should be removed as the API matures. If you encounter this limit, try reducing your result set by using filters.
Get stories by filter
Note that labels or strings with a space must be quoted, and multiple filters must be separated with a space, and everything must be URL-escaped. So, in this example, the un-URL-escaped filter parameter is 'filter=label:"needs feedback" type:bug'. You can also search on multiple values within the same search term, for example, 'filter=id:1,2,3' will return stories with the id 1, 2 or 3. Please see the FAQ entry on searching for more information.
curl -H "X-TrackerToken: TOKEN" \ -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories?filter=label%3A%22needs%20feedback%22%20type%3Abug(show response)
Get stories with pagination
You can paginate through stories by optionally passing a limit and offset.
curl -H "X-TrackerToken: TOKEN" -X GET "http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories?limit=10&offset=20"(show response)
Manage Stories
Add a new story
When adding a new story, you can specify the story attributes in the HTTP post body, or as URL parameters. This example shows how to use the curl "-d" option to pass XML in the post body:
curl -H "X-TrackerToken: TOKEN" -H "Content-type: application/xml" \ -d "<story><story_type>feature</story_type><name>Fire torpedoes</name><requested_by>James Kirk</requested_by></story>" \ -X POST http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories(show response)
Here is an example of adding a new story with the attributes specified as URL parameters. Notice that there is some special escaping required by curl - you must quote the URL, escape square brackets, and URL-escape spaces.
curl -H "X-TrackerToken: TOKEN" \ -X POST "http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories?story\[name\]=Make%20it%20so&story\[requested_by\]=Picard"(show response)
Update a story
When updating a story, you can specify the story attributes in the HTTP post body, or as URL parameters. This example shows how to use the curl "-d" option to pass XML in the PUT body:
curl -H "X-TrackerToken: TOKEN" -H "Content-type: application/xml" \ -d "<story><estimate>2</estimate><labels>tribbles, phaser</labels></story>" \ -X PUT http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID(show response)
Here is an example of editing a story with the attributes specified as URL parameters. Notice that there is some special escaping required by curl - you must quote the URL, escape square brackets, and URL-escape spaces. Also note that you do not have to quote labels with spaces when you are adding them, only when they are used as part of a filter.
curl -H "X-TrackerToken: TOKEN" \ -X PUT "http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID?story\[labels\]=tribbles,starfleet,alien%20life"(show response)
Add note (comment)
curl -H "X-TrackerToken: TOKEN" -H "Content-type: application/xml" \ -d "<note><text>new note via API</text></note>" \ -X POST http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/notes(show response)
Delete a story
curl -H "X-TrackerToken: TOKEN" -X DELETE http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID(show response)
Deliver all finished stories
This action allows you to take all finished stories and mark them as delivered. This could be used to automate a demo deploy process. The updated stories are returned as the result.
curl -H "X-TrackerToken: TOKEN" -X PUT http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/deliver_all_finished(show response)
Tasks
Get a single task
curl -H "X-TrackerToken: TOKEN" -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/tasks/TASK_ID(show response)
Get all tasks for a story
curl -H "X-TrackerToken: TOKEN" -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/tasks(show response)
Add a task
When adding a task, you can specify the task description in the HTTP post body, or as a URL parameter. This example shows how to use the curl "-d" option to pass XML in the POST body:
curl -H "X-TrackerToken: TOKEN" -H "Content-type: application/xml" \ -d "<task><description>clean shields</description></task>" \ -X POST http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/tasks(show response)
Here is an example of adding a task with the description specified as a URL parameter. Notice that there is some special escaping required by curl - you must quote the URL, escape square brackets, and URL-escape spaces.
curl -H "X-TrackerToken: TOKEN" \ -X POST "http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/tasks?task\[description\]=clean%20shields"(show response)
Update a task
When editing a task, you can specify the attributes in the HTTP post body, or as URL parameters. This example shows how to use the curl "-d" option to pass XML in the PUT body:
curl -H "X-TrackerToken: TOKEN" -H "Content-type: application/xml" \ -d "<task><description>count shields</description><complete>true</complete></task>" \ -X PUT http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/tasks/TASK_ID(show response)
Here is an example of editing a task with the attributes specified as URL parameters. Notice that there is some special escaping required by curl - you must quote the URL, escape square brackets, and URL-escape spaces.
curl -H "X-TrackerToken: TOKEN" \ -X PUT "http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/tasks/TASK_ID?task\[description\]=count%20shields&task\[position\]=2"(show response)
Delete a task
curl -H "X-TrackerToken: TOKEN" -X DELETE http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories/STORY_ID/tasks/TASK_ID(show response)
API Location
The Pivotal Tracker API resides at:
http(s)://www.pivotaltracker.com/services/v2
Warning: You must include www. to avoid a redirect.
Access Control
Token-based Authentication
Tracker uses a token mechanism to authenticate API users, and access control to projects and stories is based on the user's project memberships. Every API request must include the "X-TrackerToken". The token may be added as an HTTP header field or a normal HTTP parameter, for security reasons it is recommended to add it as an HTTP header field. To generate a token, use the "Create New Token" link on the My Profile page. To remove an existing token, click the "remove" link next to the token. It's also possible to generate or obtain a user token using the API, by specifying a username and password.
Disabling API Access for a Project
By default, API access is enabled for all projects. Project owners can disable API Access for their projects on the Project Settings page.
SSL
It is recommended to send API calls via SSL (Secure Sockets Layer), but it is only required when a project has SSL enabled ("Use HTTPS" on the Project Settings page). Sending all API calls via SSL will ensure that all information, including the user's token, is sent encrypted, and not in plain text.
Terminology
Project ID
Project-specific API calls must provide a project ID. You can find the ID of a project on the Project Settings page.
Story ID
For API calls that are specific to a feature, chore, bug or release, a Story ID must be provided. You can find the Story ID at the bottom of any expanded story.
Filters
Some API calls accept a filter parameter. This can be any valid search string which works in the Search box (with the magnifying glass) of a Tracker Project Page. For more details, see the FAQ entry on searching. If you use a multi-word label in a filter, remember that it must be enclosed in double-quotes, and the double-quotes may have to be escaped as well, depending on the language/tool you use to invoke the API. See the examples for more details.
API Token
You must use a token to access the API. A token is a large hexadecimal hash (e.g. 3b6cc1410da3bb4a17ab0ac5aebfa024) and is user-specific. See the Access Control section for more details on tokens.
Invoking the API from different clients
The Tracker API can be invoked from any language or tool which can issue the proper HTTP requests. Here are some examples. HTTP Client is a useful application for testing and experimenting.
Curl Command Line
curl -H "X-TrackerToken: TOKEN" -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories
or
curl -X GET http://www.pivotaltracker.com/services/v2/projects/PROJECT_ID/stories?token=TOKEN
Ruby
require 'rubygems' require 'hpricot' require 'net/http' require 'uri' resource_uri = URI.parse("http://www.pivotaltracker.com/services/v2/projects/#{PROJECT_ID}") response = Net::HTTP.start(resource_uri.host, resource_uri.port) do |http| http.get(resource_uri.path, {'X-TrackerToken' => 'TOKEN'}) end doc = Hpricot(response.body).at('project') @project = { :name => doc.at('name').innerHTML, :iteration_length => doc.at('iteration_length').innerHTML, :week_start_day => doc.at('week_start_day').innerHTML, :point_scale => doc.at('point_scale').innerHTML }
ActiveResource
require 'rubygems' require 'activeresource' class Story < ActiveResource::Base self.site = "http://www.pivotaltracker.com/services/v2/projects/:project_id" headers['X-TrackerToken'] = 'TOKEN' end # Create a story Story.create(:name => "Mach Speed ", :requested_by => "James Kirk", :description => "do it now", :project_id => PROJECT_ID) # Find stories Story.find(STORY_ID, :params => {:project_id => PROJECT_ID}) Story.find(:all, :params => {:project_id => PROJECT_ID}) Story.find(:all, :params => {:filter => "label:'needs feedback' type:bug", :project_id => PROJECT_ID}) # Update a story story = Story.find(STORY_ID, :params => {:project_id => PROJECT_ID}) story.name = "More speed Scotty" story.save
Python
import urllib import urllib2 from xml.dom import minidom url = "http://www.pivotaltracker.com/services/v2/projects/%s" % PROJECT_ID req = urllib2.Request(url, None, {'X-TrackerToken': 'TOKEN'}) response = urllib2.urlopen(req) dom = minidom.parseString(response.read()) doc = dom.getElementsByTagName('project')[0] project = { 'name' : doc.getElementsByTagName('name')[0].firstChild.data, 'iteration_length' : doc.getElementsByTagName('iteration_length')[0].firstChild.data, 'week_start_day' : doc.getElementsByTagName('week_start_day')[0].firstChild.data, 'point_scale' : doc.getElementsByTagName('point_scale')[0].firstChild.data }


For a detailed documentation please refer to https://hyperledger-indy.readthedocs.io/en/latest/ and https://github.com/hyperledger/aries. In order to run an End 2 End testing of the app you need to have configured an local/remote Indy Server App.


Hacking Was Never about “How to hack” this and that , there is so many youtube channels out there who make videos like “how to hack “ or how to use a certain tool , rather then explaining the underlying concepts. understanding concepts on a lower level , and using those concepts to discover and break things,is what i call hacking . that’s how at least i look at it,but it really takes a lot of time and unfortunately it’s not that simple.. I believe the following quote holds true, so don’t expect to become a skilled hacker in one night
anyone can master a skill with 10,000 hours of practice
so what i recommend doing is :
Learn How to use Linux
Learn About Assembly and C
I highly Recommend Watching This Youtube Playlist
Practice programming - it doesn’t matter what (website, game, mobile app, …)

Play random CTFs from ctftime and afterwards study writeups of challenges you couldn’t solve
Play wargames like overthewire, PicoCTF
here is also a curated list of ressources that will help u through :
Systems :
Corelan Team’s Exploit writing tutorial
Reverse Engineering :
Tutorials :
Tools :
The famous Tool developed by NSA’s Research Directorate: Ghidra
dotPeek - a free-of-charge .NET decompiler from JetBrains
Web :
Free class for web security by Hackerone
World’s largest Infosec and Hacking Portal.
Web Security Academy: Free Online Training from PortSwigger
Hack The Box is an online platform allowing you to test and advance your skills in cyber security.


At A.D's Machinery, we strive to provide better customer service than any other power tool supplier!
If you're unhappy with a product, we have a 30 day "change of mind" policy. If you want to know how to
do this, check out our "How do I return a product?" details on this page!
All our products are backed by A.D's minimum 1 year warranty period. Many brands will also offer extended
manufacturer's warranties. Check the manufacturer's website for more details relating to that.
Otherwise, you can view the warranty periods on any of my products by viewing their details page!
Even though A.D's uses only the most reliable courier and freight services, this can happen! In the unlikely scenario that
something goes amiss during transportation of your order, contact us as soon as possible quoting your order ID and we'll look
into the problem for you and get back to you!
If your order qualifies for return according to our warranty or returns policies, ensure that the product is wrapped in its original packaging
and drop us a line. We'll give you the details needed to send the product back to A.D's or the relevant manufacturer.
Didn't find what you were looking for?
Send us a quick message and we'll get back to you as soon as possible!


HI guys, hope you are well.
Apologies for novice questions, I am new to this.
I would like to use my arduino uno to make a type of circuit breaker for 230V loads. I have got an emontx shield and some CTs and am in the process of creating the test rig.
Where can I find some code to take the current I am measuring with the CTs and set a limit, that when passed sends a signal to a digitl i/o and then to a relay to turn off the supply?
Any other help is most appreciated.
Thanks
Re: Using arduino as circuit breaker
If there is the slightest possibility of the safety of any person or property being put at risk should your project fail to operate as intended, DON'T DO IT.
In any case, you must have a proper protection, a circuit breaker or fuse, in place. You also probably need to make your device 'fail-safe' - in other words, you have to evaluate whether failing to turn off the supply is better or worse that turning it off, insofar as you can predict the failure mode of your device.
Having written all that, a demo sketch on Github for the Shield is your starting point. You need to add a relay board driven by one of the I/O ports, and you need (presumably) a pushbutton to turn on the output and the relay, and you need to detect that the rms (or the peak - remember polarity) is greater than some limit and use that to turn the output off. You might well want to start with one of Robin's (calypso_rae) 'continuous' sketches so that your sketch can react immediately (meaning after only 1 cycle). Or you might decide that it's possible to accept a short-term overload (mimicking a standard circuit breaker), in which case you'll need to accumulate the 'overcurrent' value and only trip the output when a predetermined value of that is exceeded.
Re: Using arduino as circuit breaker
Brill, thank you very much.
I must stress this is only experimental and will not be controlling genuine circuits, it's just a thought I had. The test rig is set to run at approx 2A with a 3A fuse and RCD back up with all cables and connections adequately protected and covered, I was an electrician many years ago so the safety aspect is something I take seriously. The arduino will be set to operate at 1A, when the load bank exceeds that I hope to isolate supply.
Cheers, this gives me a good starting point.
Re: Using arduino as circuit breaker
"I was an electrician many years ago so the safety aspect is something I take seriously."
I had no means of knowing that, and let's just say that some individuals can have a cavalier attitude to safety, so I was urging caution for reasons obvious to you, but possibly not to others.
There's an interesting bit of software coming if you want "thermal" trips. And make sure you have a fairly low ratio CT if you want 2 or 3 A max scale - the split-core YHDC-013-000 with the standard burden is barely reliable at 1 A.
Re: Using arduino as circuit breaker
Or since the fault current is limited upstream, pass the load wire n times through the core to get a scaling factor of ~n.
Re: Using arduino as circuit breaker
Thanks for the feedback, the YHDC CT is a starting point but is not too effective at low amps, unfortunately that is what I am starting with so will have to see where I get! Have already thought of looping the wire to scale up the current, which seems a simple way to improve accuracy.
The 'thermal' software sounds interesting, would be good to see.
Found interesting using the openenergy.org method in different way
http://www.homautomation.org/2013/09/17/current-monitoring-with-non-inva...


#include <USBDescriptors.h>
#include <HIDDescriptors.h>
#include <USBRequests.h>
#include "USBD.h"
#include <USBDDriver.h>
Go to the source code of this file.
Classes | |
| struct | _HIDDTransferDriverConfigurationDescriptors |
Macros | |
| #define | HIDDTransferDriver_REPORTSIZE 32 |
| Size of the input and output report, in bytes. More... | |
| #define | HIDDTransferDriver_REPORTDESCRIPTORSIZE 32 |
| Size of the report descriptor, in bytes. More... | |
Typedefs | |
| typedef struct _HIDDTransferDriverConfigurationDescriptors | HIDDTransferDriverConfigurationDescriptors |
| List of descriptors that make up the configuration descriptors of a device using the HID Transfer driver. More... | |
Functions | |
| void | HIDDTransferDriver_Initialize (const USBDDriverDescriptors *pDescriptors) |
| Initializes the HID Transfer device driver. More... | |
| void | HIDDTransferDriver_ConfigurationChangedHandler (uint8_t cfgnum) |
| Handles configureation changed event. More... | |
| void | HIDDTransferDriver_RequestHandler (const USBGenericRequest *request) |
| Handles HID-specific SETUP request sent by the host. More... | |
| uint16_t | HIDDTransferDriver_Read (void *pData, uint32_t dLength) |
| Try to read request buffer of interrupt OUT EP. More... | |
| uint16_t | HIDDTransferDriver_ReadReport (void *pData, uint32_t dwLength) |
| Try to read request buffer of SetReport. More... | |
| uint8_t | HIDDTransferDriver_Write (const void *pData, uint32_t dLength, TransferCallback fCallback, void *pArg) |
| Write data through USB interrupt IN EP. More... | |
| void | HIDDTransferDriver_RemoteWakeUp (void) |
| Starts a remote wake-up sequence if the host has explicitely enabled it by sending the appropriate SET_FEATURE request. More... | |
Definition of methods for using a HID transfer device driver.


Demo App: Dictator
Language:
English (GB)
English (US)
French
German
Italian
Spanish
Text input
Spell Check
Analyze Text
Save Post
Speech Recognition
Mode:
Interactive
Conversation
Dictation
Format:
Simple Result
Detailed Result
Profanity:
Raw
Masked
Removed
(not working)
Start Recording
Stop Recording
Camera Image
Smile! (Or don't.)
Detect Emotion
Current status:


Octocat Signal
Your friendlier interface to Github Status.
(optional, leave blank for all notifications)


{% extends "layout.html" %} {% block pageTitle %} GOV.UK prototyping kit {% endblock %} {% block content %} {% import "release2-2/elements.html" as elements %} {% for page in data %} {% for question in page.healthcareprofessional %} {{ elements.backButton(page,question) }} Enter your email address again You've not used the service for a while so you've been timed out We do this for security. Any information you entered on the page you were last on has not been saved. Any information you entered on the previous pages has been saved {{ elements.helpline(page) }} {{ elements.validation(page,question) }} {% endfor %} {% endfor %} {% endblock %}
You've not used the service for a while so you've been timed out
We do this for security. Any information you entered on the page you were last on has not been saved.
Any information you entered on the previous pages has been saved


| Home | Trees | Indices | Help |
|---|
|
|
object --+ | Context
Context object for running the Hungarian algorithm. Contains algorithm variables. Attributes: g: The complete bipartite graph we will find a maximum matching for. left: The set of left nodes. right: The set of right nodes. labels: Dictionary of vertex names to numeric algorithm label. num_matched: Current number of matched edges s: Set of left nodes in the augmenting tree t: Set of right nodes in the augmenting tree matches: Dictionary where matches[n] = m (and matches[m] = n) if n and m are currently matched. slack: Dictionary keyed on y, where slack[y] = min(for x in S: labels[x] + labels[y] - weight(x, y)) slackx: Dictionary keyed on y, where slackx[y] is the node in right which gives y its current slack value. prev: Dictionary keyed on a node x in S, where prev[x] is the previous node in S along x's path in the augmenting tree.
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
Inherited from |
|
|||
|
Inherited from |
|
x.__init__(...) initializes x; see help(type(x)) for signature
|
Find a maximum matching for a bipartite graph. This is O(n^3) implementation of the Hungarian method for complete bipartite matching problems. Args: graph: A networkx graph object, assumed to be bipartite. Returns: A dictionary keyed on node names in left to node names in right. |
Find an augmenting path starting from an unmatched node in |left|. Start with a root node in |left| and attempt to find an augmenting path starting from |root|. In order for a path to be augmenting, each edge in the path must have: weight(x, y) == labels[x] + labels[y]. The set of all edges which have this property is known as the "equality subgraph" for the current vertex labeling. In addition, an augmenting path must start with an unmatched edge and end with an unmatched edge; augmenting the path flips the matched-ness of each edge, so that the total number of matched edges increases by 1. If an augmenting path does not exist, we update the labels of all nodes in S and T to force new edges into the equality subgraph. Eventually, an augmenting path will be generated this way. |
Find an augmenting path for the current labeling. Perform a BFS to find an augmenting path for the current labeling. Args: queue: Queue for performing BFS traversal. Returns: found: True if path was found. x: Left vertex of final path edge. y: Right vertex of final path edge. |
Find a final edge for an augmenting path after updating labels. At least one new edge should have been added to the equality subgraph, so we check if any new edges will create an augmenting path. Args: queue: Queue for performing BFS traversal. Returns: found: True if path was found. x: Left vertex of final path edge. y: Right vertex of final path edge. |
Update labels to expand the equality subgraph. We will find the smallest slack value of a vertex in Right - T. The labels for vertices in S will decrease by slack, while the vertices in T increase by slack. This guarantees at least one vertex in Right will have a slack value of 0, thereby adding it to the equality subgraph. |
Adds |x| to the current augmenting tree. x is a node which has already been matched to a node y in Right (which is itself connected to prevx via a non-matching edge in the equality subgraph). We indicate prevx comes before x in the tree so we can trace the path later. Args: x: Node which has already been matched to a node y in right prevx: Previous node in Left along the path. |
| Home | Trees | Indices | Help |
|---|
| Generated by Epydoc 3.0.1 on Mon Feb 27 16:17:07 2017 | http://epydoc.sourceforge.net |


ConsoleX
History
Snippets
Options
Launch
Terminate shell
Clear shell (Ctrl/Cmd + K)
Clear editor on send
Send to shell (Ctrl/Cmd + Enter)
Console
Options
How should I send the code to the server ?
Send as single lines
Send as multiple lines
Restore code on load
Reset
Close
Command History
Erase command history
Close
Snippets
Erase All Snippets
Close
Launch Settings
Choose a command to start IEX with:
iex
iex -S mix
erl
Other
Cancel
Launch Shell