November 1, 2012
Spoilers, obviously.
As we’ve discussed, in Batman Begins 1960s-style full employment and antipoverty programs lead to skyrocketing crime while in The Dark Knight Rises 1980s-style tough-on-crime policies and neoliberal economics lead to a revolt of the economic underclass. The films are mirror images, one about the failure of liberal policies; the other about the failure of conservative policies. In this sense, The Dark Knight is truly the final film in this nihilistic trilogy, documenting the hopelessness of anything outside that usual left-right struggle.
From the start, the city is torn about how to handle the Batman, who has inspired a wave of second-rate imitators. Some believe it’s wrong to be idolizing a masked vigilante, but most (including the new DA, Harvey Dent) approve of his results.
Dent is doing his own part to lock up the criminals, working inside the system. He’s arrested all the mob bankers (except Lau) and is now going after the gangsters themselves, starting with mob boss Maroni (who took over for mob boss Falcone). But while the prosecutions bring him a great deal of political attention, they don’t seem to achieve much in the way of concrete results — new gangsters spring up to take the place of whoever Dent arrests.
Dent decides the only way to win is to go big — really big. He arrests everyone at once, on charges that are unlikely to stick.  He cites the Romans who suspended democracy to protect their city.  He hopes to take up Batman’s mantle, but do it from inside the system.
But, as the mayor explains, Dent isn’t just taking on his own sense of ethics, he’s taking on the entire system: “the mob, politicians, journalists, cops — anyone whose wallet’s about to get lighter”. If he fails, both of their careers are over.
Just as Dent is frustrated with the justice system, the Joker is frustrated with the criminals. He tells them they need to go big: they need to kill the Batman. He offers to do it for a sizable sum of money, which the gangsters eventually agree to. The Joker is obsessed with the homo economicus of game theory (from whence his name?): when the gangsters ask why he needs the money to kill the Batman, he explains “Like my mother used to tell me: if you’re good at something, never do it for free.”
The film opens with the Joker hiring five men to rob a mob bank: Dopey silences the alarm, Happy shoots him and drills through the vault, Grumpy shoots him and empties the cash into duffel bags, a bus runs him over, Bozo shoots the bus driver. Finally, Bozo pulls off his mask to reveal he’s the Joker. This is a classic pirate game and, just as in the theory, the Joker gets to keep almost all the cash.
Batman eventually tries to track down the Joker by threatening the gangster Maroni. But it’s no use, as Maroni explains: “No one’s gonna tell you anything—they’re wise to your act—you got rules. The Joker, he’s got no rules. No one’s gonna cross him for you.” This is a straightforward application of game theory’s Davies-Folk theorem: the rational thing is to seem irrational so your opponents can’t count on you doing the rational thing.
Alfred sees this quickly, because it reminds him of a story from his own past:
I was in Burma. A long time ago. My friends and I were working for the local government. They were trying to buy the loyalty of tribal leaders, bribing them with precious stones. But their caravans were being raided in a forest north of Rangoon by a bandit. We were asked to take care of the problem, so we started looking for the stones. But after six months, we couldn’t find anyone who had traded with him. … One day I found a child playing with a ruby as big as a tangerine. … The bandit had been throwing the stones away. … Some men just want to watch the world burn.
Note the parallels. In Alfred’s story the entire status quo (including the local government and tribal leaders) is totally corrupt: the official plan is to bribe people. But the plan is defeated by someone even crazier, someone willing to steal the money but not interested in keeping it for himself.
Sure enough, when the Joker finally does get his hands on the money, he merely lights it on fire.
Meanwhile, Dent’s ethical compromises begin to grow and grow. When he kidnaps one of the Joker’s thugs, he tries to threaten information out of him. This is something Batman does routinely, but Batman reminds Dent that Dent can’t get away with that sort of thing — it’d destroy his credibility as an insider.
In a climactic scene, the Batman finally confronts the Joker in the middle of the street. The Joker knows Batman lives by just one rule (“I will not be an executioner”) and encourages him to break it and kill him. But Batman can’t bring himself to do it, he swerves at a key moment and ends up smashed while the Joker survives. (Yep: the Joker has just won the game of chicken.)
When he comes to, the Joker tells Batman that despite nominally working outside the system, he’s actually just the system’s pawn:
To them you’re a freak like me. They just need you right now. … But as soon as they don’t, they’ll cast you out like a leper. … Their morals, their code… it’s a bad joke. Dropped at the first sign of trouble. They’re only as good as the world allows them to be. You’ll see—I’ll show you…
You have these rules. And you think they’ll save you. … [But t]he only sensible way to live in this world is without rules.
Gordon arrests the Joker and takes him to the major crimes unit, only to find the Joker claiming Gordon does not actually control the unit — his people actually working for mob boss Maroni. “Does it depress you, Lieutenant, to know how alone you are?” he asks (a classic principal-agent problem).
The Joker has kidnapped both Dent and Rachel and set them both to blow so that Batman can only rescue one (opportunity cost). Batman goes to rescue Rachel but the Joker has switched their addresses and he actually ends up rescuing Dent^1^. Rachel dies and Dent loses half his face, becoming Two-Face.
Reese, one of Bruce Wayne’s employees goes on TV and threatens to reveal the identity of the Batman, but the Joker calls in and asks him to stop. “I had a vision,” he says. “Of a world without Batman. The mob ground out a little profit and the police tried to shut them down, one block at a time… and it was so… boring. I’ve had a change of heart.” He threatens to blow up a hospital unless someone kills Reese.
At the hospital, the Joker explains things to Dent:
Do I really look like a guy with a plan, Harvey? I don’t have a plan… The mob has plans, the cops have plans. … Maroni has plans. Gordon has plans. Schemers trying to control their worlds.
It’s the schemers who put you where you are. You were a schemer. You had plans. Look where it got you. … Nobody panics when the expected people get killed. Nobody panics when things go according to plan, even if the plan is horrifying. If I tell the press that tomorrow a gangbanger will get shot, or a truckload of soldiers will be blown up, nobody panics. Because it’s all part of the plan. But when I say that one little old mayor will die, everybody loses their minds! Introduce a little anarchy, you upset the established order and everything becomes chaos. I’m an agent of chaos. And you know the thing about chaos, Harvey? … It’s fair.
This pushes Dent over the edge. He starts going after everyone responsible for killing Rachel: He starts with Weurtz, who kidnapped him. Weurtz gives up Maroni, who points to Ramirez, who helps him get Gordon’s family, who naturally gets Gordon.
Batman, meanwhile, is also crossing lines. In his attempt to find the Joker, he has turned every cell phone into a spy device. Even he admits this might be too much power for one man to have.
The Joker scares the city onto its two ferries.  The passengers discuss and vote. One of the prisoners makes a Ulysses pact and credibly commits by tossing the detonator overboard.
The Joker also took a busload of people from the hospital to the Prewitt Building where, through the window, you can see Joker’s thugs with guns holding hospital people hostage. Gordon rushes in to get the thugs, but Batman discovers the thugs are hostages and the hostages are the thugs.  Neither of the boats decides to blow up the other and Batman prevents the Joker from triggering the failsafe.)
He then goes to rescue Gordon, who is trying to stop Dent from killing his family. Dent explains his new philosophy:
You thought we could be decent men in an indecent time. You thought we could lead by example. You thought the rules could be bent but not break…^2^ you were wrong. The world is cruel. And the only morality in a cruel world is chance. Unbiased. Unprejudiced. Fair.
 Dent thought he could clean up the system by pushing righteously from the inside, but ended up cutting more and more ethical corners until his own personal obsessions ended up making him a monster. The Joker had by far the most interesting plan: he hoped to out-corrupt the corrupters, to take their place and give the city “a better class of criminal”.
And the crazy thing is that it works! At the end of the movie, the Joker is alive, the gangsters and their money launderers are mostly dead, and their money has been redistributed (albeit though the deflationary method of setting it on fire). And, as we see from the beginning of the third movie, this is a fairly stable equilibrium: with politicians no longer living in fear of the gangsters, they’re free to adopt tough anti-crime policies that keep them from rising again.^3^
The movie concludes by emphasizing that Batman must become the villain, but as usual it never stops to notice that the Joker is actually the hero. But even though his various games only have one innocent casualty, he’s much too crazy to be a viable role model for Batman. His inspired chaos destroys the criminals, but it also terrorizes the population. Thanks to Batman, society doesn’t devolve into a self-interested war of all-against-all, as he apparently expects it to, but that doesn’t mean anyone enjoys the trials.
Thus Master Wayne is left without solutions. Out of options, it’s no wonder the series ends with his staged suicide.
I’m actually not sure which game this is supposed to be. It’s a bit like the poisoned goblets game in The Princess Bride, but I can’t find a name for it in the literature. ↩
These two sentences are in the shooting script but got cut from the film version: “You thought we could lead by example. You thought the rules could be bent but not break…” ↩
This also explains why the law-and-order crowd seems so miffed about succeeding — it wasn’t actually their policies that succeeded. ↩


Class PackageFile
Stores the configuration of a package.
Direct known subclasses
Puli\Manager\Api\Package\RootPackageFile
Namespace: Puli\Manager\Api\Package
Author: Bernhard Schussek<EMAIL_ADDRESS>Since: 1.0
Located at Api/Package/PackageFile.php
Author: Bernhard Schussek<EMAIL_ADDRESS>Since: 1.0
Located at Api/Package/PackageFile.php
public
|
#
__construct( string|null $packageName = null, string|null $path = null )
Creates a new package file. |
public
string
|
|
public
|
|
public
string|null
|
|
public
|
|
public
string|null
|
|
public
|
#
setOverriddenPackages( array $packageNames )
Sets the names of the packages this package overrides. |
public
|
|
public
|
|
public
|
|
public
string[]
|
|
public
boolean
|
#
hasOverriddenPackage( string $packageName )
Returns whether the package overrides a given package. |
public
boolean
|
|
public
|
|
public
|
|
public
boolean
|
#
hasPathMapping( string $repositoryPath )
Returns whether the file contains a path mapping for a repository path. |
public
boolean
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
#
getBindingDescriptor( Rhumsaa\Uuid\Uuid $uuid )
Returns the binding descriptor with the given UUID. |
public
|
#
addBindingDescriptor(
Adds a binding descriptor. |
public
|
|
public
|
|
public
boolean
|
#
hasBindingDescriptor( Rhumsaa\Uuid\Uuid $uuid )
Returns whether the binding descriptor exists in this file. |
public
boolean
|
|
public
|
#
addTypeDescriptor(
Adds a type descriptor. |
public
|
|
public
|
|
public
|
|
public
|
|
public
boolean
|
|
public
boolean
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
|
|
public
mixed
|
|
public
array
|
|
public
boolean
|
|
public
boolean
|
string |
DEFAULT_VERSION
The current puli.json version. |
#
'1.0'
|


The exact API of all functions and classes, as given by the docstrings.
The API documents expected types and allowed features for all functions,
and all parameters available for the algorithms.
Other machine learning packages for Python and
related projects. Also algorithms that are slightly out of
scope or not well established enough for scikit-learn.


Collaborative Github Workflow¶
For developers interested in expanding pymatgen for their own purposes, we recommend forking pymatgen directly from the pymatgen GitHub repo. Here’s a typical workflow (adapted from http://www.eqqon.com/index.php/Collaborative_Github_Workflow):
Note
Ignore the Github fork queue. Let the maintainer of pymatgen worry about the fork queue.
Create a free GitHub account (if you don’t already have one) and perform the necessary setup (e.g., install SSH keys etc.).
Fork the pymatgen GitHub repo, i.e., go to the main pymatgen GitHub repo and click fork to create a copy of the pymatgen code base on your own Github account.
Install git on your local machine (if you don’t already have it).
Clone your forked repo to your local machine. You will work mostly with your local repo and only publish changes when they are ready to be merged:
git clone git@github.com:YOURNAME/pymatgen.git
Note that the entire Github repo is fairly large because of the presence of test files, but these are absolutely necessary for rigorous testing of the code.
It is highly recommended you install all the optional dependencies as well.
Code (see Coding Guidelines). Commit early and commit often. Keep your code up to date. You need to add the main repository to the list of your remotes. Let’s name the upstream repo as mpmaster (materialsproject master).
git remote add mpmaster git://github.com/materialsproject/pymatgen.git
Make sure your repository is clean (no uncommitted changes) and is currently on the master branch. If not, commit or stash any changes and switch to the master.
git checkout master
Then you can pull all the new commits from the main line
git pull mpmaster master
Remember, pull is a combination of the commands fetch and merge, so there may be merge conflicts to be manually resolved.
Publish your contributions. Assuming that you now have a couple of commits that you would like to contribute to the main repository. Please follow the following steps:
If your change is based on a relatively old state of the main repository, then you should probably bring your repository up-to-date first to see if the change is not creating any merge conflicts.
Check that everything compiles cleanly and passes all tests. The pymatgen repo comes with a complete set of tests for all modules. If you have written new modules or methods, you must write tests for the new code as well (see Coding Guidelines). Install and run nosetest in your local repo directory and fix all errors before continuing further. There must be no errors for the nosetest.
If everything is ok, publish the commits to your github repository.
git push origin master
Now that your commit is published, it doesn’t mean that it has already been merged into the main repository. You should issue a merge request to pymatgen’ maintainers.
Coding Guidelines¶
Given that pymatgen is intended to be long-term code base, we adopt very strict quality control and coding guidelines for all contributions to pymatgen. The following must be satisfied for your contributions to be accepted into pymatgen.
- Unittests are required for all new modules and methods. The only way to minimize code regression is to ensure that all code are well-tested. If the maintainer cannot test your code, the contribution will be rejected.
- Python PEP 8 code style. We allow a few exceptions when they are well-justified (e.g., Element’s atomic number is given a variable name of capital Z, in line with accepted scientific convention), but generally, PEP 8 must be observed.
- Python 3. All code should seamless work with Python 2.7 and Python 3.x. Please read Python’s official guidelines on how to write Python 3.x compatible code, including the usage of the “six” package. It is recommended that you install the “python-modernize” package and run it before submitting any pull requests.
- Documentation required for all modules, classes and methods. In particular, the method docstrings should make clear the arguments expected and the return values. For complex algorithms (e.g., an Ewald summation), a summary of the alogirthm should be provided, and preferably with a link to a publication outlining the method in detail.
- IDE. We highly recommend the use of Pycharm or Eclipse + PyDev. You should also set up pylint and pep8 and turn those on within the IDE setup. This will warn of any issues with coding styles.
For the above, if in doubt, please refer to the core classes in pymatgen for examples of what is expected.
A word on coding for Python 3 compatibility¶
With effect from version 3.0, all pymatgen code must be both Python 2.7+ and 3 compatible. Specifically, we have adopted the following practices throughout pymatgen.
Unicode-always. Unless you are absolutely sure you need byte literals (rare for pymatgen), always use unicode. In particular, the following should be the first line of all pymatgen modules:
from __future__ import division, print_function, unicode_literals
Future division means that 1/2 returns a float (0.5), which is more intuitive scientifically, instead of 0 (default integer division in Python 2). print_function ensures that print() is used instead of the print statement. And unicode_literals makes it such that all strings are treated as unicode by default. If you need to use bytes, those should be marked up explicitly as b’byte literal’.
Use of the six package. Where necessary, use the six package to handle interoperability between Python 2 and 3. Examples include the six.moves functions (common ones are zip, filter, map), and six.stringtypes (testing for string types, which should be rarely done).
Python-modernize. Use python-modernize to check your code for any potential changes that need to be made.
Unit testing. The entire pymatgen code base is continuously being tested in both Python 2.7 and >=3.3. If your code fails either of the tests, you need to fix it.


Pressure on Silva as Everton loses at home to Norwich 2-0
LIVERPOOL, England (AP) - Norwich climbed off the bottom of the English Premier League by beating Everton 2-0 for its first away win of the season, piling the pressure back on home manager Marco Silva on Saturday.
After a goalless 10 hours and 20 minutes on the road, Norwich scored through Todd Cantwell - his first goal since the team’s last league success, at home to Manchester City in September - and added an injury-time effort from Dennis Srbeny.
The win lifted Daniel Farke’s side to within a point of escaping the bottom three and left Everton just four points above the relegation zone, after a sixth defeat in nine league games.
Silva is looking over his shoulder as seven of Everton’s next nine matches are against tough opponents - second-placed Leicester (twice), Liverpool, Chelsea, Manchester United, Arsenal and Manchester City.
More AP soccer: https://apnews.com/Soccer and https://twitter.com/AP_Sports
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


DJ Black Coffee confirms divorce reports: 'It has been the most heart breaking and challenging period'
Graye Morkel
Cape Town - In a statement released on Twitter, DJ Black Coffee (Nkosinathi Innocent Maphumulo) has addressed reports that his wife, Enhle Mbali has filed for divorce.
This comes after the Broken Vows actress publicly addressed rumours on Sunday after Sunday Sun published intimate details about the couple's divorce.
Enhle indirectly verified the findings, saying: "The situation that is happening right now, in my life, is indeed happening. [sic]"
According to the local tabloid newspaper, Enhle filed for a protection order at the Randburg magistrate court in October against Black Coffee's sister Nomalanga Maphumulo.
In the release, which was accompanied by the caption "a statement," Black Coffee says: "After much deliberation since the story of our relationship broke in public, I wish to state that we have been trying to sort our problems amicably and in private for almost a year now and it has been the most heart breaking and challenging period. [sic]"
He adds that there are two sides to the story and that he will not discuss his private life in the public, "let alone speak ill of [his] partner or [his] in-laws."
"As Mbali has stated, our priority are to protect our children at this point. [sic]," he says.
He then proceeds to ask for privacy as the matter had been handed over the court.
READ THE FULL STATEMENT HERE:
The couple tied the knot during a traditional wedding ceremony in 2011 and celebrated their union with a white wedding in 2018.
City Press first reported in July that the couple were allegedly heading for divorce court, citing the DJs rumoured infidelities and meddling family members as the reason for Enhle serving her husband with divorce papers.
ALSO READ: Sex tapes and extortion: A timeline of Black Coffee's struggle with past cheating scandals


The official MongoDB Scala Driver, providing asynchronous event-based observable sequences for MongoDB.


Running the app
Make sure you have two terminal windows open, and navigate to your root directory in both.
Running Redis
In one terminal window, we'll run the Redis Queue.
$ rq worker my-task-queue
In your window, you should see a message like:
15:46:03: Worker rq:worker:e9f2ed95fc3e48429fc3962fe0f0c03b: started, version 1.2.0
15:46:03: *** Listening on my-task-queue...
15:46:03: Cleaning registries for queue: my-task-queue
Note that you can change the name of the task queue in the application factory.
Running the app
In the other terminal window, we'll run the Flask app.
$ python app.py
In your window, you should see a message like:
15:54:51: Server initialized for eventlet.
15:54:51: * Restarting with stat
15:54:52: Server initialized for eventlet.
15:54:52: * Debugger is active!
15:54:52: * Debugger PIN: 183-643-336
(3516) wsgi starting up on http://<IP_ADDRESS>:5000
Viewing the app
Navigate to http://localhost:5000 in your browser. Notice the following message in your redis terminal:
Complex task started
Progress: 0.0%
Progress: 20.0%
Progress: 40.0%
Progress: 60.0%
Progress: 80.0%
Progress: 100.0%
Complex task finished
While the complex task is executing, you'll see the loading gif in your browser. After the worker has finished, the page will reload with a 'Hello, World!' message.


You're not allowed to be here, turn around and head back to where you came from!
You're not authorized to view this content. This is NOT a credential error, you're just not allowed to be here. (error 403)


Kansas City
Directed by Robert Altman (The Player)
Starring Jennifer Jason Leigh, Miranda Richardson, Harry Belafonte, Steve Buscemi, Dermont Mulroney
As Reviewed by James Brundage
I'll be honest, Kansas City is Robert Altman's worst film. Normally, when I open a review with a line like that, I follow it up with an explanation of how, even though it was his worst film, it still is mediocre. But, I'll be honest once again, Kansas City isn't even a good film.
Kansas City follows Blondie (Jennifer Jason Leigh), a desperate wife of Johnny O'Hara (Mulroney) in her quest to get him back. Johnny O'Hara is a thief who robbed a black gambler only to be quickly caught and imprisoned by Seldom Seen (Belafonte). Blondie decides to kidnap Caroline (Richardson) and use her as leverage against her connected husband to have him send in Italians to free Johnny.
Now, you're probably thinking what I was thinking. How the hell does that turn into a movie two hours long. The answer, of course, is a series on unnecessary plot devices and intercut jazz soundtrack. The jazz soundtrack, in fact, is the only thing that kept me from turning the video off and watching Mother Night, my other film for my snowed-in day.
Like Short Cuts, Kansas City incorporates jazz into the story. In Short Cuts it was part of the story. In Kansas City, it may have well been the story. Admittedly, the performances weren't bad, with Miranda Richardson giving a more-than-convincing performance as the opium-addict politician's wife. But there wasn't much of a plot, there wasn't any point, and there wasn't anything special.
It doesn't function as thriller, as noir, as drama, as comedy, or as any other genre you can imagine. Nor does it deliver the standard excellence of Robert Altman's normally adept direction.

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


{% extends "shared/_layout.html" %} {% block additional_css %} {% endblock %} {% block main_content %}
Notasi is designed for 2 different types of people:
Roughly described as a data hub, Notasi deliberately does not care about what the data looks like going in. It does not try to format the data or make it conform to a standard.
Unlike most data warehouses, hubs or connectors, users only need to format the data when it is pulled out of Notasi. This delays decisions that are nearly impossible to make correctly when first starting out.
 Notasi handles the rest.
Notasi has been built to have the lowest possible barrier of entry. While scaling Notasi should be possible, it’s designed to help users solve their problems until they’re ready for other enterprise solutions.
if you understand:
SELECT
column
FROM
tab1
inner join tab2 on tab1.x = tab2.y
then you can implement and use Notasi
Addresses, Ports, Usernames, Passwords, Database names, URLs, Headers and Bodies are encrypted using AES 128 bit encryption and a randomly generated key stored in config.py. If this is not strong enough for you, don’t use Notasi. Better yet, let me and and help me improve Notasi!
A location can be a:
All queries need a name and a linked location. Beyond that, each different type on location requires different information:
| Location Type | Query Details |
|---|---|
| SQL databases | SQL databases need a standard SQL query in the Request Body field. For safety, it’s best to use fully qualified table names |
| Folder | Folders are simple, they just need a file name in the Request Body field |
| HTTP | HTTP locations need lots: Endpoint Request Method Headers Request Body |
All views need a name, a view name, and a linked query.
Once a view is defined, a Postgres view is built. Views are defined by business keys and information columns:
| Column Type | Purpose |
|---|---|
| Business Key | Business keys make up a row’s identifier. They are what makes a row unique |
| Information Column | Information columns contain the information you want to store. They are how Notasi knows when to store a change |
This is where the real power of Notasi is; you can query the data lake and feed the results directly into another query.
After you’ve defined a view, you can query the results in another query’s Data Lake Query field.
If a data lake query is entered, the results can be used in curly brackets,{variable_name}
, in the endpoint, header and body fields. The resulting query is run once per data lake query row.
Notasi is built on PostgreSQL.
Database: notasi
Username: notasi
Password: In config.py, or printed at install
Views are built with their defined names.


Diagram Editable
Connections can be created and edited on the fly using drag and drop. In this example, computers are sources whereas
servers are the targets. Once a connection is created, removed or changed using drag and drop, diagram makes an ajax request
to save changes in the backend model. Additionally, optional ajax events are provided as callbacks.


Seva Sadan Society is a century-old non-profit organization that provides a nurturing & secure environment for underprivileged girls. With the number of donations and the society growing, came the necessity of creating a new website that could clearly show the community what Seva Sadan Society was developing into. The SSS team engaged us to simplify the donation architecture and overhaul their digital experience to elevate their identity, strengthen their connection to donors, and reflect the detail and warmth they put into the girls' lives.
To better understand the donation flows and ensure we don't compromise any core donation decisions, we started by understand their process and created a site-map. To give SSS's team a clear vision of our thought process, we went ahead and showed them the hi-fidelity wireframes (with thoughtful iterations made internally), so plain boxes don't bother them, and functionality becomes the focus.
The project called for a functional design system in modularity and utility but, elevated in warmth and board information. We included Serif and sans serif typography in contrast with one another to emphasize and contribute to the feeling of the brand. From our color palette to typography selections to large imagery, our goal was to improve readability, emphasize focus, and visually mirror the unique facility experiences.
Stories are what give life to the SSS, and it is way beyond about the organization. We included the story bites across the site to keep it engaging and show SSS's personality.
Throughout the site, we blended content and donation option to help donor(s) explore the stories, their impact, and varied donation options. We segmented the donation options to make the selection quick and easy, followed by steps to make donations frictionless.
So that the users of today can embrace the technology of tomorrow, it needs to be reachable on-the-go. That’s why the Seva Sadan Society website is fully responsive.


Watch unconfirmed trades on EtherDelta
Ideally you want to be connected to a well connected node to see all the transactions before they are confirmed, but the easiest option is to have
Metamask
installed
Start Watching


WhisperMe
The famous Whisper Challenge is now on AppStore
Tired of waiting?
Inspired by one of the most popular game of our days, WhisperMe lets you enjoy the fun of this game everywhere, even in the comfort of your own home. Follow us in an adventure through the vocabulary of Romanian and English language and dare to guess the words that we have prepared for you!
Are you in for some whisper challenge?
Periodic updates with fresh content.
Fun, sharply designed and highly accesible.
With notime limits, the pace is relaxing, but the sense of achievement is huge.
Track your progress and compare it to your friends.


Jeremy Corbyn and Boris Johnson both shun Brexit truth that dare not speak its name
by Peston's PoliticsAn attack line that both Corbyn and Johnson shied away from last night in ITV's debate best characterises the rotten core of this election.
I had half expected Corbyn to make a big thing of the risk that even if Johnson gets his self-styled microwaveable Brexit deal zapped and approved by MPs, such that the UK leaves the EU on 31 January, there remains a significant residual risk we'll tumble into something very like a no-deal Brexit by the end of 2020 - since it is stretching credibility that a useful trade deal with the EU could be negotiated and approved by then, for all that Johnson claims the contrary.
But Corbyn hardly bothered to highlight this risk, even though pretty much all we've heard from the Labour leader for months is how appalling a no-deal Brexit would be.
The reason, presumably, is that he would be highlighting how many years it would take to negotiate a meaningful trade deal with the EU, and that is as much a toxic sauce for his gander as for Johnson’s goose.
Or to put it another way, Corbyn probably doesn't want the brightest light shone on the implicit Brexit timetable in his plan to offer voters a choice in a referendum between remaining in the EU and leaving under a modified Brexit deal.
Because in the event that voters opted for Brexit in that referendum, which is promised by Labour for June, a Labour government would have even less time than Johnson - essentially no time at all - to negotiate a fully operable trade deal, if it wants to be properly out by the end of next year.
The point is that Labour’s version of Brexit makes it likely the UK would remain a non-voting, budget-contributing member of the EU - in “transition” - well beyond 2020, probably for the two years of extension the EU has offered and maybe longer still.
Which is not a version of Brexit that would be universally popular.
Or to put it another way, neither leader dares admit that Brexit is not a single moment in time, but a lengthy process of arduous negotiation.
Which makes it even stranger perhaps that Corbyn refuses to take the cleaner and clearer position of backing Remain, especially since so many of his colleagues were desperate for him to make that leap.
And of course it is striking that Johnson didn’t make a big fuss that Corbyn’s Brexit cannot be a clean break at the end of 2020 - because he is in something of a glass house when chucking those rocks.
So the hideous truth of an election that is ostensibly all about putting Brexit definitively behind us is that it can and will do nothing of the sort.
Watch the debate in full below:


FastFoodFast.com
Order History
Catalog
LOGOUT
cart orders
food
Quantity
Price
Category
Sub-Total
pizza
2000
Meat
4000
Pepper Soup
1500
Soup
7500
Coconut Rice
3000
Meat
3000
Jollof Rice
2000
Rice
6000
Spagetti
1000
Rice
2000
sub total
20,000
total
20,000
proceed to checkout


VOLCANO A film review by Ben Hoffman Copyright 1997 Ben Hoffman
>From the opening moment, when the titles appear on the screen, the eerie sounds of a building about to collapse, of columns and steel supports beginning to crack, envelope the theater. This sound special effect sets the films tone and stays with us all through the film. Good thing, too, because the story is the usual nothing as in almost all films about disasters.
Los Angeles, with its wonderful weather and laid back life style, is often the envy of the rest of the country. Those who envy us and who are turned on when they read of forest fires in our mountains, followed by rain and floods, and who may get a vicarious thrill reading about our latest earthquake, should delight in this new disaster Hollywood has imagined, a volcano whose lava (as hot as 2000 degrees Centigrade) instantly melts even steel buildings that it envelops. Welcome to L.A.
Los Angeles has a world-famous site, located next to our County Museum of Art. It is the La Brea Tar Pits. (A misnomer, since ""brea" means "tar." in Spanish.) At the tar pits, one can see a small lake (or large pool) of oil and tar that still bubble to the surface. Many prehistoric parts of mastodons have been unearthed In the film this is where the volcano erupts, sending hot lava geysers into the air, and shooting "lava bombs" weighing as much as two tons into the air to descend on a building or neighborhood instantly destroying it.
Los Angeles has an Emergency Dept headed by Mike Roark (Tommy Lee Jones).  They could not have picked a better person than Mike. He is cool under stress, knowledgeable, daring and dependable. He is ably assisted in this new unprecedented disaster which no one had anticipated by Lt. Ed Fox, (Keith David), the Fire Chief.
Mike has a teenaged daughter, Kelly (Gaby Hoffmann) . He also has as a good friend and more, Dr. Amy Barnes (Anne Heche), a seismologist, who also helps in planning what to do about the disaster. Emmit Reese (Don Cheadle) is Roark's assistant.who mans the control center while Roark is out in the field battling the lava flow. Some 50 local media people play themselves.
The Special Effects are outstanding: the fires, the lava bombs, the boiling lava flowing down the city streets. The story (such as it is) includes Roark's daughter, Kelly, being in a building that is about to be blown up to block the path of the lava so that it will detour toward the ocean. Having seen enough movies to know that Kelly will escape unharmed, I was nevertheless wishing she would hurry up and get out of the building before it descended on her.
Happily, the film shows that when people are faced with something horrendous, a common enemy, they bond together, forgetting nonsense such as race, religion, and ethnicity. This is brought out nicely when a little boy has lost his mother. When asked to look at a crowd and see if he can point her out, he says "I can't. Everyone looks alike." And indeed they do, tired, covered with soot and ash.
Disaster films seem to be the vogue at the moment. As Screenwriter Jerome D Armstrong tells it, ten, twenty years ago, disaster films were about mechanical failures such as in The Poseidon Adventure, The Towering Inferno, and Westworld. Here we are dealing with a natural disaster for which we are unprepared and must learn to deal with it quickly.
My personal problem was that I was sitting in a theater about 5 - 10 minutes from where the film's disasters were being portrayed and so I could not get really caught up. Out-of-Towners should not have that same experience. It will get their blood flowing.
Directed by Mike Jackson.
Screenplay by Jerome Armstrong and Billy Ray from a story by Armstrong.
3 Bytes
4 Bytes = Superb 3 Bytes = Too good to miss 2 Bytes = Average 1 Byte = Save your money
Ben Hoffman
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


Packages
When it comes to organizing, reuse and share your code, packages are a great way to allow you to do this. They can contain all sorts of code like models, third-party libraries, configs and so on. Packages also allow you to extend the core without messing up your app/classes directory. To clarify what packages are, here are the "is" and "is not" on packages.
Packages...
- are a great way to organize your code,
- supply a place to keep third party libraries,
- allow you to extend other packages without messing with someone's code,
- a place to extend fuel without messing with core files.
But..
- packages do not map to the URL,
- and are not approachable through HMVC requests
Installing packages
Installing packages can be done manually and through oil. To install manually download the package source and place it into your package directory (default in fuel/packages).
To actually be able to use your it you must either add it to always_load
in
app/config/config.php
or use Package::load().
Creating packages
To help people understand what you are doing it's best to structure your package like so:
/packages
/package
/bootstrap.php
/classes
/your.php
/classes.php
/here.php
/config
/packageconfig.php
/and_so_on
Every package is expected to have a bootstrap.php located at the base of the package. Use the bootstrap to add the package namespace (to global if you wish). And add the classes for better perfomance.
// Add namespace, necessary if you want the autoloader to be able to find classes
Autoloader::add_namespace('Mypackage', __DIR__.'/classes/');
// Add as core namespace
Autoloader::add_core_namespace('Mypackage');
// Add as core namespace (classes are aliased to global, thus useable without namespace prefix)
// Set the second argument to true to prefix and be able to overwrite core classes
Autoloader::add_core_namespace('Mypackage', true);
// And add the classes, this is useful for:
// - optimization: no path searching is necessary
// - it's required to be able to use as a core namespace
// - if you want to break the autoloader's path search rules
Autoloader::add_classes(array(
'Mypackage\\Classname' => __DIR__.'/classes/classname.php',
'Mypackage\\Anotherclass' => __DIR__.'/classes/anotherclass.php',
));
Once you have your classes in place you can now start using them.
Note: if package namespaces aren't aliased to global you must supply it:
// If aliased to global just use
$instance = new Myclass;
// When not aliased to global
$instance = new Mynamespace\Myclass;


.
21 years ago in South Africa a seed of an idea was planted, a dream was shared. Inception happened. 21 years on, we look back at what we've built. Leave it up to us, and we'd love to do it all over again. Here's our story
21 years ago in South Africa a seed of an idea was planted, a dream was shared. Inception happened. 21 years on, we look back at what we've built. Leave it up to us, and we'd love to do it all over again. Here's our story
Book the tickets online in any cinema around the country
See the movies releasing in upcoming dates.
Read the reviews of latest movies
Rate the movies and watch the average rating of movie
We donate 1 Rs. to child education everytime you book a ticket.
CEO, MBA from Indian Institute of Management, Kolkata.
Vikas is CEO of Company. He is also a co-founder of company.
MD, M.S. from IIT, Delhi.
Deepa is the MD of company. He is computer science graduate from IIT Delhi.
CTO, B.tech from IIT Mumbai.
Arvind is our Cheif Technical Officer. He is a brilliant programmer.
COO, MBA from MIET, Delhi
Farman is the Cheif Operating Officer of company.


---
layout: post
title: The First Coffeemandment
date: '2015-02-09T06:53:00.001-08:00'
author: geoff purdy
tags:
modified_time: '2015-02-13T07:16:36.773-08:00'
blogger_id: tag:blogger.com,1999:blog-1206336038417661147.post-6970602055828512667
blogger_orig_url: http://geoffreypurdy.blogspot.com/2015/02/universal-sin.html
---
Geoff's First Coffeemandment:
1: He who emptieth the last cup must filleth the vessel. For what good be the vessel lo it containeth no coffee?
This seems to be universal to the human condition. Everywhere I have ever worked, there is SOMEBODY who kicks the coffee at 9:30 and for whatever reason leaves it that way.


A modified SPRT (MSPRT) can be designed and implemented with the help of this package. In a MSPRT design, the maximum sample size of an experiment is fixed prior to the start of an experiment, the alternative hypothesis used to define the rejection region of the test is derived from the size of the test (Type I error), the maximum available sample size (N), and the targeted Type 2 error (equal to 1 minus the power) is also prespecified. Given these values, the MSPRT is defined in a manner very similar to Wald's initial proposal. This test can reduce the average sample size required to perform statistical hypothesis tests at the specified levels of significance and power. This package facilitates the carrying out of one sample Z tests, T Tests and tests of binomial success probabilities. A user guidance for this software package is provided here and also in the supplemental information.
| Version: | 1.0 |
| Imports: | nleqslv, ggplot2, foreach, iterators, parallel, doParallel, datasets, graphics, grDevices, methods, stats, utils |
| Published: | 2018-09-17 |
| Author: | Sandipan Pramanik [aut, cre], Valen E. Johnson [aut], Anirban Bhattacharya [aut] |
| Maintainer: | Sandipan Pramanik <sandy at stat.tamu.edu> |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| NeedsCompilation: | no |
| CRAN checks: | MSPRT results |
| Reference manual: | MSPRT.pdf |
| Package source: | MSPRT_1.0.tar.gz |
| Windows binaries: | r-devel: MSPRT_1.0.zip, r-release: MSPRT_1.0.zip, r-oldrel: MSPRT_1.0.zip |
| OS X binaries: | r-release: MSPRT_1.0.tgz, r-oldrel: MSPRT_1.0.tgz |
Please use the canonical form https://CRAN.R-project.org/package=MSPRT to link to this page.


--- title: Staff layout: default # Iterate over items in the _authors directory which have been set as an authors collection # in the config. # Note use of markdownify to "convert a Markdown-formatted string into HTML". # This normally happens when using {{ content }} in a layout. ---
{{ author.content | markdownify }}


ACCOUNT USERS LIST
list of Fellowship Admins
| # | Full Name | Phone | Role | created By | Created At | Updated At | Action | |
|---|---|---|---|---|---|---|---|---|
| {{i+1}} | {{user.full_name}} | {{user.phone}} | {{user.email}} | {{user.roles[0].name}} | {{user.created_by}} | {{user.created_at | date :'fullDate'}} | {{user.updated_at | date :'fullDate'}} |


ABOUT THE JOURNAL
ISSN-L: 1841-1576
Online ISSN: 2344-3707
Edited by: CENTRE FOR REGIONAL GEOGRAPHY
Published by: PRESA UNIVERSITARĂ CLUJEANĂ (CLUJ UNIVERSITY PRESS)
Frequency: Semiannual (issued in June and December)
|
ABSTRACTING AND INDEXING
Romanian Review of Regional Studies is accredited and ranked in the B+ category by the NATIONAL UNIVERSITY RESEARCH COUNCIL (CNCSIS), code: 854.
OhioLINK Library Catalog
|
|


{{item | json}}
The select component is to provide a select functionality.
ngModel
(any
) - two way data binding. This should be a value of selected option. This option is mutually exclusive with value.placeholder
(?string=''
) - Placeholder text to display when the element has no selected item.disabled
(?boolean=false
) - When true
, it specifies that the component should be disabled or if apply on option then the specific option should be disabled.value
- (any
) - Items that have children of select element it pass any object or string over there, while select the specific option emit value of it.change
- it fires after a new option selected; returns value
of selected option.


| 17 | (A) | and sythen a kene crown of thorne thay thrange one his heuede |
| 17 | (C) | ¶ A stronge thornen crowne . they threste on his hed |
| 17 | (D) | A strong thornyn crowne | they thrist on his hede |
| 17 | (E) | ¶ A scharp crowne of thornes . they thrust on hy hed . |
| (Ex) | ---- no text ---- | |
| 17 | (L) | a þrange þornen croune was þraste on his hed |
| 17 | (P) | A strange croune of thorne throngon on his heued |
| 17 | (U) | ¶ A stronge thornen crowne / they thrust on his heued |
| (V) | ---- no text ---- |


Class OESGetProgramBinary
- java.lang.Object
-
- org.lwjgl.opengles.OESGetProgramBinary
-
public class OESGetProgramBinary extends java.lang.Object
Native bindings to the OES_get_program_binary extension.This extension introduces two new commands. GetProgramBinaryOES empowers an application to use the GL itself as an offline compiler. The resulting program binary can be reloaded into the GL via ProgramBinaryOES. This is a very useful path for applications that wish to remain portable by shipping pure GLSL source shaders, yet would like to avoid the cost of compiling their shaders at runtime. Instead an application can supply its GLSL source shaders during first application run, or even during installation. The application then compiles and links its shaders and reads back the program binaries. On subsequent runs, only the program binaries need be supplied! Though the level of optimization may not be identical -- the offline shader compiler may have the luxury of more aggressive optimization at its disposal -- program binaries generated online by the GL are interchangeable with those generated offline by an SDK tool.
Note that an implementation supporting this extension need not include an online compiler. That is, it is not required to support loading GLSL shader sources via the ShaderSource command. A query of boolean value SHADER_COMPILER can be used to determine if an implementation supports a shader compiler. If not, the GetProgramBinaryOES command is rendered virtually useless, but the ProgramBinaryOES command may still be used by vendor extensions as a standard method for loading offline-compiled program binaries.
Requires
GLES 2.0
.
-
-
Field Summary
Fields Modifier and Type Field and Description static int
GL_NUM_PROGRAM_BINARY_FORMATS_OES
GL_PROGRAM_BINARY_FORMATS_OESAccepted by thepname
parameter of GetBooleanv, GetIntegerv, and GetFloatv.static int
GL_PROGRAM_BINARY_LENGTH_OES
ccepted by thepname
parameter of GetProgramiv.
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method and Description static void
glGetProgramBinaryOES(int program, int[] length, int[] binaryFormat, java.nio.ByteBuffer binary)
Array version of:GetProgramBinaryOES
static void
glGetProgramBinaryOES(int program, java.nio.IntBuffer length, java.nio.IntBuffer binaryFormat, java.nio.ByteBuffer binary)
static void
glProgramBinaryOES(int program, int binaryFormat, java.nio.ByteBuffer binary)
-
-
-
Field Detail
-
GL_PROGRAM_BINARY_LENGTH_OES
public static final int GL_PROGRAM_BINARY_LENGTH_OES
ccepted by thepname
parameter of GetProgramiv.- See Also:
- Constant Field Values
-
GL_NUM_PROGRAM_BINARY_FORMATS_OES
public static final int GL_NUM_PROGRAM_BINARY_FORMATS_OES
Accepted by thepname
parameter of GetBooleanv, GetIntegerv, and GetFloatv.- See Also:
- Constant Field Values
-
GL_PROGRAM_BINARY_FORMATS_OES
public static final int GL_PROGRAM_BINARY_FORMATS_OES
Accepted by thepname
parameter of GetBooleanv, GetIntegerv, and GetFloatv.- See Also:
- Constant Field Values
-
-
Method Detail
-
glGetProgramBinaryOES
public static void glGetProgramBinaryOES(int program, java.nio.IntBuffer length, java.nio.IntBuffer binaryFormat, java.nio.ByteBuffer binary)
-
glProgramBinaryOES
public static void glProgramBinaryOES(int program, int binaryFormat, java.nio.ByteBuffer binary)
-
glGetProgramBinaryOES
public static void glGetProgramBinaryOES(int program, int[] length, int[] binaryFormat, java.nio.ByteBuffer binary)
Array version of:GetProgramBinaryOES
-
-


I have partaken in LSD many many, at least 100 times. Never had a 'bad' trip. Had a few where I felt nauseated, which was no cup of tea (is it ever) But never the typical 'paranoia' bad trip you can usually read about.
BUT this past weekend. WHOA. I am still making sense of what happened to me. The thing is, I can not find a similar 'trip report' anywhere on the web.
I took 2 hits of L about 5 pm. This is a very normal dose for me. I usually take anywhere from 2 to 5 hits. I had really been building up a tolerance lately, so I hadn't taken it for about 5 or 6 weeks, this time, I could tell right away (within 30 minutes, started seeing trailers and colors) that the effect would be stronger than normal (which I was pretty happy about, I don't want to eat 3 or 4 hits and barely even see visuals). I had about half a beer to drink but no other substances were ingested.
I was in a parking lot, waiting to get into a show, there were about 100 other people there partying, waiting. It was overall a relaxed, fun atmosphere, a nice day out; but looking back, I was very worn out from a week of long work hours and not enough sleep, and had a lot of stress about money and my relationship with my family in the back of my mind. Last thing I remember was talking to 2 of my friends, probably around 7:00, and feeling very confused, not being able to follow the conversation. It was getting cold out, we couldn't get into the show that we were waiting to see yet, So I went to sit in my car (I only vaguely remember this).
Next thing, I was coming back into consciousness, it was about midnight. My boyfriend was there talking to me, our friend was in the back seat. I remember the last few flashes of my 'trip dream' - that is what is was like, like waking from a dream. At first, I wanted to talk to the people there, but I was majorly disoriented, and I couldn't seem to form words. It took another hour or to for me to completely be able to think and reason. My boyfriend says that through most of it (before gaining consciousness), I was sitting there, twitching, couldn't talk (was basically out of it) but was madly looking around in all directions.
The last thing I remember before 'waking' was that I was 'inside a molecule, trying to master it'. I am a chemist, and have been trying to master some synthesis reactions (in real life, kids) so this 'kind of' makes sense to me. I also vaguely remember some other things, many images flashing very fast, all unrelated to one another. It was almost as if I had to rearrange every thought in my mind before I could come back to reality.
Until this happened to me, I was not aware that LSD could produce such a reaction. I have been researching this, and have not heard any other account of a 4 to 5 hour long seizure-type reaction. I am also pretty sure that until I find a scientific explanation for what the hell happened, I can never take the stuff again. (and even then, probably not) Shame, really, because it's one of my favorite drugs, and in the past has been more of a tool for thought and meditation than for recreation:(
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Gathering Strength
For living your best life
About
Get Inspired
Toggle Dropdown
Stories/Video
Resources
Contact Us
Support the Mission!
Contact Us and Sign Up for Alerts
Please send me Alerts:
First Name:
Last Name:
Email Address:
Street Address:
City:
State:
Zip Code:
Description:
Person W/Disabling Condition
Family/Friend
Healthcare Professional
Send Me Alerts
Contact Us:
First Name:
Last Name:
Email Address:
Send us a message:
Submit


{% extends "inviteme/base.html" %} {% block title %}{{ block.super }} » confirmation received{% endblock %} {% block content %}
We will be back to you with more information about the project. Please give us some time while we test our prototype.
Thank you!
{% endblock %}


Toolkits > SampleDNSPacketDPDKSource 2.0.0 > sample > LiveDNSPacketDPDKSourceFilter.spl
composite LiveDNSPacketDPDKSourceFilter { param expression<int32> $nicPort: (int32)getSubmissionTimeValue("nicPort", "0" ); expression<int32> $nicQueue: (int32)getSubmissionTimeValue("nicQueue", "0" ); expression<float64> $metricsInterval: (float64)getSubmissionTimeValue("metricsInterval", "1.0" ); expression<float64> $timeoutInterval: (float64)getSubmissionTimeValue("timeoutInterval", "10.0" ); type DNSMessageType = uint64 packetNumber, // sequence number of packet float64 captureTime, // time that packet was captured, in seconds since Unix epoch uint32 ipv4ServerAddress, // IPv4 address of DNS server boolean isResponse, uint8 opCode, uint8 responseCode, rstring questionName, uint16 questionType, list<rstring> answerNames, list<uint16> answerTypes, list<rstring> nameserverNames, list<rstring> additionalNames, list<rstring> additionalData; DNSErrorType = uint64 packetNumber, float64 captureTime, int32 errorCode, rstring errorDescription, int32 incompatibleFlags, blob dnsMessage; FlattenedDNSMessageType = float64 captureTime, rstring flattenedDNSMessage; MetricsType = float64 metricsTime, // time that metrics were produced, in seconds since Unix epoch boolean metricsUpdated, // true if metrics have been updated since previous output tuple uint64 packetNumber, // sequence number of packet, as emitted by operator uint64 packetsReceived, // number of packets received by network interface in this interval uint64 packetsDropped, // number of packets dropped in this interval uint64 packetsProcessed, // number of packets emitted by operator in this interval uint64 bytesProcessed, // number of bytes emitted by operator in this interval float64 intervalElapsed, // elapsed time since last metrics interval, in seconds uint64 intervalPacketsReceived, // number of packets received since last metrics interval uint64 intervalPacketsDropped, // number of packets dropped since last metrics interval uint64 intervalPacketsProcessed,// number of packets processed since last metrics interval uint64 intervalBytesProcessed; // number of bytes processed since last metrics interval graph // Ingest DNS packets from ethernet adapter, produce tuples for cyber-security // analytics, and 'flattened' representations of DNS resource records for // output to files. ( stream<DNSMessageType> DNSMessageStream ; stream<FlattenedDNSMessageType> FlattenedDNSQuestionStream ; stream<FlattenedDNSMessageType> FlattenedDNSNormalResponseStream ; stream<FlattenedDNSMessageType> FlattenedDNSErrorResponseStream ; stream<FlattenedDNSMessageType> FlattenedDNSMalformedStream ; stream<FlattenedDNSMessageType> FlattenedDNSIncompatibleFlagsStream ; stream<DNSErrorType> DNSErrorStream ; stream<MetricsType> MetricsStream ) = DNSPacketDPDKSource() { param lcoreMaster: 0; // run the master thread on core 0. lcore: 1; // run this ingest thread on core 1. nicPort: $nicPort; // bind to specified NIC port nicQueue: $nicQueue; // bind to specified NIC queue promiscuous: true; outputFilters: !parseError(), // selects messages for DNSMessageStream !parseError() && !DNS_RESPONSE_FLAG(), // selects messages for FlattenedDNSQuestionStream !parseError() && DNS_RESPONSE_FLAG() && DNS_RESPONSE_CODE()==0ub, // selects messages for FlattenedDNSNormalResponseStream !parseError() && DNS_RESPONSE_FLAG() && DNS_RESPONSE_CODE()!=0ub, // selects messages for FlattenedDNSErrorResponseStream parseErrorCode()!=0, // selects messages for FlattenedDNSMalformedStream DNS_INCOMPATIBLE_FLAGS()!=0, // selects messages for FlattenedDNSIncompatibleStream parseErrorCode()!=0 || DNS_INCOMPATIBLE_FLAGS()!=0, // selects messages for DNSMalformedStream metricsUpdated(); // selects messages for MetricsStream metricsInterval: $metricsInterval; output DNSMessageStream: packetNumber = packetsProcessed(), captureTime = (float64)CAPTURE_SECONDS() + (float64)CAPTURE_MICROSECONDS() / 1000000.0, ipv4ServerAddress = DNS_RESPONSE_FLAG() ? IPV4_SRC_ADDRESS() : IPV4_DST_ADDRESS(), isResponse = DNS_RESPONSE_FLAG(), opCode = DNS_OPCODE(), responseCode = DNS_RESPONSE_CODE(), questionName = DNS_QUESTION_NAME(), questionType = DNS_QUESTION_TYPE(), answerNames = DNS_ANSWER_NAMES(), answerTypes = DNS_ANSWER_TYPES(), nameserverNames = DNS_NAMESERVER_NAMES(), additionalNames = DNS_ADDITIONAL_NAMES(), additionalData = DNS_ADDITIONAL_DATA(); FlattenedDNSQuestionStream: captureTime = (float64)CAPTURE_SECONDS() + (float64)CAPTURE_MICROSECONDS() / 1000000.0, flattenedDNSMessage = DNS_ALL_FIELDS("\n", "|", "^"); FlattenedDNSNormalResponseStream: captureTime = (float64)CAPTURE_SECONDS() + (float64)CAPTURE_MICROSECONDS() / 1000000.0, flattenedDNSMessage = DNS_ALL_FIELDS("\n", "|", "^"); FlattenedDNSErrorResponseStream: captureTime = (float64)CAPTURE_SECONDS() + (float64)CAPTURE_MICROSECONDS() / 1000000.0, flattenedDNSMessage = DNS_ALL_FIELDS("\n", "|", "^"); FlattenedDNSMalformedStream: captureTime = (float64)CAPTURE_SECONDS() + (float64)CAPTURE_MICROSECONDS() / 1000000.0, flattenedDNSMessage = DNS_ALL_FIELDS("\n", "|", "^"); FlattenedDNSIncompatibleFlagsStream: captureTime = (float64)CAPTURE_SECONDS() + (float64)CAPTURE_MICROSECONDS() / 1000000.0, flattenedDNSMessage = DNS_ALL_FIELDS("\n", "|", "^"); DNSErrorStream: packetNumber = packetsProcessed(), captureTime = (float64)CAPTURE_SECONDS() + (float64)CAPTURE_MICROSECONDS() / 1000000.0, errorCode = parseErrorCode(), errorDescription = parseErrorDescription(), incompatibleFlags = DNS_INCOMPATIBLE_FLAGS(), dnsMessage = PAYLOAD_DATA(); MetricsStream: metricsTime = getTimestampInSecs(), metricsUpdated = metricsUpdated(), packetNumber = packetsProcessed() - 1ul, packetsReceived = packetsReceived(), packetsDropped = packetsDropped(), packetsProcessed = packetsProcessed(), bytesProcessed = bytesProcessed(), intervalElapsed = metricsIntervalElapsed(), intervalPacketsReceived = metricsIntervalPacketsReceived(), intervalPacketsDropped = metricsIntervalPacketsDropped(), intervalPacketsProcessed = metricsIntervalPacketsProcessed(), intervalBytesProcessed = metricsIntervalBytesProcessed(); } // Write all streams to output files synchronously, on the ingest thread. //() as DNSMessageSink = FileSink(DNSMessageStream as In) { param file: "debug.LiveDNSPacketDPDKSourceFilter.DNSMessageStream.out"; format: txt; hasDelayField: true; } () as FlattenedDNSQuesstionSink = FileSink(FlattenedDNSQuestionStream as In) { param file: "debug.LiveDNSPacketDPDKSourceFilter.FlattenedDNSQuestionStream.out"; format: line; suppress: captureTime; } () as FlattenedDNSNormalResponseSink = FileSink(FlattenedDNSNormalResponseStream as In) { param file: "debug.LiveDNSPacketDPDKSourceFilter.FlattenedDNSNormalResponseStream.out"; format: line; suppress: captureTime; } () as FlattenedDNSErrorResponseSink = FileSink(FlattenedDNSErrorResponseStream as In) { param file: "debug.LiveDNSPacketDPDKSourceFilter.FlattenedDNSErrorResponseStream.out"; format: line; suppress: captureTime; } () as FlattenedDNSMalformedSink = FileSink(FlattenedDNSMalformedStream) { param file: "debug.TestDNSPacketDPDKSourceFilter.FlattenedDNSMalformedStream.out"; format: line; suppress: captureTime; } () as FlattenedDNSIncompatibleSink = FileSink(FlattenedDNSIncompatibleFlagsStream) { param file: "debug.TestDNSPacketDPDKSourceFilter.FlattenedDNSIncompatibleFlagsStream.out"; format: line; suppress: captureTime; } () as DNSErrorSink = FileSink(DNSErrorStream) { param file: "debug.TestDNSPacketDPDKSourceFilter.DNSErrorStream.out"; format: txt; hasDelayField: true; } () as MetricsSink = FileSink(MetricsStream as In) { param file: "debug.LiveDNSPacketDPDKSourceFilter.MetricsStream.out"; format: txt; hasDelayField: true; } // Shut down this application when timer expires. () as Timeout = Custom() { logic onProcess: { block($timeoutInterval); log(Sys.info, "shutting down after " + (rstring)$timeoutInterval + " second timeout"); shutdownPE(); } } }


OrBI is a component in the entity-component-system (ECS) architecture used in A-Frame (refer to A-FRAME Docs). It means that OrBI have to be attached to an entity to be added to the scene. The way you do it in A-Frame is through HMTL:

You can then set the properties to OrBI:

As default, OrBI uses spherical coordinates to positionate the interface, i.e., the position is defined with a radial distance from the camera and two angles.The property orbits defines the possible distances, theta defines the horizontal angle, and phi defines the vertical angle.
It is also possible to positionate OrBI using cartesian coordinates, but then movement buttons are disabled automatically.

For creating buttons, we need to use javascript. The way we do it is creating an auxiliary component and adding to our entity.
  [...]
Notice the dimension property, it defines how the buttons will be displayed, in the case, 2 lines an 1 row.
If you plan to move the camera while using OrBI, wrap your camera entity with a entity with the id rig and move the rig instead of the camera itself.

| Property | Description | Default Value |
|---|---|---|
| dimension | Dimension of the interface | { x: 1, y: 1 } |
| orbits | Distances from the camera | 1 |
| theta | Horizontal rotation in degrees | 90 |
| phi | Vertical rotation in degrees | 0 |
| movementBar | Whether to display move bar or not, doesn't work with worldPosition | true |
| worldPosition | Cartesian way for positioning the interface, it overrides the default orbital way | { x: null, y: null, z: null } |
| rotation | Defines the rotation in x, y and z when using worldPosition | { x:0, y:0, z:0 } |
| centralize | Whether to align buttons to the center, if false they are aligned to the top-left | true |
| buttonSize | Width and height of the buttons | { x: 0.3, y: 0.2 } |
| border | Thickness and color of button border, if nothing is set, no border is added | { thickness: 0, color: null } |
| gap | Distance beteween the buttons in the x and y axis | { x: 0, y: 0} |
| transparency | Whether the textures have transparency | false |
| messagePos | Default position of message (top or bottom) | top |
| messageColor | Text color of the message box | white |
| messageBG | Background color of the message box | #232323 |
| cursorColor | Defines the color of the aim cursor | white |
| cursorPosition | Defines the positon of the aim cursor, usually it doesn't need to change | { x: 0, y: 0, z: -1 } |
| font | Font URL. Check here valid fonts | A-Frame default (Roboto) |
| negate | Negate font | true |
| sideTextSize | Size for the lateral panel | { x: 0.75, y: 1 } |
| sideTextRotation | Lateral panel rotation | 0 |
| visible | Visibilty of the interface | true |
| raycaster | Defines near and far properties of the raycaster | { near: 0, far: orbits[0] } |
| Function | Description |
|---|---|
| addButton(buttonName, idOfTexture, callback) | Adds a button to the interface |
| showMessage(message, position) | Shows message, position parameter is optional |
| showSideText(text) | Shows a permanent multiline message to the right of the interface |
| hideSideText() | Hides side text |
| updatePosition({radius, theta, phi, worldPosition}) | Should be called if the camera position changes or if you want to change one parameter. All parameters are optional. |
| hide() | Hide the interface |
| show() | Make interface visible |


GeoAPI project history
In 2001, the Open GIS Consortium (the former name of the Open Geospatial Consortium) published
OGC implementation specification 01-009:
Coordinate Transformation Services.
This specification, developed by the Computer Aided Development Corporation (Cadcorp),
was accompanied by COM, CORBA, and Java interfaces.
At this time, the wave of web services had not yet eclipsed classical programming interfaces.
The interfaces of the OGC did anticipate a networked world,
but invested rather — in the case of Java — in RMI (Remote Method Invocation) technology.
As the GeoAPI project did not yet exist, we retroactively designate these historical interfaces “GeoAPI 0.1”.
These interfaces already used the package name org.opengis
, which would be adopted by GeoAPI.
In 2002, developers of free projects launched a call for the creation of a geospatial API. The initial proposal attracted the interest of at least five free projects. The project was created using SourceForge, which has since hosted the source code in a Subversion repository. It was then that the project assumed the name “GeoAPI”, and used the interfaces of the OGC specification 01-009 as a starting point.
A few months later, the OGC launched the GO-1: Geographic Objects project, which pursued goals similar to those of GeoAPI. In the meantime, the OGC abandonned some of their specifications in favor of ISO standards. GeoAPI and GO-1 worked jointly to rework the GeoAPI interfaces and base them on the new ISO norms. Their first interation, GeoAPI 1.0, served as a starting point for the first draft of the OGC specification 03-064 by the GO-1 working group. The final version of this specification became an OGC standard in 2005, and GeoAPI 2.0 was published at that time.
The GO-1 project was largely supported by a company called Polexis. Its acquisition by Sys Technology, and the change in priorities under the new owners, brought a halt to the GO-1 project, which in turn slowed development on GeoAPI. In order to resume development, a new working group entitled “GeoAPI 3.0” was created at the OGC. This group took a narrower focus compared to GeoAPI 2.0, concentrating on the most stable interfaces, and putting the others — such as geometries — in a module entitled “pending”, for future consideration. GeoAPI 3.0 became an OGC standard in 2011. This version was the first to be deployed in the Maven central repository.


Getting started¶
Note
TL,DR
let graph = new Graph( htmlDivID, someOptions );
let wave1 = graph.newWaveform().setData( yDataAsArray, xDataAsArray );
let serie = graph.newSerie('someSerieName').setWaveform( wave1 ).autoAxis();
graph.draw();
After you managed to install jsGraph and load into your browser, it’s time to display your first graph.
Graph Constructor method¶
The graph constructor takes the following possible forms
const graph = new Graph( wrapper?, options?, axes? );
where all three options are actually optional
DOM Wrapper¶
The Wrapper is the DOM element into which jsGraph will inject some SVG and HTML code. It can be the id of the container, or the html element itself:
<div id="graph-container" />
const graph = new Graph( "graph-container" );
// ...or
const container = document.getElementById( 'graph-container' );
const graph = new Graph( container );
// ...or, from jQuery
const container = $("#graph-container");
const graph = new Graph( container.get() );
You can delay the use of the wrapper and call the setWrapper
method later on:
graph.setWrapper( domWrapper );
If no width / height options are passed in the constructor, jsGraph will attempt to find out the dimension of the container, using getComputedStyle.
If it doesn’t work out, you will need to call graph.resize( widthInPx, heightInPx )
before you call the draw()
method.
Options¶
jsGraph receives a variety of options that can be set in the constructor. Most options occur with the axes or the series, but the graph itself takes a few of them. Here’s a full example of them with their default value:
const GraphOptionsDefault = {
title: '', // The title of the graph
paddingTop: 30, // Top padding, important if there's a title
paddingBottom: 5,
paddingLeft: 20,
paddingRight: 20,
// If you want to add dummy lines to make the graph appear as a rectangle
close: {
left: true,
right: true,
top: true,
bottom: true
},
// Color of the closing lines
closeColor: 'black',
// Default font size and font used for the whole graph. Can be overridden for each component
fontSize: 12,
fontFamily: 'Myriad Pro, Helvetica, Arial',
// Refer to the interaction documentation to understand those
plugins: {},
mouseActions: [],
keyActions: [],
// Where clicking somewhere on the graph unselects the shape
shapesUnselectOnClick: true,
// Whether there can be only one shape selected at the same time
shapesUniqueSelection: true,
// Axes. Continue reading to understand this syntax
axes: {}
};
Axes¶
The axes settings can also be part of the constructor. Either use them as part of the options, under the key axes
, or, for legacy reasons, as part of the third argument in the constructor.
Here’s the syntax to use:
// Do not use const, read why
let axes = {
top: [
{ /* axis definition */ },
{ /* a second top axis definition */ }
],
bottom: [],
left: [
{ /* a right axis definition */ }
],
right: []
};
jsGraph does not make a copy of this object. Also, options are pretty dynamic, so it may be that jsGraph fills those objects with internal values. This is useful when you want to dump the axis object, save it, and reload it some other time.
Axis definition¶
Here are the default options that you may override for each axis:
let axisDefault = {
// Give it a unique name to retrieve it later
name: undefined,
// Value of the axis label
labelValue: '',
// You can put false here if you decide to use the axis but not to display it
display: true,
// Flip the axis, where the high-end value is to the right or the bottom, and the low-end value to the left / top
flipped: false,
// Use this to draw a vertical or horizontal line at that value. For example, for a straight line at 0, use lineAt: 0
lineAt: false,
// Adds a certain percentage of padding to the axis, with respect to the min/max values provided by the series.
axisDataSpacing: { min: 0.1, max: 0.1 },
// This can be used to display the value differently. More on that later
unitModification: false,
// Display the primary grid, corresponding to the primary ticks (the ones with labels)
primaryGrid: true,
// Display the secondary grid, corresponding to the secondary ticks
secondaryGrid: true,
// Self-exlanatory grid styling
primaryGridWidth: 1,
primaryGridColor: '#f0f0f0',
primaryGridDasharray: undefined,
primaryGridOpacity: undefined,
primaryTicksColor: 'black',
secondaryGridWidth: 1,
secondaryGridColor: '#f0f0f0',
secondaryGridDasharray: undefined,
secondaryGridOpacity: undefined,
secondaryTicksColor: 'black',
// Use true to hide the axis when all the series associated to it are hidden
hideWhenNoSeriesShown: false,
// Offset the low-end value of the graph to 0
shiftToZero: false,
// Tick positions with respect to the axis line: TICKS_INSIDE, TICKS_CENTERED, TICKS_OUTSIDE are possibilities
tickPosition: Graph.TICKS_INSIDE,
// Approximate number of primary ticks to display on the whole axis. It is an indication that jsGraph works with, but when working with decimal values, variations can occur
nbTicksPrimary: 3,
// Approximate number of secondary ticks to display between each primary tick
nbTicksSecondary: 10,
// Use scientific scaling, where values of the ticks are displayed in the scientific notation
scientificScale: false,
// Use a value to force the scientific exponent, rather than letting jsGraph determine the best one
scientificScaleExponent: false,
// Engineering scale is similar to scientific scale, but only with exponents in multiples of 3. (ug, mg, g, kg, ...)
engineeringScale: false,
// The following three options scale the value of the ticks, when scientific scaling is off
// Scale the value of the tick by that factor. Useful for unit conversion
ticklabelratio: 1,
// Multiplies the tick values by 10^x, where x is the exponential factor
exponentialFactor: 0,
// Same as the exponentialFactor, but also applied to the label itself, when using scientific scaling
exponentialLabelFactor: 0,
// Display the axis as a log scale
logScale: false,
// Force the min and the max value. Zooming is still possible, but the min/max values provided by the series become irrelevant
forcedMin: false,
forcedMax: false,
// You can use this setting to not display the axis over the full width / height of the graph. Value in normalized percentage (0 = 0%, 1 = 100%)
span: [0, 1],
// Set the unit of the axis
unit: false,
// Wrap it in the following string
unitWrapperBefore: '',
unitWrapperAfter: '',
// Add the unit in each tick
unitInTicks: false,
// Adjust the offset between the tick and its label
tickLabelOffset: 0,
// You can display a katex formula as the label, more on this later
useKatexForLabel: false,
// Sets the upper bond that the axis can reach and disregards the value given by the series if their are higher/lower
highestMax: undefined,
lowestMin: undefined
};
Adding a serie¶
Obviously the first thing we’ll want to do is to create a new serie. But before that, we need to understand the concept of waveforms
Understanding waveforms¶
Waveforms are not much more than a suger coating over standard javascript arrays. In their more general sense they represent actual data to be plotted. However they provide a bunch of useful features which target handling the data, and therefore are independent of the serie itself, which aims to display that data.
Create a waveforms¶
Nothing simpler than creating a waveform. The Graph object exposes a shortcut to the constructor using
let waveform = Graph.newWaveform();
XY waveforms¶
XY waveforms are perhaps the most obvious one.  Whether they represent scattered data or should be linked with a line is irrelevant.
Note
When used to display a line data and when it can be determined that the x values are monotoneously increasing, jsGraph decreased the rendering time by ignoring the data before the minimum bound of the x axis and the data above the maximum bound of that same axes. Obviously there are a lot more optimisation at play, but that’s just one of them…
To set the XY data to a waveform, use the setData
method:
waveform.setData( yArray, xArray );
X as a waveform¶
In this format, jsGraph actually maintains two waveforms, the main one for the y data set, and one for the x dataset. It therefore also allows you to do the following
// given xWaveform, yWaveform
xWaveform.setData( xArray );
yWaveform.setData( yArray );
yWaveform.setXWaveform( xWaveform );
xWaveform.math( /*...*/ ) // to apply math of the x data set
Y waveforms¶
Y waveforms occur when the interval between each data point is constant. The offset and scaling between the points can be set either in the constructor or using the .rescaleX
method
let wave1 = Graph.newWaveform( yDataAsArray, offset, scale );
// or
wave1.rescaleX( offset, scale );
The first y
value will be at offset
, the second at offset + scale
, the third at offset + scale * 2
, etc.
Note
A third waveform type exists: Hash waveforms. They are used to represent series that go in a bar chart (or category plot). As its name indicates, it doesn’t take (x,y)
values, but a hashmap, or more generally a javascript object:
const wave = Graph.newWaveformHash(); // Create the waveform
wave.setData({ categoryA: yVal, categoryB: yVal2 }); // Setting the data
Creating a new serie¶
To create a new serie, simply use the graph.newSerie
method:
let serie = graph.newSerie( serieName, serieOptions, serieType );
The first argument is required, while the other two are optional and default to serieOptions: {}
and serieType: Graph.SERIE_LINE
.
- The serie name must be unique. If you try to use the name of an existing serie,
newSerie
will simply return the existing serie, and you may override it - The
serieType
describes which type of serie you’re trying to add. Valid values are: - **
Graph.SERIE_LINE
or"line"
**Graph.SERIE_SCATTER
or"scatter"
**Graph.SERIE_CONTOUR
or"contour"
: To create contour lines **Graph.SERIE_BAR
or"bar"
: To use with bar charts **Graph.SERIE_BOX
or"box"
: Box plots **Graph.SERIE_LINE_COLORED
or"color"
: Colored line where each segment can have a different color (lower performance thanGraph.SERIE_LINE
) **Graph.SERIE_ZONE
or"zone"
: Typically used to display min/max values as a greyed area **Graph.SERIE_DENSITYMAP
: A density map (see the tutorial about how to use density maps)
- The
Hint
Most methods that apply to the series return the serie itself, allowing API calls to be chained:
let serie = graph.newSerie('name', {}, 'line').methodA().methodB().methodC();
Assigning axes to the serie¶
A serie needs to have an x and a y axis. They might not be displayed, but they must exist. Most jsGraph axis getters create axes if they don’t exist, so don’t worry too much about that. If you would like to use the default axes, use
serie.autoAxis();
// or:
serie.autoAxes();
Important
The default axes are the left
axis at index 0
and the bottom
at index 0
. They will be created automatically if they don’t exist.
You may of course use other axes. For that, the setXAxis( axis )
and setYAxis( axis )
exist:
serie.setXAxis( graph.getBottomAxis( 1 ) ); // Get the second bottom axis
serie.setYAxis( graph.getRightAxis() ); // Get the first right axisDataSpacing
// Don't do that:
serie.setXAxis( graph.getLeftAxis() ); // Error ! Assigning an y axis while the serie expects and x axis
Drawing the graph¶
So far you haven’t asked the graph to draw anything. You merely created object and told jsGraph how you wanted to render them. For the final rendering use:
graph.draw();
Boilerplate example¶
Summing up everything we’ve done, it all boils down to a few lines code. Consider the following complete example:
var g = new Graph("graph-example-gettingstarted-1", {});
g.resize(400, 300).newSerie('serieName')
.setWaveform(Graph.newWaveform().setData([1, 2, 3], [4, 5, 6]))
.autoAxis();
g.draw();
This code would display the following basic graph:
Redrawing methods¶
To redraw the method, you can rebind the data to the waveform, and the waveform to the serie:
waveform.setData( dataY, dataY ); // Rebinding arrays
serie.setWaveform( waveform ); // Rebinding waveform
graph.autoscaleAxes(); // Optional, but rescales the axes to fit the new (?) min/max values
graph.draw();
Rebinding the data is not an computationnally expensive data. However, sometimes you may loose track of dataY
and dataX
.
In this case, you can also directly mutate the arrays and not rebind them to the serie. It may be useful if you lose track of where the arrays are. That’s not a problem for jsGraph, but it becomes your responsability to tell the waveform, the serie and the graph that the data has changed.
If you’re not sure whether the min / max values have changed:
waveform.mutated(); // Tell the waveform to recompute the min/max
serie.dataHasChanged(); // Tell the serie that the data has changed
graph.updateDataMinMaxAxes(); // Tell the graph that there may be new min max values
graph.autoscaleAxes();
graph.draw();
If you are sure that the min/max values haven’t changed:
s.dataHasChanged(); // Flag the serie for a redraw
graph.draw();
Warning
Even if you do not wish to do call autoscaleAxes
, and in the case where the min/max of the data may have changed, you need to call the mutated
method on the waveform and the updateDataMinMaxAxes
on the graph object.
Demonstration¶
const graph = new Graph("graph-example-gettingstarted-2");
graph.resize(400, 300);
let x = [1, 2];
let y = [1, 2];
let w = Graph.newWaveform().setData(y, x);
let s = graph.newSerie('s').setWaveform(w).autoAxis();
graph.draw();
let i = 0;
setInterval(function () {
if (i % 100 < 50) {
x.push(i % 100 + 3);
y.push(i % 100 + 3);
} else {
x.pop();
y.pop();
}
i++;
w.mutated();
s.dataHasChanged();
graph.updateDataMinMaxAxes();
graph.autoscaleAxes();
graph.draw();
}, 200);
This code would display the following basic graph:


I am a trained electronics engineer but lost the use of my right arm after an RTA in 2007. I am looking for an offer of help in building the emon pcbs. I live in Leicester.
I have 4kw SolarPV instalation and am storing excess power in an Electric car. I plan to extend this to Imersion heater for hot water and heating and UPS's for nightime use. When I run out of generated power I hope to add more solar power and/or ground heat source / wind turbine.
Laurence
Re: Help building pcbs
EDIT - silly spelling.
Re: Help building pcbs
Take a look at The Mk2 PV Controler with triac thread. I'm happy to assist in building projects if you want to PM me.
Re: Help building pcbs
Smelling Pistakes! installation Immersion night time.
I have already looked at the immersion Triac posting and was going to go along those lines. Thanks very much for the offer of help. Should we continue our conversation via private email. My email for this project is<EMAIL_ADDRESS>Laurence
Re: Help building pcbs
Hi Laurence, feel free to bounce any ideas off me if you wish. Just send me a PM via the forum.
Best wishes for your project,
Robin
Re: Help building pcbs
Sorry to appear thick but what is a PM?
Have you had any info if the Mk2 Triac immersion heater control is to be available as a kit? I'm going a different route to building my own OEMON but I will go the immersion heater TRIAC arduino uno route.
Laurence
Re: Help building pcbs
Hi Lawrence, PM is a personal message, after you've logged in top right where your account details etc are click on messages,
To start a personal conversation just under the topic heading click on the name of who you want to send to and select message from there. By the time you read this you will have a message.
Re: Help building pcbs
Sorry, there's no Mk2 kit as such, but Rich has put together a list of parts here and he can also supply PCBs for the input and output circuits.