text:
WET weather has held up police teams investigating a murder, who face their third week of intensive fingertip searches at a remote Ramsbury woodland.
No new items have been found since the discovery of 60 scraps of women's clothing buried 100 yards away from a small pond where divers found the boots Sian was wearing the night she was killed in March 2011.
That was more than a week ago but Wiltshire Police have said they want to leave no stone unturned, as they step up their investigation into the murder of Becky Godden-Edwards, who went missing between the end of 2002 and the beginning of 2003.
Earlier this week a force spokesman said that searches could have ended yesterday but the irregular downpours, have hampered the specialist search teams who are scouring the roughly half-mile of woodland.
A Wiltshire Police spokesman said: "There have been no updates. "Searches will, however, continue through the weekend possibly into next week. "The reasons are because we need to ensure that we maximise the opportunity and that these searches are thorough.
"They continue in the woodland areas and have been impeded a bit by the weather over the last couple of days."
Office worker Sian was killed in March 2011 by mini-cab driver Chris Halliwell, 50, of Ashbury Avenue, Nythe, who was jailed for life for the killing in October 2012.
But a second charge for the murder of Becky Godden-Edwards was dropped due to breaches of police procedural rules by the then lead officer Detective Superintendent Steve Fulcher.
A single-barrelled shotgun and the items of clothing found at Ramsbury are expected to take several weeks to analyse but lead investigator Detective Chief Inspector Sean Memory has said he is open-minded as to whether they are linked to the inquiry.
The latest developments come after it was revealed Mr Fulcher had resigned from the force and new evidence was found in April in the Becky Godden-Edwards murder case at the field in Eastleach where she was buried.
Other items of property are still being analysed from that discovery and, coupled with the latest finds in Ramsbury, the case has gathered pace in recent weeks.
It gives Becky's family fresh hope in their fight for justice for her.
Anyone with any information that could assist the inquiry should contact Wiltshire Police on 101 immediately or Crimestoppers anonymously on 0800 555 111.


text:
'RNC Marketing 101'
The Republican National Committee plans to raise money this election cycle through an aggressive campaign capitalizing on "fear" of President Barack Obama and a promise to "save the country from trending toward socialism."
The strategy was detailed in a confidential party fundraising presentation, obtained by POLITICO, which also outlines how "ego-driven" wealthy donors can be tapped with offers of access and "tchochkes."
The presentation was delivered by RNC Finance Director Rob Bickhart to top donors and fundraisers at a party retreat in Boca Grande, Florida on February 18, a source at the gathering said.
In neat PowerPoint pages, it lifts the curtain on the often-cynical terms of political marketing, displaying an air of disdain for the party's donors that is usually confined to the barroom conversations of political operatives.
The presentation explains the Republican fundraising in simple terms.
"What can you sell when you do not have the White House, the House, or the Senate...?" it asks.
The answer: "Save the country from trending toward Socialism!"
Check out the whole document here.

subset: commoncrawl


text:
Cheyenne Genealogy is one of our two main areas of research. Today the tribe is divided into two bands. The Southern Cheyenne in Oklahoma and the Northern Cheyenne in Montana. Our research is primarily with the Northern band but we do have information about various families in the Southern band. Currently we have over 8,000 Cheyenne's in our data set. This data set covers over two hundred years of Cheyenne genealogy. We would be willing to search the data set for you, but to protect the privacy living people we will not upload it here. To send a query to us of our data set please go to our query page and follow the instructions. There is an ever growing bibliography of Cheyenne history available here and we are in the process of making an index to some of the early reservation census reports. We are also working on a timeline of Cheyenne history to be used with The Master Genealogist genealogy program.
Cheyenne Genealogy
Data base of ancestors of Alvera Lone Elk Cook (over 60 individuals)
Cheyenne/Arapaho Lands(Okahoma GenWeb project page on the Cheyennes in Oklahoma)
Cheyenne History
Cheyenne Culture
Cheyenne Personal Pages
Cheyenne Government
Thanks to Donald Healy for the flag of the Northern Cheyenne!
| Sortore Family | Cook
Family Tree | TMG
| Dawson Co. GenWeb | Internet
Top of Page
Optimized for Netscape.
Photographs and text copyright © 2001 Timothy D. Cook. All rights reserved.
Comments and questions contact me.


text:
Stop-motion cars, cross-linked interactive videos, and a guy who sounds like he was born on Sunday, Sunday, Sunday! YouTube has been used for a lot of cool promotions, but as far as we're concerned, this one takes the cake.
Here's how this works: Watch the video below and don't skip scenes. When the clip pauses near the end, click on a car. You'll be taken to another YouTube clip, one where you can modify and race the car you picked. There are a handful of races spread out across several video clips, and each one is different. Each clip offers you choices, and the choices affect the video's outcome.
Interesting facts, courtesy of Mattel: The entire series was shot in stop-motion over the course of 26 days. Just under 9200 frames were captured, and each frame took 76 seconds to shoot. There are 88 different camera angles. One hundred and fifty pounds of sand were used to create the desert track, and 85 pounds of sugar stood in for snow in winter scenes.
We made a video like this in elementary school. It was lame by comparison, but it did have a stuffed gorilla popping out of the turret of a model Abrams tank and at least one accident-victim — I think she ended up with both of her legs stuffed inside the gorilla's mouth — Barbie doll. War is cruel. Racing is better. YouTube is great.


text:
OTTAWA - Money being cut from National Defence will inevitably slice into the Canadian military's ability to carry out sustained missions at home and abroad, a defence expert says.
A new set of estimates tabled this week in Parliament, ahead of the federal budget, suggest all three branches will feel the pain of austerity in something known as "readiness."
That's the amount of money the Defence Department spends to keep soldiers, sailors and aircrew, as well as their equipment and vehicles, trained and ready to deploy to trouble spots in Canada and around the world.
Prime Minister Stephen Harper made clear in a pointed letter to Defence Minister Peter MacKay last year he wanted readiness preserved and more attention paid to cutting administration, or "the tail."
Harper reinforced the message at the induction of the country's new defence chief last fall, telling Gen. Tom Lawson he must aim for "more teeth and less tail" and to "ensure administrative burdens are reduced and resources freed up for the front line."
But this week's spending projections, which could change when Finance Minister Jim Flaherty delivers his budget in a few weeks, show as much as $1 billion out of a possible total of $2.3 billion in cuts will come out of military readiness.
Overall defence is set to lose more than 10 per cent of its budget this year, but defence sources said the impact on individual branches will be much deeper.
The army could lose as much as 22 per cent of its spending power and the navy faces a reduction of between 17 and 20 per cent, said well-informed sources.
The air force faces a slightly smaller reduction.
More cuts are expected next year as a series overseas commitments come to an end, and the government has not budgeted for new ones.
Defence expert Dave Perry, who conducted a groundbreaking analysis last fall of the impact the Conservative austerity drive on the military, said the balance of planned cuts does not reflect what the prime minister ordered.
In the House of Commons on Tuesday, MacKay defended the government's record of investing in the military.
"Let me inject a little reality into the House," he said.
"In fact, the Conservative government has seen increases of roughly 34 per cent in the defence budget since 2005-06. Let us roll the clock back when this member was part of the (Liberal) government that presided over a decade of darkness, that saw the Canadian Forces rusted out."
He didn't address the details of impending cuts, but has noted in several speeches defence intends to do its part to rein in the deficit.
A spokeswoman for MacKay added late Tuesday that reductions have been expected.
"With the return to a more (regular) operational tempo after the end of our combat mission in Afghanistan, our spending levels will naturally be reduced," said Paloma Aguilar in an email.
But the cumulative effect of the reductions, as they are currently laid out, will be felt on the country's ability to sustain missions once they're ordered, Perry said.
An initial force could go into the field for a few months, but less high-level training and preparation means that extended commitments, like the Kandahar mission, would be almost impossible to organize.
The country would be back to the state it was early in the Afghan war, where it could only join Allied missions for six months at a time, Perry said.
The cuts to the front line are approaching the severity of ones made 20 years ago under both Brian Mulroney and Jean Chretien's governments, he added.
"The pace of reduction during this round of austerity started three years ago, is roughly comparable to what it was in the early 90s," said Perry, a defence researcher at Carleton University and the Conference of Defence Associations.
When adjusted for inflation, the Canadian military shrank by almost 30 per cent during the last round of cuts.
He said the cuts will need to extend into next year's budget to surpass the so-called decade of darkness, the term Conservatives use to describe Liberal treatment of the military.
Reductions in the 1990s were made over longer period and the compressed, tighter timelines of the Harper government's agenda will bite, Perry added.
"It's hard to make an exact comparison, but this looks like a significant amount of money coming out over a shorter period of time."
He's not surprised defence is expected to make up over half the anticipated cuts in the 2013 budget.
"It's really hard to balance the books unless you cut DND, or unless you are prepared to be absolutely ruthless with cuts to every other discretionary department," Perry said.
Also on HuffPost


text: First Preparation of Trophy & Field Care By John Bellucci "Possibly the most important thing to remember is to treat the animal as quickly as possible!" "Jambo, Bwana!" Here I will concentrate on the concerns of getting your overseas trophies properly prepared to help ensure the best trophy mount possible. There is an old adage in the Taxidermy industry… "A beautiful mount begins in the field." This, of course, refers to the proper care of the specimen in the field that results in a beautiful mount later on. The biggest set of potential problems and complaints seem to come about with trophy animals taken from the plains and savannas of Africa. There are a seeming abundance of guides and outfitters that hire "only the worst" when it comes to this type of service. Fortunately, there are many exceptions! However, more often than not, if you - the hunter - are not aware of proper procedure, the only thing you will have from your hard-earned hunt is memories. And not the ones that come to you when you view your prized trophy in its place of honor! The proper procedures of foreign field-care, ultimately result in a beautiful trophy mount and happy memories of the entire event… with that in mind, I humbly submit this information. I begin with basics you can use to determine if the skinners are doing a good job. Possibly the most important thing to remember is to treat the animal as quickly as possible! Sure, you can take a couple of photos of yourself with your trophy, but bear in mind the heat of the day. This is the primary reason skins spoil! Before a knife even touches animal, some basic measurements taken now will provide the taxidermist with invaluable information later. The major measurements of concern are: tip of the nose - to front corner of the eye; tip of the nose - to the back of the skull; front corner of the eye - to the front base of the horn; width of the eyes - at both the front corners and rear edge; and, if possible, circumference of the neck - to just below the ears and again about 3-inches further down the neck (these neck measurements are more accurately taken after skinning). These are the measurements needed for purchasing the proper sized headform for the mount, and they take but minutes to record! In addition to these headform measurements, additional measurements are required for a full or "Lifesize" mount. The first important measurement, the overall length of the animal, is measured from the tip of the nose - to the base or "root" of the tail… following the contour of the back. This measurement is taken while the skin is still on the specimen. Next in importance is the length of the hind leg from the bottom of the foot or hoof (as it would be posed standing), up to the point of the hock (the rear heel of the animal). Another measurement is from the bottom of the front foot or hoof as it would be posed standing, up to the first joint of the "knee" and another measured further up to include the point of the "elbow"… as well as the overall height at the shoulder. All other body measurements can be taken off the skinned carcass. These would include the circumferences of the chest behind the forelegs, around the mid-chest (the "mid-drift"), and around the abdomen. Also, record the circumference of the neck in front of the shoulders, behind the ears, and around the middle. Finally, record the depth of the torso from the top-line to the belly-line, the thickness through the body at the head of Humerus, from head of Humerus to head of Femur, the head of brisket to the head of Femur, and the length of tail. These measurements are the important "field measurements" needed for a full mounted trophy. To begin the skinning procedure, make a cut from the middle/rear base of one horn toward the rear point of the back of the skull. When this is done, repeat this step on the other side of the head. Note: It is best if these initial cuts are made with the edge of the blade facing up - away from the hairs… This method allows less chance of actually slicing through any of the hairs! After the two opening cuts meet at the back of the skull, run a long opening incision down the center of the topside of the neck and continue past the shoulders. Today's headforms have much more shoulders on them than headforms of years past, and pedestal mountings can require even more of a rearward portion of the hide! Many times I suggest to clients that they instruct the skinners to skin as far as the middle of the animals back, insuring plenty of hide in case a pedestal mount is desired. After opening as far back as needed, the skin surrounding the chest area is cut through, encircling the animal from one side of the opening cut around to the other. Be sure the throat of the animal is never cut… for any reason! After all opening cuts are made, skinning proceeds forward and up the shoulders and neck. As the skin is pulled forward, the connective white tissue is all that should be sliced through to remove the hide from the meat of the carcass. This assures there will be no knife nicks in the skin. There is no reason for them! Skinning continues until the bases of the ears are reached. Skin up over the base of the ears by pulling the skin forward until the creamy-yellowish ear cartilage is seen. Always make sure the muscles of the ear bases - the "ear butts" - are cut through at their point of attachment right at the skull. Never let the ears be cut further up the ear muscles. This practice creates a horribly wide ear opening and it cuts through the front notch or "V" of the front of the ear. After freeing the ears from the skull, the skin must be carefully cut from around the horns. A screwdriver is sometimes a very useful assist in prying the skin loose from around the horns without cutting the skin. Continue forward down the skull, being careful not to cut through the skin, especially around the eyes. To preserve the eyelids intact, the "free" hand - the hand without the knife - acts as a guide from the outside of the skin, so you feel that you are not cutting into the lids. Reverse the skin and, from the outside, put a forefinger under the rear edge of the eyelid and lift up; then from the skin side cut through this thin skin-tissue close to the bone surrounding the eye until the forward corner of the eye is reached. Now cut very close to the bone and continue to do so until the tear duct is freed… on animals that have a tear duct! Skin down the face until nearing the rear corners of the mouth. Again, from the outside insert your forefinger in the corner of the mouth and pull up, giving tension to the cheek muscles. Cut through the cheek muscles about one-inch from the corner of the mouth, and free the skin of the lower lip from the jaw by cutting close to the bone. Free the upper lip and nose, cutting close to the bone, in the same manner. As with the eye, your forefinger may also be placed as a guide in the nostril when skinning down over the nose cartilage and cutting through to finally free the skin from the skull. With the skin, or "cape", removed, now it is time for the important details to be tended to. The ears must be turned inside out, using the thumbs as wedges to assist in this step. They must be worked very nearly to the tips and sides, but great care must be taken not to break through the edges. The actual ear cartilage remains attached to the front ear skins here. All remaining red meat is removed from the ear cartilages, leaving the full "bowl" (rounded base of ear cartilage) of the ears intact. Proper salting will preserve these parts… don't let anyone tell you otherwise! Proper turning of the ears is paramount to preserving them, thus producing well-mounted ears. This drawing shows one ear fully turned and one ear just begun. The lips are opened (or "split") by holding the outer surfaces - the hair-side and the textured "gum-side" - between the thumb and forefinger while slitting the inner flesh with a knife so they will lay open… as you would butterfly shrimp. The edges of the lower lip at the front should also be opened in this manner, and with extreme care to avoid cutting through these narrow walls. Surplus fat and flesh should be removed from the skin for best results. Get the skin off and salted with the least possible delay. If you are in hot country where the skin may be a long time in coming to camp for salting, it is wise to arrange to have some salt carried with you so, as the trophy is skinned, salt may be applied to the surface and continued frequently until the skin is completely removed. By the time the skin is off, the salt has started its valuable work and the safety of this trophy is assured! Salted skins are less apt to be attacked by insects and mice than those cured by drying only. Common, non-iodized table salt is the one best thing to apply to any and all skins, and there is no danger of using too much. While skinning, or after skinning, the flesh side should not be allowed to become dry, as it will not take the salt. The skin should be spread on the ground, flesh side up - preferably on a tarp or canvas - the edges opened and stretched, and liberally sprinkled with salt. The salt supply should always be kept dry... the drier it is the better it draws liquids from the skin. The salt should be well rubbed into every part of the skin with the flat of the hand, and the skin folded, flesh sides together, placed in a shady place on a slanting platform, allowing the initial fluids to drain away. After eight to twelve hours, the skin can be unrolled, the old salt scraped off, and a new dry layer of salt rubbed into all areas of the skin again. Be sure no wrinkles form in the skin that will not allow the salt to reach them. Salt must be in contact with all areas of the flesh-side of the skin. This can be followed up with an additional salting or two, until the skin is dry enough but still able to be folded for shipping. The skins are folded up compactly, flesh side out for protection, when almost dry, so they can be packed into shipping boxes without taking up much room. Skins thus handled will readily relax in the tanning process and are safe from becoming hair-slipped. All swine animals (pigs, boars, warthogs, etc.) are to be packaged separately from the other trophy specimens. They may be in the same shipping box, but they must be individually wrapped so as not to come into contact with the other skins. Failure to do so will result in lost time of the entire shipment being held in quarantine plus additional and unnecessary dippings! At this point, be sure all shipping tags are secured to all skins and horns. Don't forget to use corresponding tags for the skins and their horns, so as not to confuse them with other trophies of another hunter! Your Kudu horns should be going home with your Kudu cape! Please don't think this doesn't happen. I can supply you with non-corrosive write-on "Impresso-Tags" for this type of identification. I can either number them for you, or you may number them in the field. Either way, these will give you double "control numbers" for cape and horns! A client of a fellow taxidermist brought back the entire skeleton of his trophy White Rhino, only to find out from the taxidermist he most likely had the bones of three separate rhinos… never mind that the thing had three different sets of foreleg bones! Some Additional Helpful Hints In climates where heat, dampness, and a greater danger of damage by vermin confront the collector, "boosting" the ordinary salting step can make a better job of preserving the hides. By mixing the salt with alum (aluminum sulphate) - in half and half ratios (2 lbs salt plus 2 lbs alum) - the drying ability of the salt will be nearly quadrupled! Virtually before your eyes, you will see the skin begin to puddle much of the liquids contained within, as it puckers and dries! This mixture is especially useful during the wet season! No matter how carefully trophies are treated in tropical countries, they become utterly ruined if not packed and boxed properly for overseas shipping. To lessen the danger from attacks of insects, skins should not be boxed until ready to ship, and frequent examinations for insects should be made. Ask the outfitter, guide, or PH to provide the skins with a good insecticide. Many brands are in use for just this purpose. Here is a list of Don'ts! • Don't leave the care of the trophy until tomorrow • Don't cut across throat or split it • Don't use wire or tin tags for marking capes… they leave rust marks • Don't dry skins in the sun or near fire • Don't leave fat or meat on skins • Don't leave trophies without corresponding tags on horns and capes • Don't delay shipment • Don't think taxidermists are miracle workers As for taxidermists: we can fix a lot of damage… bullet holes are closed, torn ears are mended, and missing eyes can be replaced, but insect damaged areas - areas that are so badly chewed and eaten through - are a nightmare! There's much to be said for the poor appearance of large areas of missing hair that has "slipped" due to improper handling. Natural areas of hair rub are just that, natural… the epidermal layer is still intact. Some antelope, especially the older animals, have a tendency to "rub themselves raw" while relieving an itch. In these cases, at least the skin texture is still evident in the epidermis. Epidermal slippage however, leaves a smooth, slick area to the affected section of the skin. This requires much work to restore. When it comes to foreign field care, it is the client who can make the difference between the beautiful trophy and the well-mounted trophy of a poor quality animal. I hope I have well armed you for your next Safari … wherever it takes you. "Kwaheri!"


text:
(Original Image and Text, Copyright (c) 2011 Cynthia Shenette) I posted this photo last spring, but I wanted to post it again given that my Wordless Wednesday theme for the month of January is snow and cold. I'm fascinated by this photo and couldn't leave it out. My dad Henry Shenette, a long-time Navy man, traveled the world over the course of his 20 plus year career in the military. He use to tell me about all the places he visited. I often wished I could visit some of them. Not this one though...
Other Posts You Might Like:
Tombstone Tuesday: Francois Chenette, Civil War Soldier
(Almost) Wordless Wednesday: The Valley Forge is Back Again
What's In A Name? (An Ongoing Series): Chenette
Wordless Wednesday: A Good Catch
Wish You Were Here? - Wordless Wednesday
Labels: Shenette - Henry A., Wordless Wednesday
3 comments:
- hummer said...
Oh my that looks colder than cold. Brrrr.
- January 19, 2011 at 10:37 PM
- Nolichucky Roots said...
This makes my 9 inches of snow seem meager. Let's hope I feel that way after clearing the driveway!
- January 20, 2011 at 11:28 AM
- TCasteel said...
Okay .... yes, it's definitely cold
- January 20, 2011 at 8:20 PM
Subscribe to: Post Comments (Atom)


text:
Please note: You are viewing an archived Bucknell University news story. It is possible that information found on this page has become outdated or inaccurate, and links and images contained within are not guaranteed to function correctly.
By Matt Hughes
LEWISBURG, Pa. — With students returning to campus and the start of classes days away, Bucknell's new 70,000-square-foot academic building is open.
The University invited Bucknell students, faculty and staff to tour its newest academic building, Academic West, at a recent open house. As administrators looked over a long-planned dream come to fruition, the students and faculty that will share the space envisioned possibilities for Bucknell's new addition. After perusing the structure's wired classrooms, airy department offices and abundant hearth spaces, first-year student Melissa Walker, who wants to become a teacher, was all smiles.
"This is wonderful," Walker said. "It's nice — it's beyond nice."
Academic West is the University's first new academic building since 2004 and Bucknell's largest construction project in more than a decade. It lodges 16,200 square feet of classroom space and numerous hearth spaces facilitating collaboration and dialogue between faculty and students. Its use of glass partitions in lieu of walls and expansive windows further blurs the lines between spaces and encourages exploration and collaboration.
"This building has a ton of those little pocket areas for students to study in," said Shaneka Dixon '15. "I think that's beneficial for students, because they'll be more likely to get together in study groups if they know where to go."
Dixon said she imagines the building becoming, like nearby Bertrand Library, a space where students congregate to study and work together.
"I'll be here," she said confidently. "I have no classes in here and I'll be here."
The structure provides computers for 102 students, a Geographic Information Systems laboratory equipped with advanced mapping software and licenses for additional research tools never before available to Bucknell students. Smart classrooms allow teachers to control lighting and window shades, projectors, media players, a webcam and an overhead document camera from a single touch screen. | Read more about how a Mellon Foundation grant supports digital scholarship.
The facility also affords permanent, dedicated space for two University initiatives: the Bucknell Institute for Public Policy and the Field Research Teaching Lab.
"Having a physical space gives us some visibility on campus that we have not been able to have before," said Professor of Economics Amy Wolaver, co-director of the Bucknell Institute for Public Policy. "The intention is to create a work space or meeting space for faculty, for students, for our interns who work with us."
The Institute and the Field Research Teaching Lab share a pair of conference rooms and office spaces for a joint program coordinator and program assistant. The Field Research Teaching Lab trains students and faculty to conduct research in the communities and environment around Lewisburg and facilitates such opportunities. Professor of Geography and Environmental Studies Ben Marsh, academic coordinator for the Lab, imagines using Academic West's meeting spaces for planning field research excursions and its webcam-equipped classrooms for conducting social science research interviews with subjects in far-off countries via web chat.
"The thing that impresses the faculty about this building is that there is so much open, group work space," Marsh said.
While the new building's footprint on campus is large and unmistakable, its designers have ensured its carbon footprint is as light as possible. The building will be Leadership in Energy and Environmental Design (LEED)-certified at the silver level, meeting strict standards for energy efficiency and environmental stewardship. Its green features include smart lighting, an 8,000-square-foot vegetated roof spread with succulent plants to absorb rainfall and provide insulation, and a stormwater management system camouflaged as a series of rain gardens.
The opening of Academic West firmly sets the cornerstone for the largest phase of expansion in Bucknell's history. In coming years, the University plans to construct a second academic building, Academic East, forming a new open quadrangle, as well as additional residence halls and a new art building or complex. The University will break ground on four new residence halls in September, with a planned August 2015 opening date. Construction will follow the blueprint for future buildings and green spaces outlined in the Campus Master Plan, initiated in 2007.
"There's already tremendous energy in the building as our faculty settle into this amazing new space, and it will be great when our students see it next week for the first time," President John Bravman said. "It's a learning space, a gathering space, a space with so much to offer, and we are grateful to the donors who have made it possible."
Several major gifts helped fund the $25 million facility as part of the WE DO Campaign. Publicly launched last October, the campaign has raised more than $275 million of its half-a-billion dollar goal.
The addition also frees space for renovations of existing structures on campus, including the renovation of the Vaughan Literature Building now underway, and consolidates department offices formerly spread among multiple buildings. The opening of Academic West prompted shifts in more than 20 campus departments and offices spread among eight buildings. The new construction provides 65 offices for the departments of economics, geography, international relations, Latin American studies, political science and sociology/anthropology, as well as the Environmental Studies Program.


text:
Issue Type: Bug Created: 2008-12-03T07:23:43.000+0000 Last Updated: 2011-02-18T06:05:26.000+0000 Status: Resolved Fix version(s): - 1.9.3 (22/Sep/09)
Reporter: Björn Rylander (hasslarp) Assignee: Matthew Weier O'Phinney (matthew) Tags: - Zend_Form
Related issues: - ZF-11088
Zend_Form_Element::addError() has the following description: "Add an error message and mark element as failed validation". This implies that Zend_Form_Element::addError() also sets the element to fail validation. The method Zend_Form_Element::addErrorMessage() on the other hand has the following description: "Add a custom error message to return in the event of failed validation" Which seems to be a more accurate description of what Zend_Form_Element::addError() actually does. On another note, Zend_Form::addError() has the same description with the word "element" in them, which makes the matter even more confusing. Also, Zend_Form_Element::addError() calls Zend_Form_Element::markAsError() which has the following description: "Mark the element as being in a failed validation state". This leads me to believe that addError() was meant to actually make validation fail, but that doesn't seem to be the case.
Posted by Vahe Oughourlian (jedcred) on 2009-03-05T15:53:58.000+0000
Does anyone have a workaround for this issue for the present? The best I could make up was to make isValid in Form check to see if _errorsExist was true; if so, valid is set to false, else _errorsExist set to !valid. Otherwise there doesn't seem to be a check that would make sure that a user-set error (called by formObject->setError() and ->markAsError()) was noted. I haven't tested this with "regular" use cases, but I don't see why it shouldn't work unless someone sets the error state of the form independently (as we are trying to do).
Posted by Thomas Weidner (thomas) on 2009-03-05T22:58:13.000+0000
I can't see a failure.
addError: Adds a error message and marks the element as being failed in any case (also when validation would be successfull) addErrorMessage: Adds a error message but the element is only being failed when the validation itself fails markAsError: Marks the element as being failed
Posted by Vahe Oughourlian (jedcred) on 2009-03-05T23:25:41.000+0000
By my understanding, if a form is marked as failed, it should not be valid i.e. - isValid should return false. However, it does not; it returns true no matter if it is marked failed or not; only a validator that has failed causes isValid to return false. Have I misunderstood the the idea of a "failed" form as being "invalid" as well?
Posted by Mark Haase (mehaase) on 2009-03-06T05:14:38.000+0000
I've been following this ticket for a while for the very same reason.
I'd like to have some way to easily add an error to a form element without having to write a full-blown validator. "addError" sounds like it would do exactly that, but apparently that is not the intention.
The documentation isn't clear enough for me to figure out what, exactly, "addError" is supposed to do. Probably because "failed" and "invalid" could mean the same thing or different things depending on who you ask.
Posted by Vahe Oughourlian (jedcred) on 2009-03-06T12:11:47.000+0000
To be honest the discussion is less about addError() than is about isValid. isValid checks the validators and sets _errorsExists to true or false solely based upon the validators and with no regard to the previous value of _errorsExists. This causes a problem because, should one have previously set the form as having an error, it is invalidated by isValid. Even more interesting is that the function isError (which I discovered yesterday, which returns the value of _errorsExists) is rendered impotent by a call to isValid. This suggests two scenarios.
Which is it? If the former, then why offer the ability to set the error state? Is it an issue of access by validators? If so, why not set access privileges to such functions as "protected", so as to prevent this issue?
Posted by Matthew Weier O'Phinney (matthew) on 2009-03-07T06:48:28.000+0000
It's a bug, and I will address it for the next release.
Posted by Carsten Schmitz (trady2000) on 2009-07-27T12:12:12.000+0000
Do you know in which version it will be fixed ?
Cause the next release at the time of your postings was 1.8.0
Posted by Carsten Schmitz (trady) on 2009-07-29T13:38:10.000+0000
I'm using ZF 1.8.4. Exists there a workaround for this bug ? Will this bug exist anymore in ZF 1.9.0 ?
Posted by Matthew Weier O'Phinney (matthew) on 2009-09-17T13:31:09.000+0000
Should now be resolved in trunk and 1.9 release branch. isValid() in both Zend_Form and Zend_Form_Element check to see if the element has been manually marked with errors, and, if so, fails validation.
Posted by Grant Ockwell (occy) on 2009-11-23T15:36:46.000+0000
Hey guys, Im not 100% sure if this has been resolved or maybe I am miss using the addError() method. Basicly, I've just done this as a quick test. It works as expected if you leave both fields blank. If you fill in the bottom field, and leave the top one blank, the message gets displayed. If you fill in both fields, isValid() fails as expected however the message is never displayed on the form?? If i call markAsError after isValid it gets displayed. if i call markAsError() before isValid, this just makes no difference.
All i want to be able to do , is add a custom condition, call addError('message') and have that message display on the form? That to me seams like a pretty easy thing to do but I just cant get it to work.
I just figure if i call addError, isValid will fail, and the message will be displayed? Its just odd, the custom message only gets displayed if some other kind of validation fails like the required 2nd field??
Any Ideas or work arounds would be great?
public function testAction()
$fld = new Zend_Form_Element_Text('bork');
$fld->setLabel('Test Field');
$fld1 = new Zend_Form_Element_Text('zoot');
$fld1->setLabel('Another Field');
$form = new Zend_Form();
$form->addElements(array($fld, $fld1, new Zend_Form_Element_Submit('break me')));
if ($this->_request->isPost()) {
$fld->addError('This should be Displayed!!');
if ($form->isValid($this->_request->getParams())) {
echo 'this is ok';
// You have to do this or the message wont display!!!!
$this->view->form = $form;
Thanks Guys
Posted by Grant Ockwell (occy) on 2009-11-23T16:06:54.000+0000
Hey guys, By overriding the isValid method I can call parent::isValid($data) and then do any custom checks. Any calls to addError() after the parent::isValid actualy makes the form display the error. Still not sure if the above code i posted is a bug or desired?
public function isValid($data)
$valid = parent::isValid($data);
// do some custom validation, at least these messages get displayed on the form now.
if (true) {
$this->getElement('bork')->addError('Monkey Business');
$valid = false;
return $valid;
Have you found an issue?
See the Overview section for more details.


text:
You are not logged in.
Hi all,
For quite a while, I've been using TCP sockets as my inter-thread signalling mechanism. That is to say, in my multithreaded server apps:
- Every thread runs an event loop around select()
- When a thread wants to get another thread to do something, it places a Message object into the target thread's Queue, then sends a byte via TCP to the target thread
- The target thread receives the TCP byte, which causes select() to return. The target thread then checks its Message Queue and acts on the Message(s) it finds there
- Access to the Queues is serialized by mutexes as appropriate
This works fine, and it has the following qualities that I like:
- It integrates with select(), which all my threads are blocking on anyway (since they also have networking tasks to do)
- It works more or less the same on all modern operating systems (i.e. there's almost no porting required across Windows, Mac, Unix, BeOS, etc)
- It's reasonably simple and works reliably
So my questions are:
- Is this the best way to handle this problem? Is there another way to do it that would be better?</li>
- Currently I use TCP sockets for the inter-thread signalling... would there be any performance advantages or portability pitfalls to using UDP or AF_INET sockets or some other type of socket instead?
Also, a somewhat unrelated question: Yesterday I had the bright idea of using a TCP socket to indicate a thread's readiness to accept more data.... the idea was that I would "fill up" the socket's buffers with garbage data, and whenever the thread wanted more data, it would read a byte from its end of the socket, causing the other thread's end of the socket to select() as ready-for-write. The problem with this was that the buffers don't seem to stay full: I wrote a little test program to verify the technique, which simply created a non-blocking socket-pair and then filled up the socket with data until no more could be written, then sat in a spinloop calling select() on the socket to see what happened. What I found was that after a second or so, the socket selected as ready-for-write again, even though the connection had been "full" and no bytes had ever been read from the other end.... as if the O/S was occasionally resizing the TCP buffers larger to accomodate some more bytes. Since I saw this behavior under both Linux and MacOS/X, I assume that it's a feature and not a bug... but can someone explain what is going on there? I thought it was a bit puzzling.
- Is this the best way to handle this problem? Is there another way to do it that would be better?
Well, typically on Unix-like systems, people use either a pipe() or a Unix domain
socketpair() for that sort of local IPC type usage... Since you apparently need to
worry about porting to insane systems (read: Windoze), such things may not be
possible for your use, at least without complicating the portability...
- Currently I use TCP sockets for the inter-thread signalling... would there be any performance advantages or portability pitfalls to using UDP or AF_INET sockets or some other type of socket instead?
AF_INET? I assume you mean AF_UNIX, since TCP (and UDP) are both already
AF_INET (or AF_INET6)...
Yes, Unix domain sockets would be much more efficient, bypassing a lot of the
kernel TCP/IP stack stuff that's not necessary with local IPC... (Though, if you
use 127.0.0.1, most modern systems should optimize the loopback interface
quite a bit, too...) UDP would also be an improvement over TCP, but probably not
a huge amount, when both are local... Pipes would be the ultimate improvement
over all else (retaining the similar FD interface, anyway), as long as you only needed
unidirectional I/O... If you need bidirectional, Unix domain sockets are the best way
to go... But, with either of those, like I say, you may run into problems on those
silly non-Unix-like systems... ;-)
Oh, and as for the strange writability thing, I'm not sure... It sounds rather odd to
me, but with non-blocking sockets, it COULD indeed be growing buffers... Ie: the
kernel starts you out with some smaller buffer not near your real SO_SNDBUF size,
and only grows out to that as needed... With a blocking socket, your writes would
probably block while the resize happens, but with non-blocking, it seems perfectly
reasonable it'd temporarily fail while the resize happens in the background... But,
in either case, once you hit your SO_SNDBUF size, it shouldn't grow it any more
beyond that... So, if you want to test things, set SO_SNDBUF fairly low (but, beware
the OS might impose some minimum necessary size, so you probably can't do
anything stupidly low)...
Well, typically on Unix-like systems, people use either a pipe() or a Unix domain socketpair() for that sort of local IPC type usage... Since you apparently need to worry about porting to insane systems (read: Windoze), such things may not be possible for your use, at least without complicating the portability...
Hmm... well maybe I can #ifdef my way to making it work as well as possible on both system types. Thanks for the info.
AF_INET? I assume you mean AF_UNIX, since TCP (and UDP) are both already AF_INET (or AF_INET6)...
Yes, that is what I meant.
Oh, and as for the strange writability thing, I'm not sure... It sounds rather odd tome, but with non-blocking sockets, it COULD indeed be growing buffers... Ie: the
kernel starts you out with some smaller buffer not near your real SO_SNDBUF size,
and only grows out to that as needed...
In case anyone is interested, I'm pasting in my test program as well... today it seems like it's only showing the strange behavior under MacOS/X; but I swear yesterday I was seeing it under Linux too. Weird!
The anomalous output from my Mac looks like this:
g5:~ jaf$ ./a.out
CreateConnectedSocketPair() begins...
Created socket #3 for accepting a TCP connection on port 49173.
Creating socket #4 to connect to port #49173
Accepting a connection on socket #3
Setting socket #5 to non-blocking mode
Setting socket #4 to non-blocking mode
Disabling Nagle's algorithm for socket #5
Disabling Nagle's algorithm for socket #4
CreateConnectedSocketPair() succeeded. Socket1=5 Socket2=4
Setting send buffer size to 1 for socket #5
Setting receive buffer size to 1 for socket #4
FillSocket: Writing as much junk data as possible to non-blocking socket #5
FillSocket: Wrote 1/512 bytes to socket
#1: select() returned socket is READY FOR WRITE!?!?!? ERROR!?!?!?
FillSocket: Writing as much junk data as possible to non-blocking socket #5
FillSocket: Wrote 1/512 bytes to socket
#2: select() returned socket is READY FOR WRITE!?!?!? ERROR!?!?!?
FillSocket: Writing as much junk data as possible to non-blocking socket #5
FillSocket: Wrote 1/512 bytes to socket
#3: select() returned socket is READY FOR WRITE!?!?!? ERROR!?!?!?
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/types.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <net/if.h>
#include <sys/ioctl.h>
enum {
typedef int status_t;
typedef unsigned short uint16;
typedef unsigned long uint32;
static void FillSocket(int s)
printf("\nFillSocket: Writing as much junk data as possible to non-blocking socket #%i\n", s);
static const int BUF_SIZE = 512;
char junk[BUF_SIZE]; memset(junk, 0, BUF_SIZE);
int x = send(s, junk, BUF_SIZE, 0); // fill up the socket buffers to start
printf("FillSocket: Wrote %i/%i bytes to socket\n", x, BUF_SIZE);
if (x < BUF_SIZE) break;
static int CreateAcceptingSocket(uint16 port, int maxbacklog, uint16 * optRetPort, uint32 optFrom)
struct sockaddr_in saSocket;
memset(&saSocket, 0, sizeof(saSocket));
saSocket.sin_family = AF_INET;
saSocket.sin_addr.s_addr = htonl(optFrom ? optFrom : INADDR_ANY);
saSocket.sin_port = htons(port);
int acceptSocket;
if ((acceptSocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0)
#ifndef WIN32
// (Not necessary under windows -- it has the behaviour we want by default)
const long trueValue = 1;
(void) setsockopt(acceptSocket, SOL_SOCKET, SO_REUSEADDR, &trueValue, sizeof(long));
if ((bind(acceptSocket, (struct sockaddr *) &saSocket, sizeof(saSocket)) == 0)&&(listen(acceptSocket, maxbacklog) == 0))
if (optRetPort == NULL) optRetPort = &port;
socklen_t len = sizeof(saSocket);
*optRetPort = (uint16) ((getsockname(acceptSocket, (struct sockaddr *)&saSocket, &len) == 0) ? ntohs(saSocket.sin_port) : 0);
printf("Created socket #%i for accepting a TCP connection on port %u.\n", acceptSocket, optRetPort?*optRetPort:Port);
return acceptSocket;
return -1;
static status_t SetSocketBlockingEnabled(int sock, bool blocking)
printf("Setting socket #%i to %s mode\n", sock, blocking?"blocking":"non-blocking");
if (sock < 0) return B_ERROR;
#ifdef WIN32
unsigned long mode = blocking ? 0 : 1;
return (ioctlsocket(sock, FIONBIO, &mode) == 0) ? B_NO_ERROR : B_ERROR;
int flags = fcntl(sock, F_GETFL, 0);
if (flags < 0) return B_ERROR;
flags = blocking ? (flags&~O_NONBLOCK) : (flags|O_NONBLOCK);
return (fcntl(sock, F_SETFL, flags) == 0) ? B_NO_ERROR : B_ERROR;
static status_t SetSocketNaglesAlgorithmEnabled(int sock, bool enabled)
printf("%s Nagle's algorithm for socket #%i\n", enabled?"Enabling":"Disabling", sock);
if (sock < 0) return B_ERROR;
int enableNoDelay = enabled ? 0 : 1;
return (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *) &enableNoDelay, sizeof(enableNoDelay)) >= 0) ? B_NO_ERROR : B_ERROR;
static int Accept(int sock)
printf("Accepting a connection on socket #%i\n", sock);
struct sockaddr_in saSocket;
socklen_t nLen = sizeof(saSocket);
return (sock >= 0) ? accept(sock, (struct sockaddr *)&saSocket, &nLen) : -1;
static int Connect(uint32 hostIP, uint16 port)
int s = socket(AF_INET, SOCK_STREAM, 0);
printf("Creating socket #%i to connect to port #%u\n", s, port);
if (s >= 0)
int ret = -1;
struct sockaddr_in saAddr;
memset(&saAddr, 0, sizeof(saAddr));
saAddr.sin_family = AF_INET;
saAddr.sin_port = htons(port);
saAddr.sin_addr.s_addr = htonl(hostIP);
ret = connect(s, (struct sockaddr *) &saAddr, sizeof(saAddr));
if (ret == 0) return s;
else close(s);
return -1;
/* similar to socketpair(), but uses AF_INET sockets */
static status_t CreateConnectedSocketPair(int & socket1, int & socket2, bool blocking, bool useNagles)
printf("CreateConnectedSocketPair() begins...\n");
const uint32 localhostIP = ((((uint32)127)<<24)|((uint32)1));
uint16 port;
socket1 = CreateAcceptingSocket(0, 1, &port, localhostIP);
if (socket1 >= 0)
socket2 = Connect(localhostIP, port);
if (socket2 >= 0)
int newfd = Accept(socket1);
if (newfd >= 0)
socket1 = newfd;
if ((SetSocketBlockingEnabled(socket1, blocking) == B_NO_ERROR)&&(SetSocketBlockingEnabled(socket2, blocking) == B_NO_ERROR))
(void) SetSocketNaglesAlgorithmEnabled(socket1, useNagles);
(void) SetSocketNaglesAlgorithmEnabled(socket2, useNagles);
printf("CreateConnectedSocketPair() succeeded. Socket1=%i Socket2=%i\n", socket1, socket2);
return B_NO_ERROR;
socket1 = socket2 = -1;
return B_ERROR;
status_t SetSocketSendBufferSize(int sock, uint32 sendBufferSizeBytes)
printf("Setting send buffer size to %lu for socket #%i\n", sendBufferSizeBytes, sock);
if (sock < 0) return B_ERROR;
int iSize = (int) sendBufferSizeBytes;
return (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&iSize, sizeof(iSize)) >= 0) ? B_NO_ERROR : B_ERROR;
status_t SetSocketReceiveBufferSize(int sock, uint32 receiveBufferSizeBytes)
printf("Setting receive buffer size to %lu for socket #%i\n", receiveBufferSizeBytes, sock);
if (sock < 0) return B_ERROR;
int iSize = (int) receiveBufferSizeBytes;
return (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&iSize, sizeof(iSize)) >= 0) ? B_NO_ERROR : B_ERROR;
int main(int, char **)
int socks[] = {-1, -1};
if (CreateConnectedSocketPair(socks[0], socks[1], false, false) != B_NO_ERROR)
perror("Couldn't create signalling socket pair!\n");
SetSocketSendBufferSize(socks[0], 1);
SetSocketReceiveBufferSize(socks[1], 1);
// First, write to the socket until it can't hold any more
int loopCount = 0;
fd_set writeSet; FD_ZERO(&writeSet); FD_SET(socks[0], &writeSet);
struct timeval poll = {0,0};
int selRet = select(socks[0]+1, NULL, &writeSet, NULL, &poll);
if (selRet >= 0)
bool isReadyForWrite = FD_ISSET(socks[0], &writeSet);
printf("#%i: select() returned socket is %s\n", ++loopCount, isReadyForWrite?"READY FOR WRITE!?!?!? ERROR!?!?!?" : "not ready for write (expected)");
if (isReadyForWrite) FillSocket(socks[0]); // just to see how much more we can write to it!
perror("select failed!");
return 0;
To quote myself:
So, if you want to test things, set SO_SNDBUF fairly low (but, beware
the OS might impose some minimum necessary size, so you probably can't do
anything stupidly low)...
And, 1 byte is most definitely "stupidly low"... ;-) I'm certain the system isn't really
giving you a 1 byte send buffer... That'd just be insane... It probably needs a
minimum of a couple K, at least... Try a more sane size like 4K or 8K or so, and
see if it behaves the same way when it hits the limit...
To quote myself:
And, 1 byte is most definitely "stupidly low"... ;-) I'm certain the system isn't really giving you a 1 byte send buffer... That'd just be insane... It probably needs a minimum of a couple K, at least... Try a more sane size like 4K or 8K or so and see if it behaves the same way when it hits the limit...
I agree that 1 byte is an unusual value to pass in, and I wouldn't be surprised if some OS's did round up to the nearest page size or whatever... but you'll note in the sample output I provided above that the FillSocket() function does indeed write exactly one byte to the socket before the (non-blocking) send() call refuses to write any more data. So that would indicate to me that the buffer is indeed 1 byte... except that then a second later, the socket indicates that it is ready-for-write, and accepts.... exactly one more byte. Then the socket again "acts full" for a another second, and then the process repeats. This despite nobody ever reading from the other socket. Strange, methinks.
(keep in mind that I'm wasn't planning on using these sockets for actual data transmission, but instead I wanted to abuse them by trying to use them as semaphores that select() could block on, with the number-of-bytes-in-the-buffer acting as the semaphore-count... hence the strange buffer size)
Well, realize you're actually dealing with TWO buffers here: the send buffer on the
sending side and the receive buffer on the receiving side... BOTH of these will have
to be full, before your send()'s will permanently fail... So, maybe the OS is giving
you a real 1-byte send buffer, but refuses a mere 1-byte receive buffer... So, you'd
be able to only send 1 byte at a time, but that would almost immediately get sent
into the receive buffer of the other end of the connection... And, you'd then be able
to write another byte, which would then do the same thing... And, so on, until the
receive buffer on the other end filled up...
Or, it could be that it's merely pretending to give you 1-byte buffers, but really
storing more than that... *shrug* The point is, have you even tried it with larger
sizes? I would suspect it should behave a lot more like you'd expect with more
reasonable sizes... (You still have to take into account BOTH buffers needing to
be filled, though...)
The point is, have you even tried it with larger
sizes? I would suspect it should behave a lot more like you'd expect with more
reasonable sizes... (You still have to take into account BOTH buffers needing to
be filled, though...)
I just tried it with the default buffer sizes on my Linux box (i.e. I commented out the SetSocketSendBufferSize() and SetSocketReceiveBufferSize() calls), and there I see that FillSocket() sends a bunch of data, then stops, then a second or so later select() indicates there is more room to send, and FillSocket() sends a bunch more data and then stops again. That does seem like the effect of two buffers (first batch fills the send buffer, second batch fills the receive buffer)
jfriesne, one thing you need to remember is that since your code snippet is using TCP sockets, the send/receive buffers don't really mean much of anything.
The send buffer empties as data is written onto the network. It isn't a guarantee that the other side has read anything or even received the packet yet, just a guarantee that it has been sent.
This sort of signaling is best for Fire and Forget type signals. Let the receiving end decide what to do with piled up signals, and the sender should send signals on events and not care about the buffers. As long as the receiving end is clearing out the read buffer of all data from the signal socket when it updates, you should be good to go.
The send buffer empties as data is written onto the network. It isn't a guarantee that the other side has read anything or even received the packet yet, just a guarantee that it has been sent.
That's not really true... Due to the way TCP works, data will never be removed from
the send buffer until it has been ACK'd as received and stored in the target receive
buffer... It needs to keep it around until then in case of retransmits...
Good point, I think I spend too much time in the UDP world where you aren't guaranteed arrival. :)
I still believe that the send buffer emptying doesn't guarantee that the receiving application has read data out of its buffer though, just that the ACK has arrived.
But even if it did read it, then you don't know if the application processed it yet,
so that line of thinking doesn't really work. So after sending data you can consider
it sent. If you want to know for sure it made it and all that, then the peer need to
send a sort of ack, no matter if you use UDP or TCP.
Old message but what the heck... since others are commenting so will I... herd mentality and all of that stuff...
First observation is that when sending / receiving from a local address... especially when it is the local host addr e.g. 127.0.0.1 ... a lot of network implementations will short circuit the operation...
That is - the data will not actually go all the way down to the interface / driver level... and a lot of the operations required for network transmission are avoided... this is done because in such a situation things like a checksum, retransmission check and so on are ( usually ) meaningless... as if they were to occur in this situation it means the machine itself is failing - as in - the memory / network card(s) / storage is going bad... and e.g. no number of 'retransmissions' will correct or help the situation...
Point being that those concerns are really off the table with such a setup... as long as you are certain it will ONLY be using local communication...
The second thought is...
While an entertaining idea... why not simply use mutexes and condition variables for the thread 'signaling' ? These constructs are available on all *NIX / Linux, Windows and Apple OSes... along with the majority of embedded RTOS...
Using that setup - the functionality could be written up with a lot fewer lines of code... less ( system ) overhead... would give explicit control over things such as data buffer allocation... and would have less dependencies on the runtime configuration of the system...
Of course I may be missing something here... e.g. a final design that was meant to provide thread 'communication' on the local machine AND distributed communication... but even then - I would be inclined to still use the condvar setup for local coordination... and only drop to pure networking when / if necessary...
"The only difference between me and a madman is that I'm not mad."
Salvador Dali (1904-1989)
While an entertaining idea... why not simply use mutexes and condition variables for the thread 'signaling' ? These constructs are available on all *NIX / Linux, Windows and Apple OSes... along with the majority of embedded RTOS...
In my case, most (all?) of my threads are blocking in select() so that they can handle network I/O. How would a mutex or a condition variable unblock select() so that the targetted thread would wake up and do (whatever it is supposed to do)? Perhaps there is a way, but if there is, I don't know it...
And even if I wasn't worried about network I/O, how could my thread block on more than one mutex/conditionvar at a time? Is there something like Windows' WaitForMultipleObjects() that could be used in that case? (IIRC Posix semaphores has something like that, but last time I tried to grok posix semaphores I panicked and ran away ;^))
I still believe that the send buffer emptying doesn't guarantee that the receiving application has read data out of its buffer though, just that the ACK has arrived.
Exactly... And, I didn't mean to imply otherwise... All you know is the other system's
TCP stack has ACK'd it, and therefore presumably put it in the peer receive buffer...
Other than that, you can't make any further promises/assumptions... Like i3839 says,
if you need to know the peer truly read it, you'll have to have some kind of app-level
ACK, in the form of reply data sent back over the socket...
Ok... this is not self promotion... lol
Take a look at the sample here as a very simple example at the bottom of this page:
Now I am not going to write the entire thing up for ya but will try to step thru some of the things you can do - using that simple example as a basis... and assume a 1 thread ( worker ) per connection style setup to avoid some complexity...
A note on that last comment... I don't think its "cheating" as the complexity of maintaining a thread pool and / or allowing a single thread ( worker ) to handle multiple connections exists no matter what layout you use... I am just trying to simplify things for this explanation...
First... during setup - create a hash table / map... you will use the socket id's as the keys... as for the data component... in the simplest setup each would contain a distinct condition variable AND a list / other structure holding available data...
Now the main thread will loop thru and accept connections... when a new connection is created, it will verify it doesn't exist in the has... it will then create a new hash entry including the condition variable... it will then spawn a new thread ( the start segment in the example ) and pass a mutex ( this can be shared or independently created on a per socket basis ) in the condition variable as the argument... the new thread will immediately do a wait operation on that condition variable...
The main thread then goes on its merry way... adding the new socket to its read list... and does a new select... when an existing socket becomes readable... it quickly reads the available data... looks up the socket in the hash table... locks the mutex... adds the data... unlocks the mutex... and signals the entry's condition variable...
This causes the child to wake up and gain the mutex lock... it then removes the available data... unlocks the mutex... processes the data... and when finished re-locks the mutex... makes certain no data has been added in the interim... if so it loops and if not it blocks on the condvar... until more data is ready...
Hopefully I haven't simplified that to the degree that it sounds like gibberish... on the assumption I haven't... advantages of this style setup are:
* you only have a single select and associated groups... this will reduce the overhead required by the sub-system e.g. validating all sockets in the groups are valid, performing internal ( kernel / lib ) level locks against the handles as they are validated and so forth...
* potentially a ( much ) lower level of context switching... since you will have 1 IO bound thread and n CPU bound threads... where as having all threads diving into select turns them all IO bound
* since its a server / network system - it doesn't consume as many available handles ( sockets ) and theoretically you could handle 2x or higher load...
* at the user / application space you can explicitly control the exact amount of ( min and max ) buffer space allocated to each socket...
* it isn't dependent on checking and re-setting the runtime configuration e.g. socket buffer sizes, trigger levels and so forth...
Admittedly there are downsides:
* it will work on any *NIX system... and Windows with the *NIX compat library BUT... if you want to use native windows you will have to create wrappers so that the appropriate functions i.e. CreateSemaphoreW, WaitForSingleObject, etc. are utilized...
* there is ( potentially ) more work on the memory management side e.g. when a new connection is accepted you probably want to grab a decent sized buffer for the connection immediately to associate with the hash entry... and use that when reading to avoid a lot of allocs / reallocs and data copying...
Of course... this may all be way off target as to what you are trying to accomplish... I dunno... :P
"The only difference between me and a madman is that I'm not mad."
Salvador Dali (1904-1989)
That approach adds communication and context switch overhead for all network IO
operations, so probably not good if that is a performance sensitive part, or when
inter thread communication is relatively rare.
Mine ( ? ) - I am not certain what you mean... but can provide details if desired...
We all know I like typing... lol
"The only difference between me and a madman is that I'm not mad."
Salvador Dali (1904-1989)
I see two problems with the do-everything-in-its-own-thread design:
1) All the I/O bottlenecks through that single (main) I/O thread, which (I believe) would be less efficient than having each client's TCP stream feeding directly to its own thread.
and worse,
2) Doing everything in separate threads means you have to worry about locking your data structures, race conditions, deadlocks, and that whole bag of worms. Not really worth it unless you absolutely need multiple threads for whatever reason.
Well... for item 1...
Lets first look at ( if I understand properly ) the first design... considering just for laughs a 1024 socket limit on select... and not considering accepting incoming connections i.e. not a server design... and not creating outgoing connections... except for inter-thread communication...
Under full load we would be limited to 512 threads... not because of thread limitations but because we would need each thread to have a socket associated with it to receive 'signals' ... and of course we would need a socket for each of those receivers by which we could send the signal...
Now lets look at select...
You call it with 1 to 3 sets of handles and a the max descriptor... assuming you are only sending 1 set of handles e.g. read or write - then under full load the internal library / sub-system will have to iterate thru / check on avg 1024 / 2 handles per call... which translates to ( all threads reading / writing to each other ) 512 * 1024 / 2 = 256 K checks... quite a bit of processing overhead...
This isn't even considering internal locking that occurs at the lower level to make certain the true state of the sockets / handles are obtained...
But wait - it gets even worse...
The reason being is that again - internally - the system has to remember each handle(s) and the thread it is associated with... each time one goes active ( date received / sent ) it will have to look up that association... then check with the scheduler... if the thread is ok to be activated i.e. hasn't used up too many time slices it is activated... if not the scheduler has to track that there is a deferral AND maintain the IO action and thread activation association....
But wait - it gets EVEN WORSE... lol
Imagine just two threads...
A gets data indicated via select and gets activated by the scheduler... immediately after B gets data... A for a few cycles ( CPU bound ) so the activation of B is deferred... but then A calls read which is an IO bound op - which means an indication it can be switched out by the scheduler... so the scheduler puts A to sleep and wakes up B... B is in CPU bound mode for a few cycles but then it calls read also... same thing - scheduler sees it can be switched out... so then it checks thread A - sees there is really data ready so B is put to sleep and A is re-activated... A returns from the read and processes the data ( CPU bound ) and then calls select again - becoming IO bound... scheduler then puts A in the queue and wakes up B...
Thats actually a lot of work... and just imagine 512 threads reading and writing and bouncing between being CPU and IO bound states... and the thrashing that ( may ) ensue...
There are many other issue too...
To compare the above with what I was suggesting...
A single master thread doing the selects and playing coordinator... that means 2 * 1024 = 2048 checks ( max ) and associated burned cycles under full load... a lot less than the 256K value above...
A single thread that is IO bound and triggered / having to twist the scheduler... and the rest CPU bound ( processing messages to / from the message queue )... which means they are very simple to handle when it comes to activation etc. ... as they have discrete time slices...
Also for all the CPU bound threads that are blocked on condvars... they eat no CPU time... the scheduler actually will keep them in their own queue as currently inactive... and when they are signaled on the condvar - since they aren't going into an IO op - there is much less of a chance of a context switch occurring except in the circumstances where the scheduler sees the thread has run out of time in its slice...
Now you may be thinking that as the condvars are signaled that the scheduler will try to wake up all the threads that have data ready and a lot of context switching will occur... perhaps but that depends on the scheduling algorithm the system uses... and if you want the simple solution to avoid this situation ( no matter what )... just have all the condvars share a mutex - the scheduler will then order things for you - as it will see that if on thread has already been signaled and holds the mutex - the next one must be kept in the queue and will NOT be woken up / cause a context change...
For item 2...
Yes you have to handle locking etc. the data structures yourself... and that does add complexity... but on the other hand YOU control it... as opposed to relying on lower level behavior... possible strange runtime configs ( and there are a lot of configurable options for networking at both the system and app level )...
Not to mention the possibility of ( several orders of ) a magnitude better efficiency...
Oops - another addition... in ref to the do everything in its own thread... there is nothing preventing e.g. in a server setting of having each worker thread handle multiple sockets further increasing efficiency... as mentioned in my earlier method I was using that as the example only for the sake of simplicity...
Anyway... the solution is that instead of associating a condvar per socket... you instead associate a condvar per worker thread... then simply associate each worker with multiple sockets in your hash map... no need for the equivalent of a WaitForMultipleObjects ( a la Windows style )... as you would be effectively doing the same exact thing...
"The only difference between me and a madman is that I'm not mad."
Salvador Dali (1904-1989)
Oh - something I forgot that may be part of the source of confusion...
On a single cpu / core system...
You would set the priority of your ( single ) IO bound thread to close to the highest level... and the ( n ) CPU bound to close to the lowest level... that will assure that you get a good response time when reading / writing data with the IO thread...
On a multiple cpu / core system...
Where x is the number of cores... you could leave all threads at the same priority... and instead would have ( x - 1 ) mutexes associated with the condvars... and would coordinate / round-robin / whatever gets ya off which one was used each time a wait was performed... by doing this you would make certain that there was always 1 core free for the io bound thread...
"The only difference between me and a madman is that I'm not mad."
Salvador Dali (1904-1989)
The main lesson I see here is that 512 threads is not an efficient way to go. ;^) Better to either go single-threaded, or (if you really need to) use a fixed number of worker threads in a thread pool. The number of worker threads probably shouldn't vary too much from the number of CPUs in the system.
The 1 thread per connection set-up is typically bad on many levels... despite what many people are taught... its primary objective is simplicity... but the cons far outweigh that single positive benefit...
As for myself... and this may seem strange... when I do a design similar to what I have given I usually do 1 thread for IO... and ( 2 to 4 ) * ( number of cores - 1 ) CPU workers... with each 'cluster' of ( 2 to 4 ) worker threads sharing a mutex and condition variable...
That may sound odd - as one might expect the simpler 1 IO and n - 1 worker threads... but the thing is I realize there are other processes on the system... and I ( normally ) want to give my servers an edge in case something outside it tries to hog the CPU... so doing the 2 to 4 bit helps to skew things into my favor - especially for 1st level scheduler only systems...
"The only difference between me and a madman is that I'm not mad."
Salvador Dali (1904-1989)
The head-scratcher for me on this topic (and why I still use an AF_UNIX socket pair to control my I/O thread in a couple instances), is how to figure out which connections are ready for writing without relying on a select() timeout to let me poll my connections. Instead, I use the socket pair to send simple commands to the I/O thread telling it that a socket has been opened, and to start watching it, or that a socket wishes to start writing. Once the thread takes over, it is a pretty simple matter to let it decide when to remove the socket from the write fd_set, or the opened sockets fd_set.
If there is a better way, I'd love to hear it, but at this point, 2 fds is a small price to pay (IMO) to avoid the latency and polling required to know which sockets are trying to write.
If using Linux's epoll you can just add sockets to it from one thread while another
one waits on them. If you make all peer state reachable via epoll_data_t then it all
happens transparent. Something similar can probably be done with BSD's kqueue.
Or use poll() and modify events in struct pollfd from another thread. But then
you've the timeout problem.


text:
Tuesday, January 18, 2011
PL/SQL Utility Library
I've created the PL/SQL Utility Library page on Google Code to host some generic utilities that I've written myself, some that I've collected from elsewhere (credits and links can be found in the relevant source code), as well as links to useful PL/SQL libraries that are actively maintained elsewhere.
Check out the links and download the source code, there's a lot of different stuff here; from parsing CSV files, integrating with Google Maps and generating JSON, to zipping/unzipping files with PL/SQL.
I plan to add several more packages as soon as I get the code cleaned up.
Drop a comment below if you know of any other PL/SQL libraries or utilities that should be added to the list!
8 comments:
- mnolan said...
Hi Morten
Thats a pretty comprehensive and awesome list of stuff, thanks for putting it all together and making it available.
You're a legend!
- January 18, 2011
- David said...
The list looks impressive, but it seems that there are files missing from the download file. Of the files mentioned on the front page, I'm not seeing PDFGEN/PDFGEN_UTIL, RSS_UTIL, MAIL_UTIL, POP3_UTIL, GOOGLE_AUTH, GOOGLE_CALENDAR, AMAZON_AWS, PAYPAL_UTIL, SOAP_CLIENT_UTIL, STRING_UTIL, DATE_UTIL, SQL_UTIL, XML_UTIL, or XML_DATASET...
- January 18, 2011
- Morten Braten said...
@David: That's right, as mentioned in my post I plan to add several more packages as soon as they are ready. Consider the list a preview of things to come...
- Morten
- January 18, 2011
- Pedro Leite said...
awesome job :)
- January 19, 2011
- Johannes said...
Thanks Morten
- January 20, 2011
Great library! But I have a complaint :). Unzipping with ZIP_UTIL_PKG doesn't work on Oracle 11.2 database. But I fixed it, see http://forums.oracle.com/forums/thread.jspa?messageID=9289744#9289744
By the way, I'm working on Yet Another Excel Package, almost finished.
- January 21, 2011
- Morten Braten said...
@Anton: Thanks, I hope you don't mind me including your awesome code in my library. I've just uploaded a new version of the library, where I included the updated version of your zip package.
I noticed you had some Excel generation code in one of your Apex plugins, looking forward to see it as a stand-alone package!
- Morten
- January 21, 2011
- blogje said...
The Excel stand-alone is available at this place: http://technology.amis.nl/blog/?p=10995
- February 19, 2011


text:
Graduate StudiesPage address: http://www.mnsu.edu/artdept/graduatestudies.html
Master of Arts in Art
The Department of Art offers a graduate degree program that leads to the Master of Arts in Art, a degree that requires 30 credits emphasizing specialized involvement in the student's chosen studio area – ceramics, drawing, graphic design, installation, painting, photography, printmaking, or sculpture. The degree requirements include a thesis and courses in research, art history, the specialization area, and a related area outside of the Department of Art. Most students focus on the research and development of creative work that culminates in a public exhibition or presentation as an alternative to the traditional written thesis (also an option). The graduate advisor and committee will assist in establishing the presentation form and appropriate supporting documentation.
MA in Art Application Process
There are two steps in the application process:
Step 1. Applicants must complete the College of Graduate Studies and Research application process. All information and application deadlines can be found here: http://grad.mnsu.edu/applying/
Step 2. Applicants must submit the following art/design specific materials to:
Graduate Coordinator
Department of Art
136 Nelson Hall
Minnesota State University, Mankato
Mankato MN 56001
- A cover letter clearly stating applicant's goals or purpose for graduate study
- An electronic portfolio (jump drive or online) of representative creative work (10–20 examples)
- A statement of artistic philosophy
- Names and contact info for two professional references. Note: References will be contacted by Admissions and asked to answer brief questions in an online form.
Please note that priority will be given to applicants who complete the application process by March 15.
For those who already have an art degree and wish to earn K-12 teaching credentials, the College of Education offers programs leading to licensure. Most of these students choose to pursue the Master of Arts in Teaching (M.A.T.), a degree that requires at least 30 credits of education and art education courses.
Graduate Assistantships
There are a limited number of graduate and/or teaching assistantships available each year. Recipients may teach a beginning design course or be assigned duties in service to other department activities in the Conkling Gallery, slide library, or studio facilities.


text:
Things to Know
for more event information.
Welcome to Sail Grand Waterfront.
We offer a world of excitement on the water including a variety of watercraft rentals and parasailing adventures. Whether you are here for a few hours or a few weeks, we hope to help you have a great time on Grand Lake Oklahoma.
Check out our Blog!
57151 E. Hwy 125 Afton, OK Phone: (918) 257-6000 Fax: (918) 257-6001


text:
Kale with Chorizo and Poached Eggs Recipe
Your source for quick recipe every single week day.
Adapted from Nigella Lawson's How to Eat
Read more: Dinner Tonight: Kale with Chorizo and Poached Eggs
- Yield:serves 2
- Active time: 30 minutes
- Total time:30 minutes
- 12 ounces curly kale, stems removed, roughly chopped
- 2 tablespoons vegetable oil
- 8 ounces dried Spanish chorizo, halved lengthwise, and the sliced crosswise 1/4-inch thick
- 2 eggs
- 2 tablespoons white vinegar
- salt and pepper
Bring a large pot of salted water to a boil. Add the kale and cook until tender but not completely soft, five to seven minutes. Drain in a colander when done. When cool, squeeze out some of the excess water.
Pour the oil into a large skillet set over medium heat. Add the chorizo and cook until it has rendered some of its fat, three to four minutes. Add the kale, season with salt and pepper, and toss well. Cook until the kale is coated in the chorizo drippings and is bright green. Set aside.
For the poached eggs, pour water into a medium-sized saucepan and fill with two to four inches of water. Bring to a bare simmer. Crack each egg into a separate shallow dish. Once tiny little bubbles start to rise from the saucepan, add the white vinegar. Gently slide each egg into the water. If necessary, you can use a spoon to move the whites closer to the yolk. Cook until the whites have completely set, three to four minutes. (This guide has more detailed instructions.)
While the eggs are cooking, divide the kale and chorizo mixture between two plates. When the eggs are finished, remove each with a slotted spoon, letting as much of the water drip off as possible. Top each pile of kale with a poached egg. Season with more salt and pepper to taste. Serve immediately.
This Recipe Appears InDinner Tonight: Kale with Chorizo and Poached Eggs
This post may contain links to Amazon or other partners; your purchases via these links can benefit Serious Eats. Read more about our affiliate linking policy.


text:
Student Chapter Wins AAPG Award, April, 19, 1999
New Mexico Tech's student chapter of the American Association of Petroleum Geologists (AAPG) was awarded the "Outstanding Student Chapter of The Year". The award, which is sponsored by AAPG and Schlumberger, was presented last week at the annual AAPG convention in San Antonio, TX. New Mexico Tech was competing against over 50 student chapters located at universities all over the world.
Contributed by:
Matthew Herrin
Department of Earth and Environmental Sciences


text:
Every delicious bottle of wine from Corney & Barrow represents what we believe to be outstanding quality and value. Fine wine, timeless classics, and the very best in easy-drinking at everyday prices. Independent wine merchants since 1780, our service is defined by the quality of our people, our products, and you, our customers.
Get exclusive access to personalised offers
Specialist Merchant of the Year for En Primeur, International Wine Challenge 2017
Copyright Corney & Barrow 2016 All Rights Reserved


text:
Locksmith Professional Expert DC, the exceptionally many reputabled locksmith professional Expert servicing Arlington and also on top of that Alexandria, VA
CLIQ Sensible Begin Offers.
E-Cylinders along with Clever Keys.
Simply exactly how perform you incorporate obtain use of command functions like important Arranging as well as furthermore review course to settings that are possibly tough or actually impossible to wire? E-Cylinders are actually wire-totally complimentary, simple To put in actions that offer essential aspects like scheduling, Investigation path, on-the-location deactivation from went down methods and also additionally much more.
. Off lockout treatments to lock alterations, our specialists have the abilities to execute your hair as well as furthermore essential company needs.
Interest to Unlock Locked Locks.
Locksmith professional Qualified Alexandria uses of continuing to be really the leading locksmith professional experts in Alexandria, VA for unanticipated emergency situation dilemma solutions. Our personnel are actually proper noted below on your own for those that should transform a lock or possibly reproduce a passkey. Along with a locksmith professional Experienced group, provided on your own 24 humans resources a time a lot of clients from Locksmith Alexandria recognize they continuously remain in extraordinary hands as an outcome of The fact that your home safety and security is our best fret.
Essential to Possess a Locksmith in Alexandria?
When that happens to locating a locksmith professional Qualified in Alexandria, VA, turn up no On top of that when as compared to United Locksmith. United Locksmith is actually cheerful to service provider the individual city area from Alexandria.
Our Specialties:.
24 Human resources Crisis locksmith professional Qualified.
Lock established and also crucial duplicating.
Car locksmith professional Specialist service providers.
Our company offer you Alexandria locksmith professional Specialist company in Alexandria, VA along with the Washington DC location.
Our Authorities at Locksmith Alexandria warranty that when customers cellphone our abrupt dilemma locksmith professional Experienced team they're mosting likely to generate 24 human resources locksmith professional Specialist help along with a mobile phone just call center which capacities Anytime with the moment, showcasing getaway periods as well as furthermore weekend break breaks. If you Speak to our service you understand that our sector specialists are most likely to come to your details websites in Alexandria, VA within the minimal opportunity feasible and utilize extremely developed locksmith professional Skilled gizmos to allow max defense and also security and also efficiency.
On problem that our experts are essentially the Leading 24-hour locksmith professional Experienced in Alexandria, that accomplishes never release when you might perhaps need to have our companies. That shows that we provide each of our techniques evening time as well as functioning day, offering our customers Just regarding one of the most particular choices this side in the Potomac at any type of kind of human resources from your time.
. Patented Essential Techniques provide enriched essential management, particularly vital when taking great treatment of enormous kinds from techniques and also normally protecting maintain an eye on from that has access to all of these. Patented important versions like Mul-T-Lock's MT5+ with each other with Interactive+ make baseless essential duplication rather a lot difficult.
Call 800-308-8205 for counted on service provider or even house locksmith professional Skilled services presently.
. Protect What Issues Most.
Picking the easiest protection for your individual house deals you along with the peace-of-thoughts you receive from identifying that the delighted in properties in addition to kinds are essentially extensively protected. That remains in reality why our company provide a huge item selection exclusively customized to fulfill house fundamental security needs showcasing primary treatments off Mul-T-Lock Large Protection Merchandise.
Mul-T-Lock's CLIQ E-Cylinder & Clever Essential method permit you incorporate obtain use management displays to practically any type of positioning. As well as, due to The fact that CLIQ E-Cylinders, which maximize Each specific complicated along with digital protecting functions, might maybe consist of into some complicated needed gadget (where by Clever strategies could definitely get the job done Every E-cylinders along with intricate cyndrical tubes) Mul-T-Lock's CLIQ provides you the flexibility to more enhance simply the places the area you could wish to have much more Manage a solitary entrance concurrently.
Patented Important Programs Patented Important Techniques.
Patented Essential Units.
Patented Critical Methods provide you together with enriched command over your ideas. Patented essential versions like Mul-T-Lock's MT5+ along with Interactive+ develop baseless vital duplicating virtually impossible
Mortise Cylinders.
Retrofit Cylinders.
Updating a lock or possibly changing will not instantly show you'll intend to transform a lot of the surrounding equipment. Retrofit cyndrical tubes allow you to quickly upgrade your safeguarding system as an outcome of just remodeling the cyndrical tube along with a retrofit. Mul-T-Lock deals a substantial array from retrofit cyndrical tubes so you might perhaps make renovations to virtually any kind of type of device to higher security and also safety and security safeguarding.
When you require Business workplace, residential, or probably auto locksmithing, supply our team a phone get in touch with at United Locksmith, taking advantage of the amount you find on this web page. If you do not understand your private self, our experts have our staff members standing using to Consider out specifically exactly what style from company you call for.
MT5+ Patented Large Stability Critical Method Image MT5+.
Patented Crucial Methods.
Patented Important Devices offer enriched important management, particularly extremely more info important when managing huge amounts from approaches along with maintaining track from that has availability to every one of these. Patented vital bodies like Mul-T-Lock's MT5+ and Interactive+ make baseless vital duplication Virtually impossible.
Automobile Vital locksmith professional Experienced, Alexandria's primary automobile Locksmith Business. Regardless of whether you Missing Vehicle Keys in Alexandria along with need to have additional as well as entirely brand-new secret and also are actually locked out from a motorcar our masters are most likely to aid, 24hrs anytime.
Lorry Vital locksmith professional Expert, Alexandria's leading automobile Locksmith Organization.
Patented Important Devices offer you along with enhanced command over your techniques. Patented crucial devices like Mul-T-Lock's MT5+ together with Interactive+ introduce unauthorized crucial duplicating Pretty much hard.
Deadbolts & Deadlocks Deadbolts & Deadlocks.
Deadbolts & Deadlocks.
Our people can think that reduction in understanding that our team stay about our dependability being a reputabled locksmith professional Skilled in Alexandria, VA
Along with our cellular phone locksmith professional market professionals in Alexandria, our experts might possibly have our specialists directly to the place. Despite where by you might be in Alexandria Or possibly within the incorporating locations our team might perhaps provide off an employee to sustain your locks, whether they be truly entrance locks or possibly automobiles and also vehicle hairs.
Our Misplaced Motor automobile Essential more info Alternative Experts provide a facet Alternative exclusive car motorist Alexandria VA individuals requiring extra along with Alternative Motor lorry Keys in addition to Substitution Fobs Crucial. Our been experts Car Critical Professionals will certainly guide to your car to reduced alternative auto secret and Transponder Essential Programming & completely evaluate your Substitution Motor car Important at your automobile Whilst you shirk about.
SMARTair Entry Regulate Locks.
Availability Manage Options.
The most effective obtain access to management feedbacks utilize extremely economical item options, straightforward Computer system shows in addition to security, in addition to generally resource management, side as well as also experience. Mul-T-Lock's Entry Manage programs generate perfect services check here which allow it to be viable for the price-free of fee motion from recognized individuals today despite the fact that limiting ease of access to Some others.
Needed commercial locksmith to Have Auto Important Substitution? Cars and truck Vital locksmith professional Experienced, Alexandria's major cars and truck Locksmith Business. Regardless of whether you Missing Vehicle Keys in Alexandria in addition to need to have added along with totally brand-new trick or even are actually locked out from a motorcar our masters are most likely to assist, 24hrs anytime.
Responses That Fulfill Your choices.
Off small work environments to large, spreading out places, our business could probably provide an unrestricted variety from more info carriers to accomplish your organisation or perhaps facility's picked requirements. Off Obtain Regulate together with to electromechanical safeguarding opportunities, our leading carrier, Mul-T-Lock promos scalable, valuable firms that help safeguard individuals, making together with valuables.
Our people can think that reduction in understanding that our team live around our integrity being a reputabled locksmith professional Skilled in Alexandria, VA
. Locksmith professional Qualified Alexandria uses of continuing to be absolutely the leading locksmith professional experts in Alexandria, VA for unanticipated emergency situation responses. In enhancement to a locksmith professional Experienced group, provided for on your own 24 humans resources a time lots of customers from Locksmith Alexandria determine they proceed to be in phenomenal hands as an outcome of The fact that your residence safety is our biggest fret.
Local Locksmith
Locksmith Professional Expert DC, the exceptionally many reputabled locksmith professional Expert servicing Arlington and also on top of that Alexandria, VA


text:
Biographical entry Benjamin, M.
M. Benjamin joined the Wallaby Club in 1895 but left in 1896.
- 1895 - 1896
- Membership - Wallaby Club
Sources used to compile this entry: Attwood, Harold (ed.), The Centenary History of the Wallaby Club, Landscape Publications, Mont Albert, 1993. List of members page 130.
Prepared by: Gavan McCarthy
Created: 11 January 2007, Last modified: 15 February 2007
A Private Club
The Wallaby Club is a Melbourne-based walking club established in 1894 with a strong bias towards good fellowship, talking and an appreciation of both the natural and built environments. Membership is strictly limited and is by invitation only.
Browse Entries
Browse Walks
Dates and details of annual walks from 1894.


text:
You are about to enter a website that may contain content of an adult nature.
Hello everyone, this is Indian cam girl mochachips5 here. I'm 42 year old Female speak English in the Indian live sex chat action. You are now entering the cookie chips world, Mocha chips letting you dig deep into your imagination to for fill your dreams.. Dancing privately for that special person also cooking. I enjoy riding and being road on a bike reading is a passion of mine to. reading Reading. poles dancing is my expertise and also what I will do in Indian live sex private show. I have Brown eyes, Medium Brown hairs and my measurements are 42-34-42. For Turn ons: Green, things , hard things and big things sweet things. For TurnsOff: Men that are dirty ,smelly and wear tooooooooo much cologne. If you prefer kinks, then Tattoos,Shaved, are mine. I'm just hungry for a HARD cock, can't wait to see u in my Indian webcam sex chat room! :)
Show more models
This website contains indian live cams, desi webcam, free hindi chat and tamil chat room related sexually explicit content.
You must be at least 18 years of age to enter this website. © Since 2012 myindiansexcams.com Indian Sex Chat Network All Rights Reserved
AllHosts1 - AllHosts2 - AllHosts3 - AllHosts4 - AllHosts5 - AllHosts6 - AllHosts7 - AllHosts8 - AllHosts9 - AllHosts10 - AllHosts11 - AllHosts12


text:
Automation Direct's Low-Cost TFT Touch Panel
C-more 6 in. TFT color touch screen HMI panel is equipped with a standard Type B USB programming port and five durable function keys with LED indicators. The unit offers 3.2 Mb memory, LED backlight, multi-state bitmap support and Windows font support. C-more micro's 320 x 240 screen allows either portrait or landscape installation. The panel is priced at $399.


text:
When defensive end Jason Babin was released by the Eagles, he said he hoped he would wind up playing for a winner.
Things didn't really work out that way. Babin was claimed off of waivers by the 2-9 Jaguars, one of the few teams in the league with a worse record than the Eagles. Babin spoke to the media on Thursday about his new team, though, and said it was "refreshing" to practice with a team that had great tempo and urgency during the workouts after being with an Eagles team that Babin thinks could get worse before it gets better.
Babin is free to become a free agent after the 2013 season, but such thoughts aren't on his mind. For now, Babin is happy to contemplate a long future with the Jaguars.
"That's the plan," Babin said, via Vito Stellino of the Florida Times-Union. "I think they're thinking the same thing and I am on board with that. I like it here. You have great weather, great coaches, great team and no state income tax."
The Jaguars are tied for the least sacks in the NFL with 13 through their first 11 games, which explains why they claimed Babin and why he's in line for a regular workload with the team when they face the Bills this weekend. If he can rediscover the form that led to 18 sacks in 2011, it would be a big boost to a Jacksonville defense desperate for help rushing the passer.


text:
Thin Birch Plywood
by Midwest
A popular wood for all types of woodworking projects. Available in Aircraft Grade Birch, milled thinner for making radio control model aircraft and Model Grade Birch, a little thicker and recommended for model airplanes and boats, crafts, miniatures, kites, etc. Sold in individual sheets.
Ask a question about Thin Birch Plywood Ask a question about this product | See all questions & answers (4)
Average User Rating: Based on (11 Reviews)
5 11
ShellyB from Washington says:
Used as sub-flooring for the deck on a model ship. It was perfect and very strong. Will use it again
Please wait...
You May Also Like...
How to get VIP Club Prices
Anyone can be a VIP Member with:
Only $25/year
Product Questions and Answers
Ask a QuestionAsk a Question
We are starting to make outdoor birdhouses and some of our plans call for thinner plywood. I'd like to know if this plywood can be used for that purpose?- Asked by Sheila McClurg on 06-Mar-14
Our thin birch plywood ranges in thickness from 1/64 in. to 1/4 in. It is commonly used for architectural models and other indoor crafts. This wood needs to be treated for outdoor projects. We have a Krylon Clear Wood Finish that helps to protect wood from the elements.- Answered by MisterArt on 10-Mar-14
What is its density?- Asked by Keni on 25-Jan-14
Birchwood has an average density approximately .67g/cm3 and is a strong, durable wood. Each item specifies the thickness of the board as well as the dimensions.- Answered by MisterArt on 27-Jan-14
Is this weather-resistant?- Asked by Bruce Gratz on 09-Dec-13
None of the wood we sell is weather-resistant as this is sold mainly for architectural model-making. I think the kind of wood you are looking for is more like what you'd find in a hardware store.- Answered by MisterArt on 10-Dec-13
How many plies?- Asked by Mordehai Gheva on 10-Dec-12
The Thin Birch Plywood by Midwest item number #44226 would be considered an 8 to 8 1/2 ply.- Answered by MisterArt on 11-Dec-12
Ask a Question About Thin Birch Plywood
Your email will not be shared. We will only use your email address to respond to your question. When asking your question, please be as descriptive as possible, it will allow us to give you the most accurate answer possible.
Please wait...
Please wait...