6.810 Engineering Interactive Technologies (fall 2021)
Lab 3: Sending Touch Data to Processing
In this lab, you are going to connect your card to Processing: When you push the physical touch button it will light up the corresponding digital touch button in Processing and the associated song will play.
Steps:
- Install Processing
- Create New Processing Program
- Open Serial Connection in Processing
- Serial Read Data into Processing
- Extract Touch Sensor Information from the String
- Draw Digital Touch Button
- Connect Incoming Touch Signal to Digital Touch Button
- Install Processing Sound Library + Run Skeleton Code
- Implement Digital Music Card
- Integrate Touch Sensing with Music Application
Deliverables
At the end of the lab, upload to your student google drive:
- the Processing code (.pde) you wrote for Serial communication that displays the three touch buttons
- the Processing code (.pde) of the music card application
- a short video (.mov or .mp4, max. 1 minute, 20MB or less) showing how you use the printed music card, i.e. touch the buttons with your finger to play/pause a song and go to the previous/next song
Help us Improve Class Materials for Lab3:
Please let us know if you had any trouble with the programming or if anything was confusing in the write up.
You can add your comments here.
Before you start
Join Slack Channels for 'Lab3' and your table number, e.g. 'Table6': Similar to last lab, please join the lab's slack channel and the channel with the table number you are sitting at.
Make sure everything from last lab is still working: Before getting started with the new content, let's first make sure everything from last lab is still working. Connect your printed music card to the ESP32 microcontroller and the ESP to your computer via the USB cable. Upload the Arduino program that you wrote in the last lab. Check that when touching one of the touch buttons you see the touch signal printed on the Arduino Serial monitor. If you see this, you are ready to start today's lab. If everything looks good, you are ready to move on.
(1) Install Processing
Since Arduino has no libraries for graphical user interfaces,
we will send our touch signals to a program called Processing
that can render our music card and the touch buttons on the screen. Processing is a user interface protoyping platform that is based on Java. It was created by MIT students (and others) in their spare time in 2001 and is nowadays used by thousands of makers and UI designers.
Install Processing: You can download and install Processing using the link here.
Getting Started Tutorials: Processing has useful minitutorials with code snippets that you can find here.
Processing API: You can find all available classes and functions here in the Processing API.
(2) Create New Processing Program
Create New Processing Program: Open Processing and create a new program.
setup() and draw() functions: Similar to Arduino, every Processing program has two functions: one that is executed only once when you run the script called setup()
, and another function that loops forever called draw()
. Create both functions in your empty Processing file.
void setup() { // runs only once
}
void draw() { //runs infinitely
}
(3) Open Serial Connection in Processing
In the last lab, we wrote a program that sends our touch signals from the ESP microcontroller through the Serial port (USB cable)
to our computer. We had then used the Serial Monitor
in the Arduino Programming environment to look at the touch signals coming through the Serial port. However, since any program can read from the Serial port, we are not dependent on Arduino, and can also use Processing to read the data and do something interesting with it.
Import Serial Library: Import the Serial library at the top of your Processing file.
import processing.serial.*;
Open Serial Connection: Next, let's define the serial connection in the setup()
function we just created. To open the serial connection, you need to create a new port
that can be used for communication by creating an object from this class:
Serial myPort;
To create the port, you need to define three things:
- which
application
will listen to the port (i.e. this
one)
- which
portname
to use (same as you selected in the Arduino menu when you clicked Tools -> Port
)
- which
baudrate
is expected to be able to decode the messages (same as you defined in your Arduino .ino code
)
myPort = new Serial(this, String portName, int baudrate);
portName: For the portName,
you can get a list of all available ports from the Serial library. By accessing different buckets of the list, you can get access to the name of each port. The correct port is the one you also used in your Arduino program, i.e. this is where the microcontroller is connected to your laptop. Check if the correct portname is in bucket 0, 1, or 2 by printing it and then use the bucket as the parameter in the Serial constructor.
// check which port you use: 0, 1, 2?
String portName = Serial.list()[0];
print(portName);
baudrate: For the baudrate
, you already know this from your Arduino program that you uploaded to the microcontroller. Check in your Arduino program with which baudrate you initialized the Serial communication and then use it as the parameter in the Serial constructor. If you use a different baudrate than you wrote into the Arduino program, you will only get a lot of random stuff back since your Processing application will not know how to 'translate' the messages that are coming from the microcontroller since it would 'speak' at a different frequency than the Processing application would 'listen'.
Now that the port is defined, your program can listen to it and check if data is available.
(4) Serial Read Data into Processing
Now that we have the port defined, we can see if data is available and if the answer is yes, we can read the data from the port.
Reading Serial Data into a String: Below, we provide some starter code for you to read the Serial data
into a string
. Add the lines to your draw()
function so they are executed continuously:
// we are sending data in the format: (sensor ID),(is_touched); (4 characters)
// (sensor ID) is either 0, 1 or 2 and represents the ID of the observed touch sensor
// (is_touched) is either 0 or 1 (0 if the sensor is not touched, and 1 if it is touched)
// If there is a message with at least 4 characters
if (myPort.available() >= 4) {
// read a String until the character ';' is found, which indicates the end of our message
String val = myPort.readStringUntil(';');
}
Let's go into more detail what this code is doing:
Check if Serial messages are available:
First, you have to check if the ESP microcontroller has sent something. You can do that with the function myPort.available()
, which returns how many characters are available on the Serial stack. Remember that you formatted the touch signals with two numbers and two other character, e.g., 0,1;
. These are 4 characters. Thus, you want to process the signal only if at least 4 characters got send over Serial.
Reading Serial messages:
Serial messages can be read into Processing with the function myPort.readStringUntil()
. This function reads in all characters until a stop symbol you can define is found, and then converts the individual characters into a string. In the code above, we defined the stop signal to be a semicolon (;) since we had formatted all Serial message in lab 2 to end with one.
Print Received Strings: Next, print the received String values to the Processing command line
using the print()
function.
Testing if you Receive Data: Before you run your Processing program, check one more time that your printed touch button is wired to the ESP and the ESP is connected to your computer. Check that the ESP is actually on and running its microcontroller program. Once you confirmed this, run your Processing program, and touch your touch sensor to see if the statements you printed to Serial port are getting printed on the Processing command line
. If you are getting a ‘port busy’ error
, make sure you close the Serial Monitor in the Arduino IDE
. Only one program can read from the Serial port at a time, so if the Arduino Serial Monitor reads from the Serial Port it will not be possible for Processing to get access to the data as well.
(5) Extract Touch Sensor Information from the String
What we are currently printing to the command line are Strings in the format of 0,1; (sensor_ID,is_touched;)
. However, to do something useful with this data in our code, we have to split it into individual values
, i.e. the sensor_ID and and if the sensor is touched/not touched.
String split() function: Use the String split()
function to split your String into individual values. You can find information on split()
and how to use it in the Java String reference
. Once you have both the sensor_ID
and is_touched
separated, we recommend you check that this is working by printing them to the command line before moving on.
(6) Draw a Digital Touch Button
In the next step, we want to create a touch button (i.e., a circle) that is gray if the touch sensor is touched
and red if the touch sensor is not touched
. Let's start with a single button for touch sensor #1 and you can extend this script later.
Set Size of GUI window: When a new Processing window is created, it has a default size. However, for our purposes we need a larger window. Use the size()
function to set the size of the window to 500px x 500px
. You can find more information about size() here in the Processing reference.
Create a button/circle: Create a button (i.e., a circle) with a width of 100px
and a height of 100px
. You can find useful information on how to do this here in the ellipse
reference and the ellipseMode
reference.
Color the circle: Color the circle in a color of your choice. You can find more information about this in the fill()
reference. If you also want to color the background as well you can find out about this in the background()
reference.
Once you are done it should look like this:
(7) Connect Incoming Touch Signal to On-Screen Touch Button
Next, we will connect the color of the circle to the incoming touch signal for touch button #1
.
A gray
circle shows that the touch button is not touched
.
A red
circle shows that the touch button is being touched
.
Identifying if Incoming Touch Signal is for Touch Button 1: Use a String comparison to find out which data belongs to touch button #1. Remember you cannot use stringVariable == "StringValue"
. Instead you need to use equals()
. Check the reference here for equals()
. If you plan to use a boolean in Processing, the datatype is spelled out boolean myVariable;
not bool
like in Arduino.
Redrawing the Circle: When you add or modify a shape in Processing, the old shape will not disappear but remain in the Processing window. Use background(255);
or any other color you like to erase all content in your window and let the new circles be redrawn everytime the draw()
function is executed.
Once you are done, it should look like in the image above (without the text).
Extend Visualization to 3x Touch Buttons Once you have the first touch button done, extend the user interface to have a circle for all three touch sensors. It should look like the image below .
Test Touching Multiple Buttons Simultaneously: Touching multiple touch sensors simultaenously also works with the code you have. This should be a bit surprising to you, since we can only read one message at a time
in the draw()
function. The reason it still works is that we are reading messages at such a high speed
that the processing gap is not visible to the human eye.
(8) Install Processing Sound Library + Run Skeleton Code
Now that you have basic touch input working in Processing,
you can connect it to our music player application.
Install Processing Sound Library: Before you can use Processing to play music, you need to install the Processing Sound Library
. In Processing, go to Sketch -> Import Library -> Add Library
. Then in the Libraries
tab, search for sound
and install the one that is officially from Processing (see image below).
Run Skeleton Code: Once you have the library installed, download our music card skeleton code from here. Inside the folder, open and run the music_card_nosolution.pde
, it will take a little while to load until you see the music card image in the view because we also load the mp3 audio files for the songs
, which takes some time. You should see the music card being loaded into your application as shown below. If you don't see it, please let us know.
(9) Implement Digital Music Card
Let's implement the digital music card. When we press the notes on the screen they should have the following functionality:
Music Card Functionality:
left note:
previous song
middle note:
play/pause
right note:
next song
Convert On-Screen Notes into Buttons: To convert the notes on screen into buttons, we already implemented a class Buttons
for you. You can make a new button with:
myButtons.add(new Button(x_top_left, y_top_left, x_bottom_right, y_bottom_right, drawing-mode));
Please add your buttons to line 49
onwards. One of the buttons is already defined there:
myButtons.add(new Button(360, 180, 440, 260, "Ellipse")); //line 49
Your final result should look like this:
Create Button Press Events: To create events on mouse click, we need to implement several mousePressed()
events. We already did this for you in the code further down in the class.
We first iterate over all the buttons you created and then depending on the button ID
, we execute a music function
. We created a music class
that loads several example songs in your project folder and has the functions:
music.play();
music.pause();
music.back();
music.forward();
You can see in the switch/case
code that we already assigned the middle button to play/pause music
. Extend the code to also go to the next
and previous songs
. To test your code, click onto each note and see if the expected music playing functionality is executed.
Hide the Touch Buttons: While we want to have a touch button on each note, we don't want to see the white ellipses since they make the card look less good. We already prepared a piece of code for this for you: Press the 'h' key (hide)
on your keyboard while your program runs.
It will hide the buttons but you can still click on them. If you want to see them again, press the 's' key (show)
. Study the code to see where this was implemented and how we did it.
(10) Integrate Touch Sensing with Music Application
Now that you have the user interface that allows you to digitally control the music and you tested that everything works by clicking onto each note to play/pause and go to previous/next song, you are ready to also play music from the physical card
.
Add Previous Touch Bar Code to Music Application: To be able to play music from the physical card, you have to add code for reading the touch button messages from the Serial port
to the music card application. You already implemented the Serial reading and message decoding above, i.e. the Processing application you wrote for displaying the touch buttons that change their color from red to gray when touched. Add this code to the music card program and instead of changing the color of the touch buttons you are now calling the music functions.
Test Physical Card: Once you have finished the code, try if it works by touching the notes of your printed music card to play/pause the song and go to the next/previous song.
Deliverables
At the end of the lab, upload to your student google drive:
- the Processing code (.pde) you wrote for Serial communication that displays the three touch buttons
- the Processing code (.pde) of the music card application
- a short video (.mov or .mp4, max. 1 minute, 20MB or less) showing how you use the printed music card, i.e. touch the buttons with your finger to play/pause a song and go to the previous/next song
Please let us know if you had any trouble with the programming or if anything was confusing in the write up.
You can add your comments here.
application
will listen to the port (i.e. this
one)portname
to use (same as you selected in the Arduino menu when you clicked Tools -> Port
)baudrate
is expected to be able to decode the messages (same as you defined in your Arduino .ino code
)left note:
previous songmiddle note:
play/pauseright note:
next song


This page will serve as the main demo and development page for
WESPEn - WebGL EcmaSscript 6 Rendering and Physics Engine.
All Git commit logs will explain added functionality. Read that and study the additions.
Check out different commits to see the state of the engine after that functionality was added.


Our friend Jeff MacDonald worked for a week painting backdrops. The results truly have altered the appearance and broadened our horizons! Below is the Laurentian Divider with painted sky and a new fascia. Photo taken August 2011.
Some various shots taken August 2011: Top left, Ranier Minnesota on the left side of the aisle, Cook, Minnesota on the right. Top right, looks over the West Virginia roundhouse toward the Laurentian Divide, Ft. Francis Ontario is to the left of the photo. Lower left is West Duluth with some of the buildings being placed. Lower right, West Duluth yard looking toward the “Hill”.
“The Hill” Elys Peak has the support structure for the hard-shell to come. Just visible inside the web is the tunnel. It ended up being just over four feet long. The tunnel liner is blue insulation board that has been carved and painted to represent blasted rock. The middle section will have an access hatch built in for cleaning the track. Scenery formers also line the right side against the backdrop. We are cutting these former from 1” thick expanded foam insulation board.
Another look at those scenery formers, (or ribs) that will support the expanded foam hard-shell. We decided to use the type of scenery developed by Bragdon Enterprises, “Geodesic Scenery”. http://www.bragdonent.com/
While we are not concerned about weight, we are wanting to move fast and be as clean as possible. This approach give us speed and relative neatness. We do end up with a lot of foam scrap and such, but that is easier to clean up than plaster dust and splatters.
Lower left photo, There was some left over bits of hard-shell left over from some previous scenery so it was used around this stone arch bridge. Everything is hot glued together so the one annoying by product is the string from the hot glue. It gets everywhere! Watch out for the hot glue itself; we are using a high wattage industrial glue gun and the glue is ultra hot. We wear cheap mechanic type gloves found at Harbor Freight and long sleeves. Scott still managed to get a couple of nasty burns when his attention was diverted. In spite of all that, the scenery goes quickly and the strings can be melted with a hot air gun.
Below: Three views of the Stewart Creek trestle on the south approach to the tunnel. It is made from the resin girders sold by Scenic Express. The abutments are castings made in our own shops. The deck is wooden bridge ties with hand-spiked rail. Lower left photo: the plate girder bridge that carries the loop over itself is seen in the distance.
Above Left: CN GP-9 #4307 is swallowed by the South portal of the tunnel under Ely’s Peak. Middle: the outside of the tunnel liner under the scenery formers. Above Right: CN GP-9 #4307 emerging through the North portal. This area will feature lots of rock castings and vertical scenery. It is the only location on the railroad to feature rugged, rocky terrain.
North of the tunnel is the Koki Creek bridge. Similar to Stewart Creek except for a cast concrete pillar instead of steel trestle bents.


[1] because of it more or less works as advertised and ipad would n't really NEED HD but this was n't my EEE pc running WinXP..
[2] really say because of it more or less works as advertised and ipad would n't really NEED HD but this was n't my EEE pc running WinXP..


STELLAR POINTS
Today April 13 2015
+805.00
Ranking: 54º
Skills
Strength -
80
Speed -
65
Coordination -
40
Flexibility -
70
COMPLETED MISSION RATIO
MISSION: Base Station Walk-Back
MISSION: Crew Strength Training
MISSION: Building an Astronaut Core
MISSION: Agility Astro-Course


You have successfully authenticated to the server using your CAC card!
You successfully authenticated the following information:
nonce: {{myNonce}}
hash: {{myHash}}
Signature: {{mySignature}}


Landing Page
Special Projects
This story is part of a series of specially designed stories that represents some of the best journalism The Post has to offer. Check out the rest of the special projects here.
Marcus Pavilonis
10/4/2018
Representation in film, television and music is important.  In the mainstream music industry, there have been many artists and bands that have used their platforms and their personal lives to promote a message of inclusion and acceptance. Classic artists such as Elton John or the great-late Freddie Mercury to more modern artists; such as, England’s Sam Smith or YouTube-sensation Troye Sivan, LGBT recognition is prevalent in the music industry. Here are seven lesser known LGBT artists that are making great hits:
Love, Simon was the first gay, coming-of-age romantic-comedy to debut with a studio release. It brought teenage same-sex relationships to the big screen and also introduced Keiynan Lonsdale to the world. Lonsdale has been open about how at the time of filming, he was still grappling with his own sexulaity and the film helped him come out as queer. Lonsdale is a triple threat. He can obviously act, he’s a trained dancer and an up-and-coming music artist. Constantly breaking boundaries, Lonsdale is sure to be an artist that’ll blow up.
Anohni, formerly known as Antony Hegarty and the lead singer of Antony and the Johnsons, is a transgender woman with a voice resembling an angel. Her debut Hopelessness, is a poignant, politically-charged album that’s both haunting and beautiful. The album borders on avant-garde but isn’t too out there. With essences of R&B, electronic music and more, everyone is able to find something they’d enjoy.
Uzoechi Osisioma “Uzo” Emenike, better known as MNEK, has been writing and producing for the biggest names in the business (Beyonce, Madonna, Diplo) but hasn’t gotten the recognition that’s way past due for his own music. Most notably he featured on Zara Larsson’s “Never Forget You,” but his debut album Language is a gem of its own. Billboard donned the album as one of the most ambitious pop albums of the year. The gay-identifying singer has pipes and it’s time for the world to recognize his talents.
Raykeea Raeen-Roes Wilson, professionally known as Angel Haze, is a raw, in-your-face rapper. The pansexual rapper is a tour-de-force that exudes both vulnerability and aggressiveness in her music. With canny lyrical talent, and songs with artists like Sia and Bastille, it’s no surprise that Angel Haze has been making a name for herself in the music industry.
MUNA — collectively made up of Katie Gavin, Josette Maskin and Naomi McPherson — is a queer-pop band from Los Angeles. The female-pronoun-identifying members caught the eye of Harry Styles and have gone on tour with him. The trio has been compared to the likes of HAIM and even Fleetwood Mac, but they themselves have called themselves a “punk Wilson Phillips.” The band certainly exudes a sense of Stevie Nicks mixed with ’80s electronic flair.
Ezra Furman’s Spotify biography pinpoints his music perfectly. The bisexual Furman “provides a soundtrack for the current fear and loathing in America,” the biography reads. Having been part of multiple bands, Furman is a seasoned musician and lyricist and it’s apparent. Touching on topics of love, sexuality, and other tough issues, Furman exudes passion and even pain in his singing. His music blends genres and doesn’t contain itself to one box. It’s inventive, just as Furman is himself.
Tash Sultana is a true virtuoso. The non-binary singer and multi-instrumentalist has been described as a one-person band. On the genre-less musician’s debut, Flow State, Sultana is the only credited musician, as well as the only producer and songwriter. Sultana blends rock, pop and even a bit of reggae to get a sound that’s 100 percent original. Singing about a variety of topics, such as mental health, the songs are able to resonate with listeners. The Australian-born singer’s story is as inspirational as it can get. Once a busker and now selling out shows across the globe, it looks like it can only go up for the Aussie.
Landing Page
This story is part of a series of specially designed stories that represents some of the best journalism The Post has to offer. Check out the rest of the special projects here.


public class HMM
extends java.lang.Object
| Constructor and Description |
|---|
HMM()
Default constructor.
|
HMM(int N,
int M)
Construct an HMM with default convergence precision being
1e-6 and maximal number of iterations being 1000.
|
HMM(int N,
int M,
double epsilon,
int maxIter)
Construct an HMM.
|
| Modifier and Type | Method and Description |
|---|---|
double |
evaluate(int[] O)
Compute P(O|Theta), the probability of the observation
sequence given the model, by forward recursion with
scaling.
|
double |
evaluate2(int[] O)
Compute P(O|Theta), the probability of the observation
sequence given the model, by forward recursion without
scaling.
|
void |
feedData(int[][] Os)
Feed observation sequences for training.
|
void |
feedLabels(int[][] Qs)
Feed state sequences for training data.
|
double[] |
genDiscreteDistribution(int n)
Generate a discrete distribution with sample size of n.
|
static int[][][] |
generateDataSequences(int D,
int T_min,
int T_max,
double[] pi,
double[][] A,
double[][] B)
Generate observation sequences with hidden state sequences
given model parameters and number of data sequences.
|
double[][] |
getA() |
double[][] |
getB() |
double[] |
getPi() |
void |
loadModel(java.lang.String filePath)
Load an HMM model from a file.
|
static void |
main(java.lang.String[] args) |
int[] |
predict(int[] O)
Predict the best single state path for a given observation sequence
using Viterbi algorithm with logarithms.
|
int[] |
predict2(int[] O)
Predict the best single state path for a given observation sequence
using Viterbi algorithm.
|
void |
saveModel(java.lang.String filePath)
Save this HMM model to a file.
|
void |
setA(double[][] A) |
void |
setB(double[][] B) |
void |
setOs(int[][] Os) |
void |
setPi(double[] pi) |
void |
setQs(int[][] Qs) |
void |
showObservationSequence(int[] O)
Show an observation sequence.
|
void |
showStateSequence(int[] Q)
Show a state sequence.
|
void |
train()
Inference the basic HMM with scaling.
|
public HMM()
public HMM(int N, int M, double epsilon, int maxIter)
N
- number of states in the modelM
- number of distinct observation symbols per stateepsilon
- convergence precisionmaxIter
- maximal number of iterationspublic HMM(int N, int M)
N
- number of states in the modelM
- number of distinct observation symbols per statepublic static void main(java.lang.String[] args)
args
- public void feedData(int[][] Os)
Os
- observation sequencespublic void feedLabels(int[][] Qs)
Qs
- state sequencespublic double evaluate2(int[] O)
O
- an observation sequencepublic double evaluate(int[] O)
O
- an observation sequencepublic int[] predict2(int[] O)
O
- an observation sequencepublic int[] predict(int[] O)
O
- an observation sequencepublic void train()
public double[] genDiscreteDistribution(int n)
n
- sample sizepublic void saveModel(java.lang.String filePath)
filePath
- file path to save the modelpublic void loadModel(java.lang.String filePath)
filePath
- file Path to load an HMM model frompublic void setQs(int[][] Qs)
public void setOs(int[][] Os)
public void setPi(double[] pi)
public void setA(double[][] A)
public void setB(double[][] B)
public double[] getPi()
public double[][] getA()
public double[][] getB()
public void showStateSequence(int[] Q)
Q
- a state sequence represented by a 1D
int
arraypublic void showObservationSequence(int[] O)
O
- an observation sequence represented by a 1D
int
arraypublic static int[][][] generateDataSequences(int D, int T_min, int T_max, double[] pi, double[][] A, double[][] B)
D
- number of data sequences to be generatedT_min
- minimal sequence lengthT_max
- maximal sequence lengthpi
- initial state distributionA
- state transition probability matrixB
- observation probability matrix


http://action.vday.org/site/R?i=WusflRC61nfRf45J6PAvLw
http://action.vday.org/site/R?i=k86OJauQV9148F6jHRXdFg
http://action.vday.org/site/R?i=L5b4ncKlqGblL6DU2sP07w
http://action.vday.org/site/R?i=Bfh0xLdeykfnOWCPcSMp7Q
TAKE ACTION: - “We Are Not Going Anywhere” by
Barbara Mhangami-Ruwende
Two weeks ago, 234 teenage girls were kidnapped in the Nigerian city
of Bornu while taking their exams. It is assumed that the girls were
taken by Boko Haram, a local Islamic extremist group whose name means
“western education is forbidden.”
It is feared that the girls have been sold into marriage to the
militants and some have been moved to nearby countries of Cameroon and
Chad. The global movement of activists behind and
countless One Billion Rising organizers and participants have been
working tirelessly to bring the plight of the girls to the world’s
attention.
One Billion Rising for Justice Global Coordinator (Southern Africa)
Barbara Mhangami-Ruwende shares what some activists are doing around
the world, and calls on all of us to:
“Make a RESOUNDING RISING NOISE this Sunday, 11 May, and let the world
leaders know that we are not going anywhere, that we will not stop
until they!”
CONTINUE Reading >
http://action.vday.org/site/R?i=6b0LF_b85r8X6q5PvrnuaQ
We Rise With Our Mothers!
This Sunday, women and men, boys and girls in the U.S. and other
countries around the world will celebrate Mother’s Day. Please
consider giving a V-Gift to support the global movement to end
violence against women and girls on behalf of your mother, friends,
and loved ones.
We have two specially designed 2014 Mother’s Day V-Cards available to
choose from. With your donation V-Day will send the electronic card of
your choice letting your loved one know of their unique gift in their
honor.
CLICK HERE to give this V-Gift >
http://action.vday.org/site/R?i=CvnMIPUKlj4A8-YJxW7zBg
http://action.vday.org/site/R?i=PrksA1zuPhtQDSuLT3mLLw
http://action.vday.org/site/R?i=J5MkRXi0Jw5LmoAA1Rkfhg
To send a V-Card on the donate page
http://action.vday.org/site/R?i=4PffUSARVpu6xy8N5Q4ziA
, check the box next to “Donate on behalf of a loved one?” labeled
“Yes, I would like to send a V-Day e-card,” choose the design you
would like to send, and fill in the rest of the information to finish
designing your gift.
CLICK HERE to give this V-Gift >
http://action.vday.org/site/R?i=ZTEKMlZAzi5rh-v3lrnIwQ
Special Mother’s Day Discount: RISE4JUSTICE: Christine Schuler
Deschryver In Conversation w/ Eve in NYC
On Tuesday, 13 May, join V-Day Congo Director/Director of City of Joy
Christine Schuler Deschryver and Eve Ensler for a special RISE4JUSTICE
event and reception at ABC Carpet & Home in NYC.
http://action.vday.org/site/R?i=rlRkc5vMJF6DeZVLdHY8rA
The conversation will be a unique opportunity to hear directly from
Christine about the situation facing women and girls in Congo, and the
work being done on the ground to end the violence.
In celebration of Mother’s Day, we are pleased to offer you, our
activists, a special Mother’s Day discount code good for 50% off the
ticket price.
Simply go to vday.org/csd
http://action.vday.org/site/R?i=Uyt-GeOi0KmIcXCQx325oA
and enter the code NYCOBR4J when you check out.
http://action.vday.org/site/R?i=AWRmbwBJdZlK3Rnlt6RjSg
http://action.vday.org/site/R?i=jN6T9GsfnI9FQNPLBSTpyQ
http://action.vday.org/site/R?i=79xHdN8FVcHJhkc


Renewable Heat Incentive
Create
Create
Recipient Name
Name Errors
Details
Date of Application
Install Location
Type of Technology
Capacity
Amount Paid Out
Save


Table of Contents - RDoc Documentation
Pages
Classes and Modules
- Account
- Atm
- Bill
- Branch
- CapitalOne
- Config
- Customer
- Deposit
- Merchant
- Net
- Purchase
- Transfer
- Withdrawal
Methods
- ::accountBaseUrl — Bill
- ::apiKey — Transfer
- ::apiKey — Account
- ::apiKey — Purchase
- ::apiKey — Customer
- ::apiKey — Deposit
- ::apiKey — Branch
- ::apiKey — Atm
- ::apiKey — Bill
- ::apiKey — Withdrawal
- ::apiKey — Merchant
- ::baseUrl — Config
- ::createAccount — Account
- ::createBill — Bill
- ::createCustomer — Customer
- ::createDeposit — Deposit
- ::createMerchant — Merchant
- ::createPurchase — Purchase
- ::createTransfer — Transfer
- ::createWithdrawal — Withdrawal
- ::customerBaseUrl — Bill
- ::deleteAccount — Account
- ::deleteBill — Bill
- ::deleteDeposit — Deposit
- ::deletePurchase — Purchase
- ::deleteTransfer — Transfer
- ::deleteWithdrawal — Withdrawal
- ::getAll — Atm
- ::getAll — Merchant
- ::getAll — Customer
- ::getAll — Branch
- ::getAll — Account
- ::getAll — Transfer
- ::getAllByAccountId — Withdrawal
- ::getAllByAccountId — Deposit
- ::getAllByAccountId — Purchase
- ::getAllByAccountId — Bill
- ::getAllByCustomerId — Account
- ::getAllByCustomerId — Bill
- ::getAllByLocation — Atm
- ::getAllByLocation — Merchant
- ::getAllByType — Transfer
- ::getAllByType — Account
- ::getOne — Deposit
- ::getOne — Branch
- ::getOne — Customer
- ::getOne — Withdrawal
- ::getOne — Atm
- ::getOne — Transfer
- ::getOne — Merchant
- ::getOne — Bill
- ::getOne — Account
- ::getOne — Purchase
- ::getOneByAccountId — Customer
- ::updateAccount — Account
- ::updateBill — Bill
- ::updateCustomer — Customer
- ::updateDeposit — Deposit
- ::updateMerchant — Merchant
- ::updatePurchase — Purchase
- ::updateTransfer — Transfer
- ::updateWithdrawal — Withdrawal
- ::url — Transfer
- ::url — Deposit
- ::url — Customer
- ::url — Atm
- ::url — Purchase
- ::url — Account
- ::url — Withdrawal
- ::url — Bill
- ::url — Branch
- ::url — Merchant
- ::urlWithAcctEntity — Customer
- ::urlWithEntity — Customer
- ::urlWithEntity — Withdrawal
- ::urlWithEntity — Branch
- ::urlWithEntity — Bill
- ::urlWithEntity — Transfer
- ::urlWithEntity — Atm
- ::urlWithEntity — Deposit
- ::urlWithEntity — Purchase
- ::urlWithEntity — Merchant
- ::urlWithEntity — Account


|
rigid_list
A version of std::list that preallocates its memory and sticks with it.
|
A version of std::list that only allocates memory when you tell it to.
EXAMPLE:
This is the same as std::list except that it only uses preallocated memory and fails to grow when it runs out of it. Use rigid_list::reserve() to preallocate memory for a given number of list elements. Then you can rigid_list::push_back() up to the reserved number of elements and they will be stored in the list without the list allocating any new memory. If you push_back() more elements than you've reserved() space for, they will not be added and push_back() will return false.
You can increase the capacity of the list by calling reserve( m ) where m > n and continue push_back()-ing more elements into it.
BEWARE! Not all methods of std::list and their various versions are implemented. If a method or a version of it is not documented here, it isn't implemented, so don't use it! It may still be inherited from std::list but it will probably not play nice with this container. With that said, these inherited methods ARE safe to use:
PERFORMANCE NOTE: In gcc use at least -O2 to make rigid_list outperform std::list. With -O1, rigid_list is terribly slow. (tested with gcc 4.8.4).


Go to the Harvesters tab under the Admin page. This lists all of the Harvesters that are created and allows you to create new Harvesters. Enter a Name for a new Harvester, select a type (e.g., "Local Files" for a File Harvester) and press Create and you will be taken to the Edit form for the new Harvester. From the main Harvesters tab you can always bring up this edit form for existing Harvesters.
The File Harvester lets you specify a directory root on the server file system and a regular expression pattern that is used to match file names. Any files that are found are then added to the repository. The repository is checked so as to not add duplicate files.
The "Active on startup" flag, when set, results in the harvester being started when the repository starts up. The "Run continually" flag has the harvester continually run. It uses the "Every" setting to determine the pauses between runs. You can choose Absolute time to pause every N minutes. Or, you can choose "Minutes" or "Hourly" to have it run relative to the hour or the day, e.g. "3 hourly" will run at 0Z, 3Z, 6Z, 9Z, etc.
For example, if you know you are getting data files in real-time that are coming in every 30 minutes you could set your harvester to run in "Absolute" mode every 15 minutes. If you had a Web harvester that is fetching images you might want to use an "Hourly" setting to get the image at some fixed interval (e.g., 0Z, 6Z, 12Z, 18Z, etc).
The regular expressions used are somewhat extended in that you can specify subsets of the regular expression and use the result text for metadata and other information when creating the entry in the repository. For example, a very common case is to have a date/time embedded in the filename. So, you could have in your regular expression something of the form:
.*data(fromdate:\d\d\d\d\d\d\d\d_\d\d\d\d)\.ncThis would match any files of the form:
data_yyyymmdd_hhmm.ncThe "(" and ")" define the sub-expression (just like normal regular expression). But the "fromdate:" is the special extension that tells the harvester that that sub-expression is used to create the repository entry fromdate field.
The date format that is used is defined in the Date Format field and follows the Java date format conventions.
If you are creating entries of a certain type that has a number of attributes you can extract the attribute values using this extended regular expression technique. For example, if you had an entry with two attributes attr1 and attr2 and your files were of the format:
<attr1>_<attr2>.csvYour regular expression would be:
(attr1:[^/]+.)_(attr2:[^/]*).csvThis says that attr1 is any number of characters except the slash ("/"). The slash exclusion is used to exclude the file path as the full file path is used when matching patterns. The value for attr2 follows the "_" and is any number of characters except a slash.
To define the folder you need to select an existing base folder and then optionally specify a folder template. The folder template is used to automatically create a new folder if needed. So for example, if your base folder was: Top/Data and your Folder Template was: Ingested/Satellite then the result folder would be:
Top/Data/Ingested/SatelliteThe Harvester would create the Ingested and the Satellite folders as needed.
The name, description and folder templates all can contain the following macros. Note: The different date fields (e.g., create_, from_ and to) refer to the create date/time, the from data time (which defaults to the create date unless specified in the pattern) and the to data time.
| ${filename} | The file name (not the full path) |
| ${fileextension} | The file extension |
| ${dirgroup} | See below |
| ${create_date},${from_date}, ${to_date} | The full formatted date string |
| ${create_day}, ${from_day}, ${to_day} | The numeric day of the month |
| ${create_week}, ${from_week}, ${to_week} | The numeric week of the month |
| ${create_weekofyear}, ${from_weekofyear}, ${to_weekofyear} | The numeric week of the year |
| ${create_month},${from_month}, ${to_month} | Numeric month of the year |
| ${create_monthname},${from_monthname}, ${to_monthname} | Month name |
| ${create_year}, ${from_year}, ${to_year} | Numeric year |
The dirgroup macro is the parent directories of the data file up to but not including the main directory path we are searching under. For example, if you are looking under a directory called "/data/idd" and that directory held sub-dirs:
/data/idd/dir1/data1.nc /data/idd/dir1/dir2/data2.ncThen when ingesting the data1.nc file its dirgroup value would be:
dir1When ingesting the data2.nc file its dirgroup value would be:
dir1/dir2Another common way of defining the folder is to use the date macros. For example a folder template of the form:
${from_year}/${from_monthname}/Week ${from_week}Would result in folders like:
2009/January/Week 1 2009/January/Week 2 ... 2009/March/Week 1 2009/March/Week 2You can also name the entrys using the macros. So, using the above date based folder template you could then have a Name template that incorporates the formatted date:
Gridded data - ${from_date}
The Move file to storage checkbox allows you to determine whether the file is to be moved from its initial location
to the RAMADDA storage area.
Note: If the file is not moved to the storage area than one of the data directories the file lies under needs to be added
to the list of file system directories in the Admin->Access area


mxGraph Java Server Examples
The following Java Server examples are available for mxGraph:
Export
Backend
Roundtrip
Deploy
Link
EmbedImage
ServerView


---
layout: js-documentation
title: Ink.UI.DragDrop_1
description: A component for dragging things around, dropping them in dropzones, and sorting them.
site_root: ../
---
All samples are using A replacement for Draggables, Droppables, and SortableList. It aims to be good at creating draggables, droppables and sortable lists at the same time while keeping it simple for everyone. A DragDrop component may contain one or more "dropZone"s, which are the areas where the "dragItem"s can be dropped. You can identify elements as being a dropZone or a dragItem by using the correct selectors (".drag-item" and ".drop-zone"). element
options
options.dragItem
options.dragHandle
options.dropZone
options.ignoreDrag
options.draggedCloneClass
options.placeholderClass
options.onDrag
options.onDrag
Destroy your DragDrop, removing it from the DOM Returns what element the user is dragging, or Get the dropZone containing the given element. dragItem
Returns whether a given .drag-item element is a plain old .drag-item element Used because the selector ".drag-item" finds these elements we don't consider drag-itemsInk.requireModules
, please read how to use it at Ink.requireModules section
Ink.UI.DragDrop class
Method name
Description
new DragDrop([element], [options])
Constructor
.destroy()
Destroy your DragDrop, removing it from the DOM
.getDraggedElement()
Returns what element the user is dragging, or
null
if no drag is occurring.
.getDropZone(dragItem)
Get the dropZone containing the given element.
.isDragItem(elm)
Returns whether a given .drag-item element is a plain old .drag-item element
new Ink.UI.DragDrop([element], [options])
Accepts
{% include js_samples/Ink_UI_DragDrop_1.html %}
.destroy()
method
.getDraggedElement()
method
null
if no drag is occurring..getDropZone(dragItem)
method
Accepts
.isDragItem(elm)
method
and not one of the clones we're creating or the element we're really dragging.
elm
{Element} The element to test.


No need to call String.valueOf to append to a string; just use the valueOf() argument directly.
This rule is deprecated, use {rule:squid:S1153} instead.


Assessment Prep
- Open notes assessment:
- React Router documentation
- React documentation
- Mozilla Developer Network
- Any of your previous projects or assessments
- Any notes
- 2 hours 30 min project assessment
- No MC’s
- No short answers
How to Prepare
Be able to do the projects mostly without instructions
- Some projects to look at:
- Know how to use Functional components
- Review Day 1 + 2 Material
- Know how to use Class components
- Review Day 3 Material
this.state
this.setState
- Forms
- lifecycle methods
componentDidMount
componentDidUpdate
componentWillUnmount
- Know how to use
react-router-dom
- Review Day 4 Material
Switch
component
Route
component, props: path
, exact
, render
, component
- use
exact
unless specified otherwise
NavLink
component, props: to
, activeClassName
- Know how to use Context with dynamic values
- Review Day 5 Material
React.createContext
- providers
- consumers
- how to access the
value
of the context in a component
<ContextName.Consumer>
- For both Functional AND Class components
static contextType = ContextName;
- how to update the value of a context
Practice
Practice Assessment
Practice Assessment Zip
Practice Assessment Solution Zip


Ivy's lexical structure has the following categories of token:
- Keywords listed on their own page.
- Comments which begin with
#
and extend to the end of the line. - Punctuation elements drawn from the following list:
~
,,
,+
,*
,/
,-
,<
,<=
,>
,>=
,*>
,(
,)
,|
,&
,=
,~=
,;
,:=
,.
,{
,}
,->
,<->
,:
,..
,...
,$
,^
- Symbols which begin with a lower-case letter, underscore or digit and continue with any mix of letters, digits and underscores. These typically name types, modules, objects, parameters, local variables, and similar declarations. These also include numeral-literals and boolean-literals in expressions. For example:
a
,_v_
,10
,foo123
,lowerUPPER
,false
,this
- Variables which begin with upper-case letter and continue with any mix of letters, digits and underscores. These denote "logical variables" bound by a universal quantifier or existential quantifier in an expression. For example:
A
,VAR_12
,Thing
- Labels which are any letters, digits or underscores contained in square brackets. These typically denote logical formulas and are declared in-line with many logical judgments. For example:
[premise]
,[f0]
,[NO_WAY]
- Native Quotations which are any text between a matching pair of triple angle brackets (
<<<
and>>>
)
Ivy is whitespace-insensitive, beyond the need to separate tokens.


Fly with Taylor Today! Anywhere within the Tri State Area for an affordable price
Flight Check-In: Digital ID Verification and Proof of Vaccination.
We will be asking for the Digital Credentials for the following:
| Taylor Charter Flights Booking Reference | Your booking reference obtained when you purchase your ticket |
| TSA REAL ID |
|
| Vaccination Proof |
For the safety of our crew and fellow guests, we require a proof of vaccination against COVID-19. We only require the date of the vaccination not the full certificate. See the list of approved Issuers |
|
Browser-Linked Wallet
If your Digital Wallet Service provider is linked to your browser, |
Proceed in Browser |
|
Mobile Wallet
If your Digital Wallet Service provider |


{% extends "__user_base.html" %} {% load staticfiles %} {% block active %} Dashboard My Students Export data Delete expired


THE BRIDGES OF MADISON COUNTY A film review by Steve Rhodes Copyright 1995 Steve Rhodes
RATING (0 TO ****): ** 1/2
THE BRIDGES OF MADISON COUNTY asks the question is there love life after 40/60? It answers in the affirmative. For the 40+ set we have an Iowa farm woman named Francesca Johnson (Meryl Streep) who has been married to a local Iowa farm man so long that she can not count the years and yet retains her heavy, (theoretically) Italian accent. Representing the 60+ crowd we have a National Geographic photographer by the name of Robert Kincaid (Clint Eastwood).
The screenplay by Richard LaGravenese is based on the novel by Robert James Waller that the entire Western world except me has read, reread and cried themselves to sleep with. The script starts with a grown sister and brother in their 40s opening their mother Francesca's will. It seems she wants to be cremated and have her ashes dumped by one of the local covered bridges. Her children are shocked until they discover her diaries. The movie is then told as a long series of flashbacks based on the diaries.
Francesca falls into a deep, romantic love with Robert while her family is off to the county fair for four days. The movie is the story of this affair.  Saying they fall head over heels in love, does not do it justice. Hmm, so you had a four day business trip planned? Rethinking your plans now are you?
Most of the plot is predicable after the initial setup and that is okay. The point is not to guess the next plot twist, but to identify with the characters and vicariously live their romance and have that illicit fling you subconsciously always wanted. I thought the plot outline was wonderful, but I found the writing pretty leaden most of the time with sporadic poetic or more lively parts. I think I would have hated the novel, but maybe not.
The cinematography by Jack N. Green, whose best previous work was in the UNFORGIVEN where he got an Oscar nomination, was lovely. The outdoor scenes were easy to make picture card perfect and serene. The tricky part, and where the artistry came in, was the indoor scenes at night. Wonderful, radiant glows filled the house. Watching it was like drinking a warm cup of Earl Grey tea. It filled your body with contentment.
The directing (Clint Eastwood) and the editing is of the slow and dreamy school of movie making. Lots of silence or throw away dialog so that the characters can just sit around and stare romantically into each other's eyes. The pacing found me checking my watch frequently. I would not recommend the late showing, you may fall asleep in the slow parts.
There are several precious scenes in the show. There is a romantic walk after dark that has a great mood to it. The chirping crickets really add to the ambiance. As a contrast, the scene in the local coffee shop is quite an eye opener and nicely done.
The acting by Eastwood is the best in the movie. He is major handsome with his thick salt and pepper hair and his rugged good looks. He plays a more quiet and sensitive character than I have ever seen him play before. He was natural and believable.
Streep, on the other hand, was constantly and visibly acting. Her accent was unnecessary and a major detraction. Her morose characterization of Francesca was overdone. It was a parody of Sophie's Choice, but with a different European accent, except they both sounded the same. Whereas Eastwood's performance was convincing, I did not buy Streep's. All this notwithstanding, you can count on her getting an Academy Award nomination for it. The Academy members will be in awe of it. For a much better performance by Streep having an affair, see FALING IN LOVE. In it, she has genuine chemistry with Robert De Niro and does not use her one-size-fits-all European accent.
The minor characters were good. The sister was perky and interesting in a small part. She had a trust in her mother's judgment that was sweet. The actor who played Streep's farmer husband was appropriately simple and boring. Afterall, the way Francesca described her husband was that he was good to the kids and was "clean".
THE BRIDGES OF MADISON COUNTY runs an extremely long 2:15. Better editing would have vastly increased my enjoyment as would having Streep lose that fake accent. The movie is rated PG-13 for subtle lovemaking. It is fine for teenagers and probably kids 10 and up. For many special scenes, I give the picture a mild thumbs up regardless of its irritations, and I award it ** 1/2.
**** = One of the top few films of this or any year. A must see film. *** = Excellent show. Look for it. ** = Average movie. Kind of enjoyable. * = Poor show.  Totally unbearable.
REVIEWED WRITTEN ON: June 2, 1995
Opinions expressed are mine and not meant to reflect my employer's.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


OpenShift Deployment
Setup
Make sure your Openshift Cluster is registered with Redhat Marketplace. Follow cluster registration link for reference:
Install KubePlus Pre-requisite resources. You can use either oc cli or kubectl cli. The commands are exactly the same.
kubectl create -f https://raw.githubusercontent.com/cloud-ark/kubeplus/master/deploy/kubeplus-openshift-prereqs.yaml
or
oc create -f https://raw.githubusercontent.com/cloud-ark/kubeplus/master/deploy/kubeplus-openshift-prereqs.yaml
Go to Redhat Marketplace, search for “KubePlus” operator. Customer can do free trial signup or Purchase.
Install operator from Redhat Marketplace Operators section
Open three terminal windows. Name them as:
Provider window 1
Provider window 2
Consumer window
Provider window 1
Do following steps in provider window 1:
Create hello-world-resource-composition as follows:
kubectl create -f hello-world-resource-composition.yaml -n openshift-operators
or
oc create -f hello-world-resource-composition.yaml -n openshift-operators
Here is the hello-world-resource-composition.yaml file. You will have to save it on your machine and then use it with above commands.
apiVersion: workflows.kubeplus/v1alpha1
kind: ResourceComposition
metadata:
name: hello-world-resource-composition
spec:
# newResource defines the new CRD to be installed define a workflow.
newResource:
resource:
kind: HelloWorldService
group: platformapi.kubeplus
version: v1alpha1
plural: helloworldservices
# URL of the Helm chart that contains Kubernetes resources that represent a workflow.
chartURL: https://github.com/cloud-ark/operatorcharts/blob/master/hello-world-chart-0.0.2.tgz?raw=true
chartName: hello-world-chart
# respolicy defines the resource policy to be applied to instances of the specified custom resource.
respolicy:
apiVersion: workflows.kubeplus/v1alpha1
kind: ResourcePolicy
metadata:
name: hello-world-service-policy
spec:
resource:
kind: HelloWorldService
group: platformapi.kubeplus
version: v1alpha1
policy:
# Add following requests and limits for the first container of all the Pods that are related via
# owner reference relationship to instances of resources specified above.
podconfig:
limits:
cpu: 200m
memory: 2Gi
requests:
cpu: 100m
memory: 1Gi
# resmonitor identifies the resource instances that should be monitored for CPU/Memory/Storage.
# All the Pods that are related to the resource instance through either ownerReference relationship, or all the relationships
# (ownerReference, label, annotation, spec properties) are considered in calculating the statistics.
# The generated output is in Prometheus format.
resmonitor:
apiVersion: workflows.kubeplus/v1alpha1
kind: ResourceMonitor
metadata:
name: hello-world-service-monitor
spec:
resource:
kind: HelloWorldService
group: platformapi.kubeplus
version: v1alpha1
# This attribute indicates that Pods that are reachable through all the relationships should be used
# as part of calculating the monitoring statistics.
monitorRelationships: all
Wait till HelloWorldService CRD is registered in the cluster. You can check this by running following command. Proceed only after this command shows following output:
kubectl get crds | grep -i hello
helloworldservices.platformapi.kubeplus 2021-05-14T08:11:28Z
or
oc get crds | grep -i hello
helloworldservices.platformapi.kubeplus 2021-05-14T08:11:28Z
Consumer window
Do following steps in consumer window:
Install KubePlus kubectl plugins
$ wget https://github.com/cloud-ark/kubeplus/raw/master/kubeplus-kubectl-plugins.tar.gz
$ gunzip kubeplus-kubectl-plugins.tar.gz
$ tar -xvf kubeplus-kubectl-plugins.tar
$ export KUBEPLUS_HOME=`pwd`
$ export PATH=$KUBEPLUS_HOME/plugins/:$PATH
$ kubectl kubeplus commands
or
$ oc kubeplus commands
Create HelloWorldService instance
kubectl create -f hello-world-service.yaml
or
oc create -f hello-world-service.yaml
Verify resource requests and limits have been set on the Pod that belongs to HelloWorldService instance.
$ HELLOWORLD_POD=`kubectl get pods -A | grep hello-world-deployment-helloworldservice | awk '{print $2}'`
$ HELLOWORLD_NS=`kubectl get pods -A | grep hello-world-deployment-helloworldservice | awk '{print $1}'`
kubectl get pods $HELLOWORLD_POD -n $HELLOWORLD_NS -o json | jq -r '.spec.containers[0].resources'
or
$ HELLOWORLD_POD=`oc get pods -A | grep hello-world-deployment-helloworldservice | awk '{print $2}'`
$ HELLOWORLD_NS=`oc get pods -A | grep hello-world-deployment-helloworldservice | awk '{print $1}'`
oc get pods $HELLOWORLD_POD -n $HELLOWORLD_NS -o json | jq -r '.spec.containers[0].resources'
You should see following output:
Check resource relationship graph for HelloWorldService instance:
kubectl connections HelloWorldService hs1 default
or
oc connections HelloWorldService hs1 default
You should see following output:
Visualize the relationship graph:
kubectl connections HelloWorldService hs1 default -o png
or
oc connections HelloWorldService hs1 default -o png
Provider window 1
Back on the provider window 1, perform following steps:
KUBEPLUS_POD=`kubectl get pods -A | grep kubeplus-deployment | awk '{print $2}'`
KUBEPLUS_NS=`kubectl get pods -A | grep kubeplus-deployment | awk '{print $1}'`
kubectl port-forward $KUBEPLUS_POD -n $KUBEPLUS_NS 8081:8090
or
KUBEPLUS_POD=`oc get pods -A | grep kubeplus-deployment | awk '{print $2}'`
KUBEPLUS_NS=`oc get pods -A | grep kubeplus-deployment | awk '{print $1}'`
oc port-forward $KUBEPLUS_POD -n $KUBEPLUS_NS 8081:8090
Provider window 2
In provider window 2, get CPU/Memory/Storage/Network metrics for HelloWorldService instance:
HELLOWORLD_NS=`kubectl get pods -A | grep hello-world-deployment-helloworldservice | awk '{print $1}'`
or
HELLOWORLD_NS=`oc get pods -A | grep hello-world-deployment-helloworldservice | awk '{print $1}'`
curl -kv "http://<IP_ADDRESS>:8081/apis/kubeplus/metrics?kind=HelloWorldService&instance=hs1&namespace=$HELLOWORLD_NS"
You should see output of the following form:


In a previous post I've described how to generate objects in blender through python. In this document I will describe how to use such python scripts from the command line to render animations.
TD;DR
This small guide will allow you to make the following gif using the command line and python.
Blender Python Script
This script below generates a rain of randomly sized and colored cubes. You can paste this code into the blender command line to see the result.
# filename: colored_rain.py
import bpy
import math
import random
import uuid
def select_type(meshtype="Cube"):
for ob in bpy.context.scene.objects:
ob.select = ob.type == 'MESH' and ob.name.startswith(meshtype)
def deltype(meshtype="Cube"):
select_type(meshtype)
bpy.ops.object.delete()
def makeMaterial(name, diffuse, specular, alpha):
mat = bpy.data.materials.new(name)
mat.diffuse_color = diffuse
mat.specular_color = specular
mat.alpha = alpha
return mat
def randomMaterial():
randvec = (random.random(), random.random(), random.random())
return makeMaterial('mat' + uuid.uuid4().hex[0:6], randvec, (1,1,1), 1)
def setMaterial(ob, mat):
me = ob.data
me.materials.append(mat)
deltype()
def block(x,y,z,rot):
bpy.ops.mesh.primitive_cube_add( radius=random.random(), location = (x,y,z/2.0) )
bpy.ops.rigidbody.object_add()
bpy.context.active_object.rigid_body.type = 'ACTIVE'
rand_axis = (random.random(),random.random(),random.random())
bpy.ops.transform.rotate(value=rot, axis=rand_axis)
setMaterial(bpy.context.object, randomMaterial())
def blocks(x,y,z):
for i in range(4):
x = x + random.random()*2
y = y + random.random()*2
rot = random.random()*2*math.pi
block(x,y,z,rot)
for z in range(2,100):
blocks(0,0,z)
Then if you run this next code, blender will start rendering images for the animation.
# these are the render settings
bpy.data.scenes['Scene'].render.engine = 'CYCLES'
bpy.data.scenes['Scene'].cycles.samples = 10
bpy.data.scenes['Scene'].frame_end = 100
bpy.data.scenes['Scene'].render.fps = 100
bpy.context.scene.render.resolution_x = 600
bpy.context.scene.render.resolution_y = 400
# this command signals the actual render
bpy.ops.render.render(animation=True, use_viewport=True)
The python script renders a scene, fills it with boxes, sets up a camera and applies render settings. This code can be run from blender but it could also be called from the command line. The two main benefits of doing this:
- we are not slowed down by the also rendering a GUI
- we can use a server to do the calculation for us, leaving our working computer free to do other things.
Blender from the command line
Getting the CL to work.
We will first need to make sure that we can run blender from the command line. If you are running this on a mac you will need to make sure your .bash_profile
knows where to find the blender command. On open source operating systems you will need to do something similar unless you installed it via apt-get install blender
.
alias blender=/Applications/blender.app/Contents/MacOS/blender
For more info see this link.
Running the CL
The blender command line offers many opportunities to automate things. Consider the following command:
$ blender -y -b -x 1 -o /some/output/dir/ --engine CYCLES --python /path/to/script/python_script.py
The python script contains rendering details, so blender will just run these and output them in the specified folder. This command will not prompt the user to confirm anything (via -y
) and it will run in the background (so no gui, via -b
). Note that for extra performance you can specify a higher number of threads (-t
) if your machine supports it.
You can get more option info via blender --help
.
Viewing the output
In the output dir we will now see that files have been created. These are images. With a simple command line they can be joined together in a gif.
convert -delay 10 -loop 0 *.png animation.gif
For this command line app you may need to need to apt-get/brew install imagemagick
.
Conclusion
Blender can make an exellent tool to learn python, making these scripts is fun stuff.
For people who want to do more with blender I would like to point out that any button in blender can be set via python as well. If you keep your mouse over a button, the python code that's needed appears. That also means that you can code the render settings, which is useful if you don't want to spend too many resources.


Dialog is heavily inspired by Prolog. Unless you've programmed in Prolog before, you may find the material in the first three or so chapters to be increasingly counter-intuitive, odd, or even downright crazy. But don't worry, we'll take it in small steps, and hopefully the concepts will click together in the end. If at any point you feel that the discussion is too abstract, don't hesitate to head over to Part II for a while, and then come back.
If you already know Prolog, you're still going to have to pay attention to the details, as there are both obvious and subtle differences between the two languages.
This is what “hello world” looks like in Dialog:
| (program entry point) | |
| Hello, world! |
A Dialog program is a list of rule definitions. A rule definition always begins at the very first column of a line, but it may span several lines. Subsequent lines of code that belong to the same rule have to be indented by at least one space or tab character.
There can be multiple rules with the same name. If so, they are said to belong to the same predicate. The program above contains one predicate, built from a single rule definition. The head of the rule is (program entry point), and this is also the name of the predicate. The body of the rule is some text to be printed verbatim, in this case “Hello, world!” Program execution always begins with the predicate called (program entry point). Sometimes we will refer to this as the top-level predicate.
A predicate may call upon another predicate, similar to subroutine calls in other programming languages. This is referred to as making a query. The following program produces exactly the same output as the previous one:
| (program entry point) | |
| Hello (my own rule)! | |
| (my own rule) | |
| , world |
The parentheses indicate that a query is to be made. When a query is made to a predicate, all rules defined for that predicate are consulted in program order, until one of them succeeds; we will return to the concept of success at the end of the present chapter. If the program comprises several source code files, the order of the rules is determined by the order in which the filenames appeared on the command line.
Predicate names are case-sensitive.
Rule bodies contain statements to be executed. Plain text in a rule body is an instruction to print that text. Some special characters (#, $, @, ~, *, |, \, parentheses, brackets, and braces) need to be prefixed by a backslash (\). No special treatment is required for apostrophes or double quotes.
Comments in the source code are prefixed with %% and last to the end of the line.
Thus:
| (program entry point) | |
| Hello y'all \( and "welcome" \) ! %% This is a comment. |
produces the output:
Dialog is smart about punctuation and whitespace: It interprets the source code text as a stream of words and punctuation characters, and rebuilds the output from that stream, inserting whitespace as appropriate. It knows that no space should precede a comma, that a space should go before an opening parenthesis but not after it, and so on.
| (program entry point) | |
| For instance | |
| :This | |
| text | |
| \( which,to all intents and purposes,is silly\( indeed | |
| \) \) | |
| , prints properly. |
The output of that is:
It is possible to override the automatic whitespace decisions on a case-by-case basis using the built-in predicates (space) and (no space):
| (program entry point) | |
| To (no space) gether (space) , apart. |
The output of that is:
Line breaks are inserted with the (line) built-in predicate; paragraph breaks with (par). On the Z-machine, a paragraph break is implemented as a blank line of output.
Several adjacent line breaks are merged into one, preventing accidental paragraph breaks. Likewise, several adjacent paragraph breaks are merged into one, along with any adjacent line breaks, preventing accidental runs of more than one blank line.
The following program:
| (note) | |
| (line) This goes on a line of its own. (line) | |
| (program entry point) | |
| (note) | |
| (note) | |
| (par) This goes in a paragraph of its own. (par) | |
| This | |
| is | |
| not broken up. | |
| (note) |
produces the following output:
Predicates can have parameters. The name of a predicate, called its signature, is written with dollar signs as placeholders for the parameters. These may appear anywhere in the predicate name. For instance, (descr $) is the signature of a predicate with one parameter, and in this case the parameter is at the end.
In rule heads and queries, values may appear in place of these dollar signs. A common kind of value is the object. Objects in Dialog are short, programmer-friendly names that start with a # character and refer to entities in the game world.
Consider the following three rule definitions for the (descr $) predicate:
| (descr #apple) | The apple looks yummy. |
| (descr #door) | The oaken door is oaken. |
| (descr $) | It looks pretty harmless. |
When a value appears inside a rule head, the given parameter must have that particular value in order for the rule to succeed. It is also possible to use dollar signs as wildcards in rule heads.
Let's take a look at how the three rule definitions above might be used in a program. To print the description of an object, let's say the #door, one would make the query (descr #door). Dialog would consider each of the three rule definitions in program order. The first rule head doesn't match the query, but the second does. Thus, the text “The oaken door is oaken.” is printed. The query (descr #orange) would cause the text “It looks pretty harmless.” to be printed.
Note that the general rule, the one with the wildcard, appears last. This is crucial: If the general rule were to appear before e.g. the #door rule in the source code, it would supersede that rule every time, and the door would be described as harmless.
Signatures (predicate names) do not appear explicitly anywhere in the source code. They are implied by rule heads and queries, where parameter values are typically used instead of dollar signs.
Dialog objects are thin, in the sense that each hashtag is a mere identifier, without any inherent behaviour or properties. This is in contrast with object-oriented programming languages, where code and data are organized inside objects and classes. In Dialog, the world is modelled using predicates that specify relations between objects, but the objects themselves are just names.
Object names may contain alphanumeric characters (including a limited range of international glyphs), dashes (-), and underscores (_). They are case sensitive.
If a query is made to a predicate, but there is no matching rule in the program, the query fails. When a rule makes a query, and that query fails, the rule also fails and is immediately abandoned. In this way, the failure condition might propagate to the calling rule, to its calling rule in turn, and so on, all the way to the top-level predicate. Here is a simple program that fails:
| (program entry point) | |
| You see an orange. (descr #orange) Now what do you do? | |
| (descr #apple) | The apple looks yummy. |
| (descr #door) | The oaken door is oaken. |
This program will print “You see an orange”. Then, because there is neither a rule for (descr #orange) nor a rule for (descr $), the query (descr #orange) fails. This causes the top rule, i.e. the program entry point, to fail, at which point the entire program terminates. Hence, “Now what do you do?” is never printed.
If failure would always propagate all the way to the top and terminate the program, it would be of little use. So of course, there's more to the story: Recall that a query to a predicate causes each of its rule definitions to be tried, in source code order, until a match is found. What happens when a rule fails, is that this search continues where it left off. Consider the following example:
| (program entry point) | |
| (descr #apple) | |
| Over and out. | |
| (descr #apple) | |
| (the player dislikes #apple) | |
| Yuck! | |
| (descr $) | |
| It looks yummy! | |
| (the player dislikes #orange) |
A query is made: (descr #apple). There's a matching rule, and this rule makes a query in turn, to the predicate (the player dislikes $), with the parameter #apple. But this time, there is no matching rule definition, so the query fails. This aborts the execution of the (descr #apple) rule, and the quest to satisfy the original query, (descr #apple), resumes. And indeed there's another match: (descr $) prints “It looks yummy!” and succeeds. Thus, the program entry point rule will proceed to print “Over and out”.
The complete output is:


About the Covenants
Covenants are legal documents that lay out the guidelines for the planned community.
The Covenants are recorded in the county records in the county where the property is located and are legally binding. This means that when you purchase a lot or a home in Prairie Fields you automatically become a member of the HOA. The Covenants, which were established by the builder, are the rules of the Prairie Fields neighborhood. They govern what you can, cannot, or must do with respect to your home.
Which covenants apply to my phase?
Each covenant applies to a single Phase. See the Prairie Field Phase page to find out what Phase your house belongs to. To access the Covenant files, click here.
How are covenants enforced?
At the 9/20/10 Board of Directors meeting, the Board officially approved a Covenant Enforcement Policy. The purpose of the policy is to clarify the way in which the Board plans to enforce covenants, and to clarify the procedures for enforcement of the covenants. At this time, only complaints which are brought to the Board and which comply with the policy will be acted on.
Form to request covenant enforcement Covenants will be enforced by the Board if there is a specific complaint submitted to the board according to the Covenant Enforcement Policy. If you would like to make a complaint or covenant enforcement request to the HOA Board, please fill out the Covenant Enforcement Form. Note that the information submitted will not be published on this website, but it will be used by the Board of Directors as they investigate the complaint.


You must declare the "fileSystemProvider" permission in the extension manifest to use the File System Provider API. For example:
{ "name": "My extension", ... "permissions": [ "fileSystemProvider" ], ... }
File System Provider API allows extensions to support virtual file systems, which are available in the file manager on Chrome OS. Use cases include decompressing archives and accessing files in a cloud service other than Drive.
Provided file systems can either provide file system contents from an external source (such as a remote server), or using a local file (such as an archive) as its input.
In the second case, the providing extension should have a file_handlers manifest entry in order to be launched when the file is selected in the file manager. When the extension is executed with a file to be handled, it has to mount a file system and start serving contents from the provided file.
Provided file systems once mounted are remembered by Chrome and remounted automatically after reboot or restart. Hence, once a file system is mounted by a providing extension, it will stay until either the extension is unloaded, or the extension calls the unmount method.
In case of acting as a file handler, the handled file may need to be stored to access it after either a reboot, or suspending and resuming an event page of the providing extension. In such case chrome.fileSystem.retainEntry and chrome.fileSystem.restoreEntry should be used.


Announcements
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae deserunt labore velit maxime accusantium cum autem. Magni cupiditate nihil temporibus enim maiores explicabo fugiat numquam blanditiis, nostrum, non consequuntur laudantium.
Our Adult ESL Program
Placement Tests
Next placements tests will be in August and September 2015.
All students who are new to the English for Speakers of Other Languages (ESOL) program are required to take a placement test.
Cada estudiante nuevo en el programa de clases de inglés (ESL) ha de examinarse. Queremos asegurar el nivel correcto para usted -- ni demasiado fácil ni demasiado difícil. Tenemos seis niveles de inglés y una clase de ciudadismo.
Tutor Training
Training Effective Literacy Tutors (TELT) Tutor Training Workshops are offered over two consecutive Saturdays by the Portland Literacy Council. BLC volunteers are eligible for a reduced registration fee of $20.00.
Preregistration is required. Contact Portland Literacy Council at<PHONE_NUMBER> (x3700) or<EMAIL_ADDRESS>Volunteer
Volunteer, make a difference! The community's need exceeds our current capability. We have opportunities to work directly with students as a tutor as well as behind the scnes on the administrative side of the organization.
Donate!


The video contains the presentations, instructions to the participants, and the time the participants spent playing which you can skip.
You will be surprised to learn that Improv Teams and Software Teams have many similarities; The same techniques Improv Teams use to turn a group of random individuals into Great Team Players can be used by Software Teams to improve Collaboration, Creativity, Communication & Trust.
This unique workshop will have attendees out of their seats and on their feet actively practicing the concepts Improv Teams use to develop Great Team Players. Practicing the four essential qualities of a Great Team Player:


001/******************************************************************************* 002 * This software is provided as a supplement to the authors' textbooks on digital 003 * image processing published by Springer-Verlag in various languages and editions. 004 * Permission to use and distribute this software is granted under the BSD 2-Clause 005 * "Simplified" License (see http://opensource.org/licenses/BSD-2-Clause). 006 * Copyright (c) 2006-2023 Wilhelm Burger, Mark J. Burge. All rights reserved. 007 * Visit https://imagingbook.com for additional details. 008 ******************************************************************************/ 009package imagingbook.common.geometry.shape; 010 011import imagingbook.common.geometry.basic.Pnt2d; 012import imagingbook.common.geometry.basic.Primitive2d; 013 014import java.awt.Shape; 015 016/** 017 * Used to check if AWT shapes produced by {@link ShapeProducer#getShape()} match the underlying curve 018 * ({@link Primitive2d}). This is mainly used to test if generated shapes (to be drawn to the screen) are sufficiently 019 * accurate. 020 * 021 * @see ShapeProducer 022 * @see Primitive2d 023 */ 024public class ShapeChecker { 025 026 private final double tolerance; 027 028 /** 029 * Constructor. 030 * 031 * @param tolerance maximum deviation between curve and shape 032 */ 033 public ShapeChecker(double tolerance) { 034 this.tolerance = tolerance; 035 } 036 037 /** 038 * Constructor. 039 */ 040 public ShapeChecker() { 041 this(0.5); 042 } 043 044 /** 045 * Checks if all points of the specified AWT {@link Shape} are sufficiently close to the {@link Primitive2d} 046 * instance specified in the constructor. This is typically used to test if a shape produced by 047 * {@link ShapeProducer#getShape()} coincides with this curve. Only the discrete sample points produced by 048 * {@link ShapePointIterator} are checked, not the points on connecting polygon segments. Typical usage example: 049 * <pre> 050 * GeometricCircle circle = ... ; // implements ShapeProducer and Curve2d 051 * Shape shape = circle.getShape(); 052 * boolean ok = new ShapeChecker().checkShape(circle, shape);</pre> 053 * 054 * @param curve a {@link Primitive2d} instance 055 * @param shape the AWT shape to check 056 * @return true if all points of the shape are closer to the curve than tolerance 057 */ 058 public boolean check(Primitive2d curve, Shape shape) { 059 ShapePointIterator iter = new ShapePointIterator(shape, 0.5 * tolerance); 060 boolean result = true; 061 while(iter.hasNext()) { 062 Pnt2d p = iter.next(); 063 if (curve.getDistance(p) > tolerance) { 064 result = false; 065 break; 066 } 067 } 068 return result; 069 } 070 071}


The edit action will be a big action, but it is possible to reuse a lot of the code that has already been written in this table definition file. It will be indicated when code is copied from elsewhere.
Start with the basic action information.
Steps to complete:
Make the changes to your document as indicated on the right
Check your work, then reload the panel containing the Task Scheduler or open it again from your menu item


I've been a lifelong sufferer of depression and various other mental health problems (depression being the most severe and debilitating with dyslexia a distant but hardly overshadowed second), for a long time I decided to go with the toughing it out route but I realized that by acting like that all I really did was withdraw from life.
I started taking Wellbutrin, which had a mild effect on me, I was considering quitting it and trying something stronger until I saw I lost weight on it, I ended up augmenting it with lexapro which helped a lot. However some of my other problems still went unchecked and I began to feel the effects of the drugs I was on dwindle in only about a 2 month time frame. I would pop extra Lexapros because they made me drowsy and thus able to escape from life, not because they helped me mentally that much.
I got my psychiatrist to eventually to prescribe me Adderall to help with the appetite suppression effects that were beginning to wear off from the other pills. I got a pretty big supply, 90 20mg pills of the XR variety.
Because I had experience on my own with phentermine in the past, I skipped right ahead to taking 2 pills. I didnít feel anything for a few hours and after about the passing of 5 hours. I had taken 3 more, It hit me like a wave suddenly. A powerful rush of energy and euphoria which actually seemed to increase as the night went on. I was amazingly sociable, and my thoughts raced at incredible speeds yet maintained coherency (for awhile). I was amazingly introspective and truthful and for about a hour I had life pretty much figured all out. As time went on though, I saw myself become way too impassioned and jacked up, I had amazing delusions of grandeur and a desire to literally take on the world with my bare hands and a feeling that with enough Adderall, I would win, without a doubt.
I compared to some of the stuff I was talking about in my new found confidence and passionate way of expression to Hitler without the racism (which was pretty wise, I found out later that Hitler was a huge meth head). I lost the ability to rationally figure out what I really wanted to say, While I didnít say anything completely out of the blue, my statements were so grandiose and beyond reason that even during the trip I realized I was pretty fucked up. As I typed a lot of those statements, I even added in 'Iím on amphetamines donít take anything I say seriously' liberally in every conversation I had, even though I felt like that, not only everything that came out of my mind was correct, I was shocked people didnít feel exactly the way I did.
Eventually everyone went to bed.  I lifted weights, doing reps on 25 pounders. The number of em all together had to clock in at over 1,000 by the time the night was through. I still took me a few hours shy of a day to truly come down.
Despite my amazing confidence, new found zest for life and seemingly superhuman strength and stamina on a high enough dose of Adderall, I immediately cut back to 2 a day, I tried 3 a day for a brief time but it really didnít help to much. With 2 Iím calm and energetic, with 3 Iím a little more wired, while still calm, my thoughts arenít racing nor am I 'high', I experience the other more negative side effects like the horrible body odor you get from using amphetamines more intensely however, so 2 is what Iím sticking with.
Now I dont want to get all preachy here, but: The trip taught me a lot about my depression and addiction, having to compare how the depression made me feel day in day out to the exact opposite feeling given by Adderall. It made me stop looking at myself as a victim, domed to failure and just a general belief that life is horrible. Though I still have those feelings from time to time and always will, I can see them in the context of having a condition instead of a real existential crisis. Adderall made me understand depression's nature as a chemical imbalance/disorder alot clearer.
On 5 pills of Adderall I was telling friends and family that 'My depression is finally gone forever'. It wasnít, but when I said it then, I was sure it was true. However I realized going over the recommended dose again would only make matters worse in the long run. Even if that effect remained for a long time to come, eventually it would disappear as my tolerance grew and the consequences of that started to create issues. What I wan people to realize, is what I realized, there is no pill, herb, magical formula, or set of circumstances that's going to make anyone's life perfect, the meaning of life sometimes seems to be learning and growing from the struggle of just hanging in there.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |
| Packages that use HttpConnectionManager | |
| org.apache.commons.httpclient | Classes and interfaces supporting the client side of the HTTP protocol. |
| org.apache.commons.httpclient.util | Provides some utility classes for use by HttpClient. |
| Uses of HttpConnectionManager in org.apache.commons.httpclient |
| Classes in org.apache.commons.httpclient that implement HttpConnectionManager | |
class |
MultiThreadedHttpConnectionManager
Manages a set of HttpConnections for various HostConfigurations. |
class |
SimpleHttpConnectionManager
A connection manager that provides access to a single HttpConnection. |
| Methods in org.apache.commons.httpclient that return HttpConnectionManager | |
HttpConnectionManager |
HttpConnection.getHttpConnectionManager()
Returns the httpConnectionManager. |
HttpConnectionManager |
HttpClient.getHttpConnectionManager()
Returns the HTTP connection manager associated
with the HttpClient. |
| Methods in org.apache.commons.httpclient with parameters of type HttpConnectionManager | |
void |
HttpConnection.setHttpConnectionManager(HttpConnectionManager httpConnectionManager)
Sets the httpConnectionManager. |
void |
HttpClient.setHttpConnectionManager(HttpConnectionManager httpConnectionManager)
Assigns the HTTP connection manager to use with
the HttpClient. |
| Constructors in org.apache.commons.httpclient with parameters of type HttpConnectionManager | |
HttpClient(HttpClientParams params,
HttpConnectionManager httpConnectionManager)
Creates an instance of HttpClient with a user specified parameter set and
HTTP connection manager . |
|
HttpClient(HttpConnectionManager httpConnectionManager)
Creates an instance of HttpClient with a user specified HTTP connection manager . |
| Uses of HttpConnectionManager in org.apache.commons.httpclient.util |
| Methods in org.apache.commons.httpclient.util with parameters of type HttpConnectionManager | |
void |
IdleConnectionTimeoutThread.addConnectionManager(HttpConnectionManager connectionManager)
Adds a connection manager to be handled by this class. |
void |
IdleConnectionTimeoutThread.removeConnectionManager(HttpConnectionManager connectionManager)
Removes the connection manager from this class. |
|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |


I have been working on building an enterprise application to replace Access databases, Excel and much paper. The organisation is well entrenched in their processes, using this system for several years. They had outgrown their current systems, limiting their ability to innovate and join the digital revolution. I joined after a previous team had tried and failed to replace the system, costing the company money in the process. These are just five lessons that helped us succeed.
Coaching Agile
It is easy to forget after years of being agile in software development that most organisations and most departments outside of I.T. are not familiar with agile practices. It takes time to learn. There are new ideas and ceremonies to understand. Given this is a large project with multiple subdomains and product owners, within addition several stakeholders there were quite a few people to bring along to the journey.
During the development, when adding further subdomains into the project we were essentially starting over the agile journey with new stakeholders and product owners. The whole project we've been starting from zero, it's been important to challenge our assumptions constantly and educate our colleagues in our way of working. Coming in after a failed project, coaching agile to stakeholders has increased their confidence in us and further ensures the success of the project.
Get the Architecture Right
In a complex enterprise system of this size and project length the ability to change and to reason overtime is required to deliver and adapt. From the start, we've implemented Domain-Driven Design to inform our model and tame complexity in the monolith. We've also used CQRS to separate our writes and reads, simplifying our software.
The right architecture flows throughout the whole project. It allows you to understand how the domain works, to add new features quickly and test your code effectively. Preventing the system from going to spaghetti expands the useful lifespan of the application. It allows you to iterate towards an application fit for purpose.
Just Enough Testing
In the long run, adequate testing saves time, preventing defects and reducing risk making changes. There are many different types of testing and testing strategies. We decided to maximise the bang for our buck using two kinds of testing.
Integration Testing - Performing subcutaneous tests by calling the API, executing a command, saving to the database and verifying the results through calling the API, running a query and reading the database provides a good level of confidence the system works. Using the system to test the system limits the number of tests you need to write to ensure correctness.
There are tradeoffs to integration testing. They are typically slower than unit tests. However, with the right architecture and picking the most valuable slice of application to test you prevent significant problems in your application.
Convention Testing - Enforcing agreed upon standards across the project and preventing developers from making mistakes. Convention tests address specific types of issues traditional testing does not pick up. They provide enormous value for little effort in writing testing your whole code base for problems.
These were not the only types of testing we performed. The critical idea was focusing on tests that maximised value for minimal effort.
Be Pragmatic
In all projects, including large projects such as this one, you need to make pragmatic decisions. There are competing stories, bugs and technical debt to pay down to prioritise. You need to take a practical approach and be pragmatic to the priorities.
Although the vast majority of choices we made with third-party libraries were correct, we made mistakes. The forms library worked well 90% of the time. It did not have great integration with our language choice and in specific scenarios performance was terrible. Midway through the project the maintainers deprecated the library and started a new library. It is significant work to replace the library, but that would be a distraction, the library still works, we can work around the 10% of issues. We are making pragmatic decision to take on technical debt and focus on what is more important.
Deliver
Building trust with organisation and stakeholders was necessary, we were coming in after a failed project. We were agile. They were a traditional organisation. It was reasonable for them to be sceptical of us. To achieve the goals of the project and overcome trust chasm we delivered.
We built a minimum-viable product, we had users, using the software in production as soon as we could.
We frequently deployed, without breaking changes, often. Soon after demonstrating features, our users could use them, in production, for real.
When we received feedback, we took it on board, investigated the underlying problem and came up with a solution. If it did not work, we iterated until we found a suitable solution.
Over time we gained the trust of the organisation by delivering. It is satisfying to have someone in the organisation to sell the project to their colleagues, to explain the benefits without being prompted. Delivery is achieving success.


MARGARET'S MUSEUM A film review by Steve Rhodes Copyright 1997 Steve Rhodes
RATING (0 TO ****): ** 1/2
In the show's recurring theme the siren in the little mining town of Cape Breton, Nova Scotia, goes off, and the day-to-day activities of its inhabitants stop. As their hearts sink into their stomachs, the townsfolk rush to the mine to see whose men were killed this time in the pit.
Set in the late 1940s, MARGARET'S MUSEUM stars Helena Bonham Carter as Margaret MacNeil, a free-spirited woman who is derided as a "snot-nosed whore" by the local kids. We see the perpetually runny nose part, but the other part is only hinted at. Margaret's fiery-red, wind-blown hair resembles a tumbleweed more than a coiffure.
MARGARET'S MUSEUM is a slice of life story featuring Carter in one of her rare roles in a non-costume drama. Margaret can barely keep her clothes on properly in the movie.
Carter, who has given a host of stunning performances in her career with the most recent being THE SIGN OF THE DOVE, never adequately connects with her character. She gives Margaret obvious idiosyncrasies but little depth.
Just as Jennifer Jason Leigh recently tried her hand with limited success in a costume drama, WASHINGTON SQUARE, so Helena Bonham Carter attempts the role of Margaret with equally limited success. Leigh and Carter should have traded places with each doing the other film. Neither gives a bad performance, but both try hard to do something the other does so naturally and beautifully.
Margaret lives with her bitter mother, Catherine, played by Kate Nelligan in one of her lesser performances.
One day Margaret meets a handsome miner named Neil Currie -- actually an ex-miner since he was fired for speaking Gaelic in the pits. ("I got fired on purpose," Neil confesses to her. "I'll never go underground again." "What'll you do?" asks a confused Margaret. "There isn't anything else.") Neil is played with charisma by a dashing Clive Russell.
Eventually Neil secures one of the few non-mining jobs in town, working as a dishwasher in a Chinese restaurant, but he loses it when a cousin of the owner shows up from Shanghai
The movie consists of little vignettes punctuated by hauntingly beautiful Irish music plus the sound of Neil's bagpipes, which Margaret ridicules as sounding like a screeching cat. Overall, the movie is in dire need of a more compelling and substantive story.
Many of the smaller stories are only hinted at, including a mine owner who refers to the strikers as Communists and a love affair between a couple of teenagers, Jimmy (Craig Olejnik) and Marilyn (Andrea Morris), from both sides of the tracks -- miners and management. Neither teenager is believable.
Most of the people have spent their wholes live in the area. A wise old miner named Angus (Kenneth Welsh) gives advice to Jimmy. "Do you know there are some places in the world where they pay you to think?" he tells a disbelieving Jimmy. Jimmy cannot conceive of such a concept, but Angus can since he brags of having been as far as Toronto.
The story has a quirky ending which is really no more than a plot device to give the film its name.
This eccentric movie would have worked much better as a short. With the padding removed, its paucity of ideas would not have seemed so limiting.
MARGARET'S MUSEUM runs 1:54. It is rated R for profanity, brief nudity and sex. It is a mild R and would be fine teenagers.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews