text:
Home Tags Ascensia Diabetes Care
Tag: Ascensia Diabetes Care
Ascensia launches World Diabetes Day video campaign
November 13, 2020HME News Staff
BASEL, Switzerland - Ascensia Diabetes Care is launching a series of videos in honor of World Diabetes Day 2020, Nov. 14. This year's theme established by the International Diabetes Foundation, is Nurses Make the Difference. In the videos, people with diabetes write letters to their nurse expressing their appreciation for their guidance and support in managing diabetes. "According to the IDF, around 9% of the world's adult population has diabetes, many of whom primarily self-manage their condition,"...
Ascensia Diabetes Care, world diabetes day
Ascensia partners with Senseonics on implantable CGMs
August 11, 2020HME News Staff
BASEL, Switzerland - PHC Holdings Corporation and Ascensia Diabetes Care have announced a strategic partnership with Senseonics Holdings, Inc., a medical technology company focused on the development and commercialization of long-term, implantable continuous glucose monitoring (CGM) systems for people with diabetes. As part of the agreement, Ascensia will serve as the exclusive global distribution partner for Senseonics' CGM systems, including Eversense, Eversense XL and future generation products...
Ascensia Diabetes Care, CGMs, diabetes, Eversense, Senseonics
Ascensia participates in fundraiser
February 14, 2020HME News Staff
BASEL, Switzerland - Ascensia Diabetes Care is supporting the 2020 Spare a Rose Campaign, a fundraiser to provide insulin, testing supplies and education for children with Type 1 diabetes in countries with limited access. The Spare a Rose campaign, created by Life for a Child, encourages people to buy at least one less rose for their loved ones on Valentine's day and instead donate $5 to Life for a Child. Ascensia will match employee donations up to $8,500, representing one rose per employee. Over...
Ascensia Diabetes Care, Spare a Rose Campaign, Type 1 diabetes
In brief: Supplier numbers decline, Kansas Medicaid proposes rate cut
January 11, 2019HME News Staff
WASHINGTON - The number of DMEPOS suppliers furnishing rate-adjusted items in non-bid areas decreased 11% in 2017, according to a new study from the Government Accountability Office.That decrease follows an 8% decrease in 2016—the first year rates were adjusted—compared to 2015 and continued a trend of annual decreases in non-bid areas that averaged 8% each year going back to at least 2011, according to the report, "Medicare Fee-For-Service: Information on the Second Year of Nationwide...
Ascensia Diabetes Care, Mobi, NSM, ResMed, sleep
Ascensia partners with CGM maker
January 9, 2019HME News Staff
BASEL, Switzerland - Ascensia Diabetes Care is partnering with Zhejiang POCTech, Co., a manufacturer of continuous glucose monitoring systems, to serve as its exclusive distributor in 13 markets. As part of the agreement, Ascensia will commercialize a version of POCTech's current CGM in these areas and will begin distributing product in the second half of 2019, according to a press release. The two companies have also entered into a development agreement to co-develop next generation products that...
Ascensia Diabetes Care, CGMs, diabetes
'Smart' technology boosts management
October 30, 2018John Andrews
Because diabetes patients are so involved in the management of their disease, technology is key to helping them stay healthy. And because technology continues to advance in the diabetes market, that means there are plenty of opportunities for HME providers to support these patients, specialists in the field say.For instance, advanced blood glucose monitoring technology includes enhanced connectivity of devices and data analysis capabilities, which has led to the development of smarter diabetes management...
Ascensia Diabetes Care, diabetes, diabetes technology, glucose monitoring, Pedors, wearables
Ascensia Diabetes goes toward future
June 25, 2018Tracy Orzel
PARSIPPANY, N.J. - Ascensia Diabetes Care has upgraded its Contour Diabetes app to help users self-manage their diabetes better by analyzing behavior patterns and suggesting new ones."This behavior-change approach helps patients understand what the trends are, what the data means, and then provides personalized feedback so they can make the changes that they need to," said Robert Schumm, head of region Americas of Ascensia Diabetes Care.Originally released in 2016 to connect...
app, Ascensia Diabetes Care, Contour Diabetes, diabetes
Ascensia expands access for Contour products
April 5, 2018HME News Staff
BASEL, Switzerland - Ascensia Diabetes Care has improved access to its Contour Next meters and test strips for UnitedHealthcare members, it announced today. Effective April 1, individuals can access the brand's products through their pharmacy benefit at a tier 2 co-pay level. Previously, a prior authorization was required. "This change will give more people the opportunity to access these products, and at a reasonable cost," said Robert Schumm, vice president and managing director of...
Ascensia Diabetes Care, Contour Next, diabetic supplies
Patient self-management key to diabetes
Among the patient population with chronic illnesses, diabetes is the most common catalyst and comorbidity, which makes it one of the most complex and important disorders facing providers. And its growth, gradually rising for decades, continues unabated.The numbers show that Type 2 diabetes has become a global epidemic, with more than 400 million people currently affected internationally and the total is projected to swell to more than 640 million by 2040. Domestically, the number of people with type...
Ascensia Diabetes Care, diabetes, digital health, Vivify, West Corp.
Ascensia, Dr. Oz team up to empower people with diabetes
May 12, 2017Kelly Bothum
PARSIPPANY, N.J. - Dr. Mehmet Oz has given Ascensia Diabetes Care a big boost in its efforts to educate people about diabetes and help the nearly 30 million Americans with the disease better manage their condition.Ascensia is partnering with The Dr. Oz Showfor a 60-day diabetes challenge that focuses on the importance of regularly testing blood glucose levels and maintaining a healthy diet."Diabetes is a huge issue in the U.S.—it's reached epidemic levels," said Robert Schumm, vice...
Ascensia Diabetes Care, diabetes, Dr. Oz, glucometer


text:
Le vol parabolique est un moyen de créer une situation de micropesanteur pendant une vingtaine de secondes. C'est un moyen relativement moins coûteux que les autres et permettant l'utilisation de matériel de laboratoire. En outre, il permet d'embarquer les expérimentateurs avec leurs expériences, ce qui est impossible en tour de chute ou dans les stations orbitales par exemple. Les inconvénients sont la faible durée, la qualité ( d'accélération résiduelle).

Pour le vol parabolique, on parle de situation de micropesanteur.

Principe
Un objet est soumis à l'impesanteur lorsque l'ensemble des forces gravitationnelles et inertielles auxquelles il est soumis possède une résultante et un moment résultant nuls. Si l'on néglige les forces de frottements, un solide se déplace vers le centre de la terre avec une accélération selon le carré du temps en seconde indépendamment de sa masse. Cette situation est aussi appelée chute libre. Dans un référentiel galiléen, cela signifie qu'un objet en chute libre accélère en fonction du temps et du corps qui l'attire comme celle d'une planète par exemple.

Le principe du vol parabolique est de reproduire une trajectoire la plus proche possible de la parabole décrite par un objet lancé à la vitesse de l'avion, afin que les expériences situées à l'intérieur de l'avion soient en état de micropesanteur. Il faut un pilotage fin qui nécessite trois pilotes, l'un agissant sur le tangage (pilotage de l'assiette), l'autre maintenant l'inclinaison nulle (axe de roulis) tandis que le dernier contrôle le régime moteur et vérifie les paramètres de vol.

Trajectoire et phases des parcours paraboliques
Pour chacune des quinze paraboles parcourues :

Premier trajet horizontal
L'avion se positionne tout d'abord similairement à un vol commercial de voyage, à une altitude d'environ  à vitesse constante de .

Dix minutes au plus tard avant la première parabole, les participants sont invités à quitter leur siège pour rejoindre la zone expérimentale recouverte de tapis mousse, de « free-floating »). Les annonces informent le décompte à rebours avant l'injection.

Propulsion à  vers le haut (passagers à )
L'avion effectue une phase de propulsion en se cabrant vers le haut, puis en s'inclinant de plus en plus, procurant ainsi une accélération positive constante d'environ , soit , appelée « ressource », durant environ  de montée.

Les passagers et le matériel sont en hyperpesanteur, très alourdis à une force de , pesant 1,8 fois leur poids par rapport au sol de l'avion et tenus ou « collés » sur le plancher de l'avion par la force centrifuge due à l'augmentation continuelle d'inclinaison. Il leur est conseillé de rester assis voire allongés, la position debout étant presque impossible sans fléchir les jambes, en maintenant la tête droite pour éviter l'écœurement du « mal des transports ».

Le pilote annonce l'inclinaison de 30°, puis 40° enfin « injection » vers 47°.

Apesanteur en chute libre (passagers à )
Ayant atteint un angle d'environ 47°, subitement l'avion coupe les gaz, puis les remet progressivement vers le bas pour compenser le freinage de l'air en restant à  (en chute libre), durant une phase d'airtime en « micropesanteur », proche de l'apesanteur, durant environ , correspondant à  de chute libre en montée, puis  de chute libre en descente. C'est la phase d'injection. Puis le pilote annonce de nouveau 20°, 30°, puis « ressource ».

Les passagers sont allégés à  (d'où l'appellation « avion zéro g ») et de poids nul, par rapport à l'avion et se mettent à flotter à l'intérieur, en quittant le sol à la moindre impulsion d'élan par leur bras ou jambes. Les passagers peuvent s'amuser aussi à tourner sur eux-mêmes, ou diverses autres expériences liées aux sensations fortes de ces airtimes prolongés. Plusieurs expériences d'apesanteur sont réalisées, la première étant bien sûr celle d'un liquide sortant d'un verre se mettant en boule par force capillaire, en l'avalant ensuite.

Une campagne consiste en quinze paraboles et dure trois heures. La première simule la pesanteur martienne à environ , la seconde la pesanteur lunaire à environ  (le 1/ de la pesanteur terrestre) et les treize suivantes proches de .

Retour vers l'horizontale à  vers le haut (passagers à )
Avant cette phase, les passagers sont prévenus de rejoindre le plancher de l'appareil afin d'éviter le choc éventuel d'une chute de toute la hauteur.

L'avion remet les gaz vers le haut en effectuant une nouvelle phase de propulsion d'accélération positive constante d'environ , soit , durant environ vingt secondes de freinage de descente, afin de poursuivre sa trajectoire horizontalement avant la parabole suivante. Les passagers et le matériel sont de nouveau alourdis à une force de , pesant  leur poids par rapport au sol de l'avion.

Transition horizontale
À la fin de la « ressource », le pilote annonce « une minute », temps total approximatif de toute la parabole.

L'avion a alors repris une trajectoire horizontale sans accélération, permettant de laisser un laps de temps de « trêve » de repos aux passagers entre chaque parabole. Celle-ci est d'environ cinq minutes.

Trajectoire formant des paraboles

Si l'on considère que la composante horizontale de la vitesse de l'avion est constante, y compris durant toutes ses accélérations verticales, la trajectoire décrite est donc similaire à celle de la courbe d'un corps en accélération constante au cours du temps. Verticalement, en positif comme en négatif, la vitesse augmente donc proportionnellement au temps et le trajet parcouru augmente proportionnellement au carré du temps.

La courbe du trajet vertical en fonction du temps et donc aussi la trajectoire décrivent donc pour chacune des phases une parabole incurvée vers le haut lors des deux accélérations positives à , et une double parabole incurvée vers le bas avec un sommet lors de l'accélération négative à , d'où l'appellation de « vol parabolique ».

La composante horizontale de la vitesse reste à peu près constante durant toute la phase à , soit environ .

Par contre, durant les propulsions à , la composante horizontale de la vitesse n'est pas constante, afin de maintenir les passagers sur le sol de l'avion sans glisser vers le fond lorsque l'avion est incliné, grâce à la force centrifuge due à la forme incurvée de la parabole qui s'ajoute à une décélération augmentant au cours de l'inclinaison : en effet, la vitesse linéaire (horizontale) au départ et à la fin de la parabole est de , puis décroit durant le cabrage de l'avion, n'étant plus que de  à inclinaison maximale de 45°, la composante horizontale étant de (530 * sinus 45°) = .

L'avion passe en phase de , la vitesse linéaire décroissant, et celle horizontale restant à  tout en réduisant naturellement son inclinaison jusqu'au sommet de la parabole (vitesse verticale devenue nulle), puis s'incline naturellement de plus en plus vers le bas. La vitesse linéaire réaugmente jusqu'à  à son inclinaison maximale de 45° vers le bas, tout en conservant une vitesse horizontale de .

L'avion remettant les gaz, les passagers inclinés à 45° sont de nouveau soumis à une force positive constamment perpendiculaire à l'avion leur évitant de glisser vers le fond, en raison de la force centrifuge de la forme incurvée de la parabole, ajoutée à une accélération de l'avion repassant progressivement de 530 à , jusqu'à ce que l'inclinaison repasse à 0°.

La courbe est donc plus aplanie en bas qu'une parabole, et l'avion effectue donc horizontalement une décélération durant la montée et accélération durant la descente, cette force permettant justement d'être centrifuge pour permettre aux passagers d'être soulevés perpendiculairement au sol malgré l'inclinaison.

Dans la pratique, pour obtenir les accélérations désirées, les pilotes possèdent un accéléromètre d'indication afin qu'ils maintiennent l'avion à  par rapport au sol  puis à  au cours de leur trajectoire.

Contrairement aux parachutistes durant leur chute, l'avion continue de cabrer à  malgré la résistance de l'air arrivé à une certaine vitesse négative, en compensant par des gaz accélérant l'avion vers le bas. Les passagers n'ont quant à eux pas de résistance de l'air puisqu'ils sont à l'intérieur de l'avion pressurisé.

Ces chiffres sont indicatifs de valeur moyenne, car si le principe parabolique de la trajectoire reste identique, selon les avions toutes ces valeurs diffèrent un peu.

Certains « top hat » de montagnes russes, ont été profilés de manière ressemblante proche d'une double parabole pour procurer aux passagers des accélérations aux sensations similaires, en tenant compte aussi de la réduction de vitesse au sommet de la bosse.

Vitesses et altitudes atteintes
L'altitude de l'avion à l'horizontale est d'environ  (vitesse verticale = 0). Lors de sa première propulsion de ressource vers le haut à , soit environ , sa vitesse verticale atteint donc v = 8 t = 160 m/s, en pratique environ  et il s'est élevé de h = 4 t² = 1 600 à , étant en pratique vers .

Débute la phase de 20 à  en apesanteur : durant les douze premières secondes, l'avion décélère en montée de , et sa vitesse de montée se réduit jusqu'à 0, atteignant un sommet de hauteur environ , puis poursuit son accélération de  cette fois en chute libre en descente.

La perte d'altitude étant proportionnelle au carré du temps (h = 5 t²), c'est la raison pour laquelle par sécurité, cette deuxième moitié à zéro g est limitée à environ douze secondes aussi, l'avion remettant ensuite les gaz de propulsion vers le haut freinant la descente jusqu'à retrouver l'altitude horizontale de départ, la hauteur totale de chaque parabole parcourue par l'avion étant donc d'environ .

Centre national d'études spatiales (CNES)

En France, le CNES est responsable de l'organisation de campagnes de vols paraboliques depuis 1989. La filiale Novespace a été fondée en 1986, afin de développer l'expérimentation en impesanteur en Europe.

L'avion utilisé est tout d'abord une Caravelle jusqu'en 1995. Un Airbus A300 immatriculé F-BUAD la remplace dès 1997. Il est appelé A300 ZERO-G. Après dix-sept ans de carrière et plus de  paraboles, il est remplacé en 2014 par un A310-304. F-WNOV effectue, après sa conversion en Allemagne, son premier vol parabolique le .

Depuis 2013, des vols paraboliques sont proposés au grand public. Ils sont réalisés par Novespace, filiale du CNES, depuis l'aéroport de Bordeaux - Mérignac à une quarantaine de passagers chaque trimestre environ. Ils sont commercialisés sous la marque Air Zero G, en partenariat avec la société Avico.

Jean-François Clervoy était PDG de Novespace jusqu'en 2019. Lui et Jean-Pierre Haigneré ont été à l'origine du programme des vols paraboliques en Europe. Thierry Gharib lui a succédé en qualité de PDG en 2019.

Au CNES, l'activité est sous la responsabilité de Sébastien Rouquette, ingénieur chargé de développement d'expériences en impesanteur au sein du CADMOS.

Sûreté
Les vols paraboliques sont effectués depuis soixante-dix ans dans le monde. Sur les centaines de milliers de paraboles, aucun accident n'est à déplorer. Ils peuvent être effectués à partir de l'âge de 8 ans, et le passager le plus âgé a été Buzz Aldrin. Par contre, un bon état de santé est nécessaire, avec un certificat médical d'un cardiologue après tests. Des chats et souris ont effectué l'expérience à bord.

Pour éviter le mal des transports, un médicament voire une piqûre anti-nausée peuvent être administrés préalablement.

Intérêts scientifiques
La micropesanteur permet de révéler des phénomènes habituellement masqués par la gravité sur Terre. Le vol parabolique est donc utilisé pour des expériences de physique des matériaux, biologie, chimie, astrophysique ou physiologie, grâce aux conséquences immédiates de la micropesanteur, à savoir une absence de :
 pression hydrostatique ;
 convection ;
 poussée d'Archimède ;
 sédimentation.

Elle présente aussi l'amplification des phénomènes de :
 lévitation ;
 capillarité.

Autres possibilités d'apesanteur
D'autres moyens usuels pour simuler ou bénéficier de la micropesanteur peuvent être :
 la tour d'impesanteur ;
 la fusée-sonde (tir balistique) ;
 le module réutilisable ;
 le laboratoire permanent ;
 les navettes spatiales

Personnalités ayant effectué un vol parabolique

De nombreuses personnalités ont eu l'occasion d'effectuer déjà l'expérience d'un vol parabolique. Des étudiants universitaires ont aussi eu l'occasion d'effectuer ce vol. Certains mariages ont eu lieu pendant un vol. Plusieurs séquences de films spatiaux (science-fiction...) y ont été tournées.

Notes et références

Annexes

Bibliographie
 Franck Lehot, Voler en apesanteur - Un rêve désormais possible !, Éd. Vuibert, 2012, , , 238 pages.

Articles connexes
 Campagnes de vols paraboliques de l'ESA
 Airbus A300 ZERO-G
 Airbus A310 Zero G
 Novespace

Liens externes
 Site officiel du CADMOS - CNES (responsable des campagnes de vols paraboliques françaises).
 Novespace, filiale du CNES, exploitant l'AIRBUS A310 ZERO-G et proposant les vols pour le grand public sous la marque Air Zero G.
 AirZeroG, qui propose la réalisation de vols paraboliques Zero G au grand public.

Activité aérienne

redpajama_set_name: RedPajamaWikipedia


text:
MPG Open-Access-Netzwerk
Open Access Publishing - Initiativen
Open Access-Projekte an der Max-Planck-Gesellschaft
CARPET (Community for Academic Reviewing, Publishing and Editorial Technology)
Zeitraum: 10.2008 - 2013
MPG-Projekt-Partner: Max Planck Digital Library
Website:www.carpet-project.net
Das CARPET Projekt ist eine Informationsplattform über Technologien des e-Publishing. Das Ziel ist die Nachhaltigkeit bestehender Projekte zu fördern und redundante Entwicklungen zu vermeiden. Das Projekt ist eine von der Deutschen Forschungsgemeinschaft geförderte Kooperation zwischen der Max Planck Digital Library, der Humboldt-Universität zu Berlin und der Staats- und Universitätsbibliothek Göttingen. mehr
ECHO (European Cultural Heritage Online)
Zeitraum:12.2002 -
MPG-Projekt-Partner: MPI für Wissenschaftsgeschichte
Website: http://echo.mpiwg-berlin.mpg.de
The ECHO initiative aims to create an infrastructure to bring cultural heritage on the Internet, and builds up a network of institutions, research projects and other users which provide content and technology for the common infrastructure, with the aim to enrich the "agora" and to create a future Web of Culture and Science. [...] mehr
PEER (Publishing and the Ecology of European Research)
Zeitraum: 11.2008 – 05.2012
Website: www.peerproject.eu
The aim of PEER is to build a substantial body of evidence, by developing an "observatory" to monitor the effects of systematic archiving over time. Participating publishers will collectively contribute 300 journals to the project and supporting research studies will address issues such as: How large-scale archiving will affect journal viability, Whether it increases access, How it will affect the broader ecology of European research, Which factors influence the readiness to deposit in institutional and disciplinary repositories and what the associated costs might be, Models to illustrate how traditional publishing systems can coexist with self-archiving. [...]
SCOAP3 (Sponsoring Consortium for Open Access Publishing in Particle Physics)
Zeitraum: 2006 -
Website: http://scoap3.org
A consortium facilitates Open Access publishing in High Energy Physics by re-directing subscription money. This answers the request of the High Energy Physics community. [...]
SOAP (Study of Open Access Publishing)
Website: http://project-soap.eu
The SOAP project aims to deliver to the European Commission, publishers, libraries and research communities a description and analysis of models of open access publishing, so that these key players may ascertain which model, or combination and variation of models, will enable them to make a smooth transition to open access publishing. [...] mehr
/201884/Projekte

redpajama_set_name: RedPajamaCommonCrawl


I took an early mark from work and attended a Father's Day event at Evie's C&K kindergarten earlier in the year, which was a lot of fun. There were a whole heap of Dad's there which was great to see, playing with their kids, doing activities and eating sausages on bread with sauce! One of the Fathers' Day gifts that Evie gave me was a photo of her dressed up as a Daddy, gorgeous and completely hilarious at the same time – I was pretty chuffed with it as a present!


text:
What is 'structured content'?
Structured content explained
By Maarten van Vulpen / August 24, 2020 August 25, 2020 / Leave a Comment / Blog / 3 minutes of reading
If you think it's hard to explain something like TikTok to your 94-year-old grandmother, try explaining the subject of 'structured content' to your friends. It's a struggle for all of us at Fonto. So here's another try to shed some light on the likes of structured content and the way we make it possible for anyone to create, edit and review it.
First off, this is how Wikipedia defines structured content:
"Structured content is information that is organized in a predictable way and is usually classified with metadata. XML is a common storage format, but structured content can also be stored in other standard or proprietary formats."
https://en.wikipedia.org/wiki/Structured_content
The "classified with metadata" part is important to note here. This classification means that the content is enriched with descriptive information e.g. the name of the author, the date the content was published, the target group of the content, location-specific information, etc.
Structured vs Unstructured content
Most of the content produced nowadays is unstructured. Word processors like Microsoft Word and Google Documents produce unstructured content. With these tools, the author focuses more on the way the content 'looks' rather than on what the content actually 'is'. For example, an introduction is marked as 'bold' instead of 'classified' as an introduction.
In structured content, "molecular", "component-based" or "topic-based" authoring is a fundamental paradigm. At Fonto we call these reusable content-sections "Fragments". As described earlier, each individual fragment is classified with metadata.
Because fragments are stored and managed as separate files, they allow refined work and approval flows. Handling a section of content as a fragment promotes it to a separate asset, which then becomes usable across multiple documents. Because fragments are reused, they increase control over content consistency and quality.
Structured content requires a schema i.e. a set of rules against which the content is validated. This is the so-called XML Schema Definition (XSD). The XSD consists of elements, e.g. an introduction, that are allowed within the content itself, and it defines how the content is structured i.e. where the introduction can and cannot be inserted.
Why structured content?
Structured content is perfectly optimized for single-source and multi-channel publishing, meaning that the content can be created once and published directly, without conversions, to web/mobile (HTML) and print (PDF). This speeds up the publishing process and saves valuable time and costs.
In addition, structured content contributes to efficiency in content creation. The XML format allows for the reuse of fragments, e.g. a 'disclaimer' in a legal document. Instead of copying and pasting this disclaimer multiple times within and between documents, it can be created once and referred to multiple times. When the disclaimer needs to be changed due to new legislation, just the one source fragment needs to be edited. It makes the change process faster and much less error-prone.
You could say that structured content is closer to (machine-readable) data than to prose. Again the example of a disclaimer: with XML content it's easy to determine how many times the disclaimer is used, where it is used and referred to, what languages it is translated in, etc. With unstructured content, you would need a lot more time and a good search engine to get the same result.
Who creates structured content?
Until recently, creating structured (XML) content creation was done by technical writers, using expert (desktop) software e.g. Arbortext, Oxygen XML Author and Xmetal Author. Anyone not familiar with XML would have a hard time working with these tools.
To make structured content creation possible for non-technical writers i.e. subject matter experts, we've created Fonto. Today, thousands of experts worldwide create structured content in a web-based, Word-like interface.
We've opened up the world of structured content creation for experts in aviation, pharma, finance, high tech, defense, legal, publishing and standardization, and we hope to do so in many more verticals.
Maarten van Vulpen
Customer Success Manager at Fonto – Passionate runner and Dad


glory with our floor sanding services.
Welcome to Stockman Timber Floors, the sanding and polishing professionals.
What can Stockman Timber Floors do for you?
For a complete timber flooring service that won't break your budget, we are the name to trust.
The Melbourne floor polishing and sanding experts at Stockman Timber Floors have an outstanding track record of completing work on time and within budget. Using the latest equipment and professional grade products, we can restore your existing timber floors to their original shine, or bring out the best natural appearance in your new floor.
Professional floorboard polishing can add significant value to your home and will last for many years to come if done properly. Talk to us about floor sanding, polishing and coating and get a quote today.
For a FREE quote on your next job, please contact us today. Our pricing is competitive and our work is second to none!


text:
package grpc

import (
	"fmt"
	"math"
	"strconv"
	"sync"
	"testing"
	"time"

	"golang.org/x/net/context"
	"google.golang.org/grpc/codes"
	_ "google.golang.org/grpc/grpclog/glogger"
	"google.golang.org/grpc/naming"
	"google.golang.org/grpc/status"
	"google.golang.org/grpc/test/leakcheck"

	// V1 balancer tests use passthrough resolver instead of dns.
	// TODO(bar) remove this when removing v1 balaner entirely.

	_ "google.golang.org/grpc/resolver/passthrough"
)

type testWatcher struct {
	// the channel to receives name resolution updates
	update chan *naming.Update
	// the side channel to get to know how many updates in a batch
	side chan int
	// the channel to notify update injector that the update reading is done
	readDone chan int
}

func (w *testWatcher) Next() (updates []*naming.Update, err error) {
	n := <-w.side
	if n == 0 {
		return nil, fmt.Errorf("w.side is closed")
	}
	for i := 0; i < n; i++ {
		u := <-w.update
		if u != nil {
			updates = append(updates, u)
		}
	}
	w.readDone <- 0
	return
}

func (w *testWatcher) Close() {
	close(w.side)
}

// Inject naming resolution updates to the testWatcher.
func (w *testWatcher) inject(updates []*naming.Update) {
	w.side <- len(updates)
	for _, u := range updates {
		w.update <- u
	}
	<-w.readDone
}

type testNameResolver struct {
	w    *testWatcher
	addr string
}

func (r *testNameResolver) Resolve(target string) (naming.Watcher, error) {
	r.w = &testWatcher{
		update:   make(chan *naming.Update, 1),
		side:     make(chan int, 1),
		readDone: make(chan int),
	}
	r.w.side <- 1
	r.w.update <- &naming.Update{
		Op:   naming.Add,
		Addr: r.addr,
	}
	go func() {
		<-r.w.readDone
	}()
	return r.w, nil
}

func startServers(t *testing.T, numServers int, maxStreams uint32) ([]*server, *testNameResolver, func()) {
	var servers []*server
	for i := 0; i < numServers; i++ {
		s := newTestServer()
		servers = append(servers, s)
		go s.start(t, 0, maxStreams)
		s.wait(t, 2*time.Second)
	}
	// Point to server[0]
	addr := "localhost:" + servers[0].port
	return servers, &testNameResolver{
			addr: addr,
		}, func() {
			for i := 0; i < numServers; i++ {
				servers[i].stop()
			}
		}
}

func TestNameDiscovery(t *testing.T) {
	defer leakcheck.Check(t)
	// Start 2 servers on 2 ports.
	numServers := 2
	servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	req := "port"
	var reply string
	if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[0].port {
		t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want %s", err, servers[0].port)
	}
	// Inject the name resolution change to remove servers[0] and add servers[1].
	var updates []*naming.Update
	updates = append(updates, &naming.Update{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[0].port,
	})
	updates = append(updates, &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[1].port,
	})
	r.w.inject(updates)
	// Loop until the rpcs in flight talks to servers[1].
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[1].port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}
}

func TestEmptyAddrs(t *testing.T) {
	defer leakcheck.Check(t)
	servers, r, cleanup := startServers(t, 1, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	var reply string
	if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply); err != nil || reply != expectedResponse {
		t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, reply = %q, want %q, <nil>", err, reply, expectedResponse)
	}
	// Inject name resolution change to remove the server so that there is no address
	// available after that.
	u := &naming.Update{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[0].port,
	}
	r.w.inject([]*naming.Update{u})
	// Loop until the above updates apply.
	for {
		time.Sleep(10 * time.Millisecond)
		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
		if err := cc.Invoke(ctx, "/foo/bar", &expectedRequest, &reply); err != nil {
			cancel()
			break
		}
		cancel()
	}
}

func TestRoundRobin(t *testing.T) {
	defer leakcheck.Check(t)
	// Start 3 servers on 3 ports.
	numServers := 3
	servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	// Add servers[1] to the service discovery.
	u := &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[1].port,
	}
	r.w.inject([]*naming.Update{u})
	req := "port"
	var reply string
	// Loop until servers[1] is up
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[1].port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}
	// Add server2[2] to the service discovery.
	u = &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[2].port,
	}
	r.w.inject([]*naming.Update{u})
	// Loop until both servers[2] are up.
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[2].port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}
	// Check the incoming RPCs served in a round-robin manner.
	for i := 0; i < 10; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[i%numServers].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", i, err, servers[i%numServers].port)
		}
	}
}

func TestCloseWithPendingRPC(t *testing.T) {
	defer leakcheck.Check(t)
	servers, r, cleanup := startServers(t, 1, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	var reply string
	if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err != nil {
		t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want %s", err, servers[0].port)
	}
	// Remove the server.
	updates := []*naming.Update{{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[0].port,
	}}
	r.w.inject(updates)
	// Loop until the above update applies.
	for {
		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
		if err := cc.Invoke(ctx, "/foo/bar", &expectedRequest, &reply, FailFast(false)); status.Code(err) == codes.DeadlineExceeded {
			cancel()
			break
		}
		time.Sleep(10 * time.Millisecond)
		cancel()
	}
	// Issue 2 RPCs which should be completed with error status once cc is closed.
	var wg sync.WaitGroup
	wg.Add(2)
	go func() {
		defer wg.Done()
		var reply string
		if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err == nil {
			t.Errorf("grpc.Invoke(_, _, _, _, _) = %v, want not nil", err)
		}
	}()
	go func() {
		defer wg.Done()
		var reply string
		time.Sleep(5 * time.Millisecond)
		if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err == nil {
			t.Errorf("grpc.Invoke(_, _, _, _, _) = %v, want not nil", err)
		}
	}()
	time.Sleep(5 * time.Millisecond)
	cc.Close()
	wg.Wait()
}

func TestGetOnWaitChannel(t *testing.T) {
	defer leakcheck.Check(t)
	servers, r, cleanup := startServers(t, 1, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	// Remove all servers so that all upcoming RPCs will block on waitCh.
	updates := []*naming.Update{{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[0].port,
	}}
	r.w.inject(updates)
	for {
		var reply string
		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
		if err := cc.Invoke(ctx, "/foo/bar", &expectedRequest, &reply, FailFast(false)); status.Code(err) == codes.DeadlineExceeded {
			cancel()
			break
		}
		cancel()
		time.Sleep(10 * time.Millisecond)
	}
	var wg sync.WaitGroup
	wg.Add(1)
	go func() {
		defer wg.Done()
		var reply string
		if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err != nil {
			t.Errorf("grpc.Invoke(_, _, _, _, _) = %v, want <nil>", err)
		}
	}()
	// Add a connected server to get the above RPC through.
	updates = []*naming.Update{{
		Op:   naming.Add,
		Addr: "localhost:" + servers[0].port,
	}}
	r.w.inject(updates)
	// Wait until the above RPC succeeds.
	wg.Wait()
}

func TestOneServerDown(t *testing.T) {
	defer leakcheck.Check(t)
	// Start 2 servers.
	numServers := 2
	servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}), WithWaitForHandshake())
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	// Add servers[1] to the service discovery.
	var updates []*naming.Update
	updates = append(updates, &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[1].port,
	})
	r.w.inject(updates)
	req := "port"
	var reply string
	// Loop until servers[1] is up
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[1].port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}

	var wg sync.WaitGroup
	numRPC := 100
	sleepDuration := 10 * time.Millisecond
	wg.Add(1)
	go func() {
		time.Sleep(sleepDuration)
		// After sleepDuration, kill server[0].
		servers[0].stop()
		wg.Done()
	}()

	// All non-failfast RPCs should not block because there's at least one connection available.
	for i := 0; i < numRPC; i++ {
		wg.Add(1)
		go func() {
			time.Sleep(sleepDuration)
			// After sleepDuration, invoke RPC.
			// server[0] is killed around the same time to make it racy between balancer and gRPC internals.
			cc.Invoke(context.Background(), "/foo/bar", &req, &reply, FailFast(false))
			wg.Done()
		}()
	}
	wg.Wait()
}

func TestOneAddressRemoval(t *testing.T) {
	defer leakcheck.Check(t)
	// Start 2 servers.
	numServers := 2
	servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	// Add servers[1] to the service discovery.
	var updates []*naming.Update
	updates = append(updates, &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[1].port,
	})
	r.w.inject(updates)
	req := "port"
	var reply string
	// Loop until servers[1] is up
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[1].port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}

	var wg sync.WaitGroup
	numRPC := 100
	sleepDuration := 10 * time.Millisecond
	wg.Add(1)
	go func() {
		time.Sleep(sleepDuration)
		// After sleepDuration, delete server[0].
		var updates []*naming.Update
		updates = append(updates, &naming.Update{
			Op:   naming.Delete,
			Addr: "localhost:" + servers[0].port,
		})
		r.w.inject(updates)
		wg.Done()
	}()

	// All non-failfast RPCs should not fail because there's at least one connection available.
	for i := 0; i < numRPC; i++ {
		wg.Add(1)
		go func() {
			var reply string
			time.Sleep(sleepDuration)
			// After sleepDuration, invoke RPC.
			// server[0] is removed around the same time to make it racy between balancer and gRPC internals.
			if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err != nil {
				t.Errorf("grpc.Invoke(_, _, _, _, _) = %v, want nil", err)
			}
			wg.Done()
		}()
	}
	wg.Wait()
}

func checkServerUp(t *testing.T, currentServer *server) {
	req := "port"
	port := currentServer.port
	cc, err := Dial("passthrough:///localhost:"+port, WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	var reply string
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}
}

func TestPickFirstEmptyAddrs(t *testing.T) {
	defer leakcheck.Check(t)
	servers, r, cleanup := startServers(t, 1, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	var reply string
	if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply); err != nil || reply != expectedResponse {
		t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, reply = %q, want %q, <nil>", err, reply, expectedResponse)
	}
	// Inject name resolution change to remove the server so that there is no address
	// available after that.
	u := &naming.Update{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[0].port,
	}
	r.w.inject([]*naming.Update{u})
	// Loop until the above updates apply.
	for {
		time.Sleep(10 * time.Millisecond)
		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
		if err := cc.Invoke(ctx, "/foo/bar", &expectedRequest, &reply); err != nil {
			cancel()
			break
		}
		cancel()
	}
}

func TestPickFirstCloseWithPendingRPC(t *testing.T) {
	defer leakcheck.Check(t)
	servers, r, cleanup := startServers(t, 1, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	var reply string
	if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err != nil {
		t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want %s", err, servers[0].port)
	}
	// Remove the server.
	updates := []*naming.Update{{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[0].port,
	}}
	r.w.inject(updates)
	// Loop until the above update applies.
	for {
		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
		if err := cc.Invoke(ctx, "/foo/bar", &expectedRequest, &reply, FailFast(false)); status.Code(err) == codes.DeadlineExceeded {
			cancel()
			break
		}
		time.Sleep(10 * time.Millisecond)
		cancel()
	}
	// Issue 2 RPCs which should be completed with error status once cc is closed.
	var wg sync.WaitGroup
	wg.Add(2)
	go func() {
		defer wg.Done()
		var reply string
		if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err == nil {
			t.Errorf("grpc.Invoke(_, _, _, _, _) = %v, want not nil", err)
		}
	}()
	go func() {
		defer wg.Done()
		var reply string
		time.Sleep(5 * time.Millisecond)
		if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err == nil {
			t.Errorf("grpc.Invoke(_, _, _, _, _) = %v, want not nil", err)
		}
	}()
	time.Sleep(5 * time.Millisecond)
	cc.Close()
	wg.Wait()
}

func TestPickFirstOrderAllServerUp(t *testing.T) {
	defer leakcheck.Check(t)
	// Start 3 servers on 3 ports.
	numServers := 3
	servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	// Add servers[1] and [2] to the service discovery.
	u := &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[1].port,
	}
	r.w.inject([]*naming.Update{u})

	u = &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[2].port,
	}
	r.w.inject([]*naming.Update{u})

	// Loop until all 3 servers are up
	checkServerUp(t, servers[0])
	checkServerUp(t, servers[1])
	checkServerUp(t, servers[2])

	// Check the incoming RPCs served in server[0]
	req := "port"
	var reply string
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[0].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
		}
		time.Sleep(10 * time.Millisecond)
	}

	// Delete server[0] in the balancer, the incoming RPCs served in server[1]
	// For test addrconn, close server[0] instead
	u = &naming.Update{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[0].port,
	}
	r.w.inject([]*naming.Update{u})
	// Loop until it changes to server[1]
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[1].port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[1].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
		}
		time.Sleep(10 * time.Millisecond)
	}

	// Add server[0] back to the balancer, the incoming RPCs served in server[1]
	// Add is append operation, the order of Notify now is {server[1].port server[2].port server[0].port}
	u = &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[0].port,
	}
	r.w.inject([]*naming.Update{u})
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[1].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
		}
		time.Sleep(10 * time.Millisecond)
	}

	// Delete server[1] in the balancer, the incoming RPCs served in server[2]
	u = &naming.Update{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[1].port,
	}
	r.w.inject([]*naming.Update{u})
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[2].port {
			break
		}
		time.Sleep(1 * time.Second)
	}
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[2].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 2, err, servers[2].port)
		}
		time.Sleep(10 * time.Millisecond)
	}

	// Delete server[2] in the balancer, the incoming RPCs served in server[0]
	u = &naming.Update{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[2].port,
	}
	r.w.inject([]*naming.Update{u})
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[0].port {
			break
		}
		time.Sleep(1 * time.Second)
	}
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[0].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
		}
		time.Sleep(10 * time.Millisecond)
	}
}

func TestPickFirstOrderOneServerDown(t *testing.T) {
	defer leakcheck.Check(t)
	// Start 3 servers on 3 ports.
	numServers := 3
	servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}), WithWaitForHandshake())
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	// Add servers[1] and [2] to the service discovery.
	u := &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[1].port,
	}
	r.w.inject([]*naming.Update{u})

	u = &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[2].port,
	}
	r.w.inject([]*naming.Update{u})

	// Loop until all 3 servers are up
	checkServerUp(t, servers[0])
	checkServerUp(t, servers[1])
	checkServerUp(t, servers[2])

	// Check the incoming RPCs served in server[0]
	req := "port"
	var reply string
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[0].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
		}
		time.Sleep(10 * time.Millisecond)
	}

	// server[0] down, incoming RPCs served in server[1], but the order of Notify still remains
	// {server[0] server[1] server[2]}
	servers[0].stop()
	// Loop until it changes to server[1]
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[1].port {
			break
		}
		time.Sleep(10 * time.Millisecond)
	}
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[1].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
		}
		time.Sleep(10 * time.Millisecond)
	}

	// up the server[0] back, the incoming RPCs served in server[1]
	p, _ := strconv.Atoi(servers[0].port)
	servers[0] = newTestServer()
	go servers[0].start(t, p, math.MaxUint32)
	defer servers[0].stop()
	servers[0].wait(t, 2*time.Second)
	checkServerUp(t, servers[0])

	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[1].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
		}
		time.Sleep(10 * time.Millisecond)
	}

	// Delete server[1] in the balancer, the incoming RPCs served in server[0]
	u = &naming.Update{
		Op:   naming.Delete,
		Addr: "localhost:" + servers[1].port,
	}
	r.w.inject([]*naming.Update{u})
	for {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err != nil && errorDesc(err) == servers[0].port {
			break
		}
		time.Sleep(1 * time.Second)
	}
	for i := 0; i < 20; i++ {
		if err := cc.Invoke(context.Background(), "/foo/bar", &req, &reply); err == nil || errorDesc(err) != servers[0].port {
			t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
		}
		time.Sleep(10 * time.Millisecond)
	}
}

func TestPickFirstOneAddressRemoval(t *testing.T) {
	defer leakcheck.Check(t)
	// Start 2 servers.
	numServers := 2
	servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
	defer cleanup()
	cc, err := Dial("passthrough:///localhost:"+servers[0].port, WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
	if err != nil {
		t.Fatalf("Failed to create ClientConn: %v", err)
	}
	defer cc.Close()
	// Add servers[1] to the service discovery.
	var updates []*naming.Update
	updates = append(updates, &naming.Update{
		Op:   naming.Add,
		Addr: "localhost:" + servers[1].port,
	})
	r.w.inject(updates)

	// Create a new cc to Loop until servers[1] is up
	checkServerUp(t, servers[0])
	checkServerUp(t, servers[1])

	var wg sync.WaitGroup
	numRPC := 100
	sleepDuration := 10 * time.Millisecond
	wg.Add(1)
	go func() {
		time.Sleep(sleepDuration)
		// After sleepDuration, delete server[0].
		var updates []*naming.Update
		updates = append(updates, &naming.Update{
			Op:   naming.Delete,
			Addr: "localhost:" + servers[0].port,
		})
		r.w.inject(updates)
		wg.Done()
	}()

	// All non-failfast RPCs should not fail because there's at least one connection available.
	for i := 0; i < numRPC; i++ {
		wg.Add(1)
		go func() {
			var reply string
			time.Sleep(sleepDuration)
			// After sleepDuration, invoke RPC.
			// server[0] is removed around the same time to make it racy between balancer and gRPC internals.
			if err := cc.Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, FailFast(false)); err != nil {
				t.Errorf("grpc.Invoke(_, _, _, _, _) = %v, want nil", err)
			}
			wg.Done()
		}()
	}
	wg.Wait()
}

redpajama_set_name: RedPajamaGithub


Luxury cars are now evolving to be more sophisticated and smarter than ever before, just like the 2017 Lincoln Continental near Baton Rouge. Numerous upgrades have improved the aesthetic beauty and unrivalled reliability of this sedan.
Posted on December 18, 2016, in Business and tagged 2017, baton, continental, lincoln, rouge. Bookmark the permalink.	Leave a comment.


The ultrabook made a splash at CES 2012 with its ultra-thin form factor, touch screen and longer battery life. Intel touted the ultrabook as the device that would lead the revival of the PC against the onslaught of the tablet. Instead, a series of missteps and a global decline in PC sales kept the ultrabook from fulfilling its potential.
The question now is whether the Ultrabook can bounce back, or if ultra-thin laptops will be squeezed out of the PC market.
In early 2012, analyst firm IHS iSuppli forecast 22 million ultrabook sales by the end of the year. At the time, that prediction was relatively modest. Roughly a year ago, Intel claimed ultrabooks would account for 40% of the laptop PC market by the end of 2012. The company had even set aside a $300 million marketing fund to help meet these expectations.
By October, IHS iSuppli released a new report estimating that ultrabook shipments - not sales - had only reached 10.3 million units. The firm also reduced its prediction for 2013 from 61 million ultrabook sales to 44 million.
However bleak the current situation may seem, Craig Stice, senior principal analyst at IHS iSuppli, says it's too soon to call the ultrabook a failure. Intel's lofty predictions forced many to set the bar pretty high for the ultrabook, Stice says. Falling short of that mark made the ultrabook's struggles stand out in an otherwise equally underperforming PC market.
"I would say it performed as well as the PC market performed as a whole, which was sluggish," Stice says. "The PC market in general - it's looking like 2012 is going to be a down year for computers in general. I'm not saying that ultrabooks can't rebound, because they were pretty much new in 2012, but getting people out and purchasing PCs in general, it was a difficult year for it.
IHS iSuppli estimates that PC shipments declined from 352.8 million units in 2011 to 348.7 million in 2012. It was the first time since 2001 that PC shipments have declined year-over-year.
Pricing was a main deterrent to ultrabook sales last year, Stice says. Early ultrabooks were priced in the $1,000 range. Considering that consumers, many of whom use their devices mostly for web apps, could purchase tablets in the $200 to $500 range, Stice says it simply doesn't make sense for them to pay twice as much for an ultrabook.
Moving into 2013, Stice says ultrabook pricing is beginning to creep down to that competitive level. That's because the past year can serve as a research period for manufacturers, he says. Many of the $1,000 devices were what Stice called "model units" of ultrabooks, and as such they were adorned with "all the bells and whistles."
As manufacturers examine customer feedback and conduct more research on how people are using ultrabooks, they'll be able to reshape the devices and build new ones without some of the more expensive components and parts. This will enable manufacturers to drop the price, Stice says.
In addition to pricing, Stice says PC manufacturers misfired when it came to marketing the devices. While "ultrabook" was an inescapable industry buzzword after the technology received praise at Computex and CES, manufacturers failed to reach the customers who live outside the technology world, Stice says.
This has already started to change, with television commercials introducing the device and its capabilities to mainstream markets. As the ultrabook pushes forward, Intel and PC manufacturers will need to focus on a combination of factors if they're going to successfully convince customers that they're worth buying, Stice says.
Manufacturers would do well to shed some light on their hybrid, or convertible, ultrabooks, which have the best opportunity to appeal to broad markets, Stice says. Those in the market for a notebook computer have most likely come into contact with a touchscreen by this point, or are at least familiar with the benefits of a tablet. However, they've been conditioned to use a QWERTY keyboard for years, and will be more comfortable typing long emails or creating documents in that form factor.
With convertible touchscreen ultrabooks, manufacturers have the opportunity to tell consumers that they don't need to choose between a tablet and a notebook, and can get both with one purchase, Stice says.
Intel appears to have recognized this, scheduling an event at this week's CES 2013 specifically to showcase convertible ultrabooks enabled with touchscreen navigation.
In order for Intel to successfully turn consumers onto touch-enabled convertible ultrabooks, Stice says Microsoft will need to chip in and help educate the public on Windows 8. As a touchscreen-compatible OS, Windows 8 bridged the gap between ultrabooks and the touchscreen, Stice says. If users are going to be expected to navigate the devices, they'll need to become familiar with the Windows 8 interface.
"So now that we've seen Windows 8 out, we're starting to see the advertisements and getting the external kind of push into the marketplace. And I think that needs to continue," Stice says. "They have to continue to give an education of what ultrabook is, how different it is, not just the fact that it's thin and light and small, but what else is out there."
For consumer markets, the ultrabook's battery life is one of the features that will need to be emphasized, simply because it's an easy way to portray the devices' advantage over tablets or other notebooks, Stice says.
"People understand it. It's not a technical term. Seven hours is better than six hours. That catches your eye," Stice says. "If [they're] looking at a choice between a media tablet and now they see this new PC that has fairly comparable battery life or better battery life, that will catch their eye."
As for the corporate markets, Stice says ultrabooks have a great opportunity to capitalize on an increasingly mobile workforce. As the bring-your-own-device (BYOD) approach to corporate mobility has become more common, users have realized what form factors are more conducive to their work day. Those who bought an iPad during its early hype, for example, may prefer the ability to convert the tablet into a notebook when it comes time to upgrade, Stice says.
"There are some advantages that an x86 convertible might have, as far as supporting legacy programs, being fully compatible with what they may be using in their cube or on their desktop or whatever the case may be," Stice says. "Not to say that the iPad isn't, but being able to work on a keyboard and do full-fledged content work on a convertible certainly could be attractive to a lot of users."
If nothing else, the ultrabook's first year on the market will go down as the genesis for further innovation in the PC market, Stice says. Whether the ultra-thin, power-efficient device sold as well as it should have in its first year will be less relevant in the future, when new devices will be designed with inspiration from the early ultrabook's features. Even if the name ultrabook doesn't survive, its influence will remain, Stice says.
"Ultimately that was really what Intel was trying to do, was drive the industry into new innovation and new form factors that are going to better compete. Are there still going to be the brick-style, typical notebooks that we all know and love today? Possibly and likely, from a pricing standpoint those are still relatively inexpensive," Stice says. "But I think going forward, I think we're going to see a lot of push into these thin type of form factors. Whether or not they're branded ultrabook kind of remains to be seen."
Colin Neagle covers emerging technologies and the startup scene for Network World. Follow him on Twitter https://twitter.com/#!/ntwrkwrldneagle and keep up with the Microsoft, Cisco and Open Source community blogs. Colin's email address is cneagle@nww.com.


We have scheduled our next AGS – Accelerated Ground School for fall of 2018 on September 29th and 30th, at the Huntingburg Airport, in the public Terminal building!
What is AGS-Accelerated Ground School?
Accelerated Ground School is a great first step in attaining your goal of becoming a FAA Certificated Private Pilot, by prepping you as a student.
Two major obstacles stand between you and your private pilot's license (PPL).
AGS provides students with the most "bang for their buck and time" to pass the FAA written.
AGS is a 2 day course, taken over one weekend, Saturday and Sunday.
At the conclusion of course and passing of the class exam, the instructor will sign the student off for the written exam to be taken within 3 days.
Studies have shown that the students best probabilities to pass the exam are within 3 days of completing an Accelerated Ground School and being prepared through online practice test's.
Instructor for this course is a FAA certified CFI, from Indianapolis, IN!
Please note that this class is a go, regardless!!
Did you know that you can receive a Purdue Engineering Degree from VUJC, right here in Dubois County?
VINCENNES, Ind. – Students pursuing a baccalaureate degree in engineering will benefit from an expanded formal articulation agreement between Purdue University and Vincennes University.
Also, the new articulation agreement allows for credits earned at Purdue to be transferred back and applied to a VU degree, benefitting students who transfer to Purdue prior to completion of all requirements for a VU associate's degree. This enables the students who earn applicable course credits at Purdue to receive a VU degree, as well.
Specifically, the agreement is between the VU College of Science and Mathematics and the Colleges of Engineering and Agriculture at Purdue-West Lafayette. Faculty at both colleges will evaluate the agreement on a two-year review cycle.
"Many students have transferred from VU to Purdue through the years to pursue science, agriculture, and engineering degrees. This agreement will strengthen the relationship between our universities and ensure that students will benefit from the cooperative transfer process," Wilder explained.
Participating Purdue programs include, but are not limited to: Agricultural Engineering Machine Systems, Chemical Engineering, Civil Engineering, Computer Engineering, Electrical Engineering, Environmental and Ecological Engineering, Environmental and Natural Resources Engineering, Materials Engineering, and Mechanical Engineering.
Students entering an engineering program at VU with the goal of achieving a bachelor's degree from Purdue will have a clearly defined sequence of courses to be completed at VU and then at Purdue. VU recently redesigned its first-year engineering curriculum to provide the same "meta major" experience offered by Purdue, giving students more flexibility in deciding which engineering field they want to pursue. Academic counselors at both institutions will provide coordinated advising to students about accomplishing their engineering educational goals.
"It takes a significant body of work to forge an articulation agreement such as this. It is a credit to the faculty at both institutions to have accomplished this noble effort on behalf of our students," Wilder remarked.
The Dubois County Airport Authority is soliciting information from both tenants and future tenants, to plan for future capacity limitations of existing hangar infrastructure.
Please take a 10 question survey to provide valuable feedback to this decision making process!!
According to a published report by the FAA (Federal Aviation Administration) the Huntingburg Airport is viewed as a General Aviation Airport of National and Regional significance.
The study categorized all General Aviation Airports into four selections: Basic, Local, Regional and National.
The Huntingburg Airport is a Regional Airport, one of only sixteen in the State of Indiana.
"When the FAA indicates the value of one corporate business jet, we finally get recognition for our efforts through the years we deserve with over seven business jets based here".
INDIANAPOLIS (Nov. 21, 2011) – Thirteen sites across Indiana earned the title of 'shovel ready' today, paving the way for businesses to quickly locate new operations on property ready for development.
© 2019 Dubois County Airport Authority. All Rights Reserved.


Behind every strong company is a talented and engaged workforce. Hence, recruitment is one of the most critical practices to ensure a company not only remains healthy and thriving but it drives its course to growth and success. With the continually changing and evolving nature of recruitment like any other aspect of running a business, it is crucial to adapt to these changes with speed and efficiency.
In this guide, we compiled ways on how to interview someone in 5 easy steps to streamline your recruitment process. This is a follow-up to our previous guide, which shows you the 12 Creative Ways to Find Employees Online & Offline.
Recruitment is a highly competitive industry. Speed and efficiency are crucial to find the best candidates, especially since the best candidates are taken off the job market in as fast as 10 days according to OfficeVibe. Furthermore, 45% of global employers reported difficulty in filling roles in 2018 as per ManpowerGroup, which stresses the urgency of finding candidates that fit the job roles you're looking for before they're off the market.
The statistics mentioned show the importance of streamlining your recruitment process. It has also been found out that job interviews are taking longer which also gradually increases time-to-hire. In America, interview processes have grown from 3.3 to 3.7 days. This makes an interview process take up to 22.9 days on average.
Companies are adding screening stages of employers to find the right candidate. These include skills tests, presentations, and group panel interviews, among others, that slow and complicates filling of key roles. Hence, businesses are applying modern recruitment processes with the use of a robust HR software to find the right candidate while saving on resources.
In this guide, we will focus on how to interview someone in 5 easy steps throughout the recruitment process.
Before planning an interview, you should already know what role your company needs to fill in. From here, you can proceed with your recruitment process by identifying the job description or specification you are seeking. This helps you determine what skills and experiences required for the position and how you will publicize its availability.
First of all, you should take a look at your current talent pool if there are no qualified internal candidates before proceeding to look at new candidates. Hence, it is important to notify your current employees of the opening. This will save you time and resources for the recruitment, onboarding, and training of a new hire.
When it comes to posting your job applications, there are various channels you can tap into—local newspaper classifieds and online campaigns on your company's website and social media platforms. Targeted recruiting ads are among today's modern recruitment trends which streamline the recruiting ads shown to relevant job searchers of a specific industry. HR software services can help in placing your ads to the right job seekers with the right skills and experiences.
By having all of this figured out, you can shortlist the most relevant questions that will clearly tell you what you need to know about the candidate based on skills, potential cultural fit, and job fit. To make sure the interview you'll conduct is effective, it's recommended to track your previous data over time such as which questions (and responses) helped you land your best employees.
What is/are your greatest achievement/s at work? Goal: It reveals the candidate's values and priorities.
What is the work environment in which you will most effectively contribute to? Goal: It helps you see if the candidate matches with your culture and work environment.
What major obstacle did you encounter that stood in the way of your goal? How did you approach or overcome it? Goal: It shows you a clear picture of the candidate's problem-solving style and what he or she considers an obstacle.
What interests you about the position? / What pushed you to apply for the job? Goal: It reveals what motivates the candidate and helps you assess if it's congruent to the position.
If employed, what is the reason for leaving your current employer? Goal: It tells you the candidate's goals, outlook, values, and needs from the employer and gives you an idea of what factors might potentially make the candidate leave your company—if hired.
Using an HR software is one of the first steps you should have for your workforce processes. HR software can help you from each phase of the hiring process: from human resource planning and recruitment phase to employee selection. As mentioned, speed and efficiency are crucial in recruiting and an HR software is effective in speeding up your processes so you or your HR can focus on choosing the right candidates to fit the role. In fact, the software can efficiently gather data from your previous interviews and help you with posting job vacancies.
Bamboo HR is a Human Resources Information System (HRIS) designed for small and medium businesses that are transferring from using spreadsheets in managing employee data to an intuitive online solution. It has ATS or applicant tracking system to help you reach the right candidate more effectively. This streamlines tracking, sharing, and evaluating applicant information. The tool also simplifies posting job openings and creating hiring teams who can collaborate for the task. It makes communication fast and efficient and gives ATS reporting to better understand your applicant funnel. In the candidate's perspective, they will find mobile-friendly job postings convenient and accessible, especially in filling out their application. You can test drive the platform when you sign up for Bamboo HR free trial here.
Freshteam is an applicant tracking system specifically designed to help employers, hiring managers and recruiters to find quality candidates. With recruiting as the software's primary focus, it is a one-stop-shop for your hiring needs with features designed to streamline the recruitment process effectively. For instance, its dashboard keeps track of applicants and reminds panel members for submission of interview feedback. It also personalizes candidate engagement, enables the hiring team to collaborate, builds a candidate database, and empowers you to make data-driven decisions. Sign up for Freshtream free trial here to use the platform at no cost for 21 days.
Gusto HR, an online HR service, gives you a robust onboarding solution. While the software focuses on its payroll solutions for HR, it packs a rich set of features for welcoming your new hires and managing your current employees. It has a self-onboarding feature where all you have to do is add basic info of the new employee such as their name, email, and salary. You can then choose the documents the new hire needs to fill out and send them an invite to self-onboard. It offers e-signature for documents such as W-4s and I-9s to expedite the process. If you want to explore the product, you can sign up for Gusto HR free trial here.
If you're looking for a simple employee evaluation software, Trakstar is a reliable HR solution you can use. The tool helps you post job openings and develop a career page to streamline finding the right candidate. It has an applicant tracking and searching feature where you can quickly determine the right candidates with customized workflows and personalized questionnaires. Collaboration with colleagues also empowers a unified hiring decision by sharing notes, creating and delegating tasks, and distributing interview thoughts to find the candidate who fits with what you're looking for best. You may sign up for Trakstar free demo here to learn more about the software according to your business needs.
Zoho People is a cloud-based HRMS that handles your HR processes from onboarding to appraisals. The tool's employee database management system helps you organize and centralize employee records in a single location right from onboarding. When onboarding, it has a document management solution that takes care of sending, managing and sharing of documents. It also supports a collaborative workplace for employees to help and get involved in your hiring process. If you want to test the platform's features, you can sign up for Zoho People free trial here.
JungoHR is ideal for companies that wish to take advantage of an HR system with an HRIS to simplify and centralize all their HR processes. Repetitive and mundane activities, such as filing and approving of leave requests, employee onboarding, payroll, and recruitment can all be automated to help you focus on more pressing matters. Aside from helping HR departments improve their operational efficiency, JungoHR supports multi-carrier connectivity for small to large enterprises. It is also equipped with a robust benefits management system that neatly organizes all available plans in a single hub for easy tracking and enrollment.
If you want to explore more options, you can take browse through the top 20 HR software solutions of 2019. The list is prepared by our team of experts who looked at the leading products that garnered impressive ratings for their features, value and functionality.
Screening interview. This is the first interview in the hiring process that is conducted to determine the candidate's qualification. For some companies, this is done through open interviews where multiple candidates are screened at an open hiring event.
Phone interview. This narrows down the pool of applicants to be invited for in-person interviews. It doesn't just limit to phone interviews as this may be conducted through a Skype or video call for remote applicants.
First interview. The first step in the in-person interview where the applicant converses with you, the employer, or your hiring manager one-on-one. This is where you'll ask your questions about the candidate's availability, qualifications, skills and work history.
Second interview. This is a more in-depth one-on-one interview for candidates that are in serious contention for the position. This may include meetings with the company staff such as the management, executives, staff members, and company employees.
Third interview. In some companies, further interviews are conducted which involves a final meeting with the hiring manager or a final interview. You can also use this opportunity to introduce the candidate to his or her prospective colleagues.
Not all companies follow these steps. Some may have simpler steps while others may have more complicated ones. For instance, others conduct a dining interview where job applicants are interviewed by the hiring manager in a more relaxed manner. Regardless of the process you are following, this is the most crucial stage as this is where you will start to look at who to hire and who to reject based on who qualifies best for the position.
Finally, in this guide of how to interview someone in 5 easy steps, you have reached the point of assessing the candidates. This can be interchanged with the interview steps mentioned above for each stage. This is where you'll take into consideration the candidate's skills, potential, experience and answers to your questions.
Depending on the skills you prioritize, you can use interview questions to assess the candidate based on their decision-making skills, interpersonal skills, management skills, planning skills, and motivation, among others. Some companies use a candidate evaluation form to streamline and expedite the process. This usually includes sections to determine if the candidate's qualifications for the position based on the interview. Under each section is an evaluation if the candidate exceeds, meets, or doesn't meet the requirements or if they need more training.
Review feedback information from the interview team.
Check the performance feedback from the candidate's former managers and supervisors, if available.
Assess the candidate's potential fit with your company culture.
Determine if the potential employee can do the job with appropriate training and mentoring.
Evaluate if the candidate can add overall personal or strategic value to your workplace.
You may also check out the 10 tips for effective corporate time management to help you save time in your workflows and processes.
In this article, we covered easy steps on how to effectively interview applicants for your available position. Finding and hiring the right candidate takes time and energy. It also helps to get your employees involved as well as they can provide crucial feedback information that you may have missed.
Creating a transparent communication for your company is essential. This is done by making your employees aware of what is going on in the company and letting them have an impact on decisions that affect their jobs, including the recruitment of a new applicant especially as they will work with him or her every day. Employees can assist from reviewing the resumes and qualifications of candidates as well as assessing their potential fit with the company. Employee involvement also shows their commitment to helping the new employee succeed.
If you think this is time-consuming, using an HR software optimizes this process. These solutions offer robust collaboration tools that streamline communication with your teams. For instance, products such as Freshteam, Trakstar, and Zoho People support a collaborative workplace that engages your employees in crucial decision-making processes of your company.
After you find the new employee you're looking for, you will need just as much time and energy to ensure he or she will succeed as they integrate into the company. This is where proper onboarding becomes vital. Welcoming your new employee entails the onboarding process which is another set of steps that involves acquiring, accommodating, assimilating, and accelerating.
Preparation of physical space ready including office tools, computer, and software systems.
Gathering of personal information—name, social security number, and address, among others, from the application.
Co-creation of onboarding plan with the employee regarding the job, deliverables, and 100-day action plan, among others.
Notification of support departments such as HR, IT, and payroll about the new hire.
Adding the new employee to distribution lists prepared by IT.
Introduction to the new employee's team or department.
Orientation and training for the job role.
If you are using HR software, its purpose is used beyond the recruitment process. HR tools, such as Gusto HR and Zoho People, include modern onboarding features. They take care of the paperwork collected from the employee like social security number, home address, date of birth, and bank account information. It also handles the collection of signed W-4 and I-9 forms with e-signature options. This reduces the time it takes in filing a single position and optimizing the process.


Opportunity for a Nursery Nurse in Hillingdon to start in a role after the Easter break.
Seven Education is looking for a Nursery Manager to work as a permanent member of staff within an established and Nursery & Pre-school in Stockport.
We now seek to appoint a full-time Assistant Teacher/Nursery Nurse for Little Chepstow Nursery for a September start.