text:
How often should we conduct a performance review meeting?
Nowadays, the performance assessment meeting represents a common practice that is, no longer, an uncomfortable event for either the employer, or the employee. Now that each party is familiar with this activity, the next arising matter regards how often should it be conducted? The frequency rate must take into consideration aspects that will enhance employee performance and also favor company and leaders' resources.
- One annual meeting
Once the need for performance assessment meetings has been acknowledged, it generally starts with a frequency of occurrence of once per year. Having one annual performance review meeting with the company's employees can be effective but it can also become an obstacle in reaching the desired performance results.
In the context of a very dynamic business environment which is continuously growing, developing and changing, a once a year performance review meeting means that employees will pursuit objectives which might be outdated in comparison with the company's current aims. Ineffectiveness might also occur when an employee, who is not on the right track towards achieving performance, will not be able to reestablish himself on the right course earlier than within a year. This is due to the absence of feedback and a clear overview, elements which are normally established during performance review meetings. These are the risks and the threats that may interfere when assessment meetings are conducted no earlier than once a year.
Nevertheless, there can also be contexts when a once a year performance assessment leads to reaching the desired performance results. This is the case when a rolling business has reached a stable state which is to be maintained: changes are few and rarely interfere with the strategic goals. A once a year performance evaluation, in such a context, may be more effective as the path needed to be followed is clear and arises from the previous performance cycles.
- Biannual meetings
Another approach of the frequency of performance assessment meetings is the biannual one which takes place twice a year, at the beginning/end of the year and at its middle. This approach maintains the employees more frequently updated on how they are performing in relation to the set objectives and also what is expected from them. When assessment meetings are conducted accordingly to performance standards, feedback during such an encounter stimulates employees' motivation. Through a biannual performance review meeting, employees' motivation for their work activity is being maintained at a higher levels. In addition, updates, changes, business goals and individual objectives are constantly aligned.
One inconvenient of conducting a twice per year review meeting is that leaders have to double their investment in resources like time, preparation in advance and, of course, rewards allocation. Efforts of these investments will, however, be compensated further on by employees who are motivated and eager to perform.
- Quarterly meetings
The last approach presented concerns assessment meetings included in a quarterly schedule, or every three months. For an employee, to be evaluated every three months means to continuously receive feedback. Additionally, because every feedback is constructive during performance meetings, the output expected from employees is to become more and more performance-oriented.
However, every three months evaluations can lead to two decisively opposite paths, depending on the context and manner of conduct. For example, in cases where deadlines are not tight and the business is not visibly changing, employees will feel like being held under constant surveillance, rather than being appreciated for their efforts. On the opposite side, when quarterly review meetings are performed in the context of a very dynamic business with employees who are working strictly on projects, a performance evaluation meeting comes as additional support and guidance to ongoing development activities.
There isn't any perfect recipe regarding how often a review meeting should be conducted. However, leaders should constantly take into consideration the dynamics of the business they are running, together with the organizational culture. They have to know their employees and what would make them feel awakened, aware of the input they are bringing to the company. Once the frequency of the performance review meetings has been decided, the next relevant steps are to clearly and transparently communicate this decision to employees and to assure an open framework during performance discussions.


text:
- Late 19th century (Creation)
Level of description
Content and Structure
Scope and content
Tapestry woven floral rug in acid colours featuring a flower-filled central medallion on a red and orange background with similar serpentine floral border. "8037 A7" stencilled on reverse.
Appraisal, destruction and scheduling
This material has been appraised in line with Glasgow School of Art Archives and Collections standard procedures.
System of arrangement
Name of creator
Physical Description and Conditions of Use
Conditions governing access
Conditions governing reproduction
Language of material
Script of material
Language and script notes
1 carpet sample. Very good condition.
Dimensions: 1370 x 1830 mm

source: m-a-p/FineFineWeb


In line with the announcement of the start of Ramadan, our offices opening hours will remain the same. However, please note that reduced government office opening times may have an impact on order timings. Please get in touch for more information.
Attesting Russian Documents For The UAE
The attestation of Russian Documents can be quite a complicated process and varies depending on the type of document you wish to attest. The general process for all documents is detailed below.
How It Works
 - Send us your documents or have them collected by our specially allocated couriers.
 - We'll have them sent safely to Moscow, Russia, where four things will happen:
 1. The document will be sent to the Ministry of Justice where a stamp of authentication will be applied.
 2. Then, your document will be sent to the Ministry of Foreign Affairs, where another stamp will be applied.
 3. Thirdly, your document will be sent to the UAE Embassy in Moscow, where a Certificate of Legalisation will be added to the front page.
 4. Fourth, your document will be translated from Russian into Arabic, and subsequently notarised for acceptance in the UAE.
 - Finally, your document will be returned to the UAE and attested at the Ministry of Foreign Affairs (MOFA), before being sent back to you (or anywhere else you might need), safe and sound.
This process is the same across the board, though there can be some differences depending on the type of document you're trying to attest. For example, in the case of a Degree Diploma, it is often necessary to send the original copy of the completed degree to us before it can be attested. If it isn't possible for you to get the original copy though, it isn't a problem. We can help you legalise the copy of the Diploma, though there will be an extra charge.
In terms of the translation, costs will vary depending on the number of characters needing to be translated on your document. Please contact us for more information.
Request a Quote
Click the "Request a Quote" button above, or click here to be taken to our quote page. We aim to get back to you as soon as possible.
Why Vital Certificates?
As you can see, attesting a document can be quite complicated! Not to worry. Vital Certificates can handle the attestation process from end-to-end, regardless of the type of document you're trying to attest, which means you can sit back, relax and let us do the work.
We've helped thousands of clients have their documents attested, and haven't once had a document rejected in the UAE. Using our UAE attestation service gives you complete peace of mind and ensures that you get what you require in a timescale to suit your needs. Our staff are in constant contact with our legalisation partners in Russia, and as such are fully aware of the steps required to make sure your attestation goes smoothly.
Client Feedback
"This morning I received my attested documents back from you. They arrived by courier.
Firstly, I was very cautious about sending both my Russian wedding certificate and son's Kazakh birth certificate to you for UAE attestation services. The absolute difficulties and expense that could occur from trying to obtain replacement certificates should they have been lost is just simply incalculable. Anybody who has lived within these former CIS states will absolutely understand the challenges faced by anyone trying to obtain copies of original certification, let alone someone living outside these nation states. My fears were unfounded. You delivered prompt, efficient service and from start to finish the process took 29 days. This includes the courier time from when I sent the documents to your office in UAE from Thailand to me receiving the attested documents back in my hands.
Thank you again for your prompt, efficient service."
Jonathan Lettington - Dubai, UAE


A subspace of $\mathbb R^n$ is compact if and only if it is closed and bounded in the Eulidean Metric or Square Metric or $l_1$ metric.
Is my statement correct?
Actually the statement - "A subspace of $\mathbb R^n$ is compact iff it is closed and bounded in the Euclidean Metric or Square Metric" was given in Mukresh. I think closed and bounded set in the $l_1$ metric would also be compact. As the topologies of three are same.
Am I correct? Please correct me if I am wrong.
 - 3
 $\begingroup$ Yes, the $\ell_1$ metric is equivalent to the euclidean metric. This follows from simple arithmetic inequalities. Moreover, there is only one norm-induced topology on R^n. $\endgroup$ – Lorenzo Quarisa Apr 8 '18 at 12:45
 - $\begingroup$ I did not get you _USER_...All I want to know is whether my statement is correct or not. $\endgroup$ – cmi Apr 8 '18 at 12:50
 - 1
 $\begingroup$ The only compact subspace of $\mathbb R^n$ is the trivial subspace (consisting solely of the zero vector, one point). I'm concerned that you meant to ask about characterizing which subsets of $\mathbb R^n$ are compact rather than which subspaces are compact. But the statement is true (what applies to all subsets certainly applies to subspaces). $\endgroup$ – hardmath Apr 8 '18 at 12:56
 - $\begingroup$ yes..You are correct..But why Mukresh used Subspace?_USER_ $\endgroup$ – cmi Apr 8 '18 at 12:59
 - 1
 $\begingroup$ Context matters. If one speaks of Euclidean space $\mathbb R^n$, most often one is thinking about it as a vector space that has a topology. In a general topology text one may instead think of the subsets of a topological spaces as inheriting a subspace topology, so I'm open to the author using "subspace" to mean topological subspace rather than vector subspace. $\endgroup$ – hardmath Apr 8 '18 at 13:04
As the topologies induced by the $\ell_1, \ell_2$ and $\ell_\infty$ metric are the same on $\mathbb{R}^n$, closedness under one of them is equivalent to closedness under any other of them.
Also, all these metrics are related by inequalities:
$d_1(x,y) \le d_2(x,y) \le \sqrt{n} d_\infty(x,y); d_\infty(x,y) \le d_1(x,y)$ etc. so that boundedness in one of them also implies boundedness in all others.
So the compactness characterisation holds in all 3 of the metrics, in fact in any metric derived from a norm. The topology being the same is not enough, as the truncated metric $d_{t}(x,y) = \min(d(x,y), 1)$ induces the same topology as $d$ does, but in $d_t$ all sets are bounded, while this need not hold for $d$. So one does require an argument to see that the combination of closedness and boundedness for a specific metric is preserved.
Your Answer


Take the 2-minute tour ×
Have shapefiles for provinces in several countries in an Asian region, but currently trying to plug in animal population data for each province with graduated symbols displayed the data. Am trying to work off a Microsoft Excel Chart that I have made with the data (basically with one row for provinces and the other row for populations)- however, importing via a delimited text layer isn't working. I'm pretty new to GIS, and am wondering if there as an elementary error I am making - do I need to enter vector data for each province in my excel file before these will display? Is there an easy way to elicit this from the shapefile(s) that I have that display the provinces in the country?
Thank you so much for your time - I'm trying to learn this as well as I can!
share|improve this question
1 Answer 1
Try reformatting the file so it's columns instead of rows (im assuming this is how the attribute data is organised in the Shapefile?) make sure the field names:
 - Don't contain spaces
 - Are less than 64 characters
 - Special characters (stick to letters)
Arc doesn't like these.
Now what you want to do here is use the 'Add Join' function (located in the Data Management toolbox) to link the Excel Spreadsheet table to your Shapefile. The tool will add animal population data to the shapefile attribute table, assuming that the you join by country names and the country names match up exactly.
I would explain how to use the tool but i think the official documentation will do a better job than me! : _URL_
share|improve this answer
Your Answer


text:
- Clean the outside of the pipette using a soft lint-free cloth and 70 % EtOH.
- Complete Order Form/Decontamination Report carefully and place the printout in the package with the pipette(s). List all the pipettes being sent in for service, and the accompanying extras, such as other brand tips and chargers. Be sure to decontaminate the pipette if it has been used for any blood or serums, body fluids, pathological specimens, carcinogens, toxins, hazardous chemicals or radioactive substances.
- Pack the instruments, and accompanying accessories with suitable packaging material to prevent the contents from getting damaged during transportation. Include the completed Order Form/Decontamination Report.
- Address the package.
- Dispatch the package.

source: openbmb/Ultra-FineWeb


text:
You will need this approval to construct a dam or interfere with a water course to dam water. Approval can be grant by either:
- a development approval under the Planning, Development and Infrastructure Act 2016
- a permit under the Landscape South Australia Act 2019
Approval via development approval is required in the following circumstances:
- the dam wall has a height of more than three metres above the natural surface of the ground and/or where the dam is to have a capacity great than five megalitres;
- a levee or mound is constructed in an area shown in the Development Plan as being subject to flooding; and
- retaining walls are to be constructed which retain a difference in ground levels greater than one metre
Where development approval is not required a Water Allocation Permit and/or Water Affecting Activity Permit must be sought and obtained from the relevant regional Natural Resources Management Board.


text:
A Method for Evaluating the Quality of Financial Decision Making, with an Application to Financial Education
NBER Working Paper No. 20618
We introduce a method for measuring the quality of financial decisions built around a notion of financial competence, which gauges the alignment between consumers choices and those they would make if they properly understood their opportunities. We prove our measure admits a formal welfare interpretation even when consumers suffer from additional decision-making flaws, known and unknown, outside the scope of analysis. An application illuminates the pitfalls of the types of brief rhetoric-laden interventions commonly used for adult financial education: they affect behavior through unintended mechanisms, and hence may not improve decisions even when they perform well according to conventional metrics.
Document Object Identifier (DOI): 10.3386/w20618
Users who downloaded this paper also downloaded* these:


Why Do My Legs Itch When I Run?
Although it might sound odd to talk about an allergy to cold temperatures or an allergy to exercise, these conditions do actually exist. In fact, these conditions are among the most common causes of itchy legs while running. As you run around town or on a treadmill, you might experience an itchy sensation spread across your legs. Although your itchy legs might be caused by the exercise itself, they might be caused by allergies.
Urticaria
According to FamilyDoctor.org, exercise-induced urticaria is "a condition that causes hives and other allergic symptoms. It can occur during or after exercise." The condition commonly appears during or immediately after vigorous exercise, such as running. The runner develops raised, red bumps on the skin (hives). As the hives spread, the skin looks red and blotchy and becomes extremely itchy. Although the condition is quite bothersome, it is not life-threatening. In fact, the symptoms of urticaria typically dissipate within 10 minutes of the end of your run.
Anaphylaxis
If you notice additional symptoms while running, you may have a more serious condition known as exercise-induced anaphylaxis. In addition to the itching hives, runners with this condition might also experience difficulty breathing, vomiting and fainting. If you continue running despite these symptoms, the condition might block the flow of oxygen to your heart and brain, resulting in death. For some people, the condition is triggered simply by vigorous exercise. For others, the condition is triggered by a combination of exercise and a specific food. According to MSNBC, there have only been 1,000 documented cases of exercise-induced anaphylaxis between 1970 and 2008, with only one death occurring from those cases.
Cold Allergy
If you only notice itchy legs while running in cooler temperatures, you might have a condition known as "cold urticaria," or an allergy to cold temperatures. The symptoms of cold urticaria are quite similar to those of exercise-induced urticaria, including red, itchy hives that spread across the skin. If your hands are uncovered, you might also notice swelling in the hands. People with severe cases of urticaria might develop more serious symptoms, such as chills, racing heartbeat, swelling of the limbs and fainting. According to the Mayo Clinic, the exact cause of cold urticaria is still unclear, as of 2010. Some people simply have allergic reactions to cold temperatures.
Circulation
In some cases, itchy legs while running might simply be caused by a lack of running. If you have not been running or exercising much lately, the capillaries in your legs collapse slightly. However, once you begin exercising again, your legs require an increased supply of blood. As the flow of circulation to this area increases, the capillaries in your legs must expand to allow for more blood flow. As these capillaries expand, the nerves surrounding them send "itchy signals" to the brain. Fortunately, these symptoms typically stop after a few days of regular running.
Prevention
Fortunately, exercise-induced anaphylaxis is the only life threatening cause of itchy legs while running. Allergies to exercise or cold temperatures are non-life threatening, except in very serious cases. However, to ensure your safety and comfort, there are certain techniques you can take to prevent itchy legs while running. Warm up and cool down for at least 10 minutes before and after your workout. If necessary, take short breaks throughout your run and allow your body to cool down and relax. If you are allergic to cold temperatures, dress in layers and cover any exposed areas of the skin while running. In the case of exercise-induced anaphylaxis, it might be necessary to adopt a less strenuous exercise, such as swimming.
REFERENCES & RESOURCES
Load comments
PARTNER & LICENSEE OF THE LIVESTRONG FOUNDATION
Copyright © 2019 Leaf Group Ltd. Use of this web site constitutes acceptance of the LIVESTRONG.COM Terms of Use , Privacy Policy and Copyright Policy . The material appearing on LIVESTRONG.COM is for educational use only. It should not be used as a substitute for professional medical advice, diagnosis or treatment. LIVESTRONG is a registered trademark of the LIVESTRONG Foundation. The LIVESTRONG Foundation and LIVESTRONG.COM do not endorse any of the products or services that are advertised on the web site. Moreover, we do not select every advertiser or advertisement that appears on the web site-many of the advertisements are served by third party advertising companies.


Edit Article
Two Methods:Playing Slender in Classic ModeUnlocking Other Modes
If you've downloaded the indie survival horror game, Slender: The Eight Pages, you may find it to be difficult to complete. Not to fear! This article will provide you all the steps you will need to beat the game and triumph over the Slender Man. No security blanket, night light, or pacifier needed.
Method 1 of 2: Playing Slender in Classic Mode
 1. 1
 Google a map of the Slender forest on the Internet. Since you're already on this page, one can be found here. Memorize it till you're certain you'll be able to navigate your way through it. There are 10 unique landmarks, and 8 notes spread randomly amongst them.
 - There being 10 locations ensures a different game each time. Not finding a note where you expect to find one (if you've been counting on it) is the easiest way to lose the game.
 2. 2
 Start the game. Slender Man will not appear before you attain the first note, so use this to your advantage. Turn off your flashlight during this period to save the batteries. It will eventually shut off if you take too long. You may like to spend this "down time" checking out the landmarks beforehand to find out where the notes are positioned.
 - However, you're not allowed to dilly-dally as long as you please. The longer you take between pages, the harder the game will get. You'll know when this initial grace period is over when you hear a stomping sound in the background.
 - The same sound is heard when you do collect the first page.
 3. 3
 Obtain the note in the bathroom at the centre of the map first. This, in theory, saves you from being ambushed or trapped by Slender Man later. If it's not there, simply continue onwards.
 - Getting the center out of the way is your best bet. That way, you don't have backtrack at all throughout the game and can work on the outside of the circle. Slender Man can only kill you if you look at him and he is always behind you. Never turn around, never see Slender Man. Simple as pie.
 4. 4
 Take a circular route around the map going out from the bathroom. This reduces the time it takes between notes. Following the main path is a good way of keeping your bearings.
 - The game will be measuring your sanity level and stamina. Sprint too often, your stamina goes. Lose your cool, your sanity level drops, and the game will be over. Eliminating time between notes and going as quickly as possible doesn't give your levels time to drop in the first place.
 5. 5
 Remember that Slender Man gets faster and faster. His stalking grows more frenzied for every note you collect. You'll want to keep the flashlight on after about 3, so if and when you turn around, you can immediately double back as soon as you see him.
 - The music in the background will get more and more intense as you collect notes. To get around this, just hit your mute button. It can be awfully distracting (which is the point).
 6. 6
 Be on super alert after the 5th note. If you do see him, line his face up with an object, so you can only see his arm or leg. When he's on the screen, he won't move. Then back away until you're out of range. Then get outta there!
 - After about 5 notes, he will be right on your tail almost constantly. Peeking at him when he is so close will get your character'scared' and allow you to sprint very fast. Use this to dash towards the last note/s, but know that it will wear your character out.
 7. 7
 Don't look behind you when you have 6 pages (unless you have the guts to do so!).[1] Slender Man will be right behind you and if you turn around, he will kill you. So keep sprinting until you find the last note.
 - This is why the bathroom is such a pain in the rear end. If you leave it for later, you'll be constantly turning around, trying to get out of it. You're as good as dead.
 8. 8
 After you collect all 8 notes, stand around until the game ends. Depending on your version of the game, you will have unlocked a different mode -- a cruel, circular hell for the non-existent player in the game. "Beating" the game is sort of a misnomer; you simply get out of the level you were in before.
Method 2 of 2: Unlocking Other Modes
 1. 1
 Unlock "daytime mode" in version 0.9.4. After collecting all the pages from the first mode, you'll "wake up" in the daytime. It probably sounds easier, but it's not. You don't have to worry about your flashlight, but everything else is just as intense.
 - After "daytime mode," unlock "$20 mode." Again with version 0.9.4, if you beat daytime mode, you'll reemerge after the credits once again in the dark. Beating this mode is no different from the standard version except for the fact that you'll hear 20 Dollars by Ron Browz playing in the background.
 - The reference to this is that some believe that if you give Slender Man $20, he won't kill you. Cheap date, huh?
 - You can select these modes in the options screen and you can play both simultaneously, if you'd like.
 2. 2
 For version 0.9.5., unlock "MH mode." This will run like a video from Marble Hornets on YouTube, using the entry format. The music is slightly different, the static is more prominent, and it runs like a prerecorded video. Once you get past this, you can then move to daytime mode and $20 mode.
 3. 3
 For version 0.9.7., unlock Marble Hornets mode first. It's only a slight name change (MH is one in the same, really). $20 mode was removed due to copyright infringement.[2]
 - You also have the options of using a crank lantern and a glow stick. What's more, you can pause the game as long as there isn't static on the screen. The more and more pages you collect, the less you can see. Fog will start rolling in, too.[3]
 - There are also more links in the menu, leading to forums and extra resources, etc.
 - Keeping in constant motion will prevent the likelihood of Slender Man taking you from behind.
 - Print out the map if you can't memorize it.
 - Conserve battery life; turn it off for the first few pages.
 - If your game is running slowly, decreasing the graphic resolution will speed things up.
 - Sprinting when scared (i.e. when Slender Man appears close to you) will make you go very fast, but also reduce the maximum stamina of the character. Only use on the last few notes.
 - Slender can't move if you watch him. But you can only watch from a very far distance. Don't use this as a strategy tactic; just keep it in mind.
 - Make sure you don't look at the ground. You won't see anything and the chances of Slender Man attacking will increase.
 - Start running when you have 4 pages. Slender man is more likely to teleport when you are walking.
 - Your distance (and whether you have your flashlight on) decide how long you can stare at Slender Man for.
 - Don't spam the shift key, the README.txt states that as of V0.9.7, clicking the shift key immediately deducts 5% of your stamina. Just hold the key if you would like to jog/sprint.
 - If there's a page in the bathroom complex, there usually isn't a page in the tunnel. Use this tip to avoid wasting time and battery life on your flashlight.
 - If you want to fully understand the story behind Slender Man, watch the film.
 - Don't play the game with headphones on.
 - Don't do it in the dark whilst home alone.
 - Don't start thinking Slender Man is real. He's just a character in a story.
Things You'll Need
 - Slender: The Eight Pages downloaded
 - A computer
 - A map of the Slender forest (optional)
Article Info
Categories: Multi Platform Games
In other languages:
Português: Completar Slender: The Eight Pages, Deutsch: Wie man „Slender: Die acht Seiten" durchspielt, Italiano: Sconfiggere Slender, Español: pasar Slender: The Eight Pages, Русский: пройти игру Slender: The Eight Pages, Bahasa Indonesia: Menamatkan Game Slender: The Eight Pages, Français: terminer le jeu Slender: The Eight Pages
Thanks to all authors for creating a page that has been read 152 times.
Did this article help you?
Yes No
an Author!
Write an Article


text:
The following changes have been demonstrated to take place in the blood of dogs during exercise.
1. An increase in the per cent of cells and hemoglobin in the blood of the jugular vein occurs early in the course of exercise. It probably results from a redistribution of red corpuscles, with an increase in their proportion in the peripheral blood.
2. As exercise is continued, there is a definite increase in plasma volume.
3. A coincident decrease both in the total cell volume and the pigment volume during prolonged exercise suggests that blood destruction then occurs.


text: In this research, we have used a combination of hyperspectral imaging and mathematical processing techniques to isolate a fluorescence signal from autofluorescence background. We have designed a hyperspectral excitation-scanning imager that has been used to image multiple fluorescence signals in mouse models in the presence of high autofluorescence background. Visualization, analysis, and classification software has also been designed to allow separation of fluorescence signal from autofluorescence background and discrimination amongst multiple fluorescence signals of interest. This presentation will include a summary of the current hyperspectral imager design, optimization and construction as well as a description of the visualization, analysis, and classification methods implemented. Finally, a discussion of current applications and possibilities for translation of hyperspectral technology to the clinical imaging arena will be presented.


text:
BACKGROUND: In addition to contemporary lifestyle factors that contribute to the increased obesity prevalence worldwide, early nutrition is associated with sustained effects on later life obesity. We hypothesized that physical properties of dietary lipids contribute to this nutritional programming. We developed a concept infant formula (IMF) with large, phospholipidcoated lipid droplets (Nuturis; Danone Research, Paris, France) and investigated its programming effect on metabolic phenotype later in life.
METHODS: Male C57BI/6j mice were fed a control formula (Control IMF) or Nuturis (Concept IMF) diet between postnatal day (PN)16 and PN42. All mice were subsequently fed a Western-style diet (WSD) until PN126. Body composition was monitored repeatedly by dual-energy X-ray absorptiometry between PN42 and PN126.
RESULTS: Concept IMF slightly increased lean body mass as compared with Control IMF at PN42 but did not affect fat mass. Upon 84 d of WSD feeding, the Concept IMF group showed reduced fat accumulation as compared with Control IMF. In addition, fasting plasma leptin, resistin, glucose, and lipids were significantly lower in the Concept IMF group.
CONCLUSION: Large phospholipid-coated lipid droplets in young mice reduced fat accumulation and improved metabolic profile in adulthood. These data emphasize that physical properties of early dietary lipids contribute to metabolic programming.


text:
Diffusion experiments have been conducted using the Ni3Al/NiAl couples at annealing temperatures of 873 and 923 K. It is shown that the Ni5Al3 phase forms between the Ni3Al and NiAl phases during the diffusion annealing. Optical microscopy, transmission electron microscopy and electron probe microanalysis (EPMA) are employed for the identification of the Ni5Al3 phase. Concentration profiles of Al across the diffusion-couple interfaces are measured using EPMA to determine the region of the Ni5Al3 single-phase in the Ni-Al binary phase diagram. Interdiffusion coefficients in the Ni5Al3 phase are also determined from the concentration profiles.
All Science Journal Classification (ASJC) codes
- General Engineering


Shadows, Slicksters, and Soothsayers: Physicians in Canadian Poetry
That physicians are scientists is rarely questioned. One might expect, then, that doctors would be portrayed as such in Canadian poetry. However, when the author, a physician and poet herself, surveyed a sample of contemporary works, she found that doctors were rarely seen as scientists; instead, she groups their portrayals into three categories: shadows (physicians who appear as accidental tourists, or as manual labourers), slicksters (physicians doing the technical work of medicine, but also embodying the power struggles between doctor and patient), and soothsayers (physicians who divine some larger meaning about being human). Though this lack of physician-as-scientist imagery might exist because poets are generally less familiar with the workaday world of science than with the caring (or apparently not caring) aspects of physicianship, these portrayals suggest the world may view medicine as something emerging from science, but occupying a place closer to craftsmanship. I conclude with what this may mean for what patients want more of and less of from physicians.
This article "Shadows, Slicksters, and Soothsayers: Physicians in Canadian Poetry" originally appeared in Science & Canadian Literature. Spec. issue of Canadian Literature 221 (Summer 2014): 37-54.


text:
Skip to Main Content
In this paper, we present robust semi-blind (SB) algorithms for the estimation of beamforming vectors for multiple-input multiple-output wireless communication. The transmitted symbol block is assumed to comprise of a known sequence of training (pilot) symbols followed by information bearing blind (unknown) data symbols. Analytical expressions are derived for the robust SB estimators of the MIMO receive and transmit beamforming vectors. These robust SB estimators employ a preliminary estimate obtained from the pilot symbol sequence and leverage the second-order statistical information from the blind data symbols. We employ the theory of Lagrangian duality to derive the robust estimate of the receive beamforming vector by maximizing an inner product, while constraining the channel estimate to lie in a confidence sphere centered at the initial pilot estimate. Two different schemes are then proposed for computing the robust estimate of the MIMO transmit beamforming vector. Simulation results presented in the end illustrate the superior performance of the robust SB estimators.


Microgravity Science and Technology
, Volume 25, Issue 2, pp 127–139
Transient Effect of Micro Vibration from Two Space Vehicles on Mixture During Thermodiffusion Experiment
Original Article
DOI: 10.1007/s12217-_PHONE_-9
Cite this article as:
Ahadi, A. & Saghir, M.Z. Microgravity Sci. Technol. (2013) 25: 127. doi:10.1007/s12217-_PHONE_-9
Abstract
Numerical modeling of thermodiffusion experiment for a binary mixture of water and isopropanol under micro-vibrations condition is presented. The vibrations obtained onboard ISS and FOTON-M3 are due to different activities. The effect of micro-gravity vibration level on the variation of mixture properties were investigated in detail. In this paper, the thermodiffusion experiment was investigated for two different g-jitter vibrations in the presence of a thermal gradient. The cavity is filled with a binary mixture of water and isopropanol with negative Soret. All physical properties including density, mass diffusion and thermodiffusion coefficients were assumed as functions of temperature and concentration. In order to understand the behavior of the mixture during the course of the experiment, five locations in the domain were chosen. It was found that a similarity between g-jitter vibration and induced velocity pattern exist. Micro vibration was found to have a minimal effect on the molecular and thermodiffusion coefficients.
Keywords
Thermodiffusion Micro-gravity CFD simulation Binary mixture Transient study ISS
Copyright information
© Springer Science+Business Media Dordrecht 2013
Authors and Affiliations
 1. 1.Mechanical Engineering DepartmentRyerson UniversityTorontoCanada
Personalised recommendations


text:
Network for Real Life Superheroes, Warriors, Protectors,
Saviors, to have a place to socialize, network, and also teach and learn from each other.
Bloodstain pattern analysis
|Subject: Bloodstain pattern analysis Mon Feb 27, 2012 1:06 am|| |
Bloodstain pattern analysis (BPA) is one of several specialties in the field of forensic science. The use of bloodstains as evidence is not new; however, the application of modern science has brought it to a higher level. New technologies, especially advances in DNA analysis, are available for detectives and criminologists to use in solving crimes and apprehending offenders.
The science of bloodstain pattern analysis applies scientific knowledge from other fields to solve practical problems. Bloodstain pattern analysis draws on the scientific disciplines of biology, chemistry, mathematics and physics. If an analyst follows a scientific process, this applied science can produce strong, solid evidence, making it an effective tool for investigators.
Results of BPA
Not every result of BPA will qualify as incontrovertible evidence, but the following are some things a bloodstain pattern analyst may be able to determine conclusively and state as fact:
A basic understanding of blood spatter analysis allows first responding officers and investigators alike to assist in correctly collecting and preserving bloodstain data at the scene. If they know what they have at the scene, then based on their department policy they should know what they need to do next. Bloodstain pattern analysis requires sufficient education and training to be an effective investigative technique, which not all law enforcement officers attending a crime scene will necessarily have.
- Movement and direction of persons or objects while they were shedding blood.
- Position of persons or objects during bloodshed.
- Movement of persons or objects after bloodshed.
- The mechanism or object used to create a specific pattern.
- The direction a stain was traveling when it was deposited.
- The area of origin of an impact pattern.
- The minimum number of impacts during an incident.
- The sequence of events.
Bloodstain analysts receive specialized training. The foundation course in bloodstain pattern analysis is the Basic Bloodstain Pattern Analysis Course. This is taught at many government and private institutions. The course criteria were developed by the International Association of Bloodstain Pattern Analysts (IABPA) with the following stated purpose:
Beyond this basic course are conferences, seminars, and courses such as the Maths and Physics for BPA and The Advance Bloodstain Pattern Analysis Course, both of which are provided by the Ontario Police College (OPC) and the Royal Canadian Mounted Police (RCMP). These two institutions also have Bloodstain Analyst Understudy programs. The International Association for Identification (IAI) provides its own certification in bloodstain pattern analysis.
A course of instruction designed for investigators, crime scene technicians, forensic technicians, and others involved in criminal and medical-legal investigations and crime scene analysis. The course is intended to develop a fundamental knowledge of the discipline of bloodstain pattern analysis. The course should illustrate to the student basic principals of bloodstain pattern analysis and the practical application of the discipline to actual casework. The course syllabus is not intended to create an "instant" expert.
In addition to formal study of the subject, practical experience and experimentation is paramount in the development of a skilled bloodstain pattern analyst.
|Subject: Re: Bloodstain pattern analysis Mon Feb 27, 2012 1:13 am|| |
Bloodstain pattern categories
There are several different thoughts on how to classify and define bloodstain patterns. The following is one accepted way of categorizing them based on the mechanism that created the stain. The three stain groups are: Passive, Projected, and Transfer/Contact. The definitions used below are from the suggested IABPA terminology list:
Passive bloodstains are those stains created by the force of gravity.
- Passive Drops - Bloodstain drop(s) created or formed by the force of gravity acting alone.
- Drip Pattern - A bloodstain pattern which results from blood dripping into blood.
- Flow Pattern - A change in the shape and direction of a bloodstain due to the influence of gravity or movement of the object.
- Pool Pattern - A bloodstain pattern formed when a source of blood is stationary for a period of time.
A projected stain occurs when some form of energy has been transferred to a blood source.
- Low Velocity Impact Spatter (LVIS) - A bloodstain pattern that is caused by a low velocity impact\force to a blood source.
- Medium Velocity Impact Spatter (MVIS) - A bloodstain pattern caused by a medium velocity impact\force to a blood source. A beating typically causes this type of spatter.
- High Velocity Impact Spatter (HVIS) - A bloodstain pattern caused by a high velocity impact/force to a blood source such as that produced by gunshot or high-speed machinery.
- Cast-Off Pattern - A bloodstain pattern created when blood is released or thrown from a blood-bearing object in motion.
- Arterial Spurting (OR Gushing) Pattern - Bloodstain pattern(s) resulting from blood exiting the body under pressure from a breached artery.
- Back Spatter - Blood directed back towards the source of energy or force that caused the spatter.
- Expiratory Blood - Blood that is blown out of the nose, mouth, or a wound as a result of air pressure and/or air flow which is the propelling force.
A transfer or contact stain is produced when an object with blood comes in contact with an object or surface that does not have blood. It may be possible to discern the object that left the blood impression.
As indicated above, there are other terms currently used in BPA and different ways of classifying bloodstain patterns. For example there is a debate over the misnomer of the LVIS, MVIS, and HVIS as it relates to the physical term "velocity". A sub-committee of the SWGSTAIN has been tasked with addressing the terminology issues and develop a taxonomy for bloodstain patterns.
- Wipe Pattern - A bloodstain pattern created when an object moves through an existing stain, removing and/or altering its appearance.
- Swipe Pattern - The transfer of blood from a moving source onto an unstained surface. Direction of travel may be determined by the feathered edge.
|Subject: Re: Bloodstain pattern analysis Mon Feb 27, 2012 1:16 am|| |
"Velocity" impact stains
Contrary to what the name states, the terms low-, medium-, and high-velocity impact spatter do not describe the velocity of the blood droplets as they fly through the air. The variation in the "velocity" is meant to describe the amount of energy transferred to a blood source in order to create the stains. Velocity is a speed (m/s) with a direction. Often the terms force and energy are quoted in conjunction with the unit ft/s or m/s which is incorrect. Force is related to velocity and mass (N or 1 kg ·m·s−2). Energy (work) is related to the force exerted on an object (J or N·m or kg·m2·s−2). As indicated above, there has been great debate over these terms and their definitions. Below is one method of differentiating low-, medium-, and high-velocity impact spatter. The term "impact" should not be confused with the mechanism by which the spatter was created. It actually refers to the blood impacting onto an object or area with some degree of force.
Low velocity impact spatter
Low velocity impact spatter (LVIS) is generally produced when objects traveling less than 1.5 m/s come in contact with a blood source. The preponderance of stains is generally larger than 8 mm in diameter.
Medium velocity impact spatter
Medium velocity impact spatter (MVIS) is generally produced when objects traveling between 1.5 m/s and 7.5 m/s come in contact with a blood source. The preponderance of stains is generally between 1.5 mm and 4 mm in diameter. Mechanisms that could produce this type of pattern include blunt force trauma or cutting/stabbing actions.
High velocity impact spatter
High velocity impact spatter (HVIS) is generally produced when objects traveling greater than 30 m/s come in contact with a blood source. The preponderance of stains is generally smaller than 1.5 mm in diameter. This pattern often has a mist-like appearance. High velocity patterns may be created by gunshots or explosives, but may also be caused by industrial machinery, coughing, or sneezing.
|Subject: Re: Bloodstain pattern analysis Mon Feb 27, 2012 1:21 am|| |
Blood is a tissue that is circulated within the body to assist other parts of the body. This connective tissue has specialized cells that allow it to carry out its complex functions. For a healthy person, approximately 8% of their total weight is blood. For a 70-kg (154-lb.) individual, this equates to 5.6 L (12 US pints).
Blood contains three components suspended within plasma. The three components are erythrocytes, leukocytes, and platelets.
- Erythrocytes - also known as red blood cells, are transporters. The role of erythrocytes is to transport oxygen. To do this it produces great quantities of hemoglobin, which gives it the distinct red color. Blood that has passed through the heart and been oxygenated (in the arteries) tends to have a brighter shade of red as opposed to blood that is returning to the


Issue 11, 2024
Anoplophora graafi longhorn beetle coloration is due to disordered diamond-like packed spheres
Abstract
While artificial photonic materials are typically highly ordered, photonic structures in many species of birds and insects do not possess a long-range order. Studying their order–disorder interplay sheds light on the origin of the photonic band gap. Here, we investigated the scale morphology of the Anoplophora graafi longhorn beetle. Combining small-angle X-ray scattering and slice-and-view FIB-SEM tomography with molecular dynamics and optical simulations, we characterised the chitin sphere assemblies within blue and green A. graafi scales. The low volume fraction of spheres and the number of their nearest neighbours are incompatible with any known close-packed sphere morphology. A short-range diamond lattice with long-range disorder best describes the sphere assembly, which will inspire the development of new colloid-based photonic materials.
Graphical abstract: Anoplophora graafi longhorn beetle coloration is due to disordered diamond-like packed spheres
Supplementary files
Article information
Article type
Paper
Submitted
17 Jan 2024
Accepted
16 Feb 2024
First published
19 Feb 2024
This article is Open Access
Creative Commons BY license
Soft Matter, 2024,20, 2509-2517
Anoplophora graafi longhorn beetle coloration is due to disordered diamond-like packed spheres
K. Djeghdi, C. Schumacher, V. Bauernfeind, I. Gunkel, B. D. Wilts and U. Steiner, Soft Matter, 2024, 20, 2509 DOI: 10.1039/D4SM00068D
This article is licensed under a Creative Commons Attribution 3.0 Unported Licence. You can use material from this article in other publications without requesting further permissions from the RSC, provided that the correct acknowledgement is given.
Read more about how to correctly acknowledge RSC content.
Social activity
Spotlight
Advertisements


text:
Making an agreement
Coming together to hear each other's pronouncement
Discussing toward merriment,
Striding away from a state of being recalcitrant,
Through sympathizing, we come to an agreement~
In debates of readings it is oftentimes said that once one reads a book, one feels more sympathy toward, and understanding of others than before having read the book. In everyday parlance, this is often situated as having had the opportunity to walk in someone else's shoes. This level of sympathy is not only important in a person's personal life, but also in general political and diplomatic life. If one country's diplomats cannot seem to come to terms of understanding with another nation's representatives, then agreements are difficult to make. For this reason, I argue that poetry relates to diplomacy in yet another way through its ways of conveying the importance and concept of sympathy to both its readers and listeners.


text:
Google purchased 80MW of electrical power from Acciona Energy. The power will come from a 1.5 million sqm solar campus built in a piece of land measuring 280 hectares in the Atacama Desert, west of the Andes mountains and 645Km north of capital Santiago.
Solar energy will be used to power both the $150m data centre and Google's offices in Quilicura.
The photovoltaic park opened in November 2016 occupies a piece of land of produces a total yearly power production of 493 GWh. Acciona Energy claims the plant avoids the production of 474,000 tonnes of CO2.
It consists of 776,000 solar panels and 55 million photovoltaic cells. The park is mounted on metal static structures covering 196 Km if lined-up.
The article was originally published on Data-Economy.com


How many places are named Palma?
There are 62 places in the world named Palma!
Palma can be found in 22 countries throughout the world.
In some countries the place can be found more than once. For example Mexico, Brazil and Cuba.
Mexico has the highest number of places called Palma, spread accross 15 regions.
The majority of the cities named Palma can be found above the equator.
The northern most place is in the region Viseu in Portugal. The southern most place is in the region Artigas in Uruguay.
See products related to Palma on Amazon.com.
All places Cities
Exact Beginning Ending
(Max 1000)
Cities named Palma: to select only cities, choose "Cities".
There are 62 places called Palma in the world.
Number of places named Palma per country:
There are 15 places named Palma in Mexico.
There are 8 places named Palma in Brazil.
There are 7 places named Palma in Cuba.
There are 5 places named Palma in Philippines.
There are 4 places named Palma in Costa Rica.
There are 3 places named Palma in Portugal.
There are 2 places named Palma in America.
There are 2 places named Palma in Peru.
There are 2 places named Palma in Haiti.
There are 2 places named Palma in Spain.
There is one place named Palma in Uruguay.
There is one place named Palma in Panama.
There is one place named Palma in Nigeria.
There is one place named Palma in Mozambique.
There is one place named Palma in Mauritius.
There is one place named Palma in Northern Mariana Islands.
There is one place named Palma in India.
There is one place named Palma in Guatemala.
There is one place named Palma in Ecuador.
There is one place named Palma in Colombia.
There is one place named Palma in Australia.
There is one place named Palma in Argentina.
Cities named Palma in Mexico.
Palma - ZacatecasWhere is Palma - Zacatecas - Mexico?
Palma - Veracruz-LlaveWhere is Palma - Veracruz-Llave - Mexico?
Palma - TamaulipasWhere is Palma - Tamaulipas - Mexico?
Palma - TabascoWhere is Palma - Tabasco - Mexico?
Palma - SonoraWhere is Palma - Sonora - Mexico?
Palma - SinaloaWhere is Palma - Sinaloa - Mexico?
Palma - San Luis PotosiWhere is Palma - San Luis Potosi - Mexico?
Palma - Queretaro de ArteagaWhere is Palma - Queretaro de Arteaga - Mexico?
Palma - OaxacaWhere is Palma - Oaxaca - Mexico?
Palma - Nuevo LeonWhere is Palma - Nuevo Leon - Mexico?
Palma - JaliscoWhere is Palma - Jalisco - Mexico?
Palma - HidalgoWhere is Palma - Hidalgo - Mexico?
Palma - GuerreroWhere is Palma - Guerrero - Mexico?
Palma - GuanajuatoWhere is Palma - Guanajuato - Mexico?
Palma - DurangoWhere is Palma - Durango - Mexico?
Cities named Palma in Brazil.
Palma - TocantinsWhere is Palma - Tocantins - Brazil?
Palma - Sao PauloWhere is Palma - Sao Paulo - Brazil?
Palma - Rio Grande do SulWhere is Palma - Rio Grande do Sul - Brazil?
Palma - Rio Grande do NorteWhere is Palma - Rio Grande do Norte - Brazil?
Palma - Minas GeraisWhere is Palma - Minas Gerais - Brazil?
Palma - CearaWhere is Palma - Ceara - Brazil?
Palma - BahiaWhere is Palma - Bahia - Brazil?
Palma - AlagoasWhere is Palma - Alagoas - Brazil?
Cities named Palma in Cuba.
Palma - Villa ClaraWhere is Palma - Villa Clara - Cuba?
Palma - MatanzasWhere is Palma - Matanzas - Cuba?
Palma - La HabanaWhere is Palma - La Habana - Cuba?
Palma - HolguinWhere is Palma - Holguin - Cuba?
Palma - GuantanamoWhere is Palma - Guantanamo - Cuba?
Palma - Ciego de AvilaWhere is Palma - Ciego de Avila - Cuba?
Palma - CamagueyWhere is Palma - Camaguey - Cuba?
Cities named Palma in Philippines.
Palma - PangasinanWhere is Palma - Pangasinan - Philippines?
Palma - Negros OccidentalWhere is Palma - Negros Occidental - Philippines?
Palma - LagunaWhere is Palma - Laguna - Philippines?
Palma - BukidnonWhere is Palma - Bukidnon - Philippines?
Palma - AntiqueWhere is Palma - Antique - Philippines?
Cities named Palma in Costa Rica.
Palma - San JoseWhere is Palma - San Jose - Costa Rica?
Palma - PuntarenasWhere is Palma - Puntarenas - Costa Rica?
Palma - GuanacasteWhere is Palma - Guanacaste - Costa Rica?
Palma - AlajuelaWhere is Palma - Alajuela - Costa Rica?
Cities named Palma in Portugal.
Palma - ViseuWhere is Palma - Viseu - Portugal?
Palma - SetubalWhere is Palma - Setubal - Portugal?
Palma - PortalegreWhere is Palma - Portalegre - Portugal?
Cities named Palma in America.
Palma - New MexicoWhere is Palma - New Mexico - America?
Palma - KentuckyWhere is Palma - Kentucky - America?
Cities named Palma in Peru.
Palma - San MartinWhere is Palma - San Martin - Peru?
Palma - IcaWhere is Palma - Ica - Peru?
Cities named Palma in Haiti.
Palma - OuestWhere is Palma - Ouest - Haiti?
Palma - CentreWhere is Palma - Centre - Haiti?
Cities named Palma in Spain.
Palma - MurciaWhere is Palma - Murcia - Spain?
Palma - Islas BalearesWhere is Palma - Islas Baleares - Spain?
Cities named Palma in Uruguay.
Palma - ArtigasWhere is Palma - Artigas - Uruguay?
Cities named Palma in Panama.
Palma - ChiriquiWhere is Palma - Chiriqui - Panama?
Cities named Palma in Nigeria.
Palma - BornoWhere is Palma - Borno - Nigeria?
Cities named Palma in Mozambique.
Palma - Cabo DelgadoWhere is Palma - Cabo Delgado - Mozambique?
Cities named Palma in Mauritius.
Palma - Plaines WilhemsWhere is Palma - Plaines Wilhems - Mauritius?
Cities named Palma in Northern Mariana Islands.
Palma - MPWhere is Palma - MP - Northern Mariana Islands?
Cities named Palma in India.
Palma - ChhattisgarhWhere is Palma - Chhattisgarh - India?
Cities named Palma in Guatemala.
Palma - El ProgresoWhere is Palma - El Progreso - Guatemala?
Cities named Palma in Ecuador.
Palma - EsmeraldasWhere is Palma - Esmeraldas - Ecuador?
Cities named Palma in Colombia.
Palma - CundinamarcaWhere is Palma - Cundinamarca - Colombia?
Cities named Palma in Australia.
Palma - QueenslandWhere is Palma - Queensland - Australia?
Cities named Palma in Argentina.
Palma - JujuyWhere is Palma - Jujuy - Argentina?
Places named after…


Efficient Implementation of a 3-pointer AVL Tree
File index
Note: I need to rework this page. There are a few improvements to make. Since AVL trees are also generally inferior to Red-black trees, I recommend to you to head over to my Red-black tree implementation page instead.
I set out to make my own 3-pointer AVL tree and found some optimizations that are not typically mentioned in AVL tree tutorials.
To anticipate the results — I did not manage to make a serious Red-black tree contender. My implementation is another data point that AVL trees are inferior. For insertion and retrieval, AVL has a slight edge due to slightly lower tree height. But deletion needs O(log2 n) rebalancing rotations, while in a Red-black tree the number is constant. And it shows in practice.
In a comparison with BSD RB tree.h (by Niels Provos), here's what I could pull off:
Generating _PHONE_ (4-byte) integers.
Randomly permuting the integers.
Running bench SIL AVLtree
===========================
Inserting each element: 0.743s
Finding each element: 0.617s
Removing each element: 0.809s
Running bench BSD RB tree
===========================
Inserting each element: 0.785s
Finding each element: 0.658s
Removing each element: 0.553s
(All benchmarks on this page were made on a AMD X2-250. It's a x86_64 machine from ca. 2011. Code is compiled with GCC 6.3, gcc -O2 -DNDEBUG).
Maybe I will update with more detailed benchmarks. It would be nice to have more AVL and RB trees, and various workloads. There are of course other benchmarks on the net and I invite everyone to include my implementation into their benchmarks. While some nice operations are still missing, I think the implementation is stable enough. If you benchmark the code, please make sure to set NDEBUG.
Here is a nice-looking benchmark that turned up only after a few days of searching. The numbers look quite similar.
As I said the implementation is not a serious contender to RB trees for general use, due to the slowness of the delete operation. I want at least something to take away from this little adventure, so I'll write down the optimizations I applied to get it at least this fast.
But first, for reference here is my implementation: sil_avltree.h. For efficiency it is implemented as a header similar to the RB tree.h code. This way comparison operations can be inlined. It's also more type-safe compared to a generic inferface. The disadvantage is that the usage is a little more involved and confusing.
You can also browse the code on github. The benchmark code is also there, and it is currently the only instruction how to use the header file.
Caching the childs' heights
The height of an AVL tree with n nodes is bounded by ~1.44 log2 n. That means that we can conveniently store node heights in 8 bits instead of spending an int. That also means that we can store the heights of the left and right children of each node, instead of its own height. This is more cache efficient since for testing the balance we don't need to look at the childs. While that's no win for the one child node that we're just coming from (it's in the CPU cache anyway), the other node needs to be visited only in some cases when a rotation is required.
/*
 * Linkage and height information for AVL tree nodes.
 */
struct SIL_AVLhead {
 struct SIL_AVLhead *left;
 struct SIL_AVLhead *right;
 struct SIL_AVLhead *parent;
 unsigned char lh;
 unsigned char rh;
};
To get an impression of the effects on performance, here is what happens when my code is switched from using the cached height to getting the height from the children (in SIL_AVL_get_balance()):
Use cached heightGet from children
Insert0.743s0.853s
Find0.617s0.623s
Remove0.809s0.912s
Bench cache misses33.2 million36.4 million
The find operation is unaffected since it doesn't check the balance.
Note that there is a minor cost to maintaining the child heights and a minor cost to calculating a node's own height from those. I didn't bother to change the code back to an own-height implementation since that's a pretty big change. So the comparison is not entirely fair. For remedy I've retrieved cache-misses numbers from perf. The cache-misses overhead from an empty benchmark (that only setups the data) was only 500K and I hope the 36.4 million number is very much like in a fair comparison.
Update: I missed that we can also get away with storing only the balance. That doesn't require the calculation balance = rh - lh, and only one field instead of two must be updated on rotations. However it's not clear if that's a win. The memory requirements go down from 2 bytes to 3 bits per node, but with a straightforward implementation there are no space savings in practice due to alignment (see the Packing section). We could store the 3 bits in the 8-byte aligned parent pointer to save 4 or 8 bytes in practice. I haven't done that. Still, my balance-version of the code is a little more complex and performance-wise I could not measure any difference.
Packing the link structure
The link structure struct SIL_AVLhead shown above contains 3 pointers and 2 bytes, which is 3*8+2 = 26 bytes on 64-bit systems. However the compiler will typically blow that up to 32 bytes for 8-byte alignment of the link pointers contained inside (Relevant read: The Lost Art of C Structure Packing). Now let's assume you only want to store integers in the tree. If you define a tree node in the conventional way:
struct node {
 struct SIL_AVLhead head;
 int payload;
}
that is not 36 but 40 bytes, again due to alignment!
We can define the head structure as packed instead:
struct __attribute__((packed)) SIL_AVLhead_packed {
 ...
};
And now it takes only these 26 bytes, and struct node is 32 bytes (due to 4-byte alignment of the payload).
Packing the head is not safe in the general case. If the payload is only 1 byte, struct node is 27 bytes.
/*
 * sizeof (struct SIL_AVLhead_packed) = 26
 * offsetof(struct node_unsafe, payload) = 26
 * sizeof (struct node_unsafe) = 27
 */
struct node_unsafe {
 struct SIL_AVLhead_packed head;
 char payload;
}
The pointers inside the head (of a node, inside an array of nodes) are misaligned. Which is a problem on some architectures. I have yet to figure out a nice and usable way how to make that safe. The best I can come up with so far is requiring pointer-sized alignment of the head struct at the node definition site:
/*
 * sizeof (struct SIL_AVLhead_packed) = 26
 * offsetof(struct node_safe, payload) = 26
 * sizeof (struct node_safe) = 32
 */
struct node_safe {
 struct SIL_AVLhead_packed __attribute__((aligned(sizeof (void *)))) head;
 char payload;
}
But requiring the hacky alignment specifier at the node definition site (which is "client code") is dangerous, even if we hide the definition behind a macro. Please write me if you know a better way.
Intrinsic linking of the payload inside the head structure (with a head structure macro) is not an option. For one, generic code that is only interested in the link data (and not the payload) is not cleanly reusable. The other reason is inconvience for clients that want to link elements in more than one tree, so need to put more than one head struct in their nodes.
Here are some measurements, again with an int payload.
Packed: 32 bytesNot packed: 40 bytes
Insert0.743s0.792s
Find0.617s0.655s
Remove0.809s0.840s
So that's another demonstration of the importance of cache efficiency.
Optimizing the rotations
When the imbalance in a node is 2 there are two cases what needs to be done, described on the GeeksforGeeks page: Single rotation or double rotation (each in left or right direction). But for efficient implementation I've analyzed both cases (w.l.o.g


be grouped. Uses the GROUP BY SQL-clause.
# * <tt>:limit</tt>: An integer determining the limit on the number of rows that should be returned.
# * <tt>:offset</tt>: An integer determining the offset from where the rows should be fetched. So at 5, it would skip the first 4 rows.
# * <tt>:select</tt>: By default, this is * as in SELECT * FROM, but can be changed if you for example want to do a join, but not
# include the joined columns.
# * <tt>:as</tt>: Specifies a polymorphic interface (See #belongs_to).
# * <tt>:through</tt>: Specifies a Join Model to perform the query through. Options for <tt>:class_name</tt> and <tt>:foreign_key</tt>
# are ignored, as the association uses the source reflection.
# * <tt>:source</tt>: Specifies the source association name used by <tt>has_many :through</tt> queries. Only use it if the name cannot be
# inferred from the association. <tt>has_many :subscribers, :through => :subscriptions</tt> will look for either +:subscribers+ or
# +:subscriber+ on +Subscription+, unless a +:source+ is given.
# * <tt>:source_type</tt>: Specifies type of the source association used by <tt>has_many :through</tt> queries where the source association
# is a polymorphic belongs_to.
# * <tt>:uniq</tt> - if set to true, duplicates will be omitted from the collection. Useful in conjunction with :through.
#
# Option examples:
# has_many :comments, :order => "posted_on"
# has_many :comments, :include => :author
# has_many :people, :class_name => "Person", :conditions => "deleted = 0", :order => "name"
# has_many :tracks, :order => "position", :dependent => :destroy
# has_many :comments, :dependent => :nullify
# has_many :tags, :as => :taggable
# has_many :subscribers, :through => :subscriptions, :source => :user
# has_many :subscribers, :class_name => "Person", :finder_sql =>
# 'SELECT DISTINCT people.* ' +
# 'FROM people p, post_subscriptions ps ' +
# 'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +
# 'ORDER BY p.first_name'
def has_many(association_id, options = {}, &extension)
reflection = create_has_many_reflection(association_id, options, &extension)
configure_dependency_for_has_many(reflection)
if options[:through]
collection_reader_method(reflection, HasManyThroughAssociation)
else
add_multiple_associated_save_callbacks(reflection.name)
add_association_callbacks(reflection.name, reflection.options)
collection_accessor_methods(reflection, HasManyAssociation)
end
add_deprecated_api_for_has_many(reflection.name)
end
# Adds the following methods for retrieval and query of a single associated object.
# +association+ is replaced with the symbol passed as the first argument, so
# <tt>has_one :manager</tt> would add among others <tt>manager.nil?</tt>.
# * <tt>association(force_reload = false)</tt> - returns the associated object. Nil is returned if none is found.
# * <tt>association=(associate)</tt> - assigns the associate object, extracts the primary key, sets it as the foreign key,
# and saves the associate object.
# * <tt>association.nil?</tt> - returns true if there is no associated object.
# * <tt>build_association(attributes = {})</tt> - returns a new object of the associated type that has been instantiated
# with +attributes+ and linked to this object through a foreign key but has not yet been saved. Note: This ONLY works if
# an association already exists. It will NOT work if the association is nil.
# * <tt>create_association(attributes = {})</tt> - returns a new object of the associated type that has been instantiated
# with +attributes+ and linked to this object through a foreign key and that has already been saved (if it passed the validation).
#
# Example: An Account class declares <tt>has_one :beneficiary</tt>, which will add:
# * <tt>Account#beneficiary</tt> (similar to <tt>Beneficiary.find(:first, :conditions => "account_id = #{id}")</tt>)
# * <tt>Account#beneficiary=(beneficiary)</tt> (similar to <tt>beneficiary.account_id = account.id; beneficiary.save</tt>)
# * <tt>Account#beneficiary.nil?</tt>
# * <tt>Account#build_beneficiary</tt> (similar to <tt>Beneficiary.new("account_id" => id)</tt>)
# * <tt>Account#create_beneficiary</tt> (similar to <tt>b = Beneficiary.new("account_id" => id); b.save; b</tt>)
#
# The declaration can also include an options hash to specialize the behavior of the association.
#
# Options are:
# * <tt>:class_name</tt> - specify the class name of the association. Use it only if that name can't be inferred
# from the association name. So <tt>has_one :manager</tt> will by default be linked to the +Manager+ class, but
# if the real class name is +Person+, you'll have to specify it with this option.
# * <tt>:conditions</tt> - specify the conditions that the associated object must meet in order to be included as a "WHERE"
# sql fragment, such as "rank = 5".
# * <tt>:order</tt> - specify the order from which the associated object will be picked at the top. Specified as
# an "ORDER BY" sql fragment, such as "last_name, first_name DESC"
# * <tt>:dependent</tt> - if set to :destroy (or true) the associated object is destroyed when this object is. If set to
# :delete the associated object is deleted *without* calling its destroy method. If set to :nullify the associated
# object's foreign key is set to NULL. Also, association is assigned.
# * <tt>:foreign_key</tt> - specify the foreign key used for the association. By default this is guessed to be the name
# of this class in lower-case and "_id" suffixed. So a +Person+ class that makes a has_one association will use "person_id"
# as the default foreign_key.
# * <tt>:include</tt> - specify second-order associations that should be eager loaded when this object is loaded.
# * <tt>:as</tt>: Specifies a polymorphic interface (See #belongs_to).
#
# Option examples:
# has_one :credit_card, :dependent => :destroy # destroys the associated credit card
# has_one :credit_card, :dependent => :nullify # updates the associated records foriegn key value to null rather than destroying it
# has_one :last_comment, :class_name => "Comment", :order => "posted_on"
# has_one :project_manager, :class_name => "Person", :conditions => "role = 'project_manager'"
# has_one :attachment, :as => :attachable
def has_one(association_id, options = {})
reflection = create_has_one_reflection(association_id, options)
module_eval do
after_save <<-EOF
association = instance_variable_get("@#{reflection.name}")
if !association.nil? && (new_record? || association.new_record? || association["#{reflection.primary_key_name}"] != id)
association["#{reflection.primary_key_name}"] = id
association.save(true)
end
EOF
end
association_accessor_methods(reflection, HasOneAssociation)
association_constructor_method(:build, reflection, HasOneAssociation)
association_constructor


Teaching indigenous languages with AR
3 minutes
March 26, 2021
This week, you can read in Avvír about how and why Ludenso Create will be made available in 3 Sámi languages by 2022. Together with forward-thinking Sámi teachers, we hope to contribute to the preservation of the indigenous languages in Scandinavia.
The indigenous Sámi people from Scandinavia naturally feel proud of their culture. Unfortunately, lots of young students with Sámi backgrounds do not know the language of their parents and grandparents. The Scandinavian schools offer education and values which are usually far from the Sámi culture, making it difficult to access modern tools to motivate these students to learn their native language. That is why we at Ludenso are proud to share that we will make Ludenso Create available in 3 Sámi languages by next year.
Why is it important to make new technology available in indigenous languages in school?
Language is our main form of interaction with others, as our words help preserve stories, information, traditions, and identity. The indigenous languages represent the legacy of grandmothers and grandfathers. Should an indigenous language disappear, the indigenous traditional knowledge such as legends, stories, songs, and myths also disappear.
Photo: "Norwegian Sami People" by Karin Beate Nøsterud
Today, indigenous languages are threatened by the constant growth and assimilation of globalization. This is despite the UN's Declaration on the Rights of Indigenous Peoples, which states that learning an indigenous language is a human right.
How can we contribute to the preservation of the Sámi languages?
At Ludenso, we work to enable all children to become digital creators. This means that regardless of your background, ethnicity, or language, you should be able to free your imagination with the AR technology we are developing.
In collaboration with the Norwegian Directorate for Education and Training, we have therefore set out to translate our AR program, Ludenso Create, as well as pedagogical content and guidelines into how to use the technology in the three Sámi languages. This includes Lule Sámi, Northern Sámi, and Southern Sámi. But pure translation is not all. We also want to help preserve the Sámi perspectives, values, history, and culture. To achieve this we will collaborate closely with Sámi teachers, who will share their pedagogical and cultural perspectives on how to phrase tasks for the students.
Photo: "Sami Man" by blueorangestudio
This year, we are creating a teacher portal, where teachers can share their pedagogical tasks through a form, and easily access and share these tasks with students and colleagues. The teachers will also be able to find the pedagogical tasks created by others. This way, the Sámi teachers can help inspire other Sámi teachers. A bonus is that this enables teachers from other countries to seek inspiration from these tasks to teach their students about the indigenous cultures we are so fortunate to have in Scandinavia.
Are you a Sámi teacher, and would like to take part in the work to enable all children to be digital creators? Please send us an email to _EMAIL_, and we would love to collaborate.
If you want to read the full article, "– Buot mánát galget sáhttit šaddat digitála ráhkadeaddjin written" by Alf Berg Grønnli, you can find it in Avvir (here)


text:
providers 116. In the illustrated embodiment, a limit may be placed on additional contributions to the annuity contract. The limit on the additional contributions may be based on, for example, a type of the annuity contract, a source of the additional contribution, the participant's age at time of the additional contribution, an amount of the additional contribution, an aggregate amount of contributions made to the annuity contract, an aggregate amount of contributions made to all annuity contracts, etc.
CPU 106 is further coupled to withdrawal calculator 110. In the illustrated embodiment, withdrawal calculator 110 may be operative to calculate guaranteed withdrawal amount ("GWA") based in part on a base calculated by base calculator 108. In an exemplary embodiment of the present invention, a guaranteed withdrawal benefit may begin at a predetermined age (or upon occurrence of a predetermined event) and allow a participant 102 a, 102 b, 102 c to withdraw a predetermined amount from the annuity contract in predetermined intervals. For example, beginning at age 59½, a participant 102 a, 102 b, 102 c may withdraw up to the GWA each year (or other defined time period) for the participant's life. If the participant 102 a, 102 b, 102 c designates a successor owner (e.g., purchased a joint life annuity contract), the GWA may be provided for the lives of the participant 102 a, 102 b, 102 c and the successor owner.
In an exemplary embodiment, the guaranteed withdrawal benefit allows a participant 102 a, 102 b, 102 c to withdraw up to the GWA, which is a percentage of the income base. In other exemplary embodiments, a participant 102 a, 102 b, 102 c may be allowed to withdraw up to a predetermined sum from the annuity contract. The guaranteed withdrawal benefit may not be cumulative. For example, if a participant 102 a, 102 b, 102 c withdraws less than the GWA, the difference between the amount withdrawn and the GWA may not be added to a subsequent withdrawal period. In other embodiments, withdrawals of less than the GWA may be cumulative such that, for example, the portion of the GWA not withdrawn may be available for withdrawal in a subsequent withdrawal period.
As noted above, the income base can be reduced if a participant 102 a, 102 b, 102 c makes a withdrawal meeting one or more predefined conditions. For example, if a participant 102 a, 102 b, 102 c makes a withdrawal before he reaches a predetermined age or if a participant 102 a, 102 b, 102 c withdraws more than the GWA in a given withdrawal period, base calculator 108 may recalculate the income base, and withdrawal calculator may recalculate the GWA. If the withdrawal meets any (or both) of the predefined conditions, the income base may be reset to a lesser of (i) the income base prior to the withdrawal and (ii) an account value following the withdrawal, and the GWA may also be recalculated to the lesser of (i) a predetermined percentage of the reset income base and (ii) the GWA prior to the withdrawal. If the account value falls to zero and a participant 102 a, 102 b, 102 c has not made a withdrawal that meets the predefined conditions, the GWA may continue to be available to a participant 102 a, 102 b, 102 c for the participant's life.
At a predetermined time (e.g., contract anniversary date, end of calendar year, participant's birthday, etc.) or upon occurrence of a predetermined event (e.g., a participant 102 a, 102 b, 102 c reaching a predetermined age, account value reaching a predetermined value, etc.), the income base may be recalculated to the greater of (i) the account value and (ii) the most recent income base. The GWA may also be recalculated when the income base is recalculated.
In an exemplary embodiment, the annuity contract may provide an incentive for a participant 102 a, 102 b, 102 c to forgo withdrawals. For example, a withdrawal deferral bonus may be provided which increases the income base by a predetermined percentage if a participant 102 a, 102 b, 102 c forgoes the withdrawal (or a predetermined number of consecutive withdrawals). In another exemplary embodiment, the withdrawal deferral bonus may terminate when a participant 102 a, 102 b, 102 c makes his2 first withdrawal or makes a withdrawal equal to the GWA.
Withdrawals may be taken through automatic or customized withdrawal plans (e.g., with variations on withdrawal frequency, amount withdrawn, withdrawal destination, etc.), which may also include a required minimum distribution service to meet lifetime required minimum distributions under federal income tax rules. The withdrawals may be taken on a pro rata basis from the investment options, from selected investment options, from the investment options in a round-robin fashion, etc.
In an exemplary embodiment, a charge may be deducted from the net assets of each investment option at predetermined intervals (e.g., daily). The charge may include, for example, mortality and expense risks charge, a charge for providing the guaranteed withdrawal benefit, etc. A charge may also be deducted from the account value when, for example, a withdrawal is made (e.g., a withdrawal charge), when annuity payments are scheduled to begin (e.g., charges designed to approximate certain taxes, such as premium state taxes), etc. Charges may also be deducted for management of the portfolios underlying the investment options. As understood by those of skill in the art, various tax rules and regulations may apply to the annuity contract and the features thereof
Annuity provider 104 may be operative to store data generated by base calculator 108 and withdrawal calculator 110 in account storage 112. Additionally, annuity provider 104 may be operative to store various metrics related to a participant account within account storage 112 including, but not limited to, participant ID, participant address, etc. During the course of calculations, CPU 106 may be operative to access account storage 112 and transmit data from account storage 112 to both base calculator 108 and withdrawal calculator 110. That is, CPU 106 may be capable of accessing historical account data from account storage for recalculating a participant's base and GWA, as previously described.
Annuity provider 104 may further be coupled to a plurality of investment institutions 114. The annuity provider 104 may provide several investment options for a participant 102 a, 102 b, 102 c to invest the contributions, and a participant 102 a, 102 b, 102 c may invest any portion of the contributions in any one or more of the investment options present in the investment institutions 114. In one exemplary embodiment, at least one of the investment options is a variable investment such that investment results depend on performance of an underlying portfolio, e.g., in periods of poor market performance, net return may result in a negative yield. The underlying portfolio may be selected from several portfolios which include various asset classes and categories and fulfill various objectives, e.g., high level of current income, current income and growth of capital (with emphasis on current income or growth of capital), long-term capital appreciation and current income, and long-term capital appreciation.
An account value may refer to a value of the investments in a given portfolio. That is, in an embodiment in which the investment options are variable, the account value may not be equal to the contributions, because the account value may change due to performance of the underlying portfolios. The account value (and the contributions) can be transferred among the investment options.
FIG. 1 is a conceptual illustration allowing for an explanation of the present invention. It should be understood that various aspects of the embodiments of the present invention could be implemented in hardware, firmware, software, or combinations thereof. In such embodiments, the various components and/or steps would be implemented in hardware, firmware, and/or software to perform the functions of the present invention. That is, the same piece of hardware, firmware, or module of software could perform one or more of the illustrated blocks (e.g., components or steps).
In software implementations, computer software (e.g., programs or other instructions) and/or data is stored on a machine readable medium as part of a computer program product, and is loaded into a computer system or other device or machine via a removable storage drive, hard drive, or communications interface. Computer programs (also called computer control logic or computer readable program code) are stored in a main and/or secondary memory, and executed by one or more processors (controllers, or the like) to cause the one or more processors to perform the functions of the invention as described herein. In this document, the terms "machine readable medium," "computer program medium" and "computer usable medium" are used to generally refer to media such as a random access memory (RAM); a read only memory (ROM); a removable storage unit (e.g., a magnetic or optical disc, flash memory device, or the like); a hard disk; or the like.
Notably, the figure and examples above are not meant to limit the scope of the present invention to a single embodiment, as other embodiments are possible by way of interchange of some or all of the described or illustrated elements. Moreover, where certain elements of the present invention can be partially or fully implemented using known components, only those portions of such known components that are necessary for an understanding of the present invention are described, and detailed descriptions of other portions of such known components are omitted so as not to obscure the invention. In the present specification, an embodiment showing a singular component should not necessarily be limited to other embodiments


text:
This is a flat handaxe, dating from the younger Acheulian or Acheulo-Yabrudian from N-Syria found during the 1960ies.
The data base from the Levant includes 239 Acheulian sites from Syria, 33 sites from Lebanon and 137 sites from Israel. Most of the sites are dated to a late Acheulian (c 600- 400 k.a. BP). These ensembles show a considerable typo-technological variability with almost no chronological significance.
The earliest reliable occurrence of Acheulean handaxes outside of Africa is that at Ubeidiya in Israel during the Early Pleistocene (c 1.4 million years). The absolute chronology of later Acheulian sites in Israel is sparse. The famous Gesher Benot Ya'aqov site, with a basalt and chert handaxe and cleaver dominated ensemble, is known to have been occupied between 800 and 700 ka. Other early Acheulian sites include Joub Jannine II and Latamne in Syria. Here large and rather crude lanceolate handaxes and trihedral picks are predominant. Most bifaces are made by hard hammer, a few indicate occasional soft hammer. The Latamne archaeological horizon lay in the mid-sequence of the Latamne Formation. The Formation has a single TL date of 560 k.a. BP; the proposed date for the horizon is 500-700 k.a. BP.
The Acheulian Evron Quarry yielded luminescence and ESR dates in the order of 630 -330 k.a. The Acheulian layer of Umm Qatafa yielded dates between 262 and 409 k.a. BP. The Acheulian site of Revadim shows luminescence dates between 403 and 194 ka, but it is not clear how the dates relate to the human occupation. U/Th dates on calcitic crusts attached to flint artifacts resulted in dates exceeding 400 k.a. that might be later than the artifacts themselves. The Acheulian site of Birket Ram predates 233 ka and postdates 800 ka but the date of the occupation is not clear.
The data set for the El Kowm area in central Syria clearly helped to clarify the age of the Levantine Acheulian. At least 26 Acheulian sites are known from that area. Well dated Acheulian complexes mainly come from Nadaouiyeh and Hummal. The Acheulian at El Kowm is dated between 525 and 350 k.a. BP. No "logical internal evolution" has been recognized in this sequence on the data base of many thousands of handaxes.
Subdividing the Upper Acheulian of Israel into phases or "facies" is not an easy task and may, after the results at the deeply stratified Syrian sites, not be as significant as once thought. On the basis of technological and morphological considerations Gilead (1970) subdivided the Late Acheulian into several groups as follows:
The Ma'ayan Barukh group (MB), mostly from open-air sites, is characterized by the dominance of handaxes with a cordiform aspect (including amygdaloids, cordiforms and subtriangulars) with fewer ovate and a few pointed bifaces and rare cleavers. The assemblage from the excavations of Umm Qatafa D2 is included in this group.
The Evron-Kissufim group (EK) is, on the basis of stratigraphic evidence, later than the MB group. It contains a richer flake tool component, up to 30-60%, with clear evidence for the manipulation of the Levallois technique. The bifaces show a decrease in rounded aspects (ovates and discoids) and a slight increase in the pointed forms.
The Sahel el-Khoussin-Yiron group (SY) are those assemblages mostly surface collected in the hilly areas and flanks. The bifaces are somewhat cruder than those of the other groups with an occasional dominance of the rounded aspect over the cordiform aspect (Yiron, Beith Uziel, Baqaa-Rafaim 556 etc.). As in the EK group, the Levallois technique was practiced in some sites. It is worth noting that despite the hilly distribution, these assemblages are not present in the three caves where Late Acheulian layers were uncovered (Tabun F, Abu Sif, Umm Qatafa D).
The youngest lower Paleolithic in the Middle East is the Acheulo-Yabrudian. According to TL and ESR methods, the Acheulo-Yabrudian can be generally dated to a range from ca. 400 to ca. 200 k.a. by a small number of reliable ages currently available. The most consistent dates in Israel come from Qesem Cave, where the Acheulo-Yabrudian started earlier than 320 k.a. BP and ended about 220 k.a. BP. The absolute dates of the most important stratigraphy in Israel, the Tabun-cave in the the Nahal Me'arot on the lower reaches of the western part of the Carmel Mountain Range, are still controversial but stratum E could be also of a considerable age between be of 350 to ca. 200 k.a. Dates of 225 k.a. on a flowstone above the Acheulo-Yabrudian layer were reported from Jamal Cave, adjacent to Tabun Cave. It is thus clear that the Acheulo-Yabrudian of Jamal Cave predates 225 ka. Again the dates from the El Kowm area help to clarify stratigraphical issues. The Acheulo-Yabrudian at Hummal cluster around 200 and 256 k.a. BP. Similar dates have been determined for the Acheulo-Yabrudian layers at Yabroud I.
Stone Age of M. Carmel by Garrod and Bate 1937:

source: HuggingFaceFW/fineweb-edu


text:
Budget conscious businesses often choose to buy preowned technology rather than always buying new, often buying used assets online. However, what precautions are online marketplace sellers taking with personal data when they post used devices for sale, and how likely is it for new owners to find residual data on preowned technology?
In partnership with Blancco Technology Group, the industry standard in data erasure and mobile device diagnostics, 159 used drives were purchased and evaluated to find out if residual data could be found.
In this webinar, we discuss the results of our research study, including:
- How many of our sampled drives retained data from the previous user
- The type of data we discovered on these previously used drives
- The primary data disposal method that had been usedand what was left undone
- The 4 steps you need to take before selling your IT assets
Learn more about the study—and how to prevent your data from being recovered from the IT assets you put up for resale today by listening to the webinar.


time it took to write the functional code. I propose that that we focus less on unit tests and replace them with what I'm calling the user contract of your code.
What is a user contract?
The consumer expects that when they perform action X, they receive outcome Y. Typically they are not concerned about how X became Y just that it does so reliably. This is what I'm calling the user contract. If we as the authors of the code take the same view from a testing perspective, it allows us to write simpler tests and gives us the ability to refactor how a library or UI component works without having to update our tests, dramatically speeding up refactoring.
While these examples are written in Javascript the same techniques apply to all languages.
Library example
Starting with a simple library that another developer may be using…
export async function fetchUserList() {
 const userList = await _queryDBForUserList();
 return await _formatUserList(userList);
function _queryDBForUserList() {
 // Fetch content from the database.
function _formatuserList() {
 // Reformat the data as returned from the database.
A consumer of this API would have a couple expectations:
These expectations then outline what your tests are:
describe('fetchUserList', () => {
 it('does not block');
 it('returns in the correct format');
You should note that we don't test any method that wasn't exported, nor do we export methods simply for testing purposes.
To aid the user in understanding what this contract is you can outline it in the docblock for the exported function. This way it can be used to generate the documentation for your library and help outline what your test structure is.
 Returns a formatted user list.
 _USER_ {Object} The user list in the following format:
 { id: INT, name: STRING, favouriteColour: STRING }
export async function fetchUserList() {
 const userList = await _queryDBForUserList();
 return await _formatUserList();
We don't explicitly test the _queryFBForUSerList and _formatUserList functions as they are implementation details. If you were to change the type of database returning the user list, or the algorithm being used to format the user list you should not have to also modify your tests as the contract to your users has not changed. They still expect that if they call fetchUserList they will receive the list in the specified format.
UI Example
Let's take a look at a UI component this time using the React javascript library, in an effort to save space I've removed the functions that aren't exported. This also helps to illustrate their irrelevance in our testing strategy.
export const LogIn = ({ children }) => {
 const userIsLoggedIn = useSelector(isLoggedIn);
 const userIsConnecting = useSelector(isConnecting);
 const button = _generateButton(userIsConnecting);
 if (!userIsLoggedIn) {
 return (

 return children;
This is a fairly simple component that renders a login button with a logo. Let's go through the exercise and see what our User Contract is:
Our tests would be:
describe('LogIn', () => {
 describe('the user is not logged in', () => {
 it('renders a logo and button to log in');
 it('renders any children passed to it');
 it('clicking the button logs in');
 describe('the user is logged in', () => {
 it('does not render a logo and button to log in');
 it('renders any children passed to it');
Testing the returned value in a UI component is a little more nuanced than checking a return value of a library function. We don't necessarily want to check every specific detail of each element returned unless it's part of the contract. I'll expand these tests with assertions but eschew the component setup and rendering in interest of space.
it('renders a logo and button to log in', () => {
 expect(wrapper.find('.login button').length).toBe(1);
it('renders any children passed to it', () => {
 expect(wrapper.find('main.items').length).toBe(3);
it('logs the user in', () => {
 wrapper.find('.login button').simulate('click', {});
It's important to note here that we have tried to limit the specific details that aren't relevant to the contract of the component. This allows the design to change and the contract to remain valid and we do not need to update the tests. This is especially beneficial when you have a shared component library within your company. You can update the designs and implementation details of your components without updating the tests.
What if I…
When writing the code and exporting methods, ask yourself if the user needs to have access to this method or if you're only doing it for testing purposes. You can always export more methods, you can't always take exported methods away.
When writing tests ask yourself how can the consumer interact with your code and what type of outcome is expected for those interactions and them make sure you have those documented and assertions in your tests.
Don't test implementation details of an exported method or UI component. Consider moving those to a different user contract if you feel they need direct testing.
More reading
I have written some content many years ago which you may also find helpful:
An advantage to components, React or otherwise, is that they can be used multiple times in various contexts across your application. As the application grows and components get modified over time the component call signatures can drift from their original spec and the many call locations across the application can miss getting updated. Compound that with shallow rendering unit tests and you've got yourself a problem where parts of your application don't work as expected because of invalid data being sent to the components, not because the components are broken themselves.
This was an issue that we ran into a few times with the Juju GUI. The Juju GUI is a web app with a large portion of it rendered using a number of parent React components which then render the appropriate children based on the state of the application. When one of the children needs access to a method or data, it's possible that it will need to be passed from the top application down through the parent and various children. This caused issues where it was easy to miss updating a components call signature when it was updated.
To remedy this, Francesco Banconi, one of my teammates wrote a Python script to analyze all of the components included in the application and their call signatures to ensure that every place it was being called, it was being called with the appropriate props.
We simply added this into our lint target in the Makefile so that CI will fail if a branch attempts to modify the call signatures without updated the rest of the application.
.PHONY: lint
lint: lint-python lint-components lint-js lint-css
.PHONY: lint-components
 @./scripts/inspect-components validate --path jujugui/static/gui/src/ --short
The GUI is over 150k lines of code without dependencies and the script takes less than 300ms to run and outputs errors similar to the following allowing you to track them down quickly.
 instantiated at: /juju-gui/jujugui/static/gui/src/app/components/entity-details/entity-details.js:98
 defined at: /juju-gui/jujugui/static/gui/src/app/components/entity-details/content/content.js:21
 entityModel provided but not declared
component validation failed: 1 error found
We have found this hugely helpful to reduce errors in the shipped application with almost no overhead during development. Should we split this out into its own tool? Would you find this helpful in your own projects? Let me know _USER_ Thanks for reading.


text:
Note: if you cannot remember the formulas for the surface area and volume of common shapes, revise notes for 1.1 Surface Area of Common Shapes and 1.2 Volume of Common Shapes.
Guide to Finding the Surface Area of a Composite Shape
Read More »1.3 Surface Area and Volume of Composite Shapes
- Composite shapes are shapes that are created by merging multiple simple shapes.
- Due to the large amount of combinations possible, it is not possible to derive formulas for each.
- To find the surface area of a composite shape, you need to first identify the simple shapes it is made up of. The surface area of the composite shape is equal to the sum of each shape, minus the surface area which has been removed to merge it into the shape:


Peter Marklund
Peter Marklund's Home
Fri Apr 24 2009 15:19:17 GMT+0000 (Coordinated Universal Time)
Rails Gotcha: ActiveRecord##Base.valid?, errors.empty?, and before_validation Callbacks
The ActiveRecord::Callbacks module (that depends on ActiveSupport::Callbacks) defines a multitude of before and after callbacks for the lifecycle of your ActiveRecord objects. Similar to how before filters in controllers work, if a before_validation callback method returns false, the save process will be aborted. Here is what the API documentation says:
# If the returning value of a +before_validation+ callback can be evaluated to +false+,
# the process will be aborted and Base#save< will return +false+.
# If Base#save! is called it will raise a ActiveRecord::RecordInvalid exception.
# Nothing will be appended to the errors object.
# If a before_* callback returns +false+, all the later callbacks and the associated
# action are cancelled. If an after_* callback returns
# +false+, all the later callbacks are cancelled. Callbacks are generally run in the
# order they are defined, with the exception of callbacks
# defined as methods on the model, which are called last.
What this means is that if a before_validation callback returns false, then save and valid? will both return false but errors.empty? will return true. Yes, you read correctly, there are no validation errors but the record is not valid. Also, note that the valid? method defined in the ActiveRecord::Base class will never even be invoked.


text:
[Anglican Communion News Service] The Prince of Wales, Prince Charles, has visited a number of Anglican churches as part of his annual summer tour of the country. The Prince of Wales is a title traditionally – but not always – given to the eldest son and heir of the British Monarch. It is largely ceremonial and carries no constitutional authority. In his tour this year Prince Charles visited two churches in St. David's Diocese and one in St. Asaph, which has within its churchyard a Yew Tree thought to be 5,000 years old.
In St. David's Diocese, he visited St. Jerome's Church in Llangwm, near Haverfordwest. Here he saw an award-winning tapestry depicting Llangwm's links with its historic Flemish past and, along with his wife Camilla, Duchess of Cornwall, presented an award to parishioner Pam Hunt, whose vision gave rise to the project, in recognize of its imaginative use of digital technology.
Full article here.