text:
Hero Bus Driver Named Honorary Fire Chief After Rushing Into Burning Building to Save Kids
News 1:13 PM PDT, October 11, 2019 - Inside Edition Staff
1:13 PM PDT, October 11, 2019 - Inside Edition Staff
Chanaye Brown started her route as a normal bus driver and ended it as a hero.
Brown, a Milwaukee County Transit System bus driver, was honored for her bravery and named "honorary chief of the day" by the Milwaukee Fire Department Thursday, CBS affiliate WDJT reported.
The honor stems from Brown's heroic actions on Jan. 5. She was driving her route when she saw flames coming from an apartment building's window.
As a passenger on her bus called 911, Brown rushed to the door and started alerting residents to the emergency.
"I basically stopped the bus right there and hopped off the bus and ran up to the apartment building and started banging on the door, trying to ring the doorbells," Brown said. "I heard kids in there and I kind of panicked a little more. So that's what made me start getting a little bit louder and just yelling and getting everybody's attention."
Brown even ran into the building and tried to use a fire extinguisher to put the fire out herself.
Firefighters arrived on the scene soon after. Thanks to Brown's quick thinking, no one was hurt and the damage to the building wasn't as bad as it could have been, said Lt. Michael Ball, community relations director for the Milwaukee Fire Department.
"The Milwaukee Fire Department is proud of the actions and quick thinking of Chanaye Brown, resulting in minimal fire instead of what most likely would have been a full-fledged structure fire," Ball said during the ceremony. "Because of her actions in calling the fire department first, alerting residents, and attempting to help extinguish the fire, not only was no one hurt, minimal damage occurred to the building — allowing the rest of the residents to return to their apartments rather than be displaced. We commend Chanaye for her quick and decisive action in stepping up and helping when the situation arose."
But Brown said she just did what any good mom would.
"I just like to look at it like I was doing something that I would like somebody to do if it was my kids in that predicament," Brown said. "That's how I feel any time I'm out here driving a route and I see or hear something going on. I just think about my kids and that's what makes me do a lot of the things that I do."
Hero 911 Operator Meets Family She Helped Save
Hero Neighbors Help 97-Year-Old Woman Escape Raging House Fire
Hero 12-Year-Old Bashes in Car's Windshield to Save Toddler in Hot Car
Hero Springs Into Action to Put Out Massive Blaze Before It Consumes Home


Americans buying salmon from stores like Walmart may have subsidized the North Korean nuclear missile program.
An investigation reported by the Associated Press about seafood and the American consumer supporting "modern day slavery" is a hard one to swallow. Thousands of North Koreans are outsourced as cheap laborers, and their work brings in between $200 million to $500 million a year. Stores like Walmart and ALDI have potentially sold seafood packed by those underpaid workers.
About 3,000 North Korean citizens were shipped off to Hunchun, China, where they are subjected to unimaginable working conditions in seafood packing plants. According to the report, the Hunchun laborers "sleep in metal bunks and work 72-hour weeks processing fish for as little as 46 cents an hour, because Pyongyang keeps somewhere between half and 70 percent of their pay."
The AP tracked over 2,000 tons of seafood from packing plants in China that came into the U.S. just this year. Some of the products have trickled into American distribution through Walmart supplier, The Fishin' Company; Rhode Island company, Sea Trek Enterprises; and ALDI's exclusive brand, Sea Queen. However, the AP said it would be difficult to determine the percentage of products from the Hunchun packing plant that made their way into the U.S.
According to the New York Post, "the workers wake up each morning on metal bunk beds in fluorescent-lit Chinese dormitories, North Koreans outsourced by their government to process seafood that ends up in American stores and homes. Privacy is forbidden. They cannot leave their compounds without permission. They must take the few steps to the factories in pairs or groups, with North Korean minders ensuring no one strays. They have no access to telephones or email. And they are paid a fraction of their salaries, while the rest — as much as 70 percent — is taken by North Korea's government. "
So that piece of fish you just bought at Walmart may have helped Kim Jong-un's nuclear agenda.
While we understand that hiring North Korean workers may be legal in China, we are deeply concerned that any seafood companies could be inadvertently propping up the despotic regime.
I never presumed to lay the responsibility at the consumer's feet. I just AVOID Walmart- ALWAYS. They are Welfare profiteers. Hate them.
ALDI builds a nukes program while subsidizing North Korea?! Sneaky!
Not okay. Folks, for the safety of America, we have to boycott salmon sold by Walmart.


Nelson Footwear, Retail sale of footwear and leather goods, listed under "Retail Sale Of Footwear And Leather Goods" category, is located at Duke Street Settle North Yorkshire, BD24 9DN, United Kingdom and can be reached by (01729) 823523 phone number. Nelson Footwear has currently 0 reviews.
Browse all Retail Sale Of Footwear And Leather Goods in Settle North Yorkshire.


Forums » Professional Video Editing & Finishing Forums » Avid Media Composer - Mac » Exception: The sequence or one of its.... POP UP FROM HELL!!
Latest post Fri, Feb 15 2019 9:56 AM by Pat Horridge. 2 replies.
For starters, in all my years using this site, why is it so hard to search for a specific line such as the above?
I would get a per word query which to me shows how bad this websites search engine works.
Exception: The sequence or one of its source elements is too long to be played.
Such an odd one and I am running 2018.10.x on a Mac Pro High Sierra.
Re: Exception: The sequence or one of its.... POP UP FROM HELL!!
I agree. The only workaround I've found is to use Google, adding the words avid and community to whatever search term you're trying to find. This usually returns good results from the forum.
I hope that helps, and I'm sorry I don't know anything about your sequence length error.
Divide the sequence up to locate the problematic clip or section.
And searching the site is hiopeless. Use google as mentioned.


The Blue Mountains International Hotel Management School (BMIHMS) has added two new programs to its current course offering.
The Bachelor of Business – International Restaurant and Catering Management (RACM) and the Bachelor of Business – Guest Experience Management (GEM) have been introduced to meet ongoing industry growth and demand.
The RACM degree adds to the specialist hospitality management education currently delivered by BMIHMS. It is designed for individuals who are passionate about food and wine and who are also striving to build a management career. The GEM degree gives students the opportunity to select two specialisations from luxury retail, casinos, integrated attractions, cruise ship, marketing and events. Both the RACM and the GEM are 2.5-year degrees that will provide graduates with a business qualification and the added benefit of skills and knowledge specific to the hospitality sector.
"The hospitality industry is growing at a rapid pace, and so too are opportunities for graduates in the field. As a leading institution for hospitality education, it is only natural that we would continue to adapt and introduce new specialised course offerings to meet industry demand for graduates with specific skill sets.
"There are many opportunities within this sector in a range of food and beverage outlets through branding, finance and revenue, food service operations, entertainment facilities and venue management.
BMIHMS is Australia's leading hotel school for hospitality education (TNS Survey 2013), known for its internationally recognised hospitality and business degree courses that are highly respected within the industry. BMIHMS provides students with a valuable and unique combination of theoretical knowledge and practical experience, ensuring that they are well equipped to commence their careers immediately following graduation.
Since 1991, BMIHMS has produced more than 3,000 graduates from over 50 countries. Due to its successful Industry Placement program and extensive network of hospitality industry partners including major hotel chains, boutique properties, resorts and events companies, BMIHMS students have excellent employment prospects. A recent survey conducted with BMIHMS alumni indicated that 100% of graduates looking for employment secured a job within the first year of graduating. Of those, 95% secured employment within 3 months of graduating, and 74% are currently in management or senior management positions.
For more information on the courses on offer, visit the courses section of this website.


text:
Category: CLASSICS
Best Seller1 New Release1 Clearance1 On Sale2 Media Type
DVD79 MP441
Documentaries7 Dramas93 Hollywood Classics32 Musicals7
Animation5 Comedy1 Docu-Drama3 Documentary11 Drama95 Musical Drama5 Puppetry1 Short Stories6 Stage Performance1
Christmas7 Easter4 Gifts for Boys11 Gifts for Dads8 Gifts for Girls8 Gifts for Mom8 Jewish Holidays1 Patriotic1
Adults85 Children10 Preschool2 Seniors24 Teens23 Tweens21
Chinese Subtitles2 English Subtitles28 French6 French subtitles6 German4 German Subtitles3 Hindi4 Italian1 Japanese1 Japanese Subtitles1 Korean8 Korean Subtitles9 Malayalam2 Mandarin1 Polish1 Port. subtitles3 Portuguese10 Romanian1 Romanian Subtitles1 Russian1 Spanish21 Spanish Subtitles9 Tagalog5 Tamil2 Thai2 Thai Subtitles2 Ukrainian1
Top Match
Candle In The Dark
Item 4782D
Region: All
Media Type: DVD
Running Time: 1 hr 37 min
A film and curriculum guide on the life and ministry of William Carey, the "Father of Modern Missions."
Beyond The Next Mountain
The story of how the Gospel of John changed the course of history for a tribe of headhunters. This is the story of Rochunga's personal pilgrimage. It is an unforgettable saga of his dedication to a vision and of the Lord's direction in his life. Filmed in India, Hawaii, Scotland and America, this beautiful film will be enjoyed by the entire family.
The dramatic black and white classic film of Martin Luther's life made in the 1950s.
Molokai: The Story Of Father Damien
The touching story of Father Damien, who went to the island of Molokai to minister to the lepers who had been exiled there.
Treasures of the Snow
Item 501824D
Running Time: 1 hr 47 min.
Lucien, a lonely, frightened boy of 13, finds himself an outcast from his family and friends, especially the very hostile neighbor Annette. Lucien becomes friends with an old woodcarver and begins to have hope, but learns that a price has to be paid for forgiveness. A touching tale of forgiveness and reconciliation, filmed in the breathtaking Swiss Alps.
God's Outlaw: The Story Of William Tyndale
A true story, God's Outlaw is about international politics, church intrigue, cold-blooded betrayal, and false justice ending in a criminal's death. But it's also about victorious faith and spiritual triumph over some of the greatest political and religious forces known in the 16th century.
Huckleberry Finn / The Adventures of Tom Sawyer
Item 10084D
Region: US and Canada
This 4-movie pack includes these classic films: Huckleberry Finn, Lassie: The Painted Hills, The Adventures of Tom Sawyer, and Where the Red Fern Grows.
Mr. Deeds Goes to Town
When small-town innocent Longfellow Deeds (Gary Cooper) heads to New York to collect a $20 million inheritance, he ends up a target of ridicule thanks to Babe Bennett (Jean Arthur), a cynical reporter whose demeaning stories have made him the joke of the city. So when he discovers his sweet and unassuming new girlfriend is actually the hardboiled Bennett in disguise, a disillusioned Deeds decides to give his fortune away, an act of charity his crooked lawyer will stop at nothing to prevent.
This is the classic 1956 version of the Biblical story starring Charlton Heston.
Running Time: 6 hrs 22 min
Jesus of Nazareth is a unique film depicting the life of Christ from His birth through His resurrection. Full Screen
A.D. (2 Disc Set)
The earliest experiences of the Christian church are powerfully dramatized in this remarkably authentic TV mini-series epic covering the years A.D. 30-69. The perfect resource for any church or home study group wishing to explore the early church.
Lassie: the Painted Hills - 5 Movie Pack
This 5-movie pack includes Lassie: The Painted Hills, Snowbound, Castle Rock, River's End, and Baker's Hawk.
Newly widowed Regina finds herself being pursued through the streets of Paris by three men seeking the fortune her murdered husband had stolen from them. She meets a charming and helpful stranger, but his motives are unclear, and she doesn't know whether she can trust him. This timeless classic will keep you guessing until the very end.
In this classic 1949 production, Frederic March gives an outstanding performance as Christopher Columbus, the world's most daring explorer!
Classic Family Movies - The Shirley Temple Collection
See Shirley Temple in her first color feature, The Little Princess (1939). DVD includes three of Shirley's early shorts: Dona's Dunking Donuts (1933), Merrily Yours (1933), and Pardon My Pups (1934).
Running Time: 1 hr 15 mins.
Daniel Boone is one of the most heroic figures in early American history. Staying faithful to the character and the times, this 1936 production from Radio Pictures stars George O'Brien in the title role. He leads thirty settlers and their families from North Carolina to Kentucky where they face menacing Indians and renegade whites.
Entertaining Angels: The Dorothy Day Story shows how she served New York's poor and became a voice for the voiceless. The film shows Dorothy's struggle as she establishes the Catholic Worker movement and commits herself to a lifetime of peacemaking, battling for justice, and hands-on service to the poor.
Famous Hollywood Stars
The Gospel according to Hollywood has long been creatively expressed in movies and TV shows.
Gospel Films Archive Series - Christmas Collection
A collection of heartwarming Christmas films from a bygone era.
Gospel Films Archive Series - Easter Collection
Running Time: 98 min
Gospel Films Archive proudly presents a festival of four rare classic short films that celebrate the spirit of Easter as manifested by Christ's Crucifixion and Resurrection.
Gulliver's Travels
Based on Jonathan Swift's 18th century immortal tale, this animated feature includes wonderful songs and endearing characters. It took nearly 700 artists to complete this 1939 feature film, which was directed by Dave Fleischer and produced by Max Fleischer for Fleischer Studios.
The made-for-television version of Johanna Spyri's family classic. Heidi (Jennifer Edwards), a young orphan girl, is sent to live with her grandfather (Michael Redgrave) in the beautiful Swiss Alps. The gruff and bitter old man views Heidi at first as an ill-mannered child and an unwanted responsibility, but he soon becomes quite attached to her.
I Beheld His Glory
Set in the days immediately following the crucifixion, a Roman centurion tells the story of Christ's last days on earth from his unique perspective. This hardened soldier's life was forever changed when he beheld the glory of the risen Christ.
In God's Company: Thomas Cook and William Hartley
Running Time: 75 min. total
Two trailblazing 19th-century British businessmen whose work was built on faith: Thomas Cook and William Hartley.

redpajama_set_name: RedPajamaCommonCrawl


text:
Covid Discussion
Page 10 of 10 First ... 678910
Thread: Covid Discussion
Will , remember those nursing home people are very old, have major comorbid diseases and have covid delivered to them. As it turns out, the worst case was brought to the bedside. SO don't go to bed either!. Stay safe.
And right on schedule, this virus is dying out in the worst infected state ( New York). If you all remember I said it would be a gonner withing 3 months, SOme remains but this does show the usual behavior of an epidemic.
You said in early May that "the present COVID threat was fizzling out" and in late may you wrote "I said it would be a goner within 3 months".
If July has more deaths than May or June, and if September and October each have more deaths than May or June or July, should we expect any kind of acknowledgement?
Any self-reflection or self-awareness or acknowledgement about what part of your mental model of the pandemic was incorrect?
If your predictions of fizzling out or being a goner within 3 months of May are correct, I will be very grateful!
No to anything and everything authored by you......... it IS fizzling. all data shows it. And it's consistent. If things take a turn for the worse ( won't happen), we'll deal with that if it happens. The hosts are dying off......what don't you get about older people being dead??? ( if it was indeed COVID that killed them) . On this go round, the targets are leaving us. We do keep producing older people.. Hopefully the olders are now being protected. What I don't understand is why you keep harping on me acknowledging something..youu have an answer for that? It's been months and you really have nothing new to say. So what's your point Bub??
https://www.youtube.com/watch?v=GdN-...d9tx5JCXN7_FAU
Persistent problem with false positives.....when you have a positive test, half are wrong. Quite the problem. the test result is positive but the patients doesn't have the disease half the time. Make one wonder what data they're using as COMID falls per testing and mortality/admissions to the hospital, etc...
No problem, MDABE80.
I'll happily evaluate your claims from 6 weeks ago about how COVID "is fizzling out" and "dying out" by purely looking at the deaths, not the infected numbers. If you're right, we'll see a "fizzled" amount of COVID deaths, and no significant increases in mortality due to respiratory illness.
Of course if you are wrong, we'll see significant increases in mortality specifically among the age groups and in the places that report large COVID outbreaks.
But either way, we won't need to rely on the active/new infection numbers which you describe being skeptical of. So that's great!
She's not saying (even back on April 20) that half of the positive tests are false positives. That's an internet conspiracy misrepresentation of her claim, using a clip with no context, that's been passed around among far-right fringe circles of extremist websites. It's not what she's saying or said, or what Fauci is saying or said.
Here's the full transcript
Here's the full video
She's just making a semi-irrelevant aside about how when you are randomly testing everyone from a population that's 99% healthly, that it's mathematically possible for a 99% specific test to coexist with 50% false positives, since the actual (and false) positive number is tiny.
But such coexistence is mathematically impossible if even just 2% of those being tested are actually sick.
Specificity = (negative on both test and reality) / (negative on both test and reality + false positive test)
So a world with 2% sick but 50% false positives would yield: 96/96+2 = 98% specificity test.
79% of NYC's reported COVID dead people had a positive lab blood test.
The other 21% did NOT test negative, they were not given a blood test but symptoms of COVID, personal interactions or lived with someone testing positive, etc.
And their demographic makeup matches the confirmed COVID deaths. Before you start up with reports about how every senior citizen respiratory death is called COVID and the financial incentives to encourage inflation are creating these numbers, please be aware that NYC has now repeated zero of single-digit COVID deaths daily for several days. Maybe the virus was actually terrible there and is now mostly under control, because the financial and other incentives you point to haven't changed or gone away but somehow seem to magically have stopped causing doctors to code deaths as COVID.
Of course as an MD I'm sure you know know how specificity is calculated already, so if I'm missing something and 99% specific test with 50% false positive rate co exist when even 2% of the pool of those tested are actually sick, please show us. Thanks.
She said it alright. Not sure it still applies. We are still pagued by false positives...........and I don't think it's right. THe left is frothing over this data. Seems like the most current data a fews ago showed slower recurrence in 12 states. today it's 24. Possibly due to letting up on the distancing and relaxation of masking. Major concerns but i also think the testing is still not good enough. Time will tell.
It's a confusing picture. TOny thinks he'll have a vaccine by December.
Coronavirus breakthrough: dexamethasone is first drug shown to save lives
https://www.nature.com/articles/d415...54efa-45349030
1THis is a trial in end stage and severe form requiring ventilation. I wonder if this drug would work in early onset (
within 10 hrs of symptoms) people with seropositive or throat swabs that confirm the disease is present WITH symptoms....
Decadron is among the purest anti inflammatory drugs we have. It's not worked well in ARDS due to bacteria or mixed flora causing respiratory failure. We meed to know more... good thing something worked though.
Major "superspreader" events account for huge numbers (probably over half) of all COVID infections. Common traits of superspreader events: indoors, prolonged exposures, close proximity, yelling or singing.
Sound like a basketball stadium? COVID is/was not "fizzling out" in May, and will not "be a goner" by july or August.
I think the best realistic hope for next season is to hope for games without fans attending, or with very few fans all mandatorily masked. I find it almost unimaginable that we'd have anything close to capacity crowds.
Here are a couple notes about recent superspreading events (one in Florida, one in Oregon):
LTown the number of infectious, hospitalizations, mortality , bent use and requirements have fizzled since May and continue in June in the overall. There are some surges but the few cases that recurr are limited in numbers and are nothing compared to case numbers 90 or more days ago. These are facts. Period.
There are some states where cases recur and the consequences are dropping and in a good way.
Try to remember too that 82% of deaths are over 65 and have other serious diseases. Ie co morbid problems.
The newest liklike of people's le under 25 acquiring the disease is running at 0.3 per 1000 {very very low).
Well have a good season on the court. Masks, distance and hand washing still rule. By mid Denver there will be over 200 million vaccine doses available with more to come.
You're just so wrong and yet so negative over COVID. Take a deep breath behind you mask. Things are getting better... not perfect but better.
This is America, not some 3rd rate place. Not China. A first rate nation. We got this! Lol
the number of infectious, hospitalizations, mortality , bent use and requirements have fizzled since May and continue in June in the overall.
Here's the data - if that's your version of "fizzled out" I'd hate to see what you think "steady" looks like. Note that the Hopkins numbers are the same as the "our world in data" numbers.
There are some surges but the few cases that recurr are limited in numbers and are nothing compared to case numbers 90 or more days ago.
90 days ago was March 20 and we'd had under 200 total deaths, and had never seen 50 deaths in a day. Our daily confirmed deaths this past week averaged 800. How is the death of 800 people per day "nothing compared to case numbers 90 or more days ago." (which were averaging less than 50/day?)
Being a wealthy or powerful or not a "3rd rate place" is not what is keeping people alive across the world. The top 10 countries by deaths per capita include Andorra, Belgium, Netherlands, Sweden, USA, France, and UK. Meanwhile many of the much poorer countries in Europe (Poland, Greece, Slovakia, Bulgaria) are doing far better. There are absolutely some wealthy advanced economies doing great (Singapore, Australia, South Korea) and other nearby poorer nations (Thailand) also doing well. Mortality has not been particularly correlated to quality of government or standard of living.
Last edited by LTownZag; 06-20-2020 at 08:35 AM.
Your data is wrong . Not in the US. I dunno who or what you're quoting. It's not in synch with the Hopkins data. It's always the same with you....... in the US ( who knows what the WORLD is doing)..all measures are in a favorable trend in the overall. ALways will be or might be a few hot spots.......I explained that to you 90 days ago. . Best wishes.
It's the same data. From the same source/s. Literally the same numbers on the same dates, displayed by two separate nonprofit data visualization websites.
Hopkins and "Our World in Data" also make all their raw inputs and (same) sources open and available to the public. Anyone can view or suggest errors in their numbers, and they have things completely transparent via updated and archives GitHub sites with their code open sourced.
Both Johns Hopkins, which you suggest, and "Our World in Data" which you attack as wrong, primarily source death and new cases data from the same health agencies.
Both cite the US CDC and the Euro CDC (European Centre for Disease prevention and control) as their primary sources.
What you are doing is equivalent to claiming you don't like the Gonzaga box score as reported on ESPN.COM and you only trust the gonzaga box score reported on FoxSports.com, meanwhile both show the same box score, and both websites simply display the score automatically fed to them by the scorekeepers working the games for the WCC.
Your data is wrong . Not in the US. I dunno who or what you're quoting. It's not in synch with the Hopkins data. It's always the same with you....... in the US ( who knows what the WORLD is doing)..all measures are in a favorable trend in the overall.
"My" data is EXACTLY in sync with the "Hopkins data" down to the single digit. Here Is Hopkins and "Our World In Data" showing the EXACT SAME daily and year-to-date cumulative deaths as of 6/20.
Its too bad that you don't critically read or understand these graphs ( which look like you forged them with an etchosketch machine) From both posts, the comments are on worldwide cumulative.......or Europe or Brazil. Your last graph of the US proves my point. Just go sit quietly and review it. US data is what matters. Nobody, even Hopkins ) can vouch for the Euro or Brazil info. Might be that we're somewhat talking past each other.
I'm only speaking about USA numbers.
Ignore the Brazil half of the screenshots if you want to.
Or cover that half of your monitor with a post-it.
"Our world in data" and Hopkins and basically every other major covid tracking page with graphs all have and use the same CDC and Euro CDC data.
What are you talking about with this claim of forged etchasketch?
I most your data is actually European data . I
The one graph that applies to the USA is the last one . That proves my statement is absolutely cotton. Aren't you getting tired of trying to be something you're not nor will you ever be. And admitting you are wrong and incompetent to understand explain data is just not your long suit. And yet, as a pestering Jim Acosta type, you continue. Lolol.
I would love to read a poll or responses of others who read the above page of back-forth, regarding which of the two of us is demonstrating incompetence in understanding or explaining data.
Quick Navigation Forum Support Top


Westminster Council has said that it intends to switch off its CCTV system in September 2016, claiming it will save the council £1 million a year, because the major benefactor of its seventy-five cameras is in fact the Metropolitan Police, which pays nothing towards them.
Figures released by the council reveal that the cameras played a part in 1,300 arrests last year and witnessed more than 600 criminal incidents a month - involving crimes like robbery, drug dealing, theft, and suspect packages.
Most London borough councils have CCTV centres and have done for some years. These are usually sited in secret locations in each borough and are staffed and paid for by the local authority, via council tax receipts. The cameras are on and recording 24 hours a day, 365 days a year. Recordings are kept for up to 31 days and can be accessed by the police for criminal investigations.
These control rooms play a huge role in combating crime across the capital. They have radio contact with the local police and are very often the 'informant' of a crime in progress to the police. In other words, the CCTV operator will see something happening, like a robbery, a fight, or a suspicious person - and will contact the police and direct officers to the incident. So, the loss of these operators will have major ramifications for the police, local residents and anyone passing through the area who might have the misfortune of becoming involved in a criminal incident.
Nowadays, there is simply no criminal investigation that does not have an element of CCTV involved. In my opinion, investigations into all sorts of incidents will be damaged and curtailed because these cameras won't exist. The police can, retrospectively, track a suspect from one point to another in London using the CCTV that is available.
Some might say we don't need that many cameras and that private ones and Transport for London ones will suffice, but, I say, think back to 2005, when fifty-two people were murdered on 7th July by a group of suicide bombers in London. Two weeks later, on 21st July, four suspects tried to do the same thing, but thankfully failed. CCTV played a crucial role in not just locating the suspects, but also subsequently, in providing evidence against them.
How do we use CCTV?
To give you an idea of how we used CCTV in that investigation, one of the suspects from the 21/7 bombings fled from the scene after attempting to blow himself and fellow passengers up on the London underground. He ran out of a Tube station. He then ran in front of a passing car and escaped. This was all caught on local council CCTV.
The local council CCTV gave us the registration number of a bus that was nearby. We contacted the bus company, the bus was fitted with CCTV which we used as evidence. Also, in front of the bus was a car, we gained the registration number of the car from the CCTV on the bus.
We then contacted the owner of the car, who had seen everything. They provided a statement, and, crucially, that witness was able to pick out the suspect he saw running from the tube station on an ID parade that we then used in court against the suspect once he was found, arrested and charged.
He was sentenced to 40 years in prison.
So, you can see from that chain of events, that all it took was just one local council CCTV camera. From there we obtained our initial image and that played an immensely important role in the investigation and subsequent prosecution of the suspect. The loss of the cameras in Westminster is a terrifying prospect for many investigators.
This is a Tory council trying to hold the Met Police to ransom. This is about Westminster Council trying to force the Met Police to pay for its CCTV room because, they say, it's not a council function.
We cannot afford NOT to have these CCTV control rooms now. We rely upon them. But if the Met is forced to pay for them by local authorities, then the Met should start charging local authorities for the time spent working for them. Let's start with the cost of hours spent locating missing children who have absconded from local authority care, shall we...?
David Videcette is a former Scotland Yard investigator who worked on the 7/7 and 21/7 investigations into the London bombings as a Met detective. Sales of David's book will help to support The Police Dependants' Trust charity. Check out 'The Theseus Paradox', the thriller based on real events at AMAZON BY CLICKING HERE.


Features: low-rise peep-hole back organic cotton lining no side seam leg with smooth seamless edge Model (bust: 86cm, waist: 60cm, hips: 90cm) wears size S Material: Mesh: 80%PA, 20%EA Lining: 100% organic CO Care: Delicate 30°C wash, do not bleach, do not tumble dry, do not iron, do not dryclean. Please use an environment friendly detergent and put your lingerie in a washing bag! Handmade to order in Vienna, Austria- please allow up to 10 working days for your lingerie to be delivered. Whether you treat yourself or buy it for a special friend, all orders include complimentary gift wrapping. Complete the set with the A jewel a day... Bralette for your ultimate everyday basic/glamour look.


Welcome to the Jetpack Iron Hero: City Legend where iron hero crackdown to mafia, drug dealers and gangsters in city town. There are many crimes like drug buying and selling, mafia criminals in city town. You have shooting and fighting skills so stop gangsters from escape. Dealers smuggling drug very easily from one city to other with the help of police members. Some cops are involved with criminals. Jetpack iron hero can drive so we used superfast sport car and bike also. Jetpack iron hero fight and shoot with mafia, criminals and corrupted police officers. Jetpack iron superhero saves people and city from mafia and gangster. This Strange Hero game is full of exciting and action adventures.


-products of outstanding representatives around the globe thought that is political for the present and past; international and state papers: constitutions, declarations, charters, treaties, laws and regulations, decrees, etc.
On the basis of the browse and prepared sources, working records, extracts, very very own ideas and conclusions, an operating form of the text that is main created, the outline of this abstract is finally specified.
Following the literary works regarding the subject of this abstract is discovered, extracts have now been put together, a large amount of product is gathered, it requires to be understood, brought into a system that is certain, extremely significantly, effectively described in strict rational series, observing just one design, precisely. This will be attained by complying with a few demands for the dwelling associated with the abstract.
The introduction may be the basic area of the placed that is abstract the primary text. The relevance is revealed by it of this subject, formulates the reasonand goals of the research, substantiates the dwelling of this work, and provides a summary of sources with this subject. The quantity associated with the introduction is pages that are usually 1-2 the quantity an abstract is 15 pages.
The final outcome sums up the task. It might probably include a repetition that is brief of primary theses associated with the work, plus the conclusion that is general by the composer of the abstract. To conclude, ideas for further clinical growth of this issue may be developed, practical tips can be provided with. In conclusion regarding the amount is obviously significantly less than the introduction and it is about one web web web web page of text.
Sources is a listing of sources found in the writing and preparation of this abstract, arranged in strictly alphabetical order and arranged in conformity because of the demands which will be described within the next part among these tips.
The quantity of this abstract is counted in typewritten pages printed in 1.5 period, font 12 or 14. The writing is typed on A4 sheets.
edubirdie In exemplary situations, a handwritten form of the abstract could be supplied, nonetheless it needs to be written in an obvious handwriting that is legible. Initial web web page within the abstract is really a name web web page, while the page that is second a plan. These pages aren't numbered.
Numbering starts in the 3rd web page and it is through to the end. The web web page quantity is affixed in the center of the top margin. Numbers, tables, maps, bibliography and applications are contained in the general through numbering. The headings of this chapters of the text that is main associated with the abstract are numbered, printed in money letters or in font. When utilizing quotes, sources are expected.


The Hood is a rare treat for rafters. Access for our boats is a challenge, the river is flashy, and the flow window is tight if you aren't a big water enthusiast. The recommended flow range on the Tucker gauge for rafts and cats is 5.5 to 6.5 ft. This is a read-and-run class IV run with lots of long class III/III+ rapids, and a series of bouldery Class IV rapids in the mile above Tucker Bridge.
Put-ins range from Dee on the East Fork to Tucker Park in the middle of the Class IV section, but most of these require land owner permission or trespassing. All of the put-in options require long carries and some involve rope work. The take-out is in Hood River at or near the mouth.
Above 6.5 ft. the river starts to get big, fast, and pushy and moves toward solid class IV/IV+, and can be run as high as 10 ft. Below 5.5 ft. it starts to get boney and lots of bends start to sieve out, but you can get cats and small rafts down the river as low as 4.8'. I like to IK between 5 and 5.5 ft. and raft or cat above.
Yesterday we hit the river at 6 ft., which is an ideal level for the class IV minded boater. We ran from the confluence of the East and West forks to the Columbia (about 15 miles) in a little less than 3 hrs. There were no significant wood hazards, but there is a throw rope and bag in the river on the right side in the tailout below the Powerdale rapid. We tried to get it out without any luck.
I ran my Spider with paddle assist. If you take paddlers on this run, make sure they know how to dig. With the weight of other people in the boat, I needed the extra power of 2 strong paddles to make several moves and to punch a couple of holes that we could not avoid. The cat boats had lots of play water at this level. We had mild spring weather in the mid-50's with lots of sun breaks, but the water was cold (snow melt) and the wind was blowing in Hood River. Most boater's opted for drysuits. At then end of the day everyone was flush with mild wind and sun burn.
Double Mountain Brewing (which is in walking distance from the take-out, is in the middle of a kitchen re-model, so food was not available, but the chips and salsa were free and the beer was tasty.


September 19, 2005: The U.S. Army and Marine Corps are buying (for $3.3 billion) some 380,000 of a new generation of night vision equipment for individual troops. Night vision devices, in use since the Vietnam war (when the size and shape of a foot long telescope), have gotten smaller, lighter and more capable and reliable. The third generation equipment buy includes 340,486 AN/PVS-14 night vision monocle (one eye) devices. These weigh about 11 ounces and cost $2,570 each. In addition, 38,816 of the AN/PVS-7D night vision binocular units are being bought. These weigh 1.5 pounds and cost $2,614 each. The buy includes spare parts, particularly the image tubes, which wear out and have to be replaced. Some 210,000 of these tubes are being bought, for about $1,900 each. Both night vision units enable the user to identify a man sized target at 150 meters using only starlight. The battery powered night vision devices last about 15 hours per set of batteries. Large night vision gear can see farther and more clearly, but the advantage of the AN/PVS-14 is that it's light enough, and cheap enough, for every infantryman, or truck driver, to have one.
Night vision gives American troops a major advantage in combat, even when the enemy sometimes has similar equipment. U.S. troops constantly train with their night vision gear, and are remarkably effective pulling off raids and attacks in complete darkness. This tends to put the enemy off balance, resulting in quick American victory, with low casualties all around.


text:
PhD Candidate position in CINELDI
There is a temporary position available at the Department of Industrial Economics and Technology Management as PhD Candidate in industrial economics and technology management for a period of 3 years. The position is resident at NTNU's campus in Trondheim. This is an educational position, which will provide promising research recruits the opportunity for professional development through studies towards a PhD degree.
This position is part of the Centre for Intelligent Electricity Distribution (CINELDI) and hosted at the Department of Industrial Economics and Technology Management in cooperation with SINTEF Energy Research and the Department of Electric Power Engineering.
CINELDI is a multidisciplinary research Centre for Environment-friendly Energy Research (FME) awarded by the Research Council of Norway. CINELDI is hosted by SINTEF Energy Research with NTNU as a major research partner.
CINELDI seeks to develop expertise and promote innovation through focus on long-term research, development and education related to flexible and intelligent energy systems (smart grids). CINELDI works towards digitalising and modernising the electricity distribution grid for higher efficiency, flexibility and resilience. The objective is to tailor the grid for use by smart grid customers, electric vehicles, solar power facilities and other renewable electric power in a cost-efficient way.
The PhD will work closely with other PhDs/post doctors and researchers within CINELDI.
The position is connected to the PhD programme at the Faculty of Economics and Management and the faculty will be your employer. The main supervisor is Associate Professor Maria Lavrutich at the Department of Industrial Economics and Technology Management.
Information about the Department
The Department is organized into six sections:
Managerial Economics, Finance and Operations Research
Health, Safety and Environment Management
Strategy and Business Development
Experts in Teamwork
Section of Economics and Management (Campus Gjøvik)
The position is part of the Managerial Economics, Finance and Operations Research section. For further information about the department, see our website.
The position is part of the research project "Transition pathways for smart distribution grids in view of new technologies, digitalization, regulation, markets and other drivers".
Distribution grids are experiencing a transformation driven by decarbonization, decentralized generation, digitalization, and the emergence of flexibility markets. In this transition, achieving a flexible, robust, and cost-efficient electricity distribution system requires complex interactions of a variety of actors and technologies. In order to enable the transition towards feasible long-term scenarios for distribution grids, policy makers need to understand the impact of short-term regulatory measures, market designs and incentive schemes to promote robust and cost-efficient electricity distribution system transition supported by system innovation and new technologies and solutions. These measures should allow for optimal resource allocation in both the long-term (investments) and short-term (security of electricity supply and power system balance). In this attempt, new market designs and business models will be crucial to ensure social welfare.
The focus of the PhD project is to identify efficient market and regulatory mechanisms to support the long-term transition with short-term measures. The objective is to analyze and understand the long-term impacts of market-regulatory frameworks, interactions of a variety of actors as well as different technologies on the transformation of smart distribution grids. The PhD project will study the effects of different flexibility markets, tariffs and other incentive schemes. These aspects will be studied in view of scenarios for the future distribution system developed in CINELDI also including technology details and descriptions of the technological capabilities.
The main purpose is to see how to incentivize investments in smart grid infrastructure in order to support plausible transition scenarios. The efficiency of these measures will then be assessed in terms of socio-economic welfare and distribution perspectives. Methods used will be from economics, optimization and electric power engineering. Knowledge of the power system and distribution grids, as well as economic regulation of grid companies/monopoly regulation is an advantage.
Please have a look at https://www.jobbnorge.no/en/available-jobs/job/180939/phd-candidate-in-cineldi-transition-pathways-for-smart-distribution-grids-in-view-of-new-technologies-digitalization-regulation-markets-and-other-drivers for the complete job advert.
Application deadline: 01.03.2020


text:
Q: How to get larger MTU in RxAndroidBle? I'm trying to create data transmission between a custom BLE peripheral and Android communication library implemented with RxAndroidBle (1.4.1). I have it working with the default MTU (23 bytes) so that Android transmits only 20 bytes at the time. The communication works with MTU of 23, but we'd really like faster communication.
Our device supports DLE and requests a larger MTU of 158 bytes at the start of the communication and gets it with practically all mobiles. That done, the device starts sending data up-to 155 bytes at the time. Because of this the device->mobile communication is reasonably fast and it works fine. However on the Android side the RxAndroidBle's getMtu() call always returns 23 (even if library and test application have been built with minsdk = 21, running on Android 7.1.1). I tried to add call to RxBleConnection.requestMtu(512) after establishing the connection, but that results no callbacks and the getMtu() still returns 23.
I tried it with just brutally calling setMaxBatchSize(155) on createNewLongWriteBuilder and seeing what happens. Result was faster communication without any issues! (I confirmed on device logs that we really were getting >20 bytes at the time) However, to avoid unpleasant surprises if a device doesn't support large MTU's I'd really like to have the library use an actual MTU value, not a "big guess".
So, What is the actual way of getting current MTU in RxAndroidBle? Is there a bug that prevents it from working or something?

A: The behaviour you have described is actually a bug as of RxAndroidBle version 1.4.1. The MTU value retrieved by the RxBleConnection.getMtu() is updated only when the MTU negotiation is started by the central via RxBleConnection.requestMtu(int).
There is a release 1.4.2 which has this issue fixed so the MTU value is updated also when the peripheral starts the negotiation.

redpajama_set_name: RedPajamaStackExchange


Le principe des offres reconditionnées est simple : Amazon reçoit un produit d'un utilisateur et procède à de nombreux tests pour s'assurer que ce dernier fonctionne correctement. Détails..
EA has confirmed to us that the code can be used an unlimited amount of times, with a restriction placed on time rather than uses. Games like Mass..
Self-Adhesive Bevel Angle Wall Hooks Robe Towel Hooks, Strong Stainless Steel,4 Pcs,1.8.8,Coat Hooks, Kitchen Hooks, Key Hooks. Now.19 W6btoxpl Please copy the code 75 Off igoku Car Charger USB 4 Ports 48W.6A with Built-in Fuse, Designed for Front and Back Seat, Quick Charge, Smart Identification for iPhone, iPad, Galaxy, Note, Nexus, HTC More. Slant Leg One Push Up Clia Instant Folding Canopy with Wheeled Bag, White. Now.04 50xncyyz Please copy the code 55 Off AGO Fitness Tracker, Smart Activity Watch Waterproof Smart Bracelet with Step Counter, Calorie Counter, GPS, Heart Rate Monitor, Pedometer for iOS and Android (Red). Burch also launched her own line of makeup and beauty products that are now available online. Now.64 C4UAU8K3 Please copy the code 40 Off OXA 2060 Angled Waterproof Spotting Scope with Tripod for Birdwatching Portable HD Monocular Telescope High Powered Scope for Target Shooting Archery Outdoor Activities. You will surely enjoy great Amazon discount as there is always a chance to save. Now.05 IL3muxn6 Please copy the code 42 Off vava VA-AH017 Top Fill Humidifiers for Bedroom Nursery BPA Free, Easy to Clean, Cool Mist, 17-36 Hours, No Noise with Blue Mood Light, White-(4.3L/1.1 Gallon, US 110V).
Now.51 vyndi2MN Please copy the code 45 Off Steamer for Clothes, Snorda Portable 120ml Clothes Steamer, No Hurt Clothing Handheld Garment Steamer for Wrinkle Fabric, Multi-effect Travel/Home Mini Travel Steamer. Now.95 santa004 Please copy the code 63 Off ougar8 Adorable Snowman Refrigerator Handle Covers Set Cute Practical Fridge Door Covers Protective Kitchen Appliance Covers Perfect Christmas Decorations Idea (4-Cloak). Now.29 Q2QI96BQ Please copy the code 60 Off oplon 100cm Ultra Large Capacity 8 Layers Non-Woven Fabrics Steel Shoe Rack Gray. One great thing is that in case you have to return an item you bought using a promo code; you can still re-use the value of the promotional code as it will remain in your account. Camouflage Window Film, our Camowraps code promo davidson perforated window films are a perfect match to all our patterns! You can then finish paying for your purchase with a debit card, credit card or PayPal account. Tory Burch Social Media Links, tory Burch on Instagram : Following Tory Burch on Instagram helps you stay ahead of all the hottest trends. Now.99 29rpeazr Please copy the code 80 Off Ybenlow Women 2 Piece Push up Bandeau Bikini Swimsuit Set Bathing Suit Swimwear. Now.80 80blojnv Please copy the code 52 Off yisugar Womens Graphic Tees Wine Red Letter Print T-Shirts Cotton Short Sleeve Shirts. Rvbttydc, please copy the code 84 Off Jigging Hunter Superior Monofilament Nylon Fishing Line for Sea Fishing with Abrasion Resistant and Ultra Invisible Material.
You can look only at products from the newest collection or based on the look you want to achieve. Now.48 50wfxybd Please copy the code 70 Off Plunger Womens Winter Fashion Outdoor Warm Wool Coat Fur Trim Hooded Parka Jacket. Now.09 lvek8EZH Please copy the code 86 Off CLY 30W LED Motion Sensor Floodlight Outdoor Super Bright 2700 Lumens Security Flood Lights Waterproof IP66 Cool White 6000K Wall lighting With Sensitive Detector (Without Plug).


Exterior doors: fiberglass vs steel heartland home. Metal glass doors exterior front doors and entryways 236. Steel doors exterior doors steves doors. Exterior steel double doors peytonmeyernet. Quot;madridquot; stainless steel exterior door with sidelights. Entry doors hollow metal doors rice equipment co. Doors: extraordinary steel front doors steel front door.
Ive decided to pour my own concrete countertops. Beautiful lemon yellow and green color scheme for baby. Sofas: elegant living room sofas design by macys sectional. Outdoor curtains for screen porch. Large leather sectional sofas leather sectional sofas with. Doors windows. Aluminum extrusions fenestration systems, aluminum shop. 25 best ideas about painted decks on pinterest painted. Living room: comfortable ashley furniture sectionals for. Mars coffee leather build your own reclining sectional by. Slipcovers for sectional sofas home decor.
Bedroom white small desk small glass desk small executive. Home office desk furniture furniture home decor. Modern office desk inspirations for home workspace traba. 3d models: table mid century mini desk. Mid century mini desk oregano west elm. Mini pc float and slide desk rea and the blog. Ideas on dealing with the right small white desk for your.


text:
Overexposure of welders due to temporary loss of ytterbium-169 (Yb-169) source
Parent Category: Reports - Industrial
Category: Non-destructive testing
pdf Overexposure of welders due to temporary loss of ytterbium-169 (Yb-169) source (156 kB)
A metal fabrication company was undertaking gamma radiography in a radiography enclosure using an ytterbium-169 (Yb-169) source. The enclosure and radiography equipment was owned by the Company; however the radiography was undertaken by sub-contractors.
There were some specific features of the radiography work:
Very tight bends were needed in the source guide tube to expose the source in the correct position. Consequently, a special guide tube was fabricated in-house; however the extra force needed to drive the source along this tube was too high for the automatic exposure system. Instead, the radiographers exposed the source manually which negated many of the installed safety systems in the radiography enclosure.
The source capsule was attached to the source holder by a screw thread, which was glued together.
The gamma radiation energy and the gamma dose rates from Yb-169 are relatively low: the dose rate at the surface of the shielded (depleted uranium - DU) source container was the same whether or not the source was present. Also, to obtain high quality radiographs the end of guide tube was modified to allow the source capsule to protrude out of the end.
There was an installed gamma alarm in the radiography enclosure, but this had to be switched on manually and was not always used by the radiographers. In addition, the gamma alarm did not sound when the source was inside the component being examined.
On the day of the incident the glue securing the threaded joint failed allowing the source capsule to unscrew. When the source was driven around the tight bends in the guide tube, the rotational forces were sufficient to unscrew the source from its holder.
Following the last radiograph, the radiographer retracted the source holder, but the source capsule fell out of the open end of the guide tube into the component being examined. The radiographer measured the dose rate at the source container: he believed that the source was inside despite this being the normal reading for an empty DU container, and returned the container to the store. He noted that the safety indicator on the container had changed from red to green; however this is triggered by the source holder (not the capsule) returning to the source container. At no time did the radiographer use his dose rate monitor to check around the enclosure.
The component was then moved to the welding facility. At the end of the shift, the welders checked inside the component to check for any metal debris and noticed the source capsule (it looked like a small screw). The welders passed it amongst themselves trying to identify where it had come from (they were completely unaware that it was a radioactive source).
The radiographers returned later and, on entering the welding facility, some of their personal alarm dosemeters were activated; however the alarms were assumed to be faulty, and this was ignored. Some of the radiographers also handled the source in an attempt to identify it. Eventually a radiation monitor was used, which revealed that it was a radioactive source. At this point the room was cleared and the source recovered without further incident.
The incident was investigated by the national regulatory authorities. Initial estimates indicated hand doses of up to 16 Sv, and whole body doses of 5 mSv. No tissue reactions were subsequently observed, and the hand doses were later re-estimated as being up to 2 Sv.
The investigation concluded that the radiation doses could have been much higher. The welders were intending to take the source capsule out of the facility and show it to other workers to help identify it. If this had occurred, many more persons could have been exposed.
The welders were not radiation workers and were not trained in radiation protection; many were very worried about the incident.
Lessons to be learned
The Company was prosecuted for not having a suitable and sufficient radiation risk assessment for the radiography work. Such a risk assessment should have identified that:
The bends on the specially-made guide tube were outside the manufacturers' specification; the effects of having to manually force the source holder round these tight bends had not been considered.
Using a manual exposure system would defeat many of the installed safety systems.
The source becoming detached was reasonably foreseeable, and the use of open-ended guide tubes was not appropriate.
The gamma alarm system was not sufficient to detect a detached Yb-169 source, due to the shielding provided by the component being tested.
Monitoring the DU source container would not provide a positive indication that the source was present.
Another lesson can be learned from the fact that the radiographers did not immediately recognise the source capsule when it was presented to them, even though the Company did have a dummy source capsules for demonstration purposes. All gamma radiographers should know what the source capsule looks like, and consideration should also be given to sharing this information with other relevant workers such as welders.
The prosecution resulted in a very large fine - equivalent to almost 0.5 million euros (including legal costs).


-boys and girls clothes from 0-16 years!
-and, summer clothes on the way!
This week, we are featuring some of our boys 0-3 months items, with tonnes of variety available for mix and matching outfits! Best days to drop by are Mondays, from 10-12 during our drop-in group.
Got something you want to donate? Need a particular item?


Adonis vernalis, a relative to Phesant's-eye, has many pistils surrounded by a ring of stamens.
Photo: Börge Pettersson. Stamens and pistils are the male and female reproductive organs in flowering plants. They are necessary for the sexual reproduction. Linnaeus talked about them as men and women in their wedding night. The green calyx leaves he called the bride's bed, and the colourful petals the quilt.
The male organs, the stamens, are growing in a ring inside the petals. They occur in different numbers in different plants and are composed of a filament (the stalk) and an anther. The anther keeps the pollen grains and opens when they are ripe. The pollen grains can be transported from one flower to another by for example wind or with the help of an insect.
In the centre of the flower the female organ is found. It can consist of one or several pistils. On the top of the pistil the stigma is found, under it a thin stalk called the style, and at the base the ovary (with ovules inside) that will grow into the fruit with seeds inside. The pollen grains are deposited on the stigma and fertilises the ovules.
Linnaeus was careful to stress the importance of studying the sexual life of flowering plants. Today it has become a discipline of its own, reproduction biology.


text:
using ChainUtils.BouncyCastle.Asn1;
using ChainUtils.BouncyCastle.Asn1.X509;
using ChainUtils.BouncyCastle.Crypto.Generators;
using ChainUtils.BouncyCastle.Crypto.Parameters;
using ChainUtils.BouncyCastle.Crypto.Utilities;

namespace ChainUtils.BouncyCastle.Crypto.Agreement.Kdf
{
    /**
    * X9.63 based key derivation function for ECDH CMS.
    */
    public class ECDHKekGenerator
        : IDerivationFunction
    {
        private readonly IDerivationFunction kdf;

        private DerObjectIdentifier	algorithm;
        private int					keySize;
        private byte[]				z;

        public ECDHKekGenerator(IDigest digest)
        {
            kdf = new Kdf2BytesGenerator(digest);
        }

        public virtual void Init(IDerivationParameters param)
        {
            var parameters = (DHKdfParameters)param;

            algorithm = parameters.Algorithm;
            keySize = parameters.KeySize;
            z = parameters.GetZ(); // TODO Clone?
        }

        public virtual IDigest Digest
        {
            get { return kdf.Digest; }
        }

        public virtual int GenerateBytes(byte[]	outBytes, int outOff, int len)
        {
            // TODO Create an ASN.1 class for this (RFC3278)
            // ECC-CMS-SharedInfo
            var s = new DerSequence(
                new AlgorithmIdentifier(algorithm, DerNull.Instance),
                new DerTaggedObject(true, 2, new DerOctetString(Pack.UInt32_To_BE((uint)keySize))));

            kdf.Init(new KdfParameters(z, s.GetDerEncoded()));

            return kdf.GenerateBytes(outBytes, outOff, len);
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
The Practice of Testing
The basics of how automated tests should--and should not--be written, as promoted by the Testing Grouplet at Google
11 Sep 2012 - Barcelona, Brooklyn, Newport News, and Boston
Tags: Go, Google, Testing Grouplet, grouplets, programming, technical, websearch, whaling
This is the third of five1 posts in my "whaling" series about the high-level conceptual and cultural challenges the Testing Grouplet and its allies faced, and the knowledge and tools that eventually spread throughout Google development that removed the infamous "I don't have time to test" excuse. This post covers the basics of how automated tests should—and should not—be written.
The first post in this series focused on high-level cultural challenges to the adoption of automated developer testing that emerged as a result of day-to-day development reality. The second post in this series focused on the fundamental object-oriented programming issues which formed the core of most of Google's testability challenges—and solutions. The next post will describe the collection of processes employed by Google for ensuring software quality—including, but not limited to, automated testing. The final post will discuss the specific tools the the Testing Grouplet, Testing Tech, Build Tools and others developed to improve testing efficiency and effectiveness.
Bits of this post and the next two will incorporate comments I made on a Google+ post by Isaac Truett soliciting advice on improving code quality. Thanks to Isaac and Rob Konigsberg for engaging me in that conversation.
Fact-checks and embellishments from Googlers present and past welcome via email or Google+ comments, as always.
Code Quality
Concrete Examples
Testamonials
How Not to Write Tests
Think For Yourself
The concept of "quality" is core to Zen and the Art of Motorcycle Maintenance. Wrestling with this concept literally drives the protagonist insane. (Sorry for the spoiler for those intending to read it, but haven't as of yet.) "Quality" is the kind of, um, quality that people inherently value and strive to produce, yet struggle to definitively measure or reliably produce using a specific methodology.
With that qualification, here's my working definition of "code quality": The ability to easily read, understand, and modify code with speed, focus, and confidence. It has nothing to do with the quality of the application that the code represents; history is full of awesome apps built from codebases that are an ungodly horror to lay eyes upon, and I'm sure there are just as many beautifully-written failures. But a higher degree of code quality, over time, tends to precipitate higher-quality applications and services, especially as a code base, team, and/or company grows.
Automated testing is a practice that strongly correlates with code quality. Beyond a certain scale of team size and software complexity, automated testing becomes necessary to ensure a high-level of code quality in the long-term, though it is certainly not sufficient. At the lowest levels of software development, automated testing helps shake out silly bugs; at higher levels it helps us reason through and verify interfaces and contracts, encouraging high logical cohesion of related concepts (i.e. classes, subsystems, and services with clear, though limited responsibilities) and loose coupling between discrete software components (i.e. as few dependencies between classes, subsystems, and services as possible); and when a healthy battery of tests are in place with adequate tool support to produce and run them quickly and easily, it becomes infinitely easier to add, remove, and fix features with focus and confidence rather than abject terror.
Hence, the conviction of the Testing Grouplet—plus Testing Technology, Build Tools, Test Engineering, and Engineering Productivity—to add automated testing to every Google developer's toolbox, in addition to the already-established and invaluable practice of code reviews, and in addition to whatever (increasingly scarce) manual testing resources were available.
On top of designing for testability, discussed in the previous post, there's also the matter of designing one's tests. A lot of the same concepts apply, in terms of separating responsibilities into small, coherent components, to enhance readability and ease future maintenance and the development of new features. Automated tests are as diverse as the features they validate in terms of their requirements, dependencies, and structure, but again, there are a few general guidelines that tend to lead to better tests regardless of the type of code under test.
Those of us in the Testing Grouplet had to teach people how to write tests, in addition to teaching them how to make their code testable in the first place. The testing guide for the Google Web Server (GWS) team has lots of good advice; not surprising, since Bharat Mediratta, the Testing Grouplet founder, was-and-is GWS's tech lead. Several bits from that guide stuck out and guided a lot of my own test development, and are among the key testing guidelines listed below. Bear in mind that this is not an exhaustive set of guidelines, but certainly some of the most important.
Use abstract interfaces and dependency injection to replace heavyweight or uncontrollable production dependencies with lightweight and controllable fake/mock/stub/dummy implementations in tests: No surprises here, as I explained in the previous post. Smaller, more focused tests with fewer dependencies and faster execution times == Win! For a more precise differentiation between the terms "fake", "mock", "stub", and "dummy", see the Testing on the Toilet article on stubs. In my final "whaling" post, I'll talk more about tools and frameworks to make dependency injection easier to apply in both production code and in tests.
Write appropriately-sized tests: My earlier post on the Small/Medium/Large test size schema explains the different sizes of tests, i.e. the different scopes and functions of tests, and their proper application. The Small/Medium/Large model doesn't only help when thinking about what tests to write, but also helps thinking about the structure of the production code with regard to how the different levels of abstraction are built up and designed.
Use small, focused, clearly named test cases—avoid "and" cases/names: Good test functions will focus on a particular behavior or result based on a particular context, rather than running through several results or situations all at once. Often, though not always, if the name of a test function contains the word "and", either the test or the code under test is doing too much. For example, consider a test case named ParseDocumentAndWriteToBigtable. What can you infer from a test result that says "ParseDocumentAndWriteToBigtable: FAILED"? Did the parser fail for some reason? The write to the Bigtable? Both? And if only the parser failed, did the write to Bigtable still happen?
These questions may not be difficult to investigate and answer, but imagine having the following set of functions instead:
ParseDocument
ParseDocumentErrorBadEncoding
ParseDocumentErrorBadUrl
ParseDocumentErrorTitleMissing
WriteParsedDocumentToBigtable
DocumentWithParseErrorNotWrittenToBigtable
Now imagine ParseDocumentErrorBadUrl fails, and the rest pass. It's clear that the URL-parsing code is broken somehow, but the rest of the parsing and error detection works—and unsuccessfully-parsed documents are still not written to the Bigtable. So without even looking at any test code, you already know that what you just changed had an impact on URL parsing, and nothing more. For a little more typing up-front, that's tons of Time and Money and flow saved over the long run.
Use fixture and/or helper classes to provide common data and setup, with clearly-named helper functions: All modern testing frameworks allow you to define a test "fixture" class, which contains common initialization, setup, and utility behavior, and which is associated with a particular set of test functions/methods to make writing those test functions easier. A new test fixture is created for each test function, and is destroyed when the test function completes, ensuring proper setup for each test and that each test function is isolated from all others. Such classes can help make tests far more readable by reducing redundant details to just one or a very few lines of code, such as (in C++, assuming Google Test style):
// Note that this example would be physically smaller if I didn't
// add comments for the sake of clarity in the context of a blog.
class DocumentParserTest : public ::testing::Test {
// Data initialization required by the DocumentParser for every test
// function can be done here in the class constructor.
DocumentParserTest() {
// Sets the original document text and other data required for parsing
// which is common or not critical to the individual test cases, or
// varies little between cases.
void SetupDocument(const char* text) {
document_.set_raw_document_text(text);
document_.set_encoding(UTF8);
document_.set_title("my test document");
document_.set_url("http://www.example.com/index.html");
// This is the class under test.
DocumentParser parser_;
// ParsedDocument is a data structure containing the original document
// text as well as tokens and other data resulting from the parse.
ParsedDocument document_;
TEST_F(DocumentParserTest, ParseDocument) {
SetupDocument("Hello, World!");
EXPECT_TRUE(parser_.ParseDocument(&document_));
EXPECT_EQ(NO_ERROR, document_.error_reason());
EXPECT_EQ(20120816, document_.checksum());
EXPECT_EQ("http://www.example.com/index.html",
document.canonicalized_url());
// other assertions...
TEST_F(DocumentParserTest, ParseDocumentErrorBadEncoding) {
document_.set_encoding(-1);
EXPECT_FALSE(parser_.ParseDocument(&document_));
EXPECT_EQ(UNKNOWN_ENCODING, document_.error_reason());
EXPECT_EQ(0, document_.checksum());
Of course, there's nothing that requires that helper code exist only in the fixture class for a specific test. You're free to write a completely independent helper class, which can then be reused between separate, unrelated tests. For complex systems, these classes can be invaluable in helping to write readable, thorough tests with ease.
Tests should be totally isolated from one another and produce the same results regardless of the order in which they are executed: Tests that produce different results based on the order in which they are run imply a dependency between test cases, making the context of the test cases a bit ambiguous when the context needs to be perfectly clear to be useful. As mentioned above, modern automated testing frameworks use test fixture classes to ensure that each test case is set up the same way before execution, and to ensure that the results of one test case are not influencing another.
Repetition is OK: When writing production code, the Don't Repeate Yourself principle (DRY) dictates that there should always be exactly one place in a system where a particular piece of data or a logical concept is represented. However, when it comes to writing test code, a lot of carefully-crafted repetition can actually enhance readability. Test functions benefit from providing as much context as possible to understand what the test is doing from looking only at the code for the test function itself. If that means that almost every test has a call to SetupDocument() with the exact same document text, and has many of the same values for many of the same assertions, so be it. When the test breaks for somebody else, or for yourself six months in the future, your colleagues will thank you, or you'll thank yourself, for making the test a bit more self-contained so that understanding the failure and fixing the problem doesn't also involve grasping the full complexity of the test fixture as well, or double-checking to make sure there were no other side-effects.
There's no hard and fast rule as to what setup should be explicitly done in each test function, as opposed to implicitly handled by the constructor for the test fixture created for each test. But there's no hard and fast rule that says all setup should be done one way or the other, either. It's up to the author of the test to strike the right balance for the sake of readability, as well as easy comprehension and diagnosis of test failures.
As an example, imagine this test function (using the same DocumentParserTest fixture as above) fails three years after it was written:
TEST_F(DocumentParserTest, ParseDocumentBadUrl) {
document_.set_url("Ceci n'est pas une URL");
EXPECT_EQ(BAD_URL, document_.error_reason());
EXPECT_EQ("Ceci n'est pas une URL", document_.canonicalized_url());
The only assertion that fails is EXPECT_EQ("Ceci n'est pas une URL", document_.canonicalized_url()). It seems document_.canonicalized_url() is empty. Why? Ah, it's because someone from the team that maintains the URL canonicalization code made a change to leave the result variable empty on error, rather than copying the original URL value regardless of the outcome.2 You can now either choose to discuss the issue with the other developer—or development team as the case may be—or choose to accept their change and update the test accordingly. Either way, the necessary communication and/or decisions take place almost immediately. You don't have to waste time making sure you understood how the parse was setup and executed before diagnosing the problem, because the relevant setup and execution is completely contained in the test function itself. You don't have to waste time checking for other side-effects, because remaining assertions didn't fire after the code or the test was updated.3
Avoid data-driven tests: A controversial topic, this refers to tests that use a single test function to run through a table of data representing different test cases, as opposed to having a separate test function for each test case. Data-driven tests can be problematic in that if the format of the test data changes, all of the test data needs to be updated, not just the data relevant to an individual test case—making the test data structures difficult to understand and prone to compile failures, creating an excess maintenance burden. The expected results are no longer explicitly specified in each assertion, adding to the mental overhead of diagnosing failures—time and energy that could be spent on fixing the problem instead. Also, while each element of test data can include a description of the test case it exercises, testing frameworks are better suited to reporting failures in a standard format based on the name of each test function/test case.
My suspicion is that writing data-driven tests is motivated by a desire to adhere to the Don't Repeat Yourself principle, where otherwise identical (or nearly-identical) test code is condensed into a single function. As mentioned above, repetition can actually help comprehension of a test failure by providing sufficient context both from the name of the test and by the code in the test itself. Grasping the relevant context in a data-driven test is not as straightforward.
Imagine the tests above were written as:
TEST(DocumentParserTest, ParseDocument) {
struct TestData {
const char* test_case;
const char* raw_document_text;
Encoding encoding;
bool parse_result;
ParseError error_reason;
int checksum;
TestData data[] = {
{ "Success", "Hello, World!", UTF8,
true, NO_ERROR, 20120816 },
{ "Bad Encoding", "Hello, World!", -1,
false, UNKNOWN_ENCODING, 0 },
for (int i = 0; i != sizeof(data)/sizeof(data[0]); ++i) {
DocumentParser parser;
// Perform any DocumentParser setup...
ParsedDocument document;
document.set_raw_document_text(data[i].raw_document_text);
document.set_encoding(data[i].encoding);
document.set_title("my test document");
document.set_url("http://www.example.com/index.html");
EXPECT_EQ(data[i].parse_result, parser.ParseDocument(&document))
<< data[i].test_case;
EXPECT_EQ(data[i].error_result, document.error_reason())
EXPECT_EQ(data[i].checksum, document.checksum())
It may not look too bad now, and seems to take less code, which is considered a Good Thing—but imagine deciding later to make the title and URL part of the TestData structure, needed by tests exercising the relevant code. You would have to change every member of data[], even those that represent test cases that don't focus on the title and URL at all. In the earlier example, you just add the new setup values to SetupDocument() and override what you need after calling it in each test. The differences in setup between test cases are easier to see that way.
In this data-driven example, you have to remember what true and false really mean, in addition to 0 and -1, and what they mean for each member of data. The values used in each assertion are not made explicit in the assertions themselves, and the author must take care to provide data[i].test_case in the error output. Sure, the function name and expected values are reported in the output, but remembering them becomes cognitive overhead that the programmer diagnosing the failure must maintain, and every little bit of overhead adds just that much friction to thinking through the problem.4 In the earlier example, each of these expected result values appears in context, in the same assertion that exercises the relevant code or checks the relevant result. The test framework handles reporting the name of the test case that failed based on the name of the test function in a structured, standard fashion.
And above all, remember that this is a much-simplified example: There are a lot of aspects to document parsing, and a lot of failure modes, that are not contained in this example. How would the TestData structure look in that case? How would the data[] table look? How many EXPECT_EQ statements would be lumped together? How would easy would it be to diagnose a failure, or add a test for a new behavior?
Avoid golden file tests: As explained in the previous post, so-called "golden files" are logs of output from critical points in a program's logic that can be compared between test runs. They are usually noisy, brittle, and unisolated, and shouldn't be relied upon as a primary means of automated testing. That said, some teams may find value in maintaining one or two golden file tests, such as comparing large volumes of processed output in a large test, or using a catch-all example file to identify when individual features interfere with one another, prompting the creation of a more focused test to recreate the bug and act as a regression test.
Here are just a few small, personal examples of upholding and intentionally violating the above guidelines to which I can point handily; I don't actually include any examples of code using mock objects. I'm sure there are far superior examples out there, and I welcome any pointers to such.
Avoiding data-driven tests: When Tony Aiuto began using and contributing to Pyfakefs, he wrote some tests that exercised every fake system call and compared it to the real one. Each test function exercised one system call by running through a table of files that would be created by both the fake file system and the real file system. In other words, each test for each system call was data-driven.
In the code review, I challenged him to reverse the structure: Each test case should represent a type of file system object and directory structure, and there should be a function that runs all of the system calls and compares their results for a given file. The question is no longer "What kinds of files (input data) break a specific system call?", but "What system calls (behaviors) are broken for a specific type of file?" The test ended up being much more readable and useful, and you can see it here: fake_filesystem_vs_real_test.py Yes, the fixture implements some complex assertions, but the test cases themselves are straightforward to understand, and the errors reported by the assertions are lovely and very helpful.
Resorting to data-driven(-ish) tests: The Go FAQ section on testing suggests that "If the amount of extra code required to write good errors seems repetitive and overwhelming, the test might work better if table-driven, iterating over a list of inputs and outputs defined in a data structure." Despite my love for Go, this does make me shudder a little, as does the example cited in the same paragraph, fmt_test.go. However, I do see the point; if you have a pure function with a few well-defined inputs and outputs that are unlikely to ever change, it can seem like overkill to wrap each one in its own test function.
But, I propose as an alternative the style I adopted in my recent, modest string_test.go. The tests are somewhat data-driven, but rather than running an array of literals through a single function, I wrote a handful of helper functions (check*()) which document the intent of the individual test case in-place. Note that these helpers make use of my own FileAndLine() so that the exact line of a failure is reported—the exact same line where a piece of test data is defined. For slobs like me who like to scan for line numbers in the error output and jump there immediately to see the context of the failure, this is much more helpful than having to search through an array of test data for the offender.
Resorting to golden files: On my last team in websearch, we had a ton of small and medium tests that used Google Mock, but relied on a pair of golden file tests that ran over a large set of documents to detect changes in indexing signals made by teams we relied upon but did not coordinate with closely. The tests broke with some frequency, maybe every day or two, but they weren't flaky, and were fixed quickly after communicating with the other teams to decide on the impact the signal changes had on our system.
On a much smaller scale, see TestGoldenFile in my updaters_test.go. There's plenty of more focused tests in there, but having a single large example that can help guarantee that all the features together continue to work is a lot less annoying that writing a combinatorial number of smaller test cases. This test actually helped me find a bug in my update-post program, for which I wrote the much smaller Test FootnoteUpdater Extra Paragraphs In An Existing Footnote Are Preserved5 after the fact.
My old partner-in-crime David Plass and I had this exchange recently, regarding our small extracurricular projects. From David:
This past week I was on vacation and worked on some non-Google code (I have copyright ownership of it. Woo hoo!) It's a web app that [DOES STUFF THAT HAS BEEN REDACTED TO PROTECT THE INNOCENT AND THEIR VICTIMS]. It's Python/App Engine (flames to /dev/null).
I wrote it from the beginning with the logical separation of presentation from logic/storage in mind, and it worked out pretty well… but I still wasn't writing tests. Until I started having bugs. So I started writing tests of the "logic" layer - because after all, that's why I separated it in the first place! Now I'm addicted. I rarely make a change to the logic module without writing a test (not always first, but at least at the same time.) And I'm addicted to running the tests - even after I don't know if I made a change.
I've also instituted some (mental) rules:
run tests before commit (it's svn; flames to /dev/null)
write tests for new "logic" code
as time allows, every commit should include at least one new test, even if it's not related to the commit (cleanup)
The "logic" code also includes an authorization layer, and testing this by hand (i.e.., in browsers) is very tedious. Tests to the rescue!
And my reply:
See, that sounds very similar to my own process… That Go program I wrote, at first I was just running an entire test file through it, just like the Ruby version. Then I locked down specific features with tests.
Then I added a feature, and wrote the tests first 'cause I knew exactly how I wanted it.
Then I thought about the implementation a little, and ended up making a new change—refactoring—without any new tests.
Then I realized it had a bug, wrote a test to demonstrate it, and then got it to pass.
Then I started running the big golden test file through, and realized I had a pretty serious bug, and wrote a failing test reproducing it that I finally got to pass.
Then I rolled up my sleeves and put in the golden file test, for good measure.
So addictive.
Not earth-shattering, not rocket science, and neither of us are talking about Google code. But, given that David and I both personally did a lot to influence Google development culture towards widespread adoption of automated developer testing, I think it may be interesting to note that neither of us are particularly dogmatic in our approach, but we still find value in the practice in our personal lives. In fact, some may accuse us of being practical: Once we had a good lock on our core features and interfaces, then we used automated testing to ensure new stuff didn't break old stuff. At no point were we slowed down; in fact, applying automated testing at the right time accelerated our development once we knew what we wanted to do.
Thanks to Andrew Trenk and, as mentioned in my previous post, Dhanji Prasanna, I'm well-reminded to explain the flip side, or how not to write a test. Despite the best of intentions, it is possible to test not wisely but too well.
Watch out for warning signs: Andrew reminded me of the old Test Mercenaries' Code Reviewers' Guide, publicly available thanks to Miško Hevery. Miško and friends even had these printed and laminated to hand out to folks, to leave out on people's desks where they'd be handy and possibly prompt conversation. It's more about how not to write the production code itself, more so than how not to write tests, but it still falls under the "How Not To…" rubric. It gives good concrete advice based on the principles I outlined in Object-Oriented Programming Revisited. Good stuff there; check it out.
Don't overdesign for testability: Yes, it's possible to overcomplicate a design for the sake of testability, producing interfaces so narrow and implementations so tiny as to be absurd. This is usually the case with code that directly manipulates external resources (as opposed to pure algorithms or business logic); medium and large tests may be the ticket for exercising such code.
Pay attention to coverage, but don't artificially boost it: Don't worry about reaching a coverage goal for its own sake; use it as a signal for overall testing hygiene, but don't go through contortions that bump up coverage if it makes the code more difficult to reason about.
Think before testing: If you don't have the necessary background knowledge to think through a problem absent testing, testing won't necessarily help you write a correct piece of code. Tests are a tool to clarify and verify thinking, not replace it. That was the takeaway from the Norvig vs. Jeffries Sudoku showdown.
Don't overuse/abuse mock objects: This is related to all of the above. Andrew Trenk started a conversation with me thus:
One problem I'm still seeing at Google is that although people are writing tests, very often the tests are unreadable, unmaintainable, and don't test the right things. I think the biggest culprit is improper usage of mock objects, so I'm trying to write up a guide on how to use mock objects properly. Do you have any thoughts on this?
Such problems might have something to do with not having stable, coherent interfaces and contracts, and possibly even established programming idioms within particular domains—as opposed to, for example, websearch, where there are many well-known idioms for interacting with remote services and for event-driven processing. It may require prototyping and debating designs with teammates, thinking through the problem up-front, rather than slapping together a class and trying to test it first.
In my day, people weren't writing smaller classes and using dependency injection so much as now; it's possible some folks are taking it past the point of diminishing returns, separating details and responsibilities that really shouldn't be separated. I'm mildly surprised when I hear people say that they end up stuck maintaining a bunch of mocks along with the production code; I'm hard pressed to recall using a specific mock in more than one test. Fakes or lightweight implementations, yes, but not mocks created using a framework. My suspicion would be that the class being mocked should be used to compose just one other class—meaning only one test and one mock to maintain when the class changes—and that it's getting passed around directly to too many places. Or, maybe, the class shouldn't be mocked at all.
However, I'd like to see specific examples in context before I could make solid assertions out of these hypotheses. It's too easy to play armchair quarterback without concrete examples.
Yes, I think this is a big part of the problem. One pattern I see is that people use dependency injection as a way to mock out all of a class's dependencies. And by "mock" I don't just mean a reusable fake, I mean an object created by a mocking framework directly in the class. So you end up with a class that's not really testing anything useful since all it's dependencies are mocked out, and is hard to maintain since it's hardcoding implementation details in its mocks (so when you make a change to an implementation detail you have to go around to lots of test updating each mock). Then there's also the issue of tests being harder to understand due to all the extra logic you need to set up your mocks. And a lack of understanding between state testing and behavior testing makes things even worse!
Hand-rolled "mocks" like that aren't mocks, really. If an implementation detail change breaks a mock's behavior, it sounds like the right behaviors haven't been factored together—rather than factored out—behind a relatively stable interface that shields calling code from unnecessary detail. (See the Law of Demeter.) And it shouldn't take that much setup to set up a mock. That ought to be a sign that You're Doing It Wrong.
State vs. behavior testing—very nice way to put it! And very true. (And thanks to Andrew for pointing me to Martin Fowler's article, with which I was unfamiliar. I've never read that much of Fowler's stuff, though I'm sure he's influenced my thinking without my awareness anyway.)
I think part of the problem is that many people think of unit testing as testing only a single class at a time (I thought that too for a while), but I think what it really means is test the smallest interface possible. So if you have a class that talks to a database, you can't just mock out the database in the name of writing a small test, you either need to start up a local database, or have a tested fake to use in its place. If you have business logic in the same class that talks to a database, you would need to refactor the code to make the business logic independent of the database code, so you can then test the business logic without talking to the database.
Here Andrew describes the perfect case for medium tests: If you're testing the code that talks to the database, you're gonna need to run the database—or a well-maintained stand-in, like a "Mock" Bigtable or the Google-internal remote service mocker framework—to test that code. It's not turtles all the way down.
Again from Andrew Trenk:
I think that whole 70/20/10 thing was part of the problem, since it made it seem like a medium test was something you should only write occasionally, and only as sort of an integration test to make sure all the classes that you've tested with small tests are working together (I remember you didn't like the 70/20/10 idea, maybe this is why).
I did like 70/20/10, but I hated fighting about whether it was a strict rule or a guideline. I always asserted that people should think about what made sense as the right balance for their project, and 70/20/10 was a starting point based on intuition—a back-of-the-envelope figure reflecting the more-tests-for-lower-abstraction-levels, fewer-tests-for-higher-abstraction-levels idea we were promoting to get developers thinking of writing more smaller and fewer larger tests. I guess we didn't make it very clear, in part because some people fought hard for a literal interpretation of the figure.
That, and even Googlers are often susceptible to over-enthusiastic under-thinking when they finally become convinced of something. Oh, the peril of promoting a public policy: Such a danger that people will agree with you, and act on that agreement, without actually thinking about what you're suggesting, with all its qualifications, consequences, and shades of subtlety!6
Yes, of course you knew it would be five by now. ↩
URL canonicalization involves collapsing a web page's original URL into a "canonical" form to allow for consistency in indexing. For instance, you can use both https://google.com/ and https://www.google.com/ to reach the Google homepage, but searching for "google" produces a result containing https://www.google.com/. There are pros and cons to either clearing a result parameter on error or to leaving it alone; I can't remember what the actual Google canonicalization code does anymore. As an example for use in this discussion, though, the important part isn't what the URL canonicalization error contract should be, but that small, focused, easily-understood tests are in place to alert the relevant developers to a new mismatch in expectations, preventing bugs from remaining in the code for too long. ↩
A nice feature of Google Test is that EXPECT assertions do not cause the entire test function to stop right away, as opposed to ASSERT assertions, so one can gain more information from a single run of the test in case of an assertion failure. I'm not aware of other test frameworks in other languages that allow this—but I've been semi-retired for a bit, so perhaps there are by now. ↩
On a related note, please stop using bool values as function parameters. Seriously, please just stop, unless your language supports keyword-style parameter specification—in which case, please always use the keyword-style for boolean parameters. Bogdan Stanescu and I had a minor debate once about boolean function parameters, in which he argued that it's easy to look up what true and false refers to in the file where the function is defined. I have nothing but the utmost respect for Bogdan, but I heartily disagree with him on this subject. Though it takes a little extra typing to define in C++, an enum value with a meaningful name vastly improves clarity, readability, and maintainability with zero performance impact. As someone who comes along to understand a piece of code I didn't write, or a piece of code I wrote months or years ago, I'd much rather deal with code containing a function call that looks something like:
ParseDocument(&document, kNewChecksumParser,
kIgnoreEmbeddedContent,
kLogErrorsToStdout);
than to see:
ParseDocument(&document, true, false, false);
have to dive into other files to figure out what true and false mean in one position vs. another, and then keep that in my head as I try to understand the larger context of what the code's doing. Plus, as a bonus, a single enum can represent more options than just true or false, if you need that kind of flexibility. ↩
The actual name in the code has no spaces, but it looked ridiculous in this post given the formatting. ↩
At the end of the TAP Fixit, there was an developer in Krakow giving the TAP Fixit volunteer (and Statistician) there, Michał Kaczmarek, grief because his project's build had fundamental incompatibilities with TAP, and was now screwed because he got rid of his Chris/Jay continuous build system because the TAP team gave him and everybody else "really bad advice". Michał tried to appease this guy, but bubbled up to me at some point, and I pointed out in no uncertain terms, though in a clear tone, that the TAP Fixit folks had bent over backward to saturate the environment for months regarding TAP's capabilities and what warranted holding onto a C/J for now. Plus, he always could've asked Michał or someone else on the tap-fixit mailing list. That seemed to shut him up. ↩