Clinics, Lectures, & Events In Cardiology
Upcoming Events
May 22, 2016
Desert Veterinary Conference
Palm Desert, CA
San Diego Veterinary Cardiology co-hosts the annual Desert Veterinary Conference organized by Desert Veterinary Specialists—participating for the 5th
consecutive year! This year, Dr. Huston presents to local veterinarians from the Coachella Valley and the Inland Empire at this all day conference -
the largest of its kind in the area.
May 23, 2016
Cardiac Auscultation & Echocardiography Health Clinic
Dr. Huston provides cardiac screenings to help improve the cardiac health of breeding dogs at the Orange Empire Dog Club. All-breeds welcome; members and non-members.
Location:
Orange Empire Dog Club Clubhouse
18225 Santa Ana Ave
Bloomington, California 92316
For registration or additional information, please contact the clinic organizer:
Cecelia Richardson
<EMAIL_ADDRESS>951-318-9197
Past Events
October 5, 2015
Cardiac Auscultation & Echocardiography Health Clinic
Dr. Huston provides cardiac screenings to help improve the cardiac health of breeding dogs at the Orange Empire Dog Club. All-breeds welcome; members and non-members.
Location:
Orange Empire Dog Club Clubhouse
18225 Santa Ana Ave
Bloomington, California 92316
For registration or additional information, please contact the clinic organizer:
Cecelia Richardson
<EMAIL_ADDRESS>951-318-9197
September 19, 2015
OFA Health Clinic—Auscultation and Echocardiogram by Board Certified Cardiologist Dr. Sharon Huston.
Sponsored by Temecula Kennel Club, Cocker Spaniel Club of SoCal, and Cocker Spaniel Club of SD
Location:
39375 Via Temprano, Murrieta CA 92563
For registration or additional information, please contact the clinic organizers:
Celyn Van Leeuwen
951-677-4000
<EMAIL_ADDRESS>Christine Robinson
<EMAIL_ADDRESS>June 24, 2015
"Distinguishing the Collapsing Cardiac Patient From All the Rest"
Dr. Hsu to lecture to San Diego Veterinarians at Continuing Education Seminar (RACE approved)
OFA Health Clinic—Auscultation and Echocardiogram by Board Certified Cardiologist
Sponsored by Temecula Kennel Club, Cocker Spaniel Club of SoCal, and Cocker Spaniel Club of SD
Location:
39375 Via Temprano, Murrieta CA 92563
For registration or additional information, please contact the clinic organizers:
Celyn Van Leeuwen
951-677-4000
<EMAIL_ADDRESS>Christine Robinson
<EMAIL_ADDRESS>May 17, 2015
Desert Veterinary Conference
Palm Desert, CA
San Diego Veterinary Cardiology co-hosts the annual Desert Veterinary
Conference organized by Desert Veterinary Specialists—participating for
the 4th consecutive year! This year, Dr. Hsu presents an audio-visual
cardiology lecture to local veterinarians from the Coachella Valley and
the Inland Empire at this all day conference - the largest of its kind
in the area.
May 4, 2015
Cardiac Auscultation & Echocardiography Clinic
Orange Empire Dog Club Clubhouse
18225 Santa Ana Ave
Bloomington, California 92316
Dr. Huston provides cardiac screenings to help improve the cardiac health of breeding dogs at the Orange Empire Dog Club.
March, 2015
SDCVMA Specialists Update, San Diego, CA
Dr. Hsu lectures to over 100 local San Diego veterinarians on the latest
developments in cardiology at the Specialists' Update Meeting
March 7, 2015
Cardiac Auscultation & Echocardiography Clinic
OFA Health Clinic sponsored by Temecula Kennel Club, Cocker Spaniel Club of SoCal, and Cocker Spaniel Club of SD
Dr. Huston provides cardiac screenings to help improve the cardiac health of breeding dogs.
May 18, 2014
Desert Veterinary Conference
Palm Desert, CA
Dr. Hsu and Dr. Huston speak to local veterinarians from the Coachella Valley and the Inland Empire at this all day conference - the largest of its kind in the area.
May 19, 2014
Cardiac Auscultation & Echocardiography Clinic
Orange Empire Dog Club
Dr. Huston provides cardiac screenings to help improve the cardiac health of breeding dogs at the Orange Empire Dog Club.
October 6, 2014
Cardiac Auscultation & Echocardiography Clinic
Orange Empire Dog Club
Dr. Huston provides cardiac screenings to help improve the cardiac health of breeding dogs at the Orange Empire Dog Club.
November 19, 2013
San Diego Veterinary Cardiology hosts Dr. Clarke Atkins (Cardiologist and Distinguished Professor Emeritus, North Carolina State University College of Veterinary Medicine) to speak to our San Diego referring veterinarians. Dr. Huston and Hsu hosted a lecture event regarding canine heart failure and a clinical trial involving new medical therapy.
November 13, 2013
Dr. Hsu lectures to San Diego veterinarians about San Diego Veterinary Cardiology's participation in a canine heart failure clinical trial.
October 7, 2013
Cardiac Auscultation & Echocardiography Clinic
Orange Empire Dog Club
Dr. Huston provides cardiac screenings to help improve the cardiac health of breeding dogs at the Orange Empire Dog Club.
May 19, 2013
Desert Veterinary Conference
Palm Desert, CA
Dr. Hsu and Dr. Huston speak to local veterinarians from the Coachella Valley and the Inland Empire at this all day conference--the largest of its kind in the area.
April 18 & 19, 2013
Cardiac Health Clinic, Los Angeles Fairplex, Pomona, CA
American Rottweiler Club National Specialty
Dr. Huston is an invited guest at the American Rottweiler Club National Show. She will provide cardiac health screening examinations
and echocardiograms to dogs.
March 3, 2013
SDCVMA Specialists Update, San Diego, CA
Dr. Hsu to lecture to over 100 local San Diego veterinarians on the latest developments in cardiology
at the Specialists' Update Meeting
Feb 5, 2013
ASPCA Guest Lecture, New York, New York
Dr. Huston is an invited guest speaker at the national headquarters of the ASPCA.
October 8, 2012
Orange Empire Dog Club
Club Clinic for Cardiac Health
May 20, 2012
Desert Veterinary Conference
Guest lecturer to over 130 veterinarians from the Coachella Valley and Inland Empire
"Practical Lessons in ECGs"
March 3, 2012
Del Sur Dog Club Clinic for Cardiac Health
May 15, 2011
Desert Veterinary Conference
Guest lecturer to over 130 veterinarians from the Coachella Valley and Inland Empire
"Important Topics in Feline Cardiology: Cardiomyopathy, Congestive Heart Failure, Hyperthyroidism, Thromboembolism"
May 23, 2011
Orange Empire Dog Club Cardiac Health Clinic
Bloomington, CA
May 15, 2011
Desert Veterinary Conference
Guest lecturer for the annual conference
April 6, 2011
Cardiac Auscultation & Echocardiography Clinic
The 2011 Bernese Mountain Dog Club of America National Specialty Show,
Del Mar Fairgrounds, Del Mar, CA
Jan 31, 2010
Cardiac Emergencies in Pets: Recognition and Treatment
San Diego, CA
April 4, 2009
Dr. Huston featured on SD News.com
(Photo slideshow)
Locations
VCA Emergency Animal Hospital & Referral Center
2317 Hotel Circle South
San Diego, CA 92108
Tel:<PHONE_NUMBER>
Fax:<PHONE_NUMBER>
Desert Veterinary Specialists
42-065 Washington Street, Suite D
Palm Desert, CA 92211-8024
Tel:<PHONE_NUMBER>
Fax:<PHONE_NUMBER>


Plum Village Mindfulness Bell(select a dwelling to hear the bell)
Dwelling
Approximate number of hearers


--- layout: default title: Overview ---
Domgen generates code from a simple domain model leaving the developer to focus on implementing high-value features of the application. The domain model is described using a domain specific language (DSL). Domgen then provides tasks that generate artifacts based on the domain model.
i.e. A developer may define a persistent entity in the DSL. A task could then be used to generate zero or more of the following artifacts from the domain model.
This enables the user to get on with developing the application, and avoid focusing on the minutae of how to persist an entity to the database until there is a need. When the developer needs to customize how an entity is realized in the generated artifacts, the developer can annotate the domain model to guide the domgen generators.
Domgen also allows the developer to define the service layer and application messaging.
In summary Domgen consists of; Model Elements that define the types of things that domgen models, Generators that control generate artifacts from the model elements and Facets that allow customization of the generation process. The generation process is typically integrated with Buildr. Start with the Getting Started guide.


For old browsers (IE8 and others), make sure to be in standard mode with <meta http-equiv="X-UA-Compatible" content="IE=EDGE"> and with a DOCTYPE.
<meta http-equiv="X-UA-Compatible" content="IE=EDGE">
Please select an Excel file from your computer:


Installs the official PostgreSQL container.
The persistent data is stored under /var/lib/postgresql/data in the VM.
/var/lib/postgresql/data
The password for the user ‘postgres’ can be extracted by running:
$ sudo docker inspect postgres | grep POSTGRES_PASSWORD


Toggle navigation
Devoxx UK LeadScan - Reports
Username
Password
Login
{{username}}
Sign-out
{{errorMessage}}
Statistics
Representatives
Leads
Welcome to Devoxx LeadScan Reports
Support :
sponsorscans@@devoxx.co.uk


Class SockClient
Provides unified type-safe access for Alpaca streaming API.
Inheritance
System.Object
SockClient
Implements
System.IDisposable
Inherited Members
System.Object.Equals(System.Object)
System.Object.Equals(System.Object, System.Object)
System.Object.GetHashCode()
System.Object.GetType()
System.Object.MemberwiseClone()
System.Object.ReferenceEquals(System.Object, System.Object)
System.Object.ToString()
Namespace: Alpaca.Markets
Assembly: Alpaca.Markets.dll
Syntax
[Obsolete("This class is deprecated and will be removed in the upcoming releases. Use the AlpacaStreamingClient class instead.", true)]
public sealed class SockClient : IDisposable
Constructors
| Improve this Doc View SourceSockClient(String, String, String, IWebSocketFactory)
Creates new instance of SockClient object.
Declaration
public SockClient(string keyId, string secretKey, string alpacaRestApi = null, IWebSocketFactory webSocketFactory = null)
Parameters
| Type | Name | Description |
|---|---|---|
| System.String | keyId | Application key identifier. |
| System.String | secretKey | Application secret key. |
| System.String | alpacaRestApi | Alpaca REST API endpoint URL. |
| IWebSocketFactory | webSocketFactory | Factory class for web socket wrapper creation. |
SockClient(String, String, Uri, IWebSocketFactory)
Creates new instance of SockClient object.
Declaration
public SockClient(string keyId, string secretKey, Uri alpacaRestApi, IWebSocketFactory webSocketFactory)
Parameters
| Type | Name | Description |
|---|---|---|
| System.String | keyId | Application key identifier. |
| System.String | secretKey | Application secret key. |
| System.Uri | alpacaRestApi | Alpaca REST API endpoint URL. |
| IWebSocketFactory | webSocketFactory | Factory class for web socket wrapper creation. |
Methods
| Improve this Doc View SourceDispose()
Declaration
public void Dispose()
Events
| Improve this Doc View SourceOnAccountUpdate
Occured when new account update received from stream.
Declaration
public event Action<IAccountUpdate> OnAccountUpdate
Event Type
| Type | Description |
|---|---|
| System.Action<IAccountUpdate> |
OnTradeUpdate
Occured when new trade update received from stream.
Declaration
public event Action<ITradeUpdate> OnTradeUpdate
Event Type
| Type | Description |
|---|---|
| System.Action<ITradeUpdate> |
Implements
System.IDisposable


Class TypeComponents
Class to identify the components of a type seperated by the scope operator, eg: Something::Someclass::Sometype. This class shouldn't be used by it self but with the help of the Symbols class.
Namespace: Peg\Lib\Definitions\Element
See: \Peg\Lib\Definitions\Symbols::GetComponents($type)
Located at src/Definitions/Element/TypeComponents.php
See: \Peg\Lib\Definitions\Symbols::GetComponents($type)
Located at src/Definitions/Element/TypeComponents.php
public
|
|
public
boolean
|
|
public
boolean
|
public
mixed
|
$namespace |
|
|
public
mixed
|
$class |
|
|
public
mixed
|
$type |
|


TECHNICAL SKILLS
Digital Hardware Designing using Verilog HDL and VHDL
Languages : C , HTML, CSS , JAVA
Worked on MATLAB, Pspice, Xilinx softwares
Continue to Resume >>


View Neon Logo Apps Youtube PNG. Its is very easy to make with the powerful. Need to quickly create a youtube logo?
We have 65 free youtube vector logos, logo templates and icons. Our site contains an array of logo ideas to help identify your channel to your followers. You can download in.ai,.eps,.cdr,.svg,.png formats.
Youtube google logo green logo neon neon lamp neon lighting signage.
Find & download the most popular youtube logo vectors on freepik free for commercial use high quality images made for creative projects. This png image was uploaded on november 26, 2016, 3:00 am by user: See more ideas about youtube logo, my talking tom, android apps. Designevo's free youtube logo maker helps you create a logo for your youtube channel easily and quickly.


| Fullname | Total Calls | Unique Calls | Total Answered Calls Number | AHT (in minutes) | Total Payable Calls | Total Payable Minutes(for Charge/Minute) | Total Payable Amount |
|---|---|---|---|---|---|---|---|
| {{element.publisher !== undefined ?element.publisher.fullname:'-NA-'}} | {{element.total_calls_length}} | {{element.unique_calls_length}} | {{element.answered_calls_length}} | {{(element.aht / element.total) | number:'1.0-0'}} | {{(element.settings.charge_per_minute)?'-NA-':element.payable_calls_length}} | {{(element.settings.charge_per_minute? (element.total_duration / 60) :0)| number:'1.0-0'}} | {{element.payable_amount}} |


{% load state_face %}
Will vote for {{ my_candidate }} in {{ match_state }}
in exchange for
Your vote for {{ match_candidate }} in {{ my_state }}.


WITNESS LIST
Oversight of Higher Ed Governance, Excellence & Transparency
September 21, 2011 10:00 AM
Panel One
ON:
McGuinness, PhD, Aims Senior Associate (also providing written testimony) (National
Center for Higher Education Management Systems (NCHEMS)), Boulder, CO
Novak, Richard Senior Vice President (also providing written testimony) (Association of
Governing Boards of Universities and Colleges (AGB)), Washington, DC
Poliakoff, PhD, Michael Vice President of Policy (also providing written testimony)
(American Council of Trustees and Alumni (ACTA)), Washington, DC
Rawlings, PhD, Hunter President (also providing written testimony) (Association of
American Universities (AAU)), Washington, DC
Panel Two
ON:
Heldenfels, Fred Chair (also providing written testimony) (Texas Higher Education
Coordinating Board (THECB)), Austin, TX
Paredes, PhD, Raymund Commissioner of Higher Education (also providing written
testimony) (Texas Higher Education Coordinating Board (THECB)), Austin, TX
Public testimony
Registering, but not testifying:
On:
Kimler, Keri Vice Chair (Texans for Stem Cell Research), Austin, TX
Public Testimony
ON:
Abitua, Angel Member (American for Prosperity), Austin, TX
Baskin, JJ Volunteer (also providing written testimony) (Coalition for Texas for
Excellence in Higher Education), Austin, TX
Bowen, Ray President Emeritus Texas A&M University (also providing written
testimony) (Self), Houston, TX
Burck, Dan Former University of Texas Chancellor (also providing written testimony)
(Self), Austin, TX
Butler, Natalie Student Body President, University of Texas at Austin (also providing
written testimony) (Self), Austin, TX
Desai, Yaman Legislative Affairs Chair (University of Texas at Austin Student
Government), Austin, TX
Griffin, Gerald Former Member of Texas Higher Education Coordinating Board (also
providing written testimony) (Self), Hunt, TX
Hagler, Jon (also providing written testimony) (Self), Dover, MA
Keck, Ray President (Texas A&M International University), Laredo, TX
Koons, Robert Professor of Philosophy (also providing written testimony) (Texas
Association of Scholars), Austin, TX
Long, Reid Vice President of External Affairs (Graduate Student Assembly at University
of Texas at Austin), Sulphur Springs, TX
Mallette, Cindy Grassroots Director (also providing written testimony) (Americans for
Prosperity Foundation), Austin, TX
1
WITNESS LIST
Oversight of Higher Ed Governance, Excellence & Transparency
September 21, 2011 10:00 AM
McDonald, Tony Senior Vice Chairman (Young Conservatives of Texas), Austin, TX
Perrin, Melinda Member (also providing written testimony) (Texas Coalition for
Excellence in Higher Education), Houston, TX
Trowbridge, Ronald Senior Fellow (Texas Public Policy Foundation), Austin, TX
Van Duyn, Emily Student (Self), Austin, TX
Venable, Peggy Texas Director (also providing written testimony) (Americans for
Prosperity Foundation), Austin, TX
Villasenor, Bernardino (Self), TX
Willeford, Pamela Former Member (also providing written testimony) (Texas Higher
Education Coordinating Board), Austin, TX
Wohlgemuth, Arlene Executive Director (also providing written testimony) (Texas Public
Policy Foundation), Austin, TX
Registering, but not testifying:
On:
Salinas, Mario (Texans for Stem Cell Research), Cedar Park, TX
2


Missions are not yet loaded. Please load the missions to continue. You will need to reload missions whenever you make a change to your Descent 3 missions directory.
Loading: {{data.loadingMissionPercent.toFixed(1)}}%
Teams (for game modes that support multiple teams):
Team 1 Name (Red):
Team 2 Name (Blue):
Team 3 Name (Green):
Team 4 Name (Yellow):
Powerup respawn time in seconds:
Audio taunt delay in seconds:
Kill message filter:
Maximum HUD name level:
Remoate administration password:
You must enter the name of the game.
You must enter a valid maximum number of players between 1 and 31.
You must enter a valid maximum packets per second between 1 and 20.
You must enter a valid score goal greater than 0, or leave it blank.
You must enter a valid time limit in minutes greater than 0, or leave it blank.
You must select a mission to play.
You must enter a valid respawn time greater than 0.
You must enter a valid audio taunt delay greater than 0.


that was what she said
congratulations to the winner of easy mode: @Shio and the runner up @episod3ux
though shio has given her stance that the previous poster before her shall become the winner in her stead, I believe credit should be given where it is due
with that, I shall open the next round
you should already know the drill by now
you can win this game by becoming the latest poster in this thread
but this is the hard mode:
only your first post in this thread count towards your victory!
(credit goes to @Arcturus for the idea)
welp, there goes my chance............
I will keep track of the champions so far, and how long they can hold that position
other than that, you are free to talk about anything here
be a good audience by giving your best cheers possible


Converse is a free and open-source XMPP chat client that runs in a web browser.
You can use it here, host it yourself, or integrate it into your own website. It's possible to connect to any publically accessible XMPP/Jabber server. Take a look at the demo page for other examples of how Converse can be configured and used.
No problem! With Converse you can register an account on any public XMPP server that allows in-band registration, including our own at conversejs.org.
Over 130 people have contributed features, bugfixes and translations, and many more have integrated it into their own websites or applications.
Come and chat with us at<EMAIL_ADDRESS>We'll put you into contact with developers
who can help you to integrate and customize Converse for your needs.
You can use the following contact form.
Please don't use the contact form for free support, use the other channels mentioned above.
Converse is a software commons, available at no cost to you or anyone else. Sponsorships allow us to fund further development and improvements. If you'd like to sponsor this project, please visit Patreon, Liberapay or contact us.
We provide free XMPP accounts under the domain conversejs.org. You can create an account directly through the app on this website or on inverse.chat.
If you're interested in professional XMPP hosting under your own domain name, please contact us.
This service is provided on a pro bono basis. An email address is not needed to sign up and we don't sell or monetize any of your data.
We don't share any of your data with 3rd parties, except when necessary to run the service. For example, when you send a message to a user on a differerent XMPP server. Your presence information (whether you're online or not) is shared with contacts that you've added from other servers.
Users on other XMPP servers can request access to your (optionally filled-in) VCard data. You can remove your VCard data through an XMPP client. The latest version of Converse supports this, and you can use it here.
Our XMPP server runs in a Hetzner data centre in Strasbourg, France.
Your chat messages are archived for a period of 1 month, after which they are deleted.
Currently the conversejs.org XMPP server does not support HTTP-file upload (although Converse the client does), which means that we don't host any uploaded files of users.
During normal operations we don't log or process IP addresses, although it might be necessary in certain cases where a problem needs to be debugged (hasn't happened yet). Logs older than 6 months are deleted.
Currently there is no standardized way to move a user account from one XMPP server to another.
If you'd like to have a copy of your data for transferal to another account, please contact us.
Currently it's not possible to automatically delete your account via Converse, although you might be able to do so via other XMPP clients that support account deletion via XEP-0077.
You can always contact us and we'll delete your account manually.


This tool creates a density map from point or line features by spreading known quantities of some phenomenon (represented as attributes of the points or lines) across the map. The result is a layer of areas classified from least dense to most dense.
For point input, each point should represent the location of some event or incident, and the result layer represents a count of the incident per unit area. A larger density value in a new location means that there are more points near that location. In many cases, the result layer can be interpreted as a risk surface for future events. For example, if the input points represent locations of lightning strikes, the result layer can be interpreted as a risk surface for future lightning strikes.
For line input, the line density surface represents the total amount of line that is near each location. The units of the calculated density values are the length of line-per-unit area. For example, if the lines represent rivers, the result layer will represent the total length of rivers that are within the search radius. This result can be used to identify areas that are hospitable to grazing animals.
Other use cases of this tool include the following:
The input point or line layer that will be used to calculate the density layer.
Provide a field specifying the number of incidents at each location. For example, if you have points that represent cities, you can use a field representing the population of the city as the count field, and the resulting population density layer will calculate larger population densities near cities with larger populations.
If the default choice of None is used, then each location will be assumed to represent a single count.
Enter a distance specifying how far to search to find point or line features when calculating density values. For example, if you provide a search distance of 10,000 meters, the density of any location in the output layer is calculated based on features that are within 10,000 meters of the location. Any location that does not have any incidents within 10,000 meters will receive a density value of zero.
If no distance is provided, a default will be calculated that is based on the locations of the input features and the values in the count field (if a count field is provided).
Specify the output area unit. Density is count divided by area, and this parameter specifies the unit of the area in the density calculation.
The available areal units are Square Miles, Square Feet, Square Meters, and Square Kilometers.
The cell size and unit for the output rasters.
The name of the layer that will be created in My Content and added to the map. The default name is based on the tool name and the input layer name. If the layer already exists, you will be prompted to provide another name.
You can specify the name of a folder in My Content where the result will be saved using the Save result in drop-down box.


{% extends "base.html" %} {% block content %}
We can scan online shops alert price drop
Just register to start scanning prices of your products


About Us
Our Story
Our model is designed to increase affordable access and education and our audience is everyone. Our community bike shops in Salt Lake City, Ogden, and Provo are staffed with professional mechanic instructors who are there to walk you through tune-ups or repairs with the idea that you’ll be a more regular and confident rider after learning how to patch the tube or adjust the brakes yourself. We carry a large selection of used bicycles that are overhauled by our mechanics and given a multi-point inspection so they’re ready to ride out the door. We also carry used and new parts and accessories to get your bike dialed in perfectly to fit your riding style and personal tastes.


Adjust contrast of RGB or grayscale images.
tf.compat.v1.image.adjust_contrast
tf.compat.v2.image.adjust_contrast
tf.image.adjust_contrast( images, contrast_factor )
This is a convenience method that converts RGB images to float representation, adjusts their contrast, and then converts them back to the original data type. If several adjustments are chained, it is advisable to minimize the number of redundant conversions.
images
is a tensor of at least 3 dimensions. The last 3 dimensions are
interpreted as [height, width, channels]
. The other dimensions only
represent a collection of images, such as [batch, height, width, channels].
Contrast is adjusted independently for each channel of each image.
For each channel, this Op computes the mean of the image pixels in the
channel and then adjusts each component x
of each pixel to
(x - mean) * contrast_factor + mean
.
images
: Images to adjust. At least 3-D.contrast_factor
: A float multiplier for adjusting contrast.The contrast-adjusted image or images.
import tensorflow as tf x = tf.random.normal(shape=(256, 256, 3)) tf.image.adjust_contrast(x,2)


|
| static void | DrawTiledTexture (Rect rect, Texture tex) |
| | Draws the tiled texture. More...
|
| |
| static void | DrawOutline (Rect rect) |
| | Draw a single-pixel outline around the specified rectangle. More...
|
| |
| static void | DrawOutline (Rect rect, Color color) |
| | Draw a single-pixel outline around the specified rectangle. More...
|
| |
| static void | DrawOutline (Rect rect, Rect relative, Color color) |
| | Draw a selection outline around the specified rectangle. More...
|
| |
| static void | DrawOutline (Rect rect, Rect relative) |
| | Draw a selection outline around the specified rectangle. More...
|
| |
| static void | DrawOutline (Rect rect, Rect outer, Rect inner) |
| | Draw a 9-sliced outline. More...
|
| |
| static Rect | DrawBackground (Texture2D tex, float ratio) |
| | Draw a checkered background for the specified texture. More...
|
| |
| static void | DrawSeparator () |
| | Draw a visible separator in addition to adding some padding. More...
|
| |
| static string | DrawList (string field, string[] list, string selection, params GUILayoutOption[] options) |
| | Convenience function that displays a list of sprites and returns the selected value. More...
|
| |
| static string | DrawAdvancedList (string field, string[] list, string selection, params GUILayoutOption[] options) |
| | Convenience function that displays a list of sprites and returns the selected value. More...
|
| |
| static GameObject | SelectedRoot () |
| | Helper function that returns the selected root object. More...
|
| |
| static GameObject | SelectedRoot (bool createIfMissing) |
| | Helper function that returns the selected root object. More...
|
| |
| static bool | WillLosePrefab (GameObject root) |
| | Helper function that checks to see if this action would break the prefab connection. More...
|
| |
| static bool | MakeTextureReadable (string path, bool force) |
| | Change the import settings of the specified texture asset, making it readable. More...
|
| |
| static Texture2D | ImportTexture (string path, bool forInput, bool force, bool alphaTransparency) |
| | Fix the import settings for the specified texture, re-importing it if necessary. More...
|
| |
| static Texture2D | ImportTexture (Texture tex, bool forInput, bool force, bool alphaTransparency) |
| | Fix the import settings for the specified texture, re-importing it if necessary. More...
|
| |
| static string | GetSaveableTexturePath (UIAtlas atlas) |
| | Figures out the saveable filename for the texture of the specified atlas. More...
|
| |
| static string | GetSelectionFolder () |
| | Helper function that returns the folder where the current selection resides. More...
|
| |
| static IntVector | IntPair (string prefix, string leftCaption, string rightCaption, int x, int y) |
| | Integer vector field. More...
|
| |
| static Rect | IntRect (string prefix, Rect rect) |
| | Integer rectangle field. More...
|
| |
| static Vector4 | IntPadding (string prefix, Vector4 v) |
| | Integer vector field. More...
|
| |
| static List< T > | FindAll< T > () |
| | Find all scene components, active or inactive. More...
|
| |
| static bool | DrawPrefixButton (string text) |
| |
| static bool | DrawPrefixButton (string text, params GUILayoutOption[] options) |
| |
| static int | DrawPrefixList (int index, string[] list, params GUILayoutOption[] options) |
| |
| static int | DrawPrefixList (string text, int index, string[] list, params GUILayoutOption[] options) |
| |
| static void | DrawSprite (Texture2D tex, Rect rect, UISpriteData sprite, Color color) |
| | Draw a sprite preview. More...
|
| |
| static void | DrawSprite (Texture2D tex, Rect drawRect, UISpriteData sprite, Color color, Material mat) |
| | Draw a sprite preview. More...
|
| |
| static void | DrawSprite (Texture2D tex, Rect drawRect, Color color, Rect textureRect, Vector4 border) |
| | Draw a sprite preview. More...
|
| |
| static void | DrawSprite (Texture2D tex, Rect drawRect, Color color, Material mat, int x, int y, int width, int height, int borderLeft, int borderBottom, int borderRight, int borderTop) |
| | Draw a sprite preview. More...
|
| |
| static void | DrawTexture (Texture2D tex, Rect rect, Rect uv, Color color) |
| | Draw the specified sprite. More...
|
| |
| static void | DrawTexture (Texture2D tex, Rect rect, Rect uv, Color color, Material mat) |
| | Draw the specified sprite. More...
|
| |
| static void | DrawSpriteField (string label, UIAtlas atlas, string spriteName, SpriteSelector.Callback callback, params GUILayoutOption[] options) |
| | Draw a sprite selection field. More...
|
| |
| static void | DrawPaddedSpriteField (string label, UIAtlas atlas, string spriteName, SpriteSelector.Callback callback, params GUILayoutOption[] options) |
| | Draw a sprite selection field. More...
|
| |
| static void | DrawSpriteField (string label, string caption, UIAtlas atlas, string spriteName, SpriteSelector.Callback callback, params GUILayoutOption[] options) |
| | Draw a sprite selection field. More...
|
| |
| static bool | DrawSpriteField (UIAtlas atlas, string spriteName, SpriteSelector.Callback callback, params GUILayoutOption[] options) |
| | Draw a simple sprite selection button. More...
|
| |
| static void | DrawSpriteField (string label, SerializedObject ob, string spriteField, params GUILayoutOption[] options) |
| | Draw a sprite selection field. More...
|
| |
| static void | DrawSpriteField (string label, SerializedObject ob, SerializedProperty atlas, SerializedProperty sprite, params GUILayoutOption[] options) |
| | Draw a sprite selection field. More...
|
| |
| static void | DrawSpriteField (string label, SerializedObject ob, SerializedProperty atlas, SerializedProperty sprite, bool removable, params GUILayoutOption[] options) |
| | Draw a sprite selection field. More...
|
| |
| static void | DrawSpriteField (string label, SerializedObject ob, SerializedProperty atlas, SerializedProperty sprite, float width, bool padded, bool removable, params GUILayoutOption[] options) |
| | Draw a sprite selection field. More...
|
| |
| static void | DrawAdvancedSpriteField (UIAtlas atlas, string spriteName, SpriteSelector.Callback callback, bool editable, params GUILayoutOption[] options) |
| | Convenience function that displays a list of sprites and returns the selected value. More...
|
| |
| static void | RepaintSprites () |
| | Repaints all inspector windows related to sprite drawing. More...
|
| |
| static void | SelectSprite (string spriteName) |
| | Select the specified sprite within the currently selected atlas. More...
|
| |
| static void | SelectSprite (UIAtlas atlas, string spriteName) |
| | Select the specified atlas and sprite. More...
|
| |
| static void | Select (GameObject go) |
| | Select the specified game object and remember what was selected before. More...
|
| |
| static void | SelectPrevious () |
| | Select the previous game object. More...
|
| |
| static bool | IsUniform (Vector3 scale) |
| | Helper function that checks to see if the scale is uniform. More...
|
| |
| static bool | IsUniform (GameObject go) |
| | Check to see if the specified game object has a uniform scale. More...
|
| |
| static void | FixUniform (GameObject go) |
| | Fix uniform scaling of the specified object. More...
|
| |
| static bool | DrawMinimalisticHeader (string text) |
| | Draw a distinctly different looking header label More...
|
| |
| static bool | DrawHeader (string text) |
| | Draw a distinctly different looking header label More...
|
| |
| static bool | DrawHeader (string text, string key) |
| | Draw a distinctly different looking header label More...
|
| |
| static bool | DrawHeader (string text, bool detailed) |
| | Draw a distinctly different looking header label More...
|
| |
| static bool | DrawHeader (string text, string key, bool forceOn, bool minimalistic) |
| | Draw a distinctly different looking header label More...
|
| |
| static void | BeginContents () |
| | Begin drawing the content area. More...
|
| |
| static void | BeginContents (bool minimalistic) |
| | Begin drawing the content area. More...
|
| |
| static void | EndContents () |
| | End drawing the content area. More...
|
| |
| static void | DrawEvents (string text, Object undoObject, List< EventDelegate > list) |
| | Draw a list of fields for the specified list of delegates. More...
|
| |
| static void | DrawEvents (string text, Object undoObject, List< EventDelegate > list, bool minimalistic) |
| | Draw a list of fields for the specified list of delegates. More...
|
| |
| static void | DrawEvents (string text, Object undoObject, List< EventDelegate > list, string noTarget, string notValid, bool minimalistic) |
| | Draw a list of fields for the specified list of delegates. More...
|
| |
| static SerializedProperty | DrawProperty (SerializedObject serializedObject, string property, params GUILayoutOption[] options) |
| | Helper function that draws a serialized property. More...
|
| |
| static SerializedProperty | DrawProperty (string label, SerializedObject serializedObject, string property, params GUILayoutOption[] options) |
| | Helper function that draws a serialized property. More...
|
| |
| static SerializedProperty | DrawPaddedProperty (SerializedObject serializedObject, string property, params GUILayoutOption[] options) |
| | Helper function that draws a serialized property. More...
|
| |
| static SerializedProperty | DrawPaddedProperty (string label, SerializedObject serializedObject, string property, params GUILayoutOption[] options) |
| | Helper function that draws a serialized property. More...
|
| |
| static SerializedProperty | DrawProperty (string label, SerializedObject serializedObject, string property, bool padding, params GUILayoutOption[] options) |
| | Helper function that draws a serialized property. More...
|
| |
| static void | DrawProperty (string label, SerializedProperty sp, params GUILayoutOption[] options) |
| | Helper function that draws a serialized property. More...
|
| |
| static void | DrawProperty (string label, SerializedProperty sp, bool padding, params GUILayoutOption[] options) |
| | Helper function that draws a serialized property. More...
|
| |
| static void | DrawBorderProperty (string name, SerializedObject serializedObject, string field) |
| | Helper function that draws a compact Vector4. More...
|
| |
| static void | DrawRectProperty (string name, SerializedObject serializedObject, string field) |
| | Helper function that draws a compact Rect. More...
|
| |
| static void | DrawRectProperty (string name, SerializedObject serializedObject, string field, float labelWidth, float spacing) |
| | Helper function that draws a compact Rect. More...
|
| |
| static float | SceneViewDistanceToRectangle (Vector3[] worldPoints, Vector2 mousePos) |
| | Determine the distance from the mouse position to the world rectangle specified by the 4 points. More...
|
| |
| static List< UIWidget > | SceneViewRaycast (Vector2 mousePos) |
| | Raycast into the specified panel, returning a list of widgets. More...
|
| |
| static bool | SelectWidget (Vector2 pos) |
| | Select the topmost widget underneath the specified screen coordinate. More...
|
| |
| static bool | SelectWidget (GameObject start, Vector2 pos, bool inFront) |
| | Select the next widget in line. More...
|
| |
| static void | SetLabelWidth (float width) |
| | Unity 4.3 changed the way LookLikeControls works. More...
|
| |
| static void | RegisterUndo (string name, params Object[] objects) |
| | Create an undo point for the specified objects. More...
|
| |
| static void | HideMoveTool (bool hide) |
| | Unity 4.5+ makes it possible to hide the move tool. More...
|
| |
| static int | GetClassID (System.Type type) |
| | Gets the internal class ID of the specified type. More...
|
| |
| static int | GetClassID< T > () |
| | Gets the internal class ID of the specified type. More...
|
| |
| static SerializedObject | ReplaceClass (MonoBehaviour mb, System.Type type) |
| | Convenience function that replaces the specified MonoBehaviour with one of specified type. More...
|
| |
| static SerializedObject | ReplaceClass (MonoBehaviour mb, int classID) |
| | Convenience function that replaces the specified MonoBehaviour with one of specified class ID. More...
|
| |
| static void | ReplaceClass (SerializedObject ob, int classID) |
| | Convenience function that replaces the specified MonoBehaviour with one of specified class ID. More...
|
| |
| static void | ReplaceClass (SerializedObject ob, System.Type type) |
| | Convenience function that replaces the specified MonoBehaviour with one of specified class ID. More...
|
| |
| static T | ReplaceClass< T > (MonoBehaviour mb) |
| | Convenience function that replaces the specified MonoBehaviour with one of specified type. More...
|
| |
| static void | UpgradeTexturesToSprites (UIAtlas atlas) |
| | Automatically upgrade all of the UITextures in the scene to Sprites if they can be found within the specified atlas. More...
|
| |
| static void | ShowSpriteSelectionMenu (Vector2 screenPos) |
| | Show a sprite selection context menu listing all sprites under the specified screen position. More...
|
| |
| static Object | LoadAsset (string path) |
| | Load the asset at the specified path. More...
|
| |
| static T | LoadAsset< T > (string path) |
| | Convenience function to load an asset of specified type, given the full path to it. More...
|
| |
| static string | ObjectToGUID (Object obj) |
| | Get the specified object's GUID. More...
|
| |
| static Object | GUIDToObject (string guid) |
| | Convert the specified GUID to an object reference. More...
|
| |
| static T | GUIDToObject< T > (string guid) |
| | Convert the specified GUID to an object reference of specified type. More...
|
| |
| static Color32[] | AddBorder (Color32[] colors, int width, int height) |
| | Add a border around the specified color buffer with the width and height of a single pixel all around. More...
|
| |
| static void | AddShadow (Color32[] colors, int width, int height, Color shadow) |
| | Add a soft shadow to the specified color buffer. More...
|
| |
| static void | AddDepth (Color32[] colors, int width, int height, Color shadow) |
| | Add a visual depth effect to the specified color buffer. More...
|
| |
| static void | DrawPadding () |
| | Draw 18 pixel padding on the right-hand side. More...
|
| |


directive for the letter avatar for the given string like gmail, first letter of the given data will be the avatar
Download
bower install ng-timeago
var app = angular.module('myApp', ['ngTimeago']);`


Formed of well kneaded native earth
Like everyone else
That forms thousands of great men
Thousands of pretty women
Millenia's civilised grace
So well kneaded and formed
Great Gautama Buddha. fair Mira Bai
and Jamil Naqsh,
Formed of well kneaded earth
To return to the same old earth
Others of the kind to be born to confirm my being.
Jamil Naqsh 1997
Born in Kairana UP, India, in 1939. The town is renowned the world over for its musicians of the classical Kairana. Jamil Naqsh's father, a zamindar, wrote books on topics including tib and nafsiyat and illustrated his works in miniature style.
Artists, writers, poets, musicians, zamindars and politicians often gathered in his ancestral home and poetry, music, painting were a way of life.
This stimulating environment left an indelible mark on the mind of the young Jamil Naqsh, and encouraged him to paint. Got early art education 1953-1954 from Mayo school of arts Lahore, now NCA under the tutelage of miniature painter Ustad Shariff.
Jamil Naqsh is both a modern expressionist and a traditional miniaturist.
Artist presently work & lives in London


Services
BUILDING INSPECTION
Building inspections require training, general construction knowledge and special communication skills
that
are
substantially different from those required of other building professionals.
We are generalists with an extensive knowledge of the important elements and systems of a building.
-   Residential, multi-housing and commercial
-   Written report with digital photos
-   Professional liability insurance (errors and omissions)
PRE-PURCHASE INSPECTION
The pre-purchase inspection, aims to buy knowingly and to negotiate well-equipped! It allows you to plan the repairs required if the purchase is made. This inspection identifies visually apparent irregularities arising from normal degradation or construction defects. It includes a comprehensive written report describing the condition of the principal components of the property at the time of the transaction.
- To buy in full knowledge of the facts.
- To negotiate well-equipped.
- To plan improvements.
PREVENTION INSPECTION
Pre-sales inspection identifies apparent anomalies arising from degradation or construction defects. Here, however, the inspection report recommends certain repairs to be carried out before the sale, in order to better position you on the market. A tool for your transaction... and even for your buyer. The Civil Code of Québec requires the owner to guarantee the quality of the property sold.
- To identify anomalies.
- For repairs to be performed.
- To sell well equipped.
INSPECTION DURING CONSTRUCTION
The inspection during construction permits to check the work in progress of a new construction. It includes a visual inspection of all components of the building and a detailed written report setting out the work already completed. The purpose of this inspection is to verify that construction is in accordance with good engineering practice and to identify problems, if any.
- To check the quality of the work in progress.
- To identify problems.
- To reduce the risk of construction defects.
PRE-ACCEPTANCE INSPECTION
Pre-acceptance inspection identifies the list of work to be corrected and completed according to construction standards when a building is delivered by the general contractor and completes the form for the warranty plan. It includes a visual check of all building components and a detailed written report with photographs.
- To identify construction defects during delivery or within the notice of completion of work.
- To fill out the form for the receipt of the guarantee plan.
SPECIFIC AND LEGAL EXPERTISE
This service is offered for all requests concerning a specific problem to be appraised and checked on a building or advice for new construction works and / or renovations. Visual inspection and testing with instruments to support our diagnostics (eg infrared thermal imaging camera, hygrometer, etc.) can be performed during the performance of this service.
- To make a diagnosis and identify the causes of a problem affecting the building (ex: water or moisture infiltrations, cracks, deformations, ice formations and condensation, etc.).
- To perform a legal expertise in hidden vice.
- To reduce the risk of construction defects.
PREVENTIVE INSPECTION
Preventive inspection allows you to identify and plan the work required at your residence. It includes a visual verification of all the components of the property and a detailed written report setting out the solutions to be prioritized in the short and medium term.
- To check the condition of a particular item.
- To identify the cause of the problem.
- To plan the work to be done in the short, medium and long term.
PLANS AND SPECIFICATIONS
Our training in architecture technology and public works as well as our experience on site and expertise of pathologies of the building makes it possible to produce plans and specifications for your projects of new constructions or renovations.
- Design the construction or renovation of the building.
- Obtain a building permit and tenders to determine project costs.
As a provider of building inspection services and design for the realization of your construction projects, you can count on our expertise in the field for your needs.


The city lights went out.
It was time for the city to wake up and the sun to caress the land.
Luisa hadn't slept. She saw the lights go on, the cars go by, a homeless man sleeping
and the lights going out.
She spent the night at the window, waiting for her father to arrive.
He had promised to come to her birthday, but the day passed, her father didn't say anything
and Luisa was already 5 years old and one day.
It didn't take to long before little Luisa fall asleep at the window, the
tiredness and the sleepless night had robbed her strength.
The mother put her to bed, she hadn't slept either.
The husband didn't call, his flight never reached the airport
and no survivors have yet been found.
Tears were falling down her face, when she saw her daughter so desperate to see her father face ...
how would she break the news if the worst had happened? How were they going to survive?
The phone rang, and the voice on the other side, short and cold, spoke the words
that no one expects to hear:
- "Good morning, is it Mrs. Ines Silva, Mr. Carlos Silva's wife?" - Yes, it is.
- "There is no good way to say this but ...
we need you to go to the Institute of Forensic Medicine to proceed to the recognition of a body.
I know this is not the best time but I need you to provide me with some information.
Your husband was on the list of the passengers, but he never..."
She didn't listen the last words. She couldn't hear anything more,
tears blinded her and those words echoed in her head.
Little Luisa woke up to the sound of the phone, had her father called?
-"Mother? Mother? What's wrong? When father arrives? Who was on the phone?"
Ines grabbed her daughter in her arms, she couldn't speak, she couldn't think.
-"Mom! Mom! You're hurting me! Why are you crying? Mom! Mom! Stop mom! I can't breathe!
What's happening? Mom! Mom! M ..."
Overwhelmed by despair, Ines did not react to her daughter's words.
-"Daughter, it's your fault, if your father didn't come on that plane ...
if he didn't come for your birthday ...
sorry, but it's your fault, I lost your father because of you!"
Little Luisa didn't struggle anymore. She fell on the ground, her little heart stopped without
understanding what had happened ...
The gun was in the usual place, loaded, but now with one less bullet.
The sound was heard by the neighborhood but whoever was in the car didn't ear anything.
He rang the bell, wanted to surprise his daughter.
He had bought the bicycle she wanted so much as an apologize for being late on her birthday,
he missed the flight, but she would forgive him.
After all, she was Daddy's little girl.
Phrases that remained unfinished.
Stories that have yet to be told.
Unfinished words, lost feelings, stopped actions.
Was it worth something? No.
Will I change? Not either, but give up, never! (...)
All paths lead to an uncertain space.
Seeing beyond what we deserve, doesn't make us go any further,
it only allows us to delude with something that doesn't exist.
So I walk on what I see. Because what I see I feel, and I know it is real.
Tomorrow I may not see the same path and feel the same feeling, but I know it existed.
And that's enough for now.
Everything has an explanation.
Rationality is not a given,
it is something that is acquired through experience.
There are no reasons.
There are no reasons and there never will be!
There are no words that say no stronger than feeling,
There are no feelings that live longer than being,
There are no beings capable of loving without knowing how to live,
There is nothing if there is no whole,
and there will be no strength to continue if there is no reason to prevail.
Prevail strong and unchanging,
Remain real and touchable,
but if there are no reasons, writing was in vain.
Everything was in vain ...
And I will go back in time,
and I will ask for forgiveness for not having grasped my reasons.
I will ask for forgiveness and forget.
Because living without a reason was in vain. (...)


Chicken Empanda Filling
I’ve taken the liberty of modifying the recipe slightly, since we don’t usually have achiote or balsalmic vinegar. I replaced the former with some paprika and pepper (the Internet said that was okay) and the latter with some red or cider vinegar with sugar.
If you need to cook shredded chicken relatively quickly:
- Heat a pan to medium-high heat.
- Drizzle about 1-2 teaspoons of olive oil into the pan.
- Apply salt and pepper to two chicken breasts, then sear on both sides (about 3-5 minutes per side)
- Add about 1 cup chicken broth, reduce heat, and cover. Add more chicken broth if necessary, and let cook for 10-15 minutes, until the breasts reach at least 165˚F.
- Shred chicken breasts and use for the recipe.
- Save the broth in the pan to mix with butter later instead of the gravy.
For a dipping sauce, checkout Layla’s Quick chimichurri sauce.
Yields: 4-6
Preparation time: 45
Cooking time: 15
Ingredients
-
12-15 medium sized empanadas discs, using homemade dough or store-bought empanada discs. Alternative, use this pretzel dough recipe which is pictured above, and is awesome.2 tbs butter1/2 white onion, sliced thinly1/2 bell pepper, sliced thinly4 garlic cloves, crushed2 tomatoes, diced1 tsp paprika1/2 tsp ground pepper1 tsp ground cumin2 cups shredded turkey or chicken2 tbs turkey gravy – you can replace this with a combination of broth and butter2 tbs balsamic vinegar (or 2tbs of red or cider vinegar and 2 tsp of white sugar mixed)1/2 tbs fresh oregano – can be replaced with 1 tsp dried oreganoSalt to taste1 egg, yolk and white separated
Directions
-
Melt the butter in a medium size frying pan.Add the onions, tomatoes, bell pepper, garlic, paprika, pepper, and cumin.Cook for 10 minutes over medium low heat, stirring occasionally.Mix in the shredded chicken turkey and stir well.Add the gravy (or equivalent amount of broth and butter) and vinegarContinue cooking over low heat for another 5 minutes.Let the turkey filling cool down, and then add in the chopped oregano.To assemble the empanadas spoon the turkey mixture on to the center of the each empanada disc.If needed, brush the edges of the empanada discs with the egg whites, you can also use water but the egg white acts as a natural “glue” that helps seal the empanada.Fold the empanada disc and seal the edges gently with your fingers, twist and fold the edges of the empanadas with your fingers. To seal the edges further you can use a fork to press down and finish sealing the empanadas (or if you’re lazy like me, just use a fork to seal the whole thing).Let the empanadas rest in the refrigerator for at least 30 minutes or until ready to bake, this will help them seal better and prevent leaks.Lightly brush the top of the empanadas with the egg yolk; this will give them a nice golden glow when they bake.Pre-heat the oven to 400 F and bake for 20-25 minutes or until golden, exact time will depend on the size of the empanadas, the dough used, and your oven. If there are conflicts in instructions here and with the dough recipe, follow the dough instructions.Serve warm.
Category: Entree
Cuisine: South american


THE FRESHEST LOCALLY-GROWN INGREDIENTS AND HANDCRAFTED CRUST
Pizzeria Artisan Pizza has created a menu featuring local ingredients, precisely cooked and brought together on the plate to create a lasting impression so you keep coming back for more.
Pizzeria Pizza sizes
Pizzeria Tasty Crusts
| Size | Crust | Toppings | Price |
|---|
The total charge is 0/=


2013
March, 2014
2015
Sun
Mon
Tue
Wed
Thur
Fri
Sat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
See planned events
Set reminder
Events
Hicking with Hank
MUM`s Birthday
UI/UX meeting
Edit


Cluster Usage
For introduction to the Akka Cluster concepts please see Cluster Specification.
Preparing Your Project for Clustering
The Akka cluster is a separate jar file. Make sure that you have the following dependency in your project:
"com.typesafe.akka" %% "akka-cluster" % "2.4.11"
A Simple Cluster Example
The following configuration enables the Cluster extension to be used. It joins the cluster and an actor subscribes to cluster membership events and logs them.
The application.conf configuration looks like this:
akka {
actor {
provider = cluster
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "<IP_ADDRESS>"
port = 0
}
}
cluster {
seed-nodes = [
"akka.tcp://ClusterSystem@<IP_ADDRESS>:2551",
"akka.tcp://ClusterSystem@<IP_ADDRESS>:2552"]
# auto downing is NOT safe for production deployments.
# you may want to use it during development, read more about it in the docs.
#
# auto-down-unreachable-after = 10s
}
}
# Disable legacy metrics in akka-cluster.
akka.cluster.metrics.enabled=off
# Enable metrics extension in akka-cluster-metrics.
akka.extensions=["akka.cluster.metrics.ClusterMetricsExtension"]
# Sigar native library extract location during tests.
# Note: use per-jvm-instance folder when running multiple jvm on one host.
akka.cluster.metrics.native-library-extract-folder=${user.dir}/target/native
To enable cluster capabilities in your Akka project you should, at a minimum, add the Remoting settings, but with cluster. The akka.cluster.seed-nodes should normally also be added to your application.conf file.
Note
If you are running Akka in a Docker container or the nodes for some other reason have separate internal and external ip addresses you must configure remoting according to Akka behind NAT or in a Docker container
The seed nodes are configured contact points for initial, automatic, join of the cluster.
Note that if you are going to start the nodes on different machines you need to specify the ip-addresses or host names of the machines in application.conf instead of <IP_ADDRESS>
An actor that uses the cluster extension may look like this:
package sample.cluster.simple
import akka.cluster.Cluster
import akka.cluster.ClusterEvent._
import akka.actor.ActorLogging
import akka.actor.Actor
class SimpleClusterListener extends Actor with ActorLogging {
val cluster = Cluster(context.system)
// subscribe to cluster changes, re-subscribe when restart
override def preStart(): Unit = {
//#subscribe
cluster.subscribe(self, initialStateMode = InitialStateAsEvents,
classOf[MemberEvent], classOf[UnreachableMember])
//#subscribe
}
override def postStop(): Unit = cluster.unsubscribe(self)
def receive = {
case MemberUp(member) =>
log.info("Member is Up: {}", member.address)
case UnreachableMember(member) =>
log.info("Member detected as unreachable: {}", member)
case MemberRemoved(member, previousStatus) =>
log.info("Member is Removed: {} after {}",
member.address, previousStatus)
case _: MemberEvent => // ignore
}
}
The actor registers itself as subscriber of certain cluster events. It receives events corresponding to the current state of the cluster when the subscription starts and then it receives events for changes that happen in the cluster.
The easiest way to run this example yourself is to download Lightbend Activator and open the tutorial named Akka Cluster Samples with Scala. It contains instructions of how to run the SimpleClusterApp.
Joining to Seed Nodes
You may decide if joining to the cluster should be done manually or automatically to configured initial contact points, so-called seed nodes. When a new node is started it sends a message to all seed nodes and then sends join command to the one that answers first. If no one of the seed nodes replied (might not be started yet) it retries this procedure until successful or shutdown.
You define the seed nodes in the Configuration file (application.conf):
akka.cluster.seed-nodes = [
"akka.tcp://ClusterSystem@host1:2552",
"akka.tcp://ClusterSystem@host2:2552"]
This can also be defined as Java system properties when starting the JVM using the following syntax:
-Dakka.cluster.seed-nodes.0=akka.tcp://ClusterSystem@host1:2552
-Dakka.cluster.seed-nodes.1=akka.tcp://ClusterSystem@host2:2552
The seed nodes can be started in any order and it is not necessary to have all seed nodes running, but the node configured as the first element in the seed-nodes configuration list must be started when initially starting a cluster, otherwise the other seed-nodes will not become initialized and no other node can join the cluster. The reason for the special first seed node is to avoid forming separated islands when starting from an empty cluster. It is quickest to start all configured seed nodes at the same time (order doesn't matter), otherwise it can take up to the configured seed-node-timeout until the nodes can join.
Once more than two seed nodes have been started it is no problem to shut down the first seed node. If the first seed node is restarted, it will first try to join the other seed nodes in the existing cluster.
If you don't configure seed nodes you need to join the cluster programmatically or manually.
Manual joining can be performed by using ref:cluster_jmx_scala or Command Line Management. Joining programmatically can be performed with Cluster(system).join. Unsuccessful join attempts are automatically retried after the time period defined in configuration property retry-unsuccessful-join-after. Retries can be disabled by setting the property to off.
You can join to any node in the cluster. It does not have to be configured as a seed node. Note that you can only join to an existing cluster member, which means that for bootstrapping some node must join itself,and then the following nodes could join them to make up a cluster.
You may also use Cluster(system).joinSeedNodes to join programmatically, which is attractive when dynamically discovering other nodes at startup by using some external tool or API. When using joinSeedNodes you should not include the node itself except for the node that is supposed to be the first seed node, and that should be placed first in parameter to joinSeedNodes.
Unsuccessful attempts to contact seed nodes are automatically retried after the time period defined in configuration property seed-node-timeout. Unsuccessful attempt to join a specific seed node is automatically retried after the configured retry-unsuccessful-join-after. Retrying means that it tries to contact all seed nodes and then joins the node that answers first. The first node in the list of seed nodes will join itself if it cannot contact any of the other seed nodes within the configured seed-node-timeout.
An actor system can only join a cluster once. Additional attempts will be ignored. When it has successfully joined it must be restarted to be able to join another cluster or to join the same cluster again.It can use the same host name and port after the restart, when it come up as new incarnation of existing member in the cluster, trying to join in, then the existing one will be removed from the cluster and then it will be allowed to join.
Note
The name of the ActorSystem must be the same for all members of a cluster. The name is given when you start the ActorSystem.
Downing
When a member is considered by the failure detector to be unreachable the leader is not allowed to perform its duties, such as changing status of new joining members to 'Up'. The node must first become reachable again, or the status of the unreachable member must be changed to 'Down'. Changing status to 'Down' can be performed automatically or manually. By default it must be done manually, using JMX or Command Line Management.
It can also be performed programmatically with Cluster(system).down(address).
A pre-packaged solution for the downing problem is provided by Split Brain Resolver, which is part of the Lightbend Reactive Platform. If you don’t use RP, you should anyway carefully read the documentation of the Split Brain Resolver and make sure that the solution you are using handles the concerns described there.
Auto-downing (DO NOT USE)
There is an atomatic downing feature that you should not use in production. For testing purpose you can enable it with configuration:
akka.cluster.auto-down-unreachable-after = 120s
This means that the cluster leader member will change the unreachable node status to down automatically after the configured time of unreachability.
This is a naïve approach to remove unreachable nodes from the cluster membership. It works great for crashes and short transient network partitions, but not for long network partitions. Both sides of the network partition will see the other side as unreachable and after a while remove it from its cluster membership. Since this happens on both sides the result is that two separate disconnected clusters have been created. This can also happen because of long GC pauses or system overload.
Warning
We recommend against using the auto-down feature of Akka Cluster in production. This is crucial for correct behavior if you use Cluster Singleton or Cluster Sharding, especially together with Akka Persistence. For Akka Persistence with Cluster Sharding it can result in corrupt data in case of network partitions.
Leaving
There are two ways to remove a member from the cluster.
You can just stop the actor system (or the JVM process). It will be detected as unreachable and removed after the automatic or manual downing as described above.
A more graceful exit can be performed if you tell the cluster that a node shall leave. This can be performed using JMX or Command Line Management. It can also be performed programmatically with:
val cluster = Cluster(system)
cluster.leave(cluster.selfAddress)
Note that this command can be issued to any member in the cluster, not necessarily the one that is leaving. The cluster extension, but not the actor system or JVM, of the leaving member will be shutdown after the leader has changed status of the member to Exiting. Thereafter the member will be removed from the cluster. Normally this is handled automatically, but in case of network failures during this process it might still be necessary to set the node’s status to Down in order to complete the removal.
WeaklyUp Members
If a node is unreachable then gossip convergence is not possible and therefore any leader actions are also not possible. However, we still might want new nodes to join the cluster in this scenario.
Warning
The WeaklyUp feature is marked as “experimental” as of its introduction in Akka 2.4.0. We will continue to improve this feature based on our users’ feedback, which implies that while we try to keep incompatible changes to a minimum the binary compatibility guarantee for maintenance releases does not apply this feature.
This feature is disabled by default. With a configuration option you can allow this behavior:
akka.cluster.allow-weakly-up-members = on
When allow-weakly-up-members is enabled and there is no gossip convergence, Joining members will be promoted to WeaklyUp and they will become part of the cluster. Once gossip convergence is reached, the leader will move WeaklyUp members to Up.
You can subscribe to the WeaklyUp membership event to make use of the members that are in this state, but you should be aware of that members on the other side of a network partition have no knowledge about the existence of the new members. You should for example not count WeaklyUp members in quorum decisions.
Warning
This feature is only available from Akka 2.4.0 and cannot be used if some of your cluster members are running an older version of Akka.
Subscribe to Cluster Events
You can subscribe to change notifications of the cluster membership by using Cluster(system).subscribe.
cluster.subscribe(self, classOf[MemberEvent], classOf[UnreachableMember])
A snapshot of the full state, akka.cluster.ClusterEvent.CurrentClusterState, is sent to the subscriber as the first message, followed by events for incremental updates.
Note that you may receive an empty CurrentClusterState, containing no members, if you start the subscription before the initial join procedure has completed. This is expected behavior. When the node has been accepted in the cluster you will receive MemberUp for that node, and other nodes.
If you find it inconvenient to handle the CurrentClusterState you can use ClusterEvent.InitialStateAsEvents as parameter to subscribe. That means that instead of receiving CurrentClusterState as the first message you will receive the events corresponding to the current state to mimic what you would have seen if you were listening to the events when they occurred in the past. Note that those initial events only correspond to the current state and it is not the full history of all changes that actually has occurred in the cluster.
cluster.subscribe(self, initialStateMode = InitialStateAsEvents,
classOf[MemberEvent], classOf[UnreachableMember])
The events to track the life-cycle of members are:
- ClusterEvent.MemberJoined - A new member has joined the cluster and its status has been changed to Joining.
- ClusterEvent.MemberUp - A new member has joined the cluster and its status has been changed to Up.
- ClusterEvent.MemberExited - A member is leaving the cluster and its status has been changed to Exiting Note that the node might already have been shutdown when this event is published on another node.
- ClusterEvent.MemberRemoved - Member completely removed from the cluster.
- ClusterEvent.UnreachableMember - A member is considered as unreachable, detected by the failure detector of at least one other node.
- ClusterEvent.ReachableMember - A member is considered as reachable again, after having been unreachable. All nodes that previously detected it as unreachable has detected it as reachable again.
There are more types of change events, consult the API documentation of classes that extends akka.cluster.ClusterEvent.ClusterDomainEvent for details about the events.
Instead of subscribing to cluster events it can sometimes be convenient to only get the full membership state with Cluster(system).state. Note that this state is not necessarily in sync with the events published to a cluster subscription.
Worker Dial-in Example
Let's take a look at an example that illustrates how workers, here named backend, can detect and register to new master nodes, here named frontend.
The example application provides a service to transform text. When some text is sent to one of the frontend services, it will be delegated to one of the backend workers, which performs the transformation job, and sends the result back to the original client. New backend nodes, as well as new frontend nodes, can be added or removed to the cluster dynamically.
Messages:
final case class TransformationJob(text: String)
final case class TransformationResult(text: String)
final case class JobFailed(reason: String, job: TransformationJob)
case object BackendRegistration
The backend worker that performs the transformation job:
class TransformationBackend extends Actor {
val cluster = Cluster(context.system)
// subscribe to cluster changes, MemberUp
// re-subscribe when restart
override def preStart(): Unit = cluster.subscribe(self, classOf[MemberUp])
override def postStop(): Unit = cluster.unsubscribe(self)
def receive = {
case TransformationJob(text) => sender() ! TransformationResult(text.toUpperCase)
case state: CurrentClusterState =>
state.members.filter(_.status == MemberStatus.Up) foreach register
case MemberUp(m) => register(m)
}
def register(member: Member): Unit =
if (member.hasRole("frontend"))
context.actorSelection(RootActorPath(member.address) / "user" / "frontend") !
BackendRegistration
}
Note that the TransformationBackend actor subscribes to cluster events to detect new, potential, frontend nodes, and send them a registration message so that they know that they can use the backend worker.
The frontend that receives user jobs and delegates to one of the registered backend workers:
class TransformationFrontend extends Actor {
var backends = IndexedSeq.empty[ActorRef]
var jobCounter = 0
def receive = {
case job: TransformationJob if backends.isEmpty =>
sender() ! JobFailed("Service unavailable, try again later", job)
case job: TransformationJob =>
jobCounter += 1
backends(jobCounter % backends.size) forward job
case BackendRegistration if !backends.contains(sender()) =>
context watch sender()
backends = backends :+ sender()
case Terminated(a) =>
backends = backends.filterNot(_ == a)
}
}
Note that the TransformationFrontend actor watch the registered backend to be able to remove it from its list of available backend workers. Death watch uses the cluster failure detector for nodes in the cluster, i.e. it detects network failures and JVM crashes, in addition to graceful termination of watched actor. Death watch generates the Terminated message to the watching actor when the unreachable cluster node has been downed and removed.
The Lightbend Activator tutorial named Akka Cluster Samples with Scala. contains the full source code and instructions of how to run the Worker Dial-in Example.
Node Roles
Not all nodes of a cluster need to perform the same function: there might be one sub-set which runs the web front-end, one which runs the data access layer and one for the number-crunching. Deployment of actors—for example by cluster-aware routers—can take node roles into account to achieve this distribution of responsibilities.
The roles of a node is defined in the configuration property named akka.cluster.roles and it is typically defined in the start script as a system property or environment variable.
The roles of the nodes is part of the membership information in MemberEvent that you can subscribe to.
How To Startup when Cluster Size Reached
A common use case is to start actors after the cluster has been initialized, members have joined, and the cluster has reached a certain size.
With a configuration option you can define required number of members before the leader changes member status of 'Joining' members to 'Up'.
akka.cluster.min-nr-of-members = 3
In a similar way you can define required number of members of a certain role before the leader changes member status of 'Joining' members to 'Up'.
akka.cluster.role {
frontend.min-nr-of-members = 1
backend.min-nr-of-members = 2
}
You can start the actors in a registerOnMemberUp callback, which will be invoked when the current member status is changed to 'Up', i.e. the cluster has at least the defined number of members.
Cluster(system) registerOnMemberUp {
system.actorOf(Props(classOf[FactorialFrontend], upToN, true),
name = "factorialFrontend")
}
This callback can be used for other things than starting actors.
How To Cleanup when Member is Removed
You can do some clean up in a registerOnMemberRemoved callback, which will be invoked when the current member status is changed to 'Removed' or the cluster have been shutdown.
For example, this is how to shut down the ActorSystem and thereafter exit the JVM:
Cluster(system).registerOnMemberRemoved {
// exit JVM when ActorSystem has been terminated
system.registerOnTermination(System.exit(0))
// shut down ActorSystem
system.terminate()
// In case ActorSystem shutdown takes longer than 10 seconds,
// exit the JVM forcefully anyway.
// We must spawn a separate thread to not block current thread,
// since that would have blocked the shutdown of the ActorSystem.
new Thread {
override def run(): Unit = {
if (Try(Await.ready(system.whenTerminated, 10.seconds)).isFailure)
System.exit(-1)
}
}.start()
}
Note
Register a OnMemberRemoved callback on a cluster that have been shutdown, the callback will be invoked immediately on the caller thread, otherwise it will be invoked later when the current member status changed to 'Removed'. You may want to install some cleanup handling after the cluster was started up, but the cluster might already be shutting down when you installing, and depending on the race is not healthy.
Cluster Singleton
For some use cases it is convenient and sometimes also mandatory to ensure that you have exactly one actor of a certain type running somewhere in the cluster.
This can be implemented by subscribing to member events, but there are several corner cases to consider. Therefore, this specific use case is made easily accessible by the Cluster Singleton.
Cluster Sharding
Distributes actors across several nodes in the cluster and supports interaction with the actors using their logical identifier, but without having to care about their physical location in the cluster.
See Cluster Sharding
Distributed Publish Subscribe
Publish-subscribe messaging between actors in the cluster, and point-to-point messaging using the logical path of the actors, i.e. the sender does not have to know on which node the destination actor is running.
Cluster Client
Communication from an actor system that is not part of the cluster to actors running somewhere in the cluster. The client does not have to know on which node the destination actor is running.
See Cluster Client.
Distributed Data
Akka Distributed Data is useful when you need to share data between nodes in an Akka Cluster. The data is accessed with an actor providing a key-value store like API.
See Distributed Data.
Failure Detector
In a cluster each node is monitored by a few (default maximum 5) other nodes, and when any of these detects the node as unreachable that information will spread to the rest of the cluster through the gossip. In other words, only one node needs to mark a node unreachable to have the rest of the cluster mark that node unreachable.
The failure detector will also detect if the node becomes reachable again. When all nodes that monitored the unreachable node detects it as reachable again the cluster, after gossip dissemination, will consider it as reachable.
If system messages cannot be delivered to a node it will be quarantined and then it cannot come back from unreachable. This can happen if the there are too many unacknowledged system messages (e.g. watch, Terminated, remote actor deployment, failures of actors supervised by remote parent). Then the node needs to be moved to the down or removed states and the actor system of the quarantined node must be restarted before it can join the cluster again.
The nodes in the cluster monitor each other by sending heartbeats to detect if a node is unreachable from the rest of the cluster. The heartbeat arrival times is interpreted by an implementation of The Phi Accrual Failure Detector.
The suspicion level of failure is given by a value called phi. The basic idea of the phi failure detector is to express the value of phi on a scale that is dynamically adjusted to reflect current network conditions.
The value of phi is calculated as:
phi = -log10(1 - F(timeSinceLastHeartbeat))
where F is the cumulative distribution function of a normal distribution with mean and standard deviation estimated from historical heartbeat inter-arrival times.
In the Configuration you can adjust the akka.cluster.failure-detector.threshold to define when a phi value is considered to be a failure.
A low threshold is prone to generate many false positives but ensures a quick detection in the event of a real crash. Conversely, a high threshold generates fewer mistakes but needs more time to detect actual crashes. The default threshold is 8 and is appropriate for most situations. However in cloud environments, such as Amazon EC2, the value could be increased to 12 in order to account for network issues that sometimes occur on such platforms.
The following chart illustrates how phi increase with increasing time since the previous heartbeat.
Phi is calculated from the mean and standard deviation of historical inter arrival times. The previous chart is an example for standard deviation of 200 ms. If the heartbeats arrive with less deviation the curve becomes steeper, i.e. it is possible to determine failure more quickly. The curve looks like this for a standard deviation of 100 ms.
To be able to survive sudden abnormalities, such as garbage collection pauses and transient network failures the failure detector is configured with a margin, akka.cluster.failure-detector.acceptable-heartbeat-pause. You may want to adjust the Configuration of this depending on you environment. This is how the curve looks like for acceptable-heartbeat-pause configured to 3 seconds.
Death watch uses the cluster failure detector for nodes in the cluster, i.e. it detects network failures and JVM crashes, in addition to graceful termination of watched actor. Death watch generates the Terminated message to the watching actor when the unreachable cluster node has been downed and removed.
If you encounter suspicious false positives when the system is under load you should define a separate dispatcher for the cluster actors as described in Cluster Dispatcher.
Cluster Aware Routers
All routers can be made aware of member nodes in the cluster, i.e. deploying new routees or looking up routees on nodes in the cluster. When a node becomes unreachable or leaves the cluster the routees of that node are automatically unregistered from the router. When new nodes join the cluster, additional routees are added to the router, according to the configuration. Routees are also added when a node becomes reachable again, after having been unreachable.
Cluster aware routers make use of members with status WeaklyUp if that feature is enabled.
There are two distinct types of routers.
- Group - router that sends messages to the specified path using actor selection The routees can be shared among routers running on different nodes in the cluster. One example of a use case for this type of router is a service running on some backend nodes in the cluster and used by routers running on front-end nodes in the cluster.
- Pool - router that creates routees as child actors and deploys them on remote nodes. Each router will have its own routee instances. For example, if you start a router on 3 nodes in a 10-node cluster, you will have 30 routees in total if the router is configured to use one instance per node. The routees created by the different routers will not be shared among the routers. One example of a use case for this type of router is a single master that coordinates jobs and delegates the actual work to routees running on other nodes in the cluster.
Router with Group of Routees
When using a Group you must start the routee actors on the cluster member nodes. That is not done by the router. The configuration for a group looks like this:
akka.actor.deployment {
/statsService/workerRouter {
router = consistent-hashing-group
routees.paths = ["/user/statsWorker"]
cluster {
enabled = on
allow-local-routees = on
use-role = compute
}
}
}
Note
The routee actors should be started as early as possible when starting the actor system, because the router will try to use them as soon as the member status is changed to 'Up'.
The actor paths without address information that are defined in routees.paths are used for selecting the actors to which the messages will be forwarded to by the router. Messages will be forwarded to the routees using ActorSelection, so the same delivery semantics should be expected. It is possible to limit the lookup of routees to member nodes tagged with a certain role by specifying use-role.
max-total-nr-of-instances defines total number of routees in the cluster. By default max-total-nr-of-instances is set to a high value (10000) that will result in new routees added to the router when nodes join the cluster. Set it to a lower value if you want to limit total number of routees.
The same type of router could also have been defined in code:
import akka.cluster.routing.ClusterRouterGroup
import akka.cluster.routing.ClusterRouterGroupSettings
import akka.routing.ConsistentHashingGroup
val workerRouter = context.actorOf(
ClusterRouterGroup(ConsistentHashingGroup(Nil), ClusterRouterGroupSettings(
totalInstances = 100, routeesPaths = List("/user/statsWorker"),
allowLocalRoutees = true, useRole = Some("compute"))).props(),
name = "workerRouter2")
See Configuration section for further descriptions of the settings.
Router Example with Group of Routees
Let's take a look at how to use a cluster aware router with a group of routees, i.e. router sending to the paths of the routees.
The example application provides a service to calculate statistics for a text. When some text is sent to the service it splits it into words, and delegates the task to count number of characters in each word to a separate worker, a routee of a router. The character count for each word is sent back to an aggregator that calculates the average number of characters per word when all results have been collected.
Messages:
final case class StatsJob(text: String)
final case class StatsResult(meanWordLength: Double)
final case class JobFailed(reason: String)
The worker that counts number of characters in each word:
class StatsWorker extends Actor {
var cache = Map.empty[String, Int]
def receive = {
case word: String =>
val length = cache.get(word) match {
case Some(x) => x
case None =>
val x = word.length
cache += (word -> x)
x
}
sender() ! length
}
}
The service that receives text from users and splits it up into words, delegates to workers and aggregates:
class StatsService extends Actor {
// This router is used both with lookup and deploy of routees. If you
// have a router with only lookup of routees you can use Props.empty
// instead of Props[StatsWorker.class].
val workerRouter = context.actorOf(FromConfig.props(Props[StatsWorker]),
name = "workerRouter")
def receive = {
case StatsJob(text) if text != "" =>
val words = text.split(" ")
val replyTo = sender() // important to not close over sender()
// create actor that collects replies from workers
val aggregator = context.actorOf(Props(
classOf[StatsAggregator], words.size, replyTo))
words foreach { word =>
workerRouter.tell(
ConsistentHashableEnvelope(word, word), aggregator)
}
}
}
class StatsAggregator(expectedResults: Int, replyTo: ActorRef) extends Actor {
var results = IndexedSeq.empty[Int]
context.setReceiveTimeout(3.seconds)
def receive = {
case wordCount: Int =>
results = results :+ wordCount
if (results.size == expectedResults) {
val meanWordLength = results.sum.toDouble / results.size
replyTo ! StatsResult(meanWordLength)
context.stop(self)
}
case ReceiveTimeout =>
replyTo ! JobFailed("Service unavailable, try again later")
context.stop(self)
}
}
Note, nothing cluster specific so far, just plain actors.
All nodes start StatsService and StatsWorker actors. Remember, routees are the workers in this case. The router is configured with routees.paths:
akka.actor.deployment {
/statsService/workerRouter {
router = consistent-hashing-group
routees.paths = ["/user/statsWorker"]
cluster {
enabled = on
allow-local-routees = on
use-role = compute
}
}
}
This means that user requests can be sent to StatsService on any node and it will use StatsWorker on all nodes.
The Lightbend Activator tutorial named Akka Cluster Samples with Scala. contains the full source code and instructions of how to run the Router Example with Group of Routees.
Router with Pool of Remote Deployed Routees
When using a Pool with routees created and deployed on the cluster member nodes the configuration for a router looks like this:
akka.actor.deployment {
/statsService/singleton/workerRouter {
router = consistent-hashing-pool
cluster {
enabled = on
max-nr-of-instances-per-node = 3
allow-local-routees = on
use-role = compute
}
}
}
It is possible to limit the deployment of routees to member nodes tagged with a certain role by specifying use-role.
max-total-nr-of-instances defines total number of routees in the cluster, but the number of routees per node, max-nr-of-instances-per-node, will not be exceeded. By default max-total-nr-of-instances is set to a high value (10000) that will result in new routees added to the router when nodes join the cluster. Set it to a lower value if you want to limit total number of routees.
The same type of router could also have been defined in code:
import akka.cluster.routing.ClusterRouterPool
import akka.cluster.routing.ClusterRouterPoolSettings
import akka.routing.ConsistentHashingPool
val workerRouter = context.actorOf(
ClusterRouterPool(ConsistentHashingPool(0), ClusterRouterPoolSettings(
totalInstances = 100, maxInstancesPerNode = 3,
allowLocalRoutees = false, useRole = None)).props(Props[StatsWorker]),
name = "workerRouter3")
See Configuration section for further descriptions of the settings.
Router Example with Pool of Remote Deployed Routees
Let's take a look at how to use a cluster aware router on single master node that creates and deploys workers. To keep track of a single master we use the Cluster Singleton in the contrib module. The ClusterSingletonManager is started on each node.
system.actorOf(ClusterSingletonManager.props(
singletonProps = Props[StatsService],
terminationMessage = PoisonPill,
settings = ClusterSingletonManagerSettings(system).withRole("compute")),
name = "statsService")
We also need an actor on each node that keeps track of where current single master exists and delegates jobs to the StatsService. That is provided by the ClusterSingletonProxy.
system.actorOf(ClusterSingletonProxy.props(singletonManagerPath = "/user/statsService",
settings = ClusterSingletonProxySettings(system).withRole("compute")),
name = "statsServiceProxy")
The ClusterSingletonProxy receives text from users and delegates to the current StatsService, the single master. It listens to cluster events to lookup the StatsService on the oldest node.
All nodes start ClusterSingletonProxy and the ClusterSingletonManager. The router is now configured like this:
akka.actor.deployment {
/statsService/singleton/workerRouter {
router = consistent-hashing-pool
cluster {
enabled = on
max-nr-of-instances-per-node = 3
allow-local-routees = on
use-role = compute
}
}
}
The Lightbend Activator tutorial named Akka Cluster Samples with Scala. contains the full source code and instructions of how to run the Router Example with Pool of Remote Deployed Routees.
Cluster Metrics
The member nodes of the cluster can collect system health metrics and publish that to other cluster nodes and to the registered subscribers on the system event bus with the help of Cluster Metrics Extension.
How to Test
Multi Node Testing is useful for testing cluster applications.
Set up your project according to the instructions in Multi Node Testing and Multi JVM Testing, i.e. add the sbt-multi-jvm plugin and the dependency to akka-multi-node-testkit.
First, as described in Multi Node Testing, we need some scaffolding to configure the MultiNodeSpec. Define the participating roles and their Configuration in an object extending MultiNodeConfig:
import akka.remote.testkit.MultiNodeConfig
import com.typesafe.config.ConfigFactory
object StatsSampleSpecConfig extends MultiNodeConfig {
// register the named roles (nodes) of the test
val first = role("first")
val second = role("second")
val third = role("thrid")
def nodeList = Seq(first, second, third)
// Extract individual sigar library for every node.
nodeList foreach { role =>
nodeConfig(role) {
ConfigFactory.parseString(s"""
# Disable legacy metrics in akka-cluster.
akka.cluster.metrics.enabled=off
# Enable metrics extension in akka-cluster-metrics.
akka.extensions=["akka.cluster.metrics.ClusterMetricsExtension"]
# Sigar native library extract location during tests.
akka.cluster.metrics.native-library-extract-folder=target/native/${role.name}
""")
}
}
// this configuration will be used for all nodes
// note that no fixed host names and ports are used
commonConfig(ConfigFactory.parseString("""
akka.actor.provider = cluster
akka.remote.log-remote-lifecycle-events = off
akka.cluster.roles = [compute]
// router lookup config ...
"""))
}
Define one concrete test class for each role/node. These will be instantiated on the different nodes (JVMs). They can be implemented differently, but often they are the same and extend an abstract test class, as illustrated here.
// need one concrete test class per node
class StatsSampleSpecMultiJvmNode1 extends StatsSampleSpec
class StatsSampleSpecMultiJvmNode2 extends StatsSampleSpec
class StatsSampleSpecMultiJvmNode3 extends StatsSampleSpec
Note the naming convention of these classes. The name of the classes must end with MultiJvmNode1, MultiJvmNode2 and so on. It is possible to define another suffix to be used by the sbt-multi-jvm, but the default should be fine in most cases.
Then the abstract MultiNodeSpec, which takes the MultiNodeConfig as constructor parameter.
import org.scalatest.BeforeAndAfterAll
import org.scalatest.WordSpecLike
import org.scalatest.Matchers
import akka.remote.testkit.MultiNodeSpec
import akka.testkit.ImplicitSender
abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig)
with WordSpecLike with Matchers with BeforeAndAfterAll
with ImplicitSender {
import StatsSampleSpecConfig._
override def initialParticipants = roles.size
override def beforeAll() = multiNodeSpecBeforeAll()
override def afterAll() = multiNodeSpecAfterAll()
Most of this can of course be extracted to a separate trait to avoid repeating this in all your tests.
Typically you begin your test by starting up the cluster and let the members join, and create some actors. That can be done like this:
"illustrate how to startup cluster" in within(15 seconds) {
Cluster(system).subscribe(testActor, classOf[MemberUp])
expectMsgClass(classOf[CurrentClusterState])
val firstAddress = node(first).address
val secondAddress = node(second).address
val thirdAddress = node(third).address
Cluster(system) join firstAddress
system.actorOf(Props[StatsWorker], "statsWorker")
system.actorOf(Props[StatsService], "statsService")
receiveN(3).collect { case MemberUp(m) => m.address }.toSet should be(
Set(firstAddress, secondAddress, thirdAddress))
Cluster(system).unsubscribe(testActor)
testConductor.enter("all-up")
}
From the test you interact with the cluster using the Cluster extension, e.g. join.
Cluster(system) join firstAddress
Notice how the testActor from testkit is added as subscriber to cluster changes and then waiting for certain events, such as in this case all members becoming 'Up'.
The above code was running for all roles (JVMs). runOn is a convenient utility to declare that a certain block of code should only run for a specific role.
"show usage of the statsService from one node" in within(15 seconds) {
runOn(second) {
assertServiceOk()
}
testConductor.enter("done-2")
}
def assertServiceOk(): Unit = {
val service = system.actorSelection(node(third) / "user" / "statsService")
// eventually the service should be ok,
// first attempts might fail because worker actors not started yet
awaitAssert {
service ! StatsJob("this is the text that will be analyzed")
expectMsgType[StatsResult](1.second).meanWordLength should be(
3.875 +- 0.001)
}
}
Once again we take advantage of the facilities in testkit to verify expected behavior. Here using testActor as sender (via ImplicitSender) and verifying the reply with expectMsgPF.
In the above code you can see node(third), which is useful facility to get the root actor reference of the actor system for a specific role. This can also be used to grab the akka.actor.Address of that node.
val firstAddress = node(first).address
val secondAddress = node(second).address
val thirdAddress = node(third).address
JMX
Information and management of the cluster is available as JMX MBeans with the root name akka.Cluster. The JMX information can be displayed with an ordinary JMX console such as JConsole or JVisualVM.
From JMX you can:
- see what members that are part of the cluster
- see status of this node
- see roles of each member
- join this node to another node in cluster
- mark any node in the cluster as down
- tell any node in the cluster to leave
Member nodes are identified by their address, in format akka.<protocol>://<actor-system-name>@<hostname>:<port>.
Command Line Management
The cluster can be managed with the script bin/akka-cluster provided in the Akka distribution.
Run it without parameters to see instructions about how to use the script:
Usage: bin/akka-cluster <node-hostname> <jmx-port> <command> ...
Supported commands are:
join <node-url> - Sends request a JOIN node with the specified URL
leave <node-url> - Sends a request for node with URL to LEAVE the cluster
down <node-url> - Sends a request for marking node with URL as DOWN
member-status - Asks the member node for its current status
members - Asks the cluster for addresses of current members
unreachable - Asks the cluster for addresses of unreachable members
cluster-status - Asks the cluster for its current status (member ring,
unavailable nodes, meta data etc.)
leader - Asks the cluster who the current leader is
is-singleton - Checks if the cluster is a singleton cluster (single
node cluster)
is-available - Checks if the member node is available
Where the <node-url> should be on the format of
'akka.<protocol>://<actor-system-name>@<hostname>:<port>'
Examples: bin/akka-cluster localhost 9999 is-available
bin/akka-cluster localhost 9999 join akka.tcp://MySystem@darkstar:2552
bin/akka-cluster localhost 9999 cluster-status
To be able to use the script you must enable remote monitoring and management when starting the JVMs of the cluster nodes, as described in Monitoring and Management Using JMX Technology
Example of system properties to enable remote monitoring and management:
java -Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false
Configuration
There are several configuration properties for the cluster. We refer to the reference configuration for more information.
Cluster Info Logging
You can silence the logging of cluster events at info level with configuration property:
akka.cluster.log-info = off
Cluster Dispatcher
Under the hood the cluster extension is implemented with actors and it can be necessary to create a bulkhead for those actors to avoid disturbance from other actors. Especially the heartbeating actors that is used for failure detection can generate false positives if they are not given a chance to run at regular intervals. For this purpose you can define a separate dispatcher to be used for the cluster actors:
akka.cluster.use-dispatcher = cluster-dispatcher
cluster-dispatcher {
type = "Dispatcher"
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 2
parallelism-max = 4
}
}
Note
Normally it should not be necessary to configure a separate dispatcher for the Cluster. The default-dispatcher should be sufficient for performing the Cluster tasks, i.e. akka.cluster.use-dispatcher should not be changed. If you have Cluster related problems when using the default-dispatcher that is typically an indication that you are running blocking or CPU intensive actors/tasks on the default-dispatcher. Use dedicated dispatchers for such actors/tasks instead of running them on the default-dispatcher, because that may starve system internal tasks. Related config properties: akka.cluster.use-dispatcher = akka.cluster.cluster-dispatcher. Corresponding default values: akka.cluster.use-dispatcher =.
Contents


*** Page Under Construction. Check out page at later time, thank you...***
I feel this is the fun stage of building anything. You get to brainstorm the ins and outs of how you want your final project to turn out to material


- Type:
- General
- Partisan:
- Yes
- Primary Party:
- Electorate Specifications:
- Special:
- Office:
- US President
- Filing Closed Date:
- Number Elected:
- 1
- Number Voting For:
- 1
- Ballot Placement:
- 1
Overview
| Element Type | Amount | Completion | Errors |
|---|---|---|---|
| Ballots | 976 |
38% complete
|
140 |
| Candidates | 1,761 |
91% complete
|
1,156 |
| Referendums | 0 | ||
| Custom Ballots | 0 | ||
| Ballot Responses | 0 |
Ballot ID: 410004744
- Sort Order:
- Write In:
- Image URL:
3 Candidates
| ID | Name | Party |
|---|---|---|
| 310007675 | Barack Obama | DEM |
| 310007676 | Mitt Romney | REP |
| 310007677 | Gary Johnson | LIB |
Electoral District
| ID | Name | Precincts | Precinct Splits |
|---|---|---|---|
| 330004744 | US President | 0 | 8,456 |