Feature Construction & Logistic Regression
Feature Construction
Selecting good features is often key to the performance of a machine learning algorithm.
To explain through a real world application (
Martin et al.. 2019 Learning to Detect Natural Image Boundaries),
consider the task of boundary detection in images where we want to define object boundaries.
Figure 1. Human-marked segment boundaries
Let \(y = \{+1, -1\}\) since we want to label each pixel as non-boundary (+1) or boundary (-1). Let \(x\) = every pixel (in RGB values). So \(n\) = # of pixels * # of images and the dimension \(d = 3\) for RGB. This is a binary classification problem.
Humans will be able to detect the boundaries through various cues like changes in color, brightness, and texture. It is because we use a collection of cues that allows us to detect boundaries in tricker images such as when the foreground and background are the same color or when shadows mimic boundaries. To do the same in machine learning, we can transform the inputs to a list of features that can help with the classification problem. $$\phi(x^i) = \{features\}$$ \(\phi(x^i)\) is a vector of features computed in the neighborhood of pixel \(i\), e.g. intensity, texture gradient, oriented gradient, etc..
Figure 2. Boundaries produced by various gradient detectors
In the research paper, they used brightness gradient (BG), color gradient (CG), and texture gradient (TG) as their feature transformations. As can be seen from Figure 2, the boundaries were best detected when using all the 3 cues.Using the Wrong Model
We can easily show how important it is to pick the right algorithm for the task with a simple example. Consider the target labels \(y^i \in \{-1, 1\}\).
We want to classify the all input \(x\) points as either -1 or +1 with the 1-D model: \(y^i = sign(w_1x^i + w_0)\).
Figure 3. Regression model incorrectly predicting classification task
Consider the example on the left of Figure 3. We want to separate the purple section and the blue section by marking purple as -1 and blue as +1. It's easy to see that the gray line would perfectly classify the sections. The sign function would be the gray step function drawn on the graph. Keep in mind from Lecture 2 - Linear Regression, that the linear regression algorithm is measured by the squared loss function. So the algorithm will attempt to predict the boundary that minimizes the average squared error i.e. the distance between the highlighted regions and the line itself.The example of the right of Figure 3 shows how past the simple first example, linear regression will fail for this simple classification problem. In this example, the dotted gray line is the boundary that would have perfectly classified the purple and blue sections. However, the solid gray line is the boundary that is actually picked by linear regression. As we can see, it misclassifies a small segment of the first blue section as -1 instead of +1. This is because of the algorithm is attempting to find the minimum squared error between the inputs and the predicted line (as seen in the green arrows) and is shifted to the right because of the additional blue section to the right.
The task that we are applying linear regression to is not the task that it was designed for.
Logistic Regression
Logistic Regression is a probabilistic formulation for classification that uses the Bernoulli Random Variable distribution. This allows us to model the probability of 2 options: $$\theta(x) \in [0,1]$$ $$P(y=1) = \theta(x)$$ $$P(y=-1) = 1 - \theta(x)$$ The probability that \(y=1\) is \(\theta(x)\), a real number between and including 0 and 1. Since there are only 2 outcomes, \(P(y=-1)\) is simply 1 minus that. Now if we apply a linear transformation, we get \(w^T\phi(x) \in \mathbb{R}\). However, we want this value to remain something between 0 and 1, so we can apply the sigmoid function to this:
Eq 1. Applying Sigmoid to Linear Transformation
Now that we have a probability function for a linearly transformed input, how do we go about selecting the \(w\) that will maximize the probability of dataset \(D = \{(x^i, y^i)\} \)?When deriving the task of selecting the model parameter, we will assume that all samples in \(D\) are iid (independent & identically distributed). Because of the assumption, we can state that \(P(D)\) is just the product of all samples in the dataset.
Eq 2. Model Parameter Selection Task Derivation
Least Squares Linear Regression vs. Logistic Regression
We can compare the the minimizers of both models:
Eq 3. Linear Regression vs. Logistic Regression
We can see a unified view through the Emperical Risk Minimization equation (ERM), which we often use to solve ML problems. It is essentially minimizing some average loss function over the data. For least squares linear regression, that loss function is \(\frac{1}{2}(1 - something)^2\) and for logistic regression, it is \(log(1+e^{something})\).We can see the ramifications of this in this graph:
Figure 4. Square Loss vs Logistic Loss
For squared (quadratic) loss, if the score is too large (too correct), the model will penalize it for being too confident in the prediction. For log (logistic) loss however, it is much better behaved as the loss decreases as it becomes more correct.


This guide will give you what you need in order to jump into LFE at ludicrous speed.
For a more gradual introduction (with a bit more Erlang) and for something that's going to give you time to see the stars, checkout the User Guide.
For a quick introduction to LFE, lfetool
has everything you need. The
Quick Start guide will use it almost exclusively -- all in the interst of
sending you a week and a half into the future.
Where appropriate, we will point you to other resources that provide more details.
Let's get started: install lfetool
!
$ curl -o ./lfetool https://raw.github.com/lfe/lfetool/master/lfetool
$ bash lfetool install /usr/local/bin
Note that this does require the most recent release of Erlang right now (r16). (We are working towards full support for r15 and will update this Quick Start when that has landed.)
If you need sudo
to put the script there, be sure to set the ownership:
$ chown $USER /usr/local/bin/lfetool
That way you'll be able to use the update
command to get the latest version
of lfetool
in the future.
First and foremost, you will need Erlang installed. On Mac OS X, this is as
easy as executing brew install erlang
or on Ubuntu apt-get install
erlang
. You can also install Erlang from the various pre-built packages
provided on the official Erlang
download page or from the
Erlang
Solutions page (supports many more package types).
Personally, we prefer to manage our Erlang builds and installations with
kerl.
This allows for multiple versions of Erlang to be installed
on your system simultaneously. For more information about using kerl
in LFE
projects, be sure to visit the "kerl" section of the
User Guide.
You will be using rebar
to build LFE under the covers as well as managing
dependencies for your projects, so go ahead and get that set up:
get rebar.
You will also need to download git or install it using your favorite package manager.
Ready for some LFE? Next you'll learn how to create a new LFE project with just one command ...
A project? Already?! It sounds daunting, but it's just one command :-)
Head over to your favorite workspace in an open terminal and do this:
$ lfetool new library my-test-lib
As you watch the output crank away, read on to find out what it's doing:
lfetool
created a skeleton project (of the "library" type)rebar
downloaded all the dependencies listed in the new
rebar.config
file that was created for your projectFirst things first: let's get that failing unit test passing.
Here's the output we saw:
**error:{assertEqual_failed,[{module,'my-test-lib_tests'},
{line,11},
{expression,"(: my-test-lib my-adder 2 2)"},
{expected,4},
{value,5}]}
We can see that our test expected 4 but it got 5.
Before we go further, be sure you are in your project directory:
$ cd my-test-lib
Let's look at the test by opening up test/my-test-lib_tests.lfe
.
Well, things there look good -- we should get 4 when 2 and 2 are added.
Let's take a look at the source module: src/my-test-lib.lfe
. Ah-ha! a
bug :-) There's an extra operation that's being done which we don't want.
To fix it, change this line:
(+ x (+ y 1)))
to this:
(+ x y))
Now re-run the unit tests:
$ make check-no-deps
And you should get a passing test:
==> my-test-lib (eunit)
======================== EUnit ========================
my-test-lib_tests: my-adder_test (module 'my-test-lib_tests')...[0.031 s] ok
=======================================================
Test passed.
We'll talk about the make
targets in a bit, but our target above run the
unit tests without recompiling all the deps; just our project files and
our unit tests.
Okay, we've got our tests passing and our project looks healthy. But what does it have in it?
Makefile
rebar.config
file we mentioned earlier (this has all your project
dependencies in it)package.exs
file for uploading your project to
expm.cosrc
directory which holds your project code, andtest
directory which holds the testsThere are some other things there (e.g., the deps
directory created by rebar
and the ebin
directory that's created when everything is compiled).
lfetool
also did one more thing for you: init
ed the project in git
and added all the files:
$ git status

# On branch master

#

# Initial commit

# Changes to be committed:
<a name="(use_"git_rm_--cached_<file>"_to_unstage)">
# (use "git rm --cached <file>..." to unstage)

# new file: .gitignore

# new file: Makefile

# new file: README.rst

# new file: package.exs

# new file: rebar.config

# new file: src/my-test-lib.app.src

# new file: src/my-test-lib.lfe

# new file: test/my-test-lib_tests.lfe
All you need to do it git commit -a && git push --all
to wherever you want
to put your project :-)
You can taste it, can't you? That LFE flavor coming your way? Yup, you're right. You're going to be looking at LFE code next ...
It may not seem like it, but we're off to a pretty fast start. If you had to do everything we've done, manually, you'd have given up by now. Seriously.
Time to put the brakes on, though, 'cause you're gonna want to see this next part in slow motion.
Sure thing :-) Just do this from your new LFE project directory:
make shell-no-deps
(There's that -no-deps
thing again... don't worry, we're going to tell
you about it.)
This should give you something that looks like the following:
Erlang R16B (erts-5.10.1) [source] [smp:8:8] [async-threads:10] [hipe] ...
LFE Shell V5.10.1 (abort with ^G)
>
We're not going to spend a lot of time in the REPL right now, but feel free to take it for a spin :-)
> (+ 1 2 3 4 5 6)
21
> (* 2 (+ 1 2 3 4 5 6))
42
> (: lists foldl (lambda (n acc) (+ n acc)) 0 (: lists seq 1 6))
21
Enough fancy stuff! What about code? What does a project look like?
Well, you've already seen one! Let's print it here for your viewing pleasure, though. Here's the starter project you have, with just the one module:
(defmodule my-test-lib
(export all))
(defun my-adder (x y)
(+ x y))
It has a corresponding test module:
(defmodule my-test-lib_tests
(export all)
(import
(from lfeunit-util
(check-failed-assert 2)
(check-wrong-assert-exception 2))))
(include-lib "deps/lfeunit/include/lfeunit-macros.lfe")
(deftest my-adder
(is-equal 4 (: my-test-lib my-adder 2 2)))
Almost couldn't be simpler.
Here's something a little more involved you may enjoy, from the examples in the LFE source code:
(defmodule messenger-back
(export (print-result 0) (send-message 2)))
(defun print-result ()
(receive
((tuple pid msg)
(: io format '"Received message: '~s'~n" (list msg))
(: io format '"Sending message to process ~p ...~n" (list pid))
(! pid (tuple msg))
(print-result))))
(defun send-message (calling-pid msg)
(let ((spawned-pid (spawn 'messenger-back 'print-result ())))
(! spawned-pid (tuple calling-pid msg))))
That bit of code demonstrates one of Erlang's core features in lovely Lisp syntax :-) (For those that don't read Erlang yet, when loaded into the REPL, that example shows some bidirectional message passing between the LFE shell and a spawned process.)
If you'd like to learn more about using the LFE REPL, be sure to read the REPL Section of the User Guide.
If you want to step through a tutorial on Erlang's light-weight threds (per the example code above), you'll want to read this tutorial.
We did promise a bit more information, so we're going to do that next and then wrap up the quick start and point you in the direction of your next LFE adventure ...
We promised to come back to make
, so here we are.
Eventually, the Makefile
will be replaced with a combination of rebar
scripts and updates to lfetool
, but for now it's what we've got.
There are some convenient targets available for you in the Makefile
:
upload
- when your project's ready for release, this will push it up to
expm.co for youcompile
- rebuilds all your .beam
s, including the dependenciesinstall
- should you wish to install your project system-wide (we recommend
against it), you could use this target to do itcheck
- run your unit tests after recompiling all *.lfe
files *.beam
shell
- start up the LFE REPL after recompiling all *.lfe
filesget-deps
- not only does this target get your deps initially, but subsequent
runs of it will perform git pull
s for the repos cloned in your deps
dir, ensuring you have the latest code for everythingIf you do not need to recompile dependencies (and most of the time, you don't), you can skip the deps with the following targets:
compile-no-deps
shell-no-deps
check-no-deps
There are other interesting make
targets tucked in the Makefile
, and
you can learn more about how to manage LFE projects by checking them out.
One thing to keep in mind for future reference: if you add new deps to your
rebar.confg
file, you'll need to update the ERL_LIBS
in your
Makefile
to include them.
Read more about setting up a development environment here.
This has been a quick overview of what LFE has to offer, so you might enjoy reading the User Guide next. You can see all our docs at a glance by visiting the Docs page.
There is a tutorial on light-weight Erlang processes in LFE that you may be intersted in.
If you want to develop RESTful services in LFE, you should take a look at the REST on YAWS with LFE starter project.
The LFE organization on Gitub has a large collection of LFE projects that may be of interest to you.
You should also take some time reading the examples provided in the LFE source code; studying examples is the quickest way to make progress.
If at any time you would like to provide feedback about the documentation on this site, feel free to create an issue. Be sure to give a full description so that we can best help you!


Examples are complete, unique entries in their "direct" form
Overrides temporarily an existing example
Undoes the temporarily override of an existing example


Serving Fresh Chicken since 1928
If it feels wrong, don't do it
Trust your instinct
Be kind to yourself
I would like to start off by thanking you for being alongside us the past couples of years as we star creating our chicken line. We've had our fair share of ups and downs but we have never forgotten that we wouldn't be here without your continued support.


Urban waste management
The goal of this prototype is to provide an overwiew and quick start on how to develop an IoT device for environmental friendly urban waste manamegement. The device is enabling of periodic reading about fill level information for waste bins equipped with a hard top. This is done via ultrasonic distance measurment of the fill level and radio communication of this value via license free LoRa devices to a monitor station. Below you find some impressions, a scenario description and some hints how to start developing the electronic and software part of the solution.
Local African waste soft bin
Waste Bin
Electronic circuit of early experiments running locally.
Development
Development - electronics overview
Electronic compoonents for the Urban Waste Management MVP after testing several options and final evaluation: Temperature compensated distance sensor US-100 (Voltage 2.4 - 5.5V), Arduino Pro Mini 3.3V (8MHz) version, energy source (2 or 3 battery type AA), (Radio module – not visible).
Top view of the waste bin electronics mounted on a waste bin holder.
Detailed top view of electronics mounted for waste bin fill level experiments.
Development - hardware list
Development - hardware description
Arduino
The Arduino Pro Mini 3.3V (8MHz) board with his 328P microcrontroller is the “heart” of the electronic assembly. It contains the central steering loop: it reads sensor information via a serial connection and sends it via the LoRa module. In the following it is shown how to connect the sensor to the Arduino, afterwards it will be shown how to program it.
LoRa module
The LoRa chip used here is the inAir9 module.
Below the wire table of the InAir9 module is shown how to connect it to the arduino.
Ultrasonic distance sensor US-100
Using US-100 in Serial Data Mode provides high accuracy and low computational power to the arduino main board:
Select the operating mode of the US-100 Ultrasonic Distance Sensor by using the jumper on the back of the module. When the jumper is present (choose serial data mode), the sensor outputs the distance as binary serial data. UART mode serial interface configuration 9600 baud rate, starting a one, and stop bits a, data bits, eight, and white parity checking, no flow control.
Attach the module to a serial port on your microcontroller. The Trig/TX pin connects to your microcontroller’s TX serial transmit line. The Echo/RX pin connects to your microcontroller’s RX serial receive line. Set the microcontroller’s serial port to use 9600 baud at 8-N-1 (eight data bits, no parity, one stop bit).
To start measuring the distance, output a 0x55 over the serial port and read back the two byte distance in high byte, low byte format. The distance returned is measured in millimeters. Use the following formula to obtain the distance as millimeters:
Millimeters = FirstByteRead * 256 + SecondByteRead
This module can also output the temperature when using serial output mode. To read the temperature, output a 0x50 byte over the serial port and read back a single temperature byte. The actual temperature is obtained by using the following formula:
Celsius = ByteRead - 45
Development - hardware connection
Software
Program the Arduino
Arduino cna be programmed by sending a set of instructions to the microcrontroller on the board. To realize that the IDE Arduino Software which uses a simplified version of C++ is applied. The Arduino software can be download here. Then to connect the Arduino Pro Mini to the computer an USB-FTDI chip as below was aused.
Libraries
- SoftwareSerial library is used with the distance sensor US-100 via serial communication
- SX1272 library is used with LoRa module
LoRa module
To send the measured fill level data via the LoRa radio the SX1272 library is used. Examples to use this library can be found here.
Distance sensor module
To get the distance (and inherently temperature) measure from the US-100 sensor the SoftwareSerial library is used to run it in the serial (more accurate than the PWM) mode. Here is a sample code used:
// Test of distance and temperature for sensor module US-100
// using 3,3 V Arduino Pro Mini powering US-100 via Arduino GPIO
// adapted from Zeisberg, Jan 2017
// Original from RafaG, 2014
#include <SoftwareSerial.h>;
const int US100_TX = 6;
const int US100_RX = 5;
// instntiation of a new serial channel
SoftwareSerial portUS100(US100_RX, US100_TX);
unsigned int MSByteDist = 0;
unsigned int LSByteDist = 0;
unsigned int mmDist = 0;
int temp = 0;
void setup() {
// provide VCC to US100 via GPIO 4 to enable later energy saving function
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
Serial.begin(9600);
portUS100.begin(9600);
}
void loop() {
portUS100.flush(); // limpia el buffer del puerto serie
portUS100.write(0x55); // orden de medición de distancia
delay(500);
if(portUS100.available() >= 2) // comprueba la recepción de 2 bytes
{
MSByteDist = portUS100.read(); // lectura de ambos bytes
LSByteDist = portUS100.read();
mmDist = MSByteDist * 256 + LSByteDist; // distancia
if((mmDist > 1) && (mmDist < 10000)) // comprobación de la distancia dentro de rango
{
Serial.print("Distance: ");
Serial.print(mmDist, DEC);
Serial.println(" mm");
}
}
portUS100.flush(); // limpia el buffer del puerto serie
portUS100.write(0x50); // orden de medición de distancia
delay(500);
if(portUS100.available() >= 1) // comprueba la recepción de 1 byte
{
temp = portUS100.read(); // lectura del byte
if((temp > 1) && (temp < 130)) // comprobación de rango válido
{
temp -= 45; // corrige offset de 45º
Serial.print("Temperature: ");
Serial.print(temp, DEC);
Serial.println(" Grad Celsius.");
}
}
delay(1000);
}
Test scenario EU soft waste bin
Front side view of MVP urban waste management experimental setup with soft bin and hard top.
Inside top view from down - showing sensor looking downwards to estimate the distance from top to the surface of the waste.
Almost empty German waste bin inside - downside looking view.
Distance measured 62cm for comparison for almost empty trash bin.
Distance measured 65cm with ultrasonic sensor US-100 for almost empty trash bin.
Distance measured 44cm for comparison for 1⁄3 filled trash bin.
Distance measured 44cm with ultrasonic sensor US-100 for 1⁄3 filled trash bin.


{% extends "default.html" %} {% block content %}
{{ application.section106_contributions|length }} Contributions recorded
0 Contributions recorded


Deuteronomy 32:16
They provoked him to jealousy with strange gods, with abominations provoked they him to anger.


--- title: "Test Buckle My Shoe" date: 2020-01-10T18:25:20-07:00 draft: false --- Test Buckle My Shoe Just another test


{% extends "layout.htm" %} {% block content %} {% block sheets%} {% endblock sheets %}
Do you live in the Southern or Northern hemisphere?


OEM is an awesome project! Thanks so much for sharing all your hard work.
I have an interesting challenge. I need to be able to measure whole-house real power and reactive power. As I understand it, this can be achieved using the current EmonTX by connecting the EmonTX to both a CT clamp (to measure current) and an AC-AC adapter (to measure voltage).
BUT I don't have a mains socket anywhere near my consumer unit, so I can only connect a CT clamp to the EmonTX and connect an AC-AC adapter to my Nanode base unit. But, as I understand it, in order to measure real power and reactive power, and to have these measurements accurate even when harmonics are present, I need to be able to sample the current and voltage waveforms many times per cycle, and to accurately align these current and voltage samples in time. This raises two issues when the current and voltage are being measured on different nodes, connected by a low-bit-rate RF link:
- How to transfer of many (hundreds? thousands?) of samples from one node to the other? The RF link has no forward error correction so the chances of successfully transferring a thousand-byte packet is rather low.
- How to synchronize time across both nodes?
I've been trying to hack together a solution and I'd love your opinions on my proposed solution (or if you know of an existing solution then please let me know!):
Let's assume that voltage measurements are done on the Nanode, current measurements are done on the EmonTX and the majority of the calculations are also done on the EmonTX (we'll see why in a moment).
To tackle the challenge of having to send huge amounts of data over the RF link:
Let's assume that the voltage waveform is a pure sine wave, but the current waveform has nasty harmonics. With this assumption, we no longer have to transfer many samples per cycle of the voltage waveform over the RF link; instead we just need to transfer a few parameters to define the sine wave (e.g. zero-crossing times and maximum amplitude). So we program the Nanode to send these parameters to the EmonTX and the EmonTX can then reconstruct the full voltage waveform using a trigonometry lookup table. This setup also means that the Nanode can get on with other time-consuming work in between sending calibration packets to the EmonTX.
To tackle the time sync problem:
Let's setup the EmonTX's interrupt service routine to timestamp the first valid byte of every packet it receives (using the micros() function). Let's setup the Nanode to send a packet to the EmonTX every, say, 5 seconds. This packet contains the instantaneous Nanode time and the voltage sine wave parameters for the last few AC cycles. Hopefully, the time taken to transmit a packet from the Nanode to the EmonTX will be relatively constant and something we can measure in the lab and set as a constant in the code. This way, the EmonTX can calculate the offset between its micros() clock and the Nanode's micros() clock.
The end result is that the EmonTX can spend most of its time sampling the (messy) current waveform. It can calculate instantaneous power by multiplying the instantaneous current readings with the reconstructed voltage waveform; and this voltage waveform reconstruction can be kept reasonably in-sync with the actual voltage through regular callibration packets from the Nanode.
Does that sound vaguely sensible?!
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
I can see what you're getting at, but it sounds highly fraught. My considered opinion is it could be very hard getting this to work, and then I would have doubts about its reliability. What is the exact problem with monitoring voltage - are you able to get a low voltage cable back to your consumer unit - like a telephone extension type cable? The 9 V a.c would be quite happy in that.
An alternative thought - I've not built or tested this - would be to use a capacitive pick-up at your consumer unit. The idea is: normally, we use an adapter to provide 11 V a.c then divide it down 11:1 to get about 1 V rms with a resistive divider. You could achieve the same using a capacitive voltage divider, a large capacitor (low reactance) at the earthy end and at the high-voltage end a small capacitor (high reactance), which you make by wrapping a couple of dozen turns of well-insulated wire around the line cable. You need a high impedance op-amp external to the emonTx to interface to the ADC input, and don't use the bias circuits built into the emonTx pcb.
(R4 + C3 simulate the input of the ADC).
It was first published in this thread where there's a bit more explanation: http://openenergymonitor.org/emon/node/1059#comment-6258 I proposed this a while ago, it was scaled for a 1 V p-p input (not 3.3 V) and I don't know whether anyone built it.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
The Eco Eve device uses something similar. A bit of foil wrapped around one of the main grid cables.
I'm not sure it could accurately measure voltage, but it's a good way to get the phase angle.
P.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Thanks loads for your replies!
I should expand a bit on exactly what I'm doing! I'm doing a computer science PhD on smart meter disaggregation (aka non-intrusive load monitoring)*. I'm kitting my home out with whole-house meters and wireless individual appliance monitors on every appliance.
Next term, I'm running an MSc student project on visualisation and analysis of electrical energy consumption with about 10 students, each of whom will also install an EmonTX (to measure whole-house consumption) and IAMs. The problem is that most of these students live in rented accommodation, where their fuse box is in a communal area. Hence tinkering with their mains wiring (to install a socket) or running cables from their flat to the communal hall are not possible.
I wasn't aware of this technique until today! Sounds very intriguing, I may well have a tinker. If I can use the capacitive pickup in the consumer box to get phase angle, and an AC-AC adapter on the base station to measure RMS voltage then I should be good to go.
Thanks again for the replies!
(By the way, there's also some discussion of this issue on the Navitron forum).
* Incidentally, the ultimate aim of my PhD is to produce an open source NILM package. Which I'd certainly hope to make compatible with the OEM software.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
I don't understand what Paul's concerns are with measuring voltage, once it has been calibrated - this technique is usual at high voltages ( I'm not sure at what voltage it starts to get used, Alstom and ABB both advertise units for 72 kV upwards).
http://en.wikipedia.org/wiki/Capacitor_voltage_transformer
"If I can use the capacitive pickup in the consumer box to get phase angle, and an AC-AC adapter on the base station to measure RMS voltage then I should be good to go."
I'm not sure how you'd marry those two things to accurately calculate real power and apparent power - the real mains isn't a sine wave! (Read AC Power Theory - Arduino maths if you don't understand what I'm inferring there).
[I've fixed the circuit diagram link in the post above. Note: the component values need changing for the emonTx, which requires a 1 V rms input centred at 1.65 V: R1 & R2 should both be 820 k, and C2 can be reduced to 3n9 ]
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Robert, my comment was because there IS no calibration with the Eco Eye (which it what I was talking about). You just slap a bit of foil round the wire and that's it.
I'm assuming it's only used for phase angle. I suppose they could 'guess' at 240V on first contact, and try to measure variance, but I think that would be highly dubious given the nature of the sensor.
P.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Ah, I understand. I think Jack thought - as I did - that "it" referred to the capacitive p.t. in principle, not the Eco-Eye. The capacitive p.t. is used to measure voltage for metering and protection in power systems, which tends to suggest that properly constructed it will be accurate.
But I can see how "slapping a bit of foil" would easily lead to a 50% or more variation in the value of the resulting capacitor. If the value you end up with is close to my estimate, then the calibration constant should take care of it. Otherwise, it's either start again with a longer piece of foil, or cut some off, of change the 'bottom' capacitor so as to bring the voltage within a sensible range. As long as the 'top' capacitor is stable in value (i.e. it doesn't move and nobody puts anything close to it), I don't see a problem.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Thanks for your replies. Very interesting stuff.
If I understand it, a strategy is starting to form:
One thing is slightly worrying me though: would the voltage-step-down-capacitor introduce any latencies? Would we also have to calibrate phase angle?
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
I think you'd need to check this, but I don't see a need for what amounts to regular checks on the value of the home-made capacitor. If everything is solid and there's no relative movement, the value should be stable. Simulation shows that the phase angle is quite possibly better than the AC-AC adapter - certainly it doesn't change with the applied voltage, and there's a phase angle calibration built in to the standard software. So there's probably no need for the ac adapter at the base station.
I don't understand what you mean by "latencies". Can you elaborate?
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
OK, that's great news that the capacitor should be stable. I still want to build an automated calibration system though (using an AC-AC adapter at the base) because my students will need to install this kit and they wont have much time to tinker.
Will changes in humidity affect the calibration of the capacitor?
Sorry, you're right; I wasn't very clear. I meant: will the waveform reported by the capacitor be precisely in sync with the true voltage in the cable? Will the measured and the actual waveforms be precisely in sync or will there by a phase-shift? (I think you've already answered this question by saying that "phase angle is quite possibly better than the AC-AC adapter - certainly it doesn't change with the applied voltage".
Thanks again. I should actually start building this stuff within the next few days.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
By the way, which op-amp would you recommend? A bit of Googling suggests the LMC662 has a very high input impedance. Input bias current is 2 femto amps! Does that sound about right?
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Humidity? I don't think the cable insulation will absorb moisture, so unless it is condensing, I can't see it making much difference.
LM662? Not really - it requires a 5 V supply and the emonTx runs off 3.3 V. So even if you do have 5 V available, you need to clamp the output to 3.3 V or you risk damaging the input of the A-D converter. I usually suggest one of the LMV321 family, which are good down to 2.7 V. The only problem is they are surface mount packages.
I don't think there's a need to go overboard on input impedance. By all means keep it as high as is sensible, you can quite easily check the effect of whatever impedance you think you might have with a simulation program.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Good catch! Thanks!
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Maybe a MCP6043 op-amp would be a good choice?
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
That one looks a possibility. Read section 4.4 of the data sheet though, as although the capacitor that it's driving - the sample & hold capacitor - is very small, if you get any instability you know what to do. The feedback bootstrap capacitor should not have much effect as it already has loads of series resistance associated with it.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
thank you so much for your amazing attention to detail! I must admit I hadn't read past page 3 of the data sheet!
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
I've just bought 10 pcs of MCP6002 to use with emonTX. I thought I had made a nice find, and then you link to MCP604x family! Nice quiescent current on those!
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
But you'll notice that it's at the expense if the gain-bandwidth product. But it's enough for a unity gain buffer at 50 Hz not to suffer slew rate limiting!
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
A tiny bit of progress to report...
Robert's circuit diagram calls for a 15pF capacitor on the mains cable.
I splashed out on a capacitance meter (which I'll almost certainly sell after this project is over!) and a 16mm diameter meter tail kit. To create my capacitor, I used aluminium tape (the sort used to tape the gaps between insulation). It turns out that a 35mm stretch of tape gives a capacitance of 15pF. This value wobbles up and down depending on a number of things (like how close your hand is to the setup) so I can't be precise. The meter has an accuracy of +/- 2pF.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
I was aiming for a length of around that (I'd done the maths, not spent money!), but not exceeding about 50 mm. You could of course have more capacitance there and increase the bottom capacitor pro rata.
What I don't think I've mentioned: You can connect using screened cable, the cable capacitance will form part of that bottom capacitor and so the physical one may, depending on the cable you choose and the length, need to be reduced (or the top capacitor increased) to suit.
As I said earlier, it's important that, once installed and calibrated, there's no physical movement nearby.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Length looks similarish to the eco-eye setup, which you can see bottom right in this photo:
http://www.eco-eye.com/graphics/ecoeyesmartPV.jpg
P.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
BTW, just to be sure: there's absolutely no risk of getting a electric shock from the "mains capacitor" is there? I assume that even if the "aluminium tape" plate of the capacitor does reach a dangerous potential difference, it will store so little charge that it poses no risk. (sorry, I know this is a dumb question)
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
No risk at all.
If you want to double check, just grip one of your meter tails in your hand.
P.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
ok, that's good news - thanks. (I must admit that I had tried testing the voltage produced by the alumium plate using my multimeter and then tried touching it... but I just wanted to double-check!).
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
If you are in any doubt, do the maths. You will have more current flowing through your body when you use a neon screwdriver.
Do you really think I would have suggested this if there was the slightest risk to anyone?
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Thinking about your capacitive v.t, you could minimise the external influences by screening it. The capacitance between the pickup foil and the (earthed) screen would - like the cable capacitance - need to be subtracted from the 'bottom' capacitor.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Great tip, thank you. Should I worry about the impedance of the screened cable? Would 50 ohms be OK?
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
How long? You're not going to be using >0.1 wavelengths, are you? [Hint: One wavelength at 50 Hz = 6000 km ! ! !] Capacitance is more of an issue, but as I said, it just adds to the 'bottom' capacitor so you reduce that to suit. TV aerial downlead, single-core audio screened cable would be fine.
Re: Measuring real and reactive power WITHOUT measuring voltage on EmonTX
Great, thanks.


Chapter 3 Bananas
On my farm we have a total of 40 hectares of land. Of this 18 hectares is natural forest with 16 hectares of sugar cane and 6 hectares of bananas. Bananas grow throughout the year and from sucker to fruit is approximately 18 months. Under field management practices we are able to maintain three stages of banana trees on each spot thereby decreasing the time to fruit to six month intervals. It is recommended that every 10 years the field is to be replanted to maximize production however, these banana fields have not been replanted recently and it is our intention to investigate what this may mean for the production.
3.1 Loading the data
I transcribe my raw data into Microsoft Excel from the books. For me this is the easiest way to meticulously enter data and when the data sets are not to large finding errors can be done by changing the sort and filter functions within MS Excel. Once I am ready to import data into RStudio the file is saved as a .csv
file using the MS Excel drop down option in the save menu. Data are easiest to work with when it is in long format, i.e.. each row represents a single observation. This is not crucial because it can be transformed using R.
# Load the relevant packages for loading and manipulaiton
library(tidyverse)
# Read in the data using `readr` from the `tidyverse` package
production <- read_csv("data/Banana Production.csv")
# A quick look to make sure the data looks like we expect
head(production)
## # A tibble: 6 x 4
## Date Field Bunches weight
## <chr> <int> <int> <int>
## 1 12/3/07 102 162 990
## 2 12/10/07<PHONE_NUMBER>
## 3 12/18/07 93 115 1494
## 4 12/18/07 96 12 198
## 5 12/18/07 1011 145 1620
## 6 12/18/07 102 37 288
Once the data are loaded and looks like the right stuff I get on to making sure my columns are set as either date
, factor
, or number
. There are multiple ways to do this but I like to use lubridate (Grolemund, Spinu, and Wickham 2016) when working with dates and the Tidyverse group namely dplyr (Wickham et al. 2017) for creating factors.
3.1.1 Setting date
# Load lubridate to play with the data values
library(lubridate)
# Making the date coloumn actual date values
production$Date <- as.Date(production$Date, "%m/%d/%y")
# I might want to have the month and year as unique values so I have created floor dates for each
# Add month and year columns
production$month <- floor_date(production$Date, "month")
production$year <- floor_date(production$Date, "year")
3.2 Investigating by bunch
It is sometimes useful to use a standard dat or data to assign to the data you wish to work with.
# Open the dat data frame from the environment panel
dat <- production %>%
mutate(Field = as.factor(Field))
3.2.1 Bunches per month
If we were to try and plot the data for number of bunches harvested per month we can start to see that there is some kind of cyclic trend (Figure 3.1). On the plot I added a smooth (a model) in blue but there seems to be a problem with what it is doing. To have a look at what this problem might be I will inspect the data frame and trouble shoot
names(dat)
## [1] "Date" "Field" "Bunches" "weight" "month" "year"
ggplot(data = dat, aes(x = month, y = Bunches)) +
geom_bar(stat = "identity") +
geom_smooth(method = "loess", span = 0.2) +
scale_x_date(date_breaks = "3 month", date_labels = "%b %y") +
theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Banana bunches", x = "Time")
<IP_ADDRESS> Problematic smooth
# The str function allows you to see both the variable type and the values.
str(dat)
## Classes 'tbl_df', 'tbl' and 'data.frame': 836 obs. of 6 variables:
## $ Date : Date, format: "2007-12-03" "2007-12-10" ...
## $ Field : Factor w/ 5 levels "93","96","101",..: 4 3 1 2 5 4 1 2 5 3 ...
## $ Bunches: int 162 134 115 12 145 37 95 13 96 71 ...
## $ weight : int 990 1800 1494 198 1620 288<PHONE_NUMBER> 558 ...
## $ month : Date, format: "2007-12-01" "2007-12-01" ...
## $ year : Date, format: "2007-01-01" "2007-01-01" ...
After looking at both the str
and the data frame the problem is that Bunches
are not being summed by month. This is an easy fix.
If we want to create a summary data set to only include the sum total of banana bunches per month we can simply use dplyr
and the pipe function. This creates a sum total for bunches.month-1 and the blue line now fits the plot more appropriately (Figure 3.2)
names(dat)
## [1] "Date" "Field" "Bunches" "weight" "month" "year"
# Using dply to group the data by month and year, create a new column for the sum of bunches picked per month, then ungroup
dat.sum_m <-
dat %>%
group_by(month, year) %>%
summarise(bunches.m = sum(Bunches)) %>%
ungroup()
# Plotting the data
ggplot(data = dat.sum_m, aes(x = month, y = bunches.m)) +
geom_bar(stat = "identity") +
geom_smooth(method = "loess", span = 0.2) +
scale_x_date(date_breaks = "3 month", date_labels = "%b %y") +
theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Banana bunches", x = "Time")
From the trend observed in Figure 3.2 it seems apparent that there may be differences in the monthly output which we could look at.
# I am going to modify an existing dataframe so I will assign it to 'a' as to not back track
a <- dat.sum_m
# The month and year are going to be pulled out of the date and given their own coloumn
a$y<-year(a$year)
a$m<-month(a$month)
# If I want to use the month as anything other than a date I should tell R it is a factor
a1 <-
a %>%
mutate(m = as.factor(m))
Now that the data are ready to be looked at as bunches per month a simple box plot can tell a quick visual story
# a quick boxplot for the bunches harvested per month
ggplot(data = a1, aes(x = m, y = bunches.m)) +
geom_boxplot() +
geom_jitter() +
labs(y = "Banana bunches", x = "Month")
3.2.2 Statistics
Are the number of bunches harvest per month statistically different?
 When the bunches are harvested the data for field of origin is also captured. It is interesting to know how each field is performing.
# Creating a cum for each month grouped by field
names(dat)
## [1] "Date" "Field" "Bunches" "weight" "month" "year"
dat.sum_m.f <-
dat %>%
group_by(month, year, Field) %>%
summarise(bunches.m.f = sum(Bunches))
As described earlier there are different fields which are picked from. A look at the production of bunches by field in Figure 3.4 highlights the fact the two fields (f102 and f93) were taken out of production.
ggplot(data = dat.sum_m.f, aes(x = month, y = bunches.m.f)) +
geom_bar(stat = "identity") +
geom_smooth(method = "loess", span = 0.2) +
scale_x_date(date_breaks = "12 month", date_labels = "%y") +
theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Banana bunches", x = "Year") +
facet_wrap(~Field, ncol = 2)
3.3.1 Cumulative bunches per field
It seems interesting to look at a field as a continuous unit and measure the cumulative harvest over time.
# Creating a cumulative bunches harvest for each field
names(dat)
## [1] "Date" "Field" "Bunches" "weight" "month" "year"
dat.sum_f <-
dat %>%
group_by(Field) %>%
mutate(cumsum = cumsum(Bunches)) %>%
ungroup()
str(dat.sum_f)
## Classes 'tbl_df', 'tbl' and 'data.frame': 836 obs. of 7 variables:
## $ Date : Date, format: "2007-12-03" "2007-12-10" ...
## $ Field : Factor w/ 5 levels "93","96","101",..: 4 3 1 2 5 4 1 2 5 3 ...
## $ Bunches: int 162 134 115 12 145 37 95 13 96 71 ...
## $ weight : int 990 1800 1494 198 1620 288<PHONE_NUMBER> 558 ...
## $ month : Date, format: "2007-12-01" "2007-12-01" ...
## $ year : Date, format: "2007-01-01" "2007-01-01" ...
## $ cumsum : int 162 134 115 12 145 199 210 25 241 205 ...
In Figure 3.5 the cumulative number of bunches harvested for each field highlights that they are not all performing the same. We could quickly add a linear model to this to further visualize the trend.
ggplot(data = dat.sum_f, aes(x = Date, y = cumsum, colour = Field)) +
geom_line() +
#geom_bar(stat = "identity") +
#geom_smooth(method = "lm") +
#scale_x_date(date_breaks = "12 month", date_labels = "%y") +
#theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Banana bunches", x = "Year")
#facet_wrap(~Field, ncol = 2)
3.3.2 Cumulative weight per field
It seems interesting to look at a field as a continuous unit and measure the cumulative harvest over time.
# Creating a cumulative bunches harvest for each field
names(dat)
## [1] "Date" "Field" "Bunches" "weight" "month" "year"
dat.sum_f.w <-
dat %>%
group_by(Field) %>%
mutate(cumsum = cumsum(weight))
names(dat.sum_f.w)
## [1] "Date" "Field" "Bunches" "weight" "month" "year" "cumsum"
ggplot(data = dat.sum_f.w, aes(x = Date, y = cumsum, colour = Field)) +
geom_line() +
#geom_bar(stat = "identity") +
#geom_smooth(method = "lm") +
#scale_x_date(date_breaks = "12 month", date_labels = "%y") +
#theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Weight (kg)", x = "Year") +
scale_y_continuous(breaks = seq(0, 400000, 50000)) +
theme_bw()
#facet_wrap(~Field, ncol = 2)
The awesome thing about this is that you can very easily turn a plot into something more than just a plot using plotly
#devtools::install_github("ropensci/plotly")
#devtools::install_github("hadley/ggplot2")
library(plotly)
bunch <- ggplot(data = dat.sum_f, aes(x = Date, y = cumsum, colour = Field)) +
geom_line() +
#geom_bar(stat = "identity") +
#geom_smooth(method = "lm") +
scale_y_continuous(breaks = seq(0, 20000, 5000)) +
theme_bw() +
theme(legend.direction = "horizontal",
legend.justification = "center",
legend.position = "top") +
#scale_x_date(date_breaks = "12 month", date_labels = "%y") +
#theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Number of bunches",
x = "Year")
#facet_wrap(~Field, ncol = 2)
weight <- ggplot(data = dat.sum_f.w, aes(x = Date, y = cumsum, colour = Field)) +
geom_line() +
#geom_bar(stat = "identity") +
#geom_smooth(method = "lm") +
#geom_smooth(method = "loess", span = 0.1) +
#scale_x_date(date_breaks = "12 month", date_labels = "%y") +
#theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Cumulative weight (kg)",
x = "Year") +
scale_y_continuous(breaks = seq(0, 400000, 50000)) +
theme_bw() +
theme(legend.direction = "horizontal",
legend.justification = "center",
legend.position = "top")
#facet_wrap(~field, ncol = 2)
library(gridExtra)
grid.arrange(bunch, weight, nrow = 1)
3.4 Production per hectare
The fields are not all the same size which we can standardise to a
data <-
dat %>%
group_by(Field) %>%
mutate(cumsum = cumsum(weight)) %>%
ungroup() %>%
mutate(Field = stringr::str_replace(Field, "93", "f93"),
Field = stringr::str_replace(Field, "96", "f96"),
Field = stringr::str_replace(Field, "101", "f101"),
Field = stringr::str_replace(Field, "1011", "f1011"),
Field = stringr::str_replace(Field, "102", "f102")) %>%
spread(key = Field, value = cumsum) %>%
group_by(month) %>%
mutate(ha.93 = f93 /1.51,
ha.96 = f96 /1.31,
ha.101 = f101/2.07,
ha.1011 = ff1011/2.21,
ha.102 = f102/1.12)
dat.v2 <-
data %>%
select(month, ha.93, ha.96, ha.101, ha.1011, ha.102) %>%
gather(Field, Weight, 2:6)%>%
drop_na()
I want to put the plot for per hectare side by side to the weight per field. I may need to adjust the level of factors.
PROBLEM - I DONT KNOW HOW!!!
names(dat.v2)
## [1] "month" "Field" "Weight"
ggplot(data = dat.v2, aes(x = month, y = Weight, colour = Field)) +
geom_line() +
#geom_bar(stat = "identity") +
#geom_smooth(method = "lm") +
#scale_x_date(date_breaks = "12 month", date_labels = "%y") +
#theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Weight (kg)", x = "Year") +
#scale_y_continuous(breaks = seq(0, 400000, 50000)) +
theme_bw()
#facet_wrap(~Field, ncol = 2)
#devtools::install_github("ropensci/plotly")
#devtools::install_github("hadley/ggplot2")
library(plotly)
area <- ggplot(data = dat.v2, aes(x = month, y = Weight, colour = Field)) +
geom_line() +
#geom_bar(stat = "identity") +
#geom_smooth(method = "lm") +
#scale_x_date(date_breaks = "12 month", date_labels = "%y") +
#theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Production per hectare", x = "Year") +
scale_y_continuous(limits=c(0,180000),
breaks = seq(0, 180000, 20000)) +
ggtitle("A") +
theme_bw() +
ggtitle("A") +
theme(legend.direction = "horizontal",
legend.justification = "center",
legend.position = "top")
#facet_wrap(~Field, ncol = 2)
weight <- ggplot(data = dat.sum_f.w, aes(x = Date, y = cumsum, colour = Field)) +
geom_line() +
#geom_bar(stat = "identity") +
#geom_smooth(method = "lm") +
#geom_smooth(method = "loess", span = 0.1) +
#scale_x_date(date_breaks = "12 month", date_labels = "%y") +
#theme(axis.text.x = element_text(angle=90, vjust = 0.5)) +
labs(y = "Cumulative weight (kg)",
x = "Year") +
scale_y_continuous(limits=c(0,300000),
breaks = seq(0, 300000, 50000)) +
theme_bw() +
ggtitle("B") +
theme(legend.direction = "horizontal",
legend.justification = "center",
legend.position = "top")
#facet_wrap(~field, ncol = 2)
library(gridExtra)
grid.arrange(area, weight, nrow = 1)
References
Grolemund, Garrett, Vitalie Spinu, and Hadley Wickham. 2016. Lubridate: Make Dealing with Dates a Little Easier. https://CRAN.R-project.org/package=lubridate.
Wickham, Hadley, Romain Francois, Lionel Henry, and Kirill Müller. 2017. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.


The Search Builder modal template follows the basic layout explained on the documentation page. The search-builder
directive has been added and the search-groups
directives have been added as child elements.
A modal-inset-panel
has also been added to the main body of the modal. Note that all the modal-inset-panel
bindings point to a service. This is because we want some of the search-components
to be able to open and
display content in the panel and separating it out into its own service makes this much easier. This is explained in
greater detail in the services section.
The last addition feature that has been added to the modal is spark chart which is used to show how many search results the user can expect to get with the current query.
The following HTML was used as the modal template:
The modal controller plays an important role in tying all the features together. Some of the items being injected into the controller may not be familiar:
searchBuilderPanel
- this is a service that will be created to manage the modal inset panel and its
content (see services section).searchBuilderId
- this is a service that will be created to provide unique ids for the search-components
(see services section).searchQuery
- this allows the controller launching the modal to pass in an initial search query.The controller also configures several of the controls within the modal such as the scrollbar, the spark chart and the search-builder
,
most importantly registering all the search-components
that are available to the search-builder
.
The controller has two important functions which allow adding new fields to a search-group
. The first is vm.addKeywordField
which will always return a keyword
component. This is the simplest way to add a new field, however the desired
action may be to allow the user to choose the type of field they want to add in which case we cannot immediately return
the type of the component. The vm.addCustomField
is an example of how to allow the user to choose a specific
type of field. Using the searchBuilderPanel
service it opens the inset panel by calling the openPanel
function. This function returns a $q.defer().promise
which will add the field when the promise is resolved.
It is now up to the panel to resolve or reject this once the field is known or the panel is dismissed.
The following code is used for the modal controller:
Note. This controller generates fake search result counts when the search query is changed based on the number of terms being searched for.
The following CSS was used to produce the styling in the example.


Can I Make the Sun Set?
New Background
OK
New Character
Delete the cat (press and hold)
Position the sun by dragging it from the center of the screen


OpenEnergyMonitor and Nanode Hackathon from Wednesday 27th April 2011 - Monday 2nd May 2011 @Llanfrothen
Blog:
http://sustburbia.blogspot.com/
Wiki (this page): http://bit.ly/oem_2011
Twitter: http://twitter.com/search?q=#snowdonbuild
Tinychat: http://tinychat.com/snowdonbuild
Website bit.ly: http://bit.ly/openemon
Sam's photos: http://bit.ly/oem_photos send photos to<EMAIL_ADDRESS>or transfer to Sam's laptop for uploading to picasa web albums.
Glyns' photos: https://picasaweb.google.com/glyn.hudson/SnowdonBuildSesh
Members:
- Sam
- Delicious Links:
http://www.delicious.com/samthetechie/nanode - Twitter:
http://twitter.com/#!/samthetechie - Website:
http://samthetechie.com/
- Delicious Links:
Matt
Tutorial List:
Sam: Git Tutorial DONE Here is a typed up copy of a potential workflow for us collaborating on git: openenergymonitor.org/emon/node/144
KST Tutorial
Deploy EMON CMS (see below)
Sam: Google Android Hello World
Walkthrough OEM Website
Sam: Subsumtion Layer Architecture
Project List:
- Visual Display at London Hackspace: http://bit.ly/oem_lhs
- Sam + ? + ?: Hack to integrate data feeds from emon CMS into a sketchup model of the house/buildings overlayed with live sensor data. :)
- Sam: PHP code to generate the XML, CSV feeds
- Sam + Trystan: User registration, device registration(MAC), Authentication(API keys)
- Ken + Suneil: Solar powered Nanode + super caps + battery charging circuit, and RGB indicator, nanode pachube connection: get and put data.
- Ken + Suneil: Solar Tracker
- Sam + ? + ?: Nanode firmware works out of the box with emon CMS
- ?: Webserver for configuring (local)
- take best code from jeenode webserver and webduino
- Webserver for configuring (remote)
- make emon CMS easier to deploy
- Sam: Minimal LAMP stack on a live cd as a 'viewer' (CD is read-only unless it is a CDRW).
- Sam: Minimal LAMP stack on a live usb preinstalled with emon CMS.
- Energy comparisons: e.g. consumption of energy, and everyday comparisons to understand energy quantities. Other way to display energy in meaningful ways; quick indicators.. colours. Informative indicators with useful stats.
- Glyn: RFM12 Wireless nanode / EmonTx dev. Using JeeNode + Etherboard as example
Modify nanode to avoid SPI conflicts with RFM12(see below)Transmit data from JeeNode/Emon Tx to Nanode +RFM12Display wireless packet data on local web page served by nanodeDecode data into original variables- Create array of transmitter node ID's
Display variables on local web pages (served by Nanode)- Post data to EmonCMS in an intelligent way with API key of Nanode and Node ID of wireless node -Sam and Trystan started
Nanode serve local page and also post to EmonCMShttps://github.com/openenergymonitor/RF12Ethernet-/tree/master/nanode_localserver_RFData
Emoncms dev
1) Following this tutorial: http://tinsology.net/2009/06/creating-a-secure-login-system-the-right-way/
10:30am friday: A non polished multi user implementation of Emoncms now works!
1:00pm Saturday: Partial rebuild of emoncms + step by step builds of emoncms with different parts implemented. If your trying to understand the code try going through the different build steps, I intend to write up each step as an extended tutorial soon.
For now the code can all be found up on github here:
https://github.com/openenergymonitor/junkyard
Latest emoncms build on github:
https://github.com/openenergymonitor/emoncms
A little idea to help with the future hackathons (colder time of year e.g. winter). So if it gets a bit colder we can look at making a Japanese Kotasu space heater (or just use a current-munching beast of a desktop PC :) http://en.wikipedia.org/wiki/Kotatsu
Wireless Nanode Dev
GitHub Repo: https://github.com/openenergymonitor/RF12Ethernet-
Nanode and RFM12 combo (Notes..to be made tidy later)
Problem: We want to add wireless connectivity to the Nanode using the RFM12 / Hope Alph RF modules. Both the RFM12 wireless transceiver and and ENC28J60 ethernet chip on the Nanode both use the SPI bus to communicate with the Atmega328. This causes a conflict unless the chips are selected correctly.
Solution: This has been done before by Jcw from JeeLabs with this EtherCard. He gets over the problem by having the RFM12 and Ethernet chip on different slave-select (SS) lines. Ethernet on digital 8 and RFM12 on digital 10. The procedure below discribes the changes needed on the Nanode to make it compatible with the Jee Etherlibrary code. The Nanode currently also uses digital 10 as a SS for the Ethernet Card
- RFM12 uses digital 10 as SS (slave-select)
- Need to modify the nanode to use digital 8 instead of digital 10 for its Ethernet chip SS line: Solution: lift Atmega328 leg of digital 10 and connect directly to RFM12 Sel line. Put jumber between digital 8 and 10 on Nanode header to bridge Ethernet controller SS to digital 8. The Nanode is now practically identical to the JeeNode Etherboard
- If using RFM12 sketch only (no etherent) need to insert line to pull pin digital 8 high (remember to set it as output), this puts the tri-state buffer between Etherent SO and Nanode MISO into high impedance mode.
- Leg 5 or 6 of the tri-state buffer also needs to be lifted to disconnect digital 2 from Ethernet chip interrupt. Digital 2 needs to be used for RFM12 interrupt, it is not needed for Ethernet.
The JeeLabs Ethercard does not incorporate a tri-state buffer, It seems that if the SS line is used to de-select the chip the tri-state buffer is not needed to stop the chip from hogging the SPI bus
Note: Future versions of the nanode will include a user configurable hardware jumper to select SPI slave select pins for the on-board hardware
Nanode V3 Schematic:
Solar tracker build
http://sustburbia.blogspot.com/2011/04/simple-solar-tracker-cat-not-included.html
http://sustburbia.blogspot.com/2011/04/more-solar-pv-tracking-and-wireless.html
http://sustburbia.blogspot.com/2011/05/nanode-serves-solar-monitoring-data.html


{% if current_user.is_authenticated %} {% extends "layout.html" %} {% block title %} Index Page {% endblock %} {% block content %}
Do you really want to delete this story? This process cannot be undone.


Creates an one-sided polygonal geometry from one or more path shapes.
const x = 0, y = 0;
const heartShape = new THREE.Shape();
heartShape.moveTo( x + 5, y + 5 );
heartShape.bezierCurveTo( x + 5, y + 5, x + 4, y, x, y );
heartShape.bezierCurveTo( x - 6, y, x - 6, y + 7,x - 6, y + 7 );
heartShape.bezierCurveTo( x - 6, y + 11, x - 3, y + 15.4, x + 5, y + 19 );
heartShape.bezierCurveTo( x + 12, y + 15.4, x + 16, y + 11, x + 16, y + 7 );
heartShape.bezierCurveTo( x + 16, y + 7, x + 16, y, x + 10, y );
heartShape.bezierCurveTo( x + 7, y, x + 5, y + 5, x + 5, y + 5 );
const geometry = new THREE.ShapeGeometry( heartShape );
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const mesh = new THREE.Mesh( geometry, material ) ;
scene.add( mesh );
shapes — [page:Array] of shapes or a single [page:Shape shape]. Default is
a single triangle shape.
curveSegments - [page:Integer] - Number of segments per shape. Default is
12.
See the base [page:BufferGeometry] class for common properties.
An object with a property for each of the constructor parameters. Any modification after instantiation does not change the geometry.
See the base [page:BufferGeometry] class for common methods.
[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]


| dplyr_tidy_select {dplyr} | R Documentation |
This page the describes the <tidy-select>
argument modifier which indicates
the argument supports tidy selections. Tidy selection provides a concise
dialect of R for selecting variables based on their names or properties.
Tidy selection is a variant of tidy evaluation. This means that inside
functions, tidy-select arguments require special attention, as described in
the Indirection section. If you've never heard of tidy evaluation before,
start with vignette("programming")
.
Tidyverse selections implement a dialect of R where operators make it easy to select variables:
:
for selecting a range of consecutive variables.
!
for taking the complement of a set of variables.
&
and |
for selecting the intersection or the union of two
sets of variables.
c()
for combining selections.
In addition, you can use selection helpers. Some helpers select specific columns:
everything()
: Matches all variables.
last_col()
: Select last variable, possibly with an offset.
These helpers select variables by matching patterns in their names:
starts_with()
: Starts with a prefix.
ends_with()
: Ends with a suffix.
contains()
: Contains a literal string.
matches()
: Matches a regular expression.
num_range()
: Matches a numerical range like x01, x02, x03.
These helpers select variables from a character vector:
all_of()
: Matches variable names in a character vector. All
names must be present, otherwise an out-of-bounds error is
thrown.
any_of()
: Same as all_of()
, except that no error is thrown
for names that don't exist.
This helper selects variables with a function:
where()
: Applies a function to all variables and selects those
for which the function returns TRUE
.
There are two main cases:
If you have a character vector of column names, use all_of()
or any_of()
, depending on whether or not you want unknown variable
names to cause an error, e.g select(df, all_of(vars))
,
select(df, !any_of(vars))
.
If you you want the user to supply a tidyselect specification in a
function argument, embrace the function argument, e.g
select(df, {{ vars }})
.


callattendent
Project Link
Page URL
with Name
Logical Model : Model
Class Diagram - Logical View
link
Jump to:
Please select a model element
BlockedIndicator : Class
ApprovedIndicator : Class
RingIndicator : Class
VoiceMessage : Class
WebApp : Class
User Interface : Package
Hardware : Package
NomoroboService : Class
CallLogger : Class
Blacklist : Class
Whitelist : Class
CallAttendant : Class
CallScreener : Class
Modem : Class
Telephony : Package
callattendent


Piece
public struct Piece : Equatable, CustomStringConvertible
Piece on Board
with it’s color.
-
Piece kind.
Declaration
Swift
public let kind: PieceKind
-
Piece color.
Declaration
Swift
public let color: PieceColor
-
Initializes a piece with it’s kind and color.
Declaration
Swift
public init(kind: PieceKind, color: PieceColor)
Parameters
kind
Piece kind.
color
Piece color.
-
Initializes a piece with given character.
Possible values are:
K
for white king,n
for black pawn and so on.Declaration
Swift
public init?(character: Character)
Parameters
character
Character that represents a piece.
-
String that indicates the stored piece.
Possible values are:
K
for white king,r
for black rook and so on.Declaration
Swift
public var description: String { get }


{% comment "SINGLE QUOTES ONLY" %} XXX: Only use single quotes in this file, as we're trying to pass it into the data-content string of the bootstrap-select component. It's not really worth filing a bug, seeing as this is sane behavior on part of the plugin. {% endcomment %} {% comment %} {# Hiding for now, we may eventually add these back. #}
{% endcomment %}


Load File
Select a file and click 'Load' or just start adding new rows.
Loading a file renumbers the tests in that file, starting at 1
Save File
Click 'Save' and a new copy of base_tests.json will be saved to your
downloads directory. You can then overwrite the old base_tests.json or move tests to the original file
using your favourite text editor.
Add Row
Creates a new empty row at the end of the list with the next available test ID number and scrolls to the new entry.
Delete
This is an immediate delete of the row so be careful (although you can always just reload the file).
The entry is marked as DELETED and should be ignored by interpreter test harnesses. Deleted entries can be edited to be useful tests if needed.
De-dupe
Finds duplicate tests based on the input field only and marks them as deleted.


You’ll need to register a domain name if you want to set up a website for your business. A domain name is your address on the internet and gives you an online identity when setting up for your website e.g. handmade.com.au.
You’ll also need to give your domain provider an Australian Business Number (ABN) if you want to use a 'com.au' or 'net.au' domain name on your website.
Before you register a domain name, you should check that:


|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object apollo.dataadapter.das2.DAS2Request
public class DAS2Request
Adapted from das/simple/SimpleDASServer I don't understand why that class was called "server", since it's client-side. Updating to handle DAS/2. $PREFIX/sequence - a "sources" request This is the top-level entry point to a DAS 2 server. It returns a list of the available genomic sequence and their versions. $PREFIX/sequence/$SOURCE - a "source" request Returns the available versions of the given genomic sequence. $PREFIX/sequence/$SOURCE/$VERSION - a "versioned source" request Returns information about a given version of a genomic sequence. Clients may assume that the sequence and assembly are constant for a given version of a source. Note that annotation data on a server with curational write-back support may change without changing the version. In DAS1, the "dsn" request was equivalent to $PREFIX/sequence/$SOURCE/$VERSION - it gave you a complete list of versioned genome dbs, e.g., "ensembl_Anopheles_gambiae_core_28_2c", "ensembl_Anopheles_gambiae_core_29", etc.
| Field Summary | |
|---|---|
protected static org.apache.log4j.Logger |
logger
|
| Constructor Summary | |
|---|---|
DAS2Request(java.lang.String url)
You must pass in the URL of a DAS-reference server, used in all further requests. |
| Method Summary | |
|---|---|
DASDsn |
getDSN(java.lang.String uri)
Given a URI, return the DSN (if any) for that URI. |
java.util.List |
getDSNs()
Gets a list of versioned sources from the server. |
java.util.List |
getEntryPoints(DASDsn dsn)
I return all entry-points from the input SimpleDASDsn instance passed in. |
java.util.List |
getFeatures(DASDsn dsn,
DASSegment[] segmentSelection)
I am the call used by apollo to fetch annotations (features) from the input dsn, for the entry-points and ranges given by the input segments |
java.util.List |
getFeatures(DASDsn dsn,
java.util.HashMap segmentSelection,
java.util.HashMap parentFeatures,
long globalStart,
long globalEnd)
|
java.util.List |
getSequences(DASDsn dsn,
DASSegment[] segmentSelection)
I am the call used by apollo to fetch dna (sequence) from the input dsn, for the entry-points and ranges given by the input segments |
java.lang.String |
getURL()
|
java.util.List |
getVersionedSources()
|
static void |
main(java.lang.String[] args)
For testing--supply server URL on command line |
org.xml.sax.XMLReader |
setupXMLReader(org.xml.sax.helpers.DefaultHandler parser)
|
void |
setURL(java.lang.String url)
|
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
protected static final org.apache.log4j.Logger logger
| Constructor Detail |
|---|
public DAS2Request(java.lang.String url)
| Method Detail |
|---|
public void setURL(java.lang.String url)
setURL
in interface DASServerI
public org.xml.sax.XMLReader setupXMLReader(org.xml.sax.helpers.DefaultHandler parser)
public java.lang.String getURL()
getURL
in interface DASServerI
public java.util.List getDSNs()
public java.util.List getVersionedSources()
public DASDsn getDSN(java.lang.String uri)
public java.util.List getEntryPoints(DASDsn dsn)
apollo.dataadapter.das.DASSegment
interface. In this case,
I populate the returned list with instances of SimpleDASSegment
.
getEntryPoints
in interface DASServerI
public java.util.List getFeatures(DASDsn dsn, DASSegment[] segmentSelection)
I am the call used by apollo to fetch annotations (features) from the input dsn, for the entry-points and ranges given by the input segments
The return list consists of objects implementing
the apollo.dataadapter.das.DASFeature
interface. In this case,
I populate the returned list with instances of SimpleDASFeature
.
getFeatures
in interface DASServerI
public java.util.List getFeatures(DASDsn dsn, java.util.HashMap segmentSelection, java.util.HashMap parentFeatures, long globalStart, long globalEnd)
public java.util.List getSequences(DASDsn dsn, DASSegment[] segmentSelection)
I am the call used by apollo to fetch dna (sequence) from the input dsn, for the entry-points and ranges given by the input segments
The return list consists of objects implementing
the apollo.dataadapter.das.DASSequence
interface. In this case,
I populate the returned list with instances of SimpleDASSequence
.
getSequences
in interface DASServerI
segmentSelection
- A list of segments containing entry points and ranges
of interest. NOTE: I only pay attention to the FIRST element of the list -
all subsequence elements are IGNORED!!! Therefore, my return value is a list
of size 1 under all circumstances.
NOT CURRENTLY USEDpublic static void main(java.lang.String[] args)
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


# Visdown Make visualisations using only markdown --- Write visualisation using a simple declarative markup like you would write code. Just wrap it in fenced block (three backticks) and mark the language as 'vis'. Make simple visualisations ```vis data: url: "data/cars.csv" mark: point encoding: x: type: quantitative field: kmpl y: type: quantitative field: price ``` Make detailed visualisations ```vis data: url: "data/cars.csv" mark: circle encoding: x: type: quantitative field: kmpl scale: domain: [12,25] y: type: quantitative field: price scale: domain: [100,900] color: type: nominal field: type size: type: quantitative field: bhp config: cell: width: 450 height: 300 ``` # What about interaction? [vega](https://vega.github.io/vega) supports interaction, so you can tweak it to run with it. See working example @ [http://visdown.amitkaps.com/vega](http://visdown.amitkaps.com/vega) # Concept and Code Allows you to write **json** specification in simple **yaml** and uses **marked** and **vega-lite** to convert those specific code blocks in to svg. - yaml -> json (using [yaml.js](https://github.com/jeremyfa/yaml.js)) - json -> vega-lite -> svg (using [vegalite.js](https://vega.github.io/vega-lite/)) - markdown -> html (using [marked.js](https://github.com/chjj/marked)) See the code at [http://github.com/amitkaps/visdown](http://github.com/amitkaps/visdown) --- Handcrafted by [Amit Kapoor](http://amitkaps.com)


[VisAPI Index] [VisAPI Hierarchy]
Base class for all objects in the VisApi. More...
#include <VisApi/platform.h>
Specifies the basic functionality of objects in the VisApi: A reference counter to be able to provide cleaner interfaces in cases where instances of objects are returned. Allocation/Deallocation specification - an extension to the simple construction, destruction scheme where objects can be instanciated without being initialized (allocated).
virtual bool instanceOf(visClassId id) { if (id == Id) return true; return ::instanceOf(id); }
Constructor sets reference count to one and allocated to false.
Destructor.
Allocate object. Parameters may be added in sub classes.
Deallocate object and free resources. Is internally called by the destructor and reallocations.
Returns true if object is allocated with the allocate() method.
Overloading of the operator delete. On some systems this might make trouble when using with const pointers so you should prefer the decRef() method.
Return number of references to this object. Initial value at construction time is one. If this values becomes zero then this object deletes itself.
Increment number of refences by one.
Decrement number of refences by one. If this values becomes zero then this object deletes itself.
Call this method to sign a substancial change in this object. If you do so then properly document this behavour in all methods and conditions that cause this change. Also think of adding new methods to handle changes. E.g. if members of an array change then you could add methods like isModified() in the public declaration or a change of a window size could result in a new method like isChangedWindowSize() etc.
Number of references.
True if allocated.
| Kdoc |


A profile is a set of configurations on service capabilities (including resource tuning, QoS) of storage resources. A profile must be specified when volume is created.
To create a new profile click on the Create button in the Profile page and fill the details.
- Name: has to be unique
- Description: What is this profile for?
- Storage Type: Block or File?
- Provisioning Type: iSCSI, FC, RBD in case of Block type. NFS, CIFS in case of File type.
- Storage Access Capability (only File type): read, write, execute.
Additionally you can also set some policies like:
- QoS Policy (Both Block and File type): Maximum IOPS, Minimum IOPS, Maximum BWS, Minimum BWS and Latency
- Snapshot Policy (Both Block and File type): Enable Automatic snapshot, Schedule, Execution time and Retention.
- Replication Policy (Block type only): Type, Mode, Period, Bandwidth, RGO, RTO, RPO, Consistency.


Amway
Nutrilite Balanced Health Omega ...
Description
Amway Nutrilite Balanced Health Omega
*** NEW *** SEALED BRAND NEW!
Product Overview
90 softgels
Support brain and eye health
Get the equivalent DHA and EPA omega 3s found in 15.75 ounces, or three servings, of ocean fish.
- Helps support memory, learning, and concentration with DHA1 omega 3s.†
- Supports nerves and helps keep blood flowing and joints moving with EPA2 omega 3s.†
- Supports optimal heart health.†
- Reduces the fishy aftertaste common in fish oil supplements through our proprietary six-step process.
1Docosahexaenoic acid.
2Eicosapentaenoic acid.
†This statement has not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.
Usage Rate: 90 Use(s) per Bottle
Recommended use: 3 Use(s) per day
Description
Nutrilite® Balanced Health Omega provides a concentrated blend of two key omega-3 fatty acids. Taken daily throughout the week, the combination provides the same amount of DHA and EPA as 15.75 ounces, or three servings, of ocean fish.
Benefits
- Support for normal blood triglycerides and healthy blood flow
- Help maintain joint mobility for an active lifestyle
- May promote normal brain function and concentration
- A special, six-step process reduces unpleasant side effects common to competitors' Omega-3 products
Product Advantage
Nutrilite® Balanced Health Omega provides a concentrated blend of two key omega-3 fatty acids – EPA and DHA. Taken daily throughout the week, the combination provides the same amount of DHA and EPA as 15.75 ounces, or three servings, of ocean fish.
Advisories
Children under 12 years of age, pregnant women or nursing mothers, anyone with a medical condition, or anyone on blood-thinning medication should consult with a physician before using this product. Keep out of reach of children.
Frequently Asked Questions
What are omega-3 fatty acids, and why do I need them?
Omega-3 fatty acids are long-chain polyunsaturated fatty acids. They are building blocks of every living cell in the human body and required for optimal function of the cells. If you are not currently consuming at least two meals of fatty fish per week, you may benefit from a supplement rich in EPA and DHA
I have heard that fat is bad for you. How can omega-3 fatty acids be good for you?
There are good and not-so-good fats. If a label indicates hydrogenated or partially hydrogenated oils, that ingredient is an unsaturated fat that has undergone a chemical process called hydrogenation to turn it into saturated fat and trans fat. These hydrogenated fats are most often found in packaged foods such as pastries, cookies, and margarine.
Saturated fats are found in animal-based foods like meat, butter, and cheese. Saturated fats are not "bad" for you but a high intake of saturated fats as compared to poly- and monounsaturated fats is associated with an increased risk of some diseases.
But some "good fats" like omega-3 fatty acids contribute to health and normal cell development. They're building blocks of every living cell in your body. A cell membrane made with building blocks that come primarily from saturated fat has a different structure and is less fluid than one that incorporates more omega-3 fatty acids. This loss of fluidity makes it difficult for the cell to carry out its normal functions and increases the cell's susceptibility to injury and death.
Omega-3 fatty acids are abundant in ocean fish, but many people in North America don't eat a lot of fish and may need more omega-3 fatty acids than their present diets provide.
Are there any adverse drug interactions with omega 3s?
Omega 3s from fish oil like those in Nutrilite® Balanced Health Omega supplements have been shown to be safe if your total dietary daily intake (including food) does not exceed 3 grams. Daily intake of dietary supplements of omega 3 should not exceed 2 grams. Generally speaking, if you have no difficulties eating ocean fish, supplementation with omega 3 from fish oil should present no adverse effects at levels of 2 grams or less.
Certain medications may interact with omega-3 fatty acids. These drug interactions include aspirin, anticoagulants, Warfarin (coumadin), and other medications that alter blood coagulation. If you are taking any of these medications, please consult your physician before adding an omega-3 supplement to your diet. It is always important to tell your pharmacist or health care professional that you are taking any supplement, including those made from concentrated fish oil. And if you notice any changes in your physical health while taking the supplements, you should also contact your health care provider. This is especially important for children under 12 years of age, pregnant or nursing women, or anyone with a medical condition.
What is the difference between EPA and DHA?
Omega-3 fatty acids are important to every cell in your body and must be obtained from the diet for good health. Our bodies use omega 3s to form the outer cell structure. EPA (eicosapentaenoic acid) and DHA (docosahexaenoic acid) are two of the most important omega 3s.
Research suggests that EPA benefits the heart and circulatory system by promoting normal lipid levels and blood flow. EPA also plays a role in the natural movement of joints.
Evidence shows DHA is an important building block of the brain, nerves, and eyes. DHA is the most highly unsaturated fatty acid found in nature. DHA supports normal mental function, optimal memory, focus, and learning. In fetuses and infants, DHA is critical for brain and vision development.
The average American diet contains less than 200 milligrams of the important omega 3s EPA and DHA. Japan, England, and several European countries have set Recommended Daily Allowances for omega 3s, but there are none in the U.S. yet.
I take a multivitamin every day. Do I need an omega-3 or glucosamine supplement as well?
Multivitamins provide nutritional insurance to help you and your family fill the nutritional gaps between what you actually eat and what you should eat. However, most multivitamins do not contain any omega-3 fatty acids, and many people in North America are not getting enough omega 3s. If you are not eating ocean fish at least twice a week, you may benefit from omega-3 supplements. Most multivitamins don't contain any glucosamine either, and if you are concerned about your joint health, you may benefit from a glucosamine supplement.
Do I still have to eat fish if I am taking a Nutrilite® omega-3 supplement?
It is always a good idea to eat whole foods rich in omega-3 fatty acids, and ocean fish is the best source. But if you don't eat ocean fish at least twice a week, Nutrilite® omega-3 supplements can help you get the important EPA and DHA that might be missing from your diet.
Frequently Bought Together
Payment
We accept PayPal Only. All major credit cards are accepted through secure payment processor PayPal.
Shipping
PLEASE READ!!!
Feel Safe to Buy with us read our Feedback is our business!!!
Shipping out in next business day if you choose on weekend
Excludes: Alaska/Hawaii, APO/FPO, US Protectorates, South America, Puerto Rico, PO Box ARE NOT AVAILABLE!!!!!
It usually takes 2 - 3 days of handling time. For orders within the US it takes 5 - 7 business days maximum after handling.
When can you expect your order? Allow at least 2 to 3 days for tracking number to post.
When I know, you will know.
If you want cancel order we can do only before shipping...
Purchase Terms and Conditions
- Your order will be processed within 1 business day after receipt of cleared payment.
- We Only Provide Shipping to the 48 Contiguous United States.
- We are unable to ship PO Box.
- We do not combine shipping.
- 30 days in order to get your money back or item exchange*, buyer pays return shipping.
- Buyers Pay for Return Shipping Cost.
- All emails will be answered within 1 business day. If you do not receive our reply, please kindly re-sent your e-mail, and we will reply to you as soon as possible.
- All items sold by us are being described to the best of our abilities, as accurate as possible, and with utmost conscientiousness on our part. However, to avoid any potential oversights, I respectfully request your assistance in helping us to make this a mutually satisfactory transaction by Thoroughly reviewing item description and photos, and asking all questions Prior To Bidding.
- Please Note that size and color representation are subject to manufacturing variance and may not be exact. Also note that monitor settings may vary from computer to computer and may distort actual colors.
- Before you report any problem to Ebay wait for our answer.
- If there is something let you unsatisfy, please do not leave negative or neutral feedback we will try best to solve your problem and ensure your requirement.
- Please leave POSITIVE FEEDBACK after receiving the product


Hierarch Kekropus:
Then I must confirm that you have the ability to control magical powers. Other key areas will also be tested. Go to Casca and, if you gain his approval, return here and I will test you. Are you ready?
"Yes, I am ready."


{% extends 'base.html' %} {% load staticfiles %} {% load crispy_forms_tags %} {% block title %}{{ block.super }}Colleges{% endblock %} {% block content %}
Getting a good college marks the journey into higher education and the career world. The following colleges have a variety of courses that you can choose from at the comfort of your home to help you in making your decision concerning your higher education.


All the data you enter into this application is stored locally in your browser, so some browser-data-cleanup-utilities might delete your local projects and your BOM-Table.
This is only a first experimental version showing the idea of having a library of BOMs, that then can be added to a combined BOM, that allows to calculate part counts and costs.
The structure of the combined BOM is inspired by the "Modular in a Week"-Excel Sheet.
What works
Displaying a list of projects that are loaded from the repository
Clicking on a project and adding it to the BOM
When adding a project the Project-BOM is somewhat merged into the existing table
Loading comments/note from BOM
Showing more information in the project dialog, like description, project links, project bom, ...
Automatic sorting of rows based on category and values
Somewhat persistent saving of the BOM and selected projects
Showing Project Titles in the BOM-Tab
Synchronisation between multiple Tabs/Windows
Custom context menu that prevents deleting locked rows and columns
Whats missing in no particular order:
Allow projects to reference other projects. E.g. because they are an extension
Allow to mark projects as favorites, show list of favorites
Mark projects in library that are already in BOM or favorites
More projects in the library
Form to add new projects
Search and Filter functions for the library
Function to merge 2 rows, because they represent the same component but weren't automatically merged
Default values for component costs
More Categorys
More Tags
Advanced Functionality:
Creating a Master-Gist
Use GitHub-API to query all Forks of Master-Gist
Treat Forks of master gists as user contributed projects
Show star/comment count for gist-projects
Allow to Login with GitHub-Account using AppAuth-JS
Create forks of master-Gist/new gist-projects directly from the webapp
If you added this project to your BOM the changes here will not be reflected in the BOM automatically. Readd the project to your BOM to get the latest version.
For now there is no automatic exporting available, sorry.
You have to create a pull request for this GitHub repository with a file named bomproject.json containing this json:


--- layout: post title: Tehina Recipe - Food.com date: type: post parent_id: '0' published: false image: assets/images/post-img/ status: draft categories: - Etc. tags: [] meta: _wpas_done_all: '1' _wpghs_github_path: _posts/2016-04-18-tehina-recipe-food-com.md _sha: a76d63aa94adc4ea7483f43fee4877fcf2e7ebe3 _edit_last: '1' _posts_by_tag_page_fields: a:2:{s:12:"widget_title";s:0:"";s:11:"widget_tags";s:0:"";} author: login: mkelley email<EMAIL_ADDRESS>display_name: Mike first_name: Mike last_name: Kelley ---
This is the best tehina Ive ever tasted! My mother in-law taught me how to make it. I love the texture, its very light and creamy. You can use it in hummous, baba ganouj, salad dressing or on its own as a spread or dip.
Source: Tehina Recipe - Food.com


- face(Point2D) - Method in class com.bham.bd.components.characters.agents.Agent
-
Changes angle to align with a specified point
- face(ItemType) - Method in class com.bham.bd.components.characters.agents.Agent
-
Changes angle to align with a specified closest item type
- failed - Static variable in class com.bham.bd.application.TestApplication
-
- failed - Static variable in class com.bham.bd.entity.ai.goals.atomic.Goal
-
- fetchPathFromAlgorithm() - Method in class com.bham.bd.entity.ai.navigation.impl.PathPlanner
-
- FG_1 - Variable in class com.bham.bd.view.model.MenuButton
-
- FG_2 - Variable in class com.bham.bd.view.model.MenuButton
-
- finalize() - Method in class com.bham.bd.entity.BaseGameEntity
-
- FindActiveTrigger() - Constructor for class com.bham.bd.entity.ai.navigation.algorithms.policies.TerminationPolices.FindActiveTrigger
-
- findNumEnemies2Spawn(int, double) - Method in class com.bham.bd.entity.ai.director.Director
-
Helper function to help make the buildUp function cleaner
- fire() - Method in class com.bham.bd.components.characters.Player
-
Shoots a default bullet (or multiple)
- FireLaser() - Method in class com.bham.bd.components.characters.Player
-
- fitting(HashSet<GraphNode>) - Method in class com.bham.bd.entity.graph.SparseGraph
-
- Floodfill - Class in com.bham.bd.entity.graph.algorithm
-
- Floodfill(GraphNode) - Constructor for class com.bham.bd.entity.graph.algorithm.Floodfill
-
Constructs Floodfill Object and initialize it
- floodFill(SparseGraph, GraphNode) - Method in class com.bham.bd.entity.graph.HandyGraphFunctions
-
- follow_edge - Static variable in class com.bham.bd.entity.ai.goals.GoalTypes
-
- follow_path - Static variable in class com.bham.bd.entity.ai.goals.GoalTypes
-
- FollowEdge - Class in com.bham.bd.entity.ai.goals.atomic
-
class to define behavior for passing a path edge
- FollowEdge(GameCharacter, PathEdge) - Constructor for class com.bham.bd.entity.ai.goals.atomic.FollowEdge
-
constructor
- FollowPath - Class in com.bham.bd.entity.ai.goals.composite.helper
-
The class to define how an agent follow a path
- FollowPath(GameCharacter, List<PathEdge>) - Constructor for class com.bham.bd.entity.ai.goals.composite.helper.FollowPath
-
- FRAME_RATE - Static variable in class com.bham.bd.view.GameSession
-
Desired number of updates per second
- FreePathCondition - Class in com.bham.bd.entity.ai.behavior
-
Condition for checking whether a straight path (represented as a rectangle) between 2 points
is free.
- FreePathCondition() - Constructor for class com.bham.bd.entity.ai.behavior.FreePathCondition
-
Constructs a condition with placeholder points and a radius of 1 representing the path as a line
- FreePathCondition(double) - Constructor for class com.bham.bd.entity.ai.behavior.FreePathCondition
-
Constructs a condition with placeholder points and a given radius
- FreePathCondition(Point2D, Point2D) - Constructor for class com.bham.bd.entity.ai.behavior.FreePathCondition
-
Constructs a condition with 2 provided points and setting radius to 1 (as if it was a line)
- FreePathCondition(Point2D, Point2D, double) - Constructor for class com.bham.bd.entity.ai.behavior.FreePathCondition
-
Constructs a condition with 2 provided points and a given radius
- Freeze - Class in com.bham.bd.components.triggers.traps
-
Representing a Freeze Trap Trigger that will disable player to move for few seconds
- Freeze(int, int, int, int) - Constructor for class com.bham.bd.components.triggers.traps.Freeze
-
Construct a Freeze trigger in a position with respawn time
- FreezeTest() - Method in class com.bham.bd.components.triggers.TriggerTest
-
- frequencies - Variable in class com.bham.bd.audio.AudioAnalyser
-
Array of float values representing frequencies of every band
- FRICTION - Static variable in class com.bham.bd.entity.physics.Steering
-
- from - Variable in class com.bham.bd.entity.graph.edge.GraphEdge
-
- fullHp - Variable in class com.bham.bd.components.characters.GameCharacter
-
Current full hp value possible for the character (note: not current hp)


FACILITATION AND RETARDATION OF INSTRUMENTAL APPETITIVE LEARNING
BY PRIOR PAVLOVIAN AVERSIVE CONDITIONING
By Edward A. Domber, Jr. A.B., Drew University, 1967
M.S., University of Pittsburgh, 1969
Submitted to the Graduate Faculty in the Faculty of the Arts and Sciences in partial fulfillment of the requirements for the degree of
Doctor of Philosophy
University of Pittsburgh
1971
Reproduced with permission of the copyright owner. Further reproduction prohibited without permission.


Provides classes and interfaces adapting {@linkplain java.util.logging.Logger Java logging} to the Fluency project.


We're sorry but vue-cosnics-plugins doesn't work properly without JavaScript enabled. Please enable it to continue.
Rubrics Demo
Rubrics


This is Shoping a website. This is Shoping a website. This is Shoping a website.This is Shoping a website.
Hello....I am working as a developer.
Hello....I am working as a developer.
Hello....I am working as a developer.
Hello....I am working as a developer.
Hello....I am working as a developer.
Hello....I am working as a developer.


MdGridListModule
| Name | Description |
|---|---|
@Input() cols
|
Amount of columns in the grid list. |
@Input() gutterSize
|
Size of the grid list's gutter in pixels. |
@Input() rowHeight
|
Set internal representation of row height from the user-provided value. |


One of the drivers for IT Infrastructure's allocation methodology is headcount. At this time, Enron Net Works would like to verify 2002 plan headcount for your business units. I have attached the 2002 headcount template that was completed for Corporate back in June. Please update this template to reflect your latest 2002 headcount information.
The deadline to return this information to me is by the end of the day, Tuesday, October 2nd. If you have any questions, please call.
Thanks,
Kevin
x52508
***********
EDRM Enron Email Data Set has been produced in EML, PST and NSF format by ZL Technologies, Inc. This Data Set is licensed under a Creative Commons Attribution 3.0 United States License <http://creativecommons.org/licenses/by/3.0/us/> . To provide attribution, please cite to "ZL Technologies, Inc. (http://www.zlti.com)."
***********
California


Code Streamers allows programmers to stream code that they're currently working on so other users can watch the action.
Progammers can log in using their Facebook account and set up a live stream. They can then send out the link to their friends, who can watch in real time as the programmer types his code.
Click here to try out the app!


My dear friend Shadaab, there has come a day that Allah has allowed you to fall in love. And I pray to Him that he never allow you to fall out of it. May this marriage make you realize that how lucky you are because you will be bound to a partner which will complement to yourself.  Marriage will not be bed of roses but she will be something you'll pursue the best in, always thinking of her first, considering how she feels, and determined to treat her better than any other man on earth could have. I also pray that you two grow old together and despite the flaws and your fraying, you're made stronger than you two ever were separate. May Allah also plants a seed in you two that you two pray for each other to be united in goodness in afterlife as well.
"Accept my heartiest congratulations on the precious event of your Nikah. May you both stay always happy and may your life get filled with lots of cheers."
 The best ever desire is to remain always happy, may your this desire gets fulfilled. Happiness will be always on your door, Wish you a happy life. Best of luck for your future life, may you both remain such happy and smiling throughout the whole life, Allah bless you both."
Are You Attending?
Please Fill-up the form and we will get your wishes directly from here!


We're sorry but novelslist doesn't work properly without JavaScript enabled. Please enable it to continue.


Lost in space?
Page not found for the Space Telescope Console for Analysis and Trending (SpaceCAT)
Ooops, we meant to say JWQL
{% extends "base.html" %} {% block preamble %}
Page not found for the Space Telescope Console for Analysis and Trending (SpaceCAT)
Ooops, we meant to say JWQL


A simulation of a system of massive particles and fixed-distance constraints between them. The method, using Verlet integration and iterative constraint relaxation, is developed by Thomas Jakobsen(2001).
This demonstration is implemented in javascript, with HTML/CSS visualisation.


Software
Overview
Demo
Documentation
Case Study
Overview
Modeling Strategy
Model Performance
Data Engineering
Team
Product
Case Study


Jeff Bezos | Tribute Page
1993 - 1994
In late 1993, Bezos decided to start an online bookstore. He left his job at D. E. Shaw and founded Amazon in his garage on July 5, 1994, after writing its business plan on a trip from New York to Seattle. Bezos named his new company Amazon
1997 - 1998
Bezos diversified into the online sale of music and video; by the end of the year, he had also expanded the company's products to include a variety of consumer goods. Bezos used the $54 million raised during the company's 1997 equity offering to finance aggressive acquisition of smaller competitors.
2006 - 2007
Bezos launched the Amazon Kindle. According to a 2008 Time profile, Bezos wished to create the same flow state found in video game simulations in books; he wished readers would fully engage with books.
2015 - 2016
In May 2016, Bezos sold slightly more than one million shares of his holdings in the company for $671 million, largest sum he had ever raised from selling some of his Amazon stock. On August 4, 2016, Bezos sold another million of his shares for $756.7 million.


--- layout: default title: Forms ---
This is a contextual wb-form-help for the field above.
This is an error message for the field above.