Listening and Concert Reports
This page features all of my written work required for the piano lessons I have taken at Virginia Tech. The Recording Reports section contains analysis and reactions of recorded pieces on audio CD, and the Concert Reports section contains notes taken during live performances, hosted by the Music Department at Virginia Tech.
Listening Reports
These reports are my reactions to digital recordings of classical music. They are listed by composers' time period.
Bach, Johann Sebastian (–)
Invention No. 8 in F Major
- index
- BWV 779
- recorded
- Christopher Taylor,
- report submitted
- Chris Harvey,
Bach Inventions are short counterpoint pieces with two voices, and No. 8 is an excellent example. The subject, answer, and counter-subject interact in such a way that they fit together to sound like melody and harmony. Taylor makes the entrances of each subject plainly obvious to the listener so he/she can identify it at once. He swiftly moves through this upbeat invention, only pausing slightly at cadence points.
Prelude & Fugue No. 21 in B-Flat Major (from WTC Book I)
- index
- BWV 866
- recorded
- Angela Hewitt,
- report submitted
- Chris Harvey,
Hewitt does a great job emphasizing the outer voices in the homophonic sixteenth-note passages in the Prelude. Her dynamic contrast adds excitement to the piece, even when marked piano. She also has excellent contrast in articulation in the Fugue. Like Taylor, she makes the entrances of subject and answer obvious. Her performance is always moving in some direction, never stationary, even during strettos and episodes.
Prelude & Fugue No. 7 in E-Flat Major (from WTC Book II)
- index
- BWV 876
- recorded
- Angela Hewitt,
- report submitted
- Chris Harvey,
Although the Prelude is a quick-moving piece, Hewitt remains calm and composed, and keeps a consistent tempo. She adds variety to articulation patterns throughout the Prelude. She announces the return of the piece's theme in a blissful manner and with a change in articulation. Again, Hewitt makes this difficult four-voice Fugue seem easy to play. The Subject appears in all four voices multiple times, and can be easily identified. Her tempo is slightly faster than marked, but she pulls it off very well.
Haydn, Joseph (–)
Sonata No. 38 in F Major
- index
- H. XVI/23
- composed
- recorded
- Marc-André Hamelin,
- report submitted
- Chris Harvey,
Haydn wrote his music in a way that is open to interpretation. In this sonata, he leaves out almost all dynamics and articulation. Haydn has a talent for surprising the listener with subito dynamics and other musical formatting. Hamelin plays with a great contrast in articulation, ranging from spiky staccati to fluid legati. At times, he may hold some notes longer than expected. He seldom uses the pedal, which is accurate for the Classical time period. While there is no correct answer, Hamelin's dynamic markings differ from mine. He plays the third movement impressively fast.
Sonata No. 43 in E-flat Major
- index
- H. XVI/28
- composed
- recorded
- Lola Odiaga,
- report submitted
- Chris Harvey,
Odiaga performs this sonata on the fortepiano, an instrument suitable for the context in which the piece was written. For some reason, the fortepiano is tuned one semitone flat, so the piece sounds as if in D Major.
Her choice of articulation contradicts my own, but is acceptable for a Haydn sonata. Ornaments, trills, and turns are taken faster than normal, and in addition, placed before the beat rather than on the beat. Her choice of dynamics is conventional and expected by the listener.
The second movement is played in a hasty manner. Odiaga sees not to pay much attention to phrasing or articulation, and every turn is played too fast and before the beat, as grace notes. The melody in the Trio section is legato and slurred throughout. She ends every movement with a molto ritardando, which would be appropriate for maybe a Baroque-era piece, but I personally choose not to alter the tempo when closing the movements.
The third movement, marked Finale: Presto, is played carefully and almost tentatively. The performer did an excellent job with articulation and liveliness in this movement, although lacking in dynamic variation. The entire third movement builds speed progressively throughout the movement, which may or may not be intentional.
Beethoven, Ludwig van (–)
Sonata in d minor, “Tempest”
- index
- Op. 31 No. 2
- recorded
- Vladimir Ashkenazy,
- report submitted
- Chris Harvey,
Written near the end of Beethoven's first of three periods, this sonata leans more toward the Classical era. The forms of each movement in this sonata follow those of traditional classical sonata structure. Ashkenazy shows excellent dynamic contrast and does a good job bringing out the melody where needed. However, he uses much more pedal than necessary.
Chopin, Frédéric François (–)
Scherzo No. 1 in B minor
- index
- Op. 20
- composed
- recorded
- Emanuel Ax,
- report submitted
- Chris Harvey,
The Scherzo in B minor is divided into three main sections set in ABA form, with the A sections as scherzos and the middle section as a Trio. The Scherzo sections are furious ad rapid, and the performer brings out the violence in Chopin's music. His emotion is apparent through his playing. He demonstrates great contrast in dynamics and articulation, making the music dance as lively as possible. However, due to the extreme number of repetitions written in the piece, the performer does not provide noticeable variation across repeated sections.
Ax brings out the emotional changes via dynamics and tempo changes. He prolongs the Trio for as long as possible, creating a sense of anxiety in the listener, who longs for the expressive and delicate tonic chord that releases the built-up tension.
The Trio section is the polar opposite of the scherzo sections. Ax brings out as much, if not more, emotion to this section, but an emotion of tenderness and love rather than ferocity and angst. The sections also differ via thematic material: while the Scherzo is more motivic, the Trio contains a sweet lyrical melody in the middle voice that depicts mother and child.
The performer builds tension towards the end of the Trio, bringing out dissonances and non-chord tones. He prepares us for the return of the Scherzo with a molto ritardando and the reappearance of the introduction.
The return of the scherzo section is no different than the exposition, except that it is shorthand and with a Coda added. Ax again anticipates the Coda, building up speed. The Coda is like a warped waltz with dissonant tones and a humorous feel. The performer executes the trills, arpeggios, and scales with extreme precision.
Debussy, Claude (–)
Estampes, 3. Jardins Sous La Pluie
- index
- L 100
- composed
- recorded
- Alexis Weissenberg,
- report submitted
- Chris Harvey,
This movement is an overflow of notes and chords. Rather than focusing on individual aspects of the music, the performer aims for the overall atmosphere. Polyrhythms and other fast runs don't have to be played exactly correctly, and the bigger picture is what's important. The piece has many different sections that seem to be put together in an arbitrary manner, much like an unpredictable rainstorm. The transitions between the segments do flow smoothly, however. There is no defined form, but the melodic theme recurs throughout the movement. Most of the texture of the piece consists of simple homophonic melody and accompaniment, although the melody often switches between hands. The movement moves in and out of different modes, usually among major, minor, and augmented. There doesn't seem to be a predictable change in tonal center, but the harmonic structure is always present, even with a lot of chromaticism in a few places.
The performer exhibits great control and clarity, even at a fast pace. His choice of dynamics contradicts the text at some points, but otherwise he does a good job showing contrast between loud and soft. Weissenberg ends the piece in a huge wash of sound, making it almost impossible to interpret the small details of the music.
Gershwin, George (–)
Three Preludes for Piano
- recorded
- Doug Montgomery,
- report submitted
- Chris Harvey,
Gershwin's music was more similar to jazz than it was to impressionist music written in the early 20th Century. Both technically and musically challenging, Three Preludes for Piano demonstrates various styles and capabilities of the instrument and musician. Montgomery seems to hold back emotion when performing, although correctly expresses rhythm and note patterns. He hardly uses any pedal, which could be useful in some sections.
Concert Reports
These reports are my reactions to live performances of classical music. They are listed chronologically.
Other Reports
- A short report on the Cadenza. (Written )


| Total net profit | -15.85 | Gross profit | 188.14 | Gross loss | -203.99 |
| Profit factor | 0.92 | Expected payoff | -0.15 | ||
| Absolute drawdown | -100.76 | Maximal drawdown (%) | 147.23 (316.83%) | ||
| Total trades | 106 | Profit trades (% of total) | 67 (63.21%) | Loss trades (% of total) | 39 (36.79%) |
| Long positions (won %) | 57 (59.65%) | Short positions (won %) | 49 (67.35%) | ||
| Largest | profit trade | 9.66 | loss trade | -20.25 | |
| Average | profit trade | 2.81 | loss trade | -5.23 | |
| Minimum | profit trade | 0.04 | loss trade | -0.03 | |
| Maximum | take profit in pips | 241.5 | stop loss in pips | 0.0 | |
| Average | take profit in pips | 129.1 | stop loss in pips | 0.0 | |
| Minimum | take profit in pips | -14.1 | stop loss in pips | 0.0 | |
| Maximum | Reward-Risk | 0.0 | Duration in minutes | 10893 | |
| Average | Reward-Risk | 0.0 | Duration in minutes | 1753.5 | |
| Minimum | Reward-Risk | 0.0 | Duration in minutes | 30 | |
| Maximum | consecutive wins (profit in money) | 12.0 (46.47) | consecutive losses (loss in money) | 11.0 (-103.51) | |
| Average | consecutive wins | 6.0 | consecutive losses | 3.0 |
| Total net profit | -56.27 | Gross profit | 79.9 | Gross loss | -136.17 |
| Profit factor | 0.59 | Expected payoff | -0.99 | ||
| Absolute drawdown | -71.09 | Maximal drawdown (%) | 84.03 (649.38%) | ||
| Total trades | 57 | Profit trades (% of total) | 34 (59.65%) | Loss trades (% of total) | 23 (40.35%) |
| Largest | profit trade | 7.31 | loss trade | -20.25 | |
| Average | profit trade | 2.35 | loss trade | -5.92 | |
| Minimum | profit trade | 0.14 | loss trade | -0.24 | |
| Maximum | take profit in pips | 184.0 | stop loss in pips | 0.0 | |
| Average | take profit in pips | 128.6 | stop loss in pips | 0.0 | |
| Minimum | take profit in pips | 100.9 | stop loss in pips | 0.0 | |
| Maximum | Reward-Risk | 0.0 | Duration in minutes | 10893.0 | |
| Average | Reward-Risk | 0.0 | Duration in minutes | 1737.6 | |
| Minimum | Reward-Risk | 0.0 | Duration in minutes | 30.0 | |
| Maximum | consecutive wins (profit in money) | 7.0 (10.2) | consecutive losses (loss in money) | 8.0 (-20.15) | |
| Average | consecutive wins | 5.0 | consecutive losses | 3.0 |
| Total net profit | 40.42 | Gross profit | 108.24 | Gross loss | -67.82 |
| Profit factor | 1.6 | Expected payoff | 0.82 | ||
| Absolute drawdown | -29.67 | Maximal drawdown (%) | 65.78 (182.17%) | ||
| Total trades | 49 | Profit trades (% of total) | 33 (67.35%) | Loss trades (% of total) | 16 (32.65%) |
| Largest | profit trade | 9.66 | loss trade | -11.03 | |
| Average | profit trade | 3.28 | loss trade | -4.24 | |
| Minimum | profit trade | 0.04 | loss trade | -0.03 | |
| Maximum | take profit in pips | 241.5 | stop loss in pips | 0.0 | |
| Average | take profit in pips | 129.7 | stop loss in pips | 0.0 | |
| Minimum | take profit in pips | -14.1 | stop loss in pips | 0.0 | |
| Maximum | Reward-Risk | 0.0 | Duration in minutes | 6029.0 | |
| Average | Reward-Risk | 0.0 | Duration in minutes | 1772.1 | |
| Minimum | Reward-Risk | Duration in minutes | 48.0 | ||
| Maximum | consecutive wins (profit in money) | 12.0 (36.11) | consecutive losses (loss in money) | 11.0 (-65.78) | |
| Average | consecutive wins | 9.0 | consecutive losses | 5.0 |


|
Rather than enumerate the format of every possible line you might write in C++, we'll point out specific aspects of the CHAI 3D coding conventions that might not be considered 'standard' C++ style. And of course, the best reference is the code itself; if you start from an existing CHAI 3D file as a stencil, you'll find it hard _not_ to stick to the conventions.
Whitespace and Indents:
File, Class, Variable, and Function Names:
- All symbols should start new words with a captial letter, e.g. selectedObject
- Class names always begin with a lowercase 'c' followed by a capital letter, e.g. cCamera
- The files that define the class cObject are typically called CObject.h and CObject.cpp (with capital C's)
- Function parameter names begin with a_, followed by a lowercase letter, e.g. a_selectedObject
- Member variable names begin with m_, followed by a lowercase letter, e.g. m_myPrivateVariable
- Local variables and function names begin with a lowercase letter, e.g. selectedObject or getGlobalPos(...)
- Functions that represent callbacks should begin with 'on', e.g. onDisplayReset()
- Global variable names begin with g_, followed by a lowercase letter, e.g. g_myGlobalVariable
Comments:
- Every file that is to be incorporated into CHAI 3D should have the big CHAI 3D header on it, and www.chai3d.org should always be listed as an author... it's at the top of every file, but for completeness I'm pasting it at the end of this file.
- All inline comments (comments you sprinkle in your code, as opposed to function or file header comments) should use C++-type comments... i.e. '//' comments, not '/*' comments. So a multi-line comment should look like this:
// I'm using a lot of words right now
// to tell you that I'm incrementing
// a variable called 'i'...
i++;
- We use doxygen, so we need to mark header comments in the doxygen-ish style. Every function gets one "brief" description and one "long" description... we typically put a brief description before a function declaration (in a header file) and a long description before a function definition (in a .cpp file).
Brief descriptions look like this:
//! Set the local position of this object
inline void setPos(const cVector3d& a_pos) { m_localPos = a_pos; }
...and cannot exceed one line (otherwise doxygen treats them as long descriptions).
Long descriptions look like this:
//===========================================================================
/*!
Create a new vertex and add it to the vertex list.
\fn unsigned int cMesh::newVertex(const double a_x, const double
a_y, const double a_z)
\param a_x X coordinate of vertex.
\param a_y Y coordinate of vertex.
\param a_z Z coordinate of vertex.
\return Return index position of new vertex.
*/
//===========================================================================
unsigned int cMesh::newVertex(const double a_x, const double a_y, const double a_z)
{
...
Note the exclamation point, which tells doxygen that a description is coming. Also note the \fn tag to delimit the function name, the \param tag to delimit parameters, and the \return tag to delimit return values.
- Similarly, each class should have an associated doxygen description wherever it's declared, a la:
//===========================================================================
/*!
\class cCamera
\brief cCamera describes a virtual Camera located inside the world.
Its job in life is to set up the OpenGL projection matrix
for the current OpenGL rendering context...
*/
//===========================================================================
Header Files:
- Don't let inline or one-line functions take up tons of space... i.e., please do this:
//! Set the local position of this object
inline void setPos(const cVector3d& a_pos) { m_localPos = a_pos; }
Not this...
//---------------------------------------
//! Set the local position of this object
//---------------------------------------
inline void setPos(const cVector3d& a_pos)
{
m_localPos = a_pos;
}
Particularly when a lot of these functions come one after another (often set/get functions), doing the latter can make header files really difficult to read.
- Include a blank line between each function in a header file... this makes your headers much more readable. Alternatively, place a blank line after a few closely-related functions to delimit a new category of function.
Coding / Performance Tips:
- Remember to declare functions inline if they hardly do anything (e.g. setPos())
- Remember to declare functions const if they don't modify any member variables
- Remember to take parameters by reference if all you're going to do is copy them (i.e. if they're const), to avoid extra stack copies. This is particularly relevant for complex types being passed as parameters.
- Remember to declare parameters const if you don't need to modify them
- Always set pointers to NULL immediately after you delete them
- Remember to (almost) always declare your destructors virtual
- Any time you change an OpenGL state variable, be nice and put the state back to where it was when you're finished, unless you have a specific reason to do otherwise. Use glGet to get the state beforehand for any state variables you're going to futz with. Similarly, always leave the GL matrix mode set to modelview when you're finished with any matrix strack manipulations you might be doing.
- Avoid using namespace std;, particularly in header files. This makes supporting multiple compilers more difficult, as difficult compilers place different things in different namespaces.
- Avoid using friend and typeid wherever possible; they make extending CHAI more difficult in most cases.
As Promised, The Big CHAI 3D Header Comment to be Included at The Top of Every File:
//===========================================================================
/*
This file is part of the CHAI 3D visualization and haptics libraries.
Copyright (C) 2003-2010 by CHAI 3D. All rights reserved.
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License("GPL") version 2
as published by the Free Software Foundation.
For using the CHAI 3D libraries with software that can not be combined
with the GNU GPL, and for taking advantage of the additional benefits
of our support services, please contact CHAI 3D about acquiring a
Professional Edition License.
\author: <http://www.chai3d.org>
\author: John Lennon
\version 2.1.0
*/
//===========================================================================
|
|


Pintreddit, inspire yourself
Go back to Pintreddit
Nature
Cars
Art
Food
Animals
Apply filter
Oops, post not found!
Go back to pintreddit!


In the GUI below, click on the button "select ray" to select a ray. When this button has been selected, left click to select the endpoint of the ray, and right click to select another point which determines the direction of the ray. To select a circle, click the "select circle" button. Then, left click to choose the center of the circle, and right click to choose a point on the circle, which will be used to determine its radius. Once you have selected a ray and a circle, the program will run your code raySphere(p0, v, c, r)
and draw the intersection points you have calculated
NOTE: This tests your code in the special case of 2D; all z components of vectors you select are zero, and the z coordinates of the intersection points you return are ignored. As a result, the sphere is centered on the XY plane, and the ray will hit the great circle of the sphere in the XY plane if it does happen to intersect the sphere. However, it is expected that your code works in general 3D rays and spheres. Have a look at the unit tests to see if you can handle 3D cases as well.
|


The Anti-Grain Geometry (AGG) package contains a general purpose C++ graphical toolkit. It can be used in many areas of computer programming where high quality 2D graphics is an essential part of the project.
This package is known to build and work properly using an LFS-7.4 platform.
Download (HTTP): http://www.antigrain.com/agg-2.5.tar.gz
Download MD5 sum: 0229a488bc47be10a2fee6cf0b2febd6
Download size: 552 KB
Estimated disk space required: 122 MB
Estimated build time: 1.2 SBU
pkg-config-0.28, SDL-1.2.15, and Xorg Libraries
User Notes: http://wiki.linuxfromscratch.org/blfs/wiki/agg
Install agg by running the following commands:
sed -i 's: -L@x_libraries@::' src/platform/X11/Makefile.am && sed -i '/^AM_C_PROTOTYPES/d' configure.in && bash autogen.sh --prefix=/usr --disable-static && make
This package does not come with a test suite.
Now, as the root
user:
make install
sed -i 's: -L@x_libraries@::' src/platform/X11/Makefile.am: This fixes compiling with the current Xorg Libraries.
sed -i '/^AM_C_PROTOTYPES/d' configure.in: this fixes reconfiguring with the current version of automake.
bash autogen.sh: This script uses autotools to create the configure script, then it runs configure with the given arguments.
--disable-static
: This
switch prevents installation of static versions of the libraries.
Last updated on 2013-09-06 12:06:41 -0700


Quill was built by students, for students
CEO and Co-Founder
Alex is a self taught engineer on leave from Stanford University.
CTO and Co-Founder
Sam is a server engineer and a White House Maker Faire particpant from 2014.
Lead iOS Engineer
Aaron is an iOS and server engineer with over 50,000 personal app downloads.
iOS Engineer
Jacob is an enginer with over 30,000 app downloads.


Title
Triangle Mine Sweeper
00
:
00
Restart the game
Left Click to reveal a cell, Right Click to flag a cell


WITNESS LIST Public Education Committee May 20, 1999-12:00A SB 4 For: Carpenter, Bill (Fast Growth School Coalition) Dunn, David (TASB) Hollingsworth, Lonnie (TCTA) Levin, Jay (TSTA) SB 4mmittee Substitute (Sadler) Caperton, Kent (Small Rural School Finance Coalition) Grusendorf, Bill (Texas Association of Rural Schools) Hartman, Eric (TFT) McLamore, Mike (ATPE) Pierce, Wayne (Texas Association of Mid-Size Schools)


{% load static %} {% static "assets/images" as baseUrl %}
{{renter_housesearch.address}}
{{house.address}}


Add a Staff Account
Profile photo
Maximum image file size is 1MB. Try rezising it to atleast 500x500 px in resolution.
*Profile photo is required
Crop image
*This field is required
*Invalid Email.
Staff successfully added!
A confirmation link with the admin’s access has been sent to the email provided.
Email address already exist!
Please try a different email address.
Invalid type format of profile photo
loading...


Are you here because you're organizing a stand-up comedy show and you'd like me to be in it? That's great! I'd love to.
Need a bio? Feel free to use any or all of this:
Gus Tate was just a funny person from Lexington, Kentucky until 2013, when he sold out and started telling jokes at open mic nights in Beijing. He currently lives, works, and tells jokes in Hong Kong.
Gus was judged the winner of the 2014 Beijing Comedy Competition by three drunk expat writers. He continues to be unreasonably proud of this, despite subsequently becoming a finalist at the 2015 Hong Kong Comedy Competition, judged by a panel of nine totally sober expat writers.
Gus has opened for actual professional comedians like Ari Shaffir, Dwayne Perkins, and Nick Griffin. One time he picked up Tom Rhodes from the airport, but that probably doesn't count and there's no way he'd remember.
In Hong Kong he performs regularly at TakeOut Comedy and Comedy.HK. He has also performed in Beijing with Comedy Club China and The Humor Section, in Shanghai and Suzhou with Kung Fu Komedy, in Guangzhou with Dr. Panda Comedy, and in the Philippines with Comedy Cebu.
Here's where I'm performing next:
Need photos for promos? Help yourself:
To get in touch, send me an email at:
gus tate zero eight


Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content.
This is the transaction hash
Whenever you need to, be sure to use margin utilities to keep things nice and tidy.


Come and see my online resume and portfolio and web projects.
I am Eschnaseth N. Maceda and my nickname is Seth as my nickname.
I finished Bachelor in Business Teacher Education at the Polytechnic University of the Philippines. In the same university I obtained Masters in Educational Mangement Major in Instructional Leadership. Currently I am pursuing my Doctorate Degree in Educational Management Major in Policy Administration at the Universidad de Manila. I have been a collegiate Business and IT professor in various universities and earned various certificates. I am a tech-savy and IT enthusiast since young and dreamt of having my school for computer studies someday.
Concurrently I am also a freelance web designa and developer for a living and to pursue my dreams.I do front-end web development for bootstrap theme.
I do HTML5 coding for business enterprises.
All website pages I design is fully responsive in nature.
Website design that is mobile design and friendly.
24/7 open support to business development and change requests of clients for their business and company projects.
I ensure 24-hour Up Time of of services.
Request for upgrades is not a problem for proper software development production.
We always ensure that our clients satisfaction is always number one.
Educcentral Philippines is an online educational platform which provides useful information and various educational stuffs.
EHM Dental Clinic or Eleanor H. Mendoza Dental Clinic Dental Clinic Website.
Classicademy is an personal website owned by Kobidake Maria Maceda for young and adult who want's to start learning music.
The Pixchers is one of the best Photobooth Rental Services around Metro Manila.
FGCIHS MIO (Media Information Office) is a public school media information department which handles public information of the school.
Visit: www.mlquezonhs.depedmanila.com for more information of the website.
Visit: www.fgcalderonhs.depedmanila.com for more information of the website.


Preparation time
less than 30 mins
Cooking time
10 to 30 mins
Serves
Serves 4
For the lamb, preheat the oven to 220C/425F/Gas 7.
Season the lamb loin all ove with salt and freshly ground black peppe, to taste
Heat the butter and oil in an ovenproof frying pan over a medium heat. Add the seasoned lamb and fry for 6-8 minutes, turning regularly, until browned on all sides.
Add the star anise and thyme, then transfer the pan to the oven and cook for 7-8 minutes (for medium), or until cooked to your liking. Remove from the oven and set the lamb aside on a warm plate to rest for 10 minutes. Reserve the pan juices in the pan.
Meanwhile, add the chicken stock to the pan the lamb was cooked in and bring to a simmer, scraping up any browned bits from the bottom of the pan using a wooden spoon, to deglaze. Continue to simmer until the volume of liquid has reduced by half and the pan juices have thickened. Season, to taste, with salt and freshly ground black pepper. Set aside and keep warm.
For the sautéed sweet potatoes, heat the butter and olive oil in a frying pan over a medium heat. When the butter is foaming, add the onion and fry for 1-2 minutes, or until just softened.
Add the star anise, thyme and cubed sweet potato and fry, stirring regularly, for 4-5 minutes, or until the sweet potato cubes are tender and golden-brown. Remove the star anise and discard (or rinse and save for another recipe).
For the sweet potato crisps, heat the oil in a deep fat fryer to 190C. Alternatively, half-fill a deep heavy-based frying pan with oil and heat until a breadcrumb sizzles and turns brown in 30 seconds when when dropped into it. (CAUTION: hot oil can be dangerous. Do not leave unattended.)
Carefully lower the potato slices into the hot oil and fry for 30-45 seconds, or until crisp and golden-brown. Remove from the pan using a slotted spoon and set aside to drain on kitchen paper, then season, to taste, with salt and freshly ground black pepper.
To serve, place a medium sized chefs' ring into the centre of each of four serving plates. Fill each with some of the sautéed sweet potato, pressing down using the back of a spoon to compress. Carefully remove the chefs' rings. Carve the lamb loin into thick slices and arrange a few slices on top of each sweet potato tower. Sprinkle over the amaranth and coriander leaves and place one sweet potato crisp on top of each. Drizzle the reduced pan juices around the edge of the plate.


Cmon store title component Axshare link: https://nm6pq4.axshare.com/#g=1&p=homepage Dimensions:640x430px


class: center, middle # Metagenomics analysis with NGLess [Luis Pedro Coelho](https://luispedro.org) [@luispedrocoelho](https://twitter.com/luispedrocoelho) --- # NGLess NGLess is built around a domain-specific language for genomics - Flexible system with built-in support for many basic operations - Designed for reproducibility from the ground-up. - Can integrate with Common Workflow Language based systems (basic operations are already available as CWL modules, more complex ones will soon be). - Can scale up to 10,000s of samples (including cluster integration and robustness to node failures) --- # What we will be doing: 1. Loading a set of Fastq files 2. Preprocessing it 3. Filtering out human reads 4. Mapping (aligning) against a set of marker genes 5. Building a table of taxonomic abundances In summary, **going from raw data to a table of features**. We will work on a very small example - Real world examples would need at least a few hours of CPU time. Aligning to a big gene catalog takes _hours of CPU time per sample_. - We will work on **sampled data** --- # Step 0: Download the data Retrieve data: ngless --download-demo gut-short This will retrieve data and a script for a short demo based on metagenomes from the human gut ([Zeller et al, 2014](https://dx.doi.org/10.15252/msb.20145645)). There is a text-version of this tutorial at [https://ngless.embl.de/tutorial-gut-metagenomics.html](https://ngless.embl.de/tutorial-gut-metagenomics.html). --- # Data is organized with a _sample per directory_ $ find ./igc.demo.short ./SAMN05615096.short ./SAMN05615096.short/SRR4052021.pair.1.fq.gz ./SAMN05615096.short/SRR4052021.single.fq.gz ./SAMN05615096.short/SRR4052021.pair.2.fq.gz ./process.ngl ./SAMN05615097.short ./SAMN05615097.short/SRR4052022.pair.2.fq.gz ./SAMN05615097.short/SRR4052022.single.fq.gz ./SAMN05615097.short/SRR4052022.pair.1.fq.gz ./SAMN05615098.short ./SAMN05615098.short/SRR4052033.single.fq.gz ./SAMN05615098.short/SRR4052033.pair.1.fq.gz ./SAMN05615098.short/SRR4052033.pair.2.fq.gz --- # Step 1: basic preprocessing ```python ngless "0.0" import "mocat" version "0.0" input = load_mocat_sample('SAMN05615097.short') preprocess(input, keep_singles=False) using |read|: read = substrim(read, min_quality=25) if len(read) < 45: discard write(input, ofile='preproc.fq.gz') ``` [1_preproc.ngl](scripts/1_preproc.ngl) --- # Step 1.1: Declarations ```python ngless "0.0" import "mocat" version "0.0" ``` With NGLess, you **must declare all versions of anything you use**: - perfect reproducibility - _everything that you need_ is specified in the script. - command line/configuration files change _how_ computation is run, not _what_ the computation is. --- # Step 1.2: Loading data & preprocessing ```python ngless "0.0" import "mocat" version "0.0" input = load_mocat_sample('SAMN05615097.short') preprocess(input, keep_singles=False) using |read|: read = substrim(read, min_quality=25) if len(read) < 45: discard write(input, ofile='preproc.fq.gz') ``` [1_preproc.ngl](scripts/1_preproc.ngl) Typical preprocessing pipeline 1. Trimming reads by quality: - substrim() - endstrim() 2. Discarding reads that are too small --- # Running it $ ngless 1_preproc.ngl NGLess v0.0.0 (C) NGLess authors https://ngless.embl.de/ When publishing results from this script, please cite the following references: - MOCAT2: a metagenomic assembly, annotation and profiling framework. Kultima JR, Coelho LP, Forslund K, Huerta-Cepas J, Li S, Driessen M, et al. (2016) Bioinformatics (2016) [Mon 23-10-2017 16:53]: Script OK. Starting interpretation... [Mon 23-10-2017 16:53]: Interpretation finished. --- # Running it: important options ```bash $ ngless --help ... Available options: -n,--validate-only Only validate input, do not run script --trace Set highest verbosity mode -j,--jobs Nr of threads to use --scrict-threads strictly respect the --jobs option (by default, NGLess will, occasionally, use more threads than specified) -t,--temporary-directory ARG Directory where to store temporary files --keep-temporary-files Whether to keep temporary files (default is delete them) --config-file ARG Configuration files to parse --subsample Subsample mode: quickly test a pipeline by discarding 99% of the input ``` --- # Discard human reads ```python ... mapped = map(input, reference='hg19') mapped = select(mapped) using |mr|: mr = mr.filter(min_match_size=45, min_identity_pc=90, action={unmatch}) if mr.flag({mapped}): discard write(mapped, ofile='mapped.bam') ``` [2_map_hg19.ngl](scripts/2_map_hg19.ngl) 1. The `map()` function transforms a `ShortRead` to a `MappedShortRead`. In this case, we are using the builtin `'hg19'` reference. 2. With [select()](https://ngless.embl.de/Functions.html#select), we can process these `MappedShortRead`. We need to add a minimal match size to avoid random, spurious matches (45 should be safe). --- # Back to reads ```python ngless '0.0' import "mocat" version "0.0" input = load_mocat_sample('SAMN05615097.short') preprocess(input, keep_singles=False) using |read|: read = substrim(read, min_quality=25) if len(read) < 45: discard mapped = map(input, reference='hg19') mapped = select(mapped) using |mr|: mr = mr.filter(min_match_size=45, min_identity_pc=90, action={unmatch}) if mr.flag({mapped}): discard input = as_reads(mapped) ``` [3_taxprofile.ngl](scripts/3_taxprofile.ngl) `as_reads()` converts from `MappedShortReads` (BAM file) to `ShortReads` (FastQ files). --- # Quantify mOTUs and specI clusters (taxonomic) ```python ngless "0.0" import "mocat" version "0.0" import "motus" version "0.1" import "specI" version "0.1" ... ``` [3_taxprofile.ngl](scripts/3_taxprofile.ngl) Same preprocessing as before, but with **new imports**. --- ```python ... mapped = map(input, reference='motus', mode_all=True) mapped = select(mapped) using |mr|: mr = mr.filter(min_match_size=45, min_identity_pc=97, action={drop}) if not mr.flag({mapped}): discard counted = count(mapped, features=['gene'], multiple={dist1}) write(motus(counted), ofile='motus.counts.txt') ``` [3_taxprofile.ngl](scripts/3_taxprofile.ngl) 1. We again `select()` to extract high quality mappings only. 2. We use [count()](https://ngless.embl.de/Functions.html#count) to aggregate 3. Finally, we use the `motus()` special function to summarize by --- # Continuing... ```python input = as_reads(mapped) mapped = map(input, reference='refmg') mapped = select(mapped) using |mr|: mr = mr.filter(min_match_size=45, min_identity_pc=97, action={drop}) if not mr.flag({mapped}): discard write(count(mapped, features=['species'], include_minus1=True), ofile='species.raw.counts.txt') ``` [3_taxprofile.ngl](scripts/3_taxprofile.ngl) --- # For **one sample**, we are done! What if we have many samples? 1. Process all of them 2. Paste the results Note that step 1 can be done in parallel. In fact, for large projects, you _need_ to do it in parallel. --- # NGLess can help you with this ```python ngless "0.0" import "parallel" version "0.0" samples = readlines('igc.demo.short') sample = lock1(samples) input = load_mocat_sample(sample) ... motus_table = motus(counted) collect(motus_table, current=sample, allneeded=samples, ofile='complete-counts.txt') ``` [4_parallel.ngl](scripts/4_parallel.ngl) The [parallel module](https://ngless.embl.de/stdlib.html#parallel-module) has a few utility functions to help handle large scale projects: - `lock1()` : select a sample from a pool of tasks - `collect()` : paste many results together (**if and only if** all of them are present). --- # Mapping to the IGC The IGC, integrated gene catalog, is the most current human gut gene catalog. Now, this should be easier to understand: ```python ngless "0.0" import "igc" version "0.0" ... mapped = map(input, reference='igc', mode_all=True) counts = count(mapped, features=['KEGG_ko', 'eggNOG_OG'], normalization={scaled}) collect(counts, current=sample, allneeded=samples, ofile='igc.profiles.txt') ``` 5_w_igc.ngl As with the human reference, the IGC is _lazily downloaded_. --- # You can also run NGLess from Python This is **very experimental**. ```python from ngless import NGLess sc = NGLess.NGLess('0.0') sc.import_('mocat', '0.0') e = sc.env e.sample = sc.load_mocat_sample_('testing') @sc.preprocess_(e.sample, using='r') def proc(bk): bk.r = sc.substrim_(bk.r, min_quality=25) sc.if_(sc.len_(bk.r) < 45, sc.discard_) e.mapped = sc.map_(e.sample, reference='hg19') e.mapped = sc.select_(e.mapped, keep_if=['{mapped}']) sc.write_(e.mapped, ofile='ofile.sam') sc.run() ``` --- # More information - [NGLess webpage](https://ngless.embl.de) - [Code on github](https://github.com/ngless-toolkit/ngless) - [Google user group](https://groups.google.com/forum/#!forum/ngless) ---
Thank you.


PizzaBoggs
Size
small
medium
large
Toppings (Cost 50 cents each)
pepperoni
ham
green peppers
pineapple
anchovies
Order my pizza!
Reset my Order


Joe Thor
About
|
Portfolio
|
Contact
Portfolio
Sappho and Boaz
Poops and Boaz
Poops
Poops, Sappho, and Boaz
Sappho and Boaz


Press the copy button to copy table data to the clipboard.
Base 10
English
Portuguese
German
Italian


{% extends "base.html" %} {% import 'bootstrap/wtf.html' as wtf %} {% block app_content %}
| Edmonds Local Food Services during COVID-19 Shutdown | |||
| Business | Address | Phone | Services |
| 190 Sunset | 190 Sunset Ave |<PHONE_NUMBER> | Closed till further notice |
| 407 Coffee house | 407 Main Street |<PHONE_NUMBER> | cutting back hours |
| 5 Corners Teriyaki | 8410 Main Street |<PHONE_NUMBER> | Takeout by phone; third party delivery |
| Anthony’s Restaurant and Beach Café | 456 Admiral Way |<PHONE_NUMBER> | Takeout and curbside pickup at Beach Café. See website for special curbside pickup menu. |
| Arnie’s | 300 Admiral Way |<PHONE_NUMBER> | Closed till further notice |
| Bar Dojo | 8404 Bowdoin Way |<PHONE_NUMBER> | Takeout by phone |
| Barkada | 622 5th Ave N |<PHONE_NUMBER> | Takeout and door dash Weds-Sun |
| Bistro 76 | 18401 76th Ave W |<PHONE_NUMBER> | Drive through and to go orders by phone |
| Boiling Point | 22001 Highway 99 |<PHONE_NUMBER> | Takeout by phone |
| Brigid’s Bottle Shop | 188 Sunset Ave |<PHONE_NUMBER> | retail only |
| Bucatini | 9818 Edmonds Way |<PHONE_NUMBER> | Takeout by phone; third party delivery |
| Café Ladro | 8403 Main Street |<PHONE_NUMBER> | Drive up window, walk-in counter for take out |
| Café Louvre | 210 5th Avenue | 425-64–8188 | Takeout only |
| Calypso | 109 Main St. |<PHONE_NUMBER> | Takeout by phone |
| Canarino Gelato | 203 Fifth Ave |<PHONE_NUMBER> | Open regular hours for takeout |
| Caravan Kabob | 9711 Firdale Ave |<PHONE_NUMBER> | Takeout by phone |
| Channel Marker | 120 W. Dayton #1 |<PHONE_NUMBER> | Closed till further notice |
| Chanterelle | 316 Main St. |<PHONE_NUMBER> | Takeout by phone |
| Cheesemonger’s Table | 203 5th Ave S |<PHONE_NUMBER> | Takeout by phone. Third party delivery only |
| Chef Dane Catering | 19515 44th Ave W, Lynnwood |<PHONE_NUMBER> | Takeout by phone; In house delivery service |
| Chopsticks | 23025 100th Ave W |<PHONE_NUMBER> | Take out by phone |
| Church Key Pub | 109 4th Ave N |<PHONE_NUMBER> | Takeout food and growlers by phone; takeout window, curbside pickup |
| Claire’s Restaurant | 301 Main Street |<PHONE_NUMBER> | appears closed up tight |
| Demetris Woodstone Taverna | 101 Main St, Edmonds |<PHONE_NUMBER> | Takeout order via phone or website; third party delivery only; 10% off online orders |
| Dick’s Drive In | 21910 Hwy 99 |<PHONE_NUMBER> | Takeout |
| Edmonds Bakery | 418 Main Street |<PHONE_NUMBER> | Open 9-5 for takeout |
| Engel’s Pub | 113 5th Ave S |<PHONE_NUMBER> | Pub meals to go; menu on website |
| Epulo | 526 Main Street |<PHONE_NUMBER> | Takeout by phone or order online, pickup or delivery available 11:30 am – 4:30 pm |
| Fat Pig Barbeque | 7533 Olympic View Dr |<PHONE_NUMBER> | Takeout by phone |
| Five | 650 Edmonds Way |<PHONE_NUMBER> | Closed till further notice |
| Furi Chinese | 546 5th Ave S |<PHONE_NUMBER> | Order online; free delivery |
| Gallagher’s Where you Brew | 180 W. Dayton |<PHONE_NUMBER> | Closed till further notice |
| Girardi’s Osteria | 504 5th Ave |<PHONE_NUMBER> | Closed till further notice |
| Hook | 18521 76th Ave W |<PHONE_NUMBER> | Closed till further notice |
| Ivar’s seafood bar | 9910 Edmonds Way |<PHONE_NUMBER> | Takeout by phone; Third party delivery only |
| Johnny’s Wok | 19626 76th Ave W |<PHONE_NUMBER> | Takeout by phone, online; third party delivery |
| Kafe Neo | 21108 Hwy 99 |<PHONE_NUMBER> | Takeout order via phone or website; Third party delivery only |
| Kebella’s Pizza | 630 Edmonds Way |<PHONE_NUMBER> | Order by phone or online; take out or free delivery |
| Kelnero | 545 Main Street |<PHONE_NUMBER> | Takeout by phone; online ordering at toasttab.com/kelnero |
| Las Brisas | 201 5th Avenue |<PHONE_NUMBER> | take out, |
| Maize/Barley | 525 Main Street |<PHONE_NUMBER> | take out window service |
| Mar Ket | 508 Main Street |<PHONE_NUMBER> | Walkup window; takeout by phone or order thru app; third party delivery; half price bottles of wine |
| Mel and Mia’s | 7530 Olympic View Drive |<PHONE_NUMBER> | Takeout and delivery Weds-Sun |
| Noodle Hut | 8418 Bowdoin Way |<PHONE_NUMBER> | Closed till April 9 |
| Oaxaca | 8402 Bowdoin Way |<PHONE_NUMBER> | Takeout by phone |
| Ono Poke | 10016 Edmonds Way |<PHONE_NUMBER> | Takeout by phone |
| Pagliaci | 10200 Edmonds Way |<PHONE_NUMBER> | Takeout and delivery by phone or website |
| Pancake Haus | 530 5th Ave S |<PHONE_NUMBER> | Closed till further notice |
| Panera Bread | 7929 Ballinger Way |<PHONE_NUMBER> | Order phone or online; Pickup in store |
| PCC Edmonds | 9803 Edmonds Way |<PHONE_NUMBER> | Grocery delivery; senior shopping hours 7-8 am; in-store self-serve stations and seating areas closed. Latest info here: https://www.pccmarkets.com/news/2020/an-update-from-pcc-actions-were-taking-to-prevent-spread-of-coronavirus-covid-19/ |
| PNW Catering |<PHONE_NUMBER> | Takeout by phone; In house delivery service | |
| Portofino | 1306 Olympic View Dr |<PHONE_NUMBER> | Takeout by phone; in-house delivery |
| Red Twig | 117 5th Ave S. |<PHONE_NUMBER> | take out by phone, curbside pickup; free kids’ meal w/ entrée purchase M-F |
| Romeo’s Restaurant | 21110 76th Ave W |<PHONE_NUMBER> | takeout by phone or app; in-house delivery |
| Rory’s | 105 Main Street |<PHONE_NUMBER> | Closed till further notice |
| Revelations Frozen Yogurt | 527 Main Street |<PHONE_NUMBER> | Open for takeout |
| Rusty Pelican | 107 5th Ave N |<PHONE_NUMBER> | Closed till further notice |
| Salish Sea Brewery | 518 Dayton Street |<PHONE_NUMBER> | Phone in orders; sandwichs, growlers |
| Salt and Iron | 321 Main St |<PHONE_NUMBER> | Takeout by phone |
| San Kai Sushi | 111 4th Ave N |<PHONE_NUMBER> | Takeout by phone, lunch and dinner |
| Santa Fe Mexican | 423 Main Street |<PHONE_NUMBER> | Closed till further notice |
| Scott’s | 8115 Ballinger Way |<PHONE_NUMBER> | Takeout by phone |
| Scratch Distillery | 190 Sunset Ave |<PHONE_NUMBER> | Open Thu-Fri 4-6 pm, Sat-Sun 2-6 pm for to go, curbside and local delivery. Order via website, email, phone or walkup. |
| Spud Fish and Chips | 174 Sunset Way |<PHONE_NUMBER> | Takeout by phone; third party delivery |
| Starbucks 220th and Hwy 99 | 21920 Hwy 99 |<PHONE_NUMBER> | Closed; driveup service at other locations |
| Starbucks Main St | 502 Main Street |<PHONE_NUMBER> | Closed; driveup service at other locations |
| Starbucks Westgate | 9801 Edmonds Wa |<PHONE_NUMBER> | Drive up window service only |
| Subway | 7600 196TH ST SW |<PHONE_NUMBER> | Takeout and third party delivery |
| T&T Seafood | 225511 Hwy 99 |<PHONE_NUMBER> | Takeout by phone; third party delivery |
| Taki Tiki | 518 Main Street |<PHONE_NUMBER> | Takeout window or by phone; third party delivery |
| Tasty Thai | 22611 76th Ave W |<PHONE_NUMBER> | Takeout by phone; in-house delivery |
| Thai By Day | 182 Sunset Ave |<PHONE_NUMBER> | Takeout by phone |
| Thai Cottage | 417 Main Street |<PHONE_NUMBER> | Takeout by phone |
| Than Brothers Pho | 22618 Hwy 99 |<PHONE_NUMBER> | Takeout by phone |
| The Loft | 515 Main |<PHONE_NUMBER> | Takeout by phone |
| Top Pot | 150 Sunset |<PHONE_NUMBER> | mobile orders; take out |
| Toshi’s Teriyaki | 311 Main Street |<PHONE_NUMBER> | Takeout by phone |
| Venice Pizza Pasta | 9695 Firdale Ave |<PHONE_NUMBER> | Takeout by phone, online; in house delivery |
| Walnut Coffee | 410 Walnut Street |<PHONE_NUMBER> | Temporarily closed.Visit walnutstreetcoffee.com to purchase coffee, brewing equipment, gift cards and Walnut merch! 30% of all merchandise sales go directly to Walnut baristas. |
| Waterfront Café (Eatery) | 300 Admiral Way |<PHONE_NUMBER> | Closed till further notice |
| Waterfront Coffee | 101 Main St, Edmonds |<PHONE_NUMBER> | Takeout by phone |
| Wonton Noodle House | 22315 Hwy 99 |<PHONE_NUMBER> | Takeout by phone |


Given
,
When
,
Then
,
And
, or
But
followed by one of the DSL expressions below.
<page>
= the name of the page to put in scope<url>
= the URL<name>
= name of property containing the URL<page>
= the name of the page to navigate to<url>
= the URL to navigate to<element>
= name of web element to scroll to<element>
= name of web element<expression>
= the lookup expression<expression>
= the expression to match against<attribute>
= the attribute to match against<element>
= the web element to check the state of<element|attribute>
= the web element or bound attribute to check<expression>
= the expression to match against<element|attribute>
= the web element or bound attribute to check<attribute>
= the name of the bound attribute containing the value to match against<expression>
= the expression to match against<attribute>
= the name of the bound attribute containing the value to match against<dropdown>
= the dropdown element to check<text|value>
= text
to match selected option text or value
to match selection option value<expression>
= the expression to match against<dropdown>
= the dropdown element to check<text|value>
= text
to match selected option text or value
to match selection option value<attribute>
= the name of the bound attribute containing the value to match against<element|attribute|property>
= the element, attribute, or property setting to extract the value from<expression>
= the extractor expression<attribute>
= the attribute to store the captured value into<element|attribute|property>
= the element, attribute, or property setting to extract the value from<expression>
= the extractor expression<attribute>
= the attribute to store the captured value into<expression>
= the extractor expression<attribute>
= the attribute to store the captured value into<attribute>
= the attribute to bind the URL to<element|attribute|property>
= the web element, attribute, or property to capture the text of<attribute>
= the name of the attribute to bind the value to<element|attribute|property>
= the web element, attribute<dropdown>
= the dropdown element to capture the selection of<text|value>
= text
to capture the selected option text or value
to capture the selected option value<attribute>
= the name of the attribute to bind the value to<dropdown>
= the dropdown web element to capture the selection of and store in the attribute of the same name<text|value>
= text
to capture the selected option text or value
to capture the selected option value<name>
= the name of the system property to set<value>
= the value to set<attribute>
= the name of the attribute to bind the value to<expression>
= the expression that will yield the value to bind<attribute>
= the name of the attribute to bind the value to<source>
= the source attribute to evaluate the xpath expression on<expression>
= the xpath expression that will yield the value from the source to bind<attribute>
= the name of the attribute to bind the value to<source>
= the source attribute to evaluate the regex expression on<expression>
= the regex expression that will yield the value from the source to bind<attribute>
= the name of the attribute to bind the value to<value>
= the value to bind<element>
= the element to wait for text on<duration>
= the number of seconds to wait before timing out<element>
= the element to wait for text on (timeout occurs after configured "gwen.web.wait.seconds", or 10 seconds by default)<element>
= the web element to wait for<duration>
= the number of seconds to wait before timing out<element>
= the web element to wait for (timeout occurs after configured "gwen.web.wait.seconds", or 10 seconds by default)<element>
= the web element to clear the text of<element>
= the element to send the key to<value>
= the value to type or enter<element>
= the web element to type or enter the value into<attribute>
= the name of the attribute containing the value to type or enter<element>
= the web element to type or enter the value into<position>
= the position of the option to select (first is 1)<element>
= the dropdown element to select<value>
= the value to select<element>
= the dropdown element to select<value>
= the value to select<element>
= the dropdown element to select<attribute>
= the name of the attribute containing the value to select<element>
= the dropdown element to select<attribute>
= the name of the attribute containing the value to select<element>
= the dropdown element to select<element>
= the element to perform the action on<duration>
= the number of seconds to wait<element>
= the element the action was performed on<condition>
= the name of the bound attribute containing a javascript predicate expression<element>
= the element the action was performed on<javascript>
= a javascript predicate expression<condition>
= the name of the bound attribute containing the javascript predicate expression<duration>
= the number of seconds to wait<element>
= the element to highlight<process>
= the system process to execute<process>
= the unix system process to execute<element|attribute>
= the web element or bound attribute to decode<attribute>
= the attribute to bind the result to<element|attribute>
= the web element or bound attribute to decodegwen.web.wait.seconds
setting (or 1 second if not set)
The default timeout period is 30 times the delay.
<step>
= the step to repeat<condition>
= the name of the bound attribute containing a javascript predicate expression<element>
= name of web element<expression>
= the lookup expression<container>
= the container element (a frame, div, or other container element)<session>
= the unique name to assign to the new browser session<session>
= the name of the browser session to close<session>
= the name of the browser session to switch to<element>
= the element to perform the action on<context>
= the context element to move into (in order to activate <element>)<expression>
= the JSON path to match against<attribute>
= the attribute containing the JSON path to match against<element|attribute>
= the web element or bound attribute to check<attribute>
= the name of the bound attribute containing the JSON path to match against<dropdown>
= the dropdown element to check<text|value>
= text
to match selected option text or value
to match selection option value<expression>
= the JSON path to match against<dropdown>
= the dropdown element to check<text|value>
= text
to match selected option text or value
to match selection option value<attribute>
= the name of the bound attribute containing the JSON path to match against<element|attribute|property>
= the element, attribute, or property setting to extract the value from<expression>
= the JSON path extractor expression<attribute>
= the attribute to store the captured value into<attribute>
= the name of the attribute to bind the value to<source>
= the source attribute to evaluate the JSON expression on<expression>
= the JSON expression that will yield the value from the source to bind<step>
= the step to repeat<condition>
= the name of the bound attribute containing a javascript predicate expression<delayPeriod>
= the time to wait between repeats<timeoutPeriod>
= the total time to wait before timing out<step>
= the step to repeat<condition>
= the name of the bound attribute containing a javascript predicate expression<delayPeriod>
= the time to wait between repeatsgwen.web.wait.seconds
setting (or 1 second if not set)
<step>
= the step to repeat<condition>
= the name of the bound attribute containing a javascript predicate expression<timeoutPeriod>
= the total time to wait before timing out<step>
= the step to repeat<condition>
= the name of the bound attribute containing a javascript predicate expression<timeoutPeriod>
= the total time to wait before timing out<step>
= the step to repeat<condition>
= the name of the bound attribute containing a javascript predicate expression<element>
= the web element to perform the action on (a web element binding)<javascript>
= a javascript function that performs the desired action on the element.
element
<attribute>
= the name of the attribute to bind the value to<filepath>
= the path to the file<attribute>
= the name of the attribute to bind the SQL result to<selectStmt>
= the SQL select query statement<dbName>
= the name of database to execute the query on. This name is used to configure the database as follows:
GWEN_CLASSPATH
environment variable must be set to include a path to the JDBC driver JAR
<dbName>
.driver setting must be set to the name of the JDBC driver implementation class
<dbName>
.url setting must be set to the JDBC URL of the database
<dbName>
=feedback
<w>
= the width in pixels<h>
= the height in pixels<step>
= the step to repeat for each element<element>
= the name given to the current element in the iteration<expression>
= the lookup expression for the element iteration<step>
= the step to repeat for each element<element>
= the name given to the current element in the iteration<expression>
= the lookup expression for the element iteration<container>
= the container element (a frame, div, or other container element)<step>
= the step to repeat for each element<element>
= the name given to the current element in the iteration<elements>
= the element iteration locator binding


Choose your character
Shooter Enforcer Sniper War Fusion Thunderbird
Spikeshot
Go back to the website


{{ range where $.Site.RegularPages.ByDate "Section" "about" }}
{{- partial "about-entry.html" . -}}
{{ end }}
Portfolio
This section is long. Scroll down to see what I've been up to in reverse chronological order, or
first use the following tag cloud to filter the entries based upon your interests.


The Mounty Hall Game
DOOR 1
DOOR 2
DOOR 3
Username
Win % Overall
Switch-vs-Stay %
Switch & Win %
Stay & Win %
Click Here To See / Hide Games
Game
Username
User Choice
Win / Lose
Game Results For All Users
Username
Win % Overall
Switch-vs-Stay %
Switch & Win %
Stay & Win %
Click Here To See / Hide Games
Game
Username
User Choice
Win / Lose


<target-index>
-
(Required, string) Name of the target index to create.
Index names must meet the following criteria:
-
Lowercase only
-
Cannot include
\
,/
,*
,?
,"
,<
,>
,|
, ` ` (space character),,
,#
-
Indices prior to 7.0 could contain a colon (
:
), but that’s been deprecated and won’t be supported in 7.0+ -
Cannot start with
-
,_
,+
-
Cannot be
.
or..
-
Cannot be longer than 255 bytes (note it is bytes, so multi-byte characters will count towards the 255 limit faster)
-
Names starting with
.
are deprecated, except for hidden indices and internal indices managed by plugins
-
Query parameters
wait_for_active_shards
-
(Optional, string) The number of shard copies that must be active before proceeding with the operation. Set to
all
or any positive integer up to the total number of shards in the index (number_of_replicas+1
). Default: 1, the primary shard.See Active shards.
master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
. timeout
-
(Optional, time units) Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.
Request body
aliases
-
(Optional, alias object) Index aliases which include the target index. See Update index alias API.
settings
-
(Optional, index setting object) Configuration options for the target index. See Index Settings.
Simulate index API
experimental[]
Returns the index configuration that would be applied to the specified index from an existing index template.
POST /_index_template/_simulate_index/my-index-000001
Request
POST /_index_template/_simulate_index/<index>
Path parameters
<index>
-
(Required, string) Name of the index to simulate.
Query parameters
master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.
Response body
overlapping
-
(array) Any templates that also matched the index but were superseded by a higher-priority template. Response includes an empty array if there are no overlapping templates.
Properties of
overlapping
name
-
(string) Name of the superseded template.
index_patterns
-
(array) Index patterns that the superseded template applies to.
template
-
(object) The settings, mappings, and aliases that would be applied to the index.
Properties of
template
aliases
-
(Optional, alias object) Index aliases which include the index. See Update index alias API.
Response includes an empty object if no aliases would be applied.
mappings
-
(Optional, mapping object) Mapping for fields in the index. If specified, this mapping can include:
-
Field names
See Mapping.
Omitted from the response if no mappings would be applied.
-
settings
-
(Optional, index setting object) Configuration options for the index. See Index Settings.
Response includes an empty object if no settings would be applied.
Examples
The following example shows the configuration that would be applied to my-index-000001
by
an existing template.
PUT /_component_template/ct1 (1)
{
"template": {
"settings": {
"index.number_of_shards": 2
}
}
}
PUT /_component_template/ct2 (2)
{
"template": {
"settings": {
"index.number_of_replicas": 0
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
}
}
}
}
}
PUT /_index_template/final-template (3)
{
"index_patterns": ["my-index-*"],
"composed_of": ["ct1", "ct2"],
"priority": 5
}
POST /_index_template/_simulate_index/my-index-000001 (4)
-
Create a component template (
ct1
) that sets the number of shards to 2 -
Create a second component template (
ct2
) that sets the number of replicas to 0 and defines a mapping -
Create an index template (
final-template
) that uses the component templates -
Show the configuration that would be applied to
my-index-000001
The response shows the index settings, mappings, and aliases applied by the final-template
:
{
"template" : {
"settings" : {
"index" : {
"number_of_shards" : "2",
"number_of_replicas" : "0"
}
},
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
}
}
},
"aliases" : { }
},
"overlapping" : [
{
"name" : "template_1",
"index_patterns" : [
"my-index-*"
]
}
]
}
Simulate index template API
experimental[]
Returns the index configuration that would be applied by a particular index template.
POST /_index_template/_simulate/template_1
Request
POST /_index_template/_simulate/<index-template>
Path parameters
<index-template>
-
(Optional, string) Name of the index template to simulate. To test a template configuration before you add it to the cluster, omit this parameter and specify the template configuration in the request body.
Query parameters
create
-
(Optional, Boolean) If
true
, the template passed in the body is only used if no existing templates match the same index patterns. Iffalse
, the simulation uses the template with the highest priority. Note that the template is not permanently added or updated in either case; it is only used for the simulation. Defaults tofalse
. master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.
Request body
composed_of
-
(Optional, array of strings) Ordered list of component template names. Component templates are merged in the order specified, meaning that the last component template specified has the highest precedence. For an example, see Composing multiple component templates.
index_patterns
-
(Required, array of strings) Array of wildcard (
*
) expressions used to match the names of indices during creation. priority
-
(Optional, integer) Priority that determines what template is applied if there are multiple templates that match the name of a new index. The highest priority template takes precedence. Defaults to
0
(lowest priority). template
-
(Optional, object) Template to apply.
Properties of
template
aliases
-
(Optional, alias object) Index aliases which include the index. See Update index alias API.
mappings
-
(Optional, mapping object) Mapping for fields in the index. If specified, this mapping can include:
-
Field names
See Mapping.
-
settings
-
(Optional, index setting object) Configuration options for the index. See Index Settings.
version
-
(Optional, integer) Version number used to manage index templates externally. This version is not automatically generated by OpenSearch.
_meta
-
(Optional, object) User-specified metadata for the index template. This information is not generated or used by OpenSearch.
Response body
overlapping
-
(array) Any templates that were superseded by the specified template.
Properties of
overlapping
index_patterns
-
(array) Index patterns that the superseded template applies to.
name
-
(string) Name of the superseded template.
template
-
(object) The settings, mappings, and aliases that would be applied to matching indices.
Properties of
template
aliases
-
(Optional, alias object) Index aliases which include the index. See Update index alias API.
mappings
-
(Optional, mapping object) Mapping for fields in the index. If specified, this mapping can include:
-
Field names
See Mapping.
-
settings
-
(Optional, index setting object) Configuration options for the index. See Index Settings.
Examples
Simulating an existing template
The following example creates and simulates a composed template:
PUT /_component_template/ct1 (1)
{
"template": {
"settings": {
"index.number_of_shards": 2
}
}
}
PUT /_component_template/ct2 (2)
{
"template": {
"settings": {
"index.number_of_replicas": 0
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
}
}
}
}
}
PUT /_index_template/final-template (3)
{
"index_patterns": ["my-index-*"],
"composed_of": ["ct1", "ct2"],
"priority": 5
}
POST /_index_template/_simulate/final-template (4)
-
Create a component template (
ct1
) that sets the number of shards to 2 -
Create a component template (
ct2
) that sets the number of replicas to 0 and defines a mapping -
Create an index template (
final-template
) that uses the component templates -
Show the configuration applied by the
final-template
The response shows the index settings, mappings, and aliases applied by the final-template
:
{
"template" : {
"settings" : {
"index" : {
"number_of_shards" : "2", (1)
"number_of_replicas" : "0" (2)
}
},
"mappings" : { (3)
"properties" : {
"@timestamp" : {
"type" : "date"
}
}
},
"aliases" : { }
},
"overlapping" : [ ]
}
-
Number of shards from
ct1
-
Number of replicas from
ct2
-
Mappings from
ct1
Simulating an arbitrary template configuration
To see what settings will be applied by a template before you add it to the cluster, you can pass a template configuration in the request body. The specified template is used for the simulation if it has a higher priority than existing templates.
POST /_index_template/_simulate
{
"index_patterns": ["my-index-*"],
"composed_of": ["ct2"],
"priority": 10,
"template": {
"settings": {
"index.number_of_replicas": 1
}
}
}
The response shows any overlapping templates with a lower priority.
{
"template" : {
"settings" : {
"index" : {
"number_of_replicas" : "1"
}
},
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
}
}
},
"aliases" : { }
},
"overlapping" : [
{
"name" : "final-template",
"index_patterns" : [
"my-index-*"
]
}
]
}
Split index API
Splits an existing index into a new index with more primary shards.
POST /my-index-000001/_split/split-my-index-000001
{
"settings": {
"index.number_of_shards": 2
}
}
Request
POST /<index>/_split/<target-index>
PUT /<index>/_split/<target-index>
Prerequisites
Before you can split an index:
-
The index must be read-only.
-
The cluster health status must be green.
You can do make an index read-only with the following request:
PUT /my_source_index/_settings
{
"settings": {
"index.blocks.write": true (1)
}
}
-
Prevents write operations to this index while still allowing metadata changes like deleting the index.
Description
The split index API allows you to split an existing index into a new index, where each original primary shard is split into two or more primary shards in the new index.
The number of times the index can be split (and the number of shards that each
original shard can be split into) is determined by the
index.number_of_routing_shards
setting. The number of routing shards
specifies the hashing space that is used internally to distribute documents
across shards with consistent hashing. For instance, a 5 shard index with
number_of_routing_shards
set to 30
(5 x 2 x 3
) could be split by a
factor of 2
or 3
. In other words, it could be split as follows:
-
5
→10
→30
(split by 2, then by 3) -
5
→15
→30
(split by 3, then by 2) -
5
→30
(split by 6)
index.number_of_routing_shards
is a static index
setting. You can only set index.number_of_routing_shards
at index creation
time or on a closed index.
Index creation example
The following create index API creates the
my-index-000001
index with an index.number_of_routing_shards
setting of 30
.
PUT /my-index-000001
{
"settings": {
"index": {
"number_of_routing_shards": 30
}
}
}
The index.number_of_routing_shards
setting’s default value depends
on the number of primary shards in the original index.
The default is designed to allow you to split
by factors of 2 up to a maximum of 1024 shards. However, the original number
of primary shards must taken into account. For instance, an index created
with 5 primary shards could be split into 10, 20, 40, 80, 160, 320, or a
maximum of 640 shards (with a single split action or multiple split actions).
If the original index contains one primary shard (or a multi-shard index has been shrunk down to a single primary shard), then the index may by split into an arbitrary number of shards greater than 1. The properties of the default number of routing shards will then apply to the newly split index.
How splitting works
A split operation:
-
Creates a new target index with the same definition as the source index, but with a larger number of primary shards.
-
Hard-links segments from the source index into the target index. (If the file system doesn’t support hard-linking, then all segments are copied into the new index, which is a much more time consuming process.)
-
Hashes all documents again, after low level files are created, to delete documents that belong to a different shard.
-
Recovers the target index as though it were a closed index which had just been re-opened.
Why doesn’t OpenSearch support incremental resharding?
Going from N
shards to N+1
shards, aka. incremental resharding, is indeed a
feature that is supported by many key-value stores. Adding a new shard and
pushing new data to this new shard only is not an option: this would likely be
an indexing bottleneck, and figuring out which shard a document belongs to
given its _id
, which is necessary for get, delete and update requests, would
become quite complex. This means that we need to rebalance existing data using
a different hashing scheme.
The most common way that key-value stores do this efficiently is by using
consistent hashing. Consistent hashing only requires 1/N
-th of the keys to
be relocated when growing the number of shards from N
to N+1
. However
OpenSearch’s unit of storage, shards, are Lucene indices. Because of their
search-oriented data structure, taking a significant portion of a Lucene index,
be it only 5% of documents, deleting them and indexing them on another shard
typically comes with a much higher cost than with a key-value store. This cost
is kept reasonable when growing the number of shards by a multiplicative factor
as described in the above section: this allows OpenSearch to perform the
split locally, which in-turn allows to perform the split at the index level
rather than reindexing documents that need to move, as well as using hard links
for efficient file copying.
In the case of append-only data, it is possible to get more flexibility by creating a new index and pushing new data to it, while adding an alias that covers both the old and the new index for read operations. Assuming that the old and new indices have respectively M and N shards, this has no overhead compared to searching an index that would have M+N shards.
Split an index
To split my_source_index
into a new index called my_target_index
, issue
the following request:
POST /my_source_index/_split/my_target_index
{
"settings": {
"index.number_of_shards": 2
}
}
The above request returns immediately once the target index has been added to the cluster state — it doesn’t wait for the split operation to start.
|
Important
|
Indices can only be split if they satisfy the following requirements:
|
The _split
API is similar to the create index
API
and accepts settings
and aliases
parameters for the target index:
POST /my_source_index/_split/my_target_index
{
"settings": {
"index.number_of_shards": 5 (1)
},
"aliases": {
"my_search_indices": {}
}
}
-
The number of shards in the target index. This must be a multiple of the number of shards in the source index.
|
Note
|
Mappings may not be specified in the _split request.
|
Monitor the split process
The split process can be monitored with the _cat recovery
API, or the cluster health
API can be used to wait
until all primary shards have been allocated by setting the wait_for_status
parameter to yellow
.
The _split
API returns as soon as the target index has been added to the
cluster state, before any shards have been allocated. At this point, all
shards are in the state unassigned
. If, for any reason, the target index
can’t be allocated, its primary shard will remain unassigned
until it
can be allocated on that node.
Once the primary shard is allocated, it moves to state initializing
, and the
split process begins. When the split operation completes, the shard will
become active
. At that point, OpenSearch will try to allocate any
replicas and may decide to relocate the primary shard to another node.
Wait for active shards
Because the split operation creates a new index to split the shards to, the wait for active shards setting on index creation applies to the split index action as well.
Path parameters
<index>
-
(Required, string) Name of the source index to split.
<target-index>
-
(Required, string) Name of the target index to create.
Index names must meet the following criteria:
-
Lowercase only
-
Cannot include
\
,/
,*
,?
,"
,<
,>
,|
, ` ` (space character),,
,#
-
Indices prior to 7.0 could contain a colon (
:
), but that’s been deprecated and won’t be supported in 7.0+ -
Cannot start with
-
,_
,+
-
Cannot be
.
or..
-
Cannot be longer than 255 bytes (note it is bytes, so multi-byte characters will count towards the 255 limit faster)
-
Names starting with
.
are deprecated, except for hidden indices and internal indices managed by plugins
-
Query parameters
wait_for_active_shards
-
(Optional, string) The number of shard copies that must be active before proceeding with the operation. Set to
all
or any positive integer up to the total number of shards in the index (number_of_replicas+1
). Default: 1, the primary shard.See Active shards.
master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
. timeout
-
(Optional, time units) Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.
Request body
aliases
-
(Optional, alias object) Index aliases which include the target index. See Update index alias API.
settings
-
(Optional, index setting object) Configuration options for the target index. See Index Settings.
Type exists API
Checks if a mapping type exists. Types are deprecated.
HEAD my-index-000001/_mapping/message
Request
HEAD /<index>/_mapping/<type>
Path parameters
<index>
-
(Optional, string) Comma-separated list or wildcard expression of index names used to limit the request.
<type>
-
(Optional, string) Comma-separated list or wildcard expression of types used to limit the request.
Response codes
200
-
Indicates all specified mapping types exist.
404
-
Indicates one or more specified mapping types do not exist.
Update index alias API
Adds or removes index aliases.
An index alias is a secondary name used to refer to one or more existing indices.
Most OpenSearch APIs accept an index alias in place of an index name.
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "my-index-000001", "alias" : "alias1" } }
]
}
Request
POST /_aliases
Description
APIs in OpenSearch accept an index name when working against a specific index, and several indices when applicable. The index aliases API allows aliasing an index with a name, with all APIs automatically converting the alias name to the actual index name. An alias can also be mapped to more than one index, and when specifying it, the alias will automatically expand to the aliased indices. An alias can also be associated with a filter that will automatically be applied when searching, and routing values. An alias cannot have the same name as an index.
Query parameters
master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
. timeout
-
(Optional, time units) Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.
Request body
actions
-
(Required, array of actions) Set of actions to perform. Valid actions include:
add
-
Adds an alias to an index.
remove
-
Removes an alias from an index.
remove_index
-
Deletes a concrete index, similar to the delete index API. Attempts to remove an index alias will fail.
You can perform these actions on alias objects. Valid parameters for alias objects include:
index
-
(String) Wildcard expression of index names used to perform the action.
If the
indices
parameter is not specified, this parameter is required. indices
-
(Array) Array of index names used to perform the action.
If the
index
parameter is not specified, this parameter is required. alias
-
(String) Comma-separated list or wildcard expression of index alias names to add, remove, or delete.
If the
aliases
parameter is not specified, this parameter is required for theadd
orremove
action. aliases
-
(Array of strings) Array of index alias names to add, remove, or delete.
If the
alias
parameter is not specified, this parameter is required for theadd
orremove
action. filter
-
(Optional, query object) Filter query used to limit the index alias.
If specified, the index alias only applies to documents returned by the filter. Filter query used to limit the index alias.
If specified, the index alias only applies to documents returned by the filter.
See Filtered aliases for an example.
is_hidden
-
(Optional, Boolean) If
true
, the alias will be excluded from wildcard expressions by default, unless overriden in the request using theexpand_wildcards
parameter, similar to hidden indices. This property must be set to the same value on all indices that share an alias. Defaults tofalse
. must_exist
-
(Optional, Boolean) If
true
, the alias to remove must exist. Defaults tofalse
. is_write_index
-
(Optional, Boolean) If
true
, assigns the index as an alias’s write index. Defaults tofalse
.An alias can have one write index at a time.
See Write index for an example.
ImportantAliases that do not explicitly set
is_write_index: true
for an index, and only reference one index, will have that referenced index behave as if it is the write index until an additional index is referenced. At that point, there will be no write index and writes will be rejected. routing
-
(Optional, string) Custom routing value used to route operations to a specific shard.
See Routing for an example.
index_routing
-
(Optional, string) Custom routing value used for the alias’s indexing operations.
See Routing for an example.
search_routing
-
(Optional, string) Custom routing value used for the alias’s search operations.
See Routing for an example.
Examples
Add an alias
The following request adds the alias1
alias to the test1
index.
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test1", "alias" : "alias1" } }
]
}
Remove an alias
The following request removes the alias1
alias.
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } }
]
}
Rename an alias
Renaming an alias is a simple remove
then add
operation within the
same API. This operation is atomic, no need to worry about a short
period of time where the alias does not point to an index:
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test1", "alias" : "alias2" } }
]
}
Add an alias to multiple indices
Associating an alias with more than one index is simply several add
actions:
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test2", "alias" : "alias1" } }
]
}
Multiple indices can be specified for an action with the indices
array syntax:
POST /_aliases
{
"actions" : [
{ "add" : { "indices" : ["test1", "test2"], "alias" : "alias1" } }
]
}
To specify multiple aliases in one action, the corresponding aliases
array
syntax exists as well.
For the example above, a glob pattern can also be used to associate an alias to more than one index that share a common name:
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test*", "alias" : "all_test_indices" } }
]
}
In this case, the alias is a point-in-time alias that will group all current indices that match, it will not automatically update as new indices that match this pattern are added/removed.
It is an error to index to an alias which points to more than one index.
It is also possible to swap an index with an alias in one, atomic operation. This means there will be no point in time where the alias points to no index in the cluster state. However, as indexing and searches involve multiple steps, it is possible for the in-flight or queued requests to fail due to a temporarily non-existent index.
PUT test (1)
PUT test_2 (2)
POST /_aliases
{
"actions" : [
{ "add": { "index": "test_2", "alias": "test" } },
{ "remove_index": { "index": "test" } } (3)
]
}
-
An index we’ve added by mistake
-
The index we should have added
-
remove_index
is just like Delete index API and will only remove a concrete index.
Filtered aliases
Aliases with filters provide an easy way to create different "views" of the same index. The filter can be defined using Query DSL and is applied to all Search, Count, Delete By Query and More Like This operations with this alias.
To create a filtered alias, first we need to ensure that the fields already exist in the mapping:
PUT /my-index-000001
{
"mappings": {
"properties": {
"user": {
"properties": {
"id": {
"type": "keyword"
}
}
}
}
}
}
Now we can create an alias that uses a filter on field user.id
:
POST /_aliases
{
"actions": [
{
"add": {
"index": "my-index-000001",
"alias": "alias2",
"filter": { "term": { "user.id": "bilbo" } }
}
}
]
}
Routing
It is possible to associate routing values with aliases. This feature can be used together with filtering aliases in order to avoid unnecessary shard operations.
The following command creates a new alias alias1
that points to index
test
. After alias1
is created, all operations with this alias are
automatically modified to use value 1
for routing:
POST /_aliases
{
"actions": [
{
"add": {
"index": "test",
"alias": "alias1",
"routing": "1"
}
}
]
}
It’s also possible to specify different routing values for searching and indexing operations:
POST /_aliases
{
"actions": [
{
"add": {
"index": "test",
"alias": "alias2",
"search_routing": "1,2",
"index_routing": "2"
}
}
]
}
As shown in the example above, search routing may contain several values separated by comma. Index routing can contain only a single value.
If a search operation that uses routing alias also has a routing parameter, an intersection of both search alias routing and routing specified in the parameter is used. For example the following command will use "2" as a routing value:
GET /alias2/_search?q=user.id:bilbo&routing=2,3
Write index
It is possible to associate the index pointed to by an alias as the write index. When specified, all index and update requests against an alias that point to multiple indices will attempt to resolve to the one index that is the write index. Only one index per alias can be assigned to be the write index at a time. If no write index is specified and there are multiple indices referenced by an alias, then writes will not be allowed.
It is possible to specify an index associated with an alias as a write index using both the aliases API and index creation API.
Setting an index to be the write index with an alias also affects how the alias is manipulated during Rollover (see Rollover With Write Index).
POST /_aliases
{
"actions": [
{
"add": {
"index": "test",
"alias": "alias1",
"is_write_index": true
}
},
{
"add": {
"index": "test2",
"alias": "alias1"
}
}
]
}
In this example, we associate the alias alias1
to both test
and test2
, where
test
will be the index chosen for writing to.
PUT /alias1/_doc/1
{
"foo": "bar"
}
The new document that was indexed to /alias1/_doc/1
will be indexed as if it were
/test/_doc/1
.
GET /test/_doc/1
To swap which index is the write index for an alias, the Aliases API can be leveraged to do an atomic swap. The swap is not dependent on the ordering of the actions.
POST /_aliases
{
"actions": [
{
"add": {
"index": "test",
"alias": "alias1",
"is_write_index": false
}
}, {
"add": {
"index": "test2",
"alias": "alias1",
"is_write_index": true
}
}
]
}
Update index settings API
Changes a dynamic index setting in real time.
PUT /my-index-000001/_settings
{
"index" : {
"number_of_replicas" : 2
}
}
Request
PUT /<target>/_settings
Path parameters
<target>
-
(Optional, string) Comma-separated list of indices and index aliases used to limit the request. Wildcard expressions (
*
) are supported.To target all indices in a cluster, omit this parameter or use
_all
or*
.
Query parameters
allow_no_indices
-
(Optional, Boolean) If
false
, the request returns an error if any wildcard expression, index alias, or_all
value targets only missing or closed indices. This behavior applies even if the request targets other open indices. For example, a request targetingfoo*,bar*
returns an error if an index starts withfoo
but no index starts withbar
.Defaults to
false
. expand_wildcards
-
(Optional, string) Controls what kind of indices that wildcard expressions can expand to. Multiple values are accepted when separated by a comma, as in
open,hidden
. Valid values are:all
-
Expand to open and closed indices, including hidden indices.
open
-
Expand only to open indices.
closed
-
Expand only to closed indices.
hidden
-
Expansion of wildcards will include hidden indices. Must be combined with
open
,closed
, or both. none
-
Wildcard expressions are not accepted.
Defaults to
open
. flat_settings
-
(Optional, Boolean) If
true
, returns settings in flat format. Defaults tofalse
. ignore_unavailable
-
(Optional, Boolean) If
true
, missing or closed indices are not included in the response. Defaults tofalse
. preserve_existing
-
(Optional, Boolean) If
true
, existing index settings remain unchanged. Defaults tofalse
. master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
. timeout
-
(Optional, time units) Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.
Request body
settings
-
(Optional, index setting object) Configuration options for the index. See Index Settings.
Examples
Reset an index setting
To revert a setting to the default value, use null
. For example:
PUT /my-index-000001/_settings
{
"index" : {
"refresh_interval" : null
}
}
The list of per-index settings which can be updated dynamically on live
indices can be found in Index modules.
To preserve existing settings from being updated, the preserve_existing
request parameter can be set to true
.
Bulk indexing usage
For example, the update settings API can be used to dynamically change the index from being more performant for bulk indexing, and then move it to more real time indexing state. Before the bulk indexing is started, use:
PUT /my-index-000001/_settings
{
"index" : {
"refresh_interval" : "-1"
}
}
(Another optimization option is to start the index without any replicas, and only later adding them, but that really depends on the use case).
Then, once bulk indexing is done, the settings can be updated (back to the defaults for example):
PUT /my-index-000001/_settings
{
"index" : {
"refresh_interval" : "1s"
}
}
And, a force merge should be called:
POST /my-index-000001/_forcemerge?max_num_segments=5
Update index analysis
You can only define new analyzers on closed indices.
To add an analyzer, you must close the index, define the analyzer, and reopen the index.
For example,
the following commands add the content
analyzer to the my-index-000001
index:
POST /my-index-000001/_close
PUT /my-index-000001/_settings
{
"analysis" : {
"analyzer":{
"content":{
"type":"custom",
"tokenizer":"whitespace"
}
}
}
}
POST /my-index-000001/_open
Resolve index API
Resolves the specified name(s) and/or index patterns for indices and index aliases. Multiple patterns and remote clusters are supported.
GET /_resolve/index/my-index-*
Request
GET /_resolve/index/<name>
Path parameters
<name>
-
(Required, string) Comma-separated name(s) or index pattern(s) of the indices and index aliases to resolve. Resources on remote clusters can be specified using the
<cluster>:<name>
syntax.
Query parameters
expand_wildcards
-
(Optional, string) Controls what kind of indices that wildcard expressions can expand to. Multiple values are accepted when separated by a comma, as in
open,hidden
. Valid values are:all
-
Expand to open and closed indices, including hidden indices.
open
-
Expand only to open indices.
closed
-
Expand only to closed indices.
hidden
-
Expansion of wildcards will include hidden indices. Must be combined with
open
,closed
, or both. none
-
Wildcard expressions are not accepted.
Defaults to
open
.
Examples
GET /_resolve/index/f*,remoteCluster1:bar*?expand_wildcards=all
The API returns the following response:
{
"indices": [ (1)
{
"name": "foo_closed",
"attributes": [
"closed"
]
},
{
"name": "freeze-index",
"aliases": [
"f-alias"
],
"attributes": [
"open"
]
},
{
"name": "remoteCluster1:bar-01",
"attributes": [
"open"
]
}
],
"aliases": [ (2)
{
"name": "f-alias",
"indices": [
"freeze-index",
"my-index-000001"
]
}
],
"data_streams": [ (3)
]
}
-
All indices matching the supplied names or expressions
-
All aliases matching the supplied names or expressions
-
All data streams matching the supplied names or expressions
List dangling indices API
Lists dangling indices.
Request
GET /_dangling
Description
If OpenSearch encounters index data that is absent from the current cluster
state, those indices are considered to be dangling. For example,
this can happen if you delete more than
cluster.indices.tombstones.size
indices while an OpenSearch node is offline.
Examples
The API returns the following response:
{
"dangling_indices": [
{
"index_name": "my-index-000001",
"index_uuid": "zmM4e0JtBkeUjiHD-MihPQ",
"creation_date_millis":<PHONE_NUMBER>372,
"node_ids": [
"pL47UN3dAb2d5RCWP6lQ3e"
]
}
]
}
Import dangling index API
Imports a dangling index.
Request
POST /_dangling/<index-uuid>?accept_data_loss=true
Description
If OpenSearch encounters index data that is absent from the current cluster
state, those indices are considered to be dangling. For example,
this can happen if you delete more than
cluster.indices.tombstones.size
indices while an OpenSearch node is offline.
Import a single index into the cluster by referencing its UUID. Use the List dangling indices API to locate the UUID of an index.
Path parameters
<index-uuid>
-
(Required, string) UUID of the index to import, which you can find using the List dangling indices API.
Query parameters
accept_data_loss
-
(Required, Boolean) This field must be set to
true
to import a dangling index. Because OpenSearch cannot know where the dangling index data came from or determine which shard copies are fresh and which are stale, it cannot guarantee that the imported data represents the latest state of the index when it was last in the cluster. master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
. timeout
-
(Optional, time units) Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.
Examples
The following example shows how to import a dangling index:
POST /_dangling/zmM4e0JtBkeUjiHD-MihPQ?accept_data_loss=true
The API returns following response:
{
"acknowledged" : true
}
Delete dangling index API
Deletes a dangling index.
Request
DELETE /_dangling/<index-uuid>?accept_data_loss=true
Description
If OpenSearch encounters index data that is absent from the current cluster
state, those indices are considered to be dangling. For example,
this can happen if you delete more than
cluster.indices.tombstones.size
indices while an OpenSearch node is offline.
Deletes a dangling index by referencing its UUID. Use the List dangling indices API to locate the UUID of an index.
Path parameters
<index-uuid>
-
(Required, string) UUID of the index to delete. You can find this using the List dangling indices API.
Query parameters
accept_data_loss
-
(Optional, Boolean) This field must be set to
true
in order to carry out the import, since it will no longer be possible to recover the data from the dangling index. master_timeout
-
(Optional, time units) Period to wait for a connection to the master node. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
. timeout
-
(Optional, time units) Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to
30s
.


--- layout: post title: 'HP: A New Services Doctrine That is as Much About People as it is About the Machines That Serve Us' date: '2012-03-15T01:27:27-07:00' tags: tumblr_url: http://alexhwilliams.tumblr.com/post/19337639276/hp-a-new-services-doctrine-that-is-as-much-about ---


December 2019 Sterling Exchange Rate Outlook
Author: Elitsa Vacheva
The markets have been relatively volatile over the last few weeks due to the upcoming General Election- and with opinion polls coming out on a daily basis with different results- I thought now would be a good time to start looking at possible outcomes for the election this month.
But before we look at that, it’s important to take a look at what happened in the 2017 Election.
As you can see, GBPEUR was comfortably trading at 1.20 when the election was announced- the market steadily dropped to 1.15 by the time election day came around due to opinion polls, and by the time the votes had been counted and a hung Parliament was announced, we were sitting at 1.13.
This is a drop of over 5% from the announcement to the result, which means that a transaction of 500,000 Euros would have cost £20,000 more to purchase if someone had waited until the election result.
Back to this election- right now it seems that opinion polls are favouring a Tory majority, which from an exchange rate perspective would mean at least 1.20 for GBPEUR and upwards of 1.30 for GBPUSD, which would be fantastic- however, at this point, how much can we trust opinion polls?
Many analysts still see a hung parliament this year, which would mean weakness for Sterling, as it would mean more Brexit delays and further volatility for the UK market. Quite simply, these sort of events are impossible to predict.
So how do we manage our exposure in these situations? First of all, it does come down to your budget and affordability, if you are looking at exchange rates right now and think it’s the right price for you, then it is probably worth buying something at current rates so you have something locked in- maybe even look at a forward contract.
However, many of you may want to buy at a particular rate, i.e at 1.20 on GBPEUR, in which case you can set a “Limit Order” which will automatically purchase your amount at that rate if it hits, even if it is at 2am!. On the flip side, if it starts to drop, you can set a “Stop Loss” at a lower rate, i.e at 1.15 to ensure you don’t buy anywhere lower than that.
If you would like further information, or if you have a particular rate you are targetting please don’t hesitate to contact me this week for a consultation about your requirements so you are best positioned for the result of the election.
But before we look at that, it’s important to take a look at what happened in the 2017 Election.
As you can see, GBPEUR was comfortably trading at 1.20 when the election was announced- the market steadily dropped to 1.15 by the time election day came around due to opinion polls, and by the time the votes had been counted and a hung Parliament was announced, we were sitting at 1.13.
This is a drop of over 5% from the announcement to the result, which means that a transaction of 500,000 Euros would have cost £20,000 more to purchase if someone had waited until the election result.
Back to this election- right now it seems that opinion polls are favouring a Tory majority, which from an exchange rate perspective would mean at least 1.20 for GBPEUR and upwards of 1.30 for GBPUSD, which would be fantastic- however, at this point, how much can we trust opinion polls?
Many analysts still see a hung parliament this year, which would mean weakness for Sterling, as it would mean more Brexit delays and further volatility for the UK market. Quite simply, these sort of events are impossible to predict.
So how do we manage our exposure in these situations? First of all, it does come down to your budget and affordability, if you are looking at exchange rates right now and think it’s the right price for you, then it is probably worth buying something at current rates so you have something locked in- maybe even look at a forward contract.
However, many of you may want to buy at a particular rate, i.e at 1.20 on GBPEUR, in which case you can set a “Limit Order” which will automatically purchase your amount at that rate if it hits, even if it is at 2am!. On the flip side, if it starts to drop, you can set a “Stop Loss” at a lower rate, i.e at 1.15 to ensure you don’t buy anywhere lower than that.
If you would like further information, or if you have a particular rate you are targetting please don’t hesitate to contact me this week for a consultation about your requirements so you are best positioned for the result of the election.


Have you ever wondered when the best time to pick strawberries was or when you could buy the tastiest of peaches? Or how about when you could get the best price on a head of broccoli or a bell pepper?Many fruits and vegetables have seasonal windows when they are harvested and at their peak of flavor. There are though some vegetables and fruit that are in season any day of the year.
Remember that depending on the region and growing season that there are always slight variations to availability. Weather can also play a huge roll in crop abundance and price.


instruments package¶
Submodules¶
instruments.bronkhorst module¶
-
class
instruments.bronkhorst.
Bronkhorst
(port='/dev/ttyUSB0')[source]¶ Bases:
instruments.serial_instrument.SerialInstrument
Class to communicate with Bronkhorst mini-Cori flow meter.
Attributes: bronkhorst (propar.instrument): Bronkhorst interface.
instruments.serial_instrument module¶
Class to abstract serial instruments. The class maintains a set of current instrument values when possible to service requests rapidly. The method “_update_data” must be overloaded for each instrument based on the instrument manual. The serial instrument also provides a username and password such that the instrument can be acquired and secured for a user and provides detailed logging, thus aiding in GMP compliance.
-
get_PV - get present value from the instrument/sensor
-
get_SP - get the set point value from the instrument/sensor
-
set_SP - set the set point value for the instrument/sensor
-
class
instruments.serial_instrument.
SerialInstrument
(port='/dev/ttyUSB0')[source]¶ Bases:
object
Class to receive socket commands and send to serial device, and read serial device and send to socket. Class also maintains current user and password. Socket requests should be of form:
- {
“user”: user_name, “password”: password, “command”: {“name”: command_name, “parameters”: {dict_of_params}}
}


This small project represents my resume as an AngularJS app. Using, Grunt, NPM, and Yeoman, I scaffolded the basics of the app architecture. I employed SMACSS and BEM principles onto the styles. Furthermore, I integrated some cutting-edge CSS specs like initial letter and css grid. The entire site is responsive and looks great on mobile. Typography choices are Merriweather and Lato.