text:
In this blog post, we will discuss types of laboratory glass decals that are commonly used in a laboratory setting.
What Are Lab Decals?
Lab decals are stickers or other adhesive materials that are used for various purposes within a laboratory.
Decals are usually made from vinyl or other durable materials.
From identifying the different areas of a laboratory, to indicate safety hazards lab decals have several purposes within a laboratory.
Laboratory Glass Decal
There are many different types of decals that can be used in a laboratory setting. The most common one is Laboratory Glass Decal.
These decals are used on various equipment in the laboratory to provide a precise measurement. Objects used to measure the size of an object, the weight of an object, or the volume of a liquid like test tubes, beakers, flasks, cylinders will have decals on them.
Types of Laboratory Glass Decals
1. Borosilicate Glass Decal
Borosilicate glass is a type of glass that contains boron oxide. This makes the glass more resistant to heat and chemical damage. Borosilicate glass decals are used on laboratory equipment that are made from this type of glass.
2. Soda Lime Glass Decal
Soda lime glass is the most common type of glass. It is made from a combination of soda ash, limestone, and sand. Soda lime glass decals are used on laboratory equipment that are made from this type of glass.
3. Quartz Glass Decal
Quartz glass is a type of glass that contains silicon dioxide. This makes the glass more resistant to heat and chemical damage. Quartz glass decals are used on laboratory equipment that are made from this type of glass.
If you are looking for decals for your laboratory, be sure to check out our selection.
We offer a variety of different types of scientific glass decals that can meet your needs.
Contact us today to learn more!
You may also like:


text:
Conceptual Fine Art Photography is a genre in which we make a photograph of a concept or idea. In this kind of photography, you are trying to convey a concept or message with the photo. and in general, conceptual photography is essentially a photographer tried to convey the message or "Concept". This message is usually conveyed through some abstract symbolism that can be interpreted by the viewer. Although most photographers have a special meaning, usually images can be interpreted in various ways. some photographers use Photoshop to edit and process to enhance photos.
Irina Dhul is a Ukraine-based photographer who implement such a concept. in her work she combines the background and costumes. stories carried in every picture looks strong. the color of the light supports all aspects of the photo. it is quite impressive. The following results from Conceptual Fine Art Photography
More : Irina Dzhul

source: openbmb/Ultra-FineWeb


text:
NoiseCapture App is an application to evaluate the sound pollution of your environment. With this app you can make a measurement that will inform you about endured exposure. In addition, you can contribute to create collaborative noise pollution maps by transferring this information completely anonymously.
Download: Android 4.0.3 (2.69MB)
Runs offline: partially (you need a connection to send the data and consult the map)
Last update: Android 31/08/2017 (v. 1.0.1)
Website of the developer: Noise Planet
NoiseCapture supports a citizen science project whose objective is to record the levels of noise endured by users. In addition to discover the noise pollution you suffer, you can share that information and contribute to the creation of collaborative noise pollution maps voluntarily and anonymously.
First of all, it is necessary to calibrate the telephone to be used. To obtain the most reliable measurements possible, a reference value obtained from an already calibrated device is used. However and despite this requirement, the application itself already warns that this utility does not replace in any case a professional sound level meter.
The calibration is carried out as follows:
- Enter in the section Calibration that you will find in the menu in the upper left corner. Confirm that you understand the warning message that will appear on the screen and that indicates the need to use a reference device.
- In the Calibration mode drop-down list, select the frequency in relation to which you want to calibrate the device. To take into account all frequencies, select Global.
- Press the Start button. For a short time, the app performs a heating phase, which you can leverage to prepare the reference device. Then the real calibration begins. In order to obtain the highest accuracy, the measurement duration must be the same on both the telephone and the reference device.
- Once the measurement is complete, enter the value registered by the reference unit in the Reference value field and press Apply. You can also reset the measurement.
- Finally, test the calibration using the Test gain option. You have to compare the results obtained with the previously calibrated apparatus. A difference of 0.5 decibels (dB) between the two devices is considered acceptable.
How noise measurement is performed
Once the device is calibrated, noise measurement can be carried out with certain guarantees. The steps to follow are those:
- Entering in the Measurement option, press the Record button represented by a microphone (you can stop it when you want). On the screen you will see the noise level in dB represented by an oscillating number and a bar graph. You will also be able to observe the maximum, minimum and mean levels, a chronometer or the GPS accuracy, as well as a sound spectrum.
- You can typify the measurement by providing a description, the degree of nuisance generated, the conditions in which the measurement was performed and the predominant sources (recommended, although it isn't a prerequisite). The measurements are sent by default to the server, although you can disable this in Settings > Data transfer. The logs are also stored locally on your phone and are accessible from the History option. From this last section you can also upload your measurements manually, as well as download the metadata in ZIP format, edit the description, etc.
Considerations for a real measurement of noise pollution levels
Users of NoiseCapture who want to know and share noise pollution information should consider the following good practices:
- Use a calibrated device.
- Keep the phone in your hand, avoid storing it in a pocket, handbag, etc..
- Avoid masking the device's microphone.
- Use an external microphone (if possible).
Also, if you want to share your data to create noise maps, remember the following:
- Take measurements outdoors (do not send indoor measurements).
- Wait for the GPS signal to be as accurate as possible.
- Complete the description of the measurement.
Images: screenshots 26/09/2017. © Noise Planet


36
I remember seeing a way to use extended gcc inline assembly to read a register value and store it into a C variable. I cannot though for the life of me remember how to form the asm statement. Any help is much appreciated.
 - 2
 And how do you know what is in EBX when your C code starts executing? – florin Jan 22 '10 at 17:45
 - You can't know what value compiler-generated code will have stored in any register when your inline asm statement runs, so the value is usually meaningless, and you'd be much better off using a debugger to look at register values when stopped at a breakpoint. It might make sense for a stack pointer, but there's __builtin_frame_address(0) to get a stack address (and IIRC, cause that function to make a full stack frame, even when -fomit-frame-pointer is enabled, like it is by default on x86.) – Peter Cordes Mar 17 '18 at 9:54
31
Going in a different direction than other answers so far, since I'm not sure what you want.
GCC Manual § 5.40 Variables in Specified Registers
register int *foo asm ("a5");
Here a5 is the name of the register which should be used…
Naturally the register name is cpu-dependent, but this is not a problem, since specific registers are most often useful with explicit assembler instructions (see Extended Asm). Both of these things generally require that you conditionalize your program according to cpu type.
Defining such a register variable does not reserve the register; it remains available for other uses in places where flow control determines the variable's value is not live.
GCC Manual § 3.18 Options for Code Generation Conventions
-ffixed-reg
Treat the register named reg as a fixed register; generated code should never refer to it (except perhaps as a stack pointer, frame pointer or in some other fixed role).
This can replicate Richard's answer in a simpler way,
int main() {
 register int i asm("ebx");
 return i + 1;
}
although this is rather meaningless, as you have no idea what's in the ebx register.
If you combined these two, compiling this with gcc -ffixed-ebx,
#include <stdio.h>
register int counter asm("ebx");
void check(int n) {
 if (!(n % 2 && n % 3 && n % 5)) counter++;
}
int main() {
 int i;
 counter = 0;
 for (i = 1; i <= 100; i++) check(i);
 printf("%d Hamming numbers between 1 and 100\n", counter);
 return 0;
}
you can ensure that a C variable always uses resides in a register for speedy access and also will not get clobbered by other generated code. (Handily, ebx is callee-save under usual x86 calling conventions, so even if it gets clobbered by calls to other functions compiled without -ffixed-*, it should get restored too.)
On the other hand, this definitely isn't portable, and usually isn't a performance benefit either, as you're restricting the compiler's freedom.
 - 1
 Quoting from the current docs describing local registers The only supported use for this feature is to specify registers for input and output operands when calling Extended asm. So putting i within main() like this is unsupported. And to emphasize your point: x86 only has a limited number of registers. Removing one from general use via global register variable might slow down other critical parts of your code. Some discussion here. – David Wohlferd Mar 17 '18 at 10:25
 - I'd highly recommend not using a global register variable, except maybe in one .c file containing one function as a hack. Expect a significant performance cost, especially on 32-bit x86. – Peter Cordes Mar 17 '18 at 10:45
19
Here is a way to get ebx:
int main()
{
 int i;
 asm("\t movl %%ebx,%0" : "=r"(i));
 return i + 1;
}
The result:
main:
 subl $4, %esp
 #APP
 movl %ebx,%eax
 #NO_APP
 incl %eax
 addl $4, %esp
 ret
Edit:
The "=r"(i) is an output constraint, telling the compiler that the first output (%0) is a register that should be placed in the variable "i". At this optimization level (-O5) the variable i never gets stored to memory, but is held in the eax register, which also happens to be the return value register.
 - 2
 I would use the =rm constraint rather than =r. The compiler's optimizer will attempt to choose the best path. If the inline assembler happened to be in a register starved situation =r may force it to generate less than optimal code. =rm would give the optimizer a chance to use a memory reference if it happened to be the best choice. In this simple example it won't be an issue, but if the code is in a more complex situation then giving options to the compiler could be beneficial. – Michael Petch Jun 6 '16 at 12:57
 - @MichaelPetch How about "=b" and an empty template string? – David Wohlferd Mar 17 '18 at 10:28
5
I don't know about gcc, but in VS this is how:
int data = 0;
__asm
{
 mov ebx, 30
 mov data, ebx
}
cout<<data;
Essentially, I moved the data in ebx to your variable data.
 - x86-only, of course. Microsoft's compilers for x64 and Itanium do not support inline assembly. – ephemient Jan 22 '10 at 4:52
 - I think the assembly will get translated to mov ebx, 30 mov dword ptr[data], ebx – Sridarshan Feb 13 '12 at 5:13
 - 2
 Why not just mov data, 30 ? – h0ussni Feb 28 '14 at 15:06
3
This will move the stack pointer register into the sp variable.
intptr_t sp;
asm ("movl %%esp, %0" : "=r" (sp) );
Just replace 'esp' with the actual register you are interested in (but make sure not to lose the %%) and 'sp' with your variable.
2
From the GCC docs itself: _URL_
2
#include <stdio.h>
void gav(){
 //rgv_t argv = get();
 register unsigned long long i asm("rax");
 register unsigned long long ii asm("rbx");
 printf("I'm gav - first arguman is: %s - 2th arguman is: %s\n", (char *)i, (char *)ii);
}
int main(void)
{
 char *test = "I'm main";
 char *test1 = "I'm main2";
 printf("0x%llx\n", (unsigned long long)&gav);
 asm("call %P0" : :"i"((unsigned long long)&gav), "a"(test), "b"(test1));
 return 0;
}
 - 2
 Quoting from the current docs describing local register variables The only supported use for this feature is to specify registers for input and output operands when calling Extended asm. So putting i and ii within gav() like this is unsupported. – David Wohlferd Mar 17 '18 at 10:30
1
You can't know what value compiler-generated code will have stored in any register when your inline asm statement runs, so the value is usually meaningless, and you'd be much better off using a debugger to look at register values when stopped at a breakpoint.
That being said, if you're going to do this strange task, you might as well do it efficiently.
On some targets (like x86) you can use specific-register output constraints to tell the compiler which register an output will be in. Use a specific-register output constraint with an empty asm template (zero instructions) to tell the compiler that your asm statement doesn't care about that register value on input, but afterward the given C variable will be in that register.
#include <stdint.h>
int foo() {
 uint64_t rax_value; // type width determines register size
 asm("" : "=a"(rax_value)); // =letter determines which register (or partial reg)
 uint32_t ebx_value;
 asm("" : "=b"(ebx_value));
 uint16_t si_value;
 asm("" : "=S"(si_value) );
 uint8_t si


text:
What Is Loofah Soap?
Loofah soap is soap which contains loofah, a plant product which is prized for its exfoliating properties. A bar of loofah soap can be used to wash and exfoliate at the same time in the shower or tub. Some bath supply stores sell loofah products, and it is also possible to make the soap at home, for people who like to do their own soap making.
There are several types of loofah soap. In the most basic, loofah is covered with glycerin in a melt and pour soap making process. This type of soap is very easy to make at home, as all that is required is a mold, a block of glycerin, and a piece of loofah. Once hardened, the soap can be cut into blocks for use. Some companies include a rope in their glycerin soap to provide something to hold on to, as glycerin is notoriously slippery.
Other soap makers embed loofah into different kinds of soap, such as castile soap, liquid soap, or cleansing cream. It is also possible to use shredded loofah for a more mild exfoliating soap. Soaps with shredded loofah tend to be more smooth, and they are often easier to manage. As the soap bar is used, the loofah will gradually wear away, unlike a soap bar with a solid wedge of loofah, which may start to protrude over time without wearing down, making the soap cumbersome to use.
On its own, loofah can be kind of difficult to manage. It tends to get very stiff with extended use, and it can start to attract mold and bacteria if it sits in the shower. By embedding loofah in soap, people can ensure that they change their loofahs regularly while enjoying ease of use. Regular changes don't just reduce the numbers of organisms camping out in the loofah: they also mean that people are using loofah which is still fresh, with lots of fiber for exfoliation, instead of older loofah, which tends to be smoother.
Some people like to make exfoliation a part of their regular skin care regimen. Loofah soap can make it easier to exfoliate on a regular basis, combining the soaping and exfoliating process for efficiency. This soap can also be very useful for removing embedded dirt and grime. Mechanics and other people who work in environments which tend to get greasy and dirty can use loofah soap to gently scrub their skin, and some loofah soap products are formulated specifically for people who work in dirty industries.
I tried using loofah soap, but it didn't lather very well. I went another route and used a combination of a soap for sensitive skin and an actual loofah.
I have a loofah soap pouch that I use for exfoliating. I simply slide my bar of soap into the slit, and the suds seep out through the mesh material.
The pouch is a loofah in itself. One side is rough, and this is the side I use to exfoliate my dead skin.
The other side is softer, and using it creates a great lather. So, one day, I can exfoliate, and the next, I can lather with soothing suds.
I find that it is good to use the loofah side only twice a week. That way, I don't irritate my skin.
Loofah soap feels so good on my skin, especially after a hard day of sweaty work. I love to use it in the summer to remove my tough spray-on sunscreen, which regular soap has trouble dissolving.
After I mow my yard, I have a combination of sweat, sunscreen, and grass particles covering my skin. I don't feel that regular soap is powerful enough to do the job. When I use loofah soap, I feel like I'm renewing my skin entirely.
It's also good to use less frequently in the winter, when dry, flaky skin becomes a problem. The loofah gets rid of the dead skin. I don't use it very often when it's cold, though, because my skin is already dry and sensitive then.
@Perdido – Most likely, if your soap doesn't state boldly on the label that it contains loofah, the beads are made from something else. Some exfoliating soaps use jojoba in their beads, but sadly, many companies are using plastic.
Unlike loofah and other plant products, the plastic microbeads do not break down naturally. So, when you throw a deteriorating bar of soap away, you have lots of plastic beads remaining, and these pollute the environment.
I always try to buy actual loofah soap. I don't want to be responsible for any more harm to our planet than I already have been.
Do all soaps that have scrubbing beads contain loofah? The only time I have heard the term "loofah" before was to describe a rough sponge that I scrub with in the shower, so I just assumed that every exfoliating product might contain it.
I have a bar of soap with microbeads for exfoliating, but I don't know what they are made of. They appear to be round and blue, and it feels really good to scrub my back with this soap, because it scratches the itch.
Are these microbeads made of loofah, or could they be made from something else? I would like to know what I am using on my skin.
I have been interested in handcrafted soap for a long time and I recently found a fantastic loofah soap recipe. It is easy to make, smells, wonderful and provides and gentle but effective exfoliation on the skin.
I have given a few bars away to my friends and they all love it. People think that it is not worth the time or the effort to try and make their own soap but you would be surprised. Many of my favorite bath and beauty products are things that I have made at home.
I think that regular exfoliation is crucial for healthy skin so I always keep a bar of loofah soap in my shower. Mine smells like lavender and green tea and it does wonders for my skin.
For a long time I use an exfoliating pad but I found that it was too harsh and it left my skin irritated. The loofah soap is a nice compromise. the abrasion is never too harsh and you have an instant infusion of soaps and moisturizers from the bar of soap. I am 43 but my skin look as good as it did in my 20s
Post your comments

source: m-a-p/FineFineWeb


יובל קוג'מן (Yuval Kogman) > Data-UUID-LibUUID-0.05 > Data::UUID::LibUUID
Annotate this POD
Open 1
View/Report Bugs
Module Version: 0.05 Source
Data::UUID::LibUUID - uuid.h based UUID generation (versions 2 and 4 depending on platform)
 use Data::UUID::LibUUID;
 my $uuid = new_uuid_string();
This module provides bindings for libuuid shipped with e2fsprogs or uuid-dev on debian, and also works with the system uuid.h on darwin.
new_uuid_string $version
new_uuid_binary $version
Returns a new UUID in string (dash separated hex) or binary (16 octets) format.
$version can be either 2, or 4 and defaults to whatever the underlying implementation prefers.
Version 1 is timestamp/MAC based UUIDs, like Data::UUID provides. They reveal time and host information, so they may be considered a security risk.
Version 2 is described here _URL_ It is similar to version 1 but considered more secure.
Version 4 is based just on random data. This is not guaranteed to be high quality random data, but usually is supposed to be.
On MacOS X getpid is called before UUID generation, to ensure UUIDs are unique accross forks. Behavior on other platforms may vary.
uuid_to_binary $str_or_bin
Converts a UUID from string or binary format to binary format.
Returns undef on a non UUID argument.
uuid_to_string $str_or_bin
Converts a UUID from string or binary format to string format.
Returns undef on a non UUID argument.
uuid_eq $str_or_bin, $str_or_bin
Checks if two UUIDs are equivalent. Returns true if they are, or false if they aren't.
Returns undef on non UUID arguments.
uuid_compare $str_or_bin, $str_or_bin
Returns -1, 0 or 1 depending on the lexicographical order of the UUID. This works like the cmp builtin.
Returns undef on non UUID arguments.
These two subroutines are a little hackish in that they take no arguments but also do not validate the arguments, so they can be abused as methods:
 package MyFoo;
 use Data::UUID::LibUUID (
 new_dce_uuid_string => { -as "generate_uuid" },
 sub yadda {
 my $self = shift;
 my $id = $self->generate_uuid;
This allows the ID generation code to be subclassed, but still keeps the hassle down to a minimum. DCE is UUID version two specification.
Creates a lexically ascending identifier containing a UUID, high resolution timestamp, and a counter.
This is not a UUID (it's longer), but if you can store variable length identifier (and exposing the system clock is not an issue) they can be used to create an identifier that is both universally unique, and lexically increasing.
Note that while the identifiers are universally unique, there is no universal ordering (that would require synchronization), so identifiers generated on different machines or even different process/thread could have IDs which interleave.
Data::GUID, Data::UUID, UUID, _URL_
Yuval Kogman
 Copyright (c) 2008 Yuval Kogman. All rights reserved
 This program is free software; you can redistribute
syntax highlighting:


text:
Land For Good is celebrating 20 years of helping farmers thrive, connecting people and land, and making more land available for farming across New England. We thank the many partners who have collaborated on research projects, new tools and resources, or workshopping policy ideas. We recognize the landowners who've bravely faced questions on how to keep land in agriculture and the farmers who've explored new opportunities with hope and determination.
We're proud to be working along with all of you at the forefront of changing the way land is accessed, held and transferred to future farmers across the country.
In 2004, Land For Good (LFG) was formed to help older farmers with farm succession. The organization's scope soon widened to include farm seekers who were eager to access farmland, and owners and managers of agricultural land. These audiences needed the resources and support that LFG grew to provide. We hired Field Agent staff on the ground in each New England state (most are or have been farmers themselves) to offer educational programs and direct support within a specific geographic area. We offered one of the first farm link programs in the country. We have developed dozens of guidebooks, fact sheets, and interactive online tools. We have served in working groups across New England to advance farmer-support programs and policies. And we've brought together diverse groups of service providers for training and peer-sharing. Organizations across the country have received training or technical assistance from LFG staff.
During the COVID pandemic, we pivoted to online delivery methods for educational content, providing greater access and a wider reach for farmers and landowners. Additionally, LFG identified social justice and racial equity as a strategic priority in 2019. We conducted assessments and training, in collaboration with consultants. In 2023 LFG embarked on a formal equity-infused planning process to refine the organization's strategic approach.
Informed by our work on the ground, we continue to share lessons learned about systemic barriers to farmland access, and suggest policy and service improvements that address the changes needed to shift power and farmland access more broadly. We continue to provide much needed services, public education, input on public policy, and a fresh examination of agricultural land tenure issues and challenges on a regional and national scale.
Save the date! Celebrate this 20 year milestone with good company and good food – and a special tribute – on September 25, 2024 at Smolak Farms in North Andover, Massachusetts. Tickets will go on sale this summer! As one of LFG's first farm clients, Smolak Farms is the perfect host for this anniversary celebration.


text:
The present biosphere model involves a stationary scenario (Reference Scenario) and a climate evolution and geological scenario (Central Scenario). The stationary and time evolution scenarios contain as primary recipients a well and the bay of Borholm, i.e., the waters surrounding the island of Aspo. The time evolution scenario additionally incorporates as primary recipients a waste sample from intrusion and, in a remote future time, the Baltic Sea.
Transport of radionuclides within the model system is assumed to be essentially immediate, except for in sediment subject to land rise. Except for this pathway, radioactive decay is therefore not included at all in the model. Land rise sediment is modeled to be subject to radioactive decay from the time the sediment no longer constitutes sea bottom until the desired time point of the model. Correction for radioactive decay is thus generally supposed to be made outside the biosphere model.
Unless otherwise indicated, yearly individual and population committed (50 years) radiation doses to man are considered, and all scenarios involve a constant flux of 1 Bq/y of each radionuclide considered into the respective primary recipient. Nominal values of radionuclide flux will finally be multiplied with the radiation dose per one Bq per year resulting from the model in order to obtain scaled radiation doses.


Закрыть форму
Medieval Baths of Bukhara
Medieval Baths, Bukhara
The traditions of the eastern hammam baths originated in antiquity, in the 7th century, when the first bath houses appeared. The steam bath tradition came to Central Asia from the Arabs, and they, in turn, took over her among the Romans. The spread of hammams in Asia went in parallel with Islam. In the khan's palaces, the baths "Hammam Hon" were necessarily built. There were special courtiers serving these premises. But the baths should have been popularly accessible, because for Muslims, "purity is half the faith," as the prophet Muhammad himself said. Therefore, starting from the 10th century, bath rooms have become an integral part of urban planning. Baths were usually part of bazaar complexes or housed in public buildings located in the city center.
Baths were divided into city and quarter, as well as male and female. City-wide baths were built near bazaars, in the most crowded places. According to the records of the ancient historian Narshakhi dating back to the 10th century, several city-wide bathing establishments already existed in Bukhara. Visiting baths became a favorite form of relaxation for citizens. It is known that in the 19th century 16 hamams acted in the city.
The two oldest baths (XVI-XVII centuries) and the most famous baths in Bukhara - the Bozori Kord male bathhouse and the Hammami Kunjak female bathhouse are still operating today. Bozori Kord is located next to the Taki-Telpak-Furushon shopping dome, and Hammami Kunjak is very close to the Kalyan Minaret. These, like other similar rooms, are heated using boilers with boiling water located under the floor. Steam from the boiler is fed into the steam room through a special hole. Bukhara baths in terms of technical structure represented undoubted progress in those days, but even today they function successfully, as they did five hundred years ago. In addition to relaxation and bathing, they provide various types of massage services, including therapeutic and relaxing. A visit to the Bukhara bath hammam will leave a lasting impression and will be useful for the soul and body.
Top Sights of Bukhara
Related links


text:
During the the 20th World Congress of the International Federation of Automatic Control (IFAC), 9-14 July 2017 in Toulouse, France, Martin Dahl presented our work titled 'Sequence Planner: Supporting Integrated Virtual Preparation and Commissioning'.
Abstract – It is essential to understand the operation sequences of a production system when designing or changing it. This paper will demonstrate how the software tool Sequence Planner (SP) not only supports this understanding by sequence visualization, but also improves the solution using optimization and verification. SP is a tool for modeling and analyzing automation systems. The tool has been developed since 2007 with an initial focus on supporting engineers when developing control code for programmable logical controllers. Today, SP is a micro-service architecture, usable in various areas like runtime control, online monitoring, energy optimization, and even emergency department patient planning. This paper presents a use case at an automotive company, where the operation sequences in a large number of automated robot stations, need to be modified. SP, together with virtual commissioning tools, automates this modification by identifying, optimizing, verifying and simulating operation sequences, and then updates the robot and control programs. This use case demonstrates the strength of SP and its architecture and how it is used for integrated virtual preparation and commissioning.


See the whole table
Select some columns
Filtering rows
Text patterns
14. Use text
To be or NULL to be
A little bit of mathematics
Let's practice
Until now, we only worked with numbers in our WHERE clauses. Is it possible to use letters instead? Of course it is! Just remember to put your text in single quotes like this: 'example'.
If you wanted to know the age of all Smiths in your table, you could use the following code:
FROM user
WHERE name = 'Smith';
Note that the case of the letters matters, i.e. 'Smith' is different than 'SMITH'.
Select all columns of all Ford cars from the table.
Stuck? Here's a hint!
 * FROM car
WHERE brand = 'Ford';


You can add HTML directly into this element to render on the page.
Just edit this element to add your own HTML.
Control Space monitoring
The Control Space detector is used to detect variables that have drifted outside the training envelope of the neural network model. By its nature, this technology can provides early warning of abnormal conditions and aid diagnostics by identifying the excursion variable.

Process Variable Significance
The Neural Network Significance Analyzer (NNSA), is designed to identify inputs significant to the process response. To the engineer this means minimizing the number of inputs going into a process model, discovering unknown correlations, and eliminating instrumentation not needed to determine a process response.
DATA ANALYTICS


text:
Apollo 11 moon rocks to be transferred to Minnesota Historical SocietyApollo 11 moon rocks are scheduled to be transferred Wednesday from the Minnesota National Guard to the Minnesota Historical Society in front of an audience of children at Science and Technology Academies Reinforcing Basic Aviation and Space Exploration (STARBASE) Minnesota.
Apollo 11 moon rocks are scheduled to be transferred
Wednesday from the Minnesota National Guard to the Minnesota Historical
Society in front of an audience of children at Science and Technology
Academies Reinforcing Basic Aviation and Space Exploration (STARBASE)
"The Apollo 11 moon rocks were found amongst military artifacts in a storage
area at the Veterans Service Building in St. Paul," said Army Maj. Blane R.
Iffert, former state historian for the Minnesota National Guard.
"When I searched the internet to find additional information about the moon
rocks, I knew we had to find a better means to display this artifact," said
Iffert. "It is stated on some websites that approximately 180 are currently
unaccounted for of the 270 moon rocks from the Apollo 11 and Apollo 17
missions. We've just lowered that number by one."
"We are honored to have this in our collection to preserve for future
generations," said Pat Gaarder, Minnesota Historical Society Deputy Director.
"Space exploration is an important part of our shared history. It is also
exciting to think that our collection includes artifacts from across the
globe and now with these moon rocks, the galaxy."
"These students will one day be the scientists, engineers and astronauts to
first set foot on Mars," said Kim Van Wie, executive director of STARBASE
Minnesota. "We're excited they'll be able to see, first hand, evidence of
this historic Apollo mission to the moon and how that has paved the way for
future exploration that they could eventually be a part of."
"The purpose of STARBASE is to educate and inspire urban youth in science,
technology, engineering and math (STEM)," said Van Wie. "STARBASE
Minnesota's hands-on curriculum, unique aerospace resources, state of the art
technology and exciting environment that immerses students in STEM has
inspired 41,000 youth since 1993."

source: HuggingFaceFW/fineweb-edu


All docs This doc
||
Skip to end of metadata
Go to start of metadata
A load balancer or reverse proxy is required to map external traffic with ports and URLs that WSO2 API Manager (WSO2 API-M) uses internally. Follow the instructions below to configure load balancing together with reverse proxying.
Step 1 - Create a SSL certificate for the load balancer
This step is only applicable for a High Availablity (HA) setup where multiple nodes are fronted by a load balancer.
Create a SSL certificate for the load balancer using the following instructions.
 1. Create the Server Key.
 sudo openssl genrsa -des3 -out <key_name>.key 1024
 2. Submit the certificate signing request (CSR).
 sudo openssl req -new -key <key_name>.key -out server.csr
 3. Remove the password.
 sudo cp <key_name>.key <key_name>.key.org
 sudo openssl rsa -in <key_name>.key.org -out <key_name>.key
 4. Sign your SSL Certificate.
 sudo openssl x509 -req -days 365 -in server.csr -signkey <key_name>.key -out <certificate_name>.crt
Step 2 - Configure the load balancer/reverse proxy server
In the following instructions, you are instructed to use NGINX to handle the load balancing requirements.
Although the following section instructs you to use NGINX as the load balancer, you can use any load balancer in your deployment based on your preference.
 What is NGINX?
NGINX is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server. For more information, see _URL_
Carry out the following steps to configure the load balancer to front multiple nodes.
 1. Install NGINX in a server configured in your cluster.
 The NGINX version that you need to install varies based on the WSO2 API-M components that the load balancer is fronting.
 DeploymentAPI-M NodesLBReason
 Single all-in-one deploymentN/A NGINX Community This deployment does not need Sticky Sessions (Session Affinity).
 Active-active deployment using single all-in-one nodesN/ANGINX PlusThis deployment requires Sticky Sessions, but NGINX Community version does not support it. You can use ip_hash as the sticky algorithm.
 Distributed deploymentGateway with a single Gateway ManagerNGINX Community versionThe Gateway node in this deployment does not need Sticky Sessions.
 Gateway with multiple Gateway ManagersNGINX PlusThe Gateway Manager nodes require Sticky Sessions, but NGINX Community version does not support it. You can use ip_hash as the sticky algorithm. Sticky Sessions are needed for port 9443 in the Gateway, and not needed for the pass through ports in the Gateway (8243, 8280).
 Store, Publisher, and Key ManagerNGINX PlusRequires Sticky Sessions, but NGINX Community version does not support it. You can use ip_hash as the sticky algorithm.
 For more information on installing NGINX, see NGINX community version and NGINX Plus.
 2. Copy the key and certificate files that you generated in step 1 - (4.) to the /etc/nginx/ssl/ location.
 3. Configure NGINX to direct the HTTP and HTTPs requests based on your deployment.
 1. Run the following command to identify the exact location of the <NGINX_HOME> directory. Inspect the output and identify the --prefix tag as it provides the location of the <NGINX_HOME> directory.
 nginx -V
 2. Update the ngnix.conf file with the required NGINX configuration given below. If not, you can create a file with the .conf suffix and copy it to the <NGINX_HOME>/conf.d directory.
 - All ports are default ports assuming no port offsets are used.
 - The key and the certificate for SSL is assumed to be at the <NGINX_HOME>/ssl/ location. The placeholders {cert_name} and {key_name} are the name of the certificate and key generated.
 - The directories used for access and error logs should be created if they do not exist.
 - The placeholder {node-ip-address} corresponds to the IP address of the backend node in which the WSO2 API-M server is running.
 - In the sample configuration given below, the hostname api.am.wso2.com is used to access all portals (publisher, store, admin, and carbon) and gw.am.wso2.com is used to invoke APIs. Only HTTPS is allowed.
upstream sslapi.am.wso2.com {
 server {node-ip-address}:9443;
}
upstream sslgw.am.wso2.com {
 server {node-ip-address}:8243;
}
server {
 listen 80;
 server_name api.am.wso2.com;
 rewrite ^/(.*) _URL_ permanent;
}
server {
 listen 443;
 server_name api.am.wso2.com;
 proxy_set_header X-Forwarded-Port 443;
 ssl on;
 ssl_certificate /etc/nginx/ssl/{cert_name};
 ssl_certificate_key /etc/nginx/ssl/{key_name};
 location / {
 proxy_set_header X-Forwarded-Host $host;
 proxy_set_header X-Forwarded-Server $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Host $http_host;
 proxy_read_timeout 5m;
 proxy_send_timeout 5m;
 proxy_pass _URL_;
 }
 access_log /etc/nginx/log/am/https/access.log;
 error_log /etc/nginx/log/am/https/error.log;
}
server {
 listen 443;
 server_name gw.am.wso2.com;
 proxy_set_header X-Forwarded-Port 443;
 ssl on;
 ssl_certificate /etc/nginx/ssl/{cert_name};
 ssl_certificate_key /etc/nginx/ssl/{key_name};
 location / {
 proxy_set_header X-Forwarded-Host $host;
 proxy_set_header X-Forwarded-Server $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Host $http_host;
 proxy_read_timeout 5m;
 proxy_send_timeout 5m;
 proxy_pass _URL_;
 }
 access_log /etc/nginx/log/gw/https/access.log;
 error_log /etc/nginx/log/gw/https/error.log;
}
 - The placeholders {node-1-ip-address} and {node-2-ip-address} correspond to the IP addresses of the backend nodes in which APIM servers are running.
 - In the sample configuration given below, the hostname api.am.wso2.com is used to access all portals (publisher, store, admin and carbon) and gw.am.wso2.com is used to invoke APIs. Only HTTPS is allowed.
 - This configuration uses a session cookie to configure stickiness. However, if you are using Nginx community version, configuring sticky sessions based on session cookie is not supported. It is possible to use ip_hash method instead.
In an Active-Active deployment, It is mandatory to set up sticky sessions (session affinity) in the load balancers that front the Publisher and Store, and it is optional in the load balancer (if any) that fronts Key Manager or Gateway.
However, authentication via session ID fails when sticky sessions are disabled in the load balancers of Publisher and store.
upstream sslapi.am.wso2.com {
 server {node-1-ip-address}:9443;
 server {node-2-ip-address}:9443;
 #ip_hash;
 sticky learn create=$upstream_cookie_jsessionid
 lookup=$cookie_jsessionid
 zone=client_sessions:1m;
}
upstream sslgw.am.wso2.com {
 server {node-1-ip-address}:8243;
 server {node-2-ip-address}:8243;
}
server {
 listen 80;
 server_name api.am.wso2.com;
 rewrite ^/(.*) _URL_ permanent;
}
server {
 listen 443;
 server_name api.am.wso2.com;
 proxy_set_header X-Forwarded-Port 443;
 ssl on;
 ssl_certificate /etc/nginx/ssl/{cert_name};
 ssl_certificate_key /


.. _developer-database: Database ======== As of version 0.8.0, Buildbot has used a database as part of its storage backend. This section describes the database connector classes, which allow other parts of Buildbot to access the database. It also describes how to modify the database schema and the connector classes themselves. Database Overview ----------------- All access to the Buildbot database is mediated by database connector classes. These classes provide a functional, asynchronous interface to other parts of Buildbot, and encapsulate the database-specific details in a single location in the codebase. The connector API, defined below, is a stable API in Buildbot, and can be called from any other component. Given a master ''master'', the root of the database connectors is available at ''master.db'', so, for example, the state connector's ''getState'' method is ''master.db.state.getState''. The connectors all use 'SQLAlchemy Core '_ to achieve (almost) database-independent operation. Note that the SQLAlchemy ORM is not used in Buildbot. Database queries are carried out in threads, and report their results back to the main thread via Twisted Deferreds. Schema ------ The database schema is maintained with 'SQLAlchemy-Migrate '_. This package handles the details of upgrading users between different schema versions. The schema itself is considered an implementation detail, and may change significantly from version to version. Users should rely on the API (below), rather than performing queries against the database itself. API --- types ~~~~~ Identifier .......... .. _type-identifier: An "identifier" is a nonempty unicode string of limited length, containing only ASCII alphanumeric characters along with ''-'' (dash) and ''_'' (underscore), and not beginning with a digit Wherever an identifier is used, the documentation will give the maximum length in characters. The function :py:func:'buildbot.util.identifiers.isIdentifier' is useful to verify a well-formed identifier. buildrequests ~~~~~~~~~~~~~ .. py:module:: buildbot.db.buildrequests .. index:: double: BuildRequests; DB Connector Component .. py:exception:: AlreadyClaimedError Raised when a build request is already claimed, usually by another master. .. py:exception:: NotClaimedError Raised when a build request is not claimed by this master. .. py:class:: BuildRequestsConnectorComponent This class handles the complex process of claiming and unclaiming build requests, based on a polling model: callers poll for unclaimed requests with :py:meth:'getBuildRequests', then attempt to claim the requests with :py:meth:'claimBuildRequests'. The claim can fail if another master has claimed the request in the interim. An instance of this class is available at ''master.db.buildrequests''. .. index:: brdict, brid Build requests are indexed by an ID referred to as a *brid*. The contents of a request are represented as build request dictionaries (brdicts) with keys * ''buildrequestid'' * ''buildsetid'' * ''builderid'' * ''buildername'' * ''priority'' * ''claimed'' (boolean, true if the request is claimed) * ''claimed_at'' (datetime object, time this request was last claimed) * ''claimed_by_masterid'' (integer, the id of the master that claimed this buildrequest) * ''complete'' (boolean, true if the request is complete) * ''complete_at'' (datetime object, time this request was completed) * ''submitted_at'' (datetime object, time this request was completed) * ''results'' (integer result code) * ''waited_for'' (boolean) .. py:method:: getBuildRequest(brid) :param brid: build request id to look up :returns: brdict or ''None'', via Deferred Get a single BuildRequest, in the format described above. This method returns ''None'' if there is no such buildrequest. Note that build requests are not cached, as the values in the database are not fixed. .. py:method:: getBuildRequests(buildername=None, complete=None, claimed=None, bsid=None, branch=None, repository=None) :param buildername: limit results to buildrequests for this builder :type buildername: string :param complete: if true, limit to completed buildrequests; if false, limit to incomplete buildrequests; if ''None'', do not limit based on completion. :param claimed: see below :param bsid: see below :param repository: the repository associated with the sourcestamps originating the requests :param branch: the branch associated with the sourcestamps originating the requests :returns: list of brdicts, via Deferred Get a list of build requests matching the given characteristics. Pass all parameters as keyword parameters to allow future expansion. The ''claimed'' parameter can be ''None'' (the default) to ignore the claimed status of requests; ''True'' to return only claimed builds, ''False'' to return only unclaimed builds, or a ''master ID'' to return only builds claimed by a particular master instance. A request is considered unclaimed if its ''claimed_at'' column is either NULL or 0, and it is not complete. If ''bsid'' is specified, then only build requests for that buildset will be returned. A build is considered completed if its ''complete'' column is 1; the ''complete_at'' column is not consulted. .. py:method:: claimBuildRequests(brids[, claimed_at=XX]) :param brids: ids of buildrequests to claim :type brids: list :param datetime claimed_at: time at which the builds are claimed :returns: Deferred :raises: :py:exc:'AlreadyClaimedError' Try to "claim" the indicated build requests for this buildmaster instance. The resulting deferred will fire normally on success, or fail with :py:exc:'AlreadyClaimedError' if *any* of the build requests are already claimed by another master instance. In this case, none of the claims will take effect. If ''claimed_at'' is not given, then the current time will be used. As of 0.8.5, this method can no longer be used to re-claim build requests. All given ID's must be unclaimed. Use :py:meth:'reclaimBuildRequests' to reclaim. .. index:: single: MySQL; limitations .. index:: single: SQLite; limitations .. note:: On database backends that do not enforce referential integrity (e.g., SQLite), this method will not prevent claims for nonexistent build requests. On database backends that do not support transactions (MySQL), this method will not properly roll back any partial claims made before an :py:exc:'AlreadyClaimedError' is generated. .. py:method:: reclaimBuildRequests(brids) :param brids: ids of buildrequests to reclaim :type brids: list :returns: Deferred :raises: :py:exc:'AlreadyClaimedError' Re-claim the given build requests, updating the timestamp, but checking that the requests are owned by this master. The resulting deferred will fire normally on success, or fail with :py:exc:'AlreadyClaimedError' if *any* of the build requests are already claimed by another master instance, or don't exist. In this case, none of the reclaims will take effect. .. py:method:: unclaimBuildRequests(brids) :param brids: ids of buildrequests to unclaim :type brids: list :returns: Deferred Release this master's claim on all of the given build requests. This will not unclaim requests that are claimed by another master, but will not fail in this case. The method does not check whether a request is completed. .. py:method:: completeBuildRequests(brids, results[, complete_at=XX])


text:
Spring Garden Day event planned at Extension Demonstration Gardens in Bear Creek
Published 9:00 am, Friday, February 22, 2013
Jump start your garden by attending Spring Garden Day, March 16, featuring timely talks and how-to demonstrations at the Texas A&M AgriLife Extension Service Office and Gardens, 3033 Bear Creek Dr., Houston.
Harris County Horticulture Extension Agents and Harris County Master Gardeners will give three informative lectures:
- "The Dirt on Great Garden Soil" will tell how to amend your garden soil and check nutrient levels to ensure great results.
- "Grow Your Own Groceries" will provide tips on what vegetables to plant in our area and techniques to grow them to an optimal harvest.
Trending Health News
- Study Reveals Window Blind Cords Remain A Significant Threat To Children's Safety GeoBeats
- 7-Year-Old Girl Asks Santa For Food And Blanket In Heartbreaking Letter GeoBeats
- Dell Children's open heart surgery Fox7
- Japanese Chef Fillets Enormous Sunfish on the Streets of Tokyo Storyful
- Preview: Winter entertainment in Hampton Roads DailyPress
- Holiday Food Boxes DailyPress
- Child Asks Santa For Food And Blanket In Heartbreaking Letter GeoBeats
- Good Day delivers expert wrapping tips Fox29
- The truth about people on food stamps Mic
- Scientists Capture Bizarre Monkey-Deer 'Sexual Interactions' On Video GeoBeats
- "Good Bugs and Great Flowers" will give a glimpse at some of the beneficial insects in local gardens and what plants will help to attract them.
Running concurrently with the talks will be demonstrations in the gardens surrounding the office.
Trained Master Gardeners in the vegetable gardens will discuss soil preparation in raised beds, proper seed planting, setting out transplants and managing pests.
Others in the flower gardens will show how to divide perennials, plant woody ornamentals, prepare in-ground soil and properly mulch beds.
More Master Gardeners will be demonstrating composting techniques and container gardening methods. There will also be an Ask-A-Master Gardener Booth to answer attendees' questions on other horticulture and landscaping topics.
The educational event begins at 8 a.m. with refreshments and registration. Lectures and demonstrations begin at 8:30 a.m. and run through noon. Cost is $15.
Harris County Master Gardeners are volunteers trained to share research-based horticulture knowledge with residents of the county in support of the Texas A&M AgriLife Extension Service.
For details of this and other upcoming events, call _PHONE_ or like Harris Count Master Gardeners Association on Facebook.
Individuals with disabilities requiring auxiliary aids, services or accommodations in order to participate in Extension programs are encouraged to call _PHONE_ to discuss specific needs. Harris County Master Gardeners is a program of the Texas A&M AgriLife Extension Service. Educational programs of the Texas A&M AgriLife Extension Service are open to all people without regard to race, color, sex, disability, religion, age, or national origin.


The first German Grand Prix was held at Berlin in 1926. Sadly the rain sodden event was overshadowed by accidents, including one which killed three officials.
After this awful Grand Prix at Berlin's Avus the Grand Prix moved to the legendary (in my opinion) Nuburgring circuit. Work at the Nuburgring began in 1925, so to provide employment in the local area. Including the "Southern Circuit Extension", the Nurburgring was 17.58 miles long. The Longest Circuit used in Modern Formula One (Spa-Franchorchamps) is 4.35 miles. Grands Prix were ran at the Nurburgring until 1939, when World War Two began.
It took until 1949 for the Nurburgring to host another race. In 1951 it became a championship race for the new Grand Prix Series. For this 1951 race 180,000 fans watched Alberto Ascari win in a Ferrari. This circuit had a reputation as a circuit that proved the great drivers such as Juan Manuel Fangio, who won what he described as his "Best Ever Race" there in 1957.
In 1959 the German Grand Prix was held at Avus in Berlin again, where the race was held over two heats (This was unique). However, the return to Avus was marred by the death of Jean Behra. Formula One cars never raced at Avus again.
In 1960 there was no German Grand Prix, however 1961 seen the German Grand Prix hosted at Nurburgring again. During the '60's Graham Hill, John Surtees, Jim Clark, Jack Brabham and Denny Hulme won at the Nurburgring, as did Jackie Stewart, by over 4 minutes in 1968. Hockenheim hosted it's first German Grand Prix in 1970 as the Nurburgring underwent modifications, sadly this circuit will forever be known as the circuit where Jim Clark died in a Formula Two Race in 1968.
The next year Formula One returned to the Nurburgring, however it quickly became clear that the Nurburgring was too old for modern F1 cars. The last time a German Grand Prix was held on the old Nurburgring was 1976, where Niki Lauda crashed and suffered heavy burns.
In 1977 the German Grand Prix was moved to it's current home Hockenheim, where Nika Lauda, having made a brave and quick recovery from his almost fatal accident the previous year, won. This circuit had very long straights and was famous for destroying F1 car engines. 1980 saw another tragedy at Hockenheim as Patrick Depallier of Clement-Ferrand, France died after a testing accident at the Ostkurve. The race in 1982 was famous, as Brazilian Three Times World Champion Nelson Piquet fought Salazar after they collided as Piquet tried to "lap" him. Patrick Tambay of France won that ract in 1982.
In 1984, German f1 fans were treated to both the German Grand Prix at Hockenheim at the European Grand Prix at the Nuburgring. However this was a much shorter circuit then the old legendary Nurburgring (This one was just 2.82 miles long).
This new circuit hosted the German Grand Prix of 1985 when Prost won. The German Grand Prix moved back to Hockenheim in 1986, and has been hosted there ever since. Since 1995 the new Nurburgring circuit has hosted the European Grand Prix.
Finally, the last really interesting German Grand Pris was the German Grand Prix of 2000. This is of note because of the manner in which Rubens Barrichello won the race. Due to the following he won the race despite starting 18th (out of 22).
 1. His teammate Michael Schumacher collided with Gaincarlo Fisichella and crashed on the first corner.
 2. On lap 24 a protestor walked on the track with the following on his waterproof garment "Mercedes Benz, who knew about my health problems, offered me a job I could not do and then sacked me for physical ineptitude after 20 years service". He forced the safety car out which meant that the McLaren Mercedes cars of David Coulthard and Mika Hakkinen were no longer far ahead.
 3. Rubens Barrichello stayed out whenever it started to rain, on his slick tyres while Hakkinen & Coulthard Pitted for rain tyres.
 - Formula 1 Yearbook 2000-2001 ISBN 0-752534-735-6
 - The Ultimate Encyclopedia of Formula One ISBN 0-340-73887-1


Sponsored By
Scaling Dedicated Game Servers with Kubernetes: Part 3 – Scaling Up Nodes
Third part of a series on managing and scaling Dedicated Game Servers with open source projects Kubernetes and Docker. In this post we look at using game server CPU information to increase the nodes in our Kubernetes cluster as our player base increases.
Mark Mandel, Blogger
October 11, 2017
13 Min Read
Originally posted on compoundtheory.com.
This is part three of a fivefour-part series on scaling game servers with Kubernetes.
In the previous two posts we looked at hosting dedicated game servers on Kubernetes and measuring and limiting their memory and CPU resources. In this instalment we look at how we can use the CPU information from the previous post to determine when we need to scale up our Kubernetes cluster because we've run out of room for more game servers as our player base increases.
Separating Apps and Game Servers
The first step we should make before starting to write code to increase the size of the Kubernetes cluster, is to separate our applications -- such as match makers, the game server controllers, and the soon-to-be-written node scaler -- onto different nodes in the cluster than where the game servers would be running. This has several benefits:
 1. The resource usage of our applications is now going to have no effect on the game servers, as they are on different machines. This means that if the matchmaker has a CPU spike for some reason, there is an extra barrier to ensure there is no way it could unduly affect a dedicated game server in play.
 2. It makes scaling up and down capacity for dedicated game servers easier - as we only need to look at game server usage across a specific set of nodes, rather than all potential containers across the entire cluster.
 3. We can use bigger machines with more CPU cores and memory for the game server nodes, and smaller machines with less cores and memory for the controller applications as they need less resources, in this instance. We essentially are able to pick the right size of machine for the job at hand. This is gives us great flexibility while still being cost effective.
Kubernetes makes setting up a heterogenous cluster relatively straightforward and gives us the tools to specify where Pods are scheduled within the cluster - via the power of Node Selectors on our Pods. It's worth noting that that there is also a more sophisticated Node Affinity feature in beta, but we don't need it for this example, so we'll ignore its extra complexity for now. To get started, we need to assign labels (a set of key-value pairs) to the nodes in our cluster. This is exactly the same as you would have seen if you've ever created Pods with Deployments and exposed them with Services, but applied to nodes instead. I'm using Google Cloud Platform's Container Engine, and it uses Node Pools to apply labels to nodes in the cluster as they are created and set up heterogenous clusters - but you can also do similar things on other cloud providers, as well as directly through the Kubernetes API or the command line client. In this example, I added the labels role:apps and role:game-server to the appropriate nodes in my cluster. We can then add a nodeSelector option to our Kubernetes configurations to control which nodes in the cluster Pods are scheduled onto.
For example, here is the configuration for the matchmaker application, where you can see the nodeSelector set to role:apps to ensure it has container instances created only on the application nodes (those tagged with the "apps" role).
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: matchmaker
spec:
 replicas: 5
 template:
 metadata:
 labels:
 role: matchmaker-server
 spec:
 nodeSelector:
 role: apps # here is the node selector
 containers:
 - name: matchmaker
 image: gcr.io/soccer/matchmaker
 ports:
 - containerPort: 8080
By the same token, we can adjust the configuration from the previous article to make all the dedicated game server Pods schedule just on the machines we specifically designated for them, i.e. those tagged with role: game-server:
apiVersion: v1
kind: Pod
metadata:
 generateName: "game-"
spec:
 hostNetwork: true
 restartPolicy: Never
 nodeSelector:
 role: game-server # here is the node selector
 containers:
 - name: soccer-server
 image: gcr.io/soccer/soccer-server:0.1
 env:
 - name: SESSION_NAME
 valueFrom:
 fieldRef:
 fieldPath: metadata.name
 resources:
 limits:
 cpu: "0.1"
Note that in my sample code, I use the Kubernetes API to provide a configuration identical to the one above, but the yaml version is easier to understand, and it is the format we've been using throughout this series.
A Strategy for Scaling Up
Kubernetes on cloud providers tends to come with automated scaling capabilities, such as the Google Cloud Platform Cluster Autoscaler, but since they are generally built for stateless applications, and our dedicated game servers store the game simulation in memory, they won't work in this case. However, with the tools that Kubernetes gives us, it's not particularly difficult to build our own custom Kubernetes cluster autoscaler! Scaling up and down the nodes in a Kubernetes cluster probably makes more sense for a cloud environment, since we only want to pay for the resources that we need/use. If we were running in our own premises, it may make less sense to change the size of our Kubernetes cluster, and we could just run a large cluster(s) across all the machines we own and leave them at a static size, since adding and removing physical machines is far more onerous than on the Cloud and wouldn't necessarily save us money since we own/lease the machines for much longer periods. There are multiple potential strategies for determining when you want to scale up the number of nodes in your cluster, but for this example we'll keep things relatively simple:
 - Define a minimum and maximum number of nodes for game servers, and make sure we are within that limit.
 - Use CPU resource capacity and usage as our metric to track how many dedicated game servers we can fit on a node in our cluster (in this example we're going to assume we always have enough memory).
 - Define a buffer of CPU capacity for a set number of game servers at all times in the cluster. I.e. add more nodes if at any point you couldn't add n number of servers to the cluster without running out of CPU resources in the cluster at any point in time.
 - Whenever a new dedicated game server is started, calculate if we need to add a new node in the cluster because the CPU capacity across the nodes is under the buffer amount.
 - As a fail-safe, every n seconds, also calculate if we need to add a new node to the cluster because the measured CPU capacity resources are under the buffer.
Creating a Node Scaler
The node scaler essentially runs an event loop to carry out the strategy outlined above. Using Go in combination with the native Kubernetes Go client library makes this relatively straightforward to implement, as you can see below in the Start() function of my node scaler. Note that I've removed most of the error handling and other boilerplate to make the event loop clearer, but the original code is here if you are interested.
// Start the HTTP server on the given port
func (s *Server) Start() error {

 // Access Kubernetes and return a client
 s.cs, _ = kube.ClientSet()
 // ... there be more code here ...

 // Use the K8s client's watcher channels to see game server events
 gw, _ := s.newGameWatcher()
 gw.start()
 // async loop around either the tick, or the event stream
 // and then scaleNodes() if either occur.
 go func() {
 log.Print("[Info][Start] Starting node scaling...")
 tick := time.Tick(s.tick)
 // ^^^ MAIN EVENT LOOP HERE ^^^
 for {
 select {
 case <-gw.events:
 log.Print("[Info][Scaling] Received Event, Scaling...")
 s.scaleNodes()
 case <-tick:
 log.Printf("[Info][Scaling] Tick of %#v, Scaling...", tick)
 s.scaleNodes()
 }
 }
 }()

 // Start the HTTP server
 return errors.Wrap(s.srv.ListenAndServe(), "Error starting server")
}
For those of you who aren't as familiar with Go, let's break this down a little bit:
 1. kube.ClientSet() - we have a small piece of utility code, which returns to us a Kubernetes ClientSet that gives us access to the Kubernetes API of the cluster that we are running on.
 2. gw, _ := s.newGameWatcher - Kubernetes has APIs that allow you to watch for changes across the cluster. In this particular case, the code here returns a data structure containing a Go Channel (essentially a blocking-queue), specifically gw.events, that will return a value whenever a Pod for


Method: edits.images.list
Stay organized with collections Save and categorize content based on your preferences.
Lists all images. The response may be empty.
HTTP request
GET _URL_
The URL uses gRPC Transcoding syntax.
Path parameters
Parameters
packageName
string
Package name of the app.
editId
string
Identifier of the edit.
language
string
Language localization code (a BCP-47 language tag; for example, "de-AT" for Austrian German). There must be a store listing for the specified language.
imageType
enum (AppImageType)
Type of the Image. Providing an image type that refers to no images will return an empty response.
Request body
The request body must be empty.
Response body
If successful, the response body contains data with the following structure:
Response listing all images.
JSON representation
{
 "images": [
 {
 object (Image)
 }
 ]
}
Fields
images[]
object (Image)
All listed Images.
Authorization Scopes
Requires the following OAuth scope:
 - _URL_


text:
HOME | LAWS | ORGANIZATIONS | CASES | LEGISLATION | HEADLINES
Renovations in the New Cumberland, Pennsylvania, public library caused a stir in the local home school community because of a new mural that some home schoolers found offensive.
According to WHTM News, Dawn Gribb, the artist who painted the mural, was trying to "do something to get the kids to go down to the children's room." She painted children running around in a park, each child having the name of a local school on his or her T-shirt. The one student in the painting, who had "home schooled" on his shirt, was a young boy sitting on a bench with a "Wet Paint" sign on it. Gribb says that she was trying to portray a young toddler who couldn't yet read.
Local home schoolers, however, were offended, believing that the mural implied that home schooled children cannot read well. Many called the library or local media to complain.
After the controversy erupted, the New Cumberland Public Library asked Gribb to paint over the offending shirt. The Library Board President, Elizabeth Stone, told WHTM that home schoolers are a big part of the library, and that New Cumberland Library actually arranges special programs just for them.
Home schoolers working together with state organizations and Home School Legal Defense Association have fought legal and cultural discrimination for years. If your family experiences legal difficulties because of your home schooling, please feel free to contact us for assistance.


text:
Taking a shine to number 100
By Peter Weiss, 15:49 PM April 15, 2008
Scientists have for the first time literally shed light on properties of the radioactive element fermium–a metal discovered some 50 years ago.
Spectroscopy, or the measurement of the wavelengths of light that materials emit or absorb, is a standard way to probe characteristics of materials, including what energy levels their electrons can assume. However, spectroscopy of heavy elements, such as artificially made fermium, element number 100, is difficult because such substances are scarce and ...
Source URL: _URL_


WILD LIFE IN ACONCAGUA about aconcagua
The reserve is in the phytogeographic High Andean province. Because it is an ecosystem of extreme elevation and low precepitations, turning the weather rigurous, the biodiversity is low. However, the animal and plant species are interesting, showing a remarkable adaptation to high altitude life and concentrating themselves towards the lower areas of the park.
The predominante vegetation are open pastures of huecú and coirones with limited areas of low trees, such as yellow leña, yareta and goat horn. In general, the vegetation adapts to endure low temperatures, poor soils and snow and wind storms, almost disappearing over 4000 m All this is what gives it its stocky look. There are flatter areas where water accumulates and you see other kinds of vegetation, that endures long periods of soil freezing.
The typical animal species are the condor, the eagle, mountain mice and the red fox, there is a frog species that stands out and a lizard, both of them typical mountain species. The flat lands and the streams are visited by special bird species, such as chorlos, churrines and torrente ducks. There are large herds of llamas, followed by pumas, the main predator. The european hares are abundant, an exotic animal in the region.
As an adaptation to cold weather, the animal species are, in general, big, avoiding the loss of their body heat. The mammals posess soft and thick fur, that keeps them warm. Other species, such as the guanacos (llamas), pumas or foxes have the capacity to emigrate to the lower regions when the weather is too cold, this is the case of the condor and the eagle. The mountain mice can not move very far, so they take refuge in their caverns during the winter.
Climbing Aconcagua
Hundred of people climb aconcagua every year and we have private or scheduled expeditions for you to climb one of the seven summits.
Copyright 2020 – Inka Expediciones / Sitemap / Suscribe to our newsletter


Question:
Explain how you can do testing in GO?
Answer:
It has a lightweight testing framework consists of the go test command and the testing package.
To write a test you have to create a file with a name ending in _testing. Go which contains functions named TestXXX with signature func (t *testing.T). The test framework runs each such function.
Keywords:
© 2017 QuizBucket.org


text:
Looking to brighten up your classroom walls or catch the attention of students as they walk along the corridor?
As a response to popular demand, Oxford University has released a series of free and striking classroom display posters based on select images from the First World War Poetry Digital Archive. These include Wilfred Owen's manuscript for 'Anthem for Doomed Youth' and the front cover of 'The Hydra': the magazine created by patients at Craiglockhart Hospital. You will need to create an account in TES Connect to be able to download these but this process is quick and simple only requiring a username and email address; again all free of charge.
Resource Type : image389 visits / 0 Like(s) (Like this resource)


text:
Over the past decade, unravelling mysteries of the brain has been largely driven by synergizing advancements in imaging with those in computational sciences. One of the most prominent examples is fMRI. However, fMRI also has some limitations.
A promising replacement candidate is functional ultrasound (fUS). Erasmus MC has already developed fUS prototypes that have been successfully used in neuroscientific experiments and will be tested in the clinic shortly. Although preliminary results confirm the potential of fUS and its benefit over fMRI, researchers are severely limited by the currently available hardware, both in terms of data acquisition as well as analysis. CUBE will combine next-generation ultrasound systems with a cutting-edge, heterogeneous high-performance computing (HPC) cluster.
CUBE wants to bring the state-of-the-art ultrasound technology to the Netherlands in order to generate unique opportunities to further unravel the mysteries of the brain and develop applications of the ultrasound technology in the clinic.


Mission Statement - NALMS
NALMS Mission Statement
The Mission Statement is Simple and Clear
The specific goals of the society, as spelled out in the Constitution and Bylaws, are as follows:
 1. To facilitate the exchange of information on the technical and administrative aspects of managing lakes and their watersheds.
 2. To promote public awareness of lake ecosystems.
 3. To encourage public support for national, state or provincial, and local programs promoting management of lakes and their watersheds.
 4. To provide guidance to public and private agencies involved in or planning management activities for lakes and their watersheds.
 5. To improve the professional status of all persons engaged in any aspect of managing lakes and their watersheds.


text:
A general term used to denote any substance or mixture added to assist the fusion of minerals. In the large way, limestone and fusible spar are used as fluxes. The fluxes made use of in philosophical experiments consist usually of alkalies, which render earthy mixtures fusible by converting them into glass, or else glass itself into powder. Alkaline fluxes are either the crude flux, the white flux, or the black flux. Crude flux is a mixture of nitre and tartar, which is put into the crucible along with the metal intended to be fused. White flux is formed by projecting equal parts of a mixture of nitre and tartar, by moderate proportions at a time, into a red hot crucible. In the detonation which ensues, the nitric acid is decomposed and flies off with the tartaric acid.
and the remainder consists of the potash in a state of considerable purity. Black flux consists of two parts of tartar to one of nitre, on which account the combustion is incomplete, and a considerable portion of the tartaric acid is decomposed by mere heat, and leaves behind a quantity of charcoal, on which the colour depends. It is used in the reduction of metallic ores, which it effects by combining with the oxygen of the oxide. Mowean's reducing flux is made of eight parts of pulverized glass, one of calcined borax, and half a part of charcoal. Care must be taken to use a glass which contains no lead.


- Keyboard
Mouse / Trackball
Monitor
Chair / Footrest
Document Holder
Phone
Desk
Lighting
Buyer's Guide
Keyboard Buyer's Guide
Keyboard Tray Buyer's Guide
Overview
There are a variety of alternatives to the traditional keyboard, from models that split the keys into two halves to voice recognition software that turns you speech into text. Learn about them all, and find out about accessories that can make computing more comfortable - from wrist rests and keyboard trays to software that types for you.
Keyboards
Accessories
Traditional Keyboard
The most commonly used type of keyboard, the 101-key "traditional" version is often included when you purchase a computer. (Some models improve upon the basic version by adding special "function keys" that can group keystrokes and reduce the amount of typing necessary.)
Split-Design Keyboards (Fixed- Angle)
Split keyboards are what people most commonly think of when they hear the term "ergonomic keyboard". These keyboards divide the letter keys into two halves, and angle each half slightly outwards. The premise is that this is a more natural position for your wrists and forearms (pointing inward, without requiring your elbows to come in as far) thus better conforming to the contours of your body - especially for people with broad chests.
Split Design Keyboards (Adjustable- Angle)
Adjustable-angle split keyboards are similar to fixed-angle, with the advantage that the angle between the two halves can be changed and sometimes the two halves can be physically separated. This allows you to position each half wherever your wrists most naturally rest - or place each half on specially-designed trays attached to each arm rest. (Some people even arrange them vertically, and position their wrists as if shaking someone's hand.). Split-angle designs often also allow you to change the slope (tent) of the keyboard.
Contoured Keyboards
Contoured keyboards are sculpted to fit the hand; they place the keys in recessed curves that more closely match the natural position of the fingers. This reduces the distance your fingers have to travel when striking keys. These keyboards don't feature quite the same layout as traditional keyboards - some keys are rearranged to be operated by the thumb, since it's stronger than the other fingers.
Chording Keyboards
Chording keyboards use fewer keys than traditional keyboards, and are operated by using combinations of keys instead of individual keystrokes. This reduces the total number of keystrokes and - since your fingers generally stay on the same keys - the amount your fingers or hands must move (this helps reduce the repetition that can lead to Repetitive Stress Injuries.) Since this is a "non-traditional" layout, it takes time to learn- and efficiency (even after training) is often slightly worse than with other layouts.
Dvorak Layout
Dvorak designs rearrange the key layout so that the most commonly-used letters are positioned directly under a user's strongest fingers - and in the "home" row. This improves typing efficiency, but as with all alternative layouts, takes time to learn.
Back to Top
Keyboard Trays
Keyboard trays attach underneath your desk or work surface, and provide a framework for your keyboard that's height and position-adjustable - a huge improvement, ergonomically. They're a nearly essential part of any ergonomically-optimized workstation. Some higher-end models include an integrated mouse tray - a good feature to look for. Some keyboard trays only allow the keyboard to be angled upwards (positive slope) - these aren't recommended because they compromise wrist posture. Other trays only allow the keyboard to be angled downwards (negative slope) - these are recommended because they improve wrist posture. Some keyboard trays allow the keyboard to be angled upwards or downwards (positive or negative slope) - these are only recommended if users are taught to angle the keyboard tray slightly downwards. In addition, there are lap-held keyboard trays, which may be helpful for people whose short desk depth would otherwise force their monitor to be positioned too close. Since these trays aren't attached to a desk, users can vary their distance from their workstation to help maintain the proper ergonomic viewing distance.
Wrist Rests (Palm Rests)
Wrist rests are cushions placed in front of your keyboard that support your wrists during periods of rest. There are a number of different options to choose from - gel-filled, rubber, etc. Remember DO NOT REST YOUR WRISTS ON A WRIST REST. Rather, rest the heel of the palm of your hand on the rest. Do not use wrist rests while typing or mousing - only while resting.
Voice Recognition Software
These programs allow you to dictate instead of type. Special software lets you speak to your computer (via an attached microphone), and then transcribes your voice into text that can be edited manually. This technology is constantly improving, and many developers claim accuracy rates as high as 95-99%. Remember, however, that your vocal chords are *also* muscles - and can become just as tired or worn out as your fingers!
Macros and Key Sequences
Key Sequences or "Macros" allow you to automate common tasks (such as formatting a document or inserting your address), significantly reducing the amount of typing you need to do (and hopefully reducing repetitive stress injuries!). You can even buy software programs that allow you to easily record macros for *any* software and assign complex key sequences.
Break Timers
Break timers keep track of your keystrokes or usage, then remind you at certain intervals to take rest breaks. Proper work pacing is thought to help reduce the occurrence Musculoskeletal Disorders.
Back to Top
Office Ergonomics | Your Health | Mobile Ergonomics | For Kids | For Ergonomists | For Office Administrators
Company | Advertise | Training | Contact
© 1999 - HealthyComputing.com™ • All Rights Reserved
Privacy Policy | Terms of Use


text:
For more information on the Concurrency Runtime Framework, see Concurrency Runtime: The Resource Manager.
Visual C++ 2010 comes with new features and enhancements to simplify more native programming. The Concurrency Runtime (CRT), for instance, is a framework that simplifies parallel programming and helps you write robust, scalable, and responsive parallel applications. The CRT raises the level of abstraction so that you do not have to manage the infrastructure details that are related to concurrency. The Concurrency Runtime also enables you to specify scheduling policies that meet the quality of service demands of your applications.
Figure 1 presents the architecture of Concurrency Runtime Framework.
In this article, I discuss the Task Scheduler layer and examine how it works internally. To do so, I use CppDepend, an analysis tool that makes it easier for you to manage complex C\C++ (native, mixed, and COM) code base.
The Task Scheduler
The Task Scheduler schedules and coordinates tasks at runtime. A task is a unit of work that performs a specific job. The Task Scheduler manages the details that are related to efficiently scheduling tasks on computers that have multiple computing resources.
Windows provides a preemptive kernel-mode scheduler -- a round-robin, priority-based mechanism that gives every task exclusive access to a computing resource for a given time period, then switches to another task. Although this mechanism provides "fairness" (every thread makes forward progress), it comes at some cost of efficiency. For example, many compute-intensive algorithms do not require fairness. Instead, it is important that related tasks finish in the least overall time. Cooperative scheduling enables an application to more efficiently schedule work.
Cooperative scheduling is a mechanism that gives every task exclusive access to a computing resource until the task finishes or until the task yields its access to the resource.
The user-mode cooperative scheduler enables application code to make its own scheduling decisions. Because cooperative scheduling enables many scheduling decisions to be made by the application, it reduces much of the overhead that is associated with kernel-mode synchronization.
The Concurrency Runtime (CRT) uses cooperative scheduling together with the preemptive scheduler of the operating system to achieve maximum usage of processing resources. In this article, I examine the Task Scheduler design and lift its hood to see how it works internally. For information on the CRT Resource Manager, see Concurrency Runtime: The Resource Manager. Again, I use CppDepend to analyze the CRT source code.
The CRT provides the interface
Scheduler to implement a specific scheduler adapted to application needs. Let's examine classes that implement this interface:
The CRT provides two implementations of the scheduler --
UMSThreadScheduler. As illustrated in the dependency graph in Figure 2, the
SchedulerBase contains all common behavior of these two classes.
Is the Scheduler flexible? A good indicator of flexibility is to search for all abstract classes used by the Scheduler.
As shown in the dependency graph in Figure 3, the Scheduler uses many abstract classes. It enforces low coupling, and makes the scheduler more flexible, so adapting it to other needs is easy. To explain the role of each abstract class used by the Scheduler, I'll discuss its responsibilities.
There are three major responsibilities assigned to the Task Scheduler:
Getting resources (processors, cores, memory). When the scheduler is created, it asks for resources from the runtime Resource Manager (as explained in CRT Concurrency Runtime: Resource Manager). The Scheduler communicate with Resource Manager using
IScheduler interfaces. Resources given by Resource Manager use scheduler policy to allocate resources to the Scheduler.
The policy as shown in Figure 4 is assigned when the Scheduler is created.
The CRT creates a default Scheduler if no Scheduler exists by invoking the
GetDefaultScheduler method, and a default policy is used. The Task Scheduler enables applications to use one or more Scheduler instances to schedule work, and an application can invoke
Scheduler::Create to add another Scheduler that uses a specific policy.
Concurrency::PolicyElementKey enumeration defines the policy keys that are associated with the Task Scheduler.
For more information on policy keys, see this article.
The following collaborations between the Scheduler and Resource Manager shows the role of each interface concerned by the allocation.
Ask for resource allocation:
Getting resources from Resource Manager:


Embassy Series Brings Iraqi Music to D.C. Audiences
The sounds of the great Western composers, such as Mozart, Beethoven and Bach, performed by internationally acclaimed musicians. The food, the socializing and networking, the kibitzing, the receptions at embassies, ambassadorial residences and international cultural centers. They're all perfectly good reasons to check out the Embassy Series, Washington's unique musical series.
But Embassy Series founder Jerome Barry had something additional in mind when he began and developed the series. It's called cultural diplomacy by way of musical diplomacy, a vision which has allowed him to enlarge the series to embrace a truly international vista.
The Iraqi Cultural Center at 1630 Connecticut Ave., N.W., in Dupont Circle provides an ideal setting and example for conducting that sort of cultural diplomacy Friday and Saturday at 7:30 p.m. when the Two Rivers Eastern Ensemble, a six-piece group of Middle Eastern and Western artists combine their talents to produce an evening of jazz fused with Maqam, a 400-year-old genre of Arab music which originated in ancient Iraq. The Two Rivers Eastern Ensemble will perform using both folkloric (the santour) and modern (the trumpet) instruments, singing in Arabic, and dressed in traditional ethnic outfits.
"Many instruments such as al-oud, a-santur and the tambourine were invented in ancient Mesopotamia," said Jabir Habeb, Ambassador of the Republic of Iraq to the United States. "The Sumerians were the first to compose the musical system. This ancient music was shared by many ethnic groups who lived in this region including Arabs, Assyrians, Kurds, Armenians and Turks. The Maqams were considered by many to be the foundation of Eastern music."
"These unique artists are meant to emphasize Iraq's music, history and cultural influence," Barry said. The artists are unique to the American scene while many are of Iraqi origin. In terms of the Embassy Series, "this is what we mean when we talk about uniting people through musical diplomacy," Barry said. "We provide a forum--through concerts--that combines music with information about a country's culture and history."
In 2010, with the long, grinding effects of the war in Iraq still being felt by both nations, the first such concert at the Iraqi Cultural Center provided an electric evening of different cultures meeting--and often whistling with approval--on a musical playing field. Audiences used to the rapt listening atmosphere of classical music concerts also provided by the Embassy Series soon joined in the more participatory atmosphere of the concert of Iraq music using ancient musical instruments which created rhythmic, soulful sounds and songs.
In its 18-year history, the Embassy Series has performed in more than 60 embassies, residences, chanceries, diplomatic chanceries and cultural institutions, opening up the world of countries and cultures not encountered on such an intimate level. The series was the first to perform at the newly opened embassies of many former Soviet-bloc, Eastern European countries in the 1990s, and performed at the Cuban Interests Section, the Vietnamese Embassy and the opening of the new (and huge) Chinese Embassy in 2010.
Tickets are $80, which includes a post-concert reception. For more information, visit _URL_.
1 2
Comments are temporarily disabled.
Sun, 2 Aug 2015 10:22:38 -0400
Subscribe to our newsletter to receive the latest Georgetowner updates.


text:
I need help ASAP
karab at auadec.aua.ariadne-t.gr
Fri Apr 10 03:41:14 EST 1998
Hi, here you are:
1) removing the leaves of plants after transplanting helps the plant to
Because you reduce leaf surface, thus you reduce water loss. When you
transplant, root hairs are destroyed, so water supply isn't adequate.
2) why experts in flower arranging advise recutting the stems of flowers
while holding them under water.
Because when you cut the stem, due to negative pressure, air bubbles enter
from the cutting and bloke the vains (you have a brake in water column
inside the vains).
3) Why some florists add ordinary table sugar to the water in which cut
flowers are placed and why the flowers will subsequently remain fresh for
Well, I think it has something to do with oncrement in osmotic pressure of
the solution where you store the cutted plants/flowers. I am mot sure...
More information about the Plantbio


text:
One More Word
December 7, 2000
In last month's column, I talked about the basics of working with Microsoft Word documents programmatically, and discussed how to work with the contents of a document using the Range object. I got a lot of interesting feedback on that column, along with requests for some additional information. Specifically, readers asked about working with documents using the Selection object and working with bookmarks programmatically. So, this month I will talk about the Selection object, provide some information on the differences between the Selection object and the Range object, and give you some information on programmatically working with bookmarks in Word documents.
Working with the Selection Object
The Selection object represents the currently selected text in a Word document. The Selection object is always present in a document; if no text is selected, it represents the insertion point. Unlike the Range object, there can only be one Selection object at a time.
You can use the Selection object's Type property to get information about the state of the current selection. For example, if there is no current selection, the Selection object's Type property returns wdSelectionIP. The Type property will return one of nine values represented by the wdSelectionType enumerated constants.
You use the Selection property to return a Selection object. The Selection property is available from the Application, Window, and Pane objects. However, because the Selection property is global, you can refer to it without referencing another object first. For example, the following sample code illustrates how you use the Selection property to get information about the currently selected text:
Sub SelectionCurrentInfo() Dim strMessage As String With Selection If.Characters.Count > 1 Then strMessage = "The Selection object in '" _ & ActiveDocument.Name & "' contains " _ &.Characters.Count & " characters, " _ &.Words.Count & " words, " &.Sentences.Count _ & " sentences, and " &.Paragraphs.Count _ & " paragraphs." MsgBox strMessage End If End With End Sub
The next example shows how you can use the Range property of the Selection object to replace currently selected text:
Sub ChangeSelectedText() Dim rngDocContent As Word.Range Dim strNewText As String If Selection.Type = wdSelectionIP Then MsgBox "Please select a word to replace before running " _ & "this procedure." Exit Sub Else strNewText = InputBox("Enter text to replace '" _ & Selection.Text & "'.", "Replace existing text") If Len(strNewText) = 0 Then Exit Sub End If Set rngDocContent = Selection.Range rngDocContent.Text = strNewText End Sub
When it comes to manipulating text, the Selection and Range objects have many methods and properties in common. However, the Selection object has a unique set of methods for manipulating text. These are the TypeText, TypeParagraph, and TypeBackspace methods. You use these methods to enter or remove text, and to insert paragraph marks in a Selection object. In order to get the results you expect, there are a few things you need to understand about these methods.
The TypeMethodName methods may delete existing text, depending on the value of the Options object's ReplaceSelection property. The ReplaceSelection property returns the value of the Typing replaces selection option on the Edit tab in the Options dialog box. When the ReplaceSelection property is True, using any of the TypeName methods will result in the currently selected text being replaced. When the ReplaceSelection property is False, the TypeText and TypeParagraph methods add text or a paragraph mark to the beginning of the current selection. In addition, when the ReplaceSelection property is False, the TypeBackspace method behaves the same as the Collapse method of a Range or Selection object when the wdCollapseStart constant is specified in the Direction argument. The Collapse method collapses a range or selection so that its starting point and ending point are the same.
Comparing the Selection Object and the Range Object
In many ways, the Selection object is like a Range object. The Selection object represents an arbitrary portion of a document. It has properties that represent characters, words, sentences, paragraphs, and other objects in a Word document. The main difference is that when you use the Range object, it's not necessary to first select the text. In addition, there can be only one Selection object at a time, but the number of Range objects you can create is unlimited.
The Selection object and the Range object have many common methods and properties, and it is easy to return a Range object from a Selection object or to create a Selection object from a Range object. However, most things you can do with a Selection object, you can do even faster with a Range object. There are two main reasons for this:
- The Range object typically requires fewer lines of code to accomplish a task.
- Manipulating a Range object does not incur the overhead associated with Word having to move or change the selection "highlight" in the active document.
In addition, you can do much more with a Range object than you can with a Selection object:
- You can manipulate a Range object without changing what the user has selected in the document. Practically speaking, you could save the original selection by using a Range object variable, manipulate the Selection object programmatically, then use the saved Range object's Select method to display the original selection. But there is rarely a good reason to show the user that the selection is changing. Some WordBasic developers relied on changing the selection to indicate to the user that the code was still running. But this is not the right way to convey information to a user. An operation that takes a long time to execute should signal its progress by using a progress meter or by posting status messages to the status bar.
- You can maintain multiple Range objects in your code, and, where necessary, store those objects in a custom Collection object. You cannot do these two things by using only the Selection object.
Working with Bookmarks
In many ways, a Bookmark object is similar to a Selection or Range object in that it represents a contiguous area in a document. It has a starting position and an ending position, and it can be as small as the insertion point or as large as the entire document. However, a Bookmark object differs from a Selection or Range object because you can give the Bookmark object a name and it does not go away when your code stops running or when the document is closed. In addition, although bookmarks are normally hidden, you can make them visible by setting the View object's ShowBookmarks property to True.
You use bookmarks to mark a location in a document or as a container for text in a document. The following examples illustrate these uses:
- You can use bookmarks to mark areas in a document that will contain data supplied by the user or obtained from an outside source. For example, a business letter template may have bookmarks marking the locations for name and address information. Your Visual Basic for Applications (VBA) code could obtain the data from the user or from a database, then insert it in the locations marked by bookmarks. Once a location is marked, navigating to that location is as simple as navigating to the bookmark. You can determine whether a document contains a specific bookmark by using the Bookmarks collection's Exists method. You display a bookmark location by using the Bookmark object's Select method. Once a bookmark is selected, the Selection object and the Bookmark object represent the same location in the document.
- If you have a document that contains boilerplate text that you need to modify in certain circumstances, you can use VBA code to insert different text in these specified locations, depending on whether certain conditions are met. You can use a Bookmark object's Range property to create a Range object, then use the Range object's InsertBefore method, InsertAfter method, or Text property to add or modify the text within a bookmark.
Once you understand the subtleties associated with adding or changing text through VBA code, working with bookmarks can be a powerful way to enhance your custom solutions in Word.
You add a bookmark by using the Bookmarks collection's Add method. You specify the bookmark's location by specifying a Range or Selection object in the Add method's Range argument. When you use the InsertBefore method, the InsertAfter method, or the Text property, a Range object automatically expands to incorporate the new text. As you will see in the next few examples, a bookmark does not adjust itself as easily, but making a bookmark as dynamic as a range is a simple exercise.
When you use the Range object's InsertBefore method to add text to a bookmark, the text is added to the start of the bookmark and the bookmark expands to include the new text. For example, if you had a bookmark named CustomerAddress on the following text (the brackets appear when the ShowBookmarks property is set to True):
[Seattle, WA 12345]
you could add the street address to this bookmark by using the following VBA code:
Dim rngRange As Word.Range Set rngRange = ActiveDocument.Bookmarks("CustomerAddress").Range rngRange.InsertBefore "1234 Elm Drive #233" & vbCrLf
As you might expect, the bookmark expands to include the additional address information:
[1234 Elm Drive #233 Seattle, WA 12345]
Now suppose you wanted to use the InsertAfter method to add text to the end of a bookmark that contains the street address, and you want to add the city, state, and Zip code information by using this code:
Dim rngRange As Word.Range Set rngRange = ActiveDocument.Bookmarks("CustomerAddress").Range rngRange.InsertAfter vbCrLf & "Seattle, WA 12345"
Note that when you use the InsertAfter method to add text to the end of a bookmark, the bookmark does not automatically expand to include the new text:
[1234 Elm Drive #233] Seattle, WA 12345
This behavior could create problems if you were unaware of it. But now


text: This video highlights one of the problems facing London's urban waterways. Shot on the Silk Stream at Rushgrove Park in Colindale. The stream flows into the Brent Reservoir, then into the River Brent, before running into the River Thames upstream of central London. Although this leak had stopped last time I was there, London's waterways suffer from pollution from breaks in the sewer system and particularly from residents illegally plumbing their domestic sewer systems into storm drains that run straight into the rivers. This is probably something that the local authorities and the Environment Agency should be doing more to combat.